--- a/adm/index.php
+++ b/adm/index.php
@@ -41,6 +41,7 @@ if (!isset($user->data['session_admin']) || !$user->data['session_admin'])
 // check specific permissions but this is a catchall
 if (!$auth->acl_get('a_'))
 {
+	send_status_line(403, 'Forbidden');
 	trigger_error('NO_ADMIN');
 }
 
@@ -50,8 +51,8 @@ define('IN_ADMIN', true);
 // Some oft used variables
 $safe_mode		= (@ini_get('safe_mode') == '1' || strtolower(@ini_get('safe_mode')) === 'on') ? true : false;
 $file_uploads	= (@ini_get('file_uploads') == '1' || strtolower(@ini_get('file_uploads')) === 'on') ? true : false;
-$module_id		= request_var('i', '');
-$mode			= request_var('mode', '');
+$module_id		= $request->variable('i', '');
+$mode			= $request->variable('mode', '');
 
 // Set custom style for admin area
 $template->set_custom_style(array(
--- a/adm/style/acp_ext_details.html
+++ b/adm/style/acp_ext_details.html
@@ -7,19 +7,17 @@
 	<h1>{L_EXTENSIONS_ADMIN}</h1>
 
 	<!-- IF S_VERSIONCHECK -->
-	<div class="<!-- IF S_UP_TO_DATE -->successbox<!-- ELSE -->errorbox<!-- ENDIF -->">
-		<p>{UP_TO_DATE_MSG} - <a href="{U_VERSIONCHECK_FORCE}">{L_VERSIONCHECK_FORCE_UPDATE}</a></p>
-	</div>
-	<!-- ELSE IF S_VERSIONCHECK_STATUS == 0 -->
-	<div class="errorbox notice">
-		<p>{L_VERSIONCHECK_FAIL}</p>
-		<p>{VERSIONCHECK_FAIL_REASON}</p>
-		<p><a href="{U_VERSIONCHECK_FORCE}">{L_VERSIONCHECK_FORCE_UPDATE}</a></p>
-	</div>
-	<!-- ELSE IF S_VERSIONCHECK_STATUS == 1 -->
-	<div class="errorbox notice">
-		<p>{VERSIONCHECK_FAIL_REASON}</p>
-	</div>
+		<!-- IF S_VERSIONCHECK_FAIL -->
+		<div class="errorbox notice">
+			<p>{L_VERSIONCHECK_FAIL}</p>
+			<p>{VERSIONCHECK_FAIL_REASON}</p>
+			<p><a href="{U_VERSIONCHECK_FORCE}">{L_VERSIONCHECK_FORCE_UPDATE}</a></p>
+		</div>
+		<!-- ELSE -->
+		<div class="<!-- IF S_UP_TO_DATE -->successbox<!-- ELSE -->errorbox<!-- ENDIF -->">
+			<p>{UP_TO_DATE_MSG} - <a href="{U_VERSIONCHECK_FORCE}">{L_VERSIONCHECK_FORCE_UPDATE}</a></p>
+		</div>
+		<!-- ENDIF -->
 	<!-- ENDIF -->
 
 	<fieldset>
@@ -136,4 +134,5 @@
 		<!-- END meta_authors -->
 	</fieldset>
 
+	<!-- EVENT acp_ext_details_end -->
 <!-- INCLUDE overall_footer.html -->
--- a/adm/style/acp_ext_list.html
+++ b/adm/style/acp_ext_list.html
@@ -44,7 +44,7 @@
 	<tbody>
 		<!-- IF .enabled -->
 		<tr>
-			<td class="row3" colspan="4"><strong>{L_EXTENSIONS_ENABLED}</strong></td>
+			<td class="row3" colspan="4"><strong>{L_EXTENSIONS_ENABLED}</strong><!-- EVENT acp_ext_list_enabled_title_after --></td>
 		</tr>
 		<!-- BEGIN enabled -->
 		<tr class="ext_enabled row-highlight">
@@ -69,7 +69,7 @@
 
 		<!-- IF .disabled -->
 		<tr>
-			<td class="row3" colspan="4"><strong>{L_EXTENSIONS_DISABLED}</strong></td>
+			<td class="row3" colspan="4"><strong>{L_EXTENSIONS_DISABLED}</strong><!-- EVENT acp_ext_list_disabled_title_after --></td>
 		</tr>
 		<!-- BEGIN disabled -->
 		<tr class="ext_disabled row-highlight">
--- a/adm/style/acp_groups.html
+++ b/adm/style/acp_groups.html
@@ -267,11 +267,12 @@
 
 	<!-- EVENT acp_groups_manage_before -->
 	<table class="table1">
-		<col class="col1" /><col class="col1" /><col class="col2" /><col class="col2" /><col class="col2" />
+		<col class="col1" /><col class="col1" /><col class="col1" /><col class="col2" /><col class="col2" /><col class="col2" />
 	<thead>
 	<tr>
 		<th style="width: 50%">{L_GROUP}</th>
 		<th>{L_TOTAL_MEMBERS}</th>
+		<th>{L_PENDING_MEMBERS}</th>
 		<th colspan="2">{L_OPTIONS}</th>
 		<th>{L_ACTION}</th>
 	</tr>
@@ -281,7 +282,7 @@
 		<!-- IF groups.S_SPECIAL -->
 		<!-- IF groups.S_FIRST_ROW -->
 			<tr>
-				<td colspan="5" class="row3">{L_NO_GROUPS_CREATED}</td>
+				<td colspan="6" class="row3">{L_NO_GROUPS_CREATED}</td>
 			</tr>
 		<!-- ENDIF -->
 	</tbody>
@@ -302,11 +303,12 @@
 	<p>{L_SPECIAL_GROUPS_EXPLAIN}</p>
 
 	<table class="table1">
-		<col class="col1" /><col class="col1" /><col class="col2" /><col class="col2" /><col class="col2" />
+		<col class="col1" /><col class="col1" /><col class="col1" /><col class="col2" /><col class="col2" />
 	<thead>
 	<tr>
 		<th style="width: 50%">{L_GROUP}</th>
 		<th>{L_TOTAL_MEMBERS}</th>
+		<th>{L_PENDING_MEMBERS}</th>
 		<th colspan="2">{L_OPTIONS}</th>
 		<th>{L_ACTION}</th>
 	</tr>
@@ -316,6 +318,7 @@
 		<tr>
 			<td><strong>{groups.GROUP_NAME}</strong></td>
 			<td style="text-align: center;">{groups.TOTAL_MEMBERS}</td>
+			<td style="text-align: center;">{groups.PENDING_MEMBERS}</td>
 			<td style="text-align: center;"><a href="{groups.U_EDIT}">{L_SETTINGS}</a></td>
 			<td style="text-align: center;"><a href="{groups.U_LIST}">{L_MEMBERS}</a></td>
 			<td style="text-align: center;"><!-- IF not groups.S_GROUP_SPECIAL and groups.U_DELETE --><a href="{groups.U_DELETE}" data-ajax="row_delete">{L_DELETE}</a><!-- ELSE -->{L_DELETE}<!-- ENDIF --></td>
--- /dev/null
+++ b/adm/style/acp_help_phpbb.html
@@ -0,0 +1,61 @@
+<!-- INCLUDE overall_header.html -->
+
+<a id="maincontent"></a>
+
+<h1>{L_ACP_HELP_PHPBB}</h1>
+
+<form id="acp_help_phpbb" method="post" action="{U_ACTION}" data-ajax-action="{U_COLLECT_STATS}">
+<div class="send-stats-row">
+	<!-- EVENT acp_help_phpbb_stats_before -->
+	<div class="send-stats-tile">
+		<h2><i class="icon fa-bar-chart"></i>{L_SEND_STATISTICS}</h2>
+		<p>{L_EXPLAIN_SEND_STATISTICS}</p>
+		<div class="send-stats-row">
+			<div class="send-stats-data-row send-stats-data-only-row">
+				<a id="trigger-configlist" data-ajax="toggle_link" data-overlay="false" data-toggle-text="{L_HIDE_STATISTICS}"><span>{L_SHOW_STATISTICS}</span><i class="icon fa-angle-down"></i></a>
+			</div>
+			<div class="send-stats-data-row">
+				<div class="configlist" id="configlist">
+					<!-- BEGIN providers -->
+					<fieldset>
+						<legend>{providers.NAME}</legend>
+						<!-- BEGIN values -->
+						<dl>
+							<dt>{providers.values.KEY}</dt>
+							<dd>{providers.values.VALUE}</dd>
+						</dl>
+						<!-- END values -->
+					</fieldset>
+					<!-- END providers -->
+				</div>
+			</div>
+		</div>
+		<dl class="send-stats-settings">
+			<dt>
+				<input name="help_send_statistics" id="help_send_statistics" type="checkbox"<!-- IF S_COLLECT_STATS --> checked="checked"<!-- ENDIF --> />
+				<label for="help_send_statistics"></label>
+			</dt>
+			<dd>{L_SEND_STATISTICS_LONG}</dd>
+		</dl>
+	</div>
+	<!-- EVENT acp_help_phpbb_stats_after -->
+	<fieldset>
+		<p class="submit-buttons">
+			<input type="hidden" name="systemdata" value="{RAW_DATA}" />
+			<input type="hidden" name="help_send_statistics_time" value="{COLLECT_STATS_TIME}" />
+			<input class="button1" type="submit" id="submit" name="submit" value="{L_SUBMIT}" />
+		</p>
+		{S_FORM_TOKEN}
+	</fieldset>
+</div>
+</form>
+<form action="{U_COLLECT_STATS}" method="post" target="questionaire_result" id="questionnaire-form">
+	<fieldset>
+		<p class="submit-buttons">
+			<input type="hidden" name="systemdata" value="{RAW_DATA}" />
+			<input class="button1" type="submit" id="submit_stats" name="submit" value="{L_SEND_STATISTICS}" />
+		</p>
+	</fieldset>
+</form>
+
+<!-- INCLUDE overall_footer.html -->
--- a/adm/style/acp_icons.html
+++ b/adm/style/acp_icons.html
@@ -89,6 +89,9 @@
 	<!-- ENDIF -->
 		<td>{L_WIDTH}</td>
 		<td>{L_HEIGHT}</td>
+	<!-- IF not S_SMILIES -->
+		<td>{L_ALT_TEXT}</td>
+	<!-- ENDIF -->
 		<td>{L_DISPLAY_ON_POSTING}</td>
 	<!-- IF ID or S_ADD -->
 		<td>{L_ORDER}</td>
@@ -102,7 +105,7 @@
 	<!-- BEGIN items -->
 		<tr>
 
-		<td style="text-align: center;"><img src="{items.IMG_SRC}" alt="" title="" /><input type="hidden" name="image[{items.IMG}]" value="1" /></td>
+		<td style="text-align: center;"><img src="{items.IMG_SRC}" alt="{items.TEXT_ALT}" title="{items.TEXT_ALT}" /><input type="hidden" name="image[{items.IMG}]" value="1" /></td>
 		<td style="vertical-align: top;">[{items.IMG}]</td>
 		<!-- IF S_SMILIES -->
 			<td><input class="text post" type="text" name="code[{items.IMG}]" value="{items.CODE}" size="10" maxlength="50" /></td>
@@ -110,6 +113,9 @@
 		<!-- ENDIF -->
 		<td><input class="text post" type="number" min="0" max="999" name="width[{items.IMG}]" value="{items.WIDTH}" /></td>
 		<td><input class="text post" type="number" min="0" max="999" name="height[{items.IMG}]" value="{items.HEIGHT}" /></td>
+		<!-- IF not S_SMILIES -->
+			<td><input class="text post" type="text" name="alt[{items.IMG}]" value="{items.ALT}" size="10" maxlength="50" /></td>
+		<!-- ENDIF -->
 		<td>
 			<input type="checkbox" class="radio" name="display_on_posting[{items.IMG}]"{items.POSTING_CHECKED} onclick="toggle_select('{items.A_IMG}', this.checked, '{items.S_ROW_COUNT}');"/>
 			<!-- IF items.S_ID -->
--- a/adm/style/acp_permissions.html
+++ b/adm/style/acp_permissions.html
@@ -329,14 +329,9 @@
 	<br class="responsive-hide" /><br class="responsive-hide" />
 
 	<!-- include tooltip file -->
-	<script type="text/javascript" src="style/tooltip.js"></script>
-	<script type="text/javascript">
-	// <![CDATA[
-		window.onload = function(){enable_tooltips_select('set-permissions', '{LA_ROLE_DESCRIPTION}', 'role')};
-	// ]]>
-	</script>
-
-	<form id="set-permissions" method="post" action="{U_ACTION}">
+	<!-- INCLUDEJS tooltip.js -->
+
+	<form id="set-permissions" method="post" action="{U_ACTION}" data-role-description="{L_ROLE_DESCRIPTION}">
 
 	{S_HIDDEN_FIELDS}
 
--- a/adm/style/acp_profile.html
+++ b/adm/style/acp_profile.html
@@ -127,6 +127,7 @@
 			<!-- ENDIF -->
 			</dl>
 		<!-- ENDIF -->
+		<!-- EVENT acp_profile_step_one_lang_after -->
 		</fieldset>
 
 		<fieldset class="quick">
--- a/adm/style/admin.css
+++ b/adm/style/admin.css
@@ -1782,7 +1782,7 @@ li.pagination ul {
 
 /* Action Highlighting
 ---------------------------------------- */
-.successbox, .errorbox {
+.successbox, .errorbox, .warningbox {
 	padding: 8px;
 	margin: 10px 0;
 	color: #FFFFFF;
@@ -1806,6 +1806,10 @@ li.pagination ul {
 	background-color: #BC2A4D;
 }
 
+.warningbox {
+	background-color: #fca600;
+}
+
 .successbox h3, .errorbox h3 {
 	color: #FFFFFF;
 	margin: 0 0 0.5em;
@@ -1832,10 +1836,33 @@ li.pagination ul {
 	font-weight: bold;
 }
 
+#log-container {
+	display: none;
+	max-height: 300px;
+	padding: 8px;
+	margin: 10px 0;
+	clear: both;
+	overflow-y: auto;
+	background-color: #FFFFFF;
+}
+
+#log-container.show_log_container {
+	display: block;
+	border: 1px solid #DBD7D1;
+}
+
+.log {
+	font-size: 0.8em;
+}
+
 .notice {
 	background-color: #62A5CC;
 }
 
+.download-box {
+	margin: 10px 0 10px 0;
+}
+
 /* Special cases for the error page */
 #errorpage #page-header a {
 	font-weight: bold;
@@ -1864,6 +1891,7 @@ li.pagination ul {
 	color: #000;
 	text-align: center;
 	border: 1px solid #AAA;
+	opacity: .95;
 }
 
 .tooltip span.top {
@@ -2441,6 +2469,39 @@ fieldset.permissions .padding {
 	display: none !important;
 }
 
+.roles-options > .dropdown {
+	left: auto;
+	top: 3.2em;
+	width: 250px;
+}
+
+.roles-options {
+	-webkit-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	-o-user-select: none;
+	user-select: none;
+	width: 250px;
+}
+
+.roles-options > span {
+	border: 1px solid #DEDEDE;
+	border-radius: 3px;
+	padding: 4px;
+	width: 250px;
+	display: none;
+	background: url('../images/arrow_down.gif') no-repeat 245px .7em;
+}
+
+.roles-options li {
+	list-style: none;
+}
+
+.roles-highlight {
+	background-color: #1e90ff;
+	color: #fff;
+}
+
 
 /* Classes for additional tasks
 ---------------------------------------- */
@@ -2489,3 +2550,144 @@ fieldset.permissions .padding {
 	clear: both;
 	display: block;
 }
+
+#progress-bar {
+	position: relative;
+	width: 90%;
+	text-align: center;
+	height: 25px;
+	margin: 20px auto;
+	border: 1px solid #cecece;
+}
+
+#progress-bar #progress-bar-text {
+	position: absolute;
+	top: 0;
+	width: 100%;
+	color: #000;
+}
+
+#progress-bar #progress-bar-filler {
+	display: block;
+	position: relative;
+	top: 0;
+	left: 0;
+	background-color: #3c84ad;
+	width: 0;
+	height: 25px;
+	overflow: hidden;
+	color: #fff;
+}
+
+#progress-bar p {
+	line-height: 25px;
+	font-weight: bold;
+}
+
+.send-stats-row {
+	margin: 15px 0;
+}
+
+.send-stats-row:before {
+	display: table;
+	content: " ";
+}
+
+.send-stats-tile {
+	position: relative;
+	padding: 14px;
+	margin-bottom: 20px;
+	background-color: #eff0f2;
+	border-radius: 6px;
+	box-shadow: rgba(0,0,0,0.3) 1px 1px 5px;
+}
+
+.send-stats-tile h2 {
+	margin-top: 0;
+	text-align: center;
+    padding-bottom: 1em;
+}
+
+.send-stats-tile i {
+	padding-right: 0.3em;
+}
+
+.icon {
+	font-family: FontAwesome;
+	font-style: normal;
+}
+
+.send-stats-data-row {
+	background: #f9f9f9;
+	border-radius: 6px;
+	border: #DEDEDE 1px solid;
+	padding: 10px;
+	border-top-width: 0;
+	border-top-right-radius: 0;
+	border-top-left-radius: 0;
+}
+
+.send-stats-data-hidden .configlist {
+	display: none;
+}
+
+.send-stats-data-only-row {
+	border-radius: 6px !important;
+	border-bottom-width: 1px !important;
+}
+
+.send-stats-data-hidden {
+	padding: 0;
+	border: none;
+}
+
+.send-stats-row > .send-stats-data-row:first-child {
+	background-color: #d9edf7;
+	border-bottom-width: 0;
+	border-top-right-radius: 6px;
+	border-top-left-radius: 6px;
+	border-top-width: 1px;
+	border-bottom-left-radius: 0;
+	border-bottom-right-radius: 0;
+}
+
+.send-stats-settings dt, .send-stats-settings dd {
+	min-width: 25px;
+}
+
+.send-stats-settings dd {
+	line-height: 1.5em;
+}
+
+.send-stats-settings input {
+	display: none;
+}
+
+.send-stats-settings input[type=checkbox] + label:before {
+	content: "\f096";
+	font-family: FontAwesome;
+	font-size: 1.5em;
+}
+
+.send-stats-settings input[type=checkbox]:checked + label:before {
+	content: "\f14a";
+	color: #3c763d;
+}
+
+.send-stats-data-row a:hover span {
+	text-decoration: underline;
+}
+
+.send-stats-data-row a {
+	text-decoration: none;
+	cursor: default;
+}
+
+.send-stats-data-row i {
+	padding-left: 6px;
+}
+
+.configlist {
+	word-wrap: break-word;
+	word-break: break-all;
+}
--- a/adm/style/admin.js
+++ b/adm/style/admin.js
@@ -243,8 +243,16 @@ function parse_document(container)
 
 		parse_document($('body'));
 
-		// Hide configlist and success message in send statistics page
-		phpbb.toggleDisplay('configlist', -1);
-		phpbb.toggleDisplay('questionnaire-thanks', -1);
+		$('#questionnaire-form').css('display', 'none');
+		var $triggerConfiglist = $('#trigger-configlist');
+
+		$triggerConfiglist.on('click', function () {
+			var $configlist = $('#configlist');
+			$configlist.closest('.send-stats-data-row').toggleClass('send-stats-data-hidden');
+			$configlist.closest('.send-stats-row').find('.send-stats-data-row:first-child').toggleClass('send-stats-data-only-row');
+			$(this).find('i').toggleClass('fa-angle-down fa-angle-up');
+		});
+
+		$('#configlist').closest('.send-stats-data-row').addClass('send-stats-data-hidden');
 	});
 })(jQuery);
--- a/adm/style/ajax.js
+++ b/adm/style/ajax.js
@@ -4,6 +4,101 @@
 
 'use strict';
 
+
+phpbb.prepareSendStats = function () {
+	var $form = $('#acp_help_phpbb');
+	var $dark = $('#darkenwrapper');
+	var $loadingIndicator;
+
+	$form.on('submit', function (event) {
+		var $this = $(this),
+			currentTime = Math.floor(new Date().getTime() / 1000),
+			statsTime = parseInt($this.find('input[name=help_send_statistics_time]').val(), 10);
+
+		event.preventDefault();
+		$this.unbind('submit');
+
+		// Skip ajax request if form is submitted too early or send stats
+		// checkbox is not checked
+		if (!$this.find('input[name=help_send_statistics]').is(':checked') ||
+			statsTime > currentTime) {
+			$form.find('input[type=submit]').click();
+			setTimeout(function () {
+				$form.find('input[type=submit]').click();
+			}, 300);
+			return;
+		}
+
+		/**
+		 * Handler for AJAX errors
+		 */
+		function errorHandler(jqXHR, textStatus, errorThrown) {
+			if (typeof console !== 'undefined' && console.log) {
+				console.log('AJAX error. status: ' + textStatus + ', message: ' + errorThrown);
+			}
+			phpbb.clearLoadingTimeout();
+			var errorText = '';
+
+			if (typeof errorThrown === 'string' && errorThrown.length > 0) {
+				errorText = errorThrown;
+			} else {
+				errorText = $dark.attr('data-ajax-error-text-' + textStatus);
+				if (typeof errorText !== 'string' || !errorText.length) {
+					errorText = $dark.attr('data-ajax-error-text');
+				}
+			}
+			phpbb.alert($dark.attr('data-ajax-error-title'), errorText);
+		}
+
+		/**
+		 * This is a private function used to handle the callbacks, refreshes
+		 * and alert. It calls the callback, refreshes the page if necessary, and
+		 * displays an alert to the user and removes it after an amount of time.
+		 *
+		 * It cannot be called from outside this function, and is purely here to
+		 * avoid repetition of code.
+		 *
+		 * @param {object} res The object sent back by the server.
+		 */
+		function returnHandler(res) {
+			phpbb.clearLoadingTimeout();
+
+			// If a confirmation is not required, display an alert and call the
+			// callbacks.
+			$dark.fadeOut(phpbb.alertTime);
+
+			if ($loadingIndicator) {
+				$loadingIndicator.fadeOut(phpbb.alertTime);
+			}
+
+			var $sendStatisticsSuccess = $('<input />', {
+				type: 'hidden',
+				name: 'send_statistics_response',
+				value: res
+			});
+			$sendStatisticsSuccess.appendTo('p.submit-buttons');
+
+			// Finish actual form submission
+			$form.find('input[type=submit]').click();
+		}
+
+		$loadingIndicator = phpbb.loadingIndicator();
+
+		$.ajax({
+			url: $this.attr('data-ajax-action').replace('&amp;', '&'),
+			type: 'POST',
+			data: 'systemdata=' + encodeURIComponent($this.find('input[name=systemdata]').val()),
+			success: returnHandler,
+			error: errorHandler,
+			cache: false
+		}).always(function() {
+			if ($loadingIndicator && $loadingIndicator.is(':visible')) {
+				$loadingIndicator.fadeOut(phpbb.alertTime);
+			}
+		});
+	});
+};
+
 /**
  * The following callbacks are for reording items. row_down
  * is triggered when an item is moved down, and row_up is triggered when
@@ -62,7 +157,138 @@ phpbb.addAjaxCallback('row_delete', function(res) {
 	}
 });
 
+/**
+ * Handler for submitting permissions form in chunks
+ * This call will submit permissions forms in chunks of 5 fieldsets.
+ */
+function submitPermissions() {
+	var $form = $('form#set-permissions'),
+		fieldsetList = $form.find('fieldset[id^=perm]'),
+		formDataSets = [],
+		dataSetIndex = 0,
+		$submitAllButton = $form.find('input[type=submit][name^=action]')[0],
+		$submitButton = $form.find('input[type=submit][data-clicked=true]')[0];
+
+	// Set proper start values for handling refresh of page
+	var permissionSubmitSize = 0,
+		permissionRequestCount = 0,
+		forumIds = [],
+		permissionSubmitFailed = false;
+
+	if ($submitAllButton !== $submitButton) {
+		fieldsetList = $form.find('fieldset#' + $submitButton.closest('fieldset.permissions').id);
+	}
+
+	$.each(fieldsetList, function (key, value) {
+		dataSetIndex = Math.floor(key / 5);
+		var $fieldset = $('fieldset#' + value.id);
+		if (key % 5 === 0) {
+			formDataSets[dataSetIndex] = $fieldset.find('select:visible, input:not([data-name])').serialize();
+		} else {
+			formDataSets[dataSetIndex] += '&' + $fieldset.find('select:visible, input:not([data-name])').serialize();
+		}
+
+		// Find proper role value
+		var roleInput = $fieldset.find('input[name^=role][data-name]');
+		if (roleInput.val()) {
+			formDataSets[dataSetIndex] += '&' + roleInput.attr('name') + '=' + roleInput.val();
+		} else {
+			formDataSets[dataSetIndex] += '&' + roleInput.attr('name') + '=' +
+				$fieldset.find('select[name="' + roleInput.attr('name') + '"]').val();
+		}
+	});
+
+	permissionSubmitSize = formDataSets.length;
+
+	// Add each forum ID to forum ID list to preserve selected forums
+	$.each($form.find('input[type=hidden][name^=forum_id]'), function (key, value) {
+		if (value.name.match(/^forum_id\[([0-9]+)\]$/)) {
+			forumIds.push(value.value);
+		}
+	});
+
+	/**
+	 * Handler for submitted permissions form chunk
+	 *
+	 * @param {object} res Object returned by AJAX call
+	 */
+	function handlePermissionReturn(res) {
+		permissionRequestCount++;
+		var $dark = $('#darkenwrapper');
+
+		if (res.S_USER_WARNING) {
+			phpbb.alert(res.MESSAGE_TITLE, res.MESSAGE_TEXT);
+			permissionSubmitFailed = true;
+		} else if (!permissionSubmitFailed && res.S_USER_NOTICE) {
+			// Display success message at the end of submitting the form
+			if (permissionRequestCount >= permissionSubmitSize) {
+				var $alert = phpbb.alert(res.MESSAGE_TITLE, res.MESSAGE_TEXT);
+				var $alertBoxLink = $alert.find('p.alert_text > a');
+
+				// Create form to submit instead of normal "Back to previous page" link
+				if ($alertBoxLink) {
+					// Remove forum_id[] from URL
+					$alertBoxLink.attr('href', $alertBoxLink.attr('href').replace(/(&forum_id\[\]=[0-9]+)/g, ''));
+					var previousPageForm = '<form action="' + $alertBoxLink.attr('href') + '" method="post">';
+					$.each(forumIds, function (key, value) {
+						previousPageForm += '<input type="text" name="forum_id[]" value="' + value + '" />';
+					});
+					previousPageForm += '</form>';
+
+					$alertBoxLink.on('click', function (e) {
+						var $previousPageForm = $(previousPageForm);
+						$('body').append($previousPageForm);
+						e.preventDefault();
+						$previousPageForm.submit();
+					});
+				}
+
+				// Do not allow closing alert
+				$dark.off('click');
+				$alert.find('.alert_close').hide();
+
+				if (typeof res.REFRESH_DATA !== 'undefined') {
+					setTimeout(function () {
+						// Create forum to submit using POST. This will prevent
+						// exceeding the maximum length of URLs
+						var form = '<form action="' + res.REFRESH_DATA.url.replace(/(&forum_id\[\]=[0-9]+)/g, '') + '" method="post">';
+						$.each(forumIds, function (key, value) {
+							form += '<input type="text" name="forum_id[]" value="' + value + '" />';
+						});
+						form += '</form>';
+						$form = $(form);
+						$('body').append($form);
 
+						// Hide the alert even if we refresh the page, in case the user
+						// presses the back button.
+						$dark.fadeOut(phpbb.alertTime, function () {
+							if (typeof $alert !== 'undefined') {
+								$alert.hide();
+							}
+						});
+
+						// Submit form
+						$form.submit();
+					}, res.REFRESH_DATA.time * 1000); // Server specifies time in seconds
+				}
+			}
+		}
+	}
+
+	// Create AJAX request for each form data set
+	$.each(formDataSets, function (key, formData) {
+		$.ajax({
+			url: $form.action,
+			type: 'POST',
+			data: formData + '&' + $submitAllButton.name + '=' + encodeURIComponent($submitAllButton.value) +
+				'&creation_time=' + $form.find('input[type=hidden][name=creation_time]')[0].value +
+				'&form_token=' + $form.find('input[type=hidden][name=form_token]')[0].value +
+				'&' + $form.children('input[type=hidden]').serialize(),
+			success: handlePermissionReturn,
+			error: handlePermissionReturn
+		});
+	});
+}
 
 $('[data-ajax]').each(function() {
 	var $this = $(this),
@@ -83,6 +309,22 @@ $('[data-ajax]').each(function() {
 */
 $(function() {
 	phpbb.resizeTextArea($('textarea:not(.no-auto-resize)'), {minHeight: 75});
+
+	var $setPermissionsForm = $('form#set-permissions');
+	if ($setPermissionsForm.length) {
+		$setPermissionsForm.on('submit', function (e) {
+			submitPermissions();
+			e.preventDefault();
+		});
+		$setPermissionsForm.find('input[type=submit]').click(function() {
+			$('input[type=submit]', $(this).parents($('form#set-permissions'))).removeAttr('data-clicked');
+			$(this).attr('data-clicked', true);
+		});
+	}
+
+	if ($('#acp_help_phpbb')) {
+		phpbb.prepareSendStats();
+	}
 });
 
 
--- a/adm/style/captcha_recaptcha.html
+++ b/adm/style/captcha_recaptcha.html
@@ -1,32 +1,12 @@
 <!-- IF S_RECAPTCHA_AVAILABLE -->
 	<dl>
 	<dd>
-		<script type="text/javascript">
-		// <![CDATA[
-		var RecaptchaOptions = {
-			lang : '{LA_RECAPTCHA_LANG}',
-			theme : 'clean'
-		};
-		// ]]>
-		</script>
-		<script type="text/javascript" src="{RECAPTCHA_SERVER}/challenge?k={RECAPTCHA_PUBKEY}{RECAPTCHA_ERRORGET}"></script>
-		<script type="text/javascript">
-		// <![CDATA[
-		<!-- IF S_CONTENT_DIRECTION eq 'rtl' -->
-			document.getElementById('recaptcha_table').style.direction = 'ltr';
-		<!-- ENDIF -->
-		// ]]>
-		</script>
-
-
 	<noscript>
-	<div>
-		<object data="{RECAPTCHA_SERVER}/noscript?k={RECAPTCHA_PUBKEY}{RECAPTCHA_ERRORGET}" type="text/html" height="300" width="500"></object><br />
-		<textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
-		<input type="hidden" name="recaptcha_response_field" value="manual_challenge" />
-	</div>
+		<div>{L_RECAPTCHA_NOSCRIPT}</div>
 	</noscript>
 
+		<script src="{RECAPTCHA_SERVER}.js?hl={LA_RECAPTCHA_LANG}" async defer></script>
+		<div class="g-recaptcha" data-sitekey="{RECAPTCHA_PUBKEY}"></div>
 	</dd>
 	</dl>
 <!-- ELSE -->
--- /dev/null
+++ b/adm/style/installer_convert.html
@@ -0,0 +1,87 @@
+<!-- INCLUDE installer_header.html -->
+<!-- IF TITLE --><h1>{TITLE}</h1><!-- ENDIF -->
+<!-- IF S_ERROR_BOX -->
+<div class="errorbox">
+	<h3>{ERROR_TITLE}</h3>
+	<p>{ERROR_MSG}</p>
+</div>
+<!-- ENDIF -->
+<!-- IF .errors -->
+<div id="error-container">
+<!-- BEGIN errors -->
+	<strong>{errors.TITLE}</strong>
+	<!-- IF errors.DESCRIPTION --><p>{errors.DESCRIPTION}</p><!-- ENDIF -->
+<!-- END errors -->
+</div>
+<!-- ENDIF -->
+<!-- IF BODY --><p>{BODY}</p><!-- ENDIF -->
+<!-- IF CONTENT -->{CONTENT}<!-- ENDIF -->
+<!-- IF S_CONV_IN_PROGRESS -->
+<p class="centered-text"><a href="{U_ACTION}" class="button1<!-- IF S_REFRESH --> disabled<!-- ENDIF -->"<!-- IF S_REFRESH --> onclick="return false;"<!-- ENDIF -->>{L_SUBMIT}</a></p>
+<!-- ENDIF -->
+<!-- IF S_CONTINUE -->
+<div id="download-wrapper" class="download-box">
+	<p class="centered-text">
+		<a href="{U_NEW_ACTION}" class="button1">{L_CONVERT_NEW_CONVERSION}</a>
+		<a href="{U_CONTINUE_ACTION}" class="button1">{L_CONTINUE_OLD_CONVERSION}</a>
+	</p>
+</div>
+<!-- ENDIF -->
+<!-- IF S_LIST -->
+<table class="table1">
+	<caption>{L_AVAILABLE_CONVERTORS}</caption>
+	<col class="col1" /><col class="col2" /><col class="col1" /><col class="col2" />
+	<thead>
+	<tr>
+		<th>{L_SOFTWARE}</th>
+		<th>{L_VERSION}</th>
+		<th>{L_AUTHOR}</th>
+		<th>{L_CONVERT_OPTIONS}</th>
+	</tr>
+	</thead>
+	<tbody>
+	<!-- IF .convertors -->
+	<!-- BEGIN convertors -->
+	<tr>
+		<td>{convertors.SOFTWARE}</td>
+		<td>{convertors.VERSION}</td>
+		<td>{convertors.AUTHOR}</td>
+		<td><a href="{convertors.U_CONVERT}">{L_CONVERT}</a></td>
+	</tr>
+	<!-- END convertors -->
+	<!-- ELSE -->
+	<tr>
+		<td>{L_NO_CONVERTORS}</td>
+		<td>-</td>
+		<td>-</td>
+		<td>-</td>
+	</tr>
+	<!-- ENDIF -->
+	</tbody>
+</table>
+<!-- ENDIF -->
+<!-- IF .checks -->
+<fieldset>
+
+	<!-- BEGIN checks -->
+	<!-- IF checks.S_LEGEND -->
+	<!-- IF not checks.S_FIRST_ROW -->
+</fieldset>
+
+<fieldset>
+	<!-- ENDIF -->
+	<legend>{checks.LEGEND}</legend>
+	<!-- IF checks.LEGEND_EXPLAIN --><p>{checks.LEGEND_EXPLAIN}</p><!-- ENDIF -->
+	<!-- ELSE -->
+
+	<dl>
+		<dt><label>{checks.TITLE}{L_COLON}</label><!-- IF checks.S_EXPLAIN --><br /><span class="explain">{checks.TITLE_EXPLAIN}</span><!-- ENDIF --></dt>
+		<dd>{checks.RESULT}</dd>
+	</dl>
+	<!-- ENDIF -->
+	<!-- END checks -->
+
+</fieldset>
+<!-- ENDIF -->
+<!-- INCLUDEJS {T_ASSETS_PATH}/javascript/installer.js -->
+<!-- INCLUDE installer_footer.html -->
--- /dev/null
+++ b/adm/style/installer_footer.html
@@ -0,0 +1,30 @@
+					</div>
+				</div><!-- /#main -->
+			</div>
+		</div><!-- /#acp -->
+	</div>
+
+	<div id="page-footer">
+		<div class="copyright">
+			Powered by <a href="https://www.phpbb.com/">phpBB</a>&reg; Forum Software &copy; phpBB Limited
+		</div>
+	</div>
+</div>
+
+<script type="text/javascript">
+<!--
+installLang = {
+	title: '{LA_TIMEOUT_DETECTED_TITLE}',
+	msg: '{LA_TIMEOUT_DETECTED_MESSAGE}'
+};
+//-->
+</script>
+
+<script type="text/javascript" src="{T_JQUERY_LINK}"></script>
+<!-- IF S_ALLOW_CDN --><script type="text/javascript">window.jQuery || document.write('\x3Cscript src="{T_ASSETS_PATH}/javascript/jquery.min.js">\x3C/script>');</script><!-- ENDIF -->
+<script type="text/javascript" src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script>
+<!-- INCLUDEJS admin.js -->
+{$SCRIPTS}
+
+</body>
+</html>
--- /dev/null
+++ b/adm/style/installer_form.html
@@ -0,0 +1,56 @@
+<form id="<!-- IF FORM_ID -->{FORM_ID}<!-- ELSE -->install_install<!-- ENDIF -->" method="POST" action="{U_ACTION}">
+<!-- IF .options -->
+<!-- IF S_NOT_ONLY_BUTTON_FORM -->
+<fieldset>
+<!-- ENDIF -->
+
+	<!-- BEGIN options -->
+		<!-- IF options.S_LEGEND -->
+			<!-- IF not options.S_FIRST_ROW -->
+			</fieldset>
+
+			<fieldset>
+			<!-- ENDIF -->
+		<legend>{options.LEGEND}</legend>
+		<!-- ELSE -->
+		<dl>
+			<dt><label for="{options.KEY}">{options.TITLE}{L_COLON}</label><!-- IF options.S_EXPLAIN --><br /><span class="explain">{options.TITLE_EXPLAIN}</span><!-- ENDIF --></dt>
+			<dd>
+				<!-- IF options.TYPE == 'text' -->
+				<input type="text" name="{options.KEY}" value="{options.DEFAULT}" />
+				<!-- ENDIF -->
+				<!-- IF options.TYPE == 'email' -->
+				<input type="email" name="{options.KEY}" value="{options.DEFAULT}" />
+				<!-- ENDIF -->
+				<!-- IF options.TYPE == 'password' -->
+				<input type="password" name="{options.KEY}" />
+				<!-- ENDIF -->
+				<!-- IF options.TYPE == 'select' -->
+				<select name="{options.KEY}">
+					<!-- BEGIN options.OPTIONS -->
+					<option value="{options.OPTIONS.value}"<!-- IF options.OPTIONS.selected --> selected<!-- ENDIF -->>{options.OPTIONS.label}</option>
+					<!-- END options.OPTIONS -->
+				</select>
+				<!-- ENDIF -->
+				<!-- IF options.TYPE == 'radio' -->
+					<!-- BEGIN options.OPTIONS -->
+				<input type="radio" name="{options.KEY}" value="{options.OPTIONS.value}" <!-- IF options.OPTIONS.selected -->checked<!-- ENDIF --> /> {options.OPTIONS.label}
+					<!-- END options.OPTIONS -->
+				<!-- ENDIF -->
+			</dd>
+		</dl>
+		<!-- ENDIF-->
+	<!-- END options -->
+<!-- IF S_NOT_ONLY_BUTTON_FORM -->
+</fieldset>
+<!-- ENDIF -->
+<!-- ENDIF -->
+<!-- IF .submit_buttons -->
+<fieldset class="submit-buttons">
+	<legend>{L_SUBMIT}</legend>
+	<!-- BEGIN submit_buttons -->
+	<input class="button1" type="submit" name="{submit_buttons.KEY}" value="{submit_buttons.TITLE}" />
+	<!-- END submit_buttons -->
+</fieldset>
+<!-- ENDIF -->
+</form>
--- /dev/null
+++ b/adm/style/installer_header.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}">
+<head>
+	<meta charset="utf-8">
+	<meta http-equiv="X-UA-Compatible" content="IE=edge">
+	<meta name="viewport" content="width=device-width, initial-scale=1" />
+	<!-- IF META -->{META}<!-- ENDIF -->
+	<title>{PAGE_TITLE}</title>
+
+	<link href="{T_TEMPLATE_PATH}/admin.css" rel="stylesheet" type="text/css" media="screen" />
+</head>
+
+<body class="{S_CONTENT_DIRECTION} nojs">
+<div id="wrap">
+	<div id="page-header">
+		<h1>{L_INSTALL_PANEL}</h1>
+		<p id="skip"><a href="#acp">{L_SKIP}</a></p>
+		<!-- IF S_LANG_SELECT -->
+		<form method="post" action="#" id="language_selector">
+			<fieldset class="nobg">
+				<label for="language">{L_SELECT_LANG}{L_COLON}</label>
+				<select  id="language" name="language">
+					<!-- BEGIN language_select_item -->
+					<option value="{language_select_item.VALUE}"<!-- IF language_select_item.SELECTED --> selected="selected"<!-- ENDIF -->>{language_select_item.NAME}</option>
+					<!-- END language_select_item -->
+				</select>
+				<input class="button1" type="submit" id="change_lang" name="change_lang" value="{L_CHANGE}" />
+			</fieldset>
+		</form>
+		<!-- ENDIF -->
+	</div>
+
+	<div id="page-body">
+		<div id="tabs">
+			<ul>
+				<!-- BEGIN t_block1 -->
+				<li class="tab<!-- IF t_block1.S_SELECTED --> activetab<!-- ENDIF -->"><a href="{t_block1.U_TITLE}">{t_block1.L_TITLE}</a></li>
+				<!-- END t_block1 -->
+			</ul>
+		</div>
+
+		<div id="acp">
+			<div id="content">
+				<div id="menu">
+					<div class="menu-block no-header">
+						<ul>
+							<!-- BEGIN l_block1 -->
+							<li<!-- IF l_block1.S_SELECTED --> id="activemenu"<!-- ENDIF -->><a href="{l_block1.U_TITLE}"><span>{l_block1.L_TITLE}</span></a></li>
+							<!-- END l_block1 -->
+							<!-- BEGIN l_block2 -->
+							<li<!-- IF l_block2.S_SELECTED --> id="activemenu"<!-- ENDIF -->><span<!-- IF l_block2.S_COMPLETE --> class="completed"<!-- ENDIF --> id="installer-stage-{l_block2.STAGE_NAME}">{l_block2.L_TITLE}</span></li>
+							<!-- END l_block2 -->
+						</ul>
+					</div>
+				</div>
+
+				<div id="main" class="install-body">
+					<div class="main">
--- /dev/null
+++ b/adm/style/installer_install.html
@@ -0,0 +1,13 @@
+<!-- INCLUDE installer_header.html -->
+<h1>{TITLE}</h1>
+<p>{CONTENT}</p>
+<!-- IF SHOW_INSTALL_START_FORM -->
+<form id="install_install" method="post" action="{U_ACTION}">
+	<fieldset class="submit-buttons">
+		<legend>{L_SUBMIT}</legend>
+		<input class="button1" name="install" type="submit" value="{L_INSTALL}" />
+	</fieldset>
+</form>
+<!-- ENDIF -->
+<!-- INCLUDEJS {T_ASSETS_PATH}/javascript/installer.js -->
+<!-- INCLUDE installer_footer.html -->
--- /dev/null
+++ b/adm/style/installer_main.html
@@ -0,0 +1,6 @@
+<!-- INCLUDE installer_header.html -->
+
+	<h1>{TITLE}</h1>
+	<p>{BODY}</p>
+
+<!-- INCLUDE installer_footer.html -->
--- /dev/null
+++ b/adm/style/installer_update.html
@@ -0,0 +1,13 @@
+<!-- INCLUDE installer_header.html -->
+<h1>{TITLE}</h1>
+<p>{CONTENT}</p>
+<!-- IF SHOW_INSTALL_START_FORM -->
+<form id="install_install" method="post" action="{U_ACTION}">
+	<fieldset class="submit-buttons">
+		<legend>{L_SUBMIT}</legend>
+		<input class="button1" name="update" type="submit" value="{L_UPDATE}" />
+	</fieldset>
+</form>
+<!-- ENDIF -->
+<!-- INCLUDEJS {T_ASSETS_PATH}/javascript/installer.js -->
+<!-- INCLUDE installer_footer.html -->
--- /dev/null
+++ b/adm/style/installer_update_file_status.html
@@ -0,0 +1,80 @@
+<!-- IF .deleted -->
+<h2>{L_FILES_DELETED}</h2>
+<div style="float: {S_CONTENT_FLOW_END};">&raquo; <a href="#" onclick="phpbb.toggleDisplay('deleted', 0); return false;">{L_TOGGLE_DISPLAY}</a></div>
+<p>{L_FILES_DELETED_EXPLAIN}</p>
+
+<fieldset id="deleted">
+	<legend><img src="{T_IMAGE_PATH}/icon_delete.gif" alt="{L_STATUS_DELETED}" /></legend>
+	<!-- BEGIN deleted -->
+	<dl>
+		<dt style="width: 100%;"><!-- IF deleted.DIR_PART -->{deleted.DIR_PART}<!-- ENDIF --><strong>{deleted.FILE_PART}</strong></dt>
+	</dl>
+	<!-- END deleted -->
+</fieldset>
+
+<!-- ENDIF -->
+
+<!-- IF .conflict -->
+<h2>{L_FILES_CONFLICT}</h2>
+<div style="float: {S_CONTENT_FLOW_END};">&raquo; <a href="#" onclick="phpbb.toggleDisplay('conflict', 0); return false;">{L_TOGGLE_DISPLAY}</a></div>
+<p>{L_FILES_CONFLICT_EXPLAIN}</p>
+
+<fieldset id="conflict">
+	<legend><img src="{T_IMAGE_PATH}/file_conflict.gif" alt="{L_STATUS_CONFLICT}" /></legend>
+	<!-- BEGIN conflict -->
+	<dl>
+		<dt style="width: 100%;"><!-- IF conflict.DIR_PART -->{conflict.DIR_PART}<!-- ENDIF --><strong>{conflict.FILE_PART}</strong></dt>
+	</dl>
+	<!-- END conflict -->
+</fieldset>
+
+<!-- ENDIF -->
+
+<!-- IF .modified -->
+<h2>{L_FILES_MODIFIED}</h2>
+<div style="float: {S_CONTENT_FLOW_END};">&raquo; <a href="#" onclick="phpbb.toggleDisplay('modified', 0); return false;">{L_TOGGLE_DISPLAY}</a></div>
+<p>{L_FILES_MODIFIED_EXPLAIN}</p>
+
+<fieldset id="modified">
+	<legend><img src="{T_IMAGE_PATH}/file_modified.gif" alt="{L_STATUS_MODIFIED}" /></legend>
+	<!-- BEGIN modified -->
+	<dl>
+		<dt style="width: 100%;"><!-- IF modified.DIR_PART -->{modified.DIR_PART}<!-- ENDIF --><strong>{modified.FILE_PART}</strong></dt>
+	</dl>
+	<!-- END modified -->
+</fieldset>
+
+<!-- ENDIF -->
+
+<!-- IF .new -->
+<h2>{L_FILES_NEW}</h2>
+<div style="float: {S_CONTENT_FLOW_END};">&raquo; <a href="#" onclick="phpbb.toggleDisplay('new_files', 0); return false;">{L_TOGGLE_DISPLAY}</a></div>
+<p>{L_FILES_NEW_EXPLAIN}</p>
+
+<fieldset id="new_files" style="display: none;">
+	<legend><img src="{T_IMAGE_PATH}/file_new.gif" alt="{L_STATUS_NEW}" /></legend>
+	<!-- BEGIN new -->
+	<dl>
+		<dt style="width: 100%;"><!-- IF new.DIR_PART -->{new.DIR_PART}<!-- ENDIF --><strong>{new.FILE_PART}</strong>
+		</dt>
+	</dl>
+	<!-- END new -->
+</fieldset>
+
+<!-- ENDIF -->
+
+<!-- IF .not_modified -->
+<h2>{L_FILES_NOT_MODIFIED}</h2>
+<div style="float: {S_CONTENT_FLOW_END};">&raquo; <a href="#" onclick="phpbb.toggleDisplay('not_modified', 0); return false;">{L_TOGGLE_DISPLAY}</a></div>
+<p>{L_FILES_NOT_MODIFIED_EXPLAIN}</p>
+
+<fieldset id="not_modified" style="display: none;">
+	<legend><img src="{T_IMAGE_PATH}/file_not_modified.gif" alt="{L_STATUS_NOT_MODIFIED}" /></legend>
+	<!-- BEGIN not_modified -->
+	<dl>
+		<dt style="width: 100%;"><!-- IF not_modified.DIR_PART -->{not_modified.DIR_PART}<!-- ENDIF --><strong>{not_modified.FILE_PART}</strong></dt>
+	</dl>
+	<!-- END not_modified -->
+</fieldset>
+
+<!-- ENDIF -->
--- a/adm/style/overall_header.html
+++ b/adm/style/overall_header.html
@@ -7,6 +7,7 @@
 <!-- IF META -->{META}<!-- ENDIF -->
 <title>{PAGE_TITLE}</title>
 
+<link href="{T_FONT_AWESOME_LINK}" rel="stylesheet">
 <link href="style/admin.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="screen" />
 
 <script type="text/javascript">
@@ -50,7 +51,7 @@ function marklist(id, name, state)
 	}
 
 	var rb = parent.getElementsByTagName('input');
-	
+
 	for (var r = 0; r < rb.length; r++)
 	{
 		if (rb[r].name.substr(0, name.length) == name)
@@ -104,7 +105,7 @@ function popup(url, width, height, name)
 		<p><a href="{U_ADM_INDEX}">{L_ADMIN_INDEX}</a> &bull; <a href="{U_INDEX}">{L_FORUM_INDEX}</a></p>
 		<p id="skip"><a href="#acp">{L_SKIP}</a></p>
 	</div>
-	
+
 	<div id="page-body">
 		<div id="tabs">
 			<ul>
@@ -121,7 +122,7 @@ function popup(url, width, height, name)
 						<!-- DEFINE $LI_USED = 0 -->
 						<!-- BEGIN l_block1 -->
 							<!-- IF l_block1.S_SELECTED -->
-	
+
 						<!-- BEGIN l_block2 -->
 							<!-- IF .l_block1.l_block2.l_block3 -->
 							<!-- IF $LI_USED --></ul></div><!-- ENDIF -->
@@ -130,13 +131,13 @@ function popup(url, width, height, name)
 								<ul>
 							<!-- DEFINE $LI_USED = 1 -->
 							<!-- ENDIF -->
-	
+
 							<!-- BEGIN l_block3 -->
 								<li<!-- IF l_block1.l_block2.l_block3.S_SELECTED --> id="activemenu"<!-- ENDIF -->><a href="{l_block1.l_block2.l_block3.U_TITLE}"><span>{l_block1.l_block2.l_block3.L_TITLE}</span></a></li>
 								<!-- DEFINE $LI_USED = 1 -->
 							<!-- END l_block3 -->
 						<!-- END l_block2 -->
-						
+
 							<!-- ENDIF -->
 						<!-- END l_block1 -->
 						<!-- IF $LI_USED -->
@@ -144,6 +145,13 @@ function popup(url, width, height, name)
 							</div>
 						<!-- ENDIF -->
 					</div>
-	
+
 					<div id="main">
 						<div class="main">
+							{% if CONTAINER_EXCEPTION !== false %}
+							<div class="errorbox">
+								<p>{{ lang('CONTAINER_EXCEPTION') }}</p><br />
+								<p>{{ lang('EXCEPTION') }}{{ lang('COLON') }} {{ CONTAINER_EXCEPTION.getMessage() }}</p>
+								<pre>{{ CONTAINER_EXCEPTION.getTraceAsString() }}</pre>
+							</div>
+							{% endif %}
--- a/adm/style/permission_mask.html
+++ b/adm/style/permission_mask.html
@@ -39,11 +39,24 @@
 		</div>
 		<dl class="permissions-simple">
 			<dt style="width: 20%"><label for="role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}">{L_ROLE}{L_COLON}</label></dt>
-			<!-- IF p_mask.f_mask.S_ROLE_OPTIONS -->
-				<dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 20%"><select id="role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}" name="role[{p_mask.f_mask.UG_ID}][{p_mask.f_mask.FORUM_ID}]" onchange="set_role_settings(this.options[selectedIndex].value, 'advanced{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}'); init_colours('{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}')">{p_mask.f_mask.S_ROLE_OPTIONS}</select></dd>
-			<!-- ELSE -->
+			{% if p_mask.f_mask.role_options %}
+				<dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 20%">
+					<div class="dropdown-container dropdown-button-control roles-options" data-alt-text="{LA_ROLE_DESCRIPTION}">
+						<select id="role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}" name="role[{p_mask.f_mask.UG_ID}][{p_mask.f_mask.FORUM_ID}]">{p_mask.f_mask.S_ROLE_OPTIONS}</select>
+						<span title="Roles" class="button icon-button tools-icon dropdown-trigger dropdown-select">{L_NO_ROLE_ASSIGNED}</span>
+						<div class="dropdown hidden">
+							<ul class="dropdown-contents" id="role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}" >
+								{% for role in p_mask.f_mask.role_options %}
+									<li data-id="{{ role.ID }}" data-target-id="advanced{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}" data-title="{{ role.TITLE }}"{% if role.SELECTED == true %} data-selected="{{ role.SELECTED }}"{% endif %}>{{ role.ROLE_NAME }}</li>
+								{% endfor %}
+							</ul>
+						</div>
+						<input type="hidden" data-name="role[{p_mask.f_mask.UG_ID}][{p_mask.f_mask.FORUM_ID}]"{% if p_mask.f_mask.S_ROLE_ID %}value="{{ p_mask.f_mask.S_ROLE_ID }}"{% endif %} />
+					</div>
+				</dd>
+			{% else %}
 				<dd>{L_NO_ROLE_AVAILABLE}</dd>
-			<!-- ENDIF -->
+			{% endif %}
 		</dl>
 	<!-- ENDIF -->
 
--- a/adm/style/tooltip.js
+++ b/adm/style/tooltip.js
@@ -10,206 +10,224 @@ phpBB Development Team:
 	- further adjustements
 */
 
-var head_text, tooltip_mode;
+(function($) { // Avoid conflicts with other libraries
 
-/**
-* Enable tooltip replacements for links
-*/
-function enable_tooltips_link(id, headline, sub_id) {
-	var links, i, hold;
-
-	head_text = headline;
-
-	if (!document.getElementById || !document.getElementsByTagName) {
-		return;
-	}
-
-	hold = document.createElement('span');
-	hold.id = '_tooltip_container';
-	hold.setAttribute('id', '_tooltip_container');
-	hold.style.position = 'absolute';
-
-	document.getElementsByTagName('body')[0].appendChild(hold);
-
-	if (id === null) {
-		links = document.getElementsByTagName('a');
-	} else {
-		links = document.getElementById(id).getElementsByTagName('a');
-	}
-
-	for (i = 0; i < links.length; i++) {
-		if (sub_id) {
-			if (links[i].id.substr(0, sub_id.length) === sub_id) {
-				prepare(links[i]);
-			}
-		} else {
-			prepare(links[i]);
-		}
-	}
+'use strict';
 
-	tooltip_mode = 'link';
-}
+var tooltips = [];
 
 /**
-* Enable tooltip replacements for selects
+ * Enable tooltip replacements for selects
+ * @param {string} id ID tag of select
+ * @param {string} headline Text that should appear on top of tooltip
+ * @param {string} [subId] Sub ID that should only be using tooltips (optional)
 */
-function enable_tooltips_select(id, headline, sub_id) {
-	var links, i, hold;
-
-	head_text = headline;
-
-	if (!document.getElementById || !document.getElementsByTagName) {
-		return;
-	}
+phpbb.enableTooltipsSelect = function (id, headline, subId) {
+	var $links, hold;
 
-	hold = document.createElement('span');
-	hold.id = '_tooltip_container';
-	hold.setAttribute('id', '_tooltip_container');
-	hold.style.position = 'absolute';
+	hold = $('<span />', {
+		id:		'_tooltip_container',
+		css: {
+			position: 'absolute'
+		}
+	});
 
-	document.getElementsByTagName('body')[0].appendChild(hold);
+	$('body').append(hold);
 
-	if (id === null) {
-		links = document.getElementsByTagName('option');
+	if (!id) {
+		$links = $('.roles-options li');
 	} else {
-		links = document.getElementById(id).getElementsByTagName('option');
+		$links = $('.roles-options li', '#' + id);
 	}
 
-	for (i = 0; i < links.length; i++) {
-		if (sub_id) {
-			if (links[i].parentNode.id.substr(0, sub_id.length) === sub_id) {
-				prepare(links[i]);
+	$links.each(function () {
+		var $this = $(this);
+
+		if (subId) {
+			if ($this.parent().attr('id').substr(0, subId.length) === subId) {
+				phpbb.prepareTooltips($this, headline);
 			}
 		} else {
-			prepare(links[i]);
+			phpbb.prepareTooltips($this, headline);
 		}
-	}
-
-	tooltip_mode = 'select';
-}
+	});
+};
 
 /**
-* Prepare elements to replace
+ * Prepare elements to replace
+ *
+ * @param {jQuery} $element Element to prepare for tooltips
+ * @param {string} headText Text heading to display
 */
-function prepare(element) {
-	var tooltip, text, desc, title;
+phpbb.prepareTooltips = function ($element, headText) {
+	var $tooltip, text, $desc, $title;
 
-	text = element.getAttribute('title');
+	text = $element.attr('data-title');
 
 	if (text === null || text.length === 0) {
 		return;
 	}
 
-	element.removeAttribute('title');
-	tooltip = create_element('span', 'tooltip');
-
-	title = create_element('span', 'top');
-	title.appendChild(document.createTextNode(head_text));
-	tooltip.appendChild(title);
-
-	desc = create_element('span', 'bottom');
-	desc.innerHTML = text;
-	tooltip.appendChild(desc);
+	$title = $('<span />', {
+		class: 'top',
+		css: {
+			display:	'block'
+		}
+	})
+		.append(document.createTextNode(headText));
+
+	$desc = $('<span />', {
+		class: 'bottom',
+		html: text,
+		css: {
+			display: 'block'
+		}
+	});
 
-	set_opacity(tooltip);
+	$tooltip = $('<span />', {
+		class: 'tooltip',
+		css: {
+			display: 'block'
+		}
+	})
+		.append($title)
+		.append($desc);
 
-	element.tooltip = tooltip;
-	element.onmouseover = show_tooltip;
-	element.onmouseout = hide_tooltip;
-
-	if (tooltip_mode === 'link') {
-		element.onmousemove = locate;
-	}
-}
+	tooltips[$element.attr('data-id')] = $tooltip;
+	$element.on('mouseover', phpbb.showTooltip);
+	$element.on('mouseout', phpbb.hideTooltip);
+};
 
 /**
-* Show tooltip
+ * Show tooltip
+ *
+ * @param {object} $element Element passed by .on()
 */
-function show_tooltip(e) {
-	document.getElementById('_tooltip_container').appendChild(this.tooltip);
-	locate(this);
-}
+phpbb.showTooltip = function ($element) {
+	var $this = $($element.target);
+	$('#_tooltip_container').append(tooltips[$this.attr('data-id')]);
+	phpbb.positionTooltip($this);
+};
 
 /**
-* Hide tooltip
+ * Hide tooltip
 */
-function hide_tooltip(e) {
+phpbb.hideTooltip = function () {
 	var d = document.getElementById('_tooltip_container');
 	if (d.childNodes.length > 0) {
 		d.removeChild(d.firstChild);
 	}
-}
+};
 
 /**
-* Set opacity on tooltip element
+ * Correct positioning of tooltip container
+ *
+ * @param {jQuery} $element Tooltip element that should be positioned
 */
-function set_opacity(element) {
-	element.style.filter = 'alpha(opacity:95)';
-	element.style.KHTMLOpacity = '0.95';
-	element.style.MozOpacity = '0.95';
-	element.style.opacity = '0.95';
-}
+phpbb.positionTooltip = function ($element) {
+	var offset;
 
-/**
-* Create new element
-*/
-function create_element(tag, c) {
-	var x = document.createElement(tag);
-	x.className = c;
-	x.style.display = 'block';
-	return x;
-}
+	$element = $element.parent();
+	offset = $element.offset();
 
-/**
-* Correct positioning of tooltip container
-*/
-function locate(e) {
-	var posx = 0;
-	var posy = 0;
-
-	e = e.parentNode;
+	$('#_tooltip_container').css({
+		top: offset.top + 30,
+		left: offset.left - 205
+	});
+};
 
-	if (e.offsetParent) {
-		for (posx = 0, posy = 0; e.offsetParent; e = e.offsetParent) {
-			posx += e.offsetLeft;
-			posy += e.offsetTop;
+/**
+ * Prepare roles drop down select
+ */
+phpbb.prepareRolesDropdown = function () {
+	var $options = $('.roles-options li');
+
+	// Display span and hide select
+	$('.roles-options > span').css('display', 'block');
+	$('.roles-options > select').hide();
+	$('.roles-options > input[type=hidden]').each(function () {
+		var $this = $(this);
+
+		if ($this.attr('data-name') && !$this.attr('name')) {
+			$this.attr('name', $this.attr('data-name'));
 		}
-	} else {
-		posx = e.offsetLeft;
-		posy = e.offsetTop;
-	}
-
-	if (tooltip_mode === 'link') {
-		document.getElementById('_tooltip_container').style.top=(posy+20) + 'px';
-		document.getElementById('_tooltip_container').style.left=(posx-20) + 'px';
-	} else {
-		document.getElementById('_tooltip_container').style.top=(posy+30) + 'px';
-		document.getElementById('_tooltip_container').style.left=(posx-205) + 'px';
-	}
-
-/*
-	if (e == null)
-	{
-		e = window.event;
-	}
+	});
+
+	// Prepare highlighting of select options and settings update
+	$options.each(function () {
+		var $this = $(this);
+		var $rolesOptions = $this.closest('.roles-options');
+		var $span = $rolesOptions.children('span');
+
+		// Correctly show selected option
+		if (typeof $this.attr('data-selected') !== 'undefined') {
+			$rolesOptions
+				.children('span')
+				.text($this.text())
+				.attr('data-default', $this.text())
+				.attr('data-default-val', $this.attr('data-id'));
+
+			// Save default text of drop down if there is no default set yet
+			if (typeof $span.attr('data-default') === 'undefined') {
+				$span.attr('data-default', $span.text());
+			}
 
-	if (e.pageX || e.pageY)
-	{
-		posx = e.pageX;
-		posy = e.pageY;
-	}
-	else if (e.clientX || e.clientY)
-	{
-		if (document.documentElement.scrollTop)
-		{
-			posx = e.clientX+document.documentElement.scrollLeft;
-			posy = e.clientY+document.documentElement.scrollTop;
-		}
-		else
-		{
-			posx = e.clientX+document.body.scrollLeft;
-			posy = e.clientY+document.body.scrollTop;
+			// Prepare resetting drop down on form reset
+			$this.closest('form').on('reset', function () {
+				$span.text($span.attr('data-default'));
+				$rolesOptions.children('input[type=hidden]')
+					.val($span.attr('data-default-val'));
+			});
 		}
-	}
-*/
-}
+
+		$this.on('mouseover', function () {
+			var $this = $(this);
+			$options.removeClass('roles-highlight');
+			$this.addClass('roles-highlight');
+		}).on('click', function () {
+			var $this = $(this);
+			var $rolesOptions = $this.closest('.roles-options');
+
+			// Update settings
+			set_role_settings($this.attr('data-id'), $this.attr('data-target-id'));
+			init_colours($this.attr('data-target-id').replace('advanced', ''));
+
+			// Set selected setting
+			$rolesOptions.children('span')
+				.text($this.text());
+			$rolesOptions.children('input[type=hidden]')
+				.val($this.attr('data-id'));
+
+			// Trigger hiding of selection options
+			$('body').trigger('click');
+		});
+	});
+};
+
+// Run onload functions for RolesDropdown and tooltips
+$(function() {
+	// Enable tooltips
+	phpbb.enableTooltipsSelect('set-permissions', $('#set-permissions').attr('data-role-description'), 'role');
+
+	// Prepare dropdown
+	phpbb.prepareRolesDropdown();
+
+	// Reset role drop-down on modifying permissions in advanced tab
+	$('div.permissions-switch > a').on('click', function () {
+		$.each($('input[type=radio][name^="setting["]'), function () {
+			var $this = $(this);
+			$this.on('click', function () {
+				var $rolesOptions = $this.closest('fieldset.permissions').find('.roles-options'),
+					rolesSelect = $rolesOptions.find('select > option')[0];
+
+				// Set selected setting
+				$rolesOptions.children('span')
+					.text(rolesSelect.text);
+				$rolesOptions.children('input[type=hidden]')
+					.val(rolesSelect.value);
+			});
+		});
+	});
+});
+
+})(jQuery); // Avoid conflicts with other libraries
--- a/app.php
+++ b/app.php
@@ -21,14 +21,16 @@ define('IN_PHPBB', true);
 $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
 $phpEx = substr(strrchr(__FILE__, '.'), 1);
 include($phpbb_root_path . 'common.' . $phpEx);
-include($phpbb_root_path . 'includes/functions_url_matcher.' . $phpEx);
 
 // Start session management
 $user->session_begin();
 $auth->acl($user->data);
 $user->setup('app');
 
+/* @var $http_kernel \Symfony\Component\HttpKernel\HttpKernel */
 $http_kernel = $phpbb_container->get('http_kernel');
+
+/* @var $symfony_request \phpbb\symfony_request */
 $symfony_request = $phpbb_container->get('symfony_request');
 $response = $http_kernel->handle($symfony_request);
 $response->send();
--- /dev/null
+++ b/assets/cookieconsent/cookieconsent.min.css
@@ -0,0 +1,6 @@
+.cc-window{opacity:1;transition:opacity 1s ease}.cc-window.cc-invisible{opacity:0}.cc-animate.cc-revoke{transition:transform 1s ease}.cc-animate.cc-revoke.cc-top{transform:translateY(-2em)}.cc-animate.cc-revoke.cc-bottom{transform:translateY(2em)}.cc-animate.cc-revoke.cc-active.cc-bottom,.cc-animate.cc-revoke.cc-active.cc-top,.cc-revoke:hover{transform:translateY(0)}.cc-grower{max-height:0;overflow:hidden;transition:max-height 1s}
+.cc-link,.cc-revoke:hover{text-decoration:underline}.cc-revoke,.cc-window{position:fixed;overflow:hidden;box-sizing:border-box;font-family:Helvetica,Calibri,Arial,sans-serif;font-size:16px;line-height:1.5em;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;z-index:9999}.cc-window.cc-static{position:static}.cc-window.cc-floating{padding:2em;max-width:24em;-ms-flex-direction:column;flex-direction:column}.cc-window.cc-banner{padding:1em 1.8em;width:100%;-ms-flex-direction:row;flex-direction:row}.cc-revoke{padding:.5em}.cc-header{font-size:18px;font-weight:700}.cc-btn,.cc-close,.cc-link,.cc-revoke{cursor:pointer}.cc-link{opacity:.8;display:inline-block;padding:.2em}.cc-link:hover{opacity:1}.cc-link:active,.cc-link:visited{color:initial}.cc-btn{display:block;padding:.4em .8em;font-size:.9em;font-weight:700;border-width:2px;border-style:solid;text-align:center;white-space:nowrap}.cc-banner .cc-btn:last-child{min-width:140px}.cc-highlight .cc-btn:first-child{background-color:transparent;border-color:transparent}.cc-highlight .cc-btn:first-child:focus,.cc-highlight .cc-btn:first-child:hover{background-color:transparent;text-decoration:underline}.cc-close{display:block;position:absolute;top:.5em;right:.5em;font-size:1.6em;opacity:.9;line-height:.75}.cc-close:focus,.cc-close:hover{opacity:1}
+.cc-revoke.cc-top{top:0;left:3em;border-bottom-left-radius:.5em;border-bottom-right-radius:.5em}.cc-revoke.cc-bottom{bottom:0;left:3em;border-top-left-radius:.5em;border-top-right-radius:.5em}.cc-revoke.cc-left{left:3em;right:unset}.cc-revoke.cc-right{right:3em;left:unset}.cc-top{top:1em}.cc-left{left:1em}.cc-right{right:1em}.cc-bottom{bottom:1em}.cc-floating>.cc-link{margin-bottom:1em}.cc-floating .cc-message{display:block;margin-bottom:1em}.cc-window.cc-floating .cc-compliance{-ms-flex:1;flex:1}.cc-window.cc-banner{-ms-flex-align:center;align-items:center}.cc-banner.cc-top{left:0;right:0;top:0}.cc-banner.cc-bottom{left:0;right:0;bottom:0}.cc-banner .cc-message{-ms-flex:1;flex:1}.cc-compliance{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:justify;align-content:space-between}.cc-compliance>.cc-btn{-ms-flex:1;flex:1}.cc-btn+.cc-btn{margin-left:.5em}
+@media print{.cc-revoke,.cc-window{display:none}}@media screen and (max-width:900px){.cc-btn{white-space:normal}}@media screen and (max-width:414px) and (orientation:portrait),screen and (max-width:736px) and (orientation:landscape){.cc-window.cc-top{top:0}.cc-window.cc-bottom{bottom:0}.cc-window.cc-banner,.cc-window.cc-left,.cc-window.cc-right{left:0;right:0}.cc-window.cc-banner{-ms-flex-direction:column;flex-direction:column}.cc-window.cc-banner .cc-compliance{-ms-flex:1;flex:1}.cc-window.cc-floating{max-width:none}.cc-window .cc-message{margin-bottom:1em}.cc-window.cc-banner{-ms-flex-align:unset;align-items:unset}}
+.cc-floating.cc-theme-classic{padding:1.2em;border-radius:5px}.cc-floating.cc-type-info.cc-theme-classic .cc-compliance{text-align:center;display:inline;-ms-flex:none;flex:none}.cc-theme-classic .cc-btn{border-radius:5px}.cc-theme-classic .cc-btn:last-child{min-width:140px}.cc-floating.cc-type-info.cc-theme-classic .cc-btn{display:inline-block}
+.cc-theme-edgeless.cc-window{padding:0}.cc-floating.cc-theme-edgeless .cc-message{margin:2em 2em 1.5em}.cc-banner.cc-theme-edgeless .cc-btn{margin:0;padding:.8em 1.8em;height:100%}.cc-banner.cc-theme-edgeless .cc-message{margin-left:1em}.cc-floating.cc-theme-edgeless .cc-btn+.cc-btn{margin-left:0}
\ No newline at end of file
--- /dev/null
+++ b/assets/cookieconsent/cookieconsent.min.js
@@ -0,0 +1 @@
+!function(e){if(!e.hasInitialised){var t={escapeRegExp:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},hasClass:function(e,t){var i=" ";return 1===e.nodeType&&(i+e.className+i).replace(/[\n\t]/g,i).indexOf(i+t+i)>=0},addClass:function(e,t){e.className+=" "+t},removeClass:function(e,t){var i=new RegExp("\\b"+this.escapeRegExp(t)+"\\b");e.className=e.className.replace(i,"")},interpolateString:function(e,t){var i=/{{([a-z][a-z0-9\-_]*)}}/gi;return e.replace(i,function(e){return t(arguments[1])||""})},getCookie:function(e){var t="; "+document.cookie,i=t.split("; "+e+"=");return 2!=i.length?void 0:i.pop().split(";").shift()},setCookie:function(e,t,i,n,o){var s=new Date;s.setDate(s.getDate()+(i||365));var r=[e+"="+t,"expires="+s.toUTCString(),"path="+(o||"/")];n&&r.push("domain="+n),document.cookie=r.join(";")},deepExtend:function(e,t){for(var i in t)t.hasOwnProperty(i)&&(i in e&&this.isPlainObject(e[i])&&this.isPlainObject(t[i])?this.deepExtend(e[i],t[i]):e[i]=t[i]);return e},throttle:function(e,t){var i=!1;return function(){i||(e.apply(this,arguments),i=!0,setTimeout(function(){i=!1},t))}},hash:function(e){var t,i,n,o=0;if(0===e.length)return o;for(t=0,n=e.length;t<n;++t)i=e.charCodeAt(t),o=(o<<5)-o+i,o|=0;return o},normaliseHex:function(e){return"#"==e[0]&&(e=e.substr(1)),3==e.length&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]),e},getContrast:function(e){e=this.normaliseHex(e);var t=parseInt(e.substr(0,2),16),i=parseInt(e.substr(2,2),16),n=parseInt(e.substr(4,2),16),o=(299*t+587*i+114*n)/1e3;return o>=128?"#000":"#fff"},getLuminance:function(e){var t=parseInt(this.normaliseHex(e),16),i=38,n=(t>>16)+i,o=(t>>8&255)+i,s=(255&t)+i,r=(16777216+65536*(n<255?n<1?0:n:255)+256*(o<255?o<1?0:o:255)+(s<255?s<1?0:s:255)).toString(16).slice(1);return"#"+r},isMobile:function(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)},isPlainObject:function(e){return"object"==typeof e&&null!==e&&e.constructor==Object}};e.status={deny:"deny",allow:"allow",dismiss:"dismiss"},e.transitionEnd=function(){var e=document.createElement("div"),t={t:"transitionend",OT:"oTransitionEnd",msT:"MSTransitionEnd",MozT:"transitionend",WebkitT:"webkitTransitionEnd"};for(var i in t)if(t.hasOwnProperty(i)&&"undefined"!=typeof e.style[i+"ransition"])return t[i];return""}(),e.hasTransition=!!e.transitionEnd;var i=Object.keys(e.status).map(t.escapeRegExp);e.customStyles={},e.Popup=function(){function n(){this.initialise.apply(this,arguments)}function o(e){this.openingTimeout=null,t.removeClass(e,"cc-invisible")}function s(t){t.style.display="none",t.removeEventListener(e.transitionEnd,this.afterTransition),this.afterTransition=null}function r(){var t=this.options.onInitialise.bind(this);if(!window.navigator.cookieEnabled)return t(e.status.deny),!0;if(window.CookiesOK||window.navigator.CookiesOK)return t(e.status.allow),!0;var i=Object.keys(e.status),n=this.getStatus(),o=i.indexOf(n)>=0;return o&&t(n),o}function a(){var e=this.options.position.split("-"),t=[];return e.forEach(function(e){t.push("cc-"+e)}),t}function c(){var e=this.options,i="top"==e.position||"bottom"==e.position?"banner":"floating";t.isMobile()&&(i="floating");var n=["cc-"+i,"cc-type-"+e.type,"cc-theme-"+e.theme];e["static"]&&n.push("cc-static"),n.push.apply(n,a.call(this));p.call(this,this.options.palette);return this.customStyleSelector&&n.push(this.customStyleSelector),n}function l(){var e={},i=this.options;i.showLink||(i.elements.link="",i.elements.messagelink=i.elements.message),Object.keys(i.elements).forEach(function(n){e[n]=t.interpolateString(i.elements[n],function(e){var t=i.content[e];return e&&"string"==typeof t&&t.length?t:""})});var n=i.compliance[i.type];n||(n=i.compliance.info),e.compliance=t.interpolateString(n,function(t){return e[t]});var o=i.layouts[i.layout];return o||(o=i.layouts.basic),t.interpolateString(o,function(t){return e[t]})}function u(i){var n=this.options,o=document.createElement("div"),s=n.container&&1===n.container.nodeType?n.container:document.body;o.innerHTML=i;var r=o.children[0];return r.style.display="none",t.hasClass(r,"cc-window")&&e.hasTransition&&t.addClass(r,"cc-invisible"),this.onButtonClick=h.bind(this),r.addEventListener("click",this.onButtonClick),n.autoAttach&&(s.firstChild?s.insertBefore(r,s.firstChild):s.appendChild(r)),r}function h(n){var o=n.target;if(t.hasClass(o,"cc-btn")){var s=o.className.match(new RegExp("\\bcc-("+i.join("|")+")\\b")),r=s&&s[1]||!1;r&&(this.setStatus(r),this.close(!0))}t.hasClass(o,"cc-close")&&(this.setStatus(e.status.dismiss),this.close(!0)),t.hasClass(o,"cc-revoke")&&this.revokeChoice()}function p(e){var i=t.hash(JSON.stringify(e)),n="cc-color-override-"+i,o=t.isPlainObject(e);return this.customStyleSelector=o?n:null,o&&d(i,e,"."+n),o}function d(i,n,o){if(e.customStyles[i])return void++e.customStyles[i].references;var s={},r=n.popup,a=n.button,c=n.highlight;r&&(r.text=r.text?r.text:t.getContrast(r.background),r.link=r.link?r.link:r.text,s[o+".cc-window"]=["color: "+r.text,"background-color: "+r.background],s[o+".cc-revoke"]=["color: "+r.text,"background-color: "+r.background],s[o+" .cc-link,"+o+" .cc-link:active,"+o+" .cc-link:visited"]=["color: "+r.link],a&&(a.text=a.text?a.text:t.getContrast(a.background),a.border=a.border?a.border:"transparent",s[o+" .cc-btn"]=["color: "+a.text,"border-color: "+a.border,"background-color: "+a.background],"transparent"!=a.background&&(s[o+" .cc-btn:hover, "+o+" .cc-btn:focus"]=["background-color: "+v(a.background)]),c?(c.text=c.text?c.text:t.getContrast(c.background),c.border=c.border?c.border:"transparent",s[o+" .cc-highlight .cc-btn:first-child"]=["color: "+c.text,"border-color: "+c.border,"background-color: "+c.background]):s[o+" .cc-highlight .cc-btn:first-child"]=["color: "+r.text]));var l=document.createElement("style");document.head.appendChild(l),e.customStyles[i]={references:1,element:l.sheet};var u=-1;for(var h in s)s.hasOwnProperty(h)&&l.sheet.insertRule(h+"{"+s[h].join(";")+"}",++u)}function v(e){return e=t.normaliseHex(e),"000000"==e?"#222":t.getLuminance(e)}function f(i){if(t.isPlainObject(i)){var n=t.hash(JSON.stringify(i)),o=e.customStyles[n];if(o&&!--o.references){var s=o.element.ownerNode;s&&s.parentNode&&s.parentNode.removeChild(s),e.customStyles[n]=null}}}function m(e,t){for(var i=0,n=e.length;i<n;++i){var o=e[i];if(o instanceof RegExp&&o.test(t)||"string"==typeof o&&o.length&&o===t)return!0}return!1}function b(){var t=this.setStatus.bind(this),i=this.options.dismissOnTimeout;"number"==typeof i&&i>=0&&(this.dismissTimeout=window.setTimeout(function(){t(e.status.dismiss)},Math.floor(i)));var n=this.options.dismissOnScroll;if("number"==typeof n&&n>=0){var o=function(i){window.pageYOffset>Math.floor(n)&&(t(e.status.dismiss),window.removeEventListener("scroll",o),this.onWindowScroll=null)};this.onWindowScroll=o,window.addEventListener("scroll",o)}}function y(){if("info"!=this.options.type&&(this.options.revokable=!0),t.isMobile()&&(this.options.animateRevokable=!1),this.options.revokable){var e=a.call(this);this.options.animateRevokable&&e.push("cc-animate"),this.customStyleSelector&&e.push(this.customStyleSelector);var i=this.options.revokeBtn.replace("{{classes}}",e.join(" "));this.revokeBtn=u.call(this,i);var n=this.revokeBtn;if(this.options.animateRevokable){var o=t.throttle(function(e){var i=!1,o=20,s=window.innerHeight-20;t.hasClass(n,"cc-top")&&e.clientY<o&&(i=!0),t.hasClass(n,"cc-bottom")&&e.clientY>s&&(i=!0),i?t.hasClass(n,"cc-active")||t.addClass(n,"cc-active"):t.hasClass(n,"cc-active")&&t.removeClass(n,"cc-active")},200);this.onMouseMove=o,window.addEventListener("mousemove",o)}}}var g={enabled:!0,container:null,cookie:{name:"cookieconsent_status",path:"/",domain:"",expiryDays:365},onPopupOpen:function(){},onPopupClose:function(){},onInitialise:function(e){},onStatusChange:function(e,t){},onRevokeChoice:function(){},content:{header:"Cookies used on the website!",message:"This website uses cookies to ensure you get the best experience on our website.",dismiss:"Got it!",allow:"Allow cookies",deny:"Decline",link:"Learn more",href:"http://cookiesandyou.com",close:"&#x274c;"},elements:{header:'<span class="cc-header">{{header}}</span>&nbsp;',message:'<span id="cookieconsent:desc" class="cc-message">{{message}}</span>',messagelink:'<span id="cookieconsent:desc" class="cc-message">{{message}} <a aria-label="learn more about cookies" role=button tabindex="0" class="cc-link" href="{{href}}" target="_blank">{{link}}</a></span>',dismiss:'<a aria-label="dismiss cookie message" role=button tabindex="0" class="cc-btn cc-dismiss">{{dismiss}}</a>',allow:'<a aria-label="allow cookies" role=button tabindex="0"  class="cc-btn cc-allow">{{allow}}</a>',deny:'<a aria-label="deny cookies" role=button tabindex="0" class="cc-btn cc-deny">{{deny}}</a>',link:'<a aria-label="learn more about cookies" role=button tabindex="0" class="cc-link" href="{{href}}" target="_blank">{{link}}</a>',close:'<span aria-label="dismiss cookie message" role=button tabindex="0" class="cc-close">{{close}}</span>'},window:'<div role="dialog" aria-live="polite" aria-label="cookieconsent" aria-describedby="cookieconsent:desc" class="cc-window {{classes}}"><!--googleoff: all-->{{children}}<!--googleon: all--></div>',revokeBtn:'<div class="cc-revoke {{classes}}">Cookie Policy</div>',compliance:{info:'<div class="cc-compliance">{{dismiss}}</div>',"opt-in":'<div class="cc-compliance cc-highlight">{{dismiss}}{{allow}}</div>',"opt-out":'<div class="cc-compliance cc-highlight">{{deny}}{{dismiss}}</div>'},type:"info",layouts:{basic:"{{messagelink}}{{compliance}}","basic-close":"{{messagelink}}{{compliance}}{{close}}","basic-header":"{{header}}{{message}}{{link}}{{compliance}}"},layout:"basic",position:"bottom",theme:"block","static":!1,palette:null,revokable:!1,animateRevokable:!0,showLink:!0,dismissOnScroll:!1,dismissOnTimeout:!1,autoOpen:!0,autoAttach:!0,whitelistPage:[],blacklistPage:[],overrideHTML:null};return n.prototype.initialise=function(e){this.options&&this.destroy(),t.deepExtend(this.options={},g),t.isPlainObject(e)&&t.deepExtend(this.options,e),r.call(this)&&(this.options.enabled=!1),m(this.options.blacklistPage,location.pathname)&&(this.options.enabled=!1),m(this.options.whitelistPage,location.pathname)&&(this.options.enabled=!0);var i=this.options.window.replace("{{classes}}",c.call(this).join(" ")).replace("{{children}}",l.call(this)),n=this.options.overrideHTML;if("string"==typeof n&&n.length&&(i=n),this.options["static"]){var o=u.call(this,'<div class="cc-grower">'+i+"</div>");o.style.display="",this.element=o.firstChild,this.element.style.display="none",t.addClass(this.element,"cc-invisible")}else this.element=u.call(this,i);b.call(this),y.call(this),this.options.autoOpen&&this.autoOpen()},n.prototype.destroy=function(){this.onButtonClick&&this.element&&(this.element.removeEventListener("click",this.onButtonClick),this.onButtonClick=null),this.dismissTimeout&&(clearTimeout(this.dismissTimeout),this.dismissTimeout=null),this.onWindowScroll&&(window.removeEventListener("scroll",this.onWindowScroll),this.onWindowScroll=null),this.onMouseMove&&(window.removeEventListener("mousemove",this.onMouseMove),this.onMouseMove=null),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element),this.element=null,this.revokeBtn&&this.revokeBtn.parentNode&&this.revokeBtn.parentNode.removeChild(this.revokeBtn),this.revokeBtn=null,f(this.options.palette),this.options=null},n.prototype.open=function(t){if(this.element)return this.isOpen()||(e.hasTransition?this.fadeIn():this.element.style.display="",this.options.revokable&&this.toggleRevokeButton(),this.options.onPopupOpen.call(this)),this},n.prototype.close=function(t){if(this.element)return this.isOpen()&&(e.hasTransition?this.fadeOut():this.element.style.display="none",t&&this.options.revokable&&this.toggleRevokeButton(!0),this.options.onPopupClose.call(this)),this},n.prototype.fadeIn=function(){var i=this.element;if(e.hasTransition&&i&&(this.afterTransition&&s.call(this,i),t.hasClass(i,"cc-invisible"))){if(i.style.display="",this.options["static"]){var n=this.element.clientHeight;this.element.parentNode.style.maxHeight=n+"px"}var r=20;this.openingTimeout=setTimeout(o.bind(this,i),r)}},n.prototype.fadeOut=function(){var i=this.element;e.hasTransition&&i&&(this.openingTimeout&&(clearTimeout(this.openingTimeout),o.bind(this,i)),t.hasClass(i,"cc-invisible")||(this.options["static"]&&(this.element.parentNode.style.maxHeight=""),this.afterTransition=s.bind(this,i),i.addEventListener(e.transitionEnd,this.afterTransition),t.addClass(i,"cc-invisible")))},n.prototype.isOpen=function(){return this.element&&""==this.element.style.display&&(!e.hasTransition||!t.hasClass(this.element,"cc-invisible"))},n.prototype.toggleRevokeButton=function(e){this.revokeBtn&&(this.revokeBtn.style.display=e?"":"none")},n.prototype.revokeChoice=function(e){this.options.enabled=!0,this.clearStatus(),this.options.onRevokeChoice.call(this),e||this.autoOpen()},n.prototype.hasAnswered=function(t){return Object.keys(e.status).indexOf(this.getStatus())>=0},n.prototype.hasConsented=function(t){var i=this.getStatus();return i==e.status.allow||i==e.status.dismiss},n.prototype.autoOpen=function(e){!this.hasAnswered()&&this.options.enabled&&this.open()},n.prototype.setStatus=function(i){var n=this.options.cookie,o=t.getCookie(n.name),s=Object.keys(e.status).indexOf(o)>=0;Object.keys(e.status).indexOf(i)>=0?(t.setCookie(n.name,i,n.expiryDays,n.domain,n.path),this.options.onStatusChange.call(this,i,s)):this.clearStatus()},n.prototype.getStatus=function(){return t.getCookie(this.options.cookie.name)},n.prototype.clearStatus=function(){var e=this.options.cookie;t.setCookie(e.name,"",-1,e.domain,e.path)},n}(),e.Location=function(){function e(e){t.deepExtend(this.options={},s),t.isPlainObject(e)&&t.deepExtend(this.options,e),this.currentServiceIndex=-1}function i(e,t,i){var n,o=document.createElement("script");o.type="text/"+(e.type||"javascript"),o.src=e.src||e,o.async=!1,o.onreadystatechange=o.onload=function(){var e=o.readyState;clearTimeout(n),t.done||e&&!/loaded|complete/.test(e)||(t.done=!0,t(),o.onreadystatechange=o.onload=null)},document.body.appendChild(o),n=setTimeout(function(){t.done=!0,t(),o.onreadystatechange=o.onload=null},i)}function n(e,t,i,n,o){var s=new(window.XMLHttpRequest||window.ActiveXObject)("MSXML2.XMLHTTP.3.0");if(s.open(n?"POST":"GET",e,1),s.setRequestHeader("X-Requested-With","XMLHttpRequest"),s.setRequestHeader("Content-type","application/x-www-form-urlencoded"),Array.isArray(o))for(var r=0,a=o.length;r<a;++r){var c=o[r].split(":",2);s.setRequestHeader(c[0].replace(/^\s+|\s+$/g,""),c[1].replace(/^\s+|\s+$/g,""))}"function"==typeof t&&(s.onreadystatechange=function(){s.readyState>3&&t(s)}),s.send(n)}function o(e){return new Error("Error ["+(e.code||"UNKNOWN")+"]: "+e.error)}var s={timeout:5e3,services:["freegeoip","ipinfo","maxmind"],serviceDefinitions:{freegeoip:function(){return{url:"//freegeoip.net/json/?callback={callback}",isScript:!0,callback:function(e,t){try{var i=JSON.parse(t);return i.error?o(i):{code:i.country_code}}catch(n){return o({error:"Invalid response ("+n+")"})}}}},ipinfo:function(){return{url:"//ipinfo.io",headers:["Accept: application/json"],callback:function(e,t){try{var i=JSON.parse(t);return i.error?o(i):{code:i.country}}catch(n){return o({error:"Invalid response ("+n+")"})}}}},ipinfodb:function(e){return{url:"//api.ipinfodb.com/v3/ip-country/?key={api_key}&format=json&callback={callback}",isScript:!0,callback:function(e,t){try{var i=JSON.parse(t);return"ERROR"==i.statusCode?o({error:i.statusMessage}):{code:i.countryCode}}catch(n){return o({error:"Invalid response ("+n+")"})}}}},maxmind:function(){return{url:"//js.maxmind.com/js/apis/geoip2/v2.1/geoip2.js",isScript:!0,callback:function(e){return window.geoip2?void geoip2.country(function(t){try{e({code:t.country.iso_code})}catch(i){e(o(i))}},function(t){e(o(t))}):void e(new Error("Unexpected response format. The downloaded script should have exported `geoip2` to the global scope"))}}}}};return e.prototype.getNextService=function(){var e;do e=this.getServiceByIdx(++this.currentServiceIndex);while(this.currentServiceIndex<this.options.services.length&&!e);return e},e.prototype.getServiceByIdx=function(e){var i=this.options.services[e];if("function"==typeof i){var n=i();return n.name&&t.deepExtend(n,this.options.serviceDefinitions[n.name](n)),n}return"string"==typeof i?this.options.serviceDefinitions[i]():t.isPlainObject(i)?this.options.serviceDefinitions[i.name](i):null},e.prototype.locate=function(e,t){var i=this.getNextService();return i?(this.callbackComplete=e,this.callbackError=t,void this.runService(i,this.runNextServiceOnError.bind(this))):void t(new Error("No services to run"))},e.prototype.setupUrl=function(e){var t=this.getCurrentServiceOpts();return e.url.replace(/\{(.*?)\}/g,function(i,n){if("callback"===n){var o="callback"+Date.now();return window[o]=function(t){e.__JSONP_DATA=JSON.stringify(t)},o}if(n in t.interpolateUrl)return t.interpolateUrl[n]})},e.prototype.runService=function(e,t){var o=this;if(e&&e.url&&e.callback){var s=e.isScript?i:n,r=this.setupUrl(e);s(r,function(i){var n=i?i.responseText:"";e.__JSONP_DATA&&(n=e.__JSONP_DATA,delete e.__JSONP_DATA),o.runServiceCallback.call(o,t,e,n)},this.options.timeout,e.data,e.headers)}},e.prototype.runServiceCallback=function(e,t,i){var n=this,o=function(t){s||n.onServiceResult.call(n,e,t)},s=t.callback(o,i);s&&this.onServiceResult.call(this,e,s)},e.prototype.onServiceResult=function(e,t){t instanceof Error||t&&t.error?e.call(this,t,null):e.call(this,null,t)},e.prototype.runNextServiceOnError=function(e,t){if(e){this.logError(e);var i=this.getNextService();i?this.runService(i,this.runNextServiceOnError.bind(this)):this.completeService.call(this,this.callbackError,new Error("All services failed"))}else this.completeService.call(this,this.callbackComplete,t)},e.prototype.getCurrentServiceOpts=function(){var e=this.options.services[this.currentServiceIndex];return"string"==typeof e?{name:e}:"function"==typeof e?e():t.isPlainObject(e)?e:{}},e.prototype.completeService=function(e,t){this.currentServiceIndex=-1,e&&e(t)},e.prototype.logError=function(e){var t=this.currentServiceIndex,i=this.getServiceByIdx(t);console.error("The service["+t+"] ("+i.url+") responded with the following error",e)},e}(),e.Law=function(){function e(e){this.initialise.apply(this,arguments)}var i={regionalLaw:!0,hasLaw:["AT","BE","BG","HR","CZ","CY","DK","EE","FI","FR","DE","EL","HU","IE","IT","LV","LT","LU","MT","NL","PL","PT","SK","SI","ES","SE","GB","UK"],revokable:["HR","CY","DK","EE","FR","DE","LV","LT","NL","PT","ES"],explicitAction:["HR","IT","ES"]};return e.prototype.initialise=function(e){t.deepExtend(this.options={},i),t.isPlainObject(e)&&t.deepExtend(this.options,e)},e.prototype.get=function(e){var t=this.options;return{hasLaw:t.hasLaw.indexOf(e)>=0,revokable:t.revokable.indexOf(e)>=0,explicitAction:t.explicitAction.indexOf(e)>=0}},e.prototype.applyLaw=function(e,t){var i=this.get(t);return i.hasLaw||(e.enabled=!1),this.options.regionalLaw&&(i.revokable&&(e.revokable=!0),i.explicitAction&&(e.dismissOnScroll=!1,e.dismissOnTimeout=!1)),e},e}(),e.initialise=function(t,i,n){var o=new e.Law(t.law);i||(i=function(){}),n||(n=function(){}),e.getCountryCode(t,function(n){delete t.law,delete t.location,n.code&&(t=o.applyLaw(t,n.code)),i(new e.Popup(t))},function(i){delete t.law,delete t.location,n(i,new e.Popup(t))})},e.getCountryCode=function(t,i,n){if(t.law&&t.law.countryCode)return void i({code:t.law.countryCode});if(t.location){var o=new e.Location(t.location);return void o.locate(function(e){i(e||{})},n)}i({})},e.utils=t,e.hasInitialised=!0,window.cookieconsent=e}}(window.cookieconsent||{});
\ No newline at end of file
--- /dev/null
+++ b/assets/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ *  Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome
+ *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}
\ No newline at end of file
--- /dev/null
+++ b/assets/fonts/FontAwesome.otf
@@ -0,0 +1,2106 @@
+OTTO 	   CFF L   OS/22zR      `cmap!wO    headHI      6hhea
+Z      $hmtx  l  	maxpgP       name&x  `  post             g(_<      Q     K	                 	 	               Z  P g   \   3   3  s                              pyrs @                                     /          /        :        /        Q        /       Q c              	 
+                   	   ^   	  [  	  q  	  .  	  [  	  $  	  [  	    	  s  	 	   	  *  	  <Copyright Dave Gandy 2015. All rights reserved.FontAwesomepyrs: FontAwesome: 2012Version 4.4.0 2015Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeDave Gandyhttp://fontawesome.iohttp://fontawesome.io/license/ C o p y r i g h t   D a v e   G a n d y   2 0 1 5 .   A l l   r i g h t s   r e s e r v e d . F o n t A w e s o m e R e g u l a r p y r s :   F o n t A w e s o m e :   2 0 1 2 V e r s i o n   4 . 4 . 0   2 0 1 5 P l e a s e   r e f e r   t o   t h e   C o p y r i g h t   s e c t i o n   f o r   t h e   f o n t   t r a d e m a r k   a t t r i b u t i o n   n o t i c e s . F o r t   A w e s o m e D a v e   G a n d y h t t p : / / f o n t a w e s o m e . i o h t t p : / / f o n t a w e s o m e . i o / l i c e n s e /         "          "                                                                                                                                                                         
+	                                                                                   l @  ,       !"""`>N^fin~'(.>N^n~>N^n~          !"""` !@P`gjp  ()0@P`p !@P`p   \QA0ޕR

+	       j                           R                                                                                  p   v    _                         ]                             y n                       2                           @                                                                                              z                    Z                                @    5 5        
                                   Z  Z          @                                                                    ,  _                 @                                                       f                                @                    @                        (                                      @            @      @        -  
 M M - 
 M M                  @                                 @  @ 
 -                 b           
                                                5                                           -            8                                   @                  D           @                   ,              *     @                                                 	     m  o                     )                 @    @   	                                	                                   '                      D     9                 >                              d  U     *       q	   	   	   	   	   	                                             	                                                           	                                                                                        R	      	   	   	   	   	            	         	   	      	                                                 @   	     e     	                !     	                         %                 R                                                                      FontAwesome C uvv	  U6 U6+T+| u\       " , 0 4 < > E G M T \ _ e h m q y }                  #)4>HT_lp{
+'4=GRYfoy
&,39COVcoz"/5;FPUZes}&+16<EOW_hmqv|)04=DPX\aju(,26GYhy%16;>EMUckox				$	5	G	V	g	l	p	v													
+
+
+
+
+&
+*
+-
+0
+3
+6
+9
+<
+?
+B
+F
+O
+_
+c
+u
+
+
+
+
+
+
+
+
+
+
+
+
+ &5BQafmty !%)-159=AHLPTX\`dhlptx|






%
,
3
7
;
?
C
G
K
O
V
Z
^
b
f
j
n
r
v
z
~






























	
!%)-159=AEJNRVZ^bfjnrvz~
+"&*.26:>BFJNRVZ^bfjnrvz~%0glassmusicsearchenvelopeheartstarstar_emptyuserfilmth_largethth_listokremovezoom_inzoom_outoffsignalcogtrashhomefile_alttimeroaddownload_altdownloaduploadinboxplay_circlerepeatrefreshlist_altlockflagheadphonesvolume_offvolume_downvolume_upqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalictext_heighttext_widthalign_leftalign_centeralign_rightalign_justifylistindent_leftindent_rightfacetime_videopicturepencilmap_markeradjusttinteditsharecheckmovestep_backwardfast_backwardbackwardplaypausestopforwardfast_forwardstep_forwardejectchevron_leftchevron_rightplus_signminus_signremove_signok_signquestion_signinfo_signscreenshotremove_circleok_circleban_circlearrow_leftarrow_rightarrow_uparrow_downshare_altresize_fullresize_smallexclamation_signgiftleaffireeye_openeye_closewarning_signplanecalendarrandomcommentmagnetchevron_upchevron_downretweetshopping_cartfolder_closefolder_openresize_verticalresize_horizontalbar_charttwitter_signfacebook_signcamera_retrokeycogscommentsthumbs_up_altthumbs_down_altstar_halfheart_emptysignoutlinkedin_signpushpinexternal_linksignintrophygithub_signupload_altlemonphonecheck_emptybookmark_emptyphone_signtwitterfacebookgithubunlockcredit_cardrsshddbullhornbellcertificatehand_righthand_lefthand_uphand_downcircle_arrow_leftcircle_arrow_rightcircle_arrow_upcircle_arrow_downglobewrenchtasksfilterbriefcasefullscreennotequalinfinitylessequalgrouplinkcloudbeakercutcopypaper_clipsavesign_blankreorderulolstrikethroughunderlinetablemagictruckpinterestpinterest_signgoogle_plus_signgoogle_plusmoneycaret_downcaret_upcaret_leftcaret_rightcolumnssortsort_downsort_upenvelope_altlinkedinundolegaldashboardcomment_altcomments_altboltsitemapumbrellapastelight_bulbexchangecloud_downloadcloud_uploaduser_mdstethoscopesuitcasebell_altcoffeefoodfile_text_altbuildinghospitalambulancemedkitfighter_jetbeerh_signf0fedouble_angle_leftdouble_angle_rightdouble_angle_updouble_angle_downangle_leftangle_rightangle_upangle_downdesktoplaptoptabletmobile_phonecircle_blankquote_leftquote_rightspinnercirclereplygithub_altfolder_close_altfolder_open_altexpand_altcollapse_altsmilefrownmehgamepadkeyboardflag_altflag_checkeredterminalcodereply_allstar_half_emptylocation_arrowcropcode_forkunlink_279exclamationsuperscriptsubscript_283puzzle_piecemicrophonemicrophone_offshieldcalendar_emptyfire_extinguisherrocketmaxcdnchevron_sign_leftchevron_sign_rightchevron_sign_upchevron_sign_downhtml5css3anchorunlock_altbullseyeellipsis_horizontalellipsis_vertical_303play_signticketminus_sign_altcheck_minuslevel_uplevel_downcheck_signedit_sign_312share_signcompasscollapsecollapse_top_317eurgbpusdinrjpyrubkrwbtcfilefile_textsort_by_alphabet_329sort_by_attributessort_by_attributes_altsort_by_ordersort_by_order_alt_334_335youtube_signyoutubexingxing_signyoutube_playdropboxstackexchangeinstagramflickradnf171bitbucket_signtumblrtumblr_signlong_arrow_downlong_arrow_uplong_arrow_leftlong_arrow_rightapplewindowsandroidlinuxdribbleskypefoursquaretrellofemalemalegittipsun_366archivebugvkweiborenren_372stack_exchange_374arrow_circle_alt_left_376dot_circle_alt_378vimeo_square_380plus_square_o_382_383_384_385_386_387_388_389uniF1A0f1a1_392_393f1a4_395_396_397_398_399_400f1ab_402_403_404uniF1B1_406_407_408_409_410_411_412_413_414_415_416_417_418_419uniF1C0uniF1C1_422_423_424_425_426_427_428_429_430_431_432_433_434uniF1D0uniF1D1uniF1D2_438_439uniF1D5uniF1D6uniF1D7_443_444_445_446_447_448_449uniF1E0_451_452_453_454_455_456_457_458_459_460_461_462_463_464uniF1F0_466_467f1f3_469_470_471_472_473_474_475_476f1fc_478_479_480_481_482_483_484_485_486_487_488_489_490_491_492_493_494f210_496f212_498_499_500_501_502_503_504_505_506_507_508_509venus_511_512_513_514_515_516_517_518_519_520_521_522_523_524_525_526_527_528_529_530_531_532_533_534_535_536_537_538_539_540_541_542_543_544_545_546_547_548_549_550_551_552_553_554_555_556_557_558_559_560_561_562_563_564_565_566_567_568_569f260f261_572f263_574_575_576_577_578_579_580_581_582_583_584_585_586_587_588_589_590_591_592_593_594_595_596_597_598f27euniF280uniF281_602_603_604uniF285uniF286_607_608_609_610_611_612_613_614Copyright Dave Gandy 2015. All rights reserved.FontAwesome  
+  $ ( =     $*.48<DHL{!'+9>`g
"&.26;?DKjs
isw$7=FNUzRW^ejquy~	4<DNY^ny
+P[`eisv{			%	<	@	G	S	l	t	{					
+
+
+
+
+
+!
+'
+M
+q
+v
+
+
+
+
+
+
+
+
+
+ 	-LUu~
+(:K\ejqy




#
<
U
Y
b
m
p
w
}













+$).DZkx}	
(,?RZclqv|#3AIOVZ`djrz$2@N\dmrz 
(-3>JRZ`fkpv{,!
+T
+
+<<BKH
+K\i
+"
R
t%
+l
+
+/@EXXE+y}}yKX=
++EXXE'3
+`T~~4gT@
+4
+f
+
+1
+TR
+@D=
+'
+*
+<<22
+T>
+:TF
+ya
+H
+T\=2
+@@u
+66%
+y}}yKy}}yTJ
+@
+K1
+@
+c;D
+N
+'
+T&F
+]]H}t	 "" 	hh
++
+Xy}N
+|zKz||zKz|K
+
+ff
+
+T
+TT|zeU#&
+|
+w
+R+
+hnnh*}yTy}}yT
+
+V`*#`V
+ EQ|z `
+F
+~k9
+9
+0hnDRRD~
+
+
+1
+TR
+5
+-
+
+T tzuxu[Brlmyz~ 5qsUaRD`hnnhhnnhy}}yKy}8
+
+TT
+TT{
+[
+;(=ZXWG/9;/_Mknmn9:YIƑP`q~d_iiii
+h@@hh@@hh@@h0:
+l
+.F/B[NPuc]T<Od}}|1B&2B
+9T
+i
+ԟ-
+.<
+YYffTE
+EQj
+v
+y}6nh
+Pj
+T-
+Tj}]t
+#EAS i^wvhvi^S AE]#W
+^TA$$EM
+$$V``VV`
+`Vm3'!%Ơ#xM'nqwdo^
+j
+]
+3C+
+]yots{tqT-
+Tc`
+4~~4`_`R`e9C/R&aҦ4A'")~41
+'
+T
+!5!'
+ftkv
+K:
+z;
+;
+{z
+d
+
+33z|:vl
+:u
+5!'
+.
+BQE0u
+.fM@
+jmq;fveKxvuztvRDffYYY
+ff4
+i8_dd_~~xzƅy@
+T
+T;
+Srj23CC3l
+t@kt
+f
+ \|\?Z Eԅc*y^H(ym|[ZZrwh_
+Nt
+
+
+~
+8CZ7)
+
+6
+9"TM5Ř{~~D;i
+ffPttBxwBD$$D
+8
+8
+8
+V``V
+
+YP
+>
+
+}yvKyx}zyzr^``^?_
+}D}}
+kK&
+^hnnhL
+);
+h@@hh@@hh@@h@
+T1
++yys
+pF
+88'}
+}t.+ݭG
+4
+1
+!
+ _
+
+
+-.
+n\n3/{V=@;~~~w~fz\J$9:lAT}yT5Tmm))mm)~w]]w~05
+
+HEYM
+@h!(
+!
+SZZA3
+3C~z{ Uf
	,,		,				,	-
+.
+hnnh\xcikvss]tRatyxx{Vv7+4%MYtk6~w~~p
+05
+xyots{tpOK+yyrrrry+t1()=
+@
+3<
+|
+T*
+5quuqqu;;uqQDntyt
+H
+t>
+r!5$
+arwwvyr/w__cp]44x]]9
+
+h
+&&{
+F BiD$$Dyy;6Tu|z<<<<`=db97TT_Ldknh
+
+˻WL
+ETO>
+}|AE##EE##E~w]ɽs
+o"7lz&6\
+gO
++
+<<y}|zfz{13DR$$-
+0/
+
+EQjb
+~++P,,
+z}XtxmihbW_):z{<
+T;zt*E##EtBh@s%$TɽYMqt{tsoy*10],y	B'!!V}jii`V']
+]6wkz||s}g+
+   hTz4X  \$"WTSZrsyy'&%t~*i
+
+]]       }            Yg    ,  0                1     x    e   q   Z   
+    	c 	 	 
+; 
+ 
+ B  P  
 
 
 
  j ^ a     i 4   a 8 d       T   k   8   b     9 [ d     & \   P   T   P     !F ! " "t " " " #o $ $ % % & 'G ' ( )e ) * *O * += + + ,9 ,{ , , -q - - . 0
+ 01 1 2K 2_ 2 3 3{ 3 4/ 4j 5 6 6d 7e 8	 8? 8i 8 9 9 :
+ := : ;W ; <` < = > ? @ A B2 B B C	 Gz G H! H\ H I/ I1 I3 I5 I K  Kg K Mv N N OZ Ob Ov O P Q S Sy T T U8 U V W X X  X' XJ Xi X X X X YK Y Y Z [_ [} [ \W \ ]m ] ^ _ _b _ `Z a aG a a bF b~ c' c d_ d eE e e e f& f9 fG fU fr f f f g  gc g g g h h h h i0 i j; j j j k& kp k l l m@ n n n n o} o p, p q q r> r r s1 t
 tS t u1 u9 u vo v v w& wa w w x5 y y4 y y y z* z {& {< {q { |+ |b | }* } } ~ ~Q ~ q   >  B U 3 u   4 i     h    7  `       
 b   N       4          v h  o  k      / w     B  *  k %   t  A  Y q    V  O  L  l B       X    Ā Ĺ ) ƿ C Ǫ   ɓ  ʥ 4   ͫ     l q 9 ) 	 X ִ  , : ة  q    ܃  g L ޵    (     K  
+  -       7 Z      <    c =   R `			j
+
+
}p<}abT|lF7D) c    !	![!"#$$v%&#&o''F'{''(*)3)+`,B-./019122p4+456%78e9 9:
+:;;<=>>*>x>>?(?@H@@A/ABB>CCCCC
+CCCCCCCCCCTt TT4d
+4  
+z..ȮhKh<Nh--N<vhNKhN<h..Nhv<NNvȮ-m-hڠvNl
+
+44T
+44V``VTS44T?
+44K
+Tyuuyyuuyy?j`,4G yu~8գYSKkj>h3c#
^uiƭRl
+
+@.
+?
+FMffMZnnw
+
+
+d
+ `Vc~ofa[
+Y
+ T?
+
+@
+suw#$L>$#69JX"!!`V+/EE+V1RFS
+_r@3CC3U
+f
+5
+p] 
ksu[ztfU& q9
[[9:QQ:Mqksu[ztfU&l
+vVlXXlVv6 *33 6q
+)
+Ki
+l
+
+i4Y@
+ zzzzf
+Q
+T0
+Q
+`VV``VTV`ԛ
+
+T0
+f
+Q
+T0
+
+
+TV``VT
+ Q
+
+
+TV``VT
+TVTV``VT
+
^y
+$%
+"
+hhjyy
+
+"
+"
+ ttBKH
+ttH
+K\tti
+tt
+?
+ H
+K\i
+?
+a
+tW&S:aR`S:a))6
+z6)õ`a;R`W&tA
+;;QEEQQEEQ Q
+
+
+
+
+
+T
+
+T
+
+
+@
+h
+k
+zK}zaEV" nmloL{yry}{{OJNll~n|i&js^^[{m~mkNo|y|rz{Kpijki\f_i]QM[!|Lz~rǑ̒Ȫ 'fgiM
+
+
+([po
+pHH4g
+ l
+nnt-
+v
+.s~oJ,W`aGahc~v~AHH
+< 
+4t4tttZ
+64$){||||
+N
+g|5pp
+Ty~}y:y~T
+ppur5|gccn_Tz}
+
+y}}zT 
+
+Tdgf[wXX[fe
+?
+
tqTTTTTTv
+
+T~~/7
+v
+('T
+T7
+h
+,T,ThXhYm}}chhcqj}}iVgvL
+wxrwwvttv$d
+t
+!SY;;A
+ylD&)'C3
+Y4T[
+
+t}
+|}zcesd,.9/F-0T5
+T"Q>W"SX5z|[,9FZ3{
+T[
+i
+#""T
+
+
+
+@
+ԪG@3CC3U
+TTT
+T+
+kT^^^^Tkth]bt\i
+K^_=1lno1"-SKq~n}s{x}zsz6
+;3n L T
+T/WW/!(ZMj:kA
+TK+k+8V=_GxɁHKxMG_8+
+MddN-hnog?

?go 
+dN-hnog?

?go_QP
+ox}yCQ(Csyrp}t{xo_PQ_K
+n{}|zx8
S``*S8
qxozo||{}s}|{n6
+
K
+vvvu'j
+
+ʪʪꪫʪ骫kihvvvijiʌ
+oz
+1z
+q
+w
+z
+z
+z
+ 1{g1{{{{Q
+kllo ʀ
+oijivvviijn
+)n
+/
+_^X*DtcX_^sjii}jttjjhs! g|vtywxog`vf/TFw.qra\zzzaM{tswxyzzVc,sj|wut{tv\h2p]yx}xzuxWi:mY{pvzs~{sww}e_^#:/r8
+s
+ 4S4K4"Kme,,eBV4
+K"44"4\t4T?
+4t
+"T33333333T4tXr=EE=UIrXtv
+l
+O
+T,
+ ie%/,xxx(((#Ɏ	wR'VbgfVpoqqq{\/j}}Yh^?DFG@EatV@ha %-n<scsŔO5*VJM(0x[[_}~%;AHW{'Qbgfg
FIGf=R!G v^]^z8'n\PuH#hPMqJK{-ЊxġMMN[ĐơϦԖУ!!!x$ǁΓmr;ni~GhftnOlFKwz6;p6p_ph6hpo;_}oh6h6}_yǏ\|}Cy	^^^LuZ
+q4I
+eptcCDC
+yǐ]|zb||}3mrS
+667W,
"4I
+~yv}u
+] y]hvp|zwwzv{y{ |phy
+ :
+
+.
+ :
+d
+.
+:
+[
+y
+:
+.r
+:
+[
+y0 :
+
+.0 :
+d
+.0:
+[
+yE
+E
+E
+t
+
+ @
+
+f
+tX>l
+TX
+f
+T1
+H
+ke
+tX
+{tz{~'&9*
+TT&
+T|
+:''~)T>4444Tl
+
+|z@
+Y
+
+4ka@@
+ j
+D~~UT44/
+~sjiij}st:944::!k
+CNLT_p tR!u
+@MϠHGwwsr@umXXj:bkkcv`~:jX;Y;l-&@yyE
+iS+,,||~KK$
+fccL+4444400f,,fMff// gl
+}{|y~wj$
+|z)"L
+
+{zt{tqT4 7\3ulz* p4Tqtv l
+KK$
+fccL{kkYkkkYkkkkYkBBk
+
+{
+
+
++
+u
+0vgs
+<
+UZ<
+
+Z
+ SUZ<
+ZZ
+ZZrZ
+hlvlr|h@h|h
+d
+@^
+F
+^
+[
+h
+d
+@ Z;ZZ
+ZZrwhZd
+Z;Z@;}rrwS
+rZZ}
+

+u
+.
+::}
+zz
+zzr::
+'
+zz}
+::
+
+::
+zzC
+bu
+
+[nh
+!C
+hnn
+!h
+}2zz11z
+IIII{zzz1IIII
+IIII1zzz{IIII{zv!
+
+zz{z
+vv,+
+1zz6h
+4y}}yTcTN
+T4,#Q?`\pnZtҫȧPKgjzx}wy\O~#7@TKT!h
+4@
+T1
+4R
++1
+4R
+;D44{44!`$$`$`$l
+$$v$`$:
+}
+#Zk==k##kZ==Zk#:
+#k==kZ#v#k==k#[
+]&&&&&&
+
+&&kK$g
+%}
+''}
+%%
+
+::!8$ %56&{SjjQh[=<<=>a>a
+^CT}s@skiij}sst:
+jt x
+}sTӸ~ssjiik}ss@@stjtTC^OG
+GOTs:
+js@t
+ K/
+sjiij~sts:
+ks@sTC^ǸTs KT/
+@sjiij}ttTTtjiij}tsA@s:
+jt t !j _
+
+t,Qa! KtkvqCth
+tԃh
+
+<<<a<-!y}|zTy|RT|y.}|yMx|zp4HhnzhThnhTThS\V`Zy~5V``VV5`VOL'HMoZd99dMH''G
+L+&4?
+4:f
+
+/J7I[^_[Z_~}yhn{x(nhZf7p\XTHaG-whhiwVQZ:#vz]l`L{l{,+\^˒l
+4BH
+K\@i
+CN.ETiCkhTT$?LL?H
+]]
+vc0;'dquuq--*LaaLvtrrtvLa`LT$]D'#5H
+#7quuq-.*Sv-yU*PNO_Z~wrsrswH7*V3ziU{Qg
eg
SA:NT~=L=&0ErAuXf
+5y}|
+y}RT|yR
+~|yMx|z]pkou`\\`qbuud[ddsd
+uz``K4K++44-3V+*QQe
+듔VV땓4L554K ˫44˫j
+_`44_Tt`Tt`Tt_44
+K
+Gt4`_t
+K
+GpK
+K
+
+Wl
+f
+."&Ft5t+

+K

Qc-b.T5MKTz|
+sRrQnS SL0t5tĤŨ Ty}
+%%_Ib	\;COLD|yz|rs{A0%h
+d
+TKi``iK,QQ,^5
+-
+.^5
+-
+[
+Larzy}
+zyrrbr:9r
+:9Llr:9}
+}
+:9rrbrzy
+zy)
+4TTF
+yxxy}||F
+T44rdTi
+4^T44fTH
+4TTA||}  QEEQQEEQQEEQQEEQ@^OH
+`E{l^@lF
+
+, 4B
+4
+&
+)WWXg3
+UGQ {y|ss^
+ B
+
+ /T_
+
+{
+u
+0[
+ 
+
+ 
+
+
+2o`gfbnh./>p+>|Ri/8Crb{Zja_qV Pi44T)
+V``V|
+N
+tY
+d
+
+
+T
+f
+ ` d
+d
+
+TT'
+noqqon'
+!5((5!Tft//tq:v++n+*mm*+n33"
+äyppv-)k
+ERQDEQQEERQDEQQE9},~
+ q
+2srqt-}}N}}~ZTYprr~n
pwefc~rrq/s~|~M}~,soppndmfnen
+ s
+-}N1kmo/C
+C
+f
+l
+yQ
+n6$7dI.3Tfo1\s\k<^

+U/Sk?Ÿj-@	
++6	7
+Dɝ·lZ'#ik}ts')2OKebh`i_mdG1dq`d
+m]a"#
+e
G.3GNOH	6
+	t@K̬-*osr^?<k篞
+Y	xxytR]ssvkc\k}\vs򺊧1fzk~rvdO J.eY$n:mo`d
+q1d_`cJl2)t}ǏymD
+	f
+@KM>M>KR4)<5Mnɿ<5)4RP
+p]5 dr3CT~ϧXԙT&
+~ϧ4
+{{{J{J IYU:=YϿڼWG j8Ke`bz|vw{	̋{&,(i"z 4t4|
+TwN
+T480QEEQQEEQ086
+(y{wA[
+il
+$
+T/TL^ADD  EM
+  DDsl
+
+,^GofC3T~
+^Go
+ ^!Y1/)Yb1+
+pԶ
+V``V
+Rzf|Xm}[YKKkK+++K+K&6+++k˙̚zfR_L<L aNi`ʆ ŕXP,!
+t\
+r[t
+ 
+
+˷?ApDU88Dp?
+?
+\`
+TTz{{z~TTTlTc!8ZZ.n82Y\uZHm{(r^-Ʒ֫Ϧ[{wx^^]Up[c\ˀtbdee	$fb%<l6fGWG49<:]ua\H,2n{l
+ZwRQSqklN2IUphsJ&J}rIm{jlkāuvgE{|jZvkSr^kPxOH.76NPT>aa>"ipuleǞëѯtC3$
+4,g3&
+
+t&;*226;*s
+
+
+qXsIm[FHNMo;otpлͩ&oxtt_Jdwry0Ayu{&Ay  (TQrLyJγʣMfEpB}P7.G$%Frrs3Xo[{TO(QVY`1(mpnnvww."4X+prq/#>VK?ʹķSp. v/nQ1h%
+p%\
+8rwsp TTT]]S
+T4V+T
+-
+[
+)
+
+\@@
+@GttZ
+ Y
+
+ T>zi.],++,]i{{}zyjpnjry''{{~{y#joicciq#44J
+J
+4
+@
+ԪG2t1v~z1vF4YtHAAHZEtYrtpԊ
+d
+4TttgTEuFF6!1=۴n_F(
+RD\\T$4
+.G^SSG^J(@twT3fM
+V``V}~d3fTw@t(EQT]Th
+`wrPNxyprNV[Pwrqqyxyprrwwr[PNrpyxxyprNP[rwwrrpyxyprrwP[VNrpyxNPrw}PNVVNPxi4.TNl
+FPPFs\k>\V?Ckk++JL7
+
+=3`?.Qm\ibgbjnG5[`d
+fuel#
+= 	 i.Gc4`C>[B
+atĹixFP+֫ঽtttuV]]B1f
+[GngimQ`?34=_`b
+
+	 	 =acf}|}KKYS#L
+
+KV?Ck1B]]Vvuut+PFxiԹta
?MQYKK}|}fca= 	 	
+
+b`_=43?`QmigجnG[h
+ʰl
+ZB
+xxyatRt]ssvikcx\j_qFPPFGOLJ++kkC>[+
+hnF
+Ԯnhkfuff
+`[5Gjnbgbi\m.Q?`3<
+	
+ 	 =؉ˠSL@
+C
+QQ{z@e00-
+0 
+{zz{QQM!
+00LQQk
+QQ
+0{z%
+
+
+00{
+QQbQQL 
+{z
+
+00k
+QQc
+QQ 
+{zE݂v
+<<<a<-~|iyzr|x|~t}uz~}tyzrjhv~|{|~oz|r}spwhjhy~|}}|x}owuxzp}o~vqyv}}{oy~tcuyuu~xr}|~gwɛ|cx||vt|$|~d@|~vrys~@uw}{~||}}xzutl@|~|rk||}y~z{|}{x|sv~vzyzzy7}r~ww/*Gs i_
+8"W==s:
+jt x
+>>Gww|&xjUt=N,BQ?F
+;
+
+{tq zu
+~z
+t
+44
+44tU
+t
+a h
+w$$Tj
+Tqt{stoy$$$$tqT5
+T6
+$$jj$$T.T
+$$"Wn|`_]#v:[vVi\\iVv6*446Y
+Tq
+u܎v#6]_`uuu0n1W@^;Y
+ TT`4S2S@zyrrrrybcyjdK
+ djyddysqSUmtvwjoXV``VXojvwtnrry@dd5
+ybcyrrUnTddUA?<AkST3«nUbcUB>?BnUU'&UVlA?>CTddUmի3STk@< ?BUbcTmԨ'&"J,>[KQtd_O>Kj}|},D!/G
+ #
+
+#@*!!@i##flA\3T3T
+
+K"~xF͇F6)-1?pWSRWn?=%(EUmþBB_XS-(mU6EF(%=?VXp򎬇F˞y\&sqb]NEN ewd G&NS6}dNDwO0]bqNñ џsSe& GF\}w~vt:4+q4CKtېE,-
+4dYztdV4VAlff,,fflAV4ST?
+Vi?fflAV4K
+444K
+4|+fLdUS55TTd..Ġ
+..||eWT6LL6UVe[o!"m\à
+B)%h;=h&)CMe004Vԙ
+4
+4S?
+4{}~bx4
+T
+ԪTGkmeeBV4@?
+h
+d
+ h
+d
+Trrrf
+>l
+4B
+4F>l
+4B
+4FT
+4Fh	$@7_H,`djXg]SˈScfzhebpR3^v"Om(;.?GdFjPyi7voMyyy4
+@ (!?:::  (l
+
+T@bTz|@>f
+@4
+/{pkgGR[".__ušȟmNgG&߅ȂAP_ATeAa6226^%OLJnpsosxZWS]{`lcmcbnXzyY\a\^cbhnnpszf%_whY+W~ cv͉ΒИhv9!݉}t{D$<T;JYYbll|ԡǩ+}yLJGa75t|m`PvG#?}Zhzdqcwuvltlsj{hxPKGQPObktl{·}yُˌ|na`ZUTSR{S-deh}~~3@
+@
+; 4m
+
+y}}yy}T}yT
+
+1t
+@
+ eO  .ZZ{
+{zz{ZZ
+ROXOXXOXOXXXr6v2
+@
+WW2x@
+^5
+T4g[wrrZZTT<D^Aٕ]]ف))P%
+Q̙rԋѭVLE^"t*9xI&Oq=b}%BVH\fzw}i~w{z Y
+nL Uiw<u8=q^Ei{PjPn]vӀ
+((NKsӋЬWMF_#t+:xI$Mo;`z$?TH]f{x}i~x{z!YlJSfu:s9>p_Civ9U:j\ik==T6N#-j^AT36dC@,*ݶ8Q_39*w:8XkEK[=.
=)Ҹưչtz}|}(JC9_4K4'KT,T"
+T(
+ N;Nh[NE"sxt
+.6-f. 8CW8
+orkOb.QE-]]d Md*SkC
+t&
+ŧH(PSb_ghPsY6gWb7E9@7M( m"mh hooi )^
+u{r|sv>(T+J~ff~JJ~ff~Jv
+
+O
+^ 5
+-
+ [
+
+o
+
+mTT{zTTs_
+TT
+TT c
+4
+
+g@@
+
+To
+m
+To
+
+mmjingr;<7
+M7#?#77<:fimU
+B4@ V7)0[/ 1 /^//1 0 #sEAA*,?m6"mF=(G`$.ƣ0
+a
+;;YS<!
+/
+sjiel{ppmoy,,yrrUg[giyxtq]um~~~~mu]qtyxgi[gUrry,,"
+omu
+pp{leijt t !
+vL
+TTL
+@u^9v:p%"M$%MڑhiL
+L
+TTL
+T&&&&@;$yz%:@
+%%
+iT
+DddDWXYV_lw}v~v*AdDQ
+yo6$7n	^~ )?cwrvy~x]͈}|*YvvTF 
++TT?
+VԹ
+TT+V``VS?
+V+TT+
+?
+V+TT+
+?
+ 
+XvvuuvvHNNHHN>
++
+				1j
+j/V
+qV
+qeU>k.)$4S4
+T
+˪TGK4ime,,~V4T?
+#x:4tT.H
+pFF4KqHaZxuuvwtD6O'xODwuxaq\_II_\DD$2??  nzykjstz{ztsjmy}z{JlQeűťž̛{yn׭|zT|WT`
+t4`Tz|
+"
+tFTGtDts"
+4z}|yt
+T
+ty}s
+tT4T>
+
+F
+N[cG=B^60
+QEEQQE
+]uI7#e  #7upjj_pB:'
+!5ܾئ_Wc[7+447q
+
+5!'
+7Ep>
+m;4U>
+ua[w
+RҢ&>
+&
+RD[apdu茆+
+U;4mph]@
+@h֦tFt
+
+K=t
+ B
+K 
+$4
+(@twT3fM
+V``V}~d3fTw@t(EQT]T)T'
+K5!
+O
+h@@h5
+t{
+T
+
+.4\
+44\
+4:Bpmצ^ 
+\tEQ
+< 
+44K&T/T+ttT4
+T/T4
+T/
+t#"KT|zKz||zKz|GT|zKz||zKz||zKz||zKz|3
+F,d
+ @^ 5
+-
+
+[
+?t#"3
+" >,kST?
+
+K
++
+K
+ԪG+* G^U VT
+^ -
+
+[
+)j
+L
+WWl2L
+4
+
+T05
+4hZwrrlZZrrwZh4
+!"""T[
+4^
+4̗
+4
+
+Tt
+k=t4
+4 B
+k 
+)tK
++4Kk44Tt+kkTkTs
+TskkTkTt44Kk4
+Ftˋ |g>DRTT˫kTTktkKh@@hTTi
+
+
+Tbbc
+c
+4 
+
+C
+b
+[M Z4
+}]
+
+}]
+ZxxD
+tI
+I
+D
+4IIt]
+
+}YYY
+D
+I
+D
+I) 
+Y
+
+|zY3C4KGfF
+.K
+)4ԏ
+TgTkFGT
+Ԃ
+`t4+V`@Ӷ+7_
+4
+Ԃ
+TG
+TC3t
+
+d_gg_
+d4
+
+TGTT7EQ7
+ ԕ
+
+ Tu
+NT@"RDEQRDEQb@TT@QE`EQXx
+~
+3C 
+@T5!'
+1(b
+'&G
+h
+ !*j 4a,t{ztC8qbbb{y{x{K  t44t)
+)
+4\<-7ʗ7-tD&c+zi0&H.0,-##s&&2iGz@@RQT+c&&t
+ ^
+d
+tV``V
+V`T*
+TTTB
+4
+&
+)^
+|~aiEjVulѬo70 XDQ*
+47mGGT4!
+
+&
+naxjigxi j(C(jgjixhi5' ==' 5G7
+n5Y' ==' 5YihC ix7
+T^
+.T7)TT@
+TTp
+TTCR
+TT<
+;TTD
+KL
+M
+Cyy
+p<
+ZE
+)j
+?p
+G
+
+t+t
+
+G
+4
+  +
+
+G
+
+H G
+
+ G
+
+G
+
+G
+
+`++t
+$g
+f
+`d
+g
+
+pjMPdioo '.<WN2XVuh
+P
+p$]UM'T6"W
+NQ(YcjMPimpP~~~+r+UQtb3L?0X3>X@Qh
+ @P
+ s]OT4
+T)&Yffff
+zM{yz	zyz	%tJjZ!!
+!"и$yf+/YkzX,Hn|}1d Z\I<PW3֩ÓWW}Ou[}zyyy}p~u[BO}a` 5_qUU5yw{z q~}mnnwmr
+ 4Ot~w~tW
+tt=tt
+tt
+TTXV``VV`
+`V5!X'
+DMje!_NPZ|UzXrĬX5!'
+DMjRjdMD dR쿣3>ێĬ TTTpK
+=b$tO)
+36mUzxwyysqggKgywxzpTmӨ'&h~zUB>>CnUU'&TUmC>>CTz~p5
+y
7O)
+36$+=
+}
+K6
+Khnnh
+ T-
+[
+Pt-
+
+tohhonhhn
+S3@
+8<
+;|#&%6Nkj3hW@x}pU3@
+@8<
+Y;|$&%6Nli3hWy|p"9Iv]Yfh{osjeV]]nw uKJQT*FhltnݖݘƎqDA5%!*QTFhulstnl_a99:P~݀*Pk9okթ.
+
+]]
+
+DjD 
+D$$DB
+?CI9..9~`n
+
+S
+AENB^
+ 
+T% 7;L9\XpqTT^5
+9$9 j
+#
+4@_
+T+}~|
+~
+knr]J'V{ke{ohc-#
+/&|~T+ `t{yS;RQPIODwt{K6Ktqn;<-y
+y
+=vvkhF@8h
+!!0
+ZZ
+ZZ0%
+
+!!h
+a!0
+%
+
+0ZZ
+!!0
+0
+%
+ZZ0ZZ
+!!0
+ZZ
+00%
+X!?6IY(uC XVYx\b66
+PeSGQGz5:5'DN5(TKKT( T _
+4O~~'1
A3ZpT2
+T7׷[v
+,9_7XT5
+
+ /
+TZA1
~P'
+~e
+Q1

Q1.]
+TTt
+/
+F
+]]9
+kV
+Y
+CyyE
+66%
+U
+TU
+TU
+U
+TU
+TU
+sL
+-w|a99az~zzw|33z}zz99S h
+
+<<<a<-wvttvw@+-
+
+s
+Z@@@@֋Y9ZYYY9Z@@@@Z݋ 
+
+C
+k
+M tO4
+6^
+C3,L9{sYsn{xput}T4T~T6Tt}4TTru|utpxnurT}ynnA0
+
+0gggg0%
+ T(@WWS+}}F簰ɋf,,fMff z
+q{ttz{j0
+%
+jxt~t 4G{zs{4O!mFNB9x*}}~5W]4x
+G ttTc#$
+yussu~uvqxTzTQJ
+y7}TxvvxzT}xqvu~J
+zTxqvu~ussuTTt@
+T1
+TR
+T}yedyDs4>$0K_|h)!<z35#N2)+&hekIbz|P諌2v#O6'
+I2
+TkG\L9xs,'
+&*b*&P[fdL"*
 & _DTz|}yHec$,Lt1HDU
+\+!W)E $z ~jCy}6Ch&5`O?vk}6T+z|% e@1+%&?nPDbQ](E5UW+M3T)3w'T<|#
+T6}ykאSS8x_uaz`{{sk=Vjb#&6$&@{_,1!T!1NH'
+	t'
+)&t
+t+&tT;6T
+T
+NHf
+@3uk1@:6zi
4OG%/쎔|~}.)|}~}*1~|4
+"C4
+d4}3;e:}38i1..`zJ1Z.cbb.jjlh8ʟgk&wl`lK`\..H̢W/&~kSڡ#ڨZDpA4Ih
+l,,}V``VS@?
+V`h
+,,}llp8V`V``VS@?
+tTT(/
+}+
+|?
+,
+(/1?
+,
+2
+}+
+|t(/O5P5PT5TP5kO56t(/4OT5T6TTO56TTO5@s2
+(/Ѕma@2
+(/d 4Tgnohgonh4
+5
+-
+.3#؋Gt
+`aMPQOddlli`g]_Q+fjoojhovuf \#ͥȅ֤ TnhgooghnF
+4
+b
+~)|mxrze`I3}y?z#\f LuOvhimohjoQ]`ldOQPMatGmqvin4^ːΆ̀ƏnX+}j{xtzj1HLzii|E;;]SHv|~}Iqzxcypst}qv5Hίp}Gq|z{t}ypjip~rx}xoddnyr~Wvuyi0izj60w7~Q[`R|R[~wߋƻő|ą`P805]A]|s|z|WW[
dm}yrxq~jiqy}~rxndImpr|rv| {H lDzك{цԨ_~q|||||f|mm|t^]Z'X"-Ibgiwknv v}(]jvgrxhklm[2+* mxfwj]Ynwwy{hsfy\\hqxAzireV$G4]t~%]~smn}ft]fcqyJ>LNMMNwK=KQx<r<Q؃vLNMMNLؓŞzGD!MLM.EZ
#xrh]^hzirxrdVCVdqiz0nwx}y0gs|rT 7yg}}~5T~~K}g|ut~$zmvs:ssA~Tz}xpMXlLy{q-gpLn}t"VOw( f
+
+uvxw~~vu#,lu=-rutturr->Cu)k,##,)CrrutturӠ,#ˬ&~'+' }~~}}
44W+W4
tl4}*UJ*d&?K&>G5#p)q
M)?
==BRippiip!~b^^jcjc~9?>99>?9elleBel9Ble9Bd 2  22  2 v  < <e
+		h
+&]&8t#4#4-_G_G!r 9*Hb=gh`̀,ް5-"MM/8(x,(90KǲіɕOTOm̀ցQ\Y5Yy{))+)jxYhmG{IUsV7=o{vu! z'f@o&d1caaPEb4"f|aunO鿦ɯ˱nno5.OB\WQĦdRۛ~-aOpbKI2C@lU[s^Yoc`̄ƃ ~ƒΑ~vD,@aD1"@3byЀѐl"k"rbsIr3p1o1]_qewG1('$:er)n'y*ԧӥؘؒ6;2]zt[uns PDcl|P~_q<}Nx0k<Nh
+pti"d-"`#69VѺDMV"TAK$ ~tW
+ t~~))~t 
+t tO t~򕃘t
+~~t =t~qqPV]]tסжihhMD;ZQuItI[nt]FEQZ-[+@@*e-8;@@4uvǹߤp7ZYCYCq5( >>>-r>->j7)1auabtavzyvvzyu:uzyvvzyvLR]]SBR]ĸB]Sx*.NZwR]ĹwwR]ĹwǼ|CNGCCG|pNC!C,313, q|]RS]^RBR]Ĺw$䔻kiᦿůI7Y=+kt}n~x?z}}}b;u{{~  YP
+K  S{TSm  {qiTAsFGKiwzw  o_ewkjZ ˒lshztu|Цy  u"5@ '\ϊ؊sqٱ  .&7e}|_g͗ 5|qD|unlaK]~d iqqquzw|wʎó^=~Şv}M,7QupzTS(pzKYN  GJ b/ѓcctup4K6gp1zy  yr7Y}{w\@  wxFis}txyoGqt
sp^)X)iz=J<I
+ԑyʂXjeˈ  𫐠{yM9<  IbquҏБZ=Z>Fdf|oL{1$+#~[G0`SQRne*wXjsIx[Ͽ^d7,vX9<DBcr~}\{zeugwTqtmqFXec_d 5dyq]ŉm]nr╠Ĩ  ԰= j<5x03%\QMG#K.<؃fff h8z_=K
8^@mK#2'(hU5hKQy%."/b7@:,M%sysvn}||,#/!
+@m_X-PuPª.MĲT2&&<_]AQS@QdXJ*13SsVQ~ys"k=OBmmYXX[J:3h@@h3:J[XXYm`
+K||vpusrdopdadomnno&{{xojph_hmnfArkRhg/QQIs7z6ݺͰHfH́b44TT@
+t1
+R
+t;4@
+t1
+R
+t;4
+
+tcMAAM[Pc|xxSw/F
+TMY4TTF
+/wp{K
+4
+TttT5!'
+4$dd$
+h
+~mpk`YyuݶSHkpf1H!xHH-Ho{H遏+HH+HH-}%I3U6RH!f_xxoriB?z<
+."to2|3A
+CˬThn2~}
+5
+T-
+l
+.^ u
+d
+[
+ @`^tAA
+}
+AAAA}
+
+AAI't
+t2F^wtpcsKcI>ZY
+deҦt.tE##E)o}}4u{zu\
O#nWvZh,lt:$4Zsj{rglb1XldvG'bQ^{yqa|x|{jjs}.Ӣѡ?IYKk.#4)sV
+1| XRf
+7n]Mw]^}ǟxwVo]
ytyywyB A'!3EMM!#] ([B4WtImnxWxWtIWȇ$rzӎlQ3J>Rq_(%vv==)G/H{uAR6=zkwlkkwllaelj{RI7
+A5ifsgffsh./gge0lF
+h
+miE#=[Z\Z#=EOiNQ@QyQ@QzE&}9ً܉{H[1N[GCJۋz"q*g2EKa"81&*a/rwxrrwT(v]*I0  3  30H4Tz|
+4$T|W2
+T
+4$
+T>
+~~TzwwvxT24JY
+7
+ dp~
+F47zw8,lr7RZ(x[ts[{+;f
+DK^Fxukrlqv}K ?(&PX+)#JU^mmmjgenyiYW»ëP7iSպԤÎ˒rSppoG.B%r tTtTO4)
+Zdz{
+
+IT4+.
+^
+tO*K+Z
+q
+
+^
+C3,L) 4՘ΖT˫KT]HAF-"K
+g_yz}>Q~{{~؉}zy_gK飳ܩn_ZZp_bn:vkbA*t%ndʋ̫44m4tbm++44kkLJJl.d |{|8S"1ÞH=|}}6TV5wSL<JI<{{|4"U4wTL;KI<{{|31VPwcSM;Nۛ00VPwcSM:Oܜ-7OdٛT89OdڛS;@ǠL9"e
+V``V
+V`Hzu|KRKjgůɣYPOdq2P2R2QreL]]]Le303aSZó^Un2oE`+s!jmdfJ\e܌X
+<bdaʵ֊یX
+!z2vԀ<rqo=w5d:y.hO6&&&&&&&&)k
+kkvkkkkkt
+ɲ~=`Uf6@IV`b1N <:M@xi]'8 Tt
+T'hnPelnhKleP;T
+elnh
+le	 PI{{{{{{Iy!~$~}}#M4m	eupb[^dtQETQEreĸ b$0Y	`	__	fdeggh1(', geffghaCN~WN;Nh[OE"iY@7M(7fWpb6E9	PSa_giOsZ
+ŧH(u.f. 7CX8
+~orkOb.QE-]]d Md*SkC
+
+-GlG}ff>TT=g}}RIcZYccYZccYZccYZc\pcdwywxRj.j.Rcoͭ}t qZbZZcbYZc\L
gSVIm
+D
+k.L.k?+llH\\HlZ釧鏼0K
+K
+kcthjz{{z7LvvK7isùĨwлQahaahhaai?Ul[Ĺ]SZ +)**MOvrqvvq 25 3
+qv6!Mr34  2oqv*
!)```NW{WM}|XLy R]^SS]TTVQ~ùù]SS]^SS]WQURTTl
+4''tTTttTTtT a`aa`aMk`|8aMakap`a9M<97Ba|8M97Ba|gg[o+@+CG%:`dhbgbۏ֯Ȱ:%G?G%;adhbgbN;%GH 7@
+QYr3FZXaXxwx_blkx B) K%Lo3BJwu~kuxuk?Oz!xyxvzAY
+Ϲ[Djmhl|{{̡ԡԈ֊j8ч5T &9E
+Z$j@b<r(B{]<6TY uZ|iJC^E,g_zsyubՖӪu^@q-1ݛzJ1jI1jgTiԻ EY}MF{M`@]~tvtz,~@Y=U/0Aqt  תdz}PPxvtnos~}mzVz-cObPru[N
S=)id<&li@XsՍ0ZZ6:3W4U_U266WBN@	h[aj6GUv@cLj^HI,+T(jjc+,54+,mmZZ;ZZ۽+,33m0vH9*/o⩩+,44>4
q{7$//)9wh	0m+,54+,44,,nZܼۋZ,,>'l4n,,44,,44,,mZ;ZZZZ;Z+,/o-D/#5>'}n00nm,,54,,44,,ۋZZ;ZZ+,jJѲ"^z}i{ѧ錐zss^myzSvnnU{uuwz~ڦLvewe:rnwt]R{ϝȹ̯\jtazm|}l~~nh~uN?MamJ}fg^%llI%uXBlznxj|Z6{&1~\NULܿI4'6kZ6nNwauT
+t
+
+`77lf,,fAV4
+ O
+W?tqB
+B
+B
+44z
+@t
+ 5
+-
+
+.j
+<K
+T
+DK
+T<K
+T<K
+y}}yKy}}yT8:8y}}yKy}}yT8ttpfeOefxxxxeOeffeOe8
+  *`7Q `6w%	Y4W%*%	X4j% 1g6` Q7*` D4	Y%*&4	X%WT#EE#\[^hnT^\z.}TNNNiYT}||||}TYyi[U\`uTT
+
+@
+8TjMQMQMQWm[FN$l\TT{zzzz{TT\vl]X$FN\vl]X4[^vTtR
+TtR
+Vo8>A
,'>&&2uQeGWn!eq=s)b?ɽX/c o E`(yk2@	/POlAAe
+	e1<fXEioB(4G#ɷRM7LMģ[?Qmkȥa3N@H
F?AG!</0U @Y\@քd=6>j*.Nz+8a{z{aY%#y=<==<=<<*```^+LPzlX1Az/-6D&@I`_B
 4
+4!3}|~jk/k;j:/d;jkjL`,ThuY54Y\55\Z56\~   
q@-&
+T|
+k        D>m2W._Z8nE 5<hLhLQRSu'/>0Agz8(ҒӑP0KC'ZL{o_uOn	ɋ#xW{DߥpBdȋeE)3+57wp	44tT~
+
+~
+4'V
+.
+;
+.
+:44 VT
+
+K.
+K.
+:' taXt
+Xta_
+&'y&'Y
+
+{
+Y&'{
+y&'{
+bKHJjp̃Έb[
+aouwr~'89{={mx<*e>okjqpi{AR*7}xE|}jp]VY0-|xp aime{}ld""p*}|blv\&A}xfa)!
+po"_m3m"3s¿8~~}~hs׌$zctc^_Pvv~w~yf{h{
+Z~}}}}}||{|Z}	z}{10df}itj\KMuTuzy~00h
+x
+x
+x
+<
+
+!a!<Ǒml 
+D4CPWhЌǌʕ|vw||ryIs7h3^1c:gJlXJU>]wD&_nr6Hgdalor@/K&``m}",y }z~|{@Ë)ҧ̞ȭBO`)y)o3hm^Zx:< 
+4i 1J{z~v$${z~J1 E8)3y{||y38)E1
+ 
+4gVQG ?33A HWT! 5|x$5!~
+ 
+4t/|h7S.1l~gd`;!Ъwgvph
+
+ 
+4'TTT(5!'
+1
+
+
+
+
+PfAV
+S@?
+i
+lfPzz$ d
+'44rn<j
+H(vMzzy :(( $u6H!eDRĨnhhRnD
+K 
+4 f~:;5:;]
+5E}}oۮhJto%]8%{~yxg(|{~rxjrqO>99l>SO~~zz
+K 
+4EQj1]
+
+< 
+44v{v}JJ}X}w}vw}Xe}w}JJ}wev aʁӎyLzzyӈzzyuYaaff6&̶QHyA~`Dޟ (#PgQ+<3%!!!S|BDMhߺ ђ.-.-.lHs-U7sH<JJJ?H&Urs&l~v~||||~v}~rrrr} d ^)[OK0-npq
D:)rJ?t~rIFo9$"%9/iüIIR^rdclmkԧ2*:8)0\pFN[BA\ŸghgGDDl)3=A
+t
+D
+
+jR VVVTPQSyVVV :R j VVyVTPQSVx VVyÁVVR jh@@hh@@hh@@hxmŁyVV jR 
+ W
+FPp6pFM
+W%%%%v|y*|8G}AIrw-u\?	5'p$ PY84I5K G3#T1!I%>HGUB&- -%bbd&-JRprvQiu,t~՗Ӣ9RMgĬx{}ާEvhrjplJ- ?&n@5dbbI,ueui`M6 fXPljiijlPXlf`M6`ZiRuL};pommop|;LRZM6`m[[ƗM6Ġ|}+vjS&zzgMRjhed9oICAA~CtIo}d{fxgj;v+Iz5&o? mjhĬ7;jjjjjjjj
+D
+\O+:xOa_UTS˄@gftXRweWWk :{z{zzy"J<%wly}jhw|m'!+\!
ոϡnMbx7tttpopyjef{ m~	Ǻ iii	yzyWuf^
V]g`[[f_\ `Ujf#b'^ jTm4=yBF$3P:kS43g߫ޯG@pFAw@UMMM%O&iWtLXU_ogBFbWR?d/yH(#-:=;ra``^_^rrukedA~ R?wnmm(?+RVB=jȕwS<;QE>?F
+ X`X4! 55 pqsa_^U^HKʲJpwm7ųu~`//:q~iykkkkkkgfhopypoon0
++(\fmjő¡CB{gtzldg{S)ik-z/Rɮ٫ސq,Þ2=5qnYVL9+3 zZ$;;#}MwzVqzvy^oyzz UggTUT¯¯gT{fggTgg¯ggUggUTUgTffgUgggg!Mm#[8ICnyy|죢Ԟ[TI& %7w
+~~Tvtsrv61psYM
+w
+wpv~Tv~tsrvlUXqsk
+%]ra
+;;YS<!
+tZ
+
+t66I
+ bXkC_}g555333g}cm6ﳽmv%f~~O~~~a}g767/./h~bn1lp.[Rh5kuZi/4oe
+^Wf7h7jvWi'2nfz#zCpisL2r@;pEVP<Q<m+,4>;Odlwm
+#>m
+i
+ƭ4tt ttT tth
+7>jVRH%HVjRHR>7E##EجHE##ER
+
+	++	
++	heXuS	+
+
+	þuh	
+	+	
+++	SXe%	+
+ 9/ː/4Gj{fj}^11^rt|qj|$$P|jBGrbrrKK&	j	Sˤr(Ge~1~w~~w~1zz0v~
+0KO+)
+3ET=
+@
++3<
++~w~10
+
+ddD
+
+mcFr@:}77:@ڳm-T0>2tM2V33V2Y&Lt>T0-KKKKKKKKTtQTQTQ@ 2
+gn~Q TQTQ$ 2
+
H~HfW
+T	 
+gnT<}~}
+2TT~}</
+
+O4tOf
+Y:YY%$~~$%YY:YZ$%**44ool8II8oo44**%$Zu*+uHd8lhTwwvym\_u5^/7hVfJC22C=+JVhX[<*N?Y3: ]#"S:Y3N%I%%%%F%"F%F%"mmm%@5z"mmmmFFVmyjjgwrPE]}~Su8ӗ)xm6
+|uw}un]~')kp{u~y
+nkuptogo>4y}Ϧ)Q4
gyr=7TRyytvz3* WJttx~8tA&ysjmm}՗
+
+v \
+T
+5d
+ 0fg
+(  eepZp  %$
+ B((BP! (''$$
+GG(GGs$$zhl?9%$
+_{_{W
+2$
+
+L
+L
+
+L
+
+L
+L
+
+L
+EQQEEQQEL
+ 
+b
+
+~$
+ EQl
+
+
+lT^_|_j-Z7BG:?)_ s:y8CXccs{~syyyyzyoto֎~@,="H(`dine|Anq˗Ǌܨ, +@מaIƁ8%m^9^9&^5
LZ_mOMrqs7bh%7fUiU>!Vvj1	zA@LF){B90kMKpo}q4^i 4c2!b˱̩,|l-s|eW"}fڋ\GQ+L~bGDCd5.26J:#:t|mcUJmopmvn]TB4B@Dd$rvJL88˿}~=.|Նs=xzo<BY$lŖ/¸le3k{ut~irgk{ut(  ӥ`xnqx}p[!T77:_  \\]k]: rZwxo_(  |  MfmW  isu͐0  |u~Lvkcpy}  ~uz{y\ƊosTuwurl{~CBm]SbVBMjʞwywkws~~zqXIHI}Ons@WJ-E`Ǜx|}jx Ĩ@  6'r[vyo  _  |  MgmWisu͐!t~~yqWIHI}  !?|zvYaOD   Vhx/Ym1V:FMFVmY%0D  F/bbF9@O)nH4(nO9
Y"Ω̵i&L̔+` ~tvqazpubw& SJZu\ek pkfY ,F):J\^GZgm n| @~~rNvƯri_z{wow{vy}psV1}nso(>}>ptlN[XKH[ͨ>"?4'::''::',Ah" ttLRAS1Sc1J @ֶgLXpjZ  =PBBPOAAOD=̹|ͻMV˹$QG̟^ͫw_BG.O`IΤwϓRϺT}c  3"  @"7<` ߊmQ1    ryt
+   8spvu:@    rfqvu:   @r_F       /     >L6L!    +    Ohhhh[N    c    92;    1    y,    ((,     mm<}nik<ytgn(Bnlmv   2gW @   TPQ~   wez    u        Eu @   :PBBPNBG=_     "   Z*y@u !   _    M "   _H  D JiQwrSrNG2J   D t(     w\  D x]nrTrN:BNcTX.        ]^ggTW-|cQ    f   @+((+ll>vII<5YaqT;Qvy{Qŷ   bZ
+Y`qT;Rwz{Q9RIPP(*/inW|ϊL/b\04]O__  @@e,l,}
+
+v)@eiyz )
+v?n
+?r4
+or^{g=Zip
+*>薚=v*0n
+9 r3
+os^{f=Z@ip
+E(J-I4i^xz xY~**)(!=
xetpq@ tJ͉yiiylHXzdipsl_~UGJhsxyW9Yӿwyk]]s}zw~{mh7k>Yi{
+ztdYgrn|oM򹓝gptx*kSk*kl1wGb_]aTfvst+*r\zheN;h_hg__hh_ilu~~$rfP|KEUf av,ɼuaaP@YT@A
+
+~@7뀙v~6y
+uT4*<씒<JڔoCjSR'"pG*J,)
+pv~6y
+z
+49T8
+T9T8
+T9T8
+Ttg
+D7**~bELpCQ']VO
nLE
+
+3(``be!u!366I
+&-~&`b z]A)F9:5$
__;;A
+EAbw}.$X'66poGb{
+SxY-	q|k jouhyəRr	T_su#ff"ss~ki_K_"
+ff#us_^TTTTOt
+Z]ukhPUj=;<$=ӭ}(70!uc6rtv}raf'ZX,W
+ 
+Yx
+XXuxmihaX_)(XbhuXx T5!KTTTTTTK'
+Tr
+r
+_hmx 
+
+
+
+ 
+
+TԬIiV!!ViK
+ 
+`OGo|iv

dd}}TT44}}
+



v8W97̩uxtovwpEV3'(I6/H#@ _6s2rv)	7,u`melh@K(w,k/TcWBRZsZV: [X2;@Lp"
+x#&|C@H#SQ4 + 2йyz{6C'r v'QjaNScI=λۊ6OFuɷayrv.Dxylu\eh[xO~|iK! 
+c
+
+
+zz
+0	Nee%N0	zz
+l
+
+zz
+
+c
+
+DjDBwPakON(bXS9}^HtT 
+DjD]]FJ{oQ$wv
+rG
+tKKB=vN;mYi)09Q]]
+L
+$
+] cmgc`cm*umvpvvpquvp$i݆y"Z4x+4x$Zy;N9j
+
+
+
+]??Te[R[ed\\dRjbO e[j|~bO [ee[\ejTSPe[PZ[ZQRT[ee\[eQZZZŅĀ
l94MJlrHm9	MqxtturJe
spszy}e
<cHuRtyzuw BX@2ʳ8g^zp}UY̲nxvwww~zm# Ԓ,f~x*}-oAc2S3_( %Q,dFW<~gEWRCp|1$+s<
+ T)0a_i3 DX;&
uss9&%9l_nhY5Vk_k`1T<kOFw 2ϵZ6_
g<jOFx 2ζZ6`g-~	L9wuz~\LyǞMyv}N}	ǜz]z7T   t4t4t4tt$rrd+
+6**
+6TO4+***4+T&drrZ\Jxk^kwwkkw^~|}T|zxk*kwU|zwk-jxT}һxjҺ\DE[[DS^mxH||T}.һһ\D.####h
+'V''8Ltt22T22
+22T22O
+)$
 xrOrmcqly|~"|yy|~  |ylqrkew}xt[pwtoptbptUkr#
+$Ua
m}||} #V䕌OV P[d\R\D?G!cLm?J9_	lq1:KI<EQ88?E  Vws-1
S]aA<Uiut,e#z_6 IclT7P7o7w>>?DB(DD(BzD)ANZȼxȼXN=h
+:jTRR;;PPQ2<;5,$()MU]()++\TMqqz΂34ypm1
+.oQke^
'uv&^ek ex#B9o=9B]:#/ݠ"\&"iRex
hB
RXD@ _* pX@RchE:dM+A*[ $qf]]]U9pttp.ptqtoq
+
+AA
+lL6HpAOYKI++srs I0"/rIHqqIHrﷰg(7]F$gVd
+p'7)28]8
+j	@
+j
+j
+j
+@ o]"
-]"-]"
.\#<]i|i|i|j|6
+6}66
+Fٯ
+6Vg
+
+<(
+gwddddd;A  A@ !A@!!@A! @9ŵwvmQuLflD^A94 wHMZXaǂݏ,|)

*)

)*

)*

**

)*

*)

*)

)[OCPZ[P55ZPCO[[PP[(ǻ@:M`edeSO[/:~~|yw{
+>g7.iczdfptð+&4Rl^vQBR{xxgd~y</Rc4jc'^d</gZ8%V  
+\
+j
+
+F
+nhnhV
+  
+z{{
+F
+'&nh'&nhV
+ h-Q Nkg-``%`azxwwxzxshtT~Txu
+x888
+88
+88
+88
+88
+88
+8811j
+r
+ڱ
+898}
+xyf΢{cEpH
+EQc}{[hfKK8
+9811j
+r'mHP
+j
+K4T+TDqT1aa1qӌ$ӊ4FlGuj/>cvYXwrlO[MOO[Olr}twXPYv@c>kPS/k_`bjpN1kI7+447
+c
+uU)4S'-{:d@Gl
+&zzEwvlmulchr]t
+bFs^[XVvN;mЋD1 %/O,jF?j}yykDjDB'wsxx
+l
+DjD 
+l
+_>hjthhjbgSgT.
+
+T譁bjh>n_KD;Df
+`-
+l2+
+f
+
+suS&yprxo)nrR/Eoqwn썍c@
+";;dxpXBB}tq۽<Tdmlsur|jtZ
+ttq
+tt/t
+H
+]]
+)\<A
+4j
+,
+{uNvQ*33Q~Fu{uv+NR-XvT
+
+vXRX,
+*6xllsvr}jP
+i
+)[=)R~[~w~5-!/5
+A
+"~v_V=)[P
+-uqu f!D! }qquur|jtZ
+ttq
+ttA
+tt/tì|r	
+PZ<:~
+`Zvg
+$gJAv<ֽYi<AJo&
+)
+d
+0ulc
+*5xlmxyv{?ZS4t9Mkjt9MkxxwJ11Z`wwxn=OvTJ11E`nm=OvS
+
+Fܬ)
+gN/#-teZ\i\hT
+ֽ?#f,WS	
+Z<:Zvg
+$gK@v<~
+T<@Ko&
+
+ii@@@@==)\< ![
+  ijA
+4j
+,
+<4/49/[
+^]}
+^]S94Z
+4j|ѡlsmdtK,
+
+mv~^^
+MMKj|ruslmdttq
+tMM
+^~
+,
+TA
+
+T,
+
+]]HҼ
+\ee\\esVe\M|?S#`<`Rw<EDz8D^7E&SMX]Z-`LML<z=a3lxmqY*mSZ]eauжXp~v{}|[^s\IFFS#Jwaâ7z_
%>}=af44	)5Mk4444i ;
+;
+TT;
+T      l
+T
+qT
+TH
+4Ti
+
+T
+tTsR@6{@),\,)əEQT
+qs
+IIs~xxx{?+)])+8s~T@d
+Tj
+k
+F
+T@hh
+d
+t
+TTTTT//TTT lTT!5(5!'
+4a4a4 `Dqfe2sq4eessfjoFee2o2e
+
  d
+״(
¯#wmݿbt  @r|kj>Slst =Sls_tiqnvŅ3I`QnN^DyagTQ3I`nȜn;((5;!!6ryP qhn}.d9=k%)}|||{zvvuyyvvx}̖ҹ֐acrppxswzn}{wvvD  Ӎ⟳͂pTlZxeyR{  o|WbeVHquO  z|n*)j4_SnNe]_\]gwkrmn   nny{ŉZlvTdp@JI4X  @^xԉ  jwvw @ ~ny   yorpmue{`nY  npr@^rss~~xvvyv}y  uwz  {{|z|{}{x}~yz~~}	; ` ˉˬ7y88Siˎ ;	   Lp` d|jK='t<<vug|c |[ f  _&u1||~  yo9utwKrjR|Y%  ڬӢ [Q|+<cgvEU||zzЕ֦dBr;9WdIrPmu͆~//0//0//xyw`~"b|ьҋъ[[~![s'ҍҋӌl3zQR#krw:vtvv  LFTŐ{όxsx<ծ|DBF+D~I#6B7}IH_ID&\Ӂ@r  {)5?} @ zP  &#?aOC:)x{}.`A<~$!	z~|}}XXX}sruj~^at\C&ODIH}ߤ@	 rB00AA00BA00BA00BNpi4rT_		__		__		__		_D
+
+$kt
+t
+$K`\buA
+f
+<<<a<-tV22VV22V+
+'''+
+
+b
+~
+g
+T
+1
+TR
+@;f
+4g
+3C@
+4
+
+
+ K)
+K)
+K)
+T)m{zs{tq 6
+SXk{E֫}]pc`
+
+KHW-CCHKh @)4) @hKH-WHKh )j
+4) h
+W
+^@ 
+!  O
+ 
+! 
+@v !   
+@   ! 
+  '@l
+ j
+
+'u
+
+ v-U  P	 @ " O
+ 
+( 
+ 
+@ Pv    @ 
+  " j
+    
+  @@ 
+
+ j
+@ @'
+
+
+
+''vv'h
+Z444LL
+xzzMMzzV``V
+
+4
+ժLL(fcsm- -yisn@K8A*,gtx^L p&{'%%{pVJ9$5EE$ݑͥr:CW*[_?P`X=[A `
+kk(22I2(UJU2kYA
++
+Ԃ
+ԪGt
+ԏ
+t
+44
+ԪG4TTT/pE77EV@p4
+U_xZ
+
+ /I{
+_gg_3
+J7b  3
+J7b%Xrzspps^?``^%_`b Z[z[;Z%&jWWj&[@"UzUU%XrzsppskG+Ph
+K
+xILLIILLIx^ 
+tt
+΄PH
+ZVNqqr Hrqqrhnnu~t˻WL@mAN.
+JMs^\lji!)tIK^0(H!wwx^B<``uf`WUAtttt|
+ɽYM$
+ɽYMwwx?)^cj]D=
+ҳxk.a$|18X:b}}}FhXa"
+KD ( 	  }}}|b81ittʓ
+0%nllv
+!+fzv
+p/7chhk+^[THP}.}{{MYɷ7o_qccy4{H]ȣǦɽYM|%npzdcZ}!DR
+\Zjћ0!XEdkdNYTMNX0PcXR}6~YVW
+Ft
+S'
+kIJX%Ba8kf#Ef(b>[=:
+Yvk2
+OTV0OUƀF
+ԫafob~hF
+Swk9&&
+
+gY8>%˻XM,ɾYMr}QQ|Q'%`em_Jppuiuzzwɺ˿gYv*ʹ%q-u*+? q8$@ q+)5x}2#xww;Q" 7=YjyJAkttTtTg[
+MCΫ
+MC1NNgZ´[VmJJ{K/oqwnb=
+ѵvj+^
+v
+d^]  Kb[Քm)xyx^HCii}l\NJp"#kkgk
+ot
c7/{{{
+v
+zf+!v
+lln%0
+ǓEt^+jffllɽYM{{}.}PHT/7qͻ]H{4cycq_MYɛǦsjZ\
+!}Zcdznp% 0DRɹXNMTYNdkdEXÿ!0WV~Y6R}XcP^Zt|z+	za
+
+}z!~q{yzp~"{}~{=UP?Q={~4Z]41YW36ЧubQEd]"+T&6/V,'
+t
+D
+44'%YT84
+9|2'8
+(%XU74
+9|3'9
+4D
+
+tt++UUttttC<<4444vTT
+UUttttC++<<44f
+aJZZZZ44cTSc++TS33ZZ
+D
+DORKPKaXWaaXWaaWWabWWa 45! 54! 5
+4!-..-......-..- .. Xcc cccccc0ɂь8`a @aNdC9sbccc@ccbc X9XE-JF,bH5@Y&nË49HbFs̷N{R{	`_`_`_`_9''''pqD-A&aa-D`qX_1`AMtCC%&*)GGbbIc~c͋%)Gc͋cBս_h
+3PD33DD33DjKgl:VF_-zMWSRn\nnnn\nZECSSnn\nnӾN+F:g˝VC&&ӋlgZG%%GG%%GG%%GG%%GP8 X@
+6DD6srpsG4Tmmv)t~̩vVJk}ltu(vumm	 $O?$d`zw~y8Mva\tiN߶܎`4s~nkA["gwdLaG$lΥэv~{ҊꅮK-5%L
.U <BB<Gi
Џ|r0+= E=w	yKoIlkhsljisQxK)]`J'R~×bB!-(pW}^^_I|Dc/ %)p}[De\]]ϚF|E/+'ǙeTGf{HB- *\mNNNNNNNN
+D
+f
+t
+
+@j<Z\
+fzd?*1"0-)/!U=ITAIzWdd],O+2=q4{E)<A1t1j1(w;;;;;;;;	uR@@gL)wteC#B3B3CVj>|肙i54_:vx H|Q̋yPBCĻ*O8Qz }y2!v/>>>H>8  *`F"]E4ѡ+E(7S\t"6%Ws& lhf%H;F Bdx;s6S:
6Sq%u?K	La) an
+
+ 
+Y
+T
+|z
+TYTt4
+/t
+
+KWWKKW#1bnZyOL/õB+
+h'X=-k7yS[rWmK|CO]ew,i@RF˿WK7]o(Hq(H\^q(H(H_]Hf++AP[sHr8{3QB%W
+0%$;K0Qfui{3iHw^Fyl}l
+66xtm|cw&LL+dtjiJ4qq˚|O)xOpYpZ,,pWwT,JyIE7wt4vQ^6_
+d
+tpK
+K
+
+Wl
+j
+T
+)
+
+T
+)
+
+@l
+TtTKtZ
+ttq
+tt/4O4
+6t#
++PPPP]w~PPPPQPQPSPQPQ[
+k#
+]w~PPppiP#
+f
+Tt
+5
+-
+.QQj
+4tT_`b#v#b`_yyE
+Ct33|
+V22VN
+'
+!!yrr0K+
+-
+
+!!e+vTTTrryy!!!!"
+@
+yuw{{{s{sqvwl
+zz
+zm
+m `mmf
+t
+H
+@>
+222%%WBS	qg@\LP{|@)҅%i@@@%%
+\h<;v-;ݯ].Sg9G  FXVi_d:ftl\mM>U:\!-<F<C;D)Ե4C554C3.N$rjm2h
+o
+Wqqq
4o
++j@8rr  Rr@LiO;{eSw)}5TԒ?>B	o-Bvˌ{bє~8wp@
   W ] k             .26:X\gnu"&*/?J~%)-1>BF
+ $K5:>*.QXr{		#	'	7	E	K	P	T								
+
+	
+
+*
+3
+?
+X
+k
+v
+z
+
+
+
+
+'<QY]br{&FPlz

$
.
9
C
H
[
c
l
o
u













17<BHLSZ_jp~*@LQX_dy/BU^cir{(-3;K[kqw
$38<AO]fty(4@LX]dltzfAV
+S@?
+i
+lfPzz d
+4T"
+33T&
+l
+ttpK
+K
+
+Wl
+M
+!33)
+33y}}y33hnnh]]]]9/
+
+TS6
+V.
+?
+C<
+KTGTKBKH
+K\b
+A_

RI
+<p
+R
+;5
+-
+hnnhhnc
+
+
+}ynhK
+)
+|y}}yy}}y]w ʆiimdod$@~ Kz&w{yyw}| |}xz{wa&zK$|'˒a%%%%%%0:
+.++
+z||zff}lTlTlZ$
+}y!T
+
+[=r
+T ,
+0
+w
++Z
++q
+/+VT.
+T?
+@h`h
+^OG
+`E}n\>lF
+
+,*T+|z@z||zTz||zz||zTz|Ժ
+@4F
+v
+]b
+.j]^hYE֊ׅB
+?Gߩмqٴ̟'(͔͂z'w!q=wVF7HJ?xs]C$YPffEffM
+}3CCNW }'
+K&[ T% 		tkOE;wOVVOcZwE;ɦL1H:
+>0v
+!
+1TTL
+/
+_^X*D44D*Y_`t!^ATTTT@
+1
+|A
+j
+lnl||}_zob^^bzM<M<v	o_}||gԊ5
+-
+!
+`D9>!a>9UG
+@M
+V``V}~d3fTw@t(suwN5~w}+}PV
+o{zF
+(
+rcrr3CC3jih
+'''G
+
+*K+A
+zz
+3')x~D&l&y;;Ky}_Ib	\;COLD|yz|ru{A0%!h
+!hn
+r]EQQE
+1m
+M
+ff}'T6+
+6
+C35!tV`l
+K
+Tf(_
+
+T+
+-
+T GCC8=<<8CGCV``V
+:nh
+O:
+Q
+Q
+!
+&&
+H
+z|LfeNzyz# u"=1?u՗
+89\buA
+Kxxtw~BTH
+K\Ti
+
+1
+TMY;/a3g
+5}+
+h
+&/]]1anhe
+ZZrg+vvo@
+ttttCTR
+tt
+Su4u{zu
+-<<<<t;
+[8h2j
+%%~w~~w~
+
+
+;`L< xra5
+-
+OT
+d
+zz
+
+44
+*<씒<Jڔr
+
+
+@+XTYYE********
+n4ԙ
+4yrrrryy1
+R
+}
+8@h&|z@+Tz|
d
+v<<,l"7o''&B@4i
+B4@i
+d
+@6gid
+N
+z{8T(A(A(A
+<
+{tsoyx2
+OIIgX!!gXg!BT4Ti
+O
+!
+z~
+
+!!O
+Tj'
+
+0l
+  ZZ~rrF!<Z:W
+ST?
+l
+o7F{2yqpV``VV`
+S
+F
+
+}Vrrcrrcrr@{ttD
+
+pttp&pt
+
+@
+^D$$D
+yMQ^
+a
+-<<9!55!e11eBBZKSy@$$@!{
+ }trrcrSTdJ,]շ49`uttu~w(DB%$AΌy'&qtOG
+	 [0"WS
+s
+wrrcesz!$DD$Ez*6z*E!EQQEEQQE;;!
+zyy/
+''0cGv=<ag__gg__ghaahi`ah-
+l
+[
+`V
+ @ 	_$cXy6%6-Tt<
+P@zyzNba]
+@+
+hnF
+xd
+F
+RD
+.
+ip EGxZnyl
+ d
+d
+1
+_hmxd
+t44tt`M`M
+&)
+y}T^&4
+j
+
+_gg_333vKR|
+B~v>yT+
+
ɷ,$P++5 !4e
+}yTfzz{ofZedZdH6*Ö)Wbit&m/nh
+Z
+@
\ No newline at end of file
--- /dev/null
+++ b/assets/fonts/fontawesome-webfont.eot
@@ -0,0 +1,291 @@
+
 %                    LP                       ^ >                   F o n t A w e s o m e    R e g u l a r   $ V e r s i o n   4 . 4 . 0   2 0 1 5   & F o n t A w e s o m e   R e g u l a r     BSGP                ! YD
+MF x>ޝ Ə)Y
+ڤhDpjóK*0~71^{+rAPu;.3ռKğ?]:yf`o&d:ٌeDgKR% qH	:ф<Bt]NbfJH%М~SG؉8I
aU-&q1󪫿#`U  WLgE qy:g$8eAV䂒3euj zi@ a=%ө0O\O "3ef0c@ψ$*qDE"(/Jv,^&N?'c-1f*}쀄	)k\eLe86QpfvX*XC;VeP CKWaZĹd?pKU<TlRTೈ$*QФYEeԌOIʕ!زFE]CE	r>sdW*0#QTݘ:b#@Ym̉{Dt!Zd΅S
Qv'xUL8996,
+BerR+5ˊXWNJ _;J%$-nprtǹpLVĪ{@ L"7
+B|ڰ7Jǳc*eKd=x|4!d؋(A`_os[0H^Lpa)1P8SAs6LDɢoÜKŪ$SDRIUW, u@:5WʬNFGgi<YFP`1%RIb
>sµg1{LB#}aD0`C*Տ ؼ'/a9H}d#"4z@c15n@r67&	ZX06Ma]b*ß6.Ql|]x<ED0f'Bή_	'hA3w7@o|/J[s eދ/"RBmBk>&l@r,4 lg踱:eQǿ Z<#(t蒨8	PaL,nr'np8
+`:*C(H2VfS 9jK;ה'"zJzY=5@涷	ad PAiC'%Sd}!ơr3 w!

4qZ,.m#UޤL#	RC$rj72t} 
PP0f
\KT,n\ĕ,D:1 7ZA5EY L\WXhY8`Lc<L	+v`XPhZ5^cPC4`VpRRXiڠ!e\X2-<Ws9Чf6,ylvLCT 9YKA
+w;MW=xDDU9Kudu򵻞	!X/xX0g*܊ݠH(KRuҔEn>NBbMfŚaP֗rIo&DuE:uwzt?3EYzʞeʙE"戧IHse-Ek~bdB"=8/PN,,cp]!E˛A_]YkHFTme俿56;6~Jz /cY	P =Pk,t֮Phxz$N0:k[NZ8҅s
~7d^+q[цEopHG|?>=>MJzW=C~4
+ϑ2"XAQTWv)pHwã0D&Dܥz݉j{YRNYd\̽;eYM>ܰ( d:hU]T+Ց+Gi
US
+9pmáp&,	TH{b`H'I,m<Z0gO+
+*YÂ-;b#he ESDȑ"[v %*(vRBrwԖqx/ppmsq-mN0FF 101LPaƖRvD44#O{6:UsUesQ\Buj[#'I'ʨ1/n;o?]WuJrNZbxyQߪ+9ffrc^mu^"K̚Xm[XVWgٌ$.zq
Ǚt҆6;TNb~=q+#=BQY⺆ЗO*~}SdOg Kx	e!bFP#9u:ZX/iR*UH 4T@Wփ>N\+0cjDߖךt8*ݲ`
+gi3:^ƶS׸?t^.Iʇ6J)AMwD@CciDړEԯW,;\>YmJmP\Gp
%^z'&ggĊ1B^"i_]
_+.s>:Ȯԅ)TFD< wVQ⧌LhKc(	ht]`#9PP"5Eq+3|{}":L+W'~	p8<bꟿj$jm`'V#|b6~g؉7WNgRH	ϸ\7/,w+ƶ?0^prJ)R`"p3
+"7zр.SD4ᰖ̳`}˲ݟtGe')[IplQ֬
+(x[$|d[+	H$ƠF"5<![j#2͞}ĮH!	gF$]9u\>i!gFNYX'2F7	3'qy|JV`[i
6o$whOk0gz[6jG8Iۀ}YL)]#z)|\{񖃭>ogNВf/`zC^!keRFBDtPbUZZf2"bflRyIyGY@
1f1/TMWn`~@
'Ѿ:I-+rE`a	|󗍌h3%'"p9mi <[ٝI@zu}!Dގj0"<S=;VҮQzz-y	[GzXVT
+1)LbhMU{7JQ)n"\RU44Hɘ$
+AB\^^
+	?')TmQ(o$V
;"5_e;rïn@8{v"
ߢ:1͈+ V*؈z'TsH8ʰ󣖷¨]jy	|z{KlDxXya9(kɎRڭژ.apj,B`u
+vA799n>kRؔ
+<像v7|?9D	7G`aacB5PAza\J;k 0fKc58X@/Nؗ@8y`>wo(j^0}G``JU k[@nXg:؉pH_
v"-* Ry%κ1r0H&ʤC2+E|q/Mc/
+njA&rMɡ?]5[9qNe}ᙐcp	qF)u.u`n)d`Z04
;[A
+֫
WF2!,}jQDt9fA2 ݬާ[5+(!DN/2 3`;1cB\zAqMVwWmmČ)<ݳ.9wHlv*%i;PSBQ^DׂLO_d _P"X{#qw۸DF^Pf>)2]8;j\ͻh>+QSbJ3AnI`i{9Bc`8mam?)ԁ)QͽiC9e}6!BƿUzelvZ*t>jBlc|8Ca
36 9NM!jw5Zķoh5!뚲Sr َG 
ߺ:.DfFFpEKҍ%k͉?յ;=2Ʌ܅( P	B1Py8 n(*Dbڣ<cpѐZJ)I&,1S{"Ha24L=ި0Q4TuF-B4FBǄ8~#$: ڞ'(|_gi51(߾U=!bt_F
C$ePzJN1#F:B:p;
A Z1lUMP^m=vJD3y_
+qW0&vAEyU4޽T) զcݤ
	D\#ƪ$9AP?TSFxS>DHK(jczl|K@2khidj0I1:\Ayo8DHҕ\#(jwiR2eCR#t$H\܃ݹ
[H9Q1$-Ps\wO%3(vׅh\xskؓnhҚ׵Aq :Y+ѡ߈@rcF#<ή0z߅(}CA,s5ӌសkUOClml>#S~p=Mxr7y'Cuޏn
+9KA$zhQ"mτ> B8%0{lmp{(3pTfT'hbC:Iɉ2o3.glORʫ[}X0t7ߍdjs1:E}nv5p1'/V['5Uv@}$bhPtjWV&ip/J>s*+.}wdG.f	ML.w&E06l~A;9}Tgk뽡x:jm{z``-BU^9PZ`iH4Dђ	#C `#MR楡UwgP3Y>C.d+!pU?bZ(=GbBpN--*s,	2(1I
+lp]
+E#|c\dJ4n\rіO&nBc{h 7|M= <Vߢ9sD{ְa 
YOTBf^3D!dGh>hcYr#y7fа`sS0}1 ćHLZ(8d$oo
D\b7Qs!^$b\	ƓYB~;XX ='m
G7 f]mC48.zm"D-HKǦO{,4ڦ{HٮF*"0px4'JUxIo!*LTee1.L.֓S`MO+am|V YR'_Ie*8@v۶R8JcK[-"}e*:h"ĬANz_h[Sax*f
+*D4#]U
yA.p dsêђZ*Gڀ%C%W2UU ?~N5r	)گ
ڀⶦkkvjmB^6psc8
BW'JM\h2dU~!;D+$"&kuHr;1	?L84P#3)j07-+LKA[z'."fG.܏
dlKO$ޚ1PWlzT7,xr 
m.8
+ ,8
+on[a\]םxi,RF~035/\ֆx L]2Wpvclxfd!Y3QSCWdPEEo]p7BvBb[vCyX8\ӧ:u"^?t:vo"5f4!
+(,8dZzrM׌rXï(v?!@l	SƆivDNɸB67n*

˼S]@<OH}&FL'N$
+5ВZb=l=VWݫGcńQXgA@RASa~Gҧg8>3pCMJ @<Ks'FA2.$'ǎOLbDó;@eGqw2fc*,fFהCmvƝز+P:VBdKwB?H"C cclq0'ʢF_2d̰z<E
+u R=o
+Bc=hqXeE`o6뚀B	<aNKplCdR,YlH+O,B-N&jBlLN670iL9D1, 3^)܇.CV?1@5d >$SMB|,ݷF۶4K}y%T=zjc!9fԶľa9:!A8^}Nx0ʕ07qUN:`t%N{ #m"3
0	>ͭ9lL(ٽ'H?FOEu6Ȣn/eh-
KۅE1\a6D%Зu#r(a(C)(["zZb7$ g
+7Ggv
5A4
+Rl OW@}an.%9NX\9-y5 `%zQ E1ո>,BZdTܸ:cF0+>L)eF򑮮{hR@!j)h1(!D_XX eI<7xrN'o0R[NЗسM
+8CYyu]ŚhzN	x42x^O-	(b@"a@ԴG)cH$'HJC&,~+Rb[Ztp
Q6B2C|SBD4 ~D%V\3NR/JrB@_k9*Y oͯsŧ.`,v[W	@šQ^ -BX:y<6&նS;dbt\2KTpA
+Z+1@P'Bi|j@uu_MGۻhy!NXhF@_09Rq=7Vu!XpA2,JkŬX B^Ƕ XTR TPb<C
,:[RSMXL	/tu|5 
8V%?D
+sȏG͠ap;g
8	O5l Į'_)/
+&^/D"*(9C~s5C俟"2Ac]ac­2{
+"C$4rix 噇l$#QXzH5C+X;d9ҏnL1:S  g,t%,[ƢʛT<IgQdsA&eS֔Bj l'3b(OWVacr	*Je5Dd<|R&_@o8 "4hhi48b	|Vy;A'D;R>3v>: oʻlc'}{_]IaFV8V_WqUrF-{
+^I0Z7zIh|T"{"׊4y.1Mx)=]PZEߏبQ9-!'JU[8V)y4WaʈW,D1
MѺIyZ'[I)>N,8.<յ'0DÚ }Sp~WHYVVFO(Hvo77`Sv	dSqRZY kyKS+:&+8&EgYx
+;!B"0/SE/sA)MXSIpD;L]C4HՇeVv]9AFrv0x< rؕ^DEt 
jBC[c;BR~3|5,d
+wҢr&=@܆2f%"mbk9"h׊ Z{4+>'kOz0
+ĦlP\V)6@i>XOCf	e zCTwgY^0@
y=¦
=(J0x	ǩAlD8qOag.`qa`zoZ#̀oZf%lwwB/S rb~"ugh]l)ga [+&vc~a"| DT8Wg[>b}=eZrY=ƪ<9h";wOMRiUMM,y([yt	RDl!?7!í_ZDA\o~dZ9xeȦ@U ҕ`djJ]
Cw-
U"1R-/_>Qgɲhh$MNe}	ㅵiSu /|ONmWyG4*eZQOD	G>iWA(~YTZ[G45]Ҽ|#ȟ> 5EYA)}QO08vJ%!/d#FHa|*c.]+@8.,*<O*jjj#,40IWp+˪Ia+E>nryzsn,zfE^D׉&w>X5U)͡3A)5( zȅC,, n@>9[uE"
+*
+ 9q@LTnUk8 I$+/ KxVܡK9k9+SXDς^	3e2),<lJWt|43섀TӠC
ϡ\mr}3i)d6[-GuASY\d[78)nfݝiRс	_~-bt84ܗWzpUHIeRR Wޣ^d~}7/%ďKrgéMe_Cq~asli\7$KD[5G)p|a9_4
+ DDIS`2+^CA7 04(!"Ŝ6"q wHm!5P>noұi,[!F`tl]KM{5ȳckZaN:{G.t$vG9x(f>,6r(ȭjnr¿\5^yaGJ6ꜞdԼxEXbPx
+U"eZoƙd0t-df6u͢^GX1LHv&h[]0%bESAL3):f]ġխt:rK0;?:չ!tV1YJ%0RecZ n@7hN Qqxf0Nt2t!yMQ jE\igdsn]?5JϖT$[O
+;W3;hu 57np+Pq%(pP79BD0hR>֞g͍LH6Ns|HdhѤ6Ӊ5],]6לJT.![a
+"3ƼCgMWq` i0Ws^kҽC< /8)H|
+|'ŒSdlKk42{fYۊ%hv2T5ӎճ$)8\\zG;-I^d4#](ײNCh
+f4,M=@a 	O,ȠMhN&Yh}< 2c7Fq_ہsǠv|pZܦ`=P2ZFޛq#Ո,i摶PruY3Lbo qj/m
 V@DVʨ"tL1AMه,k=ّt^^dYQ`HݢpW#u""@P@i()l]<<I	H)A>3y倿$)NzO@q=|/H@m?p\0PѸ"a 4XZon?n?? eʐF?QRƷ%<RNSFy<
+\m0`ykL᠂.e2e:kľH i0Z
+rɠ8FibėFlXϰ.2rѢĢ%QKuu6=Q6	*9r`4"V_RH&PO_ 66=*'#+
,k(HBx$ƺZؙxo^m{&.[߬D%@4;KK^{n)T$G̈́UTgC[@
+qA2"%)?0;dMT
+gj4oVіKPZ=}aa~	&Szd'<X5h&.QLz
8},E5|tLǠ`ӝAe`
u71jvK
+-"UCn7 7A3	P4݉,"DDH[QC3rʸhL)Mn&-_De 3C
fl[Έv5
.kRJ$N%8rWM5IB¾?KHVOl]1 ^#o}p/+ .cIyلŮW*?`sY)I0Ҏ	p`P>IEj(FhOpJ, Xn/밙*WBL5J97Z}zvܬ<HC%#3$IH4YЅ"^&3i$mV|Crc֑)a6 ˩0&en
BLa=DrU?GKK[ʚ?rD)ŎpYtRIԓ~uRM0(~^7A,dOJaM	l}H+P[a|ȬL3~H @e ܛ_T^RO:s(Ohlջp/siK0Ul?AcS03~D^Ӧ
^<N2QRNIbmZY_3sk^D*`N4mciV6@`!p)L>&ǰμBxˎynמc(#ih)q4g'ph­xY;#ߊ@K.of#Mx{o?%eR 1YEdqRzPtv?kŎzhD@xP/0"Ł|n9%)#"RC~2#fhZN̬T!];BsPB-D	x+pr|2=~siq*G;HO^=B*KFG'XQUmNַL UK%zcЭ:oA(:|iev_Fr8Q '+VCU E) I=t¼S4XR̼CU*ENϮQӮcW/RfvqRF̎eOWJqT*	5cXXJF-Q*+<?q
jVG0|i!?݌vk3}&R;BAiEP\-g|ӈL28i@5A8Yܾt
.Eiug(h> " t3bpV&Bx6hE|;O9&qp-׃B,*O4%R\:bu+c&[y?)qm! A!# Ȉ "
+6Н
+i!`Y bΧ	XoϙF/W9w|*e|UL酁yRI^3}Vvu쟳]DXh0-πԈ%8_g
w{/"NM7-
+>N@S!ᜪm1GicDAZ2d3Ĥ<|$9xH
YEi]gDl	:%v/%/EHN>Q/̪`*[(7?Y6 #S!N
fk_gm_v bw	*3	;cb.t*-%f'8d#"k ɻ4JVZve:2pː{t`\Os}W8t:4;Caw/Jqi{@5lC߇b`}'F~1Rkcr{C薣@Q0;
+L!՜%R<	i<l	:12,D2n'2"v3yC 0
+Y`Z7<_}~E&n<!9Ƕ*DA!W%DyP&sC/4uҌƪhBэHvhrs B&{$5D 3ORpq>eh ej#XV5<C|++ݘadD#0=PG:tm(J`_5X
+7)s*J(ya+!\@	 >oQ(L	i4!D\$?b
!掀a#iW׌q4lG;Oe3Ad<=#hE{.-4yw$s m^=TD	0hgJN:;4J0/(Y iKpG1{ȗ r
+3.vXк/	'7igkLsK ho.2#	Q]~S,4n㻚ˬe	*%Tm
%FRd`F:̀CS3? ,aC`S볯J>:΢11o6"K.Q2lr\(`\5}TSf2	Zzͩ VNfvi5KNSi|o,Sc,h0@y ׬p4<>x
+2{:A{fȈ..(9+i_V0]p
+fdqbEjYh6eKiȂ /f\o~r`Ӈv7U@ĘBc!f$ۺ[7Jht 4[fo1islNb?ԔG8!8K?Dm *`i@SOSpnt9 \
Cy?"-"He7=@)J!,[2v'֔RH;ͧdh<zfzA<>.cĀaxFY9eBi
eb9<xj
]\WV	]Aô46U+H8z.WbE"q	S7`9G# ͍S"^j.wgB3oYV03@~)HQ_dVm!b>-lQ9/+,lQ{22ی3HbGZoE|Z?@+hvd$S¤BY+0Hu>1Ҋ^<{do@؜pf_Jo??da=S[d|L7cd{3Fyw˪/n_HgiQ*s{
x%,Owyg ^F9,F{>]2<
+˃5\Y1
+6B-5/1 eU(u
+Ŗy`f<jS1.Z@FQ=A,1H+/Q[h\d9k.f@!l4f<*"q$
+J=PQ:#s ""<ڹ{M/{~jxkoi6jbhnya:1@[@:OƑmR:e cEVsW UF|'	ho*SM닩 *7OmHֽW@Ơu ^t~uP:2ɭA(<VRh(Va}GIڅѶʣm}N#وꦷHVlRE)) KSJ<wSONAFX*tadtO
ȪT3`=UD_o
+ǒf/q1N-,@5iɃ\ixءB*xGe$HK:X
+4tyML?}yAP12U#? "5~V~1T^C-9w.sWGS^舣)|ŊPj]AWO20	׍Q|J&:k@33sLhfm/cyƶvόf!Fy9P3ey-1pEp2vj
Z-}!Fm,	$ҳ'^Nt I_R 2DY*.KE餙$Nmw=;a?CXw{C.xRerd
`rzb0am˂XZM:Q6@pit2)UX_)-'y`w ˒JV{ irȬ;X
+f8#;75^ I86!cRckHRd*jI]h?O\7X&,Q	E" `EUͭrٴQD0kTeWA)@TBJ@GTCjr~L
heRp(!ӫ};Ru>٧=9-N_nx<&=eJa#MfB{gJ3<zd lq9"y<s]D6GBE!	dE2(V
ݱAL/f|
+3zz,8ZwYoxFl.+Be&_H|%(ũTjk52T2ܫ ib 헩BA9fHm'>;kgW{;`#X	U|ŧbB3&.s{U_lHN
k):LΆ إ)шTA8B uLra?Q2ꪚ`ULb0DBZu'{jܨr-	=˃eVnpB|Y @NUܨTkF[Q
+Nx	xÀGi@dpA&nr]2%^֬x/E"sZ\]H[gVl#hY+F$Rk'RFdXVlڽ.075;dĸIn0Ӛs4R)i}1/\- ظƊ4Z>H-ߑ[N`S:˜Y2@Hqp4Ȁ;\4V܀vE3嶖}nyEq`B%a?~(q䢨 GH1k
+^R%f-euK8[lߺMZ?\['ZsQe/Ra~@:!X_14͔un%P5 bu9C!zΦrt,8kܭM,Ŧ%ժ4Ft4\+#!/xmd*z݈EuÎwsq؀rj"YNOy$h|BhQp {"(yR	+!On=:9?H_JyB}k*[P74h)TerW$'smO<J8
$=SR* g к@9P)x<3_X/kr_}>cޗ1v3NuO 	PIDx 
ݭtE"ISGuT!
+ezvf K%Rv+ZZst:jac!

u{\9g[0IZ[\T+ƕ
SRs\0s]]UQxL<IX]E\b;+qBH)OI1J`vF*=ws{ 1NײaCA8	^ba+0 D/+\;=bcE7fŴQlohHSO"^_)X#=<E4Jc3q$}v͔J~1kKŒ1a|,LcC LcrsTAb6W=
iy>ԂaAPc=$S4<τmomy :޿i?J
@&!<R)[2Xk!}POA_al(3-+}i Wbq^ EP
+YQDxLy!K;P*yX1B ~a[ :hɟ
+'E]m'X/uy` R}6Ɛ`/KB`P >(V
+z"IEgx$4ETBX P
;}b4,#Je`R DXA{3lΤ
/|pf蓍>/_@豇
"=pAE@\dqJ&B"ߕdOM\h"гsy.5An -(3Xy!PGn>; GxJBp=dOmOLRE*ʪ1Vۑ
+_VҊX3!Pל&YF%_SD"(楈:f_C[(H >).$@ŋ,yLF}ӪfۢA8Ȧ]	]_]::K㋂a쮨:!5b-91qqZMJD4ψ5SIz
%\A/aEE`>;Y8't%bk=f\o<|!dT{C\+20)O9
+3ݗPb/a	9ͯqyEkNl(qJVTe@@~Pj9!;/NRfTjcʁ!3W&#
`R.J3iRMHMAJd?X8-A
VzcB)J7cC$:rZЊ8@&OI߂pXBg+a4pJ	*dR8>9^i09^ېIGceMl<QQi9٢$11ocDŏJ	Q 	Kd؟.J!c dynl-н<kT3
4{t ʗe^S$ wO٪\筑LVy3+
+5ԦeAi-)	,C{5`E
+&/9Ɛ|1FɀW (paƭ:滗\hgB VX$5D/&Tl]`6.]sVg2l>	B<'оs>O1[ 6]woSqi/O/j-=v[, УeQ&,52M5
+J	O,jk.Rə6ˬVq^!V&kW@qaP<^b? ;<7Ԧ =ʌrN)Y.,-a8Q%,\	l  H
aZFEedB}l]@i&(CʄǇ;{e8;( *@*q
+wK8+`CO}tH\4&2ξ$z.0@NGobXu#lc2$|ӕ' $L{PmL$:KG)Z`r#-6%>QBBDMlQBw[eJћKS9O4fų 
KAvQz
UHJw\
w\ll~ݒHd)JJ(=4
srN,% Ā(	b%Y:=oLpGF	^^׫{}%O% 5`Q{ (ʮ=רKz7I7kCA!~BMNQxuKŇAlp+w~W,NʖEd-LUD6ϋ,E+OO|(eۓj4ixehiU9G[O2y]˸ OSŀ6P7j?Z19_̖;S64&P  e$u6Nm ƈٞ_I^1V L#S$T.WN
+7앯po,prXT[1{"AЖE$tY竣UL31Q$G>@b4{@6a8~GdVfu4Oa,.bn/# >i1舞(̶!^"G0[YW)t"ZI\E}Aks0ѤR(qϓPldyU!%P f?a6%Fn7JHX7_x cScM~Pr1Qju}fuނ~®'TeqI^dP95;`x
%:E4ؤ\D>^
+SjIq|eT.2 D9!LoHD"gd\h";Y;\Bn>`h		.s=epN5ђwӄd7r	P5#axMɀ3coLDT
g|pW[l!5zAP _N= b8mߜ!d)B˔F9Lpẗd0+A$Erӄ=1s=tLǴFՒe7AgO8rdM,G`j|N.h͐av2E͋IåàCDP|b
+B2y63Ѓ$-ã1~R3*Cxkk=TO1c&z!ŀIwotb$nwo@fcnirfJ\ƐXK%vwN^p?8,kP_xyIt;
+i;hI7oH7r(_-?oNfZD>O[_tDш<(5оBf߇9Hb'fmhjp{pc
+!|Qy&"Č{9v+02$hb8Tb%X' S\NGm(0*Y[xd[4MYvj.EA=l.S4xExn(b4 X ̀'Db	D.$	6H"1-5 PW";}Yr">U' oG tard2ב3'ax	.bش*k}s_zIgJspc?SB&DR #9yQBwyFc. (8fH0M-H6DwIl.D=<HX5_K&BAr];13'%p(uĿƸu?nv.Jd`#+'.`i\lEMK62ݤpU
+OM3aZ
*+>-iIM{d=hNlt}03aK1z%bfB&RgE*+?(:D%uڈ4MOx04
 [,1}pAޞ
+Ø)47j77N`eKz	1䥶aA=X
+B+JCjAbp |/R=֢2;_T5JyBԁ94ҭsp3鷁#&fs\Oj+Vw!ejK@)9"0&q\K-3@FyO:街`]HC0[bL:( 5-ܘBVo2^&;XCKZ2_B$
+a'Kr!V埴F8	MXE6pl0hQF2_`91pm ԂUW7(;iqV2`_7)ǃ.(T'ږNi
+P(4fo@?"l;y(uItV/ohם0{27[
+
+Q#vnNa'(#~@m޹\(ׁ?3{4"[ @L)bYH;XյՃUG?
I㏽)a0+[ZS4ө%"iUD'\sx }n1a d&pa/G %@?pNFq[uZQ';|nў6& _3a72&c5lZ5'!i3,KIBɒ40#ƈ@X(U4;kCCGƪJcCrk	(킼%ʦBGpλ}N!"uRD(@JH*㾻
+\֛v$ȬK61W	]00yO(r"Snz7
Pf%EK=yG]6L>h(H$_+h
tfK q5Lvhz
+pi8UI꣤\#+h
+X':ÌJ3E4u<^nyy7ݑg˱3o~+$[Xh|ӑg3h!N]m.*!z3Rk04ld66q?k?~d`pIɜYܦu1	NU!Rr=BPI>O7?b4u&i5	}{n yx
+<A1	PKaEj$6h
1.Lli#Yu2Q>$Q")zEly@6
+QV
řbBA*Zv[,3:{bȥ4Hؓ9b_,U|"&d߂[1a~䔂at Nh mDIQd?_^c[-؂_/X|S8VR1[8D^XJڦ.:	Һ*80zs%InmM1~{7¬(Q*lb$BY4`@oaG!Lga;k ~9W 7 1*FNYi7,вBDeOP1*ҵx!</yAg+^T$@fN8ߓ⅀0J
]GY偒Ttz qew4+r+=o( T
+o..&Uz-@LՋUJ4UJR$t캵n8>LɄd%yľXL.簐}X[ڞ ک+\wՍKs?Y "c3vGxL/8:M#q?A=.|M
+9n{, S`N*o-ⲽ|6Zrr"ɉc7Hopb7IYH
+as'va,@N̤e]=TD9rq'zz2 fOۯeS?)l3[tg#5DƇ~zQ1,xȂca:!bѱ,(z/
BjЧYSC:#
+e>͗(ޕ\n<eH3Coio\}5TK6ˀɗg[%$,daOn oz
HJklݠªy.Ȃ/8iXFh$y/Iic|L&Ym3ۍDeAd<lt4+P(v:|ƀ;e UP .<} 
ye'> )!,"[
T),~I'n[L#b0MO3<a;1pm7"˴*OB=Y"lTt,BX@Cۋ%{Y$)",%Xf:a)	YQ\d_9Ȗ"pR@-I0C'@85`;&kꋎUp"bZyrNezij؞ኇ4O#.SK%ggOt	ly %haxƟ։ |ߐtFŞ*M(OdD11M"hAtۮ=]xw/pVgl)R\'jBu$H^S=o'~y\ӀSEXCH'Iݞ65:(׽Lh	\\\ڃ^	HPEo*#R-nN/}j,T9
 Qe֋ CGYXè) NPDEO	eD\ų4K	ĭ?\K'Fnxg&B,15
=^B&(h3}i,$uq|P텒\ge֬H ]Bkv9Q[P4m<# kbdIN3/V[2#IbyƝO?vQ£Ua+f$}:&-gLH!P/%ܼ
+Դ@׺H2*_SE9V<C@ƸRha8֦)*읡[wdF#3TҼ"a!1̋n#0V{*f.@(SMClTcX$+
+1*GFZm+
n1 $vKAJG5ȟ!W"ೱh  *x8ulZ%Y	'0ޢnF~o[qm i ђ7@O,*\LD=C'ZR%8
+OZ{c
aVV5:<ZC[_=9,Y@4'p`F\a.e2Y*cbX e`gY*4cU"s`"4llo>G"//β\¿0ln&
+f,Bnh=4p+5R)ھN!x*379œ{THHº	UzIPi3ZMwRSbu͹TD C*з =%BQ}[`QfG9cj]eVMvRG^d}`3$Q{rE<+$n-rΐ_z+NC	~1:PSogf84H 
+vBaؘz\
+
	doX8jz[IЦy_mZ(y_Ա|vFaJaY84KԻ {}"dA@J
P^_$]w&礂|y;6p6ԝDrLJs_	sVGˠ5>; 5~NUZ)`o%DYjP8 D4rI|&w@!o.nrE^^<jiRE&"CdT^6/AhOLfԃ/[	6!nɬ@iq?:t
+\2><D_EVٛ2ĥY,?&JY$X*/Cs|		Ve"V<tgwja:d|ǰݝx4\c}TX`NrFfL?UfWF#|epzdQ;:_~JϷvV|@Z`ϡ*nI&XA@@4]MxZ,BA&kBYVj>b'R`Em\O%\$`3K"?.94hlfbZؘkըb+I|ZEhBP0PR,5#w;orˆ;8Θ,6؉@x(P'$	Fsߎ,	Jp=7q|,I J/<{;rZ(5Ƅ;B]u<rB<P0t5<Qֈ /S)$6)%1=Rl$00Y_$tTd`QhvVfN=={8#Uչ~
%s%`S(!
#wb0J5`qoC0 Am(BT)9P-zV`CSz1?a'S;D-H
+^f DFğN 	
X8M+1zA^P_	/ yY@o\
,6/Bdh|M&8($P	mRΆǀôzד@ǓT]_)@
+r ٬U` 3Z
w-	)&ТGi('߻Z\-"U#Z?đ>5p1Hf,E,/fI3)f_fVNXZ݋(C&-4:7¥I#8P*HsI\y4864(H
+Ob
+(dUm/Y&98
עm)Ilin_U4Sj,>[ƪ	/%K䢎sH1~rI۔($EHa
+es9F0/7'iJ~dĖP>3)h"IF]bX
NO!9 ХP飏 `NE%qG1˝:/,Xr#Z+wʺEǻNRX͊^e5A&
+f0 nlKQ[Wq]3ӑ435MNQsN/[Ye0Xb+6I4F$70=˦N
CtGؼ+vޡQPƈcaU1 3lx?⎗teZF[=Os'hlCrSVLۜexdxxs?iE7G	uB.d:؋E/m	
+  -E8<;f뎈?WIHjڪ?L.g9bt4`é1ɑ@!I,Fُx'0;b`A}hKe	/*Cj+ȝPXq	)-6~]ld2-OL>qN<3w{q
+r9q5	W!No(Bfj=j/ P +>8cqHSq& tI|^vSF	DNkLE_R֍2#ݙfg=k('B9Ĭ\CVa)>D^( [Ƹ8!gSpg׽"q	S(R00EؓXHgPTvit}vV38&bQ #h4Dnw埍IO^(.X8 iQkANR245R.Jw ɜM5tz@^Z۪m[m[i_:* 6K맡H|zBЬ,A1fS`$
+<.Hii}nqGmhH`1p;ŜY~q ɠxVTd^ԶWy
0c7""S#zfРhC}dشnMw=DDKP)_ñ<mؽ:+\ZJ`;A}?'\Ѿ7+GH~(H
O cBH|
+06C	 mD60{xt"ZRg<C{Q
+VܔᦵC(fc;33(˥Ե=`UA
# 	{{JB2ʢ!+,h{4Z"@%-)B{UXnws	BX>AOJ
.-oՄI`<A펝֑ (XQvݡ^a={]XR&%9Ä)ŉ4=ۛ4WE|`8tlowC*Y3xp%
+m=;v(0:`	fc
Qq 0熤eH7
++OJLj `Ưj\i4zj$-U
?_7Ah1kC!{5ЋXZ[mI^:8 Fwk8G?huvPpH6bY^ 0VVH50έ+q2#T`	 ㄵ@πJLƃ4vnh>+dWu[KɘPz>Ra:rJ#+v`F|^+`z4TßaggL]rl&62]9@t&dYl&$'a3sZ~J#&	JvYC^Ox!2QI>Ke&&<Sꨄq7+<2]Y 912(c~*C}qO-p_cZ+5ݤtLekN!
ChW{2J&{RP*%8a8'F*nscoQqSHp)Orؾ
+ie
?yR!>IrWwtsp@C`7+=ܺnhm^ށ:m34%i;4zz32	
K <RL _S%/
5əf(zD'KXR Wxi' 0dĭ8SZyVa -7#\{p;uׁXɷNYcްKh#,=S1
+K\3p+X?kFdn]q3F؊E13R:Ch!΀"\&w>He5,1ÆGÌaxc(a.2Ѝw98D!SY,#<=V -C
ՀT{4VrT|DSc:;YQ<f]ũ4|e] }nft2F8̟?\To%WnҀP1	P훙b+$
z<mC%Q XH`q2ddäLW3:8A4>KAX:UfT.$XT8\<#7[@|meBͨuV۴e3B[8ViXi#,5œAh謳Wj, 3Z  Q],«0lCVDڒ$Q7<Hc`N@)nX+0#q9N
+Pփo{-O4TJjwLJv3Srx?P2n31cìLa+MB2E^/e@&OgPGNd}^rP$I
+~:0 0{1zK H%=#Q8Gtcl#+NT1*H>\a~8TYtߎԒi=5LS}=ADczv >ArJ!,%R~xM
pQm5@ df1|Ũ&쀕qi4x=R!¨2ow)8C "`#;"hgsP=hW[gӿ0=^뢬1,.]vpq
VMf߉BN`<`^'t.̴WY7wd='# YÇf޶K	CN,@kEԐR4H	=)D`Z=,r:
I5'T7kܞ(TLffW+lZ;-<b]	yAdXZ ,"Q9ƌ:Iz
+	XmiG2}+8ikƇ+_3hp4Eh xNf\Wz\Aʩ(J}y6'|p
׭XxWψT"4("0=.=5͹em
6tjٍlӢU>H&,rϋ9GP߂M:e8˗Gj~y5-~PIN'b<m
+-s'hX\M-hNA`2
+{8b\\CB'^h],-J|漃G@cz$2D_@FLǛe[*XRX֋֒2x
+  UHPqR[*v	7mA(gp46(312*-w&ID:-/>^:i|eB PU.{$6{\@*t 
,Lv֙;B;F	@ztjE┉5K(r!fiĶI|H(,ҁV}q3n؆ِġ(SkPuN=aqR`g )@T̃펖90atW85crtיev]y?0*uJF
+Y܎4ląZpv䥸C_'-0/5Y5RĊRaVB4KL~$@iK+>3w4u?._2MK@E9\G8^3#
ڐ\HqNRW 9+.-4$O;8si8voLyUlo
+Ó҉fs#4j1+klћ%"t̗b&oIRj}F(W_Sm&	b}r x]ZBFEsuWi}BygC	MuZIB&TbX09==.ɱ9T%.hȯ3v ԢJRrM1 gmS*-4@#\^O:(;
+_oῇXE`pk7 i=D7RhLQ>	֥nÇ@7l#o֌w	a8Ł"8&aZ(/*)	TzáC+PPWc@H: .SrВw*SګX: %[%Vz^H?E08OD݉j|oT
+H>~UX: PJc-xi2`1ڗ<?լb,10bK~#Uq_&LUcZAN@N9 igX9j>-B7Bzc0J?;\'{ArѸ`U>E&~& ~"4S9us2a?AYUbJp@}B=,Ns$/hwy/^WWUמDfPHYoZ9
MB[H1 ]5G"R4hC@/tKx2=e fd.\C{-ugWH6$32L*\f8aT% 7s`VYI$e_-Uj( Ҭ|RJ(#S{d&$?5H3X]k*E8)1
%)HN8 ˌ'h?/(;B:abxܔuH`earHL${Ckײ1a(&m7@^;"&-O Z@Hh@:%*PAܥ$+ ѡya+e˝	UIL, UsoԆ.O\Yʲ3/#8aOdM
+;1RpquPʤB2S48RDNUu#9˫D,Zu7ԖB퓨AT-VIHRa-zmgaO+ёV?LM	X*/)`UU;ws yh~T,b}EB} 
Cr/,ɻp,o^v@=]0{vo[4~0LMej0p*I"i0]o2I"""
+\؟`M@Phbi^֙r3	x(ŁfR>m`k=Pne*S<\.И_Uŗ*1kOjb6=C*@kQBcyDePBCBKfv^8h[Lx=Xǵ$"Zndi#	1da+{{Z<=;ohO=$AV㒝E4Ar͖mkn&5cve-8M	-(77\>c@/ސ]^.,^(W`:Aϭ֚&9WxP2ږ24P;j=*]#f^LE-0{"Mh+ ob,&MI1it%ˏJ	cXɊd0v$=9\s4Qs<)3ez^		^OնopzJH[ٌfDjI8r%ZSq@{b RǴ'2M#$,ax_6+檘3)HAgԢb< {02:?;RՌT0C"磐eUOdnjɍ9Qa{nQqyoK4T3Sw數ʬ~cJW&`x|rX>v4`k,KW J;L''F ZX-恭W8w*$0&2(61YJ7œy|	"
+k)
T:ܽx0ng+
+<`Ծrs٧RQE칑~+>|U-iL{ŪŊ+Z 3DՙQ^BW]Pr5.YUE'$k51Y0mq;G&9X[~Fb̏=	ئa2 B/H
;Wt+NwFg1u)ˬ:@ZBgf	&[\Dgg )
+j<e/uF/!*jdN;3%>ަa.)H'pߤ kNAw5&K^h11=O5lL±'l/$+(izzAhTL.ۂŋ@C8c
ƛ^eC
v"as2bXF";b6/Ë,mT~][L=2R$@+Y@pW
+ymf~CX:~T
+5
JPB,6wָ˯FHM9Axa %4|559||r-ppO 0Nfgz+1(=
!Fvo3OqFтc)#踥½PmW>;٩]Y	SC"YG@TF~6^Fx^?ʎ1l
 3l/Qņ֦B$>hTA@	}`3	 Ӣ kx&\A^+>aM^u"
+@[	dC]81O籰7!m-->\LFDDĈCշN	bK7E@nlb'*ɕ	R[T&*)c KF	/`E#w	ۯ޴@R<;,(~qaRMpE&9'
ĄC;LUU0g7^XS{et)"o@"qfa
/.#b>CxI sɓrsGT:a#h+ F!N@)ȝFnI<Zr^]9/) E艸:ޓl^䇖vͽ:vےa!ݻ$$xIX:	zH$8B1X꠴f^>wuc3qIixk{Єc{mcFK5/f:n`
+V<Ȗu8k[jBԴNPr+:1<vhsN
j
&n14`~}Cv,dKJ$#`{FfZKZ`rs֯DkF5üusP ի
+HoY\xvljxjTl:
;!tJe<VBWtH;)X;0I{4MCwly4
+!Q0UshV]- IY\
kJ/+MJstJ&XiGʡ_a^6h3kzVb}^`rQW̱Hz5.7ۅ_ύTCaئ.8%ΩL͞sZpP-Iwv!Zխ,MP8c:5rڢ)jTHnڳ	(b/)AzV~9bSmlVz>jQEe	gF.6{&F(䰂ʶs״h AYFMM3	$
+
+=f	lN+h$^2ܾ\+Zi-@Wj/kk-H =0gUni%k1`>HK\3*K|1N@67tN&[MEhd@:owIce?Zs	]9^MT`KxYX	doXPu%һt`>Fîl/-2*`:R>cE> gbl|bw4h0mT8]-)$d'%>o(1*^EaG֖YtFj`>\<:W^'fb
,erʏ!\}5qGr͎XfțlMgM=ZT?_cJ:=rH$*5t򳐷8'(<&
0=
+3r^I.TύaR7KZbc?ڛA< oP,(9Oe1Q,ZXLN1|p 
+C/2sy(,DDN$cM`OuBp1/*{/:Wdג
+rVxW*3~S)Q;;'5ZxDn2pc	Wf)y+\NXöNJ5zl^ 
X'IK]`Xe>ܱ?^;JKw/gZhO<z\ 0_z>ώvGbmIh'kDObHWض؅e.kp%'I BnN"n$_P_AuH+-@=?vu&{ޔ`?N)K"Hp|
+B"E3q)+Ґ;Y vzD> '2ƈe>>:uY;Hmh`Sˍ`|C<jse&y5'bgV%."Y<Dy{Д^0nXn&tx6IA
+GEz!-)z)X]	r,9XΏ6'h菁{mlI7Ro&iBN/^n΋f]
+HSy]|м S'`TD	JD@I$T)2k0waԄ'*W[q6NyCʺM1)*K56kyMbn{4<>VqVu9K	Z]<#a }
ck6Wjއ,,dN
!M>muV*"U43OrG %x+`xJlہmhS0A$0+
+G/mx*2+ (mmn.4>ޢ8<Τ1sVd<5S7WIHP@g!RCx
+ق`Ywޘ	ێKꮕbxB~ #Mr/
+EK
A8TL|ks\v l2A9w ]HtK k՛pw!Iq1;gbtQV*'瓮^[]_6-mעρȲj !oi.cM MoDD*|96(+?¥l%"zɑ#C(>xckiQV	6+-KfϽZ82;8PuPbM
TaZ6}਑NXDUf?V[2c (*0J
㝙1)LvU<j)^Y	"95)T!@DE*BCya<Co\P1Uls좾MYD
&=62[dD7QInl,wkP"GHJaegf!M䣱fpu֫9Q,0dTSFni)1`͹w-%
+RXB.5̒=2[big!m3T?<<5lnω,	lg,>΄P-<x&UTY ?WgqѸ
+͝H,S324o)W!1IӠ:etm3+KD=M6p2	+dЫPpUr(;!Tj	KvΪƴurYs54jB*D]d:B~A{h3(@iny<aݐI
XďCۢcށThDfBRf!pseɇ.2$=O<J3zCBN*W)q;z)Vf0Gft Uu:ZBT`]K>V\)-G]yDY犬CZqA8
1.;5I=r㌉8AYh]/J{2F@.Z&r9dqyaHeQϑVר(ҩn (ˈ뎋<<"olqU+?$i
+ݷ͞K@(Jvm
#~ɡ
a
+ 77x WLV-bjT7/1bJ%ky/6fj"xW9UNV'!z3(U0aYb`TOt)(tWIi`,wh(@yoDȚʉ¡NGRSrpR ɣ3Vg6I
M{@BH n ܽț,O\JrJ嬙M2IGdXUӥEOQu>lUnJQhRa;b*lWHmVIJBjgNEqt-^͏}'آ䢦Z0@*B,^%s
(ɑ<z 4T8[X/]D@rM<!p=S4un8SkP^
+T>m~驡_Px], 츻(dW-ycI
+Aދ3WC9g@0jҁ@mA;\+~3s`
+	QA@2IQg	kK ,dC@u~ӪL2Uuqg
$BN#DE{C&5k㯵;R_֒[1uĪS/e:nQƋq;p1ker;.	SCxA/G
vد2cX-P `F(ᛦU~܃k$@%F2 B<,t|b$ٓbE @	lWV YT@c]%TO0tl@b3R=b1C"S+js~A`dcAn<GKL~w qZ2sN%rrM_KFkR90q-YdmP& ȓh7$"ƌ,"ŨǔP."h̰w`"JA>R1/@+5@8k
+1"%&!l{&˜[TDQ1itire)XѴ1@kFh`@9 Gk(CM
+IPp3	Bxg D-z c.y)ȽxCжз['X.d50AL4GL|_E4|h<?fao>W2Ħ\CnLQ-rFE}I~jw@0jEOs%yQe+#s	C1']i!apL69Y5Ծ=0!Y"Y8i
+T4e/sTL3sOjBz-?dh9xΥ3,9ЛpC[Q>eN^(Hqqe$;C2^֘v^Ej5,O3,@LOh7eQ`t=M *J4+-*'b]~՚_Z4׻_kmf3W¬$᧢jug#"_حpalVě7CL9*3&k6W4}۷BmP
+[a/i"7co@(!Wss̗EIB^HA*`z/$6[7w
p2sGx9{C䮸RFX܋b4n0ٱ9[iB87+Ve,~l@{ 0 =jfV36mA91:o6w\ ًaxJ6<MӛOu:Rh[ApˍĈ|Bnl zf5+ jOC伳IK)%ί\hRo'_Xl%Jys>Z%.馝ĤNáQI0 :3]Ϝ>}&@KZ'5(
+$R1ly',d5|WAҋ6P/ڦޕyoa= q;hJYi(nZ㹗\n71Fum	>mAf
oO]:v ODbQHݹpށ6톈;Xb'~A(q9*P,@3	~jlv<6~":~Ź"N@ݤ<V^e0O5Bk!,6siS)q H?&`'|LY+?NU+Dk?v7B)FLa0'
+(FbyD2"t(8Vs֊̲[$`OB6XjH.\%ˌ$/f&Ja6BNH	AyMBa˭ͯ^D
+ ndɆ
#xzK!hd6|
+dV^ ބԘdum ː ?M])H< 
 nXɀr#g.eQJ[*HDoX
+/k@tC<+6[Fg*r	; ūHSYU&Zu%Q&Fu:@{΅ڭGth&.dJ)ӕ4)S"o.b>
5Glx)"1mbd}st4` Sv[iǝ\KBr d\}M~6\
+y3kp=`ˎV`l5~\=G8ۿ|`uMtFtV9Qh-<+,Hೊ;%\h	ҢU9YJ3aQBC8qBC>.x>~ˇ~?p"by&B@Wx`c6B<B%G=(]u>"-fo&	/i/[;>ca8pt/\5zq9TY5Kw!#]RSs	G,]zXm/E /Ҭ/j"-%qA|E4B>o9H>IrʺȪWϩdExbjyđ ~i?{^9Nw׏2jJf`	8|#o	 l~T>*l?r]"wЈ]QUp;,=~!wB{SX.*-">%(T͵l1]9v@{6.-M~=`URzj5Hi!
\a^1ja~g4FiH6rY%wbu#bs; ?_jPmspZԴ̤
+OӨ	CcK*z1,>ՁQnh	>;ԂG!Tc^*Ѹ c RJMb	+|E
Y	B1˔
Ng}U|C$m46}Z9$̆s1oQ_'v#3%a%5sTi~qS\u]v%	J?355@>;]!㑱X,
+5Cq&'fxPv4	v_v(bcn}g| ;6?cx
+KG5rSd	:\_=L =,ˑdDnzH;7B8<ثq0hY;5r}9hت -Ƚ:;P۳<yF
+W>FLŶ728X_8p%~EHm;HMVm8@\Ʉ]Gil#]v>
ӵL[ÔC	
+Ăv `L_E1#P~<o"Tѣ=r
LB)'3b#`Fĕ";=Sꕳ24aW=!/mwL󶛐g!uI4/	Ǫg)֝VGobh?%X7 VG	Z V<p514H#=ᔃ;ۀ,2B>P,!e` 75PHOڪ*#Ҷtt-J|iZΒl*bNǨQV\.fzY
t.ǝ{HQP7@d@
+%S@(jl7@7$(XK*`d\ki1p,D1#1^5I~SbYwe'4^>EO+ W.9eFkD_n

8JuKf y@hzCӓ4앢21߷	 YF+*GTs"*%,:	)=17bs=ʽR#WD\f"W@e􋙿B*
5dj=L^!ox4\(^A=Ï'A}"w4REtZ)#5MG@PncwgEELrĆҁԃ_SbhX
"INLBBG4mtJ@b7A:Q=K/H6IVYh! DjZZCω̥j8A^5UD8*ZHOwJһKxvZO@	A( |\܀s "gM9fBVaq<٤0D,KVP4gnq,vl,}Ƭ|Nj7<~CuC;w^Uahҕ;0U*%)Sk^#L5c-Rn1#jIԍ~hvlE4bzǅHnE/&v×S jMoW"tfYe`(`^A< eW-8K?[qM/{V˿z}	!t
+@#9Ml}Tyh1֪IP사S":}ld>8{IIO7Q?G8x%7x[6bEUX/ TfF-&UQ^FtK&_kA MD/+sۜ7w{?OO֝GudP۽%$kQUn *V>wwaX"H?'cÆ
+z%Vs9ca/(3p_l7_AS$\pT^s%;Ayj(`>4A`ge,>K&cK7Є"h@AA
+CQ0`,!/kavOwBB<n?eb[`]`=z?nDHȃq4<rk4w>2@@}blIe#h@I9N"I(()NUǴvNk%k
ljMd` 6HuzAZu$_l^=m
F#iY`f~<=`Pyn(Bހl	@$(hԫr]JtF4d
R- 9ד!G4j	4K69VPDKQ8h	٦,@jðexG&^`hȝ	C"Gh@L`: 9qvlRA
yv"VsSCz4@ Q h?ݒI]B]a?g xKWDDBp_:bF6/T!pH.)xUp/9L<T`pǜQ2"
甥*lQż`7SSrnݼIɦ~ [H89 
+i
+&C4DϮdEu)LhIVduAsol_(F9KtXA@,4Y"x4lF\;;dp2	,̪ҭ˳Zstvn`:!/B/-~BJ-l(K^iYFV++1=*`,X뼈ã]Zz*䦙`u)r
+G e{Ivv/:	m8bT Zӌ	]^6,k> 4x`K=O#=îLʴB#F\RFh$j9E(
-5hC:U /^iT $J
+p
<R4/A'qR_aȹZ@#Ⰳ֒^#pEW o@0qsx!2?RpH͵Ghkyowf̗L5tڊtB&U28khf\(
D"Ds;x/4ws4Xr$Ib@O$ɨ#|'/L$.3#3^vQ6KCQ$F~-;/IotZSQ"bCtPrdVvpzo=懪AY?SULQ 	H !K>Kn	!ulhuG4!L8BI]/FX:5(M!`A<.#͒3\<FeA
ݴ^:djGW]U&_=
'~[q?[nwf?爛Ð1ucm-]qxa_͋#B"8^sՉwymzҶ6t[hD4(+6t
,]X(jE7ĤLzz D]=zTCmu?0V/LfA2iZB=]#
+19*ErsN]Ҿyu+My6di9r
+~.)c"ݱ+mzLCxDl-f0IjYԁ*~>img%pTJa!>IS*{X
~kN wL<
1_8{%5zEB@qO2%	Uo {ұ=PQ29Y0!b	;n<9T54!>}4О1U33RNa}bŕ)jv*^nl%KiV "Bjkʦ͓>$,pƉKg ńÃU!q/-
O%>*[.`mj#gcU;ߤȒx^̑le\[LĐܖ<w|ЁdWȩ9P_A[_xOl(o*ّN8Yɡi)^Jvp}=jx3U(.s<hdH`-ۍG)K,=F8>totKp
V<Os~xיJ0B
r6'`&Cc$Cz
WFT-.Rtе:?Dx}SjʗP8_[H|4%;!&;?=Pޕ{VwW9fO`,Jȹ1Rǖu	U]%nayD8BeQl{giz7`-]pd8Mlu18D Қ?DLG{PJ1HB^JQ
+<8n_y"픴BAП,
İ5xN8((a c p񞎁"{MqSBRhyܓEh_\: rp81)ۆtC,	vj6u[KVʹV-$B{9y2`"P2W
+~M(Tf6V,U-n'{cAa-&9>s>\2DJr$$4,	Jãi:i"/N?9j]?D`T	w1ӎ!
+: cFQ)`!yUzJN\RQLSVդaʉ[~B:0PR&[$ؠs.{lŮZu]MD5j Wyp2.	juO=}L[j\?Uw\>DGӛPS)QxpyXˍ/6SVM-BixQOjcnJyl(3y?6`N,>uJDbMC8,S<J S&%!x)#r8
HPf$Ǭ
|76t b\=k_mf`!b^ئ1S1c
+Yp
a@ɷB,~!%ES=ЂˑFy.r!,s(%:/d$5<(!ּ`͋*@$w8caX1<][xJ}&.7,,#+c̈ZQ1Mt?ݬ1;@Ǹ:)ρ'
+үmf12$pC!}*VTe C~KҬ+L̀6hל$`Wű)O'eJtdlKz=Tͦq"\>QG%n0'3)w=!/fLeqG=eܟΞ_HuX~[XvүB.؎kcnVVfs*	鯑B0q2ZfmRvVJeЋ#"oDÈSI`:jwT1}r85Y4ưǨ`.7
+O&V$FT_qʀ,Sk<ou<=m۔'$PH/%l]Ƨ"ejHgJ^:u10h_2ݟ_E8EsKs+5K-º)3{0V9%:=CX$,"B*|n؎a$Fr2HZyb
+R+E]>Q

PF%1en,Z04f䆀o_'W΀x751y[SF<a\sa
s=},|䂟]sG]r4]nguHܗO[R=7d_\\$8Jk_pRnn-G5ӤEQЭa:>={WW+m {ClZN0;\
.㟻*^d*ѤI
y.\&i:*O_@!;٢
JZ87g5iM'z]}, (ym"ǏGU_ $*LyQTܹI2-o`G!_ODm̉iJH 48t)fI`=bYOշJ]%-]w
+0 j	a]]TZ H,]ό0 ؤ$K$6ߣtez9sy< A+j5fun+x08bgq8M>Uu7\h׃d 'k&#רZ]ɹB]t;(	L^AboM攞g9r
,Ө5)a\(Up8D 6M+ieN c@ZU,e<\pL*
c 6ˁ'/@&I4:NFծՁܺj5=fd-O7J;2wj%Cp×G4^E
+H`/	V"=`@IWx07Iuj2fCc;kVztC^W$iwI-@bzUwhH
+sBծLCk5#JYNPSwwTK{>,!8KPSPٿ36T.XpOyu6e4赜lIp1P `6*6<>|)7V1+ĜUIb/QÅR?4娍jTy/D21A4Z FGLC:uƏqP~{19@:/MYI
;`{]>	*hbƻ-`[,JA&
+3Hk=@%.YF*D2(d޴둒-Vw+$آ|*'%{K@0&\(KRgMP^rG~s?9Q5Jh|B(xȣ#AV08h{2  xD&κ4WcxRNM=79IK(v@@6ƪ{P!U7ulLO2^:!n^]rlXAp}] )O#-\m*Ҁb^B&"K+"L#&6pZ!!o#)лQML!K\mMv4<>VCNe?!:NMea7YqyOBs˱37؎B0?"0Jlʂ"O^zZRp%Q WC2bld@h|6%yPRu1
g,Sx9 JeOK,ɱ
xJSbSBR4.L6Uดk.6{> aᔹ%
+otϲSԦhI)A9aa9r8ĉץE0QOZsFGF
+af"=[,f{ql3ч~AatC]z8[WE;meR2ޡF}1G-2!˫p۱t @yR-N|RtC#r2ױ~/bwμ[+D )LwKTCCW
+Llg,qHByU
զ!VVj'_6+,C11;8ɏ7Ȭ"\GR%  pvk7BD뽱ecqBQJ
th
+b<i2펳f@'^-Yoi%,AI/~)rs$X; (&uP~$lI	XР4m7u@2M;qHqu- eD3oyU?ݦal="Y pB-Jy>iq(P
+UP@Ki	t;u׻TqbXہ:+|UmF@)Z^'E1I`^dU|@mFiL*MӏOcd7=K]&ECMIsG`$+hkBvDYVC+!zѸ)-Dig~P
+6co1k7G
+(D#b6]IɴۡhacJ>Go(ߣ*^H&bökhbr,m@4j%ͷ|"gm}-EADj&d#MVXAWpQV{f=,klXe|H E4FrXpm~1f,m;׃P\(Y8r(> PU$OwD8IMsh9
^U,MhQȒ,՚ozbXs >ڛ4Vؤ(WJh[Q\c3e/ޮi\wT_4# 8447,6[M577wt,I _{K9A!H7"lmɈ
+Cnd26wcStn.$Ih'ԸO'{i!Z|x.60Ur߻et~D"aރvd<8VepE@p)z6NmBeqEBÑ)嚡)!惡mIVg=*I%lp"2tJ4HdO}PC.(-,r2	dd3IөLꆰsJ/uXwpFK tmd]ŗ*}8ngOvZI a
+J!F'UR^y/%`p$
堍eSv>XPKǆgB<X>fH>
#0(J
	p[:%5;=-*,La8jTA8b0ݹ(hDk:s,\JFׇ0L%`^~T^"xKWHqo$o*8eAF?
+@B|sz^xJkÆeb?d>L(-sh-
+M5	q"YY
~*$
+
#5d*]2]0!_-,N俺Rb% )wrPInxs4d)q\}Kÿ!7BD5b2-"hICzMwBxeuG[xx
KWx`?}	ow"
7ֳG%fJ-E@rD=MG]A[(`ŌJND0GjgPnZe%ڍjcʊXo?ŌP.qtiij!.љPy=xJZOwGjHRߥp@4m'N52/c,Io?¿efB]X	S]g
2/13C
+gP2`:an
+>Y#YOOEM %9lOМe{V#c4pr7"}Y*8-y|N4Tx9s)GK<)Pt9U*}7ۄ*\챙,4j#v}efY iJ#(gX=i;lҋJ0I{'pC")Gqs2~@w^sxqB uFR5@༏	#B7[2b1!cG9#zq兵юĪysPE_U8oI<	T;KP]ĨgTY9I1[1O5k
`@A446mNrd&Yܥڸ_+Eh~,.;r.DE7m5L:lIz:'[DY蝳;9Ks
+'O jDՌPM!!b;,

+@!dTF}=М pRochcU^ok@ة9BA1D|?mf猠;ݍ?fdW^aV?In+&
+NчMfYkM)cc[3EsTZ|SKmnbIX4]~1~
@?Pˑ'%hAx{(eʮ :yE`ƯÎSWԞ!6hCRi=t>ǁu`GHAxuQ;FGybm]W[',?#L@x]h}O{aUJU1L(	AlnKO Ϸ@kjB[h3 F3pgt2zDg4<h#d+ ٰAaq,9&
+H&<͞=88 xt謅\P@Dǜ?4'BV[Oz
+`g*ieHJLg]
+VlrS"a9oeR1mtE~WbAxc)**qCd9c4=CYSMծ~X?_<`Wzv5A\TI6mMNtXpFAHh wňm*=-\zq4,s,#H#}b2uiJ%VVdjNx{.Q*04(jBoL3p4]>^jLR-oIC?ɯ;r=%JviM#{w2y!;<};rG u/f
Sy:צߊ?K|WF7sl#I0<Z׃uIulNI(m-7\4H-s8mZag3lcGADROfA+8!+8郌xV&"?{r&fز]!f bW	G_giCòzs,of?qr3JP~DDDϾuf%.UUy63PRUCAߢ^P]C@
|fd[stV@給5"@aFŠP,ab" jY(Ph#JԣOXz~Ki>+/O>
+o;\P$ПN*\lH24Y6e
|#гabJx]0P׆#WoEoB'([.-Kv<1jEEI dZ*2Ie$)LF{l50	Z*GI`&e\Ŕ
+5LWfOcyF`xBûvNRY<#U ]PcHLs,!'9th1hWgDɄNp3vT9BD 8Շ,A
+dc{\ɫXEOKP2}wg(-uV8%X\N)6w3X,(+f&滷-B؎Q-s/$5Awz%ND)lQQq}RX*H\O* s֊ݜ(£*["%JXΙ x 
+ȑ :??4&EB
+hX!
+'
P'ÎY)w\8:lz
+բ hCՕLTW?,;$YQsik!c(^bJH/O7z$SrT&U2'_*沨bV)HuY`NΧYGY10v$%-ld3vu(8SO09fN~;$Ȩ]102ɚ!
+n\Z_Aj L(Q-+*H WR K*vtD,D05@EW=w1	z͂+oOe)P2&-qβf)yZꀤKu-5s42OnCu׺:C{5u\Ձ,0̀>;`#Y n
+AE!vu"A;{@}5Ad. EҺ{C:$OMJezT)g2IX~@Qqgl/wxlz"1!g|5J©q	t:"ᤳIn|HE|$;EnE_/ .@GPɶ)p	PTo+}J4v@YFNl|,$xM%!(3E'FCfER("2ia|l
+7#X7FGZQ@>&0/+3jqw闈
+rH=d^	r2^XPy՜@w+NXX|/i6=\WBސ(1")0]FD#	tjDcݠ|?GkXТAGwGirb1h~!m)-R/JJFl_ƌ4	ԉJ4!RpMᚖZD`7zs̟b0P_wrjy6fKSyĥAgYThYwN>	[k6/f]
+__ƌ-tAG(G(A㦭~&l^(V90SpI4WMk|u[zj>DG?mGXtE':Կ',tdm=;h~.""-Shxzt/&CW<-64_bNѕ=ܶU/nolv\A?yzN $1qVBOBt1*pȭ"
+`~:HFA*NҲ1^E陭"uJQOL%!Bӷ1o	CL|?fXA xL2j<,wY	*6QtBi lg.^l[`p-HH/?Gu@5,)啛W 4r(}.*IH  FY7/T0Ǜ*U悀"FR쑏
;yZ+#}{蠳0dYLTP]pЖ.D\BZ!N2?"A\AUHͺ)*&O-v|D)Wٔ[H͔-7yƊVƣWQ26Tbf/Z	P,NE;(;5E⸮A5lO#:i\BQY{I#a)A35H+ao@337Ќ]*u00!©viS/$n9 /
+Qֲ}R*"@ZHmBGIQ5/6j^kiѺs"߲If!nYI|8ءk ^(Jԟ͘vPWvl0!qȵӦ Kug^
+<.w
+E6Ug+{fDN^%`rt1c>Y_V"_,_ZQal{@ЈIUbjynOX E=0(ԘFG	P<kcQnhhd$Yl;Tq<(	q ŷ>B(#P	FQV0Bq-vPt
6R8(RI1#/dW4f	HR&^6򈗢jOɄ\ֹP$'z2NE5!>	72^
2I!2&P!r8NYh_Q=[awf:!P-II8@;&X	L!a\	5̨$V6G3t!<I,9uu2S2Tg{[vjK
+It)I{-H%0cd	$o2z8W9Qiȳ \;bSG
+Խ_7P_U-{(耔XErHO.Gi/Лţ\㾗ؘUDAPpQ/kvVZg}1
wˢI%u!U6ҭT)'L{S'o K$^pʰE_BH'([0$Ud+8<w
5Χjrcq0GMQBڣjǊ.gLwۄBƓH)N7G;rx32<Rӵ+8#$@DvI8Q}
	Zv]=u%%\L:O99=oІ5;	i}ŭ ٶHac3DځOS \.U_<y9c*H @/IⱧ^z
C ]BU(MYn1UI?`M.
+\6:<c.Ѭ*32aa1K#?@ώ< {ݼ(,ByA'ңoi	ǕQ9A~Bk(*R4G>c[BQ-O=A%"SbWZ,*6_0KPt$ū$GZ5Xqȭo'l-	\:D
H,qFP\:gp+ө"P<]`@$""9إu,&p\YIX6 M"Eoą!ru@Wo򸓙[a`HK 
8Lf\x4lґ@^=80	
a
+?d{Y$"B@0^)DkSj/1z'}<$Lf ۝`"BB٪JD
6'!=ULQL!w&[AärZp |ʽt
(#kݏ}KÂH[eՁ
+|ZN$iy>˺%j&%[Uq1XaB"*vTgC K;  m
+QN(O&h#!!0w< kWSWy,QCK[R/UU<BvC$ DO	Yup($f>)P O1<gDK_!rMcz	QLb,8Q'2y~>18"& hcu/BI)!ңƦIu6wHONC؞.pr`"vg3W8`ص8:X/Q7:UF_OuN+mtlxB_ڃQUR<k]]JR5_0ArUEγnTUlȡ,>Hۼ@ 9n-e`)"5	B
.P-h+YCߟn|.{ﾡ=U%($˒G3S|ЄJ'g͏بE!הD+A)hr3rV*5}/!
+'QTߑlZ(z{7`2E͠J>U,nIA2!38cK "FS[7ʼ>JDF.{Wr?jK\-͕> p#l"װ-$)itW7  {Adt,q5,~S+И
+&CorӃpة, \#Ǔ҉%]@P7VE'1z]Z{._SP֮?u)Y\P4NLO恒	>wǱTCoWe}\9#_8͝6J7A9
Q1meTۯ*]#eq}7Wl9Pbfj`3=eN}6QqI΄r(IrZh̄Bj6FwH]fPd_680@twW&KEFF{z*w`V~2
+,`졢`GDQyodk40ݲx\d*t2C՛F!/@3qFUC5ȦJ4mM*y4>b5#&LK8s	)Rd-ִY5ܐNq2low~ls$k":LD
)S $/NA]*Έ8Fv4W ͼ
+?ꇏl̯KÆ
IF@W.u:@1M n	g\_F@S^Nb8QU$-"̙!&Bxw%V!($#vV8МV_X?@,om%Kkbʲi
+{)&z~V	QEe4tAvQm,z@|8'^Irs&80-LAwT/)M/R;pPK  \8JqUD9
?	EᅄM+? a
+C%xv3q/M`jVb!
P΁ .IB@1 ?~BAi2!ߌȾ$~_	p<VZG (J@$"	S
޷ȪtlۂW|Dh5ة-fIrh<WZ1!\	t}L.C̋x	okhS ٿ
+Pfm;@4҅R6 j)&ױ2¨4f":ͮJIIVD;%yѶ.y[̋ErBGFޕs$83gfDSiu+HSNΒQVzf>5itWf81Lm7ʊ}jN .sluKx
VAf
+&	rmr<B6s<<pi$ĐK*LNxBAʵ307)|G4R7n0^̼^icD*2RpE%6$R,ZwPv6%TT'[hH($h9$LBbeB	Cv
+4qGCXA'  cY3@DDsD=vF,Dۃ)ab<NrȆLY:&0(F*`i?޲(T6$#h/:he 
+N<b'4|LLbaʹb@\w)@\2d!HX/9ż
tv<A`d@NBr5 ѕ,T}U{@l%ѢEd
ؽ4UG)ݲ_g ʝͤbgS}Ҋf4.G ,A_g0{PeHD,2=h9=>>Tt +_I2<s##q''sIm{W/x9߯#bC
\Lb*|#ve8nR*d"死dV
+YB_P%.UWt\e0#ȞYR 2iF_unjv䞊qha"03 ,Kb L
2ݡ'X)/ߊc1@ #l
+$Ϯʵ$3Ғ+JKŉ//`ψ( _l-G-ړ4kM+Cnؠi/kXTƗ"d OyI*
+K|av𳞋iC1ĴB,YRŏ6R$C"e 7A)fb0 Q*T>l0uXg+	{^`B?$s~Vo 3'A2E R,"J9F+-d(v˸M%-h~
+lЍZS֠3Ru8"2n'h̳ƣ8L:9\󶨗MεÓ]Ɉ{S)UNkP/AOO2%_0 z`Tf;m\zz
+'-OIA,21xѠ8?N^wUIIȖ8웙xdM~ZOg6`bf%W'u`GS!%ٔwMńl<	!.݂N
,W+Wpx4jEw6"g"ikD7m@0߻]=;};w7Le3")e?7S)Z%[k%A sJVKdvˮ,N@n
0Vǂy-Jj;cu>t:
+-u.m]
+zK*V	~.;jI٘Г_ N-6aza^):Rh4n#<5#羣$C)XƚbbLc~G+֒ T.#"gH"̤8Q	 ChWIb=w \ip*63x&>tgojv}(>Lc冘JmG+PQ+tH'L
(>{j<8DR
+ylG̬X?r #* vc|:Tb}P#}@m2ΫʺubA?}M~lLQnt;;IA1E&,spVaicԹNs\ۜ֬{-A'ŀM
R%FkuYC&}:/,Wb N.ApMw50 - 1%'¿{	bK7pn~90ېums:B<6jiP͛J-(fլrj!&hcv+v0D锔!/b9gբ%1^!-
+lQ>wY5ãRj~_
+X [Dϛ
\?<wG7l*ỏٸM}_fzaӞViae$UWq%bs'i@$a&l.$?YV7=V4|Jjߎ/{ѿxe.'+++R[&=sEF>.),JD">ހ [JАUBՀE9HVy'^e'^ 4;H
+N9=%۴Nx	{rWZX"GSdAY5Hj~;% Vd#lzbE8b+By<p0~Oom@v
+JSMoqճP!x4Hz iT#
+
Tg?H!iּ?&hƟG_Ājxiȷn04P0xG(i#&9 =nL:lLv()+Wjd:67Uh
+<TM@D{,TAewH'|*[hX+AbτȂ,tjhZ96S0P"cwv"r+C4?ޣ|eq!?+r
ulpD'swUP(Wl86yGAhcX}G[|"aᔯ,$<EbmuM}/L5 i9F$] dְX$F߂4xZAc¢t87wt٠W1Jz~6Ԡ%UXF
k^Ppûߛ=^gWY Vxl&ѼsCsL!t20'@Vlxb:$NYPgޖ3STT !?77
[bnޞ
+U6saY%S*:C qJBr@^LԻ*("u
GY/]ggRB~ NQWSk.̦DT''JN%Յ쨀٢K$W*vձK7;96mD	[kt^FcA>rkؖeFxYro$" 3XJa\M'H}h&@*[gtXݹLJ=9Mˡe  8#͊oRpqR	b9P"(Kù4&:qq7AyAGы x«čD} 鑋- i,+	 n '#Eɵ~C>8OݕPBg	 Xh>evjI ѷ
$
+- C&Is$LI\p!yCtyo
+h&>uIpl;P3nvgPQU1JM0_Q0VNP|G^.PX~˙a8Iwhҽl0<	rnEF>9/تV(CqU!&XRT%y[6bM`V9
+nIFu?(%fG5Ӌq55C_
+䕝Y1iI h\8SB%}F%dK%[0S!) mLfG	x} @D$l7"9yC%B]p:Ɋ/95$ 4ЭYO0zM4VFYa_PH-kCgp^sqն
+	FKDrÊ-fFlq܂T}zN7⍖Q{F'sgiVi\_*f*16[^^23)QQY8}.<2OO,z*}	(
qdv0{L* ;3_ad{W|7YGM-jH!}`W[ \ELO$UρbʼR3mNǓqM@JV|040Lcoe/t{Je1^W$a7"QM1\QEtԑL
֘PR9}ls.,ϞUL%&o?Ҁsgi~Fq7z}L91@=:ޝg|q[,<К/eKh
?d"Z]|0"X"6j0tI+\^aKJ5^7y)䎪NQ~r;3J"W,ʟΧh%v|w$'KlseuN{dϰ9U@'8M%]<l0- zp:jb,vz
HuHI*+2?Pԓ29=jil,PuK@5ɏF>Ǜ` -Ƙr+Mx#50("}*bFbH?72ﲸӺᰝKP7Ժ:&^7kH}+bI Z?ߟx@Z2>>GOXse^o-9 0}6Y+v} &>XMpw%Cee
+lLE=s6|@!BOFb$0#H- Mc,  ;e0ǹb_)Dӵ(졁%;FuiN։:]U,{IwN*(MyB:A`&Q0oٙcF-cEnm\8 iG 5rlٛ#gFCLdU0U5]ZkܬAP2.m_]*4{0pZL^Z9A7l
o/"o]LQ
`LPە	
}`@N+u& W N{hqgGw`3ڟs|?S0DH8:9@!D$	T^7 p<zY{פ	:'6hztt&8L&}/?
 Dc))9Ya4<j<قgH'NA<Qo{
 /@Q}({y{mzɰd@>%8Q1Ώ;yM62U$ZQˠ@闶v9{Ї2>(xL\- ðZ=PJaxY>ie@
+b$>7ȯq̒f	'IaƁ2MR!!%:mݔ||l
E7#'#mtVfa[2)ka#Xe;>jhAbBAU/!iizC"{QgG<@d:0	Ĉ*wG(Tvc!-KgXre&4Xg?
+#r,I JP&+"`AP1
+}/S5wB>}{HT!B*$}q&/jd}Vsŗ51OS5ǬFf#Jîq	
H:^uUYk8r\	l5*UPj-kos@SY4@fFlcUiKrg<W*N|'%pe)7B$v z"ʿl;"Q'q
璞|ӸTv\RCF#\(YE&Q]Z[0BbPbgU0wyWuK%j*BL0ˠ*nZЕY <ͭw@xby Eopy*P>J0*p3"!XLcG|Eg~d_|iIF75
+SVy̞_*w	N{&vN8(C3D*,eiկ҃c3U8oL7&XR(6@㎿Z(9G:j:8
/F͋]w@;cvYYl<pbWЊYwobZC?4mҿ!{
ӏ#(ry@zkͲ.'r\nO<mI  B6ڿym2;dR"-Zq6fW>΃VFTT1@Cbj>'큞uK<Lsr.=
+ *ySsAF
AR>9!hG?Nf1Ngh$)6HuZtK8	=Tw9 WȀe,g(͉h$ߖ۹{fZС\ދGM*.j;w$t94,ԩzH\𛉷{~yTUN ]uxB՜!3 ܘ*OL#9j&ȍgd!l/c#DpGO1,jrVo1d5zlKrIv6YÚbG
uscGjc@|
+A(kdX**BW(43p`mY"
+AC6`JfQfGU8.F
(xrDv߄3'
+~FL@cb3^RmXC`ZFNh	3n:[hd_~~,NWPewӋ+pQfr&$^`7-xxݐS78MOV]A)%))T{ÂAE}U>%WVJ?>gǨx H$0m/BfZ̀1jz⾭ @@,;oIknI<05{?̐ʓ]Xnk]9~;Vo`鞭x~F'0cPUIHv~4`YvpHpg!_P~r`Öy(&~qk/͵R{r=չu] bF|R;"4PMIR,
;9TK!4WęR{	xz@@RkKȐ#)H!̆G 29spT.
+p|ƃG.=pC|胦u1ÆGQ
F2eq&4lqh#i1FpPkv
+x)PxEǊ(4QG@*UصL"Åk"CBDI( G !^$LLq:nDĜ	':gp\faC6
R,t0A܆6VkbhOO=Ng@	@ @ @R`"3H;@A	p `z`#pF( ]A~
2SA`
+!D dh8(0@3@6` d  S|G̿
+Uǟ9|GWӟRyw_}WK_ G^_k>{+#x.o=W~fx޹w}tdL~]wΈwoF^R{/ϦC<lCpz+NB\8=T@ />/r\nԘ/$mbiM#an}2l.Fs&d"6&H$a*z<R@4 nMi$;8LsB*CSPZ	B%	d#KB/9֋$hÅh\m0
yzMш-|~n(0-SG+x.ݼ4Xe{v+453]y1^!3͐ͲY|D NN߽ؿ_a/Xz#a*"@!>'E\kDpV fܨu;͕XOl_/1AF"/rf'#,`_CF$0쟚4lߪRp{(/ؼH*y$T(
Cn>ڇ}^MV%a!堌`ljxՀG<~m^kPh
	Iy	to y 	5kEV \hG3R	. )NPHi5٢F- 8MU|6!kĽvdBM$~bǒ5+V&e:dV2+7o	
'\vl¦3n'::oTgr#xCٮVYN|l\rkՂ)G)A: P]Gu>)"R[C
$Nq`Pd	9^If˰_*	γ$<6tB"Jx/UUDE&EaR'\]4\p_bsSnQ@ i%Ⱦ /8Cጊ٠8{ё|NIzh%0VR+l|0BtĔ˄z%2IC,u:9G1J*6/3i4դYNc	SvO#74[$;?Hs4(P>%p :[7HE:KM-gBJ^DAL̥GCʬg)ȄXVCAcw7
+-ݛpACťe#|yH6:pn^/);*fG_bަI=@3(,
<W"fDn#˦|>>"J1
+"~:_<DvnIa;"a 6;JrZx?Fxd6
+:yi(g.}}MhOV=xSܱ#wrP@ hG5K
 SC*"q!pQGתβ=tHF<!M6%Qc{s@*]q
5
o૤y T]pB 8	ļD-sHPjg5IqQoWZJ|-X4{,FDB`5~Eհ%ԲJu&o>pyج`аeZvna6	DyO%#W1?8Vt >rV̙O hdJ-㯀J0..ȰYoO	Qi)O@VͼS(mX}]@AŒS;7p?IQ	X2S5PCZDd-4KnAp
Ȉ%s>T>i$e0bI&
+m*,㰄<1/z\)uBɅk;V M&`a0d=Q[	HN&kt~hU;Aߥɖc!}_V4LT=SRHCBD1Dv9 Y_9XZ`##+3#a,1\"h]z-#AOStw֋epaudٲtBVV0vioo%e$MF3;5o]4xmIr狅L+X~#q^}n2 3t*vv
E45l^0]X33\w :7K~i!I&w:vn;1
y ^ҟ%_g -b-{BҸB-$T>ؚBiiP΄z6ߡX/!U"!TB~dX&
}4IX,srޮoZ] =%
+!mYfS
PRRc:DH"a0|;?@aMą180
+4M9V?`>aڛ]Nta-FE<AV#:ۤكjj?6k
[p[4ԧS<NXAhXҼ%\R	j}eRҗwg
K%z)i	2JK-`_
NҥzTqX혋iQ%\	nhs=Ki J9qwpN%γN\7 2n9
nIeمT
+f	;2dyeWCxS$)SaTUpG*pHxR<'Újr&?)$WV'"D0HYEw&        
\ No newline at end of file
--- /dev/null
+++ b/assets/fonts/fontawesome-webfont.svg
@@ -0,0 +1,640 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
+<metadata></metadata>
+<defs>
+<font id="fontawesomeregular" horiz-adv-x="1536" >
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode=" "  horiz-adv-x="448" />
+<glyph unicode="&#x09;" horiz-adv-x="448" />
+<glyph unicode="&#xa0;" horiz-adv-x="448" />
+<glyph unicode="&#xa8;" horiz-adv-x="1792" />
+<glyph unicode="&#xa9;" horiz-adv-x="1792" />
+<glyph unicode="&#xae;" horiz-adv-x="1792" />
+<glyph unicode="&#xb4;" horiz-adv-x="1792" />
+<glyph unicode="&#xc6;" horiz-adv-x="1792" />
+<glyph unicode="&#xd8;" horiz-adv-x="1792" />
+<glyph unicode="&#x2000;" horiz-adv-x="768" />
+<glyph unicode="&#x2001;" horiz-adv-x="1537" />
+<glyph unicode="&#x2002;" horiz-adv-x="768" />
+<glyph unicode="&#x2003;" horiz-adv-x="1537" />
+<glyph unicode="&#x2004;" horiz-adv-x="512" />
+<glyph unicode="&#x2005;" horiz-adv-x="384" />
+<glyph unicode="&#x2006;" horiz-adv-x="256" />
+<glyph unicode="&#x2007;" horiz-adv-x="256" />
+<glyph unicode="&#x2008;" horiz-adv-x="192" />
+<glyph unicode="&#x2009;" horiz-adv-x="307" />
+<glyph unicode="&#x200a;" horiz-adv-x="85" />
+<glyph unicode="&#x202f;" horiz-adv-x="307" />
+<glyph unicode="&#x205f;" horiz-adv-x="384" />
+<glyph unicode="&#x2122;" horiz-adv-x="1792" />
+<glyph unicode="&#x221e;" horiz-adv-x="1792" />
+<glyph unicode="&#x2260;" horiz-adv-x="1792" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
+<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
+<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
+<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
+<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
+<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
+<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
+<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
+<glyph unicode="&#xf016;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z " />
+<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
+<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
+<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
+<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
+<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
+<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
+<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
+<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
+<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
+<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
+<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
+<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" />
+<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" />
+<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
+<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" />
+<glyph unicode="&#xf035;" d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" />
+<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
+<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
+<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
+<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
+<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
+<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
+<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
+<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
+<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
+<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
+<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
+<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
+<glyph unicode="&#xf053;" horiz-adv-x="1280" d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf054;" horiz-adv-x="1280" d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
+<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
+<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
+<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
+<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
+<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
+<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
+<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
+<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
+<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
+<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
+<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
+<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
+<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
+<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf077;" horiz-adv-x="1792" d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="&#xf078;" horiz-adv-x="1792" d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
+<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45 t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf080;" horiz-adv-x="2048" d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
+<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf082;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
+<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
+<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
+<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
+<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
+<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
+<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
+<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
+<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
+<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
+<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
+<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
+<glyph unicode="&#xf09a;" horiz-adv-x="1024" d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
+<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
+<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
+<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
+<glyph unicode="&#xf0a2;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
+<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
+<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
+<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
+<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
+<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
+<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
+<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
+<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
+<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
+<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
+<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
+<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
+<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
+<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
+<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
+<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
+<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf0d4;" d="M829 318q0 -76 -58.5 -112.5t-139.5 -36.5q-41 0 -80.5 9.5t-75.5 28.5t-58 53t-22 78q0 46 25 80t65.5 51.5t82 25t84.5 7.5q20 0 31 -2q2 -1 23 -16.5t26 -19t23 -18t24.5 -22t19 -22.5t17 -26t9 -26.5t4.5 -31.5zM755 863q0 -60 -33 -99.5t-92 -39.5q-53 0 -93 42.5 t-57.5 96.5t-17.5 106q0 61 32 104t92 43q53 0 93.5 -45t58 -101t17.5 -107zM861 1120l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-13 -29 -13 -54q0 -44 40 -94q-175 -12 -257 -63q-47 -29 -75.5 -73t-28.5 -95 q0 -43 18.5 -77.5t48.5 -56.5t69 -37t77.5 -21t76.5 -6q60 0 120.5 15.5t113.5 46t86 82.5t33 117q0 49 -20 89.5t-49 66.5t-58 47.5t-49 44t-20 44.5t15.5 42.5t37.5 39.5t44 42t37.5 59.5t15.5 82.5q0 60 -22.5 99.5t-72.5 90.5h83zM1152 672h128v64h-128v128h-64v-128 h-128v-64h128v-160h64v160zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M735 740q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4 q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65t-59.5 -61.5t-24.5 -66zM589 836q38 0 78 16.5t66 43.5q53 57 53 159q0 58 -17 125t-48.5 129.5 t-84.5 103.5t-117 41q-42 0 -82.5 -19.5t-65.5 -52.5q-47 -59 -47 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26zM591 -37q58 0 111.5 13t99 39t73 73t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -48 2 q-53 0 -105 -7t-107.5 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -70 35 -123.5t91.5 -83t119 -44t127.5 -14.5zM1401 839h213v-108h-213v-219h-105v219h-212v108h212v217h105v-217z" />
+<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
+<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
+<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
+<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
+<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
+<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
+<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
+<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
+<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
+<glyph unicode="&#xf0f3;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f6;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" />
+<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
+<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
+<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
+<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf110;" horiz-adv-x="1792" d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5 q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
+<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
+<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
+<glyph unicode="&#xf116;" horiz-adv-x="1792" />
+<glyph unicode="&#xf117;" horiz-adv-x="1792" />
+<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
+<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
+<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
+<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
+<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
+<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
+<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
+<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
+<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
+<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
+<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
+<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
+<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
+<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
+<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
+<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
+<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
+<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
+<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
+<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
+<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
+<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
+<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
+<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
+<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
+<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
+<glyph unicode="&#xf158;" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
+<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
+<glyph unicode="&#xf15b;" d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
+<glyph unicode="&#xf15c;" d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
+<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
+<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
+<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
+<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
+<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
+<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
+<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
+<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
+<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
+<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
+<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
+<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
+<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
+<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
+<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 q78 2 134 29z" />
+<glyph unicode="&#xf174;" d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
+<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
+<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
+<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
+<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
+<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
+<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
+<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
+<glyph unicode="&#xf180;" horiz-adv-x="1280" d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" />
+<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
+<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
+<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
+<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
+<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
+<glyph unicode="&#xf18b;" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
+<glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
+<glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
+<glyph unicode="&#xf18e;" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf190;" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf191;" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf192;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
+<glyph unicode="&#xf194;" d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179 q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf196;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf197;" horiz-adv-x="2176" d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" />
+<glyph unicode="&#xf198;" horiz-adv-x="1664" d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" />
+<glyph unicode="&#xf199;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" />
+<glyph unicode="&#xf19a;" horiz-adv-x="1792" d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 t273 -182.5t331.5 -68z" />
+<glyph unicode="&#xf19b;" horiz-adv-x="1792" d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
+<glyph unicode="&#xf19c;" horiz-adv-x="2048" d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
+<glyph unicode="&#xf19d;" horiz-adv-x="2304" d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
+<glyph unicode="&#xf19e;" d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
+<glyph unicode="&#xf1a0;" horiz-adv-x="1280" d="M981 197q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -49 2q-53 0 -104.5 -7t-107 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -56 23.5 -102t61 -75.5t87 -50t100 -29t101.5 -8.5q58 0 111.5 13t99 39t73 73t27.5 109zM864 1055 q0 59 -17 125.5t-48 129t-84 103.5t-117 41q-42 0 -82.5 -19.5t-66.5 -52.5q-46 -59 -46 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q37 0 77.5 16.5t65.5 43.5q53 56 53 159zM752 1536h417l-137 -88h-132q75 -63 113 -133t38 -160q0 -72 -24.5 -129.5 t-59.5 -93t-69.5 -65t-59 -61.5t-24.5 -66q0 -36 32 -70.5t77 -68t90.5 -73.5t77.5 -104t32 -142q0 -91 -49 -173q-71 -122 -209.5 -179.5t-298.5 -57.5q-132 0 -246.5 41.5t-172.5 137.5q-36 59 -36 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 41 -47.5 73.5 t-15.5 73.5q0 40 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q76 66 182 98t218 32z" />
+<glyph unicode="&#xf1a1;" horiz-adv-x="1792" d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26 t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q-19 5 -25 -16l-69 -312q-180 -7 -309 -97q-35 37 -87 37 q-50 0 -85 -35t-35 -84q0 -35 18.5 -64t49.5 -44q-6 -27 -6 -56q0 -142 140 -243t337 -101q198 0 338 101t140 243q0 32 -7 57q30 15 48 43.5t18 63.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191 t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf1a2;" d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54 q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42q-17 5 -21 -13l-60 -268q-154 -6 -265 -83 q-30 32 -74 32q-43 0 -73 -30t-30 -72q0 -30 16 -55t42 -38q-5 -25 -5 -48q0 -122 120 -208.5t289 -86.5q170 0 290 86.5t120 208.5q0 25 -6 49q25 13 40.5 37.5t15.5 54.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1a3;" d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103 t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1a4;" horiz-adv-x="1920" d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
+<glyph unicode="&#xf1a5;" d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf1a6;" horiz-adv-x="2048" d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 v-369h123z" />
+<glyph unicode="&#xf1a7;" d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1a8;" horiz-adv-x="2038" d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" />
+<glyph unicode="&#xf1a9;" d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" />
+<glyph unicode="&#xf1aa;" d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 t135.5 51q85 0 145 -60.5t60 -145.5z" />
+<glyph unicode="&#xf1ab;" d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 q20 0 20 -21v-418z" />
+<glyph unicode="&#xf1ac;" horiz-adv-x="1792" d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" />
+<glyph unicode="&#xf1ad;" d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" />
+<glyph unicode="&#xf1ae;" horiz-adv-x="1280" d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68zM864 1152q0 -93 -65.5 -158.5 t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf1b0;" horiz-adv-x="1664" d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 t100.5 134t141.5 55.5z" />
+<glyph unicode="&#xf1b1;" horiz-adv-x="768" d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
+<glyph unicode="&#xf1b2;" horiz-adv-x="1792" d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z " />
+<glyph unicode="&#xf1b3;" horiz-adv-x="2304" d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 v-400l434 -186q36 -16 57 -48t21 -70z" />
+<glyph unicode="&#xf1b4;" horiz-adv-x="2048" d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" />
+<glyph unicode="&#xf1b5;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" />
+<glyph unicode="&#xf1b6;" horiz-adv-x="1792" d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" />
+<glyph unicode="&#xf1b7;" d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z " />
+<glyph unicode="&#xf1b8;" horiz-adv-x="1792" d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" />
+<glyph unicode="&#xf1b9;" horiz-adv-x="2048" d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf1ba;" horiz-adv-x="2048" d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" />
+<glyph unicode="&#xf1bb;" d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
+<glyph unicode="&#xf1bc;" d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1bd;" horiz-adv-x="1024" d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" />
+<glyph unicode="&#xf1be;" horiz-adv-x="2304" d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236q0 -11 -8 -19 t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22v899 q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" />
+<glyph unicode="&#xf1c0;" d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128v128q0 69 103 128t280 93.5t385 34.5z" />
+<glyph unicode="&#xf1c1;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" />
+<glyph unicode="&#xf1c2;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21 q-2 26 -7 46l-99 438h90v107h-300z" />
+<glyph unicode="&#xf1c3;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 h-290v-107h68l189 -272l-194 -283h-68z" />
+<glyph unicode="&#xf1c4;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
+<glyph unicode="&#xf1c5;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
+<glyph unicode="&#xf1c6;" d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" />
+<glyph unicode="&#xf1c7;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" />
+<glyph unicode="&#xf1c8;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
+<glyph unicode="&#xf1c9;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" />
+<glyph unicode="&#xf1ca;" d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" />
+<glyph unicode="&#xf1cb;" horiz-adv-x="1792" d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
+<glyph unicode="&#xf1cc;" horiz-adv-x="2048" d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5 t-85 -189.5z" />
+<glyph unicode="&#xf1cd;" horiz-adv-x="1792" d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
+<glyph unicode="&#xf1ce;" horiz-adv-x="1792" d="M1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5z" />
+<glyph unicode="&#xf1d0;" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
+<glyph unicode="&#xf1d1;" horiz-adv-x="1792" d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf1d2;" d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1d3;" horiz-adv-x="1792" d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" />
+<glyph unicode="&#xf1d4;" d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1d5;" horiz-adv-x="1280" d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" />
+<glyph unicode="&#xf1d6;" horiz-adv-x="1792" d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" />
+<glyph unicode="&#xf1d7;" horiz-adv-x="2048" d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" />
+<glyph unicode="&#xf1d8;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
+<glyph unicode="&#xf1d9;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 l863 639l-478 -797z" />
+<glyph unicode="&#xf1da;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1db;" d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1dc;" horiz-adv-x="1792" d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22z" />
+<glyph unicode="&#xf1dd;" horiz-adv-x="1280" d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
+<glyph unicode="&#xf1de;" d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
+<glyph unicode="&#xf1e0;" d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
+<glyph unicode="&#xf1e1;" d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1e2;" horiz-adv-x="1792" d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf1e3;" horiz-adv-x="1792" d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" />
+<glyph unicode="&#xf1e4;" horiz-adv-x="1792" d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" />
+<glyph unicode="&#xf1e5;" horiz-adv-x="1792" d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1e6;" horiz-adv-x="1792" d="M1755 1083q37 -37 37 -90t-37 -91l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234l401 400 q38 37 91 37t90 -37z" />
+<glyph unicode="&#xf1e7;" horiz-adv-x="1792" d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q3 -2 11 -7 t11 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" />
+<glyph unicode="&#xf1e8;" horiz-adv-x="1792" d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
+<glyph unicode="&#xf1e9;" d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q70 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" />
+<glyph unicode="&#xf1ea;" horiz-adv-x="2048" d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
+<glyph unicode="&#xf1eb;" horiz-adv-x="2048" d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" />
+<glyph unicode="&#xf1ec;" horiz-adv-x="1792" d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1ed;" d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246 q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 38.5l232 1471q5 29 27.5 48t51.5 19h598 q34 0 97.5 -13t111.5 -32q107 -41 163.5 -123t56.5 -196z" />
+<glyph unicode="&#xf1ee;" horiz-adv-x="1792" d="M602 949q19 -61 31 -123.5t17 -141.5t-14 -159t-62 -145q-21 81 -67 157t-95.5 127t-99 90.5t-78.5 57.5t-33 19q-62 34 -81.5 100t14.5 128t101 81.5t129 -14.5q138 -83 238 -177zM927 1236q11 -25 20.5 -46t36.5 -100.5t42.5 -150.5t25.5 -179.5t0 -205.5t-47.5 -209.5 t-105.5 -208.5q-51 -72 -138 -72q-54 0 -98 31q-57 40 -69 109t28 127q60 85 81 195t13 199.5t-32 180.5t-39 128t-22 52q-31 63 -8.5 129.5t85.5 97.5q34 17 75 17q47 0 88.5 -25t63.5 -69zM1248 567q-17 -160 -72 -311q-17 131 -63 246q25 174 -5 361q-27 178 -94 342 q114 -90 212 -211q9 -37 15 -80q26 -179 7 -347zM1520 1440q9 -17 23.5 -49.5t43.5 -117.5t50.5 -178t34 -227.5t5 -269t-47 -300t-112.5 -323.5q-22 -48 -66 -75.5t-95 -27.5q-39 0 -74 16q-67 31 -92.5 100t4.5 136q58 126 90 257.5t37.5 239.5t-3.5 213.5t-26.5 180.5 t-38.5 138.5t-32.5 90t-15.5 32.5q-34 65 -11.5 135.5t87.5 104.5q37 20 81 20q49 0 91.5 -25.5t66.5 -70.5z" />
+<glyph unicode="&#xf1f0;" horiz-adv-x="2304" d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f1;" horiz-adv-x="2304" d="M671 603h-13q-47 0 -47 -32q0 -22 20 -22q17 0 28 15t12 39zM1066 639h62v3q1 4 0.5 6.5t-1 7t-2 8t-4.5 6.5t-7.5 5t-11.5 2q-28 0 -36 -38zM1606 603h-12q-48 0 -48 -32q0 -22 20 -22q17 0 28 15t12 39zM1925 629q0 41 -30 41q-19 0 -31 -20t-12 -51q0 -42 28 -42 q20 0 32.5 20t12.5 52zM480 770h87l-44 -262h-56l32 201l-71 -201h-39l-4 200l-34 -200h-53l44 262h81l2 -163zM733 663q0 -6 -4 -42q-16 -101 -17 -113h-47l1 22q-20 -26 -58 -26q-23 0 -37.5 16t-14.5 42q0 39 26 60.5t73 21.5q14 0 23 -1q0 3 0.5 5.5t1 4.5t0.5 3 q0 20 -36 20q-29 0 -59 -10q0 4 7 48q38 11 67 11q74 0 74 -62zM889 721l-8 -49q-22 3 -41 3q-27 0 -27 -17q0 -8 4.5 -12t21.5 -11q40 -19 40 -60q0 -72 -87 -71q-34 0 -58 6q0 2 7 49q29 -8 51 -8q32 0 32 19q0 7 -4.5 11.5t-21.5 12.5q-43 20 -43 59q0 72 84 72 q30 0 50 -4zM977 721h28l-7 -52h-29q-2 -17 -6.5 -40.5t-7 -38.5t-2.5 -18q0 -16 19 -16q8 0 16 2l-8 -47q-21 -7 -40 -7q-43 0 -45 47q0 12 8 56q3 20 25 146h55zM1180 648q0 -23 -7 -52h-111q-3 -22 10 -33t38 -11q30 0 58 14l-9 -54q-30 -8 -57 -8q-95 0 -95 95 q0 55 27.5 90.5t69.5 35.5q35 0 55.5 -21t20.5 -56zM1319 722q-13 -23 -22 -62q-22 2 -31 -24t-25 -128h-56l3 14q22 130 29 199h51l-3 -33q14 21 25.5 29.5t28.5 4.5zM1506 763l-9 -57q-28 14 -50 14q-31 0 -51 -27.5t-20 -70.5q0 -30 13.5 -47t38.5 -17q21 0 48 13 l-10 -59q-28 -8 -50 -8q-45 0 -71.5 30.5t-26.5 82.5q0 70 35.5 114.5t91.5 44.5q26 0 61 -13zM1668 663q0 -18 -4 -42q-13 -79 -17 -113h-46l1 22q-20 -26 -59 -26q-23 0 -37 16t-14 42q0 39 25.5 60.5t72.5 21.5q15 0 23 -1q2 7 2 13q0 20 -36 20q-29 0 -59 -10q0 4 8 48 q38 11 67 11q73 0 73 -62zM1809 722q-14 -24 -21 -62q-23 2 -31.5 -23t-25.5 -129h-56l3 14q19 104 29 199h52q0 -11 -4 -33q15 21 26.5 29.5t27.5 4.5zM1950 770h56l-43 -262h-53l3 19q-23 -23 -52 -23q-31 0 -49.5 24t-18.5 64q0 53 27.5 92t64.5 39q31 0 53 -29z M2061 640q0 148 -72.5 273t-198 198t-273.5 73q-181 0 -328 -110q127 -116 171 -284h-50q-44 150 -158 253q-114 -103 -158 -253h-50q44 168 171 284q-147 110 -328 110q-148 0 -273.5 -73t-198 -198t-72.5 -273t72.5 -273t198 -198t273.5 -73q181 0 328 110 q-120 111 -165 264h50q46 -138 152 -233q106 95 152 233h50q-45 -153 -165 -264q147 -110 328 -110q148 0 273.5 73t198 198t72.5 273zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f2;" horiz-adv-x="2304" d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" />
+<glyph unicode="&#xf1f3;" horiz-adv-x="2304" d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
+<glyph unicode="&#xf1f4;" horiz-adv-x="2304" d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16 t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM822 489l41 261q1 6 -3 11t-10 5h-76 q-14 0 -17 -33q-27 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q28 0 58 12t48 32q-4 -12 -4 -21q0 -16 13 -16h69q19 0 22 19zM1269 752q0 5 -4 9.5t-9 4.5h-77q-11 0 -18 -10l-106 -156l-44 150q-5 16 -22 16h-75q-5 0 -9 -4.5t-4 -9.5q0 -2 19.5 -59 t42 -123t23.5 -70q-82 -112 -82 -120q0 -13 13 -13h77q11 0 18 10l255 368q2 2 2 7zM1649 801q0 59 -38.5 85.5t-100.5 26.5h-159q-20 0 -22 -19l-65 -408q-1 -6 3 -11t10 -5h82q12 0 16 13l18 116q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM1958 489 l41 261q1 6 -3 11t-10 5h-76q-14 0 -17 -33q-26 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q29 0 59 12t47 32q0 -1 -2 -9t-2 -12q0 -16 13 -16h69q19 0 22 19zM2176 898v1q0 14 -13 14h-74q-11 0 -13 -11l-65 -416l-1 -2q0 -5 4 -9.5t10 -4.5h66 q19 0 21 19zM392 764q-5 -35 -26 -46t-60 -11l-33 -1l17 107q2 11 13 11h19q40 0 58 -11.5t12 -48.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f5;" horiz-adv-x="2304" d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f6;" horiz-adv-x="2048" d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 l418 363q10 8 23.5 7t21.5 -11z" />
+<glyph unicode="&#xf1f7;" horiz-adv-x="2048" d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" />
+<glyph unicode="&#xf1f8;" horiz-adv-x="1408" d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1f9;" d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1fa;" d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" />
+<glyph unicode="&#xf1fb;" horiz-adv-x="1792" d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
+<glyph unicode="&#xf1fc;" horiz-adv-x="1792" d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
+<glyph unicode="&#xf1fd;" horiz-adv-x="1792" d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11t55.5 -11t52.5 -38q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5t47 37.5 q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-35 0 -55.5 11t-52.5 38q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38t-58 27 t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448h256v448 h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51 t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" />
+<glyph unicode="&#xf1fe;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
+<glyph unicode="&#xf200;" horiz-adv-x="1792" d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf201;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf202;" horiz-adv-x="1792" d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" />
+<glyph unicode="&#xf203;" d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf204;" horiz-adv-x="2048" d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" />
+<glyph unicode="&#xf205;" horiz-adv-x="2048" d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
+<glyph unicode="&#xf206;" horiz-adv-x="2304" d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf207;" d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" />
+<glyph unicode="&#xf208;" horiz-adv-x="2048" d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" />
+<glyph unicode="&#xf209;" horiz-adv-x="1280" d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q18 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" />
+<glyph unicode="&#xf20a;" horiz-adv-x="2048" d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" />
+<glyph unicode="&#xf20b;" d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf20c;" d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" />
+<glyph unicode="&#xf20d;" d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" />
+<glyph unicode="&#xf20e;" horiz-adv-x="2048" d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335 q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5 q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360q2 0 4.5 -1t5.5 -2.5l5 -2.5l188 199v347l-187 194 q-13 -8 -29 -10zM986 1438h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13 zM552 226h402l64 66l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224 l213 -225zM1023 946l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196 l-48 -227l130 227h-82zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" />
+<glyph unicode="&#xf210;" d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" />
+<glyph unicode="&#xf211;" d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384 q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" />
+<glyph unicode="&#xf212;" horiz-adv-x="2048" d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021 q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25 q209 0 374 -102q172 107 374 102z" />
+<glyph unicode="&#xf213;" horiz-adv-x="2048" d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101 q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284 q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" />
+<glyph unicode="&#xf214;" d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34 l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114 v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378 v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51 h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5 t-43 -34t-16.5 -53.5z" />
+<glyph unicode="&#xf215;" horiz-adv-x="2048" d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832 q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" />
+<glyph unicode="&#xf216;" horiz-adv-x="2048" d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126.5t-103.5 132.5t-108.5 126t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5 t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113 t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5 q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" />
+<glyph unicode="&#xf217;" horiz-adv-x="1664" d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf218;" horiz-adv-x="1664" d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf219;" horiz-adv-x="2048" d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20 l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" />
+<glyph unicode="&#xf21a;" horiz-adv-x="2048" d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83 q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314 v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" />
+<glyph unicode="&#xf21b;" d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14 t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5 q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31 t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" />
+<glyph unicode="&#xf21c;" horiz-adv-x="2304" d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5 t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105 l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226 t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" />
+<glyph unicode="&#xf21d;" d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12 q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384 q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5 t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf21e;" horiz-adv-x="1792" d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221 q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124 t127 -344z" />
+<glyph unicode="&#xf221;" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292 q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
+<glyph unicode="&#xf222;" d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5 q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf223;" horiz-adv-x="1280" d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5 t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf224;" d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf225;" horiz-adv-x="1792" d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9 t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf226;" horiz-adv-x="1792" d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23 t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391 q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391 q0 -226 -154 -391q103 -57 218 -57z" />
+<glyph unicode="&#xf227;" horiz-adv-x="1920" d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230 q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9 t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128 q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -29 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" />
+<glyph unicode="&#xf228;" horiz-adv-x="2048" d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23 t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9 t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5 t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" />
+<glyph unicode="&#xf229;" d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5 t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf22a;" horiz-adv-x="1280" d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22 t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5 t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf22b;" horiz-adv-x="2048" d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5 t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5 t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf22c;" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf22d;" horiz-adv-x="1280" d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123 t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" />
+<glyph unicode="&#xf22e;" horiz-adv-x="1792" />
+<glyph unicode="&#xf22f;" horiz-adv-x="1792" />
+<glyph unicode="&#xf230;" d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" />
+<glyph unicode="&#xf231;" horiz-adv-x="1280" d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5 l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5 q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" />
+<glyph unicode="&#xf232;" d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5 t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233 l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" />
+<glyph unicode="&#xf233;" horiz-adv-x="1792" d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216 q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
+<glyph unicode="&#xf234;" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" />
+<glyph unicode="&#xf235;" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136 q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69 t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" />
+<glyph unicode="&#xf236;" horiz-adv-x="2048" d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704 q-26 0 -45 -19t-19 -45v-384h1152z" />
+<glyph unicode="&#xf237;" d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" />
+<glyph unicode="&#xf238;" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56 t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" />
+<glyph unicode="&#xf239;" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47 t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" />
+<glyph unicode="&#xf23a;" horiz-adv-x="1792" d="M1792 204v-209h-642v209h134v926h-6l-314 -1135h-243l-310 1135h-8v-926h135v-209h-538v209h69q21 0 43 19.5t22 37.5v881q0 18 -22 40t-43 22h-69v209h672l221 -821h6l223 821h670v-209h-71q-19 0 -41 -22t-22 -40v-881q0 -18 21.5 -37.5t41.5 -19.5h71z" />
+<glyph unicode="&#xf23b;" d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" />
+<glyph unicode="&#xf23c;" horiz-adv-x="2296" d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5 q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5zM1158 1094h1q-41 0 -76 -15q27 -8 44 -30.5t17 -49.5 q0 -35 -27 -60t-65 -25q-52 0 -80 43q-5 -23 -5 -42q0 -74 56 -126.5t135 -52.5q80 0 136 52.5t56 126.5t-56 126.5t-136 52.5zM1462 1312q-99 109 -220.5 131.5t-245.5 -44.5q27 60 82.5 96.5t118 39.5t121.5 -17t99.5 -74.5t44.5 -131.5zM2212 73q8 -11 -11 -42 q7 -23 7 -40q1 -56 -44.5 -112.5t-109.5 -91.5t-118 -37q-48 -2 -92 21.5t-66 65.5q-687 -25 -1259 0q-23 -41 -66.5 -65t-92.5 -22q-86 3 -179.5 80.5t-92.5 160.5q2 22 7 40q-19 31 -11 42q6 10 31 1q14 22 41 51q-7 29 2 38q11 10 39 -4q29 20 59 34q0 29 13 37 q23 12 51 -16q35 5 61 -2q18 -4 38 -19v73q-11 0 -18 2q-53 10 -97 44.5t-55 87.5q-9 38 0 81q15 62 93 95q2 17 19 35.5t36 23.5t33 -7.5t19 -30.5h13q46 -5 60 -23q3 -3 5 -7q10 1 30.5 3.5t30.5 3.5q-15 11 -30 17q-23 40 -91 43q0 6 1 10q-62 2 -118.5 18.5t-84.5 47.5 q-32 36 -42.5 92t-2.5 112q16 126 90 179q23 16 52 4.5t32 -40.5q0 -1 1.5 -14t2.5 -21t3 -20t5.5 -19t8.5 -10q27 -14 76 -12q48 46 98 74q-40 4 -162 -14l47 46q61 58 163 111q145 73 282 86q-20 8 -41 15.5t-47 14t-42.5 10.5t-47.5 11t-43 10q595 126 904 -139 q98 -84 158 -222q85 -10 121 9h1q5 3 8.5 10t5.5 19t3 19.5t3 21.5l1 14q3 28 32 40t52 -5q73 -52 91 -178q7 -57 -3.5 -113t-42.5 -91q-28 -32 -83.5 -48.5t-115.5 -18.5v-10q-71 -2 -95 -43q-14 -5 -31 -17q11 -1 32 -3.5t30 -3.5q1 4 5 8q16 18 60 23h13q5 18 19 30t33 8 t36 -23t19 -36q79 -32 93 -95q9 -40 1 -81q-12 -53 -56 -88t-97 -44q-10 -2 -17 -2q0 -49 -1 -73q20 15 38 19q26 7 61 2q28 28 51 16q14 -9 14 -37q33 -16 59 -34q27 13 38 4q10 -10 2 -38q28 -30 41 -51q23 8 31 -1zM1937 1025q0 -29 -9 -54q82 -32 112 -132 q4 37 -9.5 98.5t-41.5 90.5q-20 19 -36 17t-16 -20zM1859 925q35 -42 47.5 -108.5t-0.5 -124.5q67 13 97 45q13 14 18 28q-3 64 -31 114.5t-79 66.5q-15 -15 -52 -21zM1822 921q-30 0 -44 1q42 -115 53 -239q21 0 43 3q16 68 1 135t-53 100zM258 839q30 100 112 132 q-9 25 -9 54q0 18 -16.5 20t-35.5 -17q-28 -29 -41.5 -90.5t-9.5 -98.5zM294 737q29 -31 97 -45q-13 58 -0.5 124.5t47.5 108.5v0q-37 6 -52 21q-51 -16 -78.5 -66t-31.5 -115q9 -17 18 -28zM471 683q14 124 73 235q-19 -4 -55 -18l-45 -19v1q-46 -89 -20 -196q25 -3 47 -3z M1434 644q8 -38 16.5 -108.5t11.5 -89.5q3 -18 9.5 -21.5t23.5 4.5q40 20 62 85.5t23 125.5q-24 2 -146 4zM1152 1285q-116 0 -199 -82.5t-83 -198.5q0 -117 83 -199.5t199 -82.5t199 82.5t83 199.5q0 116 -83 198.5t-199 82.5zM1380 646q-106 2 -211 0v1q-1 -27 2.5 -86 t13.5 -66q29 -14 93.5 -14.5t95.5 10.5q9 3 11 39t-0.5 69.5t-4.5 46.5zM1112 447q8 4 9.5 48t-0.5 88t-4 63v1q-212 -3 -214 -3q-4 -20 -7 -62t0 -83t14 -46q34 -15 101 -16t101 10zM718 636q-16 -59 4.5 -118.5t77.5 -84.5q15 -8 24 -5t12 21q3 16 8 90t10 103 q-69 -2 -136 -6zM591 510q3 -23 -34 -36q132 -141 271.5 -240t305.5 -154q172 49 310.5 146t293.5 250q-33 13 -30 34l3 9v1v-1q-17 2 -50 5.5t-48 4.5q-26 -90 -82 -132q-51 -38 -82 1q-5 6 -9 14q-7 13 -17 62q-2 -5 -5 -9t-7.5 -7t-8 -5.5t-9.5 -4l-10 -2.5t-12 -2 l-12 -1.5t-13.5 -1t-13.5 -0.5q-106 -9 -163 11q-4 -17 -10 -26.5t-21 -15t-23 -7t-36 -3.5q-2 0 -3 -0.5t-3 -0.5h-3q-179 -17 -203 40q-2 -63 -56 -54q-47 8 -91 54q-12 13 -20 26q-17 29 -26 65q-58 -6 -87 -10q1 -2 4 -10zM507 -118q3 14 3 30q-17 71 -51 130t-73 70 q-41 12 -101.5 -14.5t-104.5 -80t-39 -107.5q35 -53 100 -93t119 -42q51 -2 94 28t53 79zM510 53q23 -63 27 -119q195 113 392 174q-98 52 -180.5 120t-179.5 165q-6 -4 -29 -13q0 -2 -1 -5t-1 -4q31 -18 22 -37q-12 -23 -56 -34q-10 -13 -29 -24h-1q-2 -83 1 -150 q19 -34 35 -73zM579 -113q532 -21 1145 0q-254 147 -428 196q-76 -35 -156 -57q-8 -3 -16 0q-65 21 -129 49q-208 -60 -416 -188h-1v-1q1 0 1 1zM1763 -67q4 54 28 120q14 38 33 71l-1 -1q3 77 3 153q-15 8 -30 25q-42 9 -56 33q-9 20 22 38q-2 4 -2 9q-16 4 -28 12 q-204 -190 -383 -284q198 -59 414 -176zM2155 -90q5 54 -39 107.5t-104 80t-102 14.5q-38 -11 -72.5 -70.5t-51.5 -129.5q0 -16 3 -30q10 -49 53 -79t94 -28q54 2 119 42t100 93z" />
+<glyph unicode="&#xf23d;" horiz-adv-x="2304" d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5 t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98.5t83 91.5t54 80.5t13 70t-45.5 55.5t-116.5 41t-204 23.5 t-304 5q-168 -2 -314 6t-256 23t-204.5 41t-159.5 51.5t-122.5 62.5t-91.5 66.5t-68 71.5t-50.5 69.5t-40 68t-36.5 59.5z" />
+<glyph unicode="&#xf23e;" horiz-adv-x="1792" d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348 t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-114q0 -14 -9 -23 t-23 -9h-64q-14 0 -23 9t-9 23v114q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5zM896 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM544 928v-96 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5v-96q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 146 -103 249t-249 103t-249 -103t-103 -249zM1408 192v512q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-512 q0 -26 19 -45t45 -19h896q26 0 45 19t19 45z" />
+<glyph unicode="&#xf240;" horiz-adv-x="2304" d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113 v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf241;" horiz-adv-x="2304" d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="&#xf242;" horiz-adv-x="2304" d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="&#xf243;" horiz-adv-x="2304" d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="&#xf244;" horiz-adv-x="2304" d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23 v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="&#xf245;" horiz-adv-x="1280" d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" />
+<glyph unicode="&#xf246;" horiz-adv-x="1024" d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" />
+<glyph unicode="&#xf247;" horiz-adv-x="2048" d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128 h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" />
+<glyph unicode="&#xf248;" horiz-adv-x="2304" d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256 v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v-384h128v-384h-384v128h-384v-128h128v-128h896v128h128z" />
+<glyph unicode="&#xf249;" d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" />
+<glyph unicode="&#xf24a;" d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68 z" />
+<glyph unicode="&#xf24b;" horiz-adv-x="2304" d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5 t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-127 6 -218.5 -14t-140.5 -60t-71 -88t-22 -106t22 -106t71 -88 t140.5 -60t218.5 -14q101 4 208 31zM2176 518q0 54 -43 88.5t-109 39.5v3q57 8 89 41.5t32 79.5q0 55 -41 88t-107 36q-3 0 -12 0.5t-14 0.5h-455v-510h491q74 0 121.5 36.5t47.5 96.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90 t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf24c;" horiz-adv-x="2304" d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294 t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 -85h301q129 0 251.5 50.5t214.5 135t147.5 202.5t55.5 246z M2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf24d;" horiz-adv-x="1792" d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113 zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf24e;" horiz-adv-x="2304" d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64 q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5zM2176 384q0 -73 -46.5 -131t-117.5 -91 t-144.5 -49.5t-139.5 -16.5t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81zM896 384q0 -73 -46.5 -131t-117.5 -91t-144.5 -49.5t-139.5 -16.5 t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81z" />
+<glyph unicode="&#xf250;" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-77 -29 -149 -92.5 t-129.5 -152.5t-92.5 -210t-35 -253h1024q0 132 -35 253t-92.5 210t-129.5 152.5t-149 92.5q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
+<glyph unicode="&#xf251;" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -152t-90.5 -208t-34 -249.5h1024z" />
+<glyph unicode="&#xf252;" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" />
+<glyph unicode="&#xf253;" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-137 -51 -244 -196 h700q-107 145 -244 196q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
+<glyph unicode="&#xf254;" d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87 t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9 h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472z" />
+<glyph unicode="&#xf255;" d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25 q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 -50q57 34 123 34q59 0 111 -27 t86 -76q27 7 59 7q100 0 170 -71.5t70 -171.5v-246q0 -51 -13 -108l-109 -436q-6 -24 -6 -71q0 -80 -56 -136t-136 -56h-640q-84 0 -138 58.5t-54 142.5l-308 296q-76 73 -76 175v224q0 99 70.5 169.5t169.5 70.5q11 0 16 -1q6 95 75.5 160t164.5 65q52 0 98 -21 q72 69 174 69z" />
+<glyph unicode="&#xf256;" horiz-adv-x="1792" d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33 t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -175v-498q0 -40 -8 -83l-76 -404q-14 -79 -76.5 -131t-143.5 -52 h-688q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 106 75 181t181 75q78 0 128 -34v434q0 99 70.5 169.5t169.5 70.5q23 0 42 -4q31 61 88.5 96.5t125.5 35.5z" />
+<glyph unicode="&#xf257;" horiz-adv-x="1792" d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668 q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79t-79 33q-26 0 -46 -10l-290 -132q-28 -13 -37 -17 t-30.5 -17t-29.5 -23.5t-16 -29t-8 -40.5q0 -50 31.5 -82t81.5 -32q20 0 38 9l352 160q30 14 48 41.5t18 60.5zM1112 1024l-650 248q-24 8 -46 8q-53 0 -90.5 -37.5t-37.5 -90.5q0 -40 22.5 -73t59.5 -47l526 -200v-64h-640q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5 t90.5 -37.5h535l233 106v198q0 63 46 106l111 102h-69zM1073 0q82 0 155 19l339 85q43 11 70 45.5t27 78.5v668q0 53 -37.5 90.5t-90.5 37.5h-308l-136 -126q-36 -33 -36 -82v-296q0 -46 33 -77t79 -31t79 35t33 81v208h32v-208q0 -70 -57 -114q52 -8 86.5 -48.5t34.5 -93.5 q0 -42 -23 -78t-61 -53l-310 -141h91z" />
+<glyph unicode="&#xf258;" horiz-adv-x="2048" d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32 q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 -44 3 -58q8 -44 44 -73t81 -29h640h91q40 0 68 -28t28 -68 q0 -15 -5 -30l-64 -192q-10 -29 -35 -47.5t-56 -18.5h-443q-66 0 -113 -47t-47 -113v-32q0 -26 19 -45t45 -19h561q16 0 29 -7l317 -158q24 -13 38.5 -36t14.5 -50v-197q0 -26 19 -45t45 -19h384q26 0 45 19t19 45z" />
+<glyph unicode="&#xf259;" horiz-adv-x="2048" d="M816 1408q-48 0 -79.5 -34t-31.5 -82q0 -14 3 -28l150 -624h-26l-116 482q-9 38 -39.5 62t-69.5 24q-47 0 -79 -34t-32 -81q0 -11 4 -29q3 -13 39 -161t68 -282t32 -138v-227l-307 230q-34 26 -77 26q-52 0 -89.5 -36.5t-37.5 -88.5q0 -67 56 -110l507 -379 q34 -26 76 -26h694q33 0 59 20.5t34 52.5l100 401q8 30 10 88t9 86l116 478q3 12 3 26q0 46 -33 79t-80 33q-38 0 -69 -25.5t-40 -62.5l-99 -408h-26l132 547q3 14 3 28q0 47 -32 80t-80 33q-38 0 -68.5 -24t-39.5 -62l-145 -602h-127l-164 682q-9 38 -39.5 62t-68.5 24z M1461 -256h-694q-85 0 -153 51l-507 380q-50 38 -78.5 94t-28.5 118q0 105 75 179t180 74q25 0 49.5 -5.5t41.5 -11t41 -20.5t35 -23t38.5 -29.5t37.5 -28.5l-123 512q-7 35 -7 59q0 93 60 162t152 79q14 87 80.5 144.5t155.5 57.5q83 0 148 -51.5t85 -132.5l103 -428 l83 348q20 81 85 132.5t148 51.5q87 0 152.5 -54t82.5 -139q93 -10 155 -78t62 -161q0 -30 -7 -57l-116 -477q-5 -22 -5 -67q0 -51 -13 -108l-101 -401q-19 -75 -79.5 -122.5t-137.5 -47.5z" />
+<glyph unicode="&#xf25a;" horiz-adv-x="1792" d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5 q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 21 99 21q113 0 184 -87q27 7 56 7q94 0 159 -67.5t65 -161.5 v-217q0 -116 -28 -225l-92 -368q-16 -64 -68 -104.5t-118 -40.5h-718q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 105 74.5 180.5t179.5 75.5q71 0 130 -35v547q0 106 75 181t181 75zM768 128v384h-32v-384h32zM1024 128v384h-32v-384h32zM1280 128v384h-32 v-384h32z" />
+<glyph unicode="&#xf25b;" d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181 v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 -30.5t-17 -37l-132 -290q-10 -20 -10 -46 q0 -46 33 -79t79 -33q33 0 60.5 18t41.5 48l160 352q9 18 9 38q0 50 -32 81.5t-82 31.5zM128 1120q0 -22 8 -46l248 -650v-69l102 111q43 46 106 46h198l106 233v535q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-640h-64l-200 526q-14 37 -47 59.5t-73 22.5 q-53 0 -90.5 -37.5t-37.5 -90.5zM1180 -128q44 0 78.5 27t45.5 70l85 339q19 73 19 155v91l-141 -310q-17 -38 -53 -61t-78 -23q-53 0 -93.5 34.5t-48.5 86.5q-44 -57 -114 -57h-208v32h208q46 0 81 33t35 79t-31 79t-77 33h-296q-49 0 -82 -36l-126 -136v-308 q0 -53 37.5 -90.5t90.5 -37.5h668z" />
+<glyph unicode="&#xf25c;" horiz-adv-x="1973" d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5 t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0 -29 19l-188 427l-45 -590q-1 -12 -10 -20.5t-21 -8.5h-135q-13 0 -23 10q-9 10 -9 24l78 961q1 12 10 20.5t21 8.5h142q20 0 29 -19l220 -520q10 -24 20 -51q3 7 9.5 24.5t10.5 26.5l221 520q9 19 29 19h141 q13 0 22 -8.5t10 -20.5z" />
+<glyph unicode="&#xf25d;" horiz-adv-x="1792" d="M1042 833q0 88 -60 121q-33 18 -117 18h-123v-281h162q66 0 102 37t36 105zM1094 548l205 -373q8 -17 -1 -31q-8 -16 -27 -16h-152q-20 0 -28 17l-194 365h-155v-350q0 -14 -9 -23t-23 -9h-134q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h294q128 0 190 -24q85 -31 134 -109 t49 -180q0 -92 -42.5 -165.5t-115.5 -109.5q6 -10 9 -16zM896 1376q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM1792 640 q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf25e;" horiz-adv-x="1792" d="M605 303q153 0 257 104q14 18 3 36l-45 82q-6 13 -24 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13t-23.5 -14.5t-28.5 -13.5t-33.5 -9.5t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78 q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-148 0 -246 -96.5t-98 -240.5q0 -146 97 -241.5t247 -95.5zM1235 303q153 0 257 104q14 18 4 36l-45 82q-8 14 -25 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13t-23.5 -14.5t-28.5 -13.5t-33.5 -9.5 t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-147 0 -245.5 -96.5t-98.5 -240.5q0 -146 97 -241.5t247 -95.5zM896 1376 q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191 t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71z" />
+<glyph unicode="&#xf260;" horiz-adv-x="2048" d="M736 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1312 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" />
+<glyph unicode="&#xf261;" horiz-adv-x="1792" d="M717 182l271 271l-279 279l-88 -88l192 -191l-96 -96l-279 279l279 279l40 -40l87 87l-127 128l-454 -454zM1075 190l454 454l-454 454l-271 -271l279 -279l88 88l-192 191l96 96l279 -279l-279 -279l-40 40l-87 -88zM1792 640q0 -182 -71 -348t-191 -286t-286 -191 t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf262;" horiz-adv-x="2304" d="M651 539q0 -39 -27.5 -66.5t-65.5 -27.5q-39 0 -66.5 27.5t-27.5 66.5q0 38 27.5 65.5t66.5 27.5q38 0 65.5 -27.5t27.5 -65.5zM1805 540q0 -39 -27.5 -66.5t-66.5 -27.5t-66.5 27.5t-27.5 66.5t27.5 66t66.5 27t66.5 -27t27.5 -66zM765 539q0 79 -56.5 136t-136.5 57 t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM1918 540q0 80 -56.5 136.5t-136.5 56.5q-79 0 -136 -56.5t-57 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM850 539q0 -116 -81.5 -197.5t-196.5 -81.5q-116 0 -197.5 82t-81.5 197 t82 196.5t197 81.5t196.5 -81.5t81.5 -196.5zM2004 540q0 -115 -81.5 -196.5t-197.5 -81.5q-115 0 -196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5q116 0 197.5 -81.5t81.5 -196.5zM1040 537q0 191 -135.5 326.5t-326.5 135.5q-125 0 -231 -62t-168 -168.5t-62 -231.5 t62 -231.5t168 -168.5t231 -62q191 0 326.5 135.5t135.5 326.5zM1708 1110q-254 111 -556 111q-319 0 -573 -110q117 0 223 -45.5t182.5 -122.5t122 -183t45.5 -223q0 115 43.5 219.5t118 180.5t177.5 123t217 50zM2187 537q0 191 -135 326.5t-326 135.5t-326.5 -135.5 t-135.5 -326.5t135.5 -326.5t326.5 -135.5t326 135.5t135 326.5zM1921 1103h383q-44 -51 -75 -114.5t-40 -114.5q110 -151 110 -337q0 -156 -77 -288t-209 -208.5t-287 -76.5q-133 0 -249 56t-196 155q-47 -56 -129 -179q-11 22 -53.5 82.5t-74.5 97.5 q-80 -99 -196.5 -155.5t-249.5 -56.5q-155 0 -287 76.5t-209 208.5t-77 288q0 186 110 337q-9 51 -40 114.5t-75 114.5h365q149 100 355 156.5t432 56.5q224 0 421 -56t348 -157z" />
+<glyph unicode="&#xf263;" horiz-adv-x="1280" d="M640 629q-188 0 -321 133t-133 320q0 188 133 321t321 133t321 -133t133 -321q0 -187 -133 -320t-321 -133zM640 1306q-92 0 -157.5 -65.5t-65.5 -158.5q0 -92 65.5 -157.5t157.5 -65.5t157.5 65.5t65.5 157.5q0 93 -65.5 158.5t-157.5 65.5zM1163 574q13 -27 15 -49.5 t-4.5 -40.5t-26.5 -38.5t-42.5 -37t-61.5 -41.5q-115 -73 -315 -94l73 -72l267 -267q30 -31 30 -74t-30 -73l-12 -13q-31 -30 -74 -30t-74 30q-67 68 -267 268l-267 -268q-31 -30 -74 -30t-73 30l-12 13q-31 30 -31 73t31 74l267 267l72 72q-203 21 -317 94 q-39 25 -61.5 41.5t-42.5 37t-26.5 38.5t-4.5 40.5t15 49.5q10 20 28 35t42 22t56 -2t65 -35q5 -4 15 -11t43 -24.5t69 -30.5t92 -24t113 -11q91 0 174 25.5t120 50.5l38 25q33 26 65 35t56 2t42 -22t28 -35z" />
+<glyph unicode="&#xf264;" d="M927 956q0 -66 -46.5 -112.5t-112.5 -46.5t-112.5 46.5t-46.5 112.5t46.5 112.5t112.5 46.5t112.5 -46.5t46.5 -112.5zM1141 593q-10 20 -28 32t-47.5 9.5t-60.5 -27.5q-10 -8 -29 -20t-81 -32t-127 -20t-124 18t-86 36l-27 18q-31 25 -60.5 27.5t-47.5 -9.5t-28 -32 q-22 -45 -2 -74.5t87 -73.5q83 -53 226 -67l-51 -52q-142 -142 -191 -190q-22 -22 -22 -52.5t22 -52.5l9 -9q22 -22 52.5 -22t52.5 22l191 191q114 -115 191 -191q22 -22 52.5 -22t52.5 22l9 9q22 22 22 52.5t-22 52.5l-191 190l-52 52q141 14 225 67q67 44 87 73.5t-2 74.5 zM1092 956q0 134 -95 229t-229 95t-229 -95t-95 -229t95 -229t229 -95t229 95t95 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf265;" horiz-adv-x="1720" d="M1565 1408q65 0 110 -45.5t45 -110.5v-519q0 -176 -68 -336t-182.5 -275t-274 -182.5t-334.5 -67.5q-176 0 -335.5 67.5t-274.5 182.5t-183 275t-68 336v519q0 64 46 110t110 46h1409zM861 344q47 0 82 33l404 388q37 35 37 85q0 49 -34.5 83.5t-83.5 34.5q-47 0 -82 -33 l-323 -310l-323 310q-35 33 -81 33q-49 0 -83.5 -34.5t-34.5 -83.5q0 -51 36 -85l405 -388q33 -33 81 -33z" />
+<glyph unicode="&#xf266;" horiz-adv-x="2304" d="M1494 -103l-295 695q-25 -49 -158.5 -305.5t-198.5 -389.5q-1 -1 -27.5 -0.5t-26.5 1.5q-82 193 -255.5 587t-259.5 596q-21 50 -66.5 107.5t-103.5 100.5t-102 43q0 5 -0.5 24t-0.5 27h583v-50q-39 -2 -79.5 -16t-66.5 -43t-10 -64q26 -59 216.5 -499t235.5 -540 q31 61 140 266.5t131 247.5q-19 39 -126 281t-136 295q-38 69 -201 71v50l513 -1v-47q-60 -2 -93.5 -25t-12.5 -69q33 -70 87 -189.5t86 -187.5q110 214 173 363q24 55 -10 79.5t-129 26.5q1 7 1 25v24q64 0 170.5 0.5t180 1t92.5 0.5v-49q-62 -2 -119 -33t-90 -81 l-213 -442q13 -33 127.5 -290t121.5 -274l441 1017q-14 38 -49.5 62.5t-65 31.5t-55.5 8v50l460 -4l1 -2l-1 -44q-139 -4 -201 -145q-526 -1216 -559 -1291h-49z" />
+<glyph unicode="&#xf267;" horiz-adv-x="1792" d="M949 643q0 -26 -16.5 -45t-41.5 -19q-26 0 -45 16.5t-19 41.5q0 26 17 45t42 19t44 -16.5t19 -41.5zM964 585l350 581q-9 -8 -67.5 -62.5t-125.5 -116.5t-136.5 -127t-117 -110.5t-50.5 -51.5l-349 -580q7 7 67 62t126 116.5t136 127t117 111t50 50.5zM1611 640 q0 -201 -104 -371q-3 2 -17 11t-26.5 16.5t-16.5 7.5q-13 0 -13 -13q0 -10 59 -44q-74 -112 -184.5 -190.5t-241.5 -110.5l-16 67q-1 10 -15 10q-5 0 -8 -5.5t-2 -9.5l16 -68q-72 -15 -146 -15q-199 0 -372 105q1 2 13 20.5t21.5 33.5t9.5 19q0 13 -13 13q-6 0 -17 -14.5 t-22.5 -34.5t-13.5 -23q-113 75 -192 187.5t-110 244.5l69 15q10 3 10 15q0 5 -5.5 8t-10.5 2l-68 -15q-14 72 -14 139q0 206 109 379q2 -1 18.5 -12t30 -19t17.5 -8q13 0 13 12q0 6 -12.5 15.5t-32.5 21.5l-20 12q77 112 189 189t244 107l15 -67q2 -10 15 -10q5 0 8 5.5 t2 10.5l-15 66q71 13 134 13q204 0 379 -109q-39 -56 -39 -65q0 -13 12 -13q11 0 48 64q111 -75 187.5 -186t107.5 -241l-56 -12q-10 -2 -10 -16q0 -5 5.5 -8t9.5 -2l57 13q14 -72 14 -140zM1696 640q0 163 -63.5 311t-170.5 255t-255 170.5t-311 63.5t-311 -63.5 t-255 -170.5t-170.5 -255t-63.5 -311t63.5 -311t170.5 -255t255 -170.5t311 -63.5t311 63.5t255 170.5t170.5 255t63.5 311zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191 t191 -286t71 -348z" />
+<glyph unicode="&#xf268;" horiz-adv-x="1792" d="M893 1536q240 2 451 -120q232 -134 352 -372l-742 39q-160 9 -294 -74.5t-185 -229.5l-276 424q128 159 311 245.5t383 87.5zM146 1131l337 -663q72 -143 211 -217t293 -45l-230 -451q-212 33 -385 157.5t-272.5 316t-99.5 411.5q0 267 146 491zM1732 962 q58 -150 59.5 -310.5t-48.5 -306t-153 -272t-246 -209.5q-230 -133 -498 -119l405 623q88 131 82.5 290.5t-106.5 277.5zM896 942q125 0 213.5 -88.5t88.5 -213.5t-88.5 -213.5t-213.5 -88.5t-213.5 88.5t-88.5 213.5t88.5 213.5t213.5 88.5z" />
+<glyph unicode="&#xf269;" horiz-adv-x="1792" d="M903 -256q-283 0 -504.5 150.5t-329.5 398.5q-58 131 -67 301t26 332.5t111 312t179 242.5l-11 -281q11 14 68 15.5t70 -15.5q42 81 160.5 138t234.5 59q-54 -45 -119.5 -148.5t-58.5 -163.5q25 -8 62.5 -13.5t63 -7.5t68 -4t50.5 -3q15 -5 9.5 -45.5t-30.5 -75.5 q-5 -7 -16.5 -18.5t-56.5 -35.5t-101 -34l15 -189l-139 67q-18 -43 -7.5 -81.5t36 -66.5t65.5 -41.5t81 -6.5q51 9 98 34.5t83.5 45t73.5 17.5q61 -4 89.5 -33t19.5 -65q-1 -2 -2.5 -5.5t-8.5 -12.5t-18 -15.5t-31.5 -10.5t-46.5 -1q-60 -95 -144.5 -135.5t-209.5 -29.5 q74 -61 162.5 -82.5t168.5 -6t154.5 52t128 87.5t80.5 104q43 91 39 192.5t-37.5 188.5t-78.5 125q87 -38 137 -79.5t77 -112.5q15 170 -57.5 343t-209.5 284q265 -77 412 -279.5t151 -517.5q2 -127 -40.5 -255t-123.5 -238t-189 -196t-247.5 -135.5t-288.5 -49.5z" />
+<glyph unicode="&#xf26a;" d="M768 -92q77 0 139.5 63t100.5 166t59 234.5t21 268.5t-21 268.5t-59 234.5t-100.5 166t-139.5 63t-139.5 -63t-100.5 -166t-59 -234.5t-21 -268.5t21 -268.5t59 -234.5t100.5 -166t139.5 -63zM768 -256q-184 0 -333 77t-240 203t-141 287t-50 329t50 329t141 287t240 203 t333 77q148 0 274 -50t214.5 -136t151.5 -201t92.5 -244t29.5 -265t-29.5 -265t-92.5 -244t-151.5 -201t-214.5 -136t-274 -50z" />
+<glyph unicode="&#xf26b;" horiz-adv-x="1792" d="M716 -69q-143 35 -261.5 114t-197.5 191q-139 -300 -17 -398q26 -21 85 -24.5t127.5 9.5t141 41.5t122.5 66.5zM693 762h452q0 108 -61.5 169t-168.5 61q-103 0 -162.5 -62.5t-59.5 -167.5zM1724 1137h-34q26 102 22.5 170t-25 110t-63.5 57t-93.5 11t-115 -26.5 t-128.5 -56.5t-134 -79q129 -37 238.5 -113.5t185 -179t110 -231.5t15.5 -262h-1005q0 -60 10 -106t34 -85t69.5 -60t112.5 -21q87 0 142.5 44t72.5 122h540q-71 -230 -281.5 -377t-477.5 -147q-83 0 -159 15q-35 -40 -151 -94t-248 -78t-219 35q-78 60 -100 159t7 214 t88 242t143.5 248t173.5 226.5t177.5 183.5t156.5 112v24q-120 -37 -258.5 -137.5t-240.5 -207t-159 -195.5q4 106 34 201t80 169t118 135.5t147.5 100.5t168 65.5t180.5 29.5t185 -8q310 186 503 189h7q57 0 103 -18q80 -30 98 -132.5t-30 -248.5z" />
+<glyph unicode="&#xf26c;" horiz-adv-x="2048" d="M1792 288v960q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1248v-960q0 -66 -47 -113t-113 -47h-736v-128h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23 v64q0 14 9 23t23 9h352v128h-736q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf26d;" horiz-adv-x="1792" d="M138 1408h197q-70 -64 -126 -149q-36 -56 -59 -115t-30 -125.5t-8.5 -120t10.5 -132t21 -126t28 -136.5q4 -19 6 -28q51 -238 81 -329q57 -171 152 -275h-272q-48 0 -82 34t-34 82v1304q0 48 34 82t82 34zM1346 1408h308q48 0 82 -34t34 -82v-1304q0 -48 -34 -82t-82 -34 h-178q212 210 196 565l-469 -101q-2 -45 -12 -82t-31 -72t-59.5 -59.5t-93.5 -36.5q-123 -26 -199 40q-32 27 -53 61t-51.5 129t-64.5 258q-35 163 -45.5 263t-5.5 139t23 77q20 41 62.5 73t102.5 45q45 12 83.5 6.5t67 -17t54 -35t43 -48t34.5 -56.5l468 100 q-68 175 -180 287z" />
+<glyph unicode="&#xf26e;" horiz-adv-x="2304" d="M1391 390v0l-1 1q-15 18 -34.5 37.5t-62.5 57.5t-93.5 62t-95.5 24q-48 0 -83 -21.5t-51 -54t-23 -59t-7 -47.5v0v0q0 -21 7 -48t23 -59t51 -53.5t83 -21.5q45 0 95.5 24t94 62.5t62 57t34.5 37.5zM2103 390q0 21 -7 47.5t-23 59t-51 54t-83 21.5q-45 0 -95.5 -24 t-94 -62.5t-62 -57t-34.5 -37.5l-1 -1v0v0l1 -1q15 -18 34.5 -37.5t62.5 -57.5t93.5 -62t95.5 -24q48 0 83 21.5t51 53.5t23 59t7 48zM2304 393q0 -69 -24 -137.5t-68 -126t-116 -93.5t-159 -36q-68 0 -134 24t-113.5 58.5t-84.5 69.5t-59.5 59t-25.5 24t-22.5 -24 t-54.5 -58.5t-81.5 -69.5t-115 -59t-143.5 -24q-65 0 -123.5 22.5t-96.5 54t-66.5 66.5t-41 59.5t-12.5 32.5q0 -8 -8.5 -26.5t-25 -45.5t-47 -55t-69 -52.5t-96.5 -40t-125 -15.5q-71 0 -130 15.5t-98.5 39.5t-70.5 56.5t-48 63.5t-27.5 63.5t-14 54t-3.5 36.5h217 q0 -55 49 -107.5t126 -52.5q79 0 134.5 67t55.5 148q0 80 -52 136.5t-138 56.5q-5 0 -13 -0.5t-31 -5t-43 -12t-42 -24.5t-34 -40h-195l102 583h602v-174h-445q-27 -159 -41 -248q4 0 16.5 13t31.5 28.5t65 28.5t108 13t114 -20.5t82.5 -49.5t51.5 -58.5t31 -50t11 -20.5 t13 25t36.5 60.5t60.5 71.5t97 61t133 25t140.5 -25t115.5 -60.5t83.5 -71.5t56.5 -61t21 -25q2 0 22 25t56 60.5t83.5 71.5t115.5 61t140 25q92 0 164.5 -35t115.5 -93t65 -125t22 -137z" />
+<glyph unicode="&#xf270;" horiz-adv-x="1792" d="M1551 60q15 6 26 3t11 -17.5t-15 -33.5q-13 -16 -44 -43.5t-95.5 -68t-141 -74t-188 -58t-229.5 -24.5q-119 0 -238 31t-209 76.5t-172.5 104t-132.5 105t-84 87.5q-8 9 -10 16.5t1 12t8 7t11.5 2t11.5 -4.5q192 -117 300 -166q389 -176 799 -90q190 40 391 135z M1758 175q11 -16 2.5 -69.5t-28.5 -102.5q-34 -83 -85 -124q-17 -14 -26 -9t0 24q21 45 44.5 121.5t6.5 98.5q-5 7 -15.5 11.5t-27 6t-29.5 2.5t-35 0t-31.5 -2t-31 -3t-22.5 -2q-6 -1 -13 -1.5t-11 -1t-8.5 -1t-7 -0.5h-5.5h-4.5t-3 0.5t-2 1.5l-1.5 3q-6 16 47 40t103 30 q46 7 108 1t76 -24zM1364 618q0 -31 13.5 -64t32 -58t37.5 -46t33 -32l13 -11l-227 -224q-40 37 -79 75.5t-58 58.5l-19 20q-11 11 -25 33q-38 -59 -97.5 -102.5t-127.5 -63.5t-140 -23t-137.5 21t-117.5 65.5t-83 113t-31 162.5q0 84 28 154t72 116.5t106.5 83t122.5 57 t130 34.5t119.5 18.5t99.5 6.5v127q0 65 -21 97q-34 53 -121 53q-6 0 -16.5 -1t-40.5 -12t-56 -29.5t-56 -59.5t-48 -96l-294 27q0 60 22 119t67 113t108 95t151.5 65.5t190.5 24.5q100 0 181 -25t129.5 -61.5t81 -83t45 -86t12.5 -73.5v-589zM692 597q0 -86 70 -133 q66 -44 139 -22q84 25 114 123q14 45 14 101v162q-59 -2 -111 -12t-106.5 -33.5t-87 -71t-32.5 -114.5z" />
+<glyph unicode="&#xf271;" horiz-adv-x="1792" d="M1536 1280q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128zM1152 1376v-288q0 -14 9 -23t23 -9 h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 1376v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM1536 -128v1024h-1408v-1024h1408zM896 448h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224 v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224z" />
+<glyph unicode="&#xf272;" horiz-adv-x="1792" d="M1152 416v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23 t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47 t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf273;" horiz-adv-x="1792" d="M1111 151l-46 -46q-9 -9 -22 -9t-23 9l-188 189l-188 -189q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22t9 23l189 188l-189 188q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l188 -188l188 188q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23l-188 -188l188 -188q9 -10 9 -23t-9 -22z M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf274;" horiz-adv-x="1792" d="M1303 572l-512 -512q-10 -9 -23 -9t-23 9l-288 288q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l220 -220l444 444q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23 t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47 t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf275;" horiz-adv-x="1792" d="M448 1536q26 0 45 -19t19 -45v-891l536 429q17 14 40 14q26 0 45 -19t19 -45v-379l536 429q17 14 40 14q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h384z" />
+<glyph unicode="&#xf276;" horiz-adv-x="1024" d="M512 448q66 0 128 15v-655q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v655q61 -15 128 -15zM512 1536q212 0 362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362t150 362t362 150zM512 1312q14 0 23 9t9 23t-9 23t-23 9q-146 0 -249 -103t-103 -249 q0 -14 9 -23t23 -9t23 9t9 23q0 119 84.5 203.5t203.5 84.5z" />
+<glyph unicode="&#xf277;" horiz-adv-x="1792" d="M1745 1239q10 -10 10 -23t-10 -23l-141 -141q-28 -28 -68 -28h-1344q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h576v64q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-64h512q40 0 68 -28zM768 320h256v-512q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v512zM1600 768 q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1344q-40 0 -68 28l-141 141q-10 10 -10 23t10 23l141 141q28 28 68 28h512v192h256v-192h576z" />
+<glyph unicode="&#xf278;" horiz-adv-x="2048" d="M2020 1525q28 -20 28 -53v-1408q0 -20 -11 -36t-29 -23l-640 -256q-24 -11 -48 0l-616 246l-616 -246q-10 -5 -24 -5q-19 0 -36 11q-28 20 -28 53v1408q0 20 11 36t29 23l640 256q24 11 48 0l616 -246l616 246q32 13 60 -6zM736 1390v-1270l576 -230v1270zM128 1173 v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" />
+<glyph unicode="&#xf279;" horiz-adv-x="1792" d="M512 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472q0 20 17 28l480 256q7 4 15 4zM1760 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472 q0 20 17 28l480 256q7 4 15 4zM640 1536q8 0 14 -3l512 -256q18 -10 18 -29v-1472q0 -13 -9.5 -22.5t-22.5 -9.5q-8 0 -14 3l-512 256q-18 10 -18 29v1472q0 13 9.5 22.5t22.5 9.5z" />
+<glyph unicode="&#xf27a;" horiz-adv-x="1792" d="M640 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 640q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-110 0 -211 18q-173 -173 -435 -229q-52 -10 -86 -13q-12 -1 -22 6t-13 18q-4 15 20 37q5 5 23.5 21.5t25.5 23.5t23.5 25.5t24 31.5t20.5 37 t20 48t14.5 57.5t12.5 72.5q-146 90 -229.5 216.5t-83.5 269.5q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf27b;" horiz-adv-x="1792" d="M640 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5 t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51 t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 130 71 248.5t191 204.5t286 136.5t348 50.5t348 -50.5t286 -136.5t191 -204.5t71 -248.5z" />
+<glyph unicode="&#xf27c;" horiz-adv-x="1024" d="M512 345l512 295v-591l-512 -296v592zM0 640v-591l512 296zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" />
+<glyph unicode="&#xf27d;" horiz-adv-x="1792" d="M1709 1018q-10 -236 -332 -651q-333 -431 -562 -431q-142 0 -240 263q-44 160 -132 482q-72 262 -157 262q-18 0 -127 -76l-77 98q24 21 108 96.5t130 115.5q156 138 241 146q95 9 153 -55.5t81 -203.5q44 -287 66 -373q55 -249 120 -249q51 0 154 161q101 161 109 246 q13 139 -109 139q-57 0 -121 -26q120 393 459 382q251 -8 236 -326z" />
+<glyph unicode="&#xf27e;" d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" />
+<glyph unicode="&#xf280;" d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925q32 0 44.5 -16t11.5 -63l174 21q0 55 -17.5 92.5t-50.5 56t-69 25.5t-85 7q-133 0 -199 -57.5t-66 -182.5v-72 h-96v-128h76q20 0 20 -8v-382q0 -14 -5 -20t-18 -7l-73 -7v-88h448v86l-149 14q-6 1 -8.5 1.5t-3.5 2.5t-0.5 4t1 7t0.5 10v387h191l38 128h-231q-6 0 -2 6t4 9v80q0 27 1.5 40.5t7.5 28t19.5 20t36.5 5.5zM1248 96v86l-54 9q-7 1 -9.5 2.5t-2.5 3t1 7.5t1 12v520h-275 l-23 -101l83 -22q23 -7 23 -27v-370q0 -14 -6 -18.5t-20 -6.5l-70 -9v-86h352z" />
+<glyph unicode="&#xf281;" horiz-adv-x="1792" />
+<glyph unicode="&#xf282;" horiz-adv-x="1792" />
+<glyph unicode="&#xf283;" horiz-adv-x="1792" />
+<glyph unicode="&#xf284;" horiz-adv-x="1792" />
+<glyph unicode="&#xf285;" horiz-adv-x="1792" />
+<glyph unicode="&#xf286;" horiz-adv-x="1792" />
+<glyph unicode="&#xf287;" horiz-adv-x="1792" />
+<glyph unicode="&#xf288;" horiz-adv-x="1792" />
+<glyph unicode="&#xf289;" horiz-adv-x="1792" />
+<glyph unicode="&#xf28a;" horiz-adv-x="1792" />
+<glyph unicode="&#xf28b;" horiz-adv-x="1792" />
+<glyph unicode="&#xf28c;" horiz-adv-x="1792" />
+<glyph unicode="&#xf28d;" horiz-adv-x="1792" />
+<glyph unicode="&#xf28e;" horiz-adv-x="1792" />
+<glyph unicode="&#xf500;" horiz-adv-x="1792" />
+</font>
+</defs></svg> 
\ No newline at end of file
--- /dev/null
+++ b/assets/fonts/fontawesome-webfont.ttf
@@ -0,0 +1,1211 @@
+       `FFTMn2      GDEF '~     OS/26y  (   `cmapb    gasp   t   glyfɁ  | head `   6hhea
+j    $hmtxF_   	locav|   maxp  t    name3<    postv   webfaU           mQ    Q     N            w          C  3   3  s                              pyrs                                                  n @  .         
+ / _!"""`%>N^n~.>N^n~>N^n~              / _!"""`% !@P`p  0@P`p !@P`p d]YTC2߸ݺ 
w                                                                                                                                                                                                                                                                                     	
+                                                                                      p       7!!!@pp p                  1   ]    !2#!"&463!&54>3!2+@&&&&@+$(($F#+ &4&&4& x+#       +  ".4>32".4>32467632 DhgZghDDhg-iW DhgZghDDhg-iW&@(8 2N++NdN+';2N++NdN+'3
+ 8      !        #"'#"$&6$ rL46$܏ooo|W%r4L&V|oooܳ%        = M  %+".'&%&'3!26<.#!";2>767>7#!"&5463!2 %3@m00m@3% 

@
:"7..7":6]^B@B^^BB^  $΄+0110+$ 
(	
+
t1%%1+`B^^B@B^^        "'.54632>324
+#L</>oP$$Po>Z$_dC+I@$$@I+     "  #"'%#"&547&547%62V??V8<8y
b%	I))9I	       	 +  	%%#"'%#"&547&547%62q2ZZ2IzyV)??V8<8)>~>[
+
2b%	I))9I	      '  %#!"&54>322>32  &6 yy 6Fe=	BSSB	=eF6 >xx5eud_C(+5++5+(C_due>        / ? O _ o      54&+";2654&+";2654&+";264&#!"3!2654&+";2654&+";264&#!"3!2654&+";2654&+";2654&+";267#!"&5463!2&&&&&&&&&&&& & && & &&&&&&&&& && &&&&&&&&&&&&&^BB^^B@B^@&&&&&&&&&&&& && &&&&&&&&&& && &&&&&&&&&&&&&&B^^B@B^^        / ?  #!"&5463!2#!"&5463!2#!"&5463!2#!"&5463!2 L4 4LL4 4LL4 4LL4 4LL4 4LL4 4LL4 4LL4 4L 4LL44LL4LL44LL4LL44LL4LL44LL 	        / ? O _ o    #!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2 8((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(8 (88((88(88((88(88((88(88((88(88((88(88((88(88((88(88((88(88((88          / ? O _  #!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2 8((88(@(88((88(@(8 8(@(88((8 8((88(@(8 8(@(88((88(@(88((8 (88((88(88((88(88((88(88((88(88((88(88((88    y     "/&4?62	62,PP&PP,jP  n #  $"'	"/&47	&4?62	62	PP&P&&P&P&P&&P&P      # + D  ++"&=#"&=46;546;232      #"'#"$&6$  

@



@

rK56$܏ooo|W@



@


rjK&V|oooܳ        0  #!"&=463!2      #"'#"$&6$  


@
rK56$܏ooo|W@

@
rjK&V|oooܳ         ) 5   $&54762>54&'.7>"&5462 zz+i *bkQнQkb* j*LhLLhLzzBm +*i JyhQQhyJ i*+ mJ4LL44LL          / ? O  %+"&=46;2%+"&546;2%+"&546;2+"&546;2+"&546;2 `r@@r@@        n   4&"2#"/+"&/&'#"'&'&547>7&/.=46?67&'&547>3267676;27632 Ԗ#H
+	,/
1)
+~'H
(C
+	

,/
1)	
$H
ԖԖm6%2X
+%	l2
k	r6
+
[21
..9Q
+
$
+k2
k	
+w3[20       / ; C g  +"&546;2+"&546;2+"&546;2!3!2>!'&'!+#!"&5#"&=463!7>3!2!2 @@ @@ @@@`0
+
+o`^BB^`5FN(@(NF5 @@@L%%Ju		@LSyuS@%44%       g  5  #!!!"&5465	7#"'	'&/&6762546;2& &??>

LL
>
+ X 
+  &&&AJ	A	J
+Wh          #  #!"&5463!2!&'&!"&5!(8((88((`x
+c`(8 `((88(@(8(D9 8(           ,  #!"&=46;46;2 .  6  $$ @(r^aa@@`(_^aa    2  N   C  5.+";26#!26'.#!"3!"547>3!";26/.#!2W

.@



@.$S



S$@

9I
 

 
I6>

>         % =  $4&"2$4&"2#!"&5463!2?!2"'&763!463!2!2 &4&&4&&4&&48(@(88(ч::(8@6@* & & *4&&4&&4&&4& (88(@(8888)@)'&&@      $ 0  "'&76;46;232  >& $$ `
+(r^aa`		@`2(^aa         $ 0  ++"&5#"&54762  >& $$ ^
+?@(r^aa`?		(^aa        
 #  !.'!!!%#!"&547>3!2<<<_@`&&
+5@5
+@
+&&>=(""=       '   #"'&5476.  6  $$    ! (r^aaJ	%%(_^aa     3  #!"'&?&#"3267672#"$&6$3276 &@*hQQhwI	mʬzzk)' @&('QнQh_
+	
+z8zoe      $ G   !"$'"&5463!23267676;2#!"&4?&#"+"&= !2762@hk4&&&GaF*
&@&ɆF*
Ak4&nf&&&4BHrd@&&4rd
Moe&            / ? O _ o   +"&=46;25+"&=46;25+"&=46;2#!"&=463!25#!"&=463!25#!"&=463!24&#!"3!26#!"&5463!2
@

@

@

@

@

@

@



@



@



@


^B@B^^BB^`@

@
@

@
@

@
@

@
@

@
@

@
3@


MB^^B@B^^         !54&"#!"&546;54   32@ Ԗ@8(@(88( p (8 jj(88(@(88   @   7  +"&5&5462#".#"#"&5476763232>32@@
@
@KjKך=}\I&:k~&26]S
& H&

&H5KKut,4,	& x:;*4*&        K  #+"&546;227654$ >3546;2+"&="&/&546$ <X@@Gv"DװD"vG@@X<4L41!Sk @ G<_bb_<G  kS!1zz          "'!"&5463!62 &4&&M4&&M&&M&          -  "'!"&5463!62 #"&54>4.54632 &4&&M4&UF
+&""""&
+F&M&&M&%.D.%      G  - I k  "'!"&5463!62 #"&54>4.54632#"&54767>4&'&'&54632#"&547>7676'&'.'&54632 &4&&M4&UF
+&""""&
+FU
&'8JSSJ8'&



&'.${{$.'&

&M&&M&%.D.%7;&'66'&;4[&$
[2[
$&[              # / 3 7  #5#5!#5!!!!!!!#5!#5!5##!35!!!                        # ' + / 3 7 ; ?  3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3????  ^>>~??????~??~??^??^^?  ^??          4&"2#"'.5463!2KjKKjv%'45%5&5L45&%jKKjK@5%%%%54L5&6'      k   5   4&"2#"'.5463!2#"&'654'.#32KjKKjv%'45%5&5L45&%%'4$.%%5&55&%jKKjK@5%%%%54L5&6'45%%%54'&55&6'  T d t  #!"&'&74676&7>7>76&7>7>76&7>7>76&7>7>63!2#!"3!2676'3!26?6&#!"3!26?6&#!"g(sAeM,*$/
!'&
JP$G]
+x6,&`

h`

"9Hv@WkNC<.
+&k&
+("$p"	.
#u&#	%!'	pJvwEF#

@



@

        2#"'	#"'.546763!''!0#GG$/!''!	
8""8
 X!	
8"	"8
	          <  )!!#"&=! 4&"27+#!"&=#"&546;463!232(8&4&&4
8(@(8
qO@8((`(@Oq 8(&4&&4&@`
(88(
Oq (8(`( q      ! )   2"&42#!"&546;7>3!2      Ijjjj3e5 5e3gr`Ijjjj1GG1r        P  2327&7>7;"&#"4?2>54.'%3"&#"#ժ!9&WB03&K5!)V?@L'	
>R>e;&L::%P>vO
+'h N_":-&+#
+:	'	      + a  %3 4'.#"32>54.#"7>7><5'./6$3232#"&#"+JBx)EB_I:I*CRzb3:dtB2P$$5.3b[F|\8!-T>5Fu\,,jn OrB,<!
+54wJ]?tTFi;
23j.p^%/2+
	S:T}K4W9: #ƕdfE     9  7>7676'5.'732>7"#"&#&#"$
zj=N!}:0e%	y
+tD3~U'#B4#
g		'2
+%/!:
T	bRU,7    ~  }  %2"/&6;#"&?62+326323!2>?23&'.'.#"&"$#"#&=>764=464.'&#"&'!~:~!PP!~:~!P6,,$$%*'
c2N 	
+($"LA23Yl!x!*%% %% 
pP,T	NE	Q7^oH!+(
+3	 *Ueeu
wg      a   32632$?23&'.5&'&#"&"5$#"#&=>7>4&54&54>.'&#"&'2#".465!#".'&47>32!4&4>Q6,,Fa w!*'
+=~Pl*	
+($"LA23Yl	)!*<7@@7<
 
<7@@7<
  pP,T	MF
Q747ƢHoH!+(
+3	 tJHQ6wh',686,'$##$',686,'$##$          / ?  %#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2 &&&&& && & & && &&&&&&&&&f&&&&f&&&&f&&&&          / ?  %#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2 &&&&&&&& &&&&&&&&&&&&f&&&&f&&&&f&&&&          / ?  %#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2 &&&&& && && && &&&&&&&&&f&&&&f&&&&f&&&&            / ?  %#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2 &&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&            / ? O _ o   %+"&=46;2+"&=46;2+"&=46;2#!"&=463!2+"&=46;2#!"&=463!2#!"&=463!2#!"&=463!2 











 


@
 



 


@



@



@



s


s





s





s


s


          / ? O  #"'&47632#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2
			 	

@





@



@

@



	 		 	


s


s


s


         / ? O   #"&54632	#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2`		

	 
@





@



@

@


		
@
		


s


s


s


           #"'#!"&5463!2632 '
mw@www
'*wwww          .   "&462!5	!"3!2654&#!"&5463!2pppp@  

@
^BB^^B@B^ppp@@  
@


 @B^^BB^^   k    %  !7'34#"3276'	!7632k[[v
+
+6`%`$65&%[[k
+`5%&&'          4&"2"&'&54    Ԗ!?H?!,,ԖԖ mF!&&!Fm,        %"  $$  ^aa`@^aa           -  4'.'&"26%   547>7>2 "KjK XQqYn	243nYqQ$!+!77!+!$5KK,ԑ	]""]ً	        9 > H  7'3 &7#!"&5463!2'&#!"3!26=4?6	!762xtt`   ^Qwww@?61B^^B@B^	@(` `\\\P`tt8`  ^Ͼww@w1^BB^^B~
	@` \ \P          + Z  #!"&5463!12+"3!26=47676#"'&=# #"'.54>;547632www 
M8
+pB^^B@B^
'sw-
+
+9*##;Noj'
#ww@w
"^BB^^B
+
	*
"g`81T`PSA:'*4       / D  #!"&5463!2#"'&#!"3!26=4?632"'&4?62	62www@?61
+
B^^B@B^	@
+
BRnBBn^ww@w1
+^BB^^B
	@
+BnnB          C   "&=!32"'&46;!"'&4762!#"&4762+!5462  4&& 4 &&4  4&& 4 &&4 4 &&4  4&& 4 &&4  4&&    z    6'&'+"&546;267:	&&&&	s@	
+Z&&&&Z   z  +  6'&''&'+"&546;267667:	:	&&&&		s@	
+:	
+Z&&&&Z:  zz   6'&''&47667S::s@	
+:4:    r   	&546h!!0a


$           #!"&5463!2#!"&5463!2 & && && && &@&&&&&&&&          #!"&5463!2 &&&&@&&&&      z   &54646&5-:s::4:
+	      z  +  &5464646;2+"&5&5-&&&&:s::&&&&
+	:
+	     z    &54646;2+"&5-&&&&s:&&&&
+	         62#!"&!"&5463!24@&&&&-:& && &        	"'&476244444     Zf   	"/&47	&4?62S44444       # /  54&#!4&+"!"3!;265!26  $$ & && && && &@^aa@& && && && &+^aa        54&#!"3!26  $$ & && &@^aa@&&&&+^aa       + 7  4/7654/&#"'&#"32?32?6  $$ }ZZZZ^aaZZZZ^aa      #  4/&"'&"327> $$ [4h4[j^aa"ZiZJ^aa      : F  %54&+";264.#"32767632;265467>$ $$  oW	5!"40K(0?i+! ":^aaXRdD4!&.uC$=1/J=^aa       . :  %54&+4&#!";#"3!2654&+";26 $$  ```^aa ^aa      / _  #"&=46;.'+"&=32+546;2>++"&=.'#"&=46;>7546;232m&&m l&&l m&&m l&&ls&%&&%&&%&&%& &&l m&&m l&&l m&&m ,&%&&%&&%&&%&        # / ;  "/"/&4?'&4?627626.  6  $$ I
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+͒(r^aaɒ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+(_^aa           ,  	"'&4?6262.  6  $$ Z4f44fz(r^aaZ&4ff4(_^aa        	  "  4'32>&#"  $&6$  WoɒV󇥔 zzz8YW˼[?zz:zz   @5 K    #!#"'&547632!2 A4@%&&K%54'u%%&54&K&&4A5K$l$L%%%54'&&J&j&K    5K    #"/&47!"&=463!&4?632%u'43'K&&%@4AA4&&K&45&%@6%u%%K&j&%K55K&$l$K&&u#   5K@ !  #"'+"&5"/&547632K%K&56$K55K$l$K&&#76%%53'K&&%@4AA4&&K&45&%%u'     5K "  #"'&54?63246;2632K%u'45%u&&J'45%&L44L&%54'K%5%t%%$65&K%%4LL4@&%%K'      ,   "&5#"#"'.'547!3462  4&bqb>#5&4 4 & 6Uue7D#		"ǆ &        /   #!"&546262"/"/&47'&463!2
+&@&&4L
+
+r&4
+
+r
+
+L&&
+4&&&L
+
+rI@&
+
+r
+
+L4&&     
s  /  "/"/&47'&463!2 #!"&546262 &4
+
+r
+
+L&&
+&@&&4L
+
+r@@&
+
+r
+
+L4&&
+4&&&L
+
+r         #  #!+"&5!"&=463!46;2!28(`8((8`(88(8((8(8 (8`(88(8((8(88(`8          #!"&=463!28(@(88((8 (88((88   m 5  '%+"&5&/&67-.?>46;2%6.@g.L44L.g@.
+.@g.
+L44L
+.g@.g.n.4LL43.n.gg.n.34LL4͙.n.g        -     $54&+";264'&+";26/a^




+
+
+
+^aa

fm
+        @ 
   J  %55!;263'&#"$4&#"32+#!"&5#"&5463!"&46327632#!2$$8~+(888(+}(`8((8`]]k==k]]8,8e8P88P8`(88(@MM        O   4&#"327>76$32 #"'.#"#".'.54>54&'&54>7>7>32 &z&^&./+>*>J>	Wm7'
+'"''? &4&c&^|h_bml/J@L@
#M6:D
+35sҟw$	'%
+'	\t       3  #!"&=463!2'.54>54''


@
 1O``O1CZZ71O``O1BZZ7@

@
N]SHH[3`)TtbN]SHH[3^)Tt           ! 1  &'   547 $ 4&#"2654632    '&476   ==嘅}(zVl''ٌ@uhyyhu9(}VzD##D#     	  = C U  %7.547 4&#"2654632% #"'&547.'&476 !27632#76$7&'7+NWb=嘧}(zVi\j1
+z,X
Y[6
+$!%'FuJiys?_9ɍ?kyhun(}VzYF
+KA؉La
+02-F"@Qsp@_       ! 3  %54&+";264'&+";26#!"&'&7>2 




+

+
 #%;" ";%# <F<7
+

??""??$$    2  #"'&'	+&/&'&?632	&'&?67>`,@L5
`		
+`	L`4LH`
`	
a	5
L@              # 3 7 ; ? O s  !!!!%!!!!%!!!!!!!!%!!4&+";26!!%!!!!74&+";26%#!"&546;546;2!546;232 `@ `@ @@  @
@

@
 @  
@

@
L44LL4^B@B^^B@B^4L  @@@@      @@  


@@   


M 4LL4 4L`B^^B``B^^B`L        7 q  .+"&=46;2 #"&=".'673!54632#"&=!"+"&=46;2>767>3!54632<M33K,		
 j8Z4L2B4:;M33K, ?			
 0N<* .)C=W]xD0N<* .)C=W]xD ?\-7H)		
".=']-7H)
+w		
<?.>mBZxPV3!<?.>mBZxPV3!
+        &   #"'&'5&6&>7>7&54>$32 dFK1A
+0)L.٫C58.H(Ye      # 3 C   $=463!22>=463!2#!"&5463!2#!"&5463!2 H&&/<R.*.R</&& &&&& &&&&Bɀ&&4L&&L4&&f&&&&&&&&     Z     %"'	"/&4762444ͥ55     Z   	"'&4?62	6244455        % K  %#!".<=#"&54762+!2"'&546;!"/&5463!232 
@&@<@&@	:&	
& 

+&&&	

+`&          :  $"&462"&462!2#!"&54>7#"&463!2!2LhLLhLhLLh!
&& &&& &4hLLhLLhLLhL %z<
+0&4&&)17&4&
&&           #!"&5463!2!2\@\\@\\@\\\\         W  *  #!"&547>3!2!"4&5463!2!2W+B"5P+B@"5^=\@\ \H#t3G#3G:_Ht\\     @      +32"'&46;#"&4762&& 4 && 4 4& &4  4& &4       @     "&=!"'&4762!5462  4& &4  4& &4 4 && 4 &&          
    !!!3!!                    0 @  67&#".'&'#"'#"'32>54'6#!"&5463!2 8ADAE=\W{O[/5dI
kDtpČe1?*w@www	(M&
B{Wta28r=Ku?RZ^GwT	-@www       $  2+37#546375&#"#3!"&5463ww/Dz?swww@wS88	ww           # ' . >   4&#"26546326"&462!5! &  !5!!=!!%#!"&5463!2B^8(Ԗ  > @|K5 5KK5 5K^B(8ԖԖ>v 5KK5 5KK   H  G   4&"&#"2654'32#".'#"'#"&54$327.54632@pp)*Pppp)*Pb	'"+`N*(a;2̓c`." b
+PTY9ppP*)pppP*) b ".`(*Nͣ2ͣ`+"'	b
+MRZB               4&"24&"264&"26#"/+"&/&'#"'&547>7&/.=46?67&'&547>3267676;27632#"&'"'#"'&547&'&=4767&547>32626?2#"&'"'#"'&547&'&=4767&547>32626?2ԖLhLKjKLhLKjK	"8w
+s%(")v

+
+>
+	"8x
+s"+")v
+<
+3zLLz3
3>8L3)x3
3zLLz3
3>8L3)x3
ԖԖ 4LL45KK54LL45KK
+#)0C
+
+wZl/
+
+Y	
+N,&
+#)0C	vZl.
+
+Y	
+L0"qG^^Gqq$ ]G)FqqG^^Gqq$ ]G)Fq         % O   #"'#"&'&4>7>7.546$ '&'&'# '32$7>54'VZ|$2$
+|E~E<|
+$2$|ZV:(t}X(	
&%(Hw쉉xH(%&	(XZT\MKG        < m  $4&"24&#!4654&#+32;254'>4'654&'>7+"&'&#!"&5463!6767>763232 &4&&4N2`@`%)7&,$)'  
%/0Ӄy#5 +1	&<$]`{t5KK5$e:1&+'3TF0h4&&4&3M:;b^v+D2 5#$IIJ 2E=\$YJ!$MCeM-+(K55KK5y*%Au]c         = p   4&"24&'>54'64&'654&+"+322654&5!267+#"'.'&'&'!"&5463!27>;2 &4&&4+ 5#bW0/%
  ')$,&7)%`@``2Nh0##T3'"(0;e$5KK5 tip<&	1&4&&4& #\=E2 JIURI$#5 2D+v^b;:M2gc]vDEA%!bSV2MK55K(,,MeCM$!J   @   #"&547&547%6@?V8b%	I)         9  4.""'."	67"'.54632>32+C`\hxeH>Hexh\`C+ED4
+#L</>oP$$Po>Q|I.3MCCM3.I|Q/Z$_dC+I@$$@I+           ( @  %#!"&5463!2#!"3!: "&5!"&5463!462
ww@

B^^B 
+4&@&&&4 ` 
ww
 
^B@B^24& && &        % 5  73#7.";2634&#"35#347>32#!"&5463!2FtIG9;HIxI<,tԩw@wwwz4DD43EEueB&#1s@www      .  4&"26#!+"'!"&5463"&463!2#2&S3Ll&c4LL44LL4c@&&{ LhLLhL           ' ?  #!"&5463!2#!"3!26546;2"/"/&47'&463!2www@B^^B@B^@&4t
+
+r
+
+& &`ww@w@^BB^^B@R &t
+
+r
+
+4&&         @   "&5!"&5463!462	#!"&54&>3!2654&#!*.54&>3!24&@&&&4 sw

@B^^B
+
@w4& && &3@w
 
^BB^ 
     
 I  &5!%5!>732#!"&=4632654&'&'.=463!5463!2!2J  JSq*5&=CKuuKC=&5*q͍S8( ^B@B^ (8`N`Ѣ΀GtO6)"M36J[E@@E[J63M")6OtG(8`B^^B`8           % - 3   %'&76'&76''&76'&76'&6#5436&76+".=4'>54'6'&&"."&'./"?+"&5463!2
	2				5
+
+
+
+	
+	z<: Ʃw
+49[aA)O%-j'&]]5r,%O)@a[9(	0BA;+
+
+
>HCwww		5/)
+	u

+@wa-6OUyU[q	( -	q[UyUP6$C
+
++) (	
+8&/
&ww       ' ?  $4&"2$4&"2#!"&5463!3!267!2#!#!"&5!"'&762 &4&&4&&4&&48(@(88(c= =c(8* & & *6&4&&4&&4&&4& (88(@(88HH88`(@&&('@       1 d  4&'.54654'&#"#"&#"32632327>7#"&#"#"&54654&54>76763232632
+
+
+	N<;+gC8A`1a99gw|98aIe$IVNz<:LQJ
+	,-[%	061I()W,$-7,oIX()oζA;=N0
+eTZ
+
+(         O  #".'&'& '&'.54767>3232>32e^\3@P	bMO0#382W#& 9C9
+Lĉ"	82<*9FF(W283#0OMb	P@3\^eFF9*<28	"L
+9C9 &#           !"3!2654&#!"&5463!2`B^^B@B^^ީwww@w ^BB^^B@B^ww@w      #  !72#"'	#"'.546763 YY!''!0#GG$/!''! &UUjZ	
8""8
 X!	
8"	"8
	        E U  4'./.#"#".'.'.54>54.'.#" 32676#!"&5463!2 G55
+:8c7
)1)
+
+05.D
<90)$9 w@wwwW+
+AB
7c
)$+
+-.1 9$)0<
D.59@www    ,  T  1  # '327.'327.=.547&54632676TC_LҬ#+i!+*pDNBN,y[`m`%i]hbEm}au&,SXK
+&$f9s?
+    _    #"!#!#!54632V<%' ЭHH	(ں       R   &=4'>54'6'&&"."&'./"?'& 54$  49[aA)O%-j'&]]5r,%O)@a[9(	0BA;+
+
+
>HCaaoMa-6OUyU[q	( -	q[UyUP6$C
+
++) (	
+8&/
&fMa         %  +"&54&"32#!"&5463!54   &@&Ԗ`(88(@(88(r && jj8((88(@(8        # ' +  2#!"&5463"!54&#265!375!35!B^^BB^^B



` ^B@B^^BB^

 
`
       ! =   "&462+"&'& '.=476;+"&'& $'.=476;pppp$!$qr
%}#ߺppp!E$
rqܢ#
%
ֻ!           ) ?   "&462"&4624&#!"3!26!.#!"#!"&547>3!2/B//B//B//B
@


2^B@B^\77\aB//B//B//B/@




~B^^B@2^5BB52   v  . 4  2## %&'.67#"&=463! 2 5KK5L4_u:B&1/&.-
+zB^^B4LvyKjK4L[!^k'!A3;):2*<vTq6^BB^L4$)*    @     A  4#"&54"3! 4."#!"&5!"&5>547&5462;U gIv0ZZ0L4@Ԗ@4L2RX='8P8'=XR U;Ig0,3lb??bl34LjjL4*\(88(\   x I  /#"/'&/'&?'&'&?'&76?'&7676767676`
+(5)0
+)*)
+0)5(
+
+(5)0
+))))
+0)5(
+*)
+0)5(
+)5)0
+)**)
+0)5)
+
+)5)0
+)*      5 h  $4&"24&#!4>54&#"+323254'>4'654&'!267+#"'&#!"&5463!2>767>32!2 &4&&4N2$YGB
(HGEG  HQ#5K4Li!<;5KK5 
+A#
("/?&}vh4&&4&3M95S+C=,@QQ9@@IJ 2E=L5i>9eME;K55K	J7R>@#zD<      7 ? s  %3#".'.'&'&'.#"!"3!32>$4&"2#!"#"&?&547&'#"&5463!&546323!2`  #A<(H(GY$2NL4K5#aWTƾh&4&&4K5;=!ihv}&?/"(
#A
+ 5K2*!Q@.'!&=C+S59M34L=E2 JI UR@@&4&&4&5K;ELf9>ig<Dz#@>R7J	K         5 h  4&"24#"."&#"4&#"".#"!54>7#!"&54.'&'.5463246326326 &4&&4IJ 2E=L43M95S+C=,@QQ9@@E;K55K	J7R>@#zD<gi>9eMZ4&&4&<#5K4LN2$YGB
(HGEG  HV;5KK5 
+A#
("/?&}vhi!<         4 < p  4.=!32>332653272673264&"2/#"'#"&5#"&54>767>5463!2@@2*!	Q@.'!&=C+S59M34L.9E2 JI UR&4&&4&Lf6Aig6Jy#@>R7J	K55K;E@TƾH  #A<(H(GY$2NL4K#5#a=4&&4&D=ihv}&?/"(
#A
+ 5KK5;         +  54&#!764/&"2?64/!26  $$  &
+[6[[j6[& ^aa@&4[[6[[6&+^aa        +   4/&"!"3!277$ $$ [6[
+&&[6j[
^aae6[j[6&&4[j[^aa      +   4''&"2?;2652?$ $$ [6[[6&&4[^aaf6j[[6[
+&&[^aa      +   4/&"4&+"'&"2?  $$ [6&&4[j[6[j^aad6[&&
+[6[[j ^aa             $2>767676&67>?&'4&'.'.'."#&6'&6&'3.'.&'&'&&'&6'&>567>#7>7636''&'&&'.'"6&'6'..'/"&'&76.'7>767&.'"76.7"7"#76'&'.'2#22676767765'4.6326&'.'&'"'>7>&&'.54>'>7>67&'&#674&7767>&/45'.67>76'27".#6'>776'>7647>?6#76'6&'676'&67.'&'6.'.#&'.&6'&.5/a^D&"	
+
+
+	4
	$!	#
	
+		
+	
+
+

+ 
+.0"Y
+	+


!	
+	

+$	
	"
+
+
+
+		
+	Α	
+		
^aa
+
	
+
+			
	

	
+
+		
+	
		P '-(	#	*
+$

+"
!				
*
+!	

+(				
+
	
+$
+		
+2
   ~   /  $4&"2	#"/&547#"  32>32&4&&4V%54'j&&'/덹:,{	&4&&4&V%%l$65&b'Cr!"k[G             + ;  %!5!!5!!5!#!"&5463!2#!"&5463!2#!"&5463!2    &&&&&&&&&&&&@ && && && && && &&      #"'&5&763!2{'
 * *)* )'             /  !5!#!"&5!3!26=#!5!463!5463!2!2  ^B@B^&@&`   ^B`8(@(8`B^   B^^B&&B^(88(^      G  	76#!"'&?	#!"&5476	#"'&5463!2	'&763!2#"'c)'&@**@&('c(&*cc*&'
*@&('c'(&*cc*&('c'(&@*        1 9 A S [  #"&532327#!"&54>322>32 "&462  &6 +&'654'32>32"&462QgRp|Kx;CByy 6Fe=
+BPPB
+=eF6  ԖV>!pRgQBC;xK|Ԗ{QNa*+%xx5eud_C(+5++5+(C_due2ԖԖ>NQ{u%+*jԖԖ     p ! C i  4/&#"#".'32?64/&#"327.546326 #"/&547'#"/&4?632632(* 8(!)(A(')* 8(!USxySSXXVzxTTUSxySSXXVzxT@( (8 *(('((8 SSUSx{VXXTTSSUSx{VXXT        #!" 5467&54 32632t,Ԟ;F`j)6,>jK?  Q/  !  %#!"&7#"&463!2+!'5#8EjjE8@&& &&@XYY&4&&4&qDS%q%       N \ j x     2"&4#"'#"'&7>76326?'&'#"'.'&676326326&'&#"32>'&#"3254?''74&&4&l
NnbSVZbRSD	
zz
	DSRb)+USbn
\.2Q\dJ'.2Q\dJ.Q2.'Jd\Q2.'Jd`!O` 	`&4&&4r$#@B10M5TNT{L5T
	II	
T5L;l'OT4M01B@#$*3;$*3;;3*$;3*$:$/ @@Qq`@         " % 3 <  2#!"&5!"&5467>3!263!	!!#!!46!#!(88(@(8(8(`((8D<++<8(` (8(`8(@(88( 8((`(8((<`(8 (``(8    || ?  %#"'&54632#"'&#"32654'&#"#"'&54632|udqܟs]
+=
+OfjL?R@T?"&
+>
+f?rRX=Edudsq
+=
+_MjiL?T@R?E& f
+>
+=XRr?b      ! 1 E  )!34&'.##!"&5#3463!24&+";26#!"&5463!2  
+
+08((88(@(8



8((88((`(1
+
+`(88( (88( @


`(88(@(8(`         #!"&5463!2 w@www`@www             /  %#!"&=463!2#!"&=463!2#!"&=463!2 &&&&&&&&&&&&&&&&&&&&&&&&    @    ' 7 G  $"&462"&462#!"&=463!2 "&462#!"&=463!2#!"&=463!2ppppppp
@


ppp
@



@


Рpppppp


ppp





         < L \ l |  #"'732654'>75"##5!!&54>54&#"'>3235#!"&=463!2!5346=#'73#!"&=463!2#!"&=463!2}mQjB919+i1$AjM_3</BB/.#U_:IdDRE
@

k*Gj
@


@


TP\BX-@8
+C)5XsJ@$3T4+,:;39SG2S.7<

vcc)(%Ll}




         5 e  2#!"&=463%&'&5476!2/&'&#"!#"/&'&=4'&?5732767654'&@02uBo
+T25XzrDCBBEh:%)0%HPIP{rQ9f#-+>;I@KM-/Q"@@@#-a[$&P{<8[;:XICC>. '5oe71#.0(
l0&%,"J&9%$<=DTI     c s  &/6323276727#"327676767654./&'&'737#"'&'&'&54'&54&#!"3!260%
<4"VRt8<@<
-#=XYhW8+0$"+dTLx-'I&JKkmuw<=V@!X@		v
'|N;!/!$8:IObV;C#V
+
&
(mL.A:9 !./KLwPM$@@  
+       / ? O _ o     %54&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!26#!"&5463!2 @@ @ @ @ @ @ @@^BB^^B@B^NB^^B@B^^         # + 3  	'$"/&4762%/?/?/?/?%k*66bbbb|<<<bbbbbbbb%k66Ƒbbb<<<<^bbbbbb    @      M  $4&"2!#" 4&"2&#"&5!"&5#".54634&>?>;5463!2LhLLh
		 LhLLhL!'ԖԖ@'!&	
?& &LhLLhL 		
hLLhL 	jjjj	&@6/"
&&       J   #"'676732>54.#"7>76'&54632#"&7>54&#"&54$  ok;	-j=yhwi[+PM3ѩk=J%62>VcaaQ^ ]G"'9r~:`}Ch  0=Z٤W=#uY2BrUI1^Fk[|a      L  2#!67673254.#"67676'&54632#"&7>54&#"#"&5463ww+U	,i<F{jh}Z+OM

+2ϧj<J%51=Ubwww@wzX"'8'TyI9`{Bf 
+,>XբW<"uW1AqSH1bdww        % S _ o  #".54>32#".54632?!"32732>54.4>54&'35#5##33#!"&5463!2=uQ)OH,2QS+*
+$
		JB;5P#@<5Q#jXUg^
(R/9%<NM&<yjB(::(,,-2v@@w@www>LI&D,.D#<OUl4=VZp@@W]{,23X3+E,=hA1Q4+-,)&.I.<O3@@@`@www     N  0 E ` l  #"&'&54676%.547#"&5467>3!#'267654.#"2>54.'&#"3##5#5353@[Z@0HꟄ9%YJ .H?MpJL1EF1&P5"?j@*Q/+=Y6:k[7'9C 5hoS6Fq}kii$ECPNZSzsS`<GQ.R*@)$1R6B@X?ZHsG;@>!9f:}R'!;e.ggR44^>0$/.0$8];Fk;lll         , <  !5##673#$".4>2"&5!#2!46#!"&5463!2 rM*
 *M~~M**M~~M*jjj& && &`P%挐|NN||NN|* jj jj@&&&&    @  
   "'&463!2 @4@&Z4@4&        @ 
   #!"&4762 &&4Z4&&4@     @  
  "'&4762&4@4&@&4&      @ 
   "&5462@@4&&44@&&@        
   3!!%!!26#!"&5463!2`m`
^BB^^B@B^
 `@B^^BB^^    @ 
    "'&463!2#!"&4762 @4@&&&&44@4&Z4&&4@         
   "'&463!2 @4@&4@4&        @ 
   #!"&4762 &&4Z4&&4@          :  #!"&5;2>76%6 +".'&$'.5463!2 ^B@B^,9j9Gv33vG9H9+bI\
+A+=66=+A
+[">nSMA_:B^^B1&c*/11/*{'VO3@/$$/@*?Nh^    l   +  !+"&5462!4&#"!/!#>32]_gTRdgdQV?UI*Gg?!2IbbIJaaiwE3300 08        4   #"$'&6?6332>4.#"#!"&54766$32 z䜬m
+IwhQQhbF*@&('kz
+	
+_hQнQGB'(&*eoz  ( q  !#"'&547"'#"'&54>7632&4762.547>32#".'632%k'45%&+ ~(
(h		&
+
+\(
(		&
+
+~ +54'k%5%l%%l$65+ ~
+
+&		(
(\
+
+&		h(
(~ +%'         ! ) 1 9 K   4&"2 4&"26.676&$4&"2 4&"24&"2#!"'&46$ KjKKjKjKKje2.e<^P,bKjKKjKjKKjKjKKj##LlLKjKKjKjKKjK~-M<M(PM<rjKKjKjKKjKujKKjKL           <    6?32$6&#"'#"&'5&6&>7>7&54$ LhяW.{+9E=cQdFK1A
+0)pJ2`[Q?l&٫C58.H(Y'        : d    6?32$64&$ #"'#"&'&4>7>7.546'&'&'# '32$7>54'Yj`a#",5NK
+~EVZ|$2$
+|:
+$2$|ZV:(t}hfR88T
+h̲X(	
&%(Hw(%&	(XZT\MKG{x   !  #"'.7#"'&7>3!2%632u

+j
H{(e9
+1b      U  #!"&546;5!32#!"&546;5!32#!"&546;5463!5#"&5463!2+!232 8((88(` `(88((88(` `(88((88(`L4 `(88(@(88(` 4L`(8 (88(@(88((88(@(88((88(@(84L8(@(88((8L48      O Y  "&546226562#"'.#"#"'.'."#"'.'.#"#"&5476 $32&"5462И&4&NdN!>!
1X:Dx++ww++xD:X1
- U
! *,*&4&hh&&2NN2D&

+..J<
+$$
+<JJ<
+$$
+<J..
+
Pbb&&          7  !!"&5!54&#!"3!26!	#!"&=!"&5463!2 `(8 
@


 + 8(@(8(88(@(8(8( @

@
m+U`(88(8(@(88(
h`         ( \  "&54&#"&46324."367>767#"&'"&547&547&547.'&54>2l4

2cKEooED
+)
+

+)
+Dg-;</-
?.P^P.?
-/<;-gYY

.2 L4H|O--O|HeO,,Oeq1Ls26%%4.2,44,2.4%%62sL1qcqAAq      4  #!#"'&547632!2#"&=!"&=463!54632 

		@	
`
		


`?`


+@	
	@	
!		



+          5  4&+4&+"#"276#!" 5467&54 32632 


	`		_
+v,Ԝ;G_j)``


			_ԟ7
,>jL>       5  4'&";;265326#!" 5467&54 32632 			
+


v,Ԝ;G_j)	`		

`7
,>jL>        X `  $"&462#!"&54>72654&'547 7"2654'54622654'54&'46.'  &6 &4&&4&yy%:hD:FppG9Fj 8P8 LhL 8P8 E;
+Dh:%>4&&4&}yyD~s[4Dd=PppP=d>hh>@jY*(88(*Y4LL4Y*(88(*YDw"
+A4*[s~>       M   4&"27 $=.54632>32#"' 65#"&4632632 65.5462 &4&&4G9&
+<#5KK5!!5KK5#<
+&ܤ9Gpp&4&&4&@>buោؐ &$KjKnjjKjK$& jjb>Ppp      
  %  !5!#"&5463!!35463!2+32  @\\ 8(@(8 \@@\ \@\  (88(\   @    3  4#"&54"3#!"&5!"&5>547&5462;U gI@L4@Ԗ@4L2RX='8P8'=XR U;Ig04LjjL4*\(88(\    @    "   4&+32!#!"& +#!"&5463!2pP@@P j j@@\@\&0pj	 \\&       - B  +"&5.5462265462265462+"&5#"&5463!2G9L44L9G&4&&4&&4&&4&&4& L44L
 &=d4LL4d=&&`&&&&`&&&&4LL4 
 &         # 3 C S  #!"&5463!2!&'&!"&5!463!2#!"&52#!"&=4632#!"&=463(8((88((`x
+c`(8  @@@`((88(@(8(D9 8( `@@@ @@        / ? O _ o         -=  %+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!!5463!2#!"&5463!2
@

@

@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@
 & && &@

@
@

@

@

@
@

@
@

@
@

@
@

@
@

@
@

@
@

@
@

@
@

@
@

@
@

@
@

@
@

@
@

@

@

@
  

`&&&& 
       / ? O _ o        %+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!#!"&=!!5463!24&+"#54&+";26=3;26%#!"&5463!463!2!2
@

@

@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@

@
 
@

@
  8(@(8 
@

@

@

@

@
 & &&@8((8@&@

@
@

@

@

@
@

@
@

@
@

@
@

@
@

@
@

@

@

@
 (88( 

@

``



``
- && & (88(&  @    < c  $4&"2!# 4&"254&+54&+"#";;26=326+"&5!"&5#"&46346?>;463!2KjKKj KjKKj &ԖԖ&&@&&KjKKjK 
+jKKjK .&jjjj&4&@@&&      # ' 1 ? I  54&+54&+"#";;26=326!5!#"&5463!!35463!2+32    \\8(@(8 \  \ \@\  (88(\          :  
#32+53##'53535'575#5#5733#5;2+3@E&&`@@`    `@@`&&E%@`@ @ @		      		@ :#   @      !3!57#"&5'7!7! K5@   @ 5K@@@      # 3  %4&+"!4&+";265!;26#!"&5463!2 && &&&& && w@www&&@&&&&@&&@www        # 3  54&#!4&+"!"3!;265!26#!"&5463!2 &&&&&@&&@& w@www@&@&&&&&&@&:@www    - M3  )  $"'&4762	"'&4762	s
+2
+
+.
+
+
+
+2
+
+w
+2
+
+.
+
+
+
+2
+
+w
+2
+
+
+
+
+
+2
+
+ww
+
+2
+
+
+
+
+
+2
+
+ww    
 M3  )   "/&47	&4?62"/&47	&4?62S
+.
+
+2
+
+w
+
+2
+
+
+.
+
+2
+
+w
+
+2
+
+M
+.
+
+2
+
+
+
+2
+
+.
+
+.
+
+2
+
+
+
+2
+
+.   M 3S  )  $"'	"/&4762"'	"/&47623
+2
+
+ww
+
+2
+
+
+
+
+
+2
+
+ww
+
+2
+
+
+
+
+2
+
+w
+
+2
+
+
+
+.v
+2
+
+w
+
+2
+
+
+
+.    M 3s  )   "'&4?62	62"'&4?62	623
+.
+
+.
+
+2
+
+
+
+2
+
+.
+
+.
+
+2
+
+
+
+2
+.
+
+
+
+2
+
+w
+
+2v
+.
+
+
+
+2
+
+w
+
+2   - Ms3    	"'&4762s
+w
+
+2
+
+.
+
+
+
+2
+ww
+
+2
+
+
+
+
+
+2    
 MS3    "/&47	&4?62S
+.
+
+2
+
+w
+
+2
+
+M
+.
+
+2
+
+
+
+2
+
+.    M
3S    "'	"/&47623
+2
+
+ww
+
+2
+
+
+
+m
+2
+
+w
+
+2
+
+
+
+.    M-3s    "'&4?62	623
+.
+
+.
+
+2
+
+
+
+2-
+.
+
+
+
+2
+
+w
+
+2        /  4&#!"3!26#!#!"&54>5!"&5463!2 


@
^B  & &  B^^B@B^ @


MB^%Q=
&&<P&^B@B^^            + 3  "&5463!2#3!2654&#!"3#!"&=324+"3B^^B@B^^B
@


`^BB^p ^BB^^B@B^`@


S`(88(``             '  $4&"2%4&#!"3!26#!"&5463!2&4&&4


@
^BB^^B@B^f4&&4&

@
B^^B@B^^            /  $4&"2%4&#!"3!264+";%#!"&5463!2/B//B 
 

 
0L4 4LL4 4L_B//B/

@
M    4LL4 4LL            >& $$ (r^aa(^aa        ! C  #!"&54>;2+";2#!"&54>;2+";2 pPPpQh@&&@j8(PppPPpQh@&&@j8(Pp@PppPhQ&&j (8pPPppPhQ&&j (8p         ! C  +"&=46;26=4&+"&5463!2+"&=46;26=4&+"&5463!2 Qh@&&@j8(PppPPpQh@&&@j8(PppPPp@hQ&&j (8pPPppP@hQ&&j (8pPPpp     @@  	   # + 3 ; G  $#"&5462 "&462 "&462#"&462 "&462 "&462 "&462#"&54632K54LKj=KjKKjKjKKjL45KKjK<^^^KjKKjppp\]]\jKL45KjKKjKujKKjK4LKjKK^^^jKKjKpppr]]\            $$  ^aaQ^aa      ,  #"&5465654.+"'&47623  #>bqb&4  4&ɢ5"		#D7euU6 & 4 & m       1 X   ".4>2".4>24&#""'&#";2>#".'&547&5472632>3=T==T==T==T=v)GG+v@bRRb@=&\Nj!>3lkik3hPTDDTPTDDTPTDDTPTDD|xxXK--K|Mp<#	)>dA{RXtfOT# RNftWQ          ,  %4&#!"&=4&#!"3!26#!"&5463!2!2 8(@(88((88((8\@\\@\\(88(@(88(@(88@\\\\       u  ' E  4#!"3!2676%!54&#!"&=4&#!">#!"&5463!2!2325([5@(\& 8((88((8 ,9.+C\\@\ \6Z]#+#,k(88(@(88(;5E>:5E\\\ \1.           $ 4 @  "&'&676267> "&462"&462 .  > $$ n%%/02
+KjKKjKKjKKjKfff^aayy/PccP/jKKjKKjKKjKffff@^aa        $ 4 @  &'."'.7>2 "&462"&462 .  > $$ n20/%7KjKKjKKjKKjKfff^aa3/PccP/y	jKKjKKjKKjKffff@^aa         + 7   #!"&463!2 "&462"&462 .  > $$ &&&&KjKKjKKjKKjKfff^aa4&&4&jKKjKKjKKjKffff@^aa       # + 3 C  54&+54&+"#";;26=3264&"2 4&"2$ #"'##"  3!2@@KjKKjKKjKKjKܒ,gjKKjKKjKKjKXԀ,,          # / ; G S _ k w       +"=4;27+"=4;2'+"=4;2#!"=43!2%+"=4;2'+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;54;2!#!"&5463!2```` ````````````` `` `` p` K55KK55Kp````````````````````````` 5KK55KK     @   * V  #"'.#"63232+"&5.5462#"/.#"#"'&547>32327676R?d^7ac77,9xm#@#KjK#
+ڗXF@Fp:f_ #WIpp&3z	h[ 17q%q#::#5KKu't#!X:	%#+=&>7p   @    * 2 F r  56565'5&'.	#"32325#"'+"&5.5462#"/.#"#"'&547>32327676@ͳ8
2.,#,fk*1x-!#@#KjK#
+ڗXF@Fp:f_ #WIpp&3z	e`vo8t-	:5	[*#::#5KKu't#!X:	%#+=&>7p  
  3  $  	"/&47	&4?62#!"&=463!2I.
+
+2
+
+w
+
+2
+
+
+-@).
+
+2
+
+
+
+2
+
+.
+-@@     -S  $ 9  %"'&4762		/.7>	"/&47	&4?62i2
+
+.
+
+
+
+2
+
+w
+E>

u>

.
+
+2
+
+w
+
+2
+
+
+2
+
+
+
+
+
+2
+
+ww
+!




h.
+
+2
+
+
+
+2
+
+.
+       ;  #"'&476#"'&7'.'#"'&476'
  )'s
"+5+@ա'
  )'F* 4 *Er4M:}}8GO
* 4 *     
+ (  -/'	#"'%#"&7&67%632B;><V??V --C4
+<B=cB5!%%!b 7I))9I7       	#"'.5!".67632y(
+#
+ 
 ##@,(
+)        8  !	!++"&=!"&5#"&=46;546;2!76232-SSS
+
+		 SS``		
+
+          K  $4&"24&"24&"27"&5467.546267>5.5462 8P88P88P88P8P88P4,DS,4pp4,,4pp4,6d7AL*',4ppP88P8P88P8HP88P8`4Y&+(>EY4PppP4Y4Y4PppP4Y%*<O4Y4Ppp        & A ] i u   	#"'&4762"&5462&#!"&463!2#"'&'7?654'7&#"&'&54?632#!"&463!2"&5462"'&4762 
+
		 
+
+	@USxySR#PT('#TUSxySN@ 		 
+
+		 		
+
+ 		
+3@xSSUO#'(V^'(PVvxSSUi @ 		
+
+ 		
+     ^     <  +"&=46;2+"&=467>54&#"#"/.7!2<'G,')7N;2]=A+#H


0PRH6^;<T%-S#:/*@Z}
+

+>h         .  %#!"&=46;#"&=463!232#!"&=463!2& &&@@&&&@&& && &&&&&&&&f&&&&   a      #!"&=463!2#!"&'&63!2 & && &' '%@% &&&& && &&    k " G  %#/&'#!53#5!36?!#!'&54>54&#"'6763235	
+Ź}4NZN4;)3.i%Sin1KXL7觧*	#&		*@jC?.>!&1'\%Awc8^;:+<!P        " F  %#/&'#!53#5!36?!#!'&54>54&#"'6763235	
+Ź}4NZN4;)3.i%PlnEcdJ觧*	#&		*-@jC?.>!&1'\%AwcBiC:D'P          %!	#!"&'&6763!2P &: &?&: &?5"K ,)""K ,)      h  #".#""#"&54>54&#"#"'./"'"5327654.54632326732>32YO)I-D%n "h.=T#)#lQTv%.%P_	%	
%_P%.%vUPl#)#T=@/#,-91P+R[Ql#)#|''
+59%D-I)OY[R+P19-,# #,-91P+R[YO)I-D%95%_P%.%v      ' 3   !2#!"&463!5& =462   =462 &546  &&&& &4&r&4& @&4&&4&G݀&&&&f    
s   C K  &=462	#"'32 =462 !2#!"&463!5&'"/&4762%4632e*&4&i76`al&4& &&&& }n
+
+R
+
+
+
+R
+zfOego&&5`3&&&4&&4&
D
+
+R
+
+
+
+R
+z v        "  !676"'.5463!2@@w^Cct~55~tcC&&@?J V|RIIR|V &&           # G  !!%4&+";26%4&+";26%#!"&546;546;2!546;232@@ @@L44LL4^B@B^^B@B^4L   N 4LL4 4L`B^^B``B^^B`L     L   4&"2%#"'%.5!#!"&54675#"#"'.7>7&5462!467%632 &4&&4@ o& &}c ;pG=(
8Ai8^^.&4&&4&`	`fs&& jo/;J!#2
+ KAE*,B^^B!`	      -   4&"2#"/&7#"/&767%676$!28P88PQr	@
U	@
+{`PTP88P8P`
+	@U	@rQ           !6'&+!!!!2Ѥ
8̙e;<*@8 !GGGQII            %764'	64/&"2  $$ f3f4:4^aaf4334f:4:^aa         %64'&"	2  $$ :4f3f4F^aa4f44f^aa         764'&"27	2  $$ f:4:f4334^aaf4:4f3^aa            %64/&"	&"2  $$ -f44f4^aa4f3f4:w^aa   @    7!!/#35%!'!%j/d
jg2|855dc b    @   !	!%!!7!FG)DH:&HdS)         U   4&"2#"/ $'#"'&5463!2#"&=46;5.546232+>7'&763!2&4&&4f
+]wq4qw]	`dC&&:FԖF:&&Cd`4&&4&	]]	`d[}&&"uFjjFu"&&y}[d       #  2#!"&546;4   +"&54&" (88(@(88( r&@&Ԗ 8((88(@(8@&&jj           ' 3   "&462 &         .  > $$  Ԗ>aX,fff^aaԖԖa>TX,,~ffff@^aa          /  +"&=46;2+"&=46;2+"&=46;28((88((8 8((88((8 8((88((8 (88((88((88((88((88((88           /  +"&=46;2+"&=46;2+"&=46;28((88((88((88((88((88((8 (88((88(88((88(88((88        5 E  $4&"2%& '&;26%&.$'&;276#!"&5463!2 KjKKj



f	
+
\

+w@wwwjKKjK"H


ܚ

f
+
+



+	@www             $64'&327/a^  !  ^aaJ@%%	  65   /  	64'&"2	"/64&"'&476227 <ij6j6u%k%~8p8}%%%k%}8p8~%<<ij4j4t%%~8p8~%k%%%}8p8}%k          54&#!"3!26#!"&5463!2 &&&& w@www@&&&&:@www        /  #!"&=463!24&#!"3!26#!"&5463!2@^BB^^B@B^www@w@@2@B^^BB^^ww@w       +#!"'&?63!#"'&762(@	@(@>@%%%        !232"'&76;!"/&76 
($>(
		 J &%       $  %64/&"'&"2#!"&5463!2ff4-4ff4fw@wwwf4f-f4@www         /  #5#5'&76	764/&"%#!"&5463!248`
# \P\w@www4`8

#@  `\P\`@www        )  4&#!"273276#!"&5463!2 & *f4
' w@www`&')4f*@www     % 5  	64'&"3276'7>332#!"&5463!2`'(wa8!
+
+,j.(&w@www`4`*'?_`ze<	bw4/*@www           - .  6  $$     (r^aaO (_^aa     
  -  "'&763!24&#!"3!26#!"&5463!2yB((
@


 w@www]#@## 

@
@www     
  -  #!"'&7624&#!"3!26#!"&5463!2y((@B@u
@


 w@www###@

@
@www     
  -   '&54764&#!"3!26#!"&5463!2@@####@ w@wwwB((@@www      `  %#" '#"&=46;&7#"&=46;6 32/.#"!2#!!2#!32>?6#
!"'?_

BCbCaf\	+
~2	
+
+	}0$


q
90r 


pr%Dpu       ?  #!"&=46;#"&=46;54632'.#"!2#!!546;2D
a__	g	

+*`-Uh1



߫}
+	$^L

    %   b  +"&=.'&?676032654.'.5467546;2'.#"ǟ
B{PDg	q%%Q{%P46'-N/B).ĝ
9kC<Q
7>W*_x*%K./58`7E%_
	,-3
+cVO2")#,)9;J)
"!*
+#VD,'#/&>AX      >  ++"' '&=46;267!"&=463!&+"&=463!2+32Ԫ$
+		
pU9ӑ
@/*fo	

VRfq
f=S    E  !#"&5!"&=463!5!"&=46;&76;2>76;232#!!2#![


 


+
+%
+)
+	

"

Jg
Uh
BW&WX
hU
g
        8   4&#!!2 #!!2#!+"&=#"&=46;5#"&=46;463!2j@jo
g|@~vv
u            n  #467!!3'##467!++"'#+"&'#"&=46;'#"&=46;&76;2!6;2!6;232+32QKt# #FNQo!"դѧ!mY
+
+Zga~bm]
+
+[o"U+, @h
+h@@X
hh
@   8  3 H \  #5"'#"&+73273&#&+5275363534."#22>4.#2>ut
3NtRP*Ho2
+
Lo@!R(Ozh=,G<X2O:&D1A.1G$<2I+A;"B,;&$LGlF/ 3D;a$8$".!3!
+.          3!#!"&5463! 8( 8((88(  h (8(88(@(8         ( 8 H  !!#!"&5463!54&#!"3!2654&#!"3!2654&#!"3!26(D 8((88( 8@@@$(88(@(8(8 @@@@@@    }  
+ $ B R  3/&5##"'&76;46;232!56?5"#+#5!76;5!53'#3!533H
+
+
Dq		x7	K//KFh/"		@`Z		sYwjjjjj      }  
+ $ 4 R  %3/&5##"'&76;46;232!53'#3!533!56?5"#+#5!76;5H
+
+
K//KFq		x7	h/"		@`jjjjjZ		sY
+w       ) 9 I Y  %#"'&76;46;232#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2
+
+
 @@  `		@`          ) 9 I Y  #!"&=463!2%#"'&76;46;232#!"&=463!2#!"&=463!2#!"&=463!2   
+
+
@@ r		@`r       
+ $ C V  %4&#"326#"'&76;46;232%#"'&'73267##"&54632!5346=#'73BX;4>ID2F
+
+
8PuE>.'%&TeQ,jm{+>R{?jJrL6V		@`7>wmR1q
uWei/rr
:Vr        
+ $ 7 V  4&#"326#"'&76;46;232!5346=#'73#"'&'73267##"&54632BX;4>ID2F
+
+
+>R{8PuE>.'%&TeQ,jm{?jJrL6		@`rr
:Vr3>wmR1q
uWei    @   \  %4&#"326#!"&5463!2+".'&'.5467>767>7>7632!2 &%%&&&& &7.'	:@$LBWM{#&$h1D!		.I/!	Nr&&%%&&&&V?, L=8=9%pEL+%%r@W!<%*',<2(<&L,"r       @    \  #"&546324&#!"3!26%#!#"'.'.'&'.'.546767>; &%%&&&& &i7qN	!/I.		!D1h$&#{MWBL$@:	'.&&%%&&&&=XNr%(M&<(2<,'*%<!W@r%%+LEp%9=8=L       	   + = \ d       %54#"327354"%###5#5#"'&53327#"'#3632#"'&=4762#3274645"=424'.'&!  7>76#'#3%54'&#"32763##"'&5#327#!"&5463!2BBPJNC'%!	B?)#!CC $)54f"@@
+B+,A
+
+A+&+A
+
ZK35N #J!1331CCC $)w@www2"33FYF~(-&"o4*)$(*	(&;;&&:LA38334S,;;,WT+<<+T;(\g7x:&&::&&<r%-@www       	   + = [ c }     #"'632#542%35!33!3##"'&5#327%54'&#"5#353276%5##"=354'&#"32767654"2 '.'&547>76 3#&'&'3#"'&=47632%#5#"'&53327''RZZ:kid YYY.06	62+YY-06	R[!.'CD''EH$VVX::Y
X;:Y
fyd/%jG%EC&&CE%O[52.
[$C-D..D^^* ly1%=^I86i077S
3
+$EWgO%33%OO%35	EEFWt;PP;pt;PP;pqJgTFQ%33&PP%33%R
7>%3!+}    '  +"&72'&76;2+"'66;2U
+&
+	(P
+
+*'eJ."-dZ-n -         ' 7  4'&+";27&+";276'56#!"&5463!2~}		7e 	۩w@www"
$Q#'!#
@www            /   4'&327$ '.'.4>7>76   "!! jG~GkjGGk[J@&&
+@lAIddIAllAIddIA   @       	'5557	,VWQV.RW=?l%l`~0    ~        #  %5!'#3!
%%	%=#y
?R'UaM|qByy[C#jXAAҷhUHG       / ?  %##" 547#3!26 4&#"3254&+";267#!"&5463!2R܂#-$䵀((((tQQttQvQtn?D~|D?x##))((QttQvQtt         2#!"&5463 4&"2$4&"2ww@ww||||||w@www|||||||       	   !3	37!  $$  n6^55^h
+^aaM1^aa    O 
+  * C g  '.676.7>.'$7>&'.'&'? 7%&'.'.'>767$/u5'&$I7ob?K\[zH,1+.@\7<?5\V
,$Vg.GR@ 7U,+!
	#	"8$}{)<?L RR;kr,yE[z#	/1
+"#	#eCI0/"5#`	"84~&p)4	2{H-.%W.L>       ' : Y i  4&67&'&676'.'>7646&' '7>6'&'&7>7#!"&5463!2PR$++'TJXj7-FC',,&C
."!$28h/"	+p^&+3$
i0(w@www+.i6=Bn\C1XR:#"'jj8Q.cAj57!?"0D$4"P[
&2@www     D~   "  %.5#5>7>;!!76PYhpN!HrD0M
 C0N#>8\xx: W]oW-X45       /  %'#.5!5!#"37>#!"&5463!2p>,;$4
+ 5eD+WcEw@wwwK()F
+,VhV^9tjA0/@www @     #"'&76;46;23
+

+
	 &
+
+        ++"&5#"&7632	
^
+

+c
 &
+
+     @     #!'&5476!2  &
+
+
^
+

+b	         '&=!"&=463!546
+ &
+
+	
+     q  & 8  #"'&#"#"5476323276326767q'T1[VA=QQ3qpHih"-bfGw^44O#A?66%CKJA}}  !"䒐""A$@C3^q|z=KK?6lk)           %!%!VVuuu^-m5w}n          7 M [   264&"264&"2"&546+"&=##"&5'#"&5!467'&766276#"&54632    *<;V<<O@-K<V<<+*<J.@kclG
H__H
<+*<<*+<    <*R+<<+*<f.@+<<++<<+@.7uu7
**
R+<<++;; 	    "$1G  #5472&6&67><&4'>&4.'.'.'.'.'&6&'.'.6767645.'#.'6&'&7676"&'&627>76'&7>'&'&'&'&766'.7>7676>76&6763>6&'&232.'.6'4.?4.'&#>7626'.'&#"'.'.'&676.67>7>5'&7>.'&'&'&7>7>767&'&67636'.'&67>7>.'.67	\
+U7	
+J#!W!'	

"';%
+
k	)"	
+	'

+
+/7* 		I	,6
+*&"!

O6*
O $.(	*.'

+.x,	$CN	
+		*	
+8
		
+7%&&_f&
+",VL,G$3@@$+
+"
+
+
+V5 3"	
""#dA++
+y0D-%&n4P'A5j$9E#"c7Y
+6"	&
+8Z(;=I50' !!e
R
+
+
+"+0n?t(-z.'<>R$A"24B@(	~	9B9,	*$		
		<>	?0D9f?Ae 	.(;1.D	4H&.Ct iY% *	
+7



J	 <
W0%$	
+""I!
*D	 ,4A'4J"	.0f6D4pZ{+*D_wqi;W1G("%%T7F}AG!1#% JG3         ' . 2 > V b  %&#'32&'!>?>'&' &>"6&#">&'>26 $$  *b6~#= XP2{&%gx| .W)oOLOsEzG<	CK}E	$MFD<5+
+z^aa$MWM1>]|YY^D
եA<KmE6<"@9I5*^aa       > ^  4./.543232654.#"#".#"32>#"'#"$&547&54632632':XM1h*+D($,/9p`DoC&JV<Z PA3Q1*223IoBkែhMIoPែhMIoP2S6,M!"@-7Y.?oI=[<%$('3 -- <-\%FuPoIMhPoIMh    ,}  # ? D  76&#!"7>;267676&#!"&=463!267
+#!"'&5463!26%8#!
&&Z"M>2!
	^I7LRx_@>MN""`=&&*%I},
+		L7_jj9          /  %4&#!"3!264&#!"3!26#!"&5463!2  &&&&  &&&&         1 9  #"'#++"&5#"&5475##"&54763!2 "&462 8(3-	&B..B&	-3(8 IggI `(8+Ue&.BB.&+8(kk`      % -  "&5#"&5#"&5#"&5463!2 "&462 8P8@B\B@B\B@8P8pPPp@`(88(`p.BB.0.BB.(88(Pppͺ      !  %>&'&#"'.$ $$ ^/(V=$<;$=V).X^aaJ`"(("`J^aa    '   I   4."2>%'%"/'&5%&'&?'&767%476762%6[՛[[՛o
ܴ
+ 
+
		$
$	"	$
$		՛[[՛[[5`
+
+^

^
+
+2`
`2
+
+^^
+
+`
     1  %#"$54732$%#"$&546$76327668ʴhf킐&^zs,!V[vn)	6<ׂf{z}))Ns3(  @   +   4&#!"3!2#!"&5463!2#!"&5463!2@& && f&&&&@& && &4&&4& @&&&& && &&    ` B H   +"/##"./#"'.?&5#"&46;'&462!76232!46 `&C6@Bb03eI;:&&&4L4&F
+Z4&w4) ''
5r&4&&4&&4   I   3#&/.#./.'&4?63%27>'./&'&7676>767>?>%6})N@2*& @P9A
+#sGq]
+#lh<*46+(
	
+<
5R5"*>%</
+ '2@ 5d)(=Z&VE/#E+)AC
+(	2k<X1$:hI(B
"	!:4Y&>"/	+[>hy
+	    e 
+  ! / U i   %6&'&676&'&6'.7>%.$76$% $.5476$6?62'.76&&'&676%.76&'..676#"NDQt	
-okQ//jo_		%&JՂYJA-.--
+9\DtT+X?*<UW3'	26$>>W0{"F!"E 

^f`$"_]\<`F`FDh>CwlsJ@;=?s
:i_^{8+?`
)
O`s2RDE58/K       r 	    #"'>7&4$&5mī"#̵$5$"^^W=acE*c      z  k  ./ "&4636$7.'>67.'>65.67>&/>z X^hc^O<q+f$H^XbVS!rȇr?5GD_RV@-FbV=3!G84&3Im<$/6X_D'=NUTL;2KPwtPt= 
+
+&ռ
,J~S/#NL,8JsF);??1zIEJpqDIPZXSF6[?5:NR=;.&1          +!"&=!!%!5463!2sQ9Qs***sQNQsBUw
wUBF H CCTww      % 1   #"&=!"&=463!54632.  6  $$ 		


`?(r^aa		



+(_^aa         % 1  #!#"'&47632!2.  6  $$ 
		@	
`
(r^aa

+?		@	
(_^aa        /  #"'&476324&#!"3!26#!"&5463!2 &@& 
@


 w@www&@B@&

@
@www          "&462  >& $$  Ԗ*(r^aaԖԖ (^aa       ]  6  #"$547 32>%#"'!"&'&7>32'!!!2f:лѪz~u: 
((%`V6B^hD%i(]̳ޛ	*>6߅r#!3?^BEa߀#9       # 3  6'&632#"'&'&63232#!"&5463!2
+Q,&U#+'
 ;il4L92<D`w@www`9ܩ6ɽ]`C477&@www       D  +"&5#"'&=4?5#"'&=4?546;2%6%66 546;2
+	

+	
wwwwcB
+G]B
+Gty]ty
      # 3 C  #!+"&5!"&=463!46;2!24&#!"3!26#!"&5463!2@`@`^BB^^B@B^www@w@`@`2@B^^BB^^ww@w        ' / ? P  +5#"&547.467&546;532!764'!"+32#323!&ln@
:MM:
@nY*Yz--zY*55QDDU9pY-`]]`.X /2I$	t@@/!!/@@3,$,3$p$00&*0&&
!P@     R V  2#"&/#"&/#"&546?#"&546?'&54632%'&54632763276%>S]8T;/M77T</L7=Q7,i<R7,5T</L666U;/M5<U<,i6iQ=a!;;V6-j;V6-5	P=/L596Q</L5<U6-i;V7,7O;-I68i;k         ) I  2#!"&5463#9"'.'.'3!264&#!"2>7%>ww@ww!"5bBBb./*
+8(@(87)(8=%/'#?w@www#~$EE y &L(88e):8(%O r		
+
+		O           ? G Q a q  47&67>&&'&67>&"&#6$32#"#"'654   $&6  $6&$ CoL.*KPx.* 
+iSƓi
+7J?~pi{_Я;lLUZ=刈刈_t'<Z
 :!
+	@!
+j`Q7$ky, Rfk*4LlL=Z=刈           &$&546$7%7&'5>]5%w  &P?zrSF!|         & 0  	##!"&5#5!3!3!3!32!546;2!5463)
+)     ;));;)) &&        &@@&&&    	  
 6   $&727 "'%+"'&7&54767%&4762֬>4Pt+8?::
+		
+::AW``EvEEvE<."e$IE&O&EI&{h.`  m  "  &#"& '327>73271[
>+)@
(]:2+D?*%Zx/658:@#N
+C=E(oE=W'c:   o   0 a  %4.'&#"32>4.#"32676!##"&'&54676%.547#"&5467>'9C!5goS6/Kce3:k[7u">j@*Q.+=Y4%Q5pKL1FE1@Z[@1G렄:$YJ .H?L0$/.0$8];8\;)4^;}R'!;e.ggR4!8HX?ZHsG;@"$ECPN[RzsS`;HQ.R)A)(-R6B@            " N ^   '&76232762$"&5462"&46274&"&'264&#"'&&#"32$54'>$ $&6$ G>>0yx14J55J5J44J5Fd$?4J55%6E#42F%$fLlLq>>11J44%&4Z%44J54R1F$Z-%45J521Z%F1#:ʎ 9LlL          # Q a  "'&7622762%"&5462"&546274&#"&'73264&#"'&&#"32654'>#!"&5463!2

55

**.>.-@-R.>.-@-<+*q6- -- 0<o,+< 3w@www

55

**.. -- .. --G*<N' ,-@-+*M <*2
zz
1@www      0 <  754&""&=#326546325##"&='26  $$ bZtt&sRQsZ<tsQ^aa>OpoOxzRrqP6z~{{Prr^aa    ]  0  54&"#"&5!2654632!#"&57265&<T<H<T<H<T<8v*<<*
++;;+l:=:*;;*      
   %!!"!!26#!"&5463!2@ ]]@w@www] @@www         	 
    % )  3!!#335!!5!5!%#!!5!5!%#HH{RHH{GG{)qGRRqRRq     	  # 0 @   #"'632 #"'632 &#"7532&#"#7532#!"&5463!2L5+*5L5+*5~}7W|3B}}JC7=}w@wwwDZQ[1N:_)i$)@www   
+ )	             6.#&#"'&547>'&#".'&'#"&5467%&4>7>3263232654.547'654'63277.'.*#">7?67>?>32#"'7'>3'>3235?KcgA+![<E0y$,<'.cI
+	,# '!;7$=ep	//7/
+D+R>,7*
+2(-#=
+	/~[(D?G  |,)"#+)O8,+'6	y{=@0mI#938OAE`
+-
+)y_/FwaH8j7=7?%a	%%!?)L
+J
9=5]~pj
+
 %(1$",I 
$@((
++!.S		-L__$'-9L	5V+	
+	6T+6.8-$0+
t|S1       6 ]   &#"'&#"67>76'&'&#"67>32764.#"#.32>67>7 $&54>7>7>7rJ@"kb2)W+,5/1		#
+
+Z
+-!$IOXp7sLCF9vz NAG#/ 5|Հ';RKR/J#=$,9,+$UCS7'2"1
+ !/
+,

+/--ST(::(ep4AM@=I>".)xΤlsY|qK@
+%(YQ&N
EHv~        < Z x  '#"&5467&6?2?'&"/.7.546326#"&'&/7264/7'764&"'?>>32.AUpIUxYE.A%%%h%%hJ%D,FZxULsTgxUJrVD%hJ%@/LefL.C%Jh%CVsNUxϠ@.FZyUHpVA%h&%%%Ji%CWpIUybJ/Uy^G,D%Jh%@UsMtUC%hJ%C-Kfy        E X [ _ g j    &/&'.''67>7>7&'&'&'>76763>7>#&'&'767672'%'7'+"&'&546323267>7%#"'4'6767672,32,+DCCQLDf'
+%:/d
+B	4@}
&!0$?Jfdf-.=6(:!TO?
+!IG_U%
+.
j+.=;	5gN_X	"
+##
+292Q41
*6nA;|
BSN.	%1$
6	#nk^        ' 7 G W g w       2+"&5463#!"&5463!254&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";26#"&=! B^^BB^^B:FjB^8((`(   `(8^BB^^B@B^"vE j^B (8(`( 8(         / ? O _ o         /?  2#!"&5463;26=4&+";26=4&+";26=4&+";26=4&+"54&+";2654&+";2654&+";2654&+";2654&+";2654&#!"3!2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";26@&& &&@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@@ &&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@    @`  %  	"&5#"&5&462!762$"&462B\B@B\B8PpP8.BB..BB.8$P88P広        3 C Q  #".54>32#".546322#"&#"#"54>%".54>32%2#"&54>&X=L|<&X=M{<TMLFTMLFv"?B+D?BJpH=X&<{M=X&<|dMTFLMTF(<kNsI<kNsPvoJPwo/s.=ZYVӮvNk<JsNk<IshwPJovPJo  @     +"&7.54>2r_-$$-_rUU%&&5%ő            '-
"'.546762@FF$@B@$.&,&.]]|q #<<# (B  B               B  %'-%'-'%'-"'%&'"'%.5467%467%62@ll@ll,@GG&!@@@@@@!&+#+#6#+$*`:p:px
+p=`$>>$&@&@
+
+@&p@       	  & . A  !!"!&2673!"54 32!%!254#!5!2654#!%!2#!8Zp?vdΊens6(N[RWu?rt1SrF|iZ@7މoy2IMC~[R yK{T:         % , A G K  2#!"&5463!!2654'654.#532#532"&5!654&#"327#2#>!!ww@ww~uk'JTMwa|
+DH>I1qFj?w@wwwsq*4p9O*¸Z^qh LE
+"(nz8B
+M         ' ?   "&462 4&#"'.'324&#"3267 ##"&/6326 32 .ʏhhMALR vGhг~~KyO^
ʏʏВ*LM@!<I~~t\0          C M   4&"2 #"&'676&/632#!"&=3267%2654&#"&#"%463!2"&4632rqqtR8^4.<x3=RRw@w_h
+YӖ	K>שwwȍde)qrOPqȦs:03=<x!m@wwE\xgӕє%wwdȎ  V 
  - < K \  %.'.>7'.?67'67%'>&%'7%7./6D\$>	"N,?a0#O1G9'/P(1#00
($=!F"9|]"RE<6'o9%8J$\:\HiTe<?}V#oj?d,6%N#"
+HlSVY]C

=    @     C   4&"2!.#!" 4&"2+"&=!"&=#"&546;>3!232^^^Y	 	^^^`pp pp`]ib bi]~^^^e^^^ PppPPppP]^^]       3 ; E M  2+"&=!"&=#"&546;>;5463!232 264&"!.#!" 264&" ]`pp pp`]ibbi^^^dY	 	!^^^]@PppP@@PppP@]^^] ^^^e^^^      3  $#!#!"&5467!"&47#"&47#"&4762++&2
+$$
+2&&&4&&Z4&&##&&4&4&44&m4&m      + D P  4'&#"32763232674'&!"32763 3264'&$#"32763232> $$ g* o`#ə0#z#l(~̠)-g+^aaF s"	+g(*
3#!|
#/IK/%*%D=)[^aa        	!!!'!!77! ,/,-a/G      	 t  % / ; < H T b c q         %7.#"32%74'&"32765"/7627#"5'7432#"/7632#"5'7432#"&5'74632	#"/6327#"/6327#"/46321"&/462"&/>21"&/567632#!.547632 632
+	
	*


+			X		
+
+^

`		
+
+^b
	c
+	fu
U`59u
+
+
+
4J
+	
l~		~	F	
+	2


		m|O, 	


+

ru|	u

+"          
  ) 9    $7 $&=  $7 $&=  $7 $&=   $&=46w`ww`ww`wb` VTEvEEvETVTEvEEvET*VTEvEEvET*EvEEvEEvEEv         # ^ c u    #!"&5463!2!&'&!"&5!632#"&'#"/&'&7>766767.76;267674767&54&5&'67.'&'&#3274(8((88((`x
+c`(8 !3;:A0?ݫY

+	^U	47D$

	74U3I
|L38wtL0`((88(@(8(D9 8( Q1&(!;
+(g-	Up~R2(/{E(Xz*Z%(i6CmVo8          # Q  #!"&5463!2!&'&!"&5!3367653335!3#'.'##'&'35(8((88((`x
+c`(8 iFFZcrcZ`((88(@(8(D9 8( kk"	kkJ 	!	k         # S  #!"&5463!2!&'&!"&5!%!5#7>;#!5#35!3#&'&/35!3(8((88((`x
+c`(8 -Kg
+kL#DCJgjLD`((88(@(8(D9 8( jj	jjkkkk            # 8 C  #!"&5463!2!&'&!"&5!%!5#5327>54&'&#!3#32(8((88((`x
+c`(8  G]L*COJ?0R\wx48>`((88(@(8(D9 8( jjRQxk!RY            # * 2  #!"&5463!2!&'&!"&5!!57"&462(8((88((`x
+c`(8  Pppp`((88(@(8(D9 8( ppp  	          # * 7 J R  5#5#5#5##!"&5463!2!&'&!"&5##5!"&54765332264&"  <(8((88((`x
+c`(8 kޑcO"jKKjK`((88(@(8(D9 8( SmmS?M&4&&4            # 9 L ^  #!"&5463!2!&'&!"&5!#"/#"&=46;76276'.'2764'.(8((88((`x
+c`(8 6ddWW6&44`((88(@(8(D9 8( .	G5{{5]]$5995           # 3 C  #!"&5463!2!&'&!"&5!2#!"&5463#"'5632(8((88((`x
+c`(8 4LL44LL4l			`((88(@(8(D9 8( L44LL44L	
+Z
+	           # 7 K [  #!"&5463!2!&'&!"&5!>&'&7!/.?'&6?6.7>'(8((88((`x
+c`(8 `3333v

?

`((88(@(8(D9 8( &&-&&
?

+

  'j  6  #'.
+'!67&54632".'654&#"32eaAɢ/PRAids`WXyzOvд:C;A:25@Ң>-05rn`H(' gQWZc[          
+     -  %7'	%'-'%	%"'&54762[3[MN
3",""3,3"ong$߆]gn$+)

")")"

         x # Z  #"&#!+.5467&546326$32327.'#"&5463232654&#"632#".#"oGn\u_MK'̨|g?CM7MM5,QAAIQqAy{b&
+BL4PJ9+OABIRo?z.z
+n6'+s:zcIAC65D*DRRD*wya$,@B39E*DRRD*             ' / 7     $&6$ 6277&47'  7'"' 6& 6'lLRRZB|RR>dZZ LlLZRR«Z&>«|R      !   $&54$7  >54 ' _ff_L-ff`-     
   c  6721>?>././76&/7>?>?>./&31#"$&(@8!IH2hM>'

+)-*
h'N'!'Og,R"/!YQG<I *1)

+(-O1D+0nz3fwG2'3rd1!sF0o .q"!%GsH8@-!5|w|pgS=
"B2PJfhGdR 	        ( P ] l y    &$'77&7567'676'"'7&'&'7&47'6767'627''6$ '67'654'7&'7'&'&'7&'5 &$  $6 $&6$ jj:,AAS9bb9R#:j8AܔA,zC9Z04\40Z9C!B;X0,l,0X;B*A8ܔA&#9j`b9S$#R99#&A8A`
䇇<Z<䳎LlLfBϬ"129,V<4!!88dpm"BV,92[P*V*P\MC
+
+CM\P*V*P]LD
+
+DL&BV*8*8!f!4<gmpd88!&!8*8*VB Z<䇇䇇LlL        9 E i s   %#"5432#"543275#&#"3254&'.547>54'63&547#5#"=3235#47##6323#324&"26%#!"&5463!2F]kbf$JMM$&N92<Vv;,&)q(DL+`N11MZ
+%G&54	#	i<$8&@0H12F1dw@wwwB?@UTZ3%}rV2hD5%f-C#C@,nO	a7.0x2	yRuR/u%6;&$76%$56S@www     D     < H l w  %4#"324&#"32!".5475&5475.546322#654'3%#".535"&#"5354'33"&+32 #"&54632S;<;||w
$+|('-GVVG-EznAC?H_`Rb]Gg>Z2&`9UW=N9:PO;:dhe\=R
++)&')-S99kJ<)UmQ/-Ya^"![Y'(<`X;_L6#)|tWW:;X          	#'#3#!"&5463!2)
+p*xeשw@www0,\8@www  9    I   #"'#"&'&>767&5462#"'.7>32>4."&'&54>32JrO<3>5-&FD(=Gq@C$39aLL²L4
+
&)
+@]v
q#CO!~󿵂<ZK#*Pq.%
L²LLarh({w؜\     i  &5467&6747632#".'&##".'&'.'#".5467>72765'./"#"&'&5
}1R<2"7MW'$	;IS7@5sQ@@)R#DvTA;
+0x
I)!:>+<B76:NFcP:SC4rl+r E%.*a-(6%('>)C	6.      >  
+  ! - I [   4&#"324&#"3264&#"324&#"326&#"#".'7$4$32'#"$&6$32D2)+BB+)3(--(31)+BB+)4'--'4'#!0>R	HMŰ9ou7ǖD䣣
+R23('3_,--,R23('3_,--,NJ
+?uWm%      #"'%#"'.5	%&'&7632! 
;
	`u%"( !]#c)(	          #"'%#"'.5%&'&76	! 
	(%##fP_"( !)'+ŉ       4 I   #"$'&6?6332>4.#"#!"&54766$32#!"&=46;46;2 z䜬m
+IwhQQhbF*@&('k@z
+	
+_hQнQGB'(&*eozΘ@@`             >.  $$ ffff^aa fff^aa  >   "&#"#"&54>7654'&#!"#"&#"#"&54>765'46.'."&54632326323!27654'.5463232632,-,,",:!
%]&
%@2(/.+*)6!	<.$..**"+8#

#Q3,,++#-:#"</$)
+
+w
+
+
+,*
+
+x9-.2"'
+,,
+@&,,
+Qw
+,     ,  #"+"&5#+"&5&'&'&547676)2%2$l$#l#b~B@XXyo2$CI@5$$>$$/:yuxv)%$ 	          / ? C G  %!5%2#!"&5463!5#5!52#!"&54632#!"&5463#5!5`&& &&  && &&&& &&@& && &  & && & & && &      %  2 &547%#"&632%&546 #"'6\~~\h
+~\h\ V
+VVV       % 5  $4&#"'64'73264&"&#"3272#!"&5463!2 }XT==TX}}~>SX}}XS>~}w@www~:xx:~}}Xx9}}9xX}@www        / > L X d s   .327>76 $&6$32762#"/&4762"/&47626+"&46;2'"&=462#"'&4?62E0l,
+
*"T.D@Yooo@5D
+
+[		
+
+Z
+Z
+
+		[	 ``[
+
+
+
+Z
+
+	2
+,l0
+(T".D5@oooY@D,
+
+Z
+
+		[			[		
+
+Z
+``EZ
+
+		[		
+         5  %!  $&66='&'%77'727'%amlLmf?55>fFtuutFLlLHYCL||LY˄(E''E*(           / ? I Y i y      %+"&=46;2+"&=46;2+"&=46;2+"&=46;2%"&=!#+"&=46;2+"&=46;2+"&=46;2+"&=46;2!54!54>$ +"&=46;2#!"&=@&&@3P
>P3&&rrr&&rrr
+he
+
4LKM:%%:MKL4WT&&            % / 9  ##!"&563!!#!"&5"&5!2!5463!2!5463!2&& &  & &&   &&& i@ &&@& 7          '#5&?626J%o;j|/&jJ%p&`Jj&p/|jţ%Jk%o%    	  : g  "&5462#"&546324&#!"263662>7'&75.''&'&&'&6463!276i~ZYYZ~@OS;+[G[3YUD#o?D&G3I=JyTkBuhNV!WOhuAiSy*'^CC^'*SwwSTvvTSwwSTvvWID\_"[gq# /3qFr2/ $rg%4
+HffHJ4   d       #!#7!!7!#5!VFNrmNNNN!     Q  + ? N e  %&'&'&7>727>'#&'&'&>2'&'&676'&76$7&'&767>76'6#
<;11x#*#
F-T93%/#0vNZ;:8)M:(	&C.J}2	%0
 	^*
+JF	
+&7'X"2LDM"	+6
+M2+'BQfXV#+]
+#'
+L/(eB9   
+             # , 8  !!!5!!5!5!5!5#26%!!26#!"&5!5          &4& &pPPp        @@&&@!&@PppP@  * 
 	  9 Q  $"&54627"."#"&547>2"'.#"#"&5476$ "'&$ #"&5476$ (}R}hLK
+NN
+ Ud:
+xx
+8
+
+
 ,, |2222
+MXXM
+
ic,>>,
+
+		
+̺
+
  
         ' / 7 ? K S c k {  4&"2$4&"2 4&"2 4&"2 4&"2 4&"2 4&"2 4&"24&"26 4&"24&#!"3!264&"2#!"&5463!2KjKKjKjKKjKjKKjKKjKKjKjKKjKjKKjKKjKKjKjKKjKLhLLhLKjKKj& && &KjKKjL44LL44L5jKKjKKjKKjKjKKjKjKKjKjKKjKjKKjKjKKjKjKKjK4LL44LLjKKjK && &&jKKjK  4LL4 4LL     ' E  !#"+"&7>76;7676767>'#'"#!"&7>3!2W",&7'	#$	&gpf5O.PqZZdS-V"0kqzTxD!!8p8%'i_F?;kR(`
+!&)   d   . < \  .'.>%#"'.7>.'&67632&'6'&'
+#"'.766.'&67632Z
+&+\cc:>'D>6KD3W6,9(<*0-?")/SW7.Crb		:+OIX3'#C3:@#*"-A%,1U=}AQfO$"|'"S*`H(:UܳJ?27sZy%+A07C~Ӗ5A"3      	      > I Y  #6?>7&#!%'.'33#&#"#"/3674'.54636%#"3733#!"&5463!24:@7vH%hEP{0&<'VFJo1,1.F6A#L4 4LL4 4L"%	
+ 
+7x'6
O\JYFw~v^fH$ !"xdjD"!6`J 4LL4 4LL   	     $ 1 O l       -  #"326%356.#"#"326%4#"326%3#7#'#3%#7#"&546324>54#"47632&#"'"'473254&'&54323#327#"'47673#327#"546327&#7673>7&#"327#"&54632#7#"&54632654#"47632&#7673>73#7#"&54632.#"#&'#67&#"327&'3673326#!"&5463!2
/>	0@[W,8 G'"5,Q4/&4/	$&J	(W" 	+Tl	+7o	_7*#)
	83	(
+-5G8
.'3/$&I8
+48+5%7%{,2,rr,2,x-2.jj.2-xL4 4LL4 4L[ <	J 2)(*(8$e '+
+,1)H/	'H4///,~i6_7G*''4fE!%97+"
;=4FYqO" '+
+,&2hh_,0(5N(ntggtnno__on 4LL4 4LL    	  
+    B W b j q }    +532%+5324&+32763#4&'.546327&#"#"'3265#"&546325&#"32!26 4&"2%#'#735#535#535#3'654&+353#!"&5463!29$<=$@?SdO__J-<AA@)7")9,<$.%0*,G3@%)1??.+&((JgfJ*A!&jjjGZYGиwsswPiL>8aA	!M77MM77M3!
4erJ]&3YM(,
+,%7(#)
,(@=)M%A20C&Mee(X0&ĖjjjV	8Z8J9N/4$8NN88NN      	       # & : O [   	$?b  3'7'#3#%54+32%4+324+323'%#5#'#'##337"&##'!!732%#3#3##!"&53733537!572!56373353#'#'#"5#&#!'#'#463!2#"5#"5!&+&+'!!7353273532!2732%#54&+#32#46.+#2#3#3##+53254&".546;#"67+53254&.546;#"#'#'##"54;"&;7335wY-AJF=c(TS)!*RQ+*RQ+Y,B^9^Ft`njUM')	~PS PRm٘M77Mo7q
+
+@)U	8"E(1++NM77Mx378D62W74;9<-A"EA0:AF@1:ؗBf~~""12"4(w$#11#@}}!%+%5(v$:O\zK?*$\amcrVlOO176Nn<!E(=<&l/<<
[ZZYY891767OO7==..//cV==::z,,,,aa,,7OO7Z::;;Y
fcW(		"6-!c(		!5	#
+bt88176tV:
+&$'*9	%e#:
%'*9B<<;
+&(        	    # : S n       #"&54632%#76;2#"&54632%4&+";2?>23266&+"&#"3267;2 4&+"'&+";27%4&+";2?>23266&+"&#"3267;254+";27#76;2#!"&5463!23%#2%%,, _3$$2%%M>ALVb5)LDHeE:<
EMj,K'-R
M ~M>ARVb5)LEHeE:<
E
JABI*'!($rL4 4LL4 4Lv%1 %3!x*k$2 %3!;5h
+n
+a
+!(lI;F	
+	
+	rp
+p8;5h
+
t
+a
+!(lI;F`	#k 4LL4 4LL   
+  	  
+  2 H W [ l t    #"'5632#6324&'.54327&#"#"&'32767#533275#"=5&#"'#36323#4'&#"'#753276 4&"24'&#"327'#"'&'36#!"&5463!2=!9n23BD$ &:BCRM.0AC'0RH`Q03'`.>,&I / *
 /
+
+8/n-(G@5$ S3=,.B..B02^`o?7je;9G+L4 4LL4 4LyE%#	Vb;A
!p &'F:Aq)%)#orgT$v2 8)2z948/{8AB..B/q?@r<7(g/ 4LL4 4LL        ?  #!"&'24#"&54"&/&6?&5>547&54626=L4@ԕ ;U g3
+
+T
+2RX='8P8|5
+4Ljj U;Ig@
+	
+`
+ "*\(88(]k
+          & N  4#"&54"3	.#"#!"&'7!&7&/&6?&5>547&54626;U gIm*]Z0L4@ԕ=o=CT
+
+T
+2RX='8P8|5
+ U;IgXu?bl3@4Ljja`
+	
+`
+ "*\(88(]k         / 7 [  %4&+";26%4&+";26%4&+";26!'&'!+#!"&5#"&=463!7>3!2!2 @@ @@ @@0
+
+o`^BB^`5FN(@(NF5@@@u		@LSyuS@%44%     , < H  #" 54 32+"=4&#"326=46;2  >.  $$ ~Isy9"SgR8vHD	w
+ffff^aam2N+	)H-mF+10*F		+fff^aa        b  4&#"32>"#"'&'#"&54632?>;23>5 !"3276#"$&6$3  k^?zb=ka`U4J{K_/4^W&	vx :XB0܂ff)
+fzzXlz=lapzob35!2BX
+G@8'	'=vN$\ff	1
	SZz8zX          # (   "/+'547'&4?6276	'D^h
+
+
+
+i%5 @%[i
+
+
+
+h]@ ]h
+
+
+
+i%@ 5%[i
+
+
+
+h^@@       )  2 #"&5476 #".5327>OFi-ay~\~;'S{s:D8>)AJfh ]F?X{[TC6LlG]v2'"%B];$         + l |    %!2>7>232>7>322>7>32"&'.#"#"&'.#"#"&'.#"#546;!!!!!32#"&54>52#"&54>52#"&54>52  -P&+F) $P.-P$'#+&PZP&+#"+&P-#) $P-.P$(#+$P.-P$'#+&P-.P$+#pP@     @Pp H85K"&Z H85K"&Z H85K"&Z@Pp@@@pMSK5, :&LMSK5, :&LMSK5, :&        !!3	!	    @  @@           	#"$$3!!2 "jaѻxl alxaa j         !!3/"/'62'&63!2   'y
+
+`I
+
+y My
+
+`I
+
+y'       [ `  #".'.#"32767!"&54>3232654.'&546#&'5&#"
+
+4$%Eӕ;iNL291 ;XxR`f՝Q8TWiWgW:;*:`Qs&?RWXJ8oNU0J1F@#)
+[%6_POQiX(o`_?5"$iʗ\&>bds6aP*< -;iFn*-c1B       W g  4'.'4.54632#7&'.#"#"'.#"32767'#"&54632326#!"&5463!2#$(	1$6]'
+!E3P|ad(2S;aF9'EOSej]m]<*rYshpt.#)$78L*khw@wwwB
+
%
$/$G6
+sP`X):F/fwH1pdlqnmPHuikw_:[9D'@www            3   4."2>$4.#!!2>#!".>3!2QнQQнQQh~wwhf ff нQQнQQнQZZQffff           #  >3!2#!".2>4."f ff нQQнQQffffQнQQн      	      , \  !"&?&#"326'3&'!&#"#"'     5467'+#"  327#"&463!!'#"&463!2632(#AHs9q  ci<=
+#]<OFA!re&&U&& ![eF U?g4_a?b+r7&4&&4&p,           + K   4&"2$4&"2.#!"3!264&#!"3!2#"&=!"&=#47>$ KjKKjKKjKKjH#j#H&&&KjK KjKg	V	ijKKjKKjKKjK..n(([5KK55KK5[poNv<<vN:f      . R   #!"&463!24'!"&5463!&$#"!2#!32>+#" '#"&546;&546$32 322$B$22$$*$22$Xڭӯ$22$tX'hs2$ϧkc$22$1c$2F33F3VVT2#$2ԱVT2#$2g#2UU݃
+2$#2UU1݃2         , u   54#"67.632&#"32654'.#"32764.'&$#"7232&'##"&54732654&#"467&5463254632>32#"'&ru&9%"*#͟<yK0Og" 
&9B3;㛘8s%+DWXRD= @Y%	!Q6R!4M8+6rU^z=)RN.)C>O%GR=O&^opC8pP*bY
+_#$N Pb@6)?+0L15"4$.Es
+5IQ"!@h"Y7e|J>ziPeneHbIlF>^]@n*9
         6 [ _  3#"&54632#.#"32%3#"&54632#.#"326%4&'.'&! ! 7>7>!
=39?
+6'_
>29?
+5'17m-VU--,bW. 뮠@Fyu0HC$뮠@Fyu0HC$L=??
<=! A	<          `  ;  +"&54&#!+"&5463!2#!"&546;2!26546;2pЇ0pp@I pp        > S c  +"&=46;254&+"&+";2=46;2;2=46;2;2%54&#!";2=;26#!"&5463!2A5DD5A7^6a7MB55B7?5B~```0`rr5A44A5v5AA5f*A``0`       	   !!!!	#!"&5463!2ړ7H7jv@vvv'  :@vvv          M U d k p u {                  #"'!"'!#"&547.547.54674&547&54632!62!632!#!6227'!%!"67'#77!63!!7357/7'%#	%'3/&=&'	5#?&5476 !p4q"""6" 'h*[
|*,@?wAUMpV@˝)Ϳw7({*U%K6=0(M		"!O		dX$k
+!!!
b	
+[TDOi
+@6bxBAݽ5

ɝ:J+3,p
x1Fi
+(R      
   463!#!"&5%'4&#!"3`а@..@A-XfB$.BB..C     } 
+   )   &54$32 &'  % &&'6 7"w`Rd]G{o]>p6sc(@wgmJPAjyYWa͊AZq{HZ:<dv\gx>2ATKn       + ;  "'&#"&#"+6!263 2&#"&#">3267&#">326e~└Ȁ|隚Ν|ū|iyZʬ7Ӕްr|uѥx9[[9jj9ANN+,#ll"BS32fk     [   / ? \  %4&+";26%4&+";26%4&+";26%4&+";26%#!"&5467&546326$32]]eeeeee$~i
+qfN-*#Sjt2"'qCB8!   '  >    	 
     ! % ) - 1 5 9 = A E I M Q U Y ] a g k o s w {           !	%!	5!#5#5#5#5#57777????#5!#5!#5!#5!#5!#5!#5!#5#537#5!#5!#5!#5!#5!#55#535353535353%"&546326#"'#32>54.&54>3237.#" Q%%%%%%%%%?iiihOiixiiyiixiiArssrrssr%sssrrssNs%%%%%%%%%%'<D<'paC_78#7PO7)("I$	75! RAb(ssssssssss"/!".""."
!."".!/^.".^.".]/".$$$$$$$$$$$$$$$$Os$$$$$$$$$$$$$$sO$sssssssssss#}$)	13?*
+,./:
+-      s    *   4&"2$4&"2#!"&5463!2!5463!2_?--??-,@@,-?pq8,??,D,??,,??      (    Z  2#".#"3267>32#".54 3232654&#"#"&54654&#"#"&547>326ڞUzrhgrxSПdU <ex՞Zf_gן:k=2;^9Œ7\xx\7K=5XltֆWW{e_%N%,%CI%      # + W   4&+54&"#";26=32 "&462"&462!2#!"&54>7#"&463!2!2&&4&&&&4&KjKKjKjKKj && &%&& &&4&&&&4&&&5jKKjKKjKKjK %z
+0&4&&3D7&4&
%&          ' S   4&"4&"'&"27 "&462"&462!2#!"&54>7#"&463!2!2 &4&4&4& 4 KjKKjKjKKj && &%&& &&4&%&&ے&4  "jKKjKKjKKjK %z
+0&4&&3D7&4&
%&        	    &  	!'!	!%!!!!%"'.763!2o]FooZY@:@!! gf /  /      I    62'"/"/"/"/"/"/"/7762762762762762762%"/77627&6?35!5!!3762762'"/"/"/"/"/"/%5#5!4ZSS6SS4SS4SS4SS4SS4SS4ZSS4SS4SS4SS4SS4SS4S-4ZSS4S@   4SS4ZSS6SS4SS4SS4SS4SS4S@ ZSSSSSSSSSSSSSSZSSSSSSSSSSSSSyZRRR@%:=
+:+:
+=RRZSSSSSSSSSSSSS         C v  !/&'&#""'&#"	32>;232>7>76#!"&54>7'3&547&547>763226323@``` 
+VFaaFV
+

$.
+

+.$

yy	.Q5ZE$ ,l<l, $ER?Y*@@2	!#""#!	yy=rna@@(89*>*%>>%*>*98(QO!   		  L \ p  '.'&67'#!##"  327&+"&46;2!3'#"&7>;276;2+6267!"'&7&#"(6&#"#"'DgOOG`n% ELL{@&&Nc, sU&&!Fre&&ss#/,<=
+#]gLoGkP'r-n&4&2-ir&&?o 
4_      5 O W  ! .54>762>7.'.7>+#!"&5#"&5463!2"&462{{BtxG,:`9(0bԿb0(9`:,GxtB&@& &@&K55K`?e==e?1O6#,
+#$
+,#6OO&&&&5KK      ?  !"'&'!2673267!'.."!&54632>32 1
+4q#F""8'go#-#,"tYg>oP$$Po> 	Zep#)R0+I@$$@I+    + 3   32++"&=#"&=46;.7>76$     @ᅪ* r@@r      ' /  2+"&5".4>32!"&=463      &@~[՛[[u˜~gr&`u՛[[՛[~~@r         = E   32++"&=#"&=46;5& 547&'&6;22676;2      >``@``ٱ?E,,=?rH@``@GݧH`jjr    B J  463!2+"&= 32++"&=#"&=46;5.76 76%#"&5        &@~``@`` vX r&@``@+BF`r       k s  463!2+"&= 32++"&=#"&=46;5& 547'/.?'+"&5463!2+7>6 %#"&5        &@~``@``~4e	
+0
+	io@& jV	
+0
+	Z9 r&@``@Gɞ5o
+,
+sp &@k^
+,
+c8~~`r     
+ 8 > K R _  32++"&=!+"&=#"&=46;.76 766 6'27&547&#"  &'2  #"@ @'Ϋ'sggsww@sgg@@-ssʃl99OOr99    F P ^ l  463!2+"&= $'.7>76%#"&=463!2+"&=%#"&54'>%&54 7.#" 2 54&'   &@L?CuГP	vY  &@;"  ޥ5݇ޥ5`&_ڿgwBF@&J_	s&&?%x%x     J P \ h  463!2+"&= '32++"&=#"&=46;5.76 76632%#"&56'  327&7&#"2  #" &@L? ߺu``@``}
ຒɞ  ueeu9uee&_"|N@``@""|a~lo99r9@9       ; C  2+"&5"/".4>327'&4?627!"&=463      &@Ռ		.	
+N~[՛[[u˜N		.	
+gr&`֌
+	.		Ou՛[[՛[~N
+	.		@r      9 A   '.'&675#"&=46;5"/&4?62"/32+     '֪\
+	.		4		.	
+\r|ݧ憛@\		.	
+
+	.		\@r     9 A  "/&4?!+"&=# #"$7>763546;2!'&4?62      m		-
+
+@ݧ憛@&
+
+-		@rm4
+
+-		ٮ*		-
+
+r           +"&5& 54>2      @[՛[rdGu՛[[r                 ".4>2 r[՛[[՛r5՛[[՛[[      $  2#!37#546375&#"#3!"&5463#22#y/Dz?s!#22#2##2S88	2#V#2        L  4>32#"&''&5467&5463232>54&#" #"'.Kg&RvgD
+$*2%	+Z hP=DXZ@7^?1
۰3O+lh4`M@8'+c+RI2
+\ZAhSQ>B>?S2Vhui/,R0+	ZRkm      z  + > Q   2#"'.'&756763232322>4."7 #"'&546n/9bLHG2E"D8_
+pdddxO"2xxê_lx2X	
+!+'5>-pkW[C
I
+I@50Oddd˥Mhfxx^ә  	           # ' + /  7!5!!5! 4&"2!5! 4&"24&"2!!!     8P88P   8P88P88P88P     P88P8 P88P88P88P8          + N    &6 !2#!+"&5!"&=463!46;23!#!"&54>32267632#"_>@`





`

 L4 Dgy 6Fe=OOU4L>



`

`

4L2y5eud_C(====`L4       3 V    &6 #"/#"/&54?'&54?6327632#!"&54>32 7632_>			
		
						
		
			%%Sy 6Fe=J%>	
						
		
						
	%65%Sy5eud_C(zz.!6%          $  !2!!!46;2 4&"2!54&#!" &   &&@ԖV@& &@  &&ԖԖ@&             3!!!	!5!'!53!!	# 7IeeI7 CzC l @@  @            #  2#!"&?.54$3264&"!@մppp  ((ppp              # + /  2#!"&?.54$3264&"! 264&"!@մ^^^@^^^@ ((^^^  ^^^          '  %!53###3!532654&+5!3!#"3 ~E,,EG,+ob'q,5,'          	#'#3!)
+p*xe 0,\8     L   # / D M %2<GQ^lw  &'&676676&'&7654&'&&546763"#"'3264&7.>&'%'.767&7667&766747665"'.'&767>3>7&'&'47.'.7676767&76767.'$73>?>67673>#6766666&'&6767.'"'276&67&54&&671&'6757>7& "2654&57>&>&'5#%67>76$7&?5.''&'&'#'""#''&'&'&'65.'&6767.'#%&''&'#2%676765&'&'&7&5&'6.7>&5R4&5S9
W"-J0(/r
V"-J0(.)#"6&4pOPppc|o}vQ[60XQW1V	
#5X		N"&
.
+)
+D>q J:102(z/=f*4!>S5b<U$:I o<G*	,
&"O	X5
+#!
+
	R N#
C
83J*R	!(D
#%37	;$-.
(,覦6ji
+	")9
+E%!B83
+	j96/,	:QD')yX#63V
ba	,
+UeLPA@*	̳`Xx*&E
+V36%	B3%	B3XA	
#!.mU"A	
#!.mUB-#2+Jiiim-C<I(m8qF/*)0S
+		
+I
+E5&+>!%
+(!$p8~5..:5I

~T
+4~9p# !
+)& ?()5F	1	
	
+ d%{v*:
 @e
+s|D1d {:*dAA|oYk'&<tuut&vHCXXTR;w
71
	Z*&'
1	9?	.

$Gv5k65P<?8q=4a	
SC"1#</6B&!ML	^;6k5wF1<P   C	   ;  $"&462"&46232>.$.`aasa``Z9k'9؋ӗa-*Gl|Me_]`F&OܽsDD!/+``aa``a1<YK3(
+ /8HQelAZ3t_fQP<343J;T7Q           + ? K g w     $6&$  $&62+"5432+"&=.54  $;26=462;26=4& 4&#!"3!26)߄4R4߄mlLr {jK#@#Qa^@@`&&&&߄4R4ĎLlLN @K5#:rr:#5K^aa``]]`` && &&       	     /  !3#4&#!"3!265##!"&5463!22 @ K5^BB^^B@B^5K    @5KB^^BB^^BK        	     /  !2##!"&5463!2#4&#!"3!265  5KK5^BB^^B@B^@   K55KB^^BB^^B` @      	     /  !2##!"&5463!2#4&#!"3!265  5KK5^BB^^B@B^@   K55KB^^BB^^B` @      	     /  !2##!"&5463!2#4&#!"3!265  5KK5^BB^^B@B^@   K55KB^^BB^^B` @      	    +  2##!"&5463!2#4&#!"3!2655KK5^BB^^B@B^@K55KB^^BB^^B` @        #!&'#"'&547632m*
+0(('($0K
+**      %   3#!3# '!#53 5#534!#53 6!3@@@@pp@@@@@pp@`     	          + / 7 ; A  #3!5!!3#!!5!35!355#%53#5!#35#!!!!!!!!                           
+   	    # ' + / 3 ? C G W  #3!5!!35!!3#!!5!#!5!3535!355#%#3%!53#5!#35#!5##5!3!5!3!5	               !"&5463!2!"! `(88(@(8`(8}22R `8(@(88(`8HR22         #  #6?6%!!!46#!"&5463!2x  8(`( (88(@(8 
+  (8 (`(8(@(88      	    ' A T d   +5326+5323##"' %5&465./&76%4&'5>54&'"&#!!26#!"&5463!2
+
+
iLCly5)*Hcelzzlec0hb,,beIVB9@RB9J_L4 4LL4 4L44%2"4:I;p!q4bb3p(P`t`P(6EC.7BI6 4LL4 4LL    	     . >  $4&'6 #".54$ 4.#!"3!2>#!"&5463!2Zjbjj[wٝ]>oӰٯ*-oXL4 4LL4 4L')꽽)J)]wL`ֺ۪e 4LL4 4LL           ;  4&#!"3!26#!"&5463!2#54&#!";#"&5463!2


@
^BB^^B@B^


B^^B@B^`@


MB^^B@B^^>


^B@B^^         5 = U m  	!	!!2#!"&=463!.'!"&=463!>2!2#264&"".54>762".54>762  ?(``(?b|b?B//B/]]FrdhLhdrF ]]FrdhLhdrF@@@(?@@?(@9GG9@/B//BaItB!!BtIѶ!!ьItB!!BtIѶ!!ь        - M  32#!"&=46;7&#"&=463!2#>5!!4.'.46ՠ`@`ՠ`MsF FsMMsF FsMojjo@@jj@@<!(!!(!        - 3 ?  32#!"&=46;7&#"&=463!2+!!64.'#ՠ`@`ՠ` 		DqLLqDojjo@@jj@@B>=C          - 3 ;  32#!"&=46;7&#"&=463!2+!!6.'#ՠ`@`ՠ` UVU96gg6ojjo@@jj@@β**ɍ        - G  32#!"&=46;7&#"&=463!2#>5!!&'.46ՠ`@`ՠ`MsF FsMkkojjo@@jj@@<!(!33!(!          9 I  2#!"&=4637>7.'!2#!"&=463@b":1P4Y,++,Y4P1:"":1P4Y,++,Y4P1:"b@@@7hVX@K-AA-K@XVh77hVX@K-AA-K@XVh7         A j  "#54&#"'54&#"3!26=476=4&#"#54&'&#"#54&'&'2632632#!"&5&=4632>326 5K @0.B @0.B#6'&&
+l
+@0.B 2'	.B A2TA9B;h" d
mpPTlLc_4.HK5]0CB.S0CB./#'?&&)$$)0CB. }(AB.z3M2"61d39L/PpuT(Ifc_E       `  1 X   "#4&"'&#"3!267654&"#4&"#4&26326#!"&'&5463246326\B B\B&@5K&@"6LB\B B\B sciL}QP<m$3jN2cB.p.BB. 3K5+" 3," .BB..BB..G=ci(+lOh7/ DVj"c=        & 5 J b   #"'&=.547!"&46;'.54632!2327%.54&#"327%>%&#"!"3!754?27%>54&#!26=31?>Ijjq,J[j.-tjlV\$B.R1?@B.+?2`$v5K-%5KK5.olRIS+6K5̈$B\B 94E.&ʀ15uE&
+ԖPjjdXUGJ7!.B
+
+P2 .B
+
%2@	7K5(B@KjKj?+f UE,5K~!1.>F.F,Q5*H          $ b  2#!"&=%!"&=463!7!"&'&=4634'&#!">3!!"3!32#!"3!23!26=n$<vpPPpPpw*RdApP]'@A&
+3@&H-[(8@
+2EB^&1
=&& 81PppPpP wcOg Ppc
4& #.& &,,:8(%^B &
.&&       A t  "#.#"%&#"3!267>7654&#"#654&#"#.!"'.54632&5467>32>3200?t	='/@H@"+4K8"*!4dtB/&>	c@0&=		=_JUD29i1"07
+{x\YSgSSW]|t
eyD0&0D/
I4C+) t.B3%h#/B0&&03|&p>i+ #]
+WsgQT\QglU
+]#-39oK_       3 [ _ c g  "'&#"3!2676=4&"#54&#"#54&#"#4&'2632632632#!"&'&5463246#!#!#5K)B4J&@#\8P8 @0.B J65K J6k
+cJ/4qG^\hB2<m$3iG;     K5 6L4+" 3p`b)<8(=0CB.@Z7OK5`:7OkEW^tm@Q7/ DVi##j       % 4 I a   2#!"&5&546325462632"32654&"3267654&76;74&"#.#"2676=#"&'+53264&#!"3</UXdjjPԖEu!7JG72P
+
+B%
+B.!7	@Af+?jKjK@B(5K,EUH*5Q,F.F>.1!~K5y?^\Vljt-.j[J,qjjI7$?1R.B+.B$`2?gvEo.5KK5%-K6+SIR[&.E49 B\B$5K           G  #!+"&5!"&=463!2+"&'+"'+"'&5>;2>76;2Y




M	
+
.x	-
+	N	
+
+
	
u

,
u
+?

+LW
+
+#	          	 * : J  4'&+326+"'#+"&5463!2  $6&  $&6$ <!T{BH4	&>UbUI-uu,uuڎLlLAX!Jmf\$
+6uuu,KLlL        - [ k {  276/&'&#"&5463276?6'.#"!276/&'&#"&5463276?6'.#"  $6&   $&6]h-%Lb`J%E5
,5R-h
+-%Lb`J%E5
,5R-'uu,uulL/hR

dMLcNhR
dMLcN1uuu,LlL   @     	'	7	'7	``H ``H !``H  ```H`            '  %		7'	7'7	'  $&6$ X`(W:,:X`(WLLlLX`(W:BX`(XLlL 
+  	 $    % / 9 E S [   #"&54632$"&4624&"26$4&#"2%#"&462$#"&4632  #"32&! 24>      !#"&'.'#"$547.'!6$327&'77'&77N77N'qqqqqPOrqEsttsst}||}uԙ[WQ~,>	nP/RU P酛n	>,m'77'&77N77N6^Orqqqqqqt棣棣(~||on[usј^~33pc8{y%cq33dqp  d   	  L     54    "2654"'&'"/&477&'.67>326?><
+x
+,

(-'sIVCVHr'-(

+$0@!BHp9[%&!@0$u
+
+]\\]-$)!IHV
D
VHI!)$-#3      6 > N   "&462."&/.2?2?64/67>&  #!"&5463!2]]]3
+$;
+&|v;$
+(CS31	=rM=	4TC(Gzw@www]]]($-;,540=	sL	=45,;@www       (  2#"$&546327654&#"	&#"AZ\@/#%E1/##.1E$![A懇@@\!#21E!6!E13"|!     	 g L   &5& '.#4&5! 67&'&'5676&'6452>3.'5 A5RV[t,G'Q4}-&<C!l n?D_@Փ>r!
G;>!g12sV&2:#;d=*'5E2/..FD֕71$1>2F!&12,@K       
+  r    #"&5462>%.#"'&#"#"'>54#".'7654&&5473254&/>7326/632327?&$  $6 $&6$ !&"2&^	u_x^h
;J݃HJǭ
qE
+Dm!
M
G?̯'%o8
+9U(F(ߎLlL&!&!SEm|[n{[<ɪ
+"p C
+Di%
(KHCέpC
+B
m8	
@Kނ
HF(LlL       " *  6%&6$	7&$5%%6'$2"&4}x3nQH:dΏXe8 z'	li=!7So?v    M    '&7>>7'7>''>76.'6' El:Fgr
*t6K3UZ83P)3^I%=9	)<}Jk+C-Wd	&U -TE+]Qr-<Q#0
+C+M8	3':$
_Q=+If5[ˮ&&SGZoMk ܬc        #  2>.""$&6$32}L**L}}L**Lʸֶdd*~;;~\~~~ޚBPBdd       	  N  .'>!4&#"#6.!3267! !"''.>75>$732̏Ozv{kgw"+TgEۗE0[CWoG[SL#WN,:vDx9<d]69.P$E#pb9elz}fT-D-%<\N*XN(l0;<Ӝ"%Yj{N5      3  4&#!"3!26#!!2#!"&=463!5!"&5463!2 


@
^B `` B^^B@B^ 

@
@B^@@^BB^^       >  3!"&546)2+6'.'.67>76%&F8$.39_0DD40DD0+*M7{L *="#
+U<-M93#D@U8vk_Y	[hD00DD00Dce-JF1BDN&)@
/1 d        	 6  /   1'.#"932>74.#"932>7#"."#".5#".5332654&#"#!!2>22>232>32o'Ve-0F  F0-eW% F0-eW%'Ve-0F 0XWD_J-'F]KAuL9!=MtCGvO>"bMOohV.(,fZC&\|h=*1Hz^I((H_H\V,'L0+A56@+0M%*5A+0M%'L0+@NEsH0EF00EF0-?F1%6810A>A+7iQPq	"GY):;)2GH22GH22GH2Ft        > t   %6#".'.>%6%&7>'.#*.'&676./&'.54>754'&#"%4>327676=
>vwd"
+
l"3	/!,+	j2.|%&
(N&wh>8X}xc2"W<4<,Z~fdaA`FBIT;hmA<7QC1>[u])		u1V(k1S)
+-	0B2*%M;W(0S[T]I)	A 5%R7<vlR12I]O"V/,b-8/_        # 3 C G k  2#!"&546;546;2!546;2%;2654&+";2654&+"!32++"&=#"&=46;546;2 4LL44LL4^B@B^^B@B^ @@ @@ @@ L4 4LL4 4L`B^^B``B^^B``    @@@          # 3 W  #!"&=463!2!!%4&+";26%4&+";26%#!"&546;546;2!546;232@ @@ @@L44LL4^B@B^^B@B^4L@@   N 4LL4 4L`B^^B``B^^B`L       # ' 7 G k  %"/"/&4?'&4?62762!!%4&+";26%4&+";26%#!"&546;546;2!546;232W.	
+
+	.				.	
+
+	.			 @@ @@L44LL4^B@B^^B@B^4L.				.	
+
+	.				.	
+
+   N 4LL4 4L`B^^B``B^^B`L         ( 8 \  	"'&4?6262!!%4&+";26%4&+";26%#!"&546;546;2!546;232 
+
+		.	
+
+	.	`@@ @@L44LL4^B@B^^B@B^4L< 		 
+	.				.	:   N 4LL4 4L`B^^B``B^^B`L         2632632#!"&5463&&&&&& &&&&&&         $  27+"&5     %264&#"26546 B>&&=,X q&&@X,LΒw  %    % ;  #!"&5463!546;2!2!+"&52#!"/&4?63!5!
+
+(&&@&& ( &&@&&(
+
+(  
+
+& &@&&@ &&& &
+
+       # '  '%#"'&54676%6%%
+hh @` !  !  
+
+
+         # 5  2#"&5476!2#"&5476!2#"'&546 
 

 
 
  
@ 
 
@ 
  
+@
 
+
            8   4&"2$4&"2$4&"2 #"'&'&7>7.54$ KjKKjKjKKjKjKKjdne4"%!KjKKjKKjKKjKKjKKjK.٫8
+!%00C'Z'             . W   "&462"&462"&462 6?32$6&#"'#"&'5&6&>7>7&54>$ KjKKjKjKKjKjKKjhяW.{+9E=cQdFK1A
+0)LlLjKKjKKjKKjKKjKKjKpJ2`[Q?l&٫C58.H(Yee   	    
+ 
  			        Y'w(O'    RK $   #"&#"'>7676327676#"
+b,XHUmM.U_t,7A3ge
z9@xSaQBLb(	VU         
+  !!!  == w)          @ T  !!77'7'#'#274.#"#32!5'.>537#"6=4>5'.465!  KkkK_5 5 #BH1`L
+
I&v6SF !Sr99rS!`` /7K%s}HXV
+PV	e		V    p<e_<      N    N		                 	 		               j p    U                                                3   U  3                 ]                             y n                       2                           @                                                                                              z                    Z                                @    5 5        
     m                               Z  Z          @                                                                    ,  _                 @                                            Q                              @                    @                        (                                    @            @      @        -  
 M M - 
 M M                  @                                 @  @ 
 -            ^   a         
                                             6                                       %          8                                 @                  D       @                   ,              '     @                                                 	     m  o                     )                 @    @   	                                	                                   '              
        D     9               >                              d  Q     *       d	   	   	   	   	   	                                             	                                                         	                                                                            L	      	   	   	   	   	            	         	   	      	                                                 @   	     d     	                   	                         %                 R                                                                    P  Bp <$H<TfT	H		
+R
+
+,Dx
6
\
DLX*(2^n0|bX*Z >n@jDH. 4 n  !<!!!"6""#^##$$%,%&&'&'P'z'(@(d(())F))*@*,,~---.,../"//0F11|22z223f334V4456556P67V789 9n9::T=b=>>:>>?|@@>@xAVABBBBCRCDE:FFxFGVGHZHIJIhIIIIJ(JFJdJKKVKLpLMfMNNNOpOPPfPQZQQRRvRTUVRVWW8WWXXhXY Y*YTY~YYZ>Z|ZZ[R[\\<\\]@]]]^^^_F`(`aJaabTbbc cd^dde,eef.fggzghhhiiBiijj4jZjkknkklbllm mhmmnn^nno6oopppqvqr0r~s"sst4tu*uv*vw&wx0y@z8z~z{({n{||J||} }}~F~p~~~FnbP4t:~臮P܊2~hʌ,(Tԏ2lr8ꔪ\`\.̚^Ɯ:؝<vB~ԣTT@§VVتFܫfP8z&t"ڱಊh" H&NʽLLؿο8JfT<Ş,ZǰȐʈ˂jΊDϒhѠBFӬN|||ԲՖ\J׈:R۪dܮ>݆0ޚF߄vDjz8r,d2pL b(< P2nrrrrrrrrrrrrrrrr     x '            @            	   ^    	   ^  	   t  	  .   	  &   	  $   	     	    	    	 	   	  *  	  <  	  D  	  0Z  	    	  
+  	  C o p y r i g h t   D a v e   G a n d y   2 0 1 5 .   A l l   r i g h t s   r e s e r v e d . F o n t A w e s o m e R e g u l a r p y r s :   F o n t A w e s o m e :   2 0 1 2 F o n t A w e s o m e   R e g u l a r V e r s i o n   4 . 4 . 0   2 0 1 5 F o n t A w e s o m e P l e a s e   r e f e r   t o   t h e   C o p y r i g h t   s e c t i o n   f o r   t h e   f o n t   t r a d e m a r k   a t t r i b u t i o n   n o t i c e s . F o r t   A w e s o m e D a v e   G a n d y h t t p : / / f o n t a w e s o m e . i o h t t p : / / f o n t a w e s o m e . i o / l i c e n s e / W e b f o n t   1 . 0 T u e   J u l   2 8   1 1 : 2 3 : 1 2   2 0 1 5 k e e p o r i o n F o n t   S q u i r r e l                               x           	
+
    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq   
rstuvwxyz{|}~ 	
+
 " !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab cdefghijklmnopqrstuvwxyz{|}~ 	
+
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef uni00A0uni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni202Funi205Funi25FCglassmusicsearchenvelopeheartstar
+star_emptyuserfilmth_largethth_listokremovezoom_inzoom_outoffsignalcogtrashhomefile_alttimeroaddownload_altdownloaduploadinboxplay_circlerepeatrefreshlist_altlockflag
+headphones
+volume_offvolume_down	volume_upqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalictext_height
+text_width
+align_leftalign_centeralign_right
align_justifylistindent_leftindent_rightfacetime_videopicturepencil
+map_markeradjusttinteditsharecheckmove
step_backward
fast_backwardbackwardplaypausestopforwardfast_forwardstep_forwardejectchevron_left
chevron_right	plus_sign
+minus_signremove_signok_sign
question_sign	info_sign
+screenshot
remove_circle	ok_circle
+ban_circle
+arrow_leftarrow_rightarrow_up
+arrow_down	share_altresize_fullresize_smallexclamation_signgiftleaffireeye_open	eye_closewarning_signplanecalendarrandomcommentmagnet
+chevron_upchevron_downretweet
shopping_cartfolder_closefolder_openresize_verticalresize_horizontal	bar_charttwitter_sign
facebook_signcamera_retrokeycogscomments
thumbs_up_altthumbs_down_alt	star_halfheart_emptysignout
linkedin_signpushpin
external_linksignintrophygithub_sign
+upload_altlemonphonecheck_emptybookmark_empty
+phone_signtwitterfacebookgithubunlockcredit_cardrsshddbullhornbellcertificate
+hand_right	hand_lefthand_up	hand_downcircle_arrow_leftcircle_arrow_rightcircle_arrow_upcircle_arrow_downglobewrenchtasksfilter	briefcase
+fullscreengrouplinkcloudbeakercutcopy
+paper_clipsave
+sign_blankreorderulol
strikethrough	underlinetablemagictruck	pinterestpinterest_signgoogle_plus_signgoogle_plusmoney
+caret_downcaret_up
+caret_leftcaret_rightcolumnssort	sort_downsort_upenvelope_altlinkedinundolegal	dashboardcomment_altcomments_altboltsitemapumbrellapaste
+light_bulbexchangecloud_downloadcloud_uploaduser_mdstethoscopesuitcasebell_altcoffeefood
file_text_altbuildinghospital	ambulancemedkitfighter_jetbeerh_signf0fedouble_angle_leftdouble_angle_rightdouble_angle_updouble_angle_down
+angle_leftangle_rightangle_up
+angle_downdesktoplaptoptabletmobile_phonecircle_blank
+quote_leftquote_rightspinnercirclereply
+github_altfolder_close_altfolder_open_alt
+expand_altcollapse_altsmilefrownmehgamepadkeyboardflag_altflag_checkeredterminalcode	reply_allstar_half_emptylocation_arrowcrop	code_forkunlink_279exclamationsuperscript	subscript_283puzzle_piece
+microphonemicrophone_offshieldcalendar_emptyfire_extinguisherrocketmaxcdnchevron_sign_leftchevron_sign_rightchevron_sign_upchevron_sign_downhtml5css3anchor
+unlock_altbullseyeellipsis_horizontalellipsis_vertical_303	play_signticketminus_sign_altcheck_minuslevel_up
+level_down
+check_sign	edit_sign_312
+share_signcompasscollapsecollapse_top_317eurgbpusdinrjpyrubkrwbtcfile	file_textsort_by_alphabet_329sort_by_attributessort_by_attributes_alt
sort_by_ordersort_by_order_alt_334_335youtube_signyoutubexing	xing_signyoutube_playdropbox
stackexchange	instagramflickradnf171bitbucket_signtumblrtumblr_signlong_arrow_down
long_arrow_uplong_arrow_leftlong_arrow_rightwindowsandroidlinuxdribbleskype
+foursquaretrellofemalemalegittipsun_366archivebugvkweiborenren_372stack_exchange_374arrow_circle_alt_left_376dot_circle_alt_378vimeo_square_380
plus_square_o_382_383_384_385_386_387_388_389uniF1A0f1a1_392_393f1a4_395_396_397_398_399_400f1ab_402_403_404uniF1B1_406_407_408_409_410_411_412_413_414_415_416_417_418_419uniF1C0uniF1C1_422_423_424_425_426_427_428_429_430_431_432_433_434uniF1D0uniF1D1uniF1D2_438_439uniF1D5uniF1D6uniF1D7_443_444_445_446_447_448_449uniF1E0_451_452_453_454_455_456_457_458_459_460_461_462_463_464uniF1F0_466_467f1f3_469_470_471_472_473_474_475_476f1fc_478_479_480_481_482_483_484_485_486_487_488_489_490_491_492_493_494f210_496f212_498_499_500_501_502_503_504_505_506_507_508_509venus_511_512_513_514_515_516_517_518_519_520_521_522_523_524_525_526_527_528_529_530_531_532_533_534_535_536_537_538_539_540_541_542_543_544_545_546_547_548_549_550_551_552_553_554_555_556_557_558_559_560_561_562_563_564_565_566_567_568_569f260f261_572f263_574_575_576_577_578_579_580_581_582_583_584_585_586_587_588_589_590_591_592_593_594_595_596_597_598f27euniF280uniF281_602_603_604uniF285uniF286_607_608_609_610_611_612_613_614  U`  
\ No newline at end of file
--- /dev/null
+++ b/assets/fonts/fontawesome-webfont.woff
@@ -0,0 +1,305 @@
+wOFF    =                           FFTM  D      n2GDEF  `       '~OS/2     =   `6ycmap    s  bgasp  4       glyf  < "R 䨢Ɂhead %   2   6hhea %   !   $
+jhmtx %    	F_loca (    v|maxp -       name -    3<post /D  8  vwebf =|      aU       mQ    Q     N            w         xc`fsfb"l6F0#F    x͒Kq[#][_+񗀫Jp838ln!A/u	R:$NQc_=&}Q8H9xGDC4i%c>DYTMj[ڥ?+t:.^kLќ6kK/C9PB5lm죅,fIX
+V:\^hJעZ-ѦUAX@yQFc;h
52e-oE+[sܪ[vK[t/ۣ'Zݣ32-/$!q	1y.䩄eHB	5_/?;w+/O|g|dmp,o^(߁h8825M3['     xڼ}	|Te7oL&̚0kYlbDQTąQ)
+TFT}vVoEj[j7Ƕ~?[!?$$2}=s=<s[9DxperAyV<U*r8qUQ#㐐Lb(MeAEөn&H|xyQp>QxGs8xX"MEpxgs]ղ:hɄ[zS,$.5n
*F$gۅfyw3Iv6
۸ !jC#6{&]v'ϫw 	]CT&_uq$ ?_u#Z IZb5ꏢ7z׿F'pq\D%^fF1ႱȝN3pd3nItz`ޣm]K>	(f`V trf7_;--نofϯ=]W(.?mڴ='"gV>zYgێ<%LFwԑNhn1[qC§	?vwP:䡔x!٪urՒpxUto]?܂,>!AQ	 U(f#J&VJt(NG	u57N
~;UUMYgzmSSІZgD بN_KWSգDr;&o5JkWנ]^fjY؁յ/Lf&> 0\!n,@Ԗ	dn.O,wm	8%7@ݷΝ/`V9Y\}#隒hV.vspqqB:mF
brf  2/-4>c?[}GlgsQoan4FʩSLX$BUC9^
+V
?=$IԇRsX[<xz>n=fjи;K<S*Oaud1h
+'agplLXSkUZ%a0W8}q=e>/*⨓LzUM8gᣏ 1,@inj8Vcή9x;e>83$h)G=o[C=Q{m	݁6Sϧ^(ʑv ⸰ÊĆѲ~l.GJVTJ~hRhE7k:-!mnfAJ7syH12(Ȩs>֗Cg?T!inIssmg@Gk@kŹjޏҹ/ȥ)fE> Iٌ%a pZnM]'߫Į6_V6mزtW_eC5P|~OєN ߧzX.,|Mrm˚-+"۠1۠PG.R
H"ȏ얂(e9Q+27nt0}Y
B;<1* :\	
+A>%H֨(jX1R4FQG!-&ag g=j
E-H ?ᓇćmo(|^ɲJ,Diw1Igo/f|Re{sc߭MYbc07&e"&!rrO6ܢ7^1MFښĴZ4--ӗLsÖĆIEKNvvpY
FfpK5<z~Jv#
 k:[Cv-lN&q+!9bPM26H*e`}0Sts	:-v#$|u`^1? ˯߾|H*][50`
+Sg] h!v2(Q@;e7l* W=nubdu(:[6`P.B<BRxB=/4*ߦ}S7}N0[ q[9Z//?T	] {|y/V3Svv46wOl}6,Ggð;;MB4p<xJũO)t	1u؉BPT!R|Au'<& _ZۣΡ4iALSGSjG""P;
1 
+
tsac\*r3;MblGV߅p/z\vb
+IrGXbɤxbF5`L7P|Y7<vw)h"\`(VLە衫$Ǡh4pqP80$
Ou܁^jΞzYnB@!J|qMGSZ.x:5(PCF7`Å਴*N9	E	X-W?`PiՂUsV`3L7z)7uЎUvЙm[bh򶮯j@QmumrvɄzz`C|HS1		8`dAΓBzOFUCKr޴/58Gڰ	P3.ih)j\-P<$˞qC=~j]-uJ#]Q?U*mJVXEC
8[2A=% g?v&Y׎$ŸOtW(v)[n85cJ(ަX_WcsMڑĮ6	s*\!~

+rR^)֕
+Ӆ\?IA[nQRt`)}½klp4+5
++lVfr9
+Аԯ\y-VD45n(4;ߧ%dBkJnR~aӥq\+.FL!~y#3&vCSC9cxhR'pIô>~Q5q^5GDiA8)%LQV+C[.o'\aÛա"ۯ1Dt?^hp+2epY`h Ū[pAuNqf@!
+Xr}BMiݝ
+껲wv-Mdv
+i8t_PSk6%5>-u;;f(Mhё}Vs,Z?X;8feCJt|õo(6:ﺆuϨ?W
[
G!B(5?z-Q30tOps^`)
lYv]^Q+@8~p8oX]8h\jEz"ZK<MW8Z!\A
+/>ʚ:qi6MR-])'ϝkzEV	*VGn	ZgevK
k#B-]s6g	R(zo@pG0jv:cQ| }V4&K-!Nӏ>
+YZ!D1G5ןX1_SSvfƻPzkC=vVsÉ['~+st:Ci~A!FAt_Fp!9$4Ғ(HH/Jvs+|Fy.~4p40BQ)yS>3bgÙq̠ͥdHN*_?7Gzzf4YO?u_y]Wţ(aD@AT(1B6ETg,t
+
Qo}j.Qa$Ftq-gMB=ƅ(ς-~ZC})談LP~458=6XI,Mڍf1[Q(-.I\=(%qrፋy\"3{GχyG:-.Q'G0CQ3`5
ẌMp;ɂ5Apl:#o>ܪ-gu-]ht[ 6[sHnBzë3E~v̱j{ɯ]!S}P([06p^`,TjB<u^U;B^ono8v.VW_Ѓ__Fm3a|`reah\zƢ>w-|^#D󐆻<|G|9W#9F{2HA Ϲ(o >]]
h =bGQ®*md_12DQSyJ*ӘKoTKGdM<x1m޼iwΣ(oY, N(g4Q3GC@y	DN$RH1$}6Jt-5<}iy%xѺaU[Eԣ?ې[ԛeHn͈;C!Kȏn;G2X=ބOZ$5X
cZ'F,96tǿEpNZLow,%:]N/丈+S$C#pGaNAVDI4H'NH <
+{9,XCĦYvmHv\7Da(
+Ň-I߀~{k'n\;+s?)L٬^i
syCdJc5۳mf̉'k7{[=V?ku&Zάx+۱⦾ԪO.~9>ѥѦ<]9YBY(n,%M!-HCÓrEn!:ϲ`gF6#ObE	~񦎶w$q2v-OXͷv7cPS1r)Ui
v/BaٹV;_;%Kخr7%\V&chSvF#Kxc8Bh>va~
);|FNaJQgDCvY|5hw耟=dIgL/Ü	7:-&c!VWSGlf$%C@τY$y{at(ɒx_ʮaEH0:OY_<#K_}v7X;I
x-M܍qMyǥkG1&p! )qn׸ALG頰AGi]c7NƎ$bCNt:p9	LQphBaSQȻT۹Bb.K.o#Xp'H#l|Ϧ7ufs粝&U <
vØcģ@Ր/"Ƽ4{$}mۿy"餅fSѴcS#)lw̔3\8TvNi<1v߹_&)"ZN31VS'r8gaT䒳8?[W$RO(K0h1c]=c/61!|7Y͇şS!B) =M3{Rv"+N~Љ{3TA;&A:ףbVz(fO>7=Q1
+GgYu''crt+h&
+>n	-A]xL}*u1̦Zzű܎cvc落dQQ,(ṟO Wh)I,k#IiLH4bgCQ86oܺuz*rX?D:% yMXPs`؀%pBI^p-^
`6&9Nz4>(0Ae[k:A*V'K48\P"GՁL:VRmɓAMepTWh#GSc%Z>cDQ&:Tﱪh
+zM!%
+çhs8'Ȕ(TbSLq7R|N}u潡ƫ;
+EJg"2,	 	@ۅ9s$<@osԓjRwyWKQ>Dfsg(N={R~Vw|C_~^B?E\77Z&te2
+6T_tEؔK0Lvd v3('4f`H 9k| n:ηHu4 ŴB^JqFP(jB {o6C)6:To
+A)K*ț5l%4tO=tۥhw](DV=
+.r]n{gym5VzS[X|g7U`'!Xb
|)Ǧӣ<Mϸlit`OK숹IRneRDJxҝLJ8v23Ω,?Qy<WIvx]oJL
+Si :tzYdjF`|*3DYGeV
+:b3G|R^a,NI
+s F28vI@> h>^zelm?`2͎rʙ,*=_%)ULS9I/
5e05FVDo_$հDX:K;&i$6y-FvyhKmIUj^լSQhmn`tGg}F-M5&HdbktөW[hs~+3yBks
+U? W(SME˰[Z1Әryw6vJܥJ4~>::raS#~9`aJe89|<V5Q:JUC7y8::@A_ݘ1kbl[7R{uckWӰ/JpRq)@U3B뱌=ᥪiSC-AzG੍C#G? K/Gt#3(8*OaN-4V(RgBCQZ^JaCy࿖&=8堦Óʚ"OZbNv?<L(,7^t'W93j>SJԮrklCЄh	d4{T+TʘeV#=]DmiMʳ*KZpn6%/xh%k,VOkaMZmUzxjV/-Tm!sXkCW70:cāƬ$gdApf8ϊ8wU[{$M6m=`ǵ~"XyO*mq
+hK;.}WGO(1>wɸ.얁0&3?Z`/;{bA+聴XbAR"@GH72_I*etl%-2/\A/gеQ=gߊC`nܕ 4e쥀2!&iJ?1HiW%
++בLqAװo<0ʇI%Mp3Uw=*
+PR+Eއ/Qv} O!,%BLO8CN`2 T0M?#V-5?d;?Q'Q+:	ԣIWQ.zFІ>]kL1jfCh G"NzƅLϧ_/C&?]	4|$-Ji-v
+J(F
+Hq{,A(R̥fLk?JGDh3KC(
+Cvsi>!G5QcG;KݤKD5~Ŋbl&BKH[h[5"=,ԙ/~ԭ
+U[2
O)@T>Տt" qxRO_$
+ƺEe/Px/rT"!(鞷ڃIL'j3I&+ٝ~o,TJv!T9wl1:dNʺ/E(&1ik;//?&֊x^4
WU4AZ^nm0{Kҳ/K_ȥ!&K3@z/ː#w	7Y;&k7y!&l>4a+.M?+ZY! ՛`T*0D,}.u'f"|TRYAqW+4ӇyDMmg*=pJ{#	Zo{i>tK_ۂԢA[R>_	џT_ajOBCdٯTbJLe?^(
 UBpe|e`v8av`oX`HEq_4;t	$tx`ﶠ]9̹Z^H$9tޗd7W8ŐdB(,fIJEBWomÿh7{oV=xL/LM}n;KW>ߵ-:l|}I;?>HѰ2Liچ=wۢZ/'cwNv{A΋?+')Y4 <FR5OzN7OA|^}w`yy5/:ZԷ~ݶ:C:Bv~Ճ/^W@s4<DSыWn܄6ߺVaa?,e:~!'ۭDb[n6.@V	!aqM7fNvpwӻ{n9Lţ5j^+뼲x_#Ըb-PYk)Kq|yɉ``gs1ʙ/Gg!Qbț]UכG>C'}g}vtXojq [/7]
.7mOrsܥdv[fhvMR&ө<ẸYܹ Ějmg
+)mq04J)_Zx~g, ڸy
З}@u])j%d>om`a"ފ<:TpVfIt~z
+[h?U_9ͿJyPl_m&Ů`v	=srK?_^ʵ[s_;pv+"gݓrI	OD/;Zؕ׍Үd&\("h85̐#!ɝs;Iڃ~`Fɢf
f3yTև(? :}[Rvq@l#`Sr
+r^2*ӂy@oVa#Fp[`cbß/Be@DČdˀK6B=J#:͘7
I6Q)]>%)ȸ7W7*]v\\dHVpQ@B(n<y$

#VZ`4Sz~}ow=^ȱl
+C!PIR_`IhBU؉ z0=Ktga,w5Z*1vEe~> ZeJjP"?2T[O	^-5DovF)	Հ.$#\&OqVתwXׯ{vjv~cc1[|X_nh銝UOuoΞ+z\2dǄh5KU]8EM!%
+Ech&J@!KM#t#D'q7%Դr-Od&,9=~#.{SEmE]vx+`]2?~7~n,͟dZNÊ'?~&摒ǿimv.kijY٪y!UV2L4Å}~Oc1.wQB/MZ^9ţ|r#RU!>SeSJZo*JVICQV?|x_@4hXn3:B54W-u1Z/MF2>8C3J<ZrJr֨s6VpV,0oWk7@hP,].5/{`D=wBySAo͢T?Ah|M5%W14JkLY ?d=6{fhLVc1䍦T!:
6*56OHf{3*E1n3#gܺ={!xu{`I>{*w*(G4j_;˪T*jI )5|iULý
z\|!.?ѥJ7>nKC Qm"/UD&[1 ;zq]V]JZusKWmPNHA|w<x-lʺMfpt΂rه0r *OQaNa;4oXjYq9vze ՐP7B8Et@2gl\53t[upoϩ[ۚxAun>/n΁Ӏ6n:c5c}|Q{ê:Eva.T[t|2c+:6.4LuSJzr2[E6e|3Yh^:{Wϵw<Q|1(/GSZ]1jUT.QzUX{,mL9[4 \&A Z}^3$-c2GÇO>_7Նn'WQOq龾Oe}}/=:&4<Go<iAO6CNWm:fIMK%ٲ*'[Ʀ%[Ko
>L^-n>sW^D'_
]4@ZdA\[45*[Ko7p>m<9/gGH3rhٚ^X.̐;Ν=+*?1MTAL&IQ-9h=,{Q VUov^k%@NfgPDÑзO{ya];Hhxd66RII64W'ՙhRSm8ɞwa]pXuxx,'yl|R6?qӗ0$ O0(jle0$ibc5|<O}Vo,vMzl$5M:u1Im7Clښkx2ocyounÁ!j^#KuV,77f`S	wE@A`aJ/E
+iTi9&tņ*aRA/57>Ni9
7nFsp7uDD׬T{Q|M{ݷ&w~{mu\'DpF?q|O<⌊"yQņ$}|mfźw.ZfzsfMe|#zJILW7`E:`?AO颤9T4Z3G]Pr^Oѕ5S1[ `Եۄv}Ai5Мv<6:DOdoqGc{=f瓋:~0czuhvt(l/Eɪx95]2Z>oa0hӵqѝOmq>繭/]sϿWdI-:0,6`UnGT]IRZ`2jXi{/lXB.bl(u5F<^O4X?陶Phd!n(m36տ1_l/NO5JCrW͜D`{XY%C@BnufcQ#93#
W:nh2}¢.EB01z3,xKЩi"U<PFQl82ʖpq|uvnw=7ܴn`VxB}Il+/qA-hZ,q_ŭ/<M
,'2<*}$NqexP~R-$np#jV&(URVeA8DqTWf>5t<{8Y qd  nqЌ٤]ڍ h鐋(;h?yGB(Y;lC']kfN%Go-@{дG՘&{3[)F*O4TBfm P`1¨LR.vړa0И$MVW/Fbr1u#x1fL"u&]i4}B{}46:ͮoDw~⸘53hT6xFZ(ᲄe\f,,Um)7I`P_S*
+XNIS!lԂ\D =*3E'P	fKa?41(d1WAN
+OzאILNvz!vS~mԎHpop:_~+W7u]-0%fuEMWr8
+@(3ow=O?'>wsLcâdf9e9kf39kvM_`\T.RK+yUort*Im\ApIb<=bQ
R[
+n:>
ԞJ+n?2Hl!Wگ3:)z}Z1|A/ooSimr6y؎!2pf9ͱ/oK_S7%rNcµzg[L2pD{,j*/MF&I
+R$@F`DqI]`3bC0!uNN=sn;s^{<^10UZuI#kmnyXvG[͈磷Tܲm/!LvEQe%6d>缨q]9瘑&*`I+G8j;*G'1>~{;cт9<F ֦qS]2{ Vm8KgX3䣥e5>&eZ cMŎ?htVո<.υ5ߘ쥷lG7~o!lFWMxA~⇾JcBy=KSzk];ҷ=̴[⃍US\?G;R?RWwjwƫ~vk3gt-n3l\^6Ȳ%+@uai+"f??[5LuD3Ejbyѹqd~~âsBoKDͪZd+L5 9QwKޞtXs"AU5d7I$m/%k׭4:MuGgݮ4}GN e[55R؉ΦꁬͨȎcW>chhvFkvJDfn|0>sy3I-p窛5nd6R-.|M?u
+0@pnRd^:-\{GMRL.r=Yli!o`lKdǝh6{cM6j2
+f_qfJg﹈Ldn7[
. Nm]CmF{iNl̂0%MM|}q,EJ﫵WrwlhQ>cF\1kO>7h}ܴŽ\־;7mcݪ򿮸ߏoP0)w/_W8_c`m`$Op$f 	Q2vF(S#ȫ_8$s/zsxOy]F(~Q.Z?男OB8Zj_?u.!vwǚػQ:ɱn(F uᓇF
fՐBYVڳ)ǫ,~
/n]&eLn&4AtCtДT͊Wfx .j<4dVNs
+55dJ[KҠuiLB=3  TB%s8)X^.7kN+܎a ӗߩ7&{	yאe~pkDs\8\s{]6~O:Pݗ(RsמN
4T=Hn{wYehBKc
+=Y<<%mmߕe%N
]ثeQkS[,7\MOO$z[JYX`o 8,lRx
9A<E|!ڧF|4U%ys}ϫש$~6Lhw$jܷt^^j3ߟԟ4kb|'һ(#L@R_i4
+rr\1CL{VI0v{m3
\xPo[>/@Gr\?luW/ڗ^skgΰ\H^gT?]uu>; 8s(>;CNQ'cʞT$^b23ON=IٌgҞ47
iS}]smFTv_SƺzS?.Uc5Mafl[tT~aL7:Os#PU?J^5?cKɒ&l(k&
+7R88Q,yz=y9/~w$>x1>88%6d8k-<3d7Doz҅fF:7s3tib>fB/;=]@Ι¬sYw.w#\da¤21-za'lqhPdhx|2T3fv0Ń˩wXXܟB}wpՊ^D4J/~.]M:ד7E{ZL:=n
+8I4	Ҝ`5yyzcQ2_aOz.墥-`͘sz.=9{P{3 ʊ~~	HPs-ݳJv{(3v1fXu% }1\nQɺc:u4`<~(p>Y
ʏ p'uR6b錇B[x
pRf`ZV؛Dvg*Jg+ĤR.WdӮ&s/Qɥ̤sYx暭sp q~	pu$`Ҡt-@/}8 {,Q0#Ә͔$QOC8Rybp\QRkfp8zjUNx\S!zrAq)$O]&YVKME"m̰֗m(V'u,+9")=>nxF+!V]Zk/ų
WERStk;"Ts٨ٮGgyF>L̈~=t,HJhጏRE12K)(fHƒ,J'a`+%Q^\Lv]W&b)DwԂh

-a.jNtIW*κQzZ딧uIvHnx%5x,ٌf:ᇊXl(81f%ᡨG\W6cQ0KGIt6Ћne.*HnB	\Юl*ueYvv#@RiȠt34+^L1(0Xd;Q7e1QH`Zg@ll  f6M`z6D":	Wb$VAI@Vѥ-!'^"HFKz(k(&zdH*yA,Dodl!AjE
fl 5
+HG6QlA'XD	:$ajăIA/f3!"I:Ld9-xޤn"5a^^+JrŁENcAZ$VV` Cgc^EXp	ㄑ^F"!zm z!o1m<#E$`Cj=بtJȼSxíAЛ$Q'&˄1鉌.B"6
QTa
+&Q0,&Xތay")J>w&$DQ`p!@
+=D0RKqHyD^Â
+-$u6^1OHpYklb%N[*(ء=YudIz	
<yP	Ɽz	zd'hFrB6dӈ1!lԋBH}zhh'O6isaaЅE,0:}m2ۍD`Rg
"=du  +&hB:B0k
[	6@^4,	O |`1%%^#vEPذɠIaT2=Ao
dD[iFXVX kDXF'
:C	s\cuRi8G͌nrRm2/iRP?9;lCnsj?[\I<7GXA4Sl6AoKw
˩&(>At 6kg4Rol0Bspߴt!jtK0DY:sW<7.*?5Efse5!<~o$/8&*.RBAWf!nST~DI_6֩JˌqS%f.}TAYrWZҷIU6
hl<4л^EN
h,AڵA]^_-96u*32TF*H;e64#^t;K1{ExM8biE}2+ZwFh.RкEM䘝pMfr˹SN	MRġ+
_`2?LR
+K.zطsƬ^hCw]k(}6zXmGV$LIp벽>T5cgx&@
Kݑ;I>1-$|Z_tKoYq77,R'm#[w 7dqHa?6 FdPxJ9,[!ikLG_R|7s	^ś$`Tk'A߉Ƹ8w^m>/?|ꕻvxu8?š 7ykvI1)Q	ڃ$ƻ.?Gwްrj(yd'2cs\p	5KH?(]sJ~$xt˻a4͘;p-Oco$݇7RXsLG=H3j%fzQ,-d9O7iGȕSE9m]껎v>Ԡ{J]WV/G=֕Ga<:n3/ cd{C-p$ner
,캗aTж4a9Lnfvʢ>j
+aVБb)1cZ<C>"fl).RNaX(mXz]f, 	o
]lm_ ZK]0Z&Zb/^e h9K,I?Cc^2/K؈Cҫ^l9@nѴEwW,^qCfzs3."uiE餜-voړ䞦0{cءkE?8S^=<oj!'v\cbJ'dY)g
+QPHL#oC
+~R̫?CETv?@
P39gQ'ˡ_}@\|`|^,~dpp#([Ь_K1RU~n\c^7t̆\`?,˭)>m֠6AeDw'&[_ѳ"D%m@u^v
as}#ű﯌2kx57u8;
mVV.M`|vmmO6_}'of@5GY94Y[\
2bOO۲^=kwtnKc7&r3 Q[[Rf/$LPޭm; *ˆՌVߍATLJ׽+v˹a;` )֍1>2vgfĔLi;N()JlR> tͽӧMk̫Vl3mѢX=,մ\бq[Ra]Ӽ;6oWT֊%zWOtYvGV_kZs)ڎ%dk:ojcf+事.j|"n#՛*ƕTl/#$L2aU#T!l,Y-iJ!oNg5I w^L}n	'^e0Z
+K"z5glΦadYz`UGK~=cAo֥
8?\hkVL:@S>оvFfu;Z|.jcvZtm&|y?Fu#a5{ł*EIjdYYq9JUohCfE ZnW],ޥFG.}MAo-#Ԟ˶w:3BqjkyV7a)YV/Zjlh%:z\q3wtvlrnx5%4%X37?ݸxFg}>uΆC+gr&+
ČfcBFFEWXZBMԭ幱s"1.=cՅ?ؤ{{lMSV)*nV8Q'LzU_p%
+9lV2Ea&7ZqӝIQ٢7Og/Hߧ~a?tw	?RHђ<,CBk>ߠ|)/`x?)o<ܢ[vjOxa!M(=?@d	5LL$Gf&"u%hJRJ6GbExb~Izyd4z"7ȼ|a-z?R
+4%QfaŖ݈(iOtBuhKW$5~.]uMm-3T_ܴw_k,	r2qw{Edtw:Kr$&WY6XnfsئtcA @P$%!  ![3wSM?l_~_nn,Ŷe1IU3?	칤MYo|?bIo2WUEb+&YF6'Oϖȵ2#).]dQ65<=K՘%+3Tr
^׀gV6.ȏ=oP
eqˆܬR[fMKyE}kr3+5nyXmjL+L&@:f"yKhI	HE")bh]gUu.(5`ү)ZDC׷TfM/64EuU
6RTWW*+sWc;pO+9.hhhKu/':.U#K#ʜjWc`=0?"&8aܨqh
+Zw i x^eH"VPA8ĩ&fHHq	Ra> ҀDLXE#|?bybLӣVX6k?0]f6}?Ys*M<G}N[qYnV2[i;ڻuAl=7iycAOÌC.$Qd~y}-+1>qndOWS>qcW&%_~Bz˖?i;=+ƂPSTY-zTM~$&ZjQ r8D䩞0(hd#{HXwd(&&yӠ;0pqvGW\sy\#mHDK'FyL)M6"&l0 &0*hB Lr@JI5E'{%>q) l6HO"HAҽ	*	1&ޛPڏ1Y$L0yy - &HwPl惙)0DtR`L'aDϝ	ЀFp3=CIy)˰)F¸sU~\=jc^MLR=uvc2y<ͷǿ7IQvz2:ؙ-	!0DiRHpv(ɘPV.qv3jf֖i/[Z &X:UBstG$
+^ڒʊ_\E\skuz7[HaiG,4cKbJ#+#`Sl\m:j͋L*	4X2ccW{AU58csߴ{ZI_Mr{Jcq܀GR(a"X3'̈9:e?JkcwӇ:;=ݻ6@t]{@iR@^t-z(E#&ٷ1g8.up`19Đk֒iBaF(`35-CB[b=p,j9]@;Tvޮ)*{
+I;JAiVVNv)iKk6- RޥFHTfh5Q*z=kл&^r5ɥ{GRT(VwbghwNbaO+"5d3dA0-fQ7t2r&u_)N\ĨY`U
3G^{as*۰]+]쒮KC.,|~rWcqA2B,0=P1}X/F=Go}KMNk|}5ЙmL0gEgL~g췣 a&$`?2`&mK+CuS5S4 ^&,3|ނ7O}/􆫘d#nYh\Jm#/>N0?5
+PhHjHXɀ	@7xUCM!4g>FkxwUf
+vp֡m-EJgk Wk(sDY"	'=F۾$ɠrTM#RDk=ޜj(ǢjC"SՓUIeGSsS5I
+S2rQ60 #bU&/-eYsvd&a (<k`0y՛yyhQ+ֵSʙW1&te.o -T4(Fh4URVݣI^,T͛WTAg5(2AW6OJA'᲎z@L$HeG7y&(<xƱ+A#&$fL/L2PT|R"L:<$ w6}&~Q|ɔOzrr%SEJ$!}jf?w$&6`Ir?s%Kji[/=timbeR&mɍ
LVi;;fMV4ԗo\vĵhWTϼ`~yf*S|7n p8Յk*lVcs*ݺmSn{ƭUL$.%<hP91 hj
+HJLH,O4	RJtfvL`$JzDbod#(rJa"Bwⵃ^V¬EE6@Xwx߽G˃b LXo;wN4zmbCĹ[*G2'#~
;y=E$zZˋA ~~LR<z9:z)QH 8
+G
 ,jZGcjdr/9	J-@]onz@Z0=wNQz*1qu#19СsٱBWq]cGG:M^WSH߲ܹK
+alѽ^TWu[^K.]^-F(*Sb#=}KwLW z3petHUЎL2C<@~i_A)߽j3MkL⮣|pk|ӏ8^<h8h욷MkPd8E%3^$1v"9wV{$5&Hf`JJnb:22INw`%CHޒS+Ttqt?zN|π 'K4),H5qdG"Wuo;%>88jb%Qz@LjSn\_pbS-4"q&EYyfsW]gP8҇"0q vGdS$_N@PGmqXps@4z%۸#@]@L8so clQvt=}A2	ɢZ%. 7hy8M́$~x*APX8A=YÚv`:Bqy'!+ԗH(qIOu>OwbqC#uΉihz$/MI3ie# \T>`XcMr_/uʜJ\4@<A~/ߴҜJ^{,/:#DLq#
+Ho8R+$</6Ao'Y=MIJvEϤthq0D/ۧc-*6+	X*|Y
+SkVe`Ă׹i@d)r$w 	?ĜM!a8ZBje٧0?Y6{'ӈO0!㇨JۥH{Id4IӒ$J
JntL^/N)DfqL<T4I"x)|/P4xĂF
"$?⟦H$R=nw2J=)Oi C0
)ܚvx%ph,%2>:2
+u&O4N3=HL¸޳ɣ$`M	2BEgT*Q
)nV̰2J:7TQ!XPH,Ck:%ٮ0Fֆ{J?9._߇3v|))o)]Rs&&܍֍Dr\_LIqxE;sS fpJiWaUJ&=|#][ܭ߆lQQ^fp~܃
uùR^Ap0r8_s+`L}';DNW1?U~p))_Pv8.~(_'-$᱉]36a<ws iQC\=ПO^Yd|Cm.={7}m̹@D3<7,G1YtI3c
+	5Hyu!Xd	bO۝&PR2榉L1Lb7@g!چ^Dmp^#lU50sl4yP
++B$x_%!JHtϨ[^@=h3cA3{N	LZk*	㇙Rebm 
+AI<s@4ƙ2@&cdo
+x*FTG20eNHIڇ9%|)Rv͟T(?amq2&}}	@9ӓadta-OYBY>T&~2%
vɓ	|k !W|Ԥ¼e<OthjB;@$'T:1>ǀ$)gI}283cZU.2aԯ1_!y6Bh}Q2_N6LPn>}*czX%Wul|ߒ.WΞMڝtR
+Kw3|MT6%#a'2@5-e2D/ujNX״fͷ"%5$wwEſr^`)|]b.5k&$+yIϖ"Zg-A5aK[$-oH!uҘyL(kXN0ik\h?\Cg27}(%]u]rxMb1xu<r^Cy.sDܽ?eca[±?sI2w˵72i_hҝ/mعs`lௐp9+2x:1j~!9A/37I|X̗QdZC5LA,ZO"sYut(U.26.,#4ʮak;[R|]*ܬ|.W͏
P:¬1FSՄ͈PŉƤxp>ZwB4dgȭv[v}SR-l@[|G	_:E@XnWWImFqv	ܡde[dJUa[帬b?+[VK
+۲H|C)gqEJiބIJ"Q3rHLӐ0z
dLNMjy)*$La27R=zC|A' 	FRRd fK"x,!ϕ~3O4?%V|T&4rҡ4}7F?YOr(xG'z?Pa$0=t<ـw[nc
ߡiuv;1FA?⫼Wd6@d:=N?"RQIWgJXZqIB8a: ĎLa#N^QuhpOy}>xxAY9Cg
+Ї)?޸tzAbz:^w|KWy
+{W+ߦZ3Wg?
uب+͆xzKr! ?MЯfGe΢\BUQө8SL (RD
+e1r&jңo0
+lJ|ef]fXRyα{zUWКү<짷5O,)d*\UȎ 
+3%]EbK/~ctad
+%Sk!ƣVZ</:򑫹?k3\ckf蘌

`XI	7MmSiEݤ0`WNZkωƢaUR";yF}_Lw>@ۓtz.27 QHvaqH!24Z e
ސxα׀[~3#ddo>M܎#ݸgO vp=3k]'(1"|7rLv);H)"TrT!m+av&WB:s m-ΣA
oX̚-,6],^?0> .ajehntֶxԟ}x0/;aZbHO|QP	=74J#24zQ>0(+R$'hxX6h4!
+,93'K!-tGɮa=qz)IwIfMc,P|C;?<ݓgF@W{Oe@	3Qգ|ƱGSLʎs&<!f 7$`ۥeh5Z]ŧ)	Ȯ<I63oO2Ңiv۲jpGѴ@I,
i);RM.$drFh6Z$X\B#Q{1rB7bs&{{45'F(FR( ?߀41B	(H|d]
+
+/x	t,LetpW3hp^#il"yA˃s0o AKzb>K$~	ei'ME{ƼLZv2Lt
o7ѴG{B̧ {kʊ$+
ЌPqLWjZꛩ՚5| Lk_foٲfpu%Br|ҩʦmv#H̄-=~KJz=nDRđ r  1SAf1.I:r'^"Қ:D3w
 pɅ4ãŊfʋ] 0'h_C!"f1h<ġ~ĤCbu"QoZ4PnOˡ	+ ӴH3ϫ/MMg]V9{8(&Ľ}jįŷ/;
+D_ks+Sw鮯+mtHc>TߧLD2}zl:uٴf1);/;ljku9u~fz!- H.-M4%>,Z
'ui*جGii&L;`*+-]2~}]3y9-Ps1٘L(+P!oԀCpCu܄	ӘcHChQl~q{y[,70}[:8ÁG@]@?{QteWVn(Z~ډO])"QC
_\^BB jܭFޖŘ$ʋGq;q:R7m;Τ,&$w!*>#qN$*X!Bµ$AD HA|\[lˎHLN(@ǂ0@8,$x@<sƖH~'gY"黔JuK_w{JBxcq')}LQ5miǏ[\³s7Wm@R0,!a3	1ֵwj}t΃k[%'ɡg=I?߿v;'q߿X321x<&wQ4@oٓsd 'c3ItIl)&"DK"f)Gf>w/O 2p8cLLƱh9h: 0:P&ZL#knZw}F#c(k,5+LTc>Эa
+hJ߼GL聼jdj};V}ʪtϞ:/)åT<	[&"mXbe+!E.iz#ۍP+&9Zа?eZE T=Bj$w
v땃4#-`I-4nUB#ihƂG{쵻G8jQ|E/ffxOJP5n)ftbp@<VVUY@7Wn%
xW'7B5d&J|DuNuRyաPE?|	Nzz,/ǿ
+gMK:|lD
~ʼ+ H50>୉~E"	>xu0{:HxiaqԲ0TO`#р	>pg4A6V/Љ5l2Ja4z:oXs]G`yPp,z{~ {|64y*84
o/_Xwݝwsɢ*C@j)4	,yKE)l@<KQiQhvjqU
+-#7,ֵ~}$\M?Ƒu
_fУ噏4< P{zJ'~݊=Fx)5{@N9>׸g:`O1ÉMf؀(;#dF`#9AΞ9oScmXҺH+ALovSz*w2;̙x'pHDi!S	.Z{Zkѡ =Igq&O'kH=iڝMMsxga8~~>&y oO(Ŗ֜&$!a丙9!&~Xk4hnyWxMRc~-Z׼VƑJp{CJQޏL
0<P{`\dJr{ME
T/91G[vF,$^A@26>Od9-liI
Cu˅0~YFPhH?#>6>4 cN4n1]́55{r
0
3iAW㻪t@?ns>@7=cEZSUrzJ*.ՊI4
+Ja%Q'd>**B*]I˧]jjB VQwOE)he
+=Hx$&=%卺
+&HbM'NHڄ&>i
"!+Uw)P1e7W)j@Ps[DIW0 (y 1!3>#`hCWn[9:n|S	?m 'Dok
{ |q \YPpSAGJ800{j4ߒN@7@}S=+79Yaڌ%'se@R L&OkxZ{ ZDuuk%9G G+N!jYIE  &@}zGpvj5J'3e}(R08EףHBͫ{[jZakvWWXSY?D_Ć&o6Cυ7pH<	N L鿌PhEqLMɣN<!uT
GĜ[Ĕ")o(ɢ2'WH|{#k\"3H>Ot[,"e~\ p	',|cp<%}һo׸̫Jg4y"'o4"Y2r>/ʉx.C82*HIh&RL360үhe4Ձ>xWj\A-nřZ
+ܰRѥY0:}
+W(i+4
^!	
+yg~WIϰoG&L_#cY}OlSxv-:,$ha_nj]J ͠d9.Q}4zҎK.C0
6d5906-/hXK_<u-6*4%[STW.!WAMBA_˿mU *x~ ^Ek$n=1ؓe]t(,ƹ	gapB=k/-wXn#)}@@Gu,T>8l3<sTnnmeu\ЖxӒJњ=C6RG]*!TvUbIeŵ|g?,zJ2xXh%
+-e!O`ԥoy2pr
+9&óߥl֙}>?Jz2?pY\DtjZ5O*`-cG[<[_Th.x-:M\E<3B7G8)/Cp&57Ih*4W#ffmpF\ j$._JW-!,~!7 T߾EܟWڢYvFXk{5l$ĺ ZCiAӫ	Z^Fl^!ku1L~rqRҨp$Wؚ~N||G7kڪ9zs	p＆܀K2)5vlh='X<@ 逴FI}ĲMr;:lS8p>; DGzķws֣V݋*x!Uxs2V38^++슭k1c(Eg3=L&h)-vСcɤMV+EZ%%YKuU	Z_F'ޗ okF(kTj&2cB-Ù|Qo3xQ7#)	)RFLqtuѪ&ASi1W7ک"v^uKG-L9*^FsKW-m|Y6ai|.V95\f
US9RVts
+\>c
+332Dv7 9W5~ZU0X2 ė Z\a	Idb$]JqyS2C&6}_Mt`!h9V+j,ʃs{n73qZ<?6.hN_>~=Ydֶg'Ƨ֌~f4*έ̀v$?L{dOP]DLd$ItȪ`ffw H0fn
+'3՘"I#ĥ
+vuiK?	LN|Wt*U?]13FU9Ozş,^o_yp7}Q_5#>_j\hٓ+}z}L鄓Bh'T_Qg𺬖jǸqS|?܇qkR?IrEPdLV<H&)MwF?S|q3c
+ '
80cjcܹl*W i˙6ߊO,'o&,qI0_c&	w ZdpyZؖMmUw_k:vMk
+[N.\βK9b rr+u}ω-gvU6Zb)zOÊÜի5|۩	eѲzW<T=j~~}`2d_L62i}d"=W6X,h̄cMa<f@茉٘bV(,
rXD@a"=ut`Ѕus--{۬mޮPp`Wxt
+ <34o;ڠgBG.h.n.sii
O]{) ;p{boUUyeVv;O2G{1ƯfY
Cv!ƘJΙ*QOcn9OV`<\K(t]08{*{6;Zs'!lM&ۮ5ZeAe
e@Ya/ (;\pδ@-9n<e(jDz{XKpj$0Qexf|%X|Z1˞DZ|&#:Vp`F&t}7A$ ^I;C= LS_-$.I;a×ލPdKKَYOZCBh͜imuՎhuXakDeKeg痕MUʩa`)J5gGnΧ<ʈdrD*MV
+=|*o$tqw^ڢ}xZ[WJ;JL?Uj|QQQ#,35bj-:MdAY=ӱeK=J׿l}u`a8vo.= (:\;x7#m+ u+YcdBY$TW"CLY/ZG|@GL#LqEUI0UI=&Glۓn{IZ(Bb6[BkseNOeruxJSbU˖Ok:BmдhWڥuOO-Q	I7N[(~Z,(N+Ua|yjpHww[s+g5wқ?mH$0DקM{}zzɧ;;d&FM:q::CDM)`Ch.{>Dd
+:.Tf6e2 AH#ɨLpZ|YdW_Ri*!a⬰sOӕuzrhЕóU壼xlOF6lA02rً -/{M'y9'B!?8gSף$0Y1JjU
oZOw}=>{eqj(	ϜKPc͛oHE=hk Nry=ΨtBN7{<c^}z_f,Hy>Ny$3}fkzϖ_%K};PfLhݏM
+5Zt!H4e-ׁ %NXa%ZcWĿf-|`K(Lp_WV񗠐+R'Bp)v/rÞl8')=
 M>p.=06Li]Pzqp6r
^z#HP~G`ҩGן8Ri/Xg~aObLl9
+$عӓǗ8)KS]{VxΔ⇏'/|ൢ:Թsg'svγem{߼ Rms>xۇ!x=>|g^̌~(\i6P+I-r\0|l1|AcY6 g;,b*xԁ˃P9Y|"9$HVj#ֱB8f':K#eP$g&$h^hHp #tg0Db
+B+*,[Y<f[3*K	޹2ѕ:M+nJmn>dزRϰx˷u&
AdWЅsqp>(A=s܆.7l^VpI&xçWTrJ
+r0o_nRAFo^q2o
佢Y]`tՊpԩ|`Ix`JJNF:%lAB}p.R-ꑤ+Tǂ!4P LI^.)(
-%_zW*`I:_UbuwwY:u*o8,0r_2^Q@?nu)hҰٸ[Rl\jtu:]2fYΖ듩ot
+So渧١SmW<g^U`47md/Ջlx(HD<&D5H?ayxYyfnobd+>qN& kVsNte_jrO8N cmH擅abG	r$hw5	6zM	u\X[t}۾%v)+f?abW`lqb=bwξLa*lYTvc|kĻR]#W3{h1J%H!!WchY6A3V0{I`! =\L<QCŰYD,E(qc߱FKJ2ϔc1CM
+ga\~TwhE@s߆3H"3$,4fX,I
+\hf^\xjcggM5fzHZٳ4zm9qݰes1uOzshe@X?Yrxv|zW7,>FӻoN*	+{0 	o.Z[PTUOLfJԸ%XH؈d"7ֱkLǨ2fex~qC3?Q>aqáҒ0+?ޜ^2SkX=Ө9po()m`
+-9WJĮ҆R!!+[
gwz6_JJe&}Cz41͞4N(/A%$$>LTe9T('w H0nX)BXNbtXFMy4ѲY0jlP#E*)c? Y"(hAZ	b.ZɐhƗ2I%7;)&4^IL<~iBr<ΏldhIKH3UM2elx)Ӣez?*g A2$U~>"pGIӜ4g,
+DJf2ךKhXTCR3Գ7++*[i1@ ( 1
+zxT!&^Z0FUHW/̶@R#`37@QlQ)e3 ` аJY0Wa*T,Pev[M
+z[!8e2̦3
2_Lnr3Pư?1z唗h!F#Q>2J
+e&u~:/}') i
~ `e֖
+cJ5 2VC
+@	FƍfY-{P\]`-Jl0X6)(;!$VV 
Jbj#^j^/YMҼQyr>,>4ktHP)w
+-4yQP,/olNQZ]`PQVidbXV@sCު9J/WN9hlkgd\4u9fTvPU
,2)h^f j]2U
+P(jYE 
+B+C9e.F`0: jS0
+Ȳ怶V54gkV( \`W˥
+]Wmr
+Z¶VK!vM[E*X3Jq U9 2 ~erѰ2U`N<YfQ3,fԌG*p hРf6,KT)B(ycdiDfUU6A!en--+2W,ª7b
6Y~~	:J޽mSK*gA
JB6]gS鳡bTY3Ԯӡe̱HSUT{1W1<C[$a4a9</c܎v!w	T9KlW~^=F[x, o<C)7%[3ih}H
+c=lTNy`~|4wUsUGuM8,[vkwV?yeˏf>k~}Z$z?~mĥ
9>7apD8
+y#U7a=8=E&(X??&|Kjz`[:YP)m++jiKnm
Zpx15YYRUX/6pt_š;2;;2qz0ZeaW
߬5"rwC黮9A~Ӏ}n>iG;DU6ć4Sm$)kc*B̳2%v N `HS줭e5`9H7̎*B.v9]9;̼_Y^У=v]n_	[Rp|.k0FBt8y/oS2	ޏ
+Ŷ^"/47 fbC	:$Qb#s,Eɲ}&L|ƐTǅΰxj$ghX(RoA{%<nIكoZ)}#Hnl^jJzo_[Z@:pҚB+Hn,&taW5@[3$[r8gTMGMeeCIn(*N[`偁~h>:/ioj,;D"W[o((Zh7Å=t )x<eGJQQ]=WM2Fvv7%gh@j4رP-6nXƌ-'%έ3Zq뛟y
+i2z]N+ҭ|L|WӈVc
+?:	)ǀI}Dul^u|-S*~ѣJ:VKgŗYoՙu/ً(P*5<+ᶌL1w9EndMn0Ugs,^qgUr~A[>`~_
+nX^#ŮyIaTN\
+$N	"<D
+!3'G
b?Ų XYZEx8HQaE°d! dvzWa5SZ І$ȌcBZ8F9&Tcvqz:s9\^|`kB ϲb9B!} ,((=F#.ϱcddi.!~x2ig  Z豲 i4[L+}"4Hj$uU& 2n+hMc$*XC.K<-XY
.CWVE$8BYFvVZqd*M{eft%WYV/7VҢ
+%֠
ϺFL/3h強)P ʌJUo\EFY]icXZmZ<BXoZ&c)j* +fV& yU
K+X h^4*;jU/.d+zUh)$qzv=$^D]zdnMgdDPK;Uk h-;c<u/q*vЉu]NߌcP/n%:63ΝrF[Zٺ⵾*q@9'b  κbZH7],5iu2CVT׮l۹&K-(cƥ[%*f\R0E*8:vܪqJҲ
=~SWt>st檶6~b$dVZ5XؼCUU	>塹Gn-f5{;vX۴(/sT픂0:Ekm'yBC̙<~Z5?}{ɷ\-(:3־?.?~k-8:n2ŞdXBcqUFq=Z uN8ͺ@,fʟѢenD'K{voG_v(ٽt]sm'e/\11ZQS
Fl2#/I[[6jhzR%ؽ*𓎝nZ){<嚲Y{T} 4
5vL/0͕:y2Yۮlw,_`zLcW9Ks-.jt]YAXD_RCH█$_x`_e7bVNٹPIoG'=sp,-hv/jG0\ںp<YӆLͤM1)hR"TTIA8U 8ױ̦ĦI?qGiM1+)3;"h,8rN%h6"h¹FzYRg±|8+}h|;L8{ɩ03Q}J(*$$"<R,ZhDK\qBԉ-
QT=N|緉ڏS{u#F_dR,(.t&=mCG|+P8(i{gߞ|=VigpɤO#'
+ql-5r"<aOS+β"s4q;orlqTQVtm=c羷er_BO~[eV?SQpqJ52R,lx]
+ǚ	CʜdO1ߢeJIvkA[g3!Gay-\dJ}"*:WdxUلh aјj_ٔ	ߑ
+rVg-J Y H=p=yҩ3r"-*-@ƾ먵xq]͂#h=2΋TT>'a=A;Ksusq&,fYEe畗LQ,lkZDΗqоgU	/7j;@"Qڠj6"̴.R/h37;\?ECdՊ-`=/fHd"~UdEBdУP=2G8TB<4~ٴ`Ճ5|\b.~s3^vۦ憮xQDbE]&sâ7mM3<cmFto?`?3{{.u*H ]4{lc#qƎ\;8NILvOpӶyqrArt<gn)Ȼ5!iJ\P1lO:"@q
+_2nC߁38H5TJ$IblZ]ݴ*sa:.MdKh[!(|5뚜9	
!CfIRB./
ڭYl0۩~YDRK)+X
+H 	j}
=Iޠ/NޛEIL,BJ,/Րrq8nXoVjv}Zëy:	Qv+e炑/]sfQJ7 ٰi\)o=YEm`hjǎQ%!0tc<:'!}o? R>TRr'Py5'N<5{DBi?^+a=?eN=~ǠwD_OP
'h`:P13諏5?շkgp(v?\lA떍ltY߯-pRRAX}.36;t/ݛv;S IS8B?ငB)Y,>a>wTL	'o:JgMDwUX
ѝĹd'>$3?C1zXm*113=I-ԔCLӫayyb,zdbq6
G9joxo6$
+yitzpM׋:-'B
+>HA"l\M'H TչIU}hRy$f9]k
+rG&U
+|~xh߬_V_|gSN	("	٪i⺅l%E6'0kL{8A&u_L3ӄNd&k<?5!Czb>3Z>Bbz^2g[5$0[nr!ɮ	&Y֏㛷 ]X`Кw^"I+umv<3f,Kq5t
]Tw&t[>b舫
+:ٵ|ݝ7xNE\T )1EѠ4O"(sP¦	x3-b:p3>0ш?VTZ&IFj%zI5=:Q5ĚKpLGk^&}^2&_I1 ˋ/Y'RZH%> ,,nwI=?PkEY#z
+45vW^ّeՔ=u
q|+౉B;y3D)L&v 'J>h*Ѻ>s}*^*yLbl9d>q/1~/wPiSybW^ne{X z>|S|O$'G]P \97TۘoCYy9}'iͪqETV_gG\xLDll@]F
+l,@St7uY-nʽU`ą|1{ucnXsyp_bs\ұlBn̝s)vҢIz9ӟcNYLrTeG΀8~`#myХN?9tnEE.\p7wE#gN=U蛜|ĕ"t;ۛNI[`/89iKr'aI(+8W$MJ1=ZNY<Vh'X_@wBc30=AnӄKec8o)iǀ:o<$&/ZDQv f9]r@!#? 0r펜>cן]z×6?y"Qu)m>O!եF@b|n+"Io~sqo_9}Vƽq
=?O/(Qwј1!WsED5a &i/o$A8!26q愚6'
+P!U05hƫFԥ"xA
	g:T
xhL>ScF
Kï>63rHJ{`0I87%  N}[BHÊ}U֙K#rC0v1K46vΪ<
+\:/c0-*Vǩ%rNpPa6Pl*LJӏyVڧȕr0墨4OG:ٝf+\{IU*Z8Jʢglu!y?gk$Ѕ-r%j32
pN0yl5-OȵfmIn00%&LSTr@t){iEٲZw'p*4dR3f@c+ @S!sobcx)e|Sl+.Boi QH9U\aezH "cߔӊ6٥!zD XW
+(T8I8h#H$ED/Mu]4Cf~'tDoceyײMIVp@?-=6Ss,e:3eZ5R9+7.9Imۇ[X~g}cUlmM_a[Tsxg!nUyMeyG&B^mc r4sʭj\g1H9T1rFBCZ0JPhwa nĠmMP5zނ5oB͂w_:<K1~MAg]e2tՆ{X[.JvQk|jM1o$LNд
+^Ms $
+D <Mhl'̄ +n"q L0bСXM}LA>WK^3~VO\n}F_pw>WCkQҳ׌n^TbPƵs&-3[Ag42nbby5͞dkKcUW ԓ'6%O\jl(<gMȜ]G+3яg7Uo>k3%bdQ)lju%u;g
+
+Bi(;PbL?Ș(@UKJS)tkf:]3`uG0~p-a%:A*	͛L f!/k`GX7-i1nRt46E/g$(/u
+a mu֒RQIsʠe3@{E~^Ot3GgyV	T [ͻ=ڿʥiu5;Np*(jk
+ ^9dcpv
d 3uxBJt,1:Jh}-@i262!)Ԩ%m0dJ9H?Ip;/Z	NS7Ҫl+dx@0:$ߪ d2 !jEh`_܏@l'.QwRS;P`!	@7/Buy^@gM{q＾ɥavwY< .Mso\'¥a3ˀbA ; UAMt%TFTC9`1Q MCL";vq\
+4gD
snC<w C*@OPA)aMh7<GQ >	ɳZ?Jv ;hGT{B)Aq㣏pE)HF`$@2'a|>/ bJ@$c*K ZWղ[/Djm(U	oM]n×5uǗZ5.XyI+93ZG5ni!&\9maxSDǪ;V/y*k1'Xum~eMq؁sVw4X&,oț2w˦CS{W;_*h/L}{ߞ鷅r:6T\acS,)Jtc=w:G:a){$!|:jAJW飩pPRYJ]'KE%-Yl@xdΡ8y/BczUd^0 [
+/>@aPFA<1|5&TЃ֤%YL#kA/tCKК;В~:]ړjIY[=Ip>d-yR<HJ[=HPcC (x1C=LO$V<Oyī7}pkY{:4`߸0h8[{`mCαWoيR雙ףz>x2^?+>RZ6rg^'G	vf^;Q7tџk$`%䅝'@6h_S̉e<9$CDG><pΝ@=5j}S=MC\zUaKijгKξ//%dIY{=DdKd>|֕yk?cڇaܯ"T9F0P> !x\	*=\ʵ׾޾k>b4djCȆ<q#{ps[>i>Ye"X&_{晷vIrZZnGZ9p##G6>~@n:DpE{
+Hy|קj [	
+&qs`ULG NMj[ۄ0YֳtiҮ,l-)\cD:MNO2F9ĉ*W?/o>cv:gˋ|5!\3Ğ'ލzflYwR~yB0fLv-@x"͓ :≦$K$a8%ADcD7h Ǿȼ-5S4rR_5qe1o-	CA5t-ž"K^aRUFlФ}!:+!]gre{i"hġ;2L[N_sf8Xݯ5#5蚧`@)G/=6k2P/F
c8^]HR*y[	EHn e1ߨin?=Du䭛C,M,$Ww/YGCZeci456\Ǥ-`)43</M[(0"5Sr)\7NFR2F
+÷1=Wfߖ{&˚墯RN;cPS[&J$'J`*(Kh&Yl(0rR'ՏG6QL#{2hC [Q/(b`ErLv`WWIP=h ν~y/<\A $|4<AYB*S^@iFpv=ݘc7Y[^^;}_ݰg\6շ y;ۭpn{ ȟm䝹_5ߘ/r
N}yظ=G*
/.w4P̞p j7	%L|q4%`Fl:
+-pA>vI7B_@!lr.sᱧÿkdRxRitj)Fc~f^̏ H/[V2c(nFҶm0;
+Ao!8NrP,(=m>!=	s29@6%.V&d	<䪉犅c> ,u$S*LVrJT+UB"S+d3P
u:gAlIժCfT*e7%2A&QMCQi!f|2+8R4fqD%)/i4fZ5iR	&zH$J()2J<pbe+*j<rU	جT+I?
>rN!T`AjL!%k|U7ex`~
++پTTOʸ>Ȑ	.D[z}'U߁wxE|c4~NT~rZ%@
+څ+ZsVTe+zZ#X>{P^ttoAҧUf hO੆Wc j1Z<8
tF1ƌGgT=" gPçA{<e|d<vVR)
+<'|<] Nķ@
\	g9(#Vج+ W0e@bƓ\BGƂ!G!r	AYwВSnVFDU.MAV_Ҫ!]V7ר,3ɣ2Xh[T*J+^2::lҨJ=ĶD.ڲH0[~尣]T2i=CKasq&]{,4/@8z:o5B	Y%C!8z]N# kp,_8fq `p?ш_mx#/ƭuh]N·[~6:hЀS5wc%eA0fwSVj2d{Gfɠ'-1m䯫?1KN"n#qZlN9@/٬_,Go'ͳ%;#QkA4<ܯhOͻ㥌ḓ͟GyWA/m`NR)|:2b/94M%]7הKݿwj̩k(nCE~匣f*R_zɦGGL\ZB.!ڿC7A5H1# : X,q>%a|)H~tXT
+Qp|vJS&q~ƩFۭ#.i׀TʆlAߪj4~`9!'`ڐf
+0Y HAHΉ)TB-ਛߴI7Y݌:֨n;VBLRS$qyW|&d94Jt%ƘV0o1C2CLHqzje4+i	Gzid_|ѩk>B\^R rEN~Uͪ%+ U08ZM=1-&x,Q-}1)6Ըj.LGTx4j2_"A|ow;|%4cE1Y$9vL6B3%^  jHwgNmڹ3wmuwq[G<SY+jH,۪/@j/Ŗ]WEoC_}CAX'zn25{خSFω󚄒c.J9R+*.&B2h<
`Dg8#:N@GУ>KGq[thՠ-}QJAG}}{tpX7m{:e=ؤl}	@Qݐ ۜ@^s6f0Y.O
+u>O.$"@34
~LpÌ+Β.;
}	@MTZ9u8=rXn_k5Dkk,oDmKky%NS򺖒ںak
+~'@;=.㷢oXWvL7Sc
9

9׮^c֟LEˆiϷ@OBy!?34$B-ϊ~dY39ss؋\=ϝ9.X֋	d3z!.%"Kgx{ۉ6H)9&?P7!l07Y)za;W`y壞l}n(	5nH1L"bO66Ĭ$.hd
+`/0󉚊]R8/@NzaC#sZڐCcW9j՜P!OfLNw{
#La&+8[Rsp~{qCnhcgw:<ZY9	i:mt˲.cHmY-XtNgMǒnG_~U:vz"ͳlnBi4"
$7%uT5Z@n 5~)ǌAm,5bD(0iIwD0DI$7fX((^PPth<5xz[yμjiMV;}|Z{k}V]dbIQWٱzO<u*-+WqԖA_<hM#NUf*CJk@uGt*A葋Yu7G:Ge(񨧴1cB/}oJrL]e8#gLN__ok($MjA\19wz{3}/uSR阽pGi'wQ@h7|j18K-'ڍG#tlJ$~{#A'}BXp#8Vuؘ1Ec>F8j"_)l4,sk?x,R9fUE^0{i%dwKh+ipڅ|O6Z994D/
-4b$ѣKec"s4!f}I5I5-jO-fsZ5v4X܅+i 
+"#/P
x:.U
+r%h: t55j=^A59FXFo ѪE}( ntјW@'p8'j$t淸wr߾ʊW?Wk}84fLS>3dݢkNyiNj]qJ!gݒKՔGJVV^Qn1g&=sW썏;lt,CoY7Qd^`,wXa3^τM~!W0PLKܗ]Q;bPˀƓ=|CMk 7<tw8}fRo7r
+8F"pLU1%I
+\pk<L+f(W`n^^F1j.>%Yo4-z$Ғ:>Ulyrҁ?CR_};ڎ,&6|G7Wv
t,-j6̨2esad?x zF3	yB,%nN10f(,YDʸmqoɐ=u+FiZjRإW۶2u ֱ!̨3* [#RȰǖHj4N_êQ!,Zb~X6`{ZSj[Y0w#%J`.n9E2UoY 5x rBҊiCv=#^՘|N/`zym{,O8Ȑ zG4X" VZM![WM[a{~=XLHJݍ>؊흲PŇ@	ʕm no{yg$EG^ݑ0Ft@[3MWn}'隕oۿY -70@P	GYu
+FVx3}ZW{K4Jc]3y`~:;ӽ2?\iyOO<Mwe	4퓤|O=?cF/<^i5pcϛwJ9ˉ|mԔQX;L$=߁+ ֽ>:pze!W5Zn;<}ՈW==g+i! p>ݯwRPBes*JSwi
+]B{؏	oZ6>YY
+g.|?9mh	$AN J4pxKpDd	0#ZF<d.KB%Jv=P+z Pғ* d$l+Ƚ'lug5J2Meb)8Vsw-6_ӏZZrV-)˶]\n\
.7FnDwt8.rryMO#ސE"gB^ejkTдW9t VnojN-Ou,gSmO)hBD^_gD[XllmKv1~~3	$VEL[T3JYXvkVeA5G	 oO,3MaO7bL_w.GRnwZ̹'%T:D:u.'OA wAJ9/Qcb;㋞hTh%Y
	 : 3ىŜgz=)O܀6Ls #AB0g"H)MGǐ1GMJ2jQ_cR4I?3cKǍ¯F҇6G_
KJ6Ѫk7<p5e>ti-7R`u[WS-8j(@t#	F@f8E	{
xa#9X"DLx}W?CA.bΔm8Pd]p8On9zQVx>9`X[|o8#Wd2M%OaQt2l,K YzRT2ƈAwxHΆGm*6&o}g p	)O	<J|FҶe _X/qb̛!3HHO	LD
{f}Us/c诱/^^լ=.x?\q5hozI]=33^F׷DOOyukqH(4)W]tM0	a:B'CM>JXF f
+bt
8
+WH5 L^49#a7WThs*P
GwDu(e<77QbMq	J%LJW2<(oRƞ+1
+B\S'xD~	X!bs@mA)Ew(p}&ECLo秅R\s:	{R((E2sN*;;G4TP_̀%9r<@܎*yoK>;Lw ZJ/";񥟂\'3R傧kb1e)f׋w	:F$̙ߨKM܍G6
]7nߵ3wȝ4!:16%-fk
谪֞5n圶1z8mv3k9!ZKOg>lЎWjըo;abzk+CB[m?-Qhn˞G
+KA#RX)/;
+JPNǆΚ54ݬp^dK*F> Gİ<	;wόb
=hB
#䗖"~ӧ@m|w}&*XmL2KA%rhH`qQ _(HBp'_P('l+b4Xe(~֧b Tbž.^x%+TO72[2hP|E`իmRG(/EI٠<,&کA/[@rK#2Ghݍ=UT69GcT͏4
+<QBHˣ
թr
j[c	eЍc|IO~AޢBL{$~`/sR>)Y
+O'@OU ypC!"O,0t	`IP:M)W1=Tc	Eg1eGSuԀ\^%^I_L2/͡T7F`,3j3*+QL.#k!gΥ3K;/[6n8}
+?ލ3ʡn|+XR`V^P<6RBOd
2O7deG^J:n\\ҹvm+qFv7H'_{IRh	v3`T
5IMSy:<JiO76O;H{0}RÉ~xU8!Dh"=eN7cQHz Ag16O
+'E)pNϊY\k;4:MrrWHaz|@FPdS>y	([nf i Roy $ 1ZhO-f?dV̢ 4ôPҫfH@|'X4)nqKO.4 ͡S5Hh@W<2'a@4cbCsng(*pOT.^pEW>#K`+x'X0%aosO/gC
U_Vq0!:6Wf	Wh\;ƛ]8%tV~4Ė9saqѐ>*O*3ͯ
gww֜;}CGc͚mn]$ٷeO9Ե6|VW{ϓ[[ZU {7$۽hKFJY0ER-8\&,GI|Q
+V*T('s0HGQ9zJ]B3JZyzs" 4l^ `t\r ]EИFy5yq
M՚~x1RЕ2y<y|j'pSzܬ<koteyy^қݦf3Xa\hچST;LnQ>N@2x 0>//6kڗ|!G2x|\BYDn f7TBoAQGd z._
I"- ygq{kĹ
$ɂQ`CQpB:qhP8f5o,o%C,)T ;]\|@j2]x9MY2](2JF>JiSEn1m2}J"Ǘ}JRLFi5ۭFaʏ5^dTL0̎h!-äAjάӕҼјo.͍f;M<7E-Ç?N!mM~`޼HQ'd\40ߌÑ;'|?:߽2^*TlYP.YL)uR)gX(9ʔ
+]r<ÆfɤK$rB,<cԉ\WU!*iToifIӖ Qϙ4|:͛±6+&yъΞDTEojʔnXh<dDYQci<j)u)uu 
+
B%~glFKY_
+'$t*A֛銱:5PBsnMDh?b?2Rr%_%yCͩ3ڧLiίtւdviovY^  "sN^S4	L⚚`8<{VscAxl7o/5uo/_cnKuZ&~&Z[OVcc{V\<	=
+zh$¾lJ4ydUvk6RTl5538ԄtMQ@:O
+Ɯ<v6GѶGAei[[)>@? ՘Wt`99vj7`A
FQ|4!昹$x≍u<}!x]Ԝ 5
pqs_fȍoJs4f&0i'|O%ĸ>T?n;!|-iFr
΅gr5ȫDV{!Lvm&AX;0A+ѨwQҟ'<új
"!Nl|XxjQ#'sD.Lu&o^nm\ѽhV_sXBlنg)ttwfbk~:r`6'Gˬֿ{;j=f>5$|8}MnKn&z8aF/K67|D	c2]|ɪxXT>mZK1yC1}w/6lz#ޒ~_qKKK=@noZ/o=qVeᛶp9R'. }Y{{q"޶Jϐ
+|.(D_*+'\.?hu?N'᪪@=ƬTXUU^?:5/p9)2eeU3ұsX&:tq,8qd>IMLO-Ow&bLU+PNU+zܪRVpD#uW_vU\?I?NƧb`|*0gr$F22{9K8BT(GK&7X,YX3.A	5 $@k3W ^J G ~F#|
8}#@0C
+fS~@*i1@=P&z4&)j0trGQ
sRUcuYi(tp:6V47T2?m	^MW5+u<<53	Ta?e}U8z|c;*b<#rN`%rOxFA)\&?W+cᲭJf.Q%@Z!+3Ǚ-dd`-Pj(^'`uu5u5F}qa̲e& ihQTbO(}\D
el!C>$UBџafJǬw:c$Y:}}gkAQm}]tv(b{@WUWjTYrRm޽pQ~)nByuuCE݋kfVh˚r
f'x>7vH';3퓊ZʤydCYfoegߥXE^^MgJQ6уO++)-L_bݧ(/'ϖ$.KU&³<_hJ}⾑P8'Gz3i gb#%X&0('~/^f/1U}R{ VΚD@Crt<G:U>}FZQ*]L܆s}%-`
+vlIRnG
+ݸYޜ
D7MqѶ\=Lh#;7/[G-]zcĪKH/ytۤZ\GbET|fڂ(JXMOTtV| M
ȡD=PKqC#~ H{-n!RQNE=/zuAX-6M#=PKCJ=82rʑc4 DI('o`m~O:"̆aז W#gwjWiw4\#~I0Җ͛̞=4Vۘ[}/4r2KZ&jUay(xř-= kD/f^1IYܩ+ԕ̑B;TuE6rͺiUv%͗\3\sS
+lɷ>o^
+ cWRaYquEz_Y6i@3o?0O-XW%ViQbHݸ<p3ԔK%JHhl@ZՆMt*Jld%(7֡qq"Y4ۉ'6:!!`49r6ثgd* '|8EMJIeSI@
+is:tR(ۛ׃9avƷGq=&G4ap7GGM]щpCEߓG}KY^5VkYs$Ԥƚq/plcjeII~y\l¨Q!"a
+!ؕ0.!lQQՉ<QÕۘww]Fsu9]B+D}Bd
+"?Bŗ,HO
+dǒ3pu.#)"rq-vn9V+UpܑI!261r6۱do	m9<̳d˃[cD,%HF`vO u*zaO/qKR?-^)L^l=owyhv͂Cim<,X?m4'nd #0Y*娐vmr<@>Aݽp	juFZ/$j5R2!}?G1nBA<aF啄G@vYPTS&NSDl J$>4s@@JU!'TmkYtv?07?<>J[뿿b{9+G,t\\6(M.fan.n3ۮOz׳9F^|)5^? 澲obzڌ˖<#2mίۨ-:=^lƺր<J|&LBDH< h`I✟8~O}I!gHc=NG`dFsYhH{j̤>9ɠY6~Cs(LDiKs/urUU
+/hMqӰvsJ5l[x]Y/ybXEv{)B"[(zjQO^ A{3L*_*hA[mX}ի9O_6YTFԅCF\.dG	(O̀=fy3k̑P^F>I4
+-ђbx8M?Yx
+">!|~S&ʄZ4O>ڡ[ߺ۟ԗ eMkd[+MO@
+*)joE}wC wl+G@TXbc ՘u}t|痣kv{^ g.Q+yq i5P{ x<XL-l	='`Qz~(Z"iy}bOJTq~-#UCYoe.&
+aH>R8MC:[01l(fN\pQ;wbÇRNXԶrU*%W^
+?%yaYĘzBI=&(ʍไ}<O#?|răf$o87#--7͟4݊h1:f̨;g?5ꋌ}'z-@n/@[F,|vW
+XߴYOdN=s92;	-8&{d]mX
+F"T8'FI|Wm3ea1͛լMm(Cزw5.:UnME}Vڜ
+9
[nMw*E[P*sƎtj9V84sL#w{JJѓ몜ٷwmyN%큦΃UA{/^/e	#xoI4
+96
`{-mYӒqtsvC
`nQ8`]0RprR	o@Nv`דT)O\okvUӀ7vL?h7.9saPz^̢2:6*.S :x1eV?cN<@6`("$~7L'WMݛo;5RVEjxh
+_c#$=*N|ǤoN_;$.WDoe-:<쁞dڕECW_؛/WIzXShT߾m(羏dL̄c23	d $@ 9n!(`VDw]/z +.B2SgI`LwWWWwWUWz{\V{VžAVb\pd0DM8p'$C$'`m([ѷ4'mb#lb3*$HK|Iy<nwլ8ygZf6Kͨ5LoU^Đ@8.qFg@
AdJIOǻ4d
+lIOi	TBun
+Sb>dCJ3+li|i˖&ibC@|]:.
+[L_T}woIuL4iAeBBXZ
/?th9۶xz`}cHsta%eF33yL3~f3<<i!i95sV!f&_tH&5²"BD$
ax
+AHaqNbxc1 @0>. B^[L2x,`5@ԃXRj<æOT-j֕"NSٳ4ysZzp6X+ԨlDEl}NtA^'`R\Xg3GG`
+CfA[9WvѻNxҧl>}Ɲ9.aWhc>@_5;j3#^A0v q-ٿSp)CdF|xF*8Fё"U\Q&3L#Ndi<4aJq3`گe9GB
&.ImMf Ggh{:'9
NTՠO^=*e (P);@߯>+Cށsћk/>[:!
+1p~]މ9r#YQ^B	.CAW<IYhza}/p=t_*8zkm%x#oHw~w#<cX`/>Mg	OLLH"Яshzo$1iZ{sᤊfD@FQx,7'l޻ 9mjކ2ЉǾj	jxv3qY+QX\u
iAs	E7^x
+I.01ۉMĳdy@7YakN}j~o; ۺV?fo>zmώ?uw϶.^}nٹOq+;eoBweܹUa۶
yVQ["?}!&rλAPPQ(8h;8]qcY}fgnr^?KAf3\$!4}kO=Esix7?W_=bw]KgF#sB"ڶ~LԓRg SƔ3UL-SLof&1S~Y¬z-` DD,EHވˠ
u)OZ>INpZfu	Ԇ<gG7[!%LJL?qtNUjh2fٚs4sV1Z `\Lp%vؒc[ֽ⺖^@k{ZS2BPPlN,Mm5+3B؎U41;%KK,p>'TsL9}dTqz×Y2<3B[pGV"eܜ+hJ-}U('| ,oc5\,a8<Ҿ;?H;h̿Q~ee>x&/g+rm?Iؼh?Wq,2!h6_`	`"{}R	7$5"GB\!}Ϟx僣Gf|4Kզ3k7~]7uSltL;X1{vqĕ/~ss+7nX91C^/2&uJ`n:c>ֱfNmF0#&!m@]kM%~ˉ.3z32PU~<??BU82c_"i vIսߵv~>}$2V
'T wa{>blbRBF\[Hj
ǆpP4O7<)3?Jlm;Pfo3.]4 W3]u
;\@iOyمk0
(Oe*-d![\27<\΃`RlQjgc8i
\ƣvn5FhX wpfQ>1 ܂}.+CYB
+_㱨yi4^
+ӻhOwD:,
u?
+;z%0 fȑFQpH>#?)U}v4".Eڌ
Oׁ0 f8Ց#
a} o˭-{=8'YExDV0a5i wj,`,Z*.w=6B+[jhPLAT ]5~pSH` 8UH#'~RX%RU W)
+RY:W
+
+<v2|#?4flϷٳju.}8-hS89(5@hBN/csHRT35J8`đNXYmwu[;oj+٥e9s9e#Xz/7;d2L0L,RԐXx	.m8D"kǅU5'ku*vdҘY?Z>|PӭkLm8!ed+2l,s8p!m&%{%Z[.^ oñc|Hg (h]y_y[1K+0Gm[ZpeBsL{&b">·cw8	F5wa&J6jNq!M53dEUI^^|#:~8zA<ϴm* pZ[@]ךsyA+V͐p@$PDQU,,YY4<RGR,ZNL%Npv8""	s+FbOě:OG@d%dUs
+P96C_m`|M4z蝅](uސRt,^nacVVu2ŞxO3Ljlv;~3B	i&Tw+uᬬp]Q5H4#V% a9}Y3A.w_Tl|!s$ʈ-mp[JJ*q#@wӥNgCJ^%z=}6Rot!@5~1oozP˚	{?{'òwkP'ZJd
]Fڒ{ebjr>#].]rѾMoUh*xq)QٱA) IdqW@_+/Gwt&i^WmyҌrARyw!7<NjyCҭ4!q`tTf2ט=y1H=бB֞
+bpQ>D!nҿbӞknTޢ/cmRc
n,&wn\@܈t{O\z ҫ;G=o
+]R`B{V+5%3eVy,W0玉___i,i4Mym|͛0t͚jr)e*zf$]1CɍHBif hbʐxtD&8L,["AuߝD1Ӌ٧:{x0Ҷd֞=Б^sŊ;a%R{7G=H,7,1ocփףЏexX!4ÇkPiC8XkWeL#36g	#H>6$.=̞P2*
+6-֘Yt!|ۀGKk4g^x]R]ؼ7W;i$bG?ƿhӃ,Pd3H
W @)M&+f||\2+6~ɩL-qIxZ2lJʝjT\N\ou8u̿EK*iۣ^ȣ%iqB;󟽼lu}v;,@r;L,ge/eb㣧=)_hs0Up>
+d8WOOfW8h{,P:D({)t)K
+=GP?G?[&a"tb~z\n'ms|vX?k?q\43&#>
+tdA](gw=><
+BY"hD1\XⅫݥaW>yyAҦ@D+~{14 ٣4Fpw%B\'K	CDnlXT,M/>GyI.ǉ;Ep⅗D*ǡ# ~ȗķDn\߆ȇD!3v]9/TA=Lug*Jbz'&O83t5gŠ]|֊ īx|`pҲa!QB u=*.v޶%[<s8>R8*Fֺ/cOc\L]<o
d%83uxb_uE]p
+M)zc7~k~=M,͜SV4qáɕEi?{}j3Cx}j{flDM/Z74\ݕ;=wd]1/ߗ9`j#*;**GlN'Pf	6DAaD>T+Q, &
+!>FT	=m}:emoA)JkygM\Ӽ3f<qdXN\y
+]~ׇД-Wdܑ
Tl7V:aU[S\օ>}塳[CYtɛ!d%&b؋kXBC.SQe&66v$2Dl
+ !(ى2uG=K,gGKp@M&I	u@nJxbC4S)	>&BUʀZ	h'1{C	`jfѐ`,7?Í
?+i8?zJ)e3֕?]SCIB7Z-T>5@D%4T*!{^y	jbR櫻_ɶTjի2
+IWL=dQ=`!=#*o{]oI|;I?VD` eDU'L4=GF
`$x|t`BN@01?STS,2d&Ww#]`j.&u#gjmmC3^?ԅ7mm` b$aP-mcpp5.B9B1OC?U:˯OxZsgY/:\OƴHˋ)MvbJG#L=}B7~?Lz?/ѯh8"hX0[;V:V,'m$ԯsETX9~kYLl&	ztsR)/T[?|2O;-N;wΫgEe{^]oL9wHrKaqC.`jLH7 0L
+8>_TCv<<i6HB4LAN$b`4Sx˕%<*
 397uM!/篖@|X#kM#CY oI6B@<9q,uW0L`"ڦ8$B2
+A&3h	#ٓIO^=R?V\1EnE@bd#ِ/! 1oހ%qKi^"p`VyRīfĉbϛ E:T/܇y 3E|r,Y8%^BqݤTB0 "/Q|Pf5J= #pJ!5 4L5֙?dsavAb1>4gS7olnniX>~'5`B$X8{2h+ $U&6%eB`B&NO:Y(#h,5bQ$eY	|ZQaqӘSPQ 0,kq!}aA)j"G8mO8pL-j5M!,HnsT<[s&v5HÐQJu5'{Yϐﳦ:U@
+jǾ|,8w2e<9D܄)YV׾κ7 cieuk?9T+5ps8M!~yJN7`u5>]-ANX`L'7 FC#44JUkRj49jY&*O-ď[ձ1`V[<7%ǥUT.oϏv&j4?Uk139/пN"Ӣ+]4>;ʬTe\mTgHi꠼6ɭpT=g9$pБ\&d 6Eͪ/TRJfנtS4juzdMYr؇W?1E+`Qt,]W6}&#>ý*-WeW39XT4Þfn̑h3tUr.oz=zAj\.;xpR-1m9U
+vqpok~+RbQm{+TC* (9CJUET@f,JԧRed:mPk-W(F_,]T^e*',
+b iW̲P8xRz礯Mwwp^@X1P.yo _\w?O:8L$BÇ,ߴe-%S45m/_^P>054ЗffL4У}]j˒GA.i*u*_zE-#fί7޿t-#3,JCDKʤ,I% *H6x st"(t
+b
s=$Ӊ ӘOyX\tlÆ@		JH(zZ]ֻ2=5BZNAO׿Ϣg&5Im>C{`2ǆiyW6\p-&ź [}#&_?I<{6z&7a3&1-g#, ]4V*6ϳ+T]Wڪ'OՓCXhފ"V[^yJS\+Tp]V13 %WqvV蕅XS<E~X<m)?sg]^'9t.G"3~:	ԛ'z-7ZޑS*RT6o62x_u9|{7, vAxoJὮ-A|
Hams36H᣶h|5Eb푝;#4(Vgv!i!"ZRQBtc3.2̆h\Rq{tr&)( d63`qo(NFnpzWc@Om	ڂ""rC)K۳T=˦s%JK2ݎ/vpEfv2ZVRf¥1_E}B-,%GwKti#&^'yKDbqV+pLR*ܡ)~x$&14;T:x$04ߘ!*AНlMZy%C}인a/7eGīsEScq R_kHSJ`coZ̠]`o橣'M:W$<Z9DkTޜIx$"?\jQ,rVV,sh0>9`0<5}o?sz/L˛ڙlݘjVϣ2!Szyx7)vr`A	:ݷ_FcQ 4oVj d76-mj̖pkyV:fulUO
+ԘuG]g9@åYFaa\0aMڇqP/}=3G@qɥ^|W*
Ρw	V<?<(|+VaޒEۯo6w*bPu%V";)pNZkk"$GsCO+x\ߪn`ʙ"!8vItܻ$p	yBa\%ϫ+!:+DGfKIڰIϘv27A,F#;~4T6hP
hSV;Kw˂!sw+n,gVYPgvՇ<P@O/
+6}b#VujMIuBu΋6w
ݾd`dPb g\⌏Np\u&!/`; ?csmsk3GCy,7ͧV\0Z<z]|XQF~#Ytwå%(ףk33kKO/{.,n.fǌ.0Ҭ~>\T흜wlOwI"8<]cs<6]CPw0eěߋ*!PKbuo4[Xrs^nn%E}V(vZ]aZ]84{̸p}~-=V_7fvFqD&qS\]Jnܵ+p-d
x!zbꑛKXbhɑ=\諦;z=Vr[U𡪘TUVo3>nIsc,r|tat/:7"
+T(arl/pdڛ'2Ϗ$~GvV" R	_R
+ni
Li1v4o\-R-.#$ \-+UA2EX%ENcOWO	ꉚm>
+
|o%ms6k E+6b#վX3طט3@1<'ߞ6&sۦ$wA\4PdjMƕwu\E0ӈa̯D1K!wHqU$!2m2OwIT`	i	G^rfDsEGTZ*x9wL=ח{{eUF0I}j+zd2<wCuHou`TnOAOo"^VRSmE޶#}~.}}ݺ1ni=h:U18A%ⰬUbuWjpoUey@GW1{#9uۺfQ;ܒ@rbVGa+M\? qd$jLg[vk	r\,ys#46?>ml~ryNl]ҪFIۤدhjur&tp>L.LT[="
+dqGEIx\9zos}œӇϲ76_meU%3fzk:oiFӖ\mz*_ڛT%ޮYJi.&0V\ wYHIXWRHITF,GKX[BHf+֥roAcgnI})t_9J3.TȦ[7BOlڟؐ5/.='YhW	+'7<8keIj6>RSVǶ?x
+k
+z}%k]ɀ\vؖOj_ߍfCZ]P]=y
+F`b}
+M+@ƕ2.%F揖odKC.s>$tI)tucjW.:v1{<?
뉟!lD~@!"<kvSJKabHC7˧)(Y4(-crKDXH3?ہx<& ENJ(!L3i/.'cAx|hx}	

w֚
+'_X mI\5wwGLܒֽԋTNKr:6	D,Uk

TqJq(`""6kqxŹuN4LximѦb3n:LL^vC1}~6Y
jn;Wnɭ|SIuuvKϫU6l
	
|=
+ȱ>f<ptD10$o!ƨe,#V_f6W>%,h+,sJlyBeh!7jw~}_`T	W[RFF-tExcTCnSl
fzˉԹ0(m_n6ЇzfNeЫTS2jR|JM+c@ܬˆ=FEUqȌTz}J=OoӫyR따5S:\͞P+)iK]TW˘hg4-xYWOHQYL0^%L"	Y47zzpLjx(}}^-9{"7-{hA7X`9OC.:VGsMJ÷Lܕ%gDz J.w>5(.Ls./uUk
	NzhZ/k1܆iMCܵZBTVJT/|{}e~~(׏TqPrJF)0=]V f4pT;Tj_nPtoHQZ۩N	#,WB2Ȁa;!t&D`d'gƚ9hGф":DgDdϛ@!;"$8MA,!yC2z7]xhqmM2d]y-
Xp,cنWdqTÏ;oޠQyEg|ZfnU>>N|/Px/ѫZM%0kp9<=0@f8xC!'ĵBâE[qEK\ˁKgo8z;O!>:h;B\&5XW!uw㗍#퍗7EW*ׇ y{p2yE桍 ۥ(t|S,u˖{prL 3rFWj^|{3563=L颁SPF3s
%܎gq:ô( mA?9X	h׿8Uvw:ٔc2D?dLbo~6N"*;xc	=pa\O+`Iׯ8)xZ~VGji0}f9<S]OV~Ѧ[9jZj[N
+XNO
#2bGT|HxW%Z:#6LY2-2eF뿧l{|dM5'C<iRGc
+*MSc~4|D@y'(x[O0DAyx\;]$j?<N\21O}"<f|dBU골͗@Y('v~ @Et
+E~'Z>i,x@Li<C0K<I
-fB!nm$jpQ`Ip.B*
+FcL8;Dkwg~l6|9 A&|)5S@]ŎTKA4 [+b9fb6 NSKi1L>/@o_k>?T,	 E
tĐ)RLUm$l9,\$GfjN (k\tVI\	
E*D>!=O
+;yuFtJ1E-h>Hze6m¢
wOwfS9U!b@4H1p'g|ztqTqh
TtA*e\z$eчk~@g7`zd1
+Jn n]~BwAF%w6́nf?ߠa䵃}JAlcjՂR*\i"|mrGꈚ'Adu+%f.zHuS7Bo~2fmEWpk0b00t=䍾쌳^B߃)fҎG;Jxow'y͏͹T
+^nt}Q
%GM8S׮w节z
+">RO(X1!Xj^ f?>sՀc7?}P,V|4^Hje|fo\./铹w9z\34;ppe=	ԂIOjV7b1M)f ?%X
+Z&^͂^%ePfgԠC`¡hzs5qʋ]QDfH]˒6oEY|A
/ѐpx8"W3f
+x_~N\skz ],AWϢODA5h=3_B3"fDHc.<TRp}΃CC	p@yrKV;~=|wHo7k'8BMֶԮX8a؅:>M@?jp}wYr?c#G_'2_cVk3:?$XؙoorM_~BO3n%&{~ao]Bagn}$YL|lD!ĦόAuHJʘЅ(]h M1;Y';KFz%{&*$"qq>kcޟq,de'ke3ObΞ.qq{zs`iOͦ
ʦokj/A	>>w^r1ghhU=2]:pG.8oߔ
o&<5O!7v|YX>>3":N	
+KA}3Iz[\]vDlzh*˕Pw	PH/>K'؀QMV 2"[\., B񎙙_8ЮVw
+m[aʐ|w;뫖5C|x$\6tcx/;O[x4 Mͥz&]c)Eo~l O2x1y`{
+s&S0[8m0h j\2v`!+I`iQffaUEU&4gӈE@qZ#lʹۯOŉmMT>v\
+f)6f@uTO<&*[\j6`.A3dp&3g5KPuv6T1?XԬD1kTlo~ypSI*m>TNN/3xÚgTKX bj!Q'{P{Vlپ~vE;V=+1/G_sNJ5
ɦ7{AU$à
PT1a٤>2ܲgdW4Zn,XHBOfV(FolpԽn{R]t\[e@{d(#&
w)3N/}0ɲPDci^cI+7x|sQ',IetQ5&kΆ\#2ׁLCI>G!WMhw-j%;{?{ԏ"F)ٿƽD4&Q?HxDEg}1EnXk8&csLuen\Q
=ۄ	m
s]~v6cD{W_-ǎɢjQxfJ	.LR2xbV9j~elGLbWq:
s4SmVLY{*0kt#xZ")(c󕸶vKflNXA$
+jX<y4)γtM[D^pa:O4gwt+v{:FN
+t?A%JdA
+e˷gwPJ-01 c-;}M	qr_}[:?Wk8"ym"NNҴ9SH-ˌQ^7 Lwysf},{0\mSOl8ޙÝMε.\cFON=U_~Tu/p?vĸ/tʓ:@bDԝq &0L6dTR| e'x7vRxxl7J	a1rCfjY<qk^E$q^BCBG(:<|f|̧QGSidޭvhj
oK0O~.<TBcjpw|#SLo|(zi/[đ#I˂1Z0vlQCqF7*e4;woش߃rjO΁BEU&cy J(/wdWw6;itW@zWj)3`Pg$[><swq%Q*?
+n;;>bWĎln?	2$zJ$q9YҊ":
+H=o<-G_iy/SZ̡*Re`T'F Or%
Ld%ۊ>sg?
+TH6,Smx
Xt0\'6}	(]N_&0sS~K!/q*aNnD b$ #giDr9:y99d[Y:o^jfrJ@zp
M
F/! =HYe\x(I6ǨũeeG9Lzz#RԢVa5 'mLKPD=FXV)ҙfQˠlO  xc`d```ad+`I ={&r00DC  xc`d``c@d yy   xڍTjAݝEW%EQ"sQr	^^骙8Q=]Oxh=0&t: %P hiѲ/mWx0swcņ>x,!U&M{4ҩ"/Tr'}Wr;w^lhόrscƇ)ѽ^őrDȷAOפ[S-U1>{qC˼ty8TllW3=͝;fy^Ul|8qtg_ծ91\5w-j<-_ިx^l޿-{5"kxf_$pJNyD8/i&	cеzs^.o|?~E}|mL>N9"z;V0ocP=l8vgSYFnARџ!
+ՁYf5>ٟ&}j?[)kmzRuwcĦfmf|-?)kvh娀SD?|]PɯC{"8[Sn՝ÁJ2l~Za=׹.|({>gSʓv]
+?ɺ~4dsG6s=Q_h;"  xڝS  `22*3rJHTqĈ)PX"23GD#2S\9"cDD52FY)GhdfdD:m`K"j9QIY@QK׀s3H33YS❕38+29~{n6&;:17k.wn[lvq0/oZ@c0q/(f] [ ψw8^XІ"8	J ':F ,A^G-^ZLIIJOI'M2QbO&%&ےY1oqqdjIRє[jJ*#UP0	Mhi45 8222g:.]^^X>A[_!Gx3޿Rs+Yٷ*kvU0u5{u\Z#^c%FYkk;P2$O~)@)dJ:.*Q}#ٍ_i `r鹢\Un[-7Litk#x#{c(O׷IIollf1Ζ-^&Yja3ւBI!PTY*EƢ ̑qɭ̭n"Up#(Ly*7!>?ډY'	>jo"YUL-)K2K8%ҘRqiGi_v,P*kb'֋{(8$0I$jooEF|z_>Gefe~~Sx 倹:[ K]12@Fir\+iŇ5###JR<ZytLETU,jzqLụk䚮qqG-psUsğ,;W7 

#&?rOOn;HUkgxg[\gIggZZu?yussMz^wg(D`md_h2LKKKfYupYzgIT^A_Q+W㮚z;4_Dκkk_sn6y3XW~V-M]wމtuڄ6,;s/^뽾==:CÚjzC7>D4橮79u<G<o~z\&cLU?
ei_"^^*pppkןGoooo}8]؍aC] <15AR_PTH;g׍aMxtB<<ᚘoKKH  xc`d```dPg & fB0 ? xڍQ=KA}w(	buXXK	6JT,Kr Ebkiim/BXvn%'Ȳowf޼wD`D θl WM$8n5bOOaO3[<ǰd<kǢxkƗ	l1_4"cjG̼
}?#X6.qMѠrEظCKJ2bY(eErx;Ut%p-.:$M <?<_Ǣ§:maZΌδOjeѳ+gC,a}S1Aoo,39l:F,.oʠL*ZC84 =LLCW*NgytU(5{2-e#ujyPAWzJCC\IHV׍; x}Wݪ^Nff[,Yff\vvf4p0Iv;̉3U̞N/E]ӿf?\2;3enܑ;sBP"B
`]̽`=v`w`o`8 `8p8h8x8
hB$]ppLgpp\p	\
+p\	Wp
\p}	0(`VSpe2dj@İK+cqxx<Ox
+<mp;w]p7>x<φx<y|x^/Kerx^kuzxo[mvx{}~ |>Gcq|>gsy<_/+U|߄o;]|~ ?'S~_7~?Og?_ofQ`se`k8p=wpw#s0{޸x xxGxx.`Jlc$<OS4<7	7㙸³<//
+«xhfFp#[qNE}܆a˸Qh|>'IdoSix+ކx'ޅw=x/>g3YlsA|Eb|	_/W+Uj|
_7Mf|߆ow;]n|߇Ca~?O'Si~?/E~_ůM~C?şKow{ƿ_ow
+
YyQEQeQUQsbX/U&v{=^boW'A`q8T&G#Qhq8V''Q
-!E[tDWĉ$q8E*NIlg-,q8G+ą"qD\*.+ĕ*qF\+׋č/n0%BaBn,,zZ7Һ֭iNNZwӺ%eR-r#4m+*#E.*UnL(FFP梯~Cd3-Fc#ѸFMz}-ڋ#
#,o#gTi67(S
<cPxKCwg|s][ҷr+#*jp\	Ϛd1*asUX^xJjԎ`10kzޤ&9?(oS١Fpl?VhdqܾQ51-F*${kFp%g%c熆kE{o[Q\vS^U7<!yvFrXZ)odA.3#NpU5Li#*+:6k#|',vSHoڶXKǭZRn8Z
+KTQ"`bMÝFxKzԻ(&vߵ"XGޮqN
Y-ǘʎ!NC#*QbrPU+UEp;0|`oZ8O_G=ZR*}VB$Uoa]ED68^`o'N߷<IdG,2nUi-hO͐ʎ[x.@26aEG$x^
+5v'$ĕ?tPgBl7OȦDIter逜%,47I$.ΚOf.ǐ
+I.
;x 0]
+R9͚q*uHTyL4&Oz!";a=bgOC13U~);?EF8	Q0%32BUf&$7
+ϲ/sx7ABXqDTlh,2oP'8/ =aP쉊4h\).4=ʑxm|lMJD#퇮ܪݾ~y#:jjL>W>i11&ĉ}EBfC/ Qme6TfZҾ=̈?dzq%3Τ3
+)Ev@)Dda).#5]ܟejLZTڟ*^HW0#fȢ%*(x9StG0cۡ9)nO`bG!oV٪h8	SÅxRrZ;$۩SUށg򎡅
+'6sUҷ[뭼-tLxӺ.&ﬔP@Y60&r}	D˅SHnHWS5.(ƠHaNo	9
ZH̓"dPaκx 
+&I7kQ+1儃
2otz5t#>:6uU?޾}g+KQ	ٍs;̾~xmf&<>4<PSx4ۄGˆz ڶPhȬ<iBf9)2Qv܅nIH}7%Ir:	(,ЊMgJF9I:#еk͙-tytG8#q8bSL%aF?Uiήqdacäo6zV{#
+fpcf:ұlʦ$md:YXQM!^zEo,jcқvc@ީϙvdNPI*ݵhYk֯i'W|RXkx G#^m&pSR c x!eGeپc.{Q	3$lӣ.рNcN?;<vK4˹NsS{nEk>p_HOqz=QOwd6E+hs˅ٶq|mԩǠ^1ǠzւFl5hrJf;΍6.\03Πz#ꌨ3mBZ3k0kJM^Ɉ&#hۜNzC钛eZӚ'o-^ūxՖV
+=i%$$$$$$o͈6#ڌh3nuƠv=u^t<b0ˈ.#X-Eub]X-Eu2ǈ#X#z찡i$Q?0E!ITԹhpŅE.ܢI&KB\%!Y%!Y%!Y΋4x#X Y Y Y Y Y 9|&#h25 h1ň#zK^2Ll1B2y̻d%.wɼK]2y̻d%.wfDLl3"}  b.taDLd%.tɤK&]2ILd%.tɤK&]2I=Fp$	$GIe.5L}oѕi].h6k6߮UD U`  
\ No newline at end of file
--- /dev/null
+++ b/assets/fonts/fontawesome-webfont.woff2
@@ -0,0 +1,277 @@
+wOF2           q                     ?FFTM` j
+\X6$Dr  7?webf[f!84DإUa fGELn @UU_A{{))4c2i|IN/ljĨ:orAh$W<@3ƣc+VNtЇtz8h::
W6¼e'[T,d47na6nlsmcбliKwcf3&ۖڰ&Æm^ރO{-r蛲]~CkSMUfH>FGܧZ1XaY[(Xe_oS8s@՗깩oy5#dx*LTUwdT.W	:9@(	EBL0TP@{f=usF/tsn.\v]W_]3Ojۭ"H&~?ݜABs0֓?5;8(w1 @X%A\8[R`ԈFFԎQ5hѣBJNP~D`$3Wg,Wg{*Ȫ!ӌSHߏtץ? +ɖKdSL7Ol#&>щ@K<6u'﯑ Wrq*TuF8	ǰ1f㘗T}UֶI<>"pxxy?`ByZm?*.XVnjS^ςjx39@7
t	:gS[Y>&,8. 5)weeII
+9^wjߌd;Ɍd')<$0[v	ڲ~fz;NvJ]F *S=bIڗΟ7ukϙ)L\wknvq
=#S=Lkx#k䃪!d̪ /U+@6NDy֤t8ڜop_@ U H % %T AT3I
QG'ݯ)ٻvO*P@(&ىR'iѽiz՛buͩ}qiv{=鸇cۚ6Gt'8[z;Xзtv']Ex1;sԥ&|,EYPo9ڗe7[veEh^YRu$cAC5dNV:ȹDmH+2"rlI?i_L5*$յmmb-ڨ((`"XD"@ {BW>J<@[@D#ػϔavpixd0ȕ<]mr+r{B0_;c%`uC]lc9<4ό̿Zs>݂r'YǓg~G} .r{ JC'ީk @@b줂#ĝ\a6'Db)-g_?[͓NID`&	bd*$
+<[~k+xݴ$S*(?o]$iaRJO p~#|rKQ/ؿJńaIvۂ8?^meRӑW,9M)bP.${i.4Vƙ2P{{7ܐ$#➨D-yF<p-([ [T
"n$Z(Td$JX9:%v쀬aȓg*~*R-rIRC_V+ 
,Z]yrLB0]&9څbD-sdKjN!!Sde,~zybɐ
+4BFJ 9]tf\مd}Opb"=\ 0IX@>
Ѱ	i.Z-puLOǌWz=gSf!aoVEH쪞3"Yu:)?q!7;~OWkG7_}V9f(oujg;\ՂFj((
+/T-AvwH!#L&v5{G<-w>̐e4c}>?_xwۖyxLa&&ZszG{||̖U%+i^jpśZq0CP1Npm9%*V#[5fc挧Ӷ4?0a8ݤ!,fߐoѓgx}IPRmL: L+ۢݜ:Bt~]7]_1'm,uaU3+_s~<<< c@d)doe*27,!I8": v#>QkaS~#b=B=|9ee!d႖p פ4hhP<b/of罈WőBaǰZw(_|$W!l$8nr-(cy^>P(1$[^d9;zY)Jn}!ܲ;qi+헄H"1$),&0,7z(٘5^7Vk2)AHDk?(Zqhю~f#Md0*
+ߢ)Α*UV(_jMKe͛s=i劈bp\Dk_VE,fNbSY1!Xvy	Y57I,4
zcY=X0\K,M6GmiE6LH!HK]ZD˂kJ&G]]1`,#4Ǭ5iXi1+ID*-*^qgRr	X߆o}[But_~D"2C2}7sS PxΩt8 D,hcbP#w:7Q}sü~D`kn|/|&*y0I(rlUaRWuTLi)$aCE.Nt_%tĥҀlE
@pT0u0Ln\U:56q{cHj2~pImjh`pGbx0r,6juZ/ٱAxOahkhd&ܠ 7`NҵftS#vLU	ͣѭkbn
+751c
Z2%HJGY!JR@0t_|fcjMkhc}++w&Ƕs8J{oAK&Q
m~+LYjao2ܩz
+U'*"Mqs^ٙEZiȓʹhSiΖ3VVYkR <NF:(yPuue*Y:YcL579X{kTx1 .^&WeU+^JcʚwQM)?)/)qHQT̑Ո5>%ͥF]Ϳ5n99/8REGkw ͦ<ԎK p֫g2Es%f
%<bFYʐG3_%[9mݷ"|
&-Ja-ռ'ku^Vł4Uf[I>U>1^鲊O[MEO_C9ѝƓv,P/t]*>F7U<*n&WM*'<%PXUl&Vq 6EDʌWjWApD4jjg>}k8\)-yO}
,%n?)/C}*PC%T.A"]{9\3Byfbd>Tm}ɴ}T+񊷶0TSYԽm |]DGF_$rňIW\q{I
dzW`w4Ug<d"UPIIUIԭC_GC+}%R!yC9Ηհ 냥},US馠mB~cH'SKYSy 0ZƨYʛ~V+F<7<z)=#[WM>Kh&mV=)kxqӇc4p_sfM8l.0qW	k,幹l	?1#14N/?E.;Үt^oH 8X^6uCLdY;̀HCY`x8xca`0t@@|}RoVm%Yw?ėw:	.^eZ̖-GeûϪ,7aý幩bU@ѪQӚ۹gm~bNkc,z/\M5,.&Z|pU=<5uL_[p&4vL9%Dr9Ζ'o`ҋKFXcm
抜:SsnݏOj{4	D
+-VB/&8~w\޳FGL1墒;5uf(loN8hKbZByCN@@~06.;TSNg-vWy 	AއU8F;kȇ;?uW[}u,:r4QHE`SpAiǡGeͬÕ[d}6ZZj1qtfiPm!,k6r
GԹsm${,C])4`jKT/-Y&C{	['ٲ6LG1Ly[hr؛:)hXT:æ"PPR<ś
azoTQ+a-o 9+f֞PćցMlͣS,}F D$sKm6tG$
~?W
+p6<3#.NS\5И#  |T\o0Cq$7EP"vI@֐RNiȯ=
7ܤpMkpFQ5--s@WC~Y	
Kk
<7IF/{",D|,KsX2Z>
+0F1g "'T 6*V<r̈́vyDN ) W	s
RȲBs+a
te}_;/YPGфЪ#a|b-Ud TX
CNUTtq/W[5ia2U&SC:
VI?uD/y*G_%IBo}ZY$$[rQKM	vo{>GV{ ٹd2Ry<H dS1)x¤2av0Ğ+B	"
+~VQJCLJNVR,Kc$ֳȄY8RpMG=|S
+'Q`~	y4<JNܴi#f~#*
+uͥ򶆯
+;cL]tAGy|󡣃:W?7*D3ߔ*\)J)J[	@xӵ
tv u18+
+x9{,	"t۷ܩ*\R	ĈP:4̛2׉ۜBd{cՆZquEKD<PE?dݏTfJ&n~A_4@\`%?0C(S+yЯb5:ǖpC()chٵ?$֟m0:r_,`~AӎhPI8jQbg3BL{P	nqLڋB1Z>\Ru<:>[7ղԺڠjM\Ri<P6vefcb@?WKuÚ.}z9 h)<xYaQ-ΘXvϘYCcgJls$cbbu;pe.O߯Gv*{kMԞd-e]c"!E:~K<\=NDy.w{A=	_xXDP&"TpMG6a%q
C!*4?/*YbUƕRL ;sX݋9*V,BQ`Ԫ4z`{EzO0mp&{Nj'd
+Z#{|A3<C'@"J
څл(>{K!d3_ǳ#(J𱔒@ g odեw܆ķow.Fсp5	&cC#JX29[*]k_@\]C%A:dJ/CeG߮w[ZI4R]_IggæceM,y8<lml2G6CW!dn~G(OK	śYT`ᱽp#Qe9Cb`ӜtB9BAmZ3!x,K"u
+*cc
//O#`5Oe(G$c4iM 4Hbd@uu۔2)W2r%aW%1]
OƃsӛTW6*$ê
+25pw)-)/}:nFde#]OHרieCT*w|dH ;sqE6%.B^s|o=eiPOgFG:2.n W#C(eWG9ljwMǖdWE|8\fAo XrФG~[Nl?R2qmH|Z\[+>(	yйd;V(y\RB¢,z!+\FeSBU^8O\Lm{Zd4zZL%[+m8ќ.c8-8M[=M`±佯l8 ,K8LpPDd ^Ps.`KTq'dQ(Y=LhNӴ-lEh1Ц!Sn`[@wZ-VehpO#%$8a'>d<=N-I
+ϼ
+,$
+#D]J	ħ0`wXk?;Hܻy  #nxw#RZ.
+TS+XzϨHw,ӏtWj]ep)"7Dk(6
hh{+akUMeC:8S8ad8jsOzn)ś	_ڂ1PlYղO
6^j=
+~տ`iETgb+Ƅ
+s/kn
be#-~r?	(+ko99B\ut!VIҦrtV7ڢxAHp6C iֱ[l6|kϧsz [:hz{p/Je;P/p޳1}ﮇ],r'^k~U6-mpK"W\L	)b+Lȥ_;/Mq r
f'[wwѬ<t8OMl
+ttn
+8H1@6k]޳.WDOz=P?pUJTRN4`f(L
+"vbj!<#<,U`ocZP_X&3*1L~z. sxN;zO)άN,W.d5ӭ5^kU	5Q0'=x_ݱ	].w=&oXnw|sid |lU֧>
+"V"D~L$C!jB	K(*MDp<
Es)RKn	[@,؇VYy*A1e:a%rB~JHnbG\Ͻ*J]>! P¶'ԅqz*DJxPwnC<5yF%X4R1
+)-ڧAzSO60U_lr
&MJ
+.((\v# d@Tdw2~}^
+m(Q@لR`iP
+f}j4z"	kLBZKoDEvH<$GL3%FS>)B
+N EAbSŴma?	:bz]IT3eϪ p	
HR9K,>#g	uL2ÐiZF%U#WYa@1nil-(	5nmH''MPj9V Cڀ4rl+Z#4E\־Yl8	btdXa?\u8g@<V Fqp@GpܵzQ#
f
ei1⑻"[l8Ɔ<dNuj24&ub(ԓ5Ҿ_Dp
bSzwȮ`}L&s0;Ȯvy9<6B$iTY7O)RjTQtPE~>d_WNCɀ>+xH*/Ll<$ǔF0CK	@0p6"mokw88JZadnUnrmY9T
]&U4Q	8JKd:1LN`@,%78r,*gm>i]ZN;ٛ\X%ɪvEc	xP_.OG\QyI)3]0e]UطxweӢgKzpG`ӫjid,ߛTU[ni8o@-_Mgg'?/m,mz;:ޝJgؘ-TydITV,C	askam'VG%̰HbI
DDj8CYZU>8#COR<A c8WKΰWw8ZI )FJIhOIW8,~zaB+{AT!7lM<]\M7(Um{pka `"ޗYR(giĽ	fq_:dGVzuh>(0ZZ3
 XC?<$z&
+>^Bl;MR!y2cnD'gǭoGY$di0EK'{_MaTTq_uW}` 'Eg"z^;ṙX2F5zEоizzãK4I+(/woɥ})B"	VO\(R_rQTIS ̄"D*孅b,`nlOOi#v<yWc>
vǵ.Ża:@K(SX3U)s)1;Q{@ӛdVbv?%6-{,܇B,Ϙߚ@Q::?b|m
+uςyK3>Z"|-4V¬i!<@l񉆔Sny\Lֻΐ!/HKZc
+$(Kږaf,O>K%.҄`)\	suBcSk*\k kmxfMq3]-:Ď{[iaY XpTerv9+-sr#Rˏz^HI?J76 I	^1P..>`FغPqq X.}b?Ec#(UmqW_/E&xdsIS Oĺؽw0U YLKa@ēp4ۢ˖ۜ*{johM wkٖ2QWQ:51|^T0z/;3y%Fҩ䭫tm!^Tn+6bUup &턆AAV=]]0zfQ[M,⧞ܴYu:S+3ձ#1bQdC$SL baaZ5#MU\c9gH+@-hN~rwVמ)Cn[ZFpq(_oD	_ ,J
+9	7>	%X!*RW>'XJb@Ͱ{haۋI,a\4<Q
L3
+q)6 ]@,<"A_42CJ};"
+B>K|/L20Kck^W/A±qklGXsJe4UHKS!at)CX̆!=VU{
B}{
Ċ\j
f®oD3_-9<QN'UH[eaʌ=&޹8Pd1h
+SmoّSN@/v5\Gaan{S}7N} $n5i<I}#|8|o>]zcs!3$2;[>bb])QE>>`Hq]esE]Y0Xq.Bt@y#-77~Rq}}EYk	O"o?-gQtۿ1us(O(TljOe֬N<Qɐ!l5߽km[mT	옶4#Ie-ٮ	Ql% 䌎z1 NӦytR:٢ڲ~3ڎhQcbJ
+ՍfnTy!
ICqȖX>+~eK؏mФӋ](:tǟ[MzxWob%tzKiMt?1w>(]1 4S&@Rڧat,yٹ"7Զ0;]FsfB)Ym	sĳ_t@>ec.q]ϝ7`R
+!Ǝ8A%q Nu δ2@\pՎ&?я*;أ$н!̀ҳUg
*B7!.;kA?DDJwF:5eȁg<̰!K&bX'%B',:sߘ3,vkEm̪VwK)&:RogˡZڽ*Zs,RFy*&om4|6>>\N:X4=3'ᣓ|5TbXγ>pULRU+;GDyk5/*{1,Jmͤu?:$́;&CΌjRY>=%	`Tۋ|kMNt@n`1D{wGrSZ#/25H9
+}>ac5֑玙d-Q/']f׹?z?}!A>z34idq}O7x,/.Yd3pP"ktvk
J8=F Mߵ>&ji7+9\p&qGrGOnב,l{`>؎fo8kff7(V
6kf+TvbD-ySMW~q,-;oCj=յ[<B㬡AdR7r$5W<⛅>f)̎Ǉɉ9cI$UPR
Y+E8;+,T=2&z~;	4Q_V|>~j:=&6쁌ӼIQ
+jA?ns(NP3'(]SIsK88-y+.+l`0*!j%[M8w06;Q#cˢlurf)\΁ҊN`ŁթAwP XݝWtH֜
+R	H,Oђ0t@û-,7+8%NT|!Z<to_/)Dbb*KZ*{gE*TpZc X {<[Qi b^O~t?c'{8<0.a2^pr{
+)TSE@b&]%B%t>efaUp¾y`nQYhh}qI5$(oZU]kB?~ߜ/D/5AzvN P,Cky"\=Y>
4T,mp/C>w
2M,=ddV?ALZftgXϘqM3]Ċ;g7^qDX
+eHC:U
 &	@~;Qcpk+ضbQk,0mJ @@`9dn~ncb([[`uz|3ٓ2>C=n\AlZ6LWu҇G#ܮ$a)h
+
3LoT9&yܗ}(2>k!AH

C|
+n&hd 5F?G{bs9-_WK˝hii<>B/7R|Apۄp5k-29>4j*۳aeiv=JK|mkgC.CFh%|_#P,w}]2ްA&=67)V&gE t2o[
+wXzQr;<I, diY\7:Zɏo'+WdFFA5h`^`"C"z_Q pI.&ofbNwh)tųt`0
	MK=Cʔ:7<wf#:%J'N;$Y)N
+7GVC-Nz(hVTGR0}ƻ21՟?_*}i87`SgXf##[z`2CF{0y^rl/l#{
c/Gnƕt115 hv)PLL\HXGʩX
Lމ4}c&LH7e[׎dur;*K50MM<6Y[$GϵxLlfآ*z:
+!p
+=i8A"Jޡ槤OSp8al2I(ca^!J.qmJCWlz谧mvRAn2Lh#6](F%[nhvi()
ϲ2)`<F|F'(%4MM.m6` Fgw؜."(2CNI,ŻRe}$Jt'~FQ(iXmI'xd
+a4ĎTSP;LIrQMb:?&g̬\l:dIqzzz\za.MBi1l֫}G9Z;vML<,ra!-J $ x`䖰PJd8A~|
+*!9WkNQ̥ޜ%u)=x/ޙ]Bc	lt#(?~D:r&Fc0x_,^`gOMO#^$=S*ƒ"`RgƜ1 ޠ.rrh΄vjd/wb\B/eR\_Zdo]L^Z;k=.(ڌz\e[FNw{,zH%3[4jËiv>3ߛb!vLL3>8C+E1ن(;tҌW>Au.%nRR@.Է/jy31zb^5BRa8|;ONsWKKBS|<a/wYѡ+DsyY[Et&	^Ic{ˤ6f!jJ^VwY+NM#OפjMƱH1n)j
+X+>ӻV~Ëg*KGcB)wsY
n_w ww)Y0jv~vNln5Q5Gҧ¡
+uTɐ(bL	q:CPWdIa"fT1A3<pJn&=Dz4=`&<Ņ>ë-,b3$✓];-I+5QF$dc٣ޓ+vs *Z^AX0g"YJz:V<
U#<t|lQC3ZS=jI3^'H{4F^4"5G&NXĕ:e81҄$K|Ӂ.P=&E9
41KZ:i2J vu&e?8 k<IbJ_=)yab>xNOFuAy1^&y݅
+g0S\6*Lh63S/Ym5aѡ,[^-Zv,ϔ~嵾DqHGJZ9v΍{FB5->g^ٹ-߲̑$oPׁ#Z֨Mstb[@j_1ˑ˥>fyIۚrbVeݳ!z:SD_C%f^kvOtnyCjP?* t.{o88|p)깣EOPUs>1U0%X{5f#cmM&:%8?`v8q*+.g6+O[=6!7_ɋFIWY˜/hLVLKDv
+=L2a"&c6+.JZk"]SnhFd=jfx&a"H8L1t.-y8GeYQẇ`40g`K%Oۀ|f40%*ꥼ-6]
ӑ
+VsH۟2T	rfȝ0g=0un~ӯrG#JIjSL|;)Hevqt1Q'[]zObȁC=^U@mg*nqCwX`z85RF#Dͫ*,z*$fZ,{4+ʄq8etp>K:rHR|*NRA5w#ZxR zrNeF"b;<LĩWYDċgz *{ڧ|,T@lQ&rF#fVݦ`E9OՍ>ScN	c%S:tI,TnZ,A]2qJ?B)	74uaLzEߏ5UB>ffҹ"*xR|w蠗L_$#2)I~ٯsJ&n~ꨐ=OcڇGtMPN;aWpW@!c	{Zx?CT,>sEO^)O[?37R`ZSY˯
+_8J,~'@vJ^'ʱf+QiWJjAt%jLb?"u:u-\?QQ5@C#n{'ZQp<{>tΉ[ym^zѾh+ɚ>j3ɜM,ۯ<(74Fk;FWY+10.39<J	B\Ζ<n*ThKS]/=3ryM2y?Xd\VDѽ	R4OE:"A.μpT}lgZr;,k9)aP3$~W$MͳW/?xMn+radv{v+Zo<\?uBq6=5?}_L1^剽TwuT>tzhLxe[g#
+rO%=U¨ytg<7(^BlR2!&\õ72O΅I%)KJ\6U\k%=[z]kvt|Ԍ/?l?:_|tT@'ǱDv'
+PHbj7=aԬUUGsnʱ65cmҲUf6PC8U"	e.o MÌ]9Ⱥz:D^}<xqAFAK)*LkǥD,0WJ༳G}g$j]k^ևj S?2bPR{)U$;CoQk/i
+Qzk{3zkQ(gopQ0J5`Bl
R)W%$$q':CT/ښuI[t|2Z<8*a /(vc<R+ K 
 ?T4K|q
+V6,}It~bbւO=]\먤ĩ~wb.V~r߹g+=pYWaa%?z+8 BuLc*ڌs9R)v)(Ž\dUGc3c32i
q2Diiq	4#q&DY1SyVY_-ȼ$Pip܀JkbbIY	M^z~61ubE}a.+'Ш9xV
{ԇs##*&݉4]wNVeLyFknr=/{@ӫ#+:ԫKXErស'iM4bu|YtFHf#O4#\`ήE7X1=e7e;t
+~y^rɟ?rE0.P
+^nܚkh"H|rv0Xi^>d]qm$"*!:&4#HHs^.%"S-YXnw	&=ˊ5uDw,7PbE{[@l~=)pk떔f5Qqa$
Ī[YE!Zx\ãrx^ }jGJ2em#x<0BdC}0545S@	-p <3-~B\׶#7\ܖlgP.uL;_uOǗM]F\+#Soֵ*W~09Y4v߬u/?T:}Nc/?zo}H491l/ %gs'oa Cdؓbl2ЇAip_Db6,qY̶Nh, A|`rۺBq%(@%-<\q
+@Tǽ)_9F95H>А2fz![5-J'
+QLJ^v8Wp%Ϻ"kcq_WIHJ"j
<3tK8^lC	]߬U FX&xl|Z"qR|7p
+@̣Bx|
6Kh5?@P>4</\쓎<F}ĵwrc)uf҅6 Oh)NBO@V
+1&W}B/oO:k:o{F
QLteL*xJ٣K(hJՇd\E$6wru hT
+?V&JT)A]zD_6_Y;zL';Xpe}{OzoGUzL0Ѣ
+|eh&yȚGŵ~=rBP!8,lv0Kf_ N;L쐫Pƅ0YM>󭯾,#@!gAM_#{y_]Ĕ*Hˢ^R50
^)qw<rDj
+?q&qk˂@G;t%N'm\G{(P1[WI/۶u^'
K%qv=(gЈt	'xiAeh%N	<HmV'e"ޣ4q^eW
&0=;'οTxД1v'ŐD\p'."N#iMEem
+De2	װw/oPahnYpoAwnW*eշ/"n&uyE-[1u#zSeٻ]lmfD!(lmxWݪ*^MdSh\q2ԏMK
+_VXGUY}f< 7zu&V|.RoRu$p?BvKjoP-..T"[ǧ0ajcv30@F!hU҆YGC gѧQtL	gPd!Fݤ=TX>f9??7)	.:'on0Ga\/c
>
ʂ 
+ U}CAq@rMdZQӐ~"Qb<8q''';Q-FdENr
gSS;[XbC*_lsSuJ!ܭZ4hKUDlLuCLZ
+!lÜ"laj̏ʇڟ
+SD,L-,QpJ7`__-ݟWf0J(j>yi+SM
+i{IqƻG|J׫ <HZR/'xހgq
+*LSB7dRJ|cCu/QBr*2ڰ|Yt}sMt]Ɯ
uE7"<lWOcPʙ\R\lȘg{ˍ,Kw|yWĐ*jn 'Yi;&Q.a^nIѸn75IN͔<W=fuM.n$]=]GM4Mb8ݳ|
+rF`uƳ"OcG3ML+J.BɂaG{N,񹑸]Q	ifKs~GDPElXi򋃔\uDfquꐉ%K5&PHŤ1Sf
wH
+$qIU](KaNIZ%vܑg?}m7T&;eJ0PdoiX_zER@XI[&pHdu+ZUO&adgR͂Pk#.:}i0Cϸm'+JG"4*&ǆۤ1!ɉ*q~Nb3kydʇA`Z1E:bG&';Ůˉ@ba+|aN?Qu1J',.m:-e_՞8G&ڂp'%gkohf(e$ySG+G7IjjJ6@˟WFk|޼VzrMja?V2lb=X<qA໸ˮo-m[>#r'gZYjLfhM9d#]ELKI-fzS	5,9
+
+2aV0nD;}'QUu=lx`2xm
+;pvM CMl?&c;5<n51uܤӻw4V&XQ!PT-OZe{oX~Q?j7AץDGbP?.{:W7v)v"'jͦ,F>9`%Zy;b2>/y:J AE_w >;(XquXKwcٛ/?tcnUlAUJ(vdmOXf˕B]3B=B-9, |!ߙ,ݹ;¼i-uubYŨ-S(G͆Qz]6&~9
+<ŏ)WU;~uX}FFEc>G
+PBPal4!r,clH,BNQ-po
`V^CI6/B8!\EpM>;{b:E	w|*݌PTp^qЉN.+*=PETb:Ut}O3U( Wpd^PPSvUi2,0՜2ٻ8pT/4g]S;**6O6:h#ZGhB~iY:,lbܑp^u1 फHp>h$fSR|<8?M:+2Q@"RNr~D7ivG;m,O*э5!M(_)6Hs)Y; F8u=:`'ʙrý]JI!t/&GiWoԂꗿt<%j3\_kziⰞM!$%K
s(UC~]1g}g "'E}(ޘFJ<?l#Wx.^S2je(oѵhdꝻ5*_fdhuu?scEcI8cՋzExLG$'RE8SS	
:nFg!
+8Wef?|x F
+"-lOdau`
WIa|sQxgkwFc@ͽ6G.4=*fj]dߤͷӚ%6UB=
+6v
+ 4RTӛwDARi8=%pUf-!C{Rݖhkp0/%Q@Z	s*k,Xj5
ıiӫMꢝPPcX9WwKNQ2
<lW{i%\e*Oֲ1f)g#E&(SWf$|-nEhs@_أNd㊹Ӝv!:%Z]ᑮZ=鍙S\W9c%-O@&;qaywU5.0)j
́x"3&}N&A4JbY)BW.l3jr1W=A͝x U
g&&
g=)Q8](lvK[ $"Ew
PS B_`Tوde
+Er%-$vs5ʯ"	)&H(bO!|')9,h/12ʁcA-n>Sdf γpKD㾀Oqf&A
+gfÌ+ S8w3003R[TW/{/]#c.K?tmt3ɒT8-%dLNJځ腥Sd|DUO\sNv&I°4hJ%$PhMQjݸ{Ŝk0rNm6g(ӫ &/:s9ԱtJ
WhL9kNGKr:4|?#\ҫXB	4H=nAQ~d[}Ϡ1
+M\#G,
Bl,ܻ͞Npa~`GNk{ƸiN!N#2
+*,<l8ڤx2
n{S Vw<։WKi)ml@.C)ŝcwP(c҆ƫ/ܚ=[e[ٵ;N׻XV{ߞ^9Ûxf`ĵMca2D
Aռ쨯	]fc`(y܅,1SMnOe8Hi!1
+d=qрو0PA_Wz֕%=.k\G5X;Mu`&:JNh1O;bn:\qX9?pdv $2kL{
nSn%&[,~:mSjo V>u7aKPVNBHX= b^U,
UiITc9֜Q9\FѯgGXsCʟF[JqG1Jʼ7墊&7ձdYX0D}O]f:F{y:9.@T1pPxn u.O9>	8x*8P七R`bؗ$poOf%eݦ'<1%-ȓ=;-x6G==gI򘧄R%v9`;P
+h'K
GCݮ>Ի_'[skCZqxhqopVp2nտI>7]y!%+4TI(?4q܅H3AE¢JT^1v<F苙4!ydD-7Q65?-jU;W#DcoMhbO/ԒxS{َ3'>EhXElzNP2XTu}5ۅDc5`ߤ2)=!%.h[C;
ifi}N2k3gzꬡ+s#l'%0rI.qs*z{@hhE1S_/4QcH4?@y $0uV`AL=ֽϓTX*?z4&}W7k=5%H{$%n\4󌌃߿|WC9"g<AxֳVAoE'_pmt,ʍ#cFIVN|^?[o>]XсOpL~EqZ
JЕͭ0NX
a
菺-VTbȖ`DS.ɀWWHth7yL,֋S}C	l4]lOݯC?c=5\JK)UpW»Dàbf~~Bkw'<	jc64] F<'Cj0>i=MټDM>Ͷ/dU#yضD@7:_Ema#]=gON޷H1Wǘ-*HŴKQdR8Ims-"
+	n?:\m߼[o|b1zCon~bU082,;w|CX~BQ`)a͹V	UP+9!hDf́E29pp	9<b.,GpxϸIO-%_h<0&.R\5%g
+᮳W	1
+I=,hnX3Sd#;k}t衿ܝ|r2UHThC:T%_WvJ>'b̨b_L&QKI&a2bx a'a6]Qe8AP	U[DwYx `P!.QvyT $YޝܸׂPURGu:U`0)҉RYA.5뭢II@Di]b*vr"[e+Q_ GO`(d+GAUxߵ-	F9Sl=cԙluRX.&BjJ}َCٕƈ\]ucv~s>{Vd^03֍ߚ{N֡G5MRJϪ[<߇`Ձ3D	Cԟ;oR ]lZV{uBj-j	٭X4ͱ	3jK?r4i* L|ܬ0yrB$CF el/F@~X D*
8KV:j#d?yG)KAd|zu<{
+
+ a+Nc4: X0GW*S/cDax7[C7rŸރ VWo<pDU_F!+Y/L\9!8Ʉ2Cٯ7b?	퉕OC
+͊~6 (vyڵ#G3\q^[:V,:AT#f|T{Y{:mƮƊ:YH#S_.8fpuXӹF~ieB6}qgmxx @$uZ:(ݴ(6?$I;r8>Z%s4EFN˽ mϢ\0ϲ)
+)9)	]%<}N5}tT]=[=jү__9Zwp,|nٸk	 (w*Ɨڌ
{x?) gc=HJ|NeR_MW&pU	@DsjVoq
MW2!;mٕic΢oD$E0]O$l$}VV;\~]S+ZZ[k&'ut<靺OWwm"*}YQf<gY1p}뮈㡘N߇hKxIX:Iį:_~\+V	W4enF}relOV;QCUEعg{.:УSZ! 㠒iEt3K
+s1'`q'/B2W\Tͮ4B:ra(]
2ZwSzB}pB{e8]ãR'Gb"D
+Й.!)@C_E{jp~u&'z5vh̳+ŭ65ΖI2]ͻ'/LN-PȢ` -hpfUpt_'E^wrַ܀D=Z$QoRi*qZY1ØEb7dMa0Fq#Ӏ{%D7|Y=gDWi RC2\z"/\aҳ3g<f)P1ɦS߻jeXbf˨;}X D" f|3P oZC|!8HA`
ur
氄5(9f'kn9h*K[{ÙW8Tz;_L5mDR`H/_J4pKl~̮`e(vWY`7Ne+L&M`}aqYJ7'[Y	'qcVpM+wbꡋ0 8_Xd1VrvvힰԬ%%ڜyk,vڋHEj儚猶r 3XflAܨΟɡSp\9SKVYRɧ(FGύ"$ԏ#9KF+ %V'%SpP܆WxvzDggt"ѢOϱmtRg&??eRȢְG;PNR2xJs
+|
+4iCn
+!ژߠB pFD
+<%)*s;3B
PKik	i!r4 7#NȊb^by&L(EmHN]8˂݊uCi6 .PΡD_
+x&]=6S"kx.c7#41ugVZvب
+J4kzgBWzQvBeOq@Fi(
\ -7Y] 1
+XTL@ƀ@TPO˩<vC<轀)>7PV8cje%btLb	߈Be}32#2d.ش3)B>6U	0c;΍Rm=HU[ 5Xe$eZp	hLR@~@t([SY9xW'bif
+8snߌ`uKG˷#4 .<n3:v((8YVs
+܎̉}˖(nO2QެM<Vt/PZJAH}.!a !i?0$]#jr.Wn"0v^G	3t҃Hᳪ*`;$,:jwKm1E TC0 .

z7G;,7W@Ѫ7o%0&[gjU^`"RuNܺto^'5i5U	es4n½I#y?2jDyG$o˔W5ʠ.ҔM)Jf	$Ь#iK@դ
+."q:`p^Qʋ8x'i1HoUPenmGtdB.w[0N<	HQ?j>Hj9xKhOe>nk+*k1օdX<[)ÙϖbRϕ֣z
+|ͫ<	BG_OO'ž[OƹvyX+ݻW\RKXar]/T<A"ğ|WXws! (<6VPB1s}rýs_Z+ׂ3OITl[~p0Y8(!jVg;Wm+Ȅc4 8ciY35'6zZGd֭˟?G;AȞ~IMD* Dv{+!QF0<1o12WV53y&<ǏUpװLY.~Iff?{D7t/̖\Mf p
+w5nVV`B!~t~0C}ZVוx#z
 fj.7b%]-R( -r*}:,o(,;
+KEA K]]~]bn&ZYɛss=;2E/֡Ֆ?Se+"uʟMqѳ?Ԓ^Ӂ?AۣqS
+\Nf>L鋜aam53¬qrn
+C`K'a<HH6o巄ArDH	`DŜ"rrZ|X|GWXܜߍ@^kY037N5Ic&mˇ/)ۛs8UaG
T"yu)__3$[iw(*٘ǹ1DEǱl9m$7%$C҆tB.1,c1a|7i-gZIm6o?DqƵT|Kon>θ"Ht)~=`w82[ADp&)$ 	&Ey>\x`ik=a8J"X>DCEny
ǫ
+!
9gg{r.!	Vr Lv E;DI!!Nu˫`n~PE Sj}X}
+}.w(܃?n<x=7T_v;qG_jO˜,bpmy:V|P7)pJҡ05rHuoi2Ȑe~m㳥&[˂$kw:(e%{_7^yp[_Yh 3|8ZmBoZ.`^%r #N16C 
Ӣѧ P!CɈb記JsidI0Qp
+"ǫ&ƥm"ryJ@$ݞ݅x)`h8 `BD'{8ǅ6)Ɏx7;iF#'4҆!74^9v%n⠌ˆ*KL"E¡PA7y@OQネ+6/$%B놔Ǵv}
W;"jҠ	VFӐ)W;"إu
+9Uq8Vonwv<{8`QP0--[xBByWG 	W.2lB"Y1`檡Bt-wr.r(3I4*#'.D;<nGB?õ~`k_JcOR|>(𴖖4	!p`ѡPM0/̸$Oq%'DDPWM@ȝʽR)
E%2(d
 ul#a@ZrCC>FNyT(Cա PSٓLp[Mz	:l	EN0ӓ`yzpU|P.ƳxЄDK__g|6VmC Pg}+/OD8m͕>"t
oH#=$vf;r`ef4X{yR|(;/_ެ8|B2=Ѽ?+K*c}7nĘؔC6*qz/yiP(	Mr0*oEU8aE#cleߚ6;
+ݴLͭ+[P;ueUVtx(
+98g.RYD]$3	j*B ^rDc2KR\A9
+zpG߉WwAۃ(Vh)-<+U8ɫY}^6*;'WDh'q^<ܥ>&:bF򨆄O*\Q:|Xު
+xK7UJVj`e^zhRm%;WѬjMCRx孵3D3<,>'FIHe@jzR:rcw/% Zqjݖֵ%]I^󹣣 l]5v	9&"41r眏;2+V&R.TJOhWzRMDuLKVOl)џPp.qF^ɪ9ѝ*[p(J 3˪%и)	ֹլLLX
jVx
+#G^rGMiv'sa|mo-TB_^^D˅>$rG^~IT\=	!=^YߵNZM}I^.|2Pqgp؄ġX{]8<Y)F0}q
+,yV<oH`vFy
-%>Wrԛ:6<RMlt
+vvwavͪ%a^
R+%c}E /^@F*׮Sp&$:Tsr6G0=iŐ3}`h!z;S?][{	|IK$6_2b!ԧxT.?µE_{,$/2_#K=.2JZkshd*7޶LOwa&̌94JDe;\t8e@)$0mb} b{Wm?hks6Ua^{8mJ.;Ec+~рçb	KwA}g\xnO'(2xl+~ʭသ
+:z7h:[Lv?u@
+=+Kb%9-ԒFSz"JENKd%ebv,,MIKOP3gHOmj|ĕu5'w	MH) |aCy' 9:@( ?o8/[T5!"uW
+YHSt^ts	p9b-԰~x[rW4/iinU0 R.Rn`0-Yo	O|wĳpR#\ЖT=c70_	9juT,#f(~9JzǱcR
+1)ܐDs۟fy2q'ga_ȍ{3?}{isb?_ftk%[S܀%$ Mplӫ"K5Ӄ2 ` "^)?hMAWel6m5r2{Lo)ɨp(C4+,hW]X]ցfhFKgD)GƎ9|)҄?}Lr
zR?{T'۴ D=>$hA٤/B0bk򾘊 0Uҥ>sćFe^K)N3҃#]:7  S<ي./
0g`^qic!G 2(A͏6'hb9{=nWỴbT/Ab4	$x4P{ԋsx={L܎.kxÜq]d8nzG,|%Tjoy!i ^] SK2gC5ǉ$(f䍌m6si?&HXsOm
+.ҧ_7׉r0^#vO
M
HL$b~Ê1~}^sCs`:o(lEbC	
n""P 'SYg¦,ׂA|6Evм~ٻ?䴰/; RiI-An!?j_Ppz]|,pUW@8DUӕ[3[K䍎mcⲔn@1ЅbͲ[ݨUH-'>%4ŊZhuJoH0_&ߥAPd[Nܭtoi\
+>Ї#P
+NYc	9_<yH긬hӛGys`nwwJyҩYKj"qOofeQtn+piXd$6Q_V,?Cb]L:2PuSHn[N2h%TT	vN@?ۜ>7uf)uߛAX7kr9ؕQ'5:x0
+yv%8-IxscHRYlF:[e}_TGƮ{;9
+<2?4dX>39zO(j'
+=,rc_u+MP
}
F\t&ґhuѦ2.!-` fC95ǄZ*jx=a<0QP{60̘)E|apNS-ґNku^롖Mh4*NmR9jEcJ6 m~ќ_hbC|<(?LRB^l&
+!uNy2ۺZ\;r++}\(BqOjCC=(
+0F]2(^8]alo(:&v  E1jl@P`

+LPb$h{, NFd,qbq辶S<zyh94y
+$љKᶵvm9!*FN\fLqޔ	3~dFIV5%m޵v%hx A`k|Ys2%2?v+WwǺOܸko7k.g{t#uw%\''&]2 5
)C^^X;I :1[3~HqO	l*
+]*X
+xC7@{EϪ^Yإ{-~>d!EE癬Kq.ybԂxjDX4;>b}/o6+\MmK^{#EםJ4f1ϣYšpXsЧUJp=ϪY32KdJ%vsLb?BwNtDgq_l5ﲙ
+FO%ELqWE.AvyL7eR*jGp4HG+ׯ4+)[7ІĤq+U$?)9B?jQˏk?ţ4D cbqF`{~8?vBO'հ>fjG+ߺ!Tr*#qL+9`FY/N5l;Xȋ]hW&h {~hП
+bS&1x
+Pd~
%`.nd@EVi5b_34(ych~
+Qɪ2"3
+܀V!ixgSP(+(""b Xmн^	
mMPVq"^d7
+vgH_W&
+*B7btZٻbBg/Sz\ּFp
+#x)s=;}wFTԩ f.(,[Mhp9-8?Z܄
+ma=T1̸hҩ?u&i>*Lenj+n~%UnH4Nc
+0|r!e`³
+VYGW3kg5Wr`yhZζ\:}@c-7򸧎Z aGv2AͲsXi$#>m]9gٴx CT#0_ykΊ9<S!,`\d!UփF^}]j[E.I~*'&H=}k4RVuycoށvQnz%w
`t
+яX2+`K
+cF-G[B#%:/:ɺ
)qum숵JYEZ~4;rg;)+d'XW%/I[o? {*DY!׸EȜ"HM"
#AW*A7RG+ꃸ8Zq޵P֘$c]2NxQRzfGU$sPC^ GhxsฃaSy7~=ߐDe8^jjemjSe.g7tyW+-Ӫ	{@`Hʄ<;Ґừe1AX6$;/0M
+!<{Q؋́9j<$$w_=ۈG}X ,Xqlp2rb\~mQ5" @>ݳu<iFU;9'is	vq {!Q?/(RT8-&eyb~K\NqqI[N
+$UyuwIluwm=pG	#|3[@sf9op@h6G2 gaϒ} y^HSenH诰SWEl7vX8tR:wCios;n_akYʮ1/y;9v{O'VvՉLAP44|cۗUO\D%^i;$Pq=r3aBhqY2g|)`4bwjfcy?I
wD(ML\NzzCaO<c UM)bu!A\? >kKneIfE16S=RW]l|5ءJΛQ<4L{DCkdۓMKEP^?<DGߩ6ܨf2MR$_FP϶_$A"xLo32R=2~'JF-2]w~l03"ڊ"?v&\Re[p\k(V剸S()(oJKlPשZ!Yyp
+L]UV6B-O{PM϶%^`/o׾sQHa+?&.H;p\al(ã @ʳD=1_4V)0d.Yuv\=o|E``k=|xe%k3b 䯒 ggJ8BKZ N{Ȍ_MLΦȒ|^<%e䵆;WlyTKuk)w+W7;l-SPlRajcm+q-e9"Dʠ$#CO,hۚ#]p'Qv6Z 0=^&Bч-1;7FSoKh4gdlF?	p&]}xfxNGMh@?6{e~e|2l/iP ߬(q [֡P͆QQ'"3NnL"\nI~Cd
̕4COvi鎺Z*{+I(~v ŲвexM$0f?UEs\IsxLJ	f%A$ ':YHD6m X ,I*@{.8%nl0c-S5-EFEA~!8Ӯ9ңg^cZ;d'Dy\_8.
+Vv()m&
+qR)DCB19p'
0ƫc>"C"ARxeM"ĦuB	8褐[Es'U0MD|GdM	')`9J]{8~N\`ؘJ@.MM(`P@4~F@4ro?JP!k%&шRd+[LW^u$	J+b!XCiC*}P0	Dګ@q MS!utk]j=:vI \PGA#ES1eK @ZELpe ѠPQ=(@{V:L~?L1D[,Sg̍!'b:檖NoiNMOknIG-)Ocb[13S!̄r:ZY6;E>U.
wt0'  ׭^cܣ}l_"jrXN`37nVbe8ozZ4J٦[

߷rbS]r7Gw6pemu2G:fL8'R7ܰlQ
Z>U-ל^d(߉U^Zn
+3c!w[HbYwЫkk}Yo"k mv_@}k׻\2<s=ť_5qd<𲵯Oyt5a8wGq86tib.
+{?l#L#UNѬda"  h8?vx?%d `$L_[َԕqe}ޔ|adY
+Oscm-ncbU})ALˌ43<_ܖie]fSenq
e}|p9cۭ6ĭRT:(|s78oH7oԳPNt:S<{SsS׮;
+ xKsD-CϜYͫ/ }>X !A?Cj3:i8P1:	k6JFLY}_z;p/-0ApfW/R'ڛQUp-B3eY]ȃd/wt〘iW ?tp|>}ml<x
NZmLZS'@Vè#ue ma;$;vInpKX (>/2Rpx2I-V;B:*?rgVL(ԗTEQHv
]NoA}##IY|Uz:\U#U*-F~L!)_;E@5!?[=T/`WY

T
9 Em>oe3[2wGwݲy@5ׯ'J ̿ke'#n7-Xwb_%_=Z8xۭ<>;O%QyS?0:2c(oԬ[= }F$D(Mf(D|0F ~\:s(X82OO؂H79TB5O4!s̙Q 'hMYUkH#:eضY|
+ 'Vn4*) MzE)jqOjh$$mPN`큭IO0\p#5P> #"3-N͕8iSRRYMLĨjǏqF#Th{ma!b7Wb"^Q(4fj/m
~
+8xGnF
+PjEfSMʧ
+Q]c5424)wvw	TdGi]N3waY`Jq*'VsZ W၃
+n.:Aۡ⟠kh Qrq~AWZ#?p%-GkY&"fup$8h~ϚWyrH{Giʩ$ݑ8O3u\/K7Y`b3/
+pvcyPP^
uۈlP1x# r+%(v7-S/Dڅ N' 8R(|]bbUo֫2a%ZᇋΏ+/!aݙ[f`_R!j[46sg0>#$Pȟ/o'>l`ӰASfht(皓Բ ny?Fz)Ɇcp>nv?a͛qͮqCj͛MX~^,kweF~=6ģ})?$
'ܑ<M߷J\ nld}݊Aʖ
+[`hNTYRNjν/ڼͯ.C0AH18"l?Fx]CWZw{"c n+f=\=cjO;!"Rjc|ǐ&fDҎCO/H `kSe&7uH*%GHu.5r|o{A[-.>fzc®|Ʊ}Rw4L2s!XT#)]T4i'3-!1~_	ls3Irf"CPm Pś&E/̡3_LVsD&*װ/xnjH?9TNC
y%BO,eevnSO3޿[6=G4]0E-UؽXa,[*.4ذ^-8{ :BL|WgR6~gs?<yx_Խxjxm>'Iynhlع~
b6O?xBZ߼:F)`7dN:}-AA7R} ie+iϧ
+)z>uK8jhWXf8' bn͝}[8f=/ŞAn`iR6j(Udɝ~0FZ'H3wb8E&VZoäitONQטeؓ%@-CP<=
4;xu5bs}>_4E]w,d*|×$e$km| a 
+Us4l
c3ܨy.LoN'9[rnmIpɜػbQn-(I&|NZΊv]D|L[wհ71Wؕ[uHY*I9	,&~YG/:,f
 d e; \߰bAM|6u	JNO?cEE`(ljA6L!C;CH Iz2:^29mγCByB!}Al]J[VGJ e'tkCV !T7o+/AY9c6ok^ŕboj[
wlΧ3OΗt^X?pQ8m| _gN~Ei)[
މ %̳@,1gv~g1y<NL.fIioʯ0RS-	yVs.yYYa
<{>Fb+750E
Ʌ^ 2L͗Ǌˎ&ϻn;	cb;n2}"P)Pa 1UYq84
DWkJB;OGl&pKsJE jC[WQ6Ȕc>^6`lDi)$mowa,*/wآxxkG9IewE$fԹ+	ĵB
+
g2}  o׳Hev!-dgf""B'jO3Mv2>hyRAKÙ_HN{fsaf^-vYY῎g1h
+7w"0Q}??p-:z<:jۼ|D]:9QENȦeoFn	TaoQHna1CIB_Z9@#r{m]4"f<S:R쟜IWΆ
+:}3w$St<>kJ'	T$f_Nt8}ȳ9w-->CW:x862yփ藠GLDvMu5<E϶ʗJDZD?BG<[N(l~n>g$P.hcT6Pdt'
+2ݻp6u%
AgVn@&;5 #e4vsgjB(ÚA^ 6#|pgGGl8l`d[o6D{ʾ- 
p Eo mV} ބDc˛ĭ7Q 8TL)kYؓ|E\(쿺Z^	,F Pq-l8dJ"I`wt W`9žTcT-<497[uH"L׏7t'RE{a&LZ|s[*#S5v2	/<WxVC	񦵣/jeS{/G	܃/ٽm$,c-"JȐ^יgR'B>:lP2~UZoӘbXvSG3]%5yUGwBzƓ;
Ȇ Sy	`!7ġWs #$d@ϢDݢB~M_Lm;NT#7݆Guom-ApZ-^KQ(Ƚh/^6>;7"ߧr;TՔ@}4ZUVBΪJt8YB@<o1^i@:afsr2"Myt"ҽ寪o7pDFY&km*#JKKnH~[qc %pnj01ēdAǆ-/^CK!<ӨYTYu!JΡ#}k0poX"+x>vwXW۹.a}EĞ=FSd=Vp?꾋1}H=\8j_tkn;1;}
g+W~Yk]\p`p.Z wlZ|+l!@]SNo?>$ɶ	u4N*V8#7Rg^{;N]OQ\1痝MQh' =ÇLb7E5Z-f6D@[
+2VgC7lW?OEz}^ܡu`[t?G{f뢶%Ov=AgEԠj!v	,>Ǒn`tM7E~7b@t;m,k LOؑȧd.(69*&,pl4c(Ml;Q.I4lmܸe!,$N XrܨB0\V2 9XϋeUiʵɊ#Y&|0|4:=/u_}w;W6B=ÇJi9ͪpȓ.d><}˜#Ws ũY?/YZ=K$bcY9cEg
+y]
P4VE-I͏.Im7oܜD<PQ%6
|?id/swWH>B> ti nPݹomA&%1K>]Iu$7&^]_#OS?,
+  Dt.LaӲ쎘P+r!u_ ۵a;%D*l_{aSﯱY"(UCd[sӯ8v3Ulp(
+)<=xc6WH&[
I,g-""MHޱGfZӂ{!"觤{mcTzZJS'cmUK3IOr'H6ėreK^Mkd!K	Z5)y<8`e0yW+PL6hpT$Fy5Մ%jW_<^kc]D2"n^Qy̦J%s"9R)RbveHuS]g:?9Iޤ3~Ox/>V>22þakz&uf72gPG﫣ԅyMC?׷HBn{6=gl8@WS<\_sNٚ;
VnS6w/Ýj1#Uˇwj|@LZx7@]7vnw&Q-	nڜ;F6+eg[8rc!~,Z
+#uyGϡK	u#G,Yw42N~joe59/C*F|f5eq96r)dص(w)X3
+[sqGĊ_+|_L۟EƠsr[aB),8\qSOSgKSPA)00kNYH-q6}GK$AEd5|ݿOMzROU/07E-xfA GGNŊ:|/GK<SHq*ؑ<,9t.zփ&Qz-] ʈO7lٚ,}Wz"!:IsY7A_gq,
+qQ?@K N۞tH>u
mͬ~+*v'.
+^  C)O
+!4_ cL`*4*Wh)RtTi!Lj 8*<`]2FzDZ+*b?^ⴊ%H8hL^S)y	ɞf!@e`ϊ Dn֤py5VUN AcqbeM'FgŮDqTfj6[	N$5>0bǮ[Uj,<|Zo5)t;ܭƃ$yB}@vHlsR??P_^}u۝zaף台4ȳBg1m$-nD?7{!(	ZB۱>m<P?۬q{党v:QSvz9EӉZdiۋ]Z_x{p>W4|r" `bRxoCT嗘AtD]~pMճs.}<8	{橔I
+IU|>I+xL87n֍1bEԲЯxXF웨D&d5a{y-k<䙚x~3RܔTf8~d(/DS
+$U%RfyQzw37w3+|8`/k9k :m:gCmP;;8S}% ]ϓ'?˛pssUC>!a6da'>]77k[`~X|C?V3¯dG4k
k|8JT]7b+FuFh#Z#1j!Z`]O{4dRM0;xiQ_VPKe\Ѹg!rlQd'|"88#FR}Z=kI%9=~ys#ѧUo~{;F{Xv<m
+(Siq5A
+=lJTĭqH`a* 7& C#@p(fM
+ܽH&NtS16(x4'ZF2cTo+k&`/yDu)9,Q,F)sb蠢pNlq"vIb!E/z}o2#n\ϡrLLwDR'FmŭqRSeŲ+cioHZ=T'/5ZLׁ	?yrsm
5<DN΢qN"NNG"d7퇅/x8Ķ:'to1aI$>^KΏK}ud'Tx`bBJƯ?$	rUC?_WtXplfUcnPge?H̃q:mݧ۶[GYzq 78bHdyTyQvLhT)+Qsf}W>il7^8zuy馲R:
+܏ꎺgcޯZMGtGs?eSr|o?Z">HSK23;
+5>{٫ه14pUkcI]iV.ƙc002L\
 㸌]yw_Eu14*/:p:Mظ5jH0Ӄ}Jď GfW2%UTwi|AqЏߵ!yk;z*8+u߇\u0@Τb(.\rl!ԍ3Ll,x^LFV"7^4v(7MR7Y(kʓ.[LП#E6s
+b:#}}h(ޥ;T?DDp9X[z^;>yÛr1s]s،RjGނs+:15_or)/&Hͱۥ;_a7?RV]Bn%dX XB{԰fo |4Mk4e{QF+3U{rNI}ֿnP-;$qLܺ+T9>%w	(vI-'@p!R0̯Tֆ~S`o՜k7N`
+	ewϣvSq[5%aantjD9vN,i+}7&GFCwx0Aq
+}u^[,=wGGFs%?<z#SP䉯d\W	h	"TYfBogVK&z#hn2C~罶܁х[dtUVyAyP(<J4e$,˲"?՗~vd8>lJ#3.Z/ɢGP7
+4A&?e]tKtV;x/^u,<a i qo9@'k6ڙmvPr69q#M8d4pyB̧5'	Ρ{B&	/k0w'ͩ95z$AaJ
+lM@`b(. Tдh#nB)L)]
-
+&/I)xMQ!Stb梗g>`yXXyT]>E9}u
rʏQ+xk?-N=Q*eKdm:{7bVN3,qaooyRv;8Fƛ+S
+UT:LH	k%Ɓl%qZh$	gxF|쿡TAItR<Jo>JvHn4zt,*.BM^:6J(,ӵ'gWëןh'Y*?0֩MNH֝#UU-QN-Qc*Z$>v	d.<\2.Tlx(:54$}+.Y:*!	4-uڨ Aq!zT9YV-]pB*S#?<PkN%k1mC鹖ׂOtox(O"3Uȗ{{Gp7s)#PLCV)Cfm2H[pq!ة=mG/vJkF@G,LǏYXnS%S%%;J'eZ5;YY4Fzz|62>'F'Tg~}{mr
ݺI\w]Rf^uqը}ufV'	 /FcYܞPRp*KFYjWCs<.УfRAELvl~maURFH]y)[_#w1Q3s&U*6GX͸8'ğt_1m,x+KgTj JK}S`1I Ap,X1mOnYO/*]6=e0eHre/O'
R@?ӯvk##XrX~6Cuib99Y |0rǩcG+#)\W}gh۵fۛ
WU\6ulykC&^oty-vۉ'^Li6[Ըpes↥yYq	,੓ԍwB݈G"<"YBNpW5ԍ}zg<׾V:oKC?*M:\̷*_?֗3QmKm*|pfchVɨٲ}vfʏ1s=C:	2,-,ZOOw_ peEUXC:,r酕[6WڜB[l먩gH&̓-[ kUQ%*SlG$sa7n;I=	v`qQ@gRA/
+-u:6j&N͐ ^,
+L15X}]"Zř 9G vz_!"R-
+zUv',C4H&
f6`׬orzHZQ~@D@-RJ~G8P6A~  z^ó2$DKs^S|y *-cw\e@|1BfVwmIA"jPmUy^{OU(a,͡8mw'2)
b~3?W(B]D25G82?̉u5fg~8Jѐ[Y-q|14.D*t86hǎN>fh0Cw]|VEN]QCS`PԺ6{q6YA`}ޮN41j|-|F IFzhҌ޲v15s)W6^uR[Es|gC&& 
MO8rM!0EjcHn}sw'~+o0GClo
fєJe&
hJz<_ݛ%aݫE+'p2ʧ7V(Ɲj;	=mb/@ͬnN#D~\W)\vF-*qnY]&-ًkJN0"hFTZm
۪3	owTvhvcvZ76%<A~ꎀhQ]?S3gy5/.,2`/ק@jF@ ՖfUQFC-2)*Yirqq:se*IuQdp.C3j>F:^dFK)z*H=-[`ɩHʲ˱ik_.6
ހ]ϛ_y@$.aژo7xEcG(Ynͥ]A-G7qH*6P^,/\(T:$v2ob(-O*|Pg~q.Ƽ>荝N9f(eh\F8#7ބ\ZN]{»# @{pZ(y*L*g;Tx]ި,f最NH	=E([3RBUi$"nE$~\u9{dgVי}177_u\G
+dHD]'	e3!o9̉2k^
Y;F!y^CgC۾㪳\8=FOzxh$-xP~;6yVs|aUn!|;!+.q9'$>4U`'R
s'[1T(Zȋn\:?-a¯8˳;`zDт<^æ0hx#w8i5j.|Ei{
=	$zїVz :ڵ6X˨0^p{/4{GE8#C}"ڊ`EF_,d8ͣ!' (p\.fk+j~ԏ2w>7v\"p%":߸څ|>vM-˅ 幃.@Тeog]"w@){]x;_ld.Q? 7R/_{Ƒ΍xxU/T'/^kӸ}g39<T@ou;I
+fi={쳵>b鍫:2&l٦t	m<omA,uMo2y+H/HUImCV@KO~˃&M<c2iZk~i9([#/d؃Z0a2v>Ž515Yo1ydb=>~Bс-Y&%mtL!b̙0
cqs7Az HAĳcݹFP(]kNDG4fc&wkLuLekR=Q)8~l\
+
+!B`0% T#I2v+lξ})A4
keGq?Fcu>W\oi


 *@zn(Gt:2~珮Ɩ-Ю(1kE"85LYsp*vv"WƸ?>5F{q~VuuY&أH5;IЈ8>-ĸL9, tXCArc?=[_w 0vvX?=ˍ|Ljt+& '[BW;v5?j
]pdi,Kxd* +K}yFap6.hbiM!pNlEȇ?l8f-U8b&㺁T"_ҷfxxrrӦ̅F\Mg5}|@|sj˻tM{X>S+LƄ#cESxs,`  sz֘Ij$Uhar
+s5C_	J*h9dSςBi*!FD0s}Z욡|,[F{RZ?N3n'ݻk:
+)p<ueT O1(beΈZg 0
GwQJ(jn7_5{Q5p+Y_UY}~1
-Tgzՠ;>cЃn5l
+hEl1Cy.@So+qD-R pSiiiU| :#6~]̫DVc팦`UkkuQTڱwqE g-QL\!
+̕ <.UF}4=\̶ؙ+>Ya%_\E9ȿz_PQO=j7AJmwҞv[@ٸ]ŹYɜ[.͛8IlK7dRlZ6E'shZ|גijN|:a4=+=bsVvvq֍a5Tؒ(%=iUӹ=u(AxwKj	{F{~6x+-:L>%Ɨ%t`u&QinM\*c*ѱJZ]j׀ncj}#	 c	*}ǏP#yk?FDuJ 	du:tPqkf`#2ۃ  	@W.Z]	B1a9]UIKp 6ý(8*!խhE>nj=3^3HmbZXz<mo]J"餇ЂxRZHm2k5)sGE8
+Tn:"9@3H^6hV~gsm	ۥJwhֹf1r7
+}qᰑ1qHĳ%6~V>LIu9$:XB{'s,cÄl9ҕr"']rwЁMc4|3M+}>cٕ@wx1bZ})|$s,LhͲUJعXJڵ' ܌%ٵxtud0Gp'eXW'2zUkXv@Vf{d!m|JGD.H^膀L;gd7ê:ܞp;i*A9O`ܣ߸iytGV!
RxxGuI(.$wmY\vcLyY&	z:{ (_wHyh	9V7'4Ei khL&
+7||^/ q[3ӳ4ċgH-fԁW$sأ?I%nҧ=Nw#ajo5{=~Y K[,oq;qX]fffɨ٠_mcWHOjM!^w 3:m#M[GYk=MM4]\[+ gxsXµ9NFW	onnv-2:I	w
+A8zxUDq"y;8}5=>#:Y:N
+ů_o)9!Sh(DA0=l@R9]̈
+Xh3gЧ0u0e^Zp$*V֥MяK'1$U
$
++~<B-ID)(E]u]}g^ƍZF/]3	8/i<_qPPBVuoi /]
+I&iQ%2T͟4N#UzH/IAo+;ֹ_OG[6#'ue|YS[0~4ĿsFdBHrrjQk]v~֌uvJdӲveP1醆>dUDZJэQ)z򢁴zq#'qc>l{_IZ]#A֥AlHc=BL7=4ȇm\U^
fqE,qy@"GRF|уg{=^Rӕ&&cgUNW_ZV%7д6y6X1W
+@_l'vo5>)M`ubbuEqyUF-:cXk\{.;3G/=M(?dHL(n?*Y?RE񁄃A`CrD$i-oohZG(fFiÞ8Liia^PV/ԣ/}3㎸b뽣xjq="܂=qD=/I(GS]0,lҐQ!q~L0?=ikmG',Y] d$a/ås^P-77/(n*OWQ XsVNVCTu"\C^
k]SQKed`݃ 8ŵ\Dn#scb];NqKmQπQ;K}#b8eGd\Ҕ>iq1@\htD1eH@_wU􀃈`K/(2)Zanӈ$kU2wTցC(ΒGW
+"Keq;+grK=*hqp{hwίEfov2	pǅܖnKAH-֭7<BHh/4Е&1
+;B\iMt%dRzkn6fH>kta'`oXG$&Pw-+qE쐄Rpe<{,hܧ3<?[m:-CR[Ҫ^3~emN0=`cB	(jȋ&=*_Hm'6Jib4.':Q;}UL=v1`,klsWVGϴx?z2wy$mwe9]Q*l>-w"]=#hv{hMr#o42{Kk
QU7"$t71mt c}J|9NG;ЦEv61
_GEs픐eXnnvCr_Z

]­hR,]}NR[LYGZzJƦx6׿ɒ94i
G;%#Imǿ
?u7glZx}ofvZM^Bj*C({g(jhJox&ۃ҇dBDV1WHo]Wx5B7AFGEp#9+?(B\LO%%4"
+ӹA^Vyѹ&	0i,/$p[f폯\>.޷O~8+!1
+E4/ f8?r+sdqz;uީ\-3'#) obնmU`c܌je/]@/}BEͼ#ؽsN}>!X:03D1tCV8xco ]O\{`=DC}#,"O8r癓m/]/{	!#mXs Vɽp,>||fޏLfy~c\{E_]ko
ѹ
zz燯t@	]/+倾?DpDݲ\Řؖ'Z_dmZUm*6fQzA5O~	Aܼ\ѕȗƵ%ʂ㊛ػg+3JxcSUlxg̢N~G"
+hd+PPcߖF~ܿڂ&n	v<yF|̏sKkW59:5ݴsrݾP!U=!#O';Y7}*omΚ˿-OO0Ik-,蝦vikܺݻmV4w)*V	==>{Z{A ĻY&nQ!9s]/7ڭܩ>lH\҇|d{e;R.:רwU'2xޢ1r:V0FˈuNH?EFgqմC[jn9x:7sDtOI -W 3"M"|6Kc_ARBZ~VcEʓZ+6lXZ?_
+]Tްt Lѳaw{aű,qwJu{ÛqڄꜶVզ:a7j7Of5C"3c,
+K:܍^ݷm{st|v[]VѐMGa>`l*O7W0fځ@nyO8r>pu\Pܭ--~I%@".
+NPy]V5'hSa07eZu_gC֛&T.*6*]vꔢ\>KWl
+Ucb+q"T85ZJtzk\ Ve5sw pc%Ɣ#&Y9xEE(&hUiMH߳.Z8r9,;<#h]-iZ'>ӳsm˶muխWD>D-K
+tOxxN;<zk@OzzUT4iS_N.m=GUh{=U}>:8PS8,EFp4ӣ19<yIDo'--eUVc_\Kb/҃ӰR@2#Ui]SB2`B W#(VӤC'SU њI'w۔?#8>NpbHjYM+
+"jRY411=e&o>"4rΟ~	(Kկy?{q#q癝QnDqCI%BG?BiDYh~Նfֿl%"L?\jcS+UjtW^YQyL-7U{]3>攐w[; "`UY:cxFF/D	o_U	b$MF*.5du~-+*pm`y^>9..s} GUքjoɂ
übpY
+{W	6s6zUy[(=0,gDۀA{%"{Il=^5;L'12I+>YM׽)Z\ut}ہ,]*llFfԆ'6<nC.9Տ;%@~)%Ǭdo}fQS
+U7b֚@@mB?#џtBP6Wf:	bGa`Yo3z+$RE_*X{Pp%-ً.ֿͦ
Ң}qSlIH.]qhNW-38ՍY?:wwvg6D[U(ߵ׶UJWx%d\Y
+3<;8 (G L#^g}\a؉s99۶P:l4)sF4>r.:rqq+ܨ~uH"/$4NK	{+rv8r|mnOÁ0#4[O
q6F0汦?XDSJ{JSrNSXnaBB+ZXdd @3\r})tR@MlKj*sg|@@19Ó(OoDsm"luϬ	CCs~"O4u}9H	N!VeAϟh00.Nlj{}8
tMhRTKPr:^WJD \''q\

7ã
xNtq x{pz|9!̥C?Tњc8E
+*u&SDO9PT-e_ts[8SAzGt*ti!;8;>6K]W*4A_CQ(>XRjkz?r45fvY..y	An{;G3V!ĳY{
Ju2M-1H4_bq<|n(|d0VQr3OL/Ci*
+ ߽C2_6!MPN.nTpG<@dv嵨r9}V~L6r2x]:sHρMQOQXHA5w-p,2fDoc-x`oݵcvݤ2)C;CUo$zv-/[E=Vk-"gR|HJ
wX}]os$|3 |a>>143R\E7-gX[l\Q	>*+@ &u5#"
+14
+i6;r.|uZK2QApycNMY]Af,j^I
+01{KPf{}	%D8ľ>~uH]i"K͑gut٠4Ԩ\0u BXH]Ec21?vz"ee|̷/ +o}}9tޤs)=jxqRȴHM|dBN mV"\r沾5݃|ƈ>½jc,)Y\	Yp:*-C$v7z`}tuKeXW@<Qķq-Ȝ<ϼ8P)Q[LVvnD"mS$H;}%H6EZ< ѷ+vNAʻYT!NOWwA6&T@BoCl\0`!o<RkJNr5]N0g[u >4c `һ)ae]F+!{+ ##jq	P@Dq?`xftQj#S 
+h( YfTN/dZ9Ȉe=ʊeϟƏ@o-į5iQ6qh	êA
+~͊>lֶ d+^+"4Ϋ<UUdP3Y.4QdK?
nkɤV=ߟHbR.6<#TDppe⍲r{O7@IHS;8ƇJ:'m7b=;[5ҷz-`t=|2Du2 F'LqexF@:eZBLoo}oC3pZHCaiUed0هܘL7 IM*HqestRtm4h<yX`DX#|wT('>5E :v_O8DRϜ<
ħ}]
+;'^R.d=c}Rw? |bµ=[j
u o-3
$;8۹=d|&OogdStC&5)\H6&KB6(mMw׋Ň9%U'D)۳`JƪRLH |UP냘Օhr<[BUqoafDoSx蔼2ud
+
=%@3TbXvED\{@4Yʅ=WHմ
+5eX__ɺ؂n=FKnR<. ͸yH$+tY1?XX|_DZ"!P/MПLPn;W챎~Ng+S(0oRnJ{j* ;[x^bF
ܡ=^R2Lov30MGP0&Mwz@4ȠSWgg,ӘГ0C}}7\;`l
+"F.&?o*tZ^09GT~ok?a VSv[(托*vg~oA_7<GH[2LJ0'E5gsڄ	** K4Lr/,d_	I\)qR8s'ۦ?tWWRw_-杻S)P04QXc)Fo%%7w$?+L(^ΗoK꼡<&mc7bHZ2'b붠hr+nSXj
6c%þԌ'M	?VdH߸f
+:pWZi'S1ÿd=6~W5.8s6rm*.,ӝ/HL 1Xt4vrVUܞJ8nׁ©7.BFp:}=BZ?6[DZǻЧ>L#	M[0H@`!	2T䛄t:~k}CD݀1|újk]h!D[=4/;sq}~ndfvT4+*<P՝{>uSGIvy.d_eYT}ۥҐه4(|ON<J{FIIMs.N{ˋ&NZF}<kac	yhΌ
+EVɡL'hR47XiS~5&)RQZy	lS_+Ad~E+*ďߩ,94z-IoAbaopSˊ#MM׭m]ZSEWڀ7%kMMY1ܴwPڒ_Vӕ5TcG&@Z[Ĉtf1L~#YX<~rCMُ!˘Ryb͙˃?h2B16 aKkG0ѵ`m~3SRq~uBw\Z_)qDi2q*xGȨN}ŭzM .^`:K~^)?!q
+Y>bE5U>C HBr- x"vFI_VQCXij'lxd>ދVM  xz(dъ{!CU"d	| tof/JH{g
+
+"Z0#|,K&;+
+뻛E+ZzZxrQBtaEu-dk9
+!.Uxڨi96%a7UmH~(Fm[I1NI"VWwc5Z1EacOޫ2+i˽{6MR2g0G؁w]KI3m~aÊA;8n4ǖ|a0?v{e%("$);QO@*J"uN,/ߗ[tY8 %Z[q^cB"FIpMbɝgZAη;xɳEмÐ<?k{esNZ/neij-?Mhhf@\2_p?-[V@Cs/AL
+{iGw3jӆ*MVAT5K4BI{T)۴ɣY$0*ٴ}B'xD1E1Hf'pS@q.e/nϯQt+3<κ
y!XEc8s*2(:촐C[-V[sA"yˈeYHۓs"7 ëp4wni,8u$J:B૛(8um悹
+=vEiXOgvI; <[-q'b {s=3/ T1ekd1VdBräX"N
+TxKffdwHV'arUEuNI4=dIw'nB
9&R֧oOT.++ddY<O/gȧz/7na1S7Wd$kBbE'+
+v돻ڍj]F-JL*N7K0"H?[ϒAϗVWEwxh{t~=1
jמgBcTX}+E#Ny9H(fL
+rՋ74|i8_ fJ%)EJ b@%z'rQk%W=_tOBa4>}PD|rC^o8|Iբ'/6C7вaTEjR\uh{TM\[G\+{@p{HqAeKn/& k_{;\dzocKQUCC7;a/CWszFc뿋;ߣ)$U fUnLNRov/
::Ε졸{-
+2]MD_Rns @u"*dP$So#=_IJ$GDfVo	jU*{3D<EB-W<N) (أ8A~3Z,>gV!/0}#R|`v[НT6"X$[It	KҠLZ/$.lߤDL2+Ǧ<2ī؝ߓ&Ak-}_1o6cBF2%)S+d10H)f'E]t|YB+(wt$_@:X݈? ,n,=>ݒ2*OӘf	9\K:G;{EltHP`PqlV2IR~g҈
+*_\pd<z Ԍ嘢9'04آ{]hת{L0Q<Ku@eyQ(΅Qe,|Sa)K KueKq۸8_hCs30B]Zi3J>u1DY%,P/=p=b-tBhI )>Nxi<k5-3/{f8S
+ccAKjiev>B knKkKZЉ~}s@Z[CyZJ`pנ nC9hS&2=+ b-fʾ99}m8a}@)9Kҳ´sv %uq-
+%`B]:h_ [<,,`}LHhcR10fkrEbHkRZyM|}dCe}uY68jB)a 9'(c~l*ۭ;O@S,Ng5vlNk<ظE
+*'ZN{PT3` `/m/fR6P.f`-omжʶŶ*5n{:kU^!ꕯzTo|nblq~xH_0cΚh)=Lu7ፗx.}?đ_z d Xb8 rW㤡l:t%C]Hw
+g44tw@5OH N)99܏n3=^r	%]|qs?(K,ɼ,ߐYZcdFfԩ?՘_Ep BoO>I\dM2=i8 B*m $ae08Bc8<H"S4:%./LPNo0kfނN? B0b8AR4r JjaZz~FqfyQVuv0N/v<_A(B*mAIEYM8˺y4CL -Vt=^ !AIH,
+Jl08Bc8<H"S4:bs<@(KBRk:h2[6rsDz? B0b8AR4r JjaZz~FqfyQVuv0N/v<_o &q!6 $,ϋquۏi·r).! 2.:(N,/ʪnڮi^m?~
+#(4$2J3,6"D*+punڿ.6Oi+[mٶֵ͇`_IeAvEM ry"傶j@y~̮(JȎ__gW~bg|!17;uݺC=LPcԸ^ho/
s8P=_B<󂠽a0<ٚ&i`Oˑڅ0x[w{{\v96xT.0 Rt0;L^JQ)>lgOfp@VMƯV5mcJDi;$`1mDӒiFQ\&kȸ% h58z2B8_ qT9
k|9{IhrAq2n6à7dΥ׌ϊi)·z[xDGQ =1:]?7n}a3年Po[#u}s7E75h>q
++޺0'^BępW.duKvFjkEBDmޠ/D]s)-@RD90YD~G+-"91AįIua-3%J>FavշCsE-;P!M|bL˸zK)
+c0sETe@l=lKo$:䦣ԉ_9vYc}jj	#ѬM[
+8Uhlnگb?fG?<q;K+@S\[,^GuguPRQ<dZDxnؘU-:(e#:'itJgoikic%Sb.+]`[8KYQ}>;/v3*K~k%2Ր#ſ\lհCa*.1ۉhLR5Yp;uN#$a K49_CxuzN))]y+̆zramhNmqؕ >4K1#tL:Q/T#@qD?Ok,{9
+?ES⹑s`.	\ܔBM
Lwd:`9&fǖl
>8H?L H C%h9_-}a#war%(\2nD[G(jz.c߲&,t{ΌR#c:+\7/	NK;Cװ~S9!Ż&_{K@qpwO,)!ðZY&JU?FT'8q=+8D4`WM{L4I?Uh~	V
+TF	G(u8	rHW5vHOgv_`T5+mU([XQMXYVJZb
s)wO
+ۥPX!H~lֳO4_}>wثѕL<56V.K.vl0מյ]wk%7$juIk"ejk*7D)ک<կ67tHYMc	KHO$/ҚO&,o./2qXodIe濜ʣf?z(6ǷW?rՊjH[~BS .{>t"p0=gg90uymΦzo P	TD2G}y(J#v:&/f:C
 qsTzk9n
4kǾ\%Zkޣ1葤b!f)"  *)QgTiH"RJ)Zkc1  @5  g@LOQ"AŁ33Zkmw~Dq.G`чStpӻW
\ No newline at end of file
--- a/assets/javascript/core.js
+++ b/assets/javascript/core.js
@@ -27,7 +27,10 @@ phpbb.isTouch = (window && typeof window.ontouchstart !== 'undefined');
  */
 phpbb.loadingIndicator = function() {
 	if (!$loadingIndicator) {
-		$loadingIndicator = $('<div />', { id: 'loading_indicator' });
+		$loadingIndicator = $('<div />', { 
+			id: 'loading_indicator', 
+			class: 'loading_indicator', 
+		});
 		$loadingIndicator.appendTo('#page-footer');
 	}
 
@@ -958,12 +961,6 @@ phpbb.addAjaxCallback('toggle_link', function() {
 	$anchor.each(function() {
 		var $this = $(this);
 
-		// Toggle link text
-		toggleText = $this.attr('data-toggle-text');
-		$this.attr('data-toggle-text', $this.text());
-		$this.attr('title', $.trim(toggleText));
-		$this.text(toggleText);
-
 		// Toggle link url
 		toggleUrl = $this.attr('data-toggle-url');
 		$this.attr('data-toggle-url', $this.attr('href'));
@@ -971,8 +968,14 @@ phpbb.addAjaxCallback('toggle_link', function() {
 
 		// Toggle class of link parent
 		toggleClass = $this.attr('data-toggle-class');
-		$this.attr('data-toggle-class', $this.parent().attr('class'));
-		$this.parent().attr('class', toggleClass);
+		$this.attr('data-toggle-class', $this.children().attr('class'));
+		$this.children('.icon').attr('class', toggleClass);
+
+		// Toggle link text
+		toggleText = $this.attr('data-toggle-text');
+		$this.attr('data-toggle-text', $this.children('span').text());
+		$this.attr('title', $.trim(toggleText));
+		$this.children('span').text(toggleText);
 	});
 });
 
--- a/assets/javascript/editor.js
+++ b/assets/javascript/editor.js
@@ -111,7 +111,6 @@ function bbfontstyle(bbopen, bbclose) {
 	}
 
 	textarea.focus();
-	return;
 }
 
 /**
@@ -167,7 +166,7 @@ function attachInline(index, filename) {
 /**
 * Add quote text to message
 */
-function addquote(post_id, username, l_wrote) {
+function addquote(post_id, username, l_wrote, attributes) {
 	var message_name = 'message_' + post_id;
 	var theSelection = '';
 	var divarea = false;
@@ -177,6 +176,9 @@ function addquote(post_id, username, l_wrote) {
 		// Backwards compatibility
 		l_wrote = 'wrote';
 	}
+	if (typeof attributes !== 'object') {
+		attributes = {};
+	}
 
 	if (document.all) {
 		divarea = document.all[message_name];
@@ -213,7 +215,8 @@ function addquote(post_id, username, l_wrote) {
 
 	if (theSelection) {
 		if (bbcodeEnabled) {
-			insert_text('[quote="' + username + '"]' + theSelection + '[/quote]');
+			attributes.author = username;
+			insert_text(generateQuote(theSelection, attributes));
 		} else {
 			insert_text(username + ' ' + l_wrote + ':' + '\n');
 			var lines = split_lines(theSelection);
@@ -222,8 +225,61 @@ function addquote(post_id, username, l_wrote) {
 			}
 		}
 	}
+}
 
-	return;
+/**
+* Create a quote block for given text
+*
+* Possible attributes:
+*   - author:  author's name (usually a username)
+*   - post_id: post_id of the post being quoted
+*   - user_id: user_id of the user being quoted
+*   - time:    timestamp of the original message
+*
+* @param  {!string} text       Quote's text
+* @param  {!Object} attributes Quote's attributes
+* @return {!string}            Quote block to be used in a new post/text
+*/
+function generateQuote(text, attributes) {
+	text = text.replace(/^\s+/, '').replace(/\s+$/, '');
+	var quote = '[quote';
+	if (attributes.author) {
+		// Add the author as the BBCode's default attribute
+		quote += '=' + formatAttributeValue(attributes.author);
+		delete attributes.author;
+	}
+	for (var name in attributes) {
+		if (attributes.hasOwnProperty(name)) {
+			var value = attributes[name];
+			quote += ' ' + name + '=' + formatAttributeValue(value.toString());
+		}
+	}
+	quote += ']';
+	var newline = ((quote + text + '[/quote]').length > 80 || text.indexOf('\n') > -1) ? '\n' : '';
+	quote += newline + text + newline + '[/quote]';
+
+	return quote;
+}
+
+/**
+* Format given string to be used as an attribute value
+*
+* Will return the string as-is if it can be used in a BBCode without quotes. Otherwise,
+* it will use either single- or double- quotes depending on whichever requires less escaping.
+* Quotes and backslashes are escaped with backslashes where necessary
+*
+* @param  {!string} str Original string
+* @return {!string}     Same string if possible, escaped string within quotes otherwise
+*/
+function formatAttributeValue(str) {
+	if (!/[ "'\\\]]/.test(str)) {
+		// Return as-is if it contains none of: space, ' " \ or ]
+		return str;
+	}
+	var singleQuoted = "'" + str.replace(/[\\']/g, '\\$&') + "'",
+		doubleQuoted = '"' + str.replace(/[\\"]/g, '\\$&') + '"';
+
+	return (singleQuoted.length < doubleQuoted.length) ? singleQuoted : doubleQuoted;
 }
 
 function split_lines(text) {
--- /dev/null
+++ b/assets/javascript/installer.js
@@ -0,0 +1,615 @@
+/**
+ * Installer's AJAX frontend handler
+ */
+
+(function($) { // Avoid conflicts with other libraries
+	'use strict';
+
+	// Installer variables
+	var pollTimer = null;
+	var nextReadPosition = 0;
+	var progressBarTriggered = false;
+	var progressTimer = null;
+	var currentProgress = 0;
+	var refreshRequested = false;
+	var transmissionOver = false;
+	var statusCount = 0;
+
+	// Template related variables
+	var $contentWrapper = $('.install-body').find('.main');
+
+	// Intercept form submits
+	interceptFormSubmit($('#install_install'));
+
+	/**
+	 * Creates an XHR object
+	 *
+	 * jQuery cannot be used as the response is streamed, and
+	 * as of now, jQuery does not provide access to the response until
+	 * the connection is not closed.
+	 *
+	 * @return XMLHttpRequest
+	 */
+	function createXhrObject() {
+		return new XMLHttpRequest();
+	}
+
+	/**
+	 * Displays error, warning and log messages
+	 *
+	 * @param type
+	 * @param messages
+	 */
+	function addMessage(type, messages) {
+		// Get message containers
+		var $errorContainer = $('#error-container');
+		var $warningContainer = $('#warning-container');
+		var $logContainer = $('#log-container');
+
+		var $title, $description, $msgElement, arraySize = messages.length;
+		for (var i = 0; i < arraySize; i++) {
+			$msgElement = $('<div />');
+			$title = $('<strong />');
+			$title.text(messages[i].title);
+			$msgElement.append($title);
+
+			if (messages[i].hasOwnProperty('description')) {
+				$description = $('<p />');
+				$description.html(messages[i].description);
+				$msgElement.append($description);
+			}
+
+			switch (type) {
+				case 'error':
+					$msgElement.addClass('errorbox');
+					$errorContainer.append($msgElement);
+					break;
+				case 'warning':
+					$msgElement.addClass('warningbox');
+					$warningContainer.append($msgElement);
+					break;
+				case 'log':
+					$msgElement.addClass('log');
+					$logContainer.prepend($msgElement);
+					$logContainer.addClass('show_log_container');
+					break;
+				case 'success':
+					$msgElement.addClass('successbox');
+					$errorContainer.prepend($msgElement);
+					break;
+			}
+		}
+	}
+
+	/**
+	 * Render a download box
+	 */
+	function addDownloadBox(downloadArray)
+	{
+		var $downloadContainer = $('#download-wrapper');
+		var $downloadBox, $title, $content, $link;
+
+		for (var i = 0; i < downloadArray.length; i++) {
+			$downloadBox = $('<div />');
+			$downloadBox.addClass('download-box');
+
+			$title = $('<strong />');
+			$title.text(downloadArray[i].title);
+			$downloadBox.append($title);
+
+			if (downloadArray[i].hasOwnProperty('msg')) {
+				$content = $('<p />');
+				$content.text(downloadArray[i].msg);
+				$downloadBox.append($content);
+			}
+
+			$link = $('<a />');
+			$link.addClass('button1');
+			$link.attr('href', downloadArray[i].href);
+			$link.text(downloadArray[i].download);
+			$downloadBox.append($link);
+
+			$downloadContainer.append($downloadBox);
+		}
+	}
+
+	/**
+	 * Render update files' status
+	 */
+	function addUpdateFileStatus(fileStatus)
+	{
+		var $statusContainer = $('#file-status-wrapper');
+		$statusContainer.html(fileStatus);
+	}
+
+	/**
+	 * Displays a form from the response
+	 *
+	 * @param formHtml
+	 */
+	function addForm(formHtml) {
+		var $formContainer = $('#form-wrapper');
+		$formContainer.html(formHtml);
+		var $form = $('#install_install');
+		interceptFormSubmit($form);
+	}
+
+	/**
+	 * Handles navigation status updates
+	 *
+	 * @param navObj
+	 */
+	function updateNavbarStatus(navObj) {
+		var navID, $stage, $stageListItem, $active;
+		$active = $('#activemenu');
+
+		if (navObj.hasOwnProperty('finished')) {
+			// This should be an Array
+			var navItems = navObj.finished;
+
+			for (var i = 0; i < navItems.length; i++) {
+				navID = 'installer-stage-' + navItems[i];
+				$stage = $('#' + navID);
+				$stageListItem = $stage.parent();
+
+				if ($active.length && $active.is($stageListItem)) {
+					$active.removeAttr('id');
+				}
+
+				$stage.addClass('completed');
+			}
+		}
+
+		if (navObj.hasOwnProperty('active')) {
+			navID = 'installer-stage-' + navObj.active;
+			$stage = $('#' + navID);
+			$stageListItem = $stage.parent();
+
+			if ($active.length && !$active.is($stageListItem)) {
+				$active.removeAttr('id');
+			}
+
+			$stageListItem.attr('id', 'activemenu');
+		}
+	}
+
+	/**
+	 * Renders progress bar
+	 *
+	 * @param progressObject
+	 */
+	function setProgress(progressObject) {
+		var $statusText, $progressBar, $progressText, $progressFiller, $progressFillerText;
+
+		if (progressObject.task_name.length) {
+			if (!progressBarTriggered) {
+				// Create progress bar
+				var $progressBarWrapper = $('#progress-bar-container');
+
+				// Create progress bar elements
+				$progressBar = $('<div />');
+				$progressBar.attr('id', 'progress-bar');
+				$progressText = $('<p />');
+				$progressText.attr('id', 'progress-bar-text');
+				$progressFiller = $('<div />');
+				$progressFiller.attr('id', 'progress-bar-filler');
+				$progressFillerText = $('<p />');
+				$progressFillerText.attr('id', 'progress-bar-filler-text');
+
+				$statusText = $('<p />');
+				$statusText.attr('id', 'progress-status-text');
+
+				$progressFiller.append($progressFillerText);
+				$progressBar.append($progressText);
+				$progressBar.append($progressFiller);
+
+				$progressBarWrapper.append($statusText);
+				$progressBarWrapper.append($progressBar);
+
+				$progressFillerText.css('width', $progressBar.width());
+
+				progressBarTriggered = true;
+			} else if (progressObject.hasOwnProperty('restart')) {
+				clearInterval(progressTimer);
+
+				$progressFiller = $('#progress-bar-filler');
+				$progressFillerText = $('#progress-bar-filler-text');
+				$progressText = $('#progress-bar-text');
+				$statusText = $('#progress-status-text');
+
+				$progressText.text('0%');
+				$progressFillerText.text('0%');
+				$progressFiller.css('width', '0%');
+
+				currentProgress = 0;
+			} else {
+				$statusText = $('#progress-status-text');
+			}
+
+			// Update progress bar
+			$statusText.text(progressObject.task_name + '…');
+			incrementProgressBar(Math.round(progressObject.task_num / progressObject.task_count * 100));
+		}
+	}
+
+	// Set cookies
+	function setCookies(cookies) {
+		var cookie;
+
+		for (var i = 0; i < cookies.length; i++) {
+			// Set cookie name and value
+			cookie = encodeURIComponent(cookies[i].name) + '=' + encodeURIComponent(cookies[i].value);
+			// Set path
+			cookie += '; path=/';
+			document.cookie = cookie;
+		}
+	}
+
+	// Redirects user
+	function redirect(url, use_ajax) {
+		if (use_ajax) {
+			resetPolling();
+
+			var xhReq = createXhrObject();
+			xhReq.open('GET', url, true);
+			xhReq.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
+			xhReq.send();
+
+			startPolling(xhReq);
+		} else {
+			window.location.href = url;
+		}
+	}
+
+	/**
+	 * Parse messages from the response object
+	 *
+	 * @param messageJSON
+	 */
+	function parseMessage(messageJSON) {
+		$('#loading_indicator').css('display', 'none');
+		var responseObject;
+
+		try {
+			responseObject = JSON.parse(messageJSON);
+		} catch (err) {
+			if (window.console) {
+				console.log('Failed to parse JSON object\n\nMessage: ' + err.message + '\n\nServer Response: ' + messageJSON);
+			} else {
+				alert('Failed to parse JSON object\n\nMessage: ' + err.message + '\n\nServer Response: ' + messageJSON);
+			}
+
+			resetPolling();
+			return;
+		}
+
+		// Parse object
+		if (responseObject.hasOwnProperty('errors')) {
+			addMessage('error', responseObject.errors);
+		}
+
+		if (responseObject.hasOwnProperty('warnings')) {
+			addMessage('warning', responseObject.warnings);
+		}
+
+		if (responseObject.hasOwnProperty('logs')) {
+			addMessage('log', responseObject.logs);
+		}
+
+		if (responseObject.hasOwnProperty('success')) {
+			addMessage('success', responseObject.success);
+		}
+
+		if (responseObject.hasOwnProperty('form')) {
+			addForm(responseObject.form);
+		}
+
+		if (responseObject.hasOwnProperty('progress')) {
+			setProgress(responseObject.progress);
+		}
+
+		if (responseObject.hasOwnProperty('download')) {
+			addDownloadBox(responseObject.download);
+		}
+
+		if (responseObject.hasOwnProperty('file_status')) {
+			addUpdateFileStatus(responseObject.file_status);
+		}
+
+		if (responseObject.hasOwnProperty('nav')) {
+			updateNavbarStatus(responseObject.nav);
+		}
+
+		if (responseObject.hasOwnProperty('cookies')) {
+			setCookies(responseObject.cookies);
+		}
+
+		if (responseObject.hasOwnProperty('refresh')) {
+			refreshRequested = true;
+		}
+
+		if (responseObject.hasOwnProperty('redirect')) {
+			redirect(responseObject.redirect.url, responseObject.redirect.use_ajax);
+		}
+
+		if (responseObject.hasOwnProperty('over')) {
+			if (responseObject.over) {
+				transmissionOver = true;
+			}
+		}
+	}
+
+	/**
+	 * Processes status data
+	 *
+	 * @param status
+	 */
+	function processTimeoutResponse(status) {
+		if (statusCount === 12) { // 1 minute hard cap
+			status = 'fail';
+		}
+
+		if (status === 'continue') {
+			refreshRequested = false;
+			doRefresh();
+		} else if (status === 'running') {
+			statusCount++;
+			$('#loading_indicator').css('display', 'block');
+			setTimeout(queryInstallerStatus, 5000);
+		} else {
+			$('#loading_indicator').css('display', 'none');
+			addMessage('error',
+				[{
+					title: installLang.title,
+					description: installLang.msg
+				}]
+			);
+		}
+	}
+
+	/**
+	 * Queries the installer's status
+	 */
+	function queryInstallerStatus() {
+		var url = $(location).attr('pathname');
+		var lookUp = 'install/app.php';
+		var position = url.indexOf(lookUp);
+
+		if (position === -1) {
+			lookUp = 'install';
+			position = url.indexOf(lookUp);
+
+			if (position === -1) {
+				return false;
+			}
+		}
+
+		url = url.substring(0, position) + lookUp + '/installer/status';
+		$.getJSON(url, function(data) {
+			processTimeoutResponse(data.status);
+		});
+	}
+
+	/**
+	 * Process updates in streamed response
+	 *
+	 * @param xhReq   XHR object
+	 */
+	function pollContent(xhReq) {
+		var messages = xhReq.responseText;
+		var msgSeparator = '}\n\n';
+		var unprocessed, messageEndIndex, endOfMessageIndex, message;
+
+		do {
+			unprocessed = messages.substring(nextReadPosition);
+			messageEndIndex = unprocessed.indexOf(msgSeparator);
+
+			if (messageEndIndex !== -1) {
+				endOfMessageIndex = messageEndIndex + msgSeparator.length;
+				message = unprocessed.substring(0, endOfMessageIndex);
+				parseMessage($.trim(message));
+				nextReadPosition += endOfMessageIndex;
+			}
+		} while (messageEndIndex !== -1);
+
+		if (xhReq.readyState === 4) {
+			$('#loading_indicator').css('display', 'none');
+			resetPolling();
+
+			var timeoutDetected = !transmissionOver;
+
+			if (refreshRequested) {
+				refreshRequested = false;
+				doRefresh();
+			}
+
+			if (timeoutDetected) {
+				statusCount = 0;
+				queryInstallerStatus();
+			}
+		}
+	}
+
+	/**
+	 * Animates the progress bar
+	 *
+	 * @param $progressText
+	 * @param $progressFiller
+	 * @param $progressFillerText
+	 * @param progressLimit
+	 */
+	function incrementFiller($progressText, $progressFiller, $progressFillerText, progressLimit) {
+		if (currentProgress >= progressLimit || currentProgress >= 100) {
+			clearInterval(progressTimer);
+			return;
+		}
+
+		var $progressBar = $('#progress-bar');
+
+		currentProgress++;
+		$progressFillerText.css('width', $progressBar.width());
+		$progressFillerText.text(currentProgress + '%');
+		$progressText.text(currentProgress + '%');
+		$progressFiller.css('width', currentProgress + '%');
+	}
+
+	/**
+	 * Wrapper function for progress bar rendering and animating
+	 *
+	 * @param progressLimit
+	 */
+	function incrementProgressBar(progressLimit) {
+		var $progressFiller = $('#progress-bar-filler');
+		var $progressFillerText = $('#progress-bar-filler-text');
+		var $progressText = $('#progress-bar-text');
+		var progressStart = $progressFiller.width() / $progressFiller.offsetParent().width() * 100;
+		currentProgress = Math.floor(progressStart);
+
+		clearInterval(progressTimer);
+		progressTimer = setInterval(function() {
+			incrementFiller($progressText, $progressFiller, $progressFillerText, progressLimit);
+		}, 10);
+	}
+
+	/**
+	 * Resets the polling timer
+	 */
+	function resetPolling() {
+		clearInterval(pollTimer);
+		nextReadPosition = 0;
+	}
+
+	/**
+	 * Sets up timer for processing the streamed HTTP response
+	 *
+	 * @param xhReq
+	 */
+	function startPolling(xhReq) {
+		resetPolling();
+		transmissionOver = false;
+		pollTimer = setInterval(function () {
+			pollContent(xhReq);
+		}, 250);
+	}
+
+	/**
+	 * Refresh page
+	 */
+	function doRefresh() {
+		resetPolling();
+
+		var xhReq = createXhrObject();
+		xhReq.open('GET', $(location).attr('pathname'), true);
+		xhReq.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
+		xhReq.send();
+
+		startPolling(xhReq);
+	}
+
+	/**
+	 * Renders the AJAX UI layout
+	 */
+	function setupAjaxLayout() {
+		progressBarTriggered = false;
+
+		// Clear content
+		$contentWrapper.html('');
+
+		var $header = $('<div />');
+		$header.attr('id', 'header-container');
+		$contentWrapper.append($header);
+
+		var $description = $('<div />');
+		$description.attr('id', 'description-container');
+		$contentWrapper.append($description);
+
+		var $errorContainer = $('<div />');
+		$errorContainer.attr('id', 'error-container');
+		$contentWrapper.append($errorContainer);
+
+		var $warningContainer = $('<div />');
+		$warningContainer.attr('id', 'warning-container');
+		$contentWrapper.append($warningContainer);
+
+		var $progressContainer = $('<div />');
+		$progressContainer.attr('id', 'progress-bar-container');
+		$contentWrapper.append($progressContainer);
+
+		var $logContainer = $('<div />');
+		$logContainer.attr('id', 'log-container');
+		$contentWrapper.append($logContainer);
+
+		var $installerContentWrapper = $('<div />');
+		$installerContentWrapper.attr('id', 'content-container');
+		$contentWrapper.append($installerContentWrapper);
+
+		var $installerDownloadWrapper = $('<div />');
+		$installerDownloadWrapper.attr('id', 'download-wrapper');
+		$installerContentWrapper.append($installerDownloadWrapper);
+
+		var $updaterFileStatusWrapper = $('<div />');
+		$updaterFileStatusWrapper.attr('id', 'file-status-wrapper');
+		$installerContentWrapper.append($updaterFileStatusWrapper);
+
+		var $formWrapper = $('<div />');
+		$formWrapper.attr('id', 'form-wrapper');
+		$installerContentWrapper.append($formWrapper);
+
+		var $spinner = $('<div />');
+		$spinner.attr('id', 'loading_indicator');
+		$spinner.html('&nbsp;');
+		$contentWrapper.append($spinner);
+	}
+
+	// Submits a form
+	function submitForm($form, $submitBtn) {
+		$form.css('display', 'none');
+
+		var xhReq = createXhrObject();
+		xhReq.open('POST', $form.attr('action'), true);
+		xhReq.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
+		xhReq.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
+		xhReq.send(getFormFields($form, $submitBtn));
+
+		// Disable language selector
+		$('#language_selector :input, label').css('display', 'none');
+
+		// Clear content
+		setupAjaxLayout();
+		$('#loading_indicator').css('display', 'block');
+
+		startPolling(xhReq);
+	}
+
+	/**
+	 * Add submit button to the POST information
+	 *
+	 * @param $form
+	 * @param $submitBtn
+	 *
+	 * @returns {*}
+	 */
+	function getFormFields($form, $submitBtn) {
+		var formData = $form.serialize();
+		formData += ((formData.length) ? '&' : '') + encodeURIComponent($submitBtn.attr('name')) + '=';
+		formData += encodeURIComponent($submitBtn.attr('value'));
+
+		return formData;
+	}
+
+	/**
+	 * Intercept form submit events and determine the submit button used
+	 *
+	 * @param $form
+	 */
+	function interceptFormSubmit($form) {
+		if (!$form.length) {
+			return;
+		}
+
+		$form.find(':submit').bind('click', function (event) {
+			event.preventDefault();
+			submitForm($form, $(this));
+		});
+	}
+})(jQuery); // Avoid conflicts with other libraries
--- a/bin/phpbbcli.php
+++ b/bin/phpbbcli.php
@@ -21,6 +21,7 @@ if (php_sapi_name() != 'cli')
 }
 
 define('IN_PHPBB', true);
+
 $phpbb_root_path = __DIR__ . '/../';
 $phpEx = substr(strrchr(__FILE__, '.'), 1);
 require($phpbb_root_path . 'includes/startup.' . $phpEx);
@@ -32,38 +33,54 @@ $phpbb_class_loader->register();
 $phpbb_config_php_file = new \phpbb\config_php_file($phpbb_root_path, $phpEx);
 extract($phpbb_config_php_file->get_all());
 
+if (!defined('PHPBB_ENVIRONMENT'))
+{
+	@define('PHPBB_ENVIRONMENT', 'production');
+}
+
 require($phpbb_root_path . 'includes/constants.' . $phpEx);
 require($phpbb_root_path . 'includes/functions.' . $phpEx);
 require($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
 require($phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx);
+require($phpbb_root_path . 'includes/functions_compatibility.' . $phpEx);
 
-$phpbb_container_builder = new \phpbb\di\container_builder($phpbb_config_php_file, $phpbb_root_path, $phpEx);
-$phpbb_container_builder->set_dump_container(false);
+$phpbb_container_builder = new \phpbb\di\container_builder($phpbb_root_path, $phpEx);
+$phpbb_container = $phpbb_container_builder->with_config($phpbb_config_php_file);
 
 $input = new ArgvInput();
 
+if ($input->hasParameterOption(array('--env')))
+{
+	$phpbb_container_builder->with_environment($input->getParameterOption('--env'));
+}
+
 if ($input->hasParameterOption(array('--safe-mode')))
 {
-	$phpbb_container_builder->set_use_extensions(false);
-	$phpbb_container_builder->set_dump_container(false);
+	$phpbb_container_builder->without_extensions();
+	$phpbb_container_builder->without_cache();
 }
 else
 {
 	$phpbb_class_loader_ext = new \phpbb\class_loader('\\', "{$phpbb_root_path}ext/", $phpEx);
 	$phpbb_class_loader_ext->register();
-	phpbb_load_extensions_autoloaders($phpbb_root_path);
 }
 
 $phpbb_container = $phpbb_container_builder->get_container();
 $phpbb_container->get('request')->enable_super_globals();
 require($phpbb_root_path . 'includes/compatibility_globals.' . $phpEx);
 
+register_compatibility_globals();
+
+/** @var \phpbb\language\language $language */
+$language = $phpbb_container->get('language');
+$language->add_lang(array('common', 'acp/common', 'cli'));
+
+/* @var $user \phpbb\user */
 $user = $phpbb_container->get('user');
 $user->data['user_id'] = ANONYMOUS;
 $user->ip = '127.0.0.1';
-$user->add_lang('acp/common');
-$user->add_lang('cli');
 
-$application = new \phpbb\console\application('phpBB Console', PHPBB_VERSION, $user);
+$application = new \phpbb\console\application('phpBB Console', PHPBB_VERSION, $language);
+$application->setDispatcher($phpbb_container->get('dispatcher'));
 $application->register_container_commands($phpbb_container->get('console.command_collection'));
 $application->run($input);
--- a/common.php
+++ b/common.php
@@ -12,7 +12,7 @@
 */
 
 /**
-* Minimum Requirement: PHP 5.3.3
+* Minimum Requirement: PHP 5.3.9
 */
 
 if (!defined('IN_PHPBB'))
@@ -29,6 +29,11 @@ $phpbb_class_loader->register();
 $phpbb_config_php_file = new \phpbb\config_php_file($phpbb_root_path, $phpEx);
 extract($phpbb_config_php_file->get_all());
 
+if (!defined('PHPBB_ENVIRONMENT'))
+{
+	@define('PHPBB_ENVIRONMENT', 'production');
+}
+
 if (!defined('PHPBB_INSTALLED'))
 {
 	// Redirect the user to the installer
@@ -53,14 +58,14 @@ if (!defined('PHPBB_INSTALLED'))
 	}
 
 	// $phpbb_root_path accounts for redirects from e.g. /adm
-	$script_path = trim(dirname($script_name)) . '/' . $phpbb_root_path . 'install/index.' . $phpEx;
+	$script_path = trim(dirname($script_name)) . '/' . $phpbb_root_path . 'install/app.' . $phpEx;
 	// Replace any number of consecutive backslashes and/or slashes with a single slash
 	// (could happen on some proxy setups and/or Windows servers)
 	$script_path = preg_replace('#[\\\\/]{2,}#', '/', $script_path);
 
 	// Eliminate . and .. from the path
 	require($phpbb_root_path . 'phpbb/filesystem.' . $phpEx);
-	$phpbb_filesystem = new phpbb\filesystem();
+	$phpbb_filesystem = new phpbb\filesystem\filesystem();
 	$script_path = $phpbb_filesystem->clean_path($script_path);
 
 	$url = (($secure) ? 'https://' : 'http://') . $server_name;
@@ -91,26 +96,51 @@ include($phpbb_root_path . 'includes/functions_compatibility.' . $phpEx);
 require($phpbb_root_path . 'includes/constants.' . $phpEx);
 require($phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx);
 
-// Set PHP error handler to ours
-set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler');
+if (PHPBB_ENVIRONMENT === 'development')
+{
+	\phpbb\debug\debug::enable();
+}
+else
+{
+	set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler');
+}
 
 $phpbb_class_loader_ext = new \phpbb\class_loader('\\', "{$phpbb_root_path}ext/", $phpEx);
 $phpbb_class_loader_ext->register();
 
-phpbb_load_extensions_autoloaders($phpbb_root_path);
-
 // Set up container
-$phpbb_container_builder = new \phpbb\di\container_builder($phpbb_config_php_file, $phpbb_root_path, $phpEx);
-$phpbb_container = $phpbb_container_builder->get_container();
+try
+{
+	$phpbb_container_builder = new \phpbb\di\container_builder($phpbb_root_path, $phpEx);
+	$phpbb_container = $phpbb_container_builder->with_config($phpbb_config_php_file)->get_container();
+}
+catch (InvalidArgumentException $e)
+{
+	if (PHPBB_ENVIRONMENT !== 'development')
+	{
+		trigger_error(
+			'The requested environment ' . PHPBB_ENVIRONMENT . ' is not available.',
+			E_USER_ERROR
+		);
+	}
+	else
+	{
+		throw $e;
+	}
+}
 
 $phpbb_class_loader->set_cache($phpbb_container->get('cache.driver'));
 $phpbb_class_loader_ext->set_cache($phpbb_container->get('cache.driver'));
 
 require($phpbb_root_path . 'includes/compatibility_globals.' . $phpEx);
 
+register_compatibility_globals();
+
 // Add own hook handler
 require($phpbb_root_path . 'includes/hooks/index.' . $phpEx);
 $phpbb_hook = new phpbb_hook(array('exit_handler', 'phpbb_user_session_handler', 'append_sid', array('template', 'display')));
+
+/* @var $phpbb_hook_finder \phpbb\hook\finder */
 $phpbb_hook_finder = $phpbb_container->get('hook_finder');
 
 foreach ($phpbb_hook_finder->find() as $hook)
--- a/composer.json
+++ b/composer.json
@@ -25,36 +25,51 @@
 		"phpbb/phpbb-core": "self.version"
 	},
 	"require": {
-		"php": ">=5.3.3,<7.0",
-		"lusitanian/oauth": "0.2.*",
-		"symfony/config": "2.3.*",
-		"symfony/console": "2.3.*",
-		"symfony/dependency-injection": "2.3.*",
-		"symfony/event-dispatcher": "2.3.*",
-		"symfony/http-kernel": "2.3.*",
-		"symfony/routing": "2.3.*",
-		"symfony/yaml": "2.3.*",
-		"twig/twig": "1.*"
+		"php": ">=5.4",
+		"bantu/ini-get-wrapper": "1.0.*",
+		"google/recaptcha": "~1.1",
+		"guzzlehttp/guzzle": "~5.3",
+		"lusitanian/oauth": "^0.8.1",
+		"marc1706/fast-image-size": "^1.1",
+		"paragonie/random_compat": "^1.4",
+		"patchwork/utf8": "^1.1",
+		"s9e/text-formatter": "~0.8.0",
+		"symfony/config": "^2.8",
+		"symfony/console": "^2.8",
+		"symfony/debug": "^2.8",
+		"symfony/dependency-injection": "^2.8",
+		"symfony/event-dispatcher": "^2.8",
+		"symfony/filesystem": "^2.8",
+		"symfony/finder": "^2.8",
+		"symfony/http-foundation": "^2.8",
+		"symfony/http-kernel": "^2.8",
+		"symfony/proxy-manager-bridge": "^2.8",
+		"symfony/routing": "^2.8",
+		"symfony/twig-bridge": "^2.8",
+		"symfony/yaml": "^2.8",
+		"twig/twig": "^1.0,<1.25"
 	},
 	"require-dev": {
-		"fabpot/goutte": "1.0.*",
+		"fabpot/goutte": "~2.0",
+		"facebook/webdriver": "~1.1",
+		"laravel/homestead": "~2.2",
 		"phing/phing": "2.4.*",
 		"phpunit/dbunit": "1.3.*",
-		"phpunit/phpunit": "4.1.*",
+		"phpunit/phpunit": "^4.1",
 		"sami/sami": "1.*",
 		"squizlabs/php_codesniffer": "2.*",
-		"symfony/browser-kit": "2.3.*",
-		"symfony/css-selector": "2.3.*",
-		"symfony/debug": "2.3.*",
-		"symfony/dom-crawler": "2.3.*",
-		"symfony/filesystem": "2.3.*",
-		"symfony/finder": "2.3.*",
-		"symfony/http-foundation": "2.3.*",
-		"symfony/process": "2.3.*"
+		"symfony/browser-kit": "^2.8",
+		"symfony/css-selector": "^2.8",
+		"symfony/dom-crawler": "^2.8"
 	},
 	"extra": {
 		"branch-alias": {
-			"dev-master": "3.1.x-dev"
+			"dev-master": "3.2.x-dev"
+		}
+	},
+	"config": {
+		"platform": {
+			"php": "5.4"
 		}
 	}
 }
--- a/composer.lock
+++ b/composer.lock
@@ -4,21 +4,291 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
-    "hash": "33fa9de480a8a9c8f7e3f2926cd4c034",
-    "content-hash": "2d9c1857e65554ceb4cfa435495df188",
+    "hash": "8d03337c5b9f6ae7cc1a26f84ba0270b",
+    "content-hash": "be4cb6437adc268d96f99bcbaad66d03",
     "packages": [
         {
+            "name": "bantu/ini-get-wrapper",
+            "version": "v1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/bantuXorg/php-ini-get-wrapper.git",
+                "reference": "4770c7feab370c62e23db4f31c112b7c6d90aee2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/bantuXorg/php-ini-get-wrapper/zipball/4770c7feab370c62e23db4f31c112b7c6d90aee2",
+                "reference": "4770c7feab370c62e23db4f31c112b7c6d90aee2",
+                "shasum": ""
+            },
+            "require-dev": {
+                "phpunit/phpunit": "3.7.*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "bantu\\IniGetWrapper\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Convenience wrapper around ini_get()",
+            "time": "2014-09-15 13:12:35"
+        },
+        {
+            "name": "google/recaptcha",
+            "version": "1.1.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/google/recaptcha.git",
+                "reference": "2b7e00566afca82a38a1d3adb8e42c118006296e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/google/recaptcha/zipball/2b7e00566afca82a38a1d3adb8e42c118006296e",
+                "reference": "2b7e00566afca82a38a1d3adb8e42c118006296e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "4.5.*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "ReCaptcha\\": "src/ReCaptcha"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "description": "Client library for reCAPTCHA, a free service that protect websites from spam and abuse.",
+            "homepage": "http://www.google.com/recaptcha/",
+            "keywords": [
+                "Abuse",
+                "captcha",
+                "recaptcha",
+                "spam"
+            ],
+            "time": "2015-09-02 17:23:59"
+        },
+        {
+            "name": "guzzlehttp/guzzle",
+            "version": "5.3.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/guzzle.git",
+                "reference": "70f1fa53b71c4647bf2762c09068a95f77e12fb8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/70f1fa53b71c4647bf2762c09068a95f77e12fb8",
+                "reference": "70f1fa53b71c4647bf2762c09068a95f77e12fb8",
+                "shasum": ""
+            },
+            "require": {
+                "guzzlehttp/ringphp": "^1.1",
+                "php": ">=5.4.0"
+            },
+            "require-dev": {
+                "ext-curl": "*",
+                "phpunit/phpunit": "^4.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "client",
+                "curl",
+                "framework",
+                "http",
+                "http client",
+                "rest",
+                "web service"
+            ],
+            "time": "2016-07-15 19:28:39"
+        },
+        {
+            "name": "guzzlehttp/ringphp",
+            "version": "1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/RingPHP.git",
+                "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/RingPHP/zipball/dbbb91d7f6c191e5e405e900e3102ac7f261bc0b",
+                "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b",
+                "shasum": ""
+            },
+            "require": {
+                "guzzlehttp/streams": "~3.0",
+                "php": ">=5.4.0",
+                "react/promise": "~2.0"
+            },
+            "require-dev": {
+                "ext-curl": "*",
+                "phpunit/phpunit": "~4.0"
+            },
+            "suggest": {
+                "ext-curl": "Guzzle will use specific adapters if cURL is present"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Ring\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function.",
+            "time": "2015-05-20 03:37:09"
+        },
+        {
+            "name": "guzzlehttp/streams",
+            "version": "3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/streams.git",
+                "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/streams/zipball/47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5",
+                "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Stream\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Provides a simple abstraction over streams of data",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "Guzzle",
+                "stream"
+            ],
+            "time": "2014-10-12 19:18:40"
+        },
+        {
+            "name": "ircmaxell/password-compat",
+            "version": "v1.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ircmaxell/password_compat.git",
+                "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ircmaxell/password_compat/zipball/5c5cde8822a69545767f7c7f3058cb15ff84614c",
+                "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c",
+                "shasum": ""
+            },
+            "require-dev": {
+                "phpunit/phpunit": "4.*"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "lib/password.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Anthony Ferrara",
+                    "email": "ircmaxell@php.net",
+                    "homepage": "http://blog.ircmaxell.com"
+                }
+            ],
+            "description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash",
+            "homepage": "https://github.com/ircmaxell/password_compat",
+            "keywords": [
+                "hashing",
+                "password"
+            ],
+            "time": "2014-11-20 16:49:30"
+        },
+        {
             "name": "lusitanian/oauth",
-            "version": "v0.2.5",
+            "version": "v0.8.9",
             "source": {
                 "type": "git",
                 "url": "https://github.com/Lusitanian/PHPoAuthLib.git",
-                "reference": "27e375e13e1badcd6dca7fb47b154b3c48fdec0c"
+                "reference": "29bda6e176df6c292a9b1c43ae8a44d56a87c30b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/Lusitanian/PHPoAuthLib/zipball/27e375e13e1badcd6dca7fb47b154b3c48fdec0c",
-                "reference": "27e375e13e1badcd6dca7fb47b154b3c48fdec0c",
+                "url": "https://api.github.com/repos/Lusitanian/PHPoAuthLib/zipball/29bda6e176df6c292a9b1c43ae8a44d56a87c30b",
+                "reference": "29bda6e176df6c292a9b1c43ae8a44d56a87c30b",
                 "shasum": ""
             },
             "require": {
@@ -27,9 +297,11 @@
             "require-dev": {
                 "phpunit/phpunit": "3.7.*",
                 "predis/predis": "0.8.*@dev",
+                "squizlabs/php_codesniffer": "2.*",
                 "symfony/http-foundation": "~2.1"
             },
             "suggest": {
+                "ext-openssl": "Allows for usage of secure connections with the stream-based HTTP client.",
                 "predis/predis": "Allows using the Redis storage backend.",
                 "symfony/http-foundation": "Allows using the Symfony Session storage backend."
             },
@@ -55,10 +327,12 @@
                     "email": "david@daviddesberg.com"
                 },
                 {
+                    "name": "Elliot Chance",
+                    "email": "elliotchance@gmail.com"
+                },
+                {
                     "name": "Pieter Hordijk",
-                    "email": "info@pieterhordijk.com",
-                    "homepage": "https://pieterhordijk.com",
-                    "role": "developer"
+                    "email": "info@pieterhordijk.com"
                 }
             ],
             "description": "PHP 5.3+ oAuth 1/2 Library",
@@ -68,26 +342,255 @@
                 "oauth",
                 "security"
             ],
-            "time": "2013-12-25 20:05:42"
+            "time": "2016-02-24 00:20:18"
+        },
+        {
+            "name": "marc1706/fast-image-size",
+            "version": "v1.1.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/marc1706/fast-image-size.git",
+                "reference": "8bb644f8f767c5763acd61140045a78d10e1eb06"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/marc1706/fast-image-size/zipball/8bb644f8f767c5763acd61140045a78d10e1eb06",
+                "reference": "8bb644f8f767c5763acd61140045a78d10e1eb06",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "4.*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "FastImageSize\\": "lib",
+                    "FastImageSize\\tests\\": "tests"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marc Alexander",
+                    "email": "admin@m-a-styles.de",
+                    "homepage": "https://www.m-a-styles.de",
+                    "role": "Developer"
+                }
+            ],
+            "description": "fast-image-size is a PHP library that does almost everything PHP's getimagesize() does but without the large overhead of downloading the complete file.",
+            "homepage": "https://www.m-a-styles.de",
+            "keywords": [
+                "fast",
+                "getimagesize",
+                "image",
+                "imagesize",
+                "php",
+                "size"
+            ],
+            "time": "2016-10-30 19:00:39"
+        },
+        {
+            "name": "ocramius/proxy-manager",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Ocramius/ProxyManager.git",
+                "reference": "57e9272ec0e8deccf09421596e0e2252df440e11"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/57e9272ec0e8deccf09421596e0e2252df440e11",
+                "reference": "57e9272ec0e8deccf09421596e0e2252df440e11",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "zendframework/zend-code": ">2.2.5,<3.0"
+            },
+            "require-dev": {
+                "ext-phar": "*",
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "1.5.*"
+            },
+            "suggest": {
+                "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects",
+                "zendframework/zend-json": "To have the JsonRpc adapter (Remote Object feature)",
+                "zendframework/zend-soap": "To have the Soap adapter (Remote Object feature)",
+                "zendframework/zend-stdlib": "To use the hydrator proxy",
+                "zendframework/zend-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "ProxyManager\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com",
+                    "homepage": "http://ocramius.github.com/"
+                }
+            ],
+            "description": "A library providing utilities to generate, instantiate and generally operate with Object Proxies",
+            "homepage": "https://github.com/Ocramius/ProxyManager",
+            "keywords": [
+                "aop",
+                "lazy loading",
+                "proxy",
+                "proxy pattern",
+                "service proxies"
+            ],
+            "time": "2015-08-09 04:28:19"
+        },
+        {
+            "name": "paragonie/random_compat",
+            "version": "v1.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/paragonie/random_compat.git",
+                "reference": "c7e26a21ba357863de030f0b9e701c7d04593774"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/paragonie/random_compat/zipball/c7e26a21ba357863de030f0b9e701c7d04593774",
+                "reference": "c7e26a21ba357863de030f0b9e701c7d04593774",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.2.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "4.*|5.*"
+            },
+            "suggest": {
+                "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "lib/random.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Paragon Initiative Enterprises",
+                    "email": "security@paragonie.com",
+                    "homepage": "https://paragonie.com"
+                }
+            ],
+            "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+            "keywords": [
+                "csprng",
+                "pseudorandom",
+                "random"
+            ],
+            "time": "2016-03-18 20:34:03"
+        },
+        {
+            "name": "patchwork/utf8",
+            "version": "v1.3.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/tchwork/utf8.git",
+                "reference": "30ec6451aec7d2536f0af8fe535f70c764f2c47a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/tchwork/utf8/zipball/30ec6451aec7d2536f0af8fe535f70c764f2c47a",
+                "reference": "30ec6451aec7d2536f0af8fe535f70c764f2c47a",
+                "shasum": ""
+            },
+            "require": {
+                "lib-pcre": ">=7.3",
+                "php": ">=5.3.0"
+            },
+            "suggest": {
+                "ext-iconv": "Use iconv for best performance",
+                "ext-intl": "Use Intl for best performance",
+                "ext-mbstring": "Use Mbstring for best performance",
+                "ext-wfio": "Use WFIO for UTF-8 filesystem access on Windows"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Patchwork\\": "src/Patchwork/"
+                },
+                "classmap": [
+                    "src/Normalizer.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "(Apache-2.0 or GPL-2.0)"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                }
+            ],
+            "description": "Portable and performant UTF-8, Unicode and Grapheme Clusters for PHP",
+            "homepage": "https://github.com/tchwork/utf8",
+            "keywords": [
+                "grapheme",
+                "i18n",
+                "unicode",
+                "utf-8",
+                "utf8"
+            ],
+            "time": "2016-05-18 13:57:10"
         },
         {
             "name": "psr/log",
-            "version": "1.0.0",
+            "version": "1.0.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-fig/log.git",
-                "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
+                "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
-                "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+                "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
                 "shasum": ""
             },
+            "require": {
+                "php": ">=5.3.0"
+            },
             "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
             "autoload": {
-                "psr-0": {
-                    "Psr\\Log\\": ""
+                "psr-4": {
+                    "Psr\\Log\\": "Psr/Log/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -101,40 +604,147 @@
                 }
             ],
             "description": "Common interface for logging libraries",
+            "homepage": "https://github.com/php-fig/log",
             "keywords": [
                 "log",
                 "psr",
                 "psr-3"
             ],
-            "time": "2012-12-21 11:40:51"
+            "time": "2016-10-10 12:19:37"
+        },
+        {
+            "name": "react/promise",
+            "version": "v2.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/promise.git",
+                "reference": "8025426794f1944de806618671d4fa476dc7626f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/promise/zipball/8025426794f1944de806618671d4fa476dc7626f",
+                "reference": "8025426794f1944de806618671d4fa476dc7626f",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "React\\Promise\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "jsorgalla@gmail.com"
+                }
+            ],
+            "description": "A lightweight implementation of CommonJS Promises/A for PHP",
+            "time": "2016-05-03 17:50:52"
+        },
+        {
+            "name": "s9e/text-formatter",
+            "version": "0.8.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/s9e/TextFormatter.git",
+                "reference": "919fd772aae4dd889618da1cb18ae746f2a14bb6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/s9e/TextFormatter/zipball/919fd772aae4dd889618da1cb18ae746f2a14bb6",
+                "reference": "919fd772aae4dd889618da1cb18ae746f2a14bb6",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-filter": "*",
+                "lib-pcre": ">=7.2",
+                "php": ">=5.3.3"
+            },
+            "suggest": {
+                "ext-curl": "Improves the performance of the MediaEmbed plugin and some JavaScript minifiers",
+                "ext-intl": "Allows international URLs to be accepted by the URL filter",
+                "ext-json": "Enables the generation of a JavaScript parser",
+                "ext-mbstring": "Improves the performance of the PHP renderer",
+                "ext-tokenizer": "Improves the performance of the PHP renderer",
+                "ext-xsl": "Enables the XSLT renderer",
+                "ext-zlib": "Enables gzip compression when scraping content via the MediaEmbed plugin"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "s9e\\TextFormatter\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Multi-purpose text formatting and markup library. Plugins offer support for BBCodes, Markdown, emoticons, HTML, embedding media (YouTube, etc...), enhanced typography and more.",
+            "homepage": "https://github.com/s9e/TextFormatter/",
+            "keywords": [
+                "bbcode",
+                "bbcodes",
+                "blog",
+                "censor",
+                "embed",
+                "emoji",
+                "emoticons",
+                "engine",
+                "forum",
+                "html",
+                "markdown",
+                "markup",
+                "media",
+                "parser",
+                "shortcodes"
+            ],
+            "time": "2016-11-22 20:10:24"
         },
         {
             "name": "symfony/config",
-            "version": "v2.3.42",
-            "target-dir": "Symfony/Component/Config",
+            "version": "v2.8.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/config.git",
-                "reference": "16a645cef1c09ebfc907d3c9b3e9f5836a7d4d3b"
+                "reference": "1361bc4e66f97b6202ae83f4190e962c624b5e61"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/config/zipball/16a645cef1c09ebfc907d3c9b3e9f5836a7d4d3b",
-                "reference": "16a645cef1c09ebfc907d3c9b3e9f5836a7d4d3b",
+                "url": "https://api.github.com/repos/symfony/config/zipball/1361bc4e66f97b6202ae83f4190e962c624b5e61",
+                "reference": "1361bc4e66f97b6202ae83f4190e962c624b5e61",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3",
-                "symfony/filesystem": "~2.3"
+                "php": ">=5.3.9",
+                "symfony/filesystem": "~2.3|~3.0.0"
+            },
+            "suggest": {
+                "symfony/yaml": "To use the yaml reference dumper"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.3-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
+                "psr-4": {
                     "Symfony\\Component\\Config\\": ""
                 },
                 "exclude-from-classmap": [
@@ -157,40 +767,45 @@
             ],
             "description": "Symfony Config Component",
             "homepage": "https://symfony.com",
-            "time": "2016-05-30 08:14:41"
+            "time": "2016-11-03 07:52:58"
         },
         {
             "name": "symfony/console",
-            "version": "v2.3.42",
-            "target-dir": "Symfony/Component/Console",
+            "version": "v2.8.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "20c12c6d6c5a087a66d4e77999451713a92a3507"
+                "reference": "a871ba00e0f604dceac64c56c27f99fbeaf4854e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/20c12c6d6c5a087a66d4e77999451713a92a3507",
-                "reference": "20c12c6d6c5a087a66d4e77999451713a92a3507",
+                "url": "https://api.github.com/repos/symfony/console/zipball/a871ba00e0f604dceac64c56c27f99fbeaf4854e",
+                "reference": "a871ba00e0f604dceac64c56c27f99fbeaf4854e",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=5.3.9",
+                "symfony/debug": "~2.7,>=2.7.2|~3.0.0",
+                "symfony/polyfill-mbstring": "~1.0"
             },
             "require-dev": {
-                "symfony/event-dispatcher": "~2.1"
+                "psr/log": "~1.0",
+                "symfony/event-dispatcher": "~2.1|~3.0.0",
+                "symfony/process": "~2.1|~3.0.0"
             },
             "suggest": {
-                "symfony/event-dispatcher": ""
+                "psr/log": "For using the console logger",
+                "symfony/event-dispatcher": "",
+                "symfony/process": ""
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.3-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
+                "psr-4": {
                     "Symfony\\Component\\Console\\": ""
                 },
                 "exclude-from-classmap": [
@@ -213,46 +828,41 @@
             ],
             "description": "Symfony Console Component",
             "homepage": "https://symfony.com",
-            "time": "2016-05-26 08:04:58"
+            "time": "2016-11-15 23:02:12"
         },
         {
             "name": "symfony/debug",
-            "version": "v2.3.42",
-            "target-dir": "Symfony/Component/Debug",
+            "version": "v2.8.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/debug.git",
-                "reference": "863d29c31a1ddfcf1faedf5f8362f392e3261632"
+                "reference": "62a68f640456f6761d752c62d81631428ef0d8a1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/debug/zipball/863d29c31a1ddfcf1faedf5f8362f392e3261632",
-                "reference": "863d29c31a1ddfcf1faedf5f8362f392e3261632",
+                "url": "https://api.github.com/repos/symfony/debug/zipball/62a68f640456f6761d752c62d81631428ef0d8a1",
+                "reference": "62a68f640456f6761d752c62d81631428ef0d8a1",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=5.3.9",
+                "psr/log": "~1.0"
             },
             "conflict": {
                 "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
             },
             "require-dev": {
-                "symfony/http-foundation": "~2.1",
-                "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2"
-            },
-            "suggest": {
-                "symfony/class-loader": "",
-                "symfony/http-foundation": "",
-                "symfony/http-kernel": ""
+                "symfony/class-loader": "~2.2|~3.0.0",
+                "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2|~3.0.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.3-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
+                "psr-4": {
                     "Symfony\\Component\\Debug\\": ""
                 },
                 "exclude-from-classmap": [
@@ -275,43 +885,47 @@
             ],
             "description": "Symfony Debug Component",
             "homepage": "https://symfony.com",
-            "time": "2016-03-30 09:02:35"
+            "time": "2016-11-15 12:53:17"
         },
         {
             "name": "symfony/dependency-injection",
-            "version": "v2.3.42",
-            "target-dir": "Symfony/Component/DependencyInjection",
+            "version": "v2.8.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/dependency-injection.git",
-                "reference": "06265ee128644eb70356bd72ab28c9ded6618d19"
+                "reference": "9d2c5033ca70ceade8d7584f997a9d3943f0fe5f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/06265ee128644eb70356bd72ab28c9ded6618d19",
-                "reference": "06265ee128644eb70356bd72ab28c9ded6618d19",
+                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/9d2c5033ca70ceade8d7584f997a9d3943f0fe5f",
+                "reference": "9d2c5033ca70ceade8d7584f997a9d3943f0fe5f",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=5.3.9"
+            },
+            "conflict": {
+                "symfony/expression-language": "<2.6"
             },
             "require-dev": {
-                "symfony/config": "~2.2",
-                "symfony/yaml": "~2.1"
+                "symfony/config": "~2.2|~3.0.0",
+                "symfony/expression-language": "~2.6|~3.0.0",
+                "symfony/yaml": "~2.3.42|~2.7.14|~2.8.7|~3.0.7"
             },
             "suggest": {
                 "symfony/config": "",
+                "symfony/expression-language": "For using expressions in service container configuration",
                 "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
                 "symfony/yaml": ""
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.3-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
+                "psr-4": {
                     "Symfony\\Component\\DependencyInjection\\": ""
                 },
                 "exclude-from-classmap": [
@@ -334,28 +948,31 @@
             ],
             "description": "Symfony DependencyInjection Component",
             "homepage": "https://symfony.com",
-            "time": "2016-05-30 08:31:06"
+            "time": "2016-11-18 21:10:01"
         },
         {
             "name": "symfony/event-dispatcher",
-            "version": "v2.3.42",
-            "target-dir": "Symfony/Component/EventDispatcher",
+            "version": "v2.8.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/event-dispatcher.git",
-                "reference": "fd6d162d97bf3e6060622e5c015af39ca72e33bc"
+                "reference": "25c576abd4e0f212e678fe8b2bd9a9a98c7ea934"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/fd6d162d97bf3e6060622e5c015af39ca72e33bc",
-                "reference": "fd6d162d97bf3e6060622e5c015af39ca72e33bc",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/25c576abd4e0f212e678fe8b2bd9a9a98c7ea934",
+                "reference": "25c576abd4e0f212e678fe8b2bd9a9a98c7ea934",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=5.3.9"
             },
             "require-dev": {
-                "symfony/dependency-injection": "~2.0,>=2.0.5"
+                "psr/log": "~1.0",
+                "symfony/config": "~2.0,>=2.0.5|~3.0.0",
+                "symfony/dependency-injection": "~2.6|~3.0.0",
+                "symfony/expression-language": "~2.6|~3.0.0",
+                "symfony/stopwatch": "~2.3|~3.0.0"
             },
             "suggest": {
                 "symfony/dependency-injection": "",
@@ -364,11 +981,11 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.3-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
+                "psr-4": {
                     "Symfony\\Component\\EventDispatcher\\": ""
                 },
                 "exclude-from-classmap": [
@@ -391,34 +1008,33 @@
             ],
             "description": "Symfony EventDispatcher Component",
             "homepage": "https://symfony.com",
-            "time": "2016-04-04 09:22:54"
+            "time": "2016-10-13 01:43:15"
         },
         {
             "name": "symfony/filesystem",
-            "version": "v2.3.42",
-            "target-dir": "Symfony/Component/Filesystem",
+            "version": "v2.8.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/filesystem.git",
-                "reference": "8fd9cd1da0afe63f0d9d4f27875782a2b7d590d3"
+                "reference": "a3784111af9f95f102b6411548376e1ae7c93898"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/filesystem/zipball/8fd9cd1da0afe63f0d9d4f27875782a2b7d590d3",
-                "reference": "8fd9cd1da0afe63f0d9d4f27875782a2b7d590d3",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/a3784111af9f95f102b6411548376e1ae7c93898",
+                "reference": "a3784111af9f95f102b6411548376e1ae7c93898",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=5.3.9"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.3-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
+                "psr-4": {
                     "Symfony\\Component\\Filesystem\\": ""
                 },
                 "exclude-from-classmap": [
@@ -441,40 +1057,90 @@
             ],
             "description": "Symfony Filesystem Component",
             "homepage": "https://symfony.com",
-            "time": "2016-04-12 15:20:10"
+            "time": "2016-10-18 04:28:30"
+        },
+        {
+            "name": "symfony/finder",
+            "version": "v2.8.14",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/finder.git",
+                "reference": "0023b024363dfc0cd21262e556f25a291fe8d7fd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/0023b024363dfc0cd21262e556f25a291fe8d7fd",
+                "reference": "0023b024363dfc0cd21262e556f25a291fe8d7fd",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Finder\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Finder Component",
+            "homepage": "https://symfony.com",
+            "time": "2016-11-03 07:52:58"
         },
         {
             "name": "symfony/http-foundation",
-            "version": "v2.3.42",
-            "target-dir": "Symfony/Component/HttpFoundation",
+            "version": "v2.8.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-foundation.git",
-                "reference": "9f4dbb1f3e3cad22d9462e0306c9c71212458f61"
+                "reference": "4f8c167732bbf3ba4284c0915f57b332091f6b68"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9f4dbb1f3e3cad22d9462e0306c9c71212458f61",
-                "reference": "9f4dbb1f3e3cad22d9462e0306c9c71212458f61",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4f8c167732bbf3ba4284c0915f57b332091f6b68",
+                "reference": "4f8c167732bbf3ba4284c0915f57b332091f6b68",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3",
-                "symfony/polyfill-mbstring": "~1.1"
+                "php": ">=5.3.9",
+                "symfony/polyfill-mbstring": "~1.1",
+                "symfony/polyfill-php54": "~1.0",
+                "symfony/polyfill-php55": "~1.0"
+            },
+            "require-dev": {
+                "symfony/expression-language": "~2.4|~3.0.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.3-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
+                "psr-4": {
                     "Symfony\\Component\\HttpFoundation\\": ""
                 },
-                "classmap": [
-                    "Symfony/Component/HttpFoundation/Resources/stubs"
-                ],
                 "exclude-from-classmap": [
                     "/Tests/"
                 ]
@@ -495,43 +1161,48 @@
             ],
             "description": "Symfony HttpFoundation Component",
             "homepage": "https://symfony.com",
-            "time": "2016-05-13 15:22:39"
+            "time": "2016-11-15 23:02:12"
         },
         {
             "name": "symfony/http-kernel",
-            "version": "v2.3.42",
-            "target-dir": "Symfony/Component/HttpKernel",
+            "version": "v2.8.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-kernel.git",
-                "reference": "57e0329236e8edf2b0e683043c604f7c9aba9398"
+                "reference": "29d9bb59c6d895e65d8fea3859c96c3b6e9368ba"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/57e0329236e8edf2b0e683043c604f7c9aba9398",
-                "reference": "57e0329236e8edf2b0e683043c604f7c9aba9398",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/29d9bb59c6d895e65d8fea3859c96c3b6e9368ba",
+                "reference": "29d9bb59c6d895e65d8fea3859c96c3b6e9368ba",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3",
+                "php": ">=5.3.9",
                 "psr/log": "~1.0",
-                "symfony/debug": "~2.3.24|~2.5.9|~2.6,>=2.6.2",
-                "symfony/event-dispatcher": "~2.1",
-                "symfony/http-foundation": "~2.3,>=2.3.4"
+                "symfony/debug": "~2.6,>=2.6.2",
+                "symfony/event-dispatcher": "~2.6,>=2.6.7|~3.0.0",
+                "symfony/http-foundation": "~2.7.20|~2.8.13|~3.1.6"
+            },
+            "conflict": {
+                "symfony/config": "<2.7"
             },
             "require-dev": {
-                "symfony/browser-kit": "~2.3",
-                "symfony/class-loader": "~2.1",
-                "symfony/config": "~2.0,>=2.0.5",
-                "symfony/console": "~2.2",
-                "symfony/css-selector": "~2.0,>=2.0.5",
-                "symfony/dependency-injection": "~2.2",
-                "symfony/dom-crawler": "~2.0,>=2.0.5",
-                "symfony/finder": "~2.0,>=2.0.5",
-                "symfony/process": "~2.0,>=2.0.5",
-                "symfony/routing": "~2.2",
-                "symfony/stopwatch": "~2.3",
-                "symfony/templating": "~2.2"
+                "symfony/browser-kit": "~2.3|~3.0.0",
+                "symfony/class-loader": "~2.1|~3.0.0",
+                "symfony/config": "~2.8",
+                "symfony/console": "~2.3|~3.0.0",
+                "symfony/css-selector": "~2.0,>=2.0.5|~3.0.0",
+                "symfony/dependency-injection": "~2.8|~3.0.0",
+                "symfony/dom-crawler": "~2.0,>=2.0.5|~3.0.0",
+                "symfony/expression-language": "~2.4|~3.0.0",
+                "symfony/finder": "~2.0,>=2.0.5|~3.0.0",
+                "symfony/process": "~2.0,>=2.0.5|~3.0.0",
+                "symfony/routing": "~2.8|~3.0.0",
+                "symfony/stopwatch": "~2.3|~3.0.0",
+                "symfony/templating": "~2.2|~3.0.0",
+                "symfony/translation": "~2.0,>=2.0.5|~3.0.0",
+                "symfony/var-dumper": "~2.6|~3.0.0"
             },
             "suggest": {
                 "symfony/browser-kit": "",
@@ -539,16 +1210,17 @@
                 "symfony/config": "",
                 "symfony/console": "",
                 "symfony/dependency-injection": "",
-                "symfony/finder": ""
+                "symfony/finder": "",
+                "symfony/var-dumper": ""
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.3-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
+                "psr-4": {
                     "Symfony\\Component\\HttpKernel\\": ""
                 },
                 "exclude-from-classmap": [
@@ -571,20 +1243,20 @@
             ],
             "description": "Symfony HttpKernel Component",
             "homepage": "https://symfony.com",
-            "time": "2016-05-30 08:41:10"
+            "time": "2016-11-21 02:24:42"
         },
         {
             "name": "symfony/polyfill-mbstring",
-            "version": "v1.2.0",
+            "version": "v1.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-mbstring.git",
-                "reference": "dff51f72b0706335131b00a7f49606168c582594"
+                "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/dff51f72b0706335131b00a7f49606168c582594",
-                "reference": "dff51f72b0706335131b00a7f49606168c582594",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4",
+                "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4",
                 "shasum": ""
             },
             "require": {
@@ -596,7 +1268,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.2-dev"
+                    "dev-master": "1.3-dev"
                 }
             },
             "autoload": {
@@ -630,46 +1302,221 @@
                 "portable",
                 "shim"
             ],
-            "time": "2016-05-18 14:26:46"
+            "time": "2016-11-14 01:06:16"
+        },
+        {
+            "name": "symfony/polyfill-php54",
+            "version": "v1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php54.git",
+                "reference": "90e085822963fdcc9d1c5b73deb3d2e5783b16a0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/90e085822963fdcc9d1c5b73deb3d2e5783b16a0",
+                "reference": "90e085822963fdcc9d1c5b73deb3d2e5783b16a0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php54\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ],
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 5.4+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "time": "2016-11-14 01:06:16"
+        },
+        {
+            "name": "symfony/polyfill-php55",
+            "version": "v1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php55.git",
+                "reference": "03e3f0350bca2220e3623a0e340eef194405fc67"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/03e3f0350bca2220e3623a0e340eef194405fc67",
+                "reference": "03e3f0350bca2220e3623a0e340eef194405fc67",
+                "shasum": ""
+            },
+            "require": {
+                "ircmaxell/password-compat": "~1.0",
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php55\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 5.5+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "time": "2016-11-14 01:06:16"
+        },
+        {
+            "name": "symfony/proxy-manager-bridge",
+            "version": "v2.8.14",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/proxy-manager-bridge.git",
+                "reference": "69922100cdfe37bc9c0429cab5bd523e861e562e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/69922100cdfe37bc9c0429cab5bd523e861e562e",
+                "reference": "69922100cdfe37bc9c0429cab5bd523e861e562e",
+                "shasum": ""
+            },
+            "require": {
+                "ocramius/proxy-manager": "~0.4|~1.0|~2.0",
+                "php": ">=5.3.9",
+                "symfony/dependency-injection": "~2.8|~3.0.0"
+            },
+            "require-dev": {
+                "symfony/config": "~2.3|~3.0.0"
+            },
+            "type": "symfony-bridge",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bridge\\ProxyManager\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony ProxyManager Bridge",
+            "homepage": "https://symfony.com",
+            "time": "2016-10-03 15:49:46"
         },
         {
             "name": "symfony/routing",
-            "version": "v2.3.42",
-            "target-dir": "Symfony/Component/Routing",
+            "version": "v2.8.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/routing.git",
-                "reference": "5b8a2bb7569df81401171829498809e90d6e446c"
+                "reference": "6cee3ed22c778a7410119a3d51a20f60252a156c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/routing/zipball/5b8a2bb7569df81401171829498809e90d6e446c",
-                "reference": "5b8a2bb7569df81401171829498809e90d6e446c",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/6cee3ed22c778a7410119a3d51a20f60252a156c",
+                "reference": "6cee3ed22c778a7410119a3d51a20f60252a156c",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=5.3.9"
+            },
+            "conflict": {
+                "symfony/config": "<2.7"
             },
             "require-dev": {
+                "doctrine/annotations": "~1.0",
                 "doctrine/common": "~2.2",
                 "psr/log": "~1.0",
-                "symfony/config": "~2.2",
-                "symfony/http-foundation": "~2.3",
-                "symfony/yaml": "~2.0,>=2.0.5"
+                "symfony/config": "~2.7|~3.0.0",
+                "symfony/expression-language": "~2.4|~3.0.0",
+                "symfony/http-foundation": "~2.3|~3.0.0",
+                "symfony/yaml": "~2.0,>=2.0.5|~3.0.0"
             },
             "suggest": {
-                "doctrine/common": "",
-                "symfony/config": "",
-                "symfony/yaml": ""
+                "doctrine/annotations": "For using the annotation loader",
+                "symfony/config": "For using the all-in-one router or any loader",
+                "symfony/dependency-injection": "For loading routes from a service",
+                "symfony/expression-language": "For using expression matching",
+                "symfony/http-foundation": "For using a Symfony Request object",
+                "symfony/yaml": "For using the YAML loader"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.3-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
+                "psr-4": {
                     "Symfony\\Component\\Routing\\": ""
                 },
                 "exclude-from-classmap": [
@@ -692,34 +1539,120 @@
             ],
             "description": "Symfony Routing Component",
             "homepage": "https://symfony.com",
-            "time": "2016-05-29 10:13:06"
+            "keywords": [
+                "router",
+                "routing",
+                "uri",
+                "url"
+            ],
+            "time": "2016-08-16 14:56:08"
+        },
+        {
+            "name": "symfony/twig-bridge",
+            "version": "v2.8.11",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/twig-bridge.git",
+                "reference": "5e9679f7085e99adb5248e07b4677494b8f884b5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/5e9679f7085e99adb5248e07b4677494b8f884b5",
+                "reference": "5e9679f7085e99adb5248e07b4677494b8f884b5",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "twig/twig": "~1.23|~2.0"
+            },
+            "require-dev": {
+                "symfony/asset": "~2.7|~3.0.0",
+                "symfony/console": "~2.8|~3.0.0",
+                "symfony/expression-language": "~2.4|~3.0.0",
+                "symfony/finder": "~2.3|~3.0.0",
+                "symfony/form": "~2.8.4",
+                "symfony/http-kernel": "~2.8|~3.0.0",
+                "symfony/polyfill-intl-icu": "~1.0",
+                "symfony/routing": "~2.2|~3.0.0",
+                "symfony/security": "~2.6|~3.0.0",
+                "symfony/security-acl": "~2.6|~3.0.0",
+                "symfony/stopwatch": "~2.2|~3.0.0",
+                "symfony/templating": "~2.1|~3.0.0",
+                "symfony/translation": "~2.7|~3.0.0",
+                "symfony/var-dumper": "~2.7.16|~2.8.9|~3.0.9",
+                "symfony/yaml": "~2.0,>=2.0.5|~3.0.0"
+            },
+            "suggest": {
+                "symfony/asset": "For using the AssetExtension",
+                "symfony/expression-language": "For using the ExpressionExtension",
+                "symfony/finder": "",
+                "symfony/form": "For using the FormExtension",
+                "symfony/http-kernel": "For using the HttpKernelExtension",
+                "symfony/routing": "For using the RoutingExtension",
+                "symfony/security": "For using the SecurityExtension",
+                "symfony/stopwatch": "For using the StopwatchExtension",
+                "symfony/templating": "For using the TwigEngine",
+                "symfony/translation": "For using the TranslationExtension",
+                "symfony/var-dumper": "For using the DumpExtension",
+                "symfony/yaml": "For using the YamlExtension"
+            },
+            "type": "symfony-bridge",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bridge\\Twig\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Twig Bridge",
+            "homepage": "https://symfony.com",
+            "time": "2016-09-06 10:55:00"
         },
         {
             "name": "symfony/yaml",
-            "version": "v2.3.42",
-            "target-dir": "Symfony/Component/Yaml",
+            "version": "v2.8.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/yaml.git",
-                "reference": "2cb5f366f9e0df014fc93de46cc416ba0a3055f8"
+                "reference": "befb26a3713c97af90d25dd12e75621ef14d91ff"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/yaml/zipball/2cb5f366f9e0df014fc93de46cc416ba0a3055f8",
-                "reference": "2cb5f366f9e0df014fc93de46cc416ba0a3055f8",
+                "url": "https://api.github.com/repos/symfony/yaml/zipball/befb26a3713c97af90d25dd12e75621ef14d91ff",
+                "reference": "befb26a3713c97af90d25dd12e75621ef14d91ff",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=5.3.9"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.3-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
+                "psr-4": {
                     "Symfony\\Component\\Yaml\\": ""
                 },
                 "exclude-from-classmap": [
@@ -742,20 +1675,20 @@
             ],
             "description": "Symfony Yaml Component",
             "homepage": "https://symfony.com",
-            "time": "2016-05-30 08:10:17"
+            "time": "2016-11-14 16:15:57"
         },
         {
             "name": "twig/twig",
-            "version": "v1.24.1",
+            "version": "v1.24.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/twigphp/Twig.git",
-                "reference": "3566d311a92aae4deec6e48682dc5a4528c4a512"
+                "reference": "33093f6e310e6976baeac7b14f3a6ec02f2d79b7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/twigphp/Twig/zipball/3566d311a92aae4deec6e48682dc5a4528c4a512",
-                "reference": "3566d311a92aae4deec6e48682dc5a4528c4a512",
+                "url": "https://api.github.com/repos/twigphp/Twig/zipball/33093f6e310e6976baeac7b14f3a6ec02f2d79b7",
+                "reference": "33093f6e310e6976baeac7b14f3a6ec02f2d79b7",
                 "shasum": ""
             },
             "require": {
@@ -803,144 +1736,197 @@
             "keywords": [
                 "templating"
             ],
-            "time": "2016-05-30 09:11:59"
-        }
-    ],
-    "packages-dev": [
+            "time": "2016-09-01 17:50:53"
+        },
         {
-            "name": "fabpot/goutte",
-            "version": "v1.0.7",
+            "name": "zendframework/zend-code",
+            "version": "2.5.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/FriendsOfPHP/Goutte.git",
-                "reference": "794b196e76bdd37b5155cdecbad311f0a3b07625"
+                "url": "https://github.com/zendframework/zend-code.git",
+                "reference": "5d998f261ec2a55171c71da57a11622745680153"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/FriendsOfPHP/Goutte/zipball/794b196e76bdd37b5155cdecbad311f0a3b07625",
-                "reference": "794b196e76bdd37b5155cdecbad311f0a3b07625",
+                "url": "https://api.github.com/repos/zendframework/zend-code/zipball/5d998f261ec2a55171c71da57a11622745680153",
+                "reference": "5d998f261ec2a55171c71da57a11622745680153",
                 "shasum": ""
             },
             "require": {
-                "ext-curl": "*",
-                "guzzle/http": "~3.1",
-                "php": ">=5.3.0",
-                "symfony/browser-kit": "~2.1",
-                "symfony/css-selector": "~2.1",
-                "symfony/dom-crawler": "~2.1",
-                "symfony/finder": "~2.1",
-                "symfony/process": "~2.1"
+                "php": ">=5.3.23",
+                "zendframework/zend-eventmanager": "~2.5"
             },
             "require-dev": {
-                "guzzle/plugin-history": "~3.1",
-                "guzzle/plugin-mock": "~3.1"
+                "doctrine/common": ">=2.1",
+                "fabpot/php-cs-fixer": "1.7.*",
+                "phpunit/phpunit": "~4.0",
+                "zendframework/zend-stdlib": "~2.5",
+                "zendframework/zend-version": "~2.5"
             },
-            "type": "application",
+            "suggest": {
+                "doctrine/common": "Doctrine\\Common >=2.1 for annotation features",
+                "zendframework/zend-stdlib": "Zend\\Stdlib component"
+            },
+            "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0-dev"
+                    "dev-master": "2.5-dev",
+                    "dev-develop": "2.6-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
-                    "Goutte": "."
+                "psr-4": {
+                    "Zend\\Code\\": "src/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com"
-                }
+                "BSD-3-Clause"
             ],
-            "description": "A simple PHP Web Scraper",
-            "homepage": "https://github.com/fabpot/Goutte",
+            "description": "provides facilities to generate arbitrary code using an object oriented interface",
+            "homepage": "https://github.com/zendframework/zend-code",
             "keywords": [
-                "scraper"
+                "code",
+                "zf2"
             ],
-            "time": "2014-10-09 15:52:51"
+            "time": "2015-06-03 15:31:59"
         },
         {
-            "name": "guzzle/common",
-            "version": "v3.9.2",
-            "target-dir": "Guzzle/Common",
+            "name": "zendframework/zend-eventmanager",
+            "version": "2.5.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/Guzzle3/common.git",
-                "reference": "2e36af7cf2ce3ea1f2d7c2831843b883a8e7b7dc"
+                "url": "https://github.com/zendframework/zend-eventmanager.git",
+                "reference": "d94a16039144936f107f906896349900fd634443"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/Guzzle3/common/zipball/2e36af7cf2ce3ea1f2d7c2831843b883a8e7b7dc",
-                "reference": "2e36af7cf2ce3ea1f2d7c2831843b883a8e7b7dc",
+                "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/d94a16039144936f107f906896349900fd634443",
+                "reference": "d94a16039144936f107f906896349900fd634443",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.2",
-                "symfony/event-dispatcher": ">=2.1"
+                "php": ">=5.3.23",
+                "zendframework/zend-stdlib": "~2.5"
+            },
+            "require-dev": {
+                "fabpot/php-cs-fixer": "1.7.*",
+                "phpunit/phpunit": "~4.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.7-dev"
+                    "dev-master": "2.5-dev",
+                    "dev-develop": "2.6-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
-                    "Guzzle\\Common": ""
+                "psr-4": {
+                    "Zend\\EventManager\\": "src/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "MIT"
+                "BSD-3-Clause"
             ],
-            "description": "Common libraries used by Guzzle",
-            "homepage": "http://guzzlephp.org/",
+            "homepage": "https://github.com/zendframework/zend-eventmanager",
             "keywords": [
-                "collection",
-                "common",
-                "event",
-                "exception"
+                "eventmanager",
+                "zf2"
             ],
-            "abandoned": "guzzle/guzzle",
-            "time": "2014-08-11 04:32:36"
+            "time": "2015-06-03 15:32:01"
         },
         {
-            "name": "guzzle/http",
-            "version": "v3.9.2",
-            "target-dir": "Guzzle/Http",
+            "name": "zendframework/zend-stdlib",
+            "version": "2.5.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/Guzzle3/http.git",
-                "reference": "1e8dd1e2ba9dc42332396f39fbfab950b2301dc5"
+                "url": "https://github.com/zendframework/zend-stdlib.git",
+                "reference": "cc8e90a60dd5d44b9730b77d07b97550091da1ae"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/Guzzle3/http/zipball/1e8dd1e2ba9dc42332396f39fbfab950b2301dc5",
-                "reference": "1e8dd1e2ba9dc42332396f39fbfab950b2301dc5",
+                "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/cc8e90a60dd5d44b9730b77d07b97550091da1ae",
+                "reference": "cc8e90a60dd5d44b9730b77d07b97550091da1ae",
                 "shasum": ""
             },
             "require": {
-                "guzzle/common": "self.version",
-                "guzzle/parser": "self.version",
-                "guzzle/stream": "self.version",
-                "php": ">=5.3.2"
+                "php": ">=5.3.23"
+            },
+            "require-dev": {
+                "fabpot/php-cs-fixer": "1.7.*",
+                "phpunit/phpunit": "~4.0",
+                "zendframework/zend-config": "~2.5",
+                "zendframework/zend-eventmanager": "~2.5",
+                "zendframework/zend-filter": "~2.5",
+                "zendframework/zend-inputfilter": "~2.5",
+                "zendframework/zend-serializer": "~2.5",
+                "zendframework/zend-servicemanager": "~2.5"
             },
             "suggest": {
-                "ext-curl": "*"
+                "zendframework/zend-eventmanager": "To support aggregate hydrator usage",
+                "zendframework/zend-filter": "To support naming strategy hydrator usage",
+                "zendframework/zend-serializer": "Zend\\Serializer component",
+                "zendframework/zend-servicemanager": "To support hydrator plugin manager usage"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.7-dev"
+                    "dev-master": "2.5-dev",
+                    "dev-develop": "2.6-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
-                    "Guzzle\\Http": ""
+                "psr-4": {
+                    "Zend\\Stdlib\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "homepage": "https://github.com/zendframework/zend-stdlib",
+            "keywords": [
+                "stdlib",
+                "zf2"
+            ],
+            "time": "2015-06-03 15:32:03"
+        }
+    ],
+    "packages-dev": [
+        {
+            "name": "doctrine/instantiator",
+            "version": "1.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/instantiator.git",
+                "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+                "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3,<8.0-DEV"
+            },
+            "require-dev": {
+                "athletic/athletic": "~0.1.8",
+                "ext-pdo": "*",
+                "ext-phar": "*",
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "~2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -949,99 +1935,140 @@
             ],
             "authors": [
                 {
-                    "name": "Michael Dowling",
-                    "email": "mtdowling@gmail.com",
-                    "homepage": "https://github.com/mtdowling"
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com",
+                    "homepage": "http://ocramius.github.com/"
                 }
             ],
-            "description": "HTTP libraries used by Guzzle",
-            "homepage": "http://guzzlephp.org/",
+            "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+            "homepage": "https://github.com/doctrine/instantiator",
             "keywords": [
-                "Guzzle",
-                "client",
-                "curl",
-                "http",
-                "http client"
+                "constructor",
+                "instantiate"
             ],
-            "abandoned": "guzzle/guzzle",
-            "time": "2014-08-11 04:32:36"
+            "time": "2015-06-14 21:17:01"
         },
         {
-            "name": "guzzle/parser",
-            "version": "v3.9.2",
-            "target-dir": "Guzzle/Parser",
+            "name": "fabpot/goutte",
+            "version": "v2.0.4",
             "source": {
                 "type": "git",
-                "url": "https://github.com/Guzzle3/parser.git",
-                "reference": "6874d171318a8e93eb6d224cf85e4678490b625c"
+                "url": "https://github.com/FriendsOfPHP/Goutte.git",
+                "reference": "0ad3ee6dc2d0aaa832a80041a1e09bf394e99802"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/Guzzle3/parser/zipball/6874d171318a8e93eb6d224cf85e4678490b625c",
-                "reference": "6874d171318a8e93eb6d224cf85e4678490b625c",
+                "url": "https://api.github.com/repos/FriendsOfPHP/Goutte/zipball/0ad3ee6dc2d0aaa832a80041a1e09bf394e99802",
+                "reference": "0ad3ee6dc2d0aaa832a80041a1e09bf394e99802",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.2"
+                "guzzlehttp/guzzle": ">=4,<6",
+                "php": ">=5.4.0",
+                "symfony/browser-kit": "~2.1",
+                "symfony/css-selector": "~2.1",
+                "symfony/dom-crawler": "~2.1"
             },
-            "type": "library",
+            "type": "application",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.7-dev"
+                    "dev-master": "2.0-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
-                    "Guzzle\\Parser": ""
+                "psr-4": {
+                    "Goutte\\": "Goutte"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
                 "MIT"
             ],
-            "description": "Interchangeable parsers used by Guzzle",
-            "homepage": "http://guzzlephp.org/",
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "A simple PHP Web Scraper",
+            "homepage": "https://github.com/FriendsOfPHP/Goutte",
             "keywords": [
-                "URI Template",
-                "cookie",
-                "http",
-                "message",
-                "url"
+                "scraper"
             ],
-            "abandoned": "guzzle/guzzle",
-            "time": "2014-02-05 18:29:46"
+            "time": "2015-05-05 21:14:57"
         },
         {
-            "name": "guzzle/stream",
-            "version": "v3.9.2",
-            "target-dir": "Guzzle/Stream",
+            "name": "facebook/webdriver",
+            "version": "1.1.3",
             "source": {
                 "type": "git",
-                "url": "https://github.com/Guzzle3/stream.git",
-                "reference": "60c7fed02e98d2c518dae8f97874c8f4622100f0"
+                "url": "https://github.com/facebook/php-webdriver.git",
+                "reference": "b7186fb1bcfda956d237f59face250d06ef47253"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/Guzzle3/stream/zipball/60c7fed02e98d2c518dae8f97874c8f4622100f0",
-                "reference": "60c7fed02e98d2c518dae8f97874c8f4622100f0",
+                "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/b7186fb1bcfda956d237f59face250d06ef47253",
+                "reference": "b7186fb1bcfda956d237f59face250d06ef47253",
                 "shasum": ""
             },
             "require": {
-                "guzzle/common": "self.version",
-                "php": ">=5.3.2"
+                "ext-curl": "*",
+                "php": ">=5.3.19"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^1.11",
+                "phpunit/phpunit": "4.6.* || ~5.0",
+                "squizlabs/php_codesniffer": "^2.6"
             },
             "suggest": {
-                "guzzle/http": "To convert Guzzle request objects to PHP streams"
+                "phpdocumentor/phpdocumentor": "2.*"
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.7-dev"
+            "autoload": {
+                "psr-4": {
+                    "Facebook\\WebDriver\\": "lib/"
                 }
             },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "description": "A PHP client for WebDriver",
+            "homepage": "https://github.com/facebook/php-webdriver",
+            "keywords": [
+                "facebook",
+                "php",
+                "selenium",
+                "webdriver"
+            ],
+            "time": "2016-08-10 00:44:08"
+        },
+        {
+            "name": "laravel/homestead",
+            "version": "v2.2.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/laravel/homestead.git",
+                "reference": "f4e45f895d8707042c2d0698627d33c484e7c6ba"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/laravel/homestead/zipball/f4e45f895d8707042c2d0698627d33c484e7c6ba",
+                "reference": "f4e45f895d8707042c2d0698627d33c484e7c6ba",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4",
+                "symfony/console": "~2.0 || ~3.0",
+                "symfony/process": "~2.0 || ~3.0"
+            },
+            "bin": [
+                "homestead"
+            ],
+            "type": "library",
             "autoload": {
-                "psr-0": {
-                    "Guzzle\\Stream": ""
+                "psr-4": {
+                    "Laravel\\Homestead\\": "src/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -1050,33 +2077,25 @@
             ],
             "authors": [
                 {
-                    "name": "Michael Dowling",
-                    "email": "mtdowling@gmail.com",
-                    "homepage": "https://github.com/mtdowling"
+                    "name": "Taylor Otwell",
+                    "email": "taylorotwell@gmail.com"
                 }
             ],
-            "description": "Guzzle stream wrapper component",
-            "homepage": "http://guzzlephp.org/",
-            "keywords": [
-                "Guzzle",
-                "component",
-                "stream"
-            ],
-            "abandoned": "guzzle/guzzle",
-            "time": "2014-05-01 21:36:02"
+            "description": "A virtual machine for web artisans.",
+            "time": "2016-09-17 04:42:33"
         },
         {
             "name": "michelf/php-markdown",
-            "version": "1.6.0",
+            "version": "1.7.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/michelf/php-markdown.git",
-                "reference": "156e56ee036505ec637d761ee62dc425d807183c"
+                "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/michelf/php-markdown/zipball/156e56ee036505ec637d761ee62dc425d807183c",
-                "reference": "156e56ee036505ec637d761ee62dc425d807183c",
+                "url": "https://api.github.com/repos/michelf/php-markdown/zipball/1f51cc520948f66cd2af8cbc45a5ee175e774220",
+                "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220",
                 "shasum": ""
             },
             "require": {
@@ -1114,7 +2133,7 @@
             "keywords": [
                 "markdown"
             ],
-            "time": "2015-12-24 01:37:31"
+            "time": "2016-10-29 18:58:20"
         },
         {
             "name": "nikic/php-parser",
@@ -1214,6 +2233,118 @@
             "time": "2012-11-29 21:23:47"
         },
         {
+            "name": "phpdocumentor/reflection-docblock",
+            "version": "2.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+                "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8",
+                "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0"
+            },
+            "suggest": {
+                "dflydev/markdown": "~1.0",
+                "erusev/parsedown": "~1.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "phpDocumentor": [
+                        "src/"
+                    ]
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mike van Riel",
+                    "email": "mike.vanriel@naenius.com"
+                }
+            ],
+            "time": "2015-02-03 12:10:50"
+        },
+        {
+            "name": "phpspec/prophecy",
+            "version": "v1.6.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpspec/prophecy.git",
+                "reference": "6c52c2722f8460122f96f86346600e1077ce22cb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/6c52c2722f8460122f96f86346600e1077ce22cb",
+                "reference": "6c52c2722f8460122f96f86346600e1077ce22cb",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/instantiator": "^1.0.2",
+                "php": "^5.3|^7.0",
+                "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+                "sebastian/comparator": "^1.1",
+                "sebastian/recursion-context": "^1.0|^2.0"
+            },
+            "require-dev": {
+                "phpspec/phpspec": "^2.0",
+                "phpunit/phpunit": "^4.8 || ^5.6.5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.6.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Prophecy\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com",
+                    "homepage": "http://everzet.com"
+                },
+                {
+                    "name": "Marcello Duarte",
+                    "email": "marcello.duarte@gmail.com"
+                }
+            ],
+            "description": "Highly opinionated mocking framework for PHP 5.3+",
+            "homepage": "https://github.com/phpspec/prophecy",
+            "keywords": [
+                "Double",
+                "Dummy",
+                "fake",
+                "mock",
+                "spy",
+                "stub"
+            ],
+            "time": "2016-11-21 14:58:47"
+        },
+        {
             "name": "phpunit/dbunit",
             "version": "1.3.2",
             "source": {
@@ -1336,31 +2467,33 @@
         },
         {
             "name": "phpunit/php-file-iterator",
-            "version": "1.3.4",
+            "version": "1.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
-                "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb"
+                "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb",
-                "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+                "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3"
             },
             "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4.x-dev"
+                }
+            },
             "autoload": {
                 "classmap": [
-                    "File/"
+                    "src/"
                 ]
             },
             "notification-url": "https://packagist.org/downloads/",
-            "include-path": [
-                ""
-            ],
             "license": [
                 "BSD-3-Clause"
             ],
@@ -1377,7 +2510,7 @@
                 "filesystem",
                 "iterator"
             ],
-            "time": "2013-10-10 15:34:57"
+            "time": "2016-10-03 07:40:28"
         },
         {
             "name": "phpunit/php-text-template",
@@ -1466,16 +2599,16 @@
         },
         {
             "name": "phpunit/php-token-stream",
-            "version": "1.4.8",
+            "version": "1.4.9",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-token-stream.git",
-                "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da"
+                "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
-                "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3b402f65a4cc90abf6e1104e388b896ce209631b",
+                "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b",
                 "shasum": ""
             },
             "require": {
@@ -1511,20 +2644,20 @@
             "keywords": [
                 "tokenizer"
             ],
-            "time": "2015-09-15 10:49:45"
+            "time": "2016-11-15 14:06:22"
         },
         {
             "name": "phpunit/phpunit",
-            "version": "4.1.6",
+            "version": "4.8.31",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "241116219bb7e3b8111a36ffd8f37546888738d6"
+                "reference": "98b2b39a520766bec663ff5b7ff1b729db9dbfe3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/241116219bb7e3b8111a36ffd8f37546888738d6",
-                "reference": "241116219bb7e3b8111a36ffd8f37546888738d6",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/98b2b39a520766bec663ff5b7ff1b729db9dbfe3",
+                "reference": "98b2b39a520766bec663ff5b7ff1b729db9dbfe3",
                 "shasum": ""
             },
             "require": {
@@ -1534,17 +2667,19 @@
                 "ext-reflection": "*",
                 "ext-spl": "*",
                 "php": ">=5.3.3",
-                "phpunit/php-code-coverage": "~2.0",
-                "phpunit/php-file-iterator": "~1.3.1",
+                "phpspec/prophecy": "^1.3.1",
+                "phpunit/php-code-coverage": "~2.1",
+                "phpunit/php-file-iterator": "~1.4",
                 "phpunit/php-text-template": "~1.2",
-                "phpunit/php-timer": "~1.0.2",
-                "phpunit/phpunit-mock-objects": "2.1.5",
-                "sebastian/comparator": "~1.0",
-                "sebastian/diff": "~1.1",
-                "sebastian/environment": "~1.0",
-                "sebastian/exporter": "~1.0",
+                "phpunit/php-timer": "^1.0.6",
+                "phpunit/phpunit-mock-objects": "~2.3",
+                "sebastian/comparator": "~1.2.2",
+                "sebastian/diff": "~1.2",
+                "sebastian/environment": "~1.3",
+                "sebastian/exporter": "~1.2",
+                "sebastian/global-state": "~1.0",
                 "sebastian/version": "~1.0",
-                "symfony/yaml": "~2.0"
+                "symfony/yaml": "~2.1|~3.0"
             },
             "suggest": {
                 "phpunit/php-invoker": "~1.1"
@@ -1555,7 +2690,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "4.1.x-dev"
+                    "dev-master": "4.8.x-dev"
                 }
             },
             "autoload": {
@@ -1564,10 +2699,6 @@
                 ]
             },
             "notification-url": "https://packagist.org/downloads/",
-            "include-path": [
-                "",
-                "../../symfony/yaml/"
-            ],
             "license": [
                 "BSD-3-Clause"
             ],
@@ -1579,34 +2710,36 @@
                 }
             ],
             "description": "The PHP Unit Testing framework.",
-            "homepage": "http://www.phpunit.de/",
+            "homepage": "https://phpunit.de/",
             "keywords": [
                 "phpunit",
                 "testing",
                 "xunit"
             ],
-            "time": "2014-08-17 08:07:02"
+            "time": "2016-12-09 02:45:31"
         },
         {
             "name": "phpunit/phpunit-mock-objects",
-            "version": "2.1.5",
+            "version": "2.3.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
-                "reference": "7878b9c41edb3afab92b85edf5f0981014a2713a"
+                "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/7878b9c41edb3afab92b85edf5f0981014a2713a",
-                "reference": "7878b9c41edb3afab92b85edf5f0981014a2713a",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
+                "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
                 "shasum": ""
             },
             "require": {
+                "doctrine/instantiator": "^1.0.2",
                 "php": ">=5.3.3",
-                "phpunit/php-text-template": "~1.2"
+                "phpunit/php-text-template": "~1.2",
+                "sebastian/exporter": "~1.2"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4.1"
+                "phpunit/phpunit": "~4.4"
             },
             "suggest": {
                 "ext-soap": "*"
@@ -1614,7 +2747,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.1.x-dev"
+                    "dev-master": "2.3.x-dev"
                 }
             },
             "autoload": {
@@ -1623,9 +2756,6 @@
                 ]
             },
             "notification-url": "https://packagist.org/downloads/",
-            "include-path": [
-                ""
-            ],
             "license": [
                 "BSD-3-Clause"
             ],
@@ -1642,7 +2772,7 @@
                 "mock",
                 "xunit"
             ],
-            "time": "2014-06-12 07:22:15"
+            "time": "2015-10-02 06:51:40"
         },
         {
             "name": "pimple/pimple",
@@ -1679,9 +2809,7 @@
             "authors": [
                 {
                     "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com",
-                    "homepage": "http://fabien.potencier.org",
-                    "role": "Lead Developer"
+                    "email": "fabien@symfony.com"
                 }
             ],
             "description": "Pimple is a simple Dependency Injection Container for PHP 5.3",
@@ -1751,22 +2879,22 @@
         },
         {
             "name": "sebastian/comparator",
-            "version": "1.2.0",
+            "version": "1.2.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/comparator.git",
-                "reference": "937efb279bd37a375bcadf584dec0726f84dbf22"
+                "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22",
-                "reference": "937efb279bd37a375bcadf584dec0726f84dbf22",
+                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a1ed12e8b2409076ab22e3897126211ff8b1f7f",
+                "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3",
                 "sebastian/diff": "~1.2",
-                "sebastian/exporter": "~1.2"
+                "sebastian/exporter": "~1.2 || ~2.0"
             },
             "require-dev": {
                 "phpunit/phpunit": "~4.4"
@@ -1811,7 +2939,7 @@
                 "compare",
                 "equality"
             ],
-            "time": "2015-07-26 15:48:44"
+            "time": "2016-11-19 09:18:40"
         },
         {
             "name": "sebastian/diff",
@@ -1867,23 +2995,23 @@
         },
         {
             "name": "sebastian/environment",
-            "version": "1.3.7",
+            "version": "1.3.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/environment.git",
-                "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716"
+                "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716",
-                "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea",
+                "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": "^5.3.3 || ^7.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4.4"
+                "phpunit/phpunit": "^4.8 || ^5.0"
             },
             "type": "library",
             "extra": {
@@ -1913,7 +3041,7 @@
                 "environment",
                 "hhvm"
             ],
-            "time": "2016-05-17 03:18:57"
+            "time": "2016-08-18 05:49:44"
         },
         {
             "name": "sebastian/exporter",
@@ -1983,17 +3111,68 @@
             "time": "2016-06-17 09:04:28"
         },
         {
+            "name": "sebastian/global-state",
+            "version": "1.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/global-state.git",
+                "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
+                "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.2"
+            },
+            "suggest": {
+                "ext-uopz": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Snapshotting of global state",
+            "homepage": "http://www.github.com/sebastianbergmann/global-state",
+            "keywords": [
+                "global state"
+            ],
+            "time": "2015-10-12 03:26:01"
+        },
+        {
             "name": "sebastian/recursion-context",
-            "version": "1.0.2",
+            "version": "1.0.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/recursion-context.git",
-                "reference": "913401df809e99e4f47b27cdd781f4a258d58791"
+                "reference": "938df7a6478e72795e5f8266cff24d06e3136f2e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791",
-                "reference": "913401df809e99e4f47b27cdd781f4a258d58791",
+                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/938df7a6478e72795e5f8266cff24d06e3136f2e",
+                "reference": "938df7a6478e72795e5f8266cff24d06e3136f2e",
                 "shasum": ""
             },
             "require": {
@@ -2033,7 +3212,7 @@
             ],
             "description": "Provides functionality to recursively process PHP variables",
             "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
-            "time": "2015-11-11 19:50:13"
+            "time": "2016-11-15 06:55:36"
         },
         {
             "name": "sebastian/version",
@@ -2072,16 +3251,16 @@
         },
         {
             "name": "squizlabs/php_codesniffer",
-            "version": "2.6.2",
+            "version": "2.7.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
-                "reference": "4edb770cb853def6e60c93abb088ad5ac2010c83"
+                "reference": "9b324f3a1132459a7274a0ace2e1b766ba80930f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/4edb770cb853def6e60c93abb088ad5ac2010c83",
-                "reference": "4edb770cb853def6e60c93abb088ad5ac2010c83",
+                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/9b324f3a1132459a7274a0ace2e1b766ba80930f",
+                "reference": "9b324f3a1132459a7274a0ace2e1b766ba80930f",
                 "shasum": ""
             },
             "require": {
@@ -2146,30 +3325,29 @@
                 "phpcs",
                 "standards"
             ],
-            "time": "2016-07-13 23:29:13"
+            "time": "2016-11-30 04:02:31"
         },
         {
             "name": "symfony/browser-kit",
-            "version": "v2.3.42",
-            "target-dir": "Symfony/Component/BrowserKit",
+            "version": "v2.8.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/browser-kit.git",
-                "reference": "0fca8e3490f003262258dcf67c329691913642e5"
+                "reference": "165bf6d1e72cd72f2fe170a070aa2a1f17f2d744"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/browser-kit/zipball/0fca8e3490f003262258dcf67c329691913642e5",
-                "reference": "0fca8e3490f003262258dcf67c329691913642e5",
+                "url": "https://api.github.com/repos/symfony/browser-kit/zipball/165bf6d1e72cd72f2fe170a070aa2a1f17f2d744",
+                "reference": "165bf6d1e72cd72f2fe170a070aa2a1f17f2d744",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3",
-                "symfony/dom-crawler": "~2.0,>=2.0.5"
+                "php": ">=5.3.9",
+                "symfony/dom-crawler": "~2.1|~3.0.0"
             },
             "require-dev": {
-                "symfony/css-selector": "~2.0,>=2.0.5",
-                "symfony/process": "~2.3.34|~2.7,>=2.7.6"
+                "symfony/css-selector": "~2.0,>=2.0.5|~3.0.0",
+                "symfony/process": "~2.3.34|~2.7,>=2.7.6|~3.0.0"
             },
             "suggest": {
                 "symfony/process": ""
@@ -2177,11 +3355,11 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.3-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
+                "psr-4": {
                     "Symfony\\Component\\BrowserKit\\": ""
                 },
                 "exclude-from-classmap": [
@@ -2204,34 +3382,33 @@
             ],
             "description": "Symfony BrowserKit Component",
             "homepage": "https://symfony.com",
-            "time": "2016-03-04 07:12:06"
+            "time": "2016-09-06 10:55:00"
         },
         {
             "name": "symfony/css-selector",
-            "version": "v2.3.42",
-            "target-dir": "Symfony/Component/CssSelector",
+            "version": "v2.8.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/css-selector.git",
-                "reference": "e750fff4bd738e54414fbfdd48ede6b0e99ab808"
+                "reference": "981abbbd6ba49af338a98490cbe29e7f39ca9fa9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/css-selector/zipball/e750fff4bd738e54414fbfdd48ede6b0e99ab808",
-                "reference": "e750fff4bd738e54414fbfdd48ede6b0e99ab808",
+                "url": "https://api.github.com/repos/symfony/css-selector/zipball/981abbbd6ba49af338a98490cbe29e7f39ca9fa9",
+                "reference": "981abbbd6ba49af338a98490cbe29e7f39ca9fa9",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=5.3.9"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.3-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
+                "psr-4": {
                     "Symfony\\Component\\CssSelector\\": ""
                 },
                 "exclude-from-classmap": [
@@ -2258,28 +3435,28 @@
             ],
             "description": "Symfony CssSelector Component",
             "homepage": "https://symfony.com",
-            "time": "2016-03-04 07:12:06"
+            "time": "2016-11-03 07:52:58"
         },
         {
             "name": "symfony/dom-crawler",
-            "version": "v2.3.42",
-            "target-dir": "Symfony/Component/DomCrawler",
+            "version": "v2.8.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/dom-crawler.git",
-                "reference": "b1a52aeafe4dd31914c75e72fc9b9ca3a3e5981d"
+                "reference": "7f565fe00e580c1edf732234a6d26e9b796bd105"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b1a52aeafe4dd31914c75e72fc9b9ca3a3e5981d",
-                "reference": "b1a52aeafe4dd31914c75e72fc9b9ca3a3e5981d",
+                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/7f565fe00e580c1edf732234a6d26e9b796bd105",
+                "reference": "7f565fe00e580c1edf732234a6d26e9b796bd105",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=5.3.9",
+                "symfony/polyfill-mbstring": "~1.0"
             },
             "require-dev": {
-                "symfony/css-selector": "~2.0,>=2.0.5"
+                "symfony/css-selector": "~2.8|~3.0.0"
             },
             "suggest": {
                 "symfony/css-selector": ""
@@ -2287,11 +3464,11 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.3-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
+                "psr-4": {
                     "Symfony\\Component\\DomCrawler\\": ""
                 },
                 "exclude-from-classmap": [
@@ -2314,84 +3491,33 @@
             ],
             "description": "Symfony DomCrawler Component",
             "homepage": "https://symfony.com",
-            "time": "2016-04-06 13:13:46"
-        },
-        {
-            "name": "symfony/finder",
-            "version": "v2.3.42",
-            "target-dir": "Symfony/Component/Finder",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/finder.git",
-                "reference": "dce4b58434fc1cbd66e3006e539bb53074dfea82"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/finder/zipball/dce4b58434fc1cbd66e3006e539bb53074dfea82",
-                "reference": "dce4b58434fc1cbd66e3006e539bb53074dfea82",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.3-dev"
-                }
-            },
-            "autoload": {
-                "psr-0": {
-                    "Symfony\\Component\\Finder\\": ""
-                },
-                "exclude-from-classmap": [
-                    "/Tests/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors"
-                }
-            ],
-            "description": "Symfony Finder Component",
-            "homepage": "https://symfony.com",
-            "time": "2016-05-13 14:58:35"
+            "time": "2016-11-14 16:15:57"
         },
         {
             "name": "symfony/process",
-            "version": "v2.3.42",
-            "target-dir": "Symfony/Component/Process",
+            "version": "v2.8.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/process.git",
-                "reference": "89aced1438655ad81fc828c2e2e555e9b88fef3b"
+                "reference": "024de37f8a6b9e5e8244d9eb3fcf3e467dd2a93f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/process/zipball/89aced1438655ad81fc828c2e2e555e9b88fef3b",
-                "reference": "89aced1438655ad81fc828c2e2e555e9b88fef3b",
+                "url": "https://api.github.com/repos/symfony/process/zipball/024de37f8a6b9e5e8244d9eb3fcf3e467dd2a93f",
+                "reference": "024de37f8a6b9e5e8244d9eb3fcf3e467dd2a93f",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=5.3.9"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.3-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
-                "psr-0": {
+                "psr-4": {
                     "Symfony\\Component\\Process\\": ""
                 },
                 "exclude-from-classmap": [
@@ -2414,7 +3540,7 @@
             ],
             "description": "Symfony Process Component",
             "homepage": "https://symfony.com",
-            "time": "2016-03-31 08:39:43"
+            "time": "2016-09-29 14:03:54"
         }
     ],
     "aliases": [],
@@ -2423,7 +3549,10 @@
     "prefer-stable": false,
     "prefer-lowest": false,
     "platform": {
-        "php": ">=5.3.3,<7.0"
+        "php": ">=5.4"
     },
-    "platform-dev": []
+    "platform-dev": [],
+    "platform-overrides": {
+        "php": "5.4"
+    }
 }
--- a/config.php
+++ b/config.php
@@ -1,5 +1,5 @@
 <?php
-// phpBB 3.1.x auto-generated configuration file
+// phpBB 3.2.x auto-generated configuration file
 // Do not change anything in this file!
 $dbms = 'phpbb\\db\\driver\\mysql';
 $dbhost = '[% mysql.pp3.sqlhost %]';
@@ -13,5 +13,5 @@ $acm_type = 'phpbb\\cache\\driver\\file';
 
 @define('PHPBB_INSTALLED', true);
 // @define('PHPBB_DISPLAY_LOAD_TIME', true);
-// @define('DEBUG', true);
+@define('PHPBB_ENVIRONMENT', 'production');
 // @define('DEBUG_CONTAINER', true);
--- /dev/null
+++ b/config/default/config.yml
@@ -0,0 +1 @@
+# phpBB's config file (This line is needed because of the packager)
--- /dev/null
+++ b/config/default/container/parameters.yml
@@ -0,0 +1,20 @@
+parameters:
+    # Disable the usage of the super globals (_GET, _POST, _SERVER...)
+    core.disable_super_globals: true
+
+    # Datetime class to use
+    datetime.class: \phpbb\datetime
+
+    # Mimetype guesser priorities
+    mimetype.guesser.priority.lowest: -2
+    mimetype.guesser.priority.low: -1
+    mimetype.guesser.priority.default: 0
+    mimetype.guesser.priority.high: 1
+    mimetype.guesser.priority.highest: 2
+
+    # List of default password driver types
+    passwords.algorithms:
+        - passwords.driver.bcrypt_2y
+        - passwords.driver.bcrypt
+        - passwords.driver.salted_md5
+        - passwords.driver.phpass
--- /dev/null
+++ b/config/default/container/services.yml
@@ -0,0 +1,169 @@
+imports:
+    - { resource: services_attachment.yml }
+    - { resource: services_auth.yml }
+    - { resource: services_avatar.yml }
+    - { resource: services_captcha.yml }
+    - { resource: services_console.yml }
+    - { resource: services_content.yml }
+    - { resource: services_cron.yml }
+    - { resource: services_db.yml }
+    - { resource: services_event.yml }
+    - { resource: services_feed.yml }
+    - { resource: services_files.yml }
+    - { resource: services_filesystem.yml }
+    - { resource: services_help.yml }
+    - { resource: services_hook.yml }
+    - { resource: services_http.yml }
+    - { resource: services_language.yml }
+    - { resource: services_migrator.yml }
+    - { resource: services_mimetype_guesser.yml }
+    - { resource: services_module.yml }
+    - { resource: services_notification.yml }
+    - { resource: services_password.yml }
+    - { resource: services_php.yml }
+    - { resource: services_profilefield.yml }
+    - { resource: services_report.yml }
+    - { resource: services_routing.yml }
+    - { resource: services_text_formatter.yml }
+    - { resource: services_text_reparser.yml }
+    - { resource: services_twig.yml }
+    - { resource: services_user.yml }
+
+    - { resource: tables.yml }
+    - { resource: parameters.yml }
+
+services:
+    cache:
+        class: phpbb\cache\service
+        arguments:
+             - '@cache.driver'
+             - '@config'
+             - '@dbal.conn'
+             - '%core.root_path%'
+             - '%core.php_ext%'
+
+    cache.driver:
+        class: '%cache.driver.class%'
+
+    class_loader:
+        class: phpbb\class_loader
+        arguments:
+            - phpbb\
+            - '%core.root_path%includes/'
+            - '%core.php_ext%'
+        calls:
+            - [register, []]
+            - [set_cache, ['@cache.driver']]
+
+    class_loader.ext:
+        class: phpbb\class_loader
+        arguments:
+            - \
+            - '%core.root_path%ext/'
+            - '%core.php_ext%'
+        calls:
+            - [register, []]
+            - [set_cache, ['@cache.driver']]
+
+    config:
+        class: phpbb\config\db
+        arguments:
+            - '@dbal.conn'
+            - '@cache.driver'
+            - '%tables.config%'
+
+    config.php:
+        synthetic: true
+
+    config_text:
+        class: phpbb\config\db_text
+        arguments:
+            - '@dbal.conn'
+            - '%tables.config_text%'
+
+    controller.helper:
+        class: phpbb\controller\helper
+        arguments:
+            - '@template'
+            - '@user'
+            - '@config'
+            - '@symfony_request'
+            - '@request'
+            - '@routing.helper'
+
+    controller.resolver:
+        class: phpbb\controller\resolver
+        arguments:
+            - '@service_container'
+            - '%core.root_path%'
+            - '@template'
+
+    ext.manager:
+        class: phpbb\extension\manager
+        arguments:
+            - '@service_container'
+            - '@dbal.conn'
+            - '@config'
+            - '@filesystem'
+            - '%tables.ext%'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '@cache'
+
+    file_downloader:
+        class: phpbb\file_downloader
+
+    file_locator:
+        class: phpbb\routing\file_locator
+        arguments:
+            - '@filesystem'
+            - '%core.root_path%'
+
+    group_helper:
+        class: phpbb\group\helper
+        arguments:
+            - '@language'
+
+    log:
+        class: phpbb\log\log
+        arguments:
+            - '@dbal.conn'
+            - '@user'
+            - '@auth'
+            - '@dispatcher'
+            - '%core.root_path%'
+            - '%core.adm_relative_path%'
+            - '%core.php_ext%'
+            - '%tables.log%'
+
+    path_helper:
+        class: phpbb\path_helper
+        arguments:
+            - '@symfony_request'
+            - '@filesystem'
+            - '@request'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '%core.adm_relative_path%'
+
+    plupload:
+        class: phpbb\plupload\plupload
+        arguments:
+            - '%core.root_path%'
+            - '@config'
+            - '@request'
+            - '@user'
+            - '@php_ini'
+            - '@mimetype.guesser'
+
+    upload_imagesize:
+        class: FastImageSize\FastImageSize
+
+    version_helper:
+        class: phpbb\version_helper
+        shared: false
+        arguments:
+            - '@cache'
+            - '@config'
+            - '@file_downloader'
+            - '@user'
--- /dev/null
+++ b/config/default/container/services_attachment.yml
@@ -0,0 +1,40 @@
+services:
+    attachment.delete:
+        class: phpbb\attachment\delete
+        shared: false
+        arguments:
+            - '@config'
+            - '@dbal.conn'
+            - '@dispatcher'
+            - '@filesystem'
+            - '@attachment.resync'
+            - '%core.root_path%'
+
+    attachment.manager:
+        class: phpbb\attachment\manager
+        shared: false
+        arguments:
+            - '@attachment.delete'
+            - '@attachment.resync'
+            - '@attachment.upload'
+
+    attachment.resync:
+        class: phpbb\attachment\resync
+        shared: false
+        arguments:
+            - '@dbal.conn'
+
+    attachment.upload:
+        class: phpbb\attachment\upload
+        shared: false
+        arguments:
+            - '@auth'
+            - '@cache'
+            - '@config'
+            - '@files.upload'
+            - '@language'
+            - '@mimetype.guesser'
+            - '@dispatcher'
+            - '@plupload'
+            - '@user'
+            - '%core.root_path%'
--- /dev/null
+++ b/config/default/container/services_auth.yml
@@ -0,0 +1,110 @@
+services:
+# ----- Auth management -----
+    auth:
+        class: phpbb\auth\auth
+
+# ----- Auth providers -----
+    auth.provider_collection:
+        class: phpbb\auth\provider_collection
+        arguments:
+            - '@service_container'
+            - '@config'
+        tags:
+            - { name: service_collection, tag: auth.provider }
+
+    auth.provider.db:
+        class: phpbb\auth\provider\db
+        arguments:
+            - '@dbal.conn'
+            - '@config'
+            - '@passwords.manager'
+            - '@request'
+            - '@user'
+            - '@service_container'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: auth.provider }
+
+    auth.provider.apache:
+        class: phpbb\auth\provider\apache
+        arguments:
+            - '@dbal.conn'
+            - '@config'
+            - '@passwords.manager'
+            - '@request'
+            - '@user'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: auth.provider }
+
+    auth.provider.ldap:
+        class: phpbb\auth\provider\ldap
+        arguments:
+            - '@dbal.conn'
+            - '@config'
+            - '@passwords.manager'
+            - '@user'
+        tags:
+            - { name: auth.provider }
+
+    auth.provider.oauth:
+        class: phpbb\auth\provider\oauth\oauth
+        arguments:
+            - '@dbal.conn'
+            - '@config'
+            - '@passwords.manager'
+            - '@request'
+            - '@user'
+            - '%tables.auth_provider_oauth_token_storage%'
+            - '%tables.auth_provider_oauth_states%'
+            - '%tables.auth_provider_oauth_account_assoc%'
+            - '@auth.provider.oauth.service_collection'
+            - '%tables.users%'
+            - '@service_container'
+            - '@dispatcher'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: auth.provider }
+
+# ----- OAuth services providers -----
+    auth.provider.oauth.service_collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: auth.provider.oauth.service }
+
+    auth.provider.oauth.service.bitly:
+        class: phpbb\auth\provider\oauth\service\bitly
+        arguments:
+            - '@config'
+            - '@request'
+        tags:
+            - { name: auth.provider.oauth.service }
+
+    auth.provider.oauth.service.facebook:
+        class: phpbb\auth\provider\oauth\service\facebook
+        arguments:
+            - '@config'
+            - '@request'
+        tags:
+            - { name: auth.provider.oauth.service }
+
+    auth.provider.oauth.service.google:
+        class: phpbb\auth\provider\oauth\service\google
+        arguments:
+            - '@config'
+            - '@request'
+        tags:
+            - { name: auth.provider.oauth.service }
+
+    auth.provider.oauth.service.twitter:
+        class: phpbb\auth\provider\oauth\service\twitter
+        arguments:
+            - '@config'
+            - '@request'
+        tags:
+            - { name: auth.provider.oauth.service }
--- /dev/null
+++ b/config/default/container/services_avatar.yml
@@ -0,0 +1,72 @@
+services:
+    avatar.manager:
+        class: phpbb\avatar\manager
+        arguments:
+            - '@config'
+            - '@avatar.driver_collection'
+
+# ----- Avatar drivers -----
+    avatar.driver_collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: avatar.driver }
+
+    avatar.driver.gravatar:
+        class: phpbb\avatar\driver\gravatar
+        arguments:
+            - '@config'
+            - '@upload_imagesize'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '@path_helper'
+            - '@cache.driver'
+        calls:
+            - [set_name, [avatar.driver.gravatar]]
+        tags:
+            - { name: avatar.driver }
+
+    avatar.driver.local:
+        class: phpbb\avatar\driver\local
+        arguments:
+            - '@config'
+            - '@upload_imagesize'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '@path_helper'
+            - '@cache.driver'
+        calls:
+            - [set_name, [avatar.driver.local]]
+        tags:
+            - { name: avatar.driver }
+
+    avatar.driver.remote:
+        class: phpbb\avatar\driver\remote
+        arguments:
+            - '@config'
+            - '@upload_imagesize'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '@path_helper'
+            - '@cache.driver'
+        calls:
+            - [set_name, [avatar.driver.remote]]
+        tags:
+            - { name: avatar.driver }
+
+    avatar.driver.upload:
+        class: phpbb\avatar\driver\upload
+        arguments:
+            - '@config'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '@filesystem'
+            - '@path_helper'
+            - '@dispatcher'
+            - '@files.factory'
+            - '@cache.driver'
+        calls:
+            - [set_name, [avatar.driver.upload]]
+        tags:
+            - { name: avatar.driver }
--- /dev/null
+++ b/config/default/container/services_captcha.yml
@@ -0,0 +1,59 @@
+services:
+    captcha.factory:
+        class: phpbb\captcha\factory
+        arguments:
+            - '@service_container'
+            - '@captcha.plugins.service_collection'
+
+# ----- Captcha plugins -----
+# Service MUST NOT be shared for all the plugins to work.
+    captcha.plugins.service_collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: captcha.plugins }
+
+    core.captcha.plugins.gd:
+        class: phpbb\captcha\plugins\gd
+        shared: false
+        calls:
+            - [set_name, [core.captcha.plugins.gd]]
+        tags:
+            - { name: captcha.plugins }
+
+    core.captcha.plugins.gd_wave:
+        class: phpbb\captcha\plugins\gd_wave
+        shared: false
+        calls:
+            - [set_name, [core.captcha.plugins.gd_wave]]
+        tags:
+            - { name: captcha.plugins }
+
+    core.captcha.plugins.nogd:
+        class: phpbb\captcha\plugins\nogd
+        shared: false
+        calls:
+            - [set_name, [core.captcha.plugins.nogd]]
+        tags:
+            - { name: captcha.plugins }
+
+    core.captcha.plugins.qa:
+        class: phpbb\captcha\plugins\qa
+        shared: false
+        arguments:
+            - '%tables.captcha_qa_questions%'
+            - '%tables.captcha_qa_answers%'
+            - '%tables.captcha_qa_confirm%'
+        calls:
+            - [set_name, [core.captcha.plugins.qa]]
+        tags:
+            - { name: captcha.plugins }
+
+    core.captcha.plugins.recaptcha:
+        class: phpbb\captcha\plugins\recaptcha
+        shared: false
+        calls:
+            - [set_name, [core.captcha.plugins.recaptcha]]
+        tags:
+            - { name: captcha.plugins }
--- /dev/null
+++ b/config/default/container/services_console.yml
@@ -0,0 +1,273 @@
+services:
+    console.exception_subscriber:
+        class: phpbb\console\exception_subscriber
+        arguments:
+            - '@language'
+            - '%debug.exceptions%'
+        tags:
+            - { name: kernel.event_subscriber }
+
+    console.command_collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: console.command }
+
+    console.command.cache.purge:
+        class: phpbb\console\command\cache\purge
+        arguments:
+            - '@user'
+            - '@cache.driver'
+            - '@dbal.conn'
+            - '@auth'
+            - '@log'
+            - '@config'
+        tags:
+            - { name: console.command }
+
+    console.command.config.delete:
+        class: phpbb\console\command\config\delete
+        arguments:
+            - '@user'
+            - '@config'
+        tags:
+            - { name: console.command }
+
+    console.command.config.increment:
+        class: phpbb\console\command\config\increment
+        arguments:
+            - '@user'
+            - '@config'
+        tags:
+            - { name: console.command }
+
+    console.command.config.get:
+        class: phpbb\console\command\config\get
+        arguments:
+            - '@user'
+            - '@config'
+        tags:
+            - { name: console.command }
+
+    console.command.config.set:
+        class: phpbb\console\command\config\set
+        arguments:
+            - '@user'
+            - '@config'
+        tags:
+            - { name: console.command }
+
+    console.command.config.set_atomic:
+        class: phpbb\console\command\config\set_atomic
+        arguments:
+            - '@user'
+            - '@config'
+        tags:
+            - { name: console.command }
+
+    console.command.cron.list:
+        class: phpbb\console\command\cron\cron_list
+        arguments:
+            - '@user'
+            - '@cron.manager'
+        tags:
+            - { name: console.command }
+
+    console.command.cron.run:
+        class: phpbb\console\command\cron\run
+        arguments:
+            - '@user'
+            - '@cron.manager'
+            - '@cron.lock_db'
+        tags:
+            - { name: console.command }
+
+    console.command.db.list:
+        class: phpbb\console\command\db\list_command
+        arguments:
+            - '@user'
+            - '@migrator'
+            - '@ext.manager'
+            - '@config'
+            - '@cache'
+        tags:
+            - { name: console.command }
+
+    console.command.db.migrate:
+        class: phpbb\console\command\db\migrate
+        arguments:
+            - '@user'
+            - '@language'
+            - '@migrator'
+            - '@ext.manager'
+            - '@config'
+            - '@cache'
+            - '@log'
+            - '@filesystem'
+            - '%core.root_path%'
+        tags:
+            - { name: console.command }
+
+    console.command.db.revert:
+        class: phpbb\console\command\db\revert
+        parent: console.command.db.migrate
+        tags:
+            - { name: console.command }
+
+    console.command.dev.migration_tips:
+        class: phpbb\console\command\dev\migration_tips
+        arguments:
+            - '@user'
+            - '@ext.manager'
+        tags:
+            - { name: console.command }
+
+    console.command.extension.disable:
+        class: phpbb\console\command\extension\disable
+        arguments:
+            - '@user'
+            - '@ext.manager'
+            - '@log'
+        tags:
+            - { name: console.command }
+
+    console.command.extension.enable:
+        class: phpbb\console\command\extension\enable
+        arguments:
+            - '@user'
+            - '@ext.manager'
+            - '@log'
+        tags:
+            - { name: console.command }
+
+    console.command.extension.purge:
+        class: phpbb\console\command\extension\purge
+        arguments:
+            - '@user'
+            - '@ext.manager'
+            - '@log'
+        tags:
+            - { name: console.command }
+
+    console.command.extension.show:
+        class: phpbb\console\command\extension\show
+        arguments:
+            - '@user'
+            - '@ext.manager'
+            - '@log'
+        tags:
+            - { name: console.command }
+
+    console.command.fixup.recalculate_email_hash:
+        class: phpbb\console\command\fixup\recalculate_email_hash
+        arguments:
+            - '@user'
+            - '@dbal.conn'
+        tags:
+            - { name: console.command }
+
+    console.command.reparser.list:
+        class: phpbb\console\command\reparser\list_all
+        arguments:
+            - '@user'
+            - '@text_reparser_collection'
+        tags:
+            - { name: console.command }
+
+    console.command.reparser.reparse:
+        class: phpbb\console\command\reparser\reparse
+        arguments:
+            - '@user'
+            - '@text_reparser.lock'
+            - '@text_reparser.manager'
+            - '@text_reparser_collection'
+        tags:
+            - { name: console.command }
+
+    console.command.thumbnail.delete:
+        class: phpbb\console\command\thumbnail\delete
+        arguments:
+            - '@user'
+            - '@dbal.conn'
+            - '%core.root_path%'
+        tags:
+            - { name: console.command }
+
+    console.command.thumbnail.generate:
+        class: phpbb\console\command\thumbnail\generate
+        arguments:
+            - '@user'
+            - '@dbal.conn'
+            - '@cache'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: console.command }
+
+    console.command.thumbnail.recreate:
+        class: phpbb\console\command\thumbnail\recreate
+        arguments:
+            - '@user'
+        tags:
+            - { name: console.command }
+
+    console.command.update.check:
+        class: phpbb\console\command\update\check
+        arguments:
+            - '@user'
+            - '@config'
+            - '@service_container'
+            - '@language'
+        tags:
+            - { name: console.command }
+
+    console.command.user.activate:
+        class: phpbb\console\command\user\activate
+        arguments:
+            - '@user'
+            - '@dbal.conn'
+            - '@config'
+            - '@language'
+            - '@log'
+            - '@notification_manager'
+            - '@user_loader'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: console.command }
+
+    console.command.user.add:
+        class: phpbb\console\command\user\add
+        arguments:
+            - '@user'
+            - '@dbal.conn'
+            - '@config'
+            - '@language'
+            - '@passwords.manager'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: console.command }
+
+    console.command.user.delete:
+        class: phpbb\console\command\user\delete
+        arguments:
+            - '@user'
+            - '@dbal.conn'
+            - '@language'
+            - '@log'
+            - '@user_loader'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: console.command }
+
+    console.command.user.reclean:
+        class: phpbb\console\command\user\reclean
+        arguments:
+            - '@user'
+            - '@dbal.conn'
+            - '@language'
+        tags:
+            - { name: console.command }
--- /dev/null
+++ b/config/default/container/services_content.yml
@@ -0,0 +1,72 @@
+services:
+    content.visibility:
+        class: phpbb\content_visibility
+        arguments:
+            - '@auth'
+            - '@config'
+            - '@dispatcher'
+            - '@dbal.conn'
+            - '@user'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '%tables.forums%'
+            - '%tables.posts%'
+            - '%tables.topics%'
+            - '%tables.users%'
+
+    groupposition.legend:
+        class: phpbb\groupposition\legend
+        arguments:
+            - '@dbal.conn'
+            - '@user'
+
+    groupposition.teampage:
+        class: phpbb\groupposition\teampage
+        arguments:
+            - '@dbal.conn'
+            - '@user'
+            - '@cache.driver'
+
+    message.form.admin:
+        class: phpbb\message\admin_form
+        arguments:
+            - '@auth'
+            - '@config'
+            - '@config_text'
+            - '@dbal.conn'
+            - '@user'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+
+    message.form.topic:
+        class: phpbb\message\topic_form
+        arguments:
+            - '@auth'
+            - '@config'
+            - '@dbal.conn'
+            - '@user'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+
+    message.form.user:
+        class: phpbb\message\user_form
+        arguments:
+            - '@auth'
+            - '@config'
+            - '@dbal.conn'
+            - '@user'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+
+    pagination:
+        class: phpbb\pagination
+        arguments:
+            - '@template'
+            - '@user'
+            - '@controller.helper'
+            - '@dispatcher'
+
+    viewonline_helper:
+        class: phpbb\viewonline_helper
+        arguments:
+            - '@filesystem'
--- /dev/null
+++ b/config/default/container/services_cron.yml
@@ -0,0 +1,221 @@
+services:
+    cron.manager:
+        class: phpbb\cron\manager
+        arguments:
+            - '@cron.task_collection'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+
+    cron.lock_db:
+        class: phpbb\lock\db
+        arguments:
+            - cron_lock
+            - '@config'
+            - '@dbal.conn'
+
+# ----- Cron tasks -----
+    cron.task_collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: cron.task }
+
+    cron.task.core.prune_all_forums:
+        class: phpbb\cron\task\core\prune_all_forums
+        arguments:
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '@config'
+            - '@dbal.conn'
+        calls:
+            - [set_name, [cron.task.core.prune_all_forums]]
+        tags:
+            - { name: cron.task }
+
+    cron.task.core.prune_forum:
+        class: phpbb\cron\task\core\prune_forum
+        arguments:
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '@config'
+            - '@dbal.conn'
+        calls:
+            - [set_name, [cron.task.core.prune_forum]]
+        tags:
+            - { name: cron.task }
+
+    cron.task.core.prune_shadow_topics:
+        class: phpbb\cron\task\core\prune_shadow_topics
+        arguments:
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '@config'
+            - '@dbal.conn'
+            - '@log'
+            - '@user'
+        calls:
+            - [set_name, [cron.task.core.prune_shadow_topics]]
+        tags:
+            - { name: cron.task }
+
+    cron.task.core.prune_notifications:
+        class: phpbb\cron\task\core\prune_notifications
+        arguments:
+            - '@config'
+            - '@notification_manager'
+        calls:
+            - [set_name, [cron.task.core.prune_notifications]]
+        tags:
+            - { name: cron.task }
+
+    cron.task.core.queue:
+        class: phpbb\cron\task\core\queue
+        arguments:
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '@config'
+            - '%core.cache_dir%'
+        calls:
+            - [set_name, [cron.task.core.queue]]
+        tags:
+            - { name: cron.task }
+
+    cron.task.core.tidy_cache:
+        class: phpbb\cron\task\core\tidy_cache
+        arguments:
+            - '@config'
+            - '@cache.driver'
+        calls:
+            - [set_name, [cron.task.core.tidy_cache]]
+        tags:
+            - { name: cron.task }
+
+    cron.task.core.tidy_database:
+        class: phpbb\cron\task\core\tidy_database
+        arguments:
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '@config'
+        calls:
+            - [set_name, [cron.task.core.tidy_database]]
+        tags:
+            - { name: cron.task }
+
+    cron.task.core.tidy_plupload:
+        class: phpbb\cron\task\core\tidy_plupload
+        arguments:
+            - '%core.root_path%'
+            - '@config'
+            - '@log'
+            - '@user'
+        calls:
+            - [set_name, [cron.task.core.tidy_plupload]]
+        tags:
+            - { name: cron.task }
+
+    cron.task.core.tidy_search:
+        class: phpbb\cron\task\core\tidy_search
+        arguments:
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '@auth'
+            - '@config'
+            - '@dbal.conn'
+            - '@user'
+            - '@dispatcher'
+        calls:
+            - [set_name, [cron.task.core.tidy_search]]
+        tags:
+            - { name: cron.task }
+
+    cron.task.core.tidy_sessions:
+        class: phpbb\cron\task\core\tidy_sessions
+        arguments:
+            - '@config'
+            - '@user'
+        calls:
+            - [set_name, [cron.task.core.tidy_sessions]]
+        tags:
+            - { name: cron.task }
+
+    cron.task.core.tidy_warnings:
+        class: phpbb\cron\task\core\tidy_warnings
+        arguments:
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '@config'
+        calls:
+            - [set_name, [cron.task.core.tidy_warnings]]
+        tags:
+            - { name: cron.task }
+
+    cron.task.text_reparser.pm_text:
+        class: phpbb\cron\task\text_reparser\reparser
+        arguments:
+            - '@config'
+            - '@config_text'
+            - '@text_reparser.lock'
+            - '@text_reparser.manager'
+            - '@text_reparser_collection'
+        calls:
+            - [set_name, [cron.task.text_reparser.pm_text]]
+            - [set_reparser, [text_reparser.pm_text]]
+        tags:
+            - { name: cron.task }
+
+    cron.task.text_reparser.poll_option:
+        class: phpbb\cron\task\text_reparser\reparser
+        arguments:
+            - '@config'
+            - '@config_text'
+            - '@text_reparser.lock'
+            - '@text_reparser.manager'
+            - '@text_reparser_collection'
+        calls:
+            - [set_name, [cron.task.text_reparser.poll_option]]
+            - [set_reparser, [text_reparser.poll_option]]
+        tags:
+            - { name: cron.task }
+
+    cron.task.text_reparser.poll_title:
+        class: phpbb\cron\task\text_reparser\reparser
+        arguments:
+            - '@config'
+            - '@config_text'
+            - '@text_reparser.lock'
+            - '@text_reparser.manager'
+            - '@text_reparser_collection'
+        calls:
+            - [set_name, [cron.task.text_reparser.poll_title]]
+            - [set_reparser, [text_reparser.poll_title]]
+        tags:
+            - { name: cron.task }
+
+    cron.task.text_reparser.post_text:
+        class: phpbb\cron\task\text_reparser\reparser
+        arguments:
+            - '@config'
+            - '@config_text'
+            - '@text_reparser.lock'
+            - '@text_reparser.manager'
+            - '@text_reparser_collection'
+        calls:
+            - [set_name, [cron.task.text_reparser.post_text]]
+            - [set_reparser, [text_reparser.post_text]]
+        tags:
+            - { name: cron.task }
+
+    cron.task.text_reparser.user_signature:
+        class: phpbb\cron\task\text_reparser\reparser
+        arguments:
+            - '@config'
+            - '@config_text'
+            - '@text_reparser.lock'
+            - '@text_reparser.manager'
+            - '@text_reparser_collection'
+        calls:
+            - [set_name, [cron.task.text_reparser.user_signature]]
+            - [set_reparser, [text_reparser.user_signature]]
+        tags:
+            - { name: cron.task }
--- /dev/null
+++ b/config/default/container/services_db.yml
@@ -0,0 +1,71 @@
+services:
+    dbal.conn:
+        class: phpbb\db\driver\factory
+        arguments:
+            - '@service_container'
+
+    dbal.conn.driver:
+        synthetic: true
+
+# ----- DB Tools -----
+    dbal.tools.factory:
+        class: phpbb\db\tools\factory
+
+    dbal.tools:
+        class: phpbb\db\tools\tools_interface
+        factory: ['@dbal.tools.factory', get]
+        arguments:
+            - '@dbal.conn.driver'
+
+# ----- DB Extractor -----
+    dbal.extractor.factory:
+        class: phpbb\db\extractor\factory
+        arguments:
+            - '@dbal.conn.driver'
+            - '@service_container'
+
+    dbal.extractor:
+        class: phpbb\db\extractor\extractor_interface
+        factory: ['@dbal.extractor.factory', get]
+
+# ----- DB Extractors for different drivers -----
+# Service MUST NOT be shared for all the handlers to work correctly.
+    dbal.extractor.extractors.mssql_extractor:
+        class: phpbb\db\extractor\mssql_extractor
+        shared: false
+        arguments:
+            - '%core.root_path%'
+            - '@request'
+            - '@dbal.conn.driver'
+
+    dbal.extractor.extractors.mysql_extractor:
+        class: phpbb\db\extractor\mysql_extractor
+        shared: false
+        arguments:
+            - '%core.root_path%'
+            - '@request'
+            - '@dbal.conn.driver'
+
+    dbal.extractor.extractors.oracle_extractor:
+        class: phpbb\db\extractor\oracle_extractor
+        shared: false
+        arguments:
+            - '%core.root_path%'
+            - '@request'
+            - '@dbal.conn.driver'
+
+    dbal.extractor.extractors.postgres_extractor:
+        class: phpbb\db\extractor\postgres_extractor
+        shared: false
+        arguments:
+            - '%core.root_path%'
+            - '@request'
+            - '@dbal.conn.driver'
+
+    dbal.extractor.extractors.sqlite3_extractor:
+        class: phpbb\db\extractor\sqlite3_extractor
+        shared: false
+        arguments:
+            - '%core.root_path%'
+            - '@request'
+            - '@dbal.conn.driver'
--- /dev/null
+++ b/config/default/container/services_event.yml
@@ -0,0 +1,25 @@
+services:
+    dispatcher:
+        class: phpbb\event\dispatcher
+        arguments:
+            - '@service_container'
+
+    kernel_exception_subscriber:
+        class: phpbb\event\kernel_exception_subscriber
+        arguments:
+            - '@template'
+            - '@language'
+        tags:
+            - { name: kernel.event_subscriber }
+
+    kernel_terminate_subscriber:
+        class: phpbb\event\kernel_terminate_subscriber
+        tags:
+            - { name: kernel.event_subscriber }
+
+    symfony_response_listener:
+        class: Symfony\Component\HttpKernel\EventListener\ResponseListener
+        arguments:
+            - UTF-8
+        tags:
+            - { name: kernel.event_subscriber }
--- /dev/null
+++ b/config/default/container/services_feed.yml
@@ -0,0 +1,121 @@
+services:
+    phpbb.feed.controller:
+        class: phpbb\feed\controller\feed
+        arguments:
+            - '@template.twig.environment'
+            - '@symfony_request'
+            - '@controller.helper'
+            - '@config'
+            - '@dbal.conn'
+            - '@service_container'
+            - '@feed.helper'
+            - '@user'
+            - '@auth'
+            - '@dispatcher'
+            - '%core.php_ext%'
+
+    feed.helper:
+        class: phpbb\feed\helper
+        arguments:
+            - '@config'
+            - '@user'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+
+    feed.forum:
+        class: phpbb\feed\forum
+        shared: false
+        arguments:
+            - '@feed.helper'
+            - '@config'
+            - '@dbal.conn'
+            - '@cache.driver'
+            - '@user'
+            - '@auth'
+            - '@content.visibility'
+            - '@dispatcher'
+            - '%core.php_ext%'
+
+    feed.forums:
+        class: phpbb\feed\forums
+        shared: false
+        arguments:
+            - '@feed.helper'
+            - '@config'
+            - '@dbal.conn'
+            - '@cache.driver'
+            - '@user'
+            - '@auth'
+            - '@content.visibility'
+            - '@dispatcher'
+            - '%core.php_ext%'
+
+    feed.news:
+        class: phpbb\feed\news
+        shared: false
+        arguments:
+            - '@feed.helper'
+            - '@config'
+            - '@dbal.conn'
+            - '@cache.driver'
+            - '@user'
+            - '@auth'
+            - '@content.visibility'
+            - '@dispatcher'
+            - '%core.php_ext%'
+
+    feed.overall:
+        class: phpbb\feed\overall
+        shared: false
+        arguments:
+            - '@feed.helper'
+            - '@config'
+            - '@dbal.conn'
+            - '@cache.driver'
+            - '@user'
+            - '@auth'
+            - '@content.visibility'
+            - '@dispatcher'
+            - '%core.php_ext%'
+
+    feed.topic:
+        class: phpbb\feed\topic
+        shared: false
+        arguments:
+            - '@feed.helper'
+            - '@config'
+            - '@dbal.conn'
+            - '@cache.driver'
+            - '@user'
+            - '@auth'
+            - '@content.visibility'
+            - '@dispatcher'
+            - '%core.php_ext%'
+
+    feed.topics:
+        class: phpbb\feed\topics
+        shared: false
+        arguments:
+            - '@feed.helper'
+            - '@config'
+            - '@dbal.conn'
+            - '@cache.driver'
+            - '@user'
+            - '@auth'
+            - '@content.visibility'
+            - '@dispatcher'
+            - '%core.php_ext%'
+
+    feed.topics_active:
+        class: phpbb\feed\topics_active
+        shared: false
+        arguments:
+            - '@feed.helper'
+            - '@config'
+            - '@dbal.conn'
+            - '@cache.driver'
+            - '@user'
+            - '@auth'
+            - '@content.visibility'
+            - '@dispatcher'
+            - '%core.php_ext%'
--- /dev/null
+++ b/config/default/container/services_files.yml
@@ -0,0 +1,57 @@
+services:
+    files.factory:
+        class: phpbb\files\factory
+        arguments:
+            - '@service_container'
+
+    files.filespec:
+        class: phpbb\files\filespec
+        shared: false
+        arguments:
+            - '@filesystem'
+            - '@language'
+            - '@php_ini'
+            - '@upload_imagesize'
+            - '%core.root_path%'
+            - '@mimetype.guesser'
+            - '@plupload'
+
+    files.upload:
+        class: phpbb\files\upload
+        shared: false
+        arguments:
+            - '@filesystem'
+            - '@files.factory'
+            - '@language'
+            - '@php_ini'
+            - '@request'
+
+    files.types.form:
+        class: phpbb\files\types\form
+        shared: false
+        arguments:
+            - '@files.factory'
+            - '@language'
+            - '@php_ini'
+            - '@plupload'
+            - '@request'
+
+    files.types.local:
+        class: phpbb\files\types\local
+        shared: false
+        arguments:
+            - '@files.factory'
+            - '@language'
+            - '@php_ini'
+            - '@request'
+
+    files.types.remote:
+        class: phpbb\files\types\remote
+        shared: false
+        arguments:
+            - '@config'
+            - '@files.factory'
+            - '@language'
+            - '@php_ini'
+            - '@request'
+            - '%core.root_path%'
--- /dev/null
+++ b/config/default/container/services_filesystem.yml
@@ -0,0 +1,3 @@
+services:
+    filesystem:
+        class: phpbb\filesystem\filesystem
--- /dev/null
+++ b/config/default/container/services_help.yml
@@ -0,0 +1,27 @@
+services:
+    phpbb.help.manager:
+        class: phpbb\help\manager
+        arguments:
+            - '@dispatcher'
+            - '@language'
+            - '@template'
+
+    phpbb.help.controller.bbcode:
+        class: phpbb\help\controller\bbcode
+        arguments:
+            - '@controller.helper'
+            - '@phpbb.help.manager'
+            - '@template'
+            - '@language'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+
+    phpbb.help.controller.faq:
+        class: phpbb\help\controller\faq
+        arguments:
+            - '@controller.helper'
+            - '@phpbb.help.manager'
+            - '@template'
+            - '@language'
+            - '%core.root_path%'
+            - '%core.php_ext%'
--- /dev/null
+++ b/config/default/container/services_hook.yml
@@ -0,0 +1,7 @@
+services:
+    hook_finder:
+        class: phpbb\hook\finder
+        arguments:
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '@cache.driver'
--- /dev/null
+++ b/config/default/container/services_http.yml
@@ -0,0 +1,23 @@
+services:
+    http_kernel:
+        class: Symfony\Component\HttpKernel\HttpKernel
+        arguments:
+            - '@dispatcher'
+            - '@controller.resolver'
+            - '@request_stack'
+
+    # WARNING: The Symfony request does not escape the input and should be used very carefully
+    #           prefer the phpbb request (service @request) as possible
+    symfony_request:
+        class: phpbb\symfony_request
+        arguments:
+            - '@request'
+
+    request_stack:
+        class: Symfony\Component\HttpFoundation\RequestStack
+
+    request:
+        class: phpbb\request\request
+        arguments:
+            - null
+            - '%core.disable_super_globals%'
--- /dev/null
+++ b/config/default/container/services_language.yml
@@ -0,0 +1,22 @@
+services:
+    language.helper.language_file:
+        class: phpbb\language\language_file_helper
+        arguments:
+            - '%core.root_path%'
+
+    language:
+        class: phpbb\language\language
+        arguments:
+            - '@language.loader'
+
+    language.loader_abstract:
+        abstract: true
+        class: phpbb\language\language_file_loader
+        arguments:
+            - '%core.root_path%'
+            - '%core.php_ext%'
+
+    language.loader:
+        parent: language.loader_abstract
+        calls:
+            - [set_extension_manager, ['@ext.manager']]
--- /dev/null
+++ b/config/default/container/services_migrator.yml
@@ -0,0 +1,64 @@
+services:
+# ----- Migrator -----
+    migrator:
+        class: phpbb\db\migrator
+        arguments:
+            - '@service_container'
+            - '@config'
+            - '@dbal.conn'
+            - '@dbal.tools'
+            - '%tables.migrations%'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '%core.table_prefix%'
+            - '@migrator.tool_collection'
+            - '@migrator.helper'
+
+    migrator.helper:
+        class: phpbb\db\migration\helper
+
+# ----- Migrator's tools -----
+    migrator.tool_collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: migrator.tool }
+
+    migrator.tool.config:
+        class: phpbb\db\migration\tool\config
+        arguments:
+            - '@config'
+        tags:
+            - { name: migrator.tool }
+
+    migrator.tool.config_text:
+        class: phpbb\db\migration\tool\config_text
+        arguments:
+            - '@config_text'
+        tags:
+            - { name: migrator.tool }
+
+    migrator.tool.module:
+        class: phpbb\db\migration\tool\module
+        arguments:
+            - '@dbal.conn'
+            - '@cache'
+            - '@user'
+            - '@module.manager'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '%tables.modules%'
+        tags:
+            - { name: migrator.tool }
+
+    migrator.tool.permission:
+        class: phpbb\db\migration\tool\permission
+        arguments:
+            - '@dbal.conn'
+            - '@cache'
+            - '@auth'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: migrator.tool }
--- /dev/null
+++ b/config/default/container/services_mimetype_guesser.yml
@@ -0,0 +1,36 @@
+services:
+    mimetype.guesser_collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: mimetype.guessers }
+
+    mimetype.fileinfo_mimetype_guesser:
+        class: Symfony\Component\HttpFoundation\File\MimeType\FileinfoMimeTypeGuesser
+        tags:
+            - { name: mimetype.guessers }
+
+    mimetype.filebinary_mimetype_guesser:
+        class: Symfony\Component\HttpFoundation\File\MimeType\FileBinaryMimeTypeGuesser
+        tags:
+            - { name: mimetype.guessers }
+
+    mimetype.content_guesser:
+        class: phpbb\mimetype\content_guesser
+        calls:
+            - [set_priority, ['%mimetype.guesser.priority.low%']]
+        tags:
+            - { name: mimetype.guessers }
+
+    mimetype.extension_guesser:
+        class: phpbb\mimetype\extension_guesser
+        calls:
+            - [set_priority, ['%mimetype.guesser.priority.lowest%']]
+        tags:
+            - { name: mimetype.guessers }
+
+    mimetype.guesser:
+        class: phpbb\mimetype\guesser
+        arguments:
+            - '@mimetype.guesser_collection'
--- /dev/null
+++ b/config/default/container/services_module.yml
@@ -0,0 +1,10 @@
+services:
+    module.manager:
+        class: phpbb\module\module_manager
+        arguments:
+            - '@cache.driver'
+            - '@dbal.conn'
+            - '@ext.manager'
+            - '%tables.modules%'
+            - '%core.root_path%'
+            - '%core.php_ext%'
--- /dev/null
+++ b/config/default/container/services_notification.yml
@@ -0,0 +1,224 @@
+services:
+    notification_manager:
+        class: phpbb\notification\manager
+        arguments:
+            - '@notification.type_collection'
+            - '@notification.method_collection'
+            - '@service_container'
+            - '@user_loader'
+            - '@dispatcher'
+            - '@dbal.conn'
+            - '@cache'
+            - '@language'
+            - '@user'
+            - '%tables.notification_types%'
+            - '%tables.user_notifications%'
+
+# ----- Notification's types -----
+# Service MUST NOT be shared for all the plugins to work.
+    notification.type_collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: notification.type }
+
+    notification.type.base:
+        abstract: true
+        arguments:
+            - '@dbal.conn'
+            - '@language'
+            - '@user'
+            - '@auth'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '%tables.user_notifications%'
+
+    notification.type.admin_activate_user:
+        class: phpbb\notification\type\admin_activate_user
+        shared: false
+        parent: notification.type.base
+        calls:
+            - [set_user_loader, ['@user_loader']]
+            - [set_config, ['@config']]
+        tags:
+            - { name: notification.type }
+
+    notification.type.approve_post:
+        class: phpbb\notification\type\approve_post
+        shared: false
+        parent: notification.type.post
+        tags:
+            - { name: notification.type }
+
+    notification.type.approve_topic:
+        class: phpbb\notification\type\approve_topic
+        shared: false
+        parent: notification.type.topic
+        tags:
+            - { name: notification.type }
+
+    notification.type.bookmark:
+        class: phpbb\notification\type\bookmark
+        shared: false
+        parent: notification.type.post
+        tags:
+            - { name: notification.type }
+
+    notification.type.disapprove_post:
+        class: phpbb\notification\type\disapprove_post
+        shared: false
+        parent: notification.type.post
+        tags:
+            - { name: notification.type }
+
+    notification.type.disapprove_topic:
+        class: phpbb\notification\type\disapprove_topic
+        shared: false
+        parent: notification.type.topic
+        tags:
+            - { name: notification.type }
+
+    notification.type.group_request:
+        class: phpbb\notification\type\group_request
+        shared: false
+        parent: notification.type.base
+        calls:
+            - [set_user_loader, ['@user_loader']]
+        tags:
+            - { name: notification.type }
+
+    notification.type.group_request_approved:
+        class: phpbb\notification\type\group_request_approved
+        shared: false
+        parent: notification.type.base
+        tags:
+            - { name: notification.type }
+
+    notification.type.pm:
+        class: phpbb\notification\type\pm
+        shared: false
+        parent: notification.type.base
+        calls:
+            - [set_user_loader, ['@user_loader']]
+            - [set_config, ['@config']]
+        tags:
+            - { name: notification.type }
+
+    notification.type.post:
+        class: phpbb\notification\type\post
+        shared: false
+        parent: notification.type.base
+        calls:
+            - [set_user_loader, ['@user_loader']]
+            - [set_config, ['@config']]
+        tags:
+            - { name: notification.type }
+
+    notification.type.post_in_queue:
+        class: phpbb\notification\type\post_in_queue
+        shared: false
+        parent: notification.type.post
+        tags:
+            - { name: notification.type }
+
+    notification.type.quote:
+        class: phpbb\notification\type\quote
+        shared: false
+        parent: notification.type.post
+        calls:
+            - [set_utils, ['@text_formatter.utils']]
+        tags:
+            - { name: notification.type }
+
+    notification.type.report_pm:
+        class: phpbb\notification\type\report_pm
+        shared: false
+        parent: notification.type.pm
+        tags:
+            - { name: notification.type }
+
+    notification.type.report_pm_closed:
+        class: phpbb\notification\type\report_pm_closed
+        shared: false
+        parent: notification.type.pm
+        tags:
+            - { name: notification.type }
+
+    notification.type.report_post:
+        class: phpbb\notification\type\report_post
+        shared: false
+        parent: notification.type.post
+        tags:
+            - { name: notification.type }
+
+    notification.type.report_post_closed:
+        class: phpbb\notification\type\report_post_closed
+        shared: false
+        parent: notification.type.post
+        tags:
+            - { name: notification.type }
+
+    notification.type.topic:
+        class: phpbb\notification\type\topic
+        shared: false
+        parent: notification.type.base
+        calls:
+            - [set_user_loader, ['@user_loader']]
+            - [set_config, ['@config']]
+        tags:
+            - { name: notification.type }
+
+    notification.type.topic_in_queue:
+        class: phpbb\notification\type\topic_in_queue
+        shared: false
+        parent: notification.type.topic
+        tags:
+            - { name: notification.type }
+
+# ----- Notification's methods -----
+# Service MUST NOT be shared for all the plugins to work.
+    notification.method_collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: notification.method }
+
+    notification.method.board:
+        class: phpbb\notification\method\board
+        shared: false
+        arguments:
+            - '@user_loader'
+            - '@dbal.conn'
+            - '@cache.driver'
+            - '@user'
+            - '@config'
+            - '%tables.notification_types%'
+            - '%tables.notifications%'
+        tags:
+            - { name: notification.method }
+
+    notification.method.email:
+        class: phpbb\notification\method\email
+        shared: false
+        arguments:
+            - '@user_loader'
+            - '@user'
+            - '@config'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: notification.method }
+
+    notification.method.jabber:
+        class: phpbb\notification\method\jabber
+        shared: false
+        arguments:
+            - '@user_loader'
+            - '@user'
+            - '@config'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: notification.method }
--- /dev/null
+++ b/config/default/container/services_password.yml
@@ -0,0 +1,129 @@
+parameters:
+    passwords.driver.bcrypt_cost: 10
+
+services:
+# ----- Password management -----
+    passwords.manager:
+        class: phpbb\passwords\manager
+        arguments:
+            - '@config'
+            - '@passwords.driver_collection'
+            - '@passwords.helper'
+            - '%passwords.algorithms%'
+
+    passwords.helper:
+        class: phpbb\passwords\helper
+
+    passwords.driver_helper:
+        class: phpbb\passwords\driver\helper
+        arguments:
+            - '@config'
+
+# ----- Password's drivers -----
+    passwords.driver_collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: passwords.driver }
+
+    passwords.driver.bcrypt:
+        class: phpbb\passwords\driver\bcrypt
+        arguments:
+            - '@config'
+            - '@passwords.driver_helper'
+            - '%passwords.driver.bcrypt_cost%'
+        tags:
+            - { name: passwords.driver }
+
+    passwords.driver.bcrypt_2y:
+        class: phpbb\passwords\driver\bcrypt_2y
+        arguments:
+            - '@config'
+            - '@passwords.driver_helper'
+            - '%passwords.driver.bcrypt_cost%'
+        tags:
+            - { name: passwords.driver }
+
+    passwords.driver.bcrypt_wcf2:
+        class: phpbb\passwords\driver\bcrypt_wcf2
+        arguments:
+            - '@passwords.driver.bcrypt'
+            - '@passwords.driver_helper'
+        tags:
+            - { name: passwords.driver }
+
+    passwords.driver.salted_md5:
+        class: phpbb\passwords\driver\salted_md5
+        arguments:
+            - '@config'
+            - '@passwords.driver_helper'
+        tags:
+            - { name: passwords.driver }
+
+    passwords.driver.phpass:
+        class: phpbb\passwords\driver\phpass
+        arguments:
+            - '@config'
+            - '@passwords.driver_helper'
+        tags:
+            - { name: passwords.driver }
+
+    passwords.driver.convert_password:
+        class: phpbb\passwords\driver\convert_password
+        arguments:
+            - '@config'
+            - '@passwords.driver_helper'
+        tags:
+            - { name: passwords.driver }
+
+    passwords.driver.sha1_smf:
+        class: phpbb\passwords\driver\sha1_smf
+        arguments:
+            - '@config'
+            - '@passwords.driver_helper'
+        tags:
+            - { name: passwords.driver }
+
+    passwords.driver.sha1_wcf1:
+        class: phpbb\passwords\driver\sha1_wcf1
+        arguments:
+            - '@config'
+            - '@passwords.driver_helper'
+        tags:
+            - { name: passwords.driver }
+
+    passwords.driver.sha1:
+        class: phpbb\passwords\driver\sha1
+        arguments:
+            - '@config'
+            - '@passwords.driver_helper'
+        tags:
+            - { name: passwords.driver }
+
+    passwords.driver.md5_phpbb2:
+        class: phpbb\passwords\driver\md5_phpbb2
+        arguments:
+            - '@request'
+            - '@passwords.driver.salted_md5'
+            - '@passwords.driver_helper'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: passwords.driver }
+
+    passwords.driver.md5_mybb:
+        class: phpbb\passwords\driver\md5_mybb
+        arguments:
+            - '@config'
+            - '@passwords.driver_helper'
+        tags:
+            - { name: passwords.driver }
+
+    passwords.driver.md5_vb:
+        class: phpbb\passwords\driver\md5_vb
+        arguments:
+            - '@config'
+            - '@passwords.driver_helper'
+        tags:
+            - { name: passwords.driver }
--- /dev/null
+++ b/config/default/container/services_php.yml
@@ -0,0 +1,3 @@
+services:
+    php_ini:
+        class: bantu\IniGetWrapper\IniGetWrapper
--- /dev/null
+++ b/config/default/container/services_profilefield.yml
@@ -0,0 +1,102 @@
+services:
+    profilefields.manager:
+        class: phpbb\profilefields\manager
+        arguments:
+            - '@auth'
+            - '@dbal.conn'
+            - '@dispatcher'
+            - '@request'
+            - '@template'
+            - '@profilefields.type_collection'
+            - '@user'
+            - '%tables.profile_fields%'
+            - '%tables.profile_fields_language%'
+            - '%tables.profile_fields_data%'
+
+    profilefields.lang_helper:
+        class: phpbb\profilefields\lang_helper
+        arguments:
+            - '@dbal.conn'
+            - '%tables.profile_fields_options_language%'
+
+# ----- Profile fields types -----
+    profilefields.type_collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: profilefield.type }
+
+    profilefields.type.bool:
+        class: phpbb\profilefields\type\type_bool
+        arguments:
+            - '@profilefields.lang_helper'
+            - '@request'
+            - '@template'
+            - '@user'
+        tags:
+            - { name: profilefield.type }
+
+    profilefields.type.date:
+        class: phpbb\profilefields\type\type_date
+        arguments:
+            - '@request'
+            - '@template'
+            - '@user'
+        tags:
+            - { name: profilefield.type }
+
+    profilefields.type.dropdown:
+        class: phpbb\profilefields\type\type_dropdown
+        arguments:
+            - '@profilefields.lang_helper'
+            - '@request'
+            - '@template'
+            - '@user'
+        tags:
+            - { name: profilefield.type }
+
+    profilefields.type.googleplus:
+        class: phpbb\profilefields\type\type_googleplus
+        arguments:
+            - '@request'
+            - '@template'
+            - '@user'
+        tags:
+            - { name: profilefield.type }
+
+    profilefields.type.int:
+        class: phpbb\profilefields\type\type_int
+        arguments:
+            - '@request'
+            - '@template'
+            - '@user'
+        tags:
+            - { name: profilefield.type }
+
+    profilefields.type.string:
+        class: phpbb\profilefields\type\type_string
+        arguments:
+            - '@request'
+            - '@template'
+            - '@user'
+        tags:
+            - { name: profilefield.type }
+
+    profilefields.type.text:
+        class: phpbb\profilefields\type\type_text
+        arguments:
+            - '@request'
+            - '@template'
+            - '@user'
+        tags:
+            - { name: profilefield.type }
+
+    profilefields.type.url:
+        class: phpbb\profilefields\type\type_url
+        arguments:
+            - '@request'
+            - '@template'
+            - '@user'
+        tags:
+            - { name: profilefield.type }
--- /dev/null
+++ b/config/default/container/services_report.yml
@@ -0,0 +1,53 @@
+services:
+# ----- Report controller -----
+    phpbb.report.controller:
+        class: phpbb\report\controller\report
+        arguments:
+            - '@config'
+            - '@user'
+            - '@template'
+            - '@controller.helper'
+            - '@request'
+            - '@captcha.factory'
+            - '@phpbb.report.handler_factory'
+            - '@phpbb.report.report_reason_list_provider'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+
+# ----- Report handler factory -----
+    phpbb.report.handler_factory:
+        class: phpbb\report\handler_factory
+        arguments:
+            - '@service_container'
+
+# ----- Report UI provider -----
+    phpbb.report.report_reason_list_provider:
+        class: phpbb\report\report_reason_list_provider
+        arguments:
+            - '@dbal.conn.driver'
+            - '@template'
+            - '@user'
+
+# ----- Report handlers -----
+# Service MUST NOT be shared for all the handlers to work correctly.
+    phpbb.report.handlers.report_handler_pm:
+        class: phpbb\report\report_handler_pm
+        shared: false
+        arguments:
+            - '@dbal.conn.driver'
+            - '@dispatcher'
+            - '@config'
+            - '@auth'
+            - '@user'
+            - '@notification_manager'
+
+    phpbb.report.handlers.report_handler_post:
+        class: phpbb\report\report_handler_post
+        shared: false
+        arguments:
+            - '@dbal.conn.driver'
+            - '@dispatcher'
+            - '@config'
+            - '@auth'
+            - '@user'
+            - '@notification_manager'
--- /dev/null
+++ b/config/default/container/services_routing.yml
@@ -0,0 +1,79 @@
+services:
+    router:
+        class: phpbb\routing\router
+        arguments:
+            - '@service_container'
+            - '@routing.chained_resources_locator'
+            - '@routing.delegated_loader'
+            - '%core.php_ext%'
+            - '%core.cache_dir%'
+
+    router.listener:
+        class: Symfony\Component\HttpKernel\EventListener\RouterListener
+        arguments:
+            - '@router'
+            - null
+            - null
+            - '@request_stack'
+        tags:
+            - { name: kernel.event_subscriber }
+
+    routing.helper:
+        class: phpbb\routing\helper
+        arguments:
+            - '@config'
+            - '@router'
+            - '@symfony_request'
+            - '@request'
+            - '@filesystem'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+
+# ---- Route loaders ----
+
+    routing.delegated_loader:
+        class: Symfony\Component\Config\Loader\DelegatingLoader
+        arguments:
+            - '@routing.resolver'
+
+    routing.resolver:
+        class: phpbb\routing\loader_resolver
+        arguments:
+            - '@routing.loader.collection'
+
+    routing.loader.collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: routing.loader }
+
+    routing.loader.yaml:
+        class: Symfony\Component\Routing\Loader\YamlFileLoader
+        arguments:
+            - '@file_locator'
+        tags:
+            - { name: routing.loader }
+
+# ---- Resources Locators ----
+
+    routing.chained_resources_locator:
+        class: phpbb\routing\resources_locator\chained_resources_locator
+        arguments:
+            - '@routing.resources_locator.collection'
+
+    routing.resources_locator.collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: routing.resources_locator }
+
+    routing.resources_locator.default:
+        class: phpbb\routing\resources_locator\default_resources_locator
+        arguments:
+            - '%core.root_path%'
+            - '%core.environment%'
+            - '@ext.manager'
+        tags:
+            - { name: routing.resources_locator }
--- /dev/null
+++ b/config/default/container/services_text_formatter.yml
@@ -0,0 +1,73 @@
+parameters:
+    text_formatter.cache.dir: '%core.cache_dir%'
+    text_formatter.cache.parser.key: _text_formatter_parser
+    text_formatter.cache.renderer.key: _text_formatter_renderer
+
+services:
+    text_formatter.cache:
+        alias: text_formatter.s9e.factory
+
+    text_formatter.data_access:
+        class: phpbb\textformatter\data_access
+        arguments:
+            - '@dbal.conn'
+            - '%tables.bbcodes%'
+            - '%tables.smilies%'
+            - '%tables.styles%'
+            - '%tables.words%'
+            - '%core.root_path%styles/'
+
+    text_formatter.parser:
+        alias: text_formatter.s9e.parser
+
+    text_formatter.renderer:
+        alias: text_formatter.s9e.renderer
+
+    text_formatter.utils:
+        alias: text_formatter.s9e.utils
+
+    text_formatter.s9e.factory:
+        class: phpbb\textformatter\s9e\factory
+        arguments:
+            - '@text_formatter.data_access'
+            - '@cache.driver'
+            - '@dispatcher'
+            - '@config'
+            - '@text_formatter.s9e.link_helper'
+            - '%text_formatter.cache.dir%'
+            - '%text_formatter.cache.parser.key%'
+            - '%text_formatter.cache.renderer.key%'
+
+    text_formatter.s9e.link_helper:
+        class: phpbb\textformatter\s9e\link_helper
+
+    text_formatter.s9e.parser:
+        class: phpbb\textformatter\s9e\parser
+        arguments:
+            - '@cache.driver'
+            - '%text_formatter.cache.parser.key%'
+            - '@text_formatter.s9e.factory'
+            - '@dispatcher'
+
+    text_formatter.s9e.quote_helper:
+        class: phpbb\textformatter\s9e\quote_helper
+        arguments:
+            - '@user'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+
+    text_formatter.s9e.renderer:
+        class: phpbb\textformatter\s9e\renderer
+        arguments:
+            - '@cache.driver'
+            - '%text_formatter.cache.dir%'
+            - '%text_formatter.cache.renderer.key%'
+            - '@text_formatter.s9e.factory'
+            - '@dispatcher'
+        calls:
+            - [configure_quote_helper, ['@text_formatter.s9e.quote_helper']]
+            - [configure_smilies_path, ['@config', '@path_helper']]
+            - [configure_user, ['@user', '@config', '@auth']]
+
+    text_formatter.s9e.utils:
+        class: phpbb\textformatter\s9e\utils
--- /dev/null
+++ b/config/default/container/services_text_reparser.yml
@@ -0,0 +1,109 @@
+services:
+    text_reparser.manager:
+        class: phpbb\textreparser\manager
+        arguments:
+            - '@config'
+            - '@config_text'
+            - '@text_reparser_collection'
+
+    text_reparser.lock:
+        class: phpbb\lock\db
+        arguments:
+            - reparse_lock
+            - '@config'
+            - '@dbal.conn'
+
+    text_reparser_collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: text_reparser.plugin }
+
+    text_reparser.contact_admin_info:
+        class: phpbb\textreparser\plugins\contact_admin_info
+        arguments:
+            - '@config_text'
+        calls:
+            - [set_name, [contact_admin_info]]
+        tags:
+            - { name: text_reparser.plugin }
+
+    text_reparser.forum_description:
+        class: phpbb\textreparser\plugins\forum_description
+        arguments:
+            - '@dbal.conn'
+            - '%tables.forums%'
+        calls:
+            - [set_name, [forum_description]]
+        tags:
+            - { name: text_reparser.plugin }
+
+    text_reparser.forum_rules:
+        class: phpbb\textreparser\plugins\forum_rules
+        arguments:
+            - '@dbal.conn'
+            - '%tables.forums%'
+        calls:
+            - [set_name, [forum_rules]]
+        tags:
+            - { name: text_reparser.plugin }
+
+    text_reparser.group_description:
+        class: phpbb\textreparser\plugins\group_description
+        arguments:
+            - '@dbal.conn'
+            - '%tables.groups%'
+        calls:
+            - [set_name, [group_description]]
+        tags:
+            - { name: text_reparser.plugin }
+
+    text_reparser.pm_text:
+        class: phpbb\textreparser\plugins\pm_text
+        arguments:
+            - '@dbal.conn'
+            - '%tables.privmsgs%'
+        calls:
+            - [set_name, [pm_text]]
+        tags:
+            - { name: text_reparser.plugin }
+
+    text_reparser.poll_option:
+        class: phpbb\textreparser\plugins\poll_option
+        arguments:
+            - '@dbal.conn'
+        calls:
+            - [set_name, [poll_option]]
+        tags:
+            - { name: text_reparser.plugin }
+
+    text_reparser.poll_title:
+        class: phpbb\textreparser\plugins\poll_title
+        arguments:
+            - '@dbal.conn'
+            - '%tables.topics%'
+        calls:
+            - [set_name, [poll_title]]
+        tags:
+            - { name: text_reparser.plugin }
+
+    text_reparser.post_text:
+        class: phpbb\textreparser\plugins\post_text
+        arguments:
+            - '@dbal.conn'
+            - '%tables.posts%'
+        calls:
+            - [set_name, [post_text]]
+        tags:
+            - { name: text_reparser.plugin }
+
+    text_reparser.user_signature:
+        class: phpbb\textreparser\plugins\user_signature
+        arguments:
+            - '@dbal.conn'
+            - '%tables.users%'
+        calls:
+            - [set_name, [user_signature]]
+        tags:
+            - { name: text_reparser.plugin }
--- /dev/null
+++ b/config/default/container/services_twig.yml
@@ -0,0 +1,67 @@
+parameters:
+    core.template.cache_path: '%core.cache_dir%twig/'
+
+services:
+    template.twig.environment:
+        class: phpbb\template\twig\environment
+        arguments:
+            - '@config'
+            - '@filesystem'
+            - '@path_helper'
+            - '%core.template.cache_path%'
+            - '@ext.manager'
+            - '@template.twig.loader'
+            - []
+        calls:
+            - [setLexer, ['@template.twig.lexer']]
+
+    template.twig.lexer:
+        class: phpbb\template\twig\lexer
+        lazy: true
+        arguments:
+            - '@template.twig.environment'
+
+    template.twig.loader:
+        class: phpbb\template\twig\loader
+        arguments:
+            - '@filesystem'
+
+    template.twig.extensions.collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: twig.extension }
+
+    template.twig.extensions.phpbb:
+        class: phpbb\template\twig\extension
+        arguments:
+            - '@template_context'
+            - '@language'
+        tags:
+            - { name: twig.extension }
+
+    template.twig.extensions.routing:
+        class: phpbb\template\twig\extension\routing
+        arguments:
+            - '@routing.helper'
+        tags:
+            - { name: twig.extension }
+
+    template.twig.extensions.debug:
+        class: Twig_Extension_Debug
+
+    template:
+        class: phpbb\template\twig\twig
+        arguments:
+            - '@path_helper'
+            - '@config'
+            - '@template_context'
+            - '@template.twig.environment'
+            - '%core.template.cache_path%'
+            - '@user'
+            - '@template.twig.extensions.collection'
+            - '@ext.manager'
+
+    template_context:
+        class: phpbb\template\context
--- /dev/null
+++ b/config/default/container/services_user.yml
@@ -0,0 +1,20 @@
+services:
+    acl.permissions:
+        class: phpbb\permissions
+        arguments:
+            - '@dispatcher'
+            - '@user'
+
+    user:
+        class: phpbb\user
+        arguments:
+            - '@language'
+            - '%datetime.class%'
+
+    user_loader:
+        class: phpbb\user_loader
+        arguments:
+            - '@dbal.conn'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '%tables.users%'
--- /dev/null
+++ b/config/default/container/tables.yml
@@ -0,0 +1,78 @@
+parameters:
+    tables.acl_groups: '%core.table_prefix%acl_groups'
+    tables.acl_options: '%core.table_prefix%acl_options'
+    tables.acl_roles: '%core.table_prefix%acl_roles'
+    tables.acl_roles_data: '%core.table_prefix%acl_roles_data'
+    tables.acl_users: '%core.table_prefix%acl_users'
+    tables.attachments: '%core.table_prefix%attachments'
+    tables.auth_provider_oauth_token_storage: '%core.table_prefix%oauth_tokens'
+    tables.auth_provider_oauth_states: '%core.table_prefix%oauth_states'
+    tables.auth_provider_oauth_account_assoc: '%core.table_prefix%oauth_accounts'
+    tables.banlist: '%core.table_prefix%banlist'
+    tables.bbcodes: '%core.table_prefix%bbcodes'
+    tables.bookmarks: '%core.table_prefix%bookmarks'
+    tables.bots: '%core.table_prefix%bots'
+    tables.captcha_qa_questions: '%core.table_prefix%captcha_questions'
+    tables.captcha_qa_answers: '%core.table_prefix%captcha_answers'
+    tables.captcha_qa_confirm: '%core.table_prefix%qa_confirm'
+    tables.config: '%core.table_prefix%config'
+    tables.config_text: '%core.table_prefix%config_text'
+    tables.confirm: '%core.table_prefix%confirm'
+    tables.disallow: '%core.table_prefix%disallow'
+    tables.drafts: '%core.table_prefix%drafts'
+    tables.ext: '%core.table_prefix%ext'
+    tables.extensions: '%core.table_prefix%extensions'
+    tables.extension_groups: '%core.table_prefix%extension_groups'
+    tables.forums: '%core.table_prefix%forums'
+    tables.forums_access: '%core.table_prefix%forums_access'
+    tables.forums_track: '%core.table_prefix%forums_track'
+    tables.forums_watch: '%core.table_prefix%forums_watch'
+    tables.groups: '%core.table_prefix%groups'
+    tables.icons: '%core.table_prefix%icons'
+    tables.lang: '%core.table_prefix%lang'
+    tables.log: '%core.table_prefix%log'
+    tables.login_attempts: '%core.table_prefix%login_attempts'
+    tables.migrations: '%core.table_prefix%migrations'
+    tables.moderator_cache: '%core.table_prefix%moderator_cache'
+    tables.modules: '%core.table_prefix%modules'
+    tables.notification_types: '%core.table_prefix%notification_types'
+    tables.notifications: '%core.table_prefix%notifications'
+    tables.poll_options: '%core.table_prefix%poll_options'
+    tables.poll_votes: '%core.table_prefix%poll_votes'
+    tables.posts: '%core.table_prefix%posts'
+    tables.privmsgs: '%core.table_prefix%privmsgs'
+    tables.privmsgs_folder: '%core.table_prefix%privmsgs_folder'
+    tables.privmsgs_rules: '%core.table_prefix%privmsgs_rules'
+    tables.privmsgs_to: '%core.table_prefix%privmsgs_to'
+    tables.profile_fields: '%core.table_prefix%profile_fields'
+    tables.profile_fields_data: '%core.table_prefix%profile_fields_data'
+    tables.profile_fields_options_language: '%core.table_prefix%profile_fields_lang'
+    tables.profile_fields_language: '%core.table_prefix%profile_lang'
+    tables.ranks: '%core.table_prefix%ranks'
+    tables.reports: '%core.table_prefix%reports'
+    tables.reports_reasons: '%core.table_prefix%reports_reasons'
+    tables.search_results: '%core.table_prefix%search_results'
+    tables.search_wordlist: '%core.table_prefix%search_wordlist'
+    tables.search_wordmatch: '%core.table_prefix%search_wordmatch'
+    tables.sessions: '%core.table_prefix%sessions'
+    tables.sessions_keys: '%core.table_prefix%sessions_keys'
+    tables.sitelist: '%core.table_prefix%sitelist'
+    tables.smilies: '%core.table_prefix%smilies'
+    tables.sphinx: '%core.table_prefix%sphinx'
+    tables.styles: '%core.table_prefix%styles'
+    tables.styles_template: '%core.table_prefix%styles_template'
+    tables.styles_template_data: '%core.table_prefix%styles_template_data'
+    tables.styles_theme: '%core.table_prefix%styles_theme'
+    tables.styles_imageset: '%core.table_prefix%styles_imageset'
+    tables.styles_imageset_data: '%core.table_prefix%styles_imageset_data'
+    tables.teampage: '%core.table_prefix%teampage'
+    tables.topics: '%core.table_prefix%topics'
+    tables.topics_posted: '%core.table_prefix%topics_posted'
+    tables.topics_track: '%core.table_prefix%topics_track'
+    tables.topics_watch: '%core.table_prefix%topics_watch'
+    tables.user_group: '%core.table_prefix%user_group'
+    tables.user_notifications: '%core.table_prefix%user_notifications'
+    tables.users: '%core.table_prefix%users'
+    tables.warnings: '%core.table_prefix%warnings'
+    tables.words: '%core.table_prefix%words'
+    tables.zebra: '%core.table_prefix%zebra'
--- /dev/null
+++ b/config/default/routing/feed.yml
@@ -0,0 +1,35 @@
+phpbb_feed_forums:
+    path: /forums
+    defaults: { _controller: phpbb.feed.controller:forums }
+
+phpbb_feed_news:
+    path: /news
+    defaults: { _controller: phpbb.feed.controller:news }
+
+phpbb_feed_topics:
+    path: /topics
+    defaults: { _controller: phpbb.feed.controller:topics }
+
+phpbb_feed_topics_active:
+    path: /topics_active
+    defaults: { _controller: phpbb.feed.controller:topics_active }
+
+phpbb_feed_topics_new:
+    path: /topics_new
+    defaults: { _controller: phpbb.feed.controller:topics_new }
+
+phpbb_feed_forum:
+    path: /forum/{forum_id}
+    defaults: { _controller: phpbb.feed.controller:forum }
+    requirements:
+        forum_id: \d+
+
+phpbb_feed_topic:
+    path: /topic/{topic_id}
+    defaults: { _controller: phpbb.feed.controller:topic }
+    requirements:
+        topic_id: \d+
+
+phpbb_feed_overall:
+    path: /{mode}
+    defaults: { _controller: phpbb.feed.controller:overall }
--- /dev/null
+++ b/config/default/routing/help.yml
@@ -0,0 +1,7 @@
+phpbb_help_bbcode_controller:
+    path: /bbcode
+    defaults: { _controller: phpbb.help.controller.bbcode:handle }
+
+phpbb_help_faq_controller:
+    path: /faq
+    defaults: { _controller: phpbb.help.controller.faq:handle }
--- /dev/null
+++ b/config/default/routing/report.yml
@@ -0,0 +1,17 @@
+phpbb_report_pm_controller:
+    path:             /pm/{id}/report
+    methods:          [GET, POST]
+    defaults:
+        _controller:  phpbb.report.controller:handle
+        mode:         'pm'
+    requirements:
+        id:           \d+
+
+phpbb_report_post_controller:
+    path:             /post/{id}/report
+    methods:          [GET, POST]
+    defaults:
+        _controller:  phpbb.report.controller:handle
+        mode:         'post'
+    requirements:
+        id:           \d+
--- /dev/null
+++ b/config/default/routing/routing.yml
@@ -0,0 +1,24 @@
+# Structure:
+#
+# foo_controller:
+#     path: /foo
+#     defaults: { _controller: foo_sevice:method }
+#
+# The above will be accessed via app.php?controller=foo and it will
+# instantiate the 'foo_service' service and call the 'method' method.
+#
+
+phpbb_feed_routing:
+    resource: feed.yml
+    prefix: /feed
+
+phpbb_feed_index:
+    path: /feed
+    defaults: { _controller: phpbb.feed.controller:overall }
+
+phpbb_help_routing:
+    resource: help.yml
+    prefix: /help
+
+phpbb_report_routing:
+    resource: report.yml
--- /dev/null
+++ b/config/installer/config.yml
@@ -0,0 +1,2 @@
+imports:
+    - { resource: ../default/config.yml }
--- /dev/null
+++ b/config/installer/container/environment.yml
@@ -0,0 +1,3 @@
+imports:
+    - { resource: services.yml }
+    - { resource: parameters.yml }
--- /dev/null
+++ b/config/installer/container/parameters.yml
@@ -0,0 +1,5 @@
+imports:
+    - { resource: ../../default/container/parameters.yml }
+
+parameters:
+    installer.create_config_file.options: []
--- /dev/null
+++ b/config/installer/container/services.yml
@@ -0,0 +1,103 @@
+imports:
+    - { resource: services_installer.yml }
+    - { resource: ../../default/container/services_event.yml }
+    - { resource: ../../default/container/services_filesystem.yml }
+    - { resource: ../../default/container/services_http.yml }
+    - { resource: ../../default/container/services_language.yml }
+    - { resource: ../../default/container/services_php.yml }
+    - { resource: ../../default/container/services_routing.yml }
+    - { resource: ../../default/container/services_twig.yml }
+
+services:
+    cache.driver:
+        class: '%cache.driver.class%'
+        arguments:
+            - '%core.cache_dir%'
+
+    config:
+        class: phpbb\config\config
+        arguments:
+            -
+                rand_seed: 'installer_seed'
+                rand_seed_last_update: 0
+
+    controller.resolver:
+        class: phpbb\controller\resolver
+        arguments:
+            - '@service_container'
+            - '%core.root_path%'
+            - '@template'
+
+    file_locator:
+        class: phpbb\routing\file_locator
+        arguments:
+            - '@filesystem'
+            - '%core.root_path%'
+
+    kernel_exception_subscriber:
+        class: phpbb\install\event\kernel_exception_subscriber
+        arguments:
+            - '@phpbb.installer.controller.helper'
+            - '@language'
+            - '@template'
+        tags:
+            - { name: kernel.event_subscriber }
+
+    language.loader:
+        parent: language.loader_abstract
+
+    path_helper:
+        class: phpbb\path_helper
+        arguments:
+            - '@symfony_request'
+            - '@filesystem'
+            - '@request'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+
+    routing.resources_locator.default:
+        class: phpbb\routing\resources_locator\installer_resources_locator
+        arguments:
+            - '@filesystem'
+            - '%core.root_path%'
+            - '%core.environment%'
+        tags:
+            - { name: routing.resources_locator }
+
+    template:
+        class: phpbb\template\twig\twig
+        arguments:
+            - '@path_helper'
+            - '@config'
+            - '@template_context'
+            - '@template.twig.environment'
+            - '%core.template.cache_path%'
+            - null
+            - '@template.twig.extensions.collection'
+
+    template.twig.environment:
+        class: phpbb\template\twig\environment
+        arguments:
+            - '@config'
+            - '@filesystem'
+            - '@path_helper'
+            - '%core.template.cache_path%'
+            - null
+            - '@template.twig.loader'
+            - []
+        calls:
+            - [setLexer, ['@template.twig.lexer']]
+
+    user:
+        class: phpbb\user
+        arguments:
+            - '@language'
+            - '%datetime.class%'
+
+    console.exception_subscriber:
+        class: phpbb\console\exception_subscriber
+        arguments:
+            - '@language'
+            - '%debug.exceptions%'
+        tags:
+            - { name: kernel.event_subscriber }
--- /dev/null
+++ b/config/installer/container/services_file_updater.yml
@@ -0,0 +1,38 @@
+services:
+    installer.file_updater.factory:
+        class: phpbb\install\helper\file_updater\factory
+        arguments:
+            - '@installer.file_updater.collection'
+
+    installer.file_updater.collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: file_updater }
+
+    installer.file_updater.compress:
+        class: phpbb\install\helper\file_updater\compression_file_updater
+        arguments:
+            - '@installer.helper.update_helper'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: file_updater }
+
+    installer.file_updater.ftp:
+        class: phpbb\install\helper\file_updater\ftp_file_updater
+        arguments:
+            - '@installer.helper.update_helper'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: file_updater }
+
+    installer.file_updater.file:
+        class: phpbb\install\helper\file_updater\file_updater
+        arguments:
+            - '@filesystem'
+            - '%core.root_path%'
+        tags:
+            - { name: file_updater }
--- /dev/null
+++ b/config/installer/container/services_install_console.yml
@@ -0,0 +1,61 @@
+services:
+    console.installer.command_collection:
+        class: phpbb\di\service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: console.installer.command }
+
+    console.installer.command.install:
+        class: phpbb\install\console\command\install\install
+        arguments:
+            - '@language'
+            - '@installer.helper.iohandler_factory'
+            - '@installer.installer.install'
+            - '@installer.helper.install_helper'
+        tags:
+            - { name: console.installer.command }
+
+    console.installer.command.config.show:
+        class: phpbb\install\console\command\install\config\show
+        arguments:
+            - '@language'
+            - '@installer.helper.iohandler_factory'
+        tags:
+            - { name: console.installer.command }
+
+
+    console.installer.command.config.validate:
+        class: phpbb\install\console\command\install\config\validate
+        arguments:
+            - '@language'
+            - '@installer.helper.iohandler_factory'
+        tags:
+            - { name: console.installer.command }
+
+    console.updater.command.update:
+        class: phpbb\install\console\command\update\update
+        arguments:
+            - '@language'
+            - '@installer.helper.iohandler_factory'
+            - '@installer.installer.update'
+            - '@installer.helper.install_helper'
+        tags:
+            - { name: console.installer.command }
+
+    console.updater.command.config.show:
+        class: phpbb\install\console\command\update\config\show
+        arguments:
+            - '@language'
+            - '@installer.helper.iohandler_factory'
+        tags:
+            - { name: console.installer.command }
+
+
+    console.updater.command.config.validate:
+        class: phpbb\install\console\command\update\config\validate
+        arguments:
+            - '@language'
+            - '@installer.helper.iohandler_factory'
+        tags:
+            - { name: console.installer.command }
--- /dev/null
+++ b/config/installer/container/services_install_controller.yml
@@ -0,0 +1,73 @@
+services:
+    phpbb.installer.controller.welcome:
+        class: phpbb\install\controller\installer_index
+        arguments:
+            - '@phpbb.installer.controller.helper'
+            - '@language'
+            - '@template'
+            - '%core.root_path%'
+
+    phpbb.installer.controller.helper:
+        class: phpbb\install\controller\helper
+        arguments:
+            - '@installer.helper.config'
+            - '@language'
+            - '@language.helper.language_file'
+            - '@installer.navigation.provider'
+            - '@template'
+            - '@path_helper'
+            - '@request'
+            - '@symfony_request'
+            - '@router'
+            - '%core.root_path%'
+
+    phpbb.installer.controller.install:
+        class: phpbb\install\controller\install
+        arguments:
+            - '@phpbb.installer.controller.helper'
+            - '@installer.helper.iohandler_factory'
+            - '@installer.navigation.provider'
+            - '@language'
+            - '@template'
+            - '@request'
+            - '@installer.installer.install'
+            - '@installer.helper.install_helper'
+
+    phpbb.installer.controller.update:
+        class: phpbb\install\controller\update
+        arguments:
+            - '@phpbb.installer.controller.helper'
+            - '@installer.installer.update'
+            - '@installer.helper.install_helper'
+            - '@installer.helper.iohandler_factory'
+            - '@language'
+            - '@installer.navigation.provider'
+            - '@request'
+            - '@template'
+
+    phpbb.installer.controller.file_downloader:
+        class: phpbb\install\controller\archive_download
+        arguments:
+            - '@installer.helper.config'
+
+    phpbb.installer.controller.convert:
+        class: phpbb\convert\controller\convertor
+        arguments:
+            - '@cache.driver'
+            - '@installer.helper.container_factory'
+            - '@installer.helper.database'
+            - '@phpbb.installer.controller.helper'
+            - '@installer.helper.install_helper'
+            - '@installer.helper.iohandler_factory'
+            - '@language'
+            - '@installer.navigation.provider'
+            - '@request'
+            - '@template'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+
+    phpbb.installer.controller.status:
+        class: phpbb\install\controller\timeout_check
+        arguments:
+            - '@phpbb.installer.controller.helper'
+            - '%core.root_path%'
--- /dev/null
+++ b/config/installer/container/services_install_data.yml
@@ -0,0 +1,45 @@
+services:
+    installer.install_data.add_bots:
+        class: phpbb\install\module\install_data\task\add_bots
+        arguments:
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '@installer.helper.container_factory'
+            - '@language'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: install_data_install, order: 20 }
+
+    installer.install_data.add_languages:
+        class: phpbb\install\module\install_data\task\add_languages
+        arguments:
+            - '@installer.helper.iohandler'
+            - '@installer.helper.container_factory'
+            - '@language.helper.language_file'
+        tags:
+            - { name: install_data_install, order: 10 }
+
+    installer.install_data.add_modules:
+        class: phpbb\install\module\install_data\task\add_modules
+        arguments:
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '@installer.helper.container_factory'
+        tags:
+            - { name: install_data_install, order: 30 }
+
+    installer.module.data_install_collection:
+        class: phpbb\di\ordered_service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: install_data_install, class_name_aware: true }
+
+    installer.module.data_install:
+        class: phpbb\install\module\install_data\module
+        parent: installer.module_base
+        arguments:
+            - '@installer.module.data_install_collection'
+        tags:
+            - { name: installer_install_module, order: 50 }
--- /dev/null
+++ b/config/installer/container/services_install_database.yml
@@ -0,0 +1,71 @@
+services:
+    installer.install_database.create_schema_file:
+        class: phpbb\install\module\install_database\task\create_schema_file
+        arguments:
+            - '@installer.helper.config'
+            - '@installer.helper.database'
+            - '@filesystem'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: install_database_install, order: 10 }
+
+    installer.install_database.set_up_database:
+        class: phpbb\install\module\install_database\task\set_up_database
+        arguments:
+            - '@installer.helper.config'
+            - '@installer.helper.database'
+            - '@filesystem'
+            - '@installer.helper.iohandler'
+            - '%core.root_path%'
+        tags:
+            - { name: install_database_install, order: 20 }
+
+    installer.install_database.add_tables:
+        class: phpbb\install\module\install_database\task\add_tables
+        arguments:
+            - '@installer.helper.config'
+            - '@installer.helper.database'
+            - '@filesystem'
+            - '%core.root_path%'
+        tags:
+            - { name: install_database_install, order: 30 }
+
+    installer.install_database.add_default_data:
+        class: phpbb\install\module\install_database\task\add_default_data
+        arguments:
+            - '@installer.helper.database'
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '@installer.helper.container_factory'
+            - '@language'
+            - '%core.root_path%'
+        tags:
+            - { name: install_database_install, order: 40 }
+
+    installer.install_database.add_config_settings:
+        class: phpbb\install\module\install_database\task\add_config_settings
+        arguments:
+            - '@filesystem'
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '@installer.helper.container_factory'
+            - '@language'
+            - '%core.root_path%'
+        tags:
+            - { name: install_database_install, order: 50 }
+
+    installer.module.install_database_collection:
+        class: phpbb\di\ordered_service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: install_database_install, class_name_aware: true }
+
+    installer.module.database_install:
+        class: phpbb\install\module\install_database\module
+        parent: installer.module_base
+        arguments:
+            - '@installer.module.install_database_collection'
+        tags:
+            - { name: installer_install_module, order: 40 }
--- /dev/null
+++ b/config/installer/container/services_install_filesystem.yml
@@ -0,0 +1,28 @@
+services:
+    installer.install_filesystem.create_config_file:
+        class: phpbb\install\module\install_filesystem\task\create_config_file
+        arguments:
+            - '@filesystem'
+            - '@installer.helper.config'
+            - '@installer.helper.database'
+            - '@installer.helper.iohandler'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - '%installer.create_config_file.options%'
+        tags:
+            - { name: install_filesystem_install, order: 10 }
+
+    installer.module.install_filesystem_collection:
+        class: phpbb\di\ordered_service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: install_filesystem_install, class_name_aware: true }
+
+    installer.module.filesystem_install:
+        class: phpbb\install\module\install_filesystem\module
+        parent: installer.module_base
+        arguments:
+            - '@installer.module.install_filesystem_collection'
+        tags:
+            - { name: installer_install_module, order: 30 }
--- /dev/null
+++ b/config/installer/container/services_install_finish.yml
@@ -0,0 +1,44 @@
+services:
+    installer.install_finish.populate_migrations:
+        class: phpbb\install\module\install_finish\task\populate_migrations
+        arguments:
+            - '@installer.helper.config'
+            - '@installer.helper.container_factory'
+        tags:
+            - { name: install_finish, order: 10 }
+
+    installer.install_finish.install_extensions:
+        class: phpbb\install\module\install_finish\task\install_extensions
+        arguments:
+            - '@installer.helper.container_factory'
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '%core.root_path%'
+        tags:
+            - { name: install_finish, order: 20 }
+
+    installer.install_finish.notify_user:
+        class: phpbb\install\module\install_finish\task\notify_user
+        arguments:
+            - '@installer.helper.container_factory'
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: install_finish, order: 30 }
+
+    installer.module.install_finish_collection:
+        class: phpbb\di\ordered_service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: install_finish, class_name_aware: true }
+
+    installer.module.finish_install:
+        class: phpbb\install\module\install_finish\module
+        parent: installer.module_base
+        arguments:
+            - '@installer.module.install_finish_collection'
+        tags:
+            - { name: installer_install_module, order: 60 }
--- /dev/null
+++ b/config/installer/container/services_install_navigation.yml
@@ -0,0 +1,42 @@
+services:
+    installer.navigation.provider:
+        class: phpbb\install\helper\navigation\navigation_provider
+        arguments:
+            - '@installer.navigation.service_collection'
+
+    installer.navigation.service_collection:
+            class: phpbb\di\service_collection
+            arguments:
+                - '@service_container'
+            tags:
+                - { name: service_collection, tag: installer.navigation }
+
+    installer.navigation.main_navigation:
+        class: phpbb\install\helper\navigation\main_navigation
+        shared: false
+        tags:
+            - { name: installer.navigation }
+
+    installer.navigation.install_navigation:
+        class: phpbb\install\helper\navigation\install_navigation
+        arguments:
+            - '@installer.helper.install_helper'
+        shared: false
+        tags:
+            - { name: installer.navigation }
+
+    installer.navigation.update_navigation:
+        class: phpbb\install\helper\navigation\update_navigation
+        arguments:
+            - '@installer.helper.install_helper'
+        shared: false
+        tags:
+            - { name: installer.navigation }
+
+    installer.navigation.convertor_navigation:
+        class: phpbb\install\helper\navigation\convertor_navigation
+        arguments:
+            - '@installer.helper.install_helper'
+        shared: false
+        tags:
+            - { name: installer.navigation }
--- /dev/null
+++ b/config/installer/container/services_install_obtain_data.yml
@@ -0,0 +1,66 @@
+services:
+    installer.obtain_data.obtain_admin_data:
+        class: phpbb\install\module\obtain_data\task\obtain_admin_data
+        arguments:
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+        tags:
+            - { name: install_obtain_data, order: 10 }
+
+    installer.obtain_data.obtain_board_data:
+        class: phpbb\install\module\obtain_data\task\obtain_board_data
+        arguments:
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '@language.helper.language_file'
+        tags:
+            - { name: install_obtain_data, order: 50 }
+
+    installer.obtain_data.obtain_database_data:
+        class: phpbb\install\module\obtain_data\task\obtain_database_data
+        arguments:
+            - '@installer.helper.database'
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+        tags:
+            - { name: install_obtain_data, order: 20 }
+
+    installer.obtain_data.obtain_email_data:
+        class: phpbb\install\module\obtain_data\task\obtain_email_data
+        arguments:
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+        tags:
+            - { name: install_obtain_data, order: 40 }
+
+    installer.obtain_data.obtain_imagick_path:
+        class: phpbb\install\module\obtain_data\task\obtain_imagick_path
+        arguments:
+            - '@installer.helper.config'
+        tags:
+            - { name: install_obtain_data, order: 60 }
+
+    installer.obtain_data.obtain_server_data:
+        class: phpbb\install\module\obtain_data\task\obtain_server_data
+        arguments:
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+        tags:
+            - { name: install_obtain_data, order: 30 }
+
+    installer.module.install_obtain_data_collection:
+        class: phpbb\di\ordered_service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: install_obtain_data, class_name_aware: true }
+
+    installer.module.obtain_data_install:
+        class: phpbb\install\module\obtain_data\install_module
+        parent: installer.module_base
+        arguments:
+            - '@installer.module.install_obtain_data_collection'
+            - true
+            - false
+        tags:
+            - { name: installer_install_module, order: 20 }
--- /dev/null
+++ b/config/installer/container/services_install_requirements.yml
@@ -0,0 +1,37 @@
+services:
+    installer.requirements.check_filesystem:
+        class: phpbb\install\module\requirements\task\check_filesystem
+        arguments:
+            - '@filesystem'
+            - '@installer.helper.iohandler'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: installer_requirements, order: 10 }
+
+    installer.requirements.check_server_environment:
+        class: phpbb\install\module\requirements\task\check_server_environment
+        arguments:
+            - '@installer.helper.database'
+            - '@installer.helper.iohandler'
+        tags:
+            - { name: installer_requirements, order: 20 }
+            - { name: update_requirements, order: 20 }
+
+    installer.module.install_requirements_collection:
+        class: phpbb\di\ordered_service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: installer_requirements, class_name_aware: true }
+
+# Please note, that the name of this module is hard coded in the installer service
+    installer.module.requirements_install:
+        class: phpbb\install\module\requirements\install_module
+        parent: installer.module_base
+        arguments:
+            - '@installer.module.install_requirements_collection'
+            - true
+            - false
+        tags:
+            - { name: installer_install_module, order: 10 }
--- /dev/null
+++ b/config/installer/container/services_installer.yml
@@ -0,0 +1,119 @@
+imports:
+    - { resource: services_file_updater.yml }
+    - { resource: services_install_console.yml }
+    - { resource: services_install_controller.yml }
+    - { resource: services_install_data.yml }
+    - { resource: services_install_database.yml }
+    - { resource: services_install_filesystem.yml }
+    - { resource: services_install_finish.yml }
+    - { resource: services_install_navigation.yml }
+    - { resource: services_install_obtain_data.yml }
+    - { resource: services_install_requirements.yml }
+    - { resource: services_update_database.yml }
+    - { resource: services_update_filesystem.yml }
+    - { resource: services_update_obtain_data.yml }
+    - { resource: services_update_requirements.yml }
+
+services:
+# -------- Installer helpers ------------------------
+    installer.helper.config:
+        class: phpbb\install\helper\config
+        arguments:
+            - '@filesystem'
+            - '@php_ini'
+            - '%core.root_path%'
+
+    installer.helper.database:
+        class: phpbb\install\helper\database
+        arguments:
+            - '@filesystem'
+            - '%core.root_path%'
+
+    installer.helper.iohandler_factory:
+        class: phpbb\install\helper\iohandler\factory
+        arguments:
+            - '@service_container'
+
+    installer.helper.iohandler_abstract:
+        abstract: true
+        calls:
+            - [set_language, ['@language']]
+
+    installer.helper.iohandler_ajax:
+        class: phpbb\install\helper\iohandler\ajax_iohandler
+        parent: installer.helper.iohandler_abstract
+        arguments:
+            - '@path_helper'
+            - '@request'
+            - '@template'
+            - '@router'
+            - '%core.root_path%'
+
+    installer.helper.iohandler_cli:
+        class: phpbb\install\helper\iohandler\cli_iohandler
+        parent: installer.helper.iohandler_abstract
+
+    installer.helper.iohandler:
+        class: phpbb\install\helper\iohandler\iohandler_interface
+        factory: ['@installer.helper.iohandler_factory', get]
+
+    installer.helper.container_factory:
+        class: phpbb\install\helper\container_factory
+        arguments:
+            - '@language'
+            - '@request'
+            - '@installer.helper.update_helper'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+
+    installer.helper.install_helper:
+        class: phpbb\install\helper\install_helper
+        arguments:
+            - '%core.root_path%'
+            - '%core.php_ext%'
+
+    installer.helper.update_helper:
+        class: phpbb\install\helper\update_helper
+        arguments:
+            - '%core.root_path%'
+
+# -------- Installer --------------------------------
+    installer.module_base:
+        abstract: true
+        calls:
+            - [setup, ['@installer.helper.config', '@installer.helper.iohandler']]
+
+    installer.installer.abstract:
+        class: phpbb\install\installer
+        abstract: true
+        arguments:
+            - '@cache.driver'
+            - '@installer.helper.config'
+            - '@path_helper'
+            - '@installer.helper.container_factory'
+
+    installer.install.module_collection:
+        class: phpbb\di\ordered_service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: installer_install_module }
+
+    installer.update.module_collection:
+        class: phpbb\di\ordered_service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: installer_update_module }
+
+    installer.installer.install:
+        parent: installer.installer.abstract
+        calls:
+            - [set_modules, ['@installer.install.module_collection']]
+            - [set_purge_cache_before, [false]]
+
+    installer.installer.update:
+        parent: installer.installer.abstract
+        calls:
+            - [set_modules, ['@installer.update.module_collection']]
+            - [set_purge_cache_before, [true]]
--- /dev/null
+++ b/config/installer/container/services_update_database.yml
@@ -0,0 +1,40 @@
+services:
+    installer.update_database.update_task:
+        class: phpbb\install\module\update_database\task\update
+        arguments:
+            - '@installer.helper.container_factory'
+            - '@filesystem'
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '@language'
+            - '%core.root_path%'
+        tags:
+            - { name: update_database_task, order: 10 }
+
+    installer.update_database.update_extensions:
+        class: phpbb\install\module\update_database\task\update_extensions
+        arguments:
+            - '@installer.helper.container_factory'
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '@installer.helper.update_helper'
+            - '%core.root_path%'
+        tags:
+            - { name: update_database_task, order: 20 }
+
+    installer.module.update_database_collection:
+        class: phpbb\di\ordered_service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: update_database_task, class_name_aware: true }
+
+    installer.module.update_database:
+        class: phpbb\install\module\update_database\module
+        parent: installer.module_base
+        arguments:
+            - '@installer.module.update_database_collection'
+            - true
+            - false
+        tags:
+            - { name: installer_update_module, order: 40 }
--- /dev/null
+++ b/config/installer/container/services_update_filesystem.yml
@@ -0,0 +1,72 @@
+services:
+    installer.update_filesystem.check_task:
+        class: phpbb\install\module\update_filesystem\task\file_check
+        arguments:
+            - '@filesystem'
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '@installer.helper.update_helper'
+            - '%core.root_path%'
+        tags:
+            - { name: update_filesystem, order: 10 }
+
+    installer.update_filesystem.diff_files:
+        class: phpbb\install\module\update_filesystem\task\diff_files
+        arguments:
+            - '@installer.helper.container_factory'
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '@installer.helper.update_helper'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: update_filesystem, order: 20 }
+
+    installer.update_filesystem.show_file_status:
+        class: phpbb\install\module\update_filesystem\task\show_file_status
+        arguments:
+            - '@installer.helper.container_factory'
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '@filesystem'
+            - '@installer.file_updater.factory'
+        tags:
+            - { name: update_filesystem, order: 30 }
+
+    installer.update_filesystem.update_files:
+        class: phpbb\install\module\update_filesystem\task\update_files
+        arguments:
+            - '@installer.helper.container_factory'
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '@installer.file_updater.factory'
+            - '@installer.helper.update_helper'
+            - '%core.root_path%'
+        tags:
+            - { name: update_filesystem, order: 40 }
+
+    installer.update_filesystem.download_updated_files:
+        class: phpbb\install\module\update_filesystem\task\download_updated_files
+        arguments:
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '@filesystem'
+        tags:
+            - { name: update_filesystem, order: 50 }
+
+    installer.module.update_filesystem_collection:
+        class: phpbb\di\ordered_service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: update_filesystem, class_name_aware: true }
+
+    installer.module.filesystem_update:
+        class: phpbb\install\module\update_filesystem\module
+        parent: installer.module_base
+        arguments:
+            - '@installer.module.update_filesystem_collection'
+            - true
+            - false
+        tags:
+            - { name: installer_update_module, order: 30 }
--- /dev/null
+++ b/config/installer/container/services_update_obtain_data.yml
@@ -0,0 +1,53 @@
+services:
+    installer.obtain_data.update_options:
+        class: phpbb\install\module\obtain_data\task\obtain_update_settings
+        arguments:
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+        tags:
+            - { name: update_obtain_data, order: 10 }
+
+    installer.obtain_data.file_updater_method:
+        class: phpbb\install\module\obtain_data\task\obtain_file_updater_method
+        arguments:
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+        tags:
+            - { name: update_obtain_data, order: 20 }
+
+    installer.obtain_data.update_files:
+        class: phpbb\install\module\obtain_data\task\obtain_update_files
+        arguments:
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: update_obtain_data, order: 30 }
+
+    installer.obtain_data.update_ftp_settings:
+        class: phpbb\install\module\obtain_data\task\obtain_update_ftp_data
+        arguments:
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '@installer.helper.update_helper'
+            - '%core.php_ext%'
+        tags:
+            - { name: update_obtain_data, order: 40 }
+
+    installer.module.update_obtain_data_collection:
+        class: phpbb\di\ordered_service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: update_obtain_data, class_name_aware: true }
+
+    installer.module.obtain_data_update:
+        class: phpbb\install\module\obtain_data\update_module
+        parent: installer.module_base
+        arguments:
+            - '@installer.module.update_obtain_data_collection'
+            - true
+            - false
+        tags:
+            - { name: installer_update_module, order: 20 }
--- /dev/null
+++ b/config/installer/container/services_update_requirements.yml
@@ -0,0 +1,41 @@
+services:
+    installer.requirements.check_filesystem_update:
+        class: phpbb\install\module\requirements\task\check_filesystem
+        arguments:
+            - '@filesystem'
+            - '@installer.helper.iohandler'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+            - false
+        tags:
+            - { name: update_requirements, order: 10 }
+
+    installer.requirements.update_requirements:
+        class: phpbb\install\module\requirements\task\check_update
+        arguments:
+            - '@installer.helper.container_factory'
+            - '@filesystem'
+            - '@installer.helper.config'
+            - '@installer.helper.iohandler'
+            - '@installer.helper.update_helper'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: update_requirements, order: 30 }
+
+    installer.module.update_requirements_collection:
+        class: phpbb\di\ordered_service_collection
+        arguments:
+            - '@service_container'
+        tags:
+            - { name: service_collection, tag: update_requirements, class_name_aware: true }
+
+    installer.module.requirements_update:
+        class: phpbb\install\module\requirements\update_module
+        parent: installer.module_base
+        arguments:
+            - '@installer.module.update_requirements_collection'
+            - true
+            - false
+        tags:
+            - { name: installer_update_module, order: 10 }
--- /dev/null
+++ b/config/installer/routing/environment.yml
@@ -0,0 +1,2 @@
+core.default:
+    resource: installer.yml
--- /dev/null
+++ b/config/installer/routing/installer.yml
@@ -0,0 +1,67 @@
+phpbb_installer_index:
+    path: /
+    defaults:
+        _controller: phpbb.installer.controller.welcome:handle
+        mode: 'intro'
+
+phpbb_installer_license:
+    path: /license
+    defaults:
+        _controller: phpbb.installer.controller.welcome:handle
+        mode: 'license'
+
+phpbb_installer_support:
+    path: /support
+    defaults:
+        _controller: phpbb.installer.controller.welcome:handle
+        mode: 'support'
+
+phpbb_installer_install:
+    path: /install
+    defaults:
+        _controller: phpbb.installer.controller.install:handle
+
+phpbb_installer_update:
+    path: /update
+    defaults:
+        _controller: phpbb.installer.controller.update:handle
+
+phpbb_installer_update_file_download:
+    path: /download/updated
+    defaults:
+        _controller: phpbb.installer.controller.file_downloader:update_archive
+
+phpbb_installer_update_conflict_download:
+    path: /download/conflict
+    defaults:
+        _controller: phpbb.installer.controller.file_downloader:conflict_archive
+
+phpbb_convert_intro:
+    path: /convert/{start_new}
+    defaults:
+        _controller: phpbb.installer.controller.convert:intro
+        start_new: 0
+
+phpbb_convert_settings:
+    path: /convert/settings/{converter}
+    defaults:
+        _controller: phpbb.installer.controller.convert:settings
+    requirements:
+        converter: "[a-zA-Z0-9_]+"
+
+phpbb_convert_convert:
+    path: /convert/in_progress/{converter}
+    defaults:
+        _controller: phpbb.installer.controller.convert:convert
+    requirements:
+        converter: "[a-zA-Z0-9_]+"
+
+phpbb_convert_finish:
+    path: /convert/finished
+    defaults:
+        _controller: phpbb.installer.controller.convert:finish
+
+phpbb_installer_status:
+    path: /installer/status
+    defaults:
+        _controller: phpbb.installer.controller.status:status
--- /dev/null
+++ b/config/production/config.yml
@@ -0,0 +1,2 @@
+imports:
+    - { resource: ../default/config.yml }
--- /dev/null
+++ b/config/production/container/environment.yml
@@ -0,0 +1,3 @@
+imports:
+    - { resource: services.yml }
+    - { resource: parameters.yml }
--- /dev/null
+++ b/config/production/container/parameters.yml
@@ -0,0 +1,2 @@
+imports:
+    - { resource: ../../default/container/parameters.yml }
--- /dev/null
+++ b/config/production/container/services.yml
@@ -0,0 +1,2 @@
+imports:
+    - { resource: ../../default/container/services.yml }
--- /dev/null
+++ b/config/production/routing/environment.yml
@@ -0,0 +1,2 @@
+core.default:
+    resource: ../../default/routing/routing.yml
--- a/cron.php
+++ b/cron.php
@@ -42,14 +42,16 @@ function output_image()
 //
 // Attempt to alleviate the problem by doing setup outside of the lock as much as possible.
 
-$cron_type = request_var('cron_type', '');
+$cron_type = $request->variable('cron_type', '');
 
 // Comment this line out for debugging so the page does not return an image.
 output_image();
 
+/* @var $cron_lock \phpbb\lock\db */
 $cron_lock = $phpbb_container->get('cron.lock_db');
 if ($cron_lock->acquire())
 {
+	/* @var $cron \phpbb\cron\manager */
 	$cron = $phpbb_container->get('cron.manager');
 
 	$task = $cron->find_task($cron_type);
--- a/docs/CHANGELOG.html
+++ b/docs/CHANGELOG.html
@@ -4,7 +4,7 @@
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta name="keywords" content="" />
-<meta name="description" content="phpBB 3.1.x Changelog" />
+<meta name="description" content="phpBB 3.2.x Changelog" />
 <title>phpBB &bull; Changelog</title>
 
 <link href="assets/css/stylesheet.css" rel="stylesheet" type="text/css" media="screen" />
@@ -21,7 +21,7 @@
 
 			<div id="doc-description">
 				<a href="../index.php" id="logo"><img src="assets/images/site_logo.gif" alt="" /></a>
-				<h1>phpBB 3.1.x Changelog</h1>
+				<h1>phpBB 3.2.x Changelog</h1>
 				<p style="display: none;"><a href="#start_here">Skip</a></p>
 			</div>
 
@@ -36,7 +36,7 @@
 <!-- BEGIN DOCUMENT -->
 
 <p class="paragraph main-description">
-	This is a non-exhaustive (but still near complete) changelog for phpBB 3.1.x including release candidate versions.
+	This is a non-exhaustive (but still near complete) changelog for phpBB 3.2.x including release candidate versions.
 	Our thanks to all those people who've contributed bug reports and code fixes.
 </p>
 
@@ -50,6 +50,12 @@
 <ol>
 	<li><a href="#changelog">Changelog</a>
 	<ul>
+		<li><a href="#v320rc1">Changes since 3.2.0-RC1</a></li>
+		<li><a href="#v320b2">Changes since 3.2.0-b2</a></li>
+		<li><a href="#v320b1">Changes since 3.2.0-b1</a></li>
+		<li><a href="#v320a2">Changes since 3.2.0-a2</a></li>
+		<li><a href="#v320a1">Changes since 3.2.0-a1</a></li>
+		<li><a href="#v31x">Changes since 3.1.x</a></li>
 		<li><a href="#v319">Changes since 3.1.9</a></li>
 		<li><a href="#v318">Changes since 3.1.8</a></li>
 		<li><a href="#v317pl1">Changes since 3.1.7-PL1</a></li>
@@ -117,7 +123,491 @@
 	<div class="paragraph">
 		<div class="inner">
 
-<div class="content">
+		<div class="content">
+			<a name="v320rc1"></a><h3>Changes since 3.2.0-RC1</h3>
+			<h4>Bug</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14588">PHPBB3-14588</a>] - RTL Search Bar</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14612">PHPBB3-14612</a>] - Double .panel class on confirmation page (ajax error?)</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14628">PHPBB3-14628</a>] - CLI installer doesn't support the translatable error messages</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14633">PHPBB3-14633</a>] - Creating a new topic leaves a white page</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14636">PHPBB3-14636</a>] - BC compatibility broken using request_var</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14640">PHPBB3-14640</a>] - Wrong link to documentation in language/en/install.php</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14660">PHPBB3-14660</a>] - Emails are being sent unparsed</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14663">PHPBB3-14663</a>] - Incorrect unicode chars handling in custom BBCode</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14665">PHPBB3-14665</a>] - Invalid syntax in report_id_auto_increment migration</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14684">PHPBB3-14684</a>] - Extension Sniff script should use NOTESTS</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14690">PHPBB3-14690</a>] - Email queue cron task never runs for phpBB 3.2</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14692">PHPBB3-14692</a>] - Duplicate subexpression in questionnaire.php</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14700">PHPBB3-14700</a>] - Updating from 3.1 to 3.2, just stops</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14706">PHPBB3-14706</a>] - nested BB-Code [list] - shows different behaviour between 3.1 and 3.2</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14709">PHPBB3-14709</a>] - Deleting posts from mcp_main causes missing post_id notice</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14714">PHPBB3-14714</a>] - Update composer dependencies to latest versions</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14716">PHPBB3-14716</a>] - Impossible to install with open basedir restrictions</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14717">PHPBB3-14717</a>] - Quote any scalar in yaml files</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14739">PHPBB3-14739</a>] - Remove old SQLite 2.8.х database driver</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14740">PHPBB3-14740</a>] - BBcodes with quotes dont get parsed correctly</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14742">PHPBB3-14742</a>] - Improvements to migrator</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14746">PHPBB3-14746</a>] - Don't depend on container in installer msg_handler</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14748">PHPBB3-14748</a>] - Modify tests to pass PHP 7.1 tests</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14763">PHPBB3-14763</a>] - Files services definition specifies form for local type</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14764">PHPBB3-14764</a>] - Incomplete update notification points to wrong update-link</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14765">PHPBB3-14765</a>] - Parameter vs requirement spelling mismatch in installer routing config</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14774">PHPBB3-14774</a>] - Content-Range only supported for resuming downloads</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14782">PHPBB3-14782</a>] - Quick Links &gt; Your Posts gives mysql error</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14788">PHPBB3-14788</a>] - Update developer list to reflect team changes</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14791">PHPBB3-14791</a>] - Trying to get form from wrong button in search test base</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14793">PHPBB3-14793</a>] - &quot;A non-numeric value encountered&quot; PHP warning on PHP 7.1+</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14794">PHPBB3-14794</a>] - Fix redirect behavior in according to parse_url() behavior changes in PHP 7.1+</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14797">PHPBB3-14797</a>] - Remove PHP 7.1 builds from allowed failures</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14799">PHPBB3-14799</a>] - purge_notifications() leaves open transaction for bad notification types.</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14813">PHPBB3-14813</a>] - functions_compatibility missing in phpbbcli</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14814">PHPBB3-14814</a>] - Text reparser reparses already correctly [re] -parsed objects</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14821">PHPBB3-14821</a>] - Do not expect parsed HTML in kernel subscriber output</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14846">PHPBB3-14846</a>] - Swapped variables in bbcode, first one doesn't get parsed</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14873">PHPBB3-14873</a>] - Missing width and height variables for smilies</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14875">PHPBB3-14875</a>] - Cannot use HTML entity type database passwords during installation</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14883">PHPBB3-14883</a>] - Text Reparser is Reparsing Empty Data</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14892">PHPBB3-14892</a>] - Assets paths broken on Windows instances</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14894">PHPBB3-14894</a>] - Update: download of conflict files offers .tar file without file extension</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14896">PHPBB3-14896</a>] - Link after installation fails at redirecting to ACP</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14897">PHPBB3-14897</a>] - IOHandler in the installer declares member variable only in the constructor</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14900">PHPBB3-14900</a>] - Disabled extension breakage in ACP</li>
+			</ul>
+			<h4>Improvement</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10961">PHPBB3-10961</a>] - &quot;You are not authorised...&quot; still sends HTTP status 200 instead of i.e. 403</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13709">PHPBB3-13709</a>] - Fallback to english in email templates by extensions</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14586">PHPBB3-14586</a>] - phpBB Oauth V1 Wrapper Support</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14595">PHPBB3-14595</a>] - smtp port</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14620">PHPBB3-14620</a>] - Update docs/ for 3.2.x</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14689">PHPBB3-14689</a>] - Build 3.2.x API docs</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14729">PHPBB3-14729</a>] - Report post controller and report helper require specific implementation of config class</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14734">PHPBB3-14734</a>] - Use SVG emoji</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14805">PHPBB3-14805</a>] - Allow building package for previous versions on PHP 7</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14867">PHPBB3-14867</a>] - INCLUDECSS Path broken</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14885">PHPBB3-14885</a>] - Migrator logs need line breaks</li>
+			</ul>
+			<h4>New Feature</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12610">PHPBB3-12610</a>] - Add a command to check if the board is up to date.</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14484">PHPBB3-14484</a>] - Support extensions in UI tests</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14492">PHPBB3-14492</a>] - Improve send stats page and include VigLink</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14547">PHPBB3-14547</a>] - Add Vagrant Support</li>
+			</ul>
+			<h4>Task</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10809">PHPBB3-10809</a>] - Remove PHP MSSQL Support</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13573">PHPBB3-13573</a>] - Investigate ability to use set_config() and similar compatibility functions.</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14671">PHPBB3-14671</a>] - Deduplicate database schema definiton</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14696">PHPBB3-14696</a>] - Fix email template test for '0' username</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14807">PHPBB3-14807</a>] - Updates dependencies</li>
+			</ul>
+
+			<a name="v320b2"></a><h3>Changes since 3.2.0-b2</h3>
+			<h4>Bug</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-9435">PHPBB3-9435</a>] - &quot;magic numbers&quot; in message_parser.php/bbcode.php</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13616">PHPBB3-13616</a>] - Pass lexer directly to TWIG environment</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13972">PHPBB3-13972</a>] - 3.1.5 - Waiting time conflict</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14136">PHPBB3-14136</a>] - IE compatibility meta is missing in overall_header.html</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14198">PHPBB3-14198</a>] - Container cache filename doesn't depend on the build options</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14260">PHPBB3-14260</a>] - Right parenthesis breaks (some?) magic URLs</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14318">PHPBB3-14318</a>] - Board Notifications Config Migration Not Working</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14329">PHPBB3-14329</a>] - Updater Cannot remove files</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14381">PHPBB3-14381</a>] - Text Reparser fails with empty sql fields</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14393">PHPBB3-14393</a>] - Update 3.2.0a1 to 3.2.0a2 --&gt; Error: CANNOT_DELETE_FILES </li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14426">PHPBB3-14426</a>] - viewtopic error posts bbcode pregmatch</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14481">PHPBB3-14481</a>] - phpBB does not obey HTTP_X_FORWARDED_PORT header</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14497">PHPBB3-14497</a>] - Update nginx sample config for new installer</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14527">PHPBB3-14527</a>] - Dataloss caused by link shortening</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14528">PHPBB3-14528</a>] - Structured data - breadcrumbs error</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14530">PHPBB3-14530</a>] - Signature parsing inconsistant</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14532">PHPBB3-14532</a>] - Database column default incorrectly escaped on MSSQL</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14550">PHPBB3-14550</a>] - function unique_id()</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14555">PHPBB3-14555</a>] - Inconsistent usage of the cache directory</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14559">PHPBB3-14559</a>] - Attachments' behaviour in quotes</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14562">PHPBB3-14562</a>] - Extension's permissions don't have language fallback</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14564">PHPBB3-14564</a>] - config cookie domain is empty</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14569">PHPBB3-14569</a>] - Add a method for console progress bar initialisation</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14572">PHPBB3-14572</a>] - Quote notifications deleted on edit</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14576">PHPBB3-14576</a>] - Functional Test Framework should include functions.php</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14577">PHPBB3-14577</a>] - Stop using sizeof() inside for() loop</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14589">PHPBB3-14589</a>] - Requirements test showing required text for &quot;yellow/amber&quot; (optional) requirements</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14590">PHPBB3-14590</a>] - Installer gets stuck at sending notification e-mail</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14591">PHPBB3-14591</a>] - Some installation data not being inserted when running under MS SQL Server</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14607">PHPBB3-14607</a>] - Missing Auto Increment in Report Table</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14619">PHPBB3-14619</a>] - docs/ folder need work to change 3.1.x to 3.2.x in readme, install, changelog etc</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14648">PHPBB3-14648</a>] - Users don't receive default notifications if another setting is set.</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14649">PHPBB3-14649</a>] - Missing variable within event</li>
+			</ul>
+			<h4>Improvement</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13502">PHPBB3-13502</a>] - controller resolver should handle callable functions and objects</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14540">PHPBB3-14540</a>] - Adjust class recursive_dot_prefix_filter_iterator to increase performance</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14561">PHPBB3-14561</a>] - Add additional commands for user actions</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14664">PHPBB3-14664</a>] - Fix PHPDoc comment in cron manager</li>
+			</ul>
+			<h4>New Feature</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12684">PHPBB3-12684</a>] - Add a command to add a user from the CLI</li>
+			</ul>
+			<h4>Task</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13969">PHPBB3-13969</a>] - Remove old help_* language files</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14565">PHPBB3-14565</a>] - Updates composer to 1.0.0-b2</li>
+			</ul>
+
+			<a name="v320b1"></a><h3>Changes since 3.2.0-b1</h3>
+			<h4>Bug</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14307">PHPBB3-14307</a>] - Incorrect wording used in installer</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14315">PHPBB3-14315</a>] - Changing multiple forum permissions at once forces identical permissions on all groups</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14416">PHPBB3-14416</a>] - navlnks in header have incorrect tool tip styling</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14431">PHPBB3-14431</a>] - Remote avatar uploading does not support https</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14440">PHPBB3-14440</a>] - Paths can break for extensions with deep route patterns/paths</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14460">PHPBB3-14460</a>] - Use the selected language in AJAX pages as well in the installer</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14461">PHPBB3-14461</a>] - Text reparser migration might finish too late</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14488">PHPBB3-14488</a>] - Grab correct session ID in ui tests</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14489">PHPBB3-14489</a>] - Extension compiler pass cannot find class</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14503">PHPBB3-14503</a>] - Allow superglobals in installer cli</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14510">PHPBB3-14510</a>] - Prevent infinite loop in adding bots task</li>
+			</ul>
+			<h4>Improvement</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14312">PHPBB3-14312</a>] - Allow installer updating only without updating files</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14448">PHPBB3-14448</a>] - Use guzzle for remote files uploading</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14462">PHPBB3-14462</a>] - Add further measures to prevent timeouts in the installer</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14478">PHPBB3-14478</a>] - Move facebook/webdriver to main composer.json</li>
+			</ul>
+			<h4>New Feature</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14499">PHPBB3-14499</a>] - CLI updater</li>
+			</ul>
+			<h4>Task</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14447">PHPBB3-14447</a>] - Cleanup whitespaces in Prosilver</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14477">PHPBB3-14477</a>] - Update text formatter to latest release</li>
+			</ul>
+
+			<a name="v320a2"></a><h3>Changes since 3.2.0-a2</h3>
+			<h4>Bug</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10628">PHPBB3-10628</a>] - http:// prepended to &quot;www.&quot; urls (but not reflected in preview)</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11875">PHPBB3-11875</a>] - mediumint(8) too small for post_id</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12221">PHPBB3-12221</a>] - URLs Containing javascript: are Garbled</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14129">PHPBB3-14129</a>] - Adding custom extensions autoloaders feature slow downs the board</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14321">PHPBB3-14321</a>] - Fatal error on download the merged conflicts archive during update from 3.1.6 to 3.2-a1</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14323">PHPBB3-14323</a>] - Long urls are no longer shortened</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14368">PHPBB3-14368</a>] - Post Editors Text Should Be Black, Not Blue</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14371">PHPBB3-14371</a>] - Small fix for the aligment quick links</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14373">PHPBB3-14373</a>] - Do not use strpos() on arrays in iohandler_base::add_error_message()</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14378">PHPBB3-14378</a>] - Maintain consistent template var paths in 3.2 installer</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14380">PHPBB3-14380</a>] - Maintain consistent template var paths in 3.2 installer</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14402">PHPBB3-14402</a>] - Tidy plupload cron should not rely on user id/ip being available</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14403">PHPBB3-14403</a>] - phpbb\log should still work even when no user data is given</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14405">PHPBB3-14405</a>] - Text processor parses invalid use of url bbcode</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14419">PHPBB3-14419</a>] - Update composer dependencies and fix outdated composer lock file</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14420">PHPBB3-14420</a>] - Search Results pagination not up to date / broken</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14428">PHPBB3-14428</a>] - Use other links for files remote test</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14431">PHPBB3-14431</a>] - Remote avatar uploading does not support https</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14432">PHPBB3-14432</a>] - The lang() function needs to handle key array</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14434">PHPBB3-14434</a>] - Schema generator fails if extensions have non-migrations in migrations dir</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14436">PHPBB3-14436</a>] - Default data type migration misses oauth_states dependency</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14442">PHPBB3-14442</a>] - Use Goutte ~2.0 after allowing PHP &gt;= 5.4</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14444">PHPBB3-14444</a>] - Fatal error in functions_messenger.php</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14446">PHPBB3-14446</a>] - Add predefined placeholder variables to twig</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14452">PHPBB3-14452</a>] - Undefined $progressFillerText in installer.js</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14453">PHPBB3-14453</a>] - Missing dependency in the text_reparser migration</li>
+			</ul>
+			<h4>Improvement</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13454">PHPBB3-13454</a>] - Remove unused variables, globals, parameters</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13733">PHPBB3-13733</a>] - Allow non-migration files inside migrations folder</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14177">PHPBB3-14177</a>] - Catch exceptions and display a nice error page</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14253">PHPBB3-14253</a>] - Show group requests pending aproval at the ACP groups summary</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14377">PHPBB3-14377</a>] - Allow extensions to register custom compiler pass</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14418">PHPBB3-14418</a>] - Add missing language string PM_TOOLS</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14445">PHPBB3-14445</a>] - Force page refresh before the installer generates the schema</li>
+			</ul>
+			<h4>Task</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14250">PHPBB3-14250</a>] - Review/bump composer dependencies</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14262">PHPBB3-14262</a>] - Move converter code into a controller</li>
+			</ul>
+
+			<a name="v320a1"></a><h3>Changes since 3.2.0-a1</h3>
+			<h4>Bug</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-9791">PHPBB3-9791</a>] - invalid [] - chars on search URI</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13451">PHPBB3-13451</a>] - A very long string inside message crashes PHP</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14273">PHPBB3-14273</a>] - Unnecessary core.root_path dependency in files.upload service</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14293">PHPBB3-14293</a>] - Responsive .postbody width not expanding</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14295">PHPBB3-14295</a>] - Icon on left side of &quot;Post awaiting approval&quot; inside messages is missing</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14311">PHPBB3-14311</a>] - Installer error messages not being reported back to client properly</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14317">PHPBB3-14317</a>] - Run lang_migrate_help_lang script on master</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14320">PHPBB3-14320</a>] - Language selector is broken in the installer</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14325">PHPBB3-14325</a>] - Renamed Event Variables Backwards Incompatible</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14326">PHPBB3-14326</a>] - Diffed files are not decoded at update</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14339">PHPBB3-14339</a>] - State support for PHP 7.0 in docs</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14344">PHPBB3-14344</a>] - Improve formatting of errors during install</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14345">PHPBB3-14345</a>] - Check if message description exists in install cli iohandler</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14349">PHPBB3-14349</a>] - Improve error messages and remove output of suppressed messages</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14350">PHPBB3-14350</a>] - Remove duplicate semi-colon from functions_user</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14358">PHPBB3-14358</a>] - Fatal error when running create_schema_files.php (missing composer autoloader)</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14359">PHPBB3-14359</a>] - Wrong service definition for console.command.reparser.reparse</li>
+			</ul>
+			<h4>Improvement</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12649">PHPBB3-12649</a>] - Change sort &amp; display options in footers to dropdown menu</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14257">PHPBB3-14257</a>] - Reparse after update</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14269">PHPBB3-14269</a>] - Use http_exceptions instead of die() in installer controllers</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14310">PHPBB3-14310</a>] - Progress bar in new installer not very clear</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14340">PHPBB3-14340</a>] - Revert the workaround fix for segmentation fault error on phpBB 3.2 PHP 7 tests</li>
+			</ul>
+			<h4>Task</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14247">PHPBB3-14247</a>] - Usage of @ at begining of an unquoted string in a yaml file is deprecated</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14341">PHPBB3-14341</a>] - Update to Symfony 2.8</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14348">PHPBB3-14348</a>] - Add an index.html to the install folder</li>
+			</ul>
+
+			<a name="v31x"></a><h3>Changes since 3.1.x</h3>
+			<h4>Bug</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-6466">PHPBB3-6466</a>] - Permission Role Tooltips do not display in Safari</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-7187">PHPBB3-7187</a>] - Quote smilies error</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-7275">PHPBB3-7275</a>] - Custom bbodes trim('${1}')</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-8064">PHPBB3-8064</a>] - forum author sort not using username_clean</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-8419">PHPBB3-8419</a>] - custom tag eats up space character</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-8420">PHPBB3-8420</a>] - emoticon removes space before itself when using preview</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-8613">PHPBB3-8613</a>] - BBCode_uid- and censor-bug</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-9073">PHPBB3-9073</a>] - Word censoring in URLs</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-9109">PHPBB3-9109</a>] - Maximum allowed recepients restriction precedence</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-9377">PHPBB3-9377</a>] - Custom BB Code Nesting</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10002">PHPBB3-10002</a>] - (incomplete) BBCode usage of [quote] - and [list] - forces closing [/list] - and [/quote] -s, ultimately breaking HTML/Design</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10388">PHPBB3-10388</a>] - Template engine should use json_encode() to properly escape JS properties</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10572">PHPBB3-10572</a>] - Unguarded includes in acp/</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10989">PHPBB3-10989</a>] - Bug in BBCode</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11444">PHPBB3-11444</a>] - Unnecessary notify column in phpbb_user_notifications table</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11967">PHPBB3-11967</a>] - Notification settings are not respected</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12143">PHPBB3-12143</a>] - Untranslated group name from index if not special group</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12195">PHPBB3-12195</a>] - Double-slash URLs not supported</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12387">PHPBB3-12387</a>] - mysqli_free_result is called with false value</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12554">PHPBB3-12554</a>] - Quotes do not display correctly as list elements</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12698">PHPBB3-12698</a>] - Replace all instances of magic numbers with constants in javascript</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12957">PHPBB3-12957</a>] - The template engine is not constructed properly in install/index</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12974">PHPBB3-12974</a>] - Update nightly version of develop to 3.2.0-a1-dev</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13101">PHPBB3-13101</a>] - Remove WLM contact from profile</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13238">PHPBB3-13238</a>] - \phpbb\db\migration\data\v310\mysql_fulltext_drop tries to drop non existent indexes</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13359">PHPBB3-13359</a>] - Develop tests fail due to wrong template set up in tests</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13362">PHPBB3-13362</a>] - The whole cache dir (excluding the .htaccess and index.html files) should be ignored by git</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13371">PHPBB3-13371</a>] - Lang vars not loaded during install process</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13372">PHPBB3-13372</a>] - Environment Bug - Routing broken for extensions</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13377">PHPBB3-13377</a>] - Function decode_message() incorrectly decodes www type URLs</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13425">PHPBB3-13425</a>] - Smiley code at start of text being quoted doesn't show smiley image in quote</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13513">PHPBB3-13513</a>] - Mixed routing file paths in the router</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13555">PHPBB3-13555</a>] - Poll options preview rendered incorrectly by &lt;br /&gt; collision</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13619">PHPBB3-13619</a>] - Remove unneeded folders/files from vendor folder in release package</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13638">PHPBB3-13638</a>] - INCLUDECSS and INCLUDEJS Broken in 3.2</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13670">PHPBB3-13670</a>] - Fix fatal function name must be a string in functional tests</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13680">PHPBB3-13680</a>] - Notification for a quote within a quote</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13718">PHPBB3-13718</a>] - Spambot countermeasures/CAPTCHA admin panel won't load</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13749">PHPBB3-13749</a>] - Add missing slash to base uri in helper route tests</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13766">PHPBB3-13766</a>] - Missing style_parent_id in textformater's data_access::get_styles()</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13769">PHPBB3-13769</a>] - bin/phpbbcli.php ignores PHPBB_ENVIRONMENT constant from config.php</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13772">PHPBB3-13772</a>] - Error in @param variable type for phpbb\passwords\manager</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13782">PHPBB3-13782</a>] - ACM null caching driver class is named with the reserved word 'null'</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13792">PHPBB3-13792</a>] - Travis fails installing hhvm-nigthly</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13814">PHPBB3-13814</a>] - phpbb_is_writable() method of the new filesystem class truncates files</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13825">PHPBB3-13825</a>] - create_thumbnail() incorrectly calls phpbb\filesystem::phpbb_chmod</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13828">PHPBB3-13828</a>] - Rename null driver to dummy for PHP7 compatibility in tests</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13829">PHPBB3-13829</a>] - Router requires cache directory to be writable</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13839">PHPBB3-13839</a>] - Failing test when the phpBB root directory isn't named phpbb</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13849">PHPBB3-13849</a>] - Development environment broken</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13860">PHPBB3-13860</a>] - Array to string conversion in parser service</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13871">PHPBB3-13871</a>] - Call to a member function realpath() on a non-object in functions.php on line 3474</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13875">PHPBB3-13875</a>] - Lint test should ignore cache, ext, and store folder</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13890">PHPBB3-13890</a>] - Failling tests in master</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13896">PHPBB3-13896</a>] - Coding style issue in master</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13897">PHPBB3-13897</a>] - Non-existent environment causes fatal error</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13906">PHPBB3-13906</a>] - BBCodes in signatures are not correctly parsed in post preview</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13990">PHPBB3-13990</a>] - Reparse markup inside of forum rules/description</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13993">PHPBB3-13993</a>] - Signature Editing Broken</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14008">PHPBB3-14008</a>] - Do not add a user_id value to quotes from guests</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14033">PHPBB3-14033</a>] - Correct docblock errors</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14034">PHPBB3-14034</a>] - Fix reparser names that contain &quot;text_reparser&quot; in the middle</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14036">PHPBB3-14036</a>] - Replace path_helper with a mock</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14052">PHPBB3-14052</a>] - New installer - The commands are not translated</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14074">PHPBB3-14074</a>] - Not possible to clear notification (mark as read)</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14076">PHPBB3-14076</a>] - Notifications settings are not correctly handled when a non default setting is set</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14078">PHPBB3-14078</a>] - Notification related sql general error on submission of editing post</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14079">PHPBB3-14079</a>] - Cannot mark notification as read from the dropdown</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14094">PHPBB3-14094</a>] - Current master branch is getting segmentation fault error on PHP 7 tests</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14128">PHPBB3-14128</a>] - Image posting overflow regression</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14137">PHPBB3-14137</a>] - Fix Notification Menu Settings spacing issue caused by new jump-box improvements</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14138">PHPBB3-14138</a>] - Use span tags instead of abbr tags in the footer</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14165">PHPBB3-14165</a>] - Fix layout of ucp/mcp after 14139</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14178">PHPBB3-14178</a>] - Installer database helper tests fail if sqlite3 is not present</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14180">PHPBB3-14180</a>] - Use unix line ending in files classes tests</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14182">PHPBB3-14182</a>] - Move the v310\notifications_board migration to v320\notifications_board</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14183">PHPBB3-14183</a>] - Remove deprecated max-device-width</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14193">PHPBB3-14193</a>] - Custom BBCode Buttons Broken</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14194">PHPBB3-14194</a>] - Responsive Quick Links Menu Broken</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14195">PHPBB3-14195</a>] - Plupload Attachments Not Quite Working</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14199">PHPBB3-14199</a>] - We need to hide icons from screen readers</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14202">PHPBB3-14202</a>] - Add missing sr-only classes to icons</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14216">PHPBB3-14216</a>] - Do not run thumbnail test if gd is not enabled</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14221">PHPBB3-14221</a>] - Fix viewforum header issue</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14222">PHPBB3-14222</a>] - ACP users page tries to cast deactivated_super_global to int</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14225">PHPBB3-14225</a>] - Inject the resolver in routing loaders when using them</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14230">PHPBB3-14230</a>] - Unread posts' icons don't have different color in viewtopic</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14234">PHPBB3-14234</a>] - Do not use references in trigger_event()</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14235">PHPBB3-14235</a>] - Font Awesome not available with simple_header.html</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14240">PHPBB3-14240</a>] - Always include all config files in the update package</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14274">PHPBB3-14274</a>] - New installer has weak inclusion of user functions</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14277">PHPBB3-14277</a>] - Don't use user_id in migrations as it is not defined</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14278">PHPBB3-14278</a>] - Don't use user_id in installer if not available</li>
+			</ul>
+			<h4>Improvement</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-8672">PHPBB3-8672</a>] - No file size limit in getimagesize() and remote upload</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-8708">PHPBB3-8708</a>] - Splitting global announcements from f_announce</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-9485">PHPBB3-9485</a>] - Please include link to specific post in moderator's activity logs.</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10268">PHPBB3-10268</a>] - extend function make_clickable() to also recognize semicolons as leading URL borders</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10620">PHPBB3-10620</a>] - Quote tag improvement</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10922">PHPBB3-10922</a>] - Allow parameters for [email] - BBCode content instead of addresses only</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11649">PHPBB3-11649</a>] - Move construction of twig environment to DIC</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11742">PHPBB3-11742</a>] - BBCode 'code' doesn't support tabs</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12466">PHPBB3-12466</a>] - Move classes from acp_database.php to their own files</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12487">PHPBB3-12487</a>] - Update PHP code</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12608">PHPBB3-12608</a>] - Improve notifications drop-down menu styling in header</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12654">PHPBB3-12654</a>] - Improve header search-box styling</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12681">PHPBB3-12681</a>] - Cache the compiled routes and dump the url_generator</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12719">PHPBB3-12719</a>] - Convert to Normalize &amp; SUITCSS  - base for reset</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12745">PHPBB3-12745</a>] - Allow Emoji characters in posts</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12769">PHPBB3-12769</a>] - Add and use Font-Awesome to handle proSilver icons</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12821">PHPBB3-12821</a>] - Use CSS instead of images for gradients</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12958">PHPBB3-12958</a>] - Remove subsilver2</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13063">PHPBB3-13063</a>] - Move functions_url_matcher to a proper class</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13132">PHPBB3-13132</a>] - Twig: move the loops content from loops. to the root context</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13137">PHPBB3-13137</a>] - Remove schema.json from repository</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13178">PHPBB3-13178</a>] - Allow posting Emoji characters if the database supports it</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13206">PHPBB3-13206</a>] - DEBUG mode should automatically recompile stale style components</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13266">PHPBB3-13266</a>] - Enabling twig dump function if DEBUG is defined</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13388">PHPBB3-13388</a>] - Integrate routing and di parameters resolution</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13450">PHPBB3-13450</a>] - Type-hint return value of $phpbb_container-&gt;get()</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13455">PHPBB3-13455</a>] - Change request_var() calls with $request-&gt;variable()</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13468">PHPBB3-13468</a>] - Change add_log() calls with $phpbb_log-&gt;add()</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13494">PHPBB3-13494</a>] - Replace set_config() calls with $config-&gt;set()</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13496">PHPBB3-13496</a>] - Replace set_config_count() calls with $config-&gt;increment()</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13497">PHPBB3-13497</a>] - Change get_tables() calls with $db_tools-&gt;sql_list_tables()</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13498">PHPBB3-13498</a>] - Change get_user_avatar() calls with phpbb_get_avatar()</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13499">PHPBB3-13499</a>] - Move get_remote_file() to functions_compatibility.php</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13595">PHPBB3-13595</a>] - Remove unused instances of the bbcode class</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13614">PHPBB3-13614</a>] - Remove phpbb_pcre_utf8_support() and assume Unicode is supported by PCRE</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13652">PHPBB3-13652</a>] - Extend SQL query builder functionality</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13697">PHPBB3-13697</a>] - Rewriting/moving file system functions to filesystem class</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13740">PHPBB3-13740</a>] - Refactoring installer</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13762">PHPBB3-13762</a>] - Moving translation loading and language related functions into a service</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13770">PHPBB3-13770</a>] - Make DI Container builder constructor dependency free</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13789">PHPBB3-13789</a>] - Implement Googles noCAPTCHA reCAPTCHA</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13801">PHPBB3-13801</a>] - Decouple the user object from the text_formatter.s9e.parser service</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13803">PHPBB3-13803</a>] - Implement a generic and scalable way to reparse rich text</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13805">PHPBB3-13805</a>] - Make generate_text_for_storage() match the signature and feature set of message_parser::parse()</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13844">PHPBB3-13844</a>] - Replace help_ language magic with a help manager and normal language files</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13847">PHPBB3-13847</a>] - Move quote generation to text_formatter.utils</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13891">PHPBB3-13891</a>] - Add CLI commands for reparsing text</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13901">PHPBB3-13901</a>] - Give quotes more whitespace in the posting form for readability</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13902">PHPBB3-13902</a>] - Increase the CSS margin around blockquote</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13904">PHPBB3-13904</a>] - Refactor attachment upload functions into service</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13921">PHPBB3-13921</a>] - Try harder to fix block elements BBCodes used inside of inline elements BBCodes</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13946">PHPBB3-13946</a>] - Increase the CSS margin around [code] - and [list] -</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13970">PHPBB3-13970</a>] - Save the value of the optional parameter in [code] - BBCode</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13986">PHPBB3-13986</a>] - Add --resume option to reparser CLI</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13987">PHPBB3-13987</a>] - Add --dry-run option to reparser CLI</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14000">PHPBB3-14000</a>] - Make it possible to use emojis in posts</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14097">PHPBB3-14097</a>] - Catch and show all exceptions</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14107">PHPBB3-14107</a>] - dropdown rendering on rtl</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14124">PHPBB3-14124</a>] - Automatically translate exception in CLI</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14139">PHPBB3-14139</a>] - stop styling IDs</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14157">PHPBB3-14157</a>] - Allow administrators to set an alt attribute for topic icons</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14162">PHPBB3-14162</a>] - Add CLI commands to manage migrations</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14168">PHPBB3-14168</a>] - Refactor attachment management functions into classes</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14174">PHPBB3-14174</a>] - issues in language\en\install_new.php </li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14175">PHPBB3-14175</a>] - Refactor responsive implementation for easier manipulation</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14206">PHPBB3-14206</a>] - Fix jumpbox incosistencies</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14220">PHPBB3-14220</a>] - Adding routing file locator and route loader services</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14231">PHPBB3-14231</a>] - Fix double home icon in breadcrumbs</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14237">PHPBB3-14237</a>] - Use language class in the notifications component</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14264">PHPBB3-14264</a>] - Don't use constants in textreparser plugins</li>
+			</ul>
+			<h4>New Feature</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10165">PHPBB3-10165</a>] - Send test email feature on email settings ACP page</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11768">PHPBB3-11768</a>] - Integrate s9e\TextFormatter</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12516">PHPBB3-12516</a>] - Always preview signature in UCP/ACP module</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12620">PHPBB3-12620</a>] - Allow the user to define multiples environments</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12692">PHPBB3-12692</a>] - Add a console command to manage the thumbnail</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13329">PHPBB3-13329</a>] - Rely on Intl and mbstring, use patchwork/utf8 as fallback</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13641">PHPBB3-13641</a>] - problem with custom BBCode</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13961">PHPBB3-13961</a>] - Add orderable service collections</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14125">PHPBB3-14125</a>] - Add --env option to all CLI commands</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14158">PHPBB3-14158</a>] - Add a lang_array function to the language service to avoid using call_user_func</li>
+			</ul>
+			<h4>Sub-task</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12577">PHPBB3-12577</a>] - Use a lazy service to delay the construction of the passwords_manager</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12581">PHPBB3-12581</a>] - Use the proxy pattern for the template lexer</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12632">PHPBB3-12632</a>] - Use a twig.debug environment config value to enable Twig debug</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12633">PHPBB3-12633</a>] - Add debug.template.events</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12699">PHPBB3-12699</a>] - Replace instances in the message textarea keydown callback</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13421">PHPBB3-13421</a>] - Create an interface for db\tools.php</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13487">PHPBB3-13487</a>] - Add factory for db tool class</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13645">PHPBB3-13645</a>] - Moving feeds to controllers</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13647">PHPBB3-13647</a>] - Move FAQ to controller</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13654">PHPBB3-13654</a>] - Moving reports to controller</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13881">PHPBB3-13881</a>] - Unify quote removal in 3.1 and 3.2</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13935">PHPBB3-13935</a>] - Allow more admin-configurable schemes in post links</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14039">PHPBB3-14039</a>] - Refactoring the updater</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14044">PHPBB3-14044</a>] - Deduplicate the installers</li>
+			</ul>
+			<h4>Task</h4>
+			<ul>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-9457">PHPBB3-9457</a>] - [Accessibility] - Add WAI-ARIA landmarks to the Prosilver template files</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11528">PHPBB3-11528</a>] - Use mink for acceptance tests involving javascript execution</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12384">PHPBB3-12384</a>] - Run Travis CI HHVM tests against MySQLi instead of MySQL</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12505">PHPBB3-12505</a>] - Remove outdated media handling in attachment.html</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12564">PHPBB3-12564</a>] - Remove obsolete version definitions from module info files</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12916">PHPBB3-12916</a>] - Add separate nightly builds for 3.1 and 3.2</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13130">PHPBB3-13130</a>] - Update dependencies to Symfony 2.5</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13139">PHPBB3-13139</a>] - Update Twig to 1.18.0</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13363">PHPBB3-13363</a>] - Replace phpbb\php\ini with composer package bantu/ini-get-wrapper</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13407">PHPBB3-13407</a>] - Update Symfony Components to 2.7.x</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13572">PHPBB3-13572</a>] - Upgrade composer to 1.0.0-alpha9</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13634">PHPBB3-13634</a>] - Update README to show new branch names</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13725">PHPBB3-13725</a>] - Coding guidelines: static public</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13767">PHPBB3-13767</a>] - Remove .git from vendor/s9e/text-formatter</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13768">PHPBB3-13768</a>] - Update to Symfony 2.8@dev</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13774">PHPBB3-13774</a>] - Update s9e\TextFormatter</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13777">PHPBB3-13777</a>] - Move acp/modules module handling code into a service</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13793">PHPBB3-13793</a>] - Remove message translation from exceptions</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13800">PHPBB3-13800</a>] - Make extension manager an optional dependency for the router</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13804">PHPBB3-13804</a>] - Make template's user dependency optional</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13832">PHPBB3-13832</a>] - Replace use of deprecated e modifier of preg_replace in bbcode functions</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13985">PHPBB3-13985</a>] - Update s9e\TextFormatter</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14015">PHPBB3-14015</a>] - Update Symfony to the latest 2.8@dev</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14053">PHPBB3-14053</a>] - Remove @covers annotations from installer config test</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14056">PHPBB3-14056</a>] - Keep install schema resources in the install folder</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14096">PHPBB3-14096</a>] - Update Symfony to the latest 2.8@dev</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14140">PHPBB3-14140</a>] - Update Symfony to benefit from improvement to the console component</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14150">PHPBB3-14150</a>] - Update fast-image-size to newest release</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14205">PHPBB3-14205</a>] - Bump PHP requirement to 5.4</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14238">PHPBB3-14238</a>] - Update Symfony to the latest 2.8@dev</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14243">PHPBB3-14243</a>] - Exclude every .git directory from the pakages</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14256">PHPBB3-14256</a>] - Remove PHP7 from the allowed failures</li>
+				<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14265">PHPBB3-14265</a>] - Make all tables available in the container</li>
+			</ul>
 
 	<a name="v319"></a><h3>Changes since 3.1.9</h3>
 
@@ -415,7 +905,6 @@
 		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14140">PHPBB3-14140</a>] - Update Symfony to benefit from improvement to the console component</li>
 	</ul>
 
-
 			<a name="v315"></a><h3>Changes since 3.1.5</h3>
 
 	<h4>Bug</h4>
--- a/docs/CREDITS.txt
+++ b/docs/CREDITS.txt
@@ -27,7 +27,6 @@ phpBB Lead Developer:    Marc (Marc Alexander)
 phpBB Developers:        bantu (Andreas Fischer)
                          CHItA (Máté Bartus)
                          Elsensee (Oliver Schramm)
-                         nickvergessen (Joas Schilling)
                          Nicofuma (Tristan Darricau)
                          prototech (Cesar Gallegos)
 
@@ -60,6 +59,7 @@ phpBB Developers:        A_Jelly_Doughnut (Josh Woody) [01/2010 - 11/2010]
                          igorw (Igor Wiedler)          [08/2010 - 02/2013]
                          imkingdavid (David King)      [11/2012 - 06/2014]
                          kellanved (Henry Sudhof)      [04/2007 - 03/2011]
+                         nickvergessen (Joas Schilling)[04/2010 - 12/2015]
                          Oleg (Oleg Pudeyev)           [01/2011 - 05/2013]
                          rxu (Ruslan Uzdenov)          [04/2010 - 12/2012]
                          TerraFrost (Jim Wigginton)    [04/2009 - 01/2011]
@@ -75,9 +75,7 @@ Major contributions by:  leviatan21 (Gabriel Vazquez)
 
 Visual Confirmation:   Xore (Robert Hetzler)
 
-Original subSilver by subBlue Design, Tom Beddard, (c) 2001 phpBB Limited
 prosilver by subBlue Design, Tom Beddard, (c) 2004 phpBB Limited
-subsilver2 by subBlue Design, Tom Beddard, (c) 2004 phpBB Limited
 
 phpBB contains code from the following applications:
 
@@ -99,4 +97,5 @@ Pear (c) 2001-2004 PHP Group, http://pear.php.net
 Text_Diff-0.2.1 http://pear.php.net/package/Text_Diff
 
 MIT licenced:
-Symfony2 (c) 2004-2011 Fabien Potencier, http://symfony.com/
+Symfony2 (c) 2004-2011 Fabien Potencier, https://symfony.com/
+Cookie Consent (c) 2015 Silktide Ltd, https://cookieconsent.insites.com
--- a/docs/FAQ.html
+++ b/docs/FAQ.html
@@ -4,7 +4,7 @@
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta name="keywords" content="" />
-<meta name="description" content="phpBB 3.1.x frequently asked questions" />
+<meta name="description" content="phpBB 3.2.x frequently asked questions" />
 <title>phpBB &bull; FAQ</title>
 
 <link href="assets/css/stylesheet.css" rel="stylesheet" type="text/css" media="screen" />
@@ -21,8 +21,8 @@
 
 			<div id="doc-description">
 				<a href="../index.php" id="logo"><img src="assets/images/site_logo.gif" alt="" /></a>
-				<h1>phpBB 3.1.x FAQ</h1>
-				<p>phpBB 3.1.x frequently asked questions</p>
+				<h1>phpBB 3.2.x FAQ</h1>
+				<p>phpBB 3.2.x frequently asked questions</p>
 				<p style="display: none;"><a href="#start_here">Skip</a></p>
 			</div>
 
@@ -249,7 +249,7 @@ I want to sue you because i think you host an illegal board!</h2>
 
 		<div class="content">
 
-<p>Please read the paragraph about permissions in our extensive <a href="https://www.phpbb.com/support/docs/en/3.1/ug/">online documentation</a>.</p>
+<p>Please read the paragraph about permissions in our extensive <a href="https://www.phpbb.com/support/docs/en/3.2/ug/">online documentation</a>.</p>
 
 		</div>
 
@@ -305,7 +305,7 @@ I want to sue you because i think you host an illegal board!</h2>
 
 		<div class="content">
 
-<p>Please read our <a href="https://www.phpbb.com/support/docs/en/3.1/ug/">extensive user documentation</a> first, it may just explain what you want to know.</p>
+<p>Please read our <a href="https://www.phpbb.com/support/docs/en/3.2/ug/">extensive user documentation</a> first, it may just explain what you want to know.</p>
 
 <p>Feel free to search our community forum for the information you require. <strong>PLEASE DO NOT</strong> post your question without having first used search, chances are someone has already asked and answered your question. You can find our board here:</p>
 
--- a/docs/INSTALL.html
+++ b/docs/INSTALL.html
@@ -4,7 +4,7 @@
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta name="keywords" content="" />
-<meta name="description" content="phpBB 3.1.x Installation, updating and conversion informations" />
+<meta name="description" content="phpBB 3.2.x Installation, updating and conversion informations" />
 <title>phpBB &bull; Install</title>
 
 <link href="assets/css/stylesheet.css" rel="stylesheet" type="text/css" media="screen" />
@@ -21,8 +21,8 @@
 
 			<div id="doc-description">
 				<a href="../index.php" id="logo"><img src="assets/images/site_logo.gif" alt="" /></a>
-				<h1>phpBB 3.1.x Install</h1>
-				<p>phpBB 3.1.x Installation, updating and conversion informations</p>
+				<h1>phpBB 3.2.x Install</h1>
+				<p>phpBB 3.2.x Installation, updating and conversion informations</p>
 				<p style="display: none;"><a href="#start_here">Skip</a></p>
 			</div>
 
@@ -59,7 +59,7 @@
 	<li><a href="#quickinstall">Quick install</a></li>
 	<li><a href="#require">Requirements</a></li>
 	<li><a href="#install">New installation</a></li>
-	<li><a href="#update">Updating from stable releases of phpBB 3.1.x</a>
+	<li><a href="#update">Updating from stable releases of phpBB 3.2.x</a>
 	<ol style="list-style-type: lower-roman;">
 		<li><a href="#update_full">Full package</a></li>
 		<li><a href="#update_files">Changed files</a></li>
@@ -68,8 +68,8 @@
 		<li><a href="#update_all">All package types</a></li>
 	</ol>
 	</li>
-	<li><a href="#update30">Updating from phpBB 3.0.x to phpBB 3.1.x</a></li>
-	<li><a href="#convert">Conversion from phpBB 2.0.x to phpBB 3.1.x</a>
+	<li><a href="#update30_31">Updating from phpBB 3.0.x/3.1.x to phpBB 3.2.x</a></li>
+	<li><a href="#convert">Conversion from phpBB 2.0.x to phpBB 3.2.x</a>
 	<ol style="list-style-type: lower-roman;">
 		<li><a href="#prereq">Requirements before converting</a></li>
 		<li><a href="#conversion">Converting</a></li>
@@ -109,7 +109,7 @@
 		<li>Change the permissions on config.php to be writable by all (666 or -rw-rw-rw- within your FTP Client)</li>
 		<li>Change the permissions on the following directories to be writable by all (777 or -rwxrwxrwx within your FTP Client):<br />
 			<code>store/</code>, <code>cache/</code>, <code>files/</code> and <code>images/avatars/upload/</code>.</li>
-		<li>Point your web browser to the location where you uploaded the phpBB3 files with the addition of <code>install/index.php</code> or simply <code>install/</code>, e.g. <code>http://www.example.com/phpBB3/install/index.php</code>, <code>http://www.example.com/forum/install/</code>.</li>
+		<li>Point your web browser to the location where you uploaded the phpBB3 files with the addition of <code>install/app.php</code> or simply <code>install/</code>, e.g. <code>http://www.example.com/phpBB3/install/app.php</code>, <code>http://www.example.com/forum/install/</code>.</li>
 		<li>Click the <strong><em>INSTALL</em></strong> tab, follow the steps and fill out all the requested information.</li>
 		<li>Change the permissions on config.php to be writable only by yourself (644 or -rw-r--r-- within your FTP Client)</li>
 		<li>phpBB3 should now be available, please <strong>MAKE SURE</strong> you read at least <a href="#postinstall">Section 6</a> below for important, security related post-installation instructions, and also take note of <a href="#anti_spam">Section 7</a> regarding anti-spam measures.</li>
@@ -133,7 +133,7 @@
 
 		<div class="content">
 
-	<p>phpBB 3.1.x has a few requirements which must be met before you are able to install and use it.</p>
+	<p>phpBB 3.2.x has a few requirements which must be met before you are able to install and use it.</p>
 
 	<ul>
 		<li>A webserver or web hosting account running on any major Operating System with support for PHP</li>
@@ -142,13 +142,12 @@
 			<li>MySQL 3.23 or above (MySQLi supported)</li>
 			<li>MariaDB 5.1 or above</li>
 			<li>PostgreSQL 8.3+</li>
-			<li>SQLite 2.8.2+</li>
 			<li>SQLite 3.6.15+</li>
-			<li>MS SQL Server 2000 or above (directly or via ODBC or the native adapter)</li>
+			<li>MS SQL Server 2000 or above (via ODBC or the native adapter)</li>
 			<li>Oracle</li>
 		</ul>
 		</li>
-		<li><strong>PHP 5.3.3+</strong> and <strong>PHP < 7.0</strong> with support for the database you intend to use.</li>
+		<li><strong>PHP 5.4.0+</strong> with support for the database you intend to use.</li>
 		<li>The following PHP modules are required:
 		<ul>
 			<li>json</li>
@@ -166,7 +165,7 @@
 		</li>
 	</ul>
 
-	<p>If your server or hosting account does not meet the requirements above then you will be unable to install phpBB 3.1.x.</p>
+	<p>If your server or hosting account does not meet the requirements above then you will be unable to install phpBB 3.2.x.</p>
 
 		</div>
 
@@ -192,7 +191,7 @@
 
 	<p>phpBB comes supplied with British English as its standard language. However, a number of separate packs for different languages are available. If you are not a native English speaker you may wish to install one or more of these packages before continuing. The installation process below will allow you to select a default language from those available (you can, of course, change this default at a later stage). For more details on language packs, where to obtain them and how to install them please see the <a href="README.html#i18n">README</a>.</p>
 
-	<p>Once all the files have been uploaded to your site, you should point your browser at this location with the addition of <code>/install/</code>. For example, if your domain name is <code>www.example.com</code> and you placed the phpBB files in the directory <code>/phpBB3</code> off your web root you would enter <code>http://www.example.com/phpBB3/install/</code> or (alternatively) <code>http://www.example.com/phpBB3/install/index.php</code> into your browser. When you have done this, you should see the <strong><em>phpBB Introduction</em></strong> screen appear.</p>
+	<p>Once all the files have been uploaded to your site, you should point your browser at this location with the addition of <code>/install/</code>. For example, if your domain name is <code>www.example.com</code> and you placed the phpBB files in the directory <code>/phpBB3</code> off your web root you would enter <code>http://www.example.com/phpBB3/install/</code> or (alternatively) <code>http://www.example.com/phpBB3/install/app.php</code> into your browser. When you have done this, you should see the <strong><em>phpBB Introduction</em></strong> screen appear.</p>
 
 	<h4>Introduction:</h4>
 
@@ -257,7 +256,7 @@
 
 	<hr />
 
-	<a name="update"></a><h2>4. Updating from stable releases of phpBB 3.1.x</h2>
+	<a name="update"></a><h2>4. Updating from stable releases of phpBB 3.2.x</h2>
 
 	<div class="paragraph">
 		<div class="inner">
@@ -272,17 +271,17 @@
 
 	<p>The full package is normally meant for new installations only, but if you want to replace all source files, this package comes in handy.</p>
 
-	<p>First, you should make a copy of your existing <code>config.php</code> file; keep it in a safe place! Next, delete all the existing phpBB files, you may want to leave your <code>files/</code> and <code>images/</code> directories in place. You can leave alternative styles in place too. With this complete, you can upload the new phpBB files (see <a href="#install">New installation</a> for details if necessary). Once complete, copy back your saved <code>config.php</code>, replacing the new one. Another method is to just <strong>replace</strong> the existing files with the files from the full package - though make sure you do <strong>not</strong> overwrite your config.php file.</p>
+	<p>First, you should make a copy of your existing <code>config.php</code> file; keep it in a safe place! Next, delete all the existing phpBB files, you may want to leave your <code>files/</code>, <code>images/</code> and <code>ext/</code> directories in place, otherwise you will lose your file attachments, uploaded images and get error due to missing extension files. You can leave alternative styles in place too. With this complete, you can upload the new phpBB files (see <a href="#install">New installation</a> for details if necessary). Once complete, copy back your saved <code>config.php</code>, replacing the new one. Another method is to just <strong>replace</strong> the existing files with the files from the full package - though make sure you do <strong>not</strong> overwrite your config.php file.</p>
 
-	<p>You should now run <code>install/database_update.php</code> which, depending on your previous version, will make a number of database changes. You may receive <em>FAILURES</em> during this procedure. They should not be a cause for concern unless you see an actual <em>ERROR</em>, in which case the script will stop (in this case you should seek help via our forums or bug tracker). If you have shell access to your server, you may wish to update via the command line interface. From your board's root, execute the following command: <code>php bin/phpbbcli.php --safe-mode db:migrate</code>.</p>
+	<p>You should now got to <code>/install/app.php/update</code> which will display a warning: <strong>No valid update directory was found, please make sure you uploaded the relevant files</strong>. Beneath that warning you will see a radion button <em>Update database only</em>, just click <strong>Submit</strong>. Depending on your previous version this will make a number of database changes. You may receive <em>FAILURES</em> during this procedure. They should not be a cause for concern unless you see an actual <em>ERROR</em>, in which case the script will stop (in this case you should seek help via our forums or bug tracker). If you have shell access to your server, you may wish to update via the command line interface. From your board's root, execute the following command: <code>php bin/phpbbcli.php --safe-mode db:migrate</code>.</p>
 
-	<p>Once <code>install/database_update.php</code> has completed, you may proceed to the Administration Control Panel and then remove the install directory as advised.</p>
+	<p>Once <code>/install/app.php/update</code> has completed, it displays the success message: <strong>The database update was successful</strong>. You may proceed to the Administration Control Panel and then remove the install directory as advised.</p>
 
 <a name="update_files"></a><h3>4.ii. Changed files</h3>
 
 	<p>This package is meant for those wanting to only replace the files that were changed between a previous version and the latest version.</p>
 
-	<p>This package contains a number of archives, each contains the files changed from a given release to the latest version. You should select the appropriate archive for your current version, e.g. if you currently have <strong>3.1.0</strong> you should select the appropriate <code>phpBB-3.1.1-files.zip/tar.bz2</code> file.</p>
+	<p>This package contains a number of archives, each contains the files changed from a given release to the latest version. You should select the appropriate archive for your current version, e.g. if you currently have <strong>3.2.0</strong> you should select the appropriate <code>phpBB-3.2.1-files.zip/tar.bz2</code> file.</p>
 
 	<p>The directory structure has been preserved, enabling you (if you wish) to simply upload the uncompressed contents of the archive to the appropriate location on your server, i.e. simply overwrite the existing files with the new versions. Do not forget that if you have installed any modifications (MODs) these files will overwrite the originals, possibly destroying them in the process. You will need to re-add MODs to any affected file before uploading.</p>
 
@@ -292,9 +291,9 @@
 
 	<p>The patch file package is for those wanting to update through the patch application, and should only be used by those who are comfortable with it.</p>
 
-	<p>The patch file is one solution for those with many Modifications (MODs) or other changes and do not want to re-add them back to all the changed files. To use this you will need command line access to a standard UNIX type <strong>patch</strong> application. If you do not have access to such an application, but still want to use this update approach, we strongly recommend the <a href="#update_auto">Automatic update package</a> explained below. It is also the recommended update method.</p>
+	<p>The patch file is one solution for those with changes in to the phpBB core files and do not want to re-add them back to all the changed files. To use this you will need command line access to a standard UNIX type <strong>patch</strong> application. If you do not have access to such an application, but still want to use this update approach, we strongly recommend the <a href="#update_auto">Automatic update package</a> explained below. It is also the recommended update method.</p>
 
-	<p>A number of patch files are provided to allow you to update from previous stable releases. Select the correct patch, e.g. if your current version is <strong>3.1.0</strong>, you need the <code>phpBB-3.1.1-patch.zip/tar.bz2</code> file. Place the correct patch in the parent directory containing the phpBB core files (i.e. index.php, viewforum.php, etc.). With this done you should run the following command: <code>patch -cl -d [PHPBB DIRECTORY] -p1 &lt; [PATCH NAME]</code> (where PHPBB DIRECTORY is the directory name your phpBB Installation resides in, for example phpBB, and where PATCH NAME is the relevant filename of the selected patch file). This should complete quickly, hopefully without any HUNK FAILED comments.</p>
+	<p>A number of patch files are provided to allow you to update from previous stable releases. Select the correct patch, e.g. if your current version is <strong>3.2.0</strong>, you need the <code>phpBB-3.2.1-patch.zip/tar.bz2</code> file. Place the correct patch in the parent directory containing the phpBB core files (i.e. index.php, viewforum.php, etc.). With this done you should run the following command: <code>patch -cl -d [PHPBB DIRECTORY] -p1 &lt; [PATCH NAME]</code> (where PHPBB DIRECTORY is the directory name your phpBB Installation resides in, for example phpBB, and where PATCH NAME is the relevant filename of the selected patch file). This should complete quickly, hopefully without any HUNK FAILED comments.</p>
 
 	<p>If you do get failures, you should look at using the <a href="#update_files">Changed Files</a> package to replace the files which failed to patch. Please note that you will need to manually re-add any MODs to these particular files. Alternatively, if you know how, you can examine the .rej files to determine what failed where and make manual adjustments to the relevant source.</p>
 
@@ -304,7 +303,7 @@
 
 	<p>This update method is the recommended method for updating. This package detects changed files automatically and merges in changes if needed.</p>
 
-	<p>The automatic update package will update the board from a given version to the latest version. A number of automatic update files are available, and you should choose the one that corresponds to the version of the board that you are currently running. For example, if your current version is <strong>3.1.5</strong>, you need the <code>phpBB-3.1.5_to_3.1.6.zip/tar.bz2</code> file.</p>
+	<p>The automatic update package will update the board from a given version to the latest version. A number of automatic update files are available, and you should choose the one that corresponds to the version of the board that you are currently running. For example, if your current version is <strong>3.2.0</strong>, you need the <code>phpBB-3.2.0_to_3.2.1.zip/tar.bz2</code> file.</p>
 
 	<p>To perform the update, either follow the instructions from the <strong>Administration Control Panel-&gt;System</strong> Tab - this should point out that you are running an outdated version and will guide you through the update - or follow the instructions listed below.</p>
 
@@ -322,7 +321,7 @@
 
 	<p>If you have non-English language packs installed, you may want to see if a new version has been made available. A number of missing strings may have been added which, though not essential, may be beneficial to users. Please note that at this time not all language packs have been updated so you should be prepared to periodically check for updates.</p>
 
-	<p>These update methods will only update the standard styles, <code>prosilver</code> and <code>subsilver2</code>, any other styles you have installed for your board will usually also need to be updated.</p>
+	<p>These update methods will only update the standard style <code>prosilver</code>, any other styles you have installed for your board will usually also need to be updated.</p>
 
 		</div>
 
@@ -333,16 +332,16 @@
 
 	<hr />
 
-	<a name="update30"></a><h2>5. Updating from phpBB 3.0.x to phpBB 3.1.x</h2>
+	<a name="update30_31"></a><h2>5. Updating from phpBB 3.0.x/3.1x to phpBB 3.2.x</h2>
 
 	<div class="paragraph">
 		<div class="inner"><span class="corners-top"><span></span></span>
 
 		<div class="content">
 
-			<p>Updating from phpBB 3.0.x to 3.1.x is just the same as <a href="#update">updating from stable releases of phpBB 3.1.x</a></p>
+			<p>Updating from phpBB 3.0.x or 3.1.x to 3.2.x is just the same as <a href="#update">updating from stable releases of phpBB 3.2.x</a></p>
 
-			<p>However you can also start with a new set of phpBB 3.1.x files.</p>
+			<p>However you can also start with a new set of phpBB 3.2.x files.</p>
 
 			<ol>
 				<li>Delete all files <strong>EXCEPT</strong> for the following:
@@ -352,10 +351,12 @@
 					<li>The <code>images/</code> directory</li>
 					<li>The <code>files/</code> directory</li>
 					<li>The <code>store/</code> directory</li>
+					<li>(The <code>ext/</code> directory</li>
 				</ul></li>
 
-				<li>Upload the contents of the 3.1.x Full Package into your forum's directory. Make sure the root level .htaccess file is included in the upload.</li>
-				<li>Browse to install/database_update.php</li>
+				<li>Upload the contents of the 3.2.x Full Package into your forum's directory. Make sure the root level .htaccess file is included in the upload.</li>
+				<li>Browse to <code>/install/app.php/update</code></li>
+				<li>Read the notice <em>Update database only</em> and press <strong>Submit</strong></li>
 				<li>Delete the <code>install/</code> directory</li>
 			</ol>
 		</div>
@@ -367,7 +368,7 @@
 
 	<hr />
 
-	<a name="convert"></a><h2>6. Conversion from phpBB 2.0.x to phpBB 3.1.x</h2>
+	<a name="convert"></a><h2>6. Conversion from phpBB 2.0.x to phpBB 3.2.x</h2>
 
 	<div class="paragraph">
 		<div class="inner">
--- a/docs/README.html
+++ b/docs/README.html
@@ -4,7 +4,7 @@
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta name="keywords" content="" />
-<meta name="description" content="phpBB 3.1.x Readme" />
+<meta name="description" content="phpBB 3.2.x Readme" />
 <title>phpBB &bull; Readme</title>
 
 <link href="assets/css/stylesheet.css" rel="stylesheet" type="text/css" media="screen" />
@@ -21,7 +21,7 @@
 
 			<div id="doc-description">
 				<a href="../index.php" id="logo"><img src="assets/images/site_logo.gif" alt="" /></a>
-				<h1>phpBB 3.1.x Readme</h1>
+				<h1>phpBB 3.2.x Readme</h1>
 				<p style="display: none;"><a href="#start_here">Skip</a></p>
 			</div>
 
@@ -91,24 +91,23 @@
 		<div class="content">
 	<p>Installation, update and conversion instructions can be found in the <a href="INSTALL.html">INSTALL</a> document in this directory. If you are intending on converting from a phpBB 2.0.x or 3.0.x installation we highly recommend that you backup any existing data before proceeding!</p>
 
-	<p>Users of phpBB 3.0 and 3.1 Beta versions cannot directly update.</p>
+	<p>Users of phpBB 3.0, 3.1 and 3.2 Beta versions cannot directly update.</p>
 
 	<p>Please note that we don't support the following installation types:</p>
 	<ul>
-		<li>Updates from phpBB 3.0 Beta versions to phpBB 3.0 RC1 and higher</li>
-		<li>Updates from phpBB 3.1 Beta versions to phpBB 3.1 RC1 and higher</li>
-		<li>Conversions from phpBB 2.0.x to phpBB 3.0 or 3.1 Beta versions</li>
-		<li>phpBB 3.0 or 3.1 Beta installations</li>
+		<li>Updates from phpBB Beta versions and lower to phpBB Release Candidates and higher</li>
+		<li>Conversions from phpBB 2.0.x to phpBB 3.0 Beta, 3.1 Beta and 3.2 Beta versions</li>
+		<li>phpBB 3.0 Beta, 3.1 Beta or 3.2 beta installations</li>
 	</ul>
 
 	<p>We give support for the following installation types:</p>
 
 	<ul>
-		<li>Updates from phpBB 3.0 RC1 and 3.1 RC1 to the latest version</li>
+		<li>Updates from phpBB 3.0 RC1, 3.1 RC1 and 3.2 RC1 to the latest version</li>
 		<li>Note: if using the <em>Automatic Update Package</em>, updates are supported from phpBB 3.0.2 onward. To update a pre-3.0.2 installation, first update to 3.0.2 and then update to the current version.</li>
 		<li>Conversions from phpBB 2.0.x to the latest version</li>
-		<li>New installations of phpBB 3.0.x - only the latest released version</li>
 		<li>New installations of phpBB 3.1.x - only the latest released version</li>
+		<li>New installations of phpBB 3.2.x - only the latest released version</li>
 	</ul>
 
 		</div>
@@ -131,7 +130,7 @@
 
 	<a name="i18n"></a><h3>2.i. Languages (Internationalisation - i18n)</h3>
 
-	<p>A number of language packs with included style localisations are available. You can find them listed in the <a href="https://www.phpbb.com/languages/">Language Packs</a> pages of our downloads section or from the <a href="https://www.phpbb.com/customise/db/language_packs-25/">Language Packs</a> section of the <a href="https://www.phpbb.com/customise/db/">Customisation Database</a>.</p>
+	<p>A number of language packs with included style localisations are available. You can find them listed in the <a href="https://www.phpbb.com/languages/">Language Packs</a> pages of our downloads section or from the <a href="https://www.phpbb.com/customise/db/language_packs-25">Language Packs</a> section of the <a href="https://www.phpbb.com/customise/db/">Customisation Database</a>.</p>
 
 	<p>For more information about language packs, please see: <a href="https://www.phpbb.com/languages/">https://www.phpbb.com/languages/</a></p>
 
@@ -139,7 +138,7 @@
 
 	<p>Installation of these packages is straightforward: simply download the required language pack, uncompress (unzip) it and via FTP transfer the included <code>language</code> and <code>styles</code> folders to the root of your board installation. The language can then be installed via the Administration Control Panel of your board: <code>Customise tab -&gt; Language management -&gt; Language packs</code>. A more detailed description of the process is in the Knowledge Base article, <a href="https://www.phpbb.com/kb/article/how-to-install-a-language-pack/">How to Install a Language Pack</a>.</p>
 
-	<p>If your language is not available, please visit our <a href="https://www.phpbb.com/community/viewforum.php?f=491">[3.1.x] Translations</a> forum where you will find topics on translations in progress. Should you wish to volunteer to translate a language not currently available or assist in maintaining an existing language pack, you can <a href="https://www.phpbb.com/languages/apply.php">Apply to become a translator</a>.</p>
+	<p>If your language is not available, please visit our <a href="https://www.phpbb.com/community/viewforum.php?f=566">[3.2.x] Translations</a> forum where you will find topics on translations in progress. Should you wish to volunteer to translate a language not currently available or assist in maintaining an existing language pack, you can <a href="https://www.phpbb.com/languages/apply.php">Apply to become a translator</a>.</p>
 
 	<a name="styles"></a><h3>2.ii. Styles</h3>
 
@@ -185,7 +184,7 @@
 
 	<p>Comprehensive documentation is now available on the phpBB website:</p>
 
-	<p><a href="https://www.phpbb.com/support/docs/en/3.1/ug/">https://www.phpbb.com/support/docs/en/3.1/ug/</a></p>
+	<p><a href="https://www.phpbb.com/support/docs/en/3.2/ug/">https://www.phpbb.com/support/docs/en/3.2/ug/</a></p>
 
 	<p>This covers everything from installation to setting permissions and managing users.</p>
 
@@ -225,7 +224,7 @@
 
 		<div class="content">
 
-	<p>This is a stable release of phpBB. The 3.1.x line is feature frozen, with point releases principally including fixes for bugs and security issues. Feature alterations and minor feature additions may be done if deemed absolutely required. The next major release will be phpBB 3.2 which is currently under development. Please do not post questions asking when 3.2 will be available, no release date has been set.</p>
+	<p>This is a stable release of phpBB. The 3.2.x line is feature frozen, with point releases principally including fixes for bugs and security issues. Feature alterations and minor feature additions may be done if deemed absolutely required. The next major release will be phpBB 3.3 which is currently under development. Please do not post questions asking when 3.3 will be available, no release date has been set.</p>
 
 	<p>Those interested in the development of phpBB should keep an eye on the development forums to see how things are progressing:</p>
 
@@ -266,15 +265,15 @@
 
 	<ul>
 		<li>Your server type/version, e.g. Apache 2.2.3, IIS 7, Sambar, etc.</li>
-		<li>PHP version and mode of operation, e.g. PHP 5.3.3 as a module, PHP 5.4.0 running as CGI, etc.</li>
-		<li>DB type/version, e.g. MySQL 5.0.77, PostgreSQL 9.0.6, MSSQL Server 2000 SP1, etc.</li>
+		<li>PHP version and mode of operation, e.g. PHP 5.4.0 as a module, PHP 5.4.0 running as CGI, etc.</li>
+		<li>DB type/version, e.g. MySQL 5.0.77, PostgreSQL 9.0.6, MSSQL Server 2000 (via ODBC), etc.</li>
 	</ul>
 
 	<p>The relevant database type/version is listed within the administration control panel.</p>
 
 	<p>Please be as detailed as you can in your report, and if possible, list the steps required to duplicate the problem. If you have a patch that fixes the issue, please attach it to the ticket or submit a pull request to our repository <a href="https://github.com/phpbb/phpbb">on GitHub</a>.</p>
 
-	<p>If you create a patch, it is very much appreciated (but not required) if you follow the phpBB coding guidelines. Please note that the coding guidelines are somewhat different between different versions of phpBB. For phpBB 3.1.x the coding guidelines may be found here: <a href="http://area51.phpbb.com/docs/31x/coding-guidelines.html">http://area51.phpbb.com/docs/31x/coding-guidelines.html</a></p>
+	<p>If you create a patch, it is very much appreciated (but not required) if you follow the phpBB coding guidelines. Please note that the coding guidelines are somewhat different between different versions of phpBB. For phpBB 3.2.x the coding guidelines may be found here: <a href="http://area51.phpbb.com/docs/32x/coding-guidelines.html">http://area51.phpbb.com/docs/32x/coding-guidelines.html</a></p>
 
 	<p>Once a bug has been submitted you will be emailed any follow up comments added to it. <strong>Please</strong> if you are requested to supply additional information, do so! It is frustrating for us to receive bug reports, ask for additional information but get nothing. In these cases we have a policy of closing the bug, which may leave a very real problem in place. Obviously we would rather not have this situation arise.</p>
 
@@ -324,11 +323,11 @@
 
 		<div class="content">
 
-	<p>phpBB 3.1.x takes advantage of new features added in PHP 5.3. We recommend that you upgrade to the latest stable release of PHP5 to run phpBB. The minimum version required is PHP 5.3.3 and the maximum supported version is any version prior to PHP 7.0.</p>
+	<p>phpBB 3.2.x takes advantage of new features added in PHP 5.4. We recommend that you upgrade to the latest stable release of PHP to run phpBB. The minimum version required is PHP 5.4.0 and the maximum supported version is the latest stable version of PHP.</p>
 
 	<p>Please remember that running any application on a development (unstable, e.g. a beta release) version of PHP can lead to strange/unexpected results which may appear to be bugs in the application. Therefore, we recommend you upgrade to the newest stable version of PHP before running phpBB. If you are running a development version of PHP please check any bugs you find on a system running a stable release before submitting.</p>
 
-	<p>This board has been developed and tested under Linux and Windows (amongst others) running Apache using MySQL 3.23, 4.x, 5.x, MariaDB 5.x, MSSQL Server 2000, PostgreSQL 8.x, Oracle 8, SQLite 2 and SQLite 3. Versions of PHP used range from 5.3.x to 5.4.x without problem.</p>
+	<p>This board has been developed and tested under Linux and Windows (amongst others) running Apache using MySQL 3.23, 4.x, 5.x, MariaDB 5.x, PostgreSQL 8.x, Oracle 8 and SQLite 3. Versions of PHP used range from 5.4.x above 5.6.x to 7.0.x without problem.</p>
 
 <a name="phpsec"></a><h3>7.i. Notice on PHP security issues</h3>
 
--- a/docs/coding-guidelines.html
+++ b/docs/coding-guidelines.html
@@ -4,7 +4,7 @@
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta name="keywords" content="" />
-<meta name="description" content="Ascraeus coding guidelines document" />
+<meta name="description" content="Rhea coding guidelines document" />
 <title>phpBB3 &bull; Coding Guidelines</title>
 
 <link href="assets/css/stylesheet.css" rel="stylesheet" type="text/css" media="screen" />
@@ -22,7 +22,7 @@
 			<div id="doc-description">
 				<a href="../index.php" id="logo"><img src="assets/images/site_logo.gif" alt="" /></a>
 				<h1>Coding Guidelines</h1>
-				<p>Ascraeus coding guidelines document</p>
+				<p>Rhea coding guidelines document</p>
 				<p style="display: none;"><a href="#start_here">Skip</a></p>
 			</div>
 
@@ -37,7 +37,7 @@
 <!-- BEGIN DOCUMENT -->
 
 <p class="paragraph main-description">
-	These are the phpBB Coding Guidelines for Ascraeus, all attempts should be made to follow them as closely as possible.
+	These are the phpBB Coding Guidelines for Rhea, all attempts should be made to follow them as closely as possible.
 </p>
 
 <h1>Coding Guidelines</h1>
@@ -1123,9 +1123,6 @@ append_sid(&quot;{$phpbb_root_path}memberlist.$phpEx&quot;, 'mode=group&amp;amp;
 
 	<ul>
 		<li>
-			<p>Use <code>sizeof</code> instead of <code>count</code></p>
-		</li>
-		<li>
 			<p>Use <code>strpos</code> instead of <code>strstr</code></p>
 		</li>
 		<li>
@@ -1187,8 +1184,8 @@ append_sid(&quot;{$phpbb_root_path}memberlist.$phpEx&quot;, 'mode=group&amp;amp;
 # General Information about this style
 name = prosilver_duplicate
 copyright = © phpBB Limited, 2007
-style_version = 3.1.0
-phpbb_version = 3.1.0
+style_version = 3.2.0
+phpbb_version = 3.2.0
 
 # Defining a different template bitfield
 # template_bitfield = lNg=
@@ -1677,8 +1674,8 @@ div
 # General Information about this style
 name = Custom Style
 copyright = © phpBB Limited, 2007
-style_version = 3.1.0-b1
-phpbb_version = 3.1.0-b1
+style_version = 3.2.0-b1
+phpbb_version = 3.2.0-b1
 
 # Defining a different template bitfield
 # template_bitfield = lNg=
@@ -1725,7 +1722,7 @@ This may span multiple lines.
     + first/file/path.html
     + second/file/path.html
 * Purpose: Same as above.
-* Since: 3.1.0-b1
+* Since: 3.2.0-b1
 </pre></div>
 		<li>An event that is found multiple times in a file should have the number of instances in parenthesis next to the filename.
 		<div class="codebox"><pre>event_name
@@ -1734,7 +1731,7 @@ This may span multiple lines.
     + first/file/path.html (2)
     + second/file/path.html
 * Purpose: Same as above.
-* Since: 3.1.0-b1
+* Since: 3.2.0-b1
 </pre></div></li>
 		<li>An actual example event documentation:
 		<div class="codebox"><pre>forumlist_body_last_post_title_prepend
@@ -1743,7 +1740,7 @@ This may span multiple lines.
     + styles/prosilver/template/forumlist_body.html
     + styles/subsilver2/template/forumlist_body.html
 * Purpose: Add content before the post title of the latest post in a forum on the forum list.
-* Since: 3.1.0-a1
+* Since: 3.2.0-a1
 </pre></div></ul><br />
 
 		</div>
--- a/docs/events.md
+++ b/docs/events.md
@@ -58,6 +58,24 @@ acp_email_options_after
 * Since: 3.1.2-RC1
 * Purpose: Add settings to mass email form
 
+acp_ext_details_end
+===
+* Location: adm/style/acp_ext_details.html
+* Since: 3.1.11-RC1
+* Purpose: Add more detailed information on extension after the available information.
+
+acp_ext_list_disabled_title_after
+===
+* Location: adm/style/acp_ext_list.html
+* Since: 3.1.11-RC1
+* Purpose: Add text after disabled extensions section title.
+
+acp_ext_list_enabled_title_after
+===
+* Location: adm/style/acp_ext_list.html
+* Since: 3.1.11-RC1
+* Purpose: Add text after enabled extensions section title.
+
 acp_forums_custom_settings
 ===
 * Location: adm/style/acp_forums.html
@@ -184,6 +202,18 @@ acp_groups_position_teampage_add_button_before
 * Since: 3.1.7-RC1
 * Purpose: Add content before adding group to teampage submit button
 
+acp_help_phpbb_stats_after
+===
+* Location: adm/style/acp_help_phpbb.html
+* Since: 3.2.0-RC2
+* Purpose: Add content after send statistics tile
+
+acp_help_phpbb_stats_before
+===
+* Location: adm/style/acp_help_phpbb.html
+* Since: 3.2.0-RC2
+* Purpose: Add content before send statistics tile
+
 acp_logs_quick_select_forum_button_append
 ===
 * Location: adm/style/acp_logs.html
@@ -357,6 +387,13 @@ acp_profile_contact_before
 * Since: 3.1.6-RC1
 * Purpose: Add extra options to custom profile field configuration in the ACP
 
+acp_profile_step_one_lang_after
+===
+* Locations:
+    + adm/style/acp_profile.html
+* Since: 3.1.11-RC1
+* Purpose: Add extra lang specific options to custom profile field step one configuration in the ACP
+
 acp_prune_forums_append
 ===
 * Locations:
@@ -552,7 +589,6 @@ attachment_file_after
 ===
 * Locations:
     + styles/prosilver/template/attachment.html
-    + styles/subsilver2/template/attachment.html
 * Since: 3.1.6-RC1
 * Purpose: Add content after the attachment.
 
@@ -560,7 +596,6 @@ attachment_file_append
 ===
 * Locations:
     + styles/prosilver/template/attachment.html
-    + styles/subsilver2/template/attachment.html
 * Since: 3.1.6-RC1
 * Purpose: Add custom attachment types displaying to the bottom of attachment block.
 
@@ -568,7 +603,6 @@ attachment_file_before
 ===
 * Locations:
     + styles/prosilver/template/attachment.html
-    + styles/subsilver2/template/attachment.html
 * Since: 3.1.6-RC1
 * Purpose: Add content before the attachment.
 
@@ -576,7 +610,6 @@ attachment_file_prepend
 ===
 * Locations:
     + styles/prosilver/template/attachment.html
-    + styles/subsilver2/template/attachment.html
 * Since: 3.1.6-RC1
 * Purpose: Add custom attachment types displaying to the top of attachment block.
 
@@ -584,7 +617,6 @@ forumlist_body_category_header_after
 ===
 * Locations:
     + styles/prosilver/template/forumlist_body.html
-    + styles/subsilver2/template/forumlist_body.html
 * Since: 3.1.0-a4
 * Purpose: Add content after the header of the category on the forum list.
 
@@ -592,7 +624,6 @@ forumlist_body_category_header_before
 ===
 * Locations:
     + styles/prosilver/template/forumlist_body.html
-    + styles/subsilver2/template/forumlist_body.html
 * Since: 3.1.0-a4
 * Purpose: Add content before the header of the category on the forum list.
 
@@ -614,7 +645,6 @@ forumlist_body_forum_row_after
 ===
 * Locations:
     + styles/prosilver/template/forumlist_body.html
-    + styles/subsilver2/template/forumlist_body.html
 * Since: 3.1.0-RC5
 * Purpose: Add content after the forum list item.
 
@@ -622,7 +652,6 @@ forumlist_body_forum_row_append
 ===
 * Locations:
     + styles/prosilver/template/forumlist_body.html
-    + styles/subsilver2/template/forumlist_body.html
 * Since: 3.1.0-RC5
 * Purpose: Add content at the start of the forum list item.
 
@@ -630,7 +659,6 @@ forumlist_body_forum_row_before
 ===
 * Locations:
     + styles/prosilver/template/forumlist_body.html
-    + styles/subsilver2/template/forumlist_body.html
 * Since: 3.1.0-RC5
 * Purpose: Add content before the forum list item.
 
@@ -638,7 +666,6 @@ forumlist_body_forum_row_prepend
 ===
 * Locations:
     + styles/prosilver/template/forumlist_body.html
-    + styles/subsilver2/template/forumlist_body.html
 * Since: 3.1.0-RC5
 * Purpose: Add content at the end of the forum list item.
 
@@ -646,7 +673,6 @@ forumlist_body_last_post_title_prepend
 ===
 * Locations:
     + styles/prosilver/template/forumlist_body.html
-    + styles/subsilver2/template/forumlist_body.html
 * Since: 3.1.0-a1
 * Purpose: Add content before the post title of the latest post in a forum on the forum list.
 
@@ -654,7 +680,6 @@ forumlist_body_subforums_after
 ===
 * Locations:
     + styles/prosilver/template/forumlist_body.html
-    + styles/subsilver2/template/forumlist_body.html
 * Since: 3.1.0-a4
 * Purpose: Add content after the list of subforums (if any) for each forum on the forum list.
 
@@ -662,7 +687,6 @@ forumlist_body_subforums_before
 ===
 * Locations:
     + styles/prosilver/template/forumlist_body.html
-    + styles/subsilver2/template/forumlist_body.html
 * Since: 3.1.0-a4
 * Purpose: Add content before the list of subforums (if any) for each forum on the forum list.
 
@@ -670,7 +694,6 @@ forumlist_body_last_row_after
 ===
 * Locations:
     + styles/prosilver/template/forumlist_body.html
-    + styles/subsilver2/template/forumlist_body.html
 * Since: 3.1.0-b2
 * Purpose: Add content after the very last row of the forum list.
 
@@ -678,7 +701,6 @@ index_body_block_birthday_append
 ===
 * Locations:
     + styles/prosilver/template/index_body.html
-    + styles/subsilver2/template/index_body.html
 * Since: 3.1.0-b3
 * Purpose: Append content to the birthday list on the Board index
 
@@ -686,7 +708,6 @@ index_body_block_birthday_prepend
 ===
 * Locations:
     + styles/prosilver/template/index_body.html
-    + styles/subsilver2/template/index_body.html
 * Since: 3.1.0-b3
 * Purpose: Prepend content to the birthday list on the Board index
 
@@ -694,7 +715,6 @@ index_body_block_online_append
 ===
 * Locations:
     + styles/prosilver/template/index_body.html
-    + styles/subsilver2/template/index_body.html
 * Since: 3.1.0-b3
 * Purpose: Append content to the online list on the Board index
 
@@ -702,7 +722,6 @@ index_body_block_online_prepend
 ===
 * Locations:
     + styles/prosilver/template/index_body.html
-    + styles/subsilver2/template/index_body.html
 * Since: 3.1.0-b3
 * Purpose: Prepend content to the online list on the Board index
 
@@ -710,7 +729,6 @@ index_body_block_stats_append
 ===
 * Locations:
     + styles/prosilver/template/index_body.html
-    + styles/subsilver2/template/index_body.html
 * Since: 3.1.0-b3
 * Purpose: Append content to the statistics list on the Board index
 
@@ -718,7 +736,6 @@ index_body_block_stats_prepend
 ===
 * Locations:
     + styles/prosilver/template/index_body.html
-    + styles/subsilver2/template/index_body.html
 * Since: 3.1.0-b3
 * Purpose: Prepend content to the statistics list on the Board index
 
@@ -726,7 +743,6 @@ index_body_forumlist_body_after
 ===
 * Locations:
     + styles/prosilver/template/index_body.html
-    + styles/subsilver2/template/index_body.html
 * Since: 3.1.1
 * Purpose: Add content after the forum list body on the index page
 
@@ -734,7 +750,6 @@ index_body_markforums_after
 ===
 * Locations:
     + styles/prosilver/template/index_body.html
-    + styles/subsilver2/template/index_body.html
 * Since: 3.1.0-RC2
 * Purpose: Add content after the mark-read link above the forum list on Board index
 
@@ -742,7 +757,6 @@ index_body_markforums_before
 ===
 * Locations:
     + styles/prosilver/template/index_body.html
-    + styles/subsilver2/template/index_body.html
 * Since: 3.1.0-RC2
 * Purpose: Add content before the mark-read link above the forum list on Board index
 
@@ -750,7 +764,6 @@ index_body_stat_blocks_after
 ===
 * Locations:
     + styles/prosilver/template/index_body.html
-    + styles/subsilver2/template/index_body.html
 * Since: 3.1.0-b3
 * Purpose: Add new statistic blocks below the Who Is Online and Board Statistics blocks
 
@@ -758,7 +771,6 @@ index_body_stat_blocks_before
 ===
 * Locations:
     + styles/prosilver/template/index_body.html
-    + styles/subsilver2/template/index_body.html
 * Since: 3.1.0-a1
 * Purpose: Add new statistic blocks above the Who Is Online and Board Statistics blocks
 
@@ -766,7 +778,6 @@ mcp_ban_fields_after
 ===
 * Locations:
     + styles/prosilver/template/mcp_ban.html
-    + styles/subsilver2/template/mcp_ban.html
 * Since: 3.1.0-RC3
 * Purpose: Add additional fields to the ban form in MCP
 
@@ -774,7 +785,6 @@ mcp_ban_fields_before
 ===
 * Locations:
     + styles/prosilver/template/mcp_ban.html
-    + styles/subsilver2/template/mcp_ban.html
 * Since: 3.1.0-RC3
 * Purpose: Add additional fields to the ban form in MCP
 
@@ -782,7 +792,6 @@ mcp_ban_unban_after
 ===
 * Locations:
     + styles/prosilver/template/mcp_ban.html
-    + styles/subsilver2/template/mcp_ban.html
 * Since: 3.1.0-RC3
 * Purpose: Add additional fields to the unban form in MCP
 
@@ -790,15 +799,34 @@ mcp_ban_unban_before
 ===
 * Locations:
     + styles/prosilver/template/mcp_ban.html
-    + styles/subsilver2/template/mcp_ban.html
 * Since: 3.1.0-RC3
 * Purpose: Add additional fields to the unban form in MCP
 
+mcp_forum_actions_after
+===
+* Locations:
+    + styles/prosilver/template/mcp_forum.html
+* Since: 3.1.11-RC1
+* Purpose: Add some information after actions fieldset
+
+mcp_forum_actions_append
+===
+* Locations:
+    + styles/prosilver/template/mcp_forum.html
+* Since: 3.1.11-RC1
+* Purpose: Add additional options to actions select
+
+mcp_forum_actions_before
+===
+* Locations:
+    + styles/prosilver/template/mcp_forum.html
+* Since: 3.1.11-RC1
+* Purpose: Add some information before actions fieldset
+
 mcp_forum_topic_title_before
 ===
 * Locations:
     + styles/prosilver/template/mcp_forum.html
-    + styles/subsilver2/template/mcp_forum.html
 * Since: 3.1.6-RC1
 * Purpose: Add some information before the topic title
 
@@ -806,7 +834,6 @@ mcp_forum_topic_title_after
 ===
 * Locations:
     + styles/prosilver/template/mcp_forum.html
-    + styles/subsilver2/template/mcp_forum.html
 * Since: 3.1.6-RC1
 * Purpose: Add some information after the topic title
 
@@ -814,7 +841,6 @@ mcp_front_latest_logs_after
 ===
 * Locations:
     + styles/prosilver/template/mcp_front.html
-    + styles/subsilver2/template/mcp_front.html
 * Since: 3.1.3-RC1
 * Purpose: Add content after latest logs list
 
@@ -822,7 +848,6 @@ mcp_front_latest_logs_before
 ===
 * Locations:
     + styles/prosilver/template/mcp_front.html
-    + styles/subsilver2/template/mcp_front.html
 * Since: 3.1.3-RC1
 * Purpose: Add content before latest logs list
 
@@ -830,7 +855,6 @@ mcp_front_latest_reported_before
 ===
 * Locations:
     + styles/prosilver/template/mcp_front.html
-    + styles/subsilver2/template/mcp_front.html
 * Since: 3.1.3-RC1
 * Purpose: Add content before latest reported posts list
 
@@ -838,7 +862,6 @@ mcp_front_latest_reported_pms_before
 ===
 * Locations:
     + styles/prosilver/template/mcp_front.html
-    + styles/subsilver2/template/mcp_front.html
 * Since: 3.1.3-RC1
 * Purpose: Add content before latest reported private messages list
 
@@ -846,7 +869,6 @@ mcp_front_latest_unapproved_before
 ===
 * Locations:
     + styles/prosilver/template/mcp_front.html
-    + styles/subsilver2/template/mcp_front.html
 * Since: 3.1.3-RC1
 * Purpose: Add content before latest unapproved posts list
 
@@ -854,7 +876,6 @@ mcp_move_before
 ===
 * Locations:
     + styles/prosilver/template/mcp_move.html
-    + styles/subsilver2/template/mcp_move.html
 * Since: 3.1.10-RC1
 * Purpose: Add content before move topic/post form
 
@@ -862,7 +883,6 @@ mcp_post_additional_options
 ===
 * Locations:
     + styles/prosilver/template/mcp_post.html
-    + styles/subsilver2/template/mcp_post.html
 * Since: 3.1.5-RC1
 * Purpose: Add content within the list of post moderation actions
 
@@ -870,7 +890,6 @@ mcp_topic_options_after
 ===
 * Locations:
     + styles/prosilver/template/mcp_topic.html
-    + styles/subsilver2/template/mcp_topic.html
 * Since: 3.1.6-RC1
 * Purpose: Add some options (field, checkbox, ...) after the subject field when split a subject
 
@@ -878,7 +897,6 @@ mcp_topic_options_before
 ===
 * Locations:
     + styles/prosilver/template/mcp_topic.html
-    + styles/subsilver2/template/mcp_topic.html
 * Since: 3.1.6-RC1
 * Purpose: Add some options (field, checkbox, ...) before the subject field when split a subject
 
@@ -886,7 +904,6 @@ mcp_topic_postrow_post_details_after
 ===
 * Locations:
     + styles/prosilver/template/mcp_topic.html
-    + styles/subsilver2/template/mcp_topic.html
 * Since: 3.1.10-RC1
 * Purpose: Add content after post details in topic moderation
 
@@ -894,7 +911,6 @@ mcp_topic_postrow_post_details_before
 ===
 * Locations:
     + styles/prosilver/template/mcp_topic.html
-    + styles/subsilver2/template/mcp_topic.html
 * Since: 3.1.10-RC1
 * Purpose: Add content before post details in topic moderation
 
@@ -902,7 +918,6 @@ mcp_topic_topic_title_after
 ===
 * Locations:
     + styles/prosilver/template/mcp_topic.html
-    + styles/subsilver2/template/mcp_topic.html
 * Since: 3.1.6-RC1
 * Purpose: Add some information after the topic title
 
@@ -910,7 +925,6 @@ mcp_topic_topic_title_before
 ===
 * Locations:
     + styles/prosilver/template/mcp_topic.html
-    + styles/subsilver2/template/mcp_topic.html
 * Since: 3.1.6-RC1
 * Purpose: Add some information before the topic title
 
@@ -918,7 +932,6 @@ mcp_warn_post_add_warning_field_after
 ===
 * Locations:
     + styles/prosilver/template/mcp_warn_post.html
-    + styles/subsilver2/template/mcp_warn_post.html
 * Since: 3.1.0-RC4
 * Purpose: Add content during warning for a post - after add warning field.
 
@@ -926,7 +939,6 @@ mcp_warn_post_add_warning_field_before
 ===
 * Locations:
     + styles/prosilver/template/mcp_warn_post.html
-    + styles/subsilver2/template/mcp_warn_post.html
 * Since: 3.1.0-RC4
 * Purpose: Add content during warning for a post - before add warning field.
 
@@ -934,7 +946,6 @@ mcp_warn_user_add_warning_field_after
 ===
 * Locations:
     + styles/prosilver/template/mcp_warn_user.html
-    + styles/subsilver2/template/mcp_warn_user.html
 * Since: 3.1.0-RC4
 * Purpose: Add content during warning a user - after add warning field.
 
@@ -942,7 +953,6 @@ mcp_warn_user_add_warning_field_before
 ===
 * Locations:
     + styles/prosilver/template/mcp_warn_user.html
-    + styles/subsilver2/template/mcp_warn_user.html
 * Since: 3.1.0-RC4
 * Purpose: Add content during warning a user - before add warning field.
 
@@ -950,7 +960,6 @@ memberlist_body_rank_append
 ===
 * Locations:
     + styles/prosilver/template/memberlist_body.html
-    + styles/subsilver2/template/memberlist_body.html
 * Since: 3.1.6-RC1
 * Purpose: Add information after rank in memberlist. Works in
 all display modes (leader, group and normal memberlist).
@@ -959,7 +968,6 @@ memberlist_body_rank_prepend
 ===
 * Locations:
     + styles/prosilver/template/memberlist_body.html
-    + styles/subsilver2/template/memberlist_body.html
 * Since: 3.1.6-RC1
 * Purpose: Add information before rank in memberlist. Works in
 all display modes (leader, group and normal memberlist).
@@ -968,7 +976,6 @@ memberlist_body_username_append
 ===
 * Locations:
     + styles/prosilver/template/memberlist_body.html
-    + styles/subsilver2/template/memberlist_body.html
 * Since: 3.1.0-a1
 * Purpose: Add information after every username in the memberlist. Works in
 all display modes (leader, group and normal memberlist).
@@ -977,7 +984,6 @@ memberlist_body_username_prepend
 ===
 * Locations:
     + styles/prosilver/template/memberlist_body.html
-    + styles/subsilver2/template/memberlist_body.html
 * Since: 3.1.0-a1
 * Purpose: Add information before every username in the memberlist. Works in
 all display modes (leader, group and normal memberlist).
@@ -986,7 +992,6 @@ memberlist_email_before
 ===
 * Locations:
     + styles/prosilver/template/memberlist_email.html
-    + styles/subsilver2/template/memberlist_email.html
 * Since: 3.1.10-RC1
 * Purpose: Allow adding customizations before the memberlist_email form.
 
@@ -994,7 +999,6 @@ memberlist_search_fields_after
 ===
 * Locations:
     + styles/prosilver/template/memberlist_search.html
-    + styles/subsilver2/template/memberlist_search.html
 * Since: 3.1.2-RC1
 * Purpose: Add information after the search fields column.
 
@@ -1002,7 +1006,6 @@ memberlist_search_fields_before
 ===
 * Locations:
     + styles/prosilver/template/memberlist_search.html
-    + styles/subsilver2/template/memberlist_search.html
 * Since: 3.1.2-RC1
 * Purpose: Add information before the search fields column.
 
@@ -1010,15 +1013,27 @@ memberlist_search_sorting_options_before
 ===
 * Locations:
     + styles/prosilver/template/memberlist_search.html
-    + styles/subsilver2/template/memberlist_search.html
 * Since: 3.1.2-RC1
 * Purpose: Add information before the search sorting options field.
 
+memberlist_team_username_append
+===
+* Locations:
+    + styles/prosilver/template/memberlist_team.html
+* Since: 3.1.11-RC1
+* Purpose: Append information to username of team member
+
+memberlist_team_username_prepend
+===
+* Locations:
+    + styles/prosilver/template/memberlist_team.html
+* Since: 3.1.11-RC1
+* Purpose: Add information before team user username
+
 memberlist_view_contact_after
 ===
 * Locations:
     + styles/prosilver/template/memberlist_view.html
-    + styles/subsilver2/template/memberlist_view.html
 * Since: 3.1.0-b2
 * Purpose: Add content after the user contact part of any user profile
 
@@ -1026,7 +1041,6 @@ memberlist_view_contact_before
 ===
 * Locations:
     + styles/prosilver/template/memberlist_view.html
-    + styles/subsilver2/template/memberlist_view.html
 * Since: 3.1.0-b2
 * Purpose: Add content before the user contact part of any user profile
 
@@ -1034,7 +1048,6 @@ memberlist_view_contact_custom_fields_after
 ===
 * Locations:
     + styles/prosilver/template/memberlist_view.html
-    + styles/subsilver2/template/memberlist_view.html
 * Since: 3.1.9-RC1
 * Purpose: Add content after the user contact related custom fields
 
@@ -1042,7 +1055,6 @@ memberlist_view_contact_custom_fields_before
 ===
 * Locations:
     + styles/prosilver/template/memberlist_view.html
-    + styles/subsilver2/template/memberlist_view.html
 * Since: 3.1.9-RC1
 * Purpose: Add content before the user contact related custom fields
 
@@ -1050,7 +1062,6 @@ memberlist_view_content_append
 ===
 * Locations:
     + styles/prosilver/template/memberlist_view.html
-    + styles/subsilver2/template/memberlist_view.html
 * Since: 3.1.0-b2
 * Purpose: Add custom content to the user profile view after the main content
 
@@ -1058,7 +1069,6 @@ memberlist_view_content_prepend
 ===
 * Locations:
     + styles/prosilver/template/memberlist_view.html
-    + styles/subsilver2/template/memberlist_view.html
 * Since: 3.1.0-b3
 * Purpose: Add custom content to the user profile view before the main content
 
@@ -1066,7 +1076,6 @@ memberlist_view_non_contact_custom_fields_after
 ===
 * Locations:
     + styles/prosilver/template/memberlist_view.html
-    + styles/subsilver2/template/memberlist_view.html
 * Since: 3.1.9-RC1
 * Purpose: Add content after the user not contact related custom fields
 
@@ -1074,17 +1083,9 @@ memberlist_view_non_contact_custom_fields_before
 ===
 * Locations:
     + styles/prosilver/template/memberlist_view.html
-    + styles/subsilver2/template/memberlist_view.html
 * Since: 3.1.9-RC1
 * Purpose: Add content before the user not contact related custom fields
 
-memberlist_view_rank_after
-===
-* Locations:
-    + styles/subsilver2/template/memberlist_view.html
-* Since: 3.1.6-RC1
-* Purpose: Add information after rank in memberlist
-
 memberlist_view_rank_avatar_after
 ===
 * Locations:
@@ -1099,13 +1100,6 @@ memberlist_view_rank_avatar_before
 * Since: 3.1.6-RC1
 * Purpose: Add information before rank in memberlist (with avatar)
 
-memberlist_view_rank_before
-===
-* Locations:
-    + styles/subsilver2/template/memberlist_view.html
-* Since: 3.1.6-RC1
-* Purpose: Add information after rank in memberlist
-
 memberlist_view_rank_no_avatar_after
 ===
 * Locations:
@@ -1124,7 +1118,6 @@ memberlist_view_user_statistics_after
 ===
 * Locations:
     + styles/prosilver/template/memberlist_view.html
-    + styles/subsilver2/template/memberlist_view.html
 * Since: 3.1.0-a1
 * Purpose: Add entries after the user statistics part of any user profile
 
@@ -1132,7 +1125,6 @@ memberlist_view_user_statistics_before
 ===
 * Locations:
     + styles/prosilver/template/memberlist_view.html
-    + styles/subsilver2/template/memberlist_view.html
 * Since: 3.1.0-a1
 * Purpose: Add entries before the user statistics part of any user profile
 
@@ -1140,7 +1132,6 @@ memberlist_view_zebra_after
 ===
 * Locations:
     + styles/prosilver/template/memberlist_view.html
-    + styles/subsilver2/template/memberlist_view.html
 * Since: 3.1.9-RC1
 * Purpose: Add content after the user friends/foes links
 
@@ -1148,7 +1139,6 @@ memberlist_view_zebra_before
 ===
 * Locations:
     + styles/prosilver/template/memberlist_view.html
-    + styles/subsilver2/template/memberlist_view.html
 * Since: 3.1.9-RC1
 * Purpose: Add content before the user friends/foes links
 
@@ -1219,7 +1209,6 @@ overall_footer_after
 ===
 * Locations:
     + styles/prosilver/template/overall_footer.html
-    + styles/subsilver2/template/overall_footer.html
 * Since: 3.1.0-a1
 * Purpose: Add content at the end of the file, directly prior to the `</body>` tag
 
@@ -1227,7 +1216,6 @@ overall_footer_body_after
 ===
 * Locations:
     + styles/prosilver/template/overall_footer.html
-    + styles/subsilver2/template/overall_footer.html
 * Since: 3.1.3-RC1
 * Purpose: Add content before the `</body>` tag but after the $SCRIPTS var, i.e. after the js scripts have been loaded
 
@@ -1235,7 +1223,6 @@ overall_footer_breadcrumb_append
 ===
 * Locations:
     + styles/prosilver/template/navbar_footer.html
-    + styles/subsilver2/template/breadcrumbs.html
 * Since: 3.1.0-a1
 * Purpose: Add links to the list of breadcrumbs in the footer
 
@@ -1243,7 +1230,6 @@ overall_footer_breadcrumb_prepend
 ===
 * Locations:
     + styles/prosilver/template/navbar_footer.html
-    + styles/subsilver2/template/breadcrumbs.html
 * Since: 3.1.0-RC3
 * Purpose: Add links to the list of breadcrumbs in the footer (after site-home, but before board-index)
 
@@ -1251,7 +1237,6 @@ overall_footer_content_after
 ===
 * Locations:
     + styles/prosilver/template/overall_footer.html
-    + styles/subsilver2/template/overall_footer.html
 * Since: 3.1.0-a3
 * Purpose: Add content on all pages after the main content, before the footer
 
@@ -1259,7 +1244,6 @@ overall_footer_copyright_append
 ===
 * Locations:
     + styles/prosilver/template/overall_footer.html
-    + styles/subsilver2/template/overall_footer.html
 * Since: 3.1.0-a1
 * Purpose: Add content after the copyright line (no new line by default), before the ACP link
 
@@ -1267,7 +1251,6 @@ overall_footer_copyright_prepend
 ===
 * Locations:
     + styles/prosilver/template/overall_footer.html
-    + styles/subsilver2/template/overall_footer.html
 * Since: 3.1.0-a1
 * Purpose: Add content before the copyright line
 
@@ -1275,7 +1258,6 @@ overall_footer_page_body_after
 ===
 * Locations:
     + styles/prosilver/template/overall_footer.html
-    + styles/subsilver2/template/overall_footer.html
 * Since: 3.1.0-b3
 * Purpose: Add content after the page-body, but before the footer
 
@@ -1283,7 +1265,6 @@ overall_footer_teamlink_after
 ===
 * Locations:
     + styles/prosilver/template/navbar_footer.html
-    + styles/subsilver2/template/index_body.html
 * Since: 3.1.0-b3
 * Purpose: Add contents after the team-link in the footer
 
@@ -1291,7 +1272,6 @@ overall_footer_teamlink_before
 ===
 * Locations:
     + styles/prosilver/template/navbar_footer.html
-    + styles/subsilver2/template/index_body.html
 * Since: 3.1.0-b3
 * Purpose: Add contents before the team-link in the footer
 
@@ -1299,7 +1279,6 @@ overall_footer_timezone_after
 ===
 * Locations:
     + styles/prosilver/template/navbar_footer.html
-    + styles/subsilver2/template/breadcrumbs.html
 * Since: 3.1.0-b3
 * Purpose: Add content to the navbar in the page footer, after "Timezone"
 
@@ -1307,7 +1286,6 @@ overall_footer_timezone_before
 ===
 * Locations:
     + styles/prosilver/template/navbar_footer.html
-    + styles/subsilver2/template/breadcrumbs.html
 * Since: 3.1.0-b3
 * Purpose: Add content to the navbar in the page footer, before "Timezone"
 
@@ -1315,7 +1293,6 @@ overall_header_body_before
 ===
 * Locations:
     + styles/prosilver/template/overall_header.html
-    + styles/subsilver2/template/overall_header.html
 * Since: 3.1.0-b2
 * Purpose: Add content to the header body
 
@@ -1323,7 +1300,6 @@ overall_header_breadcrumb_append
 ===
 * Locations:
     + styles/prosilver/template/navbar_header.html
-    + styles/subsilver2/template/breadcrumbs.html
 * Since: 3.1.0-a1
 * Purpose: Add links to the list of breadcrumbs in the header
 
@@ -1331,7 +1307,6 @@ overall_header_breadcrumb_prepend
 ===
 * Locations:
     + styles/prosilver/template/navbar_header.html
-    + styles/subsilver2/template/breadcrumbs.html
 * Since: 3.1.0-RC3
 * Purpose: Add links to the list of breadcrumbs in the header (after site-home, but before board-index)
 
@@ -1339,7 +1314,6 @@ overall_header_breadcrumbs_after
 ===
 * Locations:
     + styles/prosilver/template/navbar_header.html
-    + styles/subsilver2/template/breadcrumbs.html
 * Since: 3.1.0-RC3
 * Purpose: Add content after the breadcrumbs (outside of the breadcrumbs container)
 
@@ -1347,7 +1321,6 @@ overall_header_breadcrumbs_before
 ===
 * Locations:
     + styles/prosilver/template/navbar_header.html
-    + styles/subsilver2/template/breadcrumbs.html
 * Since: 3.1.0-RC3
 * Purpose: Add content before the breadcrumbs (outside of the breadcrumbs container)
 
@@ -1355,7 +1328,6 @@ overall_header_content_before
 ===
 * Locations:
     + styles/prosilver/template/overall_header.html
-    + styles/subsilver2/template/overall_header.html
 * Since: 3.1.0-a3
 * Purpose: Add content on all pages before the main content, after the header
 
@@ -1363,7 +1335,6 @@ overall_header_feeds
 ===
 * Locations:
     + styles/prosilver/template/overall_header.html
-    + styles/subsilver2/template/overall_header.html
 * Since: 3.1.6-RC1
 * Purpose: Add custom feeds
 
@@ -1371,7 +1342,6 @@ overall_header_head_append
 ===
 * Locations:
     + styles/prosilver/template/overall_header.html
-    + styles/subsilver2/template/overall_header.html
 * Since: 3.1.0-a1
 * Purpose: Add asset calls directly before the `</head>` tag
 
@@ -1393,7 +1363,6 @@ overall_header_navbar_before
 ===
 * Locations:
     + styles/prosilver/template/overall_header.html
-    + styles/subsilver2/template/overall_header.html
 * Since: 3.1.4-RC1
 * Purpose: Add content before the navigation bar
 
@@ -1401,7 +1370,6 @@ overall_header_navigation_append
 ===
 * Locations:
     + styles/prosilver/template/navbar_header.html
-    + styles/subsilver2/template/overall_header.html
 * Since: 3.1.0-a1
 * Purpose: Add links after the navigation links in the header
 
@@ -1409,7 +1377,6 @@ overall_header_navigation_prepend
 ===
 * Locations:
     + styles/prosilver/template/navbar_header.html
-    + styles/subsilver2/template/overall_header.html
 * Since: 3.1.0-a1
 * Purpose: Add links before the navigation links in the header
 
@@ -1417,7 +1384,6 @@ overall_header_navlink_append
 ===
 * Locations:
     + styles/prosilver/template/navbar_header.html
-    + styles/subsilver2/template/breadcrumbs.html
 * Since: 3.1.0-b3
 * Purpose: Add content after each individual navlink (breadcrumb)
 
@@ -1425,7 +1391,6 @@ overall_header_navlink_prepend
 ===
 * Locations:
     + styles/prosilver/template/navbar_header.html
-    + styles/subsilver2/template/breadcrumbs.html
 * Since: 3.1.0-b3
 * Purpose: Add content before each individual navlink (breadcrumb)
 
@@ -1433,10 +1398,16 @@ overall_header_page_body_before
 ===
 * Locations:
     + styles/prosilver/template/overall_header.html
-    + styles/subsilver2/template/overall_header.html
 * Since: 3.1.0-b3
 * Purpose: Add content after the page-header, but before the page-body
 
+overall_header_searchbox_after
+===
+* Locations:
+    + styles/prosilver/template/overall_header.html
+* Since: 3.1.11-RC1
+* Purpose: Add content after the search box in the header
+
 overall_header_searchbox_before
 ===
 * Locations:
@@ -1448,7 +1419,6 @@ overall_header_stylesheets_after
 ===
 * Locations:
     + styles/prosilver/template/overall_header.html
-    + styles/subsilver2/template/overall_header.html
 * Since: 3.1.0-RC3
 * Purpose: Add asset calls after stylesheets within the `</head>` tag.
 Note that INCLUDECSS will not work with this event.
@@ -1464,7 +1434,6 @@ posting_editor_bbcode_status_after
 ===
 * Locations:
     + styles/prosilver/template/posting_editor.html
-    + styles/subsilver2/template/posting_body.html
 * Since: 3.1.4-RC1
 * Purpose: Add content after bbcode status
 
@@ -1472,7 +1441,6 @@ posting_editor_buttons_after
 ===
 * Locations:
     + styles/prosilver/template/posting_buttons.html
-    + styles/subsilver2/template/posting_buttons.html
 * Since: 3.1.0-a3
 * Purpose: Add content after the BBCode posting buttons
 
@@ -1480,7 +1448,6 @@ posting_editor_buttons_before
 ===
 * Locations:
     + styles/prosilver/template/posting_buttons.html
-    + styles/subsilver2/template/posting_buttons.html
 * Since: 3.1.0-a3
 * Purpose: Add content before the BBCode posting buttons
 
@@ -1488,7 +1455,6 @@ posting_editor_buttons_custom_tags_before
 ===
 * Locations:
     + styles/prosilver/template/posting_buttons.html
-    + styles/subsilver2/template/posting_buttons.html
 * Since: 3.1.2-RC1
 * Purpose: Add content inside the BBCode posting buttons and before the customs BBCode
 
@@ -1496,7 +1462,6 @@ posting_editor_message_after
 ===
 * Locations:
     + styles/prosilver/template/posting_editor.html
-    + styles/subsilver2/template/posting_body.html
 * Since: 3.1.0-a2
 * Purpose: Add field (e.g. textbox) to the posting screen after the message
 
@@ -1504,7 +1469,6 @@ posting_editor_message_before
 ===
 * Locations:
     + styles/prosilver/template/posting_editor.html
-    + styles/subsilver2/template/posting_body.html
 * Since: 3.1.0-a2
 * Purpose: Add field (e.g. textbox) to the posting screen before the message
 
@@ -1512,7 +1476,6 @@ posting_editor_options_prepend
 ===
 * Locations:
     + styles/prosilver/template/posting_editor.html
-    + styles/subsilver2/template/posting_body.html
 * Since: 3.1.0-a1
 * Purpose: Add posting options on the posting screen
 
@@ -1520,7 +1483,6 @@ posting_editor_smilies_after
 ===
 * Locations:
     + styles/prosilver/template/posting_editor.html
-    + styles/subsilver2/template/posting_body.html
 * Since: 3.1.4-RC1
 * Purpose: Add content after smilies
 
@@ -1528,7 +1490,6 @@ posting_editor_smilies_before
 ===
 * Locations:
     + styles/prosilver/template/posting_editor.html
-    + styles/subsilver2/template/posting_body.html
 * Since: 3.1.4-RC1
 * Purpose: Add content before the smilies
 
@@ -1536,7 +1497,6 @@ posting_editor_subject_after
 ===
 * Locations:
     + styles/prosilver/template/posting_editor.html
-    + styles/subsilver2/template/posting_body.html
 * Since: 3.1.0-a2
 * Purpose: Add field (e.g. textbox) to the posting screen after the subject
 
@@ -1544,7 +1504,6 @@ posting_editor_subject_append
 ===
 * Locations:
     + styles/prosilver/template/posting_editor.html
-    + styles/subsilver2/template/posting_body.html
 * Since: 3.1.10-RC1
 * Purpose: Add field, text, etc. to the posting after the subject text box
 
@@ -1552,7 +1511,6 @@ posting_editor_subject_before
 ===
 * Locations:
     + styles/prosilver/template/posting_editor.html
-    + styles/subsilver2/template/posting_body.html
 * Since: 3.1.0-a2
 * Purpose: Add field (e.g. textbox) to the posting screen before the subject
 
@@ -1560,7 +1518,6 @@ posting_editor_subject_prepend
 ===
 * Locations:
     + styles/prosilver/template/posting_editor.html
-    + styles/subsilver2/template/posting_body.html
 * Since: 3.1.10-RC1
 * Purpose: Add field, text, etc. to the posting before the subject text box
 
@@ -1568,7 +1525,6 @@ posting_editor_submit_buttons
 ===
 * Locations:
     + styles/prosilver/template/posting_editor.html
-    + styles/subsilver2/template/posting_body.html
 * Since: 3.1.6-RC1
 * Purpose: Add custom buttons in the posting editor
 
@@ -1583,7 +1539,6 @@ posting_pm_header_find_username_after
 ===
 * Locations:
     + styles/prosilver/template/posting_pm_header.html
-    + styles/subsilver2/template/ucp_header.html
 * Since: 3.1.0-RC4
 * Purpose: Add content after the find username link on composing pm
 
@@ -1591,7 +1546,6 @@ posting_pm_header_find_username_before
 ===
 * Locations:
     + styles/prosilver/template/posting_pm_header.html
-    + styles/subsilver2/template/ucp_header.html
 * Since: 3.1.0-RC4
 * Purpose: Add content before the find username link on composing pm
 
@@ -1613,7 +1567,6 @@ posting_poll_body_options_after
 ===
 * Locations:
     + styles/prosilver/template/posting_poll_body.html
-    + styles/subsilver2/template/posting_poll_body.html
 * Since: 3.1.4-RC1
 * Purpose: Add content after the poll options on creating a poll
 
@@ -1621,7 +1574,6 @@ posting_preview_poll_after
 ===
 * Locations:
     + styles/prosilver/template/posting_preview.html
-    + styles/subsilver2/template/posting_preview.html
 * Since: 3.1.7-RC1
 * Purpose: Add content after the poll preview block
 
@@ -1629,7 +1581,6 @@ posting_topic_review_row_post_details_after
 ===
 * Locations:
     + styles/prosilver/template/posting_topic_review.html
-    + styles/subsilver2/template/posting_topic_review.html
 * Since: 3.1.10-RC1
 * Purpose: Add content after post details in topic review
 
@@ -1637,7 +1588,6 @@ posting_topic_review_row_post_details_before
 ===
 * Locations:
     + styles/prosilver/template/posting_topic_review.html
-    + styles/subsilver2/template/posting_topic_review.html
 * Since: 3.1.10-RC1
 * Purpose: Add content before post details in topic review
 
@@ -1645,7 +1595,6 @@ posting_topic_title_after
 ===
 * Locations:
     + styles/prosilver/template/posting_layout.html
-    + styles/subsilver2/template/posting_body.html
 * Since: 3.1.7-RC1
 * Purpose: Allows to add some information after the topic title in the posting form
 
@@ -1653,7 +1602,6 @@ posting_topic_title_before
 ===
 * Locations:
     + styles/prosilver/template/posting_layout.html
-    + styles/subsilver2/template/posting_body.html
 * Since: 3.1.6-RC1
 * Purpose: Allows to add some information on the left of the topic title in the posting form
 
@@ -1661,7 +1609,6 @@ quickreply_editor_panel_after
 ===
 * Locations:
     + styles/prosilver/template/quickreply_editor.html
-    + styles/subsilver2/template/quickreply_editor.html
 * Since: 3.1.0-b2
 * Purpose: Add content after the quick reply panel (but inside the form)
 
@@ -1669,7 +1616,6 @@ quickreply_editor_panel_before
 ===
 * Locations:
     + styles/prosilver/template/quickreply_editor.html
-    + styles/subsilver2/template/quickreply_editor.html
 * Since: 3.1.0-b2
 * Purpose: Add content before the quick reply panel (but inside the form)
 
@@ -1677,7 +1623,6 @@ quickreply_editor_message_after
 ===
 * Locations:
     + styles/prosilver/template/quickreply_editor.html
-    + styles/subsilver2/template/quickreply_editor.html
 * Since: 3.1.0-a4
 * Purpose: Add content after the quick reply textbox
 
@@ -1685,7 +1630,6 @@ quickreply_editor_message_before
 ===
 * Locations:
     + styles/prosilver/template/quickreply_editor.html
-    + styles/subsilver2/template/quickreply_editor.html
 * Since: 3.1.0-a4
 * Purpose: Add content before the quick reply textbox
 
@@ -1693,7 +1637,6 @@ quickreply_editor_subject_before
 ===
 * Locations:
     + styles/prosilver/template/quickreply_editor.html
-    + styles/subsilver2/template/quickreply_editor.html
 * Since: 3.1.7-RC1
 * Purpose: Add content before the quick reply subject textbox
 
@@ -1701,7 +1644,6 @@ search_body_form_after
 ===
 * Locations:
     + styles/prosilver/template/search_body.html
-    + styles/subsilver2/template/search_body.html
 * Since: 3.1.7-RC1
 * Purpose: Add content after the search form
 
@@ -1709,7 +1651,6 @@ search_body_form_before
 ===
 * Locations:
     + styles/prosilver/template/search_body.html
-    + styles/subsilver2/template/search_body.html
 * Since: 3.1.5-RC1
 * Purpose: Add content before the search form
 
@@ -1717,7 +1658,6 @@ search_body_recent_search_after
 ===
 * Locations:
     + styles/prosilver/template/search_body.html
-    + styles/subsilver2/template/search_body.html
 * Since: 3.1.7-RC1
 * Purpose: Add content after the recent search queries list
 
@@ -1725,7 +1665,6 @@ search_body_recent_search_before
 ===
 * Locations:
     + styles/prosilver/template/search_body.html
-    + styles/subsilver2/template/search_body.html
 * Since: 3.1.7-RC1
 * Purpose: Add content before the recent search queries list
 
@@ -1733,7 +1672,6 @@ search_body_search_display_options_append
 ===
 * Locations:
     + styles/prosilver/template/search_body.html
-    + styles/subsilver2/template/search_body.html
 * Since: 3.1.7-RC1
 * Purpose: Put content at the bottom of the search query display options fields set
 
@@ -1741,7 +1679,6 @@ search_body_search_display_options_prepend
 ===
 * Locations:
     + styles/prosilver/template/search_body.html
-    + styles/subsilver2/template/search_body.html
 * Since: 3.1.7-RC1
 * Purpose: Put content at the top of the search query display options fields set
 
@@ -1749,7 +1686,6 @@ search_body_search_options_after
 ===
 * Locations:
     + styles/prosilver/template/search_body.html
-    + styles/subsilver2/template/search_body.html
 * Since: 3.1.7-RC1
 * Purpose: Add content after the search query options fields set
 
@@ -1757,7 +1693,6 @@ search_body_search_options_append
 ===
 * Locations:
     + styles/prosilver/template/search_body.html
-    + styles/subsilver2/template/search_body.html
 * Since: 3.1.7-RC1
 * Purpose: Put content at the bottom of the search query options fields set
 
@@ -1765,7 +1700,6 @@ search_body_search_options_before
 ===
 * Locations:
     + styles/prosilver/template/search_body.html
-    + styles/subsilver2/template/search_body.html
 * Since: 3.1.7-RC1
 * Purpose: Add content before the search query options fields set
 
@@ -1773,7 +1707,6 @@ search_body_search_options_prepend
 ===
 * Locations:
     + styles/prosilver/template/search_body.html
-    + styles/subsilver2/template/search_body.html
 * Since: 3.1.7-RC1
 * Purpose: Put content at the top of the search query options fields set
 
@@ -1781,7 +1714,6 @@ search_body_search_query_after
 ===
 * Locations:
     + styles/prosilver/template/search_body.html
-    + styles/subsilver2/template/search_body.html
 * Since: 3.1.7-RC1
 * Purpose: Add content after the search query fields set
 
@@ -1789,7 +1721,6 @@ search_body_search_query_append
 ===
 * Locations:
     + styles/prosilver/template/search_body.html
-    + styles/subsilver2/template/search_body.html
 * Since: 3.1.7-RC1
 * Purpose: Put content at the bottom of the search query fields set
 
@@ -1797,7 +1728,6 @@ search_body_search_query_before
 ===
 * Locations:
     + styles/prosilver/template/search_body.html
-    + styles/subsilver2/template/search_body.html
 * Since: 3.1.7-RC1
 * Purpose: Add content before the search query fields set
 
@@ -1805,7 +1735,6 @@ search_body_search_query_prepend
 ===
 * Locations:
     + styles/prosilver/template/search_body.html
-    + styles/subsilver2/template/search_body.html
 * Since: 3.1.7-RC1
 * Purpose: Put content at the top of the search query fields set
 
@@ -1813,7 +1742,6 @@ search_results_header_after
 ===
 * Locations:
     + styles/prosilver/template/search_results.html
-    + styles/subsilver2/template/search_results.html
 * Since: 3.1.4-RC1
 * Purpose: Add content after the header of the search results
 
@@ -1821,7 +1749,6 @@ search_results_header_before
 ===
 * Locations:
     + styles/prosilver/template/search_results.html
-    + styles/subsilver2/template/search_results.html
 * Since: 3.1.4-RC1
 * Purpose: Add content before the header of the search results.
 
@@ -1829,7 +1756,6 @@ search_results_post_after
 ===
 * Locations:
     + styles/prosilver/template/search_results.html
-    + styles/subsilver2/template/search_results.html
 * Since: 3.1.0-b3
 * Purpose: Add data after search result posts
 
@@ -1837,7 +1763,6 @@ search_results_post_before
 ===
 * Locations:
     + styles/prosilver/template/search_results.html
-    + styles/subsilver2/template/search_results.html
 * Since: 3.1.0-b3
 * Purpose: Add data before search result posts
 
@@ -1859,7 +1784,6 @@ search_results_searchbox_after
 ===
 * Locations:
     + styles/prosilver/template/search_results.html
-    + styles/subsilver2/template/search_results.html
 * Since: 3.1.4-RC1
 * Purpose: Add content right after the searchbox of the search results.
 
@@ -1867,7 +1791,6 @@ search_results_topic_after
 ===
 * Locations:
     + styles/prosilver/template/search_results.html
-    + styles/subsilver2/template/search_results.html
 * Since: 3.1.0-b4
 * Purpose: Add data after search result topics
 
@@ -1875,7 +1798,6 @@ search_results_topic_before
 ===
 * Locations:
     + styles/prosilver/template/search_results.html
-    + styles/subsilver2/template/search_results.html
 * Since: 3.1.0-b4
 * Purpose: Add data before search result topics
 
@@ -1883,7 +1805,6 @@ simple_footer_after
 ===
 * Locations:
     + styles/prosilver/template/simple_footer.html
-    + styles/subsilver2/template/simple_footer.html
 * Since: 3.1.0-a1
 * Purpose: Add content directly prior to the `</body>` tag of the simple footer
 
@@ -1891,7 +1812,6 @@ simple_header_body_before
 ===
 * Locations:
     + styles/prosilver/template/simple_header.html
-    + styles/subsilver2/template/simple_header.html
 * Since: 3.1.0-b2
 * Purpose: Add content to the header body
 
@@ -1899,7 +1819,6 @@ simple_header_head_append
 ===
 * Locations:
     + styles/prosilver/template/simple_header.html
-    + styles/subsilver2/template/simple_header.html
 * Since: 3.1.0-b4
 * Purpose: Add asset calls directly before the `</head>` tag
 
@@ -1907,7 +1826,6 @@ simple_header_stylesheets_after
 ===
 * Locations:
     + styles/prosilver/template/simple_header.html
-    + styles/subsilver2/template/simple_header.html
 * Since: 3.1.0-RC3
 * Purpose: Add asset calls after stylesheets within the `</head>` tag.
 Note that INCLUDECSS will not work with this event.
@@ -1918,9 +1836,6 @@ topiclist_row_prepend
     + styles/prosilver/template/search_results.html
     + styles/prosilver/template/viewforum_body.html
     + styles/prosilver/template/mcp_forum.html
-    + styles/subsilver2/template/search_results.html
-    + styles/subsilver2/template/viewforum_body.html
-    + styles/subsilver2/template/mcp_forum.html
 * Since: 3.1.0-a1
 * Changed: 3.1.6-RC1 Added event to mcp_forum.html
 * Purpose: Add content into topic rows (inside the elements containing topic titles)
@@ -1931,9 +1846,6 @@ topiclist_row_append
     + styles/prosilver/template/search_results.html
     + styles/prosilver/template/viewforum_body.html
     + styles/prosilver/template/mcp_forum.html
-    + styles/subsilver2/template/search_results.html
-    + styles/subsilver2/template/viewforum_body.html
-    + styles/subsilver2/template/mcp_forum.html
 * Since: 3.1.0-a1
 * Changed: 3.1.6-RC1 Added event to mcp_forum.html
 * Purpose: Add content into topic rows (inside the elements containing topic titles)
@@ -1944,9 +1856,6 @@ topiclist_row_topic_title_after
     + styles/prosilver/template/search_results.html
     + styles/prosilver/template/viewforum_body.html
     + styles/prosilver/template/mcp_forum.html
-    + styles/subsilver2/template/search_results.html
-    + styles/subsilver2/template/viewforum_body.html
-    + styles/subsilver2/template/mcp_forum.html
 * Since: 3.1.10-RC1
 * Purpose: Add content into topic rows (after the elements containing the topic titles)
 
@@ -1954,7 +1863,6 @@ ucp_agreement_terms_after
 ===
 * Locations:
     + styles/prosilver/template/ucp_agreement.html
-    + styles/subsilver2/template/ucp_agreement.html
 * Since: 3.1.0-b3
 * Purpose: Add content after the terms of agreement text at user registration
 
@@ -1962,7 +1870,6 @@ ucp_agreement_terms_before
 ===
 * Locations:
     + styles/prosilver/template/ucp_agreement.html
-    + styles/subsilver2/template/ucp_agreement.html
 * Since: 3.1.0-b3
 * Purpose: Add content before the terms of agreement text at user registration
 
@@ -1970,23 +1877,34 @@ ucp_main_front_user_activity_after
 ===
 * Locations:
     + styles/prosilver/template/ucp_main_front.html
-    + styles/subsilver2/template/ucp_main_front.html
 * Since: 3.1.6-RC1
 * Purpose: Add content right after the user activity info viewing UCP front page
 
+ucp_main_front_user_activity_append
+===
+* Locations:
+    + styles/prosilver/template/ucp_main_front.html
+* Since: 3.1.11-RC1
+* Purpose: Add content after last user activity info viewing UCP front page
+
 ucp_main_front_user_activity_before
 ===
 * Locations:
     + styles/prosilver/template/ucp_main_front.html
-    + styles/subsilver2/template/ucp_main_front.html
 * Since: 3.1.6-RC1
 * Purpose: Add content right before the user activity info viewing UCP front page
 
+ucp_main_front_user_activity_prepend
+===
+* Locations:
+    + styles/prosilver/template/ucp_main_front.html
+* Since: 3.1.11-RC1
+* Purpose: Add content before first user activity info viewing UCP front page
+
 ucp_pm_history_post_buttons_after
 ===
 * Locations:
     + styles/prosilver/template/ucp_pm_history.html
-    + styles/subsilver2/template/ucp_pm_history.html
 * Since: 3.1.6-RC1
 * Purpose: Add post button to private messages in history review (next to quote etc), at
 the end of the list.
@@ -1995,7 +1913,6 @@ ucp_pm_history_post_buttons_before
 ===
 * Locations:
     + styles/prosilver/template/ucp_pm_history.html
-    + styles/subsilver2/template/ucp_pm_history.html
 * Since: 3.1.6-RC1
 * Purpose: Add post button to private messages in history review (next to quote etc), at
 the start of the list.
@@ -2020,7 +1937,6 @@ ucp_pm_history_review_after
 ===
 * Locations:
     + styles/prosilver/template/ucp_pm_history.html
-    + styles/subsilver2/template/ucp_pm_history.html
 * Since: 3.1.6-RC1
 * Purpose: Add content after the private messages history review.
 
@@ -2028,7 +1944,6 @@ ucp_pm_history_review_before
 ===
 * Locations:
     + styles/prosilver/template/ucp_pm_history.html
-    + styles/subsilver2/template/ucp_pm_history.html
 * Since: 3.1.6-RC1
 * Purpose: Add content before the private messages history review.
 
@@ -2078,11 +1993,17 @@ ucp_pm_viewmessage_custom_fields_before
 * Purpose: Add data before the custom fields on the user profile when viewing
 a private message
 
+ucp_pm_viewmessage_options_before
+===
+* Locations:
+    + styles/prosilver/template/ucp_pm_viewmessage.html
+* Since: 3.1.11-RC1
+* Purpose: Add content right before display options
+
 ucp_pm_viewmessage_post_buttons_after
 ===
 * Locations:
     + styles/prosilver/template/ucp_pm_viewmessage.html
-    + styles/subsilver2/template/ucp_pm_viewmessage.html
 * Since: 3.1.0-RC3
 * Purpose: Add post button to private messages (next to edit, quote etc), at
 the end of the list.
@@ -2091,7 +2012,6 @@ ucp_pm_viewmessage_post_buttons_before
 ===
 * Locations:
     + styles/prosilver/template/ucp_pm_viewmessage.html
-    + styles/subsilver2/template/ucp_pm_viewmessage.html
 * Since: 3.1.0-RC3
 * Purpose: Add post button to private messages (next to edit, quote etc), at
 the start of the list.
@@ -2116,7 +2036,6 @@ ucp_pm_viewmessage_print_head_append
 ===
 * Locations:
     + styles/prosilver/template/ucp_pm_viewmessage_print.html
-    + styles/subsilver2/template/ucp_pm_viewmessage_print.html
 * Since: 3.1.0-a1
 * Purpose: Add asset calls directly before the `</head>` tag of the Print PM screen
 
@@ -2140,7 +2059,6 @@ ucp_prefs_personal_prepend
 ===
 * Locations:
     + styles/prosilver/template/ucp_prefs_personal.html
-    + styles/subsilver2/template/ucp_prefs_personal.html
 * Since: 3.1.0-a1
 * Purpose: Add user options to the top of the Edit Global Settings block
 
@@ -2148,7 +2066,6 @@ ucp_prefs_personal_append
 ===
 * Locations:
     + styles/prosilver/template/ucp_prefs_personal.html
-    + styles/subsilver2/template/ucp_prefs_personal.html
 * Since: 3.1.0-a1
 * Purpose: Add user options to the bottom of the Edit Global Settings block
 
@@ -2156,7 +2073,6 @@ ucp_prefs_post_prepend
 ===
 * Locations:
     + styles/prosilver/template/ucp_prefs_post.html
-    + styles/subsilver2/template/ucp_prefs_post.html
 * Since: 3.1.0-a1
 * Purpose: Add user options to the top of the Edit Posting Defaults block
 
@@ -2164,7 +2080,6 @@ ucp_prefs_post_append
 ===
 * Locations:
     + styles/prosilver/template/ucp_prefs_post.html
-    + styles/subsilver2/template/ucp_prefs_post.html
 * Since: 3.1.0-a1
 * Purpose: Add user options to the bottom of the Edit Posting Defaults block
 
@@ -2172,7 +2087,6 @@ ucp_prefs_view_radio_buttons_prepend
 ===
 * Locations:
     + styles/prosilver/template/ucp_prefs_view.html
-    + styles/subsilver2/template/ucp_prefs_view.html
 * Since: 3.1.0-a1
 * Purpose: Add options to the top of the radio buttons block of the Edit
 Display Options screen
@@ -2181,7 +2095,6 @@ ucp_prefs_view_radio_buttons_append
 ===
 * Locations:
     + styles/prosilver/template/ucp_prefs_view.html
-    + styles/subsilver2/template/ucp_prefs_view.html
 * Since: 3.1.0-a1
 * Purpose: Add options to the bottom of the radio buttons block of the Edit
 Display Options screen
@@ -2190,7 +2103,6 @@ ucp_prefs_view_select_menu_prepend
 ===
 * Locations:
     + styles/prosilver/template/ucp_prefs_view.html
-    + styles/subsilver2/template/ucp_prefs_view.html
 * Since: 3.1.0-a1
 * Purpose: Add options to the top of the drop-down lists block of the Edit
 Display Options screen
@@ -2199,7 +2111,6 @@ ucp_prefs_view_select_menu_append
 ===
 * Locations:
     + styles/prosilver/template/ucp_prefs_view.html
-    + styles/subsilver2/template/ucp_prefs_view.html
 * Since: 3.1.0-a1
 * Purpose: Add options to the bottom of the drop-down lists block of the Edit
 Display Options screen
@@ -2208,7 +2119,6 @@ ucp_profile_profile_info_before
 ===
 * Locations:
     + styles/prosilver/template/ucp_profile_profile_info.html
-    + styles/subsilver2/template/ucp_profile_profile_info.html
 * Since: 3.1.4-RC1
 * Purpose: Add options in profile page fieldset - before jabber field.
 
@@ -2216,7 +2126,6 @@ ucp_profile_profile_info_after
 ===
 * Locations:
     + styles/prosilver/template/ucp_profile_profile_info.html
-    + styles/subsilver2/template/ucp_profile_profile_info.html
 * Since: 3.1.4-RC1
 * Purpose: Add options in profile page fieldset - after custom profile fields.
 
@@ -2224,7 +2133,6 @@ ucp_profile_register_details_before
 ===
 * Locations:
     + styles/prosilver/template/ucp_profile_reg_details.html
-    + styles/subsilver2/template/ucp_profile_reg_details.html
 * Since: 3.1.4-RC1
 * Purpose: Add options in profile page fieldset - before first field.
 
@@ -2232,15 +2140,20 @@ ucp_profile_register_details_after
 ===
 * Locations:
     + styles/prosilver/template/ucp_profile_reg_details.html
-    + styles/subsilver2/template/ucp_profile_reg_details.html
 * Since: 3.1.4-RC1
 * Purpose: Add options in profile page fieldset - after confirm password field.
 
+ucp_register_buttons_before
+===
+* Locations:
+    + styles/prosilver/template/ucp_register.html
+* Since: 3.1.11-RC1
+* Purpose: Add content before buttons in registration form.
+
 ucp_register_credentials_before
 ===
 * Locations:
     + styles/prosilver/template/ucp_register.html
-    + styles/subsilver2/template/ucp_register.html
 * Since: 3.1.0-b5
 * Purpose: Add options in registration page fieldset - before first field.
 
@@ -2248,7 +2161,6 @@ ucp_register_profile_fields_after
 ===
 * Locations:
     + styles/prosilver/template/ucp_register.html
-    + styles/subsilver2/template/ucp_register.html
 * Since: 3.1.0-b5
 * Purpose: Add options in registration page fieldset - after last field.
 
@@ -2256,7 +2168,6 @@ ucp_register_credentials_after
 ===
 * Locations:
     + styles/prosilver/template/ucp_register.html
-    + styles/subsilver2/template/ucp_register.html
 * Since: 3.1.0-b5
 * Purpose: Add options in registration page fieldset - after password field.
 
@@ -2264,7 +2175,6 @@ ucp_register_options_before
 ===
 * Locations:
     + styles/prosilver/template/ucp_register.html
-    + styles/subsilver2/template/ucp_register.html
 * Since: 3.1.0-b5
 * Purpose: Add options in registration page fieldset - before language selector.
 
@@ -2272,7 +2182,6 @@ ucp_register_profile_fields_before
 ===
 * Locations:
     + styles/prosilver/template/ucp_register.html
-    + styles/subsilver2/template/ucp_register.html
 * Since: 3.1.0-b5
 * Purpose: Add options in registration page fieldset - before profile fields.
 
@@ -2280,7 +2189,6 @@ ucp_friend_list_before
 ===
 * Locations:
     + styles/prosilver/template/ucp_zebra_friends.html
-    + styles/subsilver2/template/ucp_zebra_friends.html
 * Since: 3.1.0-a4
 * Purpose: Add optional elements before list of friends in UCP
 
@@ -2288,7 +2196,6 @@ ucp_friend_list_after
 ===
 * Locations:
     + styles/prosilver/template/ucp_zebra_friends.html
-    + styles/subsilver2/template/ucp_zebra_friends.html
 * Since: 3.1.0-a4
 * Purpose: Add optional elements after list of friends in UCP
 
@@ -2296,7 +2203,6 @@ viewforum_body_topic_row_after
 ===
 * Locations:
     + styles/prosilver/template/viewforum_body.html
-    + styles/subsilver2/template/viewforum_body.html
 * Since: 3.1.7-RC1
 * Purpose: Add content after the topic list item.
 
@@ -2304,7 +2210,6 @@ viewforum_body_topic_row_append
 ===
 * Locations:
     + styles/prosilver/template/viewforum_body.html
-    + styles/subsilver2/template/viewforum_body.html
 * Since: 3.1.7-RC1
 * Purpose: Add content at the start of the topic list item.
 
@@ -2312,7 +2217,6 @@ viewforum_body_topic_row_before
 ===
 * Locations:
     + styles/prosilver/template/viewforum_body.html
-    + styles/subsilver2/template/viewforum_body.html
 * Since: 3.1.7-RC1
 * Purpose: Add content before the topic list item.
 
@@ -2320,7 +2224,6 @@ viewforum_body_topic_row_prepend
 ===
 * Locations:
     + styles/prosilver/template/viewforum_body.html
-    + styles/subsilver2/template/viewforum_body.html
 * Since: 3.1.7-RC1
 * Purpose: Add content at the end of the topic list item.
 
@@ -2328,7 +2231,6 @@ viewforum_body_topicrow_row_before
 ===
 * Locations:
     + styles/prosilver/template/viewforum_body.html
-    + styles/subsilver2/template/viewforum_body.html
 * Since: 3.1.10-RC1
 * Purpose: Add content before list of topics.
 
@@ -2336,7 +2238,6 @@ viewforum_buttons_bottom_before
 ===
 * Locations:
     + styles/prosilver/template/viewforum_body.html
-    + styles/subsilver2/template/viewforum_body.html
 * Since: 3.1.0-RC5
 * Purpose: Add buttons before New Topic button on the bottom of the topic's list
 
@@ -2344,7 +2245,6 @@ viewforum_buttons_bottom_after
 ===
 * Locations:
     + styles/prosilver/template/viewforum_body.html
-    + styles/subsilver2/template/viewforum_body.html
 * Since: 3.1.0-RC5
 * Purpose: Add buttons after New Topic button on the bottom of the topic's list
 
@@ -2352,7 +2252,6 @@ viewforum_buttons_top_before
 ===
 * Locations:
     + styles/prosilver/template/viewforum_body.html
-    + styles/subsilver2/template/viewforum_body.html
 * Since: 3.1.0-RC5
 * Purpose: Add buttons before New Topic button on the top of the topic's list
 
@@ -2360,7 +2259,6 @@ viewforum_buttons_top_after
 ===
 * Locations:
     + styles/prosilver/template/viewforum_body.html
-    + styles/subsilver2/template/viewforum_body.html
 * Since: 3.1.0-RC5
 * Purpose: Add buttons after New Topic button on the top of the topic's list
 
@@ -2368,7 +2266,6 @@ viewtopic_buttons_bottom_before
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-RC5
 * Purpose: Add buttons before Post Reply button on the bottom of the posts's list
 
@@ -2376,7 +2273,6 @@ viewtopic_buttons_bottom_after
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-RC5
 * Purpose: Add buttons after Post Reply button on the bottom of the posts's list
 
@@ -2384,7 +2280,6 @@ viewtopic_buttons_top_before
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-RC5
 * Purpose: Add buttons before Post Reply button on the top of the posts's list
 
@@ -2392,7 +2287,6 @@ viewtopic_buttons_top_after
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-RC5
 * Purpose: Add buttons after Post Reply button on the top of the posts's list
 
@@ -2414,7 +2308,6 @@ viewforum_forum_name_append
 ===
 * Locations:
     + styles/prosilver/template/viewforum_body.html
-    + styles/subsilver2/template/viewforum_body.html
 * Since: 3.1.0-b3
 * Purpose: Add content directly after the forum name link on the View forum screen
 
@@ -2422,7 +2315,6 @@ viewforum_forum_name_prepend
 ===
 * Locations:
     + styles/prosilver/template/viewforum_body.html
-    + styles/subsilver2/template/viewforum_body.html
 * Since: 3.1.0-b3
 * Purpose: Add content directly before the forum name link on the View forum screen
 
@@ -2430,7 +2322,6 @@ viewforum_forum_title_after
 ===
 * Locations:
     + styles/prosilver/template/viewforum_body.html
-    + styles/subsilver2/template/viewforum_body.html
 * Since: 3.1.5-RC1
 * Purpose: Add content directly after the forum title on the View forum screen
 
@@ -2438,7 +2329,6 @@ viewforum_forum_title_before
 ===
 * Locations:
     + styles/prosilver/template/viewforum_body.html
-    + styles/subsilver2/template/viewforum_body.html
 * Since: 3.1.5-RC1
 * Purpose: Add content directly before the forum title on the View forum screen
 
@@ -2446,7 +2336,6 @@ viewtopic_print_head_append
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_print.html
-    + styles/subsilver2/template/viewtopic_print.html
 * Since: 3.1.0-a1
 * Purpose: Add asset calls directly before the `</head>` tag of the Print Topic screen
 
@@ -2454,7 +2343,6 @@ viewtopic_body_pagination_top_after
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.4-RC1
 * Purpose: Add content after the pagination at top
 
@@ -2462,7 +2350,6 @@ viewtopic_body_avatar_after
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-RC3
 * Purpose: Add content right after the avatar when viewing topics
 
@@ -2470,7 +2357,6 @@ viewtopic_body_avatar_before
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-RC3
 * Purpose: Add content right before the avatar when viewing topics
 
@@ -2494,17 +2380,14 @@ viewtopic_body_footer_before
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-a1
 * Purpose: Add content to the bottom of the View topic screen below the posts
-and quick reply, directly before the jumpbox in Prosilver, breadcrumbs in
-Subsilver2.
+and quick reply, directly before the jumpbox in Prosilver.
 
 viewtopic_body_poll_after
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.6-RC1
 * Purpose: Add content after the poll panel.
 
@@ -2512,7 +2395,6 @@ viewtopic_body_poll_before
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.6-RC1
 * Purpose: Add content before the poll panel.
 
@@ -2520,7 +2402,6 @@ viewtopic_body_poll_option_after
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-b3
 * Purpose: Add content after the poll option
 the list.
@@ -2529,7 +2410,6 @@ viewtopic_body_poll_option_before
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-b3
 * Purpose: Add content before the poll option
 the list.
@@ -2538,7 +2418,6 @@ viewtopic_body_poll_question_append
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-b3
 * Purpose: Add content directly after the poll question on the View topic screen
 
@@ -2546,7 +2425,6 @@ viewtopic_body_poll_question_prepend
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-b3
 * Purpose: Add content directly before the poll question on the View topic screen
 
@@ -2554,7 +2432,6 @@ viewtopic_body_post_author_after
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.3-RC1
 * Purpose: Add content directly after the post author on the view topic screen
 
@@ -2562,7 +2439,6 @@ viewtopic_body_post_author_before
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.3-RC1
 * Purpose: Add content directly before the post author on the view topic screen
 
@@ -2570,7 +2446,6 @@ viewtopic_body_post_buttons_after
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-a1
 * Purpose: Add post button to posts (next to edit, quote etc), at the end of
 the list.
@@ -2579,7 +2454,6 @@ viewtopic_body_post_buttons_before
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-a1
 * Purpose: Add post button to posts (next to edit, quote etc), at the start of
 the list.
@@ -2604,7 +2478,6 @@ viewtopic_body_post_subject_before
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.7-RC1
 * Purpose: Add data before post icon and subject
 
@@ -2612,7 +2485,6 @@ viewtopic_body_postrow_back2top_after
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.8-RC1
 * Purpose: Add content to the post's bottom after the back to top link 
 
@@ -2620,7 +2492,6 @@ viewtopic_body_postrow_back2top_append
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.8-RC1
 * Purpose: Add content to the post's bottom directly after the back to top link 
 
@@ -2628,7 +2499,6 @@ viewtopic_body_postrow_back2top_before
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.8-RC1
 * Purpose: Add content to the post's bottom before the back to top link 
 
@@ -2636,7 +2506,6 @@ viewtopic_body_postrow_back2top_prepend
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.8-RC1
 * Purpose: Add content to the post's bottom directly before the back to top link 
 
@@ -2644,7 +2513,6 @@ viewtopic_body_postrow_custom_fields_after
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-a1
 * Purpose: Add data after the custom fields on the user profile when viewing
 a post
@@ -2653,7 +2521,6 @@ viewtopic_body_postrow_custom_fields_before
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-a1
 * Purpose: Add data before the custom fields on the user profile when viewing
 a post
@@ -2662,7 +2529,6 @@ viewtopic_body_postrow_post_after
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-a4
 * Purpose: Add data after posts
 
@@ -2670,7 +2536,6 @@ viewtopic_body_postrow_post_before
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-a4
 * Purpose: Add data before posts
 
@@ -2678,7 +2543,6 @@ viewtopic_body_postrow_post_content_footer
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-RC4
 * Purpose: Add data at the end of the posts.
 
@@ -2686,7 +2550,6 @@ viewtopic_body_postrow_post_details_after
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.4-RC1
 * Purpose: Add content after the post details
 
@@ -2694,7 +2557,6 @@ viewtopic_body_postrow_post_details_before
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.4-RC1
 * Purpose: Add content before the post details
 
@@ -2702,7 +2564,6 @@ viewtopic_body_postrow_post_notices_after
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-b2
 * Purpose: Add posts specific custom notices at the notices bottom.
 
@@ -2710,7 +2571,6 @@ viewtopic_body_postrow_post_notices_before
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-b2
 * Purpose: Add posts specific custom notices at the notices top.
 
@@ -2718,7 +2578,6 @@ viewtopic_body_postrow_rank_after
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.6-RC1
 * Purpose: Add data after the rank on the user profile when viewing
 a post
@@ -2727,7 +2586,6 @@ viewtopic_body_postrow_rank_before
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.6-RC1
 * Purpose: Add data before the rank on the user profile when viewing
 a post
@@ -2736,7 +2594,6 @@ viewtopic_body_topic_actions_before
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-a4
 * Purpose: Add data before the topic actions buttons (after the posts sorting options)
 
@@ -2744,7 +2601,6 @@ viewtopic_topic_title_after
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.7-RC1
 * Purpose: Add content directly after the topic title link on the View topic screen (outside of the h2 HTML tag)
 
@@ -2752,7 +2608,6 @@ viewtopic_topic_title_append
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-b3
 * Purpose: Add content directly after the topic title link on the View topic screen
 
@@ -2760,7 +2615,6 @@ viewtopic_topic_title_prepend
 ===
 * Locations:
     + styles/prosilver/template/viewtopic_body.html
-    + styles/subsilver2/template/viewtopic_body.html
 * Since: 3.1.0-a1
 * Purpose: Add content directly before the topic title link on the View topic screen
 
--- /dev/null
+++ b/docs/install-config.sample.yml
@@ -0,0 +1,38 @@
+installer:
+    admin:
+        name: admin
+        password: adminadmin
+        email: admin@example.org
+
+    board:
+        lang: en
+        name: My Board
+        description: My amazing new phpBB board
+
+    database:
+        dbms: sqlite3
+        dbhost: /tmp/phpbb.sqlite3
+        dbport: ~
+        dbuser: ~
+        dbpasswd: ~
+        dbname: ~
+        table_prefix: phpbb_
+
+    email:
+        enabled: false
+        smtp_delivery : ~
+        smtp_host: ~
+        smtp_port: ~
+        smtp_auth: ~
+        smtp_user: ~
+        smtp_pass: ~
+
+    server:
+        cookie_secure: false
+        server_protocol: http://
+        force_server_vars: false
+        server_name: localhost
+        server_port: 80
+        script_path: /
+
+    extensions: ['phpbb/viglink']
--- a/docs/nginx.sample.conf
+++ b/docs/nginx.sample.conf
@@ -62,7 +62,7 @@ http {
         root /path/to/phpbb;
 
         location / {
-            # phpbb uses index.htm
+            # phpBB uses index.htm
             index index.php index.html index.htm;
             try_files $uri $uri/ @rewriteapp;
         }
@@ -92,6 +92,29 @@ http {
             fastcgi_pass php;
         }
 
+        # Correctly pass scripts for installer
+        location /install/ {
+            # phpBB uses index.htm
+            try_files $uri $uri/ @rewrite_installapp;
+
+            # Pass the php scripts to fastcgi server specified in upstream declaration.
+            location ~ \.php(/|$) {
+                # Unmodified fastcgi_params from nginx distribution.
+                include fastcgi_params;
+                # Necessary for php.
+                fastcgi_split_path_info ^(.+\.php)(/.*)$;
+                fastcgi_param PATH_INFO $fastcgi_path_info;
+                fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
+                fastcgi_param DOCUMENT_ROOT $realpath_root;
+                try_files $uri $uri/ /install/app.php$is_args$args;
+                fastcgi_pass php;
+            }
+        }
+
+        location @rewrite_installapp {
+            rewrite ^(.*)$ /install/app.php/$1 last;
+        }
+
         # Deny access to version control system directories.
         location ~ /\.svn|/\.git {
             deny all;
--- /dev/null
+++ b/docs/update-config.sample.yml
@@ -0,0 +1,3 @@
+updater:
+    type: all
+    extensions: ['phpbb/viglink']
--- /dev/null
+++ b/docs/vagrant.md
@@ -0,0 +1,123 @@
+## Using Vagrant with phpBB
+
+phpBB includes support for Vagrant. This allows developers and contributors to run phpBB without the need to set up their own local web server with traditional WAMP/MAMP stacks. It also provides a consistent environment between developers for writing and debugging code changes more productively.
+
+phpBB uses the [Laravel/Homestead](https://laravel.com/docs/5.1/homestead) Vagrant box. It runs a Linux server with Ubuntu 14.04, PHP 5.6, Nginx, SQLite3, MySQL, and a whole lot more (complete specs below).
+
+## Get Started
+
+* Download and Install [Vagrant](https://www.vagrantup.com/downloads.html)
+* Download and Install [VirtualBox](https://www.virtualbox.org/wiki/Downloads)
+* Run `vagrant up` from the root of your cloned fork of the phpBB Git repository
+
+```sh
+$ vagrant up
+```
+
+* Access phpBB at `http://192.168.10.10/`
+* Username: **admin**
+* Password: **adminadmin**
+
+## Additional commands:
+* Access your Linux server from the command line:
+
+```sh
+$ vagrant ssh
+```
+
+* Pause your server:
+
+```sh
+$ vagrant suspend
+```
+
+* Shut down your server:
+
+```sh
+$ vagrant halt
+```
+
+* Delete and remove your server:
+
+```sh
+$ vagrant destroy
+```
+
+> Note: destroying the vagrant server will remove all traces of the VM from your computer, reclaiming any disk space used by it. However, it also means the next time you vagrant up, you will be creating a brand new VM with a fresh install of phpBB and a new database.
+
+## Customising the phpBB configuration
+
+By default, phpBB is pre-configured to install with a MySQL database. You can, however, switch to PostegreSQL or SQLite3 by editing the `phpbb-install-config.yml` file in the vagrant directory. The next time you run `vagrant up` (or `vagrant provision`) it will be installed under the new configuration.
+
+If you prefer to access phpBB from the more friendly URL `http://phpbb.app` then you must update your computer's hosts file. This file is typically located at `/etc/hosts` for Mac/Linux or `C:\Windows\System32\drivers\etc\hosts` for Windows. Open this file and add the following line to it, at the very bottom, and save.
+
+```
+192.168.10.10  phpbb.app
+```
+
+## How it all works
+
+When you vagrant up, the Laravel/Homestead box is transparently loaded as a Virtual Machine on your computer (this may take several minutes the very first time while it downloads the VM image to your computer). Your local phpBB repository clone is mirrored/shared with the VM, so you can work on the phpBB code on your computer, and see the changes immediately when you browse to phpBB at the URL provided by the VM.
+
+This is very similar to traditional methods of working with a local WAMP/MAMP stack, except the webserver is now being provided by a VM of a Linux server. The advantages here are the exact same Linux server environment is being used by everybody who uses Vagrant with phpBB, so there will be consist behaviour unlike when everybody is developing on different versions of PHP, server configurations, etc.
+
+The environment is also "sandboxed" from your system. This means you don't need to worry about adjusting your own computer's internal PHP settings, setting up databases, or doing damage to your system or to phpBB. Other than the phpBB codebase, which lives on your computer, all execution is taking place within the VM and you can at any time, halt or destroy the VM and start a brand new one.
+
+There are some caveats, however. You can only run one vagrant VM for the phpBB repository. And of course, the database will be destroyed when you vagrant destroy. If the database is important, you should SSH into your vagrant VM and export/import the DB as needed using SSH commands.
+
+For example, to export/import a MySQL database (using phpBB's `store` directory):
+
+SSH into the VM
+
+```sh
+$ vagrant ssh
+```
+
+Export MySQL:
+
+```sh
+$ mysqldump -uhomestead -psecret phpbb > /home/vagrant/phpbb/phpBB/store/phpbb.sql
+```
+
+Import MySQL:
+
+```sh
+$ mysql -uhomestead -psecret phpbb < /home/vagrant/phpbb/phpBB/store/phpbb.sql
+```
+
+---
+
+## About the Laravel/Homestead box
+
+### Included Software
+
+* Ubuntu 14.04
+* Git
+* PHP 5.6
+* HHVM
+* Nginx
+* MySQL
+* Sqlite3
+* Postgres
+* Composer
+* Node (With PM2, Bower, Grunt, and Gulp)
+* Redis
+* Memcached
+* Beanstalkd
+* Blackfire Profiler
+
+### MySQL Access
+
+- Hostname: 127.0.0.1
+- Username: homestead
+- Password: secret
+- Database: phpbb
+- Port: 3306
+
+### PostgreSQL Access
+
+- Hostname: 127.0.0.1
+- Username: homestead
+- Password: secret
+- Database: phpbb
+- Port: 5432
--- a/download/file.php
+++ b/download/file.php
@@ -42,6 +42,11 @@ if (isset($_GET['avatar']))
 	$phpbb_config_php_file = new \phpbb\config_php_file($phpbb_root_path, $phpEx);
 	extract($phpbb_config_php_file->get_all());
 
+	if (!defined('PHPBB_ENVIRONMENT'))
+	{
+		@define('PHPBB_ENVIRONMENT', 'production');
+	}
+
 	if (!defined('PHPBB_INSTALLED') || empty($dbms) || empty($acm_type))
 	{
 		exit;
@@ -56,40 +61,45 @@ if (isset($_GET['avatar']))
 	$phpbb_class_loader_ext = new \phpbb\class_loader('\\', "{$phpbb_root_path}ext/", $phpEx);
 	$phpbb_class_loader_ext->register();
 
-	phpbb_load_extensions_autoloaders($phpbb_root_path);
-
 	// Set up container
-	$phpbb_container_builder = new \phpbb\di\container_builder($phpbb_config_php_file, $phpbb_root_path, $phpEx);
-	$phpbb_container = $phpbb_container_builder->get_container();
+	$phpbb_container_builder = new \phpbb\di\container_builder($phpbb_root_path, $phpEx);
+	$phpbb_container = $phpbb_container_builder->with_config($phpbb_config_php_file)->get_container();
 
 	$phpbb_class_loader->set_cache($phpbb_container->get('cache.driver'));
 	$phpbb_class_loader_ext->set_cache($phpbb_container->get('cache.driver'));
 
 	// set up caching
+	/* @var $cache \phpbb\cache\service */
 	$cache = $phpbb_container->get('cache');
 
+	/* @var $phpbb_dispatcher \phpbb\event\dispatcher */
 	$phpbb_dispatcher = $phpbb_container->get('dispatcher');
+
+	/* @var $request \phpbb\request\request_interface */
 	$request	= $phpbb_container->get('request');
+
+	/* @var $db \phpbb\db\driver\driver_interface */
 	$db			= $phpbb_container->get('dbal.conn');
+
+	/* @var $phpbb_log \phpbb\log\log_interface */
 	$phpbb_log	= $phpbb_container->get('log');
 
 	unset($dbpasswd);
 
-	request_var('', 0, false, false, $request);
-
+	/* @var $config \phpbb\config\config */
 	$config = $phpbb_container->get('config');
-	set_config(null, null, null, $config);
-	set_config_count(null, null, null, $config);
 
 	// load extensions
+	/* @var $phpbb_extension_manager \phpbb\extension\manager */
 	$phpbb_extension_manager = $phpbb_container->get('ext.manager');
 
 	// worst-case default
 	$browser = strtolower($request->header('User-Agent', 'msie 6.0'));
 
+	/* @var $phpbb_avatar_manager \phpbb\avatar\manager */
 	$phpbb_avatar_manager = $phpbb_container->get('avatar.manager');
 
-	$filename = request_var('avatar', '');
+	$filename = $request->variable('avatar', '');
 	$avatar_group = false;
 	$exit = false;
 
@@ -140,9 +150,9 @@ if (isset($_GET['avatar']))
 include($phpbb_root_path . 'common.' . $phpEx);
 require($phpbb_root_path . 'includes/functions_download' . '.' . $phpEx);
 
-$attach_id = request_var('id', 0);
-$mode = request_var('mode', '');
-$thumbnail = request_var('t', false);
+$attach_id = $request->variable('id', 0);
+$mode = $request->variable('mode', '');
+$thumbnail = $request->variable('t', false);
 
 // Start session management, do not update session page.
 $user->session_begin(false);
--- /dev/null
+++ b/ext/phpbb/viglink/.gitignore
@@ -0,0 +1,2 @@
+/build/
+/vendor/
--- /dev/null
+++ b/ext/phpbb/viglink/acp/viglink_helper.php
@@ -0,0 +1,137 @@
+<?php
+/**
+ *
+ * VigLink extension for the phpBB Forum Software package.
+ *
+ * @copyright (c) 2014 phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ */
+
+namespace phpbb\viglink\acp;
+
+/**
+ * Class to handle allowing or disallowing VigLink services
+ */
+class viglink_helper
+{
+	/** @var \phpbb\language\language $language */
+	protected $language;
+
+	/** @var \phpbb\log\log $log */
+	protected $log;
+
+	/** @var \phpbb\user $user */
+	protected $user;
+
+	/** @var bool Use SSL or not */
+	protected $use_ssl = false;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\cache\service     $cache
+	 * @param \phpbb\config\config     $config
+	 * @param \phpbb\file_downloader   $file_downloader
+	 * @param \phpbb\language\language $language
+	 * @param \phpbb\log\log           $log
+	 * @param \phpbb\user              $user
+	 */
+	public function __construct(\phpbb\cache\service $cache, \phpbb\config\config $config, \phpbb\file_downloader $file_downloader, \phpbb\language\language $language, \phpbb\log\log $log, \phpbb\user $user)
+	{
+		$this->cache = $cache;
+		$this->config = $config;
+		$this->file_downloader = $file_downloader;
+		$this->language = $language;
+		$this->log = $log;
+		$this->user = $user;
+	}
+
+	/**
+	 * Obtains the latest VigLink services information from phpBB
+	 *
+	 * @param bool $force_update Ignores cached data. Defaults to false.
+	 * @param bool $force_cache  Force the use of the cache. Override $force_update.
+	 *
+	 * @throws \RuntimeException
+	 *
+	 * @return void
+	 */
+	public function set_viglink_services($force_update = false, $force_cache = false)
+	{
+		$cache_key = '_versioncheck_viglink_' . $this->use_ssl;
+
+		$info = $this->cache->get($cache_key);
+
+		if ($info === false && $force_cache)
+		{
+			throw new \RuntimeException($this->language->lang('VERSIONCHECK_FAIL'));
+		}
+		else if ($info === false || $force_update)
+		{
+			try
+			{
+				$info = $this->file_downloader->get('www.phpbb.com', '/viglink', 'enabled', 443);
+			}
+			catch (\phpbb\exception\runtime_exception $exception)
+			{
+				$prepare_parameters = array_merge(array($exception->getMessage()), $exception->get_parameters());
+				throw new \RuntimeException(call_user_func_array(array($this->language, 'lang'), $prepare_parameters));
+			}
+
+			if ($info === '0')
+			{
+				$this->set_viglink_configs(array(
+					'allow_viglink_phpbb'	=> false,
+				));
+			}
+			else
+			{
+				$info = '1';
+				$this->set_viglink_configs(array(
+					'allow_viglink_phpbb'	=> true,
+				));
+			}
+
+			$this->cache->put($cache_key, $info, 86400); // 24 hours
+		}
+	}
+
+	/**
+	 * Sets VigLink service configs as determined by phpBB
+	 *
+	 * @param array $data Array of VigLink file data.
+	 *
+	 * @return void
+	 */
+	protected function set_viglink_configs($data)
+	{
+		$viglink_configs = array(
+			'allow_viglink_phpbb',
+			'phpbb_viglink_api_key',
+		);
+
+		foreach ($viglink_configs as $cfg_name)
+		{
+			if (array_key_exists($cfg_name, $data) && ($data[$cfg_name] != $this->config[$cfg_name] || !isset($this->config[$cfg_name])))
+			{
+				$this->config->set($cfg_name, $data[$cfg_name]);
+			}
+		}
+
+		$this->config->set('viglink_last_gc', time(), false);
+	}
+
+	/**
+	 * Log a VigLink error message to the error log
+	 *
+	 * @param string $message The error message
+	 */
+	public function log_viglink_error($message)
+	{
+		$user_id = empty($this->user->data) ? ANONYMOUS : $this->user->data['user_id'];
+		$user_ip = empty($this->user->ip) ? '' : $this->user->ip;
+
+		$this->log->add('critical', $user_id, $user_ip, 'LOG_VIGLINK_CHECK_FAIL', false, array($message));
+	}
+}
--- /dev/null
+++ b/ext/phpbb/viglink/acp/viglink_info.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ *
+ * VigLink extension for the phpBB Forum Software package.
+ *
+ * @copyright (c) 2014 phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ */
+
+namespace phpbb\viglink\acp;
+
+/**
+ * VigLink ACP module info
+ */
+class viglink_info
+{
+	public function module()
+	{
+		return array(
+			'filename'	=> '\phpbb\viglink\acp\viglink_module',
+			'title'		=> 'ACP_VIGLINK_SETTINGS',
+			'modes'		=> array(
+				'settings'	=> array(
+					'title' => 'ACP_VIGLINK_SETTINGS',
+					'auth' => 'ext_phpbb/viglink && acl_a_board',
+					'cat' => array('ACP_BOARD_CONFIGURATION')
+				),
+			),
+		);
+	}
+}
--- /dev/null
+++ b/ext/phpbb/viglink/acp/viglink_module.php
@@ -0,0 +1,137 @@
+<?php
+/**
+ *
+ * VigLink extension for the phpBB Forum Software package.
+ *
+ * @copyright (c) 2014 phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ */
+
+namespace phpbb\viglink\acp;
+
+use phpbb\request\type_cast_helper;
+
+/**
+ * VigLink ACP module
+ */
+class viglink_module
+{
+	/** @var string $page_title The page title */
+	public $page_title;
+
+	/** @var string $tpl_name The page template name */
+	public $tpl_name;
+
+	/** @var string $u_action Custom form action */
+	public $u_action;
+
+	public function main($id, $mode)
+	{
+		global $phpbb_container;
+
+		/** @var \phpbb\config\config $config Config object */
+		$config = $phpbb_container->get('config');
+
+		/** @var \phpbb\language\language $language Language object */
+		$language = $phpbb_container->get('language');
+
+		/** @var \phpbb\request\request $request Request object */
+		$request  = $phpbb_container->get('request');
+
+		/** @var \phpbb\template\template $template Template object */
+		$template = $phpbb_container->get('template');
+
+		$language->add_lang('viglink_module_acp', 'phpbb/viglink');
+
+		$this->tpl_name = 'acp_viglink';
+		$this->page_title = $language->lang('ACP_VIGLINK_SETTINGS');
+
+		$submit = $request->is_set_post('submit');
+
+		if ($mode !== 'settings')
+		{
+			return;
+		}
+
+		$form_key = 'acp_viglink';
+		add_form_key($form_key);
+
+		$error = array();
+
+		// Get stored config/default values
+		$cfg_array = array(
+			'viglink_enabled' => isset($config['viglink_enabled']) ? $config['viglink_enabled'] : 0,
+		);
+
+		// Error if the form is invalid
+		if ($submit && !check_form_key($form_key))
+		{
+			$error[] = $language->lang('FORM_INVALID');
+		}
+
+		// Do not process form if invalid
+		if (count($error))
+		{
+			$submit = false;
+		}
+
+		if ($submit)
+		{
+			// Get the VigLink form field values
+			$cfg_array['viglink_enabled'] = $request->variable('viglink_enabled', 0);
+
+			// If no errors, set the config values
+			if (!count($error))
+			{
+				foreach ($cfg_array as $cfg => $value)
+				{
+					$config->set($cfg, $value);
+				}
+
+				trigger_error($language->lang('CONFIG_UPDATED') . adm_back_link($this->u_action));
+			}
+		}
+
+		if (!isset($config['questionnaire_unique_id']))
+		{
+			$config->set('questionnaire_unique_id', unique_id());
+		}
+
+		// Set a general error message if VigLink has been disabled by phpBB
+		if (!$config['allow_viglink_phpbb'])
+		{
+			$error[] = $language->lang('ACP_VIGLINK_DISABLED_PHPBB');
+		}
+
+		// Try to get convert account key from .com
+		$sub_id = md5($config['viglink_api_siteid'] . $config['questionnaire_unique_id']);
+		$convert_account_link = $config->offsetGet('viglink_convert_account_url');
+
+		if (empty($convert_account_link) || strpos($config['viglink_convert_account_url'], 'subId=' . $sub_id) === false)
+		{
+			$convert_account_link = @file_get_contents('https://www.phpbb.com/viglink/convert?domain=' . urlencode($config['server_name']) . '&siteid=' . $config['viglink_api_siteid'] . '&uuid=' . $config['questionnaire_unique_id'] . '&key=' . $config['phpbb_viglink_api_key']);
+			if (!empty($convert_account_link) && strpos($convert_account_link, 'https://www.viglink.com/users/convertAccount') === 0)
+			{
+				$type_caster = new type_cast_helper();
+				$type_caster->set_var($convert_account_link, $convert_account_link, 'string', false, false);
+				$config->set('viglink_convert_account_url', $convert_account_link);
+			}
+			else
+			{
+				$error[] = $language->lang('ACP_VIGLINK_NO_CONVERT_LINK');
+				$convert_account_link = '';
+			}
+		}
+
+		$template->assign_vars(array(
+			'S_ERROR'				=> (bool) count($error),
+			'ERROR_MSG'				=> implode('<br />', $error),
+
+			'VIGLINK_ENABLED'		=> $cfg_array['viglink_enabled'],
+
+			'U_VIGLINK_CONVERT'		=> $convert_account_link,
+			'U_ACTION'				=> $this->u_action,
+		));
+	}
+}
--- /dev/null
+++ b/ext/phpbb/viglink/adm/style/acp_viglink.html
@@ -0,0 +1,48 @@
+<!-- INCLUDE overall_header.html -->
+
+<a id="maincontent"></a>
+
+<h1>{L_ACP_VIGLINK_SETTINGS}</h1>
+
+<p>{L_ACP_VIGLINK_SETTINGS_EXPLAIN}</p>
+
+<!-- IF S_ERROR -->
+<div class="errorbox">
+	<h3>{L_WARNING}</h3>
+	<p>{ERROR_MSG}</p>
+</div>
+<!-- ENDIF -->
+
+<form id="acp_viglink" method="post" action="{U_ACTION}">
+
+	<fieldset>
+		<legend>{L_ACP_VIGLINK_SETTINGS}</legend>
+		<dl>
+			<dt><label for="viglink_enabled">{L_ACP_VIGLINK_ENABLE}{L_COLON}</label><br /><span>{L_ACP_VIGLINK_ENABLE_EXPLAIN}</span></dt>
+			<dd><label><input type="radio" class="radio" id="viglink_enabled" name="viglink_enabled" value="1"<!-- IF VIGLINK_ENABLED --> checked="checked"<!-- ENDIF --> /> {L_ENABLED}</label>
+				<label><input type="radio" class="radio" name="viglink_enabled" value="0"<!-- IF not VIGLINK_ENABLED --> checked="checked"<!-- ENDIF --> /> {L_DISABLED}</label></dd>
+		</dl>
+	</fieldset>
+
+	<h1>{L_ACP_VIGLINK_EARNINGS}</h1>
+
+	<p>{L_ACP_VIGLINK_EARNINGS_EXPLAIN}</p>
+
+	<fieldset>
+		<legend>{L_ACP_VIGLINK_EARNINGS}</legend>
+		<!-- IF U_VIGLINK_CONVERT -->
+		<dl>
+			<dt><label>{L_ACP_VIGLINK_CLAIM}{L_COLON}</label><br /><span>{L_ACP_VIGLINK_CLAIM_EXPLAIN}</span></dt>
+			<dd><a href="{U_VIGLINK_CONVERT}">{L_ACP_VIGLINK_CONVERT_ACCOUNT}</a></dd>
+		</dl>
+		<!-- ENDIF -->
+	</fieldset>
+
+	<fieldset class="submit-buttons">
+		<input class="button1" type="submit" id="submit" name="submit" value="{L_SUBMIT}" />&nbsp;
+		<input class="button2" type="reset" id="reset" name="reset" value="{L_RESET}" />
+		{S_FORM_TOKEN}
+	</fieldset>
+</form>
+
+<!-- INCLUDE overall_footer.html -->
--- /dev/null
+++ b/ext/phpbb/viglink/composer.json
@@ -0,0 +1,27 @@
+{
+	"name": "phpbb/viglink",
+	"type": "phpbb-extension",
+	"description": "VigLink can convert your existing links into links that earn revenue.",
+	"homepage": "https://www.phpbb.com",
+	"version": "1.0.0",
+	"keywords": ["phpbb", "extension", "viglink"],
+	"license": "GPL-2.0",
+	"authors": [
+		{
+			"name": "phpBB Limited",
+			"email": "operations@phpbb.com",
+			"homepage": "https://www.phpbb.com/go/authors"
+		}
+	],
+	"require": {
+		"php": ">=5.4",
+		"phpbb/phpbb": ">=3.2.0-b1",
+		"composer/installers": "~1.0"
+	},
+	"extra": {
+		"display-name": "VigLink",
+		"soft-require": {
+			"phpbb/phpbb": ">=3.2.0-b1,<3.3"
+		}
+	}
+}
--- /dev/null
+++ b/ext/phpbb/viglink/composer.lock
@@ -0,0 +1,115 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "hash": "155838fcd9206482cc645c3de6a7e8db",
+    "content-hash": "610135270d537f2e8580b747c6b57ce9",
+    "packages": [
+        {
+            "name": "composer/installers",
+            "version": "v1.0.20",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/installers.git",
+                "reference": "1bff8aa77a18f3616f468ed8000cf86a5725bac3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/installers/zipball/1bff8aa77a18f3616f468ed8000cf86a5725bac3",
+                "reference": "1bff8aa77a18f3616f468ed8000cf86a5725bac3",
+                "shasum": ""
+            },
+            "replace": {
+                "roundcube/plugin-installer": "*",
+                "shama/baton": "*"
+            },
+            "require-dev": {
+                "composer/composer": "1.0.*@dev",
+                "phpunit/phpunit": "4.1.*"
+            },
+            "type": "composer-installer",
+            "extra": {
+                "class": "Composer\\Installers\\Installer",
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Composer\\Installers\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Kyle Robinson Young",
+                    "email": "kyle@dontkry.com",
+                    "homepage": "https://github.com/shama"
+                }
+            ],
+            "description": "A multi-framework Composer library installer",
+            "homepage": "http://composer.github.com/installers/",
+            "keywords": [
+                "Craft",
+                "Dolibarr",
+                "Hurad",
+                "MODX Evo",
+                "OXID",
+                "SMF",
+                "Thelia",
+                "WolfCMS",
+                "agl",
+                "annotatecms",
+                "bitrix",
+                "cakephp",
+                "chef",
+                "codeigniter",
+                "concrete5",
+                "croogo",
+                "dokuwiki",
+                "drupal",
+                "elgg",
+                "fuelphp",
+                "grav",
+                "installer",
+                "joomla",
+                "kohana",
+                "laravel",
+                "lithium",
+                "magento",
+                "mako",
+                "mediawiki",
+                "modulework",
+                "moodle",
+                "phpbb",
+                "piwik",
+                "ppi",
+                "puppet",
+                "roundcube",
+                "shopware",
+                "silverstripe",
+                "symfony",
+                "typo3",
+                "wordpress",
+                "zend",
+                "zikula"
+            ],
+            "time": "2015-01-11 03:51:11"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">=5.3.3"
+    },
+    "platform-dev": []
+}
--- /dev/null
+++ b/ext/phpbb/viglink/config/cron.yml
@@ -0,0 +1,11 @@
+services:
+# ----- Cron tasks -----
+    phpbb.viglink.cron.task.viglink:
+        class: phpbb\viglink\cron\viglink
+        arguments:
+            - '@config'
+            - '@phpbb.viglink.helper'
+        calls:
+            - [set_name, [cron.task.viglink]]
+        tags:
+            - { name: cron.task }
--- /dev/null
+++ b/ext/phpbb/viglink/config/services.yml
@@ -0,0 +1,35 @@
+imports:
+    - { resource: cron.yml }
+
+services:
+    phpbb.viglink.listener:
+        class: phpbb\viglink\event\listener
+        arguments:
+            - '@config'
+            - '@template'
+        tags:
+            - { name: event.listener }
+
+    phpbb.viglink.acp_listener:
+        class: phpbb\viglink\event\acp_listener
+        arguments:
+            - '@config'
+            - '@language'
+            - '@request'
+            - '@template'
+            - '@user'
+            - '@phpbb.viglink.helper'
+            - '%core.root_path%'
+            - '%core.php_ext%'
+        tags:
+            - { name: event.listener }
+
+    phpbb.viglink.helper:
+        class: phpbb\viglink\acp\viglink_helper
+        arguments:
+            - '@cache'
+            - '@config'
+            - '@file_downloader'
+            - '@language'
+            - '@log'
+            - '@user'
--- /dev/null
+++ b/ext/phpbb/viglink/cron/viglink.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ *
+ * VigLink extension for the phpBB Forum Software package.
+ *
+ * @copyright (c) 2016 phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ */
+
+namespace phpbb\viglink\cron;
+
+/**
+ * Viglink cron task.
+ */
+class viglink extends \phpbb\cron\task\base
+{
+	/** @var \phpbb\config\config $config Config object */
+	protected $config;
+
+	/** @var \phpbb\viglink\acp\viglink_helper $helper Viglink helper object */
+	protected $helper;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\config\config              $config         Config object
+	 * @param \phpbb\viglink\acp\viglink_helper $viglink_helper Viglink helper object
+	 * @access public
+	 */
+	public function __construct(\phpbb\config\config $config, \phpbb\viglink\acp\viglink_helper $viglink_helper)
+	{
+		$this->config = $config;
+		$this->helper = $viglink_helper;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public function run()
+	{
+		try
+		{
+			$this->helper->set_viglink_services(true);
+		}
+		catch (\RuntimeException $e)
+		{
+			$this->helper->log_viglink_error($e->getMessage());
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public function is_runnable()
+	{
+		return (bool) $this->config['viglink_enabled'];
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public function should_run()
+	{
+		return $this->config['viglink_last_gc'] < strtotime('24 hours ago');
+	}
+}
--- /dev/null
+++ b/ext/phpbb/viglink/event/acp_listener.php
@@ -0,0 +1,132 @@
+<?php
+/**
+ *
+ * VigLink extension for the phpBB Forum Software package.
+ *
+ * @copyright (c) 2014 phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ */
+
+namespace phpbb\viglink\event;
+
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * ACP Event listener
+ */
+class acp_listener implements EventSubscriberInterface
+{
+	/** @var \phpbb\config\config $config Config object */
+	protected $config;
+
+	/** @var \phpbb\request\request_interface $request Request interface */
+	protected $request;
+
+	/** @var \phpbb\template\template $template Template object */
+	protected $template;
+
+	/** @var \phpbb\language\language $language Language object */
+	protected $language;
+
+	/** @var \phpbb\user $user User object */
+	protected $user;
+
+	/** @var \phpbb\viglink\acp\viglink_helper $helper VigLink helper object */
+	protected $helper;
+
+	/** @var string $phpbb_root_path phpBB root path */
+	protected $phpbb_root_path;
+
+	/** @var string $php_ext PHP file extension */
+	protected $php_ext;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\config\config $config
+	 * @param \phpbb\language\language $language
+	 * @param \phpbb\request\request_interface $request phpBB request
+	 * @param \phpbb\template\template $template
+	 * @param \phpbb\user $user User object
+	 * @param \phpbb\viglink\acp\viglink_helper $viglink_helper Viglink helper object
+	 * @param string $phpbb_root_path phpBB root path
+	 * @param string $php_ext PHP file extension
+	 */
+	public function __construct(\phpbb\config\config $config, \phpbb\language\language $language, \phpbb\request\request_interface $request,
+								\phpbb\template\template $template, \phpbb\user $user, \phpbb\viglink\acp\viglink_helper $viglink_helper,
+								$phpbb_root_path, $php_ext)
+	{
+		$this->config = $config;
+		$this->language = $language;
+		$this->request = $request;
+		$this->template = $template;
+		$this->user = $user;
+		$this->helper = $viglink_helper;
+		$this->phpbb_root_path = $phpbb_root_path;
+		$this->php_ext = $php_ext;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	static public function getSubscribedEvents()
+	{
+		return array(
+			'core.acp_main_notice'				=> 'set_viglink_services',
+			'core.acp_help_phpbb_submit_before'	=> 'update_viglink_settings',
+		);
+	}
+
+	/**
+	 * Check if phpBB is allowing VigLink services to run.
+	 *
+	 * VigLink will be disabled if phpBB is disallowing it to run.
+	 *
+	 * @return void
+	 */
+	public function set_viglink_services()
+	{
+		try
+		{
+			$this->helper->set_viglink_services();
+		}
+		catch (\RuntimeException $e)
+		{
+			$this->helper->log_viglink_error($e->getMessage());
+		}
+
+		if (empty($this->config['viglink_ask_admin']) && $this->user->data['user_type'] == USER_FOUNDER)
+		{
+			redirect(append_sid($this->phpbb_root_path . 'adm/index.' . $this->php_ext, 'i=acp_help_phpbb&mode=help_phpbb'));
+		}
+	}
+
+	/**
+	 * Update VigLink settings
+	 *
+	 * @param array $event Event data
+	 *
+	 * @return void
+	 */
+	public function update_viglink_settings($event)
+	{
+		$this->language->add_lang('viglink_module_acp', 'phpbb/viglink');
+
+		$viglink_setting = $this->request->variable('enable-viglink', false);
+
+		if (!empty($event['submit']))
+		{
+			$this->config->set('viglink_enabled', $viglink_setting);
+			if (empty($this->config['viglink_ask_admin']))
+			{
+				$this->config->set('viglink_ask_admin', time());
+			}
+		}
+
+		$this->template->assign_vars(array(
+			'S_ENABLE_VIGLINK'				=> !empty($this->config['viglink_enabled']) || !$this->config['help_send_statistics_time'],
+			'ACP_VIGLINK_SETTINGS_CHANGE'	=> $this->language->lang('ACP_VIGLINK_SETTINGS_CHANGE', append_sid($this->phpbb_root_path . 'adm/index.' . $this->php_ext, 'i=-phpbb-viglink-acp-viglink_module&mode=settings')),
+		));
+	}
+}
--- /dev/null
+++ b/ext/phpbb/viglink/event/listener.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ *
+ * VigLink extension for the phpBB Forum Software package.
+ *
+ * @copyright (c) 2014 phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ */
+
+namespace phpbb\viglink\event;
+
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Event listener
+ */
+class listener implements EventSubscriberInterface
+{
+	/** @var \phpbb\config\config $config Config object */
+	protected $config;
+
+	/** @var \phpbb\template\template $template Template object */
+	protected $template;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\config\config     $config   Config object
+	 * @param \phpbb\template\template $template Template object
+	 */
+	public function __construct(\phpbb\config\config $config, \phpbb\template\template $template)
+	{
+		$this->config = $config;
+		$this->template = $template;
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	static public function getSubscribedEvents()
+	{
+		return array(
+			'core.viewtopic_post_row_after'		=> 'display_viglink',
+		);
+	}
+
+	/**
+	 * Insert the VigLink JS code into forum pages
+	 *
+	 * @return void
+	 */
+	public function display_viglink()
+	{
+		$viglink_key = '';
+
+		if ($this->config['allow_viglink_phpbb'] && $this->config['phpbb_viglink_api_key'])
+		{
+			// Use phpBB API key if VigLink is allowed for phpBB
+			$viglink_key = $this->config['phpbb_viglink_api_key'];
+		}
+
+		$this->template->assign_vars(array(
+			'VIGLINK_ENABLED'	=> $this->config['viglink_enabled'] && $viglink_key,
+			'VIGLINK_API_KEY'	=> $viglink_key,
+			'VIGLINK_SUB_ID'	=> md5(urlencode($this->config['viglink_api_siteid']) . $this->config['questionnaire_unique_id']),
+		));
+	}
+}
--- /dev/null
+++ b/ext/phpbb/viglink/ext.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ *
+ * VigLink extension for the phpBB Forum Software package.
+ *
+ * @copyright (c) 2014 phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ */
+
+namespace phpbb\viglink;
+
+/**
+ * Extension class for custom enable/disable/purge actions
+ */
+class ext extends \phpbb\extension\base
+{
+	/**
+	 * Check whether or not the extension can be enabled.
+	 * The current phpBB version should meet or exceed
+	 * the minimum version required by this extension:
+	 *
+	 * Requires phpBB 3.2.0-b1 or greater
+	 *
+	 * @return bool
+	 */
+	public function is_enableable()
+	{
+		return phpbb_version_compare(PHPBB_VERSION, '3.2.0-b1', '>=');
+	}
+
+	/**
+	 * Check phpBB's VigLink switches and set them during install
+	 *
+	 * @param	mixed	$old_state	The return value of the previous call
+	 *								of this method, or false on the first call
+	 *
+	 * @return	mixed				Returns false after last step, otherwise
+	 *								temporary state which is passed as an
+	 *								argument to the next step
+	 */
+	public function enable_step($old_state)
+	{
+		if ($old_state === false)
+		{
+			$viglink_helper = new \phpbb\viglink\acp\viglink_helper(
+				$this->container->get('cache'),
+				$this->container->get('config'),
+				$this->container->get('file_downloader'),
+				$this->container->get('language'),
+				$this->container->get('log'),
+				$this->container->get('user')
+			);
+
+			try
+			{
+				$viglink_helper->set_viglink_services();
+			}
+			catch (\RuntimeException $e)
+			{
+				$viglink_helper->log_viglink_error($e->getMessage());
+			}
+
+			return 'viglink';
+		}
+
+		return parent::enable_step($old_state);
+	}
+}
--- /dev/null
+++ b/ext/phpbb/viglink/language/en/info_acp_viglink.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ *
+ * VigLink extension for the phpBB Forum Software package.
+ *
+ * @copyright (c) 2014 phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ */
+
+/**
+ * DO NOT CHANGE
+ */
+if (!defined('IN_PHPBB'))
+{
+	exit;
+}
+
+if (empty($lang) || !is_array($lang))
+{
+	$lang = array();
+}
+
+// DEVELOPERS PLEASE NOTE
+//
+// All language files should use UTF-8 as their encoding and the files must not contain a BOM.
+//
+// Placeholders can now contain order information, e.g. instead of
+// 'Page %s of %s' you can (and should) write 'Page %1$s of %2$s', this allows
+// translators to re-order the output of data while ensuring it remains correct
+//
+// You do not need this where single placeholders are used, e.g. 'Message %d' is fine
+// equally where a string contains only two placeholders which are used to wrap text
+// in a url you again do not need to specify an order e.g., 'Click %sHERE%s' is fine
+//
+// Some characters you may want to copy&paste:
+// ’ » “ ” …
+//
+
+$lang = array_merge($lang, array(
+	'ACP_VIGLINK_SETTINGS'		=> 'VigLink settings',
+	'LOG_VIGLINK_CHECK_FAIL'	=> '<strong>VigLink settings could not be verified with phpBB.com</strong><br />» %s',
+));
--- /dev/null
+++ b/ext/phpbb/viglink/language/en/viglink_module_acp.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ *
+ * VigLink extension for the phpBB Forum Software package.
+ *
+ * @copyright (c) 2014 phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ */
+
+/**
+ * DO NOT CHANGE
+ */
+if (!defined('IN_PHPBB'))
+{
+	exit;
+}
+
+if (empty($lang) || !is_array($lang))
+{
+	$lang = array();
+}
+
+// DEVELOPERS PLEASE NOTE
+//
+// All language files should use UTF-8 as their encoding and the files must not contain a BOM.
+//
+// Placeholders can now contain order information, e.g. instead of
+// 'Page %s of %s' you can (and should) write 'Page %1$s of %2$s', this allows
+// translators to re-order the output of data while ensuring it remains correct
+//
+// You do not need this where single placeholders are used, e.g. 'Message %d' is fine
+// equally where a string contains only two placeholders which are used to wrap text
+// in a url you again do not need to specify an order e.g., 'Click %sHERE%s' is fine
+//
+// Some characters you may want to copy&paste:
+// ’ » “ ” …
+//
+
+$lang = array_merge($lang, array(
+	'ACP_VIGLINK_SETTINGS'			=> 'VigLink settings',
+	'ACP_VIGLINK_SETTINGS_EXPLAIN'	=> 'VigLink is third-party service that discretely monetises links posted by users of your forum without any change to the user experience. When users click on your outbound links to products or services and buy something, the merchants pay VigLink a commission, of which a share is donated to the phpBB project. By choosing to enable VigLink and donating proceeds to the phpBB project, you are supporting our open source organisation and ensuring our continued financial security.',
+	'ACP_VIGLINK_SETTINGS_CHANGE'	=> 'You can change these settings at any time in the “<a href="%1$s">VigLink settings</a>” panel.',
+	'ACP_VIGLINK_ENABLE'			=> 'Enable VigLink',
+	'ACP_VIGLINK_ENABLE_EXPLAIN'	=> 'Enables use of VigLink services.',
+	'ACP_VIGLINK_EARNINGS'			=> 'Claim your own earnings (optional)',
+	'ACP_VIGLINK_EARNINGS_EXPLAIN'  => 'You can claim your own earnings by signing up for a VigLink Convert account.',
+	'ACP_VIGLINK_DISABLED_PHPBB'	=> 'VigLink services have been disabled by phpBB.',
+	'ACP_VIGLINK_CLAIM'				=> 'Claim your earnings',
+	'ACP_VIGLINK_CLAIM_EXPLAIN'		=> 'You can claim your forum’s earnings from VigLink monetised links, instead of donating the earnings to the phpBB project. To manage your account settings, sign up for a “VigLink Convert” account by clicking on “Convert account”.',
+	'ACP_VIGLINK_CONVERT_ACCOUNT'	=> 'Convert account',
+	'ACP_VIGLINK_NO_CONVERT_LINK'	=> 'VigLink convert account link could not be retrieved.'
+));
--- /dev/null
+++ b/ext/phpbb/viglink/license.txt
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
--- /dev/null
+++ b/ext/phpbb/viglink/migrations/viglink_ask_admin.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ *
+ * VigLink extension for the phpBB Forum Software package.
+ *
+ * @copyright (c) 2014 phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ */
+
+namespace phpbb\viglink\migrations;
+
+/**
+ * Migration to remove VigLink data
+ */
+class viglink_ask_admin extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array('\phpbb\viglink\migrations\viglink_data_v2');
+	}
+
+	public function effectively_installed()
+	{
+		return isset($this->config['viglink_ask_admin']);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('if', array(
+				(!$this->config->offsetExists('viglink_ask_admin')),
+				array('config.add', array('viglink_ask_admin', '')),
+			)),
+		);
+	}
+}
--- /dev/null
+++ b/ext/phpbb/viglink/migrations/viglink_cron.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ *
+ * VigLink extension for the phpBB Forum Software package.
+ *
+ * @copyright (c) 2016 phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ */
+
+namespace phpbb\viglink\migrations;
+
+/**
+ * Migration to install VigLink cron task data
+ */
+class viglink_cron extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array('\phpbb\viglink\migrations\viglink_data');
+	}
+
+	public function effectively_installed()
+	{
+		return isset($this->config['viglink_last_gc']);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.add', array('viglink_last_gc', 0, true)),
+		);
+	}
+}
--- /dev/null
+++ b/ext/phpbb/viglink/migrations/viglink_data.php
@@ -0,0 +1,53 @@
+<?php
+/**
+*
+* VigLink extension for the phpBB Forum Software package.
+*
+* @copyright (c) 2014 phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+*/
+
+namespace phpbb\viglink\migrations;
+
+/**
+ * Migration to install VigLink data
+ */
+class viglink_data extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array('\phpbb\db\migration\data\v31x\v312');
+	}
+
+	public function effectively_installed()
+	{
+		return isset($this->config['phpbb_viglink_api_key']);
+	}
+
+	public function update_data()
+	{
+		return array(
+			// Basic config options
+			array('config.add', array('viglink_enabled', 0)),
+			array('config.add', array('viglink_api_key', '')),
+
+			// Special config options for phpBB use
+			array('config.add', array('allow_viglink_phpbb', 1)),
+			array('config.add', array('allow_viglink_global', 1)),
+			array('config.add', array('phpbb_viglink_api_key', 'e4fd14f5d7f2bb6d80b8f8da1354718c')),
+			array('config.add', array('viglink_convert_account_url', '')),
+			array('config.add', array('viglink_api_siteid', md5($this->config['server_name']))),
+
+			// Add the ACP module to Board Configuration
+			array('module.add', array(
+				'acp',
+				'ACP_BOARD_CONFIGURATION',
+				array(
+					'module_basename'	=> '\phpbb\viglink\acp\viglink_module',
+					'modes'				=> array('settings'),
+				),
+			)),
+		);
+	}
+}
--- /dev/null
+++ b/ext/phpbb/viglink/migrations/viglink_data_v2.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ *
+ * VigLink extension for the phpBB Forum Software package.
+ *
+ * @copyright (c) 2014 phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ */
+
+namespace phpbb\viglink\migrations;
+
+/**
+ * Migration to remove VigLink data
+ */
+class viglink_data_v2 extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array('\phpbb\viglink\migrations\viglink_data');
+	}
+
+	public function effectively_installed()
+	{
+		return !isset($this->config['viglink_api_key']);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.remove', array('viglink_api_key')),
+			array('config.remove', array('allow_viglink_global')),
+		);
+	}
+}
--- /dev/null
+++ b/ext/phpbb/viglink/styles/all/template/event/acp_help_phpbb_stats_after.html
@@ -0,0 +1,13 @@
+<div class="send-stats-tile">
+    <h2 class="viglink-header-h2"><span class="viglink-header"></span></h2>
+    <p>{L_ACP_VIGLINK_SETTINGS_EXPLAIN}<br /><br />{ACP_VIGLINK_SETTINGS_CHANGE}</p>
+    <dl class="send-stats-settings">
+        <dt>
+            <input name="enable-viglink" id="enable-viglink" type="checkbox" <!-- IF S_ENABLE_VIGLINK == 1 -->checked="checked"<!-- ENDIF -->/>
+            <label for="enable-viglink"></label>
+        </dt>
+        <dd>{L_ENABLE}</dd>
+    </dl>
+</div>
+
+<!-- INCLUDECSS @phpbb_viglink/viglink.css -->
--- /dev/null
+++ b/ext/phpbb/viglink/styles/all/template/event/overall_footer_after.html
@@ -0,0 +1,14 @@
+<!-- IF VIGLINK_ENABLED -->
+<script type="text/javascript">
+	var vglnk = {
+		key: '{VIGLINK_API_KEY}',
+		sub_id: '{VIGLINK_SUB_ID}'
+	};
+
+	(function(d, t) {
+		var s = d.createElement(t); s.type = 'text/javascript'; s.async = true;
+		s.src = '//cdn.viglink.com/api/vglnk.js';
+		var r = d.getElementsByTagName(t)[0]; r.parentNode.insertBefore(s, r);
+	}(document, 'script'));
+</script>
+<!-- ENDIF -->
--- /dev/null
+++ b/ext/phpbb/viglink/styles/all/theme/images/VigLink_logo.png
@@ -0,0 +1,12 @@
+PNG
+
+   
IHDR      $   M   bKGD      	pHYs        tIMEUw  
+IDATx{p?7@`(D@-0}lmZj;+jѱ#EZ4CmZZBNEOT.	!ɽ?Y9.nn sΞ|s֠t9>0KRfoxr
MZn8n>;f=3e1t;e@ ]A[`<ٴ\fOj(vfy\ʇr\`klsgL#u^bq2KY5-ڑ!Ժ` έI
49{fqN|4Jà>_?2WGht꟭7i lVd74;dlK#Xg֓SUz(p.R=);`u! 5Z̓k2u7nȺO:kZ*c]d}&5&e@"҅ t]a!m-SD(hUMZtmγX4ǌKTUհy30>ۜĥ_NXHXRIHp!d)V!jcWJTy	ĀHl 4x
+%h
+4]J Lh P_WGggg膦7m?90hM
+|C]aW2`V. 3U$pƫMRꡨoT3gKZES`v#Lg&K}]---uttP_WG[[YiRsjP/%/	P	ۿ日 GGKМд+	C<jKccij`^iVWP9t;&'mWפѷf-y.t|{J
xT=ԶMРμ}Ր25pk:]S_iSׅ`uMh`bޝNXmEfj}%aa 0UK%KJg1R:ۀMOPZ7iMּbGVK:a*A) %SΙ0sw(T;Jٮ25鳁(r# NXTפg+\ 6a NUɧa+=]KZ/U\1#r!ÀsmUU6)tW(/j΍ڻ_(;,<)2/PQ30poX¾yϕnҺ۱nҺ҈u2U.xmH'B?j. }*WT_U[`V 
+aϓձ# VF~.p$}#dawl&-ip4T,BgaCʔ=)t%3ouAY`* O	a:zX[_0)-y0kt,{6*Gh`7iWifH1YNX#;8!Bغ^Yy
+0BKޥYyjQwWNZ)*K$ZrDoєymujuݤ5ڈ[m:߮:ETϥtt	YU{LKj*t(B!;&ecmiKxsNeky-o\!	J-NJb%"6]7i
MuM9tѳhI:>ݿҳNy).WO:
0^V+Pv2707}F<UKs嚪zG Gtª	IAjG)D-M_Q{>;yʶ \j_|f\ܤ5.`5̶n]Tפ"Q+r_ DUޖIdOqV_R:nQئɋD'7!<lksv:a-Ρ+3Z߸-@zFߓx}R :QQe6K#~7n:`|)m=2QҌruzR^Z}EʤtO,/ON7i?y{f Cb̀؉XNXkJ{el~{UQV&ܾR:/T`*X!bmY%DIB؍*BHE8b!ayU 7*]o(Ęw+g}	ڸ
+]gmQ6܎'om Q
588*fZԯ	ȕmsKWt -uu#ATі<Z!.#F< <&.oNzuۚ!/;dX&_63vUZ f~Tϫyt+xWVWW*%UG*ҁW4jƼƤؤkj=Nז`q&H/sؠbNN'=E~gQ:h爅evZ)Q]=yP݁OϹIk-jdGtН>tRiǤte?3 `0⩅:MoLj Q/FǢb#` %Ptݤ;:Z{vM~>NXR]>Pv!q)GjވRʐ
+i`шՃoO'>Wr
+0tO,iTWpYmRfgzșNXՁpe<F6/GL?hm}}et*eTmS&wfDfan97KM^%M%    IENDB`
\ No newline at end of file
--- /dev/null
+++ b/ext/phpbb/viglink/styles/all/theme/viglink.css
@@ -0,0 +1,18 @@
+/*  phpBB VigLink Extension Style Sheet
+	------------------------------------------------------------------------
+	Copyright (c) phpBB Limited <https://www.phpbb.com>
+
+	For full copyright and license information, please see
+	the docs/CREDITS.txt file.
+	------------------------------------------------------------------------
+*/
+
+.viglink-header {
+	background: url('images/VigLink_logo.png') no-repeat 0 0;
+	padding-left: 142px;
+	padding-bottom: 18px;
+}
+
+.send-stats-tile > h2.viglink-header-h2 {
+	margin-bottom: 10px;
+}
--- a/faq.php
+++ b/faq.php
@@ -24,90 +24,13 @@ $user->session_begin();
 $auth->acl($user->data);
 $user->setup();
 
-$mode = request_var('mode', '');
-
-// Load the appropriate faq file
-switch ($mode)
-{
-	case 'bbcode':
-		$l_title = $user->lang['BBCODE_GUIDE'];
-		$user->add_lang('bbcode', false, true);
-	break;
-
-	default:
-		$page_title = $user->lang['FAQ_EXPLAIN'];
-		$ext_name = $lang_file = '';
-
-		/**
-		 * You can use this event display a custom help page
-		 *
-		 * @event core.faq_mode_validation
-		 * @var	string	page_title		Title of the page
-		 * @var	string	mode			FAQ that is going to be displayed
-		 * @var	string	lang_file		Language file containing the help data
-		 * @var	string	ext_name		Vendor and extension name where the help
-		 *								language file can be loaded from
-		 * @since 3.1.4-RC1
-		 */
-		$vars = array(
-			'page_title',
-			'mode',
-			'lang_file',
-			'ext_name',
-		);
-		extract($phpbb_dispatcher->trigger_event('core.faq_mode_validation', compact($vars)));
-
-		$l_title = $page_title;
-		$user->add_lang(($lang_file) ? $lang_file : 'faq', false, true, $ext_name);
-	break;
-}
-
-// Pull the array data from the lang pack
-$switch_column = $found_switch = false;
-$help_blocks = array();
-foreach ($user->help as $help_ary)
-{
-	if ($help_ary[0] == '--')
-	{
-		if ($help_ary[1] == '--')
-		{
-			$switch_column = true;
-			$found_switch = true;
-			continue;
-		}
-
-		$template->assign_block_vars('faq_block', array(
-			'BLOCK_TITLE'		=> $help_ary[1],
-			'SWITCH_COLUMN'		=> $switch_column,
-		));
-
-		if ($switch_column)
-		{
-			$switch_column = false;
-		}
-		continue;
-	}
-
-	$template->assign_block_vars('faq_block.faq_row', array(
-		'FAQ_QUESTION'		=> $help_ary[0],
-		'FAQ_ANSWER'		=> $help_ary[1])
-	);
-}
-
-// Lets build a page ...
-$template->assign_vars(array(
-	'L_FAQ_TITLE'				=> $l_title,
-	'L_BACK_TO_TOP'				=> $user->lang['BACK_TO_TOP'],
-
-	'SWITCH_COLUMN_MANUALLY'	=> (!$found_switch) ? true : false,
-	'S_IN_FAQ'					=> true,
-));
-
-page_header($l_title);
-
-$template->set_filenames(array(
-	'body' => 'faq_body.html')
+/** @var \phpbb\controller\helper $controller_helper */
+$controller_helper = $phpbb_container->get('controller.helper');
+
+$response = new \Symfony\Component\HttpFoundation\RedirectResponse(
+	$controller_helper->route(
+		$request->variable('mode', 'faq') === 'bbcode' ? 'phpbb_help_bbcode_controller' : 'phpbb_help_faq_controller'
+	),
+	301
 );
-make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"));
-
-page_footer();
+$response->send();
--- a/feed.php
+++ b/feed.php
@@ -16,6 +16,9 @@
 *
 **/
 
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\Routing\Exception\InvalidParameterException;
+
 /**
 * @ignore
 **/
@@ -23,234 +26,33 @@ define('IN_PHPBB', true);
 $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
 $phpEx = substr(strrchr(__FILE__, '.'), 1);
 include($phpbb_root_path . 'common.' . $phpEx);
-include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
-
-if (!$config['feed_enable'])
-{
-	trigger_error('NO_FEED_ENABLED');
-}
-
-// Start session
-$user->session_begin();
-
-if (!empty($config['feed_http_auth']) && request_var('auth', '') == 'http')
-{
-	phpbb_http_login(array(
-		'auth_message'	=> 'Feed',
-		'viewonline'	=> request_var('viewonline', true),
-	));
-}
-
-$auth->acl($user->data);
-$user->setup('viewtopic');
 
-// Initial var setup
-$forum_id	= request_var('f', 0);
-$topic_id	= request_var('t', 0);
-$mode		= request_var('mode', '');
+/** @var \phpbb\controller\helper $controller_helper */
+$controller_helper = $phpbb_container->get('controller.helper');
 
-// We do not use a template, therefore we simply define the global template variables here
-$global_vars = $item_vars = array();
-$feed_updated_time = 0;
+$forum_id	= $request->variable('f', 0);
+$topic_id	= $request->variable('t', 0);
+$mode	= $request->variable('mode', '');
 
-// Generate params array for use in append_sid() to correctly link back to this page
-$params = false;
-if ($forum_id || $topic_id || $mode)
+if ($forum_id !== 0)
 {
-	$params = array(
-		'f'		=> ($forum_id) ? $forum_id : NULL,
-		't'		=> ($topic_id) ? $topic_id : NULL,
-		'mode'	=> ($mode) ? $mode : NULL,
-	);
+	$url = $controller_helper->route('phpbb_feed_forum', array('forum_id' => $forum_id));
 }
-
-// This boards URL
-$phpbb_feed_helper = $phpbb_container->get('feed.helper');
-$board_url = $phpbb_feed_helper->get_board_url();
-
-// Get correct feed object
-$phpbb_feed_factory = $phpbb_container->get('feed.factory');
-$feed = $phpbb_feed_factory->get_feed($mode, $forum_id, $topic_id);
-
-// No feed found
-if ($feed === false)
+else if ($topic_id !== 0)
 {
-	trigger_error('NO_FEED');
+	$url = $controller_helper->route('phpbb_feed_topic', array('topic_id' => $topic_id));
 }
-
-// Open Feed
-$feed->open();
-
-// Iterate through items
-while ($row = $feed->get_item())
+else
 {
-	/**
-	* Event to modify the feed row
-	*
-	* @event core.feed_modify_feed_row
-	* @var	int		forum_id	Forum ID
-	* @var	string	mode		Feeds mode (forums|topics|topics_new|topics_active|news)
-	* @var	array	row			Array with feed data
-	* @var	int		topic_id	Topic ID
-	*
-	* @since 3.1.10-RC1
-	*/
-	$vars = array('forum_id', 'mode', 'row', 'topic_id');
-	extract($phpbb_dispatcher->trigger_event('core.feed_modify_feed_row', compact($vars)));
-
-	// BBCode options to correctly disable urls, smilies, bbcode...
-	if ($feed->get('options') === NULL)
+	try
 	{
-		// Allow all combinations
-		$options = 7;
-
-		if ($feed->get('enable_bbcode') !== NULL && $feed->get('enable_smilies') !== NULL && $feed->get('enable_magic_url') !== NULL)
-		{
-			$options = (($row[$feed->get('enable_bbcode')]) ? OPTION_FLAG_BBCODE : 0) + (($row[$feed->get('enable_smilies')]) ? OPTION_FLAG_SMILIES : 0) + (($row[$feed->get('enable_magic_url')]) ? OPTION_FLAG_LINKS : 0);
-		}
+		$url = $controller_helper->route('phpbb_feed_overall', array('mode' => $mode));
 	}
-	else
+	catch (InvalidParameterException $e)
 	{
-		$options = $row[$feed->get('options')];
+		$url = $controller_helper->route('phpbb_feed_index');
 	}
-
-	$title = (isset($row[$feed->get('title')]) && $row[$feed->get('title')] !== '') ? $row[$feed->get('title')] : ((isset($row[$feed->get('title2')])) ? $row[$feed->get('title2')] : '');
-
-	$published = ($feed->get('published') !== NULL) ? (int) $row[$feed->get('published')] : 0;
-	$updated = ($feed->get('updated') !== NULL) ? (int) $row[$feed->get('updated')] : 0;
-
-	$display_attachments = ($auth->acl_get('u_download') && $auth->acl_get('f_download', $row['forum_id']) && isset($row['post_attachment']) && $row['post_attachment']) ? true : false;
-
-	$item_row = array(
-		'author'		=> ($feed->get('creator') !== NULL) ? $row[$feed->get('creator')] : '',
-		'published'		=> ($published > 0) ? $phpbb_feed_helper->format_date($published) : '',
-		'updated'		=> ($updated > 0) ? $phpbb_feed_helper->format_date($updated) : '',
-		'link'			=> '',
-		'title'			=> censor_text($title),
-		'category'		=> ($config['feed_item_statistics'] && !empty($row['forum_id'])) ? $board_url . '/viewforum.' . $phpEx . '?f=' . $row['forum_id'] : '',
-		'category_name'	=> ($config['feed_item_statistics'] && isset($row['forum_name'])) ? $row['forum_name'] : '',
-		'description'	=> censor_text($phpbb_feed_helper->generate_content($row[$feed->get('text')], $row[$feed->get('bbcode_uid')], $row[$feed->get('bitfield')], $options, $row['forum_id'], ($display_attachments ? $feed->get_attachments($row['post_id']) : array()))),
-		'statistics'	=> '',
-	);
-
-	// Adjust items, fill link, etc.
-	$feed->adjust_item($item_row, $row);
-
-	$item_vars[] = $item_row;
-
-	$feed_updated_time = max($feed_updated_time, $published, $updated);
 }
 
-// If we do not have any items at all, sending the current time is better than sending no time.
-if (!$feed_updated_time)
-{
-	$feed_updated_time = time();
-}
-
-// Some default assignments
-// FEED_IMAGE is not used (atom)
-$global_vars = array_merge($global_vars, array(
-	'FEED_IMAGE'			=> '',
-	'SELF_LINK'				=> $phpbb_feed_helper->append_sid('feed.' . $phpEx, $params),
-	'FEED_LINK'				=> $board_url . '/index.' . $phpEx,
-	'FEED_TITLE'			=> $config['sitename'],
-	'FEED_SUBTITLE'			=> $config['site_desc'],
-	'FEED_UPDATED'			=> $phpbb_feed_helper->format_date($feed_updated_time),
-	'FEED_LANG'				=> $user->lang['USER_LANG'],
-	'FEED_AUTHOR'			=> $config['sitename'],
-));
-
-$feed->close();
-
-// Output page
-
-// gzip_compression
-if ($config['gzip_compress'])
-{
-	if (@extension_loaded('zlib') && !headers_sent())
-	{
-		ob_start('ob_gzhandler');
-	}
-}
-
-// IF debug extra is enabled and admin want to "explain" the page we need to set other headers...
-if (defined('DEBUG') && request_var('explain', 0) && $auth->acl_get('a_'))
-{
-	header('Content-type: text/html; charset=UTF-8');
-	header('Cache-Control: private, no-cache="set-cookie"');
-	header('Expires: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT');
-
-	$mtime = explode(' ', microtime());
-	$totaltime = $mtime[0] + $mtime[1] - $starttime;
-
-	if (method_exists($db, 'sql_report'))
-	{
-		$db->sql_report('display');
-	}
-
-	garbage_collection();
-	exit_handler();
-}
-
-header("Content-Type: application/atom+xml; charset=UTF-8");
-header("Last-Modified: " . gmdate('D, d M Y H:i:s', $feed_updated_time) . ' GMT');
-
-if (!empty($user->data['is_bot']))
-{
-	// Let reverse proxies know we detected a bot.
-	header('X-PHPBB-IS-BOT: yes');
-}
-
-echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
-echo '<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="' . $global_vars['FEED_LANG'] . '">' . "\n";
-echo '<link rel="self" type="application/atom+xml" href="' . $global_vars['SELF_LINK'] . '" />' . "\n\n";
-
-echo (!empty($global_vars['FEED_TITLE'])) ? '<title>' . $global_vars['FEED_TITLE'] . '</title>' . "\n" : '';
-echo (!empty($global_vars['FEED_SUBTITLE'])) ? '<subtitle>' . $global_vars['FEED_SUBTITLE'] . '</subtitle>' . "\n" : '';
-echo (!empty($global_vars['FEED_LINK'])) ? '<link href="' . $global_vars['FEED_LINK'] .'" />' . "\n" : '';
-echo '<updated>' . $global_vars['FEED_UPDATED'] . '</updated>' . "\n\n";
-
-echo '<author><name><![CDATA[' . $global_vars['FEED_AUTHOR'] . ']]></name></author>' . "\n";
-echo '<id>' . $global_vars['SELF_LINK'] . '</id>' . "\n";
-
-foreach ($item_vars as $row)
-{
-	echo '<entry>' . "\n";
-
-	if (!empty($row['author']))
-	{
-		echo '<author><name><![CDATA[' . $row['author'] . ']]></name></author>' . "\n";
-	}
-
-	echo '<updated>' . ((!empty($row['updated'])) ? $row['updated'] : $row['published']) . '</updated>' . "\n";
-
-	if (!empty($row['published']))
-	{
-		echo '<published>' . $row['published'] . '</published>' . "\n";
-	}
-
-	echo '<id>' . $row['link'] . '</id>' . "\n";
-	echo '<link href="' . $row['link'] . '"/>' . "\n";
-	echo '<title type="html"><![CDATA[' . $row['title'] . ']]></title>' . "\n\n";
-
-	if (!empty($row['category']) && isset($row['category_name']) && $row['category_name'] !== '')
-	{
-		echo '<category term="' . $row['category_name'] . '" scheme="' . $row['category'] . '" label="' . $row['category_name'] . '"/>' . "\n";
-	}
-
-	echo '<content type="html" xml:base="' . $row['link'] . '"><![CDATA[' . "\n";
-	echo $row['description'];
-
-	if (!empty($row['statistics']))
-	{
-		echo '<p>' . $user->lang['STATISTICS'] . ': ' . $row['statistics'] . '</p>';
-	}
-
-	echo '<hr />' . "\n" . ']]></content>' . "\n";
-	echo '</entry>' . "\n";
-}
-
-echo '</feed>';
-
-garbage_collection();
-exit_handler();
+$response = new RedirectResponse($url, 301);
+$response->send();
--- a/includes/acp/acp_attachments.php
+++ b/includes/acp/acp_attachments.php
@@ -36,14 +36,20 @@ class acp_attachments
 	/** @var \phpbb\user */
 	protected $user;
 
+	/** @var  \phpbb\filesystem\filesystem_interface */
+	protected $filesystem;
+
+	/** @var \phpbb\attachment\manager */
+	protected $attachment_manager;
+
 	public $id;
 	public $u_action;
 	protected $new_config;
 
 	function main($id, $mode)
 	{
-		global $db, $user, $auth, $template, $cache, $phpbb_container;
-		global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx;
+		global $db, $user, $auth, $template, $cache, $phpbb_container, $phpbb_filesystem, $phpbb_dispatcher;
+		global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx, $phpbb_log, $request;
 
 		$this->id = $id;
 		$this->db = $db;
@@ -51,12 +57,14 @@ class acp_attachments
 		$this->template = $template;
 		$this->user = $user;
 		$this->phpbb_container = $phpbb_container;
+		$this->filesystem = $phpbb_filesystem;
+		$this->attachment_manager = $phpbb_container->get('attachment.manager');
 
 		$user->add_lang(array('posting', 'viewtopic', 'acp/attachments'));
 
 		$error = $notify = array();
 		$submit = (isset($_POST['submit'])) ? true : false;
-		$action = request_var('action', '');
+		$action = $request->variable('action', '');
 
 		$form_key = 'acp_attach';
 		add_form_key($form_key);
@@ -162,8 +170,20 @@ class acp_attachments
 					)
 				);
 
+				/**
+				* Event to add and/or modify acp_attachement configurations
+				*
+				* @event core.acp_attachments_config_edit_add
+				* @var	array	display_vars	Array of config values to display and process
+				* @var	string	mode			Mode of the config page we are displaying
+				* @var	boolean	submit			Do we display the form or process the submission
+				* @since 3.1.11-RC1
+				*/
+				$vars = array('display_vars', 'mode', 'submit');
+				extract($phpbb_dispatcher->trigger_event('core.acp_attachments_config_edit_add', compact($vars)));
+
 				$this->new_config = $config;
-				$cfg_array = (isset($_REQUEST['config'])) ? request_var('config', array('' => '')) : $this->new_config;
+				$cfg_array = (isset($_REQUEST['config'])) ? $request->variable('config', array('' => '')) : $this->new_config;
 				$error = array();
 
 				// We validate the complete config if whished
@@ -187,13 +207,13 @@ class acp_attachments
 
 					if (in_array($config_name, array('attachment_quota', 'max_filesize', 'max_filesize_pm')))
 					{
-						$size_var = request_var($config_name, '');
+						$size_var = $request->variable($config_name, '');
 						$this->new_config[$config_name] = $config_value = ($size_var == 'kb') ? round($config_value * 1024) : (($size_var == 'mb') ? round($config_value * 1048576) : $config_value);
 					}
 
 					if ($submit)
 					{
-						set_config($config_name, $config_value);
+						$config->set($config_name, $config_value);
 					}
 				}
 
@@ -201,7 +221,7 @@ class acp_attachments
 
 				if ($submit)
 				{
-					add_log('admin', 'LOG_CONFIG_ATTACH');
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_ATTACH');
 
 					// Check Settings
 					$this->test_upload($error, $this->new_config['upload_path'], false);
@@ -337,8 +357,8 @@ class acp_attachments
 					if ($submit)
 					{
 						// Change Extensions ?
-						$extension_change_list	= request_var('extension_change_list', array(0));
-						$group_select_list		= request_var('group_select', array(0));
+						$extension_change_list	= $request->variable('extension_change_list', array(0));
+						$group_select_list		= $request->variable('group_select', array(0));
 
 						// Generate correct Change List
 						$extensions = array();
@@ -362,13 +382,13 @@ class acp_attachments
 									WHERE extension_id = ' . $row['extension_id'];
 								$db->sql_query($sql);
 
-								add_log('admin', 'LOG_ATTACH_EXT_UPDATE', $row['extension']);
+								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_EXT_UPDATE', false, array($row['extension']));
 							}
 						}
 						$db->sql_freeresult($result);
 
 						// Delete Extension?
-						$extension_id_list = request_var('extension_id_list', array(0));
+						$extension_id_list = $request->variable('extension_id_list', array(0));
 
 						if (sizeof($extension_id_list))
 						{
@@ -389,13 +409,13 @@ class acp_attachments
 								WHERE ' . $db->sql_in_set('extension_id', $extension_id_list);
 							$db->sql_query($sql);
 
-							add_log('admin', 'LOG_ATTACH_EXT_DEL', $extension_list);
+							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_EXT_DEL', false, array($extension_list));
 						}
 					}
 
 					// Add Extension?
-					$add_extension			= strtolower(request_var('add_extension', ''));
-					$add_extension_group	= request_var('add_group_select', 0);
+					$add_extension			= strtolower($request->variable('add_extension', ''));
+					$add_extension_group	= $request->variable('add_group_select', 0);
 					$add					= (isset($_POST['add_extension_check'])) ? true : false;
 
 					if ($add_extension && $add)
@@ -421,7 +441,8 @@ class acp_attachments
 								);
 
 								$db->sql_query('INSERT INTO ' . EXTENSIONS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
-								add_log('admin', 'LOG_ATTACH_EXT_ADD', $add_extension);
+
+								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_EXT_ADD', false, array($add_extension));
 							}
 						}
 					}
@@ -478,8 +499,8 @@ class acp_attachments
 
 				if ($submit)
 				{
-					$action = request_var('action', '');
-					$group_id = request_var('g', 0);
+					$action = $request->variable('action', '');
+					$group_id = $request->variable('g', 0);
 
 					if ($action != 'add' && $action != 'edit')
 					{
@@ -510,7 +531,7 @@ class acp_attachments
 						$ext_row = array();
 					}
 
-					$group_name = utf8_normalize_nfc(request_var('group_name', '', true));
+					$group_name = $request->variable('group_name', '', true);
 					$new_group_name = ($action == 'add') ? $group_name : (($ext_row['group_name'] != $group_name) ? $group_name : '');
 
 					if (!$group_name)
@@ -540,12 +561,12 @@ class acp_attachments
 					if (!sizeof($error))
 					{
 						// Ok, build the update/insert array
-						$upload_icon	= request_var('upload_icon', 'no_image');
-						$size_select	= request_var('size_select', 'b');
-						$forum_select	= request_var('forum_select', false);
-						$allowed_forums	= request_var('allowed_forums', array(0));
+						$upload_icon	= $request->variable('upload_icon', 'no_image');
+						$size_select	= $request->variable('size_select', 'b');
+						$forum_select	= $request->variable('forum_select', false);
+						$allowed_forums	= $request->variable('allowed_forums', array(0));
 						$allow_in_pm	= (isset($_POST['allow_in_pm'])) ? true : false;
-						$max_filesize	= request_var('max_filesize', 0);
+						$max_filesize	= $request->variable('max_filesize', 0);
 						$max_filesize	= ($size_select == 'kb') ? round($max_filesize * 1024) : (($size_select == 'mb') ? round($max_filesize * 1048576) : $max_filesize);
 						$allow_group	= (isset($_POST['allow_group'])) ? true : false;
 
@@ -561,7 +582,7 @@ class acp_attachments
 
 						$group_ary = array(
 							'group_name'	=> $group_name,
-							'cat_id'		=> request_var('special_category', ATTACHMENT_CATEGORY_NONE),
+							'cat_id'		=> $request->variable('special_category', ATTACHMENT_CATEGORY_NONE),
 							'allow_group'	=> ($allow_group) ? 1 : 0,
 							'upload_icon'	=> ($upload_icon == 'no_image') ? '' : $upload_icon,
 							'max_filesize'	=> $max_filesize,
@@ -586,10 +607,10 @@ class acp_attachments
 						}
 
 						$group_name = (isset($user->lang['EXT_GROUP_' . $group_name])) ? $user->lang['EXT_GROUP_' . $group_name] : $group_name;
-						add_log('admin', 'LOG_ATTACH_EXTGROUP_' . strtoupper($action), $group_name);
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_EXTGROUP_' . strtoupper($action), false, array($group_name));
 					}
 
-					$extension_list = request_var('extensions', array(0));
+					$extension_list = $request->variable('extensions', array(0));
 
 					if ($action == 'edit' && sizeof($extension_list))
 					{
@@ -618,13 +639,10 @@ class acp_attachments
 				$cat_lang = array(
 					ATTACHMENT_CATEGORY_NONE		=> $user->lang['NO_FILE_CAT'],
 					ATTACHMENT_CATEGORY_IMAGE		=> $user->lang['CAT_IMAGES'],
-					ATTACHMENT_CATEGORY_WM			=> $user->lang['CAT_WM_FILES'],
-					ATTACHMENT_CATEGORY_RM			=> $user->lang['CAT_RM_FILES'],
 					ATTACHMENT_CATEGORY_FLASH		=> $user->lang['CAT_FLASH_FILES'],
-					ATTACHMENT_CATEGORY_QUICKTIME	=> $user->lang['CAT_QUICKTIME_FILES'],
 				);
 
-				$group_id = request_var('g', 0);
+				$group_id = $request->variable('g', 0);
 				$action = (isset($_POST['add'])) ? 'add' : $action;
 
 				switch ($action)
@@ -651,7 +669,7 @@ class acp_attachments
 								WHERE group_id = $group_id";
 							$db->sql_query($sql);
 
-							add_log('admin', 'LOG_ATTACH_EXTGROUP_DEL', $group_name);
+							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_EXTGROUP_DEL', false, array($group_name));
 
 							$cache->destroy('_extensions');
 
@@ -692,7 +710,7 @@ class acp_attachments
 						if ($action == 'add')
 						{
 							$ext_group_row = array(
-								'group_name'	=> utf8_normalize_nfc(request_var('group_name', '', true)),
+								'group_name'	=> $request->variable('group_name', '', true),
 								'cat_id'		=> 0,
 								'allow_group'	=> 1,
 								'allow_in_pm'	=> 1,
@@ -703,8 +721,6 @@ class acp_attachments
 							$forum_ids = array();
 						}
 
-						$extensions = array();
-
 						$sql = 'SELECT *
 							FROM ' . EXTENSIONS_TABLE . "
 							WHERE group_id = $group_id
@@ -908,9 +924,9 @@ class acp_attachments
 
 				if ($submit)
 				{
-					$delete_files = (isset($_POST['delete'])) ? array_keys(request_var('delete', array('' => 0))) : array();
-					$add_files = (isset($_POST['add'])) ? array_keys(request_var('add', array('' => 0))) : array();
-					$post_ids = request_var('post_id', array('' => 0));
+					$delete_files = (isset($_POST['delete'])) ? array_keys($request->variable('delete', array('' => 0))) : array();
+					$add_files = (isset($_POST['add'])) ? array_keys($request->variable('add', array('' => 0))) : array();
+					$post_ids = $request->variable('post_id', array('' => 0));
 
 					if (sizeof($delete_files))
 					{
@@ -923,11 +939,11 @@ class acp_attachments
 						$delete_files = array();
 						while ($row = $db->sql_fetchrow($result))
 						{
-							phpbb_unlink($row['physical_filename'], 'file');
+							$this->attachment_manager->unlink($row['physical_filename'], 'file');
 
 							if ($row['thumbnail'])
 							{
-								phpbb_unlink($row['physical_filename'], 'thumbnail');
+								$this->attachment_manager->unlink($row['physical_filename'], 'thumbnail');
 							}
 
 							$delete_files[$row['attach_id']] = $row['real_filename'];
@@ -941,7 +957,7 @@ class acp_attachments
 							WHERE ' . $db->sql_in_set('attach_id', array_keys($delete_files));
 						$db->sql_query($sql);
 
-						add_log('admin', 'LOG_ATTACH_ORPHAN_DEL', implode(', ', $delete_files));
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_ORPHAN_DEL', false, array(implode(', ', $delete_files)));
 						$notify[] = sprintf($user->lang['LOG_ATTACH_ORPHAN_DEL'], implode($user->lang['COMMA_SEPARATOR'], $delete_files));
 					}
 
@@ -1032,14 +1048,14 @@ class acp_attachments
 							$space_taken += $row['filesize'];
 							$files_added++;
 
-							add_log('admin', 'LOG_ATTACH_FILEUPLOAD', $post_row['post_id'], $row['real_filename']);
+							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_FILEUPLOAD', false, array($post_row['post_id'], $row['real_filename']));
 						}
 						$db->sql_freeresult($result);
 
 						if ($files_added)
 						{
-							set_config_count('upload_dir_size', $space_taken, true);
-							set_config_count('num_files', $files_added, true);
+							$config->increment('upload_dir_size', $space_taken, false);
+							$config->increment('num_files', $files_added, false);
 						}
 					}
 				}
@@ -1076,7 +1092,7 @@ class acp_attachments
 
 				if ($submit)
 				{
-					$delete_files = (isset($_POST['delete'])) ? array_keys(request_var('delete', array('' => 0))) : array();
+					$delete_files = (isset($_POST['delete'])) ? array_keys($request->variable('delete', array('' => 0))) : array();
 
 					if (sizeof($delete_files))
 					{
@@ -1092,13 +1108,14 @@ class acp_attachments
 						}
 						$db->sql_freeresult($result);
 
-						if ($num_deleted = delete_attachments('attach', $delete_files))
+						if ($num_deleted = $this->attachment_manager->delete('attach', $delete_files))
 						{
 							if (sizeof($delete_files) != $num_deleted)
 							{
 								$error[] = $user->lang['FILES_GONE'];
 							}
-							add_log('admin', 'LOG_ATTACHMENTS_DELETED', implode(', ', $deleted_filenames));
+
+							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACHMENTS_DELETED', false, array(implode(', ', $deleted_filenames)));
 							$notify[] = sprintf($user->lang['LOG_ATTACHMENTS_DELETED'], implode($user->lang['COMMA_SEPARATOR'], $deleted_filenames));
 						}
 						else
@@ -1124,12 +1141,12 @@ class acp_attachments
 					'S_MANAGE'		=> true,
 				));
 
-				$start		= request_var('start', 0);
+				$start		= $request->variable('start', 0);
 
 				// Sort keys
-				$sort_days	= request_var('st', 0);
-				$sort_key	= request_var('sk', 't');
-				$sort_dir	= request_var('sd', 'd');
+				$sort_days	= $request->variable('st', 0);
+				$sort_key	= $request->variable('sk', 't');
+				$sort_dir	= $request->variable('sd', 'd');
 
 				// Sorting
 				$limit_days = array(0 => $user->lang['ALL_ENTRIES'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
@@ -1150,6 +1167,7 @@ class acp_attachments
 				$total_size = $stats['upload_dir_size'];
 
 				// Make sure $start is set to the last page if it exceeds the amount
+				/* @var $pagination \phpbb\pagination */
 				$pagination = $phpbb_container->get('pagination');
 				$start = $pagination->validate_start($start, $attachments_per_page, $num_files);
 
@@ -1349,6 +1367,8 @@ class acp_attachments
 		else
 		{
 			$this->set_attachment_stats($this->get_attachment_stats());
+
+			/* @var $log \phpbb\log\log_interface */
 			$log = $this->phpbb_container->get('log');
 			$log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_RESYNC_FILES_STATS');
 		}
@@ -1365,10 +1385,7 @@ class acp_attachments
 		$types = array(
 			ATTACHMENT_CATEGORY_NONE		=> $user->lang['NO_FILE_CAT'],
 			ATTACHMENT_CATEGORY_IMAGE		=> $user->lang['CAT_IMAGES'],
-			ATTACHMENT_CATEGORY_WM			=> $user->lang['CAT_WM_FILES'],
-			ATTACHMENT_CATEGORY_RM			=> $user->lang['CAT_RM_FILES'],
 			ATTACHMENT_CATEGORY_FLASH		=> $user->lang['CAT_FLASH_FILES'],
-			ATTACHMENT_CATEGORY_QUICKTIME	=> $user->lang['CAT_QUICKTIME_FILES'],
 		);
 
 		if ($group_id)
@@ -1499,7 +1516,15 @@ class acp_attachments
 			if (!file_exists($phpbb_root_path . $upload_dir))
 			{
 				@mkdir($phpbb_root_path . $upload_dir, 0777);
-				phpbb_chmod($phpbb_root_path . $upload_dir, CHMOD_READ | CHMOD_WRITE);
+
+				try
+				{
+					$this->filesystem->phpbb_chmod($phpbb_root_path . $upload_dir, CHMOD_READ | CHMOD_WRITE);
+				}
+				catch (\phpbb\filesystem\exception\filesystem_exception $e)
+				{
+					// Do nothing
+				}
 			}
 		}
 
@@ -1515,7 +1540,7 @@ class acp_attachments
 			return;
 		}
 
-		if (!phpbb_is_writable($phpbb_root_path . $upload_dir))
+		if (!$this->filesystem->is_writable($phpbb_root_path . $upload_dir))
 		{
 			$error[] = sprintf($user->lang['NO_WRITE_UPLOAD'], $upload_dir);
 			return;
@@ -1527,13 +1552,12 @@ class acp_attachments
 	*/
 	function perform_site_list()
 	{
-		global $db, $user;
-		global $request;
+		global $db, $user, $request, $phpbb_log;
 
 		if (isset($_REQUEST['securesubmit']))
 		{
 			// Grab the list of entries
-			$ips = request_var('ips', '');
+			$ips = $request->variable('ips', '');
 			$ip_list = array_unique(explode("\n", $ips));
 			$ip_list_log = implode(', ', $ip_list);
 
@@ -1558,7 +1582,6 @@ class acp_attachments
 						if ($ip_2_counter == 0 && $ip_2_end == 254)
 						{
 							$ip_2_counter = 256;
-							$ip_2_fragment = 256;
 
 							$iplist[] = "'$ip_1_counter.*'";
 						}
@@ -1571,7 +1594,6 @@ class acp_attachments
 							if ($ip_3_counter == 0 && $ip_3_end == 254)
 							{
 								$ip_3_counter = 256;
-								$ip_3_fragment = 256;
 
 								$iplist[] = "'$ip_1_counter.$ip_2_counter.*'";
 							}
@@ -1584,7 +1606,6 @@ class acp_attachments
 								if ($ip_4_counter == 0 && $ip_4_end == 254)
 								{
 									$ip_4_counter = 256;
-									$ip_4_fragment = 256;
 
 									$iplist[] = "'$ip_1_counter.$ip_2_counter.$ip_3_counter.*'";
 								}
@@ -1679,14 +1700,14 @@ class acp_attachments
 			{
 				// Update log
 				$log_entry = ($ip_exclude) ? 'LOG_DOWNLOAD_EXCLUDE_IP' : 'LOG_DOWNLOAD_IP';
-				add_log('admin', $log_entry, $ip_list_log);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log_entry, false, array($ip_list_log));
 			}
 
 			trigger_error($user->lang['SECURE_DOWNLOAD_UPDATE_SUCCESS'] . adm_back_link($this->u_action));
 		}
 		else if (isset($_POST['unsecuresubmit']))
 		{
-			$unip_sql = request_var('unip', array(0));
+			$unip_sql = $request->variable('unip', array(0));
 
 			if (sizeof($unip_sql))
 			{
@@ -1708,7 +1729,7 @@ class acp_attachments
 					WHERE ' . $db->sql_in_set('site_id', $unip_sql);
 				$db->sql_query($sql);
 
-				add_log('admin', 'LOG_DOWNLOAD_REMOVE_IP', $l_unip_list);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DOWNLOAD_REMOVE_IP', false, array($l_unip_list));
 			}
 
 			trigger_error($user->lang['SECURE_DOWNLOAD_UPDATE_SUCCESS'] . adm_back_link($this->u_action));
--- a/includes/acp/acp_ban.php
+++ b/includes/acp/acp_ban.php
@@ -195,7 +195,6 @@ class acp_ban
 			case 'user':
 
 				$field = 'username';
-				$l_ban_cell = $user->lang['USERNAME'];
 
 				$sql = 'SELECT b.*, u.user_id, u.username, u.username_clean
 					FROM ' . BANLIST_TABLE . ' b, ' . USERS_TABLE . ' u
@@ -208,7 +207,6 @@ class acp_ban
 			case 'ip':
 
 				$field = 'ban_ip';
-				$l_ban_cell = $user->lang['IP_HOSTNAME'];
 
 				$sql = 'SELECT *
 					FROM ' . BANLIST_TABLE . '
@@ -221,7 +219,6 @@ class acp_ban
 			case 'email':
 
 				$field = 'ban_email';
-				$l_ban_cell = $user->lang['EMAIL_ADDRESS'];
 
 				$sql = 'SELECT *
 					FROM ' . BANLIST_TABLE . '
--- a/includes/acp/acp_bbcodes.php
+++ b/includes/acp/acp_bbcodes.php
@@ -25,14 +25,14 @@ class acp_bbcodes
 
 	function main($id, $mode)
 	{
-		global $db, $user, $auth, $template, $cache, $request, $phpbb_dispatcher;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+		global $db, $user, $template, $cache, $request, $phpbb_dispatcher, $phpbb_container;
+		global $phpbb_log;
 
 		$user->add_lang('acp/posting');
 
 		// Set up general vars
-		$action	= request_var('action', '');
-		$bbcode_id = request_var('bbcode', 0);
+		$action	= $request->variable('action', '');
+		$bbcode_id = $request->variable('bbcode', 0);
 		$submit = $request->is_set_post('submit');
 
 		$this->tpl_name = 'acp_bbcodes';
@@ -89,11 +89,11 @@ class acp_bbcodes
 			// No break here
 
 			case 'create':
-				$display_on_posting = request_var('display_on_posting', 0);
+				$display_on_posting = $request->variable('display_on_posting', 0);
 
-				$bbcode_match = request_var('bbcode_match', '');
-				$bbcode_tpl = htmlspecialchars_decode(utf8_normalize_nfc(request_var('bbcode_tpl', '', true)));
-				$bbcode_helpline = utf8_normalize_nfc(request_var('bbcode_helpline', '', true));
+				$bbcode_match = $request->variable('bbcode_match', '');
+				$bbcode_tpl = htmlspecialchars_decode($request->variable('bbcode_tpl', '', true));
+				$bbcode_helpline = $request->variable('bbcode_helpline', '', true);
 			break;
 		}
 
@@ -275,6 +275,7 @@ class acp_bbcodes
 
 						$db->sql_query('INSERT INTO ' . BBCODES_TABLE . $db->sql_build_array('INSERT', $sql_ary));
 						$cache->destroy('sql', BBCODES_TABLE);
+						$phpbb_container->get('text_formatter.cache')->invalidate();
 
 						$lang = 'BBCODE_ADDED';
 						$log_action = 'LOG_BBCODE_ADD';
@@ -286,12 +287,13 @@ class acp_bbcodes
 							WHERE bbcode_id = ' . $bbcode_id;
 						$db->sql_query($sql);
 						$cache->destroy('sql', BBCODES_TABLE);
+						$phpbb_container->get('text_formatter.cache')->invalidate();
 
 						$lang = 'BBCODE_EDITED';
 						$log_action = 'LOG_BBCODE_EDIT';
 					}
 
-					add_log('admin', $log_action, $data['bbcode_tag']);
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log_action, false, array($data['bbcode_tag']));
 
 					trigger_error($user->lang[$lang] . adm_back_link($this->u_action));
 				}
@@ -325,7 +327,8 @@ class acp_bbcodes
 					{
 						$db->sql_query('DELETE FROM ' . BBCODES_TABLE . " WHERE bbcode_id = $bbcode_id");
 						$cache->destroy('sql', BBCODES_TABLE);
-						add_log('admin', 'LOG_BBCODE_DELETE', $row['bbcode_tag']);
+						$phpbb_container->get('text_formatter.cache')->invalidate();
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_BBCODE_DELETE', false, array($row['bbcode_tag']));
 
 						if ($request->is_ajax())
 						{
@@ -419,8 +422,6 @@ class acp_bbcodes
 		// Allow unicode characters for URL|LOCAL_URL|RELATIVE_URL|INTTEXT tokens
 		$utf8 = preg_match('/(URL|LOCAL_URL|RELATIVE_URL|INTTEXT)/', $bbcode_match);
 
-		$utf8_pcre_properties = phpbb_pcre_utf8_support();
-
 		$fp_match = preg_quote($bbcode_match, '!');
 		$fp_replace = preg_replace('#^\[(.*?)\]#', '[$1:$uid]', $bbcode_match);
 		$fp_replace = preg_replace('#\[/(.*?)\]$#', '[/$1:$uid]', $fp_replace);
@@ -451,7 +452,7 @@ class acp_bbcodes
 				'!([a-zA-Z0-9-+.,_ ]+)!'	 =>	"$1"
 			),
 			'INTTEXT' => array(
-				($utf8_pcre_properties) ? '!([\p{L}\p{N}\-+,_. ]+)!u' : '!([a-zA-Z0-9\-+,_. ]+)!u'	 =>	"$1"
+				'!([\p{L}\p{N}\-+,_. ]+)!u'	 =>	"$1"
 			),
 			'IDENTIFIER' => array(
 				'!([a-zA-Z0-9-_]+)!'	 =>	"$1"
@@ -471,7 +472,7 @@ class acp_bbcodes
 			'EMAIL' => '(' . get_preg_expression('email') . ')',
 			'TEXT' => '(.*?)',
 			'SIMPLETEXT' => '([a-zA-Z0-9-+.,_ ]+)',
-			'INTTEXT' => ($utf8_pcre_properties) ? '([\p{L}\p{N}\-+,_. ]+)' : '([a-zA-Z0-9\-+,_. ]+)',
+			'INTTEXT' => '([\p{L}\p{N}\-+,_. ]+)',
 			'IDENTIFIER' => '([a-zA-Z0-9-_]+)',
 			'COLOR' => '([a-zA-Z]+|#[0-9abcdefABCDEF]+)',
 			'NUMBER' => '([0-9]+)',
@@ -479,7 +480,7 @@ class acp_bbcodes
 
 		$pad = 0;
 		$modifiers = 'i';
-		$modifiers .= ($utf8 && $utf8_pcre_properties) ? 'u' : '';
+		$modifiers .= ($utf8) ? 'u' : '';
 
 		if (preg_match_all('/\{(' . implode('|', array_keys($tokens)) . ')[0-9]*\}/i', $bbcode_match, $m))
 		{
@@ -494,7 +495,9 @@ class acp_bbcodes
 				if (preg_match_all('/(?<!\\\\)\$([0-9]+)/', $replace, $repad))
 				{
 					$repad = $pad + sizeof(array_unique($repad[0]));
-					$replace = preg_replace('/(?<!\\\\)\$([0-9]+)/e', "'\${' . (\$1 + \$pad) . '}'", $replace);
+					$replace = preg_replace_callback('/(?<!\\\\)\$([0-9]+)/', function ($match) use ($pad) {
+						return '${' . ($match[1] + $pad) . '}';
+					}, $replace);
 					$pad = $repad;
 				}
 
@@ -559,10 +562,18 @@ class acp_bbcodes
 			trigger_error($user->lang['BBCODE_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
 		}
 
-		$fp_match = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $fp_match);
-		$fp_replace = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $fp_replace);
-		$sp_match = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $sp_match);
-		$sp_replace = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $sp_replace);
+		$fp_match = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) {
+			return strtolower($match[0]);
+		}, $fp_match);
+		$fp_replace = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) {
+			return strtolower($match[0]);
+		}, $fp_replace);
+		$sp_match = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) {
+			return strtolower($match[0]);
+		}, $sp_match);
+		$sp_replace = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) {
+			return strtolower($match[0]);
+		}, $sp_replace);
 
 		return array(
 			'bbcode_tag'				=> $bbcode_tag,
--- a/includes/acp/acp_board.php
+++ b/includes/acp/acp_board.php
@@ -30,13 +30,12 @@ class acp_board
 
 	function main($id, $mode)
 	{
-		global $db, $user, $auth, $template;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
-		global $cache, $phpbb_container, $phpbb_dispatcher;
+		global $user, $template, $request;
+		global $config, $phpbb_root_path, $phpEx;
+		global $cache, $phpbb_container, $phpbb_dispatcher, $phpbb_log;
 
 		$user->add_lang('acp/board');
 
-		$action	= request_var('action', '');
 		$submit = (isset($_POST['submit']) || isset($_POST['allow_quick_reply_enable'])) ? true : false;
 
 		$form_key = 'acp_board';
@@ -94,6 +93,7 @@ class acp_board
 						'allow_bbcode'			=> array('lang' => 'ALLOW_BBCODE',			'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),
 						'allow_smilies'			=> array('lang' => 'ALLOW_SMILIES',			'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),
 						'allow_sig'				=> array('lang' => 'ALLOW_SIG',				'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),
+						'allow_board_notifications'		=> array('lang' => 'ALLOW_BOARD_NOTIFICATIONS',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),
 						'allow_nocensors'		=> array('lang' => 'ALLOW_NO_CENSORS',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
 						'allow_bookmarks'		=> array('lang' => 'ALLOW_BOOKMARKS',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
 						'allow_birthdays'		=> array('lang' => 'ALLOW_BIRTHDAYS',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
@@ -115,6 +115,7 @@ class acp_board
 			break;
 
 			case 'avatar':
+				/* @var $phpbb_avatar_manager \phpbb\avatar\manager */
 				$phpbb_avatar_manager = $phpbb_container->get('avatar.manager');
 				$avatar_drivers = $phpbb_avatar_manager->get_all_drivers();
 
@@ -322,6 +323,7 @@ class acp_board
 						'cookie_name'	=> array('lang' => 'COOKIE_NAME',	'validate' => 'string',	'type' => 'text::16', 'explain' => false),
 						'cookie_path'	=> array('lang'	=> 'COOKIE_PATH',	'validate' => 'string',	'type' => 'text::255', 'explain' => false),
 						'cookie_secure'	=> array('lang' => 'COOKIE_SECURE',	'validate' => 'bool',	'type' => 'radio:disabled_enabled', 'explain' => true),
+						'cookie_notice'	=> array('lang' => 'COOKIE_NOTICE',	'validate' => 'bool',	'type' => 'radio:enabled_disabled', 'explain' => true),
 					)
 				);
 			break;
@@ -414,6 +416,7 @@ class acp_board
 						'browser_check'			=> array('lang' => 'BROWSER_VALID',			'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
 						'forwarded_for_check'	=> array('lang' => 'FORWARDED_FOR_VALID',	'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
 						'referer_validation'	=> array('lang' => 'REFERRER_VALID',		'validate' => 'int:0:3','type' => 'custom', 'method' => 'select_ref_check', 'explain' => true),
+						'remote_upload_verify'	=> array('lang' => 'UPLOAD_CERT_VALID',	'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
 						'check_dnsbl'			=> array('lang' => 'CHECK_DNSBL',			'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
 						'email_check_mx'		=> array('lang' => 'EMAIL_CHECK_MX',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
 						'max_pass_chars'		=> array('lang' => 'PASSWORD_LENGTH', 'validate' => 'int:8:255', 'type' => false, 'method' => false, 'explain' => false,),
@@ -446,6 +449,7 @@ class acp_board
 						'board_email'			=> array('lang' => 'ADMIN_EMAIL',			'validate' => 'email',	'type' => 'email:25:100', 'explain' => true),
 						'board_email_sig'		=> array('lang' => 'EMAIL_SIG',				'validate' => 'string',	'type' => 'textarea:5:30', 'explain' => true),
 						'board_hide_emails'		=> array('lang' => 'BOARD_HIDE_EMAILS',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
+						'send_test_email'		=> array('lang' => 'SEND_TEST_EMAIL',		'validate' => 'bool',	'type' => 'custom', 'method' => 'send_test_email', 'explain' => true),
 
 						'legend2'				=> 'SMTP_SETTINGS',
 						'smtp_delivery'			=> array('lang' => 'USE_SMTP',				'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
@@ -483,7 +487,7 @@ class acp_board
 		}
 
 		$this->new_config = $config;
-		$cfg_array = (isset($_REQUEST['config'])) ? utf8_normalize_nfc(request_var('config', array('' => ''), true)) : $this->new_config;
+		$cfg_array = (isset($_REQUEST['config'])) ? $request->variable('config', array('' => ''), true) : $this->new_config;
 		$error = array();
 
 		// We validate the complete config if wished
@@ -539,7 +543,7 @@ class acp_board
 					// send the password to the output
 					continue;
 				}
-				set_config($config_name, $config_value);
+				$config->set($config_name, $config_value);
 
 				if ($config_name == 'allow_quick_reply' && isset($_POST['allow_quick_reply_enable']))
 				{
@@ -561,6 +565,7 @@ class acp_board
 		if ($mode == 'auth')
 		{
 			// Retrieve a list of auth plugins and check their config values
+			/* @var $auth_providers \phpbb\auth\provider_collection */
 			$auth_providers = $phpbb_container->get('auth.provider_collection');
 
 			$updated_auth_settings = false;
@@ -575,7 +580,7 @@ class acp_board
 					{
 						if (!isset($config[$field]))
 						{
-							set_config($field, '');
+							$config->set($field, '');
 						}
 
 						if (!isset($cfg_array[$field]) || strpos($field, 'legend') !== false)
@@ -598,7 +603,7 @@ class acp_board
 						if ($submit)
 						{
 							$updated_auth_settings = true;
-							set_config($field, $config_value);
+							$config->set($field, $config_value);
 						}
 					}
 				}
@@ -615,11 +620,11 @@ class acp_board
 					{
 						foreach ($old_auth_config as $config_name => $config_value)
 						{
-							set_config($config_name, $config_value);
+							$config->set($config_name, $config_value);
 						}
 						trigger_error($error . adm_back_link($this->u_action), E_USER_WARNING);
 					}
-					set_config('auth_method', basename($cfg_array['auth_method']));
+					$config->set('auth_method', basename($cfg_array['auth_method']));
 				}
 				else
 				{
@@ -628,9 +633,33 @@ class acp_board
 			}
 		}
 
+		if ($mode == 'email' && $request->is_set_post('send_test_email'))
+		{
+			if ($config['email_enable'])
+			{
+				include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
+
+				$messenger = new messenger(false);
+				$messenger->template('test');
+				$messenger->set_addresses($user->data);
+				$messenger->anti_abuse_headers($config, $user);
+				$messenger->assign_vars(array(
+					'USERNAME'	=> htmlspecialchars_decode($user->data['username']),
+				));
+				$messenger->send(NOTIFY_EMAIL);
+
+				trigger_error($user->lang('TEST_EMAIL_SENT') . adm_back_link($this->u_action));
+			}
+			else
+			{
+				$user->add_lang('memberlist');
+				trigger_error($user->lang('EMAIL_DISABLED') . adm_back_link($this->u_action), E_USER_WARNING);
+			}
+		}
+
 		if ($submit)
 		{
-			add_log('admin', 'LOG_CONFIG_' . strtoupper($mode));
+			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_' . strtoupper($mode));
 
 			$message = $user->lang('CONFIG_UPDATED');
 			$message_type = E_USER_NOTICE;
@@ -735,10 +764,11 @@ class acp_board
 	*/
 	function select_auth_method($selected_method, $key = '')
 	{
-		global $phpbb_root_path, $phpEx, $phpbb_container;
+		global $phpbb_container;
 
-		$auth_plugins = array();
+		/* @var $auth_providers \phpbb\auth\provider_collection */
 		$auth_providers = $phpbb_container->get('auth.provider_collection');
+		$auth_plugins = array();
 
 		foreach ($auth_providers as $key => $value)
 		{
@@ -914,8 +944,6 @@ class acp_board
 	*/
 	function board_disable($value, $key)
 	{
-		global $user;
-
 		$radio_ary = array(1 => 'YES', 0 => 'NO');
 
 		return h_radio('config[board_disable]', $radio_ary, $value) . '<br /><input id="' . $key . '" type="text" name="config[board_disable_msg]" maxlength="255" size="40" value="' . $this->new_config['board_disable_msg'] . '" />';
@@ -1017,7 +1045,7 @@ class acp_board
 		$user->timezone = $old_tz;
 
 		return "<select name=\"dateoptions\" id=\"dateoptions\" onchange=\"if (this.value == 'custom') { document.getElementById('" . addslashes($key) . "').value = '" . addslashes($value) . "'; } else { document.getElementById('" . addslashes($key) . "').value = this.value; }\">$dateformat_options</select>
-		<input type=\"text\" name=\"config[$key]\" id=\"$key\" value=\"$value\" maxlength=\"30\" />";
+		<input type=\"text\" name=\"config[$key]\" id=\"$key\" value=\"$value\" maxlength=\"64\" />";
 	}
 
 	/**
@@ -1025,8 +1053,6 @@ class acp_board
 	*/
 	function select_news_forums($value, $key)
 	{
-		global $user, $config;
-
 		$forum_list = make_forum_select(false, false, true, true, true, false, true);
 
 		// Build forum options
@@ -1044,8 +1070,6 @@ class acp_board
 
 	function select_exclude_forums($value, $key)
 	{
-		global $user, $config;
-
 		$forum_list = make_forum_select(false, false, true, true, true, false, true);
 
 		// Build forum options
@@ -1063,10 +1087,10 @@ class acp_board
 
 	function store_feed_forums($option, $key)
 	{
-		global $db, $cache;
+		global $db, $cache, $request;
 
 		// Get key
-		$values = request_var($key, array(0 => 0));
+		$values = $request->variable($key, array(0 => 0));
 
 		// Empty option bit for all forums
 		$sql = 'UPDATE ' . FORUMS_TABLE . '
@@ -1101,7 +1125,7 @@ class acp_board
 	*/
 	function enable_mod_rewrite($value, $key)
 	{
-		global $user, $config;
+		global $user;
 
 		// Determine whether mod_rewrite is enabled on the server
 		// NOTE: This only works on Apache servers on which PHP is NOT
@@ -1135,4 +1159,11 @@ class acp_board
 		return h_radio($field_name, array(1 => 'YES', 0 => 'NO'), $value) .
 			($message !== false ? '<br /><span>' . $user->lang($message) . '</span>' : '');
 	}
+
+	function send_test_email($value, $key)
+	{
+		global $user;
+
+		return '<input class="button2" type="submit" id="' . $key . '" name="' . $key . '" value="' . $user->lang['SEND_TEST_EMAIL'] . '" />';
+	}
 }
--- a/includes/acp/acp_bots.php
+++ b/includes/acp/acp_bots.php
@@ -25,13 +25,13 @@ class acp_bots
 
 	function main($id, $mode)
 	{
-		global $config, $db, $user, $auth, $template, $cache, $request;
-		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix;
+		global $config, $db, $user, $template, $cache, $request, $phpbb_log;
+		global $phpbb_root_path, $phpEx;
 
-		$action = request_var('action', '');
+		$action = $request->variable('action', '');
 		$submit = (isset($_POST['submit'])) ? true : false;
-		$mark	= request_var('mark', array(0));
-		$bot_id	= request_var('id', 0);
+		$mark	= $request->variable('mark', array(0));
+		$bot_id	= $request->variable('id', 0);
 
 		if (isset($_POST['add']))
 		{
@@ -124,7 +124,7 @@ class acp_bots
 
 						$cache->destroy('_bots');
 
-						add_log('admin', 'LOG_BOT_DELETE', implode(', ', $bot_name_ary));
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_BOT_DELETE', false, array(implode(', ', $bot_name_ary)));
 						trigger_error($user->lang['BOT_DELETED'] . adm_back_link($this->u_action));
 					}
 					else
@@ -148,12 +148,12 @@ class acp_bots
 				}
 
 				$bot_row = array(
-					'bot_name'		=> utf8_normalize_nfc(request_var('bot_name', '', true)),
-					'bot_agent'		=> request_var('bot_agent', ''),
-					'bot_ip'		=> request_var('bot_ip', ''),
-					'bot_active'	=> request_var('bot_active', true),
-					'bot_lang'		=> request_var('bot_lang', $config['default_lang']),
-					'bot_style'		=> request_var('bot_style' , $config['default_style']),
+					'bot_name'		=> $request->variable('bot_name', '', true),
+					'bot_agent'		=> $request->variable('bot_agent', ''),
+					'bot_ip'		=> $request->variable('bot_ip', ''),
+					'bot_active'	=> $request->variable('bot_active', true),
+					'bot_lang'		=> $request->variable('bot_lang', $config['default_lang']),
+					'bot_style'		=> $request->variable('bot_style' , $config['default_style']),
 				);
 
 				if ($submit)
@@ -296,7 +296,7 @@ class acp_bots
 
 						$cache->destroy('_bots');
 
-						add_log('admin', 'LOG_BOT_' . $log, $bot_row['bot_name']);
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_BOT_' . $log, false, array($bot_row['bot_name']));
 						trigger_error($user->lang['BOT_' . $log] . adm_back_link($this->u_action));
 
 					}
--- a/includes/acp/acp_captcha.php
+++ b/includes/acp/acp_captcha.php
@@ -25,17 +25,18 @@ class acp_captcha
 
 	function main($id, $mode)
 	{
-		global $request, $user, $auth, $template;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx, $phpbb_container;
+		global $user, $template, $phpbb_log, $request;
+		global $config, $phpbb_container;
 
 		$user->add_lang('acp/board');
 
+		/* @var $factory \phpbb\captcha\factory */
 		$factory = $phpbb_container->get('captcha.factory');
 		$captchas = $factory->get_captcha_types();
 
-		$selected = request_var('select_captcha', $config['captcha_plugin']);
+		$selected = $request->variable('select_captcha', $config['captcha_plugin']);
 		$selected = (isset($captchas['available'][$selected]) || isset($captchas['unavailable'][$selected])) ? $selected : $config['captcha_plugin'];
-		$configure = request_var('configure', false);
+		$configure = $request->variable('configure', false);
 
 		// Oh, they are just here for the view
 		if (isset($_GET['captcha_demo']))
@@ -89,7 +90,7 @@ class acp_captcha
 			$form_key = 'acp_captcha';
 			add_form_key($form_key);
 
-			$submit = request_var('main_submit', false);
+			$submit = $request->variable('main_submit', false);
 			$error = $cfg_array = array();
 
 			if ($submit)
@@ -125,11 +126,11 @@ class acp_captcha
 						$old_captcha = $factory->get_instance($config['captcha_plugin']);
 						$old_captcha->uninstall();
 
-						set_config('captcha_plugin', $selected);
+						$config->set('captcha_plugin', $selected);
 						$new_captcha = $factory->get_instance($config['captcha_plugin']);
 						$new_captcha->install();
 
-						add_log('admin', 'LOG_CONFIG_VISUAL');
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_VISUAL');
 					}
 					else
 					{
@@ -157,7 +158,7 @@ class acp_captcha
 
 				foreach ($config_vars as $config_var => $options)
 				{
-					$template->assign_var($options['tpl'], (isset($_POST[$config_var])) ? request_var($config_var, $options['default']) : $config[$config_var]) ;
+					$template->assign_var($options['tpl'], (isset($_POST[$config_var])) ? $request->variable($config_var, $options['default']) : $config[$config_var]) ;
 				}
 
 				$template->assign_vars(array(
@@ -177,7 +178,7 @@ class acp_captcha
 	*/
 	function deliver_demo($selected)
 	{
-		global $db, $user, $config, $phpbb_container;
+		global $phpbb_container;
 
 		$captcha = $phpbb_container->get('captcha.factory')->get_instance($selected);
 		$captcha->init(CONFIRM_REG);
--- a/includes/acp/acp_contact.php
+++ b/includes/acp/acp_contact.php
@@ -48,6 +48,7 @@ class acp_contact
 			include($phpbb_root_path . 'includes/message_parser.' . $phpEx);
 		}
 
+		/* @var $config_text \phpbb\config\db_text */
 		$config_text = $phpbb_container->get('config_text');
 
 		$contact_admin_data			= $config_text->get_array(array(
@@ -104,6 +105,9 @@ class acp_contact
 
 		$contact_admin_edit = generate_text_for_edit($contact_admin_info, $contact_admin_info_uid, $contact_admin_info_flags);
 
+		/** @var \phpbb\controller\helper $controller_helper */
+		$controller_helper = $phpbb_container->get('controller.helper');
+
 		$template->assign_vars(array(
 			'ERRORS'			=> $error,
 			'CONTACT_ENABLED'	=> $config['contact_admin_form_enable'],
@@ -115,7 +119,7 @@ class acp_contact
 			'S_SMILIES_DISABLE_CHECKED'		=> !$contact_admin_edit['allow_smilies'],
 			'S_MAGIC_URL_DISABLE_CHECKED'	=> !$contact_admin_edit['allow_urls'],
 
-			'BBCODE_STATUS'			=> $user->lang('BBCODE_IS_ON', '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>'),
+			'BBCODE_STATUS'			=> $user->lang('BBCODE_IS_ON', '<a href="' . $controller_helper->route('phpbb_help_bbcode_controller') . '">', '</a>'),
 			'SMILIES_STATUS'		=> $user->lang['SMILIES_ARE_ON'],
 			'IMG_STATUS'			=> $user->lang['IMAGES_ARE_ON'],
 			'FLASH_STATUS'			=> $user->lang['FLASH_IS_ON'],
--- a/includes/acp/acp_database.php
+++ b/includes/acp/acp_database.php
@@ -26,18 +26,17 @@ class acp_database
 
 	function main($id, $mode)
 	{
-		global $cache, $db, $user, $auth, $template, $table_prefix;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+		global $cache, $db, $user, $template, $table_prefix, $request;
+		global $phpbb_root_path, $phpbb_container, $phpbb_log;
 
-		$this->db_tools = new \phpbb\db\tools($db);
+		$this->db_tools = $phpbb_container->get('dbal.tools');
 
 		$user->add_lang('acp/database');
 
 		$this->tpl_name = 'acp_database';
 		$this->page_title = 'ACP_DATABASE';
 
-		$action	= request_var('action', '');
-		$submit = (isset($_POST['submit'])) ? true : false;
+		$action	= $request->variable('action', '');
 
 		$form_key = 'acp_database';
 		add_form_key($form_key);
@@ -55,10 +54,10 @@ class acp_database
 				switch ($action)
 				{
 					case 'download':
-						$type	= request_var('type', '');
-						$table	= array_intersect($this->db_tools->sql_list_tables(), request_var('table', array('')));
-						$format	= request_var('method', '');
-						$where	= request_var('where', '');
+						$type	= $request->variable('type', '');
+						$table	= array_intersect($this->db_tools->sql_list_tables(), $request->variable('table', array('')));
+						$format	= $request->variable('method', '');
+						$where	= $request->variable('where', '');
 
 						if (!sizeof($table))
 						{
@@ -98,36 +97,9 @@ class acp_database
 						$time = time();
 
 						$filename = 'backup_' . $time . '_' . unique_id();
-						switch ($db->get_sql_layer())
-						{
-							case 'mysqli':
-							case 'mysql4':
-							case 'mysql':
-								$extractor = new mysql_extractor($format, $filename, $time, $download, $store);
-							break;
-
-							case 'sqlite':
-								$extractor = new sqlite_extractor($format, $filename, $time, $download, $store);
-							break;
 
-							case 'sqlite3':
-								$extractor = new sqlite3_extractor($format, $filename, $time, $download, $store);
-							break;
-
-							case 'postgres':
-								$extractor = new postgres_extractor($format, $filename, $time, $download, $store);
-							break;
-
-							case 'oracle':
-								$extractor = new oracle_extractor($format, $filename, $time, $download, $store);
-							break;
-
-							case 'mssql':
-							case 'mssql_odbc':
-							case 'mssqlnative':
-								$extractor = new mssql_extractor($format, $filename, $time, $download, $store);
-							break;
-						}
+						$extractor = $phpbb_container->get('dbal.extractor');
+						$extractor->init_extractor($format, $filename, $time, $download, $store);
 
 						$extractor->write_start($table_prefix);
 
@@ -143,12 +115,10 @@ class acp_database
 								// We might wanna empty out all that junk :D
 								switch ($db->get_sql_layer())
 								{
-									case 'sqlite':
 									case 'sqlite3':
 										$extractor->flush('DELETE FROM ' . $table_name . ";\n");
 									break;
 
-									case 'mssql':
 									case 'mssql_odbc':
 									case 'mssqlnative':
 										$extractor->flush('TRUNCATE TABLE ' . $table_name . "GO\n");
@@ -173,7 +143,7 @@ class acp_database
 
 						$extractor->write_end();
 
-						add_log('admin', 'LOG_DB_BACKUP');
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DB_BACKUP');
 
 						if ($download == true)
 						{
@@ -229,9 +199,9 @@ class acp_database
 				switch ($action)
 				{
 					case 'submit':
-						$delete = request_var('delete', '');
-						$file = request_var('file', '');
-						$download = request_var('download', '');
+						$delete = $request->variable('delete', '');
+						$file = $request->variable('file', '');
+						$download = $request->variable('download', '');
 
 						if (!preg_match('#^backup_\d{10,}_[a-z\d]{16}\.(sql(?:\.(?:gz|bz2))?)$#', $file, $matches))
 						{
@@ -250,7 +220,7 @@ class acp_database
 							if (confirm_box(true))
 							{
 								unlink($file_name);
-								add_log('admin', 'LOG_DB_DELETE');
+								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DB_DELETE');
 								trigger_error($user->lang['BACKUP_DELETE'] . adm_back_link($this->u_action));
 							}
 							else
@@ -333,7 +303,6 @@ class acp_database
 								case 'mysql':
 								case 'mysql4':
 								case 'mysqli':
-								case 'sqlite':
 								case 'sqlite3':
 									while (($sql = $fgetd($fp, ";\n", $read, $seek, $eof)) !== false)
 									{
@@ -388,7 +357,6 @@ class acp_database
 									}
 								break;
 
-								case 'mssql':
 								case 'mssql_odbc':
 								case 'mssqlnative':
 									while (($sql = $fgetd($fp, "GO\n", $read, $seek, $eof)) !== false)
@@ -403,7 +371,7 @@ class acp_database
 							// Purge the cache due to updated data
 							$cache->purge();
 
-							add_log('admin', 'LOG_DB_RESTORE');
+							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DB_RESTORE');
 							trigger_error($user->lang['RESTORE_SUCCESS'] . adm_back_link($this->u_action));
 							break;
 						}
@@ -469,1637 +437,6 @@ class acp_database
 	}
 }
 
-class base_extractor
-{
-	var $fh;
-	var $fp;
-	var $write;
-	var $close;
-	var $store;
-	var $download;
-	var $time;
-	var $format;
-	var $run_comp = false;
-
-	function base_extractor($format, $filename, $time, $download = false, $store = false)
-	{
-		global $request;
-
-		$this->download = $download;
-		$this->store = $store;
-		$this->time = $time;
-		$this->format = $format;
-
-		switch ($format)
-		{
-			case 'text':
-				$ext = '.sql';
-				$open = 'fopen';
-				$this->write = 'fwrite';
-				$this->close = 'fclose';
-				$mimetype = 'text/x-sql';
-			break;
-			case 'bzip2':
-				$ext = '.sql.bz2';
-				$open = 'bzopen';
-				$this->write = 'bzwrite';
-				$this->close = 'bzclose';
-				$mimetype = 'application/x-bzip2';
-			break;
-			case 'gzip':
-				$ext = '.sql.gz';
-				$open = 'gzopen';
-				$this->write = 'gzwrite';
-				$this->close = 'gzclose';
-				$mimetype = 'application/x-gzip';
-			break;
-		}
-
-		if ($download == true)
-		{
-			$name = $filename . $ext;
-			header('Cache-Control: private, no-cache');
-			header("Content-Type: $mimetype; name=\"$name\"");
-			header("Content-disposition: attachment; filename=$name");
-
-			switch ($format)
-			{
-				case 'bzip2':
-					ob_start();
-				break;
-
-				case 'gzip':
-					if (strpos($request->header('Accept-Encoding'), 'gzip') !== false && strpos(strtolower($request->header('User-Agent')), 'msie') === false)
-					{
-						ob_start('ob_gzhandler');
-					}
-					else
-					{
-						$this->run_comp = true;
-					}
-				break;
-			}
-		}
-
-		if ($store == true)
-		{
-			global $phpbb_root_path;
-			$file = $phpbb_root_path . 'store/' . $filename . $ext;
-
-			$this->fp = $open($file, 'w');
-
-			if (!$this->fp)
-			{
-				trigger_error('FILE_WRITE_FAIL', E_USER_ERROR);
-			}
-		}
-	}
-
-	function write_end()
-	{
-		static $close;
-
-		if ($this->store)
-		{
-			if ($close === null)
-			{
-				$close = $this->close;
-			}
-			$close($this->fp);
-		}
-
-		// bzip2 must be written all the way at the end
-		if ($this->download && $this->format === 'bzip2')
-		{
-			$c = ob_get_clean();
-			echo bzcompress($c);
-		}
-	}
-
-	function flush($data)
-	{
-		static $write;
-		if ($this->store === true)
-		{
-			if ($write === null)
-			{
-				$write = $this->write;
-			}
-			$write($this->fp, $data);
-		}
-
-		if ($this->download === true)
-		{
-			if ($this->format === 'bzip2' || $this->format === 'text' || ($this->format === 'gzip' && !$this->run_comp))
-			{
-				echo $data;
-			}
-
-			// we can write the gzip data as soon as we get it
-			if ($this->format === 'gzip')
-			{
-				if ($this->run_comp)
-				{
-					echo gzencode($data);
-				}
-				else
-				{
-					ob_flush();
-					flush();
-				}
-			}
-		}
-	}
-}
-
-class mysql_extractor extends base_extractor
-{
-	function write_start($table_prefix)
-	{
-		$sql_data = "#\n";
-		$sql_data .= "# phpBB Backup Script\n";
-		$sql_data .= "# Dump of tables for $table_prefix\n";
-		$sql_data .= "# DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
-		$sql_data .= "#\n";
-		$this->flush($sql_data);
-	}
-
-	function write_table($table_name)
-	{
-		global $db;
-		static $new_extract;
-
-		if ($new_extract === null)
-		{
-			if ($db->get_sql_layer() === 'mysqli' || version_compare($db->sql_server_info(true), '3.23.20', '>='))
-			{
-				$new_extract = true;
-			}
-			else
-			{
-				$new_extract = false;
-			}
-		}
-
-		if ($new_extract)
-		{
-			$this->new_write_table($table_name);
-		}
-		else
-		{
-			$this->old_write_table($table_name);
-		}
-	}
-
-	function write_data($table_name)
-	{
-		global $db;
-		if ($db->get_sql_layer() === 'mysqli')
-		{
-			$this->write_data_mysqli($table_name);
-		}
-		else
-		{
-			$this->write_data_mysql($table_name);
-		}
-	}
-
-	function write_data_mysqli($table_name)
-	{
-		global $db;
-		$sql = "SELECT *
-			FROM $table_name";
-		$result = mysqli_query($db->get_db_connect_id(), $sql, MYSQLI_USE_RESULT);
-		if ($result != false)
-		{
-			$fields_cnt = mysqli_num_fields($result);
-
-			// Get field information
-			$field = mysqli_fetch_fields($result);
-			$field_set = array();
-
-			for ($j = 0; $j < $fields_cnt; $j++)
-			{
-				$field_set[] = $field[$j]->name;
-			}
-
-			$search			= array("\\", "'", "\x00", "\x0a", "\x0d", "\x1a", '"');
-			$replace		= array("\\\\", "\\'", '\0', '\n', '\r', '\Z', '\\"');
-			$fields			= implode(', ', $field_set);
-			$sql_data		= 'INSERT INTO ' . $table_name . ' (' . $fields . ') VALUES ';
-			$first_set		= true;
-			$query_len		= 0;
-			$max_len		= get_usable_memory();
-
-			while ($row = mysqli_fetch_row($result))
-			{
-				$values	= array();
-				if ($first_set)
-				{
-					$query = $sql_data . '(';
-				}
-				else
-				{
-					$query  .= ',(';
-				}
-
-				for ($j = 0; $j < $fields_cnt; $j++)
-				{
-					if (!isset($row[$j]) || is_null($row[$j]))
-					{
-						$values[$j] = 'NULL';
-					}
-					else if (($field[$j]->flags & 32768) && !($field[$j]->flags & 1024))
-					{
-						$values[$j] = $row[$j];
-					}
-					else
-					{
-						$values[$j] = "'" . str_replace($search, $replace, $row[$j]) . "'";
-					}
-				}
-				$query .= implode(', ', $values) . ')';
-
-				$query_len += strlen($query);
-				if ($query_len > $max_len)
-				{
-					$this->flush($query . ";\n\n");
-					$query = '';
-					$query_len = 0;
-					$first_set = true;
-				}
-				else
-				{
-					$first_set = false;
-				}
-			}
-			mysqli_free_result($result);
-
-			// check to make sure we have nothing left to flush
-			if (!$first_set && $query)
-			{
-				$this->flush($query . ";\n\n");
-			}
-		}
-	}
-
-	function write_data_mysql($table_name)
-	{
-		global $db;
-		$sql = "SELECT *
-			FROM $table_name";
-		$result = mysql_unbuffered_query($sql, $db->get_db_connect_id());
-
-		if ($result != false)
-		{
-			$fields_cnt = mysql_num_fields($result);
-
-			// Get field information
-			$field = array();
-			for ($i = 0; $i < $fields_cnt; $i++)
-			{
-				$field[] = mysql_fetch_field($result, $i);
-			}
-			$field_set = array();
-
-			for ($j = 0; $j < $fields_cnt; $j++)
-			{
-				$field_set[] = $field[$j]->name;
-			}
-
-			$search			= array("\\", "'", "\x00", "\x0a", "\x0d", "\x1a", '"');
-			$replace		= array("\\\\", "\\'", '\0', '\n', '\r', '\Z', '\\"');
-			$fields			= implode(', ', $field_set);
-			$sql_data		= 'INSERT INTO ' . $table_name . ' (' . $fields . ') VALUES ';
-			$first_set		= true;
-			$query_len		= 0;
-			$max_len		= get_usable_memory();
-
-			while ($row = mysql_fetch_row($result))
-			{
-				$values = array();
-				if ($first_set)
-				{
-					$query = $sql_data . '(';
-				}
-				else
-				{
-					$query  .= ',(';
-				}
-
-				for ($j = 0; $j < $fields_cnt; $j++)
-				{
-					if (!isset($row[$j]) || is_null($row[$j]))
-					{
-						$values[$j] = 'NULL';
-					}
-					else if ($field[$j]->numeric && ($field[$j]->type !== 'timestamp'))
-					{
-						$values[$j] = $row[$j];
-					}
-					else
-					{
-						$values[$j] = "'" . str_replace($search, $replace, $row[$j]) . "'";
-					}
-				}
-				$query .= implode(', ', $values) . ')';
-
-				$query_len += strlen($query);
-				if ($query_len > $max_len)
-				{
-					$this->flush($query . ";\n\n");
-					$query = '';
-					$query_len = 0;
-					$first_set = true;
-				}
-				else
-				{
-					$first_set = false;
-				}
-			}
-			mysql_free_result($result);
-
-			// check to make sure we have nothing left to flush
-			if (!$first_set && $query)
-			{
-				$this->flush($query . ";\n\n");
-			}
-		}
-	}
-
-	function new_write_table($table_name)
-	{
-		global $db;
-
-		$sql = 'SHOW CREATE TABLE ' . $table_name;
-		$result = $db->sql_query($sql);
-		$row = $db->sql_fetchrow($result);
-
-		$sql_data = '# Table: ' . $table_name . "\n";
-		$sql_data .= "DROP TABLE IF EXISTS $table_name;\n";
-		$this->flush($sql_data . $row['Create Table'] . ";\n\n");
-
-		$db->sql_freeresult($result);
-	}
-
-	function old_write_table($table_name)
-	{
-		global $db;
-
-		$sql_data = '# Table: ' . $table_name . "\n";
-		$sql_data .= "DROP TABLE IF EXISTS $table_name;\n";
-		$sql_data .= "CREATE TABLE $table_name(\n";
-		$rows = array();
-
-		$sql = "SHOW FIELDS
-			FROM $table_name";
-		$result = $db->sql_query($sql);
-
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$line = '   ' . $row['Field'] . ' ' . $row['Type'];
-
-			if (!is_null($row['Default']))
-			{
-				$line .= " DEFAULT '{$row['Default']}'";
-			}
-
-			if ($row['Null'] != 'YES')
-			{
-				$line .= ' NOT NULL';
-			}
-
-			if ($row['Extra'] != '')
-			{
-				$line .= ' ' . $row['Extra'];
-			}
-
-			$rows[] = $line;
-		}
-		$db->sql_freeresult($result);
-
-		$sql = "SHOW KEYS
-			FROM $table_name";
-
-		$result = $db->sql_query($sql);
-
-		$index = array();
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$kname = $row['Key_name'];
-
-			if ($kname != 'PRIMARY')
-			{
-				if ($row['Non_unique'] == 0)
-				{
-					$kname = "UNIQUE|$kname";
-				}
-			}
-
-			if ($row['Sub_part'])
-			{
-				$row['Column_name'] .= '(' . $row['Sub_part'] . ')';
-			}
-			$index[$kname][] = $row['Column_name'];
-		}
-		$db->sql_freeresult($result);
-
-		foreach ($index as $key => $columns)
-		{
-			$line = '   ';
-
-			if ($key == 'PRIMARY')
-			{
-				$line .= 'PRIMARY KEY (' . implode(', ', $columns) . ')';
-			}
-			else if (strpos($key, 'UNIQUE') === 0)
-			{
-				$line .= 'UNIQUE ' . substr($key, 7) . ' (' . implode(', ', $columns) . ')';
-			}
-			else if (strpos($key, 'FULLTEXT') === 0)
-			{
-				$line .= 'FULLTEXT ' . substr($key, 9) . ' (' . implode(', ', $columns) . ')';
-			}
-			else
-			{
-				$line .= "KEY $key (" . implode(', ', $columns) . ')';
-			}
-
-			$rows[] = $line;
-		}
-
-		$sql_data .= implode(",\n", $rows);
-		$sql_data .= "\n);\n\n";
-
-		$this->flush($sql_data);
-	}
-}
-
-class sqlite_extractor extends base_extractor
-{
-	function write_start($prefix)
-	{
-		$sql_data = "--\n";
-		$sql_data .= "-- phpBB Backup Script\n";
-		$sql_data .= "-- Dump of tables for $prefix\n";
-		$sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
-		$sql_data .= "--\n";
-		$sql_data .= "BEGIN TRANSACTION;\n";
-		$this->flush($sql_data);
-	}
-
-	function write_table($table_name)
-	{
-		global $db;
-		$sql_data = '-- Table: ' . $table_name . "\n";
-		$sql_data .= "DROP TABLE $table_name;\n";
-
-		$sql = "SELECT sql
-			FROM sqlite_master
-			WHERE type = 'table'
-				AND name = '" . $db->sql_escape($table_name) . "'
-			ORDER BY type DESC, name;";
-		$result = $db->sql_query($sql);
-		$row = $db->sql_fetchrow($result);
-		$db->sql_freeresult($result);
-
-		// Create Table
-		$sql_data .= $row['sql'] . ";\n";
-
-		$result = $db->sql_query("PRAGMA index_list('" . $db->sql_escape($table_name) . "');");
-
-		$ar = array();
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$ar[] = $row;
-		}
-		$db->sql_freeresult($result);
-
-		foreach ($ar as $value)
-		{
-			if (strpos($value['name'], 'autoindex') !== false)
-			{
-				continue;
-			}
-
-			$result = $db->sql_query("PRAGMA index_info('" . $db->sql_escape($value['name']) . "');");
-
-			$fields = array();
-			while ($row = $db->sql_fetchrow($result))
-			{
-				$fields[] = $row['name'];
-			}
-			$db->sql_freeresult($result);
-
-			$sql_data .= 'CREATE ' . ($value['unique'] ? 'UNIQUE ' : '') . 'INDEX ' . $value['name'] . ' on ' . $table_name . ' (' . implode(', ', $fields) . ");\n";
-		}
-
-		$this->flush($sql_data . "\n");
-	}
-
-	function write_data($table_name)
-	{
-		global $db;
-
-		$col_types = sqlite_fetch_column_types($db->get_db_connect_id(), $table_name);
-
-		$sql = "SELECT *
-			FROM $table_name";
-		$result = sqlite_unbuffered_query($db->get_db_connect_id(), $sql);
-		$rows = sqlite_fetch_all($result, SQLITE_ASSOC);
-		$sql_insert = 'INSERT INTO ' . $table_name . ' (' . implode(', ', array_keys($col_types)) . ') VALUES (';
-		foreach ($rows as $row)
-		{
-			foreach ($row as $column_name => $column_data)
-			{
-				if (is_null($column_data))
-				{
-					$row[$column_name] = 'NULL';
-				}
-				else if ($column_data == '')
-				{
-					$row[$column_name] = "''";
-				}
-				else if (strpos($col_types[$column_name], 'text') !== false || strpos($col_types[$column_name], 'char') !== false || strpos($col_types[$column_name], 'blob') !== false)
-				{
-					$row[$column_name] = sanitize_data_generic(str_replace("'", "''", $column_data));
-				}
-			}
-			$this->flush($sql_insert . implode(', ', $row) . ");\n");
-		}
-	}
-
-	function write_end()
-	{
-		$this->flush("COMMIT;\n");
-		parent::write_end();
-	}
-}
-
-class sqlite3_extractor extends base_extractor
-{
-	function write_start($prefix)
-	{
-		$sql_data = "--\n";
-		$sql_data .= "-- phpBB Backup Script\n";
-		$sql_data .= "-- Dump of tables for $prefix\n";
-		$sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
-		$sql_data .= "--\n";
-		$sql_data .= "BEGIN TRANSACTION;\n";
-		$this->flush($sql_data);
-	}
-
-	function write_table($table_name)
-	{
-		global $db;
-		$sql_data = '-- Table: ' . $table_name . "\n";
-		$sql_data .= "DROP TABLE $table_name;\n";
-
-		$sql = "SELECT sql
-			FROM sqlite_master
-			WHERE type = 'table'
-				AND name = '" . $db->sql_escape($table_name) . "'
-			ORDER BY name ASC;";
-		$result = $db->sql_query($sql);
-		$row = $db->sql_fetchrow($result);
-		$db->sql_freeresult($result);
-
-		// Create Table
-		$sql_data .= $row['sql'] . ";\n";
-
-		$result = $db->sql_query("PRAGMA index_list('" . $db->sql_escape($table_name) . "');");
-
-		while ($row = $db->sql_fetchrow($result))
-		{
-			if (strpos($row['name'], 'autoindex') !== false)
-			{
-				continue;
-			}
-
-			$result2 = $db->sql_query("PRAGMA index_info('" . $db->sql_escape($row['name']) . "');");
-
-			$fields = array();
-			while ($row2 = $db->sql_fetchrow($result2))
-			{
-				$fields[] = $row2['name'];
-			}
-			$db->sql_freeresult($result2);
-
-			$sql_data .= 'CREATE ' . ($row['unique'] ? 'UNIQUE ' : '') . 'INDEX ' . $row['name'] . ' ON ' . $table_name . ' (' . implode(', ', $fields) . ");\n";
-		}
-		$db->sql_freeresult($result);
-
-		$this->flush($sql_data . "\n");
-	}
-
-	function write_data($table_name)
-	{
-		global $db;
-
-		$result = $db->sql_query("PRAGMA table_info('" . $db->sql_escape($table_name) . "');");
-
-		$col_types = array();
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$col_types[$row['name']] = $row['type'];
-		}
-		$db->sql_freeresult($result);
-
-		$sql_insert = 'INSERT INTO ' . $table_name . ' (' . implode(', ', array_keys($col_types)) . ') VALUES (';
-
-		$sql = "SELECT *
-			FROM $table_name";
-		$result = $db->sql_query($sql);
-
-		while ($row = $db->sql_fetchrow($result))
-		{
-			foreach ($row as $column_name => $column_data)
-			{
-				if (is_null($column_data))
-				{
-					$row[$column_name] = 'NULL';
-				}
-				else if ($column_data === '')
-				{
-					$row[$column_name] = "''";
-				}
-				else if (stripos($col_types[$column_name], 'text') !== false || stripos($col_types[$column_name], 'char') !== false || stripos($col_types[$column_name], 'blob') !== false)
-				{
-					$row[$column_name] = sanitize_data_generic(str_replace("'", "''", $column_data));
-				}
-			}
-			$this->flush($sql_insert . implode(', ', $row) . ");\n");
-		}
-	}
-
-	function write_end()
-	{
-		$this->flush("COMMIT;\n");
-		parent::write_end();
-	}
-}
-
-class postgres_extractor extends base_extractor
-{
-	function write_start($prefix)
-	{
-		$sql_data = "--\n";
-		$sql_data .= "-- phpBB Backup Script\n";
-		$sql_data .= "-- Dump of tables for $prefix\n";
-		$sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
-		$sql_data .= "--\n";
-		$sql_data .= "BEGIN TRANSACTION;\n";
-		$this->flush($sql_data);
-	}
-
-	function write_table($table_name)
-	{
-		global $db;
-		static $domains_created = array();
-
-		$sql = "SELECT a.domain_name, a.data_type, a.character_maximum_length, a.domain_default
-			FROM INFORMATION_SCHEMA.domains a, INFORMATION_SCHEMA.column_domain_usage b
-			WHERE a.domain_name = b.domain_name
-				AND b.table_name = '{$table_name}'";
-		$result = $db->sql_query($sql);
-		while ($row = $db->sql_fetchrow($result))
-		{
-			if (empty($domains_created[$row['domain_name']]))
-			{
-				$domains_created[$row['domain_name']] = true;
-				//$sql_data = "DROP DOMAIN {$row['domain_name']};\n";
-				$sql_data = "CREATE DOMAIN {$row['domain_name']} as {$row['data_type']}";
-				if (!empty($row['character_maximum_length']))
-				{
-					$sql_data .= '(' . $row['character_maximum_length'] . ')';
-				}
-				$sql_data .= ' NOT NULL';
-				if (!empty($row['domain_default']))
-				{
-					$sql_data .= ' DEFAULT ' . $row['domain_default'];
-				}
-				$this->flush($sql_data . ";\n");
-			}
-		}
-		$db->sql_freeresult($result);
-
-		$sql_data = '-- Table: ' . $table_name . "\n";
-		$sql_data .= "DROP TABLE $table_name;\n";
-		// PGSQL does not "tightly" bind sequences and tables, we must guess...
-		$sql = "SELECT relname
-			FROM pg_class
-			WHERE relkind = 'S'
-				AND relname = '{$table_name}_seq'";
-		$result = $db->sql_query($sql);
-		// We don't even care about storing the results. We already know the answer if we get rows back.
-		if ($db->sql_fetchrow($result))
-		{
-			$sql_data .= "DROP SEQUENCE {$table_name}_seq;\n";
-			$sql_data .= "CREATE SEQUENCE {$table_name}_seq;\n";
-		}
-		$db->sql_freeresult($result);
-
-		$field_query = "SELECT a.attnum, a.attname as field, t.typname as type, a.attlen as length, a.atttypmod as lengthvar, a.attnotnull as notnull
-			FROM pg_class c, pg_attribute a, pg_type t
-			WHERE c.relname = '" . $db->sql_escape($table_name) . "'
-				AND a.attnum > 0
-				AND a.attrelid = c.oid
-				AND a.atttypid = t.oid
-			ORDER BY a.attnum";
-		$result = $db->sql_query($field_query);
-
-		$sql_data .= "CREATE TABLE $table_name(\n";
-		$lines = array();
-		while ($row = $db->sql_fetchrow($result))
-		{
-			// Get the data from the table
-			$sql_get_default = "SELECT pg_get_expr(d.adbin, d.adrelid) as rowdefault
-				FROM pg_attrdef d, pg_class c
-				WHERE (c.relname = '" . $db->sql_escape($table_name) . "')
-					AND (c.oid = d.adrelid)
-					AND d.adnum = " . $row['attnum'];
-			$def_res = $db->sql_query($sql_get_default);
-			$def_row = $db->sql_fetchrow($def_res);
-			$db->sql_freeresult($def_res);
-
-			if (empty($def_row))
-			{
-				unset($row['rowdefault']);
-			}
-			else
-			{
-				$row['rowdefault'] = $def_row['rowdefault'];
-			}
-
-			if ($row['type'] == 'bpchar')
-			{
-				// Internally stored as bpchar, but isn't accepted in a CREATE TABLE statement.
-				$row['type'] = 'char';
-			}
-
-			$line = '  ' . $row['field'] . ' ' . $row['type'];
-
-			if (strpos($row['type'], 'char') !== false)
-			{
-				if ($row['lengthvar'] > 0)
-				{
-					$line .= '(' . ($row['lengthvar'] - 4) . ')';
-				}
-			}
-
-			if (strpos($row['type'], 'numeric') !== false)
-			{
-				$line .= '(';
-				$line .= sprintf("%s,%s", (($row['lengthvar'] >> 16) & 0xffff), (($row['lengthvar'] - 4) & 0xffff));
-				$line .= ')';
-			}
-
-			if (isset($row['rowdefault']))
-			{
-				$line .= ' DEFAULT ' . $row['rowdefault'];
-			}
-
-			if ($row['notnull'] == 't')
-			{
-				$line .= ' NOT NULL';
-			}
-
-			$lines[] = $line;
-		}
-		$db->sql_freeresult($result);
-
-		// Get the listing of primary keys.
-		$sql_pri_keys = "SELECT ic.relname as index_name, bc.relname as tab_name, ta.attname as column_name, i.indisunique as unique_key, i.indisprimary as primary_key
-			FROM pg_class bc, pg_class ic, pg_index i, pg_attribute ta, pg_attribute ia
-			WHERE (bc.oid = i.indrelid)
-				AND (ic.oid = i.indexrelid)
-				AND (ia.attrelid = i.indexrelid)
-				AND	(ta.attrelid = bc.oid)
-				AND (bc.relname = '" . $db->sql_escape($table_name) . "')
-				AND (ta.attrelid = i.indrelid)
-				AND (ta.attnum = i.indkey[ia.attnum-1])
-			ORDER BY index_name, tab_name, column_name";
-
-		$result = $db->sql_query($sql_pri_keys);
-
-		$index_create = $index_rows = $primary_key = array();
-
-		// We do this in two steps. It makes placing the comma easier
-		while ($row = $db->sql_fetchrow($result))
-		{
-			if ($row['primary_key'] == 't')
-			{
-				$primary_key[] = $row['column_name'];
-				$primary_key_name = $row['index_name'];
-			}
-			else
-			{
-				// We have to store this all this info because it is possible to have a multi-column key...
-				// we can loop through it again and build the statement
-				$index_rows[$row['index_name']]['table'] = $table_name;
-				$index_rows[$row['index_name']]['unique'] = ($row['unique_key'] == 't') ? true : false;
-				$index_rows[$row['index_name']]['column_names'][] = $row['column_name'];
-			}
-		}
-		$db->sql_freeresult($result);
-
-		if (!empty($index_rows))
-		{
-			foreach ($index_rows as $idx_name => $props)
-			{
-				$index_create[] = 'CREATE ' . ($props['unique'] ? 'UNIQUE ' : '') . "INDEX $idx_name ON $table_name (" . implode(', ', $props['column_names']) . ");";
-			}
-		}
-
-		if (!empty($primary_key))
-		{
-			$lines[] = "  CONSTRAINT $primary_key_name PRIMARY KEY (" . implode(', ', $primary_key) . ")";
-		}
-
-		// Generate constraint clauses for CHECK constraints
-		$sql_checks = "SELECT conname as index_name, consrc
-			FROM pg_constraint, pg_class bc
-			WHERE conrelid = bc.oid
-				AND bc.relname = '" . $db->sql_escape($table_name) . "'
-				AND NOT EXISTS (
-					SELECT *
-						FROM pg_constraint as c, pg_inherits as i
-						WHERE i.inhrelid = pg_constraint.conrelid
-							AND c.conname = pg_constraint.conname
-							AND c.consrc = pg_constraint.consrc
-							AND c.conrelid = i.inhparent
-				)";
-		$result = $db->sql_query($sql_checks);
-
-		// Add the constraints to the sql file.
-		while ($row = $db->sql_fetchrow($result))
-		{
-			if (!is_null($row['consrc']))
-			{
-				$lines[] = '  CONSTRAINT ' . $row['index_name'] . ' CHECK ' . $row['consrc'];
-			}
-		}
-		$db->sql_freeresult($result);
-
-		$sql_data .= implode(", \n", $lines);
-		$sql_data .= "\n);\n";
-
-		if (!empty($index_create))
-		{
-			$sql_data .= implode("\n", $index_create) . "\n\n";
-		}
-		$this->flush($sql_data);
-	}
-
-	function write_data($table_name)
-	{
-		global $db;
-		// Grab all of the data from current table.
-		$sql = "SELECT *
-			FROM $table_name";
-		$result = $db->sql_query($sql);
-
-		$i_num_fields = pg_num_fields($result);
-		$seq = '';
-
-		for ($i = 0; $i < $i_num_fields; $i++)
-		{
-			$ary_type[] = pg_field_type($result, $i);
-			$ary_name[] = pg_field_name($result, $i);
-
-			$sql = "SELECT pg_get_expr(d.adbin, d.adrelid) as rowdefault
-				FROM pg_attrdef d, pg_class c
-				WHERE (c.relname = '{$table_name}')
-					AND (c.oid = d.adrelid)
-					AND d.adnum = " . strval($i + 1);
-			$result2 = $db->sql_query($sql);
-			if ($row = $db->sql_fetchrow($result2))
-			{
-				// Determine if we must reset the sequences
-				if (strpos($row['rowdefault'], "nextval('") === 0)
-				{
-					$seq .= "SELECT SETVAL('{$table_name}_seq',(select case when max({$ary_name[$i]})>0 then max({$ary_name[$i]})+1 else 1 end FROM {$table_name}));\n";
-				}
-			}
-		}
-
-		$this->flush("COPY $table_name (" . implode(', ', $ary_name) . ') FROM stdin;' . "\n");
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$schema_vals = array();
-
-			// Build the SQL statement to recreate the data.
-			for ($i = 0; $i < $i_num_fields; $i++)
-			{
-				$str_val = $row[$ary_name[$i]];
-
-				if (preg_match('#char|text|bool|bytea#i', $ary_type[$i]))
-				{
-					$str_val = str_replace(array("\n", "\t", "\r", "\b", "\f", "\v"), array('\n', '\t', '\r', '\b', '\f', '\v'), addslashes($str_val));
-					$str_empty = '';
-				}
-				else
-				{
-					$str_empty = '\N';
-				}
-
-				if (empty($str_val) && $str_val !== '0')
-				{
-					$str_val = $str_empty;
-				}
-
-				$schema_vals[] = $str_val;
-			}
-
-			// Take the ordered fields and their associated data and build it
-			// into a valid sql statement to recreate that field in the data.
-			$this->flush(implode("\t", $schema_vals) . "\n");
-		}
-		$db->sql_freeresult($result);
-		$this->flush("\\.\n");
-
-		// Write out the sequence statements
-		$this->flush($seq);
-	}
-
-	function write_end()
-	{
-		$this->flush("COMMIT;\n");
-		parent::write_end();
-	}
-}
-
-class mssql_extractor extends base_extractor
-{
-	function write_end()
-	{
-		$this->flush("COMMIT\nGO\n");
-		parent::write_end();
-	}
-
-	function write_start($prefix)
-	{
-		$sql_data = "--\n";
-		$sql_data .= "-- phpBB Backup Script\n";
-		$sql_data .= "-- Dump of tables for $prefix\n";
-		$sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
-		$sql_data .= "--\n";
-		$sql_data .= "BEGIN TRANSACTION\n";
-		$sql_data .= "GO\n";
-		$this->flush($sql_data);
-	}
-
-	function write_table($table_name)
-	{
-		global $db;
-		$sql_data = '-- Table: ' . $table_name . "\n";
-		$sql_data .= "IF OBJECT_ID(N'$table_name', N'U') IS NOT NULL\n";
-		$sql_data .= "DROP TABLE $table_name;\n";
-		$sql_data .= "GO\n";
-		$sql_data .= "\nCREATE TABLE [$table_name] (\n";
-		$rows = array();
-
-		$text_flag = false;
-
-		$sql = "SELECT COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') as IS_IDENTITY
-			FROM INFORMATION_SCHEMA.COLUMNS
-			WHERE TABLE_NAME = '$table_name'";
-		$result = $db->sql_query($sql);
-
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$line = "\t[{$row['COLUMN_NAME']}] [{$row['DATA_TYPE']}]";
-
-			if ($row['DATA_TYPE'] == 'text')
-			{
-				$text_flag = true;
-			}
-
-			if ($row['IS_IDENTITY'])
-			{
-				$line .= ' IDENTITY (1 , 1)';
-			}
-
-			if ($row['CHARACTER_MAXIMUM_LENGTH'] && $row['DATA_TYPE'] !== 'text')
-			{
-				$line .= ' (' . $row['CHARACTER_MAXIMUM_LENGTH'] . ')';
-			}
-
-			if ($row['IS_NULLABLE'] == 'YES')
-			{
-				$line .= ' NULL';
-			}
-			else
-			{
-				$line .= ' NOT NULL';
-			}
-
-			if ($row['COLUMN_DEFAULT'])
-			{
-				$line .= ' DEFAULT ' . $row['COLUMN_DEFAULT'];
-			}
-
-			$rows[] = $line;
-		}
-		$db->sql_freeresult($result);
-
-		$sql_data .= implode(",\n", $rows);
-		$sql_data .= "\n) ON [PRIMARY]";
-
-		if ($text_flag)
-		{
-			$sql_data .= " TEXTIMAGE_ON [PRIMARY]";
-		}
-
-		$sql_data .= "\nGO\n\n";
-		$rows = array();
-
-		$sql = "SELECT CONSTRAINT_NAME, COLUMN_NAME
-			FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
-			WHERE TABLE_NAME = '$table_name'";
-		$result = $db->sql_query($sql);
-		while ($row = $db->sql_fetchrow($result))
-		{
-			if (!sizeof($rows))
-			{
-				$sql_data .= "ALTER TABLE [$table_name] WITH NOCHECK ADD\n";
-				$sql_data .= "\tCONSTRAINT [{$row['CONSTRAINT_NAME']}] PRIMARY KEY  CLUSTERED \n\t(\n";
-			}
-			$rows[] = "\t\t[{$row['COLUMN_NAME']}]";
-		}
-		if (sizeof($rows))
-		{
-			$sql_data .= implode(",\n", $rows);
-			$sql_data .= "\n\t)  ON [PRIMARY] \nGO\n";
-		}
-		$db->sql_freeresult($result);
-
-		$index = array();
-		$sql = "EXEC sp_statistics '$table_name'";
-		$result = $db->sql_query($sql);
-		while ($row = $db->sql_fetchrow($result))
-		{
-			if ($row['TYPE'] == 3)
-			{
-				$index[$row['INDEX_NAME']][] = '[' . $row['COLUMN_NAME'] . ']';
-			}
-		}
-		$db->sql_freeresult($result);
-
-		foreach ($index as $index_name => $column_name)
-		{
-			$index[$index_name] = implode(', ', $column_name);
-		}
-
-		foreach ($index as $index_name => $columns)
-		{
-			$sql_data .= "\nCREATE  INDEX [$index_name] ON [$table_name]($columns) ON [PRIMARY]\nGO\n";
-		}
-		$this->flush($sql_data);
-	}
-
-	function write_data($table_name)
-	{
-		global $db;
-
-		if ($db->get_sql_layer() === 'mssql')
-		{
-			$this->write_data_mssql($table_name);
-		}
-		else if ($db->get_sql_layer() === 'mssqlnative')
-		{
-			$this->write_data_mssqlnative($table_name);
-		}
-		else
-		{
-			$this->write_data_odbc($table_name);
-		}
-	}
-
-	function write_data_mssql($table_name)
-	{
-		global $db;
-		$ary_type = $ary_name = array();
-		$ident_set = false;
-		$sql_data = '';
-
-		// Grab all of the data from current table.
-		$sql = "SELECT *
-			FROM $table_name";
-		$result = $db->sql_query($sql);
-
-		$retrieved_data = mssql_num_rows($result);
-
-		$i_num_fields = mssql_num_fields($result);
-
-		for ($i = 0; $i < $i_num_fields; $i++)
-		{
-			$ary_type[$i] = mssql_field_type($result, $i);
-			$ary_name[$i] = mssql_field_name($result, $i);
-		}
-
-		if ($retrieved_data)
-		{
-			$sql = "SELECT 1 as has_identity
-				FROM INFORMATION_SCHEMA.COLUMNS
-				WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1";
-			$result2 = $db->sql_query($sql);
-			$row2 = $db->sql_fetchrow($result2);
-			if (!empty($row2['has_identity']))
-			{
-				$sql_data .= "\nSET IDENTITY_INSERT $table_name ON\nGO\n";
-				$ident_set = true;
-			}
-			$db->sql_freeresult($result2);
-		}
-
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$schema_vals = $schema_fields = array();
-
-			// Build the SQL statement to recreate the data.
-			for ($i = 0; $i < $i_num_fields; $i++)
-			{
-				$str_val = $row[$ary_name[$i]];
-
-				if (preg_match('#char|text|bool|varbinary#i', $ary_type[$i]))
-				{
-					$str_quote = '';
-					$str_empty = "''";
-					$str_val = sanitize_data_mssql(str_replace("'", "''", $str_val));
-				}
-				else if (preg_match('#date|timestamp#i', $ary_type[$i]))
-				{
-					if (empty($str_val))
-					{
-						$str_quote = '';
-					}
-					else
-					{
-						$str_quote = "'";
-					}
-				}
-				else
-				{
-					$str_quote = '';
-					$str_empty = 'NULL';
-				}
-
-				if (empty($str_val) && $str_val !== '0' && !(is_int($str_val) || is_float($str_val)))
-				{
-					$str_val = $str_empty;
-				}
-
-				$schema_vals[$i] = $str_quote . $str_val . $str_quote;
-				$schema_fields[$i] = $ary_name[$i];
-			}
-
-			// Take the ordered fields and their associated data and build it
-			// into a valid sql statement to recreate that field in the data.
-			$sql_data .= "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ");\nGO\n";
-
-			$this->flush($sql_data);
-			$sql_data = '';
-		}
-		$db->sql_freeresult($result);
-
-		if ($retrieved_data && $ident_set)
-		{
-			$sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\nGO\n";
-		}
-		$this->flush($sql_data);
-	}
-
-	function write_data_mssqlnative($table_name)
-	{
-		global $db;
-		$ary_type = $ary_name = array();
-		$ident_set = false;
-		$sql_data = '';
-
-		// Grab all of the data from current table.
-		$sql = "SELECT * FROM $table_name";
-		$db->mssqlnative_set_query_options(array('Scrollable' => SQLSRV_CURSOR_STATIC));
-		$result = $db->sql_query($sql);
-
-		$retrieved_data = $db->mssqlnative_num_rows($result);
-
-		if (!$retrieved_data)
-		{
-			$db->sql_freeresult($result);
-			return;
-		}
-
-		$sql = "SELECT COLUMN_NAME, DATA_TYPE
-			FROM INFORMATION_SCHEMA.COLUMNS
-			WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = '" . $db->sql_escape($table_name) . "'";
-		$result_fields = $db->sql_query($sql);
-
-		$i_num_fields = 0;
-		while ($row = $db->sql_fetchrow($result_fields))
-		{
-			$ary_type[$i_num_fields] = $row['DATA_TYPE'];
-			$ary_name[$i_num_fields] = $row['COLUMN_NAME'];
-			$i_num_fields++;
-		}
-		$db->sql_freeresult($result_fields);
-
-		$sql = "SELECT 1 as has_identity
-			FROM INFORMATION_SCHEMA.COLUMNS
-			WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1";
-		$result2 = $db->sql_query($sql);
-		$row2 = $db->sql_fetchrow($result2);
-
-		if (!empty($row2['has_identity']))
-		{
-			$sql_data .= "\nSET IDENTITY_INSERT $table_name ON\nGO\n";
-			$ident_set = true;
-		}
-		$db->sql_freeresult($result2);
-
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$schema_vals = $schema_fields = array();
-
-			// Build the SQL statement to recreate the data.
-			for ($i = 0; $i < $i_num_fields; $i++)
-			{
-				$str_val = $row[$ary_name[$i]];
-
-				// defaults to type number - better quote just to be safe, so check for is_int too
-				if (is_int($ary_type[$i]) || preg_match('#char|text|bool|varbinary#i', $ary_type[$i]))
-				{
-					$str_quote = '';
-					$str_empty = "''";
-					$str_val = sanitize_data_mssql(str_replace("'", "''", $str_val));
-				}
-				else if (preg_match('#date|timestamp#i', $ary_type[$i]))
-				{
-					if (empty($str_val))
-					{
-						$str_quote = '';
-					}
-					else
-					{
-						$str_quote = "'";
-					}
-				}
-				else
-				{
-					$str_quote = '';
-					$str_empty = 'NULL';
-				}
-
-				if (empty($str_val) && $str_val !== '0' && !(is_int($str_val) || is_float($str_val)))
-				{
-					$str_val = $str_empty;
-				}
-
-				$schema_vals[$i] = $str_quote . $str_val . $str_quote;
-				$schema_fields[$i] = $ary_name[$i];
-			}
-
-			// Take the ordered fields and their associated data and build it
-			// into a valid sql statement to recreate that field in the data.
-			$sql_data .= "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ");\nGO\n";
-
-			$this->flush($sql_data);
-			$sql_data = '';
-		}
-		$db->sql_freeresult($result);
-
-		if ($ident_set)
-		{
-			$sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\nGO\n";
-		}
-		$this->flush($sql_data);
-	}
-
-	function write_data_odbc($table_name)
-	{
-		global $db;
-		$ary_type = $ary_name = array();
-		$ident_set = false;
-		$sql_data = '';
-
-		// Grab all of the data from current table.
-		$sql = "SELECT *
-			FROM $table_name";
-		$result = $db->sql_query($sql);
-
-		$retrieved_data = odbc_num_rows($result);
-
-		if ($retrieved_data)
-		{
-			$sql = "SELECT 1 as has_identity
-				FROM INFORMATION_SCHEMA.COLUMNS
-				WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1";
-			$result2 = $db->sql_query($sql);
-			$row2 = $db->sql_fetchrow($result2);
-			if (!empty($row2['has_identity']))
-			{
-				$sql_data .= "\nSET IDENTITY_INSERT $table_name ON\nGO\n";
-				$ident_set = true;
-			}
-			$db->sql_freeresult($result2);
-		}
-
-		$i_num_fields = odbc_num_fields($result);
-
-		for ($i = 0; $i < $i_num_fields; $i++)
-		{
-			$ary_type[$i] = odbc_field_type($result, $i + 1);
-			$ary_name[$i] = odbc_field_name($result, $i + 1);
-		}
-
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$schema_vals = $schema_fields = array();
-
-			// Build the SQL statement to recreate the data.
-			for ($i = 0; $i < $i_num_fields; $i++)
-			{
-				$str_val = $row[$ary_name[$i]];
-
-				if (preg_match('#char|text|bool|varbinary#i', $ary_type[$i]))
-				{
-					$str_quote = '';
-					$str_empty = "''";
-					$str_val = sanitize_data_mssql(str_replace("'", "''", $str_val));
-				}
-				else if (preg_match('#date|timestamp#i', $ary_type[$i]))
-				{
-					if (empty($str_val))
-					{
-						$str_quote = '';
-					}
-					else
-					{
-						$str_quote = "'";
-					}
-				}
-				else
-				{
-					$str_quote = '';
-					$str_empty = 'NULL';
-				}
-
-				if (empty($str_val) && $str_val !== '0' && !(is_int($str_val) || is_float($str_val)))
-				{
-					$str_val = $str_empty;
-				}
-
-				$schema_vals[$i] = $str_quote . $str_val . $str_quote;
-				$schema_fields[$i] = $ary_name[$i];
-			}
-
-			// Take the ordered fields and their associated data and build it
-			// into a valid sql statement to recreate that field in the data.
-			$sql_data .= "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ");\nGO\n";
-
-			$this->flush($sql_data);
-
-			$sql_data = '';
-
-		}
-		$db->sql_freeresult($result);
-
-		if ($retrieved_data && $ident_set)
-		{
-			$sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\nGO\n";
-		}
-		$this->flush($sql_data);
-	}
-
-}
-
-class oracle_extractor extends base_extractor
-{
-	function write_table($table_name)
-	{
-		global $db;
-		$sql_data = '-- Table: ' . $table_name . "\n";
-		$sql_data .= "DROP TABLE $table_name\n/\n";
-		$sql_data .= "\nCREATE TABLE $table_name (\n";
-
-		$sql = "SELECT COLUMN_NAME, DATA_TYPE, DATA_PRECISION, DATA_LENGTH, NULLABLE, DATA_DEFAULT
-			FROM ALL_TAB_COLS
-			WHERE table_name = '{$table_name}'";
-		$result = $db->sql_query($sql);
-
-		$rows = array();
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$line = '  "' . $row['column_name'] . '" ' . $row['data_type'];
-
-			if ($row['data_type'] !== 'CLOB')
-			{
-				if ($row['data_type'] !== 'VARCHAR2' && $row['data_type'] !== 'CHAR')
-				{
-					$line .= '(' . $row['data_precision'] . ')';
-				}
-				else
-				{
-					$line .= '(' . $row['data_length'] . ')';
-				}
-			}
-
-			if (!empty($row['data_default']))
-			{
-				$line .= ' DEFAULT ' . $row['data_default'];
-			}
-
-			if ($row['nullable'] == 'N')
-			{
-				$line .= ' NOT NULL';
-			}
-			$rows[] = $line;
-		}
-		$db->sql_freeresult($result);
-
-		$sql = "SELECT A.CONSTRAINT_NAME, A.COLUMN_NAME
-			FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B
-			WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
-				AND B.CONSTRAINT_TYPE = 'P'
-				AND A.TABLE_NAME = '{$table_name}'";
-		$result = $db->sql_query($sql);
-
-		$primary_key = array();
-		$contraint_name = '';
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$constraint_name = '"' . $row['constraint_name'] . '"';
-			$primary_key[] = '"' . $row['column_name'] . '"';
-		}
-		$db->sql_freeresult($result);
-
-		if (sizeof($primary_key))
-		{
-			$rows[] = "  CONSTRAINT {$constraint_name} PRIMARY KEY (" . implode(', ', $primary_key) . ')';
-		}
-
-		$sql = "SELECT A.CONSTRAINT_NAME, A.COLUMN_NAME
-			FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B
-			WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
-				AND B.CONSTRAINT_TYPE = 'U'
-				AND A.TABLE_NAME = '{$table_name}'";
-		$result = $db->sql_query($sql);
-
-		$unique = array();
-		$contraint_name = '';
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$constraint_name = '"' . $row['constraint_name'] . '"';
-			$unique[] = '"' . $row['column_name'] . '"';
-		}
-		$db->sql_freeresult($result);
-
-		if (sizeof($unique))
-		{
-			$rows[] = "  CONSTRAINT {$constraint_name} UNIQUE (" . implode(', ', $unique) . ')';
-		}
-
-		$sql_data .= implode(",\n", $rows);
-		$sql_data .= "\n)\n/\n";
-
-		$sql = "SELECT A.REFERENCED_NAME, C.*
-			FROM USER_DEPENDENCIES A, USER_TRIGGERS B, USER_SEQUENCES C
-			WHERE A.REFERENCED_TYPE = 'SEQUENCE'
-				AND A.NAME = B.TRIGGER_NAME
-				AND B.TABLE_NAME = '{$table_name}'
-				AND C.SEQUENCE_NAME = A.REFERENCED_NAME";
-		$result = $db->sql_query($sql);
-
-		$type = request_var('type', '');
-
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$sql_data .= "\nDROP SEQUENCE \"{$row['referenced_name']}\"\n/\n";
-			$sql_data .= "\nCREATE SEQUENCE \"{$row['referenced_name']}\"";
-
-			if ($type == 'full')
-			{
-				$sql_data .= ' START WITH ' . $row['last_number'];
-			}
-
-			$sql_data .= "\n/\n";
-		}
-		$db->sql_freeresult($result);
-
-		$sql = "SELECT DESCRIPTION, WHEN_CLAUSE, TRIGGER_BODY
-			FROM USER_TRIGGERS
-			WHERE TABLE_NAME = '{$table_name}'";
-		$result = $db->sql_query($sql);
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$sql_data .= "\nCREATE OR REPLACE TRIGGER {$row['description']}WHEN ({$row['when_clause']})\n{$row['trigger_body']}\n/\n";
-		}
-		$db->sql_freeresult($result);
-
-		$sql = "SELECT A.INDEX_NAME, B.COLUMN_NAME
-			FROM USER_INDEXES A, USER_IND_COLUMNS B
-			WHERE A.UNIQUENESS = 'NONUNIQUE'
-				AND A.INDEX_NAME = B.INDEX_NAME
-				AND B.TABLE_NAME = '{$table_name}'";
-		$result = $db->sql_query($sql);
-
-		$index = array();
-
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$index[$row['index_name']][] = $row['column_name'];
-		}
-
-		foreach ($index as $index_name => $column_names)
-		{
-			$sql_data .= "\nCREATE INDEX $index_name ON $table_name(" . implode(', ', $column_names) . ")\n/\n";
-		}
-		$db->sql_freeresult($result);
-		$this->flush($sql_data);
-	}
-
-	function write_data($table_name)
-	{
-		global $db;
-		$ary_type = $ary_name = array();
-
-		// Grab all of the data from current table.
-		$sql = "SELECT *
-			FROM $table_name";
-		$result = $db->sql_query($sql);
-
-		$i_num_fields = ocinumcols($result);
-
-		for ($i = 0; $i < $i_num_fields; $i++)
-		{
-			$ary_type[$i] = ocicolumntype($result, $i + 1);
-			$ary_name[$i] = ocicolumnname($result, $i + 1);
-		}
-
-		$sql_data = '';
-
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$schema_vals = $schema_fields = array();
-
-			// Build the SQL statement to recreate the data.
-			for ($i = 0; $i < $i_num_fields; $i++)
-			{
-				// Oracle uses uppercase - we use lowercase
-				$str_val = $row[strtolower($ary_name[$i])];
-
-				if (preg_match('#char|text|bool|raw|clob#i', $ary_type[$i]))
-				{
-					$str_quote = '';
-					$str_empty = "''";
-					$str_val = sanitize_data_oracle($str_val);
-				}
-				else if (preg_match('#date|timestamp#i', $ary_type[$i]))
-				{
-					if (empty($str_val))
-					{
-						$str_quote = '';
-					}
-					else
-					{
-						$str_quote = "'";
-					}
-				}
-				else
-				{
-					$str_quote = '';
-					$str_empty = 'NULL';
-				}
-
-				if (empty($str_val) && $str_val !== '0')
-				{
-					$str_val = $str_empty;
-				}
-
-				$schema_vals[$i] = $str_quote . $str_val . $str_quote;
-				$schema_fields[$i] = '"' . $ary_name[$i] . '"';
-			}
-
-			// Take the ordered fields and their associated data and build it
-			// into a valid sql statement to recreate that field in the data.
-			$sql_data = "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ")\n/\n";
-
-			$this->flush($sql_data);
-		}
-		$db->sql_freeresult($result);
-	}
-
-	function write_start($prefix)
-	{
-		$sql_data = "--\n";
-		$sql_data .= "-- phpBB Backup Script\n";
-		$sql_data .= "-- Dump of tables for $prefix\n";
-		$sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
-		$sql_data .= "--\n";
-		$this->flush($sql_data);
-	}
-}
-
 // get how much space we allow for a chunk of data, very similar to phpMyAdmin's way of doing things ;-) (hey, we only do this for MySQL anyway :P)
 function get_usable_memory()
 {
--- a/includes/acp/acp_disallow.php
+++ b/includes/acp/acp_disallow.php
@@ -25,8 +25,7 @@ class acp_disallow
 
 	function main($id, $mode)
 	{
-		global $db, $user, $auth, $template, $cache;
-		global $config, $phpbb_admin_path;
+		global $db, $user, $template, $cache, $phpbb_log, $request;
 
 		$user->add_lang('acp/posting');
 
@@ -47,7 +46,7 @@ class acp_disallow
 
 		if ($disallow)
 		{
-			$disallowed_user = str_replace('*', '%', utf8_normalize_nfc(request_var('disallowed_user', '', true)));
+			$disallowed_user = str_replace('*', '%', $request->variable('disallowed_user', '', true));
 
 			if (!$disallowed_user)
 			{
@@ -72,13 +71,13 @@ class acp_disallow
 			$cache->destroy('_disallowed_usernames');
 
 			$message = $user->lang['DISALLOW_SUCCESSFUL'];
-			add_log('admin', 'LOG_DISALLOW_ADD', str_replace('%', '*', $disallowed_user));
+			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DISALLOW_ADD', false, array(str_replace('%', '*', $disallowed_user)));
 
 			trigger_error($message . adm_back_link($this->u_action));
 		}
 		else if ($allow)
 		{
-			$disallowed_id = request_var('disallowed_id', 0);
+			$disallowed_id = $request->variable('disallowed_id', 0);
 
 			if (!$disallowed_id)
 			{
@@ -91,7 +90,7 @@ class acp_disallow
 
 			$cache->destroy('_disallowed_usernames');
 
-			add_log('admin', 'LOG_DISALLOW_DELETE');
+			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DISALLOW_DELETE');
 
 			trigger_error($user->lang['DISALLOWED_DELETED'] . adm_back_link($this->u_action));
 		}
--- a/includes/acp/acp_email.php
+++ b/includes/acp/acp_email.php
@@ -25,8 +25,8 @@ class acp_email
 
 	function main($id, $mode)
 	{
-		global $config, $db, $user, $auth, $template, $cache;
-		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix, $phpbb_dispatcher;
+		global $config, $db, $user, $template, $phpbb_log, $request;
+		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $phpbb_dispatcher;
 
 		$user->add_lang('acp/email');
 		$this->tpl_name = 'acp_email';
@@ -39,11 +39,11 @@ class acp_email
 		$submit = (isset($_POST['submit'])) ? true : false;
 		$error = array();
 
-		$usernames	= request_var('usernames', '', true);
+		$usernames	= $request->variable('usernames', '', true);
 		$usernames	= (!empty($usernames)) ? explode("\n", $usernames) : array();
-		$group_id	= request_var('g', 0);
-		$subject	= utf8_normalize_nfc(request_var('subject', '', true));
-		$message	= utf8_normalize_nfc(request_var('message', '', true));
+		$group_id	= $request->variable('g', 0);
+		$subject	= $request->variable('subject', '', true);
+		$message	= $request->variable('message', '', true);
 
 		// Do the job ...
 		if ($submit)
@@ -51,7 +51,7 @@ class acp_email
 			// Error checking needs to go here ... if no subject and/or no message then skip
 			// over the send and return to the form
 			$use_queue		= (isset($_POST['send_immediately'])) ? false : true;
-			$priority		= request_var('mail_priority_flag', MAIL_NORMAL_PRIORITY);
+			$priority		= $request->variable('mail_priority_flag', MAIL_NORMAL_PRIORITY);
 
 			if (!check_form_key($form_key))
 			{
@@ -270,7 +270,7 @@ class acp_email
 				{
 					if (!empty($usernames))
 					{
-						add_log('admin', 'LOG_MASS_EMAIL', implode(', ', utf8_normalize_nfc($usernames)));
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_MASS_EMAIL', false, array(implode(', ', utf8_normalize_nfc($usernames))));
 					}
 					else
 					{
@@ -284,7 +284,7 @@ class acp_email
 							$group_name = $user->lang['ALL_USERS'];
 						}
 
-						add_log('admin', 'LOG_MASS_EMAIL', $group_name);
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_MASS_EMAIL', false, array($group_name));
 					}
 				}
 
--- a/includes/acp/acp_extensions.php
+++ b/includes/acp/acp_extensions.php
@@ -11,6 +11,9 @@
 *
 */
 
+use phpbb\exception\exception_interface;
+use phpbb\exception\version_check_exception;
+
 /**
 * @ignore
 */
@@ -34,7 +37,7 @@ class acp_extensions
 	function main()
 	{
 		// Start the page
-		global $config, $user, $template, $request, $phpbb_extension_manager, $db, $phpbb_root_path, $phpEx, $phpbb_log, $cache;
+		global $config, $user, $template, $request, $phpbb_extension_manager, $db, $phpbb_root_path, $phpbb_log, $cache, $phpbb_dispatcher;
 
 		$this->db = $db;
 		$this->config = $config;
@@ -43,6 +46,7 @@ class acp_extensions
 		$this->cache = $cache;
 		$this->request = $request;
 		$this->log = $phpbb_log;
+		$this->phpbb_dispatcher = $phpbb_dispatcher;
 
 		$user->add_lang(array('install', 'acp/extensions', 'migrator'));
 
@@ -55,6 +59,21 @@ class acp_extensions
 		$safe_time_limit = (ini_get('max_execution_time') / 2);
 		$start_time = time();
 
+		/**
+		* Event to run a specific action on extension
+		*
+		* @event core.acp_extensions_run_action
+		* @var	string	action			Action to run
+		* @var	string	u_action		Url we are at
+		* @var	string	ext_name		Extension name from request
+		* @var	int		safe_time_limit	Safe limit of execution time
+		* @var	int		start_time		Start time
+		* @since 3.1.11-RC1
+		*/
+		$u_action = $this->u_action;
+		$vars = array('action', 'u_action', 'ext_name', 'safe_time_limit', 'start_time');
+		extract($this->phpbb_dispatcher->trigger_event('core.acp_extensions_run_action', compact($vars)));
+
 		// Cancel action
 		if ($request->is_set_post('cancel'))
 		{
@@ -70,15 +89,16 @@ class acp_extensions
 		// If they've specified an extension, let's load the metadata manager and validate it.
 		if ($ext_name)
 		{
-			$md_manager = new \phpbb\extension\metadata_manager($ext_name, $config, $phpbb_extension_manager, $template, $user, $phpbb_root_path);
+			$md_manager = new \phpbb\extension\metadata_manager($ext_name, $config, $phpbb_extension_manager, $phpbb_root_path);
 
 			try
 			{
 				$md_manager->get_metadata('all');
 			}
-			catch (\phpbb\extension\exception $e)
+			catch (exception_interface $e)
 			{
-				trigger_error($e, E_USER_WARNING);
+				$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
+				trigger_error($message, E_USER_WARNING);
 			}
 		}
 
@@ -286,29 +306,39 @@ class acp_extensions
 
 			case 'details':
 				// Output it to the template
-				$md_manager->output_template_data();
+				$md_manager->output_template_data($template);
 
-				try
+				$meta = $md_manager->get_metadata('all');
+				if (isset($meta['extra']['version-check']))
 				{
-					$updates_available = $this->version_check($md_manager, $request->variable('versioncheck_force', false));
+					try
+					{
+						$updates_available = $phpbb_extension_manager->version_check($md_manager, $request->variable('versioncheck_force', false), $this->config['extension_force_unstable'] ? 'unstable' : null);
 
-					$template->assign_vars(array(
-						'S_UP_TO_DATE'		=> empty($updates_available),
-						'S_VERSIONCHECK'	=> true,
-						'UP_TO_DATE_MSG'	=> $this->user->lang(empty($updates_available) ? 'UP_TO_DATE' : 'NOT_UP_TO_DATE', $md_manager->get_metadata('display-name')),
-					));
+						$template->assign_vars(array(
+							'S_UP_TO_DATE' => empty($updates_available),
+							'UP_TO_DATE_MSG' => $this->user->lang(empty($updates_available) ? 'UP_TO_DATE' : 'NOT_UP_TO_DATE', $md_manager->get_metadata('display-name')),
+						));
 
-					foreach ($updates_available as $branch => $version_data)
+						foreach ($updates_available as $branch => $version_data)
+						{
+							$template->assign_block_vars('updates_available', $version_data);
+						}
+					}
+					catch (exception_interface $e)
 					{
-						$template->assign_block_vars('updates_available', $version_data);
+						$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
+
+						$template->assign_vars(array(
+							'S_VERSIONCHECK_FAIL' => true,
+							'VERSIONCHECK_FAIL_REASON' => ($e->getMessage() !== 'VERSIONCHECK_FAIL') ? $message : '',
+						));
 					}
+					$template->assign_var('S_VERSIONCHECK', true);
 				}
-				catch (\RuntimeException $e)
+				else
 				{
-					$template->assign_vars(array(
-						'S_VERSIONCHECK_STATUS'			=> $e->getCode(),
-						'VERSIONCHECK_FAIL_REASON'		=> ($e->getMessage() !== $user->lang('VERSIONCHECK_FAIL')) ? $e->getMessage() : '',
-					));
+					$template->assign_var('S_VERSIONCHECK', false);
 				}
 
 				$template->assign_vars(array(
@@ -333,7 +363,7 @@ class acp_extensions
 
 		foreach ($phpbb_extension_manager->all_enabled() as $name => $location)
 		{
-			$md_manager = $phpbb_extension_manager->create_extension_metadata_manager($name, $this->template);
+			$md_manager = $phpbb_extension_manager->create_extension_metadata_manager($name);
 
 			try
 			{
@@ -343,17 +373,32 @@ class acp_extensions
 					'META_VERSION' => $meta['version'],
 				);
 
-				$force_update = $this->request->variable('versioncheck_force', false);
-				$updates = $this->version_check($md_manager, $force_update, !$force_update);
+				if (isset($meta['extra']['version-check']))
+				{
+					try
+					{
+						$force_update = $this->request->variable('versioncheck_force', false);
+						$updates = $phpbb_extension_manager->version_check($md_manager, $force_update, !$force_update);
 
-				$enabled_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates);
-				$enabled_extension_meta_data[$name]['S_VERSIONCHECK'] = true;
-				$enabled_extension_meta_data[$name]['U_VERSIONCHECK_FORCE'] = $this->u_action . '&amp;action=details&amp;versioncheck_force=1&amp;ext_name=' . urlencode($md_manager->get_metadata('name'));
+						$enabled_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates);
+						$enabled_extension_meta_data[$name]['S_VERSIONCHECK'] = true;
+						$enabled_extension_meta_data[$name]['U_VERSIONCHECK_FORCE'] = $this->u_action . '&amp;action=details&amp;versioncheck_force=1&amp;ext_name=' . urlencode($md_manager->get_metadata('name'));
+					}
+					catch (exception_interface $e)
+					{
+						// Ignore exceptions due to the version check
+					}
+				}
+				else
+				{
+					$enabled_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
+				}
 			}
-			catch (\phpbb\extension\exception $e)
+			catch (exception_interface $e)
 			{
+				$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
 				$this->template->assign_block_vars('disabled', array(
-					'META_DISPLAY_NAME'		=> $this->user->lang('EXTENSION_INVALID_LIST', $name, $e),
+					'META_DISPLAY_NAME'		=> $this->user->lang('EXTENSION_INVALID_LIST', $name, $message),
 					'S_VERSIONCHECK'		=> false,
 				));
 			}
@@ -390,7 +435,7 @@ class acp_extensions
 
 		foreach ($phpbb_extension_manager->all_disabled() as $name => $location)
 		{
-			$md_manager = $phpbb_extension_manager->create_extension_metadata_manager($name, $this->template);
+			$md_manager = $phpbb_extension_manager->create_extension_metadata_manager($name);
 
 			try
 			{
@@ -400,23 +445,35 @@ class acp_extensions
 					'META_VERSION' => $meta['version'],
 				);
 
-				$force_update = $this->request->variable('versioncheck_force', false);
-				$updates = $this->version_check($md_manager, $force_update, !$force_update);
+				if (isset($meta['extra']['version-check']))
+				{
+					$force_update = $this->request->variable('versioncheck_force', false);
+					$updates = $phpbb_extension_manager->version_check($md_manager, $force_update, !$force_update);
 
-				$disabled_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates);
-				$disabled_extension_meta_data[$name]['S_VERSIONCHECK'] = true;
-				$disabled_extension_meta_data[$name]['U_VERSIONCHECK_FORCE'] = $this->u_action . '&amp;action=details&amp;versioncheck_force=1&amp;ext_name=' . urlencode($md_manager->get_metadata('name'));
+					$disabled_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates);
+					$disabled_extension_meta_data[$name]['S_VERSIONCHECK'] = true;
+					$disabled_extension_meta_data[$name]['U_VERSIONCHECK_FORCE'] = $this->u_action . '&amp;action=details&amp;versioncheck_force=1&amp;ext_name=' . urlencode($md_manager->get_metadata('name'));
+				}
+				else
+				{
+					$disabled_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
+				}
 			}
-			catch (\phpbb\extension\exception $e)
+			catch (version_check_exception $e)
 			{
+				$disabled_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
+			}
+			catch (exception_interface $e)
+			{
+				$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
 				$this->template->assign_block_vars('disabled', array(
-					'META_DISPLAY_NAME'		=> $this->user->lang('EXTENSION_INVALID_LIST', $name, $e),
+					'META_DISPLAY_NAME'		=> $this->user->lang('EXTENSION_INVALID_LIST', $name, $message),
 					'S_VERSIONCHECK'		=> false,
 				));
 			}
 			catch (\RuntimeException $e)
 			{
-				$disabeld_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
+				$disabled_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
 			}
 		}
 
@@ -450,7 +507,7 @@ class acp_extensions
 
 		foreach ($uninstalled as $name => $location)
 		{
-			$md_manager = $phpbb_extension_manager->create_extension_metadata_manager($name, $this->template);
+			$md_manager = $phpbb_extension_manager->create_extension_metadata_manager($name);
 
 			try
 			{
@@ -460,24 +517,32 @@ class acp_extensions
 					'META_VERSION' => $meta['version'],
 				);
 
-				$force_update = $this->request->variable('versioncheck_force', false);
-				$updates = $this->version_check($md_manager, $force_update, !$force_update);
+				if (isset($meta['extra']['version-check']))
+				{
+					$force_update = $this->request->variable('versioncheck_force', false);
+					$updates = $phpbb_extension_manager->version_check($md_manager, $force_update, !$force_update);
 
-				$available_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates);
-				$available_extension_meta_data[$name]['S_VERSIONCHECK'] = true;
-				$available_extension_meta_data[$name]['U_VERSIONCHECK_FORCE'] = $this->u_action . '&amp;action=details&amp;versioncheck_force=1&amp;ext_name=' . urlencode($md_manager->get_metadata('name'));
+					$available_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates);
+					$available_extension_meta_data[$name]['S_VERSIONCHECK'] = true;
+					$available_extension_meta_data[$name]['U_VERSIONCHECK_FORCE'] = $this->u_action . '&amp;action=details&amp;versioncheck_force=1&amp;ext_name=' . urlencode($md_manager->get_metadata('name'));
+				}
+				else
+				{
+					$available_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
+				}
 			}
-			catch (\phpbb\extension\exception $e)
+			catch (version_check_exception $e)
 			{
+				$available_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
+			}
+			catch (exception_interface $e)
+			{
+				$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
 				$this->template->assign_block_vars('disabled', array(
-					'META_DISPLAY_NAME'		=> $this->user->lang('EXTENSION_INVALID_LIST', $name, $e),
+					'META_DISPLAY_NAME'		=> $this->user->lang('EXTENSION_INVALID_LIST', $name, $message),
 					'S_VERSIONCHECK'		=> false,
 				));
 			}
-			catch (\RuntimeException $e)
-			{
-				$available_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
-			}
 		}
 
 		uasort($available_extension_meta_data, array($this, 'sort_extension_meta_data_table'));
@@ -513,34 +578,6 @@ class acp_extensions
 		}
 	}
 
-	/**
-	* Check the version and return the available updates.
-	*
-	* @param \phpbb\extension\metadata_manager $md_manager The metadata manager for the version to check.
-	* @param bool $force_update Ignores cached data. Defaults to false.
-	* @param bool $force_cache Force the use of the cache. Override $force_update.
-	* @return string
-	* @throws RuntimeException
-	*/
-	protected function version_check(\phpbb\extension\metadata_manager $md_manager, $force_update = false, $force_cache = false)
-	{
-		$meta = $md_manager->get_metadata('all');
-
-		if (!isset($meta['extra']['version-check']))
-		{
-			throw new \RuntimeException($this->user->lang('NO_VERSIONCHECK'), 1);
-		}
-
-		$version_check = $meta['extra']['version-check'];
-
-		$version_helper = new \phpbb\version_helper($this->cache, $this->config, new \phpbb\file_downloader(), $this->user);
-		$version_helper->set_current_version($meta['version']);
-		$version_helper->set_file_location($version_check['host'], $version_check['directory'], $version_check['filename'], isset($version_check['ssl']) ? $version_check['ssl'] : false);
-		$version_helper->force_stability($this->config['extension_force_unstable'] ? 'unstable' : null);
-
-		return $updates = $version_helper->get_suggested_updates($force_update, $force_cache);
-	}
-
 	/**
 	* Sort helper for the table containing the metadata about the extensions.
 	*/
--- a/includes/acp/acp_forums.php
+++ b/includes/acp/acp_forums.php
@@ -27,7 +27,7 @@ class acp_forums
 	function main($id, $mode)
 	{
 		global $db, $user, $auth, $template, $cache, $request, $phpbb_dispatcher;
-		global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx;
+		global $phpbb_admin_path, $phpbb_root_path, $phpEx, $phpbb_log;
 
 		$user->add_lang('acp/forums');
 		$this->tpl_name = 'acp_forums';
@@ -36,11 +36,11 @@ class acp_forums
 		$form_key = 'acp_forums';
 		add_form_key($form_key);
 
-		$action		= request_var('action', '');
+		$action		= $request->variable('action', '');
 		$update		= (isset($_POST['update'])) ? true : false;
-		$forum_id	= request_var('f', 0);
+		$forum_id	= $request->variable('f', 0);
 
-		$this->parent_id	= request_var('parent_id', 0);
+		$this->parent_id	= $request->variable('parent_id', 0);
 		$forum_data = $errors = array();
 		if ($update && !check_form_key($form_key))
 		{
@@ -52,8 +52,8 @@ class acp_forums
 		switch ($action)
 		{
 			case 'progress_bar':
-				$start = request_var('start', 0);
-				$total = request_var('total', 0);
+				$start = $request->variable('start', 0);
+				$total = $request->variable('total', 0);
 
 				$this->display_progress_bar($start, $total);
 			break;
@@ -83,10 +83,10 @@ class acp_forums
 			switch ($action)
 			{
 				case 'delete':
-					$action_subforums	= request_var('action_subforums', '');
-					$subforums_to_id	= request_var('subforums_to_id', 0);
-					$action_posts		= request_var('action_posts', '');
-					$posts_to_id		= request_var('posts_to_id', 0);
+					$action_subforums	= $request->variable('action_subforums', '');
+					$subforums_to_id	= $request->variable('subforums_to_id', 0);
+					$action_posts		= $request->variable('action_posts', '');
+					$posts_to_id		= $request->variable('posts_to_id', 0);
 
 					$errors = $this->delete_forum($forum_id, $action_posts, $action_subforums, $posts_to_id, $subforums_to_id);
 
@@ -112,45 +112,45 @@ class acp_forums
 				case 'add':
 
 					$forum_data += array(
-						'parent_id'				=> request_var('forum_parent_id', $this->parent_id),
-						'forum_type'			=> request_var('forum_type', FORUM_POST),
-						'type_action'			=> request_var('type_action', ''),
-						'forum_status'			=> request_var('forum_status', ITEM_UNLOCKED),
+						'parent_id'				=> $request->variable('forum_parent_id', $this->parent_id),
+						'forum_type'			=> $request->variable('forum_type', FORUM_POST),
+						'type_action'			=> $request->variable('type_action', ''),
+						'forum_status'			=> $request->variable('forum_status', ITEM_UNLOCKED),
 						'forum_parents'			=> '',
-						'forum_name'			=> utf8_normalize_nfc(request_var('forum_name', '', true)),
-						'forum_link'			=> request_var('forum_link', ''),
-						'forum_link_track'		=> request_var('forum_link_track', false),
-						'forum_desc'			=> utf8_normalize_nfc(request_var('forum_desc', '', true)),
+						'forum_name'			=> $request->variable('forum_name', '', true),
+						'forum_link'			=> $request->variable('forum_link', ''),
+						'forum_link_track'		=> $request->variable('forum_link_track', false),
+						'forum_desc'			=> $request->variable('forum_desc', '', true),
 						'forum_desc_uid'		=> '',
 						'forum_desc_options'	=> 7,
 						'forum_desc_bitfield'	=> '',
-						'forum_rules'			=> utf8_normalize_nfc(request_var('forum_rules', '', true)),
+						'forum_rules'			=> $request->variable('forum_rules', '', true),
 						'forum_rules_uid'		=> '',
 						'forum_rules_options'	=> 7,
 						'forum_rules_bitfield'	=> '',
-						'forum_rules_link'		=> request_var('forum_rules_link', ''),
-						'forum_image'			=> request_var('forum_image', ''),
-						'forum_style'			=> request_var('forum_style', 0),
-						'display_subforum_list'	=> request_var('display_subforum_list', false),
-						'display_on_index'		=> request_var('display_on_index', false),
-						'forum_topics_per_page'	=> request_var('topics_per_page', 0),
-						'enable_indexing'		=> request_var('enable_indexing', true),
-						'enable_icons'			=> request_var('enable_icons', false),
-						'enable_prune'			=> request_var('enable_prune', false),
-						'enable_post_review'	=> request_var('enable_post_review', true),
-						'enable_quick_reply'	=> request_var('enable_quick_reply', false),
-						'enable_shadow_prune'		=> request_var('enable_shadow_prune', false),
-						'prune_days'			=> request_var('prune_days', 7),
-						'prune_viewed'			=> request_var('prune_viewed', 7),
-						'prune_freq'			=> request_var('prune_freq', 1),
-						'prune_old_polls'		=> request_var('prune_old_polls', false),
-						'prune_announce'		=> request_var('prune_announce', false),
-						'prune_sticky'			=> request_var('prune_sticky', false),
-						'prune_shadow_days'		=> request_var('prune_shadow_days', 7),
-						'prune_shadow_freq'		=> request_var('prune_shadow_freq', 1),
-						'forum_password'		=> request_var('forum_password', '', true),
-						'forum_password_confirm'=> request_var('forum_password_confirm', '', true),
-						'forum_password_unset'	=> request_var('forum_password_unset', false),
+						'forum_rules_link'		=> $request->variable('forum_rules_link', ''),
+						'forum_image'			=> $request->variable('forum_image', ''),
+						'forum_style'			=> $request->variable('forum_style', 0),
+						'display_subforum_list'	=> $request->variable('display_subforum_list', false),
+						'display_on_index'		=> $request->variable('display_on_index', false),
+						'forum_topics_per_page'	=> $request->variable('topics_per_page', 0),
+						'enable_indexing'		=> $request->variable('enable_indexing', true),
+						'enable_icons'			=> $request->variable('enable_icons', false),
+						'enable_prune'			=> $request->variable('enable_prune', false),
+						'enable_post_review'	=> $request->variable('enable_post_review', true),
+						'enable_quick_reply'	=> $request->variable('enable_quick_reply', false),
+						'enable_shadow_prune'	=> $request->variable('enable_shadow_prune', false),
+						'prune_days'			=> $request->variable('prune_days', 7),
+						'prune_viewed'			=> $request->variable('prune_viewed', 7),
+						'prune_freq'			=> $request->variable('prune_freq', 1),
+						'prune_old_polls'		=> $request->variable('prune_old_polls', false),
+						'prune_announce'		=> $request->variable('prune_announce', false),
+						'prune_sticky'			=> $request->variable('prune_sticky', false),
+						'prune_shadow_days'		=> $request->variable('prune_shadow_days', 7),
+						'prune_shadow_freq'		=> $request->variable('prune_shadow_freq', 1),
+						'forum_password'		=> $request->variable('forum_password', '', true),
+						'forum_password_confirm'=> $request->variable('forum_password_confirm', '', true),
+						'forum_password_unset'	=> $request->variable('forum_password_unset', false),
 					);
 
 					/**
@@ -173,7 +173,7 @@ class acp_forums
 					// Use link_display_on_index setting if forum type is link
 					if ($forum_data['forum_type'] == FORUM_LINK)
 					{
-						$forum_data['display_on_index'] = request_var('link_display_on_index', false);
+						$forum_data['display_on_index'] = $request->variable('link_display_on_index', false);
 					}
 
 					// Linked forums and categories are not able to be locked...
@@ -182,25 +182,25 @@ class acp_forums
 						$forum_data['forum_status'] = ITEM_UNLOCKED;
 					}
 
-					$forum_data['show_active'] = ($forum_data['forum_type'] == FORUM_POST) ? request_var('display_recent', true) : request_var('display_active', false);
+					$forum_data['show_active'] = ($forum_data['forum_type'] == FORUM_POST) ? $request->variable('display_recent', true) : $request->variable('display_active', false);
 
 					// Get data for forum rules if specified...
 					if ($forum_data['forum_rules'])
 					{
-						generate_text_for_storage($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options'], request_var('rules_parse_bbcode', false), request_var('rules_parse_urls', false), request_var('rules_parse_smilies', false));
+						generate_text_for_storage($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options'], $request->variable('rules_parse_bbcode', false), $request->variable('rules_parse_urls', false), $request->variable('rules_parse_smilies', false));
 					}
 
 					// Get data for forum description if specified
 					if ($forum_data['forum_desc'])
 					{
-						generate_text_for_storage($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_bitfield'], $forum_data['forum_desc_options'], request_var('desc_parse_bbcode', false), request_var('desc_parse_urls', false), request_var('desc_parse_smilies', false));
+						generate_text_for_storage($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_bitfield'], $forum_data['forum_desc_options'], $request->variable('desc_parse_bbcode', false), $request->variable('desc_parse_urls', false), $request->variable('desc_parse_smilies', false));
 					}
 
 					$errors = $this->update_forum_data($forum_data);
 
 					if (!sizeof($errors))
 					{
-						$forum_perm_from = request_var('forum_perm_from', 0);
+						$forum_perm_from = $request->variable('forum_perm_from', 0);
 						$cache->destroy('sql', FORUMS_TABLE);
 
 						$copied_permissions = false;
@@ -266,7 +266,7 @@ class acp_forums
 
 				if ($move_forum_name !== false)
 				{
-					add_log('admin', 'LOG_FORUM_' . strtoupper($action), $row['forum_name'], $move_forum_name);
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_' . strtoupper($action), false, array($row['forum_name'], $move_forum_name));
 					$cache->destroy('sql', FORUMS_TABLE);
 				}
 
@@ -311,7 +311,7 @@ class acp_forums
 					$row2['min_topic_id'] = (int) $row2['min_topic_id'];
 					$row2['max_topic_id'] = (int) $row2['max_topic_id'];
 
-					$start = request_var('start', $row2['min_topic_id']);
+					$start = $request->variable('start', $row2['min_topic_id']);
 
 					$batch_size = 2000;
 					$end = $start + $batch_size;
@@ -327,7 +327,7 @@ class acp_forums
 							WHERE forum_id = ' . $forum_id . '
 								AND topic_id BETWEEN ' . $start . ' AND ' . $end;
 						$result = $db->sql_query($sql);
-						$topics_done = request_var('topics_done', 0) + (int) $db->sql_fetchfield('num_topics');
+						$topics_done = $request->variable('topics_done', 0) + (int) $db->sql_fetchfield('num_topics');
 						$db->sql_freeresult($result);
 
 						$start += $batch_size;
@@ -377,7 +377,8 @@ class acp_forums
 
 				sync('forum', 'forum_id', $forum_id, false, true);
 
-				add_log('admin', 'LOG_FORUM_SYNC', $row['forum_name']);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_SYNC', false, array($row['forum_name']));
+
 				$cache->destroy('sql', FORUMS_TABLE);
 
 				$template->assign_var('L_FORUM_RESYNCED', sprintf($user->lang['FORUM_RESYNCED'], $row['forum_name']));
@@ -390,13 +391,13 @@ class acp_forums
 				if ($update)
 				{
 					$forum_data['forum_flags'] = 0;
-					$forum_data['forum_flags'] += (request_var('forum_link_track', false)) ? FORUM_FLAG_LINK_TRACK : 0;
-					$forum_data['forum_flags'] += (request_var('prune_old_polls', false)) ? FORUM_FLAG_PRUNE_POLL : 0;
-					$forum_data['forum_flags'] += (request_var('prune_announce', false)) ? FORUM_FLAG_PRUNE_ANNOUNCE : 0;
-					$forum_data['forum_flags'] += (request_var('prune_sticky', false)) ? FORUM_FLAG_PRUNE_STICKY : 0;
+					$forum_data['forum_flags'] += ($request->variable('forum_link_track', false)) ? FORUM_FLAG_LINK_TRACK : 0;
+					$forum_data['forum_flags'] += ($request->variable('prune_old_polls', false)) ? FORUM_FLAG_PRUNE_POLL : 0;
+					$forum_data['forum_flags'] += ($request->variable('prune_announce', false)) ? FORUM_FLAG_PRUNE_ANNOUNCE : 0;
+					$forum_data['forum_flags'] += ($request->variable('prune_sticky', false)) ? FORUM_FLAG_PRUNE_STICKY : 0;
 					$forum_data['forum_flags'] += ($forum_data['show_active']) ? FORUM_FLAG_ACTIVE_TOPICS : 0;
-					$forum_data['forum_flags'] += (request_var('enable_post_review', true)) ? FORUM_FLAG_POST_REVIEW : 0;
-					$forum_data['forum_flags'] += (request_var('enable_quick_reply', false)) ? FORUM_FLAG_QUICK_REPLY : 0;
+					$forum_data['forum_flags'] += ($request->variable('enable_post_review', true)) ? FORUM_FLAG_POST_REVIEW : 0;
+					$forum_data['forum_flags'] += ($request->variable('enable_quick_reply', false)) ? FORUM_FLAG_QUICK_REPLY : 0;
 				}
 
 				// Initialise $row, so we always have it in the event
@@ -444,7 +445,7 @@ class acp_forums
 							'parent_id'				=> $this->parent_id,
 							'forum_type'			=> FORUM_POST,
 							'forum_status'			=> ITEM_UNLOCKED,
-							'forum_name'			=> utf8_normalize_nfc(request_var('forum_name', '', true)),
+							'forum_name'			=> $request->variable('forum_name', '', true),
 							'forum_link'			=> '',
 							'forum_link_track'		=> false,
 							'forum_desc'			=> '',
@@ -511,12 +512,12 @@ class acp_forums
 				{
 					if (!isset($forum_data['forum_rules_uid']))
 					{
-						// Before we are able to display the preview and plane text, we need to parse our request_var()'d value...
+						// Before we are able to display the preview and plane text, we need to parse our $request->variable()'d value...
 						$forum_data['forum_rules_uid'] = '';
 						$forum_data['forum_rules_bitfield'] = '';
 						$forum_data['forum_rules_options'] = 0;
 
-						generate_text_for_storage($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options'], request_var('rules_allow_bbcode', false), request_var('rules_allow_urls', false), request_var('rules_allow_smilies', false));
+						generate_text_for_storage($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options'], $request->variable('rules_allow_bbcode', false), $request->variable('rules_allow_urls', false), $request->variable('rules_allow_smilies', false));
 					}
 
 					// Generate preview content
@@ -531,12 +532,12 @@ class acp_forums
 				{
 					if (!isset($forum_data['forum_desc_uid']))
 					{
-						// Before we are able to display the preview and plane text, we need to parse our request_var()'d value...
+						// Before we are able to display the preview and plane text, we need to parse our $request->variable()'d value...
 						$forum_data['forum_desc_uid'] = '';
 						$forum_data['forum_desc_bitfield'] = '';
 						$forum_data['forum_desc_options'] = 0;
 
-						generate_text_for_storage($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_bitfield'], $forum_data['forum_desc_options'], request_var('desc_allow_bbcode', false), request_var('desc_allow_urls', false), request_var('desc_allow_smilies', false));
+						generate_text_for_storage($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_bitfield'], $forum_data['forum_desc_options'], $request->variable('desc_allow_bbcode', false), $request->variable('desc_allow_urls', false), $request->variable('desc_allow_smilies', false));
 					}
 
 					// decode...
@@ -779,7 +780,7 @@ class acp_forums
 			break;
 
 			case 'copy_perm':
-				$forum_perm_from = request_var('forum_perm_from', 0);
+				$forum_perm_from = $request->variable('forum_perm_from', 0);
 
 				// Copy permissions?
 				if (!empty($forum_perm_from) && $forum_perm_from != $forum_id)
@@ -959,12 +960,13 @@ class acp_forums
 	/**
 	* Update forum data
 	*/
-	function update_forum_data(&$forum_data)
+	function update_forum_data(&$forum_data_ary)
 	{
-		global $db, $user, $cache, $phpbb_root_path, $phpbb_container, $phpbb_dispatcher;
+		global $db, $user, $cache, $phpbb_root_path, $phpbb_container, $phpbb_dispatcher, $phpbb_log, $request;
 
 		$errors = array();
 
+		$forum_data = $forum_data_ary;
 		/**
 		* Validate the forum data before we create/update the forum
 		*
@@ -976,42 +978,44 @@ class acp_forums
 		*/
 		$vars = array('forum_data', 'errors');
 		extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_validate_data', compact($vars)));
+		$forum_data_ary = $forum_data;
+		unset($forum_data);
 
-		if ($forum_data['forum_name'] == '')
+		if ($forum_data_ary['forum_name'] == '')
 		{
 			$errors[] = $user->lang['FORUM_NAME_EMPTY'];
 		}
 
-		if (utf8_strlen($forum_data['forum_desc']) > 4000)
+		if (utf8_strlen($forum_data_ary['forum_desc']) > 4000)
 		{
 			$errors[] = $user->lang['FORUM_DESC_TOO_LONG'];
 		}
 
-		if (utf8_strlen($forum_data['forum_rules']) > 4000)
+		if (utf8_strlen($forum_data_ary['forum_rules']) > 4000)
 		{
 			$errors[] = $user->lang['FORUM_RULES_TOO_LONG'];
 		}
 
-		if ($forum_data['forum_password'] || $forum_data['forum_password_confirm'])
+		if ($forum_data_ary['forum_password'] || $forum_data_ary['forum_password_confirm'])
 		{
-			if ($forum_data['forum_password'] != $forum_data['forum_password_confirm'])
+			if ($forum_data_ary['forum_password'] != $forum_data_ary['forum_password_confirm'])
 			{
-				$forum_data['forum_password'] = $forum_data['forum_password_confirm'] = '';
+				$forum_data_ary['forum_password'] = $forum_data_ary['forum_password_confirm'] = '';
 				$errors[] = $user->lang['FORUM_PASSWORD_MISMATCH'];
 			}
 		}
 
-		if ($forum_data['prune_days'] < 0 || $forum_data['prune_viewed'] < 0 || $forum_data['prune_freq'] < 0)
+		if ($forum_data_ary['prune_days'] < 0 || $forum_data_ary['prune_viewed'] < 0 || $forum_data_ary['prune_freq'] < 0)
 		{
-			$forum_data['prune_days'] = $forum_data['prune_viewed'] = $forum_data['prune_freq'] = 0;
+			$forum_data_ary['prune_days'] = $forum_data_ary['prune_viewed'] = $forum_data_ary['prune_freq'] = 0;
 			$errors[] = $user->lang['FORUM_DATA_NEGATIVE'];
 		}
 
 		$range_test_ary = array(
-			array('lang' => 'FORUM_TOPICS_PAGE', 'value' => $forum_data['forum_topics_per_page'], 'column_type' => 'TINT:0'),
+			array('lang' => 'FORUM_TOPICS_PAGE', 'value' => $forum_data_ary['forum_topics_per_page'], 'column_type' => 'TINT:0'),
 		);
 
-		if (!empty($forum_data['forum_image']) && !file_exists($phpbb_root_path . $forum_data['forum_image']))
+		if (!empty($forum_data_ary['forum_image']) && !file_exists($phpbb_root_path . $forum_data_ary['forum_image']))
 		{
 			$errors[] = $user->lang['FORUM_IMAGE_NO_EXIST'];
 		}
@@ -1025,17 +1029,17 @@ class acp_forums
 		// 8 = prune stickies
 		// 16 = show active topics
 		// 32 = enable post review
-		$forum_data['forum_flags'] = 0;
-		$forum_data['forum_flags'] += ($forum_data['forum_link_track']) ? FORUM_FLAG_LINK_TRACK : 0;
-		$forum_data['forum_flags'] += ($forum_data['prune_old_polls']) ? FORUM_FLAG_PRUNE_POLL : 0;
-		$forum_data['forum_flags'] += ($forum_data['prune_announce']) ? FORUM_FLAG_PRUNE_ANNOUNCE : 0;
-		$forum_data['forum_flags'] += ($forum_data['prune_sticky']) ? FORUM_FLAG_PRUNE_STICKY : 0;
-		$forum_data['forum_flags'] += ($forum_data['show_active']) ? FORUM_FLAG_ACTIVE_TOPICS : 0;
-		$forum_data['forum_flags'] += ($forum_data['enable_post_review']) ? FORUM_FLAG_POST_REVIEW : 0;
-		$forum_data['forum_flags'] += ($forum_data['enable_quick_reply']) ? FORUM_FLAG_QUICK_REPLY : 0;
+		$forum_data_ary['forum_flags'] = 0;
+		$forum_data_ary['forum_flags'] += ($forum_data_ary['forum_link_track']) ? FORUM_FLAG_LINK_TRACK : 0;
+		$forum_data_ary['forum_flags'] += ($forum_data_ary['prune_old_polls']) ? FORUM_FLAG_PRUNE_POLL : 0;
+		$forum_data_ary['forum_flags'] += ($forum_data_ary['prune_announce']) ? FORUM_FLAG_PRUNE_ANNOUNCE : 0;
+		$forum_data_ary['forum_flags'] += ($forum_data_ary['prune_sticky']) ? FORUM_FLAG_PRUNE_STICKY : 0;
+		$forum_data_ary['forum_flags'] += ($forum_data_ary['show_active']) ? FORUM_FLAG_ACTIVE_TOPICS : 0;
+		$forum_data_ary['forum_flags'] += ($forum_data_ary['enable_post_review']) ? FORUM_FLAG_POST_REVIEW : 0;
+		$forum_data_ary['forum_flags'] += ($forum_data_ary['enable_quick_reply']) ? FORUM_FLAG_QUICK_REPLY : 0;
 
 		// Unset data that are not database fields
-		$forum_data_sql = $forum_data;
+		$forum_data_sql = $forum_data_ary;
 
 		unset($forum_data_sql['forum_link_track']);
 		unset($forum_data_sql['prune_old_polls']);
@@ -1066,12 +1070,14 @@ class acp_forums
 		else
 		{
 			// Instantiate passwords manager
+			/* @var $passwords_manager \phpbb\passwords\manager */
 			$passwords_manager = $phpbb_container->get('passwords.manager');
 
 			$forum_data_sql['forum_password'] = $passwords_manager->hash($forum_data_sql['forum_password']);
 		}
 		unset($forum_data_sql['forum_password_unset']);
 
+		$forum_data = $forum_data_ary;
 		/**
 		* Remove invalid values from forum_data_sql that should not be updated
 		*
@@ -1084,6 +1090,8 @@ class acp_forums
 		*/
 		$vars = array('forum_data', 'forum_data_sql');
 		extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_update_data_before', compact($vars)));
+		$forum_data_ary = $forum_data;
+		unset($forum_data);
 
 		$is_new_forum = !isset($forum_data_sql['forum_id']);
 
@@ -1140,9 +1148,9 @@ class acp_forums
 			$sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $forum_data_sql);
 			$db->sql_query($sql);
 
-			$forum_data['forum_id'] = $db->sql_nextid();
+			$forum_data_ary['forum_id'] = $db->sql_nextid();
 
-			add_log('admin', 'LOG_FORUM_ADD', $forum_data['forum_name']);
+			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_ADD', false, array($forum_data_ary['forum_name']));
 		}
 		else
 		{
@@ -1160,7 +1168,7 @@ class acp_forums
 				// we're turning a postable forum into a non-postable forum
 				if ($forum_data_sql['type_action'] == 'move')
 				{
-					$to_forum_id = request_var('to_forum_id', 0);
+					$to_forum_id = $request->variable('to_forum_id', 0);
 
 					if ($to_forum_id)
 					{
@@ -1190,8 +1198,8 @@ class acp_forums
 				if ($row['right_id'] - $row['left_id'] > 1)
 				{
 					// We are turning a category into a link - but need to decide what to do with the subforums.
-					$action_subforums = request_var('action_subforums', '');
-					$subforums_to_id = request_var('subforums_to_id', 0);
+					$action_subforums = $request->variable('action_subforums', '');
+					$subforums_to_id = $request->variable('subforums_to_id', 0);
 
 					if ($action_subforums == 'delete')
 					{
@@ -1272,8 +1280,6 @@ class acp_forums
 							return array($user->lang['NO_FORUM']);
 						}
 
-						$subforums_to_name = $_row['forum_name'];
-
 						$sql = 'SELECT forum_id
 							FROM ' . FORUMS_TABLE . "
 							WHERE parent_id = {$row['forum_id']}";
@@ -1357,11 +1363,12 @@ class acp_forums
 			$db->sql_query($sql);
 
 			// Add it back
-			$forum_data['forum_id'] = $forum_id;
+			$forum_data_ary['forum_id'] = $forum_id;
 
-			add_log('admin', 'LOG_FORUM_EDIT', $forum_data['forum_name']);
+			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_EDIT', false, array($forum_data_ary['forum_name']));
 		}
 
+		$forum_data = $forum_data_ary;
 		/**
 		* Event after a forum was updated or created
 		*
@@ -1377,6 +1384,8 @@ class acp_forums
 		*/
 		$vars = array('forum_data', 'forum_data_sql', 'is_new_forum', 'errors');
 		extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_update_data_after', compact($vars)));
+		$forum_data_ary = $forum_data;
+		unset($forum_data);
 
 		return $errors;
 	}
@@ -1388,7 +1397,7 @@ class acp_forums
 	{
 		global $db, $user, $phpbb_dispatcher;
 
-		$to_data = $moved_ids = $errors = array();
+		$errors = array();
 
 		// Check if we want to move to a parent with link type
 		if ($to_id > 0)
@@ -1561,7 +1570,7 @@ class acp_forums
 	*/
 	function delete_forum($forum_id, $action_posts = 'delete', $action_subforums = 'delete', $posts_to_id = 0, $subforums_to_id = 0)
 	{
-		global $db, $user, $cache;
+		global $db, $user, $cache, $phpbb_log;
 
 		$forum_data = $this->get_forum_info($forum_id);
 
@@ -1758,39 +1767,39 @@ class acp_forums
 		switch ($log_action)
 		{
 			case 'MOVE_POSTS_MOVE_FORUMS':
-				add_log('admin', 'LOG_FORUM_DEL_MOVE_POSTS_MOVE_FORUMS', $posts_to_name, $subforums_to_name, $forum_data['forum_name']);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_MOVE_POSTS_MOVE_FORUMS', false, array($posts_to_name, $subforums_to_name, $forum_data['forum_name']));
 			break;
 
 			case 'MOVE_POSTS_FORUMS':
-				add_log('admin', 'LOG_FORUM_DEL_MOVE_POSTS_FORUMS', $posts_to_name, $forum_data['forum_name']);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_MOVE_POSTS_FORUMS', false, array($posts_to_name, $forum_data['forum_name']));
 			break;
 
 			case 'POSTS_MOVE_FORUMS':
-				add_log('admin', 'LOG_FORUM_DEL_POSTS_MOVE_FORUMS', $subforums_to_name, $forum_data['forum_name']);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_POSTS_MOVE_FORUMS', false, array($subforums_to_name, $forum_data['forum_name']));
 			break;
 
 			case '_MOVE_FORUMS':
-				add_log('admin', 'LOG_FORUM_DEL_MOVE_FORUMS', $subforums_to_name, $forum_data['forum_name']);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_MOVE_FORUMS', false, array($subforums_to_name, $forum_data['forum_name']));
 			break;
 
 			case 'MOVE_POSTS_':
-				add_log('admin', 'LOG_FORUM_DEL_MOVE_POSTS', $posts_to_name, $forum_data['forum_name']);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_MOVE_POSTS', false, array($posts_to_name, $forum_data['forum_name']));
 			break;
 
 			case 'POSTS_FORUMS':
-				add_log('admin', 'LOG_FORUM_DEL_POSTS_FORUMS', $forum_data['forum_name']);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_POSTS_FORUMS', false, array($forum_data['forum_name']));
 			break;
 
 			case '_FORUMS':
-				add_log('admin', 'LOG_FORUM_DEL_FORUMS', $forum_data['forum_name']);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_FORUMS', false, array($forum_data['forum_name']));
 			break;
 
 			case 'POSTS_':
-				add_log('admin', 'LOG_FORUM_DEL_POSTS', $forum_data['forum_name']);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_POSTS', false, array($forum_data['forum_name']));
 			break;
 
 			default:
-				add_log('admin', 'LOG_FORUM_DEL_FORUM', $forum_data['forum_name']);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_DEL_FORUM', false, array($forum_data['forum_name']));
 			break;
 		}
 
@@ -1802,7 +1811,7 @@ class acp_forums
 	*/
 	function delete_forum_content($forum_id)
 	{
-		global $db, $config, $phpbb_root_path, $phpEx, $phpbb_dispatcher;
+		global $db, $config, $phpbb_root_path, $phpEx, $phpbb_container, $phpbb_dispatcher;
 
 		include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
 
@@ -1823,7 +1832,10 @@ class acp_forums
 		}
 		$db->sql_freeresult($result);
 
-		delete_attachments('topic', $topic_ids, false);
+		/** @var \phpbb\attachment\manager $attachment_manager */
+		$attachment_manager = $phpbb_container->get('attachment.manager');
+		$attachment_manager->delete('topic', $topic_ids, false);
+		unset($attachment_manager);
 
 		// Delete shadow topics pointing to topics in this forum
 		delete_topic_shadows($forum_id);
@@ -1994,7 +2006,7 @@ class acp_forums
 		$row = $db->sql_fetchrow($result);
 		$db->sql_freeresult($result);
 
-		set_config('num_posts', (int) $row['stat'], true);
+		$config->set('num_posts', (int) $row['stat'], false);
 
 		$sql = 'SELECT COUNT(topic_id) AS stat
 			FROM ' . TOPICS_TABLE . '
@@ -2003,7 +2015,7 @@ class acp_forums
 		$row = $db->sql_fetchrow($result);
 		$db->sql_freeresult($result);
 
-		set_config('num_topics', (int) $row['stat'], true);
+		$config->set('num_topics', (int) $row['stat'], false);
 
 		$sql = 'SELECT COUNT(attach_id) as stat
 			FROM ' . ATTACHMENTS_TABLE;
@@ -2011,7 +2023,7 @@ class acp_forums
 		$row = $db->sql_fetchrow($result);
 		$db->sql_freeresult($result);
 
-		set_config('num_files', (int) $row['stat'], true);
+		$config->set('num_files', (int) $row['stat'], false);
 
 		$sql = 'SELECT SUM(filesize) as stat
 			FROM ' . ATTACHMENTS_TABLE;
@@ -2019,7 +2031,7 @@ class acp_forums
 		$row = $db->sql_fetchrow($result);
 		$db->sql_freeresult($result);
 
-		set_config('upload_dir_size', (float) $row['stat'], true);
+		$config->set('upload_dir_size', (float) $row['stat'], false);
 
 		return array();
 	}
--- a/includes/acp/acp_groups.php
+++ b/includes/acp/acp_groups.php
@@ -26,7 +26,7 @@ class acp_groups
 	function main($id, $mode)
 	{
 		global $config, $db, $user, $auth, $template, $cache;
-		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix, $file_uploads;
+		global $phpbb_root_path, $phpbb_admin_path, $phpEx;
 		global $request, $phpbb_container, $phpbb_dispatcher;
 
 		$user->add_lang('acp/groups');
@@ -48,15 +48,18 @@ class acp_groups
 		}
 
 		// Check and set some common vars
-		$action		= (isset($_POST['add'])) ? 'add' : ((isset($_POST['addusers'])) ? 'addusers' : request_var('action', ''));
-		$group_id	= request_var('g', 0);
-		$mark_ary	= request_var('mark', array(0));
-		$name_ary	= request_var('usernames', '', true);
-		$leader		= request_var('leader', 0);
-		$default	= request_var('default', 0);
-		$start		= request_var('start', 0);
+		$action		= (isset($_POST['add'])) ? 'add' : ((isset($_POST['addusers'])) ? 'addusers' : $request->variable('action', ''));
+		$group_id	= $request->variable('g', 0);
+		$mark_ary	= $request->variable('mark', array(0));
+		$name_ary	= $request->variable('usernames', '', true);
+		$leader		= $request->variable('leader', 0);
+		$default	= $request->variable('default', 0);
+		$start		= $request->variable('start', 0);
 		$update		= (isset($_POST['update'])) ? true : false;
 
+		/** @var \phpbb\group\helper $group_helper */
+		$group_helper = $phpbb_container->get('group_helper');
+
 		// Clear some vars
 		$group_row = array();
 
@@ -101,7 +104,7 @@ class acp_groups
 				}
 
 				// Approve, demote or promote
-				$group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'];
+				$group_name = $group_helper->get_name($group_row['group_name']);
 				$error = group_user_attributes($action, $group_id, $mark_ary, false, $group_name);
 
 				if (!$error)
@@ -142,7 +145,7 @@ class acp_groups
 
 				if (confirm_box(true))
 				{
-					$group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'];
+					$group_name = $group_helper->get_name($group_row['group_name']);
 					group_user_attributes('default', $group_id, $mark_ary, false, $group_name, $group_row);
 					trigger_error($user->lang['GROUP_DEFS_UPDATED'] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id));
 				}
@@ -161,7 +164,7 @@ class acp_groups
 			case 'set_default_on_all':
 				if (confirm_box(true))
 				{
-					$group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'];
+					$group_name = $group_helper->get_name($group_row['group_name']);
 
 					$start = 0;
 
@@ -220,6 +223,7 @@ class acp_groups
 				}
 				else if ($action === 'delete' && $group_row['group_type'] == GROUP_SPECIAL)
 				{
+					send_status_line(403, 'Forbidden');
 					trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
 				}
 
@@ -232,6 +236,7 @@ class acp_groups
 						case 'delete':
 							if (!$auth->acl_get('a_groupdel'))
 							{
+								send_status_line(403, 'Forbidden');
 								trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
 							}
 
@@ -239,7 +244,7 @@ class acp_groups
 						break;
 
 						case 'deleteusers':
-							$group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'];
+							$group_name = $group_helper->get_name($group_row['group_name']);
 							$error = group_user_del($group_id, $mark_ary, false, $group_name);
 						break;
 					}
@@ -283,7 +288,7 @@ class acp_groups
 				}
 
 				$name_ary = array_unique(explode("\n", $name_ary));
-				$group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'];
+				$group_name = $group_helper->get_name($group_row['group_name']);
 
 				// Add user/s to group
 				if ($error = group_user_add($group_id, false, $name_ary, $group_name, $default, $leader, 0, $group_row))
@@ -303,8 +308,6 @@ class acp_groups
 					include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
 				}
 
-				$data = $submit_ary = array();
-
 				if ($action == 'edit' && !$group_id)
 				{
 					trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
@@ -312,6 +315,7 @@ class acp_groups
 
 				if ($action == 'add' && !$auth->acl_get('a_groupadd'))
 				{
+					send_status_line(403, 'Forbidden');
 					trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
 				}
 
@@ -369,24 +373,24 @@ class acp_groups
 						trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
 					}
 
-					$group_name	= utf8_normalize_nfc(request_var('group_name', '', true));
-					$group_desc = utf8_normalize_nfc(request_var('group_desc', '', true));
-					$group_type	= request_var('group_type', GROUP_FREE);
+					$group_name	= $request->variable('group_name', '', true);
+					$group_desc = $request->variable('group_desc', '', true);
+					$group_type	= $request->variable('group_type', GROUP_FREE);
 
-					$allow_desc_bbcode	= request_var('desc_parse_bbcode', false);
-					$allow_desc_urls	= request_var('desc_parse_urls', false);
-					$allow_desc_smilies	= request_var('desc_parse_smilies', false);
+					$allow_desc_bbcode	= $request->variable('desc_parse_bbcode', false);
+					$allow_desc_urls	= $request->variable('desc_parse_urls', false);
+					$allow_desc_smilies	= $request->variable('desc_parse_smilies', false);
 
 					$submit_ary = array(
-						'colour'			=> request_var('group_colour', ''),
-						'rank'				=> request_var('group_rank', 0),
+						'colour'			=> $request->variable('group_colour', ''),
+						'rank'				=> $request->variable('group_rank', 0),
 						'receive_pm'		=> isset($_REQUEST['group_receive_pm']) ? 1 : 0,
 						'legend'			=> isset($_REQUEST['group_legend']) ? 1 : 0,
 						'teampage'			=> isset($_REQUEST['group_teampage']) ? 1 : 0,
-						'message_limit'		=> request_var('group_message_limit', 0),
-						'max_recipients'	=> request_var('group_max_recipients', 0),
+						'message_limit'		=> $request->variable('group_message_limit', 0),
+						'max_recipients'	=> $request->variable('group_max_recipients', 0),
 						'founder_manage'	=> 0,
-						'skip_auth'			=> request_var('group_skip_auth', 0),
+						'skip_auth'			=> $request->variable('group_skip_auth', 0),
 					);
 
 					if ($user->data['user_type'] == USER_FOUNDER)
@@ -555,7 +559,7 @@ class acp_groups
 
 						if (!($error = group_create($group_id, $group_type, $group_name, $group_desc, $group_attributes, $allow_desc_bbcode, $allow_desc_urls, $allow_desc_smilies)))
 						{
-							$group_perm_from = request_var('group_perm_from', 0);
+							$group_perm_from = $request->variable('group_perm_from', 0);
 
 							// Copy permissions?
 							// If the user has the a_authgroups permission and at least one additional permission ability set the permissions are fully transferred.
@@ -625,7 +629,7 @@ class acp_groups
 				}
 				else if (!$group_id)
 				{
-					$group_name = utf8_normalize_nfc(request_var('group_name', '', true));
+					$group_name = $request->variable('group_name', '', true);
 					$group_desc_data = array(
 						'text'			=> '',
 						'allow_bbcode'	=> true,
@@ -710,12 +714,12 @@ class acp_groups
 					$error = array_merge($error, $phpbb_avatar_manager->localize_errors($user, $avatar_error));
 				}
 
-				$back_link = request_var('back_link', '');
+				$back_link = $request->variable('back_link', '');
 
 				switch ($back_link)
 				{
 					case 'acp_users_groups':
-						$u_back = append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&amp;mode=groups&amp;u=' . request_var('u', 0));
+						$u_back = append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&amp;mode=groups&amp;u=' . $request->variable('u', 0));
 					break;
 
 					default:
@@ -734,7 +738,7 @@ class acp_groups
 					'S_AVATARS_ENABLED'		=> ($config['allow_avatar'] && $avatars_enabled),
 
 					'ERROR_MSG'				=> (sizeof($error)) ? implode('<br />', $error) : '',
-					'GROUP_NAME'			=> ($group_type == GROUP_SPECIAL) ? $user->lang['G_' . $group_name] : $group_name,
+					'GROUP_NAME'			=> $group_helper->get_name($group_name),
 					'GROUP_INTERNAL_NAME'	=> $group_name,
 					'GROUP_DESC'			=> $group_desc_data['text'],
 					'GROUP_RECEIVE_PM'		=> (isset($group_row['group_receive_pm']) && $group_row['group_receive_pm']) ? ' checked="checked"' : '',
@@ -816,8 +820,9 @@ class acp_groups
 					trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
 				}
 
-				$this->page_title = 'GROUP_MEMBERS';
+				/* @var $pagination \phpbb\pagination */
 				$pagination = $phpbb_container->get('pagination');
+				$this->page_title = 'GROUP_MEMBERS';
 
 				// Grab the leaders - always, on every page...
 				$sql = 'SELECT u.user_id, u.username, u.username_clean, u.user_regdate, u.user_colour, u.user_posts, u.group_id, ug.group_leader, ug.user_pending
@@ -868,7 +873,7 @@ class acp_groups
 					'S_GROUP_SPECIAL'	=> ($group_row['group_type'] == GROUP_SPECIAL) ? true : false,
 					'S_ACTION_OPTIONS'	=> $s_action_options,
 
-					'GROUP_NAME'	=> ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'],
+					'GROUP_NAME'	=> $group_helper->get_name($group_row['group_name']),
 
 					'U_ACTION'			=> $this->u_action . "&amp;g=$group_id",
 					'U_BACK'			=> $this->u_action,
@@ -937,11 +942,12 @@ class acp_groups
 			// used for easy access to the data within a group
 			$cached_group_data[$type][$row['group_id']] = $row;
 			$cached_group_data[$type][$row['group_id']]['total_members'] = 0;
+			$cached_group_data[$type][$row['group_id']]['pending_members'] = 0;
 		}
 		$db->sql_freeresult($result);
 
 		// How many people are in which group?
-		$sql = 'SELECT COUNT(ug.user_id) AS total_members, ug.group_id
+		$sql = 'SELECT COUNT(ug.user_id) AS total_members, SUM(ug.user_pending) AS pending_members, ug.group_id
 			FROM ' . USER_GROUP_TABLE . ' ug
 			WHERE ' . $db->sql_in_set('ug.group_id', array_keys($lookup)) . '
 			GROUP BY ug.group_id';
@@ -951,6 +957,7 @@ class acp_groups
 		{
 			$type = $lookup[$row['group_id']];
 			$cached_group_data[$type][$row['group_id']]['total_members'] = $row['total_members'];
+			$cached_group_data[$type][$row['group_id']]['pending_members'] = $row['pending_members'];
 		}
 		$db->sql_freeresult($result);
 
@@ -979,6 +986,7 @@ class acp_groups
 
 					'GROUP_NAME'	=> $group_name,
 					'TOTAL_MEMBERS'	=> $row['total_members'],
+					'PENDING_MEMBERS' => $row['pending_members']
 				));
 			}
 		}
@@ -997,6 +1005,9 @@ class acp_groups
 		$teampage_id = $request->variable('t', 0);
 		$category_id = $request->variable('c', 0);
 
+		/** @var \phpbb\group\helper $group_helper */
+		$group_helper = $phpbb_container->get('group_helper');
+
 		if ($field && !in_array($field, array('legend', 'teampage')))
 		{
 			// Invalid mode
@@ -1004,7 +1015,7 @@ class acp_groups
 		}
 		else if ($field && in_array($field, array('legend', 'teampage')))
 		{
-
+			/* @var $group_position \phpbb\groupposition\groupposition_interface */
 			$group_position = $phpbb_container->get('groupposition.' . $field);
 		}
 
@@ -1096,10 +1107,9 @@ class acp_groups
 			ORDER BY group_legend ASC, group_type DESC, group_name ASC';
 		$result = $db->sql_query($sql);
 
-		$s_group_select_legend = '';
 		while ($row = $db->sql_fetchrow($result))
 		{
-			$group_name = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'];
+			$group_name = $group_helper->get_name($row['group_name']);
 			if ($row['group_legend'])
 			{
 				$template->assign_block_vars('legend', array(
@@ -1134,7 +1144,6 @@ class acp_groups
 			ORDER BY t.teampage_position ASC';
 		$result = $db->sql_query($sql);
 
-		$category_data = array();
 		while ($row = $db->sql_fetchrow($result))
 		{
 			if ($row['teampage_id'] == $category_id)
@@ -1147,7 +1156,7 @@ class acp_groups
 
 			if ($row['group_id'])
 			{
-				$group_name = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'];
+				$group_name = $group_helper->get_name($row['group_name']);
 				$group_type = $user->lang[\phpbb\groupposition\teampage::group_type_language($row['group_type'])];
 			}
 			else
@@ -1177,10 +1186,9 @@ class acp_groups
 			ORDER BY g.group_type DESC, g.group_name ASC';
 		$result = $db->sql_query($sql);
 
-		$s_group_select_teampage = '';
 		while ($row = $db->sql_fetchrow($result))
 		{
-			$group_name = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'];
+			$group_name = $group_helper->get_name($row['group_name']);
 			$template->assign_block_vars('add_teampage', array(
 				'GROUP_ID'		=> (int) $row['group_id'],
 				'GROUP_NAME'	=> $group_name,
--- /dev/null
+++ b/includes/acp/acp_help_phpbb.php
@@ -0,0 +1,143 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+	exit;
+}
+
+class acp_help_phpbb
+{
+	var $u_action;
+
+	function main($id, $mode)
+	{
+		global $config, $request, $template, $user, $phpbb_dispatcher, $phpbb_admin_path, $phpbb_root_path, $phpEx;
+
+		if (!class_exists('phpbb_questionnaire_data_collector'))
+		{
+			include($phpbb_root_path . 'includes/questionnaire/questionnaire.' . $phpEx);
+		}
+
+		$collect_url = "https://www.phpbb.com/stats/receive_stats.php";
+
+		$this->tpl_name = 'acp_help_phpbb';
+		$this->page_title = 'ACP_HELP_PHPBB';
+
+		$submit = ($request->is_set_post('submit')) ? true : false;
+
+		$form_key = 'acp_help_phpbb';
+		add_form_key($form_key);
+		$error = array();
+
+		if ($submit && !check_form_key($form_key))
+		{
+			$error[] = $user->lang['FORM_INVALID'];
+		}
+		// Do not write values if there is an error
+		if (sizeof($error))
+		{
+			$submit = false;
+		}
+
+		// generate a unique id if necessary
+		if (!isset($config['questionnaire_unique_id']))
+		{
+			$install_id = unique_id();
+			$config->set('questionnaire_unique_id', $install_id);
+		}
+		else
+		{
+			$install_id = $config['questionnaire_unique_id'];
+		}
+
+		$collector = new phpbb_questionnaire_data_collector($install_id);
+
+		// Add data provider
+		$collector->add_data_provider(new phpbb_questionnaire_php_data_provider());
+		$collector->add_data_provider(new phpbb_questionnaire_system_data_provider());
+		$collector->add_data_provider(new phpbb_questionnaire_phpbb_data_provider($config));
+
+		/**
+		 * Event to modify ACP help phpBB page and/or listen to submit
+		 *
+		 * @event core.acp_help_phpbb_submit_before
+		 * @var	boolean	submit			Do we display the form or process the submission
+		 * @since 3.2.0-RC2
+		 */
+		$vars = array('submit');
+		extract($phpbb_dispatcher->trigger_event('core.acp_help_phpbb_submit_before', compact($vars)));
+
+		if ($submit)
+		{
+			$config->set('help_send_statistics', $request->variable('help_send_statistics', false));
+			$response = $request->variable('send_statistics_response', '');
+
+			$config->set('help_send_statistics_time', time());
+
+			if (!empty($response))
+			{
+				if ((strpos($response, 'Thank you') !== false || strpos($response, 'Flood protection') !== false))
+				{
+					trigger_error($user->lang('THANKS_SEND_STATISTICS') . adm_back_link($this->u_action));
+				}
+				else
+				{
+					trigger_error($user->lang('FAIL_SEND_STATISTICS') . adm_back_link($this->u_action));
+				}
+			}
+
+			trigger_error($user->lang('CONFIG_UPDATED') . adm_back_link($this->u_action));
+		}
+
+		$template->assign_vars(array(
+			'U_COLLECT_STATS'		=> $collect_url,
+			'S_COLLECT_STATS'		=> (!empty($config['help_send_statistics'])) ? true : false,
+			'RAW_DATA'				=> $collector->get_data_for_form(),
+			'U_ACP_MAIN'			=> append_sid("{$phpbb_admin_path}index.$phpEx"),
+			'U_ACTION'				=> $this->u_action,
+			// Pass earliest time we should try to send stats again
+			'COLLECT_STATS_TIME'	=> intval($config['help_send_statistics_time']) + 86400,
+		));
+
+		$raw = $collector->get_data_raw();
+
+		foreach ($raw as $provider => $data)
+		{
+			if ($provider == 'install_id')
+			{
+				$data = array($provider => $data);
+			}
+
+			$template->assign_block_vars('providers', array(
+				'NAME'	=> htmlspecialchars($provider),
+			));
+
+			foreach ($data as $key => $value)
+			{
+				if (is_array($value))
+				{
+					$value = utf8_wordwrap(serialize($value), 75, "\n", true);
+				}
+
+				$template->assign_block_vars('providers.values', array(
+					'KEY'	=> utf8_htmlspecialchars($key),
+					'VALUE'	=> utf8_htmlspecialchars($value),
+				));
+			}
+		}
+	}
+}
--- a/includes/acp/acp_icons.php
+++ b/includes/acp/acp_icons.php
@@ -28,18 +28,18 @@ class acp_icons
 
 	function main($id, $mode)
 	{
-		global $db, $user, $auth, $template, $cache;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+		global $db, $user, $template, $cache;
+		global $config, $phpbb_root_path;
 		global $request, $phpbb_container;
 
 		$user->add_lang('acp/posting');
 
 		// Set up general vars
-		$action = request_var('action', '');
+		$action = $request->variable('action', '');
 		$action = (isset($_POST['add'])) ? 'add' : $action;
 		$action = (isset($_POST['edit'])) ? 'edit' : $action;
 		$action = (isset($_POST['import'])) ? 'import' : $action;
-		$icon_id = request_var('id', 0);
+		$icon_id = $request->variable('id', 0);
 		$submit = $request->is_set_post('submit', false);
 
 		$form_key = 'acp_icons';
@@ -198,7 +198,6 @@ class acp_icons
 
 				$data = array();
 				$after = false;
-				$display = 0;
 				$order_lists = array('', '');
 				$add_order_lists = array('', '');
 				$display_count = 0;
@@ -213,7 +212,6 @@ class acp_icons
 					if ($row[$fields . '_id'] == $icon_id)
 					{
 						$after = true;
-						$display = $row['display_on_posting'];
 						$data[$row[$fields . '_url']] = $row;
 					}
 					else
@@ -252,7 +250,7 @@ class acp_icons
 					$data = $_images;
 				}
 
-				$colspan = (($mode == 'smilies') ? 7 : 5);
+				$colspan = (($mode == 'smilies') ? 7 : 6);
 				$colspan += ($icon_id) ? 1 : 0;
 				$colspan += ($action == 'add') ? 2 : 0;
 
@@ -296,6 +294,8 @@ class acp_icons
 						'ID'				=> (isset($img_row[$fields . '_id'])) ? $img_row[$fields . '_id'] : 0,
 						'WIDTH'				=> (!empty($img_row[$fields .'_width'])) ? $img_row[$fields .'_width'] : $img_row['width'],
 						'HEIGHT'			=> (!empty($img_row[$fields .'_height'])) ? $img_row[$fields .'_height'] : $img_row['height'],
+						'TEXT_ALT'		    => ($mode == 'icons' && !empty($img_row['icons_alt'])) ? $img_row['icons_alt'] : $img,
+						'ALT'			    => ($mode == 'icons' && !empty($img_row['icons_alt'])) ? $img_row['icons_alt'] : '',
 						'POSTING_CHECKED'	=> (!empty($img_row['display_on_posting']) || $action == 'add') ? ' checked="checked"' : '',
 					));
 				}
@@ -335,24 +335,25 @@ class acp_icons
 				}
 
 				// Get items to create/modify
-				$images = (isset($_POST['image'])) ? array_keys(request_var('image', array('' => 0))) : array();
+				$images = (isset($_POST['image'])) ? array_keys($request->variable('image', array('' => 0))) : array();
 
 				// Now really get the items
-				$image_id		= (isset($_POST['id'])) ? request_var('id', array('' => 0)) : array();
-				$image_order	= (isset($_POST['order'])) ? request_var('order', array('' => 0)) : array();
-				$image_width	= (isset($_POST['width'])) ? request_var('width', array('' => 0)) : array();
-				$image_height	= (isset($_POST['height'])) ? request_var('height', array('' => 0)) : array();
-				$image_add		= (isset($_POST['add_img'])) ? request_var('add_img', array('' => 0)) : array();
-				$image_emotion	= utf8_normalize_nfc(request_var('emotion', array('' => ''), true));
-				$image_code		= utf8_normalize_nfc(request_var('code', array('' => ''), true));
-				$image_display_on_posting = (isset($_POST['display_on_posting'])) ? request_var('display_on_posting', array('' => 0)) : array();
+				$image_id		= (isset($_POST['id'])) ? $request->variable('id', array('' => 0)) : array();
+				$image_order	= (isset($_POST['order'])) ? $request->variable('order', array('' => 0)) : array();
+				$image_width	= (isset($_POST['width'])) ? $request->variable('width', array('' => 0)) : array();
+				$image_height	= (isset($_POST['height'])) ? $request->variable('height', array('' => 0)) : array();
+				$image_add		= (isset($_POST['add_img'])) ? $request->variable('add_img', array('' => 0)) : array();
+				$image_emotion	= $request->variable('emotion', array('' => ''), true);
+				$image_code		= $request->variable('code', array('' => ''), true);
+				$image_alt		= ($request->is_set_post('alt')) ? $request->variable('alt', array('' => ''), true) : array();
+				$image_display_on_posting = (isset($_POST['display_on_posting'])) ? $request->variable('display_on_posting', array('' => 0)) : array();
 
 				// Ok, add the relevant bits if we are adding new codes to existing emoticons...
 				if ($request->variable('add_additional_code', false, false, \phpbb\request\request_interface::POST))
 				{
-					$add_image			= request_var('add_image', '');
-					$add_code			= utf8_normalize_nfc(request_var('add_code', '', true));
-					$add_emotion		= utf8_normalize_nfc(request_var('add_emotion', '', true));
+					$add_image			= $request->variable('add_image', '');
+					$add_code			= $request->variable('add_code', '', true);
+					$add_emotion		= $request->variable('add_emotion', '', true);
 
 					if ($add_image && $add_emotion && $add_code)
 					{
@@ -361,15 +362,15 @@ class acp_icons
 
 						$image_code[$add_image] = $add_code;
 						$image_emotion[$add_image] = $add_emotion;
-						$image_width[$add_image] = request_var('add_width', 0);
-						$image_height[$add_image] = request_var('add_height', 0);
+						$image_width[$add_image] = $request->variable('add_width', 0);
+						$image_height[$add_image] = $request->variable('add_height', 0);
 
 						if ($request->variable('add_display_on_posting', false, false, \phpbb\request\request_interface::POST))
 						{
 							$image_display_on_posting[$add_image] = 1;
 						}
 
-						$image_order[$add_image] = request_var('add_order', 0);
+						$image_order[$add_image] = $request->variable('add_order', 0);
 					}
 				}
 
@@ -447,6 +448,13 @@ class acp_icons
 							);
 						}
 
+						if ($mode == 'icons')
+						{
+							$img_sql = array_merge($img_sql, array(
+								'icons_alt'	=> $image_alt[$image])
+							);
+						}
+
 						// Image_order holds the 'new' order value
 						if (!empty($image_order[$image]))
 						{
@@ -495,6 +503,7 @@ class acp_icons
 
 				$cache->destroy('_icons');
 				$cache->destroy('sql', $table);
+				$phpbb_container->get('text_formatter.cache')->invalidate();
 
 				$level = ($icons_updated) ? E_USER_NOTICE : E_USER_WARNING;
 				$errormsgs = '';
@@ -515,8 +524,8 @@ class acp_icons
 
 			case 'import':
 
-				$pak = request_var('pak', '');
-				$current = request_var('current', '');
+				$pak = $request->variable('pak', '');
+				$current = $request->variable('current', '');
 
 				if ($pak != '')
 				{
@@ -554,7 +563,6 @@ class acp_icons
 					{
 						switch ($db->get_sql_layer())
 						{
-							case 'sqlite':
 							case 'sqlite3':
 								$db->sql_query('DELETE FROM ' . $table);
 							break;
@@ -675,6 +683,7 @@ class acp_icons
 
 					$cache->destroy('_icons');
 					$cache->destroy('sql', $table);
+					$phpbb_container->get('text_formatter.cache')->invalidate();
 
 					trigger_error($user->lang[$lang . '_IMPORT_SUCCESS'] . adm_back_link($this->u_action));
 				}
@@ -802,6 +811,7 @@ class acp_icons
 
 					$cache->destroy('_icons');
 					$cache->destroy('sql', $table);
+					$phpbb_container->get('text_formatter.cache')->invalidate();
 
 					if ($request->is_ajax())
 					{
@@ -872,6 +882,7 @@ class acp_icons
 
 				$cache->destroy('_icons');
 				$cache->destroy('sql', $table);
+				$phpbb_container->get('text_formatter.cache')->invalidate();
 
 				if ($request->is_ajax())
 				{
@@ -927,9 +938,10 @@ class acp_icons
 			)
 		);
 
-		$spacer = false;
+		/* @var $pagination \phpbb\pagination */
 		$pagination = $phpbb_container->get('pagination');
-		$pagination_start = request_var('start', 0);
+		$pagination_start = $request->variable('start', 0);
+		$spacer = false;
 
 		$item_count = $this->item_count($table);
 
@@ -940,7 +952,7 @@ class acp_icons
 
 		while ($row = $db->sql_fetchrow($result))
 		{
-			$alt_text = ($mode == 'smilies') ? $row['code'] : '';
+			$alt_text = ($mode == 'smilies') ? $row['code'] : (($mode == 'icons' && !empty($row['icons_alt'])) ? $row['icons_alt'] : $row['icons_url']);
 
 			$template->assign_block_vars('items', array(
 				'S_SPACER'		=> (!$spacer && !$row['display_on_posting']) ? true : false,
--- a/includes/acp/acp_inactive.php
+++ b/includes/acp/acp_inactive.php
@@ -31,8 +31,8 @@ class acp_inactive
 
 	function main($id, $mode)
 	{
-		global $config, $db, $user, $auth, $template, $phpbb_container;
-		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix;
+		global $config, $db, $user, $auth, $template, $phpbb_container, $phpbb_log, $request;
+		global $phpbb_root_path, $phpbb_admin_path, $phpEx;
 
 		if (!function_exists('user_active_flip'))
 		{
@@ -41,24 +41,26 @@ class acp_inactive
 
 		$user->add_lang('memberlist');
 
-		$action = request_var('action', '');
-		$mark	= (isset($_REQUEST['mark'])) ? request_var('mark', array(0)) : array();
-		$start	= request_var('start', 0);
+		$action = $request->variable('action', '');
+		$mark	= (isset($_REQUEST['mark'])) ? $request->variable('mark', array(0)) : array();
+		$start	= $request->variable('start', 0);
 		$submit = isset($_POST['submit']);
 
 		// Sort keys
-		$sort_days	= request_var('st', 0);
-		$sort_key	= request_var('sk', 'i');
-		$sort_dir	= request_var('sd', 'd');
+		$sort_days	= $request->variable('st', 0);
+		$sort_key	= $request->variable('sk', 'i');
+		$sort_dir	= $request->variable('sd', 'd');
 
 		$form_key = 'acp_inactive';
 		add_form_key($form_key);
+
+		/* @var $pagination \phpbb\pagination */
 		$pagination = $phpbb_container->get('pagination');
 
 		// We build the sort key and per page settings here, because they may be needed later
 
 		// Number of entries to display
-		$per_page = request_var('users_per_page', (int) $config['topics_per_page']);
+		$per_page = $request->variable('users_per_page', (int) $config['topics_per_page']);
 
 		// Sorting
 		$limit_days = array(0 => $user->lang['ALL_ENTRIES'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
@@ -141,8 +143,10 @@ class acp_inactive
 						{
 							foreach ($inactive_users as $row)
 							{
-								add_log('admin', 'LOG_USER_ACTIVE', $row['username']);
-								add_log('user', $row['user_id'], 'LOG_USER_ACTIVE_USER');
+								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_ACTIVE', false, array($row['username']));
+								$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_ACTIVE_USER', false, array(
+									'reportee_id' => $row['user_id']
+								));
 							}
 
 							trigger_error(sprintf($user->lang['LOG_INACTIVE_ACTIVATE'], implode($user->lang['COMMA_SEPARATOR'], $user_affected) . ' ' . adm_back_link($this->u_action)));
@@ -160,12 +164,13 @@ class acp_inactive
 						{
 							if (!$auth->acl_get('a_userdel'))
 							{
+								send_status_line(403, 'Forbidden');
 								trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
 							}
 
 							user_delete('retain', $mark, true);
 
-							add_log('admin', 'LOG_INACTIVE_' . strtoupper($action), implode(', ', $user_affected));
+							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_INACTIVE_' . strtoupper($action), false, array(implode(', ', $user_affected)));
 
 							trigger_error(sprintf($user->lang['LOG_INACTIVE_DELETE'], implode($user->lang['COMMA_SEPARATOR'], $user_affected) . ' ' . adm_back_link($this->u_action)));
 						}
@@ -240,7 +245,7 @@ class acp_inactive
 							WHERE ' . $db->sql_in_set('user_id', $user_ids);
 						$db->sql_query($sql);
 
-						add_log('admin', 'LOG_INACTIVE_REMIND', implode(', ', $usernames));
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_INACTIVE_REMIND', false, array(implode(', ', $usernames)));
 
 						trigger_error(sprintf($user->lang['LOG_INACTIVE_REMIND'], implode($user->lang['COMMA_SEPARATOR'], $usernames) . ' ' . adm_back_link($this->u_action)));
 					}
--- a/includes/acp/acp_jabber.php
+++ b/includes/acp/acp_jabber.php
@@ -29,8 +29,8 @@ class acp_jabber
 
 	function main($id, $mode)
 	{
-		global $db, $user, $auth, $template;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+		global $db, $user, $template, $phpbb_log, $request;
+		global $config, $phpbb_root_path, $phpEx;
 
 		$user->add_lang('acp/board');
 
@@ -39,7 +39,6 @@ class acp_jabber
 			include($phpbb_root_path . 'includes/functions_jabber.' . $phpEx);
 		}
 
-		$action	= request_var('action', '');
 		$submit = (isset($_POST['submit'])) ? true : false;
 
 		if ($mode != 'settings')
@@ -50,13 +49,13 @@ class acp_jabber
 		$this->tpl_name = 'acp_jabber';
 		$this->page_title = 'ACP_JABBER_SETTINGS';
 
-		$jab_enable			= request_var('jab_enable',			(bool) $config['jab_enable']);
-		$jab_host			= request_var('jab_host',			(string) $config['jab_host']);
-		$jab_port			= request_var('jab_port',			(int) $config['jab_port']);
-		$jab_username		= request_var('jab_username',		(string) $config['jab_username']);
-		$jab_password		= request_var('jab_password',		(string) $config['jab_password']);
-		$jab_package_size	= request_var('jab_package_size',	(int) $config['jab_package_size']);
-		$jab_use_ssl		= request_var('jab_use_ssl',		(bool) $config['jab_use_ssl']);
+		$jab_enable			= $request->variable('jab_enable',			(bool) $config['jab_enable']);
+		$jab_host			= $request->variable('jab_host',			(string) $config['jab_host']);
+		$jab_port			= $request->variable('jab_port',			(int) $config['jab_port']);
+		$jab_username		= $request->variable('jab_username',		(string) $config['jab_username']);
+		$jab_password		= $request->variable('jab_password',		(string) $config['jab_password']);
+		$jab_package_size	= $request->variable('jab_package_size',	(int) $config['jab_package_size']);
+		$jab_use_ssl		= $request->variable('jab_use_ssl',		(bool) $config['jab_use_ssl']);
 
 		$form_name = 'acp_jabber';
 		add_form_key($form_name);
@@ -68,8 +67,6 @@ class acp_jabber
 				trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);
 			}
 
-			$error = array();
-
 			$message = $user->lang['JAB_SETTINGS_CHANGED'];
 			$log = 'JAB_SETTINGS_CHANGED';
 
@@ -106,18 +103,18 @@ class acp_jabber
 				$db->sql_query($sql);
 			}
 
-			set_config('jab_enable', $jab_enable);
-			set_config('jab_host', $jab_host);
-			set_config('jab_port', $jab_port);
-			set_config('jab_username', $jab_username);
+			$config->set('jab_enable', $jab_enable);
+			$config->set('jab_host', $jab_host);
+			$config->set('jab_port', $jab_port);
+			$config->set('jab_username', $jab_username);
 			if ($jab_password !== '********')
 			{
-				set_config('jab_password', $jab_password);
+				$config->set('jab_password', $jab_password);
 			}
-			set_config('jab_package_size', $jab_package_size);
-			set_config('jab_use_ssl', $jab_use_ssl);
+			$config->set('jab_package_size', $jab_package_size);
+			$config->set('jab_use_ssl', $jab_use_ssl);
 
-			add_log('admin', 'LOG_' . $log);
+			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_' . $log);
 			trigger_error($message . adm_back_link($this->u_action));
 		}
 
--- a/includes/acp/acp_language.php
+++ b/includes/acp/acp_language.php
@@ -31,7 +31,7 @@ class acp_language
 
 	function main($id, $mode)
 	{
-		global $config, $db, $user, $template;
+		global $config, $db, $user, $template, $phpbb_log, $phpbb_container;
 		global $phpbb_root_path, $phpEx, $request;
 
 		if (!function_exists('validate_language_iso_name'))
@@ -44,14 +44,14 @@ class acp_language
 		$action		= (isset($_POST['remove_store'])) ? 'details' : $action;
 
 		$submit = (empty($action) && !isset($_POST['update']) && !isset($_POST['test_connection'])) ? false : true;
-		$action = (empty($action)) ? request_var('action', '') : $action;
+		$action = (empty($action)) ? $request->variable('action', '') : $action;
 
 		$form_name = 'acp_lang';
 		add_form_key('acp_lang');
 
-		$lang_id = request_var('id', 0);
+		$lang_id = $request->variable('id', 0);
 
-		$selected_lang_file = request_var('language_file', '|common.' . $phpEx);
+		$selected_lang_file = $request->variable('language_file', '|common.' . $phpEx);
 
 		list($this->language_directory, $this->language_file) = explode('|', $selected_lang_file);
 
@@ -84,16 +84,16 @@ class acp_language
 				$db->sql_freeresult($result);
 
 				$sql_ary	= array(
-					'lang_english_name'		=> request_var('lang_english_name', $row['lang_english_name']),
-					'lang_local_name'		=> utf8_normalize_nfc(request_var('lang_local_name', $row['lang_local_name'], true)),
-					'lang_author'			=> utf8_normalize_nfc(request_var('lang_author', $row['lang_author'], true)),
+					'lang_english_name'		=> $request->variable('lang_english_name', $row['lang_english_name']),
+					'lang_local_name'		=> $request->variable('lang_local_name', $row['lang_local_name'], true),
+					'lang_author'			=> $request->variable('lang_author', $row['lang_author'], true),
 				);
 
 				$db->sql_query('UPDATE ' . LANG_TABLE . '
 					SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
 					WHERE lang_id = ' . $lang_id);
 
-				add_log('admin', 'LOG_LANGUAGE_PACK_UPDATED', $sql_ary['lang_english_name']);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_LANGUAGE_PACK_UPDATED', false, array($sql_ary['lang_english_name']));
 
 				trigger_error($user->lang['LANGUAGE_DETAILS_UPDATED'] . adm_back_link($this->u_action));
 			break;
@@ -227,7 +227,7 @@ class acp_language
 					$sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . ' WHERE lang_id = ' . $lang_id;
 					$db->sql_query($sql);
 
-					add_log('admin', 'LOG_LANGUAGE_PACK_DELETED', $row['lang_english_name']);
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_LANGUAGE_PACK_DELETED', false, array($row['lang_english_name']));
 
 					trigger_error(sprintf($user->lang['LANGUAGE_PACK_DELETED'], $row['lang_english_name']) . adm_back_link($this->u_action));
 				}
@@ -249,7 +249,7 @@ class acp_language
 					trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
 				}
 
-				$lang_iso = request_var('iso', '');
+				$lang_iso = $request->variable('iso', '');
 				$lang_iso = basename($lang_iso);
 
 				if (!$lang_iso || !file_exists("{$phpbb_root_path}language/$lang_iso/iso.txt"))
@@ -337,7 +337,7 @@ class acp_language
 				}
 				$db->sql_freeresult($result);
 
-				add_log('admin', 'LOG_LANGUAGE_PACK_INSTALLED', $lang_pack['name']);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_LANGUAGE_PACK_INSTALLED', false, array($lang_pack['name']));
 
 				$message = sprintf($user->lang['LANGUAGE_PACK_INSTALLED'], $lang_pack['name']);
 				$message .= ($notify_cpf_update) ? '<br /><br />' . $user->lang['LANGUAGE_PACK_CPF_UPDATE'] : '';
@@ -385,37 +385,19 @@ class acp_language
 		$db->sql_freeresult($result);
 
 		$new_ary = $iso = array();
-		$dp = @opendir("{$phpbb_root_path}language");
 
-		if ($dp)
+		/** @var \phpbb\language\language_file_helper $language_helper */
+		$language_helper = $phpbb_container->get('language.helper.language_file');
+		$iso = $language_helper->get_available_languages();
+
+		foreach ($iso as $lang_array)
 		{
-			while (($file = readdir($dp)) !== false)
-			{
-				if ($file[0] == '.' || !is_dir($phpbb_root_path . 'language/' . $file))
-				{
-					continue;
-				}
+			$lang_iso = $lang_array['iso'];
 
-				if (file_exists("{$phpbb_root_path}language/$file/iso.txt"))
-				{
-					if (!in_array($file, $installed))
-					{
-						if ($iso = file("{$phpbb_root_path}language/$file/iso.txt"))
-						{
-							if (sizeof($iso) == 3)
-							{
-								$new_ary[$file] = array(
-									'iso'		=> $file,
-									'name'		=> trim($iso[0]),
-									'local_name'=> trim($iso[1]),
-									'author'	=> trim($iso[2])
-								);
-							}
-						}
-					}
-				}
+			if (!in_array($lang_iso, $installed))
+			{
+				$new_ary[$lang_iso] = $lang_array;
 			}
-			closedir($dp);
 		}
 
 		unset($installed);
--- a/includes/acp/acp_logs.php
+++ b/includes/acp/acp_logs.php
@@ -25,28 +25,29 @@ class acp_logs
 
 	function main($id, $mode)
 	{
-		global $db, $user, $auth, $template, $cache, $phpbb_container;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+		global $user, $auth, $template, $phpbb_container;
+		global $config;
 		global $request;
 
 		$user->add_lang('mcp');
 
 		// Set up general vars
-		$action		= request_var('action', '');
-		$forum_id	= request_var('f', 0);
-		$topic_id	= request_var('t', 0);
-		$start		= request_var('start', 0);
+		$action		= $request->variable('action', '');
+		$forum_id	= $request->variable('f', 0);
+		$start		= $request->variable('start', 0);
 		$deletemark = $request->variable('delmarked', false, false, \phpbb\request\request_interface::POST);
 		$deleteall	= $request->variable('delall', false, false, \phpbb\request\request_interface::POST);
-		$marked		= request_var('mark', array(0));
+		$marked		= $request->variable('mark', array(0));
 
 		// Sort keys
-		$sort_days	= request_var('st', 0);
-		$sort_key	= request_var('sk', 't');
-		$sort_dir	= request_var('sd', 'd');
+		$sort_days	= $request->variable('st', 0);
+		$sort_key	= $request->variable('sk', 't');
+		$sort_dir	= $request->variable('sd', 'd');
 
 		$this->tpl_name = 'acp_logs';
 		$this->log_type = constant('LOG_' . strtoupper($mode));
+
+		/* @var $pagination \phpbb\pagination */
 		$pagination = $phpbb_container->get('pagination');
 
 		// Delete entries if requested and able
@@ -68,10 +69,11 @@ class acp_logs
 						$conditions['log_time'] = array('>=', time() - ($sort_days * 86400));
 					}
 
-					$keywords = utf8_normalize_nfc(request_var('keywords', '', true));
+					$keywords = $request->variable('keywords', '', true);
 					$conditions['keywords'] = $keywords;
 				}
 
+				/* @var $phpbb_log \phpbb\log\log_interface */
 				$phpbb_log = $phpbb_container->get('log');
 				$phpbb_log->delete($mode, $conditions);
 			}
@@ -105,7 +107,7 @@ class acp_logs
 		$sql_where = ($sort_days) ? (time() - ($sort_days * 86400)) : 0;
 		$sql_sort = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC');
 
-		$keywords = utf8_normalize_nfc(request_var('keywords', '', true));
+		$keywords = $request->variable('keywords', '', true);
 		$keywords_param = !empty($keywords) ? '&amp;keywords=' . urlencode(htmlspecialchars_decode($keywords)) : '';
 
 		$l_title = $user->lang['ACP_' . strtoupper($mode) . '_LOGS'];
--- a/includes/acp/acp_main.php
+++ b/includes/acp/acp_main.php
@@ -25,8 +25,8 @@ class acp_main
 
 	function main($id, $mode)
 	{
-		global $config, $db, $cache, $user, $auth, $template, $request;
-		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $phpbb_container, $phpbb_dispatcher;
+		global $config, $db, $cache, $user, $auth, $template, $request, $phpbb_log;
+		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $phpbb_container, $phpbb_dispatcher, $phpbb_filesystem;
 
 		// Show restore permissions notice
 		if ($user->data['user_perm_from'] && $auth->acl_get('a_switchperm'))
@@ -53,7 +53,7 @@ class acp_main
 			return;
 		}
 
-		$action = request_var('action', '');
+		$action = $request->variable('action', '');
 
 		if ($action)
 		{
@@ -118,12 +118,13 @@ class acp_main
 					case 'online':
 						if (!$auth->acl_get('a_board'))
 						{
+							send_status_line(403, 'Forbidden');
 							trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
 						}
 
-						set_config('record_online_users', 1, true);
-						set_config('record_online_date', time(), true);
-						add_log('admin', 'LOG_RESET_ONLINE');
+						$config->set('record_online_users', 1, false);
+						$config->set('record_online_date', time(), false);
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RESET_ONLINE');
 
 						if ($request->is_ajax())
 						{
@@ -134,6 +135,7 @@ class acp_main
 					case 'stats':
 						if (!$auth->acl_get('a_board'))
 						{
+							send_status_line(403, 'Forbidden');
 							trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
 						}
 
@@ -141,35 +143,35 @@ class acp_main
 							FROM ' . POSTS_TABLE . '
 							WHERE post_visibility = ' . ITEM_APPROVED;
 						$result = $db->sql_query($sql);
-						set_config('num_posts', (int) $db->sql_fetchfield('stat'), true);
+						$config->set('num_posts', (int) $db->sql_fetchfield('stat'), false);
 						$db->sql_freeresult($result);
 
 						$sql = 'SELECT COUNT(topic_id) AS stat
 							FROM ' . TOPICS_TABLE . '
 							WHERE topic_visibility = ' . ITEM_APPROVED;
 						$result = $db->sql_query($sql);
-						set_config('num_topics', (int) $db->sql_fetchfield('stat'), true);
+						$config->set('num_topics', (int) $db->sql_fetchfield('stat'), false);
 						$db->sql_freeresult($result);
 
 						$sql = 'SELECT COUNT(user_id) AS stat
 							FROM ' . USERS_TABLE . '
 							WHERE user_type IN (' . USER_NORMAL . ',' . USER_FOUNDER . ')';
 						$result = $db->sql_query($sql);
-						set_config('num_users', (int) $db->sql_fetchfield('stat'), true);
+						$config->set('num_users', (int) $db->sql_fetchfield('stat'), false);
 						$db->sql_freeresult($result);
 
 						$sql = 'SELECT COUNT(attach_id) as stat
 							FROM ' . ATTACHMENTS_TABLE . '
 							WHERE is_orphan = 0';
 						$result = $db->sql_query($sql);
-						set_config('num_files', (int) $db->sql_fetchfield('stat'), true);
+						$config->set('num_files', (int) $db->sql_fetchfield('stat'), false);
 						$db->sql_freeresult($result);
 
 						$sql = 'SELECT SUM(filesize) as stat
 							FROM ' . ATTACHMENTS_TABLE . '
 							WHERE is_orphan = 0';
 						$result = $db->sql_query($sql);
-						set_config('upload_dir_size', (float) $db->sql_fetchfield('stat'), true);
+						$config->set('upload_dir_size', (float) $db->sql_fetchfield('stat'), false);
 						$db->sql_freeresult($result);
 
 						if (!function_exists('update_last_username'))
@@ -178,7 +180,7 @@ class acp_main
 						}
 						update_last_username();
 
-						add_log('admin', 'LOG_RESYNC_STATS');
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RESYNC_STATS');
 
 						if ($request->is_ajax())
 						{
@@ -189,6 +191,7 @@ class acp_main
 					case 'user':
 						if (!$auth->acl_get('a_board'))
 						{
+							send_status_line(403, 'Forbidden');
 							trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
 						}
 
@@ -215,7 +218,7 @@ class acp_main
 						// Still no maximum post id? Then we are finished
 						if (!$max_post_id)
 						{
-							add_log('admin', 'LOG_RESYNC_POSTCOUNTS');
+							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RESYNC_POSTCOUNTS');
 							break;
 						}
 
@@ -245,7 +248,7 @@ class acp_main
 							$start += $step;
 						}
 
-						add_log('admin', 'LOG_RESYNC_POSTCOUNTS');
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RESYNC_POSTCOUNTS');
 
 						if ($request->is_ajax())
 						{
@@ -256,11 +259,12 @@ class acp_main
 					case 'date':
 						if (!$auth->acl_get('a_board'))
 						{
+							send_status_line(403, 'Forbidden');
 							trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
 						}
 
-						set_config('board_startdate', time() - 1);
-						add_log('admin', 'LOG_RESET_DATE');
+						$config->set('board_startdate', time() - 1);
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RESET_DATE');
 
 						if ($request->is_ajax())
 						{
@@ -271,7 +275,6 @@ class acp_main
 					case 'db_track':
 						switch ($db->get_sql_layer())
 						{
-							case 'sqlite':
 							case 'sqlite3':
 								$db->sql_query('DELETE FROM ' . TOPICS_POSTED_TABLE);
 							break;
@@ -340,7 +343,7 @@ class acp_main
 							}
 						}
 
-						add_log('admin', 'LOG_RESYNC_POST_MARKING');
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RESYNC_POST_MARKING');
 
 						if ($request->is_ajax())
 						{
@@ -352,11 +355,16 @@ class acp_main
 						$config->increment('assets_version', 1);
 						$cache->purge();
 
+						// Remove old renderers from the text_formatter service. Since this
+						// operation is performed after the cache is purged, there is not "current"
+						// renderer and in effect all renderers will be purged
+						$phpbb_container->get('text_formatter.cache')->tidy();
+
 						// Clear permissions
 						$auth->acl_clear_prefetch();
 						phpbb_cache_moderators($db, $cache, $auth);
 
-						add_log('admin', 'LOG_PURGE_CACHE');
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PURGE_CACHE');
 
 						if ($request->is_ajax())
 						{
@@ -367,6 +375,7 @@ class acp_main
 					case 'purge_sessions':
 						if ((int) $user->data['user_type'] !== USER_FOUNDER)
 						{
+							send_status_line(403, 'Forbidden');
 							trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
 						}
 
@@ -376,7 +385,6 @@ class acp_main
 						{
 							switch ($db->get_sql_layer())
 							{
-								case 'sqlite':
 								case 'sqlite3':
 									$db->sql_query("DELETE FROM $table");
 								break;
@@ -407,7 +415,7 @@ class acp_main
 						$sql = 'INSERT INTO ' . SESSIONS_TABLE . ' ' . $db->sql_build_array('INSERT', $reinsert_ary);
 						$db->sql_query($sql);
 
-						add_log('admin', 'LOG_PURGE_SESSIONS');
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PURGE_SESSIONS');
 
 						if ($request->is_ajax())
 						{
@@ -421,7 +429,7 @@ class acp_main
 		// Version check
 		$user->add_lang('install');
 
-		if ($auth->acl_get('a_server') && version_compare(PHP_VERSION, '5.3.3', '<'))
+		if ($auth->acl_get('a_server') && version_compare(PHP_VERSION, '5.4', '<'))
 		{
 			$template->assign_vars(array(
 				'S_PHP_VERSION_OLD'	=> true,
@@ -431,6 +439,7 @@ class acp_main
 
 		if ($auth->acl_get('a_board'))
 		{
+			/* @var $version_helper \phpbb\version_helper */
 			$version_helper = $phpbb_container->get('version_helper');
 			try
 			{
@@ -441,9 +450,10 @@ class acp_main
 			}
 			catch (\RuntimeException $e)
 			{
+				$message = call_user_func_array(array($user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
 				$template->assign_vars(array(
 					'S_VERSIONCHECK_FAIL'		=> true,
-					'VERSIONCHECK_FAIL_REASON'	=> ($e->getMessage() !== $user->lang('VERSIONCHECK_FAIL')) ? $e->getMessage() : '',
+					'VERSIONCHECK_FAIL_REASON'	=> ($e->getMessage() !== 'VERSIONCHECK_FAIL') ? $message : '',
 				));
 			}
 		}
@@ -658,7 +668,7 @@ class acp_main
 			}
 		}
 
-		if (!defined('PHPBB_DISABLE_CONFIG_CHECK') && file_exists($phpbb_root_path . 'config.' . $phpEx) && phpbb_is_writable($phpbb_root_path . 'config.' . $phpEx))
+		if (!defined('PHPBB_DISABLE_CONFIG_CHECK') && file_exists($phpbb_root_path . 'config.' . $phpEx) && $phpbb_filesystem->is_writable($phpbb_root_path . 'config.' . $phpEx))
 		{
 			// World-Writable? (000x)
 			$template->assign_var('S_WRITABLE_CONFIG', (bool) (@fileperms($phpbb_root_path . 'config.' . $phpEx) & 0x0002));
@@ -678,7 +688,7 @@ class acp_main
 		// Fill dbms version if not yet filled
 		if (empty($config['dbms_version']))
 		{
-			set_config('dbms_version', $db->sql_server_info(true));
+			$config->set('dbms_version', $db->sql_server_info(true));
 		}
 
 		$this->tpl_name = 'acp_main';
--- a/includes/acp/acp_modules.php
+++ b/includes/acp/acp_modules.php
@@ -19,6 +19,8 @@ if (!defined('IN_PHPBB'))
 	exit;
 }
 
+use phpbb\module\exception\module_exception;
+
 /**
 * - Able to check for new module versions (modes changed/adjusted/added/removed)
 * Icons for:
@@ -37,8 +39,10 @@ class acp_modules
 
 	function main($id, $mode)
 	{
-		global $db, $user, $auth, $template, $module, $request;
-		global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx;
+		global $db, $user, $template, $module, $request, $phpbb_log, $phpbb_container;
+
+		/** @var \phpbb\module\module_manager $module_manager */
+		$module_manager = $phpbb_container->get('module.manager');
 
 		// Set a global define for modules we might include (the author is able to prevent execution of code by checking this constant)
 		define('MODULE_INCLUDE', true);
@@ -68,9 +72,9 @@ class acp_modules
 
 		$this->page_title = strtoupper($this->module_class);
 
-		$this->parent_id = request_var('parent_id', 0);
-		$module_id = request_var('m', 0);
-		$action = request_var('action', '');
+		$this->parent_id = $request->variable('parent_id', 0);
+		$module_id = $request->variable('m', 0);
+		$action = $request->variable('action', '');
 		$errors = array();
 
 		switch ($action)
@@ -94,13 +98,20 @@ class acp_modules
 						$db->sql_freeresult($result);
 					}
 
-					$errors = $this->delete_module($module_id);
-
-					if (!sizeof($errors))
+					try
 					{
-						$this->remove_cache_file();
-						trigger_error($user->lang['MODULE_DELETED'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id));
+						$row = $module_manager->get_module_row($module_id, $this->module_class);
+						$module_manager->delete_module($module_id, $this->module_class);
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_MODULE_REMOVED', false, array($user->lang($row['module_langname'])));
 					}
+					catch (module_exception $e)
+					{
+						$msg = $user->lang($e->getMessage());
+						trigger_error($msg . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
+					}
+
+					$module_manager->remove_cache_file($this->module_class);
+					trigger_error($user->lang['MODULE_DELETED'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id));
 				}
 				else
 				{
@@ -146,8 +157,8 @@ class acp_modules
 						AND module_id = $module_id";
 				$db->sql_query($sql);
 
-				add_log('admin', 'LOG_MODULE_' . strtoupper($action), $this->lang_name($row['module_langname']));
-				$this->remove_cache_file();
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_MODULE_' . strtoupper($action), false, array($user->lang($row['module_langname'])));
+				$module_manager->remove_cache_file($this->module_class);
 
 			break;
 
@@ -176,12 +187,16 @@ class acp_modules
 					trigger_error($user->lang['NO_MODULE'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
 				}
 
-				$move_module_name = $this->move_module_by($row, $action, 1);
+				try
+				{
+					$move_module_name = $module_manager->move_module_by($row, $this->module_class, $action, 1);
 
-				if ($move_module_name !== false)
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_MODULE_' . strtoupper($action), false, array($user->lang($row['module_langname']), $move_module_name));
+					$module_manager->remove_cache_file($this->module_class);
+				}
+				catch (module_exception $e)
 				{
-					add_log('admin', 'LOG_MODULE_' . strtoupper($action), $this->lang_name($row['module_langname']), $move_module_name);
-					$this->remove_cache_file();
+					// Do nothing
 				}
 
 				if ($request->is_ajax())
@@ -195,7 +210,7 @@ class acp_modules
 			break;
 
 			case 'quickadd':
-				$quick_install = request_var('quick_install', '');
+				$quick_install = $request->variable('quick_install', '');
 
 				if (confirm_box(true))
 				{
@@ -207,7 +222,7 @@ class acp_modules
 					list($module_basename, $module_mode) = explode('::', $quick_install);
 
 					// Check if module name and mode exist...
-					$fileinfo = $this->get_module_infos($module_basename);
+					$fileinfo = $module_manager->get_module_infos($this->module_class, $module_basename);
 					$fileinfo = $fileinfo[$module_basename];
 
 					if (isset($fileinfo['modes'][$module_mode]))
@@ -223,11 +238,20 @@ class acp_modules
 							'module_auth'		=> $fileinfo['modes'][$module_mode]['auth'],
 						);
 
-						$errors = $this->update_module_data($module_data);
+						try
+						{
+							$module_manager->update_module_data($module_data);
+							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_MODULE_ADD', false, array($user->lang($module_data['module_langname'])));
+						}
+						catch (\phpbb\module\exception\module_exception $e)
+						{
+							$msg = $user->lang($e->getMessage());
+							trigger_error($msg . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
+						}
 
 						if (!sizeof($errors))
 						{
-							$this->remove_cache_file();
+							$module_manager->remove_cache_file($this->module_class);
 
 							trigger_error($user->lang['MODULE_ADDED'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id));
 						}
@@ -253,7 +277,15 @@ class acp_modules
 					trigger_error($user->lang['NO_MODULE_ID'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
 				}
 
-				$module_row = $this->get_module_row($module_id);
+				try
+				{
+					$module_row = $module_manager->get_module_row($module_id, $this->module_class);
+				}
+				catch (\phpbb\module\exception\module_not_found_exception $e)
+				{
+					$msg = $user->lang($e->getMessage());
+					trigger_error($msg . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
+				}
 
 			// no break
 
@@ -266,7 +298,7 @@ class acp_modules
 						'module_enabled'	=> 0,
 						'module_display'	=> 1,
 						'parent_id'			=> 0,
-						'module_langname'	=> utf8_normalize_nfc(request_var('module_langname', '', true)),
+						'module_langname'	=> $request->variable('module_langname', '', true),
 						'module_mode'		=> '',
 						'module_auth'		=> '',
 					);
@@ -274,13 +306,13 @@ class acp_modules
 
 				$module_data = array();
 
-				$module_data['module_basename'] = request_var('module_basename', (string) $module_row['module_basename']);
-				$module_data['module_enabled'] = request_var('module_enabled', (int) $module_row['module_enabled']);
-				$module_data['module_display'] = request_var('module_display', (int) $module_row['module_display']);
-				$module_data['parent_id'] = request_var('module_parent_id', (int) $module_row['parent_id']);
+				$module_data['module_basename'] = $request->variable('module_basename', (string) $module_row['module_basename']);
+				$module_data['module_enabled'] = $request->variable('module_enabled', (int) $module_row['module_enabled']);
+				$module_data['module_display'] = $request->variable('module_display', (int) $module_row['module_display']);
+				$module_data['parent_id'] = $request->variable('module_parent_id', (int) $module_row['parent_id']);
 				$module_data['module_class'] = $this->module_class;
-				$module_data['module_langname'] = utf8_normalize_nfc(request_var('module_langname', (string) $module_row['module_langname'], true));
-				$module_data['module_mode'] = request_var('module_mode', (string) $module_row['module_mode']);
+				$module_data['module_langname'] = $request->variable('module_langname', (string) $module_row['module_langname'], true);
+				$module_data['module_mode'] = $request->variable('module_mode', (string) $module_row['module_mode']);
 
 				$submit = (isset($_POST['submit'])) ? true : false;
 
@@ -296,7 +328,7 @@ class acp_modules
 						trigger_error($user->lang['NO_MODULE_LANGNAME'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
 					}
 
-					$module_type = request_var('module_type', 'category');
+					$module_type = $request->variable('module_type', 'category');
 
 					if ($module_type == 'category')
 					{
@@ -312,15 +344,29 @@ class acp_modules
 					// Adjust auth row
 					if ($module_data['module_basename'] && $module_data['module_mode'])
 					{
-						$fileinfo = $this->get_module_infos($module_data['module_basename']);
+						$fileinfo = $module_manager->get_module_infos($this->module_class, $module_data['module_basename']);
 						$module_data['module_auth'] = $fileinfo[$module_data['module_basename']]['modes'][$module_data['module_mode']]['auth'];
 					}
 
-					$errors = $this->update_module_data($module_data);
+					try
+					{
+						$module_manager->update_module_data($module_data);
+						$phpbb_log->add('admin',
+							$user->data['user_id'],
+							$user->ip,
+							($action === 'edit') ? 'LOG_MODULE_EDIT' : 'LOG_MODULE_ADD',
+							false,
+							array($user->lang($module_data['module_langname']))
+						);					}
+					catch (\phpbb\module\exception\module_exception $e)
+					{
+						$msg = $user->lang($e->getMessage());
+						trigger_error($msg . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
+					}
 
 					if (!sizeof($errors))
 					{
-						$this->remove_cache_file();
+						$module_manager->remove_cache_file($this->module_class);
 
 						trigger_error((($action == 'add') ? $user->lang['MODULE_ADDED'] : $user->lang['MODULE_EDITED']) . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id));
 					}
@@ -330,7 +376,7 @@ class acp_modules
 				$is_cat = (!$module_data['module_basename']) ? true : false;
 
 				// Get module information
-				$module_infos = $this->get_module_infos();
+				$module_infos = $module_manager->get_module_infos($this->module_class);
 
 				// Build name options
 				$s_name_options = $s_mode_options = '';
@@ -342,7 +388,7 @@ class acp_modules
 					}
 
 					// Name options
-					$s_name_options .= '<option value="' . $option . '"' . (($option == $module_data['module_basename']) ? ' selected="selected"' : '') . '>' . $this->lang_name($values['title']) . ' [' . $option . ']</option>';
+					$s_name_options .= '<option value="' . $option . '"' . (($option == $module_data['module_basename']) ? ' selected="selected"' : '') . '>' . $user->lang($values['title']) . ' [' . $option . ']</option>';
 
 					$template->assign_block_vars('m_names', array('NAME' => $option, 'A_NAME' => addslashes($option)));
 
@@ -351,14 +397,14 @@ class acp_modules
 					{
 						if ($option == $module_data['module_basename'])
 						{
-							$s_mode_options .= '<option value="' . $m_mode . '"' . (($m_mode == $module_data['module_mode']) ? ' selected="selected"' : '') . '>' . $this->lang_name($m_values['title']) . '</option>';
+							$s_mode_options .= '<option value="' . $m_mode . '"' . (($m_mode == $module_data['module_mode']) ? ' selected="selected"' : '') . '>' . $user->lang($m_values['title']) . '</option>';
 						}
 
 						$template->assign_block_vars('m_names.modes', array(
 							'OPTION'		=> $m_mode,
-							'VALUE'			=> $this->lang_name($m_values['title']),
+							'VALUE'			=> $user->lang($m_values['title']),
 							'A_OPTION'		=> addslashes($m_mode),
-							'A_VALUE'		=> addslashes($this->lang_name($m_values['title'])))
+							'A_VALUE'		=> addslashes($user->lang($m_values['title'])))
 						);
 					}
 				}
@@ -376,7 +422,7 @@ class acp_modules
 
 					'L_TITLE'			=> $user->lang[strtoupper($action) . '_MODULE'],
 
-					'MODULENAME'		=> $this->lang_name($module_data['module_langname']),
+					'MODULENAME'		=> $user->lang($module_data['module_langname']),
 					'ACTION'			=> $action,
 					'MODULE_ID'			=> $module_id,
 
@@ -424,11 +470,11 @@ class acp_modules
 		{
 			$navigation = '<a href="' . $this->u_action . '">' . strtoupper($this->module_class) . '</a>';
 
-			$modules_nav = $this->get_module_branch($this->parent_id, 'parents', 'descending');
+			$modules_nav = $module_manager->get_module_branch($this->parent_id, $this->module_class, 'parents');
 
 			foreach ($modules_nav as $row)
 			{
-				$langname = $this->lang_name($row['module_langname']);
+				$langname = $user->lang($row['module_langname']);
 
 				if ($row['module_id'] == $this->parent_id)
 				{
@@ -455,7 +501,7 @@ class acp_modules
 		{
 			do
 			{
-				$langname = $this->lang_name($row['module_langname']);
+				$langname = $user->lang($row['module_langname']);
 
 				if (!$row['module_enabled'])
 				{
@@ -490,7 +536,15 @@ class acp_modules
 		}
 		else if ($this->parent_id)
 		{
-			$row = $this->get_module_row($this->parent_id);
+			try
+			{
+				$row = $module_manager->get_module_row($this->parent_id, $this->module_class);
+			}
+			catch (\phpbb\module\exception\module_not_found_exception $e)
+			{
+				$msg = $user->lang($e->getMessage());
+				trigger_error($msg . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
+			}
 
 			$url = $this->u_action . '&amp;parent_id=' . $this->parent_id . '&amp;m=' . $row['module_id'];
 
@@ -509,19 +563,19 @@ class acp_modules
 		$db->sql_freeresult($result);
 
 		// Quick adding module
-		$module_infos = $this->get_module_infos();
+		$module_infos = $module_manager->get_module_infos($this->module_class);
 
 		// Build quick options
 		$s_install_options = '';
 		foreach ($module_infos as $option => $values)
 		{
 			// Name options
-			$s_install_options .= '<optgroup label="' . $this->lang_name($values['title']) . ' [' . $option . ']">';
+			$s_install_options .= '<optgroup label="' . $user->lang($values['title']) . ' [' . $option . ']">';
 
 			// Build module modes
 			foreach ($values['modes'] as $m_mode => $m_values)
 			{
-				$s_install_options .= '<option value="' . $option . '::' . $m_mode . '">&nbsp; &nbsp;' . $this->lang_name($m_values['title']) . '</option>';
+				$s_install_options .= '<option value="' . $option . '::' . $m_mode . '">&nbsp; &nbsp;' . $user->lang($m_values['title']) . '</option>';
 			}
 
 			$s_install_options .= '</optgroup>';
@@ -538,110 +592,12 @@ class acp_modules
 		);
 	}
 
-	/**
-	* Get row for specified module
-	*/
-	function get_module_row($module_id)
-	{
-		global $db, $user;
-
-		$sql = 'SELECT *
-			FROM ' . MODULES_TABLE . "
-			WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
-				AND module_id = $module_id";
-		$result = $db->sql_query($sql);
-		$row = $db->sql_fetchrow($result);
-		$db->sql_freeresult($result);
-
-		if (!$row)
-		{
-			trigger_error($user->lang['NO_MODULE'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
-		}
-
-		return $row;
-	}
-
-	/**
-	* Get available module information from module files
-	*
-	* @param string $module
-	* @param bool|string $module_class
-	* @param bool $use_all_available Use all available instead of just all
-	* 						enabled extensions
-	* @return array
-	*/
-	function get_module_infos($module = '', $module_class = false, $use_all_available = false)
-	{
-		global $phpbb_extension_manager, $phpbb_root_path, $phpEx;
-
-		$module_class = ($module_class === false) ? $this->module_class : $module_class;
-
-		$directory = $phpbb_root_path . 'includes/' . $module_class . '/info/';
-		$fileinfo = array();
-
-		$finder = $phpbb_extension_manager->get_finder($use_all_available);
-
-		$modules = $finder
-			->extension_suffix('_module')
-			->extension_directory("/$module_class")
-			->core_path("includes/$module_class/info/")
-			->core_prefix($module_class . '_')
-			->get_classes(true);
-
-		foreach ($modules as $cur_module)
-		{
-			// Skip entries we do not need if we know the module we are
-			// looking for
-			if ($module && strpos(str_replace('\\', '_', $cur_module), $module) === false && $module !== $cur_module)
-			{
-				continue;
-			}
-
-			$info_class = preg_replace('/_module$/', '_info', $cur_module);
-
-			// If the class does not exist it might be following the old
-			// format. phpbb_acp_info_acp_foo needs to be turned into
-			// acp_foo_info and the respective file has to be included
-			// manually because it does not support auto loading
-			$old_info_class_file = str_replace("phpbb_{$module_class}_info_", '', $cur_module);
-			$old_info_class = $old_info_class_file . '_info';
-
-			if (class_exists($old_info_class))
-			{
-				$info_class = $old_info_class;
-			}
-			else if (!class_exists($info_class))
-			{
-				$info_class = $old_info_class;
-				// need to check class exists again because previous checks triggered autoloading
-				if (!class_exists($info_class) && file_exists($directory . $old_info_class_file . '.' . $phpEx))
-				{
-					include($directory . $old_info_class_file . '.' . $phpEx);
-				}
-			}
-
-			if (class_exists($info_class))
-			{
-				$info = new $info_class();
-				$module_info = $info->module();
-
-				$main_class = (isset($module_info['filename'])) ? $module_info['filename'] : $cur_module;
-
-				$fileinfo[$main_class] = $module_info;
-			}
-		}
-
-		ksort($fileinfo);
-
-		return $fileinfo;
-	}
-
 	/**
 	* Simple version of jumpbox, just lists modules
 	*/
 	function make_module_select($select_id = false, $ignore_id = false, $ignore_acl = false, $ignore_nonpost = false, $ignore_emptycat = true, $ignore_noncat = false)
 	{
-		global $db, $user, $auth, $config;
+		global $db, $user;
 
 		$sql = 'SELECT module_id, module_enabled, module_basename, parent_id, module_langname, left_id, right_id, module_auth
 			FROM ' . MODULES_TABLE . "
@@ -696,7 +652,7 @@ class acp_modules
 
 			$selected = (is_array($select_id)) ? ((in_array($row['module_id'], $select_id)) ? ' selected="selected"' : '') : (($row['module_id'] == $select_id) ? ' selected="selected"' : '');
 
-			$langname = $this->lang_name($row['module_langname']);
+			$langname = $user->lang($row['module_langname']);
 			$module_list .= '<option value="' . $row['module_id'] . '"' . $selected . ((!$row['module_enabled']) ? ' class="disabled"' : '') . '>' . $padding . $langname . '</option>';
 
 			$iteration++;
@@ -707,401 +663,4 @@ class acp_modules
 
 		return $module_list;
 	}
-
-	/**
-	* Get module branch
-	*/
-	function get_module_branch($module_id, $type = 'all', $order = 'descending', $include_module = true)
-	{
-		global $db;
-
-		switch ($type)
-		{
-			case 'parents':
-				$condition = 'm1.left_id BETWEEN m2.left_id AND m2.right_id';
-			break;
-
-			case 'children':
-				$condition = 'm2.left_id BETWEEN m1.left_id AND m1.right_id';
-			break;
-
-			default:
-				$condition = 'm2.left_id BETWEEN m1.left_id AND m1.right_id OR m1.left_id BETWEEN m2.left_id AND m2.right_id';
-			break;
-		}
-
-		$rows = array();
-
-		$sql = 'SELECT m2.*
-			FROM ' . MODULES_TABLE . ' m1
-			LEFT JOIN ' . MODULES_TABLE . " m2 ON ($condition)
-			WHERE m1.module_class = '" . $db->sql_escape($this->module_class) . "'
-				AND m2.module_class = '" . $db->sql_escape($this->module_class) . "'
-				AND m1.module_id = $module_id
-			ORDER BY m2.left_id " . (($order == 'descending') ? 'ASC' : 'DESC');
-		$result = $db->sql_query($sql);
-
-		while ($row = $db->sql_fetchrow($result))
-		{
-			if (!$include_module && $row['module_id'] == $module_id)
-			{
-				continue;
-			}
-
-			$rows[] = $row;
-		}
-		$db->sql_freeresult($result);
-
-		return $rows;
-	}
-
-	/**
-	* Remove modules cache file
-	*/
-	function remove_cache_file()
-	{
-		global $phpbb_container;
-
-		// Sanitise for future path use, it's escaped as appropriate for queries
-		$p_class = str_replace(array('.', '/', '\\'), '', basename($this->module_class));
-
-		$phpbb_container->get('cache.driver')->destroy('_modules_' . $p_class);
-
-		// Additionally remove sql cache
-		$phpbb_container->get('cache.driver')->destroy('sql', MODULES_TABLE);
-	}
-
-	/**
-	* Return correct language name
-	*/
-	function lang_name($module_langname)
-	{
-		global $user;
-
-		return (!empty($user->lang[$module_langname])) ? $user->lang[$module_langname] : $module_langname;
-	}
-
-	/**
-	* Update/Add module
-	*
-	* @param array	&$module_data	The module data
-	* @param bool	$run_inline 	if set to true errors will be returned and no logs being written
-	*/
-	function update_module_data(&$module_data, $run_inline = false)
-	{
-		global $db, $user;
-
-		if (!isset($module_data['module_id']))
-		{
-			// no module_id means we're creating a new category/module
-			if ($module_data['parent_id'])
-			{
-				$sql = 'SELECT left_id, right_id
-					FROM ' . MODULES_TABLE . "
-					WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'
-						AND module_id = " . (int) $module_data['parent_id'];
-				$result = $db->sql_query($sql);
-				$row = $db->sql_fetchrow($result);
-				$db->sql_freeresult($result);
-
-				if (!$row)
-				{
-					if ($run_inline)
-					{
-						return 'PARENT_NO_EXIST';
-					}
-
-					trigger_error($user->lang['PARENT_NO_EXIST'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
-				}
-
-				// Workaround
-				$row['left_id'] = (int) $row['left_id'];
-				$row['right_id'] = (int) $row['right_id'];
-
-				$sql = 'UPDATE ' . MODULES_TABLE . "
-					SET left_id = left_id + 2, right_id = right_id + 2
-					WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'
-						AND left_id > {$row['right_id']}";
-				$db->sql_query($sql);
-
-				$sql = 'UPDATE ' . MODULES_TABLE . "
-					SET right_id = right_id + 2
-					WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'
-						AND {$row['left_id']} BETWEEN left_id AND right_id";
-				$db->sql_query($sql);
-
-				$module_data['left_id'] = (int) $row['right_id'];
-				$module_data['right_id'] = (int) $row['right_id'] + 1;
-			}
-			else
-			{
-				$sql = 'SELECT MAX(right_id) AS right_id
-					FROM ' . MODULES_TABLE . "
-					WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'";
-				$result = $db->sql_query($sql);
-				$row = $db->sql_fetchrow($result);
-				$db->sql_freeresult($result);
-
-				$module_data['left_id'] = (int) $row['right_id'] + 1;
-				$module_data['right_id'] = (int) $row['right_id'] + 2;
-			}
-
-			$sql = 'INSERT INTO ' . MODULES_TABLE . ' ' . $db->sql_build_array('INSERT', $module_data);
-			$db->sql_query($sql);
-
-			$module_data['module_id'] = $db->sql_nextid();
-
-			if (!$run_inline)
-			{
-				add_log('admin', 'LOG_MODULE_ADD', $this->lang_name($module_data['module_langname']));
-			}
-		}
-		else
-		{
-			$row = $this->get_module_row($module_data['module_id']);
-
-			if ($module_data['module_basename'] && !$row['module_basename'])
-			{
-				// we're turning a category into a module
-				$branch = $this->get_module_branch($module_data['module_id'], 'children', 'descending', false);
-
-				if (sizeof($branch))
-				{
-					return array($user->lang['NO_CATEGORY_TO_MODULE']);
-				}
-			}
-
-			if ($row['parent_id'] != $module_data['parent_id'])
-			{
-				$this->move_module($module_data['module_id'], $module_data['parent_id']);
-			}
-
-			$update_ary = $module_data;
-			unset($update_ary['module_id']);
-
-			$sql = 'UPDATE ' . MODULES_TABLE . '
-				SET ' . $db->sql_build_array('UPDATE', $update_ary) . "
-				WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'
-					AND module_id = " . (int) $module_data['module_id'];
-			$db->sql_query($sql);
-
-			if (!$run_inline)
-			{
-				add_log('admin', 'LOG_MODULE_EDIT', $this->lang_name($module_data['module_langname']));
-			}
-		}
-
-		return array();
-	}
-
-	/**
-	* Move module around the tree
-	*/
-	function move_module($from_module_id, $to_parent_id)
-	{
-		global $db;
-
-		$moved_modules = $this->get_module_branch($from_module_id, 'children', 'descending');
-		$from_data = $moved_modules[0];
-		$diff = sizeof($moved_modules) * 2;
-
-		$moved_ids = array();
-		for ($i = 0, $size = sizeof($moved_modules); $i < $size; ++$i)
-		{
-			$moved_ids[] = $moved_modules[$i]['module_id'];
-		}
-
-		// Resync parents
-		$sql = 'UPDATE ' . MODULES_TABLE . "
-			SET right_id = right_id - $diff
-			WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
-				AND left_id < " . (int) $from_data['right_id'] . '
-				AND right_id > ' . (int) $from_data['right_id'];
-		$db->sql_query($sql);
-
-		// Resync righthand side of tree
-		$sql = 'UPDATE ' . MODULES_TABLE . "
-			SET left_id = left_id - $diff, right_id = right_id - $diff
-			WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
-				AND left_id > " . (int) $from_data['right_id'];
-		$db->sql_query($sql);
-
-		if ($to_parent_id > 0)
-		{
-			$to_data = $this->get_module_row($to_parent_id);
-
-			// Resync new parents
-			$sql = 'UPDATE ' . MODULES_TABLE . "
-				SET right_id = right_id + $diff
-				WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
-					AND " . (int) $to_data['right_id'] . ' BETWEEN left_id AND right_id
-					AND ' . $db->sql_in_set('module_id', $moved_ids, true);
-			$db->sql_query($sql);
-
-			// Resync the righthand side of the tree
-			$sql = 'UPDATE ' . MODULES_TABLE . "
-				SET left_id = left_id + $diff, right_id = right_id + $diff
-				WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
-					AND left_id > " . (int) $to_data['right_id'] . '
-					AND ' . $db->sql_in_set('module_id', $moved_ids, true);
-			$db->sql_query($sql);
-
-			// Resync moved branch
-			$to_data['right_id'] += $diff;
-			if ($to_data['right_id'] > $from_data['right_id'])
-			{
-				$diff = '+ ' . ($to_data['right_id'] - $from_data['right_id'] - 1);
-			}
-			else
-			{
-				$diff = '- ' . abs($to_data['right_id'] - $from_data['right_id'] - 1);
-			}
-		}
-		else
-		{
-			$sql = 'SELECT MAX(right_id) AS right_id
-				FROM ' . MODULES_TABLE . "
-				WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
-					AND " . $db->sql_in_set('module_id', $moved_ids, true);
-			$result = $db->sql_query($sql);
-			$row = $db->sql_fetchrow($result);
-			$db->sql_freeresult($result);
-
-			$diff = '+ ' . (int) ($row['right_id'] - $from_data['left_id'] + 1);
-		}
-
-		$sql = 'UPDATE ' . MODULES_TABLE . "
-			SET left_id = left_id $diff, right_id = right_id $diff
-			WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
-				AND " . $db->sql_in_set('module_id', $moved_ids);
-		$db->sql_query($sql);
-	}
-
-	/**
-	* Remove module from tree
-	*/
-	function delete_module($module_id)
-	{
-		global $db, $user;
-
-		$row = $this->get_module_row($module_id);
-
-		$branch = $this->get_module_branch($module_id, 'children', 'descending', false);
-
-		if (sizeof($branch))
-		{
-			return array($user->lang['CANNOT_REMOVE_MODULE']);
-		}
-
-		// If not move
-		$diff = 2;
-		$sql = 'DELETE FROM ' . MODULES_TABLE . "
-			WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
-				AND module_id = $module_id";
-		$db->sql_query($sql);
-
-		$row['right_id'] = (int) $row['right_id'];
-		$row['left_id'] = (int) $row['left_id'];
-
-		// Resync tree
-		$sql = 'UPDATE ' . MODULES_TABLE . "
-			SET right_id = right_id - $diff
-			WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
-				AND left_id < {$row['right_id']} AND right_id > {$row['right_id']}";
-		$db->sql_query($sql);
-
-		$sql = 'UPDATE ' . MODULES_TABLE . "
-			SET left_id = left_id - $diff, right_id = right_id - $diff
-			WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
-				AND left_id > {$row['right_id']}";
-		$db->sql_query($sql);
-
-		add_log('admin', 'LOG_MODULE_REMOVED', $this->lang_name($row['module_langname']));
-
-		return array();
-
-	}
-
-	/**
-	* Move module position by $steps up/down
-	*/
-	function move_module_by($module_row, $action = 'move_up', $steps = 1)
-	{
-		global $db;
-
-		/**
-		* Fetch all the siblings between the module's current spot
-		* and where we want to move it to. If there are less than $steps
-		* siblings between the current spot and the target then the
-		* module will move as far as possible
-		*/
-		$sql = 'SELECT module_id, left_id, right_id, module_langname
-			FROM ' . MODULES_TABLE . "
-			WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
-				AND parent_id = " . (int) $module_row['parent_id'] . '
-				AND ' . (($action == 'move_up') ? 'right_id < ' . (int) $module_row['right_id'] . ' ORDER BY right_id DESC' : 'left_id > ' . (int) $module_row['left_id'] . ' ORDER BY left_id ASC');
-		$result = $db->sql_query_limit($sql, $steps);
-
-		$target = array();
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$target = $row;
-		}
-		$db->sql_freeresult($result);
-
-		if (!sizeof($target))
-		{
-			// The module is already on top or bottom
-			return false;
-		}
-
-		/**
-		* $left_id and $right_id define the scope of the nodes that are affected by the move.
-		* $diff_up and $diff_down are the values to substract or add to each node's left_id
-		* and right_id in order to move them up or down.
-		* $move_up_left and $move_up_right define the scope of the nodes that are moving
-		* up. Other nodes in the scope of ($left_id, $right_id) are considered to move down.
-		*/
-		if ($action == 'move_up')
-		{
-			$left_id = (int) $target['left_id'];
-			$right_id = (int) $module_row['right_id'];
-
-			$diff_up = (int) ($module_row['left_id'] - $target['left_id']);
-			$diff_down = (int) ($module_row['right_id'] + 1 - $module_row['left_id']);
-
-			$move_up_left = (int) $module_row['left_id'];
-			$move_up_right = (int) $module_row['right_id'];
-		}
-		else
-		{
-			$left_id = (int) $module_row['left_id'];
-			$right_id = (int) $target['right_id'];
-
-			$diff_up = (int) ($module_row['right_id'] + 1 - $module_row['left_id']);
-			$diff_down = (int) ($target['right_id'] - $module_row['right_id']);
-
-			$move_up_left = (int) ($module_row['right_id'] + 1);
-			$move_up_right = (int) $target['right_id'];
-		}
-
-		// Now do the dirty job
-		$sql = 'UPDATE ' . MODULES_TABLE . "
-			SET left_id = left_id + CASE
-				WHEN left_id BETWEEN {$move_up_left} AND {$move_up_right} THEN -{$diff_up}
-				ELSE {$diff_down}
-			END,
-			right_id = right_id + CASE
-				WHEN right_id BETWEEN {$move_up_left} AND {$move_up_right} THEN -{$diff_up}
-				ELSE {$diff_down}
-			END
-			WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
-				AND left_id BETWEEN {$left_id} AND {$right_id}
-				AND right_id BETWEEN {$left_id} AND {$right_id}";
-		$db->sql_query($sql);
-
-		$this->remove_cache_file();
-
-		return $this->lang_name($target['module_langname']);
-	}
 }
--- a/includes/acp/acp_permission_roles.php
+++ b/includes/acp/acp_permission_roles.php
@@ -26,9 +26,9 @@ class acp_permission_roles
 
 	function main($id, $mode)
 	{
-		global $db, $user, $auth, $template, $cache, $phpbb_container;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
-		global $request;
+		global $db, $user, $template, $phpbb_container;
+		global $phpbb_root_path, $phpEx;
+		global $request, $phpbb_log;
 
 		if (!function_exists('user_get_id_name'))
 		{
@@ -48,8 +48,8 @@ class acp_permission_roles
 		$this->tpl_name = 'acp_permission_roles';
 
 		$submit = (isset($_POST['submit'])) ? true : false;
-		$role_id = request_var('role_id', 0);
-		$action = request_var('action', '');
+		$role_id = $request->variable('role_id', 0);
+		$action = $request->variable('action', '');
 		$action = (isset($_POST['add'])) ? 'add' : $action;
 
 		$form_name = 'acp_permissions';
@@ -116,7 +116,7 @@ class acp_permission_roles
 						$this->remove_role($role_id, $permission_type);
 
 						$role_name = (!empty($user->lang[$role_row['role_name']])) ? $user->lang[$role_row['role_name']] : $role_row['role_name'];
-						add_log('admin', 'LOG_' . strtoupper($permission_type) . 'ROLE_REMOVED', $role_name);
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_' . strtoupper($permission_type) . 'ROLE_REMOVED', false, array($role_name));
 						trigger_error($user->lang['ROLE_DELETED'] . adm_back_link($this->u_action));
 					}
 					else
@@ -155,9 +155,9 @@ class acp_permission_roles
 						trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);
 					}
 
-					$role_name = utf8_normalize_nfc(request_var('role_name', '', true));
-					$role_description = utf8_normalize_nfc(request_var('role_description', '', true));
-					$auth_settings = request_var('setting', array('' => 0));
+					$role_name = $request->variable('role_name', '', true);
+					$role_description = $request->variable('role_description', '', true);
+					$auth_settings = $request->variable('setting', array('' => 0));
 
 					if (!$role_name)
 					{
@@ -219,7 +219,7 @@ class acp_permission_roles
 					$this->auth_admin->acl_set_role($role_id, $auth_settings);
 
 					$role_name = (!empty($user->lang[$role_name])) ? $user->lang[$role_name] : $role_name;
-					add_log('admin', 'LOG_' . strtoupper($permission_type) . 'ROLE_' . strtoupper($action), $role_name);
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_' . strtoupper($permission_type) . 'ROLE_' . strtoupper($action), false, array($role_name));
 
 					trigger_error($user->lang['ROLE_' . strtoupper($action) . '_SUCCESS'] . adm_back_link($this->u_action));
 
@@ -232,11 +232,11 @@ class acp_permission_roles
 		{
 			case 'add':
 
-				$options_from = request_var('options_from', 0);
+				$options_from = $request->variable('options_from', 0);
 
 				$role_row = array(
-					'role_name'			=> utf8_normalize_nfc(request_var('role_name', '', true)),
-					'role_description'	=> utf8_normalize_nfc(request_var('role_description', '', true)),
+					'role_name'			=> $request->variable('role_name', '', true),
+					'role_description'	=> $request->variable('role_description', '', true),
 					'role_type'			=> $permission_type,
 				);
 
@@ -306,6 +306,7 @@ class acp_permission_roles
 					trigger_error($user->lang['NO_ROLE_SELECTED'] . adm_back_link($this->u_action), E_USER_WARNING);
 				}
 
+				/* @var $phpbb_permissions \phpbb\permissions */
 				$phpbb_permissions = $phpbb_container->get('acl.permissions');
 
 				$template->assign_vars(array(
@@ -425,7 +426,7 @@ class acp_permission_roles
 		$db->sql_freeresult($result);
 
 		// Display assigned items?
-		$display_item = request_var('display_item', 0);
+		$display_item = $request->variable('display_item', 0);
 
 		// Select existing roles
 		$sql = 'SELECT *
@@ -481,8 +482,9 @@ class acp_permission_roles
 	*/
 	function display_auth_options($auth_options)
 	{
-		global $template, $user, $phpbb_container;
+		global $template, $phpbb_container;
 
+		/* @var $phpbb_permissions \phpbb\permissions */
 		$phpbb_permissions = $phpbb_container->get('acl.permissions');
 
 		$content_array = $categories = array();
--- a/includes/acp/acp_permissions.php
+++ b/includes/acp/acp_permissions.php
@@ -23,12 +23,16 @@ class acp_permissions
 {
 	var $u_action;
 	var $permission_dropdown;
+
+	/**
+	 * @var $phpbb_permissions \phpbb\permissions
+	 */
 	protected $permissions;
 
 	function main($id, $mode)
 	{
-		global $db, $user, $auth, $template, $cache, $phpbb_container;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+		global $db, $user, $auth, $template, $phpbb_container, $request;
+		global $config, $phpbb_root_path, $phpEx;
 
 		if (!function_exists('user_get_id_name'))
 		{
@@ -52,9 +56,9 @@ class acp_permissions
 		// Trace has other vars
 		if ($mode == 'trace')
 		{
-			$user_id = request_var('u', 0);
-			$forum_id = request_var('f', 0);
-			$permission = request_var('auth', '');
+			$user_id = $request->variable('u', 0);
+			$forum_id = $request->variable('f', 0);
+			$permission = $request->variable('auth', '');
 
 			$this->tpl_name = 'permission_trace';
 
@@ -83,20 +87,20 @@ class acp_permissions
 		}
 
 		// Set some vars
-		$action = request_var('action', array('' => 0));
+		$action = $request->variable('action', array('' => 0));
 		$action = key($action);
 		$action = (isset($_POST['psubmit'])) ? 'apply_permissions' : $action;
 
-		$all_forums = request_var('all_forums', 0);
-		$subforum_id = request_var('subforum_id', 0);
-		$forum_id = request_var('forum_id', array(0));
+		$all_forums = $request->variable('all_forums', 0);
+		$subforum_id = $request->variable('subforum_id', 0);
+		$forum_id = $request->variable('forum_id', array(0));
 
-		$username = request_var('username', array(''), true);
-		$usernames = request_var('usernames', '', true);
-		$user_id = request_var('user_id', array(0));
+		$username = $request->variable('username', array(''), true);
+		$usernames = $request->variable('usernames', '', true);
+		$user_id = $request->variable('user_id', array(0));
 
-		$group_id = request_var('group_id', array(0));
-		$select_all_groups = request_var('select_all_groups', 0);
+		$group_id = $request->variable('group_id', array(0));
+		$select_all_groups = $request->variable('select_all_groups', 0);
 
 		$form_name = 'acp_permissions';
 		add_form_key($form_name);
@@ -163,8 +167,6 @@ class acp_permissions
 		}
 
 		// Define some common variables for every mode
-		$error = array();
-
 		$permission_scope = (strpos($mode, '_global') !== false) ? 'global' : 'local';
 
 		// Showing introductionary page?
@@ -235,7 +237,7 @@ class acp_permissions
 		);
 
 		// Get permission type
-		$permission_type = request_var('type', $this->permission_dropdown[0]);
+		$permission_type = $request->variable('type', $this->permission_dropdown[0]);
 
 		if (!in_array($permission_type, $this->permission_dropdown))
 		{
@@ -313,6 +315,7 @@ class acp_permissions
 				case 'apply_permissions':
 					if (!isset($_POST['setting']))
 					{
+						send_status_line(403, 'Forbidden');
 						trigger_error($user->lang['NO_AUTH_SETTING_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);
 					}
 					if (!check_form_key($form_name))
@@ -326,6 +329,7 @@ class acp_permissions
 				case 'apply_all_permissions':
 					if (!isset($_POST['setting']))
 					{
+						send_status_line(403, 'Forbidden');
 						trigger_error($user->lang['NO_AUTH_SETTING_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);
 					}
 					if (!check_form_key($form_name))
@@ -677,7 +681,7 @@ class acp_permissions
 		global $db, $cache, $user, $auth;
 		global $request;
 
-		$psubmit = request_var('psubmit', array(0 => array(0 => 0)));
+		$psubmit = $request->variable('psubmit', array(0 => array(0 => 0)));
 
 		// User or group to be set?
 		$ug_type = (sizeof($user_id)) ? 'user' : 'group';
@@ -685,11 +689,10 @@ class acp_permissions
 		// Check the permission setting again
 		if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
 		{
+			send_status_line(403, 'Forbidden');
 			trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
 		}
 
-		$ug_id = $forum_id = 0;
-
 		// We loop through the auth settings defined in our submit
 		list($ug_id, ) = each($psubmit);
 		list($forum_id, ) = each($psubmit[$ug_id]);
@@ -707,7 +710,7 @@ class acp_permissions
 		$assigned_role = (isset($roles[$ug_id][$forum_id])) ? (int) $roles[$ug_id][$forum_id] : 0;
 
 		// Do the admin want to set these permissions to other items too?
-		$inherit = request_var('inherit', array(0 => array(0)));
+		$inherit = $request->variable('inherit', array(0 => array(0)));
 
 		$ug_id = array($ug_id);
 		$forum_id = array($forum_id);
@@ -755,6 +758,7 @@ class acp_permissions
 
 		$this->log_action($mode, 'add', $permission_type, $ug_type, $ug_id, $forum_id);
 
+		meta_refresh(5, $this->u_action);
 		trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
 	}
 
@@ -772,6 +776,7 @@ class acp_permissions
 		// Check the permission setting again
 		if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
 		{
+			send_status_line(403, 'Forbidden');
 			trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
 		}
 
@@ -825,10 +830,12 @@ class acp_permissions
 
 		if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local')
 		{
+			meta_refresh(5, $this->u_action . '&amp;forum_id[]=' . implode('&amp;forum_id[]=', $forum_ids));
 			trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action . '&amp;forum_id[]=' . implode('&amp;forum_id[]=', $forum_ids)));
 		}
 		else
 		{
+			meta_refresh(5, $this->u_action);
 			trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
 		}
 	}
@@ -884,6 +891,7 @@ class acp_permissions
 		// Check the permission setting again
 		if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
 		{
+			send_status_line(403, 'Forbidden');
 			trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
 		}
 
@@ -899,10 +907,12 @@ class acp_permissions
 
 		if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local')
 		{
+			meta_refresh(5, $this->u_action . '&amp;forum_id[]=' . implode('&amp;forum_id[]=', $forum_id));
 			trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action . '&amp;forum_id[]=' . implode('&amp;forum_id[]=', $forum_id)));
 		}
 		else
 		{
+			meta_refresh(5, $this->u_action);
 			trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
 		}
 	}
@@ -912,7 +922,7 @@ class acp_permissions
 	*/
 	function log_action($mode, $action, $permission_type, $ug_type, $ug_id, $forum_id)
 	{
-		global $db, $user;
+		global $db, $user, $phpbb_log, $phpbb_container;
 
 		if (!is_array($ug_id))
 		{
@@ -929,10 +939,14 @@ class acp_permissions
 		$sql .= $db->sql_in_set(($ug_type == 'group') ? 'group_id' : 'user_id', array_map('intval', $ug_id));
 		$result = $db->sql_query($sql);
 
+		/** @var \phpbb\group\helper $group_helper */
+		$group_helper = $phpbb_container->get('group_helper');
+
 		$l_ug_list = '';
 		while ($row = $db->sql_fetchrow($result))
 		{
-			$l_ug_list .= (($l_ug_list != '') ? ', ' : '') . ((isset($row['group_type']) && $row['group_type'] == GROUP_SPECIAL) ? '<span class="sep">' . $user->lang['G_' . $row['name']] . '</span>' : $row['name']);
+			$group_name = $group_helper->get_name($row['name']);
+			$l_ug_list .= (($l_ug_list != '') ? ', ' : '') . ((isset($row['group_type']) && $row['group_type'] == GROUP_SPECIAL) ? '<span class="sep">' . $group_name . '</span>' : $group_name);
 		}
 		$db->sql_freeresult($result);
 
@@ -940,7 +954,7 @@ class acp_permissions
 
 		if ($forum_id[0] == 0)
 		{
-			add_log('admin', 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), $l_ug_list);
+			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), false, array($l_ug_list));
 		}
 		else
 		{
@@ -957,7 +971,7 @@ class acp_permissions
 			}
 			$db->sql_freeresult($result);
 
-			add_log('admin', 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), $l_forum_list, $l_ug_list);
+			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), false, array($l_forum_list, $l_ug_list));
 		}
 	}
 
@@ -966,7 +980,7 @@ class acp_permissions
 	*/
 	function permission_trace($user_id, $forum_id, $permission)
 	{
-		global $db, $template, $user, $auth;
+		global $db, $template, $user, $auth, $request, $phpbb_container;
 
 		if ($user_id != $user->data['user_id'])
 		{
@@ -982,6 +996,9 @@ class acp_permissions
 			trigger_error('NO_USERS', E_USER_ERROR);
 		}
 
+		/** @var \phpbb\group\helper $group_helper */
+		$group_helper = $phpbb_container->get('group_helper');
+
 		$forum_name = false;
 
 		if ($forum_id)
@@ -994,7 +1011,7 @@ class acp_permissions
 			$db->sql_freeresult($result);
 		}
 
-		$back = request_var('back', 0);
+		$back = $request->variable('back', 0);
 
 		$template->assign_vars(array(
 			'PERMISSION'			=> $this->permissions->get_permission_lang($permission),
@@ -1028,7 +1045,7 @@ class acp_permissions
 		{
 			$groups[$row['group_id']] = array(
 				'auth_setting'		=> ACL_NO,
-				'group_name'		=> ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']
+				'group_name'		=> $group_helper->get_name($row['group_name']),
 			);
 		}
 		$db->sql_freeresult($result);
@@ -1185,7 +1202,7 @@ class acp_permissions
 	*/
 	function copy_forum_permissions()
 	{
-		global $db, $auth, $cache, $template, $user;
+		global $db, $auth, $cache, $template, $user, $request;
 
 		$user->add_lang('acp/forums');
 
@@ -1193,8 +1210,8 @@ class acp_permissions
 
 		if ($submit)
 		{
-			$src = request_var('src_forum_id', 0);
-			$dest = request_var('dest_forum_ids', array(0));
+			$src = $request->variable('src_forum_id', 0);
+			$dest = $request->variable('dest_forum_ids', array(0));
 
 			if (confirm_box(true))
 			{
@@ -1236,7 +1253,10 @@ class acp_permissions
 	*/
 	function retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type)
 	{
-		global $db, $user;
+		global $db, $phpbb_container;
+
+		/** @var \phpbb\group\helper $group_helper */
+		$group_helper = $phpbb_container->get('group_helper');
 
 		$sql_forum_id = ($permission_scope == 'global') ? 'AND a.forum_id = 0' : ((sizeof($forum_id)) ? 'AND ' . $db->sql_in_set('a.forum_id', $forum_id) : 'AND a.forum_id <> 0');
 
@@ -1311,7 +1331,7 @@ class acp_permissions
 		$defined_group_ids = array();
 		while ($row = $db->sql_fetchrow($result))
 		{
-			$s_defined_group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '">' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</option>';
+			$s_defined_group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '">' . $group_helper->get_name($row['group_name']) . '</option>';
 			$defined_group_ids[] = $row['group_id'];
 		}
 		$db->sql_freeresult($result);
--- a/includes/acp/acp_php_info.php
+++ b/includes/acp/acp_php_info.php
@@ -25,8 +25,7 @@ class acp_php_info
 
 	function main($id, $mode)
 	{
-		global $db, $user, $auth, $template;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+		global $template;
 
 		if ($mode != 'info')
 		{
--- a/includes/acp/acp_profile.php
+++ b/includes/acp/acp_profile.php
@@ -25,13 +25,17 @@ class acp_profile
 
 	var $edit_lang_id;
 	var $lang_defs;
+
+	/**
+	 * @var \phpbb\di\service_collection
+	 */
 	protected $type_collection;
 
 	function main($id, $mode)
 	{
-		global $config, $db, $user, $auth, $template, $cache;
-		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix;
-		global $request, $phpbb_container, $phpbb_dispatcher;
+		global $config, $db, $user, $template;
+		global $phpbb_root_path, $phpEx;
+		global $request, $phpbb_container, $phpbb_log, $phpbb_dispatcher;
 
 		if (!function_exists('generate_smilies'))
 		{
@@ -48,10 +52,9 @@ class acp_profile
 		$this->page_title = 'ACP_CUSTOM_PROFILE_FIELDS';
 
 		$field_id = $request->variable('field_id', 0);
-		$action = (isset($_POST['create'])) ? 'create' : request_var('action', '');
+		$action = (isset($_POST['create'])) ? 'create' : $request->variable('action', '');
 
 		$error = array();
-		$s_hidden_fields = '';
 
 		$form_key = 'acp_profile';
 		add_form_key($form_key);
@@ -61,6 +64,7 @@ class acp_profile
 			trigger_error($user->lang['NO_FIELD_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
 		}
 
+		/* @var $cp \phpbb\profilefields\manager */
 		$cp = $phpbb_container->get('profilefields.manager');
 		$this->type_collection = $phpbb_container->get('profilefields.type_collection');
 
@@ -122,6 +126,7 @@ class acp_profile
 					$db->sql_query('DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . " WHERE field_id = $field_id");
 					$db->sql_query('DELETE FROM ' . PROFILE_LANG_TABLE . " WHERE field_id = $field_id");
 
+					/* @var $db_tools \phpbb\db\tools\tools_interface */
 					$db_tools = $phpbb_container->get('dbal.tools');
 					$db_tools->sql_column_remove(PROFILE_FIELDS_DATA_TABLE, 'pf_' . $field_ident);
 
@@ -147,7 +152,7 @@ class acp_profile
 
 					$db->sql_transaction('commit');
 
-					add_log('admin', 'LOG_PROFILE_FIELD_REMOVED', $field_ident);
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_REMOVED', false, array($field_ident));
 					trigger_error($user->lang['REMOVED_PROFILE_FIELD'] . adm_back_link($this->u_action));
 				}
 				else
@@ -193,7 +198,7 @@ class acp_profile
 				$field_ident = (string) $db->sql_fetchfield('field_ident');
 				$db->sql_freeresult($result);
 
-				add_log('admin', 'LOG_PROFILE_FIELD_ACTIVATE', $field_ident);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_ACTIVATE', false, array($field_ident));
 
 				if ($request->is_ajax())
 				{
@@ -234,7 +239,7 @@ class acp_profile
 					));
 				}
 
-				add_log('admin', 'LOG_PROFILE_FIELD_DEACTIVATE', $field_ident);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_DEACTIVATE', false, array($field_ident));
 
 				trigger_error($user->lang['PROFILE_FIELD_DEACTIVATED'] . adm_back_link($this->u_action));
 
@@ -280,7 +285,7 @@ class acp_profile
 			case 'create':
 			case 'edit':
 
-				$step = request_var('step', 1);
+				$step = $request->variable('step', 1);
 
 				$submit = (isset($_REQUEST['next']) || isset($_REQUEST['prev'])) ? true : false;
 				$save = (isset($_REQUEST['save'])) ? true : false;
@@ -344,7 +349,7 @@ class acp_profile
 					// We are adding a new field, define basic params
 					$lang_options = $field_row = array();
 
-					$field_type = request_var('field_type', '');
+					$field_type = $request->variable('field_type', '');
 
 					if (!isset($this->type_collection[$field_type]))
 					{
@@ -353,7 +358,7 @@ class acp_profile
 
 					$profile_field = $this->type_collection[$field_type];
 					$field_row = array_merge($profile_field->get_default_option_values(), array(
-						'field_ident'		=> str_replace(' ', '_', utf8_clean_string(request_var('field_ident', '', true))),
+						'field_ident'		=> str_replace(' ', '_', utf8_clean_string($request->variable('field_ident', '', true))),
 						'field_required'	=> 0,
 						'field_show_novalue'=> 0,
 						'field_hide'		=> 0,
@@ -366,7 +371,7 @@ class acp_profile
 						'field_is_contact'	=> 0,
 						'field_contact_desc'=> '',
 						'field_contact_url'	=> '',
-						'lang_name'			=> utf8_normalize_nfc(request_var('field_ident', '', true)),
+						'lang_name'			=> $request->variable('field_ident', '', true),
 						'lang_explain'		=> '',
 						'lang_default_value'=> '')
 					);
@@ -422,7 +427,7 @@ class acp_profile
 
 				$options = $profile_field->prepare_options_form($exclude, $visibility_ary);
 
-				$cp->vars['field_ident']		= ($action == 'create' && $step == 1) ? utf8_clean_string(request_var('field_ident', $field_row['field_ident'], true)) : request_var('field_ident', $field_row['field_ident']);
+				$cp->vars['field_ident']		= ($action == 'create' && $step == 1) ? utf8_clean_string($request->variable('field_ident', $field_row['field_ident'], true)) : $request->variable('field_ident', $field_row['field_ident']);
 				$cp->vars['lang_name']			= $request->variable('lang_name', $field_row['lang_name'], true);
 				$cp->vars['lang_explain']		= $request->variable('lang_explain', $field_row['lang_explain'], true);
 				$cp->vars['lang_default_value']	= $request->variable('lang_default_value', $field_row['lang_default_value'], true);
@@ -461,7 +466,7 @@ class acp_profile
 				// step 2
 				foreach ($exclude[2] as $key)
 				{
-					$var = utf8_normalize_nfc(request_var($key, $field_row[$key], true));
+					$var = $request->variable($key, $field_row[$key], true);
 
 					$field_data = $cp->vars;
 					$var = $profile_field->get_excluded_options($key, $action, $var, $field_data, 2);
@@ -507,7 +512,7 @@ class acp_profile
 
 				foreach ($exclude[3] as $key)
 				{
-					$cp->vars[$key] = utf8_normalize_nfc(request_var($key, array(0 => ''), true));
+					$cp->vars[$key] = $request->variable($key, array(0 => ''), true);
 
 					if (!$cp->vars[$key] && $action == 'edit')
 					{
@@ -597,13 +602,13 @@ class acp_profile
 
 				if (!sizeof($error))
 				{
-					if (!check_form_key($form_key))
-					{
-						trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
-					}
-
 					if (($step == 3 && (sizeof($this->lang_defs['iso']) == 1 || $save)) || ($action == 'edit' && $save))
 					{
+						if (!check_form_key($form_key))
+						{
+							trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
+						}
+
 						$this->save_profile_field($cp, $field_type, $action);
 					}
 				}
@@ -752,6 +757,10 @@ class acp_profile
 				$s_one_need_edit = true;
 			}
 
+			if (!isset($this->type_collection[$row['field_type']]))
+			{
+				continue;
+			}
 			$profile_field = $this->type_collection[$row['field_type']];
 			$template->assign_block_vars('fields', array(
 				'FIELD_IDENT'		=> $row['field_ident'],
@@ -793,7 +802,7 @@ class acp_profile
 	*/
 	function build_language_options(&$cp, $field_type, $action = 'create')
 	{
-		global $user, $config, $db, $phpbb_container;
+		global $user, $config, $db, $request;
 
 		$default_lang_id = (!empty($this->edit_lang_id)) ? $this->edit_lang_id : $this->lang_defs['iso'][$config['default_lang']];
 
@@ -834,7 +843,7 @@ class acp_profile
 			$lang_options[$lang_id]['lang_iso'] = $lang_iso;
 			foreach ($options as $field => $field_type)
 			{
-				$value = ($action == 'create') ? utf8_normalize_nfc(request_var('l_' . $field, array(0 => ''), true)) : $cp->vars['l_' . $field];
+				$value = ($action == 'create') ? $request->variable('l_' . $field, array(0 => ''), true) : $cp->vars['l_' . $field];
 				if ($field == 'lang_options')
 				{
 					$var = (!isset($cp->vars['l_lang_options'][$lang_id]) || !is_array($cp->vars['l_lang_options'][$lang_id])) ? $cp->vars['lang_options'] : $cp->vars['l_lang_options'][$lang_id];
@@ -890,9 +899,9 @@ class acp_profile
 	*/
 	function save_profile_field(&$cp, $field_type, $action = 'create')
 	{
-		global $db, $config, $user, $phpbb_container, $phpbb_dispatcher;
+		global $db, $config, $user, $phpbb_container, $phpbb_log, $request, $phpbb_dispatcher;
 
-		$field_id = request_var('field_id', 0);
+		$field_id = $request->variable('field_id', 0);
 
 		// Collect all information, if something is going wrong, abort the operation
 		$profile_sql = $profile_lang = $empty_lang = $profile_lang_fields = array();
@@ -979,7 +988,7 @@ class acp_profile
 		if ($action == 'create')
 		{
 			$field_ident = 'pf_' . $field_ident;
-
+			/* @var $db_tools \phpbb\db\tools\tools_interface */
 			$db_tools = $phpbb_container->get('dbal.tools');
 			$db_tools->sql_column_add(PROFILE_FIELDS_DATA_TABLE, $field_ident, array($profile_field->get_database_column_type(), null));
 		}
@@ -1178,12 +1187,12 @@ class acp_profile
 
 		if ($action == 'edit')
 		{
-			add_log('admin', 'LOG_PROFILE_FIELD_EDIT', $cp->vars['field_ident'] . ':' . $cp->vars['lang_name']);
+			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_EDIT', false, array($cp->vars['field_ident'] . ':' . $cp->vars['lang_name']));
 			trigger_error($user->lang['CHANGED_PROFILE_FIELD'] . adm_back_link($this->u_action));
 		}
 		else
 		{
-			add_log('admin', 'LOG_PROFILE_FIELD_CREATE', substr($field_ident, 3) . ':' . $cp->vars['lang_name']);
+			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PROFILE_FIELD_CREATE', false, array(substr($field_ident, 3) . ':' . $cp->vars['lang_name']));
 			trigger_error($user->lang['ADDED_PROFILE_FIELD'] . adm_back_link($this->u_action));
 		}
 	}
--- a/includes/acp/acp_prune.php
+++ b/includes/acp/acp_prune.php
@@ -25,7 +25,7 @@ class acp_prune
 
 	function main($id, $mode)
 	{
-		global $user, $phpEx, $phpbb_admin_path, $phpbb_root_path;
+		global $user, $phpEx, $phpbb_root_path;
 
 		$user->add_lang('acp/prune');
 
@@ -55,11 +55,10 @@ class acp_prune
 	*/
 	function prune_forums($id, $mode)
 	{
-		global $db, $user, $auth, $template, $cache;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+		global $db, $user, $auth, $template, $phpbb_log, $request;
 
-		$all_forums = request_var('all_forums', 0);
-		$forum_id = request_var('f', array(0));
+		$all_forums = $request->variable('all_forums', 0);
+		$forum_id = $request->variable('f', array(0));
 		$submit = (isset($_POST['submit'])) ? true : false;
 
 		if ($all_forums)
@@ -81,14 +80,14 @@ class acp_prune
 		{
 			if (confirm_box(true))
 			{
-				$prune_posted = request_var('prune_days', 0);
-				$prune_viewed = request_var('prune_vieweddays', 0);
+				$prune_posted = $request->variable('prune_days', 0);
+				$prune_viewed = $request->variable('prune_vieweddays', 0);
 				$prune_all = (!$prune_posted && !$prune_viewed) ? true : false;
 
 				$prune_flags = 0;
-				$prune_flags += (request_var('prune_old_polls', 0)) ? 2 : 0;
-				$prune_flags += (request_var('prune_announce', 0)) ? 4 : 0;
-				$prune_flags += (request_var('prune_sticky', 0)) ? 8 : 0;
+				$prune_flags += ($request->variable('prune_old_polls', 0)) ? 2 : 0;
+				$prune_flags += ($request->variable('prune_announce', 0)) ? 4 : 0;
+				$prune_flags += ($request->variable('prune_sticky', 0)) ? 8 : 0;
 
 				// Convert days to seconds for timestamp functions...
 				$prunedate_posted = time() - ($prune_posted * 86400);
@@ -157,7 +156,8 @@ class acp_prune
 
 					// Sync all pruned forums at once
 					sync('forum', 'forum_id', $prune_ids, true, true);
-					add_log('admin', 'LOG_PRUNE', $log_data);
+
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_PRUNE', false, array($log_data));
 				}
 				$db->sql_freeresult($result);
 
@@ -172,11 +172,11 @@ class acp_prune
 					'all_forums'	=> $all_forums,
 					'f'				=> $forum_id,
 
-					'prune_days'		=> request_var('prune_days', 0),
-					'prune_vieweddays'	=> request_var('prune_vieweddays', 0),
-					'prune_old_polls'	=> request_var('prune_old_polls', 0),
-					'prune_announce'	=> request_var('prune_announce', 0),
-					'prune_sticky'		=> request_var('prune_sticky', 0),
+					'prune_days'		=> $request->variable('prune_days', 0),
+					'prune_vieweddays'	=> $request->variable('prune_vieweddays', 0),
+					'prune_old_polls'	=> $request->variable('prune_old_polls', 0),
+					'prune_announce'	=> $request->variable('prune_announce', 0),
+					'prune_sticky'		=> $request->variable('prune_sticky', 0),
 				)));
 			}
 		}
@@ -232,8 +232,11 @@ class acp_prune
 	*/
 	function prune_users($id, $mode)
 	{
-		global $db, $user, $auth, $template, $cache;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+		global $db, $user, $auth, $template, $phpbb_log, $request;
+		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $phpbb_container;
+
+		/** @var \phpbb\group\helper $group_helper */
+		$group_helper = $phpbb_container->get('group_helper');
 
 		$user->add_lang('memberlist');
 
@@ -241,8 +244,8 @@ class acp_prune
 
 		if ($prune)
 		{
-			$action = request_var('action', 'deactivate');
-			$deleteposts = request_var('deleteposts', 0);
+			$action = $request->variable('action', 'deactivate');
+			$deleteposts = $request->variable('deleteposts', 0);
 
 			if (confirm_box(true))
 			{
@@ -272,7 +275,7 @@ class acp_prune
 						}
 					}
 
-					add_log('admin', $l_log, implode(', ', $usernames));
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $l_log, false, array(implode(', ', $usernames)));
 					$msg = $user->lang['USER_' . strtoupper($action) . '_SUCCESS'];
 				}
 				else
@@ -314,8 +317,8 @@ class acp_prune
 					'mode'			=> $mode,
 					'prune'			=> 1,
 
-					'deleteposts'	=> request_var('deleteposts', 0),
-					'action'		=> request_var('action', ''),
+					'deleteposts'	=> $request->variable('deleteposts', 0),
+					'action'		=> $request->variable('action', ''),
 				)), 'confirm_body_prune.html');
 			}
 		}
@@ -345,7 +348,7 @@ class acp_prune
 		$s_group_list = '';
 		while ($row = $db->sql_fetchrow($result))
 		{
-			$s_group_list .= '<option value="' . $row['group_id'] . '">' . $row['group_name'] . '</option>';
+			$s_group_list .= '<option value="' . $row['group_id'] . '">' . $group_helper->get_name($row['group_name']) . '</option>';
 		}
 		$db->sql_freeresult($result);
 
@@ -372,9 +375,9 @@ class acp_prune
 	{
 		global $user, $db, $request;
 
-		$users_by_name = request_var('users', '', true);
-		$users_by_id = request_var('user_ids', array(0));
-		$group_id = request_var('group_id', 0);
+		$users_by_name = $request->variable('users', '', true);
+		$users_by_id = $request->variable('user_ids', array(0));
+		$group_id = $request->variable('group_id', 0);
 		$posts_on_queue = (trim($request->variable('posts_on_queue', '')) === '') ? false : $request->variable('posts_on_queue', 0);
 
 		if ($users_by_name)
@@ -391,15 +394,15 @@ class acp_prune
 		}
 		else
 		{
-			$username = request_var('username', '', true);
-			$email = request_var('email', '');
+			$username = $request->variable('username', '', true);
+			$email = $request->variable('email', '');
 
-			$active_select = request_var('active_select', 'lt');
-			$count_select = request_var('count_select', 'eq');
-			$queue_select = request_var('queue_select', 'gt');
-			$joined_before = request_var('joined_before', '');
-			$joined_after = request_var('joined_after', '');
-			$active = request_var('active', '');
+			$active_select = $request->variable('active_select', 'lt');
+			$count_select = $request->variable('count_select', 'eq');
+			$queue_select = $request->variable('queue_select', 'gt');
+			$joined_before = $request->variable('joined_before', '');
+			$joined_after = $request->variable('joined_after', '');
+			$active = $request->variable('active', '');
 
 			$count = ($request->variable('count', '') === '') ? false : $request->variable('count', 0);
 
@@ -437,7 +440,6 @@ class acp_prune
 			}
 
 			$key_match = array('lt' => '<', 'gt' => '>', 'eq' => '=');
-			$sort_by_types = array('username', 'user_email', 'user_posts', 'user_regdate', 'user_lastvisit');
 
 			$where_sql = '';
 			$where_sql .= ($username) ? ' AND username_clean ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), utf8_clean_string($username))) : '';
--- a/includes/acp/acp_ranks.php
+++ b/includes/acp/acp_ranks.php
@@ -25,16 +25,16 @@ class acp_ranks
 
 	function main($id, $mode)
 	{
-		global $db, $user, $auth, $template, $cache, $request, $phpbb_dispatcher;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+		global $db, $user, $template, $cache, $request, $phpbb_dispatcher;
+		global $config, $phpbb_root_path, $phpbb_admin_path, $phpbb_log;
 
 		$user->add_lang('acp/posting');
 
 		// Set up general vars
-		$action = request_var('action', '');
+		$action = $request->variable('action', '');
 		$action = (isset($_POST['add'])) ? 'add' : $action;
 		$action = (isset($_POST['save'])) ? 'save' : $action;
-		$rank_id = request_var('id', 0);
+		$rank_id = $request->variable('id', 0);
 
 		$this->tpl_name = 'acp_ranks';
 		$this->page_title = 'ACP_MANAGE_RANKS';
@@ -50,10 +50,10 @@ class acp_ranks
 				{
 					trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);
 				}
-				$rank_title = utf8_normalize_nfc(request_var('title', '', true));
-				$special_rank = request_var('special_rank', 0);
-				$min_posts = ($special_rank) ? 0 : max(0, request_var('min_posts', 0));
-				$rank_image = request_var('rank_image', '');
+				$rank_title = $request->variable('title', '', true);
+				$special_rank = $request->variable('special_rank', 0);
+				$min_posts = ($special_rank) ? 0 : max(0, $request->variable('min_posts', 0));
+				$rank_image = $request->variable('rank_image', '');
 
 				// The rank image has to be a jpg, gif or png
 				if ($rank_image != '' && !preg_match('#(\.gif|\.png|\.jpg|\.jpeg)$#i', $rank_image))
@@ -89,14 +89,14 @@ class acp_ranks
 					$sql = 'UPDATE ' . RANKS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " WHERE rank_id = $rank_id";
 					$message = $user->lang['RANK_UPDATED'];
 
-					add_log('admin', 'LOG_RANK_UPDATED', $rank_title);
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RANK_UPDATED', false, array($rank_title));
 				}
 				else
 				{
 					$sql = 'INSERT INTO ' . RANKS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
 					$message = $user->lang['RANK_ADDED'];
 
-					add_log('admin', 'LOG_RANK_ADDED', $rank_title);
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RANK_ADDED', false, array($rank_title));
 				}
 				$db->sql_query($sql);
 
@@ -133,7 +133,7 @@ class acp_ranks
 
 					$cache->destroy('_ranks');
 
-					add_log('admin', 'LOG_RANK_REMOVED', $rank_title);
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_RANK_REMOVED', false, array($rank_title));
 
 					if ($request->is_ajax())
 					{
@@ -162,7 +162,7 @@ class acp_ranks
 			case 'edit':
 			case 'add':
 
-				$data = $ranks = $existing_imgs = array();
+				$ranks = $existing_imgs = array();
 
 				$sql = 'SELECT *
 					FROM ' . RANKS_TABLE . '
--- a/includes/acp/acp_reasons.php
+++ b/includes/acp/acp_reasons.php
@@ -25,16 +25,15 @@ class acp_reasons
 
 	function main($id, $mode)
 	{
-		global $db, $user, $auth, $template, $cache;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
-		global $request;
+		global $db, $user, $template;
+		global $request, $phpbb_log;
 
 		$user->add_lang(array('mcp', 'acp/posting'));
 
 		// Set up general vars
-		$action = request_var('action', '');
+		$action = $request->variable('action', '');
 		$submit = (isset($_POST['submit'])) ? true : false;
-		$reason_id = request_var('id', 0);
+		$reason_id = $request->variable('id', 0);
 
 		$this->tpl_name = 'acp_reasons';
 		$this->page_title = 'ACP_REASONS';
@@ -50,8 +49,8 @@ class acp_reasons
 			case 'edit':
 
 				$reason_row = array(
-					'reason_title'			=> utf8_normalize_nfc(request_var('reason_title', '', true)),
-					'reason_description'	=> utf8_normalize_nfc(request_var('reason_description', '', true)),
+					'reason_title'			=> $request->variable('reason_title', '', true),
+					'reason_description'	=> $request->variable('reason_description', '', true),
 				);
 
 				if ($submit)
@@ -139,7 +138,7 @@ class acp_reasons
 							$log = 'UPDATED';
 						}
 
-						add_log('admin', 'LOG_REASON_' . $log, $reason_row['reason_title']);
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_REASON_' . $log, false, array($reason_row['reason_title']));
 						trigger_error($user->lang['REASON_' . $log] . adm_back_link($this->u_action));
 					}
 				}
@@ -232,7 +231,6 @@ class acp_reasons
 						break;
 
 						// Standard? What's that?
-						case 'mssql':
 						case 'mssql_odbc':
 						case 'mssqlnative':
 							// Change the reports using this reason to 'other'
@@ -252,7 +250,6 @@ class acp_reasons
 						// Teh standard
 						case 'postgres':
 						case 'oracle':
-						case 'sqlite':
 						case 'sqlite3':
 							// Change the reports using this reason to 'other'
 							$sql = 'UPDATE ' . REPORTS_TABLE . '
@@ -264,7 +261,7 @@ class acp_reasons
 
 					$db->sql_query('DELETE FROM ' . REPORTS_REASONS_TABLE . ' WHERE reason_id = ' . $reason_id);
 
-					add_log('admin', 'LOG_REASON_REMOVED', $reason_row['reason_title']);
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_REASON_REMOVED', false, array($reason_row['reason_title']));
 					trigger_error($user->lang['REASON_REMOVED'] . adm_back_link($this->u_action));
 				}
 				else
--- a/includes/acp/acp_search.php
+++ b/includes/acp/acp_search.php
@@ -50,14 +50,12 @@ class acp_search
 
 	function settings($id, $mode)
 	{
-		global $db, $user, $auth, $template, $cache;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+		global $user, $template, $phpbb_log, $request;
+		global $config, $phpbb_admin_path, $phpEx;
 
 		$submit = (isset($_POST['submit'])) ? true : false;
-		$form_key = 'acp_search';
-		add_form_key($form_key);
 
-		if ($submit && !check_form_key($form_key))
+		if ($submit && !check_link_hash($request->variable('hash', ''), 'acp_search'))
 		{
 			trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
 		}
@@ -111,8 +109,8 @@ class acp_search
 		unset($search);
 		unset($error);
 
-		$cfg_array = (isset($_REQUEST['config'])) ? request_var('config', array('' => ''), true) : array();
-		$updated = request_var('updated', false);
+		$cfg_array = (isset($_REQUEST['config'])) ? $request->variable('config', array('' => ''), true) : array();
+		$updated = $request->variable('updated', false);
 
 		foreach ($settings as $config_name => $var_type)
 		{
@@ -140,7 +138,7 @@ class acp_search
 			// only change config if anything was actually changed
 			if ($submit && ($config[$config_name] != $config_value))
 			{
-				set_config($config_name, $config_value);
+				$config->set($config_name, $config_value);
 				$updated = true;
 			}
 		}
@@ -150,7 +148,7 @@ class acp_search
 			$extra_message = '';
 			if ($updated)
 			{
-				add_log('admin', 'LOG_CONFIG_SEARCH');
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_SEARCH');
 			}
 
 			if (isset($cfg_array['search_type']) && in_array($cfg_array['search_type'], $search_types, true) && ($cfg_array['search_type'] != $config['search_type']))
@@ -164,11 +162,11 @@ class acp_search
 					{
 						if (!method_exists($search, 'init') || !($error = $search->init()))
 						{
-							set_config('search_type', $cfg_array['search_type']);
+							$config->set('search_type', $cfg_array['search_type']);
 
 							if (!$updated)
 							{
-								add_log('admin', 'LOG_CONFIG_SEARCH');
+								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_SEARCH');
 							}
 							$extra_message = '<br />' . $user->lang['SWITCHED_SEARCH_BACKEND'] . '<br /><a href="' . append_sid("{$phpbb_admin_path}index.$phpEx", 'i=search&amp;mode=index') . '">&raquo; ' . $user->lang['GO_TO_SEARCH_INDEX'] . '</a>';
 						}
@@ -233,16 +231,16 @@ class acp_search
 			'S_YES_SEARCH'			=> (bool) $config['load_search'],
 			'S_SETTINGS'			=> true,
 
-			'U_ACTION'				=> $this->u_action)
+			'U_ACTION'				=> $this->u_action . '&amp;hash=' . generate_link_hash('acp_search'))
 		);
 	}
 
 	function index($id, $mode)
 	{
-		global $db, $user, $auth, $template, $cache, $request;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+		global $db, $user, $template, $phpbb_log, $request;
+		global $config, $phpbb_admin_path, $phpEx;
 
-		$action = request_var('action', '');
+		$action = $request->variable('action', '');
 		$this->state = explode(',', $config['search_indexing_state']);
 
 		if (isset($_POST['cancel']))
@@ -253,10 +251,7 @@ class acp_search
 		}
 		$submit = $request->is_set_post('submit', false);
 
-		$form_key = 'acp_search';
-		add_form_key($form_key);
-
-		if (!check_form_key($form_key) && in_array($action, array('delete', 'create')))
+		if (!check_link_hash($request->variable('hash', ''), 'acp_search') && in_array($action, array('create', 'delete')))
 		{
 			trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
 		}
@@ -266,7 +261,7 @@ class acp_search
 			switch ($action)
 			{
 				case 'progress_bar':
-					$type = request_var('type', '');
+					$type = $request->variable('type', '');
 					$this->display_progress_bar($type);
 				break;
 
@@ -285,7 +280,7 @@ class acp_search
 
 			if (empty($this->state[0]))
 			{
-				$this->state[0] = request_var('search_type', '');
+				$this->state[0] = $request->variable('search_type', '');
 			}
 
 			$this->search = null;
@@ -310,7 +305,7 @@ class acp_search
 					if (method_exists($this->search, 'delete_index'))
 					{
 						// pass a reference to myself so the $search object can make use of save_state() and attributes
-						if ($error = $this->search->delete_index($this, append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&mode=$mode&action=delete", false)))
+						if ($error = $this->search->delete_index($this, append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&mode=$mode&action=delete&hash=" . generate_link_hash('acp_search'), false)))
 						{
 							$this->state = array('');
 							$this->save_state();
@@ -319,8 +314,7 @@ class acp_search
 					}
 					else
 					{
-						$starttime = explode(' ', microtime());
-						$starttime = $starttime[1] + $starttime[0];
+						$starttime = microtime(true);
 						$row_count = 0;
 						while (still_on_time() && $post_counter <= $this->max_post_id)
 						{
@@ -352,10 +346,9 @@ class acp_search
 
 						if ($post_counter <= $this->max_post_id)
 						{
-							$mtime = explode(' ', microtime());
-							$totaltime = $mtime[0] + $mtime[1] - $starttime;
+							$totaltime = microtime(true) - $starttime;
 							$rows_per_second = $row_count / $totaltime;
-							meta_refresh(1, append_sid($this->u_action . '&amp;action=delete&amp;skip_rows=' . $post_counter));
+							meta_refresh(1, append_sid($this->u_action . '&amp;action=delete&amp;skip_rows=' . $post_counter . '&amp;hash=' . generate_link_hash('acp_search')));
 							trigger_error($user->lang('SEARCH_INDEX_DELETE_REDIRECT', (int) $row_count, $post_counter, $rows_per_second));
 						}
 					}
@@ -365,7 +358,7 @@ class acp_search
 					$this->state = array('');
 					$this->save_state();
 
-					add_log('admin', 'LOG_SEARCH_INDEX_REMOVED', $name);
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_SEARCH_INDEX_REMOVED', false, array($name));
 					trigger_error($user->lang['SEARCH_INDEX_REMOVED'] . adm_back_link($this->u_action) . $this->close_popup_js());
 				break;
 
@@ -392,8 +385,7 @@ class acp_search
 						}
 						$db->sql_freeresult($result);
 
-						$starttime = explode(' ', microtime());
-						$starttime = $starttime[1] + $starttime[0];
+						$starttime = microtime(true);
 						$row_count = 0;
 						while (still_on_time() && $post_counter <= $this->max_post_id)
 						{
@@ -442,10 +434,9 @@ class acp_search
 
 						if ($post_counter <= $this->max_post_id)
 						{
-							$mtime = explode(' ', microtime());
-							$totaltime = $mtime[0] + $mtime[1] - $starttime;
+							$totaltime = microtime(true) - $starttime;
 							$rows_per_second = $row_count / $totaltime;
-							meta_refresh(1, append_sid($this->u_action . '&amp;action=create&amp;skip_rows=' . $post_counter));
+							meta_refresh(1, append_sid($this->u_action . '&amp;action=create&amp;skip_rows=' . $post_counter . '&amp;hash=' . generate_link_hash('acp_search')));
 							trigger_error($user->lang('SEARCH_INDEX_CREATE_REDIRECT', (int) $row_count, $post_counter) . $user->lang('SEARCH_INDEX_CREATE_REDIRECT_RATE', $rows_per_second));
 						}
 					}
@@ -455,7 +446,7 @@ class acp_search
 					$this->state = array('');
 					$this->save_state();
 
-					add_log('admin', 'LOG_SEARCH_INDEX_CREATED', $name);
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_SEARCH_INDEX_CREATED', false, array($name));
 					trigger_error($user->lang['SEARCH_INDEX_CREATED'] . adm_back_link($this->u_action) . $this->close_popup_js());
 				break;
 			}
@@ -524,7 +515,7 @@ class acp_search
 
 		$template->assign_vars(array(
 			'S_INDEX'				=> true,
-			'U_ACTION'				=> $this->u_action,
+			'U_ACTION'				=> $this->u_action . '&amp;hash=' . generate_link_hash('acp_search'),
 			'U_PROGRESS_BAR'		=> append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&amp;mode=$mode&amp;action=progress_bar"),
 			'UA_PROGRESS_BAR'		=> addslashes(append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&amp;mode=$mode&amp;action=progress_bar")),
 		));
@@ -533,7 +524,7 @@ class acp_search
 		{
 			$template->assign_vars(array(
 				'S_CONTINUE_INDEXING'	=> $this->state[1],
-				'U_CONTINUE_INDEXING'	=> $this->u_action . '&amp;action=' . $this->state[1],
+				'U_CONTINUE_INDEXING'	=> $this->u_action . '&amp;action=' . $this->state[1] . '&amp;hash=' . generate_link_hash('acp_search'),
 				'L_CONTINUE'			=> ($this->state[1] == 'create') ? $user->lang['CONTINUE_INDEXING'] : $user->lang['CONTINUE_DELETING_INDEX'],
 				'L_CONTINUE_EXPLAIN'	=> ($this->state[1] == 'create') ? $user->lang['CONTINUE_INDEXING_EXPLAIN'] : $user->lang['CONTINUE_DELETING_INDEX_EXPLAIN'])
 			);
@@ -571,7 +562,7 @@ class acp_search
 
 	function get_search_types()
 	{
-		global $phpbb_root_path, $phpEx, $phpbb_extension_manager;
+		global $phpbb_extension_manager;
 
 		$finder = $phpbb_extension_manager->get_finder();
 
@@ -597,6 +588,8 @@ class acp_search
 
 	function save_state($state = false)
 	{
+		global $config;
+
 		if ($state)
 		{
 			$this->state = $state;
@@ -604,7 +597,7 @@ class acp_search
 
 		ksort($this->state);
 
-		set_config('search_indexing_state', implode(',', $this->state), true);
+		$config->set('search_indexing_state', implode(',', $this->state), true);
 	}
 
 	/**
--- a/includes/acp/acp_styles.php
+++ b/includes/acp/acp_styles.php
@@ -32,6 +32,9 @@ class acp_styles
 	protected $styles_list_cols = 0;
 	protected $reserved_style_names = array('adm', 'admin', 'all');
 
+	/** @var \phpbb\config\config */
+	protected $config;
+
 	/** @var \phpbb\db\driver\driver_interface */
 	protected $db;
 
@@ -50,6 +53,9 @@ class acp_styles
 	/** @var \phpbb\auth\auth */
 	protected $auth;
 
+	/** @var \phpbb\textformatter\cache_interface */
+	protected $text_formatter_cache;
+
 	/** @var string */
 	protected $phpbb_root_path;
 
@@ -61,7 +67,7 @@ class acp_styles
 
 	public function main($id, $mode)
 	{
-		global $db, $user, $phpbb_admin_path, $phpbb_root_path, $phpEx, $template, $request, $cache, $auth, $config, $phpbb_dispatcher;
+		global $db, $user, $phpbb_admin_path, $phpbb_root_path, $phpEx, $template, $request, $cache, $auth, $config, $phpbb_dispatcher, $phpbb_container;
 
 		$this->db = $db;
 		$this->user = $user;
@@ -69,6 +75,7 @@ class acp_styles
 		$this->request = $request;
 		$this->cache = $cache;
 		$this->auth = $auth;
+		$this->text_formatter_cache = $phpbb_container->get('text_formatter.cache');
 		$this->config = $config;
 		$this->phpbb_root_path = $phpbb_root_path;
 		$this->php_ext = $phpEx;
@@ -194,7 +201,6 @@ class acp_styles
 		$messages = array();
 		$installed_names = array();
 		$installed_dirs = array();
-		$last_installed = false;
 		foreach ($dirs as $dir)
 		{
 			if (in_array($dir, $this->reserved_style_names))
@@ -217,7 +223,6 @@ class acp_styles
 					$style['style_id'] = $this->install_style($style);
 					$style['_installed'] = true;
 					$found = true;
-					$last_installed = $style['style_id'];
 					$installed_names[] = $style['style_name'];
 					$installed_dirs[] = $style['style_path'];
 					$messages[] = sprintf($this->user->lang['STYLE_INSTALLED'], htmlspecialchars($style['style_name']));
@@ -229,6 +234,12 @@ class acp_styles
 			}
 		}
 
+		// Invalidate the text formatter's cache for the new styles to take effect
+		if (!empty($installed_names))
+		{
+			$this->text_formatter_cache->invalidate();
+		}
+
 		// Show message
 		if (!count($messages))
 		{
@@ -276,6 +287,8 @@ class acp_styles
 	*/
 	protected function action_uninstall_confirmed($ids, $delete_files)
 	{
+		global $user, $phpbb_log;
+
 		$default = $this->default_style;
 		$uninstalled = array();
 		$messages = array();
@@ -335,7 +348,7 @@ class acp_styles
 		// Log action
 		if (count($uninstalled))
 		{
-			add_log('admin', 'LOG_STYLE_DELETE', implode(', ', $uninstalled));
+			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_STYLE_DELETE', false, array(implode(', ', $uninstalled)));
 		}
 
 		// Clear cache
@@ -407,6 +420,8 @@ class acp_styles
 	*/
 	protected function action_details()
 	{
+		global $user, $phpbb_log;
+
 		$id = $this->request->variable('id', 0);
 		if (!$id)
 		{
@@ -538,7 +553,8 @@ class acp_styles
 						$this->cache->purge();
 					}
 				}
-				add_log('admin', 'LOG_STYLE_EDIT_DETAILS', $style['style_name']);
+
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_STYLE_EDIT_DETAILS', false, array($style['style_name']));
 			}
 
 			// Update default style
@@ -549,7 +565,7 @@ class acp_styles
 				{
 					trigger_error($this->user->lang['STYLE_DEFAULT_CHANGE_INACTIVE'] . adm_back_link($update_action), E_USER_WARNING);
 				}
-				set_config('default_style', $id);
+				$this->config->set('default_style', $id);
 				$this->cache->purge();
 			}
 
@@ -1135,6 +1151,8 @@ class acp_styles
 	*/
 	protected function install_style($style)
 	{
+		global $user, $phpbb_log;
+
 		// Generate row
 		$sql_ary = array();
 		foreach ($style as $key => $value)
@@ -1156,7 +1174,7 @@ class acp_styles
 
 		$this->db->sql_transaction('commit');
 
-		add_log('admin', 'LOG_STYLE_ADD', $sql_ary['style_name']);
+		$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_STYLE_ADD', false, array($sql_ary['style_name']));
 
 		return $id;
 	}
--- a/includes/acp/acp_update.php
+++ b/includes/acp/acp_update.php
@@ -33,6 +33,7 @@ class acp_update
 		$this->tpl_name = 'acp_update';
 		$this->page_title = 'ACP_VERSION_CHECK';
 
+		/* @var $version_helper \phpbb\version_helper */
 		$version_helper = $phpbb_container->get('version_helper');
 		try
 		{
@@ -51,7 +52,7 @@ class acp_update
 			$template->assign_block_vars('updates_available', $version_data);
 		}
 
-		$update_link = append_sid($phpbb_root_path . 'install/index.' . $phpEx, 'mode=update');
+		$update_link = $phpbb_root_path . 'install/app.' . $phpEx;
 
 		$template->assign_vars(array(
 			'S_UP_TO_DATE'			=> empty($updates_available),
@@ -66,7 +67,7 @@ class acp_update
 		// Incomplete update?
 		if (phpbb_version_compare($config['version'], PHPBB_VERSION, '<'))
 		{
-			$database_update_link = append_sid($phpbb_root_path . 'install/database_update.' . $phpEx);
+			$database_update_link = $phpbb_root_path . 'install/app.php/update';
 
 			$template->assign_vars(array(
 				'S_UPDATE_INCOMPLETE'		=> true,
--- a/includes/acp/acp_users.php
+++ b/includes/acp/acp_users.php
@@ -31,21 +31,21 @@ class acp_users
 
 	function main($id, $mode)
 	{
-		global $config, $db, $user, $auth, $template, $cache;
-		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix, $file_uploads;
+		global $config, $db, $user, $auth, $template;
+		global $phpbb_root_path, $phpbb_admin_path, $phpEx;
 		global $phpbb_dispatcher, $request;
-		global $phpbb_container;
+		global $phpbb_container, $phpbb_log;
 
 		$user->add_lang(array('posting', 'ucp', 'acp/users'));
 		$this->tpl_name = 'acp_users';
 
 		$error		= array();
-		$username	= utf8_normalize_nfc(request_var('username', '', true));
-		$user_id	= request_var('u', 0);
-		$action		= request_var('action', '');
+		$username	= $request->variable('username', '', true);
+		$user_id	= $request->variable('u', 0);
+		$action		= $request->variable('action', '');
 
 		// Get referer to redirect user to the appropriate page after delete action
-		$redirect		= request_var('redirect', '');
+		$redirect		= $request->variable('redirect', '');
 		$redirect_tag	= "redirect=$redirect";
 		$redirect_url	= append_sid("{$phpbb_admin_path}index.$phpEx", "i=$redirect");
 
@@ -65,7 +65,7 @@ class acp_users
 			$this->page_title = 'WHOIS';
 			$this->tpl_name = 'simple_body';
 
-			$user_ip = phpbb_ip_normalise(request_var('user_ip', ''));
+			$user_ip = phpbb_ip_normalise($request->variable('user_ip', ''));
 			$domain = gethostbyaddr($user_ip);
 			$ipwhois = user_ipwhois($user_ip);
 
@@ -180,9 +180,9 @@ class acp_users
 
 				$user->add_lang('acp/ban');
 
-				$delete			= request_var('delete', 0);
-				$delete_type	= request_var('delete_type', '');
-				$ip				= request_var('ip', 'ip');
+				$delete			= $request->variable('delete', 0);
+				$delete_type	= $request->variable('delete_type', '');
+				$ip				= $request->variable('ip', 'ip');
 
 				/**
 				 * Run code at beginning of ACP users overview
@@ -205,6 +205,7 @@ class acp_users
 					{
 						if (!$auth->acl_get('a_userdel'))
 						{
+							send_status_line(403, 'Forbidden');
 							trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING);
 						}
 
@@ -231,7 +232,7 @@ class acp_users
 							{
 								user_delete($delete_type, $user_id, $user_row['username']);
 
-								add_log('admin', 'LOG_USER_DELETED', $user_row['username']);
+								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_DELETED', false, array($user_row['username']));
 								trigger_error($user->lang['USER_DELETED'] . adm_back_link(
 										(empty($redirect)) ? $this->u_action : $redirect_url
 									)
@@ -298,13 +299,11 @@ class acp_users
 								case 'banuser':
 									$ban[] = $user_row['username'];
 									$reason = 'USER_ADMIN_BAN_NAME_REASON';
-									$log = 'LOG_USER_BAN_USER';
 								break;
 
 								case 'banemail':
 									$ban[] = $user_row['user_email'];
 									$reason = 'USER_ADMIN_BAN_EMAIL_REASON';
-									$log = 'LOG_USER_BAN_EMAIL';
 								break;
 
 								case 'banip':
@@ -322,12 +321,11 @@ class acp_users
 									$db->sql_freeresult($result);
 
 									$reason = 'USER_ADMIN_BAN_IP_REASON';
-									$log = 'LOG_USER_BAN_IP';
 								break;
 							}
 
-							$ban_reason = utf8_normalize_nfc(request_var('ban_reason', $user->lang[$reason], true));
-							$ban_give_reason = utf8_normalize_nfc(request_var('ban_give_reason', '', true));
+							$ban_reason = $request->variable('ban_reason', $user->lang[$reason], true);
+							$ban_give_reason = $request->variable('ban_give_reason', '', true);
 
 							// Log not used at the moment, we simply utilize the ban function.
 							$result = user_ban(substr($action, 3), $ban, 0, 0, 0, $ban_reason, $ban_give_reason);
@@ -373,11 +371,6 @@ class acp_users
 								if ($user_row['user_type'] == USER_NORMAL)
 								{
 									user_active_flip('deactivate', $user_id, INACTIVE_REMIND);
-
-									$sql = 'UPDATE ' . USERS_TABLE . "
-										SET user_actkey = '" . $db->sql_escape($user_actkey) . "'
-										WHERE user_id = $user_id";
-									$db->sql_query($sql);
 								}
 								else
 								{
@@ -386,8 +379,18 @@ class acp_users
 										FROM ' . USERS_TABLE . '
 										WHERE user_id = ' . $user_id;
 									$result = $db->sql_query($sql);
-									$user_actkey = (string) $db->sql_fetchfield('user_actkey');
+									$user_activation_key = (string) $db->sql_fetchfield('user_actkey');
 									$db->sql_freeresult($result);
+
+									$user_actkey = empty($user_activation_key) ? $user_actkey : $user_activation_key;
+								}
+
+								if ($user_row['user_type'] == USER_NORMAL || empty($user_activation_key))
+								{
+									$sql = 'UPDATE ' . USERS_TABLE . "
+										SET user_actkey = '" . $db->sql_escape($user_actkey) . "'
+										WHERE user_id = $user_id";
+									$db->sql_query($sql);
 								}
 
 								$messenger = new messenger(false);
@@ -406,8 +409,10 @@ class acp_users
 
 								$messenger->send(NOTIFY_EMAIL);
 
-								add_log('admin', 'LOG_USER_REACTIVATE', $user_row['username']);
-								add_log('user', $user_id, 'LOG_USER_REACTIVATE_USER');
+								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_REACTIVATE', false, array($user_row['username']));
+								$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_REACTIVATE_USER', false, array(
+									'reportee_id' => $user_id
+								));
 
 								trigger_error($user->lang['FORCE_REACTIVATION_SUCCESS'] . adm_back_link($this->u_action . '&amp;u=' . $user_id));
 							}
@@ -443,6 +448,7 @@ class acp_users
 							{
 								if ($config['require_activation'] == USER_ACTIVATION_ADMIN)
 								{
+									/* @var $phpbb_notifications \phpbb\notification\manager */
 									$phpbb_notifications = $phpbb_container->get('notification_manager');
 									$phpbb_notifications->delete_notifications('notification.type.admin_activate_user', $user_row['user_id']);
 
@@ -470,8 +476,10 @@ class acp_users
 							$message = ($user_row['user_type'] == USER_INACTIVE) ? 'USER_ADMIN_ACTIVATED' : 'USER_ADMIN_DEACTIVED';
 							$log = ($user_row['user_type'] == USER_INACTIVE) ? 'LOG_USER_ACTIVE' : 'LOG_USER_INACTIVE';
 
-							add_log('admin', $log, $user_row['username']);
-							add_log('user', $user_id, $log . '_USER');
+							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log, false, array($user_row['username']));
+							$phpbb_log->add('user', $user->data['user_id'], $user->ip, $log . '_USER', false, array(
+								'reportee_id' => $user_id
+							));
 
 							trigger_error($user->lang[$message] . adm_back_link($this->u_action . '&amp;u=' . $user_id));
 
@@ -494,8 +502,10 @@ class acp_users
 								WHERE user_id = $user_id";
 							$db->sql_query($sql);
 
-							add_log('admin', 'LOG_USER_DEL_SIG', $user_row['username']);
-							add_log('user', $user_id, 'LOG_USER_DEL_SIG_USER');
+							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_DEL_SIG', false, array($user_row['username']));
+							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_DEL_SIG_USER', false, array(
+								'reportee_id' => $user_id
+							));
 
 							trigger_error($user->lang['USER_ADMIN_SIG_REMOVED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id));
 
@@ -509,11 +519,14 @@ class acp_users
 							}
 
 							// Delete old avatar if present
+							/* @var $phpbb_avatar_manager \phpbb\avatar\manager */
 							$phpbb_avatar_manager = $phpbb_container->get('avatar.manager');
 							$phpbb_avatar_manager->handle_avatar_delete($db, $user, $phpbb_avatar_manager->clean_row($user_row, 'user'), USERS_TABLE, 'user_');
 
-							add_log('admin', 'LOG_USER_DEL_AVATAR', $user_row['username']);
-							add_log('user', $user_id, 'LOG_USER_DEL_AVATAR_USER');
+							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_DEL_AVATAR', false, array($user_row['username']));
+							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_DEL_AVATAR_USER', false, array(
+								'reportee_id' => $user_id
+							));
 
 							trigger_error($user->lang['USER_ADMIN_AVATAR_REMOVED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id));
 						break;
@@ -525,7 +538,7 @@ class acp_users
 								// Delete posts, attachments, etc.
 								delete_posts('poster_id', $user_id);
 
-								add_log('admin', 'LOG_USER_DEL_POSTS', $user_row['username']);
+								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_DEL_POSTS', false, array($user_row['username']));
 								trigger_error($user->lang['USER_POSTS_DELETED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id));
 							}
 							else
@@ -545,9 +558,12 @@ class acp_users
 
 							if (confirm_box(true))
 							{
-								delete_attachments('user', $user_id);
+								/** @var \phpbb\attachment\manager $attachment_manager */
+								$attachment_manager = $phpbb_container->get('attachment.manager');
+								$attachment_manager->delete('user', $user_id);
+								unset($attachment_manager);
 
-								add_log('admin', 'LOG_USER_DEL_ATTACH', $user_row['username']);
+								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_DEL_ATTACH', false, array($user_row['username']));
 								trigger_error($user->lang['USER_ATTACHMENTS_REMOVED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id));
 							}
 							else
@@ -593,7 +609,7 @@ class acp_users
 
 									delete_pm($user_id, $msg_ids, PRIVMSGS_OUTBOX);
 
-									add_log('admin', 'LOG_USER_DEL_OUTBOX', $user_row['username']);
+									$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_DEL_OUTBOX', false, array($user_row['username']));
 
 									$lang = 'EMPTIED';
 								}
@@ -622,7 +638,7 @@ class acp_users
 
 							$user->add_lang('acp/forums');
 
-							$new_forum_id = request_var('new_f', 0);
+							$new_forum_id = $request->variable('new_f', 0);
 
 							if (!$new_forum_id)
 							{
@@ -764,8 +780,11 @@ class acp_users
 								sync('forum', 'forum_id', $forum_id_ary, false, true);
 							}
 
-							add_log('admin', 'LOG_USER_MOVE_POSTS', $user_row['username'], $forum_info['forum_name']);
-							add_log('user', $user_id, 'LOG_USER_MOVE_POSTS_USER', $forum_info['forum_name']);
+							$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_MOVE_POSTS', false, array($user_row['username'], $forum_info['forum_name']));
+							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_MOVE_POSTS_USER', false, array(
+								'reportee_id' => $user_id,
+								$forum_info['forum_name']
+							));
 
 							trigger_error($user->lang['USER_POSTS_MOVED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id));
 
@@ -777,7 +796,7 @@ class acp_users
 							{
 								remove_newly_registered($user_id, $user_row);
 
-								add_log('admin', 'LOG_USER_REMOVED_NR', $user_row['username']);
+								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_REMOVED_NR', false, array($user_row['username']));
 								trigger_error($user->lang['USER_LIFTED_NR'] . adm_back_link($this->u_action . '&amp;u=' . $user_id));
 							}
 							else
@@ -809,9 +828,9 @@ class acp_users
 
 					// Handle registration info updates
 					$data = array(
-						'username'			=> utf8_normalize_nfc(request_var('user', $user_row['username'], true)),
-						'user_founder'		=> request_var('user_founder', ($user_row['user_type'] == USER_FOUNDER) ? 1 : 0),
-						'email'				=> strtolower(request_var('user_email', $user_row['user_email'])),
+						'username'			=> $request->variable('user', $user_row['username'], true),
+						'user_founder'		=> $request->variable('user_founder', ($user_row['user_type'] == USER_FOUNDER) ? 1 : 0),
+						'email'				=> strtolower($request->variable('user_email', $user_row['user_email'])),
 						'new_password'		=> $request->variable('new_password', '', true),
 						'password_confirm'	=> $request->variable('password_confirm', '', true),
 					);
@@ -859,6 +878,7 @@ class acp_users
 					}
 
 					// Instantiate passwords manager
+					/* @var $passwords_manager \phpbb\passwords\manager */
 					$passwords_manager = $phpbb_container->get('passwords.manager');
 
 					// Which updates do we need to do?
@@ -931,7 +951,11 @@ class acp_users
 							$sql_ary['username'] = $update_username;
 							$sql_ary['username_clean'] = utf8_clean_string($update_username);
 
-							add_log('user', $user_id, 'LOG_USER_UPDATE_NAME', $user_row['username'], $update_username);
+							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_UPDATE_NAME', false, array(
+								'reportee_id' => $user_id,
+								$user_row['username'],
+								$update_username
+							));
 						}
 
 						if ($update_email !== false)
@@ -941,7 +965,12 @@ class acp_users
 								'user_email_hash'	=> phpbb_email_hash($update_email),
 							);
 
-							add_log('user', $user_id, 'LOG_USER_UPDATE_EMAIL', $user_row['username'], $user_row['user_email'], $update_email);
+							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_UPDATE_EMAIL', false, array(
+								'reportee_id' => $user_id,
+								$user_row['username'],
+								$user_row['user_email'],
+								$update_email
+							));
 						}
 
 						if ($update_password)
@@ -952,7 +981,11 @@ class acp_users
 							);
 
 							$user->reset_login_keys($user_id);
-							add_log('user', $user_id, 'LOG_USER_NEW_PASSWORD', $user_row['username']);
+
+							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_NEW_PASSWORD', false, array(
+								'reportee_id' => $user_id,
+								$user_row['username']
+							));
 						}
 
 						if (sizeof($sql_ary))
@@ -971,7 +1004,7 @@ class acp_users
 						// Let the users permissions being updated
 						$auth->acl_clear_prefetch($user_id);
 
-						add_log('admin', 'LOG_USER_USER_UPDATE', $data['username']);
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_USER_UPDATE', false, array($data['username']));
 
 						trigger_error($user->lang['USER_OVERVIEW_UPDATED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id));
 					}
@@ -1128,17 +1161,19 @@ class acp_users
 				$user->add_lang('mcp');
 
 				// Set up general vars
-				$start		= request_var('start', 0);
+				$start		= $request->variable('start', 0);
 				$deletemark = (isset($_POST['delmarked'])) ? true : false;
 				$deleteall	= (isset($_POST['delall'])) ? true : false;
-				$marked		= request_var('mark', array(0));
-				$message	= utf8_normalize_nfc(request_var('message', '', true));
+				$marked		= $request->variable('mark', array(0));
+				$message	= $request->variable('message', '', true);
+
+				/* @var $pagination \phpbb\pagination */
 				$pagination = $phpbb_container->get('pagination');
 
 				// Sort keys
-				$sort_days	= request_var('st', 0);
-				$sort_key	= request_var('sk', 't');
-				$sort_dir	= request_var('sd', 'd');
+				$sort_days	= $request->variable('st', 0);
+				$sort_key	= $request->variable('sk', 't');
+				$sort_dir	= $request->variable('sd', 'd');
 
 				// Delete entries if requested and able
 				if (($deletemark || $deleteall) && $auth->acl_get('a_clearlogs'))
@@ -1168,7 +1203,7 @@ class acp_users
 							$where_sql";
 						$db->sql_query($sql);
 
-						add_log('admin', 'LOG_CLEAR_USER', $user_row['username']);
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CLEAR_USER', false, array($user_row['username']));
 					}
 				}
 
@@ -1179,9 +1214,16 @@ class acp_users
 						trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING);
 					}
 
-					add_log('admin', 'LOG_USER_FEEDBACK', $user_row['username']);
-					add_log('mod', 0, 0, 'LOG_USER_FEEDBACK', $user_row['username']);
-					add_log('user', $user_id, 'LOG_USER_GENERAL', $message);
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_FEEDBACK', false, array($user_row['username']));
+					$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_USER_FEEDBACK', false, array(
+						'forum_id' => 0,
+						'topic_id' => 0,
+						$user_row['username']
+					));
+					$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_GENERAL', false, array(
+						'reportee_id' => $user_id,
+						$message
+					));
 
 					trigger_error($user->lang['USER_FEEDBACK_ADDED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id));
 				}
@@ -1232,17 +1274,10 @@ class acp_users
 				$user->add_lang('mcp');
 
 				// Set up general vars
-				$start		= request_var('start', 0);
 				$deletemark	= (isset($_POST['delmarked'])) ? true : false;
 				$deleteall	= (isset($_POST['delall'])) ? true : false;
 				$confirm	= (isset($_POST['confirm'])) ? true : false;
-				$marked		= request_var('mark', array(0));
-				$message	= utf8_normalize_nfc(request_var('message', '', true));
-
-				// Sort keys
-				$sort_days	= request_var('st', 0);
-				$sort_key	= request_var('sk', 't');
-				$sort_dir	= request_var('sd', 'd');
+				$marked		= $request->variable('mark', array(0));
 
 				// Delete entries if requested and able
 				if ($deletemark || $deleteall || $confirm)
@@ -1250,8 +1285,8 @@ class acp_users
 					if (confirm_box(true))
 					{
 						$where_sql = '';
-						$deletemark = request_var('delmarked', 0);
-						$deleteall = request_var('delall', 0);
+						$deletemark = $request->variable('delmarked', 0);
+						$deleteall = $request->variable('delall', 0);
 						if ($deletemark && $marked)
 						{
 							$where_sql = ' AND ' . $db->sql_in_set('warning_id', array_values($marked));
@@ -1282,11 +1317,11 @@ class acp_users
 
 							if ($log_warnings)
 							{
-								add_log('admin', 'LOG_WARNINGS_DELETED', $user_row['username'], $num_warnings);
+								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_WARNINGS_DELETED', false, array($user_row['username'], $num_warnings));
 							}
 							else
 							{
-								add_log('admin', 'LOG_WARNINGS_DELETED_ALL', $user_row['username']);
+								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_WARNINGS_DELETED_ALL', false, array($user_row['username']));
 							}
 						}
 					}
@@ -1378,6 +1413,7 @@ class acp_users
 					include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
 				}
 
+				/* @var $cp \phpbb\profilefields\manager */
 				$cp = $phpbb_container->get('profilefields.manager');
 
 				$cp_data = $cp_error = array();
@@ -1392,7 +1428,7 @@ class acp_users
 				$user_row['iso_lang_id'] = $row['lang_id'];
 
 				$data = array(
-					'jabber'		=> utf8_normalize_nfc(request_var('jabber', $user_row['user_jabber'], true)),
+					'jabber'		=> $request->variable('jabber', $user_row['user_jabber'], true),
 					'bday_day'		=> 0,
 					'bday_month'	=> 0,
 					'bday_year'		=> 0,
@@ -1403,9 +1439,9 @@ class acp_users
 					list($data['bday_day'], $data['bday_month'], $data['bday_year']) = explode('-', $user_row['user_birthday']);
 				}
 
-				$data['bday_day']		= request_var('bday_day', $data['bday_day']);
-				$data['bday_month']		= request_var('bday_month', $data['bday_month']);
-				$data['bday_year']		= request_var('bday_year', $data['bday_year']);
+				$data['bday_day']		= $request->variable('bday_day', $data['bday_day']);
+				$data['bday_month']		= $request->variable('bday_month', $data['bday_month']);
+				$data['bday_year']		= $request->variable('bday_year', $data['bday_year']);
 				$data['user_birthday']	= sprintf('%2d-%2d-%4d', $data['bday_day'], $data['bday_month'], $data['bday_year']);
 
 				/**
@@ -1506,7 +1542,6 @@ class acp_users
 					$selected = ($i == $data['bday_month']) ? ' selected="selected"' : '';
 					$s_birthday_month_options .= "<option value=\"$i\"$selected>$i</option>";
 				}
-				$s_birthday_year_options = '';
 
 				$now = getdate();
 				$s_birthday_year_options = '<option value="0"' . ((!$data['bday_year']) ? ' selected="selected"' : '') . '>--</option>';
@@ -1541,36 +1576,36 @@ class acp_users
 				}
 
 				$data = array(
-					'dateformat'		=> utf8_normalize_nfc(request_var('dateformat', $user_row['user_dateformat'], true)),
-					'lang'				=> basename(request_var('lang', $user_row['user_lang'])),
-					'tz'				=> request_var('tz', $user_row['user_timezone']),
-					'style'				=> request_var('style', $user_row['user_style']),
-					'viewemail'			=> request_var('viewemail', $user_row['user_allow_viewemail']),
-					'massemail'			=> request_var('massemail', $user_row['user_allow_massemail']),
-					'hideonline'		=> request_var('hideonline', !$user_row['user_allow_viewonline']),
-					'notifymethod'		=> request_var('notifymethod', $user_row['user_notify_type']),
-					'notifypm'			=> request_var('notifypm', $user_row['user_notify_pm']),
-					'allowpm'			=> request_var('allowpm', $user_row['user_allow_pm']),
-
-					'topic_sk'			=> request_var('topic_sk', ($user_row['user_topic_sortby_type']) ? $user_row['user_topic_sortby_type'] : 't'),
-					'topic_sd'			=> request_var('topic_sd', ($user_row['user_topic_sortby_dir']) ? $user_row['user_topic_sortby_dir'] : 'd'),
-					'topic_st'			=> request_var('topic_st', ($user_row['user_topic_show_days']) ? $user_row['user_topic_show_days'] : 0),
-
-					'post_sk'			=> request_var('post_sk', ($user_row['user_post_sortby_type']) ? $user_row['user_post_sortby_type'] : 't'),
-					'post_sd'			=> request_var('post_sd', ($user_row['user_post_sortby_dir']) ? $user_row['user_post_sortby_dir'] : 'a'),
-					'post_st'			=> request_var('post_st', ($user_row['user_post_show_days']) ? $user_row['user_post_show_days'] : 0),
-
-					'view_images'		=> request_var('view_images', $this->optionget($user_row, 'viewimg')),
-					'view_flash'		=> request_var('view_flash', $this->optionget($user_row, 'viewflash')),
-					'view_smilies'		=> request_var('view_smilies', $this->optionget($user_row, 'viewsmilies')),
-					'view_sigs'			=> request_var('view_sigs', $this->optionget($user_row, 'viewsigs')),
-					'view_avatars'		=> request_var('view_avatars', $this->optionget($user_row, 'viewavatars')),
-					'view_wordcensor'	=> request_var('view_wordcensor', $this->optionget($user_row, 'viewcensors')),
-
-					'bbcode'	=> request_var('bbcode', $this->optionget($user_row, 'bbcode')),
-					'smilies'	=> request_var('smilies', $this->optionget($user_row, 'smilies')),
-					'sig'		=> request_var('sig', $this->optionget($user_row, 'attachsig')),
-					'notify'	=> request_var('notify', $user_row['user_notify']),
+					'dateformat'		=> $request->variable('dateformat', $user_row['user_dateformat'], true),
+					'lang'				=> basename($request->variable('lang', $user_row['user_lang'])),
+					'tz'				=> $request->variable('tz', $user_row['user_timezone']),
+					'style'				=> $request->variable('style', $user_row['user_style']),
+					'viewemail'			=> $request->variable('viewemail', $user_row['user_allow_viewemail']),
+					'massemail'			=> $request->variable('massemail', $user_row['user_allow_massemail']),
+					'hideonline'		=> $request->variable('hideonline', !$user_row['user_allow_viewonline']),
+					'notifymethod'		=> $request->variable('notifymethod', $user_row['user_notify_type']),
+					'notifypm'			=> $request->variable('notifypm', $user_row['user_notify_pm']),
+					'allowpm'			=> $request->variable('allowpm', $user_row['user_allow_pm']),
+
+					'topic_sk'			=> $request->variable('topic_sk', ($user_row['user_topic_sortby_type']) ? $user_row['user_topic_sortby_type'] : 't'),
+					'topic_sd'			=> $request->variable('topic_sd', ($user_row['user_topic_sortby_dir']) ? $user_row['user_topic_sortby_dir'] : 'd'),
+					'topic_st'			=> $request->variable('topic_st', ($user_row['user_topic_show_days']) ? $user_row['user_topic_show_days'] : 0),
+
+					'post_sk'			=> $request->variable('post_sk', ($user_row['user_post_sortby_type']) ? $user_row['user_post_sortby_type'] : 't'),
+					'post_sd'			=> $request->variable('post_sd', ($user_row['user_post_sortby_dir']) ? $user_row['user_post_sortby_dir'] : 'a'),
+					'post_st'			=> $request->variable('post_st', ($user_row['user_post_show_days']) ? $user_row['user_post_show_days'] : 0),
+
+					'view_images'		=> $request->variable('view_images', $this->optionget($user_row, 'viewimg')),
+					'view_flash'		=> $request->variable('view_flash', $this->optionget($user_row, 'viewflash')),
+					'view_smilies'		=> $request->variable('view_smilies', $this->optionget($user_row, 'viewsmilies')),
+					'view_sigs'			=> $request->variable('view_sigs', $this->optionget($user_row, 'viewsigs')),
+					'view_avatars'		=> $request->variable('view_avatars', $this->optionget($user_row, 'viewavatars')),
+					'view_wordcensor'	=> $request->variable('view_wordcensor', $this->optionget($user_row, 'viewcensors')),
+
+					'bbcode'	=> $request->variable('bbcode', $this->optionget($user_row, 'bbcode')),
+					'smilies'	=> $request->variable('smilies', $this->optionget($user_row, 'smilies')),
+					'sig'		=> $request->variable('sig', $this->optionget($user_row, 'attachsig')),
+					'notify'	=> $request->variable('notify', $user_row['user_notify']),
 				);
 
 				/**
@@ -1924,7 +1959,7 @@ class acp_users
 
 					'S_FORM_ENCTYPE'	=> ' enctype="multipart/form-data"',
 
-					'L_AVATAR_EXPLAIN'	=> sprintf($user->lang['AVATAR_EXPLAIN'], $config['avatar_max_width'], $config['avatar_max_height'], $config['avatar_filesize'] / 1024),
+					'L_AVATAR_EXPLAIN'	=> $user->lang(($config['avatar_filesize'] == 0) ? 'AVATAR_EXPLAIN_NO_FILESIZE' : 'AVATAR_EXPLAIN', $config['avatar_max_width'], $config['avatar_max_height'], $config['avatar_filesize'] / 1024),
 
 					'S_AVATARS_ENABLED'		=> ($config['allow_avatar'] && $avatars_enabled),
 				));
@@ -1940,7 +1975,7 @@ class acp_users
 						trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING);
 					}
 
-					$rank_id = request_var('user_rank', 0);
+					$rank_id = $request->variable('user_rank', 0);
 
 					$sql = 'UPDATE ' . USERS_TABLE . "
 						SET user_rank = $rank_id
@@ -1974,60 +2009,72 @@ class acp_users
 
 			case 'sig':
 
-				if (!function_exists('generate_smilies'))
-				{
-					include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
-				}
-
 				if (!function_exists('display_custom_bbcodes'))
 				{
 					include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
 				}
 
-				$enable_bbcode	= ($config['allow_sig_bbcode']) ? (bool) $this->optionget($user_row, 'sig_bbcode') : false;
-				$enable_smilies	= ($config['allow_sig_smilies']) ? (bool) $this->optionget($user_row, 'sig_smilies') : false;
-				$enable_urls	= ($config['allow_sig_links']) ? (bool) $this->optionget($user_row, 'sig_links') : false;
-				$signature		= utf8_normalize_nfc(request_var('signature', (string) $user_row['user_sig'], true));
+				$enable_bbcode	= ($config['allow_sig_bbcode']) ? $this->optionget($user_row, 'sig_bbcode') : false;
+				$enable_smilies	= ($config['allow_sig_smilies']) ? $this->optionget($user_row, 'sig_smilies') : false;
+				$enable_urls	= ($config['allow_sig_links']) ? $this->optionget($user_row, 'sig_links') : false;
 
-				$preview		= (isset($_POST['preview'])) ? true : false;
+				$bbcode_flags = ($enable_bbcode ? OPTION_FLAG_BBCODE : 0) + ($enable_smilies ? OPTION_FLAG_SMILIES : 0) + ($enable_urls ? OPTION_FLAG_LINKS : 0);
 
-				if ($submit || $preview)
-				{
-					if (!class_exists('messenger'))
-					{
-						include($phpbb_root_path . 'includes/message_parser.' . $phpEx);
-					}
-
-					$enable_bbcode	= ($config['allow_sig_bbcode']) ? ((request_var('disable_bbcode', false)) ? false : true) : false;
-					$enable_smilies	= ($config['allow_sig_smilies']) ? ((request_var('disable_smilies', false)) ? false : true) : false;
-					$enable_urls	= ($config['allow_sig_links']) ? ((request_var('disable_magic_url', false)) ? false : true) : false;
-
-					$message_parser = new parse_message($signature);
+				$decoded_message	= generate_text_for_edit($user_row['user_sig'], $user_row['user_sig_bbcode_uid'], $bbcode_flags);
+				$signature			= $request->variable('signature', $decoded_message['text'], true);
+				$signature_preview	= '';
 
-					// Allowing Quote BBCode
-					$message_parser->parse($enable_bbcode, $enable_urls, $enable_smilies, $config['allow_sig_img'], $config['allow_sig_flash'], true, $config['allow_sig_links'], true, 'sig');
-
-					if (sizeof($message_parser->warn_msg))
-					{
-						$error[] = implode('<br />', $message_parser->warn_msg);
-					}
+				if ($submit || $request->is_set_post('preview'))
+				{
+					$enable_bbcode	= ($config['allow_sig_bbcode']) ? !$request->variable('disable_bbcode', false) : false;
+					$enable_smilies	= ($config['allow_sig_smilies']) ? !$request->variable('disable_smilies', false) : false;
+					$enable_urls	= ($config['allow_sig_links']) ? !$request->variable('disable_magic_url', false) : false;
 
 					if (!check_form_key($form_name))
 					{
-						$error = 'FORM_INVALID';
+						$error[] = 'FORM_INVALID';
 					}
+				}
+
+				$bbcode_uid = $bbcode_bitfield = $bbcode_flags = '';
+				$warn_msg = generate_text_for_storage(
+					$signature,
+					$bbcode_uid,
+					$bbcode_bitfield,
+					$bbcode_flags,
+					$enable_bbcode,
+					$enable_urls,
+					$enable_smilies,
+					$config['allow_sig_img'],
+					$config['allow_sig_flash'],
+					true,
+					$config['allow_sig_links'],
+					'sig'
+				);
+
+				if (sizeof($warn_msg))
+				{
+					$error += $warn_msg;
+				}
 
-					if (!sizeof($error) && $submit)
+				if (!$submit)
+				{
+					// Parse it for displaying
+					$signature_preview = generate_text_for_display($signature, $bbcode_uid, $bbcode_bitfield, $bbcode_flags);
+				}
+				else
+				{
+					if (!sizeof($error))
 					{
 						$this->optionset($user_row, 'sig_bbcode', $enable_bbcode);
 						$this->optionset($user_row, 'sig_smilies', $enable_smilies);
 						$this->optionset($user_row, 'sig_links', $enable_urls);
 
 						$sql_ary = array(
-							'user_sig'					=> (string) $message_parser->message,
+							'user_sig'					=> $signature,
 							'user_options'				=> $user_row['user_options'],
-							'user_sig_bbcode_uid'		=> (string) $message_parser->bbcode_uid,
-							'user_sig_bbcode_bitfield'	=> (string) $message_parser->bbcode_bitfield
+							'user_sig_bbcode_uid'		=> $bbcode_uid,
+							'user_sig_bbcode_bitfield'	=> $bbcode_bitfield,
 						);
 
 						$sql = 'UPDATE ' . USERS_TABLE . '
@@ -2037,33 +2084,30 @@ class acp_users
 
 						trigger_error($user->lang['USER_SIG_UPDATED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id));
 					}
-
-					// Replace "error" strings with their real, localised form
-					$error = array_map(array($user, 'lang'), $error);
 				}
 
-				$signature_preview = '';
+				// Replace "error" strings with their real, localised form
+				$error = array_map(array($user, 'lang'), $error);
 
-				if ($preview)
+				if ($request->is_set_post('preview'))
 				{
-					// Now parse it for displaying
-					$signature_preview = $message_parser->format_display($enable_bbcode, $enable_urls, $enable_smilies, false);
-					unset($message_parser);
+					$decoded_message = generate_text_for_edit($signature, $bbcode_uid, $bbcode_bitfield);
 				}
 
-				decode_message($signature, $user_row['user_sig_bbcode_uid']);
+				/** @var \phpbb\controller\helper $controller_helper */
+				$controller_helper = $phpbb_container->get('controller.helper');
 
 				$template->assign_vars(array(
 					'S_SIGNATURE'		=> true,
 
-					'SIGNATURE'			=> $signature,
+					'SIGNATURE'			=> $decoded_message['text'],
 					'SIGNATURE_PREVIEW'	=> $signature_preview,
 
 					'S_BBCODE_CHECKED'		=> (!$enable_bbcode) ? ' checked="checked"' : '',
 					'S_SMILIES_CHECKED'		=> (!$enable_smilies) ? ' checked="checked"' : '',
 					'S_MAGIC_URL_CHECKED'	=> (!$enable_urls) ? ' checked="checked"' : '',
 
-					'BBCODE_STATUS'			=> ($config['allow_sig_bbcode']) ? sprintf($user->lang['BBCODE_IS_ON'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>') : sprintf($user->lang['BBCODE_IS_OFF'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>'),
+					'BBCODE_STATUS'			=> $user->lang(($config['allow_sig_bbcode'] ? 'BBCODE_IS_ON' : 'BBCODE_IS_OFF'), '<a href="' . $controller_helper->route('phpbb_help_bbcode_controller') . '">', '</a>'),
 					'SMILIES_STATUS'		=> ($config['allow_sig_smilies']) ? $user->lang['SMILIES_ARE_ON'] : $user->lang['SMILIES_ARE_OFF'],
 					'IMG_STATUS'			=> ($config['allow_sig_img']) ? $user->lang['IMAGES_ARE_ON'] : $user->lang['IMAGES_ARE_OFF'],
 					'FLASH_STATUS'			=> ($config['allow_sig_flash']) ? $user->lang['FLASH_IS_ON'] : $user->lang['FLASH_IS_OFF'],
@@ -2084,15 +2128,16 @@ class acp_users
 			break;
 
 			case 'attach':
+				/* @var $pagination \phpbb\pagination */
+				$pagination = $phpbb_container->get('pagination');
 
-				$start		= request_var('start', 0);
+				$start		= $request->variable('start', 0);
 				$deletemark = (isset($_POST['delmarked'])) ? true : false;
-				$marked		= request_var('mark', array(0));
-				$pagination = $phpbb_container->get('pagination');
+				$marked		= $request->variable('mark', array(0));
 
 				// Sort keys
-				$sort_key	= request_var('sk', 'a');
-				$sort_dir	= request_var('sd', 'd');
+				$sort_key	= $request->variable('sk', 'a');
+				$sort_dir	= $request->variable('sd', 'd');
 
 				if ($deletemark && sizeof($marked))
 				{
@@ -2127,11 +2172,14 @@ class acp_users
 						}
 						$db->sql_freeresult($result);
 
-						delete_attachments('attach', $marked);
+						/** @var \phpbb\attachment\manager $attachment_manager */
+						$attachment_manager = $phpbb_container->get('attachment.manager');
+						$attachment_manager->delete('attach', $marked);
+						unset($attachment_manager);
 
 						$message = (sizeof($log_attachments) == 1) ? $user->lang['ATTACHMENT_DELETED'] : $user->lang['ATTACHMENTS_DELETED'];
 
-						add_log('admin', 'LOG_ATTACHMENTS_DELETED', implode($user->lang['COMMA_SEPARATOR'], $log_attachments));
+						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACHMENTS_DELETED', false, array(implode($user->lang['COMMA_SEPARATOR'], $log_attachments)));
 						trigger_error($message . adm_back_link($this->u_action . '&amp;u=' . $user_id));
 					}
 					else
@@ -2243,7 +2291,7 @@ class acp_users
 				}
 
 				$user->add_lang(array('groups', 'acp/groups'));
-				$group_id = request_var('g', 0);
+				$group_id = $request->variable('g', 0);
 
 				if ($group_id)
 				{
@@ -2260,10 +2308,6 @@ class acp_users
 						trigger_error($user->lang['NOT_ALLOWED_MANAGE_GROUP'] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING);
 					}
 				}
-				else
-				{
-					$founder_manage = 0;
-				}
 
 				switch ($action)
 				{
@@ -2374,6 +2418,9 @@ class acp_users
 					$error = array();
 				}
 
+				/** @var \phpbb\group\helper $group_helper */
+				$group_helper = $phpbb_container->get('group_helper');
+
 				$sql = 'SELECT ug.*, g.*
 					FROM ' . GROUPS_TABLE . ' g, ' . USER_GROUP_TABLE . " ug
 					WHERE ug.user_id = $user_id
@@ -2418,7 +2465,7 @@ class acp_users
 						continue;
 					}
 
-					$s_group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '">' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</option>';
+					$s_group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '">' . $group_helper->get_name($row['group_name']) . '</option>';
 				}
 				$db->sql_freeresult($result);
 
@@ -2472,7 +2519,7 @@ class acp_users
 				$user->add_lang('acp/permissions');
 				add_permission_language();
 
-				$forum_id = request_var('f', 0);
+				$forum_id = $request->variable('f', 0);
 
 				// Global Permissions
 				if (!$forum_id)
--- a/includes/acp/acp_words.php
+++ b/includes/acp/acp_words.php
@@ -28,13 +28,12 @@ class acp_words
 
 	function main($id, $mode)
 	{
-		global $db, $user, $auth, $template, $cache;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+		global $db, $user, $template, $cache, $phpbb_log, $request, $phpbb_container;
 
 		$user->add_lang('acp/posting');
 
 		// Set up general vars
-		$action = request_var('action', '');
+		$action = $request->variable('action', '');
 		$action = (isset($_POST['add'])) ? 'add' : ((isset($_POST['save'])) ? 'save' : $action);
 
 		$s_hidden_fields = '';
@@ -50,7 +49,7 @@ class acp_words
 		{
 			case 'edit':
 
-				$word_id = request_var('id', 0);
+				$word_id = $request->variable('id', 0);
 
 				if (!$word_id)
 				{
@@ -88,9 +87,9 @@ class acp_words
 					trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);
 				}
 
-				$word_id		= request_var('id', 0);
-				$word			= utf8_normalize_nfc(request_var('word', '', true));
-				$replacement	= utf8_normalize_nfc(request_var('replacement', '', true));
+				$word_id		= $request->variable('id', 0);
+				$word			= $request->variable('word', '', true);
+				$replacement	= $request->variable('replacement', '', true);
 
 				if ($word === '' || $replacement === '')
 				{
@@ -115,9 +114,11 @@ class acp_words
 				}
 
 				$cache->destroy('_word_censors');
+				$phpbb_container->get('text_formatter.cache')->invalidate();
 
 				$log_action = ($word_id) ? 'LOG_WORD_EDIT' : 'LOG_WORD_ADD';
-				add_log('admin', $log_action, $word);
+
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log_action, false, array($word));
 
 				$message = ($word_id) ? $user->lang['WORD_UPDATED'] : $user->lang['WORD_ADDED'];
 				trigger_error($message . adm_back_link($this->u_action));
@@ -126,7 +127,7 @@ class acp_words
 
 			case 'delete':
 
-				$word_id = request_var('id', 0);
+				$word_id = $request->variable('id', 0);
 
 				if (!$word_id)
 				{
@@ -147,8 +148,9 @@ class acp_words
 					$db->sql_query($sql);
 
 					$cache->destroy('_word_censors');
+					$phpbb_container->get('text_formatter.cache')->invalidate();
 
-					add_log('admin', 'LOG_WORD_DELETE', $deleted_word);
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_WORD_DELETE', false, array($deleted_word));
 
 					trigger_error($user->lang['WORD_REMOVED'] . adm_back_link($this->u_action));
 				}
--- a/includes/acp/auth.php
+++ b/includes/acp/auth.php
@@ -266,9 +266,14 @@ class auth_admin extends \phpbb\auth\auth
 	*/
 	function display_mask($mode, $permission_type, &$hold_ary, $user_mode = 'user', $local = false, $group_display = true)
 	{
-		global $template, $user, $db, $phpbb_root_path, $phpEx, $phpbb_container;
+		global $template, $user, $db, $phpbb_container;
+
+		/* @var $phpbb_permissions \phpbb\permissions */
 		$phpbb_permissions = $phpbb_container->get('acl.permissions');
 
+		/** @var \phpbb\group\helper $group_helper */
+		$group_helper = $phpbb_container->get('group_helper');
+
 		// Define names for template loops, might be able to be set
 		$tpl_pmask = 'p_mask';
 		$tpl_fmask = 'f_mask';
@@ -300,7 +305,7 @@ class auth_admin extends \phpbb\auth\auth
 		$ug_names_ary = array();
 		while ($row = $db->sql_fetchrow($result))
 		{
-			$ug_names_ary[$row['ug_id']] = ($user_mode == 'user') ? $row['ug_name'] : (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['ug_name']] : $row['ug_name']);
+			$ug_names_ary[$row['ug_id']] = ($user_mode == 'user') ? $row['ug_name'] : $group_helper->get_name($row['ug_name']);
 		}
 		$db->sql_freeresult($result);
 
@@ -408,14 +413,7 @@ class auth_admin extends \phpbb\auth\auth
 			{
 				foreach ($memberships as $row)
 				{
-					if ($groups[$row['group_id']]['group_type'] == GROUP_SPECIAL)
-					{
-						$user_groups_default[$row['user_id']][] = $user->lang['G_' . $groups[$row['group_id']]['group_name']];
-					}
-					else
-					{
-						$user_groups_custom[$row['user_id']][] = $groups[$row['group_id']]['group_name'];
-					}
+					$user_groups_default[$row['user_id']][] = $group_helper->get_name($groups[$row['group_id']]['group_name']);
 				}
 			}
 			unset($memberships, $groups);
@@ -468,7 +466,10 @@ class auth_admin extends \phpbb\auth\auth
 					// Build role dropdown options
 					$current_role_id = (isset($cur_roles[$ug_id][$forum_id])) ? $cur_roles[$ug_id][$forum_id] : 0;
 
+					$role_options = array();
+
 					$s_role_options = '';
+					$current_role_id = (isset($cur_roles[$ug_id][$forum_id])) ? $cur_roles[$ug_id][$forum_id] : 0;
 
 					@reset($roles);
 					while (list($role_id, $role_row) = each($roles))
@@ -478,6 +479,13 @@ class auth_admin extends \phpbb\auth\auth
 
 						$title = ($role_description) ? ' title="' . $role_description . '"' : '';
 						$s_role_options .= '<option value="' . $role_id . '"' . (($role_id == $current_role_id) ? ' selected="selected"' : '') . $title . '>' . $role_name . '</option>';
+
+						$role_options[] = array(
+							'ID'	=> $role_id,
+							'ROLE_NAME'	=> $role_name,
+							'TITLE'		=> $role_description,
+							'SELECTED'	=> $role_id == $current_role_id,
+						);
 					}
 
 					if ($s_role_options)
@@ -505,11 +513,14 @@ class auth_admin extends \phpbb\auth\auth
 
 					$template->assign_block_vars($tpl_pmask . '.' . $tpl_fmask, array(
 						'NAME'				=> $ug_names_ary[$ug_id],
-						'S_ROLE_OPTIONS'	=> $s_role_options,
 						'UG_ID'				=> $ug_id,
+						'S_ROLE_OPTIONS'	=> $s_role_options,
 						'S_CUSTOM'			=> $s_custom_permissions,
-						'FORUM_ID'			=> $forum_id)
-					);
+						'FORUM_ID'			=> $forum_id,
+						'S_ROLE_ID'			=> $current_role_id,
+					));
+
+					$template->assign_block_vars_array($tpl_pmask . '.' . $tpl_fmask . '.role_options', $role_options);
 
 					$this->assign_cat_array($ug_array, $tpl_pmask . '.' . $tpl_fmask . '.' . $tpl_category, $tpl_mask, $ug_id, $forum_id, ($mode == 'view'), $show_trace);
 
@@ -554,6 +565,9 @@ class auth_admin extends \phpbb\auth\auth
 					// Build role dropdown options
 					$current_role_id = (isset($cur_roles[$ug_id][$forum_id])) ? $cur_roles[$ug_id][$forum_id] : 0;
 
+					$role_options = array();
+
+					$current_role_id = (isset($cur_roles[$ug_id][$forum_id])) ? $cur_roles[$ug_id][$forum_id] : 0;
 					$s_role_options = '';
 
 					@reset($roles);
@@ -564,6 +578,13 @@ class auth_admin extends \phpbb\auth\auth
 
 						$title = ($role_description) ? ' title="' . $role_description . '"' : '';
 						$s_role_options .= '<option value="' . $role_id . '"' . (($role_id == $current_role_id) ? ' selected="selected"' : '') . $title . '>' . $role_name . '</option>';
+
+						$role_options[] = array(
+							'ID'	=> $role_id,
+							'ROLE_NAME'	=> $role_name,
+							'TITLE'		=> $role_description,
+							'SELECTED'	=> $role_id == $current_role_id,
+						);
 					}
 
 					if ($s_role_options)
@@ -592,12 +613,14 @@ class auth_admin extends \phpbb\auth\auth
 					$template->assign_block_vars($tpl_pmask . '.' . $tpl_fmask, array(
 						'NAME'				=> ($forum_id == 0) ? $forum_names_ary[0] : $forum_names_ary[$forum_id]['forum_name'],
 						'PADDING'			=> ($forum_id == 0) ? '' : $forum_names_ary[$forum_id]['padding'],
-						'S_ROLE_OPTIONS'	=> $s_role_options,
 						'S_CUSTOM'			=> $s_custom_permissions,
 						'UG_ID'				=> $ug_id,
+						'S_ROLE_OPTIONS'	=> $s_role_options,
 						'FORUM_ID'			=> $forum_id)
 					);
 
+					$template->assign_block_vars_array($tpl_pmask . '.' . $tpl_fmask . '.role_options', $role_options);
+
 					$this->assign_cat_array($forum_array, $tpl_pmask . '.' . $tpl_fmask . '.' . $tpl_category, $tpl_mask, $ug_id, $forum_id, ($mode == 'view'), $show_trace);
 				}
 
@@ -611,13 +634,17 @@ class auth_admin extends \phpbb\auth\auth
 	*/
 	function display_role_mask(&$hold_ary)
 	{
-		global $db, $template, $user, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+		global $db, $template, $user, $phpbb_root_path, $phpEx;
+		global $phpbb_container;
 
 		if (!sizeof($hold_ary))
 		{
 			return;
 		}
 
+		/** @var \phpbb\group\helper $group_helper */
+		$group_helper = $phpbb_container->get('group_helper');
+
 		// Get forum names
 		$sql = 'SELECT forum_id, forum_name
 			FROM ' . FORUMS_TABLE . '
@@ -673,7 +700,7 @@ class auth_admin extends \phpbb\auth\auth
 				{
 					$template->assign_block_vars('role_mask.groups', array(
 						'GROUP_ID'		=> $row['group_id'],
-						'GROUP_NAME'	=> ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'],
+						'GROUP_NAME'	=> $group_helper->get_name($row['group_name']),
 						'U_PROFILE'		=> append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=group&amp;g={$row['group_id']}"))
 					);
 				}
@@ -1106,8 +1133,9 @@ class auth_admin extends \phpbb\auth\auth
 	*/
 	function assign_cat_array(&$category_array, $tpl_cat, $tpl_mask, $ug_id, $forum_id, $s_view, $show_trace = false)
 	{
-		global $template, $user, $phpbb_admin_path, $phpEx, $phpbb_container;
+		global $template, $phpbb_admin_path, $phpEx, $phpbb_container;
 
+		/* @var $phpbb_permissions \phpbb\permissions */
 		$phpbb_permissions = $phpbb_container->get('acl.permissions');
 
 		@reset($category_array);
@@ -1194,8 +1222,9 @@ class auth_admin extends \phpbb\auth\auth
 	*/
 	function build_permission_array(&$permission_row, &$content_array, &$categories, $key_sort_array)
 	{
-		global $user, $phpbb_container;
+		global $phpbb_container;
 
+		/* @var $phpbb_permissions \phpbb\permissions */
 		$phpbb_permissions = $phpbb_container->get('acl.permissions');
 
 		foreach ($key_sort_array as $forum_id)
--- a/includes/acp/info/acp_attachments.php
+++ b/includes/acp/info/acp_attachments.php
@@ -18,7 +18,6 @@ class acp_attachments_info
 		return array(
 			'filename'	=> 'acp_attachments',
 			'title'		=> 'ACP_ATTACHMENTS',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'attach'		=> array('title' => 'ACP_ATTACHMENT_SETTINGS', 'auth' => 'acl_a_attach', 'cat' => array('ACP_BOARD_CONFIGURATION', 'ACP_ATTACHMENTS')),
 				'extensions'	=> array('title' => 'ACP_MANAGE_EXTENSIONS', 'auth' => 'acl_a_attach', 'cat' => array('ACP_ATTACHMENTS')),
--- a/includes/acp/info/acp_ban.php
+++ b/includes/acp/info/acp_ban.php
@@ -18,7 +18,6 @@ class acp_ban_info
 		return array(
 			'filename'	=> 'acp_ban',
 			'title'		=> 'ACP_BAN',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'email'		=> array('title' => 'ACP_BAN_EMAILS', 'auth' => 'acl_a_ban', 'cat' => array('ACP_USER_SECURITY')),
 				'ip'		=> array('title' => 'ACP_BAN_IPS', 'auth' => 'acl_a_ban', 'cat' => array('ACP_USER_SECURITY')),
--- a/includes/acp/info/acp_bbcodes.php
+++ b/includes/acp/info/acp_bbcodes.php
@@ -18,7 +18,6 @@ class acp_bbcodes_info
 		return array(
 			'filename'	=> 'acp_bbcodes',
 			'title'		=> 'ACP_BBCODES',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'bbcodes'		=> array('title' => 'ACP_BBCODES', 'auth' => 'acl_a_bbcode', 'cat' => array('ACP_MESSAGES')),
 			),
--- a/includes/acp/info/acp_board.php
+++ b/includes/acp/info/acp_board.php
@@ -18,7 +18,6 @@ class acp_board_info
 		return array(
 			'filename'	=> 'acp_board',
 			'title'		=> 'ACP_BOARD_MANAGEMENT',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'settings'		=> array('title' => 'ACP_BOARD_SETTINGS', 'auth' => 'acl_a_board', 'cat' => array('ACP_BOARD_CONFIGURATION')),
 				'features'		=> array('title' => 'ACP_BOARD_FEATURES', 'auth' => 'acl_a_board', 'cat' => array('ACP_BOARD_CONFIGURATION')),
--- a/includes/acp/info/acp_bots.php
+++ b/includes/acp/info/acp_bots.php
@@ -18,7 +18,6 @@ class acp_bots_info
 		return array(
 			'filename'	=> 'acp_bots',
 			'title'		=> 'ACP_BOTS',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'bots'		=> array('title' => 'ACP_BOTS', 'auth' => 'acl_a_bots', 'cat' => array('ACP_GENERAL_TASKS')),
 			),
--- a/includes/acp/info/acp_captcha.php
+++ b/includes/acp/info/acp_captcha.php
@@ -18,7 +18,6 @@ class acp_captcha_info
 		return array(
 			'filename'	=> 'acp_captcha',
 			'title'		=> 'ACP_CAPTCHA',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'visual'		=> array('title' => 'ACP_VC_SETTINGS', 'auth' => 'acl_a_board', 'cat' => array('ACP_BOARD_CONFIGURATION')),
 				'img'			=> array('title' => 'ACP_VC_CAPTCHA_DISPLAY', 'auth' => 'acl_a_board', 'cat' => array('ACP_BOARD_CONFIGURATION'), 'display' => false)
--- a/includes/acp/info/acp_database.php
+++ b/includes/acp/info/acp_database.php
@@ -18,7 +18,6 @@ class acp_database_info
 		return array(
 			'filename'	=> 'acp_database',
 			'title'		=> 'ACP_DATABASE',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'backup'	=> array('title' => 'ACP_BACKUP', 'auth' => 'acl_a_backup', 'cat' => array('ACP_CAT_DATABASE')),
 				'restore'	=> array('title' => 'ACP_RESTORE', 'auth' => 'acl_a_backup', 'cat' => array('ACP_CAT_DATABASE')),
--- a/includes/acp/info/acp_disallow.php
+++ b/includes/acp/info/acp_disallow.php
@@ -18,7 +18,6 @@ class acp_disallow_info
 		return array(
 			'filename'	=> 'acp_disallow',
 			'title'		=> 'ACP_DISALLOW',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'usernames'		=> array('title' => 'ACP_DISALLOW_USERNAMES', 'auth' => 'acl_a_names', 'cat' => array('ACP_USER_SECURITY')),
 			),
--- a/includes/acp/info/acp_email.php
+++ b/includes/acp/info/acp_email.php
@@ -18,7 +18,6 @@ class acp_email_info
 		return array(
 			'filename'	=> 'acp_email',
 			'title'		=> 'ACP_MASS_EMAIL',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'email'		=> array('title' => 'ACP_MASS_EMAIL', 'auth' => 'acl_a_email && cfg_email_enable', 'cat' => array('ACP_GENERAL_TASKS')),
 			),
--- a/includes/acp/info/acp_extensions.php
+++ b/includes/acp/info/acp_extensions.php
@@ -18,7 +18,6 @@ class acp_extensions_info
 		return array(
 			'filename'	=> 'acp_extensions',
 			'title'		=> 'ACP_EXTENSION_MANAGEMENT',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'main'		=> array('title' => 'ACP_EXTENSIONS', 'auth' => 'acl_a_extensions', 'cat' => array('ACP_EXTENSION_MANAGEMENT')),
 			),
--- a/includes/acp/info/acp_forums.php
+++ b/includes/acp/info/acp_forums.php
@@ -18,7 +18,6 @@ class acp_forums_info
 		return array(
 			'filename'	=> 'acp_forums',
 			'title'		=> 'ACP_FORUM_MANAGEMENT',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'manage'	=> array('title' => 'ACP_MANAGE_FORUMS', 'auth' => 'acl_a_forum', 'cat' => array('ACP_MANAGE_FORUMS')),
 			),
--- a/includes/acp/info/acp_groups.php
+++ b/includes/acp/info/acp_groups.php
@@ -18,7 +18,6 @@ class acp_groups_info
 		return array(
 			'filename'	=> 'acp_groups',
 			'title'		=> 'ACP_GROUPS_MANAGEMENT',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'manage'		=> array('title' => 'ACP_GROUPS_MANAGE', 'auth' => 'acl_a_group', 'cat' => array('ACP_GROUPS')),
 				'position'		=> array('title' => 'ACP_GROUPS_POSITION', 'auth' => 'acl_a_group', 'cat' => array('ACP_GROUPS')),
--- /dev/null
+++ b/includes/acp/info/acp_help_phpbb.php
@@ -0,0 +1,34 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+class acp_help_phpbb_info
+{
+	function module()
+	{
+		return array(
+			'filename'	=> 'acp_help_phpbb',
+			'title'		=> 'ACP_HELP_PHPBB',
+			'modes'		=> array(
+				'help_phpbb'	=> array('title' => 'ACP_HELP_PHPBB', 'auth' => 'acl_a_server', 'cat' => array('ACP_SERVER_CONFIGURATION')),
+			),
+		);
+	}
+
+	function install()
+	{
+	}
+
+	function uninstall()
+	{
+	}
+}
--- a/includes/acp/info/acp_icons.php
+++ b/includes/acp/info/acp_icons.php
@@ -18,7 +18,6 @@ class acp_icons_info
 		return array(
 			'filename'	=> 'acp_icons',
 			'title'		=> 'ACP_ICONS_SMILIES',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'icons'		=> array('title' => 'ACP_ICONS', 'auth' => 'acl_a_icons', 'cat' => array('ACP_MESSAGES')),
 				'smilies'	=> array('title' => 'ACP_SMILIES', 'auth' => 'acl_a_icons', 'cat' => array('ACP_MESSAGES')),
--- a/includes/acp/info/acp_inactive.php
+++ b/includes/acp/info/acp_inactive.php
@@ -18,7 +18,6 @@ class acp_inactive_info
 		return array(
 			'filename'	=> 'acp_inactive',
 			'title'		=> 'ACP_INACTIVE_USERS',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'list'		=> array('title' => 'ACP_INACTIVE_USERS', 'auth' => 'acl_a_user', 'cat' => array('ACP_CAT_USERS')),
 			),
--- a/includes/acp/info/acp_jabber.php
+++ b/includes/acp/info/acp_jabber.php
@@ -18,7 +18,6 @@ class acp_jabber_info
 		return array(
 			'filename'	=> 'acp_jabber',
 			'title'		=> 'ACP_JABBER_SETTINGS',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'settings'		=> array('title' => 'ACP_JABBER_SETTINGS', 'auth' => 'acl_a_jabber', 'cat' => array('ACP_CLIENT_COMMUNICATION')),
 			),
--- a/includes/acp/info/acp_language.php
+++ b/includes/acp/info/acp_language.php
@@ -18,7 +18,6 @@ class acp_language_info
 		return array(
 			'filename'	=> 'acp_language',
 			'title'		=> 'ACP_LANGUAGE',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'lang_packs'		=> array('title' => 'ACP_LANGUAGE_PACKS', 'auth' => 'acl_a_language', 'cat' => array('ACP_LANGUAGE')),
 			),
--- a/includes/acp/info/acp_logs.php
+++ b/includes/acp/info/acp_logs.php
@@ -18,7 +18,6 @@ class acp_logs_info
 		return array(
 			'filename'	=> 'acp_logs',
 			'title'		=> 'ACP_LOGGING',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'admin'		=> array('title' => 'ACP_ADMIN_LOGS', 'auth' => 'acl_a_viewlogs', 'cat' => array('ACP_FORUM_LOGS')),
 				'mod'		=> array('title' => 'ACP_MOD_LOGS', 'auth' => 'acl_a_viewlogs', 'cat' => array('ACP_FORUM_LOGS')),
--- a/includes/acp/info/acp_main.php
+++ b/includes/acp/info/acp_main.php
@@ -18,7 +18,6 @@ class acp_main_info
 		return array(
 			'filename'	=> 'acp_main',
 			'title'		=> 'ACP_INDEX',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'main'		=> array('title' => 'ACP_INDEX', 'auth' => '', 'cat' => array('ACP_CAT_GENERAL')),
 			),
--- a/includes/acp/info/acp_modules.php
+++ b/includes/acp/info/acp_modules.php
@@ -18,7 +18,6 @@ class acp_modules_info
 		return array(
 			'filename'	=> 'acp_modules',
 			'title'		=> 'ACP_MODULE_MANAGEMENT',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'acp'		=> array('title' => 'ACP', 'auth' => 'acl_a_modules', 'cat' => array('ACP_MODULE_MANAGEMENT')),
 				'ucp'		=> array('title' => 'UCP', 'auth' => 'acl_a_modules', 'cat' => array('ACP_MODULE_MANAGEMENT')),
--- a/includes/acp/info/acp_permission_roles.php
+++ b/includes/acp/info/acp_permission_roles.php
@@ -18,7 +18,6 @@ class acp_permission_roles_info
 		return array(
 			'filename'	=> 'acp_permission_roles',
 			'title'		=> 'ACP_PERMISSION_ROLES',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'admin_roles'		=> array('title' => 'ACP_ADMIN_ROLES', 'auth' => 'acl_a_roles && acl_a_aauth', 'cat' => array('ACP_PERMISSION_ROLES')),
 				'user_roles'		=> array('title' => 'ACP_USER_ROLES', 'auth' => 'acl_a_roles && acl_a_uauth', 'cat' => array('ACP_PERMISSION_ROLES')),
--- a/includes/acp/info/acp_permissions.php
+++ b/includes/acp/info/acp_permissions.php
@@ -18,7 +18,6 @@ class acp_permissions_info
 		return array(
 			'filename'	=> 'acp_permissions',
 			'title'		=> 'ACP_PERMISSIONS',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'intro'					=> array('title' => 'ACP_PERMISSIONS', 'auth' => 'acl_a_authusers || acl_a_authgroups || acl_a_viewauth', 'cat' => array('ACP_CAT_PERMISSIONS')),
 				'trace'					=> array('title' => 'ACP_PERMISSION_TRACE', 'auth' => 'acl_a_viewauth', 'display' => false, 'cat' => array('ACP_PERMISSION_MASKS')),
--- a/includes/acp/info/acp_php_info.php
+++ b/includes/acp/info/acp_php_info.php
@@ -18,7 +18,6 @@ class acp_php_info_info
 		return array(
 			'filename'	=> 'acp_php_info',
 			'title'		=> 'ACP_PHP_INFO',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'info'		=> array('title' => 'ACP_PHP_INFO', 'auth' => 'acl_a_phpinfo', 'cat' => array('ACP_GENERAL_TASKS')),
 			),
--- a/includes/acp/info/acp_profile.php
+++ b/includes/acp/info/acp_profile.php
@@ -18,7 +18,6 @@ class acp_profile_info
 		return array(
 			'filename'	=> 'acp_profile',
 			'title'		=> 'ACP_CUSTOM_PROFILE_FIELDS',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'profile'	=> array('title' => 'ACP_CUSTOM_PROFILE_FIELDS', 'auth' => 'acl_a_profile', 'cat' => array('ACP_CAT_USERS')),
 			),
--- a/includes/acp/info/acp_prune.php
+++ b/includes/acp/info/acp_prune.php
@@ -18,7 +18,6 @@ class acp_prune_info
 		return array(
 			'filename'	=> 'acp_prune',
 			'title'		=> 'ACP_PRUNING',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'forums'	=> array('title' => 'ACP_PRUNE_FORUMS', 'auth' => 'acl_a_prune', 'cat' => array('ACP_MANAGE_FORUMS')),
 				'users'		=> array('title' => 'ACP_PRUNE_USERS', 'auth' => 'acl_a_userdel', 'cat' => array('ACP_CAT_USERS')),
--- a/includes/acp/info/acp_ranks.php
+++ b/includes/acp/info/acp_ranks.php
@@ -18,7 +18,6 @@ class acp_ranks_info
 		return array(
 			'filename'	=> 'acp_ranks',
 			'title'		=> 'ACP_RANKS',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'ranks'		=> array('title' => 'ACP_MANAGE_RANKS', 'auth' => 'acl_a_ranks', 'cat' => array('ACP_CAT_USERS')),
 			),
--- a/includes/acp/info/acp_reasons.php
+++ b/includes/acp/info/acp_reasons.php
@@ -18,7 +18,6 @@ class acp_reasons_info
 		return array(
 			'filename'	=> 'acp_reasons',
 			'title'		=> 'ACP_REASONS',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'main'		=> array('title' => 'ACP_MANAGE_REASONS', 'auth' => 'acl_a_reasons', 'cat' => array('ACP_GENERAL_TASKS')),
 			),
--- a/includes/acp/info/acp_search.php
+++ b/includes/acp/info/acp_search.php
@@ -18,7 +18,6 @@ class acp_search_info
 		return array(
 			'filename'	=> 'acp_search',
 			'title'		=> 'ACP_SEARCH',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'settings'	=> array('title' => 'ACP_SEARCH_SETTINGS', 'auth' => 'acl_a_search', 'cat' => array('ACP_SERVER_CONFIGURATION')),
 				'index'		=> array('title' => 'ACP_SEARCH_INDEX', 'auth' => 'acl_a_search', 'cat' => array('ACP_CAT_DATABASE')),
--- a/includes/acp/info/acp_styles.php
+++ b/includes/acp/info/acp_styles.php
@@ -18,7 +18,6 @@ class acp_styles_info
 		return array(
 			'filename'	=> 'acp_styles',
 			'title'		=> 'ACP_CAT_STYLES',
-			'version'	=> '2.0.0',
 			'modes'		=> array(
 				'style'		=> array('title' => 'ACP_STYLES', 'auth' => 'acl_a_styles', 'cat' => array('ACP_STYLE_MANAGEMENT')),
 				'install'	=> array('title' => 'ACP_STYLES_INSTALL', 'auth' => 'acl_a_styles', 'cat' => array('ACP_STYLE_MANAGEMENT')),
--- a/includes/acp/info/acp_update.php
+++ b/includes/acp/info/acp_update.php
@@ -18,7 +18,6 @@ class acp_update_info
 		return array(
 			'filename'	=> 'acp_update',
 			'title'		=> 'ACP_UPDATE',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'version_check'		=> array('title' => 'ACP_VERSION_CHECK', 'auth' => 'acl_a_board', 'cat' => array('ACP_AUTOMATION')),
 			),
--- a/includes/acp/info/acp_users.php
+++ b/includes/acp/info/acp_users.php
@@ -18,7 +18,6 @@ class acp_users_info
 		return array(
 			'filename'	=> 'acp_users',
 			'title'		=> 'ACP_USER_MANAGEMENT',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'overview'		=> array('title' => 'ACP_MANAGE_USERS', 'auth' => 'acl_a_user', 'cat' => array('ACP_CAT_USERS')),
 				'feedback'		=> array('title' => 'ACP_USER_FEEDBACK', 'auth' => 'acl_a_user', 'display' => false, 'cat' => array('ACP_CAT_USERS')),
--- a/includes/acp/info/acp_words.php
+++ b/includes/acp/info/acp_words.php
@@ -18,7 +18,6 @@ class acp_words_info
 		return array(
 			'filename'	=> 'acp_words',
 			'title'		=> 'ACP_WORDS',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'words'		=> array('title' => 'ACP_WORDS', 'auth' => 'acl_a_words', 'cat' => array('ACP_MESSAGES')),
 			),
--- a/includes/bbcode.php
+++ b/includes/bbcode.php
@@ -110,7 +110,18 @@ class bbcode
 							$undid_bbcode_specialchars = true;
 						}
 
-						$message = preg_replace($preg['search'], $preg['replace'], $message);
+						foreach ($preg['search'] as $key => $search)
+						{
+							if (is_callable($preg['replace'][$key]))
+							{
+								$message = preg_replace_callback($search, $preg['replace'][$key], $message);
+							}
+							else
+							{
+								$message = preg_replace($search, $preg['replace'][$key], $message);
+							}
+						}
+
 						$preg = array('search' => array(), 'replace' => array());
 					}
 				}
@@ -129,13 +140,32 @@ class bbcode
 	*/
 	function bbcode_cache_init()
 	{
-		global $phpbb_root_path, $phpEx, $config, $user, $phpbb_dispatcher, $phpbb_extension_manager, $phpbb_path_helper;
+		global $user, $phpbb_dispatcher, $phpbb_extension_manager, $phpbb_container, $phpbb_filesystem;
 
 		if (empty($this->template_filename))
 		{
 			$this->template_bitfield = new bitfield($user->style['bbcode_bitfield']);
 
-			$template = new phpbb\template\twig\twig($phpbb_path_helper, $config, $user, new phpbb\template\context(), $phpbb_extension_manager);
+			$template = new \phpbb\template\twig\twig(
+				$phpbb_container->get('path_helper'),
+				$phpbb_container->get('config'),
+				new \phpbb\template\context(),
+				new \phpbb\template\twig\environment(
+					$phpbb_container->get('config'),
+					$phpbb_container->get('filesystem'),
+					$phpbb_container->get('path_helper'),
+					$phpbb_container->getParameter('core.cache_dir'),
+					$phpbb_container->get('ext.manager'),
+					new \phpbb\template\twig\loader(
+						$phpbb_filesystem
+					)
+				),
+				$phpbb_container->getParameter('core.cache_dir'),
+				$phpbb_container->get('user'),
+				$phpbb_container->get('template.twig.extensions.collection'),
+				$phpbb_extension_manager
+			);
+
 			$template->set_style();
 			$template->set_filenames(array('bbcode.html' => 'bbcode.html'));
 			$this->template_filename = $template->get_source_file_for_handle('bbcode.html');
@@ -188,18 +218,25 @@ class bbcode
 		{
 			switch ($bbcode_id)
 			{
-				case 0:
+				case BBCODE_ID_QUOTE:
 					$this->bbcode_cache[$bbcode_id] = array(
 						'str' => array(
 							'[/quote:$uid]'	=> $this->bbcode_tpl('quote_close', $bbcode_id)
 						),
 						'preg' => array(
-							'#\[quote(?:=&quot;(.*?)&quot;)?:$uid\]((?!\[quote(?:=&quot;.*?&quot;)?:$uid\]).)?#ise'	=> "\$this->bbcode_second_pass_quote('\$1', '\$2')"
+							'#\[quote(?:=&quot;(.*?)&quot;)?:$uid\]((?!\[quote(?:=&quot;.*?&quot;)?:$uid\]).)?#is'	=> function ($match) {
+								if (!isset($match[2]))
+								{
+									$match[2] = '';
+								}
+
+								return $this->bbcode_second_pass_quote($match[1], $match[2]);
+							},
 						)
 					);
 				break;
 
-				case 1:
+				case BBCODE_ID_B:
 					$this->bbcode_cache[$bbcode_id] = array(
 						'str' => array(
 							'[b:$uid]'	=> $this->bbcode_tpl('b_open', $bbcode_id),
@@ -208,7 +245,7 @@ class bbcode
 					);
 				break;
 
-				case 2:
+				case BBCODE_ID_I:
 					$this->bbcode_cache[$bbcode_id] = array(
 						'str' => array(
 							'[i:$uid]'	=> $this->bbcode_tpl('i_open', $bbcode_id),
@@ -217,7 +254,7 @@ class bbcode
 					);
 				break;
 
-				case 3:
+				case BBCODE_ID_URL:
 					$this->bbcode_cache[$bbcode_id] = array(
 						'preg' => array(
 							'#\[url:$uid\]((.*?))\[/url:$uid\]#s'			=> $this->bbcode_tpl('url', $bbcode_id),
@@ -226,7 +263,7 @@ class bbcode
 					);
 				break;
 
-				case 4:
+				case BBCODE_ID_IMG:
 					if ($user->optionget('viewimg'))
 					{
 						$this->bbcode_cache[$bbcode_id] = array(
@@ -245,7 +282,7 @@ class bbcode
 					}
 				break;
 
-				case 5:
+				case BBCODE_ID_SIZE:
 					$this->bbcode_cache[$bbcode_id] = array(
 						'preg' => array(
 							'#\[size=([\-\+]?\d+):$uid\](.*?)\[/size:$uid\]#s'	=> $this->bbcode_tpl('size', $bbcode_id),
@@ -253,7 +290,7 @@ class bbcode
 					);
 				break;
 
-				case 6:
+				case BBCODE_ID_COLOR:
 					$this->bbcode_cache[$bbcode_id] = array(
 						'preg' => array(
 							'!\[color=(#[0-9a-f]{3}|#[0-9a-f]{6}|[a-z\-]+):$uid\](.*?)\[/color:$uid\]!is'	=> $this->bbcode_tpl('color', $bbcode_id),
@@ -261,7 +298,7 @@ class bbcode
 					);
 				break;
 
-				case 7:
+				case BBCODE_ID_U:
 					$this->bbcode_cache[$bbcode_id] = array(
 						'str' => array(
 							'[u:$uid]'	=> $this->bbcode_tpl('u_open', $bbcode_id),
@@ -270,20 +307,24 @@ class bbcode
 					);
 				break;
 
-				case 8:
+				case BBCODE_ID_CODE:
 					$this->bbcode_cache[$bbcode_id] = array(
 						'preg' => array(
-							'#\[code(?:=([a-z]+))?:$uid\](.*?)\[/code:$uid\]#ise'	=> "\$this->bbcode_second_pass_code('\$1', '\$2')",
+							'#\[code(?:=([a-z]+))?:$uid\](.*?)\[/code:$uid\]#is'	=> function ($match) {
+								return $this->bbcode_second_pass_code($match[1], $match[2]);
+							},
 						)
 					);
 				break;
 
-				case 9:
+				case BBCODE_ID_LIST:
 					$this->bbcode_cache[$bbcode_id] = array(
 						'preg' => array(
 							'#(\[\/?(list|\*):[mou]?:?$uid\])[\n]{1}#'	=> "\$1",
 							'#(\[list=([^\[]+):$uid\])[\n]{1}#'			=> "\$1",
-							'#\[list=([^\[]+):$uid\]#e'					=> "\$this->bbcode_list('\$1')",
+							'#\[list=([^\[]+):$uid\]#'					=> function ($match) {
+								return $this->bbcode_list($match[1]);
+							},
 						),
 						'str' => array(
 							'[list:$uid]'		=> $this->bbcode_tpl('ulist_open_default', $bbcode_id),
@@ -296,7 +337,7 @@ class bbcode
 					);
 				break;
 
-				case 10:
+				case BBCODE_ID_EMAIL:
 					$this->bbcode_cache[$bbcode_id] = array(
 						'preg' => array(
 							'#\[email:$uid\]((.*?))\[/email:$uid\]#is'			=> $this->bbcode_tpl('email', $bbcode_id),
@@ -305,7 +346,7 @@ class bbcode
 					);
 				break;
 
-				case 11:
+				case BBCODE_ID_FLASH:
 					if ($user->optionget('viewflash'))
 					{
 						$this->bbcode_cache[$bbcode_id] = array(
@@ -324,7 +365,7 @@ class bbcode
 					}
 				break;
 
-				case 12:
+				case BBCODE_ID_ATTACH:
 					$this->bbcode_cache[$bbcode_id] = array(
 						'str'	=> array(
 							'[/attachment:$uid]'	=> $this->bbcode_tpl('inline_attachment_close', $bbcode_id)
@@ -367,7 +408,9 @@ class bbcode
 						}
 
 						// Replace {L_*} lang strings
-						$bbcode_tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $bbcode_tpl);
+						$bbcode_tpl = preg_replace_callback('/{L_([A-Z0-9_]+)}/', function ($match) use ($user) {
+							return (!empty($user->lang[$match[1]])) ? $user->lang($match[1]) : ucwords(strtolower(str_replace('_', ' ', $match[1])));
+						}, $bbcode_tpl);
 
 						if (!empty($rowset[$bbcode_id]['second_pass_replace']))
 						{
@@ -491,7 +534,9 @@ class bbcode
 			'email'					=> array('{EMAIL}'		=> '$1', '{DESCRIPTION}'	=> '$2')
 		);
 
-		$tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $tpl);
+		$tpl = preg_replace_callback('/{L_([A-Z0-9_]+)}/', function ($match) use ($user) {
+			return (!empty($user->lang[$match[1]])) ? $user->lang($match[1]) : ucwords(strtolower(str_replace('_', ' ', $match[1])));
+		}, $tpl);
 
 		if (!empty($replacements[$tpl_name]))
 		{
--- a/includes/compatibility_globals.php
+++ b/includes/compatibility_globals.php
@@ -18,30 +18,64 @@ if (!defined('IN_PHPBB'))
 	exit;
 }
 
-// set up caching
-$cache = $phpbb_container->get('cache');
+/**
+ * Sets compatibility globals in the global scope
+ *
+ * This function registers compatibility variables to the global
+ * variable scope. This is required to make it possible to include this file
+ * in a service.
+ */
+function register_compatibility_globals()
+{
+	global $phpbb_container;
+
+	global $cache, $phpbb_dispatcher, $request, $user, $auth, $db, $config, $phpbb_log;
+	global $symfony_request, $phpbb_filesystem, $phpbb_path_helper, $phpbb_extension_manager, $template;
+
+	// set up caching
+	/* @var $cache \phpbb\cache\service */
+	$cache = $phpbb_container->get('cache');
+
+	// Instantiate some basic classes
+	/* @var $phpbb_dispatcher \phpbb\event\dispatcher */
+	$phpbb_dispatcher = $phpbb_container->get('dispatcher');
+
+	/* @var $request \phpbb\request\request_interface */
+	$request = $phpbb_container->get('request');
+	// Inject request instance, so only this instance is used with request_var
+	request_var('', 0, false, false, $request);
 
-// Instantiate some basic classes
-$phpbb_dispatcher = $phpbb_container->get('dispatcher');
-$request	= $phpbb_container->get('request');
-$user		= $phpbb_container->get('user');
-$auth		= $phpbb_container->get('auth');
-$db			= $phpbb_container->get('dbal.conn');
+	/* @var $user \phpbb\user */
+	$user = $phpbb_container->get('user');
 
-// make sure request_var uses this request instance
-request_var('', 0, false, false, $request); // "dependency injection" for a function
+	/* @var $auth \phpbb\auth\auth */
+	$auth = $phpbb_container->get('auth');
 
-// Grab global variables, re-cache if necessary
-$config = $phpbb_container->get('config');
-set_config(null, null, null, $config);
-set_config_count(null, null, null, $config);
+	/* @var $db \phpbb\db\driver\driver_interface */
+	$db = $phpbb_container->get('dbal.conn');
 
-$phpbb_log = $phpbb_container->get('log');
-$symfony_request = $phpbb_container->get('symfony_request');
-$phpbb_filesystem = $phpbb_container->get('filesystem');
-$phpbb_path_helper = $phpbb_container->get('path_helper');
+	// Grab global variables, re-cache if necessary
+	/* @var $config phpbb\config\db */
+	$config = $phpbb_container->get('config');
+	set_config('', '', false, $config);
+	set_config_count('', 0, false, $config);
 
-// load extensions
-$phpbb_extension_manager = $phpbb_container->get('ext.manager');
+	/* @var $phpbb_log \phpbb\log\log_interface */
+	$phpbb_log = $phpbb_container->get('log');
 
-$template = $phpbb_container->get('template');
+	/* @var $symfony_request \phpbb\symfony_request */
+	$symfony_request = $phpbb_container->get('symfony_request');
+
+	/* @var $phpbb_filesystem \phpbb\filesystem\filesystem_interface */
+	$phpbb_filesystem = $phpbb_container->get('filesystem');
+
+	/* @var $phpbb_path_helper \phpbb\path_helper */
+	$phpbb_path_helper = $phpbb_container->get('path_helper');
+
+	// load extensions
+	/* @var $phpbb_extension_manager \phpbb\extension\manager */
+	$phpbb_extension_manager = $phpbb_container->get('ext.manager');
+
+	/* @var $template \phpbb\template\template */
+	$template = $phpbb_container->get('template');
+}
--- a/includes/constants.php
+++ b/includes/constants.php
@@ -28,7 +28,7 @@ if (!defined('IN_PHPBB'))
 */
 
 // phpBB Version
-define('PHPBB_VERSION', '3.1.10');
+@define('PHPBB_VERSION', '3.2.0');
 
 // QA-related
 // define('PHPBB_QA', 1);
@@ -171,17 +171,33 @@ define('CONFIRM_REPORT', 4);
 // Categories - Attachments
 define('ATTACHMENT_CATEGORY_NONE', 0);
 define('ATTACHMENT_CATEGORY_IMAGE', 1); // Inline Images
-define('ATTACHMENT_CATEGORY_WM', 2); // Windows Media Files - Streaming
-define('ATTACHMENT_CATEGORY_RM', 3); // Real Media Files - Streaming
+define('ATTACHMENT_CATEGORY_WM', 2); // Windows Media Files - Streaming - @deprecated 3.2
+define('ATTACHMENT_CATEGORY_RM', 3); // Real Media Files - Streaming - @deprecated 3.2
 define('ATTACHMENT_CATEGORY_THUMB', 4); // Not used within the database, only while displaying posts
 define('ATTACHMENT_CATEGORY_FLASH', 5); // Flash/SWF files
-define('ATTACHMENT_CATEGORY_QUICKTIME', 6); // Quicktime/Mov files
+define('ATTACHMENT_CATEGORY_QUICKTIME', 6); // Quicktime/Mov files - @deprecated 3.2
 
 // BBCode UID length
 define('BBCODE_UID_LEN', 8);
 
 // Number of core BBCodes
 define('NUM_CORE_BBCODES', 12);
+define('NUM_PREDEFINED_BBCODES', 22);
+
+// BBCode IDs
+define('BBCODE_ID_QUOTE', 0);
+define('BBCODE_ID_B', 1);
+define('BBCODE_ID_I', 2);
+define('BBCODE_ID_URL', 3);
+define('BBCODE_ID_IMG', 4);
+define('BBCODE_ID_SIZE', 5);
+define('BBCODE_ID_COLOR', 6);
+define('BBCODE_ID_U', 7);
+define('BBCODE_ID_CODE', 8);
+define('BBCODE_ID_LIST', 9);
+define('BBCODE_ID_EMAIL', 10);
+define('BBCODE_ID_FLASH', 11);
+define('BBCODE_ID_ATTACH', 12);
 
 // BBCode hard limit
 define('BBCODE_LIMIT', 1511);
@@ -221,6 +237,9 @@ define('CAPTCHA_MAX_CHARS', 7);
 // Additional constants
 define('VOTE_CONVERTED', 127);
 
+// BC global FTW
+global $table_prefix;
+
 // Table names
 define('ACL_GROUPS_TABLE',			$table_prefix . 'acl_groups');
 define('ACL_OPTIONS_TABLE',			$table_prefix . 'acl_options');
@@ -232,7 +251,7 @@ define('BANLIST_TABLE',				$table_prefix . 'banlist');
 define('BBCODES_TABLE',				$table_prefix . 'bbcodes');
 define('BOOKMARKS_TABLE',			$table_prefix . 'bookmarks');
 define('BOTS_TABLE',				$table_prefix . 'bots');
-define('CONFIG_TABLE',				$table_prefix . 'config');
+@define('CONFIG_TABLE',				$table_prefix . 'config');
 define('CONFIG_TEXT_TABLE',			$table_prefix . 'config_text');
 define('CONFIRM_TABLE',				$table_prefix . 'confirm');
 define('DISALLOW_TABLE',			$table_prefix . 'disallow');
--- a/includes/functions.php
+++ b/includes/functions.php
@@ -63,135 +63,6 @@ function set_var(&$result, $var, $type, $multibyte = false)
 	$type_cast_helper->set_var($result, $var, $type, $multibyte);
 }
 
-/**
-* Wrapper function of \phpbb\request\request::variable which exists for backwards compatability.
-* See {@link \phpbb\request\request_interface::variable \phpbb\request\request_interface::variable} for
-* documentation of this function's use.
-*
-* @deprecated
-* @param	mixed			$var_name	The form variable's name from which data shall be retrieved.
-* 										If the value is an array this may be an array of indizes which will give
-* 										direct access to a value at any depth. E.g. if the value of "var" is array(1 => "a")
-* 										then specifying array("var", 1) as the name will return "a".
-* 										If you pass an instance of {@link \phpbb\request\request_interface phpbb_request_interface}
-* 										as this parameter it will overwrite the current request class instance. If you do
-* 										not do so, it will create its own instance (but leave superglobals enabled).
-* @param	mixed			$default	A default value that is returned if the variable was not set.
-* 										This function will always return a value of the same type as the default.
-* @param	bool			$multibyte	If $default is a string this paramater has to be true if the variable may contain any UTF-8 characters
-*										Default is false, causing all bytes outside the ASCII range (0-127) to be replaced with question marks
-* @param	bool			$cookie		This param is mapped to \phpbb\request\request_interface::COOKIE as the last param for
-* 										\phpbb\request\request_interface::variable for backwards compatability reasons.
-* @param	\phpbb\request\request_interface|null|false	If an instance of \phpbb\request\request_interface is given the instance is stored in
-*										a static variable and used for all further calls where this parameters is null. Until
-*										the function is called with an instance it automatically creates a new \phpbb\request\request
-*										instance on every call. By passing false this per-call instantiation can be restored
-*										after having passed in a \phpbb\request\request_interface instance.
-*
-* @return	mixed	The value of $_REQUEST[$var_name] run through {@link set_var set_var} to ensure that the type is the
-* 					the same as that of $default. If the variable is not set $default is returned.
-*/
-function request_var($var_name, $default, $multibyte = false, $cookie = false, $request = null)
-{
-	// This is all just an ugly hack to add "Dependency Injection" to a function
-	// the only real code is the function call which maps this function to a method.
-	static $static_request = null;
-
-	if ($request instanceof \phpbb\request\request_interface)
-	{
-		$static_request = $request;
-
-		if (empty($var_name))
-		{
-			return;
-		}
-	}
-	else if ($request === false)
-	{
-		$static_request = null;
-
-		if (empty($var_name))
-		{
-			return;
-		}
-	}
-
-	$tmp_request = $static_request;
-
-	// no request class set, create a temporary one ourselves to keep backwards compatability
-	if ($tmp_request === null)
-	{
-		// false param: enable super globals, so the created request class does not
-		// make super globals inaccessible everywhere outside this function.
-		$tmp_request = new \phpbb\request\request(new \phpbb\request\type_cast_helper(), false);
-	}
-
-	return $tmp_request->variable($var_name, $default, $multibyte, ($cookie) ? \phpbb\request\request_interface::COOKIE : \phpbb\request\request_interface::REQUEST);
-}
-
-/**
-* Sets a configuration option's value.
-*
-* Please note that this function does not update the is_dynamic value for
-* an already existing config option.
-*
-* @param string $config_name   The configuration option's name
-* @param string $config_value  New configuration value
-* @param bool   $is_dynamic    Whether this variable should be cached (false) or
-*                              if it changes too frequently (true) to be
-*                              efficiently cached.
-*
-* @return null
-*
-* @deprecated
-*/
-function set_config($config_name, $config_value, $is_dynamic = false, \phpbb\config\config $set_config = null)
-{
-	static $config = null;
-
-	if ($set_config !== null)
-	{
-		$config = $set_config;
-
-		if (empty($config_name))
-		{
-			return;
-		}
-	}
-
-	$config->set($config_name, $config_value, !$is_dynamic);
-}
-
-/**
-* Increments an integer config value directly in the database.
-*
-* @param string $config_name   The configuration option's name
-* @param int    $increment     Amount to increment by
-* @param bool   $is_dynamic    Whether this variable should be cached (false) or
-*                              if it changes too frequently (true) to be
-*                              efficiently cached.
-*
-* @return null
-*
-* @deprecated
-*/
-function set_config_count($config_name, $increment, $is_dynamic = false, \phpbb\config\config $set_config = null)
-{
-	static $config = null;
-
-	if ($set_config !== null)
-	{
-		$config = $set_config;
-
-		if (empty($config_name))
-		{
-			return;
-		}
-	}
-
-	$config->increment($config_name, $increment, !$is_dynamic);
-}
-
 /**
 * Generates an alphanumeric random string of given length
 *
@@ -222,25 +93,10 @@ function gen_rand_string_friendly($num_chars = 8)
 
 /**
 * Return unique id
-* @param string $extra additional entropy
 */
-function unique_id($extra = 'c')
+function unique_id()
 {
-	static $dss_seeded = false;
-	global $config;
-
-	$val = $config['rand_seed'] . microtime();
-	$val = md5($val);
-	$config['rand_seed'] = md5($config['rand_seed'] . $val . $extra);
-
-	if ($dss_seeded !== true && ($config['rand_seed_last_update'] < time() - rand(1,10)))
-	{
-		set_config('rand_seed_last_update', time(), true);
-		set_config('rand_seed', $config['rand_seed'], true);
-		$dss_seeded = true;
-	}
-
-	return substr($val, 4, 16);
+	return bin2hex(random_bytes(8));
 }
 
 /**
@@ -376,8 +232,7 @@ function still_on_time($extra_time = 15)
 {
 	static $max_execution_time, $start_time;
 
-	$time = explode(' ', microtime());
-	$current_time = $time[0] + $time[1];
+	$current_time = microtime(true);
 
 	if (empty($max_execution_time))
 	{
@@ -441,448 +296,6 @@ function phpbb_version_compare($version1, $version2, $operator = null)
 	}
 }
 
-/**
-* Global function for chmodding directories and files for internal use
-*
-* This function determines owner and group whom the file belongs to and user and group of PHP and then set safest possible file permissions.
-* The function determines owner and group from common.php file and sets the same to the provided file.
-* The function uses bit fields to build the permissions.
-* The function sets the appropiate execute bit on directories.
-*
-* Supported constants representing bit fields are:
-*
-* CHMOD_ALL - all permissions (7)
-* CHMOD_READ - read permission (4)
-* CHMOD_WRITE - write permission (2)
-* CHMOD_EXECUTE - execute permission (1)
-*
-* NOTE: The function uses POSIX extension and fileowner()/filegroup() functions. If any of them is disabled, this function tries to build proper permissions, by calling is_readable() and is_writable() functions.
-*
-* @param string	$filename	The file/directory to be chmodded
-* @param int	$perms		Permissions to set
-*
-* @return bool	true on success, otherwise false
-*/
-function phpbb_chmod($filename, $perms = CHMOD_READ)
-{
-	static $_chmod_info;
-
-	// Return if the file no longer exists.
-	if (!file_exists($filename))
-	{
-		return false;
-	}
-
-	// Determine some common vars
-	if (empty($_chmod_info))
-	{
-		if (!function_exists('fileowner') || !function_exists('filegroup'))
-		{
-			// No need to further determine owner/group - it is unknown
-			$_chmod_info['process'] = false;
-		}
-		else
-		{
-			global $phpbb_root_path, $phpEx;
-
-			// Determine owner/group of common.php file and the filename we want to change here
-			$common_php_owner = @fileowner($phpbb_root_path . 'common.' . $phpEx);
-			$common_php_group = @filegroup($phpbb_root_path . 'common.' . $phpEx);
-
-			// And the owner and the groups PHP is running under.
-			$php_uid = (function_exists('posix_getuid')) ? @posix_getuid() : false;
-			$php_gids = (function_exists('posix_getgroups')) ? @posix_getgroups() : false;
-
-			// If we are unable to get owner/group, then do not try to set them by guessing
-			if (!$php_uid || empty($php_gids) || !$common_php_owner || !$common_php_group)
-			{
-				$_chmod_info['process'] = false;
-			}
-			else
-			{
-				$_chmod_info = array(
-					'process'		=> true,
-					'common_owner'	=> $common_php_owner,
-					'common_group'	=> $common_php_group,
-					'php_uid'		=> $php_uid,
-					'php_gids'		=> $php_gids,
-				);
-			}
-		}
-	}
-
-	if ($_chmod_info['process'])
-	{
-		$file_uid = @fileowner($filename);
-		$file_gid = @filegroup($filename);
-
-		// Change owner
-		if (@chown($filename, $_chmod_info['common_owner']))
-		{
-			clearstatcache();
-			$file_uid = @fileowner($filename);
-		}
-
-		// Change group
-		if (@chgrp($filename, $_chmod_info['common_group']))
-		{
-			clearstatcache();
-			$file_gid = @filegroup($filename);
-		}
-
-		// If the file_uid/gid now match the one from common.php we can process further, else we are not able to change something
-		if ($file_uid != $_chmod_info['common_owner'] || $file_gid != $_chmod_info['common_group'])
-		{
-			$_chmod_info['process'] = false;
-		}
-	}
-
-	// Still able to process?
-	if ($_chmod_info['process'])
-	{
-		if ($file_uid == $_chmod_info['php_uid'])
-		{
-			$php = 'owner';
-		}
-		else if (in_array($file_gid, $_chmod_info['php_gids']))
-		{
-			$php = 'group';
-		}
-		else
-		{
-			// Since we are setting the everyone bit anyway, no need to do expensive operations
-			$_chmod_info['process'] = false;
-		}
-	}
-
-	// We are not able to determine or change something
-	if (!$_chmod_info['process'])
-	{
-		$php = 'other';
-	}
-
-	// Owner always has read/write permission
-	$owner = CHMOD_READ | CHMOD_WRITE;
-	if (is_dir($filename))
-	{
-		$owner |= CHMOD_EXECUTE;
-
-		// Only add execute bit to the permission if the dir needs to be readable
-		if ($perms & CHMOD_READ)
-		{
-			$perms |= CHMOD_EXECUTE;
-		}
-	}
-
-	switch ($php)
-	{
-		case 'owner':
-			$result = @chmod($filename, ($owner << 6) + (0 << 3) + (0 << 0));
-
-			clearstatcache();
-
-			if (is_readable($filename) && phpbb_is_writable($filename))
-			{
-				break;
-			}
-
-		case 'group':
-			$result = @chmod($filename, ($owner << 6) + ($perms << 3) + (0 << 0));
-
-			clearstatcache();
-
-			if ((!($perms & CHMOD_READ) || is_readable($filename)) && (!($perms & CHMOD_WRITE) || phpbb_is_writable($filename)))
-			{
-				break;
-			}
-
-		case 'other':
-			$result = @chmod($filename, ($owner << 6) + ($perms << 3) + ($perms << 0));
-
-			clearstatcache();
-
-			if ((!($perms & CHMOD_READ) || is_readable($filename)) && (!($perms & CHMOD_WRITE) || phpbb_is_writable($filename)))
-			{
-				break;
-			}
-
-		default:
-			return false;
-		break;
-	}
-
-	return $result;
-}
-
-/**
-* Test if a file/directory is writable
-*
-* This function calls the native is_writable() when not running under
-* Windows and it is not disabled.
-*
-* @param string $file Path to perform write test on
-* @return bool True when the path is writable, otherwise false.
-*/
-function phpbb_is_writable($file)
-{
-	if (strtolower(substr(PHP_OS, 0, 3)) === 'win' || !function_exists('is_writable'))
-	{
-		if (file_exists($file))
-		{
-			// Canonicalise path to absolute path
-			$file = phpbb_realpath($file);
-
-			if (is_dir($file))
-			{
-				// Test directory by creating a file inside the directory
-				$result = @tempnam($file, 'i_w');
-
-				if (is_string($result) && file_exists($result))
-				{
-					unlink($result);
-
-					// Ensure the file is actually in the directory (returned realpathed)
-					return (strpos($result, $file) === 0) ? true : false;
-				}
-			}
-			else
-			{
-				$handle = @fopen($file, 'r+');
-
-				if (is_resource($handle))
-				{
-					fclose($handle);
-					return true;
-				}
-			}
-		}
-		else
-		{
-			// file does not exist test if we can write to the directory
-			$dir = dirname($file);
-
-			if (file_exists($dir) && is_dir($dir) && phpbb_is_writable($dir))
-			{
-				return true;
-			}
-		}
-
-		return false;
-	}
-	else
-	{
-		return is_writable($file);
-	}
-}
-
-/**
-* Checks if a path ($path) is absolute or relative
-*
-* @param string $path Path to check absoluteness of
-* @return boolean
-*/
-function phpbb_is_absolute($path)
-{
-	return (isset($path[0]) && $path[0] == '/' || preg_match('#^[a-z]:[/\\\]#i', $path)) ? true : false;
-}
-
-/**
-* @author Chris Smith <chris@project-minerva.org>
-* @copyright 2006 Project Minerva Team
-* @param string $path The path which we should attempt to resolve.
-* @return mixed
-*/
-function phpbb_own_realpath($path)
-{
-	global $request;
-
-	// Now to perform funky shizzle
-
-	// Switch to use UNIX slashes
-	$path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
-	$path_prefix = '';
-
-	// Determine what sort of path we have
-	if (phpbb_is_absolute($path))
-	{
-		$absolute = true;
-
-		if ($path[0] == '/')
-		{
-			// Absolute path, *NIX style
-			$path_prefix = '';
-		}
-		else
-		{
-			// Absolute path, Windows style
-			// Remove the drive letter and colon
-			$path_prefix = $path[0] . ':';
-			$path = substr($path, 2);
-		}
-	}
-	else
-	{
-		// Relative Path
-		// Prepend the current working directory
-		if (function_exists('getcwd'))
-		{
-			// This is the best method, hopefully it is enabled!
-			$path = str_replace(DIRECTORY_SEPARATOR, '/', getcwd()) . '/' . $path;
-			$absolute = true;
-			if (preg_match('#^[a-z]:#i', $path))
-			{
-				$path_prefix = $path[0] . ':';
-				$path = substr($path, 2);
-			}
-			else
-			{
-				$path_prefix = '';
-			}
-		}
-		else if ($request->server('SCRIPT_FILENAME'))
-		{
-			// Warning: If chdir() has been used this will lie!
-			// Warning: This has some problems sometime (CLI can create them easily)
-			$filename = htmlspecialchars_decode($request->server('SCRIPT_FILENAME'));
-			$path = str_replace(DIRECTORY_SEPARATOR, '/', dirname($filename)) . '/' . $path;
-			$absolute = true;
-			$path_prefix = '';
-		}
-		else
-		{
-			// We have no way of getting the absolute path, just run on using relative ones.
-			$absolute = false;
-			$path_prefix = '.';
-		}
-	}
-
-	// Remove any repeated slashes
-	$path = preg_replace('#/{2,}#', '/', $path);
-
-	// Remove the slashes from the start and end of the path
-	$path = trim($path, '/');
-
-	// Break the string into little bits for us to nibble on
-	$bits = explode('/', $path);
-
-	// Remove any . in the path, renumber array for the loop below
-	$bits = array_values(array_diff($bits, array('.')));
-
-	// Lets get looping, run over and resolve any .. (up directory)
-	for ($i = 0, $max = sizeof($bits); $i < $max; $i++)
-	{
-		// @todo Optimise
-		if ($bits[$i] == '..' )
-		{
-			if (isset($bits[$i - 1]))
-			{
-				if ($bits[$i - 1] != '..')
-				{
-					// We found a .. and we are able to traverse upwards, lets do it!
-					unset($bits[$i]);
-					unset($bits[$i - 1]);
-					$i -= 2;
-					$max -= 2;
-					$bits = array_values($bits);
-				}
-			}
-			else if ($absolute) // ie. !isset($bits[$i - 1]) && $absolute
-			{
-				// We have an absolute path trying to descend above the root of the filesystem
-				// ... Error!
-				return false;
-			}
-		}
-	}
-
-	// Prepend the path prefix
-	array_unshift($bits, $path_prefix);
-
-	$resolved = '';
-
-	$max = sizeof($bits) - 1;
-
-	// Check if we are able to resolve symlinks, Windows cannot.
-	$symlink_resolve = (function_exists('readlink')) ? true : false;
-
-	foreach ($bits as $i => $bit)
-	{
-		if (@is_dir("$resolved/$bit") || ($i == $max && @is_file("$resolved/$bit")))
-		{
-			// Path Exists
-			if ($symlink_resolve && is_link("$resolved/$bit") && ($link = readlink("$resolved/$bit")))
-			{
-				// Resolved a symlink.
-				$resolved = $link . (($i == $max) ? '' : '/');
-				continue;
-			}
-		}
-		else
-		{
-			// Something doesn't exist here!
-			// This is correct realpath() behaviour but sadly open_basedir and safe_mode make this problematic
-			// return false;
-		}
-		$resolved .= $bit . (($i == $max) ? '' : '/');
-	}
-
-	// @todo If the file exists fine and open_basedir only has one path we should be able to prepend it
-	// because we must be inside that basedir, the question is where...
-	// @internal The slash in is_dir() gets around an open_basedir restriction
-	if (!@file_exists($resolved) || (!@is_dir($resolved . '/') && !is_file($resolved)))
-	{
-		return false;
-	}
-
-	// Put the slashes back to the native operating systems slashes
-	$resolved = str_replace('/', DIRECTORY_SEPARATOR, $resolved);
-
-	// Check for DIRECTORY_SEPARATOR at the end (and remove it!)
-	if (substr($resolved, -1) == DIRECTORY_SEPARATOR)
-	{
-		return substr($resolved, 0, -1);
-	}
-
-	return $resolved; // We got here, in the end!
-}
-
-if (!function_exists('realpath'))
-{
-	/**
-	* A wrapper for realpath
-	* @ignore
-	*/
-	function phpbb_realpath($path)
-	{
-		return phpbb_own_realpath($path);
-	}
-}
-else
-{
-	/**
-	* A wrapper for realpath
-	*/
-	function phpbb_realpath($path)
-	{
-		$realpath = realpath($path);
-
-		// Strangely there are provider not disabling realpath but returning strange values. :o
-		// We at least try to cope with them.
-		if ($realpath === $path || $realpath === false)
-		{
-			return phpbb_own_realpath($path);
-		}
-
-		// Check for DIRECTORY_SEPARATOR at the end (and remove it!)
-		if (substr($realpath, -1) == DIRECTORY_SEPARATOR)
-		{
-			$realpath = substr($realpath, 0, -1);
-		}
-
-		return $realpath;
-	}
-}
-
 // functions used for building option fields
 
 /**
@@ -1192,11 +605,11 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
 		if ($forum_id === false || !sizeof($forum_id))
 		{
 			// Mark all forums read (index page)
-
+			/* @var $phpbb_notifications \phpbb\notification\manager */
 			$phpbb_notifications = $phpbb_container->get('notification_manager');
 
 			// Mark all topic notifications read for this user
-			$phpbb_notifications->mark_notifications_read(array(
+			$phpbb_notifications->mark_notifications(array(
 				'notification.type.topic',
 				'notification.type.quote',
 				'notification.type.bookmark',
@@ -1263,9 +676,10 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
 			$forum_id = array_unique($forum_id);
 		}
 
+		/* @var $phpbb_notifications \phpbb\notification\manager */
 		$phpbb_notifications = $phpbb_container->get('notification_manager');
 
-		$phpbb_notifications->mark_notifications_read_by_parent(array(
+		$phpbb_notifications->mark_notifications_by_parent(array(
 			'notification.type.topic',
 			'notification.type.approve_topic',
 		), $forum_id, $user->data['user_id'], $post_time);
@@ -1282,7 +696,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
 		}
 		$db->sql_freeresult($result);
 
-		$phpbb_notifications->mark_notifications_read_by_parent(array(
+		$phpbb_notifications->mark_notifications_by_parent(array(
 			'notification.type.quote',
 			'notification.type.bookmark',
 			'notification.type.post',
@@ -1385,15 +799,16 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
 			return;
 		}
 
+		/* @var $phpbb_notifications \phpbb\notification\manager */
 		$phpbb_notifications = $phpbb_container->get('notification_manager');
 
 		// Mark post notifications read for this user in this topic
-		$phpbb_notifications->mark_notifications_read(array(
+		$phpbb_notifications->mark_notifications(array(
 			'notification.type.topic',
 			'notification.type.approve_topic',
 		), $topic_id, $user->data['user_id'], $post_time);
 
-		$phpbb_notifications->mark_notifications_read_by_parent(array(
+		$phpbb_notifications->mark_notifications_by_parent(array(
 			'notification.type.quote',
 			'notification.type.bookmark',
 			'notification.type.post',
@@ -1438,7 +853,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
 				$tracking['tf'][$forum_id][$topic_id36] = true;
 			}
 
-			$tracking['t'][$topic_id36] = base_convert($post_time - $config['board_startdate'], 10, 36);
+			$tracking['t'][$topic_id36] = base_convert($post_time - (int) $config['board_startdate'], 10, 36);
 
 			// If the cookie grows larger than 10000 characters we will remove the smallest value
 			// This can result in old topics being unread - but most of the time it should be accurate...
@@ -1525,7 +940,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
 */
 function get_topic_tracking($forum_id, $topic_ids, &$rowset, $forum_mark_time, $global_announce_list = false)
 {
-	global $config, $user;
+	global $user;
 
 	$last_read = array();
 
@@ -1684,7 +1099,7 @@ function get_complete_topic_tracking($forum_id, $topic_ids, $global_announce_lis
 */
 function get_unread_topics($user_id = false, $sql_extra = '', $sql_sort = '', $sql_limit = 1001, $sql_limit_offset = 0)
 {
-	global $config, $db, $user;
+	global $config, $db, $user, $request;
 	global $phpbb_dispatcher;
 
 	$user_id = ($user_id === false) ? (int) $user->data['user_id'] : (int) $user_id;
@@ -1763,7 +1178,7 @@ function get_unread_topics($user_id = false, $sql_extra = '', $sql_sort = '', $s
 
 		if (empty($tracking_topics))
 		{
-			$tracking_topics = request_var($config['cookie_name'] . '_track', '', false, true);
+			$tracking_topics = $request->variable($config['cookie_name'] . '_track', '', false, \phpbb\request\request_interface::COOKIE);
 			$tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();
 		}
 
@@ -1830,7 +1245,7 @@ function get_unread_topics($user_id = false, $sql_extra = '', $sql_sort = '', $s
 */
 function update_forum_tracking_info($forum_id, $forum_last_post_time, $f_mark_time = false, $mark_time_forum = false)
 {
-	global $db, $tracking_topics, $user, $config, $auth, $request, $phpbb_container;
+	global $db, $tracking_topics, $user, $config, $request, $phpbb_container;
 
 	// Determine the users last forum mark time if not given.
 	if ($mark_time_forum === false)
@@ -1855,6 +1270,7 @@ function update_forum_tracking_info($forum_id, $forum_last_post_time, $f_mark_ti
 
 	// Handle update of unapproved topics info.
 	// Only update for moderators having m_approve permission for the forum.
+	/* @var $phpbb_content_visibility \phpbb\content_visibility */
 	$phpbb_content_visibility = $phpbb_container->get('content.visibility');
 
 	// Check the forum for any left unread topics.
@@ -1887,8 +1303,6 @@ function update_forum_tracking_info($forum_id, $forum_last_post_time, $f_mark_ti
 	else if ($config['load_anon_lastread'] || $user->data['is_registered'])
 	{
 		// Get information from cookie
-		$row = false;
-
 		if (!isset($tracking_topics['tf'][$forum_id]))
 		{
 			// We do not need to mark read, this happened before. Therefore setting this to true
@@ -2233,13 +1647,6 @@ function generate_board_url($without_script_path = false)
 	global $config, $user, $request;
 
 	$server_name = $user->host;
-	$server_port = $request->server('SERVER_PORT', 0);
-	$forwarded_proto = $request->server('HTTP_X_FORWARDED_PROTO');
-
-	if (!empty($forwarded_proto) && $forwarded_proto === 'https')
-	{
-		$server_port = 443;
-	}
 
 	// Forcing server vars is the only way to specify/override the protocol
 	if ($config['force_server_vars'] || !$server_name)
@@ -2254,6 +1661,13 @@ function generate_board_url($without_script_path = false)
 	}
 	else
 	{
+		$server_port = $request->server('SERVER_PORT', 0);
+		$forwarded_proto = $request->server('HTTP_X_FORWARDED_PROTO');
+
+		if (!empty($forwarded_proto) && $forwarded_proto === 'https')
+		{
+			$server_port = 443;
+		}
 		// Do not rely on cookie_secure, users seem to think that it means a secured cookie instead of an encrypted connection
 		$cookie_secure = $request->is_secure() ? 1 : 0;
 		$url = (($cookie_secure) ? 'https://' : 'http://') . $server_name;
@@ -2294,11 +1708,9 @@ function generate_board_url($without_script_path = false)
 */
 function redirect($url, $return = false, $disable_cd_check = false)
 {
-	global $db, $cache, $config, $user, $phpbb_root_path, $phpbb_filesystem, $phpbb_path_helper, $phpEx, $phpbb_dispatcher;
-
-	$failover_flag = false;
+	global $user, $phpbb_path_helper, $phpbb_dispatcher;
 
-	if (empty($user->lang))
+	if (!$user->is_setup())
 	{
 		$user->add_lang('common');
 	}
@@ -2311,8 +1723,8 @@ function redirect($url, $return = false, $disable_cd_check = false)
 
 	if ($url_parts === false)
 	{
-		// Malformed url, redirect to current page...
-		$url = generate_board_url() . '/' . $user->page['page'];
+		// Malformed url
+		trigger_error('INSECURE_REDIRECT', E_USER_ERROR);
 	}
 	else if (!empty($url_parts['scheme']) && !empty($url_parts['host']))
 	{
@@ -2609,8 +2021,9 @@ function check_link_hash($token, $link_name)
 /**
 * Add a secret token to the form (requires the S_FORM_TOKEN template variable)
 * @param string  $form_name The name of the form; has to match the name used in check_form_key, otherwise no restrictions apply
+* @param string  $template_variable_suffix A string that is appended to the name of the template variable to which the form elements are assigned
 */
-function add_form_key($form_name)
+function add_form_key($form_name, $template_variable_suffix = '')
 {
 	global $config, $template, $user, $phpbb_dispatcher;
 
@@ -2627,13 +2040,15 @@ function add_form_key($form_name)
 	* Perform additional actions on creation of the form token
 	*
 	* @event core.add_form_key
-	* @var	string	form_name			The form name
-	* @var	int		now					Current time timestamp
-	* @var	string	s_fields			Generated hidden fields
-	* @var	string	token				Form token
-	* @var	string	token_sid			User session ID
+	* @var	string	form_name					The form name
+	* @var	int		now							Current time timestamp
+	* @var	string	s_fields					Generated hidden fields
+	* @var	string	token						Form token
+	* @var	string	token_sid					User session ID
+	* @var	string	template_variable_suffix	The string that is appended to template variable name
 	*
 	* @since 3.1.0-RC3
+	* @changed 3.1.11-RC1 Added template_variable_suffix
 	*/
 	$vars = array(
 		'form_name',
@@ -2641,12 +2056,11 @@ function add_form_key($form_name)
 		's_fields',
 		'token',
 		'token_sid',
+		'template_variable_suffix',
 	);
 	extract($phpbb_dispatcher->trigger_event('core.add_form_key', compact($vars)));
 
-	$template->assign_vars(array(
-		'S_FORM_TOKEN'	=> $s_fields,
-	));
+	$template->assign_var('S_FORM_TOKEN' . $template_variable_suffix, $s_fields);
 }
 
 /**
@@ -2718,9 +2132,9 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
 
 	if ($check && $confirm)
 	{
-		$user_id = request_var('confirm_uid', 0);
-		$session_id = request_var('sess', '');
-		$confirm_key = request_var('confirm_key', '');
+		$user_id = $request->variable('confirm_uid', 0);
+		$session_id = $request->variable('sess', '');
+		$confirm_key = $request->variable('confirm_key', '');
 
 		if ($user_id != $user->data['user_id'] || $session_id != $user->session_id || !$confirm_key || !$user->data['user_last_confirm_key'] || $confirm_key != $user->data['user_last_confirm_key'])
 		{
@@ -2762,7 +2176,7 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
 	);
 
 	// If activation key already exist, we better do not re-use the key (something very strange is going on...)
-	if (request_var('confirm_key', ''))
+	if ($request->variable('confirm_key', ''))
 	{
 		// This should not occur, therefore we cancel the operation to safe the user
 		return false;
@@ -2774,7 +2188,7 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
 	$u_action .= ((strpos($u_action, '?') === false) ? '?' : '&amp;') . 'confirm_key=' . $confirm_key;
 
 	$template->assign_vars(array(
-		'MESSAGE_TITLE'		=> (!isset($user->lang[$title])) ? $user->lang['CONFIRM'] : $user->lang[$title],
+		'MESSAGE_TITLE'		=> (!isset($user->lang[$title])) ? $user->lang['CONFIRM'] : $user->lang($title, 1),
 		'MESSAGE_TEXT'		=> (!isset($user->lang[$title . '_CONFIRM'])) ? $title : $user->lang[$title . '_CONFIRM'],
 
 		'YES_VALUE'			=> $user->lang['YES'],
@@ -2817,13 +2231,13 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
 */
 function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = false, $s_display = true)
 {
-	global $db, $user, $template, $auth, $phpEx, $phpbb_root_path, $config;
-	global $request, $phpbb_container, $phpbb_dispatcher;
+	global $user, $template, $auth, $phpEx, $phpbb_root_path, $config;
+	global $request, $phpbb_container, $phpbb_dispatcher, $phpbb_log;
 
 	$err = '';
 
 	// Make sure user->setup() has been called
-	if (empty($user->lang))
+	if (!$user->is_setup())
 	{
 		$user->setup();
 	}
@@ -2850,8 +2264,9 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
 		// anonymous/inactive users are never able to go to the ACP even if they have the relevant permissions
 		if ($user->data['is_registered'])
 		{
-			add_log('admin', 'LOG_ADMIN_AUTH_FAIL');
+			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ADMIN_AUTH_FAIL');
 		}
+		send_status_line(403, 'Forbidden');
 		trigger_error('NO_AUTH_ADMIN');
 	}
 
@@ -2860,14 +2275,15 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
 		// Get credential
 		if ($admin)
 		{
-			$credential = request_var('credential', '');
+			$credential = $request->variable('credential', '');
 
 			if (strspn($credential, 'abcdef0123456789') !== strlen($credential) || strlen($credential) != 32)
 			{
 				if ($user->data['is_registered'])
 				{
-					add_log('admin', 'LOG_ADMIN_AUTH_FAIL');
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ADMIN_AUTH_FAIL');
 				}
+				send_status_line(403, 'Forbidden');
 				trigger_error('NO_AUTH_ADMIN');
 			}
 
@@ -2878,7 +2294,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
 			$password	= $request->untrimmed_variable('password', '', true);
 		}
 
-		$username	= request_var('username', '', true);
+		$username	= $request->variable('username', '', true);
 		$autologin	= $request->is_set_post('autologin');
 		$viewonline = (int) !$request->is_set_post('viewonline');
 		$admin 		= ($admin) ? 1 : 0;
@@ -2888,7 +2304,9 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
 		if ($admin && utf8_clean_string($username) != utf8_clean_string($user->data['username']))
 		{
 			// We log the attempt to use a different username...
-			add_log('admin', 'LOG_ADMIN_AUTH_FAIL');
+			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ADMIN_AUTH_FAIL');
+
+			send_status_line(403, 'Forbidden');
 			trigger_error('NO_AUTH_ADMIN_USER_DIFFER');
 		}
 
@@ -2901,7 +2319,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
 		{
 			if ($result['status'] == LOGIN_SUCCESS)
 			{
-				add_log('admin', 'LOG_ADMIN_AUTH_SUCCESS');
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ADMIN_AUTH_SUCCESS');
 			}
 			else
 			{
@@ -2909,7 +2327,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
 				// anonymous/inactive users are never able to go to the ACP even if they have the relevant permissions
 				if ($user->data['is_registered'])
 				{
-					add_log('admin', 'LOG_ADMIN_AUTH_FAIL');
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ADMIN_AUTH_FAIL');
 				}
 			}
 		}
@@ -2917,7 +2335,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
 		// The result parameter is always an array, holding the relevant information...
 		if ($result['status'] == LOGIN_SUCCESS)
 		{
-			$redirect = request_var('redirect', "{$phpbb_root_path}index.$phpEx");
+			$redirect = $request->variable('redirect', "{$phpbb_root_path}index.$phpEx");
 
 			/**
 			* This event allows an extension to modify the redirection when a user successfully logs in
@@ -3017,6 +2435,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
 		$s_hidden_fields['credential'] = $credential;
 	}
 
+	/* @var $provider_collection \phpbb\auth\provider_collection */
 	$provider_collection = $phpbb_container->get('auth.provider_collection');
 	$auth_provider = $provider_collection->get_provider();
 
@@ -3120,6 +2539,7 @@ function login_forum_box($forum_data)
 		}
 		$db->sql_freeresult($result);
 
+		/* @var $passwords_manager \phpbb\passwords\manager */
 		$passwords_manager = $phpbb_container->get('passwords.manager');
 
 		if ($passwords_manager->check($password, $forum_data['forum_password']))
@@ -3275,52 +2695,6 @@ function parse_cfg_file($filename, $lines = false)
 	return $parsed_items;
 }
 
-/**
-* Add log entry
-*
-* @param	string	$mode				The mode defines which log_type is used and from which log the entry is retrieved
-* @param	int		$forum_id			Mode 'mod' ONLY: forum id of the related item, NOT INCLUDED otherwise
-* @param	int		$topic_id			Mode 'mod' ONLY: topic id of the related item, NOT INCLUDED otherwise
-* @param	int		$reportee_id		Mode 'user' ONLY: user id of the reportee, NOT INCLUDED otherwise
-* @param	string	$log_operation		Name of the operation
-* @param	array	$additional_data	More arguments can be added, depending on the log_type
-*
-* @return	int|bool		Returns the log_id, if the entry was added to the database, false otherwise.
-*
-* @deprecated	Use $phpbb_log->add() instead
-*/
-function add_log()
-{
-	global $phpbb_log, $user;
-
-	$args = func_get_args();
-	$mode = array_shift($args);
-
-	// This looks kind of dirty, but add_log has some additional data before the log_operation
-	$additional_data = array();
-	switch ($mode)
-	{
-		case 'admin':
-		case 'critical':
-		break;
-		case 'mod':
-			$additional_data['forum_id'] = array_shift($args);
-			$additional_data['topic_id'] = array_shift($args);
-		break;
-		case 'user':
-			$additional_data['reportee_id'] = array_shift($args);
-		break;
-	}
-
-	$log_operation = array_shift($args);
-	$additional_data = array_merge($additional_data, $args);
-
-	$user_id = (empty($user->data)) ? ANONYMOUS : $user->data['user_id'];
-	$user_ip = (empty($user->ip)) ? '' : $user->ip;
-
-	return $phpbb_log->add($mode, $user_id, $user_ip, $log_operation, time(), $additional_data);
-}
-
 /**
 * Return a nicely formatted backtrace.
 *
@@ -3384,6 +2758,7 @@ function get_preg_expression($mode)
 			return array(
 				'#<!\-\- e \-\-><a href="mailto:(.*?)">.*?</a><!\-\- e \-\->#',
 				'#<!\-\- l \-\-><a (?:class="[\w-]+" )?href="(.*?)(?:(&amp;|\?)sid=[0-9a-f]{32})?">.*?</a><!\-\- l \-\->#',
+				'#<!\-\- ([mw]) \-\-><a (?:class="[\w-]+" )?href="http://(.*?)">\2</a><!\-\- \1 \-\->#',
 				'#<!\-\- ([mw]) \-\-><a (?:class="[\w-]+" )?href="(.*?)">.*?</a><!\-\- \1 \-\->#',
 				'#<!\-\- s(.*?) \-\-><img src="\{SMILIES_PATH\}\/.*? \/><!\-\- s\1 \-\->#',
 				'#<!\-\- .*? \-\->#s',
@@ -3450,31 +2825,19 @@ function get_preg_expression($mode)
 * Depends on whether installed PHP version supports unicode properties
 *
 * @param string	$word			word template to be replaced
-* @param bool	$use_unicode	whether or not to take advantage of PCRE supporting unicode
 *
 * @return string $preg_expr		regex to use with word censor
 */
-function get_censor_preg_expression($word, $use_unicode = true)
+function get_censor_preg_expression($word)
 {
 	// Unescape the asterisk to simplify further conversions
 	$word = str_replace('\*', '*', preg_quote($word, '#'));
 
-	if ($use_unicode && phpbb_pcre_utf8_support())
-	{
-		// Replace asterisk(s) inside the pattern, at the start and at the end of it with regexes
-		$word = preg_replace(array('#(?<=[\p{Nd}\p{L}_])\*+(?=[\p{Nd}\p{L}_])#iu', '#^\*+#', '#\*+$#'), array('([\x20]*?|[\p{Nd}\p{L}_-]*?)', '[\p{Nd}\p{L}_-]*?', '[\p{Nd}\p{L}_-]*?'), $word);
-
-		// Generate the final substitution
-		$preg_expr = '#(?<![\p{Nd}\p{L}_-])(' . $word . ')(?![\p{Nd}\p{L}_-])#iu';
-	}
-	else
-	{
-		// Replace the asterisk inside the pattern, at the start and at the end of it with regexes
-		$word = preg_replace(array('#(?<=\S)\*+(?=\S)#iu', '#^\*+#', '#\*+$#'), array('(\x20*?\S*?)', '\S*?', '\S*?'), $word);
+	// Replace asterisk(s) inside the pattern, at the start and at the end of it with regexes
+	$word = preg_replace(array('#(?<=[\p{Nd}\p{L}_])\*+(?=[\p{Nd}\p{L}_])#iu', '#^\*+#', '#\*+$#'), array('([\x20]*?|[\p{Nd}\p{L}_-]*?)', '[\p{Nd}\p{L}_-]*?', '[\p{Nd}\p{L}_-]*?'), $word);
 
-		// Generate the final substitution
-		$preg_expr = '#(?<!\S)(' . $word . ')(?!\S)#iu';
-	}
+	// Generate the final substitution
+	$preg_expr = '#(?<![\p{Nd}\p{L}_-])(' . $word . ')(?![\p{Nd}\p{L}_-])#iu';
 
 	return $preg_expr;
 }
@@ -3722,38 +3085,12 @@ function phpbb_checkdnsrr($host, $type = 'MX')
 		return (@gethostbyname($host_fqdn) == $host_fqdn) ? false : true;
 	}
 
-	// checkdnsrr() is available on Windows since PHP 5.3,
-	// but until 5.3.3 it only works for MX records
-	// See: http://bugs.php.net/bug.php?id=51844
-
-	// Call checkdnsrr() if
-	// we're looking for an MX record or
-	// we're not on Windows or
-	// we're running a PHP version where #51844 has been fixed
-
-	// checkdnsrr() supports AAAA since 5.0.0
-	// checkdnsrr() supports TXT since 5.2.4
-	if (
-		($type == 'MX' || DIRECTORY_SEPARATOR != '\\' || version_compare(PHP_VERSION, '5.3.3', '>=')) &&
-		($type != 'AAAA' || version_compare(PHP_VERSION, '5.0.0', '>=')) &&
-		($type != 'TXT' || version_compare(PHP_VERSION, '5.2.4', '>=')) &&
-		function_exists('checkdnsrr')
-	)
+	if (function_exists('checkdnsrr'))
 	{
 		return checkdnsrr($host_fqdn, $type);
 	}
 
-	// dns_get_record() is available since PHP 5; since PHP 5.3 also on Windows,
-	// but on Windows it does not work reliable for AAAA records before PHP 5.3.1
-
-	// Call dns_get_record() if
-	// we're not looking for an AAAA record or
-	// we're not on Windows or
-	// we're running a PHP version where AAAA lookups work reliable
-	if (
-		($type != 'AAAA' || DIRECTORY_SEPARATOR != '\\' || version_compare(PHP_VERSION, '5.3.1', '>=')) &&
-		function_exists('dns_get_record')
-	)
+	if (function_exists('dns_get_record'))
 	{
 		// dns_get_record() expects an integer as second parameter
 		// We have to convert the string $type to the corresponding integer constant.
@@ -3886,7 +3223,7 @@ function phpbb_checkdnsrr($host, $type = 'MX')
 function msg_handler($errno, $msg_text, $errfile, $errline)
 {
 	global $cache, $db, $auth, $template, $config, $user, $request;
-	global $phpEx, $phpbb_root_path, $msg_title, $msg_long_text;
+	global $phpbb_root_path, $msg_title, $msg_long_text, $phpbb_log;
 
 	// Do not display notices if we suppress them via @
 	if (error_reporting() == 0 && $errno != E_USER_ERROR && $errno != E_USER_WARNING && $errno != E_USER_NOTICE)
@@ -3900,11 +3237,6 @@ function msg_handler($errno, $msg_text, $errfile, $errline)
 		$msg_text = $msg_long_text;
 	}
 
-	if (!defined('E_DEPRECATED'))
-	{
-		define('E_DEPRECATED', 8192);
-	}
-
 	switch ($errno)
 	{
 		case E_NOTICE:
@@ -3927,7 +3259,7 @@ function msg_handler($errno, $msg_text, $errfile, $errline)
 				// we are writing an image - the user won't see the debug, so let's place it in the log
 				if (defined('IMAGE_OUTPUT') || defined('IN_CRON'))
 				{
-					add_log('critical', 'LOG_IMAGE_GENERATION_ERROR', $errfile, $errline, $msg_text);
+					$phpbb_log->add('critical', $user->data['user_id'], $user->ip, 'LOG_IMAGE_GENERATION_ERROR', false, array($errfile, $errline, $msg_text));
 				}
 				// echo '<br /><br />BACKTRACE<br />' . get_backtrace() . '<br />' . "\n";
 			}
@@ -3938,7 +3270,7 @@ function msg_handler($errno, $msg_text, $errfile, $errline)
 
 		case E_USER_ERROR:
 
-			if (!empty($user) && !empty($user->lang))
+			if (!empty($user) && $user->is_setup())
 			{
 				$msg_text = (!empty($user->lang[$msg_text])) ? $user->lang[$msg_text] : $msg_text;
 				$msg_title = (!isset($msg_title)) ? $user->lang['GENERAL_ERROR'] : ((!empty($user->lang[$msg_title])) ? $user->lang[$msg_title] : $msg_title);
@@ -3989,7 +3321,7 @@ function msg_handler($errno, $msg_text, $errfile, $errline)
 			{
 				// let's avoid loops
 				$db->sql_return_on_error(true);
-				add_log('critical', 'LOG_GENERAL_ERROR', $msg_title, $log_text);
+				$phpbb_log->add('critical', $user->data['user_id'], $user->ip, 'LOG_GENERAL_ERROR', false, array($msg_title, $log_text));
 				$db->sql_return_on_error(false);
 			}
 
@@ -4059,7 +3391,7 @@ function msg_handler($errno, $msg_text, $errfile, $errline)
 			// We re-init the auth array to get correct results on login/logout
 			$auth->acl($user->data);
 
-			if (empty($user->lang))
+			if (!$user->is_setup())
 			{
 				$user->setup();
 			}
@@ -4148,11 +3480,21 @@ function msg_handler($errno, $msg_text, $errfile, $errline)
 */
 function phpbb_filter_root_path($errfile)
 {
+	global $phpbb_filesystem;
+
 	static $root_path;
 
 	if (empty($root_path))
 	{
-		$root_path = phpbb_realpath(dirname(__FILE__) . '/../');
+		if ($phpbb_filesystem)
+		{
+			$root_path = $phpbb_filesystem->realpath(dirname(__FILE__) . '/../');
+		}
+		else
+		{
+			$filesystem = new \phpbb\filesystem\filesystem();
+			$root_path = $filesystem->realpath(dirname(__FILE__) . '/../');
+		}
 	}
 
 	return str_replace(array($root_path, '\\'), array('[ROOT]', '/'), $errfile);
@@ -4180,7 +3522,7 @@ function obtain_guest_count($item_id = 0, $item = 'forum')
 
 	// Get number of online guests
 
-	if ($db->get_sql_layer() === 'sqlite' || $db->get_sql_layer() === 'sqlite3')
+	if ($db->get_sql_layer() === 'sqlite3')
 	{
 		$sql = 'SELECT COUNT(session_ip) as num_guests
 			FROM (
@@ -4214,7 +3556,7 @@ function obtain_guest_count($item_id = 0, $item = 'forum')
 */
 function obtain_users_online($item_id = 0, $item = 'forum')
 {
-	global $db, $config, $user;
+	global $db, $config;
 
 	$reading_sql = '';
 	if ($item_id !== 0)
@@ -4280,7 +3622,6 @@ function obtain_users_online_string($online_users, $item_id = 0, $item = 'forum'
 {
 	global $config, $db, $user, $auth, $phpbb_dispatcher;
 
-	$guests_online = $hidden_online = $l_online_users = $online_userlist = $visible_online = '';
 	$user_online_link = $rowset = array();
 	// Need caps version of $item for language-strings
 	$item_caps = strtoupper($item);
@@ -4459,178 +3800,6 @@ function phpbb_optionset($bit, $set, $data)
 	return $data;
 }
 
-/**
-* Determine which plural form we should use.
-* For some languages this is not as simple as for English.
-*
-* @param $rule		int			ID of the plural rule we want to use, see http://wiki.phpbb.com/Plural_Rules#Plural_Rules
-* @param $number	int|float	The number we want to get the plural case for. Float numbers are floored.
-* @return	int		The plural-case we need to use for the number plural-rule combination
-*/
-function phpbb_get_plural_form($rule, $number)
-{
-	$number = (int) $number;
-
-	if ($rule > 15 || $rule < 0)
-	{
-		trigger_error('INVALID_PLURAL_RULE');
-	}
-
-	/**
-	* The following plural rules are based on a list published by the Mozilla Developer Network
-	* https://developer.mozilla.org/en/Localization_and_Plurals
-	*/
-	switch ($rule)
-	{
-		case 0:
-			/**
-			* Families: Asian (Chinese, Japanese, Korean, Vietnamese), Persian, Turkic/Altaic (Turkish), Thai, Lao
-			* 1 - everything: 0, 1, 2, ...
-			*/
-			return 1;
-
-		case 1:
-			/**
-			* Families: Germanic (Danish, Dutch, English, Faroese, Frisian, German, Norwegian, Swedish), Finno-Ugric (Estonian, Finnish, Hungarian), Language isolate (Basque), Latin/Greek (Greek), Semitic (Hebrew), Romanic (Italian, Portuguese, Spanish, Catalan)
-			* 1 - 1
-			* 2 - everything else: 0, 2, 3, ...
-			*/
-			return ($number == 1) ? 1 : 2;
-
-		case 2:
-			/**
-			* Families: Romanic (French, Brazilian Portuguese)
-			* 1 - 0, 1
-			* 2 - everything else: 2, 3, ...
-			*/
-			return (($number == 0) || ($number == 1)) ? 1 : 2;
-
-		case 3:
-			/**
-			* Families: Baltic (Latvian)
-			* 1 - 0
-			* 2 - ends in 1, not 11: 1, 21, ... 101, 121, ...
-			* 3 - everything else: 2, 3, ... 10, 11, 12, ... 20, 22, ...
-			*/
-			return ($number == 0) ? 1 : ((($number % 10 == 1) && ($number % 100 != 11)) ? 2 : 3);
-
-		case 4:
-			/**
-			* Families: Celtic (Scottish Gaelic)
-			* 1 - is 1 or 11: 1, 11
-			* 2 - is 2 or 12: 2, 12
-			* 3 - others between 3 and 19: 3, 4, ... 10, 13, ... 18, 19
-			* 4 - everything else: 0, 20, 21, ...
-			*/
-			return ($number == 1 || $number == 11) ? 1 : (($number == 2 || $number == 12) ? 2 : (($number >= 3 && $number <= 19) ? 3 : 4));
-
-		case 5:
-			/**
-			* Families: Romanic (Romanian)
-			* 1 - 1
-			* 2 - is 0 or ends in 01-19: 0, 2, 3, ... 19, 101, 102, ... 119, 201, ...
-			* 3 - everything else: 20, 21, ...
-			*/
-			return ($number == 1) ? 1 : ((($number == 0) || (($number % 100 > 0) && ($number % 100 < 20))) ? 2 : 3);
-
-		case 6:
-			/**
-			* Families: Baltic (Lithuanian)
-			* 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, ...
-			* 2 - ends in 0 or ends in 10-20: 0, 10, 11, 12, ... 19, 20, 30, 40, ...
-			* 3 - everything else: 2, 3, ... 8, 9, 22, 23, ... 29, 32, 33, ...
-			*/
-			return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : ((($number % 10 < 2) || (($number % 100 >= 10) && ($number % 100 < 20))) ? 2 : 3);
-
-		case 7:
-			/**
-			* Families: Slavic (Croatian, Serbian, Russian, Ukrainian)
-			* 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, ...
-			* 2 - ends in 2-4, not 12-14: 2, 3, 4, 22, 23, 24, 32, ...
-			* 3 - everything else: 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, ...
-			*/
-			return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 2 : 3);
-
-		case 8:
-			/**
-			* Families: Slavic (Slovak, Czech)
-			* 1 - 1
-			* 2 - 2, 3, 4
-			* 3 - everything else: 0, 5, 6, 7, ...
-			*/
-			return ($number == 1) ? 1 : ((($number >= 2) && ($number <= 4)) ? 2 : 3);
-
-		case 9:
-			/**
-			* Families: Slavic (Polish)
-			* 1 - 1
-			* 2 - ends in 2-4, not 12-14: 2, 3, 4, 22, 23, 24, 32, ... 104, 122, ...
-			* 3 - everything else: 0, 5, 6, ... 11, 12, 13, 14, 15, ... 20, 21, 25, ...
-			*/
-			return ($number == 1) ? 1 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 2 : 3);
-
-		case 10:
-			/**
-			* Families: Slavic (Slovenian, Sorbian)
-			* 1 - ends in 01: 1, 101, 201, ...
-			* 2 - ends in 02: 2, 102, 202, ...
-			* 3 - ends in 03-04: 3, 4, 103, 104, 203, 204, ...
-			* 4 - everything else: 0, 5, 6, 7, 8, 9, 10, 11, ...
-			*/
-			return ($number % 100 == 1) ? 1 : (($number % 100 == 2) ? 2 : ((($number % 100 == 3) || ($number % 100 == 4)) ? 3 : 4));
-
-		case 11:
-			/**
-			* Families: Celtic (Irish Gaeilge)
-			* 1 - 1
-			* 2 - 2
-			* 3 - is 3-6: 3, 4, 5, 6
-			* 4 - is 7-10: 7, 8, 9, 10
-			* 5 - everything else: 0, 11, 12, ...
-			*/
-			return ($number == 1) ? 1 : (($number == 2) ? 2 : (($number >= 3 && $number <= 6) ? 3 : (($number >= 7 && $number <= 10) ? 4 : 5)));
-
-		case 12:
-			/**
-			* Families: Semitic (Arabic)
-			* 1 - 1
-			* 2 - 2
-			* 3 - ends in 03-10: 3, 4, ... 10, 103, 104, ... 110, 203, 204, ...
-			* 4 - ends in 11-99: 11, ... 99, 111, 112, ...
-			* 5 - everything else: 100, 101, 102, 200, 201, 202, ...
-			* 6 - 0
-			*/
-			return ($number == 1) ? 1 : (($number == 2) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : (($number != 0) ? 5 : 6))));
-
-		case 13:
-			/**
-			* Families: Semitic (Maltese)
-			* 1 - 1
-			* 2 - is 0 or ends in 01-10: 0, 2, 3, ... 9, 10, 101, 102, ...
-			* 3 - ends in 11-19: 11, 12, ... 18, 19, 111, 112, ...
-			* 4 - everything else: 20, 21, ...
-			*/
-			return ($number == 1) ? 1 : ((($number == 0) || (($number % 100 > 1) && ($number % 100 < 11))) ? 2 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 3 : 4));
-
-		case 14:
-			/**
-			* Families: Slavic (Macedonian)
-			* 1 - ends in 1: 1, 11, 21, ...
-			* 2 - ends in 2: 2, 12, 22, ...
-			* 3 - everything else: 0, 3, 4, ... 10, 13, 14, ... 20, 23, ...
-			*/
-			return ($number % 10 == 1) ? 1 : (($number % 10 == 2) ? 2 : 3);
-
-		case 15:
-			/**
-			* Families: Icelandic
-			* 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, 131, ...
-			* 2 - everything else: 0, 2, 3, ... 10, 11, 12, ... 20, 22, ...
-			*/
-			return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : 2;
-	}
-}
-
 /**
 * Login using http authenticate.
 *
@@ -4873,8 +4042,7 @@ function phpbb_get_group_avatar($user_row, $alt = 'GROUP_AVATAR', $ignore_config
 */
 function phpbb_get_avatar($row, $alt, $ignore_config = false, $lazy = false)
 {
-	global $user, $config, $cache, $phpbb_root_path, $phpEx;
-	global $request;
+	global $user, $config;
 	global $phpbb_container, $phpbb_dispatcher;
 
 	if (!$config['allow_avatar'] && !$ignore_config)
@@ -4888,6 +4056,7 @@ function phpbb_get_avatar($row, $alt, $ignore_config = false, $lazy = false)
 		'height' => $row['avatar_height'],
 	);
 
+	/* @var $phpbb_avatar_manager \phpbb\avatar\manager */
 	$phpbb_avatar_manager = $phpbb_container->get('avatar.manager');
 	$driver = $phpbb_avatar_manager->get_driver($row['avatar_type'], !$ignore_config);
 	$html = '';
@@ -5053,8 +4222,8 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
 
 		if ($total_online_users > $config['record_online_users'])
 		{
-			set_config('record_online_users', $total_online_users, true);
-			set_config('record_online_date', time(), true);
+			$config->set('record_online_users', $total_online_users, false);
+			$config->set('record_online_date', time(), false);
 		}
 
 		$l_online_record = $user->lang('RECORD_ONLINE_USERS', (int) $config['record_online_users'], $user->format_date($config['record_online_date'], false, true));
@@ -5089,8 +4258,8 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
 		}
 	}
 
-	$forum_id = request_var('f', 0);
-	$topic_id = request_var('t', 0);
+	$forum_id = $request->variable('f', 0);
+	$topic_id = $request->variable('t', 0);
 
 	$s_feed_news = false;
 
@@ -5110,6 +4279,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
 	// This path is sent with the base template paths in the assign_vars()
 	// call below. We need to correct it in case we are accessing from a
 	// controller because the web paths will be incorrect otherwise.
+	/* @var $phpbb_path_helper \phpbb\path_helper */
 	$phpbb_path_helper = $phpbb_container->get('path_helper');
 	$corrected_path = $phpbb_path_helper->get_web_root_path();
 	$web_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? $board_url : $corrected_path;
@@ -5146,11 +4316,12 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
 
 	// Output the notifications
 	$notifications = false;
-	if ($config['load_notifications'] && $user->data['user_id'] != ANONYMOUS && $user->data['user_type'] != USER_IGNORE)
+	if ($config['load_notifications'] && $config['allow_board_notifications'] && $user->data['user_id'] != ANONYMOUS && $user->data['user_type'] != USER_IGNORE)
 	{
+		/* @var $phpbb_notifications \phpbb\notification\manager */
 		$phpbb_notifications = $phpbb_container->get('notification_manager');
 
-		$notifications = $phpbb_notifications->load_notifications(array(
+		$notifications = $phpbb_notifications->load_notifications('notification.method.board', array(
 			'all_unread'	=> true,
 			'limit'			=> 5,
 		));
@@ -5161,6 +4332,8 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
 		}
 	}
 
+	/** @var \phpbb\controller\helper $controller_helper */
+	$controller_helper = $phpbb_container->get('controller.helper');
 	$notification_mark_hash = generate_link_hash('mark_all_notifications_read');
 
 	// The following assigns all _common_ variables that may be used at any point in a template.
@@ -5185,7 +4358,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
 		'U_VIEW_ALL_NOTIFICATIONS'		=> append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=ucp_notifications'),
 		'U_MARK_ALL_NOTIFICATIONS'		=> append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=ucp_notifications&amp;mode=notification_list&amp;mark=all&amp;token=' . $notification_mark_hash),
 		'U_NOTIFICATION_SETTINGS'		=> append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=ucp_notifications&amp;mode=notification_options'),
-		'S_NOTIFICATIONS_DISPLAY'		=> $config['load_notifications'],
+		'S_NOTIFICATIONS_DISPLAY'		=> $config['load_notifications'] && $config['allow_board_notifications'],
 
 		'S_USER_NEW_PRIVMSG'			=> $user->data['user_new_privmsg'],
 		'S_USER_UNREAD_PRIVMSG'			=> $user->data['user_unread_privmsg'],
@@ -5214,7 +4387,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
 		'U_PROFILE'				=> append_sid("{$phpbb_root_path}ucp.$phpEx"),
 		'U_USER_PROFILE'		=> get_username_string('profile', $user->data['user_id'], $user->data['username'], $user->data['user_colour']),
 		'U_MODCP'				=> append_sid("{$phpbb_root_path}mcp.$phpEx", false, true, $user->session_id),
-		'U_FAQ'					=> append_sid("{$phpbb_root_path}faq.$phpEx"),
+		'U_FAQ'					=> $controller_helper->route('phpbb_help_faq_controller'),
 		'U_SEARCH_SELF'			=> append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=egosearch'),
 		'U_SEARCH_NEW'			=> append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=newposts'),
 		'U_SEARCH_UNANSWERED'	=> append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=unanswered'),
@@ -5226,7 +4399,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
 		'U_TERMS_USE'			=> append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=terms'),
 		'U_PRIVACY'				=> append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=privacy'),
 		'U_RESTORE_PERMISSIONS'	=> ($user->data['user_perm_from'] && $auth->acl_get('a_switchperm')) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=restore_perm') : '',
-		'U_FEED'				=> generate_board_url() . "/feed.$phpEx",
+		'U_FEED'				=> $controller_helper->route('phpbb_feed_index'),
 
 		'S_USER_LOGGED_IN'		=> ($user->data['user_id'] != ANONYMOUS) ? true : false,
 		'S_AUTOLOGIN_ENABLED'	=> ($config['allow_autologin']) ? true : false,
@@ -5277,9 +4450,11 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
 		'T_RANKS_PATH'			=> "{$web_path}{$config['ranks_path']}/",
 		'T_UPLOAD_PATH'			=> "{$web_path}{$config['upload_path']}/",
 		'T_STYLESHEET_LINK'		=> "{$web_path}styles/" . rawurlencode($user->style['style_path']) . '/theme/stylesheet.css?assets_version=' . $config['assets_version'],
-		'T_STYLESHEET_LANG_LINK'    => "{$web_path}styles/" . rawurlencode($user->style['style_path']) . '/theme/' . $user->lang_name . '/stylesheet.css?assets_version=' . $config['assets_version'],
+		'T_STYLESHEET_LANG_LINK'=> "{$web_path}styles/" . rawurlencode($user->style['style_path']) . '/theme/' . $user->lang_name . '/stylesheet.css?assets_version=' . $config['assets_version'],
+		'T_FONT_AWESOME_LINK'	=> !empty($config['allow_cdn']) && !empty($config['load_font_awesome_url']) ? $config['load_font_awesome_url'] : "{$web_path}assets/css/font-awesome.min.css?assets_version=" . $config['assets_version'],
 		'T_JQUERY_LINK'			=> !empty($config['allow_cdn']) && !empty($config['load_jquery_url']) ? $config['load_jquery_url'] : "{$web_path}assets/javascript/jquery.min.js?assets_version=" . $config['assets_version'],
 		'S_ALLOW_CDN'			=> !empty($config['allow_cdn']),
+		'S_COOKIE_NOTICE'		=> !empty($config['cookie_notice']),
 
 		'T_THEME_NAME'			=> rawurlencode($user->style['style_path']),
 		'T_THEME_LANG_NAME'		=> $user->data['user_lang'],
@@ -5374,10 +4549,10 @@ function phpbb_generate_debug_output(\phpbb\db\driver\driver_interface $db, \php
 		if (isset($GLOBALS['starttime']))
 		{
 			$totaltime = microtime(true) - $GLOBALS['starttime'];
-			$debug_info[] = sprintf('<abbr title="SQL time: %.3fs / PHP time: %.3fs">Time: %.3fs</abbr>', $db->get_sql_time(), ($totaltime - $db->get_sql_time()), $totaltime);
+			$debug_info[] = sprintf('<span title="SQL time: %.3fs / PHP time: %.3fs">Time: %.3fs</span>', $db->get_sql_time(), ($totaltime - $db->get_sql_time()), $totaltime);
 		}
 
-		$debug_info[] = sprintf('<abbr title="Cached: %d">Queries: %d</abbr>', $db->sql_num_queries(true), $db->sql_num_queries());
+		$debug_info[] = sprintf('<span title="Cached: %d">Queries: %d</span>', $db->sql_num_queries(true), $db->sql_num_queries());
 
 		$memory_usage = memory_get_peak_usage();
 		if ($memory_usage)
@@ -5426,7 +4601,7 @@ function phpbb_generate_debug_output(\phpbb\db\driver\driver_interface $db, \php
 */
 function page_footer($run_cron = true, $display_template = true, $exit_handler = true)
 {
-	global $db, $config, $template, $user, $auth, $cache, $starttime, $phpbb_root_path, $phpEx;
+	global $db, $config, $template, $user, $auth, $cache, $phpEx;
 	global $request, $phpbb_dispatcher, $phpbb_admin_path;
 
 	// A listener can set this variable to `true` when it overrides this function
@@ -5483,6 +4658,8 @@ function page_footer($run_cron = true, $display_template = true, $exit_handler =
 	if ($call_cron)
 	{
 		global $phpbb_container;
+
+		/* @var $cron \phpbb\cron\manager */
 		$cron = $phpbb_container->get('cron.manager');
 		$task = $cron->find_one_ready_task();
 
@@ -5563,7 +4740,7 @@ function garbage_collection()
 */
 function exit_handler()
 {
-	global $phpbb_hook, $config;
+	global $phpbb_hook;
 
 	if (!empty($phpbb_hook) && $phpbb_hook->call_hook(__FUNCTION__))
 	{
@@ -5598,22 +4775,6 @@ function phpbb_user_session_handler()
 	return;
 }
 
-/**
-* Check if PCRE has UTF-8 support
-* PHP may not be linked with the bundled PCRE lib and instead with an older version
-*
-* @return bool	Returns true if PCRE (the regular expressions library) supports UTF-8 encoding
-*/
-function phpbb_pcre_utf8_support()
-{
-	static $utf8_pcre_properties = null;
-	if (is_null($utf8_pcre_properties))
-	{
-		$utf8_pcre_properties = (@preg_match('/\p{L}/u', 'a') !== false);
-	}
-	return $utf8_pcre_properties;
-}
-
 /**
 * Casts a numeric string $input to an appropriate numeric type (i.e. integer or float)
 *
--- a/includes/functions_acp.php
+++ b/includes/functions_acp.php
@@ -24,9 +24,9 @@ if (!defined('IN_PHPBB'))
 */
 function adm_page_header($page_title)
 {
-	global $config, $db, $user, $template;
+	global $config, $user, $template;
 	global $phpbb_root_path, $phpbb_admin_path, $phpEx, $SID, $_SID;
-	global $phpbb_dispatcher;
+	global $phpbb_dispatcher, $phpbb_container;
 
 	if (defined('HEADER_INC'))
 	{
@@ -88,6 +88,7 @@ function adm_page_header($page_title)
 		'T_ICONS_PATH'			=> "{$phpbb_root_path}{$config['icons_path']}/",
 		'T_RANKS_PATH'			=> "{$phpbb_root_path}{$config['ranks_path']}/",
 		'T_UPLOAD_PATH'			=> "{$phpbb_root_path}{$config['upload_path']}/",
+		'T_FONT_AWESOME_LINK'	=> !empty($config['allow_cdn']) && !empty($config['load_font_awesome_url']) ? $config['load_font_awesome_url'] : "{$phpbb_root_path}assets/css/font-awesome.min.css?assets_version=" . $config['assets_version'],
 
 		'T_ASSETS_VERSION'		=> $config['assets_version'],
 
@@ -107,6 +108,8 @@ function adm_page_header($page_title)
 		'S_CONTENT_ENCODING'	=> 'UTF-8',
 		'S_CONTENT_FLOW_BEGIN'	=> ($user->lang['DIRECTION'] == 'ltr') ? 'left' : 'right',
 		'S_CONTENT_FLOW_END'	=> ($user->lang['DIRECTION'] == 'ltr') ? 'right' : 'left',
+
+		'CONTAINER_EXCEPTION'	=> $phpbb_container->hasParameter('container_exception') ? $phpbb_container->getParameter('container_exception') : false,
 	));
 
 	// An array of http headers that phpbb will set. The following event may override these.
@@ -142,8 +145,8 @@ function adm_page_header($page_title)
 */
 function adm_page_footer($copyright_html = true)
 {
-	global $db, $config, $template, $user, $auth, $cache;
-	global $starttime, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+	global $db, $config, $template, $user, $auth;
+	global $phpbb_root_path;
 	global $request, $phpbb_dispatcher;
 
 	// A listener can set this variable to `true` when it overrides this function
@@ -232,7 +235,7 @@ function h_radio($name, $input_ary, $input_default = false, $id = false, $key =
 /**
 * Build configuration template for acp configuration pages
 */
-function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)
+function build_cfg_template($tpl_type, $key, &$new_ary, $config_key, $vars)
 {
 	global $user, $module, $phpbb_dispatcher;
 
@@ -240,18 +243,18 @@ function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)
 	$name = 'config[' . $config_key . ']';
 
 	// Make sure there is no notice printed out for non-existent config options (we simply set them)
-	if (!isset($new[$config_key]))
+	if (!isset($new_ary[$config_key]))
 	{
-		$new[$config_key] = '';
+		$new_ary[$config_key] = '';
 	}
 
 	switch ($tpl_type[0])
 	{
 		case 'password':
-			if ($new[$config_key] !== '')
+			if ($new_ary[$config_key] !== '')
 			{
 				// replace passwords with asterixes
-				$new[$config_key] = '********';
+				$new_ary[$config_key] = '********';
 			}
 		case 'text':
 		case 'url':
@@ -263,7 +266,7 @@ function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)
 			$size = (int) $tpl_type[1];
 			$maxlength = (int) $tpl_type[2];
 
-			$tpl = '<input id="' . $key . '" type="' . $tpl_type[0] . '"' . (($size) ? ' size="' . $size . '"' : '') . ' maxlength="' . (($maxlength) ? $maxlength : 255) . '" name="' . $name . '" value="' . $new[$config_key] . '"' . (($tpl_type[0] === 'password') ?  ' autocomplete="off"' : '') . ' />';
+			$tpl = '<input id="' . $key . '" type="' . $tpl_type[0] . '"' . (($size) ? ' size="' . $size . '"' : '') . ' maxlength="' . (($maxlength) ? $maxlength : 255) . '" name="' . $name . '" value="' . $new_ary[$config_key] . '"' . (($tpl_type[0] === 'password') ?  ' autocomplete="off"' : '') . ' />';
 		break;
 
 		case 'color':
@@ -271,7 +274,7 @@ function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)
 		case 'datetime-local':
 		case 'month':
 		case 'week':
-			$tpl = '<input id="' . $key . '" type="' . $tpl_type[0] . '" name="' . $name . '" value="' . $new[$config_key] . '" />';
+			$tpl = '<input id="' . $key . '" type="' . $tpl_type[0] . '" name="' . $name . '" value="' . $new_ary[$config_key] . '" />';
 		break;
 
 		case 'date':
@@ -285,7 +288,7 @@ function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)
 				$max = (int) $tpl_type[2];
 			}
 
-			$tpl = '<input id="' . $key . '" type="' . $tpl_type[0] . '"' . (( $min != '' ) ? ' min="' . $min . '"' : '') . (( $max != '' ) ? ' max="' . $max . '"' : '') . ' name="' . $name . '" value="' . $new[$config_key] . '" />';
+			$tpl = '<input id="' . $key . '" type="' . $tpl_type[0] . '"' . (( $min != '' ) ? ' min="' . $min . '"' : '') . (( $max != '' ) ? ' max="' . $max . '"' : '') . ' name="' . $name . '" value="' . $new_ary[$config_key] . '" />';
 		break;
 
 		case 'dimension':
@@ -298,19 +301,19 @@ function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)
 				$max = (int) $tpl_type[2];
 			}
 
-			$tpl = '<input id="' . $key . '" type="number"' . (( $min !== '' ) ? ' min="' . $min . '"' : '') . (( $max != '' ) ? ' max="' . $max . '"' : '') . ' name="config[' . $config_key . '_width]" value="' . $new[$config_key . '_width'] . '" /> x <input type="number"' . (( $min !== '' ) ? ' min="' . $min . '"' : '') . (( $max != '' ) ? ' max="' . $max . '"' : '') . ' name="config[' . $config_key . '_height]" value="' . $new[$config_key . '_height'] . '" />';
+			$tpl = '<input id="' . $key . '" type="number"' . (( $min !== '' ) ? ' min="' . $min . '"' : '') . (( $max != '' ) ? ' max="' . $max . '"' : '') . ' name="config[' . $config_key . '_width]" value="' . $new_ary[$config_key . '_width'] . '" /> x <input type="number"' . (( $min !== '' ) ? ' min="' . $min . '"' : '') . (( $max != '' ) ? ' max="' . $max . '"' : '') . ' name="config[' . $config_key . '_height]" value="' . $new_ary[$config_key . '_height'] . '" />';
 		break;
 
 		case 'textarea':
 			$rows = (int) $tpl_type[1];
 			$cols = (int) $tpl_type[2];
 
-			$tpl = '<textarea id="' . $key . '" name="' . $name . '" rows="' . $rows . '" cols="' . $cols . '">' . $new[$config_key] . '</textarea>';
+			$tpl = '<textarea id="' . $key . '" name="' . $name . '" rows="' . $rows . '" cols="' . $cols . '">' . $new_ary[$config_key] . '</textarea>';
 		break;
 
 		case 'radio':
-			$key_yes	= ($new[$config_key]) ? ' checked="checked"' : '';
-			$key_no		= (!$new[$config_key]) ? ' checked="checked"' : '';
+			$key_yes	= ($new_ary[$config_key]) ? ' checked="checked"' : '';
+			$key_no		= (!$new_ary[$config_key]) ? ' checked="checked"' : '';
 
 			$tpl_type_cond = explode('_', $tpl_type[1]);
 			$type_no = ($tpl_type_cond[0] == 'disabled' || $tpl_type_cond[0] == 'enabled') ? false : true;
@@ -324,8 +327,6 @@ function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)
 		case 'select':
 		case 'custom':
 
-			$return = '';
-
 			if (isset($vars['method']))
 			{
 				$call = array($module->module, $vars['method']);
@@ -347,7 +348,7 @@ function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)
 					switch ($value)
 					{
 						case '{CONFIG_VALUE}':
-							$value = $new[$config_key];
+							$value = $new_ary[$config_key];
 						break;
 
 						case '{KEY}':
@@ -360,7 +361,7 @@ function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)
 			}
 			else
 			{
-				$args = array($new[$config_key], $key);
+				$args = array($new_ary[$config_key], $key);
 			}
 
 			$return = call_user_func_array($call, $args);
@@ -388,6 +389,7 @@ function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)
 		$tpl .= $vars['append'];
 	}
 
+	$new = $new_ary;
 	/**
 	* Overwrite the html code we display for the config value
 	*
@@ -405,6 +407,8 @@ function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)
 	*/
 	$vars = array('tpl_type', 'key', 'new', 'name', 'vars', 'tpl');
 	extract($phpbb_dispatcher->trigger_event('core.build_config_template', compact($vars)));
+	$new_ary = $new;
+	unset($new);
 
 	return $tpl;
 }
@@ -415,7 +419,7 @@ function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)
 */
 function validate_config_vars($config_vars, &$cfg_array, &$error)
 {
-	global $phpbb_root_path, $user, $phpbb_dispatcher;
+	global $phpbb_root_path, $user, $phpbb_dispatcher, $phpbb_filesystem;
 
 	$type	= 0;
 	$min	= 1;
@@ -596,7 +600,7 @@ function validate_config_vars($config_vars, &$cfg_array, &$error)
 				// Check if the path is writable
 				if ($config_definition['validate'] == 'wpath' || $config_definition['validate'] == 'rwpath' || $config_definition['validate'] === 'absolute_path_writable')
 				{
-					if (file_exists($path) && !phpbb_is_writable($path))
+					if (file_exists($path) && !$phpbb_filesystem->is_writable($path))
 					{
 						$error[] = sprintf($user->lang['DIRECTORY_NOT_WRITABLE'], $cfg_array[$config_name]);
 					}
@@ -652,8 +656,6 @@ function validate_range($value_ary, &$error)
 	foreach ($value_ary as $value)
 	{
 		$column = explode(':', $value['column_type']);
-		$max = $min = 0;
-		$type = 0;
 		if (!isset($column_types[$column[0]]))
 		{
 			continue;
--- a/includes/functions_admin.php
+++ b/includes/functions_admin.php
@@ -65,7 +65,7 @@ function recalc_nested_sets(&$new_id, $pkey, $table, $parent_id = 0, $where = ar
 */
 function make_forum_select($select_id = false, $ignore_id = false, $ignore_acl = false, $ignore_nonpost = false, $ignore_emptycat = true, $only_acl_post = false, $return_array = false)
 {
-	global $db, $user, $auth, $phpbb_dispatcher;
+	global $db, $auth, $phpbb_dispatcher;
 
 	// This query is identical to the jumpbox one
 	$sql = 'SELECT forum_id, forum_name, parent_id, forum_type, forum_flags, forum_options, left_id, right_id
@@ -187,7 +187,10 @@ function size_select_options($size_compare)
 */
 function group_select_options($group_id, $exclude_ids = false, $manage_founder = false)
 {
-	global $db, $user, $config;
+	global $db, $config, $phpbb_container;
+
+	/** @var \phpbb\group\helper $group_helper */
+	$group_helper = $phpbb_container->get('group_helper');
 
 	$exclude_sql = ($exclude_ids !== false && sizeof($exclude_ids)) ? 'WHERE ' . $db->sql_in_set('group_id', array_map('intval', $exclude_ids), true) : '';
 	$sql_and = (!$config['coppa_enable']) ? (($exclude_sql) ? ' AND ' : ' WHERE ') . "group_name <> 'REGISTERED_COPPA'" : '';
@@ -205,7 +208,7 @@ function group_select_options($group_id, $exclude_ids = false, $manage_founder =
 	while ($row = $db->sql_fetchrow($result))
 	{
 		$selected = ($row['group_id'] == $group_id) ? ' selected="selected"' : '';
-		$s_group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '"' . $selected . '>' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</option>';
+		$s_group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '"' . $selected . '>' . $group_helper->get_name($row['group_name']) . '</option>';
 	}
 	$db->sql_freeresult($result);
 
@@ -342,7 +345,7 @@ function get_forum_branch($forum_id, $type = 'all', $order = 'descending', $incl
 */
 function copy_forum_permissions($src_forum_id, $dest_forum_ids, $clear_dest_perms = true, $add_log = true)
 {
-	global $db;
+	global $db, $user, $phpbb_log;
 
 	// Only one forum id specified
 	if (!is_array($dest_forum_ids))
@@ -465,7 +468,7 @@ function copy_forum_permissions($src_forum_id, $dest_forum_ids, $clear_dest_perm
 
 	if ($add_log)
 	{
-		add_log('admin', 'LOG_FORUM_COPIED_PERMISSIONS', $src_forum_name, implode(', ', $dest_forum_names));
+		$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_COPIED_PERMISSIONS', false, array($src_forum_name, implode(', ', $dest_forum_names)));
 	}
 
 	$db->sql_transaction('commit');
@@ -641,8 +644,8 @@ function move_posts($post_ids, $topic_id, $auto_sync = true)
 	 *
 	 * @event core.move_posts_before
 	 * @var	array	post_ids	Array of post ids to move
-	 * @var	string	topic_id	The topic id the posts are moved to
-	 * @var bool	auto_sync	Whether or not to perform auto sync
+	 * @var	int		topic_id	The topic id the posts are moved to
+	 * @var	bool	auto_sync	Whether or not to perform auto sync
 	 * @var	array	forum_ids	Array of the forum ids the posts are moved from
 	 * @var	array	topic_ids	Array of the topic ids the posts are moved from
 	 * @var	array	forum_row	Array with the forum id of the topic the posts are moved to
@@ -673,8 +676,8 @@ function move_posts($post_ids, $topic_id, $auto_sync = true)
 	 *
 	 * @event core.move_posts_after
 	 * @var	array	post_ids	Array of the moved post ids
-	 * @var	string	topic_id	The topic id the posts are moved to
-	 * @var bool	auto_sync	Whether or not to perform auto sync
+	 * @var	int		topic_id	The topic id the posts are moved to
+	 * @var	bool	auto_sync	Whether or not to perform auto sync
 	 * @var	array	forum_ids	Array of the forum ids the posts are moved from
 	 * @var	array	topic_ids	Array of the topic ids the posts are moved from
 	 * @var	array	forum_row	Array with the forum id of the topic the posts are moved to
@@ -698,6 +701,28 @@ function move_posts($post_ids, $topic_id, $auto_sync = true)
 		sync('topic_attachment', 'topic_id', $topic_ids);
 		sync('topic', 'topic_id', $topic_ids, true);
 		sync('forum', 'forum_id', $forum_ids, true, true);
+
+		/**
+		 * Perform additional actions after move post sync
+		 *
+		 * @event core.move_posts_sync_after
+		 * @var	array	post_ids	Array of the moved post ids
+		 * @var	int		topic_id	The topic id the posts are moved to
+		 * @var	bool	auto_sync	Whether or not to perform auto sync
+		 * @var	array	forum_ids	Array of the forum ids the posts are moved from
+		 * @var	array	topic_ids	Array of the topic ids the posts are moved from
+		 * @var	array	forum_row	Array with the forum id of the topic the posts are moved to
+		 * @since 3.1.11-RC1
+		 */
+		$vars = array(
+			'post_ids',
+			'topic_id',
+			'auto_sync',
+			'forum_ids',
+			'topic_ids',
+			'forum_row',
+		);
+		extract($phpbb_dispatcher->trigger_event('core.move_posts_sync_after', compact($vars)));
 	}
 
 	// Update posted information
@@ -829,9 +854,10 @@ function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_s
 
 	if ($approved_topics)
 	{
-		set_config_count('num_topics', $approved_topics * (-1), true);
+		$config->increment('num_topics', $approved_topics * (-1), false);
 	}
 
+	/* @var $phpbb_notifications \phpbb\notification\manager */
 	$phpbb_notifications = $phpbb_container->get('notification_manager');
 
 	$phpbb_notifications->delete_notifications(array(
@@ -1047,7 +1073,10 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
 
 	$search->index_remove($post_ids, $poster_ids, $forum_ids);
 
-	delete_attachments('post', $post_ids, false);
+	/** @var \phpbb\attachment\manager $attachment_manager */
+	$attachment_manager = $phpbb_container->get('attachment.manager');
+	$attachment_manager->delete('post', $post_ids, false);
+	unset($attachment_manager);
 
 	/**
 	* Perform additional actions during post(s) deletion
@@ -1114,7 +1143,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
 
 	if ($approved_posts && $post_count_sync)
 	{
-		set_config_count('num_posts', $approved_posts * (-1), true);
+		$config->increment('num_posts', $approved_posts * (-1), false);
 	}
 
 	// We actually remove topics now to not be inconsistent (the delete_topics function calls this function too)
@@ -1123,6 +1152,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
 		delete_topics('topic_id', $remove_topics, $auto_sync, $post_count_sync, false);
 	}
 
+	/* @var $phpbb_notifications \phpbb\notification\manager */
 	$phpbb_notifications = $phpbb_container->get('notification_manager');
 
 	$phpbb_notifications->delete_notifications($delete_notifications_types, $post_ids);
@@ -1133,329 +1163,21 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
 /**
 * Delete Attachments
 *
+* @deprecated 3.2.0-a1 (To be removed: 3.4.0)
+*
 * @param string $mode can be: post|message|topic|attach|user
 * @param mixed $ids can be: post_ids, message_ids, topic_ids, attach_ids, user_ids
 * @param bool $resync set this to false if you are deleting posts or topics
 */
 function delete_attachments($mode, $ids, $resync = true)
 {
-	global $db, $config, $phpbb_dispatcher;
-
-	// 0 is as bad as an empty array
-	if (empty($ids))
-	{
-		return false;
-	}
-
-	if (is_array($ids))
-	{
-		$ids = array_unique($ids);
-		$ids = array_map('intval', $ids);
-	}
-	else
-	{
-		$ids = array((int) $ids);
-	}
-
-	$sql_where = '';
-
-	switch ($mode)
-	{
-		case 'post':
-		case 'message':
-			$sql_id = 'post_msg_id';
-			$sql_where = ' AND in_message = ' . ($mode == 'message' ? 1 : 0);
-		break;
-
-		case 'topic':
-			$sql_id = 'topic_id';
-		break;
-
-		case 'user':
-			$sql_id = 'poster_id';
-		break;
-
-		case 'attach':
-		default:
-			$sql_id = 'attach_id';
-			$mode = 'attach';
-		break;
-	}
-
-	$post_ids = $message_ids = $topic_ids = $physical = array();
-
-	/**
-	* Perform additional actions before collecting data for attachment(s) deletion
-	*
-	* @event core.delete_attachments_collect_data_before
-	* @var	string	mode			Variable containing attachments deletion mode, can be: post|message|topic|attach|user
-	* @var	mixed	ids				Array or comma separated list of ids corresponding to the mode
-	* @var	bool	resync			Flag indicating if posts/messages/topics should be synchronized
-	* @var	string	sql_id			The field name to collect/delete data for depending on the mode
-	* @since 3.1.7-RC1
-	*/
-	$vars = array(
-		'mode',
-		'ids',
-		'resync',
-		'sql_id',
-	);
-	extract($phpbb_dispatcher->trigger_event('core.delete_attachments_collect_data_before', compact($vars)));
-
-	// Collect post and topic ids for later use if we need to touch remaining entries (if resync is enabled)
-	$sql = 'SELECT post_msg_id, topic_id, in_message, physical_filename, thumbnail, filesize, is_orphan
-			FROM ' . ATTACHMENTS_TABLE . '
-			WHERE ' . $db->sql_in_set($sql_id, $ids);
-
-	$sql .= $sql_where;
-
-	$result = $db->sql_query($sql);
-
-	while ($row = $db->sql_fetchrow($result))
-	{
-		// We only need to store post/message/topic ids if resync is enabled and the file is not orphaned
-		if ($resync && !$row['is_orphan'])
-		{
-			if (!$row['in_message'])
-			{
-				$post_ids[] = $row['post_msg_id'];
-				$topic_ids[] = $row['topic_id'];
-			}
-			else
-			{
-				$message_ids[] = $row['post_msg_id'];
-			}
-		}
-
-		$physical[] = array('filename' => $row['physical_filename'], 'thumbnail' => $row['thumbnail'], 'filesize' => $row['filesize'], 'is_orphan' => $row['is_orphan']);
-	}
-	$db->sql_freeresult($result);
-
-	/**
-	* Perform additional actions before attachment(s) deletion
-	*
-	* @event core.delete_attachments_before
-	* @var	string	mode			Variable containing attachments deletion mode, can be: post|message|topic|attach|user
-	* @var	mixed	ids				Array or comma separated list of ids corresponding to the mode
-	* @var	bool	resync			Flag indicating if posts/messages/topics should be synchronized
-	* @var	string	sql_id			The field name to collect/delete data for depending on the mode
-	* @var	array	post_ids		Array with post ids for deleted attachment(s)
-	* @var	array	topic_ids		Array with topic ids for deleted attachment(s)
-	* @var	array	message_ids		Array with private message ids for deleted attachment(s)
-	* @var	array	physical		Array with deleted attachment(s) physical file(s) data
-	* @since 3.1.7-RC1
-	*/
-	$vars = array(
-		'mode',
-		'ids',
-		'resync',
-		'sql_id',
-		'post_ids',
-		'topic_ids',
-		'message_ids',
-		'physical',
-	);
-	extract($phpbb_dispatcher->trigger_event('core.delete_attachments_before', compact($vars)));
-
-	// Delete attachments
-	$sql = 'DELETE FROM ' . ATTACHMENTS_TABLE . '
-		WHERE ' . $db->sql_in_set($sql_id, $ids);
-
-	$sql .= $sql_where;
-
-	$db->sql_query($sql);
-	$num_deleted = $db->sql_affectedrows();
-
-	/**
-	* Perform additional actions after attachment(s) deletion from the database
-	*
-	* @event core.delete_attachments_from_database_after
-	* @var	string	mode			Variable containing attachments deletion mode, can be: post|message|topic|attach|user
-	* @var	mixed	ids				Array or comma separated list of ids corresponding to the mode
-	* @var	bool	resync			Flag indicating if posts/messages/topics should be synchronized
-	* @var	string	sql_id			The field name to collect/delete data for depending on the mode
-	* @var	array	post_ids		Array with post ids for deleted attachment(s)
-	* @var	array	topic_ids		Array with topic ids for deleted attachment(s)
-	* @var	array	message_ids		Array with private message ids for deleted attachment(s)
-	* @var	array	physical		Array with deleted attachment(s) physical file(s) data
-	* @var	int		num_deleted		The number of deleted attachment(s) from the database
-	* @since 3.1.7-RC1
-	*/
-	$vars = array(
-		'mode',
-		'ids',
-		'resync',
-		'sql_id',
-		'post_ids',
-		'topic_ids',
-		'message_ids',
-		'physical',
-		'num_deleted',
-	);
-	extract($phpbb_dispatcher->trigger_event('core.delete_attachments_from_database_after', compact($vars)));
-
-	if (!$num_deleted)
-	{
-		return 0;
-	}
-
-	// Delete attachments from filesystem
-	$space_removed = $files_removed = 0;
-	foreach ($physical as $file_ary)
-	{
-		if (phpbb_unlink($file_ary['filename'], 'file', true) && !$file_ary['is_orphan'])
-		{
-			// Only non-orphaned files count to the file size
-			$space_removed += $file_ary['filesize'];
-			$files_removed++;
-		}
-
-		if ($file_ary['thumbnail'])
-		{
-			phpbb_unlink($file_ary['filename'], 'thumbnail', true);
-		}
-	}
-
-	/**
-	* Perform additional actions after attachment(s) deletion from the filesystem
-	*
-	* @event core.delete_attachments_from_filesystem_after
-	* @var	string	mode			Variable containing attachments deletion mode, can be: post|message|topic|attach|user
-	* @var	mixed	ids				Array or comma separated list of ids corresponding to the mode
-	* @var	bool	resync			Flag indicating if posts/messages/topics should be synchronized
-	* @var	string	sql_id			The field name to collect/delete data for depending on the mode
-	* @var	array	post_ids		Array with post ids for deleted attachment(s)
-	* @var	array	topic_ids		Array with topic ids for deleted attachment(s)
-	* @var	array	message_ids		Array with private message ids for deleted attachment(s)
-	* @var	array	physical		Array with deleted attachment(s) physical file(s) data
-	* @var	int		num_deleted		The number of deleted attachment(s) from the database
-	* @var	int		space_removed	The size of deleted files(s) from the filesystem
-	* @var	int		files_removed	The number of deleted file(s) from the filesystem
-	* @since 3.1.7-RC1
-	*/
-	$vars = array(
-		'mode',
-		'ids',
-		'resync',
-		'sql_id',
-		'post_ids',
-		'topic_ids',
-		'message_ids',
-		'physical',
-		'num_deleted',
-		'space_removed',
-		'files_removed',
-	);
-	extract($phpbb_dispatcher->trigger_event('core.delete_attachments_from_filesystem_after', compact($vars)));
-
-	if ($space_removed || $files_removed)
-	{
-		set_config_count('upload_dir_size', $space_removed * (-1), true);
-		set_config_count('num_files', $files_removed * (-1), true);
-	}
-
-	// If we do not resync, we do not need to adjust any message, post, topic or user entries
-	if (!$resync)
-	{
-		return $num_deleted;
-	}
-
-	// No more use for the original ids
-	unset($ids);
-
-	// Now, we need to resync posts, messages, topics. We go through every one of them
-	$post_ids = array_unique($post_ids);
-	$message_ids = array_unique($message_ids);
-	$topic_ids = array_unique($topic_ids);
-
-	// Update post indicators for posts now no longer having attachments
-	if (sizeof($post_ids))
-	{
-		// Just check which posts are still having an assigned attachment not orphaned by querying the attachments table
-		$sql = 'SELECT post_msg_id
-			FROM ' . ATTACHMENTS_TABLE . '
-			WHERE ' . $db->sql_in_set('post_msg_id', $post_ids) . '
-				AND in_message = 0
-				AND is_orphan = 0';
-		$result = $db->sql_query($sql);
-
-		$remaining_ids = array();
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$remaining_ids[] = $row['post_msg_id'];
-		}
-		$db->sql_freeresult($result);
-
-		// Now only unset those ids remaining
-		$post_ids = array_diff($post_ids, $remaining_ids);
-
-		if (sizeof($post_ids))
-		{
-			$sql = 'UPDATE ' . POSTS_TABLE . '
-				SET post_attachment = 0
-				WHERE ' . $db->sql_in_set('post_id', $post_ids);
-			$db->sql_query($sql);
-		}
-	}
-
-	// Update message table if messages are affected
-	if (sizeof($message_ids))
-	{
-		// Just check which messages are still having an assigned attachment not orphaned by querying the attachments table
-		$sql = 'SELECT post_msg_id
-			FROM ' . ATTACHMENTS_TABLE . '
-			WHERE ' . $db->sql_in_set('post_msg_id', $message_ids) . '
-				AND in_message = 1
-				AND is_orphan = 0';
-		$result = $db->sql_query($sql);
-
-		$remaining_ids = array();
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$remaining_ids[] = $row['post_msg_id'];
-		}
-		$db->sql_freeresult($result);
-
-		// Now only unset those ids remaining
-		$message_ids = array_diff($message_ids, $remaining_ids);
-
-		if (sizeof($message_ids))
-		{
-			$sql = 'UPDATE ' . PRIVMSGS_TABLE . '
-				SET message_attachment = 0
-				WHERE ' . $db->sql_in_set('msg_id', $message_ids);
-			$db->sql_query($sql);
-		}
-	}
-
-	// Now update the topics. This is a bit trickier, because there could be posts still having attachments within the topic
-	if (sizeof($topic_ids))
-	{
-		// Just check which topics are still having an assigned attachment not orphaned by querying the attachments table (much less entries expected)
-		$sql = 'SELECT topic_id
-			FROM ' . ATTACHMENTS_TABLE . '
-			WHERE ' . $db->sql_in_set('topic_id', $topic_ids) . '
-				AND is_orphan = 0';
-		$result = $db->sql_query($sql);
-
-		$remaining_ids = array();
-		while ($row = $db->sql_fetchrow($result))
-		{
-			$remaining_ids[] = $row['topic_id'];
-		}
-		$db->sql_freeresult($result);
+	global $phpbb_container;
 
-		// Now only unset those ids remaining
-		$topic_ids = array_diff($topic_ids, $remaining_ids);
+	/** @var \phpbb\attachment\manager $attachment_manager */
+	$attachment_manager = $phpbb_container->get('attachment.manager');
+	$num_deleted = $attachment_manager->delete($mode, $ids, $resync);
 
-		if (sizeof($topic_ids))
-		{
-			$sql = 'UPDATE ' . TOPICS_TABLE . '
-				SET topic_attachment = 0
-				WHERE ' . $db->sql_in_set('topic_id', $topic_ids);
-			$db->sql_query($sql);
-		}
-	}
+	unset($attachment_manager);
 
 	return $num_deleted;
 }
@@ -1573,27 +1295,19 @@ function update_posted_info(&$topic_ids)
 
 /**
 * Delete attached file
+*
+* @deprecated 3.2.0-a1 (To be removed: 3.4.0)
 */
 function phpbb_unlink($filename, $mode = 'file', $entry_removed = false)
 {
-	global $db, $phpbb_root_path, $config;
+	global $phpbb_container;
 
-	// Because of copying topics or modifications a physical filename could be assigned more than once. If so, do not remove the file itself.
-	$sql = 'SELECT COUNT(attach_id) AS num_entries
-		FROM ' . ATTACHMENTS_TABLE . "
-		WHERE physical_filename = '" . $db->sql_escape(utf8_basename($filename)) . "'";
-	$result = $db->sql_query($sql);
-	$num_entries = (int) $db->sql_fetchfield('num_entries');
-	$db->sql_freeresult($result);
+	/** @var \phpbb\attachment\manager $attachment_manager */
+	$attachment_manager = $phpbb_container->get('attachment.manager');
+	$unlink = $attachment_manager->unlink($filename, $mode, $entry_removed);
+	unset($attachment_manager);
 
-	// Do not remove file if at least one additional entry with the same name exist.
-	if (($entry_removed && $num_entries > 0) || (!$entry_removed && $num_entries > 1))
-	{
-		return false;
-	}
-
-	$filename = ($mode == 'thumbnail') ? 'thumb_' . utf8_basename($filename) : utf8_basename($filename);
-	return @unlink($phpbb_root_path . $config['upload_path'] . '/' . $filename);
+	return $unlink;
 }
 
 /**
@@ -2343,7 +2057,6 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
 					AND u.user_id = p.poster_id';
 			$result = $db->sql_query($sql);
 
-			$post_ids = array();
 			while ($row = $db->sql_fetchrow($result))
 			{
 				$topic_id = intval($row['topic_id']);
@@ -2416,7 +2129,6 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
 							AND u.user_id = p.poster_id';
 					$result = $db->sql_query($sql);
 
-					$post_ids = array();
 					while ($row = $db->sql_fetchrow($result))
 					{
 						$topic_id = (int) $row['topic_id'];
@@ -2665,7 +2377,7 @@ function prune($forum_id, $prune_mode, $prune_date, $prune_flags = 0, $auto_sync
 */
 function auto_prune($forum_id, $prune_mode, $prune_flags, $prune_days, $prune_freq)
 {
-	global $db;
+	global $db, $user, $phpbb_log;
 
 	$sql = 'SELECT forum_name
 		FROM ' . FORUMS_TABLE . "
@@ -2689,7 +2401,7 @@ function auto_prune($forum_id, $prune_mode, $prune_flags, $prune_days, $prune_fr
 			$db->sql_query($sql);
 		}
 
-		add_log('admin', 'LOG_AUTO_PRUNE', $row['forum_name']);
+		$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_AUTO_PRUNE', false, array($row['forum_name']));
 	}
 
 	return;
@@ -2713,7 +2425,6 @@ function phpbb_cache_moderators($db, $cache, $auth)
 	// Clear table
 	switch ($db->get_sql_layer())
 	{
-		case 'sqlite':
 		case 'sqlite3':
 			$db->sql_query('DELETE FROM ' . MODERATOR_CACHE_TABLE);
 		break;
@@ -2724,7 +2435,7 @@ function phpbb_cache_moderators($db, $cache, $auth)
 	}
 
 	// We add moderators who have forum moderator permissions without an explicit ACL_NEVER setting
-	$hold_ary = $ug_id_ary = $sql_ary = array();
+	$sql_ary = array();
 
 	// Grab all users having moderative options...
 	$hold_ary = $auth->acl_user_raw_data(false, 'm_%', false);
@@ -3171,7 +2882,6 @@ function get_database_size()
 			}
 		break;
 
-		case 'sqlite':
 		case 'sqlite3':
 			global $dbhost;
 
@@ -3182,7 +2892,6 @@ function get_database_size()
 
 		break;
 
-		case 'mssql':
 		case 'mssql_odbc':
 		case 'mssqlnative':
 			$sql = 'SELECT @@VERSION AS mssql_version';
@@ -3256,25 +2965,6 @@ function get_database_size()
 	return $database_size;
 }
 
-/**
-* Retrieve contents from remotely stored file
-*
-* @deprecated	3.1.2	Use file_downloader instead
-*/
-function get_remote_file($host, $directory, $filename, &$errstr, &$errno, $port = 80, $timeout = 6)
-{
-	global $phpbb_container;
-
-	// Get file downloader and assign $errstr and $errno
-	$file_downloader = $phpbb_container->get('file_downloader');
-
-	$file_data = $file_downloader->get($host, $directory, $filename, $port, $timeout);
-	$errstr = $file_downloader->get_error_string();
-	$errno = $file_downloader->get_error_number();
-
-	return $file_data;
-}
-
 /*
 * Tidy Warnings
 * Remove all warnings which have now expired from the database
@@ -3318,7 +3008,7 @@ function tidy_warnings()
 		$db->sql_transaction('commit');
 	}
 
-	set_config('warnings_last_gc', time(), true);
+	$config->set('warnings_last_gc', time(), false);
 }
 
 /**
@@ -3326,7 +3016,7 @@ function tidy_warnings()
 */
 function tidy_database()
 {
-	global $db;
+	global $config, $db;
 
 	// Here we check permission consistency
 
@@ -3351,7 +3041,7 @@ function tidy_database()
 		WHERE ' . $db->sql_in_set('forum_id', $forum_ids, true);
 	$db->sql_query($sql);
 
-	set_config('database_last_gc', time(), true);
+	$config->set('database_last_gc', time(), false);
 }
 
 /**
@@ -3359,47 +3049,18 @@ function tidy_database()
 */
 function add_permission_language()
 {
-	global $config, $user, $phpEx, $phpbb_extension_manager;
+	global $user, $phpEx, $phpbb_extension_manager;
 
 	// add permission language files from extensions
 	$finder = $phpbb_extension_manager->get_finder();
 
-	// We grab the language files from the default, English and user's language.
-	// So we can fall back to the other files like we do when using add_lang()
-	$default_lang_files = $english_lang_files = $user_lang_files = array();
-
-	// Search for board default language if it's not the user language
-	if ($config['default_lang'] != $user->lang_name)
-	{
-		$default_lang_files = $finder
-			->prefix('permissions_')
-			->suffix(".$phpEx")
-			->core_path('language/' . basename($config['default_lang']) . '/')
-			->extension_directory('/language/' . basename($config['default_lang']))
-			->find();
-	}
-
-	// Search for english, if its not the default or user language
-	if ($config['default_lang'] != 'en' && $user->lang_name != 'en')
-	{
-		$english_lang_files = $finder
-			->prefix('permissions_')
-			->suffix(".$phpEx")
-			->core_path('language/en/')
-			->extension_directory('/language/en')
-			->find();
-	}
-
-	// Find files in the user's language
-	$user_lang_files = $finder
+	$lang_files = $finder
 		->prefix('permissions_')
 		->suffix(".$phpEx")
-		->core_path('language/' . $user->lang_name . '/')
-		->extension_directory('/language/' . $user->lang_name)
+		->core_path('language/')
+		->extension_directory('/language')
 		->find();
 
-	$lang_files = array_merge($english_lang_files, $default_lang_files, $user_lang_files);
-
 	foreach ($lang_files as $lang_file => $ext_name)
 	{
 		if ($ext_name === '/')
--- a/includes/functions_compatibility.php
+++ b/includes/functions_compatibility.php
@@ -60,6 +60,7 @@ function phpbb_hash($password)
 {
 	global $phpbb_container;
 
+	/* @var $passwords_manager \phpbb\passwords\manager */
 	$passwords_manager = $phpbb_container->get('passwords.manager');
 	return $passwords_manager->hash($password);
 }
@@ -78,6 +79,7 @@ function phpbb_check_hash($password, $hash)
 {
 	global $phpbb_container;
 
+	/* @var $passwords_manager \phpbb\passwords\manager */
 	$passwords_manager = $phpbb_container->get('passwords.manager');
 	return $passwords_manager->check($password, $hash);
 }
@@ -90,7 +92,7 @@ function phpbb_check_hash($password, $hash)
 * @param string $path Path to clean
 * @return string Cleaned path
 *
-* @deprecated
+* @deprecated 3.1.0 (To be removed: 3.3.0)
 */
 function phpbb_clean_path($path)
 {
@@ -98,6 +100,7 @@ function phpbb_clean_path($path)
 
 	if (!$phpbb_path_helper && $phpbb_container)
 	{
+		/* @var $phpbb_path_helper \phpbb\path_helper */
 		$phpbb_path_helper = $phpbb_container->get('path_helper');
 	}
 	else if (!$phpbb_path_helper)
@@ -115,7 +118,7 @@ function phpbb_clean_path($path)
 			new phpbb\symfony_request(
 				$request
 			),
-			new phpbb\filesystem(),
+			new phpbb\filesystem\filesystem(),
 			$request,
 			$phpbb_root_path,
 			$phpEx
@@ -133,7 +136,7 @@ function phpbb_clean_path($path)
 *
 * @return		string		Returns the options for timezone selector only
 *
-* @deprecated
+* @deprecated 3.1.0 (To be removed: 3.3.0)
 */
 function tz_select($default = '', $truncate = false)
 {
@@ -147,7 +150,7 @@ function tz_select($default = '', $truncate = false)
 * via admin_permissions. Changes of usernames and group names
 * must be carried through for the moderators table.
 *
-* @deprecated 3.1
+* @deprecated 3.1.0 (To be removed: 3.3.0)
 * @return null
 */
 function cache_moderators()
@@ -159,7 +162,7 @@ function cache_moderators()
 /**
 * Removes moderators and administrators from foe lists.
 *
-* @deprecated 3.1
+* @deprecated 3.1.0 (To be removed: 3.3.0)
 * @param array|bool $group_id If an array, remove all members of this group from foe lists, or false to ignore
 * @param array|bool $user_id If an array, remove this user from foe lists, or false to ignore
 * @return null
@@ -196,3 +199,315 @@ function get_user_rank($user_rank, $user_posts, &$rank_title, &$rank_img, &$rank
 	$rank_img = $rank_data['img'];
 	$rank_img_src = $rank_data['img_src'];
 }
+
+/**
+ * Retrieve contents from remotely stored file
+ *
+ * @deprecated	3.1.2	Use file_downloader instead
+ */
+function get_remote_file($host, $directory, $filename, &$errstr, &$errno, $port = 80, $timeout = 6)
+{
+	global $phpbb_container;
+
+	// Get file downloader and assign $errstr and $errno
+	/* @var $file_downloader \phpbb\file_downloader */
+	$file_downloader = $phpbb_container->get('file_downloader');
+
+	$file_data = $file_downloader->get($host, $directory, $filename, $port, $timeout);
+	$errstr = $file_downloader->get_error_string();
+	$errno = $file_downloader->get_error_number();
+
+	return $file_data;
+}
+
+/**
+ * Add log entry
+ *
+ * @param	string	$mode				The mode defines which log_type is used and from which log the entry is retrieved
+ * @param	int		$forum_id			Mode 'mod' ONLY: forum id of the related item, NOT INCLUDED otherwise
+ * @param	int		$topic_id			Mode 'mod' ONLY: topic id of the related item, NOT INCLUDED otherwise
+ * @param	int		$reportee_id		Mode 'user' ONLY: user id of the reportee, NOT INCLUDED otherwise
+ * @param	string	$log_operation		Name of the operation
+ * @param	array	$additional_data	More arguments can be added, depending on the log_type
+ *
+ * @return	int|bool		Returns the log_id, if the entry was added to the database, false otherwise.
+ *
+ * @deprecated	3.1.0 (To be removed: 3.3.0)
+ */
+function add_log()
+{
+	global $phpbb_log, $user;
+
+	$args = func_get_args();
+	$mode = array_shift($args);
+
+	// This looks kind of dirty, but add_log has some additional data before the log_operation
+	$additional_data = array();
+	switch ($mode)
+	{
+		case 'admin':
+		case 'critical':
+			break;
+		case 'mod':
+			$additional_data['forum_id'] = array_shift($args);
+			$additional_data['topic_id'] = array_shift($args);
+			break;
+		case 'user':
+			$additional_data['reportee_id'] = array_shift($args);
+			break;
+	}
+
+	$log_operation = array_shift($args);
+	$additional_data = array_merge($additional_data, $args);
+
+	$user_id = (empty($user->data)) ? ANONYMOUS : $user->data['user_id'];
+	$user_ip = (empty($user->ip)) ? '' : $user->ip;
+
+	return $phpbb_log->add($mode, $user_id, $user_ip, $log_operation, time(), $additional_data);
+}
+
+/**
+ * Sets a configuration option's value.
+ *
+ * Please note that this function does not update the is_dynamic value for
+ * an already existing config option.
+ *
+ * @param string $config_name   The configuration option's name
+ * @param string $config_value  New configuration value
+ * @param bool   $is_dynamic    Whether this variable should be cached (false) or
+ *                              if it changes too frequently (true) to be
+ *                              efficiently cached.
+ *
+ * @return null
+ *
+ * @deprecated 3.1.0 (To be removed: 3.3.0)
+ */
+function set_config($config_name, $config_value, $is_dynamic = false, \phpbb\config\config $set_config = null)
+{
+	static $config = null;
+
+	if ($set_config !== null)
+	{
+		$config = $set_config;
+
+		if (empty($config_name))
+		{
+			return;
+		}
+	}
+
+	$config->set($config_name, $config_value, !$is_dynamic);
+}
+
+/**
+ * Increments an integer config value directly in the database.
+ *
+ * @param string $config_name   The configuration option's name
+ * @param int    $increment     Amount to increment by
+ * @param bool   $is_dynamic    Whether this variable should be cached (false) or
+ *                              if it changes too frequently (true) to be
+ *                              efficiently cached.
+ *
+ * @return null
+ *
+ * @deprecated 3.1.0 (To be removed: 3.3.0)
+ */
+function set_config_count($config_name, $increment, $is_dynamic = false, \phpbb\config\config $set_config = null)
+{
+	static $config = null;
+	if ($set_config !== null)
+	{
+		$config = $set_config;
+		if (empty($config_name))
+		{
+			return;
+		}
+	}
+	$config->increment($config_name, $increment, !$is_dynamic);
+}
+
+/**
+ * Wrapper function of \phpbb\request\request::variable which exists for backwards compatability.
+ * See {@link \phpbb\request\request_interface::variable \phpbb\request\request_interface::variable} for
+ * documentation of this function's use.
+ *
+ * @deprecated 3.1.0 (To be removed: 3.3.0)
+ * @param	mixed			$var_name	The form variable's name from which data shall be retrieved.
+ * 										If the value is an array this may be an array of indizes which will give
+ * 										direct access to a value at any depth. E.g. if the value of "var" is array(1 => "a")
+ * 										then specifying array("var", 1) as the name will return "a".
+ * 										If you pass an instance of {@link \phpbb\request\request_interface phpbb_request_interface}
+ * 										as this parameter it will overwrite the current request class instance. If you do
+ * 										not do so, it will create its own instance (but leave superglobals enabled).
+ * @param	mixed			$default	A default value that is returned if the variable was not set.
+ * 										This function will always return a value of the same type as the default.
+ * @param	bool			$multibyte	If $default is a string this paramater has to be true if the variable may contain any UTF-8 characters
+ *										Default is false, causing all bytes outside the ASCII range (0-127) to be replaced with question marks
+ * @param	bool			$cookie		This param is mapped to \phpbb\request\request_interface::COOKIE as the last param for
+ * 										\phpbb\request\request_interface::variable for backwards compatability reasons.
+ * @param	\phpbb\request\request_interface|null|false	If an instance of \phpbb\request\request_interface is given the instance is stored in
+ *										a static variable and used for all further calls where this parameters is null. Until
+ *										the function is called with an instance it automatically creates a new \phpbb\request\request
+ *										instance on every call. By passing false this per-call instantiation can be restored
+ *										after having passed in a \phpbb\request\request_interface instance.
+ *
+ * @return	mixed	The value of $_REQUEST[$var_name] run through {@link set_var set_var} to ensure that the type is the
+ * 					the same as that of $default. If the variable is not set $default is returned.
+ */
+function request_var($var_name, $default, $multibyte = false, $cookie = false, $request = null)
+{
+	// This is all just an ugly hack to add "Dependency Injection" to a function
+	// the only real code is the function call which maps this function to a method.
+	static $static_request = null;
+	if ($request instanceof \phpbb\request\request_interface)
+	{
+		$static_request = $request;
+		if (empty($var_name))
+		{
+			return;
+		}
+	}
+	else if ($request === false)
+	{
+		$static_request = null;
+		if (empty($var_name))
+		{
+			return;
+		}
+	}
+	$tmp_request = $static_request;
+	// no request class set, create a temporary one ourselves to keep backwards compatibility
+	if ($tmp_request === null)
+	{
+		// false param: enable super globals, so the created request class does not
+		// make super globals inaccessible everywhere outside this function.
+		$tmp_request = new \phpbb\request\request(new \phpbb\request\type_cast_helper(), false);
+	}
+	return $tmp_request->variable($var_name, $default, $multibyte, ($cookie) ? \phpbb\request\request_interface::COOKIE : \phpbb\request\request_interface::REQUEST);
+}
+
+/**
+ * Get tables of a database
+ *
+ * @deprecated 3.1.0 (To be removed: 3.3.0)
+ */
+function get_tables(&$db)
+{
+	$db_tools_factory = new \phpbb\db\tools\factory();
+	$db_tools = $db_tools_factory->get($db);
+
+	return $db_tools->sql_list_tables();
+}
+
+/**
+ * Global function for chmodding directories and files for internal use
+ *
+ * This function determines owner and group whom the file belongs to and user and group of PHP and then set safest possible file permissions.
+ * The function determines owner and group from common.php file and sets the same to the provided file.
+ * The function uses bit fields to build the permissions.
+ * The function sets the appropiate execute bit on directories.
+ *
+ * Supported constants representing bit fields are:
+ *
+ * CHMOD_ALL - all permissions (7)
+ * CHMOD_READ - read permission (4)
+ * CHMOD_WRITE - write permission (2)
+ * CHMOD_EXECUTE - execute permission (1)
+ *
+ * NOTE: The function uses POSIX extension and fileowner()/filegroup() functions. If any of them is disabled, this function tries to build proper permissions, by calling is_readable() and is_writable() functions.
+ *
+ * @param string	$filename	The file/directory to be chmodded
+ * @param int	$perms		Permissions to set
+ *
+ * @return bool	true on success, otherwise false
+ *
+ * @deprecated 3.2.0-dev	use \phpbb\filesystem\filesystem::phpbb_chmod() instead
+ */
+function phpbb_chmod($filename, $perms = CHMOD_READ)
+{
+	global $phpbb_filesystem;
+
+	try
+	{
+		$phpbb_filesystem->phpbb_chmod($filename, $perms);
+	}
+	catch (\phpbb\filesystem\exception\filesystem_exception $e)
+	{
+		return false;
+	}
+
+	return true;
+}
+
+/**
+ * Test if a file/directory is writable
+ *
+ * This function calls the native is_writable() when not running under
+ * Windows and it is not disabled.
+ *
+ * @param string $file Path to perform write test on
+ * @return bool True when the path is writable, otherwise false.
+ *
+ * @deprecated 3.2.0-dev	use \phpbb\filesystem\filesystem::is_writable() instead
+ */
+function phpbb_is_writable($file)
+{
+	global $phpbb_filesystem;
+
+	return $phpbb_filesystem->is_writable($file);
+}
+
+/**
+ * Checks if a path ($path) is absolute or relative
+ *
+ * @param string $path Path to check absoluteness of
+ * @return boolean
+ *
+ * @deprecated 3.2.0-dev	use \phpbb\filesystem\filesystem::is_absolute_path() instead
+ */
+function phpbb_is_absolute($path)
+{
+	global $phpbb_filesystem;
+
+	return $phpbb_filesystem->is_absolute_path($path);
+}
+
+/**
+ * A wrapper for realpath
+ *
+ * @deprecated 3.2.0-dev	use \phpbb\filesystem\filesystem::realpath() instead
+ */
+function phpbb_realpath($path)
+{
+	global $phpbb_filesystem;
+
+	return $phpbb_filesystem->realpath($path);
+}
+
+/**
+ * Determine which plural form we should use.
+ * For some languages this is not as simple as for English.
+ *
+ * @param $rule		int			ID of the plural rule we want to use, see http://wiki.phpbb.com/Plural_Rules#Plural_Rules
+ * @param $number	int|float	The number we want to get the plural case for. Float numbers are floored.
+ * @return	int		The plural-case we need to use for the number plural-rule combination
+ *
+ * @deprecated 3.2.0-dev (To be removed: 3.3.0)
+ */
+function phpbb_get_plural_form($rule, $number)
+{
+	global $phpbb_container;
+
+	/** @var \phpbb\language\language $language */
+	$language = $phpbb_container->get('language');
+	return $language->get_plural_form($number, $rule);
+}
+
+/**
+* @return bool Always true
+* @deprecated 3.2.0-dev
+*/
+function phpbb_pcre_utf8_support()
+{
+	return true;
+}
--- a/includes/functions_compress.php
+++ b/includes/functions_compress.php
@@ -56,7 +56,6 @@ class compress
 			// Clean up path, add closing / if not present
 			$src_path = ($src_path && substr($src_path, -1) != '/') ? $src_path . '/' : $src_path;
 
-			$filelist = array();
 			$filelist = filelist("$phpbb_root_path$src", '', '*');
 			krsort($filelist);
 
@@ -184,7 +183,7 @@ class compress
 }
 
 /**
-* Zip creation class from phpMyAdmin 2.3.0 (c) Tobias Ratschiller, Olivier Mller, Loc Chapeaux,
+* Zip creation class from phpMyAdmin 2.3.0 (c) Tobias Ratschiller, Olivier Müller, Loïc Chapeaux,
 * Marc Delisle, http://www.phpmyadmin.net/
 *
 * Zip extraction function by Alexandre Tedeschi, alexandrebr at gmail dot com
@@ -203,12 +202,20 @@ class compress_zip extends compress
 	var $old_offset = 0;
 	var $datasec_len = 0;
 
+	/**
+	 * @var \phpbb\filesystem\filesystem_interface
+	 */
+	protected $filesystem;
+
 	/**
 	* Constructor
 	*/
 	function compress_zip($mode, $file)
 	{
+		global $phpbb_filesystem;
+
 		$this->fp = @fopen($file, $mode . 'b');
+		$this->filesystem = ($phpbb_filesystem instanceof \phpbb\filesystem\filesystem_interface) ? $phpbb_filesystem : new \phpbb\filesystem\filesystem();
 
 		if (!$this->fp)
 		{
@@ -286,7 +293,15 @@ class compress_zip extends compress
 									{
 										trigger_error("Could not create directory $folder");
 									}
-									phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE);
+
+									try
+									{
+										$this->filesystem->phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE);
+									}
+									catch (\phpbb\filesystem\exception\filesystem_exception $e)
+									{
+										// Do nothing
+									}
 								}
 							}
 						}
@@ -315,7 +330,15 @@ class compress_zip extends compress
 								{
 									trigger_error("Could not create directory $folder");
 								}
-								phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE);
+
+								try
+								{
+									$this->filesystem->phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE);
+								}
+								catch (\phpbb\filesystem\exception\filesystem_exception $e)
+								{
+									// Do nothing
+								}
 							}
 						}
 					}
@@ -538,11 +561,18 @@ class compress_tar extends compress
 	var $type = '';
 	var $wrote = false;
 
+	/**
+	 * @var \phpbb\filesystem\filesystem_interface
+	 */
+	protected $filesystem;
+
 	/**
 	* Constructor
 	*/
 	function compress_tar($mode, $file, $type = '')
 	{
+		global $phpbb_filesystem;
+
 		$type = (!$type) ? $file : $type;
 		$this->isgz = preg_match('#(\.tar\.gz|\.tgz)$#', $type);
 		$this->isbz = preg_match('#\.tar\.bz2$#', $type);
@@ -551,6 +581,8 @@ class compress_tar extends compress
 		$this->file = &$file;
 		$this->type = &$type;
 		$this->open();
+
+		$this->filesystem = ($phpbb_filesystem instanceof \phpbb\filesystem\filesystem_interface) ? $phpbb_filesystem : new \phpbb\filesystem\filesystem();
 	}
 
 	/**
@@ -601,7 +633,15 @@ class compress_tar extends compress
 								{
 									trigger_error("Could not create directory $folder");
 								}
-								phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE);
+
+								try
+								{
+									$this->filesystem->phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE);
+								}
+								catch (\phpbb\filesystem\exception\filesystem_exception $e)
+								{
+									// Do nothing
+								}
 							}
 						}
 					}
@@ -628,7 +668,15 @@ class compress_tar extends compress
 							{
 								trigger_error("Could not create directory $folder");
 							}
-							phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE);
+
+							try
+							{
+								$this->filesystem->phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE);
+							}
+							catch (\phpbb\filesystem\exception\filesystem_exception $e)
+							{
+								// Do nothing
+							}
 						}
 					}
 
@@ -637,7 +685,15 @@ class compress_tar extends compress
 					{
 						trigger_error("Couldn't create file $filename");
 					}
-					phpbb_chmod($target_filename, CHMOD_READ);
+
+					try
+					{
+						$this->filesystem->phpbb_chmod($target_filename, CHMOD_READ);
+					}
+					catch (\phpbb\filesystem\exception\filesystem_exception $e)
+					{
+						// Do nothing
+					}
 
 					// Grab the file contents
 					fwrite($fp, ($filesize) ? $fzread($this->fp, ($filesize + 511) &~ 511) : '', $filesize);
--- a/includes/functions_content.php
+++ b/includes/functions_content.php
@@ -460,41 +460,54 @@ function phpbb_clean_search_string($search_string)
 /**
 * Decode text whereby text is coming from the db and expected to be pre-parsed content
 * We are placing this outside of the message parser because we are often in need of it...
+*
+* NOTE: special chars are kept encoded
+*
+* @param string &$message Original message, passed by reference
+* @param string $bbcode_uid BBCode UID
+* @return null
 */
 function decode_message(&$message, $bbcode_uid = '')
 {
-	global $config, $phpbb_dispatcher;
-
-	if ($bbcode_uid)
-	{
-		$match = array('<br />', "[/*:m:$bbcode_uid]", ":u:$bbcode_uid", ":o:$bbcode_uid", ":$bbcode_uid");
-		$replace = array("\n", '', '', '', '');
-	}
-	else
-	{
-		$match = array('<br />');
-		$replace = array("\n");
-	}
+	global $phpbb_container, $phpbb_dispatcher;
 
 	/**
-	* Use this event to modify the message before it is decoded
-	*
-	* @event core.decode_message_before
-	* @var string	message_text	The message content
-	* @var string	bbcode_uid		The message BBCode UID
-	* @since 3.1.9-RC1
-	*/
+	 * Use this event to modify the message before it is decoded
+	 *
+	 * @event core.decode_message_before
+	 * @var string	message_text	The message content
+	 * @var string	bbcode_uid		The message BBCode UID
+	 * @since 3.1.9-RC1
+	 */
 	$message_text = $message;
 	$vars = array('message_text', 'bbcode_uid');
 	extract($phpbb_dispatcher->trigger_event('core.decode_message_before', compact($vars)));
 	$message = $message_text;
 
-	$message = str_replace($match, $replace, $message);
+	if (preg_match('#^<[rt][ >]#', $message))
+	{
+		$message = htmlspecialchars($phpbb_container->get('text_formatter.utils')->unparse($message), ENT_COMPAT);
+	}
+	else
+	{
+		if ($bbcode_uid)
+		{
+			$match = array('<br />', "[/*:m:$bbcode_uid]", ":u:$bbcode_uid", ":o:$bbcode_uid", ":$bbcode_uid");
+			$replace = array("\n", '', '', '', '');
+		}
+		else
+		{
+			$match = array('<br />');
+			$replace = array("\n");
+		}
+
+		$message = str_replace($match, $replace, $message);
 
-	$match = get_preg_expression('bbcode_htm');
-	$replace = array('\1', '\1', '\2', '\1', '', '');
+		$match = get_preg_expression('bbcode_htm');
+		$replace = array('\1', '\1', '\2', '\2', '\1', '', '');
 
-	$message = preg_replace($match, $replace, $message);
+		$message = preg_replace($match, $replace, $message);
+	}
 
 	/**
 	* Use this event to modify the message after it is decoded
@@ -511,21 +524,30 @@ function decode_message(&$message, $bbcode_uid = '')
 }
 
 /**
-* Strips all bbcode from a text and returns the plain content
+* Strips all bbcode from a text in place
 */
 function strip_bbcode(&$text, $uid = '')
 {
-	if (!$uid)
+	global $phpbb_container;
+
+	if (preg_match('#^<[rt][ >]#', $text))
 	{
-		$uid = '[0-9a-z]{5,}';
+		$text = $phpbb_container->get('text_formatter.utils')->clean_formatting($text);
 	}
+	else
+	{
+		if (!$uid)
+		{
+			$uid = '[0-9a-z]{5,}';
+		}
 
-	$text = preg_replace("#\[\/?[a-z0-9\*\+\-]+(?:=(?:&quot;.*&quot;|[^\]]*))?(?::[a-z])?(\:$uid)\]#", ' ', $text);
+		$text = preg_replace("#\[\/?[a-z0-9\*\+\-]+(?:=(?:&quot;.*&quot;|[^\]]*))?(?::[a-z])?(\:$uid)\]#", ' ', $text);
 
-	$match = get_preg_expression('bbcode_htm');
-	$replace = array('\1', '\1', '\2', '\1', '', '');
+		$match = get_preg_expression('bbcode_htm');
+		$replace = array('\1', '\1', '\2', '\1', '', '');
 
-	$text = preg_replace($match, $replace, $text);
+		$text = preg_replace($match, $replace, $text);
+	}
 }
 
 /**
@@ -535,7 +557,7 @@ function strip_bbcode(&$text, $uid = '')
 function generate_text_for_display($text, $uid, $bitfield, $flags, $censor_text = true)
 {
 	static $bbcode;
-	global $phpbb_dispatcher;
+	global $phpbb_dispatcher, $phpbb_container;
 
 	if ($text === '')
 	{
@@ -556,34 +578,56 @@ function generate_text_for_display($text, $uid, $bitfield, $flags, $censor_text
 	$vars = array('text', 'uid', 'bitfield', 'flags', 'censor_text');
 	extract($phpbb_dispatcher->trigger_event('core.modify_text_for_display_before', compact($vars)));
 
-	if ($censor_text)
+	if (preg_match('#^<[rt][ >]#', $text))
 	{
-		$text = censor_text($text);
-	}
+		$renderer = $phpbb_container->get('text_formatter.renderer');
 
-	// Parse bbcode if bbcode uid stored and bbcode enabled
-	if ($uid && ($flags & OPTION_FLAG_BBCODE))
-	{
-		if (!class_exists('bbcode'))
+		// Temporarily switch off viewcensors if applicable
+		$old_censor = $renderer->get_viewcensors();
+		if ($old_censor !== $censor_text)
 		{
-			global $phpbb_root_path, $phpEx;
-			include($phpbb_root_path . 'includes/bbcode.' . $phpEx);
+			$renderer->set_viewcensors($censor_text);
 		}
 
-		if (empty($bbcode))
+		$text = $renderer->render($text);
+
+		// Restore the previous value
+		if ($old_censor !== $censor_text)
 		{
-			$bbcode = new bbcode($bitfield);
+			$renderer->set_viewcensors($old_censor);
 		}
-		else
+	}
+	else
+	{
+		if ($censor_text)
 		{
-			$bbcode->bbcode($bitfield);
+			$text = censor_text($text);
 		}
 
-		$bbcode->bbcode_second_pass($text, $uid);
-	}
+		// Parse bbcode if bbcode uid stored and bbcode enabled
+		if ($uid && ($flags & OPTION_FLAG_BBCODE))
+		{
+			if (!class_exists('bbcode'))
+			{
+				global $phpbb_root_path, $phpEx;
+				include($phpbb_root_path . 'includes/bbcode.' . $phpEx);
+			}
 
-	$text = bbcode_nl2br($text);
-	$text = smiley_text($text, !($flags & OPTION_FLAG_SMILIES));
+			if (empty($bbcode))
+			{
+				$bbcode = new bbcode($bitfield);
+			}
+			else
+			{
+				$bbcode->bbcode($bitfield);
+			}
+
+			$bbcode->bbcode_second_pass($text, $uid);
+		}
+
+		$text = bbcode_nl2br($text);
+		$text = smiley_text($text, !($flags & OPTION_FLAG_SMILIES));
+	}
 
 	/**
 	* Use this event to modify the text after it is parsed
@@ -604,7 +648,7 @@ function generate_text_for_display($text, $uid, $bitfield, $flags, $censor_text
 /**
 * For parsing custom parsed text to be stored within the database.
 * This function additionally returns the uid and bitfield that needs to be stored.
-* Expects $text to be the value directly from request_var() and in it's non-parsed form
+* Expects $text to be the value directly from $request->variable() and in it's non-parsed form
 *
 * @param string $text The text to be replaced with the parsed one
 * @param string $uid The BBCode uid for this parse
@@ -613,10 +657,15 @@ function generate_text_for_display($text, $uid, $bitfield, $flags, $censor_text
 * @param bool $allow_bbcode If BBCode is allowed (i.e. if BBCode is parsed)
 * @param bool $allow_urls If urls is allowed
 * @param bool $allow_smilies If smilies are allowed
+* @param bool $allow_img_bbcode
+* @param bool $allow_flash_bbcode
+* @param bool $allow_quote_bbcode
+* @param bool $allow_url_bbcode
+* @param string $mode Mode to parse text as, e.g. post or sig
 *
 * @return array	An array of string with the errors that occurred while parsing
 */
-function generate_text_for_storage(&$text, &$uid, &$bitfield, &$flags, $allow_bbcode = false, $allow_urls = false, $allow_smilies = false)
+function generate_text_for_storage(&$text, &$uid, &$bitfield, &$flags, $allow_bbcode = false, $allow_urls = false, $allow_smilies = false, $allow_img_bbcode = true, $allow_flash_bbcode = true, $allow_quote_bbcode = true, $allow_url_bbcode = true, $mode = 'post')
 {
 	global $phpbb_root_path, $phpEx, $phpbb_dispatcher;
 
@@ -631,7 +680,13 @@ function generate_text_for_storage(&$text, &$uid, &$bitfield, &$flags, $allow_bb
 	* @var bool		allow_bbcode	Whether or not to parse BBCode
 	* @var bool		allow_urls		Whether or not to parse URLs
 	* @var bool		allow_smilies	Whether or not to parse Smilies
+	* @var bool		allow_img_bbcode	Whether or not to parse the [img] BBCode
+	* @var bool		allow_flash_bbcode	Whether or not to parse the [flash] BBCode
+	* @var bool		allow_quote_bbcode	Whether or not to parse the [quote] BBCode
+	* @var bool		allow_url_bbcode	Whether or not to parse the [url] BBCode
+	* @var string	mode				Mode to parse text as, e.g. post or sig
 	* @since 3.1.0-a1
+	* @changed 3.2.0-a1
 	*/
 	$vars = array(
 		'text',
@@ -641,24 +696,24 @@ function generate_text_for_storage(&$text, &$uid, &$bitfield, &$flags, $allow_bb
 		'allow_bbcode',
 		'allow_urls',
 		'allow_smilies',
+		'allow_img_bbcode',
+		'allow_flash_bbcode',
+		'allow_quote_bbcode',
+		'allow_url_bbcode',
+		'mode',
 	);
 	extract($phpbb_dispatcher->trigger_event('core.modify_text_for_storage_before', compact($vars)));
 
 	$uid = $bitfield = '';
 	$flags = (($allow_bbcode) ? OPTION_FLAG_BBCODE : 0) + (($allow_smilies) ? OPTION_FLAG_SMILIES : 0) + (($allow_urls) ? OPTION_FLAG_LINKS : 0);
 
-	if ($text === '')
-	{
-		return;
-	}
-
 	if (!class_exists('parse_message'))
 	{
 		include($phpbb_root_path . 'includes/message_parser.' . $phpEx);
 	}
 
 	$message_parser = new parse_message($text);
-	$message_parser->parse($allow_bbcode, $allow_urls, $allow_smilies);
+	$message_parser->parse($allow_bbcode, $allow_urls, $allow_smilies, $allow_img_bbcode, $allow_flash_bbcode, $allow_quote_bbcode, $allow_url_bbcode, true, $mode);
 
 	$text = $message_parser->message;
 	$uid = $message_parser->bbcode_uid;
@@ -693,7 +748,7 @@ function generate_text_for_storage(&$text, &$uid, &$bitfield, &$flags, $allow_bb
 */
 function generate_text_for_edit($text, $uid, $flags)
 {
-	global $phpbb_root_path, $phpEx, $phpbb_dispatcher;
+	global $phpbb_dispatcher;
 
 	/**
 	* Use this event to modify the text before it is decoded for editing
@@ -980,7 +1035,7 @@ function bbcode_nl2br($text)
 */
 function smiley_text($text, $force_option = false)
 {
-	global $config, $user, $phpbb_path_helper;
+	global $config, $user, $phpbb_path_helper, $phpbb_dispatcher;
 
 	if ($force_option || !$config['allow_smilies'] || !$user->optionget('viewsmilies'))
 	{
@@ -989,6 +1044,16 @@ function smiley_text($text, $force_option = false)
 	else
 	{
 		$root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $phpbb_path_helper->get_web_root_path();
+
+		/**
+		* Event to override the root_path for smilies
+		*
+		* @event core.smiley_text_root_path
+		* @var string root_path root_path for smilies
+		* @since 3.1.11-RC1
+		*/
+		$vars = array('root_path');
+		extract($phpbb_dispatcher->trigger_event('core.smiley_text_root_path', compact($vars)));
 		return preg_replace('#<!\-\- s(.*?) \-\-><img src="\{SMILIES_PATH\}\/(.*?) \/><!\-\- s\1 \-\->#', '<img class="smilies" src="' . $root_path . $config['smilies_path'] . '/\2 />', $text);
 	}
 }
@@ -999,10 +1064,10 @@ function smiley_text($text, $force_option = false)
 * @param mixed $forum_id The forum id the attachments are displayed in (false if in private message)
 * @param string &$message The post/private message
 * @param array &$attachments The attachments to parse for (inline) display. The attachments array will hold templated data after parsing.
-* @param array &$update_count The attachment counts to be updated - will be filled
+* @param array &$update_count_ary The attachment counts to be updated - will be filled
 * @param bool $preview If set to true the attachments are parsed for preview. Within preview mode the comments are fetched from the given $attachments array and not fetched from the database.
 */
-function parse_attachments($forum_id, &$message, &$attachments, &$update_count, $preview = false)
+function parse_attachments($forum_id, &$message, &$attachments, &$update_count_ary, $preview = false)
 {
 	if (!sizeof($attachments))
 	{
@@ -1089,7 +1154,6 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count,
 		// Some basics...
 		$attachment['extension'] = strtolower(trim($attachment['extension']));
 		$filename = $phpbb_root_path . $config['upload_path'] . '/' . utf8_basename($attachment['physical_filename']);
-		$thumbnail_filename = $phpbb_root_path . $config['upload_path'] . '/thumb_' . utf8_basename($attachment['physical_filename']);
 
 		$upload_icon = '';
 
@@ -1131,7 +1195,6 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count,
 
 		if (!$denied)
 		{
-			$l_downloaded_viewed = $download_link = '';
 			$display_cat = $extensions[$attachment['extension']]['display_cat'];
 
 			if ($display_cat == ATTACHMENT_CATEGORY_IMAGE)
@@ -1192,7 +1255,7 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count,
 						'U_INLINE_LINK'		=> $inline_link,
 					);
 
-					$update_count[] = $attachment['attach_id'];
+					$update_count_ary[] = $attachment['attach_id'];
 				break;
 
 				// Images, but display Thumbnail
@@ -1205,39 +1268,7 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count,
 						'THUMB_IMAGE'		=> $thumbnail_link,
 					);
 
-					$update_count[] = $attachment['attach_id'];
-				break;
-
-				// Windows Media Streams
-				case ATTACHMENT_CATEGORY_WM:
-
-					// Giving the filename directly because within the wm object all variables are in local context making it impossible
-					// to validate against a valid session (all params can differ)
-					// $download_link = $filename;
-
-					$block_array += array(
-						'U_FORUM'		=> generate_board_url(),
-						'ATTACH_ID'		=> $attachment['attach_id'],
-						'S_WM_FILE'		=> true,
-					);
-
-					// Viewed/Heared File ... update the download count
-					$update_count[] = $attachment['attach_id'];
-				break;
-
-				// Real Media Streams
-				case ATTACHMENT_CATEGORY_RM:
-				case ATTACHMENT_CATEGORY_QUICKTIME:
-
-					$block_array += array(
-						'S_RM_FILE'			=> ($display_cat == ATTACHMENT_CATEGORY_RM) ? true : false,
-						'S_QUICKTIME_FILE'	=> ($display_cat == ATTACHMENT_CATEGORY_QUICKTIME) ? true : false,
-						'U_FORUM'			=> generate_board_url(),
-						'ATTACH_ID'			=> $attachment['attach_id'],
-					);
-
-					// Viewed/Heared File ... update the download count
-					$update_count[] = $attachment['attach_id'];
+					$update_count_ary[] = $attachment['attach_id'];
 				break;
 
 				// Macromedia Flash Files
@@ -1252,7 +1283,7 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count,
 					);
 
 					// Viewed/Heared File ... update the download count
-					$update_count[] = $attachment['attach_id'];
+					$update_count_ary[] = $attachment['attach_id'];
 				break;
 
 				default:
@@ -1275,6 +1306,7 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count,
 			);
 		}
 
+		$update_count = $update_count_ary;
 		/**
 		* Use this event to modify the attachment template data.
 		*
@@ -1302,6 +1334,8 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count,
 			'update_count',
 		);
 		extract($phpbb_dispatcher->trigger_event('core.parse_attachments_modify_template_data', compact($vars)));
+		$update_count_ary = $update_count;
+		unset($update_count);
 
 		$template->assign_block_vars('_file', $block_array);
 
@@ -1387,8 +1421,6 @@ function extension_allowed($forum_id, $extension, &$extensions)
 */
 function truncate_string($string, $max_length = 60, $max_store_length = 255, $allow_reply = false, $append = '')
 {
-	$chars = array();
-
 	$strip_reply = false;
 	$stripped = false;
 	if ($allow_reply && strpos($string, 'Re: ') === 0)
--- a/includes/functions_convert.php
+++ b/includes/functions_convert.php
@@ -423,7 +423,7 @@ function remote_avatar_dims()
 
 function import_avatar_gallery($gallery_name = '', $subdirs_as_galleries = false)
 {
-	global $config, $convert, $phpbb_root_path, $user;
+	global $config, $convert, $user;
 
 	$relative_path = empty($convert->convertor['source_path_absolute']);
 
@@ -492,7 +492,7 @@ function import_avatar_gallery($gallery_name = '', $subdirs_as_galleries = false
 
 function import_attachment_files($category_name = '')
 {
-	global $config, $convert, $phpbb_root_path, $db, $user;
+	global $config, $convert, $db, $user;
 
 	$sql = 'SELECT config_value AS upload_path
 		FROM ' . CONFIG_TABLE . "
@@ -590,7 +590,7 @@ function import_attachment($source, $use_target = false)
 		return '';
 	}
 
-	global $convert, $phpbb_root_path, $config, $user;
+	global $convert, $config, $user;
 
 	// check for trailing slash
 	if (rtrim($convert->convertor['upload_path'], '/') === '')
@@ -632,7 +632,7 @@ function import_rank($source, $use_target = false)
 		return '';
 	}
 
-	global $convert, $phpbb_root_path, $config, $user;
+	global $convert, $user;
 
 	if (!isset($convert->convertor['ranks_path']))
 	{
@@ -650,7 +650,7 @@ function import_smiley($source, $use_target = false)
 		return '';
 	}
 
-	global $convert, $phpbb_root_path, $config, $user;
+	global $convert, $user;
 
 	// check for trailing slash
 	if (rtrim($convert->convertor['smilies_path'], '/') === '')
@@ -671,7 +671,7 @@ function import_avatar($source, $use_target = false, $user_id = false)
 		return;
 	}
 
-	global $convert, $phpbb_root_path, $config, $user;
+	global $convert, $config, $user;
 
 	// check for trailing slash
 	if (rtrim($convert->convertor['avatar_path'], '/') === '')
@@ -684,7 +684,7 @@ function import_avatar($source, $use_target = false, $user_id = false)
 		$use_target = $config['avatar_salt'] . '_' . $user_id . '.' . substr(strrchr($source, '.'), 1);
 	}
 
-	$result = _import_check('avatar_path', $source, $use_target);
+	_import_check('avatar_path', $source, $use_target);
 
 	return ((!empty($user_id)) ? $user_id : $use_target) . '.' . substr(strrchr($source, '.'), 1);
 }
@@ -750,7 +750,7 @@ function get_smiley_dim($source, $axis)
 		return $smiley_cache[$source][$axis];
 	}
 
-	global $convert, $phpbb_root_path, $config, $user;
+	global $convert, $user;
 
 	$orig_source = $source;
 
@@ -858,14 +858,12 @@ function get_upload_avatar_dim($source, $axis)
 		return $cachedims[$axis];
 	}
 
-	$orig_source = $source;
-
 	if (substr($source, 0, 7) == 'upload:')
 	{
 		$source = substr($source, 7);
 	}
 
-	global $convert, $phpbb_root_path, $config, $user;
+	global $convert, $user;
 
 	if (!isset($convert->convertor['avatar_path']))
 	{
@@ -907,7 +905,7 @@ function get_gallery_avatar_dim($source, $axis)
 		return $avatar_cache[$source][$axis];
 	}
 
-	global $convert, $phpbb_root_path, $config, $user;
+	global $convert, $user;
 
 	$orig_source = $source;
 
@@ -1122,7 +1120,7 @@ function words_unique(&$words)
 */
 function add_user_group($group_id, $user_id, $group_leader = false)
 {
-	global $convert, $phpbb_root_path, $config, $user, $db;
+	global $db;
 
 	$sql = 'INSERT INTO ' . USER_GROUP_TABLE . ' ' . $db->sql_build_array('INSERT', array(
 		'group_id'		=> $group_id,
@@ -1142,7 +1140,7 @@ function add_user_group($group_id, $user_id, $group_leader = false)
 */
 function user_group_auth($group, $select_query, $use_src_db)
 {
-	global $convert, $phpbb_root_path, $config, $user, $db, $src_db, $same_db;
+	global $convert, $user, $db, $src_db, $same_db;
 
 	if (!in_array($group, array('guests', 'registered', 'registered_coppa', 'global_moderators', 'administrators', 'bots')))
 	{
@@ -1198,7 +1196,7 @@ function get_config()
 		return $convert_config;
 	}
 
-	global $src_db, $same_db, $phpbb_root_path, $config;
+	global $src_db, $same_db;
 	global $convert;
 
 	if ($convert->config_schema['table_format'] != 'file')
@@ -1277,7 +1275,7 @@ function get_config()
 */
 function restore_config($schema)
 {
-	global $db, $config;
+	global $config;
 
 	$convert_config = get_config();
 
@@ -1312,7 +1310,7 @@ function restore_config($schema)
 				$config_value = truncate_string(utf8_htmlspecialchars($config_value), 255, 255, false);
 			}
 
-			set_config($config_name, $config_value);
+			$config->set($config_name, $config_value);
 		}
 	}
 }
@@ -1322,7 +1320,7 @@ function restore_config($schema)
 */
 function update_folder_pm_count()
 {
-	global $db, $convert, $user;
+	global $db;
 
 	$sql = 'SELECT user_id, folder_id, COUNT(msg_id) as num_messages
 		FROM ' . PRIVMSGS_TO_TABLE . '
@@ -1381,7 +1379,7 @@ function extract_variables_from_file($_filename)
 
 function get_path($src_path, $src_url, $test_file)
 {
-	global $config, $phpbb_root_path, $phpEx;
+	global $phpbb_root_path, $phpEx;
 
 	$board_config = get_config();
 
@@ -1492,7 +1490,7 @@ function compare_table($tables, $tablename, &$prefixes)
 */
 function mass_auth($ug_type, $forum_id, $ug_id, $acl_list, $setting = ACL_NO)
 {
-	global $db, $convert, $user, $config;
+	global $db;
 	static $acl_option_ids, $group_ids;
 
 	if (($ug_type == 'group' || $ug_type == 'group_role') && is_string($ug_id))
@@ -1654,8 +1652,6 @@ function mass_auth($ug_type, $forum_id, $ug_id, $acl_list, $setting = ACL_NO)
 						$sql = 'VALUES ' . implode(', ', preg_replace('#^(.*?)$#', '(\1)', $sql_subary));
 					break;
 
-					case 'mssql':
-					case 'sqlite':
 					case 'sqlite3':
 					case 'mssqlnative':
 						$sql = implode(' UNION ALL ', preg_replace('#^(.*?)$#', 'SELECT \1', $sql_subary));
@@ -1968,9 +1964,9 @@ function update_dynamic_config()
 
 	if ($row)
 	{
-		set_config('newest_user_id', $row['user_id'], true);
-		set_config('newest_username', $row['username'], true);
-		set_config('newest_user_colour', $row['user_colour'], true);
+		$config->set('newest_user_id', $row['user_id'], false);
+		$config->set('newest_username', $row['username'], false);
+		$config->set('newest_user_colour', $row['user_colour'], false);
 	}
 
 //	Also do not reset record online user/date. There will be old data or the fresh data from the schema.
@@ -1984,7 +1980,7 @@ function update_dynamic_config()
 	$row = $db->sql_fetchrow($result);
 	$db->sql_freeresult($result);
 
-	set_config('num_posts', (int) $row['stat'], true);
+	$config->set('num_posts', (int) $row['stat'], false);
 
 	$sql = 'SELECT COUNT(topic_id) AS stat
 		FROM ' . TOPICS_TABLE . '
@@ -1993,7 +1989,7 @@ function update_dynamic_config()
 	$row = $db->sql_fetchrow($result);
 	$db->sql_freeresult($result);
 
-	set_config('num_topics', (int) $row['stat'], true);
+	$config->set('num_topics', (int) $row['stat'], false);
 
 	$sql = 'SELECT COUNT(user_id) AS stat
 		FROM ' . USERS_TABLE . '
@@ -2002,20 +1998,20 @@ function update_dynamic_config()
 	$row = $db->sql_fetchrow($result);
 	$db->sql_freeresult($result);
 
-	set_config('num_users', (int) $row['stat'], true);
+	$config->set('num_users', (int) $row['stat'], false);
 
 	$sql = 'SELECT COUNT(attach_id) as stat
 		FROM ' . ATTACHMENTS_TABLE . '
 		WHERE is_orphan = 0';
 	$result = $db->sql_query($sql);
-	set_config('num_files', (int) $db->sql_fetchfield('stat'), true);
+	$config->set('num_files', (int) $db->sql_fetchfield('stat'), false);
 	$db->sql_freeresult($result);
 
 	$sql = 'SELECT SUM(filesize) as stat
 		FROM ' . ATTACHMENTS_TABLE . '
 		WHERE is_orphan = 0';
 	$result = $db->sql_query($sql);
-	set_config('upload_dir_size', (float) $db->sql_fetchfield('stat'), true);
+	$config->set('upload_dir_size', (float) $db->sql_fetchfield('stat'), false);
 	$db->sql_freeresult($result);
 
 	/**
@@ -2039,11 +2035,10 @@ function update_dynamic_config()
 */
 function update_topics_posted()
 {
-	global $db, $config;
+	global $db;
 
 	switch ($db->get_sql_layer())
 	{
-		case 'sqlite':
 		case 'sqlite3':
 			$db->sql_query('DELETE FROM ' . TOPICS_POSTED_TABLE);
 		break;
@@ -2180,7 +2175,7 @@ function fix_empty_primary_groups()
 */
 function remove_invalid_users()
 {
-	global $convert, $db, $phpEx, $phpbb_root_path;
+	global $db, $phpEx, $phpbb_root_path;
 
 	// username_clean is UNIQUE
 	$sql = 'SELECT user_id
@@ -2316,7 +2311,10 @@ function convert_bbcode($message, $convert_size = true, $extended_bbcodes = fals
 
 function copy_file($src, $trg, $overwrite = false, $die_on_failure = true, $source_relative_path = true)
 {
-	global $convert, $phpbb_root_path, $config, $user, $db;
+	global $convert, $phpbb_root_path, $user, $phpbb_filesystem;
+
+	/** @var \phpbb\filesystem\filesystem_interface $filesystem */
+	$filesystem = $phpbb_filesystem;
 
 	if (substr($trg, -1) == '/')
 	{
@@ -2349,7 +2347,7 @@ function copy_file($src, $trg, $overwrite = false, $die_on_failure = true, $sour
 		}
 	}
 
-	if (!phpbb_is_writable($path))
+	if (!$filesystem->is_writable($path))
 	{
 		@chmod($path, 0777);
 	}
@@ -2370,7 +2368,10 @@ function copy_file($src, $trg, $overwrite = false, $die_on_failure = true, $sour
 
 function copy_dir($src, $trg, $copy_subdirs = true, $overwrite = false, $die_on_failure = true, $source_relative_path = true)
 {
-	global $convert, $phpbb_root_path, $config, $user, $db;
+	global $convert, $phpbb_root_path, $config, $user, $phpbb_filesystem;
+
+	/** @var \phpbb\filesystem\filesystem_interface $filesystem */
+	$filesystem = $phpbb_filesystem;
 
 	$dirlist = $filelist = $bad_dirs = array();
 	$src = path($src, $source_relative_path);
@@ -2384,7 +2385,7 @@ function copy_dir($src, $trg, $copy_subdirs = true, $overwrite = false, $die_on_
 		@chmod($trg_path, 0777);
 	}
 
-	if (!phpbb_is_writable($trg_path))
+	if (!$filesystem->is_writable($trg_path))
 	{
 		$bad_dirs[] = path($config['script_path']) . $trg;
 	}
@@ -2451,7 +2452,7 @@ function copy_dir($src, $trg, $copy_subdirs = true, $overwrite = false, $die_on_
 				@chmod($trg_path . $dir, 0777);
 			}
 
-			if (!phpbb_is_writable($trg_path . $dir))
+			if (!$filesystem->is_writable($trg_path . $dir))
 			{
 				$bad_dirs[] = $trg . $dir;
 				$bad_dirs[] = $trg_path . $dir;
@@ -2479,7 +2480,7 @@ function copy_dir($src, $trg, $copy_subdirs = true, $overwrite = false, $die_on_
 
 function relative_base($path, $is_relative = true, $line = false, $file = false)
 {
-	global $convert, $phpbb_root_path, $config, $user, $db;
+	global $convert, $user;
 
 	if (!$is_relative)
 	{
--- a/includes/functions_display.php
+++ b/includes/functions_display.php
@@ -30,10 +30,9 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
 
 	$forum_rows = $subforums = $forum_ids = $forum_ids_moderator = $forum_moderators = $active_forum_ary = array();
 	$parent_id = $visible_forums = 0;
-	$sql_from = '';
 
 	// Mark forums read?
-	$mark_read = request_var('mark', '');
+	$mark_read = $request->variable('mark', '');
 
 	if ($mark_read == 'all')
 	{
@@ -61,9 +60,9 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
 		$redirect = build_url(array('mark', 'hash', 'mark_time'));
 		meta_refresh(3, $redirect);
 
-		if (check_link_hash(request_var('hash', ''), 'global'))
+		if (check_link_hash($request->variable('hash', ''), 'global'))
 		{
-			markread('all', false, false, request_var('mark_time', 0));
+			markread('all', false, false, $request->variable('mark_time', 0));
 
 			if ($request->is_ajax())
 			{
@@ -153,6 +152,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
 	$forum_tracking_info = $valid_categories = array();
 	$branch_root_id = $root_data['forum_id'];
 
+	/* @var $phpbb_content_visibility \phpbb\content_visibility */
 	$phpbb_content_visibility = $phpbb_container->get('content.visibility');
 
 	while ($row = $db->sql_fetchrow($result))
@@ -282,6 +282,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
 			$subforums[$parent_id][$forum_id]['name'] = $row['forum_name'];
 			$subforums[$parent_id][$forum_id]['orig_forum_last_post_time'] = $row['forum_last_post_time'];
 			$subforums[$parent_id][$forum_id]['children'] = array();
+			$subforums[$parent_id][$forum_id]['type'] = $row['forum_type'];
 
 			if (isset($subforums[$parent_id][$row['parent_id']]) && !$row['display_on_index'])
 			{
@@ -341,10 +342,10 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
 	if ($mark_read == 'forums')
 	{
 		$redirect = build_url(array('mark', 'hash', 'mark_time'));
-		$token = request_var('hash', '');
+		$token = $request->variable('hash', '');
 		if (check_link_hash($token, 'global'))
 		{
-			markread('topics', $forum_ids, false, request_var('mark_time', 0));
+			markread('topics', $forum_ids, false, $request->variable('mark_time', 0));
 			$message = sprintf($user->lang['RETURN_FORUM'], '<a href="' . $redirect . '">', '</a>');
 			meta_refresh(3, $redirect);
 
@@ -437,15 +438,14 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
 			*
 			* @event core.display_forums_modify_category_template_vars
 			* @var	array	cat_row			Template data of the 'category'
-			* @var	bool	catless			The flag indicating whether the 'category' has a parent category
 			* @var	bool	last_catless	The flag indicating whether the last forum had a parent category
 			* @var	array	root_data		Array with the root forum data
 			* @var	array	row				The data of the 'category'
 			* @since 3.1.0-RC4
+			* @change 3.1.7-RC1 Removed undefined catless variable
 			*/
 			$vars = array(
 				'cat_row',
-				'catless',
 				'last_catless',
 				'root_data',
 				'row',
@@ -491,6 +491,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
 						'link'		=> append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $subforum_id),
 						'name'		=> $subforum_row['name'],
 						'unread'	=> $subforum_unread,
+						'type'		=> $subforum_row['type'],
 					);
 				}
 				else
@@ -572,6 +573,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
 				'U_SUBFORUM'	=> $subforum['link'],
 				'SUBFORUM_NAME'	=> $subforum['name'],
 				'S_UNREAD'		=> $subforum['unread'],
+				'IS_LINK'		=> $subforum['type'] == FORUM_LINK,
 			);
 		}
 		$s_subforums_list = (string) implode($user->lang['COMMA_SEPARATOR'], $s_subforums_list);
@@ -727,18 +729,18 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
 */
 function generate_forum_rules(&$forum_data)
 {
-	if (!$forum_data['forum_rules'] && !$forum_data['forum_rules_link'])
+	if ($forum_data['forum_rules'])
 	{
-		return;
+		$forum_data['forum_rules'] = generate_text_for_display($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options']);
 	}
 
-	global $template, $phpbb_root_path, $phpEx;
-
-	if ($forum_data['forum_rules'])
+	if (!$forum_data['forum_rules'] && !$forum_data['forum_rules_link'])
 	{
-		$forum_data['forum_rules'] = generate_text_for_display($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options']);
+		return;
 	}
 
+	global $template;
+
 	$template->assign_vars(array(
 		'S_FORUM_RULES'	=> true,
 		'U_FORUM_RULES'	=> $forum_data['forum_rules_link'],
@@ -750,20 +752,20 @@ function generate_forum_rules(&$forum_data)
 * Create forum navigation links for given forum, create parent
 * list if currently null, assign basic forum info to template
 */
-function generate_forum_nav(&$forum_data)
+function generate_forum_nav(&$forum_data_ary)
 {
-	global $db, $user, $template, $auth, $config;
+	global $template, $auth, $config;
 	global $phpEx, $phpbb_root_path, $phpbb_dispatcher;
 
-	if (!$auth->acl_get('f_list', $forum_data['forum_id']))
+	if (!$auth->acl_get('f_list', $forum_data_ary['forum_id']))
 	{
 		return;
 	}
 
-	$navlinks = $navlinks_parents = $forum_template_data = array();
+	$navlinks_parents = $forum_template_data = array();
 
 	// Get forum parents
-	$forum_parents = get_forum_parents($forum_data);
+	$forum_parents = get_forum_parents($forum_data_ary);
 
 	$microdata_attr = 'data-forum-id';
 
@@ -793,23 +795,24 @@ function generate_forum_nav(&$forum_data)
 	}
 
 	$navlinks = array(
-		'S_IS_CAT'		=> ($forum_data['forum_type'] == FORUM_CAT) ? true : false,
-		'S_IS_LINK'		=> ($forum_data['forum_type'] == FORUM_LINK) ? true : false,
-		'S_IS_POST'		=> ($forum_data['forum_type'] == FORUM_POST) ? true : false,
-		'FORUM_NAME'	=> $forum_data['forum_name'],
-		'FORUM_ID'		=> $forum_data['forum_id'],
-		'MICRODATA'		=> $microdata_attr . '="' . $forum_data['forum_id'] . '"',
-		'U_VIEW_FORUM'	=> append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_data['forum_id']),
+		'S_IS_CAT'		=> ($forum_data_ary['forum_type'] == FORUM_CAT) ? true : false,
+		'S_IS_LINK'		=> ($forum_data_ary['forum_type'] == FORUM_LINK) ? true : false,
+		'S_IS_POST'		=> ($forum_data_ary['forum_type'] == FORUM_POST) ? true : false,
+		'FORUM_NAME'	=> $forum_data_ary['forum_name'],
+		'FORUM_ID'		=> $forum_data_ary['forum_id'],
+		'MICRODATA'		=> $microdata_attr . '="' . $forum_data_ary['forum_id'] . '"',
+		'U_VIEW_FORUM'	=> append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_data_ary['forum_id']),
 	);
 
 	$forum_template_data = array(
-		'FORUM_ID' 		=> $forum_data['forum_id'],
-		'FORUM_NAME'	=> $forum_data['forum_name'],
-		'FORUM_DESC'	=> generate_text_for_display($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_bitfield'], $forum_data['forum_desc_options']),
+		'FORUM_ID' 		=> $forum_data_ary['forum_id'],
+		'FORUM_NAME'	=> $forum_data_ary['forum_name'],
+		'FORUM_DESC'	=> generate_text_for_display($forum_data_ary['forum_desc'], $forum_data_ary['forum_desc_uid'], $forum_data_ary['forum_desc_bitfield'], $forum_data_ary['forum_desc_options']),
 
-		'S_ENABLE_FEEDS_FORUM'	=> ($config['feed_forum'] && $forum_data['forum_type'] == FORUM_POST && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $forum_data['forum_options'])) ? true : false,
+		'S_ENABLE_FEEDS_FORUM'	=> ($config['feed_forum'] && $forum_data_ary['forum_type'] == FORUM_POST && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $forum_data_ary['forum_options'])) ? true : false,
 	);
 
+	$forum_data = $forum_data_ary;
 	/**
 	* Event to modify the navlinks text
 	*
@@ -829,6 +832,8 @@ function generate_forum_nav(&$forum_data)
 		'navlinks',
 	);
 	extract($phpbb_dispatcher->trigger_event('core.generate_forum_nav', compact($vars)));
+	$forum_data_ary = $forum_data;
+	unset($forum_data);
 
 	$template->assign_block_vars_array('navlinks', $navlinks_parents);
 	$template->assign_block_vars('navlinks', $navlinks);
@@ -884,7 +889,8 @@ function get_forum_parents(&$forum_data)
 */
 function get_moderators(&$forum_moderators, $forum_id = false)
 {
-	global $config, $template, $db, $phpbb_root_path, $phpEx, $user, $auth;
+	global $db, $phpbb_root_path, $phpEx, $user, $auth;
+	global $phpbb_container;
 
 	$forum_id_ary = array();
 
@@ -920,6 +926,9 @@ function get_moderators(&$forum_moderators, $forum_id = false)
 		'WHERE'		=> 'm.display_on_index = 1',
 	);
 
+	/** @var \phpbb\group\helper $group_helper */
+	$group_helper = $phpbb_container->get('group_helper');
+
 	// We query every forum here because for caching we should not have any parameter.
 	$sql = $db->sql_build_query('SELECT', $sql_array);
 	$result = $db->sql_query($sql, 3600);
@@ -939,7 +948,7 @@ function get_moderators(&$forum_moderators, $forum_id = false)
 		}
 		else
 		{
-			$group_name = (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']);
+			$group_name = $group_helper->get_name($row['group_name']);
 
 			if ($user->data['user_id'] != ANONYMOUS && !$auth->acl_get('u_viewprofile'))
 			{
@@ -996,8 +1005,6 @@ function topic_status(&$topic_row, $replies, $unread_topic, &$folder_img, &$fold
 {
 	global $user, $config;
 
-	$folder = $folder_new = '';
-
 	if ($topic_row['topic_status'] == ITEM_MOVED)
 	{
 		$topic_type = $user->lang['VIEW_TOPIC_MOVED'];
@@ -1072,7 +1079,7 @@ function display_custom_bbcodes()
 	global $db, $template, $user, $phpbb_dispatcher;
 
 	// Start counting from 22 for the bbcode ids (every bbcode takes two ids - opening/closing)
-	$num_predefined_bbcodes = 22;
+	$num_predefined_bbcodes = NUM_PREDEFINED_BBCODES;
 
 	$sql_ary = array(
 		'SELECT'	=> 'b.bbcode_id, b.bbcode_tag, b.bbcode_helpline',
@@ -1143,46 +1150,27 @@ function display_custom_bbcodes()
 
 /**
 * Display reasons
+*
+* @deprecated 3.2.0-dev
 */
 function display_reasons($reason_id = 0)
 {
-	global $db, $user, $template;
-
-	$sql = 'SELECT *
-		FROM ' . REPORTS_REASONS_TABLE . '
-		ORDER BY reason_order ASC';
-	$result = $db->sql_query($sql);
-
-	while ($row = $db->sql_fetchrow($result))
-	{
-		// If the reason is defined within the language file, we will use the localized version, else just use the database entry...
-		if (isset($user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])]) && isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])]))
-		{
-			$row['reason_description'] = $user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])];
-			$row['reason_title'] = $user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])];
-		}
+	global $phpbb_container;
 
-		$template->assign_block_vars('reason', array(
-			'ID'			=> $row['reason_id'],
-			'TITLE'			=> $row['reason_title'],
-			'DESCRIPTION'	=> $row['reason_description'],
-			'S_SELECTED'	=> ($row['reason_id'] == $reason_id) ? true : false)
-		);
-	}
-	$db->sql_freeresult($result);
+	$phpbb_container->get('phpbb.report.report_reason_list_provider')->display_reasons($reason_id);
 }
 
 /**
 * Display user activity (action forum/topic)
 */
-function display_user_activity(&$userdata)
+function display_user_activity(&$userdata_ary)
 {
 	global $auth, $template, $db, $user;
 	global $phpbb_root_path, $phpEx;
 	global $phpbb_container, $phpbb_dispatcher;
 
 	// Do not display user activity for users having more than 5000 posts...
-	if ($userdata['user_posts'] > 5000)
+	if ($userdata_ary['user_posts'] > 5000)
 	{
 		return;
 	}
@@ -1203,12 +1191,13 @@ function display_user_activity(&$userdata)
 	$active_f_row = $active_t_row = array();
 	if (!empty($forum_ary))
 	{
+		/* @var $phpbb_content_visibility \phpbb\content_visibility */
 		$phpbb_content_visibility = $phpbb_container->get('content.visibility');
 
 		// Obtain active forum
 		$sql = 'SELECT forum_id, COUNT(post_id) AS num_posts
 			FROM ' . POSTS_TABLE . '
-			WHERE poster_id = ' . $userdata['user_id'] . '
+			WHERE poster_id = ' . $userdata_ary['user_id'] . '
 				AND post_postcount = 1
 				AND ' . $phpbb_content_visibility->get_forums_visibility_sql('post', $forum_ary) . '
 			GROUP BY forum_id
@@ -1230,7 +1219,7 @@ function display_user_activity(&$userdata)
 		// Obtain active topic
 		$sql = 'SELECT topic_id, COUNT(post_id) AS num_posts
 			FROM ' . POSTS_TABLE . '
-			WHERE poster_id = ' . $userdata['user_id'] . '
+			WHERE poster_id = ' . $userdata_ary['user_id'] . '
 				AND post_postcount = 1
 				AND ' . $phpbb_content_visibility->get_forums_visibility_sql('post', $forum_ary) . '
 			GROUP BY topic_id
@@ -1250,6 +1239,7 @@ function display_user_activity(&$userdata)
 		}
 	}
 
+	$userdata = $userdata_ary;
 	/**
 	* Alter list of forums and topics to display as active
 	*
@@ -1261,9 +1251,11 @@ function display_user_activity(&$userdata)
 	*/
 	$vars = array('userdata', 'active_f_row', 'active_t_row');
 	extract($phpbb_dispatcher->trigger_event('core.display_user_activity_modify_actives', compact($vars)));
+	$userdata_ary = $userdata;
+	unset($userdata);
 
-	$userdata['active_t_row'] = $active_t_row;
-	$userdata['active_f_row'] = $active_f_row;
+	$userdata_ary['active_t_row'] = $active_t_row;
+	$userdata_ary['active_f_row'] = $active_f_row;
 
 	$active_f_name = $active_f_id = $active_f_count = $active_f_pct = '';
 	if (!empty($active_f_row['num_posts']))
@@ -1271,7 +1263,7 @@ function display_user_activity(&$userdata)
 		$active_f_name = $active_f_row['forum_name'];
 		$active_f_id = $active_f_row['forum_id'];
 		$active_f_count = $active_f_row['num_posts'];
-		$active_f_pct = ($userdata['user_posts']) ? ($active_f_count / $userdata['user_posts']) * 100 : 0;
+		$active_f_pct = ($userdata_ary['user_posts']) ? ($active_f_count / $userdata_ary['user_posts']) * 100 : 0;
 	}
 
 	$active_t_name = $active_t_id = $active_t_count = $active_t_pct = '';
@@ -1280,10 +1272,10 @@ function display_user_activity(&$userdata)
 		$active_t_name = $active_t_row['topic_title'];
 		$active_t_id = $active_t_row['topic_id'];
 		$active_t_count = $active_t_row['num_posts'];
-		$active_t_pct = ($userdata['user_posts']) ? ($active_t_count / $userdata['user_posts']) * 100 : 0;
+		$active_t_pct = ($userdata_ary['user_posts']) ? ($active_t_count / $userdata_ary['user_posts']) * 100 : 0;
 	}
 
-	$l_active_pct = ($userdata['user_id'] != ANONYMOUS && $userdata['user_id'] == $user->data['user_id']) ? $user->lang['POST_PCT_ACTIVE_OWN'] : $user->lang['POST_PCT_ACTIVE'];
+	$l_active_pct = ($userdata_ary['user_id'] != ANONYMOUS && $userdata_ary['user_id'] == $user->data['user_id']) ? $user->lang['POST_PCT_ACTIVE_OWN'] : $user->lang['POST_PCT_ACTIVE'];
 
 	$template->assign_vars(array(
 		'ACTIVE_FORUM'			=> $active_f_name,
@@ -1303,7 +1295,7 @@ function display_user_activity(&$userdata)
 */
 function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id, $notify_status = 'unset', $start = 0, $item_title = '')
 {
-	global $template, $db, $user, $phpEx, $start, $phpbb_root_path;
+	global $db, $user, $phpEx, $start, $phpbb_root_path;
 	global $request;
 
 	$table_sql = ($mode == 'forum') ? FORUMS_WATCH_TABLE : TOPICS_WATCH_TABLE;
@@ -1334,8 +1326,8 @@ function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id,
 		{
 			if (isset($_GET['unwatch']))
 			{
-				$uid = request_var('uid', 0);
-				$token = request_var('hash', '');
+				$uid = $request->variable('uid', 0);
+				$token = $request->variable('hash', '');
 
 				if ($token && check_link_hash($token, "{$mode}_$match_id") || confirm_box(true))
 				{
@@ -1408,8 +1400,8 @@ function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id,
 		{
 			if (isset($_GET['watch']))
 			{
-				$uid = request_var('uid', 0);
-				$token = request_var('hash', '');
+				$uid = $request->variable('uid', 0);
+				$token = $request->variable('hash', '');
 
 				if ($token && check_link_hash($token, "{$mode}_$match_id") || confirm_box(true))
 				{
@@ -1554,6 +1546,23 @@ function phpbb_get_user_rank($user_data, $user_posts)
 		}
 	}
 
+	/**
+	* Modify a user's rank before displaying
+	*
+	* @event core.get_user_rank_after
+	* @var	array	user_data		Array with user's data
+	* @var	int		user_posts		User_posts to change
+	* @var	array	user_rank_data	User rank data
+	* @since 3.1.11-RC1
+	*/
+
+	$vars = array(
+		'user_data',
+		'user_posts',
+		'user_rank_data',
+	);
+	extract($phpbb_dispatcher->trigger_event('core.get_user_rank_after', compact($vars)));
+
 	return $user_rank_data;
 }
 
--- a/includes/functions_download.php
+++ b/includes/functions_download.php
@@ -124,7 +124,7 @@ function wrap_img_in_html($src, $title)
 */
 function send_file_to_browser($attachment, $upload_dir, $category)
 {
-	global $user, $db, $config, $phpbb_root_path;
+	global $user, $db, $phpbb_dispatcher, $phpbb_root_path, $request;
 
 	$filename = $phpbb_root_path . $upload_dir . '/' . $attachment['physical_filename'];
 
@@ -149,6 +149,26 @@ function send_file_to_browser($attachment, $upload_dir, $category)
 	// Now send the File Contents to the Browser
 	$size = @filesize($filename);
 
+	/**
+	* Event to alter attachment before it is sent to browser.
+	*
+	* @event core.send_file_to_browser_before
+	* @var	array	attachment	Attachment data
+	* @var	string	upload_dir	Relative path of upload directory
+	* @var	int		category	Attachment category
+	* @var	string	filename	Path to file, including filename
+	* @var	int		size		File size
+	* @since 3.1.11-RC1
+	*/
+	$vars = array(
+		'attachment',
+		'upload_dir',
+		'category',
+		'filename',
+		'size',
+	);
+	extract($phpbb_dispatcher->trigger_event('core.send_file_to_browser_before', compact($vars)));
+
 	// To correctly display further errors we need to make sure we are using the correct headers for both (unsetting content-length may not work)
 
 	// Check if headers already sent or not able to get the file contents.
@@ -186,7 +206,7 @@ function send_file_to_browser($attachment, $upload_dir, $category)
 		header('X-Content-Type-Options: nosniff');
 	}
 
-	if ($category == ATTACHMENT_CATEGORY_FLASH && request_var('view', 0) === 1)
+	if ($category == ATTACHMENT_CATEGORY_FLASH && $request->variable('view', 0) === 1)
 	{
 		// We use content-disposition: inline for flash files and view=1 to let it correctly play with flash player 10 - any other disposition will fail to play inline
 		header('Content-Disposition: inline');
@@ -254,11 +274,21 @@ function send_file_to_browser($attachment, $upload_dir, $category)
 				send_status_line(206, 'Partial Content');
 				header('Content-Range: bytes ' . $range['byte_pos_start'] . '-' . $range['byte_pos_end'] . '/' . $range['bytes_total']);
 				header('Content-Length: ' . $range['bytes_requested']);
-			}
 
-			while (!feof($fp))
+				// First read chunks
+				while (!feof($fp) && ftell($fp) < $range['byte_pos_end'] - 8192)
+				{
+					echo fread($fp, 8192);
+				}
+				// Then, read the remainder
+				echo fread($fp, $range['bytes_requested'] % 8192);
+			}
+			else
 			{
-				echo fread($fp, 8192);
+				while (!feof($fp))
+				{
+					echo fread($fp, 8192);
+				}
 			}
 			fclose($fp);
 		}
@@ -529,6 +559,9 @@ function phpbb_find_range_request()
 */
 function phpbb_parse_range_request($request_array, $filesize)
 {
+	$first_byte_pos	= -1;
+	$last_byte_pos	= -1;
+
 	// Go through all ranges
 	foreach ($request_array as $range_string)
 	{
@@ -540,62 +573,61 @@ function phpbb_parse_range_request($request_array, $filesize)
 			continue;
 		}
 
+		// Substitute defaults
 		if ($range[0] === '')
 		{
-			// Return last $range[1] bytes.
-
-			if (!$range[1])
-			{
-				continue;
-			}
+			$range[0] = 0;
+		}
 
-			if ($range[1] >= $filesize)
-			{
-				return false;
-			}
+		if ($range[1] === '')
+		{
+			$range[1] = $filesize - 1;
+		}
 
-			$first_byte_pos	= $filesize - (int) $range[1];
-			$last_byte_pos	= $filesize - 1;
+		if ($last_byte_pos >= 0 && $last_byte_pos + 1 != $range[0])
+		{
+			// We only support contiguous ranges, no multipart stuff :(
+			return false;
 		}
-		else
+
+		if ($range[1] && $range[1] < $range[0])
 		{
-			// Return bytes from $range[0] to $range[1]
+			// The requested range contains 0 bytes.
+			continue;
+		}
 
+		// Return bytes from $range[0] to $range[1]
+		if ($first_byte_pos < 0)
+		{
 			$first_byte_pos	= (int) $range[0];
-			$last_byte_pos	= (int) $range[1];
-
-			if ($last_byte_pos && $last_byte_pos < $first_byte_pos)
-			{
-				// The requested range contains 0 bytes.
-				continue;
-			}
+		}
 
-			if ($first_byte_pos >= $filesize)
-			{
-				// Requested range not satisfiable
-				return false;
-			}
+		$last_byte_pos	= (int) $range[1];
 
-			// Adjust last-byte-pos if it is absent or greater than the content.
-			if ($range[1] === '' || $last_byte_pos >= $filesize)
-			{
-				$last_byte_pos = $filesize - 1;
-			}
+		if ($first_byte_pos >= $filesize)
+		{
+			// Requested range not satisfiable
+			return false;
 		}
 
-		// We currently do not support range requests that end before the end of the file
-		if ($last_byte_pos != $filesize - 1)
+		// Adjust last-byte-pos if it is absent or greater than the content.
+		if ($range[1] === '' || $last_byte_pos >= $filesize)
 		{
-			continue;
+			$last_byte_pos = $filesize - 1;
 		}
+	}
 
-		return array(
-			'byte_pos_start'	=> $first_byte_pos,
-			'byte_pos_end'		=> $last_byte_pos,
-			'bytes_requested'	=> $last_byte_pos - $first_byte_pos + 1,
-			'bytes_total'		=> $filesize,
-		);
+	if ($first_byte_pos < 0 || $last_byte_pos < 0)
+	{
+		return false;
 	}
+
+	return array(
+		'byte_pos_start'	=> $first_byte_pos,
+		'byte_pos_end'		=> $last_byte_pos,
+		'bytes_requested'	=> $last_byte_pos - $first_byte_pos + 1,
+		'bytes_total'		=> $filesize,
+	);
 }
 
 /**
@@ -677,6 +709,8 @@ function phpbb_download_handle_forum_auth($db, $auth, $topic_id)
 */
 function phpbb_download_handle_pm_auth($db, $auth, $user_id, $msg_id)
 {
+	global $phpbb_dispatcher;
+
 	if (!$auth->acl_get('u_pm_download'))
 	{
 		send_status_line(403, 'Forbidden');
@@ -685,6 +719,18 @@ function phpbb_download_handle_pm_auth($db, $auth, $user_id, $msg_id)
 
 	$allowed = phpbb_download_check_pm_auth($db, $user_id, $msg_id);
 
+	/**
+	* Event to modify PM attachments download auth
+	*
+	* @event core.modify_pm_attach_download_auth
+	* @var	bool	allowed		Whether the user is allowed to download from that PM or not
+	* @var	int		msg_id		The id of the PM to download from
+	* @var	int		user_id		The user id for auth check
+	* @since 3.1.11-RC1
+	*/
+	$vars = array('allowed', 'msg_id', 'user_id');
+	extract($phpbb_dispatcher->trigger_event('core.modify_pm_attach_download_auth', compact($vars)));
+
 	if (!$allowed)
 	{
 		send_status_line(403, 'Forbidden');
--- a/includes/functions_jabber.php
+++ b/includes/functions_jabber.php
@@ -87,8 +87,7 @@ class jabber
 	*/
 	static public function can_use_ssl()
 	{
-		// Will not work with PHP >= 5.2.1 or < 5.2.3RC2 until timeout problem with ssl hasn't been fixed (http://bugs.php.net/41236)
-		return ((version_compare(PHP_VERSION, '5.2.1', '<') || version_compare(PHP_VERSION, '5.2.3RC2', '>=')) && @extension_loaded('openssl')) ? true : false;
+		return @extension_loaded('openssl');
 	}
 
 	/**
--- a/includes/functions_mcp.php
+++ b/includes/functions_mcp.php
@@ -301,6 +301,7 @@ function phpbb_get_forum_data($forum_id, $acl_list = 'f_list', $read_tracking =
 		WHERE " . $db->sql_in_set('f.forum_id', $forum_id);
 	$result = $db->sql_query($sql);
 
+	/* @var $phpbb_content_visibility \phpbb\content_visibility */
 	$phpbb_content_visibility = $phpbb_container->get('content.visibility');
 
 	while ($row = $db->sql_fetchrow($result))
@@ -366,12 +367,12 @@ function phpbb_get_pm_data($pm_ids)
 * $mode reports and reports_closed: the $where parameters uses aliases p for posts table and r for report table
 * $mode unapproved_posts: the $where parameters uses aliases p for posts table and t for topic table
 */
-function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by_sql, &$sort_order_sql, &$total, $forum_id = 0, $topic_id = 0, $where_sql = 'WHERE')
+function phpbb_mcp_sorting($mode, &$sort_days_val, &$sort_key_val, &$sort_dir_val, &$sort_by_sql_ary, &$sort_order_sql, &$total_val, $forum_id = 0, $topic_id = 0, $where_sql = 'WHERE')
 {
-	global $db, $user, $auth, $template, $phpbb_dispatcher;
+	global $db, $user, $auth, $template, $request, $phpbb_dispatcher;
 
-	$sort_days = request_var('st', 0);
-	$min_time = ($sort_days) ? time() - ($sort_days * 86400) : 0;
+	$sort_days_val = $request->variable('st', 0);
+	$min_time = ($sort_days_val) ? time() - ($sort_days_val * 86400) : 0;
 
 	switch ($mode)
 	{
@@ -511,8 +512,8 @@ function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by
 			break;
 	}
 
-	$sort_key = request_var('sk', $default_key);
-	$sort_dir = request_var('sd', $default_dir);
+	$sort_key_val = $request->variable('sk', $default_key);
+	$sort_dir_val = $request->variable('sd', $default_dir);
 	$sort_dir_text = array('a' => $user->lang['ASCENDING'], 'd' => $user->lang['DESCENDING']);
 
 	switch ($type)
@@ -521,41 +522,46 @@ function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by
 			$limit_days = array(0 => $user->lang['ALL_TOPICS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 			$sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 'tt' => $user->lang['TOPIC_TIME'], 'r' => $user->lang['REPLIES'], 's' => $user->lang['SUBJECT'], 'v' => $user->lang['VIEWS']);
 
-			$sort_by_sql = array('a' => 't.topic_first_poster_name', 't' => array('t.topic_last_post_time', 't.topic_last_post_id'), 'tt' => 't.topic_time', 'r' => (($auth->acl_get('m_approve', $forum_id)) ? 't.topic_posts_approved + t.topic_posts_unapproved + t.topic_posts_softdeleted' : 't.topic_posts_approved'), 's' => 't.topic_title', 'v' => 't.topic_views');
+			$sort_by_sql_ary = array('a' => 't.topic_first_poster_name', 't' => array('t.topic_last_post_time', 't.topic_last_post_id'), 'tt' => 't.topic_time', 'r' => (($auth->acl_get('m_approve', $forum_id)) ? 't.topic_posts_approved + t.topic_posts_unapproved + t.topic_posts_softdeleted' : 't.topic_posts_approved'), 's' => 't.topic_title', 'v' => 't.topic_views');
 			$limit_time_sql = ($min_time) ? "AND t.topic_last_post_time >= $min_time" : '';
 			break;
 
 		case 'posts':
 			$limit_days = array(0 => $user->lang['ALL_POSTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 			$sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 's' => $user->lang['SUBJECT']);
-			$sort_by_sql = array('a' => 'u.username_clean', 't' => array('p.post_time', 'p.post_id'), 's' => 'p.post_subject');
+			$sort_by_sql_ary = array('a' => 'u.username_clean', 't' => array('p.post_time', 'p.post_id'), 's' => 'p.post_subject');
 			$limit_time_sql = ($min_time) ? "AND p.post_time >= $min_time" : '';
 			break;
 
 		case 'reports':
 			$limit_days = array(0 => $user->lang['ALL_REPORTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 			$sort_by_text = array('a' => $user->lang['AUTHOR'], 'r' => $user->lang['REPORTER'], 'p' => $user->lang['POST_TIME'], 't' => $user->lang['REPORT_TIME'], 's' => $user->lang['SUBJECT']);
-			$sort_by_sql = array('a' => 'u.username_clean', 'r' => 'ru.username', 'p' => array('p.post_time', 'p.post_id'), 't' => 'r.report_time', 's' => 'p.post_subject');
+			$sort_by_sql_ary = array('a' => 'u.username_clean', 'r' => 'ru.username', 'p' => array('p.post_time', 'p.post_id'), 't' => 'r.report_time', 's' => 'p.post_subject');
 			break;
 
 		case 'pm_reports':
 			$limit_days = array(0 => $user->lang['ALL_REPORTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 			$sort_by_text = array('a' => $user->lang['AUTHOR'], 'r' => $user->lang['REPORTER'], 'p' => $user->lang['POST_TIME'], 't' => $user->lang['REPORT_TIME'], 's' => $user->lang['SUBJECT']);
-			$sort_by_sql = array('a' => 'u.username_clean', 'r' => 'ru.username', 'p' => 'p.message_time', 't' => 'r.report_time', 's' => 'p.message_subject');
+			$sort_by_sql_ary = array('a' => 'u.username_clean', 'r' => 'ru.username', 'p' => 'p.message_time', 't' => 'r.report_time', 's' => 'p.message_subject');
 			break;
 
 		case 'logs':
 			$limit_days = array(0 => $user->lang['ALL_ENTRIES'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 			$sort_by_text = array('u' => $user->lang['SORT_USERNAME'], 't' => $user->lang['SORT_DATE'], 'i' => $user->lang['SORT_IP'], 'o' => $user->lang['SORT_ACTION']);
 
-			$sort_by_sql = array('u' => 'u.username_clean', 't' => 'l.log_time', 'i' => 'l.log_ip', 'o' => 'l.log_operation');
+			$sort_by_sql_ary = array('u' => 'u.username_clean', 't' => 'l.log_time', 'i' => 'l.log_ip', 'o' => 'l.log_operation');
 			$limit_time_sql = ($min_time) ? "AND l.log_time >= $min_time" : '';
 			break;
 	}
 
 	// Default total to -1 to allow editing by the event
-	$total = -1;
+	$total_val = -1;
 
+	$sort_by_sql = $sort_by_sql_ary;
+	$sort_days = $sort_days_val;
+	$sort_dir = $sort_dir_val;
+	$sort_key = $sort_key_val;
+	$total = $total_val;
 	/**
 	* This event allows you to control the SQL query used to get the total number
 	* of reports the user can access.
@@ -602,25 +608,35 @@ function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by
 		'where_sql',
 	);
 	extract($phpbb_dispatcher->trigger_event('core.mcp_sorting_query_before', compact($vars)));
-
-	if (!isset($sort_by_sql[$sort_key]))
+	$sort_by_sql_ary = $sort_by_sql;
+	$sort_days_val = $sort_days;
+	$sort_key_val = $sort_key;
+	$sort_dir_val = $sort_dir;
+	$total_val = $total;
+	unset($sort_by_sql);
+	unset($sort_days);
+	unset($sort_key);
+	unset($sort_dir);
+	unset($total);
+
+	if (!isset($sort_by_sql_ary[$sort_key_val]))
 	{
-		$sort_key = $default_key;
+		$sort_key_val = $default_key;
 	}
 
-	$direction = ($sort_dir == 'd') ? 'DESC' : 'ASC';
+	$direction = ($sort_dir_val == 'd') ? 'DESC' : 'ASC';
 
-	if (is_array($sort_by_sql[$sort_key]))
+	if (is_array($sort_by_sql_ary[$sort_key_val]))
 	{
-		$sort_order_sql = implode(' ' . $direction . ', ', $sort_by_sql[$sort_key]) . ' ' . $direction;
+		$sort_order_sql = implode(' ' . $direction . ', ', $sort_by_sql_ary[$sort_key_val]) . ' ' . $direction;
 	}
 	else
 	{
-		$sort_order_sql = $sort_by_sql[$sort_key] . ' ' . $direction;
+		$sort_order_sql = $sort_by_sql_ary[$sort_key_val] . ' ' . $direction;
 	}
 
 	$s_limit_days = $s_sort_key = $s_sort_dir = $sort_url = '';
-	gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $sort_url);
+	gen_sort_selects($limit_days, $sort_by_text, $sort_days_val, $sort_key_val, $sort_dir_val, $s_limit_days, $s_sort_key, $s_sort_dir, $sort_url);
 
 	$template->assign_vars(array(
 			'S_SELECT_SORT_DIR'		=> $s_sort_dir,
@@ -628,15 +644,15 @@ function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by
 			'S_SELECT_SORT_DAYS'	=> $s_limit_days)
 	);
 
-	if (($sort_days && $mode != 'viewlogs') || in_array($mode, array('reports', 'unapproved_topics', 'unapproved_posts', 'deleted_topics', 'deleted_posts')) || $where_sql != 'WHERE')
+	if (($sort_days_val && $mode != 'viewlogs') || in_array($mode, array('reports', 'unapproved_topics', 'unapproved_posts', 'deleted_topics', 'deleted_posts')) || $where_sql != 'WHERE')
 	{
 		$result = $db->sql_query($sql);
-		$total = (int) $db->sql_fetchfield('total');
+		$total_val = (int) $db->sql_fetchfield('total');
 		$db->sql_freeresult($result);
 	}
-	else if ($total < -1)
+	else if ($total_val < -1)
 	{
-		$total = -1;
+		$total_val = -1;
 	}
 }
 
--- a/includes/functions_messenger.php
+++ b/includes/functions_messenger.php
@@ -33,8 +33,6 @@ class messenger
 	/** @var \phpbb\template\template */
 	protected $template;
 
-	var $eol = "\n";
-
 	/**
 	* Constructor
 	*/
@@ -44,10 +42,6 @@ class messenger
 
 		$this->use_queue = (!$config['email_package_size']) ? false : $use_queue;
 		$this->subject = '';
-
-		// Determine EOL character (\n for UNIX, \r\n for Windows and \r for Mac)
-		$this->eol = (!defined('PHP_EOL')) ? (($eol = strtolower(substr(PHP_OS, 0, 3))) == 'win') ? "\r\n" : (($eol == 'mac') ? "\r" : "\n") : PHP_EOL;
-		$this->eol = (!$this->eol) ? "\n" : $this->eol;
 	}
 
 	/**
@@ -212,7 +206,7 @@ class messenger
 	*/
 	function template($template_file, $template_lang = '', $template_path = '', $template_dir_prefix = '')
 	{
-		global $config, $phpbb_root_path, $phpEx, $user, $phpbb_extension_manager;
+		global $config, $phpbb_root_path, $user;
 
 		$template_dir_prefix = (!$template_dir_prefix || $template_dir_prefix[0] === '/') ? $template_dir_prefix : '/' . $template_dir_prefix;
 
@@ -379,7 +373,7 @@ class messenger
 	*/
 	function error($type, $msg)
 	{
-		global $user, $phpEx, $phpbb_root_path, $config, $request;
+		global $user, $config, $request, $phpbb_log;
 
 		// Session doesn't exist, create it
 		if (!isset($user->session_id) || $user->session_id === '')
@@ -389,7 +383,6 @@ class messenger
 
 		$calling_page = htmlspecialchars_decode($request->server('PHP_SELF'));
 
-		$message = '';
 		switch ($type)
 		{
 			case 'EMAIL':
@@ -402,7 +395,7 @@ class messenger
 		}
 
 		$message .= '<br /><em>' . htmlspecialchars($calling_page) . '</em><br /><br />' . $msg . '<br />';
-		add_log('critical', 'LOG_ERROR_' . $type, $message);
+		$phpbb_log->add('critical', $user->data['user_id'], $user->ip, 'LOG_ERROR_' . $type, false, array($message));
 	}
 
 	/**
@@ -438,7 +431,7 @@ class messenger
 	*/
 	function build_header($to, $cc, $bcc)
 	{
-		global $config;
+		global $config, $phpbb_dispatcher;
 
 		// We could use keys here, but we won't do this for 3.0.x to retain backwards compatibility
 		$headers = array();
@@ -470,6 +463,16 @@ class messenger
 		$headers[] = 'X-MimeOLE: phpBB3';
 		$headers[] = 'X-phpBB-Origin: phpbb://' . str_replace(array('http://', 'https://'), array('', ''), generate_board_url());
 
+		/**
+		* Event to modify email header entries
+		*
+		* @event core.modify_email_headers
+		* @var	array	headers	Array containing email header entries
+		* @since 3.1.11-RC1
+		*/
+		$vars = array('headers');
+		extract($phpbb_dispatcher->trigger_event('core.modify_email_headers', compact($vars)));
+
 		if (sizeof($this->extra_headers))
 		{
 			$headers = array_merge($headers, $this->extra_headers);
@@ -483,7 +486,7 @@ class messenger
 	*/
 	function msg_email()
 	{
-		global $config, $user;
+		global $config;
 
 		if (empty($config['email_enable']))
 		{
@@ -521,7 +524,7 @@ class messenger
 			$this->from = $board_contact;
 		}
 
-		$encode_eol = ($config['smtp_delivery']) ? "\r\n" : $this->eol;
+		$encode_eol = ($config['smtp_delivery']) ? "\r\n" : PHP_EOL;
 
 		// Build to, cc and bcc strings
 		$to = $cc = $bcc = '';
@@ -553,7 +556,7 @@ class messenger
 			}
 			else
 			{
-				$result = phpbb_mail($mail_to, $this->subject, $this->msg, $headers, $this->eol, $err_msg);
+				$result = phpbb_mail($mail_to, $this->subject, $this->msg, $headers, PHP_EOL, $err_msg);
 			}
 
 			if (!$result)
@@ -581,7 +584,7 @@ class messenger
 	*/
 	function msg_jabber()
 	{
-		global $config, $db, $user, $phpbb_root_path, $phpEx;
+		global $config, $user, $phpbb_root_path, $phpEx;
 
 		if (empty($config['jab_enable']) || empty($config['jab_host']) || empty($config['jab_username']) || empty($config['jab_password']))
 		{
@@ -653,14 +656,35 @@ class messenger
 	*/
 	protected function setup_template()
 	{
-		global $config, $phpbb_path_helper, $user, $phpbb_extension_manager;
+		global $phpbb_container;
 
 		if ($this->template instanceof \phpbb\template\template)
 		{
 			return;
 		}
 
-		$this->template = new \phpbb\template\twig\twig($phpbb_path_helper, $config, $user, new \phpbb\template\context(), $phpbb_extension_manager);
+		$template_environment = new \phpbb\template\twig\environment(
+			$phpbb_container->get('config'),
+			$phpbb_container->get('filesystem'),
+			$phpbb_container->get('path_helper'),
+			$phpbb_container->getParameter('core.template.cache_path'),
+			$phpbb_container->get('ext.manager'),
+			new \phpbb\template\twig\loader(
+				$phpbb_container->get('filesystem')
+			)
+		);
+		$template_environment->setLexer($phpbb_container->get('template.twig.lexer'));
+
+		$this->template = new \phpbb\template\twig\twig(
+			$phpbb_container->get('path_helper'),
+			$phpbb_container->get('config'),
+			new \phpbb\template\context(),
+			$template_environment,
+			$phpbb_container->getParameter('core.template.cache_path'),
+			$phpbb_container->get('user'),
+			$phpbb_container->get('template.twig.extensions.collection'),
+			$phpbb_container->get('ext.manager')
+		);
 	}
 
 	/**
@@ -685,19 +709,21 @@ class queue
 	var $cache_file = '';
 	var $eol = "\n";
 
+	/**
+	 * @var \phpbb\filesystem\filesystem_interface
+	 */
+	protected $filesystem;
+
 	/**
 	* constructor
 	*/
 	function queue()
 	{
-		global $phpEx, $phpbb_root_path;
+		global $phpEx, $phpbb_root_path, $phpbb_filesystem, $phpbb_container;
 
 		$this->data = array();
-		$this->cache_file = "{$phpbb_root_path}cache/queue.$phpEx";
-
-		// Determine EOL character (\n for UNIX, \r\n for Windows and \r for Mac)
-		$this->eol = (!defined('PHP_EOL')) ? (($eol = strtolower(substr(PHP_OS, 0, 3))) == 'win') ? "\r\n" : (($eol == 'mac') ? "\r" : "\n") : PHP_EOL;
-		$this->eol = (!$this->eol) ? "\n" : $this->eol;
+		$this->cache_file = $phpbb_container->getParameter('core.cache_dir') . "queue.$phpEx";
+		$this->filesystem = $phpbb_filesystem;
 	}
 
 	/**
@@ -724,7 +750,7 @@ class queue
 	*/
 	function process()
 	{
-		global $db, $config, $phpEx, $phpbb_root_path, $user;
+		global $config, $phpEx, $phpbb_root_path, $user;
 
 		$lock = new \phpbb\lock\flock($this->cache_file);
 		$lock->acquire();
@@ -735,14 +761,14 @@ class queue
 		{
 			if (!$have_cache_file)
 			{
-				set_config('last_queue_run', time(), true);
+				$config->set('last_queue_run', time(), false);
 			}
 
 			$lock->release();
 			return;
 		}
 
-		set_config('last_queue_run', time(), true);
+		$config->set('last_queue_run', time(), false);
 
 		include($this->cache_file);
 
@@ -830,7 +856,7 @@ class queue
 						}
 						else
 						{
-							$result = phpbb_mail($to, $subject, $msg, $headers, $this->eol, $err_msg);
+							$result = phpbb_mail($to, $subject, $msg, $headers, PHP_EOL, $err_msg);
 						}
 
 						if (!$result)
@@ -888,7 +914,14 @@ class queue
 					@opcache_invalidate($this->cache_file);
 				}
 
-				phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE);
+				try
+				{
+					$this->filesystem->phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE);
+				}
+				catch (\phpbb\filesystem\exception\filesystem_exception $e)
+				{
+					// Do nothing
+				}
 			}
 		}
 
@@ -935,7 +968,14 @@ class queue
 				@opcache_invalidate($this->cache_file);
 			}
 
-			phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE);
+			try
+			{
+				$this->filesystem->phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE);
+			}
+			catch (\phpbb\filesystem\exception\filesystem_exception $e)
+			{
+				// Do nothing
+			}
 
 			$this->data = array();
 		}
@@ -1263,8 +1303,6 @@ class smtp_class
 	{
 		global $user;
 
-		$err_msg = '';
-
 		// Here we try to determine the *real* hostname (reverse DNS entry preferrably)
 		$local_host = $user->host;
 
@@ -1299,7 +1337,7 @@ class smtp_class
 			$this->server_send("QUIT");
 			fclose($this->socket);
 
-			$result = $this->pop_before_smtp($hostname, $username, $password);
+			$this->pop_before_smtp($hostname, $username, $password);
 			$username = $password = $default_auth_method = '';
 
 			// We need to close the previous session, else the server is not
--- a/includes/functions_module.php
+++ b/includes/functions_module.php
@@ -82,8 +82,8 @@ class p_master
 	*/
 	function list_modules($p_class)
 	{
-		global $auth, $db, $user, $cache;
-		global $config, $phpbb_root_path, $phpEx, $phpbb_dispatcher;
+		global $db, $user, $cache;
+		global $phpbb_dispatcher;
 
 		// Sanitise for future path use, it's escaped as appropriate for queries
 		$this->p_class = str_replace(array('.', '/', '\\'), '', basename($p_class));
@@ -480,13 +480,15 @@ class p_master
 	*/
 	function set_active($id = false, $mode = false)
 	{
+		global $request;
+
 		$icat = false;
 		$this->active_module = false;
 
-		if (request_var('icat', ''))
+		if ($request->variable('icat', ''))
 		{
 			$icat = $id;
-			$id = request_var('icat', '');
+			$id = $request->variable('icat', '');
 		}
 
 		// Restore the backslashes in class names
@@ -553,10 +555,10 @@ class p_master
 	*/
 	function load_active($mode = false, $module_url = false, $execute_module = true)
 	{
-		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $user, $template;
+		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $user, $template, $request;
 
 		$module_path = $this->include_path . $this->p_class;
-		$icat = request_var('icat', '');
+		$icat = $request->variable('icat', '');
 
 		if ($this->active_module === false)
 		{
@@ -727,8 +729,6 @@ class p_master
 	*/
 	function get_parents($parent_id, $left_id, $right_id, &$all_parents)
 	{
-		global $db;
-
 		$parents = array();
 
 		if ($parent_id > 0)
@@ -820,7 +820,7 @@ class p_master
 		// Make sure the module_url has a question mark set, effectively determining the delimiter to use
 		$delim = (strpos($module_url, '?') === false) ? '?' : '&amp;';
 
-		$current_padding = $current_depth = 0;
+		$current_depth = 0;
 		$linear_offset 	= 'l_block1';
 		$tabular_offset = 't_block2';
 
--- a/includes/functions_posting.php
+++ b/includes/functions_posting.php
@@ -24,12 +24,13 @@ if (!defined('IN_PHPBB'))
 */
 function generate_smilies($mode, $forum_id)
 {
-	global $db, $user, $config, $template, $phpbb_dispatcher;
+	global $db, $user, $config, $template, $phpbb_dispatcher, $request;
 	global $phpEx, $phpbb_root_path, $phpbb_container, $phpbb_path_helper;
 
-	$base_url = append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=smilies&amp;f=' . $forum_id);
+	/* @var $pagination \phpbb\pagination */
 	$pagination = $phpbb_container->get('pagination');
-	$start = request_var('start', 0);
+	$base_url = append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=smilies&amp;f=' . $forum_id);
+	$start = $request->variable('start', 0);
 
 	if ($mode == 'window')
 	{
@@ -119,6 +120,15 @@ function generate_smilies($mode, $forum_id)
 
 		foreach ($smilies as $row)
 		{
+			/**
+			* Modify smiley root path before populating smiley list
+			*
+			* @event core.generate_smilies_before
+			* @var string  root_path root_path for smilies
+			* @since 3.1.11-RC1
+			*/
+			$vars = array('root_path');
+			extract($phpbb_dispatcher->trigger_event('core.generate_smilies_before', compact($vars)));
 			$template->assign_block_vars('smiley', array(
 				'SMILEY_CODE'	=> $row['code'],
 				'A_SMILEY_CODE'	=> addslashes($row['code']),
@@ -310,10 +320,10 @@ function posting_gen_topic_icons($mode, $icon_id)
 			{
 				$template->assign_block_vars('topic_icon', array(
 					'ICON_ID'		=> $id,
-					'ICON_NAME'		=> $data['img'],
 					'ICON_IMG'		=> $root_path . $config['icons_path'] . '/' . $data['img'],
 					'ICON_WIDTH'	=> $data['width'],
 					'ICON_HEIGHT'	=> $data['height'],
+					'ICON_ALT'		=> $data['alt'],
 
 					'S_CHECKED'			=> ($id == $icon_id) ? true : false,
 					'S_ICON_CHECKED'	=> ($id == $icon_id) ? ' checked="checked"' : '')
@@ -332,23 +342,20 @@ function posting_gen_topic_icons($mode, $icon_id)
 */
 function posting_gen_topic_types($forum_id, $cur_topic_type = POST_NORMAL)
 {
-	global $auth, $user, $template, $topic_type;
+	global $auth, $user, $template;
 
 	$toggle = false;
 
 	$topic_types = array(
-		'sticky'	=> array('const' => POST_STICKY, 'lang' => 'POST_STICKY'),
-		'announce'	=> array('const' => POST_ANNOUNCE, 'lang' => 'POST_ANNOUNCEMENT'),
-		'global'	=> array('const' => POST_GLOBAL, 'lang' => 'POST_GLOBAL')
+		'sticky'			=> array('const' => POST_STICKY, 'lang' => 'POST_STICKY'),
+		'announce'			=> array('const' => POST_ANNOUNCE, 'lang' => 'POST_ANNOUNCEMENT'),
+		'announce_global'	=> array('const' => POST_GLOBAL, 'lang' => 'POST_GLOBAL')
 	);
 
 	$topic_type_array = array();
 
 	foreach ($topic_types as $auth_key => $topic_value)
 	{
-		// We do not have a special post global announcement permission
-		$auth_key = ($auth_key == 'global') ? 'announce' : $auth_key;
-
 		if ($auth->acl_get('f_' . $auth_key, $forum_id))
 		{
 			$toggle = true;
@@ -378,8 +385,8 @@ function posting_gen_topic_types($forum_id, $cur_topic_type = POST_NORMAL)
 
 		$template->assign_vars(array(
 			'S_TOPIC_TYPE_STICKY'	=> ($auth->acl_get('f_sticky', $forum_id)),
-			'S_TOPIC_TYPE_ANNOUNCE'	=> ($auth->acl_get('f_announce', $forum_id)))
-		);
+			'S_TOPIC_TYPE_ANNOUNCE'	=> ($auth->acl_gets('f_announce', 'f_announce_global', $forum_id)),
+		));
 	}
 
 	return $toggle;
@@ -393,183 +400,27 @@ function posting_gen_topic_types($forum_id, $cur_topic_type = POST_NORMAL)
 * Upload Attachment - filedata is generated here
 * Uses upload class
 *
+* @deprecated 3.2.0-a1 (To be removed: 3.4.0)
+*
 * @param string			$form_name		The form name of the file upload input
 * @param int			$forum_id		The id of the forum
 * @param bool			$local			Whether the file is local or not
 * @param string			$local_storage	The path to the local file
 * @param bool			$is_message		Whether it is a PM or not
-* @param \filespec		$local_filedata	A filespec object created for the local file
-* @param \phpbb\mimetype\guesser	$mimetype_guesser	The mimetype guesser object if used
-* @param \phpbb\plupload\plupload	$plupload		The plupload object if one is being used
+* @param array			$local_filedata	A filespec object created for the local file
 *
-* @return object filespec
+* @return array File data array
 */
-function upload_attachment($form_name, $forum_id, $local = false, $local_storage = '', $is_message = false, $local_filedata = false, \phpbb\mimetype\guesser $mimetype_guesser = null, \phpbb\plupload\plupload $plupload = null)
+function upload_attachment($form_name, $forum_id, $local = false, $local_storage = '', $is_message = false, $local_filedata = false)
 {
-	global $auth, $user, $config, $db, $cache;
-	global $phpbb_root_path, $phpEx, $phpbb_dispatcher;
-
-	$filedata = array(
-		'error'	=> array()
-	);
-
-	include_once($phpbb_root_path . 'includes/functions_upload.' . $phpEx);
-	$upload = new fileupload();
-
-	if ($config['check_attachment_content'] && isset($config['mime_triggers']))
-	{
-		$upload->set_disallowed_content(explode('|', $config['mime_triggers']));
-	}
-	else if (!$config['check_attachment_content'])
-	{
-		$upload->set_disallowed_content(array());
-	}
-
-	$filedata['post_attach'] = $local || $upload->is_valid($form_name);
-
-	if (!$filedata['post_attach'])
-	{
-		$filedata['error'][] = $user->lang['NO_UPLOAD_FORM_FOUND'];
-		return $filedata;
-	}
-
-	$extensions = $cache->obtain_attach_extensions((($is_message) ? false : (int) $forum_id));
-	$upload->set_allowed_extensions(array_keys($extensions['_allowed_']));
-
-	$file = ($local) ? $upload->local_upload($local_storage, $local_filedata, $mimetype_guesser) : $upload->form_upload($form_name, $mimetype_guesser, $plupload);
-
-	if ($file->init_error)
-	{
-		$filedata['post_attach'] = false;
-		return $filedata;
-	}
-
-	// Whether the uploaded file is in the image category
-	$is_image = (isset($extensions[$file->get('extension')]['display_cat'])) ? $extensions[$file->get('extension')]['display_cat'] == ATTACHMENT_CATEGORY_IMAGE : false;
-
-	if (!$auth->acl_get('a_') && !$auth->acl_get('m_', $forum_id))
-	{
-		// Check Image Size, if it is an image
-		if ($is_image)
-		{
-			$file->upload->set_allowed_dimensions(0, 0, $config['img_max_width'], $config['img_max_height']);
-		}
-
-		// Admins and mods are allowed to exceed the allowed filesize
-		if (!empty($extensions[$file->get('extension')]['max_filesize']))
-		{
-			$allowed_filesize = $extensions[$file->get('extension')]['max_filesize'];
-		}
-		else
-		{
-			$allowed_filesize = ($is_message) ? $config['max_filesize_pm'] : $config['max_filesize'];
-		}
-
-		$file->upload->set_max_filesize($allowed_filesize);
-	}
-
-	$file->clean_filename('unique', $user->data['user_id'] . '_');
-
-	// Are we uploading an image *and* this image being within the image category?
-	// Only then perform additional image checks.
-	$file->move_file($config['upload_path'], false, !$is_image);
-
-	// Do we have to create a thumbnail?
-	$filedata['thumbnail'] = ($is_image && $config['img_create_thumbnail']) ? 1 : 0;
-
-	if (sizeof($file->error))
-	{
-		$file->remove();
-		$filedata['error'] = array_merge($filedata['error'], $file->error);
-		$filedata['post_attach'] = false;
-
-		return $filedata;
-	}
-
-	// Make sure the image category only holds valid images...
-	if ($is_image && !$file->is_image())
-	{
-		$file->remove();
-
-		if ($plupload && $plupload->is_active())
-		{
-			$plupload->emit_error(104, 'ATTACHED_IMAGE_NOT_IMAGE');
-		}
-
-		// If this error occurs a user tried to exploit an IE Bug by renaming extensions
-		// Since the image category is displaying content inline we need to catch this.
-		trigger_error($user->lang['ATTACHED_IMAGE_NOT_IMAGE']);
-	}
-
-	$filedata['filesize'] = $file->get('filesize');
-	$filedata['mimetype'] = $file->get('mimetype');
-	$filedata['extension'] = $file->get('extension');
-	$filedata['physical_filename'] = $file->get('realname');
-	$filedata['real_filename'] = $file->get('uploadname');
-	$filedata['filetime'] = time();
-
-	/**
-	* Event to modify uploaded file before submit to the post
-	*
-	* @event core.modify_uploaded_file
-	* @var	array	filedata	Array containing uploaded file data
-	* @var	bool	is_image	Flag indicating if the file is an image
-	* @since 3.1.0-RC3
-	*/
-	$vars = array(
-		'filedata',
-		'is_image',
-	);
-	extract($phpbb_dispatcher->trigger_event('core.modify_uploaded_file', compact($vars)));
-
-	// Check our complete quota
-	if ($config['attachment_quota'])
-	{
-		if ($config['upload_dir_size'] + $file->get('filesize') > $config['attachment_quota'])
-		{
-			$filedata['error'][] = $user->lang['ATTACH_QUOTA_REACHED'];
-			$filedata['post_attach'] = false;
-
-			$file->remove();
+	global $phpbb_container;
 
-			return $filedata;
-		}
-	}
+	/** @var \phpbb\attachment\manager $attachment_manager */
+	$attachment_manager = $phpbb_container->get('attachment.manager');
+	$file = $attachment_manager->upload($form_name, $forum_id, $local, $local_storage, $is_message, $local_filedata);
+	unset($attachment_manager);
 
-	// Check free disk space
-	if ($free_space = @disk_free_space($phpbb_root_path . $config['upload_path']))
-	{
-		if ($free_space <= $file->get('filesize'))
-		{
-			if ($auth->acl_get('a_'))
-			{
-				$filedata['error'][] = $user->lang['ATTACH_DISK_FULL'];
-			}
-			else
-			{
-				$filedata['error'][] = $user->lang['ATTACH_QUOTA_REACHED'];
-			}
-			$filedata['post_attach'] = false;
-
-			$file->remove();
-
-			return $filedata;
-		}
-	}
-
-	// Create Thumbnail
-	if ($filedata['thumbnail'])
-	{
-		$source = $file->get('destination_file');
-		$destination = $file->get('destination_path') . '/thumb_' . $file->get('realname');
-
-		if (!create_thumbnail($source, $destination, $file->get('mimetype')))
-		{
-			$filedata['thumbnail'] = 0;
-		}
-	}
-
-	return $filedata;
+	return $file;
 }
 
 /**
@@ -668,7 +519,7 @@ function get_supported_image_types($type = false)
 */
 function create_thumbnail($source, $destination, $mimetype)
 {
-	global $config;
+	global $config, $phpbb_filesystem;
 
 	$min_filesize = (int) $config['img_min_thumb_filesize'];
 	$img_filesize = (file_exists($source)) ? @filesize($source) : false;
@@ -820,7 +671,14 @@ function create_thumbnail($source, $destination, $mimetype)
 		return false;
 	}
 
-	phpbb_chmod($destination, CHMOD_READ | CHMOD_WRITE);
+	try
+	{
+		$phpbb_filesystem->phpbb_chmod($destination, CHMOD_READ | CHMOD_WRITE);
+	}
+	catch (\phpbb\filesystem\exception\filesystem_exception $e)
+	{
+		// Do nothing
+	}
 
 	return true;
 }
@@ -984,7 +842,7 @@ function load_drafts($topic_id = 0, $forum_id = 0, $id = 0, $pm_action = '', $ms
 	foreach ($draft_rows as $draft)
 	{
 		$link_topic = $link_forum = $link_pm = false;
-		$insert_url = $view_url = $title = '';
+		$view_url = $title = '';
 
 		if (isset($topic_rows[$draft['topic_id']])
 			&& (
@@ -1037,9 +895,10 @@ function load_drafts($topic_id = 0, $forum_id = 0, $id = 0, $pm_action = '', $ms
 */
 function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id = 0, $show_quote_button = true)
 {
-	global $user, $auth, $db, $template, $cache;
+	global $user, $auth, $db, $template;
 	global $config, $phpbb_root_path, $phpEx, $phpbb_container, $phpbb_dispatcher;
 
+	/* @var $phpbb_content_visibility \phpbb\content_visibility */
 	$phpbb_content_visibility = $phpbb_container->get('content.visibility');
 	$sql_sort = ($mode == 'post_review') ? 'ASC' : 'DESC';
 
@@ -1074,7 +933,7 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
 	}
 
 	$sql_ary = array(
-		'SELECT'	=> 'u.username, u.user_id, u.user_colour, p.*, z.friend, z.foe',
+		'SELECT'	=> 'u.username, u.user_id, u.user_colour, p.*, z.friend, z.foe, uu.username as post_delete_username, uu.user_colour as post_delete_user_colour',
 
 		'FROM'		=> array(
 			USERS_TABLE		=> 'u',
@@ -1086,6 +945,10 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
 				'FROM'	=> array(ZEBRA_TABLE => 'z'),
 				'ON'	=> 'z.user_id = ' . $user->data['user_id'] . ' AND z.zebra_id = p.poster_id',
 			),
+			array(
+				'FROM'	=> array(USERS_TABLE => 'uu'),
+				'ON'	=> 'uu.user_id = p.post_delete_user',
+			),
 		),
 
 		'WHERE'		=> $db->sql_in_set('p.post_id', $post_list) . '
@@ -1109,11 +972,9 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
 	$db->sql_freeresult($result);
 
 	// Grab extensions
-	$extensions = $attachments = array();
+	$attachments = array();
 	if ($has_attachments && $auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id))
 	{
-		$extensions = $cache->obtain_attach_extensions($forum_id);
-
 		// Get attachments...
 		$sql = 'SELECT *
 			FROM ' . ATTACHMENTS_TABLE . '
@@ -1194,6 +1055,31 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
 		$post_anchor = ($mode == 'post_review') ? 'ppr' . $row['post_id'] : 'pr' . $row['post_id'];
 		$u_show_post = append_sid($phpbb_root_path . 'viewtopic.' . $phpEx, "f=$forum_id&amp;t=$topic_id&amp;p={$row['post_id']}&amp;view=show#p{$row['post_id']}");
 
+		$l_deleted_message = '';
+		if ($row['post_visibility'] == ITEM_DELETED)
+		{
+			$display_postername = get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']);
+
+			// User having deleted the post also being the post author?
+			if (!$row['post_delete_user'] || $row['post_delete_user'] == $poster_id)
+			{
+				$display_username = $display_postername;
+			}
+			else
+			{
+				$display_username = get_username_string('full', $row['post_delete_user'], $row['post_delete_username'], $row['post_delete_user_colour']);
+			}
+
+			if ($row['post_delete_reason'])
+			{
+				$l_deleted_message = $user->lang('POST_DELETED_BY_REASON', $display_postername, $display_username, $user->format_date($row['post_delete_time'], false, true), $row['post_delete_reason']);
+			}
+			else
+			{
+				$l_deleted_message = $user->lang('POST_DELETED_BY', $display_postername, $display_username, $user->format_date($row['post_delete_time'], false, true));
+			}
+		}
+
 		$post_row = array(
 			'POST_AUTHOR_FULL'		=> get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),
 			'POST_AUTHOR_COLOUR'	=> get_username_string('colour', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),
@@ -1204,6 +1090,8 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
 			'S_FRIEND'			=> ($row['friend']) ? true : false,
 			'S_IGNORE_POST'		=> ($row['foe']) ? true : false,
 			'L_IGNORE_POST'		=> ($row['foe']) ? sprintf($user->lang['POST_BY_FOE'], get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), "<a href=\"{$u_show_post}\" onclick=\"phpbb.toggleDisplay('{$post_anchor}', 1); return false;\">", '</a>') : '',
+			'S_POST_DELETED'	=> ($row['post_visibility'] == ITEM_DELETED) ? true : false,
+			'L_DELETE_POST'		=> $l_deleted_message,
 
 			'POST_SUBJECT'		=> $post_subject,
 			'MINI_POST_IMG'		=> $user->img('icon_post_target', $user->lang['POST']),
@@ -1211,6 +1099,8 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
 			'MESSAGE'			=> $message,
 			'DECODED_MESSAGE'	=> $decoded_message,
 			'POST_ID'			=> $row['post_id'],
+			'POST_TIME'			=> $row['post_time'],
+			'USER_ID'			=> $row['user_id'],
 			'U_MINI_POST'		=> append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'p=' . $row['post_id']) . '#p' . $row['post_id'],
 			'U_MCP_DETAILS'		=> ($auth->acl_get('m_info', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=main&amp;mode=post_details&amp;f=' . $forum_id . '&amp;p=' . $row['post_id'], true, $user->session_id) : '',
 			'POSTER_QUOTE'		=> ($show_quote_button && $auth->acl_get('f_reply', $forum_id)) ? addslashes(get_username_string('username', $poster_id, $row['username'], $row['user_colour'], $row['post_username'])) : '',
@@ -1275,7 +1165,7 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
 */
 function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $softdelete_reason = '')
 {
-	global $db, $user, $auth, $phpbb_container;
+	global $db, $user, $phpbb_container;
 	global $config, $phpEx, $phpbb_root_path;
 
 	// Specify our post mode
@@ -1322,6 +1212,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $
 		$db->sql_freeresult($result);
 	}
 
+	/* @var $phpbb_content_visibility \phpbb\content_visibility */
 	$phpbb_content_visibility = $phpbb_container->get('content.visibility');
 
 	// (Soft) delete the post
@@ -1363,7 +1254,6 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $
 
 			if ($is_soft)
 			{
-				$topic_row = array();
 				$phpbb_content_visibility->set_topic_visibility(ITEM_DELETED, $topic_id, $forum_id, $user->data['user_id'], time(), $softdelete_reason);
 			}
 			else
@@ -1533,10 +1423,12 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $
 * Submit Post
 * @todo Split up and create lightweight, simple API for this.
 */
-function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $update_message = true, $update_search_index = true)
+function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data_ary, $update_message = true, $update_search_index = true)
 {
-	global $db, $auth, $user, $config, $phpEx, $template, $phpbb_root_path, $phpbb_container, $phpbb_dispatcher;
+	global $db, $auth, $user, $config, $phpEx, $phpbb_root_path, $phpbb_container, $phpbb_dispatcher, $phpbb_log, $request;
 
+	$poll = $poll_ary;
+	$data = $data_ary;
 	/**
 	* Modify the data for post submitting
 	*
@@ -1562,6 +1454,10 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 		'update_search_index',
 	);
 	extract($phpbb_dispatcher->trigger_event('core.modify_submit_post_data', compact($vars)));
+	$poll_ary = $poll;
+	$data_ary = $data;
+	unset($poll);
+	unset($data);
 
 	// We do not handle erasing posts here
 	if ($mode == 'delete')
@@ -1569,9 +1465,9 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 		return false;
 	}
 
-	if (!empty($data['post_time']))
+	if (!empty($data_ary['post_time']))
 	{
-		$current_time = $data['post_time'];
+		$current_time = $data_ary['post_time'];
 	}
 	else
 	{
@@ -1590,31 +1486,31 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 	}
 	else if ($mode == 'edit')
 	{
-		$post_mode = ($data['topic_posts_approved'] + $data['topic_posts_unapproved'] + $data['topic_posts_softdeleted'] == 1) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit_first_post' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit_last_post' : 'edit'));
+		$post_mode = ($data_ary['topic_posts_approved'] + $data_ary['topic_posts_unapproved'] + $data_ary['topic_posts_softdeleted'] == 1) ? 'edit_topic' : (($data_ary['topic_first_post_id'] == $data_ary['post_id']) ? 'edit_first_post' : (($data_ary['topic_last_post_id'] == $data_ary['post_id']) ? 'edit_last_post' : 'edit'));
 	}
 
 	// First of all make sure the subject and topic title are having the correct length.
 	// To achieve this without cutting off between special chars we convert to an array and then count the elements.
 	$subject = truncate_string($subject, 120);
-	$data['topic_title'] = truncate_string($data['topic_title'], 120);
+	$data_ary['topic_title'] = truncate_string($data_ary['topic_title'], 120);
 
 	// Collect some basic information about which tables and which rows to update/insert
 	$sql_data = $topic_row = array();
-	$poster_id = ($mode == 'edit') ? $data['poster_id'] : (int) $user->data['user_id'];
+	$poster_id = ($mode == 'edit') ? $data_ary['poster_id'] : (int) $user->data['user_id'];
 
 	// Retrieve some additional information if not present
-	if ($mode == 'edit' && (!isset($data['post_visibility']) || !isset($data['topic_visibility']) || $data['post_visibility'] === false || $data['topic_visibility'] === false))
+	if ($mode == 'edit' && (!isset($data_ary['post_visibility']) || !isset($data_ary['topic_visibility']) || $data_ary['post_visibility'] === false || $data_ary['topic_visibility'] === false))
 	{
 		$sql = 'SELECT p.post_visibility, t.topic_type, t.topic_posts_approved, t.topic_posts_unapproved, t.topic_posts_softdeleted, t.topic_visibility
 			FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . ' p
 			WHERE t.topic_id = p.topic_id
-				AND p.post_id = ' . $data['post_id'];
+				AND p.post_id = ' . $data_ary['post_id'];
 		$result = $db->sql_query($sql);
 		$topic_row = $db->sql_fetchrow($result);
 		$db->sql_freeresult($result);
 
-		$data['topic_visibility'] = $topic_row['topic_visibility'];
-		$data['post_visibility'] = $topic_row['post_visibility'];
+		$data_ary['topic_visibility'] = $topic_row['topic_visibility'];
+		$data_ary['post_visibility'] = $topic_row['post_visibility'];
 	}
 
 	// This variable indicates if the user is able to post or put into the queue
@@ -1622,7 +1518,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 
 	// Check the permissions for post approval.
 	// Moderators must go through post approval like ordinary users.
-	if (!$auth->acl_get('f_noapprove', $data['forum_id']))
+	if (!$auth->acl_get('f_noapprove', $data_ary['forum_id']))
 	{
 		// Post not approved, but in queue
 		$post_visibility = ITEM_UNAPPROVED;
@@ -1636,19 +1532,19 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 			break;
 		}
 	}
-	else if (isset($data['post_visibility']) && $data['post_visibility'] !== false)
+	else if (isset($data_ary['post_visibility']) && $data_ary['post_visibility'] !== false)
 	{
-		$post_visibility = $data['post_visibility'];
+		$post_visibility = $data_ary['post_visibility'];
 	}
 
 	// MODs/Extensions are able to force any visibility on posts
-	if (isset($data['force_approved_state']))
+	if (isset($data_ary['force_approved_state']))
 	{
-		$post_visibility = (in_array((int) $data['force_approved_state'], array(ITEM_APPROVED, ITEM_UNAPPROVED, ITEM_DELETED, ITEM_REAPPROVE))) ? (int) $data['force_approved_state'] : $post_visibility;
+		$post_visibility = (in_array((int) $data_ary['force_approved_state'], array(ITEM_APPROVED, ITEM_UNAPPROVED, ITEM_DELETED, ITEM_REAPPROVE))) ? (int) $data_ary['force_approved_state'] : $post_visibility;
 	}
-	if (isset($data['force_visibility']))
+	if (isset($data_ary['force_visibility']))
 	{
-		$post_visibility = (in_array((int) $data['force_visibility'], array(ITEM_APPROVED, ITEM_UNAPPROVED, ITEM_DELETED, ITEM_REAPPROVE))) ? (int) $data['force_visibility'] : $post_visibility;
+		$post_visibility = (in_array((int) $data_ary['force_visibility'], array(ITEM_APPROVED, ITEM_UNAPPROVED, ITEM_DELETED, ITEM_REAPPROVE))) ? (int) $data_ary['force_visibility'] : $post_visibility;
 	}
 
 	// Start the transaction here
@@ -1660,25 +1556,25 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 		case 'post':
 		case 'reply':
 			$sql_data[POSTS_TABLE]['sql'] = array(
-				'forum_id'			=> $data['forum_id'],
+				'forum_id'			=> $data_ary['forum_id'],
 				'poster_id'			=> (int) $user->data['user_id'],
-				'icon_id'			=> $data['icon_id'],
+				'icon_id'			=> $data_ary['icon_id'],
 				'poster_ip'			=> $user->ip,
 				'post_time'			=> $current_time,
 				'post_visibility'	=> $post_visibility,
-				'enable_bbcode'		=> $data['enable_bbcode'],
-				'enable_smilies'	=> $data['enable_smilies'],
-				'enable_magic_url'	=> $data['enable_urls'],
-				'enable_sig'		=> $data['enable_sig'],
+				'enable_bbcode'		=> $data_ary['enable_bbcode'],
+				'enable_smilies'	=> $data_ary['enable_smilies'],
+				'enable_magic_url'	=> $data_ary['enable_urls'],
+				'enable_sig'		=> $data_ary['enable_sig'],
 				'post_username'		=> (!$user->data['is_registered']) ? $username : '',
 				'post_subject'		=> $subject,
-				'post_text'			=> $data['message'],
-				'post_checksum'		=> $data['message_md5'],
-				'post_attachment'	=> (!empty($data['attachment_data'])) ? 1 : 0,
-				'bbcode_bitfield'	=> $data['bbcode_bitfield'],
-				'bbcode_uid'		=> $data['bbcode_uid'],
-				'post_postcount'	=> ($auth->acl_get('f_postcount', $data['forum_id'])) ? 1 : 0,
-				'post_edit_locked'	=> $data['post_edit_locked']
+				'post_text'			=> $data_ary['message'],
+				'post_checksum'		=> $data_ary['message_md5'],
+				'post_attachment'	=> (!empty($data_ary['attachment_data'])) ? 1 : 0,
+				'bbcode_bitfield'	=> $data_ary['bbcode_bitfield'],
+				'bbcode_uid'		=> $data_ary['bbcode_uid'],
+				'post_postcount'	=> ($auth->acl_get('f_postcount', $data_ary['forum_id'])) ? 1 : 0,
+				'post_edit_locked'	=> $data_ary['post_edit_locked']
 			);
 		break;
 
@@ -1695,19 +1591,19 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 			// If normal edit display edit info
 
 			// Display edit info if edit reason given or user is editing his post, which is not the last within the topic.
-			if ($data['post_edit_reason'] || (!$auth->acl_get('m_edit', $data['forum_id']) && ($post_mode == 'edit' || $post_mode == 'edit_first_post')))
+			if ($data_ary['post_edit_reason'] || (!$auth->acl_get('m_edit', $data_ary['forum_id']) && ($post_mode == 'edit' || $post_mode == 'edit_first_post')))
 			{
-				$data['post_edit_reason']		= truncate_string($data['post_edit_reason'], 255, 255, false);
+				$data_ary['post_edit_reason']		= truncate_string($data_ary['post_edit_reason'], 255, 255, false);
 
 				$sql_data[POSTS_TABLE]['sql']	= array(
 					'post_edit_time'	=> $current_time,
-					'post_edit_reason'	=> $data['post_edit_reason'],
-					'post_edit_user'	=> (int) $data['post_edit_user'],
+					'post_edit_reason'	=> $data_ary['post_edit_reason'],
+					'post_edit_user'	=> (int) $data_ary['post_edit_user'],
 				);
 
 				$sql_data[POSTS_TABLE]['stat'][] = 'post_edit_count = post_edit_count + 1';
 			}
-			else if (!$data['post_edit_reason'] && $mode == 'edit' && $auth->acl_get('m_edit', $data['forum_id']))
+			else if (!$data_ary['post_edit_reason'] && $mode == 'edit' && $auth->acl_get('m_edit', $data_ary['forum_id']))
 			{
 				$sql_data[POSTS_TABLE]['sql'] = array(
 					'post_edit_reason'	=> '',
@@ -1718,8 +1614,15 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 			// Could be simplified by only adding to the log if the edit is not tracked - but this may confuse admins/mods
 			if ($user->data['user_id'] != $poster_id)
 			{
-				$log_subject = ($subject) ? $subject : $data['topic_title'];
-				add_log('mod', $data['forum_id'], $data['topic_id'], 'LOG_POST_EDITED', $log_subject, (!empty($username)) ? $username : $user->lang['GUEST'], $data['post_edit_reason']);
+				$log_subject = ($subject) ? $subject : $data_ary['topic_title'];
+				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_POST_EDITED', false, array(
+					'forum_id' => $data_ary['forum_id'],
+					'topic_id' => $data_ary['topic_id'],
+					'post_id'  => $data_ary['post_id'],
+					$log_subject,
+					(!empty($username)) ? $username : $user->lang['GUEST'],
+					$data_ary['post_edit_reason']
+				));
 			}
 
 			if (!isset($sql_data[POSTS_TABLE]['sql']))
@@ -1728,32 +1631,31 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 			}
 
 			$sql_data[POSTS_TABLE]['sql'] = array_merge($sql_data[POSTS_TABLE]['sql'], array(
-				'forum_id'			=> $data['forum_id'],
-				'poster_id'			=> $data['poster_id'],
-				'icon_id'			=> $data['icon_id'],
+				'forum_id'			=> $data_ary['forum_id'],
+				'poster_id'			=> $data_ary['poster_id'],
+				'icon_id'			=> $data_ary['icon_id'],
 				// We will change the visibility later
 				//'post_visibility'	=> $post_visibility,
-				'enable_bbcode'		=> $data['enable_bbcode'],
-				'enable_smilies'	=> $data['enable_smilies'],
-				'enable_magic_url'	=> $data['enable_urls'],
-				'enable_sig'		=> $data['enable_sig'],
-				'post_username'		=> ($username && $data['poster_id'] == ANONYMOUS) ? $username : '',
+				'enable_bbcode'		=> $data_ary['enable_bbcode'],
+				'enable_smilies'	=> $data_ary['enable_smilies'],
+				'enable_magic_url'	=> $data_ary['enable_urls'],
+				'enable_sig'		=> $data_ary['enable_sig'],
+				'post_username'		=> ($username && $data_ary['poster_id'] == ANONYMOUS) ? $username : '',
 				'post_subject'		=> $subject,
-				'post_checksum'		=> $data['message_md5'],
-				'post_attachment'	=> (!empty($data['attachment_data'])) ? 1 : 0,
-				'bbcode_bitfield'	=> $data['bbcode_bitfield'],
-				'bbcode_uid'		=> $data['bbcode_uid'],
-				'post_edit_locked'	=> $data['post_edit_locked'])
+				'post_checksum'		=> $data_ary['message_md5'],
+				'post_attachment'	=> (!empty($data_ary['attachment_data'])) ? 1 : 0,
+				'bbcode_bitfield'	=> $data_ary['bbcode_bitfield'],
+				'bbcode_uid'		=> $data_ary['bbcode_uid'],
+				'post_edit_locked'	=> $data_ary['post_edit_locked'])
 			);
 
 			if ($update_message)
 			{
-				$sql_data[POSTS_TABLE]['sql']['post_text'] = $data['message'];
+				$sql_data[POSTS_TABLE]['sql']['post_text'] = $data_ary['message'];
 			}
 
 		break;
 	}
-	$topic_row = array();
 
 	// And the topic ladies and gentlemen
 	switch ($post_mode)
@@ -1763,8 +1665,8 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 				'topic_poster'				=> (int) $user->data['user_id'],
 				'topic_time'				=> $current_time,
 				'topic_last_view_time'		=> $current_time,
-				'forum_id'					=> $data['forum_id'],
-				'icon_id'					=> $data['icon_id'],
+				'forum_id'					=> $data_ary['forum_id'],
+				'icon_id'					=> $data_ary['icon_id'],
 				'topic_posts_approved'		=> ($post_visibility == ITEM_APPROVED) ? 1 : 0,
 				'topic_posts_softdeleted'	=> ($post_visibility == ITEM_DELETED) ? 1 : 0,
 				'topic_posts_unapproved'	=> ($post_visibility == ITEM_UNAPPROVED) ? 1 : 0,
@@ -1774,15 +1676,15 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 				'topic_first_poster_name'	=> (!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : ''),
 				'topic_first_poster_colour'	=> $user->data['user_colour'],
 				'topic_type'				=> $topic_type,
-				'topic_time_limit'			=> ($topic_type == POST_STICKY || $topic_type == POST_ANNOUNCE) ? ($data['topic_time_limit'] * 86400) : 0,
-				'topic_attachment'			=> (!empty($data['attachment_data'])) ? 1 : 0,
-				'topic_status'				=> (isset($data['topic_status'])) ? $data['topic_status'] : ITEM_UNLOCKED,
+				'topic_time_limit'			=> ($topic_type == POST_STICKY || $topic_type == POST_ANNOUNCE) ? ($data_ary['topic_time_limit'] * 86400) : 0,
+				'topic_attachment'			=> (!empty($data_ary['attachment_data'])) ? 1 : 0,
+				'topic_status'				=> (isset($data_ary['topic_status'])) ? $data_ary['topic_status'] : ITEM_UNLOCKED,
 			);
 
-			if (isset($poll['poll_options']) && !empty($poll['poll_options']))
+			if (isset($poll_ary['poll_options']) && !empty($poll_ary['poll_options']))
 			{
-				$poll_start = ($poll['poll_start']) ? $poll['poll_start'] : $current_time;
-				$poll_length = $poll['poll_length'] * 86400;
+				$poll_start = ($poll_ary['poll_start']) ? $poll_ary['poll_start'] : $current_time;
+				$poll_length = $poll_ary['poll_length'] * 86400;
 				if ($poll_length < 0)
 				{
 					$poll_start = $poll_start + $poll_length;
@@ -1794,15 +1696,15 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 				}
 
 				$sql_data[TOPICS_TABLE]['sql'] = array_merge($sql_data[TOPICS_TABLE]['sql'], array(
-					'poll_title'		=> $poll['poll_title'],
+					'poll_title'		=> $poll_ary['poll_title'],
 					'poll_start'		=> $poll_start,
-					'poll_max_options'	=> $poll['poll_max_options'],
+					'poll_max_options'	=> $poll_ary['poll_max_options'],
 					'poll_length'		=> $poll_length,
-					'poll_vote_change'	=> $poll['poll_vote_change'])
+					'poll_vote_change'	=> $poll_ary['poll_vote_change'])
 				);
 			}
 
-			$sql_data[USERS_TABLE]['stat'][] = "user_lastpost_time = $current_time" . (($auth->acl_get('f_postcount', $data['forum_id']) && $post_visibility == ITEM_APPROVED) ? ', user_posts = user_posts + 1' : '');
+			$sql_data[USERS_TABLE]['stat'][] = "user_lastpost_time = $current_time" . (($auth->acl_get('f_postcount', $data_ary['forum_id']) && $post_visibility == ITEM_APPROVED) ? ', user_posts = user_posts + 1' : '');
 
 			if ($post_visibility == ITEM_APPROVED)
 			{
@@ -1828,9 +1730,9 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 				(($post_visibility == ITEM_APPROVED) ? ', topic_posts_approved = topic_posts_approved + 1' : '') .
 				(($post_visibility == ITEM_UNAPPROVED) ? ', topic_posts_unapproved = topic_posts_unapproved + 1' : '') .
 				(($post_visibility == ITEM_DELETED) ? ', topic_posts_softdeleted = topic_posts_softdeleted + 1' : '') .
-				((!empty($data['attachment_data']) || (isset($data['topic_attachment']) && $data['topic_attachment'])) ? ', topic_attachment = 1' : '');
+				((!empty($data_ary['attachment_data']) || (isset($data_ary['topic_attachment']) && $data_ary['topic_attachment'])) ? ', topic_attachment = 1' : '');
 
-			$sql_data[USERS_TABLE]['stat'][] = "user_lastpost_time = $current_time" . (($auth->acl_get('f_postcount', $data['forum_id']) && $post_visibility == ITEM_APPROVED) ? ', user_posts = user_posts + 1' : '');
+			$sql_data[USERS_TABLE]['stat'][] = "user_lastpost_time = $current_time" . (($auth->acl_get('f_postcount', $data_ary['forum_id']) && $post_visibility == ITEM_APPROVED) ? ', user_posts = user_posts + 1' : '');
 
 			if ($post_visibility == ITEM_APPROVED)
 			{
@@ -1848,10 +1750,10 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 
 		case 'edit_topic':
 		case 'edit_first_post':
-			if (isset($poll['poll_options']))
+			if (isset($poll_ary['poll_options']))
 			{
-				$poll_start = ($poll['poll_start'] || empty($poll['poll_options'])) ? $poll['poll_start'] : $current_time;
-				$poll_length = $poll['poll_length'] * 86400;
+				$poll_start = ($poll_ary['poll_start'] || empty($poll_ary['poll_options'])) ? $poll_ary['poll_start'] : $current_time;
+				$poll_length = $poll_ary['poll_length'] * 86400;
 				if ($poll_length < 0)
 				{
 					$poll_start = $poll_start + $poll_length;
@@ -1864,25 +1766,27 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 			}
 
 			$sql_data[TOPICS_TABLE]['sql'] = array(
-				'forum_id'					=> $data['forum_id'],
-				'icon_id'					=> $data['icon_id'],
+				'forum_id'					=> $data_ary['forum_id'],
+				'icon_id'					=> $data_ary['icon_id'],
 				'topic_title'				=> $subject,
 				'topic_first_poster_name'	=> $username,
 				'topic_type'				=> $topic_type,
-				'topic_time_limit'			=> ($topic_type == POST_STICKY || $topic_type == POST_ANNOUNCE) ? ($data['topic_time_limit'] * 86400) : 0,
-				'poll_title'				=> (isset($poll['poll_options'])) ? $poll['poll_title'] : '',
-				'poll_start'				=> (isset($poll['poll_options'])) ? $poll_start : 0,
-				'poll_max_options'			=> (isset($poll['poll_options'])) ? $poll['poll_max_options'] : 1,
-				'poll_length'				=> (isset($poll['poll_options'])) ? $poll_length : 0,
-				'poll_vote_change'			=> (isset($poll['poll_vote_change'])) ? $poll['poll_vote_change'] : 0,
+				'topic_time_limit'			=> ($topic_type == POST_STICKY || $topic_type == POST_ANNOUNCE) ? ($data_ary['topic_time_limit'] * 86400) : 0,
+				'poll_title'				=> (isset($poll_ary['poll_options'])) ? $poll_ary['poll_title'] : '',
+				'poll_start'				=> (isset($poll_ary['poll_options'])) ? $poll_start : 0,
+				'poll_max_options'			=> (isset($poll_ary['poll_options'])) ? $poll_ary['poll_max_options'] : 1,
+				'poll_length'				=> (isset($poll_ary['poll_options'])) ? $poll_length : 0,
+				'poll_vote_change'			=> (isset($poll_ary['poll_vote_change'])) ? $poll_ary['poll_vote_change'] : 0,
 				'topic_last_view_time'		=> $current_time,
 
-				'topic_attachment'			=> (!empty($data['attachment_data'])) ? 1 : (isset($data['topic_attachment']) ? $data['topic_attachment'] : 0),
+				'topic_attachment'			=> (!empty($data_ary['attachment_data'])) ? 1 : (isset($data_ary['topic_attachment']) ? $data_ary['topic_attachment'] : 0),
 			);
 
 		break;
 	}
 
+	$poll = $poll_ary;
+	$data = $data_ary;
 	/**
 	* Modify sql query data for post submitting
 	*
@@ -1906,6 +1810,10 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 		'username',
 	);
 	extract($phpbb_dispatcher->trigger_event('core.submit_post_modify_sql_data', compact($vars)));
+	$poll_ary = $poll;
+	$data_ary = $data;
+	unset($poll);
+	unset($data);
 
 	// Submit new topic
 	if ($post_mode == 'post')
@@ -1914,10 +1822,10 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 			$db->sql_build_array('INSERT', $sql_data[TOPICS_TABLE]['sql']);
 		$db->sql_query($sql);
 
-		$data['topic_id'] = $db->sql_nextid();
+		$data_ary['topic_id'] = $db->sql_nextid();
 
 		$sql_data[POSTS_TABLE]['sql'] = array_merge($sql_data[POSTS_TABLE]['sql'], array(
-			'topic_id' => $data['topic_id'])
+			'topic_id' => $data_ary['topic_id'])
 		);
 		unset($sql_data[TOPICS_TABLE]['sql']);
 	}
@@ -1928,18 +1836,18 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 		if ($post_mode == 'reply')
 		{
 			$sql_data[POSTS_TABLE]['sql'] = array_merge($sql_data[POSTS_TABLE]['sql'], array(
-				'topic_id' => $data['topic_id'],
+				'topic_id' => $data_ary['topic_id'],
 			));
 		}
 
 		$sql = 'INSERT INTO ' . POSTS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_data[POSTS_TABLE]['sql']);
 		$db->sql_query($sql);
-		$data['post_id'] = $db->sql_nextid();
+		$data_ary['post_id'] = $db->sql_nextid();
 
 		if ($post_mode == 'post' || $post_visibility == ITEM_APPROVED)
 		{
 			$sql_data[TOPICS_TABLE]['sql'] = array(
-				'topic_last_post_id'		=> $data['post_id'],
+				'topic_last_post_id'		=> $data_ary['post_id'],
 				'topic_last_post_time'		=> $current_time,
 				'topic_last_poster_id'		=> $sql_data[POSTS_TABLE]['sql']['poster_id'],
 				'topic_last_poster_name'	=> ($user->data['user_id'] == ANONYMOUS) ? $sql_data[POSTS_TABLE]['sql']['post_username'] : $user->data['username'],
@@ -1950,7 +1858,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 
 		if ($post_mode == 'post')
 		{
-			$sql_data[TOPICS_TABLE]['sql']['topic_first_post_id'] = $data['post_id'];
+			$sql_data[TOPICS_TABLE]['sql']['topic_first_post_id'] = $data_ary['post_id'];
 		}
 
 		// Update total post count and forum information
@@ -1958,11 +1866,11 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 		{
 			if ($post_mode == 'post')
 			{
-				set_config_count('num_topics', 1, true);
+				$config->increment('num_topics', 1, false);
 			}
-			set_config_count('num_posts', 1, true);
+			$config->increment('num_posts', 1, false);
 
-			$sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = ' . $data['post_id'];
+			$sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = ' . $data_ary['post_id'];
 			$sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = '" . $db->sql_escape($subject) . "'";
 			$sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_time = ' . $current_time;
 			$sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_poster_id = ' . (int) $user->data['user_id'];
@@ -1978,7 +1886,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 	{
 		$sql = 'UPDATE ' . TOPICS_TABLE . '
 			SET ' . $db->sql_build_array('UPDATE', $sql_data[TOPICS_TABLE]['sql']) . '
-			WHERE topic_id = ' . $data['topic_id'];
+			WHERE topic_id = ' . $data_ary['topic_id'];
 		$db->sql_query($sql);
 
 		unset($sql_data[TOPICS_TABLE]['sql']);
@@ -1989,14 +1897,14 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 	{
 		$sql = 'UPDATE ' . POSTS_TABLE . '
 			SET ' . $db->sql_build_array('UPDATE', $sql_data[POSTS_TABLE]['sql']) . '
-			WHERE post_id = ' . $data['post_id'];
+			WHERE post_id = ' . $data_ary['post_id'];
 		$db->sql_query($sql);
 
 		unset($sql_data[POSTS_TABLE]['sql']);
 	}
 
 	// Update Poll Tables
-	if (isset($poll['poll_options']))
+	if (isset($poll_ary['poll_options']))
 	{
 		$cur_poll_options = array();
 
@@ -2004,7 +1912,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 		{
 			$sql = 'SELECT *
 				FROM ' . POLL_OPTIONS_TABLE . '
-				WHERE topic_id = ' . $data['topic_id'] . '
+				WHERE topic_id = ' . $data_ary['topic_id'] . '
 				ORDER BY poll_option_id';
 			$result = $db->sql_query($sql);
 
@@ -2018,25 +1926,25 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 
 		$sql_insert_ary = array();
 
-		for ($i = 0, $size = sizeof($poll['poll_options']); $i < $size; $i++)
+		for ($i = 0, $size = sizeof($poll_ary['poll_options']); $i < $size; $i++)
 		{
-			if (strlen(trim($poll['poll_options'][$i])))
+			if (strlen(trim($poll_ary['poll_options'][$i])))
 			{
 				if (empty($cur_poll_options[$i]))
 				{
 					// If we add options we need to put them to the end to be able to preserve votes...
 					$sql_insert_ary[] = array(
 						'poll_option_id'	=> (int) sizeof($cur_poll_options) + 1 + sizeof($sql_insert_ary),
-						'topic_id'			=> (int) $data['topic_id'],
-						'poll_option_text'	=> (string) $poll['poll_options'][$i]
+						'topic_id'			=> (int) $data_ary['topic_id'],
+						'poll_option_text'	=> (string) $poll_ary['poll_options'][$i]
 					);
 				}
-				else if ($poll['poll_options'][$i] != $cur_poll_options[$i])
+				else if ($poll_ary['poll_options'][$i] != $cur_poll_options[$i])
 				{
 					$sql = 'UPDATE ' . POLL_OPTIONS_TABLE . "
-						SET poll_option_text = '" . $db->sql_escape($poll['poll_options'][$i]) . "'
+						SET poll_option_text = '" . $db->sql_escape($poll_ary['poll_options'][$i]) . "'
 						WHERE poll_option_id = " . $cur_poll_options[$i]['poll_option_id'] . '
-							AND topic_id = ' . $data['topic_id'];
+							AND topic_id = ' . $data_ary['topic_id'];
 					$db->sql_query($sql);
 				}
 			}
@@ -2044,29 +1952,29 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 
 		$db->sql_multi_insert(POLL_OPTIONS_TABLE, $sql_insert_ary);
 
-		if (sizeof($poll['poll_options']) < sizeof($cur_poll_options))
+		if (sizeof($poll_ary['poll_options']) < sizeof($cur_poll_options))
 		{
 			$sql = 'DELETE FROM ' . POLL_OPTIONS_TABLE . '
-				WHERE poll_option_id > ' . sizeof($poll['poll_options']) . '
-					AND topic_id = ' . $data['topic_id'];
+				WHERE poll_option_id > ' . sizeof($poll_ary['poll_options']) . '
+					AND topic_id = ' . $data_ary['topic_id'];
 			$db->sql_query($sql);
 		}
 
 		// If edited, we would need to reset votes (since options can be re-ordered above, you can't be sure if the change is for changing the text or adding an option
-		if ($mode == 'edit' && sizeof($poll['poll_options']) != sizeof($cur_poll_options))
+		if ($mode == 'edit' && sizeof($poll_ary['poll_options']) != sizeof($cur_poll_options))
 		{
-			$db->sql_query('DELETE FROM ' . POLL_VOTES_TABLE . ' WHERE topic_id = ' . $data['topic_id']);
-			$db->sql_query('UPDATE ' . POLL_OPTIONS_TABLE . ' SET poll_option_total = 0 WHERE topic_id = ' . $data['topic_id']);
+			$db->sql_query('DELETE FROM ' . POLL_VOTES_TABLE . ' WHERE topic_id = ' . $data_ary['topic_id']);
+			$db->sql_query('UPDATE ' . POLL_OPTIONS_TABLE . ' SET poll_option_total = 0 WHERE topic_id = ' . $data_ary['topic_id']);
 		}
 	}
 
 	// Submit Attachments
-	if (!empty($data['attachment_data']) && $data['post_id'] && in_array($mode, array('post', 'reply', 'quote', 'edit')))
+	if (!empty($data_ary['attachment_data']) && $data_ary['post_id'] && in_array($mode, array('post', 'reply', 'quote', 'edit')))
 	{
 		$space_taken = $files_added = 0;
 		$orphan_rows = array();
 
-		foreach ($data['attachment_data'] as $pos => $attach_row)
+		foreach ($data_ary['attachment_data'] as $pos => $attach_row)
 		{
 			$orphan_rows[(int) $attach_row['attach_id']] = array();
 		}
@@ -2088,7 +1996,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 			$db->sql_freeresult($result);
 		}
 
-		foreach ($data['attachment_data'] as $pos => $attach_row)
+		foreach ($data_ary['attachment_data'] as $pos => $attach_row)
 		{
 			if ($attach_row['is_orphan'] && !isset($orphan_rows[$attach_row['attach_id']]))
 			{
@@ -2116,8 +2024,8 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 				$files_added++;
 
 				$attach_sql = array(
-					'post_msg_id'		=> $data['post_id'],
-					'topic_id'			=> $data['topic_id'],
+					'post_msg_id'		=> $data_ary['post_id'],
+					'topic_id'			=> $data_ary['topic_id'],
 					'is_orphan'			=> 0,
 					'poster_id'			=> $poster_id,
 					'attach_comment'	=> $attach_row['attach_comment'],
@@ -2133,37 +2041,38 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 
 		if ($space_taken && $files_added)
 		{
-			set_config_count('upload_dir_size', $space_taken, true);
-			set_config_count('num_files', $files_added, true);
+			$config->increment('upload_dir_size', $space_taken, false);
+			$config->increment('num_files', $files_added, false);
 		}
 	}
 
 	$first_post_has_topic_info = ($post_mode == 'edit_first_post' &&
-			(($post_visibility == ITEM_DELETED && $data['topic_posts_softdeleted'] == 1) ||
-			($post_visibility == ITEM_UNAPPROVED && $data['topic_posts_unapproved'] == 1) ||
-			($post_visibility == ITEM_REAPPROVE && $data['topic_posts_unapproved'] == 1) ||
-			($post_visibility == ITEM_APPROVED && $data['topic_posts_approved'] == 1)));
+			(($post_visibility == ITEM_DELETED && $data_ary['topic_posts_softdeleted'] == 1) ||
+			($post_visibility == ITEM_UNAPPROVED && $data_ary['topic_posts_unapproved'] == 1) ||
+			($post_visibility == ITEM_REAPPROVE && $data_ary['topic_posts_unapproved'] == 1) ||
+			($post_visibility == ITEM_APPROVED && $data_ary['topic_posts_approved'] == 1)));
 	// Fix the post's and topic's visibility and first/last post information, when the post is edited
-	if (($post_mode != 'post' && $post_mode != 'reply') && $data['post_visibility'] != $post_visibility)
+	if (($post_mode != 'post' && $post_mode != 'reply') && $data_ary['post_visibility'] != $post_visibility)
 	{
 		// If the post was not approved, it could also be the starter,
 		// so we sync the starter after approving/restoring, to ensure that the stats are correct
 		// Same applies for the last post
-		$is_starter = ($post_mode == 'edit_first_post' || $post_mode == 'edit_topic' || $data['post_visibility'] != ITEM_APPROVED);
-		$is_latest = ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || $data['post_visibility'] != ITEM_APPROVED);
+		$is_starter = ($post_mode == 'edit_first_post' || $post_mode == 'edit_topic' || $data_ary['post_visibility'] != ITEM_APPROVED);
+		$is_latest = ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || $data_ary['post_visibility'] != ITEM_APPROVED);
 
+		/* @var $phpbb_content_visibility \phpbb\content_visibility */
 		$phpbb_content_visibility = $phpbb_container->get('content.visibility');
-		$phpbb_content_visibility->set_post_visibility($post_visibility, $data['post_id'], $data['topic_id'], $data['forum_id'], $user->data['user_id'], time(), '', $is_starter, $is_latest);
+		$phpbb_content_visibility->set_post_visibility($post_visibility, $data_ary['post_id'], $data_ary['topic_id'], $data_ary['forum_id'], $user->data['user_id'], time(), '', $is_starter, $is_latest);
 	}
 	else if ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || $first_post_has_topic_info)
 	{
-		if ($post_visibility == ITEM_APPROVED || $data['topic_visibility'] == $post_visibility)
+		if ($post_visibility == ITEM_APPROVED || $data_ary['topic_visibility'] == $post_visibility)
 		{
 			// only the subject can be changed from edit
 			$sql_data[TOPICS_TABLE]['stat'][] = "topic_last_post_subject = '" . $db->sql_escape($subject) . "'";
 
 			// Maybe not only the subject, but also changing anonymous usernames. ;)
-			if ($data['poster_id'] == ANONYMOUS)
+			if ($data_ary['poster_id'] == ANONYMOUS)
 			{
 				$sql_data[TOPICS_TABLE]['stat'][] = "topic_last_poster_name = '" . $db->sql_escape($username) . "'";
 			}
@@ -2174,13 +2083,13 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 				// it just means that we might have to
 				$sql = 'SELECT forum_last_post_id, forum_last_post_subject
 					FROM ' . FORUMS_TABLE . '
-					WHERE forum_id = ' . (int) $data['forum_id'];
+					WHERE forum_id = ' . (int) $data_ary['forum_id'];
 				$result = $db->sql_query($sql);
 				$row = $db->sql_fetchrow($result);
 				$db->sql_freeresult($result);
 
 				// this post is the latest post in the forum, better update
-				if ($row['forum_last_post_id'] == $data['post_id'] && ($row['forum_last_post_subject'] !== $subject || $data['poster_id'] == ANONYMOUS))
+				if ($row['forum_last_post_id'] == $data_ary['post_id'] && ($row['forum_last_post_subject'] !== $subject || $data_ary['poster_id'] == ANONYMOUS))
 				{
 					// the post's subject changed
 					if ($row['forum_last_post_subject'] !== $subject)
@@ -2189,7 +2098,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 					}
 
 					// Update the user name if poster is anonymous... just in case a moderator changed it
-					if ($data['poster_id'] == ANONYMOUS)
+					if ($data_ary['poster_id'] == ANONYMOUS)
 					{
 						$sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = '" . $db->sql_escape($username) . "'";
 					}
@@ -2200,9 +2109,9 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 
 	// Update forum stats
 	$where_sql = array(
-		POSTS_TABLE		=> 'post_id = ' . $data['post_id'],
-		TOPICS_TABLE	=> 'topic_id = ' . $data['topic_id'],
-		FORUMS_TABLE	=> 'forum_id = ' . $data['forum_id'],
+		POSTS_TABLE		=> 'post_id = ' . $data_ary['post_id'],
+		TOPICS_TABLE	=> 'topic_id = ' . $data_ary['topic_id'],
+		FORUMS_TABLE	=> 'forum_id = ' . $data_ary['forum_id'],
 		USERS_TABLE		=> 'user_id = ' . $poster_id
 	);
 
@@ -2219,7 +2128,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 	if ($topic_type == POST_GLOBAL)
 	{
 		$sql = 'DELETE FROM ' . TOPICS_TABLE . '
-			WHERE topic_moved_id = ' . $data['topic_id'];
+			WHERE topic_moved_id = ' . $data_ary['topic_id'];
 		$db->sql_query($sql);
 	}
 
@@ -2227,7 +2136,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 	$db->sql_transaction('commit');
 
 	// Delete draft if post was loaded...
-	$draft_id = request_var('draft_loaded', 0);
+	$draft_id = $request->variable('draft_loaded', 0);
 	if ($draft_id)
 	{
 		$sql = 'DELETE FROM ' . DRAFTS_TABLE . "
@@ -2237,7 +2146,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 	}
 
 	// Index message contents
-	if ($update_search_index && $data['enable_indexing'])
+	if ($update_search_index && $data_ary['enable_indexing'])
 	{
 		// Select the search method and do some additional checks to ensure it can actually be utilised
 		$search_type = $config['search_type'];
@@ -2255,23 +2164,23 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 			trigger_error($error);
 		}
 
-		$search->index($mode, $data['post_id'], $data['message'], $subject, $poster_id, $data['forum_id']);
+		$search->index($mode, $data_ary['post_id'], $data_ary['message'], $subject, $poster_id, $data_ary['forum_id']);
 	}
 
 	// Topic Notification, do not change if moderator is changing other users posts...
 	if ($user->data['user_id'] == $poster_id)
 	{
-		if (!$data['notify_set'] && $data['notify'])
+		if (!$data_ary['notify_set'] && $data_ary['notify'])
 		{
 			$sql = 'INSERT INTO ' . TOPICS_WATCH_TABLE . ' (user_id, topic_id)
-				VALUES (' . $user->data['user_id'] . ', ' . $data['topic_id'] . ')';
+				VALUES (' . $user->data['user_id'] . ', ' . $data_ary['topic_id'] . ')';
 			$db->sql_query($sql);
 		}
-		else if (($config['email_enable'] || $config['jab_enable']) && $data['notify_set'] && !$data['notify'])
+		else if (($config['email_enable'] || $config['jab_enable']) && $data_ary['notify_set'] && !$data_ary['notify'])
 		{
 			$sql = 'DELETE FROM ' . TOPICS_WATCH_TABLE . '
 				WHERE user_id = ' . $user->data['user_id'] . '
-					AND topic_id = ' . $data['topic_id'];
+					AND topic_id = ' . $data_ary['topic_id'];
 			$db->sql_query($sql);
 		}
 	}
@@ -2279,12 +2188,12 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 	if ($mode == 'post' || $mode == 'reply' || $mode == 'quote')
 	{
 		// Mark this topic as posted to
-		markread('post', $data['forum_id'], $data['topic_id']);
+		markread('post', $data_ary['forum_id'], $data_ary['topic_id']);
 	}
 
 	// Mark this topic as read
 	// We do not use post_time here, this is intended (post_time can have a date in the past if editing a message)
-	markread('topic', $data['forum_id'], $data['topic_id'], time());
+	markread('topic', $data_ary['forum_id'], $data_ary['topic_id'], time());
 
 	//
 	if ($config['load_db_lastread'] && $user->data['is_registered'])
@@ -2292,7 +2201,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 		$sql = 'SELECT mark_time
 			FROM ' . FORUMS_TRACK_TABLE . '
 			WHERE user_id = ' . $user->data['user_id'] . '
-				AND forum_id = ' . $data['forum_id'];
+				AND forum_id = ' . $data_ary['forum_id'];
 		$result = $db->sql_query($sql);
 		$f_mark_time = (int) $db->sql_fetchfield('mark_time');
 		$db->sql_freeresult($result);
@@ -2307,12 +2216,12 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 		// Update forum info
 		$sql = 'SELECT forum_last_post_time
 			FROM ' . FORUMS_TABLE . '
-			WHERE forum_id = ' . $data['forum_id'];
+			WHERE forum_id = ' . $data_ary['forum_id'];
 		$result = $db->sql_query($sql);
 		$forum_last_post_time = (int) $db->sql_fetchfield('forum_last_post_time');
 		$db->sql_freeresult($result);
 
-		update_forum_tracking_info($data['forum_id'], $forum_last_post_time, $f_mark_time, false);
+		update_forum_tracking_info($data_ary['forum_id'], $forum_last_post_time, $f_mark_time, false);
 	}
 
 	// If a username was supplied or the poster is a guest, we will use the supplied username.
@@ -2321,15 +2230,16 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 	$username = ($username !== '' || !$user->data['is_registered']) ? $username : $user->data['username'];
 
 	// Send Notifications
-	$notification_data = array_merge($data, array(
-		'topic_title'		=> (isset($data['topic_title'])) ? $data['topic_title'] : $subject,
+	$notification_data = array_merge($data_ary, array(
+		'topic_title'		=> (isset($data_ary['topic_title'])) ? $data_ary['topic_title'] : $subject,
 		'post_username'		=> $username,
 		'poster_id'			=> $poster_id,
-		'post_text'			=> $data['message'],
+		'post_text'			=> $data_ary['message'],
 		'post_time'			=> $current_time,
 		'post_subject'		=> $subject,
 	));
 
+	/* @var $phpbb_notifications \phpbb\notification\manager */
 	$phpbb_notifications = $phpbb_container->get('notification_manager');
 
 	if ($post_visibility == ITEM_APPROVED)
@@ -2434,25 +2344,27 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 	$params = $add_anchor = '';
 
 	if ($post_visibility == ITEM_APPROVED ||
-		($auth->acl_get('m_softdelete', $data['forum_id']) && $post_visibility == ITEM_DELETED) ||
-		($auth->acl_get('m_approve', $data['forum_id']) && in_array($post_visibility, array(ITEM_UNAPPROVED, ITEM_REAPPROVE))))
+		($auth->acl_get('m_softdelete', $data_ary['forum_id']) && $post_visibility == ITEM_DELETED) ||
+		($auth->acl_get('m_approve', $data_ary['forum_id']) && in_array($post_visibility, array(ITEM_UNAPPROVED, ITEM_REAPPROVE))))
 	{
-		$params .= '&amp;t=' . $data['topic_id'];
+		$params .= '&amp;t=' . $data_ary['topic_id'];
 
 		if ($mode != 'post')
 		{
-			$params .= '&amp;p=' . $data['post_id'];
-			$add_anchor = '#p' . $data['post_id'];
+			$params .= '&amp;p=' . $data_ary['post_id'];
+			$add_anchor = '#p' . $data_ary['post_id'];
 		}
 	}
 	else if ($mode != 'post' && $post_mode != 'edit_first_post' && $post_mode != 'edit_topic')
 	{
-		$params .= '&amp;t=' . $data['topic_id'];
+		$params .= '&amp;t=' . $data_ary['topic_id'];
 	}
 
 	$url = (!$params) ? "{$phpbb_root_path}viewforum.$phpEx" : "{$phpbb_root_path}viewtopic.$phpEx";
-	$url = append_sid($url, 'f=' . $data['forum_id'] . $params) . $add_anchor;
+	$url = append_sid($url, 'f=' . $data_ary['forum_id'] . $params) . $add_anchor;
 
+	$poll = $poll_ary;
+	$data = $data_ary;
 	/**
 	* This event is used for performing actions directly after a post or topic
 	* has been submitted. When a new topic is posted, the topic ID is
@@ -2490,6 +2402,10 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 		'url',
 	);
 	extract($phpbb_dispatcher->trigger_event('core.submit_post_end', compact($vars)));
+	$data_ary = $data;
+	$poll_ary = $poll;
+	unset($data);
+	unset($poll);
 
 	return $url;
 }
@@ -2510,7 +2426,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
 */
 function phpbb_bump_topic($forum_id, $topic_id, $post_data, $bump_time = false)
 {
-	global $config, $db, $user, $phpEx, $phpbb_root_path;
+	global $config, $db, $user, $phpEx, $phpbb_root_path, $phpbb_log;
 
 	if ($bump_time === false)
 	{
@@ -2589,7 +2505,11 @@ function phpbb_bump_topic($forum_id, $topic_id, $post_data, $bump_time = false)
 		update_forum_tracking_info($forum_id, $forum_last_post_time, $f_mark_time, false);
 	}
 
-	add_log('mod', $forum_id, $topic_id, 'LOG_BUMP_TOPIC', $post_data['topic_title']);
+	$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_BUMP_TOPIC', false, array(
+		'forum_id' => $forum_id,
+		'topic_id' => $topic_id,
+		$post_data['topic_title']
+	));
 
 	$url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;p={$post_data['topic_last_post_id']}") . "#p{$post_data['topic_last_post_id']}";
 
@@ -2627,7 +2547,7 @@ function phpbb_upload_popup($forum_style = 0)
 function phpbb_handle_post_delete($forum_id, $topic_id, $post_id, &$post_data, $is_soft = false, $delete_reason = '')
 {
 	global $user, $auth, $config, $request;
-	global $phpbb_root_path, $phpEx;
+	global $phpbb_root_path, $phpEx, $phpbb_log;
 
 	$perm_check = ($is_soft) ? 'softdelete' : 'delete';
 
@@ -2662,14 +2582,27 @@ function phpbb_handle_post_delete($forum_id, $topic_id, $post_id, &$post_data, $
 
 			if ($next_post_id === false)
 			{
-				add_log('mod', $forum_id, $topic_id, (($is_soft) ? 'LOG_SOFTDELETE_TOPIC' : 'LOG_DELETE_TOPIC'), $post_data['topic_title'], $post_username, $delete_reason);
+				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, (($is_soft) ? 'LOG_SOFTDELETE_TOPIC' : 'LOG_DELETE_TOPIC'), false, array(
+					'forum_id' => $forum_id,
+					'topic_id' => $topic_id,
+					$post_data['topic_title'],
+					$post_username,
+					$delete_reason
+				));
 
 				$meta_info = append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id");
 				$message = $user->lang['POST_DELETED'];
 			}
 			else
 			{
-				add_log('mod', $forum_id, $topic_id, (($is_soft) ? 'LOG_SOFTDELETE_POST' : 'LOG_DELETE_POST'), $post_data['post_subject'], $post_username, $delete_reason);
+				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, (($is_soft) ? 'LOG_SOFTDELETE_POST' : 'LOG_DELETE_POST'), false, array(
+					'forum_id' => $forum_id,
+					'topic_id' => $topic_id,
+					'post_id'  => $post_id,
+					$post_data['post_subject'],
+					$post_username,
+					$delete_reason
+				));
 
 				$meta_info = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;p=$next_post_id") . "#p$next_post_id";
 				$message = $user->lang['POST_DELETED'];
--- a/includes/functions_privmsgs.php
+++ b/includes/functions_privmsgs.php
@@ -226,7 +226,7 @@ function get_folder($user_id, $folder_id = false)
 */
 function clean_sentbox($num_sentbox_messages)
 {
-	global $db, $user, $config;
+	global $db, $user;
 
 	// Check Message Limit
 	if ($user->data['message_limit'] && $num_sentbox_messages > $user->data['message_limit'])
@@ -255,8 +255,6 @@ function clean_sentbox($num_sentbox_messages)
 */
 function check_rule(&$rules, &$rule_row, &$message_row, $user_id)
 {
-	global $user, $config;
-
 	if (!isset($rules[$rule_row['rule_check']][$rule_row['rule_connection']]))
 	{
 		return false;
@@ -335,7 +333,7 @@ function check_rule(&$rules, &$rule_row, &$message_row, $user_id)
 		break;
 
 		case ACTION_DELETE_MESSAGE:
-			global $db, $auth;
+			global $db;
 
 			// Check for admins/mods - users are not allowed to remove those messages...
 			// We do the check here to make sure the data we use is consistent
@@ -546,7 +544,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
 	}
 
 	// We place actions into arrays, to save queries.
-	$sql = $unread_ids = $delete_ids = $important_ids = array();
+	$unread_ids = $delete_ids = $important_ids = array();
 
 	foreach ($action_ary as $msg_id => $msg_ary)
 	{
@@ -803,6 +801,7 @@ function move_pm($user_id, $message_limit, $move_msg_ids, $dest_folder, $cur_fol
 
 			if (!$row)
 			{
+				send_status_line(403, 'Forbidden');
 				trigger_error('NOT_AUTHORISED');
 			}
 
@@ -881,17 +880,25 @@ function update_unread_status($unread, $msg_id, $user_id, $folder_id)
 
 	global $db, $user, $phpbb_container;
 
+	/* @var $phpbb_notifications \phpbb\notification\manager */
 	$phpbb_notifications = $phpbb_container->get('notification_manager');
 
-	$phpbb_notifications->mark_notifications_read('notification.type.pm', $msg_id, $user_id);
+	$phpbb_notifications->mark_notifications('notification.type.pm', $msg_id, $user_id);
 
 	$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . "
 		SET pm_unread = 0
 		WHERE msg_id = $msg_id
 			AND user_id = $user_id
-			AND folder_id = $folder_id";
+			AND folder_id = $folder_id
+			AND pm_unread = 1";
 	$db->sql_query($sql);
 
+	// If the message is already marked as read, we just skip the rest to avoid negative PM count
+	if (!$db->sql_affectedrows())
+	{
+		return;
+	}
+
 	$sql = 'UPDATE ' . USERS_TABLE . "
 		SET user_unread_privmsg = user_unread_privmsg - 1
 		WHERE user_id = $user_id";
@@ -937,11 +944,10 @@ function mark_folder_read($user_id, $folder_id)
 */
 function handle_mark_actions($user_id, $mark_action)
 {
-	global $db, $user, $phpbb_root_path, $phpEx;
+	global $db, $user, $phpbb_root_path, $phpEx, $request;
 
-	$msg_ids		= request_var('marked_msg_id', array(0));
-	$cur_folder_id	= request_var('cur_folder_id', PRIVMSGS_NO_BOX);
-	$confirm		= (isset($_POST['confirm'])) ? true : false;
+	$msg_ids		= $request->variable('marked_msg_id', array(0));
+	$cur_folder_id	= $request->variable('cur_folder_id', PRIVMSGS_NO_BOX);
 
 	if (!sizeof($msg_ids))
 	{
@@ -967,6 +973,7 @@ function handle_mark_actions($user_id, $mark_action)
 
 			if (!$auth->acl_get('u_pm_delete'))
 			{
+				send_status_line(403, 'Forbidden');
 				trigger_error('NO_AUTH_DELETE_MESSAGE');
 			}
 
@@ -1006,7 +1013,7 @@ function handle_mark_actions($user_id, $mark_action)
 */
 function delete_pm($user_id, $msg_ids, $folder_id)
 {
-	global $db, $user, $phpbb_root_path, $phpEx, $phpbb_container, $phpbb_dispatcher;
+	global $db, $user, $phpbb_container, $phpbb_dispatcher;
 
 	$user_id	= (int) $user_id;
 	$folder_id	= (int) $folder_id;
@@ -1130,6 +1137,7 @@ function delete_pm($user_id, $msg_ids, $folder_id)
 		$user->data['user_unread_privmsg'] -= $num_unread;
 	}
 
+	/* @var $phpbb_notifications \phpbb\notification\manager */
 	$phpbb_notifications = $phpbb_container->get('notification_manager');
 
 	$phpbb_notifications->delete_notifications('notification.type.pm', array_keys($delete_rows));
@@ -1151,12 +1159,10 @@ function delete_pm($user_id, $msg_ids, $folder_id)
 	if (sizeof($delete_ids))
 	{
 		// Check if there are any attachments we need to remove
-		if (!function_exists('delete_attachments'))
-		{
-			include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
-		}
-
-		delete_attachments('message', $delete_ids, false);
+		/** @var \phpbb\attachment\manager $attachment_manager */
+		$attachment_manager = $phpbb_container->get('attachment.manager');
+		$attachment_manager->delete('message', $delete_ids, false);
+		unset($attachment_manager);
 
 		$sql = 'DELETE FROM ' . PRIVMSGS_TABLE . '
 			WHERE ' . $db->sql_in_set('msg_id', $delete_ids);
@@ -1177,8 +1183,6 @@ function delete_pm($user_id, $msg_ids, $folder_id)
 */
 function phpbb_delete_user_pms($user_id)
 {
-	global $db, $user, $phpbb_root_path, $phpEx;
-
 	$user_id = (int) $user_id;
 
 	if (!$user_id)
@@ -1198,7 +1202,7 @@ function phpbb_delete_user_pms($user_id)
 */
 function phpbb_delete_users_pms($user_ids)
 {
-	global $db, $user, $phpbb_root_path, $phpEx, $phpbb_container;
+	global $db, $phpbb_container;
 
 	$user_id_sql = $db->sql_in_set('user_id', $user_ids);
 	$author_id_sql = $db->sql_in_set('author_id', $user_ids);
@@ -1243,6 +1247,7 @@ function phpbb_delete_users_pms($user_ids)
 
 	$db->sql_transaction('begin');
 
+	/* @var $phpbb_notifications \phpbb\notification\manager */
 	$phpbb_notifications = $phpbb_container->get('notification_manager');
 
 	if (!empty($undelivered_msg))
@@ -1360,12 +1365,10 @@ function phpbb_delete_users_pms($user_ids)
 		if (!empty($delete_ids))
 		{
 			// Check if there are any attachments we need to remove
-			if (!function_exists('delete_attachments'))
-			{
-				include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
-			}
-
-			delete_attachments('message', $delete_ids, false);
+			/** @var \phpbb\attachment\manager $attachment_manager */
+			$attachment_manager = $phpbb_container->get('attachment.manager');
+			$attachment_manager->delete('message', $delete_ids, false);
+			unset($attachment_manager);
 
 			$sql = 'DELETE FROM ' . PRIVMSGS_TABLE . '
 				WHERE ' . $db->sql_in_set('msg_id', $delete_ids);
@@ -1397,8 +1400,6 @@ function phpbb_delete_users_pms($user_ids)
 */
 function rebuild_header($check_ary)
 {
-	global $db;
-
 	$address = array();
 
 	foreach ($check_ary as $check_type => $address_field)
@@ -1433,7 +1434,10 @@ function rebuild_header($check_ary)
 */
 function write_pm_addresses($check_ary, $author_id, $plaintext = false)
 {
-	global $db, $user, $template, $phpbb_root_path, $phpEx;
+	global $db, $user, $template, $phpbb_root_path, $phpEx, $phpbb_container;
+
+	/** @var \phpbb\group\helper $group_helper */
+	$group_helper = $phpbb_container->get('group_helper');
 
 	$addresses = array();
 
@@ -1494,7 +1498,7 @@ function write_pm_addresses($check_ary, $author_id, $plaintext = false)
 				{
 					if ($check_type == 'to' || $author_id == $user->data['user_id'] || $row['user_id'] == $user->data['user_id'])
 					{
-						$address[] = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'];
+						$address[] = $group_helper->get_name($row['group_name']);
 					}
 				}
 				$db->sql_freeresult($result);
@@ -1514,7 +1518,7 @@ function write_pm_addresses($check_ary, $author_id, $plaintext = false)
 					{
 						if ($check_type == 'to' || $author_id == $user->data['user_id'] || $row['user_id'] == $user->data['user_id'])
 						{
-							$row['group_name'] = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'];
+							$row['group_name'] = $group_helper->get_name($row['group_name']);
 							$address['group'][$row['group_id']] = array('name' => $row['group_name'], 'colour' => $row['group_colour']);
 						}
 					}
@@ -1575,7 +1579,7 @@ function write_pm_addresses($check_ary, $author_id, $plaintext = false)
 */
 function get_folder_status($folder_id, $folder)
 {
-	global $db, $user, $config;
+	global $user;
 
 	if (isset($folder[$folder_id]))
 	{
@@ -1606,9 +1610,9 @@ function get_folder_status($folder_id, $folder)
 /**
 * Submit PM
 */
-function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
+function submit_pm($mode, $subject, &$data_ary, $put_in_outbox = true)
 {
-	global $db, $auth, $config, $phpEx, $template, $user, $phpbb_root_path, $phpbb_container, $phpbb_dispatcher;
+	global $db, $auth, $config, $user, $phpbb_root_path, $phpbb_container, $phpbb_dispatcher, $request;
 
 	// We do not handle erasing pms here
 	if ($mode == 'delete')
@@ -1618,6 +1622,7 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 
 	$current_time = time();
 
+	$data = $data_ary;
 	/**
 	* Get all parts of the PM that are to be submited to the DB.
 	*
@@ -1629,6 +1634,8 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 	*/
 	$vars = array('mode', 'subject', 'data');
 	extract($phpbb_dispatcher->trigger_event('core.submit_pm_before', compact($vars)));
+	$data_ary = $data;
+	unset($data);
 
 	// Collect some basic information about which tables and which rows to update/insert
 	$sql_data = array();
@@ -1644,9 +1651,9 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 		$_types = array('u', 'g');
 		foreach ($_types as $ug_type)
 		{
-			if (isset($data['address_list'][$ug_type]) && sizeof($data['address_list'][$ug_type]))
+			if (isset($data_ary['address_list'][$ug_type]) && sizeof($data_ary['address_list'][$ug_type]))
 			{
-				foreach ($data['address_list'][$ug_type] as $id => $field)
+				foreach ($data_ary['address_list'][$ug_type] as $id => $field)
 				{
 					$id = (int) $id;
 
@@ -1666,7 +1673,7 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 			}
 		}
 
-		if (isset($data['address_list']['g']) && sizeof($data['address_list']['g']))
+		if (isset($data_ary['address_list']['g']) && sizeof($data_ary['address_list']['g']))
 		{
 			// We need to check the PM status of group members (do they want to receive PM's?)
 			// Only check if not a moderator or admin, since they are allowed to override this user setting
@@ -1674,7 +1681,7 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 
 			$sql = 'SELECT u.user_type, ug.group_id, ug.user_id
 				FROM ' . USERS_TABLE . ' u, ' . USER_GROUP_TABLE . ' ug
-				WHERE ' . $db->sql_in_set('ug.group_id', array_keys($data['address_list']['g'])) . '
+				WHERE ' . $db->sql_in_set('ug.group_id', array_keys($data_ary['address_list']['g'])) . '
 					AND ug.user_pending = 0
 					AND u.user_id = ug.user_id
 					AND u.user_type IN (' . USER_NORMAL . ', ' . USER_FOUNDER . ')' .
@@ -1683,7 +1690,7 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 
 			while ($row = $db->sql_fetchrow($result))
 			{
-				$field = ($data['address_list']['g'][$row['group_id']] == 'to') ? 'to' : 'bcc';
+				$field = ($data_ary['address_list']['g'][$row['group_id']] == 'to') ? 'to' : 'bcc';
 				$recipients[$row['user_id']] = $field;
 			}
 			$db->sql_freeresult($result);
@@ -1706,13 +1713,13 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 	{
 		case 'reply':
 		case 'quote':
-			$root_level = ($data['reply_from_root_level']) ? $data['reply_from_root_level'] : $data['reply_from_msg_id'];
+			$root_level = ($data_ary['reply_from_root_level']) ? $data_ary['reply_from_root_level'] : $data_ary['reply_from_msg_id'];
 
 			// Set message_replied switch for this user
 			$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . '
 				SET pm_replied = 1
-				WHERE user_id = ' . $data['from_user_id'] . '
-					AND msg_id = ' . $data['reply_from_msg_id'];
+				WHERE user_id = ' . $data_ary['from_user_id'] . '
+					AND msg_id = ' . $data_ary['reply_from_msg_id'];
 
 		// no break
 
@@ -1721,19 +1728,19 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 		case 'quotepost':
 			$sql_data = array(
 				'root_level'		=> $root_level,
-				'author_id'			=> $data['from_user_id'],
-				'icon_id'			=> $data['icon_id'],
-				'author_ip'			=> $data['from_user_ip'],
+				'author_id'			=> $data_ary['from_user_id'],
+				'icon_id'			=> $data_ary['icon_id'],
+				'author_ip'			=> $data_ary['from_user_ip'],
 				'message_time'		=> $current_time,
-				'enable_bbcode'		=> $data['enable_bbcode'],
-				'enable_smilies'	=> $data['enable_smilies'],
-				'enable_magic_url'	=> $data['enable_urls'],
-				'enable_sig'		=> $data['enable_sig'],
+				'enable_bbcode'		=> $data_ary['enable_bbcode'],
+				'enable_smilies'	=> $data_ary['enable_smilies'],
+				'enable_magic_url'	=> $data_ary['enable_urls'],
+				'enable_sig'		=> $data_ary['enable_sig'],
 				'message_subject'	=> $subject,
-				'message_text'		=> $data['message'],
-				'message_attachment'=> (!empty($data['attachment_data'])) ? 1 : 0,
-				'bbcode_bitfield'	=> $data['bbcode_bitfield'],
-				'bbcode_uid'		=> $data['bbcode_uid'],
+				'message_text'		=> $data_ary['message'],
+				'message_attachment'=> (!empty($data_ary['attachment_data'])) ? 1 : 0,
+				'bbcode_bitfield'	=> $data_ary['bbcode_bitfield'],
+				'bbcode_uid'		=> $data_ary['bbcode_uid'],
 				'to_address'		=> implode(':', $to),
 				'bcc_address'		=> implode(':', $bcc),
 				'message_reported'	=> 0,
@@ -1742,35 +1749,33 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 
 		case 'edit':
 			$sql_data = array(
-				'icon_id'			=> $data['icon_id'],
+				'icon_id'			=> $data_ary['icon_id'],
 				'message_edit_time'	=> $current_time,
-				'enable_bbcode'		=> $data['enable_bbcode'],
-				'enable_smilies'	=> $data['enable_smilies'],
-				'enable_magic_url'	=> $data['enable_urls'],
-				'enable_sig'		=> $data['enable_sig'],
+				'enable_bbcode'		=> $data_ary['enable_bbcode'],
+				'enable_smilies'	=> $data_ary['enable_smilies'],
+				'enable_magic_url'	=> $data_ary['enable_urls'],
+				'enable_sig'		=> $data_ary['enable_sig'],
 				'message_subject'	=> $subject,
-				'message_text'		=> $data['message'],
-				'message_attachment'=> (!empty($data['attachment_data'])) ? 1 : 0,
-				'bbcode_bitfield'	=> $data['bbcode_bitfield'],
-				'bbcode_uid'		=> $data['bbcode_uid']
+				'message_text'		=> $data_ary['message'],
+				'message_attachment'=> (!empty($data_ary['attachment_data'])) ? 1 : 0,
+				'bbcode_bitfield'	=> $data_ary['bbcode_bitfield'],
+				'bbcode_uid'		=> $data_ary['bbcode_uid']
 			);
 		break;
 	}
 
 	if (sizeof($sql_data))
 	{
-		$query = '';
-
 		if ($mode == 'post' || $mode == 'reply' || $mode == 'quote' || $mode == 'quotepost' || $mode == 'forward')
 		{
 			$db->sql_query('INSERT INTO ' . PRIVMSGS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_data));
-			$data['msg_id'] = $db->sql_nextid();
+			$data_ary['msg_id'] = $db->sql_nextid();
 		}
 		else if ($mode == 'edit')
 		{
 			$sql = 'UPDATE ' . PRIVMSGS_TABLE . '
 				SET message_edit_count = message_edit_count + 1, ' . $db->sql_build_array('UPDATE', $sql_data) . '
-				WHERE msg_id = ' . $data['msg_id'];
+				WHERE msg_id = ' . $data_ary['msg_id'];
 			$db->sql_query($sql);
 		}
 	}
@@ -1787,9 +1792,9 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 		foreach ($recipients as $user_id => $type)
 		{
 			$sql_ary[] = array(
-				'msg_id'		=> (int) $data['msg_id'],
+				'msg_id'		=> (int) $data_ary['msg_id'],
 				'user_id'		=> (int) $user_id,
-				'author_id'		=> (int) $data['from_user_id'],
+				'author_id'		=> (int) $data_ary['from_user_id'],
 				'folder_id'		=> PRIVMSGS_NO_BOX,
 				'pm_new'		=> 1,
 				'pm_unread'		=> 1,
@@ -1808,9 +1813,9 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 		if ($put_in_outbox)
 		{
 			$db->sql_query('INSERT INTO ' . PRIVMSGS_TO_TABLE . ' ' . $db->sql_build_array('INSERT', array(
-				'msg_id'		=> (int) $data['msg_id'],
-				'user_id'		=> (int) $data['from_user_id'],
-				'author_id'		=> (int) $data['from_user_id'],
+				'msg_id'		=> (int) $data_ary['msg_id'],
+				'user_id'		=> (int) $data_ary['from_user_id'],
+				'author_id'		=> (int) $data_ary['from_user_id'],
 				'folder_id'		=> PRIVMSGS_OUTBOX,
 				'pm_new'		=> 0,
 				'pm_unread'		=> 0,
@@ -1824,17 +1829,17 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 	{
 		$sql = 'UPDATE ' . USERS_TABLE . "
 			SET user_lastpost_time = $current_time
-			WHERE user_id = " . $data['from_user_id'];
+			WHERE user_id = " . $data_ary['from_user_id'];
 		$db->sql_query($sql);
 	}
 
 	// Submit Attachments
-	if (!empty($data['attachment_data']) && $data['msg_id'] && in_array($mode, array('post', 'reply', 'quote', 'quotepost', 'edit', 'forward')))
+	if (!empty($data_ary['attachment_data']) && $data_ary['msg_id'] && in_array($mode, array('post', 'reply', 'quote', 'quotepost', 'edit', 'forward')))
 	{
 		$space_taken = $files_added = 0;
 		$orphan_rows = array();
 
-		foreach ($data['attachment_data'] as $pos => $attach_row)
+		foreach ($data_ary['attachment_data'] as $pos => $attach_row)
 		{
 			$orphan_rows[(int) $attach_row['attach_id']] = array();
 		}
@@ -1857,7 +1862,7 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 			$db->sql_freeresult($result);
 		}
 
-		foreach ($data['attachment_data'] as $pos => $attach_row)
+		foreach ($data_ary['attachment_data'] as $pos => $attach_row)
 		{
 			if ($attach_row['is_orphan'] && !isset($orphan_rows[$attach_row['attach_id']]))
 			{
@@ -1885,10 +1890,10 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 				$files_added++;
 
 				$attach_sql = array(
-					'post_msg_id'		=> $data['msg_id'],
+					'post_msg_id'		=> $data_ary['msg_id'],
 					'topic_id'			=> 0,
 					'is_orphan'			=> 0,
-					'poster_id'			=> $data['from_user_id'],
+					'poster_id'			=> $data_ary['from_user_id'],
 					'attach_comment'	=> $attach_row['attach_comment'],
 				);
 
@@ -1902,29 +1907,30 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 
 		if ($space_taken && $files_added)
 		{
-			set_config_count('upload_dir_size', $space_taken, true);
-			set_config_count('num_files', $files_added, true);
+			$config->increment('upload_dir_size', $space_taken, false);
+			$config->increment('num_files', $files_added, false);
 		}
 	}
 
 	// Delete draft if post was loaded...
-	$draft_id = request_var('draft_loaded', 0);
+	$draft_id = $request->variable('draft_loaded', 0);
 	if ($draft_id)
 	{
 		$sql = 'DELETE FROM ' . DRAFTS_TABLE . "
 			WHERE draft_id = $draft_id
-				AND user_id = " . $data['from_user_id'];
+				AND user_id = " . $data_ary['from_user_id'];
 		$db->sql_query($sql);
 	}
 
 	$db->sql_transaction('commit');
 
 	// Send Notifications
-	$pm_data = array_merge($data, array(
+	$pm_data = array_merge($data_ary, array(
 		'message_subject'		=> $subject,
 		'recipients'			=> $recipients,
 	));
 
+	/* @var $phpbb_notifications \phpbb\notification\manager */
 	$phpbb_notifications = $phpbb_container->get('notification_manager');
 
 	if ($mode == 'edit')
@@ -1936,6 +1942,7 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 		$phpbb_notifications->add_notifications('notification.type.pm', $pm_data);
 	}
 
+	$data = $data_ary;
 	/**
 	* Get PM message ID after submission to DB
 	*
@@ -1948,8 +1955,10 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 	*/
 	$vars = array('mode', 'subject', 'data', 'pm_data');
 	extract($phpbb_dispatcher->trigger_event('core.submit_pm_after', compact($vars)));
+	$data_ary = $data;
+	unset($data);
 
-	return $data['msg_id'];
+	return $data_ary['msg_id'];
 }
 
 /**
@@ -1957,7 +1966,7 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
 */
 function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode = false)
 {
-	global $db, $user, $config, $template, $phpbb_root_path, $phpEx, $auth;
+	global $db, $user, $template, $phpbb_root_path, $phpEx, $auth;
 
 	// Select all receipts and the author from the pm we currently view, to only display their pm-history
 	$sql = 'SELECT author_id, user_id
@@ -2096,6 +2105,8 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode
 			'S_IN_POST_MODE'	=> $in_post_mode,
 
 			'MSG_ID'			=> $row['msg_id'],
+			'MESSAGE_TIME'		=> $row['message_time'],
+			'USER_ID'			=> $row['user_id'],
 			'U_VIEW_MESSAGE'	=> "$url&amp;f=$folder_id&amp;p=" . $row['msg_id'],
 			'U_QUOTE'			=> (!$in_post_mode && $auth->acl_get('u_sendpm') && $author_id != ANONYMOUS) ? "$url&amp;mode=compose&amp;action=quote&amp;f=" . $folder_id . "&amp;p=" . $row['msg_id'] : '',
 			'U_POST_REPLY_PM'	=> ($author_id != $user->data['user_id'] && $author_id != ANONYMOUS && $auth->acl_get('u_sendpm')) ? "$url&amp;mode=compose&amp;action=reply&amp;f=$folder_id&amp;p=" . $row['msg_id'] : '')
@@ -2123,17 +2134,41 @@ function set_user_message_limit()
 {
 	global $user, $db, $config;
 
-	// Get maximum about from user memberships - if it is 0, there is no limit set and we use the maximum value within the config.
-	$sql = 'SELECT MAX(g.group_message_limit) as max_message_limit
+	// Get maximum about from user memberships
+	$message_limit = phpbb_get_max_setting_from_group($db, $user->data['user_id'], 'message_limit');
+
+	// If it is 0, there is no limit set and we use the maximum value within the config.
+	$user->data['message_limit'] = (!$message_limit) ? $config['pm_max_msgs'] : $message_limit;
+}
+
+/**
+ * Get the maximum PM setting for the groups of the user
+ *
+ * @param \phpbb\db\driver\driver_interface $db
+ * @param int $user_id
+ * @param string $setting Only 'max_recipients' and 'message_limit' are supported
+ * @return int The maximum setting for all groups of the user, unless one group has '0'
+ * @throws \InvalidArgumentException If selected group setting is not supported
+ */
+function phpbb_get_max_setting_from_group(\phpbb\db\driver\driver_interface $db, $user_id, $setting)
+{
+	if ($setting !== 'max_recipients' && $setting !== 'message_limit')
+	{
+		throw new InvalidArgumentException('Setting "' . $setting . '" is not supported');
+	}
+
+	// Get maximum number of allowed recipients
+	$sql = 'SELECT MAX(g.group_' . $setting . ') as max_setting
 		FROM ' . GROUPS_TABLE . ' g, ' . USER_GROUP_TABLE . ' ug
-		WHERE ug.user_id = ' . $user->data['user_id'] . '
+		WHERE ug.user_id = ' . (int) $user_id . '
 			AND ug.user_pending = 0
 			AND ug.group_id = g.group_id';
 	$result = $db->sql_query($sql);
-	$message_limit = (int) $db->sql_fetchfield('max_message_limit');
+	$row = $db->sql_fetchrow($result);
 	$db->sql_freeresult($result);
+	$max_setting = (int) $row['max_setting'];
 
-	$user->data['message_limit'] = (!$message_limit) ? $config['pm_max_msgs'] : $message_limit;
+	return $max_setting;
 }
 
 /**
@@ -2147,7 +2182,10 @@ function set_user_message_limit()
 */
 function get_recipient_strings($pm_by_id)
 {
-	global $db, $phpbb_root_path, $phpEx, $user;
+	global $db, $phpbb_root_path, $phpEx, $user, $phpbb_container;
+
+	/** @var \phpbb\group\helper $group_helper */
+	$group_helper = $phpbb_container->get('group_helper');
 
 	$address_list = $recipient_list = $address = array();
 
@@ -2193,7 +2231,7 @@ function get_recipient_strings($pm_by_id)
 			{
 				if ($ug_type == 'g')
 				{
-					$row['name'] = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['name']] : $row['name'];
+					$row['name'] = $group_helper->get_name($row['name']);
 				}
 
 				$recipient_list[$ug_type][$row['id']] = array('name' => $row['name'], 'colour' => $row['colour']);
--- a/includes/functions_transfer.php
+++ b/includes/functions_transfer.php
@@ -406,9 +406,6 @@ class ftp extends transfer
 	*/
 	function _put($from_file, $to_file)
 	{
-		// get the file extension
-		$file_extension = strtolower(substr(strrchr($to_file, '.'), 1));
-
 		// We only use the BINARY file mode to cicumvent rewrite actions from ftp server (mostly linefeeds being replaced)
 		$mode = FTP_BINARY;
 
--- a/includes/functions_user.php
+++ b/includes/functions_user.php
@@ -89,7 +89,7 @@ function user_get_id_name(&$user_id_ary, &$username_ary, $user_type = false)
 */
 function update_last_username()
 {
-	global $db;
+	global $config, $db;
 
 	// Get latest username
 	$sql = 'SELECT user_id, username, user_colour
@@ -102,9 +102,9 @@ function update_last_username()
 
 	if ($row)
 	{
-		set_config('newest_user_id', $row['user_id'], true);
-		set_config('newest_username', $row['username'], true);
-		set_config('newest_user_colour', $row['user_colour'], true);
+		$config->set('newest_user_id', $row['user_id'], false);
+		$config->set('newest_username', $row['username'], false);
+		$config->set('newest_user_colour', $row['user_colour'], false);
 	}
 }
 
@@ -148,7 +148,7 @@ function user_update_name($old_name, $new_name)
 
 	if ($config['newest_username'] == $old_name)
 	{
-		set_config('newest_username', $new_name, true);
+		$config->set('newest_username', $new_name, false);
 	}
 
 	/**
@@ -176,7 +176,7 @@ function user_update_name($old_name, $new_name)
 */
 function user_add($user_row, $cp_data = false, $notifications_data = null)
 {
-	global $db, $user, $auth, $config, $phpbb_root_path, $phpEx;
+	global $db, $config;
 	global $phpbb_dispatcher, $phpbb_container;
 
 	if (empty($user_row['username']) || !isset($user_row['group_id']) || !isset($user_row['user_email']) || !isset($user_row['user_type']))
@@ -291,6 +291,7 @@ function user_add($user_row, $cp_data = false, $notifications_data = null)
 	{
 		$cp_data['user_id'] = (int) $user_id;
 
+		/* @var $cp \phpbb\profilefields\manager */
 		$cp = $phpbb_container->get('profilefields.manager');
 		$sql = 'INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . ' ' .
 			$db->sql_build_array('INSERT', $cp->build_insert_sql_array($cp_data));
@@ -323,7 +324,7 @@ function user_add($user_row, $cp_data = false, $notifications_data = null)
 		{
 			global $phpbb_log;
 
-			// Because these actions only fill the log unneccessarily we skip the add_log() entry.
+			// Because these actions only fill the log unnecessarily, we disable it
 			$phpbb_log->disable('admin');
 
 			// Add user to "newly registered users" group and set to default group if admin specified so.
@@ -344,9 +345,9 @@ function user_add($user_row, $cp_data = false, $notifications_data = null)
 	// set the newest user and adjust the user count if the user is a normal user and no activation mail is sent
 	if ($user_row['user_type'] == USER_NORMAL || $user_row['user_type'] == USER_FOUNDER)
 	{
-		set_config('newest_user_id', $user_id, true);
-		set_config('newest_username', $user_row['username'], true);
-		set_config_count('num_users', 1, true);
+		$config->set('newest_user_id', $user_id, false);
+		$config->set('newest_username', $user_row['username'], false);
+		$config->increment('num_users', 1, false);
 
 		$sql = 'SELECT group_colour
 			FROM ' . GROUPS_TABLE . '
@@ -355,7 +356,7 @@ function user_add($user_row, $cp_data = false, $notifications_data = null)
 		$row = $db->sql_fetchrow($result);
 		$db->sql_freeresult($result);
 
-		set_config('newest_user_colour', $row['group_colour'], true);
+		$config->set('newest_user_colour', $row['group_colour'], false);
 	}
 
 	// Use default notifications settings if notifications_data is not set
@@ -376,6 +377,7 @@ function user_add($user_row, $cp_data = false, $notifications_data = null)
 	// Subscribe user to notifications if necessary
 	if (!empty($notifications_data))
 	{
+		/* @var $phpbb_notifications \phpbb\notification\manager */
 		$phpbb_notifications = $phpbb_container->get('notification_manager');
 		foreach ($notifications_data as $subscription)
 		{
@@ -616,7 +618,7 @@ function user_delete($mode, $user_ids, $retain_username = true)
 
 	if ($num_users_delta != 0)
 	{
-		set_config_count('num_users', $num_users_delta, true);
+		$config->increment('num_users', $num_users_delta, false);
 	}
 
 	// Now do the invariant tasks
@@ -849,12 +851,12 @@ function user_active_flip($mode, $user_id_ary, $reason = INACTIVE_MANUAL)
 
 	if ($deactivated)
 	{
-		set_config_count('num_users', $deactivated * (-1), true);
+		$config->increment('num_users', $deactivated * (-1), false);
 	}
 
 	if ($activated)
 	{
-		set_config_count('num_users', $activated, true);
+		$config->increment('num_users', $activated, false);
 	}
 
 	// Update latest username
@@ -874,7 +876,7 @@ function user_active_flip($mode, $user_id_ary, $reason = INACTIVE_MANUAL)
 */
 function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reason, $ban_give_reason = '')
 {
-	global $db, $user, $auth, $cache;
+	global $db, $user, $cache, $phpbb_log;
 
 	// Delete stale bans
 	$sql = 'DELETE FROM ' . BANLIST_TABLE . '
@@ -1023,7 +1025,6 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
 						if ($ip_2_counter == 0 && $ip_2_end == 254)
 						{
 							$ip_2_counter = 256;
-							$ip_2_fragment = 256;
 
 							$banlist_ary[] = "$ip_1_counter.*";
 						}
@@ -1036,7 +1037,6 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
 							if ($ip_3_counter == 0 && $ip_3_end == 254)
 							{
 								$ip_3_counter = 256;
-								$ip_3_fragment = 256;
 
 								$banlist_ary[] = "$ip_1_counter.$ip_2_counter.*";
 							}
@@ -1049,7 +1049,6 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
 								if ($ip_4_counter == 0 && $ip_4_end == 254)
 								{
 									$ip_4_counter = 256;
-									$ip_4_fragment = 256;
 
 									$banlist_ary[] = "$ip_1_counter.$ip_2_counter.$ip_3_counter.*";
 								}
@@ -1265,13 +1264,22 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
 		$log_entry = ($ban_exclude) ? 'LOG_BAN_EXCLUDE_' : 'LOG_BAN_';
 
 		// Add to admin log, moderator log and user notes
-		add_log('admin', $log_entry . strtoupper($mode), $ban_reason, $ban_list_log);
-		add_log('mod', 0, 0, $log_entry . strtoupper($mode), $ban_reason, $ban_list_log);
+		$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log_entry . strtoupper($mode), false, array($ban_reason, $ban_list_log));
+		$phpbb_log->add('mod', $user->data['user_id'], $user->ip, $log_entry . strtoupper($mode), false, array(
+			'forum_id' => 0,
+			'topic_id' => 0,
+			$ban_reason,
+			$ban_list_log
+		));
 		if ($mode == 'user')
 		{
 			foreach ($banlist_ary as $user_id)
 			{
-				add_log('user', $user_id, $log_entry . strtoupper($mode), $ban_reason, $ban_list_log);
+				$phpbb_log->add('user', $user->data['user_id'], $user->ip, $log_entry . strtoupper($mode), false, array(
+					'reportee_id' => $user_id,
+					$ban_reason,
+					$ban_list_log
+				));
 			}
 		}
 
@@ -1291,7 +1299,7 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
 */
 function user_unban($mode, $ban)
 {
-	global $db, $user, $auth, $cache;
+	global $db, $user, $cache, $phpbb_log, $phpbb_dispatcher;
 
 	// Delete stale bans
 	$sql = 'DELETE FROM ' . BANLIST_TABLE . '
@@ -1349,15 +1357,36 @@ function user_unban($mode, $ban)
 		$db->sql_query($sql);
 
 		// Add to moderator log, admin log and user notes
-		add_log('admin', 'LOG_UNBAN_' . strtoupper($mode), $l_unban_list);
-		add_log('mod', 0, 0, 'LOG_UNBAN_' . strtoupper($mode), $l_unban_list);
+		$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_UNBAN_' . strtoupper($mode), false, array($l_unban_list));
+		$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_UNBAN_' . strtoupper($mode), false, array(
+			'forum_id' => 0,
+			'topic_id' => 0,
+			$l_unban_list
+		));
 		if ($mode == 'user')
 		{
 			foreach ($user_ids_ary as $user_id)
 			{
-				add_log('user', $user_id, 'LOG_UNBAN_' . strtoupper($mode), $l_unban_list);
+				$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_UNBAN_' . strtoupper($mode), false, array(
+					'reportee_id' => $user_id,
+					$l_unban_list
+				));
 			}
 		}
+
+		/**
+		* Use this event to perform actions after the unban has been performed
+		*
+		* @event core.user_unban
+		* @var	string	mode			One of the following: user, ip, email
+		* @var	array	user_ids_ary	Array with user_ids
+		* @since 3.1.11-RC1
+		*/
+		$vars = array(
+			'mode',
+			'user_ids_ary',
+		);
+		extract($phpbb_dispatcher->trigger_event('core.user_unban', compact($vars)));
 	}
 
 	$cache->destroy('sql', BANLIST_TABLE);
@@ -1674,89 +1703,37 @@ function validate_username($username, $allowed_username = false)
 		return 'INVALID_CHARS';
 	}
 
-	$mbstring = $pcre = false;
-
-	// generic UTF-8 character types supported?
-	if (phpbb_pcre_utf8_support())
-	{
-		$pcre = true;
-	}
-	else if (function_exists('mb_ereg_match'))
-	{
-		mb_regex_encoding('UTF-8');
-		$mbstring = true;
-	}
-
 	switch ($config['allow_name_chars'])
 	{
 		case 'USERNAME_CHARS_ANY':
-			$pcre = true;
 			$regex = '.+';
 		break;
 
 		case 'USERNAME_ALPHA_ONLY':
-			$pcre = true;
 			$regex = '[A-Za-z0-9]+';
 		break;
 
 		case 'USERNAME_ALPHA_SPACERS':
-			$pcre = true;
 			$regex = '[A-Za-z0-9-[\]_+ ]+';
 		break;
 
 		case 'USERNAME_LETTER_NUM':
-			if ($pcre)
-			{
-				$regex = '[\p{Lu}\p{Ll}\p{N}]+';
-			}
-			else if ($mbstring)
-			{
-				$regex = '[[:upper:][:lower:][:digit:]]+';
-			}
-			else
-			{
-				$pcre = true;
-				$regex = '[a-zA-Z0-9]+';
-			}
+			$regex = '[\p{Lu}\p{Ll}\p{N}]+';
 		break;
 
 		case 'USERNAME_LETTER_NUM_SPACERS':
-			if ($pcre)
-			{
-				$regex = '[-\]_+ [\p{Lu}\p{Ll}\p{N}]+';
-			}
-			else if ($mbstring)
-			{
-				$regex = '[-\]_+ \[[:upper:][:lower:][:digit:]]+';
-			}
-			else
-			{
-				$pcre = true;
-				$regex = '[-\]_+ [a-zA-Z0-9]+';
-			}
+			$regex = '[-\]_+ [\p{Lu}\p{Ll}\p{N}]+';
 		break;
 
 		case 'USERNAME_ASCII':
 		default:
-			$pcre = true;
 			$regex = '[\x01-\x7F]+';
 		break;
 	}
 
-	if ($pcre)
-	{
-		if (!preg_match('#^' . $regex . '$#u', $username))
-		{
-			return 'INVALID_CHARS';
-		}
-	}
-	else if ($mbstring)
+	if (!preg_match('#^' . $regex . '$#u', $username))
 	{
-		mb_ereg_search_init($username, '^' . $regex . '$');
-		if (!mb_ereg_search())
-		{
-			return 'INVALID_CHARS';
-		}
+		return 'INVALID_CHARS';
 	}
 
 	$sql = 'SELECT username
@@ -1811,35 +1788,10 @@ function validate_password($password)
 		return false;
 	}
 
-	$pcre = $mbstring = false;
-
-	// generic UTF-8 character types supported?
-	if (phpbb_pcre_utf8_support())
-	{
-		$upp = '\p{Lu}';
-		$low = '\p{Ll}';
-		$num = '\p{N}';
-		$sym = '[^\p{Lu}\p{Ll}\p{N}]';
-		$pcre = true;
-	}
-	else if (function_exists('mb_ereg_match'))
-	{
-		mb_regex_encoding('UTF-8');
-		$upp = '[[:upper:]]';
-		$low = '[[:lower:]]';
-		$num = '[[:digit:]]';
-		$sym = '[^[:upper:][:lower:][:digit:]]';
-		$mbstring = true;
-	}
-	else
-	{
-		$upp = '[A-Z]';
-		$low = '[a-z]';
-		$num = '[0-9]';
-		$sym = '[^A-Za-z0-9]';
-		$pcre = true;
-	}
-
+	$upp = '\p{Lu}';
+	$low = '\p{Ll}';
+	$num = '\p{N}';
+	$sym = '[^\p{Lu}\p{Ll}\p{N}]';
 	$chars = array();
 
 	switch ($config['pass_complex'])
@@ -1862,24 +1814,11 @@ function validate_password($password)
 			$chars[] = $upp;
 	}
 
-	if ($pcre)
-	{
-		foreach ($chars as $char)
-		{
-			if (!preg_match('#' . $char . '#u', $password))
-			{
-				return 'INVALID_CHARS';
-			}
-		}
-	}
-	else if ($mbstring)
+	foreach ($chars as $char)
 	{
-		foreach ($chars as $char)
+		if (!preg_match('#' . $char . '#u', $password))
 		{
-			if (mb_ereg($char, $password) === false)
-			{
-				return 'INVALID_CHARS';
-			}
+			return 'INVALID_CHARS';
 		}
 	}
 
@@ -2223,7 +2162,7 @@ function phpbb_style_is_active($style_id)
 */
 function avatar_delete($mode, $row, $clean_db = false)
 {
-	global $phpbb_root_path, $config, $db, $user;
+	global $phpbb_root_path, $config;
 
 	// Check if the users avatar is actually *not* a group avatar
 	if ($mode == 'user')
@@ -2279,7 +2218,7 @@ function phpbb_avatar_explanation_string()
 {
 	global $config, $user;
 
-	return $user->lang('AVATAR_EXPLAIN',
+	return $user->lang(($config['avatar_filesize'] == 0) ? 'AVATAR_EXPLAIN_NO_FILESIZE' : 'AVATAR_EXPLAIN',
 		$user->lang('PIXELS', (int) $config['avatar_max_width']),
 		$user->lang('PIXELS', (int) $config['avatar_max_height']),
 		round($config['avatar_filesize'] / 1024));
@@ -2295,7 +2234,10 @@ function phpbb_avatar_explanation_string()
 */
 function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow_desc_bbcode = false, $allow_desc_urls = false, $allow_desc_smilies = false)
 {
-	global $phpbb_root_path, $config, $db, $user, $file_upload, $phpbb_container;
+	global $db, $user, $phpbb_container, $phpbb_log;
+
+	/** @var \phpbb\group\helper $group_helper */
+	$group_helper = $phpbb_container->get('group_helper');
 
 	$error = array();
 
@@ -2327,8 +2269,12 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow
 		$current_legend = \phpbb\groupposition\legend::GROUP_DISABLED;
 		$current_teampage = \phpbb\groupposition\teampage::GROUP_DISABLED;
 
+		/* @var $legend \phpbb\groupposition\legend */
 		$legend = $phpbb_container->get('groupposition.legend');
+
+		/* @var $teampage \phpbb\groupposition\teampage */
 		$teampage = $phpbb_container->get('groupposition.teampage');
+
 		if ($group_id)
 		{
 			try
@@ -2400,8 +2346,6 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow
 		// Setting the log message before we set the group id (if group gets added)
 		$log = ($group_id) ? 'LOG_GROUP_UPDATED' : 'LOG_GROUP_CREATED';
 
-		$query = '';
-
 		if ($group_id)
 		{
 			$sql = 'SELECT user_id
@@ -2544,8 +2488,8 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow
 			group_set_user_default($group_id, $user_ary, $sql_ary);
 		}
 
-		$name = ($type == GROUP_SPECIAL) ? $user->lang['G_' . $name] : $name;
-		add_log('admin', $log, $name);
+		$name = $group_helper->get_name($name);
+		$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log, false, array($name));
 
 		group_update_listings($group_id);
 	}
@@ -2583,7 +2527,7 @@ function group_correct_avatar($group_id, $old_entry)
 */
 function avatar_remove_db($avatar_name)
 {
-	global $config, $db;
+	global $db;
 
 	$sql = 'UPDATE ' . USERS_TABLE . "
 		SET user_avatar = '',
@@ -2598,7 +2542,7 @@ function avatar_remove_db($avatar_name)
 */
 function group_delete($group_id, $group_name = false)
 {
-	global $db, $cache, $auth, $user, $phpbb_root_path, $phpEx, $phpbb_dispatcher, $phpbb_container;
+	global $db, $cache, $auth, $user, $phpbb_root_path, $phpEx, $phpbb_dispatcher, $phpbb_container, $phpbb_log;
 
 	if (!$group_name)
 	{
@@ -2642,6 +2586,7 @@ function group_delete($group_id, $group_name = false)
 	// Delete group from legend and teampage
 	try
 	{
+		/* @var $legend \phpbb\groupposition\legend */
 		$legend = $phpbb_container->get('groupposition.legend');
 		$legend->delete_group($group_id);
 		unset($legend);
@@ -2655,6 +2600,7 @@ function group_delete($group_id, $group_name = false)
 
 	try
 	{
+		/* @var $teampage \phpbb\groupposition\teampage */
 		$teampage = $phpbb_container->get('groupposition.teampage');
 		$teampage->delete_group($group_id);
 		unset($teampage);
@@ -2695,7 +2641,7 @@ function group_delete($group_id, $group_name = false)
 
 	phpbb_cache_moderators($db, $cache, $auth);
 
-	add_log('admin', 'LOG_GROUP_DELETE', $group_name);
+	$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_GROUP_DELETE', false, array($group_name));
 
 	// Return false - no error
 	return false;
@@ -2708,7 +2654,7 @@ function group_delete($group_id, $group_name = false)
 */
 function group_user_add($group_id, $user_id_ary = false, $username_ary = false, $group_name = false, $default = false, $leader = 0, $pending = 0, $group_attributes = false)
 {
-	global $db, $auth, $phpbb_container, $phpbb_dispatcher;
+	global $db, $auth, $user, $phpbb_container, $phpbb_log, $phpbb_dispatcher;
 
 	// We need both username and user_id info
 	$result = user_get_id_name($user_id_ary, $username_ary);
@@ -2812,12 +2758,13 @@ function group_user_add($group_id, $user_id_ary = false, $username_ary = false,
 
 	$log = ($leader) ? 'LOG_MODS_ADDED' : (($pending) ? 'LOG_USERS_PENDING' : 'LOG_USERS_ADDED');
 
-	add_log('admin', $log, $group_name, implode(', ', $username_ary));
+	$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log, false, array($group_name, implode(', ', $username_ary)));
 
 	group_update_listings($group_id);
 
 	if ($pending)
 	{
+		/* @var $phpbb_notifications \phpbb\notification\manager */
 		$phpbb_notifications = $phpbb_container->get('notification_manager');
 
 		foreach ($add_id_ary as $user_id)
@@ -2843,7 +2790,7 @@ function group_user_add($group_id, $user_id_ary = false, $username_ary = false,
 */
 function group_user_del($group_id, $user_id_ary = false, $username_ary = false, $group_name = false, $log_action = true)
 {
-	global $db, $auth, $config, $phpbb_dispatcher, $phpbb_container;
+	global $db, $auth, $config, $user, $phpbb_dispatcher, $phpbb_container, $phpbb_log;
 
 	if ($config['coppa_enable'])
 	{
@@ -2987,12 +2934,13 @@ function group_user_del($group_id, $user_id_ary = false, $username_ary = false,
 
 		if ($group_name)
 		{
-			add_log('admin', $log, $group_name, implode(', ', $username_ary));
+			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log, false, array($group_name, implode(', ', $username_ary)));
 		}
 	}
 
 	group_update_listings($group_id);
 
+	/* @var $phpbb_notifications \phpbb\notification\manager */
 	$phpbb_notifications = $phpbb_container->get('notification_manager');
 
 	$phpbb_notifications->delete_notifications('notification.type.group_request', $user_id_ary, $group_id);
@@ -3086,7 +3034,7 @@ function remove_default_rank($group_id, $user_ids)
 */
 function group_user_attributes($action, $group_id, $user_id_ary = false, $username_ary = false, $group_name = false, $group_attributes = false)
 {
-	global $db, $auth, $phpbb_root_path, $phpEx, $config, $phpbb_container, $phpbb_dispatcher;
+	global $db, $auth, $user, $phpbb_container, $phpbb_log, $phpbb_dispatcher;
 
 	// We need both username and user_id info
 	$result = user_get_id_name($user_id_ary, $username_ary);
@@ -3157,6 +3105,7 @@ function group_user_attributes($action, $group_id, $user_id_ary = false, $userna
 					AND " . $db->sql_in_set('user_id', $user_id_ary);
 			$db->sql_query($sql);
 
+			/* @var $phpbb_notifications \phpbb\notification\manager */
 			$phpbb_notifications = $phpbb_container->get('notification_manager');
 
 			$phpbb_notifications->add_notifications('notification.type.group_request_approved', array(
@@ -3242,7 +3191,7 @@ function group_user_attributes($action, $group_id, $user_id_ary = false, $userna
 	// Clear permissions cache of relevant users
 	$auth->acl_clear_prefetch($user_id_ary);
 
-	add_log('admin', $log, $group_name, implode(', ', $username_ary));
+	$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log, false, array($group_name, implode(', ', $username_ary)));
 
 	group_update_listings($group_id);
 
@@ -3254,7 +3203,7 @@ function group_user_attributes($action, $group_id, $user_id_ary = false, $userna
 */
 function group_validate_groupname($group_id, $group_name)
 {
-	global $config, $db;
+	global $db;
 
 	$group_name =  utf8_clean_string($group_name);
 
@@ -3302,7 +3251,7 @@ function group_validate_groupname($group_id, $group_name)
 */
 function group_set_user_default($group_id, $user_id_ary, $group_attributes = false, $update_listing = false)
 {
-	global $phpbb_container, $db, $phpbb_dispatcher;
+	global $config, $phpbb_container, $db, $phpbb_dispatcher;
 
 	if (empty($user_id_ary))
 	{
@@ -3372,8 +3321,8 @@ function group_set_user_default($group_id, $user_id_ary, $group_attributes = fal
 			if (isset($sql_ary[$avatar_option]))
 			{
 				$avatar_sql_ary[$avatar_option] = $sql_ary[$avatar_option];
-				}
 			}
+		}
 
 		$sql = 'UPDATE ' . USERS_TABLE . '
 			SET ' . $db->sql_build_array('UPDATE', $avatar_sql_ary) . "
@@ -3414,11 +3363,9 @@ function group_set_user_default($group_id, $user_id_ary, $group_attributes = fal
 			WHERE " . $db->sql_in_set('topic_last_poster_id', $user_id_ary);
 		$db->sql_query($sql);
 
-		global $config;
-
 		if (in_array($config['newest_user_id'], $user_id_ary))
 		{
-			set_config('newest_user_colour', $sql_ary['user_colour'], true);
+			$config->set('newest_user_colour', $sql_ary['user_colour'], false);
 		}
 	}
 
@@ -3453,7 +3400,7 @@ function group_set_user_default($group_id, $user_id_ary, $group_attributes = fal
 */
 function get_group_name($group_id)
 {
-	global $db, $user;
+	global $db, $phpbb_container;
 
 	$sql = 'SELECT group_name, group_type
 		FROM ' . GROUPS_TABLE . '
@@ -3462,12 +3409,15 @@ function get_group_name($group_id)
 	$row = $db->sql_fetchrow($result);
 	$db->sql_freeresult($result);
 
-	if (!$row || ($row['group_type'] == GROUP_SPECIAL && empty($user->lang)))
+	if (!$row)
 	{
 		return '';
 	}
 
-	return ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'];
+	/** @var \phpbb\group\helper $group_helper */
+	$group_helper = $phpbb_container->get('group_helper');
+
+	return $group_helper->get_name($row['group_name']);
 }
 
 /**
--- a/includes/mcp/info/mcp_ban.php
+++ b/includes/mcp/info/mcp_ban.php
@@ -18,7 +18,6 @@ class mcp_ban_info
 		return array(
 			'filename'	=> 'mcp_ban',
 			'title'		=> 'MCP_BAN',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'user'		=> array('title' => 'MCP_BAN_USERNAMES', 'auth' => 'acl_m_ban', 'cat' => array('MCP_BAN')),
 				'ip'		=> array('title' => 'MCP_BAN_IPS', 'auth' => 'acl_m_ban', 'cat' => array('MCP_BAN')),
--- a/includes/mcp/info/mcp_logs.php
+++ b/includes/mcp/info/mcp_logs.php
@@ -18,7 +18,6 @@ class mcp_logs_info
 		return array(
 			'filename'	=> 'mcp_logs',
 			'title'		=> 'MCP_LOGS',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'front'			=> array('title' => 'MCP_LOGS_FRONT', 'auth' => 'acl_m_ || aclf_m_', 'cat' => array('MCP_LOGS')),
 				'forum_logs'	=> array('title' => 'MCP_LOGS_FORUM_VIEW', 'auth' => 'acl_m_,$id', 'cat' => array('MCP_LOGS')),
--- a/includes/mcp/info/mcp_main.php
+++ b/includes/mcp/info/mcp_main.php
@@ -18,7 +18,6 @@ class mcp_main_info
 		return array(
 			'filename'	=> 'mcp_main',
 			'title'		=> 'MCP_MAIN',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'front'			=> array('title' => 'MCP_MAIN_FRONT', 'auth' => '', 'cat' => array('MCP_MAIN')),
 				'forum_view'	=> array('title' => 'MCP_MAIN_FORUM_VIEW', 'auth' => 'acl_m_,$id', 'cat' => array('MCP_MAIN')),
--- a/includes/mcp/info/mcp_notes.php
+++ b/includes/mcp/info/mcp_notes.php
@@ -18,7 +18,6 @@ class mcp_notes_info
 		return array(
 			'filename'	=> 'mcp_notes',
 			'title'		=> 'MCP_NOTES',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'front'				=> array('title' => 'MCP_NOTES_FRONT', 'auth' => '', 'cat' => array('MCP_NOTES')),
 				'user_notes'		=> array('title' => 'MCP_NOTES_USER', 'auth' => '', 'cat' => array('MCP_NOTES')),
--- a/includes/mcp/info/mcp_pm_reports.php
+++ b/includes/mcp/info/mcp_pm_reports.php
@@ -18,7 +18,6 @@ class mcp_pm_reports_info
 		return array(
 			'filename'	=> 'mcp_pm_reports',
 			'title'		=> 'MCP_PM_REPORTS',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'pm_reports'		=> array('title' => 'MCP_PM_REPORTS_OPEN', 'auth' => 'acl_m_pm_report', 'cat' => array('MCP_REPORTS')),
 				'pm_reports_closed'	=> array('title' => 'MCP_PM_REPORTS_CLOSED', 'auth' => 'acl_m_pm_report', 'cat' => array('MCP_REPORTS')),
--- a/includes/mcp/info/mcp_queue.php
+++ b/includes/mcp/info/mcp_queue.php
@@ -18,7 +18,6 @@ class mcp_queue_info
 		return array(
 			'filename'	=> 'mcp_queue',
 			'title'		=> 'MCP_QUEUE',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'unapproved_topics'	=> array('title' => 'MCP_QUEUE_UNAPPROVED_TOPICS', 'auth' => 'aclf_m_approve', 'cat' => array('MCP_QUEUE')),
 				'unapproved_posts'	=> array('title' => 'MCP_QUEUE_UNAPPROVED_POSTS', 'auth' => 'aclf_m_approve', 'cat' => array('MCP_QUEUE')),
--- a/includes/mcp/info/mcp_reports.php
+++ b/includes/mcp/info/mcp_reports.php
@@ -18,7 +18,6 @@ class mcp_reports_info
 		return array(
 			'filename'	=> 'mcp_reports',
 			'title'		=> 'MCP_REPORTS',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'reports'			=> array('title' => 'MCP_REPORTS_OPEN', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')),
 				'reports_closed'	=> array('title' => 'MCP_REPORTS_CLOSED', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')),
--- a/includes/mcp/info/mcp_warn.php
+++ b/includes/mcp/info/mcp_warn.php
@@ -18,7 +18,6 @@ class mcp_warn_info
 		return array(
 			'filename'	=> 'mcp_warn',
 			'title'		=> 'MCP_WARN',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'front'				=> array('title' => 'MCP_WARN_FRONT', 'auth' => 'aclf_m_warn', 'cat' => array('MCP_WARN')),
 				'list'				=> array('title' => 'MCP_WARN_LIST', 'auth' => 'aclf_m_warn', 'cat' => array('MCP_WARN')),
--- a/includes/mcp/mcp_forum.php
+++ b/includes/mcp/mcp_forum.php
@@ -36,11 +36,11 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
 	$merge_select = ($action == 'merge_select' || $action == 'merge_topic' || $action == 'merge_topics') ? true : false;
 
 	$forum_id			= $forum_info['forum_id'];
-	$start				= request_var('start', 0);
-	$topic_id_list		= request_var('topic_id_list', array(0));
-	$post_id_list		= request_var('post_id_list', array(0));
-	$source_topic_ids	= array(request_var('t', 0));
-	$to_topic_id		= request_var('to_topic_id', 0);
+	$start				= $request->variable('start', 0);
+	$topic_id_list		= $request->variable('topic_id_list', array(0));
+	$post_id_list		= $request->variable('post_id_list', array(0));
+	$source_topic_ids	= array($request->variable('t', 0));
+	$to_topic_id		= $request->variable('to_topic_id', 0);
 
 	$url_extra = '';
 	$url_extra .= ($forum_id) ? "&amp;f=$forum_id" : '';
@@ -54,7 +54,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
 	switch ($action)
 	{
 		case 'resync':
-			$topic_ids = request_var('topic_id_list', array(0));
+			$topic_ids = $request->variable('topic_id_list', array(0));
 			mcp_resync_topics($topic_ids);
 		break;
 
@@ -92,6 +92,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
 	);
 	extract($phpbb_dispatcher->trigger_event('core.mcp_forum_view_before', compact($vars)));
 
+	/* @var $pagination \phpbb\pagination */
 	$pagination = $phpbb_container->get('pagination');
 
 	$selected_ids = '';
@@ -145,9 +146,10 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
 		'S_CAN_SYNC'			=> $auth->acl_get('m_', $forum_id),
 		'S_CAN_APPROVE'			=> $auth->acl_get('m_approve', $forum_id),
 		'S_MERGE_SELECT'		=> ($merge_select) ? true : false,
-		'S_CAN_MAKE_NORMAL'		=> $auth->acl_gets('f_sticky', 'f_announce', $forum_id),
+		'S_CAN_MAKE_NORMAL'		=> $auth->acl_gets('f_sticky', 'f_announce', 'f_announce_global', $forum_id),
 		'S_CAN_MAKE_STICKY'		=> $auth->acl_get('f_sticky', $forum_id),
 		'S_CAN_MAKE_ANNOUNCE'	=> $auth->acl_get('f_announce', $forum_id),
+		'S_CAN_MAKE_ANNOUNCE_GLOBAL'	=> $auth->acl_get('f_announce_global', $forum_id),
 
 		'U_VIEW_FORUM'			=> append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id),
 		'U_VIEW_FORUM_LOGS'		=> ($auth->acl_gets('a_', 'm_', $forum_id) && $module->loaded('logs')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=logs&amp;mode=forum_logs&amp;f=' . $forum_id) : '',
@@ -172,6 +174,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
 		$read_tracking_join = $read_tracking_select = '';
 	}
 
+	/* @var $phpbb_content_visibility \phpbb\content_visibility */
 	$phpbb_content_visibility = $phpbb_container->get('content.visibility');
 
 	$sql = 'SELECT t.topic_id
@@ -200,9 +203,9 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
 
 	$topic_list = $topic_tracking_info = array();
 
-	while ($row = $db->sql_fetchrow($result))
+	while ($row_ary = $db->sql_fetchrow($result))
 	{
-		$topic_list[] = $row['topic_id'];
+		$topic_list[] = $row_ary['topic_id'];
 	}
 	$db->sql_freeresult($result);
 
@@ -211,9 +214,9 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
 		WHERE " . $db->sql_in_set('t.topic_id', $topic_list, false, true);
 
 	$result = $db->sql_query($sql);
-	while ($row = $db->sql_fetchrow($result))
+	while ($row_ary = $db->sql_fetchrow($result))
 	{
-		$topic_rows[$row['topic_id']] = $row;
+		$topic_rows[$row_ary['topic_id']] = $row_ary;
 	}
 	$db->sql_freeresult($result);
 
@@ -238,109 +241,110 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
 
 	foreach ($topic_list as $topic_id)
 	{
-		$topic_title = '';
+		$row_ary = &$topic_rows[$topic_id];
 
-		$row = &$topic_rows[$topic_id];
+		$replies = $phpbb_content_visibility->get_count('topic_posts', $row_ary, $forum_id) - 1;
 
-		$replies = $phpbb_content_visibility->get_count('topic_posts', $row, $forum_id) - 1;
-
-		if ($row['topic_status'] == ITEM_MOVED)
+		if ($row_ary['topic_status'] == ITEM_MOVED)
 		{
 			$unread_topic = false;
 		}
 		else
 		{
-			$unread_topic = (isset($topic_tracking_info[$topic_id]) && $row['topic_last_post_time'] > $topic_tracking_info[$topic_id]) ? true : false;
+			$unread_topic = (isset($topic_tracking_info[$topic_id]) && $row_ary['topic_last_post_time'] > $topic_tracking_info[$topic_id]) ? true : false;
 		}
 
 		// Get folder img, topic status/type related information
 		$folder_img = $folder_alt = $topic_type = '';
-		topic_status($row, $replies, $unread_topic, $folder_img, $folder_alt, $topic_type);
+		topic_status($row_ary, $replies, $unread_topic, $folder_img, $folder_alt, $topic_type);
 
-		$topic_title = censor_text($row['topic_title']);
+		$topic_title = censor_text($row_ary['topic_title']);
 
-		$topic_unapproved = (($row['topic_visibility'] == ITEM_UNAPPROVED || $row['topic_visibility'] == ITEM_REAPPROVE)  && $auth->acl_get('m_approve', $row['forum_id'])) ? true : false;
-		$posts_unapproved = ($row['topic_visibility'] == ITEM_APPROVED && $row['topic_posts_unapproved'] && $auth->acl_get('m_approve', $row['forum_id'])) ? true : false;
-		$topic_deleted = $row['topic_visibility'] == ITEM_DELETED;
-		$u_mcp_queue = ($topic_unapproved || $posts_unapproved) ? $url . '&amp;i=queue&amp;mode=' . (($topic_unapproved) ? 'approve_details' : 'unapproved_posts') . '&amp;t=' . $row['topic_id'] : '';
+		$topic_unapproved = (($row_ary['topic_visibility'] == ITEM_UNAPPROVED || $row_ary['topic_visibility'] == ITEM_REAPPROVE)  && $auth->acl_get('m_approve', $row_ary['forum_id'])) ? true : false;
+		$posts_unapproved = ($row_ary['topic_visibility'] == ITEM_APPROVED && $row_ary['topic_posts_unapproved'] && $auth->acl_get('m_approve', $row_ary['forum_id'])) ? true : false;
+		$topic_deleted = $row_ary['topic_visibility'] == ITEM_DELETED;
+		$u_mcp_queue = ($topic_unapproved || $posts_unapproved) ? $url . '&amp;i=queue&amp;mode=' . (($topic_unapproved) ? 'approve_details' : 'unapproved_posts') . '&amp;t=' . $row_ary['topic_id'] : '';
 		$u_mcp_queue = (!$u_mcp_queue && $topic_deleted) ? $url . '&amp;i=queue&amp;mode=deleted_topics&amp;t=' . $topic_id : $u_mcp_queue;
 
 		$topic_row = array(
-			'ATTACH_ICON_IMG'		=> ($auth->acl_get('u_download') && $auth->acl_get('f_download', $row['forum_id']) && $row['topic_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
+			'ATTACH_ICON_IMG'		=> ($auth->acl_get('u_download') && $auth->acl_get('f_download', $row_ary['forum_id']) && $row_ary['topic_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
 			'TOPIC_IMG_STYLE'		=> $folder_img,
 			'TOPIC_FOLDER_IMG'		=> $user->img($folder_img, $folder_alt),
-			'TOPIC_ICON_IMG'		=> (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['img'] : '',
-			'TOPIC_ICON_IMG_WIDTH'	=> (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['width'] : '',
-			'TOPIC_ICON_IMG_HEIGHT'	=> (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['height'] : '',
+			'TOPIC_ICON_IMG'		=> (!empty($icons[$row_ary['icon_id']])) ? $icons[$row_ary['icon_id']]['img'] : '',
+			'TOPIC_ICON_IMG_WIDTH'	=> (!empty($icons[$row_ary['icon_id']])) ? $icons[$row_ary['icon_id']]['width'] : '',
+			'TOPIC_ICON_IMG_HEIGHT'	=> (!empty($icons[$row_ary['icon_id']])) ? $icons[$row_ary['icon_id']]['height'] : '',
 			'UNAPPROVED_IMG'		=> ($topic_unapproved || $posts_unapproved) ? $user->img('icon_topic_unapproved', ($topic_unapproved) ? 'TOPIC_UNAPPROVED' : 'POSTS_UNAPPROVED') : '',
 			'DELETED_IMG'			=> ($topic_deleted) ? $user->img('icon_topic_deleted', 'TOPIC_DELETED') : '',
 
-			'TOPIC_AUTHOR'				=> get_username_string('username', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
-			'TOPIC_AUTHOR_COLOUR'		=> get_username_string('colour', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
-			'TOPIC_AUTHOR_FULL'			=> get_username_string('full', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
-			'U_TOPIC_AUTHOR'			=> get_username_string('profile', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
+			'TOPIC_AUTHOR'				=> get_username_string('username', $row_ary['topic_poster'], $row_ary['topic_first_poster_name'], $row_ary['topic_first_poster_colour']),
+			'TOPIC_AUTHOR_COLOUR'		=> get_username_string('colour', $row_ary['topic_poster'], $row_ary['topic_first_poster_name'], $row_ary['topic_first_poster_colour']),
+			'TOPIC_AUTHOR_FULL'			=> get_username_string('full', $row_ary['topic_poster'], $row_ary['topic_first_poster_name'], $row_ary['topic_first_poster_colour']),
+			'U_TOPIC_AUTHOR'			=> get_username_string('profile', $row_ary['topic_poster'], $row_ary['topic_first_poster_name'], $row_ary['topic_first_poster_colour']),
 
-			'LAST_POST_AUTHOR'			=> get_username_string('username', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
-			'LAST_POST_AUTHOR_COLOUR'	=> get_username_string('colour', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
-			'LAST_POST_AUTHOR_FULL'		=> get_username_string('full', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
-			'U_LAST_POST_AUTHOR'		=> get_username_string('profile', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
+			'LAST_POST_AUTHOR'			=> get_username_string('username', $row_ary['topic_last_poster_id'], $row_ary['topic_last_poster_name'], $row_ary['topic_last_poster_colour']),
+			'LAST_POST_AUTHOR_COLOUR'	=> get_username_string('colour', $row_ary['topic_last_poster_id'], $row_ary['topic_last_poster_name'], $row_ary['topic_last_poster_colour']),
+			'LAST_POST_AUTHOR_FULL'		=> get_username_string('full', $row_ary['topic_last_poster_id'], $row_ary['topic_last_poster_name'], $row_ary['topic_last_poster_colour']),
+			'U_LAST_POST_AUTHOR'		=> get_username_string('profile', $row_ary['topic_last_poster_id'], $row_ary['topic_last_poster_name'], $row_ary['topic_last_poster_colour']),
 
 			'TOPIC_TYPE'		=> $topic_type,
 			'TOPIC_TITLE'		=> $topic_title,
-			'REPLIES'			=> $phpbb_content_visibility->get_count('topic_posts', $row, $row['forum_id']) - 1,
-			'LAST_POST_TIME'	=> $user->format_date($row['topic_last_post_time']),
-			'FIRST_POST_TIME'	=> $user->format_date($row['topic_time']),
-			'LAST_POST_SUBJECT'	=> $row['topic_last_post_subject'],
-			'LAST_VIEW_TIME'	=> $user->format_date($row['topic_last_view_time']),
+			'REPLIES'			=> $phpbb_content_visibility->get_count('topic_posts', $row_ary, $row_ary['forum_id']) - 1,
+			'LAST_POST_TIME'	=> $user->format_date($row_ary['topic_last_post_time']),
+			'FIRST_POST_TIME'	=> $user->format_date($row_ary['topic_time']),
+			'LAST_POST_SUBJECT'	=> $row_ary['topic_last_post_subject'],
+			'LAST_VIEW_TIME'	=> $user->format_date($row_ary['topic_last_view_time']),
 
-			'S_TOPIC_REPORTED'		=> (!empty($row['topic_reported']) && empty($row['topic_moved_id']) && $auth->acl_get('m_report', $row['forum_id'])) ? true : false,
+			'S_TOPIC_REPORTED'		=> (!empty($row_ary['topic_reported']) && empty($row_ary['topic_moved_id']) && $auth->acl_get('m_report', $row_ary['forum_id'])) ? true : false,
 			'S_TOPIC_UNAPPROVED'	=> $topic_unapproved,
 			'S_POSTS_UNAPPROVED'	=> $posts_unapproved,
 			'S_TOPIC_DELETED'		=> $topic_deleted,
 			'S_UNREAD_TOPIC'		=> $unread_topic,
 		);
 
-		if ($row['topic_status'] == ITEM_MOVED)
+		if ($row_ary['topic_status'] == ITEM_MOVED)
 		{
 			$topic_row = array_merge($topic_row, array(
-				'U_VIEW_TOPIC'		=> append_sid("{$phpbb_root_path}viewtopic.$phpEx", "t={$row['topic_moved_id']}"),
-				'U_DELETE_TOPIC'	=> ($auth->acl_get('m_delete', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=$id&amp;f=$forum_id&amp;topic_id_list[]={$row['topic_id']}&amp;mode=forum_view&amp;action=delete_topic") : '',
+				'U_VIEW_TOPIC'		=> append_sid("{$phpbb_root_path}viewtopic.$phpEx", "t={$row_ary['topic_moved_id']}"),
+				'U_DELETE_TOPIC'	=> ($auth->acl_get('m_delete', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=$id&amp;f=$forum_id&amp;topic_id_list[]={$row_ary['topic_id']}&amp;mode=forum_view&amp;action=delete_topic") : '',
 				'S_MOVED_TOPIC'		=> true,
-				'TOPIC_ID'			=> $row['topic_moved_id'],
+				'TOPIC_ID'			=> $row_ary['topic_moved_id'],
 			));
 		}
 		else
 		{
 			if ($action == 'merge_topic' || $action == 'merge_topics')
 			{
-				$u_select_topic = $url . "&amp;i=$id&amp;mode=forum_view&amp;action=$action&amp;to_topic_id=" . $row['topic_id'] . $selected_ids;
+				$u_select_topic = $url . "&amp;i=$id&amp;mode=forum_view&amp;action=$action&amp;to_topic_id=" . $row_ary['topic_id'] . $selected_ids;
 			}
 			else
 			{
-				$u_select_topic = $url . "&amp;i=$id&amp;mode=topic_view&amp;action=merge&amp;to_topic_id=" . $row['topic_id'] . $selected_ids;
+				$u_select_topic = $url . "&amp;i=$id&amp;mode=topic_view&amp;action=merge&amp;to_topic_id=" . $row_ary['topic_id'] . $selected_ids;
 			}
 			$topic_row = array_merge($topic_row, array(
-				'U_VIEW_TOPIC'		=> append_sid("{$phpbb_root_path}mcp.$phpEx", "i=$id&amp;f=$forum_id&amp;t={$row['topic_id']}&amp;mode=topic_view"),
+				'U_VIEW_TOPIC'		=> append_sid("{$phpbb_root_path}mcp.$phpEx", "i=$id&amp;f=$forum_id&amp;t={$row_ary['topic_id']}&amp;mode=topic_view"),
 
-				'S_SELECT_TOPIC'	=> ($merge_select && !in_array($row['topic_id'], $source_topic_ids)) ? true : false,
+				'S_SELECT_TOPIC'	=> ($merge_select && !in_array($row_ary['topic_id'], $source_topic_ids)) ? true : false,
 				'U_SELECT_TOPIC'	=> $u_select_topic,
 				'U_MCP_QUEUE'		=> $u_mcp_queue,
-				'U_MCP_REPORT'		=> ($auth->acl_get('m_report', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=main&amp;mode=topic_view&amp;t=' . $row['topic_id'] . '&amp;action=reports') : '',
-				'TOPIC_ID'			=> $row['topic_id'],
-				'S_TOPIC_CHECKED'	=> ($topic_id_list && in_array($row['topic_id'], $topic_id_list)) ? true : false,
+				'U_MCP_REPORT'		=> ($auth->acl_get('m_report', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=main&amp;mode=topic_view&amp;t=' . $row_ary['topic_id'] . '&amp;action=reports') : '',
+				'TOPIC_ID'			=> $row_ary['topic_id'],
+				'S_TOPIC_CHECKED'	=> ($topic_id_list && in_array($row_ary['topic_id'], $topic_id_list)) ? true : false,
 			));
 		}
 
+		$row = $row_ary;
 		/**
 		* Modify the topic data before it is assigned to the template in MCP
 		*
 		* @event core.mcp_view_forum_modify_topicrow
-		* @var	array	row			Array with topic data
+		* @var	array	row		Array with topic data
 		* @var	array	topic_row	Template array with topic data
 		* @since 3.1.0-a1
 		*/
 		$vars = array('row', 'topic_row');
 		extract($phpbb_dispatcher->trigger_event('core.mcp_view_forum_modify_topicrow', compact($vars)));
+		$row_ary = $row;
+		unset($row);
 
 		$template->assign_block_vars('topicrow', $topic_row);
 	}
@@ -352,7 +356,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
 */
 function mcp_resync_topics($topic_ids)
 {
-	global $auth, $db, $template, $phpEx, $user, $phpbb_root_path;
+	global $db, $user, $phpbb_log, $request;
 
 	if (!sizeof($topic_ids))
 	{
@@ -377,13 +381,17 @@ function mcp_resync_topics($topic_ids)
 	// Log this action
 	while ($row = $db->sql_fetchrow($result))
 	{
-		add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_TOPIC_RESYNC', $row['topic_title']);
+		$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_TOPIC_RESYNC', false, array(
+			'forum_id' => $row['forum_id'],
+			'topic_id' => $row['topic_id'],
+			$row['topic_title']
+		));
 	}
 	$db->sql_freeresult($result);
 
 	$msg = (sizeof($topic_ids) == 1) ? $user->lang['TOPIC_RESYNC_SUCCESS'] : $user->lang['TOPICS_RESYNC_SUCCESS'];
 
-	$redirect = request_var('redirect', $user->data['session_page']);
+	$redirect = $request->variable('redirect', $user->data['session_page']);
 
 	meta_refresh(3, $redirect);
 	trigger_error($msg . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $redirect . '">', '</a>'));
@@ -396,7 +404,7 @@ function mcp_resync_topics($topic_ids)
 */
 function merge_topics($forum_id, $topic_ids, $to_topic_id)
 {
-	global $db, $template, $user, $phpEx, $phpbb_root_path, $auth;
+	global $db, $template, $user, $phpEx, $phpbb_root_path, $phpbb_log, $request, $phpbb_dispatcher;
 
 	if (!sizeof($topic_ids))
 	{
@@ -411,24 +419,26 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)
 
 	$sync_topics = array_merge($topic_ids, array($to_topic_id));
 
-	$topic_data = phpbb_get_topic_data($sync_topics, 'm_merge');
+	$all_topic_data = phpbb_get_topic_data($sync_topics, 'm_merge');
 
-	if (!sizeof($topic_data) || empty($topic_data[$to_topic_id]))
+	if (!sizeof($all_topic_data) || empty($all_topic_data[$to_topic_id]))
 	{
 		$template->assign_var('MESSAGE', $user->lang['NO_FINAL_TOPIC_SELECTED']);
 		return;
 	}
 
 	$sync_forums = array();
-	foreach ($topic_data as $data)
+	$topic_views = 0;
+	foreach ($all_topic_data as $data)
 	{
 		$sync_forums[$data['forum_id']] = $data['forum_id'];
+		$topic_views = max($topic_views, $data['topic_views']);
 	}
 
-	$topic_data = $topic_data[$to_topic_id];
+	$to_topic_data = $all_topic_data[$to_topic_id];
 
-	$post_id_list	= request_var('post_id_list', array(0));
-	$start			= request_var('start', 0);
+	$post_id_list	= $request->variable('post_id_list', array(0));
+	$start			= $request->variable('start', 0);
 
 	if (!sizeof($post_id_list) && sizeof($topic_ids))
 	{
@@ -456,7 +466,7 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)
 		return;
 	}
 
-	$redirect = request_var('redirect', build_url(array('quickmod')));
+	$redirect = $request->variable('redirect', "{$phpbb_root_path}mcp.$phpEx?f=$forum_id&amp;i=main&amp;mode=forum_view");
 
 	$s_hidden_fields = build_hidden_fields(array(
 		'i'				=> 'main',
@@ -469,14 +479,25 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)
 		'redirect'		=> $redirect,
 		'topic_id_list'	=> $topic_ids)
 	);
-	$success_msg = $return_link = '';
+	$return_link = '';
 
 	if (confirm_box(true))
 	{
-		$to_forum_id = $topic_data['forum_id'];
+		$to_forum_id = $to_topic_data['forum_id'];
 
 		move_posts($post_id_list, $to_topic_id, false);
-		add_log('mod', $to_forum_id, $to_topic_id, 'LOG_MERGE', $topic_data['topic_title']);
+
+		$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_MERGE', false, array(
+			'forum_id' => $to_forum_id,
+			'topic_id' => $to_topic_id,
+			$to_topic_data['topic_title']
+		));
+
+		// Update topic views count
+		$sql = 'UPDATE ' . TOPICS_TABLE . '
+				SET topic_views = ' . $topic_views . '
+				WHERE topic_id = ' . $to_topic_id;
+		$db->sql_query($sql);
 
 		// Message and return links
 		$success_msg = 'POSTS_MERGED_SUCCESS';
@@ -500,9 +521,23 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)
 
 		// Link to the new topic
 		$return_link .= (($return_link) ? '<br /><br />' : '') . sprintf($user->lang['RETURN_NEW_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $to_forum_id . '&amp;t=' . $to_topic_id) . '">', '</a>');
-		$redirect = request_var('redirect', "{$phpbb_root_path}viewtopic.$phpEx?f=$to_forum_id&amp;t=$to_topic_id");
+		$redirect = $request->variable('redirect', "{$phpbb_root_path}viewtopic.$phpEx?f=$to_forum_id&amp;t=$to_topic_id");
 		$redirect = reapply_sid($redirect);
 
+		/**
+		 * Perform additional actions after merging topics.
+		 *
+		 * @event core.mcp_forum_merge_topics_after
+		 * @var	array	all_topic_data			The data from all topics involved in the merge
+		 * @var	int		to_topic_id				The ID of the topic into which the rest are merged
+		 * @since 3.1.11-RC1
+		 */
+		$vars = array(
+			'all_topic_data',
+			'to_topic_id',
+		);
+		extract($phpbb_dispatcher->trigger_event('core.mcp_forum_merge_topics_after', compact($vars)));
+
 		meta_refresh(3, $redirect);
 		trigger_error($user->lang[$success_msg] . '<br /><br />' . $return_link);
 	}
--- a/includes/mcp/mcp_front.php
+++ b/includes/mcp/mcp_front.php
@@ -24,9 +24,9 @@ if (!defined('IN_PHPBB'))
 */
 function mcp_front_view($id, $mode, $action)
 {
-	global $phpEx, $phpbb_root_path, $config;
+	global $phpEx, $phpbb_root_path;
 	global $template, $db, $user, $auth, $module;
-	global $phpbb_dispatcher;
+	global $phpbb_dispatcher, $request;
 
 	// Latest 5 unapproved
 	if ($module->loaded('queue'))
@@ -35,7 +35,7 @@ function mcp_front_view($id, $mode, $action)
 		$post_list = array();
 		$forum_names = array();
 
-		$forum_id = request_var('f', 0);
+		$forum_id = $request->variable('f', 0);
 
 		$template->assign_var('S_SHOW_UNAPPROVED', (!empty($forum_list)) ? true : false);
 
--- a/includes/mcp/mcp_logs.php
+++ b/includes/mcp/mcp_logs.php
@@ -35,12 +35,12 @@ class mcp_logs
 
 	function main($id, $mode)
 	{
-		global $auth, $db, $user, $template;
-		global $config, $phpbb_root_path, $phpEx, $phpbb_container, $phpbb_log;
+		global $auth, $db, $user, $template, $request;
+		global $config, $phpbb_container, $phpbb_log;
 
 		$user->add_lang('acp/common');
 
-		$action = request_var('action', array('' => ''));
+		$action = $request->variable('action', array('' => ''));
 
 		if (is_array($action))
 		{
@@ -48,23 +48,24 @@ class mcp_logs
 		}
 		else
 		{
-			$action = request_var('action', '');
+			$action = $request->variable('action', '');
 		}
 
 		// Set up general vars
-		$start		= request_var('start', 0);
+		$start		= $request->variable('start', 0);
 		$deletemark = ($action == 'del_marked') ? true : false;
 		$deleteall	= ($action == 'del_all') ? true : false;
-		$marked		= request_var('mark', array(0));
+		$marked		= $request->variable('mark', array(0));
 
 		// Sort keys
-		$sort_days	= request_var('st', 0);
-		$sort_key	= request_var('sk', 't');
-		$sort_dir	= request_var('sd', 'd');
+		$sort_days	= $request->variable('st', 0);
+		$sort_key	= $request->variable('sk', 't');
+		$sort_dir	= $request->variable('sd', 'd');
 
 		$this->tpl_name = 'mcp_logs';
 		$this->page_title = 'MCP_LOGS';
 
+		/* @var $pagination \phpbb\pagination */
 		$pagination = $phpbb_container->get('pagination');
 
 		$forum_list = array_values(array_intersect(get_forum_list('f_read'), get_forum_list('m_')));
@@ -78,10 +79,11 @@ class mcp_logs
 			break;
 
 			case 'forum_logs':
-				$forum_id = request_var('f', 0);
+				$forum_id = $request->variable('f', 0);
 
 				if (!in_array($forum_id, $forum_list))
 				{
+					send_status_line(403, 'Forbidden');
 					trigger_error('NOT_AUTHORISED');
 				}
 
@@ -89,7 +91,7 @@ class mcp_logs
 			break;
 
 			case 'topic_logs':
-				$topic_id = request_var('t', 0);
+				$topic_id = $request->variable('t', 0);
 
 				$sql = 'SELECT forum_id
 					FROM ' . TOPICS_TABLE . '
@@ -100,6 +102,7 @@ class mcp_logs
 
 				if (!in_array($forum_id, $forum_list))
 				{
+					send_status_line(403, 'Forbidden');
 					trigger_error('NOT_AUTHORISED');
 				}
 
@@ -123,7 +126,7 @@ class mcp_logs
 				}
 				else if ($deleteall)
 				{
-					$keywords = utf8_normalize_nfc(request_var('keywords', '', true));
+					$keywords = $request->variable('keywords', '', true);
 
 					$conditions = array(
 						'forum_id'	=> array('IN' => $forum_list),
@@ -157,7 +160,7 @@ class mcp_logs
 					'sd'		=> $sort_dir,
 					'i'			=> $id,
 					'mode'		=> $mode,
-					'action'	=> request_var('action', array('' => ''))))
+					'action'	=> $request->variable('action', array('' => ''))))
 				);
 			}
 		}
@@ -174,7 +177,7 @@ class mcp_logs
 		$sql_where = ($sort_days) ? (time() - ($sort_days * 86400)) : 0;
 		$sql_sort = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC');
 
-		$keywords = utf8_normalize_nfc(request_var('keywords', '', true));
+		$keywords = $request->variable('keywords', '', true);
 		$keywords_param = !empty($keywords) ? '&amp;keywords=' . urlencode(htmlspecialchars_decode($keywords)) : '';
 
 		// Grab log data
@@ -204,7 +207,7 @@ class mcp_logs
 		{
 			$data = array();
 
-			$checks = array('viewtopic', 'viewforum');
+			$checks = array('viewpost', 'viewtopic', 'viewforum');
 			foreach ($checks as $check)
 			{
 				if (isset($row[$check]) && $row[$check])
--- a/includes/mcp/mcp_main.php
+++ b/includes/mcp/mcp_main.php
@@ -35,8 +35,8 @@ class mcp_main
 
 	function main($id, $mode)
 	{
-		global $auth, $db, $user, $template, $action;
-		global $config, $phpbb_root_path, $phpEx, $request;
+		global $auth, $user, $action;
+		global $phpbb_root_path, $phpEx, $request;
 		global $phpbb_dispatcher;
 
 		$quickmod = ($mode == 'quickmod') ? true : false;
@@ -45,7 +45,7 @@ class mcp_main
 		{
 			case 'lock':
 			case 'unlock':
-				$topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0));
+				$topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));
 
 				if (!sizeof($topic_ids))
 				{
@@ -58,7 +58,7 @@ class mcp_main
 			case 'lock_post':
 			case 'unlock_post':
 
-				$post_ids = (!$quickmod) ? request_var('post_id_list', array(0)) : array(request_var('p', 0));
+				$post_ids = (!$quickmod) ? $request->variable('post_id_list', array(0)) : array($request->variable('p', 0));
 
 				if (!sizeof($post_ids))
 				{
@@ -73,7 +73,7 @@ class mcp_main
 			case 'make_global':
 			case 'make_normal':
 
-				$topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0));
+				$topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));
 
 				if (!sizeof($topic_ids))
 				{
@@ -86,7 +86,7 @@ class mcp_main
 			case 'move':
 				$user->add_lang('viewtopic');
 
-				$topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0));
+				$topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));
 
 				if (!sizeof($topic_ids))
 				{
@@ -99,7 +99,7 @@ class mcp_main
 			case 'fork':
 				$user->add_lang('viewtopic');
 
-				$topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0));
+				$topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));
 
 				if (!sizeof($topic_ids))
 				{
@@ -189,7 +189,7 @@ class mcp_main
 
 				$user->add_lang('viewforum');
 
-				$forum_id = request_var('f', 0);
+				$forum_id = $request->variable('f', 0);
 
 				$forum_info = phpbb_get_forum_data($forum_id, 'm_', true);
 
@@ -262,7 +262,7 @@ class mcp_main
 */
 function lock_unlock($action, $ids)
 {
-	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_dispatcher;
+	global $user, $db, $request, $phpbb_log, $phpbb_dispatcher;
 
 	if ($action == 'lock' || $action == 'unlock')
 	{
@@ -298,7 +298,7 @@ function lock_unlock($action, $ids)
 	}
 	unset($orig_ids);
 
-	$redirect = request_var('redirect', build_url(array('action', 'quickmod')));
+	$redirect = $request->variable('redirect', build_url(array('action', 'quickmod')));
 	$redirect = reapply_sid($redirect);
 
 	$s_hidden_fields = build_hidden_fields(array(
@@ -306,7 +306,6 @@ function lock_unlock($action, $ids)
 		'action'			=> $action,
 		'redirect'			=> $redirect)
 	);
-	$success_msg = '';
 
 	if (confirm_box(true))
 	{
@@ -319,7 +318,12 @@ function lock_unlock($action, $ids)
 
 		foreach ($data as $id => $row)
 		{
-			add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_' . strtoupper($action), $row['topic_title']);
+			$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_' . strtoupper($action), false, array(
+				'forum_id' => $row['forum_id'],
+				'topic_id' => $row['topic_id'],
+				'post_id'  => isset($row['post_id']) ? $row['post_id'] : 0,
+				$row['topic_title']
+			));
 		}
 
 		/**
@@ -362,7 +366,7 @@ function lock_unlock($action, $ids)
 */
 function change_topic_type($action, $topic_ids)
 {
-	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request;
+	global $user, $db, $request, $phpbb_log;
 
 	switch ($action)
 	{
@@ -374,7 +378,7 @@ function change_topic_type($action, $topic_ids)
 
 		case 'make_global':
 			$new_topic_type = POST_GLOBAL;
-			$check_acl = 'f_announce';
+			$check_acl = 'f_announce_global';
 			$l_new_type = (sizeof($topic_ids) == 1) ? 'MCP_MAKE_GLOBAL' : 'MCP_MAKE_GLOBALS';
 		break;
 
@@ -398,7 +402,7 @@ function change_topic_type($action, $topic_ids)
 		return;
 	}
 
-	$redirect = request_var('redirect', build_url(array('action', 'quickmod')));
+	$redirect = $request->variable('redirect', build_url(array('action', 'quickmod')));
 	$redirect = reapply_sid($redirect);
 
 	$s_hidden_fields = array(
@@ -407,7 +411,6 @@ function change_topic_type($action, $topic_ids)
 		'action'		=> $action,
 		'redirect'		=> $redirect,
 	);
-	$success_msg = '';
 
 	if (confirm_box(true))
 	{
@@ -437,7 +440,11 @@ function change_topic_type($action, $topic_ids)
 
 			foreach ($data as $topic_id => $row)
 			{
-				add_log('mod', $forum_id, $topic_id, 'LOG_TOPIC_TYPE_CHANGED', $row['topic_title']);
+				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_TOPIC_TYPE_CHANGED', false, array(
+					'forum_id' => $forum_id,
+					'topic_id' => $topic_id,
+					$row['topic_title']
+				));
 			}
 		}
 
@@ -463,7 +470,7 @@ function change_topic_type($action, $topic_ids)
 */
 function mcp_move_topic($topic_ids)
 {
-	global $auth, $user, $db, $template, $phpbb_log, $request;
+	global $auth, $user, $db, $template, $phpbb_log, $request, $phpbb_dispatcher;
 	global $phpEx, $phpbb_root_path;
 
 	// Here we limit the operation to one forum only
@@ -474,8 +481,8 @@ function mcp_move_topic($topic_ids)
 		return;
 	}
 
-	$to_forum_id = request_var('to_forum_id', 0);
-	$redirect = request_var('redirect', build_url(array('action', 'quickmod')));
+	$to_forum_id = $request->variable('to_forum_id', 0);
+	$redirect = $request->variable('redirect', build_url(array('action', 'quickmod')));
 	$additional_msg = $success_msg = '';
 
 	$s_hidden_fields = build_hidden_fields(array(
@@ -625,6 +632,18 @@ function mcp_move_topic($topic_ids)
 					'poll_last_vote'		=>	(int) $row['poll_last_vote']
 				);
 
+				/**
+				* Perform actions before shadow topic is created.
+				*
+				* @event core.mcp_main_modify_shadow_sql
+				* @var	array	shadow	SQL array to be used by $db->sql_build_array
+				* @since 3.1.11-RC1
+				*/
+				$vars = array(
+					'shadow',
+				);
+				extract($phpbb_dispatcher->trigger_event('core.mcp_main_modify_shadow_sql', compact($vars)));
+
 				$db->sql_query('INSERT INTO ' . TOPICS_TABLE . $db->sql_build_array('INSERT', $shadow));
 
 				// Shadow topics only count on new "topics" and not posts... a shadow topic alone has 0 posts
@@ -695,7 +714,7 @@ function mcp_move_topic($topic_ids)
 		confirm_box(false, 'MOVE_TOPIC' . ((sizeof($topic_ids) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_move.html');
 	}
 
-	$redirect = request_var('redirect', "index.$phpEx");
+	$redirect = $request->variable('redirect', "index.$phpEx");
 	$redirect = reapply_sid($redirect);
 
 	if (!$success_msg)
@@ -720,7 +739,7 @@ function mcp_move_topic($topic_ids)
 */
 function mcp_restore_topic($topic_ids)
 {
-	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container;
+	global $user, $phpEx, $phpbb_root_path, $request, $phpbb_container, $phpbb_log;
 
 	if (!phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_approve')))
 	{
@@ -744,13 +763,19 @@ function mcp_restore_topic($topic_ids)
 
 		$data = phpbb_get_topic_data($topic_ids);
 
+		/* @var $phpbb_content_visibility \phpbb\content_visibility */
 		$phpbb_content_visibility = $phpbb_container->get('content.visibility');
 		foreach ($data as $topic_id => $row)
 		{
 			$return = $phpbb_content_visibility->set_topic_visibility(ITEM_APPROVED, $topic_id, $row['forum_id'], $user->data['user_id'], time(), '');
 			if (!empty($return))
 			{
-				add_log('mod', $row['forum_id'], $topic_id, 'LOG_RESTORE_TOPIC', $row['topic_title'], $row['topic_first_poster_name']);
+				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_RESTORE_TOPIC', false, array(
+					'forum_id' => $row['forum_id'],
+					'topic_id' => $topic_id,
+					$row['topic_title'],
+					$row['topic_first_poster_name']
+				));
 			}
 		}
 	}
@@ -793,7 +818,7 @@ function mcp_restore_topic($topic_ids)
 */
 function mcp_delete_topic($topic_ids, $is_soft = false, $soft_delete_reason = '', $action = 'delete_topic')
 {
-	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container;
+	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container, $phpbb_log;
 
 	$check_permission = ($is_soft) ? 'm_softdelete' : 'm_delete';
 	if (!phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array($check_permission)))
@@ -822,30 +847,47 @@ function mcp_delete_topic($topic_ids, $is_soft = false, $soft_delete_reason = ''
 		{
 			if ($row['topic_moved_id'])
 			{
-				add_log('mod', $row['forum_id'], $topic_id, 'LOG_DELETE_SHADOW_TOPIC', $row['topic_title']);
+				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_DELETE_SHADOW_TOPIC', false, array(
+					'forum_id' => $row['forum_id'],
+					'topic_id' => $topic_id,
+					$row['topic_title']
+				));
 			}
 			else
 			{
 				// Only soft delete non-shadow topics
 				if ($is_soft)
 				{
+					/* @var $phpbb_content_visibility \phpbb\content_visibility */
 					$phpbb_content_visibility = $phpbb_container->get('content.visibility');
 					$return = $phpbb_content_visibility->set_topic_visibility(ITEM_DELETED, $topic_id, $row['forum_id'], $user->data['user_id'], time(), $soft_delete_reason);
 					if (!empty($return))
 					{
-						add_log('mod', $row['forum_id'], $topic_id, 'LOG_SOFTDELETE_TOPIC', $row['topic_title'], $row['topic_first_poster_name'], $soft_delete_reason);
+						$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_SOFTDELETE_TOPIC', false, array(
+							'forum_id' => $row['forum_id'],
+							'topic_id' => $topic_id,
+							$row['topic_title'],
+							$row['topic_first_poster_name'],
+							$soft_delete_reason
+						));
 					}
 				}
 				else
 				{
-					add_log('mod', $row['forum_id'], $topic_id, 'LOG_DELETE_TOPIC', $row['topic_title'], $row['topic_first_poster_name'], $soft_delete_reason);
+					$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_DELETE_TOPIC', false, array(
+						'forum_id' => $row['forum_id'],
+						'topic_id' => $topic_id,
+						$row['topic_title'],
+						$row['topic_first_poster_name'],
+						$soft_delete_reason
+					));
 				}
 			}
 		}
 
 		if (!$is_soft)
 		{
-			$return = delete_topics('topic_id', $topic_ids);
+			delete_topics('topic_id', $topic_ids);
 		}
 	}
 	else
@@ -933,7 +975,7 @@ function mcp_delete_topic($topic_ids, $is_soft = false, $soft_delete_reason = ''
 */
 function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '', $action = 'delete_post')
 {
-	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container;
+	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container, $phpbb_log;
 
 	$check_permission = ($is_soft) ? 'm_softdelete' : 'm_delete';
 	if (!phpbb_check_ids($post_ids, POSTS_TABLE, 'post_id', array($check_permission)))
@@ -983,6 +1025,7 @@ function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '',
 			$approve_log[] = array(
 				'forum_id'		=> $post_data['forum_id'],
 				'topic_id'		=> $post_data['topic_id'],
+				'post_id'		=> $post_id,
 				'post_subject'	=> $post_data['post_subject'],
 				'poster_id'		=> $post_data['poster_id'],
 				'post_username'	=> $post_data['post_username'],
@@ -990,6 +1033,7 @@ function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '',
 			);
 		}
 
+		/* @var $phpbb_content_visibility \phpbb\content_visibility */
 		$phpbb_content_visibility = $phpbb_container->get('content.visibility');
 		foreach ($topic_info as $topic_id => $topic_data)
 		{
@@ -1004,7 +1048,14 @@ function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '',
 		foreach ($approve_log as $row)
 		{
 			$post_username = ($row['poster_id'] == ANONYMOUS && !empty($row['post_username'])) ? $row['post_username'] : $row['username'];
-			add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_SOFTDELETE_POST', $row['post_subject'], $post_username, $soft_delete_reason);
+			$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_SOFTDELETE_POST', false, array(
+				'forum_id' => $row['forum_id'],
+				'topic_id' => $row['topic_id'],
+				'post_id'  => $row['post_id'],
+				$row['post_subject'],
+				$post_username,
+				$soft_delete_reason
+			));
 		}
 
 		$topic_id = $request->variable('t', 0);
@@ -1047,7 +1098,14 @@ function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '',
 		foreach ($post_data as $id => $row)
 		{
 			$post_username = ($row['poster_id'] == ANONYMOUS && !empty($row['post_username'])) ? $row['post_username'] : $row['username'];
-			add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_DELETE_POST', $row['post_subject'], $post_username, $soft_delete_reason);
+			$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_DELETE_POST', false, array(
+				'forum_id' => $row['forum_id'],
+				'topic_id' => $row['topic_id'],
+				'post_id'  => $row['post_id'],
+				$row['post_subject'],
+				$post_username,
+				$soft_delete_reason
+			));
 		}
 
 		// Now delete the posts, topics and forums are automatically resync'ed
@@ -1162,16 +1220,16 @@ function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '',
 function mcp_fork_topic($topic_ids)
 {
 	global $auth, $user, $db, $template, $config;
-	global $phpEx, $phpbb_root_path, $phpbb_dispatcher;
+	global $phpEx, $phpbb_root_path, $phpbb_log, $request, $phpbb_dispatcher;
 
 	if (!phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_')))
 	{
 		return;
 	}
 
-	$to_forum_id = request_var('to_forum_id', 0);
-	$forum_id = request_var('f', 0);
-	$redirect = request_var('redirect', build_url(array('action', 'quickmod')));
+	$to_forum_id = $request->variable('to_forum_id', 0);
+	$forum_id = $request->variable('f', 0);
+	$redirect = $request->variable('redirect', build_url(array('action', 'quickmod')));
 	$additional_msg = $success_msg = '';
 	$counter = array();
 
@@ -1281,6 +1339,18 @@ function mcp_fork_topic($topic_ids)
 				'poll_vote_change'			=> (int) $topic_row['poll_vote_change'],
 			);
 
+			/**
+			* Perform actions before forked topic is created.
+			*
+			* @event core.mcp_main_modify_fork_sql
+			* @var	array	sql_ary	SQL array to be used by $db->sql_build_array
+			* @since 3.1.11-RC1
+			*/
+			$vars = array(
+				'sql_ary',
+			);
+			extract($phpbb_dispatcher->trigger_event('core.mcp_main_modify_fork_sql', compact($vars)));
+
 			$db->sql_query('INSERT INTO ' . TOPICS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
 			$new_topic_id = $db->sql_nextid();
 			$new_topic_id_list[$topic_id] = $new_topic_id;
@@ -1301,8 +1371,6 @@ function mcp_fork_topic($topic_ids)
 
 			if ($topic_row['poll_start'])
 			{
-				$poll_rows = array();
-
 				$sql = 'SELECT *
 					FROM ' . POLL_OPTIONS_TABLE . "
 					WHERE topic_id = $topic_id";
@@ -1515,12 +1583,16 @@ function mcp_fork_topic($topic_ids)
 		sync('topic', 'topic_id', $new_topic_id_list);
 		sync('forum', 'forum_id', $to_forum_id);
 
-		set_config_count('num_topics', sizeof($new_topic_id_list), true);
-		set_config_count('num_posts', $total_posts, true);
+		$config->increment('num_topics', sizeof($new_topic_id_list), false);
+		$config->increment('num_posts', $total_posts, false);
 
 		foreach ($new_topic_id_list as $topic_id => $new_topic_id)
 		{
-			add_log('mod', $to_forum_id, $new_topic_id, 'LOG_FORK', $topic_row['forum_name']);
+			$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_FORK', false, array(
+				'forum_id' => $to_forum_id,
+				'topic_id' => $new_topic_id,
+				$topic_row['forum_name']
+			));
 		}
 
 		$success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_FORKED_SUCCESS' : 'TOPICS_FORKED_SUCCESS';
@@ -1536,7 +1608,7 @@ function mcp_fork_topic($topic_ids)
 		confirm_box(false, 'FORK_TOPIC' . ((sizeof($topic_ids) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_move.html');
 	}
 
-	$redirect = request_var('redirect', "index.$phpEx");
+	$redirect = $request->variable('redirect', "index.$phpEx");
 	$redirect = reapply_sid($redirect);
 
 	if (!$success_msg)
--- a/includes/mcp/mcp_notes.php
+++ b/includes/mcp/mcp_notes.php
@@ -35,10 +35,10 @@ class mcp_notes
 
 	function main($id, $mode)
 	{
-		global $auth, $db, $user, $template;
-		global $config, $phpbb_root_path, $phpEx;
+		global $user, $template, $request;
+		global $phpbb_root_path, $phpEx;
 
-		$action = request_var('action', array('' => ''));
+		$action = $request->variable('action', array('' => ''));
 
 		if (is_array($action))
 		{
@@ -74,15 +74,17 @@ class mcp_notes
 	*/
 	function mcp_notes_user_view($action)
 	{
-		global $phpEx, $phpbb_root_path, $config;
+		global $config, $phpbb_log, $request;
 		global $template, $db, $user, $auth, $phpbb_container;
 
-		$user_id = request_var('u', 0);
-		$username = request_var('username', '', true);
-		$start = request_var('start', 0);
-		$st	= request_var('st', 0);
-		$sk	= request_var('sk', 'b');
-		$sd	= request_var('sd', 'd');
+		$user_id = $request->variable('u', 0);
+		$username = $request->variable('username', '', true);
+		$start = $request->variable('start', 0);
+		$st	= $request->variable('st', 0);
+		$sk	= $request->variable('sk', 'b');
+		$sd	= $request->variable('sd', 'd');
+
+		/* @var $pagination \phpbb\pagination */
 		$pagination = $phpbb_container->get('pagination');
 
 		add_form_key('mcp_notes');
@@ -114,8 +116,8 @@ class mcp_notes
 
 		$deletemark = ($action == 'del_marked') ? true : false;
 		$deleteall	= ($action == 'del_all') ? true : false;
-		$marked		= request_var('marknote', array(0));
-		$usernote	= utf8_normalize_nfc(request_var('usernote', '', true));
+		$marked		= $request->variable('marknote', array(0));
+		$usernote	= $request->variable('usernote', '', true);
 
 		// Handle any actions
 		if (($deletemark || $deleteall) && $auth->acl_get('a_clearlogs'))
@@ -142,7 +144,7 @@ class mcp_notes
 							$where_sql";
 					$db->sql_query($sql);
 
-					add_log('admin', 'LOG_CLEAR_USER', $userrow['username']);
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CLEAR_USER', false, array($userrow['username']));
 
 					$msg = ($deletemark) ? 'MARKED_NOTES_DELETED' : 'ALL_NOTES_DELETED';
 				}
@@ -160,10 +162,17 @@ class mcp_notes
 		{
 			if (check_form_key('mcp_notes'))
 			{
-				add_log('admin', 'LOG_USER_FEEDBACK', $userrow['username']);
-				add_log('mod', 0, 0, 'LOG_USER_FEEDBACK', $userrow['username']);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_FEEDBACK', false, array($userrow['username']));
+				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_USER_FEEDBACK', false, array(
+					'forum_id' => 0,
+					'topic_id' => 0,
+					$userrow['username']
+				));
+				$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_GENERAL', false, array(
+					'reportee_id' => $user_id,
+					$usernote
+				));
 
-				add_log('user', $user_id, 'LOG_USER_GENERAL', $usernote);
 				$msg = $user->lang['USER_FEEDBACK_ADDED'];
 			}
 			else
@@ -192,7 +201,7 @@ class mcp_notes
 		$sql_where = ($st) ? (time() - ($st * 86400)) : 0;
 		$sql_sort = $sort_by_sql[$sk] . ' ' . (($sd == 'd') ? 'DESC' : 'ASC');
 
-		$keywords = utf8_normalize_nfc(request_var('keywords', '', true));
+		$keywords = $request->variable('keywords', '', true);
 		$keywords_param = !empty($keywords) ? '&amp;keywords=' . urlencode(htmlspecialchars_decode($keywords)) : '';
 
 		$log_data = array();
--- a/includes/mcp/mcp_pm_reports.php
+++ b/includes/mcp/mcp_pm_reports.php
@@ -35,14 +35,15 @@ class mcp_pm_reports
 
 	function main($id, $mode)
 	{
-		global $auth, $db, $user, $template, $cache;
+		global $auth, $db, $user, $template, $request;
 		global $config, $phpbb_root_path, $phpEx, $action, $phpbb_container;
 
 		include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
 		include_once($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx);
 
-		$start = request_var('start', 0);
+		/* @var $pagination \phpbb\pagination */
 		$pagination = $phpbb_container->get('pagination');
+		$start = $request->variable('start', 0);
 
 		$this->page_title = 'MCP_PM_REPORTS';
 
@@ -52,7 +53,7 @@ class mcp_pm_reports
 			case 'delete':
 				include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
 
-				$report_id_list = request_var('report_id_list', array(0));
+				$report_id_list = $request->variable('report_id_list', array(0));
 
 				if (!sizeof($report_id_list))
 				{
@@ -75,7 +76,7 @@ class mcp_pm_reports
 
 				$user->add_lang(array('posting', 'viewforum', 'viewtopic', 'ucp'));
 
-				$report_id = request_var('r', 0);
+				$report_id = $request->variable('r', 0);
 
 				$sql = 'SELECT r.pm_id, r.user_id, r.report_id, r.report_closed, report_time, r.report_text, rr.reason_title, rr.reason_description, u.username, u.username_clean, u.user_colour
 					FROM ' . REPORTS_TABLE . ' r, ' . REPORTS_REASONS_TABLE . ' rr, ' . USERS_TABLE . ' u
@@ -93,9 +94,10 @@ class mcp_pm_reports
 					trigger_error('NO_REPORT');
 				}
 
+				/* @var $phpbb_notifications \phpbb\notification\manager */
 				$phpbb_notifications = $phpbb_container->get('notification_manager');
 
-				$phpbb_notifications->mark_notifications_read_by_parent('notification.type.report_pm', $report_id, $user->data['user_id']);
+				$phpbb_notifications->mark_notifications_by_parent('report_pm', $report_id, $user->data['user_id']);
 
 				$pm_id = $report['pm_id'];
 				$report_id = $report['report_id'];
@@ -199,7 +201,7 @@ class mcp_pm_reports
 					'POST_SUBJECT'			=> ($pm_info['message_subject']) ? $pm_info['message_subject'] : $user->lang['NO_SUBJECT'],
 					'POST_DATE'				=> $user->format_date($pm_info['message_time']),
 					'POST_IP'				=> $pm_info['author_ip'],
-					'POST_IPADDR'			=> ($auth->acl_getf_global('m_info') && request_var('lookup', '')) ? @gethostbyaddr($pm_info['author_ip']) : '',
+					'POST_IPADDR'			=> ($auth->acl_getf_global('m_info') && $request->variable('lookup', '')) ? @gethostbyaddr($pm_info['author_ip']) : '',
 					'POST_ID'				=> $pm_info['msg_id'],
 
 					'U_LOOKUP_IP'			=> ($auth->acl_getf_global('m_info')) ? $this->u_action . '&amp;r=' . $report_id . '&amp;pm=' . $pm_id . '&amp;lookup=' . $pm_info['author_ip'] . '#ip' : '',
--- a/includes/mcp/mcp_post.php
+++ b/includes/mcp/mcp_post.php
@@ -24,14 +24,14 @@ if (!defined('IN_PHPBB'))
 */
 function mcp_post_details($id, $mode, $action)
 {
-	global $phpEx, $phpbb_root_path, $config;
-	global $template, $db, $user, $auth, $cache;
+	global $phpEx, $phpbb_root_path, $config, $request;
+	global $template, $db, $user, $auth;
 	global $phpbb_dispatcher;
 
 	$user->add_lang('posting');
 
-	$post_id = request_var('p', 0);
-	$start	= request_var('start', 0);
+	$post_id = $request->variable('p', 0);
+	$start	= $request->variable('start', 0);
 
 	// Get post data
 	$post_info = phpbb_get_post_data(array($post_id), false, true);
@@ -52,7 +52,7 @@ function mcp_post_details($id, $mode, $action)
 
 			if ($auth->acl_get('m_info', $post_info['forum_id']))
 			{
-				$ip = request_var('ip', '');
+				$ip = $request->variable('ip', '');
 				include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
 
 				$template->assign_vars(array(
@@ -73,12 +73,12 @@ function mcp_post_details($id, $mode, $action)
 
 			if ($action == 'chgposter')
 			{
-				$username = request_var('username', '', true);
+				$username = $request->variable('username', '', true);
 				$sql_where = "username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'";
 			}
 			else
 			{
-				$new_user_id = request_var('u', 0);
+				$new_user_id = $request->variable('u', 0);
 				$sql_where = 'user_id = ' . $new_user_id;
 			}
 
@@ -128,7 +128,6 @@ function mcp_post_details($id, $mode, $action)
 	$users_ary = $usernames_ary = array();
 	$attachments = $extensions = array();
 	$post_id = $post_info['post_id'];
-	$topic_tracking_info = array();
 
 	// Get topic tracking info
 	if ($config['load_db_lastread'])
@@ -150,8 +149,6 @@ function mcp_post_details($id, $mode, $action)
 
 	if ($post_info['post_attachment'] && $auth->acl_get('u_download') && $auth->acl_get('f_download', $post_info['forum_id']))
 	{
-		$extensions = $cache->obtain_attach_extensions($post_info['forum_id']);
-
 		$sql = 'SELECT *
 			FROM ' . ATTACHMENTS_TABLE . '
 			WHERE post_msg_id = ' . $post_id . '
@@ -260,7 +257,7 @@ function mcp_post_details($id, $mode, $action)
 		'POST_SUBJECT'			=> $post_info['post_subject'],
 		'POST_DATE'				=> $user->format_date($post_info['post_time']),
 		'POST_IP'				=> $post_info['poster_ip'],
-		'POST_IPADDR'			=> ($auth->acl_get('m_info', $post_info['forum_id']) && request_var('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '',
+		'POST_IPADDR'			=> ($auth->acl_get('m_info', $post_info['forum_id']) && $request->variable('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '',
 		'POST_ID'				=> $post_info['post_id'],
 
 		'U_LOOKUP_IP'			=> ($auth->acl_get('m_info', $post_info['forum_id'])) ? "$url&amp;i=$id&amp;mode=$mode&amp;lookup={$post_info['poster_ip']}#ip" : '',
@@ -355,7 +352,7 @@ function mcp_post_details($id, $mode, $action)
 	// Get IP
 	if ($auth->acl_get('m_info', $post_info['forum_id']))
 	{
-		$rdns_ip_num = request_var('rdns', '');
+		$rdns_ip_num = $request->variable('rdns', '');
 
 		if ($rdns_ip_num != 'all')
 		{
@@ -461,7 +458,7 @@ function mcp_post_details($id, $mode, $action)
 */
 function change_poster(&$post_info, $userdata)
 {
-	global $auth, $db, $config, $phpbb_root_path, $phpEx, $user, $phpbb_dispatcher;
+	global $auth, $db, $config, $phpbb_root_path, $phpEx, $user, $phpbb_log, $phpbb_dispatcher;
 
 	if (empty($userdata) || $userdata['user_id'] == $post_info['user_id'])
 	{
@@ -572,5 +569,12 @@ function change_poster(&$post_info, $userdata)
 	$post_info = $post_info[$post_id];
 
 	// Now add log entry
-	add_log('mod', $post_info['forum_id'], $post_info['topic_id'], 'LOG_MCP_CHANGE_POSTER', $post_info['topic_title'], $from_username, $to_username);
+	$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_MCP_CHANGE_POSTER', false, array(
+		'forum_id' => $post_info['forum_id'],
+		'topic_id' => $post_info['topic_id'],
+		'post_id'  => $post_info['post_id'],
+		$post_info['topic_title'],
+		$from_username,
+		$to_username
+	));
 }
--- a/includes/mcp/mcp_queue.php
+++ b/includes/mcp/mcp_queue.php
@@ -35,14 +35,14 @@ class mcp_queue
 
 	public function main($id, $mode)
 	{
-		global $auth, $db, $user, $template, $cache, $request;
+		global $auth, $db, $user, $template, $request;
 		global $config, $phpbb_root_path, $phpEx, $action, $phpbb_container;
 		global $phpbb_dispatcher;
 
 		include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
 
-		$forum_id = request_var('f', 0);
-		$start = request_var('start', 0);
+		$forum_id = $request->variable('f', 0);
+		$start = $request->variable('start', 0);
 
 		$this->page_title = 'MCP_QUEUE';
 
@@ -104,7 +104,7 @@ class mcp_queue
 
 				if (!empty($topic_id_list) && $mode == 'deleted_topics')
 				{
-					if (!function_exists('mcp_delete_topics'))
+					if (!function_exists('mcp_delete_topic'))
 					{
 						global $phpbb_root_path, $phpEx;
 						include($phpbb_root_path . 'includes/mcp/mcp_main.' . $phpEx);
@@ -154,9 +154,10 @@ class mcp_queue
 
 				$user->add_lang(array('posting', 'viewtopic'));
 
-				$post_id = request_var('p', 0);
-				$topic_id = request_var('t', 0);
+				$post_id = $request->variable('p', 0);
+				$topic_id = $request->variable('t', 0);
 
+				/* @var $phpbb_notifications \phpbb\notification\manager */
 				$phpbb_notifications = $phpbb_container->get('notification_manager');
 
 				if ($topic_id)
@@ -166,7 +167,7 @@ class mcp_queue
 					{
 						$post_id = (int) $topic_info[$topic_id]['topic_first_post_id'];
 
-						$phpbb_notifications->mark_notifications_read('notification.type.topic_in_queue', $topic_id, $user->data['user_id']);
+						$phpbb_notifications->mark_notifications('topic_in_queue', $topic_id, $user->data['user_id']);
 					}
 					else
 					{
@@ -174,7 +175,7 @@ class mcp_queue
 					}
 				}
 
-				$phpbb_notifications->mark_notifications_read('notification.type.post_in_queue', $post_id, $user->data['user_id']);
+				$phpbb_notifications->mark_notifications('post_in_queue', $post_id, $user->data['user_id']);
 
 				$post_info = phpbb_get_post_data(array($post_id), 'm_approve', true);
 
@@ -194,7 +195,7 @@ class mcp_queue
 					));
 				}
 
-				$extensions = $attachments = $topic_tracking_info = array();
+				$attachments = $topic_tracking_info = array();
 
 				// Get topic tracking info
 				if ($config['load_db_lastread'])
@@ -216,8 +217,6 @@ class mcp_queue
 
 				if ($post_info['post_attachment'] && $auth->acl_get('u_download') && $auth->acl_get('f_download', $post_info['forum_id']))
 				{
-					$extensions = $cache->obtain_attach_extensions($post_info['forum_id']);
-
 					$sql = 'SELECT *
 						FROM ' . ATTACHMENTS_TABLE . '
 						WHERE post_msg_id = ' . $post_id . '
@@ -320,7 +319,7 @@ class mcp_queue
 					'POST_SUBJECT'			=> $post_info['post_subject'],
 					'POST_DATE'				=> $user->format_date($post_info['post_time']),
 					'POST_IP'				=> $post_info['poster_ip'],
-					'POST_IPADDR'			=> ($auth->acl_get('m_info', $post_info['forum_id']) && request_var('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '',
+					'POST_IPADDR'			=> ($auth->acl_get('m_info', $post_info['forum_id']) && $request->variable('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '',
 					'POST_ID'				=> $post_info['post_id'],
 					'S_FIRST_POST'			=> ($post_info['topic_first_post_id'] == $post_id),
 
@@ -342,6 +341,8 @@ class mcp_queue
 
 				$topic_id = $request->variable('t', 0);
 				$forum_info = array();
+
+				/* @var $pagination \phpbb\pagination */
 				$pagination = $phpbb_container->get('pagination');
 
 				if ($topic_id)
@@ -399,7 +400,6 @@ class mcp_queue
 						trigger_error('NOT_MODERATOR');
 					}
 
-					$forum_info = $forum_info[$forum_id];
 					$forum_list = $forum_id;
 				}
 
@@ -414,7 +414,6 @@ class mcp_queue
 				$sort_by_sql = $sort_order_sql = array();
 				phpbb_mcp_sorting($mode, $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id, $topic_id);
 
-				$forum_topics = ($total == -1) ? $forum_info['forum_topics_approved'] : $total;
 				$limit_time_sql = ($sort_days) ? 'AND t.topic_last_post_time >= ' . (time() - ($sort_days * 86400)) : '';
 
 				$forum_names = array();
@@ -578,7 +577,7 @@ class mcp_queue
 						'POST_SUBJECT'	=> ($row['post_subject'] != '') ? $row['post_subject'] : $user->lang['NO_SUBJECT'],
 						'TOPIC_TITLE'	=> $row['topic_title'],
 						'POST_TIME'		=> $user->format_date($row['post_time']),
-						'ATTACH_ICON_IMG'	=> ($auth->acl_get('u_download') && $auth->acl_get('f_download', $row['forum_id']) && $row['post_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
+						'S_HAS_ATTACHMENTS'	=> $auth->acl_get('u_download') && $auth->acl_get('f_download', $row['forum_id']) && $row['post_attachment'],
 					));
 				}
 				unset($rowset, $forum_names);
@@ -618,17 +617,18 @@ class mcp_queue
 	*/
 	static public function approve_posts($action, $post_id_list, $id, $mode)
 	{
-		global $db, $template, $user, $config, $request, $phpbb_container, $phpbb_dispatcher;
-		global $phpEx, $phpbb_root_path;
+		global $template, $user, $request, $phpbb_container, $phpbb_dispatcher;
+		global $phpEx, $phpbb_root_path, $phpbb_log;
 
 		if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_approve')))
 		{
+			send_status_line(403, 'Forbidden');
 			trigger_error('NOT_AUTHORISED');
 		}
 
 		$redirect = $request->variable('redirect', build_url(array('quickmod')));
 		$redirect = reapply_sid($redirect);
-		$success_msg = $post_url = '';
+		$post_url = '';
 		$approve_log = array();
 		$num_topics = 0;
 
@@ -677,10 +677,12 @@ class mcp_queue
 				$approve_log[] = array(
 					'forum_id'		=> $post_data['forum_id'],
 					'topic_id'		=> $post_data['topic_id'],
+					'post_id'		=> $post_id,
 					'post_subject'	=> $post_data['post_subject'],
 				);
 			}
 
+			/* @var $phpbb_content_visibility \phpbb\content_visibility */
 			$phpbb_content_visibility = $phpbb_container->get('content.visibility');
 			foreach ($topic_info as $topic_id => $topic_data)
 			{
@@ -689,12 +691,18 @@ class mcp_queue
 
 			foreach ($approve_log as $log_data)
 			{
-				add_log('mod', $log_data['forum_id'], $log_data['topic_id'], 'LOG_POST_' . strtoupper($action) . 'D', $log_data['post_subject']);
+				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_POST_' . strtoupper($action) . 'D', false, array(
+					'forum_id' => $log_data['forum_id'],
+					'topic_id' => $log_data['topic_id'],
+					'post_id'  => $log_data['post_id'],
+					$log_data['post_subject']
+				));
 			}
 
 			// Only send out the mails, when the posts are being approved
 			if ($action == 'approve')
 			{
+				/* @var $phpbb_notifications \phpbb\notification\manager */
 				$phpbb_notifications = $phpbb_container->get('notification_manager');
 
 				// Handle notifications
@@ -731,7 +739,7 @@ class mcp_queue
 					$phpbb_notifications->add_notifications(array('notification.type.quote'), $post_data);
 					$phpbb_notifications->delete_notifications('notification.type.post_in_queue', $post_id);
 
-					$phpbb_notifications->mark_notifications_read(array(
+					$phpbb_notifications->mark_notifications(array(
 						'notification.type.quote',
 						'notification.type.bookmark',
 						'notification.type.post',
@@ -865,11 +873,12 @@ class mcp_queue
 	*/
 	static public function approve_topics($action, $topic_id_list, $id, $mode)
 	{
-		global $db, $template, $user, $config;
+		global $db, $template, $user, $phpbb_log;
 		global $phpEx, $phpbb_root_path, $request, $phpbb_container, $phpbb_dispatcher;
 
 		if (!phpbb_check_ids($topic_id_list, TOPICS_TABLE, 'topic_id', array('m_approve')))
 		{
+			send_status_line(403, 'Forbidden');
 			trigger_error('NOT_AUTHORISED');
 		}
 
@@ -892,6 +901,7 @@ class mcp_queue
 		{
 			$notify_poster = ($action == 'approve' && isset($_REQUEST['notify_poster'])) ? true : false;
 
+			/* @var $phpbb_content_visibility \phpbb\content_visibility */
 			$phpbb_content_visibility = $phpbb_container->get('content.visibility');
 			$first_post_ids = array();
 
@@ -916,7 +926,11 @@ class mcp_queue
 
 			foreach ($approve_log as $log_data)
 			{
-				add_log('mod', $log_data['forum_id'], $log_data['topic_id'], 'LOG_TOPIC_' . strtoupper($action) . 'D', $log_data['topic_title']);
+				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_TOPIC_' . strtoupper($action) . 'D', false, array(
+					'forum_id' => $log_data['forum_id'],
+					'topic_id' => $log_data['topic_id'],
+					$log_data['topic_title']
+				));
 			}
 
 			// Only send out the mails, when the posts are being approved
@@ -935,6 +949,7 @@ class mcp_queue
 				$db->sql_freeresult($result);
 
 				// Handle notifications
+				/* @var $phpbb_notifications \phpbb\notification\manager */
 				$phpbb_notifications = $phpbb_container->get('notification_manager');
 
 				foreach ($topic_info as $topic_id => $topic_data)
@@ -961,8 +976,8 @@ class mcp_queue
 						), $topic_data);
 					}
 
-					$phpbb_notifications->mark_notifications_read('notification.type.quote', $topic_data['post_id'], $user->data['user_id']);
-					$phpbb_notifications->mark_notifications_read('notification.type.topic', $topic_id, $user->data['user_id']);
+					$phpbb_notifications->mark_notifications('quote', $topic_data['post_id'], $user->data['user_id']);
+					$phpbb_notifications->mark_notifications('topic', $topic_id, $user->data['user_id']);
 
 					if ($notify_poster)
 					{
@@ -1056,11 +1071,12 @@ class mcp_queue
 	*/
 	static public function disapprove_posts($post_id_list, $id, $mode)
 	{
-		global $db, $template, $user, $config, $phpbb_container, $phpbb_dispatcher;
-		global $phpEx, $phpbb_root_path, $request;
+		global $db, $template, $user, $phpbb_container, $phpbb_dispatcher;
+		global $phpEx, $phpbb_root_path, $request, $phpbb_log;
 
 		if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_approve')))
 		{
+			send_status_line(403, 'Forbidden');
 			trigger_error('NOT_AUTHORISED');
 		}
 
@@ -1068,7 +1084,7 @@ class mcp_queue
 		$redirect = reapply_sid($redirect);
 		$reason = $request->variable('reason', '', true);
 		$reason_id = $request->variable('reason_id', 0);
-		$success_msg = $additional_msg = '';
+		$additional_msg = '';
 
 		$s_hidden_fields = build_hidden_fields(array(
 			'i'				=> $id,
@@ -1126,7 +1142,7 @@ class mcp_queue
 
 		if (confirm_box(true))
 		{
-			$disapprove_log = $disapprove_log_topics = $disapprove_log_posts = array();
+			$disapprove_log_topics = $disapprove_log_posts = array();
 			$topic_posts_unapproved = $post_disapprove_list = $topic_information = array();
 
 			// Build a list of posts to be disapproved and get the related topics real replies count
@@ -1217,16 +1233,28 @@ class mcp_queue
 					if ($is_disapproving)
 					{
 						$l_log_message = ($log_data['type'] == 'topic') ? 'LOG_TOPIC_DISAPPROVED' : 'LOG_POST_DISAPPROVED';
-						add_log('mod', $log_data['forum_id'], $log_data['topic_id'], $l_log_message, $log_data['post_subject'], $disapprove_reason, $log_data['post_username']);
+						$phpbb_log->add('mod', $user->data['user_id'], $user->ip, $l_log_message, false, array(
+							'forum_id' => $log_data['forum_id'],
+							'topic_id' => $log_data['topic_id'],
+							$log_data['post_subject'],
+							$disapprove_reason,
+							$log_data['post_username']
+						));
 					}
 					else
 					{
 						$l_log_message = ($log_data['type'] == 'topic') ? 'LOG_DELETE_TOPIC' : 'LOG_DELETE_POST';
-						add_log('mod', $log_data['forum_id'], $log_data['topic_id'], $l_log_message, $log_data['post_subject'], $log_data['post_username']);
+						$phpbb_log->add('mod', $user->data['user_id'], $user->ip, $l_log_message, false, array(
+							'forum_id' => $log_data['forum_id'],
+							'topic_id' => $log_data['topic_id'],
+							$log_data['post_subject'],
+							$log_data['post_username']
+						));
 					}
 				}
 			}
 
+			/* @var $phpbb_notifications \phpbb\notification\manager */
 			$phpbb_notifications = $phpbb_container->get('notification_manager');
 
 			$lang_reasons = array();
@@ -1388,11 +1416,6 @@ class mcp_queue
 		}
 		else
 		{
-			if (!function_exists('display_reasons'))
-			{
-				include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
-			}
-
 			$show_notify = false;
 
 			foreach ($post_info as $post_data)
@@ -1412,7 +1435,7 @@ class mcp_queue
 			$confirm_template = 'mcp_approve.html';
 			if ($is_disapproving)
 			{
-				display_reasons($reason_id);
+				$phpbb_container->get('phpbb.report.report_reason_list_provider')->display_reasons($reason_id);
 			}
 			else
 			{
--- a/includes/mcp/mcp_reports.php
+++ b/includes/mcp/mcp_reports.php
@@ -35,13 +35,13 @@ class mcp_reports
 
 	function main($id, $mode)
 	{
-		global $auth, $db, $user, $template, $cache;
+		global $auth, $db, $user, $template, $request;
 		global $config, $phpbb_root_path, $phpEx, $action, $phpbb_container, $phpbb_dispatcher;
 
 		include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
 
-		$forum_id = request_var('f', 0);
-		$start = request_var('start', 0);
+		$forum_id = $request->variable('f', 0);
+		$start = $request->variable('start', 0);
 
 		$this->page_title = 'MCP_REPORTS';
 
@@ -51,7 +51,7 @@ class mcp_reports
 			case 'delete':
 				include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
 
-				$report_id_list = request_var('report_id_list', array(0));
+				$report_id_list = $request->variable('report_id_list', array(0));
 
 				if (!sizeof($report_id_list))
 				{
@@ -69,10 +69,11 @@ class mcp_reports
 
 				$user->add_lang(array('posting', 'viewforum', 'viewtopic'));
 
-				$post_id = request_var('p', 0);
+				$post_id = $request->variable('p', 0);
 
 				// closed reports are accessed by report id
-				$report_id = request_var('r', 0);
+				$report_id = $request->variable('r', 0);
+
 				$sql_ary = array(
 					'SELECT'	=> 'r.post_id, r.user_id, r.report_id, r.report_closed, report_time, r.report_text, r.reported_post_text, r.reported_post_uid, r.reported_post_bitfield, r.reported_post_enable_magic_url, r.reported_post_enable_smilies, r.reported_post_enable_bbcode, rr.reason_title, rr.reason_description, u.username, u.username_clean, u.user_colour',
 
@@ -138,9 +139,10 @@ class mcp_reports
 					trigger_error('NO_REPORT');
 				}
 
+				/* @var $phpbb_notifications \phpbb\notification\manager */
 				$phpbb_notifications = $phpbb_container->get('notification_manager');
 
-				$phpbb_notifications->mark_notifications_read('notification.type.report_post', $post_id, $user->data['user_id']);
+				$phpbb_notifications->mark_notifications('report_post', $post_id, $user->data['user_id']);
 
 				if (!$report_id && $report['report_closed'])
 				{
@@ -180,7 +182,7 @@ class mcp_reports
 					));
 				}
 
-				$topic_tracking_info = $extensions = $attachments = array();
+				$attachments = array();
 				// Get topic tracking info
 				if ($config['load_db_lastread'])
 				{
@@ -287,7 +289,7 @@ class mcp_reports
 					'POST_SUBJECT'			=> ($post_info['post_subject']) ? $post_info['post_subject'] : $user->lang['NO_SUBJECT'],
 					'POST_DATE'				=> $user->format_date($post_info['post_time']),
 					'POST_IP'				=> $post_info['poster_ip'],
-					'POST_IPADDR'			=> ($auth->acl_get('m_info', $post_info['forum_id']) && request_var('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '',
+					'POST_IPADDR'			=> ($auth->acl_get('m_info', $post_info['forum_id']) && $request->variable('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '',
 					'POST_ID'				=> $post_info['post_id'],
 
 					'U_LOOKUP_IP'			=> ($auth->acl_get('m_info', $post_info['forum_id'])) ? $this->u_action . '&amp;r=' . $report_id . '&amp;p=' . $post_id . '&amp;f=' . $forum_id . '&amp;lookup=' . $post_info['poster_ip'] . '#ip' : '',
@@ -299,7 +301,7 @@ class mcp_reports
 
 			case 'reports':
 			case 'reports_closed':
-				$topic_id = request_var('t', 0);
+				$topic_id = $request->variable('t', 0);
 
 				$forum_info = array();
 				$forum_list_reports = get_forum_list('m_report', false, true);
@@ -349,8 +351,6 @@ class mcp_reports
 						trigger_error('NOT_MODERATOR');
 					}
 
-					$global_id = $forum_list[0];
-
 					$sql = 'SELECT SUM(forum_topics_approved) as sum_forum_topics
 						FROM ' . FORUMS_TABLE . '
 						WHERE ' . $db->sql_in_set('forum_id', $forum_list);
@@ -367,13 +367,13 @@ class mcp_reports
 						trigger_error('NOT_MODERATOR');
 					}
 
-					$forum_info = $forum_info[$forum_id];
 					$forum_list = array($forum_id);
 				}
 
+				/* @var $pagination \phpbb\pagination */
+				$pagination = $phpbb_container->get('pagination');
 				$forum_list[] = 0;
 				$forum_data = array();
-				$pagination = $phpbb_container->get('pagination');
 
 				$forum_options = '<option value="0"' . (($forum_id == 0) ? ' selected="selected"' : '') . '>' . $user->lang['ALL_FORUMS'] . '</option>';
 				foreach ($forum_list_reports as $row)
@@ -388,7 +388,6 @@ class mcp_reports
 				$sort_by_sql = $sort_order_sql = array();
 				phpbb_mcp_sorting($mode, $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id, $topic_id);
 
-				$forum_topics = ($total == -1) ? $forum_info['forum_topics_approved'] : $total;
 				$limit_time_sql = ($sort_days) ? 'AND r.report_time >= ' . (time() - ($sort_days * 86400)) : '';
 
 				if ($mode == 'reports')
@@ -457,7 +456,6 @@ class mcp_reports
 						ORDER BY ' . $sort_order_sql;
 					$result = $db->sql_query($sql);
 
-					$report_data = $rowset = array();
 					while ($row = $db->sql_fetchrow($result))
 					{
 						$template->assign_block_vars('postrow', array(
@@ -519,7 +517,7 @@ class mcp_reports
 */
 function close_report($report_id_list, $mode, $action, $pm = false)
 {
-	global $db, $template, $user, $config, $auth;
+	global $db, $user, $auth, $phpbb_log, $request;
 	global $phpEx, $phpbb_root_path, $phpbb_container;
 
 	$pm_where = ($pm) ? ' AND r.post_id = 0 ' : ' AND r.pm_id = 0 ';
@@ -544,6 +542,7 @@ function close_report($report_id_list, $mode, $action, $pm = false)
 	{
 		if (!$auth->acl_getf_global('m_report'))
 		{
+			send_status_line(403, 'Forbidden');
 			trigger_error('NOT_AUTHORISED');
 		}
 	}
@@ -551,25 +550,26 @@ function close_report($report_id_list, $mode, $action, $pm = false)
 	{
 		if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_report')))
 		{
+			send_status_line(403, 'Forbidden');
 			trigger_error('NOT_AUTHORISED');
 		}
 	}
 
 	if ($action == 'delete' && strpos($user->data['session_page'], 'mode=report_details') !== false)
 	{
-		$redirect = request_var('redirect', build_url(array('mode', 'r', 'quickmod')) . '&amp;mode=reports');
+		$redirect = $request->variable('redirect', build_url(array('mode', 'r', 'quickmod')) . '&amp;mode=reports');
 	}
 	else if ($action == 'delete' && strpos($user->data['session_page'], 'mode=pm_report_details') !== false)
 	{
-		$redirect = request_var('redirect', build_url(array('mode', 'r', 'quickmod')) . '&amp;mode=pm_reports');
+		$redirect = $request->variable('redirect', build_url(array('mode', 'r', 'quickmod')) . '&amp;mode=pm_reports');
 	}
-	else if ($action == 'close' && !request_var('r', 0))
+	else if ($action == 'close' && !$request->variable('r', 0))
 	{
-		$redirect = request_var('redirect', build_url(array('mode', 'p', 'quickmod')) . '&amp;mode=' . $module);
+		$redirect = $request->variable('redirect', build_url(array('mode', 'p', 'quickmod')) . '&amp;mode=' . $module);
 	}
 	else
 	{
-		$redirect = request_var('redirect', build_url(array('quickmod')));
+		$redirect = $request->variable('redirect', build_url(array('quickmod')));
 	}
 	$success_msg = '';
 	$forum_ids = array();
@@ -694,18 +694,28 @@ function close_report($report_id_list, $mode, $action, $pm = false)
 		}
 		unset($close_report_posts, $close_report_topics);
 
+		/* @var $phpbb_notifications \phpbb\notification\manager */
 		$phpbb_notifications = $phpbb_container->get('notification_manager');
 
 		foreach ($reports as $report)
 		{
 			if ($pm)
 			{
-				add_log('mod', 0, 0, 'LOG_PM_REPORT_' .  strtoupper($action) . 'D', $post_info[$report['pm_id']]['message_subject']);
+				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_PM_REPORT_' .  strtoupper($action) . 'D', false, array(
+					'forum_id' => 0,
+					'topic_id' => 0,
+					$post_info[$report['pm_id']]['message_subject']
+				));
 				$phpbb_notifications->delete_notifications('notification.type.report_pm', $report['pm_id']);
 			}
 			else
 			{
-				add_log('mod', $post_info[$report['post_id']]['forum_id'], $post_info[$report['post_id']]['topic_id'], 'LOG_REPORT_' .  strtoupper($action) . 'D', $post_info[$report['post_id']]['post_subject']);
+				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_REPORT_' .  strtoupper($action) . 'D', false, array(
+					'forum_id' => $post_info[$report['post_id']]['forum_id'],
+					'topic_id' => $post_info[$report['post_id']]['topic_id'],
+					'post_id'  => $report['post_id'],
+					$post_info[$report['post_id']]['post_subject']
+				));
 				$phpbb_notifications->delete_notifications('notification.type.report_post', $report['post_id']);
 			}
 		}
@@ -758,7 +768,7 @@ function close_report($report_id_list, $mode, $action, $pm = false)
 		confirm_box(false, $user->lang[strtoupper($action) . "_{$pm_prefix}REPORT" . ((sizeof($report_id_list) == 1) ? '' : 'S') . '_CONFIRM'], $s_hidden_fields);
 	}
 
-	$redirect = request_var('redirect', "index.$phpEx");
+	$redirect = $request->variable('redirect', "index.$phpEx");
 	$redirect = reapply_sid($redirect);
 
 	if (!$success_msg)
--- a/includes/mcp/mcp_topic.php
+++ b/includes/mcp/mcp_topic.php
@@ -24,15 +24,16 @@ if (!defined('IN_PHPBB'))
 */
 function mcp_topic_view($id, $mode, $action)
 {
-	global $phpEx, $phpbb_root_path, $config;
-	global $template, $db, $user, $auth, $cache, $phpbb_container, $phpbb_dispatcher;
+	global $phpEx, $phpbb_root_path, $config, $request;
+	global $template, $db, $user, $auth, $phpbb_container, $phpbb_dispatcher;
 
 	$url = append_sid("{$phpbb_root_path}mcp.$phpEx?" . phpbb_extra_url());
 
-	$user->add_lang('viewtopic');
+	/* @var $pagination \phpbb\pagination */
 	$pagination = $phpbb_container->get('pagination');
+	$user->add_lang('viewtopic');
 
-	$topic_id = request_var('t', 0);
+	$topic_id = $request->variable('t', 0);
 	$topic_info = phpbb_get_topic_data(array($topic_id), false, true);
 
 	if (!sizeof($topic_info))
@@ -43,16 +44,16 @@ function mcp_topic_view($id, $mode, $action)
 	$topic_info = $topic_info[$topic_id];
 
 	// Set up some vars
-	$icon_id		= request_var('icon', 0);
-	$subject		= utf8_normalize_nfc(request_var('subject', '', true));
-	$start			= request_var('start', 0);
-	$sort_days_old	= request_var('st_old', 0);
-	$forum_id		= request_var('f', 0);
-	$to_topic_id	= request_var('to_topic_id', 0);
-	$to_forum_id	= request_var('to_forum_id', 0);
+	$icon_id		= $request->variable('icon', 0);
+	$subject		= $request->variable('subject', '', true);
+	$start			= $request->variable('start', 0);
+	$sort_days_old	= $request->variable('st_old', 0);
+	$forum_id		= $request->variable('f', 0);
+	$to_topic_id	= $request->variable('to_topic_id', 0);
+	$to_forum_id	= $request->variable('to_forum_id', 0);
 	$sort			= isset($_POST['sort']) ? true : false;
-	$submitted_id_list	= request_var('post_ids', array(0));
-	$checked_ids = $post_id_list = request_var('post_id_list', array(0));
+	$submitted_id_list	= $request->variable('post_ids', array(0));
+	$checked_ids = $post_id_list = $request->variable('post_id_list', array(0));
 
 	// Resync Topic?
 	if ($action == 'resync')
@@ -116,15 +117,16 @@ function mcp_topic_view($id, $mode, $action)
 	$sort_by_sql = $sort_order_sql = array();
 	phpbb_mcp_sorting('viewtopic', $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $topic_info['forum_id'], $topic_id, $where_sql);
 
-	$limit_time_sql = ($sort_days) ? 'AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
+	/* @var $phpbb_content_visibility \phpbb\content_visibility */
 	$phpbb_content_visibility = $phpbb_container->get('content.visibility');
+	$limit_time_sql = ($sort_days) ? 'AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
 
 	if ($total == -1)
 	{
 		$total = $phpbb_content_visibility->get_count('topic_posts', $topic_info, $topic_info['forum_id']);
 	}
 
-	$posts_per_page = max(0, request_var('posts_per_page', intval($config['posts_per_page'])));
+	$posts_per_page = max(0, $request->variable('posts_per_page', intval($config['posts_per_page'])));
 	if ($posts_per_page == 0)
 	{
 		$posts_per_page = $total;
@@ -154,8 +156,6 @@ function mcp_topic_view($id, $mode, $action)
 	}
 	$db->sql_freeresult($result);
 
-	$topic_tracking_info = array();
-
 	// Get topic tracking info
 	if ($config['load_db_lastread'])
 	{
@@ -171,11 +171,9 @@ function mcp_topic_view($id, $mode, $action)
 	$has_unapproved_posts = $has_deleted_posts = false;
 
 	// Grab extensions
-	$extensions = $attachments = array();
+	$attachments = array();
 	if ($topic_info['topic_attachment'] && sizeof($post_id_list))
 	{
-		$extensions = $cache->obtain_attach_extensions($topic_info['forum_id']);
-
 		// Get attachments...
 		if ($auth->acl_get('u_download') && $auth->acl_get('f_download', $topic_info['forum_id']))
 		{
@@ -269,8 +267,6 @@ function mcp_topic_view($id, $mode, $action)
 			'U_MCP_REPORT'		=> ($auth->acl_get('m_report', $topic_info['forum_id'])) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=report_details&amp;f=' . $topic_info['forum_id'] . '&amp;p=' . $row['post_id']) : '',
 		);
 
-		$current_row_number = $i;
-
 		/**
 		* Event to modify the template data block for topic reviews in the MCP
 		*
@@ -406,11 +402,11 @@ function mcp_topic_view($id, $mode, $action)
 */
 function split_topic($action, $topic_id, $to_forum_id, $subject)
 {
-	global $db, $template, $user, $phpEx, $phpbb_root_path, $auth, $config;
+	global $db, $template, $user, $phpEx, $phpbb_root_path, $auth, $config, $phpbb_log, $request;
 
-	$post_id_list	= request_var('post_id_list', array(0));
-	$forum_id		= request_var('forum_id', 0);
-	$start			= request_var('start', 0);
+	$post_id_list	= $request->variable('post_id_list', array(0));
+	$forum_id		= $request->variable('forum_id', 0);
+	$start			= $request->variable('start', 0);
 
 	if (!sizeof($post_id_list))
 	{
@@ -464,7 +460,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
 		return;
 	}
 
-	$redirect = request_var('redirect', build_url(array('quickmod')));
+	$redirect = $request->variable('redirect', build_url(array('quickmod')));
 
 	$s_hidden_fields = build_hidden_fields(array(
 		'i'				=> 'main',
@@ -477,9 +473,8 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
 		'redirect'		=> $redirect,
 		'subject'		=> $subject,
 		'to_forum_id'	=> $to_forum_id,
-		'icon'			=> request_var('icon', 0))
+		'icon'			=> $request->variable('icon', 0))
 	);
-	$success_msg = $return_link = '';
 
 	if (confirm_box(true))
 	{
@@ -540,7 +535,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
 			trigger_error('NO_POST_SELECTED');
 		}
 
-		$icon_id = request_var('icon', 0);
+		$icon_id = $request->variable('icon', 0);
 
 		$sql_ary = array(
 			'forum_id'			=> $to_forum_id,
@@ -558,8 +553,16 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
 		$topic_info = phpbb_get_topic_data(array($topic_id));
 		$topic_info = $topic_info[$topic_id];
 
-		add_log('mod', $to_forum_id, $to_topic_id, 'LOG_SPLIT_DESTINATION', $subject);
-		add_log('mod', $forum_id, $topic_id, 'LOG_SPLIT_SOURCE', $topic_info['topic_title']);
+		$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_SPLIT_DESTINATION', false, array(
+			'forum_id' => $to_forum_id,
+			'topic_id' => $to_topic_id,
+			$subject
+		));
+		$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_SPLIT_SOURCE', false, array(
+			'forum_id' => $forum_id,
+			'topic_id' => $topic_id,
+			$topic_info['topic_title']
+		));
 
 		// Change topic title of first post
 		$sql = 'UPDATE ' . POSTS_TABLE . "
@@ -613,11 +616,11 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
 		$success_msg = 'TOPIC_SPLIT_SUCCESS';
 
 		// Update forum statistics
-		set_config_count('num_topics', 1, true);
+		$config->increment('num_topics', 1, false);
 
 		// Link back to both topics
 		$return_link = sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $post_info['forum_id'] . '&amp;t=' . $post_info['topic_id']) . '">', '</a>') . '<br /><br />' . sprintf($user->lang['RETURN_NEW_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $to_forum_id . '&amp;t=' . $to_topic_id) . '">', '</a>');
-		$redirect = request_var('redirect', "{$phpbb_root_path}viewtopic.$phpEx?f=$to_forum_id&amp;t=$to_topic_id");
+		$redirect = $request->variable('redirect', "{$phpbb_root_path}viewtopic.$phpEx?f=$to_forum_id&amp;t=$to_topic_id");
 		$redirect = reapply_sid($redirect);
 
 		meta_refresh(3, $redirect);
@@ -634,7 +637,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
 */
 function merge_posts($topic_id, $to_topic_id)
 {
-	global $db, $template, $user, $phpEx, $phpbb_root_path, $auth;
+	global $db, $template, $user, $phpEx, $phpbb_root_path, $phpbb_log, $request;
 
 	if (!$to_topic_id)
 	{
@@ -660,8 +663,8 @@ function merge_posts($topic_id, $to_topic_id)
 
 	$topic_data = $topic_data[$to_topic_id];
 
-	$post_id_list	= request_var('post_id_list', array(0));
-	$start			= request_var('start', 0);
+	$post_id_list	= $request->variable('post_id_list', array(0));
+	$start			= $request->variable('start', 0);
 
 	if (!sizeof($post_id_list))
 	{
@@ -674,7 +677,7 @@ function merge_posts($topic_id, $to_topic_id)
 		return;
 	}
 
-	$redirect = request_var('redirect', build_url(array('quickmod')));
+	$redirect = $request->variable('redirect', build_url(array('quickmod')));
 
 	$s_hidden_fields = build_hidden_fields(array(
 		'i'				=> 'main',
@@ -686,14 +689,19 @@ function merge_posts($topic_id, $to_topic_id)
 		'redirect'		=> $redirect,
 		't'				=> $topic_id)
 	);
-	$success_msg = $return_link = '';
+	$return_link = '';
 
 	if (confirm_box(true))
 	{
 		$to_forum_id = $topic_data['forum_id'];
 
 		move_posts($post_id_list, $to_topic_id, false);
-		add_log('mod', $to_forum_id, $to_topic_id, 'LOG_MERGE', $topic_data['topic_title']);
+
+		$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_MERGE', false, array(
+			'forum_id' => $to_forum_id,
+			'topic_id' => $to_topic_id,
+			$topic_data['topic_title']
+		));
 
 		// Message and return links
 		$success_msg = 'POSTS_MERGED_SUCCESS';
@@ -732,7 +740,7 @@ function merge_posts($topic_id, $to_topic_id)
 
 		// Link to the new topic
 		$return_link .= (($return_link) ? '<br /><br />' : '') . sprintf($user->lang['RETURN_NEW_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $to_forum_id . '&amp;t=' . $to_topic_id) . '">', '</a>');
-		$redirect = request_var('redirect', "{$phpbb_root_path}viewtopic.$phpEx?f=$to_forum_id&amp;t=$to_topic_id");
+		$redirect = $request->variable('redirect', "{$phpbb_root_path}viewtopic.$phpEx?f=$to_forum_id&amp;t=$to_topic_id");
 		$redirect = reapply_sid($redirect);
 
 		meta_refresh(3, $redirect);
--- a/includes/mcp/mcp_warn.php
+++ b/includes/mcp/mcp_warn.php
@@ -35,10 +35,9 @@ class mcp_warn
 
 	function main($id, $mode)
 	{
-		global $auth, $db, $user, $template;
-		global $config, $phpbb_root_path, $phpEx;
+		global $request;
 
-		$action = request_var('action', array('' => ''));
+		$action = $request->variable('action', array('' => ''));
 
 		if (is_array($action))
 		{
@@ -78,8 +77,8 @@ class mcp_warn
 	*/
 	function mcp_warn_front_view()
 	{
-		global $phpEx, $phpbb_root_path, $config;
-		global $template, $db, $user, $auth;
+		global $phpEx, $phpbb_root_path;
+		global $template, $db, $user;
 
 		$template->assign_vars(array(
 			'U_FIND_USERNAME'	=> append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&amp;form=mcp&amp;field=username&amp;select_single=true'),
@@ -132,15 +131,16 @@ class mcp_warn
 	function mcp_warn_list_view($action)
 	{
 		global $phpEx, $phpbb_root_path, $config, $phpbb_container;
-		global $template, $db, $user, $auth;
+		global $template, $user, $auth, $request;
 
-		$user->add_lang('memberlist');
+		/* @var $pagination \phpbb\pagination */
 		$pagination = $phpbb_container->get('pagination');
+		$user->add_lang('memberlist');
 
-		$start	= request_var('start', 0);
-		$st		= request_var('st', 0);
-		$sk		= request_var('sk', 'b');
-		$sd		= request_var('sd', 'd');
+		$start	= $request->variable('start', 0);
+		$st		= $request->variable('st', 0);
+		$sk		= $request->variable('sk', 'b');
+		$sd		= $request->variable('sd', 'd');
 
 		$limit_days = array(0 => $user->lang['ALL_ENTRIES'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 		$sort_by_text = array('a' => $user->lang['SORT_USERNAME'], 'b' => $user->lang['SORT_DATE'], 'c' => $user->lang['SORT_WARNINGS']);
@@ -189,13 +189,13 @@ class mcp_warn
 	*/
 	function mcp_warn_post_view($action)
 	{
-		global $phpEx, $phpbb_root_path, $config;
-		global $template, $db, $user, $auth, $phpbb_dispatcher;
+		global $phpEx, $phpbb_root_path, $config, $request;
+		global $template, $db, $user, $phpbb_dispatcher;
 
-		$post_id = request_var('p', 0);
-		$forum_id = request_var('f', 0);
+		$post_id = $request->variable('p', 0);
+		$forum_id = $request->variable('f', 0);
 		$notify = (isset($_REQUEST['notify_user'])) ? true : false;
-		$warning = utf8_normalize_nfc(request_var('warning', '', true));
+		$warning = $request->variable('warning', '', true);
 
 		$sql = 'SELECT u.*, p.*
 			FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . " u
@@ -369,13 +369,13 @@ class mcp_warn
 	*/
 	function mcp_warn_user_view($action)
 	{
-		global $phpEx, $phpbb_root_path, $config, $module;
-		global $template, $db, $user, $auth, $phpbb_dispatcher;
+		global $phpEx, $phpbb_root_path, $config, $request;
+		global $template, $db, $user, $phpbb_dispatcher;
 
-		$user_id = request_var('u', 0);
-		$username = request_var('username', '', true);
+		$user_id = $request->variable('u', 0);
+		$username = $request->variable('username', '', true);
 		$notify = (isset($_REQUEST['notify_user'])) ? true : false;
-		$warning = utf8_normalize_nfc(request_var('warning', '', true));
+		$warning = $request->variable('warning', '', true);
 
 		$sql_where = ($user_id) ? "user_id = $user_id" : "username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'";
 
@@ -522,8 +522,8 @@ class mcp_warn
 */
 function add_warning($user_row, $warning, $send_pm = true, $post_id = 0)
 {
-	global $phpEx, $phpbb_root_path, $config;
-	global $template, $db, $user, $auth;
+	global $phpEx, $phpbb_root_path, $config, $phpbb_log;
+	global $db, $user;
 
 	if ($send_pm)
 	{
@@ -572,8 +572,11 @@ function add_warning($user_row, $warning, $send_pm = true, $post_id = 0)
 		submit_pm('post', $warn_pm_subject, $pm_data, false);
 	}
 
-	add_log('admin', 'LOG_USER_WARNING', $user_row['username']);
-	$log_id = add_log('user', $user_row['user_id'], 'LOG_USER_WARNING_BODY', $warning);
+	$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_WARNING', false, array($user_row['username']));
+	$log_id = $phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_WARNING_BODY', false, array(
+		'reportee_id' => $user_row['user_id'],
+		$warning
+	));
 
 	$sql_ary = array(
 		'user_id'		=> $user_row['user_id'],
@@ -598,5 +601,10 @@ function add_warning($user_row, $warning, $send_pm = true, $post_id = 0)
 	$row = $db->sql_fetchrow($result);
 	$db->sql_freeresult($result);
 
-	add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_USER_WARNING', $user_row['username']);
+	$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_USER_WARNING', false, array(
+		'forum_id' => $row['forum_id'],
+		'topic_id' => $row['topic_id'],
+		'post_id'  => $post_id,
+		$user_row['username']
+	));
 }
--- a/includes/message_parser.php
+++ b/includes/message_parser.php
@@ -83,7 +83,14 @@ class bbcode_firstpass extends bbcode
 					// it should not demand recompilation
 					if (preg_match($regexp, $this->message))
 					{
-						$this->message = preg_replace($regexp, $replacement, $this->message);
+						if (is_callable($replacement))
+						{
+							$this->message = preg_replace_callback($regexp, $replacement, $this->message);
+						}
+						else
+						{
+							$this->message = preg_replace($regexp, $replacement, $this->message);
+						}
 						$bitfield->set($bbcode_data['bbcode_id']);
 					}
 				}
@@ -123,6 +130,8 @@ class bbcode_firstpass extends bbcode
 
 		static $rowset;
 
+		$bbcode_class = $this;
+
 		// This array holds all bbcode data. BBCodes will be processed in this
 		// order, so it is important to keep [code] in first position and
 		// [quote] in second position.
@@ -132,19 +141,71 @@ class bbcode_firstpass extends bbcode
 		// To perform custom validation in extension, use $this->validate_bbcode_by_extension()
 		// method which accepts variable number of parameters
 		$this->bbcodes = array(
-			'code'			=> array('bbcode_id' => 8,	'regexp' => array('#\[code(?:=([a-z]+))?\](.+\[/code\])#uise' => "\$this->bbcode_code('\$1', '\$2')")),
-			'quote'			=> array('bbcode_id' => 0,	'regexp' => array('#\[quote(?:=&quot;(.*?)&quot;)?\](.+)\[/quote\]#uise' => "\$this->bbcode_quote('\$0')")),
-			'attachment'	=> array('bbcode_id' => 12,	'regexp' => array('#\[attachment=([0-9]+)\](.*?)\[/attachment\]#uise' => "\$this->bbcode_attachment('\$1', '\$2')")),
-			'b'				=> array('bbcode_id' => 1,	'regexp' => array('#\[b\](.*?)\[/b\]#uise' => "\$this->bbcode_strong('\$1')")),
-			'i'				=> array('bbcode_id' => 2,	'regexp' => array('#\[i\](.*?)\[/i\]#uise' => "\$this->bbcode_italic('\$1')")),
-			'url'			=> array('bbcode_id' => 3,	'regexp' => array('#\[url(=(.*))?\](?(1)((?s).*(?-s))|(.*))\[/url\]#uiUe' => "\$this->validate_url('\$2', ('\$3') ? '\$3' : '\$4')")),
-			'img'			=> array('bbcode_id' => 4,	'regexp' => array('#\[img\](.*)\[/img\]#uiUe' => "\$this->bbcode_img('\$1')")),
-			'size'			=> array('bbcode_id' => 5,	'regexp' => array('#\[size=([\-\+]?\d+)\](.*?)\[/size\]#uise' => "\$this->bbcode_size('\$1', '\$2')")),
-			'color'			=> array('bbcode_id' => 6,	'regexp' => array('!\[color=(#[0-9a-f]{3}|#[0-9a-f]{6}|[a-z\-]+)\](.*?)\[/color\]!uise' => "\$this->bbcode_color('\$1', '\$2')")),
-			'u'				=> array('bbcode_id' => 7,	'regexp' => array('#\[u\](.*?)\[/u\]#uise' => "\$this->bbcode_underline('\$1')")),
-			'list'			=> array('bbcode_id' => 9,	'regexp' => array('#\[list(?:=(?:[a-z0-9]|disc|circle|square))?].*\[/list]#uise' => "\$this->bbcode_parse_list('\$0')")),
-			'email'			=> array('bbcode_id' => 10,	'regexp' => array('#\[email=?(.*?)?\](.*?)\[/email\]#uise' => "\$this->validate_email('\$1', '\$2')")),
-			'flash'			=> array('bbcode_id' => 11,	'regexp' => array('#\[flash=([0-9]+),([0-9]+)\](.*?)\[/flash\]#uie' => "\$this->bbcode_flash('\$1', '\$2', '\$3')"))
+			'code'			=> array('bbcode_id' => BBCODE_ID_CODE,	'regexp' => array('#\[code(?:=([a-z]+))?\](.+\[/code\])#uis' => function ($match) use($bbcode_class)
+				{
+					return $bbcode_class->bbcode_code($match[1], $match[2]);
+				}
+			)),
+			'quote'			=> array('bbcode_id' => BBCODE_ID_QUOTE,	'regexp' => array('#\[quote(?:=&quot;(.*?)&quot;)?\](.+)\[/quote\]#uis' => function ($match) use($bbcode_class)
+				{
+					return $bbcode_class->bbcode_quote($match[0]);
+				}
+			)),
+			'attachment'	=> array('bbcode_id' => BBCODE_ID_ATTACH,	'regexp' => array('#\[attachment=([0-9]+)\](.*?)\[/attachment\]#uis' => function ($match) use($bbcode_class)
+				{
+					return $bbcode_class->bbcode_attachment($match[1], $match[2]);
+				}
+			)),
+			'b'				=> array('bbcode_id' => BBCODE_ID_B,	'regexp' => array('#\[b\](.*?)\[/b\]#uis' => function ($match) use($bbcode_class)
+				{
+					return $bbcode_class->bbcode_strong($match[1]);
+				}
+			)),
+			'i'				=> array('bbcode_id' => BBCODE_ID_I,	'regexp' => array('#\[i\](.*?)\[/i\]#uis' => function ($match) use($bbcode_class)
+				{
+					return $bbcode_class->bbcode_italic($match[1]);
+				}
+			)),
+			'url'			=> array('bbcode_id' => BBCODE_ID_URL,	'regexp' => array('#\[url(=(.*))?\](?(1)((?s).*(?-s))|(.*))\[/url\]#uiU' => function ($match) use($bbcode_class)
+				{
+					return $bbcode_class->validate_url($match[2], ($match[3]) ? $match[3] : $match[4]);
+				}
+			)),
+			'img'			=> array('bbcode_id' => BBCODE_ID_IMG,	'regexp' => array('#\[img\](.*)\[/img\]#uiU' => function ($match) use($bbcode_class)
+				{
+					return $bbcode_class->bbcode_img($match[1]);
+				}
+			)),
+			'size'			=> array('bbcode_id' => BBCODE_ID_SIZE,	'regexp' => array('#\[size=([\-\+]?\d+)\](.*?)\[/size\]#uis' => function ($match) use($bbcode_class)
+				{
+					return $bbcode_class->bbcode_size($match[1], $match[2]);
+				}
+			)),
+			'color'			=> array('bbcode_id' => BBCODE_ID_COLOR,	'regexp' => array('!\[color=(#[0-9a-f]{3}|#[0-9a-f]{6}|[a-z\-]+)\](.*?)\[/color\]!uis' => function ($match) use($bbcode_class)
+				{
+					return $bbcode_class->bbcode_color($match[1], $match[2]);
+				}
+			)),
+			'u'				=> array('bbcode_id' => BBCODE_ID_U,	'regexp' => array('#\[u\](.*?)\[/u\]#uis' => function ($match) use($bbcode_class)
+				{
+					return $bbcode_class->bbcode_underline($match[1]);
+				}
+			)),
+			'list'			=> array('bbcode_id' => BBCODE_ID_LIST,	'regexp' => array('#\[list(?:=(?:[a-z0-9]|disc|circle|square))?].*\[/list]#uis' => function ($match) use($bbcode_class)
+				{
+					return $bbcode_class->bbcode_parse_list($match[0]);
+				}
+			)),
+			'email'			=> array('bbcode_id' => BBCODE_ID_EMAIL,	'regexp' => array('#\[email=?(.*?)?\](.*?)\[/email\]#uis' => function ($match) use($bbcode_class)
+				{
+					return $bbcode_class->validate_email($match[1], $match[2]);
+				}
+			)),
+			'flash'			=> array('bbcode_id' => BBCODE_ID_FLASH,	'regexp' => array('#\[flash=([0-9]+),([0-9]+)\](.*?)\[/flash\]#ui' => function ($match) use($bbcode_class)
+				{
+					return $bbcode_class->bbcode_flash($match[1], $match[2], $match[3]);
+				}
+			))
 		);
 
 		// Zero the parsed items array
@@ -342,22 +403,23 @@ class bbcode_firstpass extends bbcode
 
 		if ($config['max_' . $this->mode . '_img_height'] || $config['max_' . $this->mode . '_img_width'])
 		{
-			$stats = @getimagesize(htmlspecialchars_decode($in));
+			$imagesize = new \FastImageSize\FastImageSize();
+			$size_info = $imagesize->getImageSize(htmlspecialchars_decode($in));
 
-			if ($stats === false)
+			if ($size_info === false)
 			{
 				$error = true;
 				$this->warn_msg[] = $user->lang['UNABLE_GET_IMAGE_SIZE'];
 			}
 			else
 			{
-				if ($config['max_' . $this->mode . '_img_height'] && $config['max_' . $this->mode . '_img_height'] < $stats[1])
+				if ($config['max_' . $this->mode . '_img_height'] && $config['max_' . $this->mode . '_img_height'] < $size_info['height'])
 				{
 					$error = true;
 					$this->warn_msg[] = $user->lang('MAX_IMG_HEIGHT_EXCEEDED', (int) $config['max_' . $this->mode . '_img_height']);
 				}
 
-				if ($config['max_' . $this->mode . '_img_width'] && $config['max_' . $this->mode . '_img_width'] < $stats[0])
+				if ($config['max_' . $this->mode . '_img_width'] && $config['max_' . $this->mode . '_img_width'] < $size_info['width'])
 				{
 					$error = true;
 					$this->warn_msg[] = $user->lang('MAX_IMG_WIDTH_EXCEEDED', (int) $config['max_' . $this->mode . '_img_width']);
@@ -736,8 +798,6 @@ class bbcode_firstpass extends bbcode
 	*/
 	function bbcode_quote($in)
 	{
-		global $config, $user;
-
 		$in = str_replace("\r\n", "\n", str_replace('\"', '"', trim($in)));
 
 		if (!$in)
@@ -746,7 +806,9 @@ class bbcode_firstpass extends bbcode
 		}
 
 		// To let the parser not catch tokens within quote_username quotes we encode them before we start this...
-		$in = preg_replace('#quote=&quot;(.*?)&quot;\]#ie', "'quote=&quot;' . str_replace(array('[', ']', '\\\"'), array('&#91;', '&#93;', '\"'), '\$1') . '&quot;]'", $in);
+		$in = preg_replace_callback('#quote=&quot;(.*?)&quot;\]#i', function ($match) {
+			return 'quote=&quot;' . str_replace(array('[', ']', '\\\"'), array('&#91;', '&#93;', '\"'), $match[1]) . '&quot;]';
+		}, $in);
 
 		$tok = ']';
 		$out = '[';
@@ -945,8 +1007,6 @@ class bbcode_firstpass extends bbcode
 	*/
 	function validate_url($var1, $var2)
 	{
-		global $config;
-
 		$var1 = str_replace("\r\n", "\n", str_replace('\"', '"', trim($var1)));
 		$var2 = str_replace("\r\n", "\n", str_replace('\"', '"', trim($var2)));
 
@@ -1076,12 +1136,6 @@ class parse_message extends bbcode_firstpass
 	*/
 	protected $plupload;
 
-	/**
-	* The mimetype guesser object used for attachment mimetypes
-	* @var \phpbb\mimetype\guesser
-	*/
-	protected $mimetype_guesser;
-
 	/**
 	* Init - give message here or manually
 	*/
@@ -1097,7 +1151,7 @@ class parse_message extends bbcode_firstpass
 	*/
 	function parse($allow_bbcode, $allow_magic_url, $allow_smilies, $allow_img_bbcode = true, $allow_flash_bbcode = true, $allow_quote_bbcode = true, $allow_url_bbcode = true, $update_this_message = true, $mode = 'post')
 	{
-		global $config, $db, $user, $phpbb_dispatcher;
+		global $config, $user, $phpbb_dispatcher, $phpbb_container;
 
 		$this->mode = $mode;
 
@@ -1126,12 +1180,6 @@ class parse_message extends bbcode_firstpass
 			$this->decode_message();
 		}
 
-		// Do some general 'cleanup' first before processing message,
-		// e.g. remove excessive newlines(?), smilies(?)
-		$match = array('#(script|about|applet|activex|chrome):#i');
-		$replace = array("\\1&#058;");
-		$this->message = preg_replace($match, $replace, trim($this->message));
-
 		// Store message length...
 		$message_length = ($mode == 'post') ? utf8_strlen($this->message) : utf8_strlen(preg_replace('#\[\/?[a-z\*\+\-]+(=[\S]+)?\]#ius', ' ', $this->message));
 
@@ -1204,56 +1252,29 @@ class parse_message extends bbcode_firstpass
 			return (!$update_this_message) ? $return_message : $this->warn_msg;
 		}
 
-		// Prepare BBcode (just prepares some tags for better parsing)
-		if ($allow_bbcode && strpos($this->message, '[') !== false)
-		{
-			$this->bbcode_init();
-			$disallow = array('img', 'flash', 'quote', 'url');
-			foreach ($disallow as $bool)
-			{
-				if (!${'allow_' . $bool . '_bbcode'})
-				{
-					$this->bbcodes[$bool]['disabled'] = true;
-				}
-			}
-
-			$this->prepare_bbcodes();
-		}
-
-		// Parse smilies
-		if ($allow_smilies)
-		{
-			$this->smilies($config['max_' . $mode . '_smilies']);
-		}
-
-		$num_urls = 0;
-
-		// Parse BBCode
-		if ($allow_bbcode && strpos($this->message, '[') !== false)
-		{
-			$this->parse_bbcode();
-			$num_urls += $this->parsed_items['url'];
-		}
+		// Get the parser
+		$parser = $phpbb_container->get('text_formatter.parser');
 
-		// Parse URL's
-		if ($allow_magic_url)
-		{
-			$this->magic_url(generate_board_url());
+		// Set the parser's options
+		($allow_bbcode)       ? $parser->enable_bbcodes()       : $parser->disable_bbcodes();
+		($allow_magic_url)    ? $parser->enable_magic_url()     : $parser->disable_magic_url();
+		($allow_smilies)      ? $parser->enable_smilies()       : $parser->disable_smilies();
+		($allow_img_bbcode)   ? $parser->enable_bbcode('img')   : $parser->disable_bbcode('img');
+		($allow_flash_bbcode) ? $parser->enable_bbcode('flash') : $parser->disable_bbcode('flash');
+		($allow_quote_bbcode) ? $parser->enable_bbcode('quote') : $parser->disable_bbcode('quote');
+		($allow_url_bbcode)   ? $parser->enable_bbcode('url')   : $parser->disable_bbcode('url');
 
-			if ($config['max_' . $mode . '_urls'])
-			{
-				$num_urls += preg_match_all('#\<!-- ([lmwe]) --\>.*?\<!-- \1 --\>#', $this->message, $matches);
-			}
-		}
+		// Set some config values
+		$parser->set_vars(array(
+			'max_font_size'  => $config['max_' . $this->mode . '_font_size'],
+			'max_img_height' => $config['max_' . $this->mode . '_img_height'],
+			'max_img_width'  => $config['max_' . $this->mode . '_img_width'],
+			'max_smilies'    => $config['max_' . $this->mode . '_smilies'],
+			'max_urls'       => $config['max_' . $this->mode . '_urls']
+		));
 
-		// Check for out-of-bounds characters that are currently
-		// not supported by utf8_bin in MySQL
-		if (preg_match_all('/[\x{10000}-\x{10FFFF}]/u', $this->message, $matches))
-		{
-			$character_list = implode('<br />', $matches[0]);
-			$this->warn_msg[] = $user->lang('UNSUPPORTED_CHARACTERS_MESSAGE', $character_list);
-			return $update_this_message ? $this->warn_msg : $return_message;
-		}
+		// Parse this message
+		$this->message = $parser->parse(htmlspecialchars_decode($this->message, ENT_QUOTES));
 
 		// Remove quotes that are nested too deep
 		if ($config['max_quote_depth'] > 0)
@@ -1269,10 +1290,27 @@ class parse_message extends bbcode_firstpass
 			return (!$update_this_message) ? $return_message : $this->warn_msg;
 		}
 
-		// Check number of links
-		if ($config['max_' . $mode . '_urls'] && $num_urls > $config['max_' . $mode . '_urls'])
+		// Remove quotes that are nested too deep
+		if ($config['max_quote_depth'] > 0)
+		{
+			$this->message = $phpbb_container->get('text_formatter.utils')->remove_bbcode(
+				$this->message,
+				'quote',
+				$config['max_quote_depth']
+			);
+		}
+
+		// Check for errors
+		$errors = $parser->get_errors();
+		if ($errors)
 		{
-			$this->warn_msg[] = sprintf($user->lang['TOO_MANY_URLS'], $config['max_' . $mode . '_urls']);
+			foreach ($errors as $i => $args)
+			{
+				// Translate each error with $user->lang()
+				$errors[$i] = call_user_func_array(array($user, 'lang'), $args);
+			}
+			$this->warn_msg = array_merge($this->warn_msg, $errors);
+
 			return (!$update_this_message) ? $return_message : $this->warn_msg;
 		}
 
@@ -1292,7 +1330,7 @@ class parse_message extends bbcode_firstpass
 	*/
 	function format_display($allow_bbcode, $allow_magic_url, $allow_smilies, $update_this_message = true)
 	{
-		global $phpbb_dispatcher;
+		global $phpbb_container, $phpbb_dispatcher;
 
 		// If false, then the parsed message get returned but internal message not processed.
 		if (!$update_this_message)
@@ -1324,26 +1362,25 @@ class parse_message extends bbcode_firstpass
 		$this->bbcode_uid = $uid;
 		unset($text, $uid);
 
-		if ($this->message_status == 'plain')
+		// NOTE: message_status is unreliable for detecting unparsed text because some callers
+		//       change $this->message without resetting $this->message_status to 'plain' so we
+		//       inspect the message instead
+		//if ($this->message_status == 'plain')
+		if (!preg_match('/^<[rt][ >]/', $this->message))
 		{
 			// Force updating message - of course.
 			$this->parse($allow_bbcode, $allow_magic_url, $allow_smilies, $this->allow_img_bbcode, $this->allow_flash_bbcode, $this->allow_quote_bbcode, $this->allow_url_bbcode, true);
 		}
 
-		// Replace naughty words such as farty pants
-		$this->message = censor_text($this->message);
-
-		// Parse BBcode
-		if ($allow_bbcode)
+		// There's a bug when previewing a topic with no poll, because the empty title of the poll
+		// gets parsed but $this->message still ends up empty. This fixes it, until a proper fix is
+		// devised
+		if ($this->message === '')
 		{
-			$this->bbcode_cache_init();
-
-			// We are giving those parameters to be able to use the bbcode class on its own
-			$this->bbcode_second_pass($this->message, $this->bbcode_uid);
+			$this->message = $phpbb_container->get('text_formatter.parser')->parse($this->message);
 		}
 
-		$this->message = bbcode_nl2br($this->message);
-		$this->message = smiley_text($this->message, !$allow_smilies);
+		$this->message = $phpbb_container->get('text_formatter.renderer')->render($this->message);
 
 		$text = $this->message;
 		$uid = $this->bbcode_uid;
@@ -1433,7 +1470,6 @@ class parse_message extends bbcode_firstpass
 			// For now setting the ttl to 10 minutes
 			switch ($db->get_sql_layer())
 			{
-				case 'mssql':
 				case 'mssql_odbc':
 				case 'mssqlnative':
 					$sql = 'SELECT *
@@ -1494,11 +1530,12 @@ class parse_message extends bbcode_firstpass
 	function parse_attachments($form_name, $mode, $forum_id, $submit, $preview, $refresh, $is_message = false)
 	{
 		global $config, $auth, $user, $phpbb_root_path, $phpEx, $db, $request;
+		global $phpbb_container;
 
 		$error = array();
 
 		$num_attachments = sizeof($this->attachment_data);
-		$this->filename_data['filecomment'] = utf8_normalize_nfc(request_var('filecomment', '', true));
+		$this->filename_data['filecomment'] = $request->variable('filecomment', '', true);
 		$upload = $request->file($form_name);
 		$upload_file = (!empty($upload) && $upload['name'] !== 'none' && trim($upload['name']));
 
@@ -1506,7 +1543,7 @@ class parse_message extends bbcode_firstpass
 		$delete_file	= (isset($_POST['delete_file'])) ? true : false;
 
 		// First of all adjust comments if changed
-		$actual_comment_list = utf8_normalize_nfc(request_var('comment_list', array(''), true));
+		$actual_comment_list = $request->variable('comment_list', array(''), true);
 
 		foreach ($actual_comment_list as $comment_key => $comment)
 		{
@@ -1529,7 +1566,9 @@ class parse_message extends bbcode_firstpass
 		{
 			if ($num_attachments < $cfg['max_attachments'] || $auth->acl_get('a_') || $auth->acl_get('m_', $forum_id))
 			{
-				$filedata = upload_attachment($form_name, $forum_id, false, '', $is_message);
+				/** @var \phpbb\attachment\manager $attachment_manager */
+				$attachment_manager = $phpbb_container->get('attachment.manager');
+				$filedata = $attachment_manager->upload($form_name, $forum_id, false, '', $is_message);
 				$error = $filedata['error'];
 
 				if ($filedata['post_attach'] && !sizeof($error))
@@ -1559,7 +1598,9 @@ class parse_message extends bbcode_firstpass
 					);
 
 					$this->attachment_data = array_merge(array(0 => $new_entry), $this->attachment_data);
-					$this->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#e', "'[attachment='.(\\1 + 1).']\\2[/attachment]'", $this->message);
+					$this->message = preg_replace_callback('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#', function ($match) {
+						return '[attachment='.($match[1] + 1).']' . $match[2] . '[/attachment]';
+					}, $this->message);
 
 					$this->filename_data['filecomment'] = '';
 
@@ -1592,11 +1633,14 @@ class parse_message extends bbcode_firstpass
 			{
 				include_once($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
 
-				$index = array_keys(request_var('delete_file', array(0 => 0)));
+				$index = array_keys($request->variable('delete_file', array(0 => 0)));
 				$index = (!empty($index)) ? $index[0] : false;
 
 				if ($index !== false && !empty($this->attachment_data[$index]))
 				{
+					/** @var \phpbb\attachment\manager $attachment_manager */
+					$attachment_manager = $phpbb_container->get('attachment.manager');
+
 					// delete selected attachment
 					if ($this->attachment_data[$index]['is_orphan'])
 					{
@@ -1611,11 +1655,11 @@ class parse_message extends bbcode_firstpass
 
 						if ($row)
 						{
-							phpbb_unlink($row['physical_filename'], 'file');
+							$attachment_manager->unlink($row['physical_filename'], 'file');
 
 							if ($row['thumbnail'])
 							{
-								phpbb_unlink($row['physical_filename'], 'thumbnail');
+								$attachment_manager->unlink($row['physical_filename'], 'thumbnail');
 							}
 
 							$db->sql_query('DELETE FROM ' . ATTACHMENTS_TABLE . ' WHERE attach_id = ' . (int) $this->attachment_data[$index]['attach_id']);
@@ -1623,11 +1667,13 @@ class parse_message extends bbcode_firstpass
 					}
 					else
 					{
-						delete_attachments('attach', array(intval($this->attachment_data[$index]['attach_id'])));
+						$attachment_manager->delete('attach', $this->attachment_data[$index]['attach_id']);
 					}
 
 					unset($this->attachment_data[$index]);
-					$this->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#e', "(\\1 == \$index) ? '' : ((\\1 > \$index) ? '[attachment=' . (\\1 - 1) . ']\\2[/attachment]' : '\\0')", $this->message);
+					$this->message = preg_replace_callback('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#', function ($match) use($index) {
+						return ($match[1] == $index) ? '' : (($match[1] > $index) ? '[attachment=' . ($match[1] - 1) . ']' . $match[2] . '[/attachment]' : $match[0]);
+					}, $this->message);
 
 					// Reindex Array
 					$this->attachment_data = array_values($this->attachment_data);
@@ -1641,7 +1687,9 @@ class parse_message extends bbcode_firstpass
 			{
 				if ($num_attachments < $cfg['max_attachments'] || $auth->acl_gets('m_', 'a_', $forum_id))
 				{
-					$filedata = upload_attachment($form_name, $forum_id, false, '', $is_message, false, $this->mimetype_guesser, $this->plupload);
+					/** @var \phpbb\attachment\manager $attachment_manager */
+					$attachment_manager = $phpbb_container->get('attachment.manager');
+					$filedata = $attachment_manager->upload($form_name, $forum_id, false, '', $is_message);
 					$error = array_merge($error, $filedata['error']);
 
 					if (!sizeof($error))
@@ -1671,7 +1719,9 @@ class parse_message extends bbcode_firstpass
 						);
 
 						$this->attachment_data = array_merge(array(0 => $new_entry), $this->attachment_data);
-						$this->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#e', "'[attachment='.(\\1 + 1).']\\2[/attachment]'", $this->message);
+						$this->message = preg_replace_callback('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#', function ($match) {
+							return '[attachment=' . ($match[1] + 1) . ']' . $match[2] . '[/attachment]';
+						}, $this->message);
 						$this->filename_data['filecomment'] = '';
 
 						if (isset($this->plupload) && $this->plupload->is_active())
@@ -1715,10 +1765,10 @@ class parse_message extends bbcode_firstpass
 	*/
 	function get_submitted_attachment_data($check_user_id = false)
 	{
-		global $user, $db, $phpbb_root_path, $phpEx, $config;
+		global $user, $db;
 		global $request;
 
-		$this->filename_data['filecomment'] = utf8_normalize_nfc(request_var('filecomment', '', true));
+		$this->filename_data['filecomment'] = $request->variable('filecomment', '', true);
 		$attachment_data = $request->variable('attachment_data', array(0 => array('' => '')), true, \phpbb\request\request_interface::POST);
 		$this->attachment_data = array();
 
@@ -1803,28 +1853,26 @@ class parse_message extends bbcode_firstpass
 	*/
 	function parse_poll(&$poll)
 	{
-		global $auth, $user, $config;
+		global $user, $config;
 
 		$poll_max_options = $poll['poll_max_options'];
 
-		// Parse Poll Option text ;)
+		// Parse Poll Option text
 		$tmp_message = $this->message;
-		$this->message = $poll['poll_option_text'];
-		$bbcode_bitfield = $this->bbcode_bitfield;
 
-		$poll['poll_option_text'] = $this->parse($poll['enable_bbcode'], ($config['allow_post_links']) ? $poll['enable_urls'] : false, $poll['enable_smilies'], $poll['img_status'], false, false, $config['allow_post_links'], false, 'poll');
+		$poll['poll_options'] = preg_split('/\s*?\n\s*/', trim($poll['poll_option_text']));
+		$poll['poll_options_size'] = sizeof($poll['poll_options']);
 
-		$bbcode_bitfield = base64_encode(base64_decode($bbcode_bitfield) | base64_decode($this->bbcode_bitfield));
-		$this->message = $tmp_message;
+		foreach ($poll['poll_options'] as &$poll_option)
+		{
+			$this->message = $poll_option;
+			$poll_option = $this->parse($poll['enable_bbcode'], ($config['allow_post_links']) ? $poll['enable_urls'] : false, $poll['enable_smilies'], $poll['img_status'], false, false, $config['allow_post_links'], false, 'poll');
+		}
+		unset($poll_option);
+		$poll['poll_option_text'] = implode("\n", $poll['poll_options']);
 
 		// Parse Poll Title
-		$tmp_message = $this->message;
 		$this->message = $poll['poll_title'];
-		$this->bbcode_bitfield = $bbcode_bitfield;
-
-		$poll['poll_options'] = explode("\n", trim($poll['poll_option_text']));
-		$poll['poll_options_size'] = sizeof($poll['poll_options']);
-
 		if (!$poll['poll_title'] && $poll['poll_options_size'])
 		{
 			$this->warn_msg[] = $user->lang['NO_POLL_TITLE'];
@@ -1842,10 +1890,6 @@ class parse_message extends bbcode_firstpass
 			}
 		}
 
-		$this->bbcode_bitfield = base64_encode(base64_decode($bbcode_bitfield) | base64_decode($this->bbcode_bitfield));
-		$this->message = $tmp_message;
-		unset($tmp_message);
-
 		if (sizeof($poll['poll_options']) == 1)
 		{
 			$this->warn_msg[] = $user->lang['TOO_FEW_POLL_OPTIONS'];
@@ -1860,6 +1904,8 @@ class parse_message extends bbcode_firstpass
 		}
 
 		$poll['poll_max_options'] = ($poll['poll_max_options'] < 1) ? 1 : (($poll['poll_max_options'] > $config['max_poll_options']) ? $config['max_poll_options'] : $poll['poll_max_options']);
+
+		$this->message = $tmp_message;
 	}
 
 	/**
@@ -1870,6 +1916,19 @@ class parse_message extends bbcode_firstpass
 	*/
 	public function remove_nested_quotes($max_depth)
 	{
+		global $phpbb_container;
+
+		if (preg_match('#^<[rt][ >]#', $this->message))
+		{
+			$this->message = $phpbb_container->get('text_formatter.utils')->remove_bbcode(
+				$this->message,
+				'quote',
+				$max_depth
+			);
+
+			return;
+		}
+
 		// Capture all [quote] and [/quote] tags
 		preg_match_all('(\\[/?quote(?:=&quot;(.*?)&quot;)?:' . $this->bbcode_uid . '\\])', $this->message, $matches, PREG_OFFSET_CAPTURE);
 
@@ -1918,18 +1977,6 @@ class parse_message extends bbcode_firstpass
 		$this->plupload = $plupload;
 	}
 
-	/**
-	* Setter function for passing the mimetype_guesser object
-	*
-	* @param \phpbb\mimetype\guesser $mimetype_guesser The mimetype_guesser object
-	*
-	* @return null
-	*/
-	public function set_mimetype_guesser(\phpbb\mimetype\guesser $mimetype_guesser)
-	{
-		$this->mimetype_guesser = $mimetype_guesser;
-	}
-
 	/**
 	* Function to perform custom bbcode validation by extensions
 	* can be used in bbcode_init() to assign regexp replacement
--- a/includes/questionnaire/questionnaire.php
+++ b/includes/questionnaire/questionnaire.php
@@ -46,9 +46,9 @@ class phpbb_questionnaire_data_collector
 		$this->providers = array();
 	}
 
-	function add_data_provider(&$provider)
+	function add_data_provider($provider)
 	{
-		$this->providers[] = &$provider;
+		$this->providers[] = $provider;
 	}
 
 	/**
@@ -80,7 +80,7 @@ class phpbb_questionnaire_data_collector
 	{
 		foreach (array_keys($this->providers) as $key)
 		{
-			$provider = &$this->providers[$key];
+			$provider = $this->providers[$key];
 			$this->data[$provider->get_identifier()] = $provider->get_data();
 		}
 		$this->data['install_id'] = $this->install_id;
@@ -190,7 +190,6 @@ class phpbb_questionnaire_system_data_provider
 			// - 192.168.0.0/16
 			if ($ip_address_ary[0] == '10' ||
 				($ip_address_ary[0] == '172' && intval($ip_address_ary[1]) > 15 && intval($ip_address_ary[1]) < 32) ||
-				($ip_address_ary[0] == '192' && $ip_address_ary[1] == '168') ||
 				($ip_address_ary[0] == '192' && $ip_address_ary[1] == '168'))
 			{
 				return true;
@@ -230,7 +229,7 @@ class phpbb_questionnaire_phpbb_data_provider
 		if (empty($config['questionnaire_unique_id']))
 		{
 			$this->unique_id = unique_id();
-			set_config('questionnaire_unique_id', $this->unique_id);
+			$config->set('questionnaire_unique_id', $this->unique_id);
 		}
 		else
 		{
@@ -257,7 +256,7 @@ class phpbb_questionnaire_phpbb_data_provider
 	*/
 	function get_data()
 	{
-		global $phpbb_root_path, $phpEx, $phpbb_config_php_file;
+		global $phpbb_config_php_file;
 
 		extract($phpbb_config_php_file->get_all());
 		unset($dbhost, $dbport, $dbname, $dbuser, $dbpasswd); // Just a precaution
--- a/includes/sphinxapi.php
+++ b/includes/sphinxapi.php
@@ -1659,7 +1659,6 @@ class SphinxClient
 			return false;
 		}
 
-		$res = substr ( $response, 4 ); // just ignore length, error handling, etc
 		$p = 0;
 		list ( $rows, $cols ) = array_values ( unpack ( "N*N*", substr ( $response, $p, 8 ) ) ); $p += 8;
 
--- a/includes/startup.php
+++ b/includes/startup.php
@@ -19,10 +19,6 @@ if (!defined('IN_PHPBB'))
 }
 
 // Report all errors, except notices and deprecation messages
-if (!defined('E_DEPRECATED'))
-{
-	define('E_DEPRECATED', 8192);
-}
 $level = E_ALL & ~E_NOTICE & ~E_DEPRECATED;
 error_reporting($level);
 
@@ -109,33 +105,21 @@ else
 	define('STRIP', (get_magic_quotes_gpc()) ? true : false);
 }
 
-// Prevent date/time functions from throwing E_WARNING on PHP 5.3 by setting a default timezone
-if (function_exists('date_default_timezone_set') && function_exists('date_default_timezone_get'))
-{
-	// For PHP 5.1.0 the date/time functions have been rewritten
-	// and setting a timezone is required prior to calling any date/time function.
-
-	// Since PHP 5.2.0 calls to date/time functions without having a timezone set
-	// result in E_STRICT errors being thrown.
-	// Note: We already exclude E_STRICT errors
-	// (to be exact: they are not included in E_ALL in PHP 5.2)
-
-	// In PHP 5.3.0 the error level has been raised to E_WARNING which causes problems
-	// because we show E_WARNING errors and do not set a default timezone.
-	// This is because we have our own timezone handling and work in UTC only anyway.
+// In PHP 5.3.0 the error level has been raised to E_WARNING which causes problems
+// because we show E_WARNING errors and do not set a default timezone.
+// This is because we have our own timezone handling and work in UTC only anyway.
 
-	// So what we basically want to do is set our timezone to UTC,
-	// but we don't know what other scripts (such as bridges) are involved,
-	// so we check whether a timezone is already set by calling date_default_timezone_get().
+// So what we basically want to do is set our timezone to UTC,
+// but we don't know what other scripts (such as bridges) are involved,
+// so we check whether a timezone is already set by calling date_default_timezone_get().
 
-	// Unfortunately, date_default_timezone_get() itself might throw E_WARNING
-	// if no timezone has been set, so we have to keep it quiet with @.
+// Unfortunately, date_default_timezone_get() itself might throw E_WARNING
+// if no timezone has been set, so we have to keep it quiet with @.
 
-	// date_default_timezone_get() tries to guess the correct timezone first
-	// and then falls back to UTC when everything fails.
-	// We just set the timezone to whatever date_default_timezone_get() returns.
-	date_default_timezone_set(@date_default_timezone_get());
-}
+// date_default_timezone_get() tries to guess the correct timezone first
+// and then falls back to UTC when everything fails.
+// We just set the timezone to whatever date_default_timezone_get() returns.
+date_default_timezone_set(@date_default_timezone_get());
 
 // Autoloading of dependencies.
 // Three options are supported:
@@ -172,5 +156,4 @@ else
 	require($phpbb_root_path . 'vendor/autoload.php');
 }
 
-$starttime = explode(' ', microtime());
-$starttime = $starttime[1] + $starttime[0];
+$starttime = microtime(true);
--- a/includes/ucp/info/ucp_attachments.php
+++ b/includes/ucp/info/ucp_attachments.php
@@ -18,7 +18,6 @@ class ucp_attachments_info
 		return array(
 			'filename'	=> 'ucp_attachments',
 			'title'		=> 'UCP_ATTACHMENTS',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'attachments'	=> array('title' => 'UCP_MAIN_ATTACHMENTS', 'auth' => 'acl_u_attach', 'cat' => array('UCP_MAIN')),
 			),
--- a/includes/ucp/info/ucp_auth_link.php
+++ b/includes/ucp/info/ucp_auth_link.php
@@ -18,7 +18,6 @@ class ucp_auth_link_info
 		return array(
 			'filename'	=> 'ucp_auth_link',
 			'title'		=> 'UCP_AUTH_LINK',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'auth_link'	=> array('title' => 'UCP_AUTH_LINK_MANAGE', 'auth' => 'authmethod_oauth', 'cat' => array('UCP_PROFILE')),
 			),
--- a/includes/ucp/info/ucp_groups.php
+++ b/includes/ucp/info/ucp_groups.php
@@ -18,7 +18,6 @@ class ucp_groups_info
 		return array(
 			'filename'	=> 'ucp_groups',
 			'title'		=> 'UCP_USERGROUPS',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'membership'	=> array('title' => 'UCP_USERGROUPS_MEMBER', 'auth' => '', 'cat' => array('UCP_USERGROUPS')),
 				'manage'		=> array('title' => 'UCP_USERGROUPS_MANAGE', 'auth' => '', 'cat' => array('UCP_USERGROUPS')),
--- a/includes/ucp/info/ucp_main.php
+++ b/includes/ucp/info/ucp_main.php
@@ -18,7 +18,6 @@ class ucp_main_info
 		return array(
 			'filename'	=> 'ucp_main',
 			'title'		=> 'UCP_MAIN',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'front'			=> array('title' => 'UCP_MAIN_FRONT', 'auth' => '', 'cat' => array('UCP_MAIN')),
 				'subscribed'	=> array('title' => 'UCP_MAIN_SUBSCRIBED', 'auth' => '', 'cat' => array('UCP_MAIN')),
--- a/includes/ucp/info/ucp_notifications.php
+++ b/includes/ucp/info/ucp_notifications.php
@@ -18,10 +18,9 @@ class ucp_notifications_info
 		return array(
 			'filename'	=> 'ucp_notifications',
 			'title'		=> 'UCP_NOTIFICATION_OPTIONS',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'notification_options'		=> array('title' => 'UCP_NOTIFICATION_OPTIONS', 'auth' => '', 'cat' => array('UCP_PREFS')),
-				'notification_list'			=> array('title' => 'UCP_NOTIFICATION_LIST', 'auth' => '', 'cat' => array('UCP_MAIN')),
+				'notification_list'			=> array('title' => 'UCP_NOTIFICATION_LIST',    'auth' => 'cfg_allow_board_notifications', 'cat' => array('UCP_MAIN')),
 			),
 		);
 	}
--- a/includes/ucp/info/ucp_pm.php
+++ b/includes/ucp/info/ucp_pm.php
@@ -18,7 +18,6 @@ class ucp_pm_info
 		return array(
 			'filename'	=> 'ucp_pm',
 			'title'		=> 'UCP_PM',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'view'		=> array('title' => 'UCP_PM_VIEW', 'auth' => 'cfg_allow_privmsg', 'display' => false, 'cat' => array('UCP_PM')),
 				'compose'	=> array('title' => 'UCP_PM_COMPOSE', 'auth' => 'cfg_allow_privmsg', 'cat' => array('UCP_PM')),
--- a/includes/ucp/info/ucp_prefs.php
+++ b/includes/ucp/info/ucp_prefs.php
@@ -18,7 +18,6 @@ class ucp_prefs_info
 		return array(
 			'filename'	=> 'ucp_prefs',
 			'title'		=> 'UCP_PREFS',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'personal'	=> array('title' => 'UCP_PREFS_PERSONAL', 'auth' => '', 'cat' => array('UCP_PREFS')),
 				'post'		=> array('title' => 'UCP_PREFS_POST', 'auth' => '', 'cat' => array('UCP_PREFS')),
--- a/includes/ucp/info/ucp_profile.php
+++ b/includes/ucp/info/ucp_profile.php
@@ -18,7 +18,6 @@ class ucp_profile_info
 		return array(
 			'filename'	=> 'ucp_profile',
 			'title'		=> 'UCP_PROFILE',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'profile_info'	=> array('title' => 'UCP_PROFILE_PROFILE_INFO', 'auth' => 'acl_u_chgprofileinfo', 'cat' => array('UCP_PROFILE')),
 				'signature'		=> array('title' => 'UCP_PROFILE_SIGNATURE', 'auth' => 'acl_u_sig', 'cat' => array('UCP_PROFILE')),
--- a/includes/ucp/info/ucp_zebra.php
+++ b/includes/ucp/info/ucp_zebra.php
@@ -18,7 +18,6 @@ class ucp_zebra_info
 		return array(
 			'filename'	=> 'ucp_zebra',
 			'title'		=> 'UCP_ZEBRA',
-			'version'	=> '1.0.0',
 			'modes'		=> array(
 				'friends'		=> array('title' => 'UCP_ZEBRA_FRIENDS', 'auth' => '', 'cat' => array('UCP_ZEBRA')),
 				'foes'			=> array('title' => 'UCP_ZEBRA_FOES', 'auth' => '', 'cat' => array('UCP_ZEBRA')),
--- a/includes/ucp/ucp_activate.php
+++ b/includes/ucp/ucp_activate.php
@@ -29,11 +29,11 @@ class ucp_activate
 
 	function main($id, $mode)
 	{
-		global $config, $phpbb_root_path, $phpEx;
-		global $db, $user, $auth, $template, $phpbb_container, $phpbb_dispatcher;
+		global $config, $phpbb_root_path, $phpEx, $request;
+		global $db, $user, $auth, $phpbb_container, $phpbb_log, $phpbb_dispatcher;
 
-		$user_id = request_var('u', 0);
-		$key = request_var('k', '');
+		$user_id = $request->variable('u', 0);
+		$key = $request->variable('k', '');
 
 		$sql = 'SELECT user_id, username, user_type, user_email, user_newpasswd, user_lang, user_notify_type, user_actkey, user_inactive_reason
 			FROM ' . USERS_TABLE . "
@@ -67,6 +67,7 @@ class ucp_activate
 			{
 				login_box('', $user->lang['NO_AUTH_OPERATION']);
 			}
+			send_status_line(403, 'Forbidden');
 			trigger_error('NO_AUTH_OPERATION');
 		}
 
@@ -86,7 +87,10 @@ class ucp_activate
 				WHERE user_id = ' . $user_row['user_id'];
 			$db->sql_query($sql);
 
-			add_log('user', $user_row['user_id'], 'LOG_USER_NEW_PASSWORD', $user_row['username']);
+			$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_NEW_PASSWORD', false, array(
+				'reportee_id' => $user_row['user_id'],
+				$user_row['username']
+			));
 		}
 
 		if (!$update_password)
@@ -101,15 +105,19 @@ class ucp_activate
 			$db->sql_query($sql);
 
 			// Create the correct logs
-			add_log('user', $user_row['user_id'], 'LOG_USER_ACTIVE_USER');
+			$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_ACTIVE_USER', false, array(
+				'reportee_id' => $user_row['user_id']
+			));
+
 			if ($auth->acl_get('a_user'))
 			{
-				add_log('admin', 'LOG_USER_ACTIVE', $user_row['username']);
+				$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_ACTIVE', false, array($user_row['username']));
 			}
 		}
 
 		if ($config['require_activation'] == USER_ACTIVATION_ADMIN && !$update_password)
 		{
+			/* @var $phpbb_notifications \phpbb\notification\manager */
 			$phpbb_notifications = $phpbb_container->get('notification_manager');
 			$phpbb_notifications->delete_notifications('notification.type.admin_activate_user', $user_row['user_id']);
 
--- a/includes/ucp/ucp_attachments.php
+++ b/includes/ucp/ucp_attachments.php
@@ -29,15 +29,14 @@ class ucp_attachments
 
 	function main($id, $mode)
 	{
-		global $template, $user, $db, $config, $phpEx, $phpbb_root_path, $phpbb_container;
+		global $template, $user, $db, $config, $phpEx, $phpbb_root_path, $phpbb_container, $request;
 
-		$start		= request_var('start', 0);
-		$sort_key	= request_var('sk', 'a');
-		$sort_dir	= request_var('sd', 'a');
+		$start		= $request->variable('start', 0);
+		$sort_key	= $request->variable('sk', 'a');
+		$sort_dir	= $request->variable('sd', 'a');
 
 		$delete		= (isset($_POST['delete'])) ? true : false;
-		$confirm	= (isset($_POST['confirm'])) ? true : false;
-		$delete_ids	= array_keys(request_var('attachment', array(0)));
+		$delete_ids	= array_keys($request->variable('attachment', array(0)));
 
 		if ($delete && sizeof($delete_ids))
 		{
@@ -70,12 +69,10 @@ class ucp_attachments
 
 			if (confirm_box(true))
 			{
-				if (!function_exists('delete_attachments'))
-				{
-					include_once($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
-				}
-
-				delete_attachments('attach', $delete_ids);
+				/** @var \phpbb\attachment\manager $attachment_manager */
+				$attachment_manager = $phpbb_container->get('attachment.manager');
+				$attachment_manager->delete('attach', $delete_ids);
+				unset($attachment_manager);
 
 				meta_refresh(3, $this->u_action);
 				$message = ((sizeof($delete_ids) == 1) ? $user->lang['ATTACHMENT_DELETED'] : $user->lang['ATTACHMENTS_DELETED']) . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
@@ -123,6 +120,7 @@ class ucp_attachments
 		$db->sql_freeresult($result);
 
 		// Ensure start is a valid value
+		/* @var $pagination \phpbb\pagination */
 		$pagination = $phpbb_container->get('pagination');
 		$start = $pagination->validate_start($start, $config['topics_per_page'], $num_attachments);
 
--- a/includes/ucp/ucp_auth_link.php
+++ b/includes/ucp/ucp_auth_link.php
@@ -38,6 +38,7 @@ class ucp_auth_link
 
 		$error = array();
 
+		/* @var $provider_collection \phpbb\auth\provider_collection */
 		$provider_collection = $phpbb_container->get('auth.provider_collection');
 		$auth_provider = $provider_collection->get_provider();
 
--- a/includes/ucp/ucp_confirm.php
+++ b/includes/ucp/ucp_confirm.php
@@ -36,10 +36,10 @@ class ucp_confirm
 
 	function main($id, $mode)
 	{
-		global $db, $user, $phpbb_root_path, $config, $phpEx, $phpbb_container;
+		global $config, $phpbb_container, $request;
 
 		$captcha = $phpbb_container->get('captcha.factory')->get_instance($config['captcha_plugin']);
-		$captcha->init(request_var('type', 0));
+		$captcha->init($request->variable('type', 0));
 		$captcha->execute();
 
 		garbage_collection();
--- a/includes/ucp/ucp_groups.php
+++ b/includes/ucp/ucp_groups.php
@@ -30,16 +30,17 @@ class ucp_groups
 	{
 		global $config, $phpbb_root_path, $phpEx, $phpbb_admin_path;
 		global $db, $user, $auth, $cache, $template;
-		global $request, $phpbb_container;
+		global $request, $phpbb_container, $phpbb_log;
 
 		$user->add_lang('groups');
 
 		$return_page = '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '">', '</a>');
 
-		$mark_ary	= request_var('mark', array(0));
+		$mark_ary	= $request->variable('mark', array(0));
 		$submit		= $request->variable('submit', false, false, \phpbb\request\request_interface::POST);
-		$delete		= $request->variable('delete', false, false, \phpbb\request\request_interface::POST);
-		$error = $data = array();
+
+		/** @var \phpbb\group\helper $group_helper */
+		$group_helper = $phpbb_container->get('group_helper');
 
 		switch ($mode)
 		{
@@ -49,8 +50,8 @@ class ucp_groups
 
 				if ($submit || isset($_POST['change_default']))
 				{
-					$action = (isset($_POST['change_default'])) ? 'change_default' : request_var('action', '');
-					$group_id = ($action == 'change_default') ? request_var('default', 0) : request_var('selected', 0);
+					$action = (isset($_POST['change_default'])) ? 'change_default' : $request->variable('action', '');
+					$group_id = ($action == 'change_default') ? $request->variable('default', 0) : $request->variable('selected', 0);
 
 					if (!$group_id)
 					{
@@ -65,7 +66,7 @@ class ucp_groups
 					$group_row = array();
 					while ($row = $db->sql_fetchrow($result))
 					{
-						$row['group_name'] = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'];
+						$row['group_name'] = $group_helper->get_name($row['group_name']);
 						$group_row[$row['group_id']] = $row;
 					}
 					$db->sql_freeresult($result);
@@ -86,6 +87,7 @@ class ucp_groups
 
 							if (!$auth->acl_get('u_chggrp'))
 							{
+								send_status_line(403, 'Forbidden');
 								trigger_error($user->lang['NOT_AUTHORISED'] . $return_page);
 							}
 
@@ -99,7 +101,10 @@ class ucp_groups
 							{
 								group_user_attributes('default', $group_id, $user->data['user_id']);
 
-								add_log('user', $user->data['user_id'], 'LOG_USER_GROUP_CHANGE', sprintf($user->lang['USER_GROUP_CHANGE'], $group_row[$user->data['group_id']]['group_name'], $group_row[$group_id]['group_name']));
+								$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_GROUP_CHANGE', false, array(
+									'reportee_id' => $user->data['user_id'],
+									sprintf($user->lang['USER_GROUP_CHANGE'], $group_row[$user->data['group_id']]['group_name'], $group_row[$group_id]['group_name'])
+								));
 
 								meta_refresh(3, $this->u_action);
 								trigger_error($user->lang['CHANGED_DEFAULT_GROUP'] . $return_page);
@@ -146,7 +151,10 @@ class ucp_groups
 							{
 								group_user_del($group_id, $user->data['user_id']);
 
-								add_log('user', $user->data['user_id'], 'LOG_USER_GROUP_RESIGN', $group_row[$group_id]['group_name']);
+								$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_GROUP_RESIGN', false, array(
+									'reportee_id' => $user->data['user_id'],
+									$group_row[$group_id]['group_name']
+								));
 
 								meta_refresh(3, $this->u_action);
 								trigger_error($user->lang[($row['user_pending']) ? 'GROUP_RESIGNED_PENDING' : 'GROUP_RESIGNED_MEMBERSHIP'] . $return_page);
@@ -202,7 +210,10 @@ class ucp_groups
 									group_user_add($group_id, $user->data['user_id'], false, false, false, 0, 1);
 								}
 
-								add_log('user', $user->data['user_id'], 'LOG_USER_GROUP_JOIN' . (($group_row[$group_id]['group_type'] == GROUP_FREE) ? '' : '_PENDING'), $group_row[$group_id]['group_name']);
+								$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_GROUP_JOIN' . (($group_row[$group_id]['group_type'] == GROUP_FREE) ? '' : '_PENDING'), false, array(
+									'reportee_id' => $user->data['user_id'],
+									$group_row[$group_id]['group_name']
+								));
 
 								meta_refresh(3, $this->u_action);
 								trigger_error($user->lang[($group_row[$group_id]['group_type'] == GROUP_FREE) ? 'GROUP_JOINED' : 'GROUP_JOINED_PENDING'] . $return_page);
@@ -237,7 +248,10 @@ class ucp_groups
 							{
 								group_user_attributes('demote', $group_id, $user->data['user_id']);
 
-								add_log('user', $user->data['user_id'], 'LOG_USER_GROUP_DEMOTE', $group_row[$group_id]['group_name']);
+								$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_GROUP_DEMOTE', false, array(
+									'reportee_id' => $user->data['user_id'],
+									$group_row[$group_id]['group_name']
+								));
 
 								meta_refresh(3, $this->u_action);
 								trigger_error($user->lang['USER_GROUP_DEMOTED'] . $return_page);
@@ -295,7 +309,7 @@ class ucp_groups
 
 					$template->assign_block_vars($block, array(
 						'GROUP_ID'		=> $row['group_id'],
-						'GROUP_NAME'	=> ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'],
+						'GROUP_NAME'	=> $group_helper->get_name($row['group_name']),
 						'GROUP_DESC'	=> ($row['group_type'] <> GROUP_SPECIAL) ? generate_text_for_display($row['group_desc'], $row['group_desc_uid'], $row['group_desc_bitfield'], $row['group_desc_options']) : $user->lang['GROUP_IS_SPECIAL'],
 						'GROUP_SPECIAL'	=> ($row['group_type'] <> GROUP_SPECIAL) ? false : true,
 						'GROUP_STATUS'	=> $user->lang['GROUP_IS_' . $group_status],
@@ -349,7 +363,7 @@ class ucp_groups
 
 					$template->assign_block_vars('nonmember', array(
 						'GROUP_ID'		=> $row['group_id'],
-						'GROUP_NAME'	=> ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'],
+						'GROUP_NAME'	=> $group_helper->get_name($row['group_name']),
 						'GROUP_DESC'	=> ($row['group_type'] <> GROUP_SPECIAL) ? generate_text_for_display($row['group_desc'], $row['group_desc_uid'], $row['group_desc_bitfield'], $row['group_desc_options']) : $user->lang['GROUP_IS_SPECIAL'],
 						'GROUP_SPECIAL'	=> ($row['group_type'] <> GROUP_SPECIAL) ? false : true,
 						'GROUP_CLOSED'	=> ($row['group_type'] <> GROUP_CLOSED || $auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel')) ? false : true,
@@ -379,8 +393,8 @@ class ucp_groups
 			case 'manage':
 
 				$this->page_title = 'UCP_USERGROUPS_MANAGE';
-				$action		= (isset($_POST['addusers'])) ? 'addusers' : request_var('action', '');
-				$group_id	= request_var('g', 0);
+				$action		= (isset($_POST['addusers'])) ? 'addusers' : $request->variable('action', '');
+				$group_id	= $request->variable('g', 0);
 
 				include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
 
@@ -414,7 +428,7 @@ class ucp_groups
 					$avatar = phpbb_get_group_avatar($group_row, 'GROUP_AVATAR', true);
 
 					$template->assign_vars(array(
-						'GROUP_NAME'			=> ($group_type == GROUP_SPECIAL) ? $user->lang['G_' . $group_name] : $group_name,
+						'GROUP_NAME'			=> $group_helper->get_name($group_name),
 						'GROUP_INTERNAL_NAME'	=> $group_name,
 						'GROUP_COLOUR'			=> (isset($group_row['group_colour'])) ? $group_row['group_colour'] : '',
 						'GROUP_DESC_DISP'		=> generate_text_for_display($group_row['group_desc'], $group_row['group_desc_uid'], $group_row['group_desc_bitfield'], $group_row['group_desc_options']),
@@ -447,11 +461,8 @@ class ucp_groups
 							trigger_error($user->lang['NOT_LEADER_OF_GROUP'] . $return_page);
 						}
 
-						$file_uploads = (@ini_get('file_uploads') || strtolower(@ini_get('file_uploads')) == 'on') ? true : false;
 						$user->add_lang(array('acp/groups', 'acp/common'));
 
-						$data = $submit_ary = array();
-
 						$update	= (isset($_POST['update'])) ? true : false;
 
 						$error = array();
@@ -499,20 +510,20 @@ class ucp_groups
 						// Did we submit?
 						if ($update)
 						{
-							$group_name	= utf8_normalize_nfc(request_var('group_name', '', true));
-							$group_desc = utf8_normalize_nfc(request_var('group_desc', '', true));
-							$group_type	= request_var('group_type', GROUP_FREE);
+							$group_name	= $request->variable('group_name', '', true);
+							$group_desc = $request->variable('group_desc', '', true);
+							$group_type	= $request->variable('group_type', GROUP_FREE);
 
-							$allow_desc_bbcode	= request_var('desc_parse_bbcode', false);
-							$allow_desc_urls	= request_var('desc_parse_urls', false);
-							$allow_desc_smilies	= request_var('desc_parse_smilies', false);
+							$allow_desc_bbcode	= $request->variable('desc_parse_bbcode', false);
+							$allow_desc_urls	= $request->variable('desc_parse_urls', false);
+							$allow_desc_smilies	= $request->variable('desc_parse_smilies', false);
 
 							$submit_ary = array(
-								'colour'		=> request_var('group_colour', ''),
-								'rank'			=> request_var('group_rank', 0),
+								'colour'		=> $request->variable('group_colour', ''),
+								'rank'			=> $request->variable('group_rank', 0),
 								'receive_pm'	=> isset($_REQUEST['group_receive_pm']) ? 1 : 0,
-								'message_limit'	=> request_var('group_message_limit', 0),
-								'max_recipients'=> request_var('group_max_recipients', 0),
+								'message_limit'	=> $request->variable('group_message_limit', 0),
+								'max_recipients'=> $request->variable('group_max_recipients', 0),
 								'legend'	=> $group_row['group_legend'],
 								'teampage'	=> $group_row['group_teampage'],
 							);
@@ -521,7 +532,6 @@ class ucp_groups
 							{
 								// Handle avatar
 								$driver_name = $phpbb_avatar_manager->clean_driver_name($request->variable('avatar_driver', ''));
-								$config_name = preg_replace('#^avatar\.driver.#', '', $driver_name);
 
 								if (in_array($driver_name, $avatar_drivers) && !$request->is_set_post('avatar_delete'))
 								{
@@ -610,7 +620,6 @@ class ucp_groups
 						}
 						else if (!$group_id)
 						{
-							$group_name = utf8_normalize_nfc(request_var('group_name', '', true));
 							$group_desc_data = array(
 								'text'			=> '',
 								'allow_bbcode'	=> true,
@@ -747,7 +756,7 @@ class ucp_groups
 						}
 
 						$user->add_lang(array('acp/groups', 'acp/common'));
-						$start = request_var('start', 0);
+						$start = $request->variable('start', 0);
 
 						// Grab the leaders - always, on every page...
 						$sql = 'SELECT u.user_id, u.username, u.username_clean, u.user_colour, u.user_regdate, u.user_posts, u.group_id, ug.group_leader, ug.user_pending
@@ -836,6 +845,7 @@ class ucp_groups
 							$s_action_options .= '<option value="' . $option . '">' . $user->lang['GROUP_' . $lang] . '</option>';
 						}
 
+						/* @var $pagination \phpbb\pagination */
 						$pagination = $phpbb_container->get('pagination');
 						$base_url = $this->u_action . "&amp;action=$action&amp;g=$group_id";
 						$start = $pagination->validate_start($start, $config['topics_per_page'], $total_members);
@@ -897,7 +907,7 @@ class ucp_groups
 							trigger_error($user->lang['NOT_LEADER_OF_GROUP'] . $return_page);
 						}
 
-						$group_row['group_name'] = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'];
+						$group_row['group_name'] = $group_helper->get_name($group_row['group_name']);
 
 						if (confirm_box(true))
 						{
@@ -976,7 +986,7 @@ class ucp_groups
 							trigger_error($user->lang['NOT_LEADER_OF_GROUP'] . $return_page);
 						}
 
-						$group_row['group_name'] = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'];
+						$group_row['group_name'] = $group_helper->get_name($group_row['group_name']);
 
 						if (confirm_box(true))
 						{
@@ -1014,7 +1024,7 @@ class ucp_groups
 
 						$user->add_lang(array('acp/groups', 'acp/common'));
 
-						$names = utf8_normalize_nfc(request_var('usernames', '', true));
+						$names = $request->variable('usernames', '', true);
 
 						if (!$group_id)
 						{
@@ -1038,9 +1048,9 @@ class ucp_groups
 						}
 
 						$name_ary = array_unique(explode("\n", $names));
-						$group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'];
+						$group_name = $group_helper->get_name($group_row['group_name']);
 
-						$default = request_var('default', 0);
+						$default = $request->variable('default', 0);
 
 						if (confirm_box(true))
 						{
@@ -1084,7 +1094,7 @@ class ucp_groups
 						while ($value = $db->sql_fetchrow($result))
 						{
 							$template->assign_block_vars('leader', array(
-								'GROUP_NAME'	=> ($value['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $value['group_name']] : $value['group_name'],
+								'GROUP_NAME'	=> $group_helper->get_name($value['group_name']),
 								'GROUP_DESC'	=> generate_text_for_display($value['group_desc'], $value['group_desc_uid'], $value['group_desc_bitfield'], $value['group_desc_options']),
 								'GROUP_TYPE'	=> $value['group_type'],
 								'GROUP_ID'		=> $value['group_id'],
--- a/includes/ucp/ucp_login_link.php
+++ b/includes/ucp/ucp_login_link.php
@@ -57,6 +57,7 @@ class ucp_login_link
 		}
 
 		// Use the auth_provider requested even if different from configured
+		/* @var $provider_collection \phpbb\auth\provider_collection */
 		$provider_collection = $phpbb_container->get('auth.provider_collection');
 		$auth_provider = $provider_collection->get_provider($request->variable('auth_provider', ''));
 
@@ -98,7 +99,7 @@ class ucp_login_link
 					else
 					{
 						// Finish login
-						$result = $user->session_create($login_result['user_row']['user_id'], false, false, true);
+						$user->session_create($login_result['user_row']['user_id'], false, false, true);
 
 						// Perform a redirect as the account has been linked
 						$this->perform_redirect();
@@ -181,7 +182,7 @@ class ucp_login_link
 	*/
 	protected function process_login_result($result)
 	{
-		global $config, $request, $template, $user, $phpbb_container;
+		global $config, $template, $user, $phpbb_container;
 
 		$login_error = null;
 
--- a/includes/ucp/ucp_main.php
+++ b/includes/ucp/ucp_main.php
@@ -227,9 +227,8 @@ class ucp_main
 				{
 					if (check_form_key('ucp_front_subscribed'))
 					{
-						$forums = array_keys(request_var('f', array(0 => 0)));
-						$topics = array_keys(request_var('t', array(0 => 0)));
-						$msg = '';
+						$forums = array_keys($request->variable('f', array(0 => 0)));
+						$topics = array_keys($request->variable('t', array(0 => 0)));
 
 						if (sizeof($forums) || sizeof($topics))
 						{
@@ -451,7 +450,7 @@ class ucp_main
 				if (isset($_POST['unbookmark']))
 				{
 					$s_hidden_fields = array('unbookmark' => 1);
-					$topics = (isset($_POST['t'])) ? array_keys(request_var('t', array(0 => 0))) : array();
+					$topics = (isset($_POST['t'])) ? array_keys($request->variable('t', array(0 => 0))) : array();
 					$url = $this->u_action;
 
 					if (!sizeof($topics))
@@ -507,7 +506,7 @@ class ucp_main
 				{
 					if (check_form_key('ucp_draft'))
 					{
-						$drafts = array_keys(request_var('d', array(0 => 0)));
+						$drafts = array_keys($request->variable('d', array(0 => 0)));
 
 						if (sizeof($drafts))
 						{
@@ -530,8 +529,8 @@ class ucp_main
 
 				if ($submit && $edit)
 				{
-					$draft_subject = utf8_normalize_nfc(request_var('subject', '', true));
-					$draft_message = utf8_normalize_nfc(request_var('message', '', true));
+					$draft_subject = $request->variable('subject', '', true);
+					$draft_message = $request->variable('message', '', true);
 					if (check_form_key('ucp_draft'))
 					{
 						if ($draft_message && $draft_subject)
@@ -695,9 +694,10 @@ class ucp_main
 	{
 		global $user, $db, $template, $config, $cache, $auth, $phpbb_root_path, $phpEx, $phpbb_container, $request, $phpbb_dispatcher;
 
-		$table = ($mode == 'subscribed') ? TOPICS_WATCH_TABLE : BOOKMARKS_TABLE;
-		$start = request_var('start', 0);
+		/* @var $pagination \phpbb\pagination */
 		$pagination = $phpbb_container->get('pagination');
+		$table = ($mode == 'subscribed') ? TOPICS_WATCH_TABLE : BOOKMARKS_TABLE;
+		$start = $request->variable('start', 0);
 
 		// Grab icons
 		$icons = $cache->obtain_icons();
@@ -852,6 +852,7 @@ class ucp_main
 			}
 		}
 
+		/* @var $phpbb_content_visibility \phpbb\content_visibility */
 		$phpbb_content_visibility = $phpbb_container->get('content.visibility');
 
 		foreach ($topic_list as $topic_id)
--- a/includes/ucp/ucp_notifications.php
+++ b/includes/ucp/ucp_notifications.php
@@ -34,7 +34,10 @@ class ucp_notifications
 		$form_time = $request->variable('form_time', 0);
 		$form_time = ($form_time <= 0 || $form_time > time()) ? time() : $form_time;
 
+		/* @var $phpbb_notifications \phpbb\notification\manager */
 		$phpbb_notifications = $phpbb_container->get('notification_manager');
+
+		/* @var $pagination \phpbb\pagination */
 		$pagination = $phpbb_container->get('pagination');
 
 		switch ($mode)
@@ -67,15 +70,6 @@ class ucp_notifications
 									$phpbb_notifications->delete_subscription($type, 0, $method_data['id']);
 								}
 							}
-
-							if ($request->is_set_post(str_replace('.', '_', $type) . '_notification') && !isset($subscriptions[$type]))
-							{
-								$phpbb_notifications->add_subscription($type);
-							}
-							else if (!$request->is_set_post(str_replace('.', '_', $type) . '_notification') && isset($subscriptions[$type]))
-							{
-								$phpbb_notifications->delete_subscription($type);
-							}
 						}
 					}
 
@@ -97,7 +91,7 @@ class ucp_notifications
 				// Mark all items read
 				if ($request->variable('mark', '') == 'all' && check_link_hash($request->variable('token', ''), 'mark_all_notifications_read'))
 				{
-					$phpbb_notifications->mark_notifications_read(false, false, $user->data['user_id'], $form_time);
+					$phpbb_notifications->mark_notifications(false, false, $user->data['user_id'], $form_time);
 
 					meta_refresh(3, $this->u_action);
 					$message = $user->lang['NOTIFICATIONS_MARK_ALL_READ_SUCCESS'];
@@ -128,11 +122,11 @@ class ucp_notifications
 
 					if (!empty($mark_read))
 					{
-						$phpbb_notifications->mark_notifications_read_by_id($mark_read, $form_time);
+						$phpbb_notifications->mark_notifications_by_id('notification.method.board', $mark_read, $form_time);
 					}
 				}
 
-				$notifications = $phpbb_notifications->load_notifications(array(
+				$notifications = $phpbb_notifications->load_notifications('notification.method.board', array(
 					'start'			=> $start,
 					'limit'			=> $config['topics_per_page'],
 					'count_total'	=> true,
@@ -193,8 +187,6 @@ class ucp_notifications
 
 					'NAME'				=> $user->lang($data['lang']),
 					'EXPLAIN'			=> (isset($user->lang[$data['lang'] . '_EXPLAIN'])) ? $user->lang($data['lang'] . '_EXPLAIN') : '',
-
-					'SUBSCRIBED'		=> (isset($subscriptions[$type])) ? true : false,
 				));
 
 				foreach ($notification_methods as $method => $method_data)
--- a/includes/ucp/ucp_pm.php
+++ b/includes/ucp/ucp_pm.php
@@ -62,7 +62,7 @@ class ucp_pm
 		$template->assign_var('S_PRIVMSGS', true);
 
 		// Folder directly specified?
-		$folder_specified = request_var('folder', '');
+		$folder_specified = $request->variable('folder', '');
 
 		if (!in_array($folder_specified, array('inbox', 'outbox', 'sentbox')))
 		{
@@ -75,7 +75,7 @@ class ucp_pm
 
 		if (!$folder_specified)
 		{
-			$mode = (!$mode) ? request_var('mode', 'view') : $mode;
+			$mode = (!$mode) ? $request->variable('mode', 'view') : $mode;
 		}
 		else
 		{
@@ -88,7 +88,7 @@ class ucp_pm
 		{
 			// Compose message
 			case 'compose':
-				$action = request_var('action', 'post');
+				$action = $request->variable('action', 'post');
 
 				$user_folders = get_folder($user->data['user_id']);
 
@@ -151,12 +151,12 @@ class ucp_pm
 				}
 				else
 				{
-					$folder_id = request_var('f', PRIVMSGS_NO_BOX);
-					$action = request_var('action', 'view_folder');
+					$folder_id = $request->variable('f', PRIVMSGS_NO_BOX);
+					$action = $request->variable('action', 'view_folder');
 				}
 
-				$msg_id = request_var('p', 0);
-				$view	= request_var('view', '');
+				$msg_id = $request->variable('p', 0);
+				$view	= $request->variable('view', '');
 
 				// View message if specified
 				if ($msg_id)
@@ -166,6 +166,7 @@ class ucp_pm
 
 				if (!$auth->acl_get('u_readpm'))
 				{
+					send_status_line(403, 'Forbidden');
 					trigger_error('NO_AUTH_READ_MESSAGE');
 				}
 
@@ -178,8 +179,8 @@ class ucp_pm
 				// First Handle Mark actions and moving messages
 				$submit_mark	= (isset($_POST['submit_mark'])) ? true : false;
 				$move_pm		= (isset($_POST['move_pm'])) ? true : false;
-				$mark_option	= request_var('mark_option', '');
-				$dest_folder	= request_var('dest_folder', PRIVMSGS_NO_BOX);
+				$mark_option	= $request->variable('mark_option', '');
+				$dest_folder	= $request->variable('dest_folder', PRIVMSGS_NO_BOX);
 
 				// Is moving PM triggered through mark options?
 				if (!in_array($mark_option, array('mark_important', 'delete_marked')) && $submit_mark)
@@ -192,8 +193,8 @@ class ucp_pm
 				// Move PM
 				if ($move_pm)
 				{
-					$move_msg_ids	= (isset($_POST['marked_msg_id'])) ? request_var('marked_msg_id', array(0)) : array();
-					$cur_folder_id	= request_var('cur_folder_id', PRIVMSGS_NO_BOX);
+					$move_msg_ids	= (isset($_POST['marked_msg_id'])) ? $request->variable('marked_msg_id', array(0)) : array();
+					$cur_folder_id	= $request->variable('cur_folder_id', PRIVMSGS_NO_BOX);
 
 					if (move_pm($user->data['user_id'], $user->data['message_limit'], $move_msg_ids, $dest_folder, $cur_folder_id))
 					{
@@ -201,7 +202,7 @@ class ucp_pm
 						if ($action == 'view_message')
 						{
 							$msg_id		= 0;
-							$folder_id	= request_var('cur_folder_id', PRIVMSGS_NO_BOX);
+							$folder_id	= $request->variable('cur_folder_id', PRIVMSGS_NO_BOX);
 							$action		= 'view_folder';
 						}
 					}
@@ -215,7 +216,7 @@ class ucp_pm
 
 				// If new messages arrived, place them into the appropriate folder
 				$num_not_moved = $num_removed = 0;
-				$release = request_var('release', 0);
+				$release = $request->variable('release', 0);
 
 				if ($user->data['user_new_privmsg'] && ($action == 'view_folder' || $action == 'view_message'))
 				{
--- a/includes/ucp/ucp_pm_compose.php
+++ b/includes/ucp/ucp_pm_compose.php
@@ -44,14 +44,14 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 	add_form_key('ucp_pm_compose');
 
 	// Grab only parameters needed here
-	$to_user_id		= request_var('u', 0);
-	$to_group_id	= request_var('g', 0);
-	$msg_id			= request_var('p', 0);
-	$draft_id		= request_var('d', 0);
-	$lastclick		= request_var('lastclick', 0);
+	$to_user_id		= $request->variable('u', 0);
+	$to_group_id	= $request->variable('g', 0);
+	$msg_id			= $request->variable('p', 0);
+	$draft_id		= $request->variable('d', 0);
+	$lastclick		= $request->variable('lastclick', 0);
 
 	// Reply to all triggered (quote/reply)
-	$reply_to_all	= request_var('reply_to_all', 0);
+	$reply_to_all	= $request->variable('reply_to_all', 0);
 
 	$address_list	= $request->variable('address_list', array('' => array(0 => '')));
 
@@ -76,6 +76,9 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 	$error = array();
 	$current_time = time();
 
+	/** @var \phpbb\group\helper $group_helper */
+	$group_helper = $phpbb_container->get('group_helper');
+
 	// Was cancel pressed? If so then redirect to the appropriate page
 	if ($cancel || ($current_time - $lastclick < 2 && $submit))
 	{
@@ -145,7 +148,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 			$group_options = '';
 			while ($row = $db->sql_fetchrow($result))
 			{
-				$group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '">' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</option>';
+				$group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '">' . $group_helper->get_name($row['group_name']) . '</option>';
 			}
 			$db->sql_freeresult($result);
 		}
@@ -168,6 +171,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 		case 'post':
 			if (!$auth->acl_get('u_sendpm'))
 			{
+				send_status_line(403, 'Forbidden');
 				trigger_error('NO_AUTH_SEND_MESSAGE');
 			}
 		break;
@@ -183,6 +187,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 
 			if (!$auth->acl_get('u_sendpm'))
 			{
+				send_status_line(403, 'Forbidden');
 				trigger_error('NO_AUTH_SEND_MESSAGE');
 			}
 
@@ -223,6 +228,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 		case 'delete':
 			if (!$auth->acl_get('u_pm_delete'))
 			{
+				send_status_line(403, 'Forbidden');
 				trigger_error('NO_AUTH_DELETE_MESSAGE');
 			}
 
@@ -248,11 +254,13 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 
 	if ($action == 'forward' && (!$config['forward_pm'] || !$auth->acl_get('u_pm_forward')))
 	{
+		send_status_line(403, 'Forbidden');
 		trigger_error('NO_AUTH_FORWARD_MESSAGE');
 	}
 
 	if ($action == 'edit' && !$auth->acl_get('u_pm_edit'))
 	{
+		send_status_line(403, 'Forbidden');
 		trigger_error('NO_AUTH_EDIT_MESSAGE');
 	}
 
@@ -263,8 +271,6 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 		*
 		* @event core.ucp_pm_compose_compose_pm_basic_info_query_before
 		* @var	string	sql						String with the query to be executed
-		* @var	array	forum_list				List of forums that contain the posts
-		* @var	int		visibility_const		Integer with one of the possible ITEM_* constant values
 		* @var	int		msg_id					topic_id in the page request
 		* @var	int		to_user_id				The id of whom the message is to
 		* @var	int		to_group_id				The id of the group whom the message is to
@@ -273,14 +279,11 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 		* @var	string	action					One of: post, reply, quote, forward, quotepost, edit, delete, smilies
 		* @var	bool	delete					Whether the user is deleting the PM
 		* @var	int		reply_to_all			Value of reply_to_all request variable.
-		* @var	string	limit_time_sql			String with the SQL code to limit the time interval of the post (Note: May be empty string)
-		* @var	string	sort_order_sql			String with the ORDER BY SQL code used in this query
 		* @since 3.1.0-RC5
+		* @change 3.2.0-a1 Removed undefined variables
 		*/
 		$vars = array(
 			'sql',
-			'forum_list',
-			'visibility_const',
 			'msg_id',
 			'to_user_id',
 			'to_group_id',
@@ -289,8 +292,6 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 			'action',
 			'delete',
 			'reply_to_all',
-			'limit_time_sql',
-			'sort_order_sql',
 		);
 		extract($phpbb_dispatcher->trigger_event('core.ucp_pm_compose_compose_pm_basic_info_query_before', compact($vars)));
 
@@ -325,6 +326,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 		{
 			if (($post['forum_id'] && !$auth->acl_get('f_read', $post['forum_id'])) || (!$post['forum_id'] && !$auth->acl_getf_global('f_read')))
 			{
+				send_status_line(403, 'Forbidden');
 				trigger_error('NOT_AUTHORISED');
 			}
 
@@ -335,8 +337,6 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 			* @var	string	sql					The original SQL used in the query
 			* @var	array	post				Associative array with the data of the quoted post
 			* @var	array	msg_id				The post_id that was searched to get the message for quoting
-			* @var	int		visibility_const	Visibility of the quoted post (one of the possible ITEM_* constant values)
-			* @var	int		topic_id			Topic ID of the quoted post
 			* @var	int		to_user_id			Users the message is sent to
 			* @var	int		to_group_id			Groups the message is sent to
 			* @var	bool	submit				Whether the user is sending the PM or not
@@ -345,13 +345,12 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 			* @var	bool	delete				If deleting message
 			* @var	int		reply_to_all		Value of reply_to_all request variable.
 			* @since 3.1.0-RC5
+			* @change 3.2.0-a1 Removed undefined variables
 			*/
 			$vars = array(
 				'sql',
 				'post',
 				'msg_id',
-				'visibility_const',
-				'topic_id',
 				'to_user_id',
 				'to_group_id',
 				'submit',
@@ -463,6 +462,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 
 	if (($to_group_id || isset($address_list['g'])) && (!$config['allow_mass_pm'] || !$auth->acl_get('u_masspm_group')))
 	{
+		send_status_line(403, 'Forbidden');
 		trigger_error('NO_AUTH_GROUP_MESSAGE');
 	}
 
@@ -484,8 +484,9 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 		$icon_id = 0;
 	}
 
-	$message_parser = new parse_message();
+	/* @var $plupload \phpbb\plupload\plupload */
 	$plupload = $phpbb_container->get('plupload');
+	$message_parser = new parse_message();
 	$message_parser->set_plupload($plupload);
 
 	$message_parser->message = ($action == 'reply') ? '' : $message_text;
@@ -498,7 +499,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 	if ($action == 'delete')
 	{
 		// Folder id has been determined by the SQL Statement
-		// $folder_id = request_var('f', PRIVMSGS_NO_BOX);
+		// $folder_id = $request->variable('f', PRIVMSGS_NO_BOX);
 
 		// Do we need to confirm ?
 		if (confirm_box(true))
@@ -529,15 +530,9 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 	}
 
 	// Get maximum number of allowed recipients
-	$sql = 'SELECT MAX(g.group_max_recipients) as max_recipients
-		FROM ' . GROUPS_TABLE . ' g, ' . USER_GROUP_TABLE . ' ug
-		WHERE ug.user_id = ' . $user->data['user_id'] . '
-			AND ug.user_pending = 0
-			AND ug.group_id = g.group_id';
-	$result = $db->sql_query($sql);
-	$max_recipients = (int) $db->sql_fetchfield('max_recipients');
-	$db->sql_freeresult($result);
+	$max_recipients = phpbb_get_max_setting_from_group($db, $user->data['user_id'], 'max_recipients');
 
+	// If it is 0, there is no limit set and we use the maximum value within the config.
 	$max_recipients = (!$max_recipients) ? $config['pm_max_recipients'] : $max_recipients;
 
 	// If this is a quote/reply "to all"... we may increase the max_recpients to the number of original recipients
@@ -610,7 +605,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 		$enable_urls	= true;
 	}
 
-	$enable_magic_url = $drafts = false;
+	$drafts = false;
 
 	// User own some drafts?
 	if ($auth->acl_get('u_savedrafts') && $action != 'delete')
@@ -645,9 +640,9 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 	// Save Draft
 	if ($save && $auth->acl_get('u_savedrafts'))
 	{
-		$subject = utf8_normalize_nfc(request_var('subject', '', true));
+		$subject = $request->variable('subject', '', true);
 		$subject = (!$subject && $action != 'post') ? $user->lang['NEW_MESSAGE'] : $subject;
-		$message = utf8_normalize_nfc(request_var('message', '', true));
+		$message = $request->variable('message', '', true);
 
 		if ($subject && $message)
 		{
@@ -741,10 +736,10 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 		{
 			$error[] = $user->lang['FORM_INVALID'];
 		}
-		$subject = utf8_normalize_nfc(request_var('subject', '', true));
-		$message_parser->message = utf8_normalize_nfc(request_var('message', '', true));
+		$subject = $request->variable('subject', '', true);
+		$message_parser->message = $request->variable('message', '', true);
 
-		$icon_id			= request_var('icon', 0);
+		$icon_id			= $request->variable('icon', 0);
 
 		$enable_bbcode 		= (!$bbcode_status || isset($_POST['disable_bbcode'])) ? false : true;
 		$enable_smilies		= (!$smilies_status || isset($_POST['disable_smilies'])) ? false : true;
@@ -779,16 +774,6 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 		);
 		extract($phpbb_dispatcher->trigger_event('core.ucp_pm_compose_modify_parse_before', compact($vars)));
 
-		if ($submit)
-		{
-			$status_switch	= (($enable_bbcode+1) << 8) + (($enable_smilies+1) << 4) + (($enable_urls+1) << 2) + (($enable_sig+1) << 1);
-			$status_switch = ($status_switch != $check_value);
-		}
-		else
-		{
-			$status_switch = 1;
-		}
-
 		// Parse Attachments - before checksum is calculated
 		$message_parser->parse_attachments('fileupload', $action, 0, $submit, $preview, $refresh, true);
 
@@ -904,13 +889,8 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 		// Signature
 		if ($enable_sig && $config['allow_sig'] && $preview_signature)
 		{
-			$parse_sig = new parse_message($preview_signature);
-			$parse_sig->bbcode_uid = $preview_signature_uid;
-			$parse_sig->bbcode_bitfield = $preview_signature_bitfield;
-
-			$parse_sig->format_display($config['allow_sig_bbcode'], $config['allow_sig_links'], $config['allow_sig_smilies']);
-			$preview_signature = $parse_sig->message;
-			unset($parse_sig);
+			$bbcode_flags = ($enable_bbcode ? OPTION_FLAG_BBCODE : 0) + ($enable_smilies ? OPTION_FLAG_SMILIES : 0) + ($enable_urls ? OPTION_FLAG_LINKS : 0);
+			$preview_signature = generate_text_for_display($preview_signature, $preview_signature_uid, $preview_signature_bitfield, $bbcode_flags);
 		}
 		else
 		{
@@ -960,7 +940,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 	{
 		if ($action == 'quotepost')
 		{
-			$post_id = request_var('p', 0);
+			$post_id = $request->variable('p', 0);
 			if ($config['allow_post_links'])
 			{
 				$message_link = "[url=" . generate_board_url() . "/viewtopic.$phpEx?p={$post_id}#p{$post_id}]{$user->lang['SUBJECT']}{$user->lang['COLON']} {$message_subject}[/url]\n\n";
@@ -974,7 +954,20 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 		{
 			$message_link = '';
 		}
-		$message_parser->message = $message_link . '[quote=&quot;' . $quote_username . '&quot;]' . censor_text(trim($message_parser->message)) . "[/quote]\n";
+		$quote_attributes = array(
+			'author'  => $quote_username,
+			'time'    => $post['message_time'],
+			'user_id' => $post['author_id'],
+		);
+		if ($action === 'quotepost')
+		{
+			$quote_attributes['post_id'] = $post['msg_id'];
+		}
+		$quote_text = $phpbb_container->get('text_formatter.utils')->generate_quote(
+			censor_text($message_parser->message),
+			$quote_attributes
+		);
+		$message_parser->message = $message_link . $quote_text . "\n\n";
 	}
 
 	if (($action == 'reply' || $action == 'quote' || $action == 'quotepost') && !$preview && !$refresh)
@@ -1002,7 +995,11 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 		$forward_text[] = sprintf($user->lang['FWD_FROM'], $quote_username_text);
 		$forward_text[] = sprintf($user->lang['FWD_TO'], implode($user->lang['COMMA_SEPARATOR'], $fwd_to_field['to']));
 
-		$message_parser->message = implode("\n", $forward_text) . "\n\n[quote=&quot;{$quote_username}&quot;]\n" . censor_text(trim($message_parser->message)) . "\n[/quote]";
+		$quote_text = $phpbb_container->get('text_formatter.utils')->generate_quote(
+			censor_text($message_parser->message),
+			array('author' => $quote_username)
+		);
+		$message_parser->message = implode("\n", $forward_text) . "\n\n" . $quote_text;
 		$message_subject = ((!preg_match('/^Fwd:/', $message_subject)) ? 'Fwd: ' : '') . censor_text($message_subject);
 	}
 
@@ -1075,7 +1072,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 				{
 					if ($type == 'g')
 					{
-						$row['name'] = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['name']] : $row['name'];
+						$row['name'] = $group_helper->get_name($row['name']);
 					}
 
 					${$type}[$row['id']] = array('name' => $row['name'], 'colour' => $row['colour']);
@@ -1085,7 +1082,6 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 		}
 
 		// Now Build the address list
-		$plain_address_field = '';
 		foreach ($address_list as $type => $adr_ary)
 		{
 			foreach ($adr_ary as $id => $field)
@@ -1173,6 +1169,9 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 
 	$form_enctype = (@ini_get('file_uploads') == '0' || strtolower(@ini_get('file_uploads')) == 'off' || !$config['allow_pm_attach'] || !$auth->acl_get('u_pm_attach')) ? '' : ' enctype="multipart/form-data"';
 
+	/** @var \phpbb\controller\helper $controller_helper */
+	$controller_helper = $phpbb_container->get('controller.helper');
+
 	// Start assigning vars for main posting page ...
 	$template->assign_vars(array(
 		'L_POST_A'					=> $page_title,
@@ -1181,7 +1180,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
 
 		'SUBJECT'				=> (isset($message_subject)) ? $message_subject : '',
 		'MESSAGE'				=> $message_text,
-		'BBCODE_STATUS'			=> ($bbcode_status) ? sprintf($user->lang['BBCODE_IS_ON'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>') : sprintf($user->lang['BBCODE_IS_OFF'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>'),
+		'BBCODE_STATUS'			=> $user->lang(($bbcode_status ? 'BBCODE_IS_ON' : 'BBCODE_IS_OFF'), '<a href="' . $controller_helper->route('phpbb_help_bbcode_controller') . '">', '</a>'),
 		'IMG_STATUS'			=> ($img_status) ? $user->lang['IMAGES_ARE_ON'] : $user->lang['IMAGES_ARE_OFF'],
 		'FLASH_STATUS'			=> ($flash_status) ? $user->lang['FLASH_IS_ON'] : $user->lang['FLASH_IS_OFF'],
 		'SMILIES_STATUS'		=> ($smilies_status) ? $user->lang['SMILIES_ARE_ON'] : $user->lang['SMILIES_ARE_OFF'],
@@ -1277,13 +1276,13 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove
 	}
 
 	// Add Selected Groups
-	$group_list = request_var('group_list', array(0));
+	$group_list = $request->variable('group_list', array(0));
 
 	// Build usernames to add
-	$usernames = request_var('username', '', true);
+	$usernames = $request->variable('username', '', true);
 	$usernames = (empty($usernames)) ? array() : array($usernames);
 
-	$username_list = request_var('username_list', '', true);
+	$username_list = $request->variable('username_list', '', true);
 	if ($username_list)
 	{
 		$usernames = array_merge($usernames, explode("\n", $username_list));
@@ -1300,7 +1299,7 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove
 		$submit = false;
 
 		// Preview is only true if there was also a message entered
-		if (request_var('message', ''))
+		if ($request->variable('message', ''))
 		{
 			$preview = true;
 		}
@@ -1432,7 +1431,7 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove
 }
 
 /**
-* Build the hidden field for the recipients. Needed, as the variable is not read via request_var.
+* Build the hidden field for the recipients. Needed, as the variable is not read via $request->variable().
 */
 function build_address_field($address_list)
 {
--- a/includes/ucp/ucp_pm_options.php
+++ b/includes/ucp/ucp_pm_options.php
@@ -24,7 +24,7 @@ if (!defined('IN_PHPBB'))
 */
 function message_options($id, $mode, $global_privmsgs_rules, $global_rule_conditions)
 {
-	global $phpbb_root_path, $phpEx, $user, $template, $auth, $config, $db;
+	global $phpbb_root_path, $phpEx, $user, $template, $config, $db, $request;
 
 	$redirect_url = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=pm&amp;mode=options");
 
@@ -37,7 +37,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit
 			trigger_error('FORM_INVALID');
 		}
 
-		$full_action = request_var('full_action', 0);
+		$full_action = $request->variable('full_action', 0);
 
 		$set_folder_id = 0;
 		switch ($full_action)
@@ -47,7 +47,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit
 			break;
 
 			case 2:
-				$set_folder_id = request_var('full_move_to', PRIVMSGS_INBOX);
+				$set_folder_id = $request->variable('full_move_to', PRIVMSGS_INBOX);
 			break;
 
 			case 3:
@@ -79,8 +79,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit
 	{
 		if (check_form_key('ucp_pm_options'))
 		{
-			$folder_name = utf8_normalize_nfc(request_var('foldername', '', true));
-			$msg = '';
+			$folder_name = $request->variable('foldername', '', true);
 
 			if ($folder_name)
 			{
@@ -135,8 +134,8 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit
 	{
 		if (check_form_key('ucp_pm_options'))
 		{
-			$new_folder_name = utf8_normalize_nfc(request_var('new_folder_name', '', true));
-			$rename_folder_id= request_var('rename_folder_id', 0);
+			$new_folder_name = $request->variable('new_folder_name', '', true);
+			$rename_folder_id= $request->variable('rename_folder_id', 0);
 
 			if (!$new_folder_name)
 			{
@@ -178,11 +177,11 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit
 	// Remove Folder
 	if (isset($_POST['remove_folder']))
 	{
-		$remove_folder_id = request_var('remove_folder_id', 0);
+		$remove_folder_id = $request->variable('remove_folder_id', 0);
 
 		// Default to "move all messages to inbox"
-		$remove_action = request_var('remove_action', 1);
-		$move_to = request_var('move_to', PRIVMSGS_INBOX);
+		$remove_action = $request->variable('remove_action', 1);
+		$move_to = $request->variable('move_to', PRIVMSGS_INBOX);
 
 		// Move to same folder?
 		if ($remove_action == 1 && $remove_folder_id == $move_to)
@@ -291,13 +290,13 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit
 	{
 		if (check_form_key('ucp_pm_options'))
 		{
-			$check_option	= request_var('check_option', 0);
-			$rule_option	= request_var('rule_option', 0);
-			$cond_option	= request_var('cond_option', '');
-			$action_option	= explode('|', request_var('action_option', ''));
-			$rule_string	= ($cond_option != 'none') ? utf8_normalize_nfc(request_var('rule_string', '', true)) : '';
-			$rule_user_id	= ($cond_option != 'none') ? request_var('rule_user_id', 0) : 0;
-			$rule_group_id	= ($cond_option != 'none') ? request_var('rule_group_id', 0) : 0;
+			$check_option	= $request->variable('check_option', 0);
+			$rule_option	= $request->variable('rule_option', 0);
+			$cond_option	= $request->variable('cond_option', '');
+			$action_option	= explode('|', $request->variable('action_option', ''));
+			$rule_string	= ($cond_option != 'none') ? $request->variable('rule_string', '', true) : '';
+			$rule_user_id	= ($cond_option != 'none') ? $request->variable('rule_user_id', 0) : 0;
+			$rule_group_id	= ($cond_option != 'none') ? $request->variable('rule_group_id', 0) : 0;
 
 			$action = (int) $action_option[0];
 			$folder_id = (int) $action_option[1];
@@ -371,7 +370,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit
 	// Remove Rule
 	if (isset($_POST['delete_rule']) && !isset($_POST['cancel']))
 	{
-		$delete_id = array_keys(request_var('delete_rule', array(0 => 0)));
+		$delete_id = array_keys($request->variable('delete_rule', array(0 => 0)));
 		$delete_id = (!empty($delete_id[0])) ? $delete_id[0] : 0;
 
 		if (!$delete_id)
@@ -507,18 +506,20 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit
 	$rule_lang = $action_lang = $check_lang = array();
 
 	// Build all three language arrays
-	preg_replace('#^((RULE|ACTION|CHECK)_([A-Z0-9_]+))$#e', "\${strtolower('\\2') . '_lang'}[constant('\\1')] = \$user->lang['PM_\\2']['\\3']", array_keys(get_defined_constants()));
+	preg_replace_callback('#^((RULE|ACTION|CHECK)_([A-Z0-9_]+))$#', function ($match) use(&$rule_lang, &$action_lang, &$check_lang, $user) {
+		${strtolower($match[2]) . '_lang'}[constant($match[1])] = $user->lang['PM_' . $match[2]][$match[3]];
+	}, array_keys(get_defined_constants()));
 
 	/*
 		Rule Ordering:
 			-> CHECK_* -> RULE_* [IN $global_privmsgs_rules:CHECK_*] -> [IF $rule_conditions[RULE_*] [|text|bool|user|group|own_group]] -> ACTION_*
 	*/
 
-	$check_option	= request_var('check_option', 0);
-	$rule_option	= request_var('rule_option', 0);
-	$cond_option	= request_var('cond_option', '');
-	$action_option	= request_var('action_option', '');
-	$back = (isset($_REQUEST['back'])) ? request_var('back', array('' => 0)) : array();
+	$check_option	= $request->variable('check_option', 0);
+	$rule_option	= $request->variable('rule_option', 0);
+	$cond_option	= $request->variable('cond_option', '');
+	$action_option	= $request->variable('action_option', '');
+	$back = (isset($_REQUEST['back'])) ? $request->variable('back', array('' => 0)) : array();
 
 	if (sizeof($back))
 	{
@@ -609,7 +610,7 @@ function define_check_option($hardcoded, $check_option, $check_lang)
 */
 function define_action_option($hardcoded, $action_option, $action_lang, $folder)
 {
-	global $db, $template, $user;
+	global $template;
 
 	$l_action = $s_action_options = '';
 	if ($hardcoded)
@@ -698,7 +699,10 @@ function define_rule_option($hardcoded, $rule_option, $rule_lang, $check_ary)
 */
 function define_cond_option($hardcoded, $cond_option, $rule_option, $global_rule_conditions)
 {
-	global $db, $template, $auth, $user;
+	global $db, $template, $auth, $user, $request, $phpbb_container;
+
+	/** @var \phpbb\group\helper $group_helper */
+	$group_helper = $phpbb_container->get('group_helper');
 
 	$template->assign_vars(array(
 		'S_COND_DEFINED'	=> true,
@@ -717,12 +721,11 @@ function define_cond_option($hardcoded, $cond_option, $rule_option, $global_rule
 
 	// Define Condition
 	$condition = $global_rule_conditions[$rule_option];
-	$current_value = '';
 
 	switch ($condition)
 	{
 		case 'text':
-			$rule_string = utf8_normalize_nfc(request_var('rule_string', '', true));
+			$rule_string = $request->variable('rule_string', '', true);
 
 			$template->assign_vars(array(
 				'S_TEXT_CONDITION'	=> true,
@@ -735,8 +738,8 @@ function define_cond_option($hardcoded, $cond_option, $rule_option, $global_rule
 		break;
 
 		case 'user':
-			$rule_user_id = request_var('rule_user_id', 0);
-			$rule_string = utf8_normalize_nfc(request_var('rule_string', '', true));
+			$rule_user_id = $request->variable('rule_user_id', 0);
+			$rule_string = $request->variable('rule_string', '', true);
 
 			if ($rule_string && !$rule_user_id)
 			{
@@ -778,8 +781,8 @@ function define_cond_option($hardcoded, $cond_option, $rule_option, $global_rule
 		break;
 
 		case 'group':
-			$rule_group_id = request_var('rule_group_id', 0);
-			$rule_string = utf8_normalize_nfc(request_var('rule_string', '', true));
+			$rule_group_id = $request->variable('rule_group_id', 0);
+			$rule_string = $request->variable('rule_string', '', true);
 
 			$sql = 'SELECT g.group_id, g.group_name, g.group_type
 					FROM ' . GROUPS_TABLE . ' g ';
@@ -810,13 +813,13 @@ function define_cond_option($hardcoded, $cond_option, $rule_option, $global_rule
 			{
 				if ($rule_group_id && ($row['group_id'] == $rule_group_id))
 				{
-					$rule_string = (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']);
+					$rule_string = $group_helper->get_name($row['group_name']);
 				}
 
 				$s_class	= ($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '';
 				$s_selected	= ($row['group_id'] == $rule_group_id) ? ' selected="selected"' : '';
 
-				$s_group_options .= '<option value="' . $row['group_id'] . '"' . $s_class . $s_selected . '>' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</option>';
+				$s_group_options .= '<option value="' . $row['group_id'] . '"' . $s_class . $s_selected . '>' . $group_helper->get_name($row['group_name']) . '</option>';
 			}
 			$db->sql_freeresult($result);
 
--- a/includes/ucp/ucp_pm_viewfolder.php
+++ b/includes/ucp/ucp_pm_viewfolder.php
@@ -25,7 +25,7 @@ if (!defined('IN_PHPBB'))
 */
 function view_folder($id, $mode, $folder_id, $folder)
 {
-	global $user, $template, $auth, $db, $cache;
+	global $user, $template, $auth, $db, $cache, $request;
 	global $phpbb_root_path, $config, $phpEx;
 
 	$submit_export = (isset($_POST['submit_export'])) ? true : false;
@@ -41,9 +41,6 @@ function view_folder($id, $mode, $folder_id, $folder)
 
 		$color_rows = array('marked', 'replied');
 
-		// only show the friend/foe color rows if the module is enabled
-		$zebra_enabled = false;
-
 		$_module = new p_master();
 		$_module->list_modules('ucp');
 		$_module->set_active('zebra');
@@ -196,9 +193,9 @@ function view_folder($id, $mode, $folder_id, $folder)
 	}
 	else
 	{
-		$export_type = request_var('export_option', '');
-		$enclosure = request_var('enclosure', '');
-		$delimiter = request_var('delimiter', '');
+		$export_type = $request->variable('export_option', '');
+		$enclosure = $request->variable('enclosure', '');
+		$delimiter = $request->variable('delimiter', '');
 
 		if ($export_type == 'CSV' && ($delimiter === '' || $enclosure === ''))
 		{
@@ -397,15 +394,16 @@ function view_folder($id, $mode, $folder_id, $folder)
 */
 function get_pm_from($folder_id, $folder, $user_id)
 {
-	global $user, $db, $template, $config, $auth, $phpbb_container, $phpbb_root_path, $phpEx;
+	global $user, $db, $template, $config, $auth, $phpbb_container, $phpbb_root_path, $phpEx, $request, $phpbb_dispatcher;
 
-	$start = request_var('start', 0);
+	$start = $request->variable('start', 0);
 
 	// Additional vars later, pm ordering is mostly different from post ordering. :/
-	$sort_days	= request_var('st', 0);
-	$sort_key	= request_var('sk', 't');
-	$sort_dir	= request_var('sd', 'd');
+	$sort_days	= $request->variable('st', 0);
+	$sort_key	= $request->variable('sk', 't');
+	$sort_dir	= $request->variable('sd', 'd');
 
+	/* @var $pagination \phpbb\pagination */
 	$pagination = $phpbb_container->get('pagination');
 
 	// PM ordering options
@@ -461,7 +459,7 @@ function get_pm_from($folder_id, $folder, $user_id)
 	$start = $pagination->validate_start($start, $config['topics_per_page'], $pm_count);
 	$pagination->generate_template_pagination($base_url, 'pagination', 'start', $pm_count, $config['topics_per_page'], $start);
 
-	$template->assign_vars(array(
+	$template_vars = array(
 		'TOTAL_MESSAGES'	=> $user->lang('VIEW_PM_MESSAGES', (int) $pm_count),
 
 		'POST_IMG'		=> (!$auth->acl_get('u_sendpm')) ? $user->img('button_topic_locked', 'POST_PM_LOCKED') : $user->img('button_pm_new', 'POST_NEW_PM'),
@@ -475,7 +473,33 @@ function get_pm_from($folder_id, $folder, $user_id)
 
 		'U_POST_NEW_TOPIC'	=> ($auth->acl_get('u_sendpm')) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=compose') : '',
 		'S_PM_ACTION'		=> append_sid("{$phpbb_root_path}ucp.$phpEx", "i=pm&amp;mode=view&amp;action=view_folder&amp;f=$folder_id" . (($start !== 0) ? "&amp;start=$start" : '')),
-	));
+	);
+
+	/**
+	* Modify template variables before they are assigned
+	*
+	* @event core.ucp_pm_view_folder_get_pm_from_template
+	* @var	int		folder_id		Folder ID
+	* @var	array	folder			Folder data
+	* @var	int		user_id			User ID
+	* @var	string	base_url		Pagination base URL
+	* @var	int		start			Pagination start
+	* @var	int		pm_count		Count of PMs
+	* @var	array	template_vars	Template variables to be assigned
+	* @since 3.1.11-RC1
+	*/
+	$vars = array(
+		'folder_id',
+		'folder',
+		'user_id',
+		'base_url',
+		'start',
+		'pm_count',
+		'template_vars',
+	);
+	extract($phpbb_dispatcher->trigger_event('core.ucp_pm_view_folder_get_pm_from_template', compact($vars)));
+
+	$template->assign_vars($template_vars);
 
 	// Grab all pm data
 	$rowset = $pm_list = array();
@@ -509,15 +533,38 @@ function get_pm_from($folder_id, $folder, $user_id)
 		$sql_sort_order = $sort_by_sql[$sort_key] . ' ' . $direction;
 	}
 
-	$sql = 'SELECT t.*, p.root_level, p.message_time, p.message_subject, p.icon_id, p.to_address, p.message_attachment, p.bcc_address, u.username, u.username_clean, u.user_colour, p.message_reported
-		FROM ' . PRIVMSGS_TO_TABLE . ' t, ' . PRIVMSGS_TABLE . ' p, ' . USERS_TABLE . " u
-		WHERE t.user_id = $user_id
+	$sql_ary = array(
+		'SELECT'	=> 't.*, p.root_level, p.message_time, p.message_subject, p.icon_id, p.to_address, p.message_attachment, p.bcc_address, u.username, u.username_clean, u.user_colour, p.message_reported',
+		'FROM'		=> array(
+			PRIVMSGS_TO_TABLE	=> 't',
+			PRIVMSGS_TABLE		=> 'p',
+			USERS_TABLE			=> 'u',
+		),
+		'WHERE'		=> "t.user_id = $user_id
 			AND p.author_id = u.user_id
 			AND $folder_sql
 			AND t.msg_id = p.msg_id
-			$sql_limit_time
-		ORDER BY $sql_sort_order";
-	$result = $db->sql_query_limit($sql, $sql_limit, $sql_start);
+			$sql_limit_time",
+		'ORDER_BY'	=> $sql_sort_order,
+	);
+
+	/**
+	* Modify SQL before it is executed
+	*
+	* @event core.ucp_pm_view_folder_get_pm_from_sql
+	* @var	array	sql_ary		SQL array
+	* @var	int		sql_limit	SQL limit
+	* @var	int		sql_start	SQL start
+	* @since 3.1.11-RC1
+	*/
+	$vars = array(
+		'sql_ary',
+		'sql_limit',
+		'sql_start',
+	);
+	extract($phpbb_dispatcher->trigger_event('core.ucp_pm_view_folder_get_pm_from_sql', compact($vars)));
+
+	$result = $db->sql_query_limit($db->sql_build_query('SELECT', $sql_ary), $sql_limit, $sql_start);
 
 	$pm_reported = array();
 	while ($row = $db->sql_fetchrow($result))
--- a/includes/ucp/ucp_pm_viewmessage.php
+++ b/includes/ucp/ucp_pm_viewmessage.php
@@ -24,7 +24,7 @@ if (!defined('IN_PHPBB'))
 */
 function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
 {
-	global $user, $template, $auth, $db, $cache, $phpbb_container;
+	global $user, $template, $auth, $db, $phpbb_container;
 	global $phpbb_root_path, $request, $phpEx, $config, $phpbb_dispatcher;
 
 	$user->add_lang(array('viewtopic', 'memberlist'));
@@ -32,7 +32,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
 	$msg_id		= (int) $msg_id;
 	$folder_id	= (int) $folder_id;
 	$author_id	= (int) $message_row['author_id'];
-	$view		= request_var('view', '');
+	$view		= $request->variable('view', '');
 
 	// Not able to view message, it was deleted by the sender
 	if ($message_row['pm_deleted'])
@@ -41,6 +41,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
 		$message = $user->lang['NO_AUTH_READ_REMOVED_MESSAGE'];
 
 		$message .= '<br /><br />' . sprintf($user->lang['RETURN_FOLDER'], '<a href="' . $meta_info . '">', '</a>');
+		send_status_line(403, 'Forbidden');
 		trigger_error($message);
 	}
 
@@ -50,12 +51,10 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
 		trigger_error('NO_AUTH_READ_HOLD_MESSAGE');
 	}
 
-	// Grab icons
-	$icons = $cache->obtain_icons();
-
 	// Load the custom profile fields
 	if ($config['load_cpf_pm'])
 	{
+		/* @var $cp \phpbb\profilefields\manager */
 		$cp = $phpbb_container->get('profilefields.manager');
 
 		$profile_fields = $cp->grab_profile_fields_data($author_id);
@@ -231,7 +230,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
 
 		'U_DELETE'			=> ($auth->acl_get('u_pm_delete')) ? "$url&amp;mode=compose&amp;action=delete&amp;f=$folder_id&amp;p=" . $message_row['msg_id'] : '',
 		'U_EMAIL'			=> $user_info['email'],
-		'U_REPORT'			=> ($config['allow_pm_report']) ? append_sid("{$phpbb_root_path}report.$phpEx", "pm=" . $message_row['msg_id']) : '',
+		'U_REPORT'			=> ($config['allow_pm_report']) ? $phpbb_container->get('controller.helper')->route('phpbb_report_pm_controller', array('id' => $message_row['msg_id'])) : '',
 		'U_QUOTE'			=> ($auth->acl_get('u_sendpm') && $author_id != ANONYMOUS) ? "$url&amp;mode=compose&amp;action=quote&amp;f=$folder_id&amp;p=" . $message_row['msg_id'] : '',
 		'U_EDIT'			=> (($message_row['message_time'] > time() - ($config['pm_edit_time'] * 60) || !$config['pm_edit_time']) && $folder_id == PRIVMSGS_OUTBOX && $auth->acl_get('u_pm_edit')) ? "$url&amp;mode=compose&amp;action=edit&amp;f=$folder_id&amp;p=" . $message_row['msg_id'] : '',
 		'U_POST_REPLY_PM'	=> ($auth->acl_get('u_sendpm') && $author_id != ANONYMOUS) ? "$url&amp;mode=compose&amp;action=reply&amp;f=$folder_id&amp;p=" . $message_row['msg_id'] : '',
@@ -356,7 +355,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
 */
 function get_user_information($user_id, $user_row)
 {
-	global $db, $auth, $user, $cache;
+	global $db, $auth, $user;
 	global $phpbb_root_path, $phpEx, $config;
 
 	if (!$user_id)
--- a/includes/ucp/ucp_prefs.php
+++ b/includes/ucp/ucp_prefs.php
@@ -29,7 +29,7 @@ class ucp_prefs
 
 	function main($id, $mode)
 	{
-		global $config, $db, $user, $auth, $template, $phpbb_dispatcher, $phpbb_root_path, $phpEx;
+		global $config, $db, $user, $auth, $template, $phpbb_dispatcher, $request;
 
 		$submit = (isset($_POST['submit'])) ? true : false;
 		$error = $data = array();
@@ -40,16 +40,16 @@ class ucp_prefs
 			case 'personal':
 				add_form_key('ucp_prefs_personal');
 				$data = array(
-					'notifymethod'	=> request_var('notifymethod', $user->data['user_notify_type']),
-					'dateformat'	=> request_var('dateformat', $user->data['user_dateformat'], true),
-					'lang'			=> basename(request_var('lang', $user->data['user_lang'])),
-					'user_style'		=> request_var('user_style', (int) $user->data['user_style']),
-					'tz'			=> request_var('tz', $user->data['user_timezone']),
-
-					'viewemail'		=> request_var('viewemail', (bool) $user->data['user_allow_viewemail']),
-					'massemail'		=> request_var('massemail', (bool) $user->data['user_allow_massemail']),
-					'hideonline'	=> request_var('hideonline', (bool) !$user->data['user_allow_viewonline']),
-					'allowpm'		=> request_var('allowpm', (bool) $user->data['user_allow_pm']),
+					'notifymethod'	=> $request->variable('notifymethod', $user->data['user_notify_type']),
+					'dateformat'	=> $request->variable('dateformat', $user->data['user_dateformat'], true),
+					'lang'			=> basename($request->variable('lang', $user->data['user_lang'])),
+					'user_style'		=> $request->variable('user_style', (int) $user->data['user_style']),
+					'tz'			=> $request->variable('tz', $user->data['user_timezone']),
+
+					'viewemail'		=> $request->variable('viewemail', (bool) $user->data['user_allow_viewemail']),
+					'massemail'		=> $request->variable('massemail', (bool) $user->data['user_allow_massemail']),
+					'hideonline'	=> $request->variable('hideonline', (bool) !$user->data['user_allow_viewonline']),
+					'allowpm'		=> $request->variable('allowpm', (bool) $user->data['user_allow_pm']),
 				);
 
 				if ($data['notifymethod'] == NOTIFY_IM && (!$config['jab_enable'] || !$user->data['user_jabber'] || !@extension_loaded('xml')))
@@ -221,20 +221,20 @@ class ucp_prefs
 				add_form_key('ucp_prefs_view');
 
 				$data = array(
-					'topic_sk'		=> request_var('topic_sk', (!empty($user->data['user_topic_sortby_type'])) ? $user->data['user_topic_sortby_type'] : 't'),
-					'topic_sd'		=> request_var('topic_sd', (!empty($user->data['user_topic_sortby_dir'])) ? $user->data['user_topic_sortby_dir'] : 'd'),
-					'topic_st'		=> request_var('topic_st', (!empty($user->data['user_topic_show_days'])) ? (int) $user->data['user_topic_show_days'] : 0),
-
-					'post_sk'		=> request_var('post_sk', (!empty($user->data['user_post_sortby_type'])) ? $user->data['user_post_sortby_type'] : 't'),
-					'post_sd'		=> request_var('post_sd', (!empty($user->data['user_post_sortby_dir'])) ? $user->data['user_post_sortby_dir'] : 'a'),
-					'post_st'		=> request_var('post_st', (!empty($user->data['user_post_show_days'])) ? (int) $user->data['user_post_show_days'] : 0),
-
-					'images'		=> request_var('images', (bool) $user->optionget('viewimg')),
-					'flash'			=> request_var('flash', (bool) $user->optionget('viewflash')),
-					'smilies'		=> request_var('smilies', (bool) $user->optionget('viewsmilies')),
-					'sigs'			=> request_var('sigs', (bool) $user->optionget('viewsigs')),
-					'avatars'		=> request_var('avatars', (bool) $user->optionget('viewavatars')),
-					'wordcensor'	=> request_var('wordcensor', (bool) $user->optionget('viewcensors')),
+					'topic_sk'		=> $request->variable('topic_sk', (!empty($user->data['user_topic_sortby_type'])) ? $user->data['user_topic_sortby_type'] : 't'),
+					'topic_sd'		=> $request->variable('topic_sd', (!empty($user->data['user_topic_sortby_dir'])) ? $user->data['user_topic_sortby_dir'] : 'd'),
+					'topic_st'		=> $request->variable('topic_st', (!empty($user->data['user_topic_show_days'])) ? (int) $user->data['user_topic_show_days'] : 0),
+
+					'post_sk'		=> $request->variable('post_sk', (!empty($user->data['user_post_sortby_type'])) ? $user->data['user_post_sortby_type'] : 't'),
+					'post_sd'		=> $request->variable('post_sd', (!empty($user->data['user_post_sortby_dir'])) ? $user->data['user_post_sortby_dir'] : 'a'),
+					'post_st'		=> $request->variable('post_st', (!empty($user->data['user_post_show_days'])) ? (int) $user->data['user_post_show_days'] : 0),
+
+					'images'		=> $request->variable('images', (bool) $user->optionget('viewimg')),
+					'flash'			=> $request->variable('flash', (bool) $user->optionget('viewflash')),
+					'smilies'		=> $request->variable('smilies', (bool) $user->optionget('viewsmilies')),
+					'sigs'			=> $request->variable('sigs', (bool) $user->optionget('viewsigs')),
+					'avatars'		=> $request->variable('avatars', (bool) $user->optionget('viewavatars')),
+					'wordcensor'	=> $request->variable('wordcensor', (bool) $user->optionget('viewcensors')),
 				);
 
 				/**
@@ -436,10 +436,10 @@ class ucp_prefs
 			case 'post':
 
 				$data = array(
-					'bbcode'	=> request_var('bbcode', $user->optionget('bbcode')),
-					'smilies'	=> request_var('smilies', $user->optionget('smilies')),
-					'sig'		=> request_var('sig', $user->optionget('attachsig')),
-					'notify'	=> request_var('notify', (bool) $user->data['user_notify']),
+					'bbcode'	=> $request->variable('bbcode', $user->optionget('bbcode')),
+					'smilies'	=> $request->variable('smilies', $user->optionget('smilies')),
+					'sig'		=> $request->variable('sig', $user->optionget('attachsig')),
+					'notify'	=> $request->variable('notify', (bool) $user->data['user_notify']),
 				);
 				add_form_key('ucp_prefs_post');
 
--- a/includes/ucp/ucp_profile.php
+++ b/includes/ucp/ucp_profile.php
@@ -31,14 +31,12 @@ class ucp_profile
 
 	function main($id, $mode)
 	{
-		global $cache, $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx;
-		global $request, $phpbb_container, $phpbb_dispatcher;
+		global $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx;
+		global $request, $phpbb_container, $phpbb_log, $phpbb_dispatcher;
 
 		$user->add_lang('posting');
 
-		$preview	= $request->variable('preview', false, false, \phpbb\request\request_interface::POST);
 		$submit		= $request->variable('submit', false, false, \phpbb\request\request_interface::POST);
-		$delete		= $request->variable('delete', false, false, \phpbb\request\request_interface::POST);
 		$error = $data = array();
 		$s_hidden_fields = '';
 
@@ -47,8 +45,8 @@ class ucp_profile
 			case 'reg_details':
 
 				$data = array(
-					'username'			=> utf8_normalize_nfc(request_var('username', $user->data['username'], true)),
-					'email'				=> strtolower(request_var('email', $user->data['user_email'])),
+					'username'			=> $request->variable('username', $user->data['username'], true),
+					'email'				=> strtolower($request->variable('email', $user->data['user_email'])),
 					'new_password'		=> $request->variable('new_password', '', true),
 					'cur_password'		=> $request->variable('cur_password', '', true),
 					'password_confirm'	=> $request->variable('password_confirm', '', true),
@@ -96,6 +94,7 @@ class ucp_profile
 					}
 
 					// Instantiate passwords manager
+					/* @var $passwords_manager \phpbb\passwords\manager */
 					$passwords_manager = $phpbb_container->get('passwords.manager');
 
 					// Only check the new password against the previous password if there have been no errors
@@ -139,18 +138,30 @@ class ucp_profile
 
 						if ($auth->acl_get('u_chgname') && $config['allow_namechange'] && $data['username'] != $user->data['username'])
 						{
-							add_log('user', $user->data['user_id'], 'LOG_USER_UPDATE_NAME', $user->data['username'], $data['username']);
+							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_UPDATE_NAME', false, array(
+								'reportee_id' => $user->data['user_id'],
+								$user->data['username'],
+								$data['username']
+							));
 						}
 
 						if ($auth->acl_get('u_chgpasswd') && $data['new_password'] && !$passwords_manager->check($data['new_password'], $user->data['user_password']))
 						{
 							$user->reset_login_keys();
-							add_log('user', $user->data['user_id'], 'LOG_USER_NEW_PASSWORD', $data['username']);
+							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_NEW_PASSWORD', false, array(
+								'reportee_id' => $user->data['user_id'],
+								$user->data['username']
+							));
 						}
 
 						if ($auth->acl_get('u_chgemail') && $data['email'] != $user->data['user_email'])
 						{
-							add_log('user', $user->data['user_id'], 'LOG_USER_UPDATE_EMAIL', $data['username'], $user->data['user_email'], $data['email']);
+							$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_UPDATE_EMAIL', false, array(
+								'reportee_id' => $user->data['user_id'],
+								$user->data['username'],
+								$data['user_email'],
+								$data['email']
+							));
 						}
 
 						$message = 'PROFILE_UPDATED';
@@ -268,15 +279,17 @@ class ucp_profile
 				// Do not display profile information panel if not authed to do so
 				if (!$auth->acl_get('u_chgprofileinfo'))
 				{
+					send_status_line(403, 'Forbidden');
 					trigger_error('NO_AUTH_PROFILEINFO');
 				}
 
+				/* @var $cp \phpbb\profilefields\manager */
 				$cp = $phpbb_container->get('profilefields.manager');
 
 				$cp_data = $cp_error = array();
 
 				$data = array(
-					'jabber'		=> utf8_normalize_nfc(request_var('jabber', $user->data['user_jabber'], true)),
+					'jabber'		=> $request->variable('jabber', $user->data['user_jabber'], true),
 				);
 
 				if ($config['allow_birthdays'])
@@ -288,9 +301,9 @@ class ucp_profile
 						list($data['bday_day'], $data['bday_month'], $data['bday_year']) = explode('-', $user->data['user_birthday']);
 					}
 
-					$data['bday_day'] = request_var('bday_day', $data['bday_day']);
-					$data['bday_month'] = request_var('bday_month', $data['bday_month']);
-					$data['bday_year'] = request_var('bday_year', $data['bday_year']);
+					$data['bday_day'] = $request->variable('bday_day', $data['bday_day']);
+					$data['bday_month'] = $request->variable('bday_month', $data['bday_month']);
+					$data['bday_year'] = $request->variable('bday_year', $data['bday_year']);
 					$data['user_birthday'] = sprintf('%2d-%2d-%4d', $data['bday_day'], $data['bday_month'], $data['bday_year']);
 				}
 
@@ -417,7 +430,6 @@ class ucp_profile
 						$selected = ($i == $data['bday_month']) ? ' selected="selected"' : '';
 						$s_birthday_month_options .= "<option value=\"$i\"$selected>$i</option>";
 					}
-					$s_birthday_year_options = '';
 
 					$now = getdate();
 					$s_birthday_year_options = '<option value="0"' . ((!$data['bday_year']) ? ' selected="selected"' : '') . '>--</option>';
@@ -453,128 +465,144 @@ class ucp_profile
 
 				if (!$auth->acl_get('u_sig'))
 				{
+					send_status_line(403, 'Forbidden');
 					trigger_error('NO_AUTH_SIGNATURE');
 				}
 
 				include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
 				include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
 
-				$enable_bbcode	= ($config['allow_sig_bbcode']) ? (bool) $user->optionget('sig_bbcode') : false;
-				$enable_smilies	= ($config['allow_sig_smilies']) ? (bool) $user->optionget('sig_smilies') : false;
-				$enable_urls	= ($config['allow_sig_links']) ? (bool) $user->optionget('sig_links') : false;
+				$preview	= $request->is_set_post('preview');
 
-				$signature		= utf8_normalize_nfc(request_var('signature', (string) $user->data['user_sig'], true));
+				$enable_bbcode	= ($config['allow_sig_bbcode']) ? $user->optionget('sig_bbcode') : false;
+				$enable_smilies	= ($config['allow_sig_smilies']) ? $user->optionget('sig_smilies') : false;
+				$enable_urls	= ($config['allow_sig_links']) ? $user->optionget('sig_links') : false;
 
-				add_form_key('ucp_sig');
+				$bbcode_flags = ($enable_bbcode ? OPTION_FLAG_BBCODE : 0) + ($enable_smilies ? OPTION_FLAG_SMILIES : 0) + ($enable_urls ? OPTION_FLAG_LINKS : 0);
+
+				$decoded_message	= generate_text_for_edit($user->data['user_sig'], $user->data['user_sig_bbcode_uid'], $bbcode_flags);
+				$signature			= $request->variable('signature', $decoded_message['text'], true);
+				$signature_preview	= '';
 
 				if ($submit || $preview)
 				{
-					include($phpbb_root_path . 'includes/message_parser.' . $phpEx);
+					$enable_bbcode	= ($config['allow_sig_bbcode']) ? !$request->variable('disable_bbcode', false) : false;
+					$enable_smilies	= ($config['allow_sig_smilies']) ? !$request->variable('disable_smilies', false) : false;
+					$enable_urls	= ($config['allow_sig_links']) ? !$request->variable('disable_magic_url', false) : false;
+
+					if (!check_form_key('ucp_sig'))
+					{
+						$error[] = 'FORM_INVALID';
+					}
+				}
+
+				/**
+				* Modify user signature on editing profile in UCP
+				*
+				* @event core.ucp_profile_modify_signature
+				* @var	bool	enable_bbcode		Whether or not bbcode is enabled
+				* @var	bool	enable_smilies		Whether or not smilies are enabled
+				* @var	bool	enable_urls			Whether or not urls are enabled
+				* @var	string	signature			Users signature text
+				* @var	array	error				Any error strings
+				* @var	bool	submit				Whether or not the form has been sumitted
+				* @var	bool	preview				Whether or not the signature is being previewed
+				* @since 3.1.10-RC1
+				* @change 3.2.0-RC2 Removed message parser
+				*/
+				$vars = array(
+					'enable_bbcode',
+					'enable_smilies',
+					'enable_urls',
+					'signature',
+					'error',
+					'submit',
+					'preview',
+				);
+				extract($phpbb_dispatcher->trigger_event('core.ucp_profile_modify_signature', compact($vars)));
+
+				$bbcode_uid = $bbcode_bitfield = $bbcode_flags = '';
+				$warn_msg = generate_text_for_storage(
+					$signature,
+					$bbcode_uid,
+					$bbcode_bitfield,
+					$bbcode_flags,
+					$enable_bbcode,
+					$enable_urls,
+					$enable_smilies,
+					$config['allow_sig_img'],
+					$config['allow_sig_flash'],
+					true,
+					$config['allow_sig_links'],
+					'sig'
+				);
 
-					$enable_bbcode	= ($config['allow_sig_bbcode']) ? ((request_var('disable_bbcode', false)) ? false : true) : false;
-					$enable_smilies	= ($config['allow_sig_smilies']) ? ((request_var('disable_smilies', false)) ? false : true) : false;
-					$enable_urls	= ($config['allow_sig_links']) ? ((request_var('disable_magic_url', false)) ? false : true) : false;
+				if (sizeof($warn_msg))
+				{
+					$error += $warn_msg;
+				}
 
+				if (!$submit)
+				{
+					// Parse it for displaying
+					$signature_preview = generate_text_for_display($signature, $bbcode_uid, $bbcode_bitfield, $bbcode_flags);
+				}
+				else
+				{
 					if (!sizeof($error))
 					{
-						$message_parser = new parse_message($signature);
+						$user->optionset('sig_bbcode', $enable_bbcode);
+						$user->optionset('sig_smilies', $enable_smilies);
+						$user->optionset('sig_links', $enable_urls);
+
+						$sql_ary = array(
+							'user_sig'					=> $signature,
+							'user_options'				=> $user->data['user_options'],
+							'user_sig_bbcode_uid'		=> $bbcode_uid,
+							'user_sig_bbcode_bitfield'	=> $bbcode_bitfield
+						);
 
 						/**
-						* Modify user signature on editing profile in UCP
+						* Modify user registration data before submitting it to the database
 						*
-						* @event core.ucp_profile_modify_signature
-						* @var	bool	enable_bbcode		Whether or not bbcode is enabled
-						* @var	bool	enable_smilies		Whether or not smilies are enabled
-						* @var	bool	enable_urls			Whether or not urls are enabled
-						* @var	string	signature			Users signature text
-						* @var	object	message_parser		The message parser object
-						* @var	array	error				Any error strings
-						* @var	bool	submit				Whether or not the form has been sumitted
-						* @var	bool	preview				Whether or not the signature is being previewed
+						* @event core.ucp_profile_modify_signature_sql_ary
+						* @var	array	sql_ary		Array with user signature data to submit to the database
 						* @since 3.1.10-RC1
 						*/
-						$vars = array(
-							'enable_bbcode',
-							'enable_smilies',
-							'enable_urls',
-							'signature',
-							'message_parser',
-							'error',
-							'submit',
-							'preview',
-						);
-						extract($phpbb_dispatcher->trigger_event('core.ucp_profile_modify_signature', compact($vars)));
-
-						// Allowing Quote BBCode
-						$message_parser->parse($enable_bbcode, $enable_urls, $enable_smilies, $config['allow_sig_img'], $config['allow_sig_flash'], true, $config['allow_sig_links'], true, 'sig');
-
-						if (sizeof($message_parser->warn_msg))
-						{
-							$error[] = implode('<br />', $message_parser->warn_msg);
-						}
+						$vars = array('sql_ary');
+						extract($phpbb_dispatcher->trigger_event('core.ucp_profile_modify_signature_sql_ary', compact($vars)));
 
-						if (!check_form_key('ucp_sig'))
-						{
-							$error[] = 'FORM_INVALID';
-						}
-
-						if (!sizeof($error) && $submit)
-						{
-							$user->optionset('sig_bbcode', $enable_bbcode);
-							$user->optionset('sig_smilies', $enable_smilies);
-							$user->optionset('sig_links', $enable_urls);
-
-							$sql_ary = array(
-								'user_sig'					=> (string) $message_parser->message,
-								'user_options'				=> $user->data['user_options'],
-								'user_sig_bbcode_uid'		=> (string) $message_parser->bbcode_uid,
-								'user_sig_bbcode_bitfield'	=> $message_parser->bbcode_bitfield
-							);
-
-							/**
-							* Modify user registration data before submitting it to the database
-							*
-							* @event core.ucp_profile_modify_signature_sql_ary
-							* @var	array	sql_ary		Array with user signature data to submit to the database
-							* @since 3.1.10-RC1
-							*/
-							$vars = array('sql_ary');
-							extract($phpbb_dispatcher->trigger_event('core.ucp_profile_modify_signature_sql_ary', compact($vars)));
-
-							$sql = 'UPDATE ' . USERS_TABLE . '
-								SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
-								WHERE user_id = ' . $user->data['user_id'];
-							$db->sql_query($sql);
+						$sql = 'UPDATE ' . USERS_TABLE . '
+							SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
+							WHERE user_id = ' . $user->data['user_id'];
+						$db->sql_query($sql);
 
-							$message = $user->lang['PROFILE_UPDATED'] . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
-							trigger_error($message);
-						}
+						$message = $user->lang['PROFILE_UPDATED'] . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
+						trigger_error($message);
 					}
-
-					// Replace "error" strings with their real, localised form
-					$error = array_map(array($user, 'lang'), $error);
 				}
 
-				$signature_preview = '';
-				if ($preview)
+				// Replace "error" strings with their real, localised form
+				$error = array_map(array($user, 'lang'), $error);
+
+				if ($request->is_set_post('preview'))
 				{
-					// Now parse it for displaying
-					$signature_preview = $message_parser->format_display($enable_bbcode, $enable_urls, $enable_smilies, false);
-					unset($message_parser);
+					$decoded_message = generate_text_for_edit($signature, $bbcode_uid, $bbcode_flags);
 				}
 
-				decode_message($signature, $user->data['user_sig_bbcode_uid']);
+				/** @var \phpbb\controller\helper $controller_helper */
+				$controller_helper = $phpbb_container->get('controller.helper');
 
 				$template->assign_vars(array(
 					'ERROR'				=> (sizeof($error)) ? implode('<br />', $error) : '',
-					'SIGNATURE'			=> $signature,
+					'SIGNATURE'			=> $decoded_message['text'],
 					'SIGNATURE_PREVIEW'	=> $signature_preview,
 
 					'S_BBCODE_CHECKED' 		=> (!$enable_bbcode) ? ' checked="checked"' : '',
 					'S_SMILIES_CHECKED' 	=> (!$enable_smilies) ? ' checked="checked"' : '',
 					'S_MAGIC_URL_CHECKED' 	=> (!$enable_urls) ? ' checked="checked"' : '',
 
-					'BBCODE_STATUS'			=> ($config['allow_sig_bbcode']) ? sprintf($user->lang['BBCODE_IS_ON'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>') : sprintf($user->lang['BBCODE_IS_OFF'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>'),
+					'BBCODE_STATUS'			=> $user->lang(($config['allow_sig_bbcode'] ? 'BBCODE_IS_ON' : 'BBCODE_IS_OFF'), '<a href="' . $controller_helper->route('phpbb_help_bbcode_controller') . '">', '</a>'),
 					'SMILIES_STATUS'		=> ($config['allow_sig_smilies']) ? $user->lang['SMILIES_ARE_ON'] : $user->lang['SMILIES_ARE_OFF'],
 					'IMG_STATUS'			=> ($config['allow_sig_img']) ? $user->lang['IMAGES_ARE_ON'] : $user->lang['IMAGES_ARE_OFF'],
 					'FLASH_STATUS'			=> ($config['allow_sig_flash']) ? $user->lang['FLASH_IS_ON'] : $user->lang['FLASH_IS_OFF'],
@@ -590,6 +618,8 @@ class ucp_profile
 					'S_LINKS_ALLOWED'		=> ($config['allow_sig_links']) ? true : false)
 				);
 
+				add_form_key('ucp_sig');
+
 				// Build custom bbcodes array
 				display_custom_bbcodes();
 
@@ -606,6 +636,7 @@ class ucp_profile
 
 				if ($config['allow_avatar'] && $auth->acl_get('u_chgavatar'))
 				{
+					/* @var $phpbb_avatar_manager \phpbb\avatar\manager */
 					$phpbb_avatar_manager = $phpbb_container->get('avatar.manager');
 					$avatar_drivers = $phpbb_avatar_manager->get_enabled_drivers();
 
@@ -633,10 +664,19 @@ class ucp_profile
 										'user_avatar_height' => $result['avatar_height'],
 									);
 
+									/**
+									* Trigger events on successfull avatar change
+									*
+									* @event core.ucp_profile_avatar_sql
+									* @var	array	result	Array with data to be stored in DB
+									* @since 3.1.11-RC1
+									*/
+									$vars = array('result');
+									extract($phpbb_dispatcher->trigger_event('core.ucp_profile_avatar_sql', compact($vars)));
+
 									$sql = 'UPDATE ' . USERS_TABLE . '
 										SET ' . $db->sql_build_array('UPDATE', $result) . '
 										WHERE user_id = ' . (int) $user->data['user_id'];
-
 									$db->sql_query($sql);
 
 									meta_refresh(3, $this->u_action);
@@ -731,7 +771,7 @@ class ucp_profile
 
 				if ($submit)
 				{
-					$keys = request_var('keys', array(''));
+					$keys = $request->variable('keys', array(''));
 
 					if (!check_form_key('ucp_autologin_keys'))
 					{
--- a/includes/ucp/ucp_register.php
+++ b/includes/ucp/ucp_register.php
@@ -29,7 +29,7 @@ class ucp_register
 
 	function main($id, $mode)
 	{
-		global $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx;
+		global $config, $db, $user, $template, $phpbb_root_path, $phpEx;
 		global $request, $phpbb_container, $phpbb_dispatcher;
 
 		//
@@ -42,8 +42,30 @@ class ucp_register
 		$coppa			= $request->is_set('coppa') ? (int) $request->variable('coppa', false) : false;
 		$agreed			= $request->variable('agreed', false);
 		$submit			= $request->is_set_post('submit');
-		$change_lang	= request_var('change_lang', '');
-		$user_lang		= request_var('lang', $user->lang_name);
+		$change_lang	= $request->variable('change_lang', '');
+		$user_lang		= $request->variable('lang', $user->lang_name);
+
+		/**
+		* Add UCP register data before they are assigned to the template or submitted
+		*
+		* To assign data to the template, use $template->assign_vars()
+		*
+		* @event core.ucp_register_requests_after
+		* @var	bool	coppa		Is set coppa
+		* @var	bool	agreed		Did user agree to coppa?
+		* @var	bool	submit		Is set post submit?
+		* @var	string	change_lang	Change language request
+		* @var	string	user_lang	User language request
+		* @since 3.1.11-RC1
+		*/
+		$vars = array(
+			'coppa',
+			'agreed',
+			'submit',
+			'change_lang',
+			'user_lang',
+		);
+		extract($phpbb_dispatcher->trigger_event('core.ucp_register_requests_after', compact($vars)));
 
 		if ($agreed)
 		{
@@ -77,6 +99,7 @@ class ucp_register
 			}
 		}
 
+		/* @var $cp \phpbb\profilefields\manager */
 		$cp = $phpbb_container->get('profilefields.manager');
 
 		$error = $cp_data = $cp_error = array();
@@ -88,6 +111,7 @@ class ucp_register
 		if (!empty($login_link_data))
 		{
 			// Confirm that we have all necessary data
+			/* @var $provider_collection \phpbb\auth\provider_collection */
 			$provider_collection = $phpbb_container->get('auth.provider_collection');
 			$auth_provider = $provider_collection->get_provider($request->variable('auth_provider', ''));
 
@@ -113,10 +137,10 @@ class ucp_register
 			{
 				// We do not include the password
 				$s_hidden_fields = array_merge($s_hidden_fields, array(
-					'username'			=> utf8_normalize_nfc(request_var('username', '', true)),
-					'email'				=> strtolower(request_var('email', '')),
+					'username'			=> $request->variable('username', '', true),
+					'email'				=> strtolower($request->variable('email', '')),
 					'lang'				=> $user->lang_name,
-					'tz'				=> request_var('tz', $config['board_timezone']),
+					'tz'				=> $request->variable('tz', $config['board_timezone']),
 				));
 
 			}
@@ -200,12 +224,12 @@ class ucp_register
 		$timezone = $config['board_timezone'];
 
 		$data = array(
-			'username'			=> utf8_normalize_nfc(request_var('username', '', true)),
+			'username'			=> $request->variable('username', '', true),
 			'new_password'		=> $request->variable('new_password', '', true),
 			'password_confirm'	=> $request->variable('password_confirm', '', true),
-			'email'				=> strtolower(request_var('email', '')),
-			'lang'				=> basename(request_var('lang', $user->lang_name)),
-			'tz'				=> request_var('tz', $timezone),
+			'email'				=> strtolower($request->variable('email', '')),
+			'lang'				=> basename($request->variable('lang', $user->lang_name)),
+			'tz'				=> $request->variable('tz', $timezone),
 		);
 		/**
 		* Add UCP register data before they are assigned to the template or submitted
@@ -334,6 +358,7 @@ class ucp_register
 				}
 
 				// Instantiate passwords manager
+				/* @var $passwords_manager \phpbb\passwords\manager */
 				$passwords_manager = $phpbb_container->get('passwords.manager');
 
 				$user_row = array(
@@ -439,6 +464,7 @@ class ucp_register
 
 				if ($config['require_activation'] == USER_ACTIVATION_ADMIN)
 				{
+					/* @var $phpbb_notifications \phpbb\notification\manager */
 					$phpbb_notifications = $phpbb_container->get('notification_manager');
 					$phpbb_notifications->add_notifications('notification.type.admin_activate_user', array(
 						'user_id'		=> $user_id,
@@ -480,7 +506,6 @@ class ucp_register
 			$s_hidden_fields = array_merge($s_hidden_fields, $captcha->get_hidden_fields());
 		}
 		$s_hidden_fields = build_hidden_fields($s_hidden_fields);
-		$confirm_image = '';
 
 		// Visual Confirmation - Show images
 		if ($config['enable_confirm'])
@@ -503,7 +528,9 @@ class ucp_register
 			break;
 		}
 
-		$timezone_selects = phpbb_timezone_select($template, $user, $data['tz'], true);
+		// Assign template vars for timezone select
+		phpbb_timezone_select($template, $user, $data['tz'], true);
+
 		$template->assign_vars(array(
 			'ERROR'				=> (sizeof($error)) ? implode('<br />', $error) : '',
 			'USERNAME'			=> $data['username'],
--- a/includes/ucp/ucp_remind.php
+++ b/includes/ucp/ucp_remind.php
@@ -29,24 +29,44 @@ class ucp_remind
 
 	function main($id, $mode)
 	{
-		global $config, $phpbb_root_path, $phpEx;
-		global $db, $user, $auth, $template, $phpbb_container;
+		global $config, $phpbb_root_path, $phpEx, $request;
+		global $db, $user, $template, $phpbb_container, $phpbb_dispatcher;
 
 		if (!$config['allow_password_reset'])
 		{
 			trigger_error($user->lang('UCP_PASSWORD_RESET_DISABLED', '<a href="mailto:' . htmlspecialchars($config['board_contact']) . '">', '</a>'));
 		}
 
-		$username	= request_var('username', '', true);
-		$email		= strtolower(request_var('email', ''));
+		$username	= $request->variable('username', '', true);
+		$email		= strtolower($request->variable('email', ''));
 		$submit		= (isset($_POST['submit'])) ? true : false;
 
 		if ($submit)
 		{
-			$sql = 'SELECT user_id, username, user_permissions, user_email, user_jabber, user_notify_type, user_type, user_lang, user_inactive_reason
-				FROM ' . USERS_TABLE . "
-				WHERE user_email_hash = '" . $db->sql_escape(phpbb_email_hash($email)) . "'
-					AND username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'";
+			$sql_array = array(
+				'SELECT'	=> 'user_id, username, user_permissions, user_email, user_jabber, user_notify_type, user_type, user_lang, user_inactive_reason',
+				'FROM'		=> array(USERS_TABLE => 'u'),
+				'WHERE'		=> "user_email_hash = '" . $db->sql_escape(phpbb_email_hash($email)) . "'
+									AND username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'"
+			);
+
+			/**
+			* Change SQL query for fetching user data
+			*
+			* @event core.ucp_remind_modify_select_sql
+			* @var	string	email		User's email from the form
+			* @var	string	username	User's username from the form
+			* @var	array	sql_array	Fully assembled SQL query with keys SELECT, FROM, WHERE
+			* @since 3.1.11-RC1
+			*/
+			$vars = array(
+				'email',
+				'username',
+				'sql_array',
+			);
+			extract($phpbb_dispatcher->trigger_event('core.ucp_remind_modify_select_sql', compact($vars)));
+
+			$sql = $db->sql_build_query('SELECT', $sql_array);
 			$result = $db->sql_query($sql);
 			$user_row = $db->sql_fetchrow($result);
 			$db->sql_freeresult($result);
@@ -79,6 +99,7 @@ class ucp_remind
 
 			if (!$auth2->acl_get('u_chgpasswd'))
 			{
+				send_status_line(403, 'Forbidden');
 				trigger_error('NO_AUTH_PASSWORD_REMINDER');
 			}
 
@@ -92,6 +113,7 @@ class ucp_remind
 			$user_actkey = gen_rand_string(mt_rand(6, 10));
 
 			// Instantiate passwords manager
+			/* @var $manager \phpbb\passwords\manager */
 			$passwords_manager = $phpbb_container->get('passwords.manager');
 
 			$sql = 'UPDATE ' . USERS_TABLE . "
--- a/includes/ucp/ucp_resend.php
+++ b/includes/ucp/ucp_resend.php
@@ -30,10 +30,10 @@ class ucp_resend
 	function main($id, $mode)
 	{
 		global $config, $phpbb_root_path, $phpEx;
-		global $db, $user, $auth, $template;
+		global $db, $user, $auth, $template, $request;
 
-		$username	= request_var('username', '', true);
-		$email		= strtolower(request_var('email', ''));
+		$username	= $request->variable('username', '', true);
+		$email		= strtolower($request->variable('email', ''));
 		$submit		= (isset($_POST['submit'])) ? true : false;
 
 		add_form_key('ucp_resend');
--- a/includes/ucp/ucp_zebra.php
+++ b/includes/ucp/ucp_zebra.php
@@ -25,7 +25,7 @@ class ucp_zebra
 
 	function main($id, $mode)
 	{
-		global $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx, $request, $phpbb_dispatcher;
+		global $db, $user, $auth, $template, $phpbb_root_path, $phpEx, $request, $phpbb_dispatcher;
 
 		$submit	= (isset($_POST['submit']) || isset($_GET['add']) || isset($_GET['remove'])) ? true : false;
 		$s_hidden_fields = '';
@@ -44,7 +44,7 @@ class ucp_zebra
 
 			foreach ($var_ary as $var => $default)
 			{
-				$data[$var] = request_var($var, $default, true);
+				$data[$var] = $request->variable($var, $default, true);
 			}
 
 			if (!empty($data['add']) || sizeof($data['usernames']))
--- a/includes/utf/utf_tools.php
+++ b/includes/utf/utf_tools.php
@@ -21,6 +21,13 @@ if (!defined('IN_PHPBB'))
 // Enforce ASCII only string handling
 setlocale(LC_CTYPE, 'C');
 
+/**
+* Setup the UTF-8 portability layer
+*/
+Patchwork\Utf8\Bootup::initUtf8Encode();
+Patchwork\Utf8\Bootup::initMbstring();
+Patchwork\Utf8\Bootup::initIntl();
+
 /**
 * UTF-8 tools
 *
@@ -29,544 +36,85 @@ setlocale(LC_CTYPE, 'C');
 *
 */
 
-if (!extension_loaded('xml'))
-{
-	/**
-	* Implementation of PHP's native utf8_encode for people without XML support
-	* This function exploits some nice things that ISO-8859-1 and UTF-8 have in common
-	*
-	* @param string $str ISO-8859-1 encoded data
-	* @return string UTF-8 encoded data
-	*/
-	function utf8_encode($str)
-	{
-		$out = '';
-		for ($i = 0, $len = strlen($str); $i < $len; $i++)
-		{
-			$letter = $str[$i];
-			$num = ord($letter);
-			if ($num < 0x80)
-			{
-				$out .= $letter;
-			}
-			else if ($num < 0xC0)
-			{
-				$out .= "\xC2" . $letter;
-			}
-			else
-			{
-				$out .= "\xC3" . chr($num - 64);
-			}
-		}
-		return $out;
-	}
-
-	/**
-	* Implementation of PHP's native utf8_decode for people without XML support
-	*
-	* @param string $str UTF-8 encoded data
-	* @return string ISO-8859-1 encoded data
-	*/
-	function utf8_decode($str)
-	{
-		$pos = 0;
-		$len = strlen($str);
-		$ret = '';
-
-		while ($pos < $len)
-		{
-			$ord = ord($str[$pos]) & 0xF0;
-			if ($ord === 0xC0 || $ord === 0xD0)
-			{
-				$charval = ((ord($str[$pos]) & 0x1F) << 6) | (ord($str[$pos + 1]) & 0x3F);
-				$pos += 2;
-				$ret .= (($charval < 256) ? chr($charval) : '?');
-			}
-			else if ($ord === 0xE0)
-			{
-				$ret .= '?';
-				$pos += 3;
-			}
-			else if ($ord === 0xF0)
-			{
-				$ret .= '?';
-				$pos += 4;
-			}
-			else
-			{
-				$ret .= $str[$pos];
-				++$pos;
-			}
-		}
-		return $ret;
-	}
-}
-
-// mbstring is old and has it's functions around for older versions of PHP.
-// if mbstring is not loaded, we go into native mode.
-if (extension_loaded('mbstring'))
+/**
+* UTF-8 aware alternative to strrpos
+* @ignore
+*/
+function utf8_strrpos($str,	$needle, $offset = null)
 {
-	mb_internal_encoding('UTF-8');
-
-	/**
-	* UTF-8 aware alternative to strrpos
-	* Find position of last occurrence of a char in a string
-	*/
-	/**
-	* UTF-8 aware alternative to strrpos
-	* @ignore
-	*/
-	function utf8_strrpos($str,	$needle, $offset = null)
+	// Emulate behaviour of strrpos rather than raising warning
+	if (empty($str))
 	{
-		// Emulate behaviour of strrpos rather than raising warning
-		if (empty($str))
-		{
-			return false;
-		}
-
-		if (is_null($offset))
-		{
-			return mb_strrpos($str, $needle);
-		}
-		else
-		{
-			return mb_strrpos($str, $needle, $offset);
-		}
-	}
-
-	/**
-	* UTF-8 aware alternative to strpos
-	* @ignore
-	*/
-	function utf8_strpos($str, $needle, $offset = null)
-	{
-		if (is_null($offset))
-		{
-			return mb_strpos($str, $needle);
-		}
-		else
-		{
-			return mb_strpos($str, $needle, $offset);
-		}
+		return false;
 	}
 
-	/**
-	* UTF-8 aware alternative to strtolower
-	* @ignore
-	*/
-	function utf8_strtolower($str)
+	if (is_null($offset))
 	{
-		return mb_strtolower($str);
+		return mb_strrpos($str, $needle);
 	}
-
-	/**
-	* UTF-8 aware alternative to strtoupper
-	* @ignore
-	*/
-	function utf8_strtoupper($str)
+	else
 	{
-		return mb_strtoupper($str);
+		return mb_strrpos($str, $needle, $offset);
 	}
+}
 
-	/**
-	* UTF-8 aware alternative to substr
-	* @ignore
-	*/
-	function utf8_substr($str, $offset, $length = null)
+/**
+* UTF-8 aware alternative to strpos
+* @ignore
+*/
+function utf8_strpos($str, $needle, $offset = null)
+{
+	if (is_null($offset))
 	{
-		if (is_null($length))
-		{
-			return mb_substr($str, $offset);
-		}
-		else
-		{
-			return mb_substr($str, $offset, $length);
-		}
+		return mb_strpos($str, $needle);
 	}
-
-	/**
-	* Return the length (in characters) of a UTF-8 string
-	* @ignore
-	*/
-	function utf8_strlen($text)
+	else
 	{
-		return mb_strlen($text, 'utf-8');
+		return mb_strpos($str, $needle, $offset);
 	}
 }
-else
-{
-	/**
-	* UTF-8 aware alternative to strrpos
-	* Find position of last occurrence of a char in a string
-	*
-	* @author Harry Fuecks
-	* @param string $str haystack
-	* @param string $needle needle
-	* @param integer $offset (optional) offset (from left)
-	* @return mixed integer position or FALSE on failure
-	*/
-	function utf8_strrpos($str,	$needle, $offset = null)
-	{
-		if (is_null($offset))
-		{
-			$ar	= explode($needle, $str);
-
-			if (sizeof($ar) > 1)
-			{
-				// Pop off the end of the string where the last	match was made
-				array_pop($ar);
-				$str = join($needle, $ar);
-
-				return utf8_strlen($str);
-			}
-			return false;
-		}
-		else
-		{
-			if (!is_int($offset))
-			{
-				trigger_error('utf8_strrpos	expects	parameter 3	to be long', E_USER_ERROR);
-				return false;
-			}
-
-			$str = utf8_substr($str, $offset);
-
-			if (false !== ($pos = utf8_strrpos($str, $needle)))
-			{
-				return $pos	+ $offset;
-			}
-
-			return false;
-		}
-	}
 
-	/**
-	* UTF-8 aware alternative to strpos
-	* Find position of first occurrence of a string
-	*
-	* @author Harry Fuecks
-	* @param string $str haystack
-	* @param string $needle needle
-	* @param integer $offset offset in characters (from left)
-	* @return mixed integer position or FALSE on failure
-	*/
-	function utf8_strpos($str, $needle, $offset = null)
-	{
-		if (is_null($offset))
-		{
-			$ar = explode($needle, $str);
-			if (sizeof($ar) > 1)
-			{
-				return utf8_strlen($ar[0]);
-			}
-			return false;
-		}
-		else
-		{
-			if (!is_int($offset))
-			{
-				trigger_error('utf8_strpos:  Offset must  be an integer', E_USER_ERROR);
-				return false;
-			}
-
-			$str = utf8_substr($str, $offset);
-
-			if (false !== ($pos = utf8_strpos($str, $needle)))
-			{
-				return $pos + $offset;
-			}
+/**
+* UTF-8 aware alternative to strtolower
+* @ignore
+*/
+function utf8_strtolower($str)
+{
+	return mb_strtolower($str);
+}
 
-			return false;
-		}
-	}
+/**
+* UTF-8 aware alternative to strtoupper
+* @ignore
+*/
+function utf8_strtoupper($str)
+{
+	return mb_strtoupper($str);
+}
 
-	/**
-	* UTF-8 aware alternative to strtolower
-	* Make a string lowercase
-	* Note: The concept of a characters "case" only exists is some alphabets
-	* such as Latin, Greek, Cyrillic, Armenian and archaic Georgian - it does
-	* not exist in the Chinese alphabet, for example. See Unicode Standard
-	* Annex #21: Case Mappings
-	*
-	* @param string
-	* @return string string in lowercase
-	*/
-	function utf8_strtolower($string)
+/**
+* UTF-8 aware alternative to substr
+* @ignore
+*/
+function utf8_substr($str, $offset, $length = null)
+{
+	if (is_null($length))
 	{
-		static $utf8_upper_to_lower = array(
-			"\xC3\x80" => "\xC3\xA0", "\xC3\x81" => "\xC3\xA1",
-			"\xC3\x82" => "\xC3\xA2", "\xC3\x83" => "\xC3\xA3", "\xC3\x84" => "\xC3\xA4", "\xC3\x85" => "\xC3\xA5",
-			"\xC3\x86" => "\xC3\xA6", "\xC3\x87" => "\xC3\xA7", "\xC3\x88" => "\xC3\xA8", "\xC3\x89" => "\xC3\xA9",
-			"\xC3\x8A" => "\xC3\xAA", "\xC3\x8B" => "\xC3\xAB", "\xC3\x8C" => "\xC3\xAC", "\xC3\x8D" => "\xC3\xAD",
-			"\xC3\x8E" => "\xC3\xAE", "\xC3\x8F" => "\xC3\xAF", "\xC3\x90" => "\xC3\xB0", "\xC3\x91" => "\xC3\xB1",
-			"\xC3\x92" => "\xC3\xB2", "\xC3\x93" => "\xC3\xB3", "\xC3\x94" => "\xC3\xB4", "\xC3\x95" => "\xC3\xB5",
-			"\xC3\x96" => "\xC3\xB6", "\xC3\x98" => "\xC3\xB8", "\xC3\x99" => "\xC3\xB9", "\xC3\x9A" => "\xC3\xBA",
-			"\xC3\x9B" => "\xC3\xBB", "\xC3\x9C" => "\xC3\xBC", "\xC3\x9D" => "\xC3\xBD", "\xC3\x9E" => "\xC3\xBE",
-			"\xC4\x80" => "\xC4\x81", "\xC4\x82" => "\xC4\x83", "\xC4\x84" => "\xC4\x85", "\xC4\x86" => "\xC4\x87",
-			"\xC4\x88" => "\xC4\x89", "\xC4\x8A" => "\xC4\x8B", "\xC4\x8C" => "\xC4\x8D", "\xC4\x8E" => "\xC4\x8F",
-			"\xC4\x90" => "\xC4\x91", "\xC4\x92" => "\xC4\x93", "\xC4\x96" => "\xC4\x97", "\xC4\x98" => "\xC4\x99",
-			"\xC4\x9A" => "\xC4\x9B", "\xC4\x9C" => "\xC4\x9D", "\xC4\x9E" => "\xC4\x9F", "\xC4\xA0" => "\xC4\xA1",
-			"\xC4\xA2" => "\xC4\xA3", "\xC4\xA4" => "\xC4\xA5", "\xC4\xA6" => "\xC4\xA7", "\xC4\xA8" => "\xC4\xA9",
-			"\xC4\xAA" => "\xC4\xAB", "\xC4\xAE" => "\xC4\xAF", "\xC4\xB4" => "\xC4\xB5", "\xC4\xB6" => "\xC4\xB7",
-			"\xC4\xB9" => "\xC4\xBA", "\xC4\xBB" => "\xC4\xBC", "\xC4\xBD" => "\xC4\xBE", "\xC5\x81" => "\xC5\x82",
-			"\xC5\x83" => "\xC5\x84", "\xC5\x85" => "\xC5\x86", "\xC5\x87" => "\xC5\x88", "\xC5\x8A" => "\xC5\x8B",
-			"\xC5\x8C" => "\xC5\x8D", "\xC5\x90" => "\xC5\x91", "\xC5\x94" => "\xC5\x95", "\xC5\x96" => "\xC5\x97",
-			"\xC5\x98" => "\xC5\x99", "\xC5\x9A" => "\xC5\x9B", "\xC5\x9C" => "\xC5\x9D", "\xC5\x9E" => "\xC5\x9F",
-			"\xC5\xA0" => "\xC5\xA1", "\xC5\xA2" => "\xC5\xA3", "\xC5\xA4" => "\xC5\xA5", "\xC5\xA6" => "\xC5\xA7",
-			"\xC5\xA8" => "\xC5\xA9", "\xC5\xAA" => "\xC5\xAB", "\xC5\xAC" => "\xC5\xAD", "\xC5\xAE" => "\xC5\xAF",
-			"\xC5\xB0" => "\xC5\xB1", "\xC5\xB2" => "\xC5\xB3", "\xC5\xB4" => "\xC5\xB5", "\xC5\xB6" => "\xC5\xB7",
-			"\xC5\xB8" => "\xC3\xBF", "\xC5\xB9" => "\xC5\xBA", "\xC5\xBB" => "\xC5\xBC", "\xC5\xBD" => "\xC5\xBE",
-			"\xC6\xA0" => "\xC6\xA1", "\xC6\xAF" => "\xC6\xB0", "\xC8\x98" => "\xC8\x99", "\xC8\x9A" => "\xC8\x9B",
-			"\xCE\x86" => "\xCE\xAC", "\xCE\x88" => "\xCE\xAD", "\xCE\x89" => "\xCE\xAE", "\xCE\x8A" => "\xCE\xAF",
-			"\xCE\x8C" => "\xCF\x8C", "\xCE\x8E" => "\xCF\x8D", "\xCE\x8F" => "\xCF\x8E", "\xCE\x91" => "\xCE\xB1",
-			"\xCE\x92" => "\xCE\xB2", "\xCE\x93" => "\xCE\xB3", "\xCE\x94" => "\xCE\xB4", "\xCE\x95" => "\xCE\xB5",
-			"\xCE\x96" => "\xCE\xB6", "\xCE\x97" => "\xCE\xB7", "\xCE\x98" => "\xCE\xB8", "\xCE\x99" => "\xCE\xB9",
-			"\xCE\x9A" => "\xCE\xBA", "\xCE\x9B" => "\xCE\xBB", "\xCE\x9C" => "\xCE\xBC", "\xCE\x9D" => "\xCE\xBD",
-			"\xCE\x9E" => "\xCE\xBE", "\xCE\x9F" => "\xCE\xBF", "\xCE\xA0" => "\xCF\x80", "\xCE\xA1" => "\xCF\x81",
-			"\xCE\xA3" => "\xCF\x83", "\xCE\xA4" => "\xCF\x84", "\xCE\xA5" => "\xCF\x85", "\xCE\xA6" => "\xCF\x86",
-			"\xCE\xA7" => "\xCF\x87", "\xCE\xA8" => "\xCF\x88", "\xCE\xA9" => "\xCF\x89", "\xCE\xAA" => "\xCF\x8A",
-			"\xCE\xAB" => "\xCF\x8B", "\xD0\x81" => "\xD1\x91", "\xD0\x82" => "\xD1\x92", "\xD0\x83" => "\xD1\x93",
-			"\xD0\x84" => "\xD1\x94", "\xD0\x85" => "\xD1\x95", "\xD0\x86" => "\xD1\x96", "\xD0\x87" => "\xD1\x97",
-			"\xD0\x88" => "\xD1\x98", "\xD0\x89" => "\xD1\x99", "\xD0\x8A" => "\xD1\x9A", "\xD0\x8B" => "\xD1\x9B",
-			"\xD0\x8C" => "\xD1\x9C", "\xD0\x8E" => "\xD1\x9E", "\xD0\x8F" => "\xD1\x9F", "\xD0\x90" => "\xD0\xB0",
-			"\xD0\x91" => "\xD0\xB1", "\xD0\x92" => "\xD0\xB2", "\xD0\x93" => "\xD0\xB3", "\xD0\x94" => "\xD0\xB4",
-			"\xD0\x95" => "\xD0\xB5", "\xD0\x96" => "\xD0\xB6", "\xD0\x97" => "\xD0\xB7", "\xD0\x98" => "\xD0\xB8",
-			"\xD0\x99" => "\xD0\xB9", "\xD0\x9A" => "\xD0\xBA", "\xD0\x9B" => "\xD0\xBB", "\xD0\x9C" => "\xD0\xBC",
-			"\xD0\x9D" => "\xD0\xBD", "\xD0\x9E" => "\xD0\xBE", "\xD0\x9F" => "\xD0\xBF", "\xD0\xA0" => "\xD1\x80",
-			"\xD0\xA1" => "\xD1\x81", "\xD0\xA2" => "\xD1\x82", "\xD0\xA3" => "\xD1\x83", "\xD0\xA4" => "\xD1\x84",
-			"\xD0\xA5" => "\xD1\x85", "\xD0\xA6" => "\xD1\x86", "\xD0\xA7" => "\xD1\x87", "\xD0\xA8" => "\xD1\x88",
-			"\xD0\xA9" => "\xD1\x89", "\xD0\xAA" => "\xD1\x8A", "\xD0\xAB" => "\xD1\x8B", "\xD0\xAC" => "\xD1\x8C",
-			"\xD0\xAD" => "\xD1\x8D", "\xD0\xAE" => "\xD1\x8E", "\xD0\xAF" => "\xD1\x8F", "\xD2\x90" => "\xD2\x91",
-			"\xE1\xB8\x82" => "\xE1\xB8\x83", "\xE1\xB8\x8A" => "\xE1\xB8\x8B", "\xE1\xB8\x9E" => "\xE1\xB8\x9F", "\xE1\xB9\x80" => "\xE1\xB9\x81",
-			"\xE1\xB9\x96" => "\xE1\xB9\x97", "\xE1\xB9\xA0" => "\xE1\xB9\xA1", "\xE1\xB9\xAA" => "\xE1\xB9\xAB", "\xE1\xBA\x80" => "\xE1\xBA\x81",
-			"\xE1\xBA\x82" => "\xE1\xBA\x83", "\xE1\xBA\x84" => "\xE1\xBA\x85", "\xE1\xBB\xB2" => "\xE1\xBB\xB3"
-		);
-
-		return strtr(strtolower($string), $utf8_upper_to_lower);
+		return mb_substr($str, $offset);
 	}
-
-	/**
-	* UTF-8 aware alternative to strtoupper
-	* Make a string uppercase
-	* Note: The concept of a characters "case" only exists is some alphabets
-	* such as Latin, Greek, Cyrillic, Armenian and archaic Georgian - it does
-	* not exist in the Chinese alphabet, for example. See Unicode Standard
-	* Annex #21: Case Mappings
-	*
-	* @param string
-	* @return string string in uppercase
-	*/
-	function utf8_strtoupper($string)
+	else
 	{
-		static $utf8_lower_to_upper = array(
-			"\xC3\xA0" => "\xC3\x80", "\xC3\xA1" => "\xC3\x81",
-			"\xC3\xA2" => "\xC3\x82", "\xC3\xA3" => "\xC3\x83", "\xC3\xA4" => "\xC3\x84", "\xC3\xA5" => "\xC3\x85",
-			"\xC3\xA6" => "\xC3\x86", "\xC3\xA7" => "\xC3\x87", "\xC3\xA8" => "\xC3\x88", "\xC3\xA9" => "\xC3\x89",
-			"\xC3\xAA" => "\xC3\x8A", "\xC3\xAB" => "\xC3\x8B", "\xC3\xAC" => "\xC3\x8C", "\xC3\xAD" => "\xC3\x8D",
-			"\xC3\xAE" => "\xC3\x8E", "\xC3\xAF" => "\xC3\x8F", "\xC3\xB0" => "\xC3\x90", "\xC3\xB1" => "\xC3\x91",
-			"\xC3\xB2" => "\xC3\x92", "\xC3\xB3" => "\xC3\x93", "\xC3\xB4" => "\xC3\x94", "\xC3\xB5" => "\xC3\x95",
-			"\xC3\xB6" => "\xC3\x96", "\xC3\xB8" => "\xC3\x98", "\xC3\xB9" => "\xC3\x99", "\xC3\xBA" => "\xC3\x9A",
-			"\xC3\xBB" => "\xC3\x9B", "\xC3\xBC" => "\xC3\x9C", "\xC3\xBD" => "\xC3\x9D", "\xC3\xBE" => "\xC3\x9E",
-			"\xC3\xBF" => "\xC5\xB8", "\xC4\x81" => "\xC4\x80", "\xC4\x83" => "\xC4\x82", "\xC4\x85" => "\xC4\x84",
-			"\xC4\x87" => "\xC4\x86", "\xC4\x89" => "\xC4\x88", "\xC4\x8B" => "\xC4\x8A", "\xC4\x8D" => "\xC4\x8C",
-			"\xC4\x8F" => "\xC4\x8E", "\xC4\x91" => "\xC4\x90", "\xC4\x93" => "\xC4\x92", "\xC4\x97" => "\xC4\x96",
-			"\xC4\x99" => "\xC4\x98", "\xC4\x9B" => "\xC4\x9A", "\xC4\x9D" => "\xC4\x9C", "\xC4\x9F" => "\xC4\x9E",
-			"\xC4\xA1" => "\xC4\xA0", "\xC4\xA3" => "\xC4\xA2", "\xC4\xA5" => "\xC4\xA4", "\xC4\xA7" => "\xC4\xA6",
-			"\xC4\xA9" => "\xC4\xA8", "\xC4\xAB" => "\xC4\xAA", "\xC4\xAF" => "\xC4\xAE", "\xC4\xB5" => "\xC4\xB4",
-			"\xC4\xB7" => "\xC4\xB6", "\xC4\xBA" => "\xC4\xB9", "\xC4\xBC" => "\xC4\xBB", "\xC4\xBE" => "\xC4\xBD",
-			"\xC5\x82" => "\xC5\x81", "\xC5\x84" => "\xC5\x83", "\xC5\x86" => "\xC5\x85", "\xC5\x88" => "\xC5\x87",
-			"\xC5\x8B" => "\xC5\x8A", "\xC5\x8D" => "\xC5\x8C", "\xC5\x91" => "\xC5\x90", "\xC5\x95" => "\xC5\x94",
-			"\xC5\x97" => "\xC5\x96", "\xC5\x99" => "\xC5\x98", "\xC5\x9B" => "\xC5\x9A", "\xC5\x9D" => "\xC5\x9C",
-			"\xC5\x9F" => "\xC5\x9E", "\xC5\xA1" => "\xC5\xA0", "\xC5\xA3" => "\xC5\xA2", "\xC5\xA5" => "\xC5\xA4",
-			"\xC5\xA7" => "\xC5\xA6", "\xC5\xA9" => "\xC5\xA8", "\xC5\xAB" => "\xC5\xAA", "\xC5\xAD" => "\xC5\xAC",
-			"\xC5\xAF" => "\xC5\xAE", "\xC5\xB1" => "\xC5\xB0", "\xC5\xB3" => "\xC5\xB2", "\xC5\xB5" => "\xC5\xB4",
-			"\xC5\xB7" => "\xC5\xB6", "\xC5\xBA" => "\xC5\xB9", "\xC5\xBC" => "\xC5\xBB", "\xC5\xBE" => "\xC5\xBD",
-			"\xC6\xA1" => "\xC6\xA0", "\xC6\xB0" => "\xC6\xAF", "\xC8\x99" => "\xC8\x98", "\xC8\x9B" => "\xC8\x9A",
-			"\xCE\xAC" => "\xCE\x86", "\xCE\xAD" => "\xCE\x88", "\xCE\xAE" => "\xCE\x89", "\xCE\xAF" => "\xCE\x8A",
-			"\xCE\xB1" => "\xCE\x91", "\xCE\xB2" => "\xCE\x92", "\xCE\xB3" => "\xCE\x93", "\xCE\xB4" => "\xCE\x94",
-			"\xCE\xB5" => "\xCE\x95", "\xCE\xB6" => "\xCE\x96", "\xCE\xB7" => "\xCE\x97", "\xCE\xB8" => "\xCE\x98",
-			"\xCE\xB9" => "\xCE\x99", "\xCE\xBA" => "\xCE\x9A", "\xCE\xBB" => "\xCE\x9B", "\xCE\xBC" => "\xCE\x9C",
-			"\xCE\xBD" => "\xCE\x9D", "\xCE\xBE" => "\xCE\x9E", "\xCE\xBF" => "\xCE\x9F", "\xCF\x80" => "\xCE\xA0",
-			"\xCF\x81" => "\xCE\xA1", "\xCF\x83" => "\xCE\xA3", "\xCF\x84" => "\xCE\xA4", "\xCF\x85" => "\xCE\xA5",
-			"\xCF\x86" => "\xCE\xA6", "\xCF\x87" => "\xCE\xA7", "\xCF\x88" => "\xCE\xA8", "\xCF\x89" => "\xCE\xA9",
-			"\xCF\x8A" => "\xCE\xAA", "\xCF\x8B" => "\xCE\xAB", "\xCF\x8C" => "\xCE\x8C", "\xCF\x8D" => "\xCE\x8E",
-			"\xCF\x8E" => "\xCE\x8F", "\xD0\xB0" => "\xD0\x90", "\xD0\xB1" => "\xD0\x91", "\xD0\xB2" => "\xD0\x92",
-			"\xD0\xB3" => "\xD0\x93", "\xD0\xB4" => "\xD0\x94", "\xD0\xB5" => "\xD0\x95", "\xD0\xB6" => "\xD0\x96",
-			"\xD0\xB7" => "\xD0\x97", "\xD0\xB8" => "\xD0\x98", "\xD0\xB9" => "\xD0\x99", "\xD0\xBA" => "\xD0\x9A",
-			"\xD0\xBB" => "\xD0\x9B", "\xD0\xBC" => "\xD0\x9C", "\xD0\xBD" => "\xD0\x9D", "\xD0\xBE" => "\xD0\x9E",
-			"\xD0\xBF" => "\xD0\x9F", "\xD1\x80" => "\xD0\xA0", "\xD1\x81" => "\xD0\xA1", "\xD1\x82" => "\xD0\xA2",
-			"\xD1\x83" => "\xD0\xA3", "\xD1\x84" => "\xD0\xA4", "\xD1\x85" => "\xD0\xA5", "\xD1\x86" => "\xD0\xA6",
-			"\xD1\x87" => "\xD0\xA7", "\xD1\x88" => "\xD0\xA8", "\xD1\x89" => "\xD0\xA9", "\xD1\x8A" => "\xD0\xAA",
-			"\xD1\x8B" => "\xD0\xAB", "\xD1\x8C" => "\xD0\xAC", "\xD1\x8D" => "\xD0\xAD", "\xD1\x8E" => "\xD0\xAE",
-			"\xD1\x8F" => "\xD0\xAF", "\xD1\x91" => "\xD0\x81", "\xD1\x92" => "\xD0\x82", "\xD1\x93" => "\xD0\x83",
-			"\xD1\x94" => "\xD0\x84", "\xD1\x95" => "\xD0\x85", "\xD1\x96" => "\xD0\x86", "\xD1\x97" => "\xD0\x87",
-			"\xD1\x98" => "\xD0\x88", "\xD1\x99" => "\xD0\x89", "\xD1\x9A" => "\xD0\x8A", "\xD1\x9B" => "\xD0\x8B",
-			"\xD1\x9C" => "\xD0\x8C", "\xD1\x9E" => "\xD0\x8E", "\xD1\x9F" => "\xD0\x8F", "\xD2\x91" => "\xD2\x90",
-			"\xE1\xB8\x83" => "\xE1\xB8\x82", "\xE1\xB8\x8B" => "\xE1\xB8\x8A", "\xE1\xB8\x9F" => "\xE1\xB8\x9E", "\xE1\xB9\x81" => "\xE1\xB9\x80",
-			"\xE1\xB9\x97" => "\xE1\xB9\x96", "\xE1\xB9\xA1" => "\xE1\xB9\xA0", "\xE1\xB9\xAB" => "\xE1\xB9\xAA", "\xE1\xBA\x81" => "\xE1\xBA\x80",
-			"\xE1\xBA\x83" => "\xE1\xBA\x82", "\xE1\xBA\x85" => "\xE1\xBA\x84", "\xE1\xBB\xB3" => "\xE1\xBB\xB2"
-		);
-
-		return strtr(strtoupper($string), $utf8_lower_to_upper);
-	}
-
-	/**
-	* UTF-8 aware alternative to substr
-	* Return part of a string given character offset (and optionally length)
-	*
-	* Note arguments: comparied to substr - if offset or length are
-	* not integers, this version will not complain but rather massages them
-	* into an integer.
-	*
-	* Note on returned values: substr documentation states false can be
-	* returned in some cases (e.g. offset > string length)
-	* mb_substr never returns false, it will return an empty string instead.
-	* This adopts the mb_substr approach
-	*
-	* Note on implementation: PCRE only supports repetitions of less than
-	* 65536, in order to accept up to MAXINT values for offset and length,
-	* we'll repeat a group of 65535 characters when needed.
-	*
-	* Note on implementation: calculating the number of characters in the
-	* string is a relatively expensive operation, so we only carry it out when
-	* necessary. It isn't necessary for +ve offsets and no specified length
-	*
-	* @author Chris Smith<chris@jalakai.co.uk>
-	* @param string $str
-	* @param integer $offset number of UTF-8 characters offset (from left)
-	* @param integer $length (optional) length in UTF-8 characters from offset
-	* @return mixed string or FALSE if failure
-	*/
-	function utf8_substr($str, $offset, $length = NULL)
-	{
-		// generates E_NOTICE
-		// for PHP4 objects, but not PHP5 objects
-		$str = (string) $str;
-		$offset = (int) $offset;
-		if (!is_null($length))
-		{
-			$length = (int) $length;
-		}
-
-		// handle trivial cases
-		if ($length === 0 || ($offset < 0 && $length < 0 && $length < $offset))
-		{
-			return '';
-		}
-
-		// normalise negative offsets (we could use a tail
-		// anchored pattern, but they are horribly slow!)
-		if ($offset < 0)
-		{
-			// see notes
-			$strlen = utf8_strlen($str);
-			$offset = $strlen + $offset;
-			if ($offset < 0)
-			{
-				$offset = 0;
-			}
-		}
-
-		$op = '';
-		$lp = '';
-
-		// establish a pattern for offset, a
-		// non-captured group equal in length to offset
-		if ($offset > 0)
-		{
-			$ox = (int) ($offset / 65535);
-			$oy = $offset % 65535;
-
-			if ($ox)
-			{
-				$op = '(?:.{65535}){' . $ox . '}';
-			}
-
-			$op = '^(?:' . $op . '.{' . $oy . '})';
-		}
-		else
-		{
-			// offset == 0; just anchor the pattern
-			$op = '^';
-		}
-
-		// establish a pattern for length
-		if (is_null($length))
-		{
-			// the rest of the string
-			$lp = '(.*)$';
-		}
-		else
-		{
-			if (!isset($strlen))
-			{
-				// see notes
-				$strlen = utf8_strlen($str);
-			}
-
-			// another trivial case
-			if ($offset > $strlen)
-			{
-				return '';
-			}
-
-			if ($length > 0)
-			{
-				// reduce any length that would
-				// go passed the end of the string
-				$length = min($strlen - $offset, $length);
-
-				$lx = (int) ($length / 65535);
-				$ly = $length % 65535;
-
-				// negative length requires a captured group
-				// of length characters
-				if ($lx)
-				{
-					$lp = '(?:.{65535}){' . $lx . '}';
-				}
-				$lp = '(' . $lp . '.{'. $ly . '})';
-			}
-			else if ($length < 0)
-			{
-				if ($length < ($offset - $strlen))
-				{
-					return '';
-				}
-
-				$lx = (int) ((-$length) / 65535);
-				$ly = (-$length) % 65535;
-
-				// negative length requires ... capture everything
-				// except a group of  -length characters
-				// anchored at the tail-end of the string
-				if ($lx)
-				{
-					$lp = '(?:.{65535}){' . $lx . '}';
-				}
-				$lp = '(.*)(?:' . $lp . '.{' . $ly . '})$';
-			}
-		}
-
-		if (!preg_match('#' . $op . $lp . '#us', $str, $match))
-		{
-			return '';
-		}
-
-		return $match[1];
+		return mb_substr($str, $offset, $length);
 	}
+}
 
-	/**
-	* Return the length (in characters) of a UTF-8 string
-	*
-	* @param	string	$text		UTF-8 string
-	* @return	integer				Length (in chars) of given string
-	*/
-	function utf8_strlen($text)
-	{
-		// Since utf8_decode is replacing multibyte characters to ? strlen works fine
-		return strlen(utf8_decode($text));
-	}
+/**
+* Return the length (in characters) of a UTF-8 string
+* @ignore
+*/
+function utf8_strlen($text)
+{
+	return mb_strlen($text, 'utf-8');
 }
 
 /**
@@ -867,7 +415,6 @@ function utf8_recode($string, $encoding)
 
 	// Trigger an error?! Fow now just give bad data :-(
 	trigger_error('Unknown encoding: ' . $encoding, E_USER_ERROR);
-	//return $string; // use utf_normalizer::cleanup() ?
 }
 
 /**
@@ -1606,19 +1153,12 @@ function utf8_case_fold_nfkc($text, $option = 'full')
 		"\xF0\x9D\x9E\xBB"	=> "\xCF\x83",
 		"\xF0\x9D\x9F\x8A"	=> "\xCF\x9D",
 	);
-	global $phpbb_root_path, $phpEx;
 
 	// do the case fold
 	$text = utf8_case_fold($text, $option);
 
-	if (!class_exists('utf_normalizer'))
-	{
-		global $phpbb_root_path, $phpEx;
-		include($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx);
-	}
-
 	// convert to NFKC
-	utf_normalizer::nfkc($text);
+	Normalizer::normalize($text, Normalizer::NFKC);
 
 	// FC_NFKC_Closure, http://www.unicode.org/Public/5.0.0/ucd/DerivedNormalizationProps.txt
 	$text = strtr($text, $fc_nfkc_closure);
@@ -1703,7 +1243,6 @@ function utf8_case_fold_nfc($text, $option = 'full')
 		"\xE1\xBF\xB7"	=> "\xE1\xBF\xB6\xCD\x85",
 		"\xE1\xBF\xBC"	=> "\xCE\xA9\xCD\x85",
 	);
-	global $phpbb_root_path, $phpEx;
 
 	// perform a small trick, avoid further normalization on composed points that contain U+0345 in their decomposition
 	$text = strtr($text, $ypogegrammeni);
@@ -1714,106 +1253,56 @@ function utf8_case_fold_nfc($text, $option = 'full')
 	return $text;
 }
 
-if (extension_loaded('intl'))
+/**
+* wrapper around PHP's native normalizer from intl
+* previously a PECL extension, included in the core since PHP 5.3.0
+* http://php.net/manual/en/normalizer.normalize.php
+*
+* @param	mixed	$strings	a string or an array of strings to normalize
+* @return	mixed				the normalized content, preserving array keys if array given.
+*/
+function utf8_normalize_nfc($strings)
 {
-	/**
-	* wrapper around PHP's native normalizer from intl
-	* previously a PECL extension, included in the core since PHP 5.3.0
-	* http://php.net/manual/en/normalizer.normalize.php
-	*
-	* @param	mixed	$strings	a string or an array of strings to normalize
-	* @return	mixed				the normalized content, preserving array keys if array given.
-	*/
-	function utf8_normalize_nfc($strings)
+	if (empty($strings))
 	{
-		if (empty($strings))
-		{
-			return $strings;
-		}
-
-		if (!is_array($strings))
-		{
-			if (Normalizer::isNormalized($strings))
-			{
-				return $strings;
-			}
-			return (string) Normalizer::normalize($strings);
-		}
-		else
-		{
-			foreach ($strings as $key => $string)
-			{
-				if (is_array($string))
-				{
-					foreach ($string as $_key => $_string)
-					{
-						if (Normalizer::isNormalized($strings[$key][$_key]))
-						{
-							continue;
-						}
-						$strings[$key][$_key] = (string) Normalizer::normalize($strings[$key][$_key]);
-					}
-				}
-				else
-				{
-					if (Normalizer::isNormalized($strings[$key]))
-					{
-						continue;
-					}
-					$strings[$key] = (string) Normalizer::normalize($strings[$key]);
-				}
-			}
-		}
-
 		return $strings;
 	}
-}
-else
-{
-	/**
-	* A wrapper function for the normalizer which takes care of including the class if
-	* required and modifies the passed strings to be in NFC (Normalization Form Composition).
-	*
-	* @param	mixed	$strings	a string or an array of strings to normalize
-	* @return	mixed				the normalized content, preserving array keys if array given.
-	*/
-	function utf8_normalize_nfc($strings)
+
+	if (!is_array($strings))
 	{
-		if (empty($strings))
+		if (Normalizer::isNormalized($strings))
 		{
 			return $strings;
 		}
-
-		if (!class_exists('utf_normalizer'))
-		{
-			global $phpbb_root_path, $phpEx;
-			include($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx);
-		}
-
-		if (!is_array($strings))
-		{
-			utf_normalizer::nfc($strings);
-		}
-		else if (is_array($strings))
+		return (string) Normalizer::normalize($strings);
+	}
+	else
+	{
+		foreach ($strings as $key => $string)
 		{
-			foreach ($strings as $key => $string)
+			if (is_array($string))
 			{
-				if (is_array($string))
+				foreach ($string as $_key => $_string)
 				{
-					foreach ($string as $_key => $_string)
+					if (Normalizer::isNormalized($strings[$key][$_key]))
 					{
-						utf_normalizer::nfc($strings[$key][$_key]);
+						continue;
 					}
+					$strings[$key][$_key] = (string) Normalizer::normalize($strings[$key][$_key]);
 				}
-				else
+			}
+			else
+			{
+				if (Normalizer::isNormalized($strings[$key]))
 				{
-					utf_normalizer::nfc($strings[$key]);
+					continue;
 				}
+				$strings[$key] = (string) Normalizer::normalize($strings[$key]);
 			}
 		}
-
-		return $strings;
 	}
+
+	return $strings;
 }
 
 /**
@@ -1959,50 +1448,3 @@ function utf8_basename($filename)
 
 	return $filename;
 }
-
-/**
-* UTF8-safe str_replace() function
-*
-* @param string $search The value to search for
-* @param string $replace The replacement string
-* @param string $subject The target string
-* @return string The resultant string
-*/
-function utf8_str_replace($search, $replace, $subject)
-{
-	if (!is_array($search))
-	{
-		$search = array($search);
-		if (is_array($replace))
-		{
-			$replace = (string) $replace;
-			trigger_error('Array to string conversion', E_USER_NOTICE);
-		}
-	}
-
-	$length = sizeof($search);
-
-	if (!is_array($replace))
-	{
-		$replace = array_fill(0, $length, $replace);
-	}
-	else
-	{
-		$replace = array_pad($replace, $length, '');
-	}
-
-	for ($i = 0; $i < $length; $i++)
-	{
-		$search_length = utf8_strlen($search[$i]);
-		$replace_length = utf8_strlen($replace[$i]);
-
-		$offset = 0;
-		while (($start = utf8_strpos($subject, $search[$i], $offset)) !== false)
-		{
-			$subject = utf8_substr($subject, 0, $start) . $replace[$i] . utf8_substr($subject, $start + $search_length);
-			$offset = $start + $replace_length;
-		}
-	}
-
-	return $subject;
-}
--- a/index.php
+++ b/index.php
@@ -42,9 +42,10 @@ if (($mark_notification = $request->variable('mark_notification', 0)))
 
 	if (check_link_hash($request->variable('hash', ''), 'mark_notification_read'))
 	{
+		/* @var $phpbb_notifications \phpbb\notification\manager */
 		$phpbb_notifications = $phpbb_container->get('notification_manager');
 
-		$notification = $phpbb_notifications->load_notifications(array(
+		$notification = $phpbb_notifications->load_notifications('notification.method.board', array(
 			'notification_id'	=> $mark_notification,
 		));
 
@@ -99,11 +100,14 @@ else
 }
 $result = $db->sql_query($sql);
 
+/** @var \phpbb\group\helper $group_helper */
+$group_helper = $phpbb_container->get('group_helper');
+
 $legend = array();
 while ($row = $db->sql_fetchrow($result))
 {
 	$colour_text = ($row['group_colour']) ? ' style="color:#' . $row['group_colour'] . '"' : '';
-	$group_name = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'];
+	$group_name = $group_helper->get_name($row['group_name']);
 
 	if ($row['group_name'] == 'BOTS' || ($user->data['user_id'] != ANONYMOUS && !$auth->acl_get('u_viewprofile')))
 	{
--- a/language/en/acp/attachments.php
+++ b/language/en/acp/attachments.php
@@ -70,9 +70,6 @@ $lang = array_merge($lang, array(
 
 	'CAT_FLASH_FILES'			=> 'Flash files',
 	'CAT_IMAGES'				=> 'Images',
-	'CAT_QUICKTIME_FILES'		=> 'Quicktime media files',
-	'CAT_RM_FILES'				=> 'RealMedia media files',
-	'CAT_WM_FILES'				=> 'Windows Media media files',
 	'CHECK_CONTENT'				=> 'Check attachment files',
 	'CHECK_CONTENT_EXPLAIN'		=> 'Some browsers can be tricked to assume an incorrect mimetype for uploaded files. This option ensures that such files likely to cause this are rejected.',
 	'CREATE_GROUP'				=> 'Create new group',
@@ -105,9 +102,6 @@ $lang = array_merge($lang, array(
 	'EXT_GROUP_FLASH_FILES'			=> 'Flash Files',
 	'EXT_GROUP_IMAGES'				=> 'Images',
 	'EXT_GROUP_PLAIN_TEXT'			=> 'Plain Text',
-	'EXT_GROUP_QUICKTIME_MEDIA'		=> 'Quicktime Media',
-	'EXT_GROUP_REAL_MEDIA'			=> 'Real Media',
-	'EXT_GROUP_WINDOWS_MEDIA'		=> 'Windows Media',
 
 	'FILES_GONE'			=> 'Some of the attachments you selected for deletion do not exist. They may have been already deleted. Attachments that did exist were deleted.',
 	'FILES_STATS_WRONG'		=> 'Your file statistics are likely inaccurate and need to be resynchronised. Actual values: number of attachments = %1$d, total size of attachments = %2$s.<br />Click %3$shere%4$s to resynchronise them.',
--- a/language/en/acp/board.php
+++ b/language/en/acp/board.php
@@ -99,6 +99,7 @@ $lang = array_merge($lang, array(
 	'ALLOW_TOPIC_NOTIFY'		=> 'Allow subscribing to topics',
 	'BOARD_PM'					=> 'Private messaging',
 	'BOARD_PM_EXPLAIN'			=> 'Enable private messaging for all users.',
+	'ALLOW_BOARD_NOTIFICATIONS' => 'Allow board notifications',
 ));
 
 // Avatar Settings
@@ -349,6 +350,8 @@ $lang = array_merge($lang, array(
 
 	'COOKIE_DOMAIN'				=> 'Cookie domain',
 	'COOKIE_NAME'				=> 'Cookie name',
+	'COOKIE_NOTICE'				=> 'Cookie notice',
+	'COOKIE_NOTICE_EXPLAIN'		=> 'If enabled a cookie notice will be displayed to users when visiting your board. This might be required by law depending on the content of your board and enabled extensions.',
 	'COOKIE_PATH'				=> 'Cookie path',
 	'COOKIE_SECURE'				=> 'Cookie secure',
 	'COOKIE_SECURE_EXPLAIN'		=> 'If your server is running via SSL set this to enabled else leave as disabled. Having this enabled and not running via SSL will result in server errors during redirects.',
@@ -534,6 +537,8 @@ $lang = array_merge($lang, array(
 	'REFERRER_VALID_EXPLAIN'		=> 'If enabled, the referrer of POST requests will be checked against the host/script path settings. This may cause issues with boards using several domains and or external logins.',
 	'TPL_ALLOW_PHP'					=> 'Allow php in templates',
 	'TPL_ALLOW_PHP_EXPLAIN'			=> 'If this option is enabled, <code>PHP</code> and <code>INCLUDEPHP</code> statements will be recognised and parsed in templates.',
+	'UPLOAD_CERT_VALID'				=> 'Validate upload certificate',
+	'UPLOAD_CERT_VALID_EXPLAIN'		=> 'If enabled, certificates of remote uploads will be validated. This requires the CA bundle to be defined by the <samp>openssl.cafile</samp> or <samp>curl.cainfo</samp> setting in your php.ini.',
 ));
 
 // Email Settings
@@ -558,6 +563,8 @@ $lang = array_merge($lang, array(
 	'EMAIL_SIG_EXPLAIN'				=> 'This text will be attached to all emails the board sends.',
 	'ENABLE_EMAIL'					=> 'Enable board-wide emails',
 	'ENABLE_EMAIL_EXPLAIN'			=> 'If this is set to disabled no emails will be sent by the board at all. <em>Note the user and admin account activation settings require this setting to be enabled. If currently using “user” or “admin” activation in the activation settings, disabling this setting will disable registration.</em>',
+	'SEND_TEST_EMAIL'				=> 'Send a test email',
+	'SEND_TEST_EMAIL_EXPLAIN'		=> 'This will send a test email to the address defined in your account.',
 	'SMTP_AUTH_METHOD'				=> 'Authentication method for SMTP',
 	'SMTP_AUTH_METHOD_EXPLAIN'		=> 'Only used if a username/password is set, ask your provider if you are unsure which method to use.',
 	'SMTP_CRAM_MD5'					=> 'CRAM-MD5',
@@ -574,6 +581,7 @@ $lang = array_merge($lang, array(
 	'SMTP_SETTINGS'					=> 'SMTP settings',
 	'SMTP_USERNAME'					=> 'SMTP username',
 	'SMTP_USERNAME_EXPLAIN'			=> 'Only enter a username if your SMTP server requires it.',
+	'TEST_EMAIL_SENT'				=> 'The test email has been sent.<br />If you don’t receive it, please check your emails configuration.<br /><br />If you require assistance, please visit the <a href="https://www.phpbb.com/community/">phpBB support forums</a>.',
 	'USE_SMTP'						=> 'Use SMTP server for email',
 	'USE_SMTP_EXPLAIN'				=> 'Select “Yes” if you want or have to send email via a named server instead of the local mail function.',
 ));
--- a/language/en/acp/common.php
+++ b/language/en/acp/common.php
@@ -108,6 +108,8 @@ $lang = array_merge($lang, array(
 	'ACP_GROUPS_PERMISSIONS'		=> 'Group permissions',
 	'ACP_GROUPS_POSITION'			=> 'Manage group positions',
 
+	'ACP_HELP_PHPBB'			=> 'Help support phpBB',
+
 	'ACP_ICONS'					=> 'Topic icons',
 	'ACP_ICONS_SMILIES'			=> 'Topic icons/smilies',
 	'ACP_INACTIVE_USERS'		=> 'Inactive users',
@@ -167,7 +169,6 @@ $lang = array_merge($lang, array(
 	'ACP_SEARCH_SETTINGS'		=> 'Search settings',
 
 	'ACP_SECURITY_SETTINGS'		=> 'Security settings',
-	'ACP_SEND_STATISTICS'		=> 'Send statistical information',
 	'ACP_SERVER_CONFIGURATION'	=> 'Server configuration',
 	'ACP_SERVER_SETTINGS'		=> 'Server settings',
 	'ACP_SIGNATURE_SETTINGS'	=> 'Signature settings',
@@ -225,12 +226,26 @@ $lang = array_merge($lang, array(
 
 	'BACK'					=> 'Back',
 
+	'CANNOT_CHANGE_FILE_GROUP'	=> 'Unable to change file group',
+	'CANNOT_CHANGE_FILE_PERMISSIONS'	=> 'Unable to change file permissions',
+	'CANNOT_COPY_FILES'		=> 'Unable to copy files',
+	'CANNOT_CREATE_SYMLINK'	=> 'Unable to create a symlink',
+	'CANNOT_DELETE_FILES'	=> 'Unable to delete files from the system',
+	'CANNOT_DUMP_FILE'		=> 'Unable to dump file',
+	'CANNOT_MIRROR_DIRECTORY'	=> 'Unable to mirror directory',
+	'CANNOT_RENAME_FILE'	=> 'Unable to rename a file from the system',
+	'CANNOT_TOUCH_FILES'	=> 'Unable to determine if the file exists',
+
+	'CONTAINER_EXCEPTION' => 'phpBB encountered an error building the container due to an installed extension. For this reason, all extensions have been temporarily disabled. Please try purging your forum cache. All extensions will automatically be re-enabled once the container error is resolved. If this error continues, please visit <a href="https://www.phpbb.com/support">phpBB.com</a> for support.',
+	'EXCEPTION' => 'Exception',
+
 	'COLOUR_SWATCH'			=> 'Web-safe colour swatch',
 	'CONFIG_UPDATED'		=> 'Configuration updated successfully.',
 	'CRON_LOCK_ERROR'		=> 'Could not obtain cron lock.',
 	'CRON_NO_SUCH_TASK'		=> 'Could not find cron task “%s”.',
 	'CRON_NO_TASK'			=> 'No cron tasks need to be run right now.',
 	'CRON_NO_TASKS'			=> 'No cron tasks could be found.',
+	'CURRENT_VERSION'		=> 'Current version',
 
 	'DEACTIVATE'				=> 'Deactivate',
 	'DIRECTORY_DOES_NOT_EXIST'	=> 'The entered path “%s” does not exist.',
@@ -256,6 +271,7 @@ $lang = array_merge($lang, array(
 	'IP'					=> 'User IP',
 	'IP_HOSTNAME'			=> 'IP addresses or hostnames',
 
+	'LATEST_VERSION'		=> 'Latest version',
 	'LOAD_NOTIFICATIONS'			=> 'Display Notifications',
 	'LOAD_NOTIFICATIONS_EXPLAIN'	=> 'Display the notifications list on every page (typically in the header).',
 	'LOGGED_IN_AS'			=> 'You are logged in as:',
@@ -288,7 +304,9 @@ $lang = array_merge($lang, array(
 	'PERMISSIONS_TRANSFERRED_EXPLAIN'	=> 'You currently have the permissions from %1$s. You are able to browse the board with this user’s permissions, but not access the administration control panel since admin permissions were not transferred. You can <a href="%2$s"><strong>revert to your permission set</strong></a> at any time.',
 	'PROCEED_TO_ACP'					=> '%sProceed to the ACP%s',
 
+	'RELEASE_ANNOUNCEMENT'		=> 'Announcement',
 	'REMIND'							=> 'Remind',
+	'REPARSE_LOCK_ERROR'				=> 'Reparsing is already in progress by another process.',
 	'RESYNC'							=> 'Resynchronise',
 
 	'RUNNING_TASK'			=> 'Running task: %s.',
@@ -310,6 +328,10 @@ $lang = array_merge($lang, array(
 	'USERNAMES_EXPLAIN'		=> 'Place each username on a separate line.',
 	'USER_CONTROL_PANEL'	=> 'User Control Panel',
 
+	'UPDATE_NEEDED'			=> 'The board is not up to date.',
+	'UPDATE_NOT_NEEDED'		=> 'The board is up to date.',
+	'UPDATES_AVAILABLE'		=> 'Updates available:',
+
 	'WARNING'				=> 'Warning',
 ));
 
@@ -420,6 +442,11 @@ $lang = array_merge($lang, array(
 	'VALUE'						=> 'Value',
 	'VERSIONCHECK_FAIL'			=> 'Failed to obtain latest version information.',
 	'VERSIONCHECK_FORCE_UPDATE'	=> 'Re-Check version',
+	'VERSION_CHECK'				=> 'Version check',
+	'VERSION_CHECK_EXPLAIN'		=> 'Checks to see if your phpBB installation is up to date.',
+	'VERSION_NOT_UP_TO_DATE_ACP'	=> 'Your phpBB installation is not up to date.<br />Below is a link to the release announcement, which contains more information as well as instructions on updating.',
+	'VERSION_NOT_UP_TO_DATE_TITLE'	=> 'Your phpBB installation is not up to date.',
+	'VERSION_UP_TO_DATE_ACP'	=> 'Your phpBB installation is up to date. There are no updates available at this time.',
 	'VIEW_ADMIN_LOG'			=> 'View administrator log',
 	'VIEW_INACTIVE_USERS'		=> 'View inactive users',
 
@@ -452,16 +479,18 @@ $lang = array_merge($lang, array(
 	'USER_IS_INACTIVE'		=> 'User is inactive',
 ));
 
-// Send statistics page
+// Help support phpBB page
 $lang = array_merge($lang, array(
 	'EXPLAIN_SEND_STATISTICS'	=> 'Please send information about your server and board configurations to phpBB for statistical analysis. All information that could identify you or your website has been removed - the data is entirely <strong>anonymous</strong>. We base decisions about future phpBB versions on this information. The statistics are made available publically. We also share this data with the PHP project, the programming language phpBB is made with.',
 	'EXPLAIN_SHOW_STATISTICS'	=> 'Using the button below you can preview all variables that will be transmitted.',
 	'DONT_SEND_STATISTICS'		=> 'Return to the ACP if you do not wish to send statistical information to phpBB.',
 	'GO_ACP_MAIN'				=> 'Go to the ACP start page',
 	'HIDE_STATISTICS'			=> 'Hide details',
-	'SEND_STATISTICS'			=> 'Send statistical information',
+	'SEND_STATISTICS'			=> 'Send statistics',
+	'SEND_STATISTICS_LONG'		=> 'Send statistical information',
 	'SHOW_STATISTICS'			=> 'Show details',
 	'THANKS_SEND_STATISTICS'	=> 'Thank you for submitting your information.',
+	'FAIL_SEND_STATISTICS'		=> 'phpBB was unable to send statistics',
 ));
 
 // Log Entries
@@ -794,4 +823,5 @@ $lang = array_merge($lang, array(
 	'LOG_EXT_ENABLE'	=> '<strong>Extension enabled</strong><br />» %s',
 	'LOG_EXT_DISABLE'	=> '<strong>Extension disabled</strong><br />» %s',
 	'LOG_EXT_PURGE'		=> '<strong>Extension’s data deleted</strong><br />» %s',
+	'LOG_EXT_UPDATE'	=> '<strong>Extension updated</strong><br />» %s',
 ));
--- a/language/en/acp/extensions.php
+++ b/language/en/acp/extensions.php
@@ -43,6 +43,7 @@ $lang = array_merge($lang, array(
 	'EXTENSION_NOT_AVAILABLE'	=> 'The selected extension is not available for this board, please verify your phpBB and PHP versions are allowed (see the details page).',
 	'EXTENSION_DIR_INVALID'		=> 'The selected extension has an invalid directory structure and cannot be enabled.',
 	'EXTENSION_NOT_ENABLEABLE'	=> 'The selected extension cannot be enabled, please verify the extension’s requirements.',
+	'EXTENSION_NOT_INSTALLED'	=> 'The extension %s is not available. Please check that you have installed it correctly.',
 
 	'DETAILS'				=> 'Details',
 
--- a/language/en/acp/groups.php
+++ b/language/en/acp/groups.php
@@ -83,7 +83,7 @@ $lang = array_merge($lang, array(
 	'GROUP_MEMBERS'					=> 'Group members',
 	'GROUP_MEMBERS_EXPLAIN'			=> 'This is a complete listing of all the members of this usergroup. It includes separate sections for leaders, pending and existing members. From here you can manage all aspects of who has membership of this group and what their role is. To remove a leader but keep them in the group use Demote rather than delete. Similarly use Promote to make an existing member a leader.',
 	'GROUP_MESSAGE_LIMIT'			=> 'Group private message limit per folder',
-	'GROUP_MESSAGE_LIMIT_EXPLAIN'	=> 'This setting overrides the per-user folder message limit. A value of 0 means the user default limit will be used.',
+	'GROUP_MESSAGE_LIMIT_EXPLAIN'	=> 'This setting overrides the per-user folder message limit. The maximum for all groups of the user is used to determine the actual value.<br />Set this value to 0 to overwrite the setting for all users of this group with the board-wide setting.',
 	'GROUP_MODS_ADDED'				=> 'New group leaders added successfully.',
 	'GROUP_MODS_DEMOTED'			=> 'Group leaders demoted successfully.',
 	'GROUP_MODS_PROMOTED'			=> 'Group members promoted successfully.',
@@ -92,7 +92,7 @@ $lang = array_merge($lang, array(
 	'GROUP_OPEN'					=> 'Open',
 	'GROUP_PENDING'					=> 'Pending members',
 	'GROUP_MAX_RECIPIENTS'			=> 'Maximum number of allowed recipients per private message',
-	'GROUP_MAX_RECIPIENTS_EXPLAIN'	=> 'The maximum number of allowed recipients in a private message. If 0 is entered, the board-wide setting is used.',
+	'GROUP_MAX_RECIPIENTS_EXPLAIN'	=> 'The maximum number of allowed recipients in a private message.  The maximum for all groups of the user is used to determine the actual value.<br />Set this value to 0 to overwrite the setting for all users of this group with the board-wide setting.',
 	'GROUP_OPTIONS_SAVE'			=> 'Group wide options',
 	'GROUP_PROMOTE'					=> 'Promote to group leader',
 	'GROUP_RANK'					=> 'Group rank',
@@ -130,6 +130,8 @@ $lang = array_merge($lang, array(
 	'NO_USERS_ADDED'			=> 'No users were added to the group.',
 	'NO_VALID_USERS'			=> 'You haven’t entered any users eligible for that action.',
 
+	'PENDING_MEMBERS'			=> 'Pending',
+
 	'SELECT_GROUP'				=> 'Select a group',
 	'SPECIAL_GROUPS'			=> 'Pre-defined groups',
 	'SPECIAL_GROUPS_EXPLAIN'	=> 'Pre-defined groups are special groups, they cannot be deleted or directly modified. However you can still add users and alter basic settings.',
--- a/language/en/acp/permissions_phpbb.php
+++ b/language/en/acp/permissions_phpbb.php
@@ -120,6 +120,7 @@ $lang = array_merge($lang, array(
 	'ACL_F_POST'		=> 'Can start new topics',
 	'ACL_F_STICKY'		=> 'Can post stickies',
 	'ACL_F_ANNOUNCE'	=> 'Can post announcements',
+	'ACL_F_ANNOUNCE_GLOBAL'	=> 'Can post global announcements',
 	'ACL_F_REPLY'		=> 'Can reply to topics',
 	'ACL_F_EDIT'		=> 'Can edit own posts',
 	'ACL_F_DELETE'		=> 'Can permanently delete own posts',
--- a/language/en/captcha_recaptcha.php
+++ b/language/en/captcha_recaptcha.php
@@ -40,13 +40,13 @@ $lang = array_merge($lang, array(
 	'RECAPTCHA_LANG'				=> 'en',
 	'RECAPTCHA_NOT_AVAILABLE'		=> 'In order to use reCaptcha, you must create an account on <a href="http://www.google.com/recaptcha">www.google.com/recaptcha</a>.',
 	'CAPTCHA_RECAPTCHA'				=> 'reCaptcha',
-	'RECAPTCHA_INCORRECT'			=> 'The visual confirmation code you submitted was incorrect',
+	'RECAPTCHA_INCORRECT'			=> 'The solution you provided was incorrect',
+	'RECAPTCHA_NOSCRIPT'			=> 'Please enable JavaScript in your browser to load the challenge.',
 
 	'RECAPTCHA_PUBLIC'				=> 'Public reCaptcha key',
 	'RECAPTCHA_PUBLIC_EXPLAIN'		=> 'Your public reCaptcha key. Keys can be obtained on <a href="http://www.google.com/recaptcha">www.google.com/recaptcha</a>.',
 	'RECAPTCHA_PRIVATE'				=> 'Private reCaptcha key',
 	'RECAPTCHA_PRIVATE_EXPLAIN'		=> 'Your private reCaptcha key. Keys can be obtained on <a href="http://www.google.com/recaptcha">www.google.com/recaptcha</a>.',
 
-	'RECAPTCHA_EXPLAIN'				=> 'In an effort to prevent automatic submissions, we require that you type the text displayed into the field underneath.',
-	'RECAPTCHA_SOCKET_ERROR'		=> 'There was a problem connecting to the RECAPTCHA service: could not open socket. Try again later.',
+	'RECAPTCHA_EXPLAIN'				=> 'In an effort to prevent automatic submissions, we require that you complete the following challenge.',
 ));
--- a/language/en/cli.php
+++ b/language/en/cli.php
@@ -50,7 +50,9 @@ $lang = array_merge($lang, array(
 	'CLI_DESCRIPTION_CRON_LIST'					=> 'Prints a list of ready and unready cron jobs.',
 	'CLI_DESCRIPTION_CRON_RUN'					=> 'Runs all ready cron tasks.',
 	'CLI_DESCRIPTION_CRON_RUN_ARGUMENT_1'		=> 'Name of the task to be run',
+	'CLI_DESCRIPTION_DB_LIST'					=> 'List all installed and available migrations.',
 	'CLI_DESCRIPTION_DB_MIGRATE'				=> 'Updates the database by applying migrations.',
+	'CLI_DESCRIPTION_DB_REVERT'					=> 'Revert a migration.',
 	'CLI_DESCRIPTION_DELETE_CONFIG'				=> 'Deletes a configuration option',
 	'CLI_DESCRIPTION_DISABLE_EXTENSION'			=> 'Disables the specified extension.',
 	'CLI_DESCRIPTION_ENABLE_EXTENSION'			=> 'Enables the specified extension.',
@@ -58,12 +60,53 @@ $lang = array_merge($lang, array(
 	'CLI_DESCRIPTION_GET_CONFIG'				=> 'Gets a configuration option’s value',
 	'CLI_DESCRIPTION_INCREMENT_CONFIG'			=> 'Increments a configuration option’s integer value',
 	'CLI_DESCRIPTION_LIST_EXTENSIONS'			=> 'Lists all extensions in the database and on the filesystem.',
+
+	'CLI_DESCRIPTION_OPTION_ENV'				=> 'The Environment name.',
 	'CLI_DESCRIPTION_OPTION_SAFE_MODE'			=> 'Run in Safe Mode (without extensions).',
 	'CLI_DESCRIPTION_OPTION_SHELL'				=> 'Launch the shell.',
+
 	'CLI_DESCRIPTION_PURGE_EXTENSION'			=> 'Purges the specified extension.',
-	'CLI_DESCRIPTION_RECALCULATE_EMAIL_HASH'	=> 'Recalculates the user_email_hash column of the users table.',
-	'CLI_DESCRIPTION_SET_ATOMIC_CONFIG'			=> 'Sets a configuration option’s value only if the old matches the current value',
-	'CLI_DESCRIPTION_SET_CONFIG'				=> 'Sets a configuration option’s value',
+
+	'CLI_DESCRIPTION_REPARSER_LIST'						=> 'Lists the types of text that can be reparsed.',
+	'CLI_DESCRIPTION_REPARSER_AVAILABLE'				=> 'Available reparsers:',
+	'CLI_DESCRIPTION_REPARSER_REPARSE'					=> 'Reparses stored text with the current text_formatter services.',
+	'CLI_DESCRIPTION_REPARSER_REPARSE_ARG_1'			=> 'Type of text to reparse. Leave blank to reparse everything.',
+	'CLI_DESCRIPTION_REPARSER_REPARSE_OPT_DRY_RUN'		=> 'Do not save any changes; just print what would happen',
+	'CLI_DESCRIPTION_REPARSER_REPARSE_OPT_RANGE_MIN'	=> 'Lowest record ID to process',
+	'CLI_DESCRIPTION_REPARSER_REPARSE_OPT_RANGE_MAX'	=> 'Highest record ID to process',
+	'CLI_DESCRIPTION_REPARSER_REPARSE_OPT_RANGE_SIZE'	=> 'Approximate number of records to process at a time',
+	'CLI_DESCRIPTION_REPARSER_REPARSE_OPT_RESUME'		=> 'Start reparsing where the last execution stopped',
+
+	'CLI_DESCRIPTION_RECALCULATE_EMAIL_HASH'			=> 'Recalculates the user_email_hash column of the users table.',
+
+	'CLI_DESCRIPTION_SET_ATOMIC_CONFIG'					=> 'Sets a configuration option’s value only if the old matches the current value',
+	'CLI_DESCRIPTION_SET_CONFIG'						=> 'Sets a configuration option’s value',
+
+	'CLI_DESCRIPTION_THUMBNAIL_DELETE'					=> 'Delete all existing thumbnails.',
+	'CLI_DESCRIPTION_THUMBNAIL_GENERATE'				=> 'Generate all missing thumbnails.',
+	'CLI_DESCRIPTION_THUMBNAIL_RECREATE'				=> 'Recreate all thumbnails.',
+
+	'CLI_DESCRIPTION_UPDATE_CHECK'					=> 'Check if the board is up to date.',
+	'CLI_DESCRIPTION_UPDATE_CHECK_ARGUMENT_1'		=> 'Name of the extension to check (if all, checks all the extensions)',
+	'CLI_DESCRIPTION_UPDATE_CHECK_OPTION_CACHE'		=> 'Run check command with cache.',
+	'CLI_DESCRIPTION_UPDATE_CHECK_OPTION_STABILITY'	=> 'Run command choosing to check only stable or unstable versions.',
+
+	'CLI_ERROR_INVALID_STABILITY' => '"%s" is not a valid stability.',
+
+	'CLI_DESCRIPTION_USER_ACTIVATE'				=> 'Activate (or deactivate) a user account.',
+	'CLI_DESCRIPTION_USER_ACTIVATE_USERNAME'	=> 'Username of the account to activate.',
+	'CLI_DESCRIPTION_USER_ACTIVATE_DEACTIVATE'	=> 'Deactivate the user’s account',
+	'CLI_DESCRIPTION_USER_ACTIVATE_ACTIVE'		=> 'The user is already active.',
+	'CLI_DESCRIPTION_USER_ACTIVATE_INACTIVE'	=> 'The user is already inactive.',
+	'CLI_DESCRIPTION_USER_ADD'					=> 'Add a new user.',
+	'CLI_DESCRIPTION_USER_ADD_OPTION_USERNAME'	=> 'Username of the new user',
+	'CLI_DESCRIPTION_USER_ADD_OPTION_PASSWORD'	=> 'Password of the new user',
+	'CLI_DESCRIPTION_USER_ADD_OPTION_EMAIL'		=> 'E-mail address of the new user',
+	'CLI_DESCRIPTION_USER_ADD_OPTION_NOTIFY'	=> 'Send account activation email to the new user (not sent by default)',
+	'CLI_DESCRIPTION_USER_DELETE'				=> 'Delete a user account.',
+	'CLI_DESCRIPTION_USER_DELETE_USERNAME'		=> 'Username of the user to delete',
+	'CLI_DESCRIPTION_USER_DELETE_OPTION_POSTS'	=> 'Delete all posts by the user. Without this option, the user’s posts will be retained.',
+	'CLI_DESCRIPTION_USER_RECLEAN'				=> 'Re-clean usernames.',
 
 	'CLI_EXTENSION_DISABLE_FAILURE'		=> 'Could not disable extension %s',
 	'CLI_EXTENSION_DISABLE_SUCCESS'		=> 'Successfully disabled extension %s',
@@ -72,15 +115,55 @@ $lang = array_merge($lang, array(
 	'CLI_EXTENSION_NAME'				=> 'Name of the extension',
 	'CLI_EXTENSION_PURGE_FAILURE'		=> 'Could not purge extension %s',
 	'CLI_EXTENSION_PURGE_SUCCESS'		=> 'Successfully purged extension %s',
+	'CLI_EXTENSION_UPDATE_FAILURE'		=> 'Could not update extension %s',
+	'CLI_EXTENSION_UPDATE_SUCCESS'		=> 'Successfully updated extension %s',
 	'CLI_EXTENSION_NOT_FOUND'			=> 'No extensions were found.',
 	'CLI_EXTENSIONS_AVAILABLE'			=> 'Available',
 	'CLI_EXTENSIONS_DISABLED'			=> 'Disabled',
 	'CLI_EXTENSIONS_ENABLED'			=> 'Enabled',
 
 	'CLI_FIXUP_RECALCULATE_EMAIL_HASH_SUCCESS'	=> 'Successfully recalculated all email hashes.',
+
+	'CLI_MIGRATION_NAME'					=> 'Migration name, including the namespace (use forward slashes instead of backslashes to avoid problems).',
+	'CLI_MIGRATIONS_AVAILABLE'				=> 'Available migrations',
+	'CLI_MIGRATIONS_INSTALLED'				=> 'Installed migrations',
+	'CLI_MIGRATIONS_ONLY_AVAILABLE'		    => 'Show only available migrations',
+	'CLI_MIGRATIONS_EMPTY'                  => 'No migrations.',
+
+	'CLI_REPARSER_REPARSE_REPARSING'		=> 'Reparsing %1$s (range %2$d..%3$d)',
+	'CLI_REPARSER_REPARSE_REPARSING_START'	=> 'Reparsing %s...',
+	'CLI_REPARSER_REPARSE_SUCCESS'			=> 'Reparsing ended with success',
+
+	// In all the case %1$s is the logical name of the file and %2$s the real name on the filesystem
+	// eg: big_image.png (2_a51529ae7932008cf8454a95af84cacd) generated.
+	'CLI_THUMBNAIL_DELETED'		=> '%1$s (%2$s) deleted.',
+	'CLI_THUMBNAIL_DELETING'	=> 'Deleting thumbnails',
+	'CLI_THUMBNAIL_SKIPPED'		=> '%1$s (%2$s) skipped.',
+	'CLI_THUMBNAIL_GENERATED'	=> '%1$s (%2$s) generated.',
+	'CLI_THUMBNAIL_GENERATING'	=> 'Generating thumbnails',
+	'CLI_THUMBNAIL_GENERATING_DONE'	=> 'All thumbnails have been regenerated.',
+	'CLI_THUMBNAIL_DELETING_DONE'	=> 'All thumbnails have been deleted.',
+
+	'CLI_THUMBNAIL_NOTHING_TO_GENERATE'	=> 'No thumbnails to generate.',
+	'CLI_THUMBNAIL_NOTHING_TO_DELETE'	=> 'No thumbnails to delete.',
+
+	'CLI_USER_ADD_SUCCESS'		=> 'Successfully added user %s.',
+	'CLI_USER_DELETE_CONFIRM'	=> 'Are you sure you want to delete ‘%s’? [y/N]',
+	'CLI_USER_RECLEAN_START'	=> 'Re-cleaning usernames',
+	'CLI_USER_RECLEAN_DONE'		=> [
+		0	=> 'Re-cleaning complete. No usernames needed to be cleaned.',
+		1	=> 'Re-cleaning complete. %d username was cleaned.',
+		2	=> 'Re-cleaning complete. %d usernames were cleaned.',
+	],
 ));
 
 // Additional help for commands.
 $lang = array_merge($lang, array(
 	'CLI_HELP_CRON_RUN'			=> $lang['CLI_DESCRIPTION_CRON_RUN'] . ' Optionally you can specify a cron task name to run only the specified cron task.',
+	'CLI_HELP_USER_ACTIVATE'	=> 'Activate a user account, or deactivate an account using the <info>--deactivate</info> option.
+To optionally send an activation email to the user, use the <info>--send-email</info> option.',
+	'CLI_HELP_USER_ADD'			=> 'The <info>%command.name%</info> command adds a new user:
+If this command is run without options, you will be prompted to enter them.
+To optionally send an email to the new user, use the <info>--send-email</info> option.',
+	'CLI_HELP_USER_RECLEAN'		=> 'Re-clean usernames will check all stored usernames and ensure clean versions are also stored. Cleaned usernames are a case insensitive form, NFC normalized and transformed to ASCII.',
 ));
--- a/language/en/common.php
+++ b/language/en/common.php
@@ -81,8 +81,9 @@ $lang = array_merge($lang, array(
 	'ALL_FORUMS'					=> 'All forums',
 	'ALL_MESSAGES'					=> 'All messages',
 	'ALL_POSTS'						=> 'All posts',
-	'ALL_TIMES'						=> 'All times are <abbr title="%2$s">%1$s</abbr>',
+	'ALL_TIMES'						=> 'All times are <span title="%2$s">%1$s</span>',
 	'ALL_TOPICS'					=> 'All Topics',
+	'ALT_TEXT'						=> 'Alternative text',
 	'AND'							=> 'And',
 	'ARE_WATCHING_FORUM'			=> 'You have subscribed to be notified of new posts in this forum.',
 	'ARE_WATCHING_TOPIC'			=> 'You have subscribed to be notified of new posts in this topic.',
@@ -97,6 +98,7 @@ $lang = array_merge($lang, array(
 	'AUTH_PROVIDER_OAUTH_SERVICE_BITLY'						=> 'Bitly',
 	'AUTH_PROVIDER_OAUTH_SERVICE_FACEBOOK'					=> 'Facebook',
 	'AUTH_PROVIDER_OAUTH_SERVICE_GOOGLE'					=> 'Google',
+	'AUTH_PROVIDER_OAUTH_SERVICE_TWITTER'					=> 'Twitter',
 	'AUTH_PROVIDER_OAUTH_TOKEN_ERROR_NOT_STORED'			=> 'OAuth token not stored.',
 	'AUTH_PROVIDER_OAUTH_TOKEN_ERROR_INCORRECTLY_STORED'	=> 'OAuth token incorrectly stored.',
 	'AVATAR_DISALLOWED_CONTENT'		=> 'The upload was rejected because the uploaded file was identified as a possible attack vector.',
@@ -105,11 +107,13 @@ $lang = array_merge($lang, array(
 	'AVATAR_EMPTY_FILEUPLOAD'		=> 'The uploaded avatar file is empty.',
 	'AVATAR_INVALID_FILENAME'		=> '%s is an invalid filename.',
 	'AVATAR_NOT_UPLOADED'			=> 'Avatar could not be uploaded.',
+	'AVATAR_NO_TEMP_DIR'			=> 'Temporary folder could not be found or is not writable.',
 	'AVATAR_NO_SIZE'				=> 'The width or height of the linked avatar could not be determined. Please enter them manually.',
 	'AVATAR_PARTIAL_UPLOAD'			=> 'The specified file was only partially uploaded.',
 	'AVATAR_PHP_SIZE_NA'			=> 'The avatar’s filesize is too large.<br />The maximum allowed filesize set in php.ini could not be determined.',
 	'AVATAR_PHP_SIZE_OVERRUN'		=> 'The avatar’s filesize is too large. The maximum allowed upload size is %1$d %2$s.<br />Please note this is set in php.ini and cannot be overridden.',
 	'AVATAR_REMOTE_UPLOAD_TIMEOUT'		=> 'The specified avatar could not be uploaded because the request timed out.',
+	'AVATAR_PHP_UPLOAD_STOPPED'		=> 'A PHP extension has stopped the file upload.',
 	'AVATAR_URL_INVALID'			=> 'The URL you specified is invalid.',
 	'AVATAR_URL_NOT_FOUND'			=> 'The file specified could not be found.',
 	'AVATAR_WRONG_FILESIZE'			=> 'The avatar’s filesize must be between 0 and %1$d %2$s.',
@@ -174,6 +178,9 @@ $lang = array_merge($lang, array(
 	'CONTACT'				=> 'Contact',
 	'CONTACT_USER'			=> 'Contact %s',
 	'CONTACT_US'			=> 'Contact us',
+	'COOKIE_CONSENT_INFO'	=> 'Learn more',
+	'COOKIE_CONSENT_MSG'	=> 'This website uses cookies to ensure you get the best experience on our website.',
+	'COOKIE_CONSENT_OK'		=> 'Got it!',
 	'COOKIES_DELETED'		=> 'All board cookies successfully deleted.',
 	'CURRENT_TIME'			=> 'It is currently %s',
 
@@ -229,6 +236,7 @@ $lang = array_merge($lang, array(
 	'FACEBOOK'				=> 'Facebook',
 	'FAQ'					=> 'FAQ',
 	'FAQ_EXPLAIN'			=> 'Frequently Asked Questions',
+	'FEATURE_NOT_AVAILABLE' => 'The requested feature is not available on this board.',
 	'FILENAME'				=> 'Filename',
 	'FILESIZE'				=> 'File size',
 	'FILEDATE'				=> 'File date',
@@ -336,6 +344,7 @@ $lang = array_merge($lang, array(
 	'INTERESTS'					=> 'Interests',
 	'INVALID_DIGEST_CHALLENGE'	=> 'Invalid digest challenge.',
 	'INVALID_EMAIL_LOG'			=> '<strong>%s</strong> possibly an invalid email address?',
+	'INVALID_FEED_ATTACHMENTS'	=> 'The selected feed tried fetching attachments with invalid constraints.',
 	'INVALID_PLURAL_RULE'		=> 'The chosen plural rule is invalid. Valid values are integers between 0 and 15.',
 	'IP'						=> 'IP',
 	'IP_BLACKLISTED'			=> 'Your IP %1$s has been blocked because it is blacklisted. For details please see <a href="%2$s">%2$s</a>.',
@@ -448,6 +457,7 @@ $lang = array_merge($lang, array(
 	'NOTIFICATION_FORUM'				=> '<em>Forum:</em> %1$s',
 	'NOTIFICATION_GROUP_REQUEST'		=> '<strong>Group request</strong> from %1$s to join the group %2$s.',
 	'NOTIFICATION_GROUP_REQUEST_APPROVED'	=> '<strong>Group request approved</strong> to join the group %1$s.',
+	'NOTIFICATION_METHOD_INVALID'		=> 'The method "%s" does not refer to a valid notification method.',
 	'NOTIFICATION_PM'					=> '<strong>Private Message</strong> from %1$s:',
 	'NOTIFICATION_POST'					=> array(
 		1	=> '<strong>Reply</strong> from %1$s in topic:',
@@ -553,7 +563,6 @@ $lang = array_merge($lang, array(
 		1	=> '%d pixel',
 		2	=> '%d pixels',
 	),
-	'PLAY_QUICKTIME_FILE'	=> 'Play Quicktime file',
 	'PLEASE_WAIT'			=> 'Please wait.',
 	'PM'					=> 'PM',
 	'PM_REPORTED'			=> 'Click to view report',
@@ -691,10 +700,13 @@ $lang = array_merge($lang, array(
 	'SKYPE'						=> 'Skype',
 	'SMTP_NO_AUTH_SUPPORT'		=> 'SMTP server does not support authentication.',
 	'SORRY_AUTH_READ'			=> 'You are not authorised to read this forum.',
+	'SORRY_AUTH_READ_TOPIC'		=> 'You are not authorised to read this topic.',
 	'SORRY_AUTH_VIEW_ATTACH'	=> 'You are not authorised to download this attachment.',
 	'SORT_BY'					=> 'Sort by',
+	'SORT_DIRECTION'			=> 'Direction',
 	'SORT_JOINED'				=> 'Joined date',
 	'SORT_LOCATION'				=> 'Location',
+	'SORT_OPTIONS'				=> 'Display and sorting options',
 	'SORT_RANK'					=> 'Rank',
 	'SORT_POSTS'				=> 'Posts',
 	'SORT_TOPIC_TITLE'			=> 'Topic title',
@@ -863,7 +875,6 @@ $lang = array_merge($lang, array(
 	'WEBSITE'			=> 'Website',
 	'WHOIS'				=> 'Whois',
 	'WHO_IS_ONLINE'		=> 'Who is online',
-	'WLM'				=> 'WLM',
 	'WRONG_PASSWORD'	=> 'You entered an incorrect password.',
 
 	'WRONG_DATA_COLOUR'			=> 'The colour value you entered is invalid.',
--- /dev/null
+++ b/language/en/email/test.txt
@@ -0,0 +1,9 @@
+Subject: phpBB is correctly configured to send emails
+
+Hello {USERNAME},
+
+Congratulations. If you received this email, phpBB is correctly configured to send emails.
+
+In case you require assistance, please visit the phpBB support forums - https://www.phpbb.com/community/
+
+{EMAIL_SIG}
--- /dev/null
+++ b/language/en/help/bbcode.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+/**
+ * DO NOT CHANGE
+ */
+if (!defined('IN_PHPBB'))
+{
+	exit;
+}
+
+if (empty($lang) || !is_array($lang))
+{
+	$lang = array();
+}
+
+$lang = array_merge($lang, array(
+	'HELP_BBCODE_BLOCK_IMAGES'	=> 'Showing images in posts',
+	'HELP_BBCODE_BLOCK_INTRO'	=> 'Introduction',
+	'HELP_BBCODE_BLOCK_LINKS'	=> 'Creating Links',
+	'HELP_BBCODE_BLOCK_LISTS'	=> 'Generating lists',
+	'HELP_BBCODE_BLOCK_OTHERS'	=> 'Other matters',
+	'HELP_BBCODE_BLOCK_QUOTES'	=> 'Quoting and outputting fixed-width text',
+	'HELP_BBCODE_BLOCK_TEXT'	=> 'Text Formatting',
+
+	'HELP_BBCODE_IMAGES_ATTACHMENT_ANSWER'	=> 'Attachments can now be placed in any part of a post by using the new <strong>[attachment=][/attachment]</strong> BBCode, if the attachments functionality has been enabled by a board administrator and if you are given the appropriate permissions to create attachments. Within the posting screen is a drop-down box (respectively a button) for placing attachments inline.',
+	'HELP_BBCODE_IMAGES_ATTACHMENT_QUESTION'	=> 'Adding attachments into a post',
+	'HELP_BBCODE_IMAGES_BASIC_ANSWER'	=> 'phpBB BBCode incorporates a tag for including images in your posts. Two very important things to remember when using this tag are: many users do not appreciate lots of images being shown in posts and secondly the image you display must already be available on the internet (it cannot exist only on your computer for example, unless you run a webserver!). To display an image you must surround the URL pointing to the image with <strong>[img][/img]</strong> tags. For example:<br /><br /><strong>[img]</strong>https://www.phpbb.com/theme/images/logos/blue/160x52.png<strong>[/img]</strong><br /><br />As noted in the URL section above you can wrap an image in a <strong>[url][/url]</strong> tag if you wish, e.g.<br /><br /><strong>[url=https://www.phpbb.com/][img]</strong>https://www.phpbb.com/theme/images/logos/blue/160x52.png<strong>[/img][/url]</strong><br /><br />would generate:<br /><br /><a href="https://www.phpbb.com/"><img src="https://www.phpbb.com/theme/images/logos/blue/160x52.png" alt="" /></a>',
+	'HELP_BBCODE_IMAGES_BASIC_QUESTION'	=> 'Adding an image to a post',
+
+	'HELP_BBCODE_INTRO_BBCODE_ANSWER'	=> 'BBCode is a special implementation of HTML. Whether you can actually use BBCode in your posts on the forum is determined by the administrator. In addition you can disable BBCode on a per post basis via the posting form. BBCode itself is similar in style to HTML, tags are enclosed in square brackets [ and ] rather than &lt; and &gt; and it offers greater control over what and how something is displayed. Depending on the template you are using you may find adding BBCode to your posts is made much easier through a clickable interface above the message area on the posting form. Even with this you may find the following guide useful.',
+	'HELP_BBCODE_INTRO_BBCODE_QUESTION'	=> 'What is BBCode?',
+
+	'HELP_BBCODE_LINKS_BASIC_ANSWER'	=> 'phpBB BBCode supports a number of ways of creating URIs (Uniform Resource Indicators) better known as URLs.<ul><li>The first of these uses the <strong>[url=][/url]</strong> tag, whatever you type after the = sign will cause the contents of that tag to act as a URL. For example to link to phpBB.com you could use:<br /><br /><strong>[url=https://www.phpbb.com/]</strong>Visit phpBB!<strong>[/url]</strong><br /><br />This would generate the following link, <a href="https://www.phpbb.com/">Visit phpBB!</a> Please notice that the link opens in the same window or a new window depending on the users browser preferences.</li><li>If you want the URL itself displayed as the link you can do this by simply using:<br /><br /><strong>[url]</strong>https://www.phpbb.com/<strong>[/url]</strong><br /><br />This would generate the following link, <a href="https://www.phpbb.com/">https://www.phpbb.com/</a></li><li>Additionally, phpBB features something called <i>Magic Links</i>, this will turn any syntactically correct URL into a link without you needing to specify any tags or even the leading http://. For example typing www.phpbb.com into your message will automatically lead to <a href="http://www.phpbb.com/">www.phpbb.com</a> being output when you view the message.</li><li>The same thing applies equally to email addresses, you can either specify an address explicitly for example:<br /><br /><strong>[email]</strong>no.one@domain.adr<strong>[/email]</strong><br /><br />which will output <a href="mailto:no.one@domain.adr">no.one@domain.adr</a> or you can just type no.one@domain.adr into your message and it will be automatically converted when you view.</li></ul>As with all the BBCode tags you can wrap URLs around any of the other tags such as <strong>[img][/img]</strong> (see next entry), <strong>[b][/b]</strong>, etc. As with the formatting tags it is up to you to ensure the correct open and close order is following, for example:<br /><br /><strong>[url=https://www.phpbb.com/][img]</strong>https://www.phpbb.com/theme/images/logos/blue/160x52.png<strong>[/url][/img]</strong><br /><br />is <span style="text-decoration: underline">not</span> correct which may lead to your post being deleted so take care.',
+	'HELP_BBCODE_LINKS_BASIC_QUESTION'	=> 'Linking to another site',
+
+	'HELP_BBCODE_LISTS_ORDERER_ANSWER'	=> 'The second type of list, an ordered list, gives you control over what is output before each item. To create an ordered list you use <strong>[list=1][/list]</strong> to create a numbered list or alternatively <strong>[list=a][/list]</strong> for an alphabetical list. As with the unordered list, items are specified using <strong>[*]</strong>. For example:<br /><br /><strong>[list=1]</strong><br /><strong>[*]</strong>Go to the shops<br /><strong>[*]</strong>Buy a new computer<br /><strong>[*]</strong>Swear at computer when it crashes<br /><strong>[/list]</strong><br /><br />will generate the following:<ol style="list-style-type: decimal;"><li>Go to the shops</li><li>Buy a new computer</li><li>Swear at computer when it crashes</li></ol>Whereas for an alphabetical list you would use:<br /><br /><strong>[list=a]</strong><br /><strong>[*]</strong>The first possible answer<br /><strong>[*]</strong>The second possible answer<br /><strong>[*]</strong>The third possible answer<br /><strong>[/list]</strong><br /><br />giving<ol style="list-style-type: lower-alpha"><li>The first possible answer</li><li>The second possible answer</li><li>The third possible answer</li></ol><br /><strong>[list=A]</strong><br /><strong>[*]</strong>The first possible answer<br /><strong>[*]</strong>The second possible answer<br /><strong>[*]</strong>The third possible answer<br /><strong>[/list]</strong><br /><br />giving<ol style="list-style-type: upper-alpha"><li>The first possible answer</li><li>The second possible answer</li><li>The third possible answer</li></ol><br /><strong>[list=i]</strong><br /><strong>[*]</strong>The first possible answer<br /><strong>[*]</strong>The second possible answer<br /><strong>[*]</strong>The third possible answer<br /><strong>[/list]</strong><br /><br />giving<ol style="list-style-type: lower-roman"><li>The first possible answer</li><li>The second possible answer</li><li>The third possible answer</li></ol><br /><strong>[list=I]</strong><br /><strong>[*]</strong>The first possible answer<br /><strong>[*]</strong>The second possible answer<br /><strong>[*]</strong>The third possible answer<br /><strong>[/list]</strong><br /><br />giving<ol style="list-style-type: upper-roman"><li>The first possible answer</li><li>The second possible answer</li><li>The third possible answer</li></ol>',
+	'HELP_BBCODE_LISTS_ORDERER_QUESTION'	=> 'Creating an Ordered list',
+	'HELP_BBCODE_LISTS_UNORDERER_ANSWER'	=> 'BBCode supports two types of lists, unordered and ordered. They are essentially the same as their HTML equivalents. An unordered list outputs each item in your list sequentially one after the other indenting each with a bullet character. To create an unordered list you use <strong>[list][/list]</strong> and define each item within the list using <strong>[*]</strong>. For example to list your favourite colours you could use:<br /><br /><strong>[list]</strong><br /><strong>[*]</strong>Red<br /><strong>[*]</strong>Blue<br /><strong>[*]</strong>Yellow<br /><strong>[/list]</strong><br /><br />This would generate the following list:<ul><li>Red</li><li>Blue</li><li>Yellow</li></ul><br />Alternatively you can specify the list’s bullet style using <strong>[list=disc][/list]</strong>, <strong>[list=circle][/list]</strong>, or <strong>[list=square][/list]</strong>.',
+	'HELP_BBCODE_LISTS_UNORDERER_QUESTION'	=> 'Creating an Unordered list',
+
+	'HELP_BBCODE_OTHERS_CUSTOM_ANSWER'	=> 'If you are an administrator on this board and have the proper permissions, you can add further BBCodes through the Custom BBCodes section.',
+	'HELP_BBCODE_OTHERS_CUSTOM_QUESTION'	=> 'Can I add my own tags?',
+
+	'HELP_BBCODE_QUOTES_CODE_ANSWER'	=> 'If you want to output a piece of code or in fact anything that requires a fixed width, e.g. Courier type font you should enclose the text in <strong>[code][/code]</strong> tags, e.g.<br /><br /><strong>[code]</strong>echo &quot;This is some code&quot;;<strong>[/code]</strong><br /><br />All formatting used within <strong>[code][/code]</strong> tags is retained when you later view it. PHP syntax highlighting can be enabled using <strong>[code=php][/code]</strong> and is recommended when posting PHP code samples as it improves readability.',
+	'HELP_BBCODE_QUOTES_CODE_QUESTION'	=> 'Outputting code or fixed width data',
+	'HELP_BBCODE_QUOTES_TEXT_ANSWER'	=> 'There are two ways you can quote text, with a reference or without.<ul><li>When you utilise the Quote function to reply to a post on the board you should notice that the post text is added to the message window enclosed in a <strong>[quote=&quot;&quot;][/quote]</strong> block. This method allows you to quote with a reference to a person or whatever else you choose to put! For example to quote a piece of text Mr. Blobby wrote you would enter:<br /><br /><strong>[quote=&quot;Mr. Blobby&quot;]</strong>The text Mr. Blobby wrote would go here<strong>[/quote]</strong><br /><br />The resulting output will automatically add &quot;Mr. Blobby wrote:&quot; before the actual text. Remember you <strong>must</strong> include the quotation marks &quot;&quot; around the name you are quoting, they are not optional.</li><li>The second method allows you to blindly quote something. To utilise this enclose the text in <strong>[quote][/quote]</strong> tags. When you view the message it will simply show the text within a quotation block.</li></ul>',
+	'HELP_BBCODE_QUOTES_TEXT_QUESTION'	=> 'Quoting text in replies',
+
+	'HELP_BBCODE_TEXT_BASIC_ANSWER'	=> 'BBCode includes tags to allow you to quickly change the basic style of your text. This is achieved in the following ways: <ul><li>To make a piece of text bold enclose it in <strong>[b][/b]</strong>, e.g. <br /><br /><strong>[b]</strong>Hello<strong>[/b]</strong><br /><br />will become <strong>Hello</strong></li><li>For underlining use <strong>[u][/u]</strong>, for example:<br /><br /><strong>[u]</strong>Good Morning<strong>[/u]</strong><br /><br />becomes <span style="text-decoration: underline">Good Morning</span></li><li>To italicise text use <strong>[i][/i]</strong>, e.g.<br /><br />This is <strong>[i]</strong>Great!<strong>[/i]</strong><br /><br />would give This is <i>Great!</i></li></ul>',
+	'HELP_BBCODE_TEXT_BASIC_QUESTION'	=> 'How to create bold, italic and underlined text',
+	'HELP_BBCODE_TEXT_COLOR_ANSWER'	=> 'To alter the colour or size of your text the following tags can be used. Keep in mind that how the output appears will depend on the viewers browser and system: <ul><li>Changing the colour of text is achieved by wrapping it in <strong>[color=][/color]</strong>. You can specify either a recognised colour name (eg. red, blue, yellow, etc.) or the hexadecimal triplet alternative, e.g. #FFFFFF, #000000. For example, to create red text you could use:<br /><br /><strong>[color=red]</strong>Hello!<strong>[/color]</strong><br /><br />or<br /><br /><strong>[color=#FF0000]</strong>Hello!<strong>[/color]</strong><br /><br />Both will output <span style="color:red">Hello!</span></li><li>Changing the text size is achieved in a similar way using <strong>[size=][/size]</strong>. This tag is dependent on the template the user has selected but the recommended format is a numerical value representing the text size in percent, starting at 20 (very small) through to 200 (very large) by default. For example:<br /><br /><strong>[size=30]</strong>SMALL<strong>[/size]</strong><br /><br />will generally be <span style="font-size:30%;">SMALL</span><br /><br />whereas:<br /><br /><strong>[size=200]</strong>HUGE!<strong>[/size]</strong><br /><br />will be <span style="font-size:200%;">HUGE!</span></li></ul>',
+	'HELP_BBCODE_TEXT_COLOR_QUESTION'	=> 'How to change the text colour or size',
+	'HELP_BBCODE_TEXT_COMBINE_ANSWER'	=> 'Yes, of course you can, for example to get someones attention you may write:<br /><br /><strong>[size=200][color=red][b]</strong>LOOK AT ME!<strong>[/b][/color][/size]</strong><br /><br />this would output <span style="color:red;font-size:200%;"><strong>LOOK AT ME!</strong></span><br /><br />We don’t recommend you output lots of text that looks like this though! Remember it is up to you, the poster, to ensure tags are closed correctly. For example the following is incorrect:<br /><br /><strong>[b][u]</strong>This is wrong<strong>[/b][/u]</strong>',
+	'HELP_BBCODE_TEXT_COMBINE_QUESTION'	=> 'Can I combine formatting tags?',
+));
--- /dev/null
+++ b/language/en/help/faq.php
@@ -0,0 +1,186 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+/**
+ * DO NOT CHANGE
+ */
+if (!defined('IN_PHPBB'))
+{
+	exit;
+}
+
+if (empty($lang) || !is_array($lang))
+{
+	$lang = array();
+}
+
+$lang = array_merge($lang, array(
+	'HELP_FAQ_ATTACHMENTS_ALLOWED_ANSWER'	=> 'Each board administrator can allow or disallow certain attachment types. If you are unsure what is allowed to be uploaded, contact the board administrator for assistance.',
+	'HELP_FAQ_ATTACHMENTS_ALLOWED_QUESTION'	=> 'What attachments are allowed on this board?',
+	'HELP_FAQ_ATTACHMENTS_OWN_ANSWER'	=> 'To find your list of attachments that you have uploaded, go to your User Control Panel and follow the links to the attachments section.',
+	'HELP_FAQ_ATTACHMENTS_OWN_QUESTION'	=> 'How do I find all my attachments?',
+
+	'HELP_FAQ_BLOCK_ATTACHMENTS'	=> 'Attachments',
+	'HELP_FAQ_BLOCK_BOOKMARKS'	=> 'Subscriptions and Bookmarks',
+	'HELP_FAQ_BLOCK_FORMATTING'	=> 'Formatting and Topic Types',
+	'HELP_FAQ_BLOCK_FRIENDS'	=> 'Friends and Foes',
+	'HELP_FAQ_BLOCK_GROUPS'	=> 'User Levels and Groups',
+	'HELP_FAQ_BLOCK_ISSUES'	=> 'phpBB Issues',
+	'HELP_FAQ_BLOCK_LOGIN'	=> 'Login and Registration Issues',
+	'HELP_FAQ_BLOCK_PMS'	=> 'Private Messaging',
+	'HELP_FAQ_BLOCK_POSTING'	=> 'Posting Issues',
+	'HELP_FAQ_BLOCK_SEARCH'	=> 'Searching the Forums',
+	'HELP_FAQ_BLOCK_USERSETTINGS'	=> 'User Preferences and settings',
+
+	'HELP_FAQ_BOOKMARKS_DIFFERENCE_ANSWER'	=> 'In phpBB 3.0, bookmarking topics worked much like bookmarking in a web browser. You were not alerted when there was an update. As of phpBB 3.1, bookmarking is more like subscribing to a topic. You can be notified when a bookmarked topic is updated. Subscribing, however, will notify you when there is an update to a topic or forum on the board. Notification options for bookmarks and subscriptions can be configured in the User Control Panel, under “Board preferences”.',
+	'HELP_FAQ_BOOKMARKS_DIFFERENCE_QUESTION'	=> 'What is the difference between bookmarking and subscribing?',
+	'HELP_FAQ_BOOKMARKS_FORUM_ANSWER'	=> 'To subscribe to a specific forum, click the “Subscribe forum” link, at the bottom of page, upon entering the forum.',
+	'HELP_FAQ_BOOKMARKS_FORUM_QUESTION'	=> 'How do I subscribe to specific forums?',
+	'HELP_FAQ_BOOKMARKS_REMOVE_ANSWER'	=> 'To remove your subscriptions, go to your User Control Panel and follow the links to your subscriptions.',
+	'HELP_FAQ_BOOKMARKS_REMOVE_QUESTION'	=> 'How do I remove my subscriptions?',
+	'HELP_FAQ_BOOKMARKS_TOPIC_ANSWER'	=> 'You can bookmark or subscribe to a specific topic by clicking the appropriate link in the “Topic tools” menu, conveniently located near the top and bottom of a topic discussion.<br />Replying to a topic with the “Notify me when a reply is posted” option checked will also subscribe you to the topic.',
+	'HELP_FAQ_BOOKMARKS_TOPIC_QUESTION'	=> 'How do I bookmark or subscribe to specific topics?',
+
+	'HELP_FAQ_FORMATTING_ANNOUNCEMENT_ANSWER'	=> 'Announcements often contain important information for the forum you are currently reading and you should read them whenever possible. Announcements appear at the top of every page in the forum to which they are posted. As with global announcements, announcement permissions are granted by the board administrator.',
+	'HELP_FAQ_FORMATTING_ANNOUNCEMENT_QUESTION'	=> 'What are announcements?',
+	'HELP_FAQ_FORMATTING_BBOCDE_ANSWER'	=> 'BBCode is a special implementation of HTML, offering great formatting control on particular objects in a post. The use of BBCode is granted by the administrator, but it can also be disabled on a per post basis from the posting form. BBCode itself is similar in style to HTML, but tags are enclosed in square brackets [ and ] rather than &lt; and &gt;. For more information on BBCode see the guide which can be accessed from the posting page.',
+	'HELP_FAQ_FORMATTING_BBOCDE_QUESTION'	=> 'What is BBCode?',
+	'HELP_FAQ_FORMATTING_GLOBAL_ANNOUNCE_ANSWER'	=> 'Global announcements contain important information and you should read them whenever possible. They will appear at the top of every forum and within your User Control Panel. Global announcement permissions are granted by the board administrator.',
+	'HELP_FAQ_FORMATTING_GLOBAL_ANNOUNCE_QUESTION'	=> 'What are global announcements?',
+	'HELP_FAQ_FORMATTING_HTML_ANSWER'	=> 'No. It is not possible to post HTML on this board and have it rendered as HTML. Most formatting which can be carried out using HTML can be applied using BBCode instead.',
+	'HELP_FAQ_FORMATTING_HTML_QUESTION'	=> 'Can I use HTML?',
+	'HELP_FAQ_FORMATTING_ICONS_ANSWER'	=> 'Topic icons are author chosen images associated with posts to indicate their content. The ability to use topic icons depends on the permissions set by the board administrator.',
+	'HELP_FAQ_FORMATTING_ICONS_QUESTION'	=> 'What are topic icons?',
+	'HELP_FAQ_FORMATTING_IMAGES_ANSWER'	=> 'Yes, images can be shown in your posts. If the administrator has allowed attachments, you may be able to upload the image to the board. Otherwise, you must link to an image stored on a publicly accessible web server, e.g. http://www.example.com/my-picture.gif. You cannot link to pictures stored on your own PC (unless it is a publicly accessible server) nor images stored behind authentication mechanisms, e.g. hotmail or yahoo mailboxes, password protected sites, etc. To display the image use the BBCode [img] tag.',
+	'HELP_FAQ_FORMATTING_IMAGES_QUESTION'	=> 'Can I post images?',
+	'HELP_FAQ_FORMATTING_LOCKED_ANSWER'	=> 'Locked topics are topics where users can no longer reply and any poll it contained was automatically ended. Topics may be locked for many reasons and were set this way by either the forum moderator or board administrator. You may also be able to lock your own topics depending on the permissions you are granted by the board administrator.',
+	'HELP_FAQ_FORMATTING_LOCKED_QUESTION'	=> 'What are locked topics?',
+	'HELP_FAQ_FORMATTING_SMILIES_ANSWER'	=> 'Smilies, or Emoticons, are small images which can be used to express a feeling using a short code, e.g. :) denotes happy, while :( denotes sad. The full list of emoticons can be seen in the posting form. Try not to overuse smilies, however, as they can quickly render a post unreadable and a moderator may edit them out or remove the post altogether. The board administrator may also have set a limit to the number of smilies you may use within a post.',
+	'HELP_FAQ_FORMATTING_SMILIES_QUESTION'	=> 'What are Smilies?',
+	'HELP_FAQ_FORMATTING_STICKIES_ANSWER'	=> 'Sticky topics within the forum appear below announcements and only on the first page. They are often quite important so you should read them whenever possible. As with announcements and global announcements, sticky topic permissions are granted by the board administrator.',
+	'HELP_FAQ_FORMATTING_STICKIES_QUESTION'	=> 'What are sticky topics?',
+
+	'HELP_FAQ_FRIENDS_BASIC_ANSWER'	=> 'You can use these lists to organise other members of the board. Members added to your friends list will be listed within your User Control Panel for quick access to see their online status and to send them private messages. Subject to template support, posts from these users may also be highlighted. If you add a user to your foes list, any posts they make will be hidden by default.',
+	'HELP_FAQ_FRIENDS_BASIC_QUESTION'	=> 'What are my Friends and Foes lists?',
+	'HELP_FAQ_FRIENDS_MANAGE_ANSWER'	=> 'You can add users to your list in two ways. Within each user’s profile, there is a link to add them to either your Friend or Foe list. Alternatively, from your User Control Panel, you can directly add users by entering their member name. You may also remove users from your list using the same page.',
+	'HELP_FAQ_FRIENDS_MANAGE_QUESTION'	=> 'How can I add / remove users to my Friends or Foes list?',
+
+	'HELP_FAQ_GROUPS_ADMINISTRATORS_ANSWER'	=> 'Administrators are members assigned with the highest level of control over the entire board. These members can control all facets of board operation, including setting permissions, banning users, creating usergroups or moderators, etc., dependent upon the board founder and what permissions he or she has given the other administrators. They may also have full moderator capabilities in all forums, depending on the settings put forth by the board founder.',
+	'HELP_FAQ_GROUPS_ADMINISTRATORS_QUESTION'	=> 'What are Administrators?',
+	'HELP_FAQ_GROUPS_COLORS_ANSWER'	=> 'It is possible for the board administrator to assign a colour to the members of a usergroup to make it easy to identify the members of this group.',
+	'HELP_FAQ_GROUPS_COLORS_QUESTION'	=> 'Why do some usergroups appear in a different colour?',
+	'HELP_FAQ_GROUPS_DEFAULT_ANSWER'	=> 'If you are a member of more than one usergroup, your default is used to determine which group colour and group rank should be shown for you by default. The board administrator may grant you permission to change your default usergroup via your User Control Panel.',
+	'HELP_FAQ_GROUPS_DEFAULT_QUESTION'	=> 'What is a “Default usergroup”?',
+	'HELP_FAQ_GROUPS_MODERATORS_ANSWER'	=> 'Moderators are individuals (or groups of individuals) who look after the forums from day to day. They have the authority to edit or delete posts and lock, unlock, move, delete and split topics in the forum they moderate. Generally, moderators are present to prevent users from going off-topic or posting abusive or offensive material.',
+	'HELP_FAQ_GROUPS_MODERATORS_QUESTION'	=> 'What are Moderators?',
+	'HELP_FAQ_GROUPS_TEAM_ANSWER'	=> 'This page provides you with a list of board staff, including board administrators and moderators and other details such as the forums they moderate.',
+	'HELP_FAQ_GROUPS_TEAM_QUESTION'	=> 'What is “The team” link?',
+	'HELP_FAQ_GROUPS_USERGROUPS_ANSWER'	=> 'Usergroups are groups of users that divide the community into manageable sections board administrators can work with. Each user can belong to several groups and each group can be assigned individual permissions. This provides an easy way for administrators to change permissions for many users at once, such as changing moderator permissions or granting users access to a private forum.',
+	'HELP_FAQ_GROUPS_USERGROUPS_JOIN_ANSWER'	=> 'You can view all usergroups via the “Usergroups” link within your User Control Panel. If you would like to join one, proceed by clicking the appropriate button. Not all groups have open access, however. Some may require approval to join, some may be closed and some may even have hidden memberships. If the group is open, you can join it by clicking the appropriate button. If a group requires approval to join you may request to join by clicking the appropriate button. The user group leader will need to approve your request and may ask why you want to join the group. Please do not harass a group leader if they reject your request; they will have their reasons.',
+	'HELP_FAQ_GROUPS_USERGROUPS_JOIN_QUESTION'	=> 'Where are the usergroups and how do I join one?',
+	'HELP_FAQ_GROUPS_USERGROUPS_LEAD_ANSWER'	=> 'A usergroup leader is usually assigned when usergroups are initially created by a board administrator. If you are interested in creating a usergroup, your first point of contact should be an administrator; try sending a private message.',
+	'HELP_FAQ_GROUPS_USERGROUPS_LEAD_QUESTION'	=> 'How do I become a usergroup leader?',
+	'HELP_FAQ_GROUPS_USERGROUPS_QUESTION'	=> 'What are usergroups?',
+
+	'HELP_FAQ_ISSUES_ADMIN_ANSWER'	=> 'All users of the board can use the “Contact us” form, if the option was enabled by the board administrator.<br />Members of the board can also use the “The team” link.',
+	'HELP_FAQ_ISSUES_ADMIN_QUESTION'	=> 'How do I contact a board administrator?',
+	'HELP_FAQ_ISSUES_FEATURE_ANSWER'	=> 'This software was written by and licensed through phpBB Limited. If you believe a feature needs to be added please visit the <a href="https://www.phpbb.com/ideas/">phpBB Ideas Centre</a>, where you can upvote existing ideas or suggest new features.',
+	'HELP_FAQ_ISSUES_FEATURE_QUESTION'	=> 'Why isn’t X feature available?',
+	'HELP_FAQ_ISSUES_LEGAL_ANSWER'	=> 'Any of the administrators listed on the “The team” page should be an appropriate point of contact for your complaints. If this still gets no response then you should contact the owner of the domain (do a <a href="http://www.google.com/search?q=whois">whois lookup</a>) or, if this is running on a free service (e.g. Yahoo!, free.fr, f2s.com, etc.), the management or abuse department of that service. Please note that the phpBB Limited has <strong>absolutely no jurisdiction</strong> and cannot in any way be held liable over how, where or by whom this board is used. Do not contact the phpBB Limited in relation to any legal (cease and desist, liable, defamatory comment, etc.) matter <strong>not directly related</strong> to the phpBB.com website or the discrete software of phpBB itself. If you do email phpBB Limited <strong>about any third party</strong> use of this software then you should expect a terse response or no response at all.',
+	'HELP_FAQ_ISSUES_LEGAL_QUESTION'	=> 'Who do I contact about abusive and/or legal matters related to this board?',
+	'HELP_FAQ_ISSUES_WHOIS_PHPBB_ANSWER'	=> 'This software (in its unmodified form) is produced, released and is copyright <a href="https://www.phpbb.com/">phpBB Limited</a>. It is made available under the GNU General Public License, version 2 (GPL-2.0) and may be freely distributed. See <a href="https://www.phpbb.com/about/">About phpBB</a> for more details.',
+	'HELP_FAQ_ISSUES_WHOIS_PHPBB_QUESTION'	=> 'Who wrote this bulletin board?',
+
+	'HELP_FAQ_LOGIN_AUTO_LOGOUT_ANSWER'	=> 'If you do not check the <em>Remember me</em> box when you login, the board will only keep you logged in for a preset time. This prevents misuse of your account by anyone else. To stay logged in, check the <em>Remember me</em> box during login. This is not recommended if you access the board from a shared computer, e.g. library, internet cafe, university computer lab, etc. If you do not see this checkbox, it means a board administrator has disabled this feature.',
+	'HELP_FAQ_LOGIN_AUTO_LOGOUT_QUESTION'	=> 'Why do I get logged off automatically?',
+	'HELP_FAQ_LOGIN_CANNOT_LOGIN_ANSWER'	=> 'There are several reasons why this could occur. First, ensure your username and password are correct. If they are, contact a board administrator to make sure you haven’t been banned. It is also possible the website owner has a configuration error on their end, and they would need to fix it.',
+	'HELP_FAQ_LOGIN_CANNOT_LOGIN_ANYMORE_ANSWER'	=> 'It is possible an administrator has deactivated or deleted your account for some reason. Also, many boards periodically remove users who have not posted for a long time to reduce the size of the database. If this has happened, try registering again and being more involved in discussions.',
+	'HELP_FAQ_LOGIN_CANNOT_LOGIN_ANYMORE_QUESTION'	=> 'I registered in the past but cannot login any more?!',
+	'HELP_FAQ_LOGIN_CANNOT_LOGIN_QUESTION'	=> 'Why can’t I login?',
+	'HELP_FAQ_LOGIN_CANNOT_REGISTER_ANSWER'	=> 'It is possible a board administrator has disabled registration to prevent new visitors from signing up. A board administrator could have also banned your IP address or disallowed the username you are attempting to register. Contact a board administrator for assistance.',
+	'HELP_FAQ_LOGIN_CANNOT_REGISTER_QUESTION'	=> 'Why can’t I register?',
+	'HELP_FAQ_LOGIN_COPPA_ANSWER'	=> 'COPPA, or the Children’s Online Privacy Protection Act of 1998, is a law in the United States requiring websites which can potentially collect information from minors under the age of 13 to have written parental consent or some other method of legal guardian acknowledgment, allowing the collection of personally identifiable information from a minor under the age of 13. If you are unsure if this applies to you as someone trying to register or to the website you are trying to register on, contact legal counsel for assistance. Please note that phpBB Limited and the owners of this board cannot provide legal advice and is not a point of contact for legal concerns of any kind, except as outlined in question “Who do I contact about abusive and/or legal matters related to this board?”.',
+	'HELP_FAQ_LOGIN_COPPA_QUESTION'	=> 'What is COPPA?',
+	'HELP_FAQ_LOGIN_DELETE_COOKIES_ANSWER'	=> '“Delete all board cookies” deletes the cookies created by phpBB which keep you authenticated and logged into the board. Cookies also provide functions such as read tracking if they have been enabled by a board administrator. If you are having login or logout problems, deleting board cookies may help.',
+	'HELP_FAQ_LOGIN_DELETE_COOKIES_QUESTION'	=> 'What does the “Delete all board cookies” do?',
+	'HELP_FAQ_LOGIN_LOST_PASSWORD_ANSWER'	=> 'Don’t panic! While your password cannot be retrieved, it can easily be reset. Visit the login page and click <em>I forgot my password</em>. Follow the instructions and you should be able to log in again shortly.<br />However, if you are not able to reset your password, contact a board administrator.',
+	'HELP_FAQ_LOGIN_LOST_PASSWORD_QUESTION'	=> 'I’ve lost my password!',
+	'HELP_FAQ_LOGIN_REGISTER_ANSWER'	=> 'You may not have to, it is up to the administrator of the board as to whether you need to register in order to post messages. However; registration will give you access to additional features not available to guest users such as definable avatar images, private messaging, emailing of fellow users, usergroup subscription, etc. It only takes a few moments to register so it is recommended you do so.',
+	'HELP_FAQ_LOGIN_REGISTER_CONFIRM_ANSWER'	=> 'First, check your username and password. If they are correct, then one of two things may have happened. If COPPA support is enabled and you specified being under 13 years old during registration, you will have to follow the instructions you received. Some boards will also require new registrations to be activated, either by yourself or by an administrator before you can logon; this information was present during registration. If you were sent an email, follow the instructions. If you did not receive an email, you may have provided an incorrect email address or the email may have been picked up by a spam filer. If you are sure the email address you provided is correct, try contacting an administrator.',
+	'HELP_FAQ_LOGIN_REGISTER_CONFIRM_QUESTION'	=> 'I registered but cannot login!',
+	'HELP_FAQ_LOGIN_REGISTER_QUESTION'	=> 'Why do I need to register?',
+
+	'HELP_FAQ_PMS_CANNOT_SEND_ANSWER'	=> 'There are three reasons for this; you are not registered and/or not logged on, the board administrator has disabled private messaging for the entire board, or the board administrator has prevented you from sending messages. Contact a board administrator for more information.',
+	'HELP_FAQ_PMS_CANNOT_SEND_QUESTION'	=> 'I cannot send private messages!',
+	'HELP_FAQ_PMS_SPAM_ANSWER'	=> 'We are sorry to hear that. The email form feature of this board includes safeguards to try and track users who send such posts, so email the board administrator with a full copy of the email you received. It is very important that this includes the headers that contain the details of the user that sent the email. The board administrator can then take action.',
+	'HELP_FAQ_PMS_SPAM_QUESTION'	=> 'I have received a spamming or abusive email from someone on this board!',
+	'HELP_FAQ_PMS_UNWANTED_ANSWER'	=> 'You can automatically delete private messages from a user by using message rules within your User Control Panel. If you are receiving abusive private messages from a particular user, report the messages to the moderators; they have the power to prevent a user from sending private messages.',
+	'HELP_FAQ_PMS_UNWANTED_QUESTION'	=> 'I keep getting unwanted private messages!',
+
+	'HELP_FAQ_POSTING_BUMP_ANSWER'	=> 'By clicking the “Bump topic” link when you are viewing it, you can “bump” the topic to the top of the forum on the first page. However, if you do not see this, then topic bumping may be disabled or the time allowance between bumps has not yet been reached. It is also possible to bump the topic simply by replying to it, however, be sure to follow the board rules when doing so.',
+	'HELP_FAQ_POSTING_BUMP_QUESTION'	=> 'How do I bump my topic?',
+	'HELP_FAQ_POSTING_CREATE_ANSWER'	=> 'To post a new topic in a forum, click "New Topic". To post a reply to a topic, click "Post Reply". You may need to register before you can post a message. A list of your permissions in each forum is available at the bottom of the forum and topic screens. Example: You can post new topics, You can post attachments, etc.',
+	'HELP_FAQ_POSTING_CREATE_QUESTION'	=> 'How do I create a new topic or post a reply?',
+	'HELP_FAQ_POSTING_DRAFT_ANSWER'	=> 'This allows you to save drafts to be completed and submitted at a later date. To reload a saved draft, visit the User Control Panel.',
+	'HELP_FAQ_POSTING_DRAFT_QUESTION'	=> 'What is the “Save” button for in topic posting?',
+	'HELP_FAQ_POSTING_EDIT_DELETE_ANSWER'	=> 'Unless you are a board administrator or moderator, you can only edit or delete your own posts. You can edit a post by clicking the edit button for the relevant post, sometimes for only a limited time after the post was made. If someone has already replied to the post, you will find a small piece of text output below the post when you return to the topic which lists the number of times you edited it along with the date and time. This will only appear if someone has made a reply; it will not appear if a moderator or administrator edited the post, though they may leave a note as to why they’ve edited the post at their own discretion. Please note that normal users cannot delete a post once someone has replied.',
+	'HELP_FAQ_POSTING_EDIT_DELETE_QUESTION'	=> 'How do I edit or delete a post?',
+	'HELP_FAQ_POSTING_FORUM_RESTRICTED_ANSWER'	=> 'Some forums may be limited to certain users or groups. To view, read, post or perform another action you may need special permissions. Contact a moderator or board administrator to grant you access.',
+	'HELP_FAQ_POSTING_FORUM_RESTRICTED_QUESTION'	=> 'Why can’t I access a forum?',
+	'HELP_FAQ_POSTING_NO_ATTACHMENTS_ANSWER'	=> 'Attachment permissions are granted on a per forum, per group, or per user basis. The board administrator may not have allowed attachments to be added for the specific forum you are posting in, or perhaps only certain groups can post attachments. Contact the board administrator if you are unsure about why you are unable to add attachments.',
+	'HELP_FAQ_POSTING_NO_ATTACHMENTS_QUESTION'	=> 'Why can’t I add attachments?',
+	'HELP_FAQ_POSTING_POLL_ADD_ANSWER'	=> 'The limit for poll options is set by the board administrator. If you feel you need to add more options to your poll than the allowed amount, contact the board administrator.',
+	'HELP_FAQ_POSTING_POLL_ADD_QUESTION'	=> 'Why can’t I add more poll options?',
+	'HELP_FAQ_POSTING_POLL_CREATE_ANSWER'	=> 'When posting a new topic or editing the first post of a topic, click the “Poll creation” tab below the main posting form; if you cannot see this, you do not have appropriate permissions to create polls. Enter a title and at least two options in the appropriate fields, making sure each option is on a separate line in the textarea. You can also set the number of options users may select during voting under “Options per user”, a time limit in days for the poll (0 for infinite duration) and lastly the option to allow users to amend their votes.',
+	'HELP_FAQ_POSTING_POLL_CREATE_QUESTION'	=> 'How do I create a poll?',
+	'HELP_FAQ_POSTING_POLL_EDIT_ANSWER'	=> 'As with posts, polls can only be edited by the original poster, a moderator or an administrator. To edit a poll, click to edit the first post in the topic; this always has the poll associated with it. If no one has cast a vote, users can delete the poll or edit any poll option. However, if members have already placed votes, only moderators or administrators can edit or delete it. This prevents the poll’s options from being changed mid-way through a poll.',
+	'HELP_FAQ_POSTING_POLL_EDIT_QUESTION'	=> 'How do I edit or delete a poll?',
+	'HELP_FAQ_POSTING_QUEUE_ANSWER'	=> 'The board administrator may have decided that posts in the forum you are posting to require review before submission. It is also possible that the administrator has placed you in a group of users whose posts require review before submission. Please contact the board administrator for further details.',
+	'HELP_FAQ_POSTING_QUEUE_QUESTION'	=> 'Why does my post need to be approved?',
+	'HELP_FAQ_POSTING_REPORT_ANSWER'	=> 'If the board administrator has allowed it, you should see a button for reporting posts next to the post you wish to report. Clicking this will walk you through the steps necessary to report the post.',
+	'HELP_FAQ_POSTING_REPORT_QUESTION'	=> 'How can I report posts to a moderator?',
+	'HELP_FAQ_POSTING_SIGNATURE_ANSWER'	=> 'To add a signature to a post you must first create one via your User Control Panel. Once created, you can check the <em>Attach a signature</em> box on the posting form to add your signature. You can also add a signature by default to all your posts by checking the appropriate radio button in the User Control Panel. If you do so, you can still prevent a signature being added to individual posts by un-checking the add signature box within the posting form.',
+	'HELP_FAQ_POSTING_SIGNATURE_QUESTION'	=> 'How do I add a signature to my post?',
+	'HELP_FAQ_POSTING_WARNING_ANSWER'	=> 'Each board administrator has their own set of rules for their site. If you have broken a rule, you may be issued a warning. Please note that this is the board administrator’s decision, and the phpBB Limited has nothing to do with the warnings on the given site. Contact the board administrator if you are unsure about why you were issued a warning.',
+	'HELP_FAQ_POSTING_WARNING_QUESTION'	=> 'Why did I receive a warning?',
+
+	'HELP_FAQ_SEARCH_BLANK_ANSWER'	=> 'Your search returned too many results for the webserver to handle. Use “Advanced search” and be more specific in the terms used and forums that are to be searched.',
+	'HELP_FAQ_SEARCH_BLANK_QUESTION'	=> 'Why does my search return a blank page!?',
+	'HELP_FAQ_SEARCH_FORUM_ANSWER'	=> 'Enter a search term in the search box located on the index, forum or topic pages. Advanced search can be accessed by clicking the “Advance Search” link which is available on all pages on the forum. How to access the search may depend on the style used.',
+	'HELP_FAQ_SEARCH_FORUM_QUESTION'	=> 'How can I search a forum or forums?',
+	'HELP_FAQ_SEARCH_MEMBERS_ANSWER'	=> 'Visit to the “Members” page and click the “Find a member” link.',
+	'HELP_FAQ_SEARCH_MEMBERS_QUESTION'	=> 'How do I search for members?',
+	'HELP_FAQ_SEARCH_NO_RESULT_ANSWER'	=> 'Your search was probably too vague and included many common terms which are not indexed by phpBB. Be more specific and use the options available within Advanced search.',
+	'HELP_FAQ_SEARCH_NO_RESULT_QUESTION'	=> 'Why does my search return no results?',
+	'HELP_FAQ_SEARCH_OWN_ANSWER'	=> 'Your own posts can be retrieved either by clicking the “Show your posts” link within the User Control Panel or by clicking the “Search user’s posts” link via your own profile page or by clicking the “Quick links” menu at the top of the board. To search for your topics, use the Advanced search page and fill in the various options appropriately.',
+	'HELP_FAQ_SEARCH_OWN_QUESTION'	=> 'How can I find my own posts and topics?',
+
+	'HELP_FAQ_USERSETTINGS_AVATAR_ANSWER'	=> 'There are two images which may appear along with a username when viewing posts. One of them may be an image associated with your rank, generally in the form of stars, blocks or dots, indicating how many posts you have made or your status on the board. Another, usually larger, image is known as an avatar and is generally unique or personal to each user.',
+	'HELP_FAQ_USERSETTINGS_AVATAR_DISPLAY_ANSWER'	=> 'Within your User Control Panel, under “Profile” you can add an avatar by using one of the four following methods: Gravatar, Gallery, Remote or Upload. It is up to the board administrator to enable avatars and to choose the way in which avatars can be made available. If you are unable to use avatars, contact a board administrator.',
+	'HELP_FAQ_USERSETTINGS_AVATAR_DISPLAY_QUESTION'	=> 'How do I display an avatar?',
+	'HELP_FAQ_USERSETTINGS_AVATAR_QUESTION'	=> 'What are the images next to my username?',
+	'HELP_FAQ_USERSETTINGS_CHANGE_SETTINGS_ANSWER'	=> 'If you are a registered user, all your settings are stored in the board database. To alter them, visit your User Control Panel; a link can usually be found by clicking on your username at the top of board pages. This system will allow you to change all your settings and preferences.',
+	'HELP_FAQ_USERSETTINGS_CHANGE_SETTINGS_QUESTION'	=> 'How do I change my settings?',
+	'HELP_FAQ_USERSETTINGS_EMAIL_LOGIN_ANSWER'	=> 'Only registered users can send email to other users via the built-in email form, and only if the administrator has enabled this feature. This is to prevent malicious use of the email system by anonymous users.',
+	'HELP_FAQ_USERSETTINGS_EMAIL_LOGIN_QUESTION'	=> 'When I click the email link for a user it asks me to login?',
+	'HELP_FAQ_USERSETTINGS_HIDE_ONLINE_ANSWER'	=> 'Within your User Control Panel, under “Board preferences”, you will find the option <em>Hide your online status</em>. Enable this option and you will only appear to the administrators, moderators and yourself. You will be counted as a hidden user.',
+	'HELP_FAQ_USERSETTINGS_HIDE_ONLINE_QUESTION'	=> 'How do I prevent my username appearing in the online user listings?',
+	'HELP_FAQ_USERSETTINGS_LANGUAGE_ANSWER'	=> 'Either the administrator has not installed your language or nobody has translated this board into your language. Try asking a board administrator if they can install the language pack you need. If the language pack does not exist, feel free to create a new translation. More information can be found at the <a href="https://www.phpbb.com/">phpBB</a>&reg; website.',
+	'HELP_FAQ_USERSETTINGS_LANGUAGE_QUESTION'	=> 'My language is not in the list!',
+	'HELP_FAQ_USERSETTINGS_RANK_ANSWER'	=> 'Ranks, which appear below your username, indicate the number of posts you have made or identify certain users, e.g. moderators and administrators. In general, you cannot directly change the wording of any board ranks as they are set by the board administrator. Please do not abuse the board by posting unnecessarily just to increase your rank. Most boards will not tolerate this and the moderator or administrator will simply lower your post count.',
+	'HELP_FAQ_USERSETTINGS_RANK_QUESTION'	=> 'What is my rank and how do I change it?',
+	'HELP_FAQ_USERSETTINGS_SERVERTIME_ANSWER'	=> 'If you are sure you have set the timezone correctly and the time is still incorrect, then the time stored on the server clock is incorrect. Please notify an administrator to correct the problem.',
+	'HELP_FAQ_USERSETTINGS_SERVERTIME_QUESTION'	=> 'I changed the timezone and the time is still wrong!',
+	'HELP_FAQ_USERSETTINGS_TIMEZONE_ANSWER'	=> 'It is possible the time displayed is from a timezone different from the one you are in. If this is the case, visit your User Control Panel and change your timezone to match your particular area, e.g. London, Paris, New York, Sydney, etc. Please note that changing the timezone, like most settings, can only be done by registered users. If you are not registered, this is a good time to do so.',
+	'HELP_FAQ_USERSETTINGS_TIMEZONE_QUESTION'	=> 'The times are not correct!',
+));
--- a/language/en/install.php
+++ b/language/en/install.php
@@ -1,19 +1,19 @@
 <?php
 /**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
 
 /**
-* DO NOT CHANGE
-*/
+ * DO NOT CHANGE
+ */
 if (!defined('IN_PHPBB'))
 {
 	exit;
@@ -36,166 +36,27 @@ if (empty($lang) || !is_array($lang))
 // equally where a string contains only two placeholders which are used to wrap text
 // in a url you again do not need to specify an order e.g., 'Click %sHERE%s' is fine
 
+// Common installer pages
 $lang = array_merge($lang, array(
-	'ADMIN_CONFIG'				=> 'Administrator configuration',
-	'ADMIN_PASSWORD'			=> 'Administrator password',
-	'ADMIN_PASSWORD_CONFIRM'	=> 'Confirm administrator password',
-	'ADMIN_PASSWORD_EXPLAIN'	=> 'Please enter a password between 6 and 30 characters in length.',
-	'ADMIN_TEST'				=> 'Check administrator settings',
-	'ADMIN_USERNAME'			=> 'Administrator username',
-	'ADMIN_USERNAME_EXPLAIN'	=> 'Please enter a username between 3 and 20 characters in length.',
-	'APP_MAGICK'				=> 'ImageMagick support [ Attachments ]',
-	'AUTHOR_NOTES'				=> 'Author notes<br />» %s',
-	'AVAILABLE'					=> 'Available',
-	'AVAILABLE_CONVERTORS'		=> 'Available convertors',
-
-	'BEGIN_CONVERT'					=> 'Begin conversion',
-	'BLANK_PREFIX_FOUND'			=> 'A scan of your tables has shown a valid installation using no table prefix.',
-	'BOARD_NOT_INSTALLED'			=> 'No installation found',
-	'BOARD_NOT_INSTALLED_EXPLAIN'	=> 'The phpBB Unified Convertor Framework requires a default installation of phpBB3 to function, please <a href="%s">proceed by first installing phpBB3</a>.',
-	'BACKUP_NOTICE'					=> 'Please backup your board before updating in case any problems arise during the update process.',
-
-	'CATEGORY'					=> 'Category',
-	'CACHE_STORE'				=> 'Cache type',
-	'CACHE_STORE_EXPLAIN'		=> 'The physical location where data is cached, filesystem is preferred.',
-	'CAT_CONVERT'				=> 'Convert',
-	'CAT_INSTALL'				=> 'Install',
-	'CAT_OVERVIEW'				=> 'Overview',
-	'CAT_UPDATE'				=> 'Update',
-	'CHANGE'					=> 'Change',
-	'CHECK_TABLE_PREFIX'		=> 'Please check your table prefix and try again.',
-	'CLEAN_VERIFY'				=> 'Cleaning up and verifying the final structure',
-	'CLEANING_USERNAMES'		=> 'Cleaning usernames',
-	'COLLIDING_CLEAN_USERNAME'	=> '<strong>%s</strong> is the clean username for:',
-	'COLLIDING_USERNAMES_FOUND'	=> 'Colliding usernames were found on your old board. In order to complete the conversion please delete or rename these users so that there is only one user on your old board for each clean username.',
-	'COLLIDING_USER'			=> '» user id: <strong>%d</strong> username: <strong>%s</strong> (%d posts)',
-	'CONFIG_CONVERT'			=> 'Converting the configuration',
-	'CONFIG_FILE_UNABLE_WRITE'	=> 'It was not possible to write the configuration file. Alternative methods for this file to be created are presented below.',
-	'CONFIG_FILE_WRITTEN'		=> 'The configuration file has been written. You may now proceed to the next step of the installation.',
-	'CONFIG_PHPBB_EMPTY'		=> 'The phpBB3 config variable for “%s” is empty.',
-	'CONFIG_RETRY'				=> 'Retry',
-	'CONTINUE_CONVERT'			=> 'Continue conversion',
-	'CONTINUE_CONVERT_BODY'		=> 'A previous conversion attempt has been determined. You are now able to choose between starting a new conversion or continuing the conversion.',
-	'CONTINUE_LAST'				=> 'Continue last statements',
-	'CONTINUE_OLD_CONVERSION'	=> 'Continue previously started conversion',
-	'CONVERT'					=> 'Convert',
-	'CONVERT_COMPLETE'			=> 'Conversion completed',
-	'CONVERT_COMPLETE_EXPLAIN'	=> 'You have now successfully converted your board to phpBB 3.1. You can now login and <a href="../">access your board</a>. Please ensure that the settings were transferred correctly before enabling your board by deleting the install directory. Remember that help on using phpBB is available online via the <a href="https://www.phpbb.com/support/docs/en/3.1/ug/">Documentation</a> and the <a href="https://www.phpbb.com/community/viewforum.php?f=466">support forums</a>.',
-	'CONVERT_INTRO'				=> 'Welcome to the phpBB Unified Convertor Framework',
-	'CONVERT_INTRO_BODY'		=> 'From here, you are able to import data from other (installed) board systems. The list below shows all the conversion modules currently available. If there is no convertor shown in this list for the board software you wish to convert from, please check our website where further conversion modules may be available for download.',
-	'CONVERT_NEW_CONVERSION'	=> 'New conversion',
-	'CONVERT_NOT_EXIST'			=> 'The specified convertor does not exist.',
-	'CONVERT_OPTIONS'			=> 'Options',
-	'CONVERT_SETTINGS_VERIFIED'	=> 'The information you entered has been verified. To start the conversion process, please push the button below.',
-	'CONV_ERR_FATAL'			=> 'Fatal conversion error',
-
-	'CONV_ERROR_ATTACH_FTP_DIR'			=> 'FTP upload for attachments is enabled at the old board. Please disable the FTP upload option and make sure a valid upload directory is specified, then copy all attachment files to this new web accessible directory. Once you have done this, restart the convertor.',
-	'CONV_ERROR_CONFIG_EMPTY'			=> 'There is no configuration information available for the conversion.',
-	'CONV_ERROR_FORUM_ACCESS'			=> 'Unable to get forum access information.',
-	'CONV_ERROR_GET_CATEGORIES'			=> 'Unable to get categories.',
-	'CONV_ERROR_GET_CONFIG'				=> 'Could not retrieve your board configuration.',
-	'CONV_ERROR_COULD_NOT_READ'			=> 'Unable to access/read “%s”.',
-	'CONV_ERROR_GROUP_ACCESS'			=> 'Unable to get group authentication information.',
-	'CONV_ERROR_INCONSISTENT_GROUPS'	=> 'Inconsistency in groups table detected in add_bots() - you need to add all special groups if you do it manually.',
-	'CONV_ERROR_INSERT_BOT'				=> 'Unable to insert bot into users table.',
-	'CONV_ERROR_INSERT_BOTGROUP'		=> 'Unable to insert bot into bots table.',
-	'CONV_ERROR_INSERT_USER_GROUP'		=> 'Unable to insert user into user_group table.',
-	'CONV_ERROR_MESSAGE_PARSER'			=> 'Message parser error',
-	'CONV_ERROR_NO_AVATAR_PATH'			=> 'Note to developer: you must specify $convertor[\'avatar_path\'] to use %s.',
-	'CONV_ERROR_NO_FORUM_PATH'			=> 'The relative path to the source board has not been specified.',
-	'CONV_ERROR_NO_GALLERY_PATH'		=> 'Note to developer: you must specify $convertor[\'avatar_gallery_path\'] to use %s.',
-	'CONV_ERROR_NO_GROUP'				=> 'Group “%1$s” could not be found in %2$s.',
-	'CONV_ERROR_NO_RANKS_PATH'			=> 'Note to developer: you must specify $convertor[\'ranks_path\'] to use %s.',
-	'CONV_ERROR_NO_SMILIES_PATH'		=> 'Note to developer: you must specify $convertor[\'smilies_path\'] to use %s.',
-	'CONV_ERROR_NO_UPLOAD_DIR'			=> 'Note to developer: you must specify $convertor[\'upload_path\'] to use %s.',
-	'CONV_ERROR_PERM_SETTING'			=> 'Unable to insert/update permission setting.',
-	'CONV_ERROR_PM_COUNT'				=> 'Unable to select folder pm count.',
-	'CONV_ERROR_REPLACE_CATEGORY'		=> 'Unable to insert new forum replacing old category.',
-	'CONV_ERROR_REPLACE_FORUM'			=> 'Unable to insert new forum replacing old forum.',
-	'CONV_ERROR_USER_ACCESS'			=> 'Unable to get user authentication information.',
-	'CONV_ERROR_WRONG_GROUP'			=> 'Wrong group “%1$s” defined in %2$s.',
-	'CONV_OPTIONS_BODY'					=> 'This page collects the data required to access the source board. Enter the database details of your former board; the converter will not change anything in the database given below. The source board should be disabled to allow a consistent conversion.',
-	'CONV_SAVED_MESSAGES'				=> 'Saved messages',
+	'INSTALL_PANEL'	=> 'Installation Panel',
+	'SELECT_LANG'	=> 'Select language',
 
-	'COULD_NOT_COPY'			=> 'Could not copy file <strong>%1$s</strong> to <strong>%2$s</strong><br /><br />Please check that the target directory exists and is writable by the webserver.',
-	'COULD_NOT_FIND_PATH'		=> 'Could not find path to your former board. Please check your settings and try again.<br />» %s was specified as the source path.',
+	'STAGE_INSTALL'	=> 'Installing phpBB',
 
-	'DBMS'						=> 'Database type',
-	'DB_CONFIG'					=> 'Database configuration',
-	'DB_CONNECTION'				=> 'Database connection',
-	'DB_ERR_INSERT'				=> 'Error while processing <code>INSERT</code> query.',
-	'DB_ERR_LAST'				=> 'Error while processing <var>query_last</var>.',
-	'DB_ERR_QUERY_FIRST'		=> 'Error while executing <var>query_first</var>.',
-	'DB_ERR_QUERY_FIRST_TABLE'	=> 'Error while executing <var>query_first</var>, %s (“%s”).',
-	'DB_ERR_SELECT'				=> 'Error while running <code>SELECT</code> query.',
-	'DB_HOST'					=> 'Database server hostname or DSN',
-	'DB_HOST_EXPLAIN'			=> 'DSN stands for Data Source Name and is relevant only for ODBC installs. On PostgreSQL, use localhost to connect to the local server via UNIX domain socket and 127.0.0.1 to connect via TCP. For SQLite, enter the full path to your database file.',
-	'DB_NAME'					=> 'Database name',
-	'DB_PASSWORD'				=> 'Database password',
-	'DB_PORT'					=> 'Database server port',
-	'DB_PORT_EXPLAIN'			=> 'Leave this blank unless you know the server operates on a non-standard port.',
-	'DB_UPDATE_NOT_SUPPORTED'	=> 'We are sorry, but this script does not support updating from versions of phpBB prior to “%1$s”. The version you currently have installed is “%2$s”. Please update to a previous version before running this script. Assistance with this is available in the Support Forum on phpBB.com.',
-	'DB_USERNAME'				=> 'Database username',
-	'DB_TEST'					=> 'Test connection',
-	'DEFAULT_LANG'				=> 'Default board language',
-	'DEFAULT_PREFIX_IS'			=> 'The convertor was not able to find tables with the specified prefix. Please make sure you have entered the correct details for the board you are converting from. The default table prefix for %1$s is <strong>%2$s</strong>.',
-	'DEV_NO_TEST_FILE'			=> 'No value has been specified for the test_file variable in the convertor. If you are a user of this convertor, you should not be seeing this error, please report this message to the convertor author. If you are a convertor author, you must specify the name of a file which exists in the source board to allow the path to it to be verified.',
-	'DIRECTORIES_AND_FILES'		=> 'Directory and file setup',
-	'DISABLE_KEYS'				=> 'Disabling keys',
-	'DLL_FTP'					=> 'Remote FTP support [ Installation ]',
-	'DLL_GD'					=> 'GD graphics support [ Visual Confirmation ]',
-	'DLL_MBSTRING'				=> 'Multi-byte character support',
-	'DLL_MSSQL'					=> 'MSSQL Server 2000+',
-	'DLL_MSSQL_ODBC'			=> 'MSSQL Server 2000+ via ODBC',
-	'DLL_MSSQLNATIVE'			=> 'MSSQL Server 2005+ [ Native ]',
-	'DLL_MYSQL'					=> 'MySQL',
-	'DLL_MYSQLI'				=> 'MySQL with MySQLi Extension',
-	'DLL_ORACLE'				=> 'Oracle',
-	'DLL_POSTGRES'				=> 'PostgreSQL',
-	'DLL_SQLITE'				=> 'SQLite 2',
-	'DLL_SQLITE3'				=> 'SQLite 3',
-	'DLL_XML'					=> 'XML support [ Jabber ]',
-	'DLL_ZLIB'					=> 'zlib compression support [ gz, .tar.gz, .zip ]',
-	'DL_CONFIG'					=> 'Download config',
-	'DL_CONFIG_EXPLAIN'			=> 'You may download the complete config.php to your own PC. You will then need to upload the file manually, replacing any existing config.php in your phpBB 3.1 root directory. Please remember to upload the file in ASCII format (see your FTP application documentation if you are unsure how to achieve this). When you have uploaded the config.php please click “Done” to move to the next stage.',
-	'DL_DOWNLOAD'				=> 'Download',
-	'DONE'						=> 'Done',
+	// Introduction page
+	'INTRODUCTION_TITLE'	=> 'Introduction',
+	'INTRODUCTION_BODY'		=> 'Welcome to phpBB3!<br /><br />phpBB® is the most widely used open source bulletin board solution in the world. phpBB3 is the latest installment in a package line started in 2000. Like its predecessors, phpBB3 is feature-rich, user-friendly, and fully supported by the phpBB Team. phpBB3 greatly improves on what made phpBB2 popular, and adds commonly requested features that were not present in previous versions. We hope it exceeds your expectations.<br /><br />This installation system will guide you through installing phpBB3, updating to the latest version of phpBB3 from past releases, as well as converting to phpBB3 from a different discussion board system (including phpBB2). For more information, we encourage you to read <a href="../docs/INSTALL.html">the installation guide</a>.<br /><br />To read the phpBB3 license or learn about obtaining support and our stance on it, please select the respective options from the side menu. To continue, please select the appropriate tab above.',
 
-	'ENABLE_KEYS'				=> 'Re-enabling keys. This can take a while.',
+	// Support page
+	'SUPPORT_TITLE'		=> 'Support',
+	'SUPPORT_BODY'		=> 'Full support will be provided for the current stable release of phpBB3, free of charge. This includes:</p><ul><li>installation</li><li>configuration</li><li>technical questions</li><li>problems relating to potential bugs in the software</li><li>updating from Release Candidate (RC) versions to the latest stable version</li><li>converting from phpBB 2.0.x to phpBB3</li><li>converting from other discussion board software to phpBB3 (please see the <a href="https://www.phpbb.com/community/viewforum.php?f=486">Convertors Forum</a>)</li></ul><p>We encourage users still running beta versions of phpBB3 to replace their installation with a fresh copy of the latest version.</p><h2>Extensions / Styles</h2><p>For issues relating to Extensions, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=451">Extensions Forum</a>.<br />For issues relating to styles, templates and themes, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=471">Styles Forum</a>.<br /><br />If your question relates to a specific package, please post directly in the topic dedicated to the package.</p><h2>Obtaining Support</h2><p><a href="https://www.phpbb.com/community/viewtopic.php?f=14&amp;t=571070">The phpBB Welcome Package</a><br /><a href="https://www.phpbb.com/support/">Support Section</a><br /><a href="https://www.phpbb.com/support/docs/en/3.1/ug/quickstart/">Quick Start Guide</a><br /><br />To ensure you stay up to date with the latest news and releases, why not <a href="https://www.phpbb.com/support/">subscribe to our mailing list</a>?<br /><br />',
 
-	'FILES_OPTIONAL'			=> 'Optional files and directories',
-	'FILES_OPTIONAL_EXPLAIN'	=> '<strong>Optional</strong> - These files, directories or permission settings are not required. The installation system will attempt to use various techniques to create them if they do not exist or cannot be written to. However, the presence of these will speed installation.',
-	'FILES_REQUIRED'			=> 'Files and Directories',
-	'FILES_REQUIRED_EXPLAIN'	=> '<strong>Required</strong> - In order to function correctly phpBB needs to be able to access or write to certain files or directories. If you see “Not Found” you need to create the relevant file or directory. If you see “Unwritable” you need to change the permissions on the file or directory to allow phpBB to write to it.',
-	'FILLING_TABLE'				=> 'Filling table <strong>%s</strong>',
-	'FILLING_TABLES'			=> 'Filling tables',
+	// License
+	'LICENSE_TITLE'		=> 'General Public License',
 
-	'FINAL_STEP'				=> 'Process final step',
-	'FORUM_ADDRESS'				=> 'Board address',
-	'FORUM_ADDRESS_EXPLAIN'		=> 'This is the URL of your former board, for example <samp>http://www.example.com/phpBB2/</samp>. If an address is entered here and not left empty every instance of this address will be replaced by your new board address within messages, private messages and signatures.',
-	'FORUM_PATH'				=> 'Board path',
-	'FORUM_PATH_EXPLAIN'		=> 'This is the <strong>relative</strong> path on disk to your former board from the <strong>root of this phpBB3 installation</strong>.',
-	'FOUND'						=> 'Found',
-	'FTP_CONFIG'				=> 'Transfer config by FTP',
-	'FTP_CONFIG_EXPLAIN'		=> 'phpBB has detected the presence of the FTP module on this server. You may attempt to install your config.php via this if you wish. You will need to supply the information listed below. Remember your username and password are those to your server! (ask your hosting provider for details if you are unsure what these are).',
-	'FTP_PATH'					=> 'FTP path',
-	'FTP_PATH_EXPLAIN'			=> 'This is the path from your root directory to that of phpBB, e.g. <samp>htdocs/phpBB3/</samp>.',
-	'FTP_UPLOAD'				=> 'Upload',
-
-	'GPL'						=> 'General Public License',
-
-	'INITIAL_CONFIG'			=> 'Basic configuration',
-	'INITIAL_CONFIG_EXPLAIN'	=> 'Now that install has determined your server can run phpBB you need to supply some specific information. If you do not know how to connect to your database please contact your hosting provider (in the first instance) or use the phpBB support forums. When entering data please ensure you check it thoroughly before continuing.',
-	'INSTALL_CONGRATS'			=> 'Congratulations!',
-	'INSTALL_CONGRATS_EXPLAIN'	=> '
-		You have successfully installed phpBB %1$s. Please proceed by choosing one of the following options:</p>
-		<h2>Convert an existing board to phpBB3</h2>
-		<p>The phpBB Unified Convertor Framework supports the conversion of phpBB 2.0.x and other board systems to phpBB3. If you have an existing board that you wish to convert, please <a href="%2$s">proceed to the convertor</a>.</p>
-		<h2>Go live with your phpBB3!</h2>
-		<p>Clicking the button below will take you to a form for submitting statistical data to phpBB in your Administration Control Panel (ACP). We would appreciate it if you could help us by sending that information. Afterwards you should take some time to examine the options available to you. Remember that help is available online via the <a href="https://www.phpbb.com/support/docs/en/3.1/ug/">Documentation</a>, <a href="%3$s">README</a> and the <a href="https://www.phpbb.com/community/viewforum.php?f=466">Support Forums</a>.</p><p><strong>Please delete, move or rename the install directory before using your board. While this directory exists, only the Administration Control Panel (ACP) will be accessible.</strong>',
-	'INSTALL_INTRO'				=> 'Welcome to Installation',
-
-	'INSTALL_INTRO_BODY'		=> 'With this option, it is possible to install phpBB3 onto your server.</p><p>In order to proceed, you will need your database settings. If you do not know your database settings, please contact your host and ask for them. You will not be able to continue without them. You need:</p>
+	// Install page
+	'INSTALL_INTRO'			=> 'Welcome to Installation',
+	'INSTALL_INTRO_BODY'	=> 'With this option, it is possible to install phpBB3 onto your server.</p><p>In order to proceed, you will need your database settings. If you do not know your database settings, please contact your host and ask for them. You will not be able to continue without them. You need:</p>
 
 	<ul>
 		<li>The Database Type - the database you will be using.</li>
@@ -211,7 +72,6 @@ $lang = array_merge($lang, array(
 	<ul>
 		<li>MySQL 3.23 or above (MySQLi supported)</li>
 		<li>PostgreSQL 8.3+</li>
-		<li>SQLite 2.8.2+</li>
 		<li>SQLite 3.6.15+</li>
 		<li>MS SQL Server 2000 or above (directly or via ODBC)</li>
 		<li>MS SQL Server 2005 or above (native)</li>
@@ -219,379 +79,154 @@ $lang = array_merge($lang, array(
 	</ul>
 
 	<p>Only those databases supported on your server will be displayed.',
-	'INSTALL_INTRO_NEXT'		=> 'To commence the installation, please press the button below.',
-	'INSTALL_LOGIN'				=> 'Login',
-	'INSTALL_NEXT'				=> 'Next stage',
-	'INSTALL_NEXT_FAIL'			=> 'Some tests failed and you should correct these problems before proceeding to the next stage. Failure to do so may result in an incomplete installation.',
-	'INSTALL_NEXT_PASS'			=> 'All the basic tests have been passed and you may proceed to the next stage of installation. If you have changed any permissions, modules, etc. and wish to re-test you can do so if you wish.',
-	'INSTALL_PANEL'				=> 'Installation Panel',
-	'INSTALL_SEND_CONFIG'		=> 'Unfortunately phpBB could not write the configuration information directly to your config.php. This may be because the file does not exist or is not writable. A number of options will be listed below enabling you to complete installation of config.php.',
-	'INSTALL_START'				=> 'Start install',
-	'INSTALL_TEST'				=> 'Test again',
-	'INST_ERR'					=> 'Installation error',
-	'INST_ERR_DB_CONNECT'		=> 'Could not connect to the database, see error message below.',
-	'INST_ERR_DB_FORUM_PATH'	=> 'The database file specified is within your board directory tree. You should put this file in a non web-accessible location.',
-	'INST_ERR_DB_INVALID_PREFIX'=> 'The prefix you entered is invalid. It must start with a letter and must only contain letters, numbers and underscores.',
-	'INST_ERR_DB_NO_ERROR'		=> 'No error message given.',
-	'INST_ERR_DB_NO_MYSQLI'		=> 'The version of MySQL installed on this machine is incompatible with the “MySQL with MySQLi Extension” option you have selected. Please try the “MySQL” option instead.',
-	'INST_ERR_DB_NO_SQLITE'		=> 'The version of the SQLite extension you have installed is too old, it must be upgraded to at least 2.8.2.',
-	'INST_ERR_DB_NO_SQLITE3'	=> 'The version of the SQLite extension you have installed is too old, it must be upgraded to at least 3.6.15.',
-	'INST_ERR_DB_NO_ORACLE'		=> 'The version of Oracle installed on this machine requires you to set the <var>NLS_CHARACTERSET</var> parameter to <var>UTF8</var>. Either upgrade your installation to 9.2+ or change the parameter.',
-	'INST_ERR_DB_NO_POSTGRES'	=> 'The database you have selected was not created in <var>UNICODE</var> or <var>UTF8</var> encoding. Try installing with a database in <var>UNICODE</var> or <var>UTF8</var> encoding.',
-	'INST_ERR_DB_NO_NAME'		=> 'No database name specified.',
-	'INST_ERR_EMAIL_INVALID'	=> 'The email address you entered is invalid.',
-	'INST_ERR_EMAIL_MISMATCH'	=> 'The emails you entered did not match.',
-	'INST_ERR_FATAL'			=> 'Fatal installation error',
-	'INST_ERR_FATAL_DB'			=> 'A fatal and unrecoverable database error has occurred. This may be because the specified user does not have appropriate permissions to <code>CREATE TABLES</code> or <code>INSERT</code> data, etc. Further information may be given below. Please contact your hosting provider in the first instance or the support forums of phpBB for further assistance.',
-	'INST_ERR_FTP_PATH'			=> 'Could not change to the given directory, please check the path.',
-	'INST_ERR_FTP_LOGIN'		=> 'Could not login to FTP server, check your username and password.',
-	'INST_ERR_MISSING_DATA'		=> 'You must fill out all fields in this block.',
-	'INST_ERR_NO_DB'			=> 'Cannot load the PHP module for the selected database type.',
-	'INST_ERR_PASSWORD_MISMATCH'	=> 'The passwords you entered did not match.',
-	'INST_ERR_PASSWORD_TOO_LONG'	=> 'The password you entered is too long. The maximum length is 30 characters.',
-	'INST_ERR_PASSWORD_TOO_SHORT'	=> 'The password you entered is too short. The minimum length is 6 characters.',
-	'INST_ERR_PREFIX'			=> 'Tables with the specified prefix already exist, please choose an alternative.',
-	'INST_ERR_PREFIX_INVALID'	=> 'The table prefix you have specified is invalid for your database. Please try another, removing characters such as the hyphen.',
-	'INST_ERR_PREFIX_TOO_LONG'	=> 'The table prefix you have specified is too long. The maximum length is %d characters.',
-	'INST_ERR_USER_TOO_LONG'	=> 'The username you entered is too long. The maximum length is 20 characters.',
-	'INST_ERR_USER_TOO_SHORT'	=> 'The username you entered is too short. The minimum length is 3 characters.',
-	'INVALID_PRIMARY_KEY'		=> 'Invalid primary key : %s',
-
-	'LONG_SCRIPT_EXECUTION'		=> 'Please note that this can take a while... Please do not stop the script.',
-
-	// mbstring
-	'MBSTRING_CHECK'						=> '<samp>mbstring</samp> extension check',
-	'MBSTRING_CHECK_EXPLAIN'				=> '<strong>Required</strong> - <samp>mbstring</samp> is a PHP extension that provides multibyte string functions. Certain features of mbstring are not compatible with phpBB and must be disabled.',
-	'MBSTRING_FUNC_OVERLOAD'				=> 'Function overloading',
-	'MBSTRING_FUNC_OVERLOAD_EXPLAIN'		=> '<var>mbstring.func_overload</var> must be set to either 0 or 4.',
-	'MBSTRING_ENCODING_TRANSLATION'			=> 'Transparent character encoding',
-	'MBSTRING_ENCODING_TRANSLATION_EXPLAIN'	=> '<var>mbstring.encoding_translation</var> must be set to 0.',
-	'MBSTRING_HTTP_INPUT'					=> 'HTTP input character conversion',
-	'MBSTRING_HTTP_INPUT_EXPLAIN'			=> '<var>mbstring.http_input</var> must be set to <samp>pass</samp>.',
-	'MBSTRING_HTTP_OUTPUT'					=> 'HTTP output character conversion',
-	'MBSTRING_HTTP_OUTPUT_EXPLAIN'			=> '<var>mbstring.http_output</var> must be set to <samp>pass</samp>.',
-
-	'MAKE_FOLDER_WRITABLE'		=> 'Please make sure that this folder exists and is writable by the webserver then try again:<br />»<strong>%s</strong>.',
-	'MAKE_FOLDERS_WRITABLE'		=> 'Please make sure that these folders exist and are writable by the webserver then try again:<br />»<strong>%s</strong>.',
-
-	'MYSQL_SCHEMA_UPDATE_REQUIRED'	=> 'Your MySQL database schema for phpBB is outdated. phpBB detected a schema for MySQL 3.x/4.x, but the server runs on MySQL %2$s.<br /><strong>Before you proceed the update, you need to upgrade the schema.</strong><br /><br />Please refer to the <a href="https://www.phpbb.com/kb/article/doesnt-have-a-default-value-errors/">Knowledge Base article about upgrading the MySQL schema</a>. If you encounter problems, please use <a href="https://www.phpbb.com/community/viewforum.php?f=466">our support forums</a>.',
-
-	'NAMING_CONFLICT'			=> 'Naming conflict: %s and %s are both aliases<br /><br />%s',
-	'NEXT_STEP'					=> 'Proceed to next step',
-	'NOT_FOUND'					=> 'Cannot find',
-	'NOT_UNDERSTAND'			=> 'Could not understand %s #%d, table %s (“%s”)',
-	'NO_CONVERTORS'				=> 'No convertors are available for use.',
-	'NO_CONVERT_SPECIFIED'		=> 'No convertor specified.',
-	'NO_LOCATION'				=> 'Cannot determine location. If you know ImageMagick is installed, you may specify the location later within your administration control panel',
-	'NO_TABLES_FOUND'			=> 'No tables found.',
-
-	'OVERVIEW_BODY'				=> 'Welcome to phpBB3!<br /><br />phpBB® is the most widely used open source bulletin board solution in the world. phpBB3 is the latest installment in a package line started in 2000. Like its predecessors, phpBB3 is feature-rich, user-friendly, and fully supported by the phpBB Team. phpBB3 greatly improves on what made phpBB2 popular, and adds commonly requested features that were not present in previous versions. We hope it exceeds your expectations.<br /><br />This installation system will guide you through installing phpBB3, updating to the latest version of phpBB3 from past releases, as well as converting to phpBB3 from a different discussion board system (including phpBB2). For more information, we encourage you to read <a href="../docs/INSTALL.html">the installation guide</a>.<br /><br />To read the phpBB3 license or learn about obtaining support and our stance on it, please select the respective options from the side menu. To continue, please select the appropriate tab above.',
-
-	'PCRE_UTF_SUPPORT'				=> 'PCRE UTF-8 support',
-	'PCRE_UTF_SUPPORT_EXPLAIN'		=> 'phpBB will <strong>not</strong> run if your PHP installation is not compiled with UTF-8 support in the PCRE extension.',
-	'PHP_GETIMAGESIZE_SUPPORT'			=> 'PHP function getimagesize() is available',
-	'PHP_GETIMAGESIZE_SUPPORT_EXPLAIN'	=> '<strong>Required</strong> - In order for phpBB to function correctly, the getimagesize function needs to be available.',
-	'PHP_JSON_SUPPORT'				=> 'PHP JSON support',
-	'PHP_JSON_SUPPORT_EXPLAIN'		=> '<strong>Required</strong> - In order for phpBB to function correctly, the PHP JSON extension needs to be available.',
-	'PHP_OPTIONAL_MODULE'			=> 'Optional modules',
-	'PHP_OPTIONAL_MODULE_EXPLAIN'	=> '<strong>Optional</strong> - These modules or applications are optional. However, if they are available they will enable extra features.',
-	'PHP_SUPPORTED_DB'				=> 'Supported databases',
-	'PHP_SUPPORTED_DB_EXPLAIN'		=> '<strong>Required</strong> - You must have support for at least one compatible database within PHP. If no database modules are shown as available you should contact your hosting provider or review the relevant PHP installation documentation for advice.',
-	'PHP_REGISTER_GLOBALS'			=> 'PHP setting <var>register_globals</var> is disabled',
-	'PHP_REGISTER_GLOBALS_EXPLAIN'	=> 'phpBB will still run if this setting is enabled, but if possible, it is recommended that register_globals is disabled on your PHP install for security reasons.',
-	'PHP_SAFE_MODE'					=> 'Safe mode',
-	'PHP_SETTINGS'					=> 'PHP version and settings',
-	'PHP_SETTINGS_EXPLAIN'			=> '<strong>Required</strong> - You must be running at least version 5.3.3 of PHP (PHP 7 is not supported) in order to install phpBB. If <var>safe mode</var> is displayed below your PHP installation is running in that mode. This will impose limitations on remote administration and similar features.',
-	'PHP_URL_FOPEN_SUPPORT'			=> 'PHP setting <var>allow_url_fopen</var> is enabled',
-	'PHP_URL_FOPEN_SUPPORT_EXPLAIN'	=> '<strong>Optional</strong> - This setting is optional, however certain phpBB functions like off-site avatars will not work properly without it.',
-	'PHP_VERSION_REQD'				=> 'PHP version: >= 5.3.3, < 7.0.0-dev',
-	'POST_ID'						=> 'Post ID',
-	'PREFIX_FOUND'					=> 'A scan of your tables has shown a valid installation using <strong>%s</strong> as table prefix.',
-	'PREPROCESS_STEP'				=> 'Executing pre-processing functions/queries',
-	'PRE_CONVERT_COMPLETE'			=> 'All pre-conversion steps have successfully been completed. You may now begin the actual conversion process. Please note that you may have to manually do and adjust several things. After conversion, especially check the permissions assigned, rebuild your search index which is not converted and also make sure files got copied correctly, for example avatars and smilies.',
-	'PROCESS_LAST'					=> 'Processing last statements',
-
-	'REFRESH_PAGE'				=> 'Refresh page to continue conversion',
-	'REFRESH_PAGE_EXPLAIN'		=> 'If set to yes, the convertor will refresh the page to continue the conversion after having finished a step. If this is your first conversion for testing purposes and to determine any errors in advance, we suggest to set this to No.',
-	'REQUIREMENTS_TITLE'		=> 'Installation compatibility',
-	'REQUIREMENTS_EXPLAIN'		=> 'Before proceeding with the full installation phpBB will carry out some tests on your server configuration and files to ensure that you are able to install and run phpBB. Please ensure you read through the results thoroughly and do not proceed until all the required tests are passed. If you wish to use any of the features depending on the optional tests, you should ensure that these tests are passed also.',
-	'RETRY_WRITE'				=> 'Retry writing config',
-	'RETRY_WRITE_EXPLAIN'		=> 'If you wish you can change the permissions on config.php to allow phpBB to write to it. Should you wish to do that you can click Retry below to try again. Remember to return the permissions on config.php after phpBB has finished installation.',
-
-	'SCRIPT_PATH'				=> 'Script path',
-	'SCRIPT_PATH_EXPLAIN'		=> 'The path where phpBB is located relative to the domain name, e.g. <samp>/phpBB3</samp>.',
-	'SELECT_LANG'				=> 'Select language',
-	'SERVER_CONFIG'				=> 'Server configuration',
-	'SEARCH_INDEX_UNCONVERTED'	=> 'Search index was not converted',
-	'SEARCH_INDEX_UNCONVERTED_EXPLAIN'	=> 'Your old search index was not converted. Searching will always yield an empty result. To create a new search index go to the Administration Control Panel, select Maintenance and then choose Search index from the submenu.',
-	'SELECT_FORUM_GA'			=> 'In phpBB 3.1 the global announcements are linked to forums. Select a forum for your current global announcements (can be moved later):',
-	'SOFTWARE'					=> 'Board software',
-	'SPECIFY_OPTIONS'			=> 'Specify conversion options',
-	'STAGE_ADMINISTRATOR'		=> 'Administrator details',
-	'STAGE_ADVANCED'			=> 'Advanced settings',
-	'STAGE_ADVANCED_EXPLAIN'	=> 'The settings on this page are only necessary to set if you know that you require something different from the default. If you are unsure, just proceed to the next page, as these settings can be altered from the Administration Control Panel later.',
-	'STAGE_CONFIG_FILE'			=> 'Configuration file',
-	'STAGE_CREATE_TABLE'		=> 'Create database tables',
-	'STAGE_CREATE_TABLE_EXPLAIN'	=> 'The database tables used by phpBB 3.1 have been created and populated with some initial data. Proceed to the next screen to finish installing phpBB.',
-	'STAGE_DATABASE'			=> 'Database settings',
-	'STAGE_FINAL'				=> 'Final stage',
-	'STAGE_INTRO'				=> 'Introduction',
-	'STAGE_IN_PROGRESS'			=> 'Conversion in progress',
-	'STAGE_REQUIREMENTS'		=> 'Requirements',
-	'STAGE_SETTINGS'			=> 'Settings',
-	'STARTING_CONVERT'			=> 'Starting conversion process',
-	'STEP_PERCENT_COMPLETED'	=> 'Step <strong>%d</strong> of <strong>%d</strong>',
-	'SUB_INTRO'					=> 'Introduction',
-	'SUB_LICENSE'				=> 'License',
-	'SUB_SUPPORT'				=> 'Support',
-	'SUCCESSFUL_CONNECT'		=> 'Successful connection',
-	'SUPPORT_BODY'				=> 'Full support will be provided for the current stable release of phpBB3, free of charge. This includes:</p><ul><li>installation</li><li>configuration</li><li>technical questions</li><li>problems relating to potential bugs in the software</li><li>updating from Release Candidate (RC) versions to the latest stable version</li><li>converting from phpBB 2.0.x to phpBB3</li><li>converting from other discussion board software to phpBB3 (please see the <a href="https://www.phpbb.com/community/viewforum.php?f=486">Convertors Forum</a>)</li></ul><p>We encourage users still running beta versions of phpBB3 to replace their installation with a fresh copy of the latest version.</p><h2>Extensions / Styles</h2><p>For issues relating to Extensions, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=451">Extensions Forum</a>.<br />For issues relating to styles, templates and themes, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=471">Styles Forum</a>.<br /><br />If your question relates to a specific package, please post directly in the topic dedicated to the package.</p><h2>Obtaining Support</h2><p><a href="https://www.phpbb.com/community/viewtopic.php?f=14&amp;t=571070">The phpBB Welcome Package</a><br /><a href="https://www.phpbb.com/support/">Support Section</a><br /><a href="https://www.phpbb.com/support/docs/en/3.1/ug/quickstart/">Quick Start Guide</a><br /><br />To ensure you stay up to date with the latest news and releases, why not <a href="https://www.phpbb.com/support/">subscribe to our mailing list</a>?<br /><br />',
-	'SYNC_FORUMS'				=> 'Starting to synchronise forums',
-	'SYNC_POST_COUNT'			=> 'Synchronising post_counts',
-	'SYNC_POST_COUNT_ID'		=> 'Synchronising post_counts from <var>entry</var> %1$s to %2$s.',
-	'SYNC_TOPICS'				=> 'Starting to synchronise topics',
-	'SYNC_TOPIC_ID'				=> 'Synchronising topics from <var>topic_id</var> %1$s to %2$s.',
 
-	'TABLES_MISSING'			=> 'Could not find these tables<br />» <strong>%s</strong>.',
-	'TABLE_PREFIX'				=> 'Prefix for tables in database',
-	'TABLE_PREFIX_EXPLAIN'		=> 'The prefix must start with a letter and must only contain letters, numbers and underscores.',
-	'TABLE_PREFIX_SAME'			=> 'The table prefix needs to be the one used by the software you are converting from.<br />» Specified table prefix was %s.',
-	'TESTS_PASSED'				=> 'Tests passed',
-	'TESTS_FAILED'				=> 'Tests failed',
+	'ACP_LINK'	=> 'Take me to <a href="%1$s">the ACP</a>',
 
-	'UNABLE_WRITE_LOCK'			=> 'Unable to write lock file.',
-	'UNAVAILABLE'				=> 'Unavailable',
-	'UNWRITABLE'				=> 'Unwritable',
-	'UPDATE_TOPICS_POSTED'		=> 'Generating topics posted information',
-	'UPDATE_TOPICS_POSTED_ERR'	=> 'An error occurred while generating topics posted information. You can retry this step in the ACP after the conversion process is completed.',
-	'VERIFY_OPTIONS'			=> 'Verifying conversion options',
-	'VERSION'					=> 'Version',
+	'INSTALL_PHPBB_INSTALLED'		=> 'phpBB is already installed.',
+	'INSTALL_PHPBB_NOT_INSTALLED'	=> 'phpBB is not installed yet.'
+));
 
-	'WELCOME_INSTALL'			=> 'Welcome to phpBB3 Installation',
-	'WRITABLE'					=> 'Writable',
+// Requirements translation
+$lang = array_merge($lang, array(
+	// Filesystem requirements
+	'FILE_NOT_EXISTS'						=> 'File does not exist',
+	'FILE_NOT_EXISTS_EXPLAIN'				=> 'To be able to install phpBB the %1$s file needs to exist.',
+	'FILE_NOT_EXISTS_EXPLAIN_OPTIONAL'		=> 'It is recommended that the %1$s file exist for a better forum user experience.',
+	'FILE_NOT_WRITABLE'						=> 'File is not writable',
+	'FILE_NOT_WRITABLE_EXPLAIN'				=> 'To be able to install phpBB the %1$s file needs to be writable.',
+	'FILE_NOT_WRITABLE_EXPLAIN_OPTIONAL'	=> 'It is recommended that the %1$s file be writable for a better forum user experience.',
+
+	'DIRECTORY_NOT_EXISTS'						=> 'Directory does not exist',
+	'DIRECTORY_NOT_EXISTS_EXPLAIN'				=> 'To be able to install phpBB the %1$s directory needs to exist.',
+	'DIRECTORY_NOT_EXISTS_EXPLAIN_OPTIONAL'		=> 'It is recommended that the %1$s directory exist for a better forum user experience.',
+	'DIRECTORY_NOT_WRITABLE'					=> 'Directory is not writable',
+	'DIRECTORY_NOT_WRITABLE_EXPLAIN'			=> 'To be able to install phpBB the %1$s directory needs to be writable.',
+	'DIRECTORY_NOT_WRITABLE_EXPLAIN_OPTIONAL'	=> 'It is recommended that the %1$s directory be writable for a better forum user experience.',
+
+	// Server requirements
+	'PHP_VERSION_REQD'					=> 'PHP version',
+	'PHP_VERSION_REQD_EXPLAIN'			=> 'phpBB requires PHP version 5.4.0 or higher.',
+	'PHP_GETIMAGESIZE_SUPPORT'			=> 'PHP getimagesize() function is required',
+	'PHP_GETIMAGESIZE_SUPPORT_EXPLAIN'	=> 'In order for phpBB to function correctly, the getimagesize function needs to be available.',
+	'PCRE_UTF_SUPPORT'					=> 'PCRE UTF-8 support',
+	'PCRE_UTF_SUPPORT_EXPLAIN'			=> 'phpBB will not run if your PHP installation is not compiled with UTF-8 support in the PCRE extension.',
+	'PHP_JSON_SUPPORT'					=> 'PHP JSON support',
+	'PHP_JSON_SUPPORT_EXPLAIN'			=> 'In order for phpBB to function correctly, the PHP JSON extension needs to be available.',
+	'PHP_XML_SUPPORT'					=> 'PHP XML/DOM support',
+	'PHP_XML_SUPPORT_EXPLAIN'			=> 'In order for phpBB to function correctly, the PHP XML/DOM extension needs to be available.',
+	'PHP_SUPPORTED_DB'					=> 'Supported databases',
+	'PHP_SUPPORTED_DB_EXPLAIN'			=> 'You must have support for at least one compatible database within PHP. If no database modules are shown as available you should contact your hosting provider or review the relevant PHP installation documentation for advice.',
+
+	'RETEST_REQUIREMENTS'	=> 'Retest requirements',
+
+	'STAGE_REQUIREMENTS'	=> 'Check requirements'
 ));
 
-// Updater
+// General error messages
 $lang = array_merge($lang, array(
-	'ALL_FILES_UP_TO_DATE'		=> 'All files are up to date with the latest phpBB version.',
-	'ARCHIVE_FILE'				=> 'Source file within archive',
-
-	'BACK'				=> 'Back',
-	'BINARY_FILE'		=> 'Binary file',
-	'BOT'				=> 'Spider/Robot',
-
-	'CHANGE_CLEAN_NAMES'			=> 'The method used to make sure a username is not used by multiple users has been changed. There are some users which have the same name when compared with the new method. You have to delete or rename these users to make sure that each name is only used by one user before you can proceed.',
-	'CHECK_FILES'					=> 'Check files',
-	'CHECK_FILES_AGAIN'				=> 'Check files again',
-	'CHECK_FILES_EXPLAIN'			=> 'Within the next step all files will be checked against the update files - this can take a while if this is the first file check.',
-	'CHECK_FILES_UP_TO_DATE'		=> 'According to your database your version is up to date. You may want to proceed with the file check to make sure all files are really up to date with the latest phpBB version.',
-	'CHECK_UPDATE_DATABASE'			=> 'Continue update process',
-	'COLLECTED_INFORMATION'			=> 'File information',
-	'COLLECTED_INFORMATION_EXPLAIN'	=> 'The list below shows information about the files needing an update. Please read the information in front of every status block to see what they mean and what you may need to do to perform a successful update.',
-	'COLLECTING_FILE_DIFFS'			=> 'Collecting file differences',
-	'COMPLETE_LOGIN_TO_BOARD'		=> 'You should now <a href="../ucp.php?mode=login">login to your board</a> and check if everything is working fine. Do not forget to delete, rename or move your install directory!',
-	'CONTINUE_UPDATE_NOW'			=> 'Continue the update process now',		// Shown within the database update script at the end if called from the updater
-	'CONTINUE_UPDATE'				=> 'Continue update now',					// Shown after file upload to indicate the update process is not yet finished
-	'CURRENT_FILE'					=> 'Begin of Conflict - Original File code before update',
-	'CURRENT_VERSION'				=> 'Current version',
-
-	'DATABASE_TYPE'						=> 'Database type',
-	'DATABASE_UPDATE_COMPLETE'			=> 'Database updater has completed!',
-	'DATABASE_UPDATE_CONTINUE'			=> 'Continue database update',
-	'DATABASE_UPDATE_INFO_OLD'			=> 'The database update file within the install directory is outdated. Please make sure you uploaded the correct version of the file.',
-	'DATABASE_UPDATE_NOT_COMPLETED'		=> 'The database update has not yet completed.',
-	'DATABASE_VERSION'					=> 'Database version',
-	'DELETE_USER_REMOVE'				=> 'Delete user and remove posts',
-	'DELETE_USER_RETAIN'				=> 'Delete user but keep posts',
-	'DESTINATION'						=> 'Destination file',
-	'DIFF_INLINE'						=> 'Inline',
-	'DIFF_RAW'							=> 'Raw unified diff',
-	'DIFF_SEP_EXPLAIN'					=> 'Code block used within the updated/new file',
-	'DIFF_SIDE_BY_SIDE'					=> 'Side by Side',
-	'DIFF_UNIFIED'						=> 'Unified diff',
-	'DO_NOT_UPDATE'						=> 'Do not update this file',
-	'DONE'								=> 'Done',
-	'DOWNLOAD'							=> 'Download',
-	'DOWNLOAD_AS'						=> 'Download as',
-	'DOWNLOAD_UPDATE_METHOD_BUTTON'		=> 'Download modified files archive (recommended)',
-	'DOWNLOAD_CONFLICTS'				=> 'Download conflicts for this file',
-	'DOWNLOAD_CONFLICTS_EXPLAIN'		=> 'Search for &lt;&lt;&lt; to spot conflicts',
-	'DOWNLOAD_UPDATE_METHOD'			=> 'Download modified files archive',
-	'DOWNLOAD_UPDATE_METHOD_EXPLAIN'	=> 'Once downloaded you should unpack the archive. You will find the modified files you need to upload to your phpBB root directory within it. Please upload the files to their respective locations then. After you have uploaded all files, please check the files again with the other button below.',
+	'INST_ERR_MISSING_DATA'		=> 'You must fill out all fields in this block.',
 
-	'EDIT_USERNAME'	=> 'Edit username',
-	'ERROR'			=> 'Error',
-	'EVERYTHING_UP_TO_DATE'		=> 'Everything is up to date with the latest phpBB version. You should now <a href="%1$s">login to your board</a> and check if everything is working fine. Do not forget to delete, rename or move your install directory! Please send us updated information about your server and board configurations from the <a href="%2$s">Send statistics</a> module in your ACP.',
+	'TIMEOUT_DETECTED_TITLE'	=> 'The installer detected a timeout',
+	'TIMEOUT_DETECTED_MESSAGE'	=> 'The installer has detected a timeout, you may try to refresh the page, which may lead to data corruption. We suggest that you either increase your timeout settings or try to use the CLI.',
+));
 
-	'FILE_ALREADY_UP_TO_DATE'		=> 'File is already up to date.',
-	'FILE_DIFF_NOT_ALLOWED'			=> 'File not allowed to be diffed.',
-	'FILE_USED'						=> 'Information used from',			// Single file
-	'FILES_CONFLICT'				=> 'Conflict files',
-	'FILES_CONFLICT_EXPLAIN'		=> 'The following files are modified and do not represent the original files from the old version. phpBB determined that these files create conflicts if they are tried to be merged. Please investigate the conflicts and try to manually resolve them or continue the update choosing the preferred merging method. If you resolve the conflicts manually check the files again after you modified them. You are also able to choose between the preferred merge method for every file. The first one will result in a file where the conflicting lines from your old file will be lost, the other one will result in losing the changes from the newer file.',
-	'FILES_DELETED'					=> 'Deleted files',
-	'FILES_DELETED_EXPLAIN'			=> 'The following files do not exist in the new version. These files have to be deleted from your installation.',
-	'FILES_MODIFIED'				=> 'Modified files',
-	'FILES_MODIFIED_EXPLAIN'		=> 'The following files are modified and do not represent the original files from the old version. The updated file will be a merge between your modifications and the new file.',
-	'FILES_NEW'						=> 'New files',
-	'FILES_NEW_EXPLAIN'				=> 'The following files currently do not exist within your installation. These files will be added to your installation.',
-	'FILES_NEW_CONFLICT'			=> 'New conflicting files',
-	'FILES_NEW_CONFLICT_EXPLAIN'	=> 'The following files are new within the latest version but it has been determined that there is already a file with the same name within the same position. This file will be overwritten by the new file.',
-	'FILES_NOT_MODIFIED'			=> 'Not modified files',
-	'FILES_NOT_MODIFIED_EXPLAIN'	=> 'The following files are not modified and represent the original phpBB files from the version you want to update from.',
-	'FILES_UP_TO_DATE'				=> 'Already updated files',
-	'FILES_UP_TO_DATE_EXPLAIN'		=> 'The following files are already up to date and do not need to be updated.',
-	'FILES_VERSION'					=> 'Files Version',
-	'FTP_SETTINGS'					=> 'FTP settings',
-	'FTP_UPDATE_METHOD'				=> 'FTP upload',
+// Data obtaining translations
+$lang = array_merge($lang, array(
+	'STAGE_OBTAIN_DATA'	=> 'Set installation data',
 
-	'INCOMPATIBLE_UPDATE_FILES'		=> 'The update files found are incompatible with your installed version. Your installed version is %1$s and the update file is for updating phpBB %2$s to %3$s.',
-	'INCOMPLETE_UPDATE_FILES'		=> 'The update files are incomplete.',
-	'INLINE_UPDATE_SUCCESSFUL'		=> 'The database update was successful. Now you need to continue the update process.',
-
-	'KEEP_OLD_NAME'		=> 'Keep username',
-
-	'LATEST_VERSION'		=> 'Latest version',
-	'LINE'					=> 'Line',
-	'LINE_ADDED'			=> 'Added',
-	'LINE_MODIFIED'			=> 'Modified',
-	'LINE_REMOVED'			=> 'Removed',
-	'LINE_UNMODIFIED'		=> 'Unmodified',
-	'LOGIN_UPDATE_EXPLAIN'	=> 'In order to update your installation you need to login first.',
-
-	'MAPPING_FILE_STRUCTURE'	=> 'To ease the upload here are the file locations which map your phpBB installation.',
-
-	'MERGE_MODIFICATIONS_OPTION'	=> 'Merge modifications',
-
-	'MERGE_NO_MERGE_NEW_OPTION'	=> 'Do not merge - use new file',
-	'MERGE_NO_MERGE_MOD_OPTION'	=> 'Do not merge - use currently installed file',
-	'MERGE_MOD_FILE_OPTION'		=> 'Merge modifications (removes new phpBB code within conflicting block)',
-	'MERGE_NEW_FILE_OPTION'		=> 'Merge modifications (removes modified code within conflicting block)',
-	'MERGE_SELECT_ERROR'		=> 'Conflicting file merge modes are not correctly selected.',
-	'MERGING_FILES'				=> 'Merging differences',
-	'MERGING_FILES_EXPLAIN'		=> 'Currently collecting final file changes.<br /><br />Please wait until phpBB has completed all operations on changed files.',
-
-	'NEW_FILE'						=> 'End of Conflict',
-	'NEW_USERNAME'					=> 'New username',
-	'NO_AUTH_UPDATE'				=> 'Not authorised to update',
-	'NO_ERRORS'						=> 'No errors',
-	'NO_UPDATE_FILES'				=> 'Not updating the following files',
-	'NO_UPDATE_FILES_EXPLAIN'		=> 'The following files are new or modified but the directory they normally reside in could not be found on your installation. If this list contains files to other directories than language/ or styles/ than you may have modified your directory structure and the update may be incomplete.',
-	'NO_UPDATE_FILES_OUTDATED'		=> 'No valid update directory was found, please make sure you uploaded the relevant files.<br /><br />Your installation does <strong>not</strong> seem to be up to date. Updates are available for your version of phpBB %1$s, please visit <a href="https://www.phpbb.com/downloads/" rel="external">https://www.phpbb.com/downloads/</a> to obtain the correct package to update from Version %2$s to Version %3$s.',
-	'NO_UPDATE_FILES_UP_TO_DATE'	=> 'Your version is up to date. There is no need to run the update tool. If you want to make an integrity check on your files make sure you uploaded the correct update files.',
-	'NO_UPDATE_INFO'				=> 'Update file information could not be found.',
-	'NO_UPDATES_REQUIRED'			=> 'No updates required',
-	'NO_VISIBLE_CHANGES'			=> 'No visible changes',
-	'NOTICE'						=> 'Notice',
-	'NUM_CONFLICTS'					=> 'Number of conflicts',
-	'NUMBER_OF_FILES_COLLECTED'		=> 'Currently differences from %1$d of %2$d files have been checked.<br />Please wait until all files are checked.',
+	//
+	// Admin data
+	//
+	'STAGE_ADMINISTRATOR'	=> 'Administrator details',
 
-	'OLD_UPDATE_FILES'		=> 'Update files are out of date. The update files found are for updating from phpBB %1$s to phpBB %2$s but the latest version of phpBB is %3$s.',
+	// Form labels
+	'ADMIN_CONFIG'				=> 'Administrator configuration',
+	'ADMIN_PASSWORD'			=> 'Administrator password',
+	'ADMIN_PASSWORD_CONFIRM'	=> 'Confirm administrator password',
+	'ADMIN_PASSWORD_EXPLAIN'	=> 'Please enter a password between 6 and 30 characters in length.',
+	'ADMIN_USERNAME'			=> 'Administrator username',
+	'ADMIN_USERNAME_EXPLAIN'	=> 'Please enter a username between 3 and 20 characters in length.',
 
-	'PACKAGE_UPDATES_TO'				=> 'Current package updates to version',
+	// Errors
+	'INST_ERR_EMAIL_INVALID'		=> 'The email address you entered is invalid.',
+	'INST_ERR_PASSWORD_MISMATCH'	=> 'The passwords you entered did not match.',
+	'INST_ERR_PASSWORD_TOO_LONG'	=> 'The password you entered is too long. The maximum length is 30 characters.',
+	'INST_ERR_PASSWORD_TOO_SHORT'	=> 'The password you entered is too short. The minimum length is 6 characters.',
+	'INST_ERR_USER_TOO_LONG'		=> 'The username you entered is too long. The maximum length is 20 characters.',
+	'INST_ERR_USER_TOO_SHORT'		=> 'The username you entered is too short. The minimum length is 3 characters.',
+
+	//
+	// Board data
+	//
+	// Form labels
+	'BOARD_CONFIG'		=> 'Bulletin board configuration',
+	'DEFAULT_LANGUAGE'	=> 'Default language',
+	'BOARD_NAME'		=> 'Title of the board',
+	'BOARD_DESCRIPTION'	=> 'Short description of the board',
+
+	//
+	// Database data
+	//
+	'STAGE_DATABASE'	=> 'Database settings',
+
+	// Form labels
+	'DB_CONFIG'				=> 'Database configuration',
+	'DBMS'					=> 'Database type',
+	'DB_HOST'				=> 'Database server hostname or DSN',
+	'DB_HOST_EXPLAIN'		=> 'DSN stands for Data Source Name and is relevant only for ODBC installs. On PostgreSQL, use localhost to connect to the local server via UNIX domain socket and 127.0.0.1 to connect via TCP. For SQLite, enter the full path to your database file.',
+	'DB_PORT'				=> 'Database server port',
+	'DB_PORT_EXPLAIN'		=> 'Leave this blank unless you know the server operates on a non-standard port.',
+	'DB_PASSWORD'			=> 'Database password',
+	'DB_NAME'				=> 'Database name',
+	'DB_USERNAME'			=> 'Database username',
+	'DATABASE_VERSION'		=> 'Database version',
+	'TABLE_PREFIX'			=> 'Prefix for tables in database',
+	'TABLE_PREFIX_EXPLAIN'	=> 'The prefix must start with a letter and must only contain letters, numbers and underscores.',
+
+	// Database options
+	'DB_OPTION_MSSQL_ODBC'	=> 'MSSQL Server 2000+ via ODBC',
+	'DB_OPTION_MSSQLNATIVE'	=> 'MSSQL Server 2005+ [ Native ]',
+	'DB_OPTION_MYSQL'		=> 'MySQL',
+	'DB_OPTION_MYSQLI'		=> 'MySQL with MySQLi Extension',
+	'DB_OPTION_ORACLE'		=> 'Oracle',
+	'DB_OPTION_POSTGRES'	=> 'PostgreSQL',
+	'DB_OPTION_SQLITE3'		=> 'SQLite 3',
+
+	// Errors
+	'INST_ERR_NO_DB'				=> 'Cannot load the PHP module for the selected database type.',
+	'INST_ERR_DB_INVALID_PREFIX'	=> 'The prefix you entered is invalid. It must start with a letter and must only contain letters, numbers and underscores.',
+	'INST_ERR_PREFIX_TOO_LONG'		=> 'The table prefix you have specified is too long. The maximum length is %d characters.',
+	'INST_ERR_DB_NO_NAME'			=> 'No database name specified.',
+	'INST_ERR_DB_FORUM_PATH'		=> 'The database file specified is within your board directory tree. You should put this file in a non web-accessible location.',
+	'INST_ERR_DB_CONNECT'			=> 'Could not connect to the database, see error message below.',
+	'INST_ERR_DB_NO_ERROR'			=> 'No error message given.',
+	'INST_ERR_PREFIX'				=> 'Tables with the specified prefix already exist, please choose an alternative.',
+	'INST_ERR_DB_NO_MYSQLI'			=> 'The version of MySQL installed on this machine is incompatible with the “MySQL with MySQLi Extension” option you have selected. Please try the “MySQL” option instead.',
+	'INST_ERR_DB_NO_SQLITE3'		=> 'The version of the SQLite extension you have installed is too old, it must be upgraded to at least 3.6.15.',
+	'INST_ERR_DB_NO_ORACLE'			=> 'The version of Oracle installed on this machine requires you to set the <var>NLS_CHARACTERSET</var> parameter to <var>UTF8</var>. Either upgrade your installation to 9.2+ or change the parameter.',
+	'INST_ERR_DB_NO_POSTGRES'		=> 'The database you have selected was not created in <var>UNICODE</var> or <var>UTF8</var> encoding. Try installing with a database in <var>UNICODE</var> or <var>UTF8</var> encoding.',
+	'INST_SCHEMA_FILE_NOT_WRITABLE'	=> 'The schema file is not writable',
+
+	//
+	// Email data
+	//
+	'EMAIL_CONFIG'	=> 'E-mail configuration',
+
+	// Package info
 	'PACKAGE_VERSION'					=> 'Package version installed',
-	'PERFORM_DATABASE_UPDATE'			=> 'Perform database update',
-	'PERFORM_DATABASE_UPDATE_EXPLAIN'	=> 'Below you will find a button to the database update script. The database update can take a while, so please do not stop the execution if it seems to hang. After the database update has been performed just follow the instructions to continue the update process.',
-	'PREVIOUS_VERSION'					=> 'Previous version',
-	'PROGRESS'							=> 'Progress',
-
-	'RELEASE_ANNOUNCEMENT'		=> 'Announcement',
-	'RESULT'					=> 'Result',
-	'RUN_DATABASE_SCRIPT'		=> 'Update my database now',
-
-	'SELECT_DIFF_MODE'			=> 'Select diff mode',
-	'SELECT_DOWNLOAD_FORMAT'	=> 'Select download archive format',
-	'SELECT_FTP_SETTINGS'		=> 'Select FTP settings',
-	'SHOW_DIFF_CONFLICT'		=> 'Show differences/conflicts',
-	'SHOW_DIFF_DELETED'			=> 'Show file contents',
-	'SHOW_DIFF_FINAL'			=> 'Show resulting file',
-	'SHOW_DIFF_MODIFIED'		=> 'Show merged differences',
-	'SHOW_DIFF_NEW'				=> 'Show file contents',
-	'SHOW_DIFF_NEW_CONFLICT'	=> 'Show differences',
-	'SHOW_DIFF_NOT_MODIFIED'	=> 'Show differences',
-	'SOME_QUERIES_FAILED'		=> 'Some queries failed, the statements and errors are listed below.',
-	'SQL'						=> 'SQL',
-	'SQL_FAILURE_EXPLAIN'		=> 'This is probably nothing to worry about, update will continue. Should this fail to complete you may need to seek help at our support forums. See <a href="../docs/README.html">README</a> for details on how to obtain advice.',
-	'STAGE_FILE_CHECK'			=> 'Check files',
-	'STAGE_UPDATE_DB'			=> 'Update database',
-	'STAGE_UPDATE_FILES'		=> 'Update files',
-	'STAGE_VERSION_CHECK'		=> 'Version check',
-	'STATUS_CONFLICT'			=> 'Modified file producing conflicts',
-	'STATUS_DELETED'			=> 'Deleted file',
-	'STATUS_MODIFIED'			=> 'Modified file',
-	'STATUS_NEW'				=> 'New file',
-	'STATUS_NEW_CONFLICT'		=> 'Conflicting new file',
-	'STATUS_NOT_MODIFIED'		=> 'Not modified file',
-	'STATUS_UP_TO_DATE'			=> 'Already updated file',
-
-	'TOGGLE_DISPLAY'			=> 'View/Hide file list',
-	'TRY_DOWNLOAD_METHOD'		=> 'You may want to try the download modified files method.<br />This method always works and is also the recommended update path.',
-	'TRY_DOWNLOAD_METHOD_BUTTON'=> 'Try this method now',
-
-	'UPDATE_COMPLETED'				=> 'Update completed',
-	'UPDATE_DATABASE'				=> 'Update database',
-	'UPDATE_DATABASE_EXPLAIN'		=> 'Within the next step the database will be updated.',
-	'UPDATE_DATABASE_SCHEMA'		=> 'Updating database schema',
-	'UPDATE_FILES'					=> 'Update files',
-	'UPDATE_FILES_NOTICE'			=> 'Please make sure you have updated your board files too, this file is only updating your database.',
 	'UPDATE_INCOMPLETE'				=> 'Your phpBB installation has not been correctly updated.',
 	'UPDATE_INCOMPLETE_MORE'		=> 'Please read the information below in order to fix this error.',
 	'UPDATE_INCOMPLETE_EXPLAIN'		=> '<h1>Incomplete update</h1>
 
-		<p>We noticed that the last update of your phpBB installation hasn’t been completed. Visit the <a href="%1$s" title="%1$s">database_update script</a> and run it. If it is missing, please <a href="https://www.phpbb.com/downloads/" title="phpBB downloads">download your package version</a>, upload the "install" folder to your phpBB root directory (where your config.php file is) and <a href="%1$s" title="%1$s">run the database update script</a>.</p>',
-
-	'UPDATE_INSTALLATION'			=> 'Update phpBB installation',
-	'UPDATE_INSTALLATION_EXPLAIN'	=> 'With this option, it is possible to update your phpBB installation to the latest version.<br />During the process all of your files will be checked for their integrity. You are able to review all differences and files before the update.<br /><br />The file update itself can be done in two different ways.</p><h2>Manual Update</h2><p>With this update you only download your personal set of changed files to make sure you do not lose your file modifications you may have done. After you downloaded this package you need to manually upload the files to their correct position under your phpBB root directory. Once done, you are able to do the file check stage again to see if you moved the files to their correct location.</p><h2>Automatic Update with FTP</h2><p>This method is similar to the first one but without the need to download the changed files and uploading them on your own. This will be done for you. In order to use this method you need to know your FTP login details since you will be asked for them. Once finished you will be redirected to the file check again to make sure everything got updated correctly.<br /><br />',
-	'UPDATE_INSTRUCTIONS'			=> '
-
-		<h1>Release announcement</h1>
-
-		<p>Please read the release announcement for the latest version before you continue your update process, it may contain useful information. It also contains full download links as well as the change log.</p>
-
-		<br />
-
-		<h1>How to update your installation with the Automatic Update Package</h1>
-
-		<p>The recommended way of updating your installation listed here is only valid for the automatic update package. You are also able to update your installation using the methods listed within the INSTALL.html document. The steps for updating phpBB3 automatically are:</p>
+		<p>We noticed that the last update of your phpBB installation hasn’t been completed. Visit the <a href="%1$s" title="%1$s">database updater</a>, ensure <em>Update database only</em> is selected and click on <strong>Submit</strong>. Don\'t forget to delete the "install"-directory after you have updated the database sucessfully.</p>',
 
-		<ul style="margin-left: 20px; font-size: 1.1em;">
-			<li>Go to the <a href="https://www.phpbb.com/downloads/" title="https://www.phpbb.com/downloads/">phpBB.com downloads page</a> and download the "Automatic Update Package" archive.<br /><br /></li>
-			<li>Unpack the archive.<br /><br /></li>
-			<li>Upload the complete uncompressed "install" and "vendor" folders to your phpBB root directory (where your config.php file is).<br /><br /></li>
-		</ul>
-
-		<p>Once uploaded your board will be offline for normal users due to the install directory you uploaded now present.<br /><br />
-		<strong><a href="%1$s" title="%1$s">Now start the update process by pointing your browser to the install folder</a>.</strong><br />
-		<br />
-		You will then be guided through the update process. You will be notified once the update is complete.
-		</p>
-	',
-	'UPDATE_METHOD'					=> 'Update method',
-	'UPDATE_METHOD_EXPLAIN'			=> 'You are now able to choose your preferred update method. Using the FTP upload will present you with a form you need to enter your FTP account details into. With this method the files will be automatically moved to the new location and backups of the old files being created by appending .bak to the filename. If you choose to download the modified files you are able to unpack and upload them to their correct location manually later.',
-	'UPDATE_REQUIRES_FILE'			=> 'The updater requires that the following file is present: %s',
-	'UPDATE_SUCCESS'				=> 'Update was successful',
-	'UPDATE_SUCCESS_EXPLAIN'		=> 'Successfully updated all files. The next step involves checking all files again to make sure the files got updated correctly.',
-	'UPDATE_VERSION_OPTIMIZE'		=> 'Updating version and optimising tables',
-	'UPDATING_DATA'					=> 'Updating data',
-	'UPDATING_TO_LATEST_STABLE'		=> 'Updating database to latest stable release',
-	'UPDATED_VERSION'				=> 'Updated version',
-	'UPLOAD_METHOD'					=> 'Upload method',
-
-	'UPDATE_DB_SUCCESS'				=> 'Database update was successful.',
-	'UPDATE_FILE_SUCCESS'			=> 'File update was successful.',
-	'USER_ACTIVE'					=> 'Active user',
-	'USER_INACTIVE'					=> 'Inactive user',
-
-	'VERSION_CHECK'					=> 'Version check',
-	'VERSION_CHECK_EXPLAIN'			=> 'Checks to see if your phpBB installation is up to date.',
-	'VERSION_NOT_UP_TO_DATE'		=> 'Your phpBB installation is not up to date. Please continue the update process.',
-	'VERSION_NOT_UP_TO_DATE_ACP'	=> 'Your phpBB installation is not up to date.<br />Below is a link to the release announcement, which contains more information as well as instructions on updating.',
-	'VERSION_NOT_UP_TO_DATE_TITLE'	=> 'Your phpBB installation is not up to date.',
-	'VERSION_UP_TO_DATE'			=> 'Your phpBB installation is up to date. Although there are no updates available at this time, you may continue in order to perform a file validity check.',
-	'VERSION_UP_TO_DATE_ACP'		=> 'Your phpBB installation is up to date. There are no updates available at this time.',
-	'VIEWING_FILE_CONTENTS'			=> 'Viewing file contents',
-	'VIEWING_FILE_DIFF'				=> 'Viewing file differences',
-
-	'WRONG_INFO_FILE_FORMAT'	=> 'Wrong info file format',
+	//
+	// Server data
+	//
+	// Form labels
+	'SERVER_CONFIG'				=> 'Server configuration',
+	'SCRIPT_PATH'				=> 'Script path',
+	'SCRIPT_PATH_EXPLAIN'		=> 'The path where phpBB is located relative to the domain name, e.g. <samp>/phpBB3</samp>.',
 ));
 
 // Default database schema entries...
@@ -639,3 +274,299 @@ $lang = array_merge($lang, array(
 
 	'TOPICS_TOPIC_TITLE'			=> 'Welcome to phpBB3',
 ));
+
+// Common navigation items' translation
+$lang = array_merge($lang, array(
+	'MENU_OVERVIEW'		=> 'Overview',
+	'MENU_INTRO'		=> 'Introduction',
+	'MENU_LICENSE'		=> 'License',
+	'MENU_SUPPORT'		=> 'Support',
+));
+
+// Task names
+$lang = array_merge($lang, array(
+	// Install filesystem
+	'TASK_CREATE_CONFIG_FILE'	=> 'Creating configuration file',
+
+	// Install database
+	'TASK_ADD_CONFIG_SETTINGS'			=> 'Adding configuration settings',
+	'TASK_ADD_DEFAULT_DATA'				=> 'Adding default settings to the database',
+	'TASK_CREATE_DATABASE_SCHEMA_FILE'	=> 'Creating database schema file',
+	'TASK_SETUP_DATABASE'				=> 'Setting up database',
+	'TASK_CREATE_TABLES'				=> 'Creating tables',
+
+	// Install data
+	'TASK_ADD_BOTS'			=> 'Registering bots',
+	'TASK_ADD_LANGUAGES'	=> 'Installing available languages',
+	'TASK_ADD_MODULES'		=> 'Installing modules',
+
+	// Install finish tasks
+	'TASK_INSTALL_EXTENSIONS'	=> 'Installing packaged extensions',
+	'TASK_NOTIFY_USER'			=> 'Sending notification e-mail',
+	'TASK_POPULATE_MIGRATIONS'	=> 'Populating migrations',
+
+	// Installer general progress messages
+	'INSTALLER_FINISHED'	=> 'The installer has finished successfully',
+));
+
+// Installer's general messages
+$lang = array_merge($lang, array(
+	'MODULE_NOT_FOUND'				=> 'Module not found',
+	'MODULE_NOT_FOUND_DESCRIPTION'	=> 'A module could not be found because the service, %s, is undefined.',
+
+	'TASK_NOT_FOUND'				=> 'Task not found',
+	'TASK_NOT_FOUND_DESCRIPTION'	=> 'A task could not be found because the service, %s, is undefined.',
+
+	'SKIP_MODULE'	=> 'Skip “%s” module',
+	'SKIP_TASK'		=> 'Skip “%s” task',
+
+	'TASK_SERVICE_INSTALLER_MISSING'	=> 'All installer task services should start with “installer”',
+	'TASK_CLASS_NOT_FOUND'				=> 'Installer task service definition is invalid. Service name “%1$s” given, the expected class namespace is “%2$s” for that. For more information please see the documentation of task_interface.',
+
+	'INSTALLER_CONFIG_NOT_WRITABLE'	=> 'The installer config file is not writable.',
+));
+
+// CLI messages
+$lang = array_merge($lang, array(
+	'CLI_INSTALL_BOARD'				=> 'Install phpBB',
+	'CLI_UPDATE_BOARD'				=> 'Update phpBB',
+	'CLI_INSTALL_SHOW_CONFIG'		=> 'Show the configuration which will be used',
+	'CLI_INSTALL_VALIDATE_CONFIG'	=> 'Validate a configuration file',
+	'CLI_CONFIG_FILE'				=> 'Config file to use',
+	'MISSING_FILE'					=> 'Unable to access file %1$s',
+	'MISSING_DATA'					=> 'Config file is missing data or might contain invalid settings.',
+	'INVALID_YAML_FILE'				=> 'Could not parse YAML file %1$s',
+	'CONFIGURATION_VALID'			=> 'The configuration file is valid',
+));
+
+// Common updater messages
+$lang = array_merge($lang, array(
+	'UPDATE_INSTALLATION'			=> 'Update phpBB installation',
+	'UPDATE_INSTALLATION_EXPLAIN'	=> 'With this option, it is possible to update your phpBB installation to the latest version.<br />During the process all of your files will be checked for their integrity. You are able to review all differences and files before the update.<br /><br />The file update itself can be done in two different ways.</p><h2>Manual Update</h2><p>With this update you only download your personal set of changed files to make sure you do not lose your file modifications you may have done. After you downloaded this package you need to manually upload the files to their correct position under your phpBB root directory. Once done, you are able to do the file check stage again to see if you moved the files to their correct location.</p><h2>Automatic Update with FTP</h2><p>This method is similar to the first one but without the need to download the changed files and uploading them on your own. This will be done for you. In order to use this method you need to know your FTP login details since you will be asked for them. Once finished you will be redirected to the file check again to make sure everything got updated correctly.<br /><br />',
+	'UPDATE_INSTRUCTIONS'			=> '
+
+		<h1>Release announcement</h1>
+
+		<p>Please read the release announcement for the latest version before you continue your update process, it may contain useful information. It also contains full download links as well as the change log.</p>
+
+		<br />
+
+		<h1>How to update your installation with the Automatic Update Package</h1>
+
+		<p>The recommended way of updating your installation listed here is only valid for the automatic update package. You are also able to update your installation using the methods listed within the INSTALL.html document. The steps for updating phpBB3 automatically are:</p>
+
+		<ul style="margin-left: 20px; font-size: 1.1em;">
+			<li>Go to the <a href="https://www.phpbb.com/downloads/" title="https://www.phpbb.com/downloads/">phpBB.com downloads page</a> and download the "Automatic Update Package" archive.<br /><br /></li>
+			<li>Unpack the archive.<br /><br /></li>
+			<li>Upload the complete uncompressed "install" and "vendor" folders to your phpBB root directory (where your config.php file is).<br /><br /></li>
+		</ul>
+
+		<p>Once uploaded your board will be offline for normal users due to the install directory you uploaded now present.<br /><br />
+		<strong><a href="%1$s" title="%1$s">Now start the update process by pointing your browser to the install folder</a>.</strong><br />
+		<br />
+		You will then be guided through the update process. You will be notified once the update is complete.
+		</p>
+	',
+));
+
+// Updater forms
+$lang = array_merge($lang, array(
+	// Updater types
+	'UPDATE_TYPE'			=> 'Type of update to run',
+
+	'UPDATE_TYPE_ALL'		=> 'Update filesystem and database',
+	'UPDATE_TYPE_DB_ONLY'	=> 'Update database only',
+
+	// File updater methods
+	'UPDATE_FILE_METHOD_TITLE'		=> 'File updater methods',
+
+	'UPDATE_FILE_METHOD'			=> 'File updater method',
+	'UPDATE_FILE_METHOD_DOWNLOAD'	=> 'Download modified files in an archive',
+	'UPDATE_FILE_METHOD_FTP'		=> 'Update files via FTP (Automatic)',
+	'UPDATE_FILE_METHOD_FILESYSTEM'	=> 'Update files via direct file access (Automatic)',
+
+	// File updater archives
+	'SELECT_DOWNLOAD_FORMAT'	=> 'Select download archive format',
+
+	// FTP settings
+	'FTP_SETTINGS'			=> 'FTP settings',
+));
+
+// Requirements messages
+$lang = array_merge($lang, array(
+	'UPDATE_FILES_NOT_FOUND'	=> 'No valid update directory was found, please make sure you uploaded the relevant files.',
+
+	'NO_UPDATE_FILES_UP_TO_DATE'	=> 'Your version is up to date. There is no need to run the update tool. If you want to make an integrity check on your files make sure you uploaded the correct update files.',
+	'OLD_UPDATE_FILES'				=> 'Update files are out of date. The update files found are for updating from phpBB %1$s to phpBB %2$s but the latest version of phpBB is %3$s.',
+	'INCOMPATIBLE_UPDATE_FILES'		=> 'The update files found are incompatible with your installed version. Your installed version is %1$s and the update file is for updating phpBB %2$s to %3$s.',
+));
+
+// Update files
+$lang = array_merge($lang, array(
+	'STAGE_UPDATE_FILES'		=> 'Update files',
+
+	// Check files
+	'UPDATE_CHECK_FILES'	=> 'Check files to update',
+
+	// Update file differ
+	'FILE_DIFFER_ERROR_FILE_CANNOT_BE_READ'	=> 'The file differ failed to open %s.',
+
+	'UPDATE_FILE_DIFF'		=> 'Diffing changed files',
+	'ALL_FILES_DIFFED'		=> 'All modified files has been diffed.',
+
+	// File status
+	'UPDATE_CONTINUE_FILE_UPDATE'	=> 'Update files',
+
+	'DOWNLOAD'							=> 'Download',
+	'DOWNLOAD_CONFLICTS'				=> 'Download merge conflicts archive',
+	'DOWNLOAD_CONFLICTS_EXPLAIN'		=> 'Search for &lt;&lt;&lt; to spot conflicts',
+	'DOWNLOAD_UPDATE_METHOD'			=> 'Download modified files archive',
+	'DOWNLOAD_UPDATE_METHOD_EXPLAIN'	=> 'Once downloaded you should unpack the archive. You will find the modified files you need to upload to your phpBB root directory within it. Please upload the files to their respective locations then. After you have uploaded all files, you may continue with the update process.',
+
+	'FILE_ALREADY_UP_TO_DATE'		=> 'File is already up to date.',
+	'FILE_DIFF_NOT_ALLOWED'			=> 'File not allowed to be diffed.',
+	'FILE_USED'						=> 'Information used from',			// Single file
+	'FILES_CONFLICT'				=> 'Conflict files',
+	'FILES_CONFLICT_EXPLAIN'		=> 'The following files are modified and do not represent the original files from the old version. phpBB determined that these files create conflicts if they are tried to be merged. Please investigate the conflicts and try to manually resolve them or continue the update choosing the preferred merging method. If you resolve the conflicts manually check the files again after you modified them. You are also able to choose between the preferred merge method for every file. The first one will result in a file where the conflicting lines from your old file will be lost, the other one will result in losing the changes from the newer file.',
+	'FILES_DELETED'					=> 'Deleted files',
+	'FILES_DELETED_EXPLAIN'			=> 'The following files do not exist in the new version. These files have to be deleted from your installation.',
+	'FILES_MODIFIED'				=> 'Modified files',
+	'FILES_MODIFIED_EXPLAIN'		=> 'The following files are modified and do not represent the original files from the old version. The updated file will be a merge between your modifications and the new file.',
+	'FILES_NEW'						=> 'New files',
+	'FILES_NEW_EXPLAIN'				=> 'The following files currently do not exist within your installation. These files will be added to your installation.',
+	'FILES_NEW_CONFLICT'			=> 'New conflicting files',
+	'FILES_NEW_CONFLICT_EXPLAIN'	=> 'The following files are new within the latest version but it has been determined that there is already a file with the same name within the same position. This file will be overwritten by the new file.',
+	'FILES_NOT_MODIFIED'			=> 'Not modified files',
+	'FILES_NOT_MODIFIED_EXPLAIN'	=> 'The following files are not modified and represent the original phpBB files from the version you want to update from.',
+	'FILES_UP_TO_DATE'				=> 'Already updated files',
+	'FILES_UP_TO_DATE_EXPLAIN'		=> 'The following files are already up to date and do not need to be updated.',
+	'FILES_VERSION'					=> 'Files Version',
+	'TOGGLE_DISPLAY'				=> 'View/Hide file list',
+
+	// File updater
+	'UPDATE_UPDATING_FILES'	=> 'Updating files',
+
+	'UPDATE_FILE_UPDATER_HAS_FAILED'	=> 'File updater “%1$s“ has failed. The installer will try to fallback to “%2$s“.',
+	'UPDATE_FILE_UPDATERS_HAVE_FAILED'	=> 'The file updater failed. No further fallback methods are available.',
+
+	'UPDATE_CONTINUE_UPDATE_PROCESS'	=> 'Continue update process',
+	'UPDATE_RECHECK_UPDATE_FILES'		=> 'Check files again',
+));
+
+// Update database
+$lang = array_merge($lang, array(
+	'STAGE_UPDATE_DATABASE'		=> 'Update database',
+
+	'INLINE_UPDATE_SUCCESSFUL'		=> 'The database update was successful.',
+
+	'TASK_UPDATE_EXTENSIONS'	=> 'Updating extensions',
+));
+
+// Converter
+$lang = array_merge($lang, array(
+	// Common converter messages
+	'CONVERT_NOT_EXIST'			=> 'The specified convertor does not exist.',
+	'DEV_NO_TEST_FILE'			=> 'No value has been specified for the test_file variable in the convertor. If you are a user of this convertor, you should not be seeing this error, please report this message to the convertor author. If you are a convertor author, you must specify the name of a file which exists in the source board to allow the path to it to be verified.',
+	'COULD_NOT_FIND_PATH'		=> 'Could not find path to your former board. Please check your settings and try again.<br />» %s was specified as the source path.',
+	'CONFIG_PHPBB_EMPTY'		=> 'The phpBB3 config variable for “%s” is empty.',
+
+	'MAKE_FOLDER_WRITABLE'		=> 'Please make sure that this folder exists and is writable by the webserver then try again:<br />»<strong>%s</strong>.',
+	'MAKE_FOLDERS_WRITABLE'		=> 'Please make sure that these folders exist and are writable by the webserver then try again:<br />»<strong>%s</strong>.',
+
+	'INSTALL_TEST'				=> 'Test again',
+
+	'NO_TABLES_FOUND'			=> 'No tables found.',
+	'TABLES_MISSING'			=> 'Could not find these tables<br />» <strong>%s</strong>.',
+	'CHECK_TABLE_PREFIX'		=> 'Please check your table prefix and try again.',
+
+	// Conversion in progress
+	'CONTINUE_CONVERT'			=> 'Continue conversion',
+	'CONTINUE_CONVERT_BODY'		=> 'A previous conversion attempt has been determined. You are now able to choose between starting a new conversion or continuing the conversion.',
+	'CONVERT_NEW_CONVERSION'	=> 'New conversion',
+	'CONTINUE_OLD_CONVERSION'	=> 'Continue previously started conversion',
+
+	// Start conversion
+	'SUB_INTRO'					=> 'Introduction',
+	'CONVERT_INTRO'				=> 'Welcome to the phpBB Unified Convertor Framework',
+	'CONVERT_INTRO_BODY'		=> 'From here, you are able to import data from other (installed) board systems. The list below shows all the conversion modules currently available. If there is no convertor shown in this list for the board software you wish to convert from, please check our website where further conversion modules may be available for download.',
+	'AVAILABLE_CONVERTORS'		=> 'Available convertors',
+	'NO_CONVERTORS'				=> 'No convertors are available for use.',
+	'CONVERT_OPTIONS'			=> 'Options',
+	'SOFTWARE'					=> 'Board software',
+	'VERSION'					=> 'Version',
+	'CONVERT'					=> 'Convert',
+
+	// Settings
+	'STAGE_SETTINGS'			=> 'Settings',
+	'TABLE_PREFIX_SAME'			=> 'The table prefix needs to be the one used by the software you are converting from.<br />» Specified table prefix was %s.',
+	'DEFAULT_PREFIX_IS'			=> 'The convertor was not able to find tables with the specified prefix. Please make sure you have entered the correct details for the board you are converting from. The default table prefix for %1$s is <strong>%2$s</strong>.',
+	'SPECIFY_OPTIONS'			=> 'Specify conversion options',
+	'FORUM_PATH'				=> 'Board path',
+	'FORUM_PATH_EXPLAIN'		=> 'This is the <strong>relative</strong> path on disk to your former board from the <strong>root of this phpBB3 installation</strong>.',
+	'REFRESH_PAGE'				=> 'Refresh page to continue conversion',
+	'REFRESH_PAGE_EXPLAIN'		=> 'If set to yes, the convertor will refresh the page to continue the conversion after having finished a step. If this is your first conversion for testing purposes and to determine any errors in advance, we suggest to set this to No.',
+
+	// Conversion
+	'STAGE_IN_PROGRESS'			=> 'Conversion in progress',
+
+	'AUTHOR_NOTES'				=> 'Author notes<br />» %s',
+	'STARTING_CONVERT'			=> 'Starting conversion process',
+	'CONFIG_CONVERT'			=> 'Converting the configuration',
+	'DONE'						=> 'Done',
+	'PREPROCESS_STEP'			=> 'Executing pre-processing functions/queries',
+	'FILLING_TABLE'				=> 'Filling table <strong>%s</strong>',
+	'FILLING_TABLES'			=> 'Filling tables',
+	'DB_ERR_INSERT'				=> 'Error while processing <code>INSERT</code> query.',
+	'DB_ERR_LAST'				=> 'Error while processing <var>query_last</var>.',
+	'DB_ERR_QUERY_FIRST'		=> 'Error while executing <var>query_first</var>.',
+	'DB_ERR_QUERY_FIRST_TABLE'	=> 'Error while executing <var>query_first</var>, %s (“%s”).',
+	'DB_ERR_SELECT'				=> 'Error while running <code>SELECT</code> query.',
+	'STEP_PERCENT_COMPLETED'	=> 'Step <strong>%d</strong> of <strong>%d</strong>',
+	'FINAL_STEP'				=> 'Process final step',
+	'SYNC_FORUMS'				=> 'Starting to synchronise forums',
+	'SYNC_POST_COUNT'			=> 'Synchronising post_counts',
+	'SYNC_POST_COUNT_ID'		=> 'Synchronising post_counts from <var>entry</var> %1$s to %2$s.',
+	'SYNC_TOPICS'				=> 'Starting to synchronise topics',
+	'SYNC_TOPIC_ID'				=> 'Synchronising topics from <var>topic_id</var> %1$s to %2$s.',
+	'PROCESS_LAST'					=> 'Processing last statements',
+	'UPDATE_TOPICS_POSTED'		=> 'Generating topics posted information',
+	'UPDATE_TOPICS_POSTED_ERR'	=> 'An error occurred while generating topics posted information. You can retry this step in the ACP after the conversion process is completed.',
+	'CONTINUE_LAST'				=> 'Continue last statements',
+	'CLEAN_VERIFY'				=> 'Cleaning up and verifying the final structure',
+	'NOT_UNDERSTAND'			=> 'Could not understand %s #%d, table %s (“%s”)',
+	'NAMING_CONFLICT'			=> 'Naming conflict: %s and %s are both aliases<br /><br />%s',
+
+	// Finish conversion
+	'CONVERT_COMPLETE'			=> 'Conversion completed',
+	'CONVERT_COMPLETE_EXPLAIN'	=> 'You have now successfully converted your board to phpBB 3.2. You can now login and <a href="../">access your board</a>. Please ensure that the settings were transferred correctly before enabling your board by deleting the install directory. Remember that help on using phpBB is available online via the <a href="https://www.phpbb.com/support/docs/en/3.2/ug/">Documentation</a> and the <a href="https://www.phpbb.com/community/viewforum.php?f=466">support forums</a>.',
+
+	'CONV_ERROR_ATTACH_FTP_DIR'			=> 'FTP upload for attachments is enabled at the old board. Please disable the FTP upload option and make sure a valid upload directory is specified, then copy all attachment files to this new web accessible directory. Once you have done this, restart the convertor.',
+	'CONV_ERROR_CONFIG_EMPTY'			=> 'There is no configuration information available for the conversion.',
+	'CONV_ERROR_FORUM_ACCESS'			=> 'Unable to get forum access information.',
+	'CONV_ERROR_GET_CATEGORIES'			=> 'Unable to get categories.',
+	'CONV_ERROR_GET_CONFIG'				=> 'Could not retrieve your board configuration.',
+	'CONV_ERROR_COULD_NOT_READ'			=> 'Unable to access/read “%s”.',
+	'CONV_ERROR_GROUP_ACCESS'			=> 'Unable to get group authentication information.',
+	'CONV_ERROR_INCONSISTENT_GROUPS'	=> 'Inconsistency in groups table detected in add_bots() - you need to add all special groups if you do it manually.',
+	'CONV_ERROR_INSERT_BOT'				=> 'Unable to insert bot into users table.',
+	'CONV_ERROR_INSERT_BOTGROUP'		=> 'Unable to insert bot into bots table.',
+	'CONV_ERROR_INSERT_USER_GROUP'		=> 'Unable to insert user into user_group table.',
+	'CONV_ERROR_MESSAGE_PARSER'			=> 'Message parser error',
+	'CONV_ERROR_NO_AVATAR_PATH'			=> 'Note to developer: you must specify $convertor[\'avatar_path\'] to use %s.',
+	'CONV_ERROR_NO_FORUM_PATH'			=> 'The relative path to the source board has not been specified.',
+	'CONV_ERROR_NO_GALLERY_PATH'		=> 'Note to developer: you must specify $convertor[\'avatar_gallery_path\'] to use %s.',
+	'CONV_ERROR_NO_GROUP'				=> 'Group “%1$s” could not be found in %2$s.',
+	'CONV_ERROR_NO_RANKS_PATH'			=> 'Note to developer: you must specify $convertor[\'ranks_path\'] to use %s.',
+	'CONV_ERROR_NO_SMILIES_PATH'		=> 'Note to developer: you must specify $convertor[\'smilies_path\'] to use %s.',
+	'CONV_ERROR_NO_UPLOAD_DIR'			=> 'Note to developer: you must specify $convertor[\'upload_path\'] to use %s.',
+	'CONV_ERROR_PERM_SETTING'			=> 'Unable to insert/update permission setting.',
+	'CONV_ERROR_PM_COUNT'				=> 'Unable to select folder pm count.',
+	'CONV_ERROR_REPLACE_CATEGORY'		=> 'Unable to insert new forum replacing old category.',
+	'CONV_ERROR_REPLACE_FORUM'			=> 'Unable to insert new forum replacing old forum.',
+	'CONV_ERROR_USER_ACCESS'			=> 'Unable to get user authentication information.',
+	'CONV_ERROR_WRONG_GROUP'			=> 'Wrong group “%1$s” defined in %2$s.',
+	'CONV_OPTIONS_BODY'					=> 'This page collects the data required to access the source board. Enter the database details of your former board; the converter will not change anything in the database given below. The source board should be disabled to allow a consistent conversion.',
+	'CONV_SAVED_MESSAGES'				=> 'Saved messages',
+
+	'PRE_CONVERT_COMPLETE'			=> 'All pre-conversion steps have successfully been completed. You may now begin the actual conversion process. Please note that you may have to manually do and adjust several things. After conversion, especially check the permissions assigned, rebuild your search index which is not converted and also make sure files got copied correctly, for example avatars and smilies.',
+));
--- a/language/en/mcp.php
+++ b/language/en/mcp.php
@@ -135,6 +135,7 @@ $lang = array_merge($lang, array(
 	'LOCK_TOPICS_CONFIRM'		=> 'Are you sure you want to lock all selected topics?',
 	'LOGS_CURRENT_TOPIC'		=> 'Currently viewing logs of:',
 	'LOGIN_EXPLAIN_MCP'			=> 'To moderate this forum you must login.',
+	'LOGVIEW_VIEWPOST'			=> 'View post',
 	'LOGVIEW_VIEWTOPIC'			=> 'View topic',
 	'LOGVIEW_VIEWLOGS'			=> 'View topic log',
 	'LOGVIEW_VIEWFORUM'			=> 'View forum',
--- a/language/en/migrator.php
+++ b/language/en/migrator.php
@@ -48,11 +48,19 @@ $lang = array_merge($lang, array(
 	'MIGRATION_EFFECTIVELY_INSTALLED'	=> 'Migration already effectively installed (skipped): %s',
 	'MIGRATION_EXCEPTION_ERROR'			=> 'Something went wrong during the request and an exception was thrown. The changes made before the error occurred were reversed to the best of our abilities, but you should check the board for errors.',
 	'MIGRATION_NOT_FULFILLABLE'			=> 'The migration "%1$s" is not fulfillable, missing migration "%2$s".',
+	'MIGRATION_NOT_INSTALLED'			=> 'The migration "%s" is not installed.',
 	'MIGRATION_NOT_VALID'				=> '%s is not a valid migration.',
 	'MIGRATION_SCHEMA_DONE'				=> 'Installed Schema: %1$s; Time: %2$.2f seconds',
 	'MIGRATION_SCHEMA_IN_PROGRESS'		=> 'Installing Schema: %1$s; Time: %2$.2f seconds',
 	'MIGRATION_SCHEMA_RUNNING'			=> 'Installing Schema: %s.',
 
+	'MIGRATION_REVERT_DATA_DONE'		=> 'Reverted Data: %1$s; Time: %2$.2f seconds',
+	'MIGRATION_REVERT_DATA_IN_PROGRESS'	=> 'Reverting Data: %1$s; Time: %2$.2f seconds',
+	'MIGRATION_REVERT_DATA_RUNNING'		=> 'Reverting Data: %s.',
+	'MIGRATION_REVERT_SCHEMA_DONE'		=> 'Reverted Schema: %1$s; Time: %2$.2f seconds',
+	'MIGRATION_REVERT_SCHEMA_IN_PROGRESS'	=> 'Reverting Schema: %1$s; Time: %2$.2f seconds',
+	'MIGRATION_REVERT_SCHEMA_RUNNING'	=> 'Reverting Schema: %s.',
+
 	'MIGRATION_INVALID_DATA_MISSING_CONDITION'		=> 'A migration is invalid. An if statement helper is missing a condition.',
 	'MIGRATION_INVALID_DATA_MISSING_STEP'			=> 'A migration is invalid. An if statement helper is missing a valid call to a migration step.',
 	'MIGRATION_INVALID_DATA_CUSTOM_NOT_CALLABLE'	=> 'A migration is invalid. A custom callable function could not be called.',
--- a/language/en/posting.php
+++ b/language/en/posting.php
@@ -182,8 +182,10 @@ $lang = array_merge($lang, array(
 	'NO_POLL_TITLE'				=> 'You have to enter a poll title.',
 	'NO_POST'					=> 'The requested post does not exist.',
 	'NO_POST_MODE'				=> 'No post mode specified.',
+	'NO_TEMP_DIR'				=> 'Temporary folder could not be found or is not writable.',
 
 	'PARTIAL_UPLOAD'			=> 'The uploaded file was only partially uploaded.',
+	'PHP_UPLOAD_STOPPED'		=> 'A PHP extension has stopped the file upload.',
 	'PHP_SIZE_NA'				=> 'The attachment’s file size is too large.<br />Could not determine the maximum size defined by PHP in php.ini.',
 	'PHP_SIZE_OVERRUN'			=> 'The attachment’s file size is too large, the maximum upload size is %1$d %2$s.<br />Please note this is set in php.ini and cannot be overridden.',
 	'PLACE_INLINE'				=> 'Place inline',
--- a/language/en/ucp.php
+++ b/language/en/ucp.php
@@ -100,6 +100,7 @@ $lang = array_merge($lang, array(
 	'AVATAR_DRIVER_UPLOAD_TITLE'	=> 'Upload avatar',
 	'AVATAR_DRIVER_UPLOAD_EXPLAIN'	=> 'Upload your own custom avatar.',
 	'AVATAR_EXPLAIN'				=> 'Maximum dimensions; width: %1$s, height: %2$s, file size: %3$.2f KiB.',
+	'AVATAR_EXPLAIN_NO_FILESIZE'	=> 'Maximum dimensions; width: %1$s, height: %2$s.',
 	'AVATAR_FEATURES_DISABLED'		=> 'The avatar functionality is currently disabled.',
 	'AVATAR_GALLERY'				=> 'Local gallery',
 	'AVATAR_GENERAL_UPLOAD_ERROR'	=> 'Could not upload avatar to %s.',
@@ -327,6 +328,7 @@ $lang = array_merge($lang, array(
 	'NOTIFICATION_GROUP_MODERATION'						=> 'Moderation Notifications',
 	'NOTIFICATION_GROUP_ADMINISTRATION'					=> 'Administration Notifications',
 	'NOTIFICATION_GROUP_POSTING'						=> 'Posting Notifications',
+	'NOTIFICATION_METHOD_BOARD'							=> 'Notifications',
 	'NOTIFICATION_METHOD_EMAIL'							=> 'Email',
 	'NOTIFICATION_METHOD_JABBER'						=> 'Jabber',
 	'NOTIFICATION_TYPE'									=> 'Notification type',
--- a/mcp.php
+++ b/mcp.php
@@ -33,10 +33,10 @@ $module = new p_master();
 $template->assign_var('S_IN_MCP', true);
 
 // Basic parameter data
-$id = request_var('i', '');
+$id = $request->variable('i', '');
 
-$mode = request_var('mode', array(''));
-$mode = sizeof($mode) ? array_shift($mode) : request_var('mode', '');
+$mode = $request->variable('mode', array(''));
+$mode = sizeof($mode) ? array_shift($mode) : $request->variable('mode', '');
 
 // Only Moderators can go beyond this point
 if (!$user->data['is_registered'])
@@ -50,10 +50,10 @@ if (!$user->data['is_registered'])
 }
 
 $quickmod = (isset($_REQUEST['quickmod'])) ? true : false;
-$action = request_var('action', '');
-$action_ary = request_var('action', array('' => 0));
+$action = $request->variable('action', '');
+$action_ary = $request->variable('action', array('' => 0));
 
-$forum_action = request_var('forum_action', '');
+$forum_action = $request->variable('forum_action', '');
 if ($forum_action !== '' && $request->variable('sort', false, false, \phpbb\request\request_interface::POST))
 {
 	$action = $forum_action;
@@ -71,12 +71,12 @@ if ($mode == 'topic_logs')
 	$quickmod = false;
 }
 
-$post_id = request_var('p', 0);
-$topic_id = request_var('t', 0);
-$forum_id = request_var('f', 0);
-$report_id = request_var('r', 0);
-$user_id = request_var('u', 0);
-$username = utf8_normalize_nfc(request_var('username', '', true));
+$post_id = $request->variable('p', 0);
+$topic_id = $request->variable('t', 0);
+$forum_id = $request->variable('f', 0);
+$report_id = $request->variable('r', 0);
+$user_id = $request->variable('u', 0);
+$username = $request->variable('username', '', true);
 
 if ($post_id)
 {
@@ -111,8 +111,8 @@ if (!$auth->acl_getf_global('m_'))
 		'lock'			=> 'f_user_lock',
 		'make_sticky'	=> 'f_sticky',
 		'make_announce'	=> 'f_announce',
-		'make_global'	=> 'f_announce',
-		'make_normal'	=> array('f_announce', 'f_sticky')
+		'make_global'	=> 'f_announce_global',
+		'make_normal'	=> array('f_announce', 'f_announce_global', 'f_sticky')
 	);
 
 	$allow_user = false;
@@ -127,6 +127,7 @@ if (!$auth->acl_getf_global('m_'))
 
 	if (!$allow_user)
 	{
+		send_status_line(403, 'Forbidden');
 		trigger_error('NOT_AUTHORISED');
 	}
 }
@@ -134,6 +135,7 @@ if (!$auth->acl_getf_global('m_'))
 // if the user cannot read the forum he tries to access then we won't allow mcp access either
 if ($forum_id && !$auth->acl_get('f_read', $forum_id))
 {
+	send_status_line(403, 'Forbidden');
 	trigger_error('NOT_AUTHORISED');
 }
 
@@ -192,7 +194,7 @@ if ($quickmod)
 
 		case 'topic_logs':
 			// Reset start parameter if we jumped from the quickmod dropdown
-			if (request_var('start', 0))
+			if ($request->variable('start', 0))
 			{
 				$request->overwrite('start', 0);
 			}
--- a/memberlist.php
+++ b/memberlist.php
@@ -20,7 +20,7 @@ $phpEx = substr(strrchr(__FILE__, '.'), 1);
 include($phpbb_root_path . 'common.' . $phpEx);
 include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
 
-$mode = request_var('mode', '');
+$mode = $request->variable('mode', '');
 
 if ($mode === 'contactadmin')
 {
@@ -37,11 +37,11 @@ $user->setup(array('memberlist', 'groups'));
 $template->assign_var('S_IN_MEMBERLIST', true);
 
 // Grab data
-$action		= request_var('action', '');
-$user_id	= request_var('u', ANONYMOUS);
-$username	= request_var('un', '', true);
-$group_id	= request_var('g', 0);
-$topic_id	= request_var('t', 0);
+$action		= $request->variable('action', '');
+$user_id	= $request->variable('u', ANONYMOUS);
+$username	= $request->variable('un', '', true);
+$group_id	= $request->variable('g', 0);
+$topic_id	= $request->variable('t', 0);
 
 // Redirect when old mode is used
 if ($mode == 'leaders')
@@ -75,6 +75,7 @@ switch ($mode)
 		{
 			if ($user->data['user_id'] != ANONYMOUS)
 			{
+				send_status_line(403, 'Forbidden');
 				trigger_error('NO_VIEW_USERS');
 			}
 
@@ -83,12 +84,15 @@ switch ($mode)
 	break;
 }
 
-$start	= request_var('start', 0);
+/** @var \phpbb\group\helper $group_helper */
+$group_helper = $phpbb_container->get('group_helper');
+
+$start	= $request->variable('start', 0);
 $submit = (isset($_POST['submit'])) ? true : false;
 
 $default_key = 'c';
-$sort_key = request_var('sk', $default_key);
-$sort_dir = request_var('sd', 'a');
+$sort_key = $request->variable('sk', $default_key);
+$sort_dir = $request->variable('sd', 'a');
 
 $user_types = array(USER_NORMAL, USER_FOUNDER);
 if ($auth->acl_get('a_user'))
@@ -142,7 +146,7 @@ switch ($mode)
 			}
 			else
 			{
-				$row['group_name'] = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'];
+				$row['group_name'] = $group_helper->get_name($row['group_name']);
 				$row['u_group'] = append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&amp;g=' . $row['group_id']);
 			}
 
@@ -369,6 +373,7 @@ switch ($mode)
 
 		if (!$auth->acl_get('u_sendim'))
 		{
+			send_status_line(403, 'Forbidden');
 			trigger_error('NOT_AUTHORISED');
 		}
 
@@ -419,7 +424,7 @@ switch ($mode)
 						include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
 
 						$subject = sprintf($user->lang['IM_JABBER_SUBJECT'], $user->data['username'], $config['server_name']);
-						$message = utf8_normalize_nfc(request_var('message', '', true));
+						$message = $request->variable('message', '', true);
 
 						if (empty($message))
 						{
@@ -544,20 +549,14 @@ switch ($mode)
 		$group_data = $group_sort = array();
 		foreach ($profile_groups as $row)
 		{
-			if ($row['group_type'] == GROUP_SPECIAL)
-			{
-				// Lookup group name in language dictionary
-				if (isset($user->lang['G_' . $row['group_name']]))
-				{
-					$row['group_name'] = $user->lang['G_' . $row['group_name']];
-				}
-			}
-			else if (!$auth_hidden_groups && $row['group_type'] == GROUP_HIDDEN && !isset($user_groups[$row['group_id']]))
+			if (!$auth_hidden_groups && $row['group_type'] == GROUP_HIDDEN && !isset($user_groups[$row['group_id']]))
 			{
 				// Skip over hidden groups the user cannot see
 				continue;
 			}
 
+			$row['group_name'] = $group_helper->get_name($row['group_name']);
+
 			$group_sort[$row['group_id']] = utf8_clean_string($row['group_name']);
 			$group_data[$row['group_id']] = $row;
 		}
@@ -646,6 +645,7 @@ switch ($mode)
 		$profile_fields = array();
 		if ($config['load_cpf_viewprofile'])
 		{
+			/* @var $cp \phpbb\profilefields\manager */
 			$cp = $phpbb_container->get('profilefields.manager');
 			$profile_fields = $cp->grab_profile_fields_data($user_id);
 			$profile_fields = (isset($profile_fields[$user_id])) ? $cp->generate_profile_fields_template_data($profile_fields[$user_id]) : array();
@@ -794,8 +794,8 @@ switch ($mode)
 			include($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
 		}
 
-		$user_id	= request_var('u', 0);
-		$topic_id	= request_var('t', 0);
+		$user_id	= $request->variable('u', 0);
+		$topic_id	= $request->variable('t', 0);
 
 		if ($user_id)
 		{
@@ -813,6 +813,8 @@ switch ($mode)
 		{
 			trigger_error('NO_EMAIL');
 		}
+
+		/** @var $form \phpbb\message\form */
 		$form = $phpbb_container->get('message.form.' . $form_name);
 
 		$form->bind($request);
@@ -868,6 +870,8 @@ switch ($mode)
 		// The basic memberlist
 		$page_title = $user->lang['MEMBERLIST'];
 		$template_html = 'memberlist_body.html';
+
+		/* @var $pagination \phpbb\pagination */
 		$pagination = $phpbb_container->get('pagination');
 
 		// Sorting
@@ -916,9 +920,9 @@ switch ($mode)
 		$sql_select = $sql_where_data = $sql_from = $sql_where = $order_by = '';
 
 
-		$form			= request_var('form', '');
-		$field			= request_var('field', '');
-		$select_single 	= request_var('select_single', false);
+		$form			= $request->variable('form', '');
+		$field			= $request->variable('field', '');
+		$select_single 	= $request->variable('select_single', false);
 
 		// Search URL parameters, if any of these are in the URL we do a search
 		$search_params = array('username', 'email', 'jabber', 'search_group_id', 'joined_select', 'active_select', 'count_select', 'joined', 'active', 'count', 'ip');
@@ -928,20 +932,20 @@ switch ($mode)
 		$field = (!preg_match('/^[a-z0-9_-]+$/i', $field)) ? '' : $field;
 		if ((($mode == '' || $mode == 'searchuser') || sizeof(array_intersect($request->variable_names(\phpbb\request\request_interface::GET), $search_params)) > 0) && ($config['load_search'] || $auth->acl_get('a_')))
 		{
-			$username	= request_var('username', '', true);
-			$email		= strtolower(request_var('email', ''));
-			$jabber		= request_var('jabber', '');
-			$search_group_id	= request_var('search_group_id', 0);
+			$username	= $request->variable('username', '', true);
+			$email		= strtolower($request->variable('email', ''));
+			$jabber		= $request->variable('jabber', '');
+			$search_group_id	= $request->variable('search_group_id', 0);
 
 			// when using these, make sure that we actually have values defined in $find_key_match
-			$joined_select	= request_var('joined_select', 'lt');
-			$active_select	= request_var('active_select', 'lt');
-			$count_select	= request_var('count_select', 'eq');
+			$joined_select	= $request->variable('joined_select', 'lt');
+			$active_select	= $request->variable('active_select', 'lt');
+			$count_select	= $request->variable('count_select', 'eq');
 
-			$joined			= explode('-', request_var('joined', ''));
-			$active			= explode('-', request_var('active', ''));
-			$count			= (request_var('count', '') !== '') ? request_var('count', 0) : '';
-			$ipdomain		= request_var('ip', '');
+			$joined			= explode('-', $request->variable('joined', ''));
+			$active			= explode('-', $request->variable('active', ''));
+			$count			= ($request->variable('count', '') !== '') ? $request->variable('count', 0) : '';
+			$ipdomain		= $request->variable('ip', '');
 
 			$find_key_match = array('lt' => '<', 'gt' => '>', 'eq' => '=');
 
@@ -1075,7 +1079,7 @@ switch ($mode)
 			}
 		}
 
-		$first_char = request_var('first_char', '');
+		$first_char = $request->variable('first_char', '');
 
 		if ($first_char == 'other')
 		{
@@ -1174,7 +1178,7 @@ switch ($mode)
 
 			$template->assign_vars(array(
 				'GROUP_DESC'	=> generate_text_for_display($group_row['group_desc'], $group_row['group_desc_uid'], $group_row['group_desc_bitfield'], $group_row['group_desc_options']),
-				'GROUP_NAME'	=> ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'],
+				'GROUP_NAME'	=> $group_helper->get_name($group_row['group_name']),
 				'GROUP_COLOR'	=> $group_row['group_colour'],
 				'GROUP_TYPE'	=> $user->lang['GROUP_IS_' . $group_row['l_group_type']],
 				'GROUP_RANK'	=> $user_rank_data['title'],
@@ -1247,7 +1251,7 @@ switch ($mode)
 		// Build a relevant pagination_url
 		$params = $sort_params = array();
 
-		// We do not use request_var() here directly to save some calls (not all variables are set)
+		// We do not use $request->variable() here directly to save some calls (not all variables are set)
 		$check_params = array(
 			'g'				=> array('g', 0),
 			'sk'			=> array('sk', $default_key),
@@ -1264,7 +1268,7 @@ switch ($mode)
 			'count_select'	=> array('count_select', 'eq'),
 			'joined'		=> array('joined', ''),
 			'active'		=> array('active', ''),
-			'count'			=> (request_var('count', '') !== '') ? array('count', 0) : array('count', ''),
+			'count'			=> ($request->variable('count', '') !== '') ? array('count', 0) : array('count', ''),
 			'ip'			=> array('ip', ''),
 			'first_char'	=> array('first_char', ''),
 		);
@@ -1277,7 +1281,7 @@ switch ($mode)
 				continue;
 			}
 
-			$param = call_user_func_array('request_var', $call);
+			$param = call_user_func_array(array($request, 'variable'), $call);
 			// Encode strings, convert everything else to int in order to prevent empty parameters.
 			$param = urlencode($key) . '=' . ((is_string($param)) ? urlencode($param) : (int) $param);
 			$params[] = $param;
@@ -1330,7 +1334,7 @@ switch ($mode)
 		// Some search user specific data
 		if (($mode == '' || $mode == 'searchuser') && ($config['load_search'] || $auth->acl_get('a_')))
 		{
-			$group_selected = request_var('search_group_id', 0);
+			$group_selected = $request->variable('search_group_id', 0);
 			$s_group_select = '<option value="0"' . ((!$group_selected) ? ' selected="selected"' : '') . '>&nbsp;</option>';
 			$group_ids = array();
 
@@ -1374,7 +1378,7 @@ switch ($mode)
 			while ($row = $db->sql_fetchrow($result))
 			{
 				$group_ids[] = $row['group_id'];
-				$s_group_select .= '<option value="' . $row['group_id'] . '"' . (($group_selected == $row['group_id']) ? ' selected="selected"' : '') . '>' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</option>';
+				$s_group_select .= '<option value="' . $row['group_id'] . '"' . (($group_selected == $row['group_id']) ? ' selected="selected"' : '') . '>' . $group_helper->get_name($row['group_name']) . '</option>';
 			}
 			$db->sql_freeresult($result);
 
@@ -1430,6 +1434,7 @@ switch ($mode)
 		// Load custom profile fields
 		if ($config['load_cpf_memberlist'])
 		{
+			/* @var $cp \phpbb\profilefields\manager */
 			$cp = $phpbb_container->get('profilefields.manager');
 
 			$cp_row = $cp->generate_profile_fields_template_headlines('field_show_on_ml');
--- /dev/null
+++ b/phpbb/attachment/delete.php
@@ -0,0 +1,432 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\attachment;
+
+use \phpbb\config\config;
+use \phpbb\db\driver\driver_interface;
+use \phpbb\event\dispatcher;
+use \phpbb\filesystem\filesystem;
+
+/**
+ * Attachment delete class
+ */
+class delete
+{
+	/** @var config */
+	protected $config;
+
+	/** @var driver_interface */
+	protected $db;
+
+	/** @var dispatcher */
+	protected $dispatcher;
+
+	/** @var filesystem  */
+	protected $filesystem;
+
+	/** @var resync */
+	protected $resync;
+
+	/** @var string phpBB root path */
+	protected $phpbb_root_path;
+
+	/** @var array Attachement IDs */
+	protected $ids;
+
+	/** @var string SQL ID string */
+	private $sql_id;
+
+	/** @var string SQL where string */
+	private $sql_where = '';
+
+	/** @var int Number of deleted items */
+	private $num_deleted;
+
+	/** @var array Post IDs */
+	private $post_ids = array();
+
+	/** @var array Message IDs */
+	private $message_ids = array();
+
+	/** @var array Topic IDs */
+	private $topic_ids = array();
+
+	/** @var array Info of physical file */
+	private $physical = array();
+
+	/**
+	 * Attachment delete class constructor
+	 *
+	 * @param config $config
+	 * @param driver_interface $db
+	 * @param dispatcher $dispatcher
+	 * @param filesystem $filesystem
+	 * @param resync $resync
+	 * @param string $phpbb_root_path
+	 */
+	public function __construct(config $config, driver_interface $db, dispatcher $dispatcher, filesystem $filesystem, resync $resync, $phpbb_root_path)
+	{
+		$this->config = $config;
+		$this->db = $db;
+		$this->dispatcher = $dispatcher;
+		$this->filesystem = $filesystem;
+		$this->resync = $resync;
+		$this->phpbb_root_path = $phpbb_root_path;
+	}
+
+	/**
+	 * Delete Attachments
+	 *
+	 * @param string $mode can be: post|message|topic|attach|user
+	 * @param mixed $ids can be: post_ids, message_ids, topic_ids, attach_ids, user_ids
+	 * @param bool $resync set this to false if you are deleting posts or topics
+	 *
+	 * @return int|bool Number of deleted attachments or false if something
+	 *			went wrong during attachment deletion
+	 */
+	public function delete($mode, $ids, $resync = true)
+	{
+		if (!$this->set_attachment_ids($ids))
+		{
+			return false;
+		}
+
+		$this->set_sql_constraints($mode);
+
+		/**
+		 * Perform additional actions before collecting data for attachment(s) deletion
+		 *
+		 * @event core.delete_attachments_collect_data_before
+		 * @var	string	mode			Variable containing attachments deletion mode, can be: post|message|topic|attach|user
+		 * @var	mixed	ids				Array or comma separated list of ids corresponding to the mode
+		 * @var	bool	resync			Flag indicating if posts/messages/topics should be synchronized
+		 * @var	string	sql_id			The field name to collect/delete data for depending on the mode
+		 * @since 3.1.7-RC1
+		 */
+		$vars = array(
+			'mode',
+			'ids',
+			'resync',
+			'sql_id',
+		);
+		extract($this->dispatcher->trigger_event('core.delete_attachments_collect_data_before', compact($vars)));
+
+		// Collect post and topic ids for later use if we need to touch remaining entries (if resync is enabled)
+		$this->collect_attachment_info($resync);
+
+		// Delete attachments from database
+		$this->delete_attachments_from_db();
+
+		/**
+		 * Perform additional actions after attachment(s) deletion from the database
+		 *
+		 * @event core.delete_attachments_from_database_after
+		 * @var	string	mode			Variable containing attachments deletion mode, can be: post|message|topic|attach|user
+		 * @var	mixed	ids				Array or comma separated list of ids corresponding to the mode
+		 * @var	bool	resync			Flag indicating if posts/messages/topics should be synchronized
+		 * @var	string	sql_id			The field name to collect/delete data for depending on the mode
+		 * @var	array	post_ids		Array with post ids for deleted attachment(s)
+		 * @var	array	topic_ids		Array with topic ids for deleted attachment(s)
+		 * @var	array	message_ids		Array with private message ids for deleted attachment(s)
+		 * @var	array	physical		Array with deleted attachment(s) physical file(s) data
+		 * @var	int		num_deleted		The number of deleted attachment(s) from the database
+		 * @since 3.1.7-RC1
+		 */
+		$vars = array(
+			'mode',
+			'ids',
+			'resync',
+			'sql_id',
+			'post_ids',
+			'topic_ids',
+			'message_ids',
+			'physical',
+			'num_deleted',
+		);
+		extract($this->dispatcher->trigger_event('core.delete_attachments_from_database_after', compact($vars)));
+
+		if (!$this->num_deleted)
+		{
+			return 0;
+		}
+
+		// Delete attachments from filesystem
+		$this->remove_from_filesystem();
+
+		// If we do not resync, we do not need to adjust any message, post, topic or user entries
+		if (!$resync)
+		{
+			return $this->num_deleted;
+		}
+
+		// No more use for the original ids
+		unset($ids);
+
+		// Update post indicators for posts now no longer having attachments
+		$this->resync->resync('post', $this->post_ids);
+
+		// Update message table if messages are affected
+		$this->resync->resync('message', $this->message_ids);
+
+		// Now update the topics. This is a bit trickier, because there could be posts still having attachments within the topic
+		$this->resync->resync('topic', $this->topic_ids);
+
+		return $this->num_deleted;
+	}
+
+	/**
+	 * Set attachment IDs
+	 *
+	 * @param mixed $ids ID or array of IDs
+	 *
+	 * @return bool True if attachment IDs were set, false if not
+	 */
+	protected function set_attachment_ids($ids)
+	{
+		// 0 is as bad as an empty array
+		if (empty($ids))
+		{
+			return false;
+		}
+
+		if (is_array($ids))
+		{
+			$ids = array_unique($ids);
+			$this->ids = array_map('intval', $ids);
+		}
+		else
+		{
+			$this->ids = array((int) $ids);
+		}
+
+		return true;
+	}
+
+	/**
+	 * Set SQL constraints based on mode
+	 *
+	 * @param string $mode Delete mode; can be: post|message|topic|attach|user
+	 */
+	private function set_sql_constraints($mode)
+	{
+		switch ($mode)
+		{
+			case 'post':
+			case 'message':
+				$this->sql_id = 'post_msg_id';
+				$this->sql_where = ' AND in_message = ' . ($mode == 'message' ? 1 : 0);
+			break;
+
+			case 'topic':
+				$this->sql_id = 'topic_id';
+			break;
+
+			case 'user':
+				$this->sql_id = 'poster_id';
+			break;
+
+			case 'attach':
+			default:
+				$this->sql_id = 'attach_id';
+			break;
+		}
+	}
+
+	/**
+	 * Collect info about attachment IDs
+	 *
+	 * @param bool $resync Whether topics/posts should be resynced after delete
+	 */
+	protected function collect_attachment_info($resync)
+	{
+		// Collect post and topic ids for later use if we need to touch remaining entries (if resync is enabled)
+		$sql = 'SELECT post_msg_id, topic_id, in_message, physical_filename, thumbnail, filesize, is_orphan
+			FROM ' . ATTACHMENTS_TABLE . '
+			WHERE ' . $this->db->sql_in_set($this->sql_id, $this->ids);
+
+		$sql .= $this->sql_where;
+
+		$result = $this->db->sql_query($sql);
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			// We only need to store post/message/topic ids if resync is enabled and the file is not orphaned
+			if ($resync && !$row['is_orphan'])
+			{
+				if (!$row['in_message'])
+				{
+					$this->post_ids[] = $row['post_msg_id'];
+					$this->topic_ids[] = $row['topic_id'];
+				}
+				else
+				{
+					$this->message_ids[] = $row['post_msg_id'];
+				}
+			}
+
+			$this->physical[] = array('filename' => $row['physical_filename'], 'thumbnail' => $row['thumbnail'], 'filesize' => $row['filesize'], 'is_orphan' => $row['is_orphan']);
+		}
+		$this->db->sql_freeresult($result);
+
+		// IDs should be unique
+		$this->post_ids = array_unique($this->post_ids);
+		$this->message_ids = array_unique($this->message_ids);
+		$this->topic_ids = array_unique($this->topic_ids);
+	}
+
+	/**
+	 * Delete attachments from database table
+	 */
+	protected function delete_attachments_from_db()
+	{
+		/**
+		 * Perform additional actions before attachment(s) deletion
+		 *
+		 * @event core.delete_attachments_before
+		 * @var	string	mode			Variable containing attachments deletion mode, can be: post|message|topic|attach|user
+		 * @var	mixed	ids				Array or comma separated list of ids corresponding to the mode
+		 * @var	bool	resync			Flag indicating if posts/messages/topics should be synchronized
+		 * @var	string	sql_id			The field name to collect/delete data for depending on the mode
+		 * @var	array	post_ids		Array with post ids for deleted attachment(s)
+		 * @var	array	topic_ids		Array with topic ids for deleted attachment(s)
+		 * @var	array	message_ids		Array with private message ids for deleted attachment(s)
+		 * @var	array	physical		Array with deleted attachment(s) physical file(s) data
+		 * @since 3.1.7-RC1
+		 */
+		$vars = array(
+			'mode',
+			'ids',
+			'resync',
+			'sql_id',
+			'post_ids',
+			'topic_ids',
+			'message_ids',
+			'physical',
+		);
+		extract($this->dispatcher->trigger_event('core.delete_attachments_before', compact($vars)));
+
+		// Delete attachments
+		$sql = 'DELETE FROM ' . ATTACHMENTS_TABLE . '
+			WHERE ' . $this->db->sql_in_set($this->sql_id, $this->ids);
+
+		$sql .= $this->sql_where;
+
+		$this->db->sql_query($sql);
+		$this->num_deleted = $this->db->sql_affectedrows();
+	}
+
+	/**
+	 * Delete attachments from filesystem
+	 */
+	protected function remove_from_filesystem()
+	{
+		$space_removed = $files_removed = 0;
+
+		foreach ($this->physical as $file_ary)
+		{
+			if ($this->unlink_attachment($file_ary['filename'], 'file', true) && !$file_ary['is_orphan'])
+			{
+				// Only non-orphaned files count to the file size
+				$space_removed += $file_ary['filesize'];
+				$files_removed++;
+			}
+
+			if ($file_ary['thumbnail'])
+			{
+				$this->unlink_attachment($file_ary['filename'], 'thumbnail', true);
+			}
+		}
+
+		/**
+		 * Perform additional actions after attachment(s) deletion from the filesystem
+		 *
+		 * @event core.delete_attachments_from_filesystem_after
+		 * @var	string	mode			Variable containing attachments deletion mode, can be: post|message|topic|attach|user
+		 * @var	mixed	ids				Array or comma separated list of ids corresponding to the mode
+		 * @var	bool	resync			Flag indicating if posts/messages/topics should be synchronized
+		 * @var	string	sql_id			The field name to collect/delete data for depending on the mode
+		 * @var	array	post_ids		Array with post ids for deleted attachment(s)
+		 * @var	array	topic_ids		Array with topic ids for deleted attachment(s)
+		 * @var	array	message_ids		Array with private message ids for deleted attachment(s)
+		 * @var	array	physical		Array with deleted attachment(s) physical file(s) data
+		 * @var	int		num_deleted		The number of deleted attachment(s) from the database
+		 * @var	int		space_removed	The size of deleted files(s) from the filesystem
+		 * @var	int		files_removed	The number of deleted file(s) from the filesystem
+		 * @since 3.1.7-RC1
+		 */
+		$vars = array(
+			'mode',
+			'ids',
+			'resync',
+			'sql_id',
+			'post_ids',
+			'topic_ids',
+			'message_ids',
+			'physical',
+			'num_deleted',
+			'space_removed',
+			'files_removed',
+		);
+		extract($this->dispatcher->trigger_event('core.delete_attachments_from_filesystem_after', compact($vars)));
+
+		if ($space_removed || $files_removed)
+		{
+			$this->config->increment('upload_dir_size', $space_removed * (-1), false);
+			$this->config->increment('num_files', $files_removed * (-1), false);
+		}
+	}
+
+	/**
+	 * Delete attachment from filesystem
+	 *
+	 * @param string $filename Filename of attachment
+	 * @param string $mode Delete mode
+	 * @param bool $entry_removed Whether entry was removed. Defaults to false
+	 * @return bool True if file was removed, false if not
+	 */
+	public function unlink_attachment($filename, $mode = 'file', $entry_removed = false)
+	{
+		// Because of copying topics or modifications a physical filename could be assigned more than once. If so, do not remove the file itself.
+		$sql = 'SELECT COUNT(attach_id) AS num_entries
+		FROM ' . ATTACHMENTS_TABLE . "
+		WHERE physical_filename = '" . $this->db->sql_escape(utf8_basename($filename)) . "'";
+		$result = $this->db->sql_query($sql);
+		$num_entries = (int) $this->db->sql_fetchfield('num_entries');
+		$this->db->sql_freeresult($result);
+
+		// Do not remove file if at least one additional entry with the same name exist.
+		if (($entry_removed && $num_entries > 0) || (!$entry_removed && $num_entries > 1))
+		{
+			return false;
+		}
+
+		$filename = ($mode == 'thumbnail') ? 'thumb_' . utf8_basename($filename) : utf8_basename($filename);
+		$filepath = $this->phpbb_root_path . $this->config['upload_path'] . '/' . $filename;
+
+		try
+		{
+			if ($this->filesystem->exists($filepath))
+			{
+				$this->filesystem->remove($this->phpbb_root_path . $this->config['upload_path'] . '/' . $filename);
+				return true;
+			}
+		}
+		catch (\phpbb\filesystem\exception\filesystem_exception $exception)
+		{
+			// Fail is covered by return statement below
+		}
+
+		return false;
+	}
+}
--- /dev/null
+++ b/phpbb/attachment/manager.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\attachment;
+
+/**
+ * Attachment manager
+ */
+class manager
+{
+	/** @var delete Attachment delete class */
+	protected $delete;
+
+	/** @var resync Attachment resync class */
+	protected $resync;
+
+	/** @var upload Attachment upload class */
+	protected $upload;
+
+	/**
+	 * Constructor for attachment manager
+	 *
+	 * @param delete $delete Attachment delete class
+	 * @param resync $resync Attachment resync class
+	 * @param upload $upload Attachment upload class
+	 */
+	public function __construct(delete $delete, resync $resync, upload $upload)
+	{
+		$this->delete = $delete;
+		$this->resync = $resync;
+		$this->upload = $upload;
+	}
+
+	/**
+	 * Wrapper method for deleting attachments
+	 *
+	 * @param string $mode can be: post|message|topic|attach|user
+	 * @param mixed $ids can be: post_ids, message_ids, topic_ids, attach_ids, user_ids
+	 * @param bool $resync set this to false if you are deleting posts or topics
+	 *
+	 * @return int|bool Number of deleted attachments or false if something
+	 *			went wrong during attachment deletion
+	 */
+	public function delete($mode, $ids, $resync = true)
+	{
+		return $this->delete->delete($mode, $ids, $resync);
+	}
+
+	/**
+	 * Wrapper method for deleting attachments from filesystem
+	 *
+	 * @param string $filename Filename of attachment
+	 * @param string $mode Delete mode
+	 * @param bool $entry_removed Whether entry was removed. Defaults to false
+	 * @return bool True if file was removed, false if not
+	 */
+	public function unlink($filename, $mode = 'file', $entry_removed = false)
+	{
+		return $this->delete->unlink_attachment($filename, $mode, $entry_removed);
+	}
+
+	/**
+	 * Wrapper method for resyncing specified type
+	 *
+	 * @param string $type Type of resync
+	 * @param array $ids IDs to resync
+	 */
+	public function resync($type, $ids)
+	{
+		$this->resync->resync($type, $ids);
+	}
+
+	/**
+	 * Wrapper method for uploading attachment
+	 *
+	 * @param string			$form_name		The form name of the file upload input
+	 * @param int			$forum_id		The id of the forum
+	 * @param bool			$local			Whether the file is local or not
+	 * @param string			$local_storage	The path to the local file
+	 * @param bool			$is_message		Whether it is a PM or not
+	 * @param array		$local_filedata	An file data object created for the local file
+	 *
+	 * @return array File data array
+	 */
+	public function upload($form_name, $forum_id, $local = false, $local_storage = '', $is_message = false, $local_filedata = [])
+	{
+		return $this->upload->upload($form_name, $forum_id, $local, $local_storage, $is_message, $local_filedata);
+	}
+}
--- /dev/null
+++ b/phpbb/attachment/resync.php
@@ -0,0 +1,124 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\attachment;
+
+use \phpbb\db\driver\driver_interface;
+
+/**
+ * Attachment resync class
+ */
+class resync
+{
+	/** @var driver_interface */
+	protected $db;
+
+	/** @var string Attachment table SQL ID */
+	private $attach_sql_id;
+
+	/** @var string Resync table SQL ID  */
+	private $resync_sql_id;
+
+	/** @var string Resync SQL table */
+	private $resync_table;
+
+	/** @var string SQL where statement */
+	private $sql_where;
+
+	/**
+	 * Constructor for attachment resync class
+	 *
+	 * @param driver_interface $db Database driver
+	 */
+	public function __construct(driver_interface $db)
+	{
+		$this->db = $db;
+	}
+
+	/**
+	 * Set type constraints for attachment resync
+	 *
+	 * @param string $type Type of resync; can be: message|post|topic
+	 */
+	protected function set_type_constraints($type)
+	{
+		switch ($type)
+		{
+			case 'message':
+				$this->attach_sql_id = 'post_msg_id';
+				$this->sql_where = ' AND in_message = 1
+					AND is_orphan = 0';
+				$this->resync_table = PRIVMSGS_TABLE;
+				$this->resync_sql_id = 'msg_id';
+			break;
+
+			case 'post':
+				$this->attach_sql_id = 'post_msg_id';
+				$this->sql_where = ' AND in_message = 0
+					AND is_orphan = 0';
+				$this->resync_table = POSTS_TABLE;
+				$this->resync_sql_id = 'post_id';
+			break;
+
+			case 'topic':
+				$this->attach_sql_id = 'topic_id';
+				$this->sql_where = ' AND is_orphan = 0';
+				$this->resync_table = TOPICS_TABLE;
+				$this->resync_sql_id = 'topic_id';
+			break;
+		}
+	}
+
+	/**
+	 * Resync specified type
+	 *
+	 * @param string $type Type of resync
+	 * @param array $ids IDs to resync
+	 */
+	public function resync($type, $ids)
+	{
+		if (empty($type) || !is_array($ids) || !sizeof($ids) || !in_array($type, array('post', 'topic', 'message')))
+		{
+			return;
+		}
+
+		$this->set_type_constraints($type);
+
+		// Just check which elements are still having an assigned attachment
+		// not orphaned by querying the attachments table
+		$sql = 'SELECT ' . $this->attach_sql_id . '
+			FROM ' . ATTACHMENTS_TABLE . '
+			WHERE ' . $this->db->sql_in_set($this->attach_sql_id, $ids)
+				. $this->sql_where;
+		$result = $this->db->sql_query($sql);
+
+		$remaining_ids = array();
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$remaining_ids[] = $row[$this->attach_sql_id];
+		}
+		$this->db->sql_freeresult($result);
+
+		// Now only unset those ids remaining
+		$ids = array_diff($ids, $remaining_ids);
+
+		if (sizeof($ids))
+		{
+			$sql = 'UPDATE ' . $this->resync_table . '
+				SET ' . $type . '_attachment = 0
+				WHERE ' . $this->db->sql_in_set($this->resync_sql_id, $ids);
+			$this->db->sql_query($sql);
+		}
+	}
+
+}
--- /dev/null
+++ b/phpbb/attachment/upload.php
@@ -0,0 +1,334 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\attachment;
+
+use phpbb\auth\auth;
+use \phpbb\cache\service;
+use \phpbb\config\config;
+use \phpbb\event\dispatcher;
+use \phpbb\language\language;
+use \phpbb\mimetype\guesser;
+use \phpbb\plupload\plupload;
+use \phpbb\user;
+
+/**
+ * Attachment upload class
+ */
+class upload
+{
+	/** @var auth */
+	protected $auth;
+
+	/** @var service */
+	protected $cache;
+
+	/** @var config */
+	protected $config;
+
+	/** @var \phpbb\files\upload Upload class */
+	protected $files_upload;
+
+	/** @var language */
+	protected $language;
+
+	/** @var guesser Mimetype guesser */
+	protected $mimetype_guesser;
+
+	/** @var dispatcher */
+	protected $phpbb_dispatcher;
+
+	/** @var plupload Plupload */
+	protected $plupload;
+
+	/** @var user */
+	protected $user;
+
+	/** @var \phpbb\files\filespec Current filespec instance */
+	private $file;
+
+	/** @var array File data */
+	private $file_data = array(
+		'error'	=> array()
+	);
+
+	/** @var array Extensions array */
+	private $extensions;
+
+	/**
+	 * Constructor for attachments upload class
+	 *
+	 * @param auth $auth
+	 * @param service $cache
+	 * @param config $config
+	 * @param \phpbb\files\upload $files_upload
+	 * @param language $language
+	 * @param guesser $mimetype_guesser
+	 * @param dispatcher $phpbb_dispatcher
+	 * @param plupload $plupload
+	 * @param user $user
+	 * @param $phpbb_root_path
+	 */
+	public function __construct(auth $auth, service $cache, config $config, \phpbb\files\upload $files_upload, language $language, guesser $mimetype_guesser, dispatcher $phpbb_dispatcher, plupload $plupload, user $user, $phpbb_root_path)
+	{
+		$this->auth = $auth;
+		$this->cache = $cache;
+		$this->config = $config;
+		$this->files_upload = $files_upload;
+		$this->language = $language;
+		$this->mimetype_guesser = $mimetype_guesser;
+		$this->phpbb_dispatcher = $phpbb_dispatcher;
+		$this->plupload = $plupload;
+		$this->user = $user;
+		$this->phpbb_root_path = $phpbb_root_path;
+	}
+
+	/**
+	 * Upload Attachment - filedata is generated here
+	 * Uses upload class
+	 *
+	 * @param string			$form_name		The form name of the file upload input
+	 * @param int			$forum_id		The id of the forum
+	 * @param bool			$local			Whether the file is local or not
+	 * @param string			$local_storage	The path to the local file
+	 * @param bool			$is_message		Whether it is a PM or not
+	 * @param array		$local_filedata	An file data object created for the local file
+	 *
+	 * @return array File data array
+	 */
+	public function upload($form_name, $forum_id, $local = false, $local_storage = '', $is_message = false, $local_filedata = array())
+	{
+		$this->init_files_upload($forum_id, $is_message);
+
+		$this->file_data['post_attach'] = $local || $this->files_upload->is_valid($form_name);
+
+		if (!$this->file_data['post_attach'])
+		{
+			$this->file_data['error'][] = $this->language->lang('NO_UPLOAD_FORM_FOUND');
+			return $this->file_data;
+		}
+
+		$this->file = ($local) ? $this->files_upload->handle_upload('files.types.local', $local_storage, $local_filedata) : $this->files_upload->handle_upload('files.types.form', $form_name);
+
+		if ($this->file->init_error())
+		{
+			$this->file_data['post_attach'] = false;
+			return $this->file_data;
+		}
+
+		// Whether the uploaded file is in the image category
+		$is_image = (isset($this->extensions[$this->file->get('extension')]['display_cat'])) ? $this->extensions[$this->file->get('extension')]['display_cat'] == ATTACHMENT_CATEGORY_IMAGE : false;
+
+		if (!$this->auth->acl_get('a_') && !$this->auth->acl_get('m_', $forum_id))
+		{
+			// Check Image Size, if it is an image
+			if ($is_image)
+			{
+				$this->file->upload->set_allowed_dimensions(0, 0, $this->config['img_max_width'], $this->config['img_max_height']);
+			}
+
+			// Admins and mods are allowed to exceed the allowed filesize
+			if (!empty($this->extensions[$this->file->get('extension')]['max_filesize']))
+			{
+				$allowed_filesize = $this->extensions[$this->file->get('extension')]['max_filesize'];
+			}
+			else
+			{
+				$allowed_filesize = ($is_message) ? $this->config['max_filesize_pm'] : $this->config['max_filesize'];
+			}
+
+			$this->file->upload->set_max_filesize($allowed_filesize);
+		}
+
+		$this->file->clean_filename('unique', $this->user->data['user_id'] . '_');
+
+		// Are we uploading an image *and* this image being within the image category?
+		// Only then perform additional image checks.
+		$this->file->move_file($this->config['upload_path'], false, !$is_image);
+
+		// Do we have to create a thumbnail?
+		$this->file_data['thumbnail'] = ($is_image && $this->config['img_create_thumbnail']) ? 1 : 0;
+
+		// Make sure the image category only holds valid images...
+		$this->check_image($is_image);
+
+		if (sizeof($this->file->error))
+		{
+			$this->file->remove();
+			$this->file_data['error'] = array_merge($this->file_data['error'], $this->file->error);
+			$this->file_data['post_attach'] = false;
+
+			return $this->file_data;
+		}
+
+		$this->fill_file_data();
+
+		$filedata = $this->file_data;
+
+		/**
+		 * Event to modify uploaded file before submit to the post
+		 *
+		 * @event core.modify_uploaded_file
+		 * @var	array	filedata	Array containing uploaded file data
+		 * @var	bool	is_image	Flag indicating if the file is an image
+		 * @since 3.1.0-RC3
+		 */
+		$vars = array(
+			'filedata',
+			'is_image',
+		);
+		extract($this->phpbb_dispatcher->trigger_event('core.modify_uploaded_file', compact($vars)));
+		$this->file_data = $filedata;
+		unset($filedata);
+
+		// Check for attachment quota and free space
+		if (!$this->check_attach_quota() || !$this->check_disk_space())
+		{
+			return $this->file_data;
+		}
+
+		// Create Thumbnail
+		$this->create_thumbnail();
+
+		return $this->file_data;
+	}
+
+	/**
+	 * Create thumbnail for file if necessary
+	 *
+	 * @return array Updated $filedata
+	 */
+	protected function create_thumbnail()
+	{
+		if ($this->file_data['thumbnail'])
+		{
+			$source = $this->file->get('destination_file');
+			$destination = $this->file->get('destination_path') . '/thumb_' . $this->file->get('realname');
+
+			if (!create_thumbnail($source, $destination, $this->file->get('mimetype')))
+			{
+				$this->file_data['thumbnail'] = 0;
+			}
+		}
+	}
+
+	/**
+	 * Init files upload class
+	 *
+	 * @param int $forum_id Forum ID
+	 * @param bool $is_message Whether attachment is inside PM or not
+	 */
+	protected function init_files_upload($forum_id, $is_message)
+	{
+		if ($this->config['check_attachment_content'] && isset($this->config['mime_triggers']))
+		{
+			$this->files_upload->set_disallowed_content(explode('|', $this->config['mime_triggers']));
+		}
+		else if (!$this->config['check_attachment_content'])
+		{
+			$this->files_upload->set_disallowed_content(array());
+		}
+
+		$this->extensions = $this->cache->obtain_attach_extensions((($is_message) ? false : (int) $forum_id));
+		$this->files_upload->set_allowed_extensions(array_keys($this->extensions['_allowed_']));
+	}
+
+	/**
+	 * Check if uploaded file is really an image
+	 *
+	 * @param bool $is_image Whether file is image
+	 */
+	protected function check_image($is_image)
+	{
+		// Make sure the image category only holds valid images...
+		if ($is_image && !$this->file->is_image())
+		{
+			$this->file->remove();
+
+			if ($this->plupload && $this->plupload->is_active())
+			{
+				$this->plupload->emit_error(104, 'ATTACHED_IMAGE_NOT_IMAGE');
+			}
+
+			// If this error occurs a user tried to exploit an IE Bug by renaming extensions
+			// Since the image category is displaying content inline we need to catch this.
+			$this->file->set_error($this->language->lang('ATTACHED_IMAGE_NOT_IMAGE'));
+		}
+	}
+
+	/**
+	 * Check if attachment quota was reached
+	 *
+	 * @return bool False if attachment quota was reached, true if not
+	 */
+	protected function check_attach_quota()
+	{
+		if ($this->config['attachment_quota'])
+		{
+			if (intval($this->config['upload_dir_size']) + $this->file->get('filesize') > $this->config['attachment_quota'])
+			{
+				$this->file_data['error'][] = $this->language->lang('ATTACH_QUOTA_REACHED');
+				$this->file_data['post_attach'] = false;
+
+				$this->file->remove();
+
+				return false;
+			}
+		}
+
+		return true;
+	}
+
+	/**
+	 * Check if there is enough free space available on disk
+	 *
+	 * @return bool True if disk space is available, false if not
+	 */
+	protected function check_disk_space()
+	{
+		if ($free_space = @disk_free_space($this->phpbb_root_path . $this->config['upload_path']))
+		{
+			if ($free_space <= $this->file->get('filesize'))
+			{
+				if ($this->auth->acl_get('a_'))
+				{
+					$this->file_data['error'][] = $this->language->lang('ATTACH_DISK_FULL');
+				}
+				else
+				{
+					$this->file_data['error'][] = $this->language->lang('ATTACH_QUOTA_REACHED');
+				}
+				$this->file_data['post_attach'] = false;
+
+				$this->file->remove();
+
+				return false;
+			}
+		}
+
+		return true;
+	}
+
+	/**
+	 * Fills file data with file information and current time as filetime
+	 */
+	protected function fill_file_data()
+	{
+		$this->file_data['filesize'] = $this->file->get('filesize');
+		$this->file_data['mimetype'] = $this->file->get('mimetype');
+		$this->file_data['extension'] = $this->file->get('extension');
+		$this->file_data['physical_filename'] = $this->file->get('realname');
+		$this->file_data['real_filename'] = $this->file->get('uploadname');
+		$this->file_data['filetime'] = time();
+	}
+}
--- a/phpbb/auth/auth.php
+++ b/phpbb/auth/auth.php
@@ -930,6 +930,7 @@ class auth
 		global $db, $user, $phpbb_root_path, $phpEx, $phpbb_container;
 		global $phpbb_dispatcher;
 
+		/* @var $provider_collection \phpbb\auth\provider_collection */
 		$provider_collection = $phpbb_container->get('auth.provider_collection');
 
 		$provider = $provider_collection->get_provider();
--- a/phpbb/auth/provider/db.php
+++ b/phpbb/auth/provider/db.php
@@ -155,6 +155,7 @@ class db extends \phpbb\auth\provider\base
 		// Every auth module is able to define what to do by itself...
 		if ($show_captcha)
 		{
+			/* @var $captcha_factory \phpbb\captcha\factory */
 			$captcha_factory = $this->phpbb_container->get('captcha.factory');
 			$captcha = $captcha_factory->get_instance($this->config['captcha_plugin']);
 			$captcha->init(CONFIRM_LOGIN);
--- a/phpbb/auth/provider/oauth/oauth.php
+++ b/phpbb/auth/provider/oauth/oauth.php
@@ -62,6 +62,13 @@ class oauth extends \phpbb\auth\provider\base
 	*/
 	protected $auth_provider_oauth_token_storage_table;
 
+	/**
+	* OAuth state table
+	*
+	* @var string
+	*/
+	protected $auth_provider_oauth_state_table;
+
 	/**
 	* OAuth account association table
 	*
@@ -97,6 +104,13 @@ class oauth extends \phpbb\auth\provider\base
 	*/
 	protected $phpbb_container;
 
+	/**
+	* phpBB event dispatcher
+	*
+	* @var \phpbb\event\dispatcher_interface
+	*/
+	protected $dispatcher;
+
 	/**
 	* phpBB root path
 	*
@@ -120,14 +134,16 @@ class oauth extends \phpbb\auth\provider\base
 	* @param	\phpbb\request\request_interface	$request
 	* @param	\phpbb\user		$user
 	* @param	string			$auth_provider_oauth_token_storage_table
+	* @param	string			$auth_provider_oauth_state_table
 	* @param	string			$auth_provider_oauth_token_account_assoc
 	* @param	\phpbb\di\service_collection	$service_providers Contains \phpbb\auth\provider\oauth\service_interface
 	* @param	string			$users_table
 	* @param	\Symfony\Component\DependencyInjection\ContainerInterface $phpbb_container DI container
+	* @param	\phpbb\event\dispatcher_interface $dispatcher phpBB event dispatcher
 	* @param	string			$phpbb_root_path
 	* @param	string			$php_ext
 	*/
-	public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\config\config $config, \phpbb\passwords\manager $passwords_manager, \phpbb\request\request_interface $request, \phpbb\user $user, $auth_provider_oauth_token_storage_table, $auth_provider_oauth_token_account_assoc, \phpbb\di\service_collection $service_providers, $users_table, \Symfony\Component\DependencyInjection\ContainerInterface $phpbb_container, $phpbb_root_path, $php_ext)
+	public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\config\config $config, \phpbb\passwords\manager $passwords_manager, \phpbb\request\request_interface $request, \phpbb\user $user, $auth_provider_oauth_token_storage_table, $auth_provider_oauth_state_table, $auth_provider_oauth_token_account_assoc, \phpbb\di\service_collection $service_providers, $users_table, \Symfony\Component\DependencyInjection\ContainerInterface $phpbb_container, \phpbb\event\dispatcher_interface $dispatcher, $phpbb_root_path, $php_ext)
 	{
 		$this->db = $db;
 		$this->config = $config;
@@ -135,10 +151,12 @@ class oauth extends \phpbb\auth\provider\base
 		$this->request = $request;
 		$this->user = $user;
 		$this->auth_provider_oauth_token_storage_table = $auth_provider_oauth_token_storage_table;
+		$this->auth_provider_oauth_state_table = $auth_provider_oauth_state_table;
 		$this->auth_provider_oauth_token_account_assoc = $auth_provider_oauth_token_account_assoc;
 		$this->service_providers = $service_providers;
 		$this->users_table = $users_table;
 		$this->phpbb_container = $phpbb_container;
+		$this->dispatcher = $dispatcher;
 		$this->phpbb_root_path = $phpbb_root_path;
 		$this->php_ext = $php_ext;
 	}
@@ -188,11 +206,12 @@ class oauth extends \phpbb\auth\provider\base
 		// Get the service credentials for the given service
 		$service_credentials = $this->service_providers[$service_name]->get_service_credentials();
 
-		$storage = new \phpbb\auth\provider\oauth\token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table);
+		$storage = new \phpbb\auth\provider\oauth\token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table, $this->auth_provider_oauth_state_table);
 		$query = 'mode=login&login=external&oauth_service=' . $service_name_original;
 		$service = $this->get_service($service_name_original, $storage, $service_credentials, $query, $this->service_providers[$service_name]->get_auth_scope());
 
-		if ($this->request->is_set('code', \phpbb\request\request_interface::GET))
+		if (($service::OAUTH_VERSION === 2 && $this->request->is_set('code', \phpbb\request\request_interface::GET))
+			|| ($service::OAUTH_VERSION === 1 && $this->request->is_set('oauth_token', \phpbb\request\request_interface::GET)))
 		{
 			$this->service_providers[$service_name]->set_external_service_provider($service);
 			$unique_id = $this->service_providers[$service_name]->perform_auth_login();
@@ -238,6 +257,18 @@ class oauth extends \phpbb\auth\provider\base
 			// Update token storage to store the user_id
 			$storage->set_user_id($row['user_id']);
 
+			/**
+			* Event is triggered after user is successfuly logged in via OAuth.
+			*
+			* @event core.auth_oauth_login_after
+			* @var    array    row    User row
+			* @since 3.1.11-RC1
+			*/
+			$vars = array(
+				'row',
+			);
+			extract($this->dispatcher->trigger_event('core.auth_oauth_login_after', compact($vars)));
+
 			// The user is now authenticated and can be logged in
 			return array(
 				'status'		=> LOGIN_SUCCESS,
@@ -247,7 +278,15 @@ class oauth extends \phpbb\auth\provider\base
 		}
 		else
 		{
-			$url = $service->getAuthorizationUri();
+			if ($service::OAUTH_VERSION === 1)
+			{
+				$token = $service->requestRequestToken();
+				$url = $service->getAuthorizationUri(array('oauth_token' => $token->getRequestToken()));
+			}
+			else
+			{
+				$url = $service->getAuthorizationUri();
+			}
 			header('Location: ' . $url);
 		}
 	}
@@ -462,7 +501,7 @@ class oauth extends \phpbb\auth\provider\base
 	*/
 	protected function link_account_login_link(array $link_data, $service_name)
 	{
-		$storage = new \phpbb\auth\provider\oauth\token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table);
+		$storage = new \phpbb\auth\provider\oauth\token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table, $this->auth_provider_oauth_state_table);
 
 		// Check for an access token, they should have one
 		if (!$storage->has_access_token_by_session($service_name))
@@ -505,13 +544,14 @@ class oauth extends \phpbb\auth\provider\base
 	*/
 	protected function link_account_auth_link(array $link_data, $service_name)
 	{
-		$storage = new \phpbb\auth\provider\oauth\token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table);
+		$storage = new \phpbb\auth\provider\oauth\token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table, $this->auth_provider_oauth_state_table);
 		$query = 'i=ucp_auth_link&mode=auth_link&link=1&oauth_service=' . strtolower($link_data['oauth_service']);
 		$service_credentials = $this->service_providers[$service_name]->get_service_credentials();
 		$scopes = $this->service_providers[$service_name]->get_auth_scope();
 		$service = $this->get_service(strtolower($link_data['oauth_service']), $storage, $service_credentials, $query, $scopes);
 
-		if ($this->request->is_set('code', \phpbb\request\request_interface::GET))
+		if (($service::OAUTH_VERSION === 2 && $this->request->is_set('code', \phpbb\request\request_interface::GET))
+			|| ($service::OAUTH_VERSION === 1 && $this->request->is_set('oauth_token', \phpbb\request\request_interface::GET)))
 		{
 			$this->service_providers[$service_name]->set_external_service_provider($service);
 			$unique_id = $this->service_providers[$service_name]->perform_auth_login();
@@ -527,7 +567,15 @@ class oauth extends \phpbb\auth\provider\base
 		}
 		else
 		{
-			$url = $service->getAuthorizationUri();
+			if ($service::OAUTH_VERSION === 1)
+			{
+				$token = $service->requestRequestToken();
+				$url = $service->getAuthorizationUri(array('oauth_token' => $token->getRequestToken()));
+			}
+			else
+			{
+				$url = $service->getAuthorizationUri();
+			}
 			header('Location: ' . $url);
 		}
 	}
@@ -542,6 +590,18 @@ class oauth extends \phpbb\auth\provider\base
 		$sql = 'INSERT INTO ' . $this->auth_provider_oauth_token_account_assoc . '
 			' . $this->db->sql_build_array('INSERT', $data);
 		$this->db->sql_query($sql);
+
+		/**
+		 * Event is triggered after user links account.
+		 *
+		 * @event core.auth_oauth_link_after
+		 * @var    array    data    User row
+		 * @since 3.1.11-RC1
+		 */
+		$vars = array(
+			'data',
+		);
+		extract($this->dispatcher->trigger_event('core.auth_oauth_link_after', compact($vars)));
 	}
 
 	/**
@@ -550,7 +610,7 @@ class oauth extends \phpbb\auth\provider\base
 	public function logout($data, $new_session)
 	{
 		// Clear all tokens belonging to the user
-		$storage = new \phpbb\auth\provider\oauth\token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table);
+		$storage = new \phpbb\auth\provider\oauth\token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table, $this->auth_provider_oauth_state_table);
 		$storage->clearAllTokens();
 
 		return;
@@ -633,7 +693,7 @@ class oauth extends \phpbb\auth\provider\base
 
 		// Clear all tokens belonging to the user on this servce
 		$service_name = 'auth.provider.oauth.service.' . strtolower($link_data['oauth_service']);
-		$storage = new \phpbb\auth\provider\oauth\token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table);
+		$storage = new \phpbb\auth\provider\oauth\token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table, $this->auth_provider_oauth_state_table);
 		$storage->clearToken($service_name);
 	}
 }
--- /dev/null
+++ b/phpbb/auth/provider/oauth/service/twitter.php
@@ -0,0 +1,102 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\auth\provider\oauth\service;
+
+/**
+* Twitter OAuth service
+*/
+class twitter extends \phpbb\auth\provider\oauth\service\base
+{
+	/**
+	* phpBB config
+	*
+	* @var \phpbb\config\config
+	*/
+	protected $config;
+
+	/**
+	* phpBB request
+	*
+	* @var \phpbb\request\request_interface
+	*/
+	protected $request;
+
+	/**
+	* Constructor
+	*
+	* @param	\phpbb\config\config				$config
+	* @param	\phpbb\request\request_interface	$request
+	*/
+	public function __construct(\phpbb\config\config $config, \phpbb\request\request_interface $request)
+	{
+		$this->config = $config;
+		$this->request = $request;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_service_credentials()
+	{
+		return array(
+			'key'		=> $this->config['auth_oauth_twitter_key'],
+			'secret'	=> $this->config['auth_oauth_twitter_secret'],
+		);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function perform_auth_login()
+	{
+		if (!($this->service_provider instanceof \OAuth\OAuth1\Service\Twitter))
+		{
+			throw new \phpbb\auth\provider\oauth\service\exception('AUTH_PROVIDER_OAUTH_ERROR_INVALID_SERVICE_TYPE');
+		}
+
+		$storage = $this->service_provider->getStorage();
+		$token = $storage->retrieveAccessToken('Twitter');
+		$tokensecret = $token->getRequestTokenSecret();
+
+		// This was a callback request from twitter, get the token
+		$this->service_provider->requestAccessToken(
+			$this->request->variable('oauth_token', ''),
+			$this->request->variable('oauth_verifier', ''),
+			$tokensecret
+		);
+
+		// Send a request with it
+		$result = json_decode($this->service_provider->request('account/verify_credentials.json'), true);
+
+		// Return the unique identifier returned from twitter
+		return $result['id'];
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function perform_token_auth()
+	{
+		if (!($this->service_provider instanceof \OAuth\OAuth1\Service\Twitter))
+		{
+			throw new \phpbb\auth\provider\oauth\service\exception('AUTH_PROVIDER_OAUTH_ERROR_INVALID_SERVICE_TYPE');
+		}
+
+		// Send a request with it
+		$result = json_decode($this->service_provider->request('account/verify_credentials.json'), true);
+
+		// Return the unique identifier returned from twitter
+		return $result['id'];
+	}
+}
--- a/phpbb/auth/provider/oauth/token_storage.php
+++ b/phpbb/auth/provider/oauth/token_storage.php
@@ -17,6 +17,7 @@ use OAuth\OAuth1\Token\StdOAuth1Token;
 use OAuth\Common\Token\TokenInterface;
 use OAuth\Common\Storage\TokenStorageInterface;
 use OAuth\Common\Storage\Exception\TokenNotFoundException;
+use OAuth\Common\Storage\Exception\AuthorizationStateNotFoundException;
 
 /**
 * OAuth storage wrapper for phpbb's cache
@@ -42,25 +43,39 @@ class token_storage implements TokenStorageInterface
 	*
 	* @var string
 	*/
-	protected $auth_provider_oauth_table;
+	protected $oauth_token_table;
+
+	/**
+	* OAuth state table
+	*
+	* @var string
+	*/
+	protected $oauth_state_table;
 
 	/**
 	* @var object|TokenInterface
 	*/
 	protected $cachedToken;
 
+	/**
+	* @var string
+	*/
+	protected $cachedState;
+
 	/**
 	* Creates token storage for phpBB.
 	*
 	* @param	\phpbb\db\driver\driver_interface	$db
 	* @param	\phpbb\user		$user
-	* @param	string			$auth_provider_oauth_table
+	* @param	string			$oauth_token_table
+	* @param	string			$oauth_state_table
 	*/
-	public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\user $user, $auth_provider_oauth_table)
+	public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\user $user, $oauth_token_table, $oauth_state_table)
 	{
 		$this->db = $db;
 		$this->user = $user;
-		$this->auth_provider_oauth_table = $auth_provider_oauth_table;
+		$this->oauth_token_table = $oauth_token_table;
+		$this->oauth_state_table = $oauth_state_table;
 	}
 
 	/**
@@ -98,15 +113,31 @@ class token_storage implements TokenStorageInterface
 		$this->cachedToken = $token;
 
 		$data = array(
-			'user_id'		=> (int) $this->user->data['user_id'],
-			'provider'		=> $service,
 			'oauth_token'	=> $this->json_encode_token($token),
-			'session_id'	=> $this->user->data['session_id'],
 		);
 
-		$sql = 'INSERT INTO ' . $this->auth_provider_oauth_table . '
-			' . $this->db->sql_build_array('INSERT', $data);
+		$sql = 'UPDATE ' . $this->oauth_token_table . '
+				SET ' . $this->db->sql_build_array('UPDATE', $data) . '
+				WHERE user_id = ' . (int) $this->user->data['user_id'] . '
+					' . ((int) $this->user->data['user_id'] === ANONYMOUS ? "AND session_id = '" . $this->db->sql_escape($this->user->data['session_id']) . "'" : '') . "
+					AND provider = '" . $this->db->sql_escape($service) . "'";
 		$this->db->sql_query($sql);
+
+		if (!$this->db->sql_affectedrows())
+		{
+			$data = array(
+				'user_id'		=> (int) $this->user->data['user_id'],
+				'provider'		=> $service,
+				'oauth_token'	=> $this->json_encode_token($token),
+				'session_id'	=> $this->user->data['session_id'],
+			);
+
+			$sql = 'INSERT INTO ' . $this->oauth_token_table . $this->db->sql_build_array('INSERT', $data);
+
+			$this->db->sql_query($sql);
+		}
+
+		return $this;
 	}
 
 	/**
@@ -143,7 +174,7 @@ class token_storage implements TokenStorageInterface
 
 		$this->cachedToken = null;
 
-		$sql = 'DELETE FROM ' . $this->auth_provider_oauth_table . '
+		$sql = 'DELETE FROM ' . $this->oauth_token_table . '
 			WHERE user_id = ' . (int) $this->user->data['user_id'] . "
 				AND provider = '" . $this->db->sql_escape($service) . "'";
 
@@ -153,6 +184,8 @@ class token_storage implements TokenStorageInterface
 		}
 
 		$this->db->sql_query($sql);
+
+		return $this;
 	}
 
 	/**
@@ -162,7 +195,7 @@ class token_storage implements TokenStorageInterface
 	{
 		$this->cachedToken = null;
 
-		$sql = 'DELETE FROM ' . $this->auth_provider_oauth_table . '
+		$sql = 'DELETE FROM ' . $this->oauth_token_table . '
 			WHERE user_id = ' . (int) $this->user->data['user_id'];
 
 		if ((int) $this->user->data['user_id'] === ANONYMOUS)
@@ -171,6 +204,124 @@ class token_storage implements TokenStorageInterface
 		}
 
 		$this->db->sql_query($sql);
+
+		return $this;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function storeAuthorizationState($service, $state)
+	{
+		$service = $this->get_service_name_for_db($service);
+
+		$this->cachedState = $state;
+
+		$data = array(
+			'user_id'		=> (int) $this->user->data['user_id'],
+			'provider'		=> $service,
+			'oauth_state'	=> $state,
+			'session_id'	=> $this->user->data['session_id'],
+		);
+
+		$sql = 'INSERT INTO ' . $this->oauth_state_table . '
+			' . $this->db->sql_build_array('INSERT', $data);
+		$this->db->sql_query($sql);
+
+		return $this;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function hasAuthorizationState($service)
+	{
+		$service = $this->get_service_name_for_db($service);
+
+		if ($this->cachedState)
+		{
+			return true;
+		}
+
+		$data = array(
+			'user_id'	=> (int) $this->user->data['user_id'],
+			'provider'	=> $service,
+		);
+
+		if ((int) $this->user->data['user_id'] === ANONYMOUS)
+		{
+			$data['session_id']	= $this->user->data['session_id'];
+		}
+
+		return (bool) $this->get_state_row($data);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function retrieveAuthorizationState($service)
+	{
+		$service = $this->get_service_name_for_db($service);
+
+		if ($this->cachedState)
+		{
+			return $this->cachedState;
+		}
+
+		$data = array(
+			'user_id'	=> (int) $this->user->data['user_id'],
+			'provider'	=> $service,
+		);
+
+		if ((int) $this->user->data['user_id'] === ANONYMOUS)
+		{
+			$data['session_id']	= $this->user->data['session_id'];
+		}
+
+		return $this->get_state_row($data);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function clearAuthorizationState($service)
+	{
+		$service = $this->get_service_name_for_db($service);
+
+		$this->cachedState = null;
+
+		$sql = 'DELETE FROM ' . $this->oauth_state_table . '
+			WHERE user_id = ' . (int) $this->user->data['user_id'] . "
+				AND provider = '" . $this->db->sql_escape($service) . "'";
+
+		if ((int) $this->user->data['user_id'] === ANONYMOUS)
+		{
+			$sql .= " AND session_id = '" . $this->db->sql_escape($this->user->data['session_id']) . "'";
+		}
+
+		$this->db->sql_query($sql);
+
+		return $this;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function clearAllAuthorizationStates()
+	{
+		$this->cachedState = null;
+
+		$sql = 'DELETE FROM ' . $this->oauth_state_table . '
+			WHERE user_id = ' . (int) $this->user->data['user_id'];
+
+		if ((int) $this->user->data['user_id'] === ANONYMOUS)
+		{
+			$sql .= " AND session_id = '" . $this->db->sql_escape($this->user->data['session_id']) . "'";
+		}
+
+		$this->db->sql_query($sql);
+
+		return $this;
 	}
 
 	/**
@@ -185,7 +336,7 @@ class token_storage implements TokenStorageInterface
 			return;
 		}
 
-		$sql = 'UPDATE ' . $this->auth_provider_oauth_table . '
+		$sql = 'UPDATE ' . $this->oauth_token_table . '
 			SET ' . $this->db->sql_build_array('UPDATE', array(
 					'user_id' => (int) $user_id
 				)) . '
@@ -217,6 +368,29 @@ class token_storage implements TokenStorageInterface
 		return $this->_has_acess_token($data);
 	}
 
+	/**
+	* Checks to see if a state exists solely by the session_id of the user
+	*
+	* @param	string	$service	The name of the OAuth service
+	* @return	bool	true if they have state, false if they don't
+	*/
+	public function has_state_by_session($service)
+	{
+		$service = $this->get_service_name_for_db($service);
+
+		if ($this->cachedState)
+		{
+			return true;
+		}
+
+		$data = array(
+			'session_id'	=> $this->user->data['session_id'],
+			'provider'		=> $service,
+		);
+
+		return (bool) $this->get_state_row($data);
+	}
+
 	/**
 	* A helper function that performs the query for has access token functions
 	*
@@ -245,6 +419,23 @@ class token_storage implements TokenStorageInterface
 		return $this->_retrieve_access_token($data);
 	}
 
+	public function retrieve_state_by_session($service)
+	{
+		$service = $this->get_service_name_for_db($service);
+
+		if ($this->cachedState)
+		{
+			return $this->cachedState;
+		}
+
+		$data = array(
+			'session_id'	=> $this->user->data['session_id'],
+			'provider'	=> $service,
+		);
+
+		return $this->_retrieve_state($data);
+	}
+
 	/**
 	* A helper function that performs the query for retrieve access token functions
 	* Also checks if the token is a valid token
@@ -275,6 +466,26 @@ class token_storage implements TokenStorageInterface
 		return $token;
 	}
 
+	/**
+	 * A helper function that performs the query for retrieve state functions
+	 *
+	 * @param	array	$data
+	 * @return	mixed
+	 * @throws \OAuth\Common\Storage\Exception\AuthorizationStateNotFoundException
+	 */
+	protected function _retrieve_state($data)
+	{
+		$row = $this->get_state_row($data);
+
+		if (!$row)
+		{
+			throw new AuthorizationStateNotFoundException();
+		}
+
+		$this->cachedState = $row['oauth_state'];
+		return $this->cachedState;
+	}
+
 	/**
 	* A helper function that performs the query for retrieving an access token
 	*
@@ -283,7 +494,24 @@ class token_storage implements TokenStorageInterface
 	*/
 	protected function get_access_token_row($data)
 	{
-		$sql = 'SELECT oauth_token FROM ' . $this->auth_provider_oauth_table . '
+		$sql = 'SELECT oauth_token FROM ' . $this->oauth_token_table . '
+			WHERE ' . $this->db->sql_build_array('SELECT', $data);
+		$result = $this->db->sql_query($sql);
+		$row = $this->db->sql_fetchrow($result);
+		$this->db->sql_freeresult($result);
+
+		return $row;
+	}
+
+	/**
+	 * A helper function that performs the query for retrieving a state
+	 *
+	 * @param	array	$data
+	 * @return	mixed
+	 */
+	protected function get_state_row($data)
+	{
+		$sql = 'SELECT oauth_state FROM ' . $this->oauth_state_table . '
 			WHERE ' . $this->db->sql_build_array('SELECT', $data);
 		$result = $this->db->sql_query($sql);
 		$row = $this->db->sql_fetchrow($result);
--- a/phpbb/avatar/driver/driver.php
+++ b/phpbb/avatar/driver/driver.php
@@ -30,6 +30,9 @@ abstract class driver implements \phpbb\avatar\driver\driver_interface
 	*/
 	protected $config;
 
+	/** @var \FastImageSize\FastImageSize */
+	protected $imagesize;
+
 	/**
 	* Current $phpbb_root_path
 	* @var string
@@ -73,14 +76,16 @@ abstract class driver implements \phpbb\avatar\driver\driver_interface
 	* Construct a driver object
 	*
 	* @param \phpbb\config\config $config phpBB configuration
+	* @param \FastImageSize\FastImageSize $imagesize FastImageSize class
 	* @param string $phpbb_root_path Path to the phpBB root
 	* @param string $php_ext PHP file extension
 	* @param \phpbb\path_helper $path_helper phpBB path helper
 	* @param \phpbb\cache\driver\driver_interface $cache Cache driver
 	*/
-	public function __construct(\phpbb\config\config $config, $phpbb_root_path, $php_ext, \phpbb\path_helper $path_helper, \phpbb\cache\driver\driver_interface $cache = null)
+	public function __construct(\phpbb\config\config $config, \FastImageSize\FastImageSize $imagesize, $phpbb_root_path, $php_ext, \phpbb\path_helper $path_helper, \phpbb\cache\driver\driver_interface $cache = null)
 	{
 		$this->config = $config;
+		$this->imagesize = $imagesize;
 		$this->phpbb_root_path = $phpbb_root_path;
 		$this->php_ext = $php_ext;
 		$this->path_helper = $path_helper;
--- a/phpbb/avatar/driver/gravatar.php
+++ b/phpbb/avatar/driver/gravatar.php
@@ -98,8 +98,8 @@ class gravatar extends \phpbb\avatar\driver\driver
 			return false;
 		}
 
-		// Make sure getimagesize works...
-		if (function_exists('getimagesize') && ($row['avatar_width'] <= 0 || $row['avatar_height'] <= 0))
+		// Get image dimensions if they are not set
+		if ($row['avatar_width'] <= 0 || $row['avatar_height'] <= 0)
 		{
 			/**
 			* default to the minimum of the maximum allowed avatar size if the size
@@ -108,20 +108,20 @@ class gravatar extends \phpbb\avatar\driver\driver
 			$row['avatar_width'] = $row['avatar_height'] = min($this->config['avatar_max_width'], $this->config['avatar_max_height']);
 			$url = $this->get_gravatar_url($row);
 
-			if (($row['avatar_width'] <= 0 || $row['avatar_height'] <= 0) && (($image_data = getimagesize($url)) === false))
+			if (($row['avatar_width'] <= 0 || $row['avatar_height'] <= 0) && (($image_data = $this->imagesize->getImageSize($url)) === false))
 			{
 				$error[] = 'UNABLE_GET_IMAGE_SIZE';
 				return false;
 			}
 
-			if (!empty($image_data) && ($image_data[0] <= 0 || $image_data[1] <= 0))
+			if (!empty($image_data) && ($image_data['width'] <= 0 || $image_data['width'] <= 0))
 			{
 				$error[] = 'AVATAR_NO_SIZE';
 				return false;
 			}
 
-			$row['avatar_width'] = ($row['avatar_width'] && $row['avatar_height']) ? $row['avatar_width'] : $image_data[0];
-			$row['avatar_height'] = ($row['avatar_width'] && $row['avatar_height']) ? $row['avatar_height'] : $image_data[1];
+			$row['avatar_width'] = ($row['avatar_width'] && $row['avatar_height']) ? $row['avatar_width'] : $image_data['width'];
+			$row['avatar_height'] = ($row['avatar_width'] && $row['avatar_height']) ? $row['avatar_height'] : $image_data['height'];
 		}
 
 		if ($row['avatar_width'] <= 0 || $row['avatar_height'] <= 0)
--- a/phpbb/avatar/driver/local.php
+++ b/phpbb/avatar/driver/local.php
@@ -174,13 +174,15 @@ class local extends \phpbb\avatar\driver\driver
 				// Match all images in the gallery folder
 				if (preg_match('#^[^&\'"<>]+\.(?:' . implode('|', $this->allowed_extensions) . ')$#i', $image) && is_file($file_path . '/' . $image))
 				{
-					if (function_exists('getimagesize'))
+					$dims = $this->imagesize->getImageSize($file_path . '/' . $image);
+
+					if ($dims === false)
 					{
-						$dims = getimagesize($file_path . '/' . $image);
+						$dims = array(0, 0);
 					}
 					else
 					{
-						$dims = array(0, 0);
+						$dims = array($dims['width'], $dims['height']);
 					}
 					$cat = ($path == $file_path) ? $user->lang['NO_AVATAR_CATEGORY'] : str_replace("$path/", '', $file_path);
 					$avatar_list[$cat][$image] = array(
--- a/phpbb/avatar/driver/remote.php
+++ b/phpbb/avatar/driver/remote.php
@@ -92,38 +92,30 @@ class remote extends \phpbb\avatar\driver\driver
 			return false;
 		}
 
-		// Make sure getimagesize works...
-		if (function_exists('getimagesize'))
+		// Get image dimensions
+		if (($width <= 0 || $height <= 0) && (($image_data = $this->imagesize->getImageSize($url)) === false))
 		{
-			if (($width <= 0 || $height <= 0) && (($image_data = @getimagesize($url)) === false))
-			{
-				$error[] = 'UNABLE_GET_IMAGE_SIZE';
-				return false;
-			}
-
-			if (!empty($image_data) && ($image_data[0] <= 0 || $image_data[1] <= 0))
-			{
-				$error[] = 'AVATAR_NO_SIZE';
-				return false;
-			}
-
-			$width = ($width && $height) ? $width : $image_data[0];
-			$height = ($width && $height) ? $height : $image_data[1];
+			$error[] = 'UNABLE_GET_IMAGE_SIZE';
+			return false;
 		}
 
-		if ($width <= 0 || $height <= 0)
+		if (!empty($image_data) && ($image_data['width'] <= 0 || $image_data['height'] <= 0))
 		{
 			$error[] = 'AVATAR_NO_SIZE';
 			return false;
 		}
 
-		if (!class_exists('fileupload'))
+		$width = ($width && $height) ? $width : $image_data['width'];
+		$height = ($width && $height) ? $height : $image_data['height'];
+
+		if ($width <= 0 || $height <= 0)
 		{
-			include($this->phpbb_root_path . 'includes/functions_upload.' . $this->php_ext);
+			$error[] = 'AVATAR_NO_SIZE';
+			return false;
 		}
 
-		$types = \fileupload::image_types();
-		$extension = strtolower(\filespec::get_extension($url));
+		$types = \phpbb\files\upload::image_types();
+		$extension = strtolower(\phpbb\files\filespec::get_extension($url));
 
 		// Check if this is actually an image
 		if ($file_stream = @fopen($url, 'r'))
@@ -172,15 +164,15 @@ class remote extends \phpbb\avatar\driver\driver
 			return false;
 		}
 
-		if (!empty($image_data) && (!isset($types[$image_data[2]]) || !in_array($extension, $types[$image_data[2]])))
+		if (!empty($image_data) && (!isset($types[$image_data['type']]) || !in_array($extension, $types[$image_data['type']])))
 		{
-			if (!isset($types[$image_data[2]]))
+			if (!isset($types[$image_data['type']]))
 			{
 				$error[] = 'UNABLE_GET_IMAGE_SIZE';
 			}
 			else
 			{
-				$error[] = array('IMAGE_FILETYPE_MISMATCH', $types[$image_data[2]][0], $extension);
+				$error[] = array('IMAGE_FILETYPE_MISMATCH', $types[$image_data['type']][0], $extension);
 			}
 
 			return false;
--- a/phpbb/avatar/driver/upload.php
+++ b/phpbb/avatar/driver/upload.php
@@ -19,34 +19,41 @@ namespace phpbb\avatar\driver;
 class upload extends \phpbb\avatar\driver\driver
 {
 	/**
-	* @var \phpbb\mimetype\guesser
-	*/
-	protected $mimetype_guesser;
+	 * @var \phpbb\filesystem\filesystem_interface
+	 */
+	protected $filesystem;
 
 	/**
 	* @var \phpbb\event\dispatcher_interface
 	*/
 	protected $dispatcher;
 
+	/**
+	 * @var \phpbb\files\factory
+	 */
+	protected $files_factory;
+
 	/**
 	* Construct a driver object
 	*
 	* @param \phpbb\config\config $config phpBB configuration
 	* @param string $phpbb_root_path Path to the phpBB root
 	* @param string $php_ext PHP file extension
-	* @param \phpbb_path_helper $path_helper phpBB path helper
-	* @param \phpbb\mimetype\guesser $mimetype_guesser Mimetype guesser
+	* @param \phpbb\filesystem\filesystem_interface $filesystem phpBB filesystem helper
+	* @param \phpbb\path_helper $path_helper phpBB path helper
 	* @param \phpbb\event\dispatcher_interface $dispatcher phpBB Event dispatcher object
+	* @param \phpbb\files\factory $files_factory File classes factory
 	* @param \phpbb\cache\driver\driver_interface $cache Cache driver
 	*/
-	public function __construct(\phpbb\config\config $config, $phpbb_root_path, $php_ext, \phpbb\path_helper $path_helper, \phpbb\mimetype\guesser $mimetype_guesser, \phpbb\event\dispatcher_interface $dispatcher, \phpbb\cache\driver\driver_interface $cache = null)
+	public function __construct(\phpbb\config\config $config, $phpbb_root_path, $php_ext, \phpbb\filesystem\filesystem_interface $filesystem, \phpbb\path_helper $path_helper, \phpbb\event\dispatcher_interface $dispatcher, \phpbb\files\factory $files_factory, \phpbb\cache\driver\driver_interface $cache = null)
 	{
 		$this->config = $config;
 		$this->phpbb_root_path = $phpbb_root_path;
 		$this->php_ext = $php_ext;
+		$this->filesystem = $filesystem;
 		$this->path_helper = $path_helper;
-		$this->mimetype_guesser = $mimetype_guesser;
 		$this->dispatcher = $dispatcher;
+		$this->files_factory = $files_factory;
 		$this->cache = $cache;
 	}
 
@@ -92,19 +99,24 @@ class upload extends \phpbb\avatar\driver\driver
 			return false;
 		}
 
-		if (!class_exists('fileupload'))
-		{
-			include($this->phpbb_root_path . 'includes/functions_upload.' . $this->php_ext);
-		}
-
-		$upload = new \fileupload('AVATAR_', $this->allowed_extensions, $this->config['avatar_filesize'], $this->config['avatar_min_width'], $this->config['avatar_min_height'], $this->config['avatar_max_width'], $this->config['avatar_max_height'], (isset($this->config['mime_triggers']) ? explode('|', $this->config['mime_triggers']) : false));
+		/** @var \phpbb\files\upload $upload */
+		$upload = $this->files_factory->get('upload')
+			->set_error_prefix('AVATAR_')
+			->set_allowed_extensions($this->allowed_extensions)
+			->set_max_filesize($this->config['avatar_filesize'])
+			->set_allowed_dimensions(
+				$this->config['avatar_min_width'],
+				$this->config['avatar_min_height'],
+				$this->config['avatar_max_width'],
+				$this->config['avatar_max_height'])
+			->set_disallowed_content((isset($this->config['mime_triggers']) ? explode('|', $this->config['mime_triggers']) : false));
 
 		$url = $request->variable('avatar_upload_url', '');
 		$upload_file = $request->file('avatar_upload_file');
 
 		if (!empty($upload_file['name']))
 		{
-			$file = $upload->form_upload('avatar_upload_file', $this->mimetype_guesser);
+			$file = $upload->handle_upload('files.types.form', 'avatar_upload_file');
 		}
 		else if (!empty($this->config['allow_avatar_remote_upload']) && !empty($url))
 		{
@@ -134,7 +146,7 @@ class upload extends \phpbb\avatar\driver\driver
 				return false;
 			}
 
-			$file = $upload->remote_upload($url, $this->mimetype_guesser);
+			$file = $upload->handle_upload('files.types.remote', $url);
 		}
 		else
 		{
@@ -292,6 +304,6 @@ class upload extends \phpbb\avatar\driver\driver
 	*/
 	protected function can_upload()
 	{
-		return (file_exists($this->phpbb_root_path . $this->config['avatar_path']) && phpbb_is_writable($this->phpbb_root_path . $this->config['avatar_path']) && (@ini_get('file_uploads') || strtolower(@ini_get('file_uploads')) == 'on'));
+		return (file_exists($this->phpbb_root_path . $this->config['avatar_path']) && $this->filesystem->is_writable($this->phpbb_root_path . $this->config['avatar_path']) && (@ini_get('file_uploads') || strtolower(@ini_get('file_uploads')) == 'on'));
 	}
 }
--- a/phpbb/cache/driver/base.php
+++ b/phpbb/cache/driver/base.php
@@ -49,7 +49,9 @@ abstract class base implements \phpbb\cache\driver\driver_interface
 				$this->remove_dir($fileInfo->getPathname());
 			}
 			else if (strpos($filename, 'container_') === 0 ||
+				strpos($filename, 'autoload_') === 0 ||
 				strpos($filename, 'url_matcher') === 0 ||
+				strpos($filename, 'url_generator') === 0 ||
 				strpos($filename, 'sql_') === 0 ||
 				strpos($filename, 'data_') === 0)
 			{
@@ -95,14 +97,14 @@ abstract class base implements \phpbb\cache\driver\driver_interface
 	{
 		// Remove extra spaces and tabs
 		$query = preg_replace('/[\n\r\s\t]+/', ' ', $query);
+		$query_id = md5($query);
 
-		if (($rowset = $this->_read('sql_' . md5($query))) === false)
+		if (($result = $this->_read('sql_' . $query_id)) === false)
 		{
 			return false;
 		}
 
-		$query_id = sizeof($this->sql_rowset);
-		$this->sql_rowset[$query_id] = $rowset;
+		$this->sql_rowset[$query_id] = $result;
 		$this->sql_row_pointer[$query_id] = 0;
 
 		return $query_id;
@@ -181,13 +183,9 @@ abstract class base implements \phpbb\cache\driver\driver_interface
 	*/
 	function remove_file($filename, $check = false)
 	{
-		if (!function_exists('phpbb_is_writable'))
-		{
-			global $phpbb_root_path, $phpEx;
-			include($phpbb_root_path . 'includes/functions.' . $phpEx);
-		}
+		global $phpbb_filesystem;
 
-		if ($check && !phpbb_is_writable($this->cache_dir))
+		if ($check && !$phpbb_filesystem->is_writable($this->cache_dir))
 		{
 			// E_USER_ERROR - not using language entry - intended.
 			trigger_error('Unable to remove files within ' . $this->cache_dir . '. Please check directory permissions.', E_USER_ERROR);
--- /dev/null
+++ b/phpbb/cache/driver/dummy.php
@@ -0,0 +1,153 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\cache\driver;
+
+/**
+* ACM dummy Caching
+*/
+class dummy extends \phpbb\cache\driver\base
+{
+	/**
+	* Set cache path
+	*/
+	function __construct()
+	{
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	function load()
+	{
+		return true;
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	function unload()
+	{
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	function save()
+	{
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	function tidy()
+	{
+		global $config;
+
+		// This cache always has a tidy room.
+		$config->set('cache_last_gc', time(), false);
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	function get($var_name)
+	{
+		return false;
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	function put($var_name, $var, $ttl = 0)
+	{
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	function purge()
+	{
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	function destroy($var_name, $table = '')
+	{
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	function _exists($var_name)
+	{
+		return false;
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	function sql_load($query)
+	{
+		return false;
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	function sql_save(\phpbb\db\driver\driver_interface $db, $query, $query_result, $ttl)
+	{
+		return $query_result;
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	function sql_exists($query_id)
+	{
+		return false;
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	function sql_fetchrow($query_id)
+	{
+		return false;
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	function sql_fetchfield($query_id, $field)
+	{
+		return false;
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	function sql_rowseek($rownum, $query_id)
+	{
+		return false;
+	}
+
+	/**
+	* {@inheritDoc}
+	*/
+	function sql_freeresult($query_id)
+	{
+		return false;
+	}
+}
--- a/phpbb/cache/driver/eaccelerator.php
+++ b/phpbb/cache/driver/eaccelerator.php
@@ -44,9 +44,11 @@ class eaccelerator extends \phpbb\cache\driver\memory
 	*/
 	function tidy()
 	{
+		global $config;
+
 		eaccelerator_gc();
 
-		set_config('cache_last_gc', time(), true);
+		$config->set('cache_last_gc', time(), false);
 	}
 
 	/**
--- a/phpbb/cache/driver/file.php
+++ b/phpbb/cache/driver/file.php
@@ -20,6 +20,11 @@ class file extends \phpbb\cache\driver\base
 {
 	var $var_expires = array();
 
+	/**
+	 * @var	\phpbb\filesystem\filesystem_interface
+	 */
+	protected $filesystem;
+
 	/**
 	* Set cache path
 	*
@@ -27,8 +32,15 @@ class file extends \phpbb\cache\driver\base
 	*/
 	function __construct($cache_dir = null)
 	{
-		global $phpbb_root_path;
-		$this->cache_dir = !is_null($cache_dir) ? $cache_dir : $phpbb_root_path . 'cache/';
+		global $phpbb_container;
+
+		$this->cache_dir = !is_null($cache_dir) ? $cache_dir : $phpbb_container->getParameter('core.cache_dir');
+		$this->filesystem = new \phpbb\filesystem\filesystem();
+
+		if (!is_dir($this->cache_dir))
+		{
+			@mkdir($this->cache_dir, 0777, true);
+		}
 	}
 
 	/**
@@ -63,14 +75,8 @@ class file extends \phpbb\cache\driver\base
 
 		if (!$this->_write('data_global'))
 		{
-			if (!function_exists('phpbb_is_writable'))
-			{
-				global $phpbb_root_path;
-				include($phpbb_root_path . 'includes/functions.' . $phpEx);
-			}
-
 			// Now, this occurred how often? ... phew, just tell the user then...
-			if (!phpbb_is_writable($this->cache_dir))
+			if (!$this->filesystem->is_writable($this->cache_dir))
 			{
 				// We need to use die() here, because else we may encounter an infinite loop (the message handler calls $cache->unload())
 				die('Fatal: ' . $this->cache_dir . ' is NOT writable.');
@@ -89,7 +95,7 @@ class file extends \phpbb\cache\driver\base
 	*/
 	function tidy()
 	{
-		global $phpEx;
+		global $config, $phpEx;
 
 		$dir = @opendir($this->cache_dir);
 
@@ -143,7 +149,7 @@ class file extends \phpbb\cache\driver\base
 			}
 		}
 
-		set_config('cache_last_gc', time(), true);
+		$config->set('cache_last_gc', time(), false);
 	}
 
 	/**
@@ -306,7 +312,7 @@ class file extends \phpbb\cache\driver\base
 		// Remove extra spaces and tabs
 		$query = preg_replace('/[\n\r\s\t]+/', ' ', $query);
 
-		$query_id = sizeof($this->sql_rowset);
+		$query_id = md5($query);
 		$this->sql_rowset[$query_id] = array();
 		$this->sql_row_pointer[$query_id] = 0;
 
@@ -316,7 +322,7 @@ class file extends \phpbb\cache\driver\base
 		}
 		$db->sql_freeresult($query_result);
 
-		if ($this->_write('sql_' . md5($query), $this->sql_rowset[$query_id], $ttl + time(), $query))
+		if ($this->_write('sql_' . $query_id, $this->sql_rowset[$query_id], $ttl + time(), $query))
 		{
 			return $query_id;
 		}
@@ -570,16 +576,17 @@ class file extends \phpbb\cache\driver\base
 
 			if (function_exists('opcache_invalidate'))
 			{
-				@opcache_invalidate($file);
+				@opcache_invalidate($this->cache_file);
 			}
 
-			if (!function_exists('phpbb_chmod'))
+			try
 			{
-				global $phpbb_root_path;
-				include($phpbb_root_path . 'includes/functions.' . $phpEx);
+				$this->filesystem->phpbb_chmod($file, CHMOD_READ | CHMOD_WRITE);
+			}
+			catch (\phpbb\filesystem\exception\filesystem_exception $e)
+			{
+				// Do nothing
 			}
-
-			phpbb_chmod($file, CHMOD_READ | CHMOD_WRITE);
 
 			$return_value = true;
 		}
--- a/phpbb/cache/driver/memory.php
+++ b/phpbb/cache/driver/memory.php
@@ -25,9 +25,9 @@ abstract class memory extends \phpbb\cache\driver\base
 	*/
 	function __construct()
 	{
-		global $phpbb_root_path, $dbname, $table_prefix;
+		global $phpbb_root_path, $dbname, $table_prefix, $phpbb_container;
 
-		$this->cache_dir	= $phpbb_root_path . 'cache/';
+		$this->cache_dir	= $phpbb_container->getParameter('core.cache_dir');
 		$this->key_prefix	= substr(md5($dbname . $table_prefix), 0, 8) . '_';
 
 		if (!isset($this->extension) || !extension_loaded($this->extension))
@@ -81,9 +81,10 @@ abstract class memory extends \phpbb\cache\driver\base
 	*/
 	function tidy()
 	{
-		// cache has auto GC, no need to have any code here :)
+		global $config;
 
-		set_config('cache_last_gc', time(), true);
+		// cache has auto GC, no need to have any code here :)
+		$config->set('cache_last_gc', time(), false);
 	}
 
 	/**
@@ -203,7 +204,7 @@ abstract class memory extends \phpbb\cache\driver\base
 	{
 		// Remove extra spaces and tabs
 		$query = preg_replace('/[\n\r\s\t]+/', ' ', $query);
-		$hash = md5($query);
+		$query_id = md5($query);
 
 		// determine which tables this query belongs to
 		// Some queries use backticks, namely the get_database_size() query
@@ -244,14 +245,13 @@ abstract class memory extends \phpbb\cache\driver\base
 				$temp = array();
 			}
 
-			$temp[$hash] = true;
+			$temp[$query_id] = true;
 
 			// This must never expire
 			$this->_write('sql_' . $table_name, $temp, 0);
 		}
 
 		// store them in the right place
-		$query_id = sizeof($this->sql_rowset);
 		$this->sql_rowset[$query_id] = array();
 		$this->sql_row_pointer[$query_id] = 0;
 
@@ -261,7 +261,7 @@ abstract class memory extends \phpbb\cache\driver\base
 		}
 		$db->sql_freeresult($query_result);
 
-		$this->_write('sql_' . $hash, $this->sql_rowset[$query_id], $ttl);
+		$this->_write('sql_' . $query_id, $this->sql_rowset[$query_id], $ttl);
 
 		return $query_id;
 	}
--- a/phpbb/cache/service.php
+++ b/phpbb/cache/service.php
@@ -141,6 +141,7 @@ class service
 				$icons[$row['icons_id']]['img'] = $row['icons_url'];
 				$icons[$row['icons_id']]['width'] = (int) $row['icons_width'];
 				$icons[$row['icons_id']]['height'] = (int) $row['icons_height'];
+				$icons[$row['icons_id']]['alt'] = ($row['icons_alt']) ? $row['icons_alt'] : '';
 				$icons[$row['icons_id']]['display'] = (bool) $row['display_on_posting'];
 			}
 			$this->db->sql_freeresult($result);
@@ -301,7 +302,6 @@ class service
 		{
 			switch ($this->db->get_sql_layer())
 			{
-				case 'mssql':
 				case 'mssql_odbc':
 				case 'mssqlnative':
 					$sql = 'SELECT user_id, bot_agent, bot_ip
--- a/phpbb/captcha/gd.php
+++ b/phpbb/captcha/gd.php
@@ -97,13 +97,12 @@ class gd
 
 		if ($config['captcha_gd_3d_noise'])
 		{
-			$xoffset = mt_rand(0,9);
 			$noise_bitmaps = $this->captcha_noise_bg_bitmaps();
 			for ($i = 0; $i < $code_len; ++$i)
 			{
 				$noise[$i] = new char_cube3d($noise_bitmaps, mt_rand(1, sizeof($noise_bitmaps['data'])));
 
-				list($min, $max) = $noise[$i]->range();
+				$noise[$i]->range();
 				//$box = $noise[$i]->dimensions($sizes[$i]);
 			}
 			$xoffset = 0;
@@ -151,8 +150,6 @@ class gd
 	*/
 	function wave($img)
 	{
-		global $config;
-
 		$period_x = mt_rand(12,18);
 		$period_y = mt_rand(7,14);
 		$amp_x = mt_rand(5,10);
--- a/phpbb/captcha/gd_wave.php
+++ b/phpbb/captcha/gd_wave.php
@@ -23,8 +23,6 @@ class gd_wave
 
 	function execute($code, $seed)
 	{
-		global $starttime;
-
 		// seed the random generator
 		mt_srand($seed);
 
@@ -77,7 +75,6 @@ class gd_wave
 		// TODO
 		$background = imagecolorallocate($img, mt_rand(155, 255), mt_rand(155, 255), mt_rand(155, 255));
 		imagefill($img, 0, 0, $background);
-		$black = imagecolorallocate($img, 0, 0, 0);
 
 		$random = array();
 		$fontcolors = array();
@@ -155,7 +152,7 @@ class gd_wave
 		// rather than recalculating from absolute coordinates
 		// What we cache into the $img_buffer contains the raised text coordinates.
 		$img_pos_prev	= $img_buffer[0][0] = array($box['upper_left']['x'], $box['upper_left']['y']);
-		$cur_height		= $prev_height = $this->wave_height(0, 0, $subdivision_factor);
+		$prev_height = $this->wave_height(0, 0, $subdivision_factor);
 		$full_x			= $plane_x * $subdivision_factor;
 		$full_y			= $plane_y * $subdivision_factor;
 
--- a/phpbb/captcha/plugins/captcha_abstract.php
+++ b/phpbb/captcha/plugins/captcha_abstract.php
@@ -34,12 +34,12 @@ abstract class captcha_abstract
 
 	function init($type)
 	{
-		global $config, $db, $user;
+		global $config, $request;
 
 		// read input
-		$this->confirm_id = request_var('confirm_id', '');
-		$this->confirm_code = request_var('confirm_code', '');
-		$refresh = request_var('refresh_vc', false) && $config['confirm_refresh'];
+		$this->confirm_id = $request->variable('confirm_id', '');
+		$this->confirm_code = $request->variable('confirm_code', '');
+		$refresh = $request->variable('refresh_vc', false) && $config['confirm_refresh'];
 
 		$this->type = (int) $type;
 
@@ -56,8 +56,6 @@ abstract class captcha_abstract
 
 	function execute_demo()
 	{
-		global $user;
-
 		$this->code = gen_rand_string_friendly(mt_rand(CAPTCHA_MIN_CHARS, CAPTCHA_MAX_CHARS));
 		$this->seed = hexdec(substr(unique_id(), 4, 10));
 
@@ -117,7 +115,7 @@ abstract class captcha_abstract
 
 	function get_demo_template($id)
 	{
-		global $config, $user, $template, $phpbb_admin_path, $phpEx;
+		global $config, $template, $request, $phpbb_admin_path, $phpEx;
 
 		$variables = '';
 
@@ -125,7 +123,7 @@ abstract class captcha_abstract
 		{
 			foreach ($this->captcha_vars as $captcha_var => $template_var)
 			{
-				$variables .= '&amp;' . rawurlencode($captcha_var) . '=' . request_var($captcha_var, (int) $config[$captcha_var]);
+				$variables .= '&amp;' . rawurlencode($captcha_var) . '=' . $request->variable($captcha_var, (int) $config[$captcha_var]);
 			}
 		}
 
@@ -153,7 +151,7 @@ abstract class captcha_abstract
 
 	function garbage_collect($type)
 	{
-		global $db, $config;
+		global $db;
 
 		$sql = 'SELECT DISTINCT c.session_id
 			FROM ' . CONFIRM_TABLE . ' c
@@ -193,9 +191,9 @@ abstract class captcha_abstract
 
 	function validate()
 	{
-		global $config, $db, $user;
+		global $user;
 
-		if (empty($user->lang))
+		if (!$user->is_setup())
 		{
 			$user->setup();
 		}
@@ -350,7 +348,9 @@ abstract class captcha_abstract
 
 	function is_solved()
 	{
-		if (request_var('confirm_code', false) && $this->solved === 0)
+		global $request;
+
+		if ($request->variable('confirm_code', false) && $this->solved === 0)
 		{
 			$this->validate();
 		}
--- a/phpbb/captcha/plugins/gd.php
+++ b/phpbb/captcha/plugins/gd.php
@@ -53,38 +53,31 @@ class gd extends captcha_abstract
 
 	function acp_page($id, &$module)
 	{
-		global $db, $user, $auth, $template;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
+		global $user, $template, $phpbb_log, $request;
+		global $config;
 
 		$user->add_lang('acp/board');
 
-		$config_vars = array(
-			'enable_confirm'		=> 'REG_ENABLE',
-			'enable_post_confirm'	=> 'POST_ENABLE',
-			'confirm_refresh'		=> 'CONFIRM_REFRESH',
-			'captcha_gd'			=> 'CAPTCHA_GD',
-		);
-
 		$module->tpl_name = 'captcha_gd_acp';
 		$module->page_title = 'ACP_VC_SETTINGS';
 		$form_key = 'acp_captcha';
 		add_form_key($form_key);
 
-		$submit = request_var('submit', '');
+		$submit = $request->variable('submit', '');
 
 		if ($submit && check_form_key($form_key))
 		{
 			$captcha_vars = array_keys($this->captcha_vars);
 			foreach ($captcha_vars as $captcha_var)
 			{
-				$value = request_var($captcha_var, 0);
+				$value = $request->variable($captcha_var, 0);
 				if ($value >= 0)
 				{
-					set_config($captcha_var, $value);
+					$config->set($captcha_var, $value);
 				}
 			}
 
-			add_log('admin', 'LOG_CONFIG_VISUAL');
+			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_VISUAL');
 			trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($module->u_action));
 		}
 		else if ($submit)
@@ -95,7 +88,7 @@ class gd extends captcha_abstract
 		{
 			foreach ($this->captcha_vars as $captcha_var => $template_var)
 			{
-				$var = (isset($_REQUEST[$captcha_var])) ? request_var($captcha_var, 0) : $config[$captcha_var];
+				$var = (isset($_REQUEST[$captcha_var])) ? $request->variable($captcha_var, 0) : $config[$captcha_var];
 				$template->assign_var($template_var, $var);
 			}
 
@@ -109,7 +102,7 @@ class gd extends captcha_abstract
 
 	function execute_demo()
 	{
-		global $config;
+		global $config, $request;
 
 		$config_old = $config;
 
@@ -121,7 +114,7 @@ class gd extends captcha_abstract
 
 		foreach ($this->captcha_vars as $captcha_var => $template_var)
 		{
-			$config->set($captcha_var, request_var($captcha_var, (int) $config[$captcha_var]));
+			$config->set($captcha_var, $request->variable($captcha_var, (int) $config[$captcha_var]));
 		}
 		parent::execute_demo();
 		$config = $config_old;
--- a/phpbb/captcha/plugins/gd_wave.php
+++ b/phpbb/captcha/plugins/gd_wave.php
@@ -35,7 +35,7 @@ class gd_wave extends captcha_abstract
 
 	function acp_page($id, &$module)
 	{
-		global $config, $db, $template, $user;
+		global $user;
 
 		trigger_error($user->lang['CAPTCHA_NO_OPTIONS'] . adm_back_link($module->u_action));
 	}
--- a/phpbb/captcha/plugins/qa.php
+++ b/phpbb/captcha/plugins/qa.php
@@ -58,14 +58,14 @@ class qa
 	*/
 	function init($type)
 	{
-		global $config, $db, $user;
+		global $config, $db, $user, $request;
 
 		// load our language file
 		$user->add_lang('captcha_qa');
 
 		// read input
-		$this->confirm_id = request_var('qa_confirm_id', '');
-		$this->answer = utf8_normalize_nfc(request_var('qa_answer', '', true));
+		$this->confirm_id = $request->variable('qa_confirm_id', '');
+		$this->answer = $request->variable('qa_answer', '', true);
 
 		$this->type = (int) $type;
 		$this->question_lang = $user->lang_name;
@@ -135,9 +135,9 @@ class qa
 	*/
 	public function is_installed()
 	{
-		global $db;
+		global $phpbb_container;
 
-		$db_tool = new \phpbb\db\tools($db);
+		$db_tool = $phpbb_container->get('dbal.tools');
 
 		return $db_tool->sql_table_exists($this->table_captcha_questions);
 	}
@@ -334,10 +334,9 @@ class qa
 	*/
 	function install()
 	{
-		global $db;
-
-		$db_tool = new \phpbb\db\tools($db);
+		global $phpbb_container;
 
+		$db_tool = $phpbb_container->get('dbal.tools');
 		$schemas = array(
 				$this->table_captcha_questions		=> array (
 					'COLUMNS' => array(
@@ -572,9 +571,9 @@ class qa
 	*/
 	function check_answer()
 	{
-		global $db;
+		global $db, $request;
 
-		$answer = ($this->question_strict) ? utf8_normalize_nfc(request_var('qa_answer', '', true)) : utf8_clean_string(utf8_normalize_nfc(request_var('qa_answer', '', true)));
+		$answer = ($this->question_strict) ? $request->variable('qa_answer', '', true) : utf8_clean_string($request->variable('qa_answer', '', true));
 
 		$sql = 'SELECT answer_text
 			FROM ' . $this->table_captcha_answers . '
@@ -626,7 +625,9 @@ class qa
 	*/
 	function is_solved()
 	{
-		if (request_var('qa_answer', false) && $this->solved === 0)
+		global $request;
+
+		if ($request->variable('qa_answer', false) && $this->solved === 0)
 		{
 			$this->validate();
 		}
@@ -639,8 +640,7 @@ class qa
 	*/
 	function acp_page($id, &$module)
 	{
-		global $user, $template;
-		global $config;
+		global $config, $request, $phpbb_log, $template, $user;
 
 		$user->add_lang('acp/board');
 		$user->add_lang('captcha_qa');
@@ -655,9 +655,9 @@ class qa
 		$form_key = 'acp_captcha';
 		add_form_key($form_key);
 
-		$submit = request_var('submit', false);
-		$question_id = request_var('question_id', 0);
-		$action = request_var('action', '');
+		$submit = $request->variable('submit', false);
+		$question_id = $request->variable('question_id', 0);
+		$action = $request->variable('action', '');
 
 		// we have two pages, so users might want to navigate from one to the other
 		$list_url = $module->u_action . "&amp;configure=1&amp;select_captcha=" . $this->get_service_name();
@@ -762,7 +762,7 @@ class qa
 						$this->acp_add_question($question_input);
 					}
 
-					add_log('admin', 'LOG_CONFIG_VISUAL');
+					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_VISUAL');
 					trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($list_url));
 				}
 			}
@@ -848,7 +848,9 @@ class qa
 	*/
 	function acp_get_question_input()
 	{
-		$answers = utf8_normalize_nfc(request_var('answers', '', true));
+		global $request;
+
+		$answers = $request->variable('answers', '', true);
 
 		// Convert answers into array and filter if answers are set
 		if (strlen($answers))
@@ -859,9 +861,9 @@ class qa
 		}
 
 		$question = array(
-			'question_text'	=> request_var('question_text', '', true),
-			'strict'		=> request_var('strict', false),
-			'lang_iso'		=> request_var('lang_iso', ''),
+			'question_text'	=> $request->variable('question_text', '', true),
+			'strict'		=> $request->variable('strict', false),
+			'lang_iso'		=> $request->variable('lang_iso', ''),
 			'answers'		=> $answers,
 		);
 		return $question;
--- a/phpbb/captcha/plugins/recaptcha.php
+++ b/phpbb/captcha/plugins/recaptcha.php
@@ -18,12 +18,6 @@ class recaptcha extends captcha_abstract
 	var $recaptcha_server = 'http://www.google.com/recaptcha/api';
 	var $recaptcha_server_secure = 'https://www.google.com/recaptcha/api'; // class constants :(
 
-	// We are opening a socket to port 80 of this host and send
-	// the POST request asking for verification to the path specified here.
-	var $recaptcha_verify_server = 'www.google.com';
-	var $recaptcha_verify_path = '/recaptcha/api/verify';
-
-	var $challenge;
 	var $response;
 
 	/**
@@ -37,12 +31,11 @@ class recaptcha extends captcha_abstract
 
 	function init($type)
 	{
-		global $config, $db, $user;
+		global $user, $request;
 
 		$user->add_lang('captcha_recaptcha');
 		parent::init($type);
-		$this->challenge = request_var('recaptcha_challenge_field', '');
-		$this->response = request_var('recaptcha_response_field', '');
+		$this->response = $request->variable('g-recaptcha-response', '');
 	}
 
 	public function is_available()
@@ -75,7 +68,7 @@ class recaptcha extends captcha_abstract
 
 	function acp_page($id, &$module)
 	{
-		global $config, $db, $template, $user;
+		global $config, $template, $user, $phpbb_log, $request;
 
 		$captcha_vars = array(
 			'recaptcha_pubkey'				=> 'RECAPTCHA_PUBKEY',
@@ -87,21 +80,21 @@ class recaptcha extends captcha_abstract
 		$form_key = 'acp_captcha';
 		add_form_key($form_key);
 
-		$submit = request_var('submit', '');
+		$submit = $request->variable('submit', '');
 
 		if ($submit && check_form_key($form_key))
 		{
 			$captcha_vars = array_keys($captcha_vars);
 			foreach ($captcha_vars as $captcha_var)
 			{
-				$value = request_var($captcha_var, '');
+				$value = $request->variable($captcha_var, '');
 				if ($value)
 				{
-					set_config($captcha_var, $value);
+					$config->set($captcha_var, $value);
 				}
 			}
 
-			add_log('admin', 'LOG_CONFIG_VISUAL');
+			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_VISUAL');
 			trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($module->u_action));
 		}
 		else if ($submit)
@@ -112,7 +105,7 @@ class recaptcha extends captcha_abstract
 		{
 			foreach ($captcha_vars as $captcha_var => $template_var)
 			{
-				$var = (isset($_REQUEST[$captcha_var])) ? request_var($captcha_var, '') : ((isset($config[$captcha_var])) ? $config[$captcha_var] : '');
+				$var = (isset($_REQUEST[$captcha_var])) ? $request->variable($captcha_var, '') : ((isset($config[$captcha_var])) ? $config[$captcha_var] : '');
 				$template->assign_var($template_var, $var);
 			}
 
@@ -151,7 +144,6 @@ class recaptcha extends captcha_abstract
 			$template->assign_vars(array(
 				'RECAPTCHA_SERVER'			=> $this->recaptcha_server,
 				'RECAPTCHA_PUBKEY'			=> isset($config['recaptcha_pubkey']) ? $config['recaptcha_pubkey'] : '',
-				'RECAPTCHA_ERRORGET'		=> '',
 				'S_RECAPTCHA_AVAILABLE'		=> self::is_available(),
 				'S_CONFIRM_CODE'			=> true,
 				'S_TYPE'					=> $this->type,
@@ -202,106 +194,25 @@ class recaptcha extends captcha_abstract
 		}
 	}
 
-// Code from here on is based on recaptchalib.php
-/*
- * This is a PHP library that handles calling reCAPTCHA.
- *	- Documentation and latest version
- *		  http://recaptcha.net/plugins/php/
- *	- Get a reCAPTCHA API Key
- *		  http://recaptcha.net/api/getkey
- *	- Discussion group
- *		  http://groups.google.com/group/recaptcha
- *
- * Copyright (c) 2007 reCAPTCHA -- http://recaptcha.net
- * AUTHORS:
- *   Mike Crawford
- *   Ben Maurer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-	/**
-	* Submits an HTTP POST to a reCAPTCHA server
-	* @param string $host
-	* @param string $path
-	* @param array $data
-	* @param int port
-	* @return array response
-	*/
-	function _recaptcha_http_post($host, $path, $data, $port = 80)
-	{
-		$req = $this->_recaptcha_qsencode ($data);
-
-		$http_request  = "POST $path HTTP/1.0\r\n";
-		$http_request .= "Host: $host\r\n";
-		$http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
-		$http_request .= "Content-Length: " . strlen($req) . "\r\n";
-		$http_request .= "User-Agent: reCAPTCHA/PHP/phpBB\r\n";
-		$http_request .= "\r\n";
-		$http_request .= $req;
-
-		$response = '';
-		if (false == ($fs = @fsockopen($host, $port, $errno, $errstr, 10)))
-		{
-			trigger_error('RECAPTCHA_SOCKET_ERROR', E_USER_ERROR);
-		}
-
-		fwrite($fs, $http_request);
-
-		while (!feof($fs))
-		{
-			// One TCP-IP packet
-			$response .= fgets($fs, 1160);
-		}
-		fclose($fs);
-		$response = explode("\r\n\r\n", $response, 2);
-
-		return $response;
-	}
-
 	/**
 	* Calls an HTTP POST function to verify if the user's guess was correct
-	* @param array $extra_params an array of extra variables to post to the server
-	* @return ReCaptchaResponse
+	*
+	* @return bool|string Returns false on success or error string on failure.
 	*/
-	function recaptcha_check_answer($extra_params = array())
+	function recaptcha_check_answer()
 	{
 		global $config, $user;
 
 		//discard spam submissions
-		if ($this->challenge == null || strlen($this->challenge) == 0 || $this->response == null || strlen($this->response) == 0)
+		if ($this->response == null || strlen($this->response) == 0)
 		{
 			return $user->lang['RECAPTCHA_INCORRECT'];
 		}
 
-		$response = $this->_recaptcha_http_post($this->recaptcha_verify_server, $this->recaptcha_verify_path,
-			array(
-				'privatekey'	=> $config['recaptcha_privkey'],
-				'remoteip'		=> $user->ip,
-				'challenge'		=> $this->challenge,
-				'response'		=> $this->response
-			) + $extra_params
-		);
-
-		$answers = explode("\n", $response[1]);
+		$recaptcha = new \ReCaptcha\ReCaptcha($config['recaptcha_privkey']);
+		$result = $recaptcha->verify($this->response, $user->ip);
 
-		if (trim($answers[0]) === 'true')
+		if ($result->isSuccess())
 		{
 			$this->solved = true;
 			return false;
@@ -311,22 +222,4 @@ class recaptcha extends captcha_abstract
 			return $user->lang['RECAPTCHA_INCORRECT'];
 		}
 	}
-
-	/**
-	* Encodes the given data into a query string format
-	* @param $data - array of string elements to be encoded
-	* @return string - encoded request
-	*/
-	function _recaptcha_qsencode($data)
-	{
-		$req = '';
-		foreach ($data as $key => $value)
-		{
-			$req .= $key . '=' . urlencode(stripslashes($value)) . '&';
-		}
-
-		// Cut the last '&'
-		$req = substr($req, 0, strlen($req) - 1);
-		return $req;
-	}
 }
--- a/phpbb/composer.json
+++ b/phpbb/composer.json
@@ -22,11 +22,11 @@
 		"classmap": [""]
 	},
 	"require": {
-		"php": ">=5.3.3"
+		"php": ">=5.4"
 	},
 	"extra": {
 		"branch-alias": {
-			"dev-master": "3.1.x-dev"
+			"dev-master": "3.3.x-dev"
 		}
 	}
 }
--- a/phpbb/console/application.php
+++ b/phpbb/console/application.php
@@ -13,6 +13,7 @@
 
 namespace phpbb\console;
 
+use Symfony\Component\Console\Input\InputDefinition;
 use Symfony\Component\Console\Shell;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Input\InputOption;
@@ -26,18 +27,18 @@ class application extends \Symfony\Component\Console\Application
 	protected $in_shell = false;
 
 	/**
-	* @var \phpbb\user User object
+	* @var \phpbb\language\language User object
 	*/
-	protected $user;
+	protected $language;
 
 	/**
-	* @param string			$name		The name of the application
-	* @param string			$version	The version of the application
-	* @param \phpbb\user	$user		The user which runs the application (used for translation)
+	* @param string						$name		The name of the application
+	* @param string						$version	The version of the application
+	* @param \phpbb\language\language	$language	The user which runs the application (used for translation)
 	*/
-	public function __construct($name, $version, \phpbb\user $user)
+	public function __construct($name, $version, \phpbb\language\language $language)
 	{
-		$this->user = $user;
+		$this->language = $language;
 
 		parent::__construct($name, $version);
 	}
@@ -49,12 +50,7 @@ class application extends \Symfony\Component\Console\Application
 	{
 		$input_definition = parent::getDefaultInputDefinition();
 
-		$input_definition->addOption(new InputOption(
-			'safe-mode',
-			null,
-			InputOption::VALUE_NONE,
-			$this->user->lang('CLI_DESCRIPTION_OPTION_SAFE_MODE')
-		));
+		$this->register_global_options($input_definition);
 
 		return $input_definition;
 	}
@@ -76,12 +72,20 @@ class application extends \Symfony\Component\Console\Application
 			return parent::getHelp();
 		}
 
-		$this->getDefinition()->addOption(new InputOption(
-			'--shell',
-			'-s',
-			InputOption::VALUE_NONE,
-			$this->user->lang('CLI_DESCRIPTION_OPTION_SHELL')
-		));
+		try
+		{
+			$definition = $this->getDefinition();
+			$definition->addOption(new InputOption(
+				'--shell',
+				'-s',
+				InputOption::VALUE_NONE,
+				$this->language->lang('CLI_DESCRIPTION_OPTION_SHELL')
+			));
+		}
+		catch (\LogicException $e)
+		{
+			// Do nothing
+		}
 
 		return parent::getHelp();
 	}
@@ -117,4 +121,33 @@ class application extends \Symfony\Component\Console\Application
 
 		return parent::doRun($input, $output);
 	}
+
+	/**
+	 * Register global options
+	 *
+	 * @param InputDefinition $definition An InputDefinition instance
+	 */
+	protected function register_global_options(InputDefinition $definition)
+	{
+		try
+		{
+			$definition->addOption(new InputOption(
+				'safe-mode',
+				null,
+				InputOption::VALUE_NONE,
+				$this->language->lang('CLI_DESCRIPTION_OPTION_SAFE_MODE')
+			));
+
+			$definition->addOption(new InputOption(
+				'env',
+				'e',
+				InputOption::VALUE_REQUIRED,
+				$this->language->lang('CLI_DESCRIPTION_OPTION_ENV')
+			));
+		}
+		catch (\LogicException $e)
+		{
+			// Do nothing
+		}
+	}
 }
--- a/phpbb/console/command/cache/purge.php
+++ b/phpbb/console/command/cache/purge.php
@@ -14,6 +14,7 @@ namespace phpbb\console\command\cache;
 
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
 
 class purge extends \phpbb\console\command\command
 {
@@ -39,7 +40,7 @@ class purge extends \phpbb\console\command\command
 	* @param \phpbb\cache\driver\driver_interface	$cache	Cache instance
 	* @param \phpbb\db\driver\driver_interface		$db		Database connection
 	* @param \phpbb\auth\auth						$auth	Auth instance
-	* @param \phpbb\log\log							$log	Logger instance
+	* @param \phpbb\log\log_interface				$log	Logger instance
 	* @param \phpbb\config\config					$config	Config instance
 	*/
 	public function __construct(\phpbb\user $user, \phpbb\cache\driver\driver_interface $cache, \phpbb\db\driver\driver_interface $db, \phpbb\auth\auth $auth, \phpbb\log\log_interface $log, \phpbb\config\config $config)
@@ -71,7 +72,7 @@ class purge extends \phpbb\console\command\command
 	* @param InputInterface  $input  An InputInterface instance
 	* @param OutputInterface $output An OutputInterface instance
 	*
-	* @return null
+	* @return void
 	*/
 	protected function execute(InputInterface $input, OutputInterface $output)
 	{
@@ -84,6 +85,7 @@ class purge extends \phpbb\console\command\command
 
 		$this->log->add('admin', ANONYMOUS, '', 'LOG_PURGE_CACHE', time(), array());
 
-		$output->writeln($this->user->lang('PURGE_CACHE_SUCCESS'));
+		$io = new SymfonyStyle($input, $output);
+		$io->success($this->user->lang('PURGE_CACHE_SUCCESS'));
 	}
 }
--- a/phpbb/console/command/command.php
+++ b/phpbb/console/command/command.php
@@ -13,6 +13,10 @@
 
 namespace phpbb\console\command;
 
+use Symfony\Component\Console\Helper\ProgressBar;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
 abstract class command extends \Symfony\Component\Console\Command\Command
 {
 	/** @var \phpbb\user */
@@ -28,4 +32,45 @@ abstract class command extends \Symfony\Component\Console\Command\Command
 		$this->user = $user;
 		parent::__construct();
 	}
+
+	/**
+	 * Create a styled progress bar
+	 *
+	 * @param int             $max     Max value for the progress bar
+	 * @param SymfonyStyle    $io      Symfony style output decorator
+	 * @param OutputInterface $output  The output stream, used to print messages
+	 * @param bool            $message Should we display message output under the progress bar?
+	 * @return ProgressBar
+	 */
+	public function create_progress_bar($max, SymfonyStyle $io, OutputInterface $output, $message = false)
+	{
+		$progress = $io->createProgressBar($max);
+		if ($output->getVerbosity() === OutputInterface::VERBOSITY_VERBOSE)
+		{
+			$progress->setFormat('<info>[%percent:3s%%]</info> %message%');
+			$progress->setOverwrite(false);
+		}
+		else if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERY_VERBOSE)
+		{
+			$progress->setFormat('<info>[%current:s%/%max:s%]</info><comment>[%elapsed%/%estimated%][%memory%]</comment> %message%');
+			$progress->setOverwrite(false);
+		}
+		else
+		{
+			$io->newLine(2);
+			$progress->setFormat(
+				"    %current:s%/%max:s% %bar%  %percent:3s%%\n" .
+				"        " . ($message ? '%message%' : '                ') . " %elapsed:6s%/%estimated:-6s% %memory:6s%\n");
+			$progress->setBarWidth(60);
+		}
+
+		if (!defined('PHP_WINDOWS_VERSION_BUILD'))
+		{
+			$progress->setEmptyBarCharacter('░'); // light shade character \u2591
+			$progress->setProgressCharacter('');
+			$progress->setBarCharacter('▓'); // dark shade character \u2593
+		}
+
+		return $progress;
+	}
 }
--- a/phpbb/console/command/config/command.php
+++ b/phpbb/console/command/config/command.php
@@ -17,7 +17,7 @@ abstract class command extends \phpbb\console\command\command
 	/** @var \phpbb\config\config */
 	protected $config;
 
-	function __construct(\phpbb\user $user, \phpbb\config\config $config)
+	public function __construct(\phpbb\user $user, \phpbb\config\config $config)
 	{
 		$this->config = $config;
 
--- a/phpbb/console/command/config/delete.php
+++ b/phpbb/console/command/config/delete.php
@@ -15,6 +15,7 @@ namespace phpbb\console\command\config;
 use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
 
 class delete extends command
 {
@@ -42,22 +43,24 @@ class delete extends command
 	* @param InputInterface  $input  An InputInterface instance
 	* @param OutputInterface $output An OutputInterface instance
 	*
-	* @return null
+	* @return void
 	* @see \phpbb\config\config::delete()
 	*/
 	protected function execute(InputInterface $input, OutputInterface $output)
 	{
+		$io = new SymfonyStyle($input, $output);
+
 		$key = $input->getArgument('key');
 
 		if (isset($this->config[$key]))
 		{
 			$this->config->delete($key);
 
-			$output->writeln('<info>' . $this->user->lang('CLI_CONFIG_DELETE_SUCCESS', $key) . '</info>');
+			$io->success($this->user->lang('CLI_CONFIG_DELETE_SUCCESS', $key));
 		}
 		else
 		{
-			$output->writeln('<error>' . $this->user->lang('CLI_CONFIG_NOT_EXISTS', $key) . '</error>');
+			$io->error($this->user->lang('CLI_CONFIG_NOT_EXISTS', $key));
 		}
 	}
 }
--- a/phpbb/console/command/config/get.php
+++ b/phpbb/console/command/config/get.php
@@ -16,6 +16,7 @@ use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Input\InputOption;
 use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
 
 class get extends command
 {
@@ -49,11 +50,13 @@ class get extends command
 	* @param InputInterface  $input  An InputInterface instance
 	* @param OutputInterface $output An OutputInterface instance
 	*
-	* @return null
+	* @return void
 	* @see \phpbb\config\config::offsetGet()
 	*/
 	protected function execute(InputInterface $input, OutputInterface $output)
 	{
+		$io = new SymfonyStyle($input, $output);
+
 		$key = $input->getArgument('key');
 
 		if (isset($this->config[$key]) && $input->getOption('no-newline'))
@@ -66,7 +69,7 @@ class get extends command
 		}
 		else
 		{
-			$output->writeln('<error>' . $this->user->lang('CLI_CONFIG_NOT_EXISTS', $key) . '</error>');
+			$io->error($this->user->lang('CLI_CONFIG_NOT_EXISTS', $key));
 		}
 	}
 }
--- a/phpbb/console/command/config/increment.php
+++ b/phpbb/console/command/config/increment.php
@@ -16,6 +16,7 @@ use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Input\InputOption;
 use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
 
 class increment extends command
 {
@@ -54,17 +55,19 @@ class increment extends command
 	* @param InputInterface  $input  An InputInterface instance
 	* @param OutputInterface $output An OutputInterface instance
 	*
-	* @return null
+	* @return void
 	* @see \phpbb\config\config::increment()
 	*/
 	protected function execute(InputInterface $input, OutputInterface $output)
 	{
+		$io = new SymfonyStyle($input, $output);
+
 		$key = $input->getArgument('key');
 		$increment = $input->getArgument('increment');
 		$use_cache = !$input->getOption('dynamic');
 
 		$this->config->increment($key, $increment, $use_cache);
 
-		$output->writeln('<info>' . $this->user->lang('CLI_CONFIG_INCREMENT_SUCCESS', $key) . '</info>');
+		$io->success($this->user->lang('CLI_CONFIG_INCREMENT_SUCCESS', $key));
 	}
 }
--- a/phpbb/console/command/config/set.php
+++ b/phpbb/console/command/config/set.php
@@ -16,6 +16,7 @@ use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Input\InputOption;
 use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
 
 class set extends command
 {
@@ -54,17 +55,19 @@ class set extends command
 	* @param InputInterface  $input  An InputInterface instance
 	* @param OutputInterface $output An OutputInterface instance
 	*
-	* @return null
+	* @return void
 	* @see \phpbb\config\config::set()
 	*/
 	protected function execute(InputInterface $input, OutputInterface $output)
 	{
+		$io = new SymfonyStyle($input, $output);
+
 		$key = $input->getArgument('key');
 		$value = $input->getArgument('value');
 		$use_cache = !$input->getOption('dynamic');
 
 		$this->config->set($key, $value, $use_cache);
 
-		$output->writeln('<info>' . $this->user->lang('CLI_CONFIG_SET_SUCCESS', $key) . '</info>');
+		$io->success($this->user->lang('CLI_CONFIG_SET_SUCCESS', $key));
 	}
 }
--- a/phpbb/console/command/config/set_atomic.php
+++ b/phpbb/console/command/config/set_atomic.php
@@ -16,6 +16,7 @@ use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Input\InputOption;
 use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
 
 class set_atomic extends command
 {
@@ -65,6 +66,8 @@ class set_atomic extends command
 	*/
 	protected function execute(InputInterface $input, OutputInterface $output)
 	{
+		$io = new SymfonyStyle($input, $output);
+
 		$key = $input->getArgument('key');
 		$old_value = $input->getArgument('old');
 		$new_value = $input->getArgument('new');
@@ -72,12 +75,12 @@ class set_atomic extends command
 
 		if ($this->config->set_atomic($key, $old_value, $new_value, $use_cache))
 		{
-			$output->writeln('<info>' . $this->user->lang('CLI_CONFIG_SET_SUCCESS', $key) . '</info>');
+			$io->success($this->user->lang('CLI_CONFIG_SET_SUCCESS', $key));
 			return 0;
 		}
 		else
 		{
-			$output->writeln('<error>' . $this->user->lang('CLI_CONFIG_SET_FAILURE', $key) . '</error>');
+			$io->error($this->user->lang('CLI_CONFIG_SET_FAILURE', $key));
 			return 1;
 		}
 	}
--- a/phpbb/console/command/cron/cron_list.php
+++ b/phpbb/console/command/cron/cron_list.php
@@ -14,6 +14,7 @@ namespace phpbb\console\command\cron;
 
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
 
 class cron_list extends \phpbb\console\command\command
 {
@@ -51,61 +52,43 @@ class cron_list extends \phpbb\console\command\command
 	* @param InputInterface  $input  An InputInterface instance
 	* @param OutputInterface $output An OutputInterface instance
 	*
-	* @return null
+	* @return void
 	*/
 	protected function execute(InputInterface $input, OutputInterface $output)
 	{
+		$io = new SymfonyStyle($input, $output);
+
 		$tasks = $this->cron_manager->get_tasks();
 
 		if (empty($tasks))
 		{
-			$output->writeln($this->user->lang('CRON_NO_TASKS'));
+			$io->error($this->user->lang('CRON_NO_TASKS'));
 			return;
 		}
 
-		$ready_tasks = array();
-		$not_ready_tasks = array();
+		$ready_tasks = $not_ready_tasks = array();
 		foreach ($tasks as $task)
 		{
 			if ($task->is_ready())
 			{
-				$ready_tasks[] = $task;
+				$ready_tasks[] = $task->get_name();
 			}
 			else
 			{
-				$not_ready_tasks[] = $task;
+				$not_ready_tasks[] = $task->get_name();
 			}
 		}
 
 		if (!empty($ready_tasks))
 		{
-			$output->writeln('<info>' . $this->user->lang('TASKS_READY') . '</info>');
-			$this->print_tasks_names($ready_tasks, $output);
-		}
-
-		if (!empty($ready_tasks) && !empty($not_ready_tasks))
-		{
-			$output->writeln('');
+			$io->title($this->user->lang('TASKS_READY'));
+			$io->listing($ready_tasks);
 		}
 
 		if (!empty($not_ready_tasks))
 		{
-			$output->writeln('<info>' . $this->user->lang('TASKS_NOT_READY') . '</info>');
-			$this->print_tasks_names($not_ready_tasks, $output);
-		}
-	}
-
-	/**
-	* Print a list of cron jobs
-	*
-	* @param array				$tasks A list of task to display
-	* @param OutputInterface	$output An OutputInterface instance
-	*/
-	protected function print_tasks_names(array $tasks, OutputInterface $output)
-	{
-		foreach ($tasks as $task)
-		{
-			$output->writeln($task->get_name());
+			$io->title($this->user->lang('TASKS_NOT_READY'));
+			$io->listing($not_ready_tasks);
 		}
 	}
 }
--- a/phpbb/console/command/cron/run.php
+++ b/phpbb/console/command/cron/run.php
@@ -13,6 +13,7 @@
 
 namespace phpbb\console\command\cron;
 
+use phpbb\exception\runtime_exception;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Output\OutputInterface;
@@ -93,8 +94,7 @@ class run extends \phpbb\console\command\command
 		}
 		else
 		{
-			$output->writeln('<error>' . $this->user->lang('CRON_LOCK_ERROR') . '</error>');
-			return 1;
+			throw new runtime_exception('CRON_LOCK_ERROR', array(), null, 1);
 		}
 	}
 
@@ -165,8 +165,7 @@ class run extends \phpbb\console\command\command
 		}
 		else
 		{
-			$output->writeln('<error>' . $this->user->lang('CRON_NO_SUCH_TASK', $task_name) . '</error>');
-			return 2;
+			throw new runtime_exception('CRON_NO_SUCH_TASK', array( $task_name), null, 2);
 		}
 	}
 }
--- a/phpbb/console/command/db/console_migrator_output_handler.php
+++ b/phpbb/console/command/db/console_migrator_output_handler.php
@@ -13,8 +13,8 @@
 
 namespace phpbb\console\command\db;
 
+use phpbb\db\output_handler\migrator_output_handler_interface;
 use phpbb\user;
-use phpbb\db\migrator_output_handler_interface;
 use Symfony\Component\Console\Output\OutputInterface;
 
 class console_migrator_output_handler implements migrator_output_handler_interface
--- /dev/null
+++ b/phpbb/console/command/db/list_command.php
@@ -0,0 +1,81 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+namespace phpbb\console\command\db;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+class list_command extends \phpbb\console\command\db\migration_command
+{
+	protected function configure()
+	{
+		$this
+			->setName('db:list')
+			->setDescription($this->user->lang('CLI_DESCRIPTION_DB_LIST'))
+			->addOption(
+				'available',
+				'u',
+				InputOption::VALUE_NONE,
+				$this->user->lang('CLI_MIGRATIONS_ONLY_AVAILABLE')
+			)
+		;
+	}
+
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$io = new SymfonyStyle($input, $output);
+
+		$show_installed = !$input->getOption('available');
+		$installed = $available = array();
+
+		foreach ($this->load_migrations() as $name)
+		{
+			if ($this->migrator->migration_state($name) !== false)
+			{
+				$installed[] = $name;
+			}
+			else
+			{
+				$available[] = $name;
+			}
+		}
+
+		if ($show_installed)
+		{
+			$io->section($this->user->lang('CLI_MIGRATIONS_INSTALLED'));
+
+			if (!empty($installed))
+			{
+				$io->listing($installed);
+			}
+			else
+			{
+				$io->text($this->user->lang('CLI_MIGRATIONS_EMPTY'));
+				$io->newLine();
+			}
+		}
+
+		$io->section($this->user->lang('CLI_MIGRATIONS_AVAILABLE'));
+		if (!empty($available))
+		{
+			$io->listing($available);
+		}
+		else
+		{
+			$io->text($this->user->lang('CLI_MIGRATIONS_EMPTY'));
+			$io->newLine();
+		}
+	}
+}
--- a/phpbb/console/command/db/migrate.php
+++ b/phpbb/console/command/db/migrate.php
@@ -12,52 +12,48 @@
 */
 namespace phpbb\console\command\db;
 
+use phpbb\db\output_handler\log_wrapper_migrator_output_handler;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
 
-class migrate extends \phpbb\console\command\command
+class migrate extends \phpbb\console\command\db\migration_command
 {
-	/** @var \phpbb\db\migrator */
-	protected $migrator;
-
-	/** @var \phpbb\extension\manager */
-	protected $extension_manager;
-
-	/** @var \phpbb\config\config */
-	protected $config;
-
-	/** @var \phpbb\cache\service */
-	protected $cache;
-
 	/** @var \phpbb\log\log */
 	protected $log;
 
 	/** @var string phpBB root path */
 	protected $phpbb_root_path;
 
-	function __construct(\phpbb\user $user, \phpbb\db\migrator $migrator, \phpbb\extension\manager $extension_manager, \phpbb\config\config $config, \phpbb\cache\service $cache, \phpbb\log\log $log, $phpbb_root_path)
+	/** @var  \phpbb\filesystem\filesystem_interface */
+	protected $filesystem;
+
+	/** @var \phpbb\language\language */
+	protected $language;
+
+	public function __construct(\phpbb\user $user, \phpbb\language\language $language, \phpbb\db\migrator $migrator, \phpbb\extension\manager $extension_manager, \phpbb\config\config $config, \phpbb\cache\service $cache, \phpbb\log\log $log, \phpbb\filesystem\filesystem_interface $filesystem, $phpbb_root_path)
 	{
-		$this->migrator = $migrator;
-		$this->extension_manager = $extension_manager;
-		$this->config = $config;
-		$this->cache = $cache;
+		$this->language = $language;
 		$this->log = $log;
+		$this->filesystem = $filesystem;
 		$this->phpbb_root_path = $phpbb_root_path;
-		parent::__construct($user);
-		$this->user->add_lang(array('common', 'install', 'migrator'));
+		parent::__construct($user, $migrator, $extension_manager, $config, $cache);
+		$this->language->add_lang(array('common', 'install', 'migrator'));
 	}
 
 	protected function configure()
 	{
 		$this
 			->setName('db:migrate')
-			->setDescription($this->user->lang('CLI_DESCRIPTION_DB_MIGRATE'))
+			->setDescription($this->language->lang('CLI_DESCRIPTION_DB_MIGRATE'))
 		;
 	}
 
 	protected function execute(InputInterface $input, OutputInterface $output)
 	{
-		$this->migrator->set_output_handler(new \phpbb\db\log_wrapper_migrator_output_handler($this->user, new console_migrator_output_handler($this->user, $output), $this->phpbb_root_path . 'store/migrations_' . time() . '.log'));
+		$io = new SymfonyStyle($input, $output);
+
+		$this->migrator->set_output_handler(new log_wrapper_migrator_output_handler($this->language, new console_migrator_output_handler($this->user, $output), $this->phpbb_root_path . 'store/migrations_' . time() . '.log', $this->filesystem));
 
 		$this->migrator->create_migrations_table();
 
@@ -73,7 +69,7 @@ class migrate extends \phpbb\console\command\command
 			}
 			catch (\phpbb\db\migration\exception $e)
 			{
-				$output->writeln('<error>' . $e->getLocalisedMessage($this->user) . '</error>');
+				$io->error($e->getLocalisedMessage($this->user));
 				$this->finalise_update();
 				return 1;
 			}
@@ -85,23 +81,6 @@ class migrate extends \phpbb\console\command\command
 		}
 
 		$this->finalise_update();
-		$output->writeln($this->user->lang['DATABASE_UPDATE_COMPLETE']);
-	}
-
-	protected function load_migrations()
-	{
-		$migrations = $this->extension_manager
-			->get_finder()
-			->core_path('phpbb/db/migration/data/')
-			->extension_directory('/migrations')
-			->get_classes();
-
-		$this->migrator->set_migrations($migrations);
-	}
-
-	protected function finalise_update()
-	{
-		$this->cache->purge();
-		$this->config->increment('assets_version', 1);
+		$io->success($this->language->lang('INLINE_UPDATE_SUCCESSFUL'));
 	}
 }
--- /dev/null
+++ b/phpbb/console/command/db/migration_command.php
@@ -0,0 +1,56 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+namespace phpbb\console\command\db;
+
+abstract class migration_command extends \phpbb\console\command\command
+{
+	/** @var \phpbb\db\migrator */
+	protected $migrator;
+
+	/** @var \phpbb\extension\manager */
+	protected $extension_manager;
+
+	/** @var \phpbb\config\config */
+	protected $config;
+
+	/** @var \phpbb\cache\service */
+	protected $cache;
+
+	public function __construct(\phpbb\user $user, \phpbb\db\migrator $migrator, \phpbb\extension\manager $extension_manager, \phpbb\config\config $config, \phpbb\cache\service $cache)
+	{
+		$this->migrator = $migrator;
+		$this->extension_manager = $extension_manager;
+		$this->config = $config;
+		$this->cache = $cache;
+		parent::__construct($user);
+	}
+
+	protected function load_migrations()
+	{
+		$migrations = $this->extension_manager
+			->get_finder()
+			->core_path('phpbb/db/migration/data/')
+			->extension_directory('/migrations')
+			->get_classes();
+
+		$this->migrator->set_migrations($migrations);
+
+		return $this->migrator->get_migrations();
+	}
+
+	protected function finalise_update()
+	{
+		$this->cache->purge();
+		$this->config->increment('assets_version', 1);
+	}
+}
--- /dev/null
+++ b/phpbb/console/command/db/revert.php
@@ -0,0 +1,74 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+namespace phpbb\console\command\db;
+
+use phpbb\db\output_handler\log_wrapper_migrator_output_handler;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+class revert extends \phpbb\console\command\db\migrate
+{
+	protected function configure()
+	{
+		$this
+			->setName('db:revert')
+			->setDescription($this->language->lang('CLI_DESCRIPTION_DB_REVERT'))
+			->addArgument(
+				'name',
+				InputArgument::REQUIRED,
+				$this->language->lang('CLI_MIGRATION_NAME')
+			)
+		;
+	}
+
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$io = new SymfonyStyle($input, $output);
+
+		$name = str_replace('/', '\\', $input->getArgument('name'));
+
+		$this->migrator->set_output_handler(new log_wrapper_migrator_output_handler($this->language, new console_migrator_output_handler($this->user, $output), $this->phpbb_root_path . 'store/migrations_' . time() . '.log', $this->filesystem));
+
+		$this->cache->purge();
+
+		if (!in_array($name, $this->load_migrations()))
+		{
+			$io->error($this->language->lang('MIGRATION_NOT_VALID', $name));
+			return 1;
+		}
+		else if ($this->migrator->migration_state($name) === false)
+		{
+			$io->error($this->language->lang('MIGRATION_NOT_INSTALLED', $name));
+			return 1;
+		}
+
+		try
+		{
+			while ($this->migrator->migration_state($name) !== false)
+			{
+				$this->migrator->revert($name);
+			}
+		}
+		catch (\phpbb\db\migration\exception $e)
+		{
+			$io->error($e->getLocalisedMessage($this->user));
+			$this->finalise_update();
+			return 1;
+		}
+
+		$this->finalise_update();
+		$io->success($this->language->lang('INLINE_UPDATE_SUCCESSFUL'));
+	}
+}
--- a/phpbb/console/command/dev/migration_tips.php
+++ b/phpbb/console/command/dev/migration_tips.php
@@ -20,7 +20,7 @@ class migration_tips extends \phpbb\console\command\command
 	/** @var \phpbb\extension\manager */
 	protected $extension_manager;
 
-	function __construct(\phpbb\user $user, \phpbb\extension\manager $extension_manager)
+	public function __construct(\phpbb\user $user, \phpbb\extension\manager $extension_manager)
 	{
 		$this->extension_manager = $extension_manager;
 		parent::__construct($user);
--- a/phpbb/console/command/extension/disable.php
+++ b/phpbb/console/command/extension/disable.php
@@ -15,6 +15,7 @@ namespace phpbb\console\command\extension;
 use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
 
 class disable extends command
 {
@@ -33,19 +34,21 @@ class disable extends command
 
 	protected function execute(InputInterface $input, OutputInterface $output)
 	{
+		$io = new SymfonyStyle($input, $output);
+
 		$name = $input->getArgument('extension-name');
 		$this->manager->disable($name);
 		$this->manager->load_extensions();
 
 		if ($this->manager->is_enabled($name))
 		{
-			$output->writeln('<error>' . $this->user->lang('CLI_EXTENSION_DISABLE_FAILURE', $name) . '</error>');
+			$io->error($this->user->lang('CLI_EXTENSION_DISABLE_FAILURE', $name));
 			return 1;
 		}
 		else
 		{
 			$this->log->add('admin', ANONYMOUS, '', 'LOG_EXT_DISABLE', time(), array($name));
-			$output->writeln('<info>' . $this->user->lang('CLI_EXTENSION_DISABLE_SUCCESS', $name) . '</info>');
+			$io->success($this->user->lang('CLI_EXTENSION_DISABLE_SUCCESS', $name));
 			return 0;
 		}
 	}
--- a/phpbb/console/command/extension/enable.php
+++ b/phpbb/console/command/extension/enable.php
@@ -15,6 +15,7 @@ namespace phpbb\console\command\extension;
 use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
 
 class enable extends command
 {
@@ -33,6 +34,8 @@ class enable extends command
 
 	protected function execute(InputInterface $input, OutputInterface $output)
 	{
+		$io = new SymfonyStyle($input, $output);
+
 		$name = $input->getArgument('extension-name');
 		$this->manager->enable($name);
 		$this->manager->load_extensions();
@@ -40,12 +43,12 @@ class enable extends command
 		if ($this->manager->is_enabled($name))
 		{
 			$this->log->add('admin', ANONYMOUS, '', 'LOG_EXT_ENABLE', time(), array($name));
-			$output->writeln('<info>' . $this->user->lang('CLI_EXTENSION_ENABLE_SUCCESS', $name) . '</info>');
+			$io->success($this->user->lang('CLI_EXTENSION_ENABLE_SUCCESS', $name));
 			return 0;
 		}
 		else
 		{
-			$output->writeln('<error>' . $this->user->lang('CLI_EXTENSION_ENABLE_FAILURE', $name) . '</error>');
+			$io->error($this->user->lang('CLI_EXTENSION_ENABLE_FAILURE', $name));
 			return 1;
 		}
 	}
--- a/phpbb/console/command/extension/purge.php
+++ b/phpbb/console/command/extension/purge.php
@@ -15,6 +15,7 @@ namespace phpbb\console\command\extension;
 use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
 
 class purge extends command
 {
@@ -33,19 +34,21 @@ class purge extends command
 
 	protected function execute(InputInterface $input, OutputInterface $output)
 	{
+		$io = new SymfonyStyle($input, $output);
+
 		$name = $input->getArgument('extension-name');
 		$this->manager->purge($name);
 		$this->manager->load_extensions();
 
 		if ($this->manager->is_enabled($name))
 		{
-			$output->writeln('<error>' . $this->user->lang('CLI_EXTENSION_PURGE_FAILURE', $name) . '</error>');
+			$io->error($this->user->lang('CLI_EXTENSION_PURGE_FAILURE', $name));
 			return 1;
 		}
 		else
 		{
 			$this->log->add('admin', ANONYMOUS, '', 'LOG_EXT_PURGE', time(), array($name));
-			$output->writeln('<info>' . $this->user->lang('CLI_EXTENSION_PURGE_SUCCESS', $name) . '</info>');
+			$io->success($this->user->lang('CLI_EXTENSION_PURGE_SUCCESS', $name));
 			return 0;
 		}
 	}
--- a/phpbb/console/command/extension/show.php
+++ b/phpbb/console/command/extension/show.php
@@ -14,6 +14,7 @@ namespace phpbb\console\command\extension;
 
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
 
 class show extends command
 {
@@ -27,36 +28,27 @@ class show extends command
 
 	protected function execute(InputInterface $input, OutputInterface $output)
 	{
+		$io = new SymfonyStyle($input, $output);
+
 		$this->manager->load_extensions();
 		$all = array_keys($this->manager->all_available());
 
 		if (empty($all))
 		{
-			$output->writeln('<comment>' . $this->user->lang('CLI_EXTENSION_NOT_FOUND') . '</comment>');
+			$io->note($this->user->lang('CLI_EXTENSION_NOT_FOUND'));
 			return 3;
 		}
 
 		$enabled = array_keys($this->manager->all_enabled());
-		$this->print_extension_list($output, $this->user->lang('CLI_EXTENSIONS_ENABLED') . $this->user->lang('COLON'), $enabled);
-
-		$output->writeln('');
+		$io->section($this->user->lang('CLI_EXTENSIONS_ENABLED'));
+		$io->listing($enabled);
 
 		$disabled = array_keys($this->manager->all_disabled());
-		$this->print_extension_list($output, $this->user->lang('CLI_EXTENSIONS_DISABLED') . $this->user->lang('COLON'), $disabled);
-
-		$output->writeln('');
+		$io->section($this->user->lang('CLI_EXTENSIONS_DISABLED'));
+		$io->listing($disabled);
 
 		$purged = array_diff($all, $enabled, $disabled);
-		$this->print_extension_list($output, $this->user->lang('CLI_EXTENSIONS_AVAILABLE') . $this->user->lang('COLON'), $purged);
-	}
-
-	protected function print_extension_list(OutputInterface $output, $type, array $extensions)
-	{
-		$output->writeln("<info>$type</info>");
-
-		foreach ($extensions as $extension)
-		{
-			$output->writeln(" - $extension");
-		}
+		$io->section($this->user->lang('CLI_EXTENSIONS_AVAILABLE'));
+		$io->listing($purged);
 	}
 }
--- a/phpbb/console/command/fixup/recalculate_email_hash.php
+++ b/phpbb/console/command/fixup/recalculate_email_hash.php
@@ -14,13 +14,14 @@ namespace phpbb\console\command\fixup;
 
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
 
 class recalculate_email_hash extends \phpbb\console\command\command
 {
 	/** @var \phpbb\db\driver\driver_interface */
 	protected $db;
 
-	function __construct(\phpbb\user $user, \phpbb\db\driver\driver_interface $db)
+	public function __construct(\phpbb\user $user, \phpbb\db\driver\driver_interface $db)
 	{
 		$this->db = $db;
 
@@ -37,6 +38,8 @@ class recalculate_email_hash extends \phpbb\console\command\command
 
 	protected function execute(InputInterface $input, OutputInterface $output)
 	{
+		$io = new SymfonyStyle($input, $output);
+
 		$sql = 'SELECT user_id, user_email, user_email_hash
 			FROM ' . USERS_TABLE . '
 			WHERE user_type <> ' . USER_IGNORE . "
@@ -59,17 +62,15 @@ class recalculate_email_hash extends \phpbb\console\command\command
 
 				if ($output->getVerbosity() >= OutputInterface::VERBOSITY_DEBUG)
 				{
-					$output->writeln(sprintf(
-						'user_id %d, email %s => %s',
-						$row['user_id'],
-						$row['user_email'],
-						$user_email_hash
-					));
+					$io->table(
+						array('user_id', 'user_email', 'user_email_hash'),
+						array(array($row['user_id'], $row['user_email'], $user_email_hash))
+					);
 				}
 			}
 		}
 		$this->db->sql_freeresult($result);
 
-		$output->writeln('<info>' . $this->user->lang('CLI_FIXUP_RECALCULATE_EMAIL_HASH_SUCCESS') . '</info>');
+		$io->success($this->user->lang('CLI_FIXUP_RECALCULATE_EMAIL_HASH_SUCCESS'));
 	}
 }
--- /dev/null
+++ b/phpbb/console/command/reparser/list_all.php
@@ -0,0 +1,72 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\console\command\reparser;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+class list_all extends \phpbb\console\command\command
+{
+	/**
+	* @var string[] Names of the reparser services
+	*/
+	protected $reparser_names;
+
+	/**
+	* Constructor
+	*
+	* @param \phpbb\user $user
+	* @param \phpbb\di\service_collection $reparsers
+	*/
+	public function __construct(\phpbb\user $user, \phpbb\di\service_collection $reparsers)
+	{
+		parent::__construct($user);
+		$this->reparser_names = array();
+		foreach ($reparsers as $reparser)
+		{
+			// Store the names without the "text_reparser." prefix
+			$this->reparser_names[] = $reparser->get_name();
+		}
+	}
+
+	/**
+	* Sets the command name and description
+	*
+	* @return null
+	*/
+	protected function configure()
+	{
+		$this
+			->setName('reparser:list')
+			->setDescription($this->user->lang('CLI_DESCRIPTION_REPARSER_LIST'))
+		;
+	}
+
+	/**
+	* Executes the command reparser:list
+	*
+	* @param InputInterface $input
+	* @param OutputInterface $output
+	* @return integer
+	*/
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$io = new SymfonyStyle($input, $output);
+		$io->section($this->user->lang('CLI_DESCRIPTION_REPARSER_AVAILABLE'));
+		$io->listing($this->reparser_names);
+
+		return 0;
+	}
+}
--- /dev/null
+++ b/phpbb/console/command/reparser/reparse.php
@@ -0,0 +1,242 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\console\command\reparser;
+
+use phpbb\exception\runtime_exception;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+class reparse extends \phpbb\console\command\command
+{
+	/**
+	* @var InputInterface
+	*/
+	protected $input;
+
+	/**
+	* @var SymfonyStyle
+	*/
+	protected $io;
+
+	/**
+	* @var OutputInterface
+	*/
+	protected $output;
+
+	/**
+	 * @var \phpbb\lock\db
+	 */
+	protected $reparse_lock;
+
+	/**
+	 * @var \phpbb\textreparser\manager
+	 */
+	protected $reparser_manager;
+
+	/**
+	* @var \phpbb\di\service_collection
+	*/
+	protected $reparsers;
+
+	/**
+	* @var array The reparser's last $current ID as values
+	*/
+	protected $resume_data;
+
+	/**
+	* Constructor
+	*
+	* @param \phpbb\user $user
+	* @param \phpbb\lock\db $reparse_lock
+	* @param \phpbb\textreparser\manager $reparser_manager
+	* @param \phpbb\di\service_collection $reparsers
+	*/
+	public function __construct(\phpbb\user $user, \phpbb\lock\db $reparse_lock, \phpbb\textreparser\manager $reparser_manager, \phpbb\di\service_collection $reparsers)
+	{
+		require_once __DIR__ . '/../../../../includes/functions_content.php';
+
+		$this->reparse_lock = $reparse_lock;
+		$this->reparser_manager = $reparser_manager;
+		$this->reparsers = $reparsers;
+		parent::__construct($user);
+	}
+
+	/**
+	* Sets the command name and description
+	*
+	* @return null
+	*/
+	protected function configure()
+	{
+		$this
+			->setName('reparser:reparse')
+			->setDescription($this->user->lang('CLI_DESCRIPTION_REPARSER_REPARSE'))
+			->addArgument('reparser-name', InputArgument::OPTIONAL, $this->user->lang('CLI_DESCRIPTION_REPARSER_REPARSE_ARG_1'))
+			->addOption(
+				'dry-run',
+				null,
+				InputOption::VALUE_NONE,
+				$this->user->lang('CLI_DESCRIPTION_REPARSER_REPARSE_OPT_DRY_RUN')
+			)
+			->addOption(
+				'resume',
+				null,
+				InputOption::VALUE_NONE,
+				$this->user->lang('CLI_DESCRIPTION_REPARSER_REPARSE_OPT_RESUME')
+			)
+			->addOption(
+				'range-min',
+				null,
+				InputOption::VALUE_REQUIRED,
+				$this->user->lang('CLI_DESCRIPTION_REPARSER_REPARSE_OPT_RANGE_MIN'),
+				1
+			)
+			->addOption(
+				'range-max',
+				null,
+				InputOption::VALUE_REQUIRED,
+				$this->user->lang('CLI_DESCRIPTION_REPARSER_REPARSE_OPT_RANGE_MAX')
+			)
+			->addOption(
+				'range-size',
+				null,
+				InputOption::VALUE_REQUIRED,
+				$this->user->lang('CLI_DESCRIPTION_REPARSER_REPARSE_OPT_RANGE_SIZE'),
+				100
+			);
+		;
+	}
+
+	/**
+	* Executes the command reparser:reparse
+	*
+	* @param InputInterface $input
+	* @param OutputInterface $output
+	* @return integer
+	*/
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$this->input = $input;
+		$this->output = $output;
+		$this->io = new SymfonyStyle($input, $output);
+
+		if (!$this->reparse_lock->acquire())
+		{
+			throw new runtime_exception('REPARSE_LOCK_ERROR', array(), null, 1);
+		}
+
+		$name = $input->getArgument('reparser-name');
+		if ($name)
+		{
+			$name = $this->reparser_manager->find_reparser($name);
+			$this->reparse($name);
+		}
+		else
+		{
+			foreach ($this->reparsers as $name => $service)
+			{
+				$this->reparse($name);
+			}
+		}
+
+		$this->io->success($this->user->lang('CLI_REPARSER_REPARSE_SUCCESS'));
+
+		$this->reparse_lock->release();
+
+		return 0;
+	}
+
+	/**
+	* Get an option value, adjusted for given reparser
+	*
+	* Will use the last saved value if --resume is set and the option was not specified
+	* on the command line
+	*
+	* @param  string  $option_name   Option name
+	* @return integer
+	*/
+	protected function get_option($option_name)
+	{
+		// Return the option from the resume_data if applicable
+		if ($this->input->getOption('resume') && isset($this->resume_data[$option_name]) && !$this->input->hasParameterOption('--' . $option_name))
+		{
+			return $this->resume_data[$option_name];
+		}
+
+		return $this->input->getOption($option_name);
+	}
+
+	/**
+	* Reparse all text handled by given reparser within given range
+	*
+	* @param string $name Reparser service name
+	*/
+	protected function reparse($name)
+	{
+		$reparser = $this->reparsers[$name];
+		$this->resume_data = $this->reparser_manager->get_resume_data($name);
+		if ($this->input->getOption('dry-run'))
+		{
+			$reparser->disable_save();
+		}
+		else
+		{
+			$reparser->enable_save();
+		}
+
+		// Start at range-max if specified or at the highest ID otherwise
+		$max  = $this->get_option('range-max');
+		$min  = $this->get_option('range-min');
+		$size = $this->get_option('range-size');
+
+		// range-max has no default value, it must be computed for each reparser
+		if ($max === null)
+		{
+			$max = $reparser->get_max_id();
+		}
+
+		if ($max < $min)
+		{
+			return;
+		}
+
+		$this->io->section($this->user->lang('CLI_REPARSER_REPARSE_REPARSING', $reparser->get_name(), $min, $max));
+
+		$progress = $this->create_progress_bar($max, $this->io, $this->output, true);
+		$progress->setMessage($this->user->lang('CLI_REPARSER_REPARSE_REPARSING_START', $reparser->get_name()));
+		$progress->start();
+
+		// Start from $max and decrement $current by $size until we reach $min
+		$current = $max;
+		while ($current >= $min)
+		{
+			$start = max($min, $current + 1 - $size);
+			$end   = max($min, $current);
+
+			$progress->setMessage($this->user->lang('CLI_REPARSER_REPARSE_REPARSING', $reparser->get_name(), $start, $end));
+			$reparser->reparse_range($start, $end);
+
+			$current = $start - 1;
+			$progress->setProgress($max + 1 - $start);
+
+			$this->reparser_manager->update_resume_data($name, $min, $current, $size, !$this->input->getOption('dry-run'));
+		}
+		$progress->finish();
+
+		$this->io->newLine(2);
+	}
+}
--- /dev/null
+++ b/phpbb/console/command/thumbnail/delete.php
@@ -0,0 +1,153 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+namespace phpbb\console\command\thumbnail;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+class delete extends \phpbb\console\command\command
+{
+	/**
+	* @var \phpbb\db\driver\driver_interface
+	*/
+	protected $db;
+
+	/**
+	* phpBB root path
+	* @var string
+	*/
+	protected $phpbb_root_path;
+
+	/**
+	* Constructor
+	*
+	* @param \phpbb\user $user The user object (used to get language information)
+	* @param \phpbb\db\driver\driver_interface $db Database connection
+	* @param string $phpbb_root_path Root path
+	*/
+	public function __construct(\phpbb\user $user, \phpbb\db\driver\driver_interface $db, $phpbb_root_path)
+	{
+		$this->db = $db;
+		$this->phpbb_root_path = $phpbb_root_path;
+
+		parent::__construct($user);
+	}
+
+	/**
+	* Sets the command name and description
+	*
+	* @return null
+	*/
+	protected function configure()
+	{
+		$this
+			->setName('thumbnail:delete')
+			->setDescription($this->user->lang('CLI_DESCRIPTION_THUMBNAIL_DELETE'))
+		;
+	}
+
+	/**
+	* Executes the command thumbnail:delete.
+	*
+	* Deletes all existing thumbnails and updates the database accordingly.
+	*
+	* @param InputInterface $input The input stream used to get the argument and verbose option.
+	* @param OutputInterface $output The output stream, used for printing verbose-mode and error information.
+	*
+	* @return int 0 if all is ok, 1 if a thumbnail couldn't be deleted.
+	*/
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$io = new SymfonyStyle($input, $output);
+
+		$io->section($this->user->lang('CLI_THUMBNAIL_DELETING'));
+
+		$sql = 'SELECT COUNT(*) AS nb_missing_thumbnails
+			FROM ' . ATTACHMENTS_TABLE . '
+			WHERE thumbnail = 1';
+		$result = $this->db->sql_query($sql);
+		$nb_missing_thumbnails = (int) $this->db->sql_fetchfield('nb_missing_thumbnails');
+		$this->db->sql_freeresult($result);
+
+		if ($nb_missing_thumbnails === 0)
+		{
+			$io->warning($this->user->lang('CLI_THUMBNAIL_NOTHING_TO_DELETE'));
+			return 0;
+		}
+
+		$sql = 'SELECT attach_id, physical_filename, extension, real_filename, mimetype
+			FROM ' . ATTACHMENTS_TABLE . '
+			WHERE thumbnail = 1';
+		$result = $this->db->sql_query($sql);
+
+		$progress = $this->create_progress_bar($nb_missing_thumbnails, $io, $output);
+
+		$progress->setMessage($this->user->lang('CLI_THUMBNAIL_DELETING'));
+
+		$progress->start();
+
+		$thumbnail_deleted = array();
+		$return = 0;
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$thumbnail_path = $this->phpbb_root_path . 'files/thumb_' . $row['physical_filename'];
+
+			if (@unlink($thumbnail_path))
+			{
+				$thumbnail_deleted[] = $row['attach_id'];
+
+				if (sizeof($thumbnail_deleted) === 250)
+				{
+					$this->commit_changes($thumbnail_deleted);
+					$thumbnail_deleted = array();
+				}
+
+				$progress->setMessage($this->user->lang('CLI_THUMBNAIL_DELETED', $row['real_filename'], $row['physical_filename']));
+			}
+			else
+			{
+				$return = 1;
+				$progress->setMessage('<error>' . $this->user->lang('CLI_THUMBNAIL_SKIPPED', $row['real_filename'], $row['physical_filename']) . '</error>');
+			}
+
+			$progress->advance();
+		}
+		$this->db->sql_freeresult($result);
+
+		if (!empty($thumbnail_deleted))
+		{
+			$this->commit_changes($thumbnail_deleted);
+		}
+
+		$progress->finish();
+
+		$io->newLine(2);
+		$io->success($this->user->lang('CLI_THUMBNAIL_DELETING_DONE'));
+
+		return $return;
+	}
+
+	/**
+	* Commits the changes to the database
+	*
+	* @param array $thumbnail_deleted
+	*/
+	protected function commit_changes(array $thumbnail_deleted)
+	{
+		$sql = 'UPDATE ' . ATTACHMENTS_TABLE . '
+				SET thumbnail = 0
+				WHERE ' . $this->db->sql_in_set('attach_id', $thumbnail_deleted);
+		$this->db->sql_query($sql);
+	}
+}
--- /dev/null
+++ b/phpbb/console/command/thumbnail/generate.php
@@ -0,0 +1,179 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\console\command\thumbnail;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+class generate extends \phpbb\console\command\command
+{
+	/**
+	* @var \phpbb\db\driver\driver_interface
+	*/
+	protected $db;
+
+	/**
+	* @var \phpbb\cache\service
+	*/
+	protected $cache;
+
+	/**
+	* phpBB root path
+	* @var string
+	*/
+	protected $phpbb_root_path;
+
+	/**
+	* PHP extension.
+	*
+	* @var string
+	*/
+	protected $php_ext;
+
+	/**
+	* Constructor
+	*
+	* @param \phpbb\user $user The user object (used to get language information)
+	* @param \phpbb\db\driver\driver_interface $db Database connection
+	* @param \phpbb\cache\service $cache The cache service
+	* @param string $phpbb_root_path Root path
+	* @param string $php_ext PHP extension
+	*/
+	public function __construct(\phpbb\user $user, \phpbb\db\driver\driver_interface $db, \phpbb\cache\service $cache, $phpbb_root_path, $php_ext)
+	{
+		$this->db = $db;
+		$this->cache = $cache;
+		$this->phpbb_root_path = $phpbb_root_path;
+		$this->php_ext = $php_ext;
+
+		parent::__construct($user);
+	}
+
+	/**
+	* Sets the command name and description
+	*
+	* @return null
+	*/
+	protected function configure()
+	{
+		$this
+			->setName('thumbnail:generate')
+			->setDescription($this->user->lang('CLI_DESCRIPTION_THUMBNAIL_GENERATE'))
+		;
+	}
+
+	/**
+	* Executes the command thumbnail:generate.
+	*
+	* Generate a thumbnail for all attachments which need one and don't have it yet.
+	*
+	* @param InputInterface $input The input stream used to get the argument and verboe option.
+	* @param OutputInterface $output The output stream, used for printing verbose-mode and error information.
+	*
+	* @return int 0.
+	*/
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$io = new SymfonyStyle($input, $output);
+
+		$io->section($this->user->lang('CLI_THUMBNAIL_GENERATING'));
+
+		$sql = 'SELECT COUNT(*) AS nb_missing_thumbnails
+			FROM ' . ATTACHMENTS_TABLE . '
+			WHERE thumbnail = 0';
+		$result = $this->db->sql_query($sql);
+		$nb_missing_thumbnails = (int) $this->db->sql_fetchfield('nb_missing_thumbnails');
+		$this->db->sql_freeresult($result);
+
+		if ($nb_missing_thumbnails === 0)
+		{
+			$io->warning($this->user->lang('CLI_THUMBNAIL_NOTHING_TO_GENERATE'));
+			return 0;
+		}
+
+		$extensions = $this->cache->obtain_attach_extensions(true);
+
+		$sql = 'SELECT attach_id, physical_filename, extension, real_filename, mimetype
+			FROM ' . ATTACHMENTS_TABLE . '
+			WHERE thumbnail = 0';
+		$result = $this->db->sql_query($sql);
+
+		if (!function_exists('create_thumbnail'))
+		{
+			require($this->phpbb_root_path . 'includes/functions_posting.' . $this->php_ext);
+		}
+
+		$progress = $this->create_progress_bar($nb_missing_thumbnails, $io, $output);
+
+		$progress->setMessage($this->user->lang('CLI_THUMBNAIL_GENERATING'));
+
+		$progress->start();
+
+		$thumbnail_created = array();
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			if (isset($extensions[$row['extension']]['display_cat']) && $extensions[$row['extension']]['display_cat'] == ATTACHMENT_CATEGORY_IMAGE)
+			{
+				$source = $this->phpbb_root_path . 'files/' . $row['physical_filename'];
+				$destination = $this->phpbb_root_path . 'files/thumb_' . $row['physical_filename'];
+
+				if (create_thumbnail($source, $destination, $row['mimetype']))
+				{
+					$thumbnail_created[] = (int) $row['attach_id'];
+
+					if (count($thumbnail_created) === 250)
+					{
+						$this->commit_changes($thumbnail_created);
+						$thumbnail_created = array();
+					}
+
+					$progress->setMessage($this->user->lang('CLI_THUMBNAIL_GENERATED', $row['real_filename'], $row['physical_filename']));
+				}
+				else
+				{
+					$progress->setMessage('<info>' . $this->user->lang('CLI_THUMBNAIL_SKIPPED', $row['real_filename'], $row['physical_filename']) . '</info>');
+				}
+			}
+
+			$progress->advance();
+		}
+		$this->db->sql_freeresult($result);
+
+		if (!empty($thumbnail_created))
+		{
+			$this->commit_changes($thumbnail_created);
+		}
+
+		$progress->finish();
+
+		$io->newLine(2);
+		$io->success($this->user->lang('CLI_THUMBNAIL_GENERATING_DONE'));
+
+		return 0;
+	}
+
+	/**
+	* Commits the changes to the database
+	*
+	* @param array $thumbnail_created
+	*/
+	protected function commit_changes(array $thumbnail_created)
+	{
+		$sql = 'UPDATE ' . ATTACHMENTS_TABLE . '
+				SET thumbnail = 1
+				WHERE ' . $this->db->sql_in_set('attach_id', $thumbnail_created);
+		$this->db->sql_query($sql);
+	}
+}
--- /dev/null
+++ b/phpbb/console/command/thumbnail/recreate.php
@@ -0,0 +1,72 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+namespace phpbb\console\command\thumbnail;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\ArrayInput;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class recreate extends \phpbb\console\command\command
+{
+	/**
+	* Sets the command name and description
+	*
+	* @return null
+	*/
+	protected function configure()
+	{
+		$this
+			->setName('thumbnail:recreate')
+			->setDescription($this->user->lang('CLI_DESCRIPTION_THUMBNAIL_RECREATE'))
+		;
+	}
+
+	/**
+	* Executes the command thumbnail:recreate.
+	*
+	* This command is a "macro" to execute thumbnail:delete and then thumbnail:generate.
+	*
+	* @param InputInterface $input The input stream used to get the argument and verboe option.
+	* @param OutputInterface $output The output stream, used for printing verbose-mode and error information.
+	*
+	* @return int 0 if all is ok, 1 if a thumbnail couldn't be deleted.
+	*/
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$parameters = array(
+			'command' => 'thumbnail:delete'
+		);
+
+		if ($input->getOption('verbose'))
+		{
+			$parameters['-' . str_repeat('v', $output->getVerbosity() - 1)] = true;
+		}
+
+		$this->getApplication()->setAutoExit(false);
+
+		$input_delete = new ArrayInput($parameters);
+		$return = $this->getApplication()->run($input_delete, $output);
+
+		if ($return === 0)
+		{
+			$parameters['command'] = 'thumbnail:generate';
+
+			$input_create = new ArrayInput($parameters);
+			$return = $this->getApplication()->run($input_create, $output);
+		}
+
+		$this->getApplication()->setAutoExit(true);
+
+		return $return;
+	}
+}
--- /dev/null
+++ b/phpbb/console/command/update/check.php
@@ -0,0 +1,331 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\console\command\update;
+
+use phpbb\config\config;
+use phpbb\exception\exception_interface;
+use phpbb\language\language;
+use phpbb\user;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+class check extends \phpbb\console\command\command
+{
+	/** @var \phpbb\config\config */
+	protected $config;
+
+	/** @var \Symfony\Component\DependencyInjection\ContainerBuilder */
+	protected $phpbb_container;
+	/**
+	 * @var language
+	 */
+	private $language;
+
+	/**
+	* Construct method
+	*/
+	public function __construct(user $user, config $config, ContainerInterface $phpbb_container, language $language)
+	{
+		$this->config = $config;
+		$this->phpbb_container = $phpbb_container;
+		$this->language = $language;
+
+		$this->language->add_lang(array('acp/common', 'acp/extensions'));
+
+		parent::__construct($user);
+	}
+
+	/**
+	* Configures the service.
+	*
+	* Sets the name and description of the command.
+	*
+	* @return null
+	*/
+	protected function configure()
+	{
+		$this
+			->setName('update:check')
+			->setDescription($this->language->lang('CLI_DESCRIPTION_UPDATE_CHECK'))
+			->addArgument('ext-name', InputArgument::OPTIONAL, $this->language->lang('CLI_DESCRIPTION_UPDATE_CHECK_ARGUMENT_1'))
+			->addOption('stability', null, InputOption::VALUE_REQUIRED, $this->language->lang('CLI_DESCRIPTION_UPDATE_CHECK_OPTION_STABILITY'))
+			->addOption('cache', 'c', InputOption::VALUE_NONE, $this->language->lang('CLI_DESCRIPTION_UPDATE_CHECK_OPTION_CACHE'))
+		;
+	}
+
+	/**
+	* Executes the command.
+	*
+	* Checks if an update is available.
+	* If at least one is available, a message is printed and if verbose mode is set the list of possible updates is printed.
+	* If their is none, nothing is printed unless verbose mode is set.
+	*
+	* @param InputInterface $input Input stream, used to get the options.
+	* @param OutputInterface $output Output stream, used to print messages.
+	* @return int 0 if the board is up to date, 1 if it is not and 2 if an error occured.
+	* @throws \RuntimeException
+	*/
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$io = new SymfonyStyle($input, $output);
+
+		$recheck = true;
+		if ($input->getOption('cache'))
+		{
+			$recheck = false;
+		}
+
+		$stability = null;
+		if ($input->getOption('stability'))
+		{
+			$stability = $input->getOption('stability');
+			if (!($stability == 'stable') && !($stability == 'unstable'))
+			{
+				$io->error($this->language->lang('CLI_ERROR_INVALID_STABILITY', $stability));
+				return 3;
+			}
+		}
+
+		$ext_name = $input->getArgument('ext-name');
+		if ($ext_name != null)
+		{
+			if ($ext_name == 'all')
+			{
+				return $this->check_all_ext($io, $stability, $recheck);
+			}
+			else
+			{
+				return $this->check_ext($input, $io, $stability, $recheck, $ext_name);
+			}
+		}
+		else
+		{
+			return $this->check_core($input, $io, $stability, $recheck);
+		}
+	}
+
+	/**
+	 * Check if a given extension is up to date
+	 *
+	 * @param InputInterface	$input		Input stream, used to get the options.
+	 * @param SymfonyStyle		$io			IO handler, for formatted and unified IO
+	 * @param string			$stability	Force a given stability
+	 * @param bool				$recheck	Disallow the use of the cache
+	 * @param string			$ext_name	The extension name
+	 * @return int
+	 */
+	protected function check_ext(InputInterface $input, SymfonyStyle $io, $stability, $recheck, $ext_name)
+	{
+		try
+		{
+			$ext_manager = $this->phpbb_container->get('ext.manager');
+			$md_manager = $ext_manager->create_extension_metadata_manager($ext_name, null);
+			$updates_available = $ext_manager->version_check($md_manager, $recheck, false, $stability);
+
+			$metadata = $md_manager->get_metadata('all');
+			if ($input->getOption('verbose'))
+			{
+				$io->title($md_manager->get_metadata('display-name'));
+
+				$io->note($this->language->lang('CURRENT_VERSION') . $this->language->lang('COLON') . ' ' . $metadata['version']);
+			}
+
+			if (!empty($updates_available))
+			{
+				if ($input->getOption('verbose'))
+				{
+					$io->caution($this->language->lang('NOT_UP_TO_DATE', $metadata['name']));
+
+					$this->display_versions($io, $updates_available);
+				}
+
+				return 1;
+			}
+			else
+			{
+				if ($input->getOption('verbose'))
+				{
+					$io->success($this->language->lang('UPDATE_NOT_NEEDED'));
+				}
+
+				return 0;
+			}
+		}
+		catch (\RuntimeException $e)
+		{
+			$io->error($this->language->lang('EXTENSION_NOT_INSTALLED', $ext_name));
+
+			return 1;
+		}
+	}
+
+	/**
+	 * Check if the core is up to date
+	 *
+	 * @param InputInterface	$input		Input stream, used to get the options.
+	 * @param SymfonyStyle		$io			IO handler, for formatted and unified IO
+	 * @param string			$stability	Force a given stability
+	 * @param bool				$recheck	Disallow the use of the cache
+	 * @return int
+	 */
+	protected function check_core(InputInterface $input, SymfonyStyle $io, $stability, $recheck)
+	{
+		$version_helper = $this->phpbb_container->get('version_helper');
+		$version_helper->force_stability($stability);
+
+		$updates_available = $version_helper->get_suggested_updates($recheck);
+
+		if ($input->getOption('verbose'))
+		{
+			$io->title('phpBB core');
+
+			$io->note( $this->language->lang('CURRENT_VERSION') . $this->language->lang('COLON') . ' ' . $this->config['version']);
+		}
+
+		if (!empty($updates_available))
+		{
+			$io->caution($this->language->lang('UPDATE_NEEDED'));
+
+			if ($input->getOption('verbose'))
+			{
+				$this->display_versions($io, $updates_available);
+			}
+
+			return 1;
+		}
+		else
+		{
+			if ($input->getOption('verbose'))
+			{
+				$io->success($this->language->lang('UPDATE_NOT_NEEDED'));
+			}
+
+			return 0;
+		}
+	}
+
+	/**
+	* Check if all the available extensions are up to date
+	*
+	* @param SymfonyStyle	$io			IO handler, for formatted and unified IO
+	* @param bool			$recheck	Disallow the use of the cache
+	* @return int
+	*/
+	protected function check_all_ext(SymfonyStyle $io, $stability, $recheck)
+	{
+		/** @var \phpbb\extension\manager $ext_manager */
+		$ext_manager = $this->phpbb_container->get('ext.manager');
+
+		$rows = [];
+
+		foreach ($ext_manager->all_available() as $ext_name => $ext_path)
+		{
+			$row = [];
+			$row[] = sprintf("<info>%s</info>", $ext_name);
+			$md_manager = $ext_manager->create_extension_metadata_manager($ext_name);
+			try
+			{
+				$metadata = $md_manager->get_metadata('all');
+				if (isset($metadata['extra']['version-check']))
+				{
+					try {
+						$updates_available = $ext_manager->version_check($md_manager, $recheck, false, $stability);
+						if (!empty($updates_available))
+						{
+							$versions = array_map(function($entry)
+							{
+								return $entry['current'];
+							}, $updates_available);
+
+							$row[] = sprintf("<comment>%s</comment>", $metadata['version']);
+							$row[] = implode(', ', $versions);
+						}
+						else
+						{
+							$row[] = sprintf("<info>%s</info>", $metadata['version']);
+							$row[] = '';
+						}
+					} catch (\RuntimeException $e) {
+						$row[] = $metadata['version'];
+						$row[] = '';
+					}
+				}
+				else
+				{
+					$row[] = $metadata['version'];
+					$row[] = '';
+				}
+			}
+			catch (exception_interface $e)
+			{
+				$exception_message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
+				$row[] = '<error>' . $exception_message . '</error>';
+			}
+			catch (\RuntimeException $e)
+			{
+				$row[] = '<error>' . $e->getMessage() . '</error>';
+			}
+
+			$rows[] = $row;
+		}
+
+		$io->table([
+			$this->language->lang('EXTENSION_NAME'),
+			$this->language->lang('CURRENT_VERSION'),
+			$this->language->lang('LATEST_VERSION'),
+		], $rows);
+
+		return 0;
+	}
+
+	/**
+	* Display the details of the available updates
+	*
+	* @param SymfonyStyle	$io					IO handler, for formatted and unified IO
+	* @param array			$updates_available	The list of the available updates
+	*/
+	protected function display_versions(SymfonyStyle $io, $updates_available)
+	{
+		$io->section($this->language->lang('UPDATES_AVAILABLE'));
+
+		$rows = [];
+		foreach ($updates_available as $version_data)
+		{
+			$row = ['', '', ''];
+			$row[0] = $version_data['current'];
+
+			if (isset($version_data['announcement']))
+			{
+				$row[1] = $version_data['announcement'];
+			}
+
+			if (isset($version_data['download']))
+			{
+				$row[2] = $version_data['download'];
+			}
+
+			$rows[] = $row;
+		}
+
+		$io->table([
+			$this->language->lang('VERSION'),
+			$this->language->lang('ANNOUNCEMENT_TOPIC'),
+		    $this->language->lang('DOWNLOAD_LATEST'),
+		], $rows);
+	}
+}
--- /dev/null
+++ b/phpbb/console/command/user/activate.php
@@ -0,0 +1,218 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\console\command\user;
+
+use phpbb\config\config;
+use phpbb\console\command\command;
+use phpbb\db\driver\driver_interface;
+use phpbb\language\language;
+use phpbb\log\log_interface;
+use phpbb\notification\manager;
+use phpbb\user;
+use phpbb\user_loader;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+class activate extends command
+{
+	/** @var driver_interface */
+	protected $db;
+
+	/** @var config */
+	protected $config;
+
+	/** @var language */
+	protected $language;
+
+	/** @var log_interface */
+	protected $log;
+
+	/** @var manager */
+	protected $notifications;
+
+	/** @var user_loader */
+	protected $user_loader;
+
+	/**
+	 * phpBB root path
+	 *
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * PHP extension.
+	 *
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * Construct method
+	 *
+	 * @param user             $user
+	 * @param driver_interface $db
+	 * @param config           $config
+	 * @param language         $language
+	 * @param log_interface    $log
+	 * @param manager          $notifications
+	 * @param user_loader      $user_loader
+	 * @param string           $phpbb_root_path
+	 * @param string           $php_ext
+	 */
+	public function __construct(user $user, driver_interface $db, config $config, language $language, log_interface $log, manager $notifications, user_loader $user_loader, $phpbb_root_path, $php_ext)
+	{
+		$this->db = $db;
+		$this->config = $config;
+		$this->language = $language;
+		$this->log = $log;
+		$this->notifications = $notifications;
+		$this->user_loader = $user_loader;
+		$this->phpbb_root_path = $phpbb_root_path;
+		$this->php_ext = $php_ext;
+
+		$this->language->add_lang('acp/users');
+		parent::__construct($user);
+	}
+
+	/**
+	 * Sets the command name and description
+	 *
+	 * @return null
+	 */
+	protected function configure()
+	{
+		$this
+			->setName('user:activate')
+			->setDescription($this->language->lang('CLI_DESCRIPTION_USER_ACTIVATE'))
+			->setHelp($this->language->lang('CLI_HELP_USER_ACTIVATE'))
+			->addArgument(
+				'username',
+				InputArgument::REQUIRED,
+				$this->language->lang('CLI_DESCRIPTION_USER_ACTIVATE_USERNAME')
+			)
+			->addOption(
+				'deactivate',
+				'd',
+				InputOption::VALUE_NONE,
+				$this->language->lang('CLI_DESCRIPTION_USER_ACTIVATE_DEACTIVATE')
+			)
+			->addOption(
+				'send-email',
+				null,
+				InputOption::VALUE_NONE,
+				$this->language->lang('CLI_DESCRIPTION_USER_ADD_OPTION_NOTIFY')
+			)
+		;
+	}
+
+	/**
+	 * Executes the command user:activate
+	 *
+	 * Activate (or deactivate) a user account
+	 *
+	 * @param InputInterface  $input  The input stream used to get the options
+	 * @param OutputInterface $output The output stream, used to print messages
+	 *
+	 * @return int 0 if all is well, 1 if any errors occurred
+	 */
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$io = new SymfonyStyle($input, $output);
+
+		$name = $input->getArgument('username');
+		$mode = ($input->getOption('deactivate')) ? 'deactivate' : 'activate';
+
+		$user_id  = $this->user_loader->load_user_by_username($name);
+		$user_row = $this->user_loader->get_user($user_id);
+
+		if ($user_row['user_id'] == ANONYMOUS)
+		{
+			$io->error($this->language->lang('NO_USER'));
+			return 1;
+		}
+
+		// Check if the user is already active (or inactive)
+		if ($mode == 'activate' && $user_row['user_type'] != USER_INACTIVE)
+		{
+			$io->error($this->language->lang('CLI_DESCRIPTION_USER_ACTIVATE_ACTIVE'));
+			return 1;
+		}
+		else if ($mode == 'deactivate' && $user_row['user_type'] == USER_INACTIVE)
+		{
+			$io->error($this->language->lang('CLI_DESCRIPTION_USER_ACTIVATE_INACTIVE'));
+			return 1;
+		}
+
+		// Activate the user account
+		if (!function_exists('user_active_flip'))
+		{
+			require($this->phpbb_root_path . 'includes/functions_user.' . $this->php_ext);
+		}
+
+		user_active_flip($mode, $user_row['user_id']);
+
+		// Notify the user upon activation
+		if ($mode == 'activate' && $this->config['require_activation'] == USER_ACTIVATION_ADMIN)
+		{
+			$this->send_notification($user_row, $input);
+		}
+
+		// Log and display the result
+		$msg = ($mode == 'activate') ? 'USER_ADMIN_ACTIVATED' : 'USER_ADMIN_DEACTIVED';
+		$log = ($mode == 'activate') ? 'LOG_USER_ACTIVE' : 'LOG_USER_INACTIVE';
+
+		$this->log->add('admin', ANONYMOUS, '', $log, false, array($user_row['username']));
+		$this->log->add('user', ANONYMOUS, '', $log . '_USER', false, array(
+			'reportee_id' => $user_row['user_id']
+		));
+
+		$io->success($this->language->lang($msg));
+
+		return 0;
+	}
+
+	/**
+	 * Send account activation notification to user
+	 *
+	 * @param array           $user_row The user data array
+	 * @param InputInterface  $input    The input stream used to get the options
+	 * @return null
+	 */
+	protected function send_notification($user_row, InputInterface $input)
+	{
+		$this->notifications->delete_notifications('notification.type.admin_activate_user', $user_row['user_id']);
+
+		if ($input->getOption('send-email'))
+		{
+			if (!class_exists('messenger'))
+			{
+				require($this->phpbb_root_path . 'includes/functions_messenger.' . $this->php_ext);
+			}
+
+			$messenger = new \messenger(false);
+			$messenger->template('admin_welcome_activated', $user_row['user_lang']);
+			$messenger->set_addresses($user_row);
+			$messenger->anti_abuse_headers($this->config, $this->user);
+			$messenger->assign_vars(array(
+					'USERNAME'	=> htmlspecialchars_decode($user_row['username']))
+			);
+
+			$messenger->send(NOTIFY_EMAIL);
+		}
+	}
+}
--- /dev/null
+++ b/phpbb/console/command/user/add.php
@@ -0,0 +1,334 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\console\command\user;
+
+use phpbb\config\config;
+use phpbb\console\command\command;
+use phpbb\db\driver\driver_interface;
+use phpbb\exception\runtime_exception;
+use phpbb\language\language;
+use phpbb\passwords\manager;
+use phpbb\user;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\Question;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+class add extends command
+{
+	/** @var array Array of interactively acquired options */
+	protected $data;
+
+	/** @var driver_interface */
+	protected $db;
+
+	/** @var config */
+	protected $config;
+
+	/** @var language */
+	protected $language;
+
+	/** @var manager */
+	protected $password_manager;
+
+	/**
+	 * phpBB root path
+	 *
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * PHP extension.
+	 *
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * Construct method
+	 *
+	 * @param user             $user
+	 * @param driver_interface $db
+	 * @param config           $config
+	 * @param language         $language
+	 * @param manager          $password_manager
+	 * @param string           $phpbb_root_path
+	 * @param string           $php_ext
+	 */
+	public function __construct(user $user, driver_interface $db, config $config, language $language, manager $password_manager, $phpbb_root_path, $php_ext)
+	{
+		$this->db = $db;
+		$this->config = $config;
+		$this->language = $language;
+		$this->password_manager = $password_manager;
+		$this->phpbb_root_path = $phpbb_root_path;
+		$this->php_ext = $php_ext;
+
+		$this->language->add_lang('ucp');
+		parent::__construct($user);
+	}
+
+	/**
+	 * Sets the command name and description
+	 *
+	 * @return null
+	 */
+	protected function configure()
+	{
+		$this
+			->setName('user:add')
+			->setDescription($this->language->lang('CLI_DESCRIPTION_USER_ADD'))
+			->setHelp($this->language->lang('CLI_HELP_USER_ADD'))
+			->addOption(
+				'username',
+				'U',
+				InputOption::VALUE_REQUIRED,
+				$this->language->lang('CLI_DESCRIPTION_USER_ADD_OPTION_USERNAME')
+			)
+			->addOption(
+				'password',
+				'P',
+				InputOption::VALUE_REQUIRED,
+				$this->language->lang('CLI_DESCRIPTION_USER_ADD_OPTION_PASSWORD')
+			)
+			->addOption(
+				'email',
+				'E',
+				InputOption::VALUE_REQUIRED,
+				$this->language->lang('CLI_DESCRIPTION_USER_ADD_OPTION_EMAIL')
+			)
+			->addOption(
+				'send-email',
+				null,
+				InputOption::VALUE_NONE,
+				$this->language->lang('CLI_DESCRIPTION_USER_ADD_OPTION_NOTIFY')
+			)
+		;
+	}
+
+	/**
+	 * Executes the command user:add
+	 *
+	 * Adds a new user to the database. If options are not provided, it will ask for the username, password and email.
+	 * User is added to the registered user group. Language and timezone default to $config settings.
+	 *
+	 * @param InputInterface  $input  The input stream used to get the options
+	 * @param OutputInterface $output The output stream, used to print messages
+	 *
+	 * @return int 0 if all is well, 1 if any errors occurred
+	 */
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$io = new SymfonyStyle($input, $output);
+
+		try
+		{
+			$this->validate_user_data();
+			$group_id = $this->get_group_id();
+		}
+		catch (runtime_exception $e)
+		{
+			$io->error($e->getMessage());
+			return 1;
+		}
+
+		$user_row = array(
+			'username'      => $this->data['username'],
+			'user_password' => $this->password_manager->hash($this->data['new_password']),
+			'user_email'    => $this->data['email'],
+			'group_id'      => $group_id,
+			'user_timezone' => $this->config['board_timezone'],
+			'user_lang'     => $this->config['default_lang'],
+			'user_type'     => USER_NORMAL,
+			'user_regdate'  => time(),
+		);
+
+		$user_id = (int) user_add($user_row);
+
+		if (!$user_id)
+		{
+			$io->error($this->language->lang('AUTH_NO_PROFILE_CREATED'));
+			return 1;
+		}
+
+		if ($input->getOption('send-email') && $this->config['email_enable'])
+		{
+			$this->send_activation_email($user_id);
+		}
+
+		$io->success($this->language->lang('CLI_USER_ADD_SUCCESS', $this->data['username']));
+
+		return 0;
+	}
+
+	/**
+	 * Interacts with the user.
+	 *
+	 * @param InputInterface  $input  An InputInterface instance
+	 * @param OutputInterface $output An OutputInterface instance
+	 */
+	protected function interact(InputInterface $input, OutputInterface $output)
+	{
+		$helper = $this->getHelper('question');
+
+		$this->data = array(
+			'username'     => $input->getOption('username'),
+			'new_password' => $input->getOption('password'),
+			'email'        => $input->getOption('email'),
+		);
+
+		if (!$this->data['username'])
+		{
+			$question = new Question($this->ask_user('USERNAME'));
+			$this->data['username'] = $helper->ask($input, $output, $question);
+		}
+
+		if (!$this->data['new_password'])
+		{
+			$question = new Question($this->ask_user('PASSWORD'));
+			$question->setValidator(function ($value) use ($helper, $input, $output) {
+				$question = new Question($this->ask_user('CONFIRM_PASSWORD'));
+				$question->setHidden(true);
+				if ($helper->ask($input, $output, $question) != $value)
+				{
+					throw new runtime_exception($this->language->lang('NEW_PASSWORD_ERROR'));
+				}
+				return $value;
+			});
+			$question->setHidden(true);
+			$question->setMaxAttempts(5);
+
+			$this->data['new_password'] = $helper->ask($input, $output, $question);
+		}
+
+		if (!$this->data['email'])
+		{
+			$question = new Question($this->ask_user('EMAIL_ADDRESS'));
+			$this->data['email'] = $helper->ask($input, $output, $question);
+		}
+	}
+
+	/**
+	 * Validate the submitted user data
+	 *
+	 * @throws runtime_exception if any data fails validation
+	 * @return null
+	 */
+	protected function validate_user_data()
+	{
+		if (!function_exists('validate_data'))
+		{
+			require($this->phpbb_root_path . 'includes/functions_user.' . $this->php_ext);
+		}
+
+		$error = validate_data($this->data, array(
+			'username'     => array(
+				array('string', false, $this->config['min_name_chars'], $this->config['max_name_chars']),
+				array('username', '')),
+			'new_password' => array(
+				array('string', false, $this->config['min_pass_chars'], $this->config['max_pass_chars']),
+				array('password')),
+			'email'        => array(
+				array('string', false, 6, 60),
+				array('user_email')),
+		));
+
+		if ($error)
+		{
+			throw new runtime_exception(implode("\n", array_map(array($this->language, 'lang'), $error)));
+		}
+	}
+
+	/**
+	 * Get the group id
+	 *
+	 * Go and find in the database the group_id corresponding to 'REGISTERED'
+	 *
+	 * @throws runtime_exception if the group id does not exist in database.
+	 * @return null
+	 */
+	protected function get_group_id()
+	{
+		$sql = 'SELECT group_id
+			FROM ' . GROUPS_TABLE . "
+			WHERE group_name = '" . $this->db->sql_escape('REGISTERED') . "'
+				AND group_type = " . GROUP_SPECIAL;
+		$result = $this->db->sql_query($sql);
+		$row = $this->db->sql_fetchrow($result);
+		$this->db->sql_freeresult($result);
+
+		if (!$row || !$row['group_id'])
+		{
+			throw new runtime_exception($this->language->lang('NO_GROUP'));
+		}
+
+		return $row['group_id'];
+	}
+
+	/**
+	 * Send account activation email
+	 *
+	 * @param int   $user_id The new user's id
+	 * @return null
+	 */
+	protected function send_activation_email($user_id)
+	{
+		switch ($this->config['require_activation'])
+		{
+			case USER_ACTIVATION_SELF:
+				$email_template = 'user_welcome_inactive';
+				$user_actkey = gen_rand_string(mt_rand(6, 10));
+			break;
+			case USER_ACTIVATION_ADMIN:
+				$email_template = 'admin_welcome_inactive';
+				$user_actkey = gen_rand_string(mt_rand(6, 10));
+			break;
+			default:
+				$email_template = 'user_welcome';
+				$user_actkey = '';
+			break;
+		}
+
+		if (!class_exists('messenger'))
+		{
+			require($this->phpbb_root_path . 'includes/functions_messenger.' . $this->php_ext);
+		}
+
+		$messenger = new \messenger(false);
+		$messenger->template($email_template, $this->user->lang_name);
+		$messenger->to($this->data['email'], $this->data['username']);
+		$messenger->anti_abuse_headers($this->config, $this->user);
+		$messenger->assign_vars(array(
+			'WELCOME_MSG' => htmlspecialchars_decode($this->language->lang('WELCOME_SUBJECT', $this->config['sitename'])),
+			'USERNAME'    => htmlspecialchars_decode($this->data['username']),
+			'PASSWORD'    => htmlspecialchars_decode($this->data['new_password']),
+			'U_ACTIVATE'  => generate_board_url() . "/ucp.{$this->php_ext}?mode=activate&u=$user_id&k=$user_actkey")
+		);
+
+		$messenger->send(NOTIFY_EMAIL);
+	}
+
+	/**
+	 * Helper to translate questions to the user
+	 *
+	 * @param string $key The language key
+	 * @return string The language key translated with a colon and space appended
+	 */
+	protected function ask_user($key)
+	{
+		return $this->language->lang($key) . $this->language->lang('COLON') . ' ';
+	}
+}
--- /dev/null
+++ b/phpbb/console/command/user/delete.php
@@ -0,0 +1,170 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\console\command\user;
+
+use phpbb\console\command\command;
+use phpbb\db\driver\driver_interface;
+use phpbb\language\language;
+use phpbb\log\log_interface;
+use phpbb\user;
+use phpbb\user_loader;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\ConfirmationQuestion;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+class delete extends command
+{
+	/** @var driver_interface */
+	protected $db;
+
+	/** @var language */
+	protected $language;
+
+	/** @var log_interface */
+	protected $log;
+
+	/** @var user_loader */
+	protected $user_loader;
+
+	/**
+	 * phpBB root path
+	 *
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * PHP extension.
+	 *
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * Construct method
+	 *
+	 * @param user             $user
+	 * @param driver_interface $db
+	 * @param language         $language
+	 * @param log_interface    $log
+	 * @param user_loader      $user_loader
+	 * @param string           $phpbb_root_path
+	 * @param string           $php_ext
+	 */
+	public function __construct(user $user, driver_interface $db, language $language, log_interface $log, user_loader $user_loader, $phpbb_root_path, $php_ext)
+	{
+		$this->db = $db;
+		$this->language = $language;
+		$this->log = $log;
+		$this->user_loader = $user_loader;
+		$this->phpbb_root_path = $phpbb_root_path;
+		$this->php_ext = $php_ext;
+
+		$this->language->add_lang('acp/users');
+		parent::__construct($user);
+	}
+
+	/**
+	 * Sets the command name and description
+	 *
+	 * @return null
+	 */
+	protected function configure()
+	{
+		$this
+			->setName('user:delete')
+			->setDescription($this->language->lang('CLI_DESCRIPTION_USER_DELETE'))
+			->addArgument(
+				'username',
+				InputArgument::REQUIRED,
+				$this->language->lang('CLI_DESCRIPTION_USER_DELETE_USERNAME')
+			)
+			->addOption(
+				'delete-posts',
+				null,
+				InputOption::VALUE_NONE,
+				$this->language->lang('CLI_DESCRIPTION_USER_DELETE_OPTION_POSTS')
+			)
+		;
+	}
+
+	/**
+	 * Executes the command user:delete
+	 *
+	 * Deletes a user from the database. An option to delete the user's posts
+	 * is available, by default posts will be retained.
+	 *
+	 * @param InputInterface  $input  The input stream used to get the options
+	 * @param OutputInterface $output The output stream, used to print messages
+	 *
+	 * @return int 0 if all is well, 1 if any errors occurred
+	 */
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$name = $input->getArgument('username');
+		$mode = ($input->getOption('delete-posts')) ? 'remove' : 'retain';
+
+		if ($name)
+		{
+			$io = new SymfonyStyle($input, $output);
+
+			$user_id  = $this->user_loader->load_user_by_username($name);
+			$user_row = $this->user_loader->get_user($user_id);
+
+			if ($user_row['user_id'] == ANONYMOUS)
+			{
+				$io->error($this->language->lang('NO_USER'));
+				return 1;
+			}
+
+			if (!function_exists('user_delete'))
+			{
+				require($this->phpbb_root_path . 'includes/functions_user.' . $this->php_ext);
+			}
+
+			user_delete($mode, $user_row['user_id'], $user_row['username']);
+
+			$this->log->add('admin', ANONYMOUS, '', 'LOG_USER_DELETED', false, array($user_row['username']));
+
+			$io->success($this->language->lang('USER_DELETED'));
+		}
+
+		return 0;
+	}
+
+	/**
+	 * Interacts with the user.
+	 * Confirm they really want to delete the account...last chance!
+	 *
+	 * @param InputInterface  $input  An InputInterface instance
+	 * @param OutputInterface $output An OutputInterface instance
+	 */
+	protected function interact(InputInterface $input, OutputInterface $output)
+	{
+		$helper = $this->getHelper('question');
+
+		$question = new ConfirmationQuestion(
+			$this->language->lang('CLI_USER_DELETE_CONFIRM', $input->getArgument('username')),
+			false
+		);
+
+		if (!$helper->ask($input, $output, $question))
+		{
+			$input->setArgument('username', false);
+		}
+	}
+}
--- /dev/null
+++ b/phpbb/console/command/user/reclean.php
@@ -0,0 +1,158 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\console\command\user;
+
+use phpbb\console\command\command;
+use phpbb\db\driver\driver_interface;
+use phpbb\language\language;
+use phpbb\user;
+use Symfony\Component\Console\Helper\ProgressBar;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+class reclean extends command
+{
+	/** @var driver_interface */
+	protected $db;
+
+	/** @var language */
+	protected $language;
+
+	/** @var int A count of the number of re-cleaned user names */
+	protected $processed;
+
+	/** @var ProgressBar */
+	protected $progress;
+
+	/**
+	 * Construct method
+	 *
+	 * @param user             $user
+	 * @param driver_interface $db
+	 * @param language         $language
+	 */
+	public function __construct(user $user, driver_interface $db, language $language)
+	{
+		$this->db = $db;
+		$this->language = $language;
+
+		parent::__construct($user);
+	}
+
+	/**
+	 * Sets the command name and description
+	 *
+	 * @return null
+	 */
+	protected function configure()
+	{
+		$this
+			->setName('user:reclean')
+			->setDescription($this->language->lang('CLI_DESCRIPTION_USER_RECLEAN'))
+			->setHelp($this->language->lang('CLI_HELP_USER_RECLEAN'))
+		;
+	}
+
+	/**
+	 * Executes the command user:reclean
+	 *
+	 * Cleans user names that are unclean.
+	 *
+	 * @param InputInterface  $input  The input stream used to get the options
+	 * @param OutputInterface $output The output stream, used to print messages
+	 *
+	 * @return int 0 if all is well, 1 if any errors occurred
+	 */
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$io = new SymfonyStyle($input, $output);
+
+		$io->section($this->language->lang('CLI_USER_RECLEAN_START'));
+
+		$this->processed = 0;
+
+		$this->progress = $this->create_progress_bar($this->get_count(), $io, $output);
+		$this->progress->setMessage($this->language->lang('CLI_USER_RECLEAN_START'));
+		$this->progress->start();
+
+		$stage = 0;
+		while ($stage !== true)
+		{
+			$stage = $this->reclean_usernames($stage);
+		}
+
+		$this->progress->finish();
+
+		$io->newLine(2);
+		$io->success($this->language->lang('CLI_USER_RECLEAN_DONE', $this->processed));
+
+		return 0;
+	}
+
+	/**
+	 * Re-clean user names
+	 * Only user names that are unclean will be re-cleaned
+	 *
+	 * @param int $start An offset index
+	 * @return bool|int Return the next offset index or true if all records have been processed.
+	 */
+	protected function reclean_usernames($start = 0)
+	{
+		$limit = 500;
+		$i = 0;
+
+		$this->db->sql_transaction('begin');
+
+		$sql = 'SELECT user_id, username, username_clean FROM ' . USERS_TABLE;
+		$result = $this->db->sql_query_limit($sql, $limit, $start);
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$i++;
+			$username_clean = $this->db->sql_escape(utf8_clean_string($row['username']));
+
+			if ($username_clean != $row['username_clean'])
+			{
+				$sql = 'UPDATE ' . USERS_TABLE . "
+					SET username_clean = '$username_clean'
+					WHERE user_id = {$row['user_id']}";
+				$this->db->sql_query($sql);
+
+				$this->processed++;
+			}
+
+			$this->progress->advance();
+		}
+		$this->db->sql_freeresult($result);
+
+		$this->db->sql_transaction('commit');
+
+		return ($i < $limit) ? true : $start + $i;
+	}
+
+	/**
+	 * Get the count of users in the database
+	 *
+	 * @return int
+	 */
+	protected function get_count()
+	{
+		$sql = 'SELECT COUNT(user_id) AS count FROM ' . USERS_TABLE;
+		$result = $this->db->sql_query($sql);
+		$count = (int) $this->db->sql_fetchfield('count');
+		$this->db->sql_freeresult($result);
+
+		return $count;
+	}
+}
--- /dev/null
+++ b/phpbb/console/exception_subscriber.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\console;
+
+use phpbb\exception\exception_interface;
+use Symfony\Component\Console\ConsoleEvents;
+use Symfony\Component\Console\Event\ConsoleExceptionEvent;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+class exception_subscriber implements EventSubscriberInterface
+{
+	/**
+	 * @var \phpbb\language\language
+	 */
+	protected $language;
+
+	/**
+	 * Construct method
+	 *
+	 * @param \phpbb\language\language $language Language object
+	 * @param bool $debug Debug mode
+	 */
+	public function __construct(\phpbb\language\language $language, $debug = false)
+	{
+		$this->language = $language;
+		$this->debug = $debug;
+	}
+
+	/**
+	 * This listener is run when the ConsoleEvents::EXCEPTION event is triggered.
+	 * It translate the exception message. If din debug mode the original exception is embedded.
+	 *
+	 * @param ConsoleExceptionEvent $event
+	 */
+	public function on_exception(ConsoleExceptionEvent $event)
+	{
+		$original_exception = $event->getException();
+
+		if ($original_exception instanceof exception_interface)
+		{
+			$parameters = array_merge(array($original_exception->getMessage()), $original_exception->get_parameters());
+			$message = call_user_func_array(array($this->language, 'lang'), $parameters);
+
+			if ($this->debug)
+			{
+				$exception = new \RuntimeException($message , $original_exception->getCode(), $original_exception);
+			}
+			else
+			{
+				$exception = new \RuntimeException($message , $original_exception->getCode());
+			}
+
+			$event->setException($exception);
+		}
+	}
+
+	static public function getSubscribedEvents()
+	{
+		return array(
+			ConsoleEvents::EXCEPTION => 'on_exception',
+		);
+	}
+}
--- a/phpbb/controller/exception.php
+++ b/phpbb/controller/exception.php
@@ -16,6 +16,6 @@ namespace phpbb\controller;
 /**
 * Controller exception class
 */
-class exception extends \RuntimeException
+class exception extends \phpbb\exception\runtime_exception
 {
 }
--- a/phpbb/controller/helper.php
+++ b/phpbb/controller/helper.php
@@ -15,9 +15,7 @@ namespace phpbb\controller;
 
 use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\Routing\Generator\UrlGenerator;
 use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
-use Symfony\Component\Routing\RequestContext;
 
 /**
 * Controller helper class, contains methods that do things for controllers
@@ -49,49 +47,28 @@ class helper
 	protected $request;
 
 	/**
-	* @var \phpbb\filesystem The filesystem object
-	*/
-	protected $filesystem;
-
-	/**
-	* phpBB root path
-	* @var string
-	*/
-	protected $phpbb_root_path;
-
-	/**
-	* PHP file extension
-	* @var string
-	*/
-	protected $php_ext;
+	 * @var \phpbb\routing\helper
+	 */
+	protected $routing_helper;
 
 	/**
-	* Constructor
-	*
-	* @param \phpbb\template\template $template Template object
-	* @param \phpbb\user $user User object
-	* @param \phpbb\config\config $config Config object
+	 * Constructor
 	 *
-	 * @param \phpbb\controller\provider $provider Path provider
-	* @param \phpbb\extension\manager $manager Extension manager object
-	* @param \phpbb\symfony_request $symfony_request Symfony Request object
-	* @param \phpbb\request\request_interface $request phpBB request object
-	* @param \phpbb\filesystem $filesystem The filesystem object
-	* @param string $phpbb_root_path phpBB root path
-	* @param string $php_ext PHP file extension
-	*/
-	public function __construct(\phpbb\template\template $template, \phpbb\user $user, \phpbb\config\config $config, \phpbb\controller\provider $provider, \phpbb\extension\manager $manager, \phpbb\symfony_request $symfony_request, \phpbb\request\request_interface $request, \phpbb\filesystem $filesystem, $phpbb_root_path, $php_ext)
+	 * @param \phpbb\template\template $template Template object
+	 * @param \phpbb\user $user User object
+	 * @param \phpbb\config\config $config Config object
+	 * @param \phpbb\symfony_request $symfony_request Symfony Request object
+	 * @param \phpbb\request\request_interface $request phpBB request object
+	 * @param \phpbb\routing\helper $routing_helper Helper to generate the routes
+	 */
+	public function __construct(\phpbb\template\template $template, \phpbb\user $user, \phpbb\config\config $config, \phpbb\symfony_request $symfony_request, \phpbb\request\request_interface $request, \phpbb\routing\helper $routing_helper)
 	{
 		$this->template = $template;
 		$this->user = $user;
 		$this->config = $config;
 		$this->symfony_request = $symfony_request;
 		$this->request = $request;
-		$this->filesystem = $filesystem;
-		$this->phpbb_root_path = $phpbb_root_path;
-		$this->php_ext = $php_ext;
-		$provider->find_routing_files($manager->get_finder());
-		$this->route_collection = $provider->find($phpbb_root_path)->get_routes();
+		$this->routing_helper = $routing_helper;
 	}
 
 	/**
@@ -134,70 +111,7 @@ class helper
 	*/
 	public function route($route, array $params = array(), $is_amp = true, $session_id = false, $reference_type = UrlGeneratorInterface::ABSOLUTE_PATH)
 	{
-		$anchor = '';
-		if (isset($params['#']))
-		{
-			$anchor = '#' . $params['#'];
-			unset($params['#']);
-		}
-
-		$context = new RequestContext();
-		$context->fromRequest($this->symfony_request);
-
-		if ($this->config['force_server_vars'])
-		{
-			$context->setHost($this->config['server_name']);
-			$context->setScheme(substr($this->config['server_protocol'], 0, -3));
-			$context->setHttpPort($this->config['server_port']);
-			$context->setHttpsPort($this->config['server_port']);
-			$context->setBaseUrl(rtrim($this->config['script_path'], '/'));
-		}
-
-		$script_name = $this->symfony_request->getScriptName();
-		$page_name = substr($script_name, -1, 1) == '/' ? '' : utf8_basename($script_name);
-
-		$base_url = $context->getBaseUrl();
-
-		// Append page name if base URL does not contain it
-		if (!empty($page_name) && strpos($base_url, '/' . $page_name) === false)
-		{
-			$base_url .= '/' . $page_name;
-		}
-
-		// If enable_mod_rewrite is false we need to replace the current front-end by app.php, otherwise we need to remove it.
-		$base_url = str_replace('/' . $page_name, empty($this->config['enable_mod_rewrite']) ? '/app.' . $this->php_ext : '', $base_url);
-
-		// We need to update the base url to move to the directory of the app.php file if the current script is not app.php
-		if ($page_name !== 'app.php' && !$this->config['force_server_vars'])
-		{
-			if (empty($this->config['enable_mod_rewrite']))
-			{
-				$base_url = str_replace('/app.' . $this->php_ext, '/' . $this->phpbb_root_path . 'app.' . $this->php_ext, $base_url);
-			}
-			else
-			{
-				$base_url .= preg_replace(get_preg_expression('path_remove_dot_trailing_slash'), '$2', $this->phpbb_root_path);
-			}
-		}
-
-		$base_url = $this->request->escape($this->filesystem->clean_path($base_url), true);
-
-		$context->setBaseUrl($base_url);
-
-		$url_generator = new UrlGenerator($this->route_collection, $context);
-		$route_url = $url_generator->generate($route, $params, $reference_type);
-
-		if ($is_amp)
-		{
-			$route_url = str_replace(array('&amp;', '&'), array('&', '&amp;'), $route_url);
-		}
-
-		if ($reference_type === UrlGeneratorInterface::RELATIVE_PATH && empty($this->config['enable_mod_rewrite']))
-		{
-			$route_url = 'app.' . $this->php_ext . '/' . $route_url;
-		}
-
-		return append_sid($route_url . $anchor, false, $is_amp, $session_id, true);
+		return $this->routing_helper->route($route, $params, $is_amp, $session_id, $reference_type);
 	}
 
 	/**
@@ -255,6 +169,20 @@ class helper
 		return $this->render('message_body.html', $message_title, $code);
 	}
 
+	/**
+	 * Assigns automatic refresh time meta tag in template
+	 *
+	 * @param	int		$time	time in seconds, when redirection should occur
+	 * @param	string	$url	the URL where the user should be redirected
+	 * @return	null
+	 */
+	public function assign_meta_refresh_var($time, $url)
+	{
+		$this->template->assign_vars(array(
+			'META' => '<meta http-equiv="refresh" content="' . $time . '; url=' . $url . '" />',
+		));
+	}
+
 	/**
 	* Return the current url
 	*
--- a/phpbb/controller/resolver.php
+++ b/phpbb/controller/resolver.php
@@ -22,12 +22,6 @@ use Symfony\Component\HttpFoundation\Request;
 */
 class resolver implements ControllerResolverInterface
 {
-	/**
-	* User object
-	* @var \phpbb\user
-	*/
-	protected $user;
-
 	/**
 	* ContainerInterface object
 	* @var ContainerInterface
@@ -55,14 +49,12 @@ class resolver implements ControllerResolverInterface
 	/**
 	* Construct method
 	*
-	* @param \phpbb\user $user User Object
 	* @param ContainerInterface $container ContainerInterface object
 	* @param string $phpbb_root_path Relative path to phpBB root
 	* @param \phpbb\template\template $template
 	*/
-	public function __construct(\phpbb\user $user, ContainerInterface $container, $phpbb_root_path, \phpbb\template\template $template = null)
+	public function __construct(ContainerInterface $container, $phpbb_root_path, \phpbb\template\template $template = null)
 	{
-		$this->user = $user;
 		$this->container = $container;
 		$this->template = $template;
 		$this->type_cast_helper = new \phpbb\request\type_cast_helper();
@@ -82,20 +74,20 @@ class resolver implements ControllerResolverInterface
 
 		if (!$controller)
 		{
-			throw new \phpbb\controller\exception($this->user->lang['CONTROLLER_NOT_SPECIFIED']);
+			throw new \phpbb\controller\exception('CONTROLLER_NOT_SPECIFIED');
 		}
 
 		// Require a method name along with the service name
 		if (stripos($controller, ':') === false)
 		{
-			throw new \phpbb\controller\exception($this->user->lang['CONTROLLER_METHOD_NOT_SPECIFIED']);
+			throw new \phpbb\controller\exception('CONTROLLER_METHOD_NOT_SPECIFIED');
 		}
 
 		list($service, $method) = explode(':', $controller);
 
 		if (!$this->container->has($service))
 		{
-			throw new \phpbb\controller\exception($this->user->lang('CONTROLLER_SERVICE_UNDEFINED', $service));
+			throw new \phpbb\controller\exception('CONTROLLER_SERVICE_UNDEFINED', array($service));
 		}
 
 		$controller_object = $this->container->get($service);
@@ -134,9 +126,21 @@ class resolver implements ControllerResolverInterface
 	*/
 	public function getArguments(Request $request, $controller)
 	{
-		// At this point, $controller contains the object and method name
-		list($object, $method) = $controller;
-		$mirror = new \ReflectionMethod($object, $method);
+		// At this point, $controller should be a callable
+		if (is_array($controller))
+		{
+			list($object, $method) = $controller;
+			$mirror = new \ReflectionMethod($object, $method);
+		}
+		else if (is_object($controller) && !$controller instanceof \Closure)
+		{
+			$mirror = new \ReflectionObject($controller);
+			$mirror = $mirror->getMethod('__invoke');
+		}
+		else
+		{
+			$mirror = new \ReflectionFunction($controller);
+		}
 
 		$arguments = array();
 		$parameters = $mirror->getParameters();
@@ -166,7 +170,7 @@ class resolver implements ControllerResolverInterface
 			}
 			else
 			{
-				throw new \phpbb\controller\exception($this->user->lang('CONTROLLER_ARGUMENT_VALUE_MISSING', $param->getPosition() + 1, get_class($object) . ':' . $method, $param->name));
+				throw new \phpbb\controller\exception('CONTROLLER_ARGUMENT_VALUE_MISSING', array($param->getPosition() + 1, get_class($object) . ':' . $method, $param->name));
 			}
 		}
 
--- a/phpbb/cron/task/core/prune_forum.php
+++ b/phpbb/cron/task/core/prune_forum.php
@@ -31,7 +31,7 @@ class prune_forum extends \phpbb\cron\task\base implements \phpbb\cron\task\para
 	* If $forum_data is given, it is assumed to contain necessary information
 	* about a single forum that is to be pruned.
 	*
-	* If $forum_data is not given, forum id will be retrieved via request_var
+	* If $forum_data is not given, forum id will be retrieved via $request->variable()
 	* and a database query will be performed to load the necessary information
 	* about the forum.
 	*/
--- a/phpbb/cron/task/core/prune_shadow_topics.php
+++ b/phpbb/cron/task/core/prune_shadow_topics.php
@@ -33,7 +33,7 @@ class prune_shadow_topics extends \phpbb\cron\task\base implements \phpbb\cron\t
 	* If $forum_data is given, it is assumed to contain necessary information
 	* about a single forum that is to be pruned.
 	*
-	* If $forum_data is not given, forum id will be retrieved via request_var
+	* If $forum_data is not given, forum id will be retrieved via $request->variable()
 	* and a database query will be performed to load the necessary information
 	* about the forum.
 	*/
--- a/phpbb/cron/task/core/queue.php
+++ b/phpbb/cron/task/core/queue.php
@@ -20,20 +20,23 @@ class queue extends \phpbb\cron\task\base
 {
 	protected $phpbb_root_path;
 	protected $php_ext;
+	protected $cache_dir;
 	protected $config;
 
 	/**
-	* Constructor.
-	*
-	* @param string $phpbb_root_path The root path
-	* @param string $php_ext PHP file extension
-	* @param \phpbb\config\config $config The config
-	*/
-	public function __construct($phpbb_root_path, $php_ext, \phpbb\config\config $config)
+	 * Constructor.
+	 *
+	 * @param string $phpbb_root_path The root path
+	 * @param string $php_ext PHP file extension
+	 * @param \phpbb\config\config $config The config
+	 * @param string $cache_dir phpBB cache directory
+	 */
+	public function __construct($phpbb_root_path, $php_ext, \phpbb\config\config $config, $cache_dir)
 	{
 		$this->phpbb_root_path = $phpbb_root_path;
 		$this->php_ext = $php_ext;
 		$this->config = $config;
+		$this->cache_dir = $cache_dir;
 	}
 
 	/**
@@ -60,7 +63,7 @@ class queue extends \phpbb\cron\task\base
 	*/
 	public function is_runnable()
 	{
-		return file_exists($this->phpbb_root_path . 'cache/queue.' . $this->php_ext);
+		return file_exists($this->cache_dir . 'queue.' . $this->php_ext);
 	}
 
 	/**
--- a/phpbb/cron/task/core/tidy_plupload.php
+++ b/phpbb/cron/task/core/tidy_plupload.php
@@ -42,6 +42,12 @@ class tidy_plupload extends \phpbb\cron\task\base
 	*/
 	protected $config;
 
+	/** @var \phpbb\log\log_interface */
+	protected $log;
+
+	/** @var \phpbb\user */
+	protected $user;
+
 	/**
 	* Directory where plupload stores temporary files.
 	* @var string
@@ -53,11 +59,15 @@ class tidy_plupload extends \phpbb\cron\task\base
 	*
 	* @param string $phpbb_root_path The root path
 	* @param \phpbb\config\config $config The config
+	* @param \phpbb\log\log_interface $log Log
+	* @param \phpbb\user $user User object
 	*/
-	public function __construct($phpbb_root_path, \phpbb\config\config $config)
+	public function __construct($phpbb_root_path, \phpbb\config\config $config, \phpbb\log\log_interface $log, \phpbb\user $user)
 	{
 		$this->phpbb_root_path = $phpbb_root_path;
 		$this->config = $config;
+		$this->log = $log;
+		$this->user = $user;
 
 		$this->plupload_upload_path = $this->phpbb_root_path . $this->config['upload_path'] . '/plupload';
 	}
@@ -88,13 +98,11 @@ class tidy_plupload extends \phpbb\cron\task\base
 		}
 		catch (\UnexpectedValueException $e)
 		{
-			add_log(
-				'critical',
-				'LOG_PLUPLOAD_TIDY_FAILED',
+			$this->log->add('critical', $this->user->data['user_id'], $this->user->ip, 'LOG_PLUPLOAD_TIDY_FAILED', false, array(
 				$this->plupload_upload_path,
 				$e->getMessage(),
 				$e->getTraceAsString()
-			);
+			));
 		}
 
 		$this->config->set('plupload_last_gc', time(), true);
--- /dev/null
+++ b/phpbb/cron/task/text_reparser/reparser.php
@@ -0,0 +1,168 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\cron\task\text_reparser;
+
+/**
+ * Reparse text cron task
+ */
+class reparser extends \phpbb\cron\task\base
+{
+	const MIN = 1;
+	const SIZE = 100;
+
+	/**
+	 * @var \phpbb\config\config
+	 */
+	protected $config;
+
+	/**
+	 * @var \phpbb\config\db_text
+	 */
+	protected $config_text;
+
+	/**
+	 * @var \phpbb\lock\db
+	 */
+	protected $reparse_lock;
+
+	/**
+	 * @var \phpbb\textreparser\manager
+	 */
+	protected $reparser_manager;
+
+	/**
+	 * @var string
+	 */
+	protected $reparser_name;
+
+	/**
+	 * @var \phpbb\di\service_collection
+	 */
+	protected $reparsers;
+
+	/**
+	 * @var array
+	 */
+	protected $resume_data;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\config\config			$config
+	 * @param \phpbb\config\db_text			$config_text
+	 * @param \phpbb\lock\db				$reparse_lock
+	 * @param \phpbb\textreparser\manager	$reparser_manager
+	 * @param \phpbb\di\service_collection	$reparsers
+	 */
+	public function __construct(\phpbb\config\config $config, \phpbb\config\db_text $config_text, \phpbb\lock\db $reparse_lock, \phpbb\textreparser\manager $reparser_manager, \phpbb\di\service_collection $reparsers)
+	{
+		$this->config = $config;
+		$this->config_text = $config_text;
+		$this->reparse_lock = $reparse_lock;
+		$this->reparser_manager = $reparser_manager;
+		$this->reparsers = $reparsers;
+	}
+
+	/**
+	 * Sets the reparser for this cron task
+	 *
+	 * @param string	$reparser
+	 */
+	public function set_reparser($reparser)
+	{
+		$this->reparser_name = !isset($this->reparsers[$reparser]) ? $this->reparser_manager->find_reparser($reparser) : $reparser;
+
+		if ($this->resume_data === null)
+		{
+			$this->reparser_manager->get_resume_data($this->reparser_name);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function is_runnable()
+	{
+		if ($this->resume_data === null)
+		{
+			$this->reparser_manager->get_resume_data($this->reparser_name);
+		}
+
+		if (!isset($this->resume_data['range-max']) || $this->resume_data['range-max'] >= $this->resume_data['range-min'])
+		{
+			return true;
+		}
+
+		return false;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function should_run()
+	{
+		if (!empty($this->config['reparse_lock']))
+		{
+			$last_run = explode(' ', $this->config['reparse_lock']);
+
+			if ($last_run[0] + 3600 >= time())
+			{
+				return false;
+			}
+		}
+
+		if ($this->config[$this->reparser_name . '_cron_interval'])
+		{
+			return $this->config[$this->reparser_name . '_last_cron'] < time() - $this->config[$this->reparser_name . '_cron_interval'];
+		}
+
+		return false;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		if ($this->reparse_lock->acquire())
+		{
+			if ($this->resume_data === null)
+			{
+				$this->resume_data = $this->reparser_manager->get_resume_data($this->reparser_name);
+			}
+
+			/**
+			 * @var \phpbb\textreparser\reparser_interface $reparser
+			 */
+			$reparser = $this->reparsers[$this->reparser_name];
+
+			$min = isset($this->resume_data['range-min']) ? $this->resume_data['range-min'] : self::MIN;
+			$current = isset($this->resume_data['range-max']) ? $this->resume_data['range-max'] : $reparser->get_max_id();
+			$size = isset($this->resume_data['range-size']) ? $this->resume_data['range-size'] : self::SIZE;
+
+			if ($current >= $min)
+			{
+				$start = max($min, $current + 1 - $size);
+				$end = max($min, $current);
+
+				$reparser->reparse_range($start, $end);
+
+				$this->reparser_manager->update_resume_data($this->reparser_name, $min, $start - 1, $size);
+			}
+
+			$this->config->set($this->reparser_name . '_last_cron', time());
+			$this->reparse_lock->release();
+		}
+	}
+}
--- a/phpbb/db/driver/driver.php
+++ b/phpbb/db/driver/driver.php
@@ -66,6 +66,15 @@ abstract class driver implements driver_interface
 	*/
 	var $sql_server_version = false;
 
+	const LOGICAL_OP = 0;
+	const STATEMENTS = 1;
+	const LEFT_STMT = 0;
+	const COMPARE_OP = 1;
+	const RIGHT_STMT = 2;
+	const SUBQUERY_OP = 3;
+	const SUBQUERY_SELECT_TYPE = 4;
+	const SUBQUERY_BUILD = 5;
+
 	/**
 	* Constructor
 	*/
@@ -271,7 +280,7 @@ abstract class driver implements driver_interface
 			$query_id = $this->query_result;
 		}
 
-		if ($query_id !== false)
+		if ($query_id)
 		{
 			$result = array();
 			while ($row = $this->sql_fetchrow($query_id))
@@ -302,7 +311,7 @@ abstract class driver implements driver_interface
 			return $cache->sql_rowseek($rownum, $query_id);
 		}
 
-		if ($query_id === false)
+		if (!$query_id)
 		{
 			return false;
 		}
@@ -310,7 +319,7 @@ abstract class driver implements driver_interface
 		$this->sql_freeresult($query_id);
 		$query_id = $this->sql_query($this->last_query_text);
 
-		if ($query_id === false)
+		if (!$query_id)
 		{
 			return false;
 		}
@@ -339,7 +348,7 @@ abstract class driver implements driver_interface
 			$query_id = $this->query_result;
 		}
 
-		if ($query_id !== false)
+		if ($query_id)
 		{
 			if ($rownum !== false)
 			{
@@ -363,8 +372,8 @@ abstract class driver implements driver_interface
 	*/
 	function sql_like_expression($expression)
 	{
-		$expression = utf8_str_replace(array('_', '%'), array("\_", "\%"), $expression);
-		$expression = utf8_str_replace(array(chr(0) . "\_", chr(0) . "\%"), array('_', '%'), $expression);
+		$expression = str_replace(array('_', '%'), array("\_", "\%"), $expression);
+		$expression = str_replace(array(chr(0) . "\_", chr(0) . "\%"), array('_', '%'), $expression);
 
 		return $this->_sql_like_expression('LIKE \'' . $this->sql_escape($expression) . '\'');
 	}
@@ -374,8 +383,8 @@ abstract class driver implements driver_interface
 	*/
 	function sql_not_like_expression($expression)
 	{
-		$expression = utf8_str_replace(array('_', '%'), array("\_", "\%"), $expression);
-		$expression = utf8_str_replace(array(chr(0) . "\_", chr(0) . "\%"), array('_', '%'), $expression);
+		$expression = str_replace(array('_', '%'), array("\_", "\%"), $expression);
+		$expression = str_replace(array(chr(0) . "\_", chr(0) . "\%"), array('_', '%'), $expression);
 
 		return $this->_sql_not_like_expression('NOT LIKE \'' . $this->sql_escape($expression) . '\'');
 	}
@@ -774,7 +783,18 @@ abstract class driver implements driver_interface
 
 				if (!empty($array['WHERE']))
 				{
-					$sql .= ' WHERE ' . $this->_sql_custom_build('WHERE', $array['WHERE']);
+					$sql .= ' WHERE ';
+
+					if (is_array($array['WHERE']))
+					{
+						$sql_where = $this->_process_boolean_tree_first($array['WHERE']);
+					}
+					else
+					{
+						$sql_where = $array['WHERE'];
+					}
+
+					$sql .= $this->_sql_custom_build('WHERE', $sql_where);
 				}
 
 				if (!empty($array['GROUP_BY']))
@@ -793,6 +813,130 @@ abstract class driver implements driver_interface
 		return $sql;
 	}
 
+
+	protected function _process_boolean_tree_first($operations_ary)
+	{
+		// In cases where an array exists but there is no head condition,
+		// it should be because there's only 1 WHERE clause. This seems the best way to deal with it.
+		if ($operations_ary[self::LOGICAL_OP] !== 'AND' &&
+			$operations_ary[self::LOGICAL_OP] !== 'OR')
+		{
+			$operations_ary = array('AND', array($operations_ary));
+		}
+		return $this->_process_boolean_tree($operations_ary) . "\n";
+	}
+
+	protected function _process_boolean_tree($operations_ary)
+	{
+		$operation = $operations_ary[self::LOGICAL_OP];
+
+		foreach ($operations_ary[self::STATEMENTS] as &$condition)
+		{
+			switch ($condition[self::LOGICAL_OP])
+			{
+				case 'AND':
+				case 'OR':
+
+					$condition = ' ( ' . $this->_process_boolean_tree($condition) . ') ';
+
+				break;
+				case 'NOT':
+
+					$condition = ' NOT (' . $this->_process_boolean_tree($condition) . ') ';
+
+				break;
+
+				default:
+
+					switch (sizeof($condition))
+					{
+						case 3:
+
+							// Typical 3 element clause with {left hand} {operator} {right hand}
+							switch ($condition[self::COMPARE_OP])
+							{
+								case 'IN':
+								case 'NOT_IN':
+
+									// As this is used with an IN, assume it is a set of elements for sql_in_set()
+									$condition = $this->sql_in_set($condition[self::LEFT_STMT], $condition[self::RIGHT_STMT], $condition[self::COMPARE_OP] === 'NOT_IN', true);
+
+								break;
+
+								case 'LIKE':
+
+									$condition = $condition[self::LEFT_STMT] . ' ' . $this->sql_like_expression($condition[self::RIGHT_STMT]) . ' ';
+
+								break;
+
+								case 'NOT_LIKE':
+
+									$condition = $condition[self::LEFT_STMT] . ' ' . $this->sql_not_like_expression($condition[self::RIGHT_STMT]) . ' ';
+
+								break;
+
+								case 'IS_NOT':
+
+									$condition[self::COMPARE_OP] = 'IS NOT';
+
+								// no break
+								case 'IS':
+
+									// If the value is NULL, the string of it is the empty string ('') which is not the intended result.
+									// this should solve that
+									if ($condition[self::RIGHT_STMT] === null)
+									{
+										$condition[self::RIGHT_STMT] = 'NULL';
+									}
+
+									$condition = implode(' ', $condition);
+
+								break;
+
+								default:
+
+									$condition = implode(' ', $condition);
+
+								break;
+							}
+
+						break;
+
+						case 5:
+
+							// Subquery with {left hand} {operator} {compare kind} {SELECT Kind } {Sub Query}
+
+							$condition = $condition[self::LEFT_STMT] . ' ' . $condition[self::COMPARE_OP] . ' ' . $condition[self::SUBQUERY_OP] . ' ( ';
+							$condition .= $this->sql_build_query($condition[self::SUBQUERY_SELECT_TYPE], $condition[self::SUBQUERY_BUILD]);
+							$condition .= ' )';
+
+						break;
+
+						default:
+							// This is an unpredicted clause setup. Just join all elements.
+							$condition = implode(' ', $condition);
+
+						break;
+					}
+
+				break;
+			}
+
+		}
+
+		if ($operation === 'NOT')
+		{
+			$operations_ary =  implode("", $operations_ary[self::STATEMENTS]);
+		}
+		else
+		{
+			$operations_ary = implode(" \n	$operation ", $operations_ary[self::STATEMENTS]);
+		}
+
+		return $operations_ary;
+	}
+
+
 	/**
 	* {@inheritDoc}
 	*/
@@ -868,7 +1012,7 @@ abstract class driver implements driver_interface
 	*/
 	function sql_report($mode, $query = '')
 	{
-		global $cache, $starttime, $phpbb_root_path, $phpbb_path_helper, $user;
+		global $cache, $starttime, $phpbb_root_path, $phpbb_path_helper;
 		global $request;
 
 		if (is_object($request) && !$request->variable('explain', false))
--- a/phpbb/db/driver/mssql_odbc.php
+++ b/phpbb/db/driver/mssql_odbc.php
@@ -98,8 +98,8 @@ class mssql_odbc extends \phpbb\db\driver\mssql_base
 			$row = false;
 			if ($result_id)
 			{
-				$row = @odbc_fetch_array($result_id);
-				@odbc_free_result($result_id);
+				$row = odbc_fetch_array($result_id);
+				odbc_free_result($result_id);
 			}
 
 			$this->sql_server_version = ($row) ? trim(implode(' ', $row)) : 0;
@@ -181,12 +181,17 @@ class mssql_odbc extends \phpbb\db\driver\mssql_base
 					$this->sql_time += microtime(true) - $this->curtime;
 				}
 
+				if (!$this->query_result)
+				{
+					return false;
+				}
+
 				if ($cache && $cache_ttl)
 				{
 					$this->open_queries[(int) $this->query_result] = $this->query_result;
 					$this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
 				}
-				else if (strpos($query, 'SELECT') === 0 && $this->query_result)
+				else if (strpos($query, 'SELECT') === 0)
 				{
 					$this->open_queries[(int) $this->query_result] = $this->query_result;
 				}
@@ -261,7 +266,7 @@ class mssql_odbc extends \phpbb\db\driver\mssql_base
 			return $cache->sql_fetchrow($query_id);
 		}
 
-		return ($query_id !== false) ? @odbc_fetch_array($query_id) : false;
+		return ($query_id) ? odbc_fetch_array($query_id) : false;
 	}
 
 	/**
@@ -273,13 +278,13 @@ class mssql_odbc extends \phpbb\db\driver\mssql_base
 
 		if ($result_id)
 		{
-			if (@odbc_fetch_array($result_id))
+			if (odbc_fetch_array($result_id))
 			{
-				$id = @odbc_result($result_id, 1);
-				@odbc_free_result($result_id);
+				$id = odbc_result($result_id, 1);
+				odbc_free_result($result_id);
 				return $id;
 			}
-			@odbc_free_result($result_id);
+			odbc_free_result($result_id);
 		}
 
 		return false;
@@ -305,7 +310,7 @@ class mssql_odbc extends \phpbb\db\driver\mssql_base
 		if (isset($this->open_queries[(int) $query_id]))
 		{
 			unset($this->open_queries[(int) $query_id]);
-			return @odbc_free_result($query_id);
+			return odbc_free_result($query_id);
 		}
 
 		return false;
@@ -360,11 +365,14 @@ class mssql_odbc extends \phpbb\db\driver\mssql_base
 				$endtime = $endtime[0] + $endtime[1];
 
 				$result = @odbc_exec($this->db_connect_id, $query);
-				while ($void = @odbc_fetch_array($result))
+				if ($result)
 				{
-					// Take the time spent on parsing rows into account
+					while ($void = odbc_fetch_array($result))
+					{
+						// Take the time spent on parsing rows into account
+					}
+					odbc_free_result($result);
 				}
-				@odbc_free_result($result);
 
 				$splittime = explode(' ', microtime());
 				$splittime = $splittime[0] + $splittime[1];
--- a/phpbb/db/driver/mssqlnative.php
+++ b/phpbb/db/driver/mssqlnative.php
@@ -154,12 +154,17 @@ class mssqlnative extends \phpbb\db\driver\mssql_base
 					$this->sql_time += microtime(true) - $this->curtime;
 				}
 
+				if (!$this->query_result)
+				{
+					return false;
+				}
+
 				if ($cache && $cache_ttl)
 				{
 					$this->open_queries[(int) $this->query_result] = $this->query_result;
 					$this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
 				}
-				else if (strpos($query, 'SELECT') === 0 && $this->query_result)
+				else if (strpos($query, 'SELECT') === 0)
 				{
 					$this->open_queries[(int) $this->query_result] = $this->query_result;
 				}
@@ -242,12 +247,12 @@ class mssqlnative extends \phpbb\db\driver\mssql_base
 			return $cache->sql_fetchrow($query_id);
 		}
 
-		if ($query_id === false)
+		if (!$query_id)
 		{
 			return false;
 		}
 
-		$row = @sqlsrv_fetch_array($query_id, SQLSRV_FETCH_ASSOC);
+		$row = sqlsrv_fetch_array($query_id, SQLSRV_FETCH_ASSOC);
 
 		if ($row)
 		{
@@ -272,11 +277,11 @@ class mssqlnative extends \phpbb\db\driver\mssql_base
 	{
 		$result_id = @sqlsrv_query($this->db_connect_id, 'SELECT @@IDENTITY');
 
-		if ($result_id !== false)
+		if ($result_id)
 		{
-			$row = @sqlsrv_fetch_array($result_id);
+			$row = sqlsrv_fetch_array($result_id);
 			$id = $row[0];
-			@sqlsrv_free_stmt($result_id);
+			sqlsrv_free_stmt($result_id);
 			return $id;
 		}
 		else
@@ -305,7 +310,7 @@ class mssqlnative extends \phpbb\db\driver\mssql_base
 		if (isset($this->open_queries[(int) $query_id]))
 		{
 			unset($this->open_queries[(int) $query_id]);
-			return @sqlsrv_free_stmt($query_id);
+			return sqlsrv_free_stmt($query_id);
 		}
 
 		return false;
@@ -378,14 +383,14 @@ class mssqlnative extends \phpbb\db\driver\mssql_base
 				@sqlsrv_query($this->db_connect_id, 'SET SHOWPLAN_TEXT ON;');
 				if ($result = @sqlsrv_query($this->db_connect_id, $query))
 				{
-					@sqlsrv_next_result($result);
-					while ($row = @sqlsrv_fetch_array($result))
+					sqlsrv_next_result($result);
+					while ($row = sqlsrv_fetch_array($result))
 					{
 						$html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
 					}
+					sqlsrv_free_stmt($result);
 				}
 				@sqlsrv_query($this->db_connect_id, 'SET SHOWPLAN_TEXT OFF;');
-				@sqlsrv_free_stmt($result);
 
 				if ($html_table)
 				{
@@ -398,11 +403,14 @@ class mssqlnative extends \phpbb\db\driver\mssql_base
 				$endtime = $endtime[0] + $endtime[1];
 
 				$result = @sqlsrv_query($this->db_connect_id, $query);
-				while ($void = @sqlsrv_fetch_array($result))
+				if ($result)
 				{
-					// Take the time spent on parsing rows into account
+					while ($void = sqlsrv_fetch_array($result))
+					{
+						// Take the time spent on parsing rows into account
+					}
+					sqlsrv_free_stmt($result);
 				}
-				@sqlsrv_free_stmt($result);
 
 				$splittime = explode(' ', microtime());
 				$splittime = $splittime[0] + $splittime[1];
--- a/phpbb/db/driver/mysql.php
+++ b/phpbb/db/driver/mysql.php
@@ -70,9 +70,16 @@ class mysql extends \phpbb\db\driver\mysql_base
 					if (version_compare($this->sql_server_info(true), '5.0.2', '>='))
 					{
 						$result = @mysql_query('SELECT @@session.sql_mode AS sql_mode', $this->db_connect_id);
-						$row = @mysql_fetch_assoc($result);
-						@mysql_free_result($result);
-						$modes = array_map('trim', explode(',', $row['sql_mode']));
+						if ($result)
+						{
+							$row = mysql_fetch_assoc($result);
+							mysql_free_result($result);
+							$modes = array_map('trim', explode(',', $row['sql_mode']));
+						}
+						else
+						{
+							$modes = array();
+						}
 
 						// TRADITIONAL includes STRICT_ALL_TABLES and STRICT_TRANS_TABLES
 						if (!in_array('TRADITIONAL', $modes))
@@ -114,14 +121,17 @@ class mysql extends \phpbb\db\driver\mysql_base
 		if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mysql_version')) === false)
 		{
 			$result = @mysql_query('SELECT VERSION() AS version', $this->db_connect_id);
-			$row = @mysql_fetch_assoc($result);
-			@mysql_free_result($result);
+			if ($result)
+			{
+				$row = mysql_fetch_assoc($result);
+				mysql_free_result($result);
 
-			$this->sql_server_version = $row['version'];
+				$this->sql_server_version = $row['version'];
 
-			if (!empty($cache) && $use_cache)
-			{
-				$cache->put('mysql_version', $this->sql_server_version);
+				if (!empty($cache) && $use_cache)
+				{
+					$cache->put('mysql_version', $this->sql_server_version);
+				}
 			}
 		}
 
@@ -190,12 +200,17 @@ class mysql extends \phpbb\db\driver\mysql_base
 					$this->sql_time += microtime(true) - $this->curtime;
 				}
 
+				if (!$this->query_result)
+				{
+					return false;
+				}
+
 				if ($cache && $cache_ttl)
 				{
 					$this->open_queries[(int) $this->query_result] = $this->query_result;
 					$this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
 				}
-				else if (strpos($query, 'SELECT') === 0 && $this->query_result)
+				else if (strpos($query, 'SELECT') === 0)
 				{
 					$this->open_queries[(int) $this->query_result] = $this->query_result;
 				}
@@ -257,7 +272,7 @@ class mysql extends \phpbb\db\driver\mysql_base
 			return $cache->sql_fetchrow($query_id);
 		}
 
-		return ($query_id !== false) ? @mysql_fetch_assoc($query_id) : false;
+		return ($query_id) ? mysql_fetch_assoc($query_id) : false;
 	}
 
 	/**
@@ -308,7 +323,7 @@ class mysql extends \phpbb\db\driver\mysql_base
 		if (isset($this->open_queries[(int) $query_id]))
 		{
 			unset($this->open_queries[(int) $query_id]);
-			return @mysql_free_result($query_id);
+			return mysql_free_result($query_id);
 		}
 
 		return false;
@@ -411,12 +426,12 @@ class mysql extends \phpbb\db\driver\mysql_base
 
 					if ($result = @mysql_query("EXPLAIN $explain_query", $this->db_connect_id))
 					{
-						while ($row = @mysql_fetch_assoc($result))
+						while ($row = mysql_fetch_assoc($result))
 						{
 							$html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
 						}
+						mysql_free_result($result);
 					}
-					@mysql_free_result($result);
 
 					if ($html_table)
 					{
@@ -431,7 +446,7 @@ class mysql extends \phpbb\db\driver\mysql_base
 						if ($result = @mysql_query('SHOW PROFILE ALL;', $this->db_connect_id))
 						{
 							$this->html_hold .= '<br />';
-							while ($row = @mysql_fetch_assoc($result))
+							while ($row = mysql_fetch_assoc($result))
 							{
 								// make <unknown> HTML safe
 								if (!empty($row['Source_function']))
@@ -449,8 +464,8 @@ class mysql extends \phpbb\db\driver\mysql_base
 								}
 								$html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
 							}
+							mysql_free_result($result);
 						}
-						@mysql_free_result($result);
 
 						if ($html_table)
 						{
@@ -468,11 +483,14 @@ class mysql extends \phpbb\db\driver\mysql_base
 				$endtime = $endtime[0] + $endtime[1];
 
 				$result = @mysql_query($query, $this->db_connect_id);
-				while ($void = @mysql_fetch_assoc($result))
+				if ($result)
 				{
-					// Take the time spent on parsing rows into account
+					while ($void = mysql_fetch_assoc($result))
+					{
+						// Take the time spent on parsing rows into account
+					}
+					mysql_free_result($result);
 				}
-				@mysql_free_result($result);
 
 				$splittime = explode(' ', microtime());
 				$splittime = $splittime[0] + $splittime[1];
--- a/phpbb/db/driver/mysqli.php
+++ b/phpbb/db/driver/mysqli.php
@@ -74,9 +74,10 @@ class mysqli extends \phpbb\db\driver\mysql_base
 			if (version_compare($this->sql_server_info(true), '5.0.2', '>='))
 			{
 				$result = @mysqli_query($this->db_connect_id, 'SELECT @@session.sql_mode AS sql_mode');
-				if ($result !== null)
+				if ($result)
 				{
-					$row = @mysqli_fetch_assoc($result);
+					$row = mysqli_fetch_assoc($result);
+					mysqli_free_result($result);
 
 					$modes = array_map('trim', explode(',', $row['sql_mode']));
 				}
@@ -84,7 +85,6 @@ class mysqli extends \phpbb\db\driver\mysql_base
 				{
 					$modes = array();
 				}
-				@mysqli_free_result($result);
 
 				// TRADITIONAL includes STRICT_ALL_TABLES and STRICT_TRANS_TABLES
 				if (!in_array('TRADITIONAL', $modes))
@@ -119,9 +119,10 @@ class mysqli extends \phpbb\db\driver\mysql_base
 		if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mysqli_version')) === false)
 		{
 			$result = @mysqli_query($this->db_connect_id, 'SELECT VERSION() AS version');
-			if ($result !== null)
+			if ($result)
 			{
-				$row = @mysqli_fetch_assoc($result);
+				$row = mysqli_fetch_assoc($result);
+				mysqli_free_result($result);
 
 				$this->sql_server_version = $row['version'];
 
@@ -130,7 +131,6 @@ class mysqli extends \phpbb\db\driver\mysql_base
 					$cache->put('mysqli_version', $this->sql_server_version);
 				}
 			}
-			@mysqli_free_result($result);
 		}
 
 		return ($raw) ? $this->sql_server_version : 'MySQL(i) ' . $this->sql_server_version;
@@ -202,6 +202,11 @@ class mysqli extends \phpbb\db\driver\mysql_base
 					$this->sql_time += microtime(true) - $this->curtime;
 				}
 
+				if (!$this->query_result)
+				{
+					return false;
+				}
+
 				if ($cache && $cache_ttl)
 				{
 					$this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
@@ -245,9 +250,9 @@ class mysqli extends \phpbb\db\driver\mysql_base
 			return $cache->sql_fetchrow($query_id);
 		}
 
-		if ($query_id !== false && $query_id !== null)
+		if ($query_id)
 		{
-			$result = @mysqli_fetch_assoc($query_id);
+			$result = mysqli_fetch_assoc($query_id);
 			return $result !== null ? $result : false;
 		}
 
@@ -271,7 +276,7 @@ class mysqli extends \phpbb\db\driver\mysql_base
 			return $cache->sql_rowseek($rownum, $query_id);
 		}
 
-		return ($query_id !== false) ? @mysqli_data_seek($query_id, $rownum) : false;
+		return ($query_id) ? @mysqli_data_seek($query_id, $rownum) : false;
 	}
 
 	/**
@@ -299,7 +304,17 @@ class mysqli extends \phpbb\db\driver\mysql_base
 			return $cache->sql_freeresult($query_id);
 		}
 
-		return @mysqli_free_result($query_id);
+		if (!$query_id)
+		{
+			return false;
+		}
+
+		if ($query_id === true)
+		{
+			return true;
+		}
+
+		return mysqli_free_result($query_id);
 	}
 
 	/**
@@ -398,12 +413,12 @@ class mysqli extends \phpbb\db\driver\mysql_base
 
 					if ($result = @mysqli_query($this->db_connect_id, "EXPLAIN $explain_query"))
 					{
-						while ($row = @mysqli_fetch_assoc($result))
+						while ($row = mysqli_fetch_assoc($result))
 						{
 							$html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
 						}
+						mysqli_free_result($result);
 					}
-					@mysqli_free_result($result);
 
 					if ($html_table)
 					{
@@ -418,7 +433,7 @@ class mysqli extends \phpbb\db\driver\mysql_base
 						if ($result = @mysqli_query($this->db_connect_id, 'SHOW PROFILE ALL;'))
 						{
 							$this->html_hold .= '<br />';
-							while ($row = @mysqli_fetch_assoc($result))
+							while ($row = mysqli_fetch_assoc($result))
 							{
 								// make <unknown> HTML safe
 								if (!empty($row['Source_function']))
@@ -436,8 +451,8 @@ class mysqli extends \phpbb\db\driver\mysql_base
 								}
 								$html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
 							}
+							mysqli_free_result($result);
 						}
-						@mysqli_free_result($result);
 
 						if ($html_table)
 						{
@@ -455,14 +470,14 @@ class mysqli extends \phpbb\db\driver\mysql_base
 				$endtime = $endtime[0] + $endtime[1];
 
 				$result = @mysqli_query($this->db_connect_id, $query);
-				if ($result !== null)
+				if ($result)
 				{
-					while ($void = @mysqli_fetch_assoc($result))
+					while ($void = mysqli_fetch_assoc($result))
 					{
 						// Take the time spent on parsing rows into account
 					}
+					mysqli_free_result($result);
 				}
-				@mysqli_free_result($result);
 
 				$splittime = explode(' ', microtime());
 				$splittime = $splittime[0] + $splittime[1];
--- a/phpbb/db/driver/oracle.php
+++ b/phpbb/db/driver/oracle.php
@@ -84,8 +84,6 @@ class oracle extends \phpbb\db\driver\driver
 		* but I assume its because the Oracle extension provides a direct method to access it
 		* without a query.
 		*/
-
-		$use_cache = false;
 /*
 		global $cache;
 
@@ -439,12 +437,17 @@ class oracle extends \phpbb\db\driver\driver
 					$this->sql_time += microtime(true) - $this->curtime;
 				}
 
+				if (!$this->query_result)
+				{
+					return false;
+				}
+
 				if ($cache && $cache_ttl)
 				{
 					$this->open_queries[(int) $this->query_result] = $this->query_result;
 					$this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
 				}
-				else if (strpos($query, 'SELECT') === 0 && $this->query_result)
+				else if (strpos($query, 'SELECT') === 0)
 				{
 					$this->open_queries[(int) $this->query_result] = $this->query_result;
 				}
@@ -499,10 +502,10 @@ class oracle extends \phpbb\db\driver\driver
 			return $cache->sql_fetchrow($query_id);
 		}
 
-		if ($query_id !== false)
+		if ($query_id)
 		{
 			$row = array();
-			$result = @ocifetchinto($query_id, $row, OCI_ASSOC + OCI_RETURN_NULLS);
+			$result = ocifetchinto($query_id, $row, OCI_ASSOC + OCI_RETURN_NULLS);
 
 			if (!$result || !$row)
 			{
@@ -550,7 +553,7 @@ class oracle extends \phpbb\db\driver\driver
 			return $cache->sql_rowseek($rownum, $query_id);
 		}
 
-		if ($query_id === false)
+		if (!$query_id)
 		{
 			return false;
 		}
@@ -583,18 +586,24 @@ class oracle extends \phpbb\db\driver\driver
 			{
 				$query = 'SELECT ' . $tablename[1] . '_seq.currval FROM DUAL';
 				$stmt = @ociparse($this->db_connect_id, $query);
-				@ociexecute($stmt, OCI_DEFAULT);
+				if ($stmt)
+				{
+					$success = @ociexecute($stmt, OCI_DEFAULT);
 
-				$temp_result = @ocifetchinto($stmt, $temp_array, OCI_ASSOC + OCI_RETURN_NULLS);
-				@ocifreestatement($stmt);
+					if ($success)
+					{
+						$temp_result = ocifetchinto($stmt, $temp_array, OCI_ASSOC + OCI_RETURN_NULLS);
+						ocifreestatement($stmt);
 
-				if ($temp_result)
-				{
-					return $temp_array['CURRVAL'];
-				}
-				else
-				{
-					return false;
+						if ($temp_result)
+						{
+							return $temp_array['CURRVAL'];
+						}
+						else
+						{
+							return false;
+						}
+					}
 				}
 			}
 		}
@@ -622,7 +631,7 @@ class oracle extends \phpbb\db\driver\driver
 		if (isset($this->open_queries[(int) $query_id]))
 		{
 			unset($this->open_queries[(int) $query_id]);
-			return @ocifreestatement($query_id);
+			return ocifreestatement($query_id);
 		}
 
 		return false;
@@ -787,14 +796,20 @@ class oracle extends \phpbb\db\driver\driver
 				$endtime = $endtime[0] + $endtime[1];
 
 				$result = @ociparse($this->db_connect_id, $query);
-				$success = @ociexecute($result, OCI_DEFAULT);
-				$row = array();
-
-				while (@ocifetchinto($result, $row, OCI_ASSOC + OCI_RETURN_NULLS))
+				if ($result)
 				{
-					// Take the time spent on parsing rows into account
+					$success = @ociexecute($result, OCI_DEFAULT);
+					if ($success)
+					{
+						$row = array();
+
+						while (ocifetchinto($result, $row, OCI_ASSOC + OCI_RETURN_NULLS))
+						{
+							// Take the time spent on parsing rows into account
+						}
+						@ocifreestatement($result);
+					}
 				}
-				@ocifreestatement($result);
 
 				$splittime = explode(' ', microtime());
 				$splittime = $splittime[0] + $splittime[1];
--- a/phpbb/db/driver/postgres.php
+++ b/phpbb/db/driver/postgres.php
@@ -123,14 +123,17 @@ class postgres extends \phpbb\db\driver\driver
 		if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('pgsql_version')) === false)
 		{
 			$query_id = @pg_query($this->db_connect_id, 'SELECT VERSION() AS version');
-			$row = @pg_fetch_assoc($query_id, null);
-			@pg_free_result($query_id);
+			if ($query_id)
+			{
+				$row = pg_fetch_assoc($query_id, null);
+				pg_free_result($query_id);
 
-			$this->sql_server_version = (!empty($row['version'])) ? trim(substr($row['version'], 10)) : 0;
+				$this->sql_server_version = (!empty($row['version'])) ? trim(substr($row['version'], 10)) : 0;
 
-			if (!empty($cache) && $use_cache)
-			{
-				$cache->put('pgsql_version', $this->sql_server_version);
+				if (!empty($cache) && $use_cache)
+				{
+					$cache->put('pgsql_version', $this->sql_server_version);
+				}
 			}
 		}
 
@@ -200,12 +203,17 @@ class postgres extends \phpbb\db\driver\driver
 					$this->sql_time += microtime(true) - $this->curtime;
 				}
 
+				if (!$this->query_result)
+				{
+					return false;
+				}
+
 				if ($cache && $cache_ttl)
 				{
 					$this->open_queries[(int) $this->query_result] = $this->query_result;
 					$this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
 				}
-				else if (strpos($query, 'SELECT') === 0 && $this->query_result)
+				else if (strpos($query, 'SELECT') === 0)
 				{
 					$this->open_queries[(int) $this->query_result] = $this->query_result;
 				}
@@ -275,7 +283,7 @@ class postgres extends \phpbb\db\driver\driver
 			return $cache->sql_fetchrow($query_id);
 		}
 
-		return ($query_id !== false) ? @pg_fetch_assoc($query_id, null) : false;
+		return ($query_id) ? pg_fetch_assoc($query_id, null) : false;
 	}
 
 	/**
@@ -295,7 +303,7 @@ class postgres extends \phpbb\db\driver\driver
 			return $cache->sql_rowseek($rownum, $query_id);
 		}
 
-		return ($query_id !== false) ? @pg_result_seek($query_id, $rownum) : false;
+		return ($query_id) ? @pg_result_seek($query_id, $rownum) : false;
 	}
 
 	/**
@@ -317,8 +325,8 @@ class postgres extends \phpbb\db\driver\driver
 					return false;
 				}
 
-				$temp_result = @pg_fetch_assoc($temp_q_id, null);
-				@pg_free_result($query_id);
+				$temp_result = pg_fetch_assoc($temp_q_id, null);
+				pg_free_result($query_id);
 
 				return ($temp_result) ? $temp_result['last_value'] : false;
 			}
@@ -347,7 +355,7 @@ class postgres extends \phpbb\db\driver\driver
 		if (isset($this->open_queries[(int) $query_id]))
 		{
 			unset($this->open_queries[(int) $query_id]);
-			return @pg_free_result($query_id);
+			return pg_free_result($query_id);
 		}
 
 		return false;
@@ -453,12 +461,12 @@ class postgres extends \phpbb\db\driver\driver
 
 					if ($result = @pg_query($this->db_connect_id, "EXPLAIN $explain_query"))
 					{
-						while ($row = @pg_fetch_assoc($result, null))
+						while ($row = pg_fetch_assoc($result, null))
 						{
 							$html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
 						}
+						pg_free_result($result);
 					}
-					@pg_free_result($result);
 
 					if ($html_table)
 					{
@@ -473,11 +481,14 @@ class postgres extends \phpbb\db\driver\driver
 				$endtime = $endtime[0] + $endtime[1];
 
 				$result = @pg_query($this->db_connect_id, $query);
-				while ($void = @pg_fetch_assoc($result, null))
+				if ($result)
 				{
-					// Take the time spent on parsing rows into account
+					while ($void = pg_fetch_assoc($result, null))
+					{
+						// Take the time spent on parsing rows into account
+					}
+					pg_free_result($result);
 				}
-				@pg_free_result($result);
 
 				$splittime = explode(' ', microtime());
 				$splittime = $splittime[0] + $splittime[1];
--- a/phpbb/db/driver/sqlite3.php
+++ b/phpbb/db/driver/sqlite3.php
@@ -102,7 +102,7 @@ class sqlite3 extends \phpbb\db\driver\driver
 			break;
 
 			case 'rollback':
-				return $this->dbo->exec('ROLLBACK');
+				return @$this->dbo->exec('ROLLBACK');
 			break;
 		}
 
@@ -134,9 +134,26 @@ class sqlite3 extends \phpbb\db\driver\driver
 
 			if ($this->query_result === false)
 			{
+				if ($this->transaction === true && strpos($query, 'INSERT') === 0)
+				{
+					$query = preg_replace('/^INSERT INTO/', 'INSERT OR ROLLBACK INTO', $query);
+				}
+
 				if (($this->query_result = @$this->dbo->query($query)) === false)
 				{
-					$this->sql_error($query);
+					// Try to recover a lost database connection
+					if ($this->dbo && !@$this->dbo->lastErrorMsg())
+					{
+						if ($this->sql_connect($this->server, $this->user, '', $this->dbname))
+						{
+							$this->query_result = @$this->dbo->query($query);
+						}
+					}
+
+					if ($this->query_result === false)
+					{
+						$this->sql_error($query);
+					}
 				}
 
 				if (defined('DEBUG'))
@@ -148,6 +165,11 @@ class sqlite3 extends \phpbb\db\driver\driver
 					$this->sql_time += microtime(true) - $this->curtime;
 				}
 
+				if (!$this->query_result)
+				{
+					return false;
+				}
+
 				if ($cache && $cache_ttl)
 				{
 					$this->query_result = $cache->sql_save($this, $query, $this->query_result, $cache_ttl);
@@ -208,6 +230,7 @@ class sqlite3 extends \phpbb\db\driver\driver
 
 		if ($query_id === false)
 		{
+			/** @var \SQLite3Result $query_id */
 			$query_id = $this->query_result;
 		}
 
@@ -216,7 +239,7 @@ class sqlite3 extends \phpbb\db\driver\driver
 			return $cache->sql_fetchrow($query_id);
 		}
 
-		return is_object($query_id) ? $query_id->fetchArray(SQLITE3_ASSOC) : false;
+		return is_object($query_id) ? @$query_id->fetchArray(SQLITE3_ASSOC) : false;
 	}
 
 	/**
@@ -389,9 +412,12 @@ class sqlite3 extends \phpbb\db\driver\driver
 				$endtime = $endtime[0] + $endtime[1];
 
 				$result = $this->dbo->query($query);
-				while ($void = $result->fetchArray(SQLITE3_ASSOC))
+				if ($result)
 				{
-					// Take the time spent on parsing rows into account
+						while ($void = $result->fetchArray(SQLITE3_ASSOC))
+						{
+							// Take the time spent on parsing rows into account
+						}
 				}
 
 				$splittime = explode(' ', microtime());
--- /dev/null
+++ b/phpbb/db/extractor/base_extractor.php
@@ -0,0 +1,252 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\extractor;
+
+use phpbb\db\extractor\exception\invalid_format_exception;
+use phpbb\db\extractor\exception\extractor_not_initialized_exception;
+
+/**
+ * Abstract base class for database extraction
+ */
+abstract class base_extractor implements extractor_interface
+{
+	/**
+	 * @var    string    phpBB root path
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var    \phpbb\request\request_interface
+	 */
+	protected $request;
+
+	/**
+	 * @var    \phpbb\db\driver\driver_interface
+	 */
+	protected $db;
+
+	/**
+	 * @var    bool
+	 */
+	protected $download;
+
+	/**
+	 * @var    bool
+	 */
+	protected $store;
+
+	/**
+	 * @var    int
+	 */
+	protected $time;
+
+	/**
+	 * @var    string
+	 */
+	protected $format;
+
+	/**
+	 * @var    resource
+	 */
+	protected $fp;
+
+	/**
+	 * @var string
+	 */
+	protected $write;
+
+	/**
+	 * @var string
+	 */
+	protected $close;
+
+	/**
+	 * @var bool
+	 */
+	protected $run_comp;
+
+	/**
+	 * @var bool
+	 */
+	protected $is_initialized;
+
+	/**
+	 * Constructor
+	 *
+	 * @param string $phpbb_root_path
+	 * @param \phpbb\request\request_interface $request
+	 * @param \phpbb\db\driver\driver_interface $db
+	 */
+	public function __construct($phpbb_root_path, \phpbb\request\request_interface $request, \phpbb\db\driver\driver_interface $db)
+	{
+		$this->phpbb_root_path	= $phpbb_root_path;
+		$this->request			= $request;
+		$this->db				= $db;
+		$this->fp				= null;
+
+		$this->is_initialized   = false;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function init_extractor($format, $filename, $time, $download = false, $store = false)
+	{
+		$this->download			= $download;
+		$this->store			= $store;
+		$this->time				= $time;
+		$this->format			= $format;
+
+		switch ($format)
+		{
+			case 'text':
+				$ext = '.sql';
+				$open = 'fopen';
+				$this->write = 'fwrite';
+				$this->close = 'fclose';
+				$mimetype = 'text/x-sql';
+			break;
+			case 'bzip2':
+				$ext = '.sql.bz2';
+				$open = 'bzopen';
+				$this->write = 'bzwrite';
+				$this->close = 'bzclose';
+				$mimetype = 'application/x-bzip2';
+			break;
+			case 'gzip':
+				$ext = '.sql.gz';
+				$open = 'gzopen';
+				$this->write = 'gzwrite';
+				$this->close = 'gzclose';
+				$mimetype = 'application/x-gzip';
+			break;
+			default:
+				throw new invalid_format_exception();
+			break;
+		}
+
+		if ($download === true)
+		{
+			$name = $filename . $ext;
+			header('Cache-Control: private, no-cache');
+			header("Content-Type: $mimetype; name=\"$name\"");
+			header("Content-disposition: attachment; filename=$name");
+
+			switch ($format)
+			{
+				case 'bzip2':
+					ob_start();
+				break;
+
+				case 'gzip':
+					if (strpos($this->request->header('Accept-Encoding'), 'gzip') !== false && strpos(strtolower($this->request->header('User-Agent')), 'msie') === false)
+					{
+						ob_start('ob_gzhandler');
+					}
+					else
+					{
+						$this->run_comp = true;
+					}
+				break;
+			}
+		}
+
+		if ($store === true)
+		{
+			$file = $this->phpbb_root_path . 'store/' . $filename . $ext;
+
+			$this->fp = $open($file, 'w');
+
+			if (!$this->fp)
+			{
+				trigger_error('FILE_WRITE_FAIL', E_USER_ERROR);
+			}
+		}
+
+		$this->is_initialized = true;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function write_end()
+	{
+		static $close;
+
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		if ($this->store)
+		{
+			if ($close === null)
+			{
+				$close = $this->close;
+			}
+			$close($this->fp);
+		}
+
+		// bzip2 must be written all the way at the end
+		if ($this->download && $this->format === 'bzip2')
+		{
+			$c = ob_get_clean();
+			echo bzcompress($c);
+		}
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function flush($data)
+	{
+		static $write;
+
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		if ($this->store === true)
+		{
+			if ($write === null)
+			{
+				$write = $this->write;
+			}
+			$write($this->fp, $data);
+		}
+
+		if ($this->download === true)
+		{
+			if ($this->format === 'bzip2' || $this->format === 'text' || ($this->format === 'gzip' && !$this->run_comp))
+			{
+				echo $data;
+			}
+
+			// we can write the gzip data as soon as we get it
+			if ($this->format === 'gzip')
+			{
+				if ($this->run_comp)
+				{
+					echo gzencode($data);
+				}
+				else
+				{
+					ob_flush();
+					flush();
+				}
+			}
+		}
+	}
+}
--- /dev/null
+++ b/phpbb/db/extractor/exception/extractor_not_initialized_exception.php
@@ -0,0 +1,24 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\extractor\exception;
+
+use phpbb\exception\runtime_exception;
+
+/**
+* This exception is thrown when invalid format is given to the extractor
+*/
+class extractor_not_initialized_exception extends runtime_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/db/extractor/exception/invalid_format_exception.php
@@ -0,0 +1,22 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\extractor\exception;
+
+/**
+* This exception is thrown when invalid format is given to the extractor
+*/
+class invalid_format_exception extends \InvalidArgumentException
+{
+
+}
--- /dev/null
+++ b/phpbb/db/extractor/extractor_interface.php
@@ -0,0 +1,80 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\extractor;
+
+/**
+* Database extractor interface
+*/
+interface extractor_interface
+{
+	/**
+	* Start the extraction of the database
+	*
+	* This function initialize the database extraction. It is required to call this
+	* function before calling any other extractor functions.
+	*
+	* @param string	$format
+	* @param string	$filename
+	* @param int	$time
+	* @param bool	$download
+	* @param bool	$store
+	* @return null
+	* @throws \phpbb\db\extractor\exception\invalid_format_exception when $format is invalid
+	*/
+	public function init_extractor($format, $filename, $time, $download = false, $store = false);
+
+	/**
+	* Writes header comments to the database backup
+	*
+	* @param	string	$table_prefix	prefix of phpBB database tables
+	* @return null
+	* @throws \phpbb\db\extractor\exception\extractor_not_initialized_exception when calling this function before init_extractor()
+	*/
+	public function write_start($table_prefix);
+
+	/**
+	* Closes file and/or dumps download data
+	*
+	* @return null
+	* @throws \phpbb\db\extractor\exception\extractor_not_initialized_exception when calling this function before init_extractor()
+	*/
+	public function write_end();
+
+	/**
+	* Extracts database table structure
+	*
+	* @param	string	$table_name	name of the database table
+	* @return null
+	* @throws \phpbb\db\extractor\exception\extractor_not_initialized_exception when calling this function before init_extractor()
+	*/
+	public function write_table($table_name);
+
+	/**
+	* Extracts data from database table
+	*
+	* @param	string	$table_name	name of the database table
+	* @return null
+	* @throws \phpbb\db\extractor\exception\extractor_not_initialized_exception when calling this function before init_extractor()
+	*/
+	public function write_data($table_name);
+
+	/**
+	* Writes data to file/download content
+	*
+	* @param string	$data
+	* @return null
+	* @throws \phpbb\db\extractor\exception\extractor_not_initialized_exception when calling this function before init_extractor()
+	*/
+	public function flush($data);
+}
--- /dev/null
+++ b/phpbb/db/extractor/factory.php
@@ -0,0 +1,75 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\extractor;
+
+/**
+* A factory which serves the suitable extractor instance for the given dbal
+*/
+class factory
+{
+	/**
+	 * @var \phpbb\db\driver\driver_interface
+	 */
+	protected $db;
+
+	/**
+	 * @var \Symfony\Component\DependencyInjection\ContainerInterface
+	 */
+	protected $container;
+
+	/**
+	* Extractor factory constructor
+	*
+	* @param \phpbb\db\driver\driver_interface							$db
+	* @param \Symfony\Component\DependencyInjection\ContainerInterface	$container
+	*/
+	public function __construct(\phpbb\db\driver\driver_interface $db, \Symfony\Component\DependencyInjection\ContainerInterface $container)
+	{
+		$this->db			= $db;
+		$this->container	= $container;
+	}
+
+	/**
+	* DB extractor factory getter
+	*
+	* @return \phpbb\db\extractor\extractor_interface an appropriate instance of the database extractor for the used database driver
+	* @throws \InvalidArgumentException when the database driver is unknown
+	*/
+	public function get()
+	{
+		// Return the appropriate DB extractor
+		if ($this->db instanceof \phpbb\db\driver\mssql_base)
+		{
+			return $this->container->get('dbal.extractor.extractors.mssql_extractor');
+		}
+		else if ($this->db instanceof \phpbb\db\driver\mysql_base)
+		{
+			return $this->container->get('dbal.extractor.extractors.mysql_extractor');
+		}
+		else if ($this->db instanceof \phpbb\db\driver\oracle)
+		{
+			return $this->container->get('dbal.extractor.extractors.oracle_extractor');
+		}
+		else if ($this->db instanceof \phpbb\db\driver\postgres)
+		{
+			return $this->container->get('dbal.extractor.extractors.postgres_extractor');
+		}
+		else if ($this->db instanceof \phpbb\db\driver\sqlite3)
+		{
+			return $this->container->get('dbal.extractor.extractors.sqlite3_extractor');
+		}
+
+		throw new \InvalidArgumentException('Invalid database driver given');
+	}
+}
--- /dev/null
+++ b/phpbb/db/extractor/mssql_extractor.php
@@ -0,0 +1,415 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\extractor;
+
+use phpbb\db\extractor\exception\extractor_not_initialized_exception;
+
+class mssql_extractor extends base_extractor
+{
+	/**
+	* Writes closing line(s) to database backup
+	*
+	* @return null
+	* @throws \phpbb\db\extractor\exception\extractor_not_initialized_exception when calling this function before init_extractor()
+	*/
+	public function write_end()
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$this->flush("COMMIT\nGO\n");
+		parent::write_end();
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function write_start($table_prefix)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$sql_data = "--\n";
+		$sql_data .= "-- phpBB Backup Script\n";
+		$sql_data .= "-- Dump of tables for $table_prefix\n";
+		$sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
+		$sql_data .= "--\n";
+		$sql_data .= "BEGIN TRANSACTION\n";
+		$sql_data .= "GO\n";
+		$this->flush($sql_data);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function write_table($table_name)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$sql_data = '-- Table: ' . $table_name . "\n";
+		$sql_data .= "IF OBJECT_ID(N'$table_name', N'U') IS NOT NULL\n";
+		$sql_data .= "DROP TABLE $table_name;\n";
+		$sql_data .= "GO\n";
+		$sql_data .= "\nCREATE TABLE [$table_name] (\n";
+		$rows = array();
+
+		$text_flag = false;
+
+		$sql = "SELECT COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') as IS_IDENTITY
+			FROM INFORMATION_SCHEMA.COLUMNS
+			WHERE TABLE_NAME = '$table_name'";
+		$result = $this->db->sql_query($sql);
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$line = "\t[{$row['COLUMN_NAME']}] [{$row['DATA_TYPE']}]";
+
+			if ($row['DATA_TYPE'] == 'text')
+			{
+				$text_flag = true;
+			}
+
+			if ($row['IS_IDENTITY'])
+			{
+				$line .= ' IDENTITY (1 , 1)';
+			}
+
+			if ($row['CHARACTER_MAXIMUM_LENGTH'] && $row['DATA_TYPE'] !== 'text')
+			{
+				$line .= ' (' . $row['CHARACTER_MAXIMUM_LENGTH'] . ')';
+			}
+
+			if ($row['IS_NULLABLE'] == 'YES')
+			{
+				$line .= ' NULL';
+			}
+			else
+			{
+				$line .= ' NOT NULL';
+			}
+
+			if ($row['COLUMN_DEFAULT'])
+			{
+				$line .= ' DEFAULT ' . $row['COLUMN_DEFAULT'];
+			}
+
+			$rows[] = $line;
+		}
+		$this->db->sql_freeresult($result);
+
+		$sql_data .= implode(",\n", $rows);
+		$sql_data .= "\n) ON [PRIMARY]";
+
+		if ($text_flag)
+		{
+			$sql_data .= " TEXTIMAGE_ON [PRIMARY]";
+		}
+
+		$sql_data .= "\nGO\n\n";
+		$rows = array();
+
+		$sql = "SELECT CONSTRAINT_NAME, COLUMN_NAME
+			FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
+			WHERE TABLE_NAME = '$table_name'";
+		$result = $this->db->sql_query($sql);
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			if (!sizeof($rows))
+			{
+				$sql_data .= "ALTER TABLE [$table_name] WITH NOCHECK ADD\n";
+				$sql_data .= "\tCONSTRAINT [{$row['CONSTRAINT_NAME']}] PRIMARY KEY  CLUSTERED \n\t(\n";
+			}
+			$rows[] = "\t\t[{$row['COLUMN_NAME']}]";
+		}
+		if (sizeof($rows))
+		{
+			$sql_data .= implode(",\n", $rows);
+			$sql_data .= "\n\t)  ON [PRIMARY] \nGO\n";
+		}
+		$this->db->sql_freeresult($result);
+
+		$index = array();
+		$sql = "EXEC sp_statistics '$table_name'";
+		$result = $this->db->sql_query($sql);
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			if ($row['TYPE'] == 3)
+			{
+				$index[$row['INDEX_NAME']][] = '[' . $row['COLUMN_NAME'] . ']';
+			}
+		}
+		$this->db->sql_freeresult($result);
+
+		foreach ($index as $index_name => $column_name)
+		{
+			$index[$index_name] = implode(', ', $column_name);
+		}
+
+		foreach ($index as $index_name => $columns)
+		{
+			$sql_data .= "\nCREATE  INDEX [$index_name] ON [$table_name]($columns) ON [PRIMARY]\nGO\n";
+		}
+		$this->flush($sql_data);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function write_data($table_name)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		if ($this->db->get_sql_layer() === 'mssqlnative')
+		{
+			$this->write_data_mssqlnative($table_name);
+		}
+		else
+		{
+			$this->write_data_odbc($table_name);
+		}
+	}
+
+	/**
+	* Extracts data from database table (for MSSQL Native driver)
+	*
+	* @param	string	$table_name	name of the database table
+	* @return null
+	* @throws \phpbb\db\extractor\exception\extractor_not_initialized_exception when calling this function before init_extractor()
+	*/
+	protected function write_data_mssqlnative($table_name)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$ary_type = $ary_name = array();
+		$ident_set = false;
+		$sql_data = '';
+
+		// Grab all of the data from current table.
+		$sql = "SELECT * FROM $table_name";
+		$this->db->mssqlnative_set_query_options(array('Scrollable' => SQLSRV_CURSOR_STATIC));
+		$result = $this->db->sql_query($sql);
+
+		$retrieved_data = $this->db->mssqlnative_num_rows($result);
+
+		if (!$retrieved_data)
+		{
+			$this->db->sql_freeresult($result);
+			return;
+		}
+
+		$sql = "SELECT COLUMN_NAME, DATA_TYPE
+			FROM INFORMATION_SCHEMA.COLUMNS
+			WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = '" . $this->db->sql_escape($table_name) . "'";
+		$result_fields = $this->db->sql_query($sql);
+
+		$i_num_fields = 0;
+		while ($row = $this->db->sql_fetchrow($result_fields))
+		{
+			$ary_type[$i_num_fields] = $row['DATA_TYPE'];
+			$ary_name[$i_num_fields] = $row['COLUMN_NAME'];
+			$i_num_fields++;
+		}
+		$this->db->sql_freeresult($result_fields);
+
+		$sql = "SELECT 1 as has_identity
+			FROM INFORMATION_SCHEMA.COLUMNS
+			WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1";
+		$result2 = $this->db->sql_query($sql);
+		$row2 = $this->db->sql_fetchrow($result2);
+
+		if (!empty($row2['has_identity']))
+		{
+			$sql_data .= "\nSET IDENTITY_INSERT $table_name ON\nGO\n";
+			$ident_set = true;
+		}
+		$this->db->sql_freeresult($result2);
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$schema_vals = $schema_fields = array();
+
+			// Build the SQL statement to recreate the data.
+			for ($i = 0; $i < $i_num_fields; $i++)
+			{
+				$str_val = $row[$ary_name[$i]];
+
+				// defaults to type number - better quote just to be safe, so check for is_int too
+				if (is_int($ary_type[$i]) || preg_match('#char|text|bool|varbinary#i', $ary_type[$i]))
+				{
+					$str_quote = '';
+					$str_empty = "''";
+					$str_val = sanitize_data_mssql(str_replace("'", "''", $str_val));
+				}
+				else if (preg_match('#date|timestamp#i', $ary_type[$i]))
+				{
+					if (empty($str_val))
+					{
+						$str_quote = '';
+					}
+					else
+					{
+						$str_quote = "'";
+					}
+				}
+				else
+				{
+					$str_quote = '';
+					$str_empty = 'NULL';
+				}
+
+				if (empty($str_val) && $str_val !== '0' && !(is_int($str_val) || is_float($str_val)))
+				{
+					$str_val = $str_empty;
+				}
+
+				$schema_vals[$i] = $str_quote . $str_val . $str_quote;
+				$schema_fields[$i] = $ary_name[$i];
+			}
+
+			// Take the ordered fields and their associated data and build it
+			// into a valid sql statement to recreate that field in the data.
+			$sql_data .= "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ");\nGO\n";
+
+			$this->flush($sql_data);
+			$sql_data = '';
+		}
+		$this->db->sql_freeresult($result);
+
+		if ($ident_set)
+		{
+			$sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\nGO\n";
+		}
+		$this->flush($sql_data);
+	}
+
+	/**
+	* Extracts data from database table (for ODBC driver)
+	*
+	* @param	string	$table_name	name of the database table
+	* @return null
+	* @throws \phpbb\db\extractor\exception\extractor_not_initialized_exception when calling this function before init_extractor()
+	*/
+	protected function write_data_odbc($table_name)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$ary_type = $ary_name = array();
+		$ident_set = false;
+		$sql_data = '';
+
+		// Grab all of the data from current table.
+		$sql = "SELECT *
+			FROM $table_name";
+		$result = $this->db->sql_query($sql);
+
+		$retrieved_data = odbc_num_rows($result);
+
+		if ($retrieved_data)
+		{
+			$sql = "SELECT 1 as has_identity
+				FROM INFORMATION_SCHEMA.COLUMNS
+				WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1";
+			$result2 = $this->db->sql_query($sql);
+			$row2 = $this->db->sql_fetchrow($result2);
+			if (!empty($row2['has_identity']))
+			{
+				$sql_data .= "\nSET IDENTITY_INSERT $table_name ON\nGO\n";
+				$ident_set = true;
+			}
+			$this->db->sql_freeresult($result2);
+		}
+
+		$i_num_fields = odbc_num_fields($result);
+
+		for ($i = 0; $i < $i_num_fields; $i++)
+		{
+			$ary_type[$i] = odbc_field_type($result, $i + 1);
+			$ary_name[$i] = odbc_field_name($result, $i + 1);
+		}
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$schema_vals = $schema_fields = array();
+
+			// Build the SQL statement to recreate the data.
+			for ($i = 0; $i < $i_num_fields; $i++)
+			{
+				$str_val = $row[$ary_name[$i]];
+
+				if (preg_match('#char|text|bool|varbinary#i', $ary_type[$i]))
+				{
+					$str_quote = '';
+					$str_empty = "''";
+					$str_val = sanitize_data_mssql(str_replace("'", "''", $str_val));
+				}
+				else if (preg_match('#date|timestamp#i', $ary_type[$i]))
+				{
+					if (empty($str_val))
+					{
+						$str_quote = '';
+					}
+					else
+					{
+						$str_quote = "'";
+					}
+				}
+				else
+				{
+					$str_quote = '';
+					$str_empty = 'NULL';
+				}
+
+				if (empty($str_val) && $str_val !== '0' && !(is_int($str_val) || is_float($str_val)))
+				{
+					$str_val = $str_empty;
+				}
+
+				$schema_vals[$i] = $str_quote . $str_val . $str_quote;
+				$schema_fields[$i] = $ary_name[$i];
+			}
+
+			// Take the ordered fields and their associated data and build it
+			// into a valid sql statement to recreate that field in the data.
+			$sql_data .= "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ");\nGO\n";
+
+			$this->flush($sql_data);
+
+			$sql_data = '';
+
+		}
+		$this->db->sql_freeresult($result);
+
+		if ($retrieved_data && $ident_set)
+		{
+			$sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\nGO\n";
+		}
+		$this->flush($sql_data);
+	}
+}
--- /dev/null
+++ b/phpbb/db/extractor/mysql_extractor.php
@@ -0,0 +1,403 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\extractor;
+
+use phpbb\db\extractor\exception\extractor_not_initialized_exception;
+
+class mysql_extractor extends base_extractor
+{
+	/**
+	* {@inheritdoc}
+	*/
+	public function write_start($table_prefix)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$sql_data = "#\n";
+		$sql_data .= "# phpBB Backup Script\n";
+		$sql_data .= "# Dump of tables for $table_prefix\n";
+		$sql_data .= "# DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
+		$sql_data .= "#\n";
+		$this->flush($sql_data);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function write_table($table_name)
+	{
+		static $new_extract;
+
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		if ($new_extract === null)
+		{
+			if ($this->db->get_sql_layer() === 'mysqli' || version_compare($this->db->sql_server_info(true), '3.23.20', '>='))
+			{
+				$new_extract = true;
+			}
+			else
+			{
+				$new_extract = false;
+			}
+		}
+
+		if ($new_extract)
+		{
+			$this->new_write_table($table_name);
+		}
+		else
+		{
+			$this->old_write_table($table_name);
+		}
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function write_data($table_name)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		if ($this->db->get_sql_layer() === 'mysqli')
+		{
+			$this->write_data_mysqli($table_name);
+		}
+		else
+		{
+			$this->write_data_mysql($table_name);
+		}
+	}
+
+	/**
+	* Extracts data from database table (for MySQLi driver)
+	*
+	* @param	string	$table_name	name of the database table
+	* @return null
+	* @throws \phpbb\db\extractor\exception\extractor_not_initialized_exception when calling this function before init_extractor()
+	*/
+	protected function write_data_mysqli($table_name)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$sql = "SELECT *
+			FROM $table_name";
+		$result = mysqli_query($this->db->get_db_connect_id(), $sql, MYSQLI_USE_RESULT);
+		if ($result != false)
+		{
+			$fields_cnt = mysqli_num_fields($result);
+
+			// Get field information
+			$field = mysqli_fetch_fields($result);
+			$field_set = array();
+
+			for ($j = 0; $j < $fields_cnt; $j++)
+			{
+				$field_set[] = $field[$j]->name;
+			}
+
+			$search			= array("\\", "'", "\x00", "\x0a", "\x0d", "\x1a", '"');
+			$replace		= array("\\\\", "\\'", '\0', '\n', '\r', '\Z', '\\"');
+			$fields			= implode(', ', $field_set);
+			$sql_data		= 'INSERT INTO ' . $table_name . ' (' . $fields . ') VALUES ';
+			$first_set		= true;
+			$query_len		= 0;
+			$max_len		= get_usable_memory();
+
+			while ($row = mysqli_fetch_row($result))
+			{
+				$values	= array();
+				if ($first_set)
+				{
+					$query = $sql_data . '(';
+				}
+				else
+				{
+					$query  .= ',(';
+				}
+
+				for ($j = 0; $j < $fields_cnt; $j++)
+				{
+					if (!isset($row[$j]) || is_null($row[$j]))
+					{
+						$values[$j] = 'NULL';
+					}
+					else if (($field[$j]->flags & 32768) && !($field[$j]->flags & 1024))
+					{
+						$values[$j] = $row[$j];
+					}
+					else
+					{
+						$values[$j] = "'" . str_replace($search, $replace, $row[$j]) . "'";
+					}
+				}
+				$query .= implode(', ', $values) . ')';
+
+				$query_len += strlen($query);
+				if ($query_len > $max_len)
+				{
+					$this->flush($query . ";\n\n");
+					$query = '';
+					$query_len = 0;
+					$first_set = true;
+				}
+				else
+				{
+					$first_set = false;
+				}
+			}
+			mysqli_free_result($result);
+
+			// check to make sure we have nothing left to flush
+			if (!$first_set && $query)
+			{
+				$this->flush($query . ";\n\n");
+			}
+		}
+	}
+
+	/**
+	* Extracts data from database table (for MySQL driver)
+	*
+	* @param	string	$table_name	name of the database table
+	* @return null
+	* @throws \phpbb\db\extractor\exception\extractor_not_initialized_exception when calling this function before init_extractor()
+	*/
+	protected function write_data_mysql($table_name)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$sql = "SELECT *
+			FROM $table_name";
+		$result = mysql_unbuffered_query($sql, $this->db->get_db_connect_id());
+
+		if ($result != false)
+		{
+			$fields_cnt = mysql_num_fields($result);
+
+			// Get field information
+			$field = array();
+			for ($i = 0; $i < $fields_cnt; $i++)
+			{
+				$field[] = mysql_fetch_field($result, $i);
+			}
+			$field_set = array();
+
+			for ($j = 0; $j < $fields_cnt; $j++)
+			{
+				$field_set[] = $field[$j]->name;
+			}
+
+			$search			= array("\\", "'", "\x00", "\x0a", "\x0d", "\x1a", '"');
+			$replace		= array("\\\\", "\\'", '\0', '\n', '\r', '\Z', '\\"');
+			$fields			= implode(', ', $field_set);
+			$sql_data		= 'INSERT INTO ' . $table_name . ' (' . $fields . ') VALUES ';
+			$first_set		= true;
+			$query_len		= 0;
+			$max_len		= get_usable_memory();
+
+			while ($row = mysql_fetch_row($result))
+			{
+				$values = array();
+				if ($first_set)
+				{
+					$query = $sql_data . '(';
+				}
+				else
+				{
+					$query  .= ',(';
+				}
+
+				for ($j = 0; $j < $fields_cnt; $j++)
+				{
+					if (!isset($row[$j]) || is_null($row[$j]))
+					{
+						$values[$j] = 'NULL';
+					}
+					else if ($field[$j]->numeric && ($field[$j]->type !== 'timestamp'))
+					{
+						$values[$j] = $row[$j];
+					}
+					else
+					{
+						$values[$j] = "'" . str_replace($search, $replace, $row[$j]) . "'";
+					}
+				}
+				$query .= implode(', ', $values) . ')';
+
+				$query_len += strlen($query);
+				if ($query_len > $max_len)
+				{
+					$this->flush($query . ";\n\n");
+					$query = '';
+					$query_len = 0;
+					$first_set = true;
+				}
+				else
+				{
+					$first_set = false;
+				}
+			}
+			mysql_free_result($result);
+
+			// check to make sure we have nothing left to flush
+			if (!$first_set && $query)
+			{
+				$this->flush($query . ";\n\n");
+			}
+		}
+	}
+
+	/**
+	* Extracts database table structure (for MySQLi or MySQL 3.23.20+)
+	*
+	* @param	string	$table_name	name of the database table
+	* @return null
+	* @throws \phpbb\db\extractor\exception\extractor_not_initialized_exception when calling this function before init_extractor()
+	*/
+	protected function new_write_table($table_name)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$sql = 'SHOW CREATE TABLE ' . $table_name;
+		$result = $this->db->sql_query($sql);
+		$row = $this->db->sql_fetchrow($result);
+
+		$sql_data = '# Table: ' . $table_name . "\n";
+		$sql_data .= "DROP TABLE IF EXISTS $table_name;\n";
+		$this->flush($sql_data . $row['Create Table'] . ";\n\n");
+
+		$this->db->sql_freeresult($result);
+	}
+
+	/**
+	* Extracts database table structure (for MySQL verisons older than 3.23.20)
+	*
+	* @param	string	$table_name	name of the database table
+	* @return null
+	* @throws \phpbb\db\extractor\exception\extractor_not_initialized_exception when calling this function before init_extractor()
+	*/
+	protected function old_write_table($table_name)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$sql_data = '# Table: ' . $table_name . "\n";
+		$sql_data .= "DROP TABLE IF EXISTS $table_name;\n";
+		$sql_data .= "CREATE TABLE $table_name(\n";
+		$rows = array();
+
+		$sql = "SHOW FIELDS
+			FROM $table_name";
+		$result = $this->db->sql_query($sql);
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$line = '   ' . $row['Field'] . ' ' . $row['Type'];
+
+			if (!is_null($row['Default']))
+			{
+				$line .= " DEFAULT '{$row['Default']}'";
+			}
+
+			if ($row['Null'] != 'YES')
+			{
+				$line .= ' NOT NULL';
+			}
+
+			if ($row['Extra'] != '')
+			{
+				$line .= ' ' . $row['Extra'];
+			}
+
+			$rows[] = $line;
+		}
+		$this->db->sql_freeresult($result);
+
+		$sql = "SHOW KEYS
+			FROM $table_name";
+
+		$result = $this->db->sql_query($sql);
+
+		$index = array();
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$kname = $row['Key_name'];
+
+			if ($kname != 'PRIMARY')
+			{
+				if ($row['Non_unique'] == 0)
+				{
+					$kname = "UNIQUE|$kname";
+				}
+			}
+
+			if ($row['Sub_part'])
+			{
+				$row['Column_name'] .= '(' . $row['Sub_part'] . ')';
+			}
+			$index[$kname][] = $row['Column_name'];
+		}
+		$this->db->sql_freeresult($result);
+
+		foreach ($index as $key => $columns)
+		{
+			$line = '   ';
+
+			if ($key == 'PRIMARY')
+			{
+				$line .= 'PRIMARY KEY (' . implode(', ', $columns) . ')';
+			}
+			else if (strpos($key, 'UNIQUE') === 0)
+			{
+				$line .= 'UNIQUE ' . substr($key, 7) . ' (' . implode(', ', $columns) . ')';
+			}
+			else if (strpos($key, 'FULLTEXT') === 0)
+			{
+				$line .= 'FULLTEXT ' . substr($key, 9) . ' (' . implode(', ', $columns) . ')';
+			}
+			else
+			{
+				$line .= "KEY $key (" . implode(', ', $columns) . ')';
+			}
+
+			$rows[] = $line;
+		}
+
+		$sql_data .= implode(",\n", $rows);
+		$sql_data .= "\n);\n\n";
+
+		$this->flush($sql_data);
+	}
+}
--- /dev/null
+++ b/phpbb/db/extractor/oracle_extractor.php
@@ -0,0 +1,263 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\extractor;
+
+use phpbb\db\extractor\exception\extractor_not_initialized_exception;
+
+class oracle_extractor extends base_extractor
+{
+	/**
+	* {@inheritdoc}
+	*/
+	public function write_table($table_name)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$sql_data = '-- Table: ' . $table_name . "\n";
+		$sql_data .= "DROP TABLE $table_name\n/\n";
+		$sql_data .= "\nCREATE TABLE $table_name (\n";
+
+		$sql = "SELECT COLUMN_NAME, DATA_TYPE, DATA_PRECISION, DATA_LENGTH, NULLABLE, DATA_DEFAULT
+			FROM ALL_TAB_COLS
+			WHERE table_name = '{$table_name}'";
+		$result = $this->db->sql_query($sql);
+
+		$rows = array();
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$line = '  "' . $row['column_name'] . '" ' . $row['data_type'];
+
+			if ($row['data_type'] !== 'CLOB')
+			{
+				if ($row['data_type'] !== 'VARCHAR2' && $row['data_type'] !== 'CHAR')
+				{
+					$line .= '(' . $row['data_precision'] . ')';
+				}
+				else
+				{
+					$line .= '(' . $row['data_length'] . ')';
+				}
+			}
+
+			if (!empty($row['data_default']))
+			{
+				$line .= ' DEFAULT ' . $row['data_default'];
+			}
+
+			if ($row['nullable'] == 'N')
+			{
+				$line .= ' NOT NULL';
+			}
+			$rows[] = $line;
+		}
+		$this->db->sql_freeresult($result);
+
+		$sql = "SELECT A.CONSTRAINT_NAME, A.COLUMN_NAME
+			FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B
+			WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
+				AND B.CONSTRAINT_TYPE = 'P'
+				AND A.TABLE_NAME = '{$table_name}'";
+		$result = $this->db->sql_query($sql);
+
+		$primary_key = array();
+		$constraint_name = '';
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$constraint_name = '"' . $row['constraint_name'] . '"';
+			$primary_key[] = '"' . $row['column_name'] . '"';
+		}
+		$this->db->sql_freeresult($result);
+
+		if (sizeof($primary_key))
+		{
+			$rows[] = "  CONSTRAINT {$constraint_name} PRIMARY KEY (" . implode(', ', $primary_key) . ')';
+		}
+
+		$sql = "SELECT A.CONSTRAINT_NAME, A.COLUMN_NAME
+			FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B
+			WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
+				AND B.CONSTRAINT_TYPE = 'U'
+				AND A.TABLE_NAME = '{$table_name}'";
+		$result = $this->db->sql_query($sql);
+
+		$unique = array();
+		$constraint_name = '';
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$constraint_name = '"' . $row['constraint_name'] . '"';
+			$unique[] = '"' . $row['column_name'] . '"';
+		}
+		$this->db->sql_freeresult($result);
+
+		if (sizeof($unique))
+		{
+			$rows[] = "  CONSTRAINT {$constraint_name} UNIQUE (" . implode(', ', $unique) . ')';
+		}
+
+		$sql_data .= implode(",\n", $rows);
+		$sql_data .= "\n)\n/\n";
+
+		$sql = "SELECT A.REFERENCED_NAME, C.*
+			FROM USER_DEPENDENCIES A, USER_TRIGGERS B, USER_SEQUENCES C
+			WHERE A.REFERENCED_TYPE = 'SEQUENCE'
+				AND A.NAME = B.TRIGGER_NAME
+				AND B.TABLE_NAME = '{$table_name}'
+				AND C.SEQUENCE_NAME = A.REFERENCED_NAME";
+		$result = $this->db->sql_query($sql);
+
+		$type = $this->request->variable('type', '');
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$sql_data .= "\nDROP SEQUENCE \"{$row['referenced_name']}\"\n/\n";
+			$sql_data .= "\nCREATE SEQUENCE \"{$row['referenced_name']}\"";
+
+			if ($type == 'full')
+			{
+				$sql_data .= ' START WITH ' . $row['last_number'];
+			}
+
+			$sql_data .= "\n/\n";
+		}
+		$this->db->sql_freeresult($result);
+
+		$sql = "SELECT DESCRIPTION, WHEN_CLAUSE, TRIGGER_BODY
+			FROM USER_TRIGGERS
+			WHERE TABLE_NAME = '{$table_name}'";
+		$result = $this->db->sql_query($sql);
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$sql_data .= "\nCREATE OR REPLACE TRIGGER {$row['description']}WHEN ({$row['when_clause']})\n{$row['trigger_body']}\n/\n";
+		}
+		$this->db->sql_freeresult($result);
+
+		$sql = "SELECT A.INDEX_NAME, B.COLUMN_NAME
+			FROM USER_INDEXES A, USER_IND_COLUMNS B
+			WHERE A.UNIQUENESS = 'NONUNIQUE'
+				AND A.INDEX_NAME = B.INDEX_NAME
+				AND B.TABLE_NAME = '{$table_name}'";
+		$result = $this->db->sql_query($sql);
+
+		$index = array();
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$index[$row['index_name']][] = $row['column_name'];
+		}
+
+		foreach ($index as $index_name => $column_names)
+		{
+			$sql_data .= "\nCREATE INDEX $index_name ON $table_name(" . implode(', ', $column_names) . ")\n/\n";
+		}
+		$this->db->sql_freeresult($result);
+		$this->flush($sql_data);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function write_data($table_name)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$ary_type = $ary_name = array();
+
+		// Grab all of the data from current table.
+		$sql = "SELECT *
+			FROM $table_name";
+		$result = $this->db->sql_query($sql);
+
+		$i_num_fields = ocinumcols($result);
+
+		for ($i = 0; $i < $i_num_fields; $i++)
+		{
+			$ary_type[$i] = ocicolumntype($result, $i + 1);
+			$ary_name[$i] = ocicolumnname($result, $i + 1);
+		}
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$schema_vals = $schema_fields = array();
+
+			// Build the SQL statement to recreate the data.
+			for ($i = 0; $i < $i_num_fields; $i++)
+			{
+				// Oracle uses uppercase - we use lowercase
+				$str_val = $row[strtolower($ary_name[$i])];
+
+				if (preg_match('#char|text|bool|raw|clob#i', $ary_type[$i]))
+				{
+					$str_quote = '';
+					$str_empty = "''";
+					$str_val = sanitize_data_oracle($str_val);
+				}
+				else if (preg_match('#date|timestamp#i', $ary_type[$i]))
+				{
+					if (empty($str_val))
+					{
+						$str_quote = '';
+					}
+					else
+					{
+						$str_quote = "'";
+					}
+				}
+				else
+				{
+					$str_quote = '';
+					$str_empty = 'NULL';
+				}
+
+				if (empty($str_val) && $str_val !== '0')
+				{
+					$str_val = $str_empty;
+				}
+
+				$schema_vals[$i] = $str_quote . $str_val . $str_quote;
+				$schema_fields[$i] = '"' . $ary_name[$i] . '"';
+			}
+
+			// Take the ordered fields and their associated data and build it
+			// into a valid sql statement to recreate that field in the data.
+			$sql_data = "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ")\n/\n";
+
+			$this->flush($sql_data);
+		}
+		$this->db->sql_freeresult($result);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function write_start($table_prefix)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$sql_data = "--\n";
+		$sql_data .= "-- phpBB Backup Script\n";
+		$sql_data .= "-- Dump of tables for $table_prefix\n";
+		$sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
+		$sql_data .= "--\n";
+		$this->flush($sql_data);
+	}
+}
--- /dev/null
+++ b/phpbb/db/extractor/postgres_extractor.php
@@ -0,0 +1,339 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\extractor;
+
+use phpbb\db\extractor\exception\extractor_not_initialized_exception;
+
+class postgres_extractor extends base_extractor
+{
+	/**
+	* {@inheritdoc}
+	*/
+	public function write_start($table_prefix)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$sql_data = "--\n";
+		$sql_data .= "-- phpBB Backup Script\n";
+		$sql_data .= "-- Dump of tables for $table_prefix\n";
+		$sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
+		$sql_data .= "--\n";
+		$sql_data .= "BEGIN TRANSACTION;\n";
+		$this->flush($sql_data);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function write_table($table_name)
+	{
+		static $domains_created = array();
+
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$sql = "SELECT a.domain_name, a.data_type, a.character_maximum_length, a.domain_default
+			FROM INFORMATION_SCHEMA.domains a, INFORMATION_SCHEMA.column_domain_usage b
+			WHERE a.domain_name = b.domain_name
+				AND b.table_name = '{$table_name}'";
+		$result = $this->db->sql_query($sql);
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			if (empty($domains_created[$row['domain_name']]))
+			{
+				$domains_created[$row['domain_name']] = true;
+				//$sql_data = "DROP DOMAIN {$row['domain_name']};\n";
+				$sql_data = "CREATE DOMAIN {$row['domain_name']} as {$row['data_type']}";
+				if (!empty($row['character_maximum_length']))
+				{
+					$sql_data .= '(' . $row['character_maximum_length'] . ')';
+				}
+				$sql_data .= ' NOT NULL';
+				if (!empty($row['domain_default']))
+				{
+					$sql_data .= ' DEFAULT ' . $row['domain_default'];
+				}
+				$this->flush($sql_data . ";\n");
+			}
+		}
+		$this->db->sql_freeresult($result);
+
+		$sql_data = '-- Table: ' . $table_name . "\n";
+		$sql_data .= "DROP TABLE $table_name;\n";
+		// PGSQL does not "tightly" bind sequences and tables, we must guess...
+		$sql = "SELECT relname
+			FROM pg_class
+			WHERE relkind = 'S'
+				AND relname = '{$table_name}_seq'";
+		$result = $this->db->sql_query($sql);
+		// We don't even care about storing the results. We already know the answer if we get rows back.
+		if ($this->db->sql_fetchrow($result))
+		{
+			$sql_data .= "DROP SEQUENCE {$table_name}_seq;\n";
+			$sql_data .= "CREATE SEQUENCE {$table_name}_seq;\n";
+		}
+		$this->db->sql_freeresult($result);
+
+		$field_query = "SELECT a.attnum, a.attname as field, t.typname as type, a.attlen as length, a.atttypmod as lengthvar, a.attnotnull as notnull
+			FROM pg_class c, pg_attribute a, pg_type t
+			WHERE c.relname = '" . $this->db->sql_escape($table_name) . "'
+				AND a.attnum > 0
+				AND a.attrelid = c.oid
+				AND a.atttypid = t.oid
+			ORDER BY a.attnum";
+		$result = $this->db->sql_query($field_query);
+
+		$sql_data .= "CREATE TABLE $table_name(\n";
+		$lines = array();
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			// Get the data from the table
+			$sql_get_default = "SELECT pg_get_expr(d.adbin, d.adrelid) as rowdefault
+				FROM pg_attrdef d, pg_class c
+				WHERE (c.relname = '" . $this->db->sql_escape($table_name) . "')
+					AND (c.oid = d.adrelid)
+					AND d.adnum = " . $row['attnum'];
+			$def_res = $this->db->sql_query($sql_get_default);
+			$def_row = $this->db->sql_fetchrow($def_res);
+			$this->db->sql_freeresult($def_res);
+
+			if (empty($def_row))
+			{
+				unset($row['rowdefault']);
+			}
+			else
+			{
+				$row['rowdefault'] = $def_row['rowdefault'];
+			}
+
+			if ($row['type'] == 'bpchar')
+			{
+				// Internally stored as bpchar, but isn't accepted in a CREATE TABLE statement.
+				$row['type'] = 'char';
+			}
+
+			$line = '  ' . $row['field'] . ' ' . $row['type'];
+
+			if (strpos($row['type'], 'char') !== false)
+			{
+				if ($row['lengthvar'] > 0)
+				{
+					$line .= '(' . ($row['lengthvar'] - 4) . ')';
+				}
+			}
+
+			if (strpos($row['type'], 'numeric') !== false)
+			{
+				$line .= '(';
+				$line .= sprintf("%s,%s", (($row['lengthvar'] >> 16) & 0xffff), (($row['lengthvar'] - 4) & 0xffff));
+				$line .= ')';
+			}
+
+			if (isset($row['rowdefault']))
+			{
+				$line .= ' DEFAULT ' . $row['rowdefault'];
+			}
+
+			if ($row['notnull'] == 't')
+			{
+				$line .= ' NOT NULL';
+			}
+
+			$lines[] = $line;
+		}
+		$this->db->sql_freeresult($result);
+
+		// Get the listing of primary keys.
+		$sql_pri_keys = "SELECT ic.relname as index_name, bc.relname as tab_name, ta.attname as column_name, i.indisunique as unique_key, i.indisprimary as primary_key
+			FROM pg_class bc, pg_class ic, pg_index i, pg_attribute ta, pg_attribute ia
+			WHERE (bc.oid = i.indrelid)
+				AND (ic.oid = i.indexrelid)
+				AND (ia.attrelid = i.indexrelid)
+				AND	(ta.attrelid = bc.oid)
+				AND (bc.relname = '" . $this->db->sql_escape($table_name) . "')
+				AND (ta.attrelid = i.indrelid)
+				AND (ta.attnum = i.indkey[ia.attnum-1])
+			ORDER BY index_name, tab_name, column_name";
+
+		$result = $this->db->sql_query($sql_pri_keys);
+
+		$index_create = $index_rows = $primary_key = array();
+
+		// We do this in two steps. It makes placing the comma easier
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			if ($row['primary_key'] == 't')
+			{
+				$primary_key[] = $row['column_name'];
+				$primary_key_name = $row['index_name'];
+			}
+			else
+			{
+				// We have to store this all this info because it is possible to have a multi-column key...
+				// we can loop through it again and build the statement
+				$index_rows[$row['index_name']]['table'] = $table_name;
+				$index_rows[$row['index_name']]['unique'] = ($row['unique_key'] == 't') ? true : false;
+				$index_rows[$row['index_name']]['column_names'][] = $row['column_name'];
+			}
+		}
+		$this->db->sql_freeresult($result);
+
+		if (!empty($index_rows))
+		{
+			foreach ($index_rows as $idx_name => $props)
+			{
+				$index_create[] = 'CREATE ' . ($props['unique'] ? 'UNIQUE ' : '') . "INDEX $idx_name ON $table_name (" . implode(', ', $props['column_names']) . ");";
+			}
+		}
+
+		if (!empty($primary_key))
+		{
+			$lines[] = "  CONSTRAINT $primary_key_name PRIMARY KEY (" . implode(', ', $primary_key) . ")";
+		}
+
+		// Generate constraint clauses for CHECK constraints
+		$sql_checks = "SELECT conname as index_name, consrc
+			FROM pg_constraint, pg_class bc
+			WHERE conrelid = bc.oid
+				AND bc.relname = '" . $this->db->sql_escape($table_name) . "'
+				AND NOT EXISTS (
+					SELECT *
+						FROM pg_constraint as c, pg_inherits as i
+						WHERE i.inhrelid = pg_constraint.conrelid
+							AND c.conname = pg_constraint.conname
+							AND c.consrc = pg_constraint.consrc
+							AND c.conrelid = i.inhparent
+				)";
+		$result = $this->db->sql_query($sql_checks);
+
+		// Add the constraints to the sql file.
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			if (!is_null($row['consrc']))
+			{
+				$lines[] = '  CONSTRAINT ' . $row['index_name'] . ' CHECK ' . $row['consrc'];
+			}
+		}
+		$this->db->sql_freeresult($result);
+
+		$sql_data .= implode(", \n", $lines);
+		$sql_data .= "\n);\n";
+
+		if (!empty($index_create))
+		{
+			$sql_data .= implode("\n", $index_create) . "\n\n";
+		}
+		$this->flush($sql_data);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function write_data($table_name)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		// Grab all of the data from current table.
+		$sql = "SELECT *
+			FROM $table_name";
+		$result = $this->db->sql_query($sql);
+
+		$i_num_fields = pg_num_fields($result);
+		$seq = '';
+
+		for ($i = 0; $i < $i_num_fields; $i++)
+		{
+			$ary_type[] = pg_field_type($result, $i);
+			$ary_name[] = pg_field_name($result, $i);
+
+			$sql = "SELECT pg_get_expr(d.adbin, d.adrelid) as rowdefault
+				FROM pg_attrdef d, pg_class c
+				WHERE (c.relname = '{$table_name}')
+					AND (c.oid = d.adrelid)
+					AND d.adnum = " . strval($i + 1);
+			$result2 = $this->db->sql_query($sql);
+			if ($row = $this->db->sql_fetchrow($result2))
+			{
+				// Determine if we must reset the sequences
+				if (strpos($row['rowdefault'], "nextval('") === 0)
+				{
+					$seq .= "SELECT SETVAL('{$table_name}_seq',(select case when max({$ary_name[$i]})>0 then max({$ary_name[$i]})+1 else 1 end FROM {$table_name}));\n";
+				}
+			}
+		}
+
+		$this->flush("COPY $table_name (" . implode(', ', $ary_name) . ') FROM stdin;' . "\n");
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$schema_vals = array();
+
+			// Build the SQL statement to recreate the data.
+			for ($i = 0; $i < $i_num_fields; $i++)
+			{
+				$str_val = $row[$ary_name[$i]];
+
+				if (preg_match('#char|text|bool|bytea#i', $ary_type[$i]))
+				{
+					$str_val = str_replace(array("\n", "\t", "\r", "\b", "\f", "\v"), array('\n', '\t', '\r', '\b', '\f', '\v'), addslashes($str_val));
+					$str_empty = '';
+				}
+				else
+				{
+					$str_empty = '\N';
+				}
+
+				if (empty($str_val) && $str_val !== '0')
+				{
+					$str_val = $str_empty;
+				}
+
+				$schema_vals[] = $str_val;
+			}
+
+			// Take the ordered fields and their associated data and build it
+			// into a valid sql statement to recreate that field in the data.
+			$this->flush(implode("\t", $schema_vals) . "\n");
+		}
+		$this->db->sql_freeresult($result);
+		$this->flush("\\.\n");
+
+		// Write out the sequence statements
+		$this->flush($seq);
+	}
+
+	/**
+	* Writes closing line(s) to database backup
+	*
+	* @return null
+	* @throws \phpbb\db\extractor\exception\extractor_not_initialized_exception when calling this function before init_extractor()
+	*/
+	public function write_end()
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$this->flush("COMMIT;\n");
+		parent::write_end();
+	}
+}
--- /dev/null
+++ b/phpbb/db/extractor/sqlite3_extractor.php
@@ -0,0 +1,151 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\extractor;
+
+use phpbb\db\extractor\exception\extractor_not_initialized_exception;
+
+class sqlite3_extractor extends base_extractor
+{
+	/**
+	* {@inheritdoc}
+	*/
+	public function write_start($table_prefix)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$sql_data = "--\n";
+		$sql_data .= "-- phpBB Backup Script\n";
+		$sql_data .= "-- Dump of tables for $table_prefix\n";
+		$sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
+		$sql_data .= "--\n";
+		$sql_data .= "BEGIN TRANSACTION;\n";
+		$this->flush($sql_data);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function write_table($table_name)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$sql_data = '-- Table: ' . $table_name . "\n";
+		$sql_data .= "DROP TABLE $table_name;\n";
+
+		$sql = "SELECT sql
+			FROM sqlite_master
+			WHERE type = 'table'
+				AND name = '" . $this->db->sql_escape($table_name) . "'
+			ORDER BY name ASC;";
+		$result = $this->db->sql_query($sql);
+		$row = $this->db->sql_fetchrow($result);
+		$this->db->sql_freeresult($result);
+
+		// Create Table
+		$sql_data .= $row['sql'] . ";\n";
+
+		$result = $this->db->sql_query("PRAGMA index_list('" . $this->db->sql_escape($table_name) . "');");
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			if (strpos($row['name'], 'autoindex') !== false)
+			{
+				continue;
+			}
+
+			$result2 = $this->db->sql_query("PRAGMA index_info('" . $this->db->sql_escape($row['name']) . "');");
+
+			$fields = array();
+			while ($row2 = $this->db->sql_fetchrow($result2))
+			{
+				$fields[] = $row2['name'];
+			}
+			$this->db->sql_freeresult($result2);
+
+			$sql_data .= 'CREATE ' . ($row['unique'] ? 'UNIQUE ' : '') . 'INDEX ' . $row['name'] . ' ON ' . $table_name . ' (' . implode(', ', $fields) . ");\n";
+		}
+		$this->db->sql_freeresult($result);
+
+		$this->flush($sql_data . "\n");
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function write_data($table_name)
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$result = $this->db->sql_query("PRAGMA table_info('" . $this->db->sql_escape($table_name) . "');");
+
+		$col_types = array();
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$col_types[$row['name']] = $row['type'];
+		}
+		$this->db->sql_freeresult($result);
+
+		$sql_insert = 'INSERT INTO ' . $table_name . ' (' . implode(', ', array_keys($col_types)) . ') VALUES (';
+
+		$sql = "SELECT *
+			FROM $table_name";
+		$result = $this->db->sql_query($sql);
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			foreach ($row as $column_name => $column_data)
+			{
+				if (is_null($column_data))
+				{
+					$row[$column_name] = 'NULL';
+				}
+				else if ($column_data === '')
+				{
+					$row[$column_name] = "''";
+				}
+				else if (stripos($col_types[$column_name], 'text') !== false || stripos($col_types[$column_name], 'char') !== false || stripos($col_types[$column_name], 'blob') !== false)
+				{
+					$row[$column_name] = sanitize_data_generic(str_replace("'", "''", $column_data));
+				}
+			}
+			$this->flush($sql_insert . implode(', ', $row) . ");\n");
+		}
+	}
+
+	/**
+	* Writes closing line(s) to database backup
+	*
+	* @return null
+	* @throws \phpbb\db\extractor\exception\extractor_not_initialized_exception when calling this function before init_extractor()
+	*/
+	public function write_end()
+	{
+		if (!$this->is_initialized)
+		{
+			throw new extractor_not_initialized_exception();
+		}
+
+		$this->flush("COMMIT;\n");
+		parent::write_end();
+	}
+}
--- a/phpbb/db/migration/data/v30x/release_3_0_5_rc1.php
+++ b/phpbb/db/migration/data/v30x/release_3_0_5_rc1.php
@@ -57,7 +57,9 @@ class release_3_0_5_rc1 extends container_aware_migration
 
 	public function hash_old_passwords()
 	{
+		/* @var $passwords_manager \phpbb\passwords\manager */
 		$passwords_manager = $this->container->get('passwords.manager');
+
 		$sql = 'SELECT user_id, user_password
 				FROM ' . $this->table_prefix . 'users
 				WHERE user_pass_convert = 1';
@@ -116,7 +118,7 @@ class release_3_0_5_rc1 extends container_aware_migration
 				$result = $this->db->sql_query($sql);
 
 				// Skip first row, this is our original auth option we want to preserve
-				$row = $this->db->sql_fetchrow($result);
+				$this->db->sql_fetchrow($result);
 
 				while ($row = $this->db->sql_fetchrow($result))
 				{
--- a/phpbb/db/migration/data/v30x/release_3_0_9_rc1.php
+++ b/phpbb/db/migration/data/v30x/release_3_0_9_rc1.php
@@ -34,7 +34,7 @@ class release_3_0_9_rc1 extends \phpbb\db\migration\migration
 						// this column was removed from the database updater
 						// after 3.0.9-RC3 was released. It might still exist
 						// in 3.0.9-RCX installations and has to be dropped as
-						// soon as the db_tools class is capable of properly
+						// soon as the \phpbb\db\tools\tools class is capable of properly
 						// removing a primary key.
 						// 'attempt_id'			=> array('UINT', NULL, 'auto_increment'),
 						'attempt_ip'			=> array('VCHAR:40', ''),
--- a/phpbb/db/migration/data/v310/acp_prune_users_module.php
+++ b/phpbb/db/migration/data/v310/acp_prune_users_module.php
@@ -13,7 +13,7 @@
 
 namespace phpbb\db\migration\data\v310;
 
-class acp_prune_users_module extends \phpbb\db\migration\migration
+class acp_prune_users_module extends \phpbb\db\migration\container_aware_migration
 {
 	public function effectively_installed()
 	{
@@ -70,12 +70,7 @@ class acp_prune_users_module extends \phpbb\db\migration\migration
 		$acp_cat_users_id = (int) $this->db->sql_fetchfield('module_id');
 		$this->db->sql_freeresult($result);
 
-		if (!class_exists('\acp_modules'))
-		{
-			include($this->phpbb_root_path . 'includes/acp/acp_modules.' . $this->php_ext);
-		}
-		$module_manager = new \acp_modules();
-		$module_manager->module_class = 'acp';
-		$module_manager->move_module($acp_prune_users_id, $acp_cat_users_id);
+		$module_manager = $this->container->get('module.manager');
+		$module_manager->move_module($acp_prune_users_id, $acp_cat_users_id, 'acp');
 	}
 }
--- a/phpbb/db/migration/data/v310/dev.php
+++ b/phpbb/db/migration/data/v310/dev.php
@@ -13,7 +13,7 @@
 
 namespace phpbb\db\migration\data\v310;
 
-class dev extends \phpbb\db\migration\migration
+class dev extends \phpbb\db\migration\container_aware_migration
 {
 	public function effectively_installed()
 	{
@@ -204,18 +204,13 @@ class dev extends \phpbb\db\migration\migration
 		$language_management_module_id = $this->db->sql_fetchfield('module_id');
 		$this->db->sql_freeresult($result);
 
-		if (!class_exists('acp_modules'))
-		{
-			include($this->phpbb_root_path . 'includes/acp/acp_modules.' . $this->php_ext);
-		}
 		// acp_modules calls adm_back_link, which is undefined at this point
 		if (!function_exists('adm_back_link'))
 		{
 			include($this->phpbb_root_path . 'includes/functions_acp.' . $this->php_ext);
 		}
-		$module_manager = new \acp_modules();
-		$module_manager->module_class = 'acp';
-		$module_manager->move_module($language_module_id, $language_management_module_id);
+		$module_manager = $this->container->get('module.manager');
+		$module_manager->move_module($language_module_id, $language_management_module_id, 'acp');
 	}
 
 	public function update_ucp_pm_basename()
--- a/phpbb/db/migration/data/v310/notification_options_reconvert.php
+++ b/phpbb/db/migration/data/v310/notification_options_reconvert.php
@@ -52,6 +52,7 @@ class notification_options_reconvert extends \phpbb\db\migration\migration
 	{
 		$limit = 250;
 		$converted_users = 0;
+		$start = $start ?: 0;
 
 		$sql = 'SELECT user_id, user_notify_type, user_notify_pm
 			FROM ' . $this->table_prefix . 'users
--- a/phpbb/db/migration/data/v310/timezone.php
+++ b/phpbb/db/migration/data/v310/timezone.php
@@ -103,7 +103,7 @@ class timezone extends \phpbb\db\migration\migration
 	*/
 	public function convert_phpbb30_timezone($timezone, $dst)
 	{
-		$offset = $timezone + $dst;
+		$offset = (float) $timezone + (int) $dst;
 
 		switch ($timezone)
 		{
--- /dev/null
+++ b/phpbb/db/migration/data/v31x/increase_size_of_emotion.php
@@ -0,0 +1,46 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v31x;
+
+class increase_size_of_emotion  extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v31x\v3110',
+		);
+	}
+
+	public function update_schema()
+	{
+		return array(
+			'change_columns' => array(
+				$this->table_prefix . 'smilies' => array(
+					'emotion'	=> array('VCHAR_UNI', ''),
+				),
+			),
+		);
+	}
+
+	public function revert_schema()
+	{
+		return array(
+			'change_columns' => array(
+				$this->table_prefix . 'smilies' => array(
+					'emotion'	=> array('VCHAR_UNI:50', ''),
+				),
+			),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v31x/remove_duplicate_migrations.php
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\db\migration\data\v31x;
+
+class remove_duplicate_migrations extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array('\phpbb\db\migration\data\v31x\v3110');
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('custom', array(array($this, 'deduplicate_entries'))),
+		);
+	}
+
+	public function deduplicate_entries()
+	{
+		$migration_state = array();
+		$duplicate_migrations = array();
+
+		$sql = "SELECT *
+			FROM " . $this->table_prefix . 'migrations';
+		$result = $this->db->sql_query($sql);
+
+		if (!$this->db->get_sql_error_triggered())
+		{
+			while ($migration = $this->db->sql_fetchrow($result))
+			{
+				$migration_state[$migration['migration_name']] = $migration;
+
+				$migration_state[$migration['migration_name']]['migration_depends_on'] = unserialize($migration['migration_depends_on']);
+			}
+		}
+
+		$this->db->sql_freeresult($result);
+
+		foreach ($migration_state as $name => $migration)
+		{
+			$prepended_name = ($name[0] == '\\' ? '' : '\\') . $name;
+			$prefixless_name = $name[0] == '\\' ? substr($name, 1) : $name;
+
+			if ($prepended_name != $name && isset($migration_state[$prepended_name]) && $migration_state[$prepended_name]['migration_depends_on'] == $migration_state[$name]['migration_depends_on'])
+			{
+				$duplicate_migrations[] = $name;
+				unset($migration_state[$prepended_name]);
+			}
+			else if ($prefixless_name != $name && isset($migration_state[$prefixless_name]) && $migration_state[$prefixless_name]['migration_depends_on'] == $migration_state[$name]['migration_depends_on'])
+			{
+				$duplicate_migrations[] = $prefixless_name;
+				unset($migration_state[$prefixless_name]);
+			}
+		}
+
+		if (count($duplicate_migrations))
+		{
+			$sql = 'DELETE
+				FROM ' . $this->table_prefix . 'migrations
+				WHERE '  . $this->db->sql_in_set('migration_name', $duplicate_migrations);
+			$this->db->sql_query($sql);
+		}
+	}
+}
--- a/phpbb/db/migration/data/v31x/update_custom_bbcodes_with_idn.php
+++ b/phpbb/db/migration/data/v31x/update_custom_bbcodes_with_idn.php
@@ -45,7 +45,6 @@ class update_custom_bbcodes_with_idn extends \phpbb\db\migration\migration
 		$sql_ary = array();
 		while ($row = $this->db->sql_fetchrow($result))
 		{
-			$data = array();
 			if (preg_match('/(URL|LOCAL_URL|RELATIVE_URL)/', $row['bbcode_match']))
 			{
 				$data = $bbcodes->build_regexp($row['bbcode_match'], $row['bbcode_tpl']);
--- /dev/null
+++ b/phpbb/db/migration/data/v320/add_help_phpbb.php
@@ -0,0 +1,50 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class add_help_phpbb extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v320\v320rc1',
+		);
+	}
+
+	public function effectively_installed()
+	{
+		return isset($this->config['help_send_statistics']);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.add', array('help_send_statistics', true)),
+			array('config.add', array('help_send_statistics_time', 0)),
+			array('module.remove', array(
+				'acp',
+				false,
+				'ACP_SEND_STATISTICS',
+			)),
+			array('module.add', array(
+				'acp',
+				'ACP_SERVER_CONFIGURATION',
+				array(
+					'module_basename'	=> 'acp_help_phpbb',
+					'modes'				=> array('help_phpbb'),
+				),
+			)),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/allowed_schemes_links.php
@@ -0,0 +1,31 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class allowed_schemes_links extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v320\dev',
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.add', array('allowed_schemes_links', 'http,https,ftp')),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/announce_global_permission.php
@@ -0,0 +1,43 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class announce_global_permission extends \phpbb\db\migration\migration
+{
+	public function effectively_installed()
+	{
+		$sql = 'SELECT auth_option_id
+			FROM ' . ACL_OPTIONS_TABLE . "
+			WHERE auth_option = 'f_announce_global'";
+		$result = $this->db->sql_query($sql);
+		$auth_option_id = $this->db->sql_fetchfield('auth_option_id');
+		$this->db->sql_freeresult($result);
+
+		return $auth_option_id !== false;
+	}
+
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v320\dev',
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('permission.add', array('f_announce_global', false, 'f_announce')),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/cookie_notice.php
@@ -0,0 +1,31 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class cookie_notice extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v320\v320rc2',
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.add', array('cookie_notice', false)),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/default_data_type_ids.php
@@ -0,0 +1,361 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class default_data_type_ids extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v320\v320a2',
+			'\phpbb\db\migration\data\v320\oauth_states',
+		);
+	}
+
+	public function update_schema()
+	{
+		return array(
+			'change_columns'	=> array(
+				$this->table_prefix . 'acl_users'			=> array(
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'attachments'			=> array(
+					'attach_id'		=> array('ULINT', null, 'auto_increment'),
+					'post_msg_id'	=> array('ULINT', 0),
+					'poster_id'		=> array('ULINT', 0),
+					'topic_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'banlist'				=> array(
+					'ban_id'		=> array('ULINT', null, 'auto_increment'),
+					'ban_userid'	=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'bookmarks'			=> array(
+					'topic_id'		=> array('ULINT', 0),
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'bots'				=> array(
+					'bot_id'		=> array('ULINT', null, 'auto_increment'),
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'drafts'				=> array(
+					'draft_id'		=> array('ULINT', null, 'auto_increment'),
+					'user_id'		=> array('ULINT', 0),
+					'topic_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'forums'				=> array(
+					'forum_last_post_id'	=> array('ULINT', 0),
+					'forum_last_poster_id'	=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'forums_access'		=> array(
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'forums_track'		=> array(
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'forums_watch'		=> array(
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'log'					=> array(
+					'log_id'		=> array('ULINT', null, 'auto_increment'),
+					'post_id'		=> array('ULINT', 0),
+					'reportee_id'	=> array('ULINT', 0),
+					'user_id'		=> array('ULINT', 0),
+					'topic_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'login_attempts'		=> array(
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'moderator_cache'		=> array(
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'notifications'		=> array(
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'oauth_accounts'		=> array(
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'oauth_states'		=> array(
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'oauth_tokens'		=> array(
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'poll_options'		=> array(
+					'topic_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'poll_votes'			=> array(
+					'topic_id'		=> array('ULINT', 0),
+					'vote_user_id'	=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'posts'				=> array(
+					'post_id'			=> array('ULINT', null, 'auto_increment'),
+					'poster_id'			=> array('ULINT', 0),
+					'post_delete_user'	=> array('ULINT', 0),
+					'post_edit_user'	=> array('ULINT', 0),
+					'topic_id'			=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'privmsgs'			=> array(
+					'author_id'			=> array('ULINT', 0),
+					'message_edit_user'	=> array('ULINT', 0),
+					'msg_id'			=> array('ULINT', null, 'auto_increment'),
+				),
+				$this->table_prefix . 'privmsgs_folder'		=> array(
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'privmsgs_rules'		=> array(
+					'rule_user_id'	=> array('ULINT', 0),
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'privmsgs_to'			=> array(
+					'author_id'		=> array('ULINT', 0),
+					'msg_id'		=> array('ULINT', 0),
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'profile_fields_data'	=> array(
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'reports'				=> array(
+					'report_id'		=> array('ULINT', 0),
+					'pm_id'			=> array('ULINT', 0),
+					'post_id'		=> array('ULINT', 0),
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'search_wordlist'		=> array(
+					'word_id'		=> array('ULINT', null, 'auto_increment'),
+				),
+				$this->table_prefix . 'search_wordmatch'	=> array(
+					'post_id'		=> array('ULINT', 0),
+					'word_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'sessions'			=> array(
+					'session_user_id'	=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'sessions_keys'		=> array(
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'topics'				=> array(
+					'topic_id'				=> array('ULINT', null, 'auto_increment'),
+					'topic_poster'			=> array('ULINT', 0),
+					'topic_first_post_id'	=> array('ULINT', 0),
+					'topic_last_post_id'	=> array('ULINT', 0),
+					'topic_last_poster_id'	=> array('ULINT', 0),
+					'topic_moved_id'		=> array('ULINT', 0),
+					'topic_delete_user'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'topics_track'		=> array(
+					'user_id'		=> array('ULINT', 0),
+					'topic_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'topics_posted'		=> array(
+					'user_id'		=> array('ULINT', 0),
+					'topic_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'topics_watch'		=> array(
+					'user_id'		=> array('ULINT', 0),
+					'topic_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'user_notifications'	=> array(
+					'item_id'		=> array('ULINT', 0),
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'user_group'			=> array(
+					'user_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'users'				=> array(
+					'user_id'		=> array('ULINT', null, 'auto_increment'),
+				),
+				$this->table_prefix . 'warnings'			=> array(
+					'log_id'		=> array('ULINT', 0),
+					'user_id'		=> array('ULINT', 0),
+					'post_id'		=> array('ULINT', 0),
+				),
+				$this->table_prefix . 'words'				=> array(
+					'word_id'		=> array('ULINT', null, 'auto_increment'),
+				),
+				$this->table_prefix . 'zebra'			=> array(
+					'user_id'		=> array('ULINT', 0),
+					'zebra_id'		=> array('ULINT', 0),
+				),
+			),
+		);
+	}
+
+	public function revert_schema()
+	{
+		return array(
+			'change_columns'	=> array(
+				$this->table_prefix . 'acl_users'			=> array(
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'attachments'			=> array(
+					'attach_id'		=> array('UINT', null, 'auto_increment'),
+					'post_msg_id'	=> array('UINT', 0),
+					'poster_id'		=> array('UINT', 0),
+					'topic_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'banlist'				=> array(
+					'ban_id'		=> array('UINT', null, 'auto_increment'),
+					'ban_userid'	=> array('UINT', 0),
+				),
+				$this->table_prefix . 'bookmarks'			=> array(
+					'topic_id'		=> array('UINT', 0),
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'bots'				=> array(
+					'bot_id'		=> array('UINT', null, 'auto_increment'),
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'drafts'				=> array(
+					'draft_id'		=> array('UINT', null, 'auto_increment'),
+					'user_id'		=> array('UINT', 0),
+					'topic_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'forums'				=> array(
+					'forum_last_post_id'	=> array('UINT', 0),
+					'forum_last_poster_id'	=> array('UINT', 0),
+				),
+				$this->table_prefix . 'forums_access'		=> array(
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'forums_track'		=> array(
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'forums_watch'		=> array(
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'log'					=> array(
+					'log_id'		=> array('UINT', null, 'auto_increment'),
+					'post_id'		=> array('UINT', 0),
+					'reportee_id'	=> array('UINT', 0),
+					'user_id'		=> array('UINT', 0),
+					'topic_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'login_attempts'		=> array(
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'moderator_cache'		=> array(
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'notifications'		=> array(
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'oauth_accounts'		=> array(
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'oauth_states'		=> array(
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'oauth_tokens'		=> array(
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'poll_options'		=> array(
+					'topic_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'poll_votes'			=> array(
+					'topic_id'		=> array('UINT', 0),
+					'vote_user_id'	=> array('UINT', 0),
+				),
+				$this->table_prefix . 'posts'				=> array(
+					'post_id'			=> array('UINT', null, 'auto_increment'),
+					'poster_id'			=> array('UINT', 0),
+					'post_delete_user'	=> array('UINT', 0),
+					'post_edit_user'	=> array('UINT', 0),
+					'topic_id'			=> array('UINT', 0),
+				),
+				$this->table_prefix . 'privmsgs'			=> array(
+					'author_id'			=> array('UINT', 0),
+					'message_edit_user'	=> array('UINT', 0),
+					'msg_id'			=> array('UINT', null, 'auto_increment'),
+				),
+				$this->table_prefix . 'privmsgs_folder'		=> array(
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'privmsgs_rules'		=> array(
+					'rule_user_id'	=> array('UINT', 0),
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'privmsgs_to'			=> array(
+					'author_id'		=> array('UINT', 0),
+					'msg_id'		=> array('UINT', 0),
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'profile_fields_data'	=> array(
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'reports'				=> array(
+					'report_id'		=> array('UINT', 0),
+					'pm_id'			=> array('UINT', 0),
+					'post_id'		=> array('UINT', 0),
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'search_wordlist'		=> array(
+					'word_id'		=> array('UINT', null, 'auto_increment'),
+				),
+				$this->table_prefix . 'search_wordmatch'	=> array(
+					'post_id'		=> array('UINT', 0),
+					'word_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'sessions'			=> array(
+					'session_user_id'	=> array('UINT', 0),
+				),
+				$this->table_prefix . 'sessions_keys'		=> array(
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'topics'				=> array(
+					'topic_id'				=> array('UINT', null, 'auto_increment'),
+					'topic_poster'			=> array('UINT', 0),
+					'topic_first_post_id'	=> array('UINT', 0),
+					'topic_last_post_id'	=> array('UINT', 0),
+					'topic_last_poster_id'	=> array('UINT', 0),
+					'topic_moved_id'		=> array('UINT', 0),
+					'topic_delete_user'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'topics_track'		=> array(
+					'user_id'		=> array('UINT', 0),
+					'topic_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'topics_posted'		=> array(
+					'user_id'		=> array('UINT', 0),
+					'topic_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'topics_watch'		=> array(
+					'user_id'		=> array('UINT', 0),
+					'topic_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'user_notifications'	=> array(
+					'item_id'		=> array('UINT', 0),
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'user_group'			=> array(
+					'user_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'users'				=> array(
+					'user_id'		=> array('UINT', null, 'auto_increment'),
+				),
+				$this->table_prefix . 'warnings'			=> array(
+					'log_id'		=> array('UINT', 0),
+					'user_id'		=> array('UINT', 0),
+					'post_id'		=> array('UINT', 0),
+				),
+				$this->table_prefix . 'words'				=> array(
+					'word_id'		=> array('UINT', null, 'auto_increment'),
+				),
+				$this->table_prefix . 'zebra'			=> array(
+					'user_id'		=> array('UINT', 0),
+					'zebra_id'		=> array('UINT', 0),
+				),
+			),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/dev.php
@@ -0,0 +1,36 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class dev extends \phpbb\db\migration\container_aware_migration
+{
+	public function effectively_installed()
+	{
+		return version_compare($this->config['version'], '3.2.0-dev', '>=');
+	}
+
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v31x\v316',
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.update', array('version', '3.2.0-dev')),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/font_awesome_update.php
@@ -0,0 +1,36 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class font_awesome_update extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v320\dev',
+		);
+	}
+
+	public function effectively_installed()
+	{
+		return isset($this->config['load_font_awesome_url']);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.add', array('load_font_awesome_url', 'https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css')),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/icons_alt.php
@@ -0,0 +1,46 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class icons_alt extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v320\dev',
+		);
+	}
+
+	public function update_schema()
+	{
+		return array(
+			'add_columns'        => array(
+				$this->table_prefix . 'icons'        => array(
+					'icons_alt'    => array('VCHAR', '', 'after' => 'icons_height'),
+				),
+			),
+		);
+	}
+
+	public function revert_schema()
+	{
+		return array(
+			'drop_columns'        => array(
+				$this->table_prefix . 'icons'        => array(
+					'icons_alt',
+				),
+			),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/log_post_id.php
@@ -0,0 +1,46 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class log_post_id extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v320\dev',
+		);
+	}
+
+	public function update_schema()
+	{
+		return array(
+			'add_columns'        => array(
+				$this->table_prefix . 'log'        => array(
+					'post_id'    => array('UINT', 0, 'after' => 'topic_id'),
+				),
+			),
+		);
+	}
+
+	public function revert_schema()
+	{
+		return array(
+			'drop_columns'        => array(
+				$this->table_prefix . 'log'        => array(
+					'post_id',
+				),
+			),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/notifications_board.php
@@ -0,0 +1,75 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class notifications_board extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v320\dev',
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.add', array('allow_board_notifications', 1)),
+			array('custom', array(array($this, 'update_user_subscriptions'))),
+			array('custom', array(array($this, 'update_module'))),
+		);
+	}
+
+	public function update_module()
+	{
+		$sql = 'UPDATE ' . MODULES_TABLE . "
+			SET module_auth = 'cfg_allow_board_notifications'
+			WHERE module_basename = 'ucp_notifications'
+				AND module_mode = 'notification_list'";
+		$this->sql_query($sql);
+	}
+
+	public function update_user_subscriptions()
+	{
+		$sql = 'UPDATE ' . USER_NOTIFICATIONS_TABLE . "
+			SET method = 'notification.method.board'
+			WHERE method = ''";
+		$this->sql_query($sql);
+	}
+
+	public function revert_data()
+	{
+		return array(
+			array('custom', array(array($this, 'revert_user_subscriptions'))),
+			array('custom', array(array($this, 'revert_module'))),
+		);
+	}
+
+	public function revert_user_subscriptions()
+	{
+		$sql = 'UPDATE ' . USER_NOTIFICATIONS_TABLE . "
+			SET method = ''
+			WHERE method = 'notification.method.board'";
+		$this->sql_query($sql);
+	}
+
+	public function revert_module()
+	{
+		$sql = 'UPDATE ' . MODULES_TABLE . "
+			SET auth = ''
+			WHERE module_basename = 'ucp_notifications'
+				AND module_mode = 'notification_list'";
+		$this->sql_query($sql);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/oauth_states.php
@@ -0,0 +1,56 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class oauth_states extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array('\phpbb\db\migration\data\v310\auth_provider_oauth');
+	}
+
+	public function effectively_installed()
+	{
+		return $this->db_tools->sql_table_exists($this->table_prefix . 'oauth_states');
+	}
+
+	public function update_schema()
+	{
+		return array(
+			'add_tables'	=> array(
+				$this->table_prefix . 'oauth_states'	=> array(
+					'COLUMNS' => array(
+						'user_id'			=> array('UINT', 0),
+						'session_id'		=> array('CHAR:32', ''),
+						'provider'			=> array('VCHAR', ''),
+						'oauth_state'		=> array('VCHAR', ''),
+					),
+					'KEYS' => array(
+						'user_id'			=> array('INDEX', 'user_id'),
+						'provider'			=> array('INDEX', 'provider'),
+					),
+				),
+			),
+		);
+	}
+
+	public function revert_schema()
+	{
+		return array(
+			'drop_tables'	=> array(
+				$this->table_prefix . 'oauth_states',
+			),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/remote_upload_validation.php
@@ -0,0 +1,31 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class remote_upload_validation extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v320\v320a2',
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.add', array('remote_upload_verify', '0')),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/remove_outdated_media.php
@@ -0,0 +1,90 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class remove_outdated_media extends \phpbb\db\migration\migration
+{
+	protected $cat_id = array(
+			ATTACHMENT_CATEGORY_WM,
+			ATTACHMENT_CATEGORY_RM,
+			ATTACHMENT_CATEGORY_QUICKTIME,
+		);
+
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v320\dev',
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('custom', array(array($this, 'change_extension_group'))),
+		);
+	}
+
+	public function change_extension_group()
+	{
+		// select group ids of outdated media
+		$sql = 'SELECT group_id
+			FROM ' . EXTENSION_GROUPS_TABLE . '
+			WHERE ' . $this->db->sql_in_set('cat_id', $this->cat_id);
+		$result = $this->db->sql_query($sql);
+
+		$group_ids = array();
+		while ($group_id = (int) $this->db->sql_fetchfield('group_id'))
+		{
+			$group_ids[] = $group_id;
+		}
+		$this->db->sql_freeresult($result);
+
+		// nothing to do, admin has removed all the outdated media extension groups
+		if (empty($group_ids))
+		{
+			return true;
+		}
+
+		// get the group id of downloadable files
+		$sql = 'SELECT group_id
+			FROM ' . EXTENSION_GROUPS_TABLE . "
+			WHERE group_name = 'DOWNLOADABLE_FILES'";
+		$result = $this->db->sql_query($sql);
+		$download_id = (int) $this->db->sql_fetchfield('group_id');
+		$this->db->sql_freeresult($result);
+
+		if (empty($download_id))
+		{
+			$sql = 'UPDATE ' . EXTENSIONS_TABLE . '
+				SET group_id = 0
+				WHERE ' . $this->db->sql_in_set('group_id', $group_ids);
+		}
+		else
+		{
+			// move outdated media extensions to downloadable files
+			$sql = 'UPDATE ' . EXTENSIONS_TABLE . "
+				SET group_id = $download_id" . '
+				WHERE ' . $this->db->sql_in_set('group_id', $group_ids);
+		}
+
+		$result = $this->db->sql_query($sql);
+		$this->db->sql_freeresult($result);
+
+		// delete the now empty, outdated media extension groups
+		$sql = 'DELETE FROM ' . EXTENSION_GROUPS_TABLE . '
+			WHERE ' . $this->db->sql_in_set('group_id', $group_ids);
+		$result = $this->db->sql_query($sql);
+		$this->db->sql_freeresult($result);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/remove_profilefield_wlm.php
@@ -0,0 +1,152 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class remove_profilefield_wlm extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v320\dev',
+		);
+	}
+
+	public function update_schema()
+	{
+		return array(
+			'drop_columns'	=> array(
+				$this->table_prefix . 'profile_fields_data'			=> array(
+					'pf_phpbb_wlm',
+				),
+			),
+		);
+	}
+
+	public function revert_schema()
+	{
+		return array(
+			'add_columns'	=> array(
+				$this->table_prefix . 'profile_fields_data'			=> array(
+					'pf_phpbb_wlm'		=> array('VCHAR', ''),
+				),
+			),
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('custom', array(array($this, 'delete_custom_profile_field_data'))),
+		);
+	}
+
+	public function revert_data()
+	{
+		return array(
+			array('custom', array(array($this, 'create_custom_field'))),
+		);
+	}
+
+	public function delete_custom_profile_field_data()
+	{
+		$field_id = $this->get_custom_profile_field_id();
+
+		$sql = 'DELETE FROM ' . PROFILE_FIELDS_TABLE . '
+			WHERE field_id = ' . (int) $field_id;
+		$this->db->sql_query($sql);
+
+		$sql = 'DELETE FROM ' . PROFILE_LANG_TABLE . '
+			WHERE field_id = ' . (int) $field_id;
+		$this->db->sql_query($sql);
+
+		$sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . '
+			WHERE field_id = ' . (int) $field_id;
+		$this->db->sql_query($sql);
+	}
+
+	/**
+	 * Get custom profile field id
+	 * @return	int	custom profile filed id
+	 */
+	public function get_custom_profile_field_id()
+	{
+		$sql = 'SELECT field_id
+			FROM ' . PROFILE_FIELDS_TABLE . "
+			WHERE field_name = 'phpbb_wlm'";
+		$result = $this->db->sql_query($sql);
+		$field_id = (int) $this->db->sql_fetchfield('field_id');
+		$this->db->sql_freeresult($result);
+
+		return $field_id;
+	}
+
+	public function create_custom_field()
+	{
+		$sql = 'SELECT MAX(field_order) as max_field_order
+			FROM ' . PROFILE_FIELDS_TABLE;
+		$result = $this->db->sql_query($sql);
+		$max_field_order = (int) $this->db->sql_fetchfield('max_field_order');
+		$this->db->sql_freeresult($result);
+
+		$sql_ary = array(
+			'field_name'			=> 'phpbb_wlm',
+			'field_type'			=> 'profilefields.type.string',
+			'field_ident'			=> 'phpbb_wlm',
+			'field_length'			=> '40',
+			'field_minlen'			=> '5',
+			'field_maxlen'			=> '255',
+			'field_novalue'			=> '',
+			'field_default_value'	=> '',
+			'field_validation'		=> '.*',
+			'field_required'		=> 0,
+			'field_show_novalue'	=> 0,
+			'field_show_on_reg'		=> 0,
+			'field_show_on_pm'		=> 1,
+			'field_show_on_vt'		=> 1,
+			'field_show_on_ml'		=> 0,
+			'field_show_profile'	=> 1,
+			'field_hide'			=> 0,
+			'field_no_view'			=> 0,
+			'field_active'			=> 1,
+			'field_is_contact'		=> 1,
+			'field_contact_desc'	=> '',
+			'field_contact_url'		=> '',
+			'field_order'			=> $max_field_order + 1,
+		);
+
+		$sql = 'INSERT INTO ' . PROFILE_FIELDS_TABLE . ' ' . $this->db->sql_build_array('INSERT', $sql_ary);
+		$this->db->sql_query($sql);
+		$field_id = (int) $this->db->sql_nextid();
+
+		$insert_buffer = new \phpbb\db\sql_insert_buffer($this->db, PROFILE_LANG_TABLE);
+
+		$sql = 'SELECT lang_id
+			FROM ' . LANG_TABLE;
+		$result = $this->db->sql_query($sql);
+		$lang_name = 'WLM';
+		while ($lang_id = (int) $this->db->sql_fetchfield('lang_id'))
+		{
+			$insert_buffer->insert(array(
+				'field_id'				=> (int) $field_id,
+				'lang_id'				=> (int) $lang_id,
+				'lang_name'				=> $lang_name,
+				'lang_explain'			=> '',
+				'lang_default_value'	=> '',
+			));
+		}
+		$this->db->sql_freeresult($result);
+
+		$insert_buffer->flush();
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/report_id_auto_increment.php
@@ -0,0 +1,46 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class report_id_auto_increment extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v320\default_data_type_ids',
+		);
+	}
+
+	public function update_schema()
+	{
+		return array(
+			'change_columns'	=> array(
+				$this->table_prefix . 'reports'				=> array(
+					'report_id'		=> array('ULINT', null, 'auto_increment'),
+				),
+			),
+		);
+	}
+
+	public function revert_schema()
+	{
+		return array(
+			'change_columns'	=> array(
+				$this->table_prefix . 'reports'				=> array(
+					'report_id'		=> array('ULINT', 0),
+				),
+			),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/text_reparser.php
@@ -0,0 +1,118 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\db\migration\data\v320;
+
+use phpbb\textreparser\manager;
+use phpbb\textreparser\reparser_interface;
+
+class text_reparser extends \phpbb\db\migration\container_aware_migration
+{
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v310\contact_admin_form',
+			'\phpbb\db\migration\data\v320\allowed_schemes_links',
+		);
+	}
+
+	public function effectively_installed()
+	{
+		return isset($this->config['reparse_lock']);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.add', array('reparse_lock', 0, true)),
+			array('config.add', array('text_reparser.pm_text_cron_interval', 10)),
+			array('config.add', array('text_reparser.pm_text_last_cron', 0)),
+			array('config.add', array('text_reparser.poll_option_cron_interval', 10)),
+			array('config.add', array('text_reparser.poll_option_last_cron', 0)),
+			array('config.add', array('text_reparser.poll_title_cron_interval', 10)),
+			array('config.add', array('text_reparser.poll_title_last_cron', 0)),
+			array('config.add', array('text_reparser.post_text_cron_interval', 10)),
+			array('config.add', array('text_reparser.post_text_last_cron', 0)),
+			array('config.add', array('text_reparser.user_signature_cron_interval', 10)),
+			array('config.add', array('text_reparser.user_signature_last_cron', 0)),
+			array('custom', array(array($this, 'reparse'))),
+		);
+	}
+
+	public function reparse($resume_data)
+	{
+		/** @var manager $reparser_manager */
+		$reparser_manager = $this->container->get('text_reparser.manager');
+
+		/** @var reparser_interface[] $reparsers */
+		$reparsers = $this->container->get('text_reparser_collection');
+
+		// Initialize all reparsers
+		foreach ($reparsers as $name => $reparser)
+		{
+			$reparser_manager->update_resume_data($name, 1, $reparser->get_max_id(), 100);
+		}
+
+		// Sometimes a cron job is too much
+		$limit = 100;
+		$fast_reparsers = array(
+			'text_reparser.contact_admin_info',
+			'text_reparser.forum_description',
+			'text_reparser.forum_rules',
+			'text_reparser.group_description',
+		);
+
+		if (!is_array($resume_data))
+		{
+			$resume_data = array(
+				'reparser'	=> 0,
+				'current'	=> $this->container->get($fast_reparsers[0])->get_max_id(),
+			);
+		}
+
+		$fast_reparsers_size = count($fast_reparsers);
+		$processed_records = 0;
+		while ($processed_records < $limit && $resume_data['reparser'] < $fast_reparsers_size)
+		{
+			$reparser = $this->container->get($fast_reparsers[$resume_data['reparser']]);
+
+			// New reparser
+			if ($resume_data['current'] === 0)
+			{
+				$resume_data['current'] = $reparser->get_max_id();
+			}
+
+			$start = max(1, $resume_data['current'] + 1 - ($limit - $processed_records));
+			$end = max(1, $resume_data['current']);
+			$reparser->reparse_range($start, $end);
+
+			$processed_records += $end - $start + 1;
+			$resume_data['current'] = $start - 1;
+
+			if ($start === 1)
+			{
+				// Prevent CLI command from running these reparsers again
+				$reparser_manager->update_resume_data($fast_reparsers[$resume_data['reparser']], 1, 0, $limit);
+
+				$resume_data['reparser']++;
+			}
+		}
+
+		if ($resume_data['reparser'] === $fast_reparsers_size)
+		{
+			return true;
+		}
+
+		return $resume_data;
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/v320.php
@@ -0,0 +1,40 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+use phpbb\db\migration\migration;
+
+class v320 extends migration
+{
+	public function effectively_installed()
+	{
+		return version_compare($this->config['version'], '3.2.0', '>=');
+	}
+
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v31x\increase_size_of_emotion',
+			'\phpbb\db\migration\data\v320\cookie_notice',
+		);
+
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.update', array('version', '3.2.0')),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/v320a1.php
@@ -0,0 +1,44 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class v320a1 extends \phpbb\db\migration\container_aware_migration
+{
+	public function effectively_installed()
+	{
+		return version_compare($this->config['version'], '3.2.0-a1', '>=');
+	}
+
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v320\dev',
+			'\phpbb\db\migration\data\v320\allowed_schemes_links',
+			'\phpbb\db\migration\data\v320\announce_global_permission',
+			'\phpbb\db\migration\data\v320\remove_profilefield_wlm',
+			'\phpbb\db\migration\data\v320\font_awesome_update',
+			'\phpbb\db\migration\data\v320\icons_alt',
+			'\phpbb\db\migration\data\v320\log_post_id',
+			'\phpbb\db\migration\data\v320\remove_outdated_media',
+			'\phpbb\db\migration\data\v320\notifications_board',
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.update', array('version', '3.2.0-dev')),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/v320a2.php
@@ -0,0 +1,38 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class v320a2 extends \phpbb\db\migration\container_aware_migration
+{
+	public function effectively_installed()
+	{
+		return version_compare($this->config['version'], '3.2.0-a2', '>=');
+	}
+
+	static public function depends_on()
+	{
+		return 		array(
+			'\phpbb\db\migration\data\v31x\v317rc1',
+			'\phpbb\db\migration\data\v320\text_reparser',
+			'\phpbb\db\migration\data\v320\v320a1',
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.update', array('version', '3.2.0-a2')),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/v320b1.php
@@ -0,0 +1,39 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+class v320b1 extends \phpbb\db\migration\container_aware_migration
+{
+	public function effectively_installed()
+	{
+		return version_compare($this->config['version'], '3.2.0-b1', '>=');
+	}
+
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v31x\v317pl1',
+			'\phpbb\db\migration\data\v320\v320a2',
+			'\phpbb\db\migration\data\v31x\increase_size_of_dateformat',
+			'\phpbb\db\migration\data\v320\default_data_type_ids',
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.update', array('version', '3.2.0-b1')),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/v320b2.php
@@ -0,0 +1,40 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+use phpbb\db\migration\migration;
+
+class v320b2 extends migration
+{
+	public function effectively_installed()
+	{
+		return version_compare($this->config['version'], '3.2.0-b2', '>=');
+	}
+
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v31x\v318',
+			'\phpbb\db\migration\data\v320\v320b1',
+			'\phpbb\db\migration\data\v320\remote_upload_validation',
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.update', array('version', '3.2.0-b2')),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/v320rc1.php
@@ -0,0 +1,40 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+use phpbb\db\migration\migration;
+
+class v320rc1 extends migration
+{
+	public function effectively_installed()
+	{
+		return version_compare($this->config['version'], '3.2.0-RC1', '>=');
+	}
+
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v31x\v319',
+			'\phpbb\db\migration\data\v320\report_id_auto_increment',
+			'\phpbb\db\migration\data\v320\v320b2',
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.update', array('version', '3.2.0-RC1')),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v320/v320rc2.php
@@ -0,0 +1,40 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v320;
+
+use phpbb\db\migration\migration;
+
+class v320rc2 extends migration
+{
+	public function effectively_installed()
+	{
+		return version_compare($this->config['version'], '3.2.0-RC2', '>=');
+	}
+
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v31x\remove_duplicate_migrations',
+			'\phpbb\db\migration\data\v31x\add_log_time_index',
+			'\phpbb\db\migration\data\v320\add_help_phpbb',
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.update', array('version', '3.2.0-RC2')),
+		);
+	}
+}
--- a/phpbb/db/migration/migration.php
+++ b/phpbb/db/migration/migration.php
@@ -20,7 +20,7 @@ namespace phpbb\db\migration;
 * in a subclass. This class provides various utility methods to simplify editing
 * a phpBB.
 */
-abstract class migration
+abstract class migration implements migration_interface
 {
 	/** @var \phpbb\config\config */
 	protected $config;
@@ -28,7 +28,7 @@ abstract class migration
 	/** @var \phpbb\db\driver\driver_interface */
 	protected $db;
 
-	/** @var \phpbb\db\tools */
+	/** @var \phpbb\db\tools\tools_interface */
 	protected $db_tools;
 
 	/** @var string */
@@ -51,12 +51,12 @@ abstract class migration
 	*
 	* @param \phpbb\config\config $config
 	* @param \phpbb\db\driver\driver_interface $db
-	* @param \phpbb\db\tools $db_tools
+	* @param \phpbb\db\tools\tools_interface $db_tools
 	* @param string $phpbb_root_path
 	* @param string $php_ext
 	* @param string $table_prefix
 	*/
-	public function __construct(\phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\db\tools $db_tools, $phpbb_root_path, $php_ext, $table_prefix)
+	public function __construct(\phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\db\tools\tools_interface $db_tools, $phpbb_root_path, $php_ext, $table_prefix)
 	{
 		$this->config = $config;
 		$this->db = $db;
@@ -70,9 +70,7 @@ abstract class migration
 	}
 
 	/**
-	* Defines other migrations to be applied first
-	*
-	* @return array An array of migration class names
+	* {@inheritdoc}
 	*/
 	static public function depends_on()
 	{
@@ -80,14 +78,7 @@ abstract class migration
 	}
 
 	/**
-	* Allows you to check if the migration is effectively installed (entirely optional)
-	*
-	* This is checked when a migration is installed. If true is returned, the migration will be set as
-	* installed without performing the database changes.
-	* This function is intended to help moving to migrations from a previous database updater, where some
-	* migrations may have been installed already even though they are not yet listed in the migrations table.
-	*
-	* @return bool True if this migration is installed, False if this migration is not installed (checked on install)
+	* {@inheritdoc}
 	*/
 	public function effectively_installed()
 	{
@@ -95,9 +86,7 @@ abstract class migration
 	}
 
 	/**
-	* Updates the database schema by providing a set of change instructions
-	*
-	* @return array Array of schema changes (compatible with db_tools->perform_schema_changes())
+	* {@inheritdoc}
 	*/
 	public function update_schema()
 	{
@@ -105,9 +94,7 @@ abstract class migration
 	}
 
 	/**
-	* Reverts the database schema by providing a set of change instructions
-	*
-	* @return array Array of schema changes (compatible with db_tools->perform_schema_changes())
+	* {@inheritdoc}
 	*/
 	public function revert_schema()
 	{
@@ -115,9 +102,7 @@ abstract class migration
 	}
 
 	/**
-	* Updates data by returning a list of instructions to be executed
-	*
-	* @return array Array of data update instructions
+	* {@inheritdoc}
 	*/
 	public function update_data()
 	{
@@ -125,12 +110,7 @@ abstract class migration
 	}
 
 	/**
-	* Reverts data by returning a list of instructions to be executed
-	*
-	* @return array Array of data instructions that will be performed on revert
-	* 	NOTE: calls to tools (such as config.add) are automatically reverted when
-	* 		possible, so you should not attempt to revert those, this is mostly for
-	* 		otherwise unrevertable calls (custom functions for example)
+	* {@inheritdoc}
 	*/
 	public function revert_data()
 	{
--- /dev/null
+++ b/phpbb/db/migration/migration_interface.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\db\migration;
+
+/**
+ * Base class interface for database migrations
+ */
+interface migration_interface
+{
+	/**
+	 * Defines other migrations to be applied first
+	 *
+	 * @return array An array of migration class names
+	 */
+	static public function depends_on();
+
+	/**
+	 * Allows you to check if the migration is effectively installed (entirely optional)
+	 *
+	 * This is checked when a migration is installed. If true is returned, the migration will be set as
+	 * installed without performing the database changes.
+	 * This function is intended to help moving to migrations from a previous database updater, where some
+	 * migrations may have been installed already even though they are not yet listed in the migrations table.
+	 *
+	 * @return bool True if this migration is installed, False if this migration is not installed (checked on install)
+	 */
+	public function effectively_installed();
+
+	/**
+	 * Updates the database schema by providing a set of change instructions
+	 *
+	 * @return array Array of schema changes (compatible with db_tools->perform_schema_changes())
+	 */
+	public function update_schema();
+
+	/**
+	 * Reverts the database schema by providing a set of change instructions
+	 *
+	 * @return array Array of schema changes (compatible with db_tools->perform_schema_changes())
+	 */
+	public function revert_schema();
+
+	/**
+	 * Updates data by returning a list of instructions to be executed
+	 *
+	 * @return array Array of data update instructions
+	 */
+	public function update_data();
+
+	/**
+	 * Reverts data by returning a list of instructions to be executed
+	 *
+	 * @return array Array of data instructions that will be performed on revert
+	 * 	NOTE: calls to tools (such as config.add) are automatically reverted when
+	 * 		possible, so you should not attempt to revert those, this is mostly for
+	 * 		otherwise unrevertable calls (custom functions for example)
+	 */
+	public function revert_data();
+}
--- a/phpbb/db/migration/profilefield_base_migration.php
+++ b/phpbb/db/migration/profilefield_base_migration.php
@@ -191,6 +191,7 @@ abstract class profilefield_base_migration extends container_aware_migration
 		$insert_buffer = new \phpbb\db\sql_insert_buffer($this->db, $this->table_prefix . 'profile_fields_data');
 		$limit = 250;
 		$converted_users = 0;
+		$start = $start ?: 0;
 
 		$sql = 'SELECT user_id, ' . $this->user_column_name . '
 			FROM ' . $this->table_prefix . 'users
@@ -237,6 +238,7 @@ abstract class profilefield_base_migration extends container_aware_migration
 
 		if ($profile_row === null)
 		{
+			/* @var $manager \phpbb\profilefields\manager */
 			$manager = $this->container->get('profilefields.manager');
 			$profile_row = $manager->build_insert_sql_array(array());
 		}
--- a/phpbb/db/migration/schema_generator.php
+++ b/phpbb/db/migration/schema_generator.php
@@ -24,7 +24,7 @@ class schema_generator
 	/** @var \phpbb\db\driver\driver_interface */
 	protected $db;
 
-	/** @var \phpbb\db\tools */
+	/** @var \phpbb\db\tools\tools_interface */
 	protected $db_tools;
 
 	/** @var array */
@@ -48,7 +48,7 @@ class schema_generator
 	/**
 	* Constructor
 	*/
-	public function __construct(array $class_names, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\db\tools $db_tools, $phpbb_root_path, $php_ext, $table_prefix)
+	public function __construct(array $class_names, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\db\tools\tools_interface $db_tools, $phpbb_root_path, $php_ext, $table_prefix)
 	{
 		$this->config = $config;
 		$this->db = $db;
@@ -77,8 +77,15 @@ class schema_generator
 		$check_dependencies = true;
 		while (!empty($migrations))
 		{
-			foreach ($migrations as $migration_class)
+			foreach ($migrations as $key => $migration_class)
 			{
+				// Unset classes that are not a valid migration
+				if (\phpbb\db\migrator::is_migration($migration_class) === false)
+				{
+					unset($migrations[$key]);
+					continue;
+				}
+
 				$open_dependencies = array_diff($migration_class::depends_on(), $tree);
 
 				if (empty($open_dependencies))
--- a/phpbb/db/migration/tool/module.php
+++ b/phpbb/db/migration/tool/module.php
@@ -13,6 +13,8 @@
 
 namespace phpbb\db\migration\tool;
 
+use phpbb\module\exception\module_exception;
+
 /**
 * Migration module management tool
 */
@@ -27,6 +29,9 @@ class module implements \phpbb\db\migration\tool\tool_interface
 	/** @var \phpbb\user */
 	protected $user;
 
+	/** @var \phpbb\module\module_manager */
+	protected $module_manager;
+
 	/** @var string */
 	protected $phpbb_root_path;
 
@@ -45,15 +50,17 @@ class module implements \phpbb\db\migration\tool\tool_interface
 	* @param \phpbb\db\driver\driver_interface $db
 	* @param \phpbb\cache\service $cache
 	* @param \phpbb\user $user
+	* @param \phpbb\module\module_manager	$module_manager
 	* @param string $phpbb_root_path
 	* @param string $php_ext
 	* @param string $modules_table
 	*/
-	public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\cache\service $cache, \phpbb\user $user, $phpbb_root_path, $php_ext, $modules_table)
+	public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\cache\service $cache, \phpbb\user $user, \phpbb\module\module_manager $module_manager, $phpbb_root_path, $php_ext, $modules_table)
 	{
 		$this->db = $db;
 		$this->cache = $cache;
 		$this->user = $user;
+		$this->module_manager = $module_manager;
 		$this->phpbb_root_path = $phpbb_root_path;
 		$this->php_ext = $php_ext;
 		$this->modules_table = $modules_table;
@@ -90,7 +97,12 @@ class module implements \phpbb\db\migration\tool\tool_interface
 		$parent_sql = '';
 		if ($parent !== false)
 		{
-			$parent = $this->get_parent_module_id($parent, $module);
+			$parent = $this->get_parent_module_id($parent, $module, false);
+			if ($parent === false)
+			{
+				return false;
+			}
+
 			$parent_sql = 'AND parent_id = ' . (int) $parent;
 		}
 
@@ -152,6 +164,8 @@ class module implements \phpbb\db\migration\tool\tool_interface
 	*/
 	public function add($class, $parent = 0, $data = array())
 	{
+		global $user, $phpbb_log;
+
 		// allow sending the name as a string in $data to create a category
 		if (!is_array($data))
 		{
@@ -166,7 +180,6 @@ class module implements \phpbb\db\migration\tool\tool_interface
 			$basename = (isset($data['module_basename'])) ? $data['module_basename'] : '';
 			$module = $this->get_module_info($class, $basename);
 
-			$result = '';
 			foreach ($module['modes'] as $mode => $module_info)
 			{
 				if (!isset($data['modes']) || in_array($mode, $data['modes']))
@@ -197,16 +210,9 @@ class module implements \phpbb\db\migration\tool\tool_interface
 
 		if ($this->exists($class, $parent, $data['module_langname']))
 		{
-			throw new \phpbb\db\migration\exception('MODULE_EXISTS', $module_id);
+			throw new \phpbb\db\migration\exception('MODULE_EXISTS', $data['module_langname']);
 		}
 
-		if (!class_exists('acp_modules'))
-		{
-			include($this->phpbb_root_path . 'includes/acp/acp_modules.' . $this->php_ext);
-			$this->user->add_lang('acp/modules');
-		}
-		$acp_modules = new \acp_modules();
-
 		$module_data = array(
 			'module_enabled'	=> (isset($data['module_enabled'])) ? $data['module_enabled'] : 1,
 			'module_display'	=> (isset($data['module_display'])) ? $data['module_display'] : 1,
@@ -217,19 +223,14 @@ class module implements \phpbb\db\migration\tool\tool_interface
 			'module_mode'		=> (isset($data['module_mode'])) ? $data['module_mode'] : '',
 			'module_auth'		=> (isset($data['module_auth'])) ? $data['module_auth'] : '',
 		);
-		$result = $acp_modules->update_module_data($module_data, true);
 
-		// update_module_data can either return a string or an empty array...
-		if (is_string($result))
-		{
-			// Error
-			throw new \phpbb\db\migration\exception('MODULE_ERROR', $result);
-		}
-		else
+		try
 		{
+			$this->module_manager->update_module_data($module_data);
+
 			// Success
 			$module_log_name = ((isset($this->user->lang[$data['module_langname']])) ? $this->user->lang[$data['module_langname']] : $data['module_langname']);
-			add_log('admin', 'LOG_MODULE_ADD', $module_log_name);
+			$phpbb_log->add('admin', (isset($user->data['user_id'])) ? $user->data['user_id'] : ANONYMOUS, $user->ip, 'LOG_MODULE_ADD', false, array($module_log_name));
 
 			// Move the module if requested above/below an existing one
 			if (isset($data['before']) && $data['before'])
@@ -279,6 +280,11 @@ class module implements \phpbb\db\migration\tool\tool_interface
 				$this->db->sql_query($sql);
 			}
 		}
+		catch (module_exception $e)
+		{
+			// Error
+			throw new \phpbb\db\migration\exception('MODULE_ERROR', $e->getMessage());
+		}
 
 		// Clear the Modules Cache
 		$this->cache->destroy("_modules_$class");
@@ -360,21 +366,9 @@ class module implements \phpbb\db\migration\tool\tool_interface
 				$module_ids[] = (int) $module;
 			}
 
-			if (!class_exists('acp_modules'))
-			{
-				include($this->phpbb_root_path . 'includes/acp/acp_modules.' . $this->php_ext);
-				$this->user->add_lang('acp/modules');
-			}
-			$acp_modules = new \acp_modules();
-			$acp_modules->module_class = $class;
-
 			foreach ($module_ids as $module_id)
 			{
-				$result = $acp_modules->delete_module($module_id);
-				if (!empty($result))
-				{
-					return;
-				}
+				$this->module_manager->delete_module($module_id, $class);
 			}
 
 			$this->cache->destroy("_modules_$class");
@@ -422,13 +416,7 @@ class module implements \phpbb\db\migration\tool\tool_interface
 	*/
 	protected function get_module_info($class, $basename)
 	{
-		if (!class_exists('acp_modules'))
-		{
-			include($this->phpbb_root_path . 'includes/acp/acp_modules.' . $this->php_ext);
-			$this->user->add_lang('acp/modules');
-		}
-		$acp_modules = new \acp_modules();
-		$module = $acp_modules->get_module_infos($basename, $class, true);
+		$module = $this->module_manager->get_module_infos($class, $basename, true);
 
 		if (empty($module))
 		{
@@ -448,12 +436,11 @@ class module implements \phpbb\db\migration\tool\tool_interface
 	protected function get_categories_list()
 	{
 		// Select the top level categories
-		// and 2nd level [sub]categories which exist for ACP only
+		// and 2nd level [sub]categories
 		$sql = 'SELECT m2.module_id, m2.module_langname
 			FROM ' . $this->modules_table . ' m1, ' . $this->modules_table . " m2
 			WHERE m1.parent_id = 0
-				AND (m1.module_id = m2.module_id
-				OR m2.module_class = 'acp' AND m2.parent_id = m1.module_id)
+				AND (m1.module_id = m2.module_id OR m2.parent_id = m1.module_id)
 			ORDER BY m1.module_id, m2.module_id ASC";
 
 		$result = $this->db->sql_query($sql);
@@ -469,11 +456,15 @@ class module implements \phpbb\db\migration\tool\tool_interface
 	*
 	* @param string|int $parent_id The parent module_id|module_langname
 	* @param int|string|array $data The module_id, module_langname for existance checking or module data array for adding
-	* @return int The parent module_id
+	* @param bool $throw_exception The flag indicating if exception should be thrown on error
+	* @return mixed The int parent module_id or false
 	* @throws \phpbb\db\migration\exception
 	*/
-	public function get_parent_module_id($parent_id, $data = '')
+	public function get_parent_module_id($parent_id, $data = '', $throw_exception = true)
 	{
+		// Initialize exception object placeholder
+		$exception = false;
+
 		// Allow '' to be sent as 0
 		$parent_id = $parent_id ?: 0;
 
@@ -495,7 +486,7 @@ class module implements \phpbb\db\migration\tool\tool_interface
 			{
 				// No parent with the given module_langname exist
 				case 0:
-					throw new \phpbb\db\migration\exception('MODULE_NOT_EXIST', $parent_id);
+					$exception = new \phpbb\db\migration\exception('MODULE_NOT_EXIST', $parent_id);
 				break;
 
 				// Return the module id
@@ -517,7 +508,7 @@ class module implements \phpbb\db\migration\tool\tool_interface
 						$parent_id = (int) $this->db->sql_fetchfield('parent_id');
 						if (!$parent_id)
 						{
-							throw new \phpbb\db\migration\exception('PARENT_MODULE_FIND_ERROR', $data['parent_id']);
+							$exception = new \phpbb\db\migration\exception('PARENT_MODULE_FIND_ERROR', $data['parent_id']);
 						}
 					}
 					else if (!empty($data) && !is_array($data))
@@ -535,12 +526,21 @@ class module implements \phpbb\db\migration\tool\tool_interface
 					else
 					{
 						//Unable to get the parent module id, throwing an exception
-						throw new \phpbb\db\migration\exception('MODULE_EXIST_MULTIPLE', $parent_id);
+						$exception = new \phpbb\db\migration\exception('MODULE_EXIST_MULTIPLE', $parent_id);
 					}
 				break;
 			}
 		}
 
+		if ($exception !== false)
+		{
+			if ($throw_exception)
+			{
+				throw $exception;
+			}
+			return false;
+		}
+
 		return $parent_id;
 	}
 }
--- a/phpbb/db/migrator.php
+++ b/phpbb/db/migrator.php
@@ -13,6 +13,8 @@
 
 namespace phpbb\db;
 
+use phpbb\db\output_handler\migrator_output_handler_interface;
+use phpbb\db\output_handler\null_migrator_output_handler;
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -32,7 +34,7 @@ class migrator
 	/** @var \phpbb\db\driver\driver_interface */
 	protected $db;
 
-	/** @var \phpbb\db\tools */
+	/** @var \phpbb\db\tools\tools_interface */
 	protected $db_tools;
 
 	/** @var \phpbb\db\migration\helper */
@@ -92,7 +94,7 @@ class migrator
 	/**
 	* Constructor of the database migrator
 	*/
-	public function __construct(ContainerInterface $container, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\db\tools $db_tools, $migrations_table, $phpbb_root_path, $php_ext, $table_prefix, $tools, \phpbb\db\migration\helper $helper)
+	public function __construct(ContainerInterface $container, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\db\tools\tools_interface $db_tools, $migrations_table, $phpbb_root_path, $php_ext, $table_prefix, $tools, \phpbb\db\migration\helper $helper)
 	{
 		$this->container = $container;
 		$this->config = $config;
@@ -122,7 +124,7 @@ class migrator
 	/**
 	 * Set the output handler.
 	 *
-	 * @param migrator_output_handler $handler The output handler
+	 * @param migrator_output_handler_interface $handler The output handler
 	 */
 	public function set_output_handler(migrator_output_handler_interface $handler)
 	{
@@ -182,9 +184,49 @@ class migrator
 	*/
 	public function set_migrations($class_names)
 	{
+		foreach ($class_names as $key => $class)
+		{
+			if (!self::is_migration($class))
+			{
+				unset($class_names[$key]);
+			}
+		}
+
 		$this->migrations = $class_names;
 	}
 
+	/**
+	 * Get the list of available migration class names
+	 *
+	 * @return array Array of all migrations available to be run
+	 */
+	public function get_migrations()
+	{
+		return $this->migrations;
+	}
+
+	/**
+	 * Get the list of available and not installed migration class names
+	 *
+	 * @return array
+	 */
+	public function get_installable_migrations()
+	{
+		$unfinished_migrations = array();
+
+		foreach ($this->migrations as $name)
+		{
+			if (!isset($this->migration_state[$name]) ||
+				!$this->migration_state[$name]['migration_schema_done'] ||
+				!$this->migration_state[$name]['migration_data_done'])
+			{
+				$unfinished_migrations[] = $name;
+			}
+		}
+
+		return $unfinished_migrations;
+	}
+
 	/**
 	* Runs a single update step from the next migration to be applied.
 	*
@@ -200,6 +242,34 @@ class migrator
 		$this->container->get('dispatcher')->enable();
 	}
 
+	/**
+	 * Get a valid migration name from the migration state array in case the
+	 * supplied name is not in the migration state list.
+	 *
+	 * @param string $name Migration name
+	 * @return string Migration name
+	 */
+	protected function get_valid_name($name)
+	{
+		// Try falling back to a valid migration name with or without leading backslash
+		if (!isset($this->migration_state[$name]))
+		{
+			$prepended_name = ($name[0] == '\\' ? '' : '\\') . $name;
+			$prefixless_name = $name[0] == '\\' ? substr($name, 1) : $name;
+
+			if (isset($this->migration_state[$prepended_name]))
+			{
+				$name = $prepended_name;
+			}
+			else if (isset($this->migration_state[$prefixless_name]))
+			{
+				$name = $prefixless_name;
+			}
+		}
+
+		return $name;
+	}
+
 	/**
 	 * Effectively runs a single update step from the next migration to be applied.
 	 *
@@ -209,6 +279,8 @@ class migrator
 	{
 		foreach ($this->migrations as $name)
 		{
+			$name = $this->get_valid_name($name);
+
 			if (!isset($this->migration_state[$name]) ||
 				!$this->migration_state[$name]['migration_schema_done'] ||
 				!$this->migration_state[$name]['migration_data_done'])
@@ -264,6 +336,9 @@ class migrator
 
 		foreach ($state['migration_depends_on'] as $depend)
 		{
+			$depend = $this->get_valid_name($depend);
+
+			// Test all possible namings before throwing exception
 			if ($this->unfulfillable($depend) !== false)
 			{
 				throw new \phpbb\db\migration\exception('MIGRATION_NOT_FULFILLABLE', $name, $depend);
@@ -464,19 +539,60 @@ class migrator
 
 		if ($state['migration_data_done'])
 		{
+			$verbosity = empty($state['migration_data_state']) ?
+				migrator_output_handler_interface::VERBOSITY_VERBOSE : migrator_output_handler_interface::VERBOSITY_DEBUG;
+			$this->output_handler->write(array('MIGRATION_REVERT_DATA_RUNNING', $name), $verbosity);
+
+			$total_time = (is_array($state['migration_data_state']) && isset($state['migration_data_state']['_total_time'])) ?
+				$state['migration_data_state']['_total_time'] : 0.0;
+			$elapsed_time = microtime(true);
+
 			$steps = array_merge($this->helper->reverse_update_data($migration->update_data()), $migration->revert_data());
 			$result = $this->process_data_step($steps, $state['migration_data_state']);
 
+			$elapsed_time = microtime(true) - $elapsed_time;
+			$total_time += $elapsed_time;
+
+			if (is_array($result))
+			{
+				$result['_total_time'] = $total_time;
+			}
+
 			$state['migration_data_state'] = ($result === true) ? '' : $result;
 			$state['migration_data_done'] = ($result === true) ? false : true;
 
 			$this->set_migration_state($name, $state);
+
+			if (!$state['migration_data_done'])
+			{
+				$this->output_handler->write(array('MIGRATION_REVERT_DATA_DONE', $name, $total_time), migrator_output_handler_interface::VERBOSITY_NORMAL);
+			}
+			else
+			{
+				$this->output_handler->write(array('MIGRATION_REVERT_DATA_IN_PROGRESS', $name, $elapsed_time), migrator_output_handler_interface::VERBOSITY_VERY_VERBOSE);
+			}
 		}
 		else if ($state['migration_schema_done'])
 		{
+			$verbosity = empty($state['migration_data_state']) ?
+				migrator_output_handler_interface::VERBOSITY_VERBOSE : migrator_output_handler_interface::VERBOSITY_DEBUG;
+			$this->output_handler->write(array('MIGRATION_REVERT_SCHEMA_RUNNING', $name), $verbosity);
+
+			$total_time = (is_array($state['migration_data_state']) && isset($state['migration_data_state']['_total_time'])) ?
+				$state['migration_data_state']['_total_time'] : 0.0;
+			$elapsed_time = microtime(true);
+
 			$steps = $this->helper->get_schema_steps($migration->revert_schema());
 			$result = $this->process_data_step($steps, $state['migration_data_state']);
 
+			$elapsed_time = microtime(true) - $elapsed_time;
+			$total_time += $elapsed_time;
+
+			if (is_array($result))
+			{
+				$result['_total_time'] = $total_time;
+			}
+
 			$state['migration_data_state'] = ($result === true) ? '' : $result;
 			$state['migration_schema_done'] = ($result === true) ? false : true;
 
@@ -488,10 +604,14 @@ class migrator
 
 				$this->last_run_migration = false;
 				unset($this->migration_state[$name]);
+
+				$this->output_handler->write(array('MIGRATION_REVERT_SCHEMA_DONE', $name, $total_time), migrator_output_handler_interface::VERBOSITY_NORMAL);
 			}
 			else
 			{
 				$this->set_migration_state($name, $state);
+
+				$this->output_handler->write(array('MIGRATION_REVERT_SCHEMA_IN_PROGRESS', $name, $elapsed_time), migrator_output_handler_interface::VERBOSITY_VERY_VERBOSE);
 			}
 		}
 
@@ -742,6 +862,8 @@ class migrator
 	*/
 	public function unfulfillable($name)
 	{
+		$name = $this->get_valid_name($name);
+
 		if (isset($this->migration_state[$name]) || isset($this->fulfillable_migrations[$name]))
 		{
 			return false;
@@ -757,6 +879,7 @@ class migrator
 
 		foreach ($depends as $depend)
 		{
+			$depend = $this->get_valid_name($depend);
 			$unfulfillable = $this->unfulfillable($depend);
 			if ($unfulfillable !== false)
 			{
@@ -885,4 +1008,27 @@ class migrator
 			));
 		}
 	}
+
+	/**
+	 * Check if a class is a migration.
+	 *
+	 * @param string $migration A migration class name
+	 * @return bool Return true if class is a migration, false otherwise
+	 */
+	static public function is_migration($migration)
+	{
+		if (class_exists($migration))
+		{
+			// Migration classes should extend the abstract class
+			// phpbb\db\migration\migration (which implements the
+			// migration_interface) and be instantiable.
+			$reflector = new \ReflectionClass($migration);
+			if ($reflector->implementsInterface('\phpbb\db\migration\migration_interface') && $reflector->isInstantiable())
+			{
+				return true;
+			}
+		}
+
+		return false;
+	}
 }
--- /dev/null
+++ b/phpbb/db/output_handler/html_migrator_output_handler.php
@@ -0,0 +1,46 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\output_handler;
+
+class html_migrator_output_handler implements migrator_output_handler_interface
+{
+	/**
+	 * Language object.
+	 *
+	 * @var \phpbb\language\language
+	 */
+	private $language;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\language\language	$language	Language object
+	 */
+	public function __construct(\phpbb\language\language $language)
+	{
+		$this->language = $language;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function write($message, $verbosity)
+	{
+		if ($verbosity <= migrator_output_handler_interface::VERBOSITY_VERBOSE)
+		{
+			$final_message = $this->language->lang_array(array_shift($message), $message);
+			echo $final_message . "<br />\n";
+		}
+	}
+}
--- /dev/null
+++ b/phpbb/db/output_handler/installer_migrator_output_handler.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\db\output_handler;
+
+use phpbb\install\helper\iohandler\iohandler_interface;
+
+class installer_migrator_output_handler implements migrator_output_handler_interface
+{
+	/**
+	 * @var iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * Constructor
+	 *
+	 * @param iohandler_interface	$iohandler	Installer's IO-handler
+	 */
+	public function __construct(iohandler_interface $iohandler)
+	{
+		$this->iohandler = $iohandler;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function write($message, $verbosity)
+	{
+		if ($verbosity <= migrator_output_handler_interface::VERBOSITY_VERBOSE)
+		{
+			$this->iohandler->add_log_message($message);
+			$this->iohandler->send_response();
+		}
+	}
+}
--- /dev/null
+++ b/phpbb/db/output_handler/log_wrapper_migrator_output_handler.php
@@ -0,0 +1,101 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\output_handler;
+
+class log_wrapper_migrator_output_handler implements migrator_output_handler_interface
+{
+	/**
+	 * Language object.
+	 *
+	 * @var \phpbb\language\language
+	 */
+	protected $language;
+
+	/**
+	 * A migrator output handler
+	 *
+	 * @var migrator_output_handler_interface
+	 */
+	protected $migrator;
+
+	/**
+	 * Log file handle
+	 * @var resource
+	 */
+	protected $file_handle = false;
+
+	/**
+	 * @var \phpbb\filesystem\filesystem_interface
+	 */
+	protected $filesystem;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\language\language					$language	Language object
+	 * @param migrator_output_handler_interface			$migrator	Migrator output handler
+	 * @param string									$log_file	File to log to
+	 * @param \phpbb\filesystem\filesystem_interface	$filesystem	phpBB filesystem object
+	 */
+	public function __construct(\phpbb\language\language $language, migrator_output_handler_interface $migrator, $log_file, \phpbb\filesystem\filesystem_interface $filesystem)
+	{
+		$this->language = $language;
+		$this->migrator = $migrator;
+		$this->filesystem = $filesystem;
+		$this->file_open($log_file);
+	}
+
+	/**
+	 * Open file for logging
+	 *
+	 * @param string $file File to open
+	 */
+	protected function file_open($file)
+	{
+		if ($this->filesystem->is_writable(dirname($file)))
+		{
+			$this->file_handle = fopen($file, 'w');
+		}
+		else
+		{
+			throw new \RuntimeException('Unable to write to migrator log file');
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function write($message, $verbosity)
+	{
+		$this->migrator->write($message, $verbosity);
+
+		if ($this->file_handle !== false)
+		{
+
+			$translated_message = $this->language->lang_array(array_shift($message), $message);
+
+			if ($verbosity <= migrator_output_handler_interface::VERBOSITY_NORMAL)
+			{
+				$translated_message = '[INFO] ' . $translated_message;
+			}
+			else
+			{
+				$translated_message = '[DEBUG] ' . $translated_message;
+			}
+
+			fwrite($this->file_handle, $translated_message . "\n");
+			fflush($this->file_handle);
+		}
+	}
+}
--- /dev/null
+++ b/phpbb/db/output_handler/migrator_output_handler_interface.php
@@ -0,0 +1,31 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\output_handler;
+
+interface migrator_output_handler_interface
+{
+	const VERBOSITY_QUIET        = 16;
+	const VERBOSITY_NORMAL       = 32;
+	const VERBOSITY_VERBOSE      = 64;
+	const VERBOSITY_VERY_VERBOSE = 128;
+	const VERBOSITY_DEBUG        = 256;
+
+	/**
+	 * Write output using the configured closure.
+	 *
+	 * @param string|array $message The message to write or an array containing the language key and all of its parameters.
+	 * @param int $verbosity The verbosity of the message.
+	 */
+	public function write($message, $verbosity);
+}
--- /dev/null
+++ b/phpbb/db/output_handler/null_migrator_output_handler.php
@@ -0,0 +1,24 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\output_handler;
+
+class null_migrator_output_handler implements migrator_output_handler_interface
+{
+	/**
+	 * {@inheritdoc}
+	 */
+	public function write($message, $verbosity)
+	{
+	}
+}
--- /dev/null
+++ b/phpbb/db/tools/factory.php
@@ -0,0 +1,43 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\tools;
+
+/**
+ * A factory which serves the suitable tools instance for the given dbal
+ */
+class factory
+{
+	/**
+	 * @param mixed $db_driver
+	 * @param bool $return_statements
+	 * @return \phpbb\db\tools\tools_interface
+	 */
+	public function get($db_driver, $return_statements = false)
+	{
+		if ($db_driver instanceof \phpbb\db\driver\mssql_base)
+		{
+			return new \phpbb\db\tools\mssql($db_driver, $return_statements);
+		}
+		else if ($db_driver instanceof \phpbb\db\driver\postgres)
+		{
+			return new \phpbb\db\tools\postgres($db_driver, $return_statements);
+		}
+		else if ($db_driver instanceof \phpbb\db\driver\driver_interface)
+		{
+			return new \phpbb\db\tools\tools($db_driver, $return_statements);
+		}
+
+		throw new \InvalidArgumentException('Invalid database driver given');
+	}
+}
--- /dev/null
+++ b/phpbb/db/tools/mssql.php
@@ -0,0 +1,794 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\db\tools;
+
+/**
+ * Database Tools for handling cross-db actions such as altering columns, etc.
+ * Currently not supported is returning SQL for creating tables.
+ */
+class mssql extends tools
+{
+	/**
+	 * Is the used MS SQL Server a SQL Server 2000?
+	 * @var bool
+	 */
+	protected $is_sql_server_2000;
+
+	/**
+	 * Get the column types for mssql based databases
+	 *
+	 * @return array
+	 */
+	public static function get_dbms_type_map()
+	{
+		return array(
+			'mssql'		=> array(
+				'INT:'		=> '[int]',
+				'BINT'		=> '[float]',
+				'ULINT'		=> '[int]',
+				'UINT'		=> '[int]',
+				'UINT:'		=> '[int]',
+				'TINT:'		=> '[int]',
+				'USINT'		=> '[int]',
+				'BOOL'		=> '[int]',
+				'VCHAR'		=> '[varchar] (255)',
+				'VCHAR:'	=> '[varchar] (%d)',
+				'CHAR:'		=> '[char] (%d)',
+				'XSTEXT'	=> '[varchar] (1000)',
+				'STEXT'		=> '[varchar] (3000)',
+				'TEXT'		=> '[varchar] (8000)',
+				'MTEXT'		=> '[text]',
+				'XSTEXT_UNI'=> '[varchar] (100)',
+				'STEXT_UNI'	=> '[varchar] (255)',
+				'TEXT_UNI'	=> '[varchar] (4000)',
+				'MTEXT_UNI'	=> '[text]',
+				'TIMESTAMP'	=> '[int]',
+				'DECIMAL'	=> '[float]',
+				'DECIMAL:'	=> '[float]',
+				'PDECIMAL'	=> '[float]',
+				'PDECIMAL:'	=> '[float]',
+				'VCHAR_UNI'	=> '[varchar] (255)',
+				'VCHAR_UNI:'=> '[varchar] (%d)',
+				'VCHAR_CI'	=> '[varchar] (255)',
+				'VARBINARY'	=> '[varchar] (255)',
+			),
+
+			'mssqlnative'	=> array(
+				'INT:'		=> '[int]',
+				'BINT'		=> '[float]',
+				'ULINT'		=> '[int]',
+				'UINT'		=> '[int]',
+				'UINT:'		=> '[int]',
+				'TINT:'		=> '[int]',
+				'USINT'		=> '[int]',
+				'BOOL'		=> '[int]',
+				'VCHAR'		=> '[varchar] (255)',
+				'VCHAR:'	=> '[varchar] (%d)',
+				'CHAR:'		=> '[char] (%d)',
+				'XSTEXT'	=> '[varchar] (1000)',
+				'STEXT'		=> '[varchar] (3000)',
+				'TEXT'		=> '[varchar] (8000)',
+				'MTEXT'		=> '[text]',
+				'XSTEXT_UNI'=> '[varchar] (100)',
+				'STEXT_UNI'	=> '[varchar] (255)',
+				'TEXT_UNI'	=> '[varchar] (4000)',
+				'MTEXT_UNI'	=> '[text]',
+				'TIMESTAMP'	=> '[int]',
+				'DECIMAL'	=> '[float]',
+				'DECIMAL:'	=> '[float]',
+				'PDECIMAL'	=> '[float]',
+				'PDECIMAL:'	=> '[float]',
+				'VCHAR_UNI'	=> '[varchar] (255)',
+				'VCHAR_UNI:'=> '[varchar] (%d)',
+				'VCHAR_CI'	=> '[varchar] (255)',
+				'VARBINARY'	=> '[varchar] (255)',
+			),
+		);
+	}
+
+	/**
+	* Constructor. Set DB Object and set {@link $return_statements return_statements}.
+	*
+	* @param \phpbb\db\driver\driver_interface	$db					Database connection
+	* @param bool		$return_statements	True if only statements should be returned and no SQL being executed
+	*/
+	public function __construct(\phpbb\db\driver\driver_interface $db, $return_statements = false)
+	{
+		parent::__construct($db, $return_statements);
+
+		// Determine mapping database type
+		switch ($this->db->get_sql_layer())
+		{
+			case 'mssql_odbc':
+				$this->sql_layer = 'mssql';
+			break;
+
+			case 'mssqlnative':
+				$this->sql_layer = 'mssqlnative';
+			break;
+		}
+
+		$this->dbms_type_map = self::get_dbms_type_map();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_list_tables()
+	{
+		$sql = "SELECT name
+			FROM sysobjects
+			WHERE type='U'";
+		$result = $this->db->sql_query($sql);
+
+		$tables = array();
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$name = current($row);
+			$tables[$name] = $name;
+		}
+		$this->db->sql_freeresult($result);
+
+		return $tables;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_create_table($table_name, $table_data)
+	{
+		// holds the DDL for a column
+		$columns = $statements = array();
+
+		if ($this->sql_table_exists($table_name))
+		{
+			return $this->_sql_run_sql($statements);
+		}
+
+		// Begin transaction
+		$statements[] = 'begin';
+
+		// Determine if we have created a PRIMARY KEY in the earliest
+		$primary_key_gen = false;
+
+		// Determine if the table requires a sequence
+		$create_sequence = false;
+
+		// Begin table sql statement
+		$table_sql = 'CREATE TABLE [' . $table_name . '] (' . "\n";
+
+		if (!isset($table_data['PRIMARY_KEY']))
+		{
+			$table_data['COLUMNS']['mssqlindex'] = array('UINT', null, 'auto_increment');
+			$table_data['PRIMARY_KEY'] = 'mssqlindex';
+		}
+
+		// Iterate through the columns to create a table
+		foreach ($table_data['COLUMNS'] as $column_name => $column_data)
+		{
+			// here lies an array, filled with information compiled on the column's data
+			$prepared_column = $this->sql_prepare_column_data($table_name, $column_name, $column_data);
+
+			if (isset($prepared_column['auto_increment']) && $prepared_column['auto_increment'] && strlen($column_name) > 26) // "${column_name}_gen"
+			{
+				trigger_error("Index name '${column_name}_gen' on table '$table_name' is too long. The maximum auto increment column length is 26 characters.", E_USER_ERROR);
+			}
+
+			// here we add the definition of the new column to the list of columns
+			$columns[] = "\t [{$column_name}] " . $prepared_column['column_type_sql_default'];
+
+			// see if we have found a primary key set due to a column definition if we have found it, we can stop looking
+			if (!$primary_key_gen)
+			{
+				$primary_key_gen = isset($prepared_column['primary_key_set']) && $prepared_column['primary_key_set'];
+			}
+
+			// create sequence DDL based off of the existance of auto incrementing columns
+			if (!$create_sequence && isset($prepared_column['auto_increment']) && $prepared_column['auto_increment'])
+			{
+				$create_sequence = $column_name;
+			}
+		}
+
+		// this makes up all the columns in the create table statement
+		$table_sql .= implode(",\n", $columns);
+
+		// Close the table for two DBMS and add to the statements
+		$table_sql .= "\n);";
+		$statements[] = $table_sql;
+
+		// we have yet to create a primary key for this table,
+		// this means that we can add the one we really wanted instead
+		if (!$primary_key_gen)
+		{
+			// Write primary key
+			if (isset($table_data['PRIMARY_KEY']))
+			{
+				if (!is_array($table_data['PRIMARY_KEY']))
+				{
+					$table_data['PRIMARY_KEY'] = array($table_data['PRIMARY_KEY']);
+				}
+
+				// We need the data here
+				$old_return_statements = $this->return_statements;
+				$this->return_statements = true;
+
+				$primary_key_stmts = $this->sql_create_primary_key($table_name, $table_data['PRIMARY_KEY']);
+				foreach ($primary_key_stmts as $pk_stmt)
+				{
+					$statements[] = $pk_stmt;
+				}
+
+				$this->return_statements = $old_return_statements;
+			}
+		}
+
+		// Write Keys
+		if (isset($table_data['KEYS']))
+		{
+			foreach ($table_data['KEYS'] as $key_name => $key_data)
+			{
+				if (!is_array($key_data[1]))
+				{
+					$key_data[1] = array($key_data[1]);
+				}
+
+				$old_return_statements = $this->return_statements;
+				$this->return_statements = true;
+
+				$key_stmts = ($key_data[0] == 'UNIQUE') ? $this->sql_create_unique_index($table_name, $key_name, $key_data[1]) : $this->sql_create_index($table_name, $key_name, $key_data[1]);
+
+				foreach ($key_stmts as $key_stmt)
+				{
+					$statements[] = $key_stmt;
+				}
+
+				$this->return_statements = $old_return_statements;
+			}
+		}
+
+		// Commit Transaction
+		$statements[] = 'commit';
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_list_columns($table_name)
+	{
+		$columns = array();
+
+		$sql = "SELECT c.name
+			FROM syscolumns c
+			LEFT JOIN sysobjects o ON c.id = o.id
+			WHERE o.name = '{$table_name}'";
+		$result = $this->db->sql_query($sql);
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$column = strtolower(current($row));
+			$columns[$column] = $column;
+		}
+		$this->db->sql_freeresult($result);
+
+		return $columns;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_index_exists($table_name, $index_name)
+	{
+		$sql = "EXEC sp_statistics '$table_name'";
+		$result = $this->db->sql_query($sql);
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			if ($row['TYPE'] == 3)
+			{
+				if (strtolower($row['INDEX_NAME']) == strtolower($index_name))
+				{
+					$this->db->sql_freeresult($result);
+					return true;
+				}
+			}
+		}
+		$this->db->sql_freeresult($result);
+
+		return false;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_unique_index_exists($table_name, $index_name)
+	{
+		$sql = "EXEC sp_statistics '$table_name'";
+		$result = $this->db->sql_query($sql);
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			// Usually NON_UNIQUE is the column we want to check, but we allow for both
+			if ($row['TYPE'] == 3)
+			{
+				if (strtolower($row['INDEX_NAME']) == strtolower($index_name))
+				{
+					$this->db->sql_freeresult($result);
+					return true;
+				}
+			}
+		}
+		$this->db->sql_freeresult($result);
+
+		return false;
+	}
+
+	/**
+	 * {@inheritDoc}
+	*/
+	function sql_prepare_column_data($table_name, $column_name, $column_data)
+	{
+		if (strlen($column_name) > 30)
+		{
+			trigger_error("Column name '$column_name' on table '$table_name' is too long. The maximum is 30 characters.", E_USER_ERROR);
+		}
+
+		// Get type
+		list($column_type, ) = $this->get_column_type($column_data[0]);
+
+		// Adjust default value if db-dependent specified
+		if (is_array($column_data[1]))
+		{
+			$column_data[1] = (isset($column_data[1][$this->sql_layer])) ? $column_data[1][$this->sql_layer] : $column_data[1]['default'];
+		}
+
+		$sql = '';
+
+		$return_array = array();
+
+		$sql .= " {$column_type} ";
+		$sql_default = " {$column_type} ";
+
+		// For adding columns we need the default definition
+		if (!is_null($column_data[1]))
+		{
+			// For hexadecimal values do not use single quotes
+			if (strpos($column_data[1], '0x') === 0)
+			{
+				$return_array['default'] = 'DEFAULT (' . $column_data[1] . ') ';
+				$sql_default .= $return_array['default'];
+			}
+			else
+			{
+				$return_array['default'] = 'DEFAULT (' . ((is_numeric($column_data[1])) ? $column_data[1] : "'{$column_data[1]}'") . ') ';
+				$sql_default .= $return_array['default'];
+			}
+		}
+
+		if (isset($column_data[2]) && $column_data[2] == 'auto_increment')
+		{
+			// $sql .= 'IDENTITY (1, 1) ';
+			$sql_default .= 'IDENTITY (1, 1) ';
+		}
+
+		$return_array['textimage'] = $column_type === '[text]';
+
+		if (!is_null($column_data[1]) || (isset($column_data[2]) && $column_data[2] == 'auto_increment'))
+		{
+			$sql .= 'NOT NULL';
+			$sql_default .= 'NOT NULL';
+		}
+		else
+		{
+			$sql .= 'NULL';
+			$sql_default .= 'NULL';
+		}
+
+		$return_array['column_type_sql_default'] = $sql_default;
+
+		$return_array['column_type_sql'] = $sql;
+
+		return $return_array;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_column_add($table_name, $column_name, $column_data, $inline = false)
+	{
+		$column_data = $this->sql_prepare_column_data($table_name, $column_name, $column_data);
+		$statements = array();
+
+		// Does not support AFTER, only through temporary table
+		$statements[] = 'ALTER TABLE [' . $table_name . '] ADD [' . $column_name . '] ' . $column_data['column_type_sql_default'];
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_column_remove($table_name, $column_name, $inline = false)
+	{
+		$statements = array();
+
+		// We need the data here
+		$old_return_statements = $this->return_statements;
+		$this->return_statements = true;
+
+		$indexes = $this->get_existing_indexes($table_name, $column_name);
+		$indexes = array_merge($indexes, $this->get_existing_indexes($table_name, $column_name, true));
+
+		// Drop any indexes
+		$recreate_indexes = array();
+		if (!empty($indexes))
+		{
+			foreach ($indexes as $index_name => $index_data)
+			{
+				$result = $this->sql_index_drop($table_name, $index_name);
+				$statements = array_merge($statements, $result);
+				if (sizeof($index_data) > 1)
+				{
+					// Remove this column from the index and recreate it
+					$recreate_indexes[$index_name] = array_diff($index_data, array($column_name));
+				}
+			}
+		}
+
+		// Drop default value constraint
+		$result = $this->mssql_get_drop_default_constraints_queries($table_name, $column_name);
+		$statements = array_merge($statements, $result);
+
+		// Remove the column
+		$statements[] = 'ALTER TABLE [' . $table_name . '] DROP COLUMN [' . $column_name . ']';
+
+		if (!empty($recreate_indexes))
+		{
+			// Recreate indexes after we removed the column
+			foreach ($recreate_indexes as $index_name => $index_data)
+			{
+				$result = $this->sql_create_index($table_name, $index_name, $index_data);
+				$statements = array_merge($statements, $result);
+			}
+		}
+
+		$this->return_statements = $old_return_statements;
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_index_drop($table_name, $index_name)
+	{
+		$statements = array();
+
+		$statements[] = 'DROP INDEX ' . $table_name . '.' . $index_name;
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_table_drop($table_name)
+	{
+		$statements = array();
+
+		if (!$this->sql_table_exists($table_name))
+		{
+			return $this->_sql_run_sql($statements);
+		}
+
+		// the most basic operation, get rid of the table
+		$statements[] = 'DROP TABLE ' . $table_name;
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_create_primary_key($table_name, $column, $inline = false)
+	{
+		$statements = array();
+
+		$sql = "ALTER TABLE [{$table_name}] WITH NOCHECK ADD ";
+		$sql .= "CONSTRAINT [PK_{$table_name}] PRIMARY KEY  CLUSTERED (";
+		$sql .= '[' . implode("],\n\t\t[", $column) . ']';
+		$sql .= ')';
+
+		$statements[] = $sql;
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_create_unique_index($table_name, $index_name, $column)
+	{
+		$statements = array();
+
+		$this->check_index_name_length($table_name, $index_name);
+
+		$statements[] = 'CREATE UNIQUE INDEX [' . $index_name . '] ON [' . $table_name . ']([' . implode('], [', $column) . '])';
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_create_index($table_name, $index_name, $column)
+	{
+		$statements = array();
+
+		$this->check_index_name_length($table_name, $index_name);
+
+		// remove index length
+		$column = preg_replace('#:.*$#', '', $column);
+
+		$statements[] = 'CREATE INDEX [' . $index_name . '] ON [' . $table_name . ']([' . implode('], [', $column) . '])';
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_list_index($table_name)
+	{
+		$index_array = array();
+		$sql = "EXEC sp_statistics '$table_name'";
+		$result = $this->db->sql_query($sql);
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			if ($row['TYPE'] == 3)
+			{
+				$index_array[] = strtolower($row['INDEX_NAME']);
+			}
+		}
+		$this->db->sql_freeresult($result);
+
+		return $index_array;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_column_change($table_name, $column_name, $column_data, $inline = false)
+	{
+		$column_data = $this->sql_prepare_column_data($table_name, $column_name, $column_data);
+		$statements = array();
+
+		// We need the data here
+		$old_return_statements = $this->return_statements;
+		$this->return_statements = true;
+
+		$indexes = $this->get_existing_indexes($table_name, $column_name);
+		$unique_indexes = $this->get_existing_indexes($table_name, $column_name, true);
+
+		// Drop any indexes
+		if (!empty($indexes) || !empty($unique_indexes))
+		{
+			$drop_indexes = array_merge(array_keys($indexes), array_keys($unique_indexes));
+			foreach ($drop_indexes as $index_name)
+			{
+				$result = $this->sql_index_drop($table_name, $index_name);
+				$statements = array_merge($statements, $result);
+			}
+		}
+
+		// Drop default value constraint
+		$result = $this->mssql_get_drop_default_constraints_queries($table_name, $column_name);
+		$statements = array_merge($statements, $result);
+
+		// Change the column
+		$statements[] = 'ALTER TABLE [' . $table_name . '] ALTER COLUMN [' . $column_name . '] ' . $column_data['column_type_sql'];
+
+		if (!empty($column_data['default']))
+		{
+			// Add new default value constraint
+			$statements[] = 'ALTER TABLE [' . $table_name . '] ADD CONSTRAINT [DF_' . $table_name . '_' . $column_name . '_1] ' . $column_data['default'] . ' FOR [' . $column_name . ']';
+		}
+
+		if (!empty($indexes))
+		{
+			// Recreate indexes after we changed the column
+			foreach ($indexes as $index_name => $index_data)
+			{
+				$result = $this->sql_create_index($table_name, $index_name, $index_data);
+				$statements = array_merge($statements, $result);
+			}
+		}
+
+		if (!empty($unique_indexes))
+		{
+			// Recreate unique indexes after we changed the column
+			foreach ($unique_indexes as $index_name => $index_data)
+			{
+				$result = $this->sql_create_unique_index($table_name, $index_name, $index_data);
+				$statements = array_merge($statements, $result);
+			}
+		}
+
+		$this->return_statements = $old_return_statements;
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	* Get queries to drop the default constraints of a column
+	*
+	* We need to drop the default constraints of a column,
+	* before being able to change their type or deleting them.
+	*
+	* @param string $table_name
+	* @param string $column_name
+	* @return array		Array with SQL statements
+	*/
+	protected function mssql_get_drop_default_constraints_queries($table_name, $column_name)
+	{
+		$statements = array();
+		if ($this->mssql_is_sql_server_2000())
+		{
+			// http://msdn.microsoft.com/en-us/library/aa175912%28v=sql.80%29.aspx
+			// Deprecated in SQL Server 2005
+			$sql = "SELECT so.name AS def_name
+				FROM sysobjects so
+				JOIN sysconstraints sc ON so.id = sc.constid
+				WHERE object_name(so.parent_obj) = '{$table_name}'
+					AND so.xtype = 'D'
+					AND sc.colid = (SELECT colid FROM syscolumns
+						WHERE id = object_id('{$table_name}')
+							AND name = '{$column_name}')";
+		}
+		else
+		{
+			$sql = "SELECT dobj.name AS def_name
+				FROM sys.columns col
+					LEFT OUTER JOIN sys.objects dobj ON (dobj.object_id = col.default_object_id AND dobj.type = 'D')
+				WHERE col.object_id = object_id('{$table_name}')
+					AND col.name = '{$column_name}'
+					AND dobj.name IS NOT NULL";
+		}
+
+		$result = $this->db->sql_query($sql);
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$statements[] = 'ALTER TABLE [' . $table_name . '] DROP CONSTRAINT [' . $row['def_name'] . ']';
+		}
+		$this->db->sql_freeresult($result);
+
+		return $statements;
+	}
+
+	/**
+	* Get a list with existing indexes for the column
+	*
+	* @param string $table_name
+	* @param string $column_name
+	* @param bool $unique Should we get unique indexes or normal ones
+	* @return array		Array with Index name => columns
+	*/
+	public function get_existing_indexes($table_name, $column_name, $unique = false)
+	{
+		$existing_indexes = array();
+		if ($this->mssql_is_sql_server_2000())
+		{
+			// http://msdn.microsoft.com/en-us/library/aa175912%28v=sql.80%29.aspx
+			// Deprecated in SQL Server 2005
+			$sql = "SELECT DISTINCT ix.name AS phpbb_index_name
+				FROM sysindexes ix
+				INNER JOIN sysindexkeys ixc
+					ON ixc.id = ix.id
+						AND ixc.indid = ix.indid
+				INNER JOIN syscolumns cols
+					ON cols.colid = ixc.colid
+						AND cols.id = ix.id
+				WHERE ix.id = object_id('{$table_name}')
+					AND cols.name = '{$column_name}'
+					AND INDEXPROPERTY(ix.id, ix.name, 'IsUnique') = " . ($unique ? '1' : '0');
+		}
+		else
+		{
+			$sql = "SELECT DISTINCT ix.name AS phpbb_index_name
+				FROM sys.indexes ix
+				INNER JOIN sys.index_columns ixc
+					ON ixc.object_id = ix.object_id
+						AND ixc.index_id = ix.index_id
+				INNER JOIN sys.columns cols
+					ON cols.column_id = ixc.column_id
+						AND cols.object_id = ix.object_id
+				WHERE ix.object_id = object_id('{$table_name}')
+					AND cols.name = '{$column_name}'
+					AND ix.is_unique = " . ($unique ? '1' : '0');
+		}
+
+		$result = $this->db->sql_query($sql);
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			if (!isset($row['is_unique']) || ($unique && $row['is_unique'] == 'UNIQUE') || (!$unique && $row['is_unique'] == 'NONUNIQUE'))
+			{
+				$existing_indexes[$row['phpbb_index_name']] = array();
+			}
+		}
+		$this->db->sql_freeresult($result);
+
+		if (empty($existing_indexes))
+		{
+			return array();
+		}
+
+		if ($this->mssql_is_sql_server_2000())
+		{
+			$sql = "SELECT DISTINCT ix.name AS phpbb_index_name, cols.name AS phpbb_column_name
+				FROM sysindexes ix
+				INNER JOIN sysindexkeys ixc
+					ON ixc.id = ix.id
+						AND ixc.indid = ix.indid
+				INNER JOIN syscolumns cols
+					ON cols.colid = ixc.colid
+						AND cols.id = ix.id
+				WHERE ix.id = object_id('{$table_name}')
+					AND " . $this->db->sql_in_set('ix.name', array_keys($existing_indexes));
+		}
+		else
+		{
+			$sql = "SELECT DISTINCT ix.name AS phpbb_index_name, cols.name AS phpbb_column_name
+				FROM sys.indexes ix
+				INNER JOIN sys.index_columns ixc
+					ON ixc.object_id = ix.object_id
+						AND ixc.index_id = ix.index_id
+				INNER JOIN sys.columns cols
+					ON cols.column_id = ixc.column_id
+						AND cols.object_id = ix.object_id
+				WHERE ix.object_id = object_id('{$table_name}')
+					AND " . $this->db->sql_in_set('ix.name', array_keys($existing_indexes));
+		}
+
+		$result = $this->db->sql_query($sql);
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$existing_indexes[$row['phpbb_index_name']][] = $row['phpbb_column_name'];
+		}
+		$this->db->sql_freeresult($result);
+
+		return $existing_indexes;
+	}
+
+	/**
+	* Is the used MS SQL Server a SQL Server 2000?
+	*
+	* @return bool
+	*/
+	protected function mssql_is_sql_server_2000()
+	{
+		if ($this->is_sql_server_2000 === null)
+		{
+			$sql = "SELECT CAST(SERVERPROPERTY('productversion') AS VARCHAR(25)) AS mssql_version";
+			$result = $this->db->sql_query($sql);
+			$properties = $this->db->sql_fetchrow($result);
+			$this->db->sql_freeresult($result);
+			$this->is_sql_server_2000 = $properties['mssql_version'][0] == '8';
+		}
+
+		return $this->is_sql_server_2000;
+	}
+
+}
--- /dev/null
+++ b/phpbb/db/tools/postgres.php
@@ -0,0 +1,614 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\db\tools;
+
+/**
+ * Database Tools for handling cross-db actions such as altering columns, etc.
+ * Currently not supported is returning SQL for creating tables.
+ */
+class postgres extends tools
+{
+	/**
+	 * Get the column types for postgres only
+	 *
+	 * @return array
+	 */
+	public static function get_dbms_type_map()
+	{
+		return array(
+			'postgres'	=> array(
+				'INT:'		=> 'INT4',
+				'BINT'		=> 'INT8',
+				'ULINT'		=> 'INT4', // unsigned
+				'UINT'		=> 'INT4', // unsigned
+				'UINT:'		=> 'INT4', // unsigned
+				'USINT'		=> 'INT2', // unsigned
+				'BOOL'		=> 'INT2', // unsigned
+				'TINT:'		=> 'INT2',
+				'VCHAR'		=> 'varchar(255)',
+				'VCHAR:'	=> 'varchar(%d)',
+				'CHAR:'		=> 'char(%d)',
+				'XSTEXT'	=> 'varchar(1000)',
+				'STEXT'		=> 'varchar(3000)',
+				'TEXT'		=> 'varchar(8000)',
+				'MTEXT'		=> 'TEXT',
+				'XSTEXT_UNI'=> 'varchar(100)',
+				'STEXT_UNI'	=> 'varchar(255)',
+				'TEXT_UNI'	=> 'varchar(4000)',
+				'MTEXT_UNI'	=> 'TEXT',
+				'TIMESTAMP'	=> 'INT4', // unsigned
+				'DECIMAL'	=> 'decimal(5,2)',
+				'DECIMAL:'	=> 'decimal(%d,2)',
+				'PDECIMAL'	=> 'decimal(6,3)',
+				'PDECIMAL:'	=> 'decimal(%d,3)',
+				'VCHAR_UNI'	=> 'varchar(255)',
+				'VCHAR_UNI:'=> 'varchar(%d)',
+				'VCHAR_CI'	=> 'varchar_ci',
+				'VARBINARY'	=> 'bytea',
+			),
+		);
+	}
+
+	/**
+	* Constructor. Set DB Object and set {@link $return_statements return_statements}.
+	*
+	* @param \phpbb\db\driver\driver_interface	$db					Database connection
+	* @param bool		$return_statements	True if only statements should be returned and no SQL being executed
+	*/
+	public function __construct(\phpbb\db\driver\driver_interface $db, $return_statements = false)
+	{
+		parent::__construct($db, $return_statements);
+
+		// Determine mapping database type
+		$this->sql_layer = 'postgres';
+
+		$this->dbms_type_map = self::get_dbms_type_map();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_list_tables()
+	{
+		$sql = 'SELECT relname
+			FROM pg_stat_user_tables';
+		$result = $this->db->sql_query($sql);
+
+		$tables = array();
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$name = current($row);
+			$tables[$name] = $name;
+		}
+		$this->db->sql_freeresult($result);
+
+		return $tables;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_create_table($table_name, $table_data)
+	{
+		// holds the DDL for a column
+		$columns = $statements = array();
+
+		if ($this->sql_table_exists($table_name))
+		{
+			return $this->_sql_run_sql($statements);
+		}
+
+		// Begin transaction
+		$statements[] = 'begin';
+
+		// Determine if we have created a PRIMARY KEY in the earliest
+		$primary_key_gen = false;
+
+		// Determine if the table requires a sequence
+		$create_sequence = false;
+
+		// Begin table sql statement
+		$table_sql = 'CREATE TABLE ' . $table_name . ' (' . "\n";
+
+		// Iterate through the columns to create a table
+		foreach ($table_data['COLUMNS'] as $column_name => $column_data)
+		{
+			// here lies an array, filled with information compiled on the column's data
+			$prepared_column = $this->sql_prepare_column_data($table_name, $column_name, $column_data);
+
+			if (isset($prepared_column['auto_increment']) && $prepared_column['auto_increment'] && strlen($column_name) > 26) // "${column_name}_gen"
+			{
+				trigger_error("Index name '${column_name}_gen' on table '$table_name' is too long. The maximum auto increment column length is 26 characters.", E_USER_ERROR);
+			}
+
+			// here we add the definition of the new column to the list of columns
+			$columns[] = "\t {$column_name} " . $prepared_column['column_type_sql'];
+
+			// see if we have found a primary key set due to a column definition if we have found it, we can stop looking
+			if (!$primary_key_gen)
+			{
+				$primary_key_gen = isset($prepared_column['primary_key_set']) && $prepared_column['primary_key_set'];
+			}
+
+			// create sequence DDL based off of the existance of auto incrementing columns
+			if (!$create_sequence && isset($prepared_column['auto_increment']) && $prepared_column['auto_increment'])
+			{
+				$create_sequence = $column_name;
+			}
+		}
+
+		// this makes up all the columns in the create table statement
+		$table_sql .= implode(",\n", $columns);
+
+		// we have yet to create a primary key for this table,
+		// this means that we can add the one we really wanted instead
+		if (!$primary_key_gen)
+		{
+			// Write primary key
+			if (isset($table_data['PRIMARY_KEY']))
+			{
+				if (!is_array($table_data['PRIMARY_KEY']))
+				{
+					$table_data['PRIMARY_KEY'] = array($table_data['PRIMARY_KEY']);
+				}
+
+				$table_sql .= ",\n\t PRIMARY KEY (" . implode(', ', $table_data['PRIMARY_KEY']) . ')';
+			}
+		}
+
+		// do we need to add a sequence for auto incrementing columns?
+		if ($create_sequence)
+		{
+			$statements[] = "CREATE SEQUENCE {$table_name}_seq;";
+		}
+
+		// close the table
+		$table_sql .= "\n);";
+		$statements[] = $table_sql;
+
+		// Write Keys
+		if (isset($table_data['KEYS']))
+		{
+			foreach ($table_data['KEYS'] as $key_name => $key_data)
+			{
+				if (!is_array($key_data[1]))
+				{
+					$key_data[1] = array($key_data[1]);
+				}
+
+				$old_return_statements = $this->return_statements;
+				$this->return_statements = true;
+
+				$key_stmts = ($key_data[0] == 'UNIQUE') ? $this->sql_create_unique_index($table_name, $key_name, $key_data[1]) : $this->sql_create_index($table_name, $key_name, $key_data[1]);
+
+				foreach ($key_stmts as $key_stmt)
+				{
+					$statements[] = $key_stmt;
+				}
+
+				$this->return_statements = $old_return_statements;
+			}
+		}
+
+		// Commit Transaction
+		$statements[] = 'commit';
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_list_columns($table_name)
+	{
+		$columns = array();
+
+		$sql = "SELECT a.attname
+			FROM pg_class c, pg_attribute a
+			WHERE c.relname = '{$table_name}'
+				AND a.attnum > 0
+				AND a.attrelid = c.oid";
+		$result = $this->db->sql_query($sql);
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$column = strtolower(current($row));
+			$columns[$column] = $column;
+		}
+		$this->db->sql_freeresult($result);
+
+		return $columns;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_index_exists($table_name, $index_name)
+	{
+		$sql = "SELECT ic.relname as index_name
+			FROM pg_class bc, pg_class ic, pg_index i
+			WHERE (bc.oid = i.indrelid)
+				AND (ic.oid = i.indexrelid)
+				AND (bc.relname = '" . $table_name . "')
+				AND (i.indisunique != 't')
+				AND (i.indisprimary != 't')";
+		$result = $this->db->sql_query($sql);
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			// This DBMS prefixes index names with the table name
+			$row['index_name'] = $this->strip_table_name_from_index_name($table_name, $row['index_name']);
+
+			if (strtolower($row['index_name']) == strtolower($index_name))
+			{
+				$this->db->sql_freeresult($result);
+				return true;
+			}
+		}
+		$this->db->sql_freeresult($result);
+
+		return false;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_unique_index_exists($table_name, $index_name)
+	{
+		$sql = "SELECT ic.relname as index_name, i.indisunique
+			FROM pg_class bc, pg_class ic, pg_index i
+			WHERE (bc.oid = i.indrelid)
+				AND (ic.oid = i.indexrelid)
+				AND (bc.relname = '" . $table_name . "')
+				AND (i.indisprimary != 't')";
+		$result = $this->db->sql_query($sql);
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			if ($row['indisunique'] != 't')
+			{
+				continue;
+			}
+
+			// This DBMS prefixes index names with the table name
+			$row['index_name'] = $this->strip_table_name_from_index_name($table_name, $row['index_name']);
+
+			if (strtolower($row['index_name']) == strtolower($index_name))
+			{
+				$this->db->sql_freeresult($result);
+				return true;
+			}
+		}
+		$this->db->sql_freeresult($result);
+
+		return false;
+	}
+
+	/**
+	* Function to prepare some column information for better usage
+	* @access private
+	*/
+	function sql_prepare_column_data($table_name, $column_name, $column_data)
+	{
+		if (strlen($column_name) > 30)
+		{
+			trigger_error("Column name '$column_name' on table '$table_name' is too long. The maximum is 30 characters.", E_USER_ERROR);
+		}
+
+		// Get type
+		list($column_type, $orig_column_type) = $this->get_column_type($column_data[0]);
+
+		// Adjust default value if db-dependent specified
+		if (is_array($column_data[1]))
+		{
+			$column_data[1] = (isset($column_data[1][$this->sql_layer])) ? $column_data[1][$this->sql_layer] : $column_data[1]['default'];
+		}
+
+		$sql = " {$column_type} ";
+
+		$return_array = array(
+			'column_type'		=> $column_type,
+			'auto_increment'	=> false,
+		);
+
+		if (isset($column_data[2]) && $column_data[2] == 'auto_increment')
+		{
+			$default_val = "nextval('{$table_name}_seq')";
+			$return_array['auto_increment'] = true;
+		}
+		else if (!is_null($column_data[1]))
+		{
+			$default_val = "'" . $column_data[1] . "'";
+			$return_array['null'] = 'NOT NULL';
+			$sql .= 'NOT NULL ';
+		}
+		else
+		{
+			// Integers need to have 0 instead of empty string as default
+			if (strpos($column_type, 'INT') === 0)
+			{
+				$default_val = '0';
+			}
+			else
+			{
+				$default_val = "'" . $column_data[1] . "'";
+			}
+			$return_array['null'] = 'NULL';
+			$sql .= 'NULL ';
+		}
+
+		$return_array['default'] = $default_val;
+
+		$sql .= "DEFAULT {$default_val}";
+
+		// Unsigned? Then add a CHECK contraint
+		if (in_array($orig_column_type, $this->unsigned_types))
+		{
+			$return_array['constraint'] = "CHECK ({$column_name} >= 0)";
+			$sql .= " CHECK ({$column_name} >= 0)";
+		}
+
+		$return_array['column_type_sql'] = $sql;
+
+		return $return_array;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_column_add($table_name, $column_name, $column_data, $inline = false)
+	{
+		$column_data = $this->sql_prepare_column_data($table_name, $column_name, $column_data);
+		$statements = array();
+
+		// Does not support AFTER, only through temporary table
+		if (version_compare($this->db->sql_server_info(true), '8.0', '>='))
+		{
+			$statements[] = 'ALTER TABLE ' . $table_name . ' ADD COLUMN "' . $column_name . '" ' . $column_data['column_type_sql'];
+		}
+		else
+		{
+			// old versions cannot add columns with default and null information
+			$statements[] = 'ALTER TABLE ' . $table_name . ' ADD COLUMN "' . $column_name . '" ' . $column_data['column_type'] . ' ' . $column_data['constraint'];
+
+			if (isset($column_data['null']))
+			{
+				if ($column_data['null'] == 'NOT NULL')
+				{
+					$statements[] = 'ALTER TABLE ' . $table_name . ' ALTER COLUMN ' . $column_name . ' SET NOT NULL';
+				}
+			}
+
+			if (isset($column_data['default']))
+			{
+				$statements[] = 'ALTER TABLE ' . $table_name . ' ALTER COLUMN ' . $column_name . ' SET DEFAULT ' . $column_data['default'];
+			}
+		}
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_column_remove($table_name, $column_name, $inline = false)
+	{
+		$statements = array();
+
+		$statements[] = 'ALTER TABLE ' . $table_name . ' DROP COLUMN "' . $column_name . '"';
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_index_drop($table_name, $index_name)
+	{
+		$statements = array();
+
+		$statements[] = 'DROP INDEX ' . $table_name . '_' . $index_name;
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_table_drop($table_name)
+	{
+		$statements = array();
+
+		if (!$this->sql_table_exists($table_name))
+		{
+			return $this->_sql_run_sql($statements);
+		}
+
+		// the most basic operation, get rid of the table
+		$statements[] = 'DROP TABLE ' . $table_name;
+
+		// PGSQL does not "tightly" bind sequences and tables, we must guess...
+		$sql = "SELECT relname
+			FROM pg_class
+			WHERE relkind = 'S'
+				AND relname = '{$table_name}_seq'";
+		$result = $this->db->sql_query($sql);
+
+		// We don't even care about storing the results. We already know the answer if we get rows back.
+		if ($this->db->sql_fetchrow($result))
+		{
+			$statements[] =  "DROP SEQUENCE {$table_name}_seq;\n";
+		}
+		$this->db->sql_freeresult($result);
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_create_primary_key($table_name, $column, $inline = false)
+	{
+		$statements = array();
+
+		$statements[] = 'ALTER TABLE ' . $table_name . ' ADD PRIMARY KEY (' . implode(', ', $column) . ')';
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_create_unique_index($table_name, $index_name, $column)
+	{
+		$statements = array();
+
+		$this->check_index_name_length($table_name, $index_name);
+
+		$statements[] = 'CREATE UNIQUE INDEX ' . $table_name . '_' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')';
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_create_index($table_name, $index_name, $column)
+	{
+		$statements = array();
+
+		$this->check_index_name_length($table_name, $index_name);
+
+		// remove index length
+		$column = preg_replace('#:.*$#', '', $column);
+
+		$statements[] = 'CREATE INDEX ' . $table_name . '_' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')';
+
+		return $this->_sql_run_sql($statements);
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_list_index($table_name)
+	{
+		$index_array = array();
+
+		$sql = "SELECT ic.relname as index_name
+			FROM pg_class bc, pg_class ic, pg_index i
+			WHERE (bc.oid = i.indrelid)
+				AND (ic.oid = i.indexrelid)
+				AND (bc.relname = '" . $table_name . "')
+				AND (i.indisunique != 't')
+				AND (i.indisprimary != 't')";
+		$result = $this->db->sql_query($sql);
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$row['index_name'] = $this->strip_table_name_from_index_name($table_name, $row['index_name']);
+
+			$index_array[] = $row['index_name'];
+		}
+		$this->db->sql_freeresult($result);
+
+		return array_map('strtolower', $index_array);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_column_change($table_name, $column_name, $column_data, $inline = false)
+	{
+		$column_data = $this->sql_prepare_column_data($table_name, $column_name, $column_data);
+		$statements = array();
+
+		$sql = 'ALTER TABLE ' . $table_name . ' ';
+
+		$sql_array = array();
+		$sql_array[] = 'ALTER COLUMN ' . $column_name . ' TYPE ' . $column_data['column_type'];
+
+		if (isset($column_data['null']))
+		{
+			if ($column_data['null'] == 'NOT NULL')
+			{
+				$sql_array[] = 'ALTER COLUMN ' . $column_name . ' SET NOT NULL';
+			}
+			else if ($column_data['null'] == 'NULL')
+			{
+				$sql_array[] = 'ALTER COLUMN ' . $column_name . ' DROP NOT NULL';
+			}
+		}
+
+		if (isset($column_data['default']))
+		{
+			$sql_array[] = 'ALTER COLUMN ' . $column_name . ' SET DEFAULT ' . $column_data['default'];
+		}
+
+		// we don't want to double up on constraints if we change different number data types
+		if (isset($column_data['constraint']))
+		{
+			$constraint_sql = "SELECT consrc as constraint_data
+				FROM pg_constraint, pg_class bc
+				WHERE conrelid = bc.oid
+					AND bc.relname = '{$table_name}'
+					AND NOT EXISTS (
+						SELECT *
+						FROM pg_constraint as c, pg_inherits as i
+						WHERE i.inhrelid = pg_constraint.conrelid
+							AND c.conname = pg_constraint.conname
+							AND c.consrc = pg_constraint.consrc
+							AND c.conrelid = i.inhparent
+					)";
+
+			$constraint_exists = false;
+
+			$result = $this->db->sql_query($constraint_sql);
+			while ($row = $this->db->sql_fetchrow($result))
+			{
+				if (trim($row['constraint_data']) == trim($column_data['constraint']))
+				{
+					$constraint_exists = true;
+					break;
+				}
+			}
+			$this->db->sql_freeresult($result);
+
+			if (!$constraint_exists)
+			{
+				$sql_array[] = 'ADD ' . $column_data['constraint'];
+			}
+		}
+
+		$sql .= implode(', ', $sql_array);
+
+		$statements[] = $sql;
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	* Get a list with existing indexes for the column
+	*
+	* @param string $table_name
+	* @param string $column_name
+	* @param bool $unique Should we get unique indexes or normal ones
+	* @return array		Array with Index name => columns
+	*/
+	public function get_existing_indexes($table_name, $column_name, $unique = false)
+	{
+		// Not supported
+		throw new \Exception('DBMS is not supported');
+	}
+}
--- /dev/null
+++ b/phpbb/db/tools/tools.php
@@ -0,0 +1,1918 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\tools;
+
+/**
+* Database Tools for handling cross-db actions such as altering columns, etc.
+* Currently not supported is returning SQL for creating tables.
+*/
+class tools implements tools_interface
+{
+	/**
+	* Current sql layer
+	*/
+	var $sql_layer = '';
+
+	/**
+	* @var object DB object
+	*/
+	var $db = null;
+
+	/**
+	* The Column types for every database we support
+	* @var array
+	*/
+	var $dbms_type_map = array();
+
+	/**
+	* Get the column types for every database we support
+	*
+	* @return array
+	*/
+	static public function get_dbms_type_map()
+	{
+		return array(
+			'mysql_41'	=> array(
+				'INT:'		=> 'int(%d)',
+				'BINT'		=> 'bigint(20)',
+				'ULINT'		=> 'INT(10) UNSIGNED',
+				'UINT'		=> 'mediumint(8) UNSIGNED',
+				'UINT:'		=> 'int(%d) UNSIGNED',
+				'TINT:'		=> 'tinyint(%d)',
+				'USINT'		=> 'smallint(4) UNSIGNED',
+				'BOOL'		=> 'tinyint(1) UNSIGNED',
+				'VCHAR'		=> 'varchar(255)',
+				'VCHAR:'	=> 'varchar(%d)',
+				'CHAR:'		=> 'char(%d)',
+				'XSTEXT'	=> 'text',
+				'XSTEXT_UNI'=> 'varchar(100)',
+				'STEXT'		=> 'text',
+				'STEXT_UNI'	=> 'varchar(255)',
+				'TEXT'		=> 'text',
+				'TEXT_UNI'	=> 'text',
+				'MTEXT'		=> 'mediumtext',
+				'MTEXT_UNI'	=> 'mediumtext',
+				'TIMESTAMP'	=> 'int(11) UNSIGNED',
+				'DECIMAL'	=> 'decimal(5,2)',
+				'DECIMAL:'	=> 'decimal(%d,2)',
+				'PDECIMAL'	=> 'decimal(6,3)',
+				'PDECIMAL:'	=> 'decimal(%d,3)',
+				'VCHAR_UNI'	=> 'varchar(255)',
+				'VCHAR_UNI:'=> 'varchar(%d)',
+				'VCHAR_CI'	=> 'varchar(255)',
+				'VARBINARY'	=> 'varbinary(255)',
+			),
+
+			'mysql_40'	=> array(
+				'INT:'		=> 'int(%d)',
+				'BINT'		=> 'bigint(20)',
+				'ULINT'		=> 'INT(10) UNSIGNED',
+				'UINT'		=> 'mediumint(8) UNSIGNED',
+				'UINT:'		=> 'int(%d) UNSIGNED',
+				'TINT:'		=> 'tinyint(%d)',
+				'USINT'		=> 'smallint(4) UNSIGNED',
+				'BOOL'		=> 'tinyint(1) UNSIGNED',
+				'VCHAR'		=> 'varbinary(255)',
+				'VCHAR:'	=> 'varbinary(%d)',
+				'CHAR:'		=> 'binary(%d)',
+				'XSTEXT'	=> 'blob',
+				'XSTEXT_UNI'=> 'blob',
+				'STEXT'		=> 'blob',
+				'STEXT_UNI'	=> 'blob',
+				'TEXT'		=> 'blob',
+				'TEXT_UNI'	=> 'blob',
+				'MTEXT'		=> 'mediumblob',
+				'MTEXT_UNI'	=> 'mediumblob',
+				'TIMESTAMP'	=> 'int(11) UNSIGNED',
+				'DECIMAL'	=> 'decimal(5,2)',
+				'DECIMAL:'	=> 'decimal(%d,2)',
+				'PDECIMAL'	=> 'decimal(6,3)',
+				'PDECIMAL:'	=> 'decimal(%d,3)',
+				'VCHAR_UNI'	=> 'blob',
+				'VCHAR_UNI:'=> array('varbinary(%d)', 'limit' => array('mult', 3, 255, 'blob')),
+				'VCHAR_CI'	=> 'blob',
+				'VARBINARY'	=> 'varbinary(255)',
+			),
+
+			'oracle'	=> array(
+				'INT:'		=> 'number(%d)',
+				'BINT'		=> 'number(20)',
+				'ULINT'		=> 'number(10)',
+				'UINT'		=> 'number(8)',
+				'UINT:'		=> 'number(%d)',
+				'TINT:'		=> 'number(%d)',
+				'USINT'		=> 'number(4)',
+				'BOOL'		=> 'number(1)',
+				'VCHAR'		=> 'varchar2(255)',
+				'VCHAR:'	=> 'varchar2(%d)',
+				'CHAR:'		=> 'char(%d)',
+				'XSTEXT'	=> 'varchar2(1000)',
+				'STEXT'		=> 'varchar2(3000)',
+				'TEXT'		=> 'clob',
+				'MTEXT'		=> 'clob',
+				'XSTEXT_UNI'=> 'varchar2(300)',
+				'STEXT_UNI'	=> 'varchar2(765)',
+				'TEXT_UNI'	=> 'clob',
+				'MTEXT_UNI'	=> 'clob',
+				'TIMESTAMP'	=> 'number(11)',
+				'DECIMAL'	=> 'number(5, 2)',
+				'DECIMAL:'	=> 'number(%d, 2)',
+				'PDECIMAL'	=> 'number(6, 3)',
+				'PDECIMAL:'	=> 'number(%d, 3)',
+				'VCHAR_UNI'	=> 'varchar2(765)',
+				'VCHAR_UNI:'=> array('varchar2(%d)', 'limit' => array('mult', 3, 765, 'clob')),
+				'VCHAR_CI'	=> 'varchar2(255)',
+				'VARBINARY'	=> 'raw(255)',
+			),
+
+			'sqlite3'	=> array(
+				'INT:'		=> 'INT(%d)',
+				'BINT'		=> 'BIGINT(20)',
+				'ULINT'		=> 'INTEGER UNSIGNED',
+				'UINT'		=> 'INTEGER UNSIGNED',
+				'UINT:'		=> 'INTEGER UNSIGNED',
+				'TINT:'		=> 'TINYINT(%d)',
+				'USINT'		=> 'INTEGER UNSIGNED',
+				'BOOL'		=> 'INTEGER UNSIGNED',
+				'VCHAR'		=> 'VARCHAR(255)',
+				'VCHAR:'	=> 'VARCHAR(%d)',
+				'CHAR:'		=> 'CHAR(%d)',
+				'XSTEXT'	=> 'TEXT(65535)',
+				'STEXT'		=> 'TEXT(65535)',
+				'TEXT'		=> 'TEXT(65535)',
+				'MTEXT'		=> 'MEDIUMTEXT(16777215)',
+				'XSTEXT_UNI'=> 'TEXT(65535)',
+				'STEXT_UNI'	=> 'TEXT(65535)',
+				'TEXT_UNI'	=> 'TEXT(65535)',
+				'MTEXT_UNI'	=> 'MEDIUMTEXT(16777215)',
+				'TIMESTAMP'	=> 'INTEGER UNSIGNED', //'int(11) UNSIGNED',
+				'DECIMAL'	=> 'DECIMAL(5,2)',
+				'DECIMAL:'	=> 'DECIMAL(%d,2)',
+				'PDECIMAL'	=> 'DECIMAL(6,3)',
+				'PDECIMAL:'	=> 'DECIMAL(%d,3)',
+				'VCHAR_UNI'	=> 'VARCHAR(255)',
+				'VCHAR_UNI:'=> 'VARCHAR(%d)',
+				'VCHAR_CI'	=> 'VARCHAR(255)',
+				'VARBINARY'	=> 'BLOB',
+			),
+		);
+	}
+
+	/**
+	* A list of types being unsigned for better reference in some db's
+	* @var array
+	*/
+	var $unsigned_types = array('ULINT', 'UINT', 'UINT:', 'USINT', 'BOOL', 'TIMESTAMP');
+
+	/**
+	* This is set to true if user only wants to return the 'to-be-executed' SQL statement(s) (as an array).
+	* This mode has no effect on some methods (inserting of data for example). This is expressed within the methods command.
+	*/
+	var $return_statements = false;
+
+	/**
+	* Constructor. Set DB Object and set {@link $return_statements return_statements}.
+	*
+	* @param \phpbb\db\driver\driver_interface	$db					Database connection
+	* @param bool		$return_statements	True if only statements should be returned and no SQL being executed
+	*/
+	public function __construct(\phpbb\db\driver\driver_interface $db, $return_statements = false)
+	{
+		$this->db = $db;
+		$this->return_statements = $return_statements;
+
+		$this->dbms_type_map = self::get_dbms_type_map();
+
+		// Determine mapping database type
+		switch ($this->db->get_sql_layer())
+		{
+			case 'mysql':
+				$this->sql_layer = 'mysql_40';
+			break;
+
+			case 'mysql4':
+				if (version_compare($this->db->sql_server_info(true), '4.1.3', '>='))
+				{
+					$this->sql_layer = 'mysql_41';
+				}
+				else
+				{
+					$this->sql_layer = 'mysql_40';
+				}
+			break;
+
+			case 'mysqli':
+				$this->sql_layer = 'mysql_41';
+			break;
+
+			default:
+				$this->sql_layer = $this->db->get_sql_layer();
+			break;
+		}
+	}
+
+	/**
+	* Setter for {@link $return_statements return_statements}.
+	*
+	* @param bool $return_statements True if SQL should not be executed but returned as strings
+	* @return null
+	*/
+	public function set_return_statements($return_statements)
+	{
+		$this->return_statements = $return_statements;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_list_tables()
+	{
+		switch ($this->db->get_sql_layer())
+		{
+			case 'mysql':
+			case 'mysql4':
+			case 'mysqli':
+				$sql = 'SHOW TABLES';
+			break;
+
+			case 'sqlite3':
+				$sql = 'SELECT name
+					FROM sqlite_master
+					WHERE type = "table"
+						AND name <> "sqlite_sequence"';
+			break;
+
+			case 'oracle':
+				$sql = 'SELECT table_name
+					FROM USER_TABLES';
+			break;
+		}
+
+		$result = $this->db->sql_query($sql);
+
+		$tables = array();
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$name = current($row);
+			$tables[$name] = $name;
+		}
+		$this->db->sql_freeresult($result);
+
+		return $tables;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_table_exists($table_name)
+	{
+		$this->db->sql_return_on_error(true);
+		$result = $this->db->sql_query_limit('SELECT * FROM ' . $table_name, 1);
+		$this->db->sql_return_on_error(false);
+
+		if ($result)
+		{
+			$this->db->sql_freeresult($result);
+			return true;
+		}
+
+		return false;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_create_table($table_name, $table_data)
+	{
+		// holds the DDL for a column
+		$columns = $statements = array();
+
+		if ($this->sql_table_exists($table_name))
+		{
+			return $this->_sql_run_sql($statements);
+		}
+
+		// Begin transaction
+		$statements[] = 'begin';
+
+		// Determine if we have created a PRIMARY KEY in the earliest
+		$primary_key_gen = false;
+
+		// Determine if the table requires a sequence
+		$create_sequence = false;
+
+		// Begin table sql statement
+		$table_sql = 'CREATE TABLE ' . $table_name . ' (' . "\n";
+
+		// Iterate through the columns to create a table
+		foreach ($table_data['COLUMNS'] as $column_name => $column_data)
+		{
+			// here lies an array, filled with information compiled on the column's data
+			$prepared_column = $this->sql_prepare_column_data($table_name, $column_name, $column_data);
+
+			if (isset($prepared_column['auto_increment']) && $prepared_column['auto_increment'] && strlen($column_name) > 26) // "${column_name}_gen"
+			{
+				trigger_error("Index name '${column_name}_gen' on table '$table_name' is too long. The maximum auto increment column length is 26 characters.", E_USER_ERROR);
+			}
+
+			// here we add the definition of the new column to the list of columns
+			$columns[] = "\t {$column_name} " . $prepared_column['column_type_sql'];
+
+			// see if we have found a primary key set due to a column definition if we have found it, we can stop looking
+			if (!$primary_key_gen)
+			{
+				$primary_key_gen = isset($prepared_column['primary_key_set']) && $prepared_column['primary_key_set'];
+			}
+
+			// create sequence DDL based off of the existance of auto incrementing columns
+			if (!$create_sequence && isset($prepared_column['auto_increment']) && $prepared_column['auto_increment'])
+			{
+				$create_sequence = $column_name;
+			}
+		}
+
+		// this makes up all the columns in the create table statement
+		$table_sql .= implode(",\n", $columns);
+
+		// we have yet to create a primary key for this table,
+		// this means that we can add the one we really wanted instead
+		if (!$primary_key_gen)
+		{
+			// Write primary key
+			if (isset($table_data['PRIMARY_KEY']))
+			{
+				if (!is_array($table_data['PRIMARY_KEY']))
+				{
+					$table_data['PRIMARY_KEY'] = array($table_data['PRIMARY_KEY']);
+				}
+
+				switch ($this->sql_layer)
+				{
+					case 'mysql_40':
+					case 'mysql_41':
+					case 'sqlite3':
+						$table_sql .= ",\n\t PRIMARY KEY (" . implode(', ', $table_data['PRIMARY_KEY']) . ')';
+					break;
+
+					case 'oracle':
+						$table_sql .= ",\n\t CONSTRAINT pk_{$table_name} PRIMARY KEY (" . implode(', ', $table_data['PRIMARY_KEY']) . ')';
+					break;
+				}
+			}
+		}
+
+		// close the table
+		switch ($this->sql_layer)
+		{
+			case 'mysql_41':
+				// make sure the table is in UTF-8 mode
+				$table_sql .= "\n) CHARACTER SET `utf8` COLLATE `utf8_bin`;";
+				$statements[] = $table_sql;
+			break;
+
+			case 'mysql_40':
+			case 'sqlite3':
+				$table_sql .= "\n);";
+				$statements[] = $table_sql;
+			break;
+
+			case 'oracle':
+				$table_sql .= "\n)";
+				$statements[] = $table_sql;
+
+				// do we need to add a sequence and a tigger for auto incrementing columns?
+				if ($create_sequence)
+				{
+					// create the actual sequence
+					$statements[] = "CREATE SEQUENCE {$table_name}_seq";
+
+					// the trigger is the mechanism by which we increment the counter
+					$trigger = "CREATE OR REPLACE TRIGGER t_{$table_name}\n";
+					$trigger .= "BEFORE INSERT ON {$table_name}\n";
+					$trigger .= "FOR EACH ROW WHEN (\n";
+					$trigger .= "\tnew.{$create_sequence} IS NULL OR new.{$create_sequence} = 0\n";
+					$trigger .= ")\n";
+					$trigger .= "BEGIN\n";
+					$trigger .= "\tSELECT {$table_name}_seq.nextval\n";
+					$trigger .= "\tINTO :new.{$create_sequence}\n";
+					$trigger .= "\tFROM dual;\n";
+					$trigger .= "END;";
+
+					$statements[] = $trigger;
+				}
+			break;
+		}
+
+		// Write Keys
+		if (isset($table_data['KEYS']))
+		{
+			foreach ($table_data['KEYS'] as $key_name => $key_data)
+			{
+				if (!is_array($key_data[1]))
+				{
+					$key_data[1] = array($key_data[1]);
+				}
+
+				$old_return_statements = $this->return_statements;
+				$this->return_statements = true;
+
+				$key_stmts = ($key_data[0] == 'UNIQUE') ? $this->sql_create_unique_index($table_name, $key_name, $key_data[1]) : $this->sql_create_index($table_name, $key_name, $key_data[1]);
+
+				foreach ($key_stmts as $key_stmt)
+				{
+					$statements[] = $key_stmt;
+				}
+
+				$this->return_statements = $old_return_statements;
+			}
+		}
+
+		// Commit Transaction
+		$statements[] = 'commit';
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function perform_schema_changes($schema_changes)
+	{
+		if (empty($schema_changes))
+		{
+			return;
+		}
+
+		$statements = array();
+		$sqlite = false;
+
+		// For SQLite we need to perform the schema changes in a much more different way
+		if ($this->db->get_sql_layer() == 'sqlite3' && $this->return_statements)
+		{
+			$sqlite_data = array();
+			$sqlite = true;
+		}
+
+		// Drop tables?
+		if (!empty($schema_changes['drop_tables']))
+		{
+			foreach ($schema_changes['drop_tables'] as $table)
+			{
+				// only drop table if it exists
+				if ($this->sql_table_exists($table))
+				{
+					$result = $this->sql_table_drop($table);
+					if ($this->return_statements)
+					{
+						$statements = array_merge($statements, $result);
+					}
+				}
+			}
+		}
+
+		// Add tables?
+		if (!empty($schema_changes['add_tables']))
+		{
+			foreach ($schema_changes['add_tables'] as $table => $table_data)
+			{
+				$result = $this->sql_create_table($table, $table_data);
+				if ($this->return_statements)
+				{
+					$statements = array_merge($statements, $result);
+				}
+			}
+		}
+
+		// Change columns?
+		if (!empty($schema_changes['change_columns']))
+		{
+			foreach ($schema_changes['change_columns'] as $table => $columns)
+			{
+				foreach ($columns as $column_name => $column_data)
+				{
+					// If the column exists we change it, else we add it ;)
+					if ($column_exists = $this->sql_column_exists($table, $column_name))
+					{
+						$result = $this->sql_column_change($table, $column_name, $column_data, true);
+					}
+					else
+					{
+						$result = $this->sql_column_add($table, $column_name, $column_data, true);
+					}
+
+					if ($sqlite)
+					{
+						if ($column_exists)
+						{
+							$sqlite_data[$table]['change_columns'][] = $result;
+						}
+						else
+						{
+							$sqlite_data[$table]['add_columns'][] = $result;
+						}
+					}
+					else if ($this->return_statements)
+					{
+						$statements = array_merge($statements, $result);
+					}
+				}
+			}
+		}
+
+		// Add columns?
+		if (!empty($schema_changes['add_columns']))
+		{
+			foreach ($schema_changes['add_columns'] as $table => $columns)
+			{
+				foreach ($columns as $column_name => $column_data)
+				{
+					// Only add the column if it does not exist yet
+					if ($column_exists = $this->sql_column_exists($table, $column_name))
+					{
+						continue;
+						// This is commented out here because it can take tremendous time on updates
+//						$result = $this->sql_column_change($table, $column_name, $column_data, true);
+					}
+					else
+					{
+						$result = $this->sql_column_add($table, $column_name, $column_data, true);
+					}
+
+					if ($sqlite)
+					{
+						if ($column_exists)
+						{
+							continue;
+//							$sqlite_data[$table]['change_columns'][] = $result;
+						}
+						else
+						{
+							$sqlite_data[$table]['add_columns'][] = $result;
+						}
+					}
+					else if ($this->return_statements)
+					{
+						$statements = array_merge($statements, $result);
+					}
+				}
+			}
+		}
+
+		// Remove keys?
+		if (!empty($schema_changes['drop_keys']))
+		{
+			foreach ($schema_changes['drop_keys'] as $table => $indexes)
+			{
+				foreach ($indexes as $index_name)
+				{
+					if (!$this->sql_index_exists($table, $index_name))
+					{
+						continue;
+					}
+
+					$result = $this->sql_index_drop($table, $index_name);
+
+					if ($this->return_statements)
+					{
+						$statements = array_merge($statements, $result);
+					}
+				}
+			}
+		}
+
+		// Drop columns?
+		if (!empty($schema_changes['drop_columns']))
+		{
+			foreach ($schema_changes['drop_columns'] as $table => $columns)
+			{
+				foreach ($columns as $column)
+				{
+					// Only remove the column if it exists...
+					if ($this->sql_column_exists($table, $column))
+					{
+						$result = $this->sql_column_remove($table, $column, true);
+
+						if ($sqlite)
+						{
+							$sqlite_data[$table]['drop_columns'][] = $result;
+						}
+						else if ($this->return_statements)
+						{
+							$statements = array_merge($statements, $result);
+						}
+					}
+				}
+			}
+		}
+
+		// Add primary keys?
+		if (!empty($schema_changes['add_primary_keys']))
+		{
+			foreach ($schema_changes['add_primary_keys'] as $table => $columns)
+			{
+				$result = $this->sql_create_primary_key($table, $columns, true);
+
+				if ($sqlite)
+				{
+					$sqlite_data[$table]['primary_key'] = $result;
+				}
+				else if ($this->return_statements)
+				{
+					$statements = array_merge($statements, $result);
+				}
+			}
+		}
+
+		// Add unique indexes?
+		if (!empty($schema_changes['add_unique_index']))
+		{
+			foreach ($schema_changes['add_unique_index'] as $table => $index_array)
+			{
+				foreach ($index_array as $index_name => $column)
+				{
+					if ($this->sql_unique_index_exists($table, $index_name))
+					{
+						continue;
+					}
+
+					$result = $this->sql_create_unique_index($table, $index_name, $column);
+
+					if ($this->return_statements)
+					{
+						$statements = array_merge($statements, $result);
+					}
+				}
+			}
+		}
+
+		// Add indexes?
+		if (!empty($schema_changes['add_index']))
+		{
+			foreach ($schema_changes['add_index'] as $table => $index_array)
+			{
+				foreach ($index_array as $index_name => $column)
+				{
+					if ($this->sql_index_exists($table, $index_name))
+					{
+						continue;
+					}
+
+					$result = $this->sql_create_index($table, $index_name, $column);
+
+					if ($this->return_statements)
+					{
+						$statements = array_merge($statements, $result);
+					}
+				}
+			}
+		}
+
+		if ($sqlite)
+		{
+			foreach ($sqlite_data as $table_name => $sql_schema_changes)
+			{
+				// Create temporary table with original data
+				$statements[] = 'begin';
+
+				$sql = "SELECT sql
+					FROM sqlite_master
+					WHERE type = 'table'
+						AND name = '{$table_name}'
+					ORDER BY type DESC, name;";
+				$result = $this->db->sql_query($sql);
+
+				if (!$result)
+				{
+					continue;
+				}
+
+				$row = $this->db->sql_fetchrow($result);
+				$this->db->sql_freeresult($result);
+
+				// Create a backup table and populate it, destroy the existing one
+				$statements[] = preg_replace('#CREATE\s+TABLE\s+"?' . $table_name . '"?#i', 'CREATE TEMPORARY TABLE ' . $table_name . '_temp', $row['sql']);
+				$statements[] = 'INSERT INTO ' . $table_name . '_temp SELECT * FROM ' . $table_name;
+				$statements[] = 'DROP TABLE ' . $table_name;
+
+				// Get the columns...
+				preg_match('#\((.*)\)#s', $row['sql'], $matches);
+
+				$plain_table_cols = trim($matches[1]);
+				$new_table_cols = preg_split('/,(?![\s\w]+\))/m', $plain_table_cols);
+				$column_list = array();
+
+				foreach ($new_table_cols as $declaration)
+				{
+					$entities = preg_split('#\s+#', trim($declaration));
+					if ($entities[0] == 'PRIMARY')
+					{
+						continue;
+					}
+					$column_list[] = $entities[0];
+				}
+
+				// note down the primary key notation because sqlite only supports adding it to the end for the new table
+				$primary_key = false;
+				$_new_cols = array();
+
+				foreach ($new_table_cols as $key => $declaration)
+				{
+					$entities = preg_split('#\s+#', trim($declaration));
+					if ($entities[0] == 'PRIMARY')
+					{
+						$primary_key = $declaration;
+						continue;
+					}
+					$_new_cols[] = $declaration;
+				}
+
+				$new_table_cols = $_new_cols;
+
+				// First of all... change columns
+				if (!empty($sql_schema_changes['change_columns']))
+				{
+					foreach ($sql_schema_changes['change_columns'] as $column_sql)
+					{
+						foreach ($new_table_cols as $key => $declaration)
+						{
+							$entities = preg_split('#\s+#', trim($declaration));
+							if (strpos($column_sql, $entities[0] . ' ') === 0)
+							{
+								$new_table_cols[$key] = $column_sql;
+							}
+						}
+					}
+				}
+
+				if (!empty($sql_schema_changes['add_columns']))
+				{
+					foreach ($sql_schema_changes['add_columns'] as $column_sql)
+					{
+						$new_table_cols[] = $column_sql;
+					}
+				}
+
+				// Now drop them...
+				if (!empty($sql_schema_changes['drop_columns']))
+				{
+					foreach ($sql_schema_changes['drop_columns'] as $column_name)
+					{
+						// Remove from column list...
+						$new_column_list = array();
+						foreach ($column_list as $key => $value)
+						{
+							if ($value === $column_name)
+							{
+								continue;
+							}
+
+							$new_column_list[] = $value;
+						}
+
+						$column_list = $new_column_list;
+
+						// Remove from table...
+						$_new_cols = array();
+						foreach ($new_table_cols as $key => $declaration)
+						{
+							$entities = preg_split('#\s+#', trim($declaration));
+							if (strpos($column_name . ' ', $entities[0] . ' ') === 0)
+							{
+								continue;
+							}
+							$_new_cols[] = $declaration;
+						}
+						$new_table_cols = $_new_cols;
+					}
+				}
+
+				// Primary key...
+				if (!empty($sql_schema_changes['primary_key']))
+				{
+					$new_table_cols[] = 'PRIMARY KEY (' . implode(', ', $sql_schema_changes['primary_key']) . ')';
+				}
+				// Add a new one or the old primary key
+				else if ($primary_key !== false)
+				{
+					$new_table_cols[] = $primary_key;
+				}
+
+				$columns = implode(',', $column_list);
+
+				// create a new table and fill it up. destroy the temp one
+				$statements[] = 'CREATE TABLE ' . $table_name . ' (' . implode(',', $new_table_cols) . ');';
+				$statements[] = 'INSERT INTO ' . $table_name . ' (' . $columns . ') SELECT ' . $columns . ' FROM ' . $table_name . '_temp;';
+				$statements[] = 'DROP TABLE ' . $table_name . '_temp';
+
+				$statements[] = 'commit';
+			}
+		}
+
+		if ($this->return_statements)
+		{
+			return $statements;
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_list_columns($table_name)
+	{
+		$columns = array();
+
+		switch ($this->sql_layer)
+		{
+			case 'mysql_40':
+			case 'mysql_41':
+				$sql = "SHOW COLUMNS FROM $table_name";
+			break;
+
+			case 'oracle':
+				$sql = "SELECT column_name
+					FROM user_tab_columns
+					WHERE LOWER(table_name) = '" . strtolower($table_name) . "'";
+			break;
+
+			case 'sqlite3':
+				$sql = "SELECT sql
+					FROM sqlite_master
+					WHERE type = 'table'
+						AND name = '{$table_name}'";
+
+				$result = $this->db->sql_query($sql);
+
+				if (!$result)
+				{
+					return false;
+				}
+
+				$row = $this->db->sql_fetchrow($result);
+				$this->db->sql_freeresult($result);
+
+				preg_match('#\((.*)\)#s', $row['sql'], $matches);
+
+				$cols = trim($matches[1]);
+				$col_array = preg_split('/,(?![\s\w]+\))/m', $cols);
+
+				foreach ($col_array as $declaration)
+				{
+					$entities = preg_split('#\s+#', trim($declaration));
+					if ($entities[0] == 'PRIMARY')
+					{
+						continue;
+					}
+
+					$column = strtolower($entities[0]);
+					$columns[$column] = $column;
+				}
+
+				return $columns;
+			break;
+		}
+
+		$result = $this->db->sql_query($sql);
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$column = strtolower(current($row));
+			$columns[$column] = $column;
+		}
+		$this->db->sql_freeresult($result);
+
+		return $columns;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_column_exists($table_name, $column_name)
+	{
+		$columns = $this->sql_list_columns($table_name);
+
+		return isset($columns[$column_name]);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_index_exists($table_name, $index_name)
+	{
+		switch ($this->sql_layer)
+		{
+			case 'mysql_40':
+			case 'mysql_41':
+				$sql = 'SHOW KEYS
+					FROM ' . $table_name;
+				$col = 'Key_name';
+			break;
+
+			case 'oracle':
+				$sql = "SELECT index_name
+					FROM user_indexes
+					WHERE table_name = '" . strtoupper($table_name) . "'
+						AND generated = 'N'
+						AND uniqueness = 'NONUNIQUE'";
+				$col = 'index_name';
+			break;
+
+			case 'sqlite3':
+				$sql = "PRAGMA index_list('" . $table_name . "');";
+				$col = 'name';
+			break;
+		}
+
+		$result = $this->db->sql_query($sql);
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			if (($this->sql_layer == 'mysql_40' || $this->sql_layer == 'mysql_41') && !$row['Non_unique'])
+			{
+				continue;
+			}
+
+			// These DBMS prefix index name with the table name
+			switch ($this->sql_layer)
+			{
+				case 'oracle':
+				case 'sqlite3':
+					$row[$col] = substr($row[$col], strlen($table_name) + 1);
+				break;
+			}
+
+			if (strtolower($row[$col]) == strtolower($index_name))
+			{
+				$this->db->sql_freeresult($result);
+				return true;
+			}
+		}
+		$this->db->sql_freeresult($result);
+
+		return false;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_unique_index_exists($table_name, $index_name)
+	{
+		switch ($this->sql_layer)
+		{
+			case 'mysql_40':
+			case 'mysql_41':
+				$sql = 'SHOW KEYS
+					FROM ' . $table_name;
+				$col = 'Key_name';
+			break;
+
+			case 'oracle':
+				$sql = "SELECT index_name, table_owner
+					FROM user_indexes
+					WHERE table_name = '" . strtoupper($table_name) . "'
+						AND generated = 'N'
+						AND uniqueness = 'UNIQUE'";
+				$col = 'index_name';
+			break;
+
+			case 'sqlite3':
+				$sql = "PRAGMA index_list('" . $table_name . "');";
+				$col = 'name';
+			break;
+		}
+
+		$result = $this->db->sql_query($sql);
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			if (($this->sql_layer == 'mysql_40' || $this->sql_layer == 'mysql_41') && ($row['Non_unique'] || $row[$col] == 'PRIMARY'))
+			{
+				continue;
+			}
+
+			if ($this->sql_layer == 'sqlite3' && !$row['unique'])
+			{
+				continue;
+			}
+
+			// These DBMS prefix index name with the table name
+			switch ($this->sql_layer)
+			{
+				case 'oracle':
+					// Two cases here... prefixed with U_[table_owner] and not prefixed with table_name
+					if (strpos($row[$col], 'U_') === 0)
+					{
+						$row[$col] = substr($row[$col], strlen('U_' . $row['table_owner']) + 1);
+					}
+					else if (strpos($row[$col], strtoupper($table_name)) === 0)
+					{
+						$row[$col] = substr($row[$col], strlen($table_name) + 1);
+					}
+				break;
+
+				case 'sqlite3':
+					$row[$col] = substr($row[$col], strlen($table_name) + 1);
+				break;
+			}
+
+			if (strtolower($row[$col]) == strtolower($index_name))
+			{
+				$this->db->sql_freeresult($result);
+				return true;
+			}
+		}
+		$this->db->sql_freeresult($result);
+
+		return false;
+	}
+
+	/**
+	* Private method for performing sql statements (either execute them or return them)
+	* @access private
+	*/
+	function _sql_run_sql($statements)
+	{
+		if ($this->return_statements)
+		{
+			return $statements;
+		}
+
+		// We could add error handling here...
+		foreach ($statements as $sql)
+		{
+			if ($sql === 'begin')
+			{
+				$this->db->sql_transaction('begin');
+			}
+			else if ($sql === 'commit')
+			{
+				$this->db->sql_transaction('commit');
+			}
+			else
+			{
+				$this->db->sql_query($sql);
+			}
+		}
+
+		return true;
+	}
+
+	/**
+	* Function to prepare some column information for better usage
+	* @access private
+	*/
+	function sql_prepare_column_data($table_name, $column_name, $column_data)
+	{
+		if (strlen($column_name) > 30)
+		{
+			trigger_error("Column name '$column_name' on table '$table_name' is too long. The maximum is 30 characters.", E_USER_ERROR);
+		}
+
+		// Get type
+		list($column_type) = $this->get_column_type($column_data[0]);
+
+		// Adjust default value if db-dependent specified
+		if (is_array($column_data[1]))
+		{
+			$column_data[1] = (isset($column_data[1][$this->sql_layer])) ? $column_data[1][$this->sql_layer] : $column_data[1]['default'];
+		}
+
+		$sql = '';
+
+		$return_array = array();
+
+		switch ($this->sql_layer)
+		{
+			case 'mysql_40':
+			case 'mysql_41':
+				$sql .= " {$column_type} ";
+
+				// For hexadecimal values do not use single quotes
+				if (!is_null($column_data[1]) && substr($column_type, -4) !== 'text' && substr($column_type, -4) !== 'blob')
+				{
+					$sql .= (strpos($column_data[1], '0x') === 0) ? "DEFAULT {$column_data[1]} " : "DEFAULT '{$column_data[1]}' ";
+				}
+
+				if (!is_null($column_data[1]) || (isset($column_data[2]) && $column_data[2] == 'auto_increment'))
+				{
+					$sql .= 'NOT NULL';
+				}
+				else
+				{
+					$sql .= 'NULL';
+				}
+
+				if (isset($column_data[2]))
+				{
+					if ($column_data[2] == 'auto_increment')
+					{
+						$sql .= ' auto_increment';
+					}
+					else if ($this->sql_layer === 'mysql_41' && $column_data[2] == 'true_sort')
+					{
+						$sql .= ' COLLATE utf8_unicode_ci';
+					}
+				}
+
+				if (isset($column_data['after']))
+				{
+					$return_array['after'] = $column_data['after'];
+				}
+
+			break;
+
+			case 'oracle':
+				$sql .= " {$column_type} ";
+				$sql .= (!is_null($column_data[1])) ? "DEFAULT '{$column_data[1]}' " : '';
+
+				// In Oracle empty strings ('') are treated as NULL.
+				// Therefore in oracle we allow NULL's for all DEFAULT '' entries
+				// Oracle does not like setting NOT NULL on a column that is already NOT NULL (this happens only on number fields)
+				if (!preg_match('/number/i', $column_type))
+				{
+					$sql .= ($column_data[1] === '' || $column_data[1] === null) ? '' : 'NOT NULL';
+				}
+
+				$return_array['auto_increment'] = false;
+				if (isset($column_data[2]) && $column_data[2] == 'auto_increment')
+				{
+					$return_array['auto_increment'] = true;
+				}
+
+			break;
+
+			case 'sqlite3':
+				$return_array['primary_key_set'] = false;
+				if (isset($column_data[2]) && $column_data[2] == 'auto_increment')
+				{
+					$sql .= ' INTEGER PRIMARY KEY AUTOINCREMENT';
+					$return_array['primary_key_set'] = true;
+				}
+				else
+				{
+					$sql .= ' ' . $column_type;
+				}
+
+				if (!is_null($column_data[1]))
+				{
+					$sql .= ' NOT NULL ';
+					$sql .= "DEFAULT '{$column_data[1]}'";
+				}
+
+			break;
+		}
+
+		$return_array['column_type_sql'] = $sql;
+
+		return $return_array;
+	}
+
+	/**
+	* Get the column's database type from the type map
+	*
+	* @param string $column_map_type
+	* @return array		column type for this database
+	*					and map type without length
+	*/
+	function get_column_type($column_map_type)
+	{
+		$column_type = '';
+		if (strpos($column_map_type, ':') !== false)
+		{
+			list($orig_column_type, $column_length) = explode(':', $column_map_type);
+			if (!is_array($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']))
+			{
+				$column_type = sprintf($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':'], $column_length);
+			}
+			else
+			{
+				if (isset($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['rule']))
+				{
+					switch ($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['rule'][0])
+					{
+						case 'div':
+							$column_length /= $this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['rule'][1];
+							$column_length = ceil($column_length);
+							$column_type = sprintf($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':'][0], $column_length);
+						break;
+					}
+				}
+
+				if (isset($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['limit']))
+				{
+					switch ($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['limit'][0])
+					{
+						case 'mult':
+							$column_length *= $this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['limit'][1];
+							if ($column_length > $this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['limit'][2])
+							{
+								$column_type = $this->dbms_type_map[$this->sql_layer][$orig_column_type . ':']['limit'][3];
+							}
+							else
+							{
+								$column_type = sprintf($this->dbms_type_map[$this->sql_layer][$orig_column_type . ':'][0], $column_length);
+							}
+						break;
+					}
+				}
+			}
+			$orig_column_type .= ':';
+		}
+		else
+		{
+			$orig_column_type = $column_map_type;
+			$column_type = $this->dbms_type_map[$this->sql_layer][$column_map_type];
+		}
+
+		return array($column_type, $orig_column_type);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_column_add($table_name, $column_name, $column_data, $inline = false)
+	{
+		$column_data = $this->sql_prepare_column_data($table_name, $column_name, $column_data);
+		$statements = array();
+
+		switch ($this->sql_layer)
+		{
+			case 'mysql_40':
+			case 'mysql_41':
+				$after = (!empty($column_data['after'])) ? ' AFTER ' . $column_data['after'] : '';
+				$statements[] = 'ALTER TABLE `' . $table_name . '` ADD COLUMN `' . $column_name . '` ' . $column_data['column_type_sql'] . $after;
+			break;
+
+			case 'oracle':
+				// Does not support AFTER, only through temporary table
+				$statements[] = 'ALTER TABLE ' . $table_name . ' ADD ' . $column_name . ' ' . $column_data['column_type_sql'];
+			break;
+
+			case 'sqlite3':
+				if ($inline && $this->return_statements)
+				{
+					return $column_name . ' ' . $column_data['column_type_sql'];
+				}
+
+				$statements[] = 'ALTER TABLE ' . $table_name . ' ADD ' . $column_name . ' ' . $column_data['column_type_sql'];
+			break;
+		}
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_column_remove($table_name, $column_name, $inline = false)
+	{
+		$statements = array();
+
+		switch ($this->sql_layer)
+		{
+			case 'mysql_40':
+			case 'mysql_41':
+				$statements[] = 'ALTER TABLE `' . $table_name . '` DROP COLUMN `' . $column_name . '`';
+			break;
+
+			case 'oracle':
+				$statements[] = 'ALTER TABLE ' . $table_name . ' DROP COLUMN ' . $column_name;
+			break;
+
+			case 'sqlite3':
+
+				if ($inline && $this->return_statements)
+				{
+					return $column_name;
+				}
+
+				$recreate_queries = $this->sqlite_get_recreate_table_queries($table_name, $column_name);
+				if (empty($recreate_queries))
+				{
+					break;
+				}
+
+				$statements[] = 'begin';
+
+				$sql_create_table = array_shift($recreate_queries);
+
+				// Create a backup table and populate it, destroy the existing one
+				$statements[] = preg_replace('#CREATE\s+TABLE\s+"?' . $table_name . '"?#i', 'CREATE TEMPORARY TABLE ' . $table_name . '_temp', $sql_create_table);
+				$statements[] = 'INSERT INTO ' . $table_name . '_temp SELECT * FROM ' . $table_name;
+				$statements[] = 'DROP TABLE ' . $table_name;
+
+				preg_match('#\((.*)\)#s', $sql_create_table, $matches);
+
+				$new_table_cols = trim($matches[1]);
+				$old_table_cols = preg_split('/,(?![\s\w]+\))/m', $new_table_cols);
+				$column_list = array();
+
+				foreach ($old_table_cols as $declaration)
+				{
+					$entities = preg_split('#\s+#', trim($declaration));
+					if ($entities[0] == 'PRIMARY' || $entities[0] === $column_name)
+					{
+						continue;
+					}
+					$column_list[] = $entities[0];
+				}
+
+				$columns = implode(',', $column_list);
+
+				$new_table_cols = trim(preg_replace('/' . $column_name . '\b[^,]+(?:,|$)/m', '', $new_table_cols));
+				if (substr($new_table_cols, -1) === ',')
+				{
+					// Remove the comma from the last entry again
+					$new_table_cols = substr($new_table_cols, 0, -1);
+				}
+
+				// create a new table and fill it up. destroy the temp one
+				$statements[] = 'CREATE TABLE ' . $table_name . ' (' . $new_table_cols . ');';
+				$statements = array_merge($statements, $recreate_queries);
+
+				$statements[] = 'INSERT INTO ' . $table_name . ' (' . $columns . ') SELECT ' . $columns . ' FROM ' . $table_name . '_temp;';
+				$statements[] = 'DROP TABLE ' . $table_name . '_temp';
+
+				$statements[] = 'commit';
+			break;
+		}
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_index_drop($table_name, $index_name)
+	{
+		$statements = array();
+
+		switch ($this->sql_layer)
+		{
+			case 'mysql_40':
+			case 'mysql_41':
+				$statements[] = 'DROP INDEX ' . $index_name . ' ON ' . $table_name;
+			break;
+
+			case 'oracle':
+			case 'sqlite3':
+				$statements[] = 'DROP INDEX ' . $table_name . '_' . $index_name;
+			break;
+		}
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_table_drop($table_name)
+	{
+		$statements = array();
+
+		if (!$this->sql_table_exists($table_name))
+		{
+			return $this->_sql_run_sql($statements);
+		}
+
+		// the most basic operation, get rid of the table
+		$statements[] = 'DROP TABLE ' . $table_name;
+
+		switch ($this->sql_layer)
+		{
+			case 'oracle':
+				$sql = 'SELECT A.REFERENCED_NAME
+					FROM USER_DEPENDENCIES A, USER_TRIGGERS B
+					WHERE A.REFERENCED_TYPE = \'SEQUENCE\'
+						AND A.NAME = B.TRIGGER_NAME
+						AND B.TABLE_NAME = \'' . strtoupper($table_name) . "'";
+				$result = $this->db->sql_query($sql);
+
+				// any sequences ref'd to this table's triggers?
+				while ($row = $this->db->sql_fetchrow($result))
+				{
+					$statements[] = "DROP SEQUENCE {$row['referenced_name']}";
+				}
+				$this->db->sql_freeresult($result);
+			break;
+		}
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_create_primary_key($table_name, $column, $inline = false)
+	{
+		$statements = array();
+
+		switch ($this->sql_layer)
+		{
+			case 'mysql_40':
+			case 'mysql_41':
+				$statements[] = 'ALTER TABLE ' . $table_name . ' ADD PRIMARY KEY (' . implode(', ', $column) . ')';
+			break;
+
+			case 'oracle':
+				$statements[] = 'ALTER TABLE ' . $table_name . ' add CONSTRAINT pk_' . $table_name . ' PRIMARY KEY (' . implode(', ', $column) . ')';
+			break;
+
+			case 'sqlite3':
+
+				if ($inline && $this->return_statements)
+				{
+					return $column;
+				}
+
+				$recreate_queries = $this->sqlite_get_recreate_table_queries($table_name);
+				if (empty($recreate_queries))
+				{
+					break;
+				}
+
+				$statements[] = 'begin';
+
+				$sql_create_table = array_shift($recreate_queries);
+
+				// Create a backup table and populate it, destroy the existing one
+				$statements[] = preg_replace('#CREATE\s+TABLE\s+"?' . $table_name . '"?#i', 'CREATE TEMPORARY TABLE ' . $table_name . '_temp', $sql_create_table);
+				$statements[] = 'INSERT INTO ' . $table_name . '_temp SELECT * FROM ' . $table_name;
+				$statements[] = 'DROP TABLE ' . $table_name;
+
+				preg_match('#\((.*)\)#s', $sql_create_table, $matches);
+
+				$new_table_cols = trim($matches[1]);
+				$old_table_cols = preg_split('/,(?![\s\w]+\))/m', $new_table_cols);
+				$column_list = array();
+
+				foreach ($old_table_cols as $declaration)
+				{
+					$entities = preg_split('#\s+#', trim($declaration));
+					if ($entities[0] == 'PRIMARY')
+					{
+						continue;
+					}
+					$column_list[] = $entities[0];
+				}
+
+				$columns = implode(',', $column_list);
+
+				// create a new table and fill it up. destroy the temp one
+				$statements[] = 'CREATE TABLE ' . $table_name . ' (' . $new_table_cols . ', PRIMARY KEY (' . implode(', ', $column) . '));';
+				$statements = array_merge($statements, $recreate_queries);
+
+				$statements[] = 'INSERT INTO ' . $table_name . ' (' . $columns . ') SELECT ' . $columns . ' FROM ' . $table_name . '_temp;';
+				$statements[] = 'DROP TABLE ' . $table_name . '_temp';
+
+				$statements[] = 'commit';
+			break;
+		}
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_create_unique_index($table_name, $index_name, $column)
+	{
+		$statements = array();
+
+		$this->check_index_name_length($table_name, $index_name);
+
+		switch ($this->sql_layer)
+		{
+			case 'oracle':
+			case 'sqlite3':
+				$statements[] = 'CREATE UNIQUE INDEX ' . $table_name . '_' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')';
+			break;
+
+			case 'mysql_40':
+			case 'mysql_41':
+				$statements[] = 'ALTER TABLE ' . $table_name . ' ADD UNIQUE INDEX ' . $index_name . '(' . implode(', ', $column) . ')';
+			break;
+		}
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_create_index($table_name, $index_name, $column)
+	{
+		$statements = array();
+
+		$this->check_index_name_length($table_name, $index_name);
+
+		// remove index length unless MySQL4
+		if ('mysql_40' != $this->sql_layer)
+		{
+			$column = preg_replace('#:.*$#', '', $column);
+		}
+
+		switch ($this->sql_layer)
+		{
+			case 'oracle':
+			case 'sqlite3':
+				$statements[] = 'CREATE INDEX ' . $table_name . '_' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')';
+			break;
+
+			case 'mysql_40':
+				// add index size to definition as required by MySQL4
+				foreach ($column as $i => $col)
+				{
+					if (false !== strpos($col, ':'))
+					{
+						list($col, $index_size) = explode(':', $col);
+						$column[$i] = "$col($index_size)";
+					}
+				}
+			// no break
+			case 'mysql_41':
+				$statements[] = 'ALTER TABLE ' . $table_name . ' ADD INDEX ' . $index_name . ' (' . implode(', ', $column) . ')';
+			break;
+		}
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	 * Check whether the index name is too long
+	 *
+	 * @param string $table_name
+	 * @param string $index_name
+	 */
+	protected function check_index_name_length($table_name, $index_name)
+	{
+		$table_prefix = substr(CONFIG_TABLE, 0, -6); // strlen(config)
+		if (strlen($table_name . $index_name) - strlen($table_prefix) > 24)
+		{
+			$max_length = strlen($table_prefix) + 24;
+			trigger_error("Index name '{$table_name}_$index_name' on table '$table_name' is too long. The maximum is $max_length characters.", E_USER_ERROR);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_list_index($table_name)
+	{
+		$index_array = array();
+
+		switch ($this->sql_layer)
+		{
+			case 'mysql_40':
+			case 'mysql_41':
+				$sql = 'SHOW KEYS
+					FROM ' . $table_name;
+				$col = 'Key_name';
+				break;
+
+			case 'oracle':
+				$sql = "SELECT index_name
+					FROM user_indexes
+					WHERE table_name = '" . strtoupper($table_name) . "'
+						AND generated = 'N'
+						AND uniqueness = 'NONUNIQUE'";
+				$col = 'index_name';
+				break;
+
+			case 'sqlite3':
+				$sql = "PRAGMA index_info('" . $table_name . "');";
+				$col = 'name';
+				break;
+		}
+
+		$result = $this->db->sql_query($sql);
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			if (($this->sql_layer == 'mysql_40' || $this->sql_layer == 'mysql_41') && !$row['Non_unique'])
+			{
+				continue;
+			}
+
+			switch ($this->sql_layer)
+			{
+				case 'oracle':
+				case 'sqlite3':
+					$row[$col] = substr($row[$col], strlen($table_name) + 1);
+					break;
+			}
+
+			$index_array[] = $row[$col];
+		}
+		$this->db->sql_freeresult($result);
+
+		return array_map('strtolower', $index_array);
+	}
+
+	/**
+	 * Removes table_name from the index_name if it is at the beginning
+	 *
+	 * @param $table_name
+	 * @param $index_name
+	 * @return string
+	 */
+	protected function strip_table_name_from_index_name($table_name, $index_name)
+	{
+		return (strpos(strtoupper($index_name), strtoupper($table_name)) === 0) ? substr($index_name, strlen($table_name) + 1) : $index_name;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	function sql_column_change($table_name, $column_name, $column_data, $inline = false)
+	{
+		$original_column_data = $column_data;
+		$column_data = $this->sql_prepare_column_data($table_name, $column_name, $column_data);
+		$statements = array();
+
+		switch ($this->sql_layer)
+		{
+			case 'mysql_40':
+			case 'mysql_41':
+				$statements[] = 'ALTER TABLE `' . $table_name . '` CHANGE `' . $column_name . '` `' . $column_name . '` ' . $column_data['column_type_sql'];
+			break;
+
+			case 'oracle':
+				// We need the data here
+				$old_return_statements = $this->return_statements;
+				$this->return_statements = true;
+
+				// Get list of existing indexes
+				$indexes = $this->get_existing_indexes($table_name, $column_name);
+				$unique_indexes = $this->get_existing_indexes($table_name, $column_name, true);
+
+				// Drop any indexes
+				if (!empty($indexes) || !empty($unique_indexes))
+				{
+					$drop_indexes = array_merge(array_keys($indexes), array_keys($unique_indexes));
+					foreach ($drop_indexes as $index_name)
+					{
+						$result = $this->sql_index_drop($table_name, $this->strip_table_name_from_index_name($table_name, $index_name));
+						$statements = array_merge($statements, $result);
+					}
+				}
+
+				$temp_column_name = 'temp_' . substr(md5($column_name), 0, 25);
+				// Add a temporary table with the new type
+				$result = $this->sql_column_add($table_name, $temp_column_name, $original_column_data);
+				$statements = array_merge($statements, $result);
+
+				// Copy the data to the new column
+				$statements[] = 'UPDATE ' . $table_name . ' SET ' . $temp_column_name . ' = ' . $column_name;
+
+				// Drop the original column
+				$result = $this->sql_column_remove($table_name, $column_name);
+				$statements = array_merge($statements, $result);
+
+				// Recreate the original column with the new type
+				$result = $this->sql_column_add($table_name, $column_name, $original_column_data);
+				$statements = array_merge($statements, $result);
+
+				if (!empty($indexes))
+				{
+					// Recreate indexes after we changed the column
+					foreach ($indexes as $index_name => $index_data)
+					{
+						$result = $this->sql_create_index($table_name, $this->strip_table_name_from_index_name($table_name, $index_name), $index_data);
+						$statements = array_merge($statements, $result);
+					}
+				}
+
+				if (!empty($unique_indexes))
+				{
+					// Recreate unique indexes after we changed the column
+					foreach ($unique_indexes as $index_name => $index_data)
+					{
+						$result = $this->sql_create_unique_index($table_name, $this->strip_table_name_from_index_name($table_name, $index_name), $index_data);
+						$statements = array_merge($statements, $result);
+					}
+				}
+
+				// Copy the data to the original column
+				$statements[] = 'UPDATE ' . $table_name . ' SET ' . $column_name . ' = ' . $temp_column_name;
+
+				// Drop the temporary column again
+				$result = $this->sql_column_remove($table_name, $temp_column_name);
+				$statements = array_merge($statements, $result);
+
+				$this->return_statements = $old_return_statements;
+			break;
+
+			case 'sqlite3':
+
+				if ($inline && $this->return_statements)
+				{
+					return $column_name . ' ' . $column_data['column_type_sql'];
+				}
+
+				$recreate_queries = $this->sqlite_get_recreate_table_queries($table_name);
+				if (empty($recreate_queries))
+				{
+					break;
+				}
+
+				$statements[] = 'begin';
+
+				$sql_create_table = array_shift($recreate_queries);
+
+				// Create a temp table and populate it, destroy the existing one
+				$statements[] = preg_replace('#CREATE\s+TABLE\s+"?' . $table_name . '"?#i', 'CREATE TEMPORARY TABLE ' . $table_name . '_temp', $sql_create_table);
+				$statements[] = 'INSERT INTO ' . $table_name . '_temp SELECT * FROM ' . $table_name;
+				$statements[] = 'DROP TABLE ' . $table_name;
+
+				preg_match('#\((.*)\)#s', $sql_create_table, $matches);
+
+				$new_table_cols = trim($matches[1]);
+				$old_table_cols = preg_split('/,(?![\s\w]+\))/m', $new_table_cols);
+				$column_list = array();
+
+				foreach ($old_table_cols as $key => $declaration)
+				{
+					$declaration = trim($declaration);
+
+					// Check for the beginning of the constraint section and stop
+					if (preg_match('/[^\(]*\s*PRIMARY KEY\s+\(/', $declaration) ||
+						preg_match('/[^\(]*\s*UNIQUE\s+\(/', $declaration) ||
+						preg_match('/[^\(]*\s*FOREIGN KEY\s+\(/', $declaration) ||
+						preg_match('/[^\(]*\s*CHECK\s+\(/', $declaration))
+					{
+						break;
+					}
+
+					$entities = preg_split('#\s+#', $declaration);
+					$column_list[] = $entities[0];
+					if ($entities[0] == $column_name)
+					{
+						$old_table_cols[$key] = $column_name . ' ' . $column_data['column_type_sql'];
+					}
+				}
+
+				$columns = implode(',', $column_list);
+
+				// Create a new table and fill it up. destroy the temp one
+				$statements[] = 'CREATE TABLE ' . $table_name . ' (' . implode(',', $old_table_cols) . ');';
+				$statements = array_merge($statements, $recreate_queries);
+
+				$statements[] = 'INSERT INTO ' . $table_name . ' (' . $columns . ') SELECT ' . $columns . ' FROM ' . $table_name . '_temp;';
+				$statements[] = 'DROP TABLE ' . $table_name . '_temp';
+
+				$statements[] = 'commit';
+
+			break;
+		}
+
+		return $this->_sql_run_sql($statements);
+	}
+
+	/**
+	* Get a list with existing indexes for the column
+	*
+	* @param string $table_name
+	* @param string $column_name
+	* @param bool $unique Should we get unique indexes or normal ones
+	* @return array		Array with Index name => columns
+	*/
+	public function get_existing_indexes($table_name, $column_name, $unique = false)
+	{
+		switch ($this->sql_layer)
+		{
+			case 'mysql_40':
+			case 'mysql_41':
+			case 'sqlite3':
+				// Not supported
+				throw new \Exception('DBMS is not supported');
+			break;
+		}
+
+		$sql = '';
+		$existing_indexes = array();
+
+		switch ($this->sql_layer)
+		{
+			case 'oracle':
+				$sql = "SELECT ix.index_name  AS phpbb_index_name, ix.uniqueness AS is_unique
+					FROM all_ind_columns ixc, all_indexes ix
+					WHERE ix.index_name = ixc.index_name
+						AND ixc.table_name = '" . strtoupper($table_name) . "'
+						AND ixc.column_name = '" . strtoupper($column_name) . "'";
+			break;
+		}
+
+		$result = $this->db->sql_query($sql);
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			if (!isset($row['is_unique']) || ($unique && $row['is_unique'] == 'UNIQUE') || (!$unique && $row['is_unique'] == 'NONUNIQUE'))
+			{
+				$existing_indexes[$row['phpbb_index_name']] = array();
+			}
+		}
+		$this->db->sql_freeresult($result);
+
+		if (empty($existing_indexes))
+		{
+			return array();
+		}
+
+		switch ($this->sql_layer)
+		{
+			case 'oracle':
+				$sql = "SELECT index_name AS phpbb_index_name, column_name AS phpbb_column_name
+					FROM all_ind_columns
+					WHERE table_name = '" . strtoupper($table_name) . "'
+						AND " . $this->db->sql_in_set('index_name', array_keys($existing_indexes));
+			break;
+		}
+
+		$result = $this->db->sql_query($sql);
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$existing_indexes[$row['phpbb_index_name']][] = $row['phpbb_column_name'];
+		}
+		$this->db->sql_freeresult($result);
+
+		return $existing_indexes;
+	}
+
+	/**
+	* Returns the Queries which are required to recreate a table including indexes
+	*
+	* @param string $table_name
+	* @param string $remove_column	When we drop a column, we remove the column
+	*								from all indexes. If the index has no other
+	*								column, we drop it completly.
+	* @return array
+	*/
+	protected function sqlite_get_recreate_table_queries($table_name, $remove_column = '')
+	{
+		$queries = array();
+
+		$sql = "SELECT sql
+			FROM sqlite_master
+			WHERE type = 'table'
+				AND name = '{$table_name}'";
+		$result = $this->db->sql_query($sql);
+		$sql_create_table = $this->db->sql_fetchfield('sql');
+		$this->db->sql_freeresult($result);
+
+		if (!$sql_create_table)
+		{
+			return array();
+		}
+		$queries[] = $sql_create_table;
+
+		$sql = "SELECT sql
+			FROM sqlite_master
+			WHERE type = 'index'
+				AND tbl_name = '{$table_name}'";
+		$result = $this->db->sql_query($sql);
+		while ($sql_create_index = $this->db->sql_fetchfield('sql'))
+		{
+			if ($remove_column)
+			{
+				$match = array();
+				preg_match('#(?:[\w ]+)\((.*)\)#', $sql_create_index, $match);
+				if (!isset($match[1]))
+				{
+					continue;
+				}
+
+				// Find and remove $remove_column from the index
+				$columns = explode(', ', $match[1]);
+				$found_column = array_search($remove_column, $columns);
+				if ($found_column !== false)
+				{
+					unset($columns[$found_column]);
+
+					// If the column list is not empty add the index to the list
+					if (!empty($columns))
+					{
+						$queries[] = str_replace($match[1], implode(', ', $columns), $sql_create_index);
+					}
+				}
+				else
+				{
+					$queries[] = $sql_create_index;
+				}
+			}
+			else
+			{
+				$queries[] = $sql_create_index;
+			}
+		}
+		$this->db->sql_freeresult($result);
+
+		return $queries;
+	}
+}
--- /dev/null
+++ b/phpbb/db/tools/tools_interface.php
@@ -0,0 +1,202 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\tools;
+
+/**
+ * Interface for a Database Tools for handling cross-db actions such as altering columns, etc.
+ */
+interface tools_interface
+{
+	/**
+	 * Handle passed database update array.
+	 * Expected structure...
+	 * Key being one of the following
+	 *	drop_tables: Drop tables
+	 *	add_tables: Add tables
+	 *	change_columns: Column changes (only type, not name)
+	 *	add_columns: Add columns to a table
+	 *	drop_keys: Dropping keys
+	 *	drop_columns: Removing/Dropping columns
+	 *	add_primary_keys: adding primary keys
+	 *	add_unique_index: adding an unique index
+	 *	add_index: adding an index (can be column:index_size if you need to provide size)
+	 *
+	 * The values are in this format:
+	 *		{TABLE NAME}		=> array(
+	 *			{COLUMN NAME}		=> array({COLUMN TYPE}, {DEFAULT VALUE}, {OPTIONAL VARIABLES}),
+	 *			{KEY/INDEX NAME}	=> array({COLUMN NAMES}),
+	 *		)
+	 *
+	 *
+	 * @param array $schema_changes
+	 * @return null
+	 */
+	public function perform_schema_changes($schema_changes);
+
+	/**
+	 * Gets a list of tables in the database.
+	 *
+	 * @return array		Array of table names  (all lower case)
+	 */
+	public function sql_list_tables();
+
+	/**
+	 * Check if table exists
+	 *
+	 * @param string	$table_name	The table name to check for
+	 * @return bool true if table exists, else false
+	 */
+	public function sql_table_exists($table_name);
+
+	/**
+	 * Create SQL Table
+	 *
+	 * @param string	$table_name		The table name to create
+	 * @param array		$table_data		Array containing table data.
+	 * @return array|true	Statements to run, or true if the statements have been executed
+	 */
+	public function sql_create_table($table_name, $table_data);
+
+	/**
+	 * Drop Table
+	 *
+	 * @param string	$table_name		The table name to drop
+	 * @return array|true	Statements to run, or true if the statements have been executed
+	 */
+	public function sql_table_drop($table_name);
+
+	/**
+	 * Gets a list of columns of a table.
+	 *
+	 * @param string $table_name	Table name
+	 * @return array		Array of column names (all lower case)
+	 */
+	public function sql_list_columns($table_name);
+
+	/**
+	 * Check whether a specified column exist in a table
+	 *
+	 * @param string	$table_name		Table to check
+	 * @param string	$column_name	Column to check
+	 * @return bool		True if column exists, false otherwise
+	 */
+	public function sql_column_exists($table_name, $column_name);
+
+	/**
+	 * Add new column
+	 *
+	 * @param string	$table_name		Table to modify
+	 * @param string	$column_name	Name of the column to add
+	 * @param array		$column_data	Column data
+	 * @param bool		$inline			Whether the query should actually be run,
+	 *						or return a string for adding the column
+	 * @return array|true	Statements to run, or true if the statements have been executed
+	 */
+	public function sql_column_add($table_name, $column_name, $column_data, $inline = false);
+
+	/**
+	 * Change column type (not name!)
+	 *
+	 * @param string	$table_name		Table to modify
+	 * @param string	$column_name	Name of the column to modify
+	 * @param array		$column_data	Column data
+	 * @param bool		$inline			Whether the query should actually be run,
+	 *						or return a string for modifying the column
+	 * @return array|true	Statements to run, or true if the statements have been executed
+	 */
+	public function sql_column_change($table_name, $column_name, $column_data, $inline = false);
+
+	/**
+	 * Drop column
+	 *
+	 * @param string	$table_name		Table to modify
+	 * @param string	$column_name	Name of the column to drop
+	 * @param bool		$inline			Whether the query should actually be run,
+	 *						or return a string for deleting the column
+	 * @return array|true	Statements to run, or true if the statements have been executed
+	 */
+	public function sql_column_remove($table_name, $column_name, $inline = false);
+
+	/**
+	 * List all of the indices that belong to a table
+	 *
+	 * NOTE: does not list
+	 * - UNIQUE indices
+	 * - PRIMARY keys
+	 *
+	 * @param string	$table_name		Table to check
+	 * @return array		Array with index names
+	 */
+	public function sql_list_index($table_name);
+
+	/**
+	 * Check if a specified index exists in table. Does not return PRIMARY KEY and UNIQUE indexes.
+	 *
+	 * @param string	$table_name		Table to check the index at
+	 * @param string	$index_name		The index name to check
+	 * @return bool			True if index exists, else false
+	 */
+	public function sql_index_exists($table_name, $index_name);
+
+	/**
+	 * Add index
+	 *
+	 * @param string	$table_name		Table to modify
+	 * @param string	$index_name		Name of the index to create
+	 * @param string|array	$column		Either a string with a column name, or an array with columns
+	 * @return array|true	Statements to run, or true if the statements have been executed
+	 */
+	public function sql_create_index($table_name, $index_name, $column);
+
+	/**
+	 * Drop Index
+	 *
+	 * @param string	$table_name		Table to modify
+	 * @param string	$index_name		Name of the index to delete
+	 * @return array|true	Statements to run, or true if the statements have been executed
+	 */
+	public function sql_index_drop($table_name, $index_name);
+
+	/**
+	 * Check if a specified index exists in table.
+	 *
+	 * NOTE: Does not return normal and PRIMARY KEY indexes
+	 *
+	 * @param string	$table_name		Table to check the index at
+	 * @param string	$index_name		The index name to check
+	 * @return bool True if index exists, else false
+	 */
+	public function sql_unique_index_exists($table_name, $index_name);
+
+	/**
+	 * Add unique index
+	 *
+	 * @param string	$table_name		Table to modify
+	 * @param string	$index_name		Name of the unique index to create
+	 * @param string|array	$column		Either a string with a column name, or an array with columns
+	 * @return array|true	Statements to run, or true if the statements have been executed
+	 */
+	public function sql_create_unique_index($table_name, $index_name, $column);
+
+	/**
+	 * Add primary key
+	 *
+	 * @param string	$table_name		Table to modify
+	 * @param string|array	$column		Either a string with a column name, or an array with columns
+	 * @param bool		$inline			Whether the query should actually be run,
+	 *						or return a string for creating the key
+	 * @return array|true	Statements to run, or true if the statements have been executed
+	 */
+	public function sql_create_primary_key($table_name, $column, $inline = false);
+}
--- /dev/null
+++ b/phpbb/debug/debug.php
@@ -0,0 +1,80 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\debug;
+
+use Symfony\Component\Debug\BufferingLogger;
+use Symfony\Component\Debug\DebugClassLoader;
+use Symfony\Component\Debug\ExceptionHandler;
+
+/**
+ * Registers all the debug tools.
+
+ * @see Symfony\Component\Debug\Debug
+ */
+class debug
+{
+	private static $enabled = false;
+
+	/**
+	 * Enables the debug tools.
+	 *
+	 * This method registers an error handler and an exception handler.
+	 *
+	 * If the Symfony ClassLoader component is available, a special
+	 * class loader is also registered.
+	 *
+	 * @param int  $errorReportingLevel The level of error reporting you want
+	 * @param bool $displayErrors       Whether to display errors (for development) or just log them (for production)
+	 */
+	public static function enable($errorReportingLevel = null, $displayErrors = true)
+	{
+		if (static::$enabled)
+		{
+			return;
+		}
+
+		static::$enabled = true;
+
+		if ($errorReportingLevel !== null)
+		{
+			error_reporting($errorReportingLevel);
+		}
+		else
+		{
+			error_reporting(-1);
+		}
+
+		if ('cli' !== php_sapi_name())
+		{
+			ini_set('display_errors', 0);
+			ExceptionHandler::register();
+		}
+		else if ($displayErrors && (!ini_get('log_errors') || ini_get('error_log')))
+		{
+			// CLI - display errors only if they're not already logged to STDERR
+			ini_set('display_errors', 1);
+		}
+
+		if ($displayErrors)
+		{
+			error_handler::register(new error_handler(new BufferingLogger()));
+		}
+		else
+		{
+			error_handler::register()->throwAt(0, true);
+		}
+
+		DebugClassLoader::enable();
+	}
+}
--- /dev/null
+++ b/phpbb/debug/error_handler.php
@@ -0,0 +1,31 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\debug;
+
+use Symfony\Component\Debug\ErrorHandler;
+
+class error_handler extends ErrorHandler
+{
+	public function handleError($type, $message, $file, $line, array $context, array $backtrace = null)
+	{
+		if ($type === E_USER_WARNING || $type === E_USER_NOTICE)
+		{
+			$handler = defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler';
+
+			$handler($type, $message, $file, $line);
+		}
+
+		return parent::handleError($type, $message, $file, $line, $context, $backtrace);
+	}
+}
--- a/phpbb/di/container_builder.php
+++ b/phpbb/di/container_builder.php
@@ -13,392 +13,654 @@
 
 namespace phpbb\di;
 
+use phpbb\filesystem\filesystem;
+use Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper\ProxyDumper;
+use Symfony\Component\Config\ConfigCache;
+use Symfony\Component\Config\FileLocator;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
-use Symfony\Component\HttpKernel\DependencyInjection\RegisterListenersPass;
+use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
+use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass;
+use Symfony\Component\Filesystem\Exception\IOException;
+use Symfony\Component\Finder\Finder;
+use Symfony\Component\HttpKernel\DependencyInjection\MergeExtensionConfigurationPass;
 
 class container_builder
 {
-	/** @var string phpBB Root Path */
+	/**
+	 * @var string The environment to use.
+	 */
+	protected $environment;
+
+	/**
+	 * @var string phpBB Root Path
+	 */
 	protected $phpbb_root_path;
 
-	/** @var string php file extension  */
+	/**
+	 * @var string php file extension
+	 */
 	protected $php_ext;
 
 	/**
-	* The container under construction
-	*
-	* @var ContainerBuilder
-	*/
+	 * The container under construction
+	 *
+	 * @var ContainerBuilder
+	 */
 	protected $container;
 
 	/**
-	* @var \phpbb\db\driver\driver_interface
-	*/
+	 * @var \phpbb\db\driver\driver_interface
+	 */
 	protected $dbal_connection = null;
 
 	/**
-	* @var array the installed extensions
-	*/
-	protected $installed_exts = null;
-
-	/**
-	* Indicates whether the php config file should be injected into the container (default to true).
-	*
-	* @var bool
-	*/
-	protected $inject_config = true;
-
-	/**
-	* Indicates whether extensions should be used (default to true).
-	*
-	* @var bool
-	*/
+	 * Indicates whether extensions should be used (default to true).
+	 *
+	 * @var bool
+	 */
 	protected $use_extensions = true;
 
 	/**
-	* Defines a custom path to find the configuration of the container (default to $this->phpbb_root_path . 'config')
-	*
-	* @var string
-	*/
+	 * Defines a custom path to find the configuration of the container (default to $this->phpbb_root_path . 'config')
+	 *
+	 * @var string
+	 */
 	protected $config_path = null;
 
 	/**
-	* Indicates whether the phpBB compile pass should be used (default to true).
-	*
-	* @var bool
-	*/
-	protected $use_custom_pass = true;
+	 * Indicates whether the container should be dumped to the filesystem (default to true).
+	 *
+	 * If DEBUG_CONTAINER is set this option is ignored and a new container is build.
+	 *
+	 * @var bool
+	 */
+	protected $use_cache = true;
 
 	/**
-	* Indicates whether the kernel compile pass should be used (default to true).
-	*
-	* @var bool
-	*/
-	protected $use_kernel_pass = true;
+	 * Indicates if the container should be compiled automatically (default to true).
+	 *
+	 * @var bool
+	 */
+	protected $compile_container = true;
 
 	/**
-	* Indicates whether the container should be dumped to the filesystem (default to true).
-	*
-	* If DEBUG_CONTAINER is set this option is ignored and a new container is build.
-	*
-	* @var bool
-	*/
-	protected $dump_container = true;
+	 * Custom parameters to inject into the container.
+	 *
+	 * Default to:
+	 * 	array(
+	 * 		'core.root_path', $this->phpbb_root_path,
+	 * 		'core.php_ext', $this->php_ext,
+	 * );
+	 *
+	 * @var array
+	 */
+	protected $custom_parameters = [];
 
 	/**
-	* Indicates if the container should be compiled automatically (default to true).
-	*
-	* @var bool
-	*/
-	protected $compile_container = true;
+	 * @var \phpbb\config_php_file
+	 */
+	protected $config_php_file;
 
 	/**
-	* Custom parameters to inject into the container.
-	*
-	* Default to true:
-	* 	array(
-	* 		'core.root_path', $this->phpbb_root_path,
-	* 		'core.php_ext', $this->php_ext,
-	* );
-	*
-	* @var array
-	*/
-	protected $custom_parameters = null;
+	 * @var string
+	 */
+	protected $cache_dir;
 
 	/**
-	* @var \phpbb\config_php_file
-	*/
-	protected $config_php_file;
+	 * @var array
+	 */
+	private $container_extensions;
+
+	/** @var \Exception */
+	private $build_exception;
 
 	/**
-	* Constructor
-	*
-	* @param \phpbb\config_php_file $config_php_file
-	* @param string $phpbb_root_path Path to the phpbb includes directory.
-	* @param string $php_ext php file extension
-	*/
-	function __construct(\phpbb\config_php_file $config_php_file, $phpbb_root_path, $php_ext)
+	 * Constructor
+	 *
+	 * @param string $phpbb_root_path Path to the phpbb includes directory.
+	 * @param string $php_ext php file extension
+	 */
+	public function __construct($phpbb_root_path, $php_ext)
 	{
-		$this->config_php_file = $config_php_file;
 		$this->phpbb_root_path = $phpbb_root_path;
 		$this->php_ext = $php_ext;
 	}
 
 	/**
-	* Build and return a new Container respecting the current configuration
-	*
-	* @return \phpbb_cache_container|ContainerBuilder
-	*/
+	 * Build and return a new Container respecting the current configuration
+	 *
+	 * @return \phpbb_cache_container|ContainerBuilder
+	 */
 	public function get_container()
 	{
-		$container_filename = $this->get_container_filename();
-		if (!defined('DEBUG_CONTAINER') && $this->dump_container && file_exists($container_filename))
-		{
-			require($container_filename);
-			$this->container = new \phpbb_cache_container();
-		}
-		else
+		try
 		{
-			if ($this->config_path === null)
+			$container_filename = $this->get_container_filename();
+			$config_cache = new ConfigCache($container_filename, defined('DEBUG'));
+			if ($this->use_cache && $config_cache->isFresh())
 			{
-				$this->config_path = $this->phpbb_root_path . 'config';
-			}
-			$container_extensions = array(new \phpbb\di\extension\core($this->config_path));
+				if ($this->use_extensions)
+				{
+					require($this->get_autoload_filename());
+				}
 
-			if ($this->use_extensions)
-			{
-				$installed_exts = $this->get_installed_extensions();
-				$container_extensions[] = new \phpbb\di\extension\ext($installed_exts);
+				require($config_cache->getPath());
+				$this->container = new \phpbb_cache_container();
 			}
-
-			if ($this->inject_config)
+			else
 			{
-				$container_extensions[] = new \phpbb\di\extension\config($this->config_php_file);
-			}
+				$this->container_extensions = array(new extension\core($this->get_config_path()));
 
-			$this->container = $this->create_container($container_extensions);
+				if ($this->use_extensions)
+				{
+					$this->load_extensions();
+				}
 
-			if ($this->use_custom_pass)
-			{
-				// Symfony Kernel Listeners
-				$this->container->addCompilerPass(new \phpbb\di\pass\collection_pass());
+				// Inject the config
+				if ($this->config_php_file)
+				{
+					$this->container_extensions[] = new extension\config($this->config_php_file);
+				}
+
+				$this->container = $this->create_container($this->container_extensions);
+
+				// Easy collections through tags
+				$this->container->addCompilerPass(new pass\collection_pass());
+
+				// Event listeners "phpBB style"
 				$this->container->addCompilerPass(new RegisterListenersPass('dispatcher', 'event.listener_listener', 'event.listener'));
 
-				if ($this->use_kernel_pass)
+				// Event listeners "Symfony style"
+				$this->container->addCompilerPass(new RegisterListenersPass('dispatcher'));
+
+				if ($this->use_extensions)
 				{
-					$this->container->addCompilerPass(new RegisterListenersPass('dispatcher'));
+					$this->register_ext_compiler_pass();
+				}
+
+				$filesystem = new filesystem();
+				$loader     = new YamlFileLoader($this->container, new FileLocator($filesystem->realpath($this->get_config_path())));
+				$loader->load($this->container->getParameter('core.environment') . '/config.yml');
+
+				$this->inject_custom_parameters();
+
+				if ($this->compile_container)
+				{
+					$this->container->compile();
+
+					if ($this->use_cache)
+					{
+						$this->dump_container($config_cache);
+					}
 				}
 			}
 
-			$this->inject_custom_parameters();
+			if ($this->compile_container && $this->config_php_file)
+			{
+				$this->container->set('config.php', $this->config_php_file);
+			}
+
+			$this->inject_dbal_driver();
 
-			if ($this->compile_container)
+			return $this->container;
+		}
+		catch (\Exception $e)
+		{
+			// Don't try to recover if we are in the development environment
+			if ($this->get_environment() === 'development')
 			{
-				$this->container->compile();
+				throw $e;
 			}
 
-			if ($this->dump_container && !defined('DEBUG_CONTAINER'))
+			if ($this->build_exception === null)
 			{
-				$this->dump_container($container_filename);
+				$this->build_exception = $e;
+
+				return $this
+					->without_extensions()
+					->without_cache()
+					->with_custom_parameters(array_merge($this->custom_parameters, [
+						'container_exception' => $e,
+					]))
+					->get_container();
+			}
+			else
+			{
+				// Rethrow the original exception if it's still failing
+				throw $this->build_exception;
 			}
 		}
+	}
 
-		$this->container->set('config.php', $this->config_php_file);
+	/**
+	 * Enable the extensions.
+	 *
+	 * @param string $environment The environment to use
+	 * @return $this
+	 */
+	public function with_environment($environment)
+	{
+		$this->environment = $environment;
 
-		if ($this->compile_container)
-		{
-			$this->inject_dbal();
-		}
+		return $this;
+	}
 
-		return $this->container;
+	/**
+	 * Enable the extensions.
+	 *
+	 * @return $this
+	 */
+	public function with_extensions()
+	{
+		$this->use_extensions = true;
+
+		return $this;
 	}
 
 	/**
-	* Set if the extensions should be used.
-	*
-	* @param bool $use_extensions
-	*/
-	public function set_use_extensions($use_extensions)
+	 * Disable the extensions.
+	 *
+	 * @return $this
+	 */
+	public function without_extensions()
 	{
-		$this->use_extensions = $use_extensions;
+		$this->use_extensions = false;
+
+		return $this;
 	}
 
 	/**
-	* Set if the phpBB compile pass have to be used.
-	*
-	* @param bool $use_custom_pass
-	*/
-	public function set_use_custom_pass($use_custom_pass)
+	 * Enable the caching of the container.
+	 *
+	 * If DEBUG_CONTAINER is set this option is ignored and a new container is build.
+	 *
+	 * @return $this
+	 */
+	public function with_cache()
 	{
-		$this->use_custom_pass = $use_custom_pass;
+		$this->use_cache = true;
+
+		return $this;
 	}
 
 	/**
-	* Set if the kernel compile pass have to be used.
-	*
-	* @param bool $use_kernel_pass
-	*/
-	public function set_use_kernel_pass($use_kernel_pass)
+	 * Disable the caching of the container.
+	 *
+	 * @return $this
+	 */
+	public function without_cache()
 	{
-		$this->use_kernel_pass = $use_kernel_pass;
+		$this->use_cache = false;
+
+		return $this;
 	}
 
 	/**
-	* Set if the php config file should be injecting into the container.
-	*
-	* @param bool $inject_config
-	*/
-	public function set_inject_config($inject_config)
+	 * Set the cache directory.
+	 *
+	 * @param string $cache_dir The cache directory.
+	 * @return $this
+	 */
+	public function with_cache_dir($cache_dir)
 	{
-		$this->inject_config = $inject_config;
+		$this->cache_dir = $cache_dir;
+
+		return $this;
 	}
 
 	/**
-	* Set if a dump container should be used.
-	*
-	* If DEBUG_CONTAINER is set this option is ignored and a new container is build.
-	*
-	* @var bool $dump_container
-	*/
-	public function set_dump_container($dump_container)
+	 * Enable the compilation of the container.
+	 *
+	 * @return $this
+	 */
+	public function with_compiled_container()
 	{
-		$this->dump_container = $dump_container;
+		$this->compile_container = true;
+
+		return $this;
 	}
 
 	/**
-	* Set if the container should be compiled automatically (default to true).
-	*
-	* @var bool $dump_container
-	*/
-	public function set_compile_container($compile_container)
+	 * Disable the compilation of the container.
+	 *
+	 * @return $this
+	 */
+	public function without_compiled_container()
 	{
-		$this->compile_container = $compile_container;
+		$this->compile_container = false;
+
+		return $this;
 	}
 
 	/**
-	* Set a custom path to find the configuration of the container
-	*
-	* @param string $config_path
-	*/
-	public function set_config_path($config_path)
+	 * Set a custom path to find the configuration of the container.
+	 *
+	 * @param string $config_path
+	 * @return $this
+	 */
+	public function with_config_path($config_path)
 	{
 		$this->config_path = $config_path;
+
+		return $this;
 	}
 
 	/**
-	* Set custom parameters to inject into the container.
-	*
-	* @param array $custom_parameters
-	*/
-	public function set_custom_parameters($custom_parameters)
+	 * Set custom parameters to inject into the container.
+	 *
+	 * @param array $custom_parameters
+	 * @return $this
+	 */
+	public function with_custom_parameters($custom_parameters)
 	{
 		$this->custom_parameters = $custom_parameters;
+
+		return $this;
 	}
 
 	/**
-	* Dump the container to the disk.
-	*
-	* @param string $container_filename The name of the file.
-	*/
-	protected function dump_container($container_filename)
+	 * Set custom parameters to inject into the container.
+	 *
+	 * @param \phpbb\config_php_file $config_php_file
+	 * @return $this
+	 */
+	public function with_config(\phpbb\config_php_file $config_php_file)
 	{
-		$dumper = new PhpDumper($this->container);
-		$cached_container_dump = $dumper->dump(array(
-			'class'         => 'phpbb_cache_container',
-			'base_class'    => 'Symfony\\Component\\DependencyInjection\\ContainerBuilder',
-		));
+		$this->config_php_file = $config_php_file;
 
-		file_put_contents($container_filename, $cached_container_dump);
+		return $this;
 	}
 
 	/**
-	* Inject the connection into the container if one was opened.
-	*/
-	protected function inject_dbal()
+	 * Returns the path to the container configuration (default: root_path/config)
+	 *
+	 * @return string
+	 */
+	protected function get_config_path()
 	{
-		if ($this->dbal_connection !== null)
-		{
-			$this->container->get('dbal.conn')->set_driver($this->dbal_connection);
-		}
+		return $this->config_path ?: $this->phpbb_root_path . 'config';
 	}
 
 	/**
-	* Get DB connection.
-	*
-	* @return \phpbb\db\driver\driver_interface
-	*/
-	protected function get_dbal_connection()
+	 * Returns the path to the cache directory (default: root_path/cache/environment).
+	 *
+	 * @return string Path to the cache directory.
+	 */
+	protected function get_cache_dir()
 	{
-		if ($this->dbal_connection === null)
-		{
-			$dbal_driver_class = $this->config_php_file->convert_30_dbms_to_31($this->config_php_file->get('dbms'));
-			$this->dbal_connection = new $dbal_driver_class();
-			$this->dbal_connection->sql_connect(
-				$this->config_php_file->get('dbhost'),
-				$this->config_php_file->get('dbuser'),
-				$this->config_php_file->get('dbpasswd'),
-				$this->config_php_file->get('dbname'),
-				$this->config_php_file->get('dbport'),
-				defined('PHPBB_DB_NEW_LINK') && PHPBB_DB_NEW_LINK
-			);
-		}
-
-		return $this->dbal_connection;
+		return $this->cache_dir ?: $this->phpbb_root_path . 'cache/' . $this->get_environment() . '/';
 	}
 
 	/**
-	* Get enabled extensions.
-	*
-	* @return array enabled extensions
-	*/
-	protected function get_installed_extensions()
+	 * Load the enabled extensions.
+	 */
+	protected function load_extensions()
 	{
-		$db = $this->get_dbal_connection();
-		$extension_table = $this->config_php_file->get('table_prefix') . 'ext';
+		if ($this->config_php_file !== null)
+		{
+			// Build an intermediate container to load the ext list from the database
+			$container_builder = new container_builder($this->phpbb_root_path, $this->php_ext);
+			$ext_container = $container_builder
+				->without_cache()
+				->without_extensions()
+				->with_config($this->config_php_file)
+				->with_config_path($this->get_config_path())
+				->with_environment('production')
+				->without_compiled_container()
+				->get_container()
+			;
+
+			$ext_container->register('cache.driver', '\\phpbb\\cache\\driver\\dummy');
+			$ext_container->compile();
+
+			$extensions = $ext_container->get('ext.manager')->all_enabled();
+
+			// Load each extension found
+			$autoloaders = '<?php
+/**
+ * Loads all extensions custom auto-loaders.
+ *
+ * This file has been auto-generated
+ * by phpBB while loading the extensions.
+ */
+
+';
+			foreach ($extensions as $ext_name => $path)
+			{
+				$extension_class = '\\' . str_replace('/', '\\', $ext_name) . '\\di\\extension';
 
-		$sql = 'SELECT *
-			FROM ' . $extension_table . '
-			WHERE ext_active = 1';
+				if (!class_exists($extension_class))
+				{
+					$extension_class = '\\phpbb\\extension\\di\\extension_base';
+				}
 
-		$result = $db->sql_query($sql);
-		$rows = $db->sql_fetchrowset($result);
-		$db->sql_freeresult($result);
+				$this->container_extensions[] = new $extension_class($ext_name, $path);
 
-		$exts = array();
-		foreach ($rows as $row)
+				// Load extension autoloader
+				$filename = $path . 'vendor/autoload.php';
+				if (file_exists($filename))
+				{
+					$autoloaders .= "require('{$filename}');\n";
+				}
+			}
+
+			$configCache = new ConfigCache($this->get_autoload_filename(), false);
+			$configCache->write($autoloaders);
+
+			require($this->get_autoload_filename());
+		}
+		else
 		{
-			$exts[$row['ext_name']] = $this->phpbb_root_path . 'ext/' . $row['ext_name'] . '/';
+			// To load the extensions we need the database credentials.
+			// Automatically disable the extensions if we don't have them.
+			$this->use_extensions = false;
 		}
+	}
+
+	/**
+	 * Dump the container to the disk.
+	 *
+	 * @param ConfigCache $cache The config cache
+	 */
+	protected function dump_container($cache)
+	{
+		try
+		{
+			$dumper = new PhpDumper($this->container);
+			$proxy_dumper = new ProxyDumper();
+			$dumper->setProxyDumper($proxy_dumper);
+
+			$cached_container_dump = $dumper->dump(array(
+				'class'      => 'phpbb_cache_container',
+				'base_class' => 'Symfony\\Component\\DependencyInjection\\ContainerBuilder',
+			));
 
-		return $exts;
+			$cache->write($cached_container_dump, $this->container->getResources());
+		}
+		catch (IOException $e)
+		{
+			// Don't fail if the cache isn't writeable
+		}
 	}
 
 	/**
-	* Create the ContainerBuilder object
-	*
-	* @param array $extensions Array of Container extension objects
-	* @return ContainerBuilder object
-	*/
+	 * Create the ContainerBuilder object
+	 *
+	 * @param array $extensions Array of Container extension objects
+	 * @return ContainerBuilder object
+	 */
 	protected function create_container(array $extensions)
 	{
-		$container = new ContainerBuilder();
+		$container = new ContainerBuilder(new ParameterBag($this->get_core_parameters()));
+		$container->setProxyInstantiator(new proxy_instantiator($this->get_cache_dir()));
+
+		$extensions_alias = array();
 
 		foreach ($extensions as $extension)
 		{
 			$container->registerExtension($extension);
-			$container->loadFromExtension($extension->getAlias());
+			$extensions_alias[] = $extension->getAlias();
 		}
 
+		$container->getCompilerPassConfig()->setMergePass(new MergeExtensionConfigurationPass($extensions_alias));
+
 		return $container;
 	}
 
 	/**
-	* Inject the customs parameters into the container
-	*/
+	 * Inject the customs parameters into the container
+	 */
 	protected function inject_custom_parameters()
 	{
-		if ($this->custom_parameters === null)
+		foreach ($this->custom_parameters as $key => $value)
 		{
-			$this->custom_parameters = array(
-				'core.root_path' => $this->phpbb_root_path,
-				'core.php_ext' => $this->php_ext,
-			);
+			$this->container->setParameter($key, $value);
 		}
+	}
 
-		foreach ($this->custom_parameters as $key => $value)
+	/**
+	 * Inject the dbal connection driver into container
+	 */
+	protected function inject_dbal_driver()
+	{
+		if (empty($this->config_php_file))
 		{
-			$this->container->setParameter($key, $value);
+			return;
+		}
+
+		$config_data = $this->config_php_file->get_all();
+		if (!empty($config_data))
+		{
+			if ($this->dbal_connection === null)
+			{
+				$dbal_driver_class = $this->config_php_file->convert_30_dbms_to_31($this->config_php_file->get('dbms'));
+				/** @var \phpbb\db\driver\driver_interface $dbal_connection */
+				$this->dbal_connection = new $dbal_driver_class();
+				$this->dbal_connection->sql_connect(
+					$this->config_php_file->get('dbhost'),
+					$this->config_php_file->get('dbuser'),
+					$this->config_php_file->get('dbpasswd'),
+					$this->config_php_file->get('dbname'),
+					$this->config_php_file->get('dbport'),
+					false,
+					defined('PHPBB_DB_NEW_LINK') && PHPBB_DB_NEW_LINK
+				);
+			}
+			$this->container->set('dbal.conn.driver', $this->dbal_connection);
 		}
 	}
 
 	/**
-	* Get the filename under which the dumped container will be stored.
-	*
-	* @return string Path for dumped container
-	*/
+	 * Returns the core parameters.
+	 *
+	 * @return array An array of core parameters
+	 */
+	protected function get_core_parameters()
+	{
+		return array_merge(
+			array(
+				'core.root_path'     => $this->phpbb_root_path,
+				'core.php_ext'       => $this->php_ext,
+				'core.environment'   => $this->get_environment(),
+				'core.debug'         => defined('DEBUG') ? DEBUG : false,
+				'core.cache_dir'     => $this->get_cache_dir(),
+			),
+			$this->get_env_parameters()
+		);
+	}
+
+	/**
+	 * Gets the environment parameters.
+	 *
+	 * Only the parameters starting with "PHPBB__" are considered.
+	 *
+	 * @return array An array of parameters
+	 */
+	protected function get_env_parameters()
+	{
+		$parameters = array();
+		foreach ($_SERVER as $key => $value)
+		{
+			if (0 === strpos($key, 'PHPBB__'))
+			{
+				$parameters[strtolower(str_replace('__', '.', substr($key, 9)))] = $value;
+			}
+		}
+
+		return $parameters;
+	}
+
+	/**
+	 * Get the filename under which the dumped container will be stored.
+	 *
+	 * @return string Path for dumped container
+	 */
 	protected function get_container_filename()
 	{
-		return $this->phpbb_root_path . 'cache/container_' . md5($this->phpbb_root_path) . '.' . $this->php_ext;
+		$container_params = [
+			'phpbb_root_path' => $this->phpbb_root_path,
+			'use_extensions' => $this->use_extensions,
+			'config_path' => $this->config_path,
+		];
+
+		return $this->get_cache_dir() . 'container_' . md5(implode(',', $container_params)) . '.' . $this->php_ext;
+	}
+
+	/**
+	 * Get the filename under which the dumped extensions autoloader will be stored.
+	 *
+	 * @return string Path for dumped extensions autoloader
+	 */
+	protected function get_autoload_filename()
+	{
+		$container_params = [
+			'phpbb_root_path' => $this->phpbb_root_path,
+			'use_extensions' => $this->use_extensions,
+			'config_path' => $this->config_path,
+		];
+
+		return $this->get_cache_dir() . 'autoload_' . md5(implode(',', $container_params)) . '.' . $this->php_ext;
+	}
+
+	/**
+	 * Return the name of the current environment.
+	 *
+	 * @return string
+	 */
+	protected function get_environment()
+	{
+		return $this->environment ?: PHPBB_ENVIRONMENT;
+	}
+
+	private function register_ext_compiler_pass()
+	{
+		$finder = new Finder();
+		$finder
+			->name('*_pass.php')
+			->path('di/pass')
+			->files()
+			->ignoreDotFiles(true)
+			->ignoreUnreadableDirs(true)
+			->ignoreVCS(true)
+			->followLinks()
+			->in($this->phpbb_root_path . 'ext')
+		;
+
+		/** @var \SplFileInfo $pass */
+		foreach ($finder as $pass)
+		{
+			$filename = $pass->getPathname();
+			$filename = substr($filename, 0, -strlen('.' . $pass->getExtension()));
+			$filename = str_replace(DIRECTORY_SEPARATOR, '/', $filename);
+			$className = preg_replace('#^.*ext/#', '', $filename);
+			$className = '\\' . str_replace('/', '\\', $className);
+
+			if (class_exists($className) && in_array('Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface', class_implements($className), true))
+			{
+				$this->container->addCompilerPass(new $className());
+			}
+		}
 	}
 }
--- a/phpbb/di/extension/config.php
+++ b/phpbb/di/extension/config.php
@@ -43,12 +43,6 @@ class config extends Extension
 			'core.adm_relative_path'	=> $this->config_php->get('phpbb_adm_relative_path') ? $this->config_php->get('phpbb_adm_relative_path') : 'adm/',
 			'core.table_prefix'			=> $this->config_php->get('table_prefix'),
 			'cache.driver.class'		=> $this->convert_30_acm_type($this->config_php->get('acm_type')),
-			'dbal.driver.class'			=> $this->config_php->convert_30_dbms_to_31($this->config_php->get('dbms')),
-			'dbal.dbhost'				=> $this->config_php->get('dbhost'),
-			'dbal.dbuser'				=> $this->config_php->get('dbuser'),
-			'dbal.dbpasswd'				=> $this->config_php->get('dbpasswd'),
-			'dbal.dbname'				=> $this->config_php->get('dbname'),
-			'dbal.dbport'				=> $this->config_php->get('dbport'),
 			'dbal.new_link'				=> defined('PHPBB_DB_NEW_LINK') && PHPBB_DB_NEW_LINK,
 		);
 		$parameter_bag = $container->getParameterBag();
--- /dev/null
+++ b/phpbb/di/extension/container_configuration.php
@@ -0,0 +1,52 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\di\extension;
+
+use Symfony\Component\Config\Definition\Builder\TreeBuilder;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+
+class container_configuration implements ConfigurationInterface
+{
+
+	/**
+	 * Generates the configuration tree builder.
+	 *
+	 * @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
+	 */
+	public function getConfigTreeBuilder()
+	{
+		$treeBuilder = new TreeBuilder();
+		$rootNode = $treeBuilder->root('core');
+		$rootNode
+			->children()
+				->booleanNode('require_dev_dependencies')->defaultValue(false)->end()
+				->arrayNode('debug')
+					->addDefaultsIfNotSet()
+					->children()
+						->booleanNode('exceptions')->defaultValue(false)->end()
+					->end()
+				->end()
+				->arrayNode('twig')
+					->addDefaultsIfNotSet()
+					->children()
+						->booleanNode('debug')->defaultValue(null)->end()
+						->booleanNode('auto_reload')->defaultValue(null)->end()
+						->booleanNode('enable_debug_extension')->defaultValue(false)->end()
+					->end()
+				->end()
+			->end()
+		;
+		return $treeBuilder;
+	}
+}
--- a/phpbb/di/extension/core.php
+++ b/phpbb/di/extension/core.php
@@ -13,53 +13,110 @@
 
 namespace phpbb\di\extension;
 
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\Config\Resource\FileResource;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\HttpKernel\DependencyInjection\Extension;
 use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
-use Symfony\Component\Config\FileLocator;
+use Symfony\Component\HttpKernel\DependencyInjection\Extension;
 
 /**
 * Container core extension
 */
 class core extends Extension
 {
+	const TWIG_OPTIONS_POSITION = 6;
+
 	/**
-	* Config path
-	* @var string
-	*/
+	 * Config path
+	 * @var string
+	 */
 	protected $config_path;
 
 	/**
-	* Constructor
-	*
-	* @param string $config_path Config path
-	*/
+	 * Constructor
+	 *
+	 * @param string $config_path Config path
+	 */
 	public function __construct($config_path)
 	{
 		$this->config_path = $config_path;
 	}
 
 	/**
-	* Loads a specific configuration.
-	*
-	* @param array            $config    An array of configuration values
-	* @param ContainerBuilder $container A ContainerBuilder instance
-	*
-	* @throws \InvalidArgumentException When provided tag is not defined in this extension
-	*/
-	public function load(array $config, ContainerBuilder $container)
+	 * Loads a specific configuration.
+	 *
+	 * @param array            $configs   An array of configuration values
+	 * @param ContainerBuilder $container A ContainerBuilder instance
+	 *
+	 * @throws \InvalidArgumentException When provided tag is not defined in this extension
+	 */
+	public function load(array $configs, ContainerBuilder $container)
+	{
+		$filesystem = new \phpbb\filesystem\filesystem();
+		$loader = new YamlFileLoader($container, new FileLocator($filesystem->realpath($this->config_path)));
+		$loader->load($container->getParameter('core.environment') . '/container/environment.yml');
+
+		$config = $this->getConfiguration($configs, $container);
+		$config = $this->processConfiguration($config, $configs);
+
+		if ($config['require_dev_dependencies'])
+		{
+			if (!class_exists('Goutte\Client', true))
+			{
+				trigger_error(
+					'Composer development dependencies have not been set up for the ' . $container->getParameter('core.environment') . ' environment yet, run ' .
+					"'php ../composer.phar install --dev' from the phpBB directory to do so.",
+					E_USER_ERROR
+				);
+			}
+		}
+
+		// Set the Twig options if defined in the environment
+		$definition = $container->getDefinition('template.twig.environment');
+		$twig_environment_options = $definition->getArgument(static::TWIG_OPTIONS_POSITION);
+		if ($config['twig']['debug'])
+		{
+			$twig_environment_options['debug'] = true;
+		}
+		if ($config['twig']['auto_reload'])
+		{
+			$twig_environment_options['auto_reload'] = true;
+		}
+
+		// Replace the 7th argument, the options passed to the environment
+		$definition->replaceArgument(static::TWIG_OPTIONS_POSITION, $twig_environment_options);
+
+		if ($config['twig']['enable_debug_extension'])
+		{
+			$definition = $container->getDefinition('template.twig.extensions.debug');
+			$definition->addTag('twig.extension');
+		}
+
+		// Set the debug options
+		foreach ($config['debug'] as $name => $value)
+		{
+			$container->setParameter('debug.' . $name, $value);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function getConfiguration(array $config, ContainerBuilder $container)
 	{
-		$loader = new YamlFileLoader($container, new FileLocator(phpbb_realpath($this->config_path)));
-		$loader->load('services.yml');
+		$r = new \ReflectionClass('\phpbb\di\extension\container_configuration');
+		$container->addResource(new FileResource($r->getFileName()));
+
+		return new container_configuration();
 	}
 
 	/**
-	* Returns the recommended alias to use in XML.
-	*
-	* This alias is also the mandatory prefix to use when using YAML.
-	*
-	* @return string The alias
-	*/
+	 * Returns the recommended alias to use in XML.
+	 *
+	 * This alias is also the mandatory prefix to use when using YAML.
+	 *
+	 * @return string The alias
+	 */
 	public function getAlias()
 	{
 		return 'core';
--- /dev/null
+++ b/phpbb/di/ordered_service_collection.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\di;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Collection of services in a specified order
+ */
+class ordered_service_collection extends service_collection
+{
+	/**
+	 * @var bool
+	 */
+	protected $is_ordered;
+
+	/**
+	 * @var array
+	 */
+	protected $service_ids;
+
+	/**
+	 * Constructor
+	 *
+	 * @param ContainerInterface $container Container object
+	 */
+	public function __construct(ContainerInterface $container)
+	{
+		$this->is_ordered = false;
+		$this->service_ids = array();
+
+		parent::__construct($container);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function getIterator()
+	{
+		if (!$this->is_ordered)
+		{
+			$this->sort_services();
+		}
+
+		return new service_collection_iterator($this);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function offsetExists($index)
+	{
+		if (!$this->is_ordered)
+		{
+			$this->sort_services();
+		}
+
+		return parent::offsetExists($index);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function offsetGet($index)
+	{
+		if (!$this->is_ordered)
+		{
+			$this->sort_services();
+		}
+
+		return parent::offsetGet($index);
+	}
+
+	/**
+	 * Adds a service ID to the collection
+	 *
+	 * @param string	$service_id
+	 * @param int		$order
+	 */
+	public function add($service_id, $order = 0)
+	{
+		$order = (int) $order;
+		$this->service_ids[$order][] = $service_id;
+		$this->is_ordered = false;
+	}
+
+	protected function sort_services()
+	{
+		if ($this->is_ordered)
+		{
+			return;
+		}
+
+		$this->exchangeArray(array());
+		ksort($this->service_ids);
+		foreach ($this->service_ids as $service_order_group)
+		{
+			foreach ($service_order_group as $service_id)
+			{
+				$this->offsetSet($service_id, null);
+			}
+		}
+
+		$this->is_ordered = true;
+	}
+}
--- a/phpbb/di/pass/collection_pass.php
+++ b/phpbb/di/pass/collection_pass.php
@@ -34,10 +34,30 @@ class collection_pass implements CompilerPassInterface
 		foreach ($container->findTaggedServiceIds('service_collection') as $id => $data)
 		{
 			$definition = $container->getDefinition($id);
+			$is_ordered_collection = (substr($definition->getClass(), -strlen('ordered_service_collection')) === 'ordered_service_collection');
+			$is_class_name_aware = (isset($data[0]['class_name_aware']) && $data[0]['class_name_aware']);
 
 			foreach ($container->findTaggedServiceIds($data[0]['tag']) as $service_id => $service_data)
 			{
-				$definition->addMethodCall('add', array($service_id));
+				if ($is_ordered_collection)
+				{
+					$arguments = array($service_id, $service_data[0]['order']);
+				}
+				else
+				{
+					$arguments = array($service_id);
+				}
+
+				if ($is_class_name_aware)
+				{
+					$service_definition = $container->getDefinition($service_id);
+					$definition->addMethodCall('add_service_class', array(
+						$service_id,
+						$service_definition->getClass()
+					));
+				}
+
+				$definition->addMethodCall('add', $arguments);
 			}
 		}
 	}
--- /dev/null
+++ b/phpbb/di/proxy_instantiator.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\di;
+
+use ProxyManager\Configuration;
+use ProxyManager\Factory\LazyLoadingValueHolderFactory;
+use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\InstantiatorInterface;
+
+/**
+ * Runtime lazy loading proxy generator extended for allowing use while using
+ * open_basedir restrictions
+ *
+ * Original author: Marco Pivetta <ocramius@gmail.com>
+ */
+class proxy_instantiator implements InstantiatorInterface
+{
+	/**
+	 * @var LazyLoadingValueHolderFactory
+	 */
+	private $factory;
+
+	/**
+	 * proxy_instantiator constructor
+	 * @param string $cache_dir Cache dir for fall back when using open_basedir
+	 */
+	public function __construct($cache_dir)
+	{
+		$config = new Configuration();
+
+		// Prevent trying to write to system temp dir in case of open_basedir
+		// restrictions being in effect
+		$tmp_dir = (function_exists('sys_get_temp_dir')) ? sys_get_temp_dir() : '';
+		if (empty($tmp_dir) || !@file_exists($tmp_dir) || !@is_writable($tmp_dir))
+		{
+			$config->setProxiesTargetDir($cache_dir);
+		}
+		$config->setGeneratorStrategy(new EvaluatingGeneratorStrategy());
+
+		$this->factory = new LazyLoadingValueHolderFactory($config);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function instantiateProxy(ContainerInterface $container, Definition $definition, $id, $realInstantiator)
+	{
+		return $this->factory->createProxy(
+			$definition->getClass(),
+			function (&$wrappedInstance, \ProxyManager\Proxy\LazyLoadingInterface $proxy) use ($realInstantiator) {
+				$wrappedInstance = call_user_func($realInstantiator);
+
+				$proxy->setProxyInitializer(null);
+
+				return true;
+			}
+		);
+	}
+}
--- a/phpbb/di/service_collection.php
+++ b/phpbb/di/service_collection.php
@@ -25,6 +25,11 @@ class service_collection extends \ArrayObject
 	*/
 	protected $container;
 
+	/**
+	* @var array
+	*/
+	protected $service_classes;
+
 	/**
 	* Constructor
 	*
@@ -33,6 +38,7 @@ class service_collection extends \ArrayObject
 	public function __construct(ContainerInterface $container)
 	{
 		$this->container = $container;
+		$this->service_classes = array();
 	}
 
 	/**
@@ -76,4 +82,25 @@ class service_collection extends \ArrayObject
 	{
 		$this->offsetSet($name, null);
 	}
+
+	/**
+	* Add a service's class to the collection
+	*
+	* @param string	$service_id
+	* @param string	$class
+	*/
+	public function add_service_class($service_id, $class)
+	{
+		$this->service_classes[$service_id] = $class;
+	}
+
+	/**
+	* Get services' classes
+	*
+	* @return array
+	*/
+	public function get_service_classes()
+	{
+		return $this->service_classes;
+	}
 }
--- a/phpbb/di/service_collection_iterator.php
+++ b/phpbb/di/service_collection_iterator.php
@@ -32,7 +32,7 @@ class service_collection_iterator extends \ArrayIterator
 	*/
 	public function __construct(service_collection $collection, $flags = 0)
 	{
-		parent::__construct($collection, $flags);
+		parent::__construct($collection->getArrayCopy(), $flags);
 		$this->collection = $collection;
 	}
 
--- a/phpbb/event/kernel_exception_subscriber.php
+++ b/phpbb/event/kernel_exception_subscriber.php
@@ -24,15 +24,17 @@ class kernel_exception_subscriber implements EventSubscriberInterface
 {
 	/**
 	* Template object
+	*
 	* @var \phpbb\template\template
 	*/
 	protected $template;
 
 	/**
-	* User object
-	* @var \phpbb\user
+	* Language object
+	*
+	* @var \phpbb\language\language
 	*/
-	protected $user;
+	protected $language;
 
 	/** @var \phpbb\request\type_cast_helper */
 	protected $type_caster;
@@ -40,13 +42,13 @@ class kernel_exception_subscriber implements EventSubscriberInterface
 	/**
 	* Construct method
 	*
-	* @param \phpbb\template\template $template Template object
-	* @param \phpbb\user $user User object
+	* @param \phpbb\template\template	$template	Template object
+	* @param \phpbb\language\language	$language	Language object
 	*/
-	public function __construct(\phpbb\template\template $template, \phpbb\user $user)
+	public function __construct(\phpbb\template\template $template, \phpbb\language\language $language)
 	{
 		$this->template = $template;
-		$this->user = $user;
+		$this->language = $language;
 		$this->type_caster = new \phpbb\request\type_cast_helper();
 	}
 
@@ -61,19 +63,22 @@ class kernel_exception_subscriber implements EventSubscriberInterface
 		$exception = $event->getException();
 
 		$message = $exception->getMessage();
-		$this->type_caster->set_var($message, $message, 'string', false, false);
+		$this->type_caster->set_var($message, $message, 'string', true, false);
 
 		if ($exception instanceof \phpbb\exception\exception_interface)
 		{
-			$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($message), $exception->get_parameters()));
+			$message = $this->language->lang_array($message, $exception->get_parameters());
 		}
 
+		// Show <strong> text in bold
+		$message = preg_replace('#&lt;(/?strong)&gt;#i', '<$1>', $message);
+
 		if (!$event->getRequest()->isXmlHttpRequest())
 		{
-			page_header($this->user->lang('INFORMATION'));
+			page_header($this->language->lang('INFORMATION'));
 
 			$this->template->assign_vars(array(
-				'MESSAGE_TITLE' => $this->user->lang('INFORMATION'),
+				'MESSAGE_TITLE' => $this->language->lang('INFORMATION'),
 				'MESSAGE_TEXT'  => $message,
 			));
 
@@ -111,7 +116,7 @@ class kernel_exception_subscriber implements EventSubscriberInterface
 		$event->setResponse($response);
 	}
 
-	public static function getSubscribedEvents()
+	static public function getSubscribedEvents()
 	{
 		return array(
 			KernelEvents::EXCEPTION		=> 'on_kernel_exception',
--- a/phpbb/event/kernel_terminate_subscriber.php
+++ b/phpbb/event/kernel_terminate_subscriber.php
@@ -32,7 +32,7 @@ class kernel_terminate_subscriber implements EventSubscriberInterface
 		exit_handler();
 	}
 
-	public static function getSubscribedEvents()
+	static public function getSubscribedEvents()
 	{
 		return array(
 			KernelEvents::TERMINATE		=> array('on_kernel_terminate', ~PHP_INT_MAX),
--- a/phpbb/event/md_exporter.php
+++ b/phpbb/event/md_exporter.php
@@ -99,7 +99,7 @@ class md_exporter
 	{
 		$this->crawl_eventsmd($md_file, 'styles');
 
-		$styles = array('prosilver', 'subsilver2');
+		$styles = array('prosilver');
 		foreach ($styles as $style)
 		{
 			$file_list = $this->get_recursive_file_list(
@@ -266,7 +266,7 @@ class md_exporter
 				$wiki_page = '= Template Events =' . "\n";
 			}
 			$wiki_page .= '{| class="zebra sortable" cellspacing="0" cellpadding="5"' . "\n";
-			$wiki_page .= '! Identifier !! Prosilver Placement (If applicable) !! Subsilver Placement (If applicable) !! Added in Release !! Explanation' . "\n";
+			$wiki_page .= '! Identifier !! Prosilver Placement (If applicable) !! Added in Release !! Explanation' . "\n";
 		}
 
 		foreach ($this->events as $event_name => $event)
@@ -280,7 +280,7 @@ class md_exporter
 			}
 			else
 			{
-				$wiki_page .= implode(', ', $event['files']['prosilver']) . ' || ' . implode(', ', $event['files']['subsilver2']);
+				$wiki_page .= implode(', ', $event['files']['prosilver']);
 			}
 
 			$wiki_page .= " || {$event['since']} || " . str_replace("\n", ' ', $event['description']) . "\n";
@@ -371,7 +371,6 @@ class md_exporter
 	{
 		$files_list = array(
 			'prosilver'		=> array(),
-			'subsilver2'	=> array(),
 			'adm'			=> array(),
 		);
 
@@ -391,10 +390,6 @@ class md_exporter
 				{
 					$files_list['prosilver'][] = substr($file, strlen('styles/prosilver/template/'));
 				}
-				else if (($this->filter !== 'adm') && strpos($file, 'styles/subsilver2/template/') === 0)
-				{
-					$files_list['subsilver2'][] = substr($file, strlen('styles/subsilver2/template/'));
-				}
 				else if (($this->filter === 'adm') && strpos($file, 'adm/style/') === 0)
 				{
 					$files_list['adm'][] = substr($file, strlen('adm/style/'));
--- /dev/null
+++ b/phpbb/exception/version_check_exception.php
@@ -0,0 +1,21 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\exception;
+
+/**
+ * Define an exception related to the version checker.
+ */
+class version_check_exception extends runtime_exception
+{
+}
--- a/phpbb/extension/base.php
+++ b/phpbb/extension/base.php
@@ -24,7 +24,7 @@ class base implements \phpbb\extension\extension_interface
 	protected $container;
 
 	/** @var \phpbb\finder */
-	protected $finder;
+	protected $extension_finder;
 
 	/** @var \phpbb\db\migrator */
 	protected $migrator;
@@ -73,9 +73,7 @@ class base implements \phpbb\extension\extension_interface
 	*/
 	public function enable_step($old_state)
 	{
-		$migrations = $this->get_migration_file_list();
-
-		$this->migrator->set_migrations($migrations);
+		$this->get_migration_file_list();
 
 		$this->migrator->update();
 
@@ -103,8 +101,6 @@ class base implements \phpbb\extension\extension_interface
 	{
 		$migrations = $this->get_migration_file_list();
 
-		$this->migrator->set_migrations($migrations);
-
 		foreach ($migrations as $migration)
 		{
 			while ($this->migrator->migration_state($migration) !== false)
@@ -137,6 +133,10 @@ class base implements \phpbb\extension\extension_interface
 
 		$migrations = $this->extension_finder->get_classes_from_files($migrations);
 
+		$this->migrator->set_migrations($migrations);
+
+		$migrations = $this->migrator->get_migrations();
+
 		return $migrations;
 	}
 }
--- /dev/null
+++ b/phpbb/extension/di/extension_base.php
@@ -0,0 +1,138 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\extension\di;
+
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
+use Symfony\Component\HttpKernel\DependencyInjection\Extension;
+
+/**
+ * Container core extension
+ */
+class extension_base extends Extension
+{
+	/**
+	 * Name of the extension (vendor/name)
+	 *
+	 * @var string
+	 */
+	protected $extension_name;
+
+	/**
+	 * Path to the extension.
+	 *
+	 * @var string
+	 */
+	protected $ext_path;
+
+	/**
+	 * Constructor
+	 *
+	 * @param string $extension_name Name of the extension (vendor/name)
+	 * @param string $ext_path       Path to the extension
+	 */
+	public function __construct($extension_name, $ext_path)
+	{
+		$this->extension_name = $extension_name;
+		$this->ext_path = $ext_path;
+	}
+
+	/**
+	 * Loads a specific configuration.
+	 *
+	 * @param array            $configs   An array of configuration values
+	 * @param ContainerBuilder $container A ContainerBuilder instance
+	 *
+	 * @throws \InvalidArgumentException When provided tag is not defined in this extension
+	 */
+	public function load(array $configs, ContainerBuilder $container)
+	{
+		$this->load_services($container);
+	}
+
+	/**
+	 * Loads the services.yml file.
+	 *
+	 * @param ContainerBuilder $container A ContainerBuilder instance
+	 */
+	protected function load_services(ContainerBuilder $container)
+	{
+		$services_directory = false;
+		$services_file = false;
+
+		if (file_exists($this->ext_path . 'config/' . $container->getParameter('core.environment') . '/container/environment.yml'))
+		{
+			$services_directory = $this->ext_path . 'config/' . $container->getParameter('core.environment') . '/container/';
+			$services_file = 'environment.yml';
+		}
+		else if (!is_dir($this->ext_path . 'config/' . $container->getParameter('core.environment')))
+		{
+			if (file_exists($this->ext_path . 'config/default/container/environment.yml'))
+			{
+				$services_directory = $this->ext_path . 'config/default/container/';
+				$services_file = 'environment.yml';
+			}
+			else if (!is_dir($this->ext_path . 'config/default') && file_exists($this->ext_path . '/config/services.yml'))
+			{
+				$services_directory = $this->ext_path . 'config';
+				$services_file = 'services.yml';
+			}
+		}
+
+		if ($services_directory && $services_file)
+		{
+			$filesystem = new \phpbb\filesystem\filesystem();
+			$loader = new YamlFileLoader($container, new FileLocator($filesystem->realpath($services_directory)));
+			$loader->load($services_file);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function getConfiguration(array $config, ContainerBuilder $container)
+	{
+		$reflected = new \ReflectionClass($this);
+		$namespace = $reflected->getNamespaceName();
+
+		$class = $namespace . '\\di\configuration';
+		if (class_exists($class))
+		{
+			$r = new \ReflectionClass($class);
+			$container->addResource(new FileResource($r->getFileName()));
+
+			if (!method_exists($class, '__construct'))
+			{
+				$configuration = new $class();
+
+				return $configuration;
+			}
+		}
+
+	}
+
+	/**
+	 * Returns the recommended alias to use in XML.
+	 *
+	 * This alias is also the mandatory prefix to use when using YAML.
+	 *
+	 * @return string The alias
+	 */
+	public function getAlias()
+	{
+		return str_replace('/', '_', $this->extension_name);
+	}
+}
--- a/phpbb/extension/exception.php
+++ b/phpbb/extension/exception.php
@@ -16,10 +16,6 @@ namespace phpbb\extension;
 /**
  * Exception class for metadata
  */
-class exception extends \UnexpectedValueException
+class exception extends \phpbb\exception\runtime_exception
 {
-	public function __toString()
-	{
-		return $this->getMessage();
-	}
 }
--- a/phpbb/extension/manager.php
+++ b/phpbb/extension/manager.php
@@ -13,6 +13,8 @@
 
 namespace phpbb\extension;
 
+use phpbb\exception\runtime_exception;
+use phpbb\file_downloader;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -26,7 +28,6 @@ class manager
 	protected $db;
 	protected $config;
 	protected $cache;
-	protected $user;
 	protected $php_ext;
 	protected $extensions;
 	protected $extension_table;
@@ -39,15 +40,14 @@ class manager
 	* @param ContainerInterface $container A container
 	* @param \phpbb\db\driver\driver_interface $db A database connection
 	* @param \phpbb\config\config $config Config object
-	* @param \phpbb\filesystem $filesystem
-	* @param \phpbb\user $user User object
+	* @param \phpbb\filesystem\filesystem_interface $filesystem
 	* @param string $extension_table The name of the table holding extensions
 	* @param string $phpbb_root_path Path to the phpbb includes directory.
 	* @param string $php_ext php file extension, defaults to php
-	* @param \phpbb\cache\driver\driver_interface $cache A cache instance or null
+	* @param \phpbb\cache\service $cache A cache instance or null
 	* @param string $cache_name The name of the cache variable, defaults to _ext
 	*/
-	public function __construct(ContainerInterface $container, \phpbb\db\driver\driver_interface $db, \phpbb\config\config $config, \phpbb\filesystem $filesystem, \phpbb\user $user, $extension_table, $phpbb_root_path, $php_ext = 'php', \phpbb\cache\driver\driver_interface $cache = null, $cache_name = '_ext')
+	public function __construct(ContainerInterface $container, \phpbb\db\driver\driver_interface $db, \phpbb\config\config $config, \phpbb\filesystem\filesystem_interface $filesystem, $extension_table, $phpbb_root_path, $php_ext = 'php', \phpbb\cache\service $cache = null, $cache_name = '_ext')
 	{
 		$this->cache = $cache;
 		$this->cache_name = $cache_name;
@@ -58,7 +58,6 @@ class manager
 		$this->filesystem = $filesystem;
 		$this->phpbb_root_path = $phpbb_root_path;
 		$this->php_ext = $php_ext;
-		$this->user = $user;
 
 		$this->extensions = ($this->cache) ? $this->cache->get($this->cache_name) : false;
 
@@ -149,12 +148,11 @@ class manager
 	* Instantiates the metadata manager for the extension with the given name
 	*
 	* @param string $name The extension name
-	* @param \phpbb\template\template $template The template manager
 	* @return \phpbb\extension\metadata_manager Instance of the metadata manager
 	*/
-	public function create_extension_metadata_manager($name, \phpbb\template\template $template)
+	public function create_extension_metadata_manager($name)
 	{
-		return new \phpbb\extension\metadata_manager($name, $this->config, $this, $template, $this->user, $this->phpbb_root_path);
+		return new \phpbb\extension\metadata_manager($name, $this->config, $this, $this->phpbb_root_path);
 	}
 
 	/**
@@ -464,15 +462,17 @@ class manager
 	* All enabled and disabled extensions are considered configured. A purged
 	* extension that is no longer in the database is not configured.
 	*
+	* @param bool $phpbb_relative Whether the path should be relative to phpbb root
+	*
 	* @return array An array with extension names as keys and and the
 	*               database stored extension information as values
 	*/
-	public function all_configured()
+	public function all_configured($phpbb_relative = true)
 	{
 		$configured = array();
 		foreach ($this->extensions as $name => $data)
 		{
-			$data['ext_path'] = $this->phpbb_root_path . $data['ext_path'];
+			$data['ext_path'] = ($phpbb_relative ? $this->phpbb_root_path : '') . $data['ext_path'];
 			$configured[$name] = $data;
 		}
 		return $configured;
@@ -480,18 +480,19 @@ class manager
 
 	/**
 	* Retrieves all enabled extensions.
+	* @param bool $phpbb_relative Whether the path should be relative to phpbb root
 	*
 	* @return array An array with extension names as keys and and the
 	*               database stored extension information as values
 	*/
-	public function all_enabled()
+	public function all_enabled($phpbb_relative = true)
 	{
 		$enabled = array();
 		foreach ($this->extensions as $name => $data)
 		{
 			if ($data['ext_active'])
 			{
-				$enabled[$name] = $this->phpbb_root_path . $data['ext_path'];
+				$enabled[$name] = ($phpbb_relative ? $this->phpbb_root_path : '') . $data['ext_path'];
 			}
 		}
 		return $enabled;
@@ -500,17 +501,19 @@ class manager
 	/**
 	* Retrieves all disabled extensions.
 	*
+	* @param bool $phpbb_relative Whether the path should be relative to phpbb root
+	*
 	* @return array An array with extension names as keys and and the
 	*               database stored extension information as values
 	*/
-	public function all_disabled()
+	public function all_disabled($phpbb_relative = true)
 	{
 		$disabled = array();
 		foreach ($this->extensions as $name => $data)
 		{
 			if (!$data['ext_active'])
 			{
-				$disabled[$name] = $this->phpbb_root_path . $data['ext_path'];
+				$disabled[$name] = ($phpbb_relative ? $this->phpbb_root_path : '') . $data['ext_path'];
 			}
 		}
 		return $disabled;
@@ -563,6 +566,35 @@ class manager
 		return isset($this->extensions[$name]);
 	}
 
+	/**
+	* Check the version and return the available updates (for an extension).
+	*
+	* @param \phpbb\extension\metadata_manager $md_manager The metadata manager for the version to check.
+	* @param bool $force_update Ignores cached data. Defaults to false.
+	* @param bool $force_cache Force the use of the cache. Override $force_update.
+	* @param string $stability Force the stability (null by default).
+	* @return string
+	* @throws runtime_exception
+	*/
+	public function version_check(\phpbb\extension\metadata_manager $md_manager, $force_update = false, $force_cache = false, $stability = null)
+	{
+		$meta = $md_manager->get_metadata('all');
+
+		if (!isset($meta['extra']['version-check']))
+		{
+			throw new runtime_exception('NO_VERSIONCHECK');
+		}
+
+		$version_check = $meta['extra']['version-check'];
+
+		$version_helper = new \phpbb\version_helper($this->cache, $this->config, new file_downloader());
+		$version_helper->set_current_version($meta['version']);
+		$version_helper->set_file_location($version_check['host'], $version_check['directory'], $version_check['filename']);
+		$version_helper->force_stability($stability);
+
+		return $updates = $version_helper->get_suggested_updates($force_update, $force_cache);
+	}
+
 	/**
 	* Check to see if a given extension is purged
 	*
--- a/phpbb/extension/metadata_manager.php
+++ b/phpbb/extension/metadata_manager.php
@@ -30,18 +30,6 @@ class metadata_manager
 	*/
 	protected $extension_manager;
 
-	/**
-	* phpBB Template instance
-	* @var \phpbb\template\template
-	*/
-	protected $template;
-
-	/**
-	* phpBB User instance
-	* @var \phpbb\user
-	*/
-	protected $user;
-
 	/**
 	* phpBB root path
 	* @var string
@@ -72,16 +60,12 @@ class metadata_manager
 	* @param string				$ext_name			Name (including vendor) of the extension
 	* @param \phpbb\config\config		$config				phpBB Config instance
 	* @param \phpbb\extension\manager	$extension_manager	An instance of the phpBB extension manager
-	* @param \phpbb\template\template	$template			phpBB Template instance
-	* @param \phpbb\user 		$user 				User instance
 	* @param string				$phpbb_root_path	Path to the phpbb includes directory.
 	*/
-	public function __construct($ext_name, \phpbb\config\config $config, \phpbb\extension\manager $extension_manager, \phpbb\template\template $template, \phpbb\user $user, $phpbb_root_path)
+	public function __construct($ext_name, \phpbb\config\config $config, \phpbb\extension\manager $extension_manager, $phpbb_root_path)
 	{
 		$this->config = $config;
 		$this->extension_manager = $extension_manager;
-		$this->template = $template;
-		$this->user = $user;
 		$this->phpbb_root_path = $phpbb_root_path;
 
 		$this->ext_name = $ext_name;
@@ -118,8 +102,9 @@ class metadata_manager
 				return $this->metadata;
 			break;
 
+			case 'version':
 			case 'name':
-				return ($this->validate('name')) ? $this->metadata['name'] : false;
+				return ($this->validate($element)) ? $this->metadata[$element] : false;
 			break;
 
 			case 'display-name':
@@ -149,7 +134,7 @@ class metadata_manager
 
 		if (!file_exists($this->metadata_file))
 		{
-			throw new \phpbb\extension\exception($this->user->lang('FILE_NOT_FOUND', $this->metadata_file));
+			throw new \phpbb\extension\exception('FILE_NOT_FOUND', array($this->metadata_file));
 		}
 	}
 
@@ -163,18 +148,18 @@ class metadata_manager
 	{
 		if (!file_exists($this->metadata_file))
 		{
-			throw new \phpbb\extension\exception($this->user->lang('FILE_NOT_FOUND', $this->metadata_file));
+			throw new \phpbb\extension\exception('FILE_NOT_FOUND', array($this->metadata_file));
 		}
 		else
 		{
 			if (!($file_contents = file_get_contents($this->metadata_file)))
 			{
-				throw new \phpbb\extension\exception($this->user->lang('FILE_CONTENT_ERR', $this->metadata_file));
+				throw new \phpbb\extension\exception('FILE_CONTENT_ERR', array($this->metadata_file));
 			}
 
 			if (($metadata = json_decode($file_contents, true)) === null)
 			{
-				throw new \phpbb\extension\exception($this->user->lang('FILE_JSON_DECODE_ERR', $this->metadata_file));
+				throw new \phpbb\extension\exception('FILE_JSON_DECODE_ERR', array($this->metadata_file));
 			}
 
 			array_walk_recursive($metadata, array($this, 'sanitize_json'));
@@ -246,12 +231,12 @@ class metadata_manager
 				{
 					if (!isset($this->metadata[$name]))
 					{
-						throw new \phpbb\extension\exception($this->user->lang('META_FIELD_NOT_SET', $name));
+						throw new \phpbb\extension\exception('META_FIELD_NOT_SET', array($name));
 					}
 
 					if (!preg_match($fields[$name], $this->metadata[$name]))
 					{
-						throw new \phpbb\extension\exception($this->user->lang('META_FIELD_INVALID', $name));
+						throw new \phpbb\extension\exception('META_FIELD_INVALID', array($name));
 					}
 				}
 			break;
@@ -270,14 +255,14 @@ class metadata_manager
 	{
 		if (empty($this->metadata['authors']))
 		{
-			throw new \phpbb\extension\exception($this->user->lang('META_FIELD_NOT_SET', 'authors'));
+			throw new \phpbb\extension\exception('META_FIELD_NOT_SET', array('authors'));
 		}
 
 		foreach ($this->metadata['authors'] as $author)
 		{
 			if (!isset($author['name']))
 			{
-				throw new \phpbb\extension\exception($this->user->lang('META_FIELD_NOT_SET', 'author name'));
+				throw new \phpbb\extension\exception('META_FIELD_NOT_SET', array('author name'));
 			}
 		}
 
@@ -344,11 +329,11 @@ class metadata_manager
 	/**
 	* Outputs the metadata into the template
 	*
-	* @return null
+	* @param \phpbb\template\template	$template	phpBB Template instance
 	*/
-	public function output_template_data()
+	public function output_template_data(\phpbb\template\template $template)
 	{
-		$this->template->assign_vars(array(
+		$template->assign_vars(array(
 			'META_NAME'			=> $this->metadata['name'],
 			'META_TYPE'			=> $this->metadata['type'],
 			'META_DESCRIPTION'	=> (isset($this->metadata['description'])) ? $this->metadata['description'] : '',
@@ -368,7 +353,7 @@ class metadata_manager
 
 		foreach ($this->metadata['authors'] as $author)
 		{
-			$this->template->assign_block_vars('meta_authors', array(
+			$template->assign_block_vars('meta_authors', array(
 				'AUTHOR_NAME'		=> $author['name'],
 				'AUTHOR_EMAIL'		=> (isset($author['email'])) ? $author['email'] : '',
 				'AUTHOR_HOMEPAGE'	=> (isset($author['homepage'])) ? $author['homepage'] : '',
--- a/phpbb/feed/attachments_base.php
+++ b/phpbb/feed/attachments_base.php
@@ -16,7 +16,7 @@ namespace phpbb\feed;
 /**
 * Abstract class for feeds displaying attachments
 */
-abstract class attachments_base extends \phpbb\feed\base
+abstract class attachments_base extends base
 {
 	/**
 	* Attachments that may be displayed
@@ -25,8 +25,11 @@ abstract class attachments_base extends \phpbb\feed\base
 
 	/**
 	* Retrieve the list of attachments that may be displayed
+	*
+	* @param array $post_ids Specify for which post IDs to fetch the attachments (optional)
+	* @param array $topic_ids Specify for which topic IDs to fetch the attachments (optional)
 	*/
-	protected function fetch_attachments()
+	protected function fetch_attachments($post_ids = array(), $topic_ids = array())
 	{
 		$sql_array = array(
 			'SELECT'   => 'a.*',
@@ -37,7 +40,20 @@ abstract class attachments_base extends \phpbb\feed\base
 			'ORDER_BY' => 'a.filetime DESC, a.post_msg_id ASC',
 		);
 
-		if (isset($this->topic_id))
+		if (!empty($post_ids))
+		{
+			$sql_array['WHERE'] .= 'AND ' . $this->db->sql_in_set('a.post_msg_id', $post_ids);
+		}
+		else if (!empty($topic_ids))
+		{
+			if (isset($this->topic_id))
+			{
+				$topic_ids[] = $this->topic_id;
+			}
+
+			$sql_array['WHERE'] .= 'AND ' . $this->db->sql_in_set('a.topic_id', $topic_ids);
+		}
+		else if (isset($this->topic_id))
 		{
 			$sql_array['WHERE'] .= 'AND a.topic_id = ' . (int) $this->topic_id;
 		}
@@ -51,6 +67,11 @@ abstract class attachments_base extends \phpbb\feed\base
 			);
 			$sql_array['WHERE'] .= 'AND t.forum_id = ' . (int) $this->forum_id;
 		}
+		else
+		{
+			// Do not allow querying the full attachments table
+			throw new \RuntimeException($this->user->lang('INVALID_FEED_ATTACHMENTS'));
+		}
 
 		$sql = $this->db->sql_build_query('SELECT', $sql_array);
 		$result = $this->db->sql_query($sql);
@@ -63,15 +84,6 @@ abstract class attachments_base extends \phpbb\feed\base
 		$this->db->sql_freeresult($result);
 	}
 
-	/**
-	* {@inheritDoc}
-	*/
-	public function open()
-	{
-		parent::open();
-		$this->fetch_attachments();
-	}
-
 	/**
 	* Get attachments related to a given post
 	*
--- a/phpbb/feed/base.php
+++ b/phpbb/feed/base.php
@@ -1,27 +1,27 @@
 <?php
 /**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
 
 namespace phpbb\feed;
 
 /**
-* Base class with some generic functions and settings.
-*/
-abstract class base
+ * Base class with some generic functions and settings.
+ */
+abstract class base implements feed_interface
 {
 	/**
-	* Feed helper object
-	* @var \phpbb\feed\helper
-	*/
+	 * Feed helper object
+	 * @var \phpbb\feed\helper
+	 */
 	protected $helper;
 
 	/** @var \phpbb\config\config */
@@ -49,47 +49,47 @@ abstract class base
 	protected $phpEx;
 
 	/**
-	* SQL Query to be executed to get feed items
-	*/
-	var $sql = array();
+	 * SQL Query to be executed to get feed items
+	 */
+	protected $sql = array();
 
 	/**
-	* Keys specified for retrieval of title, content, etc.
-	*/
-	var $keys = array();
+	 * Keys specified for retrieval of title, content, etc.
+	 */
+	protected $keys = array();
 
 	/**
-	* Number of items to fetch. Usually overwritten by $config['feed_something']
-	*/
-	var $num_items = 15;
+	 * Number of items to fetch. Usually overwritten by $config['feed_something']
+	 */
+	protected $num_items = 15;
 
 	/**
-	* Separator for title elements to separate items (for example forum / topic)
-	*/
-	var $separator = "\xE2\x80\xA2"; // &bull;
+	 * Separator for title elements to separate items (for example forum / topic)
+	 */
+	protected $separator = "\xE2\x80\xA2"; // &bull;
 
 	/**
-	* Separator for the statistics row (Posted by, post date, replies, etc.)
-	*/
-	var $separator_stats = "\xE2\x80\x94"; // &mdash;
+	 * Separator for the statistics row (Posted by, post date, replies, etc.)
+	 */
+	protected $separator_stats = "\xE2\x80\x94"; // &mdash;
 
 	/** @var mixed Query result handle */
 	protected $result;
 
 	/**
-	* Constructor
-	*
-	* @param \phpbb\feed\helper					$helper		Feed helper
-	* @param \phpbb\config\config				$config		Config object
-	* @param \phpbb\db\driver\driver_interface	$db			Database connection
-	* @param \phpbb\cache\driver\driver_interface	$cache	Cache object
-	* @param \phpbb\user						$user		User object
-	* @param \phpbb\auth\auth					$auth		Auth object
-	* @param \phpbb\content_visibility			$content_visibility		Content visibility object
-	* @param \phpbb\event\dispatcher_interface	$phpbb_dispatcher		Event dispatcher object
-	* @param string								$phpEx		php file extension
-	*/
-	function __construct(
+	 * Constructor
+	 *
+	 * @param \phpbb\feed\helper					$helper		Feed helper
+	 * @param \phpbb\config\config				$config		Config object
+	 * @param \phpbb\db\driver\driver_interface	$db			Database connection
+	 * @param \phpbb\cache\driver\driver_interface	$cache	Cache object
+	 * @param \phpbb\user						$user		User object
+	 * @param \phpbb\auth\auth					$auth		Auth object
+	 * @param \phpbb\content_visibility			$content_visibility		Auth object
+	 * @param \phpbb\event\dispatcher_interface	$phpbb_dispatcher		Event dispatcher object
+	 * @param string								$phpEx		php file extension
+	 */
+	public function __construct(
 		\phpbb\feed\helper $helper,
 		\phpbb\config\config $config,
 		\phpbb\db\driver\driver_interface $db,
@@ -127,23 +127,23 @@ abstract class base
 	}
 
 	/**
-	* Set keys.
-	*/
-	function set_keys()
+	 * {@inheritdoc}
+	 */
+	public function set_keys()
 	{
 	}
 
 	/**
-	* Open feed
-	*/
-	function open()
+	 * {@inheritdoc}
+	 */
+	public function open()
 	{
 	}
 
 	/**
-	* Close feed
-	*/
-	function close()
+	 * {@inheritdoc}
+	 */
+	public function close()
 	{
 		if (!empty($this->result))
 		{
@@ -152,28 +152,62 @@ abstract class base
 	}
 
 	/**
-	* Set key
-	*
-	* @param string $key Key
-	* @param mixed $value Value
-	*/
-	function set($key, $value)
+	 * {@inheritdoc}
+	 */
+	public function set($key, $value)
 	{
 		$this->keys[$key] = $value;
 	}
 
 	/**
-	* Get key
-	*
-	* @param string $key Key
-	* @return mixed
-	*/
-	function get($key)
+	 * {@inheritdoc}
+	 */
+	public function get($key)
 	{
 		return (isset($this->keys[$key])) ? $this->keys[$key] : null;
 	}
 
-	function get_readable_forums()
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_item()
+	{
+		if (!isset($this->result))
+		{
+			if (!$this->get_sql())
+			{
+				return false;
+			}
+
+			$sql_ary = $this->sql;
+
+			/**
+			 * Event to modify the feed item sql
+			 *
+			 * @event core.feed_base_modify_item_sql
+			 * @var	array	sql_ary		The SQL array to get the feed item data
+			 *
+			 * @since 3.1.10-RC1
+			 */
+			$vars = array('sql_ary');
+			extract($this->phpbb_dispatcher->trigger_event('core.feed_base_modify_item_sql', compact($vars)));
+			$this->sql = $sql_ary;
+			unset($sql_ary);
+
+			// Query database
+			$sql = $this->db->sql_build_query('SELECT', $this->sql);
+			$this->result = $this->db->sql_query_limit($sql, $this->num_items);
+		}
+
+		return $this->db->sql_fetchrow($this->result);
+	}
+
+	/**
+	 * Returns the ids of the forums readable by the current user.
+	 *
+	 * @return int[]
+	 */
+	protected function get_readable_forums()
 	{
 		static $forum_ids;
 
@@ -185,7 +219,12 @@ abstract class base
 		return $forum_ids;
 	}
 
-	function get_moderator_approve_forums()
+	/**
+	 * Returns the ids of the forum for which the current user can approve the post in the moderation queue.
+	 *
+	 * @return int[]
+	 */
+	protected function get_moderator_approve_forums()
 	{
 		static $forum_ids;
 
@@ -197,7 +236,13 @@ abstract class base
 		return $forum_ids;
 	}
 
-	function is_moderator_approve_forum($forum_id)
+	/**
+	 * Returns true if the current user can approve the post of the given forum
+	 *
+	 * @param int $forum_id Forum id to check
+	 * @return bool
+	 */
+	protected function is_moderator_approve_forum($forum_id)
 	{
 		static $forum_ids;
 
@@ -209,7 +254,12 @@ abstract class base
 		return (isset($forum_ids[$forum_id])) ? true : false;
 	}
 
-	function get_excluded_forums()
+	/**
+	 * Returns the ids of the forum excluded from the feeds
+	 *
+	 * @return int[]
+	 */
+	protected function get_excluded_forums()
 	{
 		static $forum_ids;
 
@@ -236,51 +286,35 @@ abstract class base
 		return $forum_ids;
 	}
 
-	function is_excluded_forum($forum_id)
+	/**
+	 * Returns true if the given id is in the excluded forums list.
+	 *
+	 * @param int $forum_id Id to check
+	 * @return bool
+	 */
+	protected function is_excluded_forum($forum_id)
 	{
 		$forum_ids = $this->get_excluded_forums();
 
 		return isset($forum_ids[$forum_id]) ? true : false;
 	}
 
-	function get_passworded_forums()
+	/**
+	 * Returns all password protected forum ids the current user is currently NOT authenticated for.
+	 *
+	 * @return array     Array of forum ids
+	 */
+	protected function get_passworded_forums()
 	{
 		return $this->user->get_passworded_forums();
 	}
 
-	function get_item()
-	{
-		if (!isset($this->result))
-		{
-			if (!$this->get_sql())
-			{
-				return false;
-			}
-
-			$sql_ary = $this->sql;
-
-			/**
-			* Event to modify the feed item sql
-			*
-			* @event core.feed_base_modify_item_sql
-			* @var	array	sql_ary		The SQL array to get the feed item data
-			*
-			* @since 3.1.10-RC1
-			*/
-			$vars = array('sql_ary');
-			extract($this->phpbb_dispatcher->trigger_event('core.feed_base_modify_item_sql', compact($vars)));
-			$this->sql = $sql_ary;
-			unset($sql_ary);
-
-			// Query database
-			$sql = $this->db->sql_build_query('SELECT', $this->sql);
-			$this->result = $this->db->sql_query_limit($sql, $this->num_items);
-		}
-
-		return $this->db->sql_fetchrow($this->result);
-	}
-
-	function user_viewprofile($row)
+	/**
+	 * Returns the link to the user profile.
+	 *
+	 * @return string
+	 */
+	protected function user_viewprofile($row)
 	{
 		$author_id = (int) $row[$this->get('author_id')];
 
@@ -293,4 +327,11 @@ abstract class base
 
 		return '<a href="' . $this->helper->append_sid('memberlist.' . $this->phpEx, 'mode=viewprofile&amp;u=' . $author_id) . '">' . $row[$this->get('creator')] . '</a>';
 	}
+
+	/**
+	 * Returns the SQL query used to retrieve the posts of the feed.
+	 *
+	 * @return string SQL SELECT query
+	 */
+	protected abstract function get_sql();
 }
--- /dev/null
+++ b/phpbb/feed/controller/feed.php
@@ -0,0 +1,411 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\feed\controller;
+
+use phpbb\auth\auth;
+use phpbb\config\config;
+use phpbb\db\driver\driver_interface;
+use \phpbb\event\dispatcher_interface;
+use phpbb\exception\http_exception;
+use phpbb\feed\feed_interface;
+use phpbb\feed\exception\feed_unavailable_exception;
+use phpbb\feed\exception\unauthorized_exception;
+use phpbb\feed\helper as feed_helper;
+use phpbb\controller\helper as controller_helper;
+use phpbb\symfony_request;
+use phpbb\user;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+
+class feed
+{
+	/**
+	 * @var \Twig_Environment
+	 */
+	protected $template;
+
+	/**
+	 * @var symfony_request
+	 */
+	protected $request;
+
+	/**
+	 * @var controller_helper
+	 */
+	protected $controller_helper;
+
+	/**
+	 * @var config
+	 */
+	protected $config;
+
+	/**
+	 * @var driver_interface
+	 */
+	protected $db;
+
+	/**
+	 * @var ContainerInterface
+	 */
+	protected $container;
+
+	/**
+	 * @var feed_helper
+	 */
+	protected $feed_helper;
+
+	/**
+	 * @var user
+	 */
+	protected $user;
+
+	/**
+	 * @var auth
+	 */
+	protected $auth;
+
+	/**
+	 * @var dispatcher_interface
+	 */
+	protected $phpbb_dispatcher;
+
+	/**
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \Twig_Environment $twig
+	 * @param symfony_request $request
+	 * @param controller_helper $controller_helper
+	 * @param config $config
+	 * @param driver_interface $db
+	 * @param ContainerInterface $container
+	 * @param feed_helper $feed_helper
+	 * @param user $user
+	 * @param auth $auth
+	 * @param dispatcher_interface $phpbb_dispatcher
+	 * @param string $php_ext
+	 */
+	public function __construct(\Twig_Environment $twig, symfony_request $request, controller_helper $controller_helper, config $config, driver_interface $db, ContainerInterface $container, feed_helper $feed_helper, user $user, auth $auth, dispatcher_interface $phpbb_dispatcher, $php_ext)
+	{
+		$this->request = $request;
+		$this->controller_helper = $controller_helper;
+		$this->config = $config;
+		$this->db = $db;
+		$this->container = $container;
+		$this->feed_helper = $feed_helper;
+		$this->user = $user;
+		$this->auth = $auth;
+		$this->php_ext = $php_ext;
+		$this->template = $twig;
+		$this->phpbb_dispatcher = $phpbb_dispatcher;
+	}
+
+	/**
+	 * Controller for /feed/forums route
+	 *
+	 * @return Response
+	 *
+	 * @throws http_exception when the feed is disabled
+	 */
+	public function forums()
+	{
+		if (!$this->config['feed_overall_forums'])
+		{
+			$this->send_unavailable();
+		}
+
+		return $this->send_feed($this->container->get('feed.forums'));
+	}
+
+	/**
+	 * Controller for /feed/news route
+	 *
+	 * @return Response
+	 *
+	 * @throws http_exception when the feed is disabled
+	 */
+	public function news()
+	{
+		// Get at least one news forum
+		$sql = 'SELECT forum_id
+					FROM ' . FORUMS_TABLE . '
+					WHERE ' . $this->db->sql_bit_and('forum_options', FORUM_OPTION_FEED_NEWS, '<> 0');
+		$result = $this->db->sql_query_limit($sql, 1, 0, 600);
+		$s_feed_news = (int) $this->db->sql_fetchfield('forum_id');
+		$this->db->sql_freeresult($result);
+
+		if (!$s_feed_news)
+		{
+			$this->send_unavailable();
+		}
+
+		return $this->send_feed($this->container->get('feed.news'));
+	}
+
+	/**
+	 * Controller for /feed/topics route
+	 *
+	 * @return Response
+	 *
+	 * @throws http_exception when the feed is disabled
+	 */
+	public function topics()
+	{
+		if (!$this->config['feed_topics_new'])
+		{
+			$this->send_unavailable();
+		}
+
+		return $this->send_feed($this->container->get('feed.topics'));
+	}
+
+	/**
+	 * Controller for /feed/topics_new route
+	 *
+	 * @return Response
+	 *
+	 * @throws http_exception when the feed is disabled
+	 */
+	public function topics_new()
+	{
+		return $this->topics();
+	}
+
+	/**
+	 * Controller for /feed/topics_active route
+	 *
+	 * @return Response
+	 *
+	 * @throws http_exception when the feed is disabled
+	 */
+	public function topics_active()
+	{
+		if (!$this->config['feed_topics_active'])
+		{
+			$this->send_unavailable();
+		}
+
+		return $this->send_feed($this->container->get('feed.topics_active'));
+	}
+
+	/**
+	 * Controller for /feed/forum/{forum_id} route
+	 *
+	 * @param int $forum_id
+	 *
+	 * @return Response
+	 *
+	 * @throws http_exception when the feed is disabled
+	 */
+	public function forum($forum_id)
+	{
+		if (!$this->config['feed_forum'])
+		{
+			$this->send_unavailable();
+		}
+
+		return $this->send_feed($this->container->get('feed.forum')->set_forum_id($forum_id));
+	}
+
+	/**
+	 * Controller for /feed/topic/{topic_id} route
+	 *
+	 * @param int $topic_id
+	 *
+	 * @return Response
+	 *
+	 * @throws http_exception when the feed is disabled
+	 */
+	public function topic($topic_id)
+	{
+		if (!$this->config['feed_topic'])
+		{
+			$this->send_unavailable();
+		}
+
+		return $this->send_feed($this->container->get('feed.topic')->set_topic_id($topic_id));
+	}
+
+	/**
+	 * Controller for /feed/{mode] route
+	 *
+	 * @return Response
+	 *
+	 * @throws http_exception when the feed is disabled
+	 */
+	public function overall()
+	{
+		if (!$this->config['feed_overall'])
+		{
+			$this->send_unavailable();
+		}
+
+		return $this->send_feed($this->container->get('feed.overall'));
+	}
+
+	/**
+	 * Display a given feed
+	 *
+	 * @param feed_interface $feed
+	 *
+	 * @return Response
+	 */
+	protected function send_feed(feed_interface $feed)
+	{
+		try
+		{
+			return $this->send_feed_do($feed);
+		}
+		catch (feed_unavailable_exception $e)
+		{
+			throw new http_exception(Response::HTTP_NOT_FOUND, $e->getMessage(), $e->get_parameters(), $e);
+		}
+		catch (unauthorized_exception $e)
+		{
+			throw new http_exception(Response::HTTP_FORBIDDEN, $e->getMessage(), $e->get_parameters(), $e);
+		}
+	}
+
+	/**
+	 * Really send the feed
+	 *
+	 * @param feed_interface $feed
+	 *
+	 * @return Response
+	 *
+	 * @throw exception\feed_exception
+	 */
+	protected function send_feed_do(feed_interface $feed)
+	{
+		$feed_updated_time = 0;
+		$item_vars = array();
+
+		$board_url = $this->feed_helper->get_board_url();
+
+		// Open Feed
+		$feed->open();
+
+		// Iterate through items
+		while ($row = $feed->get_item())
+		{
+			/**
+			 * Event to modify the feed row
+			 *
+			 * @event core.feed_modify_feed_row
+			 * @var	int		forum_id	Forum ID
+			 * @var	string	mode		Feeds mode (forums|topics|topics_new|topics_active|news)
+			 * @var	array	row			Array with feed data
+			 * @var	int		topic_id	Topic ID
+			 *
+			 * @since 3.1.10-RC1
+			 */
+			$vars = array('forum_id', 'mode', 'row', 'topic_id');
+			extract($this->phpbb_dispatcher->trigger_event('core.feed_modify_feed_row', compact($vars)));
+
+			// BBCode options to correctly disable urls, smilies, bbcode...
+			if ($feed->get('options') === null)
+			{
+				// Allow all combinations
+				$options = 7;
+
+				if ($feed->get('enable_bbcode') !== null && $feed->get('enable_smilies') !== null && $feed->get('enable_magic_url') !== null)
+				{
+					$options = (($row[$feed->get('enable_bbcode')]) ? OPTION_FLAG_BBCODE : 0) + (($row[$feed->get('enable_smilies')]) ? OPTION_FLAG_SMILIES : 0) + (($row[$feed->get('enable_magic_url')]) ? OPTION_FLAG_LINKS : 0);
+				}
+			}
+			else
+			{
+				$options = $row[$feed->get('options')];
+			}
+
+			$title = (isset($row[$feed->get('title')]) && $row[$feed->get('title')] !== '') ? $row[$feed->get('title')] : ((isset($row[$feed->get('title2')])) ? $row[$feed->get('title2')] : '');
+
+			$published = ($feed->get('published') !== null) ? (int) $row[$feed->get('published')] : 0;
+			$updated = ($feed->get('updated') !== null) ? (int) $row[$feed->get('updated')] : 0;
+
+			$display_attachments = ($this->auth->acl_get('u_download') && $this->auth->acl_get('f_download', $row['forum_id']) && isset($row['post_attachment']) && $row['post_attachment']) ? true : false;
+
+			$item_row = array(
+				'author'		=> ($feed->get('creator') !== null) ? $row[$feed->get('creator')] : '',
+				'published'		=> ($published > 0) ? $this->feed_helper->format_date($published) : '',
+				'updated'		=> ($updated > 0) ? $this->feed_helper->format_date($updated) : '',
+				'link'			=> '',
+				'title'			=> censor_text($title),
+				'category'		=> ($this->config['feed_item_statistics'] && !empty($row['forum_id'])) ? $board_url . '/viewforum.' . $this->php_ext . '?f=' . $row['forum_id'] : '',
+				'category_name'	=> ($this->config['feed_item_statistics'] && isset($row['forum_name'])) ? $row['forum_name'] : '',
+				'description'	=> censor_text($this->feed_helper->generate_content($row[$feed->get('text')], $row[$feed->get('bbcode_uid')], $row[$feed->get('bitfield')], $options, $row['forum_id'], ($display_attachments ? $feed->get_attachments($row['post_id']) : array()))),
+				'statistics'	=> '',
+			);
+
+			// Adjust items, fill link, etc.
+			$feed->adjust_item($item_row, $row);
+
+			$item_vars[] = $item_row;
+
+			$feed_updated_time = max($feed_updated_time, $published, $updated);
+		}
+
+		// If we do not have any items at all, sending the current time is better than sending no time.
+		if (!$feed_updated_time)
+		{
+			$feed_updated_time = time();
+		}
+
+		$feed->close();
+
+		$content = $this->template->render('feed.xml.twig', array(
+			// Some default assignments
+			// FEED_IMAGE is not used (atom)
+			'FEED_IMAGE'			=> '',
+			'SELF_LINK'				=> $this->controller_helper->route($this->request->attributes->get('_route'), $this->request->attributes->get('_route_params'), true, '', UrlGeneratorInterface::ABSOLUTE_URL),
+			'FEED_LINK'				=> $board_url . '/index.' . $this->php_ext,
+			'FEED_TITLE'			=> $this->config['sitename'],
+			'FEED_SUBTITLE'			=> $this->config['site_desc'],
+			'FEED_UPDATED'			=> $this->feed_helper->format_date($feed_updated_time),
+			'FEED_LANG'				=> $this->user->lang['USER_LANG'],
+			'FEED_AUTHOR'			=> $this->config['sitename'],
+
+			// Feed entries
+			'FEED_ROWS'				=> $item_vars,
+		));
+
+		$response = new Response($content);
+		$response->headers->set('Content-Type', 'application/atom+xml');
+		$response->setCharset('UTF-8');
+		$response->setLastModified(new \DateTime('@' . $feed_updated_time));
+
+		if (!empty($this->user->data['is_bot']))
+		{
+			// Let reverse proxies know we detected a bot.
+			$response->headers->set('X-PHPBB-IS-BOT', 'yes');
+		}
+
+		return $response;
+	}
+
+	/**
+	 * Throw and exception saying that the feed isn't available
+	 *
+	 * @throw http_exception
+	 */
+	protected function send_unavailable()
+	{
+		throw new http_exception(404, 'FEATURE_NOT_AVAILABLE');
+	}
+}
--- /dev/null
+++ b/phpbb/feed/exception/feed_exception.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\feed\exception;
+
+use phpbb\exception\runtime_exception;
+
+abstract class feed_exception extends runtime_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/feed/exception/feed_unavailable_exception.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\feed\exception;
+
+abstract class feed_unavailable_exception extends feed_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/feed/exception/no_feed_exception.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\feed\exception;
+
+class no_feed_exception extends feed_unavailable_exception
+{
+	public function __construct(\Exception $previous = null, $code = 0)
+	{
+		parent::__construct('NO_FEED', array(), $previous, $code);
+	}
+}
--- /dev/null
+++ b/phpbb/feed/exception/no_forum_exception.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\feed\exception;
+
+class no_forum_exception extends feed_unavailable_exception
+{
+	public function __construct($forum_id, \Exception $previous = null, $code = 0)
+	{
+		parent::__construct('NO_FORUM', array($forum_id), $previous, $code);
+	}
+}
--- /dev/null
+++ b/phpbb/feed/exception/no_topic_exception.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\feed\exception;
+
+class no_topic_exception extends feed_unavailable_exception
+{
+	public function __construct($topic_id, \Exception $previous = null, $code = 0)
+	{
+		parent::__construct('NO_TOPIC', array($topic_id), $previous, $code);
+	}
+}
--- /dev/null
+++ b/phpbb/feed/exception/unauthorized_exception.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\feed\exception;
+
+abstract class unauthorized_exception extends feed_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/feed/exception/unauthorized_forum_exception.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\feed\exception;
+
+class unauthorized_forum_exception extends unauthorized_exception
+{
+	public function __construct($forum_id, \Exception $previous = null, $code = 0)
+	{
+		parent::__construct('SORRY_AUTH_READ', array($forum_id), $previous, $code);
+	}
+}
--- /dev/null
+++ b/phpbb/feed/exception/unauthorized_topic_exception.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\feed\exception;
+
+class unauthorized_topic_exception extends unauthorized_exception
+{
+	public function __construct($topic_id, \Exception $previous = null, $code = 0)
+	{
+		parent::__construct('SORRY_AUTH_READ_TOPIC', array($topic_id), $previous, $code);
+	}
+}
--- /dev/null
+++ b/phpbb/feed/feed_interface.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\feed;
+
+/**
+ * Interface implemented by all feeds types
+ */
+interface feed_interface
+{
+	/**
+	 * Set keys.
+	 */
+	public function set_keys();
+
+	/**
+	 * Open feed
+	 */
+	public function open();
+
+	/**
+	 * Close feed
+	 */
+	public function close();
+
+	/**
+	 * Set key
+	 *
+	 * @param string $key Key
+	 * @param mixed $value Value
+	 */
+	public function set($key, $value);
+
+	/**
+	 * Get key
+	 *
+	 * @param string $key Key
+	 * @return mixed
+	 */
+	public function get($key);
+
+	/**
+	 * Get the next post in the feed
+	 *
+	 * @return array
+	 */
+	public function get_item();
+
+	/**
+	 * Adjust a feed entry
+	 *
+	 * @param $item_row
+	 * @param $row
+	 * @return array
+	 */
+	public function adjust_item(&$item_row, &$row);
+}
--- a/phpbb/feed/forum.php
+++ b/phpbb/feed/forum.php
@@ -1,35 +1,39 @@
 <?php
 /**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
 
 namespace phpbb\feed;
 
+use phpbb\feed\exception\no_feed_exception;
+use phpbb\feed\exception\no_forum_exception;
+use phpbb\feed\exception\unauthorized_forum_exception;
+
 /**
-* Forum feed
-*
-* This will give you the last {$this->num_items} posts made
-* within a specific forum.
-*/
-class forum extends \phpbb\feed\post_base
+ * Forum feed
+ *
+ * This will give you the last {$this->num_items} posts made
+ * within a specific forum.
+ */
+class forum extends post_base
 {
-	var $forum_id		= 0;
-	var $forum_data		= array();
+	protected $forum_id		= 0;
+	protected $forum_data	= array();
 
 	/**
-	* Set the Forum ID
-	*
-	* @param int	$forum_id			Forum ID
-	* @return	\phpbb\feed\forum
-	*/
+	 * Set the Forum ID
+	 *
+	 * @param int	$forum_id			Forum ID
+	 * @return	\phpbb\feed\forum
+	 */
 	public function set_forum_id($forum_id)
 	{
 		$this->forum_id = (int) $forum_id;
@@ -37,7 +41,10 @@ class forum extends \phpbb\feed\post_base
 		return $this;
 	}
 
-	function open()
+	/**
+	 * {@inheritdoc}
+	 */
+	public function open()
 	{
 		// Check if forum exists
 		$sql = 'SELECT forum_id, forum_name, forum_password, forum_type, forum_options
@@ -49,25 +56,33 @@ class forum extends \phpbb\feed\post_base
 
 		if (empty($this->forum_data))
 		{
-			trigger_error('NO_FORUM');
+			throw new no_forum_exception($this->forum_id);
 		}
 
 		// Forum needs to be postable
 		if ($this->forum_data['forum_type'] != FORUM_POST)
 		{
-			trigger_error('NO_FEED');
+			throw new no_feed_exception();
 		}
 
 		// Make sure forum is not excluded from feed
 		if (phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $this->forum_data['forum_options']))
 		{
-			trigger_error('NO_FEED');
+			throw new no_feed_exception();
 		}
 
 		// Make sure we can read this forum
 		if (!$this->auth->acl_get('f_read', $this->forum_id))
 		{
-			trigger_error('SORRY_AUTH_READ');
+			if ($this->user->data['user_id'] != ANONYMOUS)
+			{
+				send_status_line(403, 'Forbidden');
+			}
+			else
+			{
+				send_status_line(401, 'Unauthorized');
+			}
+			throw new unauthorized_forum_exception($this->forum_id);
 		}
 
 		// Make sure forum is not passworded or user is authed
@@ -77,7 +92,15 @@ class forum extends \phpbb\feed\post_base
 
 			if (isset($forum_ids_passworded[$this->forum_id]))
 			{
-				trigger_error('SORRY_AUTH_READ');
+				if ($this->user->data['user_id'] != ANONYMOUS)
+				{
+					send_status_line(403, 'Forbidden');
+				}
+				else
+				{
+					send_status_line(401, 'Unauthorized');
+				}
+				throw new unauthorized_forum_exception($this->forum_id);
 			}
 
 			unset($forum_ids_passworded);
@@ -86,7 +109,10 @@ class forum extends \phpbb\feed\post_base
 		parent::open();
 	}
 
-	function get_sql()
+	/**
+	 * {@inheritdoc}
+	 */
+	protected function get_sql()
 	{
 		// Determine topics with recent activity
 		$sql = 'SELECT topic_id, topic_last_post_time
@@ -112,9 +138,11 @@ class forum extends \phpbb\feed\post_base
 			return false;
 		}
 
+		parent::fetch_attachments(array(), $topic_ids);
+
 		$this->sql = array(
 			'SELECT'	=>	'p.post_id, p.topic_id, p.post_time, p.post_edit_time, p.post_visibility, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.post_attachment, ' .
-							'u.username, u.user_id',
+				'u.username, u.user_id',
 			'FROM'		=> array(
 				POSTS_TABLE		=> 'p',
 				USERS_TABLE		=> 'u',
@@ -129,7 +157,10 @@ class forum extends \phpbb\feed\post_base
 		return true;
 	}
 
-	function adjust_item(&$item_row, &$row)
+	/**
+	 * {@inheritdoc}
+	 */
+	public function adjust_item(&$item_row, &$row)
 	{
 		parent::adjust_item($item_row, $row);
 
@@ -137,7 +168,10 @@ class forum extends \phpbb\feed\post_base
 		$item_row['forum_id'] = $this->forum_id;
 	}
 
-	function get_item()
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_item()
 	{
 		return ($row = parent::get_item()) ? array_merge($this->forum_data, $row) : $row;
 	}
--- a/phpbb/feed/forums.php
+++ b/phpbb/feed/forums.php
@@ -1,29 +1,32 @@
 <?php
 /**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
 
 namespace phpbb\feed;
 
 /**
-* 'All Forums' feed
-*
-* This will give you a list of all postable forums where feeds are enabled
-* including forum description, topic stats and post stats
-*/
-class forums extends \phpbb\feed\base
+ * 'All Forums' feed
+ *
+ * This will give you a list of all postable forums where feeds are enabled
+ * including forum description, topic stats and post stats
+ */
+class forums extends base
 {
-	var $num_items	= 0;
+	protected $num_items	= 0;
 
-	function set_keys()
+	/**
+	 * {@inheritdoc}
+	 */
+	public function set_keys()
 	{
 		$this->set('title',		'forum_name');
 		$this->set('text',		'forum_desc');
@@ -33,7 +36,10 @@ class forums extends \phpbb\feed\base
 		$this->set('options',	'forum_desc_options');
 	}
 
-	function get_sql()
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_sql()
 	{
 		$in_fid_ary = array_diff($this->get_readable_forums(), $this->get_excluded_forums());
 		if (empty($in_fid_ary))
@@ -55,7 +61,10 @@ class forums extends \phpbb\feed\base
 		return true;
 	}
 
-	function adjust_item(&$item_row, &$row)
+	/**
+	 * {@inheritdoc}
+	 */
+	public function adjust_item(&$item_row, &$row)
 	{
 		$item_row['link'] = $this->helper->append_sid('viewforum.' . $this->phpEx, 'f=' . $row['forum_id']);
 
--- a/phpbb/feed/helper.php
+++ b/phpbb/feed/helper.php
@@ -1,21 +1,21 @@
 <?php
 /**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
 
 namespace phpbb\feed;
 
 /**
-* Class with some helpful functions used in feeds
-*/
+ * Class with some helpful functions used in feeds
+ */
 class helper
 {
 	/** @var \phpbb\config\config */
@@ -31,13 +31,13 @@ class helper
 	protected $phpEx;
 
 	/**
-	* Constructor
-	*
-	* @param	\phpbb\config\config	$config		Config object
-	* @param	\phpbb\user		$user		User object
-	* @param	string	$phpbb_root_path	Root path
-	* @param	string	$phpEx				PHP file extension
-	*/
+	 * Constructor
+	 *
+	 * @param	\phpbb\config\config	$config		Config object
+	 * @param	\phpbb\user		$user		User object
+	 * @param	string	$phpbb_root_path	Root path
+	 * @param	string	$phpEx				PHP file extension
+	 */
 	public function __construct(\phpbb\config\config $config, \phpbb\user $user, $phpbb_root_path, $phpEx)
 	{
 		$this->config = $config;
@@ -47,8 +47,8 @@ class helper
 	}
 
 	/**
-	* Run links through append_sid(), prepend generate_board_url() and remove session id
-	*/
+	 * Run links through append_sid(), prepend generate_board_url() and remove session id
+	 */
 	public function get_board_url()
 	{
 		static $board_url;
@@ -62,16 +62,16 @@ class helper
 	}
 
 	/**
-	* Run links through append_sid(), prepend generate_board_url() and remove session id
-	*/
+	 * Run links through append_sid(), prepend generate_board_url() and remove session id
+	 */
 	public function append_sid($url, $params)
 	{
 		return append_sid($this->get_board_url() . '/' . $url, $params, true, '');
 	}
 
 	/**
-	* Generate ISO 8601 date string (RFC 3339)
-	*/
+	 * Generate ISO 8601 date string (RFC 3339)
+	 */
 	public function format_date($time)
 	{
 		static $zone_offset;
@@ -87,16 +87,16 @@ class helper
 	}
 
 	/**
-	* Generate text content
-	*
-	* @param string $content is feed text content
-	* @param string $uid is bbcode_uid
-	* @param string $bitfield is bbcode bitfield
-	* @param int $options bbcode flag options
-	* @param int $forum_id is the forum id
-	* @param array $post_attachments is an array containing the attachments and their respective info
-	* @return string the html content to be printed for the feed
-	*/
+	 * Generate text content
+	 *
+	 * @param string $content is feed text content
+	 * @param string $uid is bbcode_uid
+	 * @param string $bitfield is bbcode bitfield
+	 * @param int $options bbcode flag options
+	 * @param int $forum_id is the forum id
+	 * @param array $post_attachments is an array containing the attachments and their respective info
+	 * @return string the html content to be printed for the feed
+	 */
 	public function generate_content($content, $uid, $bitfield, $options, $forum_id, $post_attachments)
 	{
 		if (empty($content))
@@ -122,16 +122,16 @@ class helper
 		// Firefox does not support CSS for feeds, though
 
 		// Remove font sizes
-	//	$content = preg_replace('#<span style="font-size: [0-9]+%; line-height: [0-9]+%;">([^>]+)</span>#iU', '\1', $content);
+		//	$content = preg_replace('#<span style="font-size: [0-9]+%; line-height: [0-9]+%;">([^>]+)</span>#iU', '\1', $content);
 
 		// Make text strong :P
-	//	$content = preg_replace('#<span style="font-weight: bold?">(.*?)</span>#iU', '<strong>\1</strong>', $content);
+		//	$content = preg_replace('#<span style="font-weight: bold?">(.*?)</span>#iU', '<strong>\1</strong>', $content);
 
 		// Italic
-	//	$content = preg_replace('#<span style="font-style: italic?">([^<]+)</span>#iU', '<em>\1</em>', $content);
+		//	$content = preg_replace('#<span style="font-style: italic?">([^<]+)</span>#iU', '<em>\1</em>', $content);
 
 		// Underline
-	//	$content = preg_replace('#<span style="text-decoration: underline?">([^<]+)</span>#iU', '<u>\1</u>', $content);
+		//	$content = preg_replace('#<span style="text-decoration: underline?">([^<]+)</span>#iU', '<u>\1</u>', $content);
 
 		// Remove embed Windows Media Streams
 		$content	= preg_replace( '#<\!--\[if \!IE\]>-->([^[]+)<\!--<!\[endif\]-->#si', '', $content);
--- a/phpbb/feed/news.php
+++ b/phpbb/feed/news.php
@@ -1,27 +1,31 @@
 <?php
 /**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
 
 namespace phpbb\feed;
 
 /**
-* News feed
-*
-* This will give you {$this->num_items} first posts
-* of all topics in the selected news forums.
-*/
-class news extends \phpbb\feed\topic_base
+ * News feed
+ *
+ * This will give you {$this->num_items} first posts
+ * of all topics in the selected news forums.
+ */
+class news extends topic_base
 {
-	function get_news_forums()
+	/**
+	 * Returns the ids of the 'news forums'
+	 * @return int[]
+	 */
+	private function get_news_forums()
 	{
 		static $forum_ids;
 
@@ -48,7 +52,10 @@ class news extends \phpbb\feed\topic_base
 		return $forum_ids;
 	}
 
-	function get_sql()
+	/**
+	 * {@inheritdoc}
+	 */
+	protected function get_sql()
 	{
 		// Determine forum ids
 		$in_fid_ary = array_intersect($this->get_news_forums(), $this->get_readable_forums());
@@ -83,6 +90,8 @@ class news extends \phpbb\feed\topic_base
 			return false;
 		}
 
+		parent::fetch_attachments($post_ids);
+
 		$this->sql = array(
 			'SELECT'	=> 'f.forum_id, f.forum_name,
 							t.topic_id, t.topic_title, t.topic_poster, t.topic_first_poster_name, t.topic_posts_approved, t.topic_posts_unapproved, t.topic_posts_softdeleted, t.topic_views, t.topic_time, t.topic_last_post_time,
--- a/phpbb/feed/overall.php
+++ b/phpbb/feed/overall.php
@@ -1,27 +1,30 @@
 <?php
 /**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
 
 namespace phpbb\feed;
 
 /**
-* Board wide feed (aka overall feed)
-*
-* This will give you the newest {$this->num_items} posts
-* from the whole board.
-*/
-class overall extends \phpbb\feed\post_base
+ * Board wide feed (aka overall feed)
+ *
+ * This will give you the newest {$this->num_items} posts
+ * from the whole board.
+ */
+class overall extends post_base
 {
-	function get_sql()
+	/**
+	 * {@inheritdoc}
+	 */
+	protected function get_sql()
 	{
 		$forum_ids = array_diff($this->get_readable_forums(), $this->get_excluded_forums(), $this->get_passworded_forums());
 		if (empty($forum_ids))
@@ -52,11 +55,13 @@ class overall extends \phpbb\feed\post_base
 			return false;
 		}
 
+		parent::fetch_attachments(array(), $topic_ids);
+
 		// Get the actual data
 		$this->sql = array(
 			'SELECT'	=>	'f.forum_id, f.forum_name, ' .
-							'p.post_id, p.topic_id, p.post_time, p.post_edit_time, p.post_visibility, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.post_attachment, ' .
-							'u.username, u.user_id',
+				'p.post_id, p.topic_id, p.post_time, p.post_edit_time, p.post_visibility, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.post_attachment, ' .
+				'u.username, u.user_id',
 			'FROM'		=> array(
 				USERS_TABLE		=> 'u',
 				POSTS_TABLE		=> 'p',
@@ -77,7 +82,10 @@ class overall extends \phpbb\feed\post_base
 		return true;
 	}
 
-	function adjust_item(&$item_row, &$row)
+	/**
+	 * {@inheritdoc}
+	 */
+	public function adjust_item(&$item_row, &$row)
 	{
 		parent::adjust_item($item_row, $row);
 
--- a/phpbb/feed/post_base.php
+++ b/phpbb/feed/post_base.php
@@ -1,27 +1,29 @@
 <?php
 /**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
 
 namespace phpbb\feed;
 
 /**
-* Abstract class for post based feeds
-*/
-abstract class post_base extends \phpbb\feed\attachments_base
+ * Abstract class for post based feeds
+ */
+abstract class post_base extends attachments_base
 {
-	var $num_items = 'feed_limit_post';
-	var $attachments = array();
+	protected $num_items = 'feed_limit_post';
 
-	function set_keys()
+	/**
+	 * {@inheritdoc}
+	 */
+	public function set_keys()
 	{
 		$this->set('title',		'post_subject');
 		$this->set('title2',	'topic_title');
@@ -40,7 +42,10 @@ abstract class post_base extends \phpbb\feed\attachments_base
 		$this->set('enable_magic_url',	'enable_magic_url');
 	}
 
-	function adjust_item(&$item_row, &$row)
+	/**
+	 * {@inheritdoc}
+	 */
+	public function adjust_item(&$item_row, &$row)
 	{
 		$item_row['link'] = $this->helper->append_sid('viewtopic.' . $this->phpEx, "t={$row['topic_id']}&amp;p={$row['post_id']}#p{$row['post_id']}");
 
--- a/phpbb/feed/topic.php
+++ b/phpbb/feed/topic.php
@@ -1,35 +1,40 @@
 <?php
 /**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
 
 namespace phpbb\feed;
 
+use phpbb\feed\exception\no_feed_exception;
+use phpbb\feed\exception\no_topic_exception;
+use phpbb\feed\exception\unauthorized_forum_exception;
+use phpbb\feed\exception\unauthorized_topic_exception;
+
 /**
-* Topic feed for a specific topic
-*
-* This will give you the last {$this->num_items} posts made within this topic.
-*/
-class topic extends \phpbb\feed\post_base
+ * Topic feed for a specific topic
+ *
+ * This will give you the last {$this->num_items} posts made within this topic.
+ */
+class topic extends post_base
 {
-	var $topic_id		= 0;
-	var $forum_id		= 0;
-	var $topic_data		= array();
+	protected $topic_id		= 0;
+	protected $forum_id		= 0;
+	protected $topic_data	= array();
 
 	/**
-	* Set the Topic ID
-	*
-	* @param int	$topic_id			Topic ID
-	* @return	\phpbb\feed\topic
-	*/
+	 * Set the Topic ID
+	 *
+	 * @param int	$topic_id			Topic ID
+	 * @return	\phpbb\feed\topic
+	 */
 	public function set_topic_id($topic_id)
 	{
 		$this->topic_id = (int) $topic_id;
@@ -37,7 +42,10 @@ class topic extends \phpbb\feed\post_base
 		return $this;
 	}
 
-	function open()
+	/**
+	 * {@inheritdoc}
+	 */
+	public function open()
 	{
 		$sql = 'SELECT f.forum_options, f.forum_password, t.topic_id, t.forum_id, t.topic_visibility, t.topic_title, t.topic_time, t.topic_views, t.topic_posts_approved, t.topic_type
 			FROM ' . TOPICS_TABLE . ' t
@@ -50,7 +58,7 @@ class topic extends \phpbb\feed\post_base
 
 		if (empty($this->topic_data))
 		{
-			trigger_error('NO_TOPIC');
+			throw new no_topic_exception($this->topic_id);
 		}
 
 		$this->forum_id = (int) $this->topic_data['forum_id'];
@@ -58,19 +66,35 @@ class topic extends \phpbb\feed\post_base
 		// Make sure topic is either approved or user authed
 		if ($this->topic_data['topic_visibility'] != ITEM_APPROVED && !$this->auth->acl_get('m_approve', $this->forum_id))
 		{
-			trigger_error('SORRY_AUTH_READ');
+			if ($this->user->data['user_id'] != ANONYMOUS)
+			{
+				send_status_line(403, 'Forbidden');
+			}
+			else
+			{
+				send_status_line(401, 'Unauthorized');
+			}
+			throw new unauthorized_topic_exception($this->topic_id);
 		}
 
 		// Make sure forum is not excluded from feed
 		if (phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $this->topic_data['forum_options']))
 		{
-			trigger_error('NO_FEED');
+			throw new no_feed_exception();
 		}
 
 		// Make sure we can read this forum
 		if (!$this->auth->acl_get('f_read', $this->forum_id))
 		{
-			trigger_error('SORRY_AUTH_READ');
+			if ($this->user->data['user_id'] != ANONYMOUS)
+			{
+				send_status_line(403, 'Forbidden');
+			}
+			else
+			{
+				send_status_line(401, 'Unauthorized');
+			}
+			throw new unauthorized_forum_exception($this->forum_id);
 		}
 
 		// Make sure forum is not passworded or user is authed
@@ -80,7 +104,15 @@ class topic extends \phpbb\feed\post_base
 
 			if (isset($forum_ids_passworded[$this->forum_id]))
 			{
-				trigger_error('SORRY_AUTH_READ');
+				if ($this->user->data['user_id'] != ANONYMOUS)
+				{
+					send_status_line(403, 'Forbidden');
+				}
+				else
+				{
+					send_status_line(401, 'Unauthorized');
+				}
+				throw new unauthorized_forum_exception($this->forum_id);
 			}
 
 			unset($forum_ids_passworded);
@@ -89,11 +121,16 @@ class topic extends \phpbb\feed\post_base
 		parent::open();
 	}
 
-	function get_sql()
+	/**
+	 * {@inheritdoc}
+	 */
+	protected function get_sql()
 	{
+		parent::fetch_attachments();
+
 		$this->sql = array(
 			'SELECT'	=>	'p.post_id, p.post_time, p.post_edit_time, p.post_visibility, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.post_attachment, ' .
-							'u.username, u.user_id',
+				'u.username, u.user_id',
 			'FROM'		=> array(
 				POSTS_TABLE		=> 'p',
 				USERS_TABLE		=> 'u',
@@ -107,14 +144,20 @@ class topic extends \phpbb\feed\post_base
 		return true;
 	}
 
-	function adjust_item(&$item_row, &$row)
+	/**
+	 * {@inheritdoc}
+	 */
+	public function adjust_item(&$item_row, &$row)
 	{
 		parent::adjust_item($item_row, $row);
 
 		$item_row['forum_id'] = $this->forum_id;
 	}
 
-	function get_item()
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_item()
 	{
 		return ($row = parent::get_item()) ? array_merge($this->topic_data, $row) : $row;
 	}
--- a/phpbb/feed/topic_base.php
+++ b/phpbb/feed/topic_base.php
@@ -1,26 +1,29 @@
 <?php
 /**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
 
 namespace phpbb\feed;
 
 /**
-* Abstract class for topic based feeds
-*/
-abstract class topic_base extends \phpbb\feed\attachments_base
+ * Abstract class for topic based feeds
+ */
+abstract class topic_base extends attachments_base
 {
-	var $num_items = 'feed_limit_topic';
+	protected $num_items = 'feed_limit_topic';
 
-	function set_keys()
+	/**
+	 * {@inheritdoc}
+	 */
+	public function set_keys()
 	{
 		$this->set('title',		'topic_title');
 		$this->set('title2',	'forum_name');
@@ -39,7 +42,10 @@ abstract class topic_base extends \phpbb\feed\attachments_base
 		$this->set('enable_magic_url',	'enable_magic_url');
 	}
 
-	function adjust_item(&$item_row, &$row)
+	/**
+	 * {@inheritdoc}
+	 */
+	public function adjust_item(&$item_row, &$row)
 	{
 		$item_row['link'] = $this->helper->append_sid('viewtopic.' . $this->phpEx, 't=' . $row['topic_id'] . '&amp;p=' . $row['post_id'] . '#p' . $row['post_id']);
 
--- a/phpbb/feed/topics.php
+++ b/phpbb/feed/topics.php
@@ -1,27 +1,30 @@
 <?php
 /**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
 
 namespace phpbb\feed;
 
 /**
-* New Topics feed
-*
-* This will give you the last {$this->num_items} created topics
-* including the first post.
-*/
-class topics extends \phpbb\feed\topic_base
+ * New Topics feed
+ *
+ * This will give you the last {$this->num_items} created topics
+ * including the first post.
+ */
+class topics extends topic_base
 {
-	function get_sql()
+	/**
+	 * {@inheritdoc}
+	 */
+	protected function get_sql()
 	{
 		$forum_ids_read = $this->get_readable_forums();
 		if (empty($forum_ids_read))
@@ -55,6 +58,8 @@ class topics extends \phpbb\feed\topic_base
 			return false;
 		}
 
+		parent::fetch_attachments($post_ids);
+
 		$this->sql = array(
 			'SELECT'	=> 'f.forum_id, f.forum_name,
 							t.topic_id, t.topic_title, t.topic_poster, t.topic_first_poster_name, t.topic_posts_approved, t.topic_posts_unapproved, t.topic_posts_softdeleted, t.topic_views, t.topic_time, t.topic_last_post_time,
@@ -77,7 +82,10 @@ class topics extends \phpbb\feed\topic_base
 		return true;
 	}
 
-	function adjust_item(&$item_row, &$row)
+	/**
+	 * {@inheritdoc}
+	 */
+	public function adjust_item(&$item_row, &$row)
 	{
 		parent::adjust_item($item_row, $row);
 
--- a/phpbb/feed/topics_active.php
+++ b/phpbb/feed/topics_active.php
@@ -1,30 +1,33 @@
 <?php
 /**
-*
-* This file is part of the phpBB Forum Software package.
-*
-* @copyright (c) phpBB Limited <https://www.phpbb.com>
-* @license GNU General Public License, version 2 (GPL-2.0)
-*
-* For full copyright and license information, please see
-* the docs/CREDITS.txt file.
-*
-*/
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
 
 namespace phpbb\feed;
 
 /**
-* Active Topics feed
-*
-* This will give you the last {$this->num_items} topics
-* with replies made withing the last {$this->sort_days} days
-* including the last post.
-*/
-class topics_active extends \phpbb\feed\topic_base
+ * Active Topics feed
+ *
+ * This will give you the last {$this->num_items} topics
+ * with replies made withing the last {$this->sort_days} days
+ * including the last post.
+ */
+class topics_active extends topic_base
 {
-	var $sort_days = 7;
+	protected $sort_days = 7;
 
-	function set_keys()
+	/**
+	 * {@inheritdoc}
+	 */
+	public function set_keys()
 	{
 		parent::set_keys();
 
@@ -32,7 +35,10 @@ class topics_active extends \phpbb\feed\topic_base
 		$this->set('creator',	'topic_last_poster_name');
 	}
 
-	function get_sql()
+	/**
+	 * {@inheritdoc}
+	 */
+	protected function get_sql()
 	{
 		$forum_ids_read = $this->get_readable_forums();
 		if (empty($forum_ids_read))
@@ -71,6 +77,8 @@ class topics_active extends \phpbb\feed\topic_base
 			return false;
 		}
 
+		parent::fetch_attachments($post_ids);
+
 		$this->sql = array(
 			'SELECT'	=> 'f.forum_id, f.forum_name,
 							t.topic_id, t.topic_title, t.topic_posts_approved, t.topic_posts_unapproved, t.topic_posts_softdeleted, t.topic_views,
@@ -94,7 +102,12 @@ class topics_active extends \phpbb\feed\topic_base
 		return true;
 	}
 
-	function get_forum_ids()
+	/**
+	 * Returns the ids of the forums not excluded from the active list
+	 *
+	 * @return int[]
+	 */
+	private function get_forum_ids()
 	{
 		static $forum_ids;
 
@@ -122,7 +135,10 @@ class topics_active extends \phpbb\feed\topic_base
 		return $forum_ids;
 	}
 
-	function adjust_item(&$item_row, &$row)
+	/**
+	 * {@inheritdoc}
+	 */
+	public function adjust_item(&$item_row, &$row)
 	{
 		parent::adjust_item($item_row, $row);
 
--- /dev/null
+++ b/phpbb/files/factory.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\files;
+
+class factory
+{
+	/**
+	 * @var \Symfony\Component\DependencyInjection\ContainerInterface
+	 */
+	private $container;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
+	 */
+	public function __construct(\Symfony\Component\DependencyInjection\ContainerInterface $container)
+	{
+		$this->container = $container;
+	}
+
+	/**
+	 * Get files service
+	 *
+	 * @param string $name Service name
+	 *
+	 * @return object|bool Requested service or false if service could not be
+	 *				found by the container
+	 */
+	public function get($name)
+	{
+		$service = false;
+
+		$name = (strpos($name, '.') === false) ? 'files.' . $name : $name;
+
+		try
+		{
+			$service = $this->container->get($name);
+		}
+		catch (\Exception $e)
+		{
+			// do nothing
+		}
+
+		return $service;
+	}
+}
--- /dev/null
+++ b/phpbb/files/filespec.php
@@ -0,0 +1,584 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\files;
+
+use phpbb\language\language;
+
+/**
+ * Responsible for holding all file relevant information, as well as doing file-specific operations.
+ * The {@link fileupload fileupload class} can be used to upload several files, each of them being this object to operate further on.
+ */
+class filespec
+{
+	/** @var string File name */
+	protected $filename = '';
+
+	/** @var string Real name of file */
+	protected $realname = '';
+
+	/** @var string Upload name of file */
+	protected $uploadname = '';
+
+	/** @var string Mimetype of file */
+	protected $mimetype = '';
+
+	/** @var string File extension */
+	protected $extension = '';
+
+	/** @var int File size */
+	protected $filesize = 0;
+
+	/** @var int Width of file */
+	protected $width = 0;
+
+	/** @var int Height of file */
+	protected $height = 0;
+
+	/** @var array Image info including type and size */
+	protected $image_info = array();
+
+	/** @var string Destination file name */
+	protected $destination_file = '';
+
+	/** @var string Destination file path */
+	protected $destination_path = '';
+
+	/** @var bool Whether file was moved */
+	protected $file_moved = false;
+
+	/** @var bool Whether file is local */
+	protected $local = false;
+
+	/** @var bool Class initialization flag */
+	protected $class_initialized = false;
+
+	/** @var array Error array */
+	public $error = array();
+
+	/** @var upload Instance of upload class  */
+	public $upload;
+
+	/** @var \phpbb\filesystem\filesystem_interface */
+	protected $filesystem;
+
+	/** @var \bantu\IniGetWrapper\IniGetWrapper ini_get() wrapper class */
+	protected $php_ini;
+
+	/** @var \FastImageSize\FastImageSize */
+	protected $imagesize;
+
+	/** @var language Language class */
+	protected $language;
+
+	/** @var string phpBB root path */
+	protected $phpbb_root_path;
+
+	/** @var \phpbb\plupload\plupload The plupload object */
+	protected $plupload;
+
+	/** @var \phpbb\mimetype\guesser phpBB Mimetype guesser */
+	protected $mimetype_guesser;
+
+	/**
+	 * File upload class
+	 *
+	 * @param \phpbb\filesystem\filesystem_interface	$phpbb_filesystem Filesystem
+	 * @param language					$language Language
+	 * @param \bantu\IniGetWrapper\IniGetWrapper			$php_ini ini_get() wrapper
+	 * @param \FastImageSize\FastImageSize $imagesize Imagesize class
+	 * @param string					$phpbb_root_path phpBB root path
+	 * @param \phpbb\mimetype\guesser	$mimetype_guesser Mime type guesser
+	 * @param \phpbb\plupload\plupload	$plupload Plupload
+	 */
+	public function __construct(\phpbb\filesystem\filesystem_interface $phpbb_filesystem, language $language, \bantu\IniGetWrapper\IniGetWrapper $php_ini, \FastImageSize\FastImageSize $imagesize, $phpbb_root_path, \phpbb\mimetype\guesser $mimetype_guesser = null, \phpbb\plupload\plupload $plupload = null)
+	{
+		$this->filesystem = $phpbb_filesystem;
+		$this->language = $language;
+		$this->php_ini = $php_ini;
+		$this->imagesize = $imagesize;
+		$this->phpbb_root_path = $phpbb_root_path;
+		$this->plupload = $plupload;
+		$this->mimetype_guesser = $mimetype_guesser;
+	}
+
+	/**
+	 * Set upload ary
+	 *
+	 * @param array $upload_ary Upload ary
+	 *
+	 * @return filespec This instance of the filespec class
+	 */
+	public function set_upload_ary($upload_ary)
+	{
+		if (!isset($upload_ary) || !sizeof($upload_ary))
+		{
+			return $this;
+		}
+
+		$this->class_initialized = true;
+		$this->filename = $upload_ary['tmp_name'];
+		$this->filesize = $upload_ary['size'];
+		$name = (STRIP) ? stripslashes($upload_ary['name']) : $upload_ary['name'];
+		$name = trim(utf8_basename($name));
+		$this->realname = $this->uploadname = $name;
+		$this->mimetype = $upload_ary['type'];
+
+		// Opera adds the name to the mime type
+		$this->mimetype	= (strpos($this->mimetype, '; name') !== false) ? str_replace(strstr($this->mimetype, '; name'), '', $this->mimetype) : $this->mimetype;
+
+		if (!$this->mimetype)
+		{
+			$this->mimetype = 'application/octet-stream';
+		}
+
+		$this->extension = strtolower(self::get_extension($this->realname));
+
+		// Try to get real filesize from temporary folder (not always working) ;)
+		$this->filesize = ($this->get_filesize($this->filename)) ?: $this->filesize;
+
+		$this->width = $this->height = 0;
+		$this->file_moved = false;
+
+		$this->local = (isset($upload_ary['local_mode'])) ? true : false;
+
+		return $this;
+	}
+
+	/**
+	 * Set the upload namespace
+	 *
+	 * @param upload $namespace Instance of upload class
+	 *
+	 * @return filespec This instance of the filespec class
+	 */
+	public function set_upload_namespace($namespace)
+	{
+		$this->upload = $namespace;
+
+		return $this;
+	}
+
+	/**
+	 * Check if class members were not properly initialised yet
+	 *
+	 * @return bool True if there was an init error, false if not
+	 */
+	public function init_error()
+	{
+		return !$this->class_initialized;
+	}
+
+	/**
+	 * Set error in error array
+	 *
+	 * @param mixed $error Content for error array
+	 *
+	 * @return \phpbb\files\filespec This instance of the filespec class
+	 */
+	public function set_error($error)
+	{
+		$this->error[] = $error;
+
+		return $this;
+	}
+
+	/**
+	 * Cleans destination filename
+	 *
+	 * @param string $mode Either real, unique, or unique_ext. Real creates a
+	 *				realname, filtering some characters, lowering every
+	 *				character. Unique creates a unique filename.
+	 * @param string $prefix Prefix applied to filename
+	 * @param string $user_id The user_id is only needed for when cleaning a user's avatar
+	 */
+	public function clean_filename($mode = 'unique', $prefix = '', $user_id = '')
+	{
+		if ($this->init_error())
+		{
+			return;
+		}
+
+		switch ($mode)
+		{
+			case 'real':
+				// Remove every extension from filename (to not let the mime bug being exposed)
+				if (strpos($this->realname, '.') !== false)
+				{
+					$this->realname = substr($this->realname, 0, strpos($this->realname, '.'));
+				}
+
+				// Replace any chars which may cause us problems with _
+				$bad_chars = array("'", "\\", ' ', '/', ':', '*', '?', '"', '<', '>', '|');
+
+				$this->realname = rawurlencode(str_replace($bad_chars, '_', strtolower($this->realname)));
+				$this->realname = preg_replace("/%(\w{2})/", '_', $this->realname);
+
+				$this->realname = $prefix . $this->realname . '.' . $this->extension;
+			break;
+
+			case 'unique':
+				$this->realname = $prefix . md5(unique_id());
+			break;
+
+			case 'avatar':
+				$this->extension = strtolower($this->extension);
+				$this->realname = $prefix . $user_id . '.' . $this->extension;
+
+			break;
+
+			case 'unique_ext':
+			default:
+				$this->realname = $prefix . md5(unique_id()) . '.' . $this->extension;
+		}
+	}
+
+	/**
+	 * Get property from file object
+	 *
+	 * @param string $property Name of property
+	 *
+	 * @return mixed Content of property
+	 */
+	public function get($property)
+	{
+		if ($this->init_error() || !isset($this->$property))
+		{
+			return false;
+		}
+
+		return $this->$property;
+	}
+
+	/**
+	 * Check if file is an image (mime type)
+	 *
+	 * @return bool true if it is an image, false if not
+	 */
+	public function is_image()
+	{
+		return (strpos($this->mimetype, 'image/') === 0);
+	}
+
+	/**
+	 * Check if the file got correctly uploaded
+	 *
+	 * @return bool true if it is a valid upload, false if not
+	 */
+	public function is_uploaded()
+	{
+		$is_plupload = $this->plupload && $this->plupload->is_active();
+
+		if (!$this->local && !$is_plupload && !is_uploaded_file($this->filename))
+		{
+			return false;
+		}
+
+		if (($this->local || $is_plupload) && !file_exists($this->filename))
+		{
+			return false;
+		}
+
+		return true;
+	}
+
+	/**
+	 * Remove file
+	 */
+	public function remove()
+	{
+		if ($this->file_moved)
+		{
+			@unlink($this->destination_file);
+		}
+	}
+
+	/**
+	 * Get file extension
+	 *
+	 * @param string $filename Filename that needs to be checked
+	 *
+	 * @return string Extension of the supplied filename
+	 */
+	static public function get_extension($filename)
+	{
+		$filename = utf8_basename($filename);
+
+		if (strpos($filename, '.') === false)
+		{
+			return '';
+		}
+
+		$filename = explode('.', $filename);
+		return array_pop($filename);
+	}
+
+	/**
+	 * Get mime type
+	 *
+	 * @param string $filename Filename that needs to be checked
+	 * @return string Mime type of supplied filename
+	 */
+	public function get_mimetype($filename)
+	{
+		if ($this->mimetype_guesser !== null)
+		{
+			$mimetype = $this->mimetype_guesser->guess($filename, $this->uploadname);
+
+			if ($mimetype !== 'application/octet-stream')
+			{
+				$this->mimetype = $mimetype;
+			}
+		}
+
+		return $this->mimetype;
+	}
+
+	/**
+	 * Get file size
+	 *
+	 * @param string $filename File name of file to check
+	 *
+	 * @return int File size
+	 */
+	public function get_filesize($filename)
+	{
+		return @filesize($filename);
+	}
+
+
+	/**
+	 * Check the first 256 bytes for forbidden content
+	 *
+	 * @param array $disallowed_content Array containg disallowed content
+	 *
+	 * @return bool False if disallowed content found, true if not
+	 */
+	public function check_content($disallowed_content)
+	{
+		if (empty($disallowed_content))
+		{
+			return true;
+		}
+
+		$fp = @fopen($this->filename, 'rb');
+
+		if ($fp !== false)
+		{
+			$ie_mime_relevant = fread($fp, 256);
+			fclose($fp);
+			foreach ($disallowed_content as $forbidden)
+			{
+				if (stripos($ie_mime_relevant, '<' . $forbidden) !== false)
+				{
+					return false;
+				}
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * Move file to destination folder
+	 * The phpbb_root_path variable will be applied to the destination path
+	 *
+	 * @param string $destination Destination path, for example $config['avatar_path']
+	 * @param bool $overwrite If set to true, an already existing file will be overwritten
+	 * @param bool $skip_image_check If set to true, the check for the file to be a valid image is skipped
+	 * @param string|bool $chmod Permission mask for chmodding the file after a successful move.
+	 *				The mode entered here reflects the mode defined by {@link phpbb_chmod()}
+	 *
+	 * @return bool True if file was moved, false if not
+	 * @access public
+	 */
+	public function move_file($destination, $overwrite = false, $skip_image_check = false, $chmod = false)
+	{
+		if (sizeof($this->error))
+		{
+			return false;
+		}
+
+		$chmod = ($chmod === false) ? CHMOD_READ | CHMOD_WRITE : $chmod;
+
+		// We need to trust the admin in specifying valid upload directories and an attacker not being able to overwrite it...
+		$this->destination_path = $this->phpbb_root_path . $destination;
+
+		// Check if the destination path exist...
+		if (!file_exists($this->destination_path))
+		{
+			@unlink($this->filename);
+			return false;
+		}
+
+		$upload_mode = ($this->php_ini->getBool('open_basedir') || $this->php_ini->getBool('safe_mode')) ? 'move' : 'copy';
+		$upload_mode = ($this->local) ? 'local' : $upload_mode;
+		$this->destination_file = $this->destination_path . '/' . utf8_basename($this->realname);
+
+		// Check if the file already exist, else there is something wrong...
+		if (file_exists($this->destination_file) && !$overwrite)
+		{
+			@unlink($this->filename);
+			$this->error[] = $this->language->lang($this->upload->error_prefix . 'GENERAL_UPLOAD_ERROR', $this->destination_file);
+			$this->file_moved = false;
+			return false;
+		}
+		else
+		{
+			if (file_exists($this->destination_file))
+			{
+				@unlink($this->destination_file);
+			}
+
+			switch ($upload_mode)
+			{
+				case 'copy':
+
+					if (!@copy($this->filename, $this->destination_file))
+					{
+						if (!@move_uploaded_file($this->filename, $this->destination_file))
+						{
+							$this->error[] = $this->language->lang($this->upload->error_prefix . 'GENERAL_UPLOAD_ERROR', $this->destination_file);
+						}
+					}
+
+				break;
+
+				case 'move':
+
+					if (!@move_uploaded_file($this->filename, $this->destination_file))
+					{
+						if (!@copy($this->filename, $this->destination_file))
+						{
+							$this->error[] = $this->language->lang($this->upload->error_prefix . 'GENERAL_UPLOAD_ERROR', $this->destination_file);
+						}
+					}
+
+				break;
+
+				case 'local':
+
+					if (!@copy($this->filename, $this->destination_file))
+					{
+						$this->error[] = $this->language->lang($this->upload->error_prefix . 'GENERAL_UPLOAD_ERROR', $this->destination_file);
+					}
+
+				break;
+			}
+
+			// Remove temporary filename
+			@unlink($this->filename);
+
+			if (sizeof($this->error))
+			{
+				return false;
+			}
+
+			try
+			{
+				$this->filesystem->phpbb_chmod($this->destination_file, $chmod);
+			}
+			catch (\phpbb\filesystem\exception\filesystem_exception $e)
+			{
+				// Do nothing
+			}
+		}
+
+		// Try to get real filesize from destination folder
+		$this->filesize = ($this->get_filesize($this->destination_file)) ?: $this->filesize;
+
+		// Get mimetype of supplied file
+		$this->mimetype = $this->get_mimetype($this->destination_file);
+
+		if ($this->is_image() && !$skip_image_check)
+		{
+			$this->width = $this->height = 0;
+
+			$this->image_info = $this->imagesize->getImageSize($this->destination_file, $this->mimetype);
+
+			if ($this->image_info !== false)
+			{
+				$this->width = $this->image_info['width'];
+				$this->height = $this->image_info['height'];
+
+				// Check image type
+				$types = upload::image_types();
+
+				if (!isset($types[$this->image_info['type']]) || !in_array($this->extension, $types[$this->image_info['type']]))
+				{
+					if (!isset($types[$this->image_info['type']]))
+					{
+						$this->error[] = $this->language->lang('IMAGE_FILETYPE_INVALID', $this->image_info['type'], $this->mimetype);
+					}
+					else
+					{
+						$this->error[] = $this->language->lang('IMAGE_FILETYPE_MISMATCH', $types[$this->image_info['type']][0], $this->extension);
+					}
+				}
+
+				// Make sure the dimensions match a valid image
+				if (empty($this->width) || empty($this->height))
+				{
+					$this->error[] = $this->language->lang('ATTACHED_IMAGE_NOT_IMAGE');
+				}
+			}
+			else
+			{
+				$this->error[] = $this->language->lang('UNABLE_GET_IMAGE_SIZE');
+			}
+		}
+
+		$this->file_moved = true;
+		$this->additional_checks();
+		unset($this->upload);
+
+		return true;
+	}
+
+	/**
+	 * Performing additional checks
+	 *
+	 * @return bool False if issue was found, true if not
+	 */
+	public function additional_checks()
+	{
+		if (!$this->file_moved)
+		{
+			return false;
+		}
+
+		// Filesize is too big or it's 0 if it was larger than the maxsize in the upload form
+		if ($this->upload->max_filesize && ($this->get('filesize') > $this->upload->max_filesize || $this->filesize == 0))
+		{
+			$max_filesize = get_formatted_filesize($this->upload->max_filesize, false);
+
+			$this->error[] = $this->language->lang($this->upload->error_prefix . 'WRONG_FILESIZE', $max_filesize['value'], $max_filesize['unit']);
+
+			return false;
+		}
+
+		if (!$this->upload->valid_dimensions($this))
+		{
+			$this->error[] = $this->language->lang($this->upload->error_prefix . 'WRONG_SIZE',
+				$this->language->lang('PIXELS', (int) $this->upload->min_width),
+				$this->language->lang('PIXELS', (int) $this->upload->min_height),
+				$this->language->lang('PIXELS', (int) $this->upload->max_width),
+				$this->language->lang('PIXELS', (int) $this->upload->max_height),
+				$this->language->lang('PIXELS', (int) $this->width),
+				$this->language->lang('PIXELS', (int) $this->height));
+
+			return false;
+		}
+
+		return true;
+	}
+}
--- /dev/null
+++ b/phpbb/files/types/base.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\files\types;
+
+abstract class base implements type_interface
+{
+	/** @var \phpbb\language\language */
+	protected $language;
+
+	/** @var \bantu\IniGetWrapper\IniGetWrapper */
+	protected $php_ini;
+
+	/** @var \phpbb\files\upload */
+	protected $upload;
+
+	/**
+	 * Check if upload exceeds maximum file size
+	 *
+	 * @param \phpbb\files\filespec $file Filespec object
+	 *
+	 * @return \phpbb\files\filespec Returns same filespec instance
+	 */
+	public function check_upload_size($file)
+	{
+		// PHP Upload filesize exceeded
+		if ($file->get('filename') == 'none')
+		{
+			$max_filesize = $this->php_ini->getString('upload_max_filesize');
+			$unit = 'MB';
+
+			if (!empty($max_filesize))
+			{
+				$unit = strtolower(substr($max_filesize, -1, 1));
+				$max_filesize = (int) $max_filesize;
+
+				$unit = ($unit == 'k') ? 'KB' : (($unit == 'g') ? 'GB' : 'MB');
+			}
+
+			$file->error[] = (empty($max_filesize)) ? $this->language->lang($this->upload->error_prefix . 'PHP_SIZE_NA') : $this->language->lang($this->upload->error_prefix . 'PHP_SIZE_OVERRUN', $max_filesize, $this->language->lang($unit));
+		}
+
+		return $file;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function set_upload(\phpbb\files\upload $upload)
+	{
+		$this->upload = $upload;
+
+		return $this;
+	}
+}
--- /dev/null
+++ b/phpbb/files/types/form.php
@@ -0,0 +1,138 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\files\types;
+
+use bantu\IniGetWrapper\IniGetWrapper;
+use phpbb\files\factory;
+use phpbb\files\filespec;
+use phpbb\language\language;
+use phpbb\plupload\plupload;
+use phpbb\request\request_interface;
+
+class form extends base
+{
+	/** @var factory Files factory */
+	protected $factory;
+
+	/** @var language */
+	protected $language;
+
+	/** @var IniGetWrapper */
+	protected $php_ini;
+
+	/** @var plupload */
+	protected $plupload;
+
+	/** @var request_interface */
+	protected $request;
+
+	/** @var \phpbb\files\upload */
+	protected $upload;
+
+	/**
+	 * Construct a form upload type
+	 *
+	 * @param factory			$factory	Files factory
+	 * @param language			$language	Language class
+	 * @param IniGetWrapper		$php_ini	ini_get() wrapper
+	 * @param plupload			$plupload	Plupload
+	 * @param request_interface	$request	Request object
+	 */
+	public function __construct(factory $factory, language $language, IniGetWrapper $php_ini, plupload $plupload, request_interface $request)
+	{
+		$this->factory = $factory;
+		$this->language = $language;
+		$this->php_ini = $php_ini;
+		$this->plupload = $plupload;
+		$this->request = $request;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function upload()
+	{
+		$args = func_get_args();
+		return $this->form_upload($args[0]);
+	}
+
+	/**
+	 * Form upload method
+	 * Upload file from users harddisk
+	 *
+	 * @param string $form_name Form name assigned to the file input field (if it is an array, the key has to be specified)
+	 *
+	 * @return filespec $file Object "filespec" is returned, all further operations can be done with this object
+	 * @access public
+	 */
+	protected function form_upload($form_name)
+	{
+		$upload = $this->request->file($form_name);
+		unset($upload['local_mode']);
+
+		$result = $this->plupload->handle_upload($form_name);
+		if (is_array($result))
+		{
+			$upload = array_merge($upload, $result);
+		}
+
+		/** @var filespec $file */
+		$file = $this->factory->get('filespec')
+			->set_upload_ary($upload)
+			->set_upload_namespace($this->upload);
+
+		if ($file->init_error())
+		{
+			$file->error[] = '';
+			return $file;
+		}
+
+		// Error array filled?
+		if (isset($upload['error']))
+		{
+			$error = $this->upload->assign_internal_error($upload['error']);
+
+			if ($error !== false)
+			{
+				$file->error[] = $error;
+				return $file;
+			}
+		}
+
+		// Check if empty file got uploaded (not catched by is_uploaded_file)
+		if (isset($upload['size']) && $upload['size'] == 0)
+		{
+			$file->error[] = $this->language->lang($this->upload->error_prefix . 'EMPTY_FILEUPLOAD');
+			return $file;
+		}
+
+		// PHP Upload file size check
+		$file = $this->check_upload_size($file);
+		if (sizeof($file->error))
+		{
+			return $file;
+		}
+
+		// Not correctly uploaded
+		if (!$file->is_uploaded())
+		{
+			$file->error[] = $this->language->lang($this->upload->error_prefix . 'NOT_UPLOADED');
+			return $file;
+		}
+
+		$this->upload->common_checks($file);
+
+		return $file;
+	}
+}
--- /dev/null
+++ b/phpbb/files/types/local.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\files\types;
+
+use bantu\IniGetWrapper\IniGetWrapper;
+use phpbb\files\factory;
+use phpbb\files\filespec;
+use phpbb\language\language;
+use phpbb\request\request_interface;
+
+class local extends base
+{
+	/** @var factory Files factory */
+	protected $factory;
+
+	/** @var language */
+	protected $language;
+
+	/** @var IniGetWrapper */
+	protected $php_ini;
+
+	/** @var request_interface */
+	protected $request;
+
+	/** @var \phpbb\files\upload */
+	protected $upload;
+
+	/**
+	 * Construct a form upload type
+	 *
+	 * @param factory $factory Files factory
+	 * @param language $language Language class
+	 * @param IniGetWrapper $php_ini ini_get() wrapper
+	 * @param request_interface $request Request object
+	 */
+	public function __construct(factory $factory, language $language, IniGetWrapper $php_ini, request_interface $request)
+	{
+		$this->factory = $factory;
+		$this->language = $language;
+		$this->php_ini = $php_ini;
+		$this->request = $request;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function upload()
+	{
+		$args = func_get_args();
+		return $this->local_upload($args[0], isset($args[1]) ? $args[1] : false);
+	}
+
+	/**
+	 * Move file from another location to phpBB
+	 *
+	 * @param string $source_file Filename of source file
+	 * @param array|bool $filedata Array with filedata or false
+	 *
+	 * @return filespec Object "filespec" is returned, all further operations can be done with this object
+	 */
+	protected function local_upload($source_file, $filedata = false)
+	{
+		$upload = $this->get_upload_ary($source_file, $filedata);
+
+		/** @var filespec $file */
+		$file = $this->factory->get('filespec')
+			->set_upload_ary($upload)
+			->set_upload_namespace($this->upload);
+
+		if ($file->init_error())
+		{
+			$file->error[] = '';
+			return $file;
+		}
+
+		// PHP Upload file size check
+		$file = $this->check_upload_size($file);
+		if (sizeof($file->error))
+		{
+			return $file;
+		}
+
+		// Not correctly uploaded
+		if (!$file->is_uploaded())
+		{
+			$file->error[] = $this->language->lang($this->upload->error_prefix . 'NOT_UPLOADED');
+			return $file;
+		}
+
+		$this->upload->common_checks($file);
+		$this->request->overwrite('local', $upload, request_interface::FILES);
+
+		return $file;
+	}
+
+	/**
+	 * Retrieve upload array
+	 *
+	 * @param string $source_file Source file name
+	 * @param array $filedata File data array
+	 *
+	 * @return array Upload array
+	 */
+	protected function get_upload_ary($source_file, $filedata)
+	{
+		$upload = array();
+
+		$upload['local_mode'] = true;
+		$upload['tmp_name'] = $source_file;
+
+		if ($filedata === false)
+		{
+			$upload['name'] = utf8_basename($source_file);
+			$upload['size'] = 0;
+		}
+		else
+		{
+			$upload['name'] = $filedata['realname'];
+			$upload['size'] = $filedata['size'];
+			$upload['type'] = $filedata['type'];
+		}
+
+		return $upload;
+	}
+}
--- /dev/null
+++ b/phpbb/files/types/remote.php
@@ -0,0 +1,207 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\files\types;
+
+use bantu\IniGetWrapper\IniGetWrapper;
+use phpbb\config\config;
+use phpbb\files\factory;
+use phpbb\files\filespec;
+use phpbb\language\language;
+use phpbb\request\request_interface;
+
+class remote extends base
+{
+	/** @var config phpBB config */
+	protected $config;
+
+	/** @var factory Files factory */
+	protected $factory;
+
+	/** @var language */
+	protected $language;
+
+	/** @var IniGetWrapper */
+	protected $php_ini;
+
+	/** @var request_interface */
+	protected $request;
+
+	/** @var \phpbb\files\upload */
+	protected $upload;
+
+	/** @var string phpBB root path */
+	protected $phpbb_root_path;
+
+	/**
+	 * Construct a form upload type
+	 *
+	 * @param config $config phpBB config
+	 * @param factory $factory Files factory
+	 * @param language $language Language class
+	 * @param IniGetWrapper $php_ini ini_get() wrapper
+	 * @param request_interface $request Request object
+	 * @param string $phpbb_root_path phpBB root path
+	 */
+	public function __construct(config $config, factory $factory, language $language, IniGetWrapper $php_ini, request_interface $request, $phpbb_root_path)
+	{
+		$this->config = $config;
+		$this->factory = $factory;
+		$this->language = $language;
+		$this->php_ini = $php_ini;
+		$this->request = $request;
+		$this->phpbb_root_path = $phpbb_root_path;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function upload()
+	{
+		$args = func_get_args();
+		return $this->remote_upload($args[0]);
+	}
+
+	/**
+	 * Remote upload method
+	 * Uploads file from given url
+	 *
+	 * @param string $upload_url URL pointing to file to upload, for example http://www.foobar.com/example.gif
+	 * @return filespec $file Object "filespec" is returned, all further operations can be done with this object
+	 * @access public
+	 */
+	protected function remote_upload($upload_url)
+	{
+		$upload_ary = array();
+		$upload_ary['local_mode'] = true;
+
+		if (!preg_match('#^(https?://).*?\.(' . implode('|', $this->upload->allowed_extensions) . ')$#i', $upload_url, $match))
+		{
+			return $this->factory->get('filespec')->set_error($this->language->lang($this->upload->error_prefix . 'URL_INVALID'));
+		}
+
+		$url = parse_url($upload_url);
+
+		$upload_ary['type'] = 'application/octet-stream';
+
+		$url['path'] = explode('.', $url['path']);
+		$ext = array_pop($url['path']);
+
+		$url['path'] = implode('', $url['path']);
+		$upload_ary['name'] = utf8_basename($url['path']) . (($ext) ? '.' . $ext : '');
+
+		$remote_max_filesize = $this->get_max_file_size();
+
+		$guzzle_options = [
+			'timeout'			=> $this->upload->upload_timeout,
+			'connect_timeout'	=> $this->upload->upload_timeout,
+			'verify'			=> !empty($this->config['remote_upload_verify']) ? (bool) $this->config['remote_upload_verify'] : false,
+		];
+		$client = new \GuzzleHttp\Client($guzzle_options);
+
+		try
+		{
+			$response = $client->get($upload_url, $guzzle_options);
+		}
+		catch (\GuzzleHttp\Exception\ClientException $clientException)
+		{
+			return $this->factory->get('filespec')->set_error($this->upload->error_prefix . 'URL_NOT_FOUND');
+		}
+		catch (\GuzzleHttp\Exception\RequestException $requestException)
+		{
+			if (strpos($requestException->getMessage(), 'cURL error 28') !== false || preg_match('/408|504/', $requestException->getCode()))
+			{
+				return $this->factory->get('filespec')->set_error($this->upload->error_prefix . 'REMOTE_UPLOAD_TIMEOUT');
+			}
+			else
+			{
+				return $this->factory->get('filespec')->set_error($this->language->lang($this->upload->error_prefix . 'NOT_UPLOADED'));
+			}
+		}
+		catch (\Exception $e)
+		{
+			return $this->factory->get('filespec')->set_error($this->language->lang($this->upload->error_prefix . 'NOT_UPLOADED'));
+		}
+
+		$content_length = $response->getBody()->getSize();
+		if ($remote_max_filesize && $content_length > $remote_max_filesize)
+		{
+			$max_filesize = get_formatted_filesize($remote_max_filesize, false);
+
+			return $this->factory->get('filespec')->set_error($this->language->lang($this->upload->error_prefix . 'WRONG_FILESIZE', $max_filesize['value'], $max_filesize['unit']));
+		}
+
+		if ($content_length == 0)
+		{
+			return $this->factory->get('filespec')->set_error($this->upload->error_prefix . 'EMPTY_REMOTE_DATA');
+		}
+
+		$data = $response->getBody();
+
+		$filename = tempnam(sys_get_temp_dir(), unique_id() . '-');
+
+		if (!($fp = @fopen($filename, 'wb')))
+		{
+			return $this->factory->get('filespec')->set_error($this->upload->error_prefix . 'NOT_UPLOADED');
+		}
+
+		$upload_ary['size'] = fwrite($fp, $data);
+		fclose($fp);
+		unset($data);
+
+		$upload_ary['tmp_name'] = $filename;
+
+		/** @var filespec $file */
+		$file = $this->factory->get('filespec')
+			->set_upload_ary($upload_ary)
+			->set_upload_namespace($this->upload);
+		$this->upload->common_checks($file);
+
+		return $file;
+	}
+
+	/**
+	 * Get maximum file size for remote uploads
+	 *
+	 * @return int Maximum file size
+	 */
+	protected function get_max_file_size()
+	{
+		$max_file_size = $this->upload->max_filesize;
+		if (!$max_file_size)
+		{
+			$max_file_size = $this->php_ini->getString('upload_max_filesize');
+
+			if (!empty($max_file_size))
+			{
+				$unit = strtolower(substr($max_file_size, -1, 1));
+				$max_file_size = (int) $max_file_size;
+
+				switch ($unit)
+				{
+					case 'g':
+						$max_file_size *= 1024;
+					// no break
+					case 'm':
+						$max_file_size *= 1024;
+					// no break
+					case 'k':
+						$max_file_size *= 1024;
+					// no break
+				}
+			}
+		}
+
+		return $max_file_size;
+	}
+}
--- /dev/null
+++ b/phpbb/files/types/type_interface.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\files\types;
+
+use phpbb\files\upload;
+
+interface type_interface
+{
+	/**
+	 * Handle upload for upload types. Arguments passed to this method will be
+	 * handled by the upload type classes themselves.
+	 *
+	 * @return \phpbb\files\filespec|bool Filespec instance if upload is
+	 *                                    successful or false if not
+	 */
+	public function upload();
+
+	/**
+	 * Set upload instance
+	 * Needs to be executed before every upload.
+	 *
+	 * @param upload $upload Upload instance
+	 *
+	 * @return type_interface Returns itself
+	 */
+	public function set_upload(upload $upload);
+}
--- /dev/null
+++ b/phpbb/files/upload.php
@@ -0,0 +1,390 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\files;
+
+use phpbb\filesystem\filesystem_interface;
+use phpbb\language\language;
+use phpbb\request\request_interface;
+
+/**
+ * File upload class
+ * Init class (all parameters optional and able to be set/overwritten separately) - scope is global and valid for all uploads
+ */
+class upload
+{
+	/** @var array Allowed file extensions */
+	public $allowed_extensions = array();
+
+	/** @var array Disallowed content */
+	protected $disallowed_content = array('body', 'head', 'html', 'img', 'plaintext', 'a href', 'pre', 'script', 'table', 'title');
+
+	/** @var int Maximum filesize */
+	public $max_filesize = 0;
+
+	/** @var int Minimum width of images */
+	public $min_width = 0;
+
+	/** @var int Minimum height of images */
+	public $min_height = 0;
+
+	/** @var int Maximum width of images */
+	public $max_width = 0;
+
+	/** @var int Maximum height of images */
+	public $max_height = 0;
+
+	/** @var string Prefix for language variables of errors */
+	public $error_prefix = '';
+
+	/** @var int Timeout for remote upload */
+	public $upload_timeout = 6;
+
+	/** @var filesystem_interface */
+	protected $filesystem;
+
+	/** @var \phpbb\files\factory Files factory */
+	protected $factory;
+
+	/** @var \bantu\IniGetWrapper\IniGetWrapper ini_get() wrapper */
+	protected $php_ini;
+
+	/** @var \phpbb\language\language Language class */
+	protected $language;
+
+	/** @var request_interface Request class */
+	protected $request;
+
+	/**
+	 * Init file upload class.
+	 *
+	 * @param filesystem_interface $filesystem
+	 * @param factory $factory Files factory
+	 * @param language $language Language class
+	 * @param \bantu\IniGetWrapper\IniGetWrapper $php_ini ini_get() wrapper
+	 * @param request_interface $request Request class
+	 */
+	public function __construct(filesystem_interface $filesystem, factory $factory, language $language, \bantu\IniGetWrapper\IniGetWrapper $php_ini, request_interface $request)
+	{
+		$this->filesystem = $filesystem;
+		$this->factory = $factory;
+		$this->language = $language;
+		$this->php_ini = $php_ini;
+		$this->request = $request;
+	}
+
+	/**
+	 * Reset vars
+	 */
+	public function reset_vars()
+	{
+		$this->max_filesize = 0;
+		$this->min_width = $this->min_height = $this->max_width = $this->max_height = 0;
+		$this->error_prefix = '';
+		$this->allowed_extensions = array();
+		$this->disallowed_content = array();
+	}
+
+	/**
+	 * Set allowed extensions
+	 *
+	 * @param array $allowed_extensions Allowed file extensions
+	 *
+	 * @return \phpbb\files\upload This instance of upload
+	 */
+	public function set_allowed_extensions($allowed_extensions)
+	{
+		if ($allowed_extensions !== false && is_array($allowed_extensions))
+		{
+			$this->allowed_extensions = $allowed_extensions;
+		}
+
+		return $this;
+	}
+
+	/**
+	 * Set allowed dimensions
+	 *
+	 * @param int $min_width Minimum image width
+	 * @param int $min_height Minimum image height
+	 * @param int $max_width Maximum image width
+	 * @param int $max_height Maximum image height
+	 *
+	 * @return \phpbb\files\upload This instance of upload
+	 */
+	public function set_allowed_dimensions($min_width, $min_height, $max_width, $max_height)
+	{
+		$this->min_width = (int) $min_width;
+		$this->min_height = (int) $min_height;
+		$this->max_width = (int) $max_width;
+		$this->max_height = (int) $max_height;
+
+		return $this;
+	}
+
+	/**
+	 * Set maximum allowed file size
+	 *
+	 * @param int $max_filesize Maximum file size
+	 *
+	 * @return \phpbb\files\upload This instance of upload
+	 */
+	public function set_max_filesize($max_filesize)
+	{
+		if ($max_filesize !== false && (int) $max_filesize)
+		{
+			$this->max_filesize = (int) $max_filesize;
+		}
+
+		return $this;
+	}
+
+	/**
+	 * Set disallowed strings
+	 *
+	 * @param array $disallowed_content Disallowed content
+	 *
+	 * @return \phpbb\files\upload This instance of upload
+	 */
+	public function set_disallowed_content($disallowed_content)
+	{
+		if ($disallowed_content !== false && is_array($disallowed_content))
+		{
+			$this->disallowed_content = array_diff($disallowed_content, array(''));
+		}
+
+		return $this;
+	}
+
+	/**
+	 * Set error prefix
+	 *
+	 * @param string $error_prefix Prefix for language variables of errors
+	 *
+	 * @return \phpbb\files\upload This instance of upload
+	 */
+	public function set_error_prefix($error_prefix)
+	{
+		$this->error_prefix = $error_prefix;
+
+		return $this;
+	}
+
+	/**
+	 * Handle upload based on type
+	 *
+	 * @param string $type Upload type
+	 *
+	 * @return \phpbb\files\filespec|bool A filespec instance if upload was
+	 *		successful, false if there were issues or the type is not supported
+	 */
+	public function handle_upload($type)
+	{
+		$args = func_get_args();
+		array_shift($args);
+		$type_class = $this->factory->get($type)
+			->set_upload($this);
+
+		return (is_object($type_class)) ? call_user_func_array(array($type_class, 'upload'), $args) : false;
+	}
+
+	/**
+	 * Assign internal error
+	 *
+	 * @param string $errorcode Error code to assign
+	 *
+	 * @return string Error string
+	 * @access public
+	 */
+	public function assign_internal_error($errorcode)
+	{
+		switch ($errorcode)
+		{
+			case UPLOAD_ERR_INI_SIZE:
+				$max_filesize = $this->php_ini->getString('upload_max_filesize');
+				$unit = 'MB';
+
+				if (!empty($max_filesize))
+				{
+					$unit = strtolower(substr($max_filesize, -1, 1));
+					$max_filesize = (int) $max_filesize;
+
+					$unit = ($unit == 'k') ? 'KB' : (($unit == 'g') ? 'GB' : 'MB');
+				}
+
+				$error = (empty($max_filesize)) ? $this->language->lang($this->error_prefix . 'PHP_SIZE_NA') : $this->language->lang($this->error_prefix . 'PHP_SIZE_OVERRUN', $max_filesize, $this->language->lang($unit));
+			break;
+
+			case UPLOAD_ERR_FORM_SIZE:
+				$max_filesize = get_formatted_filesize($this->max_filesize, false);
+
+				$error = $this->language->lang($this->error_prefix . 'WRONG_FILESIZE', $max_filesize['value'], $max_filesize['unit']);
+			break;
+
+			case UPLOAD_ERR_PARTIAL:
+				$error = $this->language->lang($this->error_prefix . 'PARTIAL_UPLOAD');
+			break;
+
+			case UPLOAD_ERR_NO_FILE:
+				$error = $this->language->lang($this->error_prefix . 'NOT_UPLOADED');
+			break;
+
+			case UPLOAD_ERR_NO_TMP_DIR:
+			case UPLOAD_ERR_CANT_WRITE:
+				$error = $this->language->lang($this->error_prefix . 'NO_TEMP_DIR');
+			break;
+
+			case UPLOAD_ERR_EXTENSION:
+				$error = $this->language->lang($this->error_prefix . 'PHP_UPLOAD_STOPPED');
+			break;
+
+			default:
+				$error = false;
+			break;
+		}
+
+		return $error;
+	}
+
+	/**
+	 * Perform common file checks
+	 *
+	 * @param filespec $file Instance of filespec class
+	 */
+	public function common_checks(&$file)
+	{
+		// Filesize is too big or it's 0 if it was larger than the maxsize in the upload form
+		if ($this->max_filesize && ($file->get('filesize') > $this->max_filesize || $file->get('filesize') == 0))
+		{
+			$max_filesize = get_formatted_filesize($this->max_filesize, false);
+
+			$file->error[] = $this->language->lang($this->error_prefix . 'WRONG_FILESIZE', $max_filesize['value'], $max_filesize['unit']);
+		}
+
+		// check Filename
+		if (preg_match("#[\\/:*?\"<>|]#i", $file->get('realname')))
+		{
+			$file->error[] = $this->language->lang($this->error_prefix . 'INVALID_FILENAME', $file->get('realname'));
+		}
+
+		// Invalid Extension
+		if (!$this->valid_extension($file))
+		{
+			$file->error[] = $this->language->lang($this->error_prefix . 'DISALLOWED_EXTENSION', $file->get('extension'));
+		}
+
+		// MIME Sniffing
+		if (!$this->valid_content($file))
+		{
+			$file->error[] = $this->language->lang($this->error_prefix . 'DISALLOWED_CONTENT');
+		}
+	}
+
+	/**
+	 * Check for allowed extension
+	 *
+	 * @param filespec $file Instance of filespec class
+	 *
+	 * @return bool True if extension is allowed, false if not
+	 */
+	public function valid_extension(&$file)
+	{
+		return (in_array($file->get('extension'), $this->allowed_extensions)) ? true : false;
+	}
+
+	/**
+	 * Check for allowed dimension
+	 *
+	 * @param filespec $file Instance of filespec class
+	 *
+	 * @return bool True if dimensions are valid or no constraints set, false
+	 *			if not
+	 */
+	public function valid_dimensions(&$file)
+	{
+		if (!$this->max_width && !$this->max_height && !$this->min_width && !$this->min_height)
+		{
+			return true;
+		}
+
+		if (($file->get('width') > $this->max_width && $this->max_width) ||
+			($file->get('height') > $this->max_height && $this->max_height) ||
+			($file->get('width') < $this->min_width && $this->min_width) ||
+			($file->get('height') < $this->min_height && $this->min_height))
+		{
+			return false;
+		}
+
+		return true;
+	}
+
+	/**
+	 * Check if form upload is valid
+	 *
+	 * @param string $form_name Name of form
+	 *
+	 * @return bool True if form upload is valid, false if not
+	 */
+	public function is_valid($form_name)
+	{
+		$upload = $this->request->file($form_name);
+
+		return (!empty($upload) && $upload['name'] !== 'none');
+	}
+
+
+	/**
+	 * Check for bad content (IE mime-sniffing)
+	 *
+	 * @param filespec $file Instance of filespec class
+	 *
+	 * @return bool True if content is valid, false if not
+	 */
+	public function valid_content(&$file)
+	{
+		return ($file->check_content($this->disallowed_content));
+	}
+
+	/**
+	 * Get image type/extension mapping
+	 *
+	 * @return array Array containing the image types and their extensions
+	 */
+	static public function image_types()
+	{
+		$result = array(
+			IMAGETYPE_GIF		=> array('gif'),
+			IMAGETYPE_JPEG		=> array('jpg', 'jpeg'),
+			IMAGETYPE_PNG		=> array('png'),
+			IMAGETYPE_SWF		=> array('swf'),
+			IMAGETYPE_PSD		=> array('psd'),
+			IMAGETYPE_BMP		=> array('bmp'),
+			IMAGETYPE_TIFF_II	=> array('tif', 'tiff'),
+			IMAGETYPE_TIFF_MM	=> array('tif', 'tiff'),
+			IMAGETYPE_JPC		=> array('jpg', 'jpeg'),
+			IMAGETYPE_JP2		=> array('jpg', 'jpeg'),
+			IMAGETYPE_JPX		=> array('jpg', 'jpeg'),
+			IMAGETYPE_JB2		=> array('jpg', 'jpeg'),
+			IMAGETYPE_IFF		=> array('iff'),
+			IMAGETYPE_WBMP		=> array('wbmp'),
+			IMAGETYPE_XBM		=> array('xbm'),
+		);
+
+		if (defined('IMAGETYPE_SWC'))
+		{
+			$result[IMAGETYPE_SWC] = array('swc');
+		}
+
+		return $result;
+	}
+}
--- a/phpbb/filesystem.php
+++ b/phpbb/filesystem.php
@@ -14,37 +14,8 @@
 namespace phpbb;
 
 /**
-* A class with various functions that are related to paths, files and the filesystem
-*/
-class filesystem
+ * @deprecated	3.2.0-dev	(To be removed 3.3.0) use \phpbb\filesystem\filesystem instead
+ */
+class filesystem extends \phpbb\filesystem\filesystem
 {
-	/**
-	* Eliminates useless . and .. components from specified path.
-	*
-	* @param string $path Path to clean
-	* @return string Cleaned path
-	*/
-	public function clean_path($path)
-	{
-		$exploded = explode('/', $path);
-		$filtered = array();
-		foreach ($exploded as $part)
-		{
-			if ($part === '.' && !empty($filtered))
-			{
-				continue;
-			}
-
-			if ($part === '..' && !empty($filtered) && $filtered[sizeof($filtered) - 1] !== '.' && $filtered[sizeof($filtered) - 1] !== '..')
-			{
-				array_pop($filtered);
-			}
-			else
-			{
-				$filtered[] = $part;
-			}
-		}
-		$path = implode('/', $filtered);
-		return $path;
-	}
 }
--- /dev/null
+++ b/phpbb/filesystem/exception/filesystem_exception.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\filesystem\exception;
+
+class filesystem_exception extends \phpbb\exception\runtime_exception
+{
+	/**
+	 * Constructor
+	 *
+	 * @param string		$message	The Exception message to throw (must be a language variable).
+	 * @param string		$filename	The file that caused the error.
+	 * @param array			$parameters	The parameters to use with the language var.
+	 * @param \Exception	$previous	The previous runtime_exception used for the runtime_exception chaining.
+	 * @param integer		$code		The Exception code.
+	 */
+	public function __construct($message = "", $filename = '', $parameters = array(), \Exception $previous = null, $code = 0)
+	{
+		parent::__construct($message, array_merge(array('filename' => $filename), $parameters), $previous, $code);
+	}
+
+	/**
+	 * Returns the filename that triggered the error
+	 *
+	 * @return string
+	 */
+	public function get_filename()
+	{
+		$parameters = parent::get_parameters();
+		return $parameters['filename'];
+	}
+}
--- /dev/null
+++ b/phpbb/filesystem/filesystem.php
@@ -0,0 +1,916 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\filesystem;
+
+use phpbb\filesystem\exception\filesystem_exception;
+
+/**
+ * A class with various functions that are related to paths, files and the filesystem
+ */
+class filesystem implements filesystem_interface
+{
+	/**
+	 * Store some information about file ownership for phpBB's chmod function
+	 *
+	 * @var array
+	 */
+	protected $chmod_info;
+
+	/**
+	 * Stores current working directory
+	 *
+	 * @var string|bool		current working directory or false if it cannot be recovered
+	 */
+	protected $working_directory;
+
+	/**
+	 * Symfony's Filesystem component
+	 *
+	 * @var \Symfony\Component\Filesystem\Filesystem
+	 */
+	protected $symfony_filesystem;
+
+	/**
+	 * Constructor
+	 */
+	public function __construct()
+	{
+		$this->chmod_info			= array();
+		$this->symfony_filesystem	= new \Symfony\Component\Filesystem\Filesystem();
+		$this->working_directory	= null;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function chgrp($files, $group, $recursive = false)
+	{
+		try
+		{
+			$this->symfony_filesystem->chgrp($files, $group, $recursive);
+		}
+		catch (\Symfony\Component\Filesystem\Exception\IOException $e)
+		{
+			// Try to recover filename
+			// By the time this is written that is at the end of the message
+			$error = trim($e->getMessage());
+			$file = substr($error, strrpos($error, ' '));
+
+			throw new filesystem_exception('CANNOT_CHANGE_FILE_GROUP', $file, array(), $e);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function chmod($files, $perms = null, $recursive = false, $force_chmod_link = false)
+	{
+		if (is_null($perms))
+		{
+			// Default to read permission for compatibility reasons
+			$perms = self::CHMOD_READ;
+		}
+
+		// Check if we got a permission flag
+		if ($perms > self::CHMOD_ALL)
+		{
+			$file_perm = $perms;
+
+			// Extract permissions
+			//$owner = ($file_perm >> 6) & 7; // This will be ignored
+			$group = ($file_perm >> 3) & 7;
+			$other = ($file_perm >> 0) & 7;
+
+			// Does any permissions provided? if so we add execute bit for directories
+			$group = ($group !== 0) ? ($group | self::CHMOD_EXECUTE) : $group;
+			$other = ($other !== 0) ? ($other | self::CHMOD_EXECUTE) : $other;
+
+			// Compute directory permissions
+			$dir_perm = (self::CHMOD_ALL << 6) + ($group << 3) + ($other << 3);
+		}
+		else
+		{
+			// Add execute bit to owner if execute bit is among perms
+			$owner_perm	= (self::CHMOD_READ | self::CHMOD_WRITE) | ($perms & self::CHMOD_EXECUTE);
+			$file_perm	= ($owner_perm << 6) + ($perms << 3) + ($perms << 0);
+
+			// Compute directory permissions
+			$perm = ($perms !== 0) ? ($perms | self::CHMOD_EXECUTE) : $perms;
+			$dir_perm = (($owner_perm | self::CHMOD_EXECUTE) << 6) + ($perm << 3) + ($perm << 0);
+		}
+
+		// Symfony's filesystem component does not support extra execution flags on directories
+		// so we need to implement it again
+		foreach ($this->to_iterator($files) as $file)
+		{
+			if ($recursive && is_dir($file) && !is_link($file))
+			{
+				$this->chmod(new \FilesystemIterator($file), $perms, true);
+			}
+
+			// Don't chmod links as mostly those require 0777 and that cannot be changed
+			if (is_dir($file) || (is_link($file) && $force_chmod_link))
+			{
+				if (true !== @chmod($file, $dir_perm))
+				{
+					throw new filesystem_exception('CANNOT_CHANGE_FILE_PERMISSIONS', $file,  array());
+				}
+			}
+			else if (is_file($file))
+			{
+				if (true !== @chmod($file, $file_perm))
+				{
+					throw new filesystem_exception('CANNOT_CHANGE_FILE_PERMISSIONS', $file,  array());
+				}
+			}
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function chown($files, $user, $recursive = false)
+	{
+		try
+		{
+			$this->symfony_filesystem->chown($files, $user, $recursive);
+		}
+		catch (\Symfony\Component\Filesystem\Exception\IOException $e)
+		{
+			// Try to recover filename
+			// By the time this is written that is at the end of the message
+			$error = trim($e->getMessage());
+			$file = substr($error, strrpos($error, ' '));
+
+			throw new filesystem_exception('CANNOT_CHANGE_FILE_GROUP', $file, array(), $e);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function clean_path($path)
+	{
+		$exploded = explode('/', $path);
+		$filtered = array();
+		foreach ($exploded as $part)
+		{
+			if ($part === '.' && !empty($filtered))
+			{
+				continue;
+			}
+
+			if ($part === '..' && !empty($filtered) && $filtered[sizeof($filtered) - 1] !== '.' && $filtered[sizeof($filtered) - 1] !== '..')
+			{
+				array_pop($filtered);
+			}
+			else
+			{
+				$filtered[] = $part;
+			}
+		}
+		$path = implode('/', $filtered);
+		return $path;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function copy($origin_file, $target_file, $override = false)
+	{
+		try
+		{
+			$this->symfony_filesystem->copy($origin_file, $target_file, $override);
+		}
+		catch (\Symfony\Component\Filesystem\Exception\IOException $e)
+		{
+			throw new filesystem_exception('CANNOT_COPY_FILES', '', array(), $e);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function dump_file($filename, $content)
+	{
+		try
+		{
+			$this->symfony_filesystem->dumpFile($filename, $content);
+		}
+		catch (\Symfony\Component\Filesystem\Exception\IOException $e)
+		{
+			throw new filesystem_exception('CANNOT_DUMP_FILE', $filename, array(), $e);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function exists($files)
+	{
+		return $this->symfony_filesystem->exists($files);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function is_absolute_path($path)
+	{
+		return (isset($path[0]) && $path[0] === '/' || preg_match('#^[a-z]:[/\\\]#i', $path)) ? true : false;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function is_readable($files, $recursive = false)
+	{
+		foreach ($this->to_iterator($files) as $file)
+		{
+			if ($recursive && is_dir($file) && !is_link($file))
+			{
+				if (!$this->is_readable(new \FilesystemIterator($file), true))
+				{
+					return false;
+				}
+			}
+
+			if (!is_readable($file))
+			{
+				return false;
+			}
+		}
+
+		return true;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function is_writable($files, $recursive = false)
+	{
+		if (defined('PHP_WINDOWS_VERSION_MAJOR') || !function_exists('is_writable'))
+		{
+			foreach ($this->to_iterator($files) as $file)
+			{
+				if ($recursive && is_dir($file) && !is_link($file))
+				{
+					if (!$this->is_writable(new \FilesystemIterator($file), true))
+					{
+						return false;
+					}
+				}
+
+				if (!$this->phpbb_is_writable($file))
+				{
+					return false;
+				}
+			}
+		}
+		else
+		{
+			// use built in is_writable
+			foreach ($this->to_iterator($files) as $file)
+			{
+				if ($recursive && is_dir($file) && !is_link($file))
+				{
+					if (!$this->is_writable(new \FilesystemIterator($file), true))
+					{
+						return false;
+					}
+				}
+
+				if (!is_writable($file))
+				{
+					return false;
+				}
+			}
+		}
+
+		return true;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function make_path_relative($end_path, $start_path)
+	{
+		return $this->symfony_filesystem->makePathRelative($end_path, $start_path);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function mirror($origin_dir, $target_dir, \Traversable $iterator = null, $options = array())
+	{
+		try
+		{
+			$this->symfony_filesystem->mirror($origin_dir, $target_dir, $iterator, $options);
+		}
+		catch (\Symfony\Component\Filesystem\Exception\IOException $e)
+		{
+			$msg = $e->getMessage();
+			$filename = substr($msg, strpos($msg, '"'), strrpos($msg, '"'));
+
+			throw new filesystem_exception('CANNOT_MIRROR_DIRECTORY', $filename, array(), $e);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function mkdir($dirs, $mode = 0777)
+	{
+		try
+		{
+			$this->symfony_filesystem->mkdir($dirs, $mode);
+		}
+		catch (\Symfony\Component\Filesystem\Exception\IOException $e)
+		{
+			$msg = $e->getMessage();
+			$filename = substr($msg, strpos($msg, '"'), strrpos($msg, '"'));
+
+			throw new filesystem_exception('CANNOT_CREATE_DIRECTORY', $filename, array(), $e);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function phpbb_chmod($files, $perms = null, $recursive = false, $force_chmod_link = false)
+	{
+		if (is_null($perms))
+		{
+			// Default to read permission for compatibility reasons
+			$perms = self::CHMOD_READ;
+		}
+
+		if (empty($this->chmod_info))
+		{
+			if (!function_exists('fileowner') || !function_exists('filegroup'))
+			{
+				$this->chmod_info['process'] = false;
+			}
+			else
+			{
+				$common_php_owner	= @fileowner(__FILE__);
+				$common_php_group	= @filegroup(__FILE__);
+
+				// And the owner and the groups PHP is running under.
+				$php_uid	= (function_exists('posic_getuid')) ? @posix_getuid() : false;
+				$php_gids	= (function_exists('posix_getgroups')) ? @posix_getgroups() : false;
+
+				// If we are unable to get owner/group, then do not try to set them by guessing
+				if (!$php_uid || empty($php_gids) || !$common_php_owner || !$common_php_group)
+				{
+					$this->chmod_info['process'] = false;
+				}
+				else
+				{
+					$this->chmod_info = array(
+						'process'		=> true,
+						'common_owner'	=> $common_php_owner,
+						'common_group'	=> $common_php_group,
+						'php_uid'		=> $php_uid,
+						'php_gids'		=> $php_gids,
+					);
+				}
+			}
+		}
+
+		if ($this->chmod_info['process'])
+		{
+			try
+			{
+				foreach ($this->to_iterator($files) as $file)
+				{
+					$file_uid = @fileowner($file);
+					$file_gid = @filegroup($file);
+
+					// Change owner
+					if ($file_uid !== $this->chmod_info['common_owner'])
+					{
+						$this->chown($file, $this->chmod_info['common_owner'], $recursive);
+					}
+
+					// Change group
+					if ($file_gid !== $this->chmod_info['common_group'])
+					{
+						$this->chgrp($file, $this->chmod_info['common_group'], $recursive);
+					}
+
+					clearstatcache();
+					$file_uid = @fileowner($file);
+					$file_gid = @filegroup($file);
+				}
+			}
+			catch (filesystem_exception $e)
+			{
+				$this->chmod_info['process'] = false;
+			}
+		}
+
+		// Still able to process?
+		if ($this->chmod_info['process'])
+		{
+			if ($file_uid === $this->chmod_info['php_uid'])
+			{
+				$php = 'owner';
+			}
+			else if (in_array($file_gid, $this->chmod_info['php_gids']))
+			{
+				$php = 'group';
+			}
+			else
+			{
+				// Since we are setting the everyone bit anyway, no need to do expensive operations
+				$this->chmod_info['process'] = false;
+			}
+		}
+
+		// We are not able to determine or change something
+		if (!$this->chmod_info['process'])
+		{
+			$php = 'other';
+		}
+
+		switch ($php)
+		{
+			case 'owner':
+				try
+				{
+					$this->chmod($files, $perms, $recursive, $force_chmod_link);
+					clearstatcache();
+					if ($this->is_readable($files) && $this->is_writable($files))
+					{
+						break;
+					}
+				}
+				catch (filesystem_exception $e)
+				{
+					// Do nothing
+				}
+			case 'group':
+				try
+				{
+					$this->chmod($files, $perms, $recursive, $force_chmod_link);
+					clearstatcache();
+					if ((!($perms & self::CHMOD_READ) || $this->is_readable($files, $recursive)) && (!($perms & self::CHMOD_WRITE) || $this->is_writable($files, $recursive)))
+					{
+						break;
+					}
+				}
+				catch (filesystem_exception $e)
+				{
+					// Do nothing
+				}
+			case 'other':
+			default:
+				$this->chmod($files, $perms, $recursive, $force_chmod_link);
+			break;
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function realpath($path)
+	{
+		if (!function_exists('realpath'))
+		{
+			return $this->phpbb_own_realpath($path);
+		}
+
+		$realpath = realpath($path);
+
+		// Strangely there are provider not disabling realpath but returning strange values. :o
+		// We at least try to cope with them.
+		if ((!$this->is_absolute_path($path) && $realpath === $path) || $realpath === false)
+		{
+			return $this->phpbb_own_realpath($path);
+		}
+
+		// Check for DIRECTORY_SEPARATOR at the end (and remove it!)
+		if (substr($realpath, -1) === DIRECTORY_SEPARATOR)
+		{
+			$realpath = substr($realpath, 0, -1);
+		}
+
+		return $realpath;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function remove($files)
+	{
+		try
+		{
+			$this->symfony_filesystem->remove($files);
+		}
+		catch (\Symfony\Component\Filesystem\Exception\IOException $e)
+		{
+			// Try to recover filename
+			// By the time this is written that is at the end of the message
+			$error = trim($e->getMessage());
+			$file = substr($error, strrpos($error, ' '));
+
+			throw new filesystem_exception('CANNOT_DELETE_FILES', $file, array(), $e);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function rename($origin, $target, $overwrite = false)
+	{
+		try
+		{
+			$this->symfony_filesystem->rename($origin, $target, $overwrite);
+		}
+		catch (\Symfony\Component\Filesystem\Exception\IOException $e)
+		{
+			$msg = $e->getMessage();
+			$filename = substr($msg, strpos($msg, '"'), strrpos($msg, '"'));
+
+			throw new filesystem_exception('CANNOT_RENAME_FILE', $filename, array(), $e);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function symlink($origin_dir, $target_dir, $copy_on_windows = false)
+	{
+		try
+		{
+			$this->symfony_filesystem->symlink($origin_dir, $target_dir, $copy_on_windows);
+		}
+		catch (\Symfony\Component\Filesystem\Exception\IOException $e)
+		{
+			throw new filesystem_exception('CANNOT_CREATE_SYMLINK', $origin_dir, array(), $e);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function touch($files, $time = null, $access_time = null)
+	{
+		try
+		{
+			$this->symfony_filesystem->touch($files, $time, $access_time);
+		}
+		catch (\Symfony\Component\Filesystem\Exception\IOException $e)
+		{
+			// Try to recover filename
+			// By the time this is written that is at the end of the message
+			$error = trim($e->getMessage());
+			$file = substr($error, strrpos($error, ' '));
+
+			throw new filesystem_exception('CANNOT_TOUCH_FILES', $file, array(), $e);
+		}
+	}
+
+	/**
+	 * phpBB's implementation of is_writable
+	 *
+	 * @todo Investigate if is_writable is still buggy
+	 *
+	 * @param string	$file	file/directory to check if writable
+	 *
+	 * @return bool	true if the given path is writable
+	 */
+	protected function phpbb_is_writable($file)
+	{
+		if (file_exists($file))
+		{
+			// Canonicalise path to absolute path
+			$file = $this->realpath($file);
+
+			if (is_dir($file))
+			{
+				// Test directory by creating a file inside the directory
+				$result = @tempnam($file, 'i_w');
+
+				if (is_string($result) && file_exists($result))
+				{
+					unlink($result);
+
+					// Ensure the file is actually in the directory (returned realpathed)
+					return (strpos($result, $file) === 0) ? true : false;
+				}
+			}
+			else
+			{
+				$handle = @fopen($file, 'c');
+
+				if (is_resource($handle))
+				{
+					fclose($handle);
+					return true;
+				}
+			}
+		}
+		else
+		{
+			// file does not exist test if we can write to the directory
+			$dir = dirname($file);
+
+			if (file_exists($dir) && is_dir($dir) && $this->phpbb_is_writable($dir))
+			{
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	 * Try to resolve real path when PHP's realpath failes to do so
+	 *
+	 * @param string	$path
+	 * @return bool|string
+	 */
+	protected function phpbb_own_realpath($path)
+	{
+		// Replace all directory separators with '/'
+		$path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
+
+		$is_absolute_path = false;
+		$path_prefix = '';
+
+		if ($this->is_absolute_path($path))
+		{
+			$is_absolute_path = true;
+		}
+		else
+		{
+			// Resolve working directory and store it
+			if (is_null($this->working_directory))
+			{
+				if (function_exists('getcwd'))
+				{
+					$this->working_directory = str_replace(DIRECTORY_SEPARATOR, '/', getcwd());
+				}
+
+				//
+				// From this point on we really just guessing
+				// If chdir were called we screwed
+				//
+				else if (function_exists('debug_backtrace'))
+				{
+					$call_stack = debug_backtrace(0);
+					$this->working_directory = str_replace(DIRECTORY_SEPARATOR, '/', dirname($call_stack[sizeof($call_stack) - 1]['file']));
+				}
+				else
+				{
+					//
+					// Assuming that the working directory is phpBB root
+					// we could use this as a fallback, when phpBB will use controllers
+					// everywhere this will be a safe assumption
+					//
+					//$dir_parts = explode(DIRECTORY_SEPARATOR, __DIR__);
+					//$namespace_parts = explode('\\', trim(__NAMESPACE__, '\\'));
+
+					//$namespace_part_count = sizeof($namespace_parts);
+
+					// Check if we still loading from root
+					//if (array_slice($dir_parts, -$namespace_part_count) === $namespace_parts)
+					//{
+					//	$this->working_directory = implode('/', array_slice($dir_parts, 0, -$namespace_part_count));
+					//}
+					//else
+					//{
+					//	$this->working_directory = false;
+					//}
+
+					$this->working_directory = false;
+				}
+			}
+
+			if ($this->working_directory !== false)
+			{
+				$is_absolute_path = true;
+				$path = $this->working_directory . '/' . $path;
+			}
+		}
+
+		if ($is_absolute_path)
+		{
+			if (defined('PHP_WINDOWS_VERSION_MAJOR'))
+			{
+				$path_prefix = $path[0] . ':';
+				$path = substr($path, 2);
+			}
+			else
+			{
+				$path_prefix = '';
+			}
+		}
+
+		$resolved_path = $this->resolve_path($path, $path_prefix, $is_absolute_path);
+		if ($resolved_path === false)
+		{
+			return false;
+		}
+
+		if (!@file_exists($resolved_path) || (!@is_dir($resolved_path . '/') && !is_file($resolved_path)))
+		{
+			return false;
+		}
+
+		// Return OS specific directory separators
+		$resolved = str_replace('/', DIRECTORY_SEPARATOR, $resolved_path);
+
+		// Check for DIRECTORY_SEPARATOR at the end (and remove it!)
+		if (substr($resolved, -1) === DIRECTORY_SEPARATOR)
+		{
+			return substr($resolved, 0, -1);
+		}
+
+		return $resolved;
+	}
+
+	/**
+	 * Convert file(s) to \Traversable object
+	 *
+	 * This is the same function as Symfony's toIterator, but that is private
+	 * so we cannot use it.
+	 *
+	 * @param string|array|\Traversable	$files	filename/list of filenames
+	 * @return \Traversable
+	 */
+	protected function to_iterator($files)
+	{
+		if (!$files instanceof \Traversable)
+		{
+			$files = new \ArrayObject(is_array($files) ? $files : array($files));
+		}
+
+		return $files;
+	}
+
+	/**
+	 * Try to resolve symlinks in path
+	 *
+	 * @param string	$path			The path to resolve
+	 * @param string	$prefix			The path prefix (on windows the drive letter)
+	 * @param bool 		$absolute		Whether or not the path is absolute
+	 * @param bool		$return_array	Whether or not to return path parts
+	 *
+	 * @return string|array|bool	returns the resolved path or an array of parts of the path if $return_array is true
+	 * 								or false if path cannot be resolved
+	 */
+	protected function resolve_path($path, $prefix = '', $absolute = false, $return_array = false)
+	{
+		if ($return_array)
+		{
+			$path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
+		}
+
+		trim ($path, '/');
+		$path_parts = explode('/', $path);
+		$resolved = array();
+		$resolved_path = $prefix;
+		$file_found = false;
+
+		foreach ($path_parts as $path_part)
+		{
+			if ($file_found)
+			{
+				return false;
+			}
+
+			if (empty($path_part) || ($path_part === '.' && ($absolute || !empty($resolved))))
+			{
+				continue;
+			}
+			else if ($absolute && $path_part === '..')
+			{
+				if (empty($resolved))
+				{
+					// No directories above root
+					return false;
+				}
+
+				array_pop($resolved);
+				$resolved_path = false;
+			}
+			else if ($path_part === '..' && !empty($resolved) && !in_array($resolved[sizeof($resolved) - 1], array('.', '..')))
+			{
+				array_pop($resolved);
+				$resolved_path = false;
+			}
+			else
+			{
+				if ($resolved_path === false)
+				{
+					if (empty($resolved))
+					{
+						$resolved_path = ($absolute) ? $prefix . '/' . $path_part : $path_part;
+					}
+					else
+					{
+						$tmp_array = $resolved;
+						if ($absolute)
+						{
+							array_unshift($tmp_array, $prefix);
+						}
+
+						$resolved_path = implode('/', $tmp_array);
+					}
+				}
+
+				$current_path = $resolved_path . '/' . $path_part;
+
+				// Resolve symlinks
+				if (is_link($current_path))
+				{
+					if (!function_exists('readlink'))
+					{
+						return false;
+					}
+
+					$link = readlink($current_path);
+
+					// Is link has an absolute path in it?
+					if ($this->is_absolute_path($link))
+					{
+						if (defined('PHP_WINDOWS_VERSION_MAJOR'))
+						{
+							$prefix = $link[0] . ':';
+							$link = substr($link, 2);
+						}
+						else
+						{
+							$prefix = '';
+						}
+
+						$resolved = $this->resolve_path($link, $prefix, true, true);
+						$absolute = true;
+					}
+					else
+					{
+						$resolved = $this->resolve_path($resolved_path . '/' . $link, $prefix, $absolute, true);
+					}
+
+					if (!$resolved)
+					{
+						return false;
+					}
+
+					$resolved_path = false;
+				}
+				else if (is_dir($current_path . '/'))
+				{
+					$resolved[] = $path_part;
+					$resolved_path = $current_path;
+				}
+				else if (is_file($current_path))
+				{
+					$resolved[] = $path_part;
+					$resolved_path = $current_path;
+					$file_found = true;
+				}
+				else
+				{
+					return false;
+				}
+			}
+		}
+
+		// If at the end of the path there were a .. or .
+		// we need to build the path again.
+		// Only doing this when a string is expected in return
+		if ($resolved_path === false && $return_array === false)
+		{
+			if (empty($resolved))
+			{
+				$resolved_path = ($absolute) ? $prefix . '/' : './';
+			}
+			else
+			{
+				$tmp_array = $resolved;
+				if ($absolute)
+				{
+					array_unshift($tmp_array, $prefix);
+				}
+
+				$resolved_path = implode('/', $tmp_array);
+			}
+		}
+
+		return ($return_array) ? $resolved : $resolved_path;
+	}
+}
--- /dev/null
+++ b/phpbb/filesystem/filesystem_interface.php
@@ -0,0 +1,284 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\filesystem;
+
+/**
+ * Interface for phpBB's filesystem service
+ */
+interface filesystem_interface
+{
+	/**
+	 * chmod all permissions flag
+	 *
+	 * @var int
+	 */
+	const CHMOD_ALL = 7;
+
+	/**
+	 * chmod read permissions flag
+	 *
+	 * @var int
+	 */
+	const CHMOD_READ = 4;
+
+	/**
+	 * chmod write permissions flag
+	 *
+	 * @var int
+	 */
+	const CHMOD_WRITE = 2;
+
+	/**
+	 * chmod execute permissions flag
+	 *
+	 * @var int
+	 */
+	const CHMOD_EXECUTE = 1;
+
+	/**
+	 * Change owner group of files/directories
+	 *
+	 * @param string|array|\Traversable	$files		The file(s)/directorie(s) to change group
+	 * @param string					$group		The group that should own the files/directories
+	 * @param bool 						$recursive	If the group should be changed recursively
+	 * @throws \phpbb\filesystem\exception\filesystem_exception	the filename which triggered the error can be
+	 * 															retrieved by filesystem_exception::get_filename()
+	 */
+	public function chgrp($files, $group, $recursive = false);
+
+	/**
+	 * Global function for chmodding directories and files for internal use
+	 *
+	 * The function accepts filesystem_interface::CHMOD_ flags in the permission argument
+	 * or the user can specify octal values (or any integer if it makes sense). All directories will have
+	 * an execution bit appended, if the user group (owner, group or other) has any bit specified.
+	 *
+	 * @param string|array|\Traversable	$files				The file/directory to be chmodded
+	 * @param int						$perms				Permissions to set
+	 * @param bool						$recursive			If the permissions should be changed recursively
+	 * @param bool						$force_chmod_link	Try to apply permissions to symlinks as well
+	 *
+	 * @throws \phpbb\filesystem\exception\filesystem_exception	the filename which triggered the error can be
+	 * 															retrieved by filesystem_exception::get_filename()
+	 */
+	public function chmod($files, $perms = null, $recursive = false, $force_chmod_link = false);
+
+	/**
+	 * Change owner group of files/directories
+	 *
+	 * @param string|array|\Traversable	$files		The file(s)/directorie(s) to change group
+	 * @param string					$user		The owner user name
+	 * @param bool 						$recursive	Whether change the owner recursively or not
+	 *
+	 * @throws \phpbb\filesystem\exception\filesystem_exception	the filename which triggered the error can be
+	 * 															retrieved by filesystem_exception::get_filename()
+	 */
+	public function chown($files, $user, $recursive = false);
+
+	/**
+	 * Eliminates useless . and .. components from specified path.
+	 *
+	 * @param string $path Path to clean
+	 *
+	 * @return string Cleaned path
+	 */
+	public function clean_path($path);
+
+	/**
+	 * Copies a file.
+	 *
+	 * This method only copies the file if the origin file is newer than the target file.
+	 *
+	 * By default, if the target already exists, it is not overridden.
+	 *
+	 * @param string	$origin_file	The original filename
+	 * @param string	$target_file	The target filename
+	 * @param bool		$override		Whether to override an existing file or not
+	 *
+	 * @throws \phpbb\filesystem\exception\filesystem_exception When the file cannot be copied
+	 */
+	public function copy($origin_file, $target_file, $override = false);
+
+	/**
+	 * Atomically dumps content into a file.
+	 *
+	 * @param string	$filename	The file to be written to.
+	 * @param string	$content	The data to write into the file.
+	 *
+	 * @throws \phpbb\filesystem\exception\filesystem_exception When the file cannot be written
+	 */
+	public function dump_file($filename, $content);
+
+	/**
+	 * Checks the existence of files or directories.
+	 *
+	 * @param string|array|\Traversable	$files	files/directories to check
+	 *
+	 * @return bool	Returns true if all files/directories exist, false otherwise
+	 */
+	public function exists($files);
+
+	/**
+	 * Checks if a path is absolute or not
+	 *
+	 * @param string	$path	Path to check
+	 *
+	 * @return	bool	true if the path is absolute, false otherwise
+	 */
+	public function is_absolute_path($path);
+
+	/**
+	 * Checks if files/directories are readable
+	 *
+	 * @param string|array|\Traversable	$files		files/directories to check
+	 * @param bool						$recursive	Whether or not directories should be checked recursively
+	 *
+	 * @return bool True when the files/directories are readable, otherwise false.
+	 */
+	public function is_readable($files, $recursive = false);
+
+	/**
+	 * Test if a file/directory is writable
+	 *
+	 * @param string|array|\Traversable	$files		files/directories to perform write test on
+	 * @param bool						$recursive	Whether or not directories should be checked recursively
+	 *
+	 * @return bool True when the files/directories are writable, otherwise false.
+	 */
+	public function is_writable($files, $recursive = false);
+
+	/**
+	 * Given an existing path, convert it to a path relative to a given starting path
+	 *
+	 * @param string $end_path		Absolute path of target
+	 * @param string $start_path	Absolute path where traversal begins
+	 *
+	 * @return string Path of target relative to starting path
+	 */
+	public function make_path_relative($end_path, $start_path);
+
+	/**
+	 * Mirrors a directory to another.
+	 *
+	 * @param string		$origin_dir	The origin directory
+	 * @param string		$target_dir	The target directory
+	 * @param \Traversable	$iterator	A Traversable instance
+	 * @param array			$options	An array of boolean options
+	 *									Valid options are:
+	 *										- $options['override'] Whether to override an existing file on copy or not (see copy())
+	 *										- $options['copy_on_windows'] Whether to copy files instead of links on Windows (see symlink())
+	 *										- $options['delete'] Whether to delete files that are not in the source directory (defaults to false)
+	 *
+	 * @throws \phpbb\filesystem\exception\filesystem_exception When the file cannot be copied.
+	 * 															The filename which triggered the error can be
+	 * 															retrieved by filesystem_exception::get_filename()
+	 */
+	public function mirror($origin_dir, $target_dir, \Traversable $iterator = null, $options = array());
+
+	/**
+	 * Creates a directory recursively.
+	 *
+	 * @param string|array|\Traversable	$dirs	The directory path
+	 * @param int						$mode	The directory mode
+	 *
+	 * @throws \phpbb\filesystem\exception\filesystem_exception On any directory creation failure
+	 * 															The filename which triggered the error can be
+	 * 															retrieved by filesystem_exception::get_filename()
+	 */
+	public function mkdir($dirs, $mode = 0777);
+
+	/**
+	 * Global function for chmodding directories and files for internal use
+	 *
+	 * This function determines owner and group whom the file belongs to and user and group of PHP and then set safest possible file permissions.
+	 * The function determines owner and group from common.php file and sets the same to the provided file.
+	 * The function uses bit fields to build the permissions.
+	 * The function sets the appropiate execute bit on directories.
+	 *
+	 * Supported constants representing bit fields are:
+	 *
+	 * filesystem_interface::CHMOD_ALL - all permissions (7)
+	 * filesystem_interface::CHMOD_READ - read permission (4)
+	 * filesystem_interface::CHMOD_WRITE - write permission (2)
+	 * filesystem_interface::CHMOD_EXECUTE - execute permission (1)
+	 *
+	 * NOTE: The function uses POSIX extension and fileowner()/filegroup() functions. If any of them is disabled, this function tries to build proper permissions, by calling is_readable() and is_writable() functions.
+	 *
+	 * @param string|array|\Traversable	$file				The file/directory to be chmodded
+	 * @param int						$perms				Permissions to set
+	 * @param bool						$recursive			If the permissions should be changed recursively
+	 * @param bool						$force_chmod_link	Try to apply permissions to symlinks as well
+	 *
+	 * @throws \phpbb\filesystem\exception\filesystem_exception	the filename which triggered the error can be
+	 * 															retrieved by filesystem_exception::get_filename()
+	 */
+	public function phpbb_chmod($file, $perms = null, $recursive = false, $force_chmod_link = false);
+
+	/**
+	 * A wrapper for PHP's realpath
+	 *
+	 * Try to resolve realpath when PHP's realpath is not available, or
+	 * known to be buggy.
+	 *
+	 * @param string	$path	Path to resolve
+	 *
+	 * @return string	Resolved path
+	 */
+	public function realpath($path);
+
+	/**
+	 * Removes files or directories.
+	 *
+	 * @param string|array|\Traversable	$files	A filename, an array of files, or a \Traversable instance to remove
+	 *
+	 * @throws \phpbb\filesystem\exception\filesystem_exception When removal fails.
+	 * 															The filename which triggered the error can be
+	 * 															retrieved by filesystem_exception::get_filename()
+	 */
+	public function remove($files);
+
+	/**
+	 * Renames a file or a directory.
+	 *
+	 * @param string	$origin		The origin filename or directory
+	 * @param string	$target		The new filename or directory
+	 * @param bool		$overwrite	Whether to overwrite the target if it already exists
+	 *
+	 * @throws \phpbb\filesystem\exception\filesystem_exception	When target file or directory already exists,
+	 * 															or origin cannot be renamed.
+	 */
+	public function rename($origin, $target, $overwrite = false);
+
+	/**
+	 * Creates a symbolic link or copy a directory.
+	 *
+	 * @param string	$origin_dir			The origin directory path
+	 * @param string	$target_dir			The symbolic link name
+	 * @param bool		$copy_on_windows	Whether to copy files if on Windows
+	 *
+	 * @throws \phpbb\filesystem\exception\filesystem_exception When symlink fails
+	 */
+	public function symlink($origin_dir, $target_dir, $copy_on_windows = false);
+
+	/**
+	 * Sets access and modification time of file.
+	 *
+	 * @param string|array|\Traversable	$files			A filename, an array of files, or a \Traversable instance to create
+	 * @param int						$time			The touch time as a Unix timestamp
+	 * @param int						$access_time	The access time as a Unix timestamp
+	 *
+	 * @throws \phpbb\filesystem\exception\filesystem_exception	When touch fails
+	 */
+	public function touch($files, $time = null, $access_time = null);
+}
--- a/phpbb/finder.php
+++ b/phpbb/finder.php
@@ -48,14 +48,14 @@ class finder
 	/**
 	* Creates a new finder instance with its dependencies
 	*
-	* @param \phpbb\filesystem $filesystem Filesystem instance
+	* @param \phpbb\filesystem\filesystem_interface $filesystem Filesystem instance
 	* @param string $phpbb_root_path Path to the phpbb root directory
-	* @param \phpbb\cache\driver\driver_interface $cache A cache instance or null
+	* @param \phpbb\cache\service $cache A cache instance or null
 	* @param string $php_ext php file extension
 	* @param string $cache_name The name of the cache variable, defaults to
 	*                           _ext_finder
 	*/
-	public function __construct(\phpbb\filesystem $filesystem, $phpbb_root_path = '', \phpbb\cache\driver\driver_interface $cache = null, $php_ext = 'php', $cache_name = '_ext_finder')
+	public function __construct(\phpbb\filesystem\filesystem_interface $filesystem, $phpbb_root_path = '', \phpbb\cache\service $cache = null, $php_ext = 'php', $cache_name = '_ext_finder')
 	{
 		$this->filesystem = $filesystem;
 		$this->phpbb_root_path = $phpbb_root_path;
--- /dev/null
+++ b/phpbb/group/helper.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\group;
+
+class helper
+{
+	/** @var  \phpbb\language\language */
+	protected $language;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\language\language $language	Language object
+	 */
+	public function __construct(\phpbb\language\language $language)
+	{
+		$this->language = $language;
+	}
+
+	/**
+	 * @param $group_name string	The stored group name
+	 *
+	 * @return string		Group name or translated group name if it exists
+	 */
+	public function get_name($group_name)
+	{
+		return $this->language->is_set('G_' . utf8_strtoupper($group_name)) ? $this->language->lang('G_' . utf8_strtoupper($group_name)) : $group_name;
+	}
+}
--- /dev/null
+++ b/phpbb/help/controller/bbcode.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\help\controller;
+
+/**
+ * BBCode help page
+ */
+class bbcode extends controller
+{
+	/**
+	 * @return string The title of the page
+	 */
+	public function display()
+	{
+		$this->language->add_lang('help/bbcode');
+
+		$this->manager->add_block(
+			'HELP_BBCODE_BLOCK_INTRO',
+			false,
+			array(
+				'HELP_BBCODE_INTRO_BBCODE_QUESTION' => 'HELP_BBCODE_INTRO_BBCODE_ANSWER',
+			)
+		);
+		$this->manager->add_block(
+			'HELP_BBCODE_BLOCK_TEXT',
+			false,
+			array(
+				'HELP_BBCODE_TEXT_BASIC_QUESTION' => 'HELP_BBCODE_TEXT_BASIC_ANSWER',
+				'HELP_BBCODE_TEXT_COLOR_QUESTION' => 'HELP_BBCODE_TEXT_COLOR_ANSWER',
+				'HELP_BBCODE_TEXT_COMBINE_QUESTION' => 'HELP_BBCODE_TEXT_COMBINE_ANSWER',
+			)
+		);
+		$this->manager->add_block(
+			'HELP_BBCODE_BLOCK_QUOTES',
+			false,
+			array(
+				'HELP_BBCODE_QUOTES_TEXT_QUESTION' => 'HELP_BBCODE_QUOTES_TEXT_ANSWER',
+				'HELP_BBCODE_QUOTES_CODE_QUESTION' => 'HELP_BBCODE_QUOTES_CODE_ANSWER',
+			)
+		);
+		$this->manager->add_block(
+			'HELP_BBCODE_BLOCK_LISTS',
+			false,
+			array(
+				'HELP_BBCODE_LISTS_UNORDERER_QUESTION' => 'HELP_BBCODE_LISTS_UNORDERER_ANSWER',
+				'HELP_BBCODE_LISTS_ORDERER_QUESTION' => 'HELP_BBCODE_LISTS_ORDERER_ANSWER',
+			)
+		);
+		$this->manager->add_block(
+			'HELP_BBCODE_BLOCK_LINKS',
+			true,
+			array(
+				'HELP_BBCODE_LINKS_BASIC_QUESTION' => 'HELP_BBCODE_LINKS_BASIC_ANSWER',
+			)
+		);
+		$this->manager->add_block(
+			'HELP_BBCODE_BLOCK_IMAGES',
+			false,
+			array(
+				'HELP_BBCODE_IMAGES_BASIC_QUESTION' => 'HELP_BBCODE_IMAGES_BASIC_ANSWER',
+				'HELP_BBCODE_IMAGES_ATTACHMENT_QUESTION' => 'HELP_BBCODE_IMAGES_ATTACHMENT_ANSWER',
+			)
+		);
+		$this->manager->add_block(
+			'HELP_BBCODE_BLOCK_OTHERS',
+			false,
+			array(
+				'HELP_BBCODE_OTHERS_CUSTOM_QUESTION' => 'HELP_BBCODE_OTHERS_CUSTOM_ANSWER',
+			)
+		);
+
+		return $this->language->lang('BBCODE_GUIDE');
+	}
+}
--- /dev/null
+++ b/phpbb/help/controller/controller.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\help\controller;
+
+/**
+ * BBCode help page
+ */
+abstract class controller
+{
+	/** @var \phpbb\controller\helper */
+	protected $helper;
+
+	/** @var \phpbb\help\manager */
+	protected $manager;
+
+	/** @var \phpbb\template\template */
+	protected $template;
+
+	/** @var \phpbb\language\language */
+	protected $language;
+
+	/** @var string */
+	protected $root_path;
+
+	/** @var string */
+	protected $php_ext;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\controller\helper	$helper
+	 * @param \phpbb\help\manager		$manager
+	 * @param \phpbb\template\template	$template
+	 * @param \phpbb\language\language	$language
+	 * @param string					$root_path
+	 * @param string					$php_ext
+	 */
+	public function __construct(\phpbb\controller\helper $helper, \phpbb\help\manager $manager, \phpbb\template\template $template, \phpbb\language\language $language, $root_path, $php_ext)
+	{
+		$this->helper = $helper;
+		$this->manager = $manager;
+		$this->template = $template;
+		$this->language = $language;
+		$this->root_path = $root_path;
+		$this->php_ext = $php_ext;
+	}
+
+	/**
+	 * @return string
+	 */
+	abstract protected function display();
+
+	public function handle()
+	{
+		$title = $this->display();
+
+		$this->template->assign_vars(array(
+			'L_FAQ_TITLE'	=> $title,
+			'S_IN_FAQ'		=> true,
+		));
+
+		make_jumpbox(append_sid("{$this->root_path}viewforum.{$this->php_ext}"));
+		return $this->helper->render('faq_body.html', $title);
+	}
+}
--- /dev/null
+++ b/phpbb/help/controller/faq.php
@@ -0,0 +1,165 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\help\controller;
+
+/**
+ * FAQ help page
+ */
+class faq extends controller
+{
+	/**
+	 * @return string The title of the page
+	 */
+	public function display()
+	{
+		$this->language->add_lang('help/faq');
+
+		$this->manager->add_block(
+			'HELP_FAQ_BLOCK_LOGIN',
+			false,
+			array(
+				'HELP_FAQ_LOGIN_REGISTER_QUESTION' => 'HELP_FAQ_LOGIN_REGISTER_ANSWER',
+				'HELP_FAQ_LOGIN_COPPA_QUESTION' => 'HELP_FAQ_LOGIN_COPPA_ANSWER',
+				'HELP_FAQ_LOGIN_CANNOT_REGISTER_QUESTION' => 'HELP_FAQ_LOGIN_CANNOT_REGISTER_ANSWER',
+				'HELP_FAQ_LOGIN_REGISTER_CONFIRM_QUESTION' => 'HELP_FAQ_LOGIN_REGISTER_CONFIRM_ANSWER',
+				'HELP_FAQ_LOGIN_CANNOT_LOGIN_QUESTION' => 'HELP_FAQ_LOGIN_CANNOT_LOGIN_ANSWER',
+				'HELP_FAQ_LOGIN_CANNOT_LOGIN_ANYMORE_QUESTION' => 'HELP_FAQ_LOGIN_CANNOT_LOGIN_ANYMORE_ANSWER',
+				'HELP_FAQ_LOGIN_LOST_PASSWORD_QUESTION' => 'HELP_FAQ_LOGIN_LOST_PASSWORD_ANSWER',
+				'HELP_FAQ_LOGIN_AUTO_LOGOUT_QUESTION' => 'HELP_FAQ_LOGIN_AUTO_LOGOUT_ANSWER',
+				'HELP_FAQ_LOGIN_DELETE_COOKIES_QUESTION' => 'HELP_FAQ_LOGIN_DELETE_COOKIES_ANSWER',
+			)
+		);
+		$this->manager->add_block(
+			'HELP_FAQ_BLOCK_USERSETTINGS',
+			false,
+			array(
+				'HELP_FAQ_USERSETTINGS_CHANGE_SETTINGS_QUESTION' => 'HELP_FAQ_USERSETTINGS_CHANGE_SETTINGS_ANSWER',
+				'HELP_FAQ_USERSETTINGS_HIDE_ONLINE_QUESTION' => 'HELP_FAQ_USERSETTINGS_HIDE_ONLINE_ANSWER',
+				'HELP_FAQ_USERSETTINGS_TIMEZONE_QUESTION' => 'HELP_FAQ_USERSETTINGS_TIMEZONE_ANSWER',
+				'HELP_FAQ_USERSETTINGS_SERVERTIME_QUESTION' => 'HELP_FAQ_USERSETTINGS_SERVERTIME_ANSWER',
+				'HELP_FAQ_USERSETTINGS_LANGUAGE_QUESTION' => 'HELP_FAQ_USERSETTINGS_LANGUAGE_ANSWER',
+				'HELP_FAQ_USERSETTINGS_AVATAR_QUESTION' => 'HELP_FAQ_USERSETTINGS_AVATAR_ANSWER',
+				'HELP_FAQ_USERSETTINGS_AVATAR_DISPLAY_QUESTION' => 'HELP_FAQ_USERSETTINGS_AVATAR_DISPLAY_ANSWER',
+				'HELP_FAQ_USERSETTINGS_RANK_QUESTION' => 'HELP_FAQ_USERSETTINGS_RANK_ANSWER',
+				'HELP_FAQ_USERSETTINGS_EMAIL_LOGIN_QUESTION' => 'HELP_FAQ_USERSETTINGS_EMAIL_LOGIN_ANSWER',
+			)
+		);
+		$this->manager->add_block(
+			'HELP_FAQ_BLOCK_POSTING',
+			false,
+			array(
+				'HELP_FAQ_POSTING_CREATE_QUESTION' => 'HELP_FAQ_POSTING_CREATE_ANSWER',
+				'HELP_FAQ_POSTING_EDIT_DELETE_QUESTION' => 'HELP_FAQ_POSTING_EDIT_DELETE_ANSWER',
+				'HELP_FAQ_POSTING_SIGNATURE_QUESTION' => 'HELP_FAQ_POSTING_SIGNATURE_ANSWER',
+				'HELP_FAQ_POSTING_POLL_CREATE_QUESTION' => 'HELP_FAQ_POSTING_POLL_CREATE_ANSWER',
+				'HELP_FAQ_POSTING_POLL_ADD_QUESTION' => 'HELP_FAQ_POSTING_POLL_ADD_ANSWER',
+				'HELP_FAQ_POSTING_POLL_EDIT_QUESTION' => 'HELP_FAQ_POSTING_POLL_EDIT_ANSWER',
+				'HELP_FAQ_POSTING_FORUM_RESTRICTED_QUESTION' => 'HELP_FAQ_POSTING_FORUM_RESTRICTED_ANSWER',
+				'HELP_FAQ_POSTING_NO_ATTACHMENTS_QUESTION' => 'HELP_FAQ_POSTING_NO_ATTACHMENTS_ANSWER',
+				'HELP_FAQ_POSTING_WARNING_QUESTION' => 'HELP_FAQ_POSTING_WARNING_ANSWER',
+				'HELP_FAQ_POSTING_REPORT_QUESTION' => 'HELP_FAQ_POSTING_REPORT_ANSWER',
+				'HELP_FAQ_POSTING_DRAFT_QUESTION' => 'HELP_FAQ_POSTING_DRAFT_ANSWER',
+				'HELP_FAQ_POSTING_QUEUE_QUESTION' => 'HELP_FAQ_POSTING_QUEUE_ANSWER',
+				'HELP_FAQ_POSTING_BUMP_QUESTION' => 'HELP_FAQ_POSTING_BUMP_ANSWER',
+			)
+		);
+		$this->manager->add_block(
+			'HELP_FAQ_BLOCK_FORMATTING',
+			false,
+			array(
+				'HELP_FAQ_FORMATTING_BBOCDE_QUESTION' => 'HELP_FAQ_FORMATTING_BBOCDE_ANSWER',
+				'HELP_FAQ_FORMATTING_HTML_QUESTION' => 'HELP_FAQ_FORMATTING_HTML_ANSWER',
+				'HELP_FAQ_FORMATTING_SMILIES_QUESTION' => 'HELP_FAQ_FORMATTING_SMILIES_ANSWER',
+				'HELP_FAQ_FORMATTING_IMAGES_QUESTION' => 'HELP_FAQ_FORMATTING_IMAGES_ANSWER',
+				'HELP_FAQ_FORMATTING_GLOBAL_ANNOUNCE_QUESTION' => 'HELP_FAQ_FORMATTING_GLOBAL_ANNOUNCE_ANSWER',
+				'HELP_FAQ_FORMATTING_ANNOUNCEMENT_QUESTION' => 'HELP_FAQ_FORMATTING_ANNOUNCEMENT_ANSWER',
+				'HELP_FAQ_FORMATTING_STICKIES_QUESTION' => 'HELP_FAQ_FORMATTING_STICKIES_ANSWER',
+				'HELP_FAQ_FORMATTING_LOCKED_QUESTION' => 'HELP_FAQ_FORMATTING_LOCKED_ANSWER',
+				'HELP_FAQ_FORMATTING_ICONS_QUESTION' => 'HELP_FAQ_FORMATTING_ICONS_ANSWER',
+			)
+		);
+		$this->manager->add_block(
+			'HELP_FAQ_BLOCK_GROUPS',
+			true,
+			array(
+				'HELP_FAQ_GROUPS_ADMINISTRATORS_QUESTION' => 'HELP_FAQ_GROUPS_ADMINISTRATORS_ANSWER',
+				'HELP_FAQ_GROUPS_MODERATORS_QUESTION' => 'HELP_FAQ_GROUPS_MODERATORS_ANSWER',
+				'HELP_FAQ_GROUPS_USERGROUPS_QUESTION' => 'HELP_FAQ_GROUPS_USERGROUPS_ANSWER',
+				'HELP_FAQ_GROUPS_USERGROUPS_JOIN_QUESTION' => 'HELP_FAQ_GROUPS_USERGROUPS_JOIN_ANSWER',
+				'HELP_FAQ_GROUPS_USERGROUPS_LEAD_QUESTION' => 'HELP_FAQ_GROUPS_USERGROUPS_LEAD_ANSWER',
+				'HELP_FAQ_GROUPS_COLORS_QUESTION' => 'HELP_FAQ_GROUPS_COLORS_ANSWER',
+				'HELP_FAQ_GROUPS_DEFAULT_QUESTION' => 'HELP_FAQ_GROUPS_DEFAULT_ANSWER',
+				'HELP_FAQ_GROUPS_TEAM_QUESTION' => 'HELP_FAQ_GROUPS_TEAM_ANSWER',
+			)
+		);
+		$this->manager->add_block(
+			'HELP_FAQ_BLOCK_PMS',
+			false,
+			array(
+				'HELP_FAQ_PMS_CANNOT_SEND_QUESTION' => 'HELP_FAQ_PMS_CANNOT_SEND_ANSWER',
+				'HELP_FAQ_PMS_UNWANTED_QUESTION' => 'HELP_FAQ_PMS_UNWANTED_ANSWER',
+				'HELP_FAQ_PMS_SPAM_QUESTION' => 'HELP_FAQ_PMS_SPAM_ANSWER',
+			)
+		);
+		$this->manager->add_block(
+			'HELP_FAQ_BLOCK_FRIENDS',
+			false,
+			array(
+				'HELP_FAQ_FRIENDS_BASIC_QUESTION' => 'HELP_FAQ_FRIENDS_BASIC_ANSWER',
+				'HELP_FAQ_FRIENDS_MANAGE_QUESTION' => 'HELP_FAQ_FRIENDS_MANAGE_ANSWER',
+			)
+		);
+		$this->manager->add_block(
+			'HELP_FAQ_BLOCK_SEARCH',
+			false,
+			array(
+				'HELP_FAQ_SEARCH_FORUM_QUESTION' => 'HELP_FAQ_SEARCH_FORUM_ANSWER',
+				'HELP_FAQ_SEARCH_NO_RESULT_QUESTION' => 'HELP_FAQ_SEARCH_NO_RESULT_ANSWER',
+				'HELP_FAQ_SEARCH_BLANK_QUESTION' => 'HELP_FAQ_SEARCH_BLANK_ANSWER',
+				'HELP_FAQ_SEARCH_MEMBERS_QUESTION' => 'HELP_FAQ_SEARCH_MEMBERS_ANSWER',
+				'HELP_FAQ_SEARCH_OWN_QUESTION' => 'HELP_FAQ_SEARCH_OWN_ANSWER',
+			)
+		);
+		$this->manager->add_block(
+			'HELP_FAQ_BLOCK_BOOKMARKS',
+			false,
+			array(
+				'HELP_FAQ_BOOKMARKS_DIFFERENCE_QUESTION' => 'HELP_FAQ_BOOKMARKS_DIFFERENCE_ANSWER',
+				'HELP_FAQ_BOOKMARKS_TOPIC_QUESTION' => 'HELP_FAQ_BOOKMARKS_TOPIC_ANSWER',
+				'HELP_FAQ_BOOKMARKS_FORUM_QUESTION' => 'HELP_FAQ_BOOKMARKS_FORUM_ANSWER',
+				'HELP_FAQ_BOOKMARKS_REMOVE_QUESTION' => 'HELP_FAQ_BOOKMARKS_REMOVE_ANSWER',
+			)
+		);
+		$this->manager->add_block(
+			'HELP_FAQ_BLOCK_ATTACHMENTS',
+			false,
+			array(
+				'HELP_FAQ_ATTACHMENTS_ALLOWED_QUESTION' => 'HELP_FAQ_ATTACHMENTS_ALLOWED_ANSWER',
+				'HELP_FAQ_ATTACHMENTS_OWN_QUESTION' => 'HELP_FAQ_ATTACHMENTS_OWN_ANSWER',
+			)
+		);
+		$this->manager->add_block(
+			'HELP_FAQ_BLOCK_ISSUES',
+			false,
+			array(
+				'HELP_FAQ_ISSUES_WHOIS_PHPBB_QUESTION' => 'HELP_FAQ_ISSUES_WHOIS_PHPBB_ANSWER',
+				'HELP_FAQ_ISSUES_FEATURE_QUESTION' => 'HELP_FAQ_ISSUES_FEATURE_ANSWER',
+				'HELP_FAQ_ISSUES_LEGAL_QUESTION' => 'HELP_FAQ_ISSUES_LEGAL_ANSWER',
+				'HELP_FAQ_ISSUES_ADMIN_QUESTION' => 'HELP_FAQ_ISSUES_ADMIN_ANSWER',
+			)
+		);
+
+		return $this->language->lang('FAQ_EXPLAIN');
+	}
+}
--- /dev/null
+++ b/phpbb/help/controller/help.php
@@ -0,0 +1,160 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\help\controller;
+
+use phpbb\exception\http_exception;
+
+class help
+{
+	/** @var \phpbb\controller\helper */
+	protected $helper;
+
+	/** @var \phpbb\event\dispatcher_interface  */
+	protected $dispatcher;
+
+	/** @var \phpbb\template\template */
+	protected $template;
+
+	/** @var \phpbb\user */
+	protected $user;
+
+	/** @var string */
+	protected $root_path;
+
+	/** @var string */
+	protected $php_ext;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\controller\helper	$helper
+	 * @param \phpbb\event\dispatcher_interface	$dispatcher
+	 * @param \phpbb\template\template	$template
+	 * @param \phpbb\user				$user
+	 * @param string					$root_path
+	 * @param string					$php_ext
+	 */
+	public function __construct(\phpbb\controller\helper $helper, \phpbb\event\dispatcher_interface $dispatcher, \phpbb\template\template $template, \phpbb\user $user, $root_path, $php_ext)
+	{
+		$this->helper = $helper;
+		$this->dispatcher = $dispatcher;
+		$this->template = $template;
+		$this->user = $user;
+		$this->root_path = $root_path;
+		$this->php_ext = $php_ext;
+	}
+
+	/**
+	 * Controller for /help/{mode} routes
+	 *
+	 * @param string		$mode
+	 * @return \Symfony\Component\HttpFoundation\Response A Symfony Response object
+	 * @throws http_exception when the $mode is not known by any extension
+	 */
+	public function handle($mode)
+	{
+		switch ($mode)
+		{
+			case 'faq':
+			case 'bbcode':
+				$page_title = ($mode === 'faq') ? $this->user->lang['FAQ_EXPLAIN'] : $this->user->lang['BBCODE_GUIDE'];
+				$this->user->add_lang($mode, false, true);
+			break;
+
+			default:
+				$page_title = $this->user->lang['FAQ_EXPLAIN'];
+				$ext_name = $lang_file = '';
+
+				/**
+				 * You can use this event display a custom help page
+				 *
+				 * @event core.faq_mode_validation
+				 * @var	string	page_title		Title of the page
+				 * @var	string	mode			FAQ that is going to be displayed
+				 * @var	string	lang_file		Language file containing the help data
+				 * @var	string	ext_name		Vendor and extension name where the help
+				 *								language file can be loaded from
+				 * @since 3.1.4-RC1
+				 */
+				$vars = array(
+					'page_title',
+					'mode',
+					'lang_file',
+					'ext_name',
+				);
+				extract($this->dispatcher->trigger_event('core.faq_mode_validation', compact($vars)));
+
+				if ($ext_name === '' || $lang_file === '')
+				{
+					throw new http_exception(404, 'Not Found');
+				}
+
+				$this->user->add_lang($lang_file, false, true, $ext_name);
+			break;
+
+		}
+
+		$this->template->assign_vars(array(
+			'L_FAQ_TITLE'				=> $page_title,
+			'S_IN_FAQ'					=> true,
+		));
+
+		$this->assign_to_template($this->user->help);
+
+		make_jumpbox(append_sid("{$this->root_path}viewforum.{$this->php_ext}"));
+		return $this->helper->render('faq_body.html', $page_title);
+	}
+
+	/**
+	 * Assigns the help data to the template blocks
+	 *
+	 * @param array $help_data
+	 * @return null
+	 */
+	protected function assign_to_template(array $help_data)
+	{
+		// Pull the array data from the lang pack
+		$switch_column = $found_switch = false;
+		foreach ($help_data as $help_ary)
+		{
+			if ($help_ary[0] == '--')
+			{
+				if ($help_ary[1] == '--')
+				{
+					$switch_column = true;
+					$found_switch = true;
+					continue;
+				}
+
+				$this->template->assign_block_vars('faq_block', array(
+					'BLOCK_TITLE'		=> $help_ary[1],
+					'SWITCH_COLUMN'		=> $switch_column,
+				));
+
+				if ($switch_column)
+				{
+					$switch_column = false;
+				}
+				continue;
+			}
+
+			$this->template->assign_block_vars('faq_block.faq_row', array(
+				'FAQ_QUESTION'		=> $help_ary[0],
+				'FAQ_ANSWER'		=> $help_ary[1],
+			));
+		}
+
+		$this->template->assign_var('SWITCH_COLUMN_MANUALLY', !$found_switch);
+	}
+}
--- /dev/null
+++ b/phpbb/help/manager.php
@@ -0,0 +1,137 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\help;
+
+/**
+ * Class help page manager
+ */
+class manager
+{
+	/** @var \phpbb\event\dispatcher */
+	protected $dispatcher;
+
+	/** @var \phpbb\language\language */
+	protected $language;
+
+	/** @var \phpbb\template\template */
+	protected $template;
+
+	/** @var bool */
+	protected $switched_column;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\event\dispatcher $dispatcher
+	 * @param \phpbb\language\language $language
+	 * @param \phpbb\template\template $template
+	 */
+	public function __construct(\phpbb\event\dispatcher $dispatcher, \phpbb\language\language $language, \phpbb\template\template $template)
+	{
+		$this->dispatcher = $dispatcher;
+		$this->language = $language;
+		$this->template = $template;
+	}
+
+	/**
+	 * Add a new faq block
+	 *
+	 * @param string $block_name	Name or language key with the name of the block
+	 * @param bool $switch_column	Switch the column of the menu
+	 * @param array $questions		Array of frequently asked questions
+	 */
+	public function add_block($block_name, $switch_column = false, $questions = array())
+	{
+		/**
+		 * You can use this event to add a block before the current one.
+		 *
+		 * @event core.help_manager_add_block_before
+		 * @var	string	block_name		Language key of the block headline
+		 * @var	bool	switch_column	Should we switch the menu column before this headline
+		 * @var	array	questions		Array with questions
+		 * @since 3.2.0-a1
+		 */
+		$vars = array('block_name', 'switch_column', 'questions');
+		extract($this->dispatcher->trigger_event('core.help_manager_add_block_before', compact($vars)));
+
+		$this->template->assign_block_vars('faq_block', array(
+			'BLOCK_TITLE'		=> $this->language->lang($block_name),
+			'SWITCH_COLUMN'		=> !$this->switched_column && $switch_column,
+		));
+
+		foreach ($questions as $question => $answer)
+		{
+			$this->add_question($question, $answer);
+		}
+
+		$this->switched_column = $this->switched_column || $switch_column;
+
+		/**
+		 * You can use this event to add a block after the current one.
+		 *
+		 * @event core.help_manager_add_block_after
+		 * @var	string	block_name		Language key of the block headline
+		 * @var	bool	switch_column	Should we switch the menu column before this headline
+		 * @var	array	questions		Array with questions
+		 * @since 3.2.0-a1
+		 */
+		$vars = array('block_name', 'switch_column', 'questions');
+		extract($this->dispatcher->trigger_event('core.help_manager_add_block_after', compact($vars)));
+	}
+
+	/**
+	 * Add a new faq question
+	 *
+	 * @param string $question	Question or language key with the question of the block
+	 * @param string $answer	Answer or language key with the answer of the block
+	 */
+	public function add_question($question, $answer)
+	{
+		/**
+		 * You can use this event to add a question before the current one.
+		 *
+		 * @event core.help_manager_add_question_before
+		 * @var	string	question	Language key of the question
+		 * @var	string	answer		Language key of the answer
+		 * @since 3.2.0-a1
+		 */
+		$vars = array('question', 'answer');
+		extract($this->dispatcher->trigger_event('core.help_manager_add_question_before', compact($vars)));
+
+		$this->template->assign_block_vars('faq_block.faq_row', array(
+			'FAQ_QUESTION'		=> $this->language->lang($question),
+			'FAQ_ANSWER'		=> $this->language->lang($answer),
+		));
+
+		/**
+		 * You can use this event to add a question after the current one.
+		 *
+		 * @event core.help_manager_add_question_after
+		 * @var	string	question	Language key of the question
+		 * @var	string	answer		Language key of the answer
+		 * @since 3.2.0-a1
+		 */
+		$vars = array('question', 'answer');
+		extract($this->dispatcher->trigger_event('core.help_manager_add_question_after', compact($vars)));
+	}
+
+	/**
+	 * Returns whether the block titles switched side
+	 * @return bool
+	 */
+	public function switched_column()
+	{
+		return $this->switched_column;
+	}
+}
--- a/phpbb/hook/finder.php
+++ b/phpbb/hook/finder.php
@@ -18,8 +18,19 @@ namespace phpbb\hook;
 */
 class finder
 {
-	protected $phpbb_root_path;
+	/**
+	 * @var \phpbb\cache\driver\driver_interface
+	 */
 	protected $cache;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string
+	 */
 	protected $php_ext;
 
 	/**
--- /dev/null
+++ b/phpbb/install/console/command/install/config/show.php
@@ -0,0 +1,123 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\install\console\command\install\config;
+
+use phpbb\install\helper\iohandler\factory;
+use phpbb\install\installer_configuration;
+use phpbb\language\language;
+use Symfony\Component\Config\Definition\Exception\Exception;
+use Symfony\Component\Config\Definition\Processor;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\Yaml\Exception\ParseException;
+use Symfony\Component\Yaml\Yaml;
+
+class show extends \phpbb\console\command\command
+{
+	/**
+	 * @var factory
+	 */
+	protected $iohandler_factory;
+
+	/**
+	 * @var language
+	 */
+	protected $language;
+
+	/**
+	 * Constructor
+	 *
+	 * @param language $language
+	 * @param factory $factory
+	 */
+	public function __construct(language $language, factory $factory)
+	{
+		$this->iohandler_factory = $factory;
+		$this->language = $language;
+
+		parent::__construct(new \phpbb\user($language, 'datetime'));
+	}
+
+	/**
+	 *
+	 * {@inheritdoc}
+	 */
+	protected function configure()
+	{
+		$this
+			->setName('install:config:show')
+			->addArgument(
+				'config-file',
+				InputArgument::REQUIRED,
+				$this->language->lang('CLI_CONFIG_FILE'))
+			->setDescription($this->language->lang('CLI_INSTALL_SHOW_CONFIG'))
+		;
+	}
+
+	/**
+	 * Show the validated configuration
+	 *
+	 * @param InputInterface  $input  An InputInterface instance
+	 * @param OutputInterface $output An OutputInterface instance
+	 *
+	 * @return null
+	 */
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$this->iohandler_factory->set_environment('cli');
+
+		/** @var \phpbb\install\helper\iohandler\cli_iohandler $iohandler */
+		$iohandler = $this->iohandler_factory->get();
+		$style = new SymfonyStyle($input, $output);
+		$iohandler->set_style($style, $output);
+
+		$config_file = $input->getArgument('config-file');
+
+		if (!is_file($config_file))
+		{
+			$iohandler->add_error_message(array('MISSING_FILE', $config_file));
+
+			return;
+		}
+
+		try
+		{
+			$config = Yaml::parse(file_get_contents($config_file), true, false);
+		}
+		catch (ParseException $e)
+		{
+			$iohandler->add_error_message('INVALID_YAML_FILE');
+
+			return;
+		}
+
+		$processor = new Processor();
+		$configuration = new installer_configuration();
+
+		try
+		{
+			$config = $processor->processConfiguration($configuration, $config);
+		}
+		catch (Exception $e)
+		{
+			$iohandler->add_error_message('INVALID_CONFIGURATION', $e->getMessage());
+
+			return;
+		}
+
+		$style->block(Yaml::dump(array('installer' => $config), 10, 4, true, false));
+	}
+}
--- /dev/null
+++ b/phpbb/install/console/command/install/config/validate.php
@@ -0,0 +1,124 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\install\console\command\install\config;
+
+use phpbb\install\helper\iohandler\factory;
+use phpbb\install\installer_configuration;
+use phpbb\language\language;
+use Symfony\Component\Config\Definition\Exception\Exception;
+use Symfony\Component\Config\Definition\Processor;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\Yaml\Exception\ParseException;
+use Symfony\Component\Yaml\Yaml;
+
+class validate extends \phpbb\console\command\command
+{
+	/**
+	 * @var factory
+	 */
+	protected $iohandler_factory;
+
+	/**
+	 * @var language
+	 */
+	protected $language;
+
+	/**
+	 * Constructor
+	 *
+	 * @param language $language
+	 * @param factory $factory
+	 */
+	public function __construct(language $language, factory $factory)
+	{
+		$this->iohandler_factory = $factory;
+		$this->language = $language;
+
+		parent::__construct(new \phpbb\user($language, 'datetime'));
+	}
+
+	/**
+	 *
+	 * {@inheritdoc}
+	 */
+	protected function configure()
+	{
+		$this
+			->setName('install:config:validate')
+			->addArgument(
+				'config-file',
+				InputArgument::REQUIRED,
+				$this->language->lang('CLI_CONFIG_FILE'))
+			->setDescription($this->language->lang('CLI_INSTALL_VALIDATE_CONFIG'))
+		;
+	}
+
+	/**
+	 * Validate the configuration file
+	 *
+	 * @param InputInterface  $input  An InputInterface instance
+	 * @param OutputInterface $output An OutputInterface instance
+	 *
+	 * @return null
+	 */
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$this->iohandler_factory->set_environment('cli');
+
+		/** @var \phpbb\install\helper\iohandler\cli_iohandler $iohandler */
+		$iohandler = $this->iohandler_factory->get();
+		$style = new SymfonyStyle($input, $output);
+		$iohandler->set_style($style, $output);
+
+		$config_file = $input->getArgument('config-file');
+
+		if (!is_file($config_file))
+		{
+			$iohandler->add_error_message(array('MISSING_FILE', array($config_file)));
+
+			return 1;
+		}
+
+		try
+		{
+			$config = Yaml::parse(file_get_contents($config_file), true, false);
+		}
+		catch (ParseException $e)
+		{
+			$iohandler->add_error_message('INVALID_YAML_FILE');
+
+			return 1;
+		}
+
+		$processor = new Processor();
+		$configuration = new installer_configuration();
+
+		try
+		{
+			$processor->processConfiguration($configuration, $config);
+		}
+		catch (Exception $e)
+		{
+			$iohandler->add_error_message('INVALID_CONFIGURATION', $e->getMessage());
+
+			return 1;
+		}
+
+		$iohandler->add_success_message('CONFIGURATION_VALID');
+		return 0;
+	}
+}
--- /dev/null
+++ b/phpbb/install/console/command/install/install.php
@@ -0,0 +1,210 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\install\console\command\install;
+
+use phpbb\install\exception\installer_exception;
+use phpbb\install\helper\install_helper;
+use phpbb\install\helper\iohandler\cli_iohandler;
+use phpbb\install\helper\iohandler\factory;
+use phpbb\install\installer;
+use phpbb\install\installer_configuration;
+use phpbb\language\language;
+use Symfony\Component\Config\Definition\Exception\Exception;
+use Symfony\Component\Config\Definition\Processor;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\Yaml\Exception\ParseException;
+use Symfony\Component\Yaml\Yaml;
+
+class install extends \phpbb\console\command\command
+{
+	/**
+	 * @var factory
+	 */
+	protected $iohandler_factory;
+
+	/**
+	 * @var installer
+	 */
+	protected $installer;
+
+	/**
+	 * @var install_helper
+	 */
+	protected $install_helper;
+
+	/**
+	 * @var language
+	 */
+	protected $language;
+
+	/**
+	 * Constructor
+	 *
+	 * @param language			$language
+	 * @param factory			$factory
+	 * @param installer			$installer
+	 * @param install_helper	$install_helper
+	 */
+	public function __construct(language $language, factory $factory, installer $installer, install_helper $install_helper)
+	{
+		$this->iohandler_factory = $factory;
+		$this->installer = $installer;
+		$this->language = $language;
+		$this->install_helper = $install_helper;
+
+		parent::__construct(new \phpbb\user($language, 'datetime'));
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	protected function configure()
+	{
+		$this
+			->setName('install')
+			->addArgument(
+				'config-file',
+				InputArgument::REQUIRED,
+				$this->language->lang('CLI_CONFIG_FILE'))
+			->setDescription($this->language->lang('CLI_INSTALL_BOARD'))
+		;
+	}
+
+	/**
+	 * Executes the command install.
+	 *
+	 * Install the board
+	 *
+	 * @param InputInterface  $input  An InputInterface instance
+	 * @param OutputInterface $output An OutputInterface instance
+	 *
+	 * @return null
+	 */
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$this->iohandler_factory->set_environment('cli');
+
+		/** @var \phpbb\install\helper\iohandler\cli_iohandler $iohandler */
+		$iohandler = $this->iohandler_factory->get();
+		$style = new SymfonyStyle($input, $output);
+		$iohandler->set_style($style, $output);
+
+		$this->installer->set_iohandler($iohandler);
+
+		$config_file = $input->getArgument('config-file');
+
+		if ($this->install_helper->is_phpbb_installed())
+		{
+			$iohandler->add_error_message('INSTALL_PHPBB_INSTALLED');
+
+			return 1;
+		}
+
+		if (!is_file($config_file))
+		{
+			$iohandler->add_error_message(array('MISSING_FILE', $config_file));
+
+			return 1;
+		}
+
+		try
+		{
+			$config = Yaml::parse(file_get_contents($config_file), true, false);
+		}
+		catch (ParseException $e)
+		{
+			$iohandler->add_error_message(array('INVALID_YAML_FILE', $config_file));
+
+			return 1;
+		}
+
+		$processor = new Processor();
+		$configuration = new installer_configuration();
+
+		try
+		{
+			$config = $processor->processConfiguration($configuration, $config);
+		}
+		catch (Exception $e)
+		{
+			$iohandler->add_error_message('INVALID_CONFIGURATION', $e->getMessage());
+
+			return 1;
+		}
+
+		$this->register_configuration($iohandler, $config);
+
+		try
+		{
+			$this->installer->run();
+			return 0;
+		}
+		catch (installer_exception $e)
+		{
+			$iohandler->add_error_message($e->getMessage());
+			return 1;
+		}
+	}
+
+	/**
+	 * Register the configuration to simulate the forms.
+	 *
+	 * @param cli_iohandler $iohandler
+	 * @param array $config
+	 */
+	private function register_configuration(cli_iohandler $iohandler, $config)
+	{
+		$iohandler->set_input('admin_name', $config['admin']['name']);
+		$iohandler->set_input('admin_pass1', $config['admin']['password']);
+		$iohandler->set_input('admin_pass2', $config['admin']['password']);
+		$iohandler->set_input('board_email', $config['admin']['email']);
+		$iohandler->set_input('submit_admin', 'submit');
+
+		$iohandler->set_input('default_lang', $config['board']['lang']);
+		$iohandler->set_input('board_name', $config['board']['name']);
+		$iohandler->set_input('board_description', $config['board']['description']);
+		$iohandler->set_input('submit_board', 'submit');
+
+		$iohandler->set_input('dbms', $config['database']['dbms']);
+		$iohandler->set_input('dbhost', $config['database']['dbhost']);
+		$iohandler->set_input('dbport', $config['database']['dbport']);
+		$iohandler->set_input('dbuser', $config['database']['dbuser']);
+		$iohandler->set_input('dbpasswd', $config['database']['dbpasswd']);
+		$iohandler->set_input('dbname', $config['database']['dbname']);
+		$iohandler->set_input('table_prefix', $config['database']['table_prefix']);
+		$iohandler->set_input('submit_database', 'submit');
+
+		$iohandler->set_input('email_enable', $config['email']['enabled']);
+		$iohandler->set_input('smtp_delivery', $config['email']['smtp_delivery']);
+		$iohandler->set_input('smtp_host', $config['email']['smtp_host']);
+		$iohandler->set_input('smtp_port', $config['email']['smtp_port']);
+		$iohandler->set_input('smtp_auth', $config['email']['smtp_auth']);
+		$iohandler->set_input('smtp_user', $config['email']['smtp_user']);
+		$iohandler->set_input('smtp_pass', $config['email']['smtp_pass']);
+		$iohandler->set_input('submit_email', 'submit');
+
+		$iohandler->set_input('cookie_secure', $config['server']['cookie_secure']);
+		$iohandler->set_input('server_protocol', $config['server']['server_protocol']);
+		$iohandler->set_input('force_server_vars', $config['server']['force_server_vars']);
+		$iohandler->set_input('server_name', $config['server']['server_name']);
+		$iohandler->set_input('server_port', $config['server']['server_port']);
+		$iohandler->set_input('script_path', $config['server']['script_path']);
+		$iohandler->set_input('submit_server', 'submit');
+
+		$iohandler->set_input('install-extensions', $config['extensions']);
+	}
+}
--- /dev/null
+++ b/phpbb/install/console/command/update/config/show.php
@@ -0,0 +1,123 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\install\console\command\update\config;
+
+use phpbb\install\helper\iohandler\factory;
+use phpbb\install\updater_configuration;
+use phpbb\language\language;
+use Symfony\Component\Config\Definition\Exception\Exception;
+use Symfony\Component\Config\Definition\Processor;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\Yaml\Exception\ParseException;
+use Symfony\Component\Yaml\Yaml;
+
+class show extends \phpbb\console\command\command
+{
+	/**
+	 * @var factory
+	 */
+	protected $iohandler_factory;
+
+	/**
+	 * @var language
+	 */
+	protected $language;
+
+	/**
+	 * Constructor
+	 *
+	 * @param language $language
+	 * @param factory $factory
+	 */
+	public function __construct(language $language, factory $factory)
+	{
+		$this->iohandler_factory = $factory;
+		$this->language = $language;
+
+		parent::__construct(new \phpbb\user($language, 'datetime'));
+	}
+
+	/**
+	 *
+	 * {@inheritdoc}
+	 */
+	protected function configure()
+	{
+		$this
+			->setName('update:config:show')
+			->addArgument(
+				'config-file',
+				InputArgument::REQUIRED,
+				$this->language->lang('CLI_CONFIG_FILE'))
+			->setDescription($this->language->lang('CLI_INSTALL_SHOW_CONFIG'))
+		;
+	}
+
+	/**
+	 * Show the validated configuration
+	 *
+	 * @param InputInterface  $input  An InputInterface instance
+	 * @param OutputInterface $output An OutputInterface instance
+	 *
+	 * @return null
+	 */
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$this->iohandler_factory->set_environment('cli');
+
+		/** @var \phpbb\install\helper\iohandler\cli_iohandler $iohandler */
+		$iohandler = $this->iohandler_factory->get();
+		$style = new SymfonyStyle($input, $output);
+		$iohandler->set_style($style, $output);
+
+		$config_file = $input->getArgument('config-file');
+
+		if (!is_file($config_file))
+		{
+			$iohandler->add_error_message(array('MISSING_FILE', $config_file));
+
+			return;
+		}
+
+		try
+		{
+			$config = Yaml::parse(file_get_contents($config_file), true, false);
+		}
+		catch (ParseException $e)
+		{
+			$iohandler->add_error_message('INVALID_YAML_FILE');
+
+			return;
+		}
+
+		$processor = new Processor();
+		$configuration = new updater_configuration();
+
+		try
+		{
+			$config = $processor->processConfiguration($configuration, $config);
+		}
+		catch (Exception $e)
+		{
+			$iohandler->add_error_message('INVALID_CONFIGURATION', $e->getMessage());
+
+			return;
+		}
+
+		$style->block(Yaml::dump(array('updater' => $config), 10, 4, true, false));
+	}
+}
--- /dev/null
+++ b/phpbb/install/console/command/update/config/validate.php
@@ -0,0 +1,124 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\install\console\command\update\config;
+
+use phpbb\install\helper\iohandler\factory;
+use phpbb\install\updater_configuration;
+use phpbb\language\language;
+use Symfony\Component\Config\Definition\Exception\Exception;
+use Symfony\Component\Config\Definition\Processor;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\Yaml\Exception\ParseException;
+use Symfony\Component\Yaml\Yaml;
+
+class validate extends \phpbb\console\command\command
+{
+	/**
+	 * @var factory
+	 */
+	protected $iohandler_factory;
+
+	/**
+	 * @var language
+	 */
+	protected $language;
+
+	/**
+	 * Constructor
+	 *
+	 * @param language $language
+	 * @param factory $factory
+	 */
+	public function __construct(language $language, factory $factory)
+	{
+		$this->iohandler_factory = $factory;
+		$this->language = $language;
+
+		parent::__construct(new \phpbb\user($language, 'datetime'));
+	}
+
+	/**
+	 *
+	 * {@inheritdoc}
+	 */
+	protected function configure()
+	{
+		$this
+			->setName('update:config:validate')
+			->addArgument(
+				'config-file',
+				InputArgument::REQUIRED,
+				$this->language->lang('CLI_CONFIG_FILE'))
+			->setDescription($this->language->lang('CLI_INSTALL_VALIDATE_CONFIG'))
+		;
+	}
+
+	/**
+	 * Validate the configuration file
+	 *
+	 * @param InputInterface  $input  An InputInterface instance
+	 * @param OutputInterface $output An OutputInterface instance
+	 *
+	 * @return null
+	 */
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$this->iohandler_factory->set_environment('cli');
+
+		/** @var \phpbb\install\helper\iohandler\cli_iohandler $iohandler */
+		$iohandler = $this->iohandler_factory->get();
+		$style = new SymfonyStyle($input, $output);
+		$iohandler->set_style($style, $output);
+
+		$config_file = $input->getArgument('config-file');
+
+		if (!is_file($config_file))
+		{
+			$iohandler->add_error_message(array('MISSING_FILE', array($config_file)));
+
+			return 1;
+		}
+
+		try
+		{
+			$config = Yaml::parse(file_get_contents($config_file), true, false);
+		}
+		catch (ParseException $e)
+		{
+			$iohandler->add_error_message('INVALID_YAML_FILE');
+
+			return 1;
+		}
+
+		$processor = new Processor();
+		$configuration = new updater_configuration();
+
+		try
+		{
+			$processor->processConfiguration($configuration, $config);
+		}
+		catch (Exception $e)
+		{
+			$iohandler->add_error_message('INVALID_CONFIGURATION', $e->getMessage());
+
+			return 1;
+		}
+
+		$iohandler->add_success_message('CONFIGURATION_VALID');
+		return 0;
+	}
+}
--- /dev/null
+++ b/phpbb/install/console/command/update/update.php
@@ -0,0 +1,182 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\install\console\command\update;
+
+use phpbb\install\exception\installer_exception;
+use phpbb\install\helper\install_helper;
+use phpbb\install\helper\iohandler\cli_iohandler;
+use phpbb\install\helper\iohandler\factory;
+use phpbb\install\installer;
+use phpbb\install\updater_configuration;
+use phpbb\language\language;
+use Symfony\Component\Config\Definition\Exception\Exception;
+use Symfony\Component\Config\Definition\Processor;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\Yaml\Exception\ParseException;
+use Symfony\Component\Yaml\Yaml;
+
+class update extends \phpbb\console\command\command
+{
+	/**
+	 * @var factory
+	 */
+	protected $iohandler_factory;
+
+	/**
+	 * @var installer
+	 */
+	protected $installer;
+
+	/**
+	 * @var install_helper
+	 */
+	protected $install_helper;
+
+	/**
+	 * @var language
+	 */
+	protected $language;
+
+	/**
+	 * Constructor
+	 *
+	 * @param language			$language
+	 * @param factory			$factory
+	 * @param installer			$installer
+	 * @param install_helper	$install_helper
+	 */
+	public function __construct(language $language, factory $factory, installer $installer, install_helper $install_helper)
+	{
+		$this->iohandler_factory = $factory;
+		$this->installer = $installer;
+		$this->language = $language;
+		$this->install_helper = $install_helper;
+
+		parent::__construct(new \phpbb\user($language, 'datetime'));
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	protected function configure()
+	{
+		$this
+			->setName('update')
+			->addArgument(
+				'config-file',
+				InputArgument::REQUIRED,
+				$this->language->lang('CLI_CONFIG_FILE'))
+			->setDescription($this->language->lang('CLI_UPDATE_BOARD'))
+		;
+	}
+
+	/**
+	 * Executes the command update.
+	 *
+	 * Update the board
+	 *
+	 * @param InputInterface  $input  An InputInterface instance
+	 * @param OutputInterface $output An OutputInterface instance
+	 *
+	 * @return int
+	 */
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$this->iohandler_factory->set_environment('cli');
+
+		/** @var \phpbb\install\helper\iohandler\cli_iohandler $iohandler */
+		$iohandler = $this->iohandler_factory->get();
+		$style = new SymfonyStyle($input, $output);
+		$iohandler->set_style($style, $output);
+
+		$this->installer->set_iohandler($iohandler);
+
+		$config_file = $input->getArgument('config-file');
+
+		if (!$this->install_helper->is_phpbb_installed())
+		{
+			$iohandler->add_error_message('INSTALL_PHPBB_NOT_INSTALLED');
+
+			return 1;
+		}
+
+		if (!is_file($config_file))
+		{
+			$iohandler->add_error_message(array('MISSING_FILE', $config_file));
+
+			return 1;
+		}
+
+		try
+		{
+			$config = Yaml::parse(file_get_contents($config_file), true, false);
+		}
+		catch (ParseException $e)
+		{
+			$iohandler->add_error_message(array('INVALID_YAML_FILE', $config_file));
+
+			return 1;
+		}
+
+		$processor = new Processor();
+		$configuration = new updater_configuration();
+
+		try
+		{
+			$config = $processor->processConfiguration($configuration, $config);
+		}
+		catch (Exception $e)
+		{
+			$iohandler->add_error_message('INVALID_CONFIGURATION', $e->getMessage());
+
+			return 1;
+		}
+
+		$this->register_configuration($iohandler, $config);
+
+		try
+		{
+			$this->installer->run();
+			return 0;
+		}
+		catch (installer_exception $e)
+		{
+			$iohandler->add_error_message($e->getMessage());
+			return 1;
+		}
+	}
+
+	/**
+	 * Register the configuration to simulate the forms.
+	 *
+	 * @param cli_iohandler $iohandler
+	 * @param array $config
+	 */
+	private function register_configuration(cli_iohandler $iohandler, $config)
+	{
+		$iohandler->set_input('update_type', $config['type']);
+		$iohandler->set_input('submit_update', 'submit');
+
+		$iohandler->set_input('compression_method', '.tar');
+		$iohandler->set_input('method', 'direct_file');
+		$iohandler->set_input('submit_update_file', 'submit');
+
+		$iohandler->set_input('submit_continue_file_update', 'submit');
+
+		$iohandler->set_input('update-extensions', $config['extensions']);
+	}
+}
--- /dev/null
+++ b/phpbb/install/controller/archive_download.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\controller;
+
+use phpbb\exception\http_exception;
+use phpbb\install\helper\config;
+use Symfony\Component\HttpFoundation\BinaryFileResponse;
+use Symfony\Component\HttpFoundation\ResponseHeaderBag;
+
+class archive_download
+{
+	/**
+	 * @var config
+	 */
+	protected $installer_config;
+
+	/**
+	 * Constructor
+	 *
+	 * @param config $config
+	 */
+	public function __construct(config $config)
+	{
+		$this->installer_config = $config;
+		$this->installer_config->load_config();
+	}
+
+	/**
+	 * Sends response with the merge conflict archive
+	 *
+	 * Merge conflicts always have to be resolved manually,
+	 * so we use a different archive for that.
+	 *
+	 * @return BinaryFileResponse
+	 */
+	public function conflict_archive()
+	{
+		$filename = $this->installer_config->get('update_file_conflict_archive', '');
+
+		if (empty($filename))
+		{
+			throw new http_exception(404, 'URL_NOT_FOUND');
+		}
+
+		return $this->send_response($filename);
+	}
+
+	/**
+	 * Sends response with the updated files' archive
+	 *
+	 * @return BinaryFileResponse
+	 */
+	public function update_archive()
+	{
+		$filename = $this->installer_config->get('update_file_archive', '');
+
+		if (empty($filename))
+		{
+			throw new http_exception(404, 'URL_NOT_FOUND');
+		}
+
+		return $this->send_response($filename);
+	}
+
+	/**
+	 * Generates a download response
+	 *
+	 * @param string	$filename	Path to the file to download
+	 *
+	 * @return BinaryFileResponse	Response object
+	 */
+	private function send_response($filename)
+	{
+		$response = new BinaryFileResponse($filename);
+		$response->setContentDisposition(
+			ResponseHeaderBag::DISPOSITION_ATTACHMENT,
+			basename($filename)
+		);
+
+		return $response;
+	}
+}
--- /dev/null
+++ b/phpbb/install/controller/helper.php
@@ -0,0 +1,413 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\controller;
+
+use phpbb\install\helper\config;
+use phpbb\install\helper\navigation\navigation_provider;
+use phpbb\language\language;
+use phpbb\language\language_file_helper;
+use phpbb\path_helper;
+use phpbb\request\request;
+use phpbb\request\request_interface;
+use phpbb\routing\router;
+use phpbb\symfony_request;
+use phpbb\template\template;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\Cookie;
+
+/**
+ * A duplicate of \phpbb\controller\helper
+ *
+ * This class is necessary because of controller\helper's legacy function calls
+ * to page_header() page_footer() functions which has unavailable dependencies.
+ */
+class helper
+{
+	/**
+	 * @var config
+	 */
+	protected $installer_config;
+
+	/**
+	 * @var \phpbb\language\language
+	 */
+	protected $language;
+
+	/**
+	 * @var bool|string
+	 */
+	protected $language_cookie;
+
+	/**
+	 * @var \phpbb\language\language_file_helper
+	 */
+	protected $lang_helper;
+
+	/**
+	 * @var \phpbb\install\helper\navigation\navigation_provider
+	 */
+	protected $navigation_provider;
+
+	/**
+	 * @var \phpbb\template\template
+	 */
+	protected $template;
+
+	/**
+	 * @var \phpbb\path_helper
+	 */
+	protected $path_helper;
+
+	/**
+	 * @var \phpbb\request\request
+	 */
+	protected $phpbb_request;
+
+	/**
+	 * @var \phpbb\symfony_request
+	 */
+	protected $request;
+
+	/**
+	 * @var \phpbb\routing\router
+	 */
+	protected $router;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_admin_path;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * Constructor
+	 *
+	 * @param config				$config
+	 * @param language				$language
+	 * @param language_file_helper	$lang_helper
+	 * @param navigation_provider	$nav
+	 * @param template				$template
+	 * @param path_helper			$path_helper
+	 * @param request				$phpbb_request
+	 * @param symfony_request		$request
+	 * @param router				$router
+	 * @param string				$phpbb_root_path
+	 */
+	public function __construct(config $config, language $language, language_file_helper $lang_helper, navigation_provider $nav, template $template, path_helper $path_helper, request $phpbb_request, symfony_request $request, router $router, $phpbb_root_path)
+	{
+		$this->installer_config = $config;
+		$this->language = $language;
+		$this->language_cookie = false;
+		$this->lang_helper = $lang_helper;
+		$this->navigation_provider = $nav;
+		$this->template = $template;
+		$this->path_helper = $path_helper;
+		$this->phpbb_request = $phpbb_request;
+		$this->request = $request;
+		$this->router = $router;
+		$this->phpbb_root_path = $phpbb_root_path;
+		$this->phpbb_admin_path = $phpbb_root_path . 'adm/';
+	}
+
+	/**
+	 * Automate setting up the page and creating the response object.
+	 *
+	 * @param string	$template_file		The template handle to render
+	 * @param string	$page_title			The title of the page to output
+	 * @param bool		$selected_language	True to enable language selector it, false otherwise
+	 * @param int		$status_code		The status code to be sent to the page header
+	 *
+	 * @return Response object containing rendered page
+	 */
+	public function render($template_file, $page_title = '', $selected_language = false, $status_code = 200)
+	{
+		$this->page_header($page_title, $selected_language);
+
+		$this->template->set_filenames(array(
+			'body'	=> $template_file,
+		));
+
+		$response = new Response($this->template->assign_display('body'), $status_code);
+
+		// Set language cookie
+		if ($this->language_cookie !== false)
+		{
+			$cookie = new Cookie('lang', $this->language_cookie, time() + 3600);
+			$response->headers->setCookie($cookie);
+
+			$this->language_cookie = false;
+		}
+
+		return $response;
+	}
+
+	/**
+	 * Returns path from route name
+	 *
+	 * @param string	$route_name
+	 * @param array		$parameters
+	 *
+	 * @return string
+	 */
+	public function route($route_name, $parameters = array())
+	{
+		$url = $this->router->generate($route_name, $parameters);
+
+		return $url;
+	}
+
+	/**
+	 * Handles language selector form
+	 */
+	public function handle_language_select()
+	{
+		$lang = null;
+
+		// Check if language form has been submited
+		$submit = $this->phpbb_request->variable('change_lang', '');
+		if (!empty($submit))
+		{
+			$lang = $this->phpbb_request->variable('language', '');
+		}
+
+		// Retrieve language from cookie
+		$lang_cookie = $this->phpbb_request->variable('lang', '', false, request_interface::COOKIE);
+		if (empty($lang) && !empty($lang_cookie))
+		{
+			$lang = $lang_cookie;
+		}
+
+		$lang = (!empty($lang) && strpos($lang, '/') === false) ? $lang : null;
+		$this->language_cookie = $lang;
+
+		$this->render_language_select($lang);
+
+		if ($lang !== null)
+		{
+			$this->language->set_user_language($lang, true);
+			$this->installer_config->set('user_language', $lang);
+		}
+	}
+
+	/**
+	 * Process navigation data to reflect active/completed stages
+	 *
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface|null	$iohandler
+	 */
+	public function handle_navigation($iohandler = null)
+	{
+		$nav_data = $this->installer_config->get_navigation_data();
+
+		// Set active navigation stage
+		if (isset($nav_data['active']) && is_array($nav_data['active']))
+		{
+			if ($iohandler !== null)
+			{
+				$iohandler->set_active_stage_menu($nav_data['active']);
+			}
+
+			$this->navigation_provider->set_nav_property($nav_data['active'], array(
+				'selected'	=> true,
+				'completed'	=> false,
+			));
+		}
+
+		// Set finished navigation stages
+		if (isset($nav_data['finished']) && is_array($nav_data['finished']))
+		{
+			foreach ($nav_data['finished'] as $finished_stage)
+			{
+				if ($iohandler !== null)
+				{
+					$iohandler->set_finished_stage_menu($finished_stage);
+				}
+
+				$this->navigation_provider->set_nav_property($finished_stage, array(
+					'selected'	=> false,
+					'completed'	=> true,
+				));
+			}
+		}
+	}
+
+	/**
+	 * Set default template variables
+	 *
+	 * @param string	$page_title			Title of the page
+	 * @param bool		$selected_language	True to enable language selector it, false otherwise
+	 */
+	protected function page_header($page_title, $selected_language = false)
+	{
+		// Path to templates
+		$paths = array($this->phpbb_root_path . 'install/update/new/adm/', $this->phpbb_admin_path);
+		$paths = array_filter($paths, 'is_dir');
+		$path = array_shift($paths);
+		$path = substr($path, strlen($this->phpbb_root_path));
+
+		$this->template->assign_vars(array(
+			'L_CHANGE'				=> $this->language->lang('CHANGE'),
+			'L_COLON'				=> $this->language->lang('COLON'),
+			'L_INSTALL_PANEL'		=> $this->language->lang('INSTALL_PANEL'),
+			'L_SELECT_LANG'			=> $this->language->lang('SELECT_LANG'),
+			'L_SKIP'				=> $this->language->lang('SKIP'),
+			'PAGE_TITLE'			=> $this->language->lang($page_title),
+			'T_IMAGE_PATH'			=> $this->path_helper->get_web_root_path() . $path . 'images',
+			'T_JQUERY_LINK'			=> $this->path_helper->get_web_root_path() . $path . '../assets/javascript/jquery.min.js',
+			'T_TEMPLATE_PATH'		=> $this->path_helper->get_web_root_path() . $path . 'style',
+			'T_ASSETS_PATH'			=> $this->path_helper->get_web_root_path() . $path . '../assets',
+
+			'S_CONTENT_DIRECTION' 	=> $this->language->lang('DIRECTION'),
+			'S_CONTENT_FLOW_BEGIN'	=> ($this->language->lang('DIRECTION') === 'ltr') ? 'left' : 'right',
+			'S_CONTENT_FLOW_END'	=> ($this->language->lang('DIRECTION') === 'ltr') ? 'right' : 'left',
+			'S_CONTENT_ENCODING' 	=> 'UTF-8',
+			'S_LANG_SELECT'			=> $selected_language,
+
+			'S_USER_LANG'			=> $this->language->lang('USER_LANG'),
+		));
+
+		$this->render_navigation();
+	}
+
+	/**
+	 * Render navigation
+	 */
+	protected function render_navigation()
+	{
+		// Get navigation items
+		$nav_array = $this->navigation_provider->get();
+		$nav_array = $this->sort_navigation_level($nav_array);
+
+		$active_main_menu = $this->get_active_main_menu($nav_array);
+
+		// Pass navigation to template
+		foreach ($nav_array as $key => $entry)
+		{
+			$this->template->assign_block_vars('t_block1', array(
+				'L_TITLE' => $this->language->lang($entry['label']),
+				'S_SELECTED' => ($active_main_menu === $key),
+				'U_TITLE' => $this->route($entry['route']),
+			));
+
+			if (is_array($entry[0]) && $active_main_menu === $key)
+			{
+				$entry[0] = $this->sort_navigation_level($entry[0]);
+
+				foreach ($entry[0] as $name => $sub_entry)
+				{
+					if (isset($sub_entry['stage']) && $sub_entry['stage'] === true)
+					{
+						$this->template->assign_block_vars('l_block2', array(
+							'L_TITLE' => $this->language->lang($sub_entry['label']),
+							'S_SELECTED' => (isset($sub_entry['selected']) && $sub_entry['selected'] === true),
+							'S_COMPLETE' => (isset($sub_entry['completed']) && $sub_entry['completed'] === true),
+							'STAGE_NAME' => $name,
+						));
+					}
+					else
+					{
+						$this->template->assign_block_vars('l_block1', array(
+							'L_TITLE' => $this->language->lang($sub_entry['label']),
+							'S_SELECTED' => (isset($sub_entry['route']) && $sub_entry['route'] === $this->request->get('_route')),
+							'U_TITLE' => $this->route($sub_entry['route']),
+						));
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Render language select form
+	 *
+	 * @param string	$selected_language
+	 */
+	protected function render_language_select($selected_language = null)
+	{
+		$langs = $this->lang_helper->get_available_languages();
+		foreach ($langs as $lang)
+		{
+			$this->template->assign_block_vars('language_select_item', array(
+				'VALUE' => $lang['iso'],
+				'NAME' => $lang['local_name'],
+				'SELECTED' => ($lang['iso'] === $selected_language),
+			));
+		}
+	}
+
+	/**
+	 * Returns the name of the active main menu item
+	 *
+	 * @param array	$nav_array
+	 *
+	 * @return string|bool	Returns the name of the active main menu element, if the element not found, returns false
+	 */
+	protected function get_active_main_menu($nav_array)
+	{
+		$active_route = $this->request->get('_route');
+
+		foreach ($nav_array as $nav_name => $nav_options)
+		{
+			$current_menu = $nav_name;
+
+			if (isset($nav_options['route']) && $nav_options['route'] === $active_route)
+			{
+				return $nav_name;
+			}
+
+			if (is_array($nav_options[0]))
+			{
+				foreach ($nav_options[0] as $sub_menus)
+				{
+					if (isset($sub_menus['route']) && $sub_menus['route'] === $active_route)
+					{
+						return $current_menu;
+					}
+				}
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	 * Sorts the top level of navigation array
+	 *
+	 * @param array	$nav_array	Navigation array
+	 *
+	 * @return array
+	 */
+	protected function sort_navigation_level($nav_array)
+	{
+		$sorted = array();
+		foreach ($nav_array as $key => $nav)
+		{
+			$order = (isset($nav['order'])) ? $nav['order'] : 0;
+			$sorted[$order][$key] = $nav;
+		}
+
+		// Linearization of navigation array
+		$nav_array = array();
+		ksort($sorted);
+		foreach ($sorted as $nav)
+		{
+			$nav_array = array_merge($nav_array, $nav);
+		}
+
+		return $nav_array;
+	}
+}
--- /dev/null
+++ b/phpbb/install/controller/install.php
@@ -0,0 +1,172 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\controller;
+
+use phpbb\exception\http_exception;
+use phpbb\install\helper\install_helper;
+use phpbb\install\helper\navigation\navigation_provider;
+use Symfony\Component\HttpFoundation\StreamedResponse;
+use Symfony\Component\HttpFoundation\Response;
+use phpbb\install\helper\iohandler\factory;
+use phpbb\template\template;
+use phpbb\request\request_interface;
+use phpbb\install\installer;
+use phpbb\language\language;
+
+/**
+ * Controller for installing phpBB
+ */
+class install
+{
+	/**
+	 * @var helper
+	 */
+	protected $controller_helper;
+
+	/**
+	 * @var factory
+	 */
+	protected $iohandler_factory;
+
+	/**
+	 * @var navigation_provider
+	 */
+	protected $menu_provider;
+
+	/**
+	 * @var language
+	 */
+	protected $language;
+
+	/**
+	 * @var template
+	 */
+	protected $template;
+
+	/**
+	 * @var request_interface
+	 */
+	protected $request;
+
+	/**
+	 * @var installer
+	 */
+	protected $installer;
+
+	/**
+	 * @var install_helper
+	 */
+	protected $install_helper;
+
+	/**
+	 * Constructor
+	 *
+	 * @param helper 				$helper
+	 * @param factory 				$factory
+	 * @param navigation_provider	$nav_provider
+	 * @param language				$language
+	 * @param template				$template
+	 * @param request_interface		$request
+	 * @param installer				$installer
+	 * @param install_helper		$install_helper
+	 */
+	public function __construct(helper $helper, factory $factory, navigation_provider $nav_provider, language $language, template $template, request_interface $request, installer $installer, install_helper $install_helper)
+	{
+		$this->controller_helper	= $helper;
+		$this->iohandler_factory	= $factory;
+		$this->menu_provider		= $nav_provider;
+		$this->language				= $language;
+		$this->template				= $template;
+		$this->request				= $request;
+		$this->installer			= $installer;
+		$this->install_helper		= $install_helper;
+	}
+
+	/**
+	 * Controller logic
+	 *
+	 * @return Response|StreamedResponse
+	 *
+	 * @throws http_exception When phpBB is already installed
+	 */
+	public function handle()
+	{
+		if ($this->install_helper->is_phpbb_installed())
+		{
+			throw new http_exception(403, 'INSTALL_PHPBB_INSTALLED');
+		}
+
+		$this->template->assign_vars(array(
+			'U_ACTION' => $this->controller_helper->route('phpbb_installer_install'),
+		));
+
+		// Set up input-output handler
+		if ($this->request->is_ajax())
+		{
+			$this->iohandler_factory->set_environment('ajax');
+		}
+		else
+		{
+			$this->iohandler_factory->set_environment('nojs');
+		}
+
+		// Set the appropriate input-output handler
+		$this->installer->set_iohandler($this->iohandler_factory->get());
+		$this->controller_helper->handle_language_select();
+
+		if ($this->request->is_ajax())
+		{
+			$installer = $this->installer;
+			$response = new StreamedResponse();
+			$response->setCallback(function() use ($installer) {
+				$installer->run();
+			});
+
+			// Try to bypass any server output buffers
+			$response->headers->set('X-Accel-Buffering', 'no');
+
+			return $response;
+		}
+		else
+		{
+			// Determine whether the installation was started or not
+			if (true)
+			{
+				// Set active stage
+				$this->menu_provider->set_nav_property(
+					array('install', 0, 'introduction'),
+					array(
+						'selected'	=> true,
+						'completed'	=> false,
+					)
+				);
+
+				// If not, let's render the welcome page
+				$this->template->assign_vars(array(
+					'SHOW_INSTALL_START_FORM'	=> true,
+					'TITLE'						=> $this->language->lang('INSTALL_INTRO'),
+					'CONTENT'					=> $this->language->lang('INSTALL_INTRO_BODY'),
+				));
+
+				/** @var \phpbb\install\helper\iohandler\iohandler_interface $iohandler */
+				$iohandler = $this->iohandler_factory->get();
+				$this->controller_helper->handle_navigation($iohandler);
+
+				return $this->controller_helper->render('installer_install.html', 'INSTALL', true);
+			}
+
+			// @todo: implement no js controller logic
+		}
+	}
+}
--- /dev/null
+++ b/phpbb/install/controller/installer_index.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\controller;
+
+class installer_index
+{
+	/**
+	 * @var helper
+	 */
+	protected $helper;
+
+	/**
+	 * @var \phpbb\language\language
+	 */
+	protected $language;
+
+	/**
+	 * @var \phpbb\template\template
+	 */
+	protected $template;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * Constructor
+	 *
+	 * @param helper 					$helper
+	 * @param \phpbb\language\language	$language
+	 * @param \phpbb\template\template	$template
+	 * @param string					$phpbb_root_path
+	 */
+	public function __construct(helper $helper, \phpbb\language\language $language, \phpbb\template\template $template, $phpbb_root_path)
+	{
+		$this->helper = $helper;
+		$this->language = $language;
+		$this->template = $template;
+		$this->phpbb_root_path = $phpbb_root_path;
+	}
+
+	public function handle($mode)
+	{
+		$this->helper->handle_language_select();
+
+		switch ($mode)
+		{
+			case "intro":
+				$title = $this->language->lang('INTRODUCTION_TITLE');
+				$body = $this->language->lang('INTRODUCTION_BODY');
+			break;
+			case "support":
+				$title = $this->language->lang('SUPPORT_TITLE');
+				$body = $this->language->lang('SUPPORT_BODY');
+			break;
+			case "license":
+				$title = $this->language->lang('LICENSE_TITLE');
+				$body = implode("<br/>\n", file($this->phpbb_root_path . 'docs/LICENSE.txt'));
+			break;
+		}
+
+		$this->template->assign_vars(array(
+			'TITLE'	=> $title,
+			'BODY'	=> $body,
+		));
+
+		return $this->helper->render('installer_main.html', $title, true);
+	}
+}
--- /dev/null
+++ b/phpbb/install/controller/timeout_check.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\controller;
+
+use Symfony\Component\HttpFoundation\JsonResponse;
+
+class timeout_check
+{
+	/**
+	 * @var helper
+	 */
+	protected $helper;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * Constructor
+	 *
+	 * @param helper	$helper
+	 * @param string	$phpbb_root_path
+	 */
+	public function __construct(helper $helper, $phpbb_root_path)
+	{
+		$this->helper = $helper;
+		$this->phpbb_root_path = $phpbb_root_path;
+	}
+
+	/**
+	 * Controller for querying installer status
+	 */
+	public function status()
+	{
+		$lock_file = $this->phpbb_root_path . 'store/io_lock.lock';
+		$response = new JsonResponse();
+
+		if (!file_exists($lock_file))
+		{
+			$response->setData(array(
+				'status' => 'fail',
+			));
+		}
+		else
+		{
+			$fp = @fopen($lock_file, 'r');
+
+			if ($fp && flock($fp, LOCK_EX | LOCK_NB))
+			{
+				$status = (filesize($lock_file) >= 2 && fread($fp, 2) === 'ok') ? 'continue' : 'fail';
+
+				$response->setData(array(
+					'status' => $status,
+				));
+				flock($fp, LOCK_UN);
+				fclose($fp);
+			}
+			else
+			{
+				$response->setData(array(
+					'status' => 'running',
+				));
+			}
+		}
+
+		return $response;
+	}
+}
--- /dev/null
+++ b/phpbb/install/controller/update.php
@@ -0,0 +1,166 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\controller;
+
+use phpbb\exception\http_exception;
+use phpbb\install\helper\install_helper;
+use phpbb\install\helper\iohandler\factory;
+use phpbb\install\helper\navigation\navigation_provider;
+use phpbb\install\installer;
+use phpbb\language\language;
+use phpbb\request\request_interface;
+use phpbb\template\template;
+use Symfony\Component\HttpFoundation\StreamedResponse;
+
+/**
+ * Updater controller
+ */
+class update
+{
+	/**
+	 * @var helper
+	 */
+	protected $controller_helper;
+
+	/**
+	 * @var installer
+	 */
+	protected $installer;
+
+	/**
+	 * @var install_helper
+	 */
+	protected $install_helper;
+
+	/**
+	 * @var factory
+	 */
+	protected $iohandler_factory;
+
+	/**
+	 * @var language
+	 */
+	protected $language;
+
+	/**
+	 * @var navigation_provider
+	 */
+	protected $menu_provider;
+
+	/**
+	 * @var request_interface
+	 */
+	protected $request;
+
+	/**
+	 * @var template
+	 */
+	protected $template;
+
+	/**
+	 * Constructor
+	 *
+	 * @param helper				$controller_helper
+	 * @param installer				$installer
+	 * @param install_helper		$install_helper
+	 * @param factory				$iohandler
+	 * @param language				$language
+	 * @param navigation_provider	$menu_provider
+	 * @param request_interface		$request
+	 * @param template				$template
+	 */
+	public function __construct(helper $controller_helper, installer $installer, install_helper $install_helper, factory $iohandler, language $language, navigation_provider $menu_provider, request_interface $request, template $template)
+	{
+		$this->controller_helper	= $controller_helper;
+		$this->installer			= $installer;
+		$this->install_helper		= $install_helper;
+		$this->iohandler_factory	= $iohandler;
+		$this->language				= $language;
+		$this->menu_provider		= $menu_provider;
+		$this->request				= $request;
+		$this->template				= $template;
+	}
+
+	/**
+	 * Controller entry point
+	 *
+	 * @return Response|StreamedResponse
+	 *
+	 * @throws http_exception When phpBB is not installed
+	 */
+	public function handle()
+	{
+		if (!$this->install_helper->is_phpbb_installed())
+		{
+			throw new http_exception(403, 'INSTALL_PHPBB_NOT_INSTALLED');
+		}
+
+		$this->template->assign_vars(array(
+			'U_ACTION' => $this->controller_helper->route('phpbb_installer_update'),
+		));
+
+		// Set up input-output handler
+		if ($this->request->is_ajax())
+		{
+			$this->iohandler_factory->set_environment('ajax');
+		}
+		else
+		{
+			$this->iohandler_factory->set_environment('nojs');
+		}
+
+		// Set the appropriate input-output handler
+		$this->installer->set_iohandler($this->iohandler_factory->get());
+		$this->controller_helper->handle_language_select();
+
+		// Render the intro page
+		if ($this->request->is_ajax())
+		{
+			$installer = $this->installer;
+			$response = new StreamedResponse();
+			$response->setCallback(function() use ($installer) {
+				$installer->run();
+			});
+
+			// Try to bypass any server output buffers
+			$response->headers->set('X-Accel-Buffering', 'no');
+			$response->headers->set('Content-type', 'application/json');
+
+			return $response;
+		}
+		else
+		{
+			// Set active stage
+			$this->menu_provider->set_nav_property(
+				array('update', 0, 'introduction'),
+				array(
+					'selected'	=> true,
+					'completed'	=> false,
+				)
+			);
+
+			$this->template->assign_vars(array(
+				'SHOW_INSTALL_START_FORM'	=> true,
+				'TITLE'						=> $this->language->lang('UPDATE_INSTALLATION'),
+				'CONTENT'					=> $this->language->lang('UPDATE_INSTALLATION_EXPLAIN'),
+			));
+
+			/** @var \phpbb\install\helper\iohandler\iohandler_interface $iohandler */
+			$iohandler = $this->iohandler_factory->get();
+			$this->controller_helper->handle_navigation($iohandler);
+
+			return $this->controller_helper->render('installer_update.html', 'UPDATE_INSTALLATION', true);
+		}
+	}
+}
--- /dev/null
+++ b/phpbb/install/event/kernel_exception_subscriber.php
@@ -0,0 +1,126 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\event;
+
+use phpbb\exception\exception_interface;
+use phpbb\install\controller\helper;
+use phpbb\language\language;
+use phpbb\template\template;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
+use Symfony\Component\HttpFoundation\JsonResponse;
+
+/**
+ * Exception handler for the installer
+ */
+class kernel_exception_subscriber implements EventSubscriberInterface
+{
+	/**
+	 * @var helper
+	 */
+	protected $controller_helper;
+
+	/**
+	 * @var language
+	 */
+	protected $language;
+
+	/**
+	 * @var template
+	 */
+	protected $template;
+
+	/**
+	 * Constructor
+	 *
+	 * @param helper	$controller_helper
+	 * @param language	$language
+	 * @param template	$template
+	 */
+	public function __construct(helper $controller_helper, language $language, template $template)
+	{
+		$this->controller_helper	= $controller_helper;
+		$this->language				= $language;
+		$this->template				= $template;
+	}
+
+	/**
+	 * This listener is run when the KernelEvents::EXCEPTION event is triggered
+	 *
+	 * @param GetResponseForExceptionEvent	$event
+	 */
+	public function on_kernel_exception(GetResponseForExceptionEvent $event)
+	{
+		$exception = $event->getException();
+		$message = $exception->getMessage();
+
+		if ($exception instanceof exception_interface)
+		{
+			$message = $this->language->lang_array($message, $exception->get_parameters());
+		}
+
+		if (!$event->getRequest()->isXmlHttpRequest())
+		{
+			$this->template->assign_vars(array(
+				'TITLE'	=> $this->language->lang('INFORMATION'),
+				'BODY'	=> $message,
+			));
+
+			$response = $this->controller_helper->render(
+				'installer_main.html',
+				$this->language->lang('INFORMATION'),
+				false,
+				500
+			);
+		}
+		else
+		{
+			$data = array();
+
+			if (!empty($message))
+			{
+				$data['message'] = $message;
+			}
+
+			if (defined('DEBUG'))
+			{
+				$data['trace'] = $exception->getTrace();
+			}
+
+			$response = new JsonResponse($data, 500);
+		}
+
+		if ($exception instanceof HttpExceptionInterface)
+		{
+			$response->setStatusCode($exception->getStatusCode());
+			$response->headers->add($exception->getHeaders());
+		}
+
+		$event->setResponse($response);
+	}
+
+	/**
+	 * Returns an array of events the object is subscribed to
+	 *
+	 * @return array	Array of events the object is subscribed to
+	 */
+	static public function getSubscribedEvents()
+	{
+		return array(
+			KernelEvents::EXCEPTION		=> 'on_kernel_exception',
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/install/exception/cannot_build_container_exception.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\exception;
+
+/**
+ * Thrown when the container cannot be built
+ */
+class cannot_build_container_exception extends installer_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/install/exception/file_updater_failure_exception.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\exception;
+
+/**
+ * Thrown when the file updater fails
+ */
+class file_updater_failure_exception extends installer_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/install/exception/installer_config_not_writable_exception.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\exception;
+
+/**
+ * Thrown when installer config is not writable to disk
+ */
+class installer_config_not_writable_exception extends installer_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/install/exception/installer_exception.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\exception;
+
+use phpbb\exception\runtime_exception;
+
+/**
+ * Installer's base exception
+ */
+class installer_exception extends runtime_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/install/exception/invalid_dbms_exception.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\exception;
+
+/**
+ * Thrown when an unavailable DBMS has been selected
+ */
+class invalid_dbms_exception extends installer_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/install/exception/jump_to_restart_point_exception.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\exception;
+
+class jump_to_restart_point_exception extends installer_exception
+{
+	/**
+	 * @var string
+	 */
+	protected $restart_point_name;
+
+	/**
+	 * Constructor
+	 *
+	 * @param string $restart_point_name
+	 */
+	public function __construct($restart_point_name)
+	{
+		$this->restart_point_name = $restart_point_name;
+
+		parent::__construct();
+	}
+
+	/**
+	 * Returns the restart point's name
+	 *
+	 * @return string
+	 */
+	public function get_restart_point_name()
+	{
+		return $this->restart_point_name;
+	}
+}
--- /dev/null
+++ b/phpbb/install/exception/resource_limit_reached_exception.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\exception;
+
+/**
+ * Thrown when the installer is out of memory or time
+ */
+class resource_limit_reached_exception extends installer_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/install/exception/user_interaction_required_exception.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\exception;
+
+/**
+ * This exception should be thrown when user interaction is inevitable
+ *
+ * Note: Please note that the output should already be setup for the user
+ * 		 when you use throw this exception
+ */
+class user_interaction_required_exception extends installer_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/install/helper/config.php
@@ -0,0 +1,450 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper;
+
+use phpbb\install\exception\installer_config_not_writable_exception;
+
+/**
+ * Stores common settings and installation status
+ */
+class config
+{
+	/**
+	 * @var \phpbb\filesystem\filesystem_interface
+	 */
+	protected $filesystem;
+
+	/**
+	 * Array which contains config settings for the installer
+	 *
+	 * The array will also store all the user input, as well as any
+	 * data that is passed to other tasks by a task.
+	 *
+	 * @var array
+	 */
+	protected $installer_config;
+
+	/**
+	 * @var string
+	 */
+	protected $install_config_file;
+
+	/**
+	 * @var \bantu\IniGetWrapper\IniGetWrapper
+	 */
+	protected $php_ini;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * Array containing progress information
+	 *
+	 * @var array
+	 */
+	protected $progress_data;
+
+	/**
+	 * Array containing system information
+	 *
+	 * The array contains run time and memory limitations.
+	 *
+	 * @var array
+	 */
+	protected $system_data;
+
+	/**
+	 * Array containing navigation bar information
+	 *
+	 * @var array
+	 */
+	protected $navigation_data;
+
+	/**
+	 * Flag indicating that config file should be cleaned up
+	 *
+	 * @var bool
+	 */
+	protected $do_clean_up;
+
+	/**
+	 * Constructor
+	 */
+	public function __construct(\phpbb\filesystem\filesystem_interface $filesystem, \bantu\IniGetWrapper\IniGetWrapper $php_ini, $phpbb_root_path)
+	{
+		$this->filesystem		= $filesystem;
+		$this->php_ini			= $php_ini;
+		$this->phpbb_root_path	= $phpbb_root_path;
+		$this->do_clean_up		= false;
+
+		// Set up data arrays
+		$this->navigation_data	= array();
+		$this->installer_config	= array();
+		$this->system_data		= array();
+		$this->progress_data	= array(
+			'last_task_module_name'		=> '', // Stores the service name of the latest finished module
+			'last_task_module_index'	=> 0, // Stores the index of the latest finished module
+			'last_task_index'			=> 0, // Stores the index of the latest finished task
+			'max_task_progress'			=> 0,
+			'current_task_progress'		=> 0,
+			'_restart_points'			=> array(),
+			'use_restart_point'			=> false,
+		);
+
+		$this->install_config_file = $this->phpbb_root_path . 'store/install_config.php';
+
+		$this->setup_system_data();
+	}
+
+	/**
+	 * Returns data for a specified parameter
+	 *
+	 * @param	string	$param_name	Name of the parameter to return
+	 * @param	mixed	$default	Default value to return when the specified data
+	 * 								does not exist.
+	 *
+	 * @return 	mixed	value of the specified parameter or the default value if the data
+	 * 					cannot be recovered.
+	 */
+	public function get($param_name, $default = false)
+	{
+		return (isset($this->installer_config[$param_name])) ? $this->installer_config[$param_name] : $default;
+	}
+
+	/**
+	 * Sets a parameter in installer_config
+	 *
+	 * @param	string	$param_name	Name of the parameter
+	 * @param	mixed	$value		Values to set the parameter
+	 */
+	public function set($param_name, $value)
+	{
+		$this->installer_config = array_merge($this->installer_config, array(
+			$param_name => $value,
+		));
+	}
+
+	/**
+	 * Returns system parameter
+	 *
+	 * @param string	$param_name	Name of the parameter
+	 *
+	 * @return mixed	Returns system parameter if it is defined, false otherwise
+	 */
+	public function system_get($param_name)
+	{
+		return (isset($this->system_data[$param_name])) ? $this->system_data[$param_name] : false;
+	}
+
+	/**
+	 * Returns remaining time until the run time limit
+	 *
+	 * @return int	Remaining time until the run time limit in seconds
+	 */
+	public function get_time_remaining()
+	{
+		if ($this->system_data['max_execution_time'] <= 0)
+		{
+			return PHP_INT_MAX;
+		}
+
+		return ($this->system_data['start_time'] + $this->system_data['max_execution_time']) - microtime(true);
+	}
+
+	/**
+	 * Returns remaining memory available for PHP
+	 *
+	 * @return int	Remaining memory until reaching the limit
+	 */
+	public function get_memory_remaining()
+	{
+		if ($this->system_data['memory_limit'] <= 0)
+		{
+			return 1;
+		}
+
+		if (function_exists('memory_get_usage'))
+		{
+			return ($this->system_data['memory_limit'] - memory_get_usage());
+		}
+
+		// If we cannot get the information then just return a positive number (and cross fingers)
+		return 1;
+	}
+
+	/**
+	 * Saves the latest executed task
+	 *
+	 * @param int	$task_service_index	Index of the installer task service in the module
+	 */
+	public function set_finished_task($task_service_index)
+	{
+		$this->progress_data['last_task_index']	= $task_service_index;
+	}
+
+	/**
+	 * Set active module
+	 *
+	 * @param string	$module_service_name	Name of the installer module service
+	 * @param int		$module_service_index	Index of the installer module service
+	 */
+	public function set_active_module($module_service_name, $module_service_index)
+	{
+		$this->progress_data['last_task_module_name']	= $module_service_name;
+		$this->progress_data['last_task_module_index']	= $module_service_index;
+	}
+
+	/**
+	 * Getter for progress data
+	 *
+	 * @return array
+	 */
+	public function get_progress_data()
+	{
+		return $this->progress_data;
+	}
+
+	/**
+	 * Recovers install configuration from file
+	 */
+	public function load_config()
+	{
+		if (!$this->filesystem->exists($this->install_config_file))
+		{
+			return;
+		}
+
+		$file_content = @file_get_contents($this->install_config_file);
+		$serialized_data = trim(substr($file_content, 8));
+
+		$installer_config = array();
+		$progress_data = array();
+		$navigation_data = array();
+
+		if (!empty($serialized_data))
+		{
+			$unserialized_data = json_decode($serialized_data, true);
+
+			$installer_config = (is_array($unserialized_data['installer_config'])) ? $unserialized_data['installer_config'] : array();
+			$progress_data = (is_array($unserialized_data['progress_data'])) ? $unserialized_data['progress_data'] : array();
+			$navigation_data = (is_array($unserialized_data['navigation_data'])) ? $unserialized_data['navigation_data'] : array();
+		}
+
+		$this->installer_config = array_merge($this->installer_config, $installer_config);
+		$this->progress_data = array_merge($this->progress_data, $progress_data);
+		$this->navigation_data = array_merge($this->navigation_data, $navigation_data);
+	}
+
+	/**
+	 * Creates a progress restart point
+	 *
+	 * Restart points can be used to repeat certain tasks periodically.
+	 * You need to call this method from the first task you want to repeat.
+	 *
+	 * @param string	$name	Name of the restart point
+	 */
+	public function create_progress_restart_point($name)
+	{
+		$tmp_progress_data = $this->progress_data;
+		unset($tmp_progress_data['_restart_points']);
+
+		$this->progress_data['_restart_points'][$name] = $tmp_progress_data;
+	}
+
+	/**
+	 * Set restart point to continue from
+	 *
+	 * @param string	$name	Name of the restart point
+	 *
+	 * @return bool	Returns false if the restart point name does not exist, otherwise true
+	 */
+	public function jump_to_restart_point($name)
+	{
+		if (!isset($this->progress_data['_restart_points'][$name]) || empty($this->progress_data['_restart_points'][$name]))
+		{
+			return false;
+		}
+
+		foreach ($this->progress_data['_restart_points'][$name] as $key => $value)
+		{
+			$this->progress_data[$key] = $value;
+		}
+
+		return true;
+	}
+
+	/**
+	 * Returns whether a restart point with a given name exists or not
+	 *
+	 * @param string	$name Name of the restart point
+	 *
+	 * @return bool
+	 */
+	public function has_restart_point($name)
+	{
+		return isset($this->progress_data['_restart_points'][$name]);
+	}
+
+	/**
+	 * Dumps install configuration to disk
+	 */
+	public function save_config()
+	{
+		if ($this->do_clean_up)
+		{
+			@unlink($this->install_config_file);
+			return;
+		}
+
+		// Create array to save
+		$save_array = array(
+			'installer_config'	=> $this->installer_config,
+			'progress_data'		=> $this->progress_data,
+			'navigation_data'	=> $this->navigation_data,
+		);
+
+		// Create file content
+		$file_content = '<?php // ';
+		$file_content .= json_encode($save_array);
+		$file_content .= "\n";
+
+		// Dump file_content to disk
+		$fp = @fopen($this->install_config_file, 'w');
+		if (!$fp)
+		{
+			throw new installer_config_not_writable_exception();
+		}
+
+		fwrite($fp, $file_content);
+		fclose($fp);
+	}
+
+	/**
+	 * Increments the task progress
+	 *
+	 * @param int	$increment_by	The amount to increment by
+	 */
+	public function increment_current_task_progress($increment_by = 1)
+	{
+		$this->progress_data['current_task_progress'] += $increment_by;
+
+		if ($this->progress_data['current_task_progress'] > $this->progress_data['max_task_progress'])
+		{
+			$this->progress_data['current_task_progress'] = $this->progress_data['max_task_progress'];
+		}
+	}
+
+	/**
+	 * Sets the task progress to a specific number
+	 *
+	 * @param int	$task_progress	The task progress number to be set
+	 */
+	public function set_current_task_progress($task_progress)
+	{
+		$this->progress_data['current_task_progress'] = $task_progress;
+	}
+
+	/**
+	 * Sets the number of tasks belonging to the installer in the current mode.
+	 *
+	 * @param int	$task_progress_count	Number of tasks
+	 */
+	public function set_task_progress_count($task_progress_count)
+	{
+		$this->progress_data['max_task_progress'] = $task_progress_count;
+	}
+
+	/**
+	 * Returns the number of the current task being executed
+	 *
+	 * @return int
+	 */
+	public function get_current_task_progress()
+	{
+		return $this->progress_data['current_task_progress'];
+	}
+
+	/**
+	 * Returns the number of tasks belonging to the installer in the current mode.
+	 *
+	 * @return int
+	 */
+	public function get_task_progress_count()
+	{
+		return $this->progress_data['max_task_progress'];
+	}
+
+	/**
+	 * Marks stage as completed in the navigation bar
+	 *
+	 * @param array	$nav_path	Array to the navigation elem
+	 */
+	public function set_finished_navigation_stage($nav_path)
+	{
+		if (isset($this->navigation_data['finished']) && in_array($nav_path, $this->navigation_data['finished']))
+		{
+			return;
+		}
+
+		$this->navigation_data['finished'][] = $nav_path;
+	}
+
+	/**
+	 * Marks stage as active in the navigation bar
+	 *
+	 * @param array	$nav_path	Array to the navigation elem
+	 */
+	public function set_active_navigation_stage($nav_path)
+	{
+		$this->navigation_data['active'] = $nav_path;
+	}
+
+	/**
+	 * Returns navigation data
+	 *
+	 * @return array
+	 */
+	public function get_navigation_data()
+	{
+		return $this->navigation_data;
+	}
+
+	/**
+	 * Removes install config file
+	 */
+	public function clean_up_config_file()
+	{
+		$this->do_clean_up = true;
+		@unlink($this->install_config_file);
+	}
+
+	/**
+	 * Filling up system_data array
+	 */
+	protected function setup_system_data()
+	{
+		// Query maximum runtime from php.ini
+		$execution_time = $this->php_ini->getNumeric('max_execution_time');
+		$execution_time = min(15, $execution_time / 2);
+		$this->system_data['max_execution_time'] = $execution_time;
+
+		// Set start time
+		$this->system_data['start_time'] = microtime(true);
+
+		// Get memory limit
+		$this->system_data['memory_limit'] = $this->php_ini->getBytes('memory_limit');
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/container_factory.php
@@ -0,0 +1,191 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper;
+
+use phpbb\install\exception\cannot_build_container_exception;
+use phpbb\language\language;
+use phpbb\request\request;
+
+class container_factory
+{
+	/**
+	 * @var language
+	 */
+	protected $language;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * @var \phpbb\request\request
+	 */
+	protected $request;
+
+	/**
+	 * @var update_helper
+	 */
+	protected $update_helper;
+
+	/**
+	 * The full phpBB container
+	 *
+	 * @var \Symfony\Component\DependencyInjection\ContainerInterface
+	 */
+	protected $container;
+
+	/**
+	 * Constructor
+	 *
+	 * @param language 		$language			Language service
+	 * @param request		$request			Request interface
+	 * @param update_helper	$update_helper		Update helper
+	 * @param string		$phpbb_root_path	Path to phpBB's root
+	 * @param string		$php_ext			Extension of PHP files
+	 */
+	public function __construct(language $language, request $request, update_helper $update_helper, $phpbb_root_path, $php_ext)
+	{
+		$this->language			= $language;
+		$this->request			= $request;
+		$this->update_helper	= $update_helper;
+		$this->phpbb_root_path	= $phpbb_root_path;
+		$this->php_ext			= $php_ext;
+		$this->container		= null;
+	}
+
+	/**
+	 * Container getter
+	 *
+	 * @param null|string	$service_name	Name of the service to return
+	 *
+	 * @return \Symfony\Component\DependencyInjection\ContainerInterface|Object	phpBB's dependency injection container
+	 * 																			or the service specified in $service_name
+	 *
+	 * @throws \phpbb\install\exception\cannot_build_container_exception							When container cannot be built
+	 * @throws \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException			If the service is not defined
+	 * @throws \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException	When a circular reference is detected
+	 * @throws \Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException			When the service is not defined
+	 */
+	public function get($service_name = null)
+	{
+		// Check if container was built, if not try to build it
+		if ($this->container === null)
+		{
+			$this->build_container();
+		}
+
+		return ($service_name === null) ? $this->container : $this->container->get($service_name);
+	}
+
+	/**
+	 * Returns the specified parameter from the container
+	 *
+	 * @param string	$param_name
+	 *
+	 * @return mixed
+	 *
+	 * @throws \phpbb\install\exception\cannot_build_container_exception	When container cannot be built
+	 */
+	public function get_parameter($param_name)
+	{
+		// Check if container was built, if not try to build it
+		if ($this->container === null)
+		{
+			$this->build_container();
+		}
+
+		return $this->container->getParameter($param_name);
+	}
+
+	/**
+	 * Build dependency injection container
+	 *
+	 * @throws \phpbb\install\exception\cannot_build_container_exception	When container cannot be built
+	 */
+	protected function build_container()
+	{
+		// If the container has been already built just return.
+		// Although this should never happen
+		if ($this->container instanceof \Symfony\Component\DependencyInjection\ContainerInterface)
+		{
+			return;
+		}
+
+		// Check whether container can be built
+		// We need config.php for that so let's check if it has been set up yet
+		if (!filesize($this->phpbb_root_path . 'config.' . $this->php_ext))
+		{
+			throw new cannot_build_container_exception();
+		}
+
+		$phpbb_config_php_file = new \phpbb\config_php_file($this->phpbb_root_path, $this->php_ext);
+		$phpbb_container_builder = new \phpbb\di\container_builder($this->phpbb_root_path, $this->php_ext);
+
+		// For BC with functions that we need during install
+		global $phpbb_container, $table_prefix;
+
+		$disable_super_globals = $this->request->super_globals_disabled();
+
+		// This is needed because container_builder::get_env_parameters() uses $_SERVER
+		if ($disable_super_globals)
+		{
+			$this->request->enable_super_globals();
+		}
+
+		$other_config_path = $this->phpbb_root_path . 'install/update/new/config';
+		$config_path = (is_dir($other_config_path)) ? $other_config_path : $this->phpbb_root_path . 'config';
+
+		$this->container = $phpbb_container_builder
+			->with_environment('production')
+			->with_config($phpbb_config_php_file)
+			->with_config_path($config_path)
+			->without_compiled_container()
+			->get_container();
+
+		// Setting request is required for the compatibility globals as those are generated from
+		// this container
+		if (!$this->container->isFrozen())
+		{
+			$this->container->register('request')->setSynthetic(true);
+			$this->container->register('language')->setSynthetic(true);
+		}
+
+		$this->container->set('request', $this->request);
+		$this->container->set('language', $this->language);
+
+		$this->container->compile();
+
+		$phpbb_container = $this->container;
+		$table_prefix = $phpbb_config_php_file->get('table_prefix');
+
+		// Restore super globals to previous state
+		if ($disable_super_globals)
+		{
+			$this->request->disable_super_globals();
+		}
+
+		// Get compatibilty globals and constants
+		$this->update_helper->include_file('includes/compatibility_globals.' . $this->php_ext);
+
+		register_compatibility_globals();
+
+		$this->update_helper->include_file('includes/constants.' . $this->php_ext);
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/database.php
@@ -0,0 +1,430 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper;
+
+use phpbb\install\exception\invalid_dbms_exception;
+
+/**
+ * Database related general functionality for installer
+ */
+class database
+{
+	/**
+	 * @var \phpbb\filesystem\filesystem_interface
+	 */
+	protected $filesystem;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var array
+	 */
+	protected $supported_dbms = array(
+		// Note: php 5.5 alpha 2 deprecated mysql.
+		// Keep mysqli before mysql in this list.
+		'mysqli'	=> array(
+			'LABEL'			=> 'MySQL with MySQLi Extension',
+			'SCHEMA'		=> 'mysql_41',
+			'MODULE'		=> 'mysqli',
+			'DELIM'			=> ';',
+			'DRIVER'		=> 'phpbb\db\driver\mysqli',
+			'AVAILABLE'		=> true,
+			'2.0.x'			=> true,
+		),
+		'mysql'		=> array(
+			'LABEL'			=> 'MySQL',
+			'SCHEMA'		=> 'mysql',
+			'MODULE'		=> 'mysql',
+			'DELIM'			=> ';',
+			'DRIVER'		=> 'phpbb\db\driver\mysql',
+			'AVAILABLE'		=> true,
+			'2.0.x'			=> true,
+		),
+		'mssql_odbc'=>	array(
+			'LABEL'			=> 'MS SQL Server [ ODBC ]',
+			'SCHEMA'		=> 'mssql',
+			'MODULE'		=> 'odbc',
+			'DELIM'			=> ';',
+			'DRIVER'		=> 'phpbb\db\driver\mssql_odbc',
+			'AVAILABLE'		=> true,
+			'2.0.x'			=> true,
+		),
+		'mssqlnative'		=> array(
+			'LABEL'			=> 'MS SQL Server 2005+ [ Native ]',
+			'SCHEMA'		=> 'mssql',
+			'MODULE'		=> 'sqlsrv',
+			'DELIM'			=> ';',
+			'DRIVER'		=> 'phpbb\db\driver\mssqlnative',
+			'AVAILABLE'		=> true,
+			'2.0.x'			=> false,
+		),
+		'oracle'	=>	array(
+			'LABEL'			=> 'Oracle',
+			'SCHEMA'		=> 'oracle',
+			'MODULE'		=> 'oci8',
+			'DELIM'			=> '/',
+			'DRIVER'		=> 'phpbb\db\driver\oracle',
+			'AVAILABLE'		=> true,
+			'2.0.x'			=> false,
+		),
+		'postgres' => array(
+			'LABEL'			=> 'PostgreSQL 8.3+',
+			'SCHEMA'		=> 'postgres',
+			'MODULE'		=> 'pgsql',
+			'DELIM'			=> ';',
+			'DRIVER'		=> 'phpbb\db\driver\postgres',
+			'AVAILABLE'		=> true,
+			'2.0.x'			=> true,
+		),
+		'sqlite3'		=> array(
+			'LABEL'			=> 'SQLite3',
+			'SCHEMA'		=> 'sqlite',
+			'MODULE'		=> 'sqlite3',
+			'DELIM'			=> ';',
+			'DRIVER'		=> 'phpbb\db\driver\sqlite3',
+			'AVAILABLE'		=> true,
+			'2.0.x'			=> false,
+		),
+	);
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\filesystem\filesystem_interface	$filesystem			Filesystem interface
+	 * @param string									$phpbb_root_path	Path to phpBB's root
+	 */
+	public function __construct(\phpbb\filesystem\filesystem_interface $filesystem, $phpbb_root_path)
+	{
+		$this->filesystem		= $filesystem;
+		$this->phpbb_root_path	= $phpbb_root_path;
+	}
+
+	/**
+	 * Returns an array of available DBMS supported by phpBB
+	 *
+	 * If a DBMS is specified it will only return data for that DBMS
+	 * and will load its extension if necessary.
+	 *
+	 * @param	mixed	$dbms				name of the DBMS that's info is required or false for all DBMS info
+	 * @param	bool	$return_unavailable	set it to true if you expect unavailable but supported DBMS
+	 * 										returned as well
+	 * @param	bool	$only_20x_options	set it to true if you only want to recover 2.0.x options
+	 *
+	 * @return	array	Array of available and supported DBMS
+	 */
+	public function get_available_dbms($dbms = false, $return_unavailable = false, $only_20x_options = false)
+	{
+		$available_dbms = $this->supported_dbms;
+
+		if ($dbms)
+		{
+			if (isset($this->supported_dbms[$dbms]))
+			{
+				$available_dbms = array($dbms => $this->supported_dbms[$dbms]);
+			}
+			else
+			{
+				return array();
+			}
+		}
+
+		$any_dbms_available = false;
+		foreach ($available_dbms as $db_name => $db_array)
+		{
+			if ($only_20x_options && !$db_array['2.0.x'])
+			{
+				if ($return_unavailable)
+				{
+					$available_dbms[$db_name]['AVAILABLE'] = false;
+				}
+				else
+				{
+					unset($available_dbms[$db_name]);
+				}
+
+				continue;
+			}
+
+			$dll = $db_array['MODULE'];
+			if (!@extension_loaded($dll))
+			{
+				if ($return_unavailable)
+				{
+					$available_dbms[$db_name]['AVAILABLE'] = false;
+				}
+				else
+				{
+					unset($available_dbms[$db_name]);
+				}
+
+				continue;
+			}
+
+			$any_dbms_available = true;
+		}
+
+		if ($return_unavailable)
+		{
+			$available_dbms['ANY_DB_SUPPORT'] = $any_dbms_available;
+		}
+
+		return $available_dbms;
+	}
+
+	/**
+	 * Removes "/* style" as well as "# style" comments from $input.
+	 *
+	 * @param string $sql_query	Input string
+	 *
+	 * @return string Input string with comments removed
+	 */
+	public function remove_comments($sql_query)
+	{
+		// Remove /* */ comments (http://ostermiller.org/findcomment.html)
+		$sql_query = preg_replace('#/\*(.|[\r\n])*?\*/#', "\n", $sql_query);
+
+		// Remove # style comments
+		$sql_query = preg_replace('/\n{2,}/', "\n", preg_replace('/^#.*$/m', "\n", $sql_query));
+
+		return $sql_query;
+	}
+
+	/**
+	 * split_sql_file() will split an uploaded sql file into single sql statements.
+	 *
+	 * Note: expects trim() to have already been run on $sql.
+	 *
+	 * @param	string	$sql		SQL statements
+	 * @param	string	$delimiter	Delimiter between sql statements
+	 *
+	 * @return array Array of sql statements
+	 */
+	public function split_sql_file($sql, $delimiter)
+	{
+		$sql = str_replace("\r" , '', $sql);
+		$data = preg_split('/' . preg_quote($delimiter, '/') . '$/m', $sql);
+
+		$data = array_map('trim', $data);
+
+		// The empty case
+		$end_data = end($data);
+
+		if (empty($end_data))
+		{
+			unset($data[key($data)]);
+		}
+
+		return $data;
+	}
+
+	/**
+	 * Validates table prefix
+	 *
+	 * @param string	$dbms			The selected dbms
+	 * @param string	$table_prefix	The table prefix to validate
+	 *
+	 * @return bool|array	true if table prefix is valid, array of errors otherwise
+	 *
+	 * @throws \phpbb\install\exception\invalid_dbms_exception When $dbms is not a valid
+	 */
+	public function validate_table_prefix($dbms, $table_prefix)
+	{
+		$errors = array();
+
+		if (!preg_match('#^[a-zA-Z][a-zA-Z0-9_]*$#', $table_prefix))
+		{
+			$errors[] = array(
+				'title' => 'INST_ERR_DB_INVALID_PREFIX',
+			);
+		}
+
+		// Do dbms specific checks
+		$dbms_info = $this->get_available_dbms($dbms);
+		switch ($dbms_info[$dbms]['SCHEMA'])
+		{
+			case 'mysql':
+			case 'mysql_41':
+				$prefix_length = 36;
+			break;
+			case 'mssql':
+				$prefix_length = 90;
+			break;
+			case 'oracle':
+				$prefix_length = 6;
+			break;
+			case 'postgres':
+				$prefix_length = 36;
+			break;
+			case 'sqlite':
+				$prefix_length = 200;
+			break;
+			default:
+				throw new invalid_dbms_exception();
+			break;
+		}
+
+		// Check the prefix length to ensure that index names are not too long
+		if (strlen($table_prefix) > $prefix_length)
+		{
+			$errors[] = array(
+				'title' => array('INST_ERR_PREFIX_TOO_LONG', $prefix_length),
+			);
+		}
+
+		return (empty($errors)) ? true : $errors;
+	}
+
+	/**
+	 * Check if the user provided database parameters are correct
+	 *
+	 * This function checks the database connection data and also checks for
+	 * any other problems that could cause an error during the installation
+	 * such as if there is any database table names conflicting.
+	 *
+	 * Note: The function assumes that $table_prefix has been already validated
+	 * with validate_table_prefix().
+	 *
+	 * @param string	$dbms			Selected database type
+	 * @param string	$dbhost			Database host address
+	 * @param int		$dbport			Database port number
+	 * @param string	$dbuser			Database username
+	 * @param string	$dbpass			Database password
+	 * @param string	$dbname			Database name
+	 * @param string	$table_prefix	Database table prefix
+	 *
+	 * @return array|bool	Returns true if test is successful, array of errors otherwise
+	 */
+	public function check_database_connection($dbms, $dbhost, $dbport, $dbuser, $dbpass, $dbname, $table_prefix)
+	{
+		$dbms_info = $this->get_available_dbms($dbms);
+		$dbms_info = $dbms_info[$dbms];
+		$errors = array();
+
+		// Instantiate it and set return on error true
+		/** @var \phpbb\db\driver\driver_interface $db */
+		$db = new $dbms_info['DRIVER'];
+		$db->sql_return_on_error(true);
+
+		// Check that we actually have a database name before going any further
+		if (!in_array($dbms_info['SCHEMA'], array('sqlite', 'oracle'), true) && $dbname === '')
+		{
+			$errors[] = array(
+				'title' => 'INST_ERR_DB_NO_NAME',
+			);
+		}
+
+		// Make sure we don't have a daft user who thinks having the SQLite database in the forum directory is a good idea
+		if ($dbms_info['SCHEMA'] === 'sqlite'
+			&& stripos($this->filesystem->realpath($dbhost), $this->filesystem->realpath($this->phpbb_root_path) === 0))
+		{
+			$errors[] = array(
+				'title' =>'INST_ERR_DB_FORUM_PATH',
+			);
+		}
+
+		// Try to connect to db
+		if (is_array($db->sql_connect($dbhost, $dbuser, $dbpass, $dbname, $dbport, false, true)))
+		{
+			$db_error = $db->sql_error();
+			$errors[] = array(
+				'title' => 'INST_ERR_DB_CONNECT',
+				'description' => ($db_error['message']) ? utf8_convert_message($db_error['message']) : 'INST_ERR_DB_NO_ERROR',
+			);
+		}
+		else
+		{
+			// Check if there is any table name collisions
+			$temp_prefix = strtolower($table_prefix);
+			$table_ary = array(
+				$temp_prefix . 'attachments',
+				$temp_prefix . 'config',
+				$temp_prefix . 'sessions',
+				$temp_prefix . 'topics',
+				$temp_prefix . 'users',
+			);
+
+			$db_tools_factory = new \phpbb\db\tools\factory();
+			$db_tools = $db_tools_factory->get($db);
+			$tables = $db_tools->sql_list_tables();
+			$tables = array_map('strtolower', $tables);
+			$table_intersect = array_intersect($tables, $table_ary);
+
+			if (sizeof($table_intersect))
+			{
+				$errors[] = array(
+					'title' => 'INST_ERR_PREFIX',
+				);
+			}
+
+			// Check if database version is supported
+			switch ($dbms)
+			{
+				case 'mysqli':
+					if (version_compare($db->sql_server_info(true), '4.1.3', '<'))
+					{
+						$errors[] = array(
+							'title' => 'INST_ERR_DB_NO_MYSQLI',
+						);
+					}
+				break;
+				case 'sqlite3':
+					if (version_compare($db->sql_server_info(true), '3.6.15', '<'))
+					{
+						$errors[] = array(
+							'title' => 'INST_ERR_DB_NO_SQLITE3',
+						);
+					}
+				break;
+				case 'oracle':
+					$sql = "SELECT *
+						FROM NLS_DATABASE_PARAMETERS
+						WHERE PARAMETER = 'NLS_RDBMS_VERSION'
+							OR PARAMETER = 'NLS_CHARACTERSET'";
+					$result = $db->sql_query($sql);
+
+					while ($row = $db->sql_fetchrow($result))
+					{
+						$stats[$row['parameter']] = $row['value'];
+					}
+					$db->sql_freeresult($result);
+
+					if (version_compare($stats['NLS_RDBMS_VERSION'], '9.2', '<') && $stats['NLS_CHARACTERSET'] !== 'UTF8')
+					{
+						$errors[] = array(
+							'title' => 'INST_ERR_DB_NO_ORACLE',
+						);
+					}
+				break;
+				case 'postgres':
+					$sql = "SHOW server_encoding;";
+					$result = $db->sql_query($sql);
+					$row = $db->sql_fetchrow($result);
+					$db->sql_freeresult($result);
+
+					if ($row['server_encoding'] !== 'UNICODE' && $row['server_encoding'] !== 'UTF8')
+					{
+						$errors[] = array(
+							'title' => 'INST_ERR_DB_NO_POSTGRES',
+						);
+					}
+				break;
+			}
+		}
+
+		return (empty($errors)) ? true : $errors;
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/file_updater/compression_file_updater.php
@@ -0,0 +1,133 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\file_updater;
+
+use phpbb\install\helper\update_helper;
+
+/**
+ * File updater for generating archive with updated files
+ */
+class compression_file_updater implements file_updater_interface
+{
+	/**
+	 * @var \compress
+	 */
+	protected $compress;
+
+	/**
+	 * @var update_helper
+	 */
+	protected $update_helper;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * Constructor
+	 *
+	 * @param update_helper	$update_helper
+	 * @param string		$phpbb_root_path
+	 * @param string		$php_ext
+	 */
+	public function __construct(update_helper $update_helper, $phpbb_root_path, $php_ext)
+	{
+		$this->compress			= null;
+		$this->update_helper	= $update_helper;
+		$this->phpbb_root_path	= $phpbb_root_path;
+		$this->php_ext			= $php_ext;
+	}
+
+	/**
+	 * Set the compression method
+	 *
+	 * @param string	$method	Compression method's file extension
+	 *
+	 * @return string	Archive's filename
+	 */
+	public function init($method)
+	{
+		$this->update_helper->include_file('includes/functions_compress.' . $this->php_ext);
+
+		$archive_filename = 'update_archive_' . time() . '_' . uniqid();
+		$path = $this->phpbb_root_path . 'store/' . $archive_filename . '' . $method;
+
+		if ($method === '.zip')
+		{
+			$this->compress = new \compress_zip('w', $path);
+		}
+		else
+		{
+			$this->compress = new \compress_tar('w', $path, $method);
+		}
+
+		return $path;
+	}
+
+	/**
+	 * Close archive writing process
+	 */
+	public function close()
+	{
+		$this->compress->close();
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function delete_file($path_to_file)
+	{
+		// We do absolutely nothing here, as this function is called when a file should be
+		// removed from the filesystem, but since this is an archive generator, it clearly
+		// cannot do that.
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function create_new_file($path_to_file_to_create, $source, $create_from_content = false)
+	{
+		if ($create_from_content)
+		{
+			$this->compress->add_data($source, $path_to_file_to_create);
+		}
+		else
+		{
+			$this->compress->add_custom_file($source, $path_to_file_to_create);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function update_file($path_to_file_to_update, $source, $create_from_content = false)
+	{
+		// Both functions are identical here
+		$this->create_new_file($path_to_file_to_update, $source, $create_from_content);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_method_name()
+	{
+		return 'compression';
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/file_updater/factory.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\file_updater;
+
+use phpbb\di\service_collection;
+use phpbb\install\exception\file_updater_failure_exception;
+
+/**
+ * File updater factory
+ */
+class factory
+{
+	/**
+	 * @var array
+	 */
+	protected $file_updaters;
+
+	/**
+	 * Constructor
+	 *
+	 * @param service_collection $collection	File updater service collection
+	 */
+	public function __construct(service_collection $collection)
+	{
+		foreach ($collection as $service)
+		{
+			$this->register($service);
+		}
+	}
+
+	/**
+	 * Register updater object
+	 *
+	 * @param file_updater_interface $updater	Updater object
+	 */
+	public function register(file_updater_interface $updater)
+	{
+		$name = $updater->get_method_name();
+		$this->file_updaters[$name] = $updater;
+	}
+
+	/**
+	 * Returns file updater object
+	 *
+	 * @param string $name	Name of the updater method
+	 *
+	 * @throws file_updater_failure_exception	When the specified file updater does not exist
+	 */
+	public function get($name)
+	{
+		if (!isset($this->file_updaters[$name]))
+		{
+			throw new file_updater_failure_exception();
+		}
+
+		return $this->file_updaters[$name];
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/file_updater/file_updater.php
@@ -0,0 +1,202 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\file_updater;
+
+use phpbb\filesystem\exception\filesystem_exception;
+use phpbb\filesystem\filesystem;
+use phpbb\install\exception\file_updater_failure_exception;
+
+/**
+ * File updater for direct filesystem access
+ */
+class file_updater implements file_updater_interface
+{
+	/**
+	 * @var filesystem
+	 */
+	protected $filesystem;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * Constructor
+	 *
+	 * @param filesystem	$filesystem
+	 * @param string		$phpbb_root_path
+	 */
+	public function __construct(filesystem $filesystem, $phpbb_root_path)
+	{
+		$this->filesystem		= $filesystem;
+		$this->phpbb_root_path	= $phpbb_root_path;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 *
+	 * @throws file_updater_failure_exception	When the file is not writable
+	 * @throws filesystem_exception				When the filesystem class fails
+	 */
+	public function delete_file($path_to_file)
+	{
+		$this->filesystem->remove($this->phpbb_root_path . $path_to_file);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 *
+	 * @throws file_updater_failure_exception	When the file is not writable
+	 * @throws filesystem_exception				When the filesystem class fails
+	 */
+	public function create_new_file($path_to_file_to_create, $source, $create_from_content = false)
+	{
+		$path_to_file_to_create = $this->phpbb_root_path . $path_to_file_to_create;
+
+		$dir = dirname($path_to_file_to_create);
+		if (!$this->filesystem->exists($dir))
+		{
+			$this->make_dir($dir);
+		}
+
+		$original_dir_perms = false;
+
+		if (!$this->filesystem->is_writable($dir))
+		{
+			// Extract last 9 bits we actually need
+			$original_dir_perms = @fileperms($dir) & 511;
+			$this->filesystem->phpbb_chmod($dir, filesystem::CHMOD_ALL);
+		}
+
+		if (!$create_from_content)
+		{
+			try
+			{
+				$this->filesystem->copy($source, $path_to_file_to_create);
+			}
+			catch (filesystem_exception $e)
+			{
+				$this->write_file($path_to_file_to_create, $source, $create_from_content);
+			}
+		}
+		else
+		{
+			$this->write_file($path_to_file_to_create, $source, $create_from_content);
+		}
+
+		if ($original_dir_perms !== false)
+		{
+			$this->filesystem->phpbb_chmod($dir, $original_dir_perms);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 *
+	 * @throws file_updater_failure_exception	When the file is not writable
+	 * @throws filesystem_exception				When the filesystem class fails
+	 */
+	public function update_file($path_to_file_to_update, $source, $create_from_content = false)
+	{
+		$path_to_file_to_update = $this->phpbb_root_path . $path_to_file_to_update;
+		$original_file_perms = false;
+
+		// Maybe necessary for binary files
+		$dir = dirname($path_to_file_to_update);
+		if (!$this->filesystem->exists($dir))
+		{
+			$this->make_dir($dir);
+		}
+
+		if (!$this->filesystem->is_writable($path_to_file_to_update))
+		{
+			// Extract last 9 bits we actually need
+			$original_file_perms = @fileperms($path_to_file_to_update) & 511;
+			$this->filesystem->phpbb_chmod($path_to_file_to_update, filesystem::CHMOD_WRITE);
+		}
+
+		if (!$create_from_content)
+		{
+			try
+			{
+				$this->filesystem->copy($source, $path_to_file_to_update, true);
+			}
+			catch (filesystem_exception $e)
+			{
+				$this->write_file($path_to_file_to_update, $source, $create_from_content);
+			}
+		}
+		else
+		{
+			$this->write_file($path_to_file_to_update, $source, $create_from_content);
+		}
+
+		if ($original_file_perms !== false)
+		{
+			$this->filesystem->phpbb_chmod($path_to_file_to_update, $original_file_perms);
+		}
+	}
+
+	/**
+	 * Creates directory structure
+	 *
+	 * @param string	$path	Path to the directory where the file should be placed (and non-existent)
+	 */
+	private function make_dir($path)
+	{
+		if (is_dir($path))
+		{
+			return;
+		}
+
+		$path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
+		$this->filesystem->mkdir($path, 493); // 493 === 0755
+	}
+
+	/**
+	 * Fallback function for file writing
+	 *
+	 * @param string		$path_to_file			Path to the file's location
+	 * @param string		$source					Path to file to copy or string with the new file's content
+	 * @param bool|false	$create_from_content	Whether or not to use $source as the content, false by default
+	 *
+	 * @throws file_updater_failure_exception	When the file is not writable
+	 */
+	private function write_file($path_to_file, $source, $create_from_content = false)
+	{
+		if (!$create_from_content)
+		{
+			$source = @file_get_contents($source);
+		}
+
+		$file_pointer = @fopen($path_to_file, 'w');
+
+		if (!is_resource($file_pointer))
+		{
+			throw new file_updater_failure_exception();
+		}
+
+		@fwrite($file_pointer, $source);
+		@fclose($file_pointer);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_method_name()
+	{
+		return 'direct_file';
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/file_updater/file_updater_interface.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\file_updater;
+
+interface file_updater_interface
+{
+	/**
+	 * Deletes a file
+	 *
+	 * @param string	$path_to_file	Path to the file to delete
+	 */
+	public function delete_file($path_to_file);
+
+	/**
+	 * Creates a new file
+	 *
+	 * @param string	$path_to_file_to_create	Path to the new file's location
+	 * @param string	$source					Path to file to copy or string with the new file's content
+	 * @param bool		$create_from_content	Whether or not to use $source as the content, false by default
+	 */
+	public function create_new_file($path_to_file_to_create, $source, $create_from_content = false);
+
+	/**
+	 * Update file
+	 *
+	 * @param string	$path_to_file_to_update	Path to the file's location
+	 * @param string	$source					Path to file to copy or string with the new file's content
+	 * @param bool		$create_from_content	Whether or not to use $source as the content, false by default
+	 */
+	public function update_file($path_to_file_to_update, $source, $create_from_content = false);
+
+	/**
+	 * Returns the name of the file updater method
+	 *
+	 * @return string
+	 */
+	public function get_method_name();
+}
--- /dev/null
+++ b/phpbb/install/helper/file_updater/ftp_file_updater.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\file_updater;
+
+use phpbb\install\helper\update_helper;
+
+/**
+ * File updater for FTP updates
+ */
+class ftp_file_updater implements file_updater_interface
+{
+	/**
+	 * @var \transfer
+	 */
+	protected $transfer;
+
+	/**
+	 * @var update_helper
+	 */
+	protected $update_helper;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * Constructor
+	 *
+	 * @param update_helper	$update_helper
+	 * @param string		$phpbb_root_path
+	 * @param string		$php_ext
+	 */
+	public function __constructor(update_helper $update_helper, $phpbb_root_path, $php_ext)
+	{
+		$this->transfer			= null;
+		$this->update_helper	= $update_helper;
+		$this->phpbb_root_path	= $phpbb_root_path;
+		$this->php_ext			= $php_ext;
+	}
+
+	/**
+	 * Initialize FTP connection
+	 *
+	 * @param string	$method
+	 * @param string	$host
+	 * @param string	$user
+	 * @param string	$pass
+	 * @param string	$path
+	 * @param int		$port
+	 * @param int		$timeout
+	 */
+	public function init($method, $host, $user, $pass, $path, $port, $timeout)
+	{
+		$this->update_helper->include_file('includes/functions_transfer.' . $this->php_ext);
+		$this->transfer = new $method($host, $user, $pass, $path, $port, $timeout);
+		$this->transfer->open_session();
+	}
+
+	/**
+	 * Close FTP session
+	 */
+	public function close()
+	{
+		$this->transfer->close_session();
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function delete_file($path_to_file)
+	{
+		$this->transfer->delete_file($path_to_file);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function create_new_file($path_to_file_to_create, $source, $create_from_content = false)
+	{
+		$dirname = dirname($path_to_file_to_create);
+
+		if ($dirname && !file_exists($this->phpbb_root_path . $dirname))
+		{
+			$this->transfer->make_dir($dirname);
+		}
+
+		if ($create_from_content)
+		{
+			$this->transfer->write_file($path_to_file_to_create, $source);
+		}
+		else
+		{
+			$this->transfer->copy_file($path_to_file_to_create, $source);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function update_file($path_to_file_to_update, $source, $create_from_content = false)
+	{
+		if ($create_from_content)
+		{
+			$this->transfer->write_file($path_to_file_to_update, $source);
+		}
+		else
+		{
+			$this->transfer->copy_file($path_to_file_to_update, $source);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_method_name()
+	{
+		return 'ftp';
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/install_helper.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper;
+
+/**
+ * General helper functionality for the installer
+ */
+class install_helper
+{
+	/**
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * Constructor
+	 *
+	 * @param string	$phpbb_root_path	path to phpBB's root
+	 * @param string	$php_ext			Extension of PHP files
+	 */
+	public function __construct($phpbb_root_path, $php_ext)
+	{
+		$this->phpbb_root_path	= $phpbb_root_path;
+		$this->php_ext			= $php_ext;
+	}
+
+	/**
+	 * Check whether phpBB is installed.
+	 *
+	 * @return bool
+	 */
+	public function is_phpbb_installed()
+	{
+		$config_path = $this->phpbb_root_path . 'config.' . $this->php_ext;
+		$install_lock_path = $this->phpbb_root_path . 'cache/install_lock';
+
+		if (file_exists($config_path) && !file_exists($install_lock_path) && filesize($config_path))
+		{
+			return true;
+		}
+
+		return false;
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/iohandler/ajax_iohandler.php
@@ -0,0 +1,497 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\iohandler;
+
+use phpbb\path_helper;
+use phpbb\routing\router;
+
+/**
+ * Input-Output handler for the AJAX frontend
+ */
+class ajax_iohandler extends iohandler_base
+{
+	/**
+	 * @var path_helper
+	 */
+	protected $path_helper;
+
+	/**
+	 * @var \phpbb\request\request_interface
+	 */
+	protected $request;
+
+	/**
+	 * @var \phpbb\template\template
+	 */
+	protected $template;
+
+	/**
+	 * @var router
+	 */
+	protected $router;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string
+	 */
+	protected $file_status;
+
+	/**
+	 * @var string
+	 */
+	protected $form;
+
+	/**
+	 * @var bool
+	 */
+	protected $request_client_refresh;
+
+	/**
+	 * @var array
+	 */
+	protected $nav_data;
+
+	/**
+	 * @var array
+	 */
+	protected $cookies;
+
+	/**
+	 * @var array
+	 */
+	protected $download;
+
+	/**
+	 * @var array
+	 */
+	protected $redirect_url;
+
+	/**
+	 * @var resource
+	 */
+	protected $file_lock_pointer;
+
+	/**
+	 * Constructor
+	 *
+	 * @param path_helper						$path_helper
+	 * @param \phpbb\request\request_interface	$request	HTTP request interface
+	 * @param \phpbb\template\template			$template	Template engine
+	 * @param router 							$router		Router
+	 * @param string 							$root_path	Path to phpBB's root
+	 */
+	public function __construct(path_helper $path_helper, \phpbb\request\request_interface $request, \phpbb\template\template $template, router $router, $root_path)
+	{
+		$this->path_helper = $path_helper;
+		$this->request	= $request;
+		$this->router	= $router;
+		$this->template	= $template;
+		$this->form		= '';
+		$this->nav_data	= array();
+		$this->cookies	= array();
+		$this->download	= array();
+		$this->redirect_url = array();
+		$this->file_status = '';
+		$this->phpbb_root_path = $root_path;
+
+		parent::__construct();
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_input($name, $default, $multibyte = false)
+	{
+		return $this->request->variable($name, $default, $multibyte);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_raw_input($name, $default)
+	{
+		return $this->request->raw_variable($name, $default);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_server_variable($name, $default = '')
+	{
+		return $this->request->server($name, $default);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_header_variable($name, $default = '')
+	{
+		return $this->request->header($name, $default);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function is_secure()
+	{
+		return $this->request->is_secure();
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function add_user_form_group($title, $form)
+	{
+		$this->form = $this->generate_form_render_data($title, $form);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function generate_form_render_data($title, $form)
+	{
+		$this->template->assign_block_vars('options', array(
+			'LEGEND'	=> $this->language->lang($title),
+			'S_LEGEND'	=> true,
+		));
+
+		$not_button_form = false;
+
+		foreach ($form as $input_name => $input_options)
+		{
+			if (!isset($input_options['type']))
+			{
+				continue;
+			}
+
+			$tpl_ary = array();
+			$not_button_form = ($input_options['type'] !== 'submit' || $not_button_form);
+
+			$tpl_ary['TYPE'] = $input_options['type'];
+			$tpl_ary['TITLE'] = $this->language->lang($input_options['label']);
+			$tpl_ary['KEY'] = $input_name;
+			$tpl_ary['S_EXPLAIN'] = false;
+
+			if (isset($input_options['default']))
+			{
+				$default = $input_options['default'];
+				$default = preg_replace_callback('#\{L_([A-Z0-9\-_]*)\}#s', array($this, 'lang_replace_callback'), $default);
+				$tpl_ary['DEFAULT'] = $default;
+			}
+
+			if (isset($input_options['description']))
+			{
+				$tpl_ary['TITLE_EXPLAIN'] = $this->language->lang($input_options['description']);
+				$tpl_ary['S_EXPLAIN'] = true;
+			}
+
+			if (in_array($input_options['type'], array('select', 'radio'), true))
+			{
+				for ($i = 0, $total = sizeof($input_options['options']); $i < $total; $i++)
+				{
+					if (isset($input_options['options'][$i]['label']))
+					{
+						$input_options['options'][$i]['label'] = $this->language->lang($input_options['options'][$i]['label']);
+					}
+				}
+
+				$tpl_ary['OPTIONS'] = $input_options['options'];
+			}
+
+			$block_name = ($input_options['type'] === 'submit') ? 'submit_buttons' : 'options';
+			$this->template->assign_block_vars($block_name, $tpl_ary);
+		}
+
+		$this->template->assign_var('S_NOT_ONLY_BUTTON_FORM', $not_button_form);
+
+		$this->template->set_filenames(array(
+			'form_install' => 'installer_form.html',
+		));
+
+		return $this->template->assign_display('form_install');
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function send_response($no_more_output = false)
+	{
+		$json_data_array = $this->prepare_json_array($no_more_output);
+
+		if (empty($json_data_array))
+		{
+			return;
+		}
+
+		$json_data = json_encode($json_data_array);
+
+		// Try to push content to the browser
+		print(str_pad(' ', 4096) . "\n");
+		print($json_data . "\n\n");
+		flush();
+	}
+
+	/**
+	 * Prepares iohandler's data to be sent out to the client.
+	 *
+	 * @param bool	$no_more_output	Whether or not there will be more output in this response
+	 *
+	 * @return array
+	 */
+	protected function prepare_json_array($no_more_output = false)
+	{
+		$json_array = array();
+
+		if (!empty($this->errors))
+		{
+			$json_array['errors'] = $this->errors;
+			$this->errors = array();
+		}
+
+		if (!empty($this->warnings))
+		{
+			$json_array['warnings'] = $this->warnings;
+			$this->warnings = array();
+		}
+
+		if (!empty($this->logs))
+		{
+			$json_array['logs'] = $this->logs;
+			$this->logs = array();
+		}
+
+		if (!empty($this->success))
+		{
+			$json_array['success'] = $this->success;
+			$this->success = array();
+		}
+
+		if (!empty($this->download))
+		{
+			$json_array['download'] = $this->download;
+			$this->download = array();
+		}
+
+		if (!empty($this->form))
+		{
+			$json_array['form'] = $this->form;
+			$this->form = '';
+		}
+
+		if (!empty($this->file_status))
+		{
+			$json_array['file_status'] = $this->file_status;
+			$this->file_status = '';
+		}
+
+		// If current task name is set, we push progress message to the client side
+		if (!empty($this->current_task_name))
+		{
+			$json_array['progress'] = array(
+				'task_name'		=> $this->current_task_name,
+				'task_num'		=> $this->current_task_progress,
+				'task_count'	=> $this->task_progress_count,
+			);
+
+			if ($this->restart_progress_bar)
+			{
+				$json_array['progress']['restart'] = 1;
+				$this->restart_progress_bar = false;
+			}
+		}
+
+		if (!empty($this->nav_data))
+		{
+			$json_array['nav'] = $this->nav_data;
+			$this->nav_data = array();
+		}
+
+		if ($this->request_client_refresh)
+		{
+			$json_array['refresh'] = true;
+			$this->request_client_refresh = false;
+		}
+
+		if (!empty($this->cookies))
+		{
+			$json_array['cookies'] = $this->cookies;
+			$this->cookies = array();
+		}
+
+		if (!empty($this->redirect_url))
+		{
+			$json_array['redirect'] = $this->redirect_url;
+			$this->redirect_url = array();
+		}
+
+		if ($no_more_output)
+		{
+			$json_array['over'] = true;
+		}
+
+		return $json_array;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function set_progress($task_lang_key, $task_number)
+	{
+		parent::set_progress($task_lang_key, $task_number);
+		$this->send_response();
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function request_refresh()
+	{
+		$this->request_client_refresh = true;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function set_active_stage_menu($menu_path)
+	{
+		$this->nav_data['active'] = $menu_path[sizeof($menu_path) - 1];
+		$this->send_response();
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function set_finished_stage_menu($menu_path)
+	{
+		$this->nav_data['finished'][] = $menu_path[sizeof($menu_path) - 1];
+		$this->send_response();
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function set_cookie($cookie_name, $cookie_value)
+	{
+		$this->cookies[] = array(
+			'name' => $cookie_name,
+			'value' => $cookie_value
+		);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function add_download_link($route, $title, $msg = null)
+	{
+		$link_properties = array(
+			'href'	=> $this->router->generate($route),
+			'title'	=> $this->language->lang($title),
+			'download' => $this->language->lang('DOWNLOAD'),
+		);
+
+		if ($msg !== null)
+		{
+			$link_properties['msg'] = htmlspecialchars_decode($this->language->lang($msg));
+		}
+
+		$this->download[] = $link_properties;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function render_update_file_status($status_array)
+	{
+		$this->template->assign_vars(array(
+			'T_IMAGE_PATH'	=> $this->path_helper->get_web_root_path() . 'adm/images/',
+		));
+
+		foreach ($status_array as $block => $list)
+		{
+			foreach ($list as $filename)
+			{
+				$dirname = dirname($filename);
+
+				$this->template->assign_block_vars($block, array(
+					'STATUS'			=> $block,
+					'FILENAME'			=> $filename,
+					'DIR_PART'			=> (!empty($dirname) && $dirname !== '.') ? dirname($filename) . '/' : false,
+					'FILE_PART'			=> basename($filename),
+				));
+			}
+		}
+
+		$this->template->set_filenames(array(
+			'file_status' => 'installer_update_file_status.html',
+		));
+
+		$this->file_status = $this->template->assign_display('file_status');
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function redirect($url, $use_ajax = false)
+	{
+		$this->redirect_url = array('url' => $url, 'use_ajax' => $use_ajax);
+		$this->send_response(true);
+	}
+
+	/**
+	 * Acquires a file lock
+	 */
+	public function acquire_lock()
+	{
+		$lock_file = $this->phpbb_root_path . 'store/io_lock.lock';
+		$this->file_lock_pointer = @fopen($lock_file, 'w+');
+
+		if ($this->file_lock_pointer)
+		{
+			flock($this->file_lock_pointer, LOCK_EX);
+		}
+	}
+
+	/**
+	 * Release file lock
+	 */
+	public function release_lock()
+	{
+		if ($this->file_lock_pointer)
+		{
+			fwrite($this->file_lock_pointer, 'ok');
+			flock($this->file_lock_pointer, LOCK_UN);
+			fclose($this->file_lock_pointer);
+		}
+	}
+
+	/**
+	 * Callback function for language replacing
+	 *
+	 * @param array	$matches
+	 * @return string
+	 */
+	public function lang_replace_callback($matches)
+	{
+		if (!empty($matches[1]))
+		{
+			return $this->language->lang($matches[1]);
+		}
+
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/iohandler/cli_iohandler.php
@@ -0,0 +1,323 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\iohandler;
+
+use phpbb\install\exception\installer_exception;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\OutputStyle;
+
+/**
+ * Input-Output handler for the CLI frontend
+ */
+class cli_iohandler extends iohandler_base
+{
+	/**
+	 * @var OutputInterface
+	 */
+	protected $output;
+
+	/**
+	 * @var OutputStyle
+	 */
+	protected $io;
+
+	/**
+	 * @var array
+	 */
+	protected $input_values = array();
+
+	/**
+	 * @var \Symfony\Component\Console\Helper\ProgressBar
+	 */
+	protected $progress_bar;
+
+	/**
+	 * Set the style and output used to display feedback;
+	 *
+	 * @param OutputStyle 		$style
+	 * @param OutputInterface	$output
+	 */
+	public function set_style(OutputStyle $style, OutputInterface $output)
+	{
+		$this->io = $style;
+		$this->output = $output;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_input($name, $default, $multibyte = false)
+	{
+		$result = $default;
+
+		if (isset($this->input_values[$name]))
+		{
+			$result = $this->input_values[$name];
+		}
+
+		if ($multibyte)
+		{
+			return utf8_normalize_nfc($result);
+		}
+
+		return $result;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_raw_input($name, $default)
+	{
+		return $this->get_input($name, $default, true);
+	}
+
+	/**
+	 * Set input variable
+	 *
+	 * @param string $name Name of input variable
+	 * @param mixed $value Value of input variable
+	 */
+	public function set_input($name, $value)
+	{
+		$this->input_values[$name] = $value;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_server_variable($name, $default = '')
+	{
+		return $default;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_header_variable($name, $default = '')
+	{
+		return $default;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function is_secure()
+	{
+		return false;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function add_user_form_group($title, $form)
+	{
+		throw new installer_exception('MISSING_DATA');
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function send_response($no_more_output = false)
+	{
+	}
+
+	/**
+	 * {@inheritdoc
+	 */
+	public function add_error_message($error_title, $error_description = false)
+	{
+		$this->io->newLine();
+		$message = $this->translate_message($error_title, $error_description);
+		$message_string = $message['title'] . (!empty($message['description']) ? "\n" . $message['description'] : '');
+
+		if (strpos($message_string, '<br />') !== false)
+		{
+			$message_string = strip_tags(str_replace('<br />', "\n", $message_string));
+		}
+
+		$this->io->error($message_string);
+
+		if ($this->progress_bar !== null)
+		{
+			$this->io->newLine(2);
+			$this->progress_bar->display();
+		}
+	}
+
+	/**
+	 * {@inheritdoc
+	 */
+	public function add_warning_message($warning_title, $warning_description = false)
+	{
+		$this->io->newLine();
+
+		$message = $this->translate_message($warning_title, $warning_description);
+		$message_string = $message['title'] . (!empty($message['description']) ? "\n" . $message['description'] : '');
+		$this->io->warning($message_string);
+
+		if ($this->progress_bar !== null)
+		{
+			$this->io->newLine(2);
+			$this->progress_bar->display();
+		}
+	}
+
+	/**
+	 * {@inheritdoc
+	 */
+	public function add_log_message($log_title, $log_description = false)
+	{
+		if ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL)
+		{
+			$message = $this->translate_message($log_title, $log_description);
+			$this->output->writeln(sprintf('[%3d/%-3d] ---- %s', $this->current_task_progress, $this->task_progress_count, $message['title']));
+		}
+	}
+
+	/**
+	 * {@inheritdoc
+	 */
+	public function add_success_message($error_title, $error_description = false)
+	{
+		$this->io->newLine();
+
+		$message = $this->translate_message($error_title, $error_description);
+		$message_string = $message['title'] . (!empty($message['description']) ? "\n" . $message['description'] : '');
+		$this->io->success($message_string);
+
+		if ($this->progress_bar !== null)
+		{
+			$this->io->newLine(2);
+			$this->progress_bar->display();
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function set_task_count($task_count, $restart = false)
+	{
+		parent::set_task_count($task_count, $restart);
+
+		if ($this->output->getVerbosity() === OutputInterface::VERBOSITY_NORMAL)
+		{
+			if ($this->progress_bar !== null)
+			{
+				// Symfony's ProgressBar is immutable regarding task_count, so delete the old and create a new one.
+				$this->progress_bar->clear();
+			}
+			else
+			{
+				$this->io->newLine(2);
+			}
+
+			$this->progress_bar = $this->io->createProgressBar($task_count);
+			$this->progress_bar->setFormat(
+				"    %current:3s%/%max:-3s% %bar%  %percent:3s%%\n" .
+				"             %message%\n");
+			$this->progress_bar->setBarWidth(60);
+
+			if (!defined('PHP_WINDOWS_VERSION_BUILD'))
+			{
+				$this->progress_bar->setEmptyBarCharacter('░'); // light shade character \u2591
+				$this->progress_bar->setProgressCharacter('');
+				$this->progress_bar->setBarCharacter('▓'); // dark shade character \u2593
+			}
+
+			$this->progress_bar->setMessage('');
+			$this->progress_bar->start();
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function set_progress($task_lang_key, $task_number)
+	{
+		parent::set_progress($task_lang_key, $task_number);
+
+		if ($this->progress_bar !== null)
+		{
+			$this->progress_bar->setProgress($this->current_task_progress);
+			$this->progress_bar->setMessage($this->current_task_name);
+		}
+		else
+		{
+			$this->output->writeln(sprintf('[%3d/%-3d] %s', $this->current_task_progress, $this->task_progress_count, $this->current_task_name));
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function finish_progress($message_lang_key)
+	{
+		parent::finish_progress($message_lang_key);
+
+		if ($this->progress_bar !== null)
+		{
+			$this->progress_bar->finish();
+			$this->progress_bar = null;
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function request_refresh()
+	{
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function set_active_stage_menu($menu_path)
+	{
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function set_finished_stage_menu($menu_path)
+	{
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function set_cookie($cookie_name, $cookie_value)
+	{
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function add_download_link($route, $title, $msg = null)
+	{
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function render_update_file_status($status_array)
+	{
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function redirect($url, $use_ajax = false)
+	{
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/iohandler/exception/iohandler_not_implemented_exception.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\iohandler\exception;
+
+class iohandler_not_implemented_exception extends \Exception
+{
+
+}
--- /dev/null
+++ b/phpbb/install/helper/iohandler/factory.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\iohandler;
+
+use phpbb\install\helper\iohandler\exception\iohandler_not_implemented_exception;
+
+/**
+ * Input-output handler factory
+ */
+class factory
+{
+	/**
+	 * @var \Symfony\Component\DependencyInjection\ContainerInterface
+	 */
+	protected $container;
+
+	/**
+	 * @var string
+	 */
+	protected $environment;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \Symfony\Component\DependencyInjection\ContainerInterface $container Dependency injection container
+	 */
+	public function __construct(\Symfony\Component\DependencyInjection\ContainerInterface $container)
+	{
+		$this->container	= $container;
+		$this->environment	= null;
+	}
+
+	/**
+	 * @param string	$environment	The name of the input-output handler to use
+	 */
+	public function set_environment($environment)
+	{
+		$this->environment = $environment;
+	}
+
+	/**
+	 * Factory getter for iohandler
+	 *
+	 * @return \phpbb\install\helper\iohandler\iohandler_interface
+	 *
+	 * @throws \phpbb\install\helper\iohandler\exception\iohandler_not_implemented_exception
+	 * 		When the specified iohandler_interface does not exists
+	 */
+	public function get()
+	{
+		switch ($this->environment)
+		{
+			case 'ajax':
+				return $this->container->get('installer.helper.iohandler_ajax');
+			break;
+			case 'nojs':
+				// @todo replace this
+				return $this->container->get('installer.helper.iohandler_ajax');
+			break;
+			case 'cli':
+				return $this->container->get('installer.helper.iohandler_cli');
+			break;
+			default:
+				throw new iohandler_not_implemented_exception();
+			break;
+		}
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/iohandler/iohandler_base.php
@@ -0,0 +1,209 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\iohandler;
+
+/**
+ * Base class for installer input-output handlers
+ */
+abstract class iohandler_base implements iohandler_interface
+{
+	/**
+	 * Array of errors
+	 *
+	 * Errors should be added, when the installation cannot continue without
+	 * user interaction. If the aim is to notify the user about something, please
+	 * use a warning instead.
+	 *
+	 * @var array
+	 */
+	protected $errors;
+
+	/**
+	 * Array of warnings
+	 *
+	 * @var array
+	 */
+	protected $warnings;
+
+	/**
+	 * Array of logs
+	 *
+	 * @var array
+	 */
+	protected $logs;
+
+	/**
+	 * Array of success messages
+	 *
+	 * @var array
+	 */
+	protected $success;
+
+	/**
+	 * @var \phpbb\language\language
+	 */
+	protected $language;
+
+	/**
+	 * @var int
+	 */
+	protected $task_progress_count;
+
+	/**
+	 * @var int
+	 */
+	protected $current_task_progress;
+
+	/**
+	 * @var string
+	 */
+	protected $current_task_name;
+
+	/**
+	 * @var bool
+	 */
+	protected $restart_progress_bar;
+
+	/**
+	 * Constructor
+	 */
+	public function __construct()
+	{
+		$this->errors	= array();
+		$this->warnings	= array();
+		$this->logs		= array();
+		$this->success	= array();
+
+		$this->restart_progress_bar		= false;
+		$this->task_progress_count		= 0;
+		$this->current_task_progress	= 0;
+		$this->current_task_name		= '';
+	}
+
+	/**
+	 * Set language service
+	 *
+	 * @param \phpbb\language\language $language
+	 */
+	public function set_language(\phpbb\language\language $language)
+	{
+		$this->language = $language;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function add_error_message($error_title, $error_description = false)
+	{
+		if (!is_array($error_title) && strpos($error_title, '<br />') !== false)
+		{
+			$error_title = strip_tags(htmlspecialchars_decode($error_title));
+		}
+		$this->errors[] = $this->translate_message($error_title, $error_description);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function add_warning_message($warning_title, $warning_description = false)
+	{
+		$this->warnings[] = $this->translate_message($warning_title, $warning_description);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function add_log_message($log_title, $log_description = false)
+	{
+		$this->logs[] = $this->translate_message($log_title, $log_description);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function add_success_message($success_title, $success_description = false)
+	{
+		$this->success[] = $this->translate_message($success_title, $success_description);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function set_task_count($task_count, $restart = false)
+	{
+		$this->task_progress_count = $task_count;
+		$this->restart_progress_bar = $restart;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function set_progress($task_lang_key, $task_number)
+	{
+		$this->current_task_name = '';
+
+		if (!empty($task_lang_key))
+		{
+			$this->current_task_name = $this->language->lang($task_lang_key);
+		}
+
+		$this->current_task_progress = $task_number;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function finish_progress($message_lang_key)
+	{
+		if (!empty($message_lang_key))
+		{
+			$this->current_task_name = $this->language->lang($message_lang_key);
+		}
+
+		$this->current_task_progress = $this->task_progress_count;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function generate_form_render_data($title, $form)
+	{
+		return '';
+	}
+
+	/**
+	 * Localize message.
+	 *
+	 * Note: When an array is passed into the parameters below, it will be
+	 * resolved as printf($param[0], $param[1], ...).
+	 *
+	 * @param array|string		$title			Title of the message
+	 * @param array|string|bool	$description	Description of the message
+	 *
+	 * @return array	Localized message in an array
+	 */
+	protected function translate_message($title, $description)
+	{
+		$message_array = array();
+
+		$message_array['title'] = call_user_func_array(array($this->language, 'lang'), (array) $title);
+
+		if ($description !== false)
+		{
+			$message_array['description'] = call_user_func_array(array($this->language, 'lang'), (array) $description);
+		}
+
+		return $message_array;
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/iohandler/iohandler_interface.php
@@ -0,0 +1,222 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\iohandler;
+
+/**
+ * Input-Output handler interface for the installer
+ */
+interface iohandler_interface
+{
+	/**
+	 * Renders or returns response message
+	 *
+	 * @param bool	$no_more_output	Whether or not there will be more output in this output unit
+	 */
+	public function send_response($no_more_output = false);
+
+	/**
+	 * Returns input variable
+	 *
+	 * @param string	$name		Name of the input variable to obtain
+	 * @param mixed		$default	A default value that is returned if the variable was not set.
+	 * 								This function will always return a value of the same type as the default.
+	 * @param bool		$multibyte	If $default is a string this paramater has to be true if the variable may contain any UTF-8 characters
+	 *								Default is false, causing all bytes outside the ASCII range (0-127) to be replaced with question marks
+	 *
+	 * @return mixed	Value of the input variable
+	 */
+	public function get_input($name, $default, $multibyte = false);
+
+	/**
+	 * Returns raw input variable
+	 *
+	 * @param string	$name		Name of the input variable to obtain
+	 * @param mixed		$default	A default value that is returned if the variable was not set.
+	 * 								This function will always return a value of the same type as the default.
+	 *
+	 * @return mixed	Value of the raw input variable
+	 */
+	public function get_raw_input($name, $default);
+
+	/**
+	 * Returns server variable
+	 *
+	 * This function should work the same as request_interface::server().
+	 *
+	 * @param string	$name		Name of the server variable
+	 * @param mixed		$default	Default value to return when the requested variable does not exist
+	 *
+	 * @return mixed	Value of the server variable
+	 */
+	public function get_server_variable($name, $default = '');
+
+	/**
+	 * Wrapper function for request_interface::header()
+	 *
+	 * @param string	$name		Name of the request header variable
+	 * @param mixed		$default	Default value to return when the requested variable does not exist
+	 *
+	 * @return mixed
+	 */
+	public function get_header_variable($name, $default = '');
+
+	/**
+	 * Returns true if the connection is encrypted
+	 *
+	 * @return bool
+	 */
+	public function is_secure();
+
+	/**
+	 * Adds an error message to the rendering queue
+	 *
+	 * Note: When an array is passed into the parameters below, it will be
+	 * resolved as printf($param[0], $param[1], ...).
+	 *
+	 * @param string|array		$error_title		Title of the error message.
+	 * @param string|bool|array	$error_description	Description of the error (and possibly guidelines to resolve it),
+	 * 												or false if the error description is not available.
+	 */
+	public function add_error_message($error_title, $error_description = false);
+
+	/**
+	 * Adds a warning message to the rendering queue
+	 *
+	 * Note: When an array is passed into the parameters below, it will be
+	 * resolved as printf($param[0], $param[1], ...).
+	 *
+	 * @param string|array		$warning_title			Title of the warning message
+	 * @param string|bool|array	$warning_description	Description of the warning (and possibly guidelines to resolve it),
+	 * 													or false if the warning description is not available
+	 */
+	public function add_warning_message($warning_title, $warning_description = false);
+
+	/**
+	 * Adds a log message to the rendering queue
+	 *
+	 * Note: When an array is passed into the parameters below, it will be
+	 * resolved as printf($param[0], $param[1], ...).
+	 *
+	 * @param string|array		$log_title			Title of the log message
+	 * @param string|bool|array	$log_description	Description of the log,
+	 * 												or false if the log description is not available
+	 */
+	public function add_log_message($log_title, $log_description = false);
+
+	/**
+	 * Adds a success message to the rendering queue
+	 *
+	 * Note: When an array is passed into the parameters below, it will be
+	 * resolved as printf($param[0], $param[1], ...).
+	 *
+	 * @param string|array		$success_title			Title of the success message
+	 * @param string|bool|array	$success_description	Description of the success,
+	 * 													or false if the success description is not available
+	 *
+	 * @return null
+	 */
+	public function add_success_message($success_title, $success_description = false);
+
+	/**
+	 * Adds a requested data group to the rendering queue
+	 *
+	 * @param string	$title	Language variable with the title of the form
+	 * @param array		$form	An array describing the required data (options etc)
+	 */
+	public function add_user_form_group($title, $form);
+
+	/**
+	 * Returns the rendering information for the form
+	 *
+	 * @param string	$title	Language variable with the title of the form
+	 * @param array		$form	An array describing the required data (options etc)
+	 *
+	 * @return string	Information to render the form
+	 */
+	public function generate_form_render_data($title, $form);
+
+	/**
+	 * Sets the number of tasks belonging to the installer in the current mode.
+	 *
+	 * @param int	$task_count	Number of tasks
+	 * @param bool	$restart	Whether or not to restart the progress bar, false by default
+	 */
+	public function set_task_count($task_count, $restart = false);
+
+	/**
+	 * Sets the progress information
+	 *
+	 * @param string	$task_lang_key	Language key for the name of the task
+	 * @param int		$task_number	Position of the current task in the task queue
+	 */
+	public function set_progress($task_lang_key, $task_number);
+
+	/**
+	 * Sends refresh request to the client
+	 */
+	public function request_refresh();
+
+	/**
+	 * Marks stage as active in the navigation bar
+	 *
+	 * @param array	$menu_path	Array to the navigation elem
+	 */
+	public function set_active_stage_menu($menu_path);
+
+	/**
+	 * Marks stage as completed in the navigation bar
+	 *
+	 * @param array	$menu_path	Array to the navigation elem
+	 */
+	public function set_finished_stage_menu($menu_path);
+
+	/**
+	 * Finish the progress bar
+	 *
+	 * @param string	$message_lang_key	Language key for the message
+	 */
+	public function finish_progress($message_lang_key);
+
+	/**
+	 * Adds a download link
+	 *
+	 * @param string			$route	Route for the link
+	 * @param string			$title	Language key for the title
+	 * @param string|null|array	$msg	Language key for the message
+	 */
+	public function add_download_link($route, $title, $msg = null);
+
+	/**
+	 * Redirects the user to a new page
+	 *
+	 * @param string	$url		URL to redirect to
+	 * @param bool		$use_ajax	Whether or not to use AJAX redirect
+	 */
+	public function redirect($url, $use_ajax = false);
+
+	/**
+	 * Renders the status of update files
+	 *
+	 * @param array	$status_array	Array containing files in groups to render
+	 */
+	public function render_update_file_status($status_array);
+
+	/**
+	 * Sends and sets cookies
+	 *
+	 * @param string	$cookie_name	Name of the cookie to set
+	 * @param string	$cookie_value	Value of the cookie to set
+	 */
+	public function set_cookie($cookie_name, $cookie_value);
+}
--- /dev/null
+++ b/phpbb/install/helper/navigation/convertor_navigation.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\navigation;
+
+use phpbb\install\helper\install_helper;
+
+class convertor_navigation implements navigation_interface
+{
+	/**
+	 * @var install_helper
+	 */
+	private $install_helper;
+
+	/**
+	 * Constructor
+	 *
+	 * @param install_helper	$install_helper
+	 */
+	public function __construct(install_helper $install_helper)
+	{
+		$this->install_helper = $install_helper;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get()
+	{
+		if (!$this->install_helper->is_phpbb_installed())
+		{
+			return array();
+		}
+
+		return array(
+			'convert'	=> array(
+				'label'	=> 'CONVERT',
+				'route'	=> 'phpbb_convert_intro',
+				'order'	=> 3,
+				array(
+					'intro'	=> array(
+						'label'	=> 'SUB_INTRO',
+						'stage'	=> true,
+						'order'	=> 0,
+					),
+					'settings'	=> array(
+						'label'	=> 'STAGE_SETTINGS',
+						'stage'	=> true,
+						'route'	=> 'phpbb_convert_settings',
+						'order'	=> 1,
+					),
+					'convert'	=> array(
+						'label'	=> 'STAGE_IN_PROGRESS',
+						'stage'	=> true,
+						'route'	=> 'phpbb_convert_convert',
+						'order'	=> 2,
+					),
+					'finish'	=> array(
+						'label'	=> 'CONVERT_COMPLETE',
+						'stage'	=> true,
+						'route'	=> 'phpbb_convert_finish',
+						'order'	=> 3,
+					),
+				),
+			),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/navigation/install_navigation.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\navigation;
+
+use phpbb\install\helper\install_helper;
+
+class install_navigation implements navigation_interface
+{
+	/**
+	 * @var install_helper
+	 */
+	private $install_helper;
+
+	/**
+	 * Constructor
+	 *
+	 * @param install_helper	$install_helper
+	 */
+	public function __construct(install_helper $install_helper)
+	{
+		$this->install_helper = $install_helper;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get()
+	{
+		if ($this->install_helper->is_phpbb_installed())
+		{
+			return array();
+		}
+
+		return array(
+			'install'	=> array(
+				'label'	=> 'INSTALL',
+				'route'	=> 'phpbb_installer_install',
+				'order'	=> 1,
+				array(
+					'introduction'	=> array(
+						'label'	=> 'INTRODUCTION_TITLE',
+						'stage'	=> true,
+						'order'	=> 0,
+					),
+					'requirements'	=> array(
+						'label'	=> 'STAGE_REQUIREMENTS',
+						'stage'	=> true,
+						'order'	=> 1,
+					),
+					'obtain_data'	=> array(
+						'label'	=> 'STAGE_OBTAIN_DATA',
+						'stage'	=> true,
+						'order'	=> 2,
+					),
+					'install'	=> array(
+						'label'	=> 'STAGE_INSTALL',
+						'stage'	=> true,
+						'order'	=> 3,
+					),
+				),
+			),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/navigation/main_navigation.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\navigation;
+
+class main_navigation implements navigation_interface
+{
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get()
+	{
+		return array(
+			'overview'	=> array(
+				'label'	=> 'MENU_OVERVIEW',
+				'route'	=> 'phpbb_installer_index',
+				'order'	=> 0,
+				array(
+					'introduction'	=> array(
+						'label'	=> 'MENU_INTRO',
+						'route'	=> 'phpbb_installer_index',
+						'order'	=> 0,
+					),
+					'support'	=> array(
+						'label'	=> 'MENU_SUPPORT',
+						'route'	=> 'phpbb_installer_support',
+						'order'	=> 1,
+					),
+					'license'	=> array(
+						'label'	=> 'MENU_LICENSE',
+						'route'	=> 'phpbb_installer_license',
+						'order'	=> 2,
+					),
+				),
+			),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/navigation/navigation_interface.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\navigation;
+
+/**
+ * Interface for installer's navigation defining services
+ */
+interface navigation_interface
+{
+	/**
+	 * Returns an array with the navigation items
+	 *
+	 * The returned array should have the following format:
+	 * <code>
+	 * array(
+	 * 	'parent_nav_name' => array(
+	 * 		'nav_name' => array(
+	 * 			'label' => 'MY_MENU',
+	 * 			'route' => 'phpbb_route_name',
+	 * 		)
+	 * 	)
+	 * )
+	 * </code>
+	 *
+	 * Navigation item setting options:
+	 * 	- label: The language variable name
+	 * 	- route: Name of the route which it is belongs to
+	 *
+	 * @return array
+	 */
+	public function get();
+}
--- /dev/null
+++ b/phpbb/install/helper/navigation/navigation_provider.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\navigation;
+
+use phpbb\di\service_collection;
+
+/**
+ * Installers navigation provider
+ */
+class navigation_provider
+{
+	/**
+	 * @var array
+	 */
+	private $menu_collection;
+
+	/**
+	 * Constructor
+	 *
+	 * @param service_collection		$plugins
+	 */
+	public function __construct(service_collection $plugins)
+	{
+		$this->menu_collection	= array();
+
+		foreach ($plugins as $plugin => $plugin_instance)
+		{
+			$this->register($plugin_instance);
+		}
+	}
+
+	/**
+	 * Returns navigation array
+	 *
+	 * @return array
+	 */
+	public function get()
+	{
+		return $this->menu_collection;
+	}
+
+	/**
+	 * Registers a navigation provider's navigation items
+	 *
+	 * @param navigation_interface	$navigation
+	 */
+	public function register(navigation_interface $navigation)
+	{
+		$nav_arry = $navigation->get();
+		$this->menu_collection = $this->merge($nav_arry, $this->menu_collection);
+	}
+
+	/**
+	 * Set a property in the navigation array
+	 *
+	 * @param array	$nav_element	Array to the navigation elem
+	 * @param array	$property_array	Array with the properties to set
+	 */
+	public function set_nav_property($nav_element, $property_array)
+	{
+		$array_pointer = array();
+		$array_root_pointer = &$array_pointer;
+		foreach ($nav_element as $array_path)
+		{
+			$array_pointer[$array_path] = array();
+			$array_pointer = &$array_pointer[$array_path];
+		}
+
+		$array_pointer = $property_array;
+
+		$this->menu_collection = $this->merge($array_root_pointer, $this->menu_collection);
+	}
+
+	/**
+	 * Recursive array merge
+	 *
+	 * This function is necessary to be able to replace the options of
+	 * already set navigation items.
+	 *
+	 * @param array	$array_to_merge
+	 * @param array	$array_to_merge_into
+	 *
+	 * @return array	Merged array
+	 */
+	private function merge($array_to_merge, $array_to_merge_into)
+	{
+		$merged_array = $array_to_merge_into;
+
+		foreach ($array_to_merge as $key => $value)
+		{
+			if (isset($array_to_merge_into[$key]))
+			{
+				if (is_array($array_to_merge_into[$key]) && is_array($value))
+				{
+					$merged_array[$key] = $this->merge($value, $array_to_merge_into[$key]);
+				}
+				else
+				{
+					$merged_array[$key] = $value;
+				}
+			}
+			else
+			{
+				$merged_array[$key] = $value;
+			}
+		}
+
+		return $merged_array;
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/navigation/update_navigation.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper\navigation;
+
+use phpbb\install\helper\install_helper;
+
+class update_navigation implements navigation_interface
+{
+	/**
+	 * @var install_helper
+	 */
+	private $install_helper;
+
+	/**
+	 * Constructor
+	 *
+	 * @param install_helper	$install_helper
+	 */
+	public function __construct(install_helper $install_helper)
+	{
+		$this->install_helper = $install_helper;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get()
+	{
+		if (!$this->install_helper->is_phpbb_installed())
+		{
+			return array();
+		}
+
+		return array(
+			'update' => array(
+				'label'		=> 'UPDATE',
+				'route'		=> 'phpbb_installer_update',
+				'order'		=> 1,
+				array(
+					'introduction'	=> array(
+						'label'	=> 'INTRODUCTION_TITLE',
+						'stage'	=> true,
+						'order'	=> 0,
+					),
+					'requirements'	=> array(
+						'label'	=> 'STAGE_REQUIREMENTS',
+						'stage'	=> true,
+						'order'	=> 1,
+					),
+					'obtain_data'	=> array(
+						'label'	=> 'STAGE_OBTAIN_DATA',
+						'stage'	=> true,
+						'order'	=> 2,
+					),
+					'update_files'	=> array(
+						'label'	=> 'STAGE_UPDATE_FILES',
+						'stage'	=> true,
+						'order'	=> 3,
+					),
+					'update_database'	=> array(
+						'label'	=> 'STAGE_UPDATE_DATABASE',
+						'stage'	=> true,
+						'order'	=> 4,
+					),
+				),
+			),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/install/helper/update_helper.php
@@ -0,0 +1,113 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\helper;
+
+/**
+ * General helper functionality for the updater
+ */
+class update_helper
+{
+	/**
+	 * @var string
+	 */
+	protected $path_to_new_files;
+
+	/**
+	 * @var string
+	 */
+	protected $path_to_old_files;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * Constructor
+	 *
+	 * @param string	$phpbb_root_path
+	 */
+	public function __construct($phpbb_root_path)
+	{
+		$this->phpbb_root_path		= $phpbb_root_path;
+		$this->path_to_new_files	= $phpbb_root_path . 'install/update/new/';
+		$this->path_to_old_files	= $phpbb_root_path . 'install/update/old/';
+	}
+
+	/**
+	 * Returns path to new update files
+	 *
+	 * @return string
+	 */
+	public function get_path_to_new_update_files()
+	{
+		return $this->path_to_new_files;
+	}
+
+	/**
+	 * Returns path to new update files
+	 *
+	 * @return string
+	 */
+	public function get_path_to_old_update_files()
+	{
+		return $this->path_to_old_files;
+	}
+
+	/**
+	 * Includes the updated file if available
+	 *
+	 * @param string	$filename	Path to the file relative to phpBB root path
+	 */
+	public function include_file($filename)
+	{
+		if (is_file($this->path_to_new_files . $filename))
+		{
+			include_once($this->path_to_new_files . $filename);
+		}
+		else if (is_file($this->phpbb_root_path . $filename))
+		{
+			include_once($this->phpbb_root_path . $filename);
+		}
+	}
+
+	/**
+	 * Customized version_compare()
+	 *
+	 * @param string		$version_number1
+	 * @param string		$version_number2
+	 * @param string|null	$operator
+	 * @return int|bool	The returned value is identical to the PHP build-in function version_compare()
+	 */
+	public function phpbb_version_compare($version_number1, $version_number2, $operator = null)
+	{
+		if ($operator === null)
+		{
+			$result = version_compare(
+				str_replace('rc', 'RC', strtolower($version_number1)),
+				str_replace('rc', 'RC', strtolower($version_number2))
+			);
+		}
+		else
+		{
+			$result = version_compare(
+				str_replace('rc', 'RC', strtolower($version_number1)),
+				str_replace('rc', 'RC', strtolower($version_number2)),
+				$operator
+			);
+		}
+
+		return $result;
+	}
+}
--- /dev/null
+++ b/phpbb/install/installer.php
@@ -0,0 +1,350 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install;
+
+use phpbb\cache\driver\driver_interface;
+use phpbb\di\ordered_service_collection;
+use phpbb\install\exception\cannot_build_container_exception;
+use phpbb\install\exception\installer_config_not_writable_exception;
+use phpbb\install\exception\jump_to_restart_point_exception;
+use phpbb\install\exception\resource_limit_reached_exception;
+use phpbb\install\exception\user_interaction_required_exception;
+use phpbb\install\helper\config;
+use phpbb\install\helper\container_factory;
+use phpbb\install\helper\iohandler\ajax_iohandler;
+use phpbb\install\helper\iohandler\cli_iohandler;
+use phpbb\install\helper\iohandler\iohandler_interface;
+use phpbb\path_helper;
+
+class installer
+{
+	/**
+	 * @var driver_interface
+	 */
+	protected $cache;
+
+	/**
+	 * @var container_factory
+	 */
+	protected $container_factory;
+
+	/**
+	 * @var config
+	 */
+	protected $install_config;
+
+	/**
+	 * @var ordered_service_collection
+	 */
+	protected $installer_modules;
+
+	/**
+	 * @var iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var string
+	 */
+	protected $web_root;
+
+	/**
+	 * Stores the number of steps that a given module has
+	 *
+	 * @var array
+	 */
+	protected $module_step_count;
+
+	/**
+	 * @var bool
+	 */
+	protected $purge_cache_before;
+
+	/**
+	 * Constructor
+	 *
+	 * @param driver_interface	$cache			Cache service
+	 * @param config			$config			Installer config handler
+	 * @param path_helper		$path_helper	Path helper
+	 * @param container_factory	$container		Container
+	 */
+	public function __construct(driver_interface $cache, config $config, path_helper $path_helper, container_factory $container)
+	{
+		$this->cache				= $cache;
+		$this->install_config		= $config;
+		$this->container_factory	= $container;
+		$this->installer_modules	= null;
+		$this->web_root				= $path_helper->get_web_root_path();
+		$this->purge_cache_before	= false;
+	}
+
+	/**
+	 * Sets modules to execute
+	 *
+	 * Note: The installer will run modules in the order they are set in
+	 * the array.
+	 *
+	 * @param ordered_service_collection	$modules	Service collection of module service names
+	 */
+	public function set_modules(ordered_service_collection $modules)
+	{
+		$this->installer_modules = $modules;
+	}
+
+	/**
+	 * Sets input-output handler objects
+	 *
+	 * @param iohandler_interface	$iohandler
+	 */
+	public function set_iohandler(iohandler_interface $iohandler)
+	{
+		$this->iohandler = $iohandler;
+	}
+
+	/**
+	 * Sets whether to purge cache before the installation process
+	 *
+	 * @param bool	$purge_cache_before
+	 */
+	public function set_purge_cache_before($purge_cache_before)
+	{
+		$this->purge_cache_before = $purge_cache_before;
+	}
+
+	/**
+	 * Run phpBB installer
+	 */
+	public function run()
+	{
+		if ($this->iohandler instanceof ajax_iohandler)
+		{
+			$this->iohandler->acquire_lock();
+		}
+
+		// Load install progress
+		$this->install_config->load_config();
+
+		if (!$this->install_config->get('cache_purged_before', false) && $this->purge_cache_before)
+		{
+			/** @var \phpbb\cache\driver\driver_interface $cache */
+			$cache = $this->container_factory->get('cache.driver');
+			$cache->purge();
+			$this->install_config->set('cache_purged_before', true);
+		}
+
+		// Recover install progress
+		$module_index = $this->recover_progress();
+
+		// Variable used to check if the install process have been finished
+		$install_finished	= false;
+		$fail_cleanup		= false;
+		$send_refresh		= false;
+
+		// We are installing something, so the introduction stage can go now...
+		$this->install_config->set_finished_navigation_stage(array('install', 0, 'introduction'));
+		$this->iohandler->set_finished_stage_menu(array('install', 0, 'introduction'));
+
+		if ($this->install_config->get_task_progress_count() === 0)
+		{
+			// Count all tasks in the current installer modules
+			$step_count = 0;
+
+			/** @var \phpbb\install\module_interface $module */
+			foreach ($this->installer_modules as $name => $module)
+			{
+				$module_step_count = $module->get_step_count();
+				$step_count += $module_step_count;
+				$this->module_step_count[$name] = $module_step_count;
+			}
+
+			// Set task count
+			$this->install_config->set_task_progress_count($step_count);
+		}
+
+		// Set up progress information
+		$this->iohandler->set_task_count(
+			$this->install_config->get_task_progress_count()
+		);
+
+		try
+		{
+			$iterator = $this->installer_modules->getIterator();
+
+			if ($module_index < $iterator->count())
+			{
+				$iterator->seek($module_index);
+			}
+			else
+			{
+				$iterator->seek($module_index - 1);
+				$iterator->next();
+			}
+
+			while ($iterator->valid())
+			{
+				$module	= $iterator->current();
+				$name	= $iterator->key();
+
+				// Check if module should be executed
+				if (!$module->is_essential() && !$module->check_requirements())
+				{
+					$this->install_config->set_finished_navigation_stage($module->get_navigation_stage_path());
+					$this->iohandler->set_finished_stage_menu($module->get_navigation_stage_path());
+
+					$this->iohandler->add_log_message(array(
+						'SKIP_MODULE',
+						$name,
+					));
+					$this->install_config->increment_current_task_progress($this->module_step_count[$name]);
+				}
+				else
+				{
+					// Set the correct stage in the navigation bar
+					$this->install_config->set_active_navigation_stage($module->get_navigation_stage_path());
+					$this->iohandler->set_active_stage_menu($module->get_navigation_stage_path());
+
+					$this->iohandler->send_response();
+
+					$module->run();
+
+					$this->install_config->set_finished_navigation_stage($module->get_navigation_stage_path());
+					$this->iohandler->set_finished_stage_menu($module->get_navigation_stage_path());
+				}
+
+				$module_index++;
+				$iterator->next();
+
+				// Save progress
+				$this->install_config->set_active_module($name, $module_index);
+
+				if ($iterator->valid() && ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0))
+				{
+					throw new resource_limit_reached_exception();
+				}
+			}
+
+			// Installation finished
+			$install_finished = true;
+
+			if ($this->iohandler instanceof cli_iohandler)
+			{
+				$this->iohandler->add_success_message('INSTALLER_FINISHED');
+			}
+			else
+			{
+				// Start session if not installing and get user object
+				// to allow redirecting to ACP
+				$user = $this->container_factory->get('user');
+				if (!isset($module) || !($module instanceof \phpbb\install\module\install_finish\module))
+				{
+					$auth = $this->container_factory->get('auth');
+
+					$user->session_begin();
+					$auth->acl($user->data);
+					$user->setup();
+				}
+
+				$phpbb_root_path = $this->container_factory->get_parameter('core.root_path');
+
+				$acp_url = append_sid($phpbb_root_path . 'adm/index.php', 'i=acp_help_phpbb&mode=help_phpbb', true, $user->session_id);
+				$this->iohandler->add_success_message('INSTALLER_FINISHED', array(
+					'ACP_LINK',
+					$acp_url,
+				));
+			}
+		}
+		catch (user_interaction_required_exception $e)
+		{
+			$this->iohandler->send_response(true);
+		}
+		catch (resource_limit_reached_exception $e)
+		{
+			$send_refresh = true;
+		}
+		catch (jump_to_restart_point_exception $e)
+		{
+			$this->install_config->jump_to_restart_point($e->get_restart_point_name());
+			$send_refresh = true;
+		}
+		catch (\Exception $e)
+		{
+			$this->iohandler->add_error_message($e->getMessage());
+			$this->iohandler->send_response(true);
+			$fail_cleanup = true;
+		}
+
+		if ($this->iohandler instanceof ajax_iohandler)
+		{
+			$this->iohandler->release_lock();
+		}
+
+		if ($install_finished)
+		{
+			// Send install finished message
+			$this->iohandler->set_progress('INSTALLER_FINISHED', $this->install_config->get_task_progress_count());
+			$this->iohandler->send_response(true);
+		}
+		else if ($send_refresh)
+		{
+			$this->iohandler->request_refresh();
+			$this->iohandler->send_response(true);
+		}
+
+		// Save install progress
+		try
+		{
+			if ($install_finished || $fail_cleanup)
+			{
+				$this->install_config->clean_up_config_file();
+				$this->cache->purge();
+
+				try
+				{
+					/** @var \phpbb\cache\driver\driver_interface $cache */
+					$cache = $this->container_factory->get('cache.driver');
+					$cache->purge();
+				}
+				catch (cannot_build_container_exception $e)
+				{
+					// Do not do anything, this just means there is no config.php yet
+				}
+			}
+			else
+			{
+				$this->install_config->save_config();
+			}
+		}
+		catch (installer_config_not_writable_exception $e)
+		{
+			// It is allowed to fail this test during requirements testing
+			$progress_data = $this->install_config->get_progress_data();
+
+			if ($progress_data['last_task_module_name'] !== 'installer.module.requirements_install')
+			{
+				$this->iohandler->add_error_message('INSTALLER_CONFIG_NOT_WRITABLE');
+			}
+		}
+	}
+
+	/**
+	 * Recover install progress
+	 *
+	 * @return string	Index of the next installer module to execute
+	 */
+	protected function recover_progress()
+	{
+		$progress_array = $this->install_config->get_progress_data();
+		return $progress_array['last_task_module_index'];
+	}
+}
--- /dev/null
+++ b/phpbb/install/installer_configuration.php
@@ -0,0 +1,147 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\install;
+
+use Symfony\Component\Config\Definition\Builder\TreeBuilder;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+
+class installer_configuration implements ConfigurationInterface
+{
+
+	/**
+	 * Generates the configuration tree builder.
+	 *
+	 * @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
+	 */
+	public function getConfigTreeBuilder()
+	{
+		$treeBuilder = new TreeBuilder();
+		$rootNode = $treeBuilder->root('installer');
+		$rootNode
+			->children()
+				->arrayNode('admin')
+					->children()
+						->scalarNode('name')->defaultValue('admin')->cannotBeEmpty()->end()
+						->scalarNode('password')->defaultValue('adminadmin')->cannotBeEmpty()->end()
+						->scalarNode('email')->defaultValue('admin@example.org')->cannotBeEmpty()->end()
+					->end()
+				->end()
+				->arrayNode('board')
+					->children()
+						->scalarNode('lang')
+							->defaultValue('en')
+							->cannotBeEmpty()
+							->end()
+						->scalarNode('name')
+							->defaultValue('My Board')
+							->cannotBeEmpty()
+							->end()
+						->scalarNode('description')
+						->defaultValue('My amazing new phpBB board')
+						->cannotBeEmpty()
+						->end()
+					->end()
+				->end()
+				->arrayNode('database')
+					->children()
+						->scalarNode('dbms')
+							->defaultValue('sqlite3')
+							->cannotBeEmpty()
+							->isRequired()
+							->end()
+						->scalarNode('dbhost')
+							->defaultValue(null)
+							->end()
+						->scalarNode('dbport')
+							->defaultValue(null)
+							->end()
+						->scalarNode('dbuser')
+							->defaultValue(null)
+							->end()
+						->scalarNode('dbpasswd')
+							->defaultValue(null)
+							->end()
+						->scalarNode('dbname')
+							->defaultValue(null)
+							->end()
+						->scalarNode('table_prefix')
+							->defaultValue('phpbb_')
+							->cannotBeEmpty()
+							->isRequired()
+							->end()
+					->end()
+				->end()
+				->arrayNode('email')
+					->canBeEnabled()
+					->addDefaultsIfNotSet()
+					->children()
+						->booleanNode('smtp_delivery')
+							->defaultValue(false)
+							->treatNullLike(false)
+							->end()
+						->scalarNode('smtp_host')
+							->defaultValue(null)
+							->end()
+						->scalarNode('smtp_port')
+							->defaultValue(null)
+							->end()
+						->scalarNode('smtp_auth')
+							->defaultValue(null)
+							->end()
+						->scalarNode('smtp_user')
+							->defaultValue(null)
+							->end()
+						->scalarNode('smtp_pass')
+							->defaultValue(null)
+							->end()
+					->end()
+				->end()
+				->arrayNode('server')
+					->children()
+						->booleanNode('cookie_secure')
+							->defaultValue(false)
+							->treatNullLike(false)
+							->end()
+						->scalarNode('server_protocol')
+							->defaultValue('http://')
+							->cannotBeEmpty()
+							->end()
+						->booleanNode('force_server_vars')
+							->defaultValue(false)
+							->treatNullLike(false)
+							->end()
+						->scalarNode('server_name')
+							->defaultValue('localhost')
+							->cannotBeEmpty()
+							->end()
+						->integerNode('server_port')
+							->defaultValue(80)
+							->min(1)
+							->cannotBeEmpty()
+							->end()
+						->scalarNode('script_path')
+							->defaultValue('/')
+							->cannotBeEmpty()
+							 ->end()
+					->end()
+				->end()
+				->arrayNode('extensions')
+					->prototype('scalar')->end()
+					->defaultValue([])
+				->end()
+			->end()
+		;
+		return $treeBuilder;
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_data/module.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_data;
+
+/**
+ * Installer module for recovering and installing default data installation
+ */
+class module extends \phpbb\install\module_base
+{
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_navigation_stage_path()
+	{
+		return array('install', 0, 'install');
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_data/task/add_bots.php
@@ -0,0 +1,263 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_data\task;
+
+use phpbb\install\exception\resource_limit_reached_exception;
+
+class add_bots extends \phpbb\install\task_base
+{
+	/**
+	 * A list of the web-crawlers/bots we recognise by default
+	 *
+	 * Candidates but not included:
+	 * 'Accoona [Bot]'				'Accoona-AI-Agent/'
+	 * 'ASPseek [Crawler]'			'ASPseek/'
+	 * 'Boitho [Crawler]'			'boitho.com-dc/'
+	 * 'Bunnybot [Bot]'				'powered by www.buncat.de'
+	 * 'Cosmix [Bot]'				'cfetch/'
+	 * 'Crawler Search [Crawler]'	'.Crawler-Search.de'
+	 * 'Findexa [Crawler]'			'Findexa Crawler ('
+	 * 'GBSpider [Spider]'			'GBSpider v'
+	 * 'genie [Bot]'				'genieBot ('
+	 * 'Hogsearch [Bot]'			'oegp v. 1.3.0'
+	 * 'Insuranco [Bot]'			'InsurancoBot'
+	 * 'IRLbot [Bot]'				'http://irl.cs.tamu.edu/crawler'
+	 * 'ISC Systems [Bot]'			'ISC Systems iRc Search'
+	 * 'Jyxobot [Bot]'				'Jyxobot/'
+	 * 'Kraehe [Metasuche]'			'-DIE-KRAEHE- META-SEARCH-ENGINE/'
+	 * 'LinkWalker'					'LinkWalker'
+	 * 'MMSBot [Bot]'				'http://www.mmsweb.at/bot.html'
+	 * 'Naver [Bot]'				'nhnbot@naver.com)'
+	 * 'NetResearchServer'			'NetResearchServer/'
+	 * 'Nimble [Crawler]'			'NimbleCrawler'
+	 * 'Ocelli [Bot]'				'Ocelli/'
+	 * 'Onsearch [Bot]'				'onCHECK-Robot'
+	 * 'Orange [Spider]'			'OrangeSpider'
+	 * 'Sproose [Bot]'				'http://www.sproose.com/bot'
+	 * 'Susie [Sync]'				'!Susie (http://www.sync2it.com/susie)'
+	 * 'Tbot [Bot]'					'Tbot/'
+	 * 'Thumbshots [Capture]'		'thumbshots-de-Bot'
+	 * 'Vagabondo [Crawler]'		'http://webagent.wise-guys.nl/'
+	 * 'Walhello [Bot]'				'appie 1.1 (www.walhello.com)'
+	 * 'WissenOnline [Bot]'			'WissenOnline-Bot'
+	 * 'WWWeasel [Bot]'				'WWWeasel Robot v'
+	 * 'Xaldon [Spider]'			'Xaldon WebSpider'
+	 *
+	 * @var array
+	 */
+	protected $bot_list = array(
+		'AdsBot [Google]'			=> array('AdsBot-Google', ''),
+		'Alexa [Bot]'				=> array('ia_archiver', ''),
+		'Alta Vista [Bot]'			=> array('Scooter/', ''),
+		'Ask Jeeves [Bot]'			=> array('Ask Jeeves', ''),
+		'Baidu [Spider]'			=> array('Baiduspider', ''),
+		'Bing [Bot]'				=> array('bingbot/', ''),
+		'Exabot [Bot]'				=> array('Exabot', ''),
+		'FAST Enterprise [Crawler]'	=> array('FAST Enterprise Crawler', ''),
+		'FAST WebCrawler [Crawler]'	=> array('FAST-WebCrawler/', ''),
+		'Francis [Bot]'				=> array('http://www.neomo.de/', ''),
+		'Gigabot [Bot]'				=> array('Gigabot/', ''),
+		'Google Adsense [Bot]'		=> array('Mediapartners-Google', ''),
+		'Google Desktop'			=> array('Google Desktop', ''),
+		'Google Feedfetcher'		=> array('Feedfetcher-Google', ''),
+		'Google [Bot]'				=> array('Googlebot', ''),
+		'Heise IT-Markt [Crawler]'	=> array('heise-IT-Markt-Crawler', ''),
+		'Heritrix [Crawler]'		=> array('heritrix/1.', ''),
+		'IBM Research [Bot]'		=> array('ibm.com/cs/crawler', ''),
+		'ICCrawler - ICjobs'		=> array('ICCrawler - ICjobs', ''),
+		'ichiro [Crawler]'			=> array('ichiro/', ''),
+		'Majestic-12 [Bot]'			=> array('MJ12bot/', ''),
+		'Metager [Bot]'				=> array('MetagerBot/', ''),
+		'MSN NewsBlogs'				=> array('msnbot-NewsBlogs/', ''),
+		'MSN [Bot]'					=> array('msnbot/', ''),
+		'MSNbot Media'				=> array('msnbot-media/', ''),
+		'Nutch [Bot]'				=> array('http://lucene.apache.org/nutch/', ''),
+		'Online link [Validator]'	=> array('online link validator', ''),
+		'psbot [Picsearch]'			=> array('psbot/0', ''),
+		'Sensis [Crawler]'			=> array('Sensis Web Crawler', ''),
+		'SEO Crawler'				=> array('SEO search Crawler/', ''),
+		'Seoma [Crawler]'			=> array('Seoma [SEO Crawler]', ''),
+		'SEOSearch [Crawler]'		=> array('SEOsearch/', ''),
+		'Snappy [Bot]'				=> array('Snappy/1.1 ( http://www.urltrends.com/ )', ''),
+		'Steeler [Crawler]'			=> array('http://www.tkl.iis.u-tokyo.ac.jp/~crawler/', ''),
+		'Telekom [Bot]'				=> array('crawleradmin.t-info@telekom.de', ''),
+		'TurnitinBot [Bot]'			=> array('TurnitinBot/', ''),
+		'Voyager [Bot]'				=> array('voyager/', ''),
+		'W3 [Sitesearch]'			=> array('W3 SiteSearch Crawler', ''),
+		'W3C [Linkcheck]'			=> array('W3C-checklink/', ''),
+		'W3C [Validator]'			=> array('W3C_Validator', ''),
+		'YaCy [Bot]'				=> array('yacybot', ''),
+		'Yahoo MMCrawler [Bot]'		=> array('Yahoo-MMCrawler/', ''),
+		'Yahoo Slurp [Bot]'			=> array('Yahoo! DE Slurp', ''),
+		'Yahoo [Bot]'				=> array('Yahoo! Slurp', ''),
+		'YahooSeeker [Bot]'			=> array('YahooSeeker/', ''),
+	);
+
+	/**
+	 * @var \phpbb\db\driver\driver_interface
+	 */
+	protected $db;
+
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $install_config;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $io_handler;
+
+	/**
+	 * @var \phpbb\language\language
+	 */
+	protected $language;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\install\helper\config							$install_config		Installer's config
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler			Input-output handler for the installer
+	 * @param \phpbb\install\helper\container_factory				$container			Installer's DI container
+	 * @param \phpbb\language\language								$language			Language provider
+	 * @param string												$phpbb_root_path	Relative path to phpBB root
+	 * @param string												$php_ext			PHP extension
+	 */
+	public function __construct(\phpbb\install\helper\config $install_config,
+								\phpbb\install\helper\iohandler\iohandler_interface $iohandler,
+								\phpbb\install\helper\container_factory $container,
+								\phpbb\language\language $language,
+								$phpbb_root_path,
+								$php_ext)
+	{
+		parent::__construct(true);
+
+		$this->db				= $container->get('dbal.conn');
+		$this->install_config	= $install_config;
+		$this->io_handler		= $iohandler;
+		$this->language			= $language;
+		$this->phpbb_root_path	= $phpbb_root_path;
+		$this->php_ext			= $php_ext;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		$this->db->sql_return_on_error(true);
+
+		$sql = 'SELECT group_id
+			FROM ' . GROUPS_TABLE . "
+			WHERE group_name = 'BOTS'";
+		$result = $this->db->sql_query($sql);
+		$group_id = (int) $this->db->sql_fetchfield('group_id');
+		$this->db->sql_freeresult($result);
+
+		if (!$group_id)
+		{
+			// If we reach this point then something has gone very wrong
+			$this->io_handler->add_error_message('NO_GROUP');
+		}
+
+		$i = $this->install_config->get('add_bot_index', 0);
+		$bot_list = array_slice($this->bot_list, $i);
+
+		foreach ($bot_list as $bot_name => $bot_ary)
+		{
+			$user_row = array(
+				'user_type'				=> USER_IGNORE,
+				'group_id'				=> $group_id,
+				'username'				=> $bot_name,
+				'user_regdate'			=> time(),
+				'user_password'			=> '',
+				'user_colour'			=> '9E8DA7',
+				'user_email'			=> '',
+				'user_lang'				=> $this->install_config->get('default_lang'),
+				'user_style'			=> 1,
+				'user_timezone'			=> 'UTC',
+				'user_dateformat'		=> $this->language->lang('default_dateformat'),
+				'user_allow_massemail'	=> 0,
+				'user_allow_pm'			=> 0,
+			);
+
+			if (!function_exists('user_add'))
+			{
+				include($this->phpbb_root_path . 'includes/functions_user.' . $this->php_ext);
+			}
+
+			$user_id = user_add($user_row);
+
+			if (!$user_id)
+			{
+				// If we can't insert this user then continue to the next one to avoid inconsistent data
+				$this->io_handler->add_error_message('CONV_ERROR_INSERT_BOT');
+
+				$i++;
+				continue;
+			}
+
+			$sql = 'INSERT INTO ' . BOTS_TABLE . ' ' . $this->db->sql_build_array('INSERT', array(
+				'bot_active'	=> 1,
+				'bot_name'		=> (string) $bot_name,
+				'user_id'		=> (int) $user_id,
+				'bot_agent'		=> (string) $bot_ary[0],
+				'bot_ip'		=> (string) $bot_ary[1],
+			));
+
+			$this->db->sql_query($sql);
+
+			$i++;
+
+			// Stop execution if resource limit is reached
+			if ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0)
+			{
+				break;
+			}
+		}
+
+		$this->install_config->set('add_bot_index', $i);
+
+		if ($i < sizeof($this->bot_list))
+		{
+			throw new resource_limit_reached_exception();
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 1;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return 'TASK_ADD_BOTS';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_data/task/add_languages.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_data\task;
+
+class add_languages extends \phpbb\install\task_base
+{
+	/**
+	 * @var \phpbb\db\driver\driver_interface
+	 */
+	protected $db;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var \phpbb\language\language_file_helper
+	 */
+	protected $language_helper;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler			Installer's input-output handler
+	 * @param \phpbb\install\helper\container_factory				$container			Installer's DI container
+	 * @param \phpbb\language\language_file_helper					$language_helper	Language file helper service
+	 */
+	public function __construct(\phpbb\install\helper\iohandler\iohandler_interface $iohandler,
+								\phpbb\install\helper\container_factory $container,
+								\phpbb\language\language_file_helper $language_helper)
+	{
+		$this->db				= $container->get('dbal.conn');
+		$this->iohandler		= $iohandler;
+		$this->language_helper	= $language_helper;
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		$this->db->sql_return_on_error(true);
+
+		$languages = $this->language_helper->get_available_languages();
+		$installed_languages = array();
+
+		foreach ($languages as $lang_info)
+		{
+			$lang_pack = array(
+				'lang_iso'			=> $lang_info['iso'],
+				'lang_dir'			=> $lang_info['iso'],
+				'lang_english_name'	=> htmlspecialchars($lang_info['name']),
+				'lang_local_name'	=> htmlspecialchars($lang_info['local_name'], ENT_COMPAT, 'UTF-8'),
+				'lang_author'		=> htmlspecialchars($lang_info['author'], ENT_COMPAT, 'UTF-8'),
+			);
+
+			$this->db->sql_query('INSERT INTO ' . LANG_TABLE . ' ' . $this->db->sql_build_array('INSERT', $lang_pack));
+
+			$installed_languages[] = (int) $this->db->sql_nextid();
+			if ($this->db->get_sql_error_triggered())
+			{
+				$error = $this->db->sql_error($this->db->get_sql_error_sql());
+				$this->iohandler->add_error_message($error['message']);
+			}
+		}
+
+		$sql = 'SELECT * FROM ' . PROFILE_FIELDS_TABLE;
+		$result = $this->db->sql_query($sql);
+
+		$insert_buffer = new \phpbb\db\sql_insert_buffer($this->db, PROFILE_LANG_TABLE);
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			foreach ($installed_languages as $lang_id)
+			{
+				$insert_buffer->insert(array(
+					'field_id'				=> $row['field_id'],
+					'lang_id'				=> $lang_id,
+
+					// Remove phpbb_ from field name
+					'lang_name'				=> strtoupper(substr($row['field_name'], 6)),
+					'lang_explain'			=> '',
+					'lang_default_value'	=> '',
+				));
+			}
+		}
+
+		$this->db->sql_freeresult($result);
+
+		$insert_buffer->flush();
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 1;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return 'TASK_ADD_LANGUAGES';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_data/task/add_modules.php
@@ -0,0 +1,568 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_data\task;
+
+use phpbb\install\exception\resource_limit_reached_exception;
+use phpbb\install\helper\config;
+use phpbb\install\helper\container_factory;
+use phpbb\install\helper\iohandler\iohandler_interface;
+
+class add_modules extends \phpbb\install\task_base
+{
+	/**
+	 * @var config
+	 */
+	protected $config;
+
+	/**
+	 * @var \phpbb\db\driver\driver_interface
+	 */
+	protected $db;
+
+	/**
+	 * @var \phpbb\extension\manager
+	 */
+	protected $extension_manager;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var \phpbb\module\module_manager
+	 */
+	protected $module_manager;
+
+	/**
+	 * Define the module structure so that we can populate the database without
+	 * needing to hard-code module_id values
+	 *
+	 * @var array
+	 */
+	protected $module_categories = array(
+		'acp' => array(
+			'ACP_CAT_GENERAL' => array(
+				'ACP_QUICK_ACCESS',
+				'ACP_BOARD_CONFIGURATION',
+				'ACP_CLIENT_COMMUNICATION',
+				'ACP_SERVER_CONFIGURATION',
+			),
+			'ACP_CAT_FORUMS' => array(
+				'ACP_MANAGE_FORUMS',
+				'ACP_FORUM_BASED_PERMISSIONS',
+			),
+			'ACP_CAT_POSTING' => array(
+				'ACP_MESSAGES',
+				'ACP_ATTACHMENTS',
+			),
+			'ACP_CAT_USERGROUP' => array(
+				'ACP_CAT_USERS',
+				'ACP_GROUPS',
+				'ACP_USER_SECURITY',
+			),
+			'ACP_CAT_PERMISSIONS' => array(
+				'ACP_GLOBAL_PERMISSIONS',
+				'ACP_FORUM_BASED_PERMISSIONS',
+				'ACP_PERMISSION_ROLES',
+				'ACP_PERMISSION_MASKS',
+			),
+			'ACP_CAT_CUSTOMISE' => array(
+				'ACP_STYLE_MANAGEMENT',
+				'ACP_EXTENSION_MANAGEMENT',
+				'ACP_LANGUAGE',
+			),
+			'ACP_CAT_MAINTENANCE' => array(
+				'ACP_FORUM_LOGS',
+				'ACP_CAT_DATABASE',
+			),
+			'ACP_CAT_SYSTEM' => array(
+				'ACP_AUTOMATION',
+				'ACP_GENERAL_TASKS',
+				'ACP_MODULE_MANAGEMENT',
+			),
+			'ACP_CAT_DOT_MODS' => null,
+		),
+		'mcp' => array(
+			'MCP_MAIN'		=> null,
+			'MCP_QUEUE'		=> null,
+			'MCP_REPORTS'	=> null,
+			'MCP_NOTES'		=> null,
+			'MCP_WARN'		=> null,
+			'MCP_LOGS'		=> null,
+			'MCP_BAN'		=> null,
+		),
+		'ucp' => array(
+			'UCP_MAIN'			=> null,
+			'UCP_PROFILE'		=> null,
+			'UCP_PREFS'			=> null,
+			'UCP_PM'			=> null,
+			'UCP_USERGROUPS'	=> null,
+			'UCP_ZEBRA'			=> null,
+		),
+	);
+
+	/**
+	 * @var array
+	 */
+	protected $module_categories_basenames = array(
+		'UCP_PM' => 'ucp_pm',
+	);
+
+	/**
+	 * @var array
+	 */
+	protected $module_extras = array(
+		'acp'	=> array(
+			'ACP_QUICK_ACCESS' => array(
+				'ACP_MANAGE_USERS',
+				'ACP_GROUPS_MANAGE',
+				'ACP_MANAGE_FORUMS',
+				'ACP_MOD_LOGS',
+				'ACP_BOTS',
+				'ACP_PHP_INFO',
+			),
+			'ACP_FORUM_BASED_PERMISSIONS' => array(
+				'ACP_FORUM_PERMISSIONS',
+				'ACP_FORUM_PERMISSIONS_COPY',
+				'ACP_FORUM_MODERATORS',
+				'ACP_USERS_FORUM_PERMISSIONS',
+				'ACP_GROUPS_FORUM_PERMISSIONS',
+			),
+		),
+	);
+
+	/**
+	 * Constructor
+	 *
+	 * @parma config				$config		Installer's config
+	 * @param iohandler_interface	$iohandler	Installer's input-output handler
+	 * @param container_factory		$container	Installer's DI container
+	 */
+	public function __construct(config $config, iohandler_interface $iohandler, container_factory $container)
+	{
+		$this->config				= $config;
+		$this->db					= $container->get('dbal.conn');
+		$this->extension_manager	= $container->get('ext.manager');
+		$this->iohandler			= $iohandler;
+		$this->module_manager		= $container->get('module.manager');
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		$this->db->sql_return_on_error(true);
+
+		$module_classes = array('acp', 'mcp', 'ucp');
+		$total = sizeof($module_classes);
+		$i = $this->config->get('module_class_index', 0);
+		$module_classes = array_slice($module_classes, $i);
+
+		foreach ($module_classes as $module_class)
+		{
+			$categories = $this->config->get('module_categories_array', array());
+
+			$k = $this->config->get('module_categories_index', 0);
+			$module_categories = array_slice($this->module_categories[$module_class], $k);
+			$timed_out = false;
+
+			foreach ($module_categories as $cat_name => $subs)
+			{
+				// Check if this sub-category has a basename. If it has, use it.
+				$basename = (isset($this->module_categories_basenames[$cat_name])) ? $this->module_categories_basenames[$cat_name] : '';
+
+				$module_data = array(
+					'module_basename'	=> $basename,
+					'module_enabled'	=> 1,
+					'module_display'	=> 1,
+					'parent_id'			=> 0,
+					'module_class'		=> $module_class,
+					'module_langname'	=> $cat_name,
+					'module_mode'		=> '',
+					'module_auth'		=> '',
+				);
+
+				$this->module_manager->update_module_data($module_data);
+
+				// Check for last sql error happened
+				if ($this->db->get_sql_error_triggered())
+				{
+					$error = $this->db->sql_error($this->db->get_sql_error_sql());
+					$this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
+				}
+
+				$categories[$cat_name]['id'] = (int) $module_data['module_id'];
+				$categories[$cat_name]['parent_id'] = 0;
+
+				if (is_array($subs))
+				{
+					foreach ($subs as $level2_name)
+					{
+						// Check if this sub-category has a basename. If it has, use it.
+						$basename = (isset($this->module_categories_basenames[$level2_name])) ? $this->module_categories_basenames[$level2_name] : '';
+
+						$module_data = array(
+							'module_basename'	=> $basename,
+							'module_enabled'	=> 1,
+							'module_display'	=> 1,
+							'parent_id'			=> (int) $categories[$cat_name]['id'],
+							'module_class'		=> $module_class,
+							'module_langname'	=> $level2_name,
+							'module_mode'		=> '',
+							'module_auth'		=> '',
+						);
+
+						$this->module_manager->update_module_data($module_data);
+
+						// Check for last sql error happened
+						if ($this->db->get_sql_error_triggered())
+						{
+							$error = $this->db->sql_error($this->db->get_sql_error_sql());
+							$this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
+						}
+
+						$categories[$level2_name]['id'] = (int) $module_data['module_id'];
+						$categories[$level2_name]['parent_id'] = (int) $categories[$cat_name]['id'];
+					}
+				}
+
+				$k++;
+
+				// Stop execution if resource limit is reached
+				if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0)
+				{
+					$timed_out = true;
+					break;
+				}
+			}
+
+			$this->config->set('module_categories_array', $categories);
+			$this->config->set('module_categories_index', $k);
+
+			if ($timed_out)
+			{
+				throw new resource_limit_reached_exception();
+			}
+
+			// Get the modules we want to add... returned sorted by name
+			$module_info = $this->module_manager->get_module_infos($module_class);
+
+			$k = $this->config->get('module_info_index', 0);
+			$module_info = array_slice($module_info, $k);
+
+			foreach ($module_info as $module_basename => $fileinfo)
+			{
+				foreach ($fileinfo['modes'] as $module_mode => $row)
+				{
+					foreach ($row['cat'] as $cat_name)
+					{
+						if (!isset($categories[$cat_name]))
+						{
+							continue;
+						}
+
+						$module_data = array(
+							'module_basename'	=> $module_basename,
+							'module_enabled'	=> 1,
+							'module_display'	=> (isset($row['display'])) ? (int) $row['display'] : 1,
+							'parent_id'			=> (int) $categories[$cat_name]['id'],
+							'module_class'		=> $module_class,
+							'module_langname'	=> $row['title'],
+							'module_mode'		=> $module_mode,
+							'module_auth'		=> $row['auth'],
+						);
+
+						$this->module_manager->update_module_data($module_data);
+
+						// Check for last sql error happened
+						if ($this->db->get_sql_error_triggered())
+						{
+							$error = $this->db->sql_error($this->db->get_sql_error_sql());
+							$this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
+						}
+					}
+				}
+
+				$k++;
+
+				// Stop execution if resource limit is reached
+				if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0)
+				{
+					$timed_out = true;
+					break;
+				}
+			}
+
+			$this->config->set('module_info_index', $k);
+
+			// Stop execution if resource limit is reached
+			if ($timed_out)
+			{
+				throw new resource_limit_reached_exception();
+			}
+
+			// Move some of the modules around since the code above will put them in the wrong place
+			if (!$this->config->get('modules_ordered', false))
+			{
+				$this->order_modules($module_class);
+				$this->config->set('modules_ordered', true);
+
+				// Stop execution if resource limit is reached
+				if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0)
+				{
+					throw new resource_limit_reached_exception();
+				}
+			}
+
+			// And now for the special ones
+			// (these are modules which appear in multiple categories and thus get added manually
+			// to some for more control)
+			if (isset($this->module_extras[$module_class]))
+			{
+				$this->add_module_extras($module_class);
+			}
+
+			$this->module_manager->remove_cache_file($module_class);
+
+			$i++;
+
+			$this->config->set('module_class_index', $i);
+			$this->config->set('module_categories_index', 0);
+			$this->config->set('module_info_index', 0);
+			$this->config->set('added_extra_modules', false);
+			$this->config->set('modules_ordered', false);
+			$this->config->set('module_categories_array', array());
+
+			// Stop execution if resource limit is reached
+			if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0)
+			{
+				break;
+			}
+		}
+
+		if ($i < $total)
+		{
+			throw new resource_limit_reached_exception();
+		}
+	}
+
+	/**
+	 * Move modules to their correct place
+	 *
+	 * @param string	$module_class
+	 */
+	protected function order_modules($module_class)
+	{
+		if ($module_class == 'acp')
+		{
+			// Move main module 4 up...
+			$sql = 'SELECT *
+				FROM ' . MODULES_TABLE . "
+				WHERE module_basename = 'acp_main'
+					AND module_class = 'acp'
+					AND module_mode = 'main'";
+			$result = $this->db->sql_query($sql);
+			$row = $this->db->sql_fetchrow($result);
+			$this->db->sql_freeresult($result);
+
+			$this->module_manager->move_module_by($row, 'acp', 'move_up', 4);
+
+			// Move permissions intro screen module 4 up...
+			$sql = 'SELECT *
+				FROM ' . MODULES_TABLE . "
+				WHERE module_basename = 'acp_permissions'
+					AND module_class = 'acp'
+					AND module_mode = 'intro'";
+			$result = $this->db->sql_query($sql);
+			$row = $this->db->sql_fetchrow($result);
+			$this->db->sql_freeresult($result);
+
+			$this->module_manager->move_module_by($row, 'acp', 'move_up', 4);
+
+			// Move manage users screen module 5 up...
+			$sql = 'SELECT *
+				FROM ' . MODULES_TABLE . "
+				WHERE module_basename = 'acp_users'
+					AND module_class = 'acp'
+					AND module_mode = 'overview'";
+			$result = $this->db->sql_query($sql);
+			$row = $this->db->sql_fetchrow($result);
+			$this->db->sql_freeresult($result);
+
+			$this->module_manager->move_module_by($row, 'acp', 'move_up', 5);
+
+			// Move extension management module 1 up...
+			$sql = 'SELECT *
+				FROM ' . MODULES_TABLE . "
+				WHERE module_langname = 'ACP_EXTENSION_MANAGEMENT'
+					AND module_class = 'acp'
+					AND module_mode = ''
+					AND module_basename = ''";
+			$result = $this->db->sql_query($sql);
+			$row = $this->db->sql_fetchrow($result);
+			$this->db->sql_freeresult($result);
+
+			$this->module_manager->move_module_by($row, 'acp', 'move_up', 1);
+		}
+
+		if ($module_class == 'mcp')
+		{
+			// Move pm report details module 3 down...
+			$sql = 'SELECT *
+				FROM ' . MODULES_TABLE . "
+				WHERE module_basename = 'mcp_pm_reports'
+					AND module_class = 'mcp'
+					AND module_mode = 'pm_report_details'";
+			$result = $this->db->sql_query($sql);
+			$row = $this->db->sql_fetchrow($result);
+			$this->db->sql_freeresult($result);
+
+			$this->module_manager->move_module_by($row, 'mcp', 'move_down', 3);
+
+			// Move closed pm reports module 3 down...
+			$sql = 'SELECT *
+				FROM ' . MODULES_TABLE . "
+				WHERE module_basename = 'mcp_pm_reports'
+					AND module_class = 'mcp'
+					AND module_mode = 'pm_reports_closed'";
+			$result = $this->db->sql_query($sql);
+			$row = $this->db->sql_fetchrow($result);
+			$this->db->sql_freeresult($result);
+
+			$this->module_manager->move_module_by($row, 'mcp', 'move_down', 3);
+
+			// Move open pm reports module 3 down...
+			$sql = 'SELECT *
+				FROM ' . MODULES_TABLE . "
+				WHERE module_basename = 'mcp_pm_reports'
+					AND module_class = 'mcp'
+					AND module_mode = 'pm_reports'";
+			$result = $this->db->sql_query($sql);
+			$row = $this->db->sql_fetchrow($result);
+			$this->db->sql_freeresult($result);
+
+			$this->module_manager->move_module_by($row, 'mcp', 'move_down', 3);
+		}
+
+		if ($module_class == 'ucp')
+		{
+			// Move attachment module 4 down...
+			$sql = 'SELECT *
+				FROM ' . MODULES_TABLE . "
+				WHERE module_basename = 'ucp_attachments'
+					AND module_class = 'ucp'
+					AND module_mode = 'attachments'";
+			$result = $this->db->sql_query($sql);
+			$row = $this->db->sql_fetchrow($result);
+			$this->db->sql_freeresult($result);
+
+			$this->module_manager->move_module_by($row, 'ucp', 'move_down', 4);
+
+			// Move notification options module 4 down...
+			$sql = 'SELECT *
+				FROM ' . MODULES_TABLE . "
+				WHERE module_basename = 'ucp_notifications'
+					AND module_class = 'ucp'
+					AND module_mode = 'notification_options'";
+			$result = $this->db->sql_query($sql);
+			$row = $this->db->sql_fetchrow($result);
+			$this->db->sql_freeresult($result);
+
+			$this->module_manager->move_module_by($row, 'ucp', 'move_down', 4);
+
+			// Move OAuth module 5 down...
+			$sql = 'SELECT *
+				FROM ' . MODULES_TABLE . "
+				WHERE module_basename = 'ucp_auth_link'
+					AND module_class = 'ucp'
+					AND module_mode = 'auth_link'";
+			$result = $this->db->sql_query($sql);
+			$row = $this->db->sql_fetchrow($result);
+			$this->db->sql_freeresult($result);
+
+			$this->module_manager->move_module_by($row, 'ucp', 'move_down', 5);
+		}
+	}
+
+	/**
+	 * Add extra modules
+	 *
+	 * @param string	$module_class
+	 */
+	protected function add_module_extras($module_class)
+	{
+		foreach ($this->module_extras[$module_class] as $cat_name => $mods)
+		{
+			$sql = 'SELECT module_id, left_id, right_id
+				FROM ' . MODULES_TABLE . "
+				WHERE module_langname = '" . $this->db->sql_escape($cat_name) . "'
+					AND module_class = '" . $this->db->sql_escape($module_class) . "'";
+			$result = $this->db->sql_query_limit($sql, 1);
+			$row2 = $this->db->sql_fetchrow($result);
+			$this->db->sql_freeresult($result);
+
+			foreach ($mods as $mod_name)
+			{
+				$sql = 'SELECT *
+					FROM ' . MODULES_TABLE . "
+					WHERE module_langname = '" . $this->db->sql_escape($mod_name) . "'
+						AND module_class = '" . $this->db->sql_escape($module_class) . "'
+						AND module_basename <> ''";
+				$result = $this->db->sql_query_limit($sql, 1);
+				$row = $this->db->sql_fetchrow($result);
+				$this->db->sql_freeresult($result);
+
+				$module_data = array(
+					'module_basename'	=> $row['module_basename'],
+					'module_enabled'	=> (int) $row['module_enabled'],
+					'module_display'	=> (int) $row['module_display'],
+					'parent_id'			=> (int) $row2['module_id'],
+					'module_class'		=> $row['module_class'],
+					'module_langname'	=> $row['module_langname'],
+					'module_mode'		=> $row['module_mode'],
+					'module_auth'		=> $row['module_auth'],
+				);
+
+				$this->module_manager->update_module_data($module_data);
+
+				// Check for last sql error happened
+				if ($this->db->get_sql_error_triggered())
+				{
+					$error = $this->db->sql_error($this->db->get_sql_error_sql());
+					$this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
+				}
+			}
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 1;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return 'TASK_ADD_MODULES';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_database/module.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_database;
+
+/**
+ * Installer module for database installation
+ */
+class module extends \phpbb\install\module_base
+{
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_navigation_stage_path()
+	{
+		return array('install', 0, 'install');
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_database/task/add_config_settings.php
@@ -0,0 +1,372 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_database\task;
+
+use phpbb\install\exception\resource_limit_reached_exception;
+
+/**
+ * Create database schema
+ */
+class add_config_settings extends \phpbb\install\task_base
+{
+	/**
+	 * @var \phpbb\db\driver\driver_interface
+	 */
+	protected $db;
+
+	/**
+	 * @var \phpbb\filesystem\filesystem_interface
+	 */
+	protected $filesystem;
+
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $install_config;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var \phpbb\language\language
+	 */
+	protected $language;
+
+	/**
+	 * @var \phpbb\passwords\manager
+	 */
+	protected $password_manager;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string
+	 */
+	protected $config_table;
+
+	/**
+	 * @var string
+	 */
+	protected $user_table;
+
+	/**
+	 * @var string
+	 */
+	protected $topics_table;
+
+	/**
+	 * @var string
+	 */
+	protected $forums_table;
+
+	/**
+	 * @var string
+	 */
+	protected $posts_table;
+
+	/**
+	 * @var string
+	 */
+	protected $moderator_cache_table;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\filesystem\filesystem_interface				$filesystem			Filesystem service
+	 * @param \phpbb\install\helper\config							$install_config		Installer's config helper
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler			Installer's input-output handler
+	 * @param \phpbb\install\helper\container_factory				$container			Installer's DI container
+	 * @param \phpbb\language\language								$language			Language service
+	 * @param string												$phpbb_root_path	Path to phpBB's root
+	 */
+	public function __construct(\phpbb\filesystem\filesystem_interface $filesystem,
+								\phpbb\install\helper\config $install_config,
+								\phpbb\install\helper\iohandler\iohandler_interface $iohandler,
+								\phpbb\install\helper\container_factory $container,
+								\phpbb\language\language $language,
+								$phpbb_root_path)
+	{
+		$this->db				= $container->get('dbal.conn');
+		$this->filesystem		= $filesystem;
+		$this->install_config	= $install_config;
+		$this->iohandler		= $iohandler;
+		$this->language			= $language;
+		$this->password_manager	= $container->get('passwords.manager');
+		$this->phpbb_root_path	= $phpbb_root_path;
+
+		// Table names
+		$this->config_table				= $container->get_parameter('tables.config');
+		$this->forums_table				= $container->get_parameter('tables.forums');
+		$this->topics_table				= $container->get_parameter('tables.topics');
+		$this->user_table				= $container->get_parameter('tables.users');
+		$this->moderator_cache_table	= $container->get_parameter('tables.moderator_cache');
+		$this->posts_table				= $container->get_parameter('tables.posts');
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		$this->db->sql_return_on_error(true);
+
+		$server_name	= $this->install_config->get('server_name');
+		$current_time 	= time();
+		$user_ip		= phpbb_ip_normalise($this->iohandler->get_server_variable('REMOTE_ADDR'));
+		$user_ip		= ($user_ip === false) ? '' : $user_ip;
+		$referer		= $this->iohandler->get_server_variable('REFERER');
+
+		// Calculate cookie domain
+		$cookie_domain = $server_name;
+
+		if (strpos($cookie_domain, 'www.') === 0)
+		{
+			$cookie_domain = substr($cookie_domain, 3);
+		}
+
+		// Set default config and post data, this applies to all DB's
+		$sql_ary = array(
+			'INSERT INTO ' . $this->config_table . " (config_name, config_value)
+				VALUES ('board_startdate', '$current_time')",
+
+			'INSERT INTO ' . $this->config_table . " (config_name, config_value)
+				VALUES ('default_lang', '" . $this->db->sql_escape($this->install_config->get('default_lang')) . "')",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('img_imagick')) . "'
+				WHERE config_name = 'img_imagick'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('server_name')) . "'
+				WHERE config_name = 'server_name'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('server_port')) . "'
+				WHERE config_name = 'server_port'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('board_email')) . "'
+				WHERE config_name = 'board_email'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('board_email')) . "'
+				WHERE config_name = 'board_contact'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($cookie_domain) . "'
+				WHERE config_name = 'cookie_domain'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->language->lang('default_dateformat')) . "'
+				WHERE config_name = 'default_dateformat'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('email_enable')) . "'
+				WHERE config_name = 'email_enable'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('smtp_delivery')) . "'
+				WHERE config_name = 'smtp_delivery'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('smtp_host')) . "'
+				WHERE config_name = 'smtp_host'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('smtp_port')) . "'
+				WHERE config_name = 'smtp_port'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('smtp_auth')) . "'
+				WHERE config_name = 'smtp_auth_method'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('smtp_user')) . "'
+				WHERE config_name = 'smtp_username'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('smtp_pass')) . "'
+				WHERE config_name = 'smtp_password'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('cookie_secure')) . "'
+				WHERE config_name = 'cookie_secure'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('force_server_vars')) . "'
+				WHERE config_name = 'force_server_vars'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('script_path')) . "'
+				WHERE config_name = 'script_path'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('server_protocol')) . "'
+				WHERE config_name = 'server_protocol'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('admin_name')) . "'
+				WHERE config_name = 'newest_username'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . md5(mt_rand()) . "'
+				WHERE config_name = 'avatar_salt'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . md5(mt_rand()) . "'
+				WHERE config_name = 'plupload_salt'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('board_name')) . "'
+				WHERE config_name = 'sitename'",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->install_config->get('board_description')) . "'
+				WHERE config_name = 'site_desc'",
+
+			'UPDATE ' . $this->user_table . "
+				SET username = '" . $this->db->sql_escape($this->install_config->get('admin_name')) . "',
+					user_password='" . $this->password_manager->hash($this->install_config->get('admin_passwd')) . "',
+					user_ip = '" . $this->db->sql_escape($user_ip) . "',
+					user_lang = '" . $this->db->sql_escape($this->install_config->get('user_language', 'en')) . "',
+					user_email='" . $this->db->sql_escape($this->install_config->get('board_email')) . "',
+					user_dateformat='" . $this->db->sql_escape($this->language->lang('default_dateformat')) . "',
+					user_email_hash = " . $this->db->sql_escape(phpbb_email_hash($this->install_config->get('board_email'))) . ",
+					username_clean = '" . $this->db->sql_escape(utf8_clean_string($this->install_config->get('admin_name'))) . "'
+				WHERE username = 'Admin'",
+
+			'UPDATE ' . $this->moderator_cache_table . "
+				SET username = '" . $this->db->sql_escape($this->install_config->get('admin_name')) . "'
+				WHERE username = 'Admin'",
+
+			'UPDATE ' . $this->forums_table . "
+				SET forum_last_poster_name = '" . $this->db->sql_escape($this->install_config->get('admin_name')) . "'
+				WHERE forum_last_poster_name = 'Admin'",
+
+			'UPDATE ' . $this->topics_table . "
+				SET topic_first_poster_name = '" . $this->db->sql_escape($this->install_config->get('admin_name')) . "',
+				topic_last_poster_name = '" . $this->db->sql_escape($this->install_config->get('admin_name')) . "'
+				WHERE topic_first_poster_name = 'Admin'
+					OR topic_last_poster_name = 'Admin'",
+
+			'UPDATE ' . $this->user_table . "
+				SET user_regdate = $current_time",
+
+			'UPDATE ' . $this->posts_table . "
+				SET post_time = $current_time, poster_ip = '" . $this->db->sql_escape($user_ip) . "'",
+
+			'UPDATE ' . $this->topics_table . "
+				SET topic_time = $current_time, topic_last_post_time = $current_time",
+
+			'UPDATE ' . $this->forums_table . "
+				SET forum_last_post_time = $current_time",
+
+			'UPDATE ' . $this->config_table . "
+				SET config_value = '" . $this->db->sql_escape($this->db->sql_server_info(true)) . "'
+				WHERE config_name = 'dbms_version'",
+		);
+
+		if (@extension_loaded('gd'))
+		{
+			$sql_ary[] = 'UPDATE ' . $this->config_table . "
+				SET config_value = 'core.captcha.plugins.gd'
+				WHERE config_name = 'captcha_plugin'";
+
+			$sql_ary[] = 'UPDATE ' . $this->config_table . "
+				SET config_value = '1'
+				WHERE config_name = 'captcha_gd'";
+		}
+
+		$ref = substr($referer, strpos($referer, '://') + 3);
+		if (!(stripos($ref, $server_name) === 0))
+		{
+			$sql_ary[] = 'UPDATE ' . $this->config_table . "
+				SET config_value = '0'
+				WHERE config_name = 'referer_validation'";
+		}
+
+		// We set a (semi-)unique cookie name to bypass login issues related to the cookie name.
+		$cookie_name = 'phpbb3_';
+		$rand_str = md5(mt_rand());
+		$rand_str = str_replace('0', 'z', base_convert($rand_str, 16, 35));
+		$rand_str = substr($rand_str, 0, 5);
+		$cookie_name .= strtolower($rand_str);
+
+		$sql_ary[] = 'UPDATE ' . $this->config_table . "
+			SET config_value = '" . $this->db->sql_escape($cookie_name) . "'
+			WHERE config_name = 'cookie_name'";
+
+		// Disable avatars if upload directory is not writable
+		if (!$this->filesystem->is_writable($this->phpbb_root_path . 'images/avatars/upload/'))
+		{
+			$sql_ary[] = 'UPDATE ' . $this->config_table . "
+				SET config_value = '0'
+				WHERE config_name = 'allow_avatar'";
+
+			$sql_ary[] = 'UPDATE ' . $this->config_table . "
+				SET config_value = '0'
+				WHERE config_name = 'allow_avatar_upload'";
+		}
+
+		$i = $this->install_config->get('add_config_settings_index', 0);
+		$total = sizeof($sql_ary);
+		$sql_ary = array_slice($sql_ary, $i);
+
+		foreach ($sql_ary as $sql)
+		{
+			if (!$this->db->sql_query($sql))
+			{
+				$error = $this->db->sql_error($this->db->get_sql_error_sql());
+				$this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
+			}
+
+			$i++;
+
+			// Stop execution if resource limit is reached
+			if ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0)
+			{
+				break;
+			}
+		}
+
+		if ($i < $total)
+		{
+			$this->install_config->set('add_config_settings_index', $i);
+			throw new resource_limit_reached_exception();
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 1;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return 'TASK_ADD_CONFIG_SETTINGS';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_database/task/add_default_data.php
@@ -0,0 +1,184 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_database\task;
+
+use phpbb\install\exception\resource_limit_reached_exception;
+
+/**
+ * Create database schema
+ */
+class add_default_data extends \phpbb\install\task_base
+{
+	/**
+	 * @var \phpbb\db\driver\driver_interface
+	 */
+	protected $db;
+
+	/**
+	 * @var \phpbb\install\helper\database
+	 */
+	protected $database_helper;
+
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $config;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var \phpbb\language\language
+	 */
+	protected $language;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\install\helper\database						$db_helper	Installer's database helper
+	 * @param \phpbb\install\helper\config							$config		Installer config
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler	Installer's input-output handler
+	 * @param \phpbb\install\helper\container_factory				$container	Installer's DI container
+	 * @param \phpbb\language\language								$language	Language service
+	 * @param string												$root_path	Root path of phpBB
+	 */
+	public function __construct(\phpbb\install\helper\database $db_helper,
+								\phpbb\install\helper\config $config,
+								\phpbb\install\helper\iohandler\iohandler_interface $iohandler,
+								\phpbb\install\helper\container_factory $container,
+								\phpbb\language\language $language,
+								$root_path)
+	{
+		$this->db				= $container->get('dbal.conn.driver');
+		$this->database_helper	= $db_helper;
+		$this->config			= $config;
+		$this->iohandler		= $iohandler;
+		$this->language			= $language;
+		$this->phpbb_root_path	= $root_path;
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		$this->db->sql_return_on_error(true);
+
+		$table_prefix = $this->config->get('table_prefix');
+		$dbms = $this->config->get('dbms');
+		$dbms_info = $this->database_helper->get_available_dbms($dbms);
+
+		// Get schema data from file
+		$sql_query = @file_get_contents($this->phpbb_root_path . 'install/schemas/schema_data.sql');
+
+		// Clean up SQL
+		$sql_query = $this->replace_dbms_specific_sql($sql_query);
+		$sql_query = preg_replace('# phpbb_([^\s]*) #i', ' ' . $table_prefix . '\1 ', $sql_query);
+		$sql_query = preg_replace_callback('#\{L_([A-Z0-9\-_]*)\}#s', array($this, 'lang_replace_callback'), $sql_query);
+		$sql_query = $this->database_helper->remove_comments($sql_query);
+		$sql_query = $this->database_helper->split_sql_file($sql_query, $dbms_info[$dbms]['DELIM']);
+
+		$i = $this->config->get('add_default_data_index', 0);
+		$total = sizeof($sql_query);
+		$sql_query = array_slice($sql_query, $i);
+
+		foreach ($sql_query as $sql)
+		{
+			if (!$this->db->sql_query($sql))
+			{
+				$error = $this->db->sql_error($this->db->get_sql_error_sql());
+				$this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
+			}
+
+			$i++;
+
+			// Stop execution if resource limit is reached
+			if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0)
+			{
+				break;
+			}
+		}
+
+		$this->config->set('add_default_data_index', $i);
+
+		if ($i < $total)
+		{
+			throw new resource_limit_reached_exception();
+		}
+	}
+
+	/**
+	 * Process DB specific SQL
+	 *
+	 * @return string
+	 */
+	protected function replace_dbms_specific_sql($query)
+	{
+		if ($this->db instanceof \phpbb\db\driver\mssql_base)
+		{
+			$query = preg_replace('#\# MSSQL IDENTITY (phpbb_[a-z_]+) (ON|OFF) \##s', 'SET IDENTITY_INSERT \1 \2;', $query);
+		}
+		else if ($this->db instanceof \phpbb\db\driver\postgres)
+		{
+			$query = preg_replace('#\# POSTGRES (BEGIN|COMMIT) \##s', '\1; ', $query);
+		}
+		else if ($this->db instanceof \phpbb\db\driver\mysql_base)
+		{
+			$query = str_replace('\\', '\\\\', $query);
+		}
+
+		return $query;
+	}
+
+	/**
+	 * Callback function for language replacing
+	 *
+	 * @param array	$matches
+	 * @return string
+	 */
+	public function lang_replace_callback($matches)
+	{
+		if (!empty($matches[1]))
+		{
+			return $this->db->sql_escape($this->language->lang($matches[1]));
+		}
+
+		return '';
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 1;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return 'TASK_ADD_DEFAULT_DATA';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_database/task/add_tables.php
@@ -0,0 +1,151 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_database\task;
+
+use phpbb\install\exception\resource_limit_reached_exception;
+
+/**
+ * Create tables
+ */
+class add_tables extends \phpbb\install\task_base
+{
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $config;
+
+	/**
+	 * @var \phpbb\db\driver\driver_interface
+	 */
+	protected $db;
+
+	/**
+	 * @var \phpbb\db\tools\tools_interface
+	 */
+	protected $db_tools;
+
+	/**
+	 * @var \phpbb\filesystem\filesystem_interface
+	 */
+	protected $filesystem;
+
+	/**
+	 * @var string
+	 */
+	protected $schema_file_path;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\install\helper\config				$config
+	 * @param \phpbb\install\helper\database			$db_helper
+	 * @param \phpbb\filesystem\filesystem_interface	$filesystem
+	 * @param string									$phpbb_root_path
+	 */
+	public function __construct(\phpbb\install\helper\config $config,
+								\phpbb\install\helper\database $db_helper,
+								\phpbb\filesystem\filesystem_interface $filesystem,
+								$phpbb_root_path)
+	{
+		$dbms = $db_helper->get_available_dbms($config->get('dbms'));
+		$dbms = $dbms[$config->get('dbms')]['DRIVER'];
+		$factory = new \phpbb\db\tools\factory();
+
+		$this->db				= new $dbms();
+		$this->db->sql_connect(
+			$config->get('dbhost'),
+			$config->get('dbuser'),
+			$config->get('dbpasswd'),
+			$config->get('dbname'),
+			$config->get('dbport'),
+			false,
+			false
+		);
+
+		$this->config			= $config;
+		$this->db_tools			= $factory->get($this->db);
+		$this->filesystem		= $filesystem;
+		$this->schema_file_path	= $phpbb_root_path . 'store/schema.json';
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		$this->db->sql_return_on_error(true);
+
+		$table_prefix = $this->config->get('table_prefix');
+		$change_prefix = $this->config->get('change_table_prefix', true);
+
+		if (!defined('CONFIG_TABLE'))
+		{
+			// CONFIG_TABLE is required by sql_create_index() to check the
+			// length of index names. However table_prefix is not defined
+			// here yet, so we need to create the constant ourselves.
+			define('CONFIG_TABLE', $table_prefix . 'config');
+		}
+
+		$db_table_schema = @file_get_contents($this->schema_file_path);
+		$db_table_schema = json_decode($db_table_schema, true);
+		$total = sizeof($db_table_schema);
+		$i = $this->config->get('add_table_index', 0);
+		$db_table_schema = array_slice($db_table_schema, $i);
+
+		foreach ($db_table_schema as $table_name => $table_data)
+		{
+			$i++;
+
+			$this->db_tools->sql_create_table(
+				( ($change_prefix) ? ($table_prefix . substr($table_name, 6)) : $table_name ),
+				$table_data
+			);
+
+			// Stop execution if resource limit is reached
+			if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0)
+			{
+				break;
+			}
+		}
+
+		$this->config->set('add_table_index', $i);
+
+		if ($i < $total)
+		{
+			throw new resource_limit_reached_exception();
+		}
+		else
+		{
+			@unlink($this->schema_file_path);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 1;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return 'TASK_CREATE_TABLES';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_database/task/create_schema.php
@@ -0,0 +1,234 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_database\task;
+
+use phpbb\install\exception\resource_limit_reached_exception;
+
+/**
+ * Create database schema
+ */
+class create_schema extends \phpbb\install\task_base
+{
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $config;
+
+	/**
+	 * @var \phpbb\db\driver\driver_interface
+	 */
+	protected $db;
+
+	/**
+	 * @var \phpbb\db\tools\tools_interface
+	 */
+	protected $db_tools;
+
+	/**
+	 * @var \phpbb\install\helper\database
+	 */
+	protected $database_helper;
+
+	/**
+	 * @var \phpbb\filesystem\filesystem_interface
+	 */
+	protected $filesystem;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\install\helper\config							$config				Installer's config provider
+	 * @param \phpbb\install\helper\database						$db_helper			Installer's database helper
+	 * @param \phpbb\filesystem\filesystem_interface				$filesystem			Filesystem service
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler			Installer's input-output handler
+	 * @param string												$phpbb_root_path	Path phpBB's root
+	 * @param string												$php_ext			Extension of PHP files
+	 */
+	public function __construct(\phpbb\install\helper\config $config,
+								\phpbb\install\helper\database $db_helper,
+								\phpbb\filesystem\filesystem_interface $filesystem,
+								\phpbb\install\helper\iohandler\iohandler_interface $iohandler,
+								$phpbb_root_path,
+								$php_ext)
+	{
+		$dbms = $db_helper->get_available_dbms($config->get('dbms'));
+		$dbms = $dbms[$config->get('dbms')]['DRIVER'];
+		$factory = new \phpbb\db\tools\factory();
+
+		$this->db				= new $dbms();
+		$this->db->sql_connect(
+			$config->get('dbhost'),
+			$config->get('dbuser'),
+			$config->get('dbpasswd'),
+			$config->get('dbname'),
+			$config->get('dbport'),
+			false,
+			false
+		);
+
+		$this->config			= $config;
+		$this->db_tools			= $factory->get($this->db);
+		$this->database_helper	= $db_helper;
+		$this->filesystem		= $filesystem;
+		$this->iohandler		= $iohandler;
+		$this->phpbb_root_path	= $phpbb_root_path;
+		$this->php_ext			= $php_ext;
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		// As this task may take a large amount of time to complete refreshing the page might be necessary for some
+		// server configurations with limited resources
+		if (!$this->config->get('pre_schema_forced_refresh'))
+		{
+			if ($this->config->get_time_remaining() < 5)
+			{
+				$this->config->set('pre_schema_forced_refresh', true);
+				throw new resource_limit_reached_exception();
+			}
+		}
+
+		$this->db->sql_return_on_error(true);
+
+		$dbms = $this->config->get('dbms');
+		$dbms_info = $this->database_helper->get_available_dbms($dbms);
+		$schema_name = $dbms_info[$dbms]['SCHEMA'];
+		$delimiter = $dbms_info[$dbms]['DELIM'];
+		$table_prefix = $this->config->get('table_prefix');
+
+		if ($dbms === 'mysql')
+		{
+			if (version_compare($this->db->sql_server_info(true), '4.1.3', '>='))
+			{
+				$schema_name .= '_41';
+			}
+			else
+			{
+				$schema_name .= '_40';
+			}
+		}
+
+		$db_schema_path = $this->phpbb_root_path . 'install/schemas/' . $schema_name . '_schema.sql';
+
+		// Load database vendor specific code if there is any
+		if ($this->filesystem->exists($db_schema_path))
+		{
+			$sql_query = @file_get_contents($db_schema_path);
+			$sql_query = preg_replace('#phpbb_#i', $table_prefix, $sql_query);
+			$sql_query = $this->database_helper->remove_comments($sql_query);
+			$sql_query = $this->database_helper->split_sql_file($sql_query, $delimiter);
+
+			foreach ($sql_query as $sql)
+			{
+				if (!$this->db->sql_query($sql))
+				{
+					$error = $this->db->sql_error($this->db->get_sql_error_sql());
+					$this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
+				}
+			}
+
+			unset($sql_query);
+		}
+
+		$change_prefix = false;
+
+		// Generate database schema
+		if ($this->filesystem->exists($this->phpbb_root_path . 'install/schemas/schema.json'))
+		{
+			$db_table_schema = @file_get_contents($this->phpbb_root_path . 'install/schemas/schema.json');
+			$db_table_schema = json_decode($db_table_schema, true);
+			$change_prefix = true;
+		}
+		else
+		{
+			global $table_prefix;
+
+			$table_prefix = $this->config->get('table_prefix');
+
+			if (!defined('CONFIG_TABLE'))
+			{
+				// We need to include the constants file for the table constants
+				// when we generate the schema from the migration files.
+				include ($this->phpbb_root_path . 'includes/constants.' . $this->php_ext);
+			}
+
+			$finder = new \phpbb\finder($this->filesystem, $this->phpbb_root_path, null, $this->php_ext);
+			$migrator_classes = $finder->core_path('phpbb/db/migration/data/')->get_classes();
+			$factory = new \phpbb\db\tools\factory();
+			$db_tools = $factory->get($this->db, true);
+			$schema_generator = new \phpbb\db\migration\schema_generator(
+				$migrator_classes,
+				new \phpbb\config\config(array()),
+				$this->db,
+				$db_tools,
+				$this->phpbb_root_path,
+				$this->php_ext,
+				$table_prefix
+			);
+			$db_table_schema = $schema_generator->get_schema();
+		}
+
+		if (!defined('CONFIG_TABLE'))
+		{
+			// CONFIG_TABLE is required by sql_create_index() to check the
+			// length of index names. However table_prefix is not defined
+			// here yet, so we need to create the constant ourselves.
+			define('CONFIG_TABLE', $table_prefix . 'config');
+		}
+
+		foreach ($db_table_schema as $table_name => $table_data)
+		{
+			$this->db_tools->sql_create_table(
+				( ($change_prefix) ? ($table_prefix . substr($table_name, 6)) : $table_name ),
+				$table_data
+			);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 1;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return 'TASK_CREATE_DATABASE_SCHEMA';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_database/task/create_schema_file.php
@@ -0,0 +1,164 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_database\task;
+
+use phpbb\install\exception\resource_limit_reached_exception;
+
+/**
+ * Create database schema
+ */
+class create_schema_file extends \phpbb\install\task_base
+{
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $config;
+
+	/**
+	 * @var \phpbb\db\driver\driver_interface
+	 */
+	protected $db;
+
+	/**
+	 * @var \phpbb\filesystem\filesystem_interface
+	 */
+	protected $filesystem;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\install\helper\config							$config				Installer's config provider
+	 * @param \phpbb\install\helper\database						$db_helper			Installer's database helper
+	 * @param \phpbb\filesystem\filesystem_interface				$filesystem			Filesystem service
+	 * @param string												$phpbb_root_path	Path phpBB's root
+	 * @param string												$php_ext			Extension of PHP files
+	 */
+	public function __construct(\phpbb\install\helper\config $config,
+								\phpbb\install\helper\database $db_helper,
+								\phpbb\filesystem\filesystem_interface $filesystem,
+								$phpbb_root_path,
+								$php_ext)
+	{
+		$dbms = $db_helper->get_available_dbms($config->get('dbms'));
+		$dbms = $dbms[$config->get('dbms')]['DRIVER'];
+
+		$this->db				= new $dbms();
+		$this->db->sql_connect(
+			$config->get('dbhost'),
+			$config->get('dbuser'),
+			$config->get('dbpasswd'),
+			$config->get('dbname'),
+			$config->get('dbport'),
+			false,
+			false
+		);
+
+		$this->config			= $config;
+		$this->filesystem		= $filesystem;
+		$this->phpbb_root_path	= $phpbb_root_path;
+		$this->php_ext			= $php_ext;
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		// Generate database schema
+		if ($this->filesystem->exists($this->phpbb_root_path . 'install/schemas/schema.json'))
+		{
+			$db_table_schema = @file_get_contents($this->phpbb_root_path . 'install/schemas/schema.json');
+			$this->config->set('change_table_prefix', true);
+		}
+		else
+		{
+			global $table_prefix;
+
+			// As this task may take a large amount of time to complete refreshing the page might be necessary for some
+			// server configurations with limited resources
+			if (!$this->config->get('pre_schema_forced_refresh', false))
+			{
+				if ($this->config->get_time_remaining() < 5)
+				{
+					$this->config->set('pre_schema_forced_refresh', true);
+					throw new resource_limit_reached_exception();
+				}
+			}
+
+			$table_prefix = $this->config->get('table_prefix');
+
+			if (!defined('CONFIG_TABLE'))
+			{
+				// We need to include the constants file for the table constants
+				// when we generate the schema from the migration files.
+				include ($this->phpbb_root_path . 'includes/constants.' . $this->php_ext);
+			}
+
+			$finder = new \phpbb\finder($this->filesystem, $this->phpbb_root_path, null, $this->php_ext);
+			$migrator_classes = $finder->core_path('phpbb/db/migration/data/')->get_classes();
+			$factory = new \phpbb\db\tools\factory();
+			$db_tools = $factory->get($this->db, true);
+			$schema_generator = new \phpbb\db\migration\schema_generator(
+				$migrator_classes,
+				new \phpbb\config\config(array()),
+				$this->db,
+				$db_tools,
+				$this->phpbb_root_path,
+				$this->php_ext,
+				$table_prefix
+			);
+			$db_table_schema = $schema_generator->get_schema();
+			$db_table_schema = json_encode($db_table_schema, JSON_PRETTY_PRINT);
+
+			$this->config->set('change_table_prefix', false);
+		}
+
+		$fp = @fopen($this->phpbb_root_path . 'store/schema.json', 'wb');
+		if (!$fp)
+		{
+			throw new \Exception('INST_SCHEMA_FILE_NOT_WRITABLE');
+		}
+
+		fwrite($fp, $db_table_schema);
+		fclose($fp);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 1;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return 'TASK_CREATE_DATABASE_SCHEMA_FILE';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_database/task/set_up_database.php
@@ -0,0 +1,164 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_database\task;
+
+/**
+ * Set up database for table generation
+ */
+class set_up_database extends \phpbb\install\task_base
+{
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $config;
+
+	/**
+	 * @var \phpbb\db\driver\driver_interface
+	 */
+	protected $db;
+
+	/**
+	 * @var \phpbb\install\helper\database
+	 */
+	protected $database_helper;
+
+	/**
+	 * @var \phpbb\filesystem\filesystem_interface
+	 */
+	protected $filesystem;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var string
+	 */
+	protected $schema_file_path;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\install\helper\config							$config
+	 * @param \phpbb\install\helper\database						$db_helper
+	 * @param \phpbb\filesystem\filesystem_interface				$filesystem
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler
+	 * @param string												$phpbb_root_path
+	 */
+	public function __construct(\phpbb\install\helper\config $config,
+								\phpbb\install\helper\database $db_helper,
+								\phpbb\filesystem\filesystem_interface $filesystem,
+								\phpbb\install\helper\iohandler\iohandler_interface $iohandler,
+								$phpbb_root_path)
+	{
+		$dbms = $db_helper->get_available_dbms($config->get('dbms'));
+		$dbms = $dbms[$config->get('dbms')]['DRIVER'];
+
+		$this->db				= new $dbms();
+		$this->db->sql_connect(
+			$config->get('dbhost'),
+			$config->get('dbuser'),
+			$config->get('dbpasswd'),
+			$config->get('dbname'),
+			$config->get('dbport'),
+			false,
+			false
+		);
+
+		$this->config			= $config;
+		$this->database_helper	= $db_helper;
+		$this->filesystem		= $filesystem;
+		$this->iohandler		= $iohandler;
+		$this->phpbb_root_path	= $phpbb_root_path;
+
+		parent::__construct(false);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function check_requirements()
+	{
+		$dbms = $this->config->get('dbms');
+		$dbms_info = $this->database_helper->get_available_dbms($dbms);
+		$schema_name = $dbms_info[$dbms]['SCHEMA'];
+
+		if ($dbms === 'mysql')
+		{
+			if (version_compare($this->db->sql_server_info(true), '4.1.3', '>='))
+			{
+				$schema_name .= '_41';
+			}
+			else
+			{
+				$schema_name .= '_40';
+			}
+		}
+
+		$this->schema_file_path = $this->phpbb_root_path . 'install/schemas/' . $schema_name . '_schema.sql';
+
+		return $this->filesystem->exists($this->schema_file_path);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		$this->db->sql_return_on_error(true);
+
+		$dbms = $this->config->get('dbms');
+		$dbms_info = $this->database_helper->get_available_dbms($dbms);
+		$delimiter = $dbms_info[$dbms]['DELIM'];
+		$table_prefix = $this->config->get('table_prefix');
+
+		$sql_query = @file_get_contents($this->schema_file_path);
+		$sql_query = preg_replace('#phpbb_#i', $table_prefix, $sql_query);
+		$sql_query = $this->database_helper->remove_comments($sql_query);
+		$sql_query = $this->database_helper->split_sql_file($sql_query, $delimiter);
+
+		foreach ($sql_query as $sql)
+		{
+			if (!$this->db->sql_query($sql))
+			{
+				$error = $this->db->sql_error($this->db->get_sql_error_sql());
+				$this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
+			}
+		}
+
+		unset($sql_query);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 1;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return 'TASK_SETUP_DATABASE';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_filesystem/module.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_filesystem;
+
+/**
+ * Installer module for filesystem installation
+ */
+class module extends \phpbb\install\module_base
+{
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_navigation_stage_path()
+	{
+		return array('install', 0, 'install');
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_filesystem/task/create_config_file.php
@@ -0,0 +1,244 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_filesystem\task;
+
+use phpbb\install\exception\user_interaction_required_exception;
+
+/**
+ * Dumps config file
+ */
+class create_config_file extends \phpbb\install\task_base
+{
+	/**
+	 * @var \phpbb\filesystem\filesystem_interface
+	 */
+	protected $filesystem;
+
+	/**
+	 * @var \phpbb\install\helper\database
+	 */
+	protected $db_helper;
+
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $install_config;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * @var array
+	 */
+	protected $options;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\filesystem\filesystem_interface				$filesystem
+	 * @param \phpbb\install\helper\config							$install_config
+	 * @param \phpbb\install\helper\database						$db_helper
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler
+	 * @param string												$phpbb_root_path
+	 * @param string												$php_ext
+	 * @param array													$options
+	 */
+	public function __construct(\phpbb\filesystem\filesystem_interface $filesystem,
+								\phpbb\install\helper\config $install_config,
+								\phpbb\install\helper\database $db_helper,
+								\phpbb\install\helper\iohandler\iohandler_interface $iohandler,
+								$phpbb_root_path,
+								$php_ext,
+								$options = array())
+	{
+		$this->install_config	= $install_config;
+		$this->db_helper		= $db_helper;
+		$this->filesystem		= $filesystem;
+		$this->iohandler		= $iohandler;
+		$this->phpbb_root_path	= $phpbb_root_path;
+		$this->php_ext			= $php_ext;
+		$this->options			= array_merge(array(
+			'debug' => false,
+			'debug_container' => false,
+			'environment' => null,
+		), $options);
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		$config_written = true;
+
+		// Create config.php
+		$path_to_config = $this->phpbb_root_path . 'config.' . $this->php_ext;
+
+		$fp = @fopen($path_to_config, 'w');
+		if (!$fp)
+		{
+			$config_written = false;
+		}
+
+		$config_content = $this->get_config_data($this->options['debug'], $this->options['debug_container'], $this->options['environment']);
+
+		if (!@fwrite($fp, $config_content))
+		{
+			$config_written = false;
+		}
+
+		@fclose($fp);
+
+		// chmod config.php to be only readable
+		if ($config_written)
+		{
+			try
+			{
+				$this->filesystem->phpbb_chmod($path_to_config, \phpbb\filesystem\filesystem_interface::CHMOD_READ);
+			}
+			catch (\phpbb\filesystem\exception\filesystem_exception $e)
+			{
+				// Do nothing, the user will get a notice later
+			}
+		}
+		else
+		{
+			$this->iohandler->add_error_message('UNABLE_TO_WRITE_CONFIG_FILE');
+			throw new user_interaction_required_exception();
+		}
+
+		// Create a lock file to indicate that there is an install in progress
+		$fp = @fopen($this->phpbb_root_path . 'cache/install_lock', 'wb');
+		if ($fp === false)
+		{
+			// We were unable to create the lock file - abort
+			$this->iohandler->add_error_message('UNABLE_TO_WRITE_LOCK');
+			throw new user_interaction_required_exception();
+		}
+		@fclose($fp);
+
+		try
+		{
+			$this->filesystem->phpbb_chmod($this->phpbb_root_path . 'cache/install_lock', 0777);
+		}
+		catch (\phpbb\filesystem\exception\filesystem_exception $e)
+		{
+			// Do nothing, the user will get a notice later
+		}
+	}
+
+	/**
+	 * Returns the content which should be dumped to config.php
+	 *
+	 * @param bool		$debug 				If the debug constants should be enabled by default or not
+	 * @param bool		$debug_container 	If the container should be compiled on
+	 *										every page load or not
+	 * @param string	$environment		The environment to use
+	 *
+	 * @return string	content to be written to the config file
+	 */
+	protected function get_config_data($debug = false, $debug_container = false, $environment = null)
+	{
+		$config_content = "<?php\n";
+		$config_content .= "// phpBB 3.2.x auto-generated configuration file\n// Do not change anything in this file!\n";
+
+		$dbms = $this->install_config->get('dbms');
+		$db_driver = $this->db_helper->get_available_dbms($dbms);
+		$db_driver = $db_driver[$dbms]['DRIVER'];
+
+		$config_data_array = array(
+			'dbms'			=> $db_driver,
+			'dbhost'		=> $this->install_config->get('dbhost'),
+			'dbport'		=> $this->install_config->get('dbport'),
+			'dbname'		=> $this->install_config->get('dbname'),
+			'dbuser'		=> $this->install_config->get('dbuser'),
+			'dbpasswd'		=> $this->install_config->get('dbpasswd'),
+			'table_prefix'	=> $this->install_config->get('table_prefix'),
+
+			'phpbb_adm_relative_path'	=> 'adm/',
+
+			'acm_type'		=> 'phpbb\cache\driver\file',
+		);
+
+		foreach ($config_data_array as $key => $value)
+		{
+			$config_content .= "\${$key} = '" . str_replace("'", "\\'", str_replace('\\', '\\\\', $value)) . "';\n";
+		}
+
+		$config_content .= "\n@define('PHPBB_INSTALLED', true);\n";
+		$config_content .= "// @define('PHPBB_DISPLAY_LOAD_TIME', true);\n";
+
+		if ($environment)
+		{
+			$config_content .= "@define('PHPBB_ENVIRONMENT', 'test');\n";
+		}
+		else if ($debug)
+		{
+			$config_content .= "@define('PHPBB_ENVIRONMENT', 'development');\n";
+		}
+		else
+		{
+			$config_content .= "@define('PHPBB_ENVIRONMENT', 'production');\n";
+		}
+
+		if ($debug_container)
+		{
+			$config_content .= "@define('DEBUG_CONTAINER', true);\n";
+		}
+		else
+		{
+			$config_content .= "// @define('DEBUG_CONTAINER', true);\n";
+		}
+
+		if ($environment === 'test')
+		{
+			$config_content .= "@define('DEBUG_TEST', true);\n";
+
+			// Mandatory for the functional tests, will be removed by PHPBB3-12623
+			$config_content .= "@define('DEBUG', true);\n";
+		}
+
+		return $config_content;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 1;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return 'TASK_CREATE_CONFIG_FILE';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_finish/module.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_finish;
+
+/**
+ * Installer module for filesystem installation
+ */
+class module extends \phpbb\install\module_base
+{
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_navigation_stage_path()
+	{
+		return array('install', 0, 'install');
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_finish/task/install_extensions.php
@@ -0,0 +1,199 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_finish\task;
+
+use phpbb\install\exception\resource_limit_reached_exception;
+
+/**
+ * Installs extensions that exist in ext folder upon install
+ */
+class install_extensions extends \phpbb\install\task_base
+{
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $install_config;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var \phpbb\config\db
+	 */
+	protected $config;
+
+	/**
+	 * @var \phpbb\log\log_interface
+	 */
+	protected $log;
+
+	/**
+	 * @var \phpbb\user
+	 */
+	protected $user;
+
+	/** @var \phpbb\extension\manager */
+	protected $extension_manager;
+
+	/** @var \Symfony\Component\Finder\Finder */
+	protected $finder;
+
+	/** @var string Extension table */
+	protected $extension_table;
+
+	/** @var \phpbb\db\driver\driver_interface */
+	protected $db;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\install\helper\container_factory				$container
+	 * @param \phpbb\install\helper\config							$install_config
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler
+	 * @param string												$phpbb_root_path phpBB root path
+	 */
+	public function __construct(\phpbb\install\helper\container_factory $container, \phpbb\install\helper\config $install_config, \phpbb\install\helper\iohandler\iohandler_interface $iohandler, $phpbb_root_path)
+	{
+		$this->install_config	= $install_config;
+		$this->iohandler		= $iohandler;
+		$this->extension_table = $container->get_parameter('tables.ext');
+
+		$this->log				= $container->get('log');
+		$this->user				= $container->get('user');
+		$this->extension_manager = $container->get('ext.manager');
+		$this->config			= $container->get('config');
+		$this->db				= $container->get('dbal.conn');
+		$this->finder = new \Symfony\Component\Finder\Finder();
+		$this->finder->in($phpbb_root_path . 'ext/')
+			->ignoreUnreadableDirs()
+			->depth('< 3')
+			->files()
+			->name('composer.json');
+
+		// Make sure asset version exists in config. Otherwise we might try to
+		// insert the assets_version setting into the database and cause a
+		// duplicate entry error.
+		if (!isset($this->config['assets_version']))
+		{
+			$this->config['assets_version'] = 0;
+		}
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		$this->user->session_begin();
+		$this->user->setup(array('common', 'acp/common', 'cli'));
+
+		$install_extensions = $this->iohandler->get_input('install-extensions', array());
+
+		$all_available_extensions = $this->extension_manager->all_available();
+		$i = $this->install_config->get('install_extensions_index', 0);
+		$available_extensions = array_slice($all_available_extensions, $i);
+
+		// Install extensions
+		foreach ($available_extensions as $ext_name => $ext_path)
+		{
+			if (!empty($install_extensions) && $install_extensions !== ['all'] && !in_array($ext_name, $install_extensions))
+			{
+				continue;
+			}
+
+			try
+			{
+				$this->extension_manager->enable($ext_name);
+				$extensions = $this->get_extensions();
+
+				if (isset($extensions[$ext_name]) && $extensions[$ext_name]['ext_active'])
+				{
+					// Create log
+					$this->log->add('admin', ANONYMOUS, '', 'LOG_EXT_ENABLE', time(), array($ext_name));
+					$this->iohandler->add_success_message(array('CLI_EXTENSION_ENABLE_SUCCESS', $ext_name));
+				}
+				else
+				{
+					$this->iohandler->add_log_message(array('CLI_EXTENSION_ENABLE_FAILURE', $ext_name));
+				}
+			}
+			catch (\Exception $e)
+			{
+				// Add fail log and continue
+				$this->iohandler->add_log_message(array('CLI_EXTENSION_ENABLE_FAILURE', $ext_name));
+			}
+
+			$i++;
+
+			// Stop execution if resource limit is reached
+			if ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0)
+			{
+				break;
+			}
+		}
+
+		$this->install_config->set('install_extensions_index', $i);
+
+		if ($i < sizeof($all_available_extensions))
+		{
+			throw new resource_limit_reached_exception();
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 1;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return 'TASK_INSTALL_EXTENSIONS';
+	}
+
+	/**
+	 * Get extensions from database
+	 *
+	 * @return array List of extensions
+	 */
+	private function get_extensions()
+	{
+		$sql = 'SELECT *
+			FROM ' . $this->extension_table;
+
+		$result = $this->db->sql_query($sql);
+		$extensions_row = $this->db->sql_fetchrowset($result);
+		$this->db->sql_freeresult($result);
+
+		$extensions = array();
+
+		foreach ($extensions_row as $extension)
+		{
+			$extensions[$extension['ext_name']] = $extension;
+		}
+
+		ksort($extensions);
+
+		return $extensions;
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_finish/task/notify_user.php
@@ -0,0 +1,174 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_finish\task;
+
+use phpbb\config\db;
+
+/**
+ * Logs installation and sends an email to the admin
+ */
+class notify_user extends \phpbb\install\task_base
+{
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $install_config;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var \phpbb\auth\auth
+	 */
+	protected $auth;
+
+	/**
+	 * @var \phpbb\config\db
+	 */
+	protected $config;
+
+	/**
+	 * @var \phpbb\language\language
+	 */
+	protected $language;
+
+	/**
+	 * @var \phpbb\log\log_interface
+	 */
+	protected $log;
+
+	/**
+	 * @var \phpbb\user
+	 */
+	protected $user;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\install\helper\container_factory				$container
+	 * @param \phpbb\install\helper\config							$install_config
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler
+	 * @param string												$phpbb_root_path
+	 * @param string												$php_ext
+	 */
+	public function __construct(\phpbb\install\helper\container_factory $container, \phpbb\install\helper\config $install_config, \phpbb\install\helper\iohandler\iohandler_interface $iohandler, $phpbb_root_path, $php_ext)
+	{
+		$this->install_config	= $install_config;
+		$this->iohandler		= $iohandler;
+
+		$this->auth				= $container->get('auth');
+		$this->language			= $container->get('language');
+		$this->log				= $container->get('log');
+		$this->user				= $container->get('user');
+		$this->phpbb_root_path	= $phpbb_root_path;
+		$this->php_ext			= $php_ext;
+
+		// We need to reload config for cases when it doesn't have all values
+		/** @var \phpbb\cache\driver\driver_interface $cache */
+		$cache = $container->get('cache.driver');
+		$cache->destroy('config');
+
+		$this->config = new db(
+			$container->get('dbal.conn'),
+			$cache,
+			$container->get_parameter('tables.config')
+		);
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		$this->user->session_begin();
+		$this->user->setup('common');
+
+		if ($this->config['email_enable'])
+		{
+			include ($this->phpbb_root_path . 'includes/functions_messenger.' . $this->php_ext);
+
+			// functions_messenger.php uses config to determine language paths
+			// Remove when able
+			global $config;
+			$config = $this->config;
+
+			$messenger = new \messenger(false);
+			$messenger->template('installed', $this->install_config->get('user_language', 'en'));
+			$messenger->to($this->config['board_email'], $this->install_config->get('admin_name'));
+			$messenger->anti_abuse_headers($this->config, $this->user);
+			$messenger->assign_vars(array(
+					'USERNAME'		=> htmlspecialchars_decode($this->install_config->get('admin_name')),
+					'PASSWORD'		=> htmlspecialchars_decode($this->install_config->get('admin_passwd')))
+			);
+			$messenger->send(NOTIFY_EMAIL);
+		}
+
+		// Login admin
+		// Ugly but works
+		$this->auth->login(
+			$this->install_config->get('admin_name'),
+			$this->install_config->get('admin_passwd'),
+			false,
+			true,
+			true
+		);
+
+		$this->iohandler->set_cookie($this->config['cookie_name'] . '_sid', $this->user->session_id);
+		$this->iohandler->set_cookie($this->config['cookie_name'] . '_u', $this->user->cookie_data['u']);
+		$this->iohandler->set_cookie($this->config['cookie_name'] . '_k', $this->user->cookie_data['k']);
+
+		// Create log
+		$this->log->add(
+			'admin',
+			$this->user->data['user_id'],
+			$this->user->ip,
+			'LOG_INSTALL_INSTALLED',
+			false,
+			array($this->config['version'])
+		);
+
+		// Remove install_lock
+		@unlink($this->phpbb_root_path . 'cache/install_lock');
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 1;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return 'TASK_NOTIFY_USER';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/install_finish/task/populate_migrations.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\install_finish\task;
+
+use phpbb\install\exception\resource_limit_reached_exception;
+use phpbb\install\helper\config;
+use phpbb\install\helper\container_factory;
+
+/**
+ * Populates migrations
+ */
+class populate_migrations extends \phpbb\install\task_base
+{
+	/**
+	 * @var config
+	 */
+	protected $config;
+
+	/**
+	 * @var \phpbb\extension\manager
+	 */
+	protected $extension_manager;
+
+	/**
+	 * @var \phpbb\db\migrator
+	 */
+	protected $migrator;
+
+	/**
+	 * Constructor
+	 *
+	 * @param config			$config		Installer's config
+	 * @param container_factory	$container	phpBB's DI contianer
+	 */
+	public function __construct(config $config, container_factory $container)
+	{
+		$this->config				= $config;
+		$this->extension_manager	= $container->get('ext.manager');
+		$this->migrator				= $container->get('migrator');
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		if (!$this->config->get('populate_migration_refresh_before', false))
+		{
+			if ($this->config->get_time_remaining() < 1)
+			{
+				$this->config->set('populate_migration_refresh_before', true);
+				throw new resource_limit_reached_exception();
+			}
+		}
+
+		$finder = $this->extension_manager->get_finder();
+
+		$migrations = $finder
+			->core_path('phpbb/db/migration/data/')
+			->set_extensions(array())
+			->get_classes();
+		$this->migrator->populate_migrations($migrations);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 1;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return 'TASK_POPULATE_MIGRATIONS';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/obtain_data/install_module.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\obtain_data;
+
+class install_module extends \phpbb\install\module_base
+{
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_navigation_stage_path()
+	{
+		return array('install', 0, 'obtain_data');
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_step_count()
+	{
+		return 0;
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/obtain_data/task/obtain_admin_data.php
@@ -0,0 +1,218 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\obtain_data\task;
+
+use phpbb\install\exception\user_interaction_required_exception;
+
+/**
+ * This class requests and validates admin account data from the user
+ */
+class obtain_admin_data extends \phpbb\install\task_base implements \phpbb\install\task_interface
+{
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $install_config;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $io_handler;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\install\helper\config							$install_config	Installer's config helper
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler		Installer's input-output handler
+	 */
+	public function __construct(\phpbb\install\helper\config $install_config,
+								\phpbb\install\helper\iohandler\iohandler_interface $iohandler)
+	{
+		$this->install_config	= $install_config;
+		$this->io_handler		= $iohandler;
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		// Check if data is sent
+		if ($this->io_handler->get_input('submit_admin', false))
+		{
+			$this->process_form();
+		}
+		else
+		{
+			$this->request_form_data();
+		}
+	}
+
+	/**
+	 * Process form data
+	 */
+	protected function process_form()
+	{
+		// Admin data
+		$admin_name		= $this->io_handler->get_input('admin_name', '', true);
+		$admin_pass1	= $this->io_handler->get_input('admin_pass1', '', true);
+		$admin_pass2	= $this->io_handler->get_input('admin_pass2', '', true);
+		$board_email	= $this->io_handler->get_input('board_email', '', true);
+
+		$admin_data_valid = $this->check_admin_data($admin_name, $admin_pass1, $admin_pass2, $board_email);
+
+		if ($admin_data_valid)
+		{
+			$this->install_config->set('admin_name', $admin_name);
+			$this->install_config->set('admin_passwd', $admin_pass1);
+			$this->install_config->set('board_email', $board_email);
+		}
+		else
+		{
+			$this->request_form_data(true);
+		}
+	}
+
+	/**
+	 * Request data from the user
+	 *
+	 * @param bool $use_request_data Whether to use submited data
+	 *
+	 * @throws \phpbb\install\exception\user_interaction_required_exception When the user is required to provide data
+	 */
+	protected function request_form_data($use_request_data = false)
+	{
+		if ($use_request_data)
+		{
+			$admin_username	= $this->io_handler->get_input('admin_name', '', true);
+			$admin_email	= $this->io_handler->get_input('board_email', '', true);
+		}
+		else
+		{
+			$admin_username	= '';
+			$admin_email	= '';
+		}
+
+		$admin_form = array(
+			'admin_name'	=> array(
+				'label'			=> 'ADMIN_USERNAME',
+				'description'	=> 'ADMIN_USERNAME_EXPLAIN',
+				'type'			=> 'text',
+				'default'		=> $admin_username,
+			),
+			'board_email'	=> array(
+				'label'		=> 'CONTACT_EMAIL',
+				'type'		=> 'email',
+				'default'	=> $admin_email,
+			),
+			'admin_pass1'	=> array(
+				'label'			=> 'ADMIN_PASSWORD',
+				'description'	=> 'ADMIN_PASSWORD_EXPLAIN',
+				'type'			=> 'password',
+			),
+			'admin_pass2'	=> array(
+				'label'	=> 'ADMIN_PASSWORD_CONFIRM',
+				'type'	=> 'password',
+			),
+			'submit_admin'	=> array(
+				'label'	=> 'SUBMIT',
+				'type'	=> 'submit',
+			),
+		);
+
+		$this->io_handler->add_user_form_group('ADMIN_CONFIG', $admin_form);
+
+		// Require user interaction
+		throw new user_interaction_required_exception();
+	}
+
+	/**
+	 * Check admin data
+	 *
+	 * @param string	$username	Admin username
+	 * @param string	$pass1		Admin password
+	 * @param string	$pass2		Admin password confirmation
+	 * @param string	$email		Admin e-mail address
+	 *
+	 * @return bool	True if data is valid, false otherwise
+	 */
+	protected function check_admin_data($username, $pass1, $pass2, $email)
+	{
+		$data_valid = true;
+
+		// Check if none of admin data is empty
+		if (in_array('', array($username, $pass1, $pass2, $email), true))
+		{
+			$this->io_handler->add_error_message('INST_ERR_MISSING_DATA');
+			$data_valid = false;
+		}
+
+		if (utf8_strlen($username) < 3)
+		{
+			$this->io_handler->add_error_message('INST_ERR_USER_TOO_SHORT');
+			$data_valid = false;
+		}
+
+		if (utf8_strlen($username) > 20)
+		{
+			$this->io_handler->add_error_message('INST_ERR_USER_TOO_LONG');
+			$data_valid = false;
+		}
+
+		if ($pass1 !== $pass2 && $pass1 !== '')
+		{
+			$this->io_handler->add_error_message('INST_ERR_PASSWORD_MISMATCH');
+			$data_valid = false;
+		}
+
+		// Test against the default password rules
+		if (utf8_strlen($pass1) < 6)
+		{
+			$this->io_handler->add_error_message('INST_ERR_PASSWORD_TOO_SHORT');
+			$data_valid = false;
+		}
+
+		if (utf8_strlen($pass1) > 30)
+		{
+			$this->io_handler->add_error_message('INST_ERR_PASSWORD_TOO_LONG');
+			$data_valid = false;
+		}
+
+		if (!preg_match('/^' . get_preg_expression('email') . '$/i', $email))
+		{
+			$this->io_handler->add_error_message('INST_ERR_EMAIL_INVALID');
+			$data_valid = false;
+		}
+
+		return $data_valid;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/obtain_data/task/obtain_board_data.php
@@ -0,0 +1,185 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\obtain_data\task;
+
+use phpbb\install\exception\user_interaction_required_exception;
+
+/**
+ * This class obtains default data from the user related to board (Board name, Board descritpion, etc...)
+ */
+class obtain_board_data extends \phpbb\install\task_base implements \phpbb\install\task_interface
+{
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $install_config;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $io_handler;
+
+	/**
+	 * @var \phpbb\language\language_file_helper
+	 */
+	protected $language_helper;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\install\helper\config							$config			Installer's config
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler		Installer's input-output handler
+	 * @param \phpbb\language\language_file_helper					$lang_helper	Language file helper
+	 */
+	public function __construct(\phpbb\install\helper\config $config,
+								\phpbb\install\helper\iohandler\iohandler_interface $iohandler,
+								\phpbb\language\language_file_helper $lang_helper)
+	{
+		$this->install_config	= $config;
+		$this->io_handler		= $iohandler;
+		$this->language_helper	= $lang_helper;
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		// Check if data is sent
+		if ($this->io_handler->get_input('submit_board', false))
+		{
+			$this->process_form();
+		}
+		else
+		{
+			$this->request_form_data();
+		}
+	}
+
+	/**
+	 * Process form data
+	 */
+	protected function process_form()
+	{
+		// Board data
+		$default_lang	= $this->io_handler->get_input('default_lang', '');
+		$board_name		= $this->io_handler->get_input('board_name', '', true);
+		$board_desc		= $this->io_handler->get_input('board_description', '', true);
+
+		// Check default lang
+		$langs = $this->language_helper->get_available_languages();
+		$lang_valid = false;
+
+		foreach ($langs as $lang)
+		{
+			if ($lang['iso'] === $default_lang)
+			{
+				$lang_valid = true;
+				break;
+			}
+		}
+
+		$this->install_config->set('board_name', $board_name);
+		$this->install_config->set('board_description', $board_desc);
+
+		if ($lang_valid)
+		{
+			$this->install_config->set('default_lang', $default_lang);
+		}
+		else
+		{
+			$this->request_form_data(true);
+		}
+	}
+
+	/**
+	 * Request data from the user
+	 *
+	 * @param bool $use_request_data Whether to use submited data
+	 *
+	 * @throws \phpbb\install\exception\user_interaction_required_exception When the user is required to provide data
+	 */
+	protected function request_form_data($use_request_data = false)
+	{
+		if ($use_request_data)
+		{
+			$board_name		= $this->io_handler->get_input('board_name', '', true);
+			$board_desc		= $this->io_handler->get_input('board_description', '', true);
+		}
+		else
+		{
+			$board_name		= '{L_CONFIG_SITENAME}';
+			$board_desc		= '{L_CONFIG_SITE_DESC}';
+		}
+
+		// Use language because we only check this to be valid
+		$default_lang	= $this->install_config->get('user_language', 'en');
+
+		$langs = $this->language_helper->get_available_languages();
+		$lang_options = array();
+
+		foreach ($langs as $lang)
+		{
+			$lang_options[] = array(
+				'value'		=> $lang['iso'],
+				'label'		=> $lang['local_name'],
+				'selected'	=> ($default_lang === $lang['iso']),
+			);
+		}
+
+		$board_form = array(
+			'default_lang' => array(
+				'label'		=> 'DEFAULT_LANGUAGE',
+				'type'		=> 'select',
+				'options'	=> $lang_options,
+			),
+			'board_name' => array(
+				'label'		=> 'BOARD_NAME',
+				'type'		=> 'text',
+				'default'	=> $board_name,
+			),
+			'board_description' => array(
+				'label'		=> 'BOARD_DESCRIPTION',
+				'type'		=> 'text',
+				'default'	=> $board_desc,
+			),
+			'submit_board'	=> array(
+				'label'	=> 'SUBMIT',
+				'type'	=> 'submit',
+			),
+		);
+
+		$this->io_handler->add_user_form_group('BOARD_CONFIG', $board_form);
+
+		throw new user_interaction_required_exception();
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/obtain_data/task/obtain_database_data.php
@@ -0,0 +1,270 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\obtain_data\task;
+
+use phpbb\install\exception\user_interaction_required_exception;
+
+/**
+ * This class requests and validates database information from the user
+ */
+class obtain_database_data extends \phpbb\install\task_base implements \phpbb\install\task_interface
+{
+	/**
+	 * @var \phpbb\install\helper\database
+	 */
+	protected $database_helper;
+
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $install_config;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $io_handler;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\install\helper\database						$database_helper	Installer's database helper
+	 * @param \phpbb\install\helper\config							$install_config		Installer's config helper
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler			Installer's input-output handler
+	 */
+	public function __construct(\phpbb\install\helper\database $database_helper,
+								\phpbb\install\helper\config $install_config,
+								\phpbb\install\helper\iohandler\iohandler_interface $iohandler)
+	{
+		$this->database_helper	= $database_helper;
+		$this->install_config	= $install_config;
+		$this->io_handler		= $iohandler;
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		// Check if data is sent
+		if ($this->io_handler->get_input('submit_database', false))
+		{
+			$this->process_form();
+		}
+		else
+		{
+			$this->request_form_data();
+		}
+	}
+
+	/**
+	 * Process form data
+	 */
+	protected function process_form()
+	{
+		// Collect database data
+		$dbms			= $this->io_handler->get_input('dbms', '');
+		$dbhost			= $this->io_handler->get_input('dbhost', '', true);
+		$dbport			= $this->io_handler->get_input('dbport', '');
+		$dbuser			= $this->io_handler->get_input('dbuser', '');
+		$dbpasswd		= $this->io_handler->get_raw_input('dbpasswd', '');
+		$dbname			= $this->io_handler->get_input('dbname', '');
+		$table_prefix	= $this->io_handler->get_input('table_prefix', '');
+
+		// Check database data
+		$user_data_vaild = $this->check_database_data($dbms, $dbhost, $dbport, $dbuser, $dbpasswd, $dbname, $table_prefix);
+
+		// Save database data if it is correct
+		if ($user_data_vaild)
+		{
+			$this->install_config->set('dbms', $dbms);
+			$this->install_config->set('dbhost', $dbhost);
+			$this->install_config->set('dbport', $dbport);
+			$this->install_config->set('dbuser', $dbuser);
+			$this->install_config->set('dbpasswd', $dbpasswd);
+			$this->install_config->set('dbname', $dbname);
+			$this->install_config->set('table_prefix', $table_prefix);
+		}
+		else
+		{
+			$this->request_form_data(true);
+		}
+	}
+
+	/**
+	 * Request data from the user
+	 *
+	 * @param bool $use_request_data Whether to use submited data
+	 *
+	 * @throws \phpbb\install\exception\user_interaction_required_exception When the user is required to provide data
+	 */
+	protected function request_form_data($use_request_data = false)
+	{
+		if ($use_request_data)
+		{
+			$dbms			= $this->io_handler->get_input('dbms', '');
+			$dbhost			= $this->io_handler->get_input('dbhost', '', true);
+			$dbport			= $this->io_handler->get_input('dbport', '');
+			$dbuser			= $this->io_handler->get_input('dbuser', '');
+			$dbname			= $this->io_handler->get_input('dbname', '');
+			$table_prefix	= $this->io_handler->get_input('table_prefix', 'phpbb_');
+		}
+		else
+		{
+			$dbms			= '';
+			$dbhost			= '';
+			$dbport			= '';
+			$dbuser			= '';
+			$dbname			= '';
+			$table_prefix	= 'phpbb_';
+		}
+
+		$dbms_select = array();
+		foreach ($this->database_helper->get_available_dbms() as $dbms_key => $dbms_array)
+		{
+			$dbms_select[] = array(
+				'value'		=> $dbms_key,
+				'label'		=> 'DB_OPTION_' . strtoupper($dbms_key),
+				'selected'	=> ($dbms_key === $dbms),
+			);
+		}
+
+		$database_form = array(
+			'dbms' => array(
+				'label'		=> 'DBMS',
+				'type'		=> 'select',
+				'options'	=> $dbms_select,
+			),
+			'dbhost' => array(
+				'label'			=> 'DB_HOST',
+				'description'	=> 'DB_HOST_EXPLAIN',
+				'type'			=> 'text',
+				'default'		=> $dbhost,
+			),
+			'dbport' => array(
+				'label'			=> 'DB_PORT',
+				'description'	=> 'DB_PORT_EXPLAIN',
+				'type'			=> 'text',
+				'default'		=> $dbport,
+			),
+			'dbuser' => array(
+				'label'		=> 'DB_USERNAME',
+				'type'		=> 'text',
+				'default'	=> $dbuser,
+			),
+			'dbpasswd' => array(
+				'label'		=> 'DB_PASSWORD',
+				'type'	=> 'password',
+			),
+			'dbname' => array(
+				'label'		=> 'DB_NAME',
+				'type'		=> 'text',
+				'default'	=> $dbname,
+			),
+			'table_prefix' => array(
+				'label'			=> 'TABLE_PREFIX',
+				'description'	=> 'TABLE_PREFIX_EXPLAIN',
+				'type'			=> 'text',
+				'default'		=> $table_prefix,
+			),
+			'submit_database' => array(
+				'label'	=> 'SUBMIT',
+				'type'	=> 'submit',
+			),
+		);
+
+		$this->io_handler->add_user_form_group('DB_CONFIG', $database_form);
+
+		// Require user interaction
+		throw new user_interaction_required_exception();
+	}
+
+	/**
+	 * Check database data
+	 *
+	 * @param string	$dbms			Selected database type
+	 * @param string	$dbhost			Database host address
+	 * @param int		$dbport			Database port number
+	 * @param string	$dbuser			Database username
+	 * @param string	$dbpass			Database password
+	 * @param string	$dbname			Database name
+	 * @param string	$table_prefix	Database table prefix
+	 *
+	 * @return bool	True if database data is correct, false otherwise
+	 */
+	protected function check_database_data($dbms, $dbhost, $dbport, $dbuser, $dbpass, $dbname, $table_prefix)
+	{
+		$available_dbms = $this->database_helper->get_available_dbms();
+		$data_valid = true;
+
+		// Check if PHP has the database extensions for the specified DBMS
+		if (!isset($available_dbms[$dbms]))
+		{
+			$this->io_handler->add_error_message('INST_ERR_NO_DB');
+			$data_valid = false;
+		}
+
+		// Validate table prefix
+		$prefix_valid = $this->database_helper->validate_table_prefix($dbms, $table_prefix);
+		if (is_array($prefix_valid))
+		{
+			foreach ($prefix_valid as $error)
+			{
+				$this->io_handler->add_error_message(
+					$error['title'],
+					(isset($error['description'])) ? $error['description'] : false
+				);
+			}
+
+			$data_valid = false;
+		}
+
+		// Try to connect to database if all provided data is valid
+		if ($data_valid)
+		{
+			$connect_test = $this->database_helper->check_database_connection($dbms, $dbhost, $dbport, $dbuser, $dbpass, $dbname, $table_prefix);
+			if (is_array($connect_test))
+			{
+				foreach ($connect_test as $error)
+				{
+					$this->io_handler->add_error_message(
+						$error['title'],
+						(isset($error['description'])) ? $error['description'] : false
+					);
+				}
+
+				$data_valid = false;
+			}
+		}
+
+		return $data_valid;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/obtain_data/task/obtain_email_data.php
@@ -0,0 +1,173 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\obtain_data\task;
+
+use phpbb\install\exception\user_interaction_required_exception;
+
+class obtain_email_data extends \phpbb\install\task_base implements \phpbb\install\task_interface
+{
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $install_config;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $io_handler;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\install\helper\config							$config		Installer's config
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler	Installer's input-output handler
+	 */
+	public function __construct(\phpbb\install\helper\config $config,
+								\phpbb\install\helper\iohandler\iohandler_interface $iohandler)
+	{
+		$this->install_config	= $config;
+		$this->io_handler		= $iohandler;
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		// E-mail data
+		$email_enable	= $this->io_handler->get_input('email_enable', true);
+		$smtp_delivery	= $this->io_handler->get_input('smtp_delivery', '');
+		$smtp_host		= $this->io_handler->get_input('smtp_host', '');
+		$smtp_port		= $this->io_handler->get_input('smtp_port', '');
+		$smtp_auth		= $this->io_handler->get_input('smtp_auth', '');
+		$smtp_user		= $this->io_handler->get_input('smtp_user', '');
+		$smtp_passwd	= $this->io_handler->get_input('smtp_pass', '');
+
+		$auth_methods = array('PLAIN', 'LOGIN', 'CRAM-MD5', 'DIGEST-MD5', 'POP-BEFORE-SMTP');
+
+		// Check if data is sent
+		if ($this->io_handler->get_input('submit_email', false))
+		{
+			$this->install_config->set('email_enable', $email_enable);
+			$this->install_config->set('smtp_delivery', $smtp_delivery);
+			$this->install_config->set('smtp_host', $smtp_host);
+			$this->install_config->set('smtp_port', $smtp_port);
+			$this->install_config->set('smtp_auth', $smtp_auth);
+			$this->install_config->set('smtp_user', $smtp_user);
+			$this->install_config->set('smtp_pass', $smtp_passwd);
+		}
+		else
+		{
+			$auth_options = array();
+			foreach ($auth_methods as $method)
+			{
+				$auth_options[] = array(
+					'value'		=> $method,
+					'label'		=> 'SMTP_' . str_replace('-', '_', $method),
+					'selected'	=> false,
+				);
+			}
+
+			$email_form = array(
+				'email_enable' => array(
+					'label'			=> 'ENABLE_EMAIL',
+					'description'	=> 'COOKIE_SECURE_EXPLAIN',
+					'type'			=> 'radio',
+					'options'		=> array(
+						array(
+							'value'		=> 1,
+							'label'		=> 'ENABLE',
+							'selected'	=> true,
+						),
+						array(
+							'value'		=> 0,
+							'label'		=> 'DISABLE',
+							'selected'	=> false,
+						),
+					),
+				),
+				'smtp_delivery' => array(
+					'label'			=> 'USE_SMTP',
+					'description'	=> 'USE_SMTP_EXPLAIN',
+					'type'			=> 'radio',
+					'options'		=> array(
+						array(
+							'value'		=> 0,
+							'label'		=> 'NO',
+							'selected'	=> true,
+						),
+						array(
+							'value'		=> 1,
+							'label'		=> 'YES',
+							'selected'	=> false,
+						),
+					),
+				),
+				'smtp_host' => array(
+					'label'			=> 'SMTP_SERVER',
+					'type'			=> 'text',
+					'default'		=> $smtp_host,
+				),
+				'smtp_port' => array(
+					'label'			=> 'SMTP_PORT',
+					'type'			=> 'text',
+					'default'		=> $smtp_port,
+				),
+				'smtp_auth' => array(
+					'label'			=> 'SMTP_AUTH_METHOD',
+					'description'	=> 'SMTP_AUTH_METHOD_EXPLAIN',
+					'type'			=> 'select',
+					'options'		=> $auth_options,
+				),
+				'smtp_user' => array(
+					'label'			=> 'SMTP_USERNAME',
+					'description'	=> 'SMTP_USERNAME_EXPLAIN',
+					'type'			=> 'text',
+					'default'		=> $smtp_user,
+				),
+				'smtp_pass' => array(
+					'label'			=> 'SMTP_PASSWORD',
+					'description'	=> 'SMTP_PASSWORD_EXPLAIN',
+					'type'			=> 'password',
+				),
+				'submit_email' => array(
+					'label'	=> 'SUBMIT',
+					'type'	=> 'submit',
+				),
+			);
+
+			$this->io_handler->add_user_form_group('EMAIL_CONFIG', $email_form);
+
+			throw new user_interaction_required_exception();
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/obtain_data/task/obtain_file_updater_method.php
@@ -0,0 +1,167 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\obtain_data\task;
+
+use phpbb\install\exception\user_interaction_required_exception;
+use phpbb\install\helper\config;
+use phpbb\install\helper\iohandler\iohandler_interface;
+use phpbb\install\task_base;
+
+class obtain_file_updater_method extends task_base
+{
+	/**
+	 * @var array	Supported compression methods
+	 *
+	 * Note: .tar is assumed to be supported, but not in the list
+	 */
+	protected $available_methods;
+
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $installer_config;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * Constructor
+	 *
+	 * @param config				$installer_config
+	 * @param iohandler_interface	$iohandler
+	 */
+	public function __construct(config $installer_config, iohandler_interface $iohandler)
+	{
+		$this->installer_config	= $installer_config;
+		$this->iohandler		= $iohandler;
+
+		$this->available_methods = array('.tar.gz' => 'zlib', '.tar.bz2' => 'bz2', '.zip' => 'zlib');
+
+		parent::__construct(false);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function check_requirements()
+	{
+		return $this->installer_config->get('do_update_files', false);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		// Check if data is sent
+		if ($this->iohandler->get_input('submit_update_file', false))
+		{
+			$supported_methods = array('compression', 'ftp', 'direct_file');
+			$method = $this->iohandler->get_input('method', 'compression');
+			$update_method = (in_array($method, $supported_methods, true)) ? $method : 'compression';
+			$this->installer_config->set('file_update_method', $update_method);
+
+			$compression = $this->iohandler->get_input('compression_method', '.zip');
+			$supported_methods = array_keys($this->available_methods);
+			$supported_methods[] = '.tar';
+			$compression = (in_array($compression, $supported_methods, true)) ? $compression : '.zip';
+			$this->installer_config->set('file_update_compression', $compression);
+		}
+		else
+		{
+			$this->iohandler->add_user_form_group('UPDATE_FILE_METHOD_TITLE', array(
+				'method' => array(
+					'label'		=> 'UPDATE_FILE_METHOD',
+					'type'		=> 'select',
+					'options'	=> array(
+						array(
+							'value'		=> 'compression',
+							'label'		=> 'UPDATE_FILE_METHOD_DOWNLOAD',
+							'selected'	=> true,
+						),
+						array(
+							'value'		=> 'ftp',
+							'label'		=> 'UPDATE_FILE_METHOD_FTP',
+							'selected'	=> false,
+						),
+						array(
+							'value'		=> 'direct_file',
+							'label'		=> 'UPDATE_FILE_METHOD_FILESYSTEM',
+							'selected'	=> false,
+						),
+					),
+				),
+				'compression_method' => array(
+					'label'		=> 'SELECT_DOWNLOAD_FORMAT',
+					'type'		=> 'select',
+					'options'	=> $this->get_available_compression_methods(),
+				),
+				'submit_update_file' => array(
+					'label'	=> 'SUBMIT',
+					'type'	=> 'submit',
+				),
+			));
+
+			throw new user_interaction_required_exception();
+		}
+	}
+
+	/**
+	 * Returns form elements in an array of available compression methods
+	 *
+	 * @return array
+	 */
+	protected function get_available_compression_methods()
+	{
+		$methods[] = array(
+			'value'		=> '.tar',
+			'label'		=> '.tar',
+			'selected'	=> true,
+		);
+
+		foreach ($this->available_methods as $type => $module)
+		{
+			if (!@extension_loaded($module))
+			{
+				continue;
+			}
+
+			$methods[] = array(
+				'value'		=> $type,
+				'label'		=> $type,
+				'selected'	=> false,
+			);
+		}
+
+		return $methods;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/obtain_data/task/obtain_imagick_path.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\obtain_data\task;
+
+class obtain_imagick_path extends \phpbb\install\task_base implements \phpbb\install\task_interface
+{
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $config;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\install\helper\config	$config	Installer's config
+	 */
+	public function __construct(\phpbb\install\helper\config $config)
+	{
+		$this->config = $config;
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		// Can we find ImageMagick anywhere on the system?
+		$exe = (DIRECTORY_SEPARATOR == '\\') ? '.exe' : '';
+
+		$magic_home = getenv('MAGICK_HOME');
+		$img_imagick = '';
+		if (empty($magic_home))
+		{
+			$locations = array('C:/WINDOWS/', 'C:/WINNT/', 'C:/WINDOWS/SYSTEM/', 'C:/WINNT/SYSTEM/', 'C:/WINDOWS/SYSTEM32/', 'C:/WINNT/SYSTEM32/', '/usr/bin/', '/usr/sbin/', '/usr/local/bin/', '/usr/local/sbin/', '/opt/', '/usr/imagemagick/', '/usr/bin/imagemagick/');
+			$path_locations = str_replace('\\', '/', (explode(($exe) ? ';' : ':', getenv('PATH'))));
+
+			$locations = array_merge($path_locations, $locations);
+			foreach ($locations as $location)
+			{
+				// The path might not end properly, fudge it
+				if (substr($location, -1, 1) !== '/')
+				{
+					$location .= '/';
+				}
+
+				if (@file_exists($location) && @is_readable($location . 'mogrify' . $exe) && @filesize($location . 'mogrify' . $exe) > 3000)
+				{
+					$img_imagick = str_replace('\\', '/', $location);
+					continue;
+				}
+			}
+		}
+		else
+		{
+			$img_imagick = str_replace('\\', '/', $magic_home);
+		}
+
+		$this->config->set('img_imagick', $img_imagick);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/obtain_data/task/obtain_server_data.php
@@ -0,0 +1,202 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\obtain_data\task;
+
+use phpbb\install\exception\user_interaction_required_exception;
+
+/**
+ * This class requests and saves some information about the server
+ */
+class obtain_server_data extends \phpbb\install\task_base implements \phpbb\install\task_interface
+{
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $install_config;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $io_handler;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\install\helper\config							$config		Installer's config
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler	Installer's input-output handler
+	 */
+	public function __construct(\phpbb\install\helper\config $config,
+								\phpbb\install\helper\iohandler\iohandler_interface $iohandler)
+	{
+		$this->install_config	= $config;
+		$this->io_handler		= $iohandler;
+
+		parent::__construct(true);
+	}
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		$cookie_secure = $this->io_handler->is_secure();
+		$server_protocol = ($this->io_handler->is_secure()) ? 'https://' : 'http://';
+		$server_port = $this->io_handler->get_server_variable('SERVER_PORT', 0);
+
+		// HTTP_HOST is having the correct browser url in most cases...
+		$server_name = strtolower(htmlspecialchars_decode($this->io_handler->get_header_variable(
+			'Host',
+			$this->io_handler->get_server_variable('SERVER_NAME')
+		)));
+
+		// HTTP HOST can carry a port number...
+		if (strpos($server_name, ':') !== false)
+		{
+			$server_name = substr($server_name, 0, strpos($server_name, ':'));
+		}
+
+		$script_path = htmlspecialchars_decode($this->io_handler->get_server_variable('PHP_SELF'));
+
+		if (!$script_path)
+		{
+			$script_path = htmlspecialchars_decode($this->io_handler->get_server_variable('REQUEST_URI'));
+		}
+
+		$script_path = str_replace(array('\\', '//'), '/', $script_path);
+		$script_path = trim(dirname(dirname(dirname($script_path)))); // Because we are in install/app.php/route_name
+
+		// Server data
+		$cookie_secure		= $this->io_handler->get_input('cookie_secure', $cookie_secure);
+		$server_protocol	= $this->io_handler->get_input('server_protocol', $server_protocol);
+		$force_server_vars	= $this->io_handler->get_input('force_server_vars', 0);
+		$server_name		= $this->io_handler->get_input('server_name', $server_name);
+		$server_port		= $this->io_handler->get_input('server_port', $server_port);
+		$script_path		= $this->io_handler->get_input('script_path', $script_path);
+
+		// Clean up script path
+		if ($script_path !== '/')
+		{
+			// Adjust destination path (no trailing slash)
+			if (substr($script_path, -1) === '/')
+			{
+				$script_path = substr($script_path, 0, -1);
+			}
+
+			$script_path = str_replace(array('../', './'), '', $script_path);
+
+			if ($script_path[0] !== '/')
+			{
+				$script_path = '/' . $script_path;
+			}
+		}
+
+		// Check if data is sent
+		if ($this->io_handler->get_input('submit_server', false))
+		{
+			$this->install_config->set('cookie_secure', $cookie_secure);
+			$this->install_config->set('server_protocol', $server_protocol);
+			$this->install_config->set('force_server_vars', $force_server_vars);
+			$this->install_config->set('server_name', $server_name);
+			$this->install_config->set('server_port', $server_port);
+			$this->install_config->set('script_path', $script_path);
+		}
+		else
+		{
+			// Render form
+			$server_form = array(
+				'cookie_secure' => array(
+					'label'			=> 'COOKIE_SECURE',
+					'description'	=> 'COOKIE_SECURE_EXPLAIN',
+					'type'			=> 'radio',
+					'options'		=> array(
+						array(
+							'value'		=> 0,
+							'label'		=> 'NO',
+							'selected'	=> (!$cookie_secure),
+						),
+						array(
+							'value'		=> 1,
+							'label'		=> 'YES',
+							'selected'	=> ($cookie_secure),
+						),
+					),
+				),
+				'force_server_vars' => array(
+					'label'			=> 'FORCE_SERVER_VARS',
+					'description'	=> 'FORCE_SERVER_VARS_EXPLAIN',
+					'type'			=> 'radio',
+					'options'		=> array(
+						array(
+							'value'		=> 0,
+							'label'		=> 'NO',
+							'selected'	=> true,
+						),
+						array(
+							'value'		=> 1,
+							'label'		=> 'YES',
+							'selected'	=> false,
+						),
+					),
+				),
+				'server_protocol' => array(
+					'label'			=> 'SERVER_PROTOCOL',
+					'description'	=> 'SERVER_PROTOCOL_EXPLAIN',
+					'type'			=> 'text',
+					'default'		=> $server_protocol,
+				),
+				'server_name' => array(
+					'label'			=> 'SERVER_NAME',
+					'description'	=> 'SERVER_NAME_EXPLAIN',
+					'type'			=> 'text',
+					'default'		=> $server_name,
+				),
+				'server_port' => array(
+					'label'			=> 'SERVER_PORT',
+					'description'	=> 'SERVER_PORT_EXPLAIN',
+					'type'			=> 'text',
+					'default'		=> $server_port,
+				),
+				'script_path' => array(
+					'label'			=> 'SCRIPT_PATH',
+					'description'	=> 'SCRIPT_PATH_EXPLAIN',
+					'type'			=> 'text',
+					'default'		=> $script_path,
+				),
+				'submit_server' => array(
+					'label'	=> 'SUBMIT',
+					'type'	=> 'submit',
+				)
+			);
+
+			$this->io_handler->add_user_form_group('SERVER_CONFIG', $server_form);
+
+			throw new user_interaction_required_exception();
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/obtain_data/task/obtain_update_files.php
@@ -0,0 +1,113 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\obtain_data\task;
+
+use phpbb\install\exception\user_interaction_required_exception;
+use phpbb\install\helper\config;
+use phpbb\install\helper\iohandler\iohandler_interface;
+use phpbb\install\task_base;
+
+class obtain_update_files extends task_base
+{
+	/**
+	 * @var config
+	 */
+	protected $installer_config;
+
+	/**
+	 * @var iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * Constructor
+	 *
+	 * @param config				$config
+	 * @param iohandler_interface	$iohandler
+	 * @param string				$phpbb_root_path
+	 * @param string				$php_ext
+	 */
+	public function __construct(config $config, iohandler_interface $iohandler, $phpbb_root_path, $php_ext)
+	{
+		$this->installer_config	= $config;
+		$this->iohandler		= $iohandler;
+		$this->phpbb_root_path	= $phpbb_root_path;
+		$this->php_ext			= $php_ext;
+
+		parent::__construct(false);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function check_requirements()
+	{
+		return $this->installer_config->get('do_update_files', false);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		// Load update info file
+		// The file should be checked in the requirements, so we assume that it exists
+		$update_info_file = $this->phpbb_root_path . 'install/update/index.' . $this->php_ext;
+		include($update_info_file);
+		$info = (empty($update_info) || !is_array($update_info)) ? false : $update_info;
+
+		// If the file is invalid, abort mission
+		if (!$info)
+		{
+			$this->iohandler->add_error_message('WRONG_INFO_FILE_FORMAT');
+			throw new user_interaction_required_exception();
+		}
+
+		// Replace .php with $this->php_ext if needed
+		if ($this->php_ext !== 'php')
+		{
+			$custom_extension = '.' . $this->php_ext;
+			$info['files'] = preg_replace('#\.php$#i', $custom_extension, $info['files']);
+		}
+
+		// Save update info
+		$this->installer_config->set('update_info_unprocessed', $info);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/obtain_data/task/obtain_update_ftp_data.php
@@ -0,0 +1,163 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\obtain_data\task;
+
+use phpbb\install\exception\user_interaction_required_exception;
+use phpbb\install\helper\config;
+use phpbb\install\helper\iohandler\iohandler_interface;
+use phpbb\install\helper\update_helper;
+use phpbb\install\task_base;
+
+class obtain_update_ftp_data extends task_base
+{
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $installer_config;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var update_helper
+	 */
+	protected $update_helper;
+
+	/**
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * Constructor
+	 *
+	 * @param config				$installer_config
+	 * @param iohandler_interface	$iohandler
+	 * @param update_helper			$update_helper
+	 * @param string				$php_ext
+	 */
+	public function __construct(config $installer_config, iohandler_interface $iohandler, update_helper $update_helper, $php_ext)
+	{
+		$this->installer_config	= $installer_config;
+		$this->iohandler		= $iohandler;
+		$this->update_helper	= $update_helper;
+		$this->php_ext			= $php_ext;
+
+		parent::__construct(false);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function check_requirements()
+	{
+		return ($this->installer_config->get('do_update_files', false) &&
+			($this->installer_config->get('file_update_method', '') === 'ftp')
+		);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		if ($this->iohandler->get_input('submit_ftp', false))
+		{
+			$this->update_helper->include_file('includes/functions_transfer.' . $this->php_ext);
+
+			$method = 'ftp';
+			$methods = \transfer::methods();
+			if (!in_array($method, $methods, true))
+			{
+				$method = $methods[0];
+			}
+
+			$ftp_host = $this->iohandler->get_input('ftp_host', '');
+			$ftp_user = $this->iohandler->get_input('ftp_user', '');
+			$ftp_pass = htmlspecialchars_decode($this->iohandler->get_input('ftp_pass', ''));
+			$ftp_path = $this->iohandler->get_input('ftp_path', '');
+			$ftp_port = $this->iohandler->get_input('ftp_port', 21);
+			$ftp_time = $this->iohandler->get_input('ftp_timeout', 10);
+
+			$this->installer_config->set('ftp_host', $ftp_host);
+			$this->installer_config->set('ftp_user', $ftp_user);
+			$this->installer_config->set('ftp_pass', $ftp_pass);
+			$this->installer_config->set('ftp_path', $ftp_path);
+			$this->installer_config->set('ftp_port', (int) $ftp_port);
+			$this->installer_config->set('ftp_timeout', (int) $ftp_time);
+			$this->installer_config->set('ftp_method', $method);
+		}
+		else
+		{
+			$this->iohandler->add_user_form_group('FTP_SETTINGS', array(
+				'ftp_host'	=> array(
+					'label'			=> 'FTP_HOST',
+					'description'	=> 'FTP_HOST_EXPLAIN',
+					'type'			=> 'text',
+				),
+				'ftp_user'	=> array(
+					'label'			=> 'FTP_USERNAME',
+					'description'	=> 'FTP_USERNAME_EXPLAIN',
+					'type'			=> 'text',
+				),
+				'ftp_pass'	=> array(
+					'label'			=> 'FTP_PASSWORD',
+					'description'	=> 'FTP_PASSWORD_EXPLAIN',
+					'type'			=> 'password',
+				),
+				'ftp_path'	=> array(
+					'label'			=> 'FTP_ROOT_PATH',
+					'description'	=> 'FTP_ROOT_PATH_EXPLAIN',
+					'type'			=> 'text',
+				),
+				'ftp_port'	=> array(
+					'label'			=> 'FTP_PORT',
+					'description'	=> 'FTP_PORT_EXPLAIN',
+					'type'			=> 'text',
+					'default'		=> 21,
+				),
+				'ftp_timeout'	=> array(
+					'label'			=> 'FTP_TIMEOUT',
+					'description'	=> 'FTP_TIMEOUT_EXPLAIN',
+					'type'			=> 'text',
+					'default'		=> 10,
+				),
+				'submit_ftp'	=> array(
+					'label'	=> 'SUBMIT',
+					'type'	=> 'submit',
+				),
+			));
+
+			throw new user_interaction_required_exception();
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/obtain_data/task/obtain_update_settings.php
@@ -0,0 +1,123 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\obtain_data\task;
+
+use phpbb\install\exception\user_interaction_required_exception;
+use phpbb\install\helper\config;
+use phpbb\install\helper\iohandler\iohandler_interface;
+use phpbb\install\task_base;
+
+class obtain_update_settings extends task_base
+{
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $installer_config;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * Constructor
+	 *
+	 * @param config				$installer_config
+	 * @param iohandler_interface	$iohandler
+	 */
+	public function __construct(config $installer_config, iohandler_interface $iohandler)
+	{
+		$this->installer_config	= $installer_config;
+		$this->iohandler		= $iohandler;
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		// Check if data is sent
+		if ($this->iohandler->get_input('submit_update', false))
+		{
+			$update_files = $this->iohandler->get_input('update_type', 'all') === 'all';
+
+			if ($this->installer_config->get('disable_filesystem_update', false) && $update_files)
+			{
+				$this->iohandler->add_error_message('UPDATE_FILES_NOT_FOUND');
+
+				throw new user_interaction_required_exception();
+			}
+
+			$this->installer_config->set('do_update_files', $update_files);
+		}
+		else
+		{
+			if ($this->installer_config->get('disable_filesystem_update', false))
+			{
+				$options[] = array(
+					'value'		=> 'db_only',
+					'label'		=> 'UPDATE_TYPE_DB_ONLY',
+					'selected'	=> true,
+				);
+			}
+			else
+			{
+				$options = array(
+					array(
+						'value'		=> 'all',
+						'label'		=> 'UPDATE_TYPE_ALL',
+						'selected'	=> true,
+					),
+					array(
+						'value'		=> 'db_only',
+						'label'		=> 'UPDATE_TYPE_DB_ONLY',
+						'selected'	=> false,
+					),
+				);
+			}
+
+			$this->iohandler->add_user_form_group('UPDATE_TYPE', array(
+				'update_type' => array(
+					'label'		=> 'UPDATE_TYPE',
+					'type'		=> 'radio',
+					'options'	=> $options,
+				),
+				'submit_update' => array(
+					'label'	=> 'SUBMIT',
+					'type'	=> 'submit',
+				),
+			));
+
+			throw new user_interaction_required_exception();
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/obtain_data/update_module.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\obtain_data;
+
+class update_module extends \phpbb\install\module_base
+{
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_navigation_stage_path()
+	{
+		return array('update', 0, 'obtain_data');
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_step_count()
+	{
+		return 0;
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/requirements/abstract_requirements_module.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\requirements;
+
+use phpbb\install\exception\user_interaction_required_exception;
+use phpbb\install\module_base;
+
+/**
+ * Base class for requirements installer module
+ */
+abstract class abstract_requirements_module extends module_base
+{
+	public function run()
+	{
+		$tests_passed = true;
+		foreach ($this->task_collection as $name => $task)
+		{
+			// Check if we can run the task
+			if (!$task->is_essential() && !$task->check_requirements())
+			{
+				continue;
+			}
+
+			if ($this->allow_progress_bar)
+			{
+				$this->install_config->increment_current_task_progress();
+			}
+
+			$test_result = $task->run();
+			$tests_passed = ($tests_passed) ? $test_result : false;
+		}
+
+		// Module finished, so clear task progress
+		$this->install_config->set_finished_task(0);
+
+		// Check if tests have failed
+		if (!$tests_passed)
+		{
+			// If requirements are not met, exit form installer
+			// Set up UI for retesting
+			$this->iohandler->add_user_form_group('', array(
+				'install'	=> array(
+					'label'	=> 'RETEST_REQUIREMENTS',
+					'type'	=> 'submit',
+				),
+			));
+
+			// Send the response and quit
+			throw new user_interaction_required_exception();
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_step_count()
+	{
+		return 0;
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/requirements/install_module.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\requirements;
+
+class install_module extends abstract_requirements_module
+{
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_navigation_stage_path()
+	{
+		return array('install', 0, 'requirements');
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/requirements/task/check_filesystem.php
@@ -0,0 +1,279 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\requirements\task;
+
+/**
+ * Checks filesystem requirements
+ */
+class check_filesystem extends \phpbb\install\task_base
+{
+	/**
+	 * @var \phpbb\filesystem\filesystem_interface
+	 */
+	protected $filesystem;
+
+	/**
+	 * @var array
+	 */
+	protected $files_to_check;
+
+	/**
+	 * @var bool
+	 */
+	protected $tests_passed;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $response;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\filesystem\filesystem_interface				$filesystem			filesystem handler
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$response			response helper
+	 * @param string												$phpbb_root_path	relative path to phpBB's root
+	 * @param string												$php_ext			extension of php files
+	 * @param bool													$check_config_php	Whether or not to check if config.php is writable
+	 */
+	public function __construct(\phpbb\filesystem\filesystem_interface $filesystem, \phpbb\install\helper\iohandler\iohandler_interface $response, $phpbb_root_path, $php_ext, $check_config_php = true)
+	{
+		parent::__construct(true);
+
+		$this->filesystem		= $filesystem;
+		$this->response			= $response;
+		$this->phpbb_root_path	= $phpbb_root_path;
+
+		$this->tests_passed = false;
+
+		// Files/Directories to check
+		// All file/directory names must be relative to phpBB's root path
+		$this->files_to_check = array(
+			array(
+				'path' => 'cache/',
+				'failable' => false,
+				'is_file' => false,
+			),
+			array(
+				'path' => 'store/',
+				'failable' => false,
+				'is_file' => false,
+			),
+			array(
+				'path' => 'files/',
+				'failable' => false,
+				'is_file' => false,
+			),
+			array(
+				'path' => 'images/avatars/upload/',
+				'failable' => true,
+				'is_file' => false,
+			),
+		);
+
+		if ($check_config_php)
+		{
+			$this->files_to_check[] = array(
+				'path' => "config.$php_ext",
+				'failable' => false,
+				'is_file' => true,
+			);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		$this->tests_passed = true;
+
+		// Check files/directories to be writable
+		foreach ($this->files_to_check as $file)
+		{
+			if ($file['is_file'])
+			{
+				$this->check_file($file['path'], $file['failable']);
+			}
+			else
+			{
+				$this->check_dir($file['path'], $file['failable']);
+			}
+		}
+
+		return $this->tests_passed;
+	}
+
+	/**
+	 * Sets $this->tests_passed
+	 *
+	 * @param	bool	$is_passed
+	 */
+	protected function set_test_passed($is_passed)
+	{
+		// If one test failed, tests_passed should be false
+		$this->tests_passed = (!$this->tests_passed) ? false : $is_passed;
+	}
+
+	/**
+	 * Check if a file is readable and writable
+	 *
+	 * @param string	$file		Filename
+	 * @param bool		$failable	Whether failing test should interrupt installation process
+	 */
+	protected function check_file($file, $failable = false)
+	{
+		$path = $this->phpbb_root_path . $file;
+		$exists = $writable = true;
+
+		// Try to create file if it does not exists
+		if (!file_exists($path))
+		{
+			$fp = @fopen($path, 'w');
+			@fclose($fp);
+			try
+			{
+				$this->filesystem->phpbb_chmod($path,
+					\phpbb\filesystem\filesystem_interface::CHMOD_READ | \phpbb\filesystem\filesystem_interface::CHMOD_WRITE
+				);
+				$exists = true;
+			}
+			catch (\phpbb\filesystem\exception\filesystem_exception $e)
+			{
+				// Do nothing
+			}
+		}
+
+		if (file_exists($path))
+		{
+			if (!$this->filesystem->is_writable($path))
+			{
+				$writable = false;
+			}
+		}
+		else
+		{
+			$exists = $writable = false;
+		}
+
+		$this->set_test_passed(($exists && $writable) || $failable);
+
+		if (!($exists && $writable))
+		{
+			$title = ($exists) ? 'FILE_NOT_WRITABLE' : 'FILE_NOT_EXISTS';
+			$lang_suffix = '_EXPLAIN';
+			$lang_suffix .= ($failable) ? '_OPTIONAL' : '';
+			$description = array($title . $lang_suffix, $file);
+
+			if ($failable)
+			{
+				$this->response->add_warning_message($title, $description);
+			}
+			else
+			{
+				$this->response->add_error_message($title, $description);
+			}
+		}
+	}
+
+	/**
+	 * Check if a directory is readable and writable
+	 *
+	 * @param string	$dir		Filename
+	 * @param bool		$failable	Whether failing test should abort the installation process
+	 */
+	protected function check_dir($dir, $failable = false)
+	{
+		$path = $this->phpbb_root_path . $dir;
+		$exists = $writable = false;
+
+		// Try to create the directory if it does not exist
+		if (!file_exists($path))
+		{
+			try
+			{
+				$this->filesystem->mkdir($path, 0777);
+				$this->filesystem->phpbb_chmod($path,
+					\phpbb\filesystem\filesystem_interface::CHMOD_READ | \phpbb\filesystem\filesystem_interface::CHMOD_WRITE
+				);
+				$exists = true;
+			}
+			catch (\phpbb\filesystem\exception\filesystem_exception $e)
+			{
+				// Do nothing
+			}
+		}
+
+		// Now really check
+		if (file_exists($path) && is_dir($path))
+		{
+			try
+			{
+				$exists = true;
+				$this->filesystem->phpbb_chmod($path,
+					\phpbb\filesystem\filesystem_interface::CHMOD_READ | \phpbb\filesystem\filesystem_interface::CHMOD_WRITE
+				);
+			}
+			catch (\phpbb\filesystem\exception\filesystem_exception $e)
+			{
+				// Do nothing
+			}
+		}
+
+		if ($this->filesystem->is_writable($path))
+		{
+			$writable = true;
+		}
+
+		$this->set_test_passed(($exists && $writable) || $failable);
+
+		if (!($exists && $writable))
+		{
+			$title = ($exists) ? 'DIRECTORY_NOT_WRITABLE' : 'DIRECTORY_NOT_EXISTS';
+			$lang_suffix = '_EXPLAIN';
+			$lang_suffix .= ($failable) ? '_OPTIONAL' : '';
+			$description = array($title . $lang_suffix, $dir);
+
+			if ($failable)
+			{
+				$this->response->add_warning_message($title, $description);
+			}
+			else
+			{
+				$this->response->add_error_message($title, $description);
+			}
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/requirements/task/check_server_environment.php
@@ -0,0 +1,209 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\requirements\task;
+
+/**
+ * Installer task that checks if the server meats phpBB requirements
+ */
+class check_server_environment extends \phpbb\install\task_base
+{
+	/**
+	 * @var \phpbb\install\helper\database
+	 */
+	protected $database_helper;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $response_helper;
+
+	/**
+	 * @var bool
+	 */
+	protected $tests_passed;
+
+	/**
+	 * Constructor
+	 *
+	 * @param	\phpbb\install\helper\database	$database_helper
+	 * @param	\phpbb\install\helper\iohandler\iohandler_interface	$response
+	 */
+	public function __construct(\phpbb\install\helper\database $database_helper,
+								\phpbb\install\helper\iohandler\iohandler_interface $response)
+	{
+		$this->database_helper	= $database_helper;
+		$this->response_helper	= $response;
+		$this->tests_passed		= true;
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		//
+		// Check requirements
+		// The error messages should be set in the check_ functions
+		//
+
+		// Check PHP version
+		$this->check_php_version();
+
+		// Check for getimagesize()
+		$this->check_image_size();
+
+		// Check for PCRE support
+		$this->check_pcre();
+
+		// Check for JSON support
+		$this->check_json();
+
+		// XML extension support check
+		$this->check_xml();
+
+		// Check for dbms support
+		$this->check_available_dbms();
+
+		return $this->tests_passed;
+	}
+
+	/**
+	 * Sets $this->tests_passed
+	 *
+	 * @param	bool	$is_passed
+	 */
+	protected function set_test_passed($is_passed)
+	{
+		// If one test failed, tests_passed should be false
+		$this->tests_passed = (!$this->tests_passed) ? false : $is_passed;
+	}
+
+	/**
+	 * Check if the requirements for PHP version is met
+	 */
+	protected function check_php_version()
+	{
+		$php_version = PHP_VERSION;
+
+		if (version_compare($php_version, '5.4') < 0)
+		{
+			$this->response_helper->add_error_message('PHP_VERSION_REQD', 'PHP_VERSION_REQD_EXPLAIN');
+
+			$this->set_test_passed(false);
+			return;
+		}
+
+		$this->set_test_passed(true);
+	}
+
+	/**
+	 * Checks if the installed PHP has getimagesize() available
+	 */
+	protected function check_image_size()
+	{
+		if (!@function_exists('getimagesize'))
+		{
+			$this->response_helper->add_error_message('PHP_GETIMAGESIZE_SUPPORT', 'PHP_GETIMAGESIZE_SUPPORT_EXPLAIN');
+
+			$this->set_test_passed(false);
+			return;
+		}
+
+		$this->set_test_passed(true);
+	}
+
+	/**
+	 * Checks if the installed PHP supports PCRE
+	 */
+	protected function check_pcre()
+	{
+		if (@preg_match('//u', ''))
+		{
+			$this->set_test_passed(true);
+			return;
+		}
+
+		$this->response_helper->add_error_message('PCRE_UTF_SUPPORT', 'PCRE_UTF_SUPPORT_EXPLAIN');
+
+		$this->set_test_passed(false);
+	}
+
+	/**
+	 * Checks whether PHP's JSON extension is available or not
+	 */
+	protected function check_json()
+	{
+		if (@extension_loaded('json'))
+		{
+			$this->set_test_passed(true);
+			return;
+		}
+
+		$this->response_helper->add_error_message('PHP_JSON_SUPPORT', 'PHP_JSON_SUPPORT_EXPLAIN');
+
+		$this->set_test_passed(false);
+	}
+
+	/**
+	 * Checks whether or not the XML PHP extension is available (Required by the text formatter)
+	 */
+	protected function check_xml()
+	{
+		if (class_exists('DOMDocument'))
+		{
+			$this->set_test_passed(true);
+			return;
+		}
+
+		$this->response_helper->add_error_message('PHP_XML_SUPPORT', 'PHP_XML_SUPPORT_EXPLAIN');
+
+		$this->set_test_passed(false);
+	}
+
+	/**
+	 * Check if any supported DBMS is available
+	 */
+	protected function check_available_dbms()
+	{
+		$available_dbms = $this->database_helper->get_available_dbms(false, true);
+
+		if ($available_dbms['ANY_DB_SUPPORT'])
+		{
+			$this->set_test_passed(true);
+			return;
+		}
+
+		$this->response_helper->add_error_message('PHP_SUPPORTED_DB', 'PHP_SUPPORTED_DB_EXPLAIN');
+
+		$this->set_test_passed(false);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/requirements/task/check_update.php
@@ -0,0 +1,195 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\requirements\task;
+
+use phpbb\filesystem\filesystem;
+use phpbb\install\helper\config;
+use phpbb\install\helper\container_factory;
+use phpbb\install\helper\iohandler\iohandler_interface;
+use phpbb\install\helper\update_helper;
+use phpbb\install\task_base;
+
+/**
+ * Check the availability of updater files and update version
+ */
+class check_update extends task_base
+{
+	/**
+	 * @var \phpbb\config\db
+	 */
+	protected $config;
+
+	/**
+	 * @var filesystem
+	 */
+	protected $filesystem;
+
+	/**
+	 * @var config
+	 */
+	protected $installer_config;
+
+	/**
+	 * @var iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var update_helper
+	 */
+	protected $update_helper;
+
+	/**
+	 * @var \phpbb\version_helper
+	 */
+	protected $version_helper;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * @var bool
+	 */
+	protected $tests_passed;
+
+	/**
+	 * Constructor
+	 *
+	 * @param container_factory		$container
+	 * @param filesystem			$filesystem
+	 * @param config				$config
+	 * @param iohandler_interface	$iohandler
+	 * @param update_helper			$update_helper
+	 * @param string				$phpbb_root_path
+	 * @param string				$php_ext
+	 */
+	public function __construct(container_factory $container, filesystem $filesystem, config $config, iohandler_interface $iohandler, update_helper $update_helper, $phpbb_root_path, $php_ext)
+	{
+		$this->filesystem		= $filesystem;
+		$this->installer_config	= $config;
+		$this->iohandler		= $iohandler;
+		$this->update_helper	= $update_helper;
+		$this->phpbb_root_path	= $phpbb_root_path;
+		$this->php_ext			= $php_ext;
+		$this->tests_passed		= true;
+
+		$this->config			= $container->get('config');
+		$this->version_helper	= $container->get('version_helper');
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * Sets $this->tests_passed
+	 *
+	 * @param	bool	$is_passed
+	 */
+	protected function set_test_passed($is_passed)
+	{
+		// If one test failed, tests_passed should be false
+		$this->tests_passed = $this->tests_passed && $is_passed;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		// Array of update files
+		$update_files = array(
+			$this->phpbb_root_path . 'install/update',
+			$this->phpbb_root_path . 'install/update/index.' . $this->php_ext,
+		);
+
+		// Check for a valid update directory
+		if (!$this->filesystem->exists($update_files) || !$this->filesystem->is_readable($update_files))
+		{
+			$this->iohandler->add_warning_message('UPDATE_FILES_NOT_FOUND');
+			$this->set_test_passed(false);
+
+			// If there are no update files, we can't check the version etc
+			// However, we can let the users run migrations if they really want to...
+			$this->installer_config->set('disable_filesystem_update', true);
+			return true;
+		}
+
+		// Recover version numbers
+		$update_info = array();
+		@include($this->phpbb_root_path . 'install/update/index.' . $this->php_ext);
+		$info = (empty($update_info) || !is_array($update_info)) ? false : $update_info;
+		$update_version = false;
+
+		if ($info !== false)
+		{
+			$update_version = (!empty($info['version']['to'])) ? trim($info['version']['to']) : false;
+		}
+
+		// Get current and latest version
+		try
+		{
+			$latest_version = $this->version_helper->get_latest_on_current_branch(true);
+		}
+		catch (\RuntimeException $e)
+		{
+			$latest_version = $update_version;
+		}
+
+		$current_version = (!empty($this->config['version_update_from'])) ? $this->config['version_update_from'] : $this->config['version'];
+
+		// Check if the update package
+		if (!$this->update_helper->phpbb_version_compare($current_version, $update_version, '<'))
+		{
+			$this->iohandler->add_error_message('NO_UPDATE_FILES_UP_TO_DATE');
+			$this->tests_passed = false;
+		}
+
+		// Check if the update package works with the installed version
+		if (empty($info['version']['from']) || $info['version']['from'] !== $current_version)
+		{
+			$this->iohandler->add_error_message(array('INCOMPATIBLE_UPDATE_FILES', $current_version, $info['version']['from'], $update_version));
+			$this->tests_passed = false;
+		}
+
+		// check if this is the latest update package
+		if ($this->update_helper->phpbb_version_compare($update_version, $latest_version, '<'))
+		{
+			$this->iohandler->add_warning_message(array('OLD_UPDATE_FILES', $info['version']['from'], $update_version, $latest_version));
+		}
+
+		return $this->tests_passed;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/requirements/update_module.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\requirements;
+
+class update_module extends abstract_requirements_module
+{
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_navigation_stage_path()
+	{
+		return array('update', 0, 'requirements');
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/update_database/module.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\update_database;
+
+class module extends \phpbb\install\module_base
+{
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_navigation_stage_path()
+	{
+		return array('update', 0, 'update_database');
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_step_count()
+	{
+		return 0;
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/update_database/task/update.php
@@ -0,0 +1,234 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\update_database\task;
+
+use phpbb\db\migration\exception;
+use phpbb\db\output_handler\installer_migrator_output_handler;
+use phpbb\db\output_handler\log_wrapper_migrator_output_handler;
+use phpbb\install\exception\resource_limit_reached_exception;
+use phpbb\install\exception\user_interaction_required_exception;
+use phpbb\install\task_base;
+
+/**
+ * Database updater task
+ */
+class update extends task_base
+{
+	/**
+	 * @var \phpbb\cache\driver\driver_interface
+	 */
+	protected $cache;
+
+	/**
+	 * @var \phpbb\config\config
+	 */
+	protected $config;
+
+	/**
+	 * @var \phpbb\extension\manager
+	 */
+	protected $extension_manager;
+
+	/**
+	 * @var \phpbb\filesystem\filesystem
+	 */
+	protected $filesystem;
+
+	/**
+	 * @var \phpbb\install\helper\config
+	 */
+	protected $installer_config;
+
+	/**
+	 * @var \phpbb\install\helper\iohandler\iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var \phpbb\language\language
+	 */
+	protected $language;
+
+	/**
+	 * @var \phpbb\log\log
+	 */
+	protected $log;
+
+	/**
+	 * @var \phpbb\db\migrator
+	 */
+	protected $migrator;
+
+	/**
+	 * @var \phpbb\user
+	 */
+	protected $user;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\install\helper\container_factory				$container
+	 * @param \phpbb\filesystem\filesystem							$filesystem
+	 * @param \phpbb\install\helper\config							$installer_config
+	 * @param \phpbb\install\helper\iohandler\iohandler_interface	$iohandler
+	 * @param \phpbb\language\language								$language
+	 * @param string												$phpbb_root_path
+	 */
+	public function __construct(\phpbb\install\helper\container_factory $container, \phpbb\filesystem\filesystem $filesystem, \phpbb\install\helper\config $installer_config, \phpbb\install\helper\iohandler\iohandler_interface $iohandler, \phpbb\language\language $language, $phpbb_root_path)
+	{
+		$this->filesystem			= $filesystem;
+		$this->installer_config		= $installer_config;
+		$this->iohandler			= $iohandler;
+		$this->language				= $language;
+		$this->phpbb_root_path		= $phpbb_root_path;
+
+		$this->cache				= $container->get('cache.driver');
+		$this->config				= $container->get('config');
+		$this->extension_manager	= $container->get('ext.manager');
+		$this->log					= $container->get('log');
+		$this->migrator				= $container->get('migrator');
+		$this->user					= $container->get('user');
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		$this->language->add_lang('migrator');
+
+		if (!isset($this->config['version_update_from']))
+		{
+			$this->config->set('version_update_from', $this->config['version']);
+		}
+
+		$original_version = $this->config['version_update_from'];
+
+		$this->migrator->set_output_handler(
+			new log_wrapper_migrator_output_handler(
+				$this->language,
+				new installer_migrator_output_handler($this->iohandler),
+				$this->phpbb_root_path . 'store/migrations_' . time() . '.log',
+				$this->filesystem
+			)
+		);
+
+		$this->migrator->create_migrations_table();
+
+		$migrations = $this->extension_manager
+			->get_finder()
+			->core_path('phpbb/db/migration/data/')
+			->extension_directory('/migrations')
+			->get_classes();
+
+		$this->migrator->set_migrations($migrations);
+
+		$migration_step_count = $this->installer_config->get('database_update_migration_steps', -1);
+		if ($migration_step_count < 0)
+		{
+			$migration_step_count = count($this->migrator->get_installable_migrations()) * 2;
+			$this->installer_config->set('database_update_migration_steps', $migration_step_count);
+		}
+
+		$progress_count = $this->installer_config->get('database_update_count', 0);
+		$restart_progress_bar = ($progress_count === 0); // Only "restart" when the update runs for the first time
+		$this->iohandler->set_task_count($migration_step_count, $restart_progress_bar);
+		$this->installer_config->set_task_progress_count($migration_step_count);
+
+		while (!$this->migrator->finished())
+		{
+			try
+			{
+				$this->migrator->update();
+				$progress_count++;
+
+				$last_run_migration = $this->migrator->get_last_run_migration();
+				if (isset($last_run_migration['effectively_installed']) && $last_run_migration['effectively_installed'])
+				{
+					// We skipped two step, so increment $progress_count by another one
+					$progress_count++;
+				}
+				else if (($last_run_migration['task'] === 'process_schema_step' && !$last_run_migration['state']['migration_schema_done']) ||
+					($last_run_migration['task'] === 'process_data_step' && !$last_run_migration['state']['migration_data_done']))
+				{
+					// We just run a step that wasn't counted yet so make it count
+					$migration_step_count++;
+				}
+
+				$this->iohandler->set_task_count($migration_step_count);
+				$this->installer_config->set_task_progress_count($migration_step_count);
+				$this->iohandler->set_progress('STAGE_UPDATE_DATABASE', $progress_count);
+			}
+			catch (exception $e)
+			{
+				$msg = $e->getParameters();
+				array_unshift($msg, $e->getMessage());
+
+				$this->iohandler->add_error_message($msg);
+				throw new user_interaction_required_exception();
+			}
+
+			if ($this->installer_config->get_time_remaining() <= 0 || $this->installer_config->get_memory_remaining() <= 0)
+			{
+				$this->installer_config->set('database_update_count', $progress_count);
+				$this->installer_config->set('database_update_migration_steps', $migration_step_count);
+				throw new resource_limit_reached_exception();
+			}
+		}
+
+		if ($original_version !== $this->config['version'])
+		{
+			$this->log->add(
+				'admin',
+				(isset($this->user->data['user_id'])) ? $this->user->data['user_id'] : ANONYMOUS,
+				$this->user->ip,
+				'LOG_UPDATE_DATABASE',
+				false,
+				array(
+					$original_version,
+					$this->config['version']
+				)
+			);
+		}
+
+		$this->iohandler->add_success_message('INLINE_UPDATE_SUCCESSFUL');
+
+		$this->cache->purge();
+
+		$this->config->increment('assets_version', 1);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/update_database/task/update_extensions.php
@@ -0,0 +1,263 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\update_database\task;
+
+use phpbb\install\exception\resource_limit_reached_exception;
+use phpbb\install\helper\container_factory;
+use phpbb\install\helper\config;
+use phpbb\install\helper\iohandler\iohandler_interface;
+use phpbb\install\helper\update_helper;
+use phpbb\install\task_base;
+use Symfony\Component\Finder\Finder;
+
+/**
+ * Installs extensions that exist in ext folder upon install
+ */
+class update_extensions extends task_base
+{
+	/**
+	 * @var \phpbb\cache\driver\driver_interface
+	 */
+	protected $cache;
+
+	/**
+	 * @var config
+	 */
+	protected $install_config;
+
+	/**
+	 * @var iohandler_interface
+	 */
+	protected $iohandler;
+
+	/** @var update_helper */
+	protected $update_helper;
+
+	/**
+	 * @var \phpbb\config\db
+	 */
+	protected $config;
+
+	/**
+	 * @var \phpbb\log\log_interface
+	 */
+	protected $log;
+
+	/**
+	 * @var \phpbb\user
+	 */
+	protected $user;
+
+	/** @var \phpbb\extension\manager */
+	protected $extension_manager;
+
+	/** @var Finder */
+	protected $finder;
+
+	/** @var string Extension table */
+	protected $extension_table;
+
+	/** @var \phpbb\db\driver\driver_interface */
+	protected $db;
+
+	/**
+	 * @var array	List of default extensions to update, grouped by version
+	 *				they were added
+	 */
+	static public $default_extensions_update = [
+		'3.2.0-RC2' => ['phpbb/viglink']
+	];
+
+	/**
+	 * Constructor
+	 *
+	 * @param container_factory			$container
+	 * @param config					$install_config
+	 * @param iohandler_interface		$iohandler
+	 * @param $update_helper			$update_helper
+	 * @param string					$phpbb_root_path phpBB root path
+	 */
+	public function __construct(container_factory $container, config $install_config, iohandler_interface $iohandler, update_helper $update_helper, $phpbb_root_path)
+	{
+		$this->install_config	= $install_config;
+		$this->iohandler		= $iohandler;
+		$this->extension_table = $container->get_parameter('tables.ext');
+
+		$this->log				= $container->get('log');
+		$this->user				= $container->get('user');
+		$this->extension_manager = $container->get('ext.manager');
+		$this->cache				= $container->get('cache.driver');
+		$this->config			= $container->get('config');
+		$this->db				= $container->get('dbal.conn');
+		$this->update_helper = $update_helper;
+		$this->finder = new Finder();
+		$this->finder->in($phpbb_root_path . 'ext/')
+			->ignoreUnreadableDirs()
+			->depth('< 3')
+			->files()
+			->name('composer.json');
+
+		// Make sure asset version exists in config. Otherwise we might try to
+		// insert the assets_version setting into the database and cause a
+		// duplicate entry error.
+		if (!isset($this->config['assets_version']))
+		{
+			$this->config['assets_version'] = 0;
+		}
+
+		parent::__construct(true);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		$this->user->session_begin();
+		$this->user->setup(array('common', 'acp/common', 'cli'));
+
+		$update_info = $this->install_config->get('update_info_unprocessed', []);
+		$version_from = !empty($update_info) ? $update_info['version']['from'] : $this->config['version_update_from'];
+
+		if (!empty($version_from))
+		{
+			$update_extensions = $this->iohandler->get_input('update-extensions', []);
+
+			// Create list of default extensions that need to be enabled in update
+			$default_update_extensions = [];
+			foreach (self::$default_extensions_update as $version => $extensions)
+			{
+				if ($this->update_helper->phpbb_version_compare($version_from, $version, '<'))
+				{
+					$default_update_extensions = array_merge($default_update_extensions, $extensions);
+				}
+			}
+
+			$all_available_extensions = $this->extension_manager->all_available();
+			$i = $this->install_config->get('update_extensions_index', 0);
+			$available_extensions = array_slice($all_available_extensions, $i);
+
+			// Update available extensions
+			foreach ($available_extensions as $ext_name => $ext_path)
+			{
+				// Update extensions if:
+				//	1) Extension is currently enabled
+				//	2) Extension was implicitly defined as needing an update
+				//	3) Extension was newly added as default phpBB extension in
+				//		this update and should be enabled by default.
+				if ($this->extension_manager->is_enabled($ext_name) ||
+					in_array($ext_name, $update_extensions) ||
+					in_array($ext_name, $default_update_extensions)
+				)
+				{
+					try
+					{
+						$extension_enabled = $this->extension_manager->is_enabled($ext_name);
+						if ($extension_enabled)
+						{
+							$this->extension_manager->disable($ext_name);
+						}
+						$this->extension_manager->enable($ext_name);
+						$extensions = $this->get_extensions();
+
+						if (isset($extensions[$ext_name]) && $extensions[$ext_name]['ext_active'])
+						{
+							// Create log
+							$this->log->add('admin', ANONYMOUS, '', 'LOG_EXT_UPDATE', time(), array($ext_name));
+							$this->iohandler->add_success_message(array('CLI_EXTENSION_UPDATE_SUCCESS', $ext_name));
+						}
+						else
+						{
+							$this->iohandler->add_log_message('CLI_EXTENSION_UPDATE_FAILURE', array($ext_name));
+						}
+
+						// Disable extensions if it was disabled by the admin before
+						if (!$extension_enabled && !in_array($ext_name, $default_update_extensions))
+						{
+							$this->extension_manager->disable($ext_name);
+						}
+					}
+					catch (\Exception $e)
+					{
+						// Add fail log and continue
+						$this->iohandler->add_log_message('CLI_EXTENSION_UPDATE_FAILURE', array($ext_name));
+					}
+				}
+
+				$i++;
+
+				// Stop execution if resource limit is reached
+				if ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0)
+				{
+					break;
+				}
+			}
+
+			$this->install_config->set('update_extensions_index', $i);
+
+			if ($i < sizeof($all_available_extensions))
+			{
+				throw new resource_limit_reached_exception();
+			}
+		}
+
+		$this->config->delete('version_update_from');
+
+		$this->cache->purge();
+
+		$this->config->increment('assets_version', 1);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 1;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return 'TASK_UPDATE_EXTENSIONS';
+	}
+
+	/**
+	 * Get extensions from database
+	 *
+	 * @return array List of extensions
+	 */
+	private function get_extensions()
+	{
+		$sql = 'SELECT *
+			FROM ' . $this->extension_table;
+
+		$result = $this->db->sql_query($sql);
+		$extensions_row = $this->db->sql_fetchrowset($result);
+		$this->db->sql_freeresult($result);
+
+		$extensions = array();
+
+		foreach ($extensions_row as $extension)
+		{
+			$extensions[$extension['ext_name']] = $extension;
+		}
+
+		ksort($extensions);
+
+		return $extensions;
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/update_filesystem/module.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\update_filesystem;
+
+class module extends \phpbb\install\module_base
+{
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_navigation_stage_path()
+	{
+		return array('update', 0, 'update_files');
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_step_count()
+	{
+		return 0;
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/update_filesystem/task/diff_files.php
@@ -0,0 +1,205 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\update_filesystem\task;
+
+use phpbb\install\exception\resource_limit_reached_exception;
+use phpbb\install\exception\user_interaction_required_exception;
+use phpbb\install\helper\config;
+use phpbb\install\helper\container_factory;
+use phpbb\install\helper\iohandler\iohandler_interface;
+use phpbb\install\helper\update_helper;
+use phpbb\install\task_base;
+
+/**
+ * Merges user made changes into the files
+ */
+class diff_files extends task_base
+{
+	/**
+	 * @var \phpbb\cache\driver\driver_interface
+	 */
+	protected $cache;
+
+	/**
+	 * @var config
+	 */
+	protected $installer_config;
+
+	/**
+	 * @var iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * @var update_helper
+	 */
+	protected $update_helper;
+
+	/**
+	 * Constructor
+	 *
+	 * @param container_factory		$container
+	 * @param config				$config
+	 * @param iohandler_interface	$iohandler
+	 * @param update_helper			$update_helper
+	 * @param string				$phpbb_root_path
+	 * @param string				$php_ext
+	 */
+	public function __construct(container_factory $container, config $config, iohandler_interface $iohandler, update_helper $update_helper, $phpbb_root_path, $php_ext)
+	{
+		$this->installer_config	= $config;
+		$this->iohandler		= $iohandler;
+		$this->update_helper	= $update_helper;
+		$this->phpbb_root_path	= $phpbb_root_path;
+		$this->php_ext			= $php_ext;
+
+		$this->cache			= $container->get('cache.driver');
+
+		parent::__construct(false);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function check_requirements()
+	{
+		$files_to_diff = $this->installer_config->get('update_files', array());
+		$files_to_diff = (isset($files_to_diff['update_with_diff'])) ? $files_to_diff['update_with_diff'] : array();
+
+		return $this->installer_config->get('do_update_files', false) && count($files_to_diff) > 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		// Include diff engine
+		$this->update_helper->include_file('includes/diff/diff.' . $this->php_ext);
+		$this->update_helper->include_file('includes/diff/engine.' . $this->php_ext);
+
+		// Set up basic vars
+		$old_path = $this->update_helper->get_path_to_old_update_files();
+		$new_path = $this->update_helper->get_path_to_new_update_files();
+
+		$files_to_diff = $this->installer_config->get('update_files', array());
+		$files_to_diff = $files_to_diff['update_with_diff'];
+
+		// Set progress bar
+		$this->iohandler->set_task_count(count($files_to_diff), true);
+		$this->iohandler->set_progress('UPDATE_FILE_DIFF', 0);
+		$progress_count = $this->installer_config->get('file_diff_update_count', 0);
+
+		// Recover progress
+		$progress_key = $this->installer_config->get('differ_progress_key', -1);
+		$progress_recovered = ($progress_key === -1);
+		$merge_conflicts = $this->installer_config->get('merge_conflict_list', array());
+
+		foreach ($files_to_diff as $key => $filename)
+		{
+			if ($progress_recovered === false)
+			{
+				if ($progress_key === $key)
+				{
+					$progress_recovered = true;
+				}
+
+				continue;
+			}
+
+			// Read in files' content
+			$file_contents = array();
+
+			// Handle the special case when user created a file with the filename that is now new in the core
+			$file_contents[0] = (file_exists($old_path . $filename)) ? file_get_contents($old_path . $filename) : '';
+
+			$filenames = array(
+				$this->phpbb_root_path . $filename,
+				$new_path . $filename
+			);
+
+			foreach ($filenames as $file_to_diff)
+			{
+				$file_contents[] = file_get_contents($file_to_diff);
+
+				if ($file_contents[sizeof($file_contents) - 1] === false)
+				{
+					$this->iohandler->add_error_message(array('FILE_DIFFER_ERROR_FILE_CANNOT_BE_READ', $files_to_diff));
+					unset($file_contents);
+					throw new user_interaction_required_exception();
+				}
+			}
+
+			$diff = new \diff3($file_contents[0], $file_contents[1], $file_contents[2]);
+			unset($file_contents);
+
+			// Handle conflicts
+			if ($diff->get_num_conflicts() !== 0)
+			{
+				$merge_conflicts[] = $filename;
+			}
+
+			// Save merged output
+			$this->cache->put(
+				'_file_' . md5($filename),
+				base64_encode(implode("\n", $diff->merged_output()))
+			);
+
+			unset($diff);
+
+			$progress_count++;
+			$this->iohandler->set_progress('UPDATE_FILE_DIFF', $progress_count);
+
+			if ($this->installer_config->get_time_remaining() <= 0 || $this->installer_config->get_memory_remaining() <= 0)
+			{
+				// Save differ progress
+				$this->installer_config->set('differ_progress_key', $key);
+				$this->installer_config->set('merge_conflict_list', $merge_conflicts);
+				$this->installer_config->set('file_diff_update_count', $progress_count);
+
+				// Request refresh
+				throw new resource_limit_reached_exception();
+			}
+		}
+
+		$this->iohandler->finish_progress('ALL_FILES_DIFFED');
+		$this->installer_config->set('merge_conflict_list', $merge_conflicts);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/update_filesystem/task/download_updated_files.php
@@ -0,0 +1,123 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\update_filesystem\task;
+
+use phpbb\filesystem\filesystem;
+use phpbb\install\exception\jump_to_restart_point_exception;
+use phpbb\install\exception\user_interaction_required_exception;
+use phpbb\install\helper\config;
+use phpbb\install\helper\iohandler\iohandler_interface;
+use phpbb\install\task_base;
+
+class download_updated_files extends task_base
+{
+	/**
+	 * @var config
+	 */
+	protected $installer_config;
+
+	/**
+	 * @var filesystem
+	 */
+	protected $filesystem;
+
+	/**
+	 * @var iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * Constructor
+	 *
+	 * @param config				$config
+	 * @param iohandler_interface	$iohandler
+	 * @param filesystem			$filesystem
+	 */
+	public function __construct(config $config, iohandler_interface $iohandler, filesystem $filesystem)
+	{
+		$this->installer_config	= $config;
+		$this->iohandler		= $iohandler;
+		$this->filesystem		= $filesystem;
+
+		parent::__construct(false);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function check_requirements()
+	{
+		return $this->installer_config->get('do_update_files', false)
+			&& $this->installer_config->get('file_update_method', '') === 'compression';
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		if ($this->iohandler->get_input('database_update_submit', false))
+		{
+			// Remove archive
+			$this->filesystem->remove(
+				$this->installer_config->get('update_file_archive', null)
+			);
+
+			$this->installer_config->set('update_file_archive', null);
+		}
+		else if ($this->iohandler->get_input('update_recheck_files_submit', false))
+		{
+			throw new jump_to_restart_point_exception('check_update_files');
+		}
+		else
+		{
+			// Render download box
+			$this->iohandler->add_download_link(
+				'phpbb_installer_update_file_download',
+				'DOWNLOAD_UPDATE_METHOD',
+				'DOWNLOAD_UPDATE_METHOD_EXPLAIN'
+			);
+
+			// Add form to continue update
+			$this->iohandler->add_user_form_group('UPDATE_CONTINUE_UPDATE_PROCESS', array(
+				'update_recheck_files_submit'	=> array(
+					'label'	=> 'UPDATE_RECHECK_UPDATE_FILES',
+					'type'	=> 'submit',
+				),
+				'database_update_submit'	=> array(
+					'label'	=> 'UPDATE_CONTINUE_UPDATE_PROCESS',
+					'type'	=> 'submit',
+				),
+			));
+
+			throw new user_interaction_required_exception();
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/update_filesystem/task/file_check.php
@@ -0,0 +1,219 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\update_filesystem\task;
+
+use phpbb\filesystem\filesystem;
+use phpbb\install\exception\resource_limit_reached_exception;
+use phpbb\install\helper\config;
+use phpbb\install\helper\iohandler\iohandler_interface;
+use phpbb\install\helper\update_helper;
+use phpbb\install\task_base;
+
+/**
+ * Updater task performing file checking
+ */
+class file_check extends task_base
+{
+	/**
+	 * @var filesystem
+	 */
+	protected $filesystem;
+
+	/**
+	 * @var config
+	 */
+	protected $installer_config;
+
+	/**
+	 * @var iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var update_helper
+	 */
+	protected $update_helper;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * Construct
+	 *
+	 * @param filesystem			$filesystem
+	 * @param config				$config
+	 * @param iohandler_interface	$iohandler
+	 * @param update_helper			$update_helper
+	 * @param string				$phpbb_root_path
+	 */
+	public function __construct(filesystem $filesystem, config $config, iohandler_interface $iohandler, update_helper $update_helper, $phpbb_root_path)
+	{
+		$this->filesystem		= $filesystem;
+		$this->installer_config	= $config;
+		$this->iohandler		= $iohandler;
+		$this->update_helper	= $update_helper;
+		$this->phpbb_root_path	= $phpbb_root_path;
+
+		parent::__construct(false);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function check_requirements()
+	{
+		return $this->installer_config->get('do_update_files', false);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		if (!$this->installer_config->has_restart_point('check_update_files'))
+		{
+			$this->installer_config->create_progress_restart_point('check_update_files');
+		}
+
+		$old_path = $this->update_helper->get_path_to_old_update_files();
+		$new_path = $this->update_helper->get_path_to_new_update_files();
+
+		$update_info = $this->installer_config->get('update_info', array());
+		$file_update_info = $this->installer_config->get('update_files', array());
+
+		if (empty($update_info))
+		{
+			$root_path = $this->phpbb_root_path;
+
+			$update_info = $this->installer_config->get('update_info_unprocessed', array());
+
+			$file_update_info = array();
+			$file_update_info['update_without_diff'] = array_diff($update_info['binary'], $update_info['deleted']);
+
+			// Filter out files that are already deleted
+			$file_update_info['delete'] = array_filter(
+				$update_info['deleted'],
+				function ($filename) use ($root_path)
+				{
+					return file_exists($root_path . $filename);
+				}
+			);
+		}
+
+		$progress_count = $this->installer_config->get('file_check_progress_count', 0);
+		$task_count = count($update_info['files']);
+		$this->iohandler->set_task_count($task_count);
+		$this->iohandler->set_progress('UPDATE_CHECK_FILES', 0);
+
+		// Create list of default extensions that should have been added prior
+		// to this update
+		$default_update_extensions = [];
+		foreach (\phpbb\install\module\update_database\task\update_extensions::$default_extensions_update as $version => $extensions)
+		{
+			if ($this->update_helper->phpbb_version_compare($update_info['version']['from'], $version, '>='))
+			{
+				$default_update_extensions = array_merge($default_update_extensions, $extensions);
+			}
+		}
+
+		foreach ($update_info['files'] as $key => $filename)
+		{
+			$old_file = $old_path . $filename;
+			$new_file = $new_path . $filename;
+			$file = $this->phpbb_root_path . $filename;
+
+			if ($this->installer_config->get_time_remaining() <= 0 || $this->installer_config->get_memory_remaining() <= 0)
+			{
+				// Save progress
+				$this->installer_config->set('update_info', $update_info);
+				$this->installer_config->set('file_check_progress_count', $progress_count);
+				$this->installer_config->set('update_files', $file_update_info);
+
+				// Request refresh
+				throw new resource_limit_reached_exception();
+			}
+
+			$progress_count++;
+			$this->iohandler->set_progress('UPDATE_CHECK_FILES', $progress_count);
+
+			// Do not copy default extension again if the previous version was
+			// packaged with it but it does not exist (e.g. deleted by admin)
+			if (strpos($file, $this->phpbb_root_path . 'ext/') !== false)
+			{
+				$skip_file = false;
+				foreach ($default_update_extensions as $ext_name)
+				{
+					if (strpos($file, $this->phpbb_root_path . 'ext/' . $ext_name) !== false &&
+						!$this->filesystem->exists($this->phpbb_root_path . 'ext/' . $ext_name . '/composer.json'))
+					{
+						$skip_file = true;
+						break;
+					}
+				}
+
+				if ($skip_file)
+				{
+					continue;
+				}
+			}
+
+			if (!$this->filesystem->exists($file))
+			{
+				$file_update_info['new'][] = $filename;
+			}
+			else
+			{
+				$file_checksum = md5_file($file);
+
+				if ($file_checksum === md5_file($new_file))
+				{
+					// File already up to date
+					continue;
+				}
+				else if ($this->filesystem->exists($old_file) && $file_checksum === md5_file($old_file))
+				{
+					// No need to diff the file
+					$file_update_info['update_without_diff'][] = $filename;
+				}
+				else
+				{
+					$file_update_info['update_with_diff'][] = $filename;
+				}
+			}
+
+			unset($update_info['files'][$key]);
+		}
+
+		$this->installer_config->set('update_files', $file_update_info);
+		$this->installer_config->set('update_info', array());
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/update_filesystem/task/show_file_status.php
@@ -0,0 +1,170 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\update_filesystem\task;
+
+use phpbb\filesystem\filesystem;
+use phpbb\install\exception\user_interaction_required_exception;
+use phpbb\install\helper\config;
+use phpbb\install\helper\container_factory;
+use phpbb\install\helper\file_updater\factory;
+use phpbb\install\helper\iohandler\iohandler_interface;
+use phpbb\install\task_base;
+
+class show_file_status extends task_base
+{
+	/**
+	 * @var \phpbb\cache\driver\driver_interface
+	 */
+	protected $cache;
+
+	/**
+	 * @var filesystem
+	 */
+	protected $filesystem;
+
+	/**
+	 * @var config
+	 */
+	protected $installer_config;
+
+	/**
+	 * @var iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var \phpbb\install\helper\file_updater\compression_file_updater
+	 */
+	protected $file_updater;
+
+	/**
+	 * Constructor
+	 *
+	 * @param container_factory		$container
+	 * @param config				$config
+	 * @param iohandler_interface	$iohandler
+	 * @param filesystem			$filesystem
+	 * @param factory				$file_updater_factory
+	 */
+	public function __construct(container_factory $container, config $config, iohandler_interface $iohandler, filesystem $filesystem, factory $file_updater_factory)
+	{
+		$this->installer_config	= $config;
+		$this->iohandler		= $iohandler;
+		$this->filesystem		= $filesystem;
+
+		$this->cache = $container->get('cache.driver');
+
+		// Initialize compression file updater
+		$this->file_updater = $file_updater_factory->get('compression');
+
+		parent::__construct(false);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function check_requirements()
+	{
+		return $this->installer_config->get('do_update_files', false);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		if (!$this->iohandler->get_input('submit_continue_file_update', false))
+		{
+			// Handle merge conflicts
+			$merge_conflicts = $this->installer_config->get('merge_conflict_list', array());
+
+			// Create archive for merge conflicts
+			if (!empty($merge_conflicts))
+			{
+				$compression_method = $this->installer_config->get('file_update_compression', '');
+				$conflict_archive = $this->file_updater->init($compression_method);
+				$this->installer_config->set('update_file_conflict_archive', $conflict_archive);
+
+				foreach ($merge_conflicts as $filename)
+				{
+					$this->file_updater->create_new_file(
+						$filename,
+						base64_decode($this->cache->get('_file_' . md5($filename))),
+						true
+					);
+				}
+
+				// Render download box
+				$this->iohandler->add_download_link(
+					'phpbb_installer_update_conflict_download',
+					'DOWNLOAD_CONFLICTS',
+					'DOWNLOAD_CONFLICTS_EXPLAIN'
+				);
+
+				$this->file_updater->close();
+			}
+
+			// Render update file statuses
+			$file_update_info = $this->installer_config->get('update_files', array());
+			$file_status = array(
+				'deleted'		=> (!isset($file_update_info['delete'])) ? array() : $file_update_info['delete'],
+				'new'			=> (!isset($file_update_info['new'])) ? array() : $file_update_info['new'],
+				'conflict'		=> $this->installer_config->get('merge_conflict_list', array()),
+				'modified'		=> (!isset($file_update_info['update_with_diff'])) ? array() : $file_update_info['update_with_diff'],
+				'not_modified'	=> (!isset($file_update_info['update_without_diff'])) ? array() : $file_update_info['update_without_diff'],
+			);
+
+			$this->iohandler->render_update_file_status($file_status);
+
+			// Add form to continue update
+			$this->iohandler->add_user_form_group('UPDATE_CONTINUE_FILE_UPDATE', array(
+				'submit_continue_file_update'	=> array(
+					'label'	=> 'UPDATE_CONTINUE_FILE_UPDATE',
+					'type'	=> 'submit',
+				),
+			));
+
+			// Show results to the user
+			throw new user_interaction_required_exception();
+		}
+		else
+		{
+			$conflict_archive_path = $this->installer_config->get('update_file_conflict_archive', null);
+
+			// Remove archive
+			if ($conflict_archive_path !== null && $this->filesystem->exists($conflict_archive_path))
+			{
+				$this->filesystem->remove($conflict_archive_path);
+			}
+
+			$this->installer_config->set('update_file_conflict_archive', null);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module/update_filesystem/task/update_files.php
@@ -0,0 +1,294 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\module\update_filesystem\task;
+
+use phpbb\exception\runtime_exception;
+use phpbb\install\exception\resource_limit_reached_exception;
+use phpbb\install\helper\config;
+use phpbb\install\helper\container_factory;
+use phpbb\install\helper\file_updater\factory;
+use phpbb\install\helper\file_updater\file_updater_interface;
+use phpbb\install\helper\iohandler\iohandler_interface;
+use phpbb\install\helper\update_helper;
+use phpbb\install\task_base;
+
+/**
+ * File updater task
+ */
+class update_files extends task_base
+{
+	/**
+	 * @var \phpbb\cache\driver\driver_interface
+	 */
+	protected $cache;
+
+	/**
+	 * @var config
+	 */
+	protected $installer_config;
+
+	/**
+	 * @var iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var factory
+	 */
+	protected $factory;
+
+	/**
+	 * @var file_updater_interface
+	 */
+	protected $file_updater;
+
+	/**
+	 * @var update_helper
+	 */
+	protected $update_helper;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * Constructor
+	 *
+	 * @param container_factory		$container
+	 * @param config				$config
+	 * @param iohandler_interface	$iohandler
+	 * @param factory				$file_updater_factory
+	 * @param update_helper			$update_helper
+	 * @param string				$phpbb_root_path
+	 */
+	public function __construct(container_factory $container, config $config, iohandler_interface $iohandler, factory $file_updater_factory, update_helper $update_helper, $phpbb_root_path)
+	{
+		$this->factory			= $file_updater_factory;
+		$this->installer_config	= $config;
+		$this->iohandler		= $iohandler;
+		$this->update_helper	= $update_helper;
+		$this->phpbb_root_path	= $phpbb_root_path;
+
+		$this->cache			= $container->get('cache.driver');
+		$this->file_updater		= null;
+
+		parent::__construct(false);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function check_requirements()
+	{
+		return $this->installer_config->get('do_update_files', false);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		$new_path = $this->update_helper->get_path_to_new_update_files();
+
+		$file_update_info = $this->installer_config->get('update_files', array());
+
+		$update_type_progress = $this->installer_config->get('file_updater_type_progress', '');
+		$update_elem_progress = $this->installer_config->get('file_updater_elem_progress', '');
+		$type_progress_found = false;
+		$elem_progress_found = false;
+
+		// Progress bar
+		$task_count = 0;
+		foreach ($file_update_info as $sub_array)
+		{
+			$task_count += count($sub_array);
+		}
+
+		// Everything is up to date, so just continue
+		if ($task_count === 0)
+		{
+			return;
+		}
+
+		$progress_count = $this->installer_config->get('file_update_progress_count', 0);
+		$this->iohandler->set_task_count($task_count, true);
+		$this->iohandler->set_progress('UPDATE_UPDATING_FILES', 0);
+
+		$this->file_updater = $this->get_file_updater();
+
+		// File updater fallback logic
+		try
+		{
+			// Update files
+			foreach ($file_update_info as $type => $file_update_vector)
+			{
+				if (!$type_progress_found)
+				{
+					if ($type === $update_type_progress || empty($update_elem_progress))
+					{
+						$type_progress_found = true;
+					}
+					else
+					{
+						continue;
+					}
+				}
+
+				foreach ($file_update_vector as $path)
+				{
+					if (!$elem_progress_found)
+					{
+						if ($path === $update_elem_progress || empty($update_elem_progress))
+						{
+							$elem_progress_found = true;
+						}
+						else
+						{
+							continue;
+						}
+					}
+
+					switch ($type)
+					{
+						case 'delete':
+							$this->file_updater->delete_file($path);
+						break;
+						case 'new':
+							$this->file_updater->create_new_file($path, $new_path . $path);
+						break;
+						case 'update_without_diff':
+							$this->file_updater->update_file($path, $new_path . $path);
+						break;
+						case 'update_with_diff':
+							$this->file_updater->update_file(
+								$path,
+								base64_decode($this->cache->get('_file_' . md5($path))),
+								true
+							);
+						break;
+					}
+
+					// Save progress
+					$this->installer_config->set('file_updater_type_progress', $type);
+					$this->installer_config->set('file_updater_elem_progress', $path);
+					$progress_count++;
+					$this->iohandler->set_progress('UPDATE_UPDATING_FILES', $progress_count);
+
+					if ($this->installer_config->get_time_remaining() <= 0 || $this->installer_config->get_memory_remaining() <= 0)
+					{
+						// Request refresh
+						throw new resource_limit_reached_exception();
+					}
+				}
+			}
+
+			$this->iohandler->finish_progress('UPDATE_UPDATING_FILES');
+		}
+		catch (runtime_exception $e)
+		{
+			if ($e instanceof resource_limit_reached_exception)
+			{
+				throw new resource_limit_reached_exception();
+			}
+
+			$current_method = $this->installer_config->get('file_update_method', '');
+
+			// File updater failed, try to fallback to download file update mode
+			if ($current_method !== 'compression')
+			{
+				$this->iohandler->add_warning_message(array(
+					'UPDATE_FILE_UPDATER_HAS_FAILED',
+					$current_method,
+					'compression'
+				));
+				$this->installer_config->set('file_update_method', 'compression');
+
+				// We only want a simple refresh here
+				throw new resource_limit_reached_exception();
+			}
+			else
+			{
+				// Nowhere to fallback to :(
+				// Due to the way the installer handles fatal errors, we need to throw a low level exception
+				throw new runtime_exception('UPDATE_FILE_UPDATERS_HAVE_FAILED');
+			}
+		}
+
+		$file_updater_method = $this->installer_config->get('file_update_method', '');
+		if ($file_updater_method === 'compression' || $file_updater_method === 'ftp')
+		{
+			$this->file_updater->close();
+		}
+	}
+
+	/**
+	 * Get file updater
+	 *
+	 * @param null|string	$file_updater_method	Name of the file updater to use
+	 *
+	 * @return file_updater_interface	File updater
+	 */
+	protected function get_file_updater($file_updater_method = null)
+	{
+		$file_updater_method = ($file_updater_method === null) ? $this->installer_config->get('file_update_method', '') : $file_updater_method;
+
+		if ($file_updater_method === 'compression')
+		{
+			$compression_method = $this->installer_config->get('file_update_compression', '');
+
+			/** @var \phpbb\install\helper\file_updater\compression_file_updater $file_updater */
+			$file_updater = $this->factory->get('compression');
+			$archive_path = $file_updater->init($compression_method);
+			$this->installer_config->set('update_file_archive', $archive_path);
+		}
+		else if ($file_updater_method === 'ftp')
+		{
+			/** @var \phpbb\install\helper\file_updater\ftp_file_updater $file_updater */
+			$file_updater = $this->factory->get('ftp');
+			$file_updater->init(
+				$this->installer_config->get('ftp_method', ''),
+				$this->installer_config->get('ftp_host', ''),
+				$this->installer_config->get('ftp_user', ''),
+				$this->installer_config->get('ftp_pass', ''),
+				$this->installer_config->get('ftp_path', ''),
+				$this->installer_config->get('ftp_port', 0),
+				$this->installer_config->get('ftp_timeout', 10)
+			);
+		}
+		else
+		{
+			/** @var file_updater_interface $file_updater */
+			$file_updater = $this->factory->get('direct_file');
+		}
+
+		return $file_updater;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	static public function get_step_count()
+	{
+		return 0;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_task_lang_name()
+	{
+		return '';
+	}
+}
--- /dev/null
+++ b/phpbb/install/module_base.php
@@ -0,0 +1,213 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install;
+
+use phpbb\di\ordered_service_collection;
+use phpbb\install\exception\resource_limit_reached_exception;
+use phpbb\install\helper\config;
+use phpbb\install\helper\iohandler\iohandler_interface;
+
+/**
+ * Base class for installer module
+ */
+abstract class module_base implements module_interface
+{
+	/**
+	 * @var config
+	 */
+	protected $install_config;
+
+	/**
+	 * @var iohandler_interface
+	 */
+	protected $iohandler;
+
+	/**
+	 * @var bool
+	 */
+	protected $is_essential;
+
+	/**
+	 * Array of tasks for installer module
+	 *
+	 * @var ordered_service_collection
+	 */
+	protected $task_collection;
+
+	/**
+	 * @var array
+	 */
+	protected $task_step_count;
+
+	/**
+	 * @var bool
+	 */
+	protected $allow_progress_bar;
+
+	/**
+	 * Installer module constructor
+	 *
+	 * @param ordered_service_collection	$tasks				array of installer tasks for installer module
+	 * @param bool							$essential			flag indicating whether the module is essential or not
+	 * @param bool							$allow_progress_bar	flag indicating whether or not to send progress information from within the module
+	 */
+	public function __construct(ordered_service_collection $tasks, $essential = true, $allow_progress_bar = true)
+	{
+		$this->task_collection		= $tasks;
+		$this->is_essential			= $essential;
+		$this->allow_progress_bar	= $allow_progress_bar;
+	}
+
+	/**
+	 * Dependency getter
+	 *
+	 * @param config				$config
+	 * @param iohandler_interface	$iohandler
+	 */
+	public function setup(config $config, iohandler_interface $iohandler)
+	{
+		$this->install_config	= $config;
+		$this->iohandler		= $iohandler;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function is_essential()
+	{
+		return $this->is_essential;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 *
+	 * Overwrite this method if your task is non-essential!
+	 */
+	public function check_requirements()
+	{
+		return true;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function run()
+	{
+		// Recover install progress
+		$task_index	= $this->recover_progress();
+		$iterator	= $this->task_collection->getIterator();
+
+		if ($task_index < $iterator->count())
+		{
+			$iterator->seek($task_index);
+		}
+		else
+		{
+			$this->install_config->set_finished_task(0);
+			return;
+		}
+
+		while ($iterator->valid())
+		{
+			$task = $iterator->current();
+			$name = $iterator->key();
+
+			// Check if we can run the task
+			if (!$task->is_essential() && !$task->check_requirements())
+			{
+				$this->iohandler->add_log_message(array(
+					'SKIP_TASK',
+					$name,
+				));
+
+				$this->install_config->increment_current_task_progress($this->task_step_count[$name]);
+			}
+			else
+			{
+				// Send progress information
+				if ($this->allow_progress_bar)
+				{
+					$this->iohandler->set_progress(
+						$task->get_task_lang_name(),
+						$this->install_config->get_current_task_progress()
+					);
+
+					$this->iohandler->send_response();
+				}
+
+				$task->run();
+
+				if ($this->allow_progress_bar)
+				{
+					// Only increment progress by one, as if a task has more than one steps
+					// then that should be incremented in the task itself
+					$this->install_config->increment_current_task_progress();
+				}
+			}
+
+			$task_index++;
+			$this->install_config->set_finished_task($task_index);
+			$iterator->next();
+
+			// Send progress information
+			if ($this->allow_progress_bar)
+			{
+				$this->iohandler->set_progress(
+					$task->get_task_lang_name(),
+					$this->install_config->get_current_task_progress()
+				);
+			}
+
+			$this->iohandler->send_response();
+
+			// Stop execution if resource limit is reached
+			if ($iterator->valid() && ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0))
+			{
+				throw new resource_limit_reached_exception();
+			}
+		}
+
+		// Module finished, so clear task progress
+		$this->install_config->set_finished_task(0);
+	}
+
+	/**
+	 * Returns the next task's name
+	 *
+	 * @return string	Index of the array element of the next task
+	 */
+	protected function recover_progress()
+	{
+		$progress_array = $this->install_config->get_progress_data();
+		return $progress_array['last_task_index'];
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function get_step_count()
+	{
+		$task_step_count = 0;
+		$task_class_names = $this->task_collection->get_service_classes();
+
+		foreach ($task_class_names as $name => $task_class)
+		{
+			$step_count = $task_class::get_step_count();
+			$task_step_count += $step_count;
+			$this->task_step_count[$name] = $step_count;
+		}
+
+		return $task_step_count;
+	}
+}
--- /dev/null
+++ b/phpbb/install/module_interface.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install;
+
+/**
+ * Interface for installer modules
+ *
+ * An installer module is a task collection which executes installer tasks.
+ */
+interface module_interface
+{
+	/**
+	 * Checks if the execution of the module is essential to install phpBB or it can be skipped
+	 *
+	 * Note: Please note that all the non-essential modules have to implement check_requirements()
+	 * method.
+	 *
+	 * @return	bool	true if the module is essential, false otherwise
+	 */
+	public function is_essential();
+
+	/**
+	 * Checks requirements for the tasks
+	 *
+	 * Note: Only need to be implemented for non-essential tasks, as essential tasks
+	 * requirements should be checked in the requirements install module.
+	 *
+	 * @return bool	true if the task's requirements are met
+	 */
+	public function check_requirements();
+
+	/**
+	 * Executes the task
+	 *
+	 * @return	null
+	 */
+	public function run();
+
+	/**
+	 * Returns the number of tasks in the module
+	 *
+	 * @return int
+	 */
+	public function get_step_count();
+
+	/**
+	 * Returns an array to the correct navigation stage
+	 *
+	 * @return array
+	 */
+	public function get_navigation_stage_path();
+}
--- /dev/null
+++ b/phpbb/install/task_base.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install;
+
+/**
+ * Base class for installer task
+ */
+abstract class task_base implements task_interface
+{
+	/**
+	 * @var bool
+	 */
+	protected $is_essential;
+
+	/**
+	 * Constructor
+	 *
+	 * @param bool $essential
+	 */
+	public function __construct($essential = true)
+	{
+		$this->is_essential = $essential;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function is_essential()
+	{
+		return $this->is_essential;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 *
+	 * Note: Overwrite this method if your task is non-essential!
+	 */
+	public function check_requirements()
+	{
+		return true;
+	}
+}
--- /dev/null
+++ b/phpbb/install/task_interface.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install;
+
+/**
+ * Interface for installer tasks
+ */
+interface task_interface
+{
+	/**
+	 * Returns the number of steps the task contains
+	 *
+	 * This is a helper method to provide a better progress bar for the front-end.
+	 *
+	 * @return int	The number of steps that the task contains
+	 */
+	static public function get_step_count();
+
+	/**
+	 * Checks if the task is essential to install phpBB or it can be skipped
+	 *
+	 * Note: Please note that all the non-essential modules have to implement check_requirements()
+	 * method.
+	 *
+	 * @return	bool	true if the task is essential, false otherwise
+	 */
+	public function is_essential();
+
+	/**
+	 * Checks requirements for the tasks
+	 *
+	 * Note: Only need to be implemented for non-essential tasks, as essential tasks
+	 * requirements should be checked in the requirements install module.
+	 *
+	 * @return bool	true if the task's requirements are met
+	 */
+	public function check_requirements();
+
+	/**
+	 * Executes the task
+	 */
+	public function run();
+
+	/**
+	 * Returns the language key of the name of the task
+	 *
+	 * @return string
+	 */
+	public function get_task_lang_name();
+}
--- /dev/null
+++ b/phpbb/install/updater_configuration.php
@@ -0,0 +1,44 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\install;
+
+use Symfony\Component\Config\Definition\Builder\TreeBuilder;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+
+class updater_configuration implements ConfigurationInterface
+{
+
+	/**
+	 * Generates the configuration tree builder.
+	 *
+	 * @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
+	 */
+	public function getConfigTreeBuilder()
+	{
+		$treeBuilder = new TreeBuilder();
+		$rootNode = $treeBuilder->root('updater');
+		$rootNode
+			->addDefaultsIfNotSet()
+			->children()
+				->enumNode('type')->values(['all','db_only'])->defaultValue('all')->end()
+				->arrayNode('extensions')
+					->prototype('scalar')->end()
+					->defaultValue([])
+				->end()
+			->end()
+		;
+
+		return $treeBuilder;
+	}
+}
--- /dev/null
+++ b/phpbb/language/exception/invalid_plural_rule_exception.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\language\exception;
+
+/**
+ * Thrown when nonexistent plural rule is specified
+ */
+class invalid_plural_rule_exception extends language_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/language/exception/language_exception.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\language\exception;
+
+/**
+ * Base exception class for language exceptions
+ */
+class language_exception extends \phpbb\exception\runtime_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/language/exception/language_file_not_found.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\language\exception;
+
+/**
+ * This exception is thrown when the language file is not found
+ */
+class language_file_not_found extends language_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/language/language.php
@@ -0,0 +1,673 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\language;
+
+use phpbb\language\exception\invalid_plural_rule_exception;
+
+/**
+ * Wrapper class for loading translations
+ */
+class language
+{
+	/**
+	 * Global fallback language
+	 *
+	 * ISO code of the language to fallback to when the specified language entries
+	 * cannot be found.
+	 *
+	 * @var string
+	 */
+	const FALLBACK_LANGUAGE = 'en';
+
+	/**
+	 * @var array	List of common language files
+	 */
+	protected $common_language_files;
+
+	/**
+	 * @var bool
+	 */
+	protected $common_language_files_loaded;
+
+	/**
+	 * @var string	ISO code of the default board language
+	 */
+	protected $default_language;
+
+	/**
+	 * @var string	ISO code of the User's language
+	 */
+	protected $user_language;
+
+	/**
+	 * @var array	Language fallback array (the order is important)
+	 */
+	protected $language_fallback;
+
+	/**
+	 * @var array	Array of language variables
+	 */
+	protected $lang;
+
+	/**
+	 * @var array	Loaded language sets
+	 */
+	protected $loaded_language_sets;
+
+	/**
+	 * @var \phpbb\language\language_file_loader Language file loader
+	 */
+	protected $loader;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\language\language_file_loader	$loader			Language file loader
+	 * @param array|null							$common_modules	Array of common language modules to load (optional)
+	 */
+	public function __construct(language_file_loader $loader, $common_modules = null)
+	{
+		$this->loader = $loader;
+
+		// Set up default information
+		$this->user_language		= false;
+		$this->default_language		= false;
+		$this->lang					= array();
+		$this->loaded_language_sets	= array(
+			'core'	=> array(),
+			'ext'	=> array(),
+		);
+
+		// Common language files
+		if (is_array($common_modules))
+		{
+			$this->common_language_files = $common_modules;
+		}
+		else
+		{
+			$this->common_language_files = array(
+				'common',
+			);
+		}
+
+		$this->common_language_files_loaded = false;
+
+		$this->language_fallback = array(self::FALLBACK_LANGUAGE);
+	}
+
+	/**
+	 * Function to set user's language to display.
+	 *
+	 * @param string	$user_lang_iso		ISO code of the User's language
+	 * @param bool		$reload				Whether or not to reload language files
+	 */
+	public function set_user_language($user_lang_iso, $reload = false)
+	{
+		$this->user_language = $user_lang_iso;
+
+		$this->set_fallback_array($reload);
+	}
+
+	/**
+	 * Function to set the board's default language to display.
+	 *
+	 * @param string	$default_lang_iso	ISO code of the board's default language
+	 * @param bool		$reload				Whether or not to reload language files
+	 */
+	public function set_default_language($default_lang_iso, $reload = false)
+	{
+		$this->default_language = $default_lang_iso;
+
+		$this->set_fallback_array($reload);
+	}
+
+	/**
+	 * Returns language array
+	 *
+	 * Note: This function is needed for the BC purposes, until \phpbb\user::lang[] is
+	 *       not removed.
+	 *
+	 * @return array	Array of loaded language strings
+	 */
+	public function get_lang_array()
+	{
+		// Load common language files if they not loaded yet
+		if (!$this->common_language_files_loaded)
+		{
+			$this->load_common_language_files();
+		}
+
+		return $this->lang;
+	}
+
+	/**
+	 * Add Language Items
+	 *
+	 * Examples:
+	 * <code>
+	 * $component = array('posting');
+	 * $component = array('posting', 'viewtopic')
+	 * $component = 'posting'
+	 * </code>
+	 *
+	 * @param string|array	$component		The name of the language component to load
+	 * @param string|null	$extension_name	Name of the extension to load component from, or null for core file
+	 */
+	public function add_lang($component, $extension_name = null)
+	{
+		// Load common language files if they not loaded yet
+		// This needs to be here to correctly merge language arrays
+		if (!$this->common_language_files_loaded)
+		{
+			$this->load_common_language_files();
+		}
+
+		if (!is_array($component))
+		{
+			if (!is_null($extension_name))
+			{
+				$this->load_extension($extension_name, $component);
+			}
+			else
+			{
+				$this->load_core_file($component);
+			}
+		}
+		else
+		{
+			foreach ($component as $lang_file)
+			{
+				$this->add_lang($lang_file, $extension_name);
+			}
+		}
+	}
+
+	/**
+	 * @param $key array|string		The language key we want to know more about. Can be string or array.
+	 *
+	 * @return bool		Returns whether the language key is set.
+	 */
+	public function is_set($key)
+	{
+		// Load common language files if they not loaded yet
+		if (!$this->common_language_files_loaded)
+		{
+			$this->load_common_language_files();
+		}
+
+		if (is_array($key))
+		{
+			$lang = &$this->lang[array_shift($key)];
+
+			foreach ($key as $_key)
+			{
+				$lang = &$lang[$_key];
+			}
+		}
+		else
+		{
+			$lang = &$this->lang[$key];
+		}
+
+		return isset($lang);
+	}
+
+	/**
+	 * Advanced language substitution
+	 *
+	 * Function to mimic sprintf() with the possibility of using phpBB's language system to substitute nullar/singular/plural forms.
+	 * Params are the language key and the parameters to be substituted.
+	 * This function/functionality is inspired by SHS` and Ashe.
+	 *
+	 * Example call: <samp>$user->lang('NUM_POSTS_IN_QUEUE', 1);</samp>
+	 *
+	 * If the first parameter is an array, the elements are used as keys and subkeys to get the language entry:
+	 * Example: <samp>$user->lang(array('datetime', 'AGO'), 1)</samp> uses $user->lang['datetime']['AGO'] as language entry.
+	 *
+	 * @return string	Return localized string or the language key if the translation is not available
+	 */
+	public function lang()
+	{
+		$args = func_get_args();
+		$key = array_shift($args);
+
+		return $this->lang_array($key, $args);
+	}
+
+	/**
+	 * Returns the raw value associated to a language key or the language key no translation is available.
+	 * No parameter substitution is performed, can be a string or an array.
+	 *
+	 * @param string|array	$key	Language key
+	 *
+	 * @return array|string
+	 */
+	public function lang_raw($key)
+	{
+		// Load common language files if they not loaded yet
+		if (!$this->common_language_files_loaded)
+		{
+			$this->load_common_language_files();
+		}
+
+		if (is_array($key))
+		{
+			$lang = &$this->lang[array_shift($key)];
+
+			foreach ($key as $_key)
+			{
+				$lang = &$lang[$_key];
+			}
+		}
+		else
+		{
+			$lang = &$this->lang[$key];
+		}
+
+		// Return if language string does not exist
+		if (!isset($lang) || (!is_string($lang) && !is_array($lang)))
+		{
+			return $key;
+		}
+
+		return $lang;
+	}
+
+	/**
+	 * Act like lang() but takes a key and an array of parameters instead of using variadic
+	 *
+	 * @param string|array	$key	Language key
+	 * @param array			$args	Parameters
+	 *
+	 * @return string
+	 */
+	public function lang_array($key, $args = array())
+	{
+		$lang = $this->lang_raw($key);
+
+		if ($lang === $key)
+		{
+			return $key;
+		}
+
+		// If the language entry is a string, we simply mimic sprintf() behaviour
+		if (is_string($lang))
+		{
+			if (count($args) === 0)
+			{
+				return $lang;
+			}
+
+			// Replace key with language entry and simply pass along...
+			return vsprintf($lang, $args);
+		}
+		else if (sizeof($lang) == 0)
+		{
+			// If the language entry is an empty array, we just return the language key
+			return $key;
+		}
+
+		// It is an array... now handle different nullar/singular/plural forms
+		$key_found = false;
+
+		// We now get the first number passed and will select the key based upon this number
+		for ($i = 0, $num_args = sizeof($args); $i < $num_args; $i++)
+		{
+			if (is_int($args[$i]) || is_float($args[$i]))
+			{
+				if ($args[$i] == 0 && isset($lang[0]))
+				{
+					// We allow each translation using plural forms to specify a version for the case of 0 things,
+					// so that "0 users" may be displayed as "No users".
+					$key_found = 0;
+					break;
+				}
+				else
+				{
+					$use_plural_form = $this->get_plural_form($args[$i]);
+					if (isset($lang[$use_plural_form]))
+					{
+						// The key we should use exists, so we use it.
+						$key_found = $use_plural_form;
+					}
+					else
+					{
+						// If the key we need to use does not exist, we fall back to the previous one.
+						$numbers = array_keys($lang);
+
+						foreach ($numbers as $num)
+						{
+							if ($num > $use_plural_form)
+							{
+								break;
+							}
+
+							$key_found = $num;
+						}
+					}
+					break;
+				}
+			}
+		}
+
+		// Ok, let's check if the key was found, else use the last entry (because it is mostly the plural form)
+		if ($key_found === false)
+		{
+			$numbers = array_keys($lang);
+			$key_found = end($numbers);
+		}
+
+		// Use the language string we determined and pass it to sprintf()
+		return vsprintf($lang[$key_found], $args);
+	}
+
+	/**
+	 * Loads common language files
+	 */
+	protected function load_common_language_files()
+	{
+		if (!$this->common_language_files_loaded)
+		{
+			foreach ($this->common_language_files as $lang_file)
+			{
+				$this->load_core_file($lang_file);
+			}
+
+			$this->common_language_files_loaded = true;
+		}
+	}
+
+	/**
+	 * Determine which plural form we should use.
+	 *
+	 * For some languages this is not as simple as for English.
+	 *
+	 * @param int|float		$number		The number we want to get the plural case for. Float numbers are floored.
+	 * @param int|bool		$force_rule	False to use the plural rule of the language package
+	 *									or an integer to force a certain plural rule
+	 *
+	 * @return int	The plural-case we need to use for the number plural-rule combination
+	 *
+	 * @throws \phpbb\language\exception\invalid_plural_rule_exception	When $force_rule has an invalid value
+	 */
+	public function get_plural_form($number, $force_rule = false)
+	{
+		$number			= (int) $number;
+		$plural_rule	= ($force_rule !== false) ? $force_rule : ((isset($this->lang['PLURAL_RULE'])) ? $this->lang['PLURAL_RULE'] : 1);
+
+		if ($plural_rule > 15 || $plural_rule < 0)
+		{
+			throw new invalid_plural_rule_exception('INVALID_PLURAL_RULE', array(
+				'plural_rule' => $plural_rule,
+			));
+		}
+
+		/**
+		 * The following plural rules are based on a list published by the Mozilla Developer Network
+		 * https://developer.mozilla.org/en/Localization_and_Plurals
+		 */
+		switch ($plural_rule)
+		{
+			case 0:
+				/**
+				 * Families: Asian (Chinese, Japanese, Korean, Vietnamese), Persian, Turkic/Altaic (Turkish), Thai, Lao
+				 * 1 - everything: 0, 1, 2, ...
+				 */
+				return 1;
+
+			case 1:
+				/**
+				 * Families: Germanic (Danish, Dutch, English, Faroese, Frisian, German, Norwegian, Swedish), Finno-Ugric (Estonian, Finnish, Hungarian), Language isolate (Basque), Latin/Greek (Greek), Semitic (Hebrew), Romanic (Italian, Portuguese, Spanish, Catalan)
+				 * 1 - 1
+				 * 2 - everything else: 0, 2, 3, ...
+				 */
+				return ($number === 1) ? 1 : 2;
+
+			case 2:
+				/**
+				 * Families: Romanic (French, Brazilian Portuguese)
+				 * 1 - 0, 1
+				 * 2 - everything else: 2, 3, ...
+				 */
+				return (($number === 0) || ($number === 1)) ? 1 : 2;
+
+			case 3:
+				/**
+				 * Families: Baltic (Latvian)
+				 * 1 - 0
+				 * 2 - ends in 1, not 11: 1, 21, ... 101, 121, ...
+				 * 3 - everything else: 2, 3, ... 10, 11, 12, ... 20, 22, ...
+				 */
+				return ($number === 0) ? 1 : ((($number % 10 === 1) && ($number % 100 != 11)) ? 2 : 3);
+
+			case 4:
+				/**
+				 * Families: Celtic (Scottish Gaelic)
+				 * 1 - is 1 or 11: 1, 11
+				 * 2 - is 2 or 12: 2, 12
+				 * 3 - others between 3 and 19: 3, 4, ... 10, 13, ... 18, 19
+				 * 4 - everything else: 0, 20, 21, ...
+				 */
+				return ($number === 1 || $number === 11) ? 1 : (($number === 2 || $number === 12) ? 2 : (($number >= 3 && $number <= 19) ? 3 : 4));
+
+			case 5:
+				/**
+				 * Families: Romanic (Romanian)
+				 * 1 - 1
+				 * 2 - is 0 or ends in 01-19: 0, 2, 3, ... 19, 101, 102, ... 119, 201, ...
+				 * 3 - everything else: 20, 21, ...
+				 */
+				return ($number === 1) ? 1 : ((($number === 0) || (($number % 100 > 0) && ($number % 100 < 20))) ? 2 : 3);
+
+			case 6:
+				/**
+				 * Families: Baltic (Lithuanian)
+				 * 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, ...
+				 * 2 - ends in 0 or ends in 10-20: 0, 10, 11, 12, ... 19, 20, 30, 40, ...
+				 * 3 - everything else: 2, 3, ... 8, 9, 22, 23, ... 29, 32, 33, ...
+				 */
+				return (($number % 10 === 1) && ($number % 100 != 11)) ? 1 : ((($number % 10 < 2) || (($number % 100 >= 10) && ($number % 100 < 20))) ? 2 : 3);
+
+			case 7:
+				/**
+				 * Families: Slavic (Croatian, Serbian, Russian, Ukrainian)
+				 * 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, ...
+				 * 2 - ends in 2-4, not 12-14: 2, 3, 4, 22, 23, 24, 32, ...
+				 * 3 - everything else: 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, ...
+				 */
+				return (($number % 10 === 1) && ($number % 100 != 11)) ? 1 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 2 : 3);
+
+			case 8:
+				/**
+				 * Families: Slavic (Slovak, Czech)
+				 * 1 - 1
+				 * 2 - 2, 3, 4
+				 * 3 - everything else: 0, 5, 6, 7, ...
+				 */
+				return ($number === 1) ? 1 : ((($number >= 2) && ($number <= 4)) ? 2 : 3);
+
+			case 9:
+				/**
+				 * Families: Slavic (Polish)
+				 * 1 - 1
+				 * 2 - ends in 2-4, not 12-14: 2, 3, 4, 22, 23, 24, 32, ... 104, 122, ...
+				 * 3 - everything else: 0, 5, 6, ... 11, 12, 13, 14, 15, ... 20, 21, 25, ...
+				 */
+				return ($number === 1) ? 1 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 2 : 3);
+
+			case 10:
+				/**
+				 * Families: Slavic (Slovenian, Sorbian)
+				 * 1 - ends in 01: 1, 101, 201, ...
+				 * 2 - ends in 02: 2, 102, 202, ...
+				 * 3 - ends in 03-04: 3, 4, 103, 104, 203, 204, ...
+				 * 4 - everything else: 0, 5, 6, 7, 8, 9, 10, 11, ...
+				 */
+				return ($number % 100 === 1) ? 1 : (($number % 100 === 2) ? 2 : ((($number % 100 === 3) || ($number % 100 === 4)) ? 3 : 4));
+
+			case 11:
+				/**
+				 * Families: Celtic (Irish Gaeilge)
+				 * 1 - 1
+				 * 2 - 2
+				 * 3 - is 3-6: 3, 4, 5, 6
+				 * 4 - is 7-10: 7, 8, 9, 10
+				 * 5 - everything else: 0, 11, 12, ...
+				 */
+				return ($number === 1) ? 1 : (($number === 2) ? 2 : (($number >= 3 && $number <= 6) ? 3 : (($number >= 7 && $number <= 10) ? 4 : 5)));
+
+			case 12:
+				/**
+				 * Families: Semitic (Arabic)
+				 * 1 - 1
+				 * 2 - 2
+				 * 3 - ends in 03-10: 3, 4, ... 10, 103, 104, ... 110, 203, 204, ...
+				 * 4 - ends in 11-99: 11, ... 99, 111, 112, ...
+				 * 5 - everything else: 100, 101, 102, 200, 201, 202, ...
+				 * 6 - 0
+				 */
+				return ($number === 1) ? 1 : (($number === 2) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : (($number != 0) ? 5 : 6))));
+
+			case 13:
+				/**
+				 * Families: Semitic (Maltese)
+				 * 1 - 1
+				 * 2 - is 0 or ends in 01-10: 0, 2, 3, ... 9, 10, 101, 102, ...
+				 * 3 - ends in 11-19: 11, 12, ... 18, 19, 111, 112, ...
+				 * 4 - everything else: 20, 21, ...
+				 */
+				return ($number === 1) ? 1 : ((($number === 0) || (($number % 100 > 1) && ($number % 100 < 11))) ? 2 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 3 : 4));
+
+			case 14:
+				/**
+				 * Families: Slavic (Macedonian)
+				 * 1 - ends in 1: 1, 11, 21, ...
+				 * 2 - ends in 2: 2, 12, 22, ...
+				 * 3 - everything else: 0, 3, 4, ... 10, 13, 14, ... 20, 23, ...
+				 */
+				return ($number % 10 === 1) ? 1 : (($number % 10 === 2) ? 2 : 3);
+
+			case 15:
+				/**
+				 * Families: Icelandic
+				 * 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, 131, ...
+				 * 2 - everything else: 0, 2, 3, ... 10, 11, 12, ... 20, 22, ...
+				 */
+				return (($number % 10 === 1) && ($number % 100 != 11)) ? 1 : 2;
+		}
+	}
+
+	/**
+	 * Returns the ISO code of the used language
+	 *
+	 * @return string	The ISO code of the currently used language
+	 */
+	public function get_used_language()
+	{
+		return $this->language_fallback[0];
+	}
+
+	/**
+	 * Returns language fallback data
+	 *
+	 * @param bool	$reload	Whether or not to reload language files
+	 *
+	 * @return array
+	 */
+	protected function set_fallback_array($reload = false)
+	{
+		$fallback_array = array();
+
+		if ($this->user_language)
+		{
+			$fallback_array[] = $this->user_language;
+		}
+
+		if ($this->default_language)
+		{
+			$fallback_array[] = $this->default_language;
+		}
+
+		$fallback_array[] = self::FALLBACK_LANGUAGE;
+
+		$this->language_fallback = $fallback_array;
+
+		if ($reload)
+		{
+			$this->reload_language_files();
+		}
+	}
+
+	/**
+	 * Load core language file
+	 *
+	 * @param string	$component	Name of the component to load
+	 */
+	protected function load_core_file($component)
+	{
+		// Check if the component is already loaded
+		if (isset($this->loaded_language_sets['core'][$component]))
+		{
+			return;
+		}
+
+		$this->loader->load($component, $this->language_fallback, $this->lang);
+		$this->loaded_language_sets['core'][$component] = true;
+	}
+
+	/**
+	 * Load extension language file
+	 *
+	 * @param string	$extension_name	Name of the extension to load language from
+	 * @param string	$component		Name of the component to load
+	 */
+	protected function load_extension($extension_name, $component)
+	{
+		// Check if the component is already loaded
+		if (isset($this->loaded_language_sets['ext'][$extension_name][$component]))
+		{
+			return;
+		}
+
+		$this->loader->load_extension($extension_name, $component, $this->language_fallback, $this->lang);
+		$this->loaded_language_sets['ext'][$extension_name][$component] = true;
+	}
+
+	/**
+	 * Reload language files
+	 */
+	protected function reload_language_files()
+	{
+		$loaded_files = $this->loaded_language_sets;
+		$this->loaded_language_sets	= array(
+			'core'	=> array(),
+			'ext'	=> array(),
+		);
+
+		// Reload core files
+		foreach ($loaded_files['core'] as $component => $value)
+		{
+			$this->load_core_file($component);
+		}
+
+		// Reload extension files
+		foreach ($loaded_files['ext'] as $ext_name => $ext_info)
+		{
+			foreach ($ext_info as $ext_component => $value)
+			{
+				$this->load_extension($ext_name, $ext_component);
+			}
+		}
+	}
+}
--- /dev/null
+++ b/phpbb/language/language_file_helper.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\language;
+
+use Symfony\Component\Finder\Finder;
+
+/**
+ * Helper class for language file related functions
+ */
+class language_file_helper
+{
+	/**
+	 * @var string	Path to phpBB's root
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * Constructor
+	 *
+	 * @param string	$phpbb_root_path	Path to phpBB's root
+	 */
+	public function __construct($phpbb_root_path)
+	{
+		$this->phpbb_root_path = $phpbb_root_path;
+	}
+
+	/**
+	 * Returns available languages
+	 *
+	 * @return array
+	 */
+	public function get_available_languages()
+	{
+		// Find available language packages
+		$finder = new Finder();
+		$finder->files()
+			->name('iso.txt')
+			->depth('== 1')
+			->followLinks()
+			->in($this->phpbb_root_path . 'language');
+
+		$available_languages = array();
+		foreach ($finder as $file)
+		{
+			$path = $file->getRelativePath();
+			$info = explode("\n", $file->getContents());
+
+			$available_languages[] = array(
+				// Get the name of the directory containing iso.txt
+				'iso' => $path,
+
+				// Recover data from file
+				'name' => trim($info[0]),
+				'local_name' => trim($info[1]),
+				'author' => trim($info[2])
+			);
+		}
+
+		return $available_languages;
+	}
+}
--- /dev/null
+++ b/phpbb/language/language_file_loader.php
@@ -0,0 +1,206 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\language;
+
+use \phpbb\language\exception\language_file_not_found;
+
+/**
+ * Language file loader
+ */
+class language_file_loader
+{
+	/**
+	 * @var string	Path to phpBB's root
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string	Extension of PHP files
+	 */
+	protected $php_ext;
+
+	/**
+	 * @var \phpbb\extension\manager	Extension manager
+	 */
+	protected $extension_manager;
+
+	/**
+	 * Constructor
+	 *
+	 * @param string	$phpbb_root_path	Path to phpBB's root
+	 * @param string	$php_ext			Extension of PHP files
+	 */
+	public function __construct($phpbb_root_path, $php_ext)
+	{
+		$this->phpbb_root_path	= $phpbb_root_path;
+		$this->php_ext			= $php_ext;
+
+		$this->extension_manager = null;
+	}
+
+	/**
+	 * Extension manager setter
+	 *
+	 * @param \phpbb\extension\manager	$extension_manager	Extension manager
+	 */
+	public function set_extension_manager(\phpbb\extension\manager $extension_manager)
+	{
+		$this->extension_manager = $extension_manager;
+	}
+
+	/**
+	 * Loads language array for the given component
+	 *
+	 * @param string		$component	Name of the language component
+	 * @param string|array	$locale		ISO code of the language to load, or array of ISO codes if you want to
+	 * 									specify additional language fallback steps
+	 * @param array			$lang		Array reference containing language strings
+	 */
+	public function load($component, $locale, &$lang)
+	{
+		$locale = (array) $locale;
+
+		// Determine path to language directory
+		$path = $this->phpbb_root_path . 'language/';
+
+		$this->load_file($path, $component, $locale, $lang);
+	}
+
+	/**
+	 * Loads language array for the given extension component
+	 *
+	 * @param string		$extension	Name of the extension
+	 * @param string		$component	Name of the language component
+	 * @param string|array	$locale		ISO code of the language to load, or array of ISO codes if you want to
+	 * 									specify additional language fallback steps
+	 * @param array			$lang		Array reference containing language strings
+	 */
+	public function load_extension($extension, $component, $locale, &$lang)
+	{
+		// Check if extension manager was loaded
+		if ($this->extension_manager === null)
+		{
+			// If not, let's return
+			return;
+		}
+
+		$locale = (array) $locale;
+
+		// Determine path to language directory
+		$path = $this->extension_manager->get_extension_path($extension, true) . 'language/';
+
+		$this->load_file($path, $component, $locale, $lang);
+	}
+
+	/**
+	 * Prepares language file loading
+	 *
+	 * @param string	$path		Path to search for file in
+	 * @param string	$component	Name of the language component
+	 * @param array		$locale		Array containing language fallback options
+	 * @param array		$lang		Array reference of language strings
+	 */
+	protected function load_file($path, $component, $locale, &$lang)
+	{
+		// This is BC stuff and not the best idea as it makes language fallback
+		// implementation quite hard like below.
+		if (strpos($this->phpbb_root_path . $component, $path) === 0)
+		{
+			// Filter out the path
+			$path_diff = str_replace($path, '', dirname($this->phpbb_root_path . $component));
+			$language_file = basename($component, '.' . $this->php_ext);
+			$component = '';
+
+			// This step is needed to resolve language/en/subdir style $component
+			// $path already points to the language base directory so we need to eliminate
+			// the first directory from the path (that should be the language directory)
+			$path_diff_parts = explode('/', $path_diff);
+
+			if (sizeof($path_diff_parts) > 1)
+			{
+				array_shift($path_diff_parts);
+				$component = implode('/', $path_diff_parts) . '/';
+			}
+
+			$component .= $language_file;
+		}
+
+		// Determine filename
+		$filename = $component . '.' . $this->php_ext;
+
+		// Determine path to file
+		$file_path = $this->get_language_file_path($path, $filename, $locale);
+
+		// Load language array
+		$this->load_language_file($file_path, $lang);
+	}
+
+	/**
+	 * This function implements language fallback logic
+	 *
+	 * @param string	$path		Path to language directory
+	 * @param string	$filename	Filename to load language strings from
+	 *
+	 * @return string	Relative path to language file
+	 *
+	 * @throws language_file_not_found	When the path to the file cannot be resolved
+	 */
+	protected function get_language_file_path($path, $filename, $locales)
+	{
+		$language_file_path = $filename;
+
+		// Language fallback logic
+		foreach ($locales as $locale)
+		{
+			$language_file_path = $path . $locale . '/' . $filename;
+
+			// If we are in install, try to use the updated version, when available
+			if (defined('IN_INSTALL'))
+			{
+				$install_language_path = str_replace('language/', 'install/update/new/language/', $language_file_path);
+				if (file_exists($install_language_path))
+				{
+					return $install_language_path;
+				}
+			}
+
+			if (file_exists($language_file_path))
+			{
+				return $language_file_path;
+			}
+		}
+
+		// The language file is not exist
+		throw new language_file_not_found('Language file ' . $language_file_path . ' couldn\'t be opened.');
+	}
+
+	/**
+	 * Loads language file
+	 *
+	 * @param string	$path	Path to language file to load
+	 * @param array		$lang	Reference of the array of language strings
+	 */
+	protected function load_language_file($path, &$lang)
+	{
+		// Do not suppress error if in DEBUG mode
+		if (defined('DEBUG'))
+		{
+			include $path;
+		}
+		else
+		{
+			@include $path;
+		}
+	}
+}
--- /dev/null
+++ b/phpbb/log/dummy.php
@@ -0,0 +1,81 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\log;
+
+/**
+* Dummy logger
+*/
+class dummy implements log_interface
+{
+	/**
+	* {@inheritdoc}
+	*/
+	public function is_enabled($type = '')
+	{
+		return false;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function disable($type = '')
+	{
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function enable($type = '')
+	{
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function add($mode, $user_id, $log_ip, $log_operation, $log_time = false, $additional_data = array())
+	{
+		return false;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function delete($mode, $conditions = array())
+	{
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_logs($mode, $count_logs = true, $limit = 0, $offset = 0, $forum_id = 0, $topic_id = 0, $user_id = 0, $log_time = 0, $sort_by = 'l.log_time DESC', $keywords = '')
+	{
+		return array();
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_log_count()
+	{
+		return 0;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_valid_offset()
+	{
+		return 0;
+	}
+}
--- a/phpbb/log/log.php
+++ b/phpbb/log/log.php
@@ -27,7 +27,7 @@ class log implements \phpbb\log\log_interface
 
 	/**
 	* An array with the disabled log types. Logs of such types will not be
-	* added when add_log() is called.
+	* added when add() is called.
 	* @var array
 	*/
 	protected $disabled_types;
@@ -223,7 +223,7 @@ class log implements \phpbb\log\log_interface
 			return false;
 		}
 
-		if ($log_time == false)
+		if ($log_time === false)
 		{
 			$log_time = time();
 		}
@@ -249,10 +249,13 @@ class log implements \phpbb\log\log_interface
 				unset($additional_data['forum_id']);
 				$topic_id = isset($additional_data['topic_id']) ? (int) $additional_data['topic_id'] : 0;
 				unset($additional_data['topic_id']);
+				$post_id = isset($additional_data['post_id']) ? (int) $additional_data['post_id'] : 0;
+				unset($additional_data['post_id']);
 				$sql_ary += array(
 					'log_type'		=> LOG_MOD,
 					'forum_id'		=> $forum_id,
 					'topic_id'		=> $topic_id,
+					'post_id'		=> $post_id,
 					'log_data'		=> (!empty($additional_data)) ? serialize($additional_data) : '',
 				);
 			break;
@@ -643,6 +646,7 @@ class log implements \phpbb\log\log_interface
 				'time'				=> (int) $row['log_time'],
 				'forum_id'			=> (int) $row['forum_id'],
 				'topic_id'			=> (int) $row['topic_id'],
+				'post_id'			=> (int) $row['post_id'],
 
 				'viewforum'			=> ($row['forum_id'] && $this->auth->acl_get('f_read', $row['forum_id'])) ? append_sid("{$this->phpbb_root_path}viewforum.{$this->php_ext}", 'f=' . $row['forum_id']) : false,
 				'action'			=> (isset($this->user->lang[$row['log_operation']])) ? $row['log_operation'] : '{' . ucfirst(str_replace('_', ' ', $row['log_operation'])) . '}',
@@ -743,6 +747,7 @@ class log implements \phpbb\log\log_interface
 			foreach ($log as $key => $row)
 			{
 				$log[$key]['viewtopic'] = (isset($topic_auth['f_read'][$row['topic_id']])) ? append_sid("{$this->phpbb_root_path}viewtopic.{$this->php_ext}", 'f=' . $topic_auth['f_read'][$row['topic_id']] . '&amp;t=' . $row['topic_id']) : false;
+				$log[$key]['viewpost'] = (isset($topic_auth['f_read'][$row['topic_id']]) && $row['post_id']) ? append_sid("{$this->phpbb_root_path}viewtopic.{$this->php_ext}", 'f=' . $topic_auth['f_read'][$row['topic_id']] . '&amp;t=' . $row['topic_id'] . '&amp;p=' . $row['post_id']) : false;
 				$log[$key]['viewlogs'] = (isset($topic_auth['m_'][$row['topic_id']])) ? append_sid("{$this->phpbb_root_path}mcp.{$this->php_ext}", 'i=logs&amp;mode=topic_logs&amp;t=' . $row['topic_id'], true, $this->user->session_id) : false;
 			}
 		}
@@ -893,9 +898,29 @@ class log implements \phpbb\log\log_interface
 		$forum_auth = array('f_read' => array(), 'm_' => array());
 		$topic_ids = array_unique($topic_ids);
 
-		$sql = 'SELECT topic_id, forum_id
-			FROM ' . TOPICS_TABLE . '
-			WHERE ' . $this->db->sql_in_set('topic_id', array_map('intval', $topic_ids));
+		$sql_ary = array(
+			'SELECT'	=> 'topic_id, forum_id',
+			'FROM'		=> array(
+				TOPICS_TABLE	=> 't',
+			),
+			'WHERE'		=> $this->db->sql_in_set('topic_id', array_map('intval', $topic_ids)),
+		);
+
+		/**
+		* Allow modifying SQL query before topic data is retrieved.
+		*
+		* @event core.phpbb_log_get_topic_auth_sql_before
+		* @var	array	topic_ids	Array with unique topic IDs
+		* @var	array	sql_ary		SQL array
+		* @since 3.1.11-RC1
+		*/
+		$vars = array(
+			'topic_ids',
+			'sql_ary',
+		);
+		extract($this->dispatcher->trigger_event('core.phpbb_log_get_topic_auth_sql_before', compact($vars)));
+
+		$sql = $this->db->sql_build_query('SELECT', $sql_ary);
 		$result = $this->db->sql_query($sql);
 
 		while ($row = $this->db->sql_fetchrow($result))
--- a/phpbb/log/log_interface.php
+++ b/phpbb/log/log_interface.php
@@ -32,8 +32,8 @@ interface log_interface
 	* Disable log
 	*
 	* This function allows disabling the log system or parts of it, for this
-	* page call. When add_log is called and the type is disabled,
-	* the log will not be added to the database.
+	* page call. When add() is called and the type is disabled, the log will
+	* not be added to the database.
 	*
 	* @param	mixed	$type	The log type we want to disable. Empty to
 	*						disable all logs. Can also be an array of types.
@@ -57,12 +57,12 @@ interface log_interface
 	/**
 	* Adds a log entry to the database
 	*
-	* @param	string	$mode				The mode defines which log_type is used and from which log the entry is retrieved
-	* @param	int		$user_id			User ID of the user
-	* @param	string	$log_ip				IP address of the user
-	* @param	string	$log_operation		Name of the operation
-	* @param	int		$log_time			Timestamp when the log entry was added, if empty time() will be used
-	* @param	array	$additional_data	More arguments can be added, depending on the log_type
+	* @param	string		$mode				The mode defines which log_type is used and from which log the entry is retrieved
+	* @param	int			$user_id			User ID of the user
+	* @param	string		$log_ip				IP address of the user
+	* @param	string		$log_operation		Name of the operation
+	* @param	int|bool	$log_time			Timestamp when the log entry was added. If false, time() will be used
+	* @param	array		$additional_data	More arguments can be added, depending on the log_type
 	*
 	* @return	int|bool		Returns the log_id, if the entry was added to the database, false otherwise.
 	*/
--- a/phpbb/message/topic_form.php
+++ b/phpbb/message/topic_form.php
@@ -71,6 +71,14 @@ class topic_form extends form
 
 		if (!$this->auth->acl_get('f_read', $this->topic_row['forum_id']))
 		{
+			if ($this->user->data['user_id'] != ANONYMOUS)
+			{
+				send_status_line(403, 'Forbidden');
+			}
+			else
+			{
+				send_status_line(401, 'Unauthorized');
+			}
 			return 'SORRY_AUTH_READ';
 		}
 
--- /dev/null
+++ b/phpbb/module/exception/module_exception.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\module\exception;
+
+class module_exception extends \phpbb\exception\runtime_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/module/exception/module_not_found_exception.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\module\exception;
+
+class module_not_found_exception extends module_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/module/module_manager.php
@@ -0,0 +1,564 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\module;
+
+use phpbb\module\exception\module_exception;
+use phpbb\module\exception\module_not_found_exception;
+
+class module_manager
+{
+	/**
+	 * @var \phpbb\cache\driver\driver_interface
+	 */
+	protected $cache;
+
+	/**
+	 * @var \phpbb\db\driver\driver_interface
+	 */
+	protected $db;
+
+	/**
+	 * @var \phpbb\extension\manager
+	 */
+	protected $extension_manager;
+
+	/**
+	 * @var string
+	 */
+	protected $modules_table;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\cache\driver\driver_interface	$cache				Cache driver
+	 * @param \phpbb\db\driver\driver_interface		$db					Database driver
+	 * @param \phpbb\extension\manager				$ext_manager		Extension manager
+	 * @param string								$modules_table		Module database table's name
+	 * @param string								$phpbb_root_path	Path to phpBB's root
+	 * @param string								$php_ext			Extension of PHP files
+	 */
+	public function __construct(\phpbb\cache\driver\driver_interface $cache, \phpbb\db\driver\driver_interface $db, \phpbb\extension\manager $ext_manager, $modules_table, $phpbb_root_path, $php_ext)
+	{
+		$this->cache				= $cache;
+		$this->db					= $db;
+		$this->extension_manager	= $ext_manager;
+		$this->modules_table		= $modules_table;
+		$this->phpbb_root_path		= $phpbb_root_path;
+		$this->php_ext				= $php_ext;
+	}
+
+	/**
+	 * Get row for specified module
+	 *
+	 * @param int		$module_id		ID of the module
+	 * @param string	$module_class	Class of the module (acp, ucp, mcp etc...)
+	 *
+	 * @return array	Array of data fetched from the database
+	 *
+	 * @throws \phpbb\module\exception\module_not_found_exception	When there is no module with $module_id
+	 */
+	public function get_module_row($module_id, $module_class)
+	{
+		$module_id = (int) $module_id;
+
+		$sql = 'SELECT *
+			FROM ' . $this->modules_table . "
+			WHERE module_class = '" . $this->db->sql_escape($module_class) . "'
+				AND module_id = $module_id";
+		$result = $this->db->sql_query($sql);
+		$row = $this->db->sql_fetchrow($result);
+		$this->db->sql_freeresult($result);
+
+		if (!$row)
+		{
+			throw new module_not_found_exception('NO_MODULE');
+		}
+
+		return $row;
+	}
+
+	/**
+	 * Get available module information from module files
+	 *
+	 * @param string	$module_class		Class of the module (acp, ucp, mcp etc...)
+	 * @param string	$module				ID of module
+	 * @param bool		$use_all_available	Use all available instead of just all
+	 *										enabled extensions
+	 *
+	 * @return array	Array with module information gathered from module info files.
+	 */
+	public function get_module_infos($module_class, $module = '', $use_all_available = false)
+	{
+		$directory = $this->phpbb_root_path . 'includes/' . $module_class . '/info/';
+		$fileinfo = array();
+
+		$finder = $this->extension_manager->get_finder($use_all_available);
+
+		$modules = $finder
+			->extension_suffix('_module')
+			->extension_directory("/$module_class")
+			->core_path("includes/$module_class/info/")
+			->core_prefix($module_class . '_')
+			->get_classes(true);
+
+		foreach ($modules as $cur_module)
+		{
+			// Skip entries we do not need if we know the module we are
+			// looking for
+			if ($module && strpos(str_replace('\\', '_', $cur_module), $module) === false && $module !== $cur_module)
+			{
+				continue;
+			}
+
+			$info_class = preg_replace('/_module$/', '_info', $cur_module);
+
+			// If the class does not exist it might be following the old
+			// format. phpbb_acp_info_acp_foo needs to be turned into
+			// acp_foo_info and the respective file has to be included
+			// manually because it does not support auto loading
+			$old_info_class_file = str_replace("phpbb_{$module_class}_info_", '', $cur_module);
+			$old_info_class = $old_info_class_file . '_info';
+
+			if (class_exists($old_info_class))
+			{
+				$info_class = $old_info_class;
+			}
+			else if (!class_exists($info_class))
+			{
+				$info_class = $old_info_class;
+
+				// need to check class exists again because previous checks triggered autoloading
+				if (!class_exists($info_class) && file_exists($directory . $old_info_class_file . '.' . $this->php_ext))
+				{
+					include($directory . $old_info_class_file . '.' . $this->php_ext);
+				}
+			}
+
+			if (class_exists($info_class))
+			{
+				$info = new $info_class();
+				$module_info = $info->module();
+
+				$main_class = (isset($module_info['filename'])) ? $module_info['filename'] : $cur_module;
+
+				$fileinfo[$main_class] = $module_info;
+			}
+		}
+
+		ksort($fileinfo);
+
+		return $fileinfo;
+	}
+
+	/**
+	 * Get module branch
+	 *
+	 * @param int		$module_id		ID of the module
+	 * @param string	$module_class	Class of the module (acp, ucp, mcp etc...)
+	 * @param string	$type			Type of branch (Expected values: all, parents or children)
+	 * @param bool		$include_module	Whether or not to include the specified module with $module_id
+	 *
+	 * @return array	Returns an array containing the modules in the specified branch type.
+	 */
+	public function get_module_branch($module_id, $module_class, $type = 'all', $include_module = true)
+	{
+		$module_id = (int) $module_id;
+
+		switch ($type)
+		{
+			case 'parents':
+				$condition = 'm1.left_id BETWEEN m2.left_id AND m2.right_id';
+			break;
+
+			case 'children':
+				$condition = 'm2.left_id BETWEEN m1.left_id AND m1.right_id';
+			break;
+
+			default:
+				$condition = 'm2.left_id BETWEEN m1.left_id AND m1.right_id OR m1.left_id BETWEEN m2.left_id AND m2.right_id';
+			break;
+		}
+
+		$rows = array();
+
+		$sql = 'SELECT m2.*
+			FROM ' . $this->modules_table . ' m1
+			LEFT JOIN ' . $this->modules_table . " m2 ON ($condition)
+			WHERE m1.module_class = '" . $this->db->sql_escape($module_class) . "'
+				AND m2.module_class = '" . $this->db->sql_escape($module_class) . "'
+				AND m1.module_id = $module_id
+			ORDER BY m2.left_id DESC";
+		$result = $this->db->sql_query($sql);
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			if (!$include_module && $row['module_id'] == $module_id)
+			{
+				continue;
+			}
+
+			$rows[] = $row;
+		}
+		$this->db->sql_freeresult($result);
+
+		return $rows;
+	}
+
+	/**
+	 * Remove modules cache file
+	 *
+	 * @param string	$module_class	Class of the module (acp, ucp, mcp etc...)
+	 */
+	public function remove_cache_file($module_class)
+	{
+		// Sanitise for future path use, it's escaped as appropriate for queries
+		$cache_class = str_replace(array('.', '/', '\\'), '', basename($module_class));
+		$this->cache->destroy('_modules_' . $cache_class);
+		$this->cache->destroy('sql', $this->modules_table);
+	}
+
+	/**
+	 * Update/Add module
+	 *
+	 * @param array	&$module_data	The module data
+	 *
+	 * @throws \phpbb\module\exception\module_not_found_exception	When parent module or the category is not exist
+	 */
+	public function update_module_data(&$module_data)
+	{
+		if (!isset($module_data['module_id']))
+		{
+			// no module_id means we're creating a new category/module
+			if ($module_data['parent_id'])
+			{
+				$sql = 'SELECT left_id, right_id
+					FROM ' . $this->modules_table . "
+					WHERE module_class = '" . $this->db->sql_escape($module_data['module_class']) . "'
+						AND module_id = " . (int) $module_data['parent_id'];
+				$result = $this->db->sql_query($sql);
+				$row = $this->db->sql_fetchrow($result);
+				$this->db->sql_freeresult($result);
+
+				if (!$row)
+				{
+					throw new module_not_found_exception('PARENT_NOT_EXIST');
+				}
+
+				// Workaround
+				$row['left_id'] = (int) $row['left_id'];
+				$row['right_id'] = (int) $row['right_id'];
+
+				$sql = 'UPDATE ' . $this->modules_table . "
+					SET left_id = left_id + 2, right_id = right_id + 2
+					WHERE module_class = '" . $this->db->sql_escape($module_data['module_class']) . "'
+						AND left_id > {$row['right_id']}";
+				$this->db->sql_query($sql);
+
+				$sql = 'UPDATE ' . $this->modules_table . "
+					SET right_id = right_id + 2
+					WHERE module_class = '" . $this->db->sql_escape($module_data['module_class']) . "'
+						AND {$row['left_id']} BETWEEN left_id AND right_id";
+				$this->db->sql_query($sql);
+
+				$module_data['left_id'] = (int) $row['right_id'];
+				$module_data['right_id'] = (int) $row['right_id'] + 1;
+			}
+			else
+			{
+				$sql = 'SELECT MAX(right_id) AS right_id
+					FROM ' . $this->modules_table . "
+					WHERE module_class = '" . $this->db->sql_escape($module_data['module_class']) . "'";
+				$result = $this->db->sql_query($sql);
+				$row = $this->db->sql_fetchrow($result);
+				$this->db->sql_freeresult($result);
+
+				$module_data['left_id'] = (int) $row['right_id'] + 1;
+				$module_data['right_id'] = (int) $row['right_id'] + 2;
+			}
+
+			$sql = 'INSERT INTO ' . $this->modules_table . ' ' . $this->db->sql_build_array('INSERT', $module_data);
+			$this->db->sql_query($sql);
+
+			$module_data['module_id'] = $this->db->sql_nextid();
+		}
+		else
+		{
+			$row = $this->get_module_row($module_data['module_id'], $module_data['module_class']);
+
+			if ($module_data['module_basename'] && !$row['module_basename'])
+			{
+				// we're turning a category into a module
+				$branch = $this->get_module_branch($module_data['module_id'], $module_data['module_class'], 'children', false);
+
+				if (sizeof($branch))
+				{
+					throw new module_not_found_exception('NO_CATEGORY_TO_MODULE');
+				}
+			}
+
+			if ($row['parent_id'] != $module_data['parent_id'])
+			{
+				$this->move_module($module_data['module_id'], $module_data['parent_id'], $module_data['module_class']);
+			}
+
+			$update_ary = $module_data;
+			unset($update_ary['module_id']);
+
+			$sql = 'UPDATE ' . $this->modules_table . '
+				SET ' . $this->db->sql_build_array('UPDATE', $update_ary) . "
+				WHERE module_class = '" . $this->db->sql_escape($module_data['module_class']) . "'
+					AND module_id = " . (int) $module_data['module_id'];
+			$this->db->sql_query($sql);
+		}
+	}
+
+	/**
+	 * Move module around the tree
+	 *
+	 * @param int		$from_module_id	ID of the current parent module
+	 * @param int		$to_parent_id	ID of the target parent module
+	 * @param string	$module_class	Class of the module (acp, ucp, mcp etc...)
+	 *
+	 * @throws \phpbb\module\exception\module_not_found_exception	If the module specified to move modules from does not
+	 * 																have any children.
+	 */
+	public function move_module($from_module_id, $to_parent_id, $module_class)
+	{
+		$moved_modules = $this->get_module_branch($from_module_id, $module_class, 'children');
+
+		if (empty($moved_modules))
+		{
+			throw new module_not_found_exception();
+		}
+
+		$from_data = $moved_modules[0];
+		$diff = sizeof($moved_modules) * 2;
+
+		$moved_ids = array();
+		for ($i = 0, $size = sizeof($moved_modules); $i < $size; ++$i)
+		{
+			$moved_ids[] = $moved_modules[$i]['module_id'];
+		}
+
+		// Resync parents
+		$sql = 'UPDATE ' . $this->modules_table . "
+			SET right_id = right_id - $diff
+			WHERE module_class = '" . $this->db->sql_escape($module_class) . "'
+				AND left_id < " . (int) $from_data['right_id'] . '
+				AND right_id > ' . (int) $from_data['right_id'];
+		$this->db->sql_query($sql);
+
+		// Resync righthand side of tree
+		$sql = 'UPDATE ' . $this->modules_table . "
+			SET left_id = left_id - $diff, right_id = right_id - $diff
+			WHERE module_class = '" . $this->db->sql_escape($module_class) . "'
+				AND left_id > " . (int) $from_data['right_id'];
+		$this->db->sql_query($sql);
+
+		if ($to_parent_id > 0)
+		{
+			$to_data = $this->get_module_row($to_parent_id, $module_class);
+
+			// Resync new parents
+			$sql = 'UPDATE ' . $this->modules_table . "
+				SET right_id = right_id + $diff
+				WHERE module_class = '" . $this->db->sql_escape($module_class) . "'
+					AND " . (int) $to_data['right_id'] . ' BETWEEN left_id AND right_id
+					AND ' . $this->db->sql_in_set('module_id', $moved_ids, true);
+			$this->db->sql_query($sql);
+
+			// Resync the righthand side of the tree
+			$sql = 'UPDATE ' . $this->modules_table . "
+				SET left_id = left_id + $diff, right_id = right_id + $diff
+				WHERE module_class = '" . $this->db->sql_escape($module_class) . "'
+					AND left_id > " . (int) $to_data['right_id'] . '
+					AND ' . $this->db->sql_in_set('module_id', $moved_ids, true);
+			$this->db->sql_query($sql);
+
+			// Resync moved branch
+			$to_data['right_id'] += $diff;
+			if ($to_data['right_id'] > $from_data['right_id'])
+			{
+				$diff = '+ ' . ($to_data['right_id'] - $from_data['right_id'] - 1);
+			}
+			else
+			{
+				$diff = '- ' . abs($to_data['right_id'] - $from_data['right_id'] - 1);
+			}
+		}
+		else
+		{
+			$sql = 'SELECT MAX(right_id) AS right_id
+				FROM ' . $this->modules_table . "
+				WHERE module_class = '" . $this->db->sql_escape($module_class) . "'
+					AND " . $this->db->sql_in_set('module_id', $moved_ids, true);
+			$result = $this->db->sql_query($sql);
+			$row = $this->db->sql_fetchrow($result);
+			$this->db->sql_freeresult($result);
+
+			$diff = '+ ' . (int) ($row['right_id'] - $from_data['left_id'] + 1);
+		}
+
+		$sql = 'UPDATE ' . $this->modules_table . "
+			SET left_id = left_id $diff, right_id = right_id $diff
+			WHERE module_class = '" . $this->db->sql_escape($module_class) . "'
+				AND " . $this->db->sql_in_set('module_id', $moved_ids);
+		$this->db->sql_query($sql);
+	}
+
+	/**
+	 * Remove module from tree
+	 *
+	 * @param int		$module_id		ID of the module to delete
+	 * @param string	$module_class	Class of the module (acp, ucp, mcp etc...)
+	 *
+	 * @throws \phpbb\module\exception\module_exception	When the specified module cannot be removed
+	 */
+	public function delete_module($module_id, $module_class)
+	{
+		$module_id = (int) $module_id;
+
+		$row = $this->get_module_row($module_id, $module_class);
+
+		$branch = $this->get_module_branch($module_id, $module_class, 'children', false);
+
+		if (sizeof($branch))
+		{
+			throw new module_exception('CANNOT_REMOVE_MODULE');
+		}
+
+		// If not move
+		$diff = 2;
+		$sql = 'DELETE FROM ' . $this->modules_table . "
+			WHERE module_class = '" . $this->db->sql_escape($module_class) . "'
+				AND module_id = $module_id";
+		$this->db->sql_query($sql);
+
+		$row['right_id'] = (int) $row['right_id'];
+		$row['left_id'] = (int) $row['left_id'];
+
+		// Resync tree
+		$sql = 'UPDATE ' . $this->modules_table . "
+			SET right_id = right_id - $diff
+			WHERE module_class = '" . $this->db->sql_escape($module_class) . "'
+				AND left_id < {$row['right_id']} AND right_id > {$row['right_id']}";
+		$this->db->sql_query($sql);
+
+		$sql = 'UPDATE ' . $this->modules_table . "
+			SET left_id = left_id - $diff, right_id = right_id - $diff
+			WHERE module_class = '" . $this->db->sql_escape($module_class) . "'
+				AND left_id > {$row['right_id']}";
+		$this->db->sql_query($sql);
+	}
+
+	/**
+	 * Move module position by $steps up/down
+	 *
+	 * @param array		$module_row		Array of module data
+	 * @param string	$module_class	Class of the module (acp, ucp, mcp etc...)
+	 * @param string	$action			Direction of moving (valid values: move_up or move_down)
+	 * @param int		$steps			Number of steps to move module
+	 *
+	 * @return string	Returns the language name of the module
+	 *
+	 * @throws \phpbb\module\exception\module_not_found_exception	When the specified module does not exists
+	 */
+	public function move_module_by($module_row, $module_class, $action = 'move_up', $steps = 1)
+	{
+		/**
+		 * Fetch all the siblings between the module's current spot
+		 * and where we want to move it to. If there are less than $steps
+		 * siblings between the current spot and the target then the
+		 * module will move as far as possible
+		 */
+		$sql = 'SELECT module_id, left_id, right_id, module_langname
+			FROM ' . $this->modules_table . "
+			WHERE module_class = '" . $this->db->sql_escape($module_class) . "'
+				AND parent_id = " . (int) $module_row['parent_id'] . '
+				AND ' . (($action == 'move_up') ? 'right_id < ' . (int) $module_row['right_id'] . ' ORDER BY right_id DESC' : 'left_id > ' . (int) $module_row['left_id'] . ' ORDER BY left_id ASC');
+		$result = $this->db->sql_query_limit($sql, $steps);
+
+		$target = array();
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$target = $row;
+		}
+		$this->db->sql_freeresult($result);
+
+		if (!sizeof($target))
+		{
+			// The module is already on top or bottom
+			throw new module_not_found_exception();
+		}
+
+		/**
+		 * $left_id and $right_id define the scope of the nodes that are affected by the move.
+		 * $diff_up and $diff_down are the values to substract or add to each node's left_id
+		 * and right_id in order to move them up or down.
+		 * $move_up_left and $move_up_right define the scope of the nodes that are moving
+		 * up. Other nodes in the scope of ($left_id, $right_id) are considered to move down.
+		 */
+		if ($action == 'move_up')
+		{
+			$left_id = (int) $target['left_id'];
+			$right_id = (int) $module_row['right_id'];
+
+			$diff_up = (int) ($module_row['left_id'] - $target['left_id']);
+			$diff_down = (int) ($module_row['right_id'] + 1 - $module_row['left_id']);
+
+			$move_up_left = (int) $module_row['left_id'];
+			$move_up_right = (int) $module_row['right_id'];
+		}
+		else
+		{
+			$left_id = (int) $module_row['left_id'];
+			$right_id = (int) $target['right_id'];
+
+			$diff_up = (int) ($module_row['right_id'] + 1 - $module_row['left_id']);
+			$diff_down = (int) ($target['right_id'] - $module_row['right_id']);
+
+			$move_up_left = (int) ($module_row['right_id'] + 1);
+			$move_up_right = (int) $target['right_id'];
+		}
+
+		// Now do the dirty job
+		$sql = 'UPDATE ' . $this->modules_table . "
+			SET left_id = left_id + CASE
+				WHEN left_id BETWEEN {$move_up_left} AND {$move_up_right} THEN -{$diff_up}
+				ELSE {$diff_down}
+			END,
+			right_id = right_id + CASE
+				WHEN right_id BETWEEN {$move_up_left} AND {$move_up_right} THEN -{$diff_up}
+				ELSE {$diff_down}
+			END
+			WHERE module_class = '" . $this->db->sql_escape($module_class) . "'
+				AND left_id BETWEEN {$left_id} AND {$right_id}
+				AND right_id BETWEEN {$left_id} AND {$right_id}";
+		$this->db->sql_query($sql);
+
+		$this->remove_cache_file($module_class);
+
+		return $target['module_langname'];
+	}
+}
--- a/phpbb/notification/exception.php
+++ b/phpbb/notification/exception.php
@@ -17,10 +17,6 @@ namespace phpbb\notification;
 * Notifications exception
 */
 
-class exception extends \Exception
+class exception extends \phpbb\exception\runtime_exception
 {
-	public function __toString()
-	{
-		return $this->getMessage();
-	}
 }
--- a/phpbb/notification/manager.php
+++ b/phpbb/notification/manager.php
@@ -26,7 +26,7 @@ class manager
 	/** @var array */
 	protected $subscription_types;
 
-	/** @var array */
+	/** @var method\method_interface[] */
 	protected $notification_methods;
 
 	/** @var ContainerInterface */
@@ -35,9 +35,6 @@ class manager
 	/** @var \phpbb\user_loader */
 	protected $user_loader;
 
-	/** @var \phpbb\config\config */
-	protected $config;
-
 	/** @var \phpbb\event\dispatcher_interface */
 	protected $phpbb_dispatcher;
 
@@ -47,21 +44,15 @@ class manager
 	/** @var \phpbb\cache\service */
 	protected $cache;
 
+	/** @var \phpbb\language\language */
+	protected $language;
+
 	/** @var \phpbb\user */
 	protected $user;
 
-	/** @var string */
-	protected $phpbb_root_path;
-
-	/** @var string */
-	protected $php_ext;
-
 	/** @var string */
 	protected $notification_types_table;
 
-	/** @var string */
-	protected $notifications_table;
-
 	/** @var string */
 	protected $user_notifications_table;
 
@@ -72,43 +63,37 @@ class manager
 	* @param array $notification_methods
 	* @param ContainerInterface $phpbb_container
 	* @param \phpbb\user_loader $user_loader
-	* @param \phpbb\config\config $config
 	* @param \phpbb\event\dispatcher_interface $phpbb_dispatcher
 	* @param \phpbb\db\driver\driver_interface $db
 	* @param \phpbb\cache\service $cache
+	* @param \phpbb\language\language $language
 	* @param \phpbb\user $user
-	* @param string $phpbb_root_path
-	* @param string $php_ext
 	* @param string $notification_types_table
-	* @param string $notifications_table
 	* @param string $user_notifications_table
 	*
 	* @return \phpbb\notification\manager
 	*/
-	public function __construct($notification_types, $notification_methods, ContainerInterface $phpbb_container, \phpbb\user_loader $user_loader, \phpbb\config\config $config, \phpbb\event\dispatcher_interface $phpbb_dispatcher, \phpbb\db\driver\driver_interface $db, \phpbb\cache\service $cache, $user, $phpbb_root_path, $php_ext, $notification_types_table, $notifications_table, $user_notifications_table)
+	public function __construct($notification_types, $notification_methods, ContainerInterface $phpbb_container, \phpbb\user_loader $user_loader, \phpbb\event\dispatcher_interface $phpbb_dispatcher, \phpbb\db\driver\driver_interface $db, \phpbb\cache\service $cache, \phpbb\language\language $language, \phpbb\user $user, $notification_types_table, $user_notifications_table)
 	{
 		$this->notification_types = $notification_types;
 		$this->notification_methods = $notification_methods;
 		$this->phpbb_container = $phpbb_container;
 
 		$this->user_loader = $user_loader;
-		$this->config = $config;
 		$this->phpbb_dispatcher = $phpbb_dispatcher;
 		$this->db = $db;
 		$this->cache = $cache;
+		$this->language = $language;
 		$this->user = $user;
 
-		$this->phpbb_root_path = $phpbb_root_path;
-		$this->php_ext = $php_ext;
-
 		$this->notification_types_table = $notification_types_table;
-		$this->notifications_table = $notifications_table;
 		$this->user_notifications_table = $user_notifications_table;
 	}
 
 	/**
-	* Load the user's notifications
+	* Load the user's notifications for a given method
 	*
+	* @param string $method_name
 	* @param array $options Optional options to control what notifications are loaded
 	*				notification_id		Notification id to load (or array of notification ids)
 	*				user_id				User id to load notifications for (Default: $user->data['user_id'])
@@ -123,27 +108,21 @@ class manager
 	*	'notifications'		array of notification type objects
 	*	'unread_count'		number of unread notifications the user has if count_unread is true in the options
 	*	'total_count'		number of notifications the user has if count_total is true in the options
+	* @throws \phpbb\notification\exception when the method doesn't refer to a class extending \phpbb\notification\method\method_interface
 	*/
-	public function load_notifications(array $options = array())
+	public function load_notifications($method_name, array $options = array())
 	{
-		// Merge default options
-		$options = array_merge(array(
-			'notification_id'	=> false,
-			'user_id'			=> $this->user->data['user_id'],
-			'order_by'			=> 'notification_time',
-			'order_dir'			=> 'DESC',
-			'limit'				=> 0,
-			'start'				=> 0,
-			'all_unread'		=> false,
-			'count_unread'		=> false,
-			'count_total'		=> false,
-		), $options);
-
-		// If all_unread, count_unread must be true
-		$options['count_unread'] = ($options['all_unread']) ? true : $options['count_unread'];
+		$method = $this->get_method_class($method_name);
 
-		// Anonymous users and bots never receive notifications
-		if ($options['user_id'] == $this->user->data['user_id'] && ($this->user->data['user_id'] == ANONYMOUS || $this->user->data['user_type'] == USER_IGNORE))
+		if (! $method instanceof \phpbb\notification\method\method_interface)
+		{
+			throw new \phpbb\notification\exception($this->language->lang('NOTIFICATION_METHOD_INVALID', $method_name));
+		}
+		else if ($method->is_available())
+		{
+			return $method->load_notifications($options);
+		}
+		else
 		{
 			return array(
 				'notifications'		=> array(),
@@ -151,172 +130,112 @@ class manager
 				'total_count'		=> 0,
 			);
 		}
+	}
 
-		$notifications = $user_ids = array();
-		$load_special = array();
-		$total_count = $unread_count = 0;
+	/**
+	 * Mark notifications read or unread for all available methods
+	 *
+	 * @param bool|string|array $notification_type_name Type identifier or array of item types (only acceptable if the $data is identical for the specified types). False to mark read for all item types
+	 * @param bool|int|array $item_id Item id or array of item ids. False to mark read for all item ids
+	 * @param bool|int|array $user_id User id or array of user ids. False to mark read for all user ids
+	 * @param bool|int $time Time at which to mark all notifications prior to as read. False to mark all as read. (Default: False)
+	 *
+	 * @deprecated since 3.2
+	 */
+	public function mark_notifications_read($notification_type_name, $item_id, $user_id, $time = false)
+	{
+		$this->mark_notifications($notification_type_name, $item_id, $user_id, $time);
+	}
 
-		if ($options['count_unread'])
+	/**
+	* Mark notifications read or unread for all available methods
+	*
+	* @param bool|string|array $notification_type_name Type identifier or array of item types (only acceptable if the $data is identical for the specified types). False to mark read for all item types
+	* @param bool|int|array $item_id Item id or array of item ids. False to mark read for all item ids
+	* @param bool|int|array $user_id User id or array of user ids. False to mark read for all user ids
+	* @param bool|int $time Time at which to mark all notifications prior to as read. False to mark all as read. (Default: False)
+	* @param bool $mark_read Define if the notification as to be set to True or False. (Default: True)
+	*/
+	public function mark_notifications($notification_type_name, $item_id, $user_id, $time = false, $mark_read = true)
+	{
+		if (is_array($notification_type_name))
 		{
-			// Get the total number of unread notifications
-			$sql = 'SELECT COUNT(n.notification_id) AS unread_count
-				FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
-				WHERE n.user_id = ' . (int) $options['user_id'] . '
-					AND n.notification_read = 0
-					AND nt.notification_type_id = n.notification_type_id
-					AND nt.notification_type_enabled = 1';
-			$result = $this->db->sql_query($sql);
-			$unread_count = (int) $this->db->sql_fetchfield('unread_count');
-			$this->db->sql_freeresult($result);
+			$notification_type_id = $this->get_notification_type_ids($notification_type_name);
 		}
-
-		if ($options['count_total'])
+		else if ($notification_type_name !== false)
 		{
-			// Get the total number of notifications
-			$sql = 'SELECT COUNT(n.notification_id) AS total_count
-				FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
-				WHERE n.user_id = ' . (int) $options['user_id'] . '
-					AND nt.notification_type_id = n.notification_type_id
-					AND nt.notification_type_enabled = 1';
-			$result = $this->db->sql_query($sql);
-			$total_count = (int) $this->db->sql_fetchfield('total_count');
-			$this->db->sql_freeresult($result);
+			$notification_type_id = $this->get_notification_type_id($notification_type_name);
 		}
-
-		if (!$options['count_total'] || $total_count)
+		else
 		{
-			$rowset = array();
-			$selected_unread_count = 0;
-
-			// Get the main notifications
-			$sql = 'SELECT n.*, nt.notification_type_name
-				FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
-				WHERE n.user_id = ' . (int) $options['user_id'] .
-					(($options['notification_id']) ? ' AND ' . $this->db->sql_in_set('n.notification_id', $options['notification_id']) : '') . '
-					AND nt.notification_type_id = n.notification_type_id
-					AND nt.notification_type_enabled = 1
-				ORDER BY n.' . $this->db->sql_escape($options['order_by']) . ' ' . $this->db->sql_escape($options['order_dir']);
-			$result = $this->db->sql_query_limit($sql, $options['limit'], $options['start']);
-
-			while ($row = $this->db->sql_fetchrow($result))
-			{
-				$rowset[$row['notification_id']] = $row;
-				$selected_unread_count += (int) !$row['notification_read'];
-			}
-			$this->db->sql_freeresult($result);
-
-			// Get all unread notifications
-			if ($selected_unread_count < $unread_count && $options['all_unread'] && !empty($rowset))
-			{
-				$sql = 'SELECT n.*, nt.notification_type_name
-				FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
-					WHERE n.user_id = ' . (int) $options['user_id'] . '
-						AND n.notification_read = 0
-						AND ' . $this->db->sql_in_set('n.notification_id', array_keys($rowset), true) . '
-						AND nt.notification_type_id = n.notification_type_id
-						AND nt.notification_type_enabled = 1
-					ORDER BY n.' . $this->db->sql_escape($options['order_by']) . ' ' . $this->db->sql_escape($options['order_dir']);
-				$result = $this->db->sql_query_limit($sql, $options['limit'], $options['start']);
-
-				while ($row = $this->db->sql_fetchrow($result))
-				{
-					$rowset[$row['notification_id']] = $row;
-				}
-				$this->db->sql_freeresult($result);
-			}
-
-			foreach ($rowset as $row)
-			{
-				$notification = $this->get_item_type_class($row['notification_type_name'], $row);
-
-				// Array of user_ids to query all at once
-				$user_ids = array_merge($user_ids, $notification->users_to_query());
-
-				// Some notification types also require querying additional tables themselves
-				if (!isset($load_special[$row['notification_type_name']]))
-				{
-					$load_special[$row['notification_type_name']] = array();
-				}
-				$load_special[$row['notification_type_name']] = array_merge($load_special[$row['notification_type_name']], $notification->get_load_special());
-
-				$notifications[$row['notification_id']] = $notification;
-			}
-
-			$this->user_loader->load_users($user_ids);
-
-			// Allow each type to load its own special items
-			foreach ($load_special as $item_type => $data)
-			{
-				$item_class = $this->get_item_type_class($item_type);
-
-				$item_class->load_special($data, $notifications);
-			}
+			$notification_type_id = false;
 		}
 
-		return array(
-			'notifications'		=> $notifications,
-			'unread_count'		=> $unread_count,
-			'total_count'		=> $total_count,
-		);
+		/** @var method\method_interface $method */
+		foreach ($this->get_available_subscription_methods() as $method)
+		{
+			$method->mark_notifications($notification_type_id, $item_id, $user_id, $time, $mark_read);
+		}
 	}
 
 	/**
-	* Mark notifications read
-	*
-	* @param bool|string|array $notification_type_name Type identifier or array of item types (only acceptable if the $data is identical for the specified types). False to mark read for all item types
-	* @param bool|int|array $item_id Item id or array of item ids. False to mark read for all item ids
-	* @param bool|int|array $user_id User id or array of user ids. False to mark read for all user ids
-	* @param bool|int $time Time at which to mark all notifications prior to as read. False to mark all as read. (Default: False)
-	*/
-	public function mark_notifications_read($notification_type_name, $item_id, $user_id, $time = false)
+	 * Mark notifications read or unread from a parent identifier for all available methods
+	 *
+	 * @param string|array $notification_type_name Type identifier or array of item types (only acceptable if the $data is identical for the specified types)
+	 * @param bool|int|array $item_parent_id Item parent id or array of item parent ids. False to mark read for all item parent ids
+	 * @param bool|int|array $user_id User id or array of user ids. False to mark read for all user ids
+	 * @param bool|int $time Time at which to mark all notifications prior to as read. False to mark all as read. (Default: False)
+	 *
+	 * @deprecated since 3.2
+	 */
+	public function mark_notifications_read_by_parent($notification_type_name, $item_parent_id, $user_id, $time = false)
 	{
-		$time = ($time !== false) ? $time : time();
-
-		$sql = 'UPDATE ' . $this->notifications_table . "
-			SET notification_read = 1
-			WHERE notification_time <= " . (int) $time .
-				(($notification_type_name !== false) ? ' AND ' . $this->db->sql_in_set('notification_type_id', $this->get_notification_type_ids($notification_type_name)) : '') .
-				(($user_id !== false) ? ' AND ' . $this->db->sql_in_set('user_id', $user_id) : '') .
-				(($item_id !== false) ? ' AND ' . $this->db->sql_in_set('item_id', $item_id) : '');
-		$this->db->sql_query($sql);
+		$this->mark_notifications_by_parent($notification_type_name, $item_parent_id, $user_id, $time);
 	}
 
 	/**
-	* Mark notifications read from a parent identifier
+	* Mark notifications read or unread from a parent identifier for all available methods
 	*
 	* @param string|array $notification_type_name Type identifier or array of item types (only acceptable if the $data is identical for the specified types)
 	* @param bool|int|array $item_parent_id Item parent id or array of item parent ids. False to mark read for all item parent ids
 	* @param bool|int|array $user_id User id or array of user ids. False to mark read for all user ids
 	* @param bool|int $time Time at which to mark all notifications prior to as read. False to mark all as read. (Default: False)
+	* @param bool $mark_read Define if the notification as to be set to True or False. (Default: True)
 	*/
-	public function mark_notifications_read_by_parent($notification_type_name, $item_parent_id, $user_id, $time = false)
+	public function mark_notifications_by_parent($notification_type_name, $item_parent_id, $user_id, $time = false, $mark_read = true)
 	{
-		$time = ($time !== false) ? $time : time();
-
-		$sql = 'UPDATE ' . $this->notifications_table . "
-			SET notification_read = 1
-			WHERE notification_time <= " . (int) $time .
-				(($notification_type_name !== false) ? ' AND ' . $this->db->sql_in_set('notification_type_id', $this->get_notification_type_ids($notification_type_name)) : '') .
-				(($item_parent_id !== false) ? ' AND ' . $this->db->sql_in_set('item_parent_id', $item_parent_id, false, true) : '') .
-				(($user_id !== false) ? ' AND ' . $this->db->sql_in_set('user_id', $user_id) : '');
-		$this->db->sql_query($sql);
+		if (is_array($notification_type_name))
+		{
+			$notification_type_id = $this->get_notification_type_ids($notification_type_name);
+		}
+		else
+		{
+			$notification_type_id = $this->get_notification_type_id($notification_type_name);
+		}
+
+		/** @var method\method_interface $method */
+		foreach ($this->get_available_subscription_methods() as $method)
+		{
+			$method->mark_notifications_by_parent($notification_type_id, $item_parent_id, $user_id, $time, $mark_read);
+		}
 	}
 
 	/**
-	* Mark notifications read
+	* Mark notifications read or unread for a given method
 	*
+	* @param string $method_name
 	* @param int|array $notification_id Notification id or array of notification ids.
 	* @param bool|int $time Time at which to mark all notifications prior to as read. False to mark all as read. (Default: False)
+	* @param bool $mark_read Define if the notification as to be set to True or False. (Default: True)
 	*/
-	public function mark_notifications_read_by_id($notification_id, $time = false)
+	public function mark_notifications_by_id($method_name, $notification_id, $time = false, $mark_read = true)
 	{
-		$time = ($time !== false) ? $time : time();
+		$method = $this->get_method_class($method_name);
 
-		$sql = 'UPDATE ' . $this->notifications_table . "
-			SET notification_read = 1
-			WHERE notification_time <= " . (int) $time . '
-				AND ' . $this->db->sql_in_set('notification_id', $notification_id);
-		$this->db->sql_query($sql);
+		if ($method instanceof \phpbb\notification\method\method_interface && $method->is_available())
+		{
+			$method->mark_notifications_by_id($notification_id, $time, $mark_read);
+		}
 	}
 
 	/**
@@ -350,8 +269,6 @@ class manager
 			return $notified_users;
 		}
 
-		$item_id = $this->get_item_type_class($notification_type_name)->get_item_id($data);
-
 		// find out which users want to receive this type of notification
 		$notify_users = $this->get_item_type_class($notification_type_name)->find_users_for_notification($data, $options);
 
@@ -404,25 +321,23 @@ class manager
 		$item_id = $this->get_item_type_class($notification_type_name)->get_item_id($data);
 
 		$user_ids = array();
-		$notification_objects = $notification_methods = array();
+		$notification_methods = array();
 
 		// Never send notifications to the anonymous user!
 		unset($notify_users[ANONYMOUS]);
 
 		// Make sure not to send new notifications to users who've already been notified about this item
 		// This may happen when an item was added, but now new users are able to see the item
-		$sql = 'SELECT n.user_id
-			FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
-			WHERE n.notification_type_id = ' . (int) $notification_type_id . '
-				AND n.item_id = ' . (int) $item_id . '
-				AND nt.notification_type_id = n.notification_type_id
-				AND nt.notification_type_enabled = 1';
-		$result = $this->db->sql_query($sql);
-		while ($row = $this->db->sql_fetchrow($result))
+		// We remove each user which was already notified by at least one method.
+		/** @var method\method_interface $method */
+		foreach ($this->get_subscription_methods_instances() as $method)
 		{
-			unset($notify_users[$row['user_id']]);
+			$notified_users = $method->get_notified_users($notification_type_id, array('item_id' => $item_id));
+			foreach ($notified_users as $user => $notifications)
+			{
+				unset($notify_users[$user]);
+			}
 		}
-		$this->db->sql_freeresult($result);
 
 		if (!sizeof($notify_users))
 		{
@@ -434,8 +349,6 @@ class manager
 		$pre_create_data = $notification->pre_create_insert_array($data, $notify_users);
 		unset($notification);
 
-		$insert_buffer = new \phpbb\db\sql_insert_buffer($this->db, $this->notifications_table);
-
 		// Go through each user so we can insert a row in the DB and then notify them by their desired means
 		foreach ($notify_users as $user => $methods)
 		{
@@ -443,8 +356,8 @@ class manager
 
 			$notification->user_id = (int) $user;
 
-			// Insert notification row using buffer.
-			$insert_buffer->insert($notification->create_insert_array($data, $pre_create_data));
+			// Generate the insert_array
+			$notification->create_insert_array($data, $pre_create_data);
 
 			// Users are needed to send notifications
 			$user_ids = array_merge($user_ids, $notification->users_to_query());
@@ -452,20 +365,15 @@ class manager
 			foreach ($methods as $method)
 			{
 				// setup the notification methods and add the notification to the queue
-				if ($method) // blank means we just insert it as a notification, but do not notify them by any other means
+				if (!isset($notification_methods[$method]))
 				{
-					if (!isset($notification_methods[$method]))
-					{
-						$notification_methods[$method] = $this->get_method_class($method);
-					}
-
-					$notification_methods[$method]->add_to_queue($notification);
+					$notification_methods[$method] = $this->get_method_class($method);
 				}
+
+				$notification_methods[$method]->add_to_queue($notification);
 			}
 		}
 
-		$insert_buffer->flush();
-
 		// We need to load all of the users to send notifications
 		$this->user_loader->load_users($user_ids);
 
@@ -477,12 +385,13 @@ class manager
 	}
 
 	/**
-	* Update a notification
+	* Update notification
 	*
 	* @param string|array $notification_type_name Type identifier or array of item types (only acceptable if the $data is identical for the specified types)
 	* @param array $data Data specific for this type that will be updated
+	* @param array $options
 	*/
-	public function update_notifications($notification_type_name, $data)
+	public function update_notifications($notification_type_name, array $data, array $options = array())
 	{
 		if (is_array($notification_type_name))
 		{
@@ -494,27 +403,28 @@ class manager
 			return;
 		}
 
-		$notification = $this->get_item_type_class($notification_type_name);
+		$this->update_notification($this->get_item_type_class($notification_type_name), $data, $options);
+	}
 
-		// Allow the notifications class to over-ride the update_notifications functionality
-		if (method_exists($notification, 'update_notifications'))
+	/**
+	* Update a notification
+	*
+	* @param \phpbb\notification\type\type_interface $notification The notification
+	* @param array $data Data specific for this type that will be updated
+	* @param array $options
+	*/
+	public function update_notification(\phpbb\notification\type\type_interface $notification, array $data, array $options = array())
+	{
+		if (empty($options))
 		{
-			// Return False to over-ride the rest of the update
-			if ($notification->update_notifications($data) === false)
-			{
-				return;
-			}
+			$options['item_id'] = $notification->get_item_id($data);
 		}
 
-		$notification_type_id = $this->get_notification_type_id($notification_type_name);
-		$item_id = $notification->get_item_id($data);
-		$update_array = $notification->create_update_array($data);
-
-		$sql = 'UPDATE ' . $this->notifications_table . '
-			SET ' . $this->db->sql_build_array('UPDATE', $update_array) . '
-			WHERE notification_type_id = ' . (int) $notification_type_id . '
-				AND item_id = ' . (int) $item_id;
-		$this->db->sql_query($sql);
+		/** @var method\method_interface $method */
+		foreach ($this->get_available_subscription_methods() as $method)
+		{
+			$method->update_notification($notification, $data, $options);
+		}
 	}
 
 	/**
@@ -523,14 +433,15 @@ class manager
 	* @param string|array $notification_type_name Type identifier or array of item types (only acceptable if the $item_id is identical for the specified types)
 	* @param int|array $item_id Identifier within the type (or array of ids)
 	* @param mixed $parent_id Parent identifier within the type (or array of ids), used in combination with item_id if specified (Default: false; not checked)
+	* @param mixed $user_id User id (Default: false; not checked)
 	*/
-	public function delete_notifications($notification_type_name, $item_id, $parent_id = false)
+	public function delete_notifications($notification_type_name, $item_id, $parent_id = false, $user_id = false)
 	{
 		if (is_array($notification_type_name))
 		{
 			foreach ($notification_type_name as $type)
 			{
-				$this->delete_notifications($type, $item_id, $parent_id);
+				$this->delete_notifications($type, $item_id, $parent_id, $user_id);
 			}
 
 			return;
@@ -538,11 +449,11 @@ class manager
 
 		$notification_type_id = $this->get_notification_type_id($notification_type_name);
 
-		$sql = 'DELETE FROM ' . $this->notifications_table . '
-			WHERE notification_type_id = ' . (int) $notification_type_id . '
-				AND ' . $this->db->sql_in_set('item_id', $item_id) .
-				(($parent_id !== false) ? ' AND ' . $this->db->sql_in_set('item_parent_id', $parent_id) : '');
-		$this->db->sql_query($sql);
+		/** @var method\method_interface $method */
+		foreach ($this->get_available_subscription_methods() as $method)
+		{
+			$method->delete_notifications($notification_type_id, $item_id, $parent_id, $user_id);
+		}
 	}
 
 	/**
@@ -558,6 +469,7 @@ class manager
 
 			foreach ($this->notification_types as $type_name => $data)
 			{
+				/** @var type\base $type */
 				$type = $this->get_item_type_class($type_name);
 
 				if ($type instanceof \phpbb\notification\type\type_interface && $type->is_available())
@@ -593,16 +505,55 @@ class manager
 	{
 		$subscription_methods = array();
 
+		/** @var method\method_interface $method */
+		foreach ($this->get_available_subscription_methods() as $method_name => $method)
+		{
+			$subscription_methods[$method_name] = array(
+				'id'		=> $method->get_type(),
+				'lang'		=> str_replace('.', '_', strtoupper($method->get_type())),
+			);
+		}
+
+		return $subscription_methods;
+	}
+
+	/**
+	* Get all of the subscription methods
+	*
+	* @return array Array of method's instances
+	*/
+	private function get_subscription_methods_instances()
+	{
+		$subscription_methods = array();
+
 		foreach ($this->notification_methods as $method_name => $data)
 		{
 			$method = $this->get_method_class($method_name);
 
-			if ($method instanceof \phpbb\notification\method\method_interface && $method->is_available())
+			if ($method instanceof \phpbb\notification\method\method_interface)
 			{
-				$subscription_methods[$method_name] = array(
-					'id'		=> $method->get_type(),
-					'lang'		=> str_replace('.', '_', strtoupper($method->get_type())),
-				);
+				$subscription_methods[$method_name] = $method;
+			}
+		}
+
+		return $subscription_methods;
+	}
+
+	/**
+	* Get all of the available subscription methods
+	*
+	* @return array Array of method's instances
+	*/
+	private function get_available_subscription_methods()
+	{
+		$subscription_methods = array();
+
+		/** @var method\method_interface $method */
+		foreach ($this->get_subscription_methods_instances() as $method_name => $method)
+		{
+			if ($method->is_available())
+			{
+				$subscription_methods[$method_name] = $method;
 			}
 		}
 
@@ -646,9 +597,10 @@ class manager
 	*/
 	public function get_global_subscriptions($user_id = false)
 	{
-		$user_id = ($user_id === false) ? $this->user->data['user_id'] : $user_id;
+		$user_id = $user_id ?: $this->user->data['user_id'];
 
 		$subscriptions = array();
+		$default_methods = $this->get_default_methods();
 
 		$user_notifications = $this->get_user_notifications($user_id);
 
@@ -656,29 +608,32 @@ class manager
 		{
 			foreach ($types as $id => $type)
 			{
-
-				if (empty($user_notifications[$id]))
-				{
-					// No rows at all, default to ''
-					$subscriptions[$id] = array('');
-				}
-				else
+				$type_subscriptions = $default_methods;
+				if (!empty($user_notifications[$id]))
 				{
 					foreach ($user_notifications[$id] as $user_notification)
 					{
+						$key = array_search($user_notification['method'], $type_subscriptions, true);
 						if (!$user_notification['notify'])
 						{
+							if ($key !== false)
+							{
+								unset($type_subscriptions[$key]);
+							}
+
 							continue;
 						}
-
-						if (!isset($subscriptions[$id]))
+						else if ($key === false)
 						{
-							$subscriptions[$id] = array();
+							$type_subscriptions[] = $user_notification['method'];
 						}
-
-						$subscriptions[$id][] = $user_notification['method'];
 					}
 				}
+
+				if (!empty($type_subscriptions))
+				{
+					$subscriptions[$id] = $type_subscriptions;
+				}
 			}
 		}
 
@@ -690,15 +645,20 @@ class manager
 	*
 	* @param string $item_type Type identifier of the subscription
 	* @param int $item_id The id of the item
-	* @param string $method The method of the notification e.g. '', 'email', or 'jabber'
+	* @param string $method The method of the notification e.g. 'board', 'email', or 'jabber'
+	*                       (if null a subscription will be added for all the defaults methods)
 	* @param bool|int $user_id The user_id to add the subscription for (bool false for current user)
 	*/
-	public function add_subscription($item_type, $item_id = 0, $method = '', $user_id = false)
+	public function add_subscription($item_type, $item_id = 0, $method = null, $user_id = false)
 	{
-		if ($method !== '')
+		if ($method === null)
 		{
-			// Make sure to subscribe them to the base subscription
-			$this->add_subscription($item_type, $item_id, '', $user_id);
+			foreach ($this->get_default_methods() as $method_name)
+			{
+				$this->add_subscription($item_type, $item_id, $method_name, $user_id);
+			}
+
+			return;
 		}
 
 		$user_id = ($user_id === false) ? $this->user->data['user_id'] : $user_id;
@@ -742,33 +702,23 @@ class manager
 	*
 	* @param string $item_type Type identifier of the subscription
 	* @param int $item_id The id of the item
-	* @param string $method The method of the notification e.g. '', 'email', or 'jabber'
+	* @param string $method The method of the notification e.g. 'board', 'email', or 'jabber'
 	* @param bool|int $user_id The user_id to add the subscription for (bool false for current user)
 	*/
-	public function delete_subscription($item_type, $item_id = 0, $method = '', $user_id = false)
+	public function delete_subscription($item_type, $item_id = 0, $method = null, $user_id = false)
 	{
-		$user_id = ($user_id === false) ? $this->user->data['user_id'] : $user_id;
-
-		// If no method, make sure that no other notification methods for this item are selected before deleting
-		if ($method === '')
+		if ($method === null)
 		{
-			$sql = 'SELECT COUNT(*) as num_notifications
-				FROM ' . $this->user_notifications_table . "
-				WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
-					AND item_id = " . (int) $item_id . '
-					AND user_id = ' .(int) $user_id . "
-					AND method <> ''
-					AND notify = 1";
-			$this->db->sql_query($sql);
-			$num_notifications = $this->db->sql_fetchfield('num_notifications');
-			$this->db->sql_freeresult();
-
-			if ($num_notifications)
+			foreach ($this->get_default_methods() as $method_name)
 			{
-				return;
+				$this->delete_subscription($item_type, $item_id, $method_name, $user_id);
 			}
+
+			return;
 		}
 
+		$user_id = $user_id ?: $this->user->data['user_id'];
+
 		$sql = 'UPDATE ' . $this->user_notifications_table . "
 			SET notify = 0
 			WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
@@ -828,15 +778,12 @@ class manager
 		{
 			$notification_type_id = $this->get_notification_type_id($notification_type_name);
 
-			$sql = 'DELETE FROM ' . $this->notifications_table . '
-				WHERE notification_type_id = ' . (int) $notification_type_id;
-			$this->db->sql_query($sql);
-
-			$sql = 'DELETE FROM ' . $this->notification_types_table . '
-				WHERE notification_type_id = ' . (int) $notification_type_id;
-			$this->db->sql_query($sql);
+			/** @var method\method_interface $method */
+			foreach ($this->get_available_subscription_methods() as $method)
+			{
+				$method->purge_notifications($notification_type_id);
+			}
 
-			$this->cache->destroy('notification_type_ids');
 		}
 		catch (\phpbb\notification\exception $e)
 		{
@@ -869,17 +816,40 @@ class manager
 	*/
 	public function prune_notifications($timestamp, $only_read = true)
 	{
-		$sql = 'DELETE FROM ' . $this->notifications_table . '
-			WHERE notification_time < ' . (int) $timestamp .
-				(($only_read) ? ' AND notification_read = 1' : '');
-		$this->db->sql_query($sql);
+		/** @var method\method_interface $method */
+		foreach ($this->get_available_subscription_methods() as $method)
+		{
+			$method->prune_notifications($timestamp, $only_read);
+		}
+	}
+
+	/**
+	 * Helper to get the list of methods enabled by default
+	 *
+	 * @return method\method_interface[]
+	 */
+	public function get_default_methods()
+	{
+		$default_methods = array();
 
-		$this->config->set('read_notification_last_gc', time(), false);
+		foreach ($this->notification_methods as $method)
+		{
+			if ($method->is_enabled_by_default() && $method->is_available())
+			{
+				$default_methods[] = $method->get_type();
+			}
+		}
+
+		return $default_methods;
 	}
 
 	/**
-	* Helper to get the notifications item type class and set it up
-	*/
+	 * Helper to get the notifications item type class and set it up
+	 *
+	 * @param string $notification_type_name
+	 * @param array  $data
+	 * @return type\type_interface
+	 */
 	public function get_item_type_class($notification_type_name, $data = array())
 	{
 		$item = $this->load_object($notification_type_name);
@@ -890,16 +860,22 @@ class manager
 	}
 
 	/**
-	* Helper to get the notifications method class and set it up
-	*/
+	 * Helper to get the notifications method class and set it up
+	 *
+	 * @param string $method_name
+	 * @return method\method_interface
+	 */
 	public function get_method_class($method_name)
 	{
 		return $this->load_object($method_name);
 	}
 
 	/**
-	* Helper to load objects (notification types/methods)
-	*/
+	 * Helper to load objects (notification types/methods)
+	 *
+	 * @param string $object_name
+	 * @return method\method_interface|type\type_interface
+	 */
 	protected function load_object($object_name)
 	{
 		$object = $this->phpbb_container->get($object_name);
@@ -946,7 +922,8 @@ class manager
 			if (!isset($this->notification_types[$notification_type_name]) && !isset($this->notification_types['notification.type.' . $notification_type_name]))
 			{
 				$this->db->sql_transaction('rollback');
-				throw new \phpbb\notification\exception($this->user->lang('NOTIFICATION_TYPE_NOT_EXIST', $notification_type_name));
+
+				throw new \phpbb\notification\exception('NOTIFICATION_TYPE_NOT_EXIST', array($notification_type_name));
 			}
 
 			$sql = 'INSERT INTO ' . $this->notification_types_table . ' ' . $this->db->sql_build_array('INSERT', array(
@@ -987,4 +964,26 @@ class manager
 
 		return $notification_type_ids;
 	}
+
+	/**
+	* Find the users which are already notified
+	*
+	* @param bool|string|array $notification_type_name Type identifier or array of item types (only acceptable if the $data is identical for the specified types). False to retrieve all item types
+	* @param array $options
+	* @return array The list of the notified users
+	*/
+	public function get_notified_users($notification_type_name, array $options)
+	{
+		$notification_type_id = $this->get_notification_type_id($notification_type_name);
+
+		$notified_users = array();
+
+		/** @var method\method_interface $method */
+		foreach ($this->get_available_subscription_methods() as $method)
+		{
+			$notified_users = $notified_users + $method->get_notified_users($notification_type_id, $options);
+		}
+
+		return $notified_users;
+	}
 }
--- a/phpbb/notification/method/base.php
+++ b/phpbb/notification/method/base.php
@@ -21,36 +21,6 @@ abstract class base implements \phpbb\notification\method\method_interface
 	/** @var \phpbb\notification\manager */
 	protected $notification_manager;
 
-	/** @var \phpbb\user_loader */
-	protected $user_loader;
-
-	/** @var \phpbb\db\driver\driver_interface */
-	protected $db;
-
-	/** @var \phpbb\cache\driver\driver_interface */
-	protected $cache;
-
-	/** @var \phpbb\template\template */
-	protected $template;
-
-	/** @var \phpbb\extension\manager */
-	protected $extension_manager;
-
-	/** @var \phpbb\user */
-	protected $user;
-
-	/** @var \phpbb\auth\auth */
-	protected $auth;
-
-	/** @var \phpbb\config\config */
-	protected $config;
-
-	/** @var string */
-	protected $phpbb_root_path;
-
-	/** @var string */
-	protected $php_ext;
-
 	/**
 	* Queue of messages to be sent
 	*
@@ -59,38 +29,43 @@ abstract class base implements \phpbb\notification\method\method_interface
 	protected $queue = array();
 
 	/**
-	* Notification Method Base Constructor
+	* Set notification manager (required)
 	*
-	* @param \phpbb\user_loader $user_loader
-	* @param \phpbb\db\driver\driver_interface $db
-	* @param \phpbb\cache\driver\driver_interface $cache
-	* @param \phpbb\user $user
-	* @param \phpbb\auth\auth $auth
-	* @param \phpbb\config\config $config
-	* @param string $phpbb_root_path
-	* @param string $php_ext
-	* @return \phpbb\notification\method\base
+	* @param \phpbb\notification\manager $notification_manager
 	*/
-	public function __construct(\phpbb\user_loader $user_loader, \phpbb\db\driver\driver_interface $db, \phpbb\cache\driver\driver_interface $cache, $user, \phpbb\auth\auth $auth, \phpbb\config\config $config, $phpbb_root_path, $php_ext)
+	public function set_notification_manager(\phpbb\notification\manager $notification_manager)
 	{
-		$this->user_loader = $user_loader;
-		$this->db = $db;
-		$this->cache = $cache;
-		$this->user = $user;
-		$this->auth = $auth;
-		$this->config = $config;
-		$this->phpbb_root_path = $phpbb_root_path;
-		$this->php_ext = $php_ext;
+		$this->notification_manager = $notification_manager;
 	}
 
 	/**
-	* Set notification manager (required)
+	* Is the method enable by default?
 	*
-	* @param \phpbb\notification\manager $notification_manager
+	* @return bool
 	*/
-	public function set_notification_manager(\phpbb\notification\manager $notification_manager)
+	public function is_enabled_by_default()
 	{
-		$this->notification_manager = $notification_manager;
+		return false;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_notified_users($notification_type_id, array $options)
+	{
+		return array();
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function load_notifications(array $options = array())
+	{
+		return array(
+			'notifications'		=> array(),
+			'unread_count'		=> 0,
+			'total_count'		=> 0,
+		);
 	}
 
 	/**
@@ -103,6 +78,55 @@ abstract class base implements \phpbb\notification\method\method_interface
 		$this->queue[] = $notification;
 	}
 
+	/**
+	* {@inheritdoc}
+	*/
+	public function update_notification($notification, array $data, array $options)
+	{
+	}
+
+	/**
+	* {@inheritdoc
+	*/
+	public function mark_notifications($notification_type_id, $item_id, $user_id, $time = false, $mark_read = true)
+	{
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function mark_notifications_by_parent($notification_type_id, $item_parent_id, $user_id, $time = false, $mark_read = true)
+	{
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function mark_notifications_by_id($notification_id, $time = false, $mark_read = true)
+	{
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function delete_notifications($notification_type_id, $item_id, $parent_id = false, $user_id = false)
+	{
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function prune_notifications($timestamp, $only_read = true)
+	{
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function purge_notifications($notification_type_id)
+	{
+	}
+
 	/**
 	* Empty the queue
 	*/
--- /dev/null
+++ b/phpbb/notification/method/board.php
@@ -0,0 +1,399 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\notification\method;
+
+/**
+* In Board notification method class
+* This class handles in board notifications. This method is enabled by default.
+*
+* @package notifications
+*/
+class board extends \phpbb\notification\method\base
+{
+	/** @var \phpbb\user_loader */
+	protected $user_loader;
+
+	/** @var \phpbb\db\driver\driver_interface */
+	protected $db;
+
+	/** @var \phpbb\cache\driver\driver_interface */
+	protected $cache;
+
+	/** @var \phpbb\user */
+	protected $user;
+
+	/** @var \phpbb\config\config */
+	protected $config;
+
+	/** @var string */
+	protected $notification_types_table;
+
+	/** @var string */
+	protected $notifications_table;
+
+	/**
+	* Notification Method Board Constructor
+	*
+	* @param \phpbb\user_loader $user_loader
+	* @param \phpbb\db\driver\driver_interface $db
+	* @param \phpbb\cache\driver\driver_interface $cache
+	* @param \phpbb\user $user
+	* @param \phpbb\config\config $config
+	* @param string $notification_types_table
+	* @param string $notifications_table
+	*/
+	public function __construct(\phpbb\user_loader $user_loader, \phpbb\db\driver\driver_interface $db, \phpbb\cache\driver\driver_interface $cache, \phpbb\user $user, \phpbb\config\config $config, $notification_types_table, $notifications_table)
+	{
+		$this->user_loader = $user_loader;
+		$this->db = $db;
+		$this->cache = $cache;
+		$this->user = $user;
+		$this->config = $config;
+		$this->notification_types_table = $notification_types_table;
+		$this->notifications_table = $notifications_table;
+
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function add_to_queue(\phpbb\notification\type\type_interface $notification)
+	{
+		$this->queue[] = $notification;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_type()
+	{
+		return 'notification.method.board';
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function is_available()
+	{
+		return $this->config['allow_board_notifications'];
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function is_enabled_by_default()
+	{
+		return true;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_notified_users($notification_type_id, array $options)
+	{
+		$notified_users = array();
+		$sql = 'SELECT n.*
+			FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
+			WHERE n.notification_type_id = ' . (int) $notification_type_id .
+			(isset($options['item_id']) ? ' AND n.item_id = ' . (int) $options['item_id'] : '') .
+			(isset($options['item_parent_id']) ? ' AND n.item_parent_id = ' . (int) $options['item_parent_id'] : '') .
+			(isset($options['user_id']) ? ' AND n.user_id = ' . (int) $options['user_id'] : '') .
+			(isset($options['read']) ? ' AND n.notification_read = ' . (int) $options['read'] : '') .'
+				AND nt.notification_type_id = n.notification_type_id
+				AND nt.notification_type_enabled = 1';
+		$result = $this->db->sql_query($sql);
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			$notified_users[$row['user_id']] = $row;
+		}
+		$this->db->sql_freeresult($result);
+
+		return $notified_users;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function load_notifications(array $options = array())
+	{
+		// Merge default options
+		$options = array_merge(array(
+			'notification_id'	=> false,
+			'user_id'			=> $this->user->data['user_id'],
+			'order_by'			=> 'notification_time',
+			'order_dir'			=> 'DESC',
+			'limit'				=> 0,
+			'start'				=> 0,
+			'all_unread'		=> false,
+			'count_unread'		=> false,
+			'count_total'		=> false,
+		), $options);
+
+		// If all_unread, count_unread must be true
+		$options['count_unread'] = ($options['all_unread']) ? true : $options['count_unread'];
+
+		// Anonymous users and bots never receive notifications
+		if ($options['user_id'] == $this->user->data['user_id'] && ($this->user->data['user_id'] == ANONYMOUS || $this->user->data['user_type'] == USER_IGNORE))
+		{
+			return array(
+				'notifications'		=> array(),
+				'unread_count'		=> 0,
+				'total_count'		=> 0,
+			);
+		}
+
+		$notifications = $user_ids = array();
+		$load_special = array();
+		$total_count = $unread_count = 0;
+
+		if ($options['count_unread'])
+		{
+			// Get the total number of unread notifications
+			$sql = 'SELECT COUNT(n.notification_id) AS unread_count
+				FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
+				WHERE n.user_id = ' . (int) $options['user_id'] . '
+					AND n.notification_read = 0
+					AND nt.notification_type_id = n.notification_type_id
+					AND nt.notification_type_enabled = 1';
+			$result = $this->db->sql_query($sql);
+			$unread_count = (int) $this->db->sql_fetchfield('unread_count');
+			$this->db->sql_freeresult($result);
+		}
+
+		if ($options['count_total'])
+		{
+			// Get the total number of notifications
+			$sql = 'SELECT COUNT(n.notification_id) AS total_count
+				FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
+				WHERE n.user_id = ' . (int) $options['user_id'] . '
+					AND nt.notification_type_id = n.notification_type_id
+					AND nt.notification_type_enabled = 1';
+			$result = $this->db->sql_query($sql);
+			$total_count = (int) $this->db->sql_fetchfield('total_count');
+			$this->db->sql_freeresult($result);
+		}
+
+		if (!$options['count_total'] || $total_count)
+		{
+			$rowset = array();
+
+			// Get the main notifications
+			$sql = 'SELECT n.*, nt.notification_type_name
+				FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
+				WHERE n.user_id = ' . (int) $options['user_id'] .
+				(($options['notification_id']) ? ((is_array($options['notification_id'])) ? ' AND ' . $this->db->sql_in_set('n.notification_id', $options['notification_id']) : ' AND n.notification_id = ' . (int) $options['notification_id']) : '') . '
+					AND nt.notification_type_id = n.notification_type_id
+					AND nt.notification_type_enabled = 1
+				ORDER BY n.' . $this->db->sql_escape($options['order_by']) . ' ' . $this->db->sql_escape($options['order_dir']);
+			$result = $this->db->sql_query_limit($sql, $options['limit'], $options['start']);
+
+			while ($row = $this->db->sql_fetchrow($result))
+			{
+				$rowset[$row['notification_id']] = $row;
+			}
+			$this->db->sql_freeresult($result);
+
+			// Get all unread notifications
+			if ($unread_count && $options['all_unread'] && !empty($rowset))
+			{
+				$sql = 'SELECT n.*, nt.notification_type_name
+				FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
+					WHERE n.user_id = ' . (int) $options['user_id'] . '
+						AND n.notification_read = 0
+						AND ' . $this->db->sql_in_set('n.notification_id', array_keys($rowset), true) . '
+						AND nt.notification_type_id = n.notification_type_id
+						AND nt.notification_type_enabled = 1
+					ORDER BY n.' . $this->db->sql_escape($options['order_by']) . ' ' . $this->db->sql_escape($options['order_dir']);
+				$result = $this->db->sql_query_limit($sql, $options['limit'], $options['start']);
+
+				while ($row = $this->db->sql_fetchrow($result))
+				{
+					$rowset[$row['notification_id']] = $row;
+				}
+				$this->db->sql_freeresult($result);
+			}
+
+			foreach ($rowset as $row)
+			{
+				$notification = $this->notification_manager->get_item_type_class($row['notification_type_name'], $row);
+
+				// Array of user_ids to query all at once
+				$user_ids = array_merge($user_ids, $notification->users_to_query());
+
+				// Some notification types also require querying additional tables themselves
+				if (!isset($load_special[$row['notification_type_name']]))
+				{
+					$load_special[$row['notification_type_name']] = array();
+				}
+				$load_special[$row['notification_type_name']] = array_merge($load_special[$row['notification_type_name']], $notification->get_load_special());
+
+				$notifications[$row['notification_id']] = $notification;
+			}
+
+			$this->user_loader->load_users($user_ids);
+
+			// Allow each type to load its own special items
+			foreach ($load_special as $item_type => $data)
+			{
+				$item_class = $this->notification_manager->get_item_type_class($item_type);
+
+				$item_class->load_special($data, $notifications);
+			}
+		}
+
+		return array(
+			'notifications'		=> $notifications,
+			'unread_count'		=> $unread_count,
+			'total_count'		=> $total_count,
+		);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function notify()
+	{
+		$insert_buffer = new \phpbb\db\sql_insert_buffer($this->db, $this->notifications_table);
+
+		/** @var \phpbb\notification\type\type_interface $notification */
+		foreach ($this->queue as $notification)
+		{
+			$data = $notification->get_insert_array();
+			$insert_buffer->insert($data);
+		}
+
+		$insert_buffer->flush();
+
+		// We're done, empty the queue
+		$this->empty_queue();
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function update_notification($notification, array $data, array $options)
+	{
+		// Allow the notifications class to over-ride the update_notifications functionality
+		if (method_exists($notification, 'update_notifications'))
+		{
+			// Return False to over-ride the rest of the update
+			if ($notification->update_notifications($data) === false)
+			{
+				return;
+			}
+		}
+
+		$notification_type_id = $this->notification_manager->get_notification_type_id($notification->get_type());
+		$update_array = $notification->create_update_array($data);
+
+		$sql = 'UPDATE ' . $this->notifications_table . '
+			SET ' . $this->db->sql_build_array('UPDATE', $update_array) . '
+			WHERE notification_type_id = ' . (int) $notification_type_id .
+			(isset($options['item_id']) ? ' AND item_id = ' . (int) $options['item_id'] : '') .
+			(isset($options['item_parent_id']) ? ' AND item_parent_id = ' . (int) $options['item_parent_id'] : '') .
+			(isset($options['user_id']) ? ' AND user_id = ' . (int) $options['user_id'] : '') .
+			(isset($options['read']) ? ' AND notification_read = ' . (int) $options['read'] : '');
+		$this->db->sql_query($sql);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function mark_notifications($notification_type_id, $item_id, $user_id, $time = false, $mark_read = true)
+	{
+		$time = ($time !== false) ? $time : time();
+
+		$sql = 'UPDATE ' . $this->notifications_table . '
+			SET notification_read = ' . ($mark_read ? 1 : 0) . '
+			WHERE notification_time <= ' . (int) $time .
+			(($notification_type_id !== false) ? ' AND ' .
+				(is_array($notification_type_id) ? $this->db->sql_in_set('notification_type_id', $notification_type_id) : 'notification_type_id = ' . $notification_type_id) : '') .
+			(($user_id !== false) ? ' AND ' . (is_array($user_id) ? $this->db->sql_in_set('user_id', $user_id) : 'user_id = ' . (int) $user_id) : '') .
+			(($item_id !== false) ? ' AND ' . (is_array($item_id) ? $this->db->sql_in_set('item_id', $item_id) : 'item_id = ' . (int) $item_id) : '');
+		$this->db->sql_query($sql);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function mark_notifications_by_parent($notification_type_id, $item_parent_id, $user_id, $time = false, $mark_read = true)
+	{
+		$time = ($time !== false) ? $time : time();
+
+		$sql = 'UPDATE ' . $this->notifications_table . '
+			SET notification_read = ' . ($mark_read ? 1 : 0) . '
+			WHERE notification_time <= ' . (int) $time .
+			(($notification_type_id !== false) ? ' AND ' .
+				(is_array($notification_type_id) ? $this->db->sql_in_set('notification_type_id', $notification_type_id) : 'notification_type_id = ' . $notification_type_id) : '') .
+			(($item_parent_id !== false) ? ' AND ' . (is_array($item_parent_id) ? $this->db->sql_in_set('item_parent_id', $item_parent_id, false, true) : 'item_parent_id = ' . (int) $item_parent_id) : '') .
+			(($user_id !== false) ? ' AND ' . (is_array($user_id) ? $this->db->sql_in_set('user_id', $user_id) : 'user_id = ' . (int) $user_id) : '');
+		$this->db->sql_query($sql);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function mark_notifications_by_id($notification_id, $time = false, $mark_read = true)
+	{
+		$time = ($time !== false) ? $time : time();
+
+		$sql = 'UPDATE ' . $this->notifications_table . '
+			SET notification_read = ' . ($mark_read ? 1 : 0) . '
+			WHERE notification_time <= ' . (int) $time . '
+				AND ' . ((is_array($notification_id)) ? $this->db->sql_in_set('notification_id', $notification_id) : 'notification_id = ' . (int) $notification_id);
+		$this->db->sql_query($sql);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function delete_notifications($notification_type_id, $item_id, $parent_id = false, $user_id = false)
+	{
+		$sql = 'DELETE FROM ' . $this->notifications_table . '
+			WHERE notification_type_id = ' . (int) $notification_type_id . '
+				AND ' . (is_array($item_id) ? $this->db->sql_in_set('item_id', $item_id) : 'item_id = ' . (int) $item_id) .
+			(($parent_id !== false) ? ' AND ' . ((is_array($parent_id) ? $this->db->sql_in_set('item_parent_id', $parent_id) : 'item_parent_id = ' . (int) $parent_id)) : '') .
+			(($user_id !== false) ? ' AND ' . ((is_array($user_id) ? $this->db->sql_in_set('user_id', $user_id) : 'user_id = ' . (int) $user_id)) : '');
+		$this->db->sql_query($sql);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function prune_notifications($timestamp, $only_read = true)
+	{
+		$sql = 'DELETE FROM ' . $this->notifications_table . '
+			WHERE notification_time < ' . (int) $timestamp .
+			(($only_read) ? ' AND notification_read = 1' : '');
+		$this->db->sql_query($sql);
+
+		$this->config->set('read_notification_last_gc', time(), false);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function purge_notifications($notification_type_id)
+	{
+		$sql = 'DELETE FROM ' . $this->notifications_table . '
+			WHERE notification_type_id = ' . (int) $notification_type_id;
+		$this->db->sql_query($sql);
+
+		$sql = 'DELETE FROM ' . $this->notification_types_table . '
+			WHERE notification_type_id = ' . (int) $notification_type_id;
+		$this->db->sql_query($sql);
+
+		$this->cache->destroy('notification_type_ids');
+	}
+}
--- a/phpbb/notification/method/email.php
+++ b/phpbb/notification/method/email.php
@@ -20,6 +20,29 @@ namespace phpbb\notification\method;
 
 class email extends \phpbb\notification\method\messenger_base
 {
+	/** @var \phpbb\user */
+	protected $user;
+
+	/** @var \phpbb\config\config */
+	protected $config;
+
+	/**
+	 * Notification Method email Constructor
+	 *
+	 * @param \phpbb\user_loader $user_loader
+	 * @param \phpbb\user $user
+	 * @param \phpbb\config\config $config
+	 * @param string $phpbb_root_path
+	 * @param string $php_ext
+	 */
+	public function __construct(\phpbb\user_loader $user_loader, \phpbb\user $user, \phpbb\config\config $config, $phpbb_root_path, $php_ext)
+	{
+		parent::__construct($user_loader, $phpbb_root_path, $php_ext);
+
+		$this->user = $user;
+		$this->config = $config;
+	}
+
 	/**
 	* Get notification method name
 	*
--- a/phpbb/notification/method/jabber.php
+++ b/phpbb/notification/method/jabber.php
@@ -20,6 +20,29 @@ namespace phpbb\notification\method;
 
 class jabber extends \phpbb\notification\method\messenger_base
 {
+	/** @var \phpbb\user */
+	protected $user;
+
+	/** @var \phpbb\config\config */
+	protected $config;
+
+	/**
+	 * Notification Method jabber Constructor
+	 *
+	 * @param \phpbb\user_loader $user_loader
+	 * @param \phpbb\user $user
+	 * @param \phpbb\config\config $config
+	 * @param string $phpbb_root_path
+	 * @param string $php_ext
+	 */
+	public function __construct(\phpbb\user_loader $user_loader, \phpbb\user $user, \phpbb\config\config $config, $phpbb_root_path, $php_ext)
+	{
+		parent::__construct($user_loader, $phpbb_root_path, $php_ext);
+
+		$this->user = $user;
+		$this->config = $config;
+	}
+
 	/**
 	* Get notification method name
 	*
@@ -61,6 +84,6 @@ class jabber extends \phpbb\notification\method\messenger_base
 			return;
 		}
 
-		return $this->notify_using_messenger(NOTIFY_IM, 'short/');
+		$this->notify_using_messenger(NOTIFY_IM, 'short/');
 	}
 }
--- a/phpbb/notification/method/messenger_base.php
+++ b/phpbb/notification/method/messenger_base.php
@@ -19,6 +19,29 @@ namespace phpbb\notification\method;
 */
 abstract class messenger_base extends \phpbb\notification\method\base
 {
+	/** @var \phpbb\user_loader */
+	protected $user_loader;
+
+	/** @var string */
+	protected $phpbb_root_path;
+
+	/** @var string */
+	protected $php_ext;
+
+	/**
+	 * Notification Method Board Constructor
+	 *
+	 * @param \phpbb\user_loader $user_loader
+	 * @param string $phpbb_root_path
+	 * @param string $php_ext
+	 */
+	public function __construct(\phpbb\user_loader $user_loader, $phpbb_root_path, $php_ext)
+	{
+		$this->user_loader = $user_loader;
+		$this->phpbb_root_path = $phpbb_root_path;
+		$this->php_ext = $php_ext;
+	}
+
 	/**
 	* Notify using phpBB messenger
 	*
@@ -57,9 +80,9 @@ abstract class messenger_base extends \phpbb\notification\method\base
 			include($this->phpbb_root_path . 'includes/functions_messenger.' . $this->php_ext);
 		}
 		$messenger = new \messenger();
-		$board_url = generate_board_url();
 
 		// Time to go through the queue and send emails
+		/** @var \phpbb\notification\type\type_interface $notification */
 		foreach ($this->queue as $notification)
 		{
 			if ($notification->get_email_template() === false)
--- a/phpbb/notification/method/method_interface.php
+++ b/phpbb/notification/method/method_interface.php
@@ -25,12 +25,48 @@ interface method_interface
 	*/
 	public function get_type();
 
+	/**
+	* Is the method enable by default?
+	*
+	* @return bool
+	*/
+	public function is_enabled_by_default();
+
 	/**
 	* Is this method available for the user?
 	* This is checked on the notifications options
 	*/
 	public function is_available();
 
+	/**
+	* Return the list of the users already notified
+	*
+	* @param int $notification_type_id Type of the notification
+	* @param array $options
+	* @return array User
+	*/
+	public function get_notified_users($notification_type_id, array $options);
+
+	/**
+	* Load the user's notifications
+	*
+	* @param array $options Optional options to control what notifications are loaded
+	*				notification_id		Notification id to load (or array of notification ids)
+	*				user_id				User id to load notifications for (Default: $user->data['user_id'])
+	*				order_by			Order by (Default: notification_time)
+	*				order_dir			Order direction (Default: DESC)
+	* 				limit				Number of notifications to load (Default: 5)
+	* 				start				Notifications offset (Default: 0)
+	* 				all_unread			Load all unread notifications? If set to true, count_unread is set to true (Default: false)
+	* 				count_unread		Count all unread notifications? (Default: false)
+	* 				count_total			Count all notifications? (Default: false)
+	* @return array Array of information based on the request with keys:
+	*	'notifications'		array of notification type objects
+	*	'unread_count'		number of unread notifications the user has if count_unread is true in the options
+	*	'total_count'		number of notifications the user has if count_total is true in the options
+	*/
+	public function load_notifications(array $options = array());
+
 	/**
 	* Add a notification to the queue
 	*
@@ -42,4 +78,72 @@ interface method_interface
 	* Parse the queue and notify the users
 	*/
 	public function notify();
+
+	/**
+	* Update a notification
+	*
+	* @param \phpbb\notification\type\type_interface $notification Notification to update
+	* @param array $data Data specific for this type that will be updated
+	* @param array $options
+	*/
+	public function update_notification($notification, array $data, array $options);
+
+	/**
+	* Mark notifications read or unread
+	*
+	* @param bool|string $notification_type_id Type identifier of item types. False to mark read for all item types
+	* @param bool|int|array $item_id Item id or array of item ids. False to mark read for all item ids
+	* @param bool|int|array $user_id User id or array of user ids. False to mark read for all user ids
+	* @param bool|int $time Time at which to mark all notifications prior to as read. False to mark all as read. (Default: False)
+	* @param bool $mark_read Define if the notification as to be set to True or False. (Default: True)
+	*/
+	public function mark_notifications($notification_type_id, $item_id, $user_id, $time = false, $mark_read = true);
+
+	/**
+	* Mark notifications read or unread from a parent identifier
+	*
+	* @param string $notification_type_id Type identifier of item types
+	* @param bool|int|array $item_parent_id Item parent id or array of item parent ids. False to mark read for all item parent ids
+	* @param bool|int|array $user_id User id or array of user ids. False to mark read for all user ids
+	* @param bool|int $time Time at which to mark all notifications prior to as read. False to mark all as read. (Default: False)
+	* @param bool $mark_read Define if the notification as to be set to True or False. (Default: True)
+	*/
+	public function mark_notifications_by_parent($notification_type_id, $item_parent_id, $user_id, $time = false, $mark_read = true);
+
+	/**
+	* Mark notifications read or unread
+	*
+	* @param int $notification_id Notification id of notification ids.
+	* @param bool|int $time Time at which to mark all notifications prior to as read. False to mark all as read. (Default: False)
+	* @param bool $mark_read Define if the notification as to be set to True or False. (Default: True)
+	*/
+	public function mark_notifications_by_id($notification_id, $time = false, $mark_read = true);
+
+	/**
+	* Delete a notification
+	*
+	* @param string $notification_type_id Type identifier of item types
+	* @param int|array $item_id Identifier within the type (or array of ids)
+	* @param mixed $parent_id Parent identifier within the type (or array of ids), used in combination with item_id if specified (Default: false; not checked)
+	* @param mixed $user_id User id (Default: false; not checked)
+	*/
+	public function delete_notifications($notification_type_id, $item_id, $parent_id = false, $user_id = false);
+
+	/**
+	* Delete all notifications older than a certain time
+	*
+	* @param int $timestamp Unix timestamp to delete all notifications that were created before
+	* @param bool $only_read True (default) to only prune read notifications
+	*/
+	public function prune_notifications($timestamp, $only_read = true);
+
+	/**
+	* Purge all notifications of a certain type
+	*
+	* This should be called when an extension which has notification types
+	* is purged so that all those notifications are removed
+	*
+	* @param string $notification_type_id Type identifier of the subscription
+	*/
+	public function purge_notifications($notification_type_id);
 }
--- a/phpbb/notification/type/admin_activate_user.php
+++ b/phpbb/notification/type/admin_activate_user.php
@@ -36,11 +36,27 @@ class admin_activate_user extends \phpbb\notification\type\base
 	/**
 	* {@inheritdoc}
 	*/
-	public static $notification_option = array(
+	static public $notification_option = array(
 		'lang'	=> 'NOTIFICATION_TYPE_ADMIN_ACTIVATE_USER',
 		'group'	=> 'NOTIFICATION_GROUP_ADMINISTRATION',
 	);
 
+	/** @var \phpbb\user_loader */
+	protected $user_loader;
+
+	/** @var \phpbb\config\config */
+	protected $config;
+
+	public function set_config(\phpbb\config\config $config)
+	{
+		$this->config = $config;
+	}
+
+	public function set_user_loader(\phpbb\user_loader $user_loader)
+	{
+		$this->user_loader = $user_loader;
+	}
+
 	/**
 	* {@inheritdoc}
 	*/
@@ -52,7 +68,7 @@ class admin_activate_user extends \phpbb\notification\type\base
 	/**
 	* {@inheritdoc}
 	*/
-	public static function get_item_id($user)
+	static public function get_item_id($user)
 	{
 		return (int) $user['user_id'];
 	}
@@ -60,7 +76,7 @@ class admin_activate_user extends \phpbb\notification\type\base
 	/**
 	* {@inheritdoc}
 	*/
-	public static function get_item_parent_id($post)
+	static public function get_item_parent_id($post)
 	{
 		return 0;
 	}
@@ -114,7 +130,7 @@ class admin_activate_user extends \phpbb\notification\type\base
 	{
 		$username = $this->user_loader->get_username($this->item_id, 'no_profile');
 
-		return $this->user->lang($this->language_key, $username);
+		return $this->language->lang($this->language_key, $username);
 	}
 
 	/**
@@ -164,6 +180,6 @@ class admin_activate_user extends \phpbb\notification\type\base
 		$this->set_data('user_actkey', $user['user_actkey']);
 		$this->notification_time = $user['user_regdate'];
 
-		return parent::create_insert_array($user, $pre_create_data);
+		parent::create_insert_array($user, $pre_create_data);
 	}
 }
--- a/phpbb/notification/type/approve_post.php
+++ b/phpbb/notification/type/approve_post.php
@@ -50,7 +50,7 @@ class approve_post extends \phpbb\notification\type\post
 	* @var bool|array False if the service should use it's default data
 	* 					Array of data (including keys 'id', 'lang', and 'group')
 	*/
-	public static $notification_option = array(
+	static public $notification_option = array(
 		'id'	=> 'moderation_queue',
 		'lang'	=> 'NOTIFICATION_TYPE_MODERATION_QUEUE',
 		'group'	=> 'NOTIFICATION_GROUP_POSTING',
@@ -79,7 +79,7 @@ class approve_post extends \phpbb\notification\type\post
 		), $options);
 
 		$users = array();
-		$users[$post['poster_id']] = array('');
+		$users[$post['poster_id']] = $this->notification_manager->get_default_methods();
 
 		return $this->get_authorised_recipients(array_keys($users), $post['forum_id'], array_merge($options, array(
 			'item_type'		=> static::$notification_option['id'],
@@ -107,21 +107,24 @@ class approve_post extends \phpbb\notification\type\post
 	}
 
 	/**
-	* Function for preparing the data for insertion in an SQL query
-	* (The service handles insertion)
-	*
-	* @param array $post Data from submit_post
-	* @param array $pre_create_data Data from pre_create_insert_array()
-	*
-	* @return array Array of data ready to be inserted into the database
+	* {@inheritdoc}
 	*/
 	public function create_insert_array($post, $pre_create_data = array())
 	{
 		$this->set_data('post_subject', $post['post_subject']);
 
-		$data = parent::create_insert_array($post, $pre_create_data);
+		parent::create_insert_array($post, $pre_create_data);
+
+		$this->notification_time = time();
+	}
 
-		$this->notification_time = $data['notification_time'] = time();
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_insert_array()
+	{
+		$data = parent::get_insert_array();
+		$data['notification_time'] = $this->notification_time;
 
 		return $data;
 	}
--- a/phpbb/notification/type/approve_topic.php
+++ b/phpbb/notification/type/approve_topic.php
@@ -50,7 +50,7 @@ class approve_topic extends \phpbb\notification\type\topic
 	* @var bool|array False if the service should use it's default data
 	* 					Array of data (including keys 'id', 'lang', and 'group')
 	*/
-	public static $notification_option = array(
+	static public $notification_option = array(
 		'id'	=> 'moderation_queue',
 		'lang'	=> 'NOTIFICATION_TYPE_MODERATION_QUEUE',
 		'group'	=> 'NOTIFICATION_GROUP_POSTING',
@@ -79,7 +79,7 @@ class approve_topic extends \phpbb\notification\type\topic
 		), $options);
 
 		$users = array();
-		$users[$post['poster_id']] = array('');
+		$users[$post['poster_id']] = $this->notification_manager->get_default_methods();
 
 		return $this->get_authorised_recipients(array_keys($users), $post['forum_id'], array_merge($options, array(
 			'item_type'		=> static::$notification_option['id'],
@@ -107,19 +107,23 @@ class approve_topic extends \phpbb\notification\type\topic
 	}
 
 	/**
-	* Function for preparing the data for insertion in an SQL query
-	* (The service handles insertion)
-	*
-	* @param array $post Data from submit_post
-	* @param array $pre_create_data Data from pre_create_insert_array()
-	*
-	* @return array Array of data ready to be inserted into the database
+	* {@inheritdoc}
 	*/
 	public function create_insert_array($post, $pre_create_data = array())
 	{
-		$data = parent::create_insert_array($post, $pre_create_data);
 
-		$this->notification_time = $data['notification_time'] = time();
+		parent::create_insert_array($post, $pre_create_data);
+
+		$this->notification_time = time();
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_insert_array()
+	{
+		$data = parent::get_insert_array();
+		$data['notification_time'] = $this->notification_time;
 
 		return $data;
 	}
--- a/phpbb/notification/type/base.php
+++ b/phpbb/notification/type/base.php
@@ -21,17 +21,11 @@ abstract class base implements \phpbb\notification\type\type_interface
 	/** @var \phpbb\notification\manager */
 	protected $notification_manager;
 
-	/** @var \phpbb\user_loader */
-	protected $user_loader;
-
 	/** @var \phpbb\db\driver\driver_interface */
 	protected $db;
 
-	/** @var \phpbb\cache\driver\driver_interface */
-	protected $cache;
-
-	/** @var \phpbb\template\template */
-	protected $template;
+	/** @var \phpbb\language\language */
+	protected $language;
 
 	/** @var \phpbb\user */
 	protected $user;
@@ -39,21 +33,12 @@ abstract class base implements \phpbb\notification\type\type_interface
 	/** @var \phpbb\auth\auth */
 	protected $auth;
 
-	/** @var \phpbb\config\config */
-	protected $config;
-
 	/** @var string */
 	protected $phpbb_root_path;
 
 	/** @var string */
 	protected $php_ext;
 
-	/** @var string */
-	protected $notification_types_table;
-
-	/** @var string */
-	protected $notifications_table;
-
 	/** @var string */
 	protected $user_notifications_table;
 
@@ -63,7 +48,7 @@ abstract class base implements \phpbb\notification\type\type_interface
 	* @var bool|array False if the service should use its default data
 	* 					Array of data (including keys 'id', 'lang', and 'group')
 	*/
-	public static $notification_option = false;
+	static public $notification_option = false;
 
 	/**
 	* The notification_type_id, set upon creation of the class
@@ -74,7 +59,7 @@ abstract class base implements \phpbb\notification\type\type_interface
 	protected $notification_type_id;
 
 	/**
-	* Indentification data
+	* Identification data
 	* notification_type_id	- ID of the item type (auto generated, from notification types table)
 	* item_id				- ID of the item (e.g. post_id, msg_id)
 	* item_parent_id		- Parent item id (ex: for topic => forum_id, for post => topic_id, etc)
@@ -89,35 +74,26 @@ abstract class base implements \phpbb\notification\type\type_interface
 	private $data = array();
 
 	/**
-	* Notification Type Base Constructor
-	*
-	* @param \phpbb\user_loader $user_loader
-	* @param \phpbb\db\driver\driver_interface $db
-	* @param \phpbb\cache\driver\driver_interface $cache
-	* @param \phpbb\user $user
-	* @param \phpbb\auth\auth $auth
-	* @param \phpbb\config\config $config
-	* @param string $phpbb_root_path
-	* @param string $php_ext
-	* @param string $notification_types_table
-	* @param string $notifications_table
-	* @param string $user_notifications_table
-	* @return \phpbb\notification\type\base
-	*/
-	public function __construct(\phpbb\user_loader $user_loader, \phpbb\db\driver\driver_interface $db, \phpbb\cache\driver\driver_interface $cache, $user, \phpbb\auth\auth $auth, \phpbb\config\config $config, $phpbb_root_path, $php_ext, $notification_types_table, $notifications_table, $user_notifications_table)
+	 * Notification Type Base Constructor
+	 *
+	 * @param \phpbb\db\driver\driver_interface $db
+	 * @param \phpbb\language\language          $language
+	 * @param \phpbb\user                       $user
+	 * @param \phpbb\auth\auth                  $auth
+	 * @param string                            $phpbb_root_path
+	 * @param string                            $php_ext
+	 * @param string                            $user_notifications_table
+	 */
+	public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\language\language $language, \phpbb\user $user, \phpbb\auth\auth $auth, $phpbb_root_path, $php_ext, $user_notifications_table)
 	{
-		$this->user_loader = $user_loader;
 		$this->db = $db;
-		$this->cache = $cache;
+		$this->language = $language;
 		$this->user = $user;
 		$this->auth = $auth;
-		$this->config = $config;
 
 		$this->phpbb_root_path = $phpbb_root_path;
 		$this->php_ext = $php_ext;
 
-		$this->notification_types_table = $notification_types_table;
-		$this->notifications_table = $notifications_table;
 		$this->user_notifications_table = $user_notifications_table;
 	}
 
@@ -207,12 +183,7 @@ abstract class base implements \phpbb\notification\type\type_interface
 	}
 
 	/**
-	* Function for preparing the data for insertion in an SQL query
-	* (The service handles insertion)
-	*
-	* @param array $type_data Data unique to this notification type
-	* @param array $pre_create_data Data from pre_create_insert_array()
-	* @return array Array of data ready to be inserted into the database
+	* {@inheritdoc}
 	*/
 	public function create_insert_array($type_data, $pre_create_data = array())
 	{
@@ -225,9 +196,15 @@ abstract class base implements \phpbb\notification\type\type_interface
 			'notification_time'		=> time(),
 			'notification_read'		=> false,
 
-			'notification_data'					=> array(),
+			'notification_data'		=> array(),
 		), $this->data);
+	}
 
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_insert_array()
+	{
 		$data = $this->data;
 
 		$data['notification_data'] = serialize($data['notification_data']);
@@ -244,7 +221,8 @@ abstract class base implements \phpbb\notification\type\type_interface
 	*/
 	public function create_update_array($type_data)
 	{
-		$data = $this->create_insert_array($type_data);
+		$this->create_insert_array($type_data);
+		$data = $this->get_insert_array();
 
 		// Unset data unique to each row
 		unset(
@@ -330,6 +308,7 @@ abstract class base implements \phpbb\notification\type\type_interface
 	* URL to unsubscribe to this notification (fall back)
 	*
 	* @param string|bool $method Method name to unsubscribe from (email|jabber|etc), False to unsubscribe from all notifications for this item
+	* @return false
 	*/
 	public function get_unsubscribe_url($method = false)
 	{
@@ -397,8 +376,11 @@ abstract class base implements \phpbb\notification\type\type_interface
 	}
 
 	/**
-	* Load the special items (fall back)
-	*/
+	 * Load the special items (fall back)
+	 *
+	 * @param array $data
+	 * @param array $notifications
+	 */
 	public function load_special($data, $notifications)
 	{
 		return;
@@ -415,10 +397,12 @@ abstract class base implements \phpbb\notification\type\type_interface
 	}
 
 	/**
-	* Pre create insert array function (fall back)
-	*
-	* @return array
-	*/
+	 * Pre create insert array function (fall back)
+	 *
+	 * @param array $type_data
+	 * @param array $notify_users
+	 * @return array
+	 */
 	public function pre_create_insert_array($type_data, $notify_users)
 	{
 		return array();
@@ -429,13 +413,13 @@ abstract class base implements \phpbb\notification\type\type_interface
 	*/
 
 	/**
-	* Find the users who want to receive notifications (helper)
-	*
-	* @param array $user_ids User IDs to check if they want to receive notifications
-	* 		(Bool False to check all users besides anonymous and bots (USER_IGNORE))
-	*
-	* @return array
-	*/
+	 * Find the users who want to receive notifications (helper)
+	 *
+	 * @param array|bool $user_ids User IDs to check if they want to receive notifications
+	 *                             (Bool False to check all users besides anonymous and bots (USER_IGNORE))
+	 * @param array      $options
+	 * @return array
+	 */
 	protected function check_user_notification_options($user_ids = false, $options = array())
 	{
 		$options = array_merge(array(
@@ -465,7 +449,7 @@ abstract class base implements \phpbb\notification\type\type_interface
 			return array();
 		}
 
-		$rowset = $resulting_user_ids = array();
+		$rowset = $output = array();
 
 		$sql = 'SELECT user_id, method, notify
 			FROM ' . $this->user_notifications_table . '
@@ -476,9 +460,7 @@ abstract class base implements \phpbb\notification\type\type_interface
 
 		while ($row = $this->db->sql_fetchrow($result))
 		{
-			$resulting_user_ids[] = $row['user_id'];
-
-			if (!$row['notify'] || (isset($options['ignore_users'][$row['user_id']]) && in_array($row['method'], $options['ignore_users'][$row['user_id']])))
+			if (isset($options['ignore_users'][$row['user_id']]) && in_array($row['method'], $options['ignore_users'][$row['user_id']]))
 			{
 				continue;
 			}
@@ -487,22 +469,47 @@ abstract class base implements \phpbb\notification\type\type_interface
 			{
 				$rowset[$row['user_id']] = array();
 			}
+			$rowset[$row['user_id']][$row['method']] = $row['notify'];
 
-			$rowset[$row['user_id']][] = $row['method'];
+			if (!isset($output[$row['user_id']]))
+			{
+				$output[$row['user_id']] = array();
+			}
+			if ($row['notify'])
+			{
+				$output[$row['user_id']][] = $row['method'];
+			}
 		}
 
 		$this->db->sql_freeresult($result);
 
+		$default_methods = $this->notification_manager->get_default_methods();
+
 		foreach ($user_ids as $user_id)
 		{
-			if (!in_array($user_id, $resulting_user_ids) && !isset($options['ignore_users'][$user_id]))
+			if (isset($options['ignore_users'][$user_id]))
+			{
+				continue;
+			}
+			if (!array_key_exists($user_id, $rowset))
+			{
+				// No rows at all for this user, use the default methods
+				$output[$user_id] = $default_methods;
+			}
+			else
 			{
-				// No rows at all for this user, default to ''
-				$rowset[$user_id] = array('');
+				foreach ($default_methods as $default_method)
+				{
+					if (!array_key_exists($default_method, $rowset[$user_id]))
+					{
+						// No user preference for this type recorded, but it should be enabled by default.
+						$output[$user_id][] = $default_method;
+					}
+				}
 			}
 		}
 
-		return $rowset;
+		return $output;
 	}
 
 	/**
@@ -516,22 +523,23 @@ abstract class base implements \phpbb\notification\type\type_interface
 	{
 		$this->notification_read = (bool) !$unread;
 
-		$where = array(
-			'notification_type_id = ' . (int) $this->notification_type_id,
-			'item_id = ' . (int) $this->item_id,
-			'user_id = ' . (int) $this->user_id,
-		);
-		$where = implode(' AND ', $where);
-
 		if ($return)
 		{
+			$where = array(
+				'notification_type_id = ' . (int) $this->notification_type_id,
+				'item_id = ' . (int) $this->item_id,
+				'user_id = ' . (int) $this->user_id,
+			);
+
+			$where = implode(' AND ', $where);
 			return $where;
 		}
+		else
+		{
+			$this->notification_manager->mark_notifications($this->get_type(), (int) $this->item_id, (int) $this->user_id, false, $this->notification_read);
+		}
 
-		$sql = 'UPDATE ' . $this->notifications_table . '
-			SET notification_read = ' . (int) $this->notification_read . '
-			WHERE ' . $where;
-		$this->db->sql_query($sql);
+		return null;
 	}
 
 	/**
--- a/phpbb/notification/type/bookmark.php
+++ b/phpbb/notification/type/bookmark.php
@@ -43,7 +43,7 @@ class bookmark extends \phpbb\notification\type\post
 	* @var bool|array False if the service should use it's default data
 	* 					Array of data (including keys 'id', 'lang', and 'group')
 	*/
-	public static $notification_option = array(
+	static public $notification_option = array(
 		'lang'	=> 'NOTIFICATION_TYPE_BOOKMARK',
 		'group'	=> 'NOTIFICATION_GROUP_POSTING',
 	);
@@ -91,31 +91,27 @@ class bookmark extends \phpbb\notification\type\post
 		}
 
 		// Try to find the users who already have been notified about replies and have not read the topic since and just update their notifications
-		$update_notifications = array();
-		$sql = 'SELECT n.*
-			FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
-			WHERE n.notification_type_id = ' . (int) $this->notification_type_id . '
-				AND n.item_parent_id = ' . (int) static::get_item_parent_id($post) . '
-				AND n.notification_read = 0
-				AND nt.notification_type_id = n.notification_type_id
-				AND nt.notification_type_enabled = 1';
-		$result = $this->db->sql_query($sql);
-		while ($row = $this->db->sql_fetchrow($result))
+		$notified_users = $this->notification_manager->get_notified_users($this->get_type(), array(
+			'item_parent_id'	=> static::get_item_parent_id($post),
+			'read'				=> 0,
+		));
+
+		foreach ($notified_users as $user => $notification_data)
 		{
-			// Do not create a new notification
-			unset($notify_users[$row['user_id']]);
+			unset($notify_users[$user]);
 
-			$notification = $this->notification_manager->get_item_type_class($this->get_type(), $row);
+			/** @var bookmark $notification */
+			$notification = $this->notification_manager->get_item_type_class($this->get_type(), $notification_data);
 			$update_responders = $notification->add_responders($post);
 			if (!empty($update_responders))
 			{
-				$sql = 'UPDATE ' . $this->notifications_table . '
-					SET ' . $this->db->sql_build_array('UPDATE', $update_responders) . '
-					WHERE notification_id = ' . $row['notification_id'];
-				$this->db->sql_query($sql);
+				$this->notification_manager->update_notification($notification, $update_responders, array(
+					'item_parent_id'	=> self::get_item_parent_id($post),
+					'read'				=> 0,
+					'user_id'			=> $user,
+				));
 			}
 		}
-		$this->db->sql_freeresult($result);
 
 		return $notify_users;
 	}
--- a/phpbb/notification/type/disapprove_post.php
+++ b/phpbb/notification/type/disapprove_post.php
@@ -60,7 +60,7 @@ class disapprove_post extends \phpbb\notification\type\approve_post
 	* @var bool|array False if the service should use it's default data
 	* 					Array of data (including keys 'id', 'lang', and 'group')
 	*/
-	public static $notification_option = array(
+	static public $notification_option = array(
 		'id'	=> 'moderation_queue',
 		'lang'	=> 'NOTIFICATION_TYPE_MODERATION_QUEUE',
 		'group'	=> 'NOTIFICATION_GROUP_POSTING',
@@ -73,7 +73,7 @@ class disapprove_post extends \phpbb\notification\type\approve_post
 	*/
 	public function get_title()
 	{
-		return $this->user->lang($this->language_key);
+		return $this->language->lang($this->language_key);
 	}
 
 	/**
@@ -83,7 +83,7 @@ class disapprove_post extends \phpbb\notification\type\approve_post
 	*/
 	public function get_reference()
 	{
-		return $this->user->lang(
+		return $this->language->lang(
 			'NOTIFICATION_REFERENCE',
 			censor_text($this->get_data('topic_title'))
 		);
@@ -96,7 +96,7 @@ class disapprove_post extends \phpbb\notification\type\approve_post
 	*/
 	public function get_reason()
 	{
-		return $this->user->lang(
+		return $this->language->lang(
 			'NOTIFICATION_REASON',
 			$this->get_data('disapprove_reason')
 		);
@@ -125,21 +125,24 @@ class disapprove_post extends \phpbb\notification\type\approve_post
 	}
 
 	/**
-	* Function for preparing the data for insertion in an SQL query
-	* (The service handles insertion)
-	*
-	* @param array $post Data from submit_post
-	* @param array $pre_create_data Data from pre_create_insert_array()
-	*
-	* @return array Array of data ready to be inserted into the database
+	* {@inheritdoc}
 	*/
 	public function create_insert_array($post, $pre_create_data = array())
 	{
 		$this->set_data('disapprove_reason', $post['disapprove_reason']);
 
-		$data = parent::create_insert_array($post);
+		parent::create_insert_array($post, $pre_create_data);
+
+		$this->notification_time = time();
+	}
 
-		$this->notification_time = $data['notification_time'] = time();
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_insert_array()
+	{
+		$data = parent::get_insert_array();
+		$data['notification_time'] = $this->notification_time;
 
 		return $data;
 	}
--- a/phpbb/notification/type/disapprove_topic.php
+++ b/phpbb/notification/type/disapprove_topic.php
@@ -60,7 +60,7 @@ class disapprove_topic extends \phpbb\notification\type\approve_topic
 	* @var bool|array False if the service should use it's default data
 	* 					Array of data (including keys 'id', 'lang', and 'group')
 	*/
-	public static $notification_option = array(
+	static public $notification_option = array(
 		'id'	=> 'moderation_queue',
 		'lang'	=> 'NOTIFICATION_TYPE_MODERATION_QUEUE',
 		'group'	=> 'NOTIFICATION_GROUP_POSTING',
@@ -73,7 +73,7 @@ class disapprove_topic extends \phpbb\notification\type\approve_topic
 	*/
 	public function get_title()
 	{
-		return $this->user->lang($this->language_key);
+		return $this->language->lang($this->language_key);
 	}
 
 	/**
@@ -83,7 +83,7 @@ class disapprove_topic extends \phpbb\notification\type\approve_topic
 	*/
 	public function get_reference()
 	{
-		return $this->user->lang(
+		return $this->language->lang(
 			'NOTIFICATION_REFERENCE',
 			censor_text($this->get_data('topic_title'))
 		);
@@ -96,7 +96,7 @@ class disapprove_topic extends \phpbb\notification\type\approve_topic
 	*/
 	public function get_reason()
 	{
-		return $this->user->lang(
+		return $this->language->lang(
 			'NOTIFICATION_REASON',
 			$this->get_data('disapprove_reason')
 		);
@@ -125,21 +125,24 @@ class disapprove_topic extends \phpbb\notification\type\approve_topic
 	}
 
 	/**
-	* Function for preparing the data for insertion in an SQL query
-	* (The service handles insertion)
-	*
-	* @param array $post Data from submit_post
-	* @param array $pre_create_data Data from pre_create_insert_array()
-	*
-	* @return array Array of data ready to be inserted into the database
+	* {@inheritdoc}
 	*/
 	public function create_insert_array($post, $pre_create_data = array())
 	{
 		$this->set_data('disapprove_reason', $post['disapprove_reason']);
 
-		$data = parent::create_insert_array($post, $pre_create_data);
+		parent::create_insert_array($post, $pre_create_data);
+
+		$this->notification_time = time();
+	}
 
-		$this->notification_time = $data['notification_time'] = time();
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_insert_array()
+	{
+		$data = parent::get_insert_array();
+		$data['notification_time'] = $this->notification_time;
 
 		return $data;
 	}
--- a/phpbb/notification/type/group_request.php
+++ b/phpbb/notification/type/group_request.php
@@ -26,10 +26,18 @@ class group_request extends \phpbb\notification\type\base
 	/**
 	* {@inheritdoc}
 	*/
-	public static $notification_option = array(
+	static public $notification_option = array(
 		'lang'	=> 'NOTIFICATION_TYPE_GROUP_REQUEST',
 	);
 
+	/** @var \phpbb\user_loader */
+	protected $user_loader;
+
+	public function set_user_loader(\phpbb\user_loader $user_loader)
+	{
+		$this->user_loader = $user_loader;
+	}
+
 	/**
 	* {@inheritdoc}
 	*/
@@ -50,7 +58,7 @@ class group_request extends \phpbb\notification\type\base
 	/**
 	* {@inheritdoc}
 	*/
-	public static function get_item_id($group)
+	static public function get_item_id($group)
 	{
 		return (int) $group['user_id'];
 	}
@@ -58,7 +66,7 @@ class group_request extends \phpbb\notification\type\base
 	/**
 	* {@inheritdoc}
 	*/
-	public static function get_item_parent_id($group)
+	static public function get_item_parent_id($group)
 	{
 		// Group id is the parent
 		return (int) $group['group_id'];
@@ -106,7 +114,7 @@ class group_request extends \phpbb\notification\type\base
 	{
 		$username = $this->user_loader->get_username($this->item_id, 'no_profile');
 
-		return $this->user->lang('NOTIFICATION_GROUP_REQUEST', $username, $this->get_data('group_name'));
+		return $this->language->lang('NOTIFICATION_GROUP_REQUEST', $username, $this->get_data('group_name'));
 	}
 
 	/**
@@ -156,6 +164,6 @@ class group_request extends \phpbb\notification\type\base
 	{
 		$this->set_data('group_name', $group['group_name']);
 
-		return parent::create_insert_array($group, $pre_create_data);
+		parent::create_insert_array($group, $pre_create_data);
 	}
 }
--- a/phpbb/notification/type/group_request_approved.php
+++ b/phpbb/notification/type/group_request_approved.php
@@ -34,7 +34,7 @@ class group_request_approved extends \phpbb\notification\type\base
 	/**
 	* {@inheritdoc}
 	*/
-	public static function get_item_id($group)
+	static public function get_item_id($group)
 	{
 		return (int) $group['group_id'];
 	}
@@ -42,7 +42,7 @@ class group_request_approved extends \phpbb\notification\type\base
 	/**
 	* {@inheritdoc}
 	*/
-	public static function get_item_parent_id($group)
+	static public function get_item_parent_id($group)
 	{
 		return 0;
 	}
@@ -58,7 +58,7 @@ class group_request_approved extends \phpbb\notification\type\base
 
 		foreach ($group['user_ids'] as $user_id)
 		{
-			$users[$user_id] = array('');
+			$users[$user_id] = $this->notification_manager->get_default_methods();
 		}
 
 		return $users;
@@ -69,7 +69,7 @@ class group_request_approved extends \phpbb\notification\type\base
 	*/
 	public function get_title()
 	{
-		return $this->user->lang('NOTIFICATION_GROUP_REQUEST_APPROVED', $this->get_data('group_name'));
+		return $this->language->lang('NOTIFICATION_GROUP_REQUEST_APPROVED', $this->get_data('group_name'));
 	}
 
 	/**
@@ -87,7 +87,7 @@ class group_request_approved extends \phpbb\notification\type\base
 	{
 		$this->set_data('group_name', $group['group_name']);
 
-		return parent::create_insert_array($group, $pre_create_data);
+		parent::create_insert_array($group, $pre_create_data);
 	}
 
 	/**
--- a/phpbb/notification/type/pm.php
+++ b/phpbb/notification/type/pm.php
@@ -36,10 +36,26 @@ class pm extends \phpbb\notification\type\base
 	* @var bool|array False if the service should use it's default data
 	* 					Array of data (including keys 'id', 'lang', and 'group')
 	*/
-	public static $notification_option = array(
+	static public $notification_option = array(
 		'lang'	=> 'NOTIFICATION_TYPE_PM',
 	);
 
+	/** @var \phpbb\user_loader */
+	protected $user_loader;
+
+	/** @var \phpbb\config\config */
+	protected $config;
+
+	public function set_config(\phpbb\config\config $config)
+	{
+		$this->config = $config;
+	}
+
+	public function set_user_loader(\phpbb\user_loader $user_loader)
+	{
+		$this->user_loader = $user_loader;
+	}
+
 	/**
 	* Is available
 	*/
@@ -53,7 +69,7 @@ class pm extends \phpbb\notification\type\base
 	*
 	* @param array $pm The data from the private message
 	*/
-	public static function get_item_id($pm)
+	static public function get_item_id($pm)
 	{
 		return (int) $pm['msg_id'];
 	}
@@ -63,7 +79,7 @@ class pm extends \phpbb\notification\type\base
 	*
 	* @param array $pm The data from the pm
 	*/
-	public static function get_item_parent_id($pm)
+	static public function get_item_parent_id($pm)
 	{
 		// No parent
 		return 0;
@@ -112,7 +128,7 @@ class pm extends \phpbb\notification\type\base
 	{
 		$username = $this->user_loader->get_username($this->get_data('from_user_id'), 'no_profile');
 
-		return $this->user->lang('NOTIFICATION_PM', $username);
+		return $this->language->lang('NOTIFICATION_PM', $username);
 	}
 
 	/**
@@ -122,7 +138,7 @@ class pm extends \phpbb\notification\type\base
 	*/
 	public function get_reference()
 	{
-		return $this->user->lang(
+		return $this->language->lang(
 			'NOTIFICATION_REFERENCE',
 			$this->get_data('message_subject')
 		);
@@ -176,13 +192,7 @@ class pm extends \phpbb\notification\type\base
 	}
 
 	/**
-	* Function for preparing the data for insertion in an SQL query
-	* (The service handles insertion)
-	*
-	* @param array $pm Data from submit_post
-	* @param array $pre_create_data Data from pre_create_insert_array()
-	*
-	* @return array Array of data ready to be inserted into the database
+	* {@inheritdoc}
 	*/
 	public function create_insert_array($pm, $pre_create_data = array())
 	{
@@ -190,6 +200,6 @@ class pm extends \phpbb\notification\type\base
 
 		$this->set_data('message_subject', $pm['message_subject']);
 
-		return parent::create_insert_array($pm, $pre_create_data);
+		parent::create_insert_array($pm, $pre_create_data);
 	}
 }
--- a/phpbb/notification/type/post.php
+++ b/phpbb/notification/type/post.php
@@ -50,11 +50,27 @@ class post extends \phpbb\notification\type\base
 	* @var bool|array False if the service should use it's default data
 	* 					Array of data (including keys 'id', 'lang', and 'group')
 	*/
-	public static $notification_option = array(
+	static public $notification_option = array(
 		'lang'	=> 'NOTIFICATION_TYPE_POST',
 		'group'	=> 'NOTIFICATION_GROUP_POSTING',
 	);
 
+	/** @var \phpbb\user_loader */
+	protected $user_loader;
+
+	/** @var \phpbb\config\config */
+	protected $config;
+
+	public function set_config(\phpbb\config\config $config)
+	{
+		$this->config = $config;
+	}
+
+	public function set_user_loader(\phpbb\user_loader $user_loader)
+	{
+		$this->user_loader = $user_loader;
+	}
+
 	/**
 	* Is available
 	*/
@@ -67,8 +83,9 @@ class post extends \phpbb\notification\type\base
 	* Get the id of the item
 	*
 	* @param array $post The data from the post
+	* @return int The post id
 	*/
-	public static function get_item_id($post)
+	static public function get_item_id($post)
 	{
 		return (int) $post['post_id'];
 	}
@@ -77,8 +94,9 @@ class post extends \phpbb\notification\type\base
 	* Get the id of the parent
 	*
 	* @param array $post The data from the post
+	* @return int The topic id
 	*/
-	public static function get_item_parent_id($post)
+	static public function get_item_parent_id($post)
 	{
 		return (int) $post['topic_id'];
 	}
@@ -131,31 +149,27 @@ class post extends \phpbb\notification\type\base
 		}
 
 		// Try to find the users who already have been notified about replies and have not read the topic since and just update their notifications
-		$update_notifications = array();
-		$sql = 'SELECT n.*
-			FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
-			WHERE n.notification_type_id = ' . (int) $this->notification_type_id . '
-				AND n.item_parent_id = ' . (int) static::get_item_parent_id($post) . '
-				AND n.notification_read = 0
-				AND nt.notification_type_id = n.notification_type_id
-				AND nt.notification_type_enabled = 1';
-		$result = $this->db->sql_query($sql);
-		while ($row = $this->db->sql_fetchrow($result))
+		$notified_users = $this->notification_manager->get_notified_users($this->get_type(), array(
+			'item_parent_id'	=> static::get_item_parent_id($post),
+			'read'				=> 0,
+		));
+
+		foreach ($notified_users as $user => $notification_data)
 		{
-			// Do not create a new notification
-			unset($notify_users[$row['user_id']]);
+			unset($notify_users[$user]);
 
-			$notification = $this->notification_manager->get_item_type_class($this->get_type(), $row);
+			/** @var post $notification */
+			$notification = $this->notification_manager->get_item_type_class($this->get_type(), $notification_data);
 			$update_responders = $notification->add_responders($post);
 			if (!empty($update_responders))
 			{
-				$sql = 'UPDATE ' . $this->notifications_table . '
-					SET ' . $this->db->sql_build_array('UPDATE', $update_responders) . '
-					WHERE notification_id = ' . $row['notification_id'];
-				$this->db->sql_query($sql);
+				$this->notification_manager->update_notification($notification, $update_responders, array(
+					'item_parent_id'	=> self::get_item_parent_id($post),
+					'read'				=> 0,
+					'user_id'			=> $user,
+				));
 			}
 		}
-		$this->db->sql_freeresult($result);
 
 		return $notify_users;
 	}
@@ -206,14 +220,14 @@ class post extends \phpbb\notification\type\base
 
 		if ($trimmed_responders_cnt > 20)
 		{
-			$usernames[] = $this->user->lang('NOTIFICATION_MANY_OTHERS');
+			$usernames[] = $this->language->lang('NOTIFICATION_MANY_OTHERS');
 		}
 		else if ($trimmed_responders_cnt)
 		{
-			$usernames[] = $this->user->lang('NOTIFICATION_X_OTHERS', $trimmed_responders_cnt);
+			$usernames[] = $this->language->lang('NOTIFICATION_X_OTHERS', $trimmed_responders_cnt);
 		}
 
-		return $this->user->lang(
+		return $this->language->lang(
 			$this->language_key,
 			phpbb_generate_string_list($usernames, $this->user),
 			$responders_cnt
@@ -227,7 +241,7 @@ class post extends \phpbb\notification\type\base
 	*/
 	public function get_reference()
 	{
-		return $this->user->lang(
+		return $this->language->lang(
 			'NOTIFICATION_REFERENCE',
 			censor_text($this->get_data('topic_title'))
 		);
@@ -363,13 +377,7 @@ class post extends \phpbb\notification\type\base
 	}
 
 	/**
-	* Function for preparing the data for insertion in an SQL query
-	* (The service handles insertion)
-	*
-	* @param array $post Data from submit_post
-	* @param array $pre_create_data Data from pre_create_insert_array()
-	*
-	* @return array Array of data ready to be inserted into the database
+	* {@inheritdoc}
 	*/
 	public function create_insert_array($post, $pre_create_data = array())
 	{
@@ -394,13 +402,14 @@ class post extends \phpbb\notification\type\base
 			$this->notification_read = true;
 		}
 
-		return parent::create_insert_array($post, $pre_create_data);
+		parent::create_insert_array($post, $pre_create_data);
 	}
 
 	/**
 	* Add responders to the notification
 	*
 	* @param mixed $post
+	* @return array Array of responder data
 	*/
 	public function add_responders($post)
 	{
@@ -447,6 +456,12 @@ class post extends \phpbb\notification\type\base
 			return array();
 		}
 
-		return array('notification_data' => $serialized_data);
+		$data_array = array_merge(array(
+			'post_time'		=> $post['post_time'],
+			'post_id'		=> $post['post_id'],
+			'topic_id'		=> $post['topic_id']
+		), $this->get_data(false));
+
+		return $data_array;
 	}
 }
--- a/phpbb/notification/type/post_in_queue.php
+++ b/phpbb/notification/type/post_in_queue.php
@@ -43,7 +43,7 @@ class post_in_queue extends \phpbb\notification\type\post
 	* @var bool|array False if the service should use it's default data
 	* 					Array of data (including keys 'id', 'lang', and 'group')
 	*/
-	public static $notification_option = array(
+	static public $notification_option = array(
 		'id'	=> 'notification.type.needs_approval',
 		'lang'	=> 'NOTIFICATION_TYPE_IN_MODERATION_QUEUE',
 		'group'	=> 'NOTIFICATION_GROUP_MODERATION',
@@ -131,19 +131,22 @@ class post_in_queue extends \phpbb\notification\type\post
 	}
 
 	/**
-	* Function for preparing the data for insertion in an SQL query
-	* (The service handles insertion)
-	*
-	* @param array $post Data from submit_post
-	* @param array $pre_create_data Data from pre_create_insert_array()
-	*
-	* @return array Array of data ready to be inserted into the database
+	* {@inheritdoc}
 	*/
 	public function create_insert_array($post, $pre_create_data = array())
 	{
-		$data = parent::create_insert_array($post, $pre_create_data);
+		parent::create_insert_array($post, $pre_create_data);
+
+		$this->notification_time = time();
+	}
 
-		$this->notification_time = $data['notification_time'] = time();
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_insert_array()
+	{
+		$data = parent::get_insert_array();
+		$data['notification_time'] = $this->notification_time;
 
 		return $data;
 	}
--- a/phpbb/notification/type/quote.php
+++ b/phpbb/notification/type/quote.php
@@ -20,6 +20,11 @@ namespace phpbb\notification\type;
 
 class quote extends \phpbb\notification\type\post
 {
+	/**
+	* @var \phpbb\textformatter\utils_interface
+	*/
+	protected $utils;
+
 	/**
 	* Get notification type name
 	*
@@ -30,13 +35,6 @@ class quote extends \phpbb\notification\type\post
 		return 'notification.type.quote';
 	}
 
-	/**
-	* regular expression to match to find usernames
-	*
-	* @var string
-	*/
-	protected static $regular_expression_match = '#\[quote=&quot;(.+?)&quot;#';
-
 	/**
 	* Language key used to output the text
 	*
@@ -50,7 +48,7 @@ class quote extends \phpbb\notification\type\post
 	* @var bool|array False if the service should use it's default data
 	* 					Array of data (including keys 'id', 'lang', and 'group')
 	*/
-	public static $notification_option = array(
+	static public $notification_option = array(
 		'lang'	=> 'NOTIFICATION_TYPE_QUOTE',
 		'group'	=> 'NOTIFICATION_GROUP_POSTING',
 	);
@@ -77,17 +75,16 @@ class quote extends \phpbb\notification\type\post
 			'ignore_users'		=> array(),
 		), $options);
 
-		$usernames = false;
-		preg_match_all(static::$regular_expression_match, $post['post_text'], $usernames);
+		$usernames = $this->utils->get_outermost_quote_authors($post['post_text']);
 
-		if (empty($usernames[1]))
+		if (empty($usernames))
 		{
 			return array();
 		}
 
-		$usernames[1] = array_unique($usernames[1]);
+		$usernames = array_unique($usernames);
 
-		$usernames = array_map('utf8_clean_string', $usernames[1]);
+		$usernames = array_map('utf8_clean_string', $usernames);
 
 		$users = array();
 
@@ -109,32 +106,23 @@ class quote extends \phpbb\notification\type\post
 	* Update a notification
 	*
 	* @param array $post Data specific for this type that will be updated
+	* @return true
 	*/
 	public function update_notifications($post)
 	{
-		$old_notifications = array();
-		$sql = 'SELECT n.user_id
-			FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
-			WHERE n.notification_type_id = ' . (int) $this->notification_type_id . '
-				AND n.item_id = ' . static::get_item_id($post) . '
-				AND nt.notification_type_id = n.notification_type_id
-				AND nt.notification_type_enabled = 1';
-		$result = $this->db->sql_query($sql);
-		while ($row = $this->db->sql_fetchrow($result))
-		{
-			$old_notifications[] = $row['user_id'];
-		}
-		$this->db->sql_freeresult($result);
+		$old_notifications = $this->notification_manager->get_notified_users($this->get_type(), array(
+			'item_id'	=> static::get_item_id($post),
+		));
 
 		// Find the new users to notify
 		$notifications = $this->find_users_for_notification($post);
 
 		// Find the notifications we must delete
-		$remove_notifications = array_diff($old_notifications, array_keys($notifications));
+		$remove_notifications = array_diff(array_keys($old_notifications), array_keys($notifications));
 
 		// Find the notifications we must add
 		$add_notifications = array();
-		foreach (array_diff(array_keys($notifications), $old_notifications) as $user_id)
+		foreach (array_diff(array_keys($notifications), array_keys($old_notifications)) as $user_id)
 		{
 			$add_notifications[$user_id] = $notifications[$user_id];
 		}
@@ -145,11 +133,7 @@ class quote extends \phpbb\notification\type\post
 		// Remove the necessary notifications
 		if (!empty($remove_notifications))
 		{
-			$sql = 'DELETE FROM ' . $this->notifications_table . '
-				WHERE notification_type_id = ' . (int) $this->notification_type_id . '
-					AND item_id = ' . static::get_item_id($post) . '
-					AND ' . $this->db->sql_in_set('user_id', $remove_notifications);
-			$this->db->sql_query($sql);
+			$this->notification_manager->delete_notifications($this->get_type(), static::get_item_id($post), false, $remove_notifications);
 		}
 
 		// return true to continue with the update code in the notifications service (this will update the rest of the notifications)
@@ -187,4 +171,14 @@ class quote extends \phpbb\notification\type\post
 			'AUTHOR_NAME'		=> htmlspecialchars_decode($user_data['username']),
 		));
 	}
+
+	/**
+	* Set the utils service used to retrieve quote authors
+	*
+	* @param \phpbb\textformatter\utils_interface $utils
+	*/
+	public function set_utils(\phpbb\textformatter\utils_interface $utils)
+	{
+		$this->utils = $utils;
+	}
 }
--- a/phpbb/notification/type/report_pm.php
+++ b/phpbb/notification/type/report_pm.php
@@ -52,7 +52,7 @@ class report_pm extends \phpbb\notification\type\pm
 	*
 	* @var string Permission name
 	*/
-	protected $permission = 'm_report';
+	protected $permission = 'm_pm_report';
 
 	/**
 	* Notification option data (for outputting to the user)
@@ -60,7 +60,7 @@ class report_pm extends \phpbb\notification\type\pm
 	* @var bool|array False if the service should use it's default data
 	* 					Array of data (including keys 'id', 'lang', and 'group')
 	*/
-	public static $notification_option = array(
+	static public $notification_option = array(
 		'id'	=> 'notification.type.report',
 		'lang'	=> 'NOTIFICATION_TYPE_REPORT',
 		'group'	=> 'NOTIFICATION_GROUP_MODERATION',
@@ -70,8 +70,9 @@ class report_pm extends \phpbb\notification\type\pm
 	* Get the id of the parent
 	*
 	* @param array $pm The data from the pm
+	* @return int The report id
 	*/
-	public static function get_item_parent_id($pm)
+	static public function get_item_parent_id($pm)
 	{
 		return (int) $pm['report_id'];
 	}
@@ -141,11 +142,13 @@ class report_pm extends \phpbb\notification\type\pm
 	*/
 	public function get_email_template_variables()
 	{
+		$user_data = $this->user_loader->get_user($this->get_data('reporter_id'));
+
 		return array(
-			'AUTHOR_NAME'				=> htmlspecialchars_decode($user_data['username']),
-			'SUBJECT'					=> htmlspecialchars_decode(censor_text($this->get_data('message_subject'))),
+			'AUTHOR_NAME'	=> htmlspecialchars_decode($user_data['username']),
+			'SUBJECT'		=> htmlspecialchars_decode(censor_text($this->get_data('message_subject'))),
 
-			'U_VIEW_REPORT'				=> generate_board_url() . "mcp.{$this->php_ext}?r={$this->item_parent_id}&amp;i=pm_reports&amp;mode=pm_report_details",
+			'U_VIEW_REPORT'	=> generate_board_url() . "mcp.{$this->php_ext}?r={$this->item_parent_id}&amp;i=pm_reports&amp;mode=pm_report_details",
 		);
 	}
 
@@ -166,11 +169,11 @@ class report_pm extends \phpbb\notification\type\pm
 	*/
 	public function get_title()
 	{
-		$this->user->add_lang('mcp');
+		$this->language->add_lang('mcp');
 
 		$username = $this->user_loader->get_username($this->get_data('reporter_id'), 'no_profile');
 
-		return $this->user->lang(
+		return $this->language->lang(
 			$this->language_key,
 			$username
 		);
@@ -183,7 +186,7 @@ class report_pm extends \phpbb\notification\type\pm
 	*/
 	public function get_reference()
 	{
-		return $this->user->lang(
+		return $this->language->lang(
 			'NOTIFICATION_REFERENCE',
 			censor_text($this->get_data('message_subject'))
 		);
@@ -198,21 +201,21 @@ class report_pm extends \phpbb\notification\type\pm
 	{
 		if ($this->get_data('report_text'))
 		{
-			return $this->user->lang(
+			return $this->language->lang(
 				'NOTIFICATION_REASON',
 				$this->get_data('report_text')
 			);
 		}
 
-		if (isset($this->user->lang[$this->get_data('reason_title')]))
+		if ($this->language->is_set($this->get_data('reason_title')))
 		{
-			return $this->user->lang(
+			return $this->language->lang(
 				'NOTIFICATION_REASON',
-				$this->user->lang[$this->get_data('reason_title')]
+				$this->language->lang($this->get_data('reason_title'))
 			);
 		}
 
-		return $this->user->lang(
+		return $this->language->lang(
 			'NOTIFICATION_REASON',
 			$this->get_data('reason_description')
 		);
@@ -237,13 +240,7 @@ class report_pm extends \phpbb\notification\type\pm
 	}
 
 	/**
-	* Function for preparing the data for insertion in an SQL query
-	* (The service handles insertion)
-	*
-	* @param array $post Data from submit_post
-	* @param array $pre_create_data Data from pre_create_insert_array()
-	*
-	* @return array Array of data ready to be inserted into the database
+	* {@inheritdoc}
 	*/
 	public function create_insert_array($post, $pre_create_data = array())
 	{
@@ -252,6 +249,6 @@ class report_pm extends \phpbb\notification\type\pm
 		$this->set_data('reason_description', $post['reason_description']);
 		$this->set_data('report_text', $post['report_text']);
 
-		return parent::create_insert_array($post, $pre_create_data);
+		parent::create_insert_array($post, $pre_create_data);
 	}
 }
--- a/phpbb/notification/type/report_pm_closed.php
+++ b/phpbb/notification/type/report_pm_closed.php
@@ -64,7 +64,7 @@ class report_pm_closed extends \phpbb\notification\type\pm
 			return array();
 		}
 
-		return array($pm['reporter'] => array(''));
+		return array($pm['reporter'] => $this->notification_manager->get_default_methods());
 	}
 
 	/**
@@ -106,7 +106,7 @@ class report_pm_closed extends \phpbb\notification\type\pm
 	{
 		$username = $this->user_loader->get_username($this->get_data('closer_id'), 'no_profile');
 
-		return $this->user->lang(
+		return $this->language->lang(
 			$this->language_key,
 			$username
 		);
@@ -119,7 +119,7 @@ class report_pm_closed extends \phpbb\notification\type\pm
 	*/
 	public function get_reference()
 	{
-		return $this->user->lang(
+		return $this->language->lang(
 			'NOTIFICATION_REFERENCE',
 			censor_text($this->get_data('message_subject'))
 		);
@@ -144,21 +144,24 @@ class report_pm_closed extends \phpbb\notification\type\pm
 	}
 
 	/**
-	* Function for preparing the data for insertion in an SQL query
-	* (The service handles insertion)
-	*
-	* @param array $pm PM Data
-	* @param array $pre_create_data Data from pre_create_insert_array()
-	*
-	* @return array Array of data ready to be inserted into the database
+	* {@inheritdoc}
 	*/
 	public function create_insert_array($pm, $pre_create_data = array())
 	{
 		$this->set_data('closer_id', $pm['closer_id']);
 
-		$data = parent::create_insert_array($pm, $pre_create_data);
+		parent::create_insert_array($pm, $pre_create_data);
+
+		$this->notification_time = time();
+	}
 
-		$this->notification_time = $data['notification_time'] = time();
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_insert_array()
+	{
+		$data = parent::get_insert_array();
+		$data['notification_time'] = $this->notification_time;
 
 		return $data;
 	}
--- a/phpbb/notification/type/report_post.php
+++ b/phpbb/notification/type/report_post.php
@@ -66,7 +66,7 @@ class report_post extends \phpbb\notification\type\post_in_queue
 	* @var bool|array False if the service should use it's default data
 	* 					Array of data (including keys 'id' and 'lang')
 	*/
-	public static $notification_option = array(
+	static public $notification_option = array(
 		'id'	=> 'notification.type.report',
 		'lang'	=> 'NOTIFICATION_TYPE_REPORT',
 		'group'	=> 'NOTIFICATION_GROUP_MODERATION',
@@ -139,11 +139,11 @@ class report_post extends \phpbb\notification\type\post_in_queue
 	*/
 	public function get_title()
 	{
-		$this->user->add_lang('mcp');
+		$this->language->add_lang('mcp');
 
 		$username = $this->user_loader->get_username($this->get_data('reporter_id'), 'no_profile');
 
-		return $this->user->lang(
+		return $this->language->lang(
 			$this->language_key,
 			$username
 		);
@@ -156,7 +156,7 @@ class report_post extends \phpbb\notification\type\post_in_queue
 	*/
 	public function get_reference()
 	{
-		return $this->user->lang(
+		return $this->language->lang(
 			'NOTIFICATION_REFERENCE',
 			censor_text($this->get_data('post_subject'))
 		);
@@ -171,21 +171,21 @@ class report_post extends \phpbb\notification\type\post_in_queue
 	{
 		if ($this->get_data('report_text'))
 		{
-			return $this->user->lang(
+			return $this->language->lang(
 				'NOTIFICATION_REASON',
 				$this->get_data('report_text')
 			);
 		}
 
-		if (isset($this->user->lang[$this->get_data('reason_title')]))
+		if ($this->language->is_set($this->get_data('reason_title')))
 		{
-			return $this->user->lang(
+			return $this->language->lang(
 				'NOTIFICATION_REASON',
-				$this->user->lang[$this->get_data('reason_title')]
+				$this->language->lang($this->get_data('reason_title'))
 			);
 		}
 
-		return $this->user->lang(
+		return $this->language->lang(
 			'NOTIFICATION_REASON',
 			$this->get_data('reason_description')
 		);
@@ -210,13 +210,7 @@ class report_post extends \phpbb\notification\type\post_in_queue
 	}
 
 	/**
-	* Function for preparing the data for insertion in an SQL query
-	* (The service handles insertion)
-	*
-	* @param array $post Data from submit_post
-	* @param array $pre_create_data Data from pre_create_insert_array()
-	*
-	* @return array Array of data ready to be inserted into the database
+	* {@inheritdoc}
 	*/
 	public function create_insert_array($post, $pre_create_data = array())
 	{
@@ -225,6 +219,6 @@ class report_post extends \phpbb\notification\type\post_in_queue
 		$this->set_data('reason_description', $post['reason_description']);
 		$this->set_data('report_text', $post['report_text']);
 
-		return parent::create_insert_array($post, $pre_create_data);
+		parent::create_insert_array($post, $pre_create_data);
 	}
 }
--- a/phpbb/notification/type/report_post_closed.php
+++ b/phpbb/notification/type/report_post_closed.php
@@ -71,7 +71,7 @@ class report_post_closed extends \phpbb\notification\type\post
 			return array();
 		}
 
-		return array($post['reporter'] => array(''));
+		return array($post['reporter'] => $this->notification_manager->get_default_methods());
 	}
 
 	/**
@@ -113,7 +113,7 @@ class report_post_closed extends \phpbb\notification\type\post
 	{
 		$username = $this->user_loader->get_username($this->get_data('closer_id'), 'no_profile');
 
-		return $this->user->lang(
+		return $this->language->lang(
 			$this->language_key,
 			$username
 		);
@@ -126,7 +126,7 @@ class report_post_closed extends \phpbb\notification\type\post
 	*/
 	public function get_reference()
 	{
-		return $this->user->lang(
+		return $this->language->lang(
 			'NOTIFICATION_REFERENCE',
 			censor_text($this->get_data('post_subject'))
 		);
@@ -151,21 +151,24 @@ class report_post_closed extends \phpbb\notification\type\post
 	}
 
 	/**
-	* Function for preparing the data for insertion in an SQL query
-	* (The service handles insertion)
-	*
-	* @param array $post Data from submit_post
-	* @param array $pre_create_data Data from pre_create_insert_array()
-	*
-	* @return array Array of data ready to be inserted into the database
+	* {@inheritdoc}
 	*/
 	public function create_insert_array($post, $pre_create_data = array())
 	{
 		$this->set_data('closer_id', $post['closer_id']);
 
-		$data = parent::create_insert_array($post, $pre_create_data);
+		parent::create_insert_array($post, $pre_create_data);
+
+		$this->notification_time = time();
+	}
 
-		$this->notification_time = $data['notification_time'] = time();
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_insert_array()
+	{
+		$data = parent::get_insert_array();
+		$data['notification_time'] = $this->notification_time;
 
 		return $data;
 	}
--- a/phpbb/notification/type/topic.php
+++ b/phpbb/notification/type/topic.php
@@ -50,11 +50,27 @@ class topic extends \phpbb\notification\type\base
 	* @var bool|array False if the service should use it's default data
 	* 					Array of data (including keys 'id', 'lang', and 'group')
 	*/
-	public static $notification_option = array(
+	static public $notification_option = array(
 		'lang'	=> 'NOTIFICATION_TYPE_TOPIC',
 		'group'	=> 'NOTIFICATION_GROUP_POSTING',
 	);
 
+	/** @var \phpbb\user_loader */
+	protected $user_loader;
+
+	/** @var \phpbb\config\config */
+	protected $config;
+
+	public function set_config(\phpbb\config\config $config)
+	{
+		$this->config = $config;
+	}
+
+	public function set_user_loader(\phpbb\user_loader $user_loader)
+	{
+		$this->user_loader = $user_loader;
+	}
+
 	/**
 	* Is available
 	*/
@@ -67,8 +83,9 @@ class topic extends \phpbb\notification\type\base
 	* Get the id of the item
 	*
 	* @param array $post The data from the post
+	* @return int The topic id
 	*/
-	public static function get_item_id($post)
+	static public function get_item_id($post)
 	{
 		return (int) $post['topic_id'];
 	}
@@ -77,8 +94,9 @@ class topic extends \phpbb\notification\type\base
 	* Get the id of the parent
 	*
 	* @param array $post The data from the post
+	* @return int The forum id
 	*/
-	public static function get_item_parent_id($post)
+	static public function get_item_parent_id($post)
 	{
 		return (int) $post['forum_id'];
 	}
@@ -138,7 +156,7 @@ class topic extends \phpbb\notification\type\base
 			$username = $this->user_loader->get_username($this->get_data('poster_id'), 'no_profile');
 		}
 
-		return $this->user->lang(
+		return $this->language->lang(
 			$this->language_key,
 			$username
 		);
@@ -151,7 +169,7 @@ class topic extends \phpbb\notification\type\base
 	*/
 	public function get_reference()
 	{
-		return $this->user->lang(
+		return $this->language->lang(
 			'NOTIFICATION_REFERENCE',
 			censor_text($this->get_data('topic_title'))
 		);
@@ -164,7 +182,7 @@ class topic extends \phpbb\notification\type\base
 	*/
 	public function get_forum()
 	{
-		return $this->user->lang(
+		return $this->language->lang(
 			'NOTIFICATION_FORUM',
 			$this->get_data('forum_name')
 		);
@@ -263,13 +281,7 @@ class topic extends \phpbb\notification\type\base
 	}
 
 	/**
-	* Function for preparing the data for insertion in an SQL query
-	* (The service handles insertion)
-	*
-	* @param array $post Data from submit_post
-	* @param array $pre_create_data Data from pre_create_insert_array()
-	*
-	* @return array Array of data ready to be inserted into the database
+	* {@inheritdoc}
 	*/
 	public function create_insert_array($post, $pre_create_data = array())
 	{
@@ -290,6 +302,6 @@ class topic extends \phpbb\notification\type\base
 			$this->notification_read = true;
 		}
 
-		return parent::create_insert_array($post, $pre_create_data);
+		parent::create_insert_array($post, $pre_create_data);
 	}
 }
--- a/phpbb/notification/type/topic_in_queue.php
+++ b/phpbb/notification/type/topic_in_queue.php
@@ -43,7 +43,7 @@ class topic_in_queue extends \phpbb\notification\type\topic
 	* @var bool|array False if the service should use it's default data
 	* 					Array of data (including keys 'id', 'lang', and 'group')
 	*/
-	public static $notification_option = array(
+	static public $notification_option = array(
 		'id'	=> 'notification.type.needs_approval',
 		'lang'	=> 'NOTIFICATION_TYPE_IN_MODERATION_QUEUE',
 		'group'	=> 'NOTIFICATION_GROUP_MODERATION',
@@ -123,19 +123,22 @@ class topic_in_queue extends \phpbb\notification\type\topic
 	}
 
 	/**
-	* Function for preparing the data for insertion in an SQL query
-	* (The service handles insertion)
-	*
-	* @param array $topic Data from submit_post
-	* @param array $pre_create_data Data from pre_create_insert_array()
-	*
-	* @return array Array of data ready to be inserted into the database
+	* {@inheritdoc}
 	*/
 	public function create_insert_array($topic, $pre_create_data = array())
 	{
-		$data = parent::create_insert_array($topic, $pre_create_data);
+		parent::create_insert_array($topic, $pre_create_data);
+
+		$this->notification_time = time();
+	}
 
-		$this->notification_time = $data['notification_time'] = time();
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_insert_array()
+	{
+		$data = parent::get_insert_array();
+		$data['notification_time'] = $this->notification_time;
 
 		return $data;
 	}
--- a/phpbb/notification/type/type_interface.php
+++ b/phpbb/notification/type/type_interface.php
@@ -37,14 +37,14 @@ interface type_interface
 	*
 	* @param array $type_data The type specific data
 	*/
-	public static function get_item_id($type_data);
+	static public function get_item_id($type_data);
 
 	/**
 	* Get the id of the parent
 	*
 	* @param array $type_data The type specific data
 	*/
-	public static function get_item_parent_id($type_data);
+	static public function get_item_parent_id($type_data);
 
 	/**
 	* Is this type available to the current user (defines whether or not it will be shown in the UCP Edit notification options)
@@ -177,14 +177,18 @@ interface type_interface
 
 	/**
 	* Function for preparing the data for insertion in an SQL query
-	* (The service handles insertion)
 	*
 	* @param array $type_data The type specific data
 	* @param array $pre_create_data Data from pre_create_insert_array()
+	*/
+	public function create_insert_array($type_data, $pre_create_data);
+
+	/**
+	* Function for getting the data for insertion in an SQL query
 	*
 	* @return array Array of data ready to be inserted into the database
 	*/
-	public function create_insert_array($type_data, $pre_create_data);
+	public function get_insert_array();
 
 	/**
 	* Function for preparing the data for update in an SQL query
@@ -202,7 +206,7 @@ interface type_interface
 	* @param bool $return True to return a string containing the SQL code to update this item, False to execute it (Default: False)
 	* @return string
 	*/
-	public function mark_read($return);
+	public function mark_read($return = false);
 
 	/**
 	* Mark this item unread
@@ -210,5 +214,5 @@ interface type_interface
 	* @param bool $return True to return a string containing the SQL code to update this item, False to execute it (Default: False)
 	* @return string
 	*/
-	public function mark_unread($return);
+	public function mark_unread($return = false);
 }
--- a/phpbb/passwords/driver/base.php
+++ b/phpbb/passwords/driver/base.php
@@ -13,7 +13,7 @@
 
 namespace phpbb\passwords\driver;
 
-abstract class base implements driver_interface
+abstract class base implements rehashable_driver_interface
 {
 	/** @var \phpbb\config\config */
 	protected $config;
@@ -21,7 +21,7 @@ abstract class base implements driver_interface
 	/** @var \phpbb\passwords\driver\helper */
 	protected $helper;
 
-	/** @var driver name */
+	/** @var string Driver name */
 	protected $name;
 
 	/**
@@ -52,6 +52,14 @@ abstract class base implements driver_interface
 		return false;
 	}
 
+	/**
+	 * {@inheritdoc}
+	 */
+	public function needs_rehash($hash)
+	{
+		return false;
+	}
+
 	/**
 	* {@inheritdoc}
 	*/
--- a/phpbb/passwords/driver/bcrypt.php
+++ b/phpbb/passwords/driver/bcrypt.php
@@ -17,6 +17,24 @@ class bcrypt extends base
 {
 	const PREFIX = '$2a$';
 
+	/** @var int Hashing cost factor */
+	protected $cost_factor;
+
+	/**
+	 * Constructor of passwords driver object
+	 *
+	 * @param \phpbb\config\config $config phpBB config
+	 * @param \phpbb\passwords\driver\helper $helper Password driver helper
+	 * @param int $cost_factor Hashing cost factor (optional)
+	 */
+	public function __construct(\phpbb\config\config $config, helper $helper, $cost_factor = 10)
+	{
+		parent::__construct($config, $helper);
+
+		// Don't allow cost factor to be below default setting
+		$this->cost_factor = max(10, $cost_factor);
+	}
+
 	/**
 	* {@inheritdoc}
 	*/
@@ -25,6 +43,18 @@ class bcrypt extends base
 		return self::PREFIX;
 	}
 
+	/**
+	 * {@inheritdoc}
+	 */
+	public function needs_rehash($hash)
+	{
+		preg_match('/^' . preg_quote($this->get_prefix()) . '([0-9]+)\$/', $hash, $matches);
+
+		list(, $cost_factor) = $matches;
+
+		return empty($cost_factor) || $this->cost_factor !== intval($cost_factor);
+	}
+
 	/**
 	* {@inheritdoc}
 	*/
@@ -46,7 +76,7 @@ class bcrypt extends base
 
 		if ($salt == '')
 		{
-			$salt = $prefix . '10$' . $this->get_random_salt();
+			$salt = $prefix . $this->cost_factor . '$' . $this->get_random_salt();
 		}
 
 		$hash = crypt($password, $salt);
--- /dev/null
+++ b/phpbb/passwords/driver/rehashable_driver_interface.php
@@ -0,0 +1,25 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\passwords\driver;
+
+interface rehashable_driver_interface extends driver_interface
+{
+	/**
+	 * Check if password needs to be rehashed
+	 *
+	 * @param string $hash Hash to check for rehash
+	 * @return bool True if password needs to be rehashed, false if not
+	 */
+	public function needs_rehash($hash);
+}
--- a/phpbb/passwords/manager.php
+++ b/phpbb/passwords/manager.php
@@ -49,22 +49,48 @@ class manager
 	*/
 	protected $config;
 
+	/**
+	 * @var bool Whether or not initialized() has been called
+	 */
+	private $initialized = false;
+
+	/**
+	 * @var array Hashing driver service collection
+	 */
+	private $hashing_algorithms;
+
+	/**
+	 * @var array List of default driver types
+	 */
+	private $defaults;
+
 	/**
 	* Construct a passwords object
 	*
-	* @param \phpbb\config\config $config phpBB configuration
-	* @param array $hashing_algorithms Hashing driver
-	*			service collection
-	* @param \phpbb\passwords\helper $helper Passwords helper object
-	* @param array $defaults List of default driver types
+	* @param \phpbb\config\config		$config				phpBB configuration
+	* @param array						$hashing_algorithms	Hashing driver service collection
+	* @param \phpbb\passwords\helper	$helper				Passwords helper object
+	* @param array						$defaults			List of default driver types
 	*/
 	public function __construct(\phpbb\config\config $config, $hashing_algorithms, helper $helper, $defaults)
 	{
 		$this->config = $config;
 		$this->helper = $helper;
+		$this->hashing_algorithms = $hashing_algorithms;
+		$this->defaults = $defaults;
+	}
 
-		$this->fill_type_map($hashing_algorithms);
-		$this->register_default_type($defaults);
+	/**
+	 * Initialize the internal state
+	 */
+	protected function initialize()
+	{
+		if (!$this->initialized)
+		{
+			$this->initialized = true;
+			$this->fill_type_map($this->hashing_algorithms);
+			$this->register_default_type($this->defaults);
+		}
 	}
 
 	/**
@@ -144,9 +170,11 @@ class manager
 			return false;
 		}
 
+		$this->initialize();
+
 		// Be on the lookout for multiple hashing algorithms
 		// 2 is correct: H\2a > 2, H\P > 2
-		if (strlen($match[1]) > 2)
+		if (strlen($match[1]) > 2 && strpos($match[1], '\\') !== false)
 		{
 			$hash_types = explode('\\', $match[1]);
 			$return_ary = array();
@@ -192,6 +220,8 @@ class manager
 			return false;
 		}
 
+		$this->initialize();
+
 		// Try to retrieve algorithm by service name if type doesn't
 		// start with dollar sign
 		if (!is_array($type) && strpos($type, '$') !== 0 && isset($this->algorithms[$type]))
@@ -242,6 +272,8 @@ class manager
 			return false;
 		}
 
+		$this->initialize();
+
 		// First find out what kind of hash we're dealing with
 		$stored_hash_type = $this->detect_algorithm($hash);
 		if ($stored_hash_type == false)
@@ -265,7 +297,14 @@ class manager
 		}
 		else
 		{
-			$this->convert_flag = false;
+			if ($stored_hash_type instanceof driver\rehashable_driver_interface)
+			{
+				$this->convert_flag = $stored_hash_type->needs_rehash($hash);
+			}
+			else
+			{
+				$this->convert_flag = false;
+			}
 		}
 
 		// Check all legacy hash types if prefix is $CP$
@@ -297,6 +336,8 @@ class manager
 	*/
 	public function combined_hash_password($password_hash, $type)
 	{
+		$this->initialize();
+
 		$data = array(
 			'prefix' => '$',
 			'settings' => '$',
--- a/phpbb/path_helper.php
+++ b/phpbb/path_helper.php
@@ -21,7 +21,7 @@ class path_helper
 	/** @var \phpbb\symfony_request */
 	protected $symfony_request;
 
-	/** @var \phpbb\filesystem */
+	/** @var \phpbb\filesystem\filesystem_interface */
 	protected $filesystem;
 
 	/** @var \phpbb\request\request_interface */
@@ -43,13 +43,13 @@ class path_helper
 	* Constructor
 	*
 	* @param \phpbb\symfony_request $symfony_request
-	* @param \phpbb\filesystem $filesystem
+	* @param \phpbb\filesystem\filesystem_interface $filesystem
 	* @param \phpbb\request\request_interface $request
 	* @param string $phpbb_root_path Relative path to phpBB root
 	* @param string $php_ext PHP file extension
 	* @param mixed $adm_relative_path Relative path admin path to adm/ root
 	*/
-	public function __construct(\phpbb\symfony_request $symfony_request, \phpbb\filesystem $filesystem, \phpbb\request\request_interface $request, $phpbb_root_path, $php_ext, $adm_relative_path = null)
+	public function __construct(\phpbb\symfony_request $symfony_request, \phpbb\filesystem\filesystem_interface $filesystem, \phpbb\request\request_interface $request, $phpbb_root_path, $php_ext, $adm_relative_path = null)
 	{
 		$this->symfony_request = $symfony_request;
 		$this->filesystem = $filesystem;
@@ -100,11 +100,18 @@ class path_helper
 	*/
 	public function update_web_root_path($path)
 	{
+		$web_root_path = $this->get_web_root_path();
+
+		// Removes the web root path if it is already present
+		if (strpos($path, $web_root_path) === 0)
+		{
+			$path = $this->phpbb_root_path . substr($path, strlen($web_root_path));
+		}
+
 		if (strpos($path, $this->phpbb_root_path) === 0)
 		{
 			$path = substr($path, strlen($this->phpbb_root_path));
 
-			$web_root_path = $this->get_web_root_path();
 			if (substr($web_root_path, -8) === 'app.php/' && substr($path, 0, 7) === 'app.php')
 			{
 				$path = substr($path, 8);
--- a/phpbb/permissions.php
+++ b/phpbb/permissions.php
@@ -273,6 +273,7 @@ class permissions
 		'f_post'		=> array('lang' => 'ACL_F_POST', 'cat' => 'post'),
 		'f_sticky'		=> array('lang' => 'ACL_F_STICKY', 'cat' => 'post'),
 		'f_announce'	=> array('lang' => 'ACL_F_ANNOUNCE', 'cat' => 'post'),
+		'f_announce_global'	=> array('lang' => 'ACL_F_ANNOUNCE_GLOBAL', 'cat' => 'post'),
 		'f_reply'		=> array('lang' => 'ACL_F_REPLY', 'cat' => 'post'),
 		'f_edit'		=> array('lang' => 'ACL_F_EDIT', 'cat' => 'post'),
 		'f_delete'		=> array('lang' => 'ACL_F_DELETE', 'cat' => 'post'),
--- a/phpbb/plupload/plupload.php
+++ b/phpbb/plupload/plupload.php
@@ -39,7 +39,7 @@ class plupload
 	protected $user;
 
 	/**
-	* @var \phpbb\php\ini
+	* @var \bantu\IniGetWrapper\IniGetWrapper
 	*/
 	protected $php_ini;
 
@@ -67,10 +67,10 @@ class plupload
 	* @param \phpbb\config\config $config
 	* @param \phpbb\request\request_interface $request
 	* @param \phpbb\user $user
-	* @param \phpbb\php\ini $php_ini
+	* @param \bantu\IniGetWrapper\IniGetWrapper $php_ini
 	* @param \phpbb\mimetype\guesser $mimetype_guesser
 	*/
-	public function __construct($phpbb_root_path, \phpbb\config\config $config, \phpbb\request\request_interface $request, \phpbb\user $user, \phpbb\php\ini $php_ini, \phpbb\mimetype\guesser $mimetype_guesser)
+	public function __construct($phpbb_root_path, \phpbb\config\config $config, \phpbb\request\request_interface $request, \phpbb\user $user, \bantu\IniGetWrapper\IniGetWrapper $php_ini, \phpbb\mimetype\guesser $mimetype_guesser)
 	{
 		$this->phpbb_root_path = $phpbb_root_path;
 		$this->config = $config;
@@ -266,7 +266,7 @@ class plupload
 		if ($this->config['img_max_height'] > 0 && $this->config['img_max_width'] > 0)
 		{
 			$resize = sprintf(
-				'resize: {width: %d, height: %d, quality: 100},',
+				'resize: {width: %d, height: %d, quality: 85},',
 				(int) $this->config['img_max_width'],
 				(int) $this->config['img_max_height']
 			);
@@ -284,9 +284,9 @@ class plupload
 	public function get_chunk_size()
 	{
 		$max = min(
-			$this->php_ini->get_bytes('upload_max_filesize'),
-			$this->php_ini->get_bytes('post_max_size'),
-			max(1, $this->php_ini->get_bytes('memory_limit')),
+			$this->php_ini->getBytes('upload_max_filesize'),
+			$this->php_ini->getBytes('post_max_size'),
+			max(1, $this->php_ini->getBytes('memory_limit')),
 			$this->config['max_filesize']
 		);
 
@@ -303,7 +303,7 @@ class plupload
 			$this->temporary_directory,
 			$this->config['plupload_salt'],
 			md5($file_name),
-			\filespec::get_extension($file_name)
+			\phpbb\files\filespec::get_extension($file_name)
 		);
 	}
 
--- a/phpbb/profilefields/type/type_date.php
+++ b/phpbb/profilefields/type/type_date.php
@@ -72,7 +72,7 @@ class type_date extends type_base
 			'lang_options'			=> $field_data['lang_options'],
 		);
 
-		$always_now = request_var('always_now', -1);
+		$always_now = $request->variable('always_now', -1);
 		if ($always_now == -1)
 		{
 			$s_checked = ($field_data['field_default_value'] == 'now') ? true : false;
--- a/phpbb/profilefields/type/type_interface.php
+++ b/phpbb/profilefields/type/type_interface.php
@@ -133,6 +133,14 @@ interface type_interface
 	*/
 	public function get_field_ident($field_data);
 
+	/**
+	* Get the localized name of the field
+	*
+	* @param string $field_name		Unlocalized name of this field
+	* @return string 	Localized name of the field
+	*/
+	public function get_field_name($field_name);
+
 	/**
 	* Get the column type for the database
 	*
--- a/phpbb/profilefields/type/type_string.php
+++ b/phpbb/profilefields/type/type_string.php
@@ -63,7 +63,7 @@ class type_string extends type_string_common
 		$options = array(
 			0 => array('TITLE' => $this->user->lang['FIELD_LENGTH'],		'FIELD' => '<input type="number" min="0" max="99999" name="field_length" value="' . $field_data['field_length'] . '" />'),
 			1 => array('TITLE' => $this->user->lang['MIN_FIELD_CHARS'],	'FIELD' => '<input type="number" min="0" max="99999" name="field_minlen" value="' . $field_data['field_minlen'] . '" />'),
-			2 => array('TITLE' => $this->user->lang['MAX_FIELD_CHARS'],	'FIELD' => '<input type="number" min="0 max="99999"" name="field_maxlen" value="' . $field_data['field_maxlen'] . '" />'),
+			2 => array('TITLE' => $this->user->lang['MAX_FIELD_CHARS'],	'FIELD' => '<input type="number" min="0" max="99999" name="field_maxlen" value="' . $field_data['field_maxlen'] . '" />'),
 			3 => array('TITLE' => $this->user->lang['FIELD_VALIDATION'],	'FIELD' => '<select name="field_validation">' . $this->validate_options($field_data) . '</select>'),
 		);
 
--- /dev/null
+++ b/phpbb/report/controller/report.php
@@ -0,0 +1,319 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\report\controller;
+
+use phpbb\exception\http_exception;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+
+class report
+{
+	/**
+	 * @var \phpbb\config\config
+	 */
+	protected $config;
+
+	/**
+	 * @var \phpbb\user
+	 */
+	protected $user;
+
+	/**
+	 * @var \phpbb\template\template
+	 */
+	protected $template;
+
+	/**
+	 * @var \phpbb\controller\helper
+	 */
+	protected $helper;
+
+	/**
+	 * @var \phpbb\request\request_interface
+	 */
+	protected $request;
+
+	/**
+	 * @var \phpbb\captcha\factory
+	 */
+	protected $captcha_factory;
+
+	/**
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * @var \phpbb\report\report_handler_interface
+	 */
+	protected $report_handler;
+
+	/**
+	 * @var \phpbb\report\report_reason_list_provider
+	 */
+	protected $report_reason_provider;
+
+	public function __construct(\phpbb\config\config $config, \phpbb\user $user, \phpbb\template\template $template, \phpbb\controller\helper $helper, \phpbb\request\request_interface $request, \phpbb\captcha\factory $captcha_factory, \phpbb\report\handler_factory $report_factory, \phpbb\report\report_reason_list_provider $ui_provider, $phpbb_root_path, $php_ext)
+	{
+		$this->config			= $config;
+		$this->user				= $user;
+		$this->template			= $template;
+		$this->helper			= $helper;
+		$this->request			= $request;
+		$this->phpbb_root_path	= $phpbb_root_path;
+		$this->php_ext			= $php_ext;
+		$this->captcha_factory	= $captcha_factory;
+		$this->report_handler	= $report_factory;
+
+		// User interface factory
+		$this->report_reason_provider = $ui_provider;
+	}
+
+	/**
+	 * Controller for /path_to_entities/{id}/report routes
+	 *
+	 * Because of how phpBB organizes routes $mode must be set in the route config.
+	 *
+	 * @param int		$id		ID of the entity to report
+	 * @param string	$mode
+	 * @return \Symfony\Component\HttpFoundation\Response a Symfony response object
+	 * @throws \phpbb\exception\http_exception when $mode or $id is invalid for some reason
+	 */
+	public function handle($id, $mode)
+	{
+		// Get report handler
+		$this->report_handler = $this->report_handler->get_instance($mode);
+
+		$this->user->add_lang('mcp');
+
+		$user_notify	= ($this->user->data['is_registered']) ? $this->request->variable('notify', 0) : false;
+		$reason_id		= $this->request->variable('reason_id', 0);
+		$report_text	= $this->request->variable('report_text', '', true);
+
+		$submit = $this->request->variable('submit', '');
+		$cancel = $this->request->variable('cancel', '');
+
+		$error = array();
+		$s_hidden_fields = '';
+
+		$redirect_url = append_sid(
+			$this->phpbb_root_path . ( ($mode === 'pm') ? 'ucp' : 'viewtopic' ) . ".{$this->php_ext}",
+			($mode == 'pm') ? "i=pm&mode=view&p=$id" : "p=$id"
+		);
+		$redirect_url .= ($mode === 'post') ? "#p$id" : '';
+
+		// Set up CAPTCHA if necessary
+		if ($this->config['enable_post_confirm'] && !$this->user->data['is_registered'])
+		{
+			$captcha = $this->captcha_factory->get_instance($this->config['captcha_plugin']);
+			$captcha->init(CONFIRM_REPORT);
+		}
+
+		//Has the report been cancelled?
+		if (!empty($cancel))
+		{
+			return new RedirectResponse($redirect_url, 302);
+		}
+
+		// Check CAPTCHA, if the form was submited
+		if (!empty($submit) && isset($captcha))
+		{
+			$captcha_template_array = $this->check_captcha($captcha);
+			$error = $captcha_template_array['error'];
+			$s_hidden_fields = $captcha_template_array['hidden_fields'];
+		}
+
+		// Handle request
+		try
+		{
+			if (!empty($submit) && sizeof($error) === 0)
+			{
+				$this->report_handler->add_report(
+					(int) $id,
+					(int) $reason_id,
+					(string) $report_text,
+					(int) $user_notify
+				);
+
+				// Send success message
+				switch ($mode)
+				{
+					case 'pm':
+						$lang_return = $this->user->lang['RETURN_PM'];
+						$lang_success = $this->user->lang['PM_REPORTED_SUCCESS'];
+					break;
+					case 'post':
+						$lang_return = $this->user->lang['RETURN_TOPIC'];
+						$lang_success = $this->user->lang['POST_REPORTED_SUCCESS'];
+					break;
+				}
+
+				$this->helper->assign_meta_refresh_var(3, $redirect_url);
+				$message = $lang_success . '<br /><br />' . sprintf($lang_return, '<a href="' . $redirect_url . '">', '</a>');
+				return $this->helper->message($message);
+			}
+			else
+			{
+				$this->report_handler->validate_report_request($id);
+			}
+		}
+		catch (\phpbb\report\exception\pm_reporting_disabled_exception $exception)
+		{
+			throw new http_exception(404, 'PAGE_NOT_FOUND');
+		}
+		catch (\phpbb\report\exception\already_reported_exception $exception)
+		{
+			switch ($mode)
+			{
+				case 'pm':
+					$message = $this->user->lang['ALREADY_REPORTED_PM'];
+					$message .= '<br /><br />' . sprintf($this->user->lang['RETURN_PM'], '<a href="' . $redirect_url . '">', '</a>');
+				break;
+				case 'post':
+					$message = $this->user->lang['ALREADY_REPORTED'];
+					$message .= '<br /><br />' . sprintf($this->user->lang['RETURN_TOPIC'], '<a href="' . $redirect_url . '">', '</a>');
+				break;
+			}
+
+			return $this->helper->message($message);
+		}
+		catch (\phpbb\report\exception\report_permission_denied_exception $exception)
+		{
+			$message = $exception->getMessage();
+			if (isset($this->user->lang[$message]))
+			{
+				$message = $this->user->lang[$message];
+			}
+
+			throw new http_exception(403, $message);
+		}
+		catch (\phpbb\report\exception\entity_not_found_exception $exception)
+		{
+			$message = $exception->getMessage();
+			if (isset($this->user->lang[$message]))
+			{
+				$message = $this->user->lang[$message];
+			}
+
+			throw new http_exception(404, $message);
+		}
+		catch (\phpbb\report\exception\empty_report_exception $exception)
+		{
+			$error[] = $this->user->lang['EMPTY_REPORT'];
+		}
+		catch (\phpbb\report\exception\invalid_report_exception $exception)
+		{
+			return $this->helper->message($exception->getMessage());
+		}
+
+		// Setting up an rendering template
+		$page_title = ($mode === 'pm') ? $this->user->lang['REPORT_MESSAGE'] : $this->user->lang['REPORT_POST'];
+		$this->assign_template_data(
+			$mode,
+			$id,
+			$reason_id,
+			$report_text,
+			$user_notify,
+			$error,
+			$s_hidden_fields,
+			( isset($captcha) ? $captcha : false )
+		);
+
+		return $this->helper->render('report_body.html', $page_title);
+	}
+
+	/**
+	 * Assigns template variables
+	 *
+	 * @param	int		$mode
+	 * @param	int		$id
+	 * @param	int		$reason_id
+	 * @param	string	$report_text
+	 * @param	mixed	$user_notify
+	 * @param 	array	$error
+	 * @param	string	$s_hidden_fields
+	 * @param	mixed	$captcha
+	 * @return	null
+	 */
+	protected function assign_template_data($mode, $id, $reason_id, $report_text, $user_notify, $error = array(), $s_hidden_fields = '', $captcha = false)
+	{
+		if ($captcha !== false && $captcha->is_solved() === false)
+		{
+			$this->template->assign_vars(array(
+				'S_CONFIRM_CODE'	=> true,
+				'CAPTCHA_TEMPLATE'	=> $captcha->get_template(),
+			));
+		}
+
+		$this->report_reason_provider->display_reasons($reason_id);
+
+		switch ($mode)
+		{
+			case 'pm':
+				$report_route = $this->helper->route('phpbb_report_pm_controller', array('id' => $id));
+			break;
+			case 'post':
+				$report_route = $this->helper->route('phpbb_report_post_controller', array('id' => $id));
+			break;
+		}
+
+		$this->template->assign_vars(array(
+			'ERROR'				=> (sizeof($error) > 0) ? implode('<br />', $error) : '',
+			'S_REPORT_POST'		=> ($mode === 'pm') ? false : true,
+			'REPORT_TEXT'		=> $report_text,
+			'S_HIDDEN_FIELDS'	=> (!empty($s_hidden_fields)) ? $s_hidden_fields : null,
+			'S_REPORT_ACTION'	=> $report_route,
+
+			'S_NOTIFY'			=> $user_notify,
+			'S_CAN_NOTIFY'		=> ($this->user->data['is_registered']) ? true : false,
+			'S_IN_REPORT'		=> true,
+		));
+	}
+
+	/**
+	 * Check CAPTCHA
+	 *
+	 * @param	object	$captcha	A phpBB CAPTCHA object
+	 * @return	array	template variables which ensures that CAPTCHA's work correctly
+	 */
+	protected function check_captcha($captcha)
+	{
+		$error = array();
+		$captcha_hidden_fields = '';
+
+		$visual_confirmation_response = $captcha->validate();
+		if ($visual_confirmation_response)
+		{
+			$error[] = $visual_confirmation_response;
+		}
+
+		if (sizeof($error) === 0)
+		{
+			$captcha->reset();
+		}
+		else if ($captcha->is_solved() !== false)
+		{
+			$captcha_hidden_fields = build_hidden_fields($captcha->get_hidden_fields());
+		}
+
+		return array(
+			'error' => $error,
+			'hidden_fields' => $captcha_hidden_fields,
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/report/exception/already_reported_exception.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\report\exception;
+
+class already_reported_exception extends invalid_report_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/report/exception/empty_report_exception.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\report\exception;
+
+class empty_report_exception extends invalid_report_exception
+{
+	public function __construct()
+	{
+		parent::__construct('EMPTY_REPORT');
+	}
+}
--- /dev/null
+++ b/phpbb/report/exception/entity_not_found_exception.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\report\exception;
+
+class entity_not_found_exception extends invalid_report_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/report/exception/factory_invalid_argument_exception.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\report\exception;
+
+use \phpbb\exception\runtime_exception;
+
+class factory_invalid_argument_exception extends runtime_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/report/exception/invalid_report_exception.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\report\exception;
+
+use \phpbb\exception\runtime_exception;
+
+class invalid_report_exception extends runtime_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/report/exception/pm_reporting_disabled_exception.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\report\exception;
+
+class pm_reporting_disabled_exception extends invalid_report_exception
+{
+	public function __construct()
+	{
+
+	}
+}
--- /dev/null
+++ b/phpbb/report/exception/report_permission_denied_exception.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\report\exception;
+
+class report_permission_denied_exception extends invalid_report_exception
+{
+
+}
--- /dev/null
+++ b/phpbb/report/handler_factory.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\report;
+
+use phpbb\report\exception\factory_invalid_argument_exception;
+
+class handler_factory
+{
+	/**
+	 * @var \Symfony\Component\DependencyInjection\ContainerInterface
+	 */
+	protected $container;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
+	 */
+	public function __construct(\Symfony\Component\DependencyInjection\ContainerInterface $container)
+	{
+		$this->container = $container;
+	}
+
+	/**
+	 * Return a new instance of an appropriate report handler
+	 *
+	 * @param string	$type
+	 * @return \phpbb\report\report_handler_interface
+	 * @throws \phpbb\report\exception\factory_invalid_argument_exception if $type is not valid
+	 */
+	public function get_instance($type)
+	{
+		switch ($type)
+		{
+			case 'pm':
+				return $this->container->get('phpbb.report.handlers.report_handler_pm');
+			break;
+			case 'post':
+				return $this->container->get('phpbb.report.handlers.report_handler_post');
+			break;
+		}
+
+		throw new factory_invalid_argument_exception();
+	}
+}
--- /dev/null
+++ b/phpbb/report/report_handler.php
@@ -0,0 +1,104 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\report;
+
+abstract class report_handler implements report_handler_interface
+{
+	/**
+	 * @var \phpbb\db\driver\driver_interface
+	 */
+	protected $db;
+
+	/**
+	 * @var \phpbb\event\dispatcher_interface
+	 */
+	protected $dispatcher;
+
+	/**
+	 * @var \phpbb\config\config
+	 */
+	protected $config;
+
+	/**
+	 * @var \phpbb\auth\auth
+	 */
+	protected $auth;
+
+	/**
+	 * @var \phpbb\user
+	 */
+	protected $user;
+
+	/**
+	 * @var \phpbb\notification\manager
+	 */
+	protected $notifications;
+
+	/**
+	 * @var array
+	 */
+	protected $report_data;
+
+	/**
+	 * Construtor
+	 *
+	 * @param \phpbb\db\driver\driver_interface	$db
+	 * @param \phpbb\event\dispatcher_interface	$dispatcher
+	 * @param \phpbb\config\db					$config
+	 * @param \phpbb\auth\auth					$auth
+	 * @param \phpbb\user						$user
+	 * @param \phpbb\notification\manager		$notification
+	 */
+	public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\event\dispatcher_interface $dispatcher, \phpbb\config\config $config, \phpbb\auth\auth $auth, \phpbb\user $user, \phpbb\notification\manager $notification)
+	{
+		$this->db				= $db;
+		$this->dispatcher		= $dispatcher;
+		$this->config			= $config;
+		$this->auth				= $auth;
+		$this->user				= $user;
+		$this->notifications	= $notification;
+		$this->report_data		= array();
+	}
+
+	/**
+	 * Creates a report entity in the database
+	 *
+	 * @param	array	$report_data
+	 * @return	int	the ID of the created entity
+	 */
+	protected function create_report(array $report_data)
+	{
+		$sql_ary = array(
+			'reason_id'							=> (int) $report_data['reason_id'],
+			'post_id'							=> $report_data['post_id'],
+			'pm_id'								=> $report_data['pm_id'],
+			'user_id'							=> (int) $this->user->data['user_id'],
+			'user_notify'						=> (int) $report_data['user_notify'],
+			'report_closed'						=> 0,
+			'report_time'						=> (int) time(),
+			'report_text'						=> (string) $report_data['report_text'],
+			'reported_post_text'				=> $report_data['reported_post_text'],
+			'reported_post_uid'					=> $report_data['reported_post_uid'],
+			'reported_post_bitfield'			=> $report_data['reported_post_bitfield'],
+			'reported_post_enable_bbcode'		=> $report_data['reported_post_enable_bbcode'],
+			'reported_post_enable_smilies'		=> $report_data['reported_post_enable_smilies'],
+			'reported_post_enable_magic_url'	=> $report_data['reported_post_enable_magic_url'],
+		);
+
+		$sql = 'INSERT INTO ' . REPORTS_TABLE . ' ' . $this->db->sql_build_array('INSERT', $sql_ary);
+		$this->db->sql_query($sql);
+
+		return $this->db->sql_nextid();
+	}
+}
--- /dev/null
+++ b/phpbb/report/report_handler_interface.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\report;
+
+interface report_handler_interface
+{
+	/**
+	 * Reports a message
+	 *
+	 * @param int		$id
+	 * @param int		$reason_id
+	 * @param string	$report_text
+	 * @param int		$user_notify
+	 * @return null
+	 * @throws \phpbb\report\exception\empty_report_exception		when the given report is empty
+	 * @throws \phpbb\report\exception\already_reported_exception	when the entity is already reported
+	 * @throws \phpbb\report\exception\entity_not_found_exception	when the entity does not exist or the user does not have viewing permissions for it
+	 * @throws \phpbb\report\exception\invalid_report_exception		when the entity cannot be reported for some other reason
+	 */
+	public function add_report($id, $reason_id, $report_text, $user_notify);
+
+	/**
+	 * Checks if the message is reportable
+	 *
+	 * @param int	$id
+	 * @return null
+	 * @throws \phpbb\report\exception\already_reported_exception	when the entity is already reported
+	 * @throws \phpbb\report\exception\entity_not_found_exception	when the entity does not exist or the user does not have viewing permissions for it
+	 * @throws \phpbb\report\exception\invalid_report_exception		when the entity cannot be reported for some other reason
+	 */
+	public function validate_report_request($id);
+}
--- /dev/null
+++ b/phpbb/report/report_handler_pm.php
@@ -0,0 +1,137 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\report;
+
+use phpbb\report\exception\empty_report_exception;
+use phpbb\report\exception\already_reported_exception;
+use phpbb\report\exception\pm_reporting_disabled_exception;
+use phpbb\report\exception\entity_not_found_exception;
+
+class report_handler_pm extends report_handler
+{
+	/**
+	 * {@inheritdoc}
+	 * @throws \phpbb\report\exception\pm_reporting_disabled_exception when PM reporting is disabled on the board
+	 */
+	public function add_report($id, $reason_id, $report_text, $user_notify)
+	{
+		// Cast the input variables
+		$id				= (int) $id;
+		$reason_id		= (int) $reason_id;
+		$report_text	= (string) $report_text;
+		$user_notify	= (int) $user_notify;
+
+		$this->validate_report_request($id);
+
+		$sql = 'SELECT *
+			FROM ' . REPORTS_REASONS_TABLE . "
+			WHERE reason_id = $reason_id";
+		$result = $this->db->sql_query($sql);
+		$row = $this->db->sql_fetchrow($result);
+		$this->db->sql_freeresult($result);
+
+		if (!$row || (empty($report_text) && strtolower($row['reason_title']) === 'other'))
+		{
+			throw new empty_report_exception();
+		}
+
+		$report_data = array(
+			'reason_id'							=> $reason_id,
+			'post_id'							=> 0,
+			'pm_id'								=> $id,
+			'user_notify'						=> $user_notify,
+			'report_text'						=> $report_text,
+			'reported_post_text'				=> $this->report_data['message_text'],
+			'reported_post_uid'					=> $this->report_data['bbcode_bitfield'],
+			'reported_post_bitfield'			=> $this->report_data['bbcode_uid'],
+			'reported_post_enable_bbcode'		=> $this->report_data['enable_bbcode'],
+			'reported_post_enable_smilies'		=> $this->report_data['enable_smilies'],
+			'reported_post_enable_magic_url'	=> $this->report_data['enable_magic_url'],
+		);
+
+		$report_id = $this->create_report($report_data);
+
+		$sql = 'UPDATE ' . PRIVMSGS_TABLE . '
+			SET message_reported = 1
+			WHERE msg_id = ' . $id;
+		$this->db->sql_query($sql);
+
+		$sql_ary = array(
+			'msg_id'		=> $id,
+			'user_id'		=> ANONYMOUS,
+			'author_id'		=> (int) $this->report_data['author_id'],
+			'pm_deleted'	=> 0,
+			'pm_new'		=> 0,
+			'pm_unread'		=> 0,
+			'pm_replied'	=> 0,
+			'pm_marked'		=> 0,
+			'pm_forwarded'	=> 0,
+			'folder_id'		=> PRIVMSGS_INBOX,
+		);
+
+		$sql = 'INSERT INTO ' . PRIVMSGS_TO_TABLE . ' ' . $this->db->sql_build_array('INSERT', $sql_ary);
+		$this->db->sql_query($sql);
+
+		$this->notifications->add_notifications('notification.type.report_pm', array_merge($this->report_data, $row, array(
+			'report_text'	=> $report_text,
+			'from_user_id'	=> $this->report_data['author_id'],
+			'report_id'		=> $report_id,
+		)));
+	}
+
+	/**
+	 * {@inheritdoc}
+	 * @throws \phpbb\report\exception\pm_reporting_disabled_exception when PM reporting is disabled on the board
+	 */
+	public function validate_report_request($id)
+	{
+		$id = (int) $id;
+
+		// Check if reporting PMs is enabled
+		if (!$this->config['allow_pm_report'])
+		{
+			throw new pm_reporting_disabled_exception();
+		}
+		else if ($id <= 0)
+		{
+			throw new entity_not_found_exception('NO_POST_SELECTED');
+		}
+
+		// Grab all relevant data
+		$sql = 'SELECT p.*, pt.*
+			FROM ' . PRIVMSGS_TABLE . ' p, ' . PRIVMSGS_TO_TABLE . " pt
+			WHERE p.msg_id = $id
+				AND p.msg_id = pt.msg_id
+				AND (p.author_id = " . $this->user->data['user_id'] . "
+					OR pt.user_id = " . $this->user->data['user_id'] . ")";
+		$result = $this->db->sql_query($sql);
+		$report_data = $this->db->sql_fetchrow($result);
+		$this->db->sql_freeresult($result);
+
+		// Check if message exists
+		if (!$report_data)
+		{
+			$this->user->add_lang('ucp');
+			throw new entity_not_found_exception('NO_MESSAGE');
+		}
+
+		// Check if message is already reported
+		if ($report_data['message_reported'])
+		{
+			throw new already_reported_exception();
+		}
+
+		$this->report_data = $report_data;
+	}
+}
--- /dev/null
+++ b/phpbb/report/report_handler_post.php
@@ -0,0 +1,175 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\report;
+
+use phpbb\report\exception\invalid_report_exception;
+use phpbb\report\exception\empty_report_exception;
+use phpbb\report\exception\already_reported_exception;
+use phpbb\report\exception\entity_not_found_exception;
+use phpbb\report\exception\report_permission_denied_exception;
+
+class report_handler_post extends report_handler
+{
+	/**
+	 * @var array
+	 */
+	protected $forum_data;
+
+	/**
+	 * {@inheritdoc}
+	 * @throws \phpbb\report\exception\report_permission_denied_exception when the user does not have permission to report the post
+	 */
+	public function add_report($id, $reason_id, $report_text, $user_notify)
+	{
+		// Cast the input variables
+		$id				= (int) $id;
+		$reason_id		= (int) $reason_id;
+		$report_text	= (string) $report_text;
+		$user_notify	= (int) $user_notify;
+
+		$this->validate_report_request($id);
+
+		$sql = 'SELECT *
+			FROM ' . REPORTS_REASONS_TABLE . "
+			WHERE reason_id = $reason_id";
+		$result = $this->db->sql_query($sql);
+		$row = $this->db->sql_fetchrow($result);
+		$this->db->sql_freeresult($result);
+
+		if (!$row || (empty($report_text) && strtolower($row['reason_title']) === 'other'))
+		{
+			throw new empty_report_exception();
+		}
+
+		$report_data = array(
+			'reason_id'							=> $reason_id,
+			'post_id'							=> $id,
+			'pm_id'								=> 0,
+			'user_notify'						=> $user_notify,
+			'report_text'						=> $report_text,
+			'reported_post_text'				=> $this->report_data['post_text'],
+			'reported_post_uid'					=> $this->report_data['bbcode_bitfield'],
+			'reported_post_bitfield'			=> $this->report_data['bbcode_uid'],
+			'reported_post_enable_bbcode'		=> $this->report_data['enable_bbcode'],
+			'reported_post_enable_smilies'		=> $this->report_data['enable_smilies'],
+			'reported_post_enable_magic_url'	=> $this->report_data['enable_magic_url'],
+		);
+
+		$this->create_report($report_data);
+
+		$sql = 'UPDATE ' . POSTS_TABLE . '
+			SET post_reported = 1
+			WHERE post_id = ' . $id;
+		$this->db->sql_query($sql);
+
+		if (!$this->report_data['topic_reported'])
+		{
+			$sql = 'UPDATE ' . TOPICS_TABLE . '
+				SET topic_reported = 1
+				WHERE topic_id = ' . $this->report_data['topic_id'] . '
+					OR topic_moved_id = ' . $this->report_data['topic_id'];
+			$this->db->sql_query($sql);
+		}
+
+		$this->notifications->add_notifications('notification.type.report_post', array_merge($this->report_data, $row, $this->forum_data, array(
+			'report_text'	=> $report_text,
+		)));
+	}
+
+	/**
+	 * {@inheritdoc}
+	 * @throws \phpbb\report\exception\report_permission_denied_exception when the user does not have permission to report the post
+	 */
+	public function validate_report_request($id)
+	{
+		$id = (int) $id;
+
+		// Check if id is valid
+		if ($id <= 0)
+		{
+			throw new entity_not_found_exception('NO_POST_SELECTED');
+		}
+
+		// Grab all relevant data
+		$sql = 'SELECT t.*, p.*
+			FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
+			WHERE p.post_id = $id
+				AND p.topic_id = t.topic_id";
+		$result = $this->db->sql_query($sql);
+		$report_data = $this->db->sql_fetchrow($result);
+		$this->db->sql_freeresult($result);
+
+		if (!$report_data)
+		{
+			throw new entity_not_found_exception('POST_NOT_EXIST');
+		}
+
+		$forum_id = (int) $report_data['forum_id'];
+
+		$sql = 'SELECT *
+			FROM ' . FORUMS_TABLE . '
+			WHERE forum_id = ' . $forum_id;
+		$result = $this->db->sql_query($sql);
+		$forum_data = $this->db->sql_fetchrow($result);
+		$this->db->sql_freeresult($result);
+
+		if (!$forum_data)
+		{
+			throw new invalid_report_exception('FORUM_NOT_EXIST');
+		}
+
+		$acl_check_ary = array(
+			'f_list' => 'POST_NOT_EXIST',
+			'f_read' => 'USER_CANNOT_READ',
+			'f_report' => 'USER_CANNOT_REPORT'
+		);
+
+		/**
+		 * This event allows you to do extra auth checks and verify if the user
+		 * has the required permissions
+		 *
+		 * @event core.report_post_auth
+		 * @var	array	forum_data		All data available from the forums table on this post's forum
+		 * @var	array	report_data		All data available from the topics and the posts tables on this post (and its topic)
+		 * @var	array	acl_check_ary	An array with the ACL to be tested. The evaluation is made in the same order as the array is sorted
+		 *								The key is the ACL name and the value is the language key for the error message.
+		 * @since 3.1.3-RC1
+		 */
+		$vars = array(
+			'forum_data',
+			'report_data',
+			'acl_check_ary',
+		);
+		extract($this->dispatcher->trigger_event('core.report_post_auth', compact($vars)));
+
+		$this->auth->acl($this->user->data);
+
+		foreach ($acl_check_ary as $acl => $error)
+		{
+			if (!$this->auth->acl_get($acl, $forum_id))
+			{
+				throw new report_permission_denied_exception($error);
+			}
+		}
+		unset($acl_check_ary);
+
+		if ($report_data['post_reported'])
+		{
+			throw new already_reported_exception();
+		}
+
+		$this->report_data	= $report_data;
+		$this->forum_data	= $forum_data;
+	}
+}
--- /dev/null
+++ b/phpbb/report/report_reason_list_provider.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\report;
+
+class report_reason_list_provider
+{
+	/**
+	 * @var \phpbb\db\driver\driver_interface
+	 */
+	protected $db;
+
+	/**
+	 * @var \phpbb\template\template
+	 */
+	protected $template;
+
+	/**
+	 * @var \phpbb\user
+	 */
+	protected $user;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\db\driver\driver_interface	$db
+	 * @param \phpbb\template\template			$template
+	 * @param \phpbb\user						$user
+	 */
+	public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\template\template $template, \phpbb\user $user)
+	{
+		$this->db		= $db;
+		$this->template	= $template;
+		$this->user		= $user;
+	}
+
+	/**
+	 * Sets template variables to render report reasons select HTML input
+	 *
+	 * @param int	$reason_id
+	 * @return null
+	 */
+	public function display_reasons($reason_id = 0)
+	{
+		$sql = 'SELECT *
+			FROM ' . REPORTS_REASONS_TABLE . '
+			ORDER BY reason_order ASC';
+		$result = $this->db->sql_query($sql);
+
+		while ($row = $this->db->sql_fetchrow($result))
+		{
+			// If the reason is defined within the language file, we will use the localized version, else just use the database entry...
+			if (isset($this->user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])]) && isset($this->user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])]))
+			{
+				$row['reason_description'] = $this->user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])];
+				$row['reason_title'] = $this->user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])];
+			}
+
+			$this->template->assign_block_vars('reason', array(
+				'ID'			=> $row['reason_id'],
+				'TITLE'			=> $row['reason_title'],
+				'DESCRIPTION'	=> $row['reason_description'],
+				'S_SELECTED'	=> ($row['reason_id'] == $reason_id) ? true : false,
+			));
+		}
+		$this->db->sql_freeresult($result);
+	}
+}
--- a/phpbb/request/deactivated_super_global.php
+++ b/phpbb/request/deactivated_super_global.php
@@ -56,7 +56,7 @@ class deactivated_super_global implements \ArrayAccess, \Countable, \IteratorAgg
 		$file = '';
 		$line = 0;
 
-		$message = 'Illegal use of $' . $this->name . '. You must use the request class or request_var() to access input data. Found in %s on line %d. This error message was generated by deactivated_super_global.';
+		$message = 'Illegal use of $' . $this->name . '. You must use the request class to access input data. Found in %s on line %d. This error message was generated by deactivated_super_global.';
 
 		$backtrace = debug_backtrace();
 		if (isset($backtrace[1]))
--- a/phpbb/request/request.php
+++ b/phpbb/request/request.php
@@ -224,6 +224,51 @@ class request implements \phpbb\request\request_interface
 		return $this->_variable($var_name, $default, $multibyte, $super_global, false);
 	}
 
+	/**
+	 * {@inheritdoc}
+	 */
+	public function raw_variable($var_name, $default, $super_global = \phpbb\request\request_interface::REQUEST)
+	{
+		$path = false;
+
+		// deep direct access to multi dimensional arrays
+		if (is_array($var_name))
+		{
+			$path = $var_name;
+			// make sure at least the variable name is specified
+			if (empty($path))
+			{
+				return (is_array($default)) ? array() : $default;
+			}
+			// the variable name is the first element on the path
+			$var_name = array_shift($path);
+		}
+
+		if (!isset($this->input[$super_global][$var_name]))
+		{
+			return (is_array($default)) ? array() : $default;
+		}
+		$var = $this->input[$super_global][$var_name];
+
+		if ($path)
+		{
+			// walk through the array structure and find the element we are looking for
+			foreach ($path as $key)
+			{
+				if (is_array($var) && isset($var[$key]))
+				{
+					$var = $var[$key];
+				}
+				else
+				{
+					return (is_array($default)) ? array() : $default;
+				}
+			}
+		}
+
+		return $var;
+	}
+
 	/**
 	* Shortcut method to retrieve SERVER variables.
 	*
@@ -369,41 +414,14 @@ class request implements \phpbb\request\request_interface
 	*/
 	protected function _variable($var_name, $default, $multibyte = false, $super_global = \phpbb\request\request_interface::REQUEST, $trim = true)
 	{
-		$path = false;
-
-		// deep direct access to multi dimensional arrays
-		if (is_array($var_name))
-		{
-			$path = $var_name;
-			// make sure at least the variable name is specified
-			if (empty($path))
-			{
-				return (is_array($default)) ? array() : $default;
-			}
-			// the variable name is the first element on the path
-			$var_name = array_shift($path);
-		}
+		$var = $this->raw_variable($var_name, $default, $super_global);
 
-		if (!isset($this->input[$super_global][$var_name]))
+		// Return prematurely if raw variable is empty array or the same as
+		// the default. Using strict comparison to ensure that one can't
+		// prevent proper type checking on any input variable
+		if ($var === array() || $var === $default)
 		{
-			return (is_array($default)) ? array() : $default;
-		}
-		$var = $this->input[$super_global][$var_name];
-
-		if ($path)
-		{
-			// walk through the array structure and find the element we are looking for
-			foreach ($path as $key)
-			{
-				if (is_array($var) && isset($var[$key]))
-				{
-					$var = $var[$key];
-				}
-				else
-				{
-					return (is_array($default)) ? array() : $default;
-				}
-			}
+			return $var;
 		}
 
 		$this->type_cast_helper->recursive_set_var($var, $default, $multibyte, $trim);
--- a/phpbb/request/request_interface.php
+++ b/phpbb/request/request_interface.php
@@ -64,6 +64,28 @@ interface request_interface
 	*/
 	public function variable($var_name, $default, $multibyte = false, $super_global = \phpbb\request\request_interface::REQUEST);
 
+	/**
+	 * Get a variable without trimming strings and without escaping.
+	 * This method MUST NOT be used with queries.
+	 * Same functionality as variable(), except does not run trim() on strings
+	 * and does not escape input.
+	 * This method should only be used when the raw input is needed without
+	 * any escaping, i.e. for database password during the installation.
+	 *
+	 * @param	string|array	$var_name	The form variable's name from which data shall be retrieved.
+	 * 										If the value is an array this may be an array of indizes which will give
+	 * 										direct access to a value at any depth. E.g. if the value of "var" is array(1 => "a")
+	 * 										then specifying array("var", 1) as the name will return "a".
+	 * @param	mixed			$default	A default value that is returned if the variable was not set.
+	 * 										This function will always return a value of the same type as the default.
+	 * @param	\phpbb\request\request_interface::POST|GET|REQUEST|COOKIE	$super_global
+	 * 										Specifies which super global should be used
+	 *
+	 * @return	mixed	The value of $_REQUEST[$var_name] run through {@link set_var set_var} to ensure that the type is the
+	 *					the same as that of $default. If the variable is not set $default is returned.
+	 */
+	public function raw_variable($var_name, $default, $super_global = \phpbb\request\request_interface::REQUEST);
+
 	/**
 	* Shortcut method to retrieve SERVER variables.
 	*
--- a/phpbb/request/type_cast_helper.php
+++ b/phpbb/request/type_cast_helper.php
@@ -172,7 +172,6 @@ class type_cast_helper implements \phpbb\request\type_cast_helper_interface
 			}
 
 			list($default_key, $default_value) = each($default);
-			$value_type = gettype($default_value);
 			$key_type = gettype($default_key);
 
 			$_var = $var;
--- /dev/null
+++ b/phpbb/routing/file_locator.php
@@ -0,0 +1,33 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license       GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\routing;
+
+use phpbb\filesystem\filesystem_interface;
+use Symfony\Component\Config\FileLocator;
+
+class file_locator extends FileLocator
+{
+	public function __construct(filesystem_interface $filesystem, $paths = [])
+	{
+		$paths = (array) $paths;
+		$absolute_paths = [];
+
+		foreach ($paths as $path)
+		{
+			$absolute_paths[] = $filesystem->realpath($path);
+		}
+
+		parent::__construct($absolute_paths);
+	}
+}
--- /dev/null
+++ b/phpbb/routing/helper.php
@@ -0,0 +1,162 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\routing;
+
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Routing\RequestContext;
+
+/**
+* Controller helper class, contains methods that do things for controllers
+*/
+class helper
+{
+	/**
+	 * config object
+	 * @var \phpbb\config\config
+	 */
+	protected $config;
+
+	/**
+	 * phpBB router
+	 * @var \phpbb\routing\router
+	 */
+	protected $router;
+
+	/**
+	 * @var \phpbb\symfony_request
+	 */
+	protected $symfony_request;
+
+	/**
+	 * @var \phpbb\request\request_interface
+	 */
+	protected $request;
+
+	/**
+	 * @var \phpbb\filesystem The filesystem object
+	 */
+	protected $filesystem;
+
+	/**
+	 * phpBB root path
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * PHP file extension
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\config\config $config Config object
+	 * @param \phpbb\routing\router $router phpBB router
+	 * @param \phpbb\symfony_request $symfony_request Symfony Request object
+	 * @param \phpbb\request\request_interface $request phpBB request object
+	 * @param \phpbb\filesystem\filesystem $filesystem The filesystem object
+	 * @param string $phpbb_root_path phpBB root path
+	 * @param string $php_ext PHP file extension
+	 */
+	public function __construct(\phpbb\config\config $config, \phpbb\routing\router $router, \phpbb\symfony_request $symfony_request, \phpbb\request\request_interface $request, \phpbb\filesystem\filesystem $filesystem, $phpbb_root_path, $php_ext)
+	{
+		$this->config = $config;
+		$this->router = $router;
+		$this->symfony_request = $symfony_request;
+		$this->request = $request;
+		$this->filesystem = $filesystem;
+		$this->phpbb_root_path = $phpbb_root_path;
+		$this->php_ext = $php_ext;
+	}
+
+	/**
+	 * Generate a URL to a route
+	 *
+	 * @param string	$route		Name of the route to travel
+	 * @param array	$params		String or array of additional url parameters
+	 * @param bool	$is_amp		Is url using &amp; (true) or & (false)
+	 * @param string|bool		$session_id	Possibility to use a custom session id instead of the global one
+	 * @param bool|string		$reference_type The type of reference to be generated (one of the constants)
+	 * @return string The URL already passed through append_sid()
+	 */
+	public function route($route, array $params = array(), $is_amp = true, $session_id = false, $reference_type = UrlGeneratorInterface::ABSOLUTE_PATH)
+	{
+		$anchor = '';
+		if (isset($params['#']))
+		{
+			$anchor = '#' . $params['#'];
+			unset($params['#']);
+		}
+
+		$context = new RequestContext();
+		$context->fromRequest($this->symfony_request);
+
+		if ($this->config['force_server_vars'])
+		{
+			$context->setHost($this->config['server_name']);
+			$context->setScheme(substr($this->config['server_protocol'], 0, -3));
+			$context->setHttpPort($this->config['server_port']);
+			$context->setHttpsPort($this->config['server_port']);
+			$context->setBaseUrl(rtrim($this->config['script_path'], '/'));
+		}
+
+		$script_name = $this->symfony_request->getScriptName();
+		$page_name = substr($script_name, -1, 1) == '/' ? '' : utf8_basename($script_name);
+
+		$base_url = $context->getBaseUrl();
+
+		// Append page name if base URL does not contain it
+		if (!empty($page_name) && strpos($base_url, '/' . $page_name) === false)
+		{
+			$base_url .= '/' . $page_name;
+		}
+
+		// If enable_mod_rewrite is false we need to replace the current front-end by app.php, otherwise we need to remove it.
+		$base_url = str_replace('/' . $page_name, empty($this->config['enable_mod_rewrite']) ? '/app.' . $this->php_ext : '', $base_url);
+
+		// We need to update the base url to move to the directory of the app.php file if the current script is not app.php
+		if ($page_name !== 'app.php' && !$this->config['force_server_vars'])
+		{
+			if (empty($this->config['enable_mod_rewrite']))
+			{
+				$base_url = str_replace('/app.' . $this->php_ext, '/' . $this->phpbb_root_path . 'app.' . $this->php_ext, $base_url);
+			}
+			else
+			{
+				$base_url .= preg_replace(get_preg_expression('path_remove_dot_trailing_slash'), '$2', $this->phpbb_root_path);
+			}
+		}
+
+		$base_url = $this->request->escape($this->filesystem->clean_path($base_url), true);
+
+		$context->setBaseUrl($base_url);
+
+		$this->router->setContext($context);
+		$route_url = $this->router->generate($route, $params, $reference_type);
+
+		if ($is_amp)
+		{
+			$route_url = str_replace(array('&amp;', '&'), array('&', '&amp;'), $route_url);
+		}
+
+		if ($reference_type === UrlGeneratorInterface::RELATIVE_PATH && empty($this->config['enable_mod_rewrite']))
+		{
+			$route_url = 'app.' . $this->php_ext . '/' . $route_url;
+		}
+
+		return append_sid($route_url . $anchor, false, $is_amp, $session_id, true);
+	}
+}
--- /dev/null
+++ b/phpbb/routing/loader_resolver.php
@@ -0,0 +1,50 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license       GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\routing;
+
+use Symfony\Component\Config\Loader\LoaderResolverInterface;
+
+/**
+ * @see Symfony\Component\Config\Loader\LoaderResolver
+ */
+class loader_resolver implements LoaderResolverInterface
+{
+	/**
+	 * @var \Symfony\Component\Config\Loader\LoaderInterface[] An array of LoaderInterface objects
+	 */
+	protected $loaders = [];
+
+	public function __construct($loaders = [])
+	{
+		$this->loaders = $loaders;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function resolve($resource, $type = null)
+	{
+		/** @var \Symfony\Component\Config\Loader\LoaderInterface $loader */
+		foreach ($this->loaders as $loader)
+		{
+			if ($loader->supports($resource, $type))
+			{
+				$loader->setResolver($this);
+				return $loader;
+			}
+		}
+
+		return false;
+	}
+}
--- /dev/null
+++ b/phpbb/routing/resources_locator/chained_resources_locator.php
@@ -0,0 +1,47 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license       GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\routing\resources_locator;
+
+class chained_resources_locator implements resources_locator_interface
+{
+	/**
+	 * @var resources_locator_interface[]
+	 */
+	protected $locators;
+
+	/**
+	 * Construct method
+	 *
+	 * @param resources_locator_interface[]	$locators	Locators
+	 */
+	public function __construct($locators)
+	{
+		$this->locators		= $locators;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function locate_resources()
+	{
+		$resources = [];
+
+		foreach ($this->locators as $locator)
+		{
+			$resources = array_merge($resources, $locator->locate_resources());
+		}
+
+		return $resources;
+	}
+}
--- /dev/null
+++ b/phpbb/routing/resources_locator/default_resources_locator.php
@@ -0,0 +1,105 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license       GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\routing\resources_locator;
+
+use phpbb\extension\manager;
+
+/**
+ * Locates the yaml routing resources located in the default locations
+ */
+class default_resources_locator implements resources_locator_interface
+{
+	/**
+	 * phpBB root path
+	 *
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * Name of the current environment
+	 *
+	 * @var string
+	 */
+	protected $environment;
+
+	/**
+	 * Extension manager
+	 *
+	 * @var manager
+	 */
+	protected $extension_manager;
+
+	/**
+	 * Construct method
+	 *
+	 * @param string	$phpbb_root_path	phpBB root path
+	 * @param string	$environment		Name of the current environment
+	 * @param manager	$extension_manager	Extension manager
+	 */
+	public function __construct($phpbb_root_path, $environment, manager $extension_manager = null)
+	{
+		$this->phpbb_root_path		= $phpbb_root_path;
+		$this->environment			= $environment;
+		$this->extension_manager	= $extension_manager;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function locate_resources()
+	{
+		$resources = [['config/' . $this->environment . '/routing/environment.yml', 'yaml']];
+
+		$resources = $this->append_ext_resources($resources);
+
+		return $resources;
+	}
+
+	/**
+	 * Append extension resources to an array of resouces
+	 *
+	 * @see resources_locator_interface::locate_resources()
+	 *
+	 * @param mixed[] $resources List of resources
+	 *
+	 * @return mixed[] List of resources
+	 */
+	protected function append_ext_resources(array $resources)
+	{
+		if ($this->extension_manager !== null)
+		{
+			foreach ($this->extension_manager->all_enabled(false) as $path)
+			{
+				if (file_exists($this->phpbb_root_path . $path . 'config/' . $this->environment . '/routing/environment.yml'))
+				{
+					$resources[] = [$path . 'config/' . $this->environment . '/routing/environment.yml', 'yaml'];
+				}
+				else if (!is_dir($this->phpbb_root_path . $path . 'config/' . $this->environment))
+				{
+					if (file_exists($this->phpbb_root_path . $path . 'config/default/routing/environment.yml'))
+					{
+						$resources[] = [$path . 'config/default/routing/environment.yml', 'yaml'];
+					}
+					else if (!is_dir($this->phpbb_root_path . $path . 'config/default/routing') && file_exists($this->phpbb_root_path . $path . 'config/routing.yml'))
+					{
+						$resources[] = [$path . 'config/routing.yml', 'yaml'];
+					}
+				}
+			}
+		}
+
+		return $resources;
+	}
+}
--- /dev/null
+++ b/phpbb/routing/resources_locator/installer_resources_locator.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license       GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\routing\resources_locator;
+
+use phpbb\filesystem\filesystem_interface;
+
+/**
+ * Locates the yaml routing resources taking update directories into consideration
+ */
+class installer_resources_locator implements resources_locator_interface
+{
+	/**
+	 * phpBB's filesystem handler
+	 *
+	 * @var filesystem_interface
+	 */
+	protected $filesystem;
+
+	/**
+	 * phpBB root path
+	 *
+	 * @var string
+	 */
+	protected $phpbb_root_path;
+
+	/**
+	 * Name of the current environment
+	 *
+	 * @var string
+	 */
+	protected $environment;
+
+	/**
+	 * Construct method
+	 *
+	 * @param filesystem_interface	$filesystem			phpBB's filesystem handler
+	 * @param string				$phpbb_root_path	phpBB root path
+	 * @param string				$environment		Name of the current environment
+	 */
+	public function __construct(filesystem_interface $filesystem, $phpbb_root_path, $environment)
+	{
+		$this->filesystem			= $filesystem;
+		$this->phpbb_root_path		= $phpbb_root_path;
+		$this->environment			= $environment;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function locate_resources()
+	{
+		if ($this->filesystem->exists($this->phpbb_root_path . 'install/update/new/config'))
+		{
+			$resources = array(
+				array('install/update/new/config/' . $this->environment . '/routing/environment.yml', 'yaml')
+			);
+		}
+		else
+		{
+			$resources = array(
+				array('config/' . $this->environment . '/routing/environment.yml', 'yaml')
+			);
+		}
+
+		return $resources;
+	}
+}
--- /dev/null
+++ b/phpbb/routing/resources_locator/resources_locator_interface.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\routing\resources_locator;
+
+interface resources_locator_interface
+{
+	/**
+	 * Locates a list of resources used to load the routes
+	 *
+	 * Each entry of the list can be either the resource or an array composed of 2 elements:
+	 * the resource and its type.
+	 *
+	 * @return mixed[] List of resources
+	 */
+	public function locate_resources();
+}
--- /dev/null
+++ b/phpbb/routing/router.php
@@ -0,0 +1,395 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license       GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\routing;
+
+use phpbb\routing\resources_locator\resources_locator_interface;
+use Symfony\Component\Config\ConfigCache;
+use Symfony\Component\Config\Loader\LoaderInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\Filesystem\Exception\IOException;
+use Symfony\Component\Routing\Generator\Dumper\PhpGeneratorDumper;
+use Symfony\Component\Routing\Generator\UrlGenerator;
+use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherDumper;
+use Symfony\Component\Routing\Matcher\UrlMatcher;
+use Symfony\Component\Routing\RequestContext;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\RouterInterface;
+
+/**
+ * Integration of all pieces of the routing system for easier use.
+ */
+class router implements RouterInterface
+{
+	/**
+	 * @var ContainerInterface
+	 */
+	protected $container;
+
+	/**
+	 * @var resources_locator_interface
+	 */
+	protected $resources_locator;
+
+	/**
+	 * @var LoaderInterface
+	 */
+	protected $loader;
+
+	/**
+	 * PHP file extensions
+	 *
+	 * @var string
+	 */
+	protected $php_ext;
+
+	/**
+	 * @var \Symfony\Component\Routing\Matcher\UrlMatcherInterface|null
+	 */
+	protected $matcher;
+
+	/**
+	 * @var \Symfony\Component\Routing\Generator\UrlGeneratorInterface|null
+	 */
+	protected $generator;
+
+	/**
+	 * @var RequestContext
+	 */
+	protected $context;
+
+	/**
+	 * @var RouteCollection
+	 */
+	protected $route_collection;
+
+	/**
+	 * @var string
+	 */
+	protected $cache_dir;
+
+	/**
+	 * Construct method
+	 *
+	 * @param ContainerInterface			$container			DI container
+	 * @param resources_locator_interface	$resources_locator	Resources locator
+	 * @param LoaderInterface				$loader				Resources loader
+	 * @param string						$php_ext			PHP file extension
+	 * @param string						$cache_dir			phpBB cache directory
+	 */
+	public function __construct(ContainerInterface $container, resources_locator_interface $resources_locator, LoaderInterface $loader, $php_ext, $cache_dir)
+	{
+		$this->container			= $container;
+		$this->resources_locator	= $resources_locator;
+		$this->loader				= $loader;
+		$this->php_ext				= $php_ext;
+		$this->context				= new RequestContext();
+		$this->cache_dir			= $cache_dir;
+	}
+
+	/**
+	 * Get the list of routes
+	 *
+	 * @return RouteCollection Get the route collection
+	 */
+	public function get_routes()
+	{
+		if ($this->route_collection === null /*|| $this->route_collection->count() === 0*/)
+		{
+			$this->route_collection = new RouteCollection;
+			foreach ($this->resources_locator->locate_resources() as $resource)
+			{
+				if (is_array($resource))
+				{
+					$this->route_collection->addCollection($this->loader->load($resource[0], $resource[1]));
+				}
+				else
+				{
+					$this->route_collection->addCollection($this->loader->load($resource));
+				}
+			}
+
+			$this->resolveParameters($this->route_collection);
+		}
+
+		return $this->route_collection;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function getRouteCollection()
+	{
+		return $this->get_routes();
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function setContext(RequestContext $context)
+	{
+		$this->context = $context;
+
+		if ($this->matcher !== null)
+		{
+			$this->get_matcher()->setContext($context);
+		}
+		if ($this->generator !== null)
+		{
+			$this->get_generator()->setContext($context);
+		}
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function getContext()
+	{
+		return $this->context;
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH)
+	{
+		return $this->get_generator()->generate($name, $parameters, $referenceType);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function match($pathinfo)
+	{
+		return $this->get_matcher()->match($pathinfo);
+	}
+
+	/**
+	 * Gets the UrlMatcher instance associated with this Router.
+	 *
+	 * @return \Symfony\Component\Routing\Matcher\UrlMatcherInterface A UrlMatcherInterface instance
+	 */
+	public function get_matcher()
+	{
+		if ($this->matcher !== null)
+		{
+			return $this->matcher;
+		}
+
+		$this->create_dumped_url_matcher();
+
+		return $this->matcher;
+	}
+
+	/**
+	 * Creates a new dumped URL Matcher (dump it if necessary)
+	 */
+	protected function create_dumped_url_matcher()
+	{
+		try
+		{
+			$cache = new ConfigCache("{$this->cache_dir}url_matcher.{$this->php_ext}", defined('DEBUG'));
+			if (!$cache->isFresh())
+			{
+				$dumper = new PhpMatcherDumper($this->get_routes());
+
+				$options = array(
+					'class'      => 'phpbb_url_matcher',
+					'base_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
+				);
+
+				$cache->write($dumper->dump($options), $this->get_routes()->getResources());
+			}
+
+			require_once($cache->getPath());
+
+			$this->matcher = new \phpbb_url_matcher($this->context);
+		}
+		catch (IOException $e)
+		{
+			$this->create_new_url_matcher();
+		}
+	}
+
+	/**
+	 * Creates a new URL Matcher
+	 */
+	protected function create_new_url_matcher()
+	{
+		$this->matcher = new UrlMatcher($this->get_routes(), $this->context);
+	}
+
+	/**
+	 * Gets the UrlGenerator instance associated with this Router.
+	 *
+	 * @return \Symfony\Component\Routing\Generator\UrlGeneratorInterface A UrlGeneratorInterface instance
+	 */
+	public function get_generator()
+	{
+		if ($this->generator !== null)
+		{
+			return $this->generator;
+		}
+
+		$this->create_dumped_url_generator();
+
+		return $this->generator;
+	}
+
+	/**
+	 * Creates a new dumped URL Generator (dump it if necessary)
+	 */
+	protected function create_dumped_url_generator()
+	{
+		try
+		{
+			$cache = new ConfigCache("{$this->cache_dir}url_generator.{$this->php_ext}", defined('DEBUG'));
+			if (!$cache->isFresh())
+			{
+				$dumper = new PhpGeneratorDumper($this->get_routes());
+
+				$options = array(
+					'class'      => 'phpbb_url_generator',
+					'base_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
+				);
+
+				$cache->write($dumper->dump($options), $this->get_routes()->getResources());
+			}
+
+			require_once($cache->getPath());
+
+			$this->generator = new \phpbb_url_generator($this->context);
+		}
+		catch (IOException $e)
+		{
+			$this->create_new_url_generator();
+		}
+	}
+
+	/**
+	 * Creates a new URL Generator
+	 */
+	protected function create_new_url_generator()
+	{
+		$this->generator = new UrlGenerator($this->get_routes(), $this->context);
+	}
+
+	/**
+	 * Replaces placeholders with service container parameter values in:
+	 * - the route defaults,
+	 * - the route requirements,
+	 * - the route path,
+	 * - the route host,
+	 * - the route schemes,
+	 * - the route methods.
+	 *
+	 * @param RouteCollection $collection
+	 */
+	protected function resolveParameters(RouteCollection $collection)
+	{
+		/** @var \Symfony\Component\Routing\Route $route */
+		foreach ($collection as $route)
+		{
+			foreach ($route->getDefaults() as $name => $value)
+			{
+				$route->setDefault($name, $this->resolve($value));
+			}
+
+			$requirements = $route->getRequirements();
+			unset($requirements['_scheme']);
+			unset($requirements['_method']);
+
+			foreach ($requirements as $name => $value)
+			{
+				$route->setRequirement($name, $this->resolve($value));
+			}
+
+			$route->setPath($this->resolve($route->getPath()));
+			$route->setHost($this->resolve($route->getHost()));
+
+			$schemes = array();
+			foreach ($route->getSchemes() as $scheme)
+			{
+				$schemes = array_merge($schemes, explode('|', $this->resolve($scheme)));
+			}
+
+			$route->setSchemes($schemes);
+			$methods = array();
+			foreach ($route->getMethods() as $method)
+			{
+				$methods = array_merge($methods, explode('|', $this->resolve($method)));
+			}
+
+			$route->setMethods($methods);
+			$route->setCondition($this->resolve($route->getCondition()));
+		}
+	}
+
+	/**
+	 * Recursively replaces placeholders with the service container parameters.
+	 *
+	 * @param mixed $value The source which might contain "%placeholders%"
+	 *
+	 * @return mixed The source with the placeholders replaced by the container
+	 *               parameters. Arrays are resolved recursively.
+	 *
+	 * @throws ParameterNotFoundException When a placeholder does not exist as a container parameter
+	 * @throws RuntimeException           When a container value is not a string or a numeric value
+	 */
+	private function resolve($value)
+	{
+		if (is_array($value))
+		{
+			foreach ($value as $key => $val)
+			{
+				$value[$key] = $this->resolve($val);
+			}
+
+			return $value;
+		}
+
+		if (!is_string($value))
+		{
+			return $value;
+		}
+
+		$container = $this->container;
+		$escapedValue = preg_replace_callback('/%%|%([^%\s]++)%/', function ($match) use ($container, $value)
+		{
+			// skip %%
+			if (!isset($match[1]))
+			{
+				return '%%';
+			}
+
+			$resolved = $container->getParameter($match[1]);
+			if (is_string($resolved) || is_numeric($resolved))
+			{
+				return (string) $resolved;
+			}
+
+			throw new RuntimeException(sprintf(
+					'The container parameter "%s", used in the route configuration value "%s", '.
+					'must be a string or numeric, but it is of type %s.',
+					$match[1],
+					$value,
+					gettype($resolved)
+				)
+			);
+		}, $value);
+
+		return str_replace('%%', '%', $escapedValue);
+	}
+}
--- a/phpbb/search/base.php
+++ b/phpbb/search/base.php
@@ -286,7 +286,7 @@ class base
 
 		$sql = 'DELETE
 			FROM ' . SEARCH_RESULTS_TABLE . '
-			WHERE search_time < ' . (time() - $config['search_store_results']);
+			WHERE search_time < ' . (time() - (int) $config['search_store_results']);
 		$db->sql_query($sql);
 	}
 }
--- a/phpbb/search/fulltext_mysql.php
+++ b/phpbb/search/fulltext_mysql.php
@@ -198,8 +198,8 @@ class fulltext_mysql extends \phpbb\search\base
 		}
 		$this->db->sql_freeresult($result);
 
-		set_config('fulltext_mysql_max_word_len', $mysql_info['ft_max_word_len']);
-		set_config('fulltext_mysql_min_word_len', $mysql_info['ft_min_word_len']);
+		$this->config->set('fulltext_mysql_max_word_len', $mysql_info['ft_max_word_len']);
+		$this->config->set('fulltext_mysql_min_word_len', $mysql_info['ft_min_word_len']);
 
 		return false;
 	}
@@ -921,7 +921,7 @@ class fulltext_mysql extends \phpbb\search\base
 		// destroy too old cached search results
 		$this->destroy_cache(array());
 
-		set_config('search_last_gc', time(), true);
+		$this->config->set('search_last_gc', time(), false);
 	}
 
 	/**
@@ -942,38 +942,45 @@ class fulltext_mysql extends \phpbb\search\base
 			$this->get_stats();
 		}
 
-		$alter = array();
+		$alter_list = array();
 
 		if (!isset($this->stats['post_subject']))
 		{
+			$alter_entry = array();
 			if ($this->db->get_sql_layer() == 'mysqli' || version_compare($this->db->sql_server_info(true), '4.1.3', '>='))
 			{
-				$alter[] = 'MODIFY post_subject varchar(255) COLLATE utf8_unicode_ci DEFAULT \'\' NOT NULL';
+				$alter_entry[] = 'MODIFY post_subject varchar(255) COLLATE utf8_unicode_ci DEFAULT \'\' NOT NULL';
 			}
 			else
 			{
-				$alter[] = 'MODIFY post_subject text NOT NULL';
+				$alter_entry[] = 'MODIFY post_subject text NOT NULL';
 			}
-			$alter[] = 'ADD FULLTEXT (post_subject)';
+			$alter_entry[] = 'ADD FULLTEXT (post_subject)';
+			$alter_list[] = $alter_entry;
 		}
 
 		if (!isset($this->stats['post_content']))
 		{
+			$alter_entry = array();
 			if ($this->db->get_sql_layer() == 'mysqli' || version_compare($this->db->sql_server_info(true), '4.1.3', '>='))
 			{
-				$alter[] = 'MODIFY post_text mediumtext COLLATE utf8_unicode_ci NOT NULL';
+				$alter_entry[] = 'MODIFY post_text mediumtext COLLATE utf8_unicode_ci NOT NULL';
 			}
 			else
 			{
-				$alter[] = 'MODIFY post_text mediumtext NOT NULL';
+				$alter_entry[] = 'MODIFY post_text mediumtext NOT NULL';
 			}
 
-			$alter[] = 'ADD FULLTEXT post_content (post_text, post_subject)';
+			$alter_entry[] = 'ADD FULLTEXT post_content (post_text, post_subject)';
+			$alter_list[] = $alter_entry;
 		}
 
-		if (sizeof($alter))
+		if (sizeof($alter_list))
 		{
-			$this->db->sql_query('ALTER TABLE ' . POSTS_TABLE . ' ' . implode(', ', $alter));
+			foreach ($alter_list as $alter)
+			{
+				$this->db->sql_query('ALTER TABLE ' . POSTS_TABLE . ' ' . implode(', ', $alter));
+			}
 		}
 
 		$this->db->sql_query('TRUNCATE TABLE ' . SEARCH_RESULTS_TABLE);
--- a/phpbb/search/fulltext_native.php
+++ b/phpbb/search/fulltext_native.php
@@ -18,6 +18,13 @@ namespace phpbb\search;
 */
 class fulltext_native extends \phpbb\search\base
 {
+	const UTF8_HANGUL_FIRST = "\xEA\xB0\x80";
+	const UTF8_HANGUL_LAST = "\xED\x9E\xA3";
+	const UTF8_CJK_FIRST = "\xE4\xB8\x80";
+	const UTF8_CJK_LAST = "\xE9\xBE\xBB";
+	const UTF8_CJK_B_FIRST = "\xF0\xA0\x80\x80";
+	const UTF8_CJK_B_LAST = "\xF0\xAA\x9B\x96";
+
 	/**
 	 * Associative array holding index stats
 	 * @var array
@@ -99,7 +106,7 @@ class fulltext_native extends \phpbb\search\base
 	protected $user;
 
 	/**
-	* Initialises the fulltext_native search backend with min/max word length and makes sure the UTF-8 normalizer is loaded
+	* Initialises the fulltext_native search backend with min/max word length
 	*
 	* @param	boolean|string	&$error	is passed by reference and should either be set to false on success or an error message on failure
 	* @param	\phpbb\event\dispatcher_interface	$phpbb_dispatcher	Event dispatcher object
@@ -118,10 +125,6 @@ class fulltext_native extends \phpbb\search\base
 		/**
 		* Load the UTF tools
 		*/
-		if (!class_exists('utf_normalizer'))
-		{
-			include($this->phpbb_root_path . 'includes/utf/utf_normalizer.' . $this->php_ext);
-		}
 		if (!function_exists('utf8_decode_ncr'))
 		{
 			include($this->phpbb_root_path . 'includes/utf/utf_tools.' . $this->php_ext);
@@ -349,9 +352,6 @@ class fulltext_native extends \phpbb\search\base
 		$this->must_not_contain_ids = array();
 		$this->must_exclude_one_ids = array();
 
-		$mode = '';
-		$ignore_no_id = true;
-
 		foreach ($query as $word)
 		{
 			if (empty($word))
@@ -594,7 +594,6 @@ class fulltext_native extends \phpbb\search\base
 		$id_ary = array();
 
 		$sql_where = array();
-		$group_by = false;
 		$m_num = 0;
 		$w_num = 0;
 
@@ -879,7 +878,6 @@ class fulltext_native extends \phpbb\search\base
 
 				break;
 
-				case 'sqlite':
 				case 'sqlite3':
 					$sql_array_count['SELECT'] = ($type == 'posts') ? 'DISTINCT p.post_id' : 'DISTINCT p.topic_id';
 					$sql = 'SELECT COUNT(' . (($type == 'posts') ? 'post_id' : 'topic_id') . ') as total_results
@@ -1186,7 +1184,7 @@ class fulltext_native extends \phpbb\search\base
 					}
 					else
 					{
-						if ($this->db->get_sql_layer() == 'sqlite' || $this->db->get_sql_layer() == 'sqlite3')
+						if ($this->db->get_sql_layer() == 'sqlite3')
 						{
 							$sql = 'SELECT COUNT(topic_id) as total_results
 								FROM (SELECT DISTINCT t.topic_id';
@@ -1203,7 +1201,7 @@ class fulltext_native extends \phpbb\search\base
 								$post_visibility
 								$sql_fora
 								AND t.topic_id = p.topic_id
-								$sql_time" . (($this->db->get_sql_layer() == 'sqlite' || $this->db->get_sql_layer() == 'sqlite3') ? ')' : '');
+								$sql_time" . ($this->db->get_sql_layer() == 'sqlite3' ? ')' : '');
 					}
 					$result = $this->db->sql_query($sql);
 
@@ -1325,7 +1323,6 @@ class fulltext_native extends \phpbb\search\base
 		$match[] = '#\[\/?[a-z0-9\*\+\-]+(?:=.*?)?(?::[a-z])?(\:?[0-9a-z]{5,})\]#';
 
 		$min = $this->word_length['min'];
-		$max = $this->word_length['max'];
 
 		$isset_min = $min - 1;
 
@@ -1361,9 +1358,9 @@ class fulltext_native extends \phpbb\search\base
 				* Note: this could be optimized. If the codepoint is lower than Hangul's range
 				* we know that it will also be lower than CJK ranges
 				*/
-				if ((strncmp($word, UTF8_HANGUL_FIRST, 3) < 0 || strncmp($word, UTF8_HANGUL_LAST, 3) > 0)
-					&& (strncmp($word, UTF8_CJK_FIRST, 3) < 0 || strncmp($word, UTF8_CJK_LAST, 3) > 0)
-					&& (strncmp($word, UTF8_CJK_B_FIRST, 4) < 0 || strncmp($word, UTF8_CJK_B_LAST, 4) > 0))
+				if ((strncmp($word, self::UTF8_HANGUL_FIRST, 3) < 0 || strncmp($word, self::UTF8_HANGUL_LAST, 3) > 0)
+					&& (strncmp($word, self::UTF8_CJK_FIRST, 3) < 0 || strncmp($word, self::UTF8_CJK_LAST, 3) > 0)
+					&& (strncmp($word, self::UTF8_CJK_B_FIRST, 4) < 0 || strncmp($word, self::UTF8_CJK_B_LAST, 4) > 0))
 				{
 					$word = strtok(' ');
 					continue;
@@ -1608,7 +1605,7 @@ class fulltext_native extends \phpbb\search\base
 		// carry on ... it's okay ... I know when I'm not wanted boo hoo
 		if (!$this->config['fulltext_native_load_upd'])
 		{
-			set_config('search_last_gc', time(), true);
+			$this->config->set('search_last_gc', time(), false);
 			return;
 		}
 
@@ -1643,7 +1640,7 @@ class fulltext_native extends \phpbb\search\base
 
 				// by setting search_last_gc to the new time here we make sure that if a user reloads because the
 				// following query takes too long, he won't run into it again
-				set_config('search_last_gc', time(), true);
+				$this->config->set('search_last_gc', time(), false);
 
 				// Delete the matches
 				$sql = 'DELETE FROM ' . SEARCH_WORDMATCH_TABLE . '
@@ -1659,7 +1656,7 @@ class fulltext_native extends \phpbb\search\base
 			$this->destroy_cache(array_unique($destroy_cache_words));
 		}
 
-		set_config('search_last_gc', time(), true);
+		$this->config->set('search_last_gc', time(), false);
 	}
 
 	/**
@@ -1669,7 +1666,6 @@ class fulltext_native extends \phpbb\search\base
 	{
 		switch ($this->db->get_sql_layer())
 		{
-			case 'sqlite':
 			case 'sqlite3':
 				$this->db->sql_query('DELETE FROM ' . SEARCH_WORDLIST_TABLE);
 				$this->db->sql_query('DELETE FROM ' . SEARCH_WORDMATCH_TABLE);
@@ -1730,13 +1726,11 @@ class fulltext_native extends \phpbb\search\base
 	* @param	string	$allowed_chars	String of special chars to allow
 	* @param	string	$encoding		Text encoding
 	* @return	string					Cleaned up text, only alphanumeric chars are left
-	*
-	* @todo \normalizer::cleanup being able to be used?
 	*/
 	protected function cleanup($text, $allowed_chars = null, $encoding = 'utf-8')
 	{
 		static $conv = array(), $conv_loaded = array();
-		$words = $allow = array();
+		$allow = array();
 
 		// Convert the text to UTF-8
 		$encoding = strtolower($encoding);
@@ -1758,12 +1752,9 @@ class fulltext_native extends \phpbb\search\base
 		$text = htmlspecialchars_decode(utf8_decode_ncr($text), ENT_QUOTES);
 
 		/**
-		* Load the UTF-8 normalizer
-		*
-		* If we use it more widely, an instance of that class should be held in a
-		* a global variable instead
+		* Normalize to NFC
 		*/
-		\utf_normalizer::nfc($text);
+		$text = \Normalizer::normalize($text);
 
 		/**
 		* The first thing we do is:
@@ -1856,9 +1847,9 @@ class fulltext_native extends \phpbb\search\base
 			$utf_char = substr($text, $pos, $utf_len);
 			$pos += $utf_len;
 
-			if (($utf_char >= UTF8_HANGUL_FIRST && $utf_char <= UTF8_HANGUL_LAST)
-				|| ($utf_char >= UTF8_CJK_FIRST && $utf_char <= UTF8_CJK_LAST)
-				|| ($utf_char >= UTF8_CJK_B_FIRST && $utf_char <= UTF8_CJK_B_LAST))
+			if (($utf_char >= self::UTF8_HANGUL_FIRST && $utf_char <= self::UTF8_HANGUL_LAST)
+				|| ($utf_char >= self::UTF8_CJK_FIRST && $utf_char <= self::UTF8_CJK_LAST)
+				|| ($utf_char >= self::UTF8_CJK_B_FIRST && $utf_char <= self::UTF8_CJK_B_LAST))
 			{
 				/**
 				* All characters within these ranges are valid
--- a/phpbb/search/fulltext_postgres.php
+++ b/phpbb/search/fulltext_postgres.php
@@ -501,7 +501,6 @@ class fulltext_postgres extends \phpbb\search\base
 		$sql_select			= ($type == 'posts') ? 'p.post_id' : 'DISTINCT t.topic_id';
 		$sql_from			= ($join_topic) ? TOPICS_TABLE . ' t, ' : '';
 		$field				= ($type == 'posts') ? 'post_id' : 'topic_id';
-		$sql_author			= (sizeof($author_ary) == 1) ? ' = ' . $author_ary[0] : 'IN (' . implode(', ', $author_ary) . ')';
 
 		if (sizeof($author_ary) && $author_name)
 		{
@@ -526,7 +525,6 @@ class fulltext_postgres extends \phpbb\search\base
 		$sql_where_options .= ($sort_days) ? ' AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
 		$sql_where_options .= $sql_match_where;
 
-		$tmp_sql_match = array();
 		$sql_match = str_replace(',', " || ' ' ||", $sql_match);
 		$tmp_sql_match = "to_tsvector ('" . $this->db->sql_escape($this->config['fulltext_postgres_ts_name']) . "', " . $sql_match . ") @@ to_tsquery ('" . $this->db->sql_escape($this->config['fulltext_postgres_ts_name']) . "', '" . $this->db->sql_escape($this->tsearch_query) . "')";
 
@@ -838,7 +836,7 @@ class fulltext_postgres extends \phpbb\search\base
 					GROUP BY t.topic_id, $sort_by_sql[$sort_key]";
 			}
 
-			$result = $this->db->sql_query($sql_count);
+			$this->db->sql_query($sql_count);
 			$result_count = (int) $this->db->sql_fetchfield('result_count');
 
 			if (!$result_count)
@@ -916,7 +914,7 @@ class fulltext_postgres extends \phpbb\search\base
 		// destroy too old cached search results
 		$this->destroy_cache(array());
 
-		set_config('search_last_gc', time(), true);
+		$this->config->set('search_last_gc', time(), false);
 	}
 
 	/**
--- a/phpbb/search/fulltext_sphinx.php
+++ b/phpbb/search/fulltext_sphinx.php
@@ -85,7 +85,7 @@ class fulltext_sphinx
 
 	/**
 	 * Database Tools object
-	 * @var \phpbb\db\tools
+	 * @var \phpbb\db\tools\tools_interface
 	 */
 	protected $db_tools;
 
@@ -143,12 +143,13 @@ class fulltext_sphinx
 		$this->db = $db;
 		$this->auth = $auth;
 
-		// Initialize \phpbb\db\tools object
-		$this->db_tools = new \phpbb\db\tools($this->db);
+		// Initialize \phpbb\db\tools\tools object
+		global $phpbb_container; // TODO inject into object
+		$this->db_tools = $phpbb_container->get('dbal.tools');
 
 		if (!$this->config['fulltext_sphinx_id'])
 		{
-			set_config('fulltext_sphinx_id', unique_id());
+			$this->config->set('fulltext_sphinx_id', unique_id());
 		}
 		$this->id = $this->config['fulltext_sphinx_id'];
 		$this->indexes = 'index_phpbb_' . $this->id . '_delta;index_phpbb_' . $this->id . '_main';
@@ -219,7 +220,7 @@ class fulltext_sphinx
 		}
 
 		// Move delta to main index each hour
-		set_config('search_gc', 3600);
+		$this->config->set('search_gc', 3600);
 
 		return false;
 	}
@@ -403,7 +404,7 @@ class fulltext_sphinx
 					$variable = $section->get_variable_by_name($key);
 					if (!$variable)
 					{
-						$variable = $section->create_variable($key, $value);
+						$section->create_variable($key, $value);
 					}
 					else
 					{
@@ -412,7 +413,7 @@ class fulltext_sphinx
 				}
 				else
 				{
-					$variable = $section->create_variable($key, $value);
+					$section->create_variable($key, $value);
 				}
 			}
 		}
@@ -436,7 +437,6 @@ class fulltext_sphinx
 			$match		= array('#\sand\s#i', '#\sor\s#i', '#\snot\s#i', '#\+#', '#-#', '#\|#', '#@#');
 			$replace	= array(' & ', ' | ', '  - ', ' +', ' -', ' |', '');
 
-			$replacements = 0;
 			$keywords = preg_replace($match, $replace, $keywords);
 			$this->sphinx->SetMatchMode(SPH_MATCH_EXTENDED);
 		}
@@ -479,6 +479,8 @@ class fulltext_sphinx
 	*/
 	public function keyword_search($type, $fields, $terms, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $post_visibility, $topic_id, $author_ary, $author_name, &$id_ary, &$start, $per_page)
 	{
+		global $user, $phpbb_log;
+
 		// No keywords? No posts.
 		if (!strlen($this->search_query) && !sizeof($author_ary))
 		{
@@ -487,8 +489,6 @@ class fulltext_sphinx
 
 		$id_ary = array();
 
-		$join_topic = ($type != 'posts');
-
 		// Sorting
 
 		if ($type == 'topics')
@@ -661,7 +661,7 @@ class fulltext_sphinx
 
 		if ($this->sphinx->GetLastError())
 		{
-			add_log('critical', 'LOG_SPHINX_ERROR', $this->sphinx->GetLastError());
+			$phpbb_log->add('critical', $user->data['user_id'], $user->ip, 'LOG_SPHINX_ERROR', false, array($this->sphinx->GetLastError()));
 			if ($this->auth->acl_get('a_'))
 			{
 				trigger_error($this->user->lang('SPHINX_SEARCH_FAILED', $this->sphinx->GetLastError()));
@@ -815,7 +815,7 @@ class fulltext_sphinx
 	*/
 	public function tidy($create = false)
 	{
-		set_config('search_last_gc', time(), true);
+		$this->config->set('search_last_gc', time(), false);
 	}
 
 	/**
--- a/phpbb/session.php
+++ b/phpbb/session.php
@@ -92,8 +92,8 @@ class session
 		}
 
 		// current directory within the phpBB root (for example: adm)
-		$root_dirs = explode('/', str_replace('\\', '/', phpbb_realpath($root_path)));
-		$page_dirs = explode('/', str_replace('\\', '/', phpbb_realpath('./')));
+		$root_dirs = explode('/', str_replace('\\', '/', $phpbb_filesystem->realpath($root_path)));
+		$page_dirs = explode('/', str_replace('\\', '/', $phpbb_filesystem->realpath('./')));
 		$intersection = array_intersect_assoc($root_dirs, $page_dirs);
 
 		$root_dirs = array_diff_assoc($root_dirs, $intersection);
@@ -219,7 +219,7 @@ class session
 	function session_begin($update_session_page = true)
 	{
 		global $phpEx, $SID, $_SID, $_EXTRA_URL, $db, $config, $phpbb_root_path;
-		global $request, $phpbb_container, $phpbb_dispatcher;
+		global $request, $phpbb_container, $user, $phpbb_log, $phpbb_dispatcher;
 
 		// Give us some basic information
 		$this->time_now				= time();
@@ -257,23 +257,23 @@ class session
 
 		if ($request->is_set($config['cookie_name'] . '_sid', \phpbb\request\request_interface::COOKIE) || $request->is_set($config['cookie_name'] . '_u', \phpbb\request\request_interface::COOKIE))
 		{
-			$this->cookie_data['u'] = request_var($config['cookie_name'] . '_u', 0, false, true);
-			$this->cookie_data['k'] = request_var($config['cookie_name'] . '_k', '', false, true);
-			$this->session_id 		= request_var($config['cookie_name'] . '_sid', '', false, true);
+			$this->cookie_data['u'] = $request->variable($config['cookie_name'] . '_u', 0, false, \phpbb\request\request_interface::COOKIE);
+			$this->cookie_data['k'] = $request->variable($config['cookie_name'] . '_k', '', false, \phpbb\request\request_interface::COOKIE);
+			$this->session_id 		= $request->variable($config['cookie_name'] . '_sid', '', false, \phpbb\request\request_interface::COOKIE);
 
 			$SID = (defined('NEED_SID')) ? '?sid=' . $this->session_id : '?sid=';
 			$_SID = (defined('NEED_SID')) ? $this->session_id : '';
 
 			if (empty($this->session_id))
 			{
-				$this->session_id = $_SID = request_var('sid', '');
+				$this->session_id = $_SID = $request->variable('sid', '');
 				$SID = '?sid=' . $this->session_id;
 				$this->cookie_data = array('u' => 0, 'k' => '');
 			}
 		}
 		else
 		{
-			$this->session_id = $_SID = request_var('sid', '');
+			$this->session_id = $_SID = $request->variable('sid', '');
 			$SID = '?sid=' . $this->session_id;
 		}
 
@@ -359,8 +359,8 @@ class session
 			}
 			else
 			{
-				set_config('limit_load', '0');
-				set_config('limit_search_load', '0');
+				$config->set('limit_load', '0');
+				$config->set('limit_search_load', '0');
 			}
 		}
 
@@ -423,6 +423,7 @@ class session
 					$session_expired = false;
 
 					// Check whether the session is still valid if we have one
+					/* @var $provider_collection \phpbb\auth\provider_collection */
 					$provider_collection = $phpbb_container->get('auth.provider_collection');
 					$provider = $provider_collection->get_provider();
 
@@ -470,11 +471,18 @@ class session
 					{
 						if ($referer_valid)
 						{
-							add_log('critical', 'LOG_IP_BROWSER_FORWARDED_CHECK', $u_ip, $s_ip, $u_browser, $s_browser, htmlspecialchars($u_forwarded_for), htmlspecialchars($s_forwarded_for));
+							$phpbb_log->add('critical', $user->data['user_id'], $user->ip, 'LOG_IP_BROWSER_FORWARDED_CHECK', false, array(
+								$u_ip,
+								$s_ip,
+								$u_browser,
+								$s_browser,
+								htmlspecialchars($u_forwarded_for),
+								htmlspecialchars($s_forwarded_for)
+							));
 						}
 						else
 						{
-							add_log('critical', 'LOG_REFERER_INVALID', $this->referer);
+							$phpbb_log->add('critical', $user->data['user_id'], $user->ip, 'LOG_REFERER_INVALID', false, array($this->referer));
 						}
 					}
 				}
@@ -496,7 +504,7 @@ class session
 	*/
 	function session_create($user_id = false, $set_admin = false, $persist_login = false, $viewonline = true)
 	{
-		global $SID, $_SID, $db, $config, $cache, $phpbb_root_path, $phpEx, $phpbb_container, $phpbb_dispatcher;
+		global $SID, $_SID, $db, $config, $cache, $phpbb_container, $phpbb_dispatcher;
 
 		$this->data = array();
 
@@ -559,6 +567,7 @@ class session
 			}
 		}
 
+		/* @var $provider_collection \phpbb\auth\provider_collection */
 		$provider_collection = $phpbb_container->get('auth.provider_collection');
 		$provider = $provider_collection->get_provider();
 		$this->data = $provider->autologin();
@@ -829,7 +838,7 @@ class session
 			$sql = 'SELECT COUNT(session_id) AS sessions
 					FROM ' . SESSIONS_TABLE . '
 					WHERE session_user_id = ' . (int) $this->data['user_id'] . '
-					AND session_time >= ' . (int) ($this->time_now - (max($config['session_length'], $config['form_token_lifetime'])));
+					AND session_time >= ' . (int) ($this->time_now - (max((int) $config['session_length'], (int) $config['form_token_lifetime'])));
 			$result = $db->sql_query($sql);
 			$row = $db->sql_fetchrow($result);
 			$db->sql_freeresult($result);
@@ -884,7 +893,7 @@ class session
 	*/
 	function session_kill($new_session = true)
 	{
-		global $SID, $_SID, $db, $config, $phpbb_root_path, $phpEx, $phpbb_container, $phpbb_dispatcher;
+		global $SID, $_SID, $db, $phpbb_container, $phpbb_dispatcher;
 
 		$sql = 'DELETE FROM ' . SESSIONS_TABLE . "
 			WHERE session_id = '" . $db->sql_escape($this->session_id) . "'
@@ -909,6 +918,7 @@ class session
 		unset($session_id);
 
 		// Allow connecting logout with external auth method logout
+		/* @var $provider_collection \phpbb\auth\provider_collection */
 		$provider_collection = $phpbb_container->get('auth.provider_collection');
 		$provider = $provider_collection->get_provider();
 		$provider->logout($this->data, $new_session);
@@ -975,7 +985,7 @@ class session
 	*/
 	function session_gc()
 	{
-		global $db, $config, $phpbb_root_path, $phpEx, $phpbb_container, $phpbb_dispatcher;
+		global $db, $config, $phpbb_container, $phpbb_dispatcher;
 
 		$batch_size = 10;
 
@@ -1025,7 +1035,7 @@ class session
 		{
 			// Less than 10 users, update gc timer ... else we want gc
 			// called again to delete other sessions
-			set_config('session_last_gc', $this->time_now, true);
+			$config->set('session_last_gc', $this->time_now, false);
 
 			if ($config['max_autologin_time'])
 			{
@@ -1035,6 +1045,7 @@ class session
 			}
 
 			// only called from CRON; should be a safe workaround until the infrastructure gets going
+			/* @var $captcha_factory \phpbb\captcha\factory */
 			$captcha_factory = $phpbb_container->get('captcha.factory');
 			$captcha_factory->garbage_collect($config['captcha_plugin']);
 
@@ -1068,6 +1079,12 @@ class session
 	{
 		global $config;
 
+		// If headers are already set, we just return
+		if (headers_sent())
+		{
+			return;
+		}
+
 		$name_data = rawurlencode($config['cookie_name'] . '_' . $name) . '=' . rawurlencode($cookiedata);
 		$expire = gmdate('D, d-M-Y H:i:s \\G\\M\\T', $cookietime);
 		$domain = (!$config['cookie_domain'] || $config['cookie_domain'] == '127.0.0.1' || strpos($config['cookie_domain'], '.') === false) ? '' : '; domain=' . $config['cookie_domain'];
@@ -1219,7 +1236,7 @@ class session
 
 		if ($banned && !$return)
 		{
-			global $template, $phpbb_root_path, $phpEx;
+			global $phpbb_root_path, $phpEx;
 
 			// If the session is empty we need to create a valid one...
 			if (empty($this->session_id))
@@ -1396,7 +1413,7 @@ class session
 	*/
 	function set_login_key($user_id = false, $key = false, $user_ip = false)
 	{
-		global $config, $db;
+		global $db;
 
 		$user_id = ($user_id === false) ? $this->data['user_id'] : $user_id;
 		$user_ip = ($user_ip === false) ? $this->ip : $user_ip;
@@ -1406,7 +1423,7 @@ class session
 
 		$sql_ary = array(
 			'key_id'		=> (string) md5($key_id),
-			'last_ip'		=> (string) $this->ip,
+			'last_ip'		=> (string) $user_ip,
 			'last_login'	=> (int) time()
 		);
 
@@ -1443,7 +1460,7 @@ class session
 	*/
 	function reset_login_keys($user_id = false)
 	{
-		global $config, $db;
+		global $db;
 
 		$user_id = ($user_id === false) ? (int) $this->data['user_id'] : (int) $user_id;
 
--- a/phpbb/template/asset.php
+++ b/phpbb/template/asset.php
@@ -20,15 +20,20 @@ class asset
 	/** @var \phpbb\path_helper **/
 	protected $path_helper;
 
+	/** @var \phpbb\filesystem\filesystem */
+	protected $filesystem;
+
 	/**
 	* Constructor
 	*
 	* @param string $url URL
 	* @param \phpbb\path_helper $path_helper Path helper object
+	* @param \phpbb\filesystem\filesystem $filesystem
 	*/
-	public function __construct($url, \phpbb\path_helper $path_helper)
+	public function __construct($url, \phpbb\path_helper $path_helper, \phpbb\filesystem\filesystem $filesystem)
 	{
 		$this->path_helper = $path_helper;
+		$this->filesystem = $filesystem;
 
 		$this->set_url($url);
 	}
@@ -152,18 +157,18 @@ class asset
 	*/
 	public function set_path($path, $urlencode = false)
 	{
-		// Since 1.7.0 Twig returns the real path of the file. We need it to be relative to the working directory.
-		$real_root_path = realpath($this->path_helper->get_phpbb_root_path()) . DIRECTORY_SEPARATOR;
+		// Since 1.7.0 Twig returns the real path of the file. We need it to be relative.
+		$real_root_path = $this->filesystem->realpath($this->path_helper->get_phpbb_root_path()) . DIRECTORY_SEPARATOR;
 
 		// If the asset is under the phpBB root path we need to remove its path and then prepend $phpbb_root_path
-		if (substr($path . DIRECTORY_SEPARATOR, 0, strlen($real_root_path)) === $real_root_path)
+		if ($real_root_path && substr($path . DIRECTORY_SEPARATOR, 0, strlen($real_root_path)) === $real_root_path)
 		{
 			$path = $this->path_helper->get_phpbb_root_path() . str_replace('\\', '/', substr($path, strlen($real_root_path)));
 		}
 		else
 		{
 			// Else we make the path relative to the current working directory
-			$real_root_path = realpath('.') . DIRECTORY_SEPARATOR;
+			$real_root_path = $this->filesystem->realpath('.') . DIRECTORY_SEPARATOR;
 			if ($real_root_path && substr($path . DIRECTORY_SEPARATOR, 0, strlen($real_root_path)) === $real_root_path)
 			{
 				$path = str_replace('\\', '/', substr($path, strlen($real_root_path)));
--- /dev/null
+++ b/phpbb/template/assets_bag.php
@@ -0,0 +1,95 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\template;
+
+class assets_bag
+{
+	/** @var asset[] */
+	protected $stylesheets = [];
+
+	/** @var asset[] */
+	protected $scripts = [];
+
+	/**
+	 * Add a css asset to the bag
+	 *
+	 * @param asset $asset
+	 */
+	public function add_stylesheet(asset $asset)
+	{
+		$this->stylesheets[] = $asset;
+	}
+
+	/**
+	 * Add a js script asset to the bag
+	 *
+	 * @param asset $asset
+	 */
+	public function add_script(asset $asset)
+	{
+		$this->scripts[] = $asset;
+	}
+
+	/**
+	 * Returns all css assets
+	 *
+	 * @return asset[]
+	 */
+	public function get_stylesheets()
+	{
+		return $this->stylesheets;
+	}
+
+	/**
+	 * Returns all js assets
+	 *
+	 * @return asset[]
+	 */
+	public function get_scripts()
+	{
+		return $this->scripts;
+	}
+
+	/**
+	 * Returns the HTML code to includes all css assets
+	 *
+	 * @return string
+	 */
+	public function get_stylesheets_content()
+	{
+		$output = '';
+		foreach ($this->stylesheets as $stylesheet)
+		{
+			$output .= "<link href=\"{$stylesheet->get_url()}\" rel=\"stylesheet\" type=\"text/css\" media=\"screen\" />\n";
+		}
+
+		return $output;
+	}
+
+	/**
+	 * Returns the HTML code to includes all js assets
+	 *
+	 * @return string
+	 */
+	public function get_scripts_content()
+	{
+		$output = '';
+		foreach ($this->scripts as $script)
+		{
+			$output .= "<script type=\"text/javascript\" src=\"{$script->get_url()}\"></script>\n";
+		}
+
+		return $output;
+	}
+}
--- a/phpbb/template/context.php
+++ b/phpbb/template/context.php
@@ -365,15 +365,15 @@ class context
 		if ($mode == 'insert')
 		{
 			// Make sure we are not exceeding the last iteration
-			if ($key >= sizeof($this->tpldata[$blockname]))
+			if ($key >= sizeof($block))
 			{
-				$key = sizeof($this->tpldata[$blockname]);
-				unset($this->tpldata[$blockname][($key - 1)]['S_LAST_ROW']);
+				$key = sizeof($block);
+				unset($block[($key - 1)]['S_LAST_ROW']);
 				$vararray['S_LAST_ROW'] = true;
 			}
 			else if ($key === 0)
 			{
-				unset($this->tpldata[$blockname][0]['S_FIRST_ROW']);
+				unset($block[0]['S_FIRST_ROW']);
 				$vararray['S_FIRST_ROW'] = true;
 			}
 
--- /dev/null
+++ b/phpbb/template/exception/user_object_not_available.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\template\exception;
+
+/**
+ * This exception is thrown when the user object was not set but it is required by the called method
+ */
+class user_object_not_available extends \phpbb\exception\runtime_exception
+{
+
+}
--- a/phpbb/template/twig/environment.php
+++ b/phpbb/template/twig/environment.php
@@ -13,14 +13,22 @@
 
 namespace phpbb\template\twig;
 
+use phpbb\template\assets_bag;
+
 class environment extends \Twig_Environment
 {
 	/** @var \phpbb\config\config */
 	protected $phpbb_config;
 
+	/** @var \phpbb\filesystem\filesystem */
+	protected $filesystem;
+
 	/** @var \phpbb\path_helper */
 	protected $phpbb_path_helper;
 
+	/** @var \Symfony\Component\DependencyInjection\ContainerInterface */
+	protected $container;
+
 	/** @var \phpbb\extension\manager */
 	protected $extension_manager;
 
@@ -33,26 +41,41 @@ class environment extends \Twig_Environment
 	/** @var array **/
 	protected $namespace_look_up_order = array('__main__');
 
+	/** @var assets_bag */
+	protected $assets_bag;
+
 	/**
 	* Constructor
 	*
 	* @param \phpbb\config\config $phpbb_config The phpBB configuration
+	* @param \phpbb\filesystem\filesystem $filesystem
 	* @param \phpbb\path_helper $path_helper phpBB path helper
+	* @param string $cache_path The path to the cache directory
 	* @param \phpbb\extension\manager $extension_manager phpBB extension manager
 	* @param \Twig_LoaderInterface $loader Twig loader interface
 	* @param array $options Array of options to pass to Twig
 	*/
-	public function __construct($phpbb_config, \phpbb\path_helper $path_helper, \phpbb\extension\manager $extension_manager = null, \Twig_LoaderInterface $loader = null, $options = array())
+	public function __construct(\phpbb\config\config $phpbb_config, \phpbb\filesystem\filesystem $filesystem, \phpbb\path_helper $path_helper, $cache_path, \phpbb\extension\manager $extension_manager = null, \Twig_LoaderInterface $loader = null, $options = array())
 	{
 		$this->phpbb_config = $phpbb_config;
 
+		$this->filesystem = $filesystem;
 		$this->phpbb_path_helper = $path_helper;
 		$this->extension_manager = $extension_manager;
 
 		$this->phpbb_root_path = $this->phpbb_path_helper->get_phpbb_root_path();
 		$this->web_root_path = $this->phpbb_path_helper->get_web_root_path();
 
-		return parent::__construct($loader, $options);
+		$this->assets_bag = new assets_bag();
+
+		$options = array_merge(array(
+			'cache'			=> (defined('IN_INSTALL')) ? false : $cache_path,
+			'debug'			=> false,
+			'auto_reload'	=> (bool) $this->phpbb_config['load_tplcompile'],
+			'autoescape'	=> false,
+		), $options);
+
+		parent::__construct($loader, $options);
 	}
 
 	/**
@@ -78,15 +101,25 @@ class environment extends \Twig_Environment
 	}
 
 	/**
-	* Get the phpBB root path
-	*
-	* @return string
-	*/
+	 * Get the phpBB root path
+	 *
+	 * @return string
+	 */
 	public function get_phpbb_root_path()
 	{
 		return $this->phpbb_root_path;
 	}
 
+	/**
+	* Get the filesystem object
+	*
+	* @return \phpbb\filesystem\filesystem
+	*/
+	public function get_filesystem()
+	{
+		return $this->filesystem;
+	}
+
 	/**
 	* Get the web root path
 	*
@@ -107,6 +140,16 @@ class environment extends \Twig_Environment
 		return $this->phpbb_path_helper;
 	}
 
+	/**
+	 * Gets the assets bag
+	 *
+	 * @return assets_bag
+	 */
+	public function get_assets_bag()
+	{
+		return $this->assets_bag;
+	}
+
 	/**
 	* Get the namespace look up order
 	*
@@ -130,6 +173,55 @@ class environment extends \Twig_Environment
 		return $this;
 	}
 
+	/**
+	 * {@inheritdoc}
+	 */
+	public function render($name, array $context = [])
+	{
+		return $this->display_with_assets($name, $context);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function display($name, array $context = [])
+	{
+		echo $this->display_with_assets($name, $context);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	private function display_with_assets($name, array $context = [])
+	{
+		$placeholder_salt = unique_id();
+
+		if (array_key_exists('definition', $context))
+		{
+			$context['definition']->set('SCRIPTS', '__SCRIPTS_' . $placeholder_salt . '__');
+			$context['definition']->set('STYLESHEETS', '__STYLESHEETS_' . $placeholder_salt . '__');
+		}
+
+		$output = parent::render($name, $context);
+
+		return $this->inject_assets($output, $placeholder_salt);
+	}
+
+	/**
+	 * Injects the assets (from INCLUDECSS/JS) in the output.
+	 *
+	 * @param string $output
+	 *
+	 * @return string
+	 */
+	private function inject_assets($output, $placeholder_salt)
+	{
+		$output = str_replace('__STYLESHEETS_' . $placeholder_salt . '__', $this->assets_bag->get_stylesheets_content(), $output);
+		$output = str_replace('__SCRIPTS_' . $placeholder_salt . '__', $this->assets_bag->get_scripts_content(), $output);
+
+		return $output;
+	}
+
 	/**
 	* Loads a template by name.
 	*
--- a/phpbb/template/twig/extension.php
+++ b/phpbb/template/twig/extension.php
@@ -18,20 +18,20 @@ class extension extends \Twig_Extension
 	/** @var \phpbb\template\context */
 	protected $context;
 
-	/** @var \phpbb\user */
-	protected $user;
+	/** @var \phpbb\language\language */
+	protected $language;
 
 	/**
 	* Constructor
 	*
 	* @param \phpbb\template\context $context
-	* @param \phpbb\user $user
+	* @param \phpbb\language\language $language
 	* @return \phpbb\template\twig\extension
 	*/
-	public function __construct(\phpbb\template\context $context, $user)
+	public function __construct(\phpbb\template\context $context, $language)
 	{
 		$this->context = $context;
-		$this->user = $user;
+		$this->language = $language;
 	}
 
 	/**
@@ -71,6 +71,7 @@ class extension extends \Twig_Extension
 	{
 		return array(
 			new \Twig_SimpleFilter('subset', array($this, 'loop_subset'), array('needs_environment' => true)),
+			// @deprecated 3.2.0 Uses twig's JS escape method instead of addslashes
 			new \Twig_SimpleFilter('addslashes', 'addslashes'),
 		);
 	}
@@ -169,17 +170,16 @@ class extension extends \Twig_Extension
 		$args = func_get_args();
 		$key = $args[0];
 
-		$context = $this->context->get_data_ref();
-		$context_vars = $context['.'][0];
+		$context_vars = $this->context->get_root_ref();
 
 		if (isset($context_vars['L_' . $key]))
 		{
 			return $context_vars['L_' . $key];
 		}
 
-		// LA_ is transformed into lang(\'$1\')|addslashes, so we should not
+		// LA_ is transformed into lang(\'$1\')|escape('js'), so we should not
 		// need to check for it
 
-		return call_user_func_array(array($this->user, 'lang'), $args);
+		return call_user_func_array(array($this->language, 'lang'), $args);
 	}
 }
--- /dev/null
+++ b/phpbb/template/twig/extension/routing.php
@@ -0,0 +1,43 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\template\twig\extension;
+
+use Symfony\Bridge\Twig\Extension\RoutingExtension;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+
+class routing extends RoutingExtension
+{
+	/** @var \phpbb\controller\helper */
+	protected $helper;
+
+	/**
+	* Constructor
+	*
+	* @param \phpbb\routing\helper $helper
+	*/
+	public function __construct(\phpbb\routing\helper $helper)
+	{
+		$this->helper = $helper;
+	}
+
+	public function getPath($name, $parameters = array(), $relative = false)
+	{
+		return $this->helper->route($name, $parameters, true, false, $relative ? UrlGeneratorInterface::RELATIVE_PATH : UrlGeneratorInterface::ABSOLUTE_PATH);
+	}
+
+	public function getUrl($name, $parameters = array(), $schemeRelative = false)
+	{
+		return $this->helper->route($name, $parameters, true, false, $schemeRelative ? UrlGeneratorInterface::NETWORK_PATH : UrlGeneratorInterface::ABSOLUTE_URL);
+	}
+}
--- a/phpbb/template/twig/lexer.php
+++ b/phpbb/template/twig/lexer.php
@@ -15,6 +15,11 @@ namespace phpbb\template\twig;
 
 class lexer extends \Twig_Lexer
 {
+	public function set_environment(\Twig_Environment $env)
+	{
+		$this->env = $env;
+	}
+
 	public function tokenize($code, $filename = null)
 	{
 		// Our phpBB tags
@@ -112,9 +117,9 @@ class lexer extends \Twig_Lexer
 		// Appends any filters after lang()
 		$code = preg_replace('#{L_([a-zA-Z0-9_\.]+)(\|[^}]+?)?}#', '{{ lang(\'$1\')$2 }}', $code);
 
-		// Replace all of our escaped language variables, {LA_VARNAME}, with Twig style, {{ lang('NAME')|addslashes }}
-		// Appends any filters after lang(), but before addslashes
-		$code = preg_replace('#{LA_([a-zA-Z0-9_\.]+)(\|[^}]+?)?}#', '{{ lang(\'$1\')$2|addslashes }}', $code);
+		// Replace all of our escaped language variables, {LA_VARNAME}, with Twig style, {{ lang('NAME')|escape('js') }}
+		// Appends any filters after lang(), but before escape('js')
+		$code = preg_replace('#{LA_([a-zA-Z0-9_\.]+)(\|[^}]+?)?}#', '{{ lang(\'$1\')$2|escape(\'js\') }}', $code);
 
 		// Replace all of our variables, {VARNAME}, with Twig style, {{ VARNAME }}
 		// Appends any filters
--- a/phpbb/template/twig/loader.php
+++ b/phpbb/template/twig/loader.php
@@ -20,6 +20,24 @@ class loader extends \Twig_Loader_Filesystem
 {
 	protected $safe_directories = array();
 
+	/**
+	 * @var \phpbb\filesystem\filesystem_interface
+	 */
+	protected $filesystem;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\filesystem\filesystem_interface $filesystem
+	 * @param string|array	$paths
+	 */
+	public function __construct(\phpbb\filesystem\filesystem_interface $filesystem, $paths = array())
+	{
+		$this->filesystem = $filesystem;
+
+		parent::__construct($paths);
+	}
+
 	/**
 	* Set safe directories
 	*
@@ -49,7 +67,7 @@ class loader extends \Twig_Loader_Filesystem
 	*/
 	public function addSafeDirectory($directory)
 	{
-		$directory = phpbb_realpath($directory);
+		$directory = $this->filesystem->realpath($directory);
 
 		if ($directory !== false)
 		{
@@ -82,6 +100,16 @@ class loader extends \Twig_Loader_Filesystem
 		return;
 	}
 
+	/**
+	 * Adds a realpath call to fix a BC break in Twig 1.26 (https://github.com/twigphp/Twig/issues/2145)
+	 *
+	 * {@inheritdoc}
+	 */
+	public function addPath($path, $namespace = self::MAIN_NAMESPACE)
+	{
+		return parent::addPath($this->filesystem->realpath($path), $namespace);
+	}
+
 	/**
 	* Find the template
 	*
@@ -119,7 +147,7 @@ class loader extends \Twig_Loader_Filesystem
 				//	can now check if we're within a "safe" directory
 
 				// Find the real path of the directory the file is in
-				$directory = phpbb_realpath(dirname($file));
+				$directory = $this->filesystem->realpath(dirname($file));
 
 				if ($directory === false)
 				{
--- a/phpbb/template/twig/node/event.php
+++ b/phpbb/template/twig/node/event.php
@@ -46,7 +46,7 @@ class event extends \Twig_Node
 		{
 			$ext_namespace = str_replace('/', '_', $ext_namespace);
 
-			if (defined('DEBUG'))
+			if ($this->environment->isDebug())
 			{
 				// If debug mode is enabled, lets check for new/removed EVENT
 				//  templates on page load rather than at compile. This is
@@ -58,7 +58,7 @@ class event extends \Twig_Node
 				;
 			}
 
-			if (defined('DEBUG') || $this->environment->getLoader()->exists('@' . $ext_namespace . '/' . $location . '.html'))
+			if ($this->environment->isDebug() || $this->environment->getLoader()->exists('@' . $ext_namespace . '/' . $location . '.html'))
 			{
 				$compiler
 					->write("\$previous_look_up_order = \$this->env->getNamespaceLookUpOrder();\n")
@@ -70,7 +70,7 @@ class event extends \Twig_Node
 				;
 			}
 
-			if (defined('DEBUG'))
+			if ($this->environment->isDebug())
 			{
 				$compiler
 					->outdent()
--- a/phpbb/template/twig/node/includeasset.php
+++ b/phpbb/template/twig/node/includeasset.php
@@ -39,7 +39,7 @@ abstract class includeasset extends \Twig_Node
 			->write("\$asset_file = ")
 			->subcompile($this->getNode('expr'))
 			->raw(";\n")
-			->write("\$asset = new \phpbb\\template\\asset(\$asset_file, \$this->getEnvironment()->get_path_helper());\n")
+			->write("\$asset = new \phpbb\\template\\asset(\$asset_file, \$this->getEnvironment()->get_path_helper(), \$this->getEnvironment()->get_filesystem());\n")
 			->write("if (substr(\$asset_file, 0, 2) !== './' && \$asset->is_relative()) {\n")
 			->indent()
 				->write("\$asset_path = \$asset->get_path();")
@@ -49,33 +49,18 @@ abstract class includeasset extends \Twig_Node
 					->write("\$local_file = \$this->getEnvironment()->findTemplate(\$asset_path);\n")
 					->write("\$asset->set_path(\$local_file, true);\n")
 				->outdent()
-				->write("\$asset->add_assets_version('{$config['assets_version']}');\n")
-				->write("\$asset_file = \$asset->get_url();\n")
 				->write("}\n")
+				->write("\$asset->add_assets_version('{$config['assets_version']}');\n")
 			->outdent()
 			->write("}\n")
-			->write("\$context['definition']->append('{$this->get_definition_name()}', '")
-		;
-
-		$this->append_asset($compiler);
-
-		$compiler
-			->raw("\n');\n")
+			->write("\$this->getEnvironment()->get_assets_bag()->add_{$this->get_setters_name()}(\$asset);")
 		;
 	}
 
 	/**
-	* Get the definition name
+	* Get the name of the assets bag setter
 	*
-	* @return string (e.g. 'SCRIPTS')
-	*/
-	abstract public function get_definition_name();
-
-	/**
-	* Append the output code for the asset
-	*
-	* @param \Twig_Compiler A Twig_Compiler instance
-	* @return null
+	* @return string (e.g. 'script')
 	*/
-	abstract protected function append_asset(\Twig_Compiler $compiler);
+	abstract public function get_setters_name();
 }
--- a/phpbb/template/twig/node/includecss.php
+++ b/phpbb/template/twig/node/includecss.php
@@ -18,20 +18,8 @@ class includecss extends \phpbb\template\twig\node\includeasset
 	/**
 	* {@inheritdoc}
 	*/
-	public function get_definition_name()
+	public function get_setters_name()
 	{
-		return 'STYLESHEETS';
-	}
-
-	/**
-	* {@inheritdoc}
-	*/
-	public function append_asset(\Twig_Compiler $compiler)
-	{
-		$compiler
-			->raw("<link href=\"' . ")
-			->raw("\$asset_file . '\"")
-			->raw(' rel="stylesheet" type="text/css" media="screen" />')
-		;
+		return 'stylesheet';
 	}
 }
--- a/phpbb/template/twig/node/includejs.php
+++ b/phpbb/template/twig/node/includejs.php
@@ -18,22 +18,8 @@ class includejs extends \phpbb\template\twig\node\includeasset
 	/**
 	* {@inheritdoc}
 	*/
-	public function get_definition_name()
+	public function get_setters_name()
 	{
-		return 'SCRIPTS';
-	}
-
-	/**
-	* {@inheritdoc}
-	*/
-	protected function append_asset(\Twig_Compiler $compiler)
-	{
-		$config = $this->environment->get_phpbb_config();
-
-		$compiler
-			->raw("<script type=\"text/javascript\" src=\"' . ")
-			->raw("\$asset_file")
-			->raw(". '\"></script>\n")
-		;
+		return 'script';
 	}
 }
--- a/phpbb/template/twig/twig.php
+++ b/phpbb/template/twig/twig.php
@@ -13,6 +13,8 @@
 
 namespace phpbb\template\twig;
 
+use phpbb\template\exception\user_object_not_available;
+
 /**
 * Twig Template class.
 */
@@ -76,11 +78,14 @@ class twig extends \phpbb\template\base
 	*
 	* @param \phpbb\path_helper $path_helper
 	* @param \phpbb\config\config $config
-	* @param \phpbb\user $user
 	* @param \phpbb\template\context $context template context
+	* @param \phpbb\template\twig\environment $twig_environment
+	* @param string $cache_path
+	* @param \phpbb\user|null $user
+	* @param array|\ArrayAccess $extensions
 	* @param \phpbb\extension\manager $extension_manager extension manager, if null then template events will not be invoked
 	*/
-	public function __construct(\phpbb\path_helper $path_helper, $config, $user, \phpbb\template\context $context, \phpbb\extension\manager $extension_manager = null)
+	public function __construct(\phpbb\path_helper $path_helper, $config, \phpbb\template\context $context, \phpbb\template\twig\environment $twig_environment, $cache_path, \phpbb\user $user = null, $extensions = array(), \phpbb\extension\manager $extension_manager = null)
 	{
 		$this->path_helper = $path_helper;
 		$this->phpbb_root_path = $path_helper->get_phpbb_root_path();
@@ -89,41 +94,14 @@ class twig extends \phpbb\template\base
 		$this->user = $user;
 		$this->context = $context;
 		$this->extension_manager = $extension_manager;
+		$this->cachepath = $cache_path;
+		$this->twig = $twig_environment;
 
-		$this->cachepath = $this->phpbb_root_path . 'cache/twig/';
-
-		// Initiate the loader, __main__ namespace paths will be setup later in set_style_names()
-		$loader = new \phpbb\template\twig\loader('');
-
-		$this->twig = new \phpbb\template\twig\environment(
-			$this->config,
-			$this->path_helper,
-			$this->extension_manager,
-			$loader,
-			array(
-				'cache'			=> (defined('IN_INSTALL')) ? false : $this->cachepath,
-				'debug'			=> defined('DEBUG'),
-				'auto_reload'	=> (bool) $this->config['load_tplcompile'],
-				'autoescape'	=> false,
-			)
-		);
-
-		$this->twig->addExtension(
-			new \phpbb\template\twig\extension(
-				$this->context,
-				$this->user
-			)
-		);
-
-		if (defined('DEBUG'))
+		foreach ($extensions as $extension)
 		{
-			$this->twig->addExtension(new \Twig_Extension_Debug());
+			$this->twig->addExtension($extension);
 		}
 
-		$lexer = new \phpbb\template\twig\lexer($this->twig);
-
-		$this->twig->setLexer($lexer);
-
 		// Add admin namespace
 		if ($this->path_helper->get_adm_relative_path() !== null && is_dir($this->phpbb_root_path . $this->path_helper->get_adm_relative_path() . 'style/'))
 		{
@@ -150,9 +128,16 @@ class twig extends \phpbb\template\base
 	* Get the style tree of the style preferred by the current user
 	*
 	* @return array Style tree, most specific first
+	*
+	* @throws \phpbb\template\exception\user_object_not_available	When user service was not set
 	*/
 	public function get_user_style()
 	{
+		if ($this->user === null)
+		{
+			throw new user_object_not_available();
+		}
+
 		$style_list = array(
 			$this->user->style['style_path'],
 		);
@@ -368,14 +353,24 @@ class twig extends \phpbb\template\base
 			$context_vars['.'][0], // To get normal vars
 			array(
 				'definition'	=> new \phpbb\template\twig\definition(),
-				'user'			=> $this->user,
 				'loops'			=> $context_vars, // To get loops
 			)
 		);
 
+		if ($this->user instanceof \phpbb\user)
+		{
+			$vars['user'] = $this->user;
+		}
+
 		// cleanup
 		unset($vars['loops']['.']);
 
+		// Inject in the main context the value added by assign_block_vars() to be able to use directly the Twig loops.
+		foreach ($vars['loops'] as $key => &$value)
+		{
+			$vars[$key] = $value;
+		}
+
 		return $vars;
 	}
 
--- /dev/null
+++ b/phpbb/textformatter/cache_interface.php
@@ -0,0 +1,31 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textformatter;
+
+/**
+* Currently only used to signal that something that could effect the rendering has changed.
+* BBCodes, smilies, censored words, templates, etc...
+*/
+interface cache_interface
+{
+	/**
+	* Invalidate and/or regenerate this text formatter's cache(s)
+	*/
+	public function invalidate();
+
+	/**
+	* Tidy/prune this text formatter's cache(s)
+	*/
+	public function tidy();
+}
--- /dev/null
+++ b/phpbb/textformatter/data_access.php
@@ -0,0 +1,228 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textformatter;
+
+/**
+* Data access layer that fetchs BBCodes, smilies and censored words from the database.
+* To be extended to include insert/update/delete operations.
+*
+* Also used to get templates.
+*/
+class data_access
+{
+	/**
+	* @var string Name of the BBCodes table
+	*/
+	protected $bbcodes_table;
+
+	/**
+	* @var \phpbb\db\driver\driver_interface
+	*/
+	protected $db;
+
+	/**
+	* @var string Name of the smilies table
+	*/
+	protected $smilies_table;
+
+	/**
+	* @var string Name of the styles table
+	*/
+	protected $styles_table;
+
+	/**
+	* @var string Path to the styles dir
+	*/
+	protected $styles_path;
+
+	/**
+	* @var string Name of the words table
+	*/
+	protected $words_table;
+
+	/**
+	* Constructor
+	*
+	* @param \phpbb\db\driver\driver_interface $db Database connection
+	* @param string $bbcodes_table Name of the BBCodes table
+	* @param string $smilies_table Name of the smilies table
+	* @param string $styles_table  Name of the styles table
+	* @param string $words_table   Name of the words table
+	* @param string $styles_path   Path to the styles dir
+	*/
+	public function __construct(\phpbb\db\driver\driver_interface $db, $bbcodes_table, $smilies_table, $styles_table, $words_table, $styles_path)
+	{
+		$this->db = $db;
+
+		$this->bbcodes_table = $bbcodes_table;
+		$this->smilies_table = $smilies_table;
+		$this->styles_table  = $styles_table;
+		$this->words_table   = $words_table;
+
+		$this->styles_path = $styles_path;
+	}
+
+	/**
+	* Return the list of custom BBCodes
+	*
+	* @return array
+	*/
+	public function get_bbcodes()
+	{
+		$sql = 'SELECT bbcode_match, bbcode_tpl FROM ' . $this->bbcodes_table;
+		$result = $this->db->sql_query($sql);
+		$rows = $this->db->sql_fetchrowset($result);
+		$this->db->sql_freeresult($result);
+
+		return $rows;
+	}
+
+	/**
+	* Return the list of smilies
+	*
+	* @return array
+	*/
+	public function get_smilies()
+	{
+		// NOTE: smilies that are displayed on the posting page are processed first because they're
+		//       typically the most used smilies and it ends up producing a slightly more efficient
+		//       renderer
+		$sql = 'SELECT code, emotion, smiley_url, smiley_width, smiley_height
+			FROM ' . $this->smilies_table . '
+			ORDER BY display_on_posting DESC';
+		$result = $this->db->sql_query($sql);
+		$rows = $this->db->sql_fetchrowset($result);
+		$this->db->sql_freeresult($result);
+
+		return $rows;
+	}
+
+	/**
+	* Return the list of installed styles
+	*
+	* @return array
+	*/
+	protected function get_styles()
+	{
+		$sql = 'SELECT style_id, style_path, style_parent_id, bbcode_bitfield FROM ' . $this->styles_table;
+		$result = $this->db->sql_query($sql);
+		$rows = $this->db->sql_fetchrowset($result);
+		$this->db->sql_freeresult($result);
+
+		return $rows;
+	}
+
+	/**
+	* Return the bbcode.html template for every installed style
+	*
+	* @return array 2D array. style_id as keys, each element is an array with a "template" element that contains the style's bbcode.html and a "bbcodes" element that contains the name of each BBCode that is to be stylised
+	*/
+	public function get_styles_templates()
+	{
+		$templates = array();
+
+		$bbcode_ids = array(
+			'quote' => 0,
+			'b'     => 1,
+			'i'     => 2,
+			'url'   => 3,
+			'img'   => 4,
+			'size'  => 5,
+			'color' => 6,
+			'u'     => 7,
+			'code'  => 8,
+			'list'  => 9,
+			'*'     => 9,
+			'email' => 10,
+			'flash' => 11,
+			'attachment' => 12,
+		);
+
+		$styles = array();
+		foreach ($this->get_styles() as $row)
+		{
+			$styles[$row['style_id']] = $row;
+		}
+
+		foreach ($styles as $style_id => $style)
+		{
+			$bbcodes = array();
+
+			// Collect the name of the BBCodes whose bit is set in the style's bbcode_bitfield
+			$template_bitfield = new \bitfield($style['bbcode_bitfield']);
+			foreach ($bbcode_ids as $bbcode_name => $bit)
+			{
+				if ($template_bitfield->get($bit))
+				{
+					$bbcodes[] = $bbcode_name;
+				}
+			}
+
+			$filename = $this->resolve_style_filename($styles, $style);
+			if ($filename === false)
+			{
+				// Ignore this style, it will use the default templates
+				continue;
+			}
+
+			$templates[$style_id] = array(
+				'bbcodes'  => $bbcodes,
+				'template' => file_get_contents($filename),
+			);
+		}
+
+		return $templates;
+	}
+
+	/**
+	* Resolve inheritance for given style and return the path to their bbcode.html file
+	*
+	* @param  array       $styles Associative array of [style_id => style] containing all styles
+	* @param  array       $style  Style for which we resolve
+	* @return string|bool         Path to this style's bbcode.html, or FALSE
+	*/
+	protected function resolve_style_filename(array $styles, array $style)
+	{
+		// Look for a bbcode.html in this style's dir
+		$filename = $this->styles_path . $style['style_path'] . '/template/bbcode.html';
+		if (file_exists($filename))
+		{
+			return $filename;
+		}
+
+		// Resolve using this style's parent
+		$parent_id = $style['style_parent_id'];
+		if ($parent_id && !empty($styles[$parent_id]))
+		{
+			return $this->resolve_style_filename($styles, $styles[$parent_id]);
+		}
+
+		return false;
+	}
+
+	/**
+	* Return the list of censored words
+	*
+	* @return array
+	*/
+	public function get_censored_words()
+	{
+		$sql = 'SELECT word, replacement FROM ' . $this->words_table;
+		$result = $this->db->sql_query($sql);
+		$rows = $this->db->sql_fetchrowset($result);
+		$this->db->sql_freeresult($result);
+
+		return $rows;
+	}
+}
--- /dev/null
+++ b/phpbb/textformatter/parser_interface.php
@@ -0,0 +1,112 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textformatter;
+
+interface parser_interface
+{
+	/**
+	* Parse given text
+	*
+	* @param  string $text
+	* @return string
+	*/
+	public function parse($text);
+
+	/**
+	* Disable a specific BBCode
+	*
+	* @param  string $name BBCode name
+	* @return null
+	*/
+	public function disable_bbcode($name);
+
+	/**
+	* Disable BBCodes in general
+	*/
+	public function disable_bbcodes();
+
+	/**
+	* Disable the censor
+	*/
+	public function disable_censor();
+
+	/**
+	* Disable magic URLs
+	*/
+	public function disable_magic_url();
+
+	/**
+	* Disable smilies
+	*/
+	public function disable_smilies();
+
+	/**
+	* Enable a specific BBCode
+	*
+	* @param  string $name BBCode name
+	* @return null
+	*/
+	public function enable_bbcode($name);
+
+	/**
+	* Enable BBCodes in general
+	*/
+	public function enable_bbcodes();
+
+	/**
+	* Enable the censor
+	*/
+	public function enable_censor();
+
+	/**
+	* Enable magic URLs
+	*/
+	public function enable_magic_url();
+
+	/**
+	* Enable smilies
+	*/
+	public function enable_smilies();
+
+	/**
+	* Get the list of errors that were generated during last parsing
+	*
+	* @return array[] Array of arrays. Each array contains a lang string at index 0 plus any number
+	*                 of optional parameters
+	*/
+	public function get_errors();
+
+	/**
+	* Set a variable to be used by the parser
+	*
+	*  - max_font_size
+	*  - max_img_height
+	*  - max_img_width
+	*  - max_smilies
+	*  - max_urls
+	*
+	* @param  string $name
+	* @param  mixed  $value
+	* @return null
+	*/
+	public function set_var($name, $value);
+
+	/**
+	* Set multiple variables to be used by the parser
+	*
+	* @param  array $vars Associative array of [name => value]
+	* @return null
+	*/
+	public function set_vars(array $vars);
+}
--- /dev/null
+++ b/phpbb/textformatter/renderer_interface.php
@@ -0,0 +1,92 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textformatter;
+
+interface renderer_interface
+{
+	/**
+	* Render given text
+	*
+	* @param  string $text Text, as parsed by something that implements \phpbb\textformatter\parser
+	* @return string
+	*/
+	public function render($text);
+
+	/**
+	* Set the smilies' path
+	*
+	* @return null
+	*/
+	public function set_smilies_path($path);
+
+	/**
+	* Return the value of the "viewcensors" option
+	*
+	* @return bool Option's value
+	*/
+	public function get_viewcensors();
+
+	/**
+	* Return the value of the "viewflash" option
+	*
+	* @return bool Option's value
+	*/
+	public function get_viewflash();
+
+	/**
+	* Return the value of the "viewimg" option
+	*
+	* @return bool Option's value
+	*/
+	public function get_viewimg();
+
+	/**
+	* Return the value of the "viewsmilies" option
+	*
+	* @return bool Option's value
+	*/
+	public function get_viewsmilies();
+
+	/**
+	* Set the "viewcensors" option
+	*
+	* @param  bool $value Option's value
+	* @return null
+	*/
+	public function set_viewcensors($value);
+
+	/**
+	* Set the "viewflash" option
+	*
+	* @param  bool $value Option's value
+	* @return null
+	*/
+	public function set_viewflash($value);
+
+	/**
+	* Set the "viewimg" option
+	*
+	* @param  bool $value Option's value
+	* @return null
+	*/
+	public function set_viewimg($value);
+
+	/**
+	* Set the "viewsmilies" option
+	*
+	* @param  bool $value Option's value
+	* @return null
+	*/
+	public function set_viewsmilies($value);
+}
--- /dev/null
+++ b/phpbb/textformatter/s9e/factory.php
@@ -0,0 +1,618 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textformatter\s9e;
+
+use s9e\TextFormatter\Configurator;
+use s9e\TextFormatter\Configurator\Items\AttributeFilters\RegexpFilter;
+use s9e\TextFormatter\Configurator\Items\UnsafeTemplate;
+
+/**
+* Creates s9e\TextFormatter objects
+*/
+class factory implements \phpbb\textformatter\cache_interface
+{
+	/**
+	* @var \phpbb\textformatter\s9e\link_helper
+	*/
+	protected $link_helper;
+
+	/**
+	* @var \phpbb\cache\driver\driver_interface
+	*/
+	protected $cache;
+
+	/**
+	* @var string Path to the cache dir
+	*/
+	protected $cache_dir;
+
+	/**
+	* @var string Cache key used for the parser
+	*/
+	protected $cache_key_parser;
+
+	/**
+	* @var string Cache key used for the renderer
+	*/
+	protected $cache_key_renderer;
+
+	/**
+	* @var \phpbb\config\config
+	*/
+	protected $config;
+
+	/**
+	* @var array Custom tokens used in bbcode.html and their corresponding token from the definition
+	*/
+	protected $custom_tokens = array(
+		'email' => array('{DESCRIPTION}' => '{TEXT}'),
+		'flash' => array('{WIDTH}' => '{NUMBER1}', '{HEIGHT}' => '{NUMBER2}'),
+		'img'   => array('{URL}' => '{IMAGEURL}'),
+		'list'  => array('{LIST_TYPE}' => '{HASHMAP}'),
+		'quote' => array('{USERNAME}' => '{TEXT1}'),
+		'size'  => array('{SIZE}' => '{FONTSIZE}'),
+		'url'   => array('{DESCRIPTION}' => '{TEXT}'),
+	);
+
+	/**
+	* @var \phpbb\textformatter\data_access
+	*/
+	protected $data_access;
+
+	/**
+	* @var array Default BBCode definitions
+	*/
+	protected $default_definitions = array(
+		'attachment' => '[ATTACHMENT index={NUMBER} filename={TEXT;useContent}]',
+		'b'     => '[B]{TEXT}[/B]',
+		'code'  => '[CODE lang={IDENTIFIER;optional}]{TEXT}[/CODE]',
+		'color' => '[COLOR={COLOR}]{TEXT}[/COLOR]',
+		'email' => '[EMAIL={EMAIL;useContent} subject={TEXT;optional;postFilter=rawurlencode} body={TEXT;optional;postFilter=rawurlencode}]{TEXT}[/EMAIL]',
+		'flash' => '[FLASH={NUMBER1},{NUMBER2} width={NUMBER1;postFilter=#flashwidth} height={NUMBER2;postFilter=#flashheight} url={URL;useContent} /]',
+		'i'     => '[I]{TEXT}[/I]',
+		'img'   => '[IMG src={IMAGEURL;useContent}]',
+		'list'  => '[LIST type={HASHMAP=1:decimal,a:lower-alpha,A:upper-alpha,i:lower-roman,I:upper-roman;optional;postFilter=#simpletext} #createChild=LI]{TEXT}[/LIST]',
+		'li'    => '[* $tagName=LI]{TEXT}[/*]',
+		'quote' =>
+			"[QUOTE
+				author={TEXT1;optional}
+				post_id={UINT;optional}
+				post_url={URL;optional;postFilter=#false}
+				profile_url={URL;optional;postFilter=#false}
+				time={UINT;optional}
+				url={URL;optional}
+				user_id={UINT;optional}
+				author={PARSE=/^\\[url=(?'url'.*?)](?'author'.*)\\[\\/url]$/i}
+				author={PARSE=/^\\[url](?'author'(?'url'.*?))\\[\\/url]$/i}
+				author={PARSE=/(?'url'https?:\\/\\/[^[\\]]+)/i}
+			]{TEXT2}[/QUOTE]",
+		'size'  => '[SIZE={FONTSIZE}]{TEXT}[/SIZE]',
+		'u'     => '[U]{TEXT}[/U]',
+		'url'   => '[URL={URL;useContent} $forceLookahead=true]{TEXT}[/URL]',
+	);
+
+	/**
+	* @var array Default templates, taken from bbcode::bbcode_tpl()
+	*/
+	protected $default_templates = array(
+		'b'     => '<span style="font-weight: bold"><xsl:apply-templates/></span>',
+		'i'     => '<span style="font-style: italic"><xsl:apply-templates/></span>',
+		'u'     => '<span style="text-decoration: underline"><xsl:apply-templates/></span>',
+		'img'   => '<img src="{IMAGEURL}" class="postimage" alt="{L_IMAGE}"/>',
+		'size'  => '<span style="font-size: {FONTSIZE}%; line-height: normal"><xsl:apply-templates/></span>',
+		'color' => '<span style="color: {COLOR}"><xsl:apply-templates/></span>',
+		'email' => '<a>
+			<xsl:attribute name="href">
+				<xsl:text>mailto:</xsl:text>
+				<xsl:value-of select="@email"/>
+				<xsl:if test="@subject or @body">
+					<xsl:text>?</xsl:text>
+					<xsl:if test="@subject">subject=<xsl:value-of select="@subject"/></xsl:if>
+					<xsl:if test="@body"><xsl:if test="@subject">&amp;</xsl:if>body=<xsl:value-of select="@body"/></xsl:if>
+				</xsl:if>
+			</xsl:attribute>
+			<xsl:apply-templates/>
+		</a>',
+	);
+
+	/**
+	* @var \phpbb\event\dispatcher_interface
+	*/
+	protected $dispatcher;
+
+	/**
+	* Constructor
+	*
+	* @param \phpbb\textformatter\data_access $data_access
+	* @param \phpbb\cache\driver\driver_interface $cache
+	* @param \phpbb\event\dispatcher_interface $dispatcher
+	* @param \phpbb\config\config $config
+	* @param \phpbb\textformatter\s9e\link_helper $link_helper
+	* @param string $cache_dir          Path to the cache dir
+	* @param string $cache_key_parser   Cache key used for the parser
+	* @param string $cache_key_renderer Cache key used for the renderer
+	*/
+	public function __construct(\phpbb\textformatter\data_access $data_access, \phpbb\cache\driver\driver_interface $cache, \phpbb\event\dispatcher_interface $dispatcher, \phpbb\config\config $config, \phpbb\textformatter\s9e\link_helper $link_helper, $cache_dir, $cache_key_parser, $cache_key_renderer)
+	{
+		$this->link_helper = $link_helper;
+		$this->cache = $cache;
+		$this->cache_dir = $cache_dir;
+		$this->cache_key_parser = $cache_key_parser;
+		$this->cache_key_renderer = $cache_key_renderer;
+		$this->config = $config;
+		$this->data_access = $data_access;
+		$this->dispatcher = $dispatcher;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function invalidate()
+	{
+		$this->regenerate();
+	}
+
+	/**
+	* {@inheritdoc}
+	*
+	* Will remove old renderers from the cache dir but won't touch the current renderer
+	*/
+	public function tidy()
+	{
+		// Get the name of current renderer
+		$renderer_data = $this->cache->get($this->cache_key_renderer);
+		$renderer_file = ($renderer_data) ? $renderer_data['class'] . '.php' : null;
+
+		foreach (glob($this->cache_dir . 's9e_*') as $filename)
+		{
+			// Only remove the file if it's not the current renderer
+			if (!$renderer_file || substr($filename, -strlen($renderer_file)) !== $renderer_file)
+			{
+				unlink($filename);
+			}
+		}
+	}
+
+	/**
+	* Generate and return a new configured instance of s9e\TextFormatter\Configurator
+	*
+	* @return Configurator
+	*/
+	public function get_configurator()
+	{
+		// Create a new Configurator
+		$configurator = new Configurator;
+
+		/**
+		* Modify the s9e\TextFormatter configurator before the default settings are set
+		*
+		* @event core.text_formatter_s9e_configure_before
+		* @var \s9e\TextFormatter\Configurator configurator Configurator instance
+		* @since 3.2.0-a1
+		*/
+		$vars = array('configurator');
+		extract($this->dispatcher->trigger_event('core.text_formatter_s9e_configure_before', compact($vars)));
+
+		// Reset the list of allowed schemes
+		foreach ($configurator->urlConfig->getAllowedSchemes() as $scheme)
+		{
+			$configurator->urlConfig->disallowScheme($scheme);
+		}
+		foreach (explode(',', $this->config['allowed_schemes_links']) as $scheme)
+		{
+			$configurator->urlConfig->allowScheme(trim($scheme));
+		}
+
+		// Convert newlines to br elements by default
+		$configurator->rootRules->enableAutoLineBreaks();
+
+		// Don't automatically ignore text in places where text is not allowed
+		$configurator->rulesGenerator->remove('IgnoreTextIfDisallowed');
+
+		// Don't remove comments and instead convert them to xsl:comment elements
+		$configurator->templateNormalizer->remove('RemoveComments');
+		$configurator->templateNormalizer->add('TransposeComments');
+
+		// Set the rendering engine and configure it to save to the cache dir
+		$configurator->rendering->engine = 'PHP';
+		$configurator->rendering->engine->cacheDir = $this->cache_dir;
+		$configurator->rendering->engine->defaultClassPrefix = 's9e_renderer_';
+		$configurator->rendering->engine->enableQuickRenderer = true;
+
+		// Create custom filters for BBCode tokens that are supported in phpBB but not in
+		// s9e\TextFormatter
+		$filter = new RegexpFilter('#^' . get_preg_expression('relative_url') . '$#Du');
+		$configurator->attributeFilters->add('#local_url', $filter);
+		$configurator->attributeFilters->add('#relative_url', $filter);
+
+		// INTTEXT regexp from acp_bbcodes
+		$filter = new RegexpFilter('!^([\p{L}\p{N}\-+,_. ]+)$!Du');
+		$configurator->attributeFilters->add('#inttext', $filter);
+
+		// Create custom filters for Flash restrictions, which use the same values as the image
+		// restrictions but have their own error message
+		$configurator->attributeFilters
+			->add('#flashheight', __NAMESPACE__ . '\\parser::filter_flash_height')
+			->addParameterByName('max_img_height')
+			->addParameterByName('logger');
+
+		$configurator->attributeFilters
+			->add('#flashwidth', __NAMESPACE__ . '\\parser::filter_flash_width')
+			->addParameterByName('max_img_width')
+			->addParameterByName('logger');
+
+		// Create a custom filter for phpBB's per-mode font size limits
+		$configurator->attributeFilters
+			->add('#fontsize', __NAMESPACE__ . '\\parser::filter_font_size')
+			->addParameterByName('max_font_size')
+			->addParameterByName('logger')
+			->markAsSafeInCSS();
+
+		// Create a custom filter for image URLs
+		$configurator->attributeFilters
+			->add('#imageurl', __NAMESPACE__ . '\\parser::filter_img_url')
+			->addParameterByName('urlConfig')
+			->addParameterByName('logger')
+			->addParameterByName('max_img_height')
+			->addParameterByName('max_img_width')
+			->markAsSafeAsURL();
+
+		// Add default BBCodes
+		foreach ($this->get_default_bbcodes($configurator) as $bbcode)
+		{
+			$configurator->BBCodes->addCustom($bbcode['usage'], $bbcode['template']);
+		}
+
+		// Modify the template to disable images/flash depending on user's settings
+		foreach (array('FLASH', 'IMG') as $name)
+		{
+			$tag = $configurator->tags[$name];
+			$tag->template = '<xsl:choose><xsl:when test="$S_VIEW' . $name . '">' . $tag->template . '</xsl:when><xsl:otherwise><xsl:apply-templates/></xsl:otherwise></xsl:choose>';
+		}
+
+		// Load custom BBCodes
+		foreach ($this->data_access->get_bbcodes() as $row)
+		{
+			// Insert the board's URL before {LOCAL_URL} tokens
+			$tpl = preg_replace_callback(
+				'#\\{LOCAL_URL\\d*\\}#',
+				function ($m)
+				{
+					return generate_board_url() . '/' . $m[0];
+				},
+				$row['bbcode_tpl']
+			);
+
+			try
+			{
+				$configurator->BBCodes->addCustom($row['bbcode_match'], new UnsafeTemplate($tpl));
+			}
+			catch (\Exception $e)
+			{
+				/**
+				* @todo log an error?
+				*/
+			}
+		}
+
+		// Load smilies
+		foreach ($this->data_access->get_smilies() as $row)
+		{
+			$configurator->Emoticons->set(
+				$row['code'],
+				'<img class="smilies" src="{$T_SMILIES_PATH}/' . htmlspecialchars($row['smiley_url']) . '" width="' . $row['smiley_width'] . '" height="' . $row['smiley_height'] . '" alt="{.}" title="' . htmlspecialchars($row['emotion']) . '"/>'
+			);
+		}
+
+		if (isset($configurator->Emoticons))
+		{
+			// Force emoticons to be rendered as text if $S_VIEWSMILIES is not set
+			$configurator->Emoticons->notIfCondition = 'not($S_VIEWSMILIES)';
+
+			// Only parse emoticons at the beginning of the text or if they're preceded by any
+			// one of: a new line, a space, a dot, or a right square bracket
+			$configurator->Emoticons->notAfter = '[^\\n .\\]]';
+		}
+
+		// Load the censored words
+		$censor = $this->data_access->get_censored_words();
+		if (!empty($censor))
+		{
+			// Use a namespaced tag to avoid collisions
+			$configurator->plugins->load('Censor', array('tagName' => 'censor:tag'));
+			foreach ($censor as $row)
+			{
+				// NOTE: words are stored as HTML, we need to decode them to plain text
+				$configurator->Censor->add(htmlspecialchars_decode($row['word']),  htmlspecialchars_decode($row['replacement']));
+			}
+		}
+
+		// Load the magic links plugins. We do that after BBCodes so that they use the same tags
+		$this->configure_autolink($configurator);
+
+		// Register some vars with a default value. Those should be set at runtime by whatever calls
+		// the parser
+		$configurator->registeredVars['max_font_size'] = 0;
+		$configurator->registeredVars['max_img_height'] = 0;
+		$configurator->registeredVars['max_img_width'] = 0;
+
+		// Load the Emoji plugin and modify its tag's template to obey viewsmilies
+		$configurator->Emoji->omitImageSize();
+		$configurator->Emoji->useSVG();
+		$tag = $configurator->Emoji->getTag();
+		$tag->template = '<xsl:choose><xsl:when test="$S_VIEWSMILIES">' . str_replace('class="emoji"', 'class="emoji smilies"', $tag->template) . '</xsl:when><xsl:otherwise><xsl:value-of select="."/></xsl:otherwise></xsl:choose>';
+
+		/**
+		* Modify the s9e\TextFormatter configurator after the default settings are set
+		*
+		* @event core.text_formatter_s9e_configure_after
+		* @var \s9e\TextFormatter\Configurator configurator Configurator instance
+		* @since 3.2.0-a1
+		*/
+		$vars = array('configurator');
+		extract($this->dispatcher->trigger_event('core.text_formatter_s9e_configure_after', compact($vars)));
+
+		return $configurator;
+	}
+
+	/**
+	* Regenerate and cache a new parser and renderer
+	*
+	* @return array Associative array with at least two elements: "parser" and "renderer"
+	*/
+	public function regenerate()
+	{
+		$configurator = $this->get_configurator();
+
+		// Get the censor helper and remove the Censor plugin if applicable
+		if (isset($configurator->Censor))
+		{
+			$censor = $configurator->Censor->getHelper();
+			unset($configurator->Censor);
+			unset($configurator->tags['censor:tag']);
+		}
+
+		$objects  = $configurator->finalize();
+		$parser   = $objects['parser'];
+		$renderer = $objects['renderer'];
+
+		// Cache the parser as-is
+		$this->cache->put($this->cache_key_parser, $parser);
+
+		// We need to cache the name of the renderer's generated class
+		$renderer_data = array('class' => get_class($renderer));
+		if (isset($censor))
+		{
+			$renderer_data['censor'] = $censor;
+		}
+		$this->cache->put($this->cache_key_renderer, $renderer_data);
+
+		return array('parser' => $parser, 'renderer' => $renderer);
+	}
+
+	/**
+	* Configure the Autolink / Autoemail plugins used to linkify text
+	*
+	* @param  \s9e\TextFormatter\Configurator $configurator
+	* @return void
+	*/
+	protected function configure_autolink(Configurator $configurator)
+	{
+		$configurator->plugins->load('Autoemail');
+		$configurator->plugins->load('Autolink', array('matchWww' => true));
+
+		// Add a tag filter that creates a tag that stores and replace the
+		// content of a link created by the Autolink plugin
+		$configurator->Autolink->getTag()->filterChain
+			->add(array($this->link_helper, 'generate_link_text_tag'))
+			->resetParameters()
+			->addParameterByName('tag')
+			->addParameterByName('parser');
+
+		// Create a tag that will be used to display the truncated text by
+		// replacing the original content with the content of the @text attribute
+		$tag = $configurator->tags->add('LINK_TEXT');
+		$tag->attributes->add('text');
+		$tag->template = '<xsl:value-of select="@text"/>';
+
+		$tag->filterChain
+			->add(array($this->link_helper, 'truncate_local_url'))
+			->resetParameters()
+			->addParameterByName('tag')
+			->addParameterByValue(generate_board_url() . '/');
+		$tag->filterChain
+			->add(array($this->link_helper, 'truncate_text'))
+			->resetParameters()
+			->addParameterByName('tag');
+		$tag->filterChain
+			->add(array($this->link_helper, 'cleanup_tag'))
+			->resetParameters()
+			->addParameterByName('tag')
+			->addParameterByName('parser');
+	}
+
+	/**
+	* Return the default BBCodes configuration
+	*
+	* @return array 2D array. Each element has a 'usage' key, a 'template' key, and an optional 'options' key
+	*/
+	protected function get_default_bbcodes($configurator)
+	{
+		// For each BBCode, build an associative array matching style_ids to their template
+		$templates = array();
+		foreach ($this->data_access->get_styles_templates() as $style_id => $data)
+		{
+			foreach ($this->extract_templates($data['template']) as $bbcode_name => $template)
+			{
+				$templates[$bbcode_name][$style_id] = $template;
+			}
+
+			// Add default templates wherever missing, or for BBCodes that were not specified in
+			// this template's bitfield. For instance, prosilver has a custom template for b but its
+			// bitfield does not enable it so the default template is used instead
+			foreach ($this->default_templates as $bbcode_name => $template)
+			{
+				if (!isset($templates[$bbcode_name][$style_id]) || !in_array($bbcode_name, $data['bbcodes'], true))
+				{
+					$templates[$bbcode_name][$style_id] = $template;
+				}
+			}
+		}
+
+		// Replace custom tokens and normalize templates
+		foreach ($templates as $bbcode_name => $style_templates)
+		{
+			foreach ($style_templates as $i => $template)
+			{
+				if (isset($this->custom_tokens[$bbcode_name]))
+				{
+					$template = strtr($template, $this->custom_tokens[$bbcode_name]);
+				}
+
+				$templates[$bbcode_name][$i] = $configurator->templateNormalizer->normalizeTemplate($template);
+			}
+		}
+
+		$bbcodes = array();
+		foreach ($this->default_definitions as $bbcode_name => $usage)
+		{
+			$bbcodes[$bbcode_name] = array(
+				'usage'    => $usage,
+				'template' => $this->merge_templates($templates[$bbcode_name]),
+			);
+		}
+
+		return $bbcodes;
+	}
+
+	/**
+	* Extract and recompose individual BBCode templates from a style's template file
+	*
+	* @param  string $template Style template (bbcode.html)
+	* @return array Associative array matching BBCode names to their template
+	*/
+	protected function extract_templates($template)
+	{
+		// Capture the template fragments
+		preg_match_all('#<!-- BEGIN (.*?) -->(.*?)<!-- END .*? -->#s', $template, $matches, PREG_SET_ORDER);
+
+		$fragments = array();
+		foreach ($matches as $match)
+		{
+			// Normalize the whitespace
+			$fragment = preg_replace('#>\\n\\t*<#', '><', trim($match[2]));
+
+			$fragments[$match[1]] = $fragment;
+		}
+
+		// Automatically recompose templates split between *_open and *_close
+		foreach ($fragments as $fragment_name => $fragment)
+		{
+			if (preg_match('#^(\\w+)_close$#', $fragment_name, $match))
+			{
+				$bbcode_name = $match[1];
+
+				if (isset($fragments[$bbcode_name . '_open']))
+				{
+					$templates[$bbcode_name] = $fragments[$bbcode_name . '_open'] . '<xsl:apply-templates/>' . $fragment;
+				}
+			}
+		}
+
+		// Manually recompose and overwrite irregular templates
+		$templates['list'] =
+			'<xsl:choose>
+				<xsl:when test="not(@type)">
+					' . $fragments['ulist_open_default'] . '<xsl:apply-templates/>' . $fragments['ulist_close'] . '
+				</xsl:when>
+				<xsl:when test="contains(\'upperlowerdecim\',substring(@type,1,5))">
+					' . $fragments['olist_open'] . '<xsl:apply-templates/>' . $fragments['olist_close'] . '
+				</xsl:when>
+				<xsl:otherwise>
+					' . $fragments['ulist_open'] . '<xsl:apply-templates/>' . $fragments['ulist_close'] . '
+				</xsl:otherwise>
+			</xsl:choose>';
+
+		$templates['li'] = $fragments['listitem'] . '<xsl:apply-templates/>' . $fragments['listitem_close'];
+
+		// Replace the regular quote template with the extended quote template if available
+		if (isset($fragments['quote_extended']))
+		{
+			$templates['quote'] = $fragments['quote_extended'];
+		}
+
+		// The [attachment] BBCode uses the inline_attachment template to output a comment that
+		// is post-processed by parse_attachments()
+		$templates['attachment'] = $fragments['inline_attachment_open'] . '<xsl:comment> ia<xsl:value-of select="@index"/> </xsl:comment><xsl:value-of select="@filename"/><xsl:comment> ia<xsl:value-of select="@index"/> </xsl:comment>' . $fragments['inline_attachment_close'];
+
+		// Add fragments as templates
+		foreach ($fragments as $fragment_name => $fragment)
+		{
+			if (preg_match('#^\\w+$#', $fragment_name))
+			{
+				$templates[$fragment_name] = $fragment;
+			}
+		}
+
+		// Keep only templates that are named after an existing BBCode
+		$templates = array_intersect_key($templates, $this->default_definitions);
+
+		return $templates;
+	}
+
+	/**
+	* Merge the templates from any number of styles into one BBCode template
+	*
+	* When multiple templates are available for the same BBCode (because of multiple styles) we
+	* merge them into a single template that uses an xsl:choose construct that determines which
+	* style to use at rendering time.
+	*
+	* @param  array  $style_templates Associative array matching style_ids to their template
+	* @return string
+	*/
+	protected function merge_templates(array $style_templates)
+	{
+		// Return the template as-is if there's only one style or all styles share the same template
+		if (count(array_unique($style_templates)) === 1)
+		{
+			return end($style_templates);
+		}
+
+		// Group identical templates together
+		$grouped_templates = array();
+		foreach ($style_templates as $style_id => $style_template)
+		{
+			$grouped_templates[$style_template][] = '$STYLE_ID=' . $style_id;
+		}
+
+		// Sort templates by frequency descending
+		$templates_cnt = array_map('sizeof', $grouped_templates);
+		array_multisort($grouped_templates, $templates_cnt);
+
+		// Remove the most frequent template from the list; It becomes the default
+		reset($grouped_templates);
+		$default_template = key($grouped_templates);
+		unset($grouped_templates[$default_template]);
+
+		// Build an xsl:choose switch
+		$template = '<xsl:choose>';
+		foreach ($grouped_templates as $style_template => $exprs)
+		{
+			$template .= '<xsl:when test="' . implode(' or ', $exprs) . '">' . $style_template . '</xsl:when>';
+		}
+		$template .= '<xsl:otherwise>' . $default_template . '</xsl:otherwise></xsl:choose>';
+
+		return $template;
+	}
+}
--- /dev/null
+++ b/phpbb/textformatter/s9e/link_helper.php
@@ -0,0 +1,118 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textformatter\s9e;
+
+class link_helper
+{
+	/**
+	* Clean up and invalidate a LINK_TEXT tag if applicable
+	*
+	* Will invalidate the tag if its replacement text is the same as the original
+	* text and would have no visible effect
+	*
+	* @param  \s9e\TextFormatter\Parser\Tag $tag    LINK_TEXT tag
+	* @param  \s9e\TextFormatter\Parser     $parser Parser
+	* @return bool                                  Whether the tag is valid
+	*/
+	public function cleanup_tag(\s9e\TextFormatter\Parser\Tag $tag, \s9e\TextFormatter\Parser $parser)
+	{
+		// Invalidate if the content of the tag matches the text attribute
+		$text = substr($parser->getText(), $tag->getPos(), $tag->getLen());
+
+		return ($text !== $tag->getAttribute('text'));
+	}
+
+	/**
+	* Create a LINK_TEXT tag inside of a link
+	*
+	* Meant to only apply to linkified URLs and [url] BBCodes without a parameter
+	*
+	* @param  \s9e\TextFormatter\Parser\Tag $tag    URL tag (start tag)
+	* @param  \s9e\TextFormatter\Parser     $parser Parser
+	* @return bool                                  Always true to indicate that the tag is valid
+	*/
+	public function generate_link_text_tag(\s9e\TextFormatter\Parser\Tag $tag, \s9e\TextFormatter\Parser $parser)
+	{
+		// Only create a LINK_TEXT tag if the start tag is paired with an end
+		// tag, which is the case with tags from the Autolink plugins and with
+		// the [url] BBCode when its content is used for the URL
+		if (!$tag->getEndTag() || !$this->should_shorten($tag, $parser->getText()))
+		{
+			return true;
+		}
+
+		// Capture the text between the start tag and its end tag
+		$start  = $tag->getPos() + $tag->getLen();
+		$end    = $tag->getEndTag()->getPos();
+		$length = $end - $start;
+		$text   = substr($parser->getText(), $start, $length);
+
+		// Create a tag that consumes the link's text
+		$parser->addSelfClosingTag('LINK_TEXT', $start, $length)->setAttribute('text', $text);
+
+		return true;
+	}
+
+	/**
+	* Test whether we should shorten this tag's text
+	*
+	* Will test whether the tag either does not use any markup or uses a single
+	* [url] BBCode
+	*
+	* @param  \s9e\TextFormatter\Parser\Tag $tag  URL tag
+	* @param  string                        $text Original text
+	* @return bool
+	*/
+	protected function should_shorten(\s9e\TextFormatter\Parser\Tag $tag, $text)
+	{
+		return ($tag->getLen() === 0 || strtolower(substr($text, $tag->getPos(), $tag->getLen())) === '[url]');
+	}
+
+	/**
+	* Remove the board's root URL from a the start of a string
+	*
+	* @param  \s9e\TextFormatter\Parser\Tag $tag       LINK_TEXT tag
+	* @param  string                        $board_url Forum's root URL (with trailing slash)
+	* @return bool                                     Always true to indicate that the tag is valid
+	*/
+	public function truncate_local_url(\s9e\TextFormatter\Parser\Tag $tag, $board_url)
+	{
+		$text = $tag->getAttribute('text');
+		if (stripos($text, $board_url) === 0 && strlen($text) > strlen($board_url))
+		{
+			$tag->setAttribute('text', substr($text, strlen($board_url)));
+		}
+
+		return true;
+	}
+
+	/**
+	* Truncate the replacement text set in a LINK_TEXT tag
+	*
+	* @param  \s9e\TextFormatter\Parser\Tag $tag LINK_TEXT tag
+	* @return bool                               Always true to indicate that the tag is valid
+	*/
+	public function truncate_text(\s9e\TextFormatter\Parser\Tag $tag)
+	{
+		$text = $tag->getAttribute('text');
+		if (utf8_strlen($text) > 55)
+		{
+			$text = utf8_substr($text, 0, 39) . ' ... ' . utf8_substr($text, -10);
+		}
+
+		$tag->setAttribute('text', $text);
+
+		return true;
+	}
+}
--- /dev/null
+++ b/phpbb/textformatter/s9e/parser.php
@@ -0,0 +1,397 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textformatter\s9e;
+
+use s9e\TextFormatter\Parser\BuiltInFilters;
+use s9e\TextFormatter\Parser\Logger;
+
+/**
+* s9e\TextFormatter\Parser adapter
+*/
+class parser implements \phpbb\textformatter\parser_interface
+{
+	/**
+	* @var \phpbb\event\dispatcher_interface
+	*/
+	protected $dispatcher;
+
+	/**
+	* @var \s9e\TextFormatter\Parser
+	*/
+	protected $parser;
+
+	/**
+	* Constructor
+	*
+	* @param \phpbb\cache\driver_interface $cache
+	* @param string $key Cache key
+	* @param factory $factory
+	* @param \phpbb\event\dispatcher_interface $dispatcher
+	*/
+	public function __construct(\phpbb\cache\driver\driver_interface $cache, $key, factory $factory, \phpbb\event\dispatcher_interface $dispatcher)
+	{
+		$parser = $cache->get($key);
+		if (!$parser)
+		{
+			$objects = $factory->regenerate();
+			$parser  = $objects['parser'];
+		}
+
+		$this->dispatcher = $dispatcher;
+		$this->parser = $parser;
+
+		$parser = $this;
+
+		/**
+		* Configure the parser service
+		*
+		* Can be used to:
+		*  - toggle features or BBCodes
+		*  - register variables or custom parsers in the s9e\TextFormatter parser
+		*  - configure the s9e\TextFormatter parser's runtime settings
+		*
+		* @event core.text_formatter_s9e_parser_setup
+		* @var \phpbb\textformatter\s9e\parser parser This parser service
+		* @since 3.2.0-a1
+		*/
+		$vars = array('parser');
+		extract($dispatcher->trigger_event('core.text_formatter_s9e_parser_setup', compact($vars)));
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function parse($text)
+	{
+		$parser = $this;
+
+		/**
+		* Modify a text before it is parsed
+		*
+		* @event core.text_formatter_s9e_parse_before
+		* @var \phpbb\textformatter\s9e\parser parser This parser service
+		* @var string text The original text
+		* @since 3.2.0-a1
+		*/
+		$vars = array('parser', 'text');
+		extract($this->dispatcher->trigger_event('core.text_formatter_s9e_parse_before', compact($vars)));
+
+		$xml = $this->parser->parse($text);
+
+		/**
+		* Modify a parsed text in its XML form
+		*
+		* @event core.text_formatter_s9e_parse_after
+		* @var \phpbb\textformatter\s9e\parser parser This parser service
+		* @var string xml The parsed text, in XML
+		* @since 3.2.0-a1
+		*/
+		$vars = array('parser', 'xml');
+		extract($this->dispatcher->trigger_event('core.text_formatter_s9e_parse_after', compact($vars)));
+
+		return $xml;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function disable_bbcode($name)
+	{
+		$this->parser->disableTag(strtoupper($name));
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function disable_bbcodes()
+	{
+		$this->parser->disablePlugin('BBCodes');
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function disable_censor()
+	{
+		$this->parser->disablePlugin('Censor');
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function disable_magic_url()
+	{
+		$this->parser->disablePlugin('Autoemail');
+		$this->parser->disablePlugin('Autolink');
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function disable_smilies()
+	{
+		$this->parser->disablePlugin('Emoticons');
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function enable_bbcode($name)
+	{
+		$this->parser->enableTag(strtoupper($name));
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function enable_bbcodes()
+	{
+		$this->parser->enablePlugin('BBCodes');
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function enable_censor()
+	{
+		$this->parser->enablePlugin('Censor');
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function enable_magic_url()
+	{
+		$this->parser->enablePlugin('Autoemail');
+		$this->parser->enablePlugin('Autolink');
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function enable_smilies()
+	{
+		$this->parser->enablePlugin('Emoticons');
+	}
+
+	/**
+	* {@inheritdoc}
+	*
+	* This will convert the log entries found in s9e\TextFormatter's logger into phpBB error
+	* messages
+	*/
+	public function get_errors()
+	{
+		$errors = array();
+		foreach ($this->parser->getLogger()->get() as $entry)
+		{
+			list(, $msg, $context) = $entry;
+
+			if ($msg === 'Tag limit exceeded')
+			{
+				if ($context['tagName'] === 'E')
+				{
+					$errors[] = array('TOO_MANY_SMILIES', $context['tagLimit']);
+				}
+				else if ($context['tagName'] === 'URL')
+				{
+					$errors[] = array('TOO_MANY_URLS', $context['tagLimit']);
+				}
+			}
+			else if ($msg === 'MAX_FONT_SIZE_EXCEEDED')
+			{
+				$errors[] = array($msg, $context['max_size']);
+			}
+			else if (preg_match('/^MAX_(?:FLASH|IMG)_(HEIGHT|WIDTH)_EXCEEDED$/D', $msg, $m))
+			{
+				$errors[] = array($msg, $context['max_' . strtolower($m[1])]);
+			}
+			else if ($msg === 'Tag is disabled')
+			{
+				$name = strtolower($context['tag']->getName());
+				$errors[] = array('UNAUTHORISED_BBCODE', '[' . $name . ']');
+			}
+			else if ($msg === 'UNABLE_GET_IMAGE_SIZE')
+			{
+				$errors[] = array($msg);
+			}
+		}
+
+		// Deduplicate error messages. array_unique() only works on strings so we have to serialize
+		if (!empty($errors))
+		{
+			$errors = array_map('unserialize', array_unique(array_map('serialize', $errors)));
+		}
+
+		return $errors;
+	}
+
+	/**
+	* Return the instance of s9e\TextFormatter\Parser used by this object
+	*
+	* @return \s9e\TextFormatter\Parser
+	*/
+	public function get_parser()
+	{
+		return $this->parser;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function set_var($name, $value)
+	{
+		if ($name === 'max_smilies')
+		{
+			$this->parser->setTagLimit('E', $value ?: PHP_INT_MAX);
+		}
+		else if ($name === 'max_urls')
+		{
+			$this->parser->setTagLimit('URL', $value ?: PHP_INT_MAX);
+		}
+		else
+		{
+			$this->parser->registeredVars[$name] = $value;
+		}
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function set_vars(array $vars)
+	{
+		foreach ($vars as $name => $value)
+		{
+			$this->set_var($name, $value);
+		}
+	}
+
+	/**
+	* Filter a flash object's height
+	*
+	* @see bbcode_firstpass::bbcode_flash()
+	*
+	* @param  string  $height
+	* @param  integer $max_height
+	* @param  Logger  $logger
+	* @return mixed              Original value if valid, FALSE otherwise
+	*/
+	static public function filter_flash_height($height, $max_height, Logger $logger)
+	{
+		if ($max_height && $height > $max_height)
+		{
+			$logger->err('MAX_FLASH_HEIGHT_EXCEEDED', array('max_height' => $max_height));
+
+			return false;
+		}
+
+		return $height;
+	}
+
+	/**
+	* Filter a flash object's width
+	*
+	* @see bbcode_firstpass::bbcode_flash()
+	*
+	* @param  string  $width
+	* @param  integer $max_width
+	* @param  Logger  $logger
+	* @return mixed              Original value if valid, FALSE otherwise
+	*/
+	static public function filter_flash_width($width, $max_width, Logger $logger)
+	{
+		if ($max_width && $width > $max_width)
+		{
+			$logger->err('MAX_FLASH_WIDTH_EXCEEDED', array('max_width' => $max_width));
+
+			return false;
+		}
+
+		return $width;
+	}
+
+	/**
+	* Filter the value used in a [size] BBCode
+	*
+	* @see bbcode_firstpass::bbcode_size()
+	*
+	* @param  string  $size     Original size
+	* @param  integer $max_size Maximum allowed size
+	* @param  Logger  $logger
+	* @return mixed             Original value if valid, FALSE otherwise
+	*/
+	static public function filter_font_size($size, $max_size, Logger $logger)
+	{
+		if ($max_size && $size > $max_size)
+		{
+			$logger->err('MAX_FONT_SIZE_EXCEEDED', array('max_size' => $max_size));
+
+			return false;
+		}
+
+		if ($size < 1)
+		{
+			return false;
+		}
+
+		return $size;
+	}
+
+	/**
+	* Filter an image's URL to enforce restrictions on its dimensions
+	*
+	* @see bbcode_firstpass::bbcode_img()
+	*
+	* @param  string  $url        Original URL
+	* @param  array   $url_config Config used by the URL filter
+	* @param  Logger  $logger
+	* @param  integer $max_height Maximum height allowed
+	* @param  integer $max_width  Maximum width allowed
+	* @return string|bool         Original value if valid, FALSE otherwise
+	*/
+	static public function filter_img_url($url, array $url_config, Logger $logger, $max_height, $max_width)
+	{
+		// Validate the URL
+		$url = BuiltInFilters::filterUrl($url, $url_config, $logger);
+		if ($url === false)
+		{
+			return false;
+		}
+
+		if ($max_height || $max_width)
+		{
+			$imagesize = new \FastImageSize\FastImageSize();
+			$size_info = $imagesize->getImageSize($url);
+			if ($size_info === false)
+			{
+				$logger->err('UNABLE_GET_IMAGE_SIZE');
+				return false;
+			}
+
+			if ($max_height && $max_height < $size_info['height'])
+			{
+				$logger->err('MAX_IMG_HEIGHT_EXCEEDED', array('max_height' => $max_height));
+				return false;
+			}
+
+			if ($max_width && $max_width < $size_info['width'])
+			{
+				$logger->err('MAX_IMG_WIDTH_EXCEEDED', array('max_width' => $max_width));
+				return false;
+			}
+		}
+
+		return $url;
+	}
+}
--- /dev/null
+++ b/phpbb/textformatter/s9e/quote_helper.php
@@ -0,0 +1,81 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textformatter\s9e;
+
+class quote_helper
+{
+	/**
+	* @var string Base URL for a post link, uses {POST_ID} as placeholder
+	*/
+	protected $post_url;
+
+	/**
+	* @var string Base URL for a profile link, uses {USER_ID} as placeholder
+	*/
+	protected $profile_url;
+
+	/**
+	* @var \phpbb\user
+	*/
+	protected $user;
+
+	/**
+	* Constructor
+	*
+	* @param \phpbb\user $user
+	* @param string $root_path
+	* @param string $php_ext
+	*/
+	public function __construct(\phpbb\user $user, $root_path, $php_ext)
+	{
+		$this->post_url = append_sid($root_path . 'viewtopic.' . $php_ext, 'p={POST_ID}#p{POST_ID}');
+		$this->profile_url = append_sid($root_path . 'memberlist.' . $php_ext, 'mode=viewprofile&u={USER_ID}');
+		$this->user = $user;
+	}
+
+	/**
+	* Inject dynamic metadata into QUOTE tags in given XML
+	*
+	* @param  string $xml Original XML
+	* @return string      Modified XML
+	*/
+	public function inject_metadata($xml)
+	{
+		$post_url = $this->post_url;
+		$profile_url = $this->profile_url;
+		$user = $this->user;
+
+		return \s9e\TextFormatter\Utils::replaceAttributes(
+			$xml,
+			'QUOTE',
+			function ($attributes) use ($post_url, $profile_url, $user)
+			{
+				if (isset($attributes['post_id']))
+				{
+					$attributes['post_url'] = str_replace('{POST_ID}', $attributes['post_id'], $post_url);
+				}
+				if (isset($attributes['time']))
+				{
+					$attributes['date'] = $user->format_date($attributes['time']);
+				}
+				if (isset($attributes['user_id']))
+				{
+					$attributes['profile_url'] = str_replace('{USER_ID}', $attributes['user_id'], $profile_url);
+				}
+
+				return $attributes;
+			}
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/textformatter/s9e/renderer.php
@@ -0,0 +1,315 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textformatter\s9e;
+
+/**
+* s9e\TextFormatter\Renderer adapter
+*/
+class renderer implements \phpbb\textformatter\renderer_interface
+{
+	/**
+	* @var \s9e\TextFormatter\Plugins\Censor\Helper
+	*/
+	protected $censor;
+
+	/**
+	* @var \phpbb\event\dispatcher_interface
+	*/
+	protected $dispatcher;
+
+	/**
+	* @var quote_helper
+	*/
+	protected $quote_helper;
+
+	/**
+	* @var \s9e\TextFormatter\Renderer
+	*/
+	protected $renderer;
+
+	/**
+	* @var bool Status of the viewcensors option
+	*/
+	protected $viewcensors = false;
+
+	/**
+	* @var bool Status of the viewflash option
+	*/
+	protected $viewflash = false;
+
+	/**
+	* @var bool Status of the viewimg option
+	*/
+	protected $viewimg = false;
+
+	/**
+	* @var bool Status of the viewsmilies option
+	*/
+	protected $viewsmilies = false;
+
+	/**
+	* Constructor
+	*
+	* @param \phpbb\cache\driver\driver_interface $cache
+	* @param string $cache_dir Path to the cache dir
+	* @param string $key Cache key
+	* @param factory $factory
+	* @param \phpbb\event\dispatcher_interface $dispatcher
+	*/
+	public function __construct(\phpbb\cache\driver\driver_interface $cache, $cache_dir, $key, factory $factory, \phpbb\event\dispatcher_interface $dispatcher)
+	{
+		$renderer_data = $cache->get($key);
+		if ($renderer_data)
+		{
+			$class = $renderer_data['class'];
+			if (!class_exists($class, false))
+			{
+				// Try to load the renderer class from its cache file
+				$cache_file = $cache_dir . $class . '.php';
+
+				if (file_exists($cache_file))
+				{
+					include($cache_file);
+				}
+			}
+			if (class_exists($class, false))
+			{
+				$renderer = new $class;
+			}
+			if (isset($renderer_data['censor']))
+			{
+				$censor = $renderer_data['censor'];
+			}
+		}
+		if (!isset($renderer))
+		{
+			$objects  = $factory->regenerate();
+			$renderer = $objects['renderer'];
+		}
+
+		if (isset($censor))
+		{
+			$this->censor = $censor;
+		}
+		$this->dispatcher = $dispatcher;
+		$this->renderer = $renderer;
+		$renderer = $this;
+
+		/**
+		* Configure the renderer service
+		*
+		* @event core.text_formatter_s9e_renderer_setup
+		* @var \phpbb\textformatter\s9e\renderer renderer This renderer service
+		* @since 3.2.0-a1
+		*/
+		$vars = array('renderer');
+		extract($dispatcher->trigger_event('core.text_formatter_s9e_renderer_setup', compact($vars)));
+	}
+
+	/**
+	* Configure the quote_helper object used to display extended information in quotes
+	*
+	* @param  quote_helper $quote_helper
+	*/
+	public function configure_quote_helper(quote_helper $quote_helper)
+	{
+		$this->quote_helper = $quote_helper;
+	}
+
+	/**
+	* Automatically set the smilies path based on config
+	*
+	* @param  \phpbb\config\config $config
+	* @param  \phpbb\path_helper   $path_helper
+	* @return null
+	*/
+	public function configure_smilies_path(\phpbb\config\config $config, \phpbb\path_helper $path_helper)
+	{
+		/**
+		* @see smiley_text()
+		*/
+		$root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $path_helper->get_web_root_path();
+
+		$this->set_smilies_path($root_path . $config['smilies_path']);
+	}
+
+	/**
+	* Configure this renderer as per the user's settings
+	*
+	* Should set the locale as well as the viewcensor/viewflash/viewimg/viewsmilies options.
+	*
+	* @param  \phpbb\user          $user
+	* @param  \phpbb\config\config $config
+	* @param  \phpbb\auth\auth     $auth
+	* @return null
+	*/
+	public function configure_user(\phpbb\user $user, \phpbb\config\config $config, \phpbb\auth\auth $auth)
+	{
+		$censor = $user->optionget('viewcensors') || !$config['allow_nocensors'] || !$auth->acl_get('u_chgcensors');
+
+		$this->set_viewcensors($censor);
+		$this->set_viewflash($user->optionget('viewflash'));
+		$this->set_viewimg($user->optionget('viewimg'));
+		$this->set_viewsmilies($user->optionget('viewsmilies'));
+
+		// Set the stylesheet parameters
+		foreach (array_keys($this->renderer->getParameters()) as $param_name)
+		{
+			if (strpos($param_name, 'L_') === 0)
+			{
+				// L_FOO is set to $user->lang('FOO')
+				$this->renderer->setParameter($param_name, $user->lang(substr($param_name, 2)));
+			}
+		}
+
+		// Set this user's style id and other parameters
+		$this->renderer->setParameters(array(
+			'S_IS_BOT'          => $user->data['is_bot'],
+			'S_REGISTERED_USER' => $user->data['is_registered'],
+			'S_USER_LOGGED_IN'  => ($user->data['user_id'] != ANONYMOUS),
+			'STYLE_ID'          => $user->style['style_id'],
+		));
+	}
+
+	/**
+	* Return the instance of s9e\TextFormatter\Renderer used by this object
+	*
+	* @return \s9e\TextFormatter\Renderer
+	*/
+	public function get_renderer()
+	{
+		return $this->renderer;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_viewcensors()
+	{
+		return $this->viewcensors;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_viewflash()
+	{
+		return $this->viewflash;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_viewimg()
+	{
+		return $this->viewimg;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_viewsmilies()
+	{
+		return $this->viewsmilies;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function render($xml)
+	{
+		if (isset($this->quote_helper))
+		{
+			$xml = $this->quote_helper->inject_metadata($xml);
+		}
+
+		$renderer = $this;
+
+		/**
+		* Modify a parsed text before it is rendered
+		*
+		* @event core.text_formatter_s9e_render_before
+		* @var \phpbb\textformatter\s9e\renderer renderer This renderer service
+		* @var string xml The parsed text, in its XML form
+		* @since 3.2.0-a1
+		*/
+		$vars = array('renderer', 'xml');
+		extract($this->dispatcher->trigger_event('core.text_formatter_s9e_render_before', compact($vars)));
+
+		if (isset($this->censor) && $this->viewcensors)
+		{
+			// NOTE: censorHtml() is XML-safe
+			$xml = $this->censor->censorHtml($xml, true);
+		}
+
+		$html = $this->renderer->render($xml);
+
+		/**
+		* Modify a rendered text
+		*
+		* @event core.text_formatter_s9e_render_after
+		* @var string html The rendered text's HTML
+		* @var \phpbb\textformatter\s9e\renderer renderer This renderer service
+		* @since 3.2.0-a1
+		*/
+		$vars = array('html', 'renderer');
+		extract($this->dispatcher->trigger_event('core.text_formatter_s9e_render_after', compact($vars)));
+
+		return $html;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function set_smilies_path($path)
+	{
+		$this->renderer->setParameter('T_SMILIES_PATH', $path);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function set_viewcensors($value)
+	{
+		$this->viewcensors = $value;
+		$this->renderer->setParameter('S_VIEWCENSORS', $value);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function set_viewflash($value)
+	{
+		$this->viewflash = $value;
+		$this->renderer->setParameter('S_VIEWFLASH', $value);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function set_viewimg($value)
+	{
+		$this->viewimg = $value;
+		$this->renderer->setParameter('S_VIEWIMG', $value);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function set_viewsmilies($value)
+	{
+		$this->viewsmilies = $value;
+		$this->renderer->setParameter('S_VIEWSMILIES', $value);
+	}
+}
--- /dev/null
+++ b/phpbb/textformatter/s9e/utils.php
@@ -0,0 +1,152 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textformatter\s9e;
+
+/**
+* Text manipulation utilities
+*/
+class utils implements \phpbb\textformatter\utils_interface
+{
+	/**
+	* Replace BBCodes and other formatting elements with whitespace
+	*
+	* NOTE: preserves smilies as text
+	*
+	* @param  string $xml Parsed text
+	* @return string      Plain text
+	*/
+	public function clean_formatting($xml)
+	{
+		// Insert a space before <s> and <e> then remove formatting
+		$xml = preg_replace('#<[es]>#', ' $0', $xml);
+
+		return \s9e\TextFormatter\Utils::removeFormatting($xml);
+	}
+
+	/**
+	* Format given string to be used as an attribute value
+	*
+	* Will return the string as-is if it can be used in a BBCode without quotes. Otherwise,
+	* it will use either single- or double- quotes depending on whichever requires less escaping.
+	* Quotes and backslashes are escaped with backslashes where necessary
+	*
+	* @param  string $str Original string
+	* @return string      Same string if possible, escaped string within quotes otherwise
+	*/
+	protected function format_attribute_value($str)
+	{
+		if (!preg_match('/[ "\'\\\\\\]]/', $str))
+		{
+			// Return as-is if it contains none of: space, ' " \ or ]
+			return $str;
+		}
+		$singleQuoted = "'" . addcslashes($str, "\\'") . "'";
+		$doubleQuoted = '"' . addcslashes($str, '\\"') . '"';
+
+		return (strlen($singleQuoted) < strlen($doubleQuoted)) ? $singleQuoted : $doubleQuoted;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function generate_quote($text, array $attributes = array())
+	{
+		$text = trim($text);
+		$quote = '[quote';
+		if (isset($attributes['author']))
+		{
+			// Add the author as the BBCode's default attribute
+			$quote .= '=' . $this->format_attribute_value($attributes['author']);
+			unset($attributes['author']);
+		}
+
+		if (isset($attributes['user_id']) && $attributes['user_id'] == ANONYMOUS)
+		{
+			unset($attributes['user_id']);
+		}
+
+		ksort($attributes);
+		foreach ($attributes as $name => $value)
+		{
+			$quote .= ' ' . $name . '=' . $this->format_attribute_value($value);
+		}
+		$quote .= ']';
+		$newline = (strlen($quote . $text . '[/quote]') > 80 || strpos($text, "\n") !== false) ? "\n" : '';
+		$quote .= $newline . $text . $newline . '[/quote]';
+
+		return $quote;
+	}
+
+	/**
+	* Get a list of quote authors, limited to the outermost quotes
+	*
+	* @param  string   $xml Parsed text
+	* @return string[]      List of authors
+	*/
+	public function get_outermost_quote_authors($xml)
+	{
+		$authors = array();
+		if (strpos($xml, '<QUOTE ') === false)
+		{
+			return $authors;
+		}
+
+		$dom = new \DOMDocument;
+		$dom->loadXML($xml);
+		$xpath = new \DOMXPath($dom);
+		foreach ($xpath->query('//QUOTE[not(ancestor::QUOTE)]/@author') as $author)
+		{
+			$authors[] = $author->textContent;
+		}
+
+		return $authors;
+	}
+
+	/**
+	* Remove given BBCode and its content, at given nesting depth
+	*
+	* @param  string  $xml         Parsed text
+	* @param  string  $bbcode_name BBCode's name
+	* @param  integer $depth       Minimum nesting depth (number of parents of the same name)
+	* @return string               Parsed text
+	*/
+	public function remove_bbcode($xml, $bbcode_name, $depth = 0)
+	{
+		return \s9e\TextFormatter\Utils::removeTag($xml, strtoupper($bbcode_name), $depth);
+	}
+
+	/**
+	* Return a parsed text to its original form
+	*
+	* @param  string $xml Parsed text
+	* @return string      Original plain text
+	*/
+	public function unparse($xml)
+	{
+		return \s9e\TextFormatter\Unparser::unparse($xml);
+	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function is_empty($text)
+	{
+		if ($text === null || $text === '')
+		{
+			return true;
+		}
+
+		return trim($this->unparse($text)) === '';
+	}
+}
--- /dev/null
+++ b/phpbb/textformatter/utils_interface.php
@@ -0,0 +1,79 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textformatter;
+
+/**
+* Used to manipulate a parsed text
+*/
+interface utils_interface
+{
+	/**
+	* Replace BBCodes and other formatting elements with whitespace
+	*
+	* NOTE: preserves smilies as text
+	*
+	* @param  string $text Parsed text
+	* @return string       Plain text
+	*/
+	public function clean_formatting($text);
+
+	/**
+	* Create a quote block for given text
+	*
+	* Possible attributes:
+	*   - author:  author's name (usually a username)
+	*   - post_id: post_id of the post being quoted
+	*   - user_id: user_id of the user being quoted
+	*   - time:    timestamp of the original message
+	*
+	* @param  string $text       Quote's text
+	* @param  array  $attributes Quote's attributes
+	* @return string             Quote block to be used in a new post/text
+	*/
+	public function generate_quote($text, array $attributes = array());
+
+	/**
+	* Get a list of quote authors, limited to the outermost quotes
+	*
+	* @param  string   $text Parsed text
+	* @return string[]       List of authors
+	*/
+	public function get_outermost_quote_authors($text);
+
+	/**
+	* Remove given BBCode and its content, at given nesting depth
+	*
+	* @param  string  $text        Parsed text
+	* @param  string  $bbcode_name BBCode's name
+	* @param  integer $depth       Minimum nesting depth (number of parents of the same name)
+	* @return string               Parsed text
+	*/
+	public function remove_bbcode($text, $bbcode_name, $depth = 0);
+
+	/**
+	 * Return a parsed text to its original form
+	 *
+	 * @param  string $text Parsed text
+	 * @return string       Original plain text
+	 */
+	public function unparse($text);
+
+	/**
+	 * Return whether or not a parsed text represent an empty text.
+	 *
+	 * @param  string $text Parsed text
+	 * @return bool         Tue if the original text is empty
+	 */
+	public function is_empty($text);
+}
--- /dev/null
+++ b/phpbb/textreparser/base.php
@@ -0,0 +1,269 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textreparser;
+
+abstract class base implements reparser_interface
+{
+	/**
+	 * @var string The reparser name
+	 */
+	protected $name;
+
+	/**
+	* @var bool Whether to save changes to the database
+	*/
+	protected $save_changes = true;
+
+	/**
+	* {@inheritdoc}
+	*/
+	abstract public function get_max_id();
+
+	/**
+	* Return all records in given range
+	*
+	* @param  integer $min_id Lower bound
+	* @param  integer $max_id Upper bound
+	* @return array           Array of records
+	*/
+	abstract protected function get_records_by_range($min_id, $max_id);
+
+	/**
+	* {@inheritdoc}
+	*/
+	abstract protected function save_record(array $record);
+
+	/**
+	* Add fields to given record, if applicable
+	*
+	* The enable_* fields are not always saved to the database. Sometimes we need to guess their
+	* original value based on the text content or possibly other fields
+	*
+	* @param  array $record Original record
+	* @return array         Complete record
+	*/
+	protected function add_missing_fields(array $record)
+	{
+		if (!isset($record['enable_bbcode'], $record['enable_smilies'], $record['enable_magic_url']))
+		{
+			if (isset($record['options']))
+			{
+				$record += array(
+					'enable_bbcode'    => (bool) ($record['options'] & OPTION_FLAG_BBCODE),
+					'enable_smilies'   => (bool) ($record['options'] & OPTION_FLAG_SMILIES),
+					'enable_magic_url' => (bool) ($record['options'] & OPTION_FLAG_LINKS),
+				);
+			}
+			else
+			{
+				$record += array(
+					'enable_bbcode'    => $this->guess_bbcodes($record),
+					'enable_smilies'   => $this->guess_smilies($record),
+					'enable_magic_url' => $this->guess_magic_url($record),
+				);
+			}
+		}
+
+		// Those BBCodes are disabled based on context and user permissions and that value is never
+		// stored in the database. Here we test whether they were used in the original text.
+		$bbcodes = array('flash', 'img', 'quote', 'url');
+		foreach ($bbcodes as $bbcode)
+		{
+			$field_name = 'enable_' . $bbcode . '_bbcode';
+			$record[$field_name] = $this->guess_bbcode($record, $bbcode);
+		}
+
+		// Magic URLs are tied to the URL BBCode, that's why if magic URLs are enabled we make sure
+		// that the URL BBCode is also enabled
+		if ($record['enable_magic_url'])
+		{
+			$record['enable_url_bbcode'] = true;
+		}
+
+		return $record;
+	}
+
+	/**
+	 * Returns the name of the reparser
+	 *
+	 * @return string Name of reparser
+	 */
+	public function get_name()
+	{
+		return $this->name;
+	}
+
+	/**
+	 * Sets the name of the reparser
+	 *
+	 * @param string $name The reparser name
+	 */
+	public function set_name($name)
+	{
+		$this->name = $name;
+	}
+
+	/**
+	* Disable saving changes to the database
+	*/
+	public function disable_save()
+	{
+		$this->save_changes = false;
+	}
+
+	/**
+	* Enable saving changes to the database
+	*/
+	public function enable_save()
+	{
+		$this->save_changes = true;
+	}
+
+	/**
+	* Guess whether given BBCode is in use in given record
+	*
+	* @param  array  $record
+	* @param  string $bbcode
+	* @return bool
+	*/
+	protected function guess_bbcode(array $record, $bbcode)
+	{
+		if (!empty($record['bbcode_uid']))
+		{
+			// Look for the closing tag, e.g. [/url]
+			$match = '[/' . $bbcode . ':' . $record['bbcode_uid'];
+			if (strpos($record['text'], $match) !== false)
+			{
+				return true;
+			}
+		}
+
+		if (substr($record['text'], 0, 2) === '<r')
+		{
+			// Look for the closing tag inside of a e element, in an element of the same name, e.g.
+			// <e>[/url]</e></URL>
+			$match = '<e>[/' . $bbcode . ']</e></' . strtoupper($bbcode) . '>';
+			if (strpos($record['text'], $match) !== false)
+			{
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	* Guess whether any BBCode is in use in given record
+	*
+	* @param  array $record
+	* @return bool
+	*/
+	protected function guess_bbcodes(array $record)
+	{
+		if (!empty($record['bbcode_uid']))
+		{
+			// Test whether the bbcode_uid is in use
+			$match = ':' . $record['bbcode_uid'];
+			if (strpos($record['text'], $match) !== false)
+			{
+				return true;
+			}
+		}
+
+		if (substr($record['text'], 0, 2) === '<r')
+		{
+			// Look for a closing tag inside of an e element
+			return (bool) preg_match('(<e>\\[/\\w+\\]</e>)', $match);
+		}
+
+		return false;
+	}
+
+	/**
+	* Guess whether magic URLs are in use in given record
+	*
+	* @param  array $record
+	* @return bool
+	*/
+	protected function guess_magic_url(array $record)
+	{
+		// Look for <!-- m --> or for a URL tag that's not immediately followed by <s>
+		return (strpos($record['text'], '<!-- m -->') !== false || preg_match('(<URL [^>]++>(?!<s>))', $record['text']));
+	}
+
+	/**
+	* Guess whether smilies are in use in given record
+	*
+	* @param  array $record
+	* @return bool
+	*/
+	protected function guess_smilies(array $record)
+	{
+		return (strpos($record['text'], '<!-- s') !== false || strpos($record['text'], '<E>') !== false);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function reparse_range($min_id, $max_id)
+	{
+		foreach ($this->get_records_by_range($min_id, $max_id) as $record)
+		{
+			$this->reparse_record($record);
+		}
+	}
+
+	/**
+	* Reparse given record
+	*
+	* @param array $record Associative array containing the record's data
+	*/
+	protected function reparse_record(array $record)
+	{
+		$record = $this->add_missing_fields($record);
+		$flags = ($record['enable_bbcode']) ? OPTION_FLAG_BBCODE : 0;
+		$flags |= ($record['enable_smilies']) ? OPTION_FLAG_SMILIES : 0;
+		$flags |= ($record['enable_magic_url']) ? OPTION_FLAG_LINKS : 0;
+		$unparsed = array_merge(
+			$record,
+			generate_text_for_edit($record['text'], $record['bbcode_uid'], $flags)
+		);
+
+		// generate_text_for_edit() and decode_message() actually return the text as HTML. It has to
+		// be decoded to plain text before it can be reparsed
+		$text = html_entity_decode($unparsed['text'], ENT_QUOTES, 'UTF-8');
+		$bitfield = $flags = null;
+		generate_text_for_storage(
+			$text,
+			$unparsed['bbcode_uid'],
+			$bitfield,
+			$flags,
+			$unparsed['enable_bbcode'],
+			$unparsed['enable_magic_url'],
+			$unparsed['enable_smilies'],
+			$unparsed['enable_img_bbcode'],
+			$unparsed['enable_flash_bbcode'],
+			$unparsed['enable_quote_bbcode'],
+			$unparsed['enable_url_bbcode'],
+			'text_reparser.' . $this->get_name()
+		);
+
+		// Save the new text if it has changed and it's not a dry run
+		if ($text !== $record['text'] && $this->save_changes)
+		{
+			$record['text'] = $text;
+			$this->save_record($record);
+		}
+	}
+}
--- /dev/null
+++ b/phpbb/textreparser/manager.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\textreparser;
+
+class manager
+{
+	/**
+	 * @var \phpbb\config\config
+	 */
+	protected $config;
+
+	/**
+	 * @var \phpbb\config\db_text
+	 */
+	protected $config_text;
+
+	/**
+	 * @var \phpbb\di\service_collection
+	 */
+	protected $reparsers;
+
+	/**
+	 * @var array
+	 */
+	protected $resume_data;
+
+	/**
+	 * Constructor
+	 *
+	 * @param \phpbb\config\config			$config
+	 * @param \phpbb\config\db_text			$config_text
+	 * @param \phpbb\di\service_collection	$reparsers
+	 */
+	public function __construct(\phpbb\config\config $config, \phpbb\config\db_text $config_text, \phpbb\di\service_collection $reparsers)
+	{
+		$this->config = $config;
+		$this->config_text = $config_text;
+		$this->reparsers = $reparsers;
+	}
+
+	/**
+	 * Loads resume data from the database
+	 *
+	 * @param string	$name	Name of the reparser to which the resume data belongs
+	 *
+	 * @return array
+	 */
+	public function get_resume_data($name)
+	{
+		if ($this->resume_data === null)
+		{
+			$resume_data = $this->config_text->get('reparser_resume');
+			$this->resume_data = !empty($resume_data) ? unserialize($resume_data) : array();
+		}
+
+		return isset($this->resume_data[$name]) ? $this->resume_data[$name] : array();
+	}
+
+	/**
+	 * Updates the resume data in the database
+	 *
+	 * @param string	$name		Name of the reparser to which the resume data belongs
+	 * @param int		$min		Lowest record ID
+	 * @param int		$current	Current record ID
+	 * @param int		$size		Number of records to process at a time
+	 * @param bool		$update_db	True if the resume data should be written to the database, false if not. (default: true)
+	 */
+	public function update_resume_data($name, $min, $current, $size, $update_db = true)
+	{
+		// Prevent overwriting the old, stored array
+		if ($this->resume_data === null)
+		{
+			$this->get_resume_data('');
+		}
+
+		$this->resume_data[$name] = array(
+			'range-min'		=> $min,
+			'range-max'		=> $current,
+			'range-size'	=> $size,
+		);
+
+		if ($update_db)
+		{
+			$this->config_text->set('reparser_resume', serialize($this->resume_data));
+		}
+	}
+
+	/**
+	 * Sets the interval for a text_reparser cron task
+	 *
+	 * @param string	$name		Name of the reparser to schedule
+	 * @param int		$interval	Interval in seconds, 0 to disable the cron task
+	 */
+	public function schedule($name, $interval)
+	{
+		if (isset($this->reparsers[$name]) && isset($this->config[$name . '_cron_interval']))
+		{
+			$this->config->set($name . '_cron_interval', $interval);
+		}
+	}
+
+	/**
+	 * Sets the interval for all text_reparser cron tasks
+	 *
+	 * @param int	$interval	Interval in seconds, 0 to disable the cron task
+	 */
+	public function schedule_all($interval)
+	{
+		// This way we don't construct every registered reparser
+		$reparser_array = array_keys($this->reparsers->getArrayCopy());
+
+		foreach ($reparser_array as $reparser)
+		{
+			$this->schedule($reparser, $interval);
+		}
+	}
+
+	/**
+	 * Finds a reparser by name.
+	 *
+	 * If there is no reparser with the specified name, null is returned.
+	 *
+	 * @param string $name Name of the reparser to look up.
+	 * @return string A reparser service name, or null.
+	 */
+	public function find_reparser($name)
+	{
+		foreach ($this->reparsers as $service => $reparser)
+		{
+			if ($reparser->get_name() == $name)
+			{
+				return $service;
+			}
+		}
+		return null;
+	}
+}
--- /dev/null
+++ b/phpbb/textreparser/plugins/contact_admin_info.php
@@ -0,0 +1,69 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textreparser\plugins;
+
+class contact_admin_info extends \phpbb\textreparser\base
+{
+	/**
+	* @var \phpbb\config\db_text
+	*/
+	protected $config_text;
+
+	/**
+	* Constructor
+	*
+	* @param \phpbb\config\db_text $config_text
+	*/
+	public function __construct(\phpbb\config\db_text $config_text)
+	{
+		$this->config_text = $config_text;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_max_id()
+	{
+		return 1;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	protected function get_records_by_range($min_id, $max_id)
+	{
+		$values = $this->config_text->get_array(array(
+			'contact_admin_info',
+			'contact_admin_info_uid',
+			'contact_admin_info_flags',
+		));
+
+		return array(array(
+			'id'               => 1,
+			'text'             => $values['contact_admin_info'],
+			'bbcode_uid'       => $values['contact_admin_info_uid'],
+			'enable_bbcode'    => $values['contact_admin_info_flags'] & OPTION_FLAG_BBCODE,
+			'enable_magic_url' => $values['contact_admin_info_flags'] & OPTION_FLAG_LINKS,
+			'enable_smilies'   => $values['contact_admin_info_flags'] & OPTION_FLAG_SMILIES,
+		));
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	protected function save_record(array $record)
+	{
+		$this->config_text->set('contact_admin_info', $record['text']);
+	}
+}
--- /dev/null
+++ b/phpbb/textreparser/plugins/forum_description.php
@@ -0,0 +1,30 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textreparser\plugins;
+
+class forum_description extends \phpbb\textreparser\row_based_plugin
+{
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_columns()
+	{
+		return array(
+			'id'         => 'forum_id',
+			'text'       => 'forum_desc',
+			'bbcode_uid' => 'forum_desc_uid',
+			'options'    => 'forum_desc_options',
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/textreparser/plugins/forum_rules.php
@@ -0,0 +1,30 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textreparser\plugins;
+
+class forum_rules extends \phpbb\textreparser\row_based_plugin
+{
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_columns()
+	{
+		return array(
+			'id'         => 'forum_id',
+			'text'       => 'forum_rules',
+			'bbcode_uid' => 'forum_rules_uid',
+			'options'    => 'forum_rules_options',
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/textreparser/plugins/group_description.php
@@ -0,0 +1,30 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textreparser\plugins;
+
+class group_description extends \phpbb\textreparser\row_based_plugin
+{
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_columns()
+	{
+		return array(
+			'id'         => 'group_id',
+			'text'       => 'group_desc',
+			'bbcode_uid' => 'group_desc_uid',
+			'options'    => 'group_desc_options',
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/textreparser/plugins/pm_text.php
@@ -0,0 +1,32 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textreparser\plugins;
+
+class pm_text extends \phpbb\textreparser\row_based_plugin
+{
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_columns()
+	{
+		return array(
+			'id'               => 'msg_id',
+			'enable_bbcode'    => 'enable_bbcode',
+			'enable_smilies'   => 'enable_smilies',
+			'enable_magic_url' => 'enable_magic_url',
+			'text'             => 'message_text',
+			'bbcode_uid'       => 'bbcode_uid',
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/textreparser/plugins/poll_option.php
@@ -0,0 +1,74 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textreparser\plugins;
+
+class poll_option extends \phpbb\textreparser\base
+{
+	/**
+	* @var \phpbb\db\driver\driver_interface
+	*/
+	protected $db;
+
+	/**
+	* Constructor
+	*
+	* @param \phpbb\db\driver\driver_interface $db Database connection
+	*/
+	public function __construct(\phpbb\db\driver\driver_interface $db)
+	{
+		$this->db = $db;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_max_id()
+	{
+		$sql = 'SELECT MAX(topic_id) AS max_id FROM ' . POLL_OPTIONS_TABLE;
+		$result = $this->db->sql_query($sql);
+		$max_id = (int) $this->db->sql_fetchfield('max_id');
+		$this->db->sql_freeresult($result);
+
+		return $max_id;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	protected function get_records_by_range($min_id, $max_id)
+	{
+		$sql = 'SELECT o.topic_id, o.poll_option_id, o.poll_option_text AS text, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.bbcode_uid
+			FROM ' . POLL_OPTIONS_TABLE . ' o, ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . ' p
+			WHERE o.topic_id BETWEEN ' . $min_id . ' AND ' . $max_id .'
+				AND t.topic_id = o.topic_id
+				AND p.post_id = t.topic_first_post_id';
+		$result = $this->db->sql_query($sql);
+		$records = $this->db->sql_fetchrowset($result);
+		$this->db->sql_freeresult($result);
+
+		return $records;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	protected function save_record(array $record)
+	{
+		$sql = 'UPDATE ' . POLL_OPTIONS_TABLE . "
+			SET poll_option_text = '" . $this->db->sql_escape($record['text']) . "'
+			WHERE topic_id = " . $record['topic_id'] . '
+				AND poll_option_id = ' . $record['poll_option_id'];
+		$this->db->sql_query($sql);
+	}
+}
--- /dev/null
+++ b/phpbb/textreparser/plugins/poll_title.php
@@ -0,0 +1,42 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textreparser\plugins;
+
+class poll_title extends \phpbb\textreparser\row_based_plugin
+{
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_columns()
+	{
+		return array(
+			'id'   => 'topic_id',
+			'text' => 'poll_title',
+		);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	protected function get_records_by_range_query($min_id, $max_id)
+	{
+		$sql = 'SELECT t.topic_id AS id, t.poll_title AS text, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.bbcode_uid
+			FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . ' p
+			WHERE t.topic_id BETWEEN ' . $min_id . ' AND ' . $max_id .'
+				AND t.poll_max_options > 0
+				AND p.post_id = t.topic_first_post_id';
+
+		return $sql;
+	}
+}
--- /dev/null
+++ b/phpbb/textreparser/plugins/post_text.php
@@ -0,0 +1,32 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textreparser\plugins;
+
+class post_text extends \phpbb\textreparser\row_based_plugin
+{
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_columns()
+	{
+		return array(
+			'id'               => 'post_id',
+			'enable_bbcode'    => 'enable_bbcode',
+			'enable_smilies'   => 'enable_smilies',
+			'enable_magic_url' => 'enable_magic_url',
+			'text'             => 'post_text',
+			'bbcode_uid'       => 'bbcode_uid',
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/textreparser/plugins/user_signature.php
@@ -0,0 +1,65 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textreparser\plugins;
+
+class user_signature extends \phpbb\textreparser\row_based_plugin
+{
+	/**
+	* @var array Bit numbers used for user options
+	* @see \phpbb\user
+	*/
+	protected $keyoptions;
+
+	/**
+	* {@inheritdoc}
+	*/
+	protected function add_missing_fields(array $row)
+	{
+		if (!isset($this->keyoptions))
+		{
+			$this->save_keyoptions();
+		}
+
+		$options = $row['user_options'];
+		$row += array(
+			'enable_bbcode'    => phpbb_optionget($this->keyoptions['sig_bbcode'], $options),
+			'enable_smilies'   => phpbb_optionget($this->keyoptions['sig_smilies'], $options),
+			'enable_magic_url' => phpbb_optionget($this->keyoptions['sig_links'], $options),
+		);
+
+		return parent::add_missing_fields($row);
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_columns()
+	{
+		return array(
+			'id'           => 'user_id',
+			'text'         => 'user_sig',
+			'bbcode_uid'   => 'user_sig_bbcode_uid',
+			'user_options' => 'user_options',
+		);
+	}
+
+	/**
+	* Save the keyoptions var from \phpbb\user
+	*/
+	protected function save_keyoptions()
+	{
+		$class_vars = get_class_vars('phpbb\\user');
+		$this->keyoptions = $class_vars['keyoptions'];
+	}
+}
--- /dev/null
+++ b/phpbb/textreparser/reparser_interface.php
@@ -0,0 +1,46 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textreparser;
+
+interface reparser_interface
+{
+	/**
+	* Return the highest ID for all existing records
+	*
+	* @return integer
+	*/
+	public function get_max_id();
+
+	/**
+	 * Returns the name of the reparser
+	 *
+	 * @return string Name of reparser
+	 */
+	public function get_name();
+
+	/**
+	 * Sets the name of the reparser
+	 *
+	 * @param string $name The reparser name
+	 */
+	public function set_name($name);
+
+	/**
+	* Reparse all records in given range
+	*
+	* @param integer $min_id Lower bound
+	* @param integer $max_id Upper bound
+	*/
+	public function reparse_range($min_id, $max_id);
+}
--- /dev/null
+++ b/phpbb/textreparser/row_based_plugin.php
@@ -0,0 +1,117 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textreparser;
+
+abstract class row_based_plugin extends base
+{
+	/**
+	* @var \phpbb\db\driver\driver_interface
+	*/
+	protected $db;
+
+	/**
+	 * @var string
+	 */
+	protected $table;
+
+	/**
+	* Constructor
+	*
+	* @param \phpbb\db\driver\driver_interface $db Database connection
+	* @param string $table
+	*/
+	public function __construct(\phpbb\db\driver\driver_interface $db, $table)
+	{
+		$this->db = $db;
+		$this->table = $table;
+	}
+
+	/**
+	* Return the name of the column that correspond to each field
+	*
+	* @return array
+	*/
+	abstract public function get_columns();
+
+	/**
+	* {@inheritdoc}
+	*/
+	public function get_max_id()
+	{
+		$columns = $this->get_columns();
+
+		$sql = 'SELECT MAX(' . $columns['id'] . ') AS max_id FROM ' . $this->table;
+		$result = $this->db->sql_query($sql);
+		$max_id = (int) $this->db->sql_fetchfield('max_id');
+		$this->db->sql_freeresult($result);
+
+		return $max_id;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	protected function get_records_by_range($min_id, $max_id)
+	{
+		$sql = $this->get_records_by_range_query($min_id, $max_id);
+		$result = $this->db->sql_query($sql);
+		$records = $this->db->sql_fetchrowset($result);
+		$this->db->sql_freeresult($result);
+
+		return $records;
+	}
+
+	/**
+	* Generate the query that retrieves all records for given range
+	*
+	* @param  integer $min_id Lower bound
+	* @param  integer $max_id Upper bound
+	* @return string          SQL query
+	*/
+	protected function get_records_by_range_query($min_id, $max_id)
+	{
+		$columns = $this->get_columns();
+		$fields  = array();
+		foreach ($columns as $field_name => $column_name)
+		{
+			if ($column_name === $field_name)
+			{
+				$fields[] = $column_name;
+			}
+			else
+			{
+				$fields[] = $column_name . ' AS ' . $field_name;
+			}
+		}
+
+		$sql = 'SELECT ' . implode(', ', $fields) . '
+			FROM ' . $this->table . '
+			WHERE ' . $columns['id'] . ' BETWEEN ' . $min_id . ' AND ' . $max_id;
+
+		return $sql;
+	}
+
+	/**
+	* {@inheritdoc}
+	*/
+	protected function save_record(array $record)
+	{
+		$columns = $this->get_columns();
+
+		$sql = 'UPDATE ' . $this->table . '
+			SET ' . $columns['text'] . " = '" . $this->db->sql_escape($record['text']) . "'
+			WHERE " . $columns['id'] . ' = ' . $record['id'];
+		$this->db->sql_query($sql);
+	}
+}
--- a/phpbb/tree/nestedset.php
+++ b/phpbb/tree/nestedset.php
@@ -391,7 +391,6 @@ abstract class nestedset implements \phpbb\tree\tree_interface
 			throw new \OutOfBoundsException($this->message_prefix . 'INVALID_PARENT');
 		}
 
-		$diff = sizeof($move_items) * 2;
 		$sql_exclude_moved_items = $this->db->sql_in_set($this->column_item_id, $move_items, true);
 
 		$this->db->sql_transaction('begin');
@@ -490,7 +489,6 @@ abstract class nestedset implements \phpbb\tree\tree_interface
 			throw new \OutOfBoundsException($this->message_prefix . 'INVALID_PARENT');
 		}
 
-		$diff = sizeof($move_items) * 2;
 		$sql_exclude_moved_items = $this->db->sql_in_set($this->column_item_id, $move_items, true);
 
 		$this->db->sql_transaction('begin');
--- a/phpbb/user.php
+++ b/phpbb/user.php
@@ -21,8 +21,11 @@ namespace phpbb;
 */
 class user extends \phpbb\session
 {
-	var $lang = array();
-	var $help = array();
+	/**
+	 * @var \phpbb\language\language
+	 */
+	protected $language;
+
 	var $style = array();
 	var $date_format;
 
@@ -42,35 +45,63 @@ class user extends \phpbb\session
 	var $img_lang;
 	var $img_array = array();
 
+	/** @var bool */
+	protected $is_setup_flag;
+
 	// Able to add new options (up to id 31)
 	var $keyoptions = array('viewimg' => 0, 'viewflash' => 1, 'viewsmilies' => 2, 'viewsigs' => 3, 'viewavatars' => 4, 'viewcensors' => 5, 'attachsig' => 6, 'bbcode' => 8, 'smilies' => 9, 'sig_bbcode' => 15, 'sig_smilies' => 16, 'sig_links' => 17);
 
 	/**
 	* Constructor to set the lang path
-	* @param string $datetime_class Class name of datetime class
+	*
+	* @param \phpbb\language\language	$lang			phpBB's Language loader
+	* @param string						$datetime_class	Class name of datetime class
 	*/
-	function __construct($datetime_class)
+	function __construct(\phpbb\language\language $lang, $datetime_class)
 	{
 		global $phpbb_root_path;
 
 		$this->lang_path = $phpbb_root_path . 'language/';
+		$this->language = $lang;
 		$this->datetime = $datetime_class;
+
+		$this->is_setup_flag = false;
 	}
 
 	/**
-	* Function to set custom language path (able to use directory outside of phpBB)
-	*
-	* @param string $lang_path New language path used.
-	* @access public
-	*/
-	function set_custom_lang_path($lang_path)
+	 * Returns whether user::setup was called
+	 *
+	 * @return bool
+	 */
+	public function is_setup()
 	{
-		$this->lang_path = $lang_path;
+		return $this->is_setup_flag;
+	}
 
-		if (substr($this->lang_path, -1) != '/')
+	/**
+	 * Magic getter for BC compatibility
+	 *
+	 * Implement array access for user::lang.
+	 *
+	 * @param string	$param_name	Name of the BC component the user want to access
+	 *
+	 * @return array	The appropriate array
+	 *
+	 * @deprecated 3.2.0-dev (To be removed: 4.0.0)
+	 */
+	public function __get($param_name)
+	{
+		if ($param_name === 'lang')
+		{
+			return $this->language->get_lang_array();
+		}
+		else if ($param_name === 'help')
 		{
-			$this->lang_path .= '/';
+			$help_array = $this->language->get_lang_array();
+			return $help_array['__help'];
 		}
+
+		return array();
 	}
 
 	/**
@@ -81,6 +112,8 @@ class user extends \phpbb\session
 		global $db, $request, $template, $config, $auth, $phpEx, $phpbb_root_path, $cache;
 		global $phpbb_dispatcher;
 
+		$this->language->set_default_language($config['default_lang']);
+
 		if ($this->data['user_id'] != ANONYMOUS)
 		{
 			$user_lang_name = (file_exists($this->lang_path . $this->data['user_lang'] . "/common.$phpEx")) ? $this->data['user_lang'] : basename($config['default_lang']);
@@ -98,6 +131,7 @@ class user extends \phpbb\session
 			{
 				$lang_override = $request->variable($config['cookie_name'] . '_lang', '', true, \phpbb\request\request_interface::COOKIE);
 			}
+
 			if ($lang_override)
 			{
 				$use_lang = basename($lang_override);
@@ -108,6 +142,7 @@ class user extends \phpbb\session
 			{
 				$user_lang_name = basename($config['default_lang']);
 			}
+
 			$user_date_format = $config['default_dateformat'];
 			$user_timezone = $config['board_timezone'];
 
@@ -187,6 +222,8 @@ class user extends \phpbb\session
 		$this->lang_name = $user_lang_name;
 		$this->date_format = $user_date_format;
 
+		$this->language->set_user_language($user_lang_name);
+
 		try
 		{
 			$this->timezone = new \DateTimeZone($user_timezone);
@@ -197,17 +234,6 @@ class user extends \phpbb\session
 			$this->timezone = new \DateTimeZone('UTC');
 		}
 
-		// We include common language file here to not load it every time a custom language file is included
-		$lang = &$this->lang;
-
-		// Do not suppress error if in DEBUG mode
-		$include_result = (defined('DEBUG')) ? (include $this->lang_path . $this->lang_name . "/common.$phpEx") : (@include $this->lang_path . $this->lang_name . "/common.$phpEx");
-
-		if ($include_result === false)
-		{
-			die('Language file ' . $this->lang_path . $this->lang_name . "/common.$phpEx" . " couldn't be opened.");
-		}
-
 		$this->add_lang($lang_set);
 		unset($lang_set);
 
@@ -401,6 +427,8 @@ class user extends \phpbb\session
 			}
 		}
 
+		$this->is_setup_flag = true;
+
 		return;
 	}
 
@@ -414,103 +442,13 @@ class user extends \phpbb\session
 	*
 	* If the first parameter is an array, the elements are used as keys and subkeys to get the language entry:
 	* Example: <samp>$user->lang(array('datetime', 'AGO'), 1)</samp> uses $user->lang['datetime']['AGO'] as language entry.
+	*
+	* @deprecated 3.2.0-dev (To be removed 4.0.0)
 	*/
 	function lang()
 	{
 		$args = func_get_args();
-		$key = $args[0];
-
-		if (is_array($key))
-		{
-			$lang = &$this->lang[array_shift($key)];
-
-			foreach ($key as $_key)
-			{
-				$lang = &$lang[$_key];
-			}
-		}
-		else
-		{
-			$lang = &$this->lang[$key];
-		}
-
-		// Return if language string does not exist
-		if (!isset($lang) || (!is_string($lang) && !is_array($lang)))
-		{
-			return $key;
-		}
-
-		// If the language entry is a string, we simply mimic sprintf() behaviour
-		if (is_string($lang))
-		{
-			if (sizeof($args) == 1)
-			{
-				return $lang;
-			}
-
-			// Replace key with language entry and simply pass along...
-			$args[0] = $lang;
-			return call_user_func_array('sprintf', $args);
-		}
-		else if (sizeof($lang) == 0)
-		{
-			// If the language entry is an empty array, we just return the language key
-			return $args[0];
-		}
-
-		// It is an array... now handle different nullar/singular/plural forms
-		$key_found = false;
-
-		// We now get the first number passed and will select the key based upon this number
-		for ($i = 1, $num_args = sizeof($args); $i < $num_args; $i++)
-		{
-			if (is_int($args[$i]) || is_float($args[$i]))
-			{
-				if ($args[$i] == 0 && isset($lang[0]))
-				{
-					// We allow each translation using plural forms to specify a version for the case of 0 things,
-					// so that "0 users" may be displayed as "No users".
-					$key_found = 0;
-					break;
-				}
-				else
-				{
-					$use_plural_form = $this->get_plural_form($args[$i]);
-					if (isset($lang[$use_plural_form]))
-					{
-						// The key we should use exists, so we use it.
-						$key_found = $use_plural_form;
-					}
-					else
-					{
-						// If the key we need to use does not exist, we fall back to the previous one.
-						$numbers = array_keys($lang);
-
-						foreach ($numbers as $num)
-						{
-							if ($num > $use_plural_form)
-							{
-								break;
-							}
-
-							$key_found = $num;
-						}
-					}
-					break;
-				}
-			}
-		}
-
-		// Ok, let's check if the key was found, else use the last entry (because it is mostly the plural form)
-		if ($key_found === false)
-		{
-			$numbers = array_keys($lang);
-			$key_found = end($numbers);
-		}
-
-		// Use the language string we determined and pass it to sprintf()
-		$args[0] = $lang[$key_found];
-		return call_user_func_array('sprintf', $args);
+		return call_user_func_array(array($this->language, 'lang'), $args);
 	}
 
 	/**
@@ -520,24 +458,22 @@ class user extends \phpbb\session
 	* @param $number        int|float   The number we want to get the plural case for. Float numbers are floored.
 	* @param $force_rule    mixed   False to use the plural rule of the language package
 	*                               or an integer to force a certain plural rule
-	* @return   int     The plural-case we need to use for the number plural-rule combination
+	* @return int|bool     The plural-case we need to use for the number plural-rule combination, false if $force_rule
+	* 					   was invalid.
+	*
+	* @deprecated: 3.2.0-dev (To be removed: 3.3.0)
 	*/
 	function get_plural_form($number, $force_rule = false)
 	{
-		$number = (int) $number;
-
-		// Default to English system
-		$plural_rule = ($force_rule !== false) ? $force_rule : ((isset($this->lang['PLURAL_RULE'])) ? $this->lang['PLURAL_RULE'] : 1);
-
-		return phpbb_get_plural_form($plural_rule, $number);
+		return $this->language->get_plural_form($number, $force_rule);
 	}
 
 	/**
 	* Add Language Items - use_db and use_help are assigned where needed (only use them to force inclusion)
 	*
 	* @param mixed $lang_set specifies the language entries to include
-	* @param bool $use_db internal variable for recursion, do not use
-	* @param bool $use_help internal variable for recursion, do not use
+	* @param bool $use_db internal variable for recursion, do not use	@deprecated 3.2.0-dev (To be removed: 3.3.0)
+	* @param bool $use_help internal variable for recursion, do not use	@deprecated 3.2.0-dev (To be removed: 3.3.0)
 	* @param string $ext_name The extension to load language from, or empty for core files
 	*
 	* Examples:
@@ -548,11 +484,14 @@ class user extends \phpbb\session
 	* $lang_set = 'posting'
 	* $lang_set = array('help' => 'faq', 'db' => array('help:faq', 'posting'))
 	* </code>
+	*
+	* Note: $use_db and $use_help should be removed. The old function was kept for BC purposes,
+	* 		so the BC logic is handled here.
+	*
+	* @deprecated: 3.2.0-dev (To be removed: 3.3.0)
 	*/
 	function add_lang($lang_set, $use_db = false, $use_help = false, $ext_name = '')
 	{
-		global $phpEx;
-
 		if (is_array($lang_set))
 		{
 			foreach ($lang_set as $key => $lang_file)
@@ -563,6 +502,7 @@ class user extends \phpbb\session
 
 				if ($key == 'db')
 				{
+					// This is never used
 					$this->add_lang($lang_file, true, $use_help, $ext_name);
 				}
 				else if ($key == 'help')
@@ -571,7 +511,7 @@ class user extends \phpbb\session
 				}
 				else if (!is_array($lang_file))
 				{
-					$this->set_lang($this->lang, $this->help, $lang_file, $use_db, $use_help, $ext_name);
+					$this->set_lang($lang_file, $use_help, $ext_name);
 				}
 				else
 				{
@@ -582,8 +522,37 @@ class user extends \phpbb\session
 		}
 		else if ($lang_set)
 		{
-			$this->set_lang($this->lang, $this->help, $lang_set, $use_db, $use_help, $ext_name);
+			$this->set_lang($lang_set, $use_help, $ext_name);
+		}
+	}
+
+	/**
+	 * BC function for loading language files
+	 *
+	 * @deprecated 3.2.0-dev (To be removed: 3.3.0)
+	 */
+	private function set_lang($lang_set, $use_help, $ext_name)
+	{
+		if (empty($ext_name))
+		{
+			$ext_name = null;
 		}
+
+		if ($use_help && strpos($lang_set, '/') !== false)
+		{
+			$component = dirname($lang_set) . '/help_' . basename($lang_set);
+
+			if ($component[0] === '/')
+			{
+				$component = substr($component, 1);
+			}
+		}
+		else
+		{
+			$component = (($use_help) ? 'help_' : '') . $lang_set;
+		}
+
+		$this->language->add_lang($component, $ext_name);
 	}
 
 	/**
@@ -593,6 +562,10 @@ class user extends \phpbb\session
 	* @param mixed $lang_set specifies the language entries to include
 	* @param bool $use_db internal variable for recursion, do not use
 	* @param bool $use_help internal variable for recursion, do not use
+	*
+	* Note: $use_db and $use_help should be removed. Kept for BC purposes.
+	*
+	* @deprecated: 3.2.0-dev (To be removed: 3.3.0)
 	*/
 	function add_lang_ext($ext_name, $lang_set, $use_db = false, $use_help = false)
 	{
@@ -604,109 +577,6 @@ class user extends \phpbb\session
 		$this->add_lang($lang_set, $use_db, $use_help, $ext_name);
 	}
 
-	/**
-	* Set language entry (called by add_lang)
-	* @access private
-	*/
-	function set_lang(&$lang, &$help, $lang_file, $use_db = false, $use_help = false, $ext_name = '')
-	{
-		global $phpbb_root_path, $phpEx;
-
-		// Make sure the language name is set (if the user setup did not happen it is not set)
-		if (!$this->lang_name)
-		{
-			global $config;
-			$this->lang_name = basename($config['default_lang']);
-		}
-
-		// $lang == $this->lang
-		// $help == $this->help
-		// - add appropriate variables here, name them as they are used within the language file...
-		if (!$use_db)
-		{
-			if ($use_help && strpos($lang_file, '/') !== false)
-			{
-				$filename = dirname($lang_file) . '/help_' . basename($lang_file);
-			}
-			else
-			{
-				$filename = (($use_help) ? 'help_' : '') . $lang_file;
-			}
-
-			if ($ext_name)
-			{
-				global $phpbb_extension_manager;
-				$ext_path = $phpbb_extension_manager->get_extension_path($ext_name, true);
-
-				$lang_path = $ext_path . 'language/';
-			}
-			else
-			{
-				$lang_path = $this->lang_path;
-			}
-
-			if (strpos($phpbb_root_path . $filename, $lang_path) === 0)
-			{
-				$language_filename = $phpbb_root_path . $filename;
-			}
-			else
-			{
-				$language_filename = $lang_path . $this->lang_name . '/' . $filename . '.' . $phpEx;
-			}
-
-			// If we are in install, try to use the updated version, when available
-			$install_language_filename = str_replace('language/', 'install/update/new/language/', $language_filename);
-			if (defined('IN_INSTALL') && file_exists($install_language_filename))
-			{
-				$language_filename = $install_language_filename;
-			}
-
-			if (!file_exists($language_filename))
-			{
-				global $config;
-
-				if ($this->lang_name == 'en')
-				{
-					// The user's selected language is missing the file, the board default's language is missing the file, and the file doesn't exist in /en.
-					$language_filename = str_replace($lang_path . 'en', $lang_path . $this->data['user_lang'], $language_filename);
-					trigger_error('Language file ' . $language_filename . ' couldn\'t be opened.', E_USER_ERROR);
-				}
-				else if ($this->lang_name == basename($config['default_lang']))
-				{
-					// Fall back to the English Language
-					$reset_lang_name = $this->lang_name;
-					$this->lang_name = 'en';
-					$this->set_lang($lang, $help, $lang_file, $use_db, $use_help, $ext_name);
-					$this->lang_name = $reset_lang_name;
-				}
-				else if ($this->lang_name == $this->data['user_lang'])
-				{
-					// Fall back to the board default language
-					$reset_lang_name = $this->lang_name;
-					$this->lang_name = basename($config['default_lang']);
-					$this->set_lang($lang, $help, $lang_file, $use_db, $use_help, $ext_name);
-					$this->lang_name = $reset_lang_name;
-				}
-
-				return;
-			}
-
-			// Do not suppress error if in DEBUG mode
-			$include_result = (defined('DEBUG')) ? (include $language_filename) : (@include $language_filename);
-
-			if ($include_result === false)
-			{
-				trigger_error('Language file ' . $language_filename . ' couldn\'t be opened.', E_USER_ERROR);
-			}
-		}
-		else if ($use_db)
-		{
-			// Get Database Language Strings
-			// Put them into $lang if nothing is prefixed, put them into $help if help: is prefixed
-			// For example: help:faq, posting
-		}
-	}
-
 	/**
 	* Format user date
 	*
@@ -816,7 +686,7 @@ class user extends \phpbb\session
 
 		if ($alt)
 		{
-			$alt = $this->lang($alt);
+			$alt = $this->language->lang($alt);
 			$title = ' title="' . $alt . '"';
 		}
 		return '<span class="imageset ' . $img . '"' . $title . '>' . $alt . '</span>';
@@ -877,8 +747,6 @@ class user extends \phpbb\session
 	*/
 	function leave_newly_registered()
 	{
-		global $db;
-
 		if (empty($this->data['user_new']))
 		{
 			return false;
--- a/phpbb/user_loader.php
+++ b/phpbb/user_loader.php
@@ -175,7 +175,7 @@ class user_loader
 	/**
 	* Get avatar
 	*
-	* @param int $user_id User ID of the user you want to retreive the avatar for
+	* @param int $user_id User ID of the user you want to retrieve the avatar for
 	* @param bool $query Should we query the database if this user has not yet been loaded?
 	* 						Typically this should be left as false and you should make sure
 	* 						you load users ahead of time with load_users()
@@ -189,7 +189,14 @@ class user_loader
 			return '';
 		}
 
-		return phpbb_get_avatar(\phpbb\avatar\manager::clean_row($user, 'user'), 'USER_AVATAR', false, $lazy);
+		$row = array(
+			'avatar'		=> $user['user_avatar'],
+			'avatar_type'	=> $user['user_avatar_type'],
+			'avatar_width'	=> $user['user_avatar_width'],
+			'avatar_height'	=> $user['user_avatar_height'],
+		);
+
+		return phpbb_get_avatar($row, 'USER_AVATAR', false, $lazy);
 	}
 
 	/**
--- a/phpbb/version_helper.php
+++ b/phpbb/version_helper.php
@@ -13,6 +13,8 @@
 
 namespace phpbb;
 
+use phpbb\exception\version_check_exception;
+
 /**
  * Class to handle version checking and comparison
  */
@@ -58,23 +60,18 @@ class version_helper
 	/** @var \phpbb\file_downloader */
 	protected $file_downloader;
 
-	/** @var \phpbb\user */
-	protected $user;
-
 	/**
 	 * Constructor
 	 *
 	 * @param \phpbb\cache\service $cache
 	 * @param \phpbb\config\config $config
 	 * @param \phpbb\file_downloader $file_downloader
-	 * @param \phpbb\user $user
 	 */
-	public function __construct(\phpbb\cache\service $cache, \phpbb\config\config $config, \phpbb\file_downloader $file_downloader, \phpbb\user $user)
+	public function __construct(\phpbb\cache\service $cache, \phpbb\config\config $config, \phpbb\file_downloader $file_downloader)
 	{
 		$this->cache = $cache;
 		$this->config = $config;
 		$this->file_downloader = $file_downloader;
-		$this->user = $user;
 
 		if (defined('PHPBB_QA'))
 		{
@@ -175,7 +172,7 @@ class version_helper
 	* @param bool $force_update Ignores cached data. Defaults to false.
 	* @param bool $force_cache Force the use of the cache. Override $force_update.
 	* @return string
-	* @throws \RuntimeException
+	* @throws version_check_exception
 	*/
 	public function get_latest_on_current_branch($force_update = false, $force_cache = false)
 	{
@@ -206,7 +203,7 @@ class version_helper
 	* @param bool $force_update Ignores cached data. Defaults to false.
 	* @param bool $force_cache Force the use of the cache. Override $force_update.
 	* @return string
-	* @throws \RuntimeException
+	* @throws version_check_exception
 	*/
 	public function get_suggested_updates($force_update = false, $force_cache = false)
 	{
@@ -227,7 +224,7 @@ class version_helper
 	* @param bool $force_update Ignores cached data. Defaults to false.
 	* @param bool $force_cache Force the use of the cache. Override $force_update.
 	* @return string Version info
-	* @throws \RuntimeException
+	* @throws version_check_exception
 	*/
 	public function get_versions_matching_stability($force_update = false, $force_cache = false)
 	{
@@ -247,7 +244,7 @@ class version_helper
 	* @param bool $force_update Ignores cached data. Defaults to false.
 	* @param bool $force_cache Force the use of the cache. Override $force_update.
 	* @return string Version info, includes stable and unstable data
-	* @throws \RuntimeException
+	* @throws version_check_exception
 	*/
 	public function get_versions($force_update = false, $force_cache = false)
 	{
@@ -257,23 +254,16 @@ class version_helper
 
 		if ($info === false && $force_cache)
 		{
-			throw new \RuntimeException($this->user->lang('VERSIONCHECK_FAIL'));
+			throw new version_check_exception('VERSIONCHECK_FAIL');
 		}
 		else if ($info === false || $force_update)
 		{
-			try {
-				$info = $this->file_downloader->get($this->host, $this->path, $this->file, $this->use_ssl ? 443 : 80);
-			}
-			catch (\phpbb\exception\runtime_exception $exception)
-			{
-				$prepare_parameters = array_merge(array($exception->getMessage()), $exception->get_parameters());
-				throw new \RuntimeException(call_user_func_array(array($this->user, 'lang'), $prepare_parameters));
-			}
+			$info = $this->file_downloader->get($this->host, $this->path, $this->file, $this->use_ssl ? 443 : 80);
 			$error_string = $this->file_downloader->get_error_string();
 
 			if (!empty($error_string))
 			{
-				throw new \RuntimeException($error_string);
+				throw new version_check_exception($error_string);
 			}
 
 			$info = json_decode($info, true);
@@ -290,9 +280,7 @@ class version_helper
 
 			if (empty($info['stable']) && empty($info['unstable']))
 			{
-				$this->user->add_lang('acp/common');
-
-				throw new \RuntimeException($this->user->lang('VERSIONCHECK_FAIL'));
+				throw new version_check_exception('VERSIONCHECK_FAIL');
 			}
 
 			$info['stable'] = (empty($info['stable'])) ? array() : $info['stable'];
--- a/phpbb/viewonline_helper.php
+++ b/phpbb/viewonline_helper.php
@@ -18,13 +18,13 @@ namespace phpbb;
 */
 class viewonline_helper
 {
-	/** @var \phpbb\filesystem */
+	/** @var \phpbb\filesystem\filesystem_interface */
 	protected $filesystem;
 
 	/**
-	* @param \phpbb\filesystem $filesystem
+	* @param \phpbb\filesystem\filesystem_interface $filesystem	phpBB's filesystem service
 	*/
-	public function __construct(\phpbb\filesystem $filesystem)
+	public function __construct(\phpbb\filesystem\filesystem_interface $filesystem)
 	{
 		$this->filesystem = $filesystem;
 	}
--- a/posting.php
+++ b/posting.php
@@ -29,11 +29,11 @@ $auth->acl($user->data);
 
 
 // Grab only parameters needed here
-$post_id	= request_var('p', 0);
-$topic_id	= request_var('t', 0);
-$forum_id	= request_var('f', 0);
-$draft_id	= request_var('d', 0);
-$lastclick	= request_var('lastclick', 0);
+$post_id	= $request->variable('p', 0);
+$topic_id	= $request->variable('t', 0);
+$forum_id	= $request->variable('f', 0);
+$draft_id	= $request->variable('d', 0);
+$lastclick	= $request->variable('lastclick', 0);
 
 $preview	= (isset($_POST['preview'])) ? true : false;
 $save		= (isset($_POST['save'])) ? true : false;
@@ -43,7 +43,7 @@ $cancel		= (isset($_POST['cancel']) && !isset($_POST['save'])) ? true : false;
 
 $refresh	= (isset($_POST['add_file']) || isset($_POST['delete_file']) || isset($_POST['cancel_unglobalise']) || $save || $load || $preview);
 $submit = $request->is_set_post('post') && !$refresh && !$preview;
-$mode		= request_var('mode', '');
+$mode		= $request->variable('mode', '');
 
 // If the user is not allowed to delete the post, we try to soft delete it, so we overwrite the mode here.
 if ($mode == 'delete' && (($confirm && !$request->is_set_post('delete_permanent')) || !$auth->acl_gets('f_delete', 'm_delete', $forum_id)))
@@ -104,7 +104,7 @@ $vars = array(
 extract($phpbb_dispatcher->trigger_event('core.modify_posting_parameters', compact($vars)));
 
 // Was cancel pressed? If so then redirect to the appropriate page
-if ($cancel || ($current_time - $lastclick < 2 && $submit))
+if ($cancel)
 {
 	$f = ($forum_id) ? 'f=' . $forum_id . '&amp;' : '';
 	$redirect = ($post_id) ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", $f . 'p=' . $post_id) . '#p' . $post_id : (($topic_id) ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", $f . 't=' . $topic_id) : (($forum_id) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id) : append_sid("{$phpbb_root_path}index.$phpEx")));
@@ -116,6 +116,7 @@ if (in_array($mode, array('post', 'reply', 'quote', 'edit', 'delete')) && !$foru
 	trigger_error('NO_FORUM');
 }
 
+/* @var $phpbb_content_visibility \phpbb\content_visibility */
 $phpbb_content_visibility = $phpbb_container->get('content.visibility');
 
 // We need to know some basic information in all cases before we do anything.
@@ -492,7 +493,7 @@ if ($mode == 'delete' || $mode == 'soft_delete')
 if ($mode == 'bump')
 {
 	if ($bump_time = bump_topic_allowed($forum_id, $post_data['topic_bumped'], $post_data['topic_last_post_time'], $post_data['topic_poster'], $post_data['topic_last_poster_id'])
-		&& check_link_hash(request_var('hash', ''), "topic_{$post_data['topic_id']}"))
+		&& check_link_hash($request->variable('hash', ''), "topic_{$post_data['topic_id']}"))
 	{
 		$meta_url = phpbb_bump_topic($forum_id, $topic_id, $post_data, $current_time);
 		meta_refresh(3, $meta_url);
@@ -567,10 +568,12 @@ if ($mode == 'edit')
 $orig_poll_options_size = sizeof($post_data['poll_options']);
 
 $message_parser = new parse_message();
+/* @var $plupload \phpbb\plupload\plupload */
 $plupload = $phpbb_container->get('plupload');
+
+/* @var $mimetype_guesser \phpbb\mimetype\guesser */
 $mimetype_guesser = $phpbb_container->get('mimetype.guesser');
 $message_parser->set_plupload($plupload);
-$message_parser->set_mimetype_guesser($mimetype_guesser);
 
 if (isset($post_data['post_text']))
 {
@@ -683,9 +686,9 @@ $quote_status	= true;
 // Save Draft
 if ($save && $user->data['is_registered'] && $auth->acl_get('u_savedrafts') && ($mode == 'reply' || $mode == 'post' || $mode == 'quote'))
 {
-	$subject = utf8_normalize_nfc(request_var('subject', '', true));
+	$subject = $request->variable('subject', '', true);
 	$subject = (!$subject && $mode != 'post') ? $post_data['topic_title'] : $subject;
-	$message = utf8_normalize_nfc(request_var('message', '', true));
+	$message = $request->variable('message', '', true);
 
 	if ($subject && $message)
 	{
@@ -755,11 +758,11 @@ if ($save && $user->data['is_registered'] && $auth->acl_get('u_savedrafts') && (
 				if (is_bool($default))
 				{
 					// Use the string representation
-					$hidden_fields[$name] = request_var($name, '');
+					$hidden_fields[$name] = $request->variable($name, '');
 				}
 				else
 				{
-					$hidden_fields[$name] = request_var($name, $default);
+					$hidden_fields[$name] = $request->variable($name, $default);
 				}
 			}
 
@@ -813,23 +816,24 @@ if ($load && ($mode == 'reply' || $mode == 'quote' || $mode == 'post') && $post_
 	load_drafts($topic_id, $forum_id);
 }
 
+$bbcode_utils = $phpbb_container->get('text_formatter.utils');
 
 if ($submit || $preview || $refresh)
 {
-	$post_data['topic_cur_post_id']	= request_var('topic_cur_post_id', 0);
-	$post_data['post_subject']		= utf8_normalize_nfc(request_var('subject', '', true));
-	$message_parser->message		= utf8_normalize_nfc(request_var('message', '', true));
+	$post_data['topic_cur_post_id']	= $request->variable('topic_cur_post_id', 0);
+	$post_data['post_subject']		= $request->variable('subject', '', true);
+	$message_parser->message		= $request->variable('message', '', true);
 
-	$post_data['username']			= utf8_normalize_nfc(request_var('username', $post_data['username'], true));
-	$post_data['post_edit_reason']	= ($request->variable('edit_reason', false, false, \phpbb\request\request_interface::POST) && $mode == 'edit' && $auth->acl_get('m_edit', $forum_id)) ? utf8_normalize_nfc(request_var('edit_reason', '', true)) : '';
+	$post_data['username']			= $request->variable('username', $post_data['username'], true);
+	$post_data['post_edit_reason']	= ($request->variable('edit_reason', false, false, \phpbb\request\request_interface::POST) && $mode == 'edit' && $auth->acl_get('m_edit', $forum_id)) ? $request->variable('edit_reason', '', true) : '';
 
 	$post_data['orig_topic_type']	= $post_data['topic_type'];
-	$post_data['topic_type']		= request_var('topic_type', (($mode != 'post') ? (int) $post_data['topic_type'] : POST_NORMAL));
-	$post_data['topic_time_limit']	= request_var('topic_time_limit', (($mode != 'post') ? (int) $post_data['topic_time_limit'] : 0));
+	$post_data['topic_type']		= $request->variable('topic_type', (($mode != 'post') ? (int) $post_data['topic_type'] : POST_NORMAL));
+	$post_data['topic_time_limit']	= $request->variable('topic_time_limit', (($mode != 'post') ? (int) $post_data['topic_time_limit'] : 0));
 
 	if ($post_data['enable_icons'] && $auth->acl_get('f_icons', $forum_id))
 	{
-		$post_data['icon_id'] = request_var('icon', (int) $post_data['icon_id']);
+		$post_data['icon_id'] = $request->variable('icon', (int) $post_data['icon_id']);
 	}
 
 	$post_data['enable_bbcode']		= (!$bbcode_status || isset($_POST['disable_bbcode'])) ? false : true;
@@ -894,10 +898,10 @@ if ($submit || $preview || $refresh)
 	}
 	else
 	{
-		$post_data['poll_title']		= utf8_normalize_nfc(request_var('poll_title', '', true));
-		$post_data['poll_length']		= request_var('poll_length', 0);
-		$post_data['poll_option_text']	= utf8_normalize_nfc(request_var('poll_option_text', '', true));
-		$post_data['poll_max_options']	= request_var('poll_max_options', 1);
+		$post_data['poll_title']		= $request->variable('poll_title', '', true);
+		$post_data['poll_length']		= $request->variable('poll_length', 0);
+		$post_data['poll_option_text']	= $request->variable('poll_option_text', '', true);
+		$post_data['poll_max_options']	= $request->variable('poll_max_options', 1);
 		$post_data['poll_vote_change']	= ($auth->acl_get('f_votechg', $forum_id) && $auth->acl_get('f_vote', $forum_id) && isset($_POST['poll_vote_change'])) ? 1 : 0;
 	}
 
@@ -966,8 +970,8 @@ if ($submit || $preview || $refresh)
 	// Notify and show user the changed post
 	if ($mode == 'edit' && $post_data['forum_flags'] & FORUM_FLAG_POST_REVIEW)
 	{
-		$edit_post_message_checksum = request_var('edit_post_message_checksum', '');
-		$edit_post_subject_checksum = request_var('edit_post_subject_checksum', '');
+		$edit_post_message_checksum = $request->variable('edit_post_message_checksum', '');
+		$edit_post_subject_checksum = $request->variable('edit_post_subject_checksum', '');
 
 		// $post_data['post_checksum'] is the checksum of the post submitted in the meantime
 		// $message_md5 is the checksum of the post we're about to submit
@@ -1082,9 +1086,9 @@ if ($submit || $preview || $refresh)
 	if ($config['enable_post_confirm'] && !$user->data['is_registered'] && in_array($mode, array('quote', 'post', 'reply')))
 	{
 		$captcha_data = array(
-			'message'	=> utf8_normalize_nfc(request_var('message', '', true)),
-			'subject'	=> utf8_normalize_nfc(request_var('subject', '', true)),
-			'username'	=> utf8_normalize_nfc(request_var('username', '', true)),
+			'message'	=> $request->variable('message', '', true),
+			'subject'	=> $request->variable('subject', '', true),
+			'username'	=> $request->variable('username', '', true),
 		);
 		$vc_response = $captcha->validate($captcha_data);
 		if ($vc_response)
@@ -1175,7 +1179,7 @@ if ($submit || $preview || $refresh)
 		$post_data['poll_title'] = '';
 		$post_data['poll_start'] = $post_data['poll_length'] = $post_data['poll_max_options'] = $post_data['poll_last_vote'] = $post_data['poll_vote_change'] = 0;
 	}
-	else if (!$auth->acl_get('f_poll', $forum_id) && ($mode == 'edit') && ($post_id == $post_data['topic_first_post_id']) && ($original_poll_data['poll_title'] != ''))
+	else if (!$auth->acl_get('f_poll', $forum_id) && ($mode == 'edit') && ($post_id == $post_data['topic_first_post_id']) && !$bbcode_utils->is_empty($original_poll_data['poll_title']))
 	{
 		// We have a poll but the editing user is not permitted to create/edit it.
 		// So we just keep the original poll-data.
@@ -1202,6 +1206,9 @@ if ($submit || $preview || $refresh)
 		switch ($post_data['topic_type'])
 		{
 			case POST_GLOBAL:
+				$auth_option = 'f_announce_global';
+			break;
+
 			case POST_ANNOUNCE:
 				$auth_option = 'f_announce';
 			break;
@@ -1253,7 +1260,6 @@ if ($submit || $preview || $refresh)
 	* @var	array	poll		Array with poll data from post (must be used instead of the post_data equivalent)
 	* @var	string	mode		What action to take if the form is submitted
 	*				post|reply|quote|edit|delete|bump|smilies|popup
-	* @var	string	page_title	Title of the mode page
 	* @var	int	post_id		ID of the post
 	* @var	int	topic_id	ID of the topic
 	* @var	int	forum_id	ID of the forum
@@ -1262,12 +1268,12 @@ if ($submit || $preview || $refresh)
 	*				NOTE: Should be actual language strings, NOT language keys.
 	* @since 3.1.0-RC5
 	* @change 3.1.5-RC1 Added poll array to the event
+	* @change 3.2.0-a1 Removed undefined page_title
 	*/
 	$vars = array(
 		'post_data',
 		'poll',
 		'mode',
-		'page_title',
 		'post_id',
 		'topic_id',
 		'forum_id',
@@ -1304,7 +1310,11 @@ if ($submit || $preview || $refresh)
 
 				$user_lock = ($auth->acl_get('f_user_lock', $forum_id) && $user->data['is_registered'] && $user->data['user_id'] == $post_data['topic_poster']) ? 'USER_' : '';
 
-				add_log('mod', $forum_id, $topic_id, 'LOG_' . $user_lock . (($change_topic_status == ITEM_LOCKED) ? 'LOCK' : 'UNLOCK'), $post_data['topic_title']);
+				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_' . $user_lock . (($change_topic_status == ITEM_LOCKED) ? 'LOCK' : 'UNLOCK'), false, array(
+					'forum_id' => $forum_id,
+					'topic_id' => $topic_id,
+					$post_data['topic_title']
+				));
 			}
 
 			// Lock/Unlock Post Edit
@@ -1376,7 +1386,6 @@ if ($submit || $preview || $refresh)
 			* @var	array	data		Array with post data going to be stored in the database
 			* @var	string	mode		What action to take if the form is submitted
 			*				post|reply|quote|edit|delete
-			* @var	string	page_title	Title of the mode page
 			* @var	int	post_id		ID of the post
 			* @var	int	topic_id	ID of the topic
 			* @var	int	forum_id	ID of the forum
@@ -1386,13 +1395,13 @@ if ($submit || $preview || $refresh)
 			*				NOTE: Should be actual language strings, NOT language keys.
 			* @since 3.1.0-RC5
 			* @changed 3.1.6-RC1 remove submit and error from event  Submit and Error are checked previously prior to running event
+			* @change 3.2.0-a1 Removed undefined page_title
 			*/
 			$vars = array(
 				'post_data',
 				'poll',
 				'data',
 				'mode',
-				'page_title',
 				'post_id',
 				'topic_id',
 				'forum_id',
@@ -1414,7 +1423,6 @@ if ($submit || $preview || $refresh)
 			* @var	array	data		Array with post data going to be stored in the database
 			* @var	string	mode		What action to take if the form is submitted
 			*				post|reply|quote|edit|delete
-			* @var	string	page_title	Title of the mode page
 			* @var	int	post_id		ID of the post
 			* @var	int	topic_id	ID of the topic
 			* @var	int	forum_id	ID of the forum
@@ -1425,13 +1433,13 @@ if ($submit || $preview || $refresh)
 			*				NOTE: Should be actual language strings, NOT language keys.
 			* @since 3.1.0-RC5
 			* @changed 3.1.6-RC1 remove submit and error from event  Submit and Error are checked previously prior to running event
+			* @change 3.2.0-a1 Removed undefined page_title
 			*/
 			$vars = array(
 				'post_data',
 				'poll',
 				'data',
 				'mode',
-				'page_title',
 				'post_id',
 				'topic_id',
 				'forum_id',
@@ -1485,14 +1493,11 @@ if (!sizeof($error) && $preview)
 	// Signature
 	if ($post_data['enable_sig'] && $config['allow_sig'] && $preview_signature && $auth->acl_get('f_sigs', $forum_id))
 	{
-		$parse_sig = new parse_message($preview_signature);
-		$parse_sig->bbcode_uid = $preview_signature_uid;
-		$parse_sig->bbcode_bitfield = $preview_signature_bitfield;
-
-		// Not sure about parameters for bbcode/smilies/urls... in signatures
-		$parse_sig->format_display($config['allow_sig_bbcode'], $config['allow_sig_links'], $config['allow_sig_smilies']);
-		$preview_signature = $parse_sig->message;
-		unset($parse_sig);
+		$flags = ($config['allow_sig_bbcode']) ? OPTION_FLAG_BBCODE : 0;
+		$flags |= ($config['allow_sig_links']) ? OPTION_FLAG_LINKS : 0;
+		$flags |= ($config['allow_sig_smilies']) ? OPTION_FLAG_SMILIES : 0;
+
+		$preview_signature = generate_text_for_display($preview_signature, $preview_signature_uid, $preview_signature_bitfield, $flags, false);
 	}
 	else
 	{
@@ -1597,7 +1602,16 @@ if ($generate_quote)
 
 	if ($config['allow_bbcode'])
 	{
-		$message_parser->message = '[quote=&quot;' . $post_data['quote_username'] . '&quot;]' . censor_text(trim($message_parser->message)) . "[/quote]\n";
+		$message_parser->message = $bbcode_utils->generate_quote(
+			censor_text($message_parser->message),
+			array(
+				'author'  => $post_data['quote_username'],
+				'post_id' => $post_data['post_id'],
+				'time'    => $post_data['post_time'],
+				'user_id' => $post_data['poster_id'],
+			)
+		);
+		$message_parser->message .= "\n\n";
 	}
 	else
 	{
@@ -1626,7 +1640,7 @@ $attachment_data = $message_parser->attachment_data;
 $filename_data = $message_parser->filename_data;
 $post_data['post_text'] = $message_parser->message;
 
-if (sizeof($post_data['poll_options']) || !empty($post_data['poll_title']))
+if (sizeof($post_data['poll_options']) || (isset($post_data['poll_title']) && !$bbcode_utils->is_empty($post_data['poll_title'])))
 {
 	$message_parser->message = $post_data['poll_title'];
 	$message_parser->bbcode_uid = $post_data['bbcode_uid'];
@@ -1719,7 +1733,7 @@ if ($config['enable_post_confirm'] && !$user->data['is_registered'] && (isset($c
 
 $s_hidden_fields = ($mode == 'reply' || $mode == 'quote') ? '<input type="hidden" name="topic_cur_post_id" value="' . $post_data['topic_last_post_id'] . '" />' : '';
 $s_hidden_fields .= '<input type="hidden" name="lastclick" value="' . $current_time . '" />';
-$s_hidden_fields .= ($draft_id || isset($_REQUEST['draft_loaded'])) ? '<input type="hidden" name="draft_loaded" value="' . request_var('draft_loaded', $draft_id) . '" />' : '';
+$s_hidden_fields .= ($draft_id || isset($_REQUEST['draft_loaded'])) ? '<input type="hidden" name="draft_loaded" value="' . $request->variable('draft_loaded', $draft_id) . '" />' : '';
 
 if ($mode == 'edit')
 {
@@ -1738,6 +1752,8 @@ if (isset($captcha) && $captcha->is_solved() !== false)
 $form_enctype = (@ini_get('file_uploads') == '0' || strtolower(@ini_get('file_uploads')) == 'off' || !$config['allow_attachments'] || !$auth->acl_get('u_attach') || !$auth->acl_get('f_attach', $forum_id)) ? '' : ' enctype="multipart/form-data"';
 add_form_key('posting');
 
+/** @var \phpbb\controller\helper $controller_helper */
+$controller_helper = $phpbb_container->get('controller.helper');
 
 // Build array of variables for main posting page
 $page_data = array(
@@ -1753,7 +1769,7 @@ $page_data = array(
 	'USERNAME'				=> ((!$preview && $mode != 'quote') || $preview) ? $post_data['username'] : '',
 	'SUBJECT'				=> $post_data['post_subject'],
 	'MESSAGE'				=> $post_data['post_text'],
-	'BBCODE_STATUS'			=> ($bbcode_status) ? sprintf($user->lang['BBCODE_IS_ON'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>') : sprintf($user->lang['BBCODE_IS_OFF'], '<a href="' . append_sid("{$phpbb_root_path}faq.$phpEx", 'mode=bbcode') . '">', '</a>'),
+	'BBCODE_STATUS'			=> $user->lang(($bbcode_status ? 'BBCODE_IS_ON' : 'BBCODE_IS_OFF'), '<a href="' . $controller_helper->route('phpbb_help_bbcode_controller') . '">', '</a>'),
 	'IMG_STATUS'			=> ($img_status) ? $user->lang['IMAGES_ARE_ON'] : $user->lang['IMAGES_ARE_OFF'],
 	'FLASH_STATUS'			=> ($flash_status) ? $user->lang['FLASH_IS_ON'] : $user->lang['FLASH_IS_OFF'],
 	'SMILIES_STATUS'		=> ($smilies_status) ? $user->lang['SMILIES_ARE_ON'] : $user->lang['SMILIES_ARE_OFF'],
--- a/report.php
+++ b/report.php
@@ -11,6 +11,8 @@
 *
 */
 
+use Symfony\Component\HttpFoundation\RedirectResponse;
+
 /**
 * @ignore
 */
@@ -18,321 +20,22 @@ define('IN_PHPBB', true);
 $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
 $phpEx = substr(strrchr(__FILE__, '.'), 1);
 include($phpbb_root_path . 'common.' . $phpEx);
-include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
 
 // Start session management
 $user->session_begin();
 $auth->acl($user->data);
-$user->setup('mcp');
-
-$forum_id		= request_var('f', 0);
-$post_id		= request_var('p', 0);
-$pm_id			= request_var('pm', 0);
-$reason_id		= request_var('reason_id', 0);
-$report_text	= utf8_normalize_nfc(request_var('report_text', '', true));
-$user_notify	= ($user->data['is_registered']) ? request_var('notify', 0) : false;
-
-$submit = (isset($_POST['submit'])) ? true : false;
-
-if (!$post_id && (!$pm_id || !$config['allow_pm_report']))
-{
-	trigger_error('NO_POST_SELECTED');
-}
-
-if ($post_id)
-{
-	$redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;p=$post_id") . "#p$post_id";
-	$return_forum_url = append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id");
-	$pm_id = 0;
-}
-else
-{
-	$redirect_url = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=pm&mode=view&p=$pm_id");
-	$return_forum_url = '';
-	$post_id = 0;
-	$forum_id = 0;
-}
-
-// Has the report been cancelled?
-if (isset($_POST['cancel']))
-{
-	redirect($redirect_url);
-}
-
-if ($post_id)
-{
-	// Grab all relevant data
-	$sql = 'SELECT t.*, p.*
-		FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
-		WHERE p.post_id = $post_id
-			AND p.topic_id = t.topic_id";
-	$result = $db->sql_query($sql);
-	$report_data = $db->sql_fetchrow($result);
-	$db->sql_freeresult($result);
-
-	if (!$report_data)
-	{
-		trigger_error('POST_NOT_EXIST');
-	}
-
-	$forum_id 							= (int) $report_data['forum_id'];
-	$topic_id 							= (int) $report_data['topic_id'];
-	$reported_post_text					= $report_data['post_text'];
-	$reported_post_bitfield				= $report_data['bbcode_bitfield'];
-	$reported_post_uid					= $report_data['bbcode_uid'];
-	$reported_post_enable_bbcode		= $report_data['enable_bbcode'];
-	$reported_post_enable_smilies		= $report_data['enable_smilies'];
-	$reported_post_enable_magic_url		= $report_data['enable_magic_url'];
-
-	$sql = 'SELECT *
-		FROM ' . FORUMS_TABLE . '
-		WHERE forum_id = ' . $forum_id;
-	$result = $db->sql_query($sql);
-	$forum_data = $db->sql_fetchrow($result);
-	$db->sql_freeresult($result);
-
-	if (!$forum_data)
-	{
-		trigger_error('FORUM_NOT_EXIST');
-	}
-
-	// Check required permissions
-	$acl_check_ary = array('f_list' => 'POST_NOT_EXIST', 'f_read' => 'USER_CANNOT_READ', 'f_report' => 'USER_CANNOT_REPORT');
-
-	/**
-	* This event allows you to do extra auth checks and verify if the user
-	* has the required permissions
-	*
-	* @event core.report_post_auth
-	* @var	array	forum_data		All data available from the forums table on this post's forum
-	* @var	array	report_data		All data available from the topics and the posts tables on this post (and its topic)
-	* @var	array	acl_check_ary	An array with the ACL to be tested. The evaluation is made in the same order as the array is sorted
-	*								The key is the ACL name and the value is the language key for the error message.
-	* @since 3.1.3-RC1
-	*/
-	$vars = array(
-		'forum_data',
-		'report_data',
-		'acl_check_ary',
-	);
-	extract($phpbb_dispatcher->trigger_event('core.report_post_auth', compact($vars)));
-
-	foreach ($acl_check_ary as $acl => $error)
-	{
-		if (!$auth->acl_get($acl, $forum_id))
-		{
-			trigger_error($error);
-		}
-	}
-	unset($acl_check_ary);
-
-	if ($report_data['post_reported'])
-	{
-		$message = $user->lang['ALREADY_REPORTED'];
-		$message .= '<br /><br />' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $redirect_url . '">', '</a>');
-		$message .= '<br /><br />' . sprintf($user->lang['RETURN_FORUM'], '<a href="' . $return_forum_url . '">', '</a>');
-		trigger_error($message);
-	}
-}
-else
-{
-	// Grab all relevant data
-	$sql = 'SELECT p.*, pt.*
-		FROM ' . PRIVMSGS_TABLE . ' p, ' . PRIVMSGS_TO_TABLE . " pt
-		WHERE p.msg_id = $pm_id
-			AND p.msg_id = pt.msg_id
-			AND (p.author_id = " . $user->data['user_id'] . " OR pt.user_id = " . $user->data['user_id'] . ")";
-	$result = $db->sql_query($sql);
-	$report_data = $db->sql_fetchrow($result);
-	$db->sql_freeresult($result);
-
-	if (!$report_data)
-	{
-		$user->add_lang('ucp');
-		trigger_error('NO_MESSAGE');
-	}
-
-	if ($report_data['message_reported'])
-	{
-		$message = $user->lang['ALREADY_REPORTED_PM'];
-		$message .= '<br /><br />' . sprintf($user->lang['RETURN_PM'], '<a href="' . $redirect_url . '">', '</a>');
-		trigger_error($message);
-	}
-
-	$reported_post_text 				= $report_data['message_text'];
-	$reported_post_bitfield				= $report_data['bbcode_bitfield'];
-	$reported_post_uid					= $report_data['bbcode_uid'];
-	$reported_post_enable_bbcode		= $report_data['enable_bbcode'];
-	$reported_post_enable_smilies		= $report_data['enable_smilies'];
-	$reported_post_enable_magic_url		= $report_data['enable_magic_url'];
-}
-
-if ($config['enable_post_confirm'] && !$user->data['is_registered'])
-{
-	$captcha = $phpbb_container->get('captcha.factory')->get_instance($config['captcha_plugin']);
-	$captcha->init(CONFIRM_REPORT);
-}
-
-$error	= array();
-$s_hidden_fields = '';
-
-// Submit report?
-if ($submit && $reason_id)
-{
-	if (isset($captcha))
-	{
-		$visual_confirmation_response = $captcha->validate();
-		if ($visual_confirmation_response)
-		{
-			$error[] = $visual_confirmation_response;
-		}
-	}
-
-	$sql = 'SELECT *
-		FROM ' . REPORTS_REASONS_TABLE . "
-		WHERE reason_id = $reason_id";
-	$result = $db->sql_query($sql);
-	$row = $db->sql_fetchrow($result);
-	$db->sql_freeresult($result);
 
-	if (!$row || (!$report_text && strtolower($row['reason_title']) == 'other'))
-	{
-		$error[] = $user->lang('EMPTY_REPORT');
-	}
+$post_id		= $request->variable('p', 0);
+$pm_id			= $request->variable('pm', 0);
 
-	if (!sizeof($error))
-	{
-		if (isset($captcha))
-		{
-			$captcha->reset();
-		}
+$redirect_route_name = ($pm_id === 0) ? 'phpbb_report_post_controller' : 'phpbb_report_pm_controller';
 
-		$sql_ary = array(
-			'reason_id'							=> (int) $reason_id,
-			'post_id'							=> $post_id,
-			'pm_id'								=> $pm_id,
-			'user_id'							=> (int) $user->data['user_id'],
-			'user_notify'						=> (int) $user_notify,
-			'report_closed'						=> 0,
-			'report_time'						=> (int) time(),
-			'report_text'						=> (string) $report_text,
-			'reported_post_text'				=> $reported_post_text,
-			'reported_post_uid'					=> $reported_post_uid,
-			'reported_post_bitfield'			=> $reported_post_bitfield,
-			'reported_post_enable_bbcode'		=> $reported_post_enable_bbcode,
-			'reported_post_enable_smilies'		=> $reported_post_enable_smilies,
-			'reported_post_enable_magic_url'	=> $reported_post_enable_magic_url,
-		);
-
-		$sql = 'INSERT INTO ' . REPORTS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
-		$db->sql_query($sql);
-		$report_id = $db->sql_nextid();
-
-		$phpbb_notifications = $phpbb_container->get('notification_manager');
-
-		if ($post_id)
-		{
-			$sql = 'UPDATE ' . POSTS_TABLE . '
-				SET post_reported = 1
-				WHERE post_id = ' . $post_id;
-			$db->sql_query($sql);
-
-			if (!$report_data['topic_reported'])
-			{
-				$sql = 'UPDATE ' . TOPICS_TABLE . '
-					SET topic_reported = 1
-					WHERE topic_id = ' . $report_data['topic_id'] . '
-						OR topic_moved_id = ' . $report_data['topic_id'];
-				$db->sql_query($sql);
-			}
-
-			$lang_return = $user->lang['RETURN_TOPIC'];
-			$lang_success = $user->lang['POST_REPORTED_SUCCESS'];
-
-			$phpbb_notifications->add_notifications('notification.type.report_post', array_merge($report_data, $row, $forum_data, array(
-				'report_text'	=> $report_text,
-			)));
-		}
-		else
-		{
-			$sql = 'UPDATE ' . PRIVMSGS_TABLE . '
-				SET message_reported = 1
-				WHERE msg_id = ' . $pm_id;
-			$db->sql_query($sql);
-
-			$sql_ary = array(
-				'msg_id'		=> $pm_id,
-				'user_id'		=> ANONYMOUS,
-				'author_id'		=> (int) $report_data['author_id'],
-				'pm_deleted'	=> 0,
-				'pm_new'		=> 0,
-				'pm_unread'		=> 0,
-				'pm_replied'	=> 0,
-				'pm_marked'		=> 0,
-				'pm_forwarded'	=> 0,
-				'folder_id'		=> PRIVMSGS_INBOX,
-			);
-
-			$sql = 'INSERT INTO ' . PRIVMSGS_TO_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
-			$db->sql_query($sql);
-
-			$lang_return = $user->lang['RETURN_PM'];
-			$lang_success = $user->lang['PM_REPORTED_SUCCESS'];
-
-			$phpbb_notifications->add_notifications('notification.type.report_pm', array_merge($report_data, $row, array(
-				'report_text'	=> $report_text,
-				'from_user_id'	=> $report_data['author_id'],
-				'report_id'		=> $report_id,
-			)));
-		}
-
-		meta_refresh(3, $redirect_url);
-
-		$message = $lang_success . '<br /><br />' . sprintf($lang_return, '<a href="' . $redirect_url . '">', '</a>');
-		if ($return_forum_url)
-		{
-			$message .= '<br /><br />' . sprintf($user->lang['RETURN_FORUM'], '<a href="' . $return_forum_url . '">', '</a>');
-		}
-		trigger_error($message);
-	}
-	else if (isset($captcha) && $captcha->is_solved() !== false)
-	{
-		$s_hidden_fields .= build_hidden_fields($captcha->get_hidden_fields());
-	}
-}
-
-// Generate the reasons
-display_reasons($reason_id);
-
-$page_title = ($pm_id) ? $user->lang['REPORT_MESSAGE'] : $user->lang['REPORT_POST'];
-
-if (isset($captcha) && $captcha->is_solved() === false)
-{
-	$template->assign_vars(array(
-		'S_CONFIRM_CODE'	=> true,
-		'CAPTCHA_TEMPLATE'	=> $captcha->get_template(),
-	));
-}
-
-$template->assign_vars(array(
-	'ERROR'				=> (sizeof($error)) ? implode('<br />', $error) : '',
-	'S_REPORT_POST'		=> ($pm_id) ? false : true,
-	'REPORT_TEXT'		=> $report_text,
-	'S_REPORT_ACTION'	=> append_sid("{$phpbb_root_path}report.$phpEx", 'f=' . $forum_id . '&amp;p=' . $post_id . '&amp;pm=' . $pm_id),
-	'S_HIDDEN_FIELDS'	=> (sizeof($s_hidden_fields)) ? $s_hidden_fields : null,
-
-	'S_NOTIFY'			=> $user_notify,
-	'S_CAN_NOTIFY'		=> ($user->data['is_registered']) ? true : false,
-	'S_IN_REPORT'		=> true,
-));
-
-generate_forum_nav($forum_data);
-
-// Start output of page
-page_header($page_title);
-
-$template->set_filenames(array(
-	'body' => 'report_body.html')
+/** @var \phpbb\controller\helper $controller_helper */
+$controller_helper = $phpbb_container->get('controller.helper');
+$response = new RedirectResponse(
+	$controller_helper->route($redirect_route_name, array(
+		'id'	=> ($pm_id === 0) ? $post_id : $pm_id,
+	)),
+	301
 );
-
-page_footer();
+$response->send();
--- a/search.php
+++ b/search.php
@@ -25,30 +25,30 @@ $auth->acl($user->data);
 $user->setup('search');
 
 // Define initial vars
-$mode			= request_var('mode', '');
-$search_id		= request_var('search_id', '');
-$start			= max(request_var('start', 0), 0);
-$post_id		= request_var('p', 0);
-$topic_id		= request_var('t', 0);
-$view			= request_var('view', '');
-
-$submit			= request_var('submit', false);
-$keywords		= utf8_normalize_nfc(request_var('keywords', '', true));
-$add_keywords	= utf8_normalize_nfc(request_var('add_keywords', '', true));
-$author			= request_var('author', '', true);
-$author_id		= request_var('author_id', 0);
-$show_results	= ($topic_id) ? 'posts' : request_var('sr', 'posts');
+$mode			= $request->variable('mode', '');
+$search_id		= $request->variable('search_id', '');
+$start			= max($request->variable('start', 0), 0);
+$post_id		= $request->variable('p', 0);
+$topic_id		= $request->variable('t', 0);
+$view			= $request->variable('view', '');
+
+$submit			= $request->variable('submit', false);
+$keywords		= $request->variable('keywords', '', true);
+$add_keywords	= $request->variable('add_keywords', '', true);
+$author			= $request->variable('author', '', true);
+$author_id		= $request->variable('author_id', 0);
+$show_results	= ($topic_id) ? 'posts' : $request->variable('sr', 'posts');
 $show_results	= ($show_results == 'posts') ? 'posts' : 'topics';
-$search_terms	= request_var('terms', 'all');
-$search_fields	= request_var('sf', 'all');
-$search_child	= request_var('sc', true);
+$search_terms	= $request->variable('terms', 'all');
+$search_fields	= $request->variable('sf', 'all');
+$search_child	= $request->variable('sc', true);
 
-$sort_days		= request_var('st', 0);
-$sort_key		= request_var('sk', 't');
-$sort_dir		= request_var('sd', 'd');
+$sort_days		= $request->variable('st', 0);
+$sort_key		= $request->variable('sk', 't');
+$sort_dir		= $request->variable('sd', 'd');
 
-$return_chars	= request_var('ch', ($topic_id) ? -1 : 300);
-$search_forum	= request_var('fid', array(0));
+$return_chars	= $request->variable('ch', ($topic_id) ? -1 : 300);
+$search_forum	= $request->variable('fid', array(0));
 
 // We put login boxes for the case if search_id is newposts, egosearch or unreadposts
 // because a guest should be able to log in even if guests search is not permitted
@@ -123,7 +123,10 @@ $sort_by_text	= array('a' => $user->lang['SORT_AUTHOR'], 't' => $user->lang['SOR
 $s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
 gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param);
 
+/* @var $phpbb_content_visibility \phpbb\content_visibility */
 $phpbb_content_visibility = $phpbb_container->get('content.visibility');
+
+/* @var $pagination \phpbb\pagination */
 $pagination = $phpbb_container->get('pagination');
 
 /**
@@ -324,7 +327,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
 	if (!$keywords && sizeof($author_id_ary))
 	{
 		// if it is an author search we want to show topics by default
-		$show_results = ($topic_id) ? 'posts' : request_var('sr', ($search_id == 'egosearch') ? 'topics' : 'posts');
+		$show_results = ($topic_id) ? 'posts' : $request->variable('sr', ($search_id == 'egosearch') ? 'topics' : 'posts');
 		$show_results = ($show_results == 'posts') ? 'posts' : 'topics';
 	}
 
@@ -368,7 +371,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
 				$show_results = 'topics';
 				$sort_key = 't';
 				$sort_dir = 'd';
-				$sort_days = request_var('st', 7);
+				$sort_days = $request->variable('st', 7);
 				$sort_by_sql['t'] = 't.topic_last_post_time';
 
 				gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param);
@@ -388,7 +391,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
 
 			case 'unanswered':
 				$l_search_title = $user->lang['SEARCH_UNANSWERED'];
-				$show_results = request_var('sr', 'topics');
+				$show_results = $request->variable('sr', 'topics');
 				$show_results = ($show_results == 'posts') ? 'posts' : 'topics';
 				$sort_by_sql['t'] = ($show_results == 'posts') ? 'p.post_time' : 't.topic_last_post_time';
 				$sort_by_sql['s'] = ($show_results == 'posts') ? 'p.post_subject' : 't.topic_title';
@@ -459,7 +462,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
 			case 'newposts':
 				$l_search_title = $user->lang['SEARCH_NEW'];
 				// force sorting
-				$show_results = (request_var('sr', 'topics') == 'posts') ? 'posts' : 'topics';
+				$show_results = ($request->variable('sr', 'topics') == 'posts') ? 'posts' : 'topics';
 				$sort_key = 't';
 				$sort_dir = 'd';
 				$sort_by_sql['t'] = ($show_results == 'posts') ? 'p.post_time' : 't.topic_last_post_time';
@@ -690,8 +693,10 @@ if ($keywords || $author || $author_id || $search_id || $submit)
 	* @var	string	show_results	String indicating the show results mode
 	* @var	string	sql_where		The SQL WHERE string used by search to get topic data
 	* @var	int		total_match_count	The total number of search matches
+	* @var	array	ex_fid_ary		Array of excluded forum ids
 	* @since 3.1.7-RC1
 	* @changed 3.1.10-RC1 Added show_results, sql_where, total_match_count
+	* @changed 3.1.11-RC1 Added ex_fid_ary
 	*/
 	$vars = array(
 		'u_search',
@@ -699,6 +704,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
 		'show_results',
 		'sql_where',
 		'total_match_count',
+		'ex_fid_ary',
 	);
 	extract($phpbb_dispatcher->trigger_event('core.search_modify_url_parameters', compact($vars)));
 
@@ -850,7 +856,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
 		$result = $db->sql_query($sql);
 		$result_topic_id = 0;
 
-		$rowset = array();
+		$rowset = $attachments = $topic_tracking_info = array();
 
 		if ($show_results == 'topics')
 		{
@@ -1060,7 +1066,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
 				$u_mcp_queue = ($topic_unapproved || $posts_unapproved) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=' . (($topic_unapproved) ? 'approve_details' : 'unapproved_posts') . "&amp;t=$result_topic_id", true, $user->session_id) : '';
 				$u_mcp_queue = (!$u_mcp_queue && $topic_deleted) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&amp;mode=deleted_topics&amp;t=$result_topic_id", true, $user->session_id) : $u_mcp_queue;
 
-				$row['topic_title'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '<span class="posthilit">$1</span>', $row['topic_title']);
+				$row['topic_title'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#isu', '<span class="posthilit">$1</span>', $row['topic_title']);
 
 				$tpl_ary = array(
 					'TOPIC_AUTHOR'				=> get_username_string('username', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
@@ -1143,8 +1149,8 @@ if ($keywords || $author || $author_id || $search_id || $submit)
 				if ($hilit)
 				{
 					// post highlighting
-					$row['post_text'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '<span class="posthilit">$1</span>', $row['post_text']);
-					$row['post_subject'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '<span class="posthilit">$1</span>', $row['post_subject']);
+					$row['post_text'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#isu', '<span class="posthilit">$1</span>', $row['post_text']);
+					$row['post_subject'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#isu', '<span class="posthilit">$1</span>', $row['post_subject']);
 				}
 
 				$tpl_ary = array(
@@ -1484,7 +1490,6 @@ if ($auth->acl_get('a_search'))
 				ORDER BY search_time DESC';
 		break;
 
-		case 'mssql':
 		case 'mssql_odbc':
 		case 'mssqlnative':
 			$sql = 'SELECT search_time, search_keywords
--- /dev/null
+++ b/styles/all/template/feed.xml.twig
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="{{ FEED_LANG }}">
+	<link rel="self" type="application/atom+xml" href="{{ SELF_LINK }}" />
+
+	{% if not FEED_TITLE is empty %}<title>{{ FEED_TITLE }}</title>{% endif %}
+
+	{% if not FEED_SUBTITLE is empty %}<subtitle>{{ FEED_SUBTITLE }}</subtitle>{% endif %}
+
+	{% if not FEED_LINK is empty %}<link href="{{ FEED_LINK }}" />{% endif %}
+
+	<updated>{{ FEED_UPDATED }}</updated>
+
+	<author><name><![CDATA[{{ FEED_AUTHOR }}]]></name></author>
+	<id>{{ SELF_LINK }}</id>
+
+	{% for row in FEED_ROWS %}
+	<entry>
+		{% if not row.author is empty %}<author><name><![CDATA[{{ row.author }}]]></name></author>{% endif %}
+
+		<updated>{% if not row.updated is empty %}{{ row.updated }} {% else %}{{ row.published }}{% endif %}</updated>
+
+		{% if not row.published is empty %}<published>{{ row.published }}</published>{% endif %}
+
+		<id>{{ row.link }}</id>
+		<link href="{{ row.link }}"/>
+		<title type="html"><![CDATA[{{ row.title }}]]></title>
+
+		{% if not row.category is empty and row.category_name is defined and row.category_name != '' %}
+			<category term="{{ row.category_name }}" scheme="{{ row.category }}" label="{{ row.category_name }}"/>
+		{% endif %}
+
+		<content type="html" xml:base="{{ row.link }}"><![CDATA[
+{{ row.description }}{% if not row.statistics is empty %}<p>{{ lang('STATISTICS') }}: {{ row.statistics }}</p>{% endif %}<hr />
+]]></content>
+	</entry>
+	{% endfor %}
+</feed>
--- a/styles/prosilver/style.cfg
+++ b/styles/prosilver/style.cfg
@@ -21,8 +21,8 @@
 # General Information about this style
 name = prosilver
 copyright = © phpBB Limited, 2007
-style_version = 3.1.10
-phpbb_version = 3.1.10
+style_version = 3.2.0
+phpbb_version = 3.2.0
 
 # Defining a different template bitfield
 # template_bitfield = lNg=
--- a/styles/prosilver/template/ajax.js
+++ b/styles/prosilver/template/ajax.js
@@ -87,7 +87,7 @@ phpbb.addAjaxCallback('mark_topics_read', function(res, updateTopicLinks) {
 	});
 
 	// Remove link to first unread post
-	$('a').has('span.icon_topic_newest').remove();
+	$('a.unread').has('.icon-red').remove();
 
 	// Update mark topics read links
 	if (updateTopicLinks) {
@@ -132,9 +132,10 @@ phpbb.markNotifications = function($popup, unreadCount) {
 
 	// Update the unread count.
 	$('strong', '#notification_list_button').html(unreadCount);
-	// Remove the Mark all read link if there are no unread notifications.
+	// Remove the Mark all read link and hide notification count if there are no unread notifications.
 	if (!unreadCount) {
 		$('#mark_all_notifications').remove();
+		$('#notification_list_button > strong').addClass('hidden');
 	}
 
 	// Update page title
--- a/styles/prosilver/template/attachment.html
+++ b/styles/prosilver/template/attachment.html
@@ -29,36 +29,7 @@
 		</dl>
 		<!-- ENDIF -->
 
-		<!-- IF _file.S_WM_FILE -->
-			<!-- method used here from http://alistapart.com/articles/byebyeembed / autosizing seems to not work always, this will not fix -->
-			<object width="320" height="285" classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6" id="wmstream_{_file.ATTACH_ID}">
-				<param name="url" value="{_file.U_DOWNLOAD_LINK}" />
-				<param name="showcontrols" value="1" />
-				<param name="showdisplay" value="0" />
-				<param name="showstatusbar" value="0" />
-				<param name="autosize" value="1" />
-				<param name="autostart" value="0" />
-				<param name="visible" value="1" />
-				<param name="animationstart" value="0" />
-				<param name="loop" value="0" />
-				<param name="src" value="{_file.U_DOWNLOAD_LINK}" />
-				<!--[if !IE]>-->
-					<object width="320" height="285" type="video/x-ms-wmv" data="{_file.U_DOWNLOAD_LINK}">
-						<param name="src" value="{_file.U_DOWNLOAD_LINK}" />
-						<param name="controller" value="1" />
-						<param name="showcontrols" value="1" />
-						<param name="showdisplay" value="0" />
-						<param name="showstatusbar" value="0" />
-						<param name="autosize" value="1" />
-						<param name="autostart" value="0" />
-						<param name="visible" value="1" />
-						<param name="animationstart" value="0" />
-						<param name="loop" value="0" />
-					</object>
-				<!--<![endif]-->
-			</object>
-
-		<!-- ELSEIF _file.S_FLASH_FILE -->
+		<!-- IF _file.S_FLASH_FILE -->
 			<object classid="clsid:D27CDB6E-AE6D-11CF-96B8-444553540000" codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=5,0,0,0" width="{_file.WIDTH}" height="{_file.HEIGHT}">
 				<param name="movie" value="{_file.U_VIEW_LINK}" />
 				<param name="play" value="true" />
@@ -68,53 +39,7 @@
 				<param name="allowNetworking" value="internal" />
 				<embed src="{_file.U_VIEW_LINK}" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" width="{_file.WIDTH}" height="{_file.HEIGHT}" play="true" loop="true" quality="high" allowscriptaccess="never" allownetworking="internal"></embed>
 			</object>
-		<!-- ELSEIF _file.S_QUICKTIME_FILE -->
-			<object id="qtstream_{_file.ATTACH_ID}" classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0" width="320" height="285">
-				<param name="src" value="{_file.U_DOWNLOAD_LINK}" />
-				<param name="controller" value="true" />
-				<param name="autoplay" value="false" />
-				<param name="type" value="video/quicktime" />
-				<embed name="qtstream_{_file.ATTACH_ID}" src="{_file.U_DOWNLOAD_LINK}" pluginspage="http://www.apple.com/quicktime/download/" enablejavascript="true" controller="true" width="320" height="285" type="video/quicktime" autoplay="false"></embed>
-			</object>
-		<!-- ELSEIF _file.S_RM_FILE -->
-			<object id="rmstream_{_file.ATTACH_ID}" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" width="200" height="50">
-				<param name="src" value="{_file.U_DOWNLOAD_LINK}" />
-				<param name="autostart" value="false" />
-				<param name="controls" value="ImageWindow" />
-				<param name="console" value="ctrls_{_file.ATTACH_ID}" />
-				<param name="prefetch" value="false" />
-				<embed name="rmstream_{_file.ATTACH_ID}" type="audio/x-pn-realaudio-plugin" src="{_file.U_DOWNLOAD_LINK}" width="0" height="0" autostart="false" controls="ImageWindow" console="ctrls_{_file.ATTACH_ID}" prefetch="false"></embed>
-			</object>
-			<br />
-			<object id="ctrls_{_file.ATTACH_ID}" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" width="0" height="36">
-				<param name="controls" value="ControlPanel" />
-				<param name="console" value="ctrls_{_file.ATTACH_ID}" />
-				<embed name="ctrls_{_file.ATTACH_ID}" type="audio/x-pn-realaudio-plugin" width="200" height="36" controls="ControlPanel" console="ctrls_{_file.ATTACH_ID}"></embed>
-			</object>
-
-			<script type="text/javascript">
-			// <![CDATA[
-				if (document.rmstream_{_file.ATTACH_ID}.GetClipWidth)
-				{
-					while (!document.rmstream_{_file.ATTACH_ID}.GetClipWidth())
-					{
-					}
-
-					var width = document.rmstream_{_file.ATTACH_ID}.GetClipWidth();
-					var height = document.rmstream_{_file.ATTACH_ID}.GetClipHeight();
-
-					document.rmstream_{_file.ATTACH_ID}.width = width;
-					document.rmstream_{_file.ATTACH_ID}.height = height;
-					document.ctrls_{_file.ATTACH_ID}.width = width;
-				}
-			// ]]>
-			</script>
-		<!-- ENDIF -->
-
-		<!-- IF _file.S_WM_FILE or _file.S_RM_FILE or _file.S_FLASH_FILE or _file.S_QUICKTIME_FILE -->
-			<p>
-			<!-- IF _file.S_QUICKTIME_FILE --><a href="#" onclick="play_qt_file(document.qtstream_{_file.ATTACH_ID}); return false;">[ {L_PLAY_QUICKTIME_FILE} ]</a> <!-- ENDIF -->
-			<a href="{_file.U_DOWNLOAD_LINK}">{_file.DOWNLOAD_NAME}</a> [ {_file.FILESIZE} {_file.SIZE_LANG} | {_file.L_DOWNLOAD_COUNT} ]</p>
+			<p><a href="{_file.U_DOWNLOAD_LINK}">{_file.DOWNLOAD_NAME}</a> [ {_file.FILESIZE} {_file.SIZE_LANG} | {_file.L_DOWNLOAD_COUNT} ]</p>
 		<!-- ENDIF -->
 
 		<!-- EVENT attachment_file_append -->
--- a/styles/prosilver/template/bbcode.html
+++ b/styles/prosilver/template/bbcode.html
@@ -11,9 +11,44 @@
 <!-- BEGIN quote_username_open --><blockquote><div><cite>{USERNAME} {L_WROTE}{L_COLON}</cite><!-- END quote_username_open -->
 <!-- BEGIN quote_open --><blockquote class="uncited"><div><!-- END quote_open -->
 <!-- BEGIN quote_close --></div></blockquote><!-- END quote_close -->
+<!-- BEGIN quote_extended -->
+<blockquote>
+	<xsl:if test="not(@author)">
+		<xsl:attribute name="class">uncited</xsl:attribute>
+	</xsl:if>
+	<div>
+		<xsl:if test="@author">
+			<cite>
+				<xsl:choose>
+					<xsl:when test="@url">
+						<a href="{@url}" class="postlink"><xsl:value-of select="@author"/></a>
+					</xsl:when>
+					<xsl:when test="@profile_url">
+						<a href="{@profile_url}"><xsl:value-of select="@author"/></a>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:value-of select="@author"/>
+					</xsl:otherwise>
+				</xsl:choose>
+				<xsl:text> </xsl:text>
+				<xsl:value-of select="$L_WROTE"/>
+				<xsl:value-of select="$L_COLON"/>
+				<xsl:if test="@post_url">
+					<xsl:text> </xsl:text>
+					<a href="{@post_url}" data-post-id="{@post_id}" onclick="if(document.getElementById(hash.substr(1)))href=hash">&#8593;</a>
+				</xsl:if>
+				<xsl:if test="@date">
+					<div class="responsive-hide"><xsl:value-of select="@date"/></div>
+				</xsl:if>
+			</cite>
+		</xsl:if>
+		<xsl:apply-templates/>
+	</div>
+</blockquote>
+<!-- END quote_extended -->
 
-<!-- BEGIN code_open --><div class="codebox"><p>{L_CODE}{L_COLON} <a href="#" onclick="selectCode(this); return false;">{L_SELECT_ALL_CODE}</a></p><code><!-- END code_open -->
-<!-- BEGIN code_close --></code></div><!-- END code_close -->
+<!-- BEGIN code_open --><div class="codebox"><p>{L_CODE}{L_COLON} <a href="#" onclick="selectCode(this); return false;">{L_SELECT_ALL_CODE}</a></p><pre><code><!-- END code_open -->
+<!-- BEGIN code_close --></code></pre></div><!-- END code_close -->
 
 <!-- BEGIN inline_attachment_open --><div class="inline-attachment"><!-- END inline_attachment_open -->
 <!-- BEGIN inline_attachment_close --></div><!-- END inline_attachment_close -->
--- a/styles/prosilver/template/captcha_recaptcha.html
+++ b/styles/prosilver/template/captcha_recaptcha.html
@@ -12,24 +12,11 @@
 	<dl>
 	<dt><label>{L_CONFIRM_CODE}{L_COLON}</label><br /><span>{L_RECAPTCHA_EXPLAIN}</span></dt>
 	<dd class="captcha">
-		<script>
-		var RecaptchaOptions = {
-			lang : '{LA_RECAPTCHA_LANG}',
-			theme : 'clean',
-			tabindex : <!-- IF $CAPTCHA_TAB_INDEX -->{$CAPTCHA_TAB_INDEX}<!-- ELSE -->10<!-- ENDIF -->
-		};
-		</script>
-		<script src="{RECAPTCHA_SERVER}/challenge?k={RECAPTCHA_PUBKEY}{RECAPTCHA_ERRORGET}"></script>
-
 		<noscript>
-		<div>
-			<object data="{RECAPTCHA_SERVER}/noscript?k={RECAPTCHA_PUBKEY}{RECAPTCHA_ERRORGET}" type="text/html" height="300" width="500"></object><br />
-			<textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
-			<input type="hidden" name="recaptcha_response_field" value="manual_challenge" />
-		</div>
+			<div>{L_RECAPTCHA_NOSCRIPT}</div>
 		</noscript>
-
-		<a href="http://www.google.com/intl/{LA_RECAPTCHA_LANG}/policies/" target="_blank" class="recaptcha-responsive" style="display: none"><img alt="" width="71" height="36" src="{RECAPTCHA_SERVER}/img/clean/logo.png"></a>
+		<script src="{RECAPTCHA_SERVER}.js?hl={LA_RECAPTCHA_LANG}" async defer></script>
+		<div class="g-recaptcha" data-sitekey="{RECAPTCHA_PUBKEY}" data-tabindex="<!-- IF $CAPTCHA_TAB_INDEX -->{$CAPTCHA_TAB_INDEX}<!-- ELSE -->10<!-- ENDIF -->"></div>
 	</dd>
 	</dl>
 <!-- ELSE -->
--- a/styles/prosilver/template/confirm_delete_body.html
+++ b/styles/prosilver/template/confirm_delete_body.html
@@ -58,7 +58,7 @@
 
 	<fieldset class="submit-buttons">
 		{S_HIDDEN_FIELDS}
-		<input type="submit" name="confirm" value="{L_YES}" class="button1" />&nbsp; 
+		<input type="submit" name="confirm" value="{L_YES}" class="button1" />&nbsp;
 		<input type="submit" name="cancel" value="{L_NO}" class="button2" />
 	</fieldset>
 
--- /dev/null
+++ b/styles/prosilver/template/display_options.html
@@ -0,0 +1,27 @@
+<div class="dropdown-container dropdown-container-{S_CONTENT_FLOW_BEGIN} dropdown-button-control sort-tools">
+	<span title="{L_SORT_OPTIONS}" class="button button-secondary dropdown-trigger dropdown-select">
+		<i class="icon fa-sort-amount-asc fa-fw" aria-hidden="true"></i>
+		<span class="caret"><i class="icon fa-sort-down fa-fw" aria-hidden="true"></i></span>
+	</span>
+	<div class="dropdown hidden">
+		<div class="pointer"><div class="pointer-inner"></div></div>
+		<div class="dropdown-contents">
+			<fieldset class="display-options">
+			<!-- IF S_SORT_OPTIONS -->
+				<label>{L_SORT_BY}{L_COLON} <select name="sk" id="sk">{S_SORT_OPTIONS}</select></label>
+				<label>{L_SORT_DIRECTION}{L_COLON} <select name="sd" id="sd">{S_ORDER_SELECT}</select></label>
+				<hr class="dashed" />
+				<input type="submit" class="button2" name="sort" value="{L_SORT}" />
+			<!-- ELSE -->
+				<label>{L_DISPLAY}{L_COLON} {S_SELECT_SORT_DAYS}</label>
+				<!-- IF S_SELECT_SORT_KEY -->
+				<label>{L_SORT_BY}{L_COLON} {S_SELECT_SORT_KEY}</label>
+				<label>{L_SORT_DIRECTION}{L_COLON} {S_SELECT_SORT_DIR}</label>
+				<!-- ENDIF -->
+				<hr class="dashed" />
+				<input type="submit" class="button2" name="sort" value="{L_GO}" />
+			<!-- ENDIF -->
+			</fieldset>
+		</div>
+	</div>
+</div>
--- a/styles/prosilver/template/faq_body.html
+++ b/styles/prosilver/template/faq_body.html
@@ -34,8 +34,10 @@
 				<dl class="faq">
 					<dt id="f{faq_block.S_ROW_COUNT}r{faq_block.faq_row.S_ROW_COUNT}"><strong>{faq_block.faq_row.FAQ_QUESTION}</strong></dt>
 					<dd>{faq_block.faq_row.FAQ_ANSWER}</dd>
-					<dd><a href="#faqlinks" class="top2">{L_BACK_TO_TOP}</a></dd>
 				</dl>
+				<a href="#faqlinks" class="top">
+					<i class="icon fa-chevron-circle-up fa-fw icon-gray" aria-hidden="true"></i><span>{L_BACK_TO_TOP}</span>
+				</a>
 				<!-- IF not faq_block.faq_row.S_LAST_ROW --><hr class="dashed" /><!-- ENDIF -->
 			<!-- END faq_row -->
 		</div>
--- a/styles/prosilver/template/forum_fn.js
+++ b/styles/prosilver/template/forum_fn.js
@@ -365,13 +365,13 @@ function parseDocument($container) {
 	/**
 	* Adjust HTML code for IE8 and older versions
 	*/
-	if (oldBrowser) {
-		// Fix .linklist.bulletin lists
-		$container
-			.find('ul.linklist.bulletin > li')
-			.filter(':first-child, .rightside:last-child')
-			.addClass('no-bulletin');
-	}
+	// if (oldBrowser) {
+	// 	// Fix .linklist.bulletin lists
+	// 	$container
+	// 		.find('ul.linklist.bulletin > li')
+	// 		.filter(':first-child, .rightside:last-child')
+	// 		.addClass('no-bulletin');
+	// }
 
 	/**
 	* Resize navigation (breadcrumbs) block to keep all links on same line
@@ -492,7 +492,7 @@ function parseDocument($container) {
 			$linksFirst = $linksNotSkip.not(filterLast), // The items that will be hidden first
 			$linksLast = $linksNotSkip.filter(filterLast), // The items that will be hidden last
 			persistent = $this.attr('id') === 'nav-main', // Does this list already have a menu (such as quick-links)?
-			html = '<li class="responsive-menu hidden"><a href="javascript:void(0);" class="responsive-menu-link">&nbsp;</a><div class="dropdown hidden"><div class="pointer"><div class="pointer-inner" /></div><ul class="dropdown-contents" /></div></li>',
+			html = '<li class="responsive-menu hidden"><a href="javascript:void(0);" class="js-responsive-menu-link responsive-menu-link"><i class="icon fa-bars fa-fw" aria-hidden="true"></i></a><div class="dropdown"><div class="pointer"><div class="pointer-inner" /></div><ul class="dropdown-contents" /></div></li>',
 			slack = 3; // Vertical slack space (in pixels). Determines how sensitive the script is in determining whether a line-break has occured.
 
 		// Add a hidden drop-down menu to each links list (except those that already have one)
@@ -581,8 +581,10 @@ function parseDocument($container) {
 				$menuContents.prepend($clones1.addClass('clone clone-first').removeClass('leftside rightside'));
 
 				if ($this.hasClass('post-buttons')) {
-					$('.button', $menuContents).removeClass('button icon-button');
-					$('.responsive-menu-link', $menu).addClass('button icon-button').prepend('<span></span>');
+					$('.button', $menuContents).removeClass('button');
+					$('.sr-only', $menuContents).removeClass('sr-only');
+					$('.js-responsive-menu-link').addClass('button').addClass('button-icon-only');
+					$('.js-responsive-menu-link .icon').removeClass('fa-bars').addClass('fa-ellipsis-h');
 				}
 				copied1 = true;
 			}
@@ -636,7 +638,7 @@ function parseDocument($container) {
 		}
 
 		if (!persistent) {
-			phpbb.registerDropdown($menu.find('a.responsive-menu-link'), $menu.find('.dropdown'), false);
+			phpbb.registerDropdown($menu.find('a.js-responsive-menu-link'), $menu.find('.dropdown'), false);
 		}
 
 		// If there are any images in the links list, run the check again after they have loaded
--- a/styles/prosilver/template/forumlist_body.html
+++ b/styles/prosilver/template/forumlist_body.html
@@ -14,7 +14,7 @@
 			<ul class="topiclist">
 				<li class="header">
 					<!-- EVENT forumlist_body_category_header_row_prepend -->
-					<dl class="icon">
+					<dl class="row-item">
 						<dt><div class="list-inner"><!-- IF forumrow.S_IS_CAT --><a href="{forumrow.U_VIEWFORUM}">{forumrow.FORUM_NAME}</a><!-- ELSE -->{L_FORUM}<!-- ENDIF --></div></dt>
 						<dd class="topics">{L_TOPICS}</dd>
 						<dd class="posts">{L_POSTS}</dd>
@@ -31,12 +31,17 @@
 		<!-- EVENT forumlist_body_forum_row_before -->
 		<li class="row">
 			<!-- EVENT forumlist_body_forum_row_prepend -->
-			<dl class="icon {forumrow.FORUM_IMG_STYLE}">
+			<dl class="row-item {forumrow.FORUM_IMG_STYLE}">
 				<dt title="{forumrow.FORUM_FOLDER_IMG_ALT}">
-					<!-- IF forumrow.S_UNREAD_FORUM --><a href="{forumrow.U_VIEWFORUM}" class="icon-link"></a><!-- ENDIF -->
+					<!-- IF forumrow.S_UNREAD_FORUM --><a href="{forumrow.U_VIEWFORUM}" class="row-item-link"></a><!-- ENDIF -->
 					<div class="list-inner">
-						<!-- IF S_ENABLE_FEEDS and forumrow.S_FEED_ENABLED --><!-- <a class="feed-icon-forum" title="{L_FEED} - {forumrow.FORUM_NAME}" href="{U_FEED}?f={forumrow.FORUM_ID}"><img src="{T_THEME_PATH}/images/feed.gif" alt="{L_FEED} - {forumrow.FORUM_NAME}" /></a> --><!-- ENDIF -->
-
+						<!-- IF S_ENABLE_FEEDS and forumrow.S_FEED_ENABLED -->
+							<!--
+								<a class="feed-icon-forum" title="{L_FEED} - {forumrow.FORUM_NAME}" href="{U_FEED}?f={forumrow.FORUM_ID}">
+									<i class="icon fa-rss-square fa-fw icon-orange" aria-hidden="true"></i><span class="sr-only">{L_FEED} - {forumrow.FORUM_NAME}</span>
+								</a>
+							-->
+						<!-- ENDIF -->
 						<!-- IF forumrow.FORUM_IMAGE --><span class="forum-image">{forumrow.FORUM_IMAGE}</span><!-- ENDIF -->
 						<a href="{forumrow.U_VIEWFORUM}" class="forumtitle">{forumrow.FORUM_NAME}</a>
 						<!-- IF forumrow.FORUM_DESC --><br />{forumrow.FORUM_DESC}<!-- ENDIF -->
@@ -47,7 +52,10 @@
 							<!-- EVENT forumlist_body_subforums_before -->
 							<br /><strong>{forumrow.L_SUBFORUM_STR}{L_COLON}</strong>
 							<!-- BEGIN subforum -->
-								<a href="{forumrow.subforum.U_SUBFORUM}" class="subforum<!-- IF forumrow.subforum.S_UNREAD --> unread<!-- ELSE --> read<!-- ENDIF -->" title="<!-- IF forumrow.subforum.S_UNREAD -->{L_UNREAD_POSTS}<!-- ELSE -->{L_NO_UNREAD_POSTS}<!-- ENDIF -->">{forumrow.subforum.SUBFORUM_NAME}</a><!-- IF not forumrow.subforum.S_LAST_ROW -->{L_COMMA_SEPARATOR}<!-- ENDIF -->
+								<a href="{forumrow.subforum.U_SUBFORUM}" class="subforum<!-- IF forumrow.subforum.S_UNREAD --> unread<!-- ELSE --> read<!-- ENDIF -->" title="<!-- IF forumrow.subforum.S_UNREAD -->{L_UNREAD_POSTS}<!-- ELSE -->{L_NO_UNREAD_POSTS}<!-- ENDIF -->">
+									<i class="icon <!-- IF forumrow.subforum.IS_LINK -->fa-external-link<!-- ELSE -->fa-file-o<!-- ENDIF --> fa-fw <!-- IF forumrow.subforum.S_UNREAD --> icon-red<!-- ELSE --> icon-blue<!-- ENDIF --> icon-md" aria-hidden="true"></i>{forumrow.subforum.SUBFORUM_NAME}
+								</a>
+								<!-- IF not forumrow.subforum.S_LAST_ROW -->{L_COMMA_SEPARATOR}<!-- ENDIF -->
 							<!-- END subforum -->
 							<!-- EVENT forumlist_body_subforums_after -->
 						<!-- ENDIF -->
@@ -68,19 +76,34 @@
 				<!-- ELSEIF not forumrow.S_IS_LINK -->
 					<dd class="topics">{forumrow.TOPICS} <dfn>{L_TOPICS}</dfn></dd>
 					<dd class="posts">{forumrow.POSTS} <dfn>{L_POSTS}</dfn></dd>
-					<dd class="lastpost"><span>
-						<!-- IF forumrow.U_UNAPPROVED_TOPICS -->
-							<a href="{forumrow.U_UNAPPROVED_TOPICS}">{UNAPPROVED_IMG}</a>
-						<!-- ELSEIF forumrow.U_UNAPPROVED_POSTS -->
-							<a href="{forumrow.U_UNAPPROVED_POSTS}">{UNAPPROVED_POST_IMG}</a>
-						<!-- ENDIF -->
-						<!-- IF forumrow.LAST_POST_TIME --><dfn>{L_LAST_POST}</dfn>
-						<!-- IF forumrow.S_DISPLAY_SUBJECT -->
-							<!-- EVENT forumlist_body_last_post_title_prepend -->
-							<a href="{forumrow.U_LAST_POST}" title="{forumrow.LAST_POST_SUBJECT}" class="lastsubject">{forumrow.LAST_POST_SUBJECT_TRUNCATED}</a> <br />
-						<!-- ENDIF --> 
-						{L_POST_BY_AUTHOR} {forumrow.LAST_POSTER_FULL}
-						<!-- IF not S_IS_BOT --><a href="{forumrow.U_LAST_POST}">{LAST_POST_IMG}</a> <!-- ENDIF --><br />{forumrow.LAST_POST_TIME}<!-- ELSE -->{L_NO_POSTS}<br />&nbsp;<!-- ENDIF --></span>
+					<dd class="lastpost">
+						<span>
+							<!-- IF forumrow.U_UNAPPROVED_TOPICS -->
+								<a href="{forumrow.U_UNAPPROVED_TOPICS}" title="{L_TOPICS_UNAPPROVED}">
+									<i class="icon fa-question fa-fw icon-blue" aria-hidden="true"></i><span class="sr-only">{L_TOPICS_UNAPPROVED}</span>
+								</a>
+							<!-- ELSEIF forumrow.U_UNAPPROVED_POSTS -->
+								<a href="{forumrow.U_UNAPPROVED_POSTS}" title="{L_POSTS_UNAPPROVED_FORUM}">
+									<i class="icon fa-question fa-fw icon-blue" aria-hidden="true"></i><span class="sr-only">{L_POSTS_UNAPPROVED_FORUM}</span>
+								</a>
+							<!-- ENDIF -->
+							<!-- IF forumrow.LAST_POST_TIME -->
+								<dfn>{L_LAST_POST}</dfn>
+								<!-- IF forumrow.S_DISPLAY_SUBJECT -->
+									<!-- EVENT forumlist_body_last_post_title_prepend -->
+									<a href="{forumrow.U_LAST_POST}" title="{forumrow.LAST_POST_SUBJECT}" class="lastsubject">{forumrow.LAST_POST_SUBJECT_TRUNCATED}</a> <br />
+								<!-- ENDIF -->
+									{L_POST_BY_AUTHOR} {forumrow.LAST_POSTER_FULL}
+								<!-- IF not S_IS_BOT -->
+									<a href="{forumrow.U_LAST_POST}" title="{L_VIEW_LATEST_POST}">
+										<i class="icon fa-external-link-square fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{L_VIEW_LATEST_POST}</span>
+									</a>
+								<!-- ENDIF -->
+								<br />{forumrow.LAST_POST_TIME}
+							<!-- ELSE -->
+								{L_NO_POSTS}<br />&nbsp;
+							<!-- ENDIF -->
+						</span>
 					</dd>
 				<!-- ELSE -->
 					<dd>&nbsp;</dd>
--- a/styles/prosilver/template/jumpbox.html
+++ b/styles/prosilver/template/jumpbox.html
@@ -1,32 +1,50 @@
 
-<!-- IF S_VIEWTOPIC -->
-	<p class="jumpbox-return"><a href="{U_VIEW_FORUM}" class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">{L_RETURN_TO_FORUM}</a></p>
-<!-- ELSEIF S_VIEWFORUM -->
-	<p class="jumpbox-return"><a href="{U_INDEX}" class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">{L_RETURN_TO_INDEX}</a></p>
-<!-- ELSEIF SEARCH_TOPIC -->
-	<p class="jumpbox-return"><a class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH_TOPIC}" accesskey="r">{L_RETURN_TO_TOPIC}</a></p>
-<!-- ELSEIF S_SEARCH_ACTION -->
-	<p class="jumpbox-return"><a class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH}" title="{L_SEARCH_ADV}" accesskey="r">{L_GO_TO_SEARCH_ADV}</a></p>
-<!-- ENDIF -->
+<div class="action-bar actions-jump">
+	<!-- IF S_VIEWTOPIC -->
+	<p class="jumpbox-return">
+		<a href="{U_VIEW_FORUM}" class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
+			<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_RETURN_TO_FORUM}</span>
+		</a>
+	</p>
+	<!-- ELSEIF S_VIEWFORUM -->
+	<p class="jumpbox-return">
+		<a href="{U_INDEX}" class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
+			<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_RETURN_TO_INDEX}</span>
+		</a>
+	</p>
+	<!-- ELSEIF SEARCH_TOPIC -->
+	<p class="jumpbox-return">
+		<a class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH_TOPIC}" accesskey="r">
+			<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_RETURN_TO_TOPIC}</span>
+		</a>
+	</p>
+	<!-- ELSEIF S_SEARCH_ACTION -->
+	<p class="jumpbox-return">
+		<a class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH}" title="{L_SEARCH_ADV}" accesskey="r">
+			<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_GO_TO_SEARCH_ADV}</span>
+		</a>
+	</p>
+	<!-- ENDIF -->
 
-<!-- IF S_DISPLAY_JUMPBOX -->
-
-	<div class="dropdown-container dropdown-container-{S_CONTENT_FLOW_END}<!-- IF not S_IN_MCP --> dropdown-up<!-- ENDIF --> dropdown-{S_CONTENT_FLOW_BEGIN} dropdown-button-control" id="jumpbox">
-		<span title="<!-- IF S_IN_MCP and S_MERGE_SELECT -->{L_SELECT_TOPICS_FROM}<!-- ELSEIF S_IN_MCP -->{L_MODERATE_FORUM}<!-- ELSE -->{L_JUMP_TO}<!-- ENDIF -->" class="dropdown-trigger button dropdown-select">
-			<!-- IF S_IN_MCP and S_MERGE_SELECT -->{L_SELECT_TOPICS_FROM}<!-- ELSEIF S_IN_MCP -->{L_MODERATE_FORUM}<!-- ELSE -->{L_JUMP_TO}<!-- ENDIF -->
-		</span>
-		<div class="dropdown hidden">
+	<!-- IF S_DISPLAY_JUMPBOX -->
+	<div class="jumpbox dropdown-container dropdown-container-right<!-- IF not S_IN_MCP --> dropdown-up<!-- ENDIF --> dropdown-{S_CONTENT_FLOW_BEGIN} dropdown-button-control" id="jumpbox">
+			<span title="<!-- IF S_IN_MCP and S_MERGE_SELECT -->{L_SELECT_TOPICS_FROM}<!-- ELSEIF S_IN_MCP -->{L_MODERATE_FORUM}<!-- ELSE -->{L_JUMP_TO}<!-- ENDIF -->" class="button button-secondary dropdown-trigger dropdown-select">
+				<span><!-- IF S_IN_MCP and S_MERGE_SELECT -->{L_SELECT_TOPICS_FROM}<!-- ELSEIF S_IN_MCP -->{L_MODERATE_FORUM}<!-- ELSE -->{L_JUMP_TO}<!-- ENDIF --></span>
+				<span class="caret"><i class="icon fa-sort-down fa-fw" aria-hidden="true"></i></span>
+			</span>
+		<div class="dropdown">
 			<div class="pointer"><div class="pointer-inner"></div></div>
 			<ul class="dropdown-contents">
-			<!-- BEGIN jumpbox_forums -->
+				<!-- BEGIN jumpbox_forums -->
 				<!-- IF jumpbox_forums.FORUM_ID neq -1 -->
-					<li><!-- BEGIN level -->&nbsp; &nbsp;<!-- END level --><a href="{jumpbox_forums.LINK}">{jumpbox_forums.FORUM_NAME}</a></li>
+				<li><a href="{jumpbox_forums.LINK}" class="<!-- IF jumpbox_forums.level -->jumpbox-sub-link<!-- ELSEIF jumpbox_forums.S_IS_CAT -->jumpbox-cat-link<!-- ELSE -->jumpbox-forum-link<!-- ENDIF -->"><!-- BEGIN level --><span class="spacer"></span><!-- END level --> <span><!-- IF jumpbox_forums.level --> &#8627; &nbsp;<!-- ENDIF --> {jumpbox_forums.FORUM_NAME}</span></a></li>
 				<!-- ENDIF -->
-			<!-- END jumpbox_forums -->
+				<!-- END jumpbox_forums -->
 			</ul>
 		</div>
 	</div>
 
-<!-- ELSE -->
-	<br /><br />
-<!-- ENDIF -->
+	<!-- ELSE -->
+	</br></br>
+	<!-- ENDIF -->
+</div>
--- a/styles/prosilver/template/mcp_approve.html
+++ b/styles/prosilver/template/mcp_approve.html
@@ -39,7 +39,7 @@
 
 		<fieldset>
 		<!-- IF S_NOTIFY_POSTER -->
-			<dl class="panel">
+			<dl class="fields2 nobg">
 				<dt>&nbsp;</dt>
 				<dd><label><input type="checkbox" name="notify_poster" checked="checked" /> <!-- IF S_APPROVE -->{L_NOTIFY_POSTER_APPROVAL}<!-- ELSE -->{L_NOTIFY_POSTER_DISAPPROVAL}<!-- ENDIF --></label></dd>
 			</dl>
@@ -66,7 +66,7 @@
 		</fieldset>
 
 		<fieldset class="submit-buttons">
-			{S_HIDDEN_FIELDS}<input type="submit" name="confirm" value="{YES_VALUE}" class="button1" />&nbsp; 
+			{S_HIDDEN_FIELDS}<input type="submit" name="confirm" value="{YES_VALUE}" class="button1" />&nbsp;
 			<input type="submit" name="cancel" value="{L_NO}" class="button2" />
 		</fieldset>
 
--- a/styles/prosilver/template/mcp_ban.html
+++ b/styles/prosilver/template/mcp_ban.html
@@ -74,7 +74,7 @@
 	<dl>
 		<dt><label for="banexclude0">{L_BAN_EXCLUDE}{L_COLON}</label><br /><span>{L_BAN_EXCLUDE_EXPLAIN}</span></dt>
 		<dd>
-			<label for="banexclude1"><input type="radio" name="banexclude" id="banexclude1" value="1" /> {L_YES}</label> 
+			<label for="banexclude1"><input type="radio" name="banexclude" id="banexclude1" value="1" /> {L_YES}</label>
 			<label for="banexclude0"><input type="radio" name="banexclude" id="banexclude0" value="0" checked="checked" /> {L_NO}</label>
 		</dd>
 	</dl>
@@ -85,7 +85,7 @@
 </div>
 
 <fieldset class="submit-buttons">
-	{S_HIDDEN_FIELDS}<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp; 
+	{S_HIDDEN_FIELDS}<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp;
 	<input type="submit" name="bansubmit" value="{L_SUBMIT}" class="button1" />
 	{S_FORM_TOKEN}
 </fieldset>
@@ -122,7 +122,7 @@
 	</div>
 
 	<fieldset class="submit-buttons">
-		{S_HIDDEN_FIELDS}<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp; 
+		{S_HIDDEN_FIELDS}<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp;
 		<input type="submit" name="unbansubmit" value="{L_SUBMIT}" class="button1" />
 	</fieldset>
 
--- a/styles/prosilver/template/mcp_forum.html
+++ b/styles/prosilver/template/mcp_forum.html
@@ -10,7 +10,7 @@
 <div class="panel">
 	<div class="inner">
 
-	<div class="action-bar top">
+	<div class="action-bar bar-top">
 		<div class="pagination">
 			{TOTAL_TOPICS}
 			<!-- IF .pagination -->
@@ -24,7 +24,7 @@
 	<!-- IF .topicrow -->
 		<ul class="topiclist<!-- IF S_MERGE_SELECT --> missing-column<!-- ENDIF -->">
 			<li class="header">
-				<dl class="icon">
+				<dl class="row-item">
 					<dt><div class="list-inner">{L_TOPICS}</div></dt>
 					<dd class="posts">{L_REPLIES}</dd>
 					<dd class="lastpost"><span>{L_LAST_POST}</span></dd>
@@ -36,23 +36,35 @@
 
 		<!-- BEGIN topicrow -->
 		<li class="row<!-- IF topicrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- IF topicrow.S_TOPIC_REPORTED --> reported<!-- ENDIF -->">
-			<dl class="icon {topicrow.TOPIC_IMG_STYLE}">
+			<dl class="row-item {topicrow.TOPIC_IMG_STYLE}">
 				<dt <!-- IF topicrow.TOPIC_ICON_IMG -->style="background-image: url({T_ICONS_PATH}{topicrow.TOPIC_ICON_IMG}); background-repeat: no-repeat;"<!-- ENDIF -->>
-					<!-- IF topicrow.S_UNREAD_TOPIC --><a href="{topicrow.U_NEWEST_POST}" class="icon-link"></a><!-- ENDIF -->
+					<!-- IF topicrow.S_UNREAD_TOPIC --><a href="{topicrow.U_NEWEST_POST}" class="row-item-link"></a><!-- ENDIF -->
 					<div class="list-inner">
 					<!-- EVENT topiclist_row_prepend -->
 					<!-- IF topicrow.S_SELECT_TOPIC --><a href="{topicrow.U_SELECT_TOPIC}" class="topictitle">[ {L_SELECT_MERGE} ]</a>&nbsp;&nbsp; <!-- ENDIF -->
 					<!-- EVENT mcp_forum_topic_title_before -->
 					<a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a>
 					<!-- EVENT mcp_forum_topic_title_after -->
-					<!-- IF topicrow.S_TOPIC_UNAPPROVED or topicrow.S_POSTS_UNAPPROVED --><a href="{topicrow.U_MCP_QUEUE}">{topicrow.UNAPPROVED_IMG}</a> <!-- ENDIF -->
-					<!-- IF topicrow.S_TOPIC_DELETED or topicrow.S_POSTS_DELETED --><a href="{topicrow.U_MCP_QUEUE}">{topicrow.DELETED_IMG}</a> <!-- ENDIF -->
-					<!-- IF topicrow.S_TOPIC_REPORTED --><a href="{topicrow.U_MCP_REPORT}">{REPORTED_IMG}</a><!-- ENDIF -->
+					<!-- IF topicrow.S_TOPIC_UNAPPROVED or topicrow.S_POSTS_UNAPPROVED -->
+						<a href="{topicrow.U_MCP_QUEUE}" title="{L_TOPIC_UNAPPROVED}">
+							<i class="icon fa-question fa-fw icon-blue" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_UNAPPROVED}</span>
+						</a>
+					<!-- ENDIF -->
+					<!-- IF topicrow.S_TOPIC_DELETED or topicrow.S_POSTS_DELETED -->
+						<a href="{topicrow.U_MCP_QUEUE}" title="{L_TOPIC_DELETED}">
+							<i class="icon fa-recycle fa-fw icon-green" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_DELETED}</span>
+						</a>
+					<!-- ENDIF -->
+					<!-- IF topicrow.S_TOPIC_REPORTED -->
+						<a href="{topicrow.U_MCP_REPORT}" title="{L_TOPIC_REPORTED}">
+							<i class="icon fa-exclamation fa-fw icon-red" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_REPORTED}</span>
+						</a>
+					<!-- ENDIF -->
 					<!-- IF topicrow.S_MOVED_TOPIC and S_CAN_DELETE -->&nbsp;<a href="{topicrow.U_DELETE_TOPIC}" class="topictitle">[ {L_DELETE_SHADOW_TOPIC} ]</a><!-- ENDIF -->
 					<br />
 					<!-- EVENT topiclist_row_topic_title_after -->
 					<div class="responsive-show" style="display: none;">
-						<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
+						<!-- IF topicrow.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <!-- ENDIF -->
 						{L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} &laquo; {topicrow.LAST_POST_TIME}<br />
 					</div>
 					<span class="responsive-show left-box" style="display: none;">{L_REPLIES}{L_COLON} <strong>{topicrow.REPLIES}</strong></span>
@@ -73,15 +85,14 @@
 					<!-- ENDIF -->
 
 					<div class="responsive-hide">
-						<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
+						<!-- IF topicrow.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <!-- ENDIF -->
 						{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
 					</div>
 					<!-- EVENT topiclist_row_append -->
 					</div>
 				</dt>
 				<dd class="posts">{topicrow.REPLIES} <dfn>{L_REPLIES}</dfn></dd>
-				<dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}<br />{topicrow.LAST_POST_TIME}</span>
-				</dd>
+				<dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}<br />{topicrow.LAST_POST_TIME}</span></dd>
 				<!-- IF not S_MERGE_SELECT -->
 				<dd class="mark">
 					<!-- IF not topicrow.S_MOVED_TOPIC --><input type="checkbox" name="topic_id_list[]" value="{topicrow.TOPIC_ID}"<!-- IF topicrow.S_TOPIC_CHECKED --> checked="checked"<!-- ENDIF --> /><!-- ELSE -->&nbsp;<!-- ENDIF -->
@@ -97,16 +108,9 @@
 		</ul>
 	<!-- ENDIF -->
 
-	<fieldset class="display-options">
-		<label>{L_DISPLAY_TOPICS}{L_COLON} {S_SELECT_SORT_DAYS}</label>
-		<label>{L_SORT_BY} {S_SELECT_SORT_KEY}</label>
-		<label>{S_SELECT_SORT_DIR}</label>
-		<input type="submit" name="sort" value="{L_GO}" class="button2" />
-	</fieldset>
-
-	<hr />
-
 	<div class="action-bar bottom">
+		<!-- INCLUDE display_options.html -->
+
 		<div class="pagination">
 			{TOTAL_TOPICS}
 			<!-- IF .pagination -->
@@ -120,6 +124,7 @@
 	</div>
 </div>
 
+<!-- EVENT mcp_forum_actions_before -->
 <fieldset class="display-actions">
 	<!-- IF not S_MERGE_SELECT -->
 	<select name="action">
@@ -133,16 +138,16 @@
 		<!-- IF S_CAN_SYNC --><option value="resync">{L_RESYNC}</option><!-- ENDIF -->
 		<!-- IF S_CAN_MAKE_NORMAL --><option value="make_normal">{L_MAKE_NORMAL}</option><!-- ENDIF -->
 		<!-- IF S_CAN_MAKE_STICKY --><option value="make_sticky">{L_MAKE_STICKY}</option><!-- ENDIF -->
-		<!-- IF S_CAN_MAKE_ANNOUNCE -->
-			<option value="make_announce">{L_MAKE_ANNOUNCE}</option>
-			<option value="make_global">{L_MAKE_GLOBAL}</option>
-		<!-- ENDIF -->
+		<!-- IF S_CAN_MAKE_ANNOUNCE --><option value="make_announce">{L_MAKE_ANNOUNCE}</option><!-- ENDIF -->
+		<!-- IF S_CAN_MAKE_ANNOUNCE_GLOBAL --><option value="make_global">{L_MAKE_GLOBAL}</option><!-- ENDIF -->
+		<!-- EVENT mcp_forum_actions_append -->
 	</select>
 	<input class="button2" type="submit" value="{L_SUBMIT}" />
 	<div><a href="#" onclick="marklist('mcp', 'topic_id_list', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('mcp', 'topic_id_list', false); return false;">{L_UNMARK_ALL}</a></div>
 	<!-- ENDIF -->
 	{S_FORM_TOKEN}
 </fieldset>
+<!-- EVENT mcp_forum_actions_after -->
 </form>
 
 <!-- INCLUDE mcp_footer.html -->
--- a/styles/prosilver/template/mcp_front.html
+++ b/styles/prosilver/template/mcp_front.html
@@ -30,7 +30,7 @@
 				<dl>
 					<dt>
 						<div class="list-inner">
-							<a href="{unapproved.U_POST_DETAILS}" class="topictitle">{unapproved.SUBJECT}</a> {unapproved.ATTACH_ICON_IMG}<br />
+							<a href="{unapproved.U_POST_DETAILS}" class="topictitle">{unapproved.SUBJECT}</a> <i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <br />
 							{L_POSTED} {L_POST_BY_AUTHOR} {unapproved.AUTHOR_FULL} &raquo; {unapproved.POST_TIME}
 						</div>
 					</dt>
@@ -86,12 +86,12 @@
 				<dl>
 					<dt>
 						<div class="list-inner">
-							<a href="{report.U_POST_DETAILS}#reports" class="topictitle">{report.SUBJECT}</a> {report.ATTACH_ICON_IMG}<br />
+							<a href="{report.U_POST_DETAILS}#reports" class="topictitle">{report.SUBJECT}</a> <i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <br />
 							<span>{L_POSTED} {L_POST_BY_AUTHOR} {report.AUTHOR_FULL} &raquo; {report.POST_TIME}</span>
 						</div>
 					</dt>
 					<dd class="moderation">
-						<span>{L_REPORTED} {L_POST_BY_AUTHOR} {report.REPORTER_FULL} {L_REPORTED_ON_DATE} {report.REPORT_TIME}<br />
+						<span>{L_REPORTED} {L_POST_BY_AUTHOR} {report.REPORTER_FULL} {L_REPORTED_ON_DATE} <i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <br />
 						{L_FORUM}{L_COLON} <a href="{report.U_FORUM}">{report.FORUM_NAME}</a></span>
 					</dd>
 				</dl>
@@ -129,7 +129,7 @@
 				<dl>
 					<dt>
 						<div class="list-inner">
-							<a href="{pm_report.U_PM_DETAILS}" class="topictitle">{pm_report.PM_SUBJECT}</a> {pm_report.ATTACH_ICON_IMG}<br />
+							<a href="{pm_report.U_PM_DETAILS}" class="topictitle">{pm_report.PM_SUBJECT}</a> <i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <br />
 							<span>{L_MESSAGE_BY_AUTHOR} {pm_report.PM_AUTHOR_FULL} &raquo; {pm_report.PM_TIME}</span><br />
 							<span>{L_MESSAGE_TO} {pm_report.RECIPIENTS}</span>
 						</div>
--- a/styles/prosilver/template/mcp_header.html
+++ b/styles/prosilver/template/mcp_header.html
@@ -8,7 +8,7 @@
 	</p>
 <!-- ENDIF -->
 
-<div id="tabs">
+<div id="tabs" class="tabs">
 	<ul>
 		<!-- BEGIN l_block1 -->
 		<li class="tab<!-- IF l_block1.S_SELECTED --> activetab<!-- ENDIF -->"><a href="{l_block1.U_TITLE}">{l_block1.L_TITLE}</a></li>
@@ -21,14 +21,14 @@
 
 	<div style="width: 100%;">
 
-	<div id="cp-menu">
-		<div id="navigation" role="navigation">
+	<div id="cp-menu" class="cp-menu">
+		<div id="navigation" class="navigation" role="navigation">
 			<ul>
 			<!-- BEGIN l_block1 -->
 			<!-- IF l_block1.S_SELECTED -->
 				<!-- BEGIN l_block2 -->
 				<!-- IF l_block1.l_block2.S_SELECTED -->
-				<li id="active-subsection"><a href="{l_block1.l_block2.U_TITLE}"><span>{l_block1.l_block2.L_TITLE}<!-- IF l_block1.l_block2.ADD_ITEM --> ({l_block1.l_block2.ADD_ITEM})<!-- ENDIF --></span></a></li>
+				<li id="active-subsection" class="active-subsection"><a href="{l_block1.l_block2.U_TITLE}"><span>{l_block1.l_block2.L_TITLE}<!-- IF l_block1.l_block2.ADD_ITEM --> ({l_block1.l_block2.ADD_ITEM})<!-- ENDIF --></span></a></li>
 				<!-- ELSE -->
 				<li><a href="{l_block1.l_block2.U_TITLE}"><span>{l_block1.l_block2.L_TITLE}<!-- IF l_block1.l_block2.ADD_ITEM --> ({l_block1.l_block2.ADD_ITEM})<!-- ENDIF --></span></a></li>
 				<!-- ENDIF -->
@@ -39,7 +39,7 @@
 		</div>
 	</div>
 
-	<div id="cp-main" class="mcp-main panel-container">
+	<div id="cp-main" class="cp-main mcp-main panel-container">
 		<!-- IF MESSAGE -->
 		<div class="content">
 			<h2 class="message-title">{L_MESSAGE}</h2>
--- a/styles/prosilver/template/mcp_logs.html
+++ b/styles/prosilver/template/mcp_logs.html
@@ -7,13 +7,13 @@
 <div class="panel">
 	<div class="inner">
 
-	<div class="action-bar top">
+	<div class="action-bar bar-top">
 		{L_SEARCH_KEYWORDS}{L_COLON} <input type="search" class="inputbox autowidth" name="keywords" value="{S_KEYWORDS}" />&nbsp;<input type="submit" class="button2" name="filter" value="{L_SEARCH}" />
 		<div class="pagination">
 			{TOTAL}
-			<!-- IF .pagination --> 
+			<!-- IF .pagination -->
 				<!-- INCLUDE pagination.html -->
-			<!-- ELSE --> 
+			<!-- ELSE -->
 				 &bull; {PAGE_NUMBER}
 			<!-- ENDIF -->
 		</div>
@@ -51,21 +51,14 @@
 	</table>
 
 	<!-- IF .log -->
-		<fieldset class="display-options">
-			<label>{L_DISPLAY_POSTS}{L_COLON} {S_SELECT_SORT_DAYS}</label>
-			<label>{L_SORT_BY} {S_SELECT_SORT_KEY}</label>
-			<label>{S_SELECT_SORT_DIR}</label>
-			<input type="submit" name="sort" value="{L_GO}" class="button2" />
-		</fieldset>
-
-		<hr />
-
 		<div class="action-bar bottom">
+			<!-- INCLUDE display_options.html -->
+
 			<div class="pagination">
 				{TOTAL}
-				<!-- IF .pagination --> 
+				<!-- IF .pagination -->
 					<!-- INCLUDE pagination.html -->
-				<!-- ELSE --> 
+				<!-- ELSE -->
 					 &bull; {PAGE_NUMBER}
 				<!-- ENDIF -->
 			</div>
--- a/styles/prosilver/template/mcp_notes_front.html
+++ b/styles/prosilver/template/mcp_notes_front.html
@@ -19,7 +19,7 @@
 </div>
 
 <fieldset class="submit-buttons">
-	<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp; 
+	<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp;
 	<input type="submit" name="submituser" value="{L_SUBMIT}" class="button1" />
 	{S_FORM_TOKEN}
 </fieldset>
--- a/styles/prosilver/template/mcp_notes_user.html
+++ b/styles/prosilver/template/mcp_notes_user.html
@@ -50,13 +50,13 @@
 <div class="panel">
 	<div class="inner">
 
-	<div class="action-bar top">
+	<div class="action-bar bar-top">
 		{L_SEARCH_KEYWORDS}{L_COLON} <input type="search" class="inputbox autowidth" name="keywords" value="{S_KEYWORDS}" />&nbsp;<input type="submit" class="button2" name="filter" value="{L_SEARCH}" />
 		<div class="pagination">
 			{TOTAL_REPORTS}
-			<!-- IF .pagination --> 
+			<!-- IF .pagination -->
 				<!-- INCLUDE pagination.html -->
-			<!-- ELSE --> 
+			<!-- ELSE -->
 				 &bull; {PAGE_NUMBER}
 			<!-- ENDIF -->
 		</div>
@@ -90,22 +90,14 @@
 	</tbody>
 	</table>
 
-	<hr />
-
-	<fieldset class="display-options">
-		<label>{L_DISPLAY_LOG}{L_COLON} {S_SELECT_SORT_DAYS}</label>
-		<label>{L_SORT_BY} {S_SELECT_SORT_KEY}</label><label>{S_SELECT_SORT_DIR}</label>
-		<input type="submit" name="sort" value="{L_GO}" class="button2" />
-	</fieldset>
-
-	<hr />
-
 	<div class="action-bar bottom">
+		<!-- INCLUDE display_options.html -->
+
 		<div class="pagination">
 			{TOTAL_REPORTS}
-			<!-- IF .pagination --> 
+			<!-- IF .pagination -->
 				<!-- INCLUDE pagination.html -->
-			<!-- ELSE --> 
+			<!-- ELSE -->
 				 &bull; {PAGE_NUMBER}
 			<!-- ENDIF -->
 		</div>
--- a/styles/prosilver/template/mcp_post.html
+++ b/styles/prosilver/template/mcp_post.html
@@ -14,7 +14,7 @@
 			<h3>{L_REPORT_REASON}{L_COLON} {REPORT_REASON_TITLE}</h3>
 			<p class="author">{L_REPORTED} {L_POST_BY_AUTHOR} {REPORTER_FULL} &laquo; {REPORT_DATE}</p>
 		<!-- IF S_REPORT_CLOSED -->
-			<p class="post-notice reported">{L_REPORT_CLOSED}</p>
+			<p class="post-notice reported"><i class="icon fa-exclamation fa-fw icon-red" aria-hidden="true"></i>{L_REPORT_CLOSED}</p>
 		<!-- ENDIF -->
 			<div class="content">
 			<!-- IF REPORT_TEXT -->
@@ -58,8 +58,8 @@
 			</li>
 			<!-- IF U_EDIT -->
 				<li>
-					<a href="{U_EDIT}" title="{L_EDIT_POST}" class="button icon-button edit-icon">
-						<span>{L_EDIT_POST}</span>
+					<a href="{U_EDIT}" title="{L_EDIT_POST}" class="button">
+						<i class="icon fa-pencil fa-fw" aria-hidden="true"></i><span class="sr-only">{L_EDIT_POST}</span>
 					</a>
 				</li>
 			<!-- ENDIF -->
@@ -73,7 +73,7 @@
 			<!-- IF S_BCC_RECIPIENT --><br /><strong>{L_BCC}{L_COLON}</strong> <!-- BEGIN bcc_recipient --><!-- IF bcc_recipient.NAME_FULL -->{bcc_recipient.NAME_FULL}<!-- ELSE --><a href="{bcc_recipient.U_VIEW}" style="color:<!-- IF bcc_recipient.COLOUR -->{bcc_recipient.COLOUR}<!-- ELSEIF bcc_recipient.IS_GROUP -->#0000FF<!-- ENDIF -->;">{bcc_recipient.NAME}</a><!-- ENDIF -->&nbsp;<!-- END bcc_recipient --><!-- ENDIF -->
 		</p>
 		<!-- ELSE -->
-		<p class="author">{MINI_POST_IMG} {L_POSTED} {L_POST_BY_AUTHOR} {POST_AUTHOR_FULL} &raquo; {POST_DATE}</p>
+		<p class="author"><span><i class="icon fa-file fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{MINI_POST_IMG}</span></span> {L_POSTED} {L_POST_BY_AUTHOR} {POST_AUTHOR_FULL} &raquo; {POST_DATE}</p>
 		<!-- ENDIF -->
 
 		<!-- IF S_POST_UNAPPROVED -->
@@ -102,11 +102,11 @@
 
 		<!-- IF S_MESSAGE_REPORTED -->
 			<p class="post-notice reported">
-				{REPORTED_IMG} <a href="{U_MCP_REPORT}"><strong>{L_MESSAGE_REPORTED}</strong></a>
+				<i class="icon fa-exclamation fa-fw icon-red" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_REPORTED}</span> <a href="{U_MCP_REPORT}"><strong>{L_MESSAGE_REPORTED}</strong></a>
 			</p>
 		<!-- ENDIF -->
 
-		<div class="content" id="post_details">
+		<div id="post_details" class="content post_details">
 			{POST_PREVIEW}
 		</div>
 
--- a/styles/prosilver/template/mcp_queue.html
+++ b/styles/prosilver/template/mcp_queue.html
@@ -16,12 +16,12 @@
 	<p>{L_EXPLAIN}</p>
 
 	<!-- IF .postrow -->
-		<div class="action-bar top">
+		<div class="action-bar bar-top">
 			<div class="pagination">
 				{TOTAL}
-				<!-- IF .pagination --> 
+				<!-- IF .pagination -->
 					<!-- INCLUDE pagination.html -->
-				<!-- ELSE --> 
+				<!-- ELSE -->
 					 &bull; {PAGE_NUMBER}
 				<!-- ENDIF -->
 			</div>
@@ -48,7 +48,7 @@
 			<dl>
 				<dt>
 					<div class="list-inner">
-						<a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.POST_SUBJECT}</a> {postrow.ATTACH_ICON_IMG}<br />
+						<a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.POST_SUBJECT}</a><!-- IF postrow.S_HAS_ATTACHMENTS --> <i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <!-- ENDIF --><br />
 						<span>{L_POSTED} {L_POST_BY_AUTHOR} {postrow.POST_AUTHOR_FULL} &raquo; {postrow.POST_TIME}</span>
 					</div>
 				</dt>
@@ -73,21 +73,15 @@
 		<!-- END postrow -->
 		</ul>
 
-		<fieldset class="display-options">
-			<label>{L_DISPLAY_POSTS}{L_COLON} {S_SELECT_SORT_DAYS}</label>
-			<label>{L_SORT_BY} {S_SELECT_SORT_KEY}</label><label>{S_SELECT_SORT_DIR}</label>
-			<!-- IF TOPIC_ID --><label><input type="checkbox" class="radio" name="t" value="{TOPIC_ID}" checked="checked" />&nbsp; <strong>{L_ONLY_TOPIC}</strong></label><!-- ENDIF -->
-			<input type="submit" name="sort" value="{L_GO}" class="button2" />
-		</fieldset>
-
-		<hr />
-
 		<div class="action-bar bottom">
+			<!-- INCLUDE display_options.html -->
+			<!-- IF TOPIC_ID --><label><input type="checkbox" class="radio" name="t" value="{TOPIC_ID}" checked="checked" onClick="document.getElementById('mcp').submit()" /> <strong>{L_ONLY_TOPIC}</strong></label><!-- ENDIF -->
+
 			<div class="pagination">
 				{TOTAL}
-				<!-- IF .pagination --> 
+				<!-- IF .pagination -->
 					<!-- INCLUDE pagination.html -->
-				<!-- ELSE --> 
+				<!-- ELSE -->
 					 &bull; {PAGE_NUMBER}
 				<!-- ENDIF -->
 			</div>
--- a/styles/prosilver/template/mcp_reports.html
+++ b/styles/prosilver/template/mcp_reports.html
@@ -18,12 +18,12 @@
 	<p>{L_EXPLAIN}</p>
 
 	<!-- IF .postrow -->
-		<div class="action-bar top">
+		<div class="action-bar bar-top">
 			<div class="pagination">
 				{TOTAL_REPORTS}
-				<!-- IF .pagination --> 
+				<!-- IF .pagination -->
 					<!-- INCLUDE pagination.html -->
-				<!-- ELSE --> 
+				<!-- ELSE -->
 					 &bull; {PAGE_NUMBER}
 				<!-- ENDIF -->
 			</div>
@@ -46,7 +46,7 @@
 					<!-- IF S_PM -->
 					<dt>
 						<div class="list-inner">
-							<a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.PM_SUBJECT}</a> {postrow.ATTACH_ICON_IMG}<br />
+							<a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.PM_SUBJECT}</a> <i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <br />
 							<span>{L_MESSAGE_BY_AUTHOR} {postrow.PM_AUTHOR_FULL} &raquo; {postrow.PM_TIME}</span><br />
 							<span>{L_MESSAGE_TO} {postrow.RECIPIENTS}</span>
 							<div class="responsive-show" style="display: none;">
@@ -60,7 +60,7 @@
 					<!-- ELSE -->
 					<dt>
 						<div class="list-inner">
-							<a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.POST_SUBJECT}</a> {postrow.ATTACH_ICON_IMG}<br />
+							<a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.POST_SUBJECT}</a><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <br />
 							<span>{L_POSTED} {L_POST_BY_AUTHOR} {postrow.POST_AUTHOR_FULL} &raquo; {postrow.POST_TIME}</span>
 							<div class="responsive-show" style="display: none;">
 								{L_REPORTER}{L_COLON} {postrow.REPORTER_FULL} &laquo; {postrow.REPORT_TIME}<br />
@@ -79,21 +79,15 @@
 		<!-- END postrow -->
 		</ul>
 
-		<fieldset class="display-options">
-			<label>{L_DISPLAY_POSTS}{L_COLON} {S_SELECT_SORT_DAYS}</label>
-			<label>{L_SORT_BY} {S_SELECT_SORT_KEY}</label><label>{S_SELECT_SORT_DIR}</label>
-			<!-- IF TOPIC_ID --><label><input type="checkbox" class="radio" name="t" value="{TOPIC_ID}" checked="checked" />&nbsp; <strong>{L_ONLY_TOPIC}</strong></label><!-- ENDIF -->
-			<input type="submit" name="sort" value="{L_GO}" class="button2" />
-		</fieldset>
-
-		<hr />
-
 		<div class="action-bar bottom">
+			<!-- INCLUDE display_options.html -->
+			<!-- IF TOPIC_ID --><label><input type="checkbox" class="radio" name="t" value="{TOPIC_ID}" checked="checked" onClick="document.getElementById('mcp').submit()" /> <strong>{L_ONLY_TOPIC}</strong></label><!-- ENDIF -->
+
 			<div class="pagination">
 				{TOTAL_REPORTS}
-				<!-- IF .pagination --> 
+				<!-- IF .pagination -->
 					<!-- INCLUDE pagination.html -->
-				<!-- ELSE --> 
+				<!-- ELSE -->
 					 &bull; {PAGE_NUMBER}
 				<!-- ENDIF -->
 			</div>
--- a/styles/prosilver/template/mcp_topic.html
+++ b/styles/prosilver/template/mcp_topic.html
@@ -11,7 +11,7 @@
 	<!-- DEFINE $SHOW_PANEL = 'display-panel' -->
 <!-- ENDIF -->
 
-<div id="minitabs" class="sub-panels" data-show-panel="{$SHOW_PANEL}" role="tablist">
+<div id="minitabs" class="minitabs sub-panels" data-show-panel="{$SHOW_PANEL}" role="tablist">
 	<ul>
 		<li id="display-panel-tab" class="tab<!-- IF not S_MERGE_VIEW --> activetab<!-- ENDIF -->">
 			<a href="#minitabs" data-subpanel="display-panel" role="tab" aria-controls="display-panel">{L_DISPLAY_OPTIONS}</a>
@@ -87,12 +87,12 @@
 <div class="panel">
 	<div class="inner">
 
-	<h3 id="review">
+	<h3 id="review" class="review">
 		<span class="right-box"><a href="#review" onclick="viewableArea(getElementById('topicreview'), true); var rev_text = getElementById('review').getElementsByTagName('a').item(0).firstChild; if (rev_text.data == '{LA_EXPAND_VIEW}'){rev_text.data = '{LA_COLLAPSE_VIEW}'; } else if (rev_text.data == '{LA_COLLAPSE_VIEW}'){rev_text.data = '{LA_EXPAND_VIEW}'};">{L_EXPAND_VIEW}</a></span>
 		{L_TOPIC_REVIEW}{L_COLON} <!-- EVENT mcp_topic_topic_title_before -->{TOPIC_TITLE}<!-- EVENT mcp_topic_topic_title_after -->
 	</h3>
 
-	<div id="topicreview">
+	<div id="topicreview" class="topicreview">
 		<!-- BEGIN postrow -->
 		<div class="post <!-- IF postrow.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
 			<div class="inner">
@@ -100,8 +100,8 @@
 			<div class="postbody" id="pr{postrow.POST_ID}">
 				<ul class="post-buttons">
 					<li>
-						<a href="{postrow.U_POST_DETAILS}" title="{L_POST_DETAILS}" class="button icon-button info-icon">
-							<span>{L_POST_DETAILS}</span>
+						<a href="{postrow.U_POST_DETAILS}" title="{L_POST_DETAILS}" class="button button-icon-only">
+							<i class="icon fa-info fa-fw" aria-hidden="true"></i><span class="sr-only">{L_POST_DETAILS}</span>
 						</a>
 					</li>
 					<li>
@@ -114,12 +114,16 @@
 				<h3><a href="{postrow.U_POST_DETAILS}">{postrow.POST_SUBJECT}</a></h3>
 
 				<!-- EVENT mcp_topic_postrow_post_details_before -->
-				<p class="author"><a href="#pr{postrow.POST_ID}">{postrow.MINI_POST_IMG}</a> {L_POSTED} {postrow.POST_DATE} {L_POST_BY_AUTHOR} <strong>{postrow.POST_AUTHOR_FULL}</strong><!-- IF postrow.U_MCP_DETAILS --> [ <a href="{postrow.U_MCP_DETAILS}">{L_POST_DETAILS}</a> ]<!-- ENDIF --></p>
+				<p class="author">
+					<a href="#pr{postrow.POST_ID}" title="{postrow.MINI_POST}">
+						<i class="icon fa-file fa-fw icon-lightgray icon-tiny" aria-hidden="true"></i><span class="sr-only">{postrow.MINI_POST}</span>
+					</a> {L_POSTED} {postrow.POST_DATE} {L_POST_BY_AUTHOR} <strong>{postrow.POST_AUTHOR_FULL}</strong><!-- IF postrow.U_MCP_DETAILS --> [ <a href="{postrow.U_MCP_DETAILS}">{L_POST_DETAILS}</a> ]<!-- ENDIF -->
+				</p>
 				<!-- EVENT mcp_topic_postrow_post_details_after -->
 
 				<!-- IF postrow.S_POST_UNAPPROVED -->
 				<p class="post-notice unapproved">
-					<a href="{postrow.U_MCP_APPROVE}"><strong>{L_POST_UNAPPROVED}</strong></a>
+					<a href="{postrow.U_MCP_APPROVE}"><i class="icon fa-exclamation fa-fw icon-red" aria-hidden="true"></i><strong>{L_POST_UNAPPROVED}</strong></a>
 				</p>
 				<!-- ENDIF -->
 
@@ -131,7 +135,7 @@
 
 				<!-- IF postrow.S_POST_REPORTED -->
 				<p class="post-notice reported">
-					<a href="{postrow.U_MCP_REPORT}"><strong>{L_POST_REPORTED}</strong></a>
+					<a href="{postrow.U_MCP_REPORT}"><i class="icon fa-exclamation fa-fw icon-red" aria-hidden="true"></i><strong>{L_POST_REPORTED}</strong></a>
 				</p>
 				<!-- ENDIF -->
 
@@ -155,7 +159,7 @@
 
 	<hr />
 
-	<div class="action-bar bottom">
+	<div class="action-bar bar-bottom">
 		<div class="pagination">
 			{TOTAL_POSTS}
 			<!-- IF .pagination -->
--- a/styles/prosilver/template/mcp_warn_front.html
+++ b/styles/prosilver/template/mcp_warn_front.html
@@ -21,7 +21,7 @@
 </div>
 
 <fieldset class="submit-buttons">
-	<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp; 
+	<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp;
 	<input type="submit" name="submituser" value="{L_SUBMIT}" class="button1" />
 	{S_FORM_TOKEN}
 </fieldset>
--- a/styles/prosilver/template/mcp_warn_list.html
+++ b/styles/prosilver/template/mcp_warn_list.html
@@ -10,12 +10,12 @@
 	<p>{L_WARNED_USERS_EXPLAIN}</p>
 
 	<!-- IF .user -->
-		<div class="action-bar top">
+		<div class="action-bar bar-top">
 			<div class="pagination">
 				{TOTAL_USERS}
-				<!-- IF .pagination --> 
+				<!-- IF .pagination -->
 					<!-- INCLUDE pagination.html -->
-				<!-- ELSE --> 
+				<!-- ELSE -->
 					 &bull; {PAGE_NUMBER}
 				<!-- ENDIF -->
 			</div>
@@ -43,20 +43,14 @@
 		</tbody>
 		</table>
 
-		<fieldset class="display-options">
-			<label>{L_DISPLAY_POSTS}{L_COLON} {S_SELECT_SORT_DAYS}</label>
-			<label>{L_SORT_BY} {S_SELECT_SORT_KEY}</label><label>{S_SELECT_SORT_DIR}</label>
-			<input type="submit" name="sort" value="{L_GO}" class="button2" />
-		</fieldset>
-
-		<hr />
-
 		<div class="action-bar bottom">
+			<!-- INCLUDE display_options.html -->
+
 			<div class="pagination">
 				{TOTAL_USERS}
-				<!-- IF .pagination --> 
+				<!-- IF .pagination -->
 					<!-- INCLUDE pagination.html -->
-				<!-- ELSE --> 
+				<!-- ELSE -->
 					 &bull; {PAGE_NUMBER}
 				<!-- ENDIF -->
 			</div>
--- a/styles/prosilver/template/mcp_warn_post.html
+++ b/styles/prosilver/template/mcp_warn_post.html
@@ -69,7 +69,7 @@
 <!-- EVENT mcp_warn_post_add_warning_field_after -->
 
 <fieldset class="submit-buttons">
-	<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp; 
+	<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp;
 	<input type="submit" name="action[add_warning]" value="{L_SUBMIT}" class="button1" />
 	{S_FORM_TOKEN}
 </fieldset>
--- a/styles/prosilver/template/mcp_warn_user.html
+++ b/styles/prosilver/template/mcp_warn_user.html
@@ -53,7 +53,7 @@
 <!-- EVENT mcp_warn_user_add_warning_field_after -->
 
 <fieldset class="submit-buttons">
-	<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp; 
+	<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp;
 	<input type="submit" name="action[add_warning]" value="{L_SUBMIT}" class="button1" />
 	{S_FORM_TOKEN}
 </fieldset>
--- a/styles/prosilver/template/mcp_whois.html
+++ b/styles/prosilver/template/mcp_whois.html
@@ -3,13 +3,19 @@
 
 <div class="panel">
 	<div class="inner">
-	
-		<p><a class="arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_RETURN_POST}">{L_RETURN_POST}</a></p>
+		<p>
+			<a href="{U_RETURN_POST}" class="arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
+				<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_RETURN_POST}</span>
+			</a>
+		</p>
 		<div class="postbody"><div class="content">
 			<pre>{WHOIS}</pre>
 		</div></div>
-		<p><a class="arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_RETURN_POST}">{L_RETURN_POST}</a></p>
-	
+		<p>
+			<a href="{U_RETURN_POST}" class="arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
+				<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_RETURN_POST}</span>
+			</a>
+		</p>
 	</div>
 </div>
 
--- a/styles/prosilver/template/memberlist_body.html
+++ b/styles/prosilver/template/memberlist_body.html
@@ -27,21 +27,21 @@
 	<!-- ELSE -->
 		<h2 class="solo">{PAGE_TITLE}<!-- IF SEARCH_WORDS -->{L_COLON} <a href="{U_SEARCH_WORDS}">{SEARCH_WORDS}</a><!-- ENDIF --></h2>
 
-		<div class="action-bar top">
+		<div class="action-bar bar-top">
 			<div class="member-search panel">
-				<!-- IF U_FIND_MEMBER and not S_SEARCH_USER --><a href="{U_FIND_MEMBER}" id="member_search" data-alt-text="{LA_HIDE_MEMBER_SEARCH}">{L_FIND_USERNAME}</a> &bull; <!-- ELSEIF S_SEARCH_USER and U_HIDE_FIND_MEMBER and not S_IN_SEARCH_POPUP --><a href="{U_HIDE_FIND_MEMBER}" id="member_search" data-alt-text="{LA_FIND_USERNAME}">{L_HIDE_MEMBER_SEARCH}</a> &bull; <!-- ENDIF -->
+				<!-- IF U_FIND_MEMBER and not S_SEARCH_USER --><a href="{U_FIND_MEMBER}" id="member_search" data-alt-text="{L_HIDE_MEMBER_SEARCH}">{L_FIND_USERNAME}</a> &bull; <!-- ELSEIF S_SEARCH_USER and U_HIDE_FIND_MEMBER and not S_IN_SEARCH_POPUP --><a href="{U_HIDE_FIND_MEMBER}" id="member_search" data-alt-text="{L_FIND_USERNAME}">{L_HIDE_MEMBER_SEARCH}</a> &bull; <!-- ENDIF -->
 				<strong>
 				<!-- BEGIN first_char -->
 					<a href="{first_char.U_SORT}">{first_char.DESC}</a>&nbsp;
 				<!-- END first_char -->
 				</strong>
 			</div>
-		
+
 			<div class="pagination">
 				{TOTAL_USERS}
-				<!-- IF .pagination --> 
+				<!-- IF .pagination -->
 					<!-- INCLUDE pagination.html -->
-				<!-- ELSE --> 
+				<!-- ELSE -->
 					 &bull; {PAGE_NUMBER}
 				<!-- ENDIF -->
 			</div>
@@ -52,7 +52,7 @@
 	<div class="forumbg forumbg-table">
 		<div class="inner">
 
-		<table class="table1" id="memberlist">
+		<table class="table1 memberlist" id="memberlist">
 		<thead>
 		<tr>
 			<th class="name" data-dfn="{L_RANK}{L_COMMA_SEPARATOR}<!-- IF S_SHOW_GROUP and .memberrow -->{L_GROUP_LEADER}<!-- ELSE -->{L_USERNAME}<!-- ENDIF -->"><span class="rank-img"><a href="{U_SORT_RANK}">{L_RANK}</a></span><a href="{U_SORT_USERNAME}"><!-- IF S_SHOW_GROUP and .memberrow -->{L_GROUP_LEADER}<!-- ELSE -->{L_USERNAME}<!-- ENDIF --></a></th>
@@ -145,12 +145,12 @@
 
 </form>
 
-<div class="action-bar bottom">
+<div class="action-bar bar-bottom">
 	<div class="pagination">
 		{TOTAL_USERS}
-		<!-- IF .pagination --> 
+		<!-- IF .pagination -->
 			<!-- INCLUDE pagination.html -->
-		<!-- ELSE --> 
+		<!-- ELSE -->
 			 &bull; {PAGE_NUMBER}
 		<!-- ENDIF -->
 	</div>
--- a/styles/prosilver/template/memberlist_team.html
+++ b/styles/prosilver/template/memberlist_team.html
@@ -19,7 +19,7 @@
 	<tbody>
 <!-- BEGIN user -->
 	<tr class="<!-- IF group.user.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF --><!-- IF group.user.S_INACTIVE --> inactive<!-- ENDIF -->">
-		<td><!-- IF group.user.RANK_IMG --><span class="rank-img">{group.user.RANK_IMG}</span><!-- ELSE --><span class="rank-img">{group.user.RANK_TITLE}</span><!-- ENDIF -->{group.user.USERNAME_FULL}<!-- IF group.user.S_INACTIVE --> ({L_INACTIVE})<!-- ENDIF --></td>
+		<td><!-- IF group.user.RANK_IMG --><span class="rank-img">{group.user.RANK_IMG}</span><!-- ELSE --><span class="rank-img">{group.user.RANK_TITLE}</span><!-- ENDIF --><!-- EVENT memberlist_team_username_prepend -->{group.user.USERNAME_FULL}<!-- IF group.user.S_INACTIVE --> ({L_INACTIVE})<!-- ENDIF --><!-- EVENT memberlist_team_username_append --></td>
 		<td class="info"><!-- IF group.user.U_GROUP -->
 			<a<!-- IF group.user.GROUP_COLOR --> style="font-weight: bold; color: #{group.user.GROUP_COLOR}"<!-- ENDIF --> href="{group.user.U_GROUP}">{group.user.GROUP_NAME}</a>
 			<!-- ELSE -->
@@ -36,7 +36,7 @@
 <!-- END user -->
 	</tbody>
 	</table>
-	
+
 	</div>
 </div>
 <!-- END group -->
--- a/styles/prosilver/template/message_body.html
+++ b/styles/prosilver/template/message_body.html
@@ -8,7 +8,13 @@
 	<div class="inner">
 	<h2 class="message-title">{MESSAGE_TITLE}</h2>
 	<p>{MESSAGE_TEXT}</p>
-	<!-- IF SCRIPT_NAME == "search" and not S_BOARD_DISABLED and not S_NO_SEARCH and L_RETURN_TO_SEARCH_ADV --><p><a href="{U_SEARCH}" class="arrow-{S_CONTENT_FLOW_BEGIN}">{L_GO_TO_SEARCH_ADV}</a></p><!-- ENDIF -->
+	<!-- IF SCRIPT_NAME == "search" and not S_BOARD_DISABLED and not S_NO_SEARCH and L_RETURN_TO_SEARCH_ADV -->
+		<p>
+			<a href="{U_SEARCH}" class="arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
+				<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_GO_TO_SEARCH_ADV}</span>
+			</a>
+		</p>
+	<!-- ENDIF -->
 	</div>
 </div>
 
--- a/styles/prosilver/template/navbar_footer.html
+++ b/styles/prosilver/template/navbar_footer.html
@@ -1,26 +1,68 @@
 <div class="navbar" role="navigation">
 	<div class="inner">
 
-	<ul id="nav-footer" class="linklist bulletin" role="menubar">
-		<li class="small-icon icon-home breadcrumbs">
-			<!-- IF U_SITE_HOME --><span class="crumb"><a href="{U_SITE_HOME}" data-navbar-reference="home">{L_SITE_HOME}</a></span><!-- ENDIF -->
+	<ul id="nav-footer" class="nav-footer linklist" role="menubar">
+		<li class="breadcrumbs">
+			<!-- IF U_SITE_HOME -->
+				{% spaceless %}
+				<span class="crumb">
+					<a href="{U_SITE_HOME}" data-navbar-reference="home">
+						<i class="icon fa-home fa-fw" aria-hidden="true"></i><span>{L_SITE_HOME}</span>
+					</a>
+				</span>
+				{% endspaceless %}
+			<!-- ENDIF -->
 			<!-- EVENT overall_footer_breadcrumb_prepend -->
-			<span class="crumb"><a href="{U_INDEX}" data-navbar-reference="index">{L_INDEX}</a></span>
+			{% spaceless %}
+			<span class="crumb">
+				<a href="{U_INDEX}" data-navbar-reference="index">
+					<!-- IF not U_SITE_HOME --><i class="icon fa-home fa-fw" aria-hidden="true"></i><!-- ENDIF --><span>{L_INDEX}</span>
+				</a>
+			</span>
+			{% endspaceless %}
 			<!-- EVENT overall_footer_breadcrumb_append -->
 		</li>
-		<!-- IF U_WATCH_FORUM_LINK and not S_IS_BOT --><li class="small-icon icon-<!-- IF S_WATCHING_FORUM -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->" data-last-responsive="true"><a href="{U_WATCH_FORUM_LINK}" title="{S_WATCH_FORUM_TITLE}" data-ajax="toggle_link" data-toggle-class="small-icon icon-<!-- IF not S_WATCHING_FORUM -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->" data-toggle-text="{S_WATCH_FORUM_TOGGLE}" data-toggle-url="{U_WATCH_FORUM_TOGGLE}">{S_WATCH_FORUM_TITLE}</a></li><!-- ENDIF -->
+		<!-- IF U_WATCH_FORUM_LINK and not S_IS_BOT -->
+			<li data-last-responsive="true">
+				<a href="{U_WATCH_FORUM_LINK}" title="{S_WATCH_FORUM_TITLE}" data-ajax="toggle_link" data-toggle-class="icon <!-- IF S_WATCHING_FORUM -->fa-check-square-o<!-- ELSE -->fa-square-o<!-- ENDIF --> fa-fw" data-toggle-text="{S_WATCH_FORUM_TOGGLE}" data-toggle-url="{U_WATCH_FORUM_TOGGLE}">
+					<i class="icon <!-- IF S_WATCHING_FORUM -->fa-square-o<!-- ELSE -->fa-check-square-o<!-- ENDIF --> fa-fw" aria-hidden="true"></i><span>{S_WATCH_FORUM_TITLE}</span>
+				</a>
+			</li>
+		<!-- ENDIF -->
 
 		<!-- EVENT overall_footer_timezone_before -->
 		<li class="rightside">{S_TIMEZONE}</li>
 		<!-- EVENT overall_footer_timezone_after -->
 		<!-- IF not S_IS_BOT -->
-			<li class="small-icon icon-delete-cookies rightside"><a href="{U_DELETE_COOKIES}" data-ajax="true" data-refresh="true" role="menuitem">{L_DELETE_COOKIES}</a></li>
-			<!-- IF S_DISPLAY_MEMBERLIST --><li class="small-icon icon-members rightside" data-last-responsive="true"><a href="{U_MEMBERLIST}" title="{L_MEMBERLIST_EXPLAIN}" role="menuitem">{L_MEMBERLIST}</a></li><!-- ENDIF -->
+			<li class="rightside">
+				<a href="{U_DELETE_COOKIES}" data-ajax="true" data-refresh="true" role="menuitem">
+					<i class="icon fa-trash fa-fw" aria-hidden="true"></i><span>{L_DELETE_COOKIES}</span>
+				</a>
+			</li>
+			<!-- IF S_DISPLAY_MEMBERLIST -->
+				<li class="rightside" data-last-responsive="true">
+					<a href="{U_MEMBERLIST}" title="{L_MEMBERLIST_EXPLAIN}" role="menuitem">
+						<i class="icon fa-group fa-fw" aria-hidden="true"></i><span>{L_MEMBERLIST}</span>
+					</a>
+				</li>
+			<!-- ENDIF -->
 		<!-- ENDIF -->
 		<!-- EVENT overall_footer_teamlink_before -->
-		<!-- IF U_TEAM --><li class="small-icon icon-team rightside" data-last-responsive="true"><a href="{U_TEAM}" role="menuitem">{L_THE_TEAM}</a></li><!-- ENDIF -->
+		<!-- IF U_TEAM -->
+			<li class="rightside" data-last-responsive="true">
+				<a href="{U_TEAM}" role="menuitem">
+					<i class="icon fa-shield fa-fw" aria-hidden="true"></i><span>{L_THE_TEAM}</span>
+				</a>
+			</li>
+		<!-- ENDIF -->
 		<!-- EVENT overall_footer_teamlink_after -->
-		<!-- IF U_CONTACT_US --><li class="small-icon icon-contact rightside" data-last-responsive="true"><a href="{U_CONTACT_US}" role="menuitem">{L_CONTACT_US}</a></li><!-- ENDIF -->
+		<!-- IF U_CONTACT_US -->
+			<li class="rightside" data-last-responsive="true">
+				<a href="{U_CONTACT_US}" role="menuitem">
+					<i class="icon fa-envelope fa-fw" aria-hidden="true"></i><span>{L_CONTACT_US}</span>
+				</a>
+			</li>
+		<!-- ENDIF -->
 	</ul>
 
 	</div>
--- a/styles/prosilver/template/navbar_header.html
+++ b/styles/prosilver/template/navbar_header.html
@@ -1,11 +1,13 @@
 <div class="navbar" role="navigation">
 	<div class="inner">
 
-	<ul id="nav-main" class="linklist bulletin" role="menubar">
+	<ul id="nav-main" class="nav-main linklist" role="menubar">
 
-		<li id="quick-links" class="small-icon responsive-menu dropdown-container<!-- IF not S_DISPLAY_QUICK_LINKS and not S_DISPLAY_SEARCH --> hidden<!-- ENDIF -->" data-skip-responsive="true">
-			<a href="#" class="responsive-menu-link dropdown-trigger">{L_QUICK_LINKS}</a>
-			<div class="dropdown hidden">
+		<li id="quick-links" class="quick-links dropdown-container responsive-menu<!-- IF not S_DISPLAY_QUICK_LINKS and not S_DISPLAY_SEARCH --> hidden<!-- ENDIF -->" data-skip-responsive="true">
+			<a href="#" class="dropdown-trigger">
+				<i class="icon fa-bars fa-fw" aria-hidden="true"></i><span>{L_QUICK_LINKS}</span>
+			</a>
+			<div class="dropdown">
 				<div class="pointer"><div class="pointer-inner"></div></div>
 				<ul class="dropdown-contents" role="menu">
 					<!-- EVENT navbar_header_quick_links_before -->
@@ -13,24 +15,60 @@
 					<!-- IF S_DISPLAY_SEARCH -->
 						<li class="separator"></li>
 						<!-- IF S_REGISTERED_USER -->
-							<li class="small-icon icon-search-self"><a href="{U_SEARCH_SELF}" role="menuitem">{L_SEARCH_SELF}</a></li>
+							<li>
+								<a href="{U_SEARCH_SELF}" role="menuitem">
+									<i class="icon fa-file-o fa-fw icon-gray" aria-hidden="true"></i><span>{L_SEARCH_SELF}</span>
+								</a>
+							</li>
 						<!-- ENDIF -->
 						<!-- IF S_USER_LOGGED_IN -->
-							<li class="small-icon icon-search-new"><a href="{U_SEARCH_NEW}" role="menuitem">{L_SEARCH_NEW}</a></li>
+							<li>
+								<a href="{U_SEARCH_NEW}" role="menuitem">
+									<i class="icon fa-file-o fa-fw icon-red" aria-hidden="true"></i><span>{L_SEARCH_NEW}</span>
+								</a>
+							</li>
 						<!-- ENDIF -->
-						<!-- IF S_LOAD_UNREADS --> 
-							<li class="small-icon icon-search-unread"><a href="{U_SEARCH_UNREAD}" role="menuitem">{L_SEARCH_UNREAD}</a></li>
+						<!-- IF S_LOAD_UNREADS -->
+							<li>
+								<a href="{U_SEARCH_UNREAD}" role="menuitem">
+									<i class="icon fa-file-o fa-fw icon-red" aria-hidden="true"></i><span>{L_SEARCH_UNREAD}</span>
+								</a>
+							</li>
 						<!-- ENDIF -->
-						<li class="small-icon icon-search-unanswered"><a href="{U_SEARCH_UNANSWERED}" role="menuitem">{L_SEARCH_UNANSWERED}</a></li>
-						<li class="small-icon icon-search-active"><a href="{U_SEARCH_ACTIVE_TOPICS}" role="menuitem">{L_SEARCH_ACTIVE_TOPICS}</a></li>
-						<li class="separator"></li>
-						<li class="small-icon icon-search"><a href="{U_SEARCH}" role="menuitem">{L_SEARCH}</a></li>
+							<li>
+								<a href="{U_SEARCH_UNANSWERED}" role="menuitem">
+									<i class="icon fa-file-o fa-fw icon-gray" aria-hidden="true"></i><span>{L_SEARCH_UNANSWERED}</span>
+								</a>
+							</li>
+							<li>
+								<a href="{U_SEARCH_ACTIVE_TOPICS}" role="menuitem">
+									<i class="icon fa-file-o fa-fw icon-blue" aria-hidden="true"></i><span>{L_SEARCH_ACTIVE_TOPICS}</span>
+								</a>
+							</li>
+							<li class="separator"></li>
+							<li>
+								<a href="{U_SEARCH}" role="menuitem">
+									<i class="icon fa-search fa-fw" aria-hidden="true"></i><span>{L_SEARCH}</span>
+								</a>
+							</li>
 					<!-- ENDIF -->
 
 					<!-- IF not S_IS_BOT and (S_DISPLAY_MEMBERLIST or U_TEAM) -->
 						<li class="separator"></li>
-						<!-- IF S_DISPLAY_MEMBERLIST --><li class="small-icon icon-members"><a href="{U_MEMBERLIST}" role="menuitem">{L_MEMBERLIST}</a></li><!-- ENDIF -->
-						<!-- IF U_TEAM --><li class="small-icon icon-team"><a href="{U_TEAM}" role="menuitem">{L_THE_TEAM}</a></li><!-- ENDIF -->
+						<!-- IF S_DISPLAY_MEMBERLIST -->
+							<li>
+								<a href="{U_MEMBERLIST}" role="menuitem">
+									<i class="icon fa-group fa-fw" aria-hidden="true"></i><span>{L_MEMBERLIST}</span>
+								</a>
+							</li>
+						<!-- ENDIF -->
+						<!-- IF U_TEAM -->
+							<li>
+								<a href="{U_TEAM}" role="menuitem">
+									<i class="icon fa-shield fa-fw" aria-hidden="true"></i><span>{L_THE_TEAM}</span>
+								</a>
+							</li>
+						<!-- ENDIF -->
 					<!-- ENDIF -->
 					<li class="separator"></li>
 
@@ -40,67 +78,116 @@
 		</li>
 
 		<!-- EVENT overall_header_navigation_prepend -->
-		<li class="small-icon icon-faq" <!-- IF not S_USER_LOGGED_IN -->data-skip-responsive="true"<!-- ELSE -->data-last-responsive="true"<!-- ENDIF -->><a href="{U_FAQ}" rel="help" title="{L_FAQ_EXPLAIN}" role="menuitem">{L_FAQ}</a></li>
+		<li <!-- IF not S_USER_LOGGED_IN -->data-skip-responsive="true"<!-- ELSE -->data-last-responsive="true"<!-- ENDIF -->>
+			<a href="{U_FAQ}" rel="help" title="{L_FAQ_EXPLAIN}" role="menuitem">
+				<i class="icon fa-question-circle fa-fw" aria-hidden="true"></i><span>{L_FAQ}</span>
+			</a>
+		</li>
 		<!-- EVENT overall_header_navigation_append -->
-		<!-- IF U_ACP --><li class="small-icon icon-acp" data-last-responsive="true"><a href="{U_ACP}" title="{L_ACP}" role="menuitem">{L_ACP_SHORT}</a></li><!-- ENDIF -->
-		<!-- IF U_MCP --><li class="small-icon icon-mcp" data-last-responsive="true"><a href="{U_MCP}" title="{L_MCP}" role="menuitem">{L_MCP_SHORT}</a></li><!-- ENDIF -->
+		<!-- IF U_ACP -->
+			<li data-last-responsive="true">
+				<a href="{U_ACP}" title="{L_ACP}" role="menuitem">
+					<i class="icon fa-cogs fa-fw" aria-hidden="true"></i><span>{L_ACP_SHORT}</span>
+				</a>
+			</li>
+		<!-- ENDIF -->
+		<!-- IF U_MCP -->
+			<li data-last-responsive="true">
+				<a href="{U_MCP}" title="{L_MCP}" role="menuitem">
+					<i class="icon fa-gavel fa-fw" aria-hidden="true"></i><span>{L_MCP_SHORT}</span>
+				</a>
+			</li>
+		<!-- ENDIF -->
 
 	<!-- IF S_REGISTERED_USER -->
 		<!-- EVENT navbar_header_user_profile_prepend -->
 		<li id="username_logged_in" class="rightside <!-- IF CURRENT_USER_AVATAR --> no-bulletin<!-- ENDIF -->" data-skip-responsive="true">
 			<!-- EVENT navbar_header_username_prepend -->
 			<div class="header-profile dropdown-container">
-				<a href="{U_PROFILE}" class="header-avatar dropdown-trigger"><!-- IF CURRENT_USER_AVATAR -->{CURRENT_USER_AVATAR} <!-- ENDIF -->{CURRENT_USERNAME_SIMPLE}</a>
-				<div class="dropdown hidden">
+				<a href="{U_PROFILE}" class="header-avatar dropdown-trigger"><!-- IF CURRENT_USER_AVATAR -->{CURRENT_USER_AVATAR} <!-- ENDIF --> {CURRENT_USERNAME_SIMPLE}</a>
+				<div class="dropdown">
 					<div class="pointer"><div class="pointer-inner"></div></div>
 					<ul class="dropdown-contents" role="menu">
-						<!-- IF U_RESTORE_PERMISSIONS --><li class="small-icon icon-restore-permissions"><a href="{U_RESTORE_PERMISSIONS}">{L_RESTORE_PERMISSIONS}</a></li><!-- ENDIF -->
-	
-						<!-- EVENT navbar_header_profile_list_before -->
-	
-						<li class="small-icon icon-ucp"><a href="{U_PROFILE}" title="{L_PROFILE}" role="menuitem">{L_PROFILE}</a></li>
-						<li class="small-icon icon-profile"><a href="{U_USER_PROFILE}" title="{L_READ_PROFILE}" role="menuitem">{L_READ_PROFILE}</a></li>
-	
+						<!-- IF U_RESTORE_PERMISSIONS -->
+							<li>
+								<a href="{U_RESTORE_PERMISSIONS}">
+									<i class="icon fa-refresh fa-fw" aria-hidden="true"></i><span>{L_RESTORE_PERMISSIONS}</span>
+								</a>
+							</li>
+						<!-- ENDIF -->
+
+					<!-- EVENT navbar_header_profile_list_before -->
+
+						<li>
+							<a href="{U_PROFILE}" title="{L_PROFILE}" role="menuitem">
+								<i class="icon fa-sliders fa-fw" aria-hidden="true"></i><span>{L_PROFILE}</span>
+							</a>
+						</li>
+						<li>
+							<a href="{U_USER_PROFILE}" title="{L_READ_PROFILE}" role="menuitem">
+								<i class="icon fa-user fa-fw" aria-hidden="true"></i><span>{L_READ_PROFILE}</span>
+							</a>
+						</li>
+
 						<!-- EVENT navbar_header_profile_list_after -->
-	
+
 						<li class="separator"></li>
-						<li class="small-icon icon-logout"><a href="{U_LOGIN_LOGOUT}" title="{L_LOGIN_LOGOUT}" accesskey="x" role="menuitem">{L_LOGIN_LOGOUT}</a></li>
+						<li>
+							<a href="{U_LOGIN_LOGOUT}" title="{L_LOGIN_LOGOUT}" accesskey="x" role="menuitem">
+								<i class="icon fa-power-off fa-fw" aria-hidden="true"></i><span>{L_LOGIN_LOGOUT}</span>
+							</a>
+						</li>
 					</ul>
 				</div>
 			</div>
 			<!-- EVENT navbar_header_username_append -->
 		</li>
 		<!-- IF S_DISPLAY_PM -->
-			<li class="small-icon icon-pm rightside" data-skip-responsive="true">
-				<a href="{U_PRIVATEMSGS}" role="menuitem"><span>{L_PRIVATE_MESSAGES} [</span><strong>{PRIVATE_MESSAGE_COUNT}</strong><span>]</span></a>
+			<li class="rightside" data-skip-responsive="true">
+				<a href="{U_PRIVATEMSGS}" role="menuitem">
+					<i class="icon fa-inbox fa-fw" aria-hidden="true"></i><span>{L_PRIVATE_MESSAGES} </span><strong class="badge<!-- IF not PRIVATE_MESSAGE_COUNT --> hidden<!-- ENDIF -->">{PRIVATE_MESSAGE_COUNT}</strong>
+				</a>
 			</li>
 		<!-- ENDIF -->
 		<!-- IF S_NOTIFICATIONS_DISPLAY -->
-			<li class="small-icon icon-notification dropdown-container dropdown-{S_CONTENT_FLOW_END} rightside" data-skip-responsive="true">
-				<a href="{U_VIEW_ALL_NOTIFICATIONS}" id="notification_list_button" class="dropdown-trigger"><span>{L_NOTIFICATIONS} [</span><strong>{NOTIFICATIONS_COUNT}</strong><span>]</span></a>
+			<li class="dropdown-container dropdown-{S_CONTENT_FLOW_END} rightside" data-skip-responsive="true">
+				<a href="{U_VIEW_ALL_NOTIFICATIONS}" id="notification_list_button" class="dropdown-trigger">
+					<i class="icon fa-bell fa-fw" aria-hidden="true"></i><span>{L_NOTIFICATIONS} </span><strong class="badge<!-- IF not NOTIFICATIONS_COUNT --> hidden<!-- ENDIF -->">{NOTIFICATIONS_COUNT}</strong>
+				</a>
 				<!-- INCLUDE notification_dropdown.html -->
 			</li>
 		<!-- ENDIF -->
 		<!-- EVENT navbar_header_user_profile_append -->
 	<!-- ELSE -->
-		<li class="small-icon icon-logout rightside"  data-skip-responsive="true"><a href="{U_LOGIN_LOGOUT}" title="{L_LOGIN_LOGOUT}" accesskey="x" role="menuitem">{L_LOGIN_LOGOUT}</a></li>
+		<li class="rightside"  data-skip-responsive="true">
+			<a href="{U_LOGIN_LOGOUT}" title="{L_LOGIN_LOGOUT}" accesskey="x" role="menuitem">
+				<i class="icon fa-power-off fa-fw" aria-hidden="true"></i><span>{L_LOGIN_LOGOUT}</span>
+			</a>
+		</li>
 		<!-- IF S_REGISTER_ENABLED and not (S_SHOW_COPPA or S_REGISTRATION) -->
-			<li class="small-icon icon-register rightside" data-skip-responsive="true"><a href="{U_REGISTER}" role="menuitem">{L_REGISTER}</a></li>
+			<li class="rightside" data-skip-responsive="true">
+				<a href="{U_REGISTER}" role="menuitem">
+					<i class="icon fa-pencil-square-o  fa-fw" aria-hidden="true"></i><span>{L_REGISTER}</span>
+				</a>
+			</li>
 		<!-- ENDIF -->
 		<!-- EVENT navbar_header_logged_out_content -->
 	<!-- ENDIF -->
 	</ul>
 
-	<ul id="nav-breadcrumbs" class="linklist navlinks" role="menubar">
+	<ul id="nav-breadcrumbs" class="nav-breadcrumbs linklist navlinks" role="menubar">
 		<!-- DEFINE $MICRODATA = ' itemtype="http://data-vocabulary.org/Breadcrumb" itemscope=""' -->
 		<!-- EVENT overall_header_breadcrumbs_before -->
-		<li class="small-icon icon-home breadcrumbs">
-			<!-- IF U_SITE_HOME --><span class="crumb"{$MICRODATA}><a href="{U_SITE_HOME}" data-navbar-reference="home" itemprop="url"><span itemprop="title">{L_SITE_HOME}</span></a></span><!-- ENDIF -->
+		<li class="breadcrumbs">
+			<!-- IF U_SITE_HOME -->
+				<span class="crumb" {$MICRODATA}><a href="{U_SITE_HOME}" itemprop="url" data-navbar-reference="home"><i class="icon fa-home fa-fw" aria-hidden="true"></i><span itemprop="title">{L_SITE_HOME}</span></a></span>
+			<!-- ENDIF -->
 			<!-- EVENT overall_header_breadcrumb_prepend -->
-			<span class="crumb"{$MICRODATA}><a href="{U_INDEX}" accesskey="h" data-navbar-reference="index" itemprop="url"><span itemprop="title">{L_INDEX}</span></a></span>
+				<span class="crumb" {$MICRODATA}><a href="{U_INDEX}" itemprop="url" accesskey="h" data-navbar-reference="index"><!-- IF not U_SITE_HOME --><i class="icon fa-home fa-fw"></i><!-- ENDIF --><span itemprop="title">{L_INDEX}</span></a></span>
+
 			<!-- BEGIN navlinks -->
 				<!-- EVENT overall_header_navlink_prepend -->
-				<span class="crumb"{$MICRODATA}<!-- IF navlinks.MICRODATA --> {navlinks.MICRODATA}<!-- ENDIF -->><a href="{navlinks.U_VIEW_FORUM}" itemprop="url"><span itemprop="title">{navlinks.FORUM_NAME}</span></a></span>
+				<span class="crumb" {$MICRODATA}<!-- IF navlinks.MICRODATA --> {navlinks.MICRODATA}<!-- ENDIF -->><a href="{navlinks.U_VIEW_FORUM}" itemprop="url"><span itemprop="title">{navlinks.FORUM_NAME}</span></a></span>
 				<!-- EVENT overall_header_navlink_append -->
 			<!-- END navlinks -->
 			<!-- EVENT overall_header_breadcrumb_append -->
@@ -108,7 +195,11 @@
 		<!-- EVENT overall_header_breadcrumbs_after -->
 
 		<!-- IF S_DISPLAY_SEARCH and not S_IN_SEARCH -->
-			<li class="rightside responsive-search" style="display: none;"><a href="{U_SEARCH}" title="{L_SEARCH_ADV_EXPLAIN}" role="menuitem">{L_SEARCH}</a></li>
+			<li class="rightside responsive-search">
+				<a href="{U_SEARCH}" title="{L_SEARCH_ADV_EXPLAIN}" role="menuitem">
+					<i class="icon fa-search fa-fw" aria-hidden="true"></i><span class="sr-only">{L_SEARCH}</span>
+				</a>
+			</li>
 		<!-- ENDIF -->
 	</ul>
 
--- a/styles/prosilver/template/notification_dropdown.html
+++ b/styles/prosilver/template/notification_dropdown.html
@@ -32,7 +32,9 @@
 						</div>
 					<!-- IF notifications.URL --></a><!-- ENDIF -->
 					<!-- IF notifications.UNREAD -->
-						<a href="{notifications.U_MARK_READ}" class="mark_read icon-mark" data-ajax="notification.mark_read" title="{L_MARK_READ}"></a>
+						<a href="{notifications.U_MARK_READ}" class="mark_read icon-mark" data-ajax="notification.mark_read" title="{L_MARK_READ}">
+							 <i class="icon fa-check-circle icon-xl fa-fw" aria-hidden="true"></i><span class="sr-only">{L_MARK_READ}</span>
+						</a>
 					<!-- ENDIF -->
 				</li>
 			<!-- END notifications -->
--- a/styles/prosilver/template/overall_footer.html
+++ b/styles/prosilver/template/overall_footer.html
@@ -3,7 +3,7 @@
 
 <!-- EVENT overall_footer_page_body_after -->
 
-<div id="page-footer" role="contentinfo">
+<div id="page-footer" class="page-footer" role="contentinfo">
 	<!-- INCLUDE navbar_footer.html -->
 
 	<div class="copyright">
@@ -15,16 +15,20 @@
 		<!-- IF U_ACP --><br /><strong><a href="{U_ACP}">{L_ACP}</a></strong><!-- ENDIF -->
 	</div>
 
-	<div id="darkenwrapper" data-ajax-error-title="{L_AJAX_ERROR_TITLE}" data-ajax-error-text="{L_AJAX_ERROR_TEXT}" data-ajax-error-text-abort="{L_AJAX_ERROR_TEXT_ABORT}" data-ajax-error-text-timeout="{L_AJAX_ERROR_TEXT_TIMEOUT}" data-ajax-error-text-parsererror="{L_AJAX_ERROR_TEXT_PARSERERROR}">
-		<div id="darken">&nbsp;</div>
+	<div id="darkenwrapper" class="darkenwrapper" data-ajax-error-title="{L_AJAX_ERROR_TITLE}" data-ajax-error-text="{L_AJAX_ERROR_TEXT}" data-ajax-error-text-abort="{L_AJAX_ERROR_TEXT_ABORT}" data-ajax-error-text-timeout="{L_AJAX_ERROR_TEXT_TIMEOUT}" data-ajax-error-text-parsererror="{L_AJAX_ERROR_TEXT_PARSERERROR}">
+		<div id="darken" class="darken">&nbsp;</div>
 	</div>
 
 	<div id="phpbb_alert" class="phpbb_alert" data-l-err="{L_ERROR}" data-l-timeout-processing-req="{L_TIMEOUT_PROCESSING_REQ}">
-		<a href="#" class="alert_close"></a>
+		<a href="#" class="alert_close">
+			<i class="icon fa-times-circle fa-fw" aria-hidden="true"></i>
+		</a>
 		<h3 class="alert_title">&nbsp;</h3><p class="alert_text"></p>
 	</div>
 	<div id="phpbb_confirm" class="phpbb_alert">
-		<a href="#" class="alert_close"></a>
+		<a href="#" class="alert_close">
+			<i class="icon fa-times-circle fa-fw" aria-hidden="true"></i>
+		</a>
 		<div class="alert_text"></div>
 	</div>
 </div>
@@ -41,6 +45,42 @@
 <script type="text/javascript" src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script>
 <!-- INCLUDEJS forum_fn.js -->
 <!-- INCLUDEJS ajax.js -->
+<!-- IF S_ALLOW_CDN -->
+	<script type="text/javascript">
+		(function($){
+			var $fa_cdn = $('head').find('link[rel="stylesheet"]').first(),
+				$span = $('<span class="fa" style="display:none"></span>').appendTo('body');
+			if ($span.css('fontFamily') !== 'FontAwesome' ) {
+				$fa_cdn.after('<link href="{T_ASSETS_PATH}/css/font-awesome.min.css" rel="stylesheet">');
+				$fa_cdn.remove();
+			}
+			$span.remove();
+		})(jQuery);
+	</script>
+<!-- ENDIF -->
+
+<!-- IF S_COOKIE_NOTICE -->
+	<script src="{T_ASSETS_PATH}/cookieconsent/cookieconsent.min.js?assets_version={T_ASSETS_VERSION}"></script>
+	<script>
+		window.addEventListener("load", function(){
+			window.cookieconsent.initialise({
+				"palette": {
+					"popup": {
+						"background": "#0F538A"
+					},
+					"button": {
+						"background": "#E5E5E5"
+					}
+				},
+				"theme": "classic",
+				"content": {
+					"message": "{LA_COOKIE_CONSENT_MSG}",
+					"dismiss": "{LA_COOKIE_CONSENT_OK}",
+					"link": "{LA_COOKIE_CONSENT_INFO}"
+				}
+			})});
+	</script>
+<!-- ENDIF -->
 
 <!-- EVENT overall_footer_after -->
 
--- a/styles/prosilver/template/overall_header.html
+++ b/styles/prosilver/template/overall_header.html
@@ -8,13 +8,13 @@
 <title><!-- IF UNREAD_NOTIFICATIONS_COUNT -->({UNREAD_NOTIFICATIONS_COUNT}) <!-- ENDIF --><!-- IF not S_VIEWTOPIC and not S_VIEWFORUM -->{SITENAME} - <!-- ENDIF --><!-- IF S_IN_MCP -->{L_MCP} - <!-- ELSEIF S_IN_UCP -->{L_UCP} - <!-- ENDIF -->{PAGE_TITLE}<!-- IF S_VIEWTOPIC or S_VIEWFORUM --> - {SITENAME}<!-- ENDIF --></title>
 
 <!-- IF S_ENABLE_FEEDS -->
-	<!-- IF S_ENABLE_FEEDS_OVERALL --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {SITENAME}" href="{U_FEED}"><!-- ENDIF -->
-	<!-- IF S_ENABLE_FEEDS_NEWS --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_FEED_NEWS}" href="{U_FEED}?mode=news"><!-- ENDIF -->
-	<!-- IF S_ENABLE_FEEDS_FORUMS --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_ALL_FORUMS}" href="{U_FEED}?mode=forums"><!-- ENDIF -->
-	<!-- IF S_ENABLE_FEEDS_TOPICS --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_FEED_TOPICS_NEW}" href="{U_FEED}?mode=topics"><!-- ENDIF -->
-	<!-- IF S_ENABLE_FEEDS_TOPICS_ACTIVE --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_FEED_TOPICS_ACTIVE}" href="{U_FEED}?mode=topics_active"><!-- ENDIF -->
-	<!-- IF S_ENABLE_FEEDS_FORUM and S_FORUM_ID --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_FORUM} - {FORUM_NAME}" href="{U_FEED}?f={S_FORUM_ID}"><!-- ENDIF -->
-	<!-- IF S_ENABLE_FEEDS_TOPIC and S_TOPIC_ID --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_TOPIC} - {TOPIC_TITLE}" href="{U_FEED}?f={S_FORUM_ID}&amp;t={S_TOPIC_ID}"><!-- ENDIF -->
+	<!-- IF S_ENABLE_FEEDS_OVERALL --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {SITENAME}" href="{{ path('phpbb_feed_index') }}"><!-- ENDIF -->
+	<!-- IF S_ENABLE_FEEDS_NEWS --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_FEED_NEWS}" href="{{ path('phpbb_feed_news') }}"><!-- ENDIF -->
+	<!-- IF S_ENABLE_FEEDS_FORUMS --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_ALL_FORUMS}" href="{{ path('phpbb_feed_forums') }}"><!-- ENDIF -->
+	<!-- IF S_ENABLE_FEEDS_TOPICS --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_FEED_TOPICS_NEW}" href="{{ path('phpbb_feed_topics') }}"><!-- ENDIF -->
+	<!-- IF S_ENABLE_FEEDS_TOPICS_ACTIVE --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_FEED_TOPICS_ACTIVE}" href="{{ path('phpbb_feed_topics_active') }}"><!-- ENDIF -->
+	<!-- IF S_ENABLE_FEEDS_FORUM and S_FORUM_ID --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_FORUM} - {FORUM_NAME}" href="{{ path('phpbb_feed_forum', { forum_id : S_FORUM_ID } ) }}"><!-- ENDIF -->
+	<!-- IF S_ENABLE_FEEDS_TOPIC and S_TOPIC_ID --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_TOPIC} - {TOPIC_TITLE}" href="{{ path('phpbb_feed_topic', { topic_id : S_TOPIC_ID } ) }}"><!-- ENDIF -->
 	<!-- EVENT overall_header_feeds -->
 <!-- ENDIF -->
 
@@ -45,9 +45,9 @@
 	})(document);
 </script>
 <!-- ENDIF -->
+<link href="{T_FONT_AWESOME_LINK}" rel="stylesheet">
 <link href="{T_STYLESHEET_LINK}" rel="stylesheet">
 <link href="{T_STYLESHEET_LANG_LINK}" rel="stylesheet">
-<link href="{T_THEME_PATH}/responsive.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" media="all and (max-width: 700px)">
 
 <!-- IF S_CONTENT_DIRECTION eq 'rtl' -->
 	<link href="{T_THEME_PATH}/bidi.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet">
@@ -57,6 +57,10 @@
 	<link href="{T_THEME_PATH}/plupload.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet">
 <!-- ENDIF -->
 
+<!-- IF S_COOKIE_NOTICE -->
+	<link href="{T_ASSETS_PATH}/cookieconsent/cookieconsent.min.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet">
+<!-- ENDIF -->
+
 <!--[if lte IE 9]>
 	<link href="{T_THEME_PATH}/tweaks.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet">
 <![endif]-->
@@ -72,15 +76,15 @@
 
 <!-- EVENT overall_header_body_before -->
 
-<div id="wrap">
-	<a id="top" class="anchor" accesskey="t"></a>
+<div id="wrap" class="wrap">
+	<a id="top" class="top-anchor" accesskey="t"></a>
 	<div id="page-header">
 		<div class="headerbar" role="banner">
 		<!-- EVENT overall_header_headerbar_before -->
 			<div class="inner">
 
-			<div id="site-description">
-				<a id="logo" class="logo" href="<!-- IF U_SITE_HOME -->{U_SITE_HOME}<!-- ELSE -->{U_INDEX}<!-- ENDIF -->" title="<!-- IF U_SITE_HOME -->{L_SITE_HOME}<!-- ELSE -->{L_INDEX}<!-- ENDIF -->">{SITE_LOGO_IMG}</a>
+			<div id="site-description" class="site-description">
+				<a id="logo" class="logo" href="<!-- IF U_SITE_HOME -->{U_SITE_HOME}<!-- ELSE -->{U_INDEX}<!-- ENDIF -->" title="<!-- IF U_SITE_HOME -->{L_SITE_HOME}<!-- ELSE -->{L_INDEX}<!-- ENDIF -->"><span class="site_logo"></span></a>
 				<h1>{SITENAME}</h1>
 				<p>{SITE_DESCRIPTION}</p>
 				<p class="skiplink"><a href="#start_here">{L_SKIP}</a></p>
@@ -92,13 +96,18 @@
 				<form action="{U_SEARCH}" method="get" id="search">
 				<fieldset>
 					<input name="keywords" id="keywords" type="search" maxlength="128" title="{L_SEARCH_KEYWORDS}" class="inputbox search tiny" size="20" value="{SEARCH_WORDS}" placeholder="{L_SEARCH_MINI}" />
-					<button class="button icon-button search-icon" type="submit" title="{L_SEARCH}">{L_SEARCH}</button>
-					<a href="{U_SEARCH}" class="button icon-button search-adv-icon" title="{L_SEARCH_ADV}">{L_SEARCH_ADV}</a>
+					<button class="button button-search" type="submit" title="{L_SEARCH}">
+						<i class="icon fa-search fa-fw" aria-hidden="true"></i><span class="sr-only">{L_SEARCH}</span>
+					</button>
+					<a href="{U_SEARCH}" class="button button-search-end" title="{L_SEARCH_ADV}">
+						<i class="icon fa-cog fa-fw" aria-hidden="true"></i><span class="sr-only">{L_SEARCH_ADV}</span>
+					</a>
 					{S_SEARCH_HIDDEN_FIELDS}
 				</fieldset>
 				</form>
 			</div>
 			<!-- ENDIF -->
+			<!-- EVENT overall_header_searchbox_after -->
 
 			</div>
 			<!-- EVENT overall_header_headerbar_after -->
@@ -110,7 +119,7 @@
 	<!-- EVENT overall_header_page_body_before -->
 
 	<a id="start_here" class="anchor"></a>
-	<div id="page-body" role="main">
+	<div id="page-body" class="page-body" role="main">
 		<!-- IF S_BOARD_DISABLED and S_USER_LOGGED_IN and (U_MCP or U_ACP) -->
 		<div id="information" class="rules">
 			<div class="inner">
--- a/styles/prosilver/template/pagination.html
+++ b/styles/prosilver/template/pagination.html
@@ -1,8 +1,8 @@
 <ul>
 <!-- IF BASE_URL and TOTAL_PAGES > 6 -->
 	<li class="dropdown-container dropdown-button-control dropdown-page-jump page-jump">
-		<a href="#" class="dropdown-trigger" title="{L_JUMP_TO_PAGE_CLICK}" role="button">{PAGE_NUMBER}</a>
-		<div class="dropdown hidden">
+		<a class="button button-icon-only dropdown-trigger" href="#" title="{L_JUMP_TO_PAGE_CLICK}" role="button"><i class="icon fa-level-down fa-rotate-270" aria-hidden="true"></i><span class="sr-only">{PAGE_NUMBER}</span></a>
+		<div class="dropdown">
 			<div class="pointer"><div class="pointer-inner"></div></div>
 			<ul class="dropdown-contents">
 				<li>{L_JUMP_TO_PAGE}{L_COLON}</li>
@@ -16,15 +16,15 @@
 <!-- ENDIF -->
 <!-- BEGIN pagination -->
 	<!-- IF pagination.S_IS_PREV -->
-	<li class="previous"><a href="{pagination.PAGE_URL}" rel="prev" role="button">{L_PREVIOUS}</a></li>
+		<li class="arrow previous"><a class="button button-icon-only" href="{pagination.PAGE_URL}" rel="prev" role="button"><i class="icon fa-chevron-left fa-fw" aria-hidden="true"></i><span class="sr-only">{L_PREVIOUS}</span></a></li>
 	<!-- ELSEIF pagination.S_IS_CURRENT -->
 	<li class="active"><span>{pagination.PAGE_NUMBER}</span></li>
 	<!-- ELSEIF pagination.S_IS_ELLIPSIS -->
 	<li class="ellipsis" role="separator"><span>{L_ELLIPSIS}</span></li>
 	<!-- ELSEIF pagination.S_IS_NEXT -->
-	<li class="next"><a href="{pagination.PAGE_URL}" rel="next" role="button">{L_NEXT}</a></li>
+		<li class="arrow next"><a class="button button-icon-only" href="{pagination.PAGE_URL}" rel="next" role="button"><i class="icon fa-chevron-right fa-fw" aria-hidden="true"></i><span class="sr-only">{L_NEXT}</span></a></li>
 	<!-- ELSE -->
-	<li><a href="{pagination.PAGE_URL}" role="button">{pagination.PAGE_NUMBER}</a></li>
+		<li><a class="button" href="{pagination.PAGE_URL}" role="button">{pagination.PAGE_NUMBER}</a></li>
 	<!-- ENDIF -->
 <!-- END pagination -->
 </ul>
--- a/styles/prosilver/template/posting_attach_body.html
+++ b/styles/prosilver/template/posting_attach_body.html
@@ -2,12 +2,12 @@
 	<div class="inner">
 
 	<p>{L_ADD_ATTACHMENT_EXPLAIN} <span class="hidden" id="drag-n-drop-message">{L_PLUPLOAD_DRAG_TEXTAREA}</span></p>
-	
+
 	<fieldset class="fields2" id="attach-panel-basic">
 	<dl>
 		<dt><label for="fileupload">{L_FILENAME}{L_COLON}</label></dt>
 		<dd>
-			<input type="file" name="fileupload" id="fileupload" maxlength="{FILESIZE}" value="" class="inputbox autowidth" /> 
+			<input type="file" name="fileupload" id="fileupload" class="inputbox autowidth" />
 			<input type="submit" name="add_file" value="{L_ADD_FILE}" class="button2" onclick="upload = true;" />
 		</dd>
 	</dl>
@@ -17,11 +17,11 @@
 	</dl>
 	</fieldset>
 
-	<div id="attach-panel-multi">
+	<div id="attach-panel-multi" class="attach-panel-multi">
 		<input type="button" class="button2" value="{L_PLUPLOAD_ADD_FILES}" id="add_files" />
 	</div>
 
-	<div class="panel<!-- IF not .attach_row --> hidden<!-- ENDIF -->" id="file-list-container">
+	<div class="panel<!-- IF not .attach_row --> hidden<!-- ENDIF --> file-list-container" id="file-list-container">
 		<div class="inner">
 			<table class="table1 zebra-list fixed-width-table">
 				<thead>
@@ -32,7 +32,7 @@
 						<th class="attach-status">{L_PLUPLOAD_STATUS}</th>
 					</tr>
 				</thead>
-				<tbody class="responsive-skip-empty" id="file-list">
+				<tbody class="responsive-skip-empty file-list" id="file-list">
 					<tr class="attach-row" id="attach-row-tpl">
 							<td class="attach-name">
 								<span class="file-name ellipsis-text"></span>
--- a/styles/prosilver/template/posting_buttons.html
+++ b/styles/prosilver/template/posting_buttons.html
@@ -55,31 +55,56 @@
 <div id="colour_palette" style="display: none;">
 	<dl style="clear: left;">
 		<dt><label>{L_FONT_COLOR}{L_COLON}</label></dt>
-		<dd id="color_palette_placeholder" data-orientation="h" data-height="12" data-width="15" data-bbcode="true"></dd>
+		<dd id="color_palette_placeholder" class="color_palette_placeholder" data-orientation="h" data-height="12" data-width="15" data-bbcode="true"></dd>
 	</dl>
 </div>
 
 <!-- EVENT posting_editor_buttons_before -->
-<div id="format-buttons">
-	<input type="button" class="button2 bbcode-b" accesskey="b" name="addbbcode0" value=" B " style="font-weight:bold; width: 30px" onclick="bbstyle(0)" title="{L_BBCODE_B_HELP}" />
-	<input type="button" class="button2 bbcode-i" accesskey="i" name="addbbcode2" value=" i " style="font-style:italic; width: 30px" onclick="bbstyle(2)" title="{L_BBCODE_I_HELP}" />
-	<input type="button" class="button2 bbcode-u" accesskey="u" name="addbbcode4" value=" u " style="text-decoration: underline; width: 30px" onclick="bbstyle(4)" title="{L_BBCODE_U_HELP}" />
+<div id="format-buttons" class="format-buttons">
+	<button type="button" class="button button-icon-only bbcode-b" accesskey="b" name="addbbcode0" value=" B " onclick="bbstyle(0)" title="{L_BBCODE_B_HELP}">
+		<i class="icon fa-bold fa-fw" aria-hidden="true"></i>
+	</button>
+	<button type="button" class="button button-icon-only bbcode-i" accesskey="i" name="addbbcode2" value=" i " onclick="bbstyle(2)" title="{L_BBCODE_I_HELP}">
+		<i class="icon fa-italic fa-fw" aria-hidden="true"></i>
+	</button>
+	<button type="button" class="button button-icon-only bbcode-u" accesskey="u" name="addbbcode4" value=" u " onclick="bbstyle(4)" title="{L_BBCODE_U_HELP}">
+		<i class="icon fa-underline fa-fw" aria-hidden="true"></i>
+	</button>
 	<!-- IF S_BBCODE_QUOTE -->
-		<input type="button" class="button2 bbcode-quote" accesskey="q" name="addbbcode6" value="Quote" style="width: 50px" onclick="bbstyle(6)" title="{L_BBCODE_Q_HELP}" />
+	<button type="button" class="button button-icon-only bbcode-quote" accesskey="q" name="addbbcode6" value="Quote" onclick="bbstyle(6)" title="{L_BBCODE_Q_HELP}">
+		<i class="icon fa-quote-left fa-fw" aria-hidden="true"></i>
+	</button>
 	<!-- ENDIF -->
-	<input type="button" class="button2 bbcode-code" accesskey="c" name="addbbcode8" value="Code" style="width: 40px" onclick="bbstyle(8)" title="{L_BBCODE_C_HELP}" />
-	<input type="button" class="button2 bbcode-list" accesskey="l" name="addbbcode10" value="List" style="width: 40px" onclick="bbstyle(10)" title="{L_BBCODE_L_HELP}" />
-	<input type="button" class="button2 bbcode-list-" accesskey="o" name="addbbcode12" value="List=" style="width: 40px" onclick="bbstyle(12)" title="{L_BBCODE_O_HELP}" />
-	<input type="button" class="button2 bbcode-asterisk" accesskey="y" name="addlistitem" value="[*]" style="width: 40px" onclick="bbstyle(-1)" title="{L_BBCODE_LISTITEM_HELP}" />
+	<button type="button" class="button button-icon-only bbcode-code" accesskey="c" name="addbbcode8" value="Code" onclick="bbstyle(8)" title="{L_BBCODE_C_HELP}">
+		<i class="icon fa-code fa-fw" aria-hidden="true"></i>
+	</button>
+	<button type="button" class="button button-icon-only bbcode-list" accesskey="l" name="addbbcode10" value="List" onclick="bbstyle(10)" title="{L_BBCODE_L_HELP}">
+		<i class="icon fa-list fa-fw" aria-hidden="true"></i>
+	</button>
+	<button type="button" class="button button-icon-only bbcode-list-" accesskey="o" name="addbbcode12" value="List=" onclick="bbstyle(12)" title="{L_BBCODE_O_HELP}">
+		<i class="icon fa-list-ol fa-fw" aria-hidden="true"></i>
+	</button>
+	<button type="button" class="button button-icon-only bbcode-asterisk" accesskey="y" name="addlistitem" value="[*]" onclick="bbstyle(-1)" title="{L_BBCODE_LISTITEM_HELP}">
+		<i class="icon fa-asterisk fa-fw" aria-hidden="true"></i>
+	</button>
 	<!-- IF S_BBCODE_IMG -->
-		<input type="button" class="button2 bbcode-img" accesskey="p" name="addbbcode14" value="Img" style="width: 40px" onclick="bbstyle(14)" title="{L_BBCODE_P_HELP}" />
+	<button type="button" class="button button-icon-only bbcode-img" accesskey="p" name="addbbcode14" value="Img" onclick="bbstyle(14)" title="{L_BBCODE_P_HELP}">
+		<i class="icon fa-image fa-fw" aria-hidden="true"></i>
+	</button>
 	<!-- ENDIF -->
 	<!-- IF S_LINKS_ALLOWED -->
-		<input type="button" class="button2 bbcode-url" accesskey="w" name="addbbcode16" value="URL" style="text-decoration: underline; width: 40px" onclick="bbstyle(16)" title="{L_BBCODE_W_HELP}" />
+	<button type="button" class="button button-icon-only bbcode-url" accesskey="w" name="addbbcode16" value="URL" onclick="bbstyle(16)" title="{L_BBCODE_W_HELP}">
+		<i class="icon fa-link fa-fw" aria-hidden="true"></i>
+	</button>
 	<!-- ENDIF -->
 	<!-- IF S_BBCODE_FLASH -->
-		<input type="button" class="button2 bbcode-flash" accesskey="d" name="addbbcode18" value="Flash" onclick="bbstyle(18)" title="{L_BBCODE_D_HELP}" />
+	<button type="button" class="button button-icon-only bbcode-flash" accesskey="d" name="addbbcode18" value="Flash" onclick="bbstyle(18)" title="{L_BBCODE_D_HELP}">
+		<i class="icon fa-flash fa-fw" aria-hidden="true"></i>
+	</button>
 	<!-- ENDIF -->
+	<button type="button" class="button button-icon-only bbcode-color" name="bbpalette" id="bbpalette" value="{L_FONT_COLOR}" onclick="change_palette();" title="{L_BBCODE_S_HELP}">
+		<i class="icon fa-tint fa-fw" aria-hidden="true"></i>
+	</button>
 	<select name="addbbcode20" class="bbcode-size" onchange="bbfontstyle('[size=' + this.form.addbbcode20.options[this.form.addbbcode20.selectedIndex].value + ']', '[/size]');this.form.addbbcode20.selectedIndex = 2;" title="{L_BBCODE_F_HELP}">
 		<option value="50">{L_FONT_TINY}</option>
 		<option value="85">{L_FONT_SMALL}</option>
@@ -91,12 +116,13 @@
 			<!-- ENDIF -->
 		<!-- ENDIF -->
 	</select>
-	<input type="button" class="button2 bbcode-color" name="bbpalette" id="bbpalette" value="{L_FONT_COLOR}" onclick="change_palette();" title="{L_BBCODE_S_HELP}" />
 
 	<!-- EVENT posting_editor_buttons_custom_tags_before -->
 
 	<!-- BEGIN custom_tags -->
-		<input type="button" class="button2 bbcode-{custom_tags.BBCODE_TAG_CLEAN}" name="addbbcode{custom_tags.BBCODE_ID}" value="{custom_tags.BBCODE_TAG}" onclick="bbstyle({custom_tags.BBCODE_ID})" title="{custom_tags.BBCODE_HELPLINE}" />
+	<button type="button" class="button button-secondary bbcode-{custom_tags.BBCODE_TAG_CLEAN}" name="addbbcode{custom_tags.BBCODE_ID}" value="{custom_tags.BBCODE_TAG}" onclick="bbstyle({custom_tags.BBCODE_ID})" title="{custom_tags.BBCODE_HELPLINE}">
+		{custom_tags.BBCODE_TAG}
+	</button>
 	<!-- END custom_tags -->
 </div>
 <!-- EVENT posting_editor_buttons_after -->
--- a/styles/prosilver/template/posting_editor.html
+++ b/styles/prosilver/template/posting_editor.html
@@ -6,7 +6,7 @@
 		<dt><label for="icon">{L_ICON}{L_COLON}</label></dt>
 		<dd>
 			<label for="icon"><input type="radio" name="icon" id="icon" value="0" checked="checked" tabindex="1" /> <!-- IF S_SHOW_TOPIC_ICONS -->{L_NO_TOPIC_ICON}<!-- ELSE -->{L_NO_PM_ICON}<!-- ENDIF --></label>
-			<!-- BEGIN topic_icon --><label for="icon-{topic_icon.ICON_ID}"><input type="radio" name="icon" id="icon-{topic_icon.ICON_ID}" value="{topic_icon.ICON_ID}" {topic_icon.S_ICON_CHECKED} tabindex="1" /><img src="{topic_icon.ICON_IMG}" width="{topic_icon.ICON_WIDTH}" height="{topic_icon.ICON_HEIGHT}" alt="{topic_icon.ICON_NAME}" title="" /></label> <!-- END topic_icon -->
+			<!-- BEGIN topic_icon --><label for="icon-{topic_icon.ICON_ID}"><input type="radio" name="icon" id="icon-{topic_icon.ICON_ID}" value="{topic_icon.ICON_ID}" {topic_icon.S_ICON_CHECKED} tabindex="1" /><img src="{topic_icon.ICON_IMG}" width="{topic_icon.ICON_WIDTH}" height="{topic_icon.ICON_HEIGHT}" alt="{topic_icon.ICON_ALT}" title="{topic_icon.ICON_ALT}" /></label> <!-- END topic_icon -->
 		</dd>
 	</dl>
 	<!-- ENDIF -->
@@ -39,8 +39,8 @@
 
 	<!-- INCLUDE posting_buttons.html -->
 
-	<div id="smiley-box">
-		<!-- EVENT posting_editor_smilies_before -->	
+	<div id="smiley-box" class="smiley-box">
+		<!-- EVENT posting_editor_smilies_before -->
 		<!-- IF S_SMILIES_ALLOWED and .smiley -->
 			<strong>{L_SMILIES}</strong><br />
 			<!-- BEGIN smiley -->
@@ -73,7 +73,7 @@
 
 	<!-- EVENT posting_editor_message_before -->
 
-	<div id="message-box">
+	<div id="message-box" class="message-box">
 		<textarea <!-- IF S_UCP_ACTION and not S_PRIVMSGS and not S_EDIT_DRAFT -->name="signature" id="signature" style="height: 9em;"<!-- ELSE -->name="message" id="message"<!-- ENDIF --> rows="15" cols="76" tabindex="4" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);" onfocus="initInsertions();" class="inputbox">{MESSAGE}{DRAFT_MESSAGE}{SIGNATURE}</textarea>
 	</div>
 
@@ -106,13 +106,13 @@
 	<!-- ENDIF -->
 
 	<!-- IF not S_PRIVMSGS and not S_SHOW_DRAFTS and not $SIG_EDIT eq 1 -->
-		<div id="tabs" class="sub-panels" data-show-panel="<!-- IF SHOW_PANEL -->{SHOW_PANEL}<!-- ELSE -->options-panel<!-- ENDIF -->" role="tablist">
+		<div id="tabs" class="tabs sub-panels" data-show-panel="<!-- IF SHOW_PANEL -->{SHOW_PANEL}<!-- ELSE -->options-panel<!-- ENDIF -->" role="tablist">
 			<ul>
 				<li id="options-panel-tab" class="tab activetab"><a href="#tabs" data-subpanel="options-panel" role="tab" aria-controls="options-panel"><span>{L_OPTIONS}</span></a></li>
 				<!-- IF S_SHOW_ATTACH_BOX -->
 					<li id="attach-panel-tab" class="tab">
 						<a href="#tabs" data-subpanel="attach-panel" role="tab" aria-controls="attach-panel">
-							{L_ATTACHMENTS} <strong id="file-total-progress"><strong id="file-total-progress-bar"></strong></strong>
+							{L_ATTACHMENTS} <strong id="file-total-progress" class="file-total-progress"><strong id="file-total-progress-bar" class="file-total-progress-bar"></strong></strong>
 						</a>
 					</li>
 				<!-- ENDIF -->
--- a/styles/prosilver/template/posting_layout.html
+++ b/styles/prosilver/template/posting_layout.html
@@ -9,14 +9,14 @@
 <!-- IF S_FORUM_RULES -->
 	<div class="rules<!-- IF U_FORUM_RULES --> rules-link<!-- ENDIF -->">
 		<div class="inner">
-		
+
 		<!-- IF U_FORUM_RULES -->
 			<a href="{U_FORUM_RULES}">{L_FORUM_RULES}</a>
 		<!-- ELSE -->
 			<strong>{L_FORUM_RULES}</strong><br />
 			{FORUM_RULES}
 		<!-- ENDIF -->
-		
+
 		</div>
 	</div>
 <!-- ENDIF -->
@@ -26,10 +26,10 @@
 <!-- IF S_DRAFT_LOADED -->
 	<div class="panel">
 		<div class="inner">
-		
+
 		<h3>{L_INFORMATION}</h3>
 		<p>{L_DRAFT_LOADED}</p>
-		
+
 		</div>
 	</div>
 <!-- ENDIF -->
@@ -48,7 +48,7 @@
 				<dt><label for="to_forum_id">{L_MOVE}{L_COLON}</label></dt>
 				<dd><select id="to_forum_id" name="to_forum_id">{S_FORUM_SELECT}</select></dd>
 			</dl>
-			
+
 			<dl>
 				<dt>&nbsp;</dt>
 				<dd><input class="button1" type="submit" name="post" value="{L_CONFIRM}" /> <input class="button2" type="submit" name="cancel_unglobalise" value="{L_CANCEL}" /></dd>
@@ -63,7 +63,7 @@
 
 <div class="panel" id="postingbox">
 	<div class="inner">
-	
+
 	<h3>{L_POST_A}</h3>
 
 	<!-- DEFINE $EXTRA_POSTING_OPTIONS = 1 -->
--- a/styles/prosilver/template/posting_pm_layout.html
+++ b/styles/prosilver/template/posting_pm_layout.html
@@ -3,10 +3,10 @@
 <!-- IF S_DRAFT_LOADED -->
 	<div class="panel">
 		<div class="inner">
-		
+
 		<h3>{L_INFORMATION}</h3>
 		<p>{L_DRAFT_LOADED_PM}</p>
-		
+
 		</div>
 	</div>
 <!-- ENDIF -->
--- a/styles/prosilver/template/posting_review.html
+++ b/styles/prosilver/template/posting_review.html
@@ -14,7 +14,16 @@
 
 	<div class="postbody" id="ppr{post_review_row.POST_ID}">
 		<h3><a href="#ppr{post_review_row.POST_ID}">{post_review_row.POST_SUBJECT}</a></h3>
-		<p class="author"><!-- IF S_IS_BOT -->{post_review_row.MINI_POST_IMG}<!-- ELSE --><a href="{post_review_row.U_MINI_POST}">{post_review_row.MINI_POST_IMG}</a><!-- ENDIF --> {L_POST_BY_AUTHOR}<strong>  {post_review_row.POST_AUTHOR_FULL}</strong> &raquo; {post_review_row.POST_DATE}</p>
+		<p class="author">
+			<!-- IF S_IS_BOT -->
+				<span><i class="icon fa-file fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{post_review_row.MINI_POST}</span></span>
+			<!-- ELSE -->
+				<a href="{post_review_row.U_MINI_POST}" title="{post_review_row.MINI_POST}">
+					<i class="icon fa-file fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{post_review_row.MINI_POST}</span>
+				</a>
+			<!-- ENDIF -->
+			{L_POST_BY_AUTHOR}<strong>  {post_review_row.POST_AUTHOR_FULL}</strong> &raquo; {post_review_row.POST_DATE}
+		</p>
 		<div class="content">{post_review_row.MESSAGE}</div>
 
 		<!-- IF post_review_row.S_HAS_ATTACHMENTS -->
--- a/styles/prosilver/template/posting_smilies.html
+++ b/styles/prosilver/template/posting_smilies.html
@@ -11,13 +11,13 @@
 <h2>{L_SMILIES}</h2>
 <div class="panel">
 	<div class="inner">
-		<!-- BEGIN smiley --> 
-			<a href="#" onclick="initInsertions(); insert_text('{smiley.A_SMILEY_CODE}', true, true); return false;"><img src="{smiley.SMILEY_IMG}" width="{smiley.SMILEY_WIDTH}" height="{smiley.SMILEY_HEIGHT}" alt="{smiley.SMILEY_CODE}" title="{smiley.SMILEY_DESC}" /></a> 
+		<!-- BEGIN smiley -->
+			<a href="#" onclick="initInsertions(); insert_text('{smiley.A_SMILEY_CODE}', true, true); return false;"><img src="{smiley.SMILEY_IMG}" width="{smiley.SMILEY_WIDTH}" height="{smiley.SMILEY_HEIGHT}" alt="{smiley.SMILEY_CODE}" title="{smiley.SMILEY_DESC}" /></a>
 		<!-- END smiley -->
-	
+
 	</div>
 </div>
-<!-- IF .pagination --> 
+<!-- IF .pagination -->
 	<div class="pagination">
 		<!-- INCLUDE pagination.html -->
 	</div>
--- a/styles/prosilver/template/posting_topic_review.html
+++ b/styles/prosilver/template/posting_topic_review.html
@@ -1,10 +1,10 @@
 
-<h3 id="review">
+<h3 id="review" class="review">
 	<span class="right-box"><a href="#review" onclick="viewableArea(getElementById('topicreview'), true); var rev_text = getElementById('review').getElementsByTagName('a').item(0).firstChild; if (rev_text.data == '{LA_EXPAND_VIEW}'){rev_text.data = '{LA_COLLAPSE_VIEW}'; } else if (rev_text.data == '{LA_COLLAPSE_VIEW}'){rev_text.data = '{LA_EXPAND_VIEW}'};">{L_EXPAND_VIEW}</a></span>
 	{L_TOPIC_REVIEW}{L_COLON} {TOPIC_TITLE}
 </h3>
 
-<div id="topicreview">
+<div id="topicreview" class="topicreview">
 <script type="text/javascript">
 // <![CDATA[
 	bbcodeEnabled = {S_BBCODE_ALLOWED};
@@ -16,6 +16,10 @@
 	<div class="post bg3 post-ignore">
 		<div class="inner">
 			{topic_review_row.L_IGNORE_POST}
+	<!-- ELSE IF topic_review_row.S_POST_DELETED -->
+	<div class="post bg3 post-ignore">
+		<div class="inner">
+			{topic_review_row.L_DELETE_POST}
 	<!-- ELSE -->
 	<div class="post <!-- IF topic_review_row.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF --><!-- IF topic_review_row.POST_ID == REPORTED_POST_ID --> reported<!-- ENDIF -->">
 		<div class="inner">
@@ -28,15 +32,15 @@
 			<ul class="post-buttons">
 			<!-- IF topic_review_row.U_MCP_DETAILS -->
 				<li>
-					<a href="{topic_review_row.U_MCP_DETAILS}" title="{L_POST_DETAILS}" class="button icon-button info-icon">
-						<span>{L_POST_DETAILS}</span>
+					<a href="{topic_review_row.U_MCP_DETAILS}" title="{L_POST_DETAILS}" class="button button-icon-only">
+						<i class="icon fa-info fa-fw" aria-hidden="true"></i><span class="sr-only">{L_POST_DETAILS}</span>
 					</a>
 				<li>
 			<!-- ENDIF -->
 			<!-- IF topic_review_row.POSTER_QUOTE and topic_review_row.DECODED_MESSAGE -->
 				<li>
-					<a href="#postingbox" onclick="addquote({topic_review_row.POST_ID}, '{topic_review_row.POSTER_QUOTE}', '{LA_WROTE}');" title="{L_QUOTE} {topic_review_row.POST_AUTHOR}" class="button icon-button quote-icon">
-						<span>{L_QUOTE} {topic_review_row.POST_AUTHOR}</span>
+					<a href="#postingbox" onclick="addquote({topic_review_row.POST_ID}, '{topic_review_row.POSTER_QUOTE}', '{LA_WROTE}', {post_id:{topic_review_row.POST_ID},time:{topic_review_row.POST_TIME},user_id:{topic_review_row.USER_ID}});" title="{L_QUOTE} {topic_review_row.POST_AUTHOR}" class="button button-icon-only">
+						<i class="icon fa-quote-left fa-fw" aria-hidden="true"></i><span class="sr-only">{L_QUOTE} {topic_review_row.POST_AUTHOR}</span>
 					</a>
 				</li>
 			<!-- ENDIF -->
@@ -44,7 +48,16 @@
 			<!-- ENDIF -->
 
 			<!-- EVENT posting_topic_review_row_post_details_before -->
-			<p class="author"><!-- IF S_IS_BOT -->{topic_review_row.MINI_POST_IMG}<!-- ELSE --><a href="{topic_review_row.U_MINI_POST}">{topic_review_row.MINI_POST_IMG}</a><!-- ENDIF --> {L_POST_BY_AUTHOR} <strong>{topic_review_row.POST_AUTHOR_FULL}</strong> &raquo; {topic_review_row.POST_DATE}  </p>
+			<p class="author">
+				<!-- IF S_IS_BOT -->
+					<span><i class="icon fa-file fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{topic_review_row.MINI_POST}</span></span>
+				<!-- ELSE -->
+					<a href="{topic_review_row.U_MINI_POST}" title="{topic_review_row.MINI_POST}">
+						<i class="icon fa-file fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{topic_review_row.MINI_POST}</span>
+					</a>
+				<!-- ENDIF -->
+				{L_POST_BY_AUTHOR} <strong>{topic_review_row.POST_AUTHOR_FULL}</strong> &raquo; {topic_review_row.POST_DATE}
+			</p>
 			<!-- EVENT posting_topic_review_row_post_details_after -->
 
 			<div class="content">{topic_review_row.MESSAGE}</div>
@@ -69,8 +82,8 @@
 
 <hr />
 
-<!-- IF S_MCP_REPORT -->
-	<p><a href="#report" class="top2">{L_BACK_TO_TOP}</a></p>
-<!-- ELSE -->
-	<p><a href="#postingbox" class="top2">{L_BACK_TO_TOP}</a></p>
-<!-- ENDIF -->
+<p>
+	<a href="<!-- IF S_MCP_REPORT -->#report<!-- ELSE -->#postingbox<!-- ENDIF -->" class="top">
+		<i class="icon fa-chevron-circle-up fa-fw icon-gray" aria-hidden="true"></i><span>{L_BACK_TO_TOP}</span>
+	</a>
+</p>
--- a/styles/prosilver/template/quickreply_editor.html
+++ b/styles/prosilver/template/quickreply_editor.html
@@ -10,7 +10,7 @@
 						<dd><input type="text" name="subject" id="subject" size="45" maxlength="124" tabindex="2" value="{SUBJECT}" class="inputbox autowidth" /></dd>
 					</dl>
 				<!-- EVENT quickreply_editor_message_before -->
-				<div id="message-box">
+				<div id="message-box" class="message-box">
 					<textarea style="height: 9em;" name="message" rows="7" cols="76" tabindex="3" class="inputbox"></textarea>
 				</div>
 				<!-- EVENT quickreply_editor_message_after -->
--- a/styles/prosilver/template/report_body.html
+++ b/styles/prosilver/template/report_body.html
@@ -8,7 +8,7 @@
 
 	<div class="content">
 		<p><!-- IF S_REPORT_POST -->{L_REPORT_POST_EXPLAIN}<!-- ELSE -->{L_REPORT_MESSAGE_EXPLAIN}<!-- ENDIF --></p>
-		
+
 		<fieldset>
 		<!-- IF ERROR --><dl><dd class="error">{ERROR}</dd></dl><!-- ENDIF -->
 		<dl class="fields2">
@@ -19,7 +19,7 @@
 			<dl class="fields2">
 				<dt><label for="notify1">{L_REPORT_NOTIFY}{L_COLON}</label><br /><span>{L_REPORT_NOTIFY_EXPLAIN}</span></dt>
 				<dd>
-					<label for="notify1"><input type="radio" name="notify" id="notify1" value="1" <!-- IF not S_NOTIFY -->checked="checked"<!-- ENDIF --> /> {L_YES}</label> 
+					<label for="notify1"><input type="radio" name="notify" id="notify1" value="1" <!-- IF not S_NOTIFY -->checked="checked"<!-- ENDIF --> /> {L_YES}</label>
 					<label for="notify0"><input type="radio" name="notify" id="notify0" value="0" <!-- IF S_NOTIFY -->checked="checked"<!-- ENDIF --> /> {L_NO}</label>
 				</dd>
 			</dl>
--- a/styles/prosilver/template/search_results.html
+++ b/styles/prosilver/template/search_results.html
@@ -8,23 +8,35 @@
 <!-- IF PHRASE_SEARCH_DISABLED --> <p><strong>{L_PHRASE_SEARCH_DISABLED}</strong></p><!-- ENDIF -->
 
 <!-- IF SEARCH_TOPIC -->
-	<p class="return-link"><a class="arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH_TOPIC}">{L_RETURN_TO_TOPIC}</a></p>
+	<p class="return-link">
+		<a class="arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH_TOPIC}">
+			<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_RETURN_TO_TOPIC}</span>
+		</a>
+	</p>
 <!-- ELSE -->
-	<p class="advanced-search-link"><a class="arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH}" title="{L_SEARCH_ADV}">{L_GO_TO_SEARCH_ADV}</a></p>
+	<p class="advanced-search-link">
+		<a class="arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH}" title="{L_SEARCH_ADV}">
+			<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_GO_TO_SEARCH_ADV}</span>
+		</a>
+	</p>
 <!-- ENDIF -->
 
 <!-- EVENT search_results_header_after -->
 
 <!-- IF .pagination or SEARCH_MATCHES or TOTAL_MATCHES or PAGE_NUMBER -->
-	<div class="action-bar top">
+	<div class="action-bar bar-top">
 
 	<!-- IF TOTAL_MATCHES > 0 -->
 		<div class="search-box" role="search">
 			<form method="post" action="{S_SEARCH_ACTION}">
 			<fieldset>
 				<input class="inputbox search tiny" type="search" name="add_keywords" id="add_keywords" value="" placeholder="{L_SEARCH_IN_RESULTS}" />
-				<button class="button icon-button search-icon" type="submit" title="{L_SEARCH}">{L_SEARCH}</button>
-				<a href="{U_SEARCH}" class="button icon-button search-adv-icon" title="{L_SEARCH_ADV}">{L_SEARCH_ADV}</a>
+				<button class="button button-search" type="submit" title="{L_SEARCH}">
+					<i class="icon fa-search fa-fw" aria-hidden="true"></i><span class="sr-only">{L_SEARCH}</span>
+				</button>
+				<a href="{U_SEARCH}" class="button button-search-end" title="{L_SEARCH_ADV}">
+					<i class="icon fa-cog fa-fw" aria-hidden="true"></i><span class="sr-only">{L_SEARCH_ADV}</span>
+				</a>
 			</fieldset>
 			</form>
 		</div>
@@ -52,7 +64,7 @@
 		<div class="inner">
 		<ul class="topiclist">
 			<li class="header">
-				<dl class="icon">
+				<dl class="row-item">
 					<dt><div class="list-inner">{L_TOPICS}</div></dt>
 					<dd class="posts">{L_REPLIES}</dd>
 					<dd class="views">{L_VIEWS}</dd>
@@ -65,43 +77,79 @@
 		<!-- BEGIN searchresults -->
 			<!-- EVENT search_results_topic_before -->
 			<li class="row<!-- IF searchresults.S_ROW_COUNT is even --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
-				<dl class="icon {searchresults.TOPIC_IMG_STYLE}">
-					<dt <!-- IF searchresults.TOPIC_ICON_IMG -->style="background-image: url({T_ICONS_PATH}{searchresults.TOPIC_ICON_IMG}); background-repeat: no-repeat;"<!-- ENDIF --> title="{searchresults.TOPIC_FOLDER_IMG_ALT}">
-						<!-- IF searchresults.S_UNREAD_TOPIC and not S_IS_BOT --><a href="{searchresults.U_NEWEST_POST}" class="icon-link"></a><!-- ENDIF -->
+				<dl class="row-item {searchresults.TOPIC_IMG_STYLE}">
+					<dt<!-- IF searchresults.TOPIC_ICON_IMG and S_TOPIC_ICONS --> style="background-image: url({T_ICONS_PATH}{searchresults.TOPIC_ICON_IMG}); background-repeat: no-repeat;"<!-- ENDIF --> title="{searchresults.TOPIC_FOLDER_IMG_ALT}">
+						<!-- IF searchresults.S_UNREAD_TOPIC and not S_IS_BOT --><a href="{searchresults.U_NEWEST_POST}" class="row-item-link"></a><!-- ENDIF -->
 						<div class="list-inner">
-
 							<!-- EVENT topiclist_row_prepend -->
-							<!-- IF searchresults.S_UNREAD_TOPIC and not S_IS_BOT --><a href="{searchresults.U_NEWEST_POST}">{NEWEST_POST_IMG}</a> <!-- ENDIF -->
-							<a href="{searchresults.U_VIEW_TOPIC}" class="topictitle">{searchresults.TOPIC_TITLE}</a> {searchresults.ATTACH_ICON_IMG}
-							<!-- IF searchresults.S_TOPIC_UNAPPROVED or searchresults.S_POSTS_UNAPPROVED --><a href="{searchresults.U_MCP_QUEUE}">{searchresults.UNAPPROVED_IMG}</a> <!-- ENDIF -->
-							<!-- IF searchresults.S_TOPIC_DELETED --><a href="{searchresults.U_MCP_QUEUE}">{DELETED_IMG}</a> <!-- ENDIF -->
-							<!-- IF searchresults.S_TOPIC_REPORTED --><a href="{searchresults.U_MCP_REPORT}">{REPORTED_IMG}</a><!-- ENDIF --><br />
+							<!-- IF searchresults.S_UNREAD_TOPIC and not S_IS_BOT -->
+								<a class="unread" href="{searchresults.U_NEWEST_POST}">
+									<i class="icon fa-file fa-fw icon-red icon-md" aria-hidden="true"></i><span class="sr-only">{L_NEW_POST}</span>
+								</a>
+							<!-- ENDIF -->
+							<a href="{searchresults.U_VIEW_TOPIC}" class="topictitle">{searchresults.TOPIC_TITLE}</a>
+							<!-- IF searchresults.S_TOPIC_UNAPPROVED or searchresults.S_POSTS_UNAPPROVED -->
+								<a href="{searchresults.U_MCP_QUEUE}" title="{L_TOPIC_UNAPPROVED}">
+									<i class="icon fa-question fa-fw icon-blue" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_UNAPPROVED}</span>
+								</a>
+							<!-- ENDIF -->
+							<!-- IF searchresults.S_TOPIC_DELETED -->
+								<a href="{searchresults.U_MCP_QUEUE}" title="{L_TOPIC_DELETED}">
+									<i class="icon fa-recycle fa-fw icon-green" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_DELETED}</span>
+								</a>
+							<!-- ENDIF -->
+							<!-- IF searchresults.S_TOPIC_REPORTED -->
+								<a href="{searchresults.U_MCP_REPORT}" title="{L_TOPIC_REPORTED}">
+									<i class="icon fa-exclamation fa-fw icon-red" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_REPORTED}</span>
+								</a>
+							<!-- ENDIF -->
+							<br />
+
+							<!-- IF not S_IS_BOT -->
+								<div class="responsive-show" style="display: none;">
+									{L_LAST_POST} {L_POST_BY_AUTHOR} {searchresults.LAST_POST_AUTHOR_FULL} &laquo; <a href="{searchresults.U_LAST_POST}" title="{L_GOTO_LAST_POST}">{searchresults.LAST_POST_TIME}</a>
+									<br />{L_POSTED} {L_IN} <a href="{searchresults.U_VIEW_FORUM}">{searchresults.FORUM_TITLE}</a>
+								</div>
+							<!-- IF searchresults.TOPIC_REPLIES --><span class="responsive-show left-box" style="display: none;">{L_REPLIES}{L_COLON} <strong>{searchresults.TOPIC_REPLIES}</strong></span><!-- ENDIF -->
+							<!-- ENDIF -->
+
+							<div class="responsive-hide">
+								<!-- IF searchresults.S_HAS_POLL --><i class="icon fa-bar-chart fa-fw" aria-hidden="true"></i><!-- ENDIF -->
+								<!-- IF searchresults.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i><!-- ENDIF -->
+								{L_POST_BY_AUTHOR} {searchresults.TOPIC_AUTHOR_FULL} &raquo; {searchresults.FIRST_POST_TIME} &raquo; {L_IN} <a href="{searchresults.U_VIEW_FORUM}">{searchresults.FORUM_TITLE}</a>
+							</div>
+
 							<!-- IF .searchresults.pagination -->
 							<div class="pagination">
+								<span><i class="icon fa-clone fa-fw" aria-hidden="true"></i></span>
 								<ul>
 								<!-- BEGIN pagination -->
 									<!-- IF searchresults.pagination.S_IS_PREV -->
 									<!-- ELSEIF searchresults.pagination.S_IS_CURRENT --><li class="active"><span>{searchresults.pagination.PAGE_NUMBER}</span></li>
 									<!-- ELSEIF searchresults.pagination.S_IS_ELLIPSIS --><li class="ellipsis"><span>{L_ELLIPSIS}</span></li>
 									<!-- ELSEIF searchresults.pagination.S_IS_NEXT -->
-									<!-- ELSE --><li><a href="{searchresults.pagination.PAGE_URL}">{searchresults.pagination.PAGE_NUMBER}</a></li>
+									<!-- ELSE --><li><a class="button" href="{searchresults.pagination.PAGE_URL}">{searchresults.pagination.PAGE_NUMBER}</a></li>
 									<!-- ENDIF -->
 								<!-- END pagination -->
 								</ul>
 							</div>
 							<!-- ENDIF -->
-							<!-- IF searchresults.S_HAS_POLL -->{POLL_IMG} <!-- ENDIF -->
 							<!-- EVENT topiclist_row_topic_title_after -->
-							{L_POST_BY_AUTHOR} {searchresults.TOPIC_AUTHOR_FULL} &raquo; {searchresults.FIRST_POST_TIME} &raquo; {L_IN} <a href="{searchresults.U_VIEW_FORUM}">{searchresults.FORUM_TITLE}</a>
-							<!-- EVENT topiclist_row_append -->
 
+							<!-- EVENT topiclist_row_append -->
 						</div>
 					</dt>
-					<dd class="posts">{searchresults.TOPIC_REPLIES}</dd>
-					<dd class="views">{searchresults.TOPIC_VIEWS}</dd>
-					<dd class="lastpost"><span>
-						{L_POST_BY_AUTHOR} {searchresults.LAST_POST_AUTHOR_FULL}
-						<!-- IF not S_IS_BOT --><a href="{searchresults.U_LAST_POST}" title="{L_GOTO_LAST_POST}">{LAST_POST_IMG}</a> <!-- ENDIF --><br />{searchresults.LAST_POST_TIME}<br /> </span>
+					<dd class="posts">{searchresults.TOPIC_REPLIES} <dfn>{L_REPLIES}</dfn></dd>
+					<dd class="views">{searchresults.TOPIC_VIEWS} <dfn>{L_VIEWS}</dfn></dd>
+					<dd class="lastpost">
+						<span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {searchresults.LAST_POST_AUTHOR_FULL}
+							<!-- IF not S_IS_BOT -->
+								<a href="{searchresults.U_LAST_POST}" title="{L_GOTO_LAST_POST}">
+									<i class="icon fa-external-link-square fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{VIEW_LATEST_POST}</span>
+								</a>
+							<!-- ENDIF -->
+							<br />{searchresults.LAST_POST_TIME}
+						</span>
 					</dd>
 				</dl>
 			</li>
@@ -150,7 +198,11 @@
 
 	<!-- IF not searchresults.S_IGNORE_POST -->
 		<ul class="searchresults">
-			<li ><a href="{searchresults.U_VIEW_POST}" class="arrow-{S_CONTENT_FLOW_END}">{L_JUMP_TO_POST}</a></li>
+			<li>
+				<a href="{searchresults.U_VIEW_POST}" class="arrow-{S_CONTENT_FLOW_END}">
+					<i class="icon fa-angle-{S_CONTENT_FLOW_END} fa-fw icon-black" aria-hidden="true"></i><span>{L_JUMP_TO_POST}</span>
+				</a>
+			</li>
 		</ul>
 	<!-- ENDIF -->
 
@@ -166,24 +218,13 @@
 	<!-- END searchresults -->
 <!-- ENDIF -->
 
-<!-- IF .pagination or .searchresults or S_SELECT_SORT_KEY or S_SELECT_SORT_DAYS -->
+<div class="action-bar bottom">
+	<!-- IF .searchresults and (S_SELECT_SORT_DAYS or S_SELECT_SORT_KEY) -->
 	<form method="post" action="{S_SEARCH_ACTION}">
-
-	<fieldset class="display-options">
-		<!-- IF S_SELECT_SORT_DAYS or S_SELECT_SORT_KEY -->
-			<label><!-- IF S_SHOW_TOPICS -->{L_DISPLAY_POSTS}<!-- ELSE -->{L_SORT_BY}</label><label><!-- ENDIF --> {S_SELECT_SORT_DAYS}<!-- IF S_SELECT_SORT_KEY --></label> <label>{S_SELECT_SORT_KEY}</label>
-			<label>{S_SELECT_SORT_DIR}<!-- ENDIF --></label>
-			<input type="submit" name="sort" value="{L_GO}" class="button2" />
-		<!-- ENDIF -->
-	</fieldset>
-
+		<!-- INCLUDE display_options.html -->
 	</form>
+		<!-- ENDIF -->
 
-	<hr />
-<!-- ENDIF -->
-
-<!-- IF .pagination or .searchresults or PAGE_NUMBER -->
-<div class="action-bar bottom">
 	<div class="pagination">
 		{SEARCH_MATCHES}
 		<!-- IF .pagination -->
@@ -193,7 +234,6 @@
 		<!-- ENDIF -->
 	</div>
 </div>
-<!-- ENDIF -->
 
 <!-- INCLUDE jumpbox.html -->
 
--- a/styles/prosilver/template/simple_footer.html
+++ b/styles/prosilver/template/simple_footer.html
@@ -5,17 +5,21 @@
 		<!-- IF DEBUG_OUTPUT --><br />{DEBUG_OUTPUT}<!-- ENDIF -->
 	</div>
 
-	<div id="darkenwrapper" data-ajax-error-title="{L_AJAX_ERROR_TITLE}" data-ajax-error-text="{L_AJAX_ERROR_TEXT}" data-ajax-error-text-abort="{L_AJAX_ERROR_TEXT_ABORT}" data-ajax-error-text-timeout="{L_AJAX_ERROR_TEXT_TIMEOUT}" data-ajax-error-text-parsererror="{L_AJAX_ERROR_TEXT_PARSERERROR}">
-		<div id="darken">&nbsp;</div>
+	<div id="darkenwrapper" class="darkenwrapper" data-ajax-error-title="{L_AJAX_ERROR_TITLE}" data-ajax-error-text="{L_AJAX_ERROR_TEXT}" data-ajax-error-text-abort="{L_AJAX_ERROR_TEXT_ABORT}" data-ajax-error-text-timeout="{L_AJAX_ERROR_TEXT_TIMEOUT}" data-ajax-error-text-parsererror="{L_AJAX_ERROR_TEXT_PARSERERROR}">
+		<div id="darken" class="darken">&nbsp;</div>
 	</div>
-	<div id="loading_indicator"></div>
+	<div id="loading_indicator" class="loading_indicator"></div>
 
 	<div id="phpbb_alert" class="phpbb_alert" data-l-err="{L_ERROR}" data-l-timeout-processing-req="{L_TIMEOUT_PROCESSING_REQ}">
-		<a href="#" class="alert_close"></a>
+		<a href="#" class="alert_close">
+			<i class="icon fa-times-circle fa-fw" aria-hidden="true"></i>
+		</a>
 		<h3 class="alert_title"></h3><p class="alert_text"></p>
 	</div>
-	<div id="phpbb_confirm" class="phpbb_alert">
-		<a href="#" class="alert_close"></a>
+	<div id="phpbb_confirm" class="phpbb_confirm phpbb_alert">
+		<a href="#" class="alert_close">
+			<i class="icon fa-times-circle fa-fw" aria-hidden="true"></i>
+		</a>
 		<div class="alert_text"></div>
 	</div>
 </div>
--- a/styles/prosilver/template/simple_header.html
+++ b/styles/prosilver/template/simple_header.html
@@ -23,9 +23,9 @@
 	})(document);
 </script>
 <!-- ENDIF -->
+<link href="{T_FONT_AWESOME_LINK}" rel="stylesheet">
 <link href="{T_STYLESHEET_LINK}" rel="stylesheet">
 <link href="{T_STYLESHEET_LANG_LINK}" rel="stylesheet">
-<link href="{T_THEME_PATH}/responsive.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" media="all and (max-width: 700px)">
 
 <!-- IF S_CONTENT_DIRECTION eq 'rtl' -->
 	<link href="{T_THEME_PATH}/bidi.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet">
@@ -49,6 +49,6 @@
 
 <!-- EVENT simple_header_body_before -->
 
-<div id="wrap">
-	<a id="top" class="anchor" accesskey="t"></a>
-	<div id="page-body" role="main">
+<div id="wrap" class="wrap">
+	<a id="top" class="top-anchor" accesskey="t"></a>
+	<div id="page-body" class="page-body" role="main">
--- a/styles/prosilver/template/timezone_option.html
+++ b/styles/prosilver/template/timezone_option.html
@@ -12,7 +12,7 @@
 	</dd>
 	<!-- ENDIF -->
 	<dd>
-		<select name="tz" id="timezone" class="autowidth tz_select">
+		<select name="tz" id="timezone" class="autowidth tz_select timezone">
 			<option value="">{L_SELECT_TIMEZONE}</option>
 			<!-- BEGIN timezone_select -->
 			<optgroup label="{timezone_select.LABEL}" data-tz-value="{timezone_select.VALUE}">
--- a/styles/prosilver/template/ucp_attachments.html
+++ b/styles/prosilver/template/ucp_attachments.html
@@ -6,21 +6,21 @@
 
 <div class="panel">
 	<div class="inner">
-	
+
 	<p>{L_ATTACHMENTS_EXPLAIN}</p>
 
 	<!-- IF .attachrow -->
 		<div class="action-bar top">
 			<div class="pagination">
 				{NUM_ATTACHMENTS}
-				<!-- IF .pagination --> 
+				<!-- IF .pagination -->
 					<!-- INCLUDE pagination.html -->
-				<!-- ELSE --> 
+				<!-- ELSE -->
 					 &bull; {PAGE_NUMBER}
 				<!-- ENDIF -->
 			</div>
 		</div>
-		
+
 		<ul class="topiclist">
 			<li class="header">
 				<dl>
@@ -50,21 +50,15 @@
 		<!-- END attachrow -->
 		</ul>
 
-		<fieldset class="display-options">
-			<label for="sk">{L_SORT_BY}{L_COLON} <select name="sk" id="sk">{S_SORT_OPTIONS}</select></label> 
-			<label><select name="sd" id="sd">{S_ORDER_SELECT}</select></label>
-			<input class="button2" type="submit" name="sort" value="{L_SORT}" />
+		<div class="action-bar bottom">
+			<!-- INCLUDE display_options.html -->
 			{S_FORM_TOKEN}
-		</fieldset>
 
-		<hr />
-
-		<div class="action-bar bottom">
 			<div class="pagination">
 				{TOTAL_ATTACHMENTS} {L_TITLE}
-				<!-- IF .pagination --> 
+				<!-- IF .pagination -->
 					<!-- INCLUDE pagination.html -->
-				<!-- ELSE --> 
+				<!-- ELSE -->
 					 &bull; {PAGE_NUMBER}
 				<!-- ENDIF -->
 			</div>
@@ -76,9 +70,9 @@
 
 	</div>
 </div>
-	
+
 <!-- IF S_ATTACHMENT_ROWS -->
-	<fieldset class="display-actions">	
+	<fieldset class="display-actions">
 		<input class="button2" type="submit" name="delete" value="{L_DELETE_MARKED}" />
 		<div><a href="#" onclick="marklist('ucp', 'attachment', true); return false;">{L_MARK_ALL}</a> &bull; <a href="#" onclick="marklist('ucp', 'attachment', false); return false;">{L_UNMARK_ALL}</a></div>
 		{S_FORM_TOKEN}
--- a/styles/prosilver/template/ucp_avatar_options_local.html
+++ b/styles/prosilver/template/ucp_avatar_options_local.html
@@ -6,7 +6,7 @@
 </select></label>
 <input type="submit" value="{L_GO}" name="avatar_local_go" class="button2" />
 
-<div id="gallery">
+<div id="gallery" class="gallery">
 <!-- BEGIN avatar_local_row -->
 <!-- BEGIN avatar_local_col -->
 	<label for="av-{avatar_local_row.S_ROW_COUNT}-{avatar_local_row.avatar_local_col.S_ROW_COUNT}"><img src="{avatar_local_row.avatar_local_col.AVATAR_IMAGE}" alt="" /><br />
--- a/styles/prosilver/template/ucp_groups_manage.html
+++ b/styles/prosilver/template/ucp_groups_manage.html
@@ -33,9 +33,9 @@
 		<dl>
 			<dt><label for="group_type1">{L_GROUP_TYPE}{L_COLON}</label><br /><span>{L_GROUP_TYPE_EXPLAIN}</span></dt>
 			<dd>
-				<label for="group_type1"><input type="radio" class="radio" name="group_type" id="group_type1" value="{GROUP_TYPE_FREE}"{GROUP_FREE} /> {L_GROUP_OPEN}</label> 
-				<label for="group_type2"><input type="radio" class="radio" name="group_type" id="group_type2" value="{GROUP_TYPE_OPEN}"{GROUP_OPEN} /> {L_GROUP_REQUEST}</label> 
-				<label for="group_type3"><input type="radio" class="radio" name="group_type" id="group_type3" value="{GROUP_TYPE_CLOSED}"{GROUP_CLOSED} /> {L_GROUP_CLOSED}</label> 
+				<label for="group_type1"><input type="radio" class="radio" name="group_type" id="group_type1" value="{GROUP_TYPE_FREE}"{GROUP_FREE} /> {L_GROUP_OPEN}</label>
+				<label for="group_type2"><input type="radio" class="radio" name="group_type" id="group_type2" value="{GROUP_TYPE_OPEN}"{GROUP_OPEN} /> {L_GROUP_REQUEST}</label>
+				<label for="group_type3"><input type="radio" class="radio" name="group_type" id="group_type3" value="{GROUP_TYPE_CLOSED}"{GROUP_CLOSED} /> {L_GROUP_CLOSED}</label>
 				<label for="group_type4"><input type="radio" class="radio" name="group_type" id="group_type4" value="{GROUP_TYPE_HIDDEN}"{GROUP_HIDDEN} /> {L_GROUP_HIDDEN}</label>
 			</dd>
 		</dl>
@@ -58,7 +58,7 @@
 			<input name="group_colour" type="text" id="group_colour" value="{GROUP_COLOUR}" size="6" maxlength="6" class="inputbox narrow" />
 			<span style="background-color: #{GROUP_COLOUR};">&nbsp;&nbsp;&nbsp;</span>
 			[ <a href="#" id="color_palette_toggle">{L_COLOUR_SWATCH}</a> ]
-			<div id="color_palette_placeholder" class="hidden" data-orientation="h" data-height="12" data-width="15" data-target="#group_colour"></div>
+			<div id="color_palette_placeholder" class="color_palette_placeholder hidden" data-orientation="h" data-height="12" data-width="15" data-target="#group_colour"></div>
 		</dd>
 	</dl>
 	<dl>
@@ -74,7 +74,7 @@
 
 <fieldset class="submit-buttons">
 	{S_HIDDEN_FIELDS}
-	<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp; 
+	<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp;
 	<input type="submit" name="update" value="{L_SUBMIT}" class="button1" />
 	{S_FORM_TOKEN}
 </fieldset>
@@ -160,8 +160,8 @@
 	</table>
 
 	<!-- IF .pagination -->
-	<div class="action-bar bottom">
-		<div class="pagination"> 
+	<div class="action-bar bar-bottom">
+		<div class="pagination">
 			<!-- INCLUDE pagination.html -->
 		</div>
 	</div>
@@ -170,7 +170,7 @@
 	</div>
 </div>
 
-<fieldset class="display-actions">	
+<fieldset class="display-actions">
 	<select name="action"><option value="">{L_SELECT_OPTION}</option>{S_ACTION_OPTIONS}</select>
 	<input class="button2" type="submit" name="update" value="{L_SUBMIT}" />
 	<div><a href="#" onclick="marklist('ucp', 'mark', true); return false;">{L_MARK_ALL}</a> &bull; <a href="#" onclick="marklist('ucp', 'mark', false); return false;">{L_UNMARK_ALL}</a></div>
@@ -187,7 +187,7 @@
 	<dl>
 		<dt><label for="default0">{L_USER_GROUP_DEFAULT}{L_COLON}</label><br /><span>{L_USER_GROUP_DEFAULT_EXPLAIN}</span></dt>
 		<dd>
-			<label for="default1"><input type="radio" name="default" id="default1" value="1" /> {L_YES}</label> 
+			<label for="default1"><input type="radio" name="default" id="default1" value="1" /> {L_YES}</label>
 			<label for="default0"><input type="radio" name="default" id="default0" value="0" checked="checked" /> {L_NO}</label>
 		</dd>
 	</dl>
--- a/styles/prosilver/template/ucp_groups_membership.html
+++ b/styles/prosilver/template/ucp_groups_membership.html
@@ -55,7 +55,7 @@
 		<!-- BEGIN member -->
 		<!-- IF not member.GROUP_SPECIAL -->
 			<!-- DEFINE $SHOW_BUTTONS = 1 -->
-		<!-- ENDIF -->		
+		<!-- ENDIF -->
 		<li class="row<!-- IF member.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
 			<dl>
 				<dt>
@@ -73,11 +73,11 @@
 		</ul>
 	<!-- ENDIF -->
 	</div>
-</div>	
+</div>
 
 <!-- IF .pending -->
 <div class="panel">
-	<div class="inner">	
+	<div class="inner">
 		<ul class="topiclist two-columns">
 			<li class="header">
 				<dl>
@@ -91,7 +91,7 @@
 		<!-- BEGIN pending -->
 		<!-- IF not pending.GROUP_SPECIAL -->
 			<!-- DEFINE $SHOW_BUTTONS = 1 -->
-		<!-- ENDIF -->			
+		<!-- ENDIF -->
 		<li class="row<!-- IF pending.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
 			<dl>
 				<dt>
@@ -125,7 +125,7 @@
 		<!-- BEGIN nonmember -->
 		<!-- IF nonmember.S_CAN_JOIN -->
 			<!-- DEFINE $SHOW_BUTTONS = 1 -->
-		<!-- ENDIF -->		
+		<!-- ENDIF -->
 		<li class="row<!-- IF nonmember.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
 			<dl>
 				<dt>
@@ -143,7 +143,7 @@
 		</div>
 	</div>
 <!-- ENDIF -->
-	
+
 
 	<!-- IF S_CHANGE_DEFAULT or $SHOW_BUTTONS eq 1 -->
 	<fieldset>
@@ -156,7 +156,7 @@
 
 		<!-- IF $SHOW_BUTTONS eq 1 -->
 		<div class="right-box">
-			<label for="action">{L_SELECT}{L_COLON}</label> 
+			<label for="action">{L_SELECT}{L_COLON}</label>
 			<select name="action" id="action">
 				<option value="join">{L_JOIN_SELECTED}</option>
 				<option value="resign">{L_RESIGN_SELECTED}</option>
--- a/styles/prosilver/template/ucp_header.html
+++ b/styles/prosilver/template/ucp_header.html
@@ -2,7 +2,7 @@
 
 <h2 class="ucp-title">{L_UCP}</h2>
 
-<div id="tabs">
+<div id="tabs" class="tabs">
 	<ul>
 		<!-- BEGIN t_block1 -->
 		<li class="tab<!-- IF t_block1.S_SELECTED --> activetab<!-- ENDIF -->"><a href="{t_block1.U_TITLE}">{t_block1.L_TITLE}</a></li>
@@ -19,15 +19,15 @@
 
 	<div style="width: 100%;">
 
-	<div id="cp-menu">
-		<div id="navigation" role="navigation">
+	<div id="cp-menu" class="cp-menu">
+		<div id="navigation" class="navigation" role="navigation">
 
 		<!-- IF S_PRIVMSGS -->
 			<!-- BEGIN t_block2 -->
 				<!-- IF S_PRIVMSGS and not t_block2.S_LAST_ROW -->
 				<ul>
 					<!-- IF t_block2.S_SELECTED -->
-						<li id="active-subsection"><a href="{t_block2.U_TITLE}"><span>{t_block2.L_TITLE}</span></a></li>
+						<li id="active-subsection" class="active-subsection"><a href="{t_block2.U_TITLE}"><span>{t_block2.L_TITLE}</span></a></li>
 					<!-- ELSE -->
 						<li><a href="{t_block2.U_TITLE}"><span>{t_block2.L_TITLE}</span></a></li>
 					<!-- ENDIF -->
@@ -39,7 +39,7 @@
 			<!-- BEGIN folder -->
 				<!-- IF folder.S_FIRST_ROW --><ul><!-- ENDIF -->
 				<!-- IF folder.S_CUR_FOLDER -->
-					<li id="active-subsection"><a href="{folder.U_FOLDER}"><!-- IF folder.UNREAD_MESSAGES > 0 --><strong>{folder.FOLDER_NAME} ({folder.UNREAD_MESSAGES})</strong><!-- ELSE -->{folder.FOLDER_NAME}<!-- ENDIF --></a></li>
+					<li id="active-subsection" class="active-subsection"><a href="{folder.U_FOLDER}"><!-- IF folder.UNREAD_MESSAGES > 0 --><strong>{folder.FOLDER_NAME} ({folder.UNREAD_MESSAGES})</strong><!-- ELSE -->{folder.FOLDER_NAME}<!-- ENDIF --></a></li>
 				<!-- ELSE -->
 					<li><a href="{folder.U_FOLDER}"><span><!-- IF folder.UNREAD_MESSAGES > 0 --><strong>{folder.FOLDER_NAME} ({folder.UNREAD_MESSAGES})</strong><!-- ELSE -->{folder.FOLDER_NAME}<!-- ENDIF --></span></a></li>
 				<!-- ENDIF -->
@@ -52,7 +52,7 @@
 		<!-- BEGIN t_block2 -->
 			<!-- IF (S_PRIVMSGS and t_block2.S_LAST_ROW) or not S_PRIVMSGS -->
 				<!-- IF t_block2.S_SELECTED -->
-					<li id="active-subsection"><a href="{t_block2.U_TITLE}"><span>{t_block2.L_TITLE}</span></a></li>
+					<li id="active-subsection" class="active-subsection"><a href="{t_block2.U_TITLE}"><span>{t_block2.L_TITLE}</span></a></li>
 				<!-- ELSE -->
 					<li><a href="{t_block2.U_TITLE}"><span>{t_block2.L_TITLE}</span></a></li>
 				<!-- ENDIF -->
@@ -98,4 +98,4 @@
 
 	</div>
 
-	<div id="cp-main" class="ucp-main panel-container">
+	<div id="cp-main" class="cp-main ucp-main panel-container">
--- a/styles/prosilver/template/ucp_main_bookmarks.html
+++ b/styles/prosilver/template/ucp_main_bookmarks.html
@@ -16,7 +16,7 @@
 <!-- IF .topicrow -->
 	<ul class="topiclist missing-column">
 		<li class="header">
-			<dl class="icon">
+			<dl class="row-item">
 				<dt><div class="list-inner">{L_BOOKMARKS}</div></dt>
 				<dd class="lastpost"><span>{L_LAST_POST}</span></dd>
 				<dd class="mark">{L_MARK}</dd>
@@ -34,13 +34,26 @@
 					<dd class="mark"><input type="checkbox" name="t[{topicrow.TOPIC_ID}]" id="t{topicrow.TOPIC_ID}" /></dd>
 				</dl>
 			<!-- ELSE -->
-			<dl class="icon {topicrow.TOPIC_IMG_STYLE}">
+			<dl class="row-item {topicrow.TOPIC_IMG_STYLE}">
 				<dt<!-- IF topicrow.TOPIC_ICON_IMG --> style="background-image: url({T_ICONS_PATH}{topicrow.TOPIC_ICON_IMG}); background-repeat: no-repeat;"<!-- ENDIF --> title="{topicrow.TOPIC_FOLDER_IMG_ALT}">
-					<!-- IF topicrow.S_UNREAD_TOPIC --><a href="{topicrow.U_NEWEST_POST}" class="icon-link"></a><!-- ENDIF -->
+					<!-- IF topicrow.S_UNREAD_TOPIC --><a href="{topicrow.U_NEWEST_POST}" class="row-item-link"></a><!-- ENDIF -->
 					<div class="list-inner">
-						<!-- IF topicrow.S_UNREAD_TOPIC --><a href="{topicrow.U_NEWEST_POST}">{NEWEST_POST_IMG}</a> <!-- ENDIF --><a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a>
-						<!-- IF topicrow.S_TOPIC_UNAPPROVED or topicrow.S_POSTS_UNAPPROVED --><a href="{topicrow.U_MCP_QUEUE}">{topicrow.UNAPPROVED_IMG}</a> <!-- ENDIF -->
-						<!-- IF topicrow.S_TOPIC_REPORTED --><a href="{topicrow.U_MCP_REPORT}">{REPORTED_IMG}</a><!-- ENDIF --><br />
+						<!-- IF topicrow.S_UNREAD_TOPIC -->
+							<a class="unread" href="{topicrow.U_NEWEST_POST}">
+								<i class="icon fa-file fa-fw icon-red icon-md" aria-hidden="true"></i><span class="sr-only">{NEW_POST}</span>
+							</a>
+						<!-- ENDIF --><a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a>
+						<!-- IF topicrow.S_TOPIC_UNAPPROVED or topicrow.S_POSTS_UNAPPROVED -->
+							<a href="{topicrow.U_MCP_QUEUE}" title="{L_TOPIC_UNAPPROVED}">
+								<i class="icon fa-question fa-fw icon-blue" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_UNAPPROVED}</span>
+							</a>
+						<!-- ENDIF -->
+						<!-- IF topicrow.S_TOPIC_REPORTED -->
+							<a href="{topicrow.U_MCP_REPORT}" title="{L_TOPIC_REPORTED}">
+								<i class="icon fa-exclamation fa-fw icon-red" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_REPORTED}</span>
+							</a>
+						<!-- ENDIF -->
+						<br />
 						<!-- IF .topicrow.pagination -->
 						<div class="pagination">
 							<ul>
@@ -56,18 +69,21 @@
 						</div>
 						<!-- ENDIF -->
 						<div class="responsive-hide">
-							<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
+							<!-- IF topicrow.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <!-- ENDIF -->
 							{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
 						</div>
 						<div class="responsive-show" style="display: none;">
-							<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
+							<!-- IF topicrow.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <!-- ENDIF -->
 							{L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} &laquo;
 							<a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}">{topicrow.LAST_POST_TIME}</a>
 						</div>
 					</div>
 				</dt>
 				<dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}
-					<a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}">{LAST_POST_IMG}</a> <br />{topicrow.LAST_POST_TIME}</span>
+					<a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}">
+						<i class="icon fa-external-link-square fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{VIEW_LATEST_POST}</span>
+					</a>
+					<br />{topicrow.LAST_POST_TIME}</span>
 				</dd>
 				<dd class="mark"><input type="checkbox" name="t[{topicrow.TOPIC_ID}]" id="t{topicrow.TOPIC_ID}" /></dd>
 			</dl>
@@ -76,12 +92,12 @@
 	<!-- END topicrow -->
 	</ul>
 
-	<div class="action-bar bottom">
+	<div class="action-bar bar-bottom">
 		<div class="pagination">
 			{TOTAL_TOPICS}
-			<!-- IF .pagination --> 
+			<!-- IF .pagination -->
 				<!-- INCLUDE pagination.html -->
-			<!-- ELSE --> 
+			<!-- ELSE -->
 				 &bull; {PAGE_NUMBER}
 			<!-- ENDIF -->
 		</div>
--- a/styles/prosilver/template/ucp_main_front.html
+++ b/styles/prosilver/template/ucp_main_front.html
@@ -13,11 +13,16 @@
 	<ul class="topiclist cplist two-long-columns">
 	<!-- BEGIN topicrow -->
 		<li class="row<!-- IF topicrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
-			<dl class="icon {topicrow.TOPIC_IMG_STYLE}">
+			<dl class="row-item {topicrow.TOPIC_IMG_STYLE}">
 				<dt <!-- IF topicrow.TOPIC_ICON_IMG -->style="background-image: url({T_ICONS_PATH}{topicrow.TOPIC_ICON_IMG}); background-repeat: no-repeat;"<!-- ENDIF -->>
-					<!-- IF topicrow.S_UNREAD_TOPIC --><a href="{topicrow.U_NEWEST_POST}" class="icon-link"></a><!-- ENDIF -->
+					<!-- IF topicrow.S_UNREAD_TOPIC --><a href="{topicrow.U_NEWEST_POST}" class="row-item-link"></a><!-- ENDIF -->
 					<div class="list-inner">
-						<!-- IF topicrow.S_UNREAD --><a href="{topicrow.U_NEWEST_POST}">{NEWEST_POST_IMG}</a> <!-- ENDIF --><a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a><br />
+						<!-- IF topicrow.S_UNREAD -->
+							<a class="unread" href="{topicrow.U_NEWEST_POST}">
+								<i class="icon fa-file fa-fw icon-red icon-md" aria-hidden="true"></i><span class="sr-only">{NEW_POST}</span>
+							</a>
+						<!-- ENDIF -->
+						<a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a><br />
 						<!-- IF .topicrow.pagination -->
 						<div class="pagination">
 							<ul>
@@ -33,17 +38,22 @@
 						</div>
 						<!-- ENDIF -->
 						<div class="responsive-hide">
-							<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
+							<!-- IF topicrow.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <!-- ENDIF -->
 							{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
 						</div>
 						<div class="responsive-show" style="display: none;">
-							<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
+							<!-- IF topicrow.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <!-- ENDIF -->
 							{L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} &laquo; <a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}">{topicrow.LAST_POST_TIME}</a>
 						</div>
 					</div>
 				</dt>
-				<dd class="lastpost"><span>{L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}
-					<a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}">{LAST_POST_IMG}</a> <br />{topicrow.LAST_POST_TIME}</span>
+				<dd class="lastpost">
+					<span>{L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}
+						<a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}">
+							<i class="icon fa-external-link-square fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{VIEW_LATEST_POST}</span>
+						</a>
+						<br />{topicrow.LAST_POST_TIME}
+					</span>
 				</dd>
 			</dl>
 		</li>
@@ -55,12 +65,14 @@
 
 <!-- EVENT ucp_main_front_user_activity_before -->
 	<dl class="details">
+		<!-- EVENT ucp_main_front_user_activity_prepend -->
 		<dt>{L_JOINED}{L_COLON}</dt> <dd>{JOINED}</dd>
 		<dt>{L_LAST_ACTIVE}{L_COLON}</dt> <dd>{LAST_VISIT_YOU}</dd>
 		<dt>{L_TOTAL_POSTS}{L_COLON}</dt> <dd><!-- IF POSTS_PCT -->{POSTS}<!-- IF S_DISPLAY_SEARCH --> | <strong><a href="{U_SEARCH_USER}">{L_SEARCH_YOUR_POSTS}</a></strong><!-- ENDIF --><br />({POSTS_DAY} / {POSTS_PCT})<!-- ELSE -->{POSTS}<!-- ENDIF --></dd>
 		<!-- IF ACTIVE_FORUM != '' --><dt>{L_ACTIVE_IN_FORUM}{L_COLON}</dt> <dd><strong><a href="{U_ACTIVE_FORUM}">{ACTIVE_FORUM}</a></strong><br />({ACTIVE_FORUM_POSTS} / {ACTIVE_FORUM_PCT})</dd><!-- ENDIF -->
 		<!-- IF ACTIVE_TOPIC != '' --><dt>{L_ACTIVE_IN_TOPIC}{L_COLON}</dt> <dd><strong><a href="{U_ACTIVE_TOPIC}">{ACTIVE_TOPIC}</a></strong><br />({ACTIVE_TOPIC_POSTS} / {ACTIVE_TOPIC_PCT})</dd><!-- ENDIF -->
-		<!-- IF WARNINGS --><dt>{L_YOUR_WARNINGS}{L_COLON}</dt> <dd class="error">{WARNING_IMG} [{WARNINGS}]</dd><!-- ENDIF -->
+		<!-- IF WARNINGS --><dt>{L_YOUR_WARNINGS}{L_COLON}</dt> <dd class="error"><i class="icon fa-exclamation-triangle fa-fw icon-red" aria-hidden="true"></i> [{WARNINGS}]</dd><!-- ENDIF -->
+		<!-- EVENT ucp_main_front_user_activity_append -->
 	</dl>
 <!-- EVENT ucp_main_front_user_activity_after -->
 
--- a/styles/prosilver/template/ucp_main_subscribed.html
+++ b/styles/prosilver/template/ucp_main_subscribed.html
@@ -11,7 +11,7 @@
 <!-- IF .forumrow -->
 	<ul class="topiclist missing-column">
 		<li class="header">
-			<dl class="icon">
+			<dl class="row-item">
 				<dt><div class="list-inner">{L_WATCHED_FORUMS}</div></dt>
 				<dd class="lastpost"><span>{L_LAST_POST}</span></dd>
 				<dd class="mark">{L_MARK}</dd>
@@ -22,22 +22,29 @@
 
 	<!-- BEGIN forumrow -->
 		<li class="row<!-- IF forumrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
-			<dl class="icon {forumrow.FORUM_IMG_STYLE}">
+			<dl class="row-item {forumrow.FORUM_IMG_STYLE}">
 				<dt>
-					<!-- IF forumrow.S_UNREAD_FORUM --><a href="{forumrow.U_VIEWFORUM}" class="icon-link"></a><!-- ENDIF -->
+					<!-- IF forumrow.S_UNREAD_FORUM --><a href="{forumrow.U_VIEWFORUM}" class="row-item-link"></a><!-- ENDIF -->
 					<div class="list-inner">
 						<a href="{forumrow.U_VIEWFORUM}" class="forumtitle">{forumrow.FORUM_NAME}</a><br />
 						{forumrow.FORUM_DESC}
 						<!-- IF forumrow.LAST_POST_TIME -->
 						<div class="responsive-show" style="display: none;">
-							{L_LAST_POST} {L_POST_BY_AUTHOR} {forumrow.LAST_POST_AUTHOR_FULL} &laquo; <a href="{topicrow.U_LAST_POST}">{forumrow.LAST_POST_TIME}</a>
+							{L_LAST_POST} {L_POST_BY_AUTHOR} {forumrow.LAST_POST_AUTHOR_FULL} &laquo; <a href="{forumrow.U_LAST_POST}">{forumrow.LAST_POST_TIME}</a>
 						</div>
 						<!-- ENDIF -->
 					</div>
 				</dt>
-				<dd class="lastpost"><!-- IF forumrow.LAST_POST_TIME --><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {forumrow.LAST_POST_AUTHOR_FULL}
-					<a href="{forumrow.U_LAST_POST}">{LAST_POST_IMG}</a> <br />{forumrow.LAST_POST_TIME}</span>
-					<!-- ELSE -->{L_NO_POSTS}<br />&nbsp;<!-- ENDIF -->
+				<dd class="lastpost">
+					<!-- IF forumrow.LAST_POST_TIME -->
+						<span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {forumrow.LAST_POST_AUTHOR_FULL}
+							<a href="{forumrow.U_LAST_POST}">
+								<i class="icon fa-external-link-square fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{VIEW_LATEST_POST}</span>
+							</a>
+							<br />{forumrow.LAST_POST_TIME}</span>
+					<!-- ELSE -->
+						{L_NO_POSTS}<br />&nbsp;
+					<!-- ENDIF -->
 				</dd>
 				<dd class="mark"><input type="checkbox" name="f[{forumrow.FORUM_ID}]" id="f{forumrow.FORUM_ID}" /></dd>
 			</dl>
@@ -47,7 +54,7 @@
 <!-- ELSEIF S_FORUM_NOTIFY -->
     <ul class="topiclist">
         <li class="header">
-            <dl class="icon">
+            <dl class="row-item">
                 <dt>{L_WATCHED_FORUMS}</dt>
             </dl>
         </li>
@@ -59,7 +66,7 @@
 <!-- IF .topicrow -->
 	<ul class="topiclist missing-column">
 		<li class="header">
-			<dl class="icon">
+			<dl class="row-item">
 				<dt><div class="list-inner">{L_WATCHED_TOPICS}</div></dt>
 				<dd class="lastpost"><span>{L_LAST_POST}</span></dd>
 				<dd class="mark">{L_MARK}</dd>
@@ -70,13 +77,26 @@
 
 	<!-- BEGIN topicrow -->
 		<li class="row<!-- IF topicrow.S_TOPIC_REPORTED --> reported<!-- ELSEIF topicrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
-			<dl class="icon {topicrow.TOPIC_IMG_STYLE}">
+			<dl class="row-item {topicrow.TOPIC_IMG_STYLE}">
 				<dt<!-- IF topicrow.TOPIC_ICON_IMG --> style="background-image: url({T_ICONS_PATH}{topicrow.TOPIC_ICON_IMG}); background-repeat: no-repeat;"<!-- ENDIF --> title="{topicrow.TOPIC_FOLDER_IMG_ALT}">
-					<!-- IF topicrow.S_UNREAD_TOPIC --><a href="{topicrow.U_NEWEST_POST}" class="icon-link"></a><!-- ENDIF -->
+					<!-- IF topicrow.S_UNREAD_TOPIC --><a href="{topicrow.U_NEWEST_POST}" class="row-item-link"></a><!-- ENDIF -->
 					<div class="list-inner">
-						<!-- IF topicrow.S_UNREAD_TOPIC --><a href="{topicrow.U_NEWEST_POST}">{NEWEST_POST_IMG}</a> <!-- ENDIF --><a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a>
-						<!-- IF topicrow.S_TOPIC_UNAPPROVED or topicrow.S_POSTS_UNAPPROVED --><a href="{topicrow.U_MCP_QUEUE}">{topicrow.UNAPPROVED_IMG}</a> <!-- ENDIF -->
-						<!-- IF topicrow.S_TOPIC_REPORTED --><a href="{topicrow.U_MCP_REPORT}">{REPORTED_IMG}</a><!-- ENDIF --><br />
+						<!-- IF topicrow.S_UNREAD_TOPIC -->
+							<a class="unread" href="{topicrow.U_NEWEST_POST}">
+								<i class="icon fa-file fa-fw icon-red icon-md" aria-hidden="true"></i><span class="sr-only">{NEW_POST}</span>
+							</a>
+						<!-- ENDIF --><a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a>
+						<!-- IF topicrow.S_TOPIC_UNAPPROVED or topicrow.S_POSTS_UNAPPROVED -->
+							<a href="{topicrow.U_MCP_QUEUE}" title="{L_TOPIC_UNAPPROVED}">
+								<i class="icon fa-question fa-fw icon-blue" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_UNAPPROVED}</span>
+							</a>
+						<!-- ENDIF -->
+						<!-- IF topicrow.S_TOPIC_REPORTED -->
+							<a href="{topicrow.U_MCP_REPORT}" title="{L_TOPIC_REPORTED}">
+								<i class="icon fa-exclamation fa-fw icon-red" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_REPORTED}</span>
+							</a>
+						<!-- ENDIF -->
+						<br />
 						<!-- IF .topicrow.pagination -->
 						<div class="pagination">
 							<ul>
@@ -92,17 +112,20 @@
 						</div>
 						<!-- ENDIF -->
 						<div class="responsive-hide">
-							<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
+							<!-- IF topicrow.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <!-- ENDIF -->
 							{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
 						</div>
 						<div class="responsive-show" style="display: none;">
-							<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
+							<!-- IF topicrow.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <!-- ENDIF -->
 							{L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} &laquo; <a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}">{topicrow.LAST_POST_TIME}</a>
 						</div>
 					</div>
 				</dt>
 				<dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}
-					<a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}">{LAST_POST_IMG}</a> <br />{topicrow.LAST_POST_TIME}</span>
+					<a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}">
+						<i class="icon fa-external-link-square fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{VIEW_LATEST_POST}</span>
+					</a>
+					<br />{topicrow.LAST_POST_TIME}</span>
 				</dd>
 				<dd class="mark"><input type="checkbox" name="t[{topicrow.TOPIC_ID}]" id="t{topicrow.TOPIC_ID}" /></dd>
 			</dl>
@@ -110,12 +133,12 @@
 	<!-- END topicrow -->
 	</ul>
 
-	<div class="action-bar bottom">
+	<div class="action-bar bar-bottom">
 		<div class="pagination">
 			{TOTAL_TOPICS}
-			<!-- IF .pagination --> 
+			<!-- IF .pagination -->
 				<!-- INCLUDE pagination.html -->
-			<!-- ELSE --> 
+			<!-- ELSE -->
 				 &bull; {PAGE_NUMBER}
 			<!-- ENDIF -->
 		</div>
@@ -124,7 +147,7 @@
 <!-- ELSEIF S_TOPIC_NOTIFY -->
     <ul class="topiclist">
         <li class="header">
-            <dl class="icon">
+            <dl class="row-item">
                 <dt>{L_WATCHED_TOPICS}</dt>
             </dl>
         </li>
--- a/styles/prosilver/template/ucp_notifications.html
+++ b/styles/prosilver/template/ucp_notifications.html
@@ -16,7 +16,6 @@
 						<!-- BEGIN notification_methods -->
 							<th class="mark">{notification_methods.NAME}</th>
 						<!-- END notification_methods -->
-						<th class="mark">{L_NOTIFICATIONS}</th>
 					</tr>
 				</thead>
 				<tbody>
@@ -34,7 +33,6 @@
 							<!-- BEGIN notification_methods -->
 								<td class="mark"><input type="checkbox" name="{notification_types.TYPE}_{notification_methods.METHOD}"<!-- IF notification_methods.SUBSCRIBED --> checked="checked"<!-- ENDIF --> /></td>
 							<!-- END notification_methods -->
-							<td class="mark"><input type="checkbox" name="{notification_types.TYPE}_notification"<!-- IF notification_types.SUBSCRIBED --> checked="checked"<!-- ENDIF --> /></td>
 						</tr>
 					<!-- ENDIF -->
 				<!-- END notification_types -->
@@ -42,7 +40,7 @@
 			</table>
 		<!-- ELSE -->
 			<!-- IF .notification_list -->
-				<div class="action-bar top">
+				<div class="action-bar bar-top">
 					<div class="pagination">
 						<!-- IF U_MARK_ALL --><a href="{U_MARK_ALL}" class="mark">{L_NOTIFICATIONS_MARK_ALL_READ}</a> &bull; <!-- ENDIF -->
 						{L_NOTIFICATIONS} [<strong>{TOTAL_COUNT}</strong>]
@@ -68,12 +66,12 @@
 						<li class="row<!-- IF notification_list.UNREAD --> bg3<!-- ELSE --><!-- IF notification_list.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- ENDIF --><!-- IF notification_list.STYLING --> {notification_list.STYLING}<!-- ENDIF -->">
 							<dl>
 								<dt>
-									<div class="list-inner">										
+									<div class="list-inner">
 										<!-- IF notification_list.AVATAR -->{notification_list.AVATAR}<!-- ELSE --><img src="{T_THEME_PATH}/images/no_avatar.gif" alt="" /><!-- ENDIF -->
 										<div class="notifications">
 											<!-- IF notification_list.URL --><a href="<!-- IF notification_list.UNREAD -->{notification_list.U_MARK_READ}<!-- ELSE -->{notification_list.URL}<!-- ENDIF -->"><!-- ENDIF -->
 											<p class="notifications_title">{notification_list.FORMATTED_TITLE}<!-- IF notification_list.REFERENCE --> {notification_list.REFERENCE}<!-- ENDIF --></p>
-											<!-- IF notification_list.URL --></a><!-- ENDIF -->				
+											<!-- IF notification_list.URL --></a><!-- ENDIF -->
 											<!-- IF notification_list.FORUM --><p class="notifications_forum">{notification_list.FORUM}</p><!-- ENDIF -->
 											<!-- IF notification_list.REASON --><p class="notifications_reason">{notification_list.REASON}</p><!-- ENDIF -->
 											<p class="notifications_time">{notification_list.TIME}</p>
@@ -88,7 +86,7 @@
 				</ul>
 			</div>
 
-			<div class="action-bar bottom">
+			<div class="action-bar bar-bottom">
 				<div class="pagination">
 					{L_NOTIFICATIONS} [<strong>{TOTAL_COUNT}</strong>]
 					<!-- IF .pagination -->
--- a/styles/prosilver/template/ucp_pm_history.html
+++ b/styles/prosilver/template/ucp_pm_history.html
@@ -1,11 +1,11 @@
 
-<h3 id="review">
+<h3 id="review" class="review">
 	<span class="right-box"><a href="#review" onclick="viewableArea(getElementById('topicreview'), true); var rev_text = getElementById('review').getElementsByTagName('a').item(0).firstChild; if (rev_text.data == '{LA_EXPAND_VIEW}'){rev_text.data = '{LA_COLLAPSE_VIEW}'; } else if (rev_text.data == '{LA_COLLAPSE_VIEW}'){rev_text.data = '{LA_EXPAND_VIEW}'};">{L_EXPAND_VIEW}</a></span>
 	{L_MESSAGE_HISTORY}{L_COLON}
 </h3>
 
 <!-- EVENT ucp_pm_history_review_before -->
-<div id="topicreview">
+<div id="topicreview" class="topicreview">
 	<script type="text/javascript">
 	// <![CDATA[
 		bbcodeEnabled = {S_BBCODE_ALLOWED};
@@ -25,8 +25,8 @@
 				<!-- EVENT ucp_pm_history_post_buttons_before -->
 				<!-- IF history_row.U_QUOTE or history_row.MESSAGE_AUTHOR_QUOTE -->
 				<li>
-					<a <!-- IF history_row.U_QUOTE -->href="{history_row.U_QUOTE}"<!-- ELSE -->href="#postingbox" onclick="addquote({history_row.MSG_ID}, '{history_row.MESSAGE_AUTHOR_QUOTE}', '{LA_WROTE}');"<!-- ENDIF --> title="{L_QUOTE} {history_row.MESSAGE_AUTHOR}" class="button icon-button quote-icon">
-						<span>{L_QUOTE} {history_row.MESSAGE_AUTHOR}</span>
+					<a <!-- IF history_row.U_QUOTE -->href="{history_row.U_QUOTE}"<!-- ELSE -->href="#postingbox" onclick="addquote({history_row.MSG_ID}, '{history_row.MESSAGE_AUTHOR_QUOTE}', '{LA_WROTE}', {time:{history_row.MESSAGE_TIME},user_id:{history_row.USER_ID}});"<!-- ENDIF --> title="{L_QUOTE} {history_row.MESSAGE_AUTHOR}" class="button button-icon-only">
+						<i class="icon fa-quote-left fa-fw" aria-hidden="true"></i><span class="sr-only">{L_QUOTE} {history_row.MESSAGE_AUTHOR}</span>
 					</a>
 				</li>
 				<!-- ENDIF -->
@@ -35,8 +35,11 @@
 			<!-- ENDIF -->
 			<!-- EVENT ucp_pm_history_post_buttons_list_after -->
 
-			<p class="author">{history_row.MINI_POST_IMG} {L_SENT_AT}{L_COLON} <strong>{history_row.SENT_DATE}</strong><br />
-				{L_MESSAGE_BY_AUTHOR} {history_row.MESSAGE_AUTHOR_FULL}</p>
+			<p class="author">
+				<span><i class="icon fa-file fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{history_row.MINI_POST}</span></span> {L_SENT_AT}{L_COLON} <strong>{history_row.SENT_DATE}</strong>
+				<br />
+				{L_MESSAGE_BY_AUTHOR} {history_row.MESSAGE_AUTHOR_FULL}
+			</p>
 			<div class="content"><!-- IF history_row.MESSAGE -->{history_row.MESSAGE}<!-- ELSE --><span class="error">{L_MESSAGE_REMOVED_FROM_OUTBOX}</span><!-- ENDIF --></div>
 			<div id="message_{history_row.MSG_ID}" style="display: none;">{history_row.DECODED_MESSAGE}</div>
 		</div>
@@ -48,4 +51,9 @@
 <!-- EVENT ucp_pm_history_review_after -->
 
 <hr />
-<p><a href="#cp-main" class="top2">{L_BACK_TO_TOP}</a></p>
+<p>
+	<a href="#cp-main" class="top">
+		<i class="icon fa-chevron-circle-up fa-fw icon-gray" aria-hidden="true"></i><span>{L_BACK_TO_TOP}</span>
+	</a>
+</p>
+
--- a/styles/prosilver/template/ucp_pm_message_header.html
+++ b/styles/prosilver/template/ucp_pm_message_header.html
@@ -6,38 +6,45 @@
 	<div class="inner">
 	<!-- IF FOLDER_STATUS and FOLDER_MAX_MESSAGES neq 0 --><p>{FOLDER_STATUS}</p><!-- ENDIF -->
 
-	<div class="action-bar top">
+	<div class="action-bar bar-top">
 	<!-- IF U_POST_REPLY_PM or U_POST_NEW_TOPIC or U_FORWARD_PM -->
-		<div class="buttons">
-			<!-- IF U_POST_REPLY_PM -->
-				<a title="{L_POST_REPLY_PM}" href="{U_POST_REPLY_PM}" class="button icon-button pmreply-icon">
-					{L_BUTTON_PM_REPLY}
-				</a>
-			<!-- ELSEIF U_POST_NEW_TOPIC -->
-				<a href="{U_POST_NEW_TOPIC}" accesskey="n" title="{L_UCP_PM_COMPOSE}" class="button icon-button newpm-icon">
-					{L_BUTTON_PM_NEW}
-				</a>
-			<!-- ENDIF -->
-			<!-- IF U_FORWARD_PM -->
-				<a title="{L_POST_FORWARD_PM}" href="{U_FORWARD_PM}" class="button icon-button forwardpm-icon">
-					{L_BUTTON_PM_FORWARD}
-				</a>
-			<!-- ENDIF -->
-			<!-- IF U_POST_REPLY_PM and S_PM_RECIPIENTS gt 1 -->
-				<a title="{L_REPLY_TO_ALL}" href="{U_POST_REPLY_ALL}" class="button icon-button reply-all">
-					{L_BUTTON_PM_REPLY_ALL}
-				</a>
-			<!-- ENDIF -->
-		</div>
+		<!-- IF U_POST_REPLY_PM -->
+			<a title="{L_POST_REPLY_PM}" href="{U_POST_REPLY_PM}" class="button">
+				<span>{L_BUTTON_PM_REPLY}</span> <i class="icon fa-reply fa-fw" aria-hidden="true"></i>
+			</a>
+		<!-- ELSEIF U_POST_NEW_TOPIC -->
+			<a href="{U_POST_NEW_TOPIC}" accesskey="n" title="{L_UCP_PM_COMPOSE}" class="button">
+				<span>{L_BUTTON_PM_NEW}</span> <i class="icon fa-pencil fa-fw" aria-hidden="true"></i>
+			</a>
+		<!-- ENDIF -->
+		<!-- IF U_FORWARD_PM -->
+			<a title="{L_POST_FORWARD_PM}" href="{U_FORWARD_PM}" class="button">
+				<span>{L_BUTTON_PM_FORWARD}</span> <i class="icon fa-mail-forward fa-fw" aria-hidden="true"></i>
+			</a>
+		<!-- ENDIF -->
+		<!-- IF U_POST_REPLY_PM and S_PM_RECIPIENTS gt 1 -->
+			<a title="{L_REPLY_TO_ALL}" href="{U_POST_REPLY_ALL}" class="button">
+				<span>{L_BUTTON_PM_REPLY_ALL}</span> <i class="icon fa-pencil fa-fw" aria-hidden="true"></i>
+			</a>
+		<!-- ENDIF -->
 	<!-- ENDIF -->
 
 	<!-- IF not S_IS_BOT and U_PRINT_PM -->
 		<div class="dropdown-container dropdown-button-control topic-tools">
-			<span title="{L_PM_TOOLS}" class="dropdown-trigger dropdown-select button icon-button tools-icon"></span>
-			<div class="dropdown hidden">
+			<span title="{L_PM_TOOLS}" class="button button-secondary dropdown-trigger dropdown-select">
+				<i class="icon fa-wrench fa-fw" aria-hidden="true"></i>
+				<span class="caret"><i class="icon fa-sort-down fa-fw" aria-hidden="true"></i></span>
+			</span>
+			<div class="dropdown">
 				<div class="pointer"><div class="pointer-inner"></div></div>
 				<ul class="dropdown-contents">
-					<!-- IF U_PRINT_PM --><li class="small-icon icon-print"><a href="{U_PRINT_PM}" title="{L_PRINT_PM}" accesskey="p">{L_PRINT_PM}</a></li><!-- ENDIF -->
+					<!-- IF U_PRINT_PM -->
+						<li>
+							<a href="{U_PRINT_PM}" title="{L_PRINT_PM}" accesskey="p">
+								<i class="icon fa-print fa-fw" aria-hidden="true"></i><span>{L_PRINT_PM}</span>
+							</a>
+						</li>
+					<!-- ENDIF -->
 				</ul>
 			</div>
 		</div>
@@ -46,7 +53,9 @@
 	<!-- IF TOTAL_MESSAGES or S_VIEW_MESSAGE -->
 		<div class="pagination">
 			<!-- IF S_VIEW_MESSAGE -->
-				<a class="arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_CURRENT_FOLDER}">{L_RETURN_TO_FOLDER}</a>
+				<a class="arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_CURRENT_FOLDER}">
+					<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_RETURN_TO_FOLDER}</span>
+				</a>
 			<!-- ELSEIF FOLDER_CUR_MESSAGES neq 0 -->
 				<!-- IF U_MARK_ALL --><a href="{U_MARK_ALL}" class="mark">{L_PM_MARK_ALL_READ}</a> &bull; <!-- ENDIF -->
 				{TOTAL_MESSAGES}
--- a/styles/prosilver/template/ucp_pm_viewfolder.html
+++ b/styles/prosilver/template/ucp_pm_viewfolder.html
@@ -57,9 +57,9 @@
 
 		<!-- BEGIN messagerow -->
 			<li class="row<!-- IF messagerow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- IF messagerow.PM_CLASS --> {messagerow.PM_CLASS}<!-- ENDIF -->">
-				<dl class="icon {messagerow.FOLDER_IMG_STYLE}">
+				<dl class="row-item {messagerow.FOLDER_IMG_STYLE}">
 					<dt<!-- IF messagerow.PM_ICON_URL and S_PM_ICONS --> style="background-image: url({messagerow.PM_ICON_URL}); background-repeat: no-repeat;"<!-- ENDIF -->>
-						<!-- IF messagerow.S_PM_UNREAD and not messagerow.S_PM_DELETED --><a href="{messagerow.U_VIEW_PM}" class="icon-link"></a><!-- ENDIF -->
+						<!-- IF messagerow.S_PM_UNREAD and not messagerow.S_PM_DELETED --><a href="{messagerow.U_VIEW_PM}" class="row-item-link"></a><!-- ENDIF -->
 						<div class="list-inner">
 
 						<!-- IF messagerow.S_PM_DELETED -->
@@ -71,8 +71,11 @@
 						<!-- IF messagerow.S_AUTHOR_DELETED -->
 							<br /><em class="small">{L_PM_FROM_REMOVED_AUTHOR}</em>
 						<!-- ENDIF -->
-
-						<!-- IF messagerow.S_PM_REPORTED --><a href="{messagerow.U_MCP_REPORT}">{REPORTED_IMG}</a><!-- ENDIF --> {messagerow.ATTACH_ICON_IMG}<br />
+						<!-- IF messagerow.S_PM_REPORTED -->
+							<a href="{messagerow.U_MCP_REPORT}">
+								<i class="icon fa-exclamation fa-fw icon-red" aria-hidden="true"></i><span class="sr-only">{PM_REPORTED}</span>
+							</a>
+						<!-- ENDIF --> <!-- IF messagerow.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <!-- ENDIF --><br />
 						<!-- IF S_SHOW_RECIPIENTS -->{L_MESSAGE_TO} {messagerow.RECIPIENTS}<!-- ELSE -->{L_MESSAGE_BY_AUTHOR} {messagerow.MESSAGE_AUTHOR_FULL} &raquo; {messagerow.SENT_TIME}<!-- ENDIF -->
 
 						</div>
@@ -101,15 +104,18 @@
 			<select name="mark_option">{S_MARK_OPTIONS}{S_MOVE_MARKED_OPTIONS}</select> <input class="button2" type="submit" name="submit_mark" value="{L_GO}" />
 			<div><a href="#" onclick="marklist('viewfolder', 'marked_msg', true); return false;">{L_MARK_ALL}</a> &bull; <a href="#" onclick="marklist('viewfolder', 'marked_msg', false); return false;">{L_UNMARK_ALL}</a></div>
 		</fieldset>
-	
+
 		<hr />
-	
+
 		<div class="action-bar bottom">
+			<!-- INCLUDE display_options.html -->
+			<input type="hidden" name="cur_folder_id" value="{CUR_FOLDER_ID}" />
+
 			<div class="pagination">
 				{TOTAL_MESSAGES}
-				<!-- IF .pagination --> 
+				<!-- IF .pagination -->
 					<!-- INCLUDE pagination.html -->
-				<!-- ELSE --> 
+				<!-- ELSE -->
 					 &bull; {PAGE_NUMBER}
 				<!-- ENDIF -->
 			</div>
@@ -119,16 +125,6 @@
 		</div>
 	</div>
 
-	<!-- IF FOLDER_CUR_MESSAGES neq 0 -->
-	<fieldset class="display-options">
-		<label>{L_DISPLAY}{L_COLON} {S_SELECT_SORT_DAYS}</label>
-		<label>{L_SORT_BY} {S_SELECT_SORT_KEY}</label>
-		<label>{S_SELECT_SORT_DIR}</label>
-		<input type="submit" name="sort" value="{L_GO}" class="button2" />
-		<input type="hidden" name="cur_folder_id" value="{CUR_FOLDER_ID}" />
-	</fieldset>
-	<!-- ENDIF -->
-
 	<!-- INCLUDE ucp_pm_message_footer.html -->
 <!-- ENDIF -->
 <!-- INCLUDE ucp_footer.html -->
--- a/styles/prosilver/template/ucp_pm_viewmessage.html
+++ b/styles/prosilver/template/ucp_pm_viewmessage.html
@@ -8,8 +8,16 @@
 
 <!-- IF S_DISPLAY_HISTORY and (U_VIEW_PREVIOUS_HISTORY or U_VIEW_NEXT_HISTORY) -->
 	<fieldset class="display-options clearfix">
-		<!-- IF U_VIEW_PREVIOUS_HISTORY --><a href="{U_VIEW_PREVIOUS_HISTORY}" class="left-box arrow-{S_CONTENT_FLOW_BEGIN}">{L_VIEW_PREVIOUS_HISTORY}</a><!-- ENDIF -->
-		<!-- IF U_VIEW_NEXT_HISTORY --><a href="{U_VIEW_NEXT_HISTORY}" class="right-box arrow-{S_CONTENT_FLOW_END}">{L_VIEW_NEXT_HISTORY}</a><!-- ENDIF -->
+		<!-- IF U_VIEW_PREVIOUS_HISTORY -->
+			<a href="{U_VIEW_PREVIOUS_HISTORY}" class="left-box arrow-{S_CONTENT_FLOW_BEGIN}">
+				<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_VIEW_PREVIOUS_HISTORY}</span>
+			</a>
+		<!-- ENDIF -->
+		<!-- IF U_VIEW_NEXT_HISTORY -->
+			<a href="{U_VIEW_NEXT_HISTORY}" class="right-box arrow-{S_CONTENT_FLOW_END}">
+				<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_VIEW_NEXT_HISTORY}</span>
+			</a>
+		<!-- ENDIF -->
 	</fieldset>
 <!-- ENDIF -->
 
@@ -47,8 +55,8 @@
 			<dd class="profile-contact">
 				<strong>{L_CONTACT}{L_COLON}</strong>
 				<div class="dropdown-container dropdown-left">
-					<a href="#" class="dropdown-trigger"><span class="imageset icon_contact" title="{CONTACT_USER}">{CONTACT_USER}</span></a>
-					<div class="dropdown hidden">
+					<a href="#" class="dropdown-trigger"  title="{CONTACT_USER}"><i class="icon fa-commenting-o fa-fw icon-lg" aria-hidden="true"></i><span class="sr-only">{CONTACT_USER}</span></a>
+					<div class="dropdown">
 						<div class="pointer"><div class="pointer-inner"></div></div>
 						<div class="dropdown-contents contact-icons">
 							<!-- BEGIN contact -->
@@ -82,22 +90,30 @@
 			<!-- EVENT ucp_pm_viewmessage_post_buttons_before -->
 			<!-- IF U_EDIT -->
 				<li>
-					<a href="{U_EDIT}" title="{L_POST_EDIT_PM}" class="button icon-button edit-icon"><span>{L_POST_EDIT_PM}</span></a>
+					<a href="{U_EDIT}" title="{L_POST_EDIT_PM}" class="button button-icon-only">
+						<i class="icon fa-pencil fa-fw" aria-hidden="true"></i><span class="sr-only">{L_POST_EDIT_PM}</span>
+					</a>
 				</li>
 			<!-- ENDIF -->
 			<!-- IF U_DELETE -->
 				<li>
-					<a href="{U_DELETE}" title="{L_DELETE_MESSAGE}" class="button icon-button delete-icon"><span>{L_DELETE_MESSAGE}</span></a>
+					<a href="{U_DELETE}" title="{L_DELETE_MESSAGE}" class="button button-icon-only">
+						<i class="icon fa-times fa-fw" aria-hidden="true"></i><span class="sr-only">{L_DELETE_MESSAGE}</span>
+					</a>
 				</li>
 			<!-- ENDIF -->
 			<!-- IF U_REPORT -->
 				<li>
-					<a href="{U_REPORT}" title="{L_REPORT_PM}" class="button icon-button report-icon"><span>{L_REPORT_PM}</span></a>
+					<a href="{U_REPORT}" title="{L_REPORT_PM}" class="button button-icon-only">
+						<i class="icon fa-exclamation fa-fw" aria-hidden="true"></i><span class="sr-only">{L_REPORT_PM}</span>
+					</a>
 				</li>
 			<!-- ENDIF -->
 			<!-- IF U_QUOTE -->
 				<li>
-					<a href="{U_QUOTE}" title="{L_POST_QUOTE_PM}" class="button icon-button quote-icon"><span>{L_POST_QUOTE_PM}</span></a>
+					<a href="{U_QUOTE}" title="{L_POST_QUOTE_PM}" class="button button-icon-only">
+						<i class="icon fa-quote-left fa-fw" aria-hidden="true"></i><span class="sr-only">{L_POST_QUOTE_PM}</span>
+					</a>
 				</li>
 			<!-- ENDIF -->
 			<!-- EVENT ucp_pm_viewmessage_post_buttons_after -->
@@ -141,17 +157,31 @@
 		<!-- ENDIF -->
 	</div>
 
-	<div class="back2top"><a href="#top" class="top" title="{L_BACK_TO_TOP}">{L_BACK_TO_TOP}</a></div>
+	<div class="back2top">
+		<a href="#top" class="top" title="{L_BACK_TO_TOP}">
+			<i class="icon fa-chevron-circle-up fa-fw icon-gray" aria-hidden="true"></i>
+			<span class="sr-only">{L_BACK_TO_TOP}</span>
+		</a>
+	</div>
 
 	</div>
 </div>
 
+<!-- EVENT ucp_pm_viewmessage_options_before -->
 <!-- IF S_VIEW_MESSAGE -->
 <fieldset class="display-options">
-	<!-- IF U_PREVIOUS_PM --><a href="{U_PREVIOUS_PM}" class="left-box arrow-{S_CONTENT_FLOW_BEGIN}">{L_VIEW_PREVIOUS_PM}</a><!-- ENDIF -->
-	<!-- IF U_NEXT_PM --><a href="{U_NEXT_PM}" class="right-box arrow-{S_CONTENT_FLOW_END}">{L_VIEW_NEXT_PM}</a><!-- ENDIF -->
 
 	<!-- IF S_MARK_OPTIONS --><label for="mark_option"><select name="mark_option" id="mark_option">{S_MARK_OPTIONS}</select></label>&nbsp;<input class="button2" type="submit" name="submit_mark" value="{L_GO}" /><!-- ENDIF -->
+	<!-- IF U_PREVIOUS_PM -->
+		<a href="{U_PREVIOUS_PM}" class="left-box arrow-{S_CONTENT_FLOW_BEGIN}">
+			<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_VIEW_PREVIOUS_PM}</span>
+		</a>
+	<!-- ENDIF -->
+	<!-- IF U_NEXT_PM -->
+		<a href="{U_NEXT_PM}" class="right-box arrow-{S_CONTENT_FLOW_END}">
+			<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_VIEW_NEXT_PM}</span>
+		</a>
+	<!-- ENDIF -->
 	<!-- IF not S_UNREAD and not S_SPECIAL_FOLDER --><label for="dest_folder"><!-- IF S_VIEW_MESSAGE -->{L_MOVE_TO_FOLDER}{L_COLON} <!-- ELSE -->{L_MOVE_MARKED_TO_FOLDER}<!-- ENDIF --> <select name="dest_folder" id="dest_folder">{S_TO_FOLDER_OPTIONS}</select></label> <input class="button2" type="submit" name="move_pm" value="{L_GO}" /><!-- ENDIF -->
 	<input type="hidden" name="marked_msg_id[]" value="{MSG_ID}" />
 	<input type="hidden" name="cur_folder_id" value="{CUR_FOLDER_ID}" />
--- a/styles/prosilver/template/ucp_pm_viewmessage_print.html
+++ b/styles/prosilver/template/ucp_pm_viewmessage_print.html
@@ -11,8 +11,8 @@
 <!-- EVENT ucp_pm_viewmessage_print_head_append -->
 </head>
 <body id="phpbb">
-<div id="wrap">
-	<a id="top" class="anchor" accesskey="t"></a>
+<div id="wrap" class="wrap">
+	<a id="top" class="top-anchor" accesskey="t"></a>
 
 	<div id="page-header">
 		<h1>{SITENAME}</h1>
@@ -21,7 +21,7 @@
 		<h2>{L_PRIVATE_MESSAGING}</h2>
 	</div>
 
-	<div id="page-body">
+	<div id="page-body" class="page-body">
 		<div class="page-number">{PAGE_NUMBER}</div>
 			<div class="post">
 				<h3>{SUBJECT}</h3>
@@ -39,7 +39,7 @@
 			<hr />
 	</div>
 
-	<div id="page-footer">
+	<div id="page-footer" class="page-footer">
 		<div class="page-number">{S_TIMEZONE}<br />{PAGE_NUMBER}</div>
 		<div class="copyright">Powered by phpBB&reg; Forum Software &copy; phpBB Limited<br />https://www.phpbb.com/</div>
 	</div>
--- a/styles/prosilver/template/ucp_prefs_post.html
+++ b/styles/prosilver/template/ucp_prefs_post.html
@@ -12,39 +12,39 @@
 	<dl>
 		<dt><label for="bbcode1">{L_DEFAULT_BBCODE}{L_COLON}</label></dt>
 		<dd>
-			<label for="bbcode1"><input type="radio" name="bbcode" id="bbcode1" value="1"<!-- IF S_BBCODE --> checked="checked"<!-- ENDIF --> /> {L_YES}</label> 
+			<label for="bbcode1"><input type="radio" name="bbcode" id="bbcode1" value="1"<!-- IF S_BBCODE --> checked="checked"<!-- ENDIF --> /> {L_YES}</label>
 			<label for="bbcode0"><input type="radio" name="bbcode" id="bbcode0" value="0"<!-- IF not S_BBCODE --> checked="checked"<!-- ENDIF --> /> {L_NO}</label>
 		</dd>
 	</dl>
 	<dl>
 		<dt><label for="smilies1">{L_DEFAULT_SMILIES}{L_COLON}</label></dt>
 		<dd>
-			<label for="smilies1"><input type="radio" name="smilies" id="smilies1" value="1"<!-- IF S_SMILIES --> checked="checked"<!-- ENDIF --> /> {L_YES}</label> 
+			<label for="smilies1"><input type="radio" name="smilies" id="smilies1" value="1"<!-- IF S_SMILIES --> checked="checked"<!-- ENDIF --> /> {L_YES}</label>
 			<label for="smilies0"><input type="radio" name="smilies" id="smilies0" value="0"<!-- IF not S_SMILIES --> checked="checked"<!-- ENDIF --> /> {L_NO}</label>
 		</dd>
 	</dl>
 	<dl>
 		<dt><label for="sig1">{L_DEFAULT_ADD_SIG}{L_COLON}</label></dt>
 		<dd>
-			<label for="sig1"><input type="radio" name="sig" id="sig1" value="1"<!-- IF S_SIG --> checked="checked"<!-- ENDIF --> /> {L_YES}</label> 
+			<label for="sig1"><input type="radio" name="sig" id="sig1" value="1"<!-- IF S_SIG --> checked="checked"<!-- ENDIF --> /> {L_YES}</label>
 			<label for="sig0"><input type="radio" name="sig" id="sig0" value="0"<!-- IF not S_SIG --> checked="checked"<!-- ENDIF --> /> {L_NO}</label>
 		</dd>
 	</dl>
 	<dl>
 		<dt><label for="notify1">{L_DEFAULT_NOTIFY}{L_COLON}</label></dt>
 		<dd>
-			<label for="notify1"><input type="radio" name="notify" id="notify1" value="1"<!-- IF S_NOTIFY --> checked="checked"<!-- ENDIF --> /> {L_YES}</label> 
+			<label for="notify1"><input type="radio" name="notify" id="notify1" value="1"<!-- IF S_NOTIFY --> checked="checked"<!-- ENDIF --> /> {L_YES}</label>
 			<label for="notify0"><input type="radio" name="notify" id="notify0" value="0"<!-- IF not S_NOTIFY --> checked="checked"<!-- ENDIF --> /> {L_NO}</label>
 		</dd>
 	</dl>
 	<!-- EVENT ucp_prefs_post_append -->
 	</fieldset>
-	
+
 	</div>
 </div>
 
 <fieldset class="submit-buttons">
-	{S_HIDDEN_FIELDS}<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp; 
+	{S_HIDDEN_FIELDS}<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp;
 	<input type="submit" name="submit" value="{L_SUBMIT}" class="button1" />
 	{S_FORM_TOKEN}
 </fieldset>
--- a/styles/prosilver/template/ucp_prefs_view.html
+++ b/styles/prosilver/template/ucp_prefs_view.html
@@ -13,35 +13,35 @@
 		<dl>
 			<dt><label for="images1">{L_VIEW_IMAGES}{L_COLON}</label></dt>
 			<dd>
-				<label for="images1"><input type="radio" name="images" id="images1" value="1"<!-- IF S_IMAGES --> checked="checked"<!-- ENDIF --> /> {L_YES}</label> 
+				<label for="images1"><input type="radio" name="images" id="images1" value="1"<!-- IF S_IMAGES --> checked="checked"<!-- ENDIF --> /> {L_YES}</label>
 				<label for="images0"><input type="radio" name="images" id="images0" value="0"<!-- IF not S_IMAGES --> checked="checked"<!-- ENDIF --> /> {L_NO}</label>
 			</dd>
 		</dl>
 		<dl>
 			<dt><label for="flash0">{L_VIEW_FLASH}{L_COLON}</label></dt>
 			<dd>
-				<label for="flash1"><input type="radio" name="flash" id="flash1" value="1"<!-- IF S_FLASH --> checked="checked"<!-- ENDIF --> /> {L_YES}</label> 
+				<label for="flash1"><input type="radio" name="flash" id="flash1" value="1"<!-- IF S_FLASH --> checked="checked"<!-- ENDIF --> /> {L_YES}</label>
 				<label for="flash0"><input type="radio" name="flash" id="flash0" value="0"<!-- IF not S_FLASH --> checked="checked"<!-- ENDIF --> /> {L_NO}</label>
 			</dd>
 		</dl>
 		<dl>
 			<dt><label for="smilies1">{L_VIEW_SMILIES}{L_COLON}</label></dt>
 			<dd>
-				<label for="smilies1"><input type="radio" name="smilies" id="smilies1" value="1"<!-- IF S_SMILIES --> checked="checked"<!-- ENDIF --> /> {L_YES}</label> 
+				<label for="smilies1"><input type="radio" name="smilies" id="smilies1" value="1"<!-- IF S_SMILIES --> checked="checked"<!-- ENDIF --> /> {L_YES}</label>
 				<label for="smilies0"><input type="radio" name="smilies" id="smilies0" value="0"<!-- IF not S_SMILIES --> checked="checked"<!-- ENDIF --> /> {L_NO}</label>
 			</dd>
 		</dl>
 		<dl>
 			<dt><label for="sigs1">{L_VIEW_SIGS}{L_COLON}</label></dt>
 			<dd>
-				<label for="sigs1"><input type="radio" name="sigs" id="sigs1" value="1"<!-- IF S_SIGS --> checked="checked"<!-- ENDIF --> /> {L_YES}</label> 
+				<label for="sigs1"><input type="radio" name="sigs" id="sigs1" value="1"<!-- IF S_SIGS --> checked="checked"<!-- ENDIF --> /> {L_YES}</label>
 				<label for="sigs0"><input type="radio" name="sigs" id="sigs0" value="0"<!-- IF not S_SIGS --> checked="checked"<!-- ENDIF --> /> {L_NO}</label>
 			</dd>
 		</dl>
 		<dl>
 			<dt><label for="avatars1">{L_VIEW_AVATARS}{L_COLON}</label></dt>
 			<dd>
-				<label for="avatars1"><input type="radio" name="avatars" id="avatars1" value="1"<!-- IF S_AVATARS --> checked="checked"<!-- ENDIF --> /> {L_YES}</label> 
+				<label for="avatars1"><input type="radio" name="avatars" id="avatars1" value="1"<!-- IF S_AVATARS --> checked="checked"<!-- ENDIF --> /> {L_YES}</label>
 				<label for="avatars0"><input type="radio" name="avatars" id="avatars0" value="0"<!-- IF not S_AVATARS --> checked="checked"<!-- ENDIF --> /> {L_NO}</label>
 			</dd>
 		</dl>
@@ -49,7 +49,7 @@
 			<dl>
 				<dt><label for="wordcensor1">{L_DISABLE_CENSORS}{L_COLON}</label></dt>
 				<dd>
-					<label for="wordcensor1"><input type="radio" name="wordcensor" id="wordcensor1" value="1"<!-- IF S_DISABLE_CENSORS --> checked="checked"<!-- ENDIF --> /> {L_YES}</label> 
+					<label for="wordcensor1"><input type="radio" name="wordcensor" id="wordcensor1" value="1"<!-- IF S_DISABLE_CENSORS --> checked="checked"<!-- ENDIF --> /> {L_YES}</label>
 					<label for="wordcensor0"><input type="radio" name="wordcensor" id="wordcensor0" value="0"<!-- IF not S_DISABLE_CENSORS --> checked="checked"<!-- ENDIF --> /> {L_NO}</label>
 				</dd>
 			</dl>
@@ -89,7 +89,7 @@
 </div>
 
 <fieldset class="submit-buttons">
-	{S_HIDDEN_FIELDS}<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp; 
+	{S_HIDDEN_FIELDS}<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp;
 	<input type="submit" name="submit" value="{L_SUBMIT}" class="button1" />
 	{S_FORM_TOKEN}
 </fieldset>
--- a/styles/prosilver/template/ucp_profile_reg_details.html
+++ b/styles/prosilver/template/ucp_profile_reg_details.html
@@ -31,7 +31,7 @@
 			<dd><input type="password" name="password_confirm" id="password_confirm" maxlength="255" value="{PASSWORD_CONFIRM}" class="inputbox" title="{L_CONFIRM_PASSWORD}" autocomplete="off" /></dd>
 		</dl>
 	<!-- ENDIF -->
-	<!-- EVENT ucp_profile_register_details_after -->	
+	<!-- EVENT ucp_profile_register_details_after -->
 	</fieldset>
 	</div>
 </div>
--- a/styles/prosilver/template/ucp_register.html
+++ b/styles/prosilver/template/ucp_register.html
@@ -79,8 +79,6 @@
 <!-- ENDIF -->
 
 <!-- IF S_COPPA -->
-
-
 <div class="panel">
 	<div class="inner">
 
@@ -91,6 +89,8 @@
 </div>
 <!-- ENDIF -->
 
+<!-- EVENT ucp_register_buttons_before -->
+
 <div class="panel">
 	<div class="inner">
 
--- a/styles/prosilver/template/ucp_zebra_foes.html
+++ b/styles/prosilver/template/ucp_zebra_foes.html
@@ -32,7 +32,7 @@
 </div>
 
 <fieldset class="submit-buttons">
-	{S_HIDDEN_FIELDS}<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp; 
+	{S_HIDDEN_FIELDS}<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp;
 	<input type="submit" name="submit" value="{L_SUBMIT}" class="button1" />
 	{S_FORM_TOKEN}
 </fieldset>
--- a/styles/prosilver/template/ucp_zebra_friends.html
+++ b/styles/prosilver/template/ucp_zebra_friends.html
@@ -34,7 +34,7 @@
 </div>
 
 <fieldset class="submit-buttons">
-	{S_HIDDEN_FIELDS}<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp; 
+	{S_HIDDEN_FIELDS}<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp;
 	<input type="submit" name="submit" value="{L_SUBMIT}" class="button1" />
 	{S_FORM_TOKEN}
 </fieldset>
--- a/styles/prosilver/template/viewforum_body.html
+++ b/styles/prosilver/template/viewforum_body.html
@@ -35,18 +35,19 @@
 <!-- ENDIF -->
 
 <!-- IF S_DISPLAY_POST_INFO or .pagination or TOTAL_POSTS or TOTAL_TOPICS -->
-	<div class="action-bar top">
+	<div class="action-bar bar-top">
 
 	<!-- IF not S_IS_BOT and S_DISPLAY_POST_INFO -->
-		<div class="buttons">
 			<!-- EVENT viewforum_buttons_top_before -->
 
-			<a href="{U_POST_NEW_TOPIC}" class="button icon-button <!-- IF S_IS_LOCKED -->locked-icon<!-- ELSE -->post-icon<!-- ENDIF -->" title="<!-- IF S_IS_LOCKED -->{L_FORUM_LOCKED}<!-- ELSE -->{L_POST_TOPIC}<!-- ENDIF -->">
-				<!-- IF S_IS_LOCKED -->{L_BUTTON_FORUM_LOCKED}<!-- ELSE -->{L_BUTTON_NEW_TOPIC}<!-- ENDIF -->
-			</a>
-
+		<a href="{U_POST_NEW_TOPIC}" class="button" title="<!-- IF S_IS_LOCKED -->{L_FORUM_LOCKED}<!-- ELSE -->{L_POST_TOPIC}<!-- ENDIF -->">
+			<!-- IF S_IS_LOCKED -->
+				<span>{L_BUTTON_FORUM_LOCKED}</span> <i class="icon fa-lock fa-fw" aria-hidden="true"></i>
+			<!-- ELSE -->
+				<span>{L_BUTTON_NEW_TOPIC}</span> <i class="icon fa-pencil fa-fw" aria-hidden="true"></i>
+			<!-- ENDIF -->
+		</a>
 			<!-- EVENT viewforum_buttons_top_after -->
-		</div>
 	<!-- ENDIF -->
 
 	<!-- IF S_DISPLAY_SEARCHBOX -->
@@ -54,8 +55,12 @@
 			<form method="get" id="forum-search" action="{S_SEARCHBOX_ACTION}">
 			<fieldset>
 				<input class="inputbox search tiny" type="search" name="keywords" id="search_keywords" size="20" placeholder="{L_SEARCH_FORUM}" />
-				<button class="button icon-button search-icon" type="submit" title="{L_SEARCH}">{L_SEARCH}</button>
-				<a href="{U_SEARCH}" class="button icon-button search-adv-icon" title="{L_SEARCH_ADV}">{L_SEARCH_ADV}</a>
+				<button class="button button-search" type="submit" title="{L_SEARCH}">
+					<i class="icon fa-search fa-fw" aria-hidden="true"></i><span class="sr-only">{L_SEARCH}</span>
+				</button>
+				<a href="{U_SEARCH}" class="button button-search-end" title="{L_SEARCH_ADV}">
+					<i class="icon fa-cog fa-fw" aria-hidden="true"></i><span class="sr-only">{L_SEARCH_ADV}</span>
+				</a>
 				{S_SEARCH_LOCAL_HIDDEN_FIELDS}
 			</fieldset>
 			</form>
@@ -136,7 +141,7 @@
 		<div class="inner">
 		<ul class="topiclist">
 			<li class="header">
-				<dl class="icon">
+				<dl class="row-item">
 					<dt<!-- IF S_DISPLAY_ACTIVE --> id="active_topics"<!-- ENDIF -->><div class="list-inner"><!-- IF S_DISPLAY_ACTIVE -->{L_ACTIVE_TOPICS}<!-- ELSEIF topicrow.S_TOPIC_TYPE_SWITCH and (topicrow.S_POST_ANNOUNCE or topicrow.S_POST_GLOBAL) -->{L_ANNOUNCEMENTS}<!-- ELSE -->{L_TOPICS}<!-- ENDIF --></div></dt>
 					<dd class="posts">{L_REPLIES}</dd>
 					<dd class="views">{L_VIEWS}</dd>
@@ -150,16 +155,35 @@
 		<!-- EVENT viewforum_body_topicrow_row_before -->
 		<li class="row<!-- IF topicrow.S_ROW_COUNT is even --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- IF topicrow.S_POST_GLOBAL --> global-announce<!-- ENDIF --><!-- IF topicrow.S_POST_ANNOUNCE --> announce<!-- ENDIF --><!-- IF topicrow.S_POST_STICKY --> sticky<!-- ENDIF --><!-- IF topicrow.S_TOPIC_REPORTED --> reported<!-- ENDIF -->">
 			<!-- EVENT viewforum_body_topic_row_prepend -->
-			<dl class="icon {topicrow.TOPIC_IMG_STYLE}">
+			<dl class="row-item {topicrow.TOPIC_IMG_STYLE}">
 				<dt<!-- IF topicrow.TOPIC_ICON_IMG and S_TOPIC_ICONS --> style="background-image: url({T_ICONS_PATH}{topicrow.TOPIC_ICON_IMG}); background-repeat: no-repeat;"<!-- ENDIF --> title="{topicrow.TOPIC_FOLDER_IMG_ALT}">
-					<!-- IF topicrow.S_UNREAD_TOPIC and not S_IS_BOT --><a href="{topicrow.U_NEWEST_POST}" class="icon-link"></a><!-- ENDIF -->
+					<!-- IF topicrow.S_UNREAD_TOPIC and not S_IS_BOT --><a href="{topicrow.U_NEWEST_POST}" class="row-item-link"></a><!-- ENDIF -->
 					<div class="list-inner">
 						<!-- EVENT topiclist_row_prepend -->
-						<!-- IF topicrow.S_UNREAD_TOPIC and not S_IS_BOT --><a href="{topicrow.U_NEWEST_POST}">{NEWEST_POST_IMG}</a> <!-- ENDIF --><a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a>
-						<!-- IF topicrow.S_TOPIC_UNAPPROVED or topicrow.S_POSTS_UNAPPROVED --><a href="{topicrow.U_MCP_QUEUE}">{topicrow.UNAPPROVED_IMG}</a> <!-- ENDIF -->
-						<!-- IF topicrow.S_TOPIC_DELETED --><a href="{topicrow.U_MCP_QUEUE}">{DELETED_IMG}</a> <!-- ENDIF -->
-						<!-- IF topicrow.S_TOPIC_REPORTED --><a href="{topicrow.U_MCP_REPORT}">{REPORTED_IMG}</a><!-- ENDIF --><br />
+						<!-- IF topicrow.S_UNREAD_TOPIC and not S_IS_BOT -->
+							<a class="unread" href="{topicrow.U_NEWEST_POST}">
+								<i class="icon fa-file fa-fw icon-red icon-md" aria-hidden="true"></i><span class="sr-only">{NEW_POST}</span>
+							</a>
+						<!-- ENDIF -->
+						<a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a>
+						<!-- IF topicrow.S_TOPIC_UNAPPROVED or topicrow.S_POSTS_UNAPPROVED -->
+							<a href="{topicrow.U_MCP_QUEUE}" title="{L_TOPIC_UNAPPROVED}">
+								<i class="icon fa-question fa-fw icon-blue" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_UNAPPROVED}</span>
+							</a>
+						<!-- ENDIF -->
+						<!-- IF topicrow.S_TOPIC_DELETED -->
+							<a href="{topicrow.U_MCP_QUEUE}" title="{L_TOPIC_DELETED}">
+								<i class="icon fa-recycle fa-fw icon-green" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_DELETED}</span>
+							</a>
+						<!-- ENDIF -->
+						<!-- IF topicrow.S_TOPIC_REPORTED -->
+							<a href="{topicrow.U_MCP_REPORT}" title="{L_TOPIC_REPORTED}">
+								<i class="icon fa-exclamation fa-fw icon-red" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_REPORTED}</span>
+							</a>
+						<!-- ENDIF -->
+						<br />
 						<!-- EVENT topiclist_row_topic_title_after -->
+
 						<!-- IF not S_IS_BOT -->
 						<div class="responsive-show" style="display: none;">
 							{L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} &laquo; <a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}">{topicrow.LAST_POST_TIME}</a>
@@ -168,35 +192,43 @@
 						<!-- IF topicrow.REPLIES --><span class="responsive-show left-box" style="display: none;">{L_REPLIES}{L_COLON} <strong>{topicrow.REPLIES}</strong></span><!-- ENDIF -->
 						<!-- ENDIF -->
 
+						<div class="topic-poster responsive-hide">
+							<!-- IF topicrow.S_HAS_POLL --><i class="icon fa-bar-chart fa-fw" aria-hidden="true"></i><!-- ENDIF -->
+							<!-- IF topicrow.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i><!-- ENDIF -->
+							{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
+							<!-- IF topicrow.S_POST_GLOBAL and FORUM_ID != topicrow.FORUM_ID --> &raquo; {L_IN} <a href="{topicrow.U_VIEW_FORUM}">{topicrow.FORUM_NAME}</a><!-- ENDIF -->
+						</div>
+
 						<!-- IF .topicrow.pagination -->
 						<div class="pagination">
+							<span><i class="icon fa-clone fa-fw" aria-hidden="true"></i></span>
 							<ul>
 							<!-- BEGIN pagination -->
 								<!-- IF topicrow.pagination.S_IS_PREV -->
 								<!-- ELSEIF topicrow.pagination.S_IS_CURRENT --><li class="active"><span>{topicrow.pagination.PAGE_NUMBER}</span></li>
 								<!-- ELSEIF topicrow.pagination.S_IS_ELLIPSIS --><li class="ellipsis"><span>{L_ELLIPSIS}</span></li>
 								<!-- ELSEIF topicrow.pagination.S_IS_NEXT -->
-								<!-- ELSE --><li><a href="{topicrow.pagination.PAGE_URL}">{topicrow.pagination.PAGE_NUMBER}</a></li>
+								<!-- ELSE --><li><a class="button" href="{topicrow.pagination.PAGE_URL}">{topicrow.pagination.PAGE_NUMBER}</a></li>
 								<!-- ENDIF -->
 							<!-- END pagination -->
 							</ul>
 						</div>
 						<!-- ENDIF -->
 
-						<div class="responsive-hide">
-							<!-- IF topicrow.S_HAS_POLL -->{POLL_IMG} <!-- ENDIF -->
-							<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->
-							{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
-							<!-- IF topicrow.S_POST_GLOBAL and FORUM_ID != topicrow.FORUM_ID --> &raquo; {L_IN} <a href="{topicrow.U_VIEW_FORUM}">{topicrow.FORUM_NAME}</a><!-- ENDIF -->
-						</div>
-
 						<!-- EVENT topiclist_row_append -->
 					</div>
 				</dt>
 				<dd class="posts">{topicrow.REPLIES} <dfn>{L_REPLIES}</dfn></dd>
 				<dd class="views">{topicrow.VIEWS} <dfn>{L_VIEWS}</dfn></dd>
-				<dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}
-					<!-- IF not S_IS_BOT --><a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}">{LAST_POST_IMG}</a> <!-- ENDIF --><br />{topicrow.LAST_POST_TIME}</span>
+				<dd class="lastpost">
+					<span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}
+						<!-- IF not S_IS_BOT -->
+							<a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}">
+								<i class="icon fa-external-link-square fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{VIEW_LATEST_POST}</span>
+							</a>
+						<!-- ENDIF -->
+						<br />{topicrow.LAST_POST_TIME}
+					</span>
 				</dd>
 			</dl>
 			<!-- EVENT viewforum_body_topic_row_append -->
@@ -219,32 +251,26 @@
 	<!-- ENDIF -->
 <!-- END topicrow -->
 
-<!-- IF S_SELECT_SORT_DAYS and not S_DISPLAY_ACTIVE -->
-	<form method="post" action="{S_FORUM_ACTION}">
-		<fieldset class="display-options">
-	<!-- IF not S_IS_BOT -->
-			<label>{L_DISPLAY_TOPICS}{L_COLON} {S_SELECT_SORT_DAYS}</label>
-			<label>{L_SORT_BY} {S_SELECT_SORT_KEY}</label>
-			<label>{S_SELECT_SORT_DIR}</label>
-			<input type="submit" name="sort" value="{L_GO}" class="button2" />
-	<!-- ENDIF -->
-		</fieldset>
-	</form>
-	<hr />
-<!-- ENDIF -->
-
 <!-- IF .topicrow and not S_DISPLAY_ACTIVE -->
-	<div class="action-bar bottom">
+	<div class="action-bar bar-bottom">
 		<!-- IF not S_IS_BOT and S_DISPLAY_POST_INFO -->
-			<div class="buttons">
-				<!-- EVENT viewforum_buttons_bottom_before -->
+			<!-- EVENT viewforum_buttons_bottom_before -->
 
-				<a href="{U_POST_NEW_TOPIC}" class="button icon-button <!-- IF S_IS_LOCKED -->locked-icon<!-- ELSE -->post-icon<!-- ENDIF -->" title="<!-- IF S_IS_LOCKED -->{L_FORUM_LOCKED}<!-- ELSE -->{L_POST_TOPIC}<!-- ENDIF -->">
-					<!-- IF S_IS_LOCKED -->{L_BUTTON_FORUM_LOCKED}<!-- ELSE -->{L_BUTTON_NEW_TOPIC}<!-- ENDIF -->
-				</a>
+			<a href="{U_POST_NEW_TOPIC}" class="button" title="<!-- IF S_IS_LOCKED -->{L_FORUM_LOCKED}<!-- ELSE -->{L_POST_TOPIC}<!-- ENDIF -->">
+			<!-- IF S_IS_LOCKED -->
+				<span>{L_BUTTON_FORUM_LOCKED}</span> <i class="icon fa-lock fa-fw" aria-hidden="true"></i>
+			<!-- ELSE -->
+				<span>{L_BUTTON_NEW_TOPIC}</span> <i class="icon fa-pencil fa-fw" aria-hidden="true"></i>
+			<!-- ENDIF -->
+			</a>
 
-				<!-- EVENT viewforum_buttons_bottom_after -->
-			</div>
+			<!-- EVENT viewforum_buttons_bottom_after -->
+		<!-- ENDIF -->
+
+		<!-- IF S_SELECT_SORT_DAYS and not S_IS_BOT -->
+			<form method="post" action="{S_FORUM_ACTION}">
+			<!-- INCLUDE display_options.html -->
+			</form>
 		<!-- ENDIF -->
 
 		<div class="pagination">
--- a/styles/prosilver/template/viewonline_body.html
+++ b/styles/prosilver/template/viewonline_body.html
@@ -3,11 +3,11 @@
 <h2 class="viewonline-title">{TOTAL_REGISTERED_USERS_ONLINE}</h2>
 <p>{TOTAL_GUEST_USERS_ONLINE}<!-- IF S_SWITCH_GUEST_DISPLAY --> &bull; <a href="{U_SWITCH_GUEST_DISPLAY}">{L_SWITCH_GUEST_DISPLAY}</a><!-- ENDIF --></p>
 
-<div class="action-bar top">
+<div class="action-bar bar-top">
 	<div class="pagination">
-		<!-- IF .pagination --> 
+		<!-- IF .pagination -->
 			<!-- INCLUDE pagination.html -->
-		<!-- ELSE --> 
+		<!-- ELSE -->
 			{PAGE_NUMBER}
 		<!-- ENDIF -->
 	</div>
@@ -15,7 +15,7 @@
 
 <div class="forumbg forumbg-table">
 	<div class="inner">
-	
+
 	<table class="table1">
 
 	<!-- IF .user_row -->
@@ -43,17 +43,17 @@
 	<!-- ENDIF -->
 	</tbody>
 	</table>
-	
+
 	</div>
 </div>
 
 <!-- IF LEGEND --><p><em>{L_LEGEND}{L_COLON} {LEGEND}</em></p><!-- ENDIF -->
 
-<div class="action-bar bottom">
+<div class="action-bar bar-bottom">
 	<div class="pagination">
-		<!-- IF .pagination --> 
+		<!-- IF .pagination -->
 			<!-- INCLUDE pagination.html -->
-		<!-- ELSE --> 
+		<!-- ELSE -->
 			{PAGE_NUMBER}
 		<!-- ENDIF -->
 	</div>
--- a/styles/prosilver/template/viewtopic_body.html
+++ b/styles/prosilver/template/viewtopic_body.html
@@ -26,20 +26,20 @@
 	</div>
 <!-- ENDIF -->
 
-<div class="action-bar top">
-
-	<div class="buttons">
-		<!-- EVENT viewtopic_buttons_top_before -->
+<div class="action-bar bar-top">
+	<!-- EVENT viewtopic_buttons_top_before -->
 
 	<!-- IF not S_IS_BOT and S_DISPLAY_REPLY_INFO -->
-		<a href="{U_POST_REPLY_TOPIC}" class="button icon-button <!-- IF S_IS_LOCKED -->locked-icon<!-- ELSE -->reply-icon<!-- ENDIF -->" title="<!-- IF S_IS_LOCKED -->{L_TOPIC_LOCKED}<!-- ELSE -->{L_POST_REPLY}<!-- ENDIF -->">
-			<!-- IF S_IS_LOCKED -->{L_BUTTON_TOPIC_LOCKED}<!-- ELSE -->{L_BUTTON_POST_REPLY}<!-- ENDIF -->
+		<a href="{U_POST_REPLY_TOPIC}" class="button" title="<!-- IF S_IS_LOCKED -->{L_TOPIC_LOCKED}<!-- ELSE -->{L_POST_REPLY}<!-- ENDIF -->">
+			<!-- IF S_IS_LOCKED -->
+				<span>{L_BUTTON_TOPIC_LOCKED}</span> <i class="icon fa-lock fa-fw" aria-hidden="true"></i>
+			<!-- ELSE -->
+				<span>{L_BUTTON_POST_REPLY}</span> <i class="icon fa-reply fa-fw" aria-hidden="true"></i>
+			<!-- ENDIF -->
 		</a>
 	<!-- ENDIF -->
 
-		<!-- EVENT viewtopic_buttons_top_after -->
-	</div>
-
+	<!-- EVENT viewtopic_buttons_top_after -->
 	<!-- INCLUDE viewtopic_topic_tools.html -->
 	<!-- EVENT viewtopic_dropdown_top_custom -->
 
@@ -48,8 +48,12 @@
 			<form method="get" id="topic-search" action="{S_SEARCHBOX_ACTION}">
 			<fieldset>
 				<input class="inputbox search tiny"  type="search" name="keywords" id="search_keywords" size="20" placeholder="{L_SEARCH_TOPIC}" />
-				<button class="button icon-button search-icon" type="submit" title="{L_SEARCH}">{L_SEARCH}</button>
-				<a href="{U_SEARCH}" class="button icon-button search-adv-icon" title="{L_SEARCH_ADV}">{L_SEARCH_ADV}</a>
+				<button class="button button-search" type="submit" title="{L_SEARCH}">
+					<i class="icon fa-search fa-fw" aria-hidden="true"></i><span class="sr-only">{L_SEARCH}</span>
+				</button>
+				<a href="{U_SEARCH}" class="button button-search-end" title="{L_SEARCH_ADV}">
+					<i class="icon fa-cog fa-fw" aria-hidden="true"></i><span class="sr-only">{L_SEARCH_ADV}</span>
+				</a>
 				{S_SEARCH_LOCAL_HIDDEN_FIELDS}
 			</fieldset>
 			</form>
@@ -174,8 +178,10 @@
 			<dd class="profile-contact">
 				<strong>{L_CONTACT}{L_COLON}</strong>
 				<div class="dropdown-container dropdown-left">
-					<a href="#" class="dropdown-trigger"><span class="imageset icon_contact" title="{postrow.CONTACT_USER}">{postrow.CONTACT_USER}</span></a>
-					<div class="dropdown hidden">
+					<a href="#" class="dropdown-trigger" title="{postrow.CONTACT_USER}">
+						<i class="icon fa-commenting-o fa-fw icon-lg" aria-hidden="true"></i><span class="sr-only">{postrow.CONTACT_USER}</span>
+					</a>
+					<div class="dropdown">
 						<div class="pointer"><div class="pointer-inner"></div></div>
 						<div class="dropdown-contents contact-icons">
 							<!-- BEGIN contact -->
@@ -217,7 +223,7 @@
 			<div id="post_content{postrow.POST_ID}"<!-- IF postrow.S_POST_HIDDEN --> style="display: none;"<!-- ENDIF -->>
 
 			<!-- EVENT viewtopic_body_post_subject_before -->
-			<h3 <!-- IF postrow.S_FIRST_ROW -->class="first"<!-- ENDIF -->><!-- IF postrow.POST_ICON_IMG --><img src="{T_ICONS_PATH}{postrow.POST_ICON_IMG}" width="{postrow.POST_ICON_IMG_WIDTH}" height="{postrow.POST_ICON_IMG_HEIGHT}" alt="" /> <!-- ENDIF --><a href="#p{postrow.POST_ID}">{postrow.POST_SUBJECT}</a></h3>
+			<h3 <!-- IF postrow.S_FIRST_ROW -->class="first"<!-- ENDIF -->><!-- IF postrow.POST_ICON_IMG --><img src="{T_ICONS_PATH}{postrow.POST_ICON_IMG}" width="{postrow.POST_ICON_IMG_WIDTH}" height="{postrow.POST_ICON_IMG_HEIGHT}" alt="{postrow.POST_ICON_IMG_ALT}" title="{postrow.POST_ICON_IMG_ALT}" /> <!-- ENDIF --><a href="#p{postrow.POST_ID}">{postrow.POST_SUBJECT}</a></h3>
 
 		<!-- DEFINE $SHOW_POST_BUTTONS = (postrow.U_EDIT or postrow.U_DELETE or postrow.U_REPORT or postrow.U_WARN or postrow.U_INFO or postrow.U_QUOTE) -->
 		<!-- EVENT viewtopic_body_post_buttons_list_before -->
@@ -227,32 +233,44 @@
 					<!-- EVENT viewtopic_body_post_buttons_before -->
 					<!-- IF postrow.U_EDIT -->
 						<li>
-							<a href="{postrow.U_EDIT}" title="{L_EDIT_POST}" class="button icon-button edit-icon"><span>{L_BUTTON_EDIT}</span></a>
+							<a href="{postrow.U_EDIT}" title="{L_EDIT_POST}" class="button button-icon-only">
+								<i class="icon fa-pencil fa-fw" aria-hidden="true"></i><span class="sr-only">{L_BUTTON_EDIT}</span>
+							</a>
 						</li>
 					<!-- ENDIF -->
 					<!-- IF postrow.U_DELETE -->
 						<li>
-							<a href="{postrow.U_DELETE}" title="{L_DELETE_POST}" class="button icon-button delete-icon"><span>{L_DELETE_POST}</span></a>
+							<a href="{postrow.U_DELETE}" title="{L_DELETE_POST}" class="button button-icon-only">
+								<i class="icon fa-times fa-fw" aria-hidden="true"></i><span class="sr-only">{L_DELETE_POST}</span>
+							</a>
 						</li>
 					<!-- ENDIF -->
 					<!-- IF postrow.U_REPORT -->
 						<li>
-							<a href="{postrow.U_REPORT}" title="{L_REPORT_POST}" class="button icon-button report-icon"><span>{L_REPORT_POST}</span></a>
+							<a href="{postrow.U_REPORT}" title="{L_REPORT_POST}" class="button button-icon-only">
+								<i class="icon fa-exclamation fa-fw" aria-hidden="true"></i><span class="sr-only">{L_REPORT_POST}</span>
+							</a>
 						</li>
 					<!-- ENDIF -->
 					<!-- IF postrow.U_WARN -->
 						<li>
-							<a href="{postrow.U_WARN}" title="{L_WARN_USER}" class="button icon-button warn-icon"><span>{L_WARN_USER}</span></a>
+							<a href="{postrow.U_WARN}" title="{L_WARN_USER}" class="button button-icon-only">
+								<i class="icon fa-exclamation-triangle fa-fw" aria-hidden="true"></i><span class="sr-only">{L_WARN_USER}</span>
+							</a>
 						</li>
 					<!-- ENDIF -->
 					<!-- IF postrow.U_INFO -->
 						<li>
-							<a href="{postrow.U_INFO}" title="{L_INFORMATION}" class="button icon-button info-icon"><span>{L_INFORMATION}</span></a>
+							<a href="{postrow.U_INFO}" title="{L_INFORMATION}" class="button button-icon-only">
+								<i class="icon fa-info fa-fw" aria-hidden="true"></i><span class="sr-only">{L_INFORMATION}</span>
+							</a>
 						</li>
 					<!-- ENDIF -->
 					<!-- IF postrow.U_QUOTE -->
 						<li>
-							<a href="{postrow.U_QUOTE}" title="{L_REPLY_WITH_QUOTE}" class="button icon-button quote-icon"><span>{L_QUOTE}</span></a>
+							<a href="{postrow.U_QUOTE}" title="{L_REPLY_WITH_QUOTE}" class="button button-icon-only">
+								<i class="icon fa-quote-left fa-fw" aria-hidden="true"></i><span class="sr-only">{L_QUOTE}</span>
+							</a>
 						</li>
 					<!-- ENDIF -->
 					<!-- EVENT viewtopic_body_post_buttons_after -->
@@ -262,12 +280,22 @@
 		<!-- EVENT viewtopic_body_post_buttons_list_after -->
 
 			<!-- EVENT viewtopic_body_postrow_post_details_before -->
-			<p class="author"><!-- IF S_IS_BOT -->{postrow.MINI_POST_IMG}<!-- ELSE --><a href="{postrow.U_MINI_POST}">{postrow.MINI_POST_IMG}</a><!-- ENDIF --><span class="responsive-hide">{L_POST_BY_AUTHOR} <strong>{postrow.POST_AUTHOR_FULL}</strong> &raquo; </span>{postrow.POST_DATE} </p>
+			<p class="author">
+				<!-- IF S_IS_BOT -->
+					<span><i class="icon fa-file fa-fw <!-- IF postrow.S_UNREAD_POST -->icon-red<!-- ELSE -->icon-lightgray<!-- ENDIF --> icon-md" aria-hidden="true"></i><span class="sr-only">{postrow.MINI_POST}</span></span>
+				<!-- ELSE -->
+					<a class="unread" href="{postrow.U_MINI_POST}" title="{postrow.MINI_POST}">
+						<i class="icon fa-file fa-fw <!-- IF postrow.S_UNREAD_POST -->icon-red<!-- ELSE -->icon-lightgray<!-- ENDIF --> icon-md" aria-hidden="true"></i><span class="sr-only">{postrow.MINI_POST}</span>
+					</a>
+				<!-- ENDIF -->
+				<span class="responsive-hide">{L_POST_BY_AUTHOR} <strong>{postrow.POST_AUTHOR_FULL}</strong> &raquo; </span>{postrow.POST_DATE}
+			</p>
 			<!-- EVENT viewtopic_body_postrow_post_details_after -->
 
 			<!-- IF postrow.S_POST_UNAPPROVED -->
 			<form method="post" class="mcp_approve" action="{postrow.U_APPROVE_ACTION}">
 				<p class="post-notice unapproved">
+					<span><i class="icon fa-question icon-red fa-fw" aria-hidden="true"></i></span>
 					<strong>{L_POST_UNAPPROVED_ACTION}</strong>
 					<input class="button2" type="submit" value="{L_DISAPPROVE}" name="action[disapprove]" />
 					<input class="button1" type="submit" value="{L_APPROVE}" name="action[approve]" />
@@ -291,7 +319,7 @@
 
 			<!-- IF postrow.S_POST_REPORTED -->
 			<p class="post-notice reported">
-				<a href="{postrow.U_MCP_REPORT}"><strong>{L_POST_REPORTED}</strong></a>
+				<a href="{postrow.U_MCP_REPORT}"><i class="icon fa-exclamation fa-fw icon-red" aria-hidden="true"></i><strong>{L_POST_REPORTED}</strong></a>
 			</p>
 			<!-- ENDIF -->
 
@@ -332,7 +360,14 @@
 		</div>
 
 		<!-- EVENT viewtopic_body_postrow_back2top_before -->
-		<div class="back2top"><!-- EVENT viewtopic_body_postrow_back2top_prepend --><a href="#top" class="top" title="{L_BACK_TO_TOP}">{L_BACK_TO_TOP}</a><!-- EVENT viewtopic_body_postrow_back2top_append --></div>
+		<div class="back2top">
+			<!-- EVENT viewtopic_body_postrow_back2top_prepend -->
+			<a href="#top" class="top" title="{L_BACK_TO_TOP}">
+				<i class="icon fa-chevron-circle-up fa-fw icon-gray" aria-hidden="true"></i>
+				<span class="sr-only">{L_BACK_TO_TOP}</span>
+			</a>
+			<!-- EVENT viewtopic_body_postrow_back2top_append -->
+		</div>
 		<!-- EVENT viewtopic_body_postrow_back2top_after -->
 
 		</div>
@@ -346,39 +381,36 @@
 	<!-- INCLUDE quickreply_editor.html -->
 <!-- ENDIF -->
 
-<!-- IF S_NUM_POSTS > 1 or .pagination -->
-	<form id="viewtopic" method="post" action="{S_TOPIC_ACTION}">
-	<fieldset class="display-options" style="margin-top: 0; ">
-		<!-- IF not S_IS_BOT -->
-		<label>{L_DISPLAY_POSTS}{L_COLON} {S_SELECT_SORT_DAYS}</label>
-		<label>{L_SORT_BY} {S_SELECT_SORT_KEY}</label> <label>{S_SELECT_SORT_DIR}</label>
-		<input type="submit" name="sort" value="{L_GO}" class="button2" />
-		<!-- ENDIF -->
-	</fieldset>
-	</form>
-	<hr />
-<!-- ENDIF -->
-
 <!-- EVENT viewtopic_body_topic_actions_before -->
-<div class="action-bar bottom">
-	<div class="buttons">
-		<!-- EVENT viewtopic_buttons_bottom_before -->
+	<div class="action-bar bar-bottom">
+	<!-- EVENT viewtopic_buttons_bottom_before -->
 
 	<!-- IF not S_IS_BOT and S_DISPLAY_REPLY_INFO -->
-		<a href="{U_POST_REPLY_TOPIC}" class="button icon-button <!-- IF S_IS_LOCKED -->locked-icon<!-- ELSE -->reply-icon<!-- ENDIF -->" title="<!-- IF S_IS_LOCKED -->{L_TOPIC_LOCKED}<!-- ELSE -->{L_POST_REPLY}<!-- ENDIF -->">
-			<!-- IF S_IS_LOCKED -->{L_BUTTON_TOPIC_LOCKED}<!-- ELSE -->{L_BUTTON_POST_REPLY}<!-- ENDIF -->
+		<a href="{U_POST_REPLY_TOPIC}" class="button" title="<!-- IF S_IS_LOCKED -->{L_TOPIC_LOCKED}<!-- ELSE -->{L_POST_REPLY}<!-- ENDIF -->">
+			<!-- IF S_IS_LOCKED -->
+				<span>{L_BUTTON_TOPIC_LOCKED}</span> <i class="icon fa-lock fa-fw" aria-hidden="true"></i>
+			<!-- ELSE -->
+				<span>{L_BUTTON_POST_REPLY}</span> <i class="icon fa-reply fa-fw" aria-hidden="true"></i>
+			<!-- ENDIF -->
 		</a>
 	<!-- ENDIF -->
-
-		<!-- EVENT viewtopic_buttons_bottom_after -->
-	</div>
+	<!-- EVENT viewtopic_buttons_bottom_after -->
 
 	<!-- INCLUDE viewtopic_topic_tools.html -->
 
+	<!-- IF (S_NUM_POSTS > 1 or .pagination) and not S_IS_BOT  -->
+		<form method="post" action="{S_TOPIC_ACTION}">
+		<!-- INCLUDE display_options.html -->
+		</form>
+	<!-- ENDIF -->
+
 	<!-- IF .quickmod -->
-		<div class="dropdown-container dropdown-container-{S_CONTENT_FLOW_BEGIN} dropdown-up dropdown-{S_CONTENT_FLOW_END} dropdown-button-control" id="quickmod">
-			<span title="{L_QUICK_MOD}" class="dropdown-trigger button icon-button modtools-icon dropdown-select">{L_QUICK_MOD}</span>
-			<div class="dropdown hidden">
+	<div class="quickmod dropdown-container dropdown-container-left dropdown-up dropdown-{S_CONTENT_FLOW_END} dropdown-button-control" id="quickmod">
+		<span title="{L_QUICK_MOD}" class="button button-secondary dropdown-trigger dropdown-select">
+			<i class="icon fa-gavel fa-fw" aria-hidden="true"></i><span class="sr-only">{L_QUICK_MOD}</span>
+			<span class="caret"><i class="icon fa-sort-down fa-fw" aria-hidden="true"></i></span>
+		</span>
+		<div class="dropdown">
 				<div class="pointer"><div class="pointer-inner"></div></div>
 				<ul class="dropdown-contents">
 				<!-- BEGIN quickmod -->
@@ -389,7 +421,7 @@
 			</div>
 		</div>
 	<!-- ENDIF -->
-	
+
 	<!-- EVENT viewtopic_dropdown_bottom_custom -->
 
 	<!-- IF .pagination or TOTAL_POSTS -->
@@ -402,7 +434,6 @@
 			<!-- ENDIF -->
 		</div>
 	<!-- ENDIF -->
-	<div class="clear"></div>
 </div>
 
 <!-- EVENT viewtopic_body_footer_before -->
--- a/styles/prosilver/template/viewtopic_print.html
+++ b/styles/prosilver/template/viewtopic_print.html
@@ -11,8 +11,8 @@
 <!-- EVENT viewtopic_print_head_append -->
 </head>
 <body id="phpbb">
-<div id="wrap">
-	<a id="top" class="anchor" accesskey="t"></a>
+<div id="wrap" class="wrap">
+	<a id="top" class="top-anchor" accesskey="t"></a>
 
 	<div id="page-header">
 		<h1>{SITENAME}</h1>
@@ -22,7 +22,7 @@
 		<p><a href="{U_TOPIC}">{U_TOPIC}</a></p>
 	</div>
 
-	<div id="page-body">
+	<div id="page-body" class="page-body">
 		<div class="page-number">{PAGE_NUMBER}</div>
 		<!-- BEGIN postrow -->
 			<div class="post">
@@ -35,7 +35,7 @@
 		<!-- END postrow -->
 	</div>
 
-	<div id="page-footer">
+	<div id="page-footer" class="page-footer">
 		<div class="page-number">{S_TIMEZONE}<br />{PAGE_NUMBER}</div>
 		<div class="copyright">Powered by phpBB&reg; Forum Software &copy; phpBB Limited<br />https://www.phpbb.com/</div>
 	</div>
--- a/styles/prosilver/template/viewtopic_topic_tools.html
+++ b/styles/prosilver/template/viewtopic_topic_tools.html
@@ -1,23 +1,48 @@
 <!-- IF not S_IS_BOT and (U_WATCH_TOPIC or U_BOOKMARK_TOPIC or U_BUMP_TOPIC or U_EMAIL_TOPIC or U_PRINT_TOPIC or S_DISPLAY_TOPIC_TOOLS) -->
 	<div class="dropdown-container dropdown-button-control topic-tools">
-		<span title="{L_TOPIC_TOOLS}" class="button icon-button tools-icon dropdown-trigger dropdown-select"></span>
-		<div class="dropdown hidden">
+		<span title="{L_TOPIC_TOOLS}" class="button button-secondary dropdown-trigger dropdown-select">
+			<i class="icon fa-wrench fa-fw" aria-hidden="true"></i>
+			<span class="caret"><i class="icon fa-sort-down fa-fw" aria-hidden="true"></i></span>
+		</span>
+		<div class="dropdown">
 			<div class="pointer"><div class="pointer-inner"></div></div>
 			<ul class="dropdown-contents">
 				<!-- EVENT viewtopic_topic_tools_before -->
 				<!-- IF U_WATCH_TOPIC -->
-					<li class="small-icon icon-<!-- IF S_WATCHING_TOPIC -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->">
-						<a href="{U_WATCH_TOPIC}" class="watch-topic-link" title="{S_WATCH_TOPIC_TITLE}" data-ajax="toggle_link" data-toggle-class="small-icon icon-<!-- IF not S_WATCHING_TOPIC -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->" data-toggle-text="{S_WATCH_TOPIC_TOGGLE}" data-toggle-url="{U_WATCH_TOPIC_TOGGLE}" data-update-all=".watch-topic-link">{S_WATCH_TOPIC_TITLE}</a>
+					<li>
+						<a href="{U_WATCH_TOPIC}" class="watch-topic-link" title="{S_WATCH_TOPIC_TITLE}" data-ajax="toggle_link" data-toggle-class="icon <!-- IF S_WATCHING_TOPIC -->fa-check-square-o<!-- ELSE -->fa-square-o<!-- ENDIF --> fa-fw" data-toggle-text="{S_WATCH_TOPIC_TOGGLE}" data-toggle-url="{U_WATCH_TOPIC_TOGGLE}" data-update-all=".watch-topic-link">
+							<i class="icon <!-- IF S_WATCHING_FORUM -->fa-square-o<!-- ELSE -->fa-check-square-o<!-- ENDIF --> fa-fw" aria-hidden="true"></i><span>{S_WATCH_TOPIC_TITLE}</span>
+						</a>
 					</li>
 				<!-- ENDIF -->
 				<!-- IF U_BOOKMARK_TOPIC -->
-					<li class="small-icon icon-bookmark">
-						<a href="{U_BOOKMARK_TOPIC}" class="bookmark-link" title="{L_BOOKMARK_TOPIC}" data-ajax="alt_text" data-alt-text="{S_BOOKMARK_TOGGLE}" data-update-all=".bookmark-link">{S_BOOKMARK_TOPIC}</a>
+					<li>
+						<a href="{U_BOOKMARK_TOPIC}" class="bookmark-link" title="{L_BOOKMARK_TOPIC}" data-ajax="alt_text" data-alt-text="{S_BOOKMARK_TOGGLE}" data-update-all=".bookmark-link">
+							<i class="icon fa-bookmark-o fa-fw" aria-hidden="true"></i><span>{S_BOOKMARK_TOPIC}</span>
+						</a>
 					</li>
 				<!-- ENDIF -->
-				<!-- IF U_BUMP_TOPIC --><li class="small-icon icon-bump"><a href="{U_BUMP_TOPIC}" title="{L_BUMP_TOPIC}" data-ajax="true">{L_BUMP_TOPIC}</a></li><!-- ENDIF -->
-				<!-- IF U_EMAIL_TOPIC --><li class="small-icon icon-sendemail"><a href="{U_EMAIL_TOPIC}" title="{L_EMAIL_TOPIC}">{L_EMAIL_TOPIC}</a></li><!-- ENDIF -->
-				<!-- IF U_PRINT_TOPIC --><li class="small-icon icon-print"><a href="{U_PRINT_TOPIC}" title="{L_PRINT_TOPIC}" accesskey="p">{L_PRINT_TOPIC}</a></li><!-- ENDIF -->
+				<!-- IF U_BUMP_TOPIC -->
+				<li>
+					<a href="{U_BUMP_TOPIC}" title="{L_BUMP_TOPIC}" data-ajax="true">
+						<i class="icon fa-level-up fa-fw" aria-hidden="true"></i><span>{L_BUMP_TOPIC}</span>
+					</a>
+				</li>
+				<!-- ENDIF -->
+				<!-- IF U_EMAIL_TOPIC -->
+				<li>
+					<a href="{U_EMAIL_TOPIC}" title="{L_EMAIL_TOPIC}">
+						<i class="icon fa-envelope-o fa-fw" aria-hidden="true"></i><span>{L_EMAIL_TOPIC}</span>
+					</a>
+				</li>
+				<!-- ENDIF -->
+				<!-- IF U_PRINT_TOPIC -->
+				<li>
+					<a href="{U_PRINT_TOPIC}" title="{L_PRINT_TOPIC}" accesskey="p">
+						<i class="icon fa-print fa-fw" aria-hidden="true"></i><span>{L_PRINT_TOPIC}</span>
+					</a>
+				</li>
+				<!-- ENDIF -->
 				<!-- EVENT viewtopic_topic_tools_after -->
 			</ul>
 		</div>
--- /dev/null
+++ b/styles/prosilver/theme/base.css
@@ -0,0 +1,115 @@
+/* --------------------------------------------------------------
+	$Base
+-------------------------------------------------------------- */
+
+/** {
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing: border-box;
+	box-sizing: border-box;
+}
+*:before,
+*:after {
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing: border-box;
+	box-sizing: border-box;
+}*/
+
+/* Define your base font-size here; most elements will inherit this. _NO__DOTCOMMA__AFTER__*/
+html {
+	font-size: 1em; /* Assuming 16px... */
+	line-height: 1.5; /* 24px (This is now our magic number; all subsequent margin-bottoms and line-heights want to be a multiple of this number in order to maintain vertical rhythm.) _NO__DOTCOMMA__AFTER__*/
+	-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+body {
+	font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+	color: #333333;
+	background-color: #ffffff;
+}
+
+input,
+button,
+select,
+textarea {
+	font-family: inherit;
+	font-size: inherit;
+	line-height: inherit;
+}
+
+figure { margin: 0 }
+img { vertical-align: middle }
+
+hr {
+	margin-top: 20px;
+	margin-bottom: 20px;
+	border: 0;
+	border-top: 1px solid #e5e5e5;
+}
+
+a {
+	color: #428bca;
+	text-decoration: none;
+}
+
+a:hover,
+a:focus,
+a:active {
+	color: #2a6496;
+	text-decoration: underline;
+}
+
+blockquote,
+dl,
+dd,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+figure,
+p,
+pre { margin: 0 }
+button {
+	background: transparent;
+	border: 0;
+	padding: 0;
+}
+
+/**
+ * Work around a Firefox/IE bug where the transparent `button` background
+ * results in a loss of the default `button` focus styles.
+ */
+button:focus {
+	outline: 1px dotted;
+	outline: 5px auto -webkit-focus-ring-color;
+}
+
+fieldset {
+	border: 0;
+	margin: 0;
+	padding: 0;
+}
+
+iframe { border: 0 }
+ol,
+ul {
+	list-style: none;
+	margin: 0;
+	padding: 0;
+}
+
+/**
+ * Suppress the focus outline on links that cannot be accessed via keyboard.
+ * This prevents an unwanted focus outline from appearing around elements that
+ * might still respond to pointer events.
+ */
+[tabindex="-1"]:focus { outline: none !important }
+
+/**
+ * Remove double underline from recent version of firefox
+ */
+abbr[title] {
+	text-decoration: none;
+}
+
--- a/styles/prosilver/theme/bidi.css
+++ b/styles/prosilver/theme/bidi.css
@@ -20,6 +20,11 @@
 
 /* Main blocks
 ---------------------------------------- */
+.rtl .icon {
+	padding-right: 0;
+	padding-left: 2px;
+}
+
 .rtl .logo {
 	float: right;
 	padding: 10px 10px 0 13px;
@@ -27,11 +32,11 @@
 
 /* Site Description
 --------------------------------------------- */
-.rtl #site-description {
+.rtl .site-description {
 	float: right;
 }
 
-.rtl #site-description h1 {
+.rtl .site-description h1 {
 	margin-left: 0;
 }
 
@@ -81,14 +86,9 @@
 	padding-right: 0;
 }
 
-.rtl ul.linklist li.responsive-menu a.responsive-menu-link:before {
-	left: auto;
-	right: 0;
-}
-
 /* Dropdown menu
 ---------------------------------------- */
-.rtl .dropdown-container.topic-tools {
+.rtl .dropdown-container.topic-tools, .rtl .dropdown-container-left {
 	float: right;
 }
 
@@ -114,12 +114,12 @@
 	text-align: right;
 }
 
-.rtl .dropdown-extended .header .header_settings {
+.rtl .dropdown-extended .header .header_settings, .rtl .dropdown-container-right {
 	float: left;
 }
 
 /* Notifications
-----------------------------------------*/
+-----------------------------------------*/
 .rtl .notification_list ul li img {
 	float: right;
 	margin-left: 5px;
@@ -261,23 +261,31 @@
 	margin-right: 0;
 }
 
-.pagination li.previous a { background-position: -50px 2px; }
-.pagination li.next a { background-position: -30px 2px; }
-.pagination li.previous a:hover { background-position: -50px -18px; }
-.pagination li.next a:hover { background-position: -30px -18px; }
+.rtl .topic-poster {
+	float: right;
+	padding-left: 0.5em;
+}
 
-/* Miscellaneous styles
+/* Action Bar styles
 ---------------------------------------- */
-.rtl #forum-permissions {
-	float: left;
-	padding-right: 5px;
-	padding-left: 0;
-	margin-right: 5px;
-	margin-left: 0;
-	text-align: left;
+.rtl .action-bar .button {
+	margin-right: 0;
+	float: right;
 }
 
-.rtl #quick-links {
+.rtl .action-bar > .button {
+	margin-left: 5px;
+	float: right;
+}
+
+.rtl .action-bar .dropdown-button-control .button {
+	margin-left: 5px;
+}
+
+
+/* Miscellaneous styles
+---------------------------------------- */
+.rtl .quick-links {
 	margin-left: 7px;
 	margin-right: 0;
 }
@@ -296,11 +304,6 @@
 * links.css
 */
 
-/* Back to top of page */
-.rtl .back2top {
-	text-align: left;
-}
-
 /* Links adjustment to correctly display an order of rtl/ltr mixed content */
 .rtl a {
 	direction: rtl;
@@ -309,7 +312,6 @@
 
 li.breadcrumbs span:first-child > a {
 	padding-left: 0;
-	padding-right: 19px;
 }
 
 /* Notification mark read link */
@@ -319,14 +321,9 @@ li.breadcrumbs span:first-child > a {
 	right: auto;
 }
 
-.rtl a.top {
+.rtl .back2top .top {
 	float: left;
-}
-
-.rtl a.top2 {
-	background-position: 100% 50%;
-	padding-left: 0;
-	padding-right: 15px;
+	margin-left: -10px;
 }
 
 .rtl .skiplink {
@@ -416,26 +413,26 @@ li.breadcrumbs span:first-child > a {
 	padding-right: 1px;
 }
 
-.rtl dl.icon {
+.rtl dl.row-item{
 	background-position: 99.5% 50%;
 }
 
-.rtl li.header dl.icon dt .list-inner {
+.rtl li.header dl.row-item dt .list-inner {
 	/* Tweak for headers alignment when folder icon used */
 	padding-right: 0;
 	padding-left: 50px;
 }
 
-.rtl dl.icon dt {
+.rtl dl.row-item dt {
 	background-position: 99.5% 95%;			/* Position of topic icon */
 }
 
-.rtl dl.icon dt .list-inner {
+.rtl dl.row-item dt .list-inner {
 	padding-left: 5px;
 	padding-right: 45px;					/* Space for folder icon */
 }
 
-.rtl dl a.icon-link {						/* topic row icon links */
+.rtl dl a.row-item-link {						/* topic row icon links */
 	display: inline-block;
 	left: auto;
 	right: 0;
@@ -461,7 +458,6 @@ li.breadcrumbs span:first-child > a {
 
 .rtl p.post-notice {
 	padding-left: 5px;
-	padding-right: 26px;
 }
 
 .rtl p.post-notice:before {
@@ -471,7 +467,7 @@ li.breadcrumbs span:first-child > a {
 
 /* Topic review panel
 ----------------------------------------*/
-.rtl #topicreview {
+.rtl .topicreview {
 	padding-right: 0;
 	padding-left: 5px;
 }
@@ -602,49 +598,12 @@ li.breadcrumbs span:first-child > a {
 /**
 * buttons.css
 */
-.rtl .dropdown-select {
-	padding-left: 24px;
-	padding-right: 8px;
-}
-
-.rtl .icon-button:before {
-	float: left;
-	margin-left: 0;
-	margin-right: 2px;
-}
-
-.rtl .dropdown-select.icon-button:before {
-	margin-left: 4px;
-	margin-right: 0;
-}
-
-.rtl .dropdown-select:after {
-	border-left: 0;
-	border-right-style: solid;
-	border-right-width: 1px;
-	left: 0;
-	right: auto;
-}
 
-.rtl .buttons, .rtl .buttons .button {
+.rtl .caret {
 	float: right;
 }
 
-.rtl .buttons .button, .rtl .dropdown-select {
-	margin-left: 5px;
-	margin-right: 0;
-}
 
-/* Icon images
----------------------------------------- */
-.rtl .small-icon {
-	background-position: 100% 50%;
-}
-
-.rtl .small-icon > a {
-	padding-left: 0;
-	padding-right: 19px;
-}
 
 /* Post control buttons
 --------------------------------------------- */
@@ -661,10 +620,6 @@ li.breadcrumbs span:first-child > a {
 	float: right;
 }
 
-.post-buttons .icon-button:before {
-	margin-right: 0;
-}
-
 /* Poster contact icons
  ----------------------------------------*/
 .rtl .contact-icons a {
@@ -687,20 +642,20 @@ li.breadcrumbs span:first-child > a {
 
 /* Main CP box
 ----------------------------------------*/
-.rtl #cp-menu {
+.rtl .cp-menu {
 	float: right;
 }
 
-.rtl #cp-main {
+.rtl .cp-main {
 	float: right;
 }
 
-.rtl #cp-main .panel ol {
+.rtl .cp-main .panel ol {
 	margin-right: 2em;
 	margin-left: 0;
 }
 
-.rtl #cp-main .buttons {
+.rtl .cp-main .buttons {
 	margin-right: 0;
 	margin-left: 0;
 }
@@ -711,52 +666,52 @@ li.breadcrumbs span:first-child > a {
 
 /* CP tabbed menu
 ----------------------------------------*/
-.rtl #tabs {
+.rtl .tabs {
 	margin-left: 0;
 	margin-right: 7px;
 }
 
-.rtl #tabs .tab {
+.rtl .tabs .tab {
 	float: right;
 }
 
-.rtl #tabs .tab > a {
+.rtl .tabs .tab > a {
 	margin-left: 1px;
 	margin-right: 0;
 }
 
 /* Mini tabbed menu used in MCP
 ----------------------------------------*/
-.rtl #minitabs {
+.rtl .minitabs {
 	float: left;
 	margin-right: 0;
 	margin-left: 7px;
 }
 
-.rtl #minitabs .tab {
+.rtl .minitabs .tab {
 	float: left;
 }
 
-.rtl #minitabs .tab > a {
+.rtl .minitabs .tab > a {
 	margin-right: 2px;
 	margin-left: 0;
 }
 
 /* Responsive tabs
 ----------------------------------------*/
-.rtl #tabs .dropdown {
+.rtl .tabs .dropdown {
 	margin-left: -2px;
 }
 
-.rtl #tabs .dropdown li {
+.rtl .tabs .dropdown li {
 	text-align: left;
 }
 
-.rtl #minitabs .dropdown {
+.rtl .minitabs .dropdown {
 	margin-left: -4px;
 }
 
-.rtl #minitabs .dropdown li {
+.rtl .minitabs .dropdown li {
 	text-align: right;
 }
 
@@ -764,7 +719,7 @@ li.breadcrumbs span:first-child > a {
 ----------------------------------------*/
 @media only screen and (max-width: 900px), only screen and (max-device-width: 900px)
 {
-	.rtl #cp-menu, .rtl #navigation, .rtl #cp-main {
+	.rtl .cp-menu, .rtl .navigation, .rtl .cp-main {
 		float: none;
 	}
 }
@@ -774,7 +729,7 @@ li.breadcrumbs span:first-child > a {
 
 /* Preferences pane layout
 ----------------------------------------*/
-.rtl #cp-main h2 {
+.rtl .cp-main h2 {
 	margin-left: 0;
 	margin-right: 10px;
 }
@@ -815,7 +770,7 @@ li.breadcrumbs span:first-child > a {
 }
 
 /* Avatar gallery */
-.rtl #gallery label {
+.rtl .gallery label {
 	float: right;
 }
 
@@ -823,7 +778,7 @@ li.breadcrumbs span:first-child > a {
 ----------------------------------------*/
 @media only screen and (max-width: 900px), only screen and (max-device-width: 900px)
 {
-	.rtl #cp-menu, .rtl #navigation, .rtl #cp-main {
+	.rtl .cp-menu, .rtl .navigation, .rtl .cp-main {
 		float: none;
 	}
 }
@@ -910,6 +865,10 @@ li.breadcrumbs span:first-child > a {
 	padding-right: 0;
 }
 
+.rtl .dropdown fieldset.display-options label {
+	text-align: left;
+}
+
 /* Display actions for ucp and mcp pages */
 .rtl fieldset.display-actions {
 	text-align: left;
@@ -935,7 +894,7 @@ li.breadcrumbs span:first-child > a {
 ----------------------------------------*/
 
 /* Emoticons panel */
-.rtl #smiley-box {
+.rtl .smiley-box {
 	float: left;
 }
 
@@ -955,16 +914,19 @@ li.breadcrumbs span:first-child > a {
 	padding: 3px;
 }
 
-.rtl .search-box .button {
+.rtl .button-search,
+.button-search-end {
 	float: right;
 }
 
-.rtl .search-box a.button {
+.button-search-end {
 	border-left-width: 1px;
 	border-right-width: 0;
+}
+
+.rtl .search-header .button-search-end {
+	border: 0;
 	border-radius: 4px 0 0 4px;
-	padding-left: 5px;
-	padding-right: 3px;
 }
 
 .rtl .search-header {
@@ -973,47 +935,14 @@ li.breadcrumbs span:first-child > a {
 	margin-left: 5px;
 }
 
-.rtl input.search {
-	background-position: right 1px;
-	padding-right: 17px;
-	padding-left: 0;
-}
-
-
 /* Form button styles
 ---------------------------------------- */
 
 /** Reference: Bug #27155 */
-.rtl #wrap, .rtl .headerbar, .rtl #site-description, .rtl .navbar {
+.rtl .wrap, .rtl .headerbar, .rtl .site-description, .rtl .navbar {
 	position: relative;
 }
 
-/* Former imageset */
-.rtl .imageset.forum_link, .rtl .imageset.forum_read, .rtl .imageset.forum_read_locked, .rtl .imageset.forum_read_subforum, .rtl .imageset.forum_unread, .rtl .imageset.forum_unread_locked, .rtl .imageset.forum_unread_subforum, .rtl .imageset.topic_moved, .rtl .imageset.topic_read, .rtl .imageset.topic_read_mine, .rtl .imageset.topic_read_hot, .rtl .imageset.topic_read_hot_mine, .rtl .imageset.topic_read_locked, .rtl .imageset.topic_read_locked_mine, .rtl .imageset.topic_unread, .rtl .imageset.topic_unread_mine, .rtl .imageset.topic_unread_hot, .rtl .imageset.topic_unread_hot_mine, .rtl .imageset.topic_unread_locked, .rtl .imageset.topic_unread_locked_mine, .rtl .imageset.sticky_read, .rtl .imageset.sticky_read_mine, .rtl .imageset.sticky_read_locked, .rtl .imageset.sticky_read_locked_mine, .rtl .imageset.sticky_unread, .rtl .imageset.sticky_unread_mine, .rtl .imageset.sticky_unread_locked, .rtl .imageset.sticky_unread_locked_mine, .rtl .imageset.announce_read, .rtl .imageset.announce_read_mine, .rtl .imageset.announce_read_locked, .rtl .imageset.announce_read_locked_mine, .rtl .imageset.announce_unread, .rtl .imageset.announce_unread_mine, .rtl .imageset.announce_unread_locked, .rtl .imageset.announce_unread_locked_mine, .rtl .imageset.global_read, .rtl .imageset.global_read_mine, .rtl .imageset.global_read_locked, .rtl .imageset.global_read_locked_mine, .rtl .imageset.global_unread, .rtl .imageset.global_unread_mine, .rtl .imageset.global_unread_locked, .rtl .imageset.global_unread_locked_mine, .rtl .imageset.pm_read, .rtl .imageset.pm_unread {
-	padding-right: 27px;
-	padding-left: 0;
-}
-.rtl .imageset.subforum_read, .rtl .imageset.subforum_unread, .rtl .imageset.icon_post_target, .rtl .imageset.icon_post_target_unread, .rtl .imageset.icon_topic_latest, .rtl .imageset.icon_topic_newest {
-	padding-right: 11px;
-	padding-left: 0;
-}
-.rtl .imageset.icon_back_top {
-	padding-right: 11px;
-	padding-left: 0;
-}
-.rtl .imageset.icon_contact_aim, .rtl .imageset.phpbb_aol-icon, .rtl .imageset.icon_contact_email, .rtl .imageset.icon_contact_icq, .rtl .imageset.phpbb_icq-icon, .rtl .imageset.icon_contact_jabber, .rtl .imageset.icon_contact_msnm, .rtl .imageset.phpbb_wlm-icon, .rtl .imageset.icon_contact_www, .rtl .imageset.phpbb_website-icon, .rtl .imageset.icon_contact_yahoo, .rtl .imageset.phpbb_yahoo-icon, .rtl .imageset.icon_post_delete, .rtl .imageset.icon_post_info, .rtl .imageset.icon_post_report, .rtl .imageset.icon_user_warn {
-	padding-right: 20px;
-	padding-left: 0;
-}
-.rtl .imageset.icon_topic_attach {
-	padding-right: 7px;
-	padding-left: 0;
-}
-.rtl .imageset.icon_topic_reported, .rtl .imageset.icon_topic_unapproved {
-	padding-right: 16px;
-	padding-left: 0;
-}
-
 /**
 * plupload.css
 */
--- a/styles/prosilver/theme/buttons.css
+++ b/styles/prosilver/theme/buttons.css
@@ -2,125 +2,71 @@
 ---------------------------------------- */
 
 .button {
-	cursor: pointer;
 	display: inline-block;
-	height: 18px;
-	font-size: 1.2em;
+	padding: 2px 8px;
+	font-size: 13px;
+	font-weight: normal;
+	font-family: "Open Sans", "Droid Sans", Verdana, Arial, Helvetica;
+	line-height: 1.4;
+	text-align: center;
 	white-space: nowrap;
+	vertical-align: middle;
+	-ms-touch-action: manipulation;
+	    touch-action: manipulation;
+	cursor: pointer;
+	-webkit-user-select: none;
+	   -moz-user-select: none;
+	    -ms-user-select: none;
+	        user-select: none;
 	border: 1px solid transparent;
 	border-radius: 4px;
-	background: transparent none 0 0 repeat-x;
-	padding: 2px 8px;
-	font-family: "Open Sans", "Droid Sans", Verdana, Arial, Helvetica;
-	position: relative;
-	text-decoration: none !important;
-	outline-style: none !important;
-	vertical-align: bottom;
 }
 
-.dropdown-select {
-	padding-right: 24px;
+.button:focus,
+.button:hover {
+ 	text-decoration: none;
+ 	outline: none;
 }
 
-.icon-button:before {
-	background: transparent 0 0 no-repeat;
-	content: '';
-	display: inline-block;
-	float: right;
-	height: 12px;
-	margin: 3px 0 0 2px;
-	width: 12px;
-}
-
-.dropdown-select.icon-button:before {
-	margin-right: 4px;
-}
-
-.dropdown-select:after {
-	background-position: -103px 10px;
+.caret {
 	border-left: 1px solid;
-	content: '';
-	position: absolute;
-	top: 0;
-	right: 0;
-	height: 22px;
-	width: 16px;
+	position: relative;
+	right: -6px;
 }
 
-.dropdown-visible .dropdown-select:after, .nojs .dropdown-container:hover .dropdown-select:after {
-	background-position: -103px -10px;
+.caret i {
+	vertical-align: top;
 }
 
-.buttons, .buttons .button {
+/* Posting page styles
+----------------------------------------*/
+.button-search,
+.button-search-end  {
 	float: left;
-}
-
-.buttons .button, .dropdown-select {
-	margin-right: 5px;
-}
-
-#jumpbox .dropdown-select {
+	border-radius: 0;
 	margin: 0;
+	padding: 2px 5px;
 }
 
-/* Big button images */
-.reply-icon:before, .pmreply-icon:before					{ background-position: -20px 0; }
-.reply-icon:hover:before, .pmreply-icon:hover:before		{ background-position: -20px -20px; }
-
-.post-icon:before, .newpm-icon:before, .reply-all:before	{ background-position: 0 0; }
-.post-icon:hover:before,
-.newpm-icon:hover:before,
-.reply-all:hover:before										{ background-position: 0 -20px; }
-
-.locked-icon:before											{ background-position: -60px 0; }
-.locked-icon:hover:before									{ background-position: -60px -20px; }
-
-.forwardpm-icon:before										{ background-position: -40px 0; }
-.forwardpm-icon:hover:before								{ background-position: -40px -20px; }
-
-.modtools-icon {
-	font-size: 0;
+.button-search-end {
+	border-left-width: 0;
+	border-radius: 0 4px 4px 0;
 }
 
-.tools-icon:before, .modtools-icon:before, .search-icon:before, .search-adv-icon:before {
-	background-position: -80px 0;
-	height: 16px;
-	margin-top: 2px;
-	width: 16px;
+.search-header .button-search,
+.search-header .button-search-end {
+	border-top-width: 0;
+	border-bottom-width: 0;
+	padding: 3px 5px;
 }
 
-.dropdown-visible .tools-icon:before,
-.nojs .dropdown-container:hover .tools-icon:before			{ background-position: -80px -20px; }
-
-.search-icon:before											{ background-position: -245px 0; }
-.search-icon:hover:before									{ background-position: -245px -20px; }
-
-.search-adv-icon:before										{ background-position: -265px 0; }
-.search-adv-icon:hover:before								{ background-position: -265px -20px; }
-
-.modtools-icon:before										{ background-position: -225px 0; }
-.dropdown-visible .modtools-icon:before,
-.nojs .dropdown-container:hover .modtools-icon:before		{ background-position: -225px -20px; }
-
-/* Icon images
----------------------------------------- */
-.small-icon {
-	background-position: 0 50%;
-	background-repeat: no-repeat;
-	background-image: none;
+.search-header .button-search-end {
+	border-right-width: 0;
 }
 
-.small-icon > a {
-	display: inline-block;
-	padding: 0 0 0 18px;
-}
-
-ul.linklist.bulletin > li.small-icon:before {
-	display: none;
-}
-
-.dropdown .small-icon > a {
-	display: block;
+.button-icon-only {
+	padding-left: 3px;
+	padding-right: 3px;
 }
 
 /* Poster contact icons
@@ -157,21 +103,6 @@ ul.linklist.bulletin > li.small-icon:before {
 	clear: left;
 }
 
-/* Profile icons */
-.pm-icon		{ background-position: 0 0; }
-.email-icon		{ background-position: -21px 0; }
-.jabber-icon	{ background-position: -80px 0; }
-.phpbb_icq-icon	{ background-position: -61px 0 ; }
-.phpbb_wlm-icon	{ background-position: -182px 0; }
-.phpbb_aol-icon	{ background-position: -244px 0; }
-.phpbb_website-icon		{ background-position: -40px 0; }
-.phpbb_youtube-icon		{ background-position: -98px 0; }
-.phpbb_facebook-icon	{ background-position: -119px 0; }
-.phpbb_googleplus-icon	{ background-position: -140px 0; }
-.phpbb_skype-icon		{ background-position: -161px 0; }
-.phpbb_twitter-icon		{ background-position: -203px 0; }
-.phpbb_yahoo-icon		{ background-position: -224px 0; }
-
 /* Post control buttons
 --------------------------------------------- */
 .post-buttons {
@@ -193,41 +124,19 @@ ul.linklist.bulletin > li.small-icon:before {
 	margin-right: 3px;
 }
 
-.post-buttons .icon-button {
-	padding: 0 5px;
+.post-buttons .button, .format-buttons .button {
+	padding-left: 3px;
+	padding-right: 3px;
 }
 
-.hastouch .post-buttons .icon-button {
-	padding: 2px 8px;
+.hastouch .post-buttons {
+	margin-right: 10px;
 }
 
-.post-buttons .icon-button span {
-	display: block;
-	height: 0;
-	overflow: hidden;
-	position: absolute;
-	width: 1px;
-}
-
-.post-buttons .icon-button:before {
-	margin-left: 0;
+.post-buttons .button span {
+	font-size: 0;
 }
 
-.quote-icon:before							{ background-position: -122px 0; }
-.quote-icon:hover:before					{ background-position: -122px -21px; }
-.edit-icon:before							{ background-position: -137px 0; }
-.edit-icon:hover:before						{ background-position: -137px -21px; }
-.warn-icon:before							{ background-position: -208px 0; }
-.warn-icon:hover:before						{ background-position: -208px -21px; }
-.delete-icon:before							{ background-position: -152px 0; }
-.delete-icon:hover:before					{ background-position: -152px -21px; }
-.report-icon:before							{ background-position: -165px 0; }
-.report-icon:hover:before					{ background-position: -165px -21px; }
-.info-icon:before							{ background-position: -175px 0; }
-.info-icon:hover:before						{ background-position: -175px -21px; }
-.button.responsive-menu-link:before			{ background-position: -191px 0; }
-.button.responsive-menu-link:hover:before	{ background-position: -191px -21px; }
-
 /* Responsive buttons in post body */
 .post-buttons .dropdown {
 	top: 18px;
@@ -248,3 +157,37 @@ button::-moz-focus-inner {
 	padding: 0;
 	border: 0
 }
+
+/* Deprecated as of version 3.2
+-------------------------------------------------*/
+.small-icon {
+	background-position: 0 50%;
+	background-repeat: no-repeat;
+	background-image: none;
+}
+
+.dropdown .small-icon {
+	background-position: 5px 50%;
+	padding: 5px;
+}
+
+.small-icon > a {
+	padding: 0 0 0 18px;
+}
+
+ul.linklist.bulletin > li.small-icon:before {
+	display: none;
+}
+
+.dropdown .small-icon > a {
+	display: block;
+}
+
+.rtl .small-icon {
+	background-position: 100% 50%;
+}
+
+.rtl .small-icon > a {
+	padding-left: 0;
+	padding-right: 19px;
+}
--- a/styles/prosilver/theme/colours.css
+++ b/styles/prosilver/theme/colours.css
@@ -26,45 +26,85 @@ hr {
 	border-top-color: #CCCCCC;
 }
 
-/* Search box
---------------------------------------------- */
+/*
+--------------------------------------------------------------
+Colours and backgrounds for links.css
+-------------------------------------------------------------- */
 
-.search-box .inputbox,
-.search-box .inputbox:hover,
-.search-box .inputbox:focus,
-.search-box .button:hover {
-	border-color: #C7C3BF;
+a { color: #105289; }
+a:hover { color: #D31141; }
+
+/* Links on gradient backgrounds */
+.forumbg .header a, .forabg .header a, th a {
+	color: #FFFFFF;
 }
 
-.search-header {
-	box-shadow: 0 0 10px #0075B0;
+.forumbg .header a:hover, .forabg .header a:hover, th a:hover {
+	color: #A8D8FF;
+}
+
+/* Notification mark read link */
+.dropdown-extended a.mark_read {
+	background-color: #FFFFFF;
+}
+
+/* Post body links */
+.postlink {
+	border-bottom-color: #368AD2;
+	color: #368AD2;
+}
+
+.postlink:visited {
+	border-bottom-color: #5D8FBD;
+	color: #5D8FBD;
+}
+
+.postlink:hover {
+	background-color: #D0E4F6;
+	color: #0D4473;
+}
+
+.signature a, .signature a:hover {
+	background-color: transparent;
+}
+
+/* Back to top of page */
+.top i {
+	color: #999999;
+}
+
+/* Arrow links  */
+.arrow-left:hover, .arrow-right:hover {
+	color: #368AD2;
 }
 
 /* Round cornered boxes and backgrounds
 ---------------------------------------- */
-#wrap {
+.wrap {
 	background-color: #FFF;
 	border-color: #E6E9ED;
 }
 
 .headerbar {
-	background-color: #12A3EB;
-	background-image: url("./images/bg_header.gif");
 	color: #FFFFFF;
 }
 
-.navbar {
-	background-color: #cadceb;
+.headerbar, .forumbg {
+	background-color: #12A3EB;
+	background-image: -webkit-linear-gradient(top, #6ACEFF 0%, #0076B1 2px, #12A3EB 92px, #12A3EB 100%);
+	background-image: linear-gradient(to bottom, #6ACEFF 0%,#0076B1 2px,#12A3EB 92px,#12A3EB 100%);
+	background-repeat: repeat-x;
 }
 
 .forabg {
-	background-color: #0076b1;
-	background-image: url("./images/bg_list.gif");
+	background-color: #0076B1;
+	background-image: -webkit-linear-gradient(top, #6ACEFF 0%, #12A3EB 2px, #0076B1 92px, #0076B1 100%);
+	background-image: linear-gradient(to bottom, #6ACEFF 0%,#12A3EB 2px,#0076B1 92px,#0076B1 100%);
+	background-repeat: repeat-x;
 }
 
-.forumbg {
-	background-color: #12A3EB;
-	background-image: url("./images/bg_header.gif");
+.navbar {
+	background-color: #CADCEB;
 }
 
 .panel {
@@ -89,15 +129,15 @@ table.zebra-list tr:nth-child(odd) td, ul.zebra-list li:nth-child(odd) {
 }
 
 .bg2 {
-	background-color: #e1ebf2;
+	background-color: #E1EBF2;
 }
 
 table.zebra-list tr:nth-child(even) td, ul.zebra-list li:nth-child(even) {
-	background-color: #e1ebf2;
+	background-color: #E1EBF2;
 }
 
 .bg3	{
-	background-color: #cadceb;
+	background-color: #CADCEB;
 }
 
 .ucprowbg {
@@ -108,6 +148,10 @@ table.zebra-list tr:nth-child(even) td, ul.zebra-list li:nth-child(even) {
 	background-color: #E7E8EA;
 }
 
+.site_logo {
+	background-image: url("./images/site_logo.gif");
+}
+
 /* Horizontal lists
 ----------------------------------------*/
 
@@ -162,152 +206,111 @@ dl.details dd {
 	color: #1198D9;
 }
 
-/* Pagination
+/* Icon styles
 ---------------------------------------- */
-
-.pagination li a {
-	background-color: #ECEDEE;
-	border-color: #B4BAC0;
-	color: #5C758C;
-}
-
-.pagination li.ellipsis span {
-	background-color: transparent;
-	color:	#000000;
-}
-
-.pagination li.active span {
-	background-color: #4692BF;
-	border-color: #4692BF;
-	color: #FFFFFF;
+.icon.icon-blue, a:hover .icon.icon-blue {
+	color: #196db5;
 }
 
-.pagination li a:hover, .pagination .dropdown-visible a.dropdown-trigger, .nojs .pagination .dropdown-container:hover a.dropdown-trigger {
-	background-color: #368AD2;
-	border-color: #368AD2;
-	color: #FFFFFF;
+.icon.icon-green, a:hover .icon.icon-green{
+	color: #1b9A1B;
 }
 
-.pagination li.next a, .pagination li.previous a, .pagination li.page-jump a {
-	background-image: url("./images/icons_pagination.png");
+.icon.icon-red, a:hover .icon.icon-red{
+	color: #BC2A4D;
 }
 
-/* Pagination in viewforum for multipage topics */
-.row .pagination {
-	background-image: url("./images/icon_pages.gif");
+.icon.icon-orange, a:hover .icon.icon-orange{
+	color: #FF6600;
 }
 
-/* Miscellaneous styles
----------------------------------------- */
-
-.copyright {
-	color: #555555;
+.icon.icon-bluegray, a:hover .icon.icon-bluegray{
+	color: #536482;
 }
 
-.error {
-	color: #BC2A4D;
+.icon.icon-gray, a:hover .icon.icon-gray{
+	color: #777777;
 }
 
-.reported {
-	background-color: #F7ECEF;
+.icon.icon-lightgray, a:hover .icon.icon-lightgray{
+	color: #999999;
 }
 
-li.reported:hover {
-	background-color: #ECD5D8 !important;
-}
-.sticky, .announce {
-	/* you can add a background for stickies and announcements*/
+.icon.icon-black, a:hover .icon.icon-black{
+	color: #333333;
 }
 
-div.rules {
-	background-color: #ECD5D8;
-	color: #BC2A4D;
+.alert_close .icon:before {
+	background-color: #FFFFFF;
 }
 
-p.post-notice {
-	background-color: #ECD5D8;
-	background-image: none;
+/* Jumpbox */
+.jumpbox .dropdown li {
+	border-top-color: #CCCCCC;
 }
 
-p.post-notice.deleted:before {
-	background-image: url("./images/icon_topic_deleted.png");
+.jumpbox-cat-link {
+	background-color: #0076b1;
+	border-top-color: #0076B1;
+	color: #FFFFFF;
 }
 
-p.post-notice.unapproved:before {
-	background-image: url("./images/icon_topic_unapproved.gif");
+.jumpbox-cat-link:hover {
+	background-color: #12A3EB;
+	border-top-color: #12A3EB;
+	color: #FFFFFF;
 }
 
-p.post-notice.reported:before, p.post-notice.error:before {
-	background-image: url("./images/icon_topic_reported.gif");
+.jumpbox-forum-link {
+	background-color: #E1EBF2;
 }
 
-/*
---------------------------------------------------------------
-Colours and backgrounds for links.css
--------------------------------------------------------------- */
-
-a { color: #105289; }
-a:hover	{ color: #D31141; }
-
-/* Links on gradient backgrounds */
-.forumbg .header a, .forabg .header a, th a {
-	color: #FFFFFF;
+.jumpbox-forum-link:hover {
+	background-color: #F6F4D0;
 }
 
-.forumbg .header a:hover, .forabg .header a:hover, th a:hover {
-	color: #A8D8FF;
+.jumpbox .dropdown .pointer-inner {
+	border-color: #E1EBF2 transparent;
 }
 
-/* Notification mark read link */
-.dropdown-extended a.mark_read {
-	background-color: #FFFFFF;
+.jumpbox-sub-link {
+	background-color: #E1EBF2;
 }
 
-/* Post body links */
-.postlink {
-	border-bottom-color: #368AD2;
-	color: #368AD2;
+.jumpbox-sub-link:hover {
+	background-color: #F1F8FF;
 }
 
-.postlink:visited {
-	border-bottom-color: #5D8FBD;
-	color: #5D8FBD;
-}
+/* Miscellaneous styles
+---------------------------------------- */
 
-.postlink:hover {
-	background-color: #D0E4F6;
-	color: #0D4473;
+.copyright {
+	color: #555555;
 }
 
-.signature a, .signature a:hover {
-	background-color: transparent;
+.error {
+	color: #BC2A4D;
 }
 
-/* Back to top of page */
-a.top {
-	background-image: url("./images/icon_back_top.gif");
+.reported {
+	background-color: #F7ECEF;
 }
 
-a.top2 {
-	background-image: url("./images/icon_back_top.gif");
+li.reported:hover {
+	background-color: #ECD5D8 !important;
 }
-
-/* Arrow links  */
-a.arrow-up			{ background-image: url("./images/arrow_up.gif"); }
-a.arrow-down		{ background-image: url("./images/arrow_down.gif"); }
-a.arrow-left		{ background-image: url("./images/arrow_left.gif"); }
-a.arrow-right		{ background-image: url("./images/arrow_right.gif"); }
-
-a.arrow-up:hover {
-	background-color: transparent;
+.sticky, .announce {
+	/* you can add a background for stickies and announcements*/
 }
 
-a.arrow-left:hover {
-	color: #368AD2;
+div.rules {
+	background-color: #ECD5D8;
+	color: #BC2A4D;
 }
 
-a.arrow-right:hover {
-	color: #368AD2;
+p.post-notice {
+	background-color: #ECD5D8;
+	background-image: none;
 }
 
 /*
@@ -316,8 +319,10 @@ Colours and backgrounds for content.css
 -------------------------------------------------------------- */
 
 ul.forums {
-	background-color: #eef5f9;
-	background-image: url("./images/gradient.gif");
+	background-color: #EEF5F9; /* Old browsers */ /* FF3.6+ */
+	background-image: -webkit-linear-gradient(top, #D2E0EB 0%, #EEF5F9 100%);
+	background-image: linear-gradient(to bottom, #D2E0EB 0%,#EEF5F9 100%); /* W3C */
+	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#D2E0EB', endColorstr='#EEF5F9',GradientType=0 ); /* IE6-9 */
 }
 
 ul.topiclist li {
@@ -329,18 +334,10 @@ ul.topiclist dd {
 }
 
 .rtl ul.topiclist dd {
-	border-right-color: #fff;
+	border-right-color: #FFFFFF;
 	border-left-color: transparent;
 }
 
-ul.topiclist li.row dt a.subforum.read {
-	background-image: url("./images/subforum_read.gif");
-}
-
-ul.topiclist li.row dt a.subforum.unread {
-	background-image: url("./images/subforum_unread.gif");
-}
-
 li.row {
 	border-top-color:  #FFFFFF;
 	border-bottom-color: #00608F;
@@ -600,130 +597,165 @@ Colours and backgrounds for buttons.css
 -------------------------------------------------------------- */
 .button {
 	border-color: #C7C3BF;
-	background-color: #FFFFFF;
-	background-image: -moz-linear-gradient(top, #FFFFFF, #E9E9E9);
-	background-image: -webkit-linear-gradient(top, #FFFFFF, #E9E9E9);
-	background-image: -o-linear-gradient(top, #FFFFFF, #E9E9E9);
-	background-image: linear-gradient(to bottom, #FFFFFF, #E9E9E9);
-	-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#FFFFFF', EndColorStr='#E9E9E9')";
+	background-color: #E9E9E9; /* Old browsers */ /* FF3.6+ */
+	background-image: -webkit-linear-gradient(top, #FFFFFF 0%, #E9E9E9 100%);
+	background-image: linear-gradient(to bottom, #FFFFFF 0%,#E9E9E9 100%); /* W3C */
+	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#FFFFFF', endColorstr='#E9E9E9',GradientType=0 ); /* IE6-9 */
 	box-shadow: 0 0 0 1px #FFFFFF inset;
 	-webkit-box-shadow: 0 0 0 1px #FFFFFF inset;
 	color: #D31141;
 }
 
-.dropdown-select {
-	color: #536482;
+.button:hover,
+.button:focus {
+	border-color: #0A8ED0;
+	background-color: #FFFFFF; /* Old browsers */ /* FF3.6+ */
+	background-image: -webkit-linear-gradient(top, #E9E9E9 0%, #FFFFFF 100%);
+	background-image: linear-gradient(to bottom, #E9E9E9 0%,#FFFFFF 100%); /* W3C */
+	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#E9E9E9', endColorstr='#FFFFFF',GradientType=0 ); /* IE6-9 */
+	text-shadow: 1px 1px 0 #FFFFFF, -1px -1px 0 #FFFFFF, -1px -1px 0 rgba(188, 42, 77, 0.2);
 }
 
-.button:hover, .dropdown-visible .dropdown-select, .nojs .dropdown-container:hover .dropdown-select {
-	border-color: #0a8ed0;
-	background-image: -moz-linear-gradient(top, #E9E9E9, #FFFFFF);
-	background-image: -webkit-linear-gradient(top, #E9E9E9, #FFFFFF);
-	background-image: -o-linear-gradient(top, #E9E9E9, #FFFFFF);
-	background-image: linear-gradient(to bottom, #E9E9E9, #FFFFFF);
-	-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#E9E9E9', EndColorStr='#FFFFFF')";
-	text-shadow: 1px 1px 0 #FFFFFF, -1px -1px 0 #FFFFFF, -1px -1px 0 rgba(188, 42, 77, 0.2);
+
+.button .icon,
+.button-secondary {
+	color: #8f8f8f;
 }
 
-.dropdown-select:after	{ border-color: #DADADA; }
-.dropdown-select:hover	{ border-color: #C7C3BF; }
+.button-secondary:focus,
+.button-secondary:hover,
+.button:focus .icon,
+.button:hover .icon {
+	color: #0A8ED0;
+}
 
-.dropdown-visible .dropdown-select, .dropdown-visible .dropdown-select:hover, .nojs .dropdown-container:hover .dropdown-select {
-	border-color: #A6B2BA;
-	color: #105289;
+.button-search:hover,
+.button-search-end:hover {
+	border-color: #C7C3BF;
 }
 
+.caret	{ border-color: #DADADA; }
+.caret	{ border-color: #C7C3BF; }
+
 .contact-icons a		{ border-color: #DCDCDC; }
 .contact-icons a:hover	{ background-color: #F2F6F9; }
 
+/* Pagination
+---------------------------------------- */
+
+.pagination li a {
+	background: #ECEDEE;
+	filter: none;
+	border-color: #B4BAC0;
+	box-shadow: none;
+	-webkit-box-shadow: none;
+	color: #5C758C;
+}
+
+.pagination li.ellipsis span {
+	background: transparent;
+	color:	#000000;
+}
+
+.pagination li.active span {
+	background: #4692BF;
+	border-color: #4692BF;
+	color: #FFFFFF;
+}
+
+.pagination li a:hover, .pagination li a:hover .icon, .pagination .dropdown-visible a.dropdown-trigger, .nojs .pagination .dropdown-container:hover a.dropdown-trigger {
+	background: #368AD2;
+	border-color: #368AD2;
+	filter: none;
+	color: #FFFFFF;
+	text-shadow: none;
+}
+
+/* Search box
+--------------------------------------------- */
+
+.search-box .inputbox,
+.search-box .inputbox:hover,
+.search-box .inputbox:focus {
+	border-color: #C7C3BF;
+}
+
+.search-header {
+	box-shadow: 0 0 10px #0075B0;
+}
+
 /* Icon images
 ---------------------------------------- */
-.icon-acp					{ background-image: url("./images/icon_acp.gif"); }
-.icon-bookmark				{ background-image: url("./images/icon_bookmark.gif"); }
-.icon-bump					{ background-image: url("./images/icon_bump.gif"); }
-.icon-contact				{ background-image: url("./images/icon_pm.gif"); }
-.icon-delete-cookies		{ background-image: url("./images/icon_delete_cookies.gif"); }
-.icon-download				{ background-image: url("./images/icon_download.gif"); }
-.icon-faq					{ background-image: url("./images/icon_faq.gif"); }
-.icon-home					{ background-image: url("./images/icon_home.gif"); }
-.icon-logout				{ background-image: url("./images/icon_logout.gif"); }
-.icon-mark					{ background-image: url("./images/icon_mark.gif"); }
-.icon-mcp					{ background-image: url("./images/icon_mcp.gif"); }
-.icon-members				{ background-image: url("./images/icon_members.gif"); }
-.icon-notification			{ background-image: url("./images/icon_notification.gif"); }
-.icon-pages					{ background-image: url("./images/icon_pages.gif"); }
-.icon-pm					{ background-image: url("./images/icon_pm.gif"); }
-.icon-print					{ background-image: url("./images/icon_print.gif"); }
-.icon-profile				{ background-image: url("./images/icon_profile.gif"); }
-.icon-register				{ background-image: url("./images/icon_register.gif"); }
-.icon-search, .responsive-search a	{ background-image: url("./images/icon_search.gif"); }
-.icon-search-active			{ background-image: url("./images/subforum_read.gif"); }
-.icon-search-new			{ background-image: url("./images/subforum_unread.gif"); }
-.icon-search-self			{ background-image: url("./images/icon_topic_latest.gif"); }
-.icon-search-unanswered		{ background-image: url("./images/icon_post_target.gif"); }
-.icon-search-unread			{ background-image: url("./images/subforum_unread.gif"); }
-.icon-sendemail				{ background-image: url("./images/icon_sendemail.gif"); }
-.icon-subscribe				{ background-image: url("./images/icon_subscribe.gif"); }
-.icon-team					{ background-image: url("./images/icon_team.gif"); }
-.icon-ucp					{ background-image: url("./images/icon_ucp.gif"); }
-.icon-unsubscribe			{ background-image: url("./images/icon_unsubscribe.gif"); }
+
+.contact-icon						{ background-image: url("./images/icons_contact.png"); }
 
 /* Profile & navigation icons */
-.contact-icon													{ background-image: url("./images/icons_contact.png"); }
-.icon-button:before, .dropdown-select:after						{ background-image: url("./images/icons_button.png"); }
+.pm-icon							{ background-position: 0 0; }
+.email-icon							{ background-position: -21px 0; }
+.jabber-icon						{ background-position: -80px 0; }
+.phpbb_icq-icon						{ background-position: -61px 0 ; }
+.phpbb_wlm-icon						{ background-position: -182px 0; }
+.phpbb_aol-icon						{ background-position: -244px 0; }
+.phpbb_website-icon					{ background-position: -40px 0; }
+.phpbb_youtube-icon					{ background-position: -98px 0; }
+.phpbb_facebook-icon				{ background-position: -119px 0; }
+.phpbb_googleplus-icon				{ background-position: -140px 0; }
+.phpbb_skype-icon					{ background-position: -161px 0; }
+.phpbb_twitter-icon					{ background-position: -203px 0; }
+.phpbb_yahoo-icon					{ background-position: -224px 0; }
 
 /* Forum icons & Topic icons */
-.global_read													{ background-image: url("./images/announce_read.gif"); }
-.global_read_mine												{ background-image: url("./images/announce_read_mine.gif"); }
-.global_read_locked												{ background-image: url("./images/announce_read_locked.gif"); }
-.global_read_locked_mine										{ background-image: url("./images/announce_read_locked_mine.gif"); }
-.global_unread													{ background-image: url("./images/announce_unread.gif"); }
-.global_unread_mine												{ background-image: url("./images/announce_unread_mine.gif"); }
-.global_unread_locked											{ background-image: url("./images/announce_unread_locked.gif"); }
-.global_unread_locked_mine										{ background-image: url("./images/announce_unread_locked_mine.gif"); }
-
-.announce_read													{ background-image: url("./images/announce_read.gif"); }
-.announce_read_mine												{ background-image: url("./images/announce_read_mine.gif"); }
-.announce_read_locked											{ background-image: url("./images/announce_read_locked.gif"); }
-.announce_read_locked_mine										{ background-image: url("./images/announce_read_locked_mine.gif"); }
-.announce_unread												{ background-image: url("./images/announce_unread.gif"); }
-.announce_unread_mine											{ background-image: url("./images/announce_unread_mine.gif"); }
-.announce_unread_locked											{ background-image: url("./images/announce_unread_locked.gif"); }
-.announce_unread_locked_mine									{ background-image: url("./images/announce_unread_locked_mine.gif"); }
-
-.forum_link														{ background-image: url("./images/forum_link.gif"); }
-.forum_read														{ background-image: url("./images/forum_read.gif"); }
-.forum_read_locked												{ background-image: url("./images/forum_read_locked.gif"); }
-.forum_read_subforum											{ background-image: url("./images/forum_read_subforum.gif"); }
-.forum_unread													{ background-image: url("./images/forum_unread.gif"); }
-.forum_unread_locked											{ background-image: url("./images/forum_unread_locked.gif"); }
-.forum_unread_subforum											{ background-image: url("./images/forum_unread_subforum.gif"); }
-
-.sticky_read													{ background-image: url("./images/sticky_read.gif"); }
-.sticky_read_mine												{ background-image: url("./images/sticky_read_mine.gif"); }
-.sticky_read_locked												{ background-image: url("./images/sticky_read_locked.gif"); }
-.sticky_read_locked_mine										{ background-image: url("./images/sticky_read_locked_mine.gif"); }
-.sticky_unread													{ background-image: url("./images/sticky_unread.gif"); }
-.sticky_unread_mine												{ background-image: url("./images/sticky_unread_mine.gif"); }
-.sticky_unread_locked											{ background-image: url("./images/sticky_unread_locked.gif"); }
-.sticky_unread_locked_mine										{ background-image: url("./images/sticky_unread_locked_mine.gif"); }
-
-.topic_moved													{ background-image: url("./images/topic_moved.gif"); }
-.topic_read														{ background-image: url("./images/topic_read.gif"); }
-.topic_read_mine												{ background-image: url("./images/topic_read_mine.gif"); }
-.topic_read_hot													{ background-image: url("./images/topic_read_hot.gif"); }
-.topic_read_hot_mine											{ background-image: url("./images/topic_read_hot_mine.gif"); }
-.topic_read_locked												{ background-image: url("./images/topic_read_locked.gif"); }
-.topic_read_locked_mine											{ background-image: url("./images/topic_read_locked_mine.gif"); }
-.topic_unread													{ background-image: url("./images/topic_unread.gif"); }
-.topic_unread_mine												{ background-image: url("./images/topic_unread_mine.gif"); }
-.topic_unread_hot												{ background-image: url("./images/topic_unread_hot.gif"); }
-.topic_unread_hot_mine											{ background-image: url("./images/topic_unread_hot_mine.gif"); }
-.topic_unread_locked											{ background-image: url("./images/topic_unread_locked.gif"); }
-.topic_unread_locked_mine										{ background-image: url("./images/topic_unread_locked_mine.gif"); }
-
-.pm_read														{ background-image: url("./images/topic_read.gif"); }
-.pm_unread														{ background-image: url("./images/topic_unread.gif"); }
+.global_read						{ background-image: url("./images/announce_read.gif"); }
+.global_read_mine					{ background-image: url("./images/announce_read_mine.gif"); }
+.global_read_locked					{ background-image: url("./images/announce_read_locked.gif"); }
+.global_read_locked_mine			{ background-image: url("./images/announce_read_locked_mine.gif"); }
+.global_unread						{ background-image: url("./images/announce_unread.gif"); }
+.global_unread_mine					{ background-image: url("./images/announce_unread_mine.gif"); }
+.global_unread_locked				{ background-image: url("./images/announce_unread_locked.gif"); }
+.global_unread_locked_mine			{ background-image: url("./images/announce_unread_locked_mine.gif"); }
+
+.announce_read						{ background-image: url("./images/announce_read.gif"); }
+.announce_read_mine					{ background-image: url("./images/announce_read_mine.gif"); }
+.announce_read_locked				{ background-image: url("./images/announce_read_locked.gif"); }
+.announce_read_locked_mine			{ background-image: url("./images/announce_read_locked_mine.gif"); }
+.announce_unread					{ background-image: url("./images/announce_unread.gif"); }
+.announce_unread_mine				{ background-image: url("./images/announce_unread_mine.gif"); }
+.announce_unread_locked				{ background-image: url("./images/announce_unread_locked.gif"); }
+.announce_unread_locked_mine		{ background-image: url("./images/announce_unread_locked_mine.gif"); }
+
+.forum_link							{ background-image: url("./images/forum_link.gif"); }
+.forum_read							{ background-image: url("./images/forum_read.gif"); }
+.forum_read_locked					{ background-image: url("./images/forum_read_locked.gif"); }
+.forum_read_subforum				{ background-image: url("./images/forum_read_subforum.gif"); }
+.forum_unread						{ background-image: url("./images/forum_unread.gif"); }
+.forum_unread_locked				{ background-image: url("./images/forum_unread_locked.gif"); }
+.forum_unread_subforum				{ background-image: url("./images/forum_unread_subforum.gif"); }
+
+.sticky_read						{ background-image: url("./images/sticky_read.gif"); }
+.sticky_read_mine					{ background-image: url("./images/sticky_read_mine.gif"); }
+.sticky_read_locked					{ background-image: url("./images/sticky_read_locked.gif"); }
+.sticky_read_locked_mine			{ background-image: url("./images/sticky_read_locked_mine.gif"); }
+.sticky_unread						{ background-image: url("./images/sticky_unread.gif"); }
+.sticky_unread_mine					{ background-image: url("./images/sticky_unread_mine.gif"); }
+.sticky_unread_locked				{ background-image: url("./images/sticky_unread_locked.gif"); }
+.sticky_unread_locked_mine			{ background-image: url("./images/sticky_unread_locked_mine.gif"); }
+
+.topic_moved						{ background-image: url("./images/topic_moved.gif"); }
+.pm_read,
+.topic_read							{ background-image: url("./images/topic_read.gif"); }
+.topic_read_mine					{ background-image: url("./images/topic_read_mine.gif"); }
+.topic_read_hot						{ background-image: url("./images/topic_read_hot.gif"); }
+.topic_read_hot_mine				{ background-image: url("./images/topic_read_hot_mine.gif"); }
+.topic_read_locked					{ background-image: url("./images/topic_read_locked.gif"); }
+.topic_read_locked_mine				{ background-image: url("./images/topic_read_locked_mine.gif"); }
+.pm_unread,
+.topic_unread						{ background-image: url("./images/topic_unread.gif"); }
+.topic_unread_mine					{ background-image: url("./images/topic_unread_mine.gif"); }
+.topic_unread_hot					{ background-image: url("./images/topic_unread_hot.gif"); }
+.topic_unread_hot_mine				{ background-image: url("./images/topic_unread_hot_mine.gif"); }
+.topic_unread_locked				{ background-image: url("./images/topic_unread_locked.gif"); }
+.topic_unread_locked_mine			{ background-image: url("./images/topic_unread_locked_mine.gif"); }
+
 
 /*
 --------------------------------------------------------------
@@ -733,7 +765,7 @@ Colours and backgrounds for cp.css
 /* Main CP box
 ----------------------------------------*/
 
-.panel-container h3, .panel-container hr, #cp-menu hr {
+.panel-container h3, .panel-container hr, .cp-menu hr {
 	border-color: #A4B3BF;
 }
 
@@ -755,50 +787,46 @@ ul.cplist {
 	border-bottom-color: #333333;
 }
 
-#cp-main .pm-message {
+.cp-main .pm-message {
 	border-color: #DBDEE2;
 	background-color: #FFFFFF;
 }
 
 /* CP tabbed menu
 ----------------------------------------*/
-#tabs .tab > a {
+.tabs .tab > a {
 	background: #BACCD9;
 	color: #536482;
 }
 
-#tabs .tab > a:hover {
+.tabs .tab > a:hover {
 	background: #DDEDFB;
 	color: #D31141;
 }
 
-#tabs .activetab > a,
-#tabs .activetab > a:hover {
-	background: #CADCEB;
-	background: -moz-linear-gradient(top, #E2F2FF 0%, #CADCEB 100%);
-	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #E2F2FF), color-stop(100%, #CADCEB));
-	background: -webkit-linear-gradient(top, #E2F2FF 0%, #CADCEB 100%);
-	background: -o-linear-gradient(top, #E2F2FF 0%, #CADCEB 100%);
-	background: -ms-linear-gradient(top, #E2F2FF 0%, #CADCEB 100%);
-	background: linear-gradient(to bottom, #E2F2FF 0%, #CADCEB 100%);
-	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#E2F2FF', endColorstr='#CADCEB', GradientType=0 );
+.tabs .activetab > a,
+.tabs .activetab > a:hover {
+	background-color: #CADCEB; /* Old browsers */ /* FF3.6+ */
+	background-image: -webkit-linear-gradient(top, #E2F2FF 0%, #CADCEB 100%);
+	background-image: linear-gradient(to bottom, #E2F2FF 0%,#CADCEB 100%); /* W3C */
+	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#E2F2FF', endColorstr='#CADCEB',GradientType=0 ); /* IE6-9 */
 	border-color: #CADCEB;
 	box-shadow: 0 1px 1px #F2F9FF inset;
 	color: #333333;
 }
 
-#tabs .activetab > a:hover {
+.tabs .activetab > a:hover {
 	color: #000000;
 }
 
 /* Mini tabbed menu used in MCP
 ----------------------------------------*/
-#minitabs .tab > a {
+.minitabs .tab > a {
 	background-color: #E1EBF2;
 }
 
-#minitabs .activetab > a,
-#minitabs .activetab > a:hover {
+.minitabs .activetab > a,
+.minitabs .activetab > a:hover {
 	background-color: #F9F9F9;
 	color: #333333;
 }
@@ -817,42 +845,34 @@ ul.cplist {
 ----------------------------------------*/
 
 /* Link styles for the sub-section links */
-#navigation a {
+.navigation a {
 	color: #333;
-	background: #B4C4D1;
-	background: -moz-linear-gradient(left, #B4C4D1 50%, #CADCEB 100%);
-	background: -webkit-gradient(left top, right top, color-stop(50%, #B4C4D1), color-stop(100%, #CADCEB));
+	background: #CADCEB; /* Old browsers */ /* FF3.6+ */
 	background: -webkit-linear-gradient(left, #B4C4D1 50%, #CADCEB 100%);
-	background: -o-linear-gradient(left, #B4C4D1 50%, #CADCEB 100%);
-	background: -ms-linear-gradient(left, #B4C4D1 50%, #CADCEB 100%);
-	background: linear-gradient(to right, #B4C4D1 50%, #CADCEB 100%);
-	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#B4C4D1', endColorstr='#CADCEB', GradientType=1 );
+	background: linear-gradient(to right, #B4C4D1 50%,#CADCEB 100%); /* W3C */
+	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#B4C4D1', endColorstr='#CADCEB',GradientType=1 ); /* IE6-9 */
 }
 
-.rtl #navigation a {
-	background: #B4C4D1;
-	background: -moz-linear-gradient(left, #CADCEB 0%, #B4C4D1 50%);
-	background: -webkit-gradient(left top, right top, color-stop(0%, #CADCEB), color-stop(50%, #B4C4D1));
-	background: -webkit-linear-gradient(left, #CADCEB 0%, #B4C4D1 50%);
-	background: -o-linear-gradient(left, #CADCEB 0%, #B4C4D1 50%);
-	background: -ms-linear-gradient(left, #CADCEB 0%, #B4C4D1 50%);
-	background: linear-gradient(to right, #CADCEB 0%, #B4C4D1 50%);
-	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#CADCEB', endColorstr='#B4C4D1', GradientType=1 );
+.rtl .navigation a {
+	background: #B4C4D1; /* Old browsers */ /* FF3.6+ */
+	background: -webkit-linear-gradient(left, #CADCEB 50%, #B4C4D1 100%);
+	background: linear-gradient(to right, #CADCEB 50%,#B4C4D1 100%); /* W3C */
+	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#CADCEB', endColorstr='#B4C4D1',GradientType=1 ); /* IE6-9 */
 }
 
-#navigation a:hover {
+.navigation a:hover {
 	background: #AABAC6;
 	color: #BC2A4D;
 	filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
 }
 
-#navigation #active-subsection a {
+.navigation .active-subsection a {
 	background: #F9F9F9;
 	color: #D31141;
 	filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
 }
 
-#navigation #active-subsection a:hover {
+.navigation .active-subsection a:hover {
 	color: #D31141;
 }
 
@@ -873,13 +893,13 @@ ul.cplist {
 	background-color: #F9F9F9;
 }
 
-#cp-main .pm {
+.cp-main .pm {
 	background-color: #FFFFFF;
 }
 
 /* Friends list */
 .cp-mini {
-	background-color: #eef5f9;
+	background-color: #EEF5F9;
 }
 
 dl.mini dt {
@@ -916,12 +936,12 @@ dl.mini dt {
 }
 
 /* Avatar gallery */
-#gallery label {
+.gallery label {
 	background: #FFFFFF;
 	border-color: #CCC;
 }
 
-#gallery label:hover {
+.gallery label:hover {
 	background-color: #EEE;
 }
 
@@ -973,15 +993,15 @@ fieldset.quick-login input.inputbox {
 /* Posting page styles
 ----------------------------------------*/
 
-#message-box textarea {
+.message-box textarea {
 	color: #333333;
 }
 
-#message-box textarea.drag-n-drop {
+.message-box textarea.drag-n-drop {
 	outline-color: rgba(102, 102, 102, 0.5);
 }
 
-#message-box textarea.drag-n-drop-highlight {
+.message-box textarea.drag-n-drop-highlight {
 	outline-color: rgba(17, 163, 234, 0.5);
 }
 
@@ -1007,7 +1027,6 @@ fieldset.quick-login input.inputbox {
 
 .inputbox:focus {
 	border-color: #11A3EA;
-	color: #0F4987;
 }
 
 .inputbox:focus:-moz-placeholder {
@@ -1024,8 +1043,10 @@ fieldset.quick-login input.inputbox {
 
 a.button1, input.button1, input.button3, a.button2, input.button2 {
 	color: #000;
-	background-color: #FAFAFA;
-	background-image: url("./images/bg_button.gif");
+	background-color: #EFEFEF; /* Old browsers */ /* FF3.6+ */
+	background-image: -webkit-linear-gradient(top, #D2D2D2 0%, #EFEFEF 100%);
+	background-image: linear-gradient(to bottom, #D2D2D2 0%,#EFEFEF 100%); /* W3C */
+	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#D2D2D2', endColorstr='#EFEFEF',GradientType=0 ); /* IE6-9 */
 }
 
 a.button1, input.button1 {
@@ -1048,8 +1069,12 @@ a.button1, a.button2 {
 
 /* Hover states */
 a.button1:hover, input.button1:hover, a.button2:hover, input.button2:hover, input.button3:hover {
-	border-color: #BC2A4D;
-	color: #BC2A4D;
+	border-color: #D31141;
+	color: #D31141;
+	background-color: #D2D2D2; /* Old browsers */ /* FF3.6+ */
+	background-image: -webkit-linear-gradient(top, #EFEFEF 0%, #D2D2D2 100%);
+	background-image: linear-gradient(to bottom, #EFEFEF 0%,#D2D2D2 100%); /* W3C */
+	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#EFEFEF', endColorstr='#D2D2D2',GradientType=0 ); /* IE6-9 */
 }
 
 /* Focus states */
@@ -1058,10 +1083,6 @@ input.button1:focus, input.button2:focus, input.button3:focus {
 	color: #0F4987;
 }
 
-input.search {
-	background-image: url("./images/icon_textbox_search.gif");
-}
-
 input.disabled {
 	color: #666666;
 }
@@ -1072,14 +1093,11 @@ input.disabled {
 	background-color: #FFFFFF;
 	border-color: #999999;
 }
-.phpbb_alert .alert_close {
-	background-image: url("./images/alert_close.png");
-}
-#darken {
+.darken {
 	background-color: #000000;
 }
 
-#loading_indicator {
+.loading_indicator {
 	background-color: #000000;
 	background-image: url("./images/loading.gif");
 }
@@ -1104,13 +1122,10 @@ input.disabled {
 }
 
 .dropdown-extended .header {
-	background: #F1F8FF;
-	background: -moz-linear-gradient(top, #F1F8FF 0%, #CADCEB 100%);
-	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F1F8FF), color-stop(100%, #CADCEB));
-	background: -webkit-linear-gradient(top, #F1F8FF 0%, #CADCEB 100%);
-	background: -o-linear-gradient(top, #F1F8FF 0%, #CADCEB 100%);
-	background: -ms-linear-gradient(top, #F1F8FF 0%, #CADCEB 100%);
-	background: linear-gradient(to bottom, #F1F8FF 0%, #CADCEB 100%);
+	background-color: #F1F8FF; /* Old browsers */ /* FF3.6+ */
+	background-image: -webkit-linear-gradient(top, #F1F8FF 0%, #CADCEB 100%);
+	background-image: linear-gradient(to bottom, #F1F8FF 0%,#CADCEB 100%); /* W3C */
+	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#F1F8FF', endColorstr='#CADCEB',GradientType=0 ); /* IE6-9 */
 }
 
 .dropdown .pointer {
@@ -1125,17 +1140,9 @@ input.disabled {
 	border-color: #F1F8FF transparent;
 }
 
-ul.linklist li.responsive-menu a.responsive-menu-link:before {
-	border-color: #105289;
-}
-
-ul.linklist li.responsive-menu a.responsive-menu-link:hover:before, ul.linklist li.responsive-menu.visible a.responsive-menu-link:before {
-	border-color: #D31141;
-}
-
 .dropdown .dropdown-contents {
 	background: #fff;
-	border-color: #b9b9b9;
+	border-color: #B9B9B9;
 	box-shadow: 1px 3px 5px rgba(0, 0, 0, 0.2);
 }
 
@@ -1161,3 +1168,8 @@ ul.linklist li.responsive-menu a.responsive-menu-link:hover:before, ul.linklist
 li.notification-reported strong, li.notification-disapproved strong {
 	color: #D31141;
 }
+
+.badge {
+	background-color: #D31141;
+	color: #ffffff;
+}
--- a/styles/prosilver/theme/common.css
+++ b/styles/prosilver/theme/common.css
@@ -1,52 +1,3 @@
-/* CSS Reset http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126
----------------------------------------- */
-html, body, div, span, applet, object, iframe,
-h1, h2, h3, h4, h5, h6, p, blockquote, pre,
-a, abbr, acronym, address, big, cite, code,
-del, dfn, em, img, ins, kbd, q, s, samp,
-small, strike, strong, sub, sup, tt, var,
-b, u, i, center,
-dl, dt, dd, ol, ul, li,
-fieldset, form, label, legend,
-table, caption, tbody, tfoot, thead, tr, th, td,
-article, aside, canvas, details, embed,
-figure, figcaption, footer, header, hgroup,
-menu, nav, output, ruby, section, summary,
-time, mark, audio, video {
-	margin: 0;
-	padding: 0;
-	border: 0;
-	font-size: 100%;
-	font: inherit;
-	vertical-align: baseline;
-}
-/* HTML5 display-role reset for older browsers */
-article, aside, details, figcaption, figure,
-footer, header, hgroup, menu, nav, section {
-	display: block;
-}
-body {
-	line-height: 1;
-}
-ol, ul {
-	list-style: none;
-}
-blockquote, q {
-	quotes: none;
-}
-blockquote:before, blockquote:after,
-q:before, q:after {
-	content: '';
-	content: none;
-}
-table {
-	border-collapse: collapse;
-	border-spacing: 0;
-}
-abbr {
-	text-decoration: none;
-}
-
 /* General Markup Styles
 ---------------------------------------- */
 html {
@@ -137,7 +88,9 @@ p.right {
 }
 
 p.jumpbox-return {
-	margin-top: 1em;
+	margin-top: 10px;
+	margin-bottom: 0;
+	float: left;
 }
 
 b, strong {
@@ -172,10 +125,11 @@ ol ol ul, ol ul ul, ul ol ul, ul ul ul {
 	list-style-type: square;
 }
 
+a:hover	{ text-decoration: underline; }
 
 /* Main blocks
 ---------------------------------------- */
-#wrap {
+.wrap {
 	border: 1px solid transparent;
 	border-radius: 8px;
 	margin: 0 auto;
@@ -185,21 +139,21 @@ ol ol ul, ol ul ul, ul ol ul, ul ul ul {
 }
 
 @media only screen and (max-width: 1220px), only screen and (max-device-width: 1220px) {
-	#wrap {
+	.wrap {
 		margin: 0 12px;
 	}
 }
 
-#page-body {
+.page-body {
 	margin: 4px 0;
 	clear: both;
 }
 
-#page-footer {
+.page-footer {
 	clear: both;
 }
 
-#page-footer h3 {
+.page-footer h3 {
 	margin-top: 20px;
 }
 
@@ -213,20 +167,25 @@ ol ol ul, ol ul ul, ul ol ul, ul ul ul {
 	text-decoration: none;
 }
 
+.site_logo {
+	display: inline-block;
+	width: 149px;
+	height: 52px;
+}
+
 /* Site description and logo */
-#site-description {
+.site-description {
 	float: left;
 	width: 65%;
 }
 
-#site-description h1 {
+.site-description h1 {
 	margin-right: 0;
 }
 
 /* Round cornered boxes and backgrounds
 ---------------------------------------- */
 .headerbar {
-	background: transparent none repeat-x 0 0;
 	margin-bottom: 4px;
 	padding: 5px;
 	border-radius: 7px;
@@ -238,7 +197,6 @@ ol ol ul, ol ul ul, ul ol ul, ul ul ul {
 }
 
 .forabg {
-	background: transparent none repeat-x 0 0;
 	margin-bottom: 4px;
 	padding: 5px;
 	clear: both;
@@ -246,7 +204,6 @@ ol ol ul, ol ul ul, ul ol ul, ul ul ul {
 }
 
 .forumbg {
-	background: transparent none repeat-x 0 0;
 	margin-bottom: 4px;
 	padding: 5px;
 	clear: both;
@@ -276,6 +233,7 @@ ol ol ul, ol ul ul, ul ol ul, ul ul ul {
 ----------------------------------------*/
 .navbar ul.linklist {
 	padding: 2px 0;
+	list-style-type: none;
 }
 
 ul.linklist {
@@ -283,7 +241,7 @@ ul.linklist {
 	margin: 0;
 }
 
-#cp-main .panel {
+.cp-main .panel {
 	padding: 5px 10px;
 }
 
@@ -324,28 +282,7 @@ ul.rightside {
 
 ul.linklist li.responsive-menu {
 	position: relative;
-	margin: 0 5px;
-}
-
-ul.linklist li.responsive-menu a.responsive-menu-link {
-	display: inline-block;
-	margin: 0 5px;
-	font-size: 1.455em;
-	position: relative;
-	width: 16px;
-	line-height: 1.2em;
-	text-decoration: none;
-}
-
-ul.linklist li.responsive-menu a.responsive-menu-link:before {
-	content: '';
-	position: absolute;
-	left: 0;
-	top: 7px;
-	height: .125em;
-	width: 14px;
-	border-bottom: 0.125em solid transparent;
-	border-top: 0.375em double transparent;
+	margin: 0 5px 0 0;
 }
 
 .hasjs ul.linklist.leftside, .hasjs ul.linklist.rightside {
@@ -402,24 +339,25 @@ ul.linklist.bulletin > li.no-bulletin:before {
 	vertical-align: top;
 }
 
-.header-avatar:hover {
+a.header-avatar,
+a.header-avatar:hover {
 	text-decoration: none;
 }
 
-.header-avatar img {
+a.header-avatar img {
 	margin-bottom: 2px;
 	max-height: 20px;
 	vertical-align: middle;
 	width: auto;
 }
 
-.header-avatar span:after {
-	content: '\25BC';
+a.header-avatar span:after {
+	content: '\f0dd';
 	display: inline-block;
-	font-size: 9px;
-	float: right;
-	padding-left: 2px;
-	opacity: 0.7;
+	font: normal normal normal 14px/1 FontAwesome;
+	padding-left: 6px;
+	padding-top: 2px;
+	vertical-align: top;
 }
 
 /* Dropdown menu
@@ -441,6 +379,7 @@ ul.linklist.bulletin > li.no-bulletin:before {
 }
 
 .dropdown {
+	display: none;
 	position: absolute;
 	left: 0;
 	top: 1.2em;
@@ -501,12 +440,12 @@ ul.linklist.bulletin > li.no-bulletin:before {
 .dropdown .pointer {
 	right: auto;
 	left: 10px;
-	top: 0;
+	top: -1px;
 	z-index: 3;
 }
 
 .dropdown-up .pointer {
-	bottom: 0;
+	bottom: -1px;
 	top: auto;
 }
 
@@ -534,22 +473,72 @@ ul.linklist.bulletin > li.no-bulletin:before {
 	border-radius: 5px;
 	padding: 5px;
 	position: relative;
-	min-width: 40px;
 	max-height: 300px;
-	-webkit-box-sizing: border-box;
-	-moz-box-sizing: border-box;
-	box-sizing: border-box;
+}
+
+.dropdown-contents a {
+	display: block;
+	padding: 5px;
+}
+
+.jumpbox {
+	margin: 5px 0;
+}
+
+.jumpbox .dropdown li {
+	border-top: 1px solid transparent;
+}
+
+.jumpbox .dropdown-select {
+	margin: 0;
+}
+
+.jumpbox .dropdown-contents {
+	padding: 0;
+	text-decoration: none;
+}
+
+.jumpbox .dropdown-contents li {
+	padding: 0;
+}
+
+.jumpbox .dropdown-contents a {
+	margin-right: 20px;
+	padding: 5px 10px;
+	text-decoration: none;
+	width: 100%;
+}
+
+.jumpbox .spacer {
+	display: inline-block;
+	width: 0px;
+}
+
+.jumpbox .spacer + .spacer {
+	width: 20px;
+}
+
+.dropdown-contents a {
+	display: block;
+	padding: 5px;
+}
+
+.jumpbox .dropdown-select {
+	margin: 0;
+}
+
+.jumpbox .dropdown-contents a {
+	text-decoration: none;
 }
 
 .dropdown li {
+	display: list-item;
 	border-top: 1px dotted transparent;
 	float: none !important;
 	line-height: normal !important;
 	font-size: 1em !important;
 	list-style: none;
 	margin: 0;
-	padding-top: 4px;
-	padding-bottom: 4px;
 	white-space: nowrap;
 	text-align: left;
 }
@@ -585,7 +574,6 @@ ul.linklist.bulletin > li.no-bulletin:before {
 
 .dropdown li.separator {
 	border-top: 1px solid transparent;
-	margin: 4px 0;
 	padding: 0;
 }
 
@@ -612,7 +600,6 @@ ul.linklist.bulletin > li.no-bulletin:before {
 }
 
 .breadcrumbs .crumb a {
-	display: inline-block;
 	white-space: nowrap;
 	text-overflow: ellipsis;
 	vertical-align: bottom;
@@ -635,7 +622,7 @@ table.table1 {
 	width: 100%;
 }
 
-#ucp-main table.table1 {
+.ucp-main table.table1 {
 	padding: 2px;
 }
 
@@ -707,7 +694,7 @@ table.info tbody th {
 	margin: 0 -1px;
 }
 
-#color_palette_placeholder table {
+.color_palette_placeholder table {
 	border-collapse: separate;
 	border-spacing: 1px;
 }
@@ -802,7 +789,7 @@ fieldset.fields1 dl.pmlist dd.recipients {
 /* Action-bars (container for post/reply buttons, pagination, etc.)
 ---------------------------------------- */
 .action-bar {
-	font-size: 1.1em;
+	font-size: 11px;
 	margin: 4px 0;
 }
 
@@ -810,19 +797,32 @@ fieldset.fields1 dl.pmlist dd.recipients {
 	margin-top: 2em;
 }
 
+.action-bar .button {
+	margin-right: 5px;
+	float: left;
+}
+
+.action-bar .button-search {
+	margin-right: 0;
+}
+
 /* Pagination
 ---------------------------------------- */
 .pagination {
 	float: right;
-	margin-top: 3px;
 	text-align: right;
 	width: auto;
 }
 
-.action-bar.bottom .pagination {
+.action-bar.bar-bottom .pagination {
 	margin-top: 0;
 }
 
+.action-bar .pagination .button {
+	margin-right: 0;
+	float: none;
+}
+
 .pagination > ul {
 	display: inline-block;
 	list-style: none !important;
@@ -838,16 +838,20 @@ fieldset.fields1 dl.pmlist dd.recipients {
 }
 
 .pagination li a, .pagination li span {
-	border: 1px solid transparent;
 	border-radius: 2px;
-	display: block;
-	font-size: 0.9em;
+	padding: 2px 5px;
+}
+
+.pagination li.active span {
+	display: inline-block;
+	font-size: 13px;
 	font-weight: normal;
-	line-height: 1.4em;
-	min-width: 10px;
-	padding: 3px;
+	font-family: "Open Sans", "Droid Sans", Verdana, Arial, Helvetica;
+	line-height: 1.4;
 	text-align: center;
-	text-decoration: none;
+	white-space: nowrap;
+	vertical-align: middle;
+	border: 1px solid transparent;
 }
 
 .pagination li.ellipsis span {
@@ -859,37 +863,22 @@ fieldset.fields1 dl.pmlist dd.recipients {
 	margin-right: 5px;
 }
 
-.pagination li.page-jump a, .pagination li.next a, .pagination li.previous a {
-	background-repeat: no-repeat;
-	font-size: 0;
-	height: 13px;
-	width: 11px;
-}
-
 .pagination li.page-jump a {
-	background-position: 0 2px;
-	width: 24px;
+	padding: 0 8px;
 }
 
-.pagination li.next a {
-	background-position: -50px 2px;
+.pagination li.page-jump a i {
+	font-size: 21px;
 }
 
-.pagination li.previous a {
-	background-position: -30px 2px;
+.pagination .arrow a {
+	padding: 2px 0;
 }
 
-.pagination li.page-jump a:hover, .pagination .dropdown-visible a.dropdown-trigger, .nojs .pagination .dropdown-container:hover a.dropdown-trigger { background-position: 0 -18px; }
-.pagination li.next a:hover { background-position: -50px -18px; }
-.pagination li.previous a:hover { background-position: -30px -18px; }
-
 /* Pagination in viewforum for multipage topics */
 .row .pagination {
 	display: block;
-	margin-top: 0;
-	padding: 1px 0 1px 15px;
-	font-size: 0.9em;
-	background: none 0 50% no-repeat;
+	margin-top: 0.3em;
 }
 
 .row .pagination > ul {
@@ -897,8 +886,15 @@ fieldset.fields1 dl.pmlist dd.recipients {
 }
 
 .row .pagination li a, .row .pagination li span {
-	border-radius: 1px;
-	padding: 1px;
+	border-radius: 2px;
+	padding: 1px 3px;
+	font-size: 9px;
+}
+
+.topic-poster {
+	float: left;
+	padding-right: 0.5em;
+	margin-top: 0.3em;
 }
 
 /* jQuery popups
@@ -924,18 +920,9 @@ fieldset.fields1 dl.pmlist dd.recipients {
 }
 
 .phpbb_alert .alert_close {
-	display: block;
 	float: right;
-	width: 16px;
-	height: 16px;
-	overflow: hidden;
-	text-decoration: none !important;
-	background: transparent none 0 0 no-repeat;
-	margin-top: -7px;
-	margin-right: -31px;
-}
-.phpbb_alert .alert_close:hover {
-	background-position: 0 -16px;
+	margin-right: -36px;
+	margin-top: -8px;
 }
 
 .phpbb_alert p {
@@ -957,13 +944,13 @@ fieldset.fields1 dl.pmlist dd.recipients {
 	font-size: 1.1em;
 }
 
-#darkenwrapper {
+.darkenwrapper {
 	display: none;
 	position: relative;
 	z-index: 44;
 }
 
-#darken {
+.darken {
 	position: fixed;
 	left: 0;
 	top: 0;
@@ -973,7 +960,7 @@ fieldset.fields1 dl.pmlist dd.recipients {
 	z-index: 45;
 }
 
-#loading_indicator {
+.loading_indicator {
 	background: center center no-repeat;
 	border-radius: 5px;
 	display: none;
@@ -990,15 +977,6 @@ fieldset.fields1 dl.pmlist dd.recipients {
 
 /* Miscellaneous styles
 ---------------------------------------- */
-#forum-permissions {
-	float: right;
-	width: auto;
-	padding-left: 5px;
-	margin-left: 5px;
-	margin-top: 10px;
-	text-align: right;
-}
-
 .copyright {
 	padding: 5px;
 	text-align: center;
@@ -1035,36 +1013,20 @@ div.rules ul, div.rules ol {
 p.post-notice {
 	position: relative;
 	padding: 5px;
-	padding-left: 26px;
 	min-height: 14px;
 	margin-bottom: 1em;
 }
 
-p.post-notice:before {
-	content: '';
-	display: block;
-	position: absolute;
-	top: 0;
-	bottom: 0;
-	left: 0;
-	width: 28px;
-	background: transparent none 50% 50% no-repeat;
-	pointer-events: none;
-}
-
 form > p.post-notice strong {
 	line-height: 20px;
 }
 
-#jumpbox {
-	margin: 5px 0;
-}
-
 .stat-block {
 	clear: both;
 }
 
-#top {
+.top-anchor {
+	display: block;
 	position: absolute;
 	top: -20px;
 }
@@ -1083,16 +1045,19 @@ ul.linklist:after,
 .action-bar:after,
 .notification_text:after,
 .tabs-container:after,
-#tabs > ul:after,
-#minitabs > ul:after,
+.tabs > ul:after,
+.minitabs > ul:after,
 .postprofile .avatar-container:after {
 	clear: both;
 	content: '';
 	display: block;
 }
 
-.hidden {
-	display: none;
+.emoji {
+	min-height: 18px;
+	min-width: 18px;
+	height: 1em;
+	width: 1em;
 }
 
 .smilies {
@@ -1173,6 +1138,11 @@ ul.linklist:after,
 	text-transform: none;
 }
 
+.dropdown-extended .header .header_settings a {
+	display: inline-block;
+	padding: 0 5px;
+}
+
 .dropdown-extended .header:after {
 	content: '';
 	display: table;
@@ -1251,40 +1221,37 @@ ul.linklist:after,
 	margin-left: 58px;
 }
 
-/* Navbar specific list items
-----------------------------------------*/
-
-#quick-links {
-	margin: 0 7px 0 0;
+.badge {
+	border-radius: 10px;
+	opacity: 0.8;
+	text-align: center;
+	white-space: nowrap;
+	font-size: 10px;
+	line-height: 1;
+	float: right;
+	display: inline-block;
+	margin-left: 3px;
+	vertical-align: baseline;
+	position: relative;
+	top: 3px;
+	padding: 4px 6px;
 }
 
-#quick-links a.responsive-menu-link {
-	display: block;
-	font-size: inherit;
-	line-height: inherit;
-	margin: 0;
-	width: auto;
+.badge.hidden {
+	display: none;
 }
 
-#quick-links a.responsive-menu-link:before {
-	font-size: 1.455em;
-	line-height: 16.5px;
-}
+/* Navbar specific list items
+----------------------------------------*/
 
-.compact #quick-links a.responsive-menu-link {
-	width: 0;
-	overflow: hidden;
-	white-space: nowrap;
+.linklist .quick-links {
+	margin: 0 7px 0 0;
 }
 
-.compact .icon-notification > a > span, .compact .icon-pm > a > span {
+.linklist.compact .rightside > a > span span {
 	display: none;
 }
 
-.compact .icon-notification > a > strong, .compact .icon-pm > a > strong {
-	padding-left: 2px;
-}
-
 .dropdown-page-jump .dropdown {
 	top: 20px;
 }
--- a/styles/prosilver/theme/content.css
+++ b/styles/prosilver/theme/content.css
@@ -7,10 +7,6 @@ ul.topiclist {
 	margin: 0;
 }
 
-ul.forums {
-	background: transparent none repeat-x 0 0;
-}
-
 ul.topiclist li {
 	display: block;
 	list-style-type: none;
@@ -81,15 +77,6 @@ ul.topiclist dfn {
 	width: 990px;
 }
 
-ul.topiclist li.row dt a.subforum {
-	background-image: none;
-	background-position: 0 50%;
-	background-repeat: no-repeat;
-	position: relative;
-	white-space: nowrap;
-	padding: 0 0 0 12px;
-}
-
 .forum-image {
 	float: left;
 	padding-top: 5px;
@@ -133,36 +120,40 @@ li.header dd {
 	box-sizing: border-box;
 }
 
-li.header dl.icon dt, li.header dl.icon dd {
+li.header dl.row-item dt, li.header dl.row-item dd {
 	min-height: 0;
 }
 
-li.header dl.icon dt .list-inner {
+li.header dl.row-item dt .list-inner {
 	/* Tweak for headers alignment when folder icon used */
 	padding-left: 0;
 	padding-right: 50px;
 }
 
 /* Forum list column styles */
-dl.icon {
+dl.row-item {
 	background-position: 10px 50%;		/* Position of folder icon */
 	background-repeat: no-repeat;
 }
 
-dl.icon dt {
+dl.row-item dt {
 	background-repeat: no-repeat;
 	background-position: 5px 95%;		/* Position of topic icon */
 }
 
-dl.icon dt .list-inner {
+dl.row-item dt .list-inner {
 	padding-left: 45px;					/* Space for folder icon */
 }
 
-dl.icon dt, dl.icon dd {
+dl.row-item dt, dl.row-item dd {
 	min-height: 35px;
 }
 
-dl a.icon-link {						/* topic row icon links */
+dl.row-item dt a {
+	display: inline;
+}
+
+dl a.row-item-link {						/* topic row icon links */
 	display: block;
 	width: 30px;
 	height: 30px;
@@ -186,13 +177,13 @@ dd.posts, dd.topics, dd.views {
 }
 
 /* List in forum description */
-dl.icon dt ol,
-dl.icon dt ul {
+dl.row-item dt ol,
+dl.row-item dt ul {
 	list-style-position: inside;
 	margin-left: 1em;
 }
 
-dl.icon dt li {
+dl.row-item dt li {
 	display: list-item;
 	list-style-type: inherit;
 }
@@ -286,28 +277,28 @@ dd.option {
 
 /* Topic review panel
 ----------------------------------------*/
-#review {
+.panel .review {
 	margin-top: 2em;
 }
 
-#topicreview {
+.topicreview {
 	padding-right: 5px;
 	overflow: auto;
 	height: 300px;
 }
 
-#topicreview .postbody {
+.topicreview .postbody {
 	width: auto;
 	float: none;
 	margin: 0;
 	height: auto;
 }
 
-#topicreview .post {
+.topicreview .post {
 	height: auto;
 }
 
-#topicreview h2 {
+.topicreview h2 {
 	border-bottom-width: 0;
 }
 
@@ -317,7 +308,7 @@ dd.option {
 
 /* MCP Post details
 ----------------------------------------*/
-#post_details {
+.post_details {
 	/* This will only work in IE7+, plus the others */
 	overflow: auto;
 	max-height: 300px;
@@ -383,8 +374,7 @@ dl.faq dt {
 }
 
 .content ul, .content ol {
-	margin-bottom: 1em;
-	margin-left: 3em;
+	margin: 0.8em 0 0.9em 3em;
 }
 
 .posthilit {
@@ -430,8 +420,7 @@ dd .signature {
 }
 
 .signature ul, .signature ol {
-	margin-bottom: 1em;
-	margin-left: 3em;
+	margin: 0.8em 0 0.9em 3em;
 }
 
 /* Post noticies */
@@ -460,7 +449,7 @@ blockquote {
 	background: transparent none 6px 8px no-repeat;
 	border: 1px solid transparent;
 	font-size: 0.95em;
-	margin: 0.5em 1px 0 25px;
+	margin: 1em 1px 1em 25px;
 	overflow: hidden;
 	padding: 5px;
 }
@@ -468,7 +457,7 @@ blockquote {
 blockquote blockquote {
 	/* Nested quotes */
 	font-size: 1em;
-	margin: 0.5em 1px 0 15px;
+	margin: 1em 1px 1em 15px;
 }
 
 blockquote cite {
@@ -488,11 +477,22 @@ blockquote.uncited {
 	padding-top: 25px;
 }
 
+blockquote cite > div {
+	float: right;
+	font-weight: normal;
+}
+
+.postbody .content li blockquote {
+	overflow: inherit;
+	margin-left: 0;
+}
+
 /* Code block */
 .codebox {
 	padding: 3px;
 	border: 1px solid transparent;
 	font-size: 1em;
+	margin: 1em 0 1.2em 0;
 }
 
 .codebox p {
@@ -513,9 +513,8 @@ blockquote .codebox {
 	display: block;
 	height: auto;
 	max-height: 200px;
-	white-space: normal;
 	padding-top: 5px;
-	font: 0.9em Monaco, "Andale Mono","Courier New", Courier, mono;
+	font: 0.9em Monaco, "Andale Mono","Courier New", Courier, monospace;
 	line-height: 1.3em;
 	margin: 2px 0;
 }
@@ -830,7 +829,7 @@ table.fixed-width-table {
 
 /* Show scrollbars for items with overflow on iOS devices
 ----------------------------------------*/
-.postbody .content::-webkit-scrollbar, #topicreview::-webkit-scrollbar, #post_details::-webkit-scrollbar, .codebox code::-webkit-scrollbar, .attachbox dd::-webkit-scrollbar, .attach-image::-webkit-scrollbar, .dropdown-extended ul::-webkit-scrollbar {
+.postbody .content::-webkit-scrollbar, .topicreview::-webkit-scrollbar, .post_details::-webkit-scrollbar, .codebox code::-webkit-scrollbar, .attachbox dd::-webkit-scrollbar, .attach-image::-webkit-scrollbar, .dropdown-extended ul::-webkit-scrollbar {
 	width: 8px;
 	height: 8px;
 	-webkit-appearance: none;
@@ -838,7 +837,7 @@ table.fixed-width-table {
 	border-radius: 3px;
 }
 
-.postbody .content::-webkit-scrollbar-thumb, #topicreview::-webkit-scrollbar-thumb, #post_details::-webkit-scrollbar-thumb, .codebox code::-webkit-scrollbar-thumb, .attachbox dd::-webkit-scrollbar-thumb, .attach-image::-webkit-scrollbar-thumb, .dropdown-extended ul::-webkit-scrollbar-thumb {
+.postbody .content::-webkit-scrollbar-thumb, .topicreview::-webkit-scrollbar-thumb, .post_details::-webkit-scrollbar-thumb, .codebox code::-webkit-scrollbar-thumb, .attachbox dd::-webkit-scrollbar-thumb, .attach-image::-webkit-scrollbar-thumb, .dropdown-extended ul::-webkit-scrollbar-thumb {
 	background: rgba(0, 0, 0, .3);
 	border-radius: 3px;
 }
--- a/styles/prosilver/theme/cp.css
+++ b/styles/prosilver/theme/cp.css
@@ -4,19 +4,19 @@
 
 /* Main CP box
 ----------------------------------------*/
-#cp-menu {
+.cp-menu {
 	float:left;
 	width: 19%;
 	margin-top: 1em;
 	margin-bottom: 5px;
 }
 
-#cp-main {
+.cp-main {
 	float: left;
 	width: 81%;
 }
 
-#cp-main .content {
+.cp-main .content {
 	padding: 0;
 }
 
@@ -59,7 +59,7 @@ ul.cplist {
 	border-bottom: none;
 }
 
-#cp-main .pm-message {
+.cp-main .pm-message {
 	border: 1px solid transparent;
 	margin: 10px 0;
 	width: auto;
@@ -70,7 +70,7 @@ ul.cplist {
 	padding-bottom: 5px;
 }
 
-#cp-main .postbody h3, #cp-main .box2 h3 {
+.cp-main .postbody h3, .cp-main .box2 h3 {
 	margin-top: 0;
 }
 
@@ -78,11 +78,11 @@ ul.cplist {
 	font-size: 1.1em;
 }
 
-#cp-main .buttons {
+.cp-main .buttons {
 	margin-left: 0;
 }
 
-#cp-main ul.linklist {
+.cp-main ul.linklist {
 	margin: 0;
 }
 
@@ -98,18 +98,18 @@ ul.cplist {
 
 /* CP tabs shared
 ----------------------------------------*/
-#tabs, #minitabs {
+.tabs, .minitabs {
 	line-height: normal;
 }
 
-#tabs > ul, #minitabs > ul {
+.tabs > ul, .minitabs > ul {
 	list-style: none;
 	margin: 0;
 	padding: 0;
 	position: relative;
 }
 
-#tabs .tab, #minitabs .tab {
+.tabs .tab, .minitabs .tab {
 	display: block;
 	float: left;
 	font-size: 1em;
@@ -117,7 +117,7 @@ ul.cplist {
 	line-height: 1.4em;
 }
 
-#tabs .tab > a, #minitabs .tab > a {
+.tabs .tab > a, .minitabs .tab > a {
 	display: block;
 	padding: 5px 9px;
 	position: relative;
@@ -128,39 +128,39 @@ ul.cplist {
 
 /* CP tabbed menu
 ----------------------------------------*/
-#tabs {
+.tabs {
 	margin: 20px 0 0 7px;
 }
 
-#tabs .tab > a {
+.tabs .tab > a {
 	border: 1px solid transparent;
 	border-radius: 4px 4px 0 0;
 	margin: 1px 1px 0 0;
 }
 
-#tabs .activetab > a {
+.tabs .activetab > a {
 	margin-top: 0;
 	padding-bottom: 7px;
 }
 
 /* Mini tabbed menu used in MCP
 ----------------------------------------*/
-#minitabs {
+.minitabs {
 	float: right;
 	margin: 15px 7px 0 0;
 	max-width: 50%;
 }
 
-#minitabs .tab {
+.minitabs .tab {
 	float: right;
 }
 
-#minitabs .tab > a {
+.minitabs .tab > a {
 	border-radius: 5px 5px 0 0;
 	margin-left: 2px;
 }
 
-#minitabs .tab > a:hover {
+.minitabs .tab > a:hover {
 	text-decoration: none;
 }
 
@@ -190,44 +190,44 @@ ul.cplist {
 	border-top: 0.375em double transparent;
 }
 
-#tabs .dropdown, #minitabs .dropdown {
+.tabs .dropdown, .minitabs .dropdown {
 	top: 20px;
 	margin-right: -2px;
 	font-size: 1.1em;
 	font-weight: normal;
 }
 
-#minitabs .dropdown {
+.minitabs .dropdown {
 	margin-right: -4px;
 }
 
-#tabs .dropdown-up .dropdown, #minitabs .dropdown-up .dropdown {
+.tabs .dropdown-up .dropdown, .minitabs .dropdown-up .dropdown {
 	bottom: 20px;
 	top: auto;
 }
 
-#tabs .dropdown li {
+.tabs .dropdown li {
 	text-align: right;
 }
 
-#minitabs .dropdown li {
+.minitabs .dropdown li {
 	text-align: left;
 }
 
 /* UCP navigation menu
 ----------------------------------------*/
 /* Container for sub-navigation list */
-#navigation {
+.navigation {
 	width: 100%;
 	padding-top: 36px;
 }
 
-#navigation ul {
+.navigation ul {
 	list-style: none;
 }
 
 /* Default list state */
-#navigation li {
+.navigation li {
 	display: inline;
 	font-weight: bold;
 	margin: 1px 0;
@@ -235,20 +235,20 @@ ul.cplist {
 }
 
 /* Link styles for the sub-section links */
-#navigation a {
+.navigation a {
 	display: block;
 	padding: 5px;
 	margin: 1px 0;
 	text-decoration: none;
 }
 
-#navigation a:hover {
+.navigation a:hover {
 	text-decoration: none;
 }
 
 /* Preferences pane layout
 ----------------------------------------*/
-#cp-main h2 {
+.cp-main h2 {
 	border-bottom: none;
 	padding: 0;
 	margin-left: 10px;
@@ -281,10 +281,6 @@ dl.mini dd {
 
 /* PM Styles
 ----------------------------------------*/
-#pm-menu {
-	line-height: 2.5em;
-}
-
 /* Defined rules list for PM options */
 ol.def-rules {
 	padding-left: 0;
@@ -327,7 +323,7 @@ ol.def-rules li {
 }
 
 /* Avatar gallery */
-#gallery label {
+.gallery label {
 	position: relative;
 	float: left;
 	margin: 10px;
@@ -341,35 +337,35 @@ ol.def-rules li {
 ----------------------------------------*/
 @media only screen and (max-width: 900px), only screen and (max-device-width: 900px)
 {
-	.nojs #tabs a span, .nojs #minitabs a span {
+	.nojs .tabs a span, .nojs .minitabs a span {
 		max-width: 40px;
 		overflow: hidden;
 		text-overflow: ellipsis;
 		letter-spacing: -.5px;
 	}
 
-	#cp-menu, #navigation, #cp-main {
+	.cp-menu, .navigation, .cp-main {
 		float: none;
 		width: auto;
 		margin: 0;
 	}
 
-	#navigation {
+	.navigation {
 		padding: 0;
 		margin: 0 auto;
 		max-width: 320px;
 	}
 
-	#navigation a {
+	.navigation a {
 		background-image: none;
 	}
 
-	#navigation li:first-child a {
+	.navigation li:first-child a {
 		border-top-left-radius: 5px;
 		border-top-right-radius: 5px;
 	}
 
-	#navigation li:last-child a {
+	.navigation li:last-child a {
 		border-bottom-left-radius: 5px;
 		border-bottom-right-radius: 5px;
 	}
--- a/styles/prosilver/theme/en/stylesheet.css
+++ b/styles/prosilver/theme/en/stylesheet.css
@@ -1,8 +1,2 @@
 /* Online image */
 .online { background-image: url("./icon_user_online.gif"); }
-
-.imageset.icon_user_online {
-	background-image: url("./icon_user_online.gif");
-	padding-left: 58px;
-	padding-top: 58px;
-}
--- a/styles/prosilver/theme/forms.css
+++ b/styles/prosilver/theme/forms.css
@@ -96,7 +96,7 @@ fieldset.fields1 div {
 }
 
 /* Set it back to 0px for the reCaptcha divs: PHPBB3-9587 */
-fieldset.fields1 #recaptcha_widget_div div, fieldset.fields1 .live-search div {
+fieldset.fields1 .live-search div {
 	margin-bottom: 0;
 }
 
@@ -138,10 +138,16 @@ dd textarea {
 }
 
 /* Hover effects */
-#timezone {
+.timezone {
 	width: 95%;
 }
 
+/* Browser-specific tweaks */
+button::-moz-focus-inner {
+	padding: 0;
+	border: 0
+}
+
 /* Quick-login on index page */
 fieldset.quick-login {
 	margin-top: 5px;
@@ -177,6 +183,24 @@ fieldset.display-options a {
 	margin-top: 3px;
 }
 
+.dropdown fieldset.display-options {
+	font-size: 1em;
+	margin: 0;
+	padding: 0;
+}
+
+.dropdown fieldset.display-options label {
+	display: block;
+	margin: 4px;
+	padding: 0;
+	text-align: right;
+	white-space: nowrap;
+}
+
+.dropdown fieldset.display-options select {
+	min-width: 120px;
+}
+
 /* Display actions for ucp and mcp pages */
 fieldset.display-actions {
 	text-align: right;
@@ -214,28 +238,26 @@ fieldset.submit-buttons {
 
 fieldset.submit-buttons input {
 	vertical-align: middle;
-	padding-top: 3px;
-	padding-bottom: 3px;
 }
 
 /* Posting page styles
 ----------------------------------------*/
 
 /* Buttons used in the editor */
-#format-buttons {
+.format-buttons {
 	margin: 15px 0 2px 0;
 }
 
-#format-buttons input, #format-buttons select {
+.format-buttons input, .format-buttons select {
 	vertical-align: middle;
 }
 
 /* Main message box */
-#message-box {
+.message-box {
 	width: 80%;
 }
 
-#message-box textarea {
+.message-box textarea {
 	font-family: "Trebuchet MS", Verdana, Helvetica, Arial, sans-serif;
 	width: 450px;
 	height: 270px;
@@ -253,12 +275,12 @@ fieldset.submit-buttons input {
 }
 
 /* Emoticons panel */
-#smiley-box {
+.smiley-box {
 	width: 18%;
 	float: right;
 }
 
-#smiley-box img {
+.smiley-box img {
 	margin: 3px;
 }
 
@@ -316,6 +338,7 @@ a.button1, input.button1, input.button3, a.button2, input.button2 {
 	padding-bottom: 1px;
 	font-family: "Lucida Grande", Verdana, Helvetica, Arial, sans-serif;
 	background: transparent none repeat-x top left;
+	line-height: 1.5;
 }
 
 a.button1, input.button1 {
@@ -342,18 +365,15 @@ a.button2, input.button2, input.button3 {
 }
 
 /* <a> button in the style of the form buttons */
-a.button1, a.button1:link, a.button1:visited, a.button1:active, a.button2, a.button2:link, a.button2:visited, a.button2:active {
+a.button1, a.button2 {
 	text-decoration: none;
-	padding: 2px 8px;
-	line-height: 250%;
+	padding: 0 3px;
 	vertical-align: text-bottom;
-	background-position: 0 1px;
 }
 
 /* Hover states */
 a.button1:hover, input.button1:hover, a.button2:hover, input.button2:hover, input.button3:hover {
 	border: 1px solid transparent;
-	background-position: 0 100%;
 }
 
 input.disabled {
@@ -382,26 +402,6 @@ input.button1:focus, input.button2:focus, input.button3:focus {
 	box-sizing: border-box;
 }
 
-.search-box button {
-	float: left;
-}
-
-.search-box button.search-icon {
-	border-radius: 0;
-	font-size: 0;
-	height: 24px;
-	margin: 0;
-	padding: 3px 5px;
-}
-
-.search-box a.button {
-	border-left-width: 0;
-	border-radius: 0 4px 4px 0;
-	font-size: 0;
-	margin: 0;
-	padding: 2px 5px 2px 3px;
-}
-
 /* Search box (header)
 --------------------------------------------- */
 .search-header {
@@ -414,16 +414,7 @@ input.button1:focus, input.button2:focus, input.button3:focus {
 
 .search-header .inputbox { border: 0; }
 
-.search-header button {
-	border-top: 0;
-	border-bottom: 0;
-}
-
-.search-header a.button {
-	border: 0;
-	border-left: 1px;
-	padding: 3px 5px 3px 4px;
-}
+.navbar .linklist > li.responsive-search { display: none; }
 
 input.search {
 	background-image: none;
--- /dev/null
+++ b/styles/prosilver/theme/icons.css
@@ -0,0 +1,83 @@
+/* --------------------------------------------------------------
+	$Icons
+-------------------------------------------------------------- */
+
+/* Global module setup
+--------------------------------*/
+
+/* Renamed version of .fa class for agnostic useage of icon fonts.
+ * Just change the name of the font after the 14/1 to the name of
+ * the font you wish to use.
+ */
+.icon, .button .icon  {
+	display: inline-block;
+  	font-weight: normal;
+  	font-style: normal;
+  	font-variant: normal;
+  	font-family: FontAwesome;
+  	font-size: 14px;
+  	line-height: 1;
+  	text-rendering: auto; /* optimizelegibility throws things off #1094 */
+  	-webkit-font-smoothing: antialiased;
+  	-moz-osx-font-smoothing: grayscale;
+}
+
+.icon:before { padding-right: 2px; }
+
+.button .icon:before {
+	padding-right: 0;
+}
+
+/* Icon size classes - Default size is 14px, use these for small variations */
+
+.icon.icon-xl {
+	font-size: 20px;
+}
+
+.icon.icon-lg {
+	font-size: 16px;
+}
+
+.icon.icon-md {
+	font-size: 10px;
+}
+
+.icon.icon-sm {
+	font-size: 8px;
+}
+
+/* icon modifiers */
+.icon-tiny {
+	width: 12px;
+	transform: scale(0.65, 0.75);
+	vertical-align: text-bottom;
+	font-size: 16px;
+}
+
+.arrow-left:hover .icon {
+	margin-left: -5px;
+	margin-right: 5px;
+}
+
+.arrow-right .icon {
+	float: right;
+}
+
+.arrow-right:hover .icon {
+	margin-left: 5px;
+	margin-right: -5px;
+}
+
+.post-buttons .dropdown-contents .icon {
+    float: right;
+    margin-left: 5px;
+}
+
+.alert_close .icon:before {
+	padding: 0;
+    border-radius: 50%;
+    width: 11px;
+    display: block;
+    line-height: .9;
+    height: 12px;
+}
--- a/styles/prosilver/theme/links.css
+++ b/styles/prosilver/theme/links.css
@@ -6,9 +6,11 @@ a {
 	direction: ltr;
 	unicode-bidi: embed;
 	text-decoration: none;
-}
+	/* we use links inline more often then not so to address several bugs with
+	IE and some other browsers we render all links as inlineblock by default */
+	display: inline-block;
 
-a:hover	{ text-decoration: underline; }
+}
 
 /* Coloured usernames */
 .username-coloured {
@@ -26,12 +28,6 @@ a:hover	{ text-decoration: underline; }
 	text-decoration: underline;
 }
 
-/* Navigation bar links */
-li.breadcrumbs span:first-child > a {
-	display: inline-block;
-	padding-left: 17px;
-}
-
 /* Notification mark read link */
 .dropdown-extended a.mark_read {
 	background-position: center center;
@@ -43,8 +39,6 @@ li.breadcrumbs span:first-child > a {
 	z-index: 2;
 	right: 0;
 	top: 50%;
-	width: 30px;
-	height: 40px;
 	-webkit-box-sizing: border-box;
 	-moz-box-sizing: border-box;
 	box-sizing: border-box;
@@ -55,9 +49,13 @@ li.breadcrumbs span:first-child > a {
 }
 
 .dropdown-extended a.mark_read:hover {
-	width: 40px;
+	width: 50px;
 }
 
+.jumpbox-cat-link,
+.jumpbox-forum-link { font-weight: bold; }
+
+
 /* Links for forum/topic lists */
 a.forumtitle {
 	font-family: "Trebuchet MS", Helvetica, Arial, Sans-serif;
@@ -75,6 +73,7 @@ a.topictitle {
 	font-size: 1.2em;
 	font-weight: bold;
 	text-decoration: none;
+	display: inline;
 }
 
 a.topictitle:hover {
@@ -126,72 +125,49 @@ a.lastsubject:hover {
 	text-decoration: underline;
 }
 
+.top {
+	font-size: 12px;
+	text-decoration: none;
+	margin-top: 10px;
+}
+
 /* Back to top of page */
 .back2top {
 	clear: both;
-	height: 11px;
-	text-align: right;
 }
 
-a.top {
-	background: none no-repeat top left;
-	text-decoration: none;
-	width: 11px;
-	height: 11px;
-	display: block;
+.back2top .top {
 	float: right;
-	overflow: hidden;
-	letter-spacing: 1000px;
-	text-indent: 11px;
-}
-
-a.top2 {
-	background: none no-repeat 0 50%;
-	text-decoration: none;
-	padding-left: 15px;
+	margin-right: -10px;
+	margin-top: 0;
 }
 
 /* Arrow links  */
-a.arrow-up		{ background: none no-repeat left center; }
-a.arrow-down		{ background: none no-repeat right center; }
-a.arrow-left		{ background: none no-repeat 3px 60%; }
-a.arrow-right		{ background: none no-repeat 95% 60%; }
 
-a.arrow-up {
+.arrow-up {
 	padding-left: 10px;
 	text-decoration: none;
 	border-bottom-width: 0;
 }
 
-a.arrow-up:hover {
-	background-position: left top;
+.arrow-up:hover {
+
 }
 
-a.arrow-down {
+.arrow-down {
 	padding-right: 10px;
 }
 
-a.arrow-down:hover {
-	background-position: right bottom;
-	text-decoration: none;
-}
+.arrow-down:hover {
 
-a.arrow-left {
-	padding-left: 12px;
 }
 
-a.arrow-left:hover {
+.arrow-left:hover {
 	text-decoration: none;
-	background-position: 0 60%;
-}
-
-a.arrow-right {
-	padding-right: 12px;
 }
 
-a.arrow-right:hover {
+.arrow-right:hover {
 	text-decoration: none;
-	background-position: 100% 60%;
 }
 
 /* invisible skip link, used for accessibility  */
--- /dev/null
+++ b/styles/prosilver/theme/normalize.css
@@ -0,0 +1,424 @@
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS and IE text size adjust after device orientation change,
+ *    without disabling user zoom.
+ */
+
+html {
+	font-family: sans-serif; /* 1 */
+	-ms-text-size-adjust: 100%; /* 2 */
+	-webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+	margin: 0;
+}
+
+/* HTML5 display definitions
+	 ========================================================================== */
+
+/**
+ * Correct `block` display not defined for any HTML5 element in IE 8/9.
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11
+ * and Firefox.
+ * Correct `block` display not defined for `main` in IE 11.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+	display: block;
+}
+
+/**
+ * 1. Correct `inline-block` display not defined in IE 8/9.
+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+ */
+
+audio,
+canvas,
+progress,
+video {
+	display: inline-block; /* 1 */
+	vertical-align: baseline; /* 2 */
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+	display: none;
+	height: 0;
+}
+
+/**
+ * Address `[hidden]` styling not present in IE 8/9/10.
+ * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
+ */
+
+[hidden],
+template {
+	display: none;
+}
+
+/* Links
+	 ========================================================================== */
+
+/**
+ * Remove the gray background color from active links in IE 10.
+ */
+
+a {
+	background-color: transparent;
+}
+
+/**
+ * Improve readability of focused elements when they are also in an
+ * active/hover state.
+ */
+
+a:active,
+a:hover {
+	outline: 0;
+}
+
+/* Text-level semantics
+	 ========================================================================== */
+
+/**
+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
+ */
+
+abbr[title] {
+	border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+ */
+
+b,
+strong {
+	font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari and Chrome.
+ */
+
+dfn {
+	font-style: italic;
+}
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari, and Chrome.
+ */
+
+h1 {
+	font-size: 2em;
+	margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+	background: #ff0;
+	color: #000;
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+	font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+	font-size: 75%;
+	line-height: 0;
+	position: relative;
+	vertical-align: baseline;
+}
+
+sup {
+	top: -0.5em;
+}
+
+sub {
+	bottom: -0.25em;
+}
+
+/* Embedded content
+	 ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9/10.
+ */
+
+img {
+	border: 0;
+}
+
+/**
+ * Correct overflow not hidden in IE 9/10/11.
+ */
+
+svg:not(:root) {
+	overflow: hidden;
+}
+
+/* Grouping content
+	 ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari.
+ */
+
+figure {
+	margin: 1em 40px;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+	box-sizing: content-box;
+	height: 0;
+}
+
+/**
+ * Contain overflow in all browsers.
+ */
+
+pre {
+	overflow: auto;
+}
+
+/**
+ * Address odd `em`-unit font size rendering in all browsers.
+ */
+
+code,
+kbd,
+pre,
+samp {
+	font-family: monospace, monospace;
+	font-size: 1em;
+}
+
+/* Forms
+	 ========================================================================== */
+
+/**
+ * Known limitation: by default, Chrome and Safari on OS X allow very limited
+ * styling of `select`, unless a `border` property is set.
+ */
+
+/**
+ * 1. Correct color not being inherited.
+ *    Known issue: affects color of disabled elements.
+ * 2. Correct font properties not being inherited.
+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+	color: inherit; /* 1 */
+	font: inherit; /* 2 */
+	margin: 0; /* 3 */
+}
+
+/**
+ * Address `overflow` set to `hidden` in IE 8/9/10/11.
+ */
+
+button {
+	overflow: visible;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
+ * Correct `select` style inheritance in Firefox.
+ */
+
+button,
+select {
+	text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ *    and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ *    `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+	-webkit-appearance: button; /* 2 */
+	cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+	cursor: default;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+	border: 0;
+	padding: 0;
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+input {
+	line-height: normal;
+}
+
+/**
+ * It's recommended that you don't attempt to style these elements.
+ * Firefox's implementation doesn't respect box-sizing, padding, or width.
+ *
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
+ * 2. Remove excess padding in IE 8/9/10.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+	box-sizing: border-box; /* 1 */
+	padding: 0; /* 2 */
+}
+
+/**
+ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
+ * `font-size` values of the `input`, it causes the cursor style of the
+ * decrement button to change from `default` to `text`.
+ */
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+	height: auto;
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome.
+ */
+
+input[type="search"] {
+	-webkit-appearance: textfield; /* 1 */
+	box-sizing: content-box; /* 2 */
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.
+ * Safari (but not Chrome) clips the cancel button when the search input has
+ * padding (and `textfield` appearance).
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+	-webkit-appearance: none;
+}
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+	border: 1px solid #c0c0c0;
+	margin: 0 2px;
+	padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9/10/11.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+	border: 0; /* 1 */
+	padding: 0; /* 2 */
+}
+
+/**
+ * Remove default vertical scrollbar in IE 8/9/10/11.
+ */
+
+textarea {
+	overflow: auto;
+}
+
+/**
+ * Don't inherit the `font-weight` (applied by a rule above).
+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+ */
+
+optgroup {
+	font-weight: bold;
+}
+
+/* Tables
+	 ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+	border-collapse: collapse;
+	border-spacing: 0;
+}
+
+td,
+th {
+	padding: 0;
+}
--- a/styles/prosilver/theme/plupload.css
+++ b/styles/prosilver/theme/plupload.css
@@ -1,9 +1,9 @@
-#attach-panel-multi {
+.attach-panel-multi {
 	display: none;
 	margin-bottom: 1em;
 }
 
-#file-list td {
+.file-list td {
 	vertical-align: middle;
 }
 
@@ -37,11 +37,11 @@
 	float: right;
 }
 
-#attach-row-tpl, .nojs .file-inline-bbcode {
+.nojs .file-inline-bbcode {
 	display: none;
 }
 
-#file-total-progress {
+.file-total-progress {
 	height: 2px;
 	display: block;
 	position: relative;
@@ -55,7 +55,7 @@
 	width: 50px;
 }
 
-.file-progress-bar, #file-total-progress-bar {
+.file-progress-bar, .file-total-progress-bar {
 	background-color: green;
 	display: block;
 	height: 100%;
--- a/styles/prosilver/theme/print.css
+++ b/styles/prosilver/theme/print.css
@@ -19,14 +19,14 @@ a:link		{ color: #000000; text-decoration: none; }
 a:visited	{ color: #000000; text-decoration: none; }
 a:active	{ color: #000000; text-decoration: none; }
 
-img, .noprint, #sub-header, #sub-footer, .navbar, .box1, .divider, .signature { display: none; }
+img, .noprint, .navbar, .box1, .divider, .signature { display: none; }
 /* Display smilies (Bug #47265) */
 .content img {
 	display: inline;
 }
 
 /* Container for the main body */
-#wrap {
+.wrap {
 	margin: 0 2em;
 }
 
--- a/styles/prosilver/theme/responsive.css
+++ b/styles/prosilver/theme/responsive.css
@@ -1,167 +1,110 @@
 /* Responsive Design
 ---------------------------------------- */
 
-.responsive-hide { display: none !important; }
-.responsive-show { display: block !important; }
-.responsive-show-inline { display: inline !important; }
-.responsive-show-inline-block { display: inline-block !important; }
-
-/* Content wrappers
-----------------------------------------*/
-html {
-	height: auto;
-}
-
-body {
-	padding: 0;
-}
-
-#wrap {
-	border: none;
-	border-radius: 0;
-	margin: 0;
-	min-width: 290px;
-	padding: 0 5px;
+@media (max-width: 320px) {
+	select, .inputbox {
+		max-width: 240px;
+	}
 }
 
-/* Common block wrappers
+/* Notifications list
 ----------------------------------------*/
-.headerbar, .navbar, .forabg, .forumbg, .post, .panel {
-	border-radius: 0;
-	margin-left: -5px;
-	margin-right: -5px;
+@media (max-width: 350px) {
+	.dropdown-extended .dropdown-contents {
+		width: auto;
+	}
 }
 
-#cp-main .forabg, #cp-main .forumdb, #cp-main .post, #cp-main .panel {
-	border-radius: 7px;
-}
+@media (max-width: 430px) {
+	.action-bar .search-box .inputbox {
+		width: 120px;
+	}
 
-/* Logo block
-----------------------------------------*/
-#site-description {
-	float: none;
-	width: auto;
-	text-align: center;
-}
+	.section-viewtopic .search-box .inputbox {
+		width: 57px;
+	}
 
-.logo {
-	/* change display value to inline-block to show logo */
-	display: none;
-	float: none;
-	padding: 10px;
-}
+	.action-bar .search-box .inputbox ::-moz-placeholder {
+    	content: "Search...";
+  	}
 
-#site-description h1, #site-description p {
-	text-align: inherit;
-	float: none;
-	margin: 5px;
-	line-height: 1.2em;
-	overflow: hidden;
-	text-overflow: ellipsis;
-}
+  	.action-bar .search-box .inputbox :-ms-input-placeholder {
+  		content: "Search...";
+  	}
 
-#site-description p, .search-header {
-	display: none;
+  	.action-bar .search-box .inputbox ::-webkit-input-placeholder {
+  		content: "Search...";
+  	}
 }
 
-/* Navigation
-----------------------------------------*/
-.headerbar + .navbar {
-	margin-top: -5px;
-}
+@media (max-width: 500px) {
+	dd label {
+		white-space: normal;
+	}
 
-/* Search
-----------------------------------------*/
-.responsive-search { display: block !important; }
-.responsive-search a {
-	display: block;
-	width: 16px;
-	height: 22px;
-	text-indent: 99px;
-	overflow: hidden;
-	background-position: 50% 50%;
-	background-repeat: no-repeat;
-	text-decoration: none;
-}
+	select, .inputbox {
+		max-width: 260px;
+	}
 
-/* .topiclist lists
-----------------------------------------*/
-li.header dt {
-	text-align: center;
-	text-transform: none;
-	line-height: 1em;
-	font-size: 1.2em;
-	padding-bottom: 4px;
-}
+	.captcha-panel dd.captcha {
+		margin-left: 0;
+	}
 
-ul.topiclist li.header dt, ul.topiclist li.header dt .list-inner {
-	margin-right: 0 !important;
-	padding-right: 0;
-}
+	.captcha-panel dd.captcha-image img {
+		width: 100%;
+	}
 
-ul.topiclist li.header dd {
-	display: none !important;
-}
+	dl.details dt, dl.details dd {
+		width: auto;
+		float: none;
+		text-align: left;
+	}
 
-ul.topiclist dt, ul.topiclist dt .list-inner,
-ul.topiclist.missing-column dt, ul.topiclist.missing-column dt .list-inner,
-ul.topiclist.two-long-columns dt, ul.topiclist.two-long-columns dt .list-inner,
-ul.topiclist.two-columns dt, ul.topiclist.two-columns dt .list-inner {
-	margin-right: 0;
-}
+	dl.details dd {
+		margin-left: 20px;
+	}
 
-ul.topiclist dt .list-inner.with-mark {
-	padding-right: 34px;
-}
+	p.responsive-center {
+		float: none;
+		text-align: center;
+		margin-bottom: 5px;
+	}
 
-ul.topiclist dt .list-inner {
-	min-height: 28px;
-}
+	.action-bar > div {
+		margin-bottom: 5px;
+ 	}
 
-ul.topiclist li.header dt .list-inner {
-	min-height: 0;
-}
+	.action-bar > .pagination {
+		float: none;
+		clear: both;
+		padding-bottom: 1px;
+		text-align: center;
+	}
 
-ul.topiclist dd {
-	display: none;
-}
-ul.topiclist dd.mark {
-	display: block;
-}
+	.action-bar > .pagination li.page-jump {
+		margin: 0 2px;
+	}
 
-/* Forums and topics lists
-----------------------------------------*/
-ul.topiclist.forums dt {
-	margin-right: -250px;
-}
-ul.topiclist.forums dt .list-inner {
-	margin-right: 250px;
-}
+	p.jumpbox-return {
+		display: none;
+	}
 
-ul.topiclist.forums dd.lastpost {
-	display: block;
-}
+	.display-options > label:nth-child(1) {
+		display: block;
+		margin-bottom: 5px;
+	}
 
-ul.topiclist dd.mark {
-	display: block;
-	position: absolute;
-	right: 5px;
-	top: 0;
-	margin: 0;
-	width: auto;
-	min-width: 0;
-	text-align: left;
-}
+	.attach-controls {
+		margin-top: 5px;
+		width: 100%;
+	}
 
-ul.topiclist.forums dd.topics dfn, ul.topiclist.topics dd.posts dfn {
-	position: relative;
-	left: 0;
-	width: auto;
-	display: inline;
-	font-weight: normal;
+	.quick-links .dropdown-trigger span {
+		display: none;
+	}
 }
 
-@media only screen and (max-width: 550px), only screen and (max-device-width: 550px) {
+@media (max-width: 550px) {
 	ul.topiclist.forums dt {
 		margin-right: 0;
 	}
@@ -175,400 +118,473 @@ ul.topiclist.forums dd.topics dfn, ul.topiclist.topics dd.posts dfn {
 	}
 }
 
-li.row .responsive-show strong {
-	font-weight: bold;
-	color: inherit;
-}
-
-ul.topiclist li.row dt a.subforum {
-	display: inline-block;
-	vertical-align: bottom;
-	overflow: hidden;
-	text-overflow: ellipsis;
-	max-width: 100px;
-}
+@media (max-width: 700px) {
+	.responsive-hide { display: none !important; }
+	.responsive-show { display: block !important; }
+	.responsive-show-inline { display: inline !important; }
+	.responsive-show-inline-block { display: inline-block !important; }
 
-/* Notifications list
-----------------------------------------*/
-@media only screen and (max-width: 350px), only screen and (max-device-width: 350px) {
-	.dropdown-extended .dropdown-contents {
-		width: auto;
+	/* Content wrappers
+	----------------------------------------*/
+	html {
+		height: auto;
 	}
-}
-
-/* Pagination
-----------------------------------------*/
-.pagination > ul {
-	margin: 5px 0 0;
-}
-
-.row .pagination .ellipsis + li {
-	display: none !important;
-}
-
-/* Responsive tables
-----------------------------------------*/
-table.responsive, table.responsive tbody, table.responsive tr, table.responsive td {
-	display: block;
-}
 
-table.responsive thead, table.responsive th {
-	display: none;
-}
+	body {
+		padding: 0;
+	}
 
-table.responsive.show-header thead, table.responsive.show-header th:first-child {
-	display: block;
-	width: auto !important;
-	text-align: left !important;
-}
+	.wrap {
+		border: none;
+		border-radius: 0;
+		margin: 0;
+		min-width: 290px;
+		padding: 0 5px;
+	}
 
-table.responsive.show-header th:first-child span.rank-img {
-	display: none;
-}
+	/* Common block wrappers
+	----------------------------------------*/
+	.headerbar, .navbar, .forabg, .forumbg, .post, .panel {
+		border-radius: 0;
+		margin-left: -5px;
+		margin-right: -5px;
+	}
 
-table.responsive tr {
-	margin: 2px 0;
-}
+	.cp-main .forabg, .cp-main .forumdb, .cp-main .post, .cp-main .panel {
+		border-radius: 7px;
+	}
 
-table.responsive td {
-	width: auto !important;
-	text-align: left !important;
-	padding: 4px;
-}
+	/* Logo block
+	----------------------------------------*/
+	.site-description {
+		float: none;
+		width: auto;
+		text-align: center;
+	}
 
-table.responsive td.empty {
-	display: none !important;
-}
+	.logo {
+		/* change display value to inline-block to show logo */
+		display: none;
+		float: none;
+		padding: 10px;
+	}
 
-table.responsive td > dfn {
-	display: inline-block !important;
-}
+	.site-description h1, .site-description p {
+		text-align: inherit;
+		float: none;
+		margin: 5px;
+		line-height: 1.2em;
+		overflow: hidden;
+		text-overflow: ellipsis;
+	}
 
-table.responsive td > dfn:after {
-	content: ':';
-	padding-right: 5px;
-}
+	.site-description p, .search-header {
+		display: none;
+	}
 
-table.responsive span.rank-img {
-	float: none;
-	padding-right: 5px;
-}
+	/* Navigation
+	----------------------------------------*/
+	.headerbar + .navbar {
+		margin-top: -5px;
+	}
 
-table.responsive#memberlist td:first-child input[type="checkbox"] {
-	float: right;
-}
+	/* Search
+	----------------------------------------*/
+	.responsive-search { display: block !important; }
 
-/* Forms
-----------------------------------------*/
-fieldset dt, fieldset.fields1 dt, fieldset.fields2 dt {
-	width: auto;
-	float: none;
-}
+	/* .topiclist lists
+	----------------------------------------*/
+	li.header dt {
+		text-align: center;
+		text-transform: none;
+		line-height: 1em;
+		font-size: 1.2em;
+		padding-bottom: 4px;
+	}
 
-fieldset dd, fieldset.fields1 dd, fieldset.fields2 dd {
-	margin-left: 20px;
-}
+	ul.topiclist li.header dt, ul.topiclist li.header dt .list-inner {
+		margin-right: 0 !important;
+		padding-right: 0;
+	}
 
-textarea, dd textarea, #message-box textarea {
-	width: 100%;
-	-moz-box-sizing: border-box;
-	box-sizing: border-box;
-}
+	ul.topiclist li.header dd {
+		display: none !important;
+	}
 
-dl.pmlist dt {
-	width: auto !important;
-	margin-bottom: 5px;
-}
+	ul.topiclist dt, ul.topiclist dt .list-inner,
+	ul.topiclist.missing-column dt, ul.topiclist.missing-column dt .list-inner,
+	ul.topiclist.two-long-columns dt, ul.topiclist.two-long-columns dt .list-inner,
+	ul.topiclist.two-columns dt, ul.topiclist.two-columns dt .list-inner {
+		margin-right: 0;
+	}
 
-dl.pmlist dd {
-	display: inline-block;
-	margin-left: 0 !important;
-}
+	ul.topiclist dt .list-inner.with-mark {
+		padding-right: 34px;
+	}
 
-dl.pmlist dd:first-of-type {
-	padding-left: 20px;
-}
+	ul.topiclist dt .list-inner {
+		min-height: 28px;
+	}
 
-#smiley-box, #message-box {
-	float: none;
-	width: auto;
-}
+	ul.topiclist li.header dt .list-inner {
+		min-height: 0;
+	}
 
-#smiley-box {
-	margin-top: 5px;
-}
+	ul.topiclist dd {
+		display: none;
+	}
+	ul.topiclist dd.mark {
+		display: block;
+	}
 
-.bbcode-status {
-	display: none;
-}
+	/* Forums and topics lists
+	----------------------------------------*/
+	ul.topiclist.forums dt {
+		margin-right: -250px;
+	}
 
-.colour-palette, .colour-palette tbody, .colour-palette tr {
-	display: block;
-}
+	ul.topiclist dd.mark {
+		display: block;
+		position: absolute;
+		right: 5px;
+		top: 0;
+		margin: 0;
+		width: auto;
+		min-width: 0;
+		text-align: left;
+	}
 
-.colour-palette td {
-	display: inline-block;
-	margin-right: 2px;
-}
+	ul.topiclist.forums dd.topics dfn, ul.topiclist.topics dd.posts dfn {
+		position: relative;
+		left: 0;
+		width: auto;
+		display: inline;
+		font-weight: normal;
+	}
 
-.horizontal-palette td:nth-child(2n), .vertical-palette tr:nth-child(2n) {
-	display: none;
-}
+	li.row .responsive-show strong {
+		font-weight: bold;
+		color: inherit;
+	}
 
-.colour-palette a {
-	display: inline-block !important;
-}
+	ul.topiclist li.row dt a.subforum {
+		vertical-align: bottom;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		max-width: 100px;
+	}
 
-fieldset.quick-login label {
-	display: block;
-	margin-bottom: 5px;
-	white-space: normal;
-}
+	/* Pagination
+	----------------------------------------*/
+	.pagination > ul {
+		margin: 5px 0 0;
+	}
 
-fieldset.quick-login label > span {
-	display: inline-block;
-	min-width: 100px;
-}
+	.row .pagination {
+		margin-top: 2px;
+		margin-bottom: 2px;
+	}
 
-fieldset.quick-login input.inputbox {
-	width: 85%;
-	max-width: 300px;
-	margin-left: 20px;
-}
+	.row .pagination .ellipsis + li {
+		display: none !important;
+	}
 
-fieldset.quick-login label[for="autologin"] {
-	display: inline-block;
-	text-align: right;
-	min-width: 50%;
-}
+	/* Responsive tables
+	----------------------------------------*/
+	table.responsive, table.responsive tbody, table.responsive tr, table.responsive td {
+		display: block;
+	}
 
-@media only screen and (max-width: 500px), only screen and (max-device-width: 500px) {
-	dd label {
-		white-space: normal;
+	table.responsive thead, table.responsive th {
+		display: none;
 	}
 
-	select, .inputbox {
-		max-width: 260px;
+	table.responsive.show-header thead, table.responsive.show-header th:first-child {
+		display: block;
+		width: auto !important;
+		text-align: left !important;
 	}
 
-	.captcha-panel dd.captcha {
-		margin-left: 0;
+	table.responsive.show-header th:first-child span.rank-img {
+		display: none;
 	}
 
-	.captcha-panel dd.captcha-image img {
-		width: 100%;
+	table.responsive tr {
+		margin: 2px 0;
 	}
 
-	#recaptcha_challenge_image,
-	#recaptcha_response_field,
-	.recaptchatable #recaptcha_image {
-		width: 100% !important;
-		height: auto !important;
+	table.responsive td {
+		width: auto !important;
+		text-align: left !important;
+		padding: 4px;
 	}
 
-	.recaptchatable tr td:last-child {
-		display: none;
+	table.responsive td.empty {
+		display: none !important;
 	}
 
-	.captcha-panel .recaptcha-responsive {
+	table.responsive td > dfn {
 		display: inline-block !important;
-		margin-top: 10px;
-		vertical-align: middle;
 	}
-}
 
-@media only screen and (max-width: 430px), only screen and (max-device-width: 430px) {
-	.section-viewtopic .search-box .inputbox {
-		width: 110px;
+	table.responsive td > dfn:after {
+		content: ':';
+		padding-right: 5px;
 	}
-}
 
-@media only screen and (max-width: 320px), only screen and (max-device-width: 320px) {
-	select, .inputbox {
-		max-width: 240px;
+	table.responsive span.rank-img {
+		float: none;
+		padding-right: 5px;
 	}
-}
 
-/* User profile
-----------------------------------------*/
-.column1, .column2, .left-box.profile-details {
-	float: none;
-	width: auto;
-}
+	table.responsive.memberlist td:first-child input[type="checkbox"] {
+		float: right;
+	}
 
-@media only screen and (max-width: 500px), only screen and (max-device-width: 500px) {
-	dl.details dt, dl.details dd {
+	/* Forms
+	----------------------------------------*/
+	fieldset dt, fieldset.fields1 dt, fieldset.fields2 dt {
 		width: auto;
 		float: none;
-		text-align: left;
 	}
 
-	dl.details dd {
+	fieldset dd, fieldset.fields1 dd, fieldset.fields2 dd {
 		margin-left: 20px;
 	}
-}
 
-/* Polls
-----------------------------------------*/
-fieldset.polls dt {
-	width: 90%;
-}
+	textarea, dd textarea, .message-box textarea {
+		width: 100%;
+		-moz-box-sizing: border-box;
+		box-sizing: border-box;
+	}
 
-fieldset.polls dd.resultbar {
-	padding-left: 20px;
-}
+	dl.pmlist dt {
+		width: auto !important;
+		margin-bottom: 5px;
+	}
 
-fieldset.polls dd.poll_option_percent {
-	width: 20%;
-}
+	dl.pmlist dd {
+		display: inline-block;
+		margin-left: 0 !important;
+	}
 
-fieldset.polls dd.resultbar, fieldset.polls dd.poll_option_percent {
-	margin-top: 5px;
-}
+	dl.pmlist dd:first-of-type {
+		padding-left: 20px;
+	}
 
-/* Post
-----------------------------------------*/
-.postbody {
-	position: inherit;
-}
+	.smiley-box, .message-box {
+		float: none;
+		width: auto;
+	}
 
-.postprofile, .postbody, .search .postbody {
-	display: block;
-	width: auto;
-	float: none;
-	padding: 0;
-	min-height: 0;
-}
+	.smiley-box {
+		margin-top: 5px;
+	}
 
-.post .postprofile {
-	width: auto;
-	border-width: 0 0 1px 0;
-	padding-bottom: 5px;
-	margin: 0;
-	margin-bottom: 5px;
-	min-height: 40px;
-	overflow: hidden;
-}
+	.bbcode-status {
+		display: none;
+	}
 
-.postprofile dd {
-	display: none;
-}
+	.colour-palette, .colour-palette tbody, .colour-palette tr {
+		display: block;
+	}
 
-.postprofile dt, .postprofile dd.profile-rank, .search .postprofile dd {
-	display: block;
-	margin: 0;
-}
+	.colour-palette td {
+		display: inline-block;
+		margin-right: 2px;
+	}
 
-.postprofile .has-avatar .avatar-container {
-	margin: 0;
-	overflow: inherit;
-}
+	.horizontal-palette td:nth-child(2n), .vertical-palette tr:nth-child(2n) {
+		display: none;
+	}
 
-.postprofile .avatar-container:after {
-	clear: none;
-}
+	fieldset.quick-login label {
+		display: block;
+		margin-bottom: 5px;
+		white-space: normal;
+	}
 
-.postprofile .avatar {
-	margin-right: 5px;
-}
+	fieldset.quick-login label > span {
+		display: inline-block;
+		min-width: 100px;
+	}
 
-.postprofile .avatar img {
-	width: auto !important;
-	height: auto !important;
-	max-height: 32px;
-}
+	fieldset.quick-login input.inputbox {
+		width: 85%;
+		max-width: 300px;
+		margin-left: 20px;
+	}
 
-.has-profile .postbody h3 {
-	margin-left: 0 !important;
-	margin-right: 0 !important;
-}
+	fieldset.quick-login label[for="autologin"] {
+		display: inline-block;
+		text-align: right;
+		min-width: 50%;
+	}
 
-.has-profile .post-buttons {
-	right: 20px;
-	top: 15px;
-}
+	/* User profile
+	----------------------------------------*/
+	.column1, .column2, .left-box.profile-details {
+		float: none;
+		width: auto;
+	}
 
-.online {
-	background-size: 40px;
-}
+	/* Polls
+	----------------------------------------*/
+	fieldset.polls dt {
+		width: 90%;
+	}
 
-/* Misc stuff
-----------------------------------------*/
-h2 {
-	margin-top: .5em;
-}
+	fieldset.polls dd.resultbar {
+		padding-left: 20px;
+	}
 
-p {
-	margin-bottom: .5em;
-	overflow: hidden;
-}
+	fieldset.polls dd.poll_option_percent {
+		width: 20%;
+	}
 
-p.rightside {
-	margin-bottom: 0;
-}
+	fieldset.polls dd.resultbar, fieldset.polls dd.poll_option_percent {
+		margin-top: 5px;
+	}
 
-fieldset.display-options label {
-	display: block;
-	clear: both;
-	margin-bottom: 5px;
-}
+	/* Post
+	----------------------------------------*/
+	.postbody {
+		position: inherit;
+	}
 
-dl.mini dd.pm-legend {
-	float: left;
-	min-width: 200px;
-}
+	.postprofile, .postbody, .search .postbody {
+		display: block;
+		width: auto;
+		float: none;
+		padding: 0;
+		min-height: 0;
+	}
 
-#topicreview {
-	margin: 0 -5px;
-	padding: 0 5px;
-}
+	.post .postprofile {
+		width: auto;
+		border-width: 0 0 1px 0;
+		padding-bottom: 5px;
+		margin: 0;
+		margin-bottom: 5px;
+		min-height: 40px;
+		overflow: hidden;
+	}
 
-fieldset.display-actions {
-	white-space: normal;
-}
+	.postprofile dd {
+		display: none;
+	}
 
-.phpbb_alert {
-	width: auto;
-	margin: 0 5px;
-}
+	.postprofile dt, .postprofile dd.profile-rank, .search .postprofile dd {
+		display: block;
+		margin: 0;
+	}
 
-.attach-comment dfn {
-	width: 100%;
-}
+	.postprofile .has-avatar .avatar-container {
+		margin: 0;
+		overflow: inherit;
+	}
 
-@media only screen and (max-width: 500px), only screen and (max-device-width: 500px) {
-	p.responsive-center {
-		float: none;
-		text-align: center;
-		margin-bottom: 5px;
+	.postprofile .avatar-container:after {
+		clear: none;
 	}
 
-	.action-bar > div {
-		margin-bottom: 5px;
- 	}
+	.postprofile .avatar {
+		margin-right: 5px;
+	}
 
-	.action-bar > .pagination {
-		float: none;
-		clear: both;
-		padding-bottom: 1px;
-		text-align: center;
+	.postprofile .avatar img {
+		width: auto !important;
+		height: auto !important;
+		max-height: 32px;
 	}
 
-	.action-bar > .pagination li.page-jump {
-		margin: 0 2px;
+	.has-profile .postbody h3 {
+		margin-left: 0 !important;
+		margin-right: 0 !important;
 	}
 
-	p.jumpbox-return {
-		display: none;
+	.has-profile .post-buttons {
+		right: 30px;
+		top: 15px;
 	}
 
-	.display-options > label:nth-child(1) {
+	.online {
+		background-size: 40px;
+	}
+
+	/* Misc stuff
+	----------------------------------------*/
+	h2 {
+		margin-top: .5em;
+	}
+
+	p {
+		margin-bottom: .5em;
+		overflow: hidden;
+	}
+
+	p.rightside {
+		margin-bottom: 0;
+	}
+
+	fieldset.display-options label {
 		display: block;
+		clear: both;
 		margin-bottom: 5px;
 	}
 
-	.attach-controls {
-		margin-top: 5px;
+	dl.mini dd.pm-legend {
+		float: left;
+		min-width: 200px;
+	}
+
+	.topicreview {
+		margin: 0 -5px;
+		padding: 0 5px;
+	}
+
+	fieldset.display-actions {
+		white-space: normal;
+	}
+
+	.phpbb_alert {
+		width: auto;
+		margin: 0 5px;
+	}
+
+	.attach-comment dfn {
 		width: 100%;
 	}
 }
+
+@media (min-width: 700px) {
+	.postbody { width: 70%; }
+}
+
+@media (min-width: 850px) {
+	.postbody { width: 76%; }
+}
+
+@media (max-width: 850px) {
+	.postprofile { width: 28%; }
+}
+
+@media (min-width: 701px) and (max-width: 950px) {
+	.row .pagination {
+		margin-top: 2px;
+		margin-bottom: 2px;
+	}
+
+	ul.topiclist dt {
+    	margin-right: -410px;
+	}
+
+	ul.topiclist dt .list-inner {
+    	margin-right: 410px;
+	}
+
+	dd.posts, dd.topics, dd.views {
+    	width: 80px;
+	}
+}
+
--- a/styles/prosilver/theme/stylesheet.css
+++ b/styles/prosilver/theme/stylesheet.css
@@ -1,17 +1,21 @@
 /*  phpBB3 Style Sheet
     --------------------------------------------------------------
 	Style name:			prosilver (the default phpBB 3.1.x style)
-	Based on style:		
+	Based on style:
 	Original author:	Tom Beddard ( http://www.subblue.com/ )
 	Modified by:		phpBB Limited ( https://www.phpbb.com/ )
     --------------------------------------------------------------
 */
 
+@import url("normalize.css");
+@import url("base.css");
+@import url("utilities.css");
 @import url("common.css");
 @import url("links.css");
 @import url("content.css");
 @import url("buttons.css");
 @import url("cp.css");
 @import url("forms.css");
+@import url("icons.css");
 @import url("colours.css");
-@import url("imageset.css");
+@import url("responsive.css");
--- a/styles/prosilver/theme/tweaks.css
+++ b/styles/prosilver/theme/tweaks.css
@@ -27,3 +27,15 @@ dd label input { vertical-align: text-bottom\9; }
 .search-header, .search-header .inputbox, .search-header a.button {
 	border-radius: 0;
 }
+
+.headerbar, .forumbg {
+	background-image: url("./images/bg_header.gif");
+}
+
+.forabg {
+	background-image: url("./images/bg_list.gif");
+}
+
+.tabs .tab > a {
+	border-radius: 0;
+}
--- /dev/null
+++ b/styles/prosilver/theme/utilities.css
@@ -0,0 +1,66 @@
+/* --------------------------------------------------------------
+	$Utilities
+-------------------------------------------------------------- */
+
+.sr-only {
+	position: absolute;
+	width: 1px;
+	height: 1px;
+	margin: -1px;
+	padding: 0;
+	overflow: hidden;
+	clip: rect(0, 0, 0, 0);
+	border: 0;
+}
+
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  clip: auto;
+}
+
+.clearfix:before,
+.clearfix:after,
+.container:before,
+.container:after,
+.container-fluid:before,
+.container-fluid:after,
+.row:before,
+.row:after {
+	content: " ";
+	display: table;
+}
+.clearfix:after,
+.container:after,
+.container-fluid:after,
+.row:after { clear: both }
+
+.center-block {
+	display: block;
+	margin-left: auto;
+	margin-right: auto;
+}
+
+.pull-right { float: right !important }
+.pull-left { float: left !important }
+.hide { display: none !important }
+.show { display: block !important }
+.invisible { visibility: hidden }
+
+.text-hide {
+	font: 0/0 a;
+	color: transparent;
+	text-shadow: none;
+	background-color: transparent;
+	border: 0;
+}
+
+.hidden {
+	display: none ;
+}
+
+.affix { position: fixed }
--- a/ucp.php
+++ b/ucp.php
@@ -22,8 +22,8 @@ require($phpbb_root_path . 'includes/functions_user.' . $phpEx);
 require($phpbb_root_path . 'includes/functions_module.' . $phpEx);
 
 // Basic parameter data
-$id 	= request_var('i', '');
-$mode	= request_var('mode', '');
+$id 	= $request->variable('i', '');
+$mode	= $request->variable('mode', '');
 
 if (in_array($mode, array('login', 'login_link', 'logout', 'confirm', 'sendpassword', 'activate')))
 {
@@ -81,7 +81,7 @@ switch ($mode)
 			redirect(append_sid("{$phpbb_root_path}index.$phpEx"));
 		}
 
-		login_box(request_var('redirect', "index.$phpEx"));
+		login_box($request->variable('redirect', "index.$phpEx"));
 	break;
 
 	case 'login_link':
@@ -212,7 +212,7 @@ switch ($mode)
 
 	case 'switch_perm':
 
-		$user_id = request_var('u', 0);
+		$user_id = $request->variable('u', 0);
 
 		$sql = 'SELECT *
 			FROM ' . USERS_TABLE . '
@@ -221,7 +221,7 @@ switch ($mode)
 		$user_row = $db->sql_fetchrow($result);
 		$db->sql_freeresult($result);
 
-		if (!$auth->acl_get('a_switchperm') || !$user_row || $user_id == $user->data['user_id'] || !check_link_hash(request_var('hash', ''), 'switchperm'))
+		if (!$auth->acl_get('a_switchperm') || !$user_row || $user_id == $user->data['user_id'] || !check_link_hash($request->variable('hash', ''), 'switchperm'))
 		{
 			redirect(append_sid("{$phpbb_root_path}index.$phpEx"));
 		}
@@ -234,7 +234,7 @@ switch ($mode)
 			redirect(append_sid("{$phpbb_root_path}index.$phpEx"));
 		}
 
-		add_log('admin', 'LOG_ACL_TRANSFER_PERMISSIONS', $user_row['username']);
+		$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ACL_TRANSFER_PERMISSIONS', false, array($user_row['username']));
 
 		$message = sprintf($user->lang['PERMISSIONS_TRANSFERRED'], $user_row['username']) . '<br /><br />' . sprintf($user->lang['RETURN_INDEX'], '<a href="' . append_sid("{$phpbb_root_path}index.$phpEx") . '">', '</a>');
 		trigger_error($message);
@@ -257,7 +257,7 @@ switch ($mode)
 		$username = $db->sql_fetchfield('username');
 		$db->sql_freeresult($result);
 
-		add_log('admin', 'LOG_ACL_RESTORE_PERMISSIONS', $username);
+		$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ACL_RESTORE_PERMISSIONS', false, array($username));
 
 		$message = $user->lang['PERMISSIONS_RESTORED'] . '<br /><br />' . sprintf($user->lang['RETURN_INDEX'], '<a href="' . append_sid("{$phpbb_root_path}index.$phpEx") . '">', '</a>');
 		trigger_error($message);
@@ -285,7 +285,7 @@ if (!$user->data['is_registered'])
 
 	if ($id == 'pm' && $mode == 'view' && isset($_GET['p']))
 	{
-		$redirect_url = append_sid("{$phpbb_root_path}ucp.$phpEx?i=pm&p=" . request_var('p', 0));
+		$redirect_url = append_sid("{$phpbb_root_path}ucp.$phpEx?i=pm&p=" . $request->variable('p', 0));
 		login_box($redirect_url, $user->lang['LOGIN_EXPLAIN_UCP']);
 	}
 
--- a/vendor/autoload.php
+++ b/vendor/autoload.php
@@ -4,4 +4,4 @@
 
 require_once __DIR__ . '/composer' . '/autoload_real.php';
 
-return ComposerAutoloaderInit302cb276591cf8e8fafc63fc4c8c0639::getLoader();
+return ComposerAutoloaderInit38fb9e12d1bb4904a885b1eeaa7a0598::getLoader();
--- /dev/null
+++ b/vendor/bantu/ini-get-wrapper/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2014 Andreas Fischer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/bantu/ini-get-wrapper/composer.json
@@ -0,0 +1,15 @@
+{
+    "name": "bantu/ini-get-wrapper",
+    "type": "library",
+    "description": "Convenience wrapper around ini_get()",
+    "license": "MIT",
+    "require-dev": {
+        "phpunit/phpunit": "3.7.*"
+    },
+    "autoload": {
+        "psr-4": { "bantu\\IniGetWrapper\\": "src/" }
+    },
+    "autoload-dev": {
+        "psr-4": { "bantu\\IniGetWrapper\\": "tests/" }
+    }
+}
--- /dev/null
+++ b/vendor/bantu/ini-get-wrapper/src/IniGetWrapper.php
@@ -0,0 +1,162 @@
+<?php
+
+/*
+* (c) Andreas Fischer <git@andreasfischer.net>
+*
+* For the full copyright and license information, please view the LICENSE
+* file that was distributed with this source code.
+*/
+
+namespace bantu\IniGetWrapper;
+
+/**
+* Wrapper class around built-in ini_get() function.
+*
+* Provides easier handling of the different interpretations of ini values.
+*/
+class IniGetWrapper
+{
+    /**
+    * Simple wrapper around ini_get()
+    * See http://php.net/manual/en/function.ini-get.php
+    *
+    * @param string $varname  The configuration option name.
+    * @return null|string     Null if configuration option does not exist.
+    *                         The configuration option value (string) otherwise.
+    */
+    public function get($varname)
+    {
+        $value = $this->getPhp($varname);
+        return $value === false ? null : $value;
+    }
+
+    /**
+    * Gets the configuration option value as a trimmed string.
+    *
+    * @param string $varname  The configuration option name.
+    * @return null|string     Null if configuration option does not exist.
+    *                         The configuration option value (string) otherwise.
+    */
+    public function getString($varname)
+    {
+        $value = $this->get($varname);
+        return $value === null ? null : trim($value);
+    }
+
+    /**
+    * Gets configuration option value as a boolean.
+    * Interprets the string value 'off' as false.
+    *
+    * @param string $varname  The configuration option name.
+    * @return null|bool       Null if configuration option does not exist.
+    *                         False if configuration option is disabled.
+    *                         True otherwise.
+    */
+    public function getBool($varname)
+    {
+        $value = $this->getString($varname);
+        return $value === null ? null : $value && strtolower($value) !== 'off';
+    }
+
+    /**
+    * Gets configuration option value as an integer.
+    *
+    * @param string $varname  The configuration option name.
+    * @return null|int|float  Null if configuration option does not exist or is not numeric.
+    *                         The configuration option value (integer or float) otherwise.
+    */
+    public function getNumeric($varname)
+    {
+        $value = $this->getString($varname);
+        return is_numeric($value) ? $value + 0 : null;
+    }
+
+    /**
+    * Gets configuration option value in bytes.
+    * Converts strings like '128M' to bytes (integer or float).
+    *
+    * @param string $varname  The configuration option name.
+    * @return null|int|float  Null if configuration option does not exist or is not well-formed.
+    *                         The configuration option value as bytes (integer or float) otherwise.
+    */
+    public function getBytes($varname)
+    {
+        $value = $this->getString($varname);
+
+        if ($value === null) {
+            return null;
+        }
+
+        if (is_numeric($value)) {
+            // Already in bytes.
+            return $value + 0;
+        }
+
+        if (strlen($value) < 2 || strlen($value) < 3 && $value[0] === '-') {
+            // Either a single character
+            // or two characters where the first one is a minus.
+            return null;
+        }
+
+        // Split string into numeric value and unit.
+        $value_numeric = substr($value, 0, -1);
+        if (!is_numeric($value_numeric)) {
+            return null;
+        }
+
+        switch (strtolower($value[strlen($value) - 1])) {
+            case 'g':
+                $value_numeric *= 1024;
+                // no break
+            case 'm':
+                $value_numeric *= 1024;
+                // no break
+            case 'k':
+                $value_numeric *= 1024;
+                break;
+
+            default:
+                // It's not already in bytes (and thus numeric)
+                // and does not carry a unit.
+                return null;
+        }
+
+        return $value_numeric;
+    }
+
+    /**
+    * Gets configuration option value as a list (array).
+    * Converts comma-separated string into list (array).
+    *
+    * @param string $varname  The configuration option name.
+    * @return null|array      Null if configuration option does not exist.
+    *                         The configuration option value as a list (array) otherwise.
+    */
+    public function getList($varname)
+    {
+        $value = $this->getString($varname);
+        return $value === null ? null : explode(',', $value);
+    }
+
+    /**
+    * Checks whether a list contains a given element (string).
+    *
+    * @param string $varname  The configuration option name.
+    * @param string $needle   The element to check whether it is contained in the list.
+    * @return null|bool       Null if configuration option does not exist.
+    *                         Whether $needle is contained in the list otherwise.
+    */
+    public function listContains($varname, $needle)
+    {
+        $list = $this->getList($varname);
+        return $list === null ? null : in_array($needle, $list, true);
+    }
+
+    /**
+    * @param string $varname  The configuration option name.
+    */
+    protected function getPhp($varname)
+    {
+        return ini_get($varname);
+    }
+}
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -6,6 +6,132 @@ $vendorDir = dirname(dirname(__FILE__));
 $baseDir = dirname($vendorDir);
 
 return array(
+    'CallbackFilterIterator' => $vendorDir . '/symfony/polyfill-php54/Resources/stubs/CallbackFilterIterator.php',
+    'FastImageSize\\FastImageSize' => $vendorDir . '/marc1706/fast-image-size/lib/FastImageSize.php',
+    'FastImageSize\\Type\\TypeBase' => $vendorDir . '/marc1706/fast-image-size/lib/Type/TypeBase.php',
+    'FastImageSize\\Type\\TypeBmp' => $vendorDir . '/marc1706/fast-image-size/lib/Type/TypeBmp.php',
+    'FastImageSize\\Type\\TypeGif' => $vendorDir . '/marc1706/fast-image-size/lib/Type/TypeGif.php',
+    'FastImageSize\\Type\\TypeIco' => $vendorDir . '/marc1706/fast-image-size/lib/Type/TypeIco.php',
+    'FastImageSize\\Type\\TypeIff' => $vendorDir . '/marc1706/fast-image-size/lib/Type/TypeIff.php',
+    'FastImageSize\\Type\\TypeInterface' => $vendorDir . '/marc1706/fast-image-size/lib/Type/TypeInterface.php',
+    'FastImageSize\\Type\\TypeJp2' => $vendorDir . '/marc1706/fast-image-size/lib/Type/TypeJp2.php',
+    'FastImageSize\\Type\\TypeJpeg' => $vendorDir . '/marc1706/fast-image-size/lib/Type/TypeJpeg.php',
+    'FastImageSize\\Type\\TypePng' => $vendorDir . '/marc1706/fast-image-size/lib/Type/TypePng.php',
+    'FastImageSize\\Type\\TypePsd' => $vendorDir . '/marc1706/fast-image-size/lib/Type/TypePsd.php',
+    'FastImageSize\\Type\\TypeTif' => $vendorDir . '/marc1706/fast-image-size/lib/Type/TypeTif.php',
+    'FastImageSize\\Type\\TypeWbmp' => $vendorDir . '/marc1706/fast-image-size/lib/Type/TypeWbmp.php',
+    'GuzzleHttp\\BatchResults' => $vendorDir . '/guzzlehttp/guzzle/src/BatchResults.php',
+    'GuzzleHttp\\Client' => $vendorDir . '/guzzlehttp/guzzle/src/Client.php',
+    'GuzzleHttp\\ClientInterface' => $vendorDir . '/guzzlehttp/guzzle/src/ClientInterface.php',
+    'GuzzleHttp\\Collection' => $vendorDir . '/guzzlehttp/guzzle/src/Collection.php',
+    'GuzzleHttp\\Cookie\\CookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/CookieJar.php',
+    'GuzzleHttp\\Cookie\\CookieJarInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php',
+    'GuzzleHttp\\Cookie\\FileCookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php',
+    'GuzzleHttp\\Cookie\\SessionCookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php',
+    'GuzzleHttp\\Cookie\\SetCookie' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/SetCookie.php',
+    'GuzzleHttp\\Event\\AbstractEvent' => $vendorDir . '/guzzlehttp/guzzle/src/Event/AbstractEvent.php',
+    'GuzzleHttp\\Event\\AbstractRequestEvent' => $vendorDir . '/guzzlehttp/guzzle/src/Event/AbstractRequestEvent.php',
+    'GuzzleHttp\\Event\\AbstractRetryableEvent' => $vendorDir . '/guzzlehttp/guzzle/src/Event/AbstractRetryableEvent.php',
+    'GuzzleHttp\\Event\\AbstractTransferEvent' => $vendorDir . '/guzzlehttp/guzzle/src/Event/AbstractTransferEvent.php',
+    'GuzzleHttp\\Event\\BeforeEvent' => $vendorDir . '/guzzlehttp/guzzle/src/Event/BeforeEvent.php',
+    'GuzzleHttp\\Event\\CompleteEvent' => $vendorDir . '/guzzlehttp/guzzle/src/Event/CompleteEvent.php',
+    'GuzzleHttp\\Event\\Emitter' => $vendorDir . '/guzzlehttp/guzzle/src/Event/Emitter.php',
+    'GuzzleHttp\\Event\\EmitterInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Event/EmitterInterface.php',
+    'GuzzleHttp\\Event\\EndEvent' => $vendorDir . '/guzzlehttp/guzzle/src/Event/EndEvent.php',
+    'GuzzleHttp\\Event\\ErrorEvent' => $vendorDir . '/guzzlehttp/guzzle/src/Event/ErrorEvent.php',
+    'GuzzleHttp\\Event\\EventInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Event/EventInterface.php',
+    'GuzzleHttp\\Event\\HasEmitterInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Event/HasEmitterInterface.php',
+    'GuzzleHttp\\Event\\HasEmitterTrait' => $vendorDir . '/guzzlehttp/guzzle/src/Event/HasEmitterTrait.php',
+    'GuzzleHttp\\Event\\ListenerAttacherTrait' => $vendorDir . '/guzzlehttp/guzzle/src/Event/ListenerAttacherTrait.php',
+    'GuzzleHttp\\Event\\ProgressEvent' => $vendorDir . '/guzzlehttp/guzzle/src/Event/ProgressEvent.php',
+    'GuzzleHttp\\Event\\RequestEvents' => $vendorDir . '/guzzlehttp/guzzle/src/Event/RequestEvents.php',
+    'GuzzleHttp\\Event\\SubscriberInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Event/SubscriberInterface.php',
+    'GuzzleHttp\\Exception\\BadResponseException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/BadResponseException.php',
+    'GuzzleHttp\\Exception\\ClientException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ClientException.php',
+    'GuzzleHttp\\Exception\\ConnectException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ConnectException.php',
+    'GuzzleHttp\\Exception\\CouldNotRewindStreamException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/CouldNotRewindStreamException.php',
+    'GuzzleHttp\\Exception\\ParseException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ParseException.php',
+    'GuzzleHttp\\Exception\\RequestException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/RequestException.php',
+    'GuzzleHttp\\Exception\\ServerException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ServerException.php',
+    'GuzzleHttp\\Exception\\StateException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/StateException.php',
+    'GuzzleHttp\\Exception\\TooManyRedirectsException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php',
+    'GuzzleHttp\\Exception\\TransferException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/TransferException.php',
+    'GuzzleHttp\\Exception\\XmlParseException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/XmlParseException.php',
+    'GuzzleHttp\\HasDataTrait' => $vendorDir . '/guzzlehttp/guzzle/src/HasDataTrait.php',
+    'GuzzleHttp\\Message\\AbstractMessage' => $vendorDir . '/guzzlehttp/guzzle/src/Message/AbstractMessage.php',
+    'GuzzleHttp\\Message\\AppliesHeadersInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Message/AppliesHeadersInterface.php',
+    'GuzzleHttp\\Message\\FutureResponse' => $vendorDir . '/guzzlehttp/guzzle/src/Message/FutureResponse.php',
+    'GuzzleHttp\\Message\\MessageFactory' => $vendorDir . '/guzzlehttp/guzzle/src/Message/MessageFactory.php',
+    'GuzzleHttp\\Message\\MessageFactoryInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Message/MessageFactoryInterface.php',
+    'GuzzleHttp\\Message\\MessageInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Message/MessageInterface.php',
+    'GuzzleHttp\\Message\\MessageParser' => $vendorDir . '/guzzlehttp/guzzle/src/Message/MessageParser.php',
+    'GuzzleHttp\\Message\\Request' => $vendorDir . '/guzzlehttp/guzzle/src/Message/Request.php',
+    'GuzzleHttp\\Message\\RequestInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Message/RequestInterface.php',
+    'GuzzleHttp\\Message\\Response' => $vendorDir . '/guzzlehttp/guzzle/src/Message/Response.php',
+    'GuzzleHttp\\Message\\ResponseInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Message/ResponseInterface.php',
+    'GuzzleHttp\\Mimetypes' => $vendorDir . '/guzzlehttp/guzzle/src/Mimetypes.php',
+    'GuzzleHttp\\Pool' => $vendorDir . '/guzzlehttp/guzzle/src/Pool.php',
+    'GuzzleHttp\\Post\\MultipartBody' => $vendorDir . '/guzzlehttp/guzzle/src/Post/MultipartBody.php',
+    'GuzzleHttp\\Post\\PostBody' => $vendorDir . '/guzzlehttp/guzzle/src/Post/PostBody.php',
+    'GuzzleHttp\\Post\\PostBodyInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Post/PostBodyInterface.php',
+    'GuzzleHttp\\Post\\PostFile' => $vendorDir . '/guzzlehttp/guzzle/src/Post/PostFile.php',
+    'GuzzleHttp\\Post\\PostFileInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Post/PostFileInterface.php',
+    'GuzzleHttp\\Query' => $vendorDir . '/guzzlehttp/guzzle/src/Query.php',
+    'GuzzleHttp\\QueryParser' => $vendorDir . '/guzzlehttp/guzzle/src/QueryParser.php',
+    'GuzzleHttp\\RequestFsm' => $vendorDir . '/guzzlehttp/guzzle/src/RequestFsm.php',
+    'GuzzleHttp\\RingBridge' => $vendorDir . '/guzzlehttp/guzzle/src/RingBridge.php',
+    'GuzzleHttp\\Ring\\Client\\ClientUtils' => $vendorDir . '/guzzlehttp/ringphp/src/Client/ClientUtils.php',
+    'GuzzleHttp\\Ring\\Client\\CurlFactory' => $vendorDir . '/guzzlehttp/ringphp/src/Client/CurlFactory.php',
+    'GuzzleHttp\\Ring\\Client\\CurlHandler' => $vendorDir . '/guzzlehttp/ringphp/src/Client/CurlHandler.php',
+    'GuzzleHttp\\Ring\\Client\\CurlMultiHandler' => $vendorDir . '/guzzlehttp/ringphp/src/Client/CurlMultiHandler.php',
+    'GuzzleHttp\\Ring\\Client\\Middleware' => $vendorDir . '/guzzlehttp/ringphp/src/Client/Middleware.php',
+    'GuzzleHttp\\Ring\\Client\\MockHandler' => $vendorDir . '/guzzlehttp/ringphp/src/Client/MockHandler.php',
+    'GuzzleHttp\\Ring\\Client\\StreamHandler' => $vendorDir . '/guzzlehttp/ringphp/src/Client/StreamHandler.php',
+    'GuzzleHttp\\Ring\\Core' => $vendorDir . '/guzzlehttp/ringphp/src/Core.php',
+    'GuzzleHttp\\Ring\\Exception\\CancelledException' => $vendorDir . '/guzzlehttp/ringphp/src/Exception/CancelledException.php',
+    'GuzzleHttp\\Ring\\Exception\\CancelledFutureAccessException' => $vendorDir . '/guzzlehttp/ringphp/src/Exception/CancelledFutureAccessException.php',
+    'GuzzleHttp\\Ring\\Exception\\ConnectException' => $vendorDir . '/guzzlehttp/ringphp/src/Exception/ConnectException.php',
+    'GuzzleHttp\\Ring\\Exception\\RingException' => $vendorDir . '/guzzlehttp/ringphp/src/Exception/RingException.php',
+    'GuzzleHttp\\Ring\\Future\\BaseFutureTrait' => $vendorDir . '/guzzlehttp/ringphp/src/Future/BaseFutureTrait.php',
+    'GuzzleHttp\\Ring\\Future\\CompletedFutureArray' => $vendorDir . '/guzzlehttp/ringphp/src/Future/CompletedFutureArray.php',
+    'GuzzleHttp\\Ring\\Future\\CompletedFutureValue' => $vendorDir . '/guzzlehttp/ringphp/src/Future/CompletedFutureValue.php',
+    'GuzzleHttp\\Ring\\Future\\FutureArray' => $vendorDir . '/guzzlehttp/ringphp/src/Future/FutureArray.php',
+    'GuzzleHttp\\Ring\\Future\\FutureArrayInterface' => $vendorDir . '/guzzlehttp/ringphp/src/Future/FutureArrayInterface.php',
+    'GuzzleHttp\\Ring\\Future\\FutureInterface' => $vendorDir . '/guzzlehttp/ringphp/src/Future/FutureInterface.php',
+    'GuzzleHttp\\Ring\\Future\\FutureValue' => $vendorDir . '/guzzlehttp/ringphp/src/Future/FutureValue.php',
+    'GuzzleHttp\\Ring\\Future\\MagicFutureTrait' => $vendorDir . '/guzzlehttp/ringphp/src/Future/MagicFutureTrait.php',
+    'GuzzleHttp\\Stream\\AppendStream' => $vendorDir . '/guzzlehttp/streams/src/AppendStream.php',
+    'GuzzleHttp\\Stream\\AsyncReadStream' => $vendorDir . '/guzzlehttp/streams/src/AsyncReadStream.php',
+    'GuzzleHttp\\Stream\\BufferStream' => $vendorDir . '/guzzlehttp/streams/src/BufferStream.php',
+    'GuzzleHttp\\Stream\\CachingStream' => $vendorDir . '/guzzlehttp/streams/src/CachingStream.php',
+    'GuzzleHttp\\Stream\\DroppingStream' => $vendorDir . '/guzzlehttp/streams/src/DroppingStream.php',
+    'GuzzleHttp\\Stream\\Exception\\CannotAttachException' => $vendorDir . '/guzzlehttp/streams/src/Exception/CannotAttachException.php',
+    'GuzzleHttp\\Stream\\Exception\\SeekException' => $vendorDir . '/guzzlehttp/streams/src/Exception/SeekException.php',
+    'GuzzleHttp\\Stream\\FnStream' => $vendorDir . '/guzzlehttp/streams/src/FnStream.php',
+    'GuzzleHttp\\Stream\\GuzzleStreamWrapper' => $vendorDir . '/guzzlehttp/streams/src/GuzzleStreamWrapper.php',
+    'GuzzleHttp\\Stream\\InflateStream' => $vendorDir . '/guzzlehttp/streams/src/InflateStream.php',
+    'GuzzleHttp\\Stream\\LazyOpenStream' => $vendorDir . '/guzzlehttp/streams/src/LazyOpenStream.php',
+    'GuzzleHttp\\Stream\\LimitStream' => $vendorDir . '/guzzlehttp/streams/src/LimitStream.php',
+    'GuzzleHttp\\Stream\\MetadataStreamInterface' => $vendorDir . '/guzzlehttp/streams/src/MetadataStreamInterface.php',
+    'GuzzleHttp\\Stream\\NoSeekStream' => $vendorDir . '/guzzlehttp/streams/src/NoSeekStream.php',
+    'GuzzleHttp\\Stream\\NullStream' => $vendorDir . '/guzzlehttp/streams/src/NullStream.php',
+    'GuzzleHttp\\Stream\\PumpStream' => $vendorDir . '/guzzlehttp/streams/src/PumpStream.php',
+    'GuzzleHttp\\Stream\\Stream' => $vendorDir . '/guzzlehttp/streams/src/Stream.php',
+    'GuzzleHttp\\Stream\\StreamDecoratorTrait' => $vendorDir . '/guzzlehttp/streams/src/StreamDecoratorTrait.php',
+    'GuzzleHttp\\Stream\\StreamInterface' => $vendorDir . '/guzzlehttp/streams/src/StreamInterface.php',
+    'GuzzleHttp\\Stream\\Utils' => $vendorDir . '/guzzlehttp/streams/src/Utils.php',
+    'GuzzleHttp\\Subscriber\\Cookie' => $vendorDir . '/guzzlehttp/guzzle/src/Subscriber/Cookie.php',
+    'GuzzleHttp\\Subscriber\\History' => $vendorDir . '/guzzlehttp/guzzle/src/Subscriber/History.php',
+    'GuzzleHttp\\Subscriber\\HttpError' => $vendorDir . '/guzzlehttp/guzzle/src/Subscriber/HttpError.php',
+    'GuzzleHttp\\Subscriber\\Mock' => $vendorDir . '/guzzlehttp/guzzle/src/Subscriber/Mock.php',
+    'GuzzleHttp\\Subscriber\\Prepare' => $vendorDir . '/guzzlehttp/guzzle/src/Subscriber/Prepare.php',
+    'GuzzleHttp\\Subscriber\\Redirect' => $vendorDir . '/guzzlehttp/guzzle/src/Subscriber/Redirect.php',
+    'GuzzleHttp\\ToArrayInterface' => $vendorDir . '/guzzlehttp/guzzle/src/ToArrayInterface.php',
+    'GuzzleHttp\\Transaction' => $vendorDir . '/guzzlehttp/guzzle/src/Transaction.php',
+    'GuzzleHttp\\UriTemplate' => $vendorDir . '/guzzlehttp/guzzle/src/UriTemplate.php',
+    'GuzzleHttp\\Url' => $vendorDir . '/guzzlehttp/guzzle/src/Url.php',
+    'GuzzleHttp\\Utils' => $vendorDir . '/guzzlehttp/guzzle/src/Utils.php',
+    'Normalizer' => $vendorDir . '/patchwork/utf8/src/Normalizer.php',
     'OAuth\\Common\\AutoLoader' => $vendorDir . '/lusitanian/oauth/src/OAuth/Common/AutoLoader.php',
     'OAuth\\Common\\Consumer\\Credentials' => $vendorDir . '/lusitanian/oauth/src/OAuth/Common/Consumer/Credentials.php',
     'OAuth\\Common\\Consumer\\CredentialsInterface' => $vendorDir . '/lusitanian/oauth/src/OAuth/Common/Consumer/CredentialsInterface.php',
@@ -21,6 +147,7 @@ return array(
     'OAuth\\Common\\Http\\Uri\\UriInterface' => $vendorDir . '/lusitanian/oauth/src/OAuth/Common/Http/Uri/UriInterface.php',
     'OAuth\\Common\\Service\\AbstractService' => $vendorDir . '/lusitanian/oauth/src/OAuth/Common/Service/AbstractService.php',
     'OAuth\\Common\\Service\\ServiceInterface' => $vendorDir . '/lusitanian/oauth/src/OAuth/Common/Service/ServiceInterface.php',
+    'OAuth\\Common\\Storage\\Exception\\AuthorizationStateNotFoundException' => $vendorDir . '/lusitanian/oauth/src/OAuth/Common/Storage/Exception/AuthorizationStateNotFoundException.php',
     'OAuth\\Common\\Storage\\Exception\\StorageException' => $vendorDir . '/lusitanian/oauth/src/OAuth/Common/Storage/Exception/StorageException.php',
     'OAuth\\Common\\Storage\\Exception\\TokenNotFoundException' => $vendorDir . '/lusitanian/oauth/src/OAuth/Common/Storage/Exception/TokenNotFoundException.php',
     'OAuth\\Common\\Storage\\Memory' => $vendorDir . '/lusitanian/oauth/src/OAuth/Common/Storage/Memory.php',
@@ -35,10 +162,16 @@ return array(
     'OAuth\\OAuth1\\Service\\BitBucket' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth1/Service/BitBucket.php',
     'OAuth\\OAuth1\\Service\\Etsy' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth1/Service/Etsy.php',
     'OAuth\\OAuth1\\Service\\FitBit' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth1/Service/FitBit.php',
+    'OAuth\\OAuth1\\Service\\FiveHundredPx' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth1/Service/FiveHundredPx.php',
     'OAuth\\OAuth1\\Service\\Flickr' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth1/Service/Flickr.php',
+    'OAuth\\OAuth1\\Service\\QuickBooks' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth1/Service/QuickBooks.php',
+    'OAuth\\OAuth1\\Service\\Redmine' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth1/Service/Redmine.php',
+    'OAuth\\OAuth1\\Service\\ScoopIt' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth1/Service/ScoopIt.php',
     'OAuth\\OAuth1\\Service\\ServiceInterface' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth1/Service/ServiceInterface.php',
     'OAuth\\OAuth1\\Service\\Tumblr' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth1/Service/Tumblr.php',
     'OAuth\\OAuth1\\Service\\Twitter' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth1/Service/Twitter.php',
+    'OAuth\\OAuth1\\Service\\Xing' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth1/Service/Xing.php',
+    'OAuth\\OAuth1\\Service\\Yahoo' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth1/Service/Yahoo.php',
     'OAuth\\OAuth1\\Signature\\Exception\\UnsupportedHashAlgorithmException' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth1/Signature/Exception/UnsupportedHashAlgorithmException.php',
     'OAuth\\OAuth1\\Signature\\Signature' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth1/Signature/Signature.php',
     'OAuth\\OAuth1\\Signature\\SignatureInterface' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth1/Signature/SignatureInterface.php',
@@ -47,25 +180,48 @@ return array(
     'OAuth\\OAuth2\\Service\\AbstractService' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/AbstractService.php',
     'OAuth\\OAuth2\\Service\\Amazon' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Amazon.php',
     'OAuth\\OAuth2\\Service\\Bitly' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Bitly.php',
+    'OAuth\\OAuth2\\Service\\Bitrix24' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Bitrix24.php',
     'OAuth\\OAuth2\\Service\\Box' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Box.php',
+    'OAuth\\OAuth2\\Service\\Buffer' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Buffer.php',
     'OAuth\\OAuth2\\Service\\Dailymotion' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Dailymotion.php',
+    'OAuth\\OAuth2\\Service\\Deezer' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Deezer.php',
+    'OAuth\\OAuth2\\Service\\Delicious' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Delicious.php',
+    'OAuth\\OAuth2\\Service\\DeviantArt' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/DeviantArt.php',
     'OAuth\\OAuth2\\Service\\Dropbox' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Dropbox.php',
+    'OAuth\\OAuth2\\Service\\EveOnline' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/EveOnline.php',
+    'OAuth\\OAuth2\\Service\\Exception\\InvalidAccessTypeException' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidAccessTypeException.php',
+    'OAuth\\OAuth2\\Service\\Exception\\InvalidAuthorizationStateException' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidAuthorizationStateException.php',
     'OAuth\\OAuth2\\Service\\Exception\\InvalidScopeException' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidScopeException.php',
     'OAuth\\OAuth2\\Service\\Exception\\MissingRefreshTokenException' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/MissingRefreshTokenException.php',
     'OAuth\\OAuth2\\Service\\Facebook' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Facebook.php',
     'OAuth\\OAuth2\\Service\\Foursquare' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Foursquare.php',
     'OAuth\\OAuth2\\Service\\GitHub' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/GitHub.php',
     'OAuth\\OAuth2\\Service\\Google' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Google.php',
+    'OAuth\\OAuth2\\Service\\Harvest' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Harvest.php',
     'OAuth\\OAuth2\\Service\\Heroku' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Heroku.php',
+    'OAuth\\OAuth2\\Service\\Hubic' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Hubic.php',
     'OAuth\\OAuth2\\Service\\Instagram' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Instagram.php',
+    'OAuth\\OAuth2\\Service\\JawboneUP' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/JawboneUP.php',
     'OAuth\\OAuth2\\Service\\Linkedin' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Linkedin.php',
+    'OAuth\\OAuth2\\Service\\Mailchimp' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Mailchimp.php',
     'OAuth\\OAuth2\\Service\\Microsoft' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Microsoft.php',
+    'OAuth\\OAuth2\\Service\\Nest' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Nest.php',
+    'OAuth\\OAuth2\\Service\\Netatmo' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Netatmo.php',
+    'OAuth\\OAuth2\\Service\\ParrotFlowerPower' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/ParrotFlowerPower.php',
     'OAuth\\OAuth2\\Service\\Paypal' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Paypal.php',
+    'OAuth\\OAuth2\\Service\\Pinterest' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Pinterest.php',
+    'OAuth\\OAuth2\\Service\\Pocket' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Pocket.php',
     'OAuth\\OAuth2\\Service\\Reddit' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Reddit.php',
     'OAuth\\OAuth2\\Service\\RunKeeper' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/RunKeeper.php',
+    'OAuth\\OAuth2\\Service\\Salesforce' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Salesforce.php',
     'OAuth\\OAuth2\\Service\\ServiceInterface' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/ServiceInterface.php',
     'OAuth\\OAuth2\\Service\\SoundCloud' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/SoundCloud.php',
+    'OAuth\\OAuth2\\Service\\Spotify' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Spotify.php',
+    'OAuth\\OAuth2\\Service\\Strava' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Strava.php',
+    'OAuth\\OAuth2\\Service\\Ustream' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Ustream.php',
+    'OAuth\\OAuth2\\Service\\Vimeo' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Vimeo.php',
     'OAuth\\OAuth2\\Service\\Vkontakte' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Vkontakte.php',
+    'OAuth\\OAuth2\\Service\\Yahoo' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Yahoo.php',
     'OAuth\\OAuth2\\Service\\Yammer' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Service/Yammer.php',
     'OAuth\\OAuth2\\Token\\StdOAuth2Token' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Token/StdOAuth2Token.php',
     'OAuth\\OAuth2\\Token\\TokenInterface' => $vendorDir . '/lusitanian/oauth/src/OAuth/OAuth2/Token/TokenInterface.php',
@@ -76,6 +232,148 @@ return array(
     'OAuth\\Unit\\Common\\Storage\\StorageTest' => $vendorDir . '/lusitanian/oauth/tests/Unit/Common/Storage/StorageTest.php',
     'OAuth\\Unit\\Common\\Storage\\SymfonySessionTest' => $vendorDir . '/lusitanian/oauth/tests/Unit/Common/Storage/SymfonySessionTest.php',
     'OAuth\\Unit\\ServiceFactoryTest' => $vendorDir . '/lusitanian/oauth/tests/Unit/ServiceFactoryTest.php',
+    'Patchwork\\PHP\\Shim\\Iconv' => $vendorDir . '/patchwork/utf8/src/Patchwork/PHP/Shim/Iconv.php',
+    'Patchwork\\PHP\\Shim\\Intl' => $vendorDir . '/patchwork/utf8/src/Patchwork/PHP/Shim/Intl.php',
+    'Patchwork\\PHP\\Shim\\Mbstring' => $vendorDir . '/patchwork/utf8/src/Patchwork/PHP/Shim/Mbstring.php',
+    'Patchwork\\PHP\\Shim\\Normalizer' => $vendorDir . '/patchwork/utf8/src/Patchwork/PHP/Shim/Normalizer.php',
+    'Patchwork\\PHP\\Shim\\Xml' => $vendorDir . '/patchwork/utf8/src/Patchwork/PHP/Shim/Xml.php',
+    'Patchwork\\TurkishUtf8' => $vendorDir . '/patchwork/utf8/src/Patchwork/TurkishUtf8.php',
+    'Patchwork\\Utf8' => $vendorDir . '/patchwork/utf8/src/Patchwork/Utf8.php',
+    'Patchwork\\Utf8\\BestFit' => $vendorDir . '/patchwork/utf8/src/Patchwork/Utf8/BestFit.php',
+    'Patchwork\\Utf8\\Bootup' => $vendorDir . '/patchwork/utf8/src/Patchwork/Utf8/Bootup.php',
+    'Patchwork\\Utf8\\WindowsStreamWrapper' => $vendorDir . '/patchwork/utf8/src/Patchwork/Utf8/WindowsStreamWrapper.php',
+    'ProxyManager\\Autoloader\\Autoloader' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Autoloader/Autoloader.php',
+    'ProxyManager\\Autoloader\\AutoloaderInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Autoloader/AutoloaderInterface.php',
+    'ProxyManager\\Configuration' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Configuration.php',
+    'ProxyManager\\Exception\\DisabledMethodException' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Exception/DisabledMethodException.php',
+    'ProxyManager\\Exception\\ExceptionInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Exception/ExceptionInterface.php',
+    'ProxyManager\\Exception\\FileNotWritableException' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Exception/FileNotWritableException.php',
+    'ProxyManager\\Exception\\InvalidProxiedClassException' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Exception/InvalidProxiedClassException.php',
+    'ProxyManager\\Exception\\InvalidProxyDirectoryException' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Exception/InvalidProxyDirectoryException.php',
+    'ProxyManager\\Exception\\UnsupportedProxiedClassException' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Exception/UnsupportedProxiedClassException.php',
+    'ProxyManager\\Factory\\AbstractBaseFactory' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Factory/AbstractBaseFactory.php',
+    'ProxyManager\\Factory\\AbstractLazyFactory' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Factory/AbstractLazyFactory.php',
+    'ProxyManager\\Factory\\AccessInterceptorScopeLocalizerFactory' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Factory/AccessInterceptorScopeLocalizerFactory.php',
+    'ProxyManager\\Factory\\AccessInterceptorValueHolderFactory' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Factory/AccessInterceptorValueHolderFactory.php',
+    'ProxyManager\\Factory\\LazyLoadingGhostFactory' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Factory/LazyLoadingGhostFactory.php',
+    'ProxyManager\\Factory\\LazyLoadingValueHolderFactory' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Factory/LazyLoadingValueHolderFactory.php',
+    'ProxyManager\\Factory\\NullObjectFactory' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Factory/NullObjectFactory.php',
+    'ProxyManager\\Factory\\RemoteObjectFactory' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Factory/RemoteObjectFactory.php',
+    'ProxyManager\\Factory\\RemoteObject\\AdapterInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Factory/RemoteObject/AdapterInterface.php',
+    'ProxyManager\\Factory\\RemoteObject\\Adapter\\BaseAdapter' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Factory/RemoteObject/Adapter/BaseAdapter.php',
+    'ProxyManager\\Factory\\RemoteObject\\Adapter\\JsonRpc' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Factory/RemoteObject/Adapter/JsonRpc.php',
+    'ProxyManager\\Factory\\RemoteObject\\Adapter\\Soap' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Factory/RemoteObject/Adapter/Soap.php',
+    'ProxyManager\\Factory\\RemoteObject\\Adapter\\XmlRpc' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Factory/RemoteObject/Adapter/XmlRpc.php',
+    'ProxyManager\\FileLocator\\FileLocator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/FileLocator/FileLocator.php',
+    'ProxyManager\\FileLocator\\FileLocatorInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/FileLocator/FileLocatorInterface.php',
+    'ProxyManager\\GeneratorStrategy\\BaseGeneratorStrategy' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/GeneratorStrategy/BaseGeneratorStrategy.php',
+    'ProxyManager\\GeneratorStrategy\\EvaluatingGeneratorStrategy' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/GeneratorStrategy/EvaluatingGeneratorStrategy.php',
+    'ProxyManager\\GeneratorStrategy\\FileWriterGeneratorStrategy' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/GeneratorStrategy/FileWriterGeneratorStrategy.php',
+    'ProxyManager\\GeneratorStrategy\\GeneratorStrategyInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/GeneratorStrategy/GeneratorStrategyInterface.php',
+    'ProxyManager\\Generator\\ClassGenerator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Generator/ClassGenerator.php',
+    'ProxyManager\\Generator\\MagicMethodGenerator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Generator/MagicMethodGenerator.php',
+    'ProxyManager\\Generator\\MethodGenerator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Generator/MethodGenerator.php',
+    'ProxyManager\\Generator\\ParameterGenerator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Generator/ParameterGenerator.php',
+    'ProxyManager\\Generator\\Util\\ClassGeneratorUtils' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Generator/Util/ClassGeneratorUtils.php',
+    'ProxyManager\\Generator\\Util\\UniqueIdentifierGenerator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Generator/Util/UniqueIdentifierGenerator.php',
+    'ProxyManager\\Inflector\\ClassNameInflector' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Inflector/ClassNameInflector.php',
+    'ProxyManager\\Inflector\\ClassNameInflectorInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Inflector/ClassNameInflectorInterface.php',
+    'ProxyManager\\Inflector\\Util\\ParameterEncoder' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Inflector/Util/ParameterEncoder.php',
+    'ProxyManager\\Inflector\\Util\\ParameterHasher' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Inflector/Util/ParameterHasher.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorScopeLocalizerGenerator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizerGenerator.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorScopeLocalizer\\MethodGenerator\\Constructor' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/Constructor.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorScopeLocalizer\\MethodGenerator\\InterceptedMethod' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/InterceptedMethod.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorScopeLocalizer\\MethodGenerator\\MagicClone' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicClone.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorScopeLocalizer\\MethodGenerator\\MagicGet' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicGet.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorScopeLocalizer\\MethodGenerator\\MagicIsset' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicIsset.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorScopeLocalizer\\MethodGenerator\\MagicSet' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicSet.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorScopeLocalizer\\MethodGenerator\\MagicSleep' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicSleep.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorScopeLocalizer\\MethodGenerator\\MagicUnset' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicUnset.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorScopeLocalizer\\MethodGenerator\\Util\\InterceptorGenerator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/Util/InterceptorGenerator.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorValueHolderGenerator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolderGenerator.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorValueHolder\\MethodGenerator\\Constructor' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/Constructor.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorValueHolder\\MethodGenerator\\InterceptedMethod' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/InterceptedMethod.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorValueHolder\\MethodGenerator\\MagicClone' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/MagicClone.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorValueHolder\\MethodGenerator\\MagicGet' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/MagicGet.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorValueHolder\\MethodGenerator\\MagicIsset' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/MagicIsset.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorValueHolder\\MethodGenerator\\MagicSet' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/MagicSet.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorValueHolder\\MethodGenerator\\MagicUnset' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/MagicUnset.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptorValueHolder\\MethodGenerator\\Util\\InterceptorGenerator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/Util/InterceptorGenerator.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptor\\MethodGenerator\\MagicWakeup' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptor/MethodGenerator/MagicWakeup.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptor\\MethodGenerator\\SetMethodPrefixInterceptor' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptor/MethodGenerator/SetMethodPrefixInterceptor.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptor\\MethodGenerator\\SetMethodSuffixInterceptor' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptor/MethodGenerator/SetMethodSuffixInterceptor.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptor\\PropertyGenerator\\MethodPrefixInterceptors' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptor/PropertyGenerator/MethodPrefixInterceptors.php',
+    'ProxyManager\\ProxyGenerator\\AccessInterceptor\\PropertyGenerator\\MethodSuffixInterceptors' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptor/PropertyGenerator/MethodSuffixInterceptors.php',
+    'ProxyManager\\ProxyGenerator\\Assertion\\CanProxyAssertion' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/Assertion/CanProxyAssertion.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingGhostGenerator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhostGenerator.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingGhost\\MethodGenerator\\CallInitializer' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/CallInitializer.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingGhost\\MethodGenerator\\GetProxyInitializer' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/GetProxyInitializer.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingGhost\\MethodGenerator\\InitializeProxy' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/InitializeProxy.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingGhost\\MethodGenerator\\IsProxyInitialized' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/IsProxyInitialized.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingGhost\\MethodGenerator\\LazyLoadingMethodInterceptor' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/LazyLoadingMethodInterceptor.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingGhost\\MethodGenerator\\MagicClone' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicClone.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingGhost\\MethodGenerator\\MagicGet' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicGet.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingGhost\\MethodGenerator\\MagicIsset' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicIsset.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingGhost\\MethodGenerator\\MagicSet' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicSet.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingGhost\\MethodGenerator\\MagicSleep' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicSleep.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingGhost\\MethodGenerator\\MagicUnset' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicUnset.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingGhost\\MethodGenerator\\SetProxyInitializer' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/SetProxyInitializer.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingGhost\\PropertyGenerator\\InitializationTracker' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/InitializationTracker.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingGhost\\PropertyGenerator\\InitializerProperty' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/InitializerProperty.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingValueHolderGenerator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolderGenerator.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingValueHolder\\MethodGenerator\\GetProxyInitializer' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/GetProxyInitializer.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingValueHolder\\MethodGenerator\\InitializeProxy' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/InitializeProxy.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingValueHolder\\MethodGenerator\\IsProxyInitialized' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/IsProxyInitialized.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingValueHolder\\MethodGenerator\\LazyLoadingMethodInterceptor' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/LazyLoadingMethodInterceptor.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingValueHolder\\MethodGenerator\\MagicClone' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicClone.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingValueHolder\\MethodGenerator\\MagicGet' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicGet.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingValueHolder\\MethodGenerator\\MagicIsset' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicIsset.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingValueHolder\\MethodGenerator\\MagicSet' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicSet.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingValueHolder\\MethodGenerator\\MagicSleep' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicSleep.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingValueHolder\\MethodGenerator\\MagicUnset' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicUnset.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingValueHolder\\MethodGenerator\\SetProxyInitializer' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/SetProxyInitializer.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingValueHolder\\PropertyGenerator\\InitializerProperty' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/PropertyGenerator/InitializerProperty.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoadingValueHolder\\PropertyGenerator\\ValueHolderProperty' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/PropertyGenerator/ValueHolderProperty.php',
+    'ProxyManager\\ProxyGenerator\\LazyLoading\\MethodGenerator\\Constructor' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoading/MethodGenerator/Constructor.php',
+    'ProxyManager\\ProxyGenerator\\NullObjectGenerator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/NullObjectGenerator.php',
+    'ProxyManager\\ProxyGenerator\\NullObject\\MethodGenerator\\Constructor' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/NullObject/MethodGenerator/Constructor.php',
+    'ProxyManager\\ProxyGenerator\\NullObject\\MethodGenerator\\NullObjectMethodInterceptor' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/NullObject/MethodGenerator/NullObjectMethodInterceptor.php',
+    'ProxyManager\\ProxyGenerator\\PropertyGenerator\\PublicPropertiesDefaults' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/PropertyGenerator/PublicPropertiesDefaults.php',
+    'ProxyManager\\ProxyGenerator\\PropertyGenerator\\PublicPropertiesMap' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/PropertyGenerator/PublicPropertiesMap.php',
+    'ProxyManager\\ProxyGenerator\\ProxyGeneratorInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/ProxyGeneratorInterface.php',
+    'ProxyManager\\ProxyGenerator\\RemoteObjectGenerator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/RemoteObjectGenerator.php',
+    'ProxyManager\\ProxyGenerator\\RemoteObject\\MethodGenerator\\Constructor' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/RemoteObject/MethodGenerator/Constructor.php',
+    'ProxyManager\\ProxyGenerator\\RemoteObject\\MethodGenerator\\MagicGet' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/RemoteObject/MethodGenerator/MagicGet.php',
+    'ProxyManager\\ProxyGenerator\\RemoteObject\\MethodGenerator\\MagicIsset' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/RemoteObject/MethodGenerator/MagicIsset.php',
+    'ProxyManager\\ProxyGenerator\\RemoteObject\\MethodGenerator\\MagicSet' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/RemoteObject/MethodGenerator/MagicSet.php',
+    'ProxyManager\\ProxyGenerator\\RemoteObject\\MethodGenerator\\MagicUnset' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/RemoteObject/MethodGenerator/MagicUnset.php',
+    'ProxyManager\\ProxyGenerator\\RemoteObject\\MethodGenerator\\RemoteObjectMethod' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/RemoteObject/MethodGenerator/RemoteObjectMethod.php',
+    'ProxyManager\\ProxyGenerator\\RemoteObject\\PropertyGenerator\\AdapterProperty' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/RemoteObject/PropertyGenerator/AdapterProperty.php',
+    'ProxyManager\\ProxyGenerator\\Util\\ProxiedMethodsFilter' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/Util/ProxiedMethodsFilter.php',
+    'ProxyManager\\ProxyGenerator\\Util\\PublicScopeSimulator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/Util/PublicScopeSimulator.php',
+    'ProxyManager\\ProxyGenerator\\ValueHolder\\MethodGenerator\\GetWrappedValueHolderValue' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/ValueHolder/MethodGenerator/GetWrappedValueHolderValue.php',
+    'ProxyManager\\ProxyGenerator\\ValueHolder\\MethodGenerator\\MagicSleep' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/ValueHolder/MethodGenerator/MagicSleep.php',
+    'ProxyManager\\Proxy\\AccessInterceptorInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Proxy/AccessInterceptorInterface.php',
+    'ProxyManager\\Proxy\\Exception\\RemoteObjectException' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Proxy/Exception/RemoteObjectException.php',
+    'ProxyManager\\Proxy\\FallbackValueHolderInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Proxy/FallbackValueHolderInterface.php',
+    'ProxyManager\\Proxy\\GhostObjectInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Proxy/GhostObjectInterface.php',
+    'ProxyManager\\Proxy\\LazyLoadingInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Proxy/LazyLoadingInterface.php',
+    'ProxyManager\\Proxy\\NullObjectInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Proxy/NullObjectInterface.php',
+    'ProxyManager\\Proxy\\ProxyInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Proxy/ProxyInterface.php',
+    'ProxyManager\\Proxy\\RemoteObjectInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Proxy/RemoteObjectInterface.php',
+    'ProxyManager\\Proxy\\SmartReferenceInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Proxy/SmartReferenceInterface.php',
+    'ProxyManager\\Proxy\\ValueHolderInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Proxy/ValueHolderInterface.php',
+    'ProxyManager\\Proxy\\VirtualProxyInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Proxy/VirtualProxyInterface.php',
+    'ProxyManager\\Signature\\ClassSignatureGenerator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Signature/ClassSignatureGenerator.php',
+    'ProxyManager\\Signature\\ClassSignatureGeneratorInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Signature/ClassSignatureGeneratorInterface.php',
+    'ProxyManager\\Signature\\Exception\\ExceptionInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Signature/Exception/ExceptionInterface.php',
+    'ProxyManager\\Signature\\Exception\\InvalidSignatureException' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Signature/Exception/InvalidSignatureException.php',
+    'ProxyManager\\Signature\\Exception\\MissingSignatureException' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Signature/Exception/MissingSignatureException.php',
+    'ProxyManager\\Signature\\SignatureChecker' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Signature/SignatureChecker.php',
+    'ProxyManager\\Signature\\SignatureCheckerInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Signature/SignatureCheckerInterface.php',
+    'ProxyManager\\Signature\\SignatureGenerator' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Signature/SignatureGenerator.php',
+    'ProxyManager\\Signature\\SignatureGeneratorInterface' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Signature/SignatureGeneratorInterface.php',
+    'ProxyManager\\Version' => $vendorDir . '/ocramius/proxy-manager/src/ProxyManager/Version.php',
     'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php',
     'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php',
     'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php',
@@ -86,707 +384,614 @@ return array(
     'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php',
     'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
     'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
-    'SessionHandlerInterface' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php',
-    'Symfony\\Component\\Config\\ConfigCache' => $vendorDir . '/symfony/config/Symfony/Component/Config/ConfigCache.php',
-    'Symfony\\Component\\Config\\Definition\\ArrayNode' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/ArrayNode.php',
-    'Symfony\\Component\\Config\\Definition\\BaseNode' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/BaseNode.php',
-    'Symfony\\Component\\Config\\Definition\\BooleanNode' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/BooleanNode.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\ArrayNodeDefinition' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\BooleanNodeDefinition' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/BooleanNodeDefinition.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\EnumNodeDefinition' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/EnumNodeDefinition.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\ExprBuilder' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/ExprBuilder.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\FloatNodeDefinition' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/FloatNodeDefinition.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\IntegerNodeDefinition' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/IntegerNodeDefinition.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\MergeBuilder' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/MergeBuilder.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\NodeBuilder' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/NodeBuilder.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/NodeDefinition.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\NodeParentInterface' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/NodeParentInterface.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\NormalizationBuilder' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/NormalizationBuilder.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\NumericNodeDefinition' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/NumericNodeDefinition.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\ParentNodeDefinitionInterface' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/ParentNodeDefinitionInterface.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\ScalarNodeDefinition' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/ScalarNodeDefinition.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/TreeBuilder.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\ValidationBuilder' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/ValidationBuilder.php',
-    'Symfony\\Component\\Config\\Definition\\Builder\\VariableNodeDefinition' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Builder/VariableNodeDefinition.php',
-    'Symfony\\Component\\Config\\Definition\\ConfigurationInterface' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/ConfigurationInterface.php',
-    'Symfony\\Component\\Config\\Definition\\EnumNode' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/EnumNode.php',
-    'Symfony\\Component\\Config\\Definition\\Exception\\DuplicateKeyException' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Exception/DuplicateKeyException.php',
-    'Symfony\\Component\\Config\\Definition\\Exception\\Exception' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Exception/Exception.php',
-    'Symfony\\Component\\Config\\Definition\\Exception\\ForbiddenOverwriteException' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Exception/ForbiddenOverwriteException.php',
-    'Symfony\\Component\\Config\\Definition\\Exception\\InvalidConfigurationException' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Exception/InvalidConfigurationException.php',
-    'Symfony\\Component\\Config\\Definition\\Exception\\InvalidDefinitionException' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Exception/InvalidDefinitionException.php',
-    'Symfony\\Component\\Config\\Definition\\Exception\\InvalidTypeException' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Exception/InvalidTypeException.php',
-    'Symfony\\Component\\Config\\Definition\\Exception\\UnsetKeyException' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Exception/UnsetKeyException.php',
-    'Symfony\\Component\\Config\\Definition\\FloatNode' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/FloatNode.php',
-    'Symfony\\Component\\Config\\Definition\\IntegerNode' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/IntegerNode.php',
-    'Symfony\\Component\\Config\\Definition\\NodeInterface' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/NodeInterface.php',
-    'Symfony\\Component\\Config\\Definition\\NumericNode' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/NumericNode.php',
-    'Symfony\\Component\\Config\\Definition\\Processor' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/Processor.php',
-    'Symfony\\Component\\Config\\Definition\\PrototypeNodeInterface' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/PrototypeNodeInterface.php',
-    'Symfony\\Component\\Config\\Definition\\PrototypedArrayNode' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/PrototypedArrayNode.php',
-    'Symfony\\Component\\Config\\Definition\\ReferenceDumper' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/ReferenceDumper.php',
-    'Symfony\\Component\\Config\\Definition\\ScalarNode' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/ScalarNode.php',
-    'Symfony\\Component\\Config\\Definition\\VariableNode' => $vendorDir . '/symfony/config/Symfony/Component/Config/Definition/VariableNode.php',
-    'Symfony\\Component\\Config\\Exception\\FileLoaderImportCircularReferenceException' => $vendorDir . '/symfony/config/Symfony/Component/Config/Exception/FileLoaderImportCircularReferenceException.php',
-    'Symfony\\Component\\Config\\Exception\\FileLoaderLoadException' => $vendorDir . '/symfony/config/Symfony/Component/Config/Exception/FileLoaderLoadException.php',
-    'Symfony\\Component\\Config\\FileLocator' => $vendorDir . '/symfony/config/Symfony/Component/Config/FileLocator.php',
-    'Symfony\\Component\\Config\\FileLocatorInterface' => $vendorDir . '/symfony/config/Symfony/Component/Config/FileLocatorInterface.php',
-    'Symfony\\Component\\Config\\Loader\\DelegatingLoader' => $vendorDir . '/symfony/config/Symfony/Component/Config/Loader/DelegatingLoader.php',
-    'Symfony\\Component\\Config\\Loader\\FileLoader' => $vendorDir . '/symfony/config/Symfony/Component/Config/Loader/FileLoader.php',
-    'Symfony\\Component\\Config\\Loader\\Loader' => $vendorDir . '/symfony/config/Symfony/Component/Config/Loader/Loader.php',
-    'Symfony\\Component\\Config\\Loader\\LoaderInterface' => $vendorDir . '/symfony/config/Symfony/Component/Config/Loader/LoaderInterface.php',
-    'Symfony\\Component\\Config\\Loader\\LoaderResolver' => $vendorDir . '/symfony/config/Symfony/Component/Config/Loader/LoaderResolver.php',
-    'Symfony\\Component\\Config\\Loader\\LoaderResolverInterface' => $vendorDir . '/symfony/config/Symfony/Component/Config/Loader/LoaderResolverInterface.php',
-    'Symfony\\Component\\Config\\Resource\\DirectoryResource' => $vendorDir . '/symfony/config/Symfony/Component/Config/Resource/DirectoryResource.php',
-    'Symfony\\Component\\Config\\Resource\\FileResource' => $vendorDir . '/symfony/config/Symfony/Component/Config/Resource/FileResource.php',
-    'Symfony\\Component\\Config\\Resource\\ResourceInterface' => $vendorDir . '/symfony/config/Symfony/Component/Config/Resource/ResourceInterface.php',
-    'Symfony\\Component\\Config\\Tests\\ConfigCacheTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/ConfigCacheTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\ArrayNodeTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/ArrayNodeTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\BooleanNodeTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/BooleanNodeTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\Builder\\ArrayNodeDefinitionTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/Builder/ArrayNodeDefinitionTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\Builder\\BarNodeDefinition' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Fixtures/Builder/BarNodeDefinition.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\Builder\\EnumNodeDefinitionTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/Builder/EnumNodeDefinitionTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\Builder\\ExprBuilderTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/Builder/ExprBuilderTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\Builder\\NodeBuilder' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Fixtures/Builder/NodeBuilder.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\Builder\\NodeBuilderTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/Builder/NodeBuilderTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\Builder\\NumericNodeDefinitionTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/Builder/NumericNodeDefinitionTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\Builder\\SomeNodeDefinition' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/Builder/NodeBuilderTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\Builder\\TreeBuilderTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/Builder/TreeBuilderTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\Builder\\VariableNodeDefinition' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Fixtures/Builder/VariableNodeDefinition.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\EnumNodeTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/EnumNodeTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\FinalizationTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/FinalizationTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\FloatNodeTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/FloatNodeTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\IntegerNodeTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/IntegerNodeTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\MergeTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/MergeTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\NormalizationTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/NormalizationTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\PrototypedArrayNodeTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/PrototypedArrayNodeTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\ReferenceDumperTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/ReferenceDumperTest.php',
-    'Symfony\\Component\\Config\\Tests\\Definition\\ScalarNodeTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Definition/ScalarNodeTest.php',
-    'Symfony\\Component\\Config\\Tests\\FileLocatorTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/FileLocatorTest.php',
-    'Symfony\\Component\\Config\\Tests\\Fixtures\\Configuration\\ExampleConfiguration' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Fixtures/Configuration/ExampleConfiguration.php',
-    'Symfony\\Component\\Config\\Tests\\Loader\\DelegatingLoaderTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Loader/DelegatingLoaderTest.php',
-    'Symfony\\Component\\Config\\Tests\\Loader\\FileLoaderTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Loader/FileLoaderTest.php',
-    'Symfony\\Component\\Config\\Tests\\Loader\\LoaderResolverTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Loader/LoaderResolverTest.php',
-    'Symfony\\Component\\Config\\Tests\\Loader\\LoaderTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Loader/LoaderTest.php',
-    'Symfony\\Component\\Config\\Tests\\Loader\\ProjectLoader1' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Loader/LoaderTest.php',
-    'Symfony\\Component\\Config\\Tests\\Loader\\TestFileLoader' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Loader/FileLoaderTest.php',
-    'Symfony\\Component\\Config\\Tests\\Resource\\DirectoryResourceTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php',
-    'Symfony\\Component\\Config\\Tests\\Resource\\FileResourceTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Resource/FileResourceTest.php',
-    'Symfony\\Component\\Config\\Tests\\Util\\Validator' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Util/XmlUtilsTest.php',
-    'Symfony\\Component\\Config\\Tests\\Util\\XmlUtilsTest' => $vendorDir . '/symfony/config/Symfony/Component/Config/Tests/Util/XmlUtilsTest.php',
-    'Symfony\\Component\\Config\\Util\\XmlUtils' => $vendorDir . '/symfony/config/Symfony/Component/Config/Util/XmlUtils.php',
-    'Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Symfony/Component/Console/Application.php',
-    'Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Symfony/Component/Console/Command/Command.php',
-    'Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Symfony/Component/Console/Command/HelpCommand.php',
-    'Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Symfony/Component/Console/Command/ListCommand.php',
-    'Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/Symfony/Component/Console/ConsoleEvents.php',
-    'Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Symfony/Component/Console/Descriptor/ApplicationDescription.php',
-    'Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Symfony/Component/Console/Descriptor/Descriptor.php',
-    'Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Symfony/Component/Console/Descriptor/DescriptorInterface.php',
-    'Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Symfony/Component/Console/Descriptor/JsonDescriptor.php',
-    'Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Symfony/Component/Console/Descriptor/MarkdownDescriptor.php',
-    'Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Symfony/Component/Console/Descriptor/TextDescriptor.php',
-    'Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Symfony/Component/Console/Descriptor/XmlDescriptor.php',
-    'Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => $vendorDir . '/symfony/console/Symfony/Component/Console/Event/ConsoleCommandEvent.php',
-    'Symfony\\Component\\Console\\Event\\ConsoleEvent' => $vendorDir . '/symfony/console/Symfony/Component/Console/Event/ConsoleEvent.php',
-    'Symfony\\Component\\Console\\Event\\ConsoleExceptionEvent' => $vendorDir . '/symfony/console/Symfony/Component/Console/Event/ConsoleExceptionEvent.php',
-    'Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => $vendorDir . '/symfony/console/Symfony/Component/Console/Event/ConsoleTerminateEvent.php',
-    'Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Symfony/Component/Console/Formatter/OutputFormatter.php',
-    'Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterInterface.php',
-    'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyle.php',
-    'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php',
-    'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyleStack.php',
-    'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/DescriptorHelper.php',
-    'Symfony\\Component\\Console\\Helper\\DialogHelper' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/DialogHelper.php',
-    'Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/FormatterHelper.php',
-    'Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/Helper.php',
-    'Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/HelperInterface.php',
-    'Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/HelperSet.php',
-    'Symfony\\Component\\Console\\Helper\\ProgressHelper' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/ProgressHelper.php',
-    'Symfony\\Component\\Console\\Helper\\TableHelper' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/TableHelper.php',
-    'Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/ArgvInput.php',
-    'Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/ArrayInput.php',
-    'Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/Input.php',
-    'Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/InputArgument.php',
-    'Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/InputDefinition.php',
-    'Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/InputInterface.php',
-    'Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/InputOption.php',
-    'Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/StringInput.php',
-    'Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Symfony/Component/Console/Output/ConsoleOutput.php',
-    'Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Symfony/Component/Console/Output/ConsoleOutputInterface.php',
-    'Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Symfony/Component/Console/Output/NullOutput.php',
-    'Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Symfony/Component/Console/Output/Output.php',
-    'Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Symfony/Component/Console/Output/OutputInterface.php',
-    'Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Symfony/Component/Console/Output/StreamOutput.php',
-    'Symfony\\Component\\Console\\Shell' => $vendorDir . '/symfony/console/Symfony/Component/Console/Shell.php',
-    'Symfony\\Component\\Console\\Tester\\ApplicationTester' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tester/ApplicationTester.php',
-    'Symfony\\Component\\Console\\Tester\\CommandTester' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tester/CommandTester.php',
-    'Symfony\\Component\\Console\\Tests\\ApplicationTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/ApplicationTest.php',
-    'Symfony\\Component\\Console\\Tests\\Command\\CommandTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Command/CommandTest.php',
-    'Symfony\\Component\\Console\\Tests\\Command\\HelpCommandTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Command/HelpCommandTest.php',
-    'Symfony\\Component\\Console\\Tests\\Command\\ListCommandTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Command/ListCommandTest.php',
-    'Symfony\\Component\\Console\\Tests\\CustomApplication' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/ApplicationTest.php',
-    'Symfony\\Component\\Console\\Tests\\Descriptor\\AbstractDescriptorTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Descriptor/AbstractDescriptorTest.php',
-    'Symfony\\Component\\Console\\Tests\\Descriptor\\JsonDescriptorTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Descriptor/JsonDescriptorTest.php',
-    'Symfony\\Component\\Console\\Tests\\Descriptor\\MarkdownDescriptorTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Descriptor/MarkdownDescriptorTest.php',
-    'Symfony\\Component\\Console\\Tests\\Descriptor\\ObjectsProvider' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Descriptor/ObjectsProvider.php',
-    'Symfony\\Component\\Console\\Tests\\Descriptor\\TextDescriptorTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Descriptor/TextDescriptorTest.php',
-    'Symfony\\Component\\Console\\Tests\\Descriptor\\XmlDescriptorTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Descriptor/XmlDescriptorTest.php',
-    'Symfony\\Component\\Console\\Tests\\Fixtures\\DescriptorApplication1' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Fixtures/DescriptorApplication1.php',
-    'Symfony\\Component\\Console\\Tests\\Fixtures\\DescriptorApplication2' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Fixtures/DescriptorApplication2.php',
-    'Symfony\\Component\\Console\\Tests\\Fixtures\\DescriptorCommand1' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Fixtures/DescriptorCommand1.php',
-    'Symfony\\Component\\Console\\Tests\\Fixtures\\DescriptorCommand2' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Fixtures/DescriptorCommand2.php',
-    'Symfony\\Component\\Console\\Tests\\Formatter\\OutputFormatterStyleStackTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleStackTest.php',
-    'Symfony\\Component\\Console\\Tests\\Formatter\\OutputFormatterStyleTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleTest.php',
-    'Symfony\\Component\\Console\\Tests\\Formatter\\OutputFormatterTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php',
-    'Symfony\\Component\\Console\\Tests\\Formatter\\TableCell' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php',
-    'Symfony\\Component\\Console\\Tests\\Helper\\DialogHelperTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Helper/DialogHelperTest.php',
-    'Symfony\\Component\\Console\\Tests\\Helper\\FormatterHelperTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Helper/FormatterHelperTest.php',
-    'Symfony\\Component\\Console\\Tests\\Helper\\HelperSetTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Helper/HelperSetTest.php',
-    'Symfony\\Component\\Console\\Tests\\Helper\\ProgressHelperTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Helper/ProgressHelperTest.php',
-    'Symfony\\Component\\Console\\Tests\\Helper\\TableHelperTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Helper/TableHelperTest.php',
-    'Symfony\\Component\\Console\\Tests\\Input\\ArgvInputTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Input/ArgvInputTest.php',
-    'Symfony\\Component\\Console\\Tests\\Input\\ArrayInputTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Input/ArrayInputTest.php',
-    'Symfony\\Component\\Console\\Tests\\Input\\InputArgumentTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Input/InputArgumentTest.php',
-    'Symfony\\Component\\Console\\Tests\\Input\\InputDefinitionTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Input/InputDefinitionTest.php',
-    'Symfony\\Component\\Console\\Tests\\Input\\InputOptionTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Input/InputOptionTest.php',
-    'Symfony\\Component\\Console\\Tests\\Input\\InputTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Input/InputTest.php',
-    'Symfony\\Component\\Console\\Tests\\Input\\StringInputTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Input/StringInputTest.php',
-    'Symfony\\Component\\Console\\Tests\\Output\\ConsoleOutputTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Output/ConsoleOutputTest.php',
-    'Symfony\\Component\\Console\\Tests\\Output\\NullOutputTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Output/NullOutputTest.php',
-    'Symfony\\Component\\Console\\Tests\\Output\\OutputTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Output/OutputTest.php',
-    'Symfony\\Component\\Console\\Tests\\Output\\StreamOutputTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Output/StreamOutputTest.php',
-    'Symfony\\Component\\Console\\Tests\\Output\\TestOutput' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Output/OutputTest.php',
-    'Symfony\\Component\\Console\\Tests\\Tester\\ApplicationTesterTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Tester/ApplicationTesterTest.php',
-    'Symfony\\Component\\Console\\Tests\\Tester\\CommandTesterTest' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tests/Tester/CommandTesterTest.php',
-    'Symfony\\Component\\Debug\\Debug' => $vendorDir . '/symfony/debug/Symfony/Component/Debug/Debug.php',
-    'Symfony\\Component\\Debug\\ErrorHandler' => $vendorDir . '/symfony/debug/Symfony/Component/Debug/ErrorHandler.php',
-    'Symfony\\Component\\Debug\\ExceptionHandler' => $vendorDir . '/symfony/debug/Symfony/Component/Debug/ExceptionHandler.php',
-    'Symfony\\Component\\Debug\\Exception\\ContextErrorException' => $vendorDir . '/symfony/debug/Symfony/Component/Debug/Exception/ContextErrorException.php',
-    'Symfony\\Component\\Debug\\Exception\\DummyException' => $vendorDir . '/symfony/debug/Symfony/Component/Debug/Exception/DummyException.php',
-    'Symfony\\Component\\Debug\\Exception\\FatalErrorException' => $vendorDir . '/symfony/debug/Symfony/Component/Debug/Exception/FatalErrorException.php',
-    'Symfony\\Component\\Debug\\Exception\\FlattenException' => $vendorDir . '/symfony/debug/Symfony/Component/Debug/Exception/FlattenException.php',
-    'Symfony\\Component\\Debug\\Tests\\ErrorHandlerTest' => $vendorDir . '/symfony/debug/Symfony/Component/Debug/Tests/ErrorHandlerTest.php',
-    'Symfony\\Component\\Debug\\Tests\\ExceptionHandlerTest' => $vendorDir . '/symfony/debug/Symfony/Component/Debug/Tests/ExceptionHandlerTest.php',
-    'Symfony\\Component\\Debug\\Tests\\Exception\\FlattenExceptionTest' => $vendorDir . '/symfony/debug/Symfony/Component/Debug/Tests/Exception/FlattenExceptionTest.php',
-    'Symfony\\Component\\DependencyInjection\\Alias' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Alias.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\AnalyzeServiceReferencesPass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\CheckCircularReferencesPass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\CheckDefinitionValidityPass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\CheckExceptionOnInvalidReferenceBehaviorPass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\CheckReferenceValidityPass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\Compiler' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/Compiler.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CompilerPassInterface.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\InlineServiceDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\LoggingFormatter' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/LoggingFormatter.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\MergeExtensionConfigurationPass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\PassConfig' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/PassConfig.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\RemoveAbstractDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RemoveAbstractDefinitionsPass.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\RemovePrivateAliasesPass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RemovePrivateAliasesPass.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\RemoveUnusedDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\RepeatablePassInterface' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RepeatablePassInterface.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\RepeatedPass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RepeatedPass.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\ReplaceAliasByActualDefinitionPass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ReplaceAliasByActualDefinitionPass.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveDefinitionTemplatesPass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveInvalidReferencesPass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveParameterPlaceHoldersPass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveReferencesToAliasesPass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveReferencesToAliasesPass.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraph' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraph.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraphEdge' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphEdge.php',
-    'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraphNode' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphNode.php',
-    'Symfony\\Component\\DependencyInjection\\Container' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Container.php',
-    'Symfony\\Component\\DependencyInjection\\ContainerAware' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerAware.php',
-    'Symfony\\Component\\DependencyInjection\\ContainerAwareInterface' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerAwareInterface.php',
-    'Symfony\\Component\\DependencyInjection\\ContainerBuilder' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerBuilder.php',
-    'Symfony\\Component\\DependencyInjection\\ContainerInterface' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerInterface.php',
-    'Symfony\\Component\\DependencyInjection\\Definition' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Definition.php',
-    'Symfony\\Component\\DependencyInjection\\DefinitionDecorator' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/DefinitionDecorator.php',
-    'Symfony\\Component\\DependencyInjection\\Dumper\\Dumper' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/Dumper.php',
-    'Symfony\\Component\\DependencyInjection\\Dumper\\DumperInterface' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/DumperInterface.php',
-    'Symfony\\Component\\DependencyInjection\\Dumper\\GraphvizDumper' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php',
-    'Symfony\\Component\\DependencyInjection\\Dumper\\PhpDumper' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php',
-    'Symfony\\Component\\DependencyInjection\\Dumper\\XmlDumper' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php',
-    'Symfony\\Component\\DependencyInjection\\Dumper\\YamlDumper' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php',
-    'Symfony\\Component\\DependencyInjection\\Exception\\BadMethodCallException' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Exception/BadMethodCallException.php',
-    'Symfony\\Component\\DependencyInjection\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Exception/ExceptionInterface.php',
-    'Symfony\\Component\\DependencyInjection\\Exception\\InactiveScopeException' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Exception/InactiveScopeException.php',
-    'Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Exception/InvalidArgumentException.php',
-    'Symfony\\Component\\DependencyInjection\\Exception\\LogicException' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Exception/LogicException.php',
-    'Symfony\\Component\\DependencyInjection\\Exception\\OutOfBoundsException' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Exception/OutOfBoundsException.php',
-    'Symfony\\Component\\DependencyInjection\\Exception\\ParameterCircularReferenceException' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Exception/ParameterCircularReferenceException.php',
-    'Symfony\\Component\\DependencyInjection\\Exception\\ParameterNotFoundException' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Exception/ParameterNotFoundException.php',
-    'Symfony\\Component\\DependencyInjection\\Exception\\RuntimeException' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Exception/RuntimeException.php',
-    'Symfony\\Component\\DependencyInjection\\Exception\\ScopeCrossingInjectionException' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Exception/ScopeCrossingInjectionException.php',
-    'Symfony\\Component\\DependencyInjection\\Exception\\ScopeWideningInjectionException' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Exception/ScopeWideningInjectionException.php',
-    'Symfony\\Component\\DependencyInjection\\Exception\\ServiceCircularReferenceException' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Exception/ServiceCircularReferenceException.php',
-    'Symfony\\Component\\DependencyInjection\\Exception\\ServiceNotFoundException' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Exception/ServiceNotFoundException.php',
-    'Symfony\\Component\\DependencyInjection\\Extension\\ConfigurationExtensionInterface' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Extension/ConfigurationExtensionInterface.php',
-    'Symfony\\Component\\DependencyInjection\\Extension\\Extension' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Extension/Extension.php',
-    'Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Extension/ExtensionInterface.php',
-    'Symfony\\Component\\DependencyInjection\\Extension\\PrependExtensionInterface' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Extension/PrependExtensionInterface.php',
-    'Symfony\\Component\\DependencyInjection\\IntrospectableContainerInterface' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/IntrospectableContainerInterface.php',
-    'Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\InstantiatorInterface' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/LazyProxy/Instantiator/InstantiatorInterface.php',
-    'Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\RealServiceInstantiator' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/LazyProxy/Instantiator/RealServiceInstantiator.php',
-    'Symfony\\Component\\DependencyInjection\\LazyProxy\\PhpDumper\\DumperInterface' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/DumperInterface.php',
-    'Symfony\\Component\\DependencyInjection\\LazyProxy\\PhpDumper\\NullDumper' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/NullDumper.php',
-    'Symfony\\Component\\DependencyInjection\\Loader\\ClosureLoader' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/ClosureLoader.php',
-    'Symfony\\Component\\DependencyInjection\\Loader\\FileLoader' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/FileLoader.php',
-    'Symfony\\Component\\DependencyInjection\\Loader\\IniFileLoader' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/IniFileLoader.php',
-    'Symfony\\Component\\DependencyInjection\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/PhpFileLoader.php',
-    'Symfony\\Component\\DependencyInjection\\Loader\\XmlFileLoader' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php',
-    'Symfony\\Component\\DependencyInjection\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php',
-    'Symfony\\Component\\DependencyInjection\\Parameter' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Parameter.php',
-    'Symfony\\Component\\DependencyInjection\\ParameterBag\\FrozenParameterBag' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/FrozenParameterBag.php',
-    'Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php',
-    'Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBagInterface' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php',
-    'Symfony\\Component\\DependencyInjection\\Reference' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Reference.php',
-    'Symfony\\Component\\DependencyInjection\\Scope' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Scope.php',
-    'Symfony\\Component\\DependencyInjection\\ScopeInterface' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/ScopeInterface.php',
-    'Symfony\\Component\\DependencyInjection\\SimpleXMLElement' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/SimpleXMLElement.php',
-    'Symfony\\Component\\DependencyInjection\\TaggedContainerInterface' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/TaggedContainerInterface.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\AnalyzeServiceReferencesPassTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/AnalyzeServiceReferencesPassTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\CheckCircularReferencesPassTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckCircularReferencesPassTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\CheckDefinitionValidityPassTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckDefinitionValidityPassTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\CheckExceptionOnInvalidReferenceBehaviorPassTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckExceptionOnInvalidReferenceBehaviorPassTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\CheckReferenceValidityPassTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckReferenceValidityPassTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\Extension' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/MergeExtensionConfigurationPassTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\ExtensionA' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/MergeExtensionConfigurationPassTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\ExtensionB' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/MergeExtensionConfigurationPassTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\InlineServiceDefinitionsPassTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/InlineServiceDefinitionsPassTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\IntegrationTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\MergeExtensionConfigurationPassTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/MergeExtensionConfigurationPassTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\RemoveUnusedDefinitionsPassTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/RemoveUnusedDefinitionsPassTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\ReplaceAliasByActualDefinitionPassTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/ReplaceAliasByActualDefinitionPassTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\ResolveDefinitionTemplatesPassTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\ResolveInvalidReferencesPassTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInvalidReferencesPassTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\ResolveParameterPlaceHoldersPassTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveParameterPlaceHoldersPassTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\ResolveReferencesToAliasesPassTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveReferencesToAliasesPassTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\ContainerBuilderTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\ContainerTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/ContainerTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\CrossCheckTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/CrossCheckTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\DefinitionDecoratorTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/DefinitionDecoratorTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\DefinitionTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Dumper\\GraphvizDumperTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Dumper/GraphvizDumperTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Dumper\\PhpDumperTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Dumper\\XmlDumperTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Dumper\\YamlDumperTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Extension\\ExtensionTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Extension/ExtensionTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\FooClass' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\LazyProxy\\Instantiator\\RealServiceInstantiatorTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/LazyProxy/Instantiator/RealServiceInstantiatorTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\LazyProxy\\PhpDumper\\NullDumperTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/LazyProxy/PhpDumper/NullDumperTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Loader\\ClosureLoaderTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Loader/ClosureLoaderTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Loader\\IniFileLoaderTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Loader/IniFileLoaderTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Loader\\PhpFileLoaderTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Loader\\XmlFileLoaderTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\Loader\\YamlFileLoaderTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\ParameterBag\\FrozenParameterBagTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/ParameterBag/FrozenParameterBagTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\ParameterBag\\ParameterBagTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/ParameterBag/ParameterBagTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\ParameterTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/ParameterTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\ProjectContainer' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\ProjectServiceContainer' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/ContainerTest.php',
-    'Symfony\\Component\\DependencyInjection\\Tests\\ReferenceTest' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/ReferenceTest.php',
-    'Symfony\\Component\\DependencyInjection\\Variable' => $vendorDir . '/symfony/dependency-injection/Symfony/Component/DependencyInjection/Variable.php',
-    'Symfony\\Component\\EventDispatcher\\ContainerAwareEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php',
-    'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.php',
-    'Symfony\\Component\\EventDispatcher\\Event' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php',
-    'Symfony\\Component\\EventDispatcher\\EventDispatcher' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php',
-    'Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php',
-    'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventSubscriberInterface.php',
-    'Symfony\\Component\\EventDispatcher\\GenericEvent' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php',
-    'Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php',
-    'Symfony\\Component\\EventDispatcher\\Tests\\CallableClass' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php',
-    'Symfony\\Component\\EventDispatcher\\Tests\\ContainerAwareEventDispatcherTest' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ContainerAwareEventDispatcherTest.php',
-    'Symfony\\Component\\EventDispatcher\\Tests\\EventDispatcherTest' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php',
-    'Symfony\\Component\\EventDispatcher\\Tests\\EventTest' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventTest.php',
-    'Symfony\\Component\\EventDispatcher\\Tests\\GenericEventTest' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php',
-    'Symfony\\Component\\EventDispatcher\\Tests\\ImmutableEventDispatcherTest' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.php',
-    'Symfony\\Component\\EventDispatcher\\Tests\\Service' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ContainerAwareEventDispatcherTest.php',
-    'Symfony\\Component\\EventDispatcher\\Tests\\SubscriberService' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ContainerAwareEventDispatcherTest.php',
-    'Symfony\\Component\\EventDispatcher\\Tests\\TestEventListener' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php',
-    'Symfony\\Component\\EventDispatcher\\Tests\\TestEventSubscriber' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php',
-    'Symfony\\Component\\EventDispatcher\\Tests\\TestEventSubscriberWithMultipleListeners' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php',
-    'Symfony\\Component\\EventDispatcher\\Tests\\TestEventSubscriberWithPriorities' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php',
-    'Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/filesystem/Symfony/Component/Filesystem/Exception/ExceptionInterface.php',
-    'Symfony\\Component\\Filesystem\\Exception\\IOException' => $vendorDir . '/symfony/filesystem/Symfony/Component/Filesystem/Exception/IOException.php',
-    'Symfony\\Component\\Filesystem\\Filesystem' => $vendorDir . '/symfony/filesystem/Symfony/Component/Filesystem/Filesystem.php',
-    'Symfony\\Component\\Filesystem\\Tests\\FilesystemTest' => $vendorDir . '/symfony/filesystem/Symfony/Component/Filesystem/Tests/FilesystemTest.php',
-    'Symfony\\Component\\HttpFoundation\\AcceptHeader' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/AcceptHeader.php',
-    'Symfony\\Component\\HttpFoundation\\AcceptHeaderItem' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/AcceptHeaderItem.php',
-    'Symfony\\Component\\HttpFoundation\\ApacheRequest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/ApacheRequest.php',
-    'Symfony\\Component\\HttpFoundation\\BinaryFileResponse' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/BinaryFileResponse.php',
-    'Symfony\\Component\\HttpFoundation\\Cookie' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Cookie.php',
-    'Symfony\\Component\\HttpFoundation\\FileBag' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/FileBag.php',
-    'Symfony\\Component\\HttpFoundation\\File\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/File/Exception/AccessDeniedException.php',
-    'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileException' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/File/Exception/FileException.php',
-    'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/File/Exception/FileNotFoundException.php',
-    'Symfony\\Component\\HttpFoundation\\File\\Exception\\UnexpectedTypeException' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/File/Exception/UnexpectedTypeException.php',
-    'Symfony\\Component\\HttpFoundation\\File\\Exception\\UploadException' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/File/Exception/UploadException.php',
-    'Symfony\\Component\\HttpFoundation\\File\\File' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/File/File.php',
-    'Symfony\\Component\\HttpFoundation\\File\\MimeType\\ExtensionGuesser' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesser.php',
-    'Symfony\\Component\\HttpFoundation\\File\\MimeType\\ExtensionGuesserInterface' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesserInterface.php',
-    'Symfony\\Component\\HttpFoundation\\File\\MimeType\\FileBinaryMimeTypeGuesser' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php',
-    'Symfony\\Component\\HttpFoundation\\File\\MimeType\\FileinfoMimeTypeGuesser' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php',
-    'Symfony\\Component\\HttpFoundation\\File\\MimeType\\MimeTypeExtensionGuesser' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeExtensionGuesser.php',
-    'Symfony\\Component\\HttpFoundation\\File\\MimeType\\MimeTypeGuesser' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.php',
-    'Symfony\\Component\\HttpFoundation\\File\\MimeType\\MimeTypeGuesserInterface' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesserInterface.php',
-    'Symfony\\Component\\HttpFoundation\\File\\UploadedFile' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/File/UploadedFile.php',
-    'Symfony\\Component\\HttpFoundation\\HeaderBag' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/HeaderBag.php',
-    'Symfony\\Component\\HttpFoundation\\IpUtils' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/IpUtils.php',
-    'Symfony\\Component\\HttpFoundation\\JsonResponse' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/JsonResponse.php',
-    'Symfony\\Component\\HttpFoundation\\ParameterBag' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/ParameterBag.php',
-    'Symfony\\Component\\HttpFoundation\\RedirectResponse' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/RedirectResponse.php',
-    'Symfony\\Component\\HttpFoundation\\Request' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php',
-    'Symfony\\Component\\HttpFoundation\\RequestMatcher' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcher.php',
-    'Symfony\\Component\\HttpFoundation\\RequestMatcherInterface' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcherInterface.php',
-    'Symfony\\Component\\HttpFoundation\\Resources\\stubs\\FakeFile' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Resources/stubs/FakeFile.php',
-    'Symfony\\Component\\HttpFoundation\\Response' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Response.php',
-    'Symfony\\Component\\HttpFoundation\\ResponseHeaderBag' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/ResponseHeaderBag.php',
-    'Symfony\\Component\\HttpFoundation\\ServerBag' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/ServerBag.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBag' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBagInterface' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\NamespacedAttributeBag' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Flash\\AutoExpireFlashBag' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBag' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBagInterface' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Session' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Session.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionBagInterface.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\SessionInterface' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionInterface.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcacheSessionHandler' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcachedSessionHandler' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MongoDbSessionHandler' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeFileSessionHandler' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeFileSessionHandler.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeSessionHandler' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NullSessionHandler' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\PdoSessionHandler' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MetadataBag' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockArraySessionStorage' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorage' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorage' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/PhpBridgeSessionStorage.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\NativeProxy' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\SessionHandlerProxy' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php',
-    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php',
-    'Symfony\\Component\\HttpFoundation\\StreamedResponse' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/StreamedResponse.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\AcceptHeaderItemTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/AcceptHeaderItemTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\AcceptHeaderTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/AcceptHeaderTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\ApacheRequestTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ApacheRequestTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\BinaryFileResponseTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\CookieTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/CookieTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\FileBagTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/FileBagTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\File\\FileTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/FileTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\File\\MimeType\\MimeTypeTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/MimeType/MimeTypeTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\File\\UploadedFileTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/UploadedFileTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\HeaderBagTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/HeaderBagTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\IpUtilsTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/IpUtilsTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\JsonResponseTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/JsonResponseTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\ParameterBagTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ParameterBagTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\RedirectResponseTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/RedirectResponseTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\RequestContentProxy' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/RequestTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\RequestMatcherTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/RequestMatcherTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\RequestTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/RequestTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\ResponseHeaderBagTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseHeaderBagTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\ResponseTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\ResponseTestCase' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseTestCase.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\ServerBagTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ServerBagTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Attribute\\AttributeBagTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Attribute/AttributeBagTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Attribute\\NamespacedAttributeBagTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Flash\\AutoExpireFlashBagTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Flash/AutoExpireFlashBagTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Flash\\FlashBagTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Flash/FlashBagTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\SessionTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/SessionTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\Handler\\MemcacheSessionHandlerTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\Handler\\MemcachedSessionHandlerTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\Handler\\MongoDbSessionHandlerTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\Handler\\NativeFileSessionHandlerTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\Handler\\NativeSessionHandlerTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\Handler\\NullSessionHandlerTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\Handler\\PdoSessionHandlerTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\MetadataBagTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MetadataBagTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\MockArraySessionStorageTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MockArraySessionStorageTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\MockFileSessionStorageTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MockFileSessionStorageTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\NativeSessionStorageTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\PhpBridgeSessionStorageTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\Proxy\\AbstractProxyTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\Proxy\\ConcreteProxy' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\Proxy\\ConcreteSessionHandlerInterfaceProxy' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\Proxy\\NativeProxyTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/NativeProxyTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\Session\\Storage\\Proxy\\SessionHandlerProxyTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\StreamedResponseTest' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/StreamedResponseTest.php',
-    'Symfony\\Component\\HttpFoundation\\Tests\\StringableObject' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseTest.php',
-    'Symfony\\Component\\HttpKernel\\Bundle\\Bundle' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Bundle/Bundle.php',
-    'Symfony\\Component\\HttpKernel\\Bundle\\BundleInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Bundle/BundleInterface.php',
-    'Symfony\\Component\\HttpKernel\\CacheClearer\\CacheClearerInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/CacheClearer/CacheClearerInterface.php',
-    'Symfony\\Component\\HttpKernel\\CacheClearer\\ChainCacheClearer' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/CacheClearer/ChainCacheClearer.php',
-    'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmer' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmer.php',
-    'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerAggregate' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php',
-    'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerInterface.php',
-    'Symfony\\Component\\HttpKernel\\CacheWarmer\\WarmableInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/WarmableInterface.php',
-    'Symfony\\Component\\HttpKernel\\Client' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Client.php',
-    'Symfony\\Component\\HttpKernel\\Config\\EnvParametersResource' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Config/EnvParametersResource.php',
-    'Symfony\\Component\\HttpKernel\\Config\\FileLocator' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Config/FileLocator.php',
-    'Symfony\\Component\\HttpKernel\\Controller\\ControllerReference' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Controller/ControllerReference.php',
-    'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Controller/ControllerResolver.php',
-    'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Controller/ControllerResolverInterface.php',
-    'Symfony\\Component\\HttpKernel\\Controller\\TraceableControllerResolver' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Controller/TraceableControllerResolver.php',
-    'Symfony\\Component\\HttpKernel\\DataCollector\\ConfigDataCollector' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.php',
-    'Symfony\\Component\\HttpKernel\\DataCollector\\DataCollector' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/DataCollector.php',
-    'Symfony\\Component\\HttpKernel\\DataCollector\\DataCollectorInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/DataCollectorInterface.php',
-    'Symfony\\Component\\HttpKernel\\DataCollector\\EventDataCollector' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/EventDataCollector.php',
-    'Symfony\\Component\\HttpKernel\\DataCollector\\ExceptionDataCollector' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/ExceptionDataCollector.php',
-    'Symfony\\Component\\HttpKernel\\DataCollector\\LoggerDataCollector' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php',
-    'Symfony\\Component\\HttpKernel\\DataCollector\\MemoryDataCollector' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.php',
-    'Symfony\\Component\\HttpKernel\\DataCollector\\RequestDataCollector' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.php',
-    'Symfony\\Component\\HttpKernel\\DataCollector\\RouterDataCollector' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/RouterDataCollector.php',
-    'Symfony\\Component\\HttpKernel\\DataCollector\\TimeDataCollector' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/TimeDataCollector.php',
-    'Symfony\\Component\\HttpKernel\\Debug\\ErrorHandler' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Debug/ErrorHandler.php',
-    'Symfony\\Component\\HttpKernel\\Debug\\ExceptionHandler' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Debug/ExceptionHandler.php',
-    'Symfony\\Component\\HttpKernel\\Debug\\TraceableEventDispatcher' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php',
-    'Symfony\\Component\\HttpKernel\\DependencyInjection\\AddClassesToCachePass' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/AddClassesToCachePass.php',
-    'Symfony\\Component\\HttpKernel\\DependencyInjection\\ConfigurableExtension' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/ConfigurableExtension.php',
-    'Symfony\\Component\\HttpKernel\\DependencyInjection\\ContainerAwareHttpKernel' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/ContainerAwareHttpKernel.php',
-    'Symfony\\Component\\HttpKernel\\DependencyInjection\\Extension' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/Extension.php',
-    'Symfony\\Component\\HttpKernel\\DependencyInjection\\MergeExtensionConfigurationPass' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/MergeExtensionConfigurationPass.php',
-    'Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterListenersPass' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/RegisterListenersPass.php',
-    'Symfony\\Component\\HttpKernel\\EventListener\\ErrorsLoggerListener' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ErrorsLoggerListener.php',
-    'Symfony\\Component\\HttpKernel\\EventListener\\EsiListener' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/EsiListener.php',
-    'Symfony\\Component\\HttpKernel\\EventListener\\ExceptionListener' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php',
-    'Symfony\\Component\\HttpKernel\\EventListener\\FragmentListener' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/FragmentListener.php',
-    'Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/LocaleListener.php',
-    'Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ProfilerListener.php',
-    'Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ResponseListener.php',
-    'Symfony\\Component\\HttpKernel\\EventListener\\RouterListener' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/RouterListener.php',
-    'Symfony\\Component\\HttpKernel\\EventListener\\SaveSessionListener' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/SaveSessionListener.php',
-    'Symfony\\Component\\HttpKernel\\EventListener\\StreamedResponseListener' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/StreamedResponseListener.php',
-    'Symfony\\Component\\HttpKernel\\Event\\FilterControllerEvent' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Event/FilterControllerEvent.php',
-    'Symfony\\Component\\HttpKernel\\Event\\FilterResponseEvent' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Event/FilterResponseEvent.php',
-    'Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Event/GetResponseEvent.php',
-    'Symfony\\Component\\HttpKernel\\Event\\GetResponseForControllerResultEvent' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Event/GetResponseForControllerResultEvent.php',
-    'Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Event/GetResponseForExceptionEvent.php',
-    'Symfony\\Component\\HttpKernel\\Event\\KernelEvent' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Event/KernelEvent.php',
-    'Symfony\\Component\\HttpKernel\\Event\\PostResponseEvent' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Event/PostResponseEvent.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/AccessDeniedHttpException.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\BadRequestHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/BadRequestHttpException.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\ConflictHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/ConflictHttpException.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\GoneHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/GoneHttpException.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\HttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/HttpException.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\HttpExceptionInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\LengthRequiredHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/LengthRequiredHttpException.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\MethodNotAllowedHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/MethodNotAllowedHttpException.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\NotAcceptableHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/NotAcceptableHttpException.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/NotFoundHttpException.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\PreconditionFailedHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/PreconditionFailedHttpException.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\PreconditionRequiredHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/PreconditionRequiredHttpException.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\ServiceUnavailableHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/ServiceUnavailableHttpException.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\TooManyRequestsHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/TooManyRequestsHttpException.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\UnauthorizedHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/UnauthorizedHttpException.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\UnsupportedMediaTypeHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/UnsupportedMediaTypeHttpException.php',
-    'Symfony\\Component\\HttpKernel\\Fragment\\EsiFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/EsiFragmentRenderer.php',
-    'Symfony\\Component\\HttpKernel\\Fragment\\FragmentHandler' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php',
-    'Symfony\\Component\\HttpKernel\\Fragment\\FragmentRendererInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/FragmentRendererInterface.php',
-    'Symfony\\Component\\HttpKernel\\Fragment\\HIncludeFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/HIncludeFragmentRenderer.php',
-    'Symfony\\Component\\HttpKernel\\Fragment\\InlineFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.php',
-    'Symfony\\Component\\HttpKernel\\Fragment\\RoutableFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php',
-    'Symfony\\Component\\HttpKernel\\HttpCache\\Esi' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/Esi.php',
-    'Symfony\\Component\\HttpKernel\\HttpCache\\EsiResponseCacheStrategy' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategy.php',
-    'Symfony\\Component\\HttpKernel\\HttpCache\\EsiResponseCacheStrategyInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategyInterface.php',
-    'Symfony\\Component\\HttpKernel\\HttpCache\\HttpCache' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/HttpCache.php',
-    'Symfony\\Component\\HttpKernel\\HttpCache\\Store' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/Store.php',
-    'Symfony\\Component\\HttpKernel\\HttpCache\\StoreInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/StoreInterface.php',
-    'Symfony\\Component\\HttpKernel\\HttpKernel' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernel.php',
-    'Symfony\\Component\\HttpKernel\\HttpKernelInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernelInterface.php',
-    'Symfony\\Component\\HttpKernel\\Kernel' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Kernel.php',
-    'Symfony\\Component\\HttpKernel\\KernelEvents' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/KernelEvents.php',
-    'Symfony\\Component\\HttpKernel\\KernelInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/KernelInterface.php',
-    'Symfony\\Component\\HttpKernel\\Log\\DebugLoggerInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Log/DebugLoggerInterface.php',
-    'Symfony\\Component\\HttpKernel\\Log\\LoggerInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Log/LoggerInterface.php',
-    'Symfony\\Component\\HttpKernel\\Log\\NullLogger' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Log/NullLogger.php',
-    'Symfony\\Component\\HttpKernel\\Profiler\\BaseMemcacheProfilerStorage' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/BaseMemcacheProfilerStorage.php',
-    'Symfony\\Component\\HttpKernel\\Profiler\\FileProfilerStorage' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/FileProfilerStorage.php',
-    'Symfony\\Component\\HttpKernel\\Profiler\\MemcacheProfilerStorage' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MemcacheProfilerStorage.php',
-    'Symfony\\Component\\HttpKernel\\Profiler\\MemcachedProfilerStorage' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MemcachedProfilerStorage.php',
-    'Symfony\\Component\\HttpKernel\\Profiler\\MongoDbProfilerStorage' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MongoDbProfilerStorage.php',
-    'Symfony\\Component\\HttpKernel\\Profiler\\MysqlProfilerStorage' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MysqlProfilerStorage.php',
-    'Symfony\\Component\\HttpKernel\\Profiler\\PdoProfilerStorage' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/PdoProfilerStorage.php',
-    'Symfony\\Component\\HttpKernel\\Profiler\\Profile' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/Profile.php',
-    'Symfony\\Component\\HttpKernel\\Profiler\\Profiler' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/Profiler.php',
-    'Symfony\\Component\\HttpKernel\\Profiler\\ProfilerStorageInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/ProfilerStorageInterface.php',
-    'Symfony\\Component\\HttpKernel\\Profiler\\RedisProfilerStorage' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/RedisProfilerStorage.php',
-    'Symfony\\Component\\HttpKernel\\Profiler\\SqliteProfilerStorage' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/SqliteProfilerStorage.php',
-    'Symfony\\Component\\HttpKernel\\TerminableInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/TerminableInterface.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Bundle\\BundleTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Bundle/BundleTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\CacheClearer\\ChainCacheClearerTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/CacheClearer/ChainCacheClearerTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\CacheWarmer\\CacheWarmerAggregateTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/CacheWarmer/CacheWarmerAggregateTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\CacheWarmer\\CacheWarmerTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/CacheWarmer/CacheWarmerTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\CacheWarmer\\TestCacheWarmer' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/CacheWarmer/CacheWarmerTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\ClientTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/ClientTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Config\\EnvParametersResourceTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Config/EnvParametersResourceTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Config\\FileLocatorTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Config/FileLocatorTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Controller' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/HttpKernelTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Controller\\ControllerResolverTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\DataCollector\\ConfigDataCollectorTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/DataCollector/ConfigDataCollectorTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\DataCollector\\ExceptionDataCollectorTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/DataCollector/ExceptionDataCollectorTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\DataCollector\\KernelForTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/DataCollector/ConfigDataCollectorTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\DataCollector\\LoggerDataCollectorTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/DataCollector/LoggerDataCollectorTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\DataCollector\\MemoryDataCollectorTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/DataCollector/MemoryDataCollectorTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\DataCollector\\RequestDataCollectorTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/DataCollector/RequestDataCollectorTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\DataCollector\\TimeDataCollectorTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/DataCollector/TimeDataCollectorTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Debug\\EventSubscriber' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Debug/TraceableEventDispatcherTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Debug\\TraceableEventDispatcherTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Debug/TraceableEventDispatcherTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\DependencyInjection\\ContainerAwareHttpKernelTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/DependencyInjection/ContainerAwareHttpKernelTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\DependencyInjection\\MergeExtensionConfigurationPassTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/DependencyInjection/MergeExtensionConfigurationPassTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\DependencyInjection\\RegisterListenersPassTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterListenersPassTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\DependencyInjection\\SubscriberService' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterListenersPassTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\EventListener\\EsiListenerTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/EventListener/EsiListenerTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\EventListener\\ExceptionListenerTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/EventListener/ExceptionListenerTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\EventListener\\FragmentListenerTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/EventListener/FragmentListenerTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\EventListener\\LocaleListenerTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/EventListener/LocaleListenerTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\EventListener\\ResponseListenerTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/EventListener/ResponseListenerTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\EventListener\\RouterListenerTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/EventListener/RouterListenerTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\EventListener\\TestKernel' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/EventListener/ExceptionListenerTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\EventListener\\TestKernelThatThrowsException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/EventListener/ExceptionListenerTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\EventListener\\TestLogger' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/EventListener/ExceptionListenerTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\Controller\\VariadicController' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/Controller/VariadicController.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionAbsentBundle\\ExtensionAbsentBundle' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionAbsentBundle/ExtensionAbsentBundle.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionLoadedBundle\\DependencyInjection\\ExtensionLoadedExtension' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/DependencyInjection/ExtensionLoadedExtension.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionLoadedBundle\\ExtensionLoadedBundle' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/ExtensionLoadedBundle.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionNotValidBundle\\DependencyInjection\\ExtensionNotValidExtension' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionNotValidBundle/DependencyInjection/ExtensionNotValidExtension.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionNotValidBundle\\ExtensionNotValidBundle' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionNotValidBundle/ExtensionNotValidBundle.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionPresentBundle\\Command\\BarCommand' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command/BarCommand.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionPresentBundle\\Command\\FooCommand' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command/FooCommand.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionPresentBundle\\DependencyInjection\\ExtensionPresentExtension' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/DependencyInjection/ExtensionPresentExtension.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionPresentBundle\\ExtensionPresentBundle' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/ExtensionPresentBundle.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\FooBarBundle' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/FooBarBundle.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\KernelForOverrideName' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForOverrideName.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\KernelForTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\TestClient' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/TestClient.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\TestEventDispatcher' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/TestEventDispatcher.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fragment\\EsiFragmentRendererTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fragment\\FragmentHandlerTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fragment/FragmentHandlerTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fragment\\HIncludeFragmentRendererTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fragment\\InlineFragmentRendererTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fragment\\Renderer' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fragment/RoutableFragmentRendererTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Fragment\\RoutableFragmentRendererTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fragment/RoutableFragmentRendererTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\HttpCache\\EsiResponseCacheStrategyTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/HttpCache/EsiResponseCacheStrategyTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\HttpCache\\EsiTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/HttpCache/EsiTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\HttpCache\\HttpCacheTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\HttpCache\\HttpCacheTestCase' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTestCase.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\HttpCache\\StoreTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/HttpCache/StoreTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\HttpCache\\TestHttpKernel' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/HttpCache/TestHttpKernel.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\HttpCache\\TestKernel' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\HttpCache\\TestMultipleHttpKernel' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/HttpCache/TestMultipleHttpKernel.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\HttpKernelTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/HttpKernelTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\KernelTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/KernelTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Logger' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Logger.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Profiler\\AbstractProfilerStorageTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/AbstractProfilerStorageTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Profiler\\DummyMongoDbProfilerStorage' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/MongoDbProfilerStorageTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Profiler\\FileProfilerStorageTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/FileProfilerStorageTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Profiler\\MemcacheProfilerStorageTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/MemcacheProfilerStorageTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Profiler\\MemcachedProfilerStorageTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/MemcachedProfilerStorageTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Profiler\\Mock\\MemcacheMock' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcacheMock.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Profiler\\Mock\\MemcachedMock' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcachedMock.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Profiler\\Mock\\RedisMock' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/RedisMock.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Profiler\\MongoDbProfilerStorageTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/MongoDbProfilerStorageTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Profiler\\MongoDbProfilerStorageTestDataCollector' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/MongoDbProfilerStorageTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Profiler\\ProfilerTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/ProfilerTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Profiler\\RedisProfilerStorageTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/RedisProfilerStorageTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\Profiler\\SqliteProfilerStorageTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Profiler/SqliteProfilerStorageTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\TestHttpKernel' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/TestHttpKernel.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\TestKernel' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/KernelTest.php',
-    'Symfony\\Component\\HttpKernel\\Tests\\UriSignerTest' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/UriSignerTest.php',
-    'Symfony\\Component\\HttpKernel\\UriSigner' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/UriSigner.php',
-    'Symfony\\Component\\Routing\\Annotation\\Route' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Annotation/Route.php',
-    'Symfony\\Component\\Routing\\CompiledRoute' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/CompiledRoute.php',
-    'Symfony\\Component\\Routing\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Exception/ExceptionInterface.php',
-    'Symfony\\Component\\Routing\\Exception\\InvalidParameterException' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Exception/InvalidParameterException.php',
-    'Symfony\\Component\\Routing\\Exception\\MethodNotAllowedException' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Exception/MethodNotAllowedException.php',
-    'Symfony\\Component\\Routing\\Exception\\MissingMandatoryParametersException' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php',
-    'Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Exception/ResourceNotFoundException.php',
-    'Symfony\\Component\\Routing\\Exception\\RouteNotFoundException' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Exception/RouteNotFoundException.php',
-    'Symfony\\Component\\Routing\\Generator\\ConfigurableRequirementsInterface' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.php',
-    'Symfony\\Component\\Routing\\Generator\\Dumper\\GeneratorDumper' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumper.php',
-    'Symfony\\Component\\Routing\\Generator\\Dumper\\GeneratorDumperInterface' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php',
-    'Symfony\\Component\\Routing\\Generator\\Dumper\\PhpGeneratorDumper' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php',
-    'Symfony\\Component\\Routing\\Generator\\UrlGenerator' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Generator/UrlGenerator.php',
-    'Symfony\\Component\\Routing\\Generator\\UrlGeneratorInterface' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php',
-    'Symfony\\Component\\Routing\\Loader\\AnnotationClassLoader' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Loader/AnnotationClassLoader.php',
-    'Symfony\\Component\\Routing\\Loader\\AnnotationDirectoryLoader' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.php',
-    'Symfony\\Component\\Routing\\Loader\\AnnotationFileLoader' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Loader/AnnotationFileLoader.php',
-    'Symfony\\Component\\Routing\\Loader\\ClosureLoader' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Loader/ClosureLoader.php',
-    'Symfony\\Component\\Routing\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Loader/PhpFileLoader.php',
-    'Symfony\\Component\\Routing\\Loader\\XmlFileLoader' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Loader/XmlFileLoader.php',
-    'Symfony\\Component\\Routing\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Loader/YamlFileLoader.php',
-    'Symfony\\Component\\Routing\\Matcher\\ApacheUrlMatcher' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php',
-    'Symfony\\Component\\Routing\\Matcher\\Dumper\\ApacheMatcherDumper' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php',
-    'Symfony\\Component\\Routing\\Matcher\\Dumper\\DumperCollection' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php',
-    'Symfony\\Component\\Routing\\Matcher\\Dumper\\DumperPrefixCollection' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperPrefixCollection.php',
-    'Symfony\\Component\\Routing\\Matcher\\Dumper\\DumperRoute' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperRoute.php',
-    'Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumper' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumper.php',
-    'Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumperInterface' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumperInterface.php',
-    'Symfony\\Component\\Routing\\Matcher\\Dumper\\PhpMatcherDumper' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php',
-    'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcher' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php',
-    'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcherInterface' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php',
-    'Symfony\\Component\\Routing\\Matcher\\RequestMatcherInterface' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Matcher/RequestMatcherInterface.php',
-    'Symfony\\Component\\Routing\\Matcher\\TraceableUrlMatcher' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php',
-    'Symfony\\Component\\Routing\\Matcher\\UrlMatcher' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcher.php',
-    'Symfony\\Component\\Routing\\Matcher\\UrlMatcherInterface' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcherInterface.php',
-    'Symfony\\Component\\Routing\\RequestContext' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/RequestContext.php',
-    'Symfony\\Component\\Routing\\RequestContextAwareInterface' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/RequestContextAwareInterface.php',
-    'Symfony\\Component\\Routing\\Route' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Route.php',
-    'Symfony\\Component\\Routing\\RouteCollection' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/RouteCollection.php',
-    'Symfony\\Component\\Routing\\RouteCompiler' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/RouteCompiler.php',
-    'Symfony\\Component\\Routing\\RouteCompilerInterface' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/RouteCompilerInterface.php',
-    'Symfony\\Component\\Routing\\Router' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Router.php',
-    'Symfony\\Component\\Routing\\RouterInterface' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/RouterInterface.php',
-    'Symfony\\Component\\Routing\\Tests\\Annotation\\RouteTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Annotation/RouteTest.php',
-    'Symfony\\Component\\Routing\\Tests\\CompiledRouteTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/CompiledRouteTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Fixtures\\AnnotatedClasses\\AbstractClass' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/AbstractClass.php',
-    'Symfony\\Component\\Routing\\Tests\\Fixtures\\AnnotatedClasses\\BarClass' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/BarClass.php',
-    'Symfony\\Component\\Routing\\Tests\\Fixtures\\AnnotatedClasses\\FooClass' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/FooClass.php',
-    'Symfony\\Component\\Routing\\Tests\\Fixtures\\AnnotatedClasses\\FooTrait' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/FooTrait.php',
-    'Symfony\\Component\\Routing\\Tests\\Fixtures\\CustomXmlFileLoader' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/CustomXmlFileLoader.php',
-    'Symfony\\Component\\Routing\\Tests\\Fixtures\\OtherAnnotatedClasses\\VariadicClass' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/OtherAnnotatedClasses/VariadicClass.php',
-    'Symfony\\Component\\Routing\\Tests\\Fixtures\\RedirectableUrlMatcher' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/RedirectableUrlMatcher.php',
-    'Symfony\\Component\\Routing\\Tests\\Generator\\Dumper\\PhpGeneratorDumperTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Generator\\UrlGeneratorTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Loader\\AbstractAnnotationLoaderTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Loader/AbstractAnnotationLoaderTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Loader\\AnnotationClassLoaderTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Loader\\AnnotationDirectoryLoaderTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Loader/AnnotationDirectoryLoaderTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Loader\\AnnotationFileLoaderTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Loader/AnnotationFileLoaderTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Loader\\ClosureLoaderTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Loader/ClosureLoaderTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Loader\\PhpFileLoaderTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Loader\\XmlFileLoaderTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Loader\\YamlFileLoaderTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Matcher\\ApacheUrlMatcherTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Matcher/ApacheUrlMatcherTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Matcher\\Dumper\\ApacheMatcherDumperTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/ApacheMatcherDumperTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Matcher\\Dumper\\DumperCollectionTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/DumperCollectionTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Matcher\\Dumper\\DumperPrefixCollectionTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/DumperPrefixCollectionTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Matcher\\Dumper\\PhpMatcherDumperTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Matcher\\RedirectableUrlMatcherTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Matcher\\TraceableUrlMatcherTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Matcher/TraceableUrlMatcherTest.php',
-    'Symfony\\Component\\Routing\\Tests\\Matcher\\UrlMatcherTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php',
-    'Symfony\\Component\\Routing\\Tests\\RequestContextTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/RequestContextTest.php',
-    'Symfony\\Component\\Routing\\Tests\\RouteCollectionTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/RouteCollectionTest.php',
-    'Symfony\\Component\\Routing\\Tests\\RouteCompilerTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/RouteCompilerTest.php',
-    'Symfony\\Component\\Routing\\Tests\\RouteTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/RouteTest.php',
-    'Symfony\\Component\\Routing\\Tests\\RouterTest' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/RouterTest.php',
-    'Symfony\\Component\\Yaml\\Dumper' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Dumper.php',
-    'Symfony\\Component\\Yaml\\Escaper' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Escaper.php',
-    'Symfony\\Component\\Yaml\\Exception\\DumpException' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Exception/DumpException.php',
-    'Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Exception/ExceptionInterface.php',
-    'Symfony\\Component\\Yaml\\Exception\\ParseException' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Exception/ParseException.php',
-    'Symfony\\Component\\Yaml\\Exception\\RuntimeException' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Exception/RuntimeException.php',
-    'Symfony\\Component\\Yaml\\Inline' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Inline.php',
-    'Symfony\\Component\\Yaml\\Parser' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Parser.php',
-    'Symfony\\Component\\Yaml\\Tests\\A' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Tests/DumperTest.php',
-    'Symfony\\Component\\Yaml\\Tests\\B' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Tests/ParserTest.php',
-    'Symfony\\Component\\Yaml\\Tests\\DumperTest' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Tests/DumperTest.php',
-    'Symfony\\Component\\Yaml\\Tests\\InlineTest' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Tests/InlineTest.php',
-    'Symfony\\Component\\Yaml\\Tests\\ParseExceptionTest' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Tests/ParseExceptionTest.php',
-    'Symfony\\Component\\Yaml\\Tests\\ParserTest' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Tests/ParserTest.php',
-    'Symfony\\Component\\Yaml\\Tests\\YamlTest' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Tests/YamlTest.php',
-    'Symfony\\Component\\Yaml\\Unescaper' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Unescaper.php',
-    'Symfony\\Component\\Yaml\\Yaml' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Yaml.php',
+    'ReCaptcha\\ReCaptcha' => $vendorDir . '/google/recaptcha/src/ReCaptcha/ReCaptcha.php',
+    'ReCaptcha\\RequestMethod' => $vendorDir . '/google/recaptcha/src/ReCaptcha/RequestMethod.php',
+    'ReCaptcha\\RequestMethod\\Curl' => $vendorDir . '/google/recaptcha/src/ReCaptcha/RequestMethod/Curl.php',
+    'ReCaptcha\\RequestMethod\\CurlPost' => $vendorDir . '/google/recaptcha/src/ReCaptcha/RequestMethod/CurlPost.php',
+    'ReCaptcha\\RequestMethod\\Post' => $vendorDir . '/google/recaptcha/src/ReCaptcha/RequestMethod/Post.php',
+    'ReCaptcha\\RequestMethod\\Socket' => $vendorDir . '/google/recaptcha/src/ReCaptcha/RequestMethod/Socket.php',
+    'ReCaptcha\\RequestMethod\\SocketPost' => $vendorDir . '/google/recaptcha/src/ReCaptcha/RequestMethod/SocketPost.php',
+    'ReCaptcha\\RequestParameters' => $vendorDir . '/google/recaptcha/src/ReCaptcha/RequestParameters.php',
+    'ReCaptcha\\Response' => $vendorDir . '/google/recaptcha/src/ReCaptcha/Response.php',
+    'React\\Promise\\CancellablePromiseInterface' => $vendorDir . '/react/promise/src/CancellablePromiseInterface.php',
+    'React\\Promise\\CancellationQueue' => $vendorDir . '/react/promise/src/CancellationQueue.php',
+    'React\\Promise\\Deferred' => $vendorDir . '/react/promise/src/Deferred.php',
+    'React\\Promise\\Exception\\LengthException' => $vendorDir . '/react/promise/src/Exception/LengthException.php',
+    'React\\Promise\\ExtendedPromiseInterface' => $vendorDir . '/react/promise/src/ExtendedPromiseInterface.php',
+    'React\\Promise\\FulfilledPromise' => $vendorDir . '/react/promise/src/FulfilledPromise.php',
+    'React\\Promise\\LazyPromise' => $vendorDir . '/react/promise/src/LazyPromise.php',
+    'React\\Promise\\Promise' => $vendorDir . '/react/promise/src/Promise.php',
+    'React\\Promise\\PromiseInterface' => $vendorDir . '/react/promise/src/PromiseInterface.php',
+    'React\\Promise\\PromisorInterface' => $vendorDir . '/react/promise/src/PromisorInterface.php',
+    'React\\Promise\\RejectedPromise' => $vendorDir . '/react/promise/src/RejectedPromise.php',
+    'React\\Promise\\UnhandledRejectionException' => $vendorDir . '/react/promise/src/UnhandledRejectionException.php',
+    'RecursiveCallbackFilterIterator' => $vendorDir . '/symfony/polyfill-php54/Resources/stubs/RecursiveCallbackFilterIterator.php',
+    'SessionHandlerInterface' => $vendorDir . '/symfony/polyfill-php54/Resources/stubs/SessionHandlerInterface.php',
+    'Symfony\\Bridge\\ProxyManager\\LazyProxy\\Instantiator\\RuntimeInstantiator' => $vendorDir . '/symfony/proxy-manager-bridge/LazyProxy/Instantiator/RuntimeInstantiator.php',
+    'Symfony\\Bridge\\ProxyManager\\LazyProxy\\PhpDumper\\ProxyDumper' => $vendorDir . '/symfony/proxy-manager-bridge/LazyProxy/PhpDumper/ProxyDumper.php',
+    'Symfony\\Bridge\\Twig\\AppVariable' => $vendorDir . '/symfony/twig-bridge/AppVariable.php',
+    'Symfony\\Bridge\\Twig\\Command\\DebugCommand' => $vendorDir . '/symfony/twig-bridge/Command/DebugCommand.php',
+    'Symfony\\Bridge\\Twig\\Command\\LintCommand' => $vendorDir . '/symfony/twig-bridge/Command/LintCommand.php',
+    'Symfony\\Bridge\\Twig\\DataCollector\\TwigDataCollector' => $vendorDir . '/symfony/twig-bridge/DataCollector/TwigDataCollector.php',
+    'Symfony\\Bridge\\Twig\\Extension\\AssetExtension' => $vendorDir . '/symfony/twig-bridge/Extension/AssetExtension.php',
+    'Symfony\\Bridge\\Twig\\Extension\\CodeExtension' => $vendorDir . '/symfony/twig-bridge/Extension/CodeExtension.php',
+    'Symfony\\Bridge\\Twig\\Extension\\DumpExtension' => $vendorDir . '/symfony/twig-bridge/Extension/DumpExtension.php',
+    'Symfony\\Bridge\\Twig\\Extension\\ExpressionExtension' => $vendorDir . '/symfony/twig-bridge/Extension/ExpressionExtension.php',
+    'Symfony\\Bridge\\Twig\\Extension\\FormExtension' => $vendorDir . '/symfony/twig-bridge/Extension/FormExtension.php',
+    'Symfony\\Bridge\\Twig\\Extension\\HttpFoundationExtension' => $vendorDir . '/symfony/twig-bridge/Extension/HttpFoundationExtension.php',
+    'Symfony\\Bridge\\Twig\\Extension\\HttpKernelExtension' => $vendorDir . '/symfony/twig-bridge/Extension/HttpKernelExtension.php',
+    'Symfony\\Bridge\\Twig\\Extension\\LogoutUrlExtension' => $vendorDir . '/symfony/twig-bridge/Extension/LogoutUrlExtension.php',
+    'Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension' => $vendorDir . '/symfony/twig-bridge/Extension/ProfilerExtension.php',
+    'Symfony\\Bridge\\Twig\\Extension\\RoutingExtension' => $vendorDir . '/symfony/twig-bridge/Extension/RoutingExtension.php',
+    'Symfony\\Bridge\\Twig\\Extension\\SecurityExtension' => $vendorDir . '/symfony/twig-bridge/Extension/SecurityExtension.php',
+    'Symfony\\Bridge\\Twig\\Extension\\StopwatchExtension' => $vendorDir . '/symfony/twig-bridge/Extension/StopwatchExtension.php',
+    'Symfony\\Bridge\\Twig\\Extension\\TranslationExtension' => $vendorDir . '/symfony/twig-bridge/Extension/TranslationExtension.php',
+    'Symfony\\Bridge\\Twig\\Extension\\YamlExtension' => $vendorDir . '/symfony/twig-bridge/Extension/YamlExtension.php',
+    'Symfony\\Bridge\\Twig\\Form\\TwigRenderer' => $vendorDir . '/symfony/twig-bridge/Form/TwigRenderer.php',
+    'Symfony\\Bridge\\Twig\\Form\\TwigRendererEngine' => $vendorDir . '/symfony/twig-bridge/Form/TwigRendererEngine.php',
+    'Symfony\\Bridge\\Twig\\Form\\TwigRendererEngineInterface' => $vendorDir . '/symfony/twig-bridge/Form/TwigRendererEngineInterface.php',
+    'Symfony\\Bridge\\Twig\\Form\\TwigRendererInterface' => $vendorDir . '/symfony/twig-bridge/Form/TwigRendererInterface.php',
+    'Symfony\\Bridge\\Twig\\NodeVisitor\\Scope' => $vendorDir . '/symfony/twig-bridge/NodeVisitor/Scope.php',
+    'Symfony\\Bridge\\Twig\\NodeVisitor\\TranslationDefaultDomainNodeVisitor' => $vendorDir . '/symfony/twig-bridge/NodeVisitor/TranslationDefaultDomainNodeVisitor.php',
+    'Symfony\\Bridge\\Twig\\NodeVisitor\\TranslationNodeVisitor' => $vendorDir . '/symfony/twig-bridge/NodeVisitor/TranslationNodeVisitor.php',
+    'Symfony\\Bridge\\Twig\\Node\\DumpNode' => $vendorDir . '/symfony/twig-bridge/Node/DumpNode.php',
+    'Symfony\\Bridge\\Twig\\Node\\FormEnctypeNode' => $vendorDir . '/symfony/twig-bridge/Node/FormEnctypeNode.php',
+    'Symfony\\Bridge\\Twig\\Node\\FormThemeNode' => $vendorDir . '/symfony/twig-bridge/Node/FormThemeNode.php',
+    'Symfony\\Bridge\\Twig\\Node\\RenderBlockNode' => $vendorDir . '/symfony/twig-bridge/Node/RenderBlockNode.php',
+    'Symfony\\Bridge\\Twig\\Node\\SearchAndRenderBlockNode' => $vendorDir . '/symfony/twig-bridge/Node/SearchAndRenderBlockNode.php',
+    'Symfony\\Bridge\\Twig\\Node\\StopwatchNode' => $vendorDir . '/symfony/twig-bridge/Node/StopwatchNode.php',
+    'Symfony\\Bridge\\Twig\\Node\\TransDefaultDomainNode' => $vendorDir . '/symfony/twig-bridge/Node/TransDefaultDomainNode.php',
+    'Symfony\\Bridge\\Twig\\Node\\TransNode' => $vendorDir . '/symfony/twig-bridge/Node/TransNode.php',
+    'Symfony\\Bridge\\Twig\\TokenParser\\DumpTokenParser' => $vendorDir . '/symfony/twig-bridge/TokenParser/DumpTokenParser.php',
+    'Symfony\\Bridge\\Twig\\TokenParser\\FormThemeTokenParser' => $vendorDir . '/symfony/twig-bridge/TokenParser/FormThemeTokenParser.php',
+    'Symfony\\Bridge\\Twig\\TokenParser\\StopwatchTokenParser' => $vendorDir . '/symfony/twig-bridge/TokenParser/StopwatchTokenParser.php',
+    'Symfony\\Bridge\\Twig\\TokenParser\\TransChoiceTokenParser' => $vendorDir . '/symfony/twig-bridge/TokenParser/TransChoiceTokenParser.php',
+    'Symfony\\Bridge\\Twig\\TokenParser\\TransDefaultDomainTokenParser' => $vendorDir . '/symfony/twig-bridge/TokenParser/TransDefaultDomainTokenParser.php',
+    'Symfony\\Bridge\\Twig\\TokenParser\\TransTokenParser' => $vendorDir . '/symfony/twig-bridge/TokenParser/TransTokenParser.php',
+    'Symfony\\Bridge\\Twig\\Translation\\TwigExtractor' => $vendorDir . '/symfony/twig-bridge/Translation/TwigExtractor.php',
+    'Symfony\\Bridge\\Twig\\TwigEngine' => $vendorDir . '/symfony/twig-bridge/TwigEngine.php',
+    'Symfony\\Component\\Config\\ConfigCache' => $vendorDir . '/symfony/config/ConfigCache.php',
+    'Symfony\\Component\\Config\\ConfigCacheFactory' => $vendorDir . '/symfony/config/ConfigCacheFactory.php',
+    'Symfony\\Component\\Config\\ConfigCacheFactoryInterface' => $vendorDir . '/symfony/config/ConfigCacheFactoryInterface.php',
+    'Symfony\\Component\\Config\\ConfigCacheInterface' => $vendorDir . '/symfony/config/ConfigCacheInterface.php',
+    'Symfony\\Component\\Config\\Definition\\ArrayNode' => $vendorDir . '/symfony/config/Definition/ArrayNode.php',
+    'Symfony\\Component\\Config\\Definition\\BaseNode' => $vendorDir . '/symfony/config/Definition/BaseNode.php',
+    'Symfony\\Component\\Config\\Definition\\BooleanNode' => $vendorDir . '/symfony/config/Definition/BooleanNode.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\ArrayNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/ArrayNodeDefinition.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\BooleanNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/BooleanNodeDefinition.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\EnumNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/EnumNodeDefinition.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\ExprBuilder' => $vendorDir . '/symfony/config/Definition/Builder/ExprBuilder.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\FloatNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/FloatNodeDefinition.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\IntegerNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/IntegerNodeDefinition.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\MergeBuilder' => $vendorDir . '/symfony/config/Definition/Builder/MergeBuilder.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\NodeBuilder' => $vendorDir . '/symfony/config/Definition/Builder/NodeBuilder.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/NodeDefinition.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\NodeParentInterface' => $vendorDir . '/symfony/config/Definition/Builder/NodeParentInterface.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\NormalizationBuilder' => $vendorDir . '/symfony/config/Definition/Builder/NormalizationBuilder.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\NumericNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/NumericNodeDefinition.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\ParentNodeDefinitionInterface' => $vendorDir . '/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\ScalarNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/ScalarNodeDefinition.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder' => $vendorDir . '/symfony/config/Definition/Builder/TreeBuilder.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\ValidationBuilder' => $vendorDir . '/symfony/config/Definition/Builder/ValidationBuilder.php',
+    'Symfony\\Component\\Config\\Definition\\Builder\\VariableNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/VariableNodeDefinition.php',
+    'Symfony\\Component\\Config\\Definition\\ConfigurationInterface' => $vendorDir . '/symfony/config/Definition/ConfigurationInterface.php',
+    'Symfony\\Component\\Config\\Definition\\Dumper\\XmlReferenceDumper' => $vendorDir . '/symfony/config/Definition/Dumper/XmlReferenceDumper.php',
+    'Symfony\\Component\\Config\\Definition\\Dumper\\YamlReferenceDumper' => $vendorDir . '/symfony/config/Definition/Dumper/YamlReferenceDumper.php',
+    'Symfony\\Component\\Config\\Definition\\EnumNode' => $vendorDir . '/symfony/config/Definition/EnumNode.php',
+    'Symfony\\Component\\Config\\Definition\\Exception\\DuplicateKeyException' => $vendorDir . '/symfony/config/Definition/Exception/DuplicateKeyException.php',
+    'Symfony\\Component\\Config\\Definition\\Exception\\Exception' => $vendorDir . '/symfony/config/Definition/Exception/Exception.php',
+    'Symfony\\Component\\Config\\Definition\\Exception\\ForbiddenOverwriteException' => $vendorDir . '/symfony/config/Definition/Exception/ForbiddenOverwriteException.php',
+    'Symfony\\Component\\Config\\Definition\\Exception\\InvalidConfigurationException' => $vendorDir . '/symfony/config/Definition/Exception/InvalidConfigurationException.php',
+    'Symfony\\Component\\Config\\Definition\\Exception\\InvalidDefinitionException' => $vendorDir . '/symfony/config/Definition/Exception/InvalidDefinitionException.php',
+    'Symfony\\Component\\Config\\Definition\\Exception\\InvalidTypeException' => $vendorDir . '/symfony/config/Definition/Exception/InvalidTypeException.php',
+    'Symfony\\Component\\Config\\Definition\\Exception\\UnsetKeyException' => $vendorDir . '/symfony/config/Definition/Exception/UnsetKeyException.php',
+    'Symfony\\Component\\Config\\Definition\\FloatNode' => $vendorDir . '/symfony/config/Definition/FloatNode.php',
+    'Symfony\\Component\\Config\\Definition\\IntegerNode' => $vendorDir . '/symfony/config/Definition/IntegerNode.php',
+    'Symfony\\Component\\Config\\Definition\\NodeInterface' => $vendorDir . '/symfony/config/Definition/NodeInterface.php',
+    'Symfony\\Component\\Config\\Definition\\NumericNode' => $vendorDir . '/symfony/config/Definition/NumericNode.php',
+    'Symfony\\Component\\Config\\Definition\\Processor' => $vendorDir . '/symfony/config/Definition/Processor.php',
+    'Symfony\\Component\\Config\\Definition\\PrototypeNodeInterface' => $vendorDir . '/symfony/config/Definition/PrototypeNodeInterface.php',
+    'Symfony\\Component\\Config\\Definition\\PrototypedArrayNode' => $vendorDir . '/symfony/config/Definition/PrototypedArrayNode.php',
+    'Symfony\\Component\\Config\\Definition\\ReferenceDumper' => $vendorDir . '/symfony/config/Definition/ReferenceDumper.php',
+    'Symfony\\Component\\Config\\Definition\\ScalarNode' => $vendorDir . '/symfony/config/Definition/ScalarNode.php',
+    'Symfony\\Component\\Config\\Definition\\VariableNode' => $vendorDir . '/symfony/config/Definition/VariableNode.php',
+    'Symfony\\Component\\Config\\Exception\\FileLoaderImportCircularReferenceException' => $vendorDir . '/symfony/config/Exception/FileLoaderImportCircularReferenceException.php',
+    'Symfony\\Component\\Config\\Exception\\FileLoaderLoadException' => $vendorDir . '/symfony/config/Exception/FileLoaderLoadException.php',
+    'Symfony\\Component\\Config\\FileLocator' => $vendorDir . '/symfony/config/FileLocator.php',
+    'Symfony\\Component\\Config\\FileLocatorInterface' => $vendorDir . '/symfony/config/FileLocatorInterface.php',
+    'Symfony\\Component\\Config\\Loader\\DelegatingLoader' => $vendorDir . '/symfony/config/Loader/DelegatingLoader.php',
+    'Symfony\\Component\\Config\\Loader\\FileLoader' => $vendorDir . '/symfony/config/Loader/FileLoader.php',
+    'Symfony\\Component\\Config\\Loader\\Loader' => $vendorDir . '/symfony/config/Loader/Loader.php',
+    'Symfony\\Component\\Config\\Loader\\LoaderInterface' => $vendorDir . '/symfony/config/Loader/LoaderInterface.php',
+    'Symfony\\Component\\Config\\Loader\\LoaderResolver' => $vendorDir . '/symfony/config/Loader/LoaderResolver.php',
+    'Symfony\\Component\\Config\\Loader\\LoaderResolverInterface' => $vendorDir . '/symfony/config/Loader/LoaderResolverInterface.php',
+    'Symfony\\Component\\Config\\ResourceCheckerConfigCache' => $vendorDir . '/symfony/config/ResourceCheckerConfigCache.php',
+    'Symfony\\Component\\Config\\ResourceCheckerConfigCacheFactory' => $vendorDir . '/symfony/config/ResourceCheckerConfigCacheFactory.php',
+    'Symfony\\Component\\Config\\ResourceCheckerInterface' => $vendorDir . '/symfony/config/ResourceCheckerInterface.php',
+    'Symfony\\Component\\Config\\Resource\\BCResourceInterfaceChecker' => $vendorDir . '/symfony/config/Resource/BCResourceInterfaceChecker.php',
+    'Symfony\\Component\\Config\\Resource\\DirectoryResource' => $vendorDir . '/symfony/config/Resource/DirectoryResource.php',
+    'Symfony\\Component\\Config\\Resource\\FileExistenceResource' => $vendorDir . '/symfony/config/Resource/FileExistenceResource.php',
+    'Symfony\\Component\\Config\\Resource\\FileResource' => $vendorDir . '/symfony/config/Resource/FileResource.php',
+    'Symfony\\Component\\Config\\Resource\\ResourceInterface' => $vendorDir . '/symfony/config/Resource/ResourceInterface.php',
+    'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceChecker' => $vendorDir . '/symfony/config/Resource/SelfCheckingResourceChecker.php',
+    'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceInterface' => $vendorDir . '/symfony/config/Resource/SelfCheckingResourceInterface.php',
+    'Symfony\\Component\\Config\\Util\\XmlUtils' => $vendorDir . '/symfony/config/Util/XmlUtils.php',
+    'Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php',
+    'Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php',
+    'Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php',
+    'Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php',
+    'Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php',
+    'Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php',
+    'Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php',
+    'Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Descriptor/DescriptorInterface.php',
+    'Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Descriptor/JsonDescriptor.php',
+    'Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Descriptor/MarkdownDescriptor.php',
+    'Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Descriptor/TextDescriptor.php',
+    'Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Descriptor/XmlDescriptor.php',
+    'Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => $vendorDir . '/symfony/console/Event/ConsoleCommandEvent.php',
+    'Symfony\\Component\\Console\\Event\\ConsoleEvent' => $vendorDir . '/symfony/console/Event/ConsoleEvent.php',
+    'Symfony\\Component\\Console\\Event\\ConsoleExceptionEvent' => $vendorDir . '/symfony/console/Event/ConsoleExceptionEvent.php',
+    'Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => $vendorDir . '/symfony/console/Event/ConsoleTerminateEvent.php',
+    'Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php',
+    'Symfony\\Component\\Console\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php',
+    'Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php',
+    'Symfony\\Component\\Console\\Exception\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php',
+    'Symfony\\Component\\Console\\Exception\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php',
+    'Symfony\\Component\\Console\\Exception\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php',
+    'Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php',
+    'Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php',
+    'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php',
+    'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php',
+    'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php',
+    'Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php',
+    'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php',
+    'Symfony\\Component\\Console\\Helper\\DialogHelper' => $vendorDir . '/symfony/console/Helper/DialogHelper.php',
+    'Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php',
+    'Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php',
+    'Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php',
+    'Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Helper/HelperSet.php',
+    'Symfony\\Component\\Console\\Helper\\InputAwareHelper' => $vendorDir . '/symfony/console/Helper/InputAwareHelper.php',
+    'Symfony\\Component\\Console\\Helper\\ProcessHelper' => $vendorDir . '/symfony/console/Helper/ProcessHelper.php',
+    'Symfony\\Component\\Console\\Helper\\ProgressBar' => $vendorDir . '/symfony/console/Helper/ProgressBar.php',
+    'Symfony\\Component\\Console\\Helper\\ProgressHelper' => $vendorDir . '/symfony/console/Helper/ProgressHelper.php',
+    'Symfony\\Component\\Console\\Helper\\ProgressIndicator' => $vendorDir . '/symfony/console/Helper/ProgressIndicator.php',
+    'Symfony\\Component\\Console\\Helper\\QuestionHelper' => $vendorDir . '/symfony/console/Helper/QuestionHelper.php',
+    'Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php',
+    'Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Helper/Table.php',
+    'Symfony\\Component\\Console\\Helper\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php',
+    'Symfony\\Component\\Console\\Helper\\TableHelper' => $vendorDir . '/symfony/console/Helper/TableHelper.php',
+    'Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php',
+    'Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php',
+    'Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php',
+    'Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Input/ArrayInput.php',
+    'Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Input/Input.php',
+    'Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Input/InputArgument.php',
+    'Symfony\\Component\\Console\\Input\\InputAwareInterface' => $vendorDir . '/symfony/console/Input/InputAwareInterface.php',
+    'Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Input/InputDefinition.php',
+    'Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Input/InputInterface.php',
+    'Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Input/InputOption.php',
+    'Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Input/StringInput.php',
+    'Symfony\\Component\\Console\\Logger\\ConsoleLogger' => $vendorDir . '/symfony/console/Logger/ConsoleLogger.php',
+    'Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php',
+    'Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php',
+    'Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php',
+    'Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php',
+    'Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Output/Output.php',
+    'Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php',
+    'Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php',
+    'Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php',
+    'Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php',
+    'Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Question/Question.php',
+    'Symfony\\Component\\Console\\Shell' => $vendorDir . '/symfony/console/Shell.php',
+    'Symfony\\Component\\Console\\Style\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php',
+    'Symfony\\Component\\Console\\Style\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php',
+    'Symfony\\Component\\Console\\Style\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php',
+    'Symfony\\Component\\Console\\Tester\\ApplicationTester' => $vendorDir . '/symfony/console/Tester/ApplicationTester.php',
+    'Symfony\\Component\\Console\\Tester\\CommandTester' => $vendorDir . '/symfony/console/Tester/CommandTester.php',
+    'Symfony\\Component\\Debug\\BufferingLogger' => $vendorDir . '/symfony/debug/BufferingLogger.php',
+    'Symfony\\Component\\Debug\\Debug' => $vendorDir . '/symfony/debug/Debug.php',
+    'Symfony\\Component\\Debug\\DebugClassLoader' => $vendorDir . '/symfony/debug/DebugClassLoader.php',
+    'Symfony\\Component\\Debug\\ErrorHandler' => $vendorDir . '/symfony/debug/ErrorHandler.php',
+    'Symfony\\Component\\Debug\\ErrorHandlerCanary' => $vendorDir . '/symfony/debug/ErrorHandler.php',
+    'Symfony\\Component\\Debug\\ExceptionHandler' => $vendorDir . '/symfony/debug/ExceptionHandler.php',
+    'Symfony\\Component\\Debug\\Exception\\ClassNotFoundException' => $vendorDir . '/symfony/debug/Exception/ClassNotFoundException.php',
+    'Symfony\\Component\\Debug\\Exception\\ContextErrorException' => $vendorDir . '/symfony/debug/Exception/ContextErrorException.php',
+    'Symfony\\Component\\Debug\\Exception\\DummyException' => $vendorDir . '/symfony/debug/Exception/DummyException.php',
+    'Symfony\\Component\\Debug\\Exception\\FatalErrorException' => $vendorDir . '/symfony/debug/Exception/FatalErrorException.php',
+    'Symfony\\Component\\Debug\\Exception\\FatalThrowableError' => $vendorDir . '/symfony/debug/Exception/FatalThrowableError.php',
+    'Symfony\\Component\\Debug\\Exception\\FlattenException' => $vendorDir . '/symfony/debug/Exception/FlattenException.php',
+    'Symfony\\Component\\Debug\\Exception\\OutOfMemoryException' => $vendorDir . '/symfony/debug/Exception/OutOfMemoryException.php',
+    'Symfony\\Component\\Debug\\Exception\\UndefinedFunctionException' => $vendorDir . '/symfony/debug/Exception/UndefinedFunctionException.php',
+    'Symfony\\Component\\Debug\\Exception\\UndefinedMethodException' => $vendorDir . '/symfony/debug/Exception/UndefinedMethodException.php',
+    'Symfony\\Component\\Debug\\FatalErrorHandler\\ClassNotFoundFatalErrorHandler' => $vendorDir . '/symfony/debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php',
+    'Symfony\\Component\\Debug\\FatalErrorHandler\\FatalErrorHandlerInterface' => $vendorDir . '/symfony/debug/FatalErrorHandler/FatalErrorHandlerInterface.php',
+    'Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedFunctionFatalErrorHandler' => $vendorDir . '/symfony/debug/FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php',
+    'Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedMethodFatalErrorHandler' => $vendorDir . '/symfony/debug/FatalErrorHandler/UndefinedMethodFatalErrorHandler.php',
+    'Symfony\\Component\\DependencyInjection\\Alias' => $vendorDir . '/symfony/dependency-injection/Alias.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\AnalyzeServiceReferencesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\AutoAliasServicePass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutoAliasServicePass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\AutowirePass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutowirePass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\CheckCircularReferencesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\CheckDefinitionValidityPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\CheckExceptionOnInvalidReferenceBehaviorPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\CheckReferenceValidityPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\Compiler' => $vendorDir . '/symfony/dependency-injection/Compiler/Compiler.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface' => $vendorDir . '/symfony/dependency-injection/Compiler/CompilerPassInterface.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\DecoratorServicePass' => $vendorDir . '/symfony/dependency-injection/Compiler/DecoratorServicePass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\ExtensionCompilerPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\InlineServiceDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\LoggingFormatter' => $vendorDir . '/symfony/dependency-injection/Compiler/LoggingFormatter.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\MergeExtensionConfigurationPass' => $vendorDir . '/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\PassConfig' => $vendorDir . '/symfony/dependency-injection/Compiler/PassConfig.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\RemoveAbstractDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\RemovePrivateAliasesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\RemoveUnusedDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\RepeatablePassInterface' => $vendorDir . '/symfony/dependency-injection/Compiler/RepeatablePassInterface.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\RepeatedPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RepeatedPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\ReplaceAliasByActualDefinitionPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveDefinitionTemplatesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveDefinitionTemplatesPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveInvalidReferencesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveParameterPlaceHoldersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveReferencesToAliasesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraph' => $vendorDir . '/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraphEdge' => $vendorDir . '/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php',
+    'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraphNode' => $vendorDir . '/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php',
+    'Symfony\\Component\\DependencyInjection\\Container' => $vendorDir . '/symfony/dependency-injection/Container.php',
+    'Symfony\\Component\\DependencyInjection\\ContainerAware' => $vendorDir . '/symfony/dependency-injection/ContainerAware.php',
+    'Symfony\\Component\\DependencyInjection\\ContainerAwareInterface' => $vendorDir . '/symfony/dependency-injection/ContainerAwareInterface.php',
+    'Symfony\\Component\\DependencyInjection\\ContainerAwareTrait' => $vendorDir . '/symfony/dependency-injection/ContainerAwareTrait.php',
+    'Symfony\\Component\\DependencyInjection\\ContainerBuilder' => $vendorDir . '/symfony/dependency-injection/ContainerBuilder.php',
+    'Symfony\\Component\\DependencyInjection\\ContainerInterface' => $vendorDir . '/symfony/dependency-injection/ContainerInterface.php',
+    'Symfony\\Component\\DependencyInjection\\Definition' => $vendorDir . '/symfony/dependency-injection/Definition.php',
+    'Symfony\\Component\\DependencyInjection\\DefinitionDecorator' => $vendorDir . '/symfony/dependency-injection/DefinitionDecorator.php',
+    'Symfony\\Component\\DependencyInjection\\Dumper\\Dumper' => $vendorDir . '/symfony/dependency-injection/Dumper/Dumper.php',
+    'Symfony\\Component\\DependencyInjection\\Dumper\\DumperInterface' => $vendorDir . '/symfony/dependency-injection/Dumper/DumperInterface.php',
+    'Symfony\\Component\\DependencyInjection\\Dumper\\GraphvizDumper' => $vendorDir . '/symfony/dependency-injection/Dumper/GraphvizDumper.php',
+    'Symfony\\Component\\DependencyInjection\\Dumper\\PhpDumper' => $vendorDir . '/symfony/dependency-injection/Dumper/PhpDumper.php',
+    'Symfony\\Component\\DependencyInjection\\Dumper\\XmlDumper' => $vendorDir . '/symfony/dependency-injection/Dumper/XmlDumper.php',
+    'Symfony\\Component\\DependencyInjection\\Dumper\\YamlDumper' => $vendorDir . '/symfony/dependency-injection/Dumper/YamlDumper.php',
+    'Symfony\\Component\\DependencyInjection\\Exception\\BadMethodCallException' => $vendorDir . '/symfony/dependency-injection/Exception/BadMethodCallException.php',
+    'Symfony\\Component\\DependencyInjection\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/dependency-injection/Exception/ExceptionInterface.php',
+    'Symfony\\Component\\DependencyInjection\\Exception\\InactiveScopeException' => $vendorDir . '/symfony/dependency-injection/Exception/InactiveScopeException.php',
+    'Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/dependency-injection/Exception/InvalidArgumentException.php',
+    'Symfony\\Component\\DependencyInjection\\Exception\\LogicException' => $vendorDir . '/symfony/dependency-injection/Exception/LogicException.php',
+    'Symfony\\Component\\DependencyInjection\\Exception\\OutOfBoundsException' => $vendorDir . '/symfony/dependency-injection/Exception/OutOfBoundsException.php',
+    'Symfony\\Component\\DependencyInjection\\Exception\\ParameterCircularReferenceException' => $vendorDir . '/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php',
+    'Symfony\\Component\\DependencyInjection\\Exception\\ParameterNotFoundException' => $vendorDir . '/symfony/dependency-injection/Exception/ParameterNotFoundException.php',
+    'Symfony\\Component\\DependencyInjection\\Exception\\RuntimeException' => $vendorDir . '/symfony/dependency-injection/Exception/RuntimeException.php',
+    'Symfony\\Component\\DependencyInjection\\Exception\\ScopeCrossingInjectionException' => $vendorDir . '/symfony/dependency-injection/Exception/ScopeCrossingInjectionException.php',
+    'Symfony\\Component\\DependencyInjection\\Exception\\ScopeWideningInjectionException' => $vendorDir . '/symfony/dependency-injection/Exception/ScopeWideningInjectionException.php',
+    'Symfony\\Component\\DependencyInjection\\Exception\\ServiceCircularReferenceException' => $vendorDir . '/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php',
+    'Symfony\\Component\\DependencyInjection\\Exception\\ServiceNotFoundException' => $vendorDir . '/symfony/dependency-injection/Exception/ServiceNotFoundException.php',
+    'Symfony\\Component\\DependencyInjection\\ExpressionLanguage' => $vendorDir . '/symfony/dependency-injection/ExpressionLanguage.php',
+    'Symfony\\Component\\DependencyInjection\\ExpressionLanguageProvider' => $vendorDir . '/symfony/dependency-injection/ExpressionLanguageProvider.php',
+    'Symfony\\Component\\DependencyInjection\\Extension\\ConfigurationExtensionInterface' => $vendorDir . '/symfony/dependency-injection/Extension/ConfigurationExtensionInterface.php',
+    'Symfony\\Component\\DependencyInjection\\Extension\\Extension' => $vendorDir . '/symfony/dependency-injection/Extension/Extension.php',
+    'Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface' => $vendorDir . '/symfony/dependency-injection/Extension/ExtensionInterface.php',
+    'Symfony\\Component\\DependencyInjection\\Extension\\PrependExtensionInterface' => $vendorDir . '/symfony/dependency-injection/Extension/PrependExtensionInterface.php',
+    'Symfony\\Component\\DependencyInjection\\IntrospectableContainerInterface' => $vendorDir . '/symfony/dependency-injection/IntrospectableContainerInterface.php',
+    'Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\InstantiatorInterface' => $vendorDir . '/symfony/dependency-injection/LazyProxy/Instantiator/InstantiatorInterface.php',
+    'Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\RealServiceInstantiator' => $vendorDir . '/symfony/dependency-injection/LazyProxy/Instantiator/RealServiceInstantiator.php',
+    'Symfony\\Component\\DependencyInjection\\LazyProxy\\PhpDumper\\DumperInterface' => $vendorDir . '/symfony/dependency-injection/LazyProxy/PhpDumper/DumperInterface.php',
+    'Symfony\\Component\\DependencyInjection\\LazyProxy\\PhpDumper\\NullDumper' => $vendorDir . '/symfony/dependency-injection/LazyProxy/PhpDumper/NullDumper.php',
+    'Symfony\\Component\\DependencyInjection\\Loader\\ClosureLoader' => $vendorDir . '/symfony/dependency-injection/Loader/ClosureLoader.php',
+    'Symfony\\Component\\DependencyInjection\\Loader\\DirectoryLoader' => $vendorDir . '/symfony/dependency-injection/Loader/DirectoryLoader.php',
+    'Symfony\\Component\\DependencyInjection\\Loader\\FileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/FileLoader.php',
+    'Symfony\\Component\\DependencyInjection\\Loader\\IniFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/IniFileLoader.php',
+    'Symfony\\Component\\DependencyInjection\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/PhpFileLoader.php',
+    'Symfony\\Component\\DependencyInjection\\Loader\\XmlFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/XmlFileLoader.php',
+    'Symfony\\Component\\DependencyInjection\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/YamlFileLoader.php',
+    'Symfony\\Component\\DependencyInjection\\Parameter' => $vendorDir . '/symfony/dependency-injection/Parameter.php',
+    'Symfony\\Component\\DependencyInjection\\ParameterBag\\FrozenParameterBag' => $vendorDir . '/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php',
+    'Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag' => $vendorDir . '/symfony/dependency-injection/ParameterBag/ParameterBag.php',
+    'Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBagInterface' => $vendorDir . '/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php',
+    'Symfony\\Component\\DependencyInjection\\Reference' => $vendorDir . '/symfony/dependency-injection/Reference.php',
+    'Symfony\\Component\\DependencyInjection\\ResettableContainerInterface' => $vendorDir . '/symfony/dependency-injection/ResettableContainerInterface.php',
+    'Symfony\\Component\\DependencyInjection\\Scope' => $vendorDir . '/symfony/dependency-injection/Scope.php',
+    'Symfony\\Component\\DependencyInjection\\ScopeInterface' => $vendorDir . '/symfony/dependency-injection/ScopeInterface.php',
+    'Symfony\\Component\\DependencyInjection\\SimpleXMLElement' => $vendorDir . '/symfony/dependency-injection/SimpleXMLElement.php',
+    'Symfony\\Component\\DependencyInjection\\TaggedContainerInterface' => $vendorDir . '/symfony/dependency-injection/TaggedContainerInterface.php',
+    'Symfony\\Component\\DependencyInjection\\Variable' => $vendorDir . '/symfony/dependency-injection/Variable.php',
+    'Symfony\\Component\\EventDispatcher\\ContainerAwareEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/ContainerAwareEventDispatcher.php',
+    'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php',
+    'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php',
+    'Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => $vendorDir . '/symfony/event-dispatcher/Debug/WrappedListener.php',
+    'Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => $vendorDir . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php',
+    'Symfony\\Component\\EventDispatcher\\Event' => $vendorDir . '/symfony/event-dispatcher/Event.php',
+    'Symfony\\Component\\EventDispatcher\\EventDispatcher' => $vendorDir . '/symfony/event-dispatcher/EventDispatcher.php',
+    'Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher/EventDispatcherInterface.php',
+    'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => $vendorDir . '/symfony/event-dispatcher/EventSubscriberInterface.php',
+    'Symfony\\Component\\EventDispatcher\\GenericEvent' => $vendorDir . '/symfony/event-dispatcher/GenericEvent.php',
+    'Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/ImmutableEventDispatcher.php',
+    'Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/ExceptionInterface.php',
+    'Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/filesystem/Exception/FileNotFoundException.php',
+    'Symfony\\Component\\Filesystem\\Exception\\IOException' => $vendorDir . '/symfony/filesystem/Exception/IOException.php',
+    'Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/IOExceptionInterface.php',
+    'Symfony\\Component\\Filesystem\\Filesystem' => $vendorDir . '/symfony/filesystem/Filesystem.php',
+    'Symfony\\Component\\Filesystem\\LockHandler' => $vendorDir . '/symfony/filesystem/LockHandler.php',
+    'Symfony\\Component\\Finder\\Adapter\\AbstractAdapter' => $vendorDir . '/symfony/finder/Adapter/AbstractAdapter.php',
+    'Symfony\\Component\\Finder\\Adapter\\AbstractFindAdapter' => $vendorDir . '/symfony/finder/Adapter/AbstractFindAdapter.php',
+    'Symfony\\Component\\Finder\\Adapter\\AdapterInterface' => $vendorDir . '/symfony/finder/Adapter/AdapterInterface.php',
+    'Symfony\\Component\\Finder\\Adapter\\BsdFindAdapter' => $vendorDir . '/symfony/finder/Adapter/BsdFindAdapter.php',
+    'Symfony\\Component\\Finder\\Adapter\\GnuFindAdapter' => $vendorDir . '/symfony/finder/Adapter/GnuFindAdapter.php',
+    'Symfony\\Component\\Finder\\Adapter\\PhpAdapter' => $vendorDir . '/symfony/finder/Adapter/PhpAdapter.php',
+    'Symfony\\Component\\Finder\\Comparator\\Comparator' => $vendorDir . '/symfony/finder/Comparator/Comparator.php',
+    'Symfony\\Component\\Finder\\Comparator\\DateComparator' => $vendorDir . '/symfony/finder/Comparator/DateComparator.php',
+    'Symfony\\Component\\Finder\\Comparator\\NumberComparator' => $vendorDir . '/symfony/finder/Comparator/NumberComparator.php',
+    'Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/finder/Exception/AccessDeniedException.php',
+    'Symfony\\Component\\Finder\\Exception\\AdapterFailureException' => $vendorDir . '/symfony/finder/Exception/AdapterFailureException.php',
+    'Symfony\\Component\\Finder\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/finder/Exception/ExceptionInterface.php',
+    'Symfony\\Component\\Finder\\Exception\\OperationNotPermitedException' => $vendorDir . '/symfony/finder/Exception/OperationNotPermitedException.php',
+    'Symfony\\Component\\Finder\\Exception\\ShellCommandFailureException' => $vendorDir . '/symfony/finder/Exception/ShellCommandFailureException.php',
+    'Symfony\\Component\\Finder\\Expression\\Expression' => $vendorDir . '/symfony/finder/Expression/Expression.php',
+    'Symfony\\Component\\Finder\\Expression\\Glob' => $vendorDir . '/symfony/finder/Expression/Glob.php',
+    'Symfony\\Component\\Finder\\Expression\\Regex' => $vendorDir . '/symfony/finder/Expression/Regex.php',
+    'Symfony\\Component\\Finder\\Expression\\ValueInterface' => $vendorDir . '/symfony/finder/Expression/ValueInterface.php',
+    'Symfony\\Component\\Finder\\Finder' => $vendorDir . '/symfony/finder/Finder.php',
+    'Symfony\\Component\\Finder\\Glob' => $vendorDir . '/symfony/finder/Glob.php',
+    'Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => $vendorDir . '/symfony/finder/Iterator/CustomFilterIterator.php',
+    'Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DateRangeFilterIterator.php',
+    'Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DepthRangeFilterIterator.php',
+    'Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => $vendorDir . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php',
+    'Symfony\\Component\\Finder\\Iterator\\FilePathsIterator' => $vendorDir . '/symfony/finder/Iterator/FilePathsIterator.php',
+    'Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FileTypeFilterIterator.php',
+    'Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilecontentFilterIterator.php',
+    'Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilenameFilterIterator.php',
+    'Symfony\\Component\\Finder\\Iterator\\FilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilterIterator.php',
+    'Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => $vendorDir . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php',
+    'Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => $vendorDir . '/symfony/finder/Iterator/PathFilterIterator.php',
+    'Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => $vendorDir . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php',
+    'Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/SizeRangeFilterIterator.php',
+    'Symfony\\Component\\Finder\\Iterator\\SortableIterator' => $vendorDir . '/symfony/finder/Iterator/SortableIterator.php',
+    'Symfony\\Component\\Finder\\Shell\\Command' => $vendorDir . '/symfony/finder/Shell/Command.php',
+    'Symfony\\Component\\Finder\\Shell\\Shell' => $vendorDir . '/symfony/finder/Shell/Shell.php',
+    'Symfony\\Component\\Finder\\SplFileInfo' => $vendorDir . '/symfony/finder/SplFileInfo.php',
+    'Symfony\\Component\\HttpFoundation\\AcceptHeader' => $vendorDir . '/symfony/http-foundation/AcceptHeader.php',
+    'Symfony\\Component\\HttpFoundation\\AcceptHeaderItem' => $vendorDir . '/symfony/http-foundation/AcceptHeaderItem.php',
+    'Symfony\\Component\\HttpFoundation\\ApacheRequest' => $vendorDir . '/symfony/http-foundation/ApacheRequest.php',
+    'Symfony\\Component\\HttpFoundation\\BinaryFileResponse' => $vendorDir . '/symfony/http-foundation/BinaryFileResponse.php',
+    'Symfony\\Component\\HttpFoundation\\Cookie' => $vendorDir . '/symfony/http-foundation/Cookie.php',
+    'Symfony\\Component\\HttpFoundation\\Exception\\ConflictingHeadersException' => $vendorDir . '/symfony/http-foundation/Exception/ConflictingHeadersException.php',
+    'Symfony\\Component\\HttpFoundation\\ExpressionRequestMatcher' => $vendorDir . '/symfony/http-foundation/ExpressionRequestMatcher.php',
+    'Symfony\\Component\\HttpFoundation\\FileBag' => $vendorDir . '/symfony/http-foundation/FileBag.php',
+    'Symfony\\Component\\HttpFoundation\\File\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/http-foundation/File/Exception/AccessDeniedException.php',
+    'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileException' => $vendorDir . '/symfony/http-foundation/File/Exception/FileException.php',
+    'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/http-foundation/File/Exception/FileNotFoundException.php',
+    'Symfony\\Component\\HttpFoundation\\File\\Exception\\UnexpectedTypeException' => $vendorDir . '/symfony/http-foundation/File/Exception/UnexpectedTypeException.php',
+    'Symfony\\Component\\HttpFoundation\\File\\Exception\\UploadException' => $vendorDir . '/symfony/http-foundation/File/Exception/UploadException.php',
+    'Symfony\\Component\\HttpFoundation\\File\\File' => $vendorDir . '/symfony/http-foundation/File/File.php',
+    'Symfony\\Component\\HttpFoundation\\File\\MimeType\\ExtensionGuesser' => $vendorDir . '/symfony/http-foundation/File/MimeType/ExtensionGuesser.php',
+    'Symfony\\Component\\HttpFoundation\\File\\MimeType\\ExtensionGuesserInterface' => $vendorDir . '/symfony/http-foundation/File/MimeType/ExtensionGuesserInterface.php',
+    'Symfony\\Component\\HttpFoundation\\File\\MimeType\\FileBinaryMimeTypeGuesser' => $vendorDir . '/symfony/http-foundation/File/MimeType/FileBinaryMimeTypeGuesser.php',
+    'Symfony\\Component\\HttpFoundation\\File\\MimeType\\FileinfoMimeTypeGuesser' => $vendorDir . '/symfony/http-foundation/File/MimeType/FileinfoMimeTypeGuesser.php',
+    'Symfony\\Component\\HttpFoundation\\File\\MimeType\\MimeTypeExtensionGuesser' => $vendorDir . '/symfony/http-foundation/File/MimeType/MimeTypeExtensionGuesser.php',
+    'Symfony\\Component\\HttpFoundation\\File\\MimeType\\MimeTypeGuesser' => $vendorDir . '/symfony/http-foundation/File/MimeType/MimeTypeGuesser.php',
+    'Symfony\\Component\\HttpFoundation\\File\\MimeType\\MimeTypeGuesserInterface' => $vendorDir . '/symfony/http-foundation/File/MimeType/MimeTypeGuesserInterface.php',
+    'Symfony\\Component\\HttpFoundation\\File\\UploadedFile' => $vendorDir . '/symfony/http-foundation/File/UploadedFile.php',
+    'Symfony\\Component\\HttpFoundation\\HeaderBag' => $vendorDir . '/symfony/http-foundation/HeaderBag.php',
+    'Symfony\\Component\\HttpFoundation\\IpUtils' => $vendorDir . '/symfony/http-foundation/IpUtils.php',
+    'Symfony\\Component\\HttpFoundation\\JsonResponse' => $vendorDir . '/symfony/http-foundation/JsonResponse.php',
+    'Symfony\\Component\\HttpFoundation\\ParameterBag' => $vendorDir . '/symfony/http-foundation/ParameterBag.php',
+    'Symfony\\Component\\HttpFoundation\\RedirectResponse' => $vendorDir . '/symfony/http-foundation/RedirectResponse.php',
+    'Symfony\\Component\\HttpFoundation\\Request' => $vendorDir . '/symfony/http-foundation/Request.php',
+    'Symfony\\Component\\HttpFoundation\\RequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher.php',
+    'Symfony\\Component\\HttpFoundation\\RequestMatcherInterface' => $vendorDir . '/symfony/http-foundation/RequestMatcherInterface.php',
+    'Symfony\\Component\\HttpFoundation\\RequestStack' => $vendorDir . '/symfony/http-foundation/RequestStack.php',
+    'Symfony\\Component\\HttpFoundation\\Response' => $vendorDir . '/symfony/http-foundation/Response.php',
+    'Symfony\\Component\\HttpFoundation\\ResponseHeaderBag' => $vendorDir . '/symfony/http-foundation/ResponseHeaderBag.php',
+    'Symfony\\Component\\HttpFoundation\\ServerBag' => $vendorDir . '/symfony/http-foundation/ServerBag.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBag' => $vendorDir . '/symfony/http-foundation/Session/Attribute/AttributeBag.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBagInterface' => $vendorDir . '/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\NamespacedAttributeBag' => $vendorDir . '/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Flash\\AutoExpireFlashBag' => $vendorDir . '/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBag' => $vendorDir . '/symfony/http-foundation/Session/Flash/FlashBag.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBagInterface' => $vendorDir . '/symfony/http-foundation/Session/Flash/FlashBagInterface.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Session' => $vendorDir . '/symfony/http-foundation/Session/Session.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionBagInterface.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\SessionInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionInterface.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\LegacyPdoSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/LegacyPdoSessionHandler.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcacheSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MemcacheSessionHandler.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcachedSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MongoDbSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeFileSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/NativeSessionHandler.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NullSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\PdoSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\WriteCheckSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/WriteCheckSessionHandler.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MetadataBag' => $vendorDir . '/symfony/http-foundation/Session/Storage/MetadataBag.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockArraySessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/NativeSessionStorage.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy' => $vendorDir . '/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\NativeProxy' => $vendorDir . '/symfony/http-foundation/Session/Storage/Proxy/NativeProxy.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\SessionHandlerProxy' => $vendorDir . '/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php',
+    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface' => $vendorDir . '/symfony/http-foundation/Session/Storage/SessionStorageInterface.php',
+    'Symfony\\Component\\HttpFoundation\\StreamedResponse' => $vendorDir . '/symfony/http-foundation/StreamedResponse.php',
+    'Symfony\\Component\\HttpKernel\\Bundle\\Bundle' => $vendorDir . '/symfony/http-kernel/Bundle/Bundle.php',
+    'Symfony\\Component\\HttpKernel\\Bundle\\BundleInterface' => $vendorDir . '/symfony/http-kernel/Bundle/BundleInterface.php',
+    'Symfony\\Component\\HttpKernel\\CacheClearer\\CacheClearerInterface' => $vendorDir . '/symfony/http-kernel/CacheClearer/CacheClearerInterface.php',
+    'Symfony\\Component\\HttpKernel\\CacheClearer\\ChainCacheClearer' => $vendorDir . '/symfony/http-kernel/CacheClearer/ChainCacheClearer.php',
+    'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmer' => $vendorDir . '/symfony/http-kernel/CacheWarmer/CacheWarmer.php',
+    'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerAggregate' => $vendorDir . '/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php',
+    'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerInterface' => $vendorDir . '/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.php',
+    'Symfony\\Component\\HttpKernel\\CacheWarmer\\WarmableInterface' => $vendorDir . '/symfony/http-kernel/CacheWarmer/WarmableInterface.php',
+    'Symfony\\Component\\HttpKernel\\Client' => $vendorDir . '/symfony/http-kernel/Client.php',
+    'Symfony\\Component\\HttpKernel\\Config\\EnvParametersResource' => $vendorDir . '/symfony/http-kernel/Config/EnvParametersResource.php',
+    'Symfony\\Component\\HttpKernel\\Config\\FileLocator' => $vendorDir . '/symfony/http-kernel/Config/FileLocator.php',
+    'Symfony\\Component\\HttpKernel\\Controller\\ControllerReference' => $vendorDir . '/symfony/http-kernel/Controller/ControllerReference.php',
+    'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver' => $vendorDir . '/symfony/http-kernel/Controller/ControllerResolver.php',
+    'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface' => $vendorDir . '/symfony/http-kernel/Controller/ControllerResolverInterface.php',
+    'Symfony\\Component\\HttpKernel\\Controller\\TraceableControllerResolver' => $vendorDir . '/symfony/http-kernel/Controller/TraceableControllerResolver.php',
+    'Symfony\\Component\\HttpKernel\\DataCollector\\AjaxDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/AjaxDataCollector.php',
+    'Symfony\\Component\\HttpKernel\\DataCollector\\ConfigDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/ConfigDataCollector.php',
+    'Symfony\\Component\\HttpKernel\\DataCollector\\DataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/DataCollector.php',
+    'Symfony\\Component\\HttpKernel\\DataCollector\\DataCollectorInterface' => $vendorDir . '/symfony/http-kernel/DataCollector/DataCollectorInterface.php',
+    'Symfony\\Component\\HttpKernel\\DataCollector\\DumpDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/DumpDataCollector.php',
+    'Symfony\\Component\\HttpKernel\\DataCollector\\EventDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/EventDataCollector.php',
+    'Symfony\\Component\\HttpKernel\\DataCollector\\ExceptionDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/ExceptionDataCollector.php',
+    'Symfony\\Component\\HttpKernel\\DataCollector\\LateDataCollectorInterface' => $vendorDir . '/symfony/http-kernel/DataCollector/LateDataCollectorInterface.php',
+    'Symfony\\Component\\HttpKernel\\DataCollector\\LoggerDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/LoggerDataCollector.php',
+    'Symfony\\Component\\HttpKernel\\DataCollector\\MemoryDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/MemoryDataCollector.php',
+    'Symfony\\Component\\HttpKernel\\DataCollector\\RequestDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/RequestDataCollector.php',
+    'Symfony\\Component\\HttpKernel\\DataCollector\\RouterDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/RouterDataCollector.php',
+    'Symfony\\Component\\HttpKernel\\DataCollector\\TimeDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/TimeDataCollector.php',
+    'Symfony\\Component\\HttpKernel\\DataCollector\\Util\\ValueExporter' => $vendorDir . '/symfony/http-kernel/DataCollector/Util/ValueExporter.php',
+    'Symfony\\Component\\HttpKernel\\Debug\\ErrorHandler' => $vendorDir . '/symfony/http-kernel/Debug/ErrorHandler.php',
+    'Symfony\\Component\\HttpKernel\\Debug\\ExceptionHandler' => $vendorDir . '/symfony/http-kernel/Debug/ExceptionHandler.php',
+    'Symfony\\Component\\HttpKernel\\Debug\\TraceableEventDispatcher' => $vendorDir . '/symfony/http-kernel/Debug/TraceableEventDispatcher.php',
+    'Symfony\\Component\\HttpKernel\\DependencyInjection\\AddClassesToCachePass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/AddClassesToCachePass.php',
+    'Symfony\\Component\\HttpKernel\\DependencyInjection\\ConfigurableExtension' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ConfigurableExtension.php',
+    'Symfony\\Component\\HttpKernel\\DependencyInjection\\ContainerAwareHttpKernel' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ContainerAwareHttpKernel.php',
+    'Symfony\\Component\\HttpKernel\\DependencyInjection\\Extension' => $vendorDir . '/symfony/http-kernel/DependencyInjection/Extension.php',
+    'Symfony\\Component\\HttpKernel\\DependencyInjection\\FragmentRendererPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php',
+    'Symfony\\Component\\HttpKernel\\DependencyInjection\\LazyLoadingFragmentHandler' => $vendorDir . '/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php',
+    'Symfony\\Component\\HttpKernel\\DependencyInjection\\MergeExtensionConfigurationPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php',
+    'Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterListenersPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/RegisterListenersPass.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\AddRequestFormatsListener' => $vendorDir . '/symfony/http-kernel/EventListener/AddRequestFormatsListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\DebugHandlersListener' => $vendorDir . '/symfony/http-kernel/EventListener/DebugHandlersListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\DumpListener' => $vendorDir . '/symfony/http-kernel/EventListener/DumpListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\ErrorsLoggerListener' => $vendorDir . '/symfony/http-kernel/EventListener/ErrorsLoggerListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\EsiListener' => $vendorDir . '/symfony/http-kernel/EventListener/EsiListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\ExceptionListener' => $vendorDir . '/symfony/http-kernel/EventListener/ExceptionListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\FragmentListener' => $vendorDir . '/symfony/http-kernel/EventListener/FragmentListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener' => $vendorDir . '/symfony/http-kernel/EventListener/LocaleListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener' => $vendorDir . '/symfony/http-kernel/EventListener/ProfilerListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener' => $vendorDir . '/symfony/http-kernel/EventListener/ResponseListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\RouterListener' => $vendorDir . '/symfony/http-kernel/EventListener/RouterListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\SaveSessionListener' => $vendorDir . '/symfony/http-kernel/EventListener/SaveSessionListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\SessionListener' => $vendorDir . '/symfony/http-kernel/EventListener/SessionListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\StreamedResponseListener' => $vendorDir . '/symfony/http-kernel/EventListener/StreamedResponseListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\SurrogateListener' => $vendorDir . '/symfony/http-kernel/EventListener/SurrogateListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\TestSessionListener' => $vendorDir . '/symfony/http-kernel/EventListener/TestSessionListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\TranslatorListener' => $vendorDir . '/symfony/http-kernel/EventListener/TranslatorListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\ValidateRequestListener' => $vendorDir . '/symfony/http-kernel/EventListener/ValidateRequestListener.php',
+    'Symfony\\Component\\HttpKernel\\Event\\FilterControllerEvent' => $vendorDir . '/symfony/http-kernel/Event/FilterControllerEvent.php',
+    'Symfony\\Component\\HttpKernel\\Event\\FilterResponseEvent' => $vendorDir . '/symfony/http-kernel/Event/FilterResponseEvent.php',
+    'Symfony\\Component\\HttpKernel\\Event\\FinishRequestEvent' => $vendorDir . '/symfony/http-kernel/Event/FinishRequestEvent.php',
+    'Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent' => $vendorDir . '/symfony/http-kernel/Event/GetResponseEvent.php',
+    'Symfony\\Component\\HttpKernel\\Event\\GetResponseForControllerResultEvent' => $vendorDir . '/symfony/http-kernel/Event/GetResponseForControllerResultEvent.php',
+    'Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent' => $vendorDir . '/symfony/http-kernel/Event/GetResponseForExceptionEvent.php',
+    'Symfony\\Component\\HttpKernel\\Event\\KernelEvent' => $vendorDir . '/symfony/http-kernel/Event/KernelEvent.php',
+    'Symfony\\Component\\HttpKernel\\Event\\PostResponseEvent' => $vendorDir . '/symfony/http-kernel/Event/PostResponseEvent.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/AccessDeniedHttpException.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\BadRequestHttpException' => $vendorDir . '/symfony/http-kernel/Exception/BadRequestHttpException.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\ConflictHttpException' => $vendorDir . '/symfony/http-kernel/Exception/ConflictHttpException.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\GoneHttpException' => $vendorDir . '/symfony/http-kernel/Exception/GoneHttpException.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\HttpException' => $vendorDir . '/symfony/http-kernel/Exception/HttpException.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\HttpExceptionInterface' => $vendorDir . '/symfony/http-kernel/Exception/HttpExceptionInterface.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\LengthRequiredHttpException' => $vendorDir . '/symfony/http-kernel/Exception/LengthRequiredHttpException.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\MethodNotAllowedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/MethodNotAllowedHttpException.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\NotAcceptableHttpException' => $vendorDir . '/symfony/http-kernel/Exception/NotAcceptableHttpException.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException' => $vendorDir . '/symfony/http-kernel/Exception/NotFoundHttpException.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\PreconditionFailedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/PreconditionFailedHttpException.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\PreconditionRequiredHttpException' => $vendorDir . '/symfony/http-kernel/Exception/PreconditionRequiredHttpException.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\ServiceUnavailableHttpException' => $vendorDir . '/symfony/http-kernel/Exception/ServiceUnavailableHttpException.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\TooManyRequestsHttpException' => $vendorDir . '/symfony/http-kernel/Exception/TooManyRequestsHttpException.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\UnauthorizedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/UnauthorizedHttpException.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\UnprocessableEntityHttpException' => $vendorDir . '/symfony/http-kernel/Exception/UnprocessableEntityHttpException.php',
+    'Symfony\\Component\\HttpKernel\\Exception\\UnsupportedMediaTypeHttpException' => $vendorDir . '/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.php',
+    'Symfony\\Component\\HttpKernel\\Fragment\\AbstractSurrogateFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.php',
+    'Symfony\\Component\\HttpKernel\\Fragment\\EsiFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/EsiFragmentRenderer.php',
+    'Symfony\\Component\\HttpKernel\\Fragment\\FragmentHandler' => $vendorDir . '/symfony/http-kernel/Fragment/FragmentHandler.php',
+    'Symfony\\Component\\HttpKernel\\Fragment\\FragmentRendererInterface' => $vendorDir . '/symfony/http-kernel/Fragment/FragmentRendererInterface.php',
+    'Symfony\\Component\\HttpKernel\\Fragment\\HIncludeFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php',
+    'Symfony\\Component\\HttpKernel\\Fragment\\InlineFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/InlineFragmentRenderer.php',
+    'Symfony\\Component\\HttpKernel\\Fragment\\RoutableFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php',
+    'Symfony\\Component\\HttpKernel\\Fragment\\SsiFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/SsiFragmentRenderer.php',
+    'Symfony\\Component\\HttpKernel\\HttpCache\\Esi' => $vendorDir . '/symfony/http-kernel/HttpCache/Esi.php',
+    'Symfony\\Component\\HttpKernel\\HttpCache\\EsiResponseCacheStrategy' => $vendorDir . '/symfony/http-kernel/HttpCache/EsiResponseCacheStrategy.php',
+    'Symfony\\Component\\HttpKernel\\HttpCache\\EsiResponseCacheStrategyInterface' => $vendorDir . '/symfony/http-kernel/HttpCache/EsiResponseCacheStrategyInterface.php',
+    'Symfony\\Component\\HttpKernel\\HttpCache\\HttpCache' => $vendorDir . '/symfony/http-kernel/HttpCache/HttpCache.php',
+    'Symfony\\Component\\HttpKernel\\HttpCache\\ResponseCacheStrategy' => $vendorDir . '/symfony/http-kernel/HttpCache/ResponseCacheStrategy.php',
+    'Symfony\\Component\\HttpKernel\\HttpCache\\ResponseCacheStrategyInterface' => $vendorDir . '/symfony/http-kernel/HttpCache/ResponseCacheStrategyInterface.php',
+    'Symfony\\Component\\HttpKernel\\HttpCache\\Ssi' => $vendorDir . '/symfony/http-kernel/HttpCache/Ssi.php',
+    'Symfony\\Component\\HttpKernel\\HttpCache\\Store' => $vendorDir . '/symfony/http-kernel/HttpCache/Store.php',
+    'Symfony\\Component\\HttpKernel\\HttpCache\\StoreInterface' => $vendorDir . '/symfony/http-kernel/HttpCache/StoreInterface.php',
+    'Symfony\\Component\\HttpKernel\\HttpCache\\SurrogateInterface' => $vendorDir . '/symfony/http-kernel/HttpCache/SurrogateInterface.php',
+    'Symfony\\Component\\HttpKernel\\HttpKernel' => $vendorDir . '/symfony/http-kernel/HttpKernel.php',
+    'Symfony\\Component\\HttpKernel\\HttpKernelInterface' => $vendorDir . '/symfony/http-kernel/HttpKernelInterface.php',
+    'Symfony\\Component\\HttpKernel\\Kernel' => $vendorDir . '/symfony/http-kernel/Kernel.php',
+    'Symfony\\Component\\HttpKernel\\KernelEvents' => $vendorDir . '/symfony/http-kernel/KernelEvents.php',
+    'Symfony\\Component\\HttpKernel\\KernelInterface' => $vendorDir . '/symfony/http-kernel/KernelInterface.php',
+    'Symfony\\Component\\HttpKernel\\Log\\DebugLoggerInterface' => $vendorDir . '/symfony/http-kernel/Log/DebugLoggerInterface.php',
+    'Symfony\\Component\\HttpKernel\\Log\\LoggerInterface' => $vendorDir . '/symfony/http-kernel/Log/LoggerInterface.php',
+    'Symfony\\Component\\HttpKernel\\Log\\NullLogger' => $vendorDir . '/symfony/http-kernel/Log/NullLogger.php',
+    'Symfony\\Component\\HttpKernel\\Profiler\\BaseMemcacheProfilerStorage' => $vendorDir . '/symfony/http-kernel/Profiler/BaseMemcacheProfilerStorage.php',
+    'Symfony\\Component\\HttpKernel\\Profiler\\FileProfilerStorage' => $vendorDir . '/symfony/http-kernel/Profiler/FileProfilerStorage.php',
+    'Symfony\\Component\\HttpKernel\\Profiler\\MemcacheProfilerStorage' => $vendorDir . '/symfony/http-kernel/Profiler/MemcacheProfilerStorage.php',
+    'Symfony\\Component\\HttpKernel\\Profiler\\MemcachedProfilerStorage' => $vendorDir . '/symfony/http-kernel/Profiler/MemcachedProfilerStorage.php',
+    'Symfony\\Component\\HttpKernel\\Profiler\\MongoDbProfilerStorage' => $vendorDir . '/symfony/http-kernel/Profiler/MongoDbProfilerStorage.php',
+    'Symfony\\Component\\HttpKernel\\Profiler\\MysqlProfilerStorage' => $vendorDir . '/symfony/http-kernel/Profiler/MysqlProfilerStorage.php',
+    'Symfony\\Component\\HttpKernel\\Profiler\\PdoProfilerStorage' => $vendorDir . '/symfony/http-kernel/Profiler/PdoProfilerStorage.php',
+    'Symfony\\Component\\HttpKernel\\Profiler\\Profile' => $vendorDir . '/symfony/http-kernel/Profiler/Profile.php',
+    'Symfony\\Component\\HttpKernel\\Profiler\\Profiler' => $vendorDir . '/symfony/http-kernel/Profiler/Profiler.php',
+    'Symfony\\Component\\HttpKernel\\Profiler\\ProfilerStorageInterface' => $vendorDir . '/symfony/http-kernel/Profiler/ProfilerStorageInterface.php',
+    'Symfony\\Component\\HttpKernel\\Profiler\\RedisProfilerStorage' => $vendorDir . '/symfony/http-kernel/Profiler/RedisProfilerStorage.php',
+    'Symfony\\Component\\HttpKernel\\Profiler\\SqliteProfilerStorage' => $vendorDir . '/symfony/http-kernel/Profiler/SqliteProfilerStorage.php',
+    'Symfony\\Component\\HttpKernel\\TerminableInterface' => $vendorDir . '/symfony/http-kernel/TerminableInterface.php',
+    'Symfony\\Component\\HttpKernel\\UriSigner' => $vendorDir . '/symfony/http-kernel/UriSigner.php',
+    'Symfony\\Component\\Routing\\Annotation\\Route' => $vendorDir . '/symfony/routing/Annotation/Route.php',
+    'Symfony\\Component\\Routing\\CompiledRoute' => $vendorDir . '/symfony/routing/CompiledRoute.php',
+    'Symfony\\Component\\Routing\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/routing/Exception/ExceptionInterface.php',
+    'Symfony\\Component\\Routing\\Exception\\InvalidParameterException' => $vendorDir . '/symfony/routing/Exception/InvalidParameterException.php',
+    'Symfony\\Component\\Routing\\Exception\\MethodNotAllowedException' => $vendorDir . '/symfony/routing/Exception/MethodNotAllowedException.php',
+    'Symfony\\Component\\Routing\\Exception\\MissingMandatoryParametersException' => $vendorDir . '/symfony/routing/Exception/MissingMandatoryParametersException.php',
+    'Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException' => $vendorDir . '/symfony/routing/Exception/ResourceNotFoundException.php',
+    'Symfony\\Component\\Routing\\Exception\\RouteNotFoundException' => $vendorDir . '/symfony/routing/Exception/RouteNotFoundException.php',
+    'Symfony\\Component\\Routing\\Generator\\ConfigurableRequirementsInterface' => $vendorDir . '/symfony/routing/Generator/ConfigurableRequirementsInterface.php',
+    'Symfony\\Component\\Routing\\Generator\\Dumper\\GeneratorDumper' => $vendorDir . '/symfony/routing/Generator/Dumper/GeneratorDumper.php',
+    'Symfony\\Component\\Routing\\Generator\\Dumper\\GeneratorDumperInterface' => $vendorDir . '/symfony/routing/Generator/Dumper/GeneratorDumperInterface.php',
+    'Symfony\\Component\\Routing\\Generator\\Dumper\\PhpGeneratorDumper' => $vendorDir . '/symfony/routing/Generator/Dumper/PhpGeneratorDumper.php',
+    'Symfony\\Component\\Routing\\Generator\\UrlGenerator' => $vendorDir . '/symfony/routing/Generator/UrlGenerator.php',
+    'Symfony\\Component\\Routing\\Generator\\UrlGeneratorInterface' => $vendorDir . '/symfony/routing/Generator/UrlGeneratorInterface.php',
+    'Symfony\\Component\\Routing\\Loader\\AnnotationClassLoader' => $vendorDir . '/symfony/routing/Loader/AnnotationClassLoader.php',
+    'Symfony\\Component\\Routing\\Loader\\AnnotationDirectoryLoader' => $vendorDir . '/symfony/routing/Loader/AnnotationDirectoryLoader.php',
+    'Symfony\\Component\\Routing\\Loader\\AnnotationFileLoader' => $vendorDir . '/symfony/routing/Loader/AnnotationFileLoader.php',
+    'Symfony\\Component\\Routing\\Loader\\ClosureLoader' => $vendorDir . '/symfony/routing/Loader/ClosureLoader.php',
+    'Symfony\\Component\\Routing\\Loader\\DependencyInjection\\ServiceRouterLoader' => $vendorDir . '/symfony/routing/Loader/DependencyInjection/ServiceRouterLoader.php',
+    'Symfony\\Component\\Routing\\Loader\\DirectoryLoader' => $vendorDir . '/symfony/routing/Loader/DirectoryLoader.php',
+    'Symfony\\Component\\Routing\\Loader\\ObjectRouteLoader' => $vendorDir . '/symfony/routing/Loader/ObjectRouteLoader.php',
+    'Symfony\\Component\\Routing\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/routing/Loader/PhpFileLoader.php',
+    'Symfony\\Component\\Routing\\Loader\\XmlFileLoader' => $vendorDir . '/symfony/routing/Loader/XmlFileLoader.php',
+    'Symfony\\Component\\Routing\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/routing/Loader/YamlFileLoader.php',
+    'Symfony\\Component\\Routing\\Matcher\\ApacheUrlMatcher' => $vendorDir . '/symfony/routing/Matcher/ApacheUrlMatcher.php',
+    'Symfony\\Component\\Routing\\Matcher\\Dumper\\ApacheMatcherDumper' => $vendorDir . '/symfony/routing/Matcher/Dumper/ApacheMatcherDumper.php',
+    'Symfony\\Component\\Routing\\Matcher\\Dumper\\DumperCollection' => $vendorDir . '/symfony/routing/Matcher/Dumper/DumperCollection.php',
+    'Symfony\\Component\\Routing\\Matcher\\Dumper\\DumperPrefixCollection' => $vendorDir . '/symfony/routing/Matcher/Dumper/DumperPrefixCollection.php',
+    'Symfony\\Component\\Routing\\Matcher\\Dumper\\DumperRoute' => $vendorDir . '/symfony/routing/Matcher/Dumper/DumperRoute.php',
+    'Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumper' => $vendorDir . '/symfony/routing/Matcher/Dumper/MatcherDumper.php',
+    'Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumperInterface' => $vendorDir . '/symfony/routing/Matcher/Dumper/MatcherDumperInterface.php',
+    'Symfony\\Component\\Routing\\Matcher\\Dumper\\PhpMatcherDumper' => $vendorDir . '/symfony/routing/Matcher/Dumper/PhpMatcherDumper.php',
+    'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcher' => $vendorDir . '/symfony/routing/Matcher/RedirectableUrlMatcher.php',
+    'Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcherInterface' => $vendorDir . '/symfony/routing/Matcher/RedirectableUrlMatcherInterface.php',
+    'Symfony\\Component\\Routing\\Matcher\\RequestMatcherInterface' => $vendorDir . '/symfony/routing/Matcher/RequestMatcherInterface.php',
+    'Symfony\\Component\\Routing\\Matcher\\TraceableUrlMatcher' => $vendorDir . '/symfony/routing/Matcher/TraceableUrlMatcher.php',
+    'Symfony\\Component\\Routing\\Matcher\\UrlMatcher' => $vendorDir . '/symfony/routing/Matcher/UrlMatcher.php',
+    'Symfony\\Component\\Routing\\Matcher\\UrlMatcherInterface' => $vendorDir . '/symfony/routing/Matcher/UrlMatcherInterface.php',
+    'Symfony\\Component\\Routing\\RequestContext' => $vendorDir . '/symfony/routing/RequestContext.php',
+    'Symfony\\Component\\Routing\\RequestContextAwareInterface' => $vendorDir . '/symfony/routing/RequestContextAwareInterface.php',
+    'Symfony\\Component\\Routing\\Route' => $vendorDir . '/symfony/routing/Route.php',
+    'Symfony\\Component\\Routing\\RouteCollection' => $vendorDir . '/symfony/routing/RouteCollection.php',
+    'Symfony\\Component\\Routing\\RouteCollectionBuilder' => $vendorDir . '/symfony/routing/RouteCollectionBuilder.php',
+    'Symfony\\Component\\Routing\\RouteCompiler' => $vendorDir . '/symfony/routing/RouteCompiler.php',
+    'Symfony\\Component\\Routing\\RouteCompilerInterface' => $vendorDir . '/symfony/routing/RouteCompilerInterface.php',
+    'Symfony\\Component\\Routing\\Router' => $vendorDir . '/symfony/routing/Router.php',
+    'Symfony\\Component\\Routing\\RouterInterface' => $vendorDir . '/symfony/routing/RouterInterface.php',
+    'Symfony\\Component\\Yaml\\Dumper' => $vendorDir . '/symfony/yaml/Dumper.php',
+    'Symfony\\Component\\Yaml\\Escaper' => $vendorDir . '/symfony/yaml/Escaper.php',
+    'Symfony\\Component\\Yaml\\Exception\\DumpException' => $vendorDir . '/symfony/yaml/Exception/DumpException.php',
+    'Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/yaml/Exception/ExceptionInterface.php',
+    'Symfony\\Component\\Yaml\\Exception\\ParseException' => $vendorDir . '/symfony/yaml/Exception/ParseException.php',
+    'Symfony\\Component\\Yaml\\Exception\\RuntimeException' => $vendorDir . '/symfony/yaml/Exception/RuntimeException.php',
+    'Symfony\\Component\\Yaml\\Inline' => $vendorDir . '/symfony/yaml/Inline.php',
+    'Symfony\\Component\\Yaml\\Parser' => $vendorDir . '/symfony/yaml/Parser.php',
+    'Symfony\\Component\\Yaml\\Unescaper' => $vendorDir . '/symfony/yaml/Unescaper.php',
+    'Symfony\\Component\\Yaml\\Yaml' => $vendorDir . '/symfony/yaml/Yaml.php',
     'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php',
+    'Symfony\\Polyfill\\Php54\\Php54' => $vendorDir . '/symfony/polyfill-php54/Php54.php',
+    'Symfony\\Polyfill\\Php55\\Php55' => $vendorDir . '/symfony/polyfill-php55/Php55.php',
+    'Symfony\\Polyfill\\Php55\\Php55ArrayColumn' => $vendorDir . '/symfony/polyfill-php55/Php55ArrayColumn.php',
     'Twig_Autoloader' => $vendorDir . '/twig/twig/lib/Twig/Autoloader.php',
     'Twig_BaseNodeVisitor' => $vendorDir . '/twig/twig/lib/Twig/BaseNodeVisitor.php',
     'Twig_CacheInterface' => $vendorDir . '/twig/twig/lib/Twig/CacheInterface.php',
@@ -973,4 +1178,466 @@ return array(
     'Twig_TokenStream' => $vendorDir . '/twig/twig/lib/Twig/TokenStream.php',
     'Twig_Util_DeprecationCollector' => $vendorDir . '/twig/twig/lib/Twig/Util/DeprecationCollector.php',
     'Twig_Util_TemplateDirIterator' => $vendorDir . '/twig/twig/lib/Twig/Util/TemplateDirIterator.php',
+    'Zend\\Code\\Annotation\\AnnotationCollection' => $vendorDir . '/zendframework/zend-code/src/Annotation/AnnotationCollection.php',
+    'Zend\\Code\\Annotation\\AnnotationInterface' => $vendorDir . '/zendframework/zend-code/src/Annotation/AnnotationInterface.php',
+    'Zend\\Code\\Annotation\\AnnotationManager' => $vendorDir . '/zendframework/zend-code/src/Annotation/AnnotationManager.php',
+    'Zend\\Code\\Annotation\\Parser\\DoctrineAnnotationParser' => $vendorDir . '/zendframework/zend-code/src/Annotation/Parser/DoctrineAnnotationParser.php',
+    'Zend\\Code\\Annotation\\Parser\\GenericAnnotationParser' => $vendorDir . '/zendframework/zend-code/src/Annotation/Parser/GenericAnnotationParser.php',
+    'Zend\\Code\\Annotation\\Parser\\ParserInterface' => $vendorDir . '/zendframework/zend-code/src/Annotation/Parser/ParserInterface.php',
+    'Zend\\Code\\Exception\\BadMethodCallException' => $vendorDir . '/zendframework/zend-code/src/Exception/BadMethodCallException.php',
+    'Zend\\Code\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-code/src/Exception/ExceptionInterface.php',
+    'Zend\\Code\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-code/src/Exception/InvalidArgumentException.php',
+    'Zend\\Code\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-code/src/Exception/RuntimeException.php',
+    'Zend\\Code\\Generator\\AbstractGenerator' => $vendorDir . '/zendframework/zend-code/src/Generator/AbstractGenerator.php',
+    'Zend\\Code\\Generator\\AbstractMemberGenerator' => $vendorDir . '/zendframework/zend-code/src/Generator/AbstractMemberGenerator.php',
+    'Zend\\Code\\Generator\\BodyGenerator' => $vendorDir . '/zendframework/zend-code/src/Generator/BodyGenerator.php',
+    'Zend\\Code\\Generator\\ClassGenerator' => $vendorDir . '/zendframework/zend-code/src/Generator/ClassGenerator.php',
+    'Zend\\Code\\Generator\\DocBlockGenerator' => $vendorDir . '/zendframework/zend-code/src/Generator/DocBlockGenerator.php',
+    'Zend\\Code\\Generator\\DocBlock\\Tag' => $vendorDir . '/zendframework/zend-code/src/Generator/DocBlock/Tag.php',
+    'Zend\\Code\\Generator\\DocBlock\\TagManager' => $vendorDir . '/zendframework/zend-code/src/Generator/DocBlock/TagManager.php',
+    'Zend\\Code\\Generator\\DocBlock\\Tag\\AbstractTypeableTag' => $vendorDir . '/zendframework/zend-code/src/Generator/DocBlock/Tag/AbstractTypeableTag.php',
+    'Zend\\Code\\Generator\\DocBlock\\Tag\\AuthorTag' => $vendorDir . '/zendframework/zend-code/src/Generator/DocBlock/Tag/AuthorTag.php',
+    'Zend\\Code\\Generator\\DocBlock\\Tag\\GenericTag' => $vendorDir . '/zendframework/zend-code/src/Generator/DocBlock/Tag/GenericTag.php',
+    'Zend\\Code\\Generator\\DocBlock\\Tag\\LicenseTag' => $vendorDir . '/zendframework/zend-code/src/Generator/DocBlock/Tag/LicenseTag.php',
+    'Zend\\Code\\Generator\\DocBlock\\Tag\\MethodTag' => $vendorDir . '/zendframework/zend-code/src/Generator/DocBlock/Tag/MethodTag.php',
+    'Zend\\Code\\Generator\\DocBlock\\Tag\\ParamTag' => $vendorDir . '/zendframework/zend-code/src/Generator/DocBlock/Tag/ParamTag.php',
+    'Zend\\Code\\Generator\\DocBlock\\Tag\\PropertyTag' => $vendorDir . '/zendframework/zend-code/src/Generator/DocBlock/Tag/PropertyTag.php',
+    'Zend\\Code\\Generator\\DocBlock\\Tag\\ReturnTag' => $vendorDir . '/zendframework/zend-code/src/Generator/DocBlock/Tag/ReturnTag.php',
+    'Zend\\Code\\Generator\\DocBlock\\Tag\\TagInterface' => $vendorDir . '/zendframework/zend-code/src/Generator/DocBlock/Tag/TagInterface.php',
+    'Zend\\Code\\Generator\\DocBlock\\Tag\\ThrowsTag' => $vendorDir . '/zendframework/zend-code/src/Generator/DocBlock/Tag/ThrowsTag.php',
+    'Zend\\Code\\Generator\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-code/src/Generator/Exception/ExceptionInterface.php',
+    'Zend\\Code\\Generator\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-code/src/Generator/Exception/InvalidArgumentException.php',
+    'Zend\\Code\\Generator\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-code/src/Generator/Exception/RuntimeException.php',
+    'Zend\\Code\\Generator\\FileGenerator' => $vendorDir . '/zendframework/zend-code/src/Generator/FileGenerator.php',
+    'Zend\\Code\\Generator\\FileGeneratorRegistry' => $vendorDir . '/zendframework/zend-code/src/Generator/FileGeneratorRegistry.php',
+    'Zend\\Code\\Generator\\GeneratorInterface' => $vendorDir . '/zendframework/zend-code/src/Generator/GeneratorInterface.php',
+    'Zend\\Code\\Generator\\MethodGenerator' => $vendorDir . '/zendframework/zend-code/src/Generator/MethodGenerator.php',
+    'Zend\\Code\\Generator\\ParameterGenerator' => $vendorDir . '/zendframework/zend-code/src/Generator/ParameterGenerator.php',
+    'Zend\\Code\\Generator\\PropertyGenerator' => $vendorDir . '/zendframework/zend-code/src/Generator/PropertyGenerator.php',
+    'Zend\\Code\\Generator\\PropertyValueGenerator' => $vendorDir . '/zendframework/zend-code/src/Generator/PropertyValueGenerator.php',
+    'Zend\\Code\\Generator\\TraitGenerator' => $vendorDir . '/zendframework/zend-code/src/Generator/TraitGenerator.php',
+    'Zend\\Code\\Generator\\TraitUsageGenerator' => $vendorDir . '/zendframework/zend-code/src/Generator/TraitUsageGenerator.php',
+    'Zend\\Code\\Generator\\TraitUsageInterface' => $vendorDir . '/zendframework/zend-code/src/Generator/TraitUsageInterface.php',
+    'Zend\\Code\\Generator\\ValueGenerator' => $vendorDir . '/zendframework/zend-code/src/Generator/ValueGenerator.php',
+    'Zend\\Code\\Generic\\Prototype\\PrototypeClassFactory' => $vendorDir . '/zendframework/zend-code/src/Generic/Prototype/PrototypeClassFactory.php',
+    'Zend\\Code\\Generic\\Prototype\\PrototypeGenericInterface' => $vendorDir . '/zendframework/zend-code/src/Generic/Prototype/PrototypeGenericInterface.php',
+    'Zend\\Code\\Generic\\Prototype\\PrototypeInterface' => $vendorDir . '/zendframework/zend-code/src/Generic/Prototype/PrototypeInterface.php',
+    'Zend\\Code\\NameInformation' => $vendorDir . '/zendframework/zend-code/src/NameInformation.php',
+    'Zend\\Code\\Reflection\\ClassReflection' => $vendorDir . '/zendframework/zend-code/src/Reflection/ClassReflection.php',
+    'Zend\\Code\\Reflection\\DocBlockReflection' => $vendorDir . '/zendframework/zend-code/src/Reflection/DocBlockReflection.php',
+    'Zend\\Code\\Reflection\\DocBlock\\TagManager' => $vendorDir . '/zendframework/zend-code/src/Reflection/DocBlock/TagManager.php',
+    'Zend\\Code\\Reflection\\DocBlock\\Tag\\AuthorTag' => $vendorDir . '/zendframework/zend-code/src/Reflection/DocBlock/Tag/AuthorTag.php',
+    'Zend\\Code\\Reflection\\DocBlock\\Tag\\GenericTag' => $vendorDir . '/zendframework/zend-code/src/Reflection/DocBlock/Tag/GenericTag.php',
+    'Zend\\Code\\Reflection\\DocBlock\\Tag\\LicenseTag' => $vendorDir . '/zendframework/zend-code/src/Reflection/DocBlock/Tag/LicenseTag.php',
+    'Zend\\Code\\Reflection\\DocBlock\\Tag\\MethodTag' => $vendorDir . '/zendframework/zend-code/src/Reflection/DocBlock/Tag/MethodTag.php',
+    'Zend\\Code\\Reflection\\DocBlock\\Tag\\ParamTag' => $vendorDir . '/zendframework/zend-code/src/Reflection/DocBlock/Tag/ParamTag.php',
+    'Zend\\Code\\Reflection\\DocBlock\\Tag\\PhpDocTypedTagInterface' => $vendorDir . '/zendframework/zend-code/src/Reflection/DocBlock/Tag/PhpDocTypedTagInterface.php',
+    'Zend\\Code\\Reflection\\DocBlock\\Tag\\PropertyTag' => $vendorDir . '/zendframework/zend-code/src/Reflection/DocBlock/Tag/PropertyTag.php',
+    'Zend\\Code\\Reflection\\DocBlock\\Tag\\ReturnTag' => $vendorDir . '/zendframework/zend-code/src/Reflection/DocBlock/Tag/ReturnTag.php',
+    'Zend\\Code\\Reflection\\DocBlock\\Tag\\TagInterface' => $vendorDir . '/zendframework/zend-code/src/Reflection/DocBlock/Tag/TagInterface.php',
+    'Zend\\Code\\Reflection\\DocBlock\\Tag\\ThrowsTag' => $vendorDir . '/zendframework/zend-code/src/Reflection/DocBlock/Tag/ThrowsTag.php',
+    'Zend\\Code\\Reflection\\Exception\\BadMethodCallException' => $vendorDir . '/zendframework/zend-code/src/Reflection/Exception/BadMethodCallException.php',
+    'Zend\\Code\\Reflection\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-code/src/Reflection/Exception/ExceptionInterface.php',
+    'Zend\\Code\\Reflection\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-code/src/Reflection/Exception/InvalidArgumentException.php',
+    'Zend\\Code\\Reflection\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-code/src/Reflection/Exception/RuntimeException.php',
+    'Zend\\Code\\Reflection\\FileReflection' => $vendorDir . '/zendframework/zend-code/src/Reflection/FileReflection.php',
+    'Zend\\Code\\Reflection\\FunctionReflection' => $vendorDir . '/zendframework/zend-code/src/Reflection/FunctionReflection.php',
+    'Zend\\Code\\Reflection\\MethodReflection' => $vendorDir . '/zendframework/zend-code/src/Reflection/MethodReflection.php',
+    'Zend\\Code\\Reflection\\ParameterReflection' => $vendorDir . '/zendframework/zend-code/src/Reflection/ParameterReflection.php',
+    'Zend\\Code\\Reflection\\PropertyReflection' => $vendorDir . '/zendframework/zend-code/src/Reflection/PropertyReflection.php',
+    'Zend\\Code\\Reflection\\ReflectionInterface' => $vendorDir . '/zendframework/zend-code/src/Reflection/ReflectionInterface.php',
+    'Zend\\Code\\Scanner\\AggregateDirectoryScanner' => $vendorDir . '/zendframework/zend-code/src/Scanner/AggregateDirectoryScanner.php',
+    'Zend\\Code\\Scanner\\AnnotationScanner' => $vendorDir . '/zendframework/zend-code/src/Scanner/AnnotationScanner.php',
+    'Zend\\Code\\Scanner\\CachingFileScanner' => $vendorDir . '/zendframework/zend-code/src/Scanner/CachingFileScanner.php',
+    'Zend\\Code\\Scanner\\ClassScanner' => $vendorDir . '/zendframework/zend-code/src/Scanner/ClassScanner.php',
+    'Zend\\Code\\Scanner\\ConstantScanner' => $vendorDir . '/zendframework/zend-code/src/Scanner/ConstantScanner.php',
+    'Zend\\Code\\Scanner\\DerivedClassScanner' => $vendorDir . '/zendframework/zend-code/src/Scanner/DerivedClassScanner.php',
+    'Zend\\Code\\Scanner\\DirectoryScanner' => $vendorDir . '/zendframework/zend-code/src/Scanner/DirectoryScanner.php',
+    'Zend\\Code\\Scanner\\DocBlockScanner' => $vendorDir . '/zendframework/zend-code/src/Scanner/DocBlockScanner.php',
+    'Zend\\Code\\Scanner\\FileScanner' => $vendorDir . '/zendframework/zend-code/src/Scanner/FileScanner.php',
+    'Zend\\Code\\Scanner\\FunctionScanner' => $vendorDir . '/zendframework/zend-code/src/Scanner/FunctionScanner.php',
+    'Zend\\Code\\Scanner\\MethodScanner' => $vendorDir . '/zendframework/zend-code/src/Scanner/MethodScanner.php',
+    'Zend\\Code\\Scanner\\ParameterScanner' => $vendorDir . '/zendframework/zend-code/src/Scanner/ParameterScanner.php',
+    'Zend\\Code\\Scanner\\PropertyScanner' => $vendorDir . '/zendframework/zend-code/src/Scanner/PropertyScanner.php',
+    'Zend\\Code\\Scanner\\ScannerInterface' => $vendorDir . '/zendframework/zend-code/src/Scanner/ScannerInterface.php',
+    'Zend\\Code\\Scanner\\TokenArrayScanner' => $vendorDir . '/zendframework/zend-code/src/Scanner/TokenArrayScanner.php',
+    'Zend\\Code\\Scanner\\Util' => $vendorDir . '/zendframework/zend-code/src/Scanner/Util.php',
+    'Zend\\Code\\Scanner\\ValueScanner' => $vendorDir . '/zendframework/zend-code/src/Scanner/ValueScanner.php',
+    'Zend\\EventManager\\AbstractListenerAggregate' => $vendorDir . '/zendframework/zend-eventmanager/src/AbstractListenerAggregate.php',
+    'Zend\\EventManager\\Event' => $vendorDir . '/zendframework/zend-eventmanager/src/Event.php',
+    'Zend\\EventManager\\EventInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/EventInterface.php',
+    'Zend\\EventManager\\EventManager' => $vendorDir . '/zendframework/zend-eventmanager/src/EventManager.php',
+    'Zend\\EventManager\\EventManagerAwareInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/EventManagerAwareInterface.php',
+    'Zend\\EventManager\\EventManagerAwareTrait' => $vendorDir . '/zendframework/zend-eventmanager/src/EventManagerAwareTrait.php',
+    'Zend\\EventManager\\EventManagerInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/EventManagerInterface.php',
+    'Zend\\EventManager\\EventsCapableInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/EventsCapableInterface.php',
+    'Zend\\EventManager\\Exception\\DomainException' => $vendorDir . '/zendframework/zend-eventmanager/src/Exception/DomainException.php',
+    'Zend\\EventManager\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/Exception/ExceptionInterface.php',
+    'Zend\\EventManager\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-eventmanager/src/Exception/InvalidArgumentException.php',
+    'Zend\\EventManager\\Exception\\InvalidCallbackException' => $vendorDir . '/zendframework/zend-eventmanager/src/Exception/InvalidCallbackException.php',
+    'Zend\\EventManager\\FilterChain' => $vendorDir . '/zendframework/zend-eventmanager/src/FilterChain.php',
+    'Zend\\EventManager\\Filter\\FilterInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/Filter/FilterInterface.php',
+    'Zend\\EventManager\\Filter\\FilterIterator' => $vendorDir . '/zendframework/zend-eventmanager/src/Filter/FilterIterator.php',
+    'Zend\\EventManager\\GlobalEventManager' => $vendorDir . '/zendframework/zend-eventmanager/src/GlobalEventManager.php',
+    'Zend\\EventManager\\ListenerAggregateInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/ListenerAggregateInterface.php',
+    'Zend\\EventManager\\ListenerAggregateTrait' => $vendorDir . '/zendframework/zend-eventmanager/src/ListenerAggregateTrait.php',
+    'Zend\\EventManager\\ProvidesEvents' => $vendorDir . '/zendframework/zend-eventmanager/src/ProvidesEvents.php',
+    'Zend\\EventManager\\ResponseCollection' => $vendorDir . '/zendframework/zend-eventmanager/src/ResponseCollection.php',
+    'Zend\\EventManager\\SharedEventAggregateAwareInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/SharedEventAggregateAwareInterface.php',
+    'Zend\\EventManager\\SharedEventManager' => $vendorDir . '/zendframework/zend-eventmanager/src/SharedEventManager.php',
+    'Zend\\EventManager\\SharedEventManagerAwareInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/SharedEventManagerAwareInterface.php',
+    'Zend\\EventManager\\SharedEventManagerInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/SharedEventManagerInterface.php',
+    'Zend\\EventManager\\SharedListenerAggregateInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/SharedListenerAggregateInterface.php',
+    'Zend\\EventManager\\StaticEventManager' => $vendorDir . '/zendframework/zend-eventmanager/src/StaticEventManager.php',
+    'Zend\\Stdlib\\AbstractOptions' => $vendorDir . '/zendframework/zend-stdlib/src/AbstractOptions.php',
+    'Zend\\Stdlib\\ArrayObject' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayObject.php',
+    'Zend\\Stdlib\\ArraySerializableInterface' => $vendorDir . '/zendframework/zend-stdlib/src/ArraySerializableInterface.php',
+    'Zend\\Stdlib\\ArrayStack' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayStack.php',
+    'Zend\\Stdlib\\ArrayUtils' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayUtils.php',
+    'Zend\\Stdlib\\ArrayUtils\\MergeRemoveKey' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayUtils/MergeRemoveKey.php',
+    'Zend\\Stdlib\\ArrayUtils\\MergeReplaceKey' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayUtils/MergeReplaceKey.php',
+    'Zend\\Stdlib\\ArrayUtils\\MergeReplaceKeyInterface' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayUtils/MergeReplaceKeyInterface.php',
+    'Zend\\Stdlib\\CallbackHandler' => $vendorDir . '/zendframework/zend-stdlib/src/CallbackHandler.php',
+    'Zend\\Stdlib\\DateTime' => $vendorDir . '/zendframework/zend-stdlib/src/DateTime.php',
+    'Zend\\Stdlib\\DispatchableInterface' => $vendorDir . '/zendframework/zend-stdlib/src/DispatchableInterface.php',
+    'Zend\\Stdlib\\ErrorHandler' => $vendorDir . '/zendframework/zend-stdlib/src/ErrorHandler.php',
+    'Zend\\Stdlib\\Exception\\BadMethodCallException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/BadMethodCallException.php',
+    'Zend\\Stdlib\\Exception\\DomainException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/DomainException.php',
+    'Zend\\Stdlib\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/ExceptionInterface.php',
+    'Zend\\Stdlib\\Exception\\ExtensionNotLoadedException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/ExtensionNotLoadedException.php',
+    'Zend\\Stdlib\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/InvalidArgumentException.php',
+    'Zend\\Stdlib\\Exception\\InvalidCallbackException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/InvalidCallbackException.php',
+    'Zend\\Stdlib\\Exception\\LogicException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/LogicException.php',
+    'Zend\\Stdlib\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/RuntimeException.php',
+    'Zend\\Stdlib\\Extractor\\ExtractionInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Extractor/ExtractionInterface.php',
+    'Zend\\Stdlib\\Glob' => $vendorDir . '/zendframework/zend-stdlib/src/Glob.php',
+    'Zend\\Stdlib\\Guard\\AllGuardsTrait' => $vendorDir . '/zendframework/zend-stdlib/src/Guard/AllGuardsTrait.php',
+    'Zend\\Stdlib\\Guard\\ArrayOrTraversableGuardTrait' => $vendorDir . '/zendframework/zend-stdlib/src/Guard/ArrayOrTraversableGuardTrait.php',
+    'Zend\\Stdlib\\Guard\\EmptyGuardTrait' => $vendorDir . '/zendframework/zend-stdlib/src/Guard/EmptyGuardTrait.php',
+    'Zend\\Stdlib\\Guard\\GuardUtils' => $vendorDir . '/zendframework/zend-stdlib/src/Guard/GuardUtils.php',
+    'Zend\\Stdlib\\Guard\\NullGuardTrait' => $vendorDir . '/zendframework/zend-stdlib/src/Guard/NullGuardTrait.php',
+    'Zend\\Stdlib\\Hydrator\\AbstractHydrator' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/AbstractHydrator.php',
+    'Zend\\Stdlib\\Hydrator\\Aggregate\\AggregateHydrator' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Aggregate/AggregateHydrator.php',
+    'Zend\\Stdlib\\Hydrator\\Aggregate\\ExtractEvent' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Aggregate/ExtractEvent.php',
+    'Zend\\Stdlib\\Hydrator\\Aggregate\\HydrateEvent' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Aggregate/HydrateEvent.php',
+    'Zend\\Stdlib\\Hydrator\\Aggregate\\HydratorListener' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Aggregate/HydratorListener.php',
+    'Zend\\Stdlib\\Hydrator\\ArraySerializable' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/ArraySerializable.php',
+    'Zend\\Stdlib\\Hydrator\\ClassMethods' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/ClassMethods.php',
+    'Zend\\Stdlib\\Hydrator\\DelegatingHydrator' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/DelegatingHydrator.php',
+    'Zend\\Stdlib\\Hydrator\\DelegatingHydratorFactory' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/DelegatingHydratorFactory.php',
+    'Zend\\Stdlib\\Hydrator\\FilterEnabledInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/FilterEnabledInterface.php',
+    'Zend\\Stdlib\\Hydrator\\Filter\\FilterComposite' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/FilterComposite.php',
+    'Zend\\Stdlib\\Hydrator\\Filter\\FilterInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/FilterInterface.php',
+    'Zend\\Stdlib\\Hydrator\\Filter\\FilterProviderInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/FilterProviderInterface.php',
+    'Zend\\Stdlib\\Hydrator\\Filter\\GetFilter' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/GetFilter.php',
+    'Zend\\Stdlib\\Hydrator\\Filter\\HasFilter' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/HasFilter.php',
+    'Zend\\Stdlib\\Hydrator\\Filter\\IsFilter' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/IsFilter.php',
+    'Zend\\Stdlib\\Hydrator\\Filter\\MethodMatchFilter' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/MethodMatchFilter.php',
+    'Zend\\Stdlib\\Hydrator\\Filter\\NumberOfParameterFilter' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/NumberOfParameterFilter.php',
+    'Zend\\Stdlib\\Hydrator\\Filter\\OptionalParametersFilter' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/OptionalParametersFilter.php',
+    'Zend\\Stdlib\\Hydrator\\HydrationInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/HydrationInterface.php',
+    'Zend\\Stdlib\\Hydrator\\HydratorAwareInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/HydratorAwareInterface.php',
+    'Zend\\Stdlib\\Hydrator\\HydratorAwareTrait' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/HydratorAwareTrait.php',
+    'Zend\\Stdlib\\Hydrator\\HydratorInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/HydratorInterface.php',
+    'Zend\\Stdlib\\Hydrator\\HydratorOptionsInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/HydratorOptionsInterface.php',
+    'Zend\\Stdlib\\Hydrator\\HydratorPluginManager' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/HydratorPluginManager.php',
+    'Zend\\Stdlib\\Hydrator\\NamingStrategyEnabledInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategyEnabledInterface.php',
+    'Zend\\Stdlib\\Hydrator\\NamingStrategy\\ArrayMapNamingStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/ArrayMapNamingStrategy.php',
+    'Zend\\Stdlib\\Hydrator\\NamingStrategy\\CompositeNamingStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/CompositeNamingStrategy.php',
+    'Zend\\Stdlib\\Hydrator\\NamingStrategy\\IdentityNamingStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/IdentityNamingStrategy.php',
+    'Zend\\Stdlib\\Hydrator\\NamingStrategy\\MapNamingStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/MapNamingStrategy.php',
+    'Zend\\Stdlib\\Hydrator\\NamingStrategy\\NamingStrategyInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/NamingStrategyInterface.php',
+    'Zend\\Stdlib\\Hydrator\\NamingStrategy\\UnderscoreNamingStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/UnderscoreNamingStrategy.php',
+    'Zend\\Stdlib\\Hydrator\\ObjectProperty' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/ObjectProperty.php',
+    'Zend\\Stdlib\\Hydrator\\Reflection' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Reflection.php',
+    'Zend\\Stdlib\\Hydrator\\StrategyEnabledInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/StrategyEnabledInterface.php',
+    'Zend\\Stdlib\\Hydrator\\Strategy\\BooleanStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/BooleanStrategy.php',
+    'Zend\\Stdlib\\Hydrator\\Strategy\\ClosureStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/ClosureStrategy.php',
+    'Zend\\Stdlib\\Hydrator\\Strategy\\DateTimeFormatterStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/DateTimeFormatterStrategy.php',
+    'Zend\\Stdlib\\Hydrator\\Strategy\\DefaultStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/DefaultStrategy.php',
+    'Zend\\Stdlib\\Hydrator\\Strategy\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/Exception/ExceptionInterface.php',
+    'Zend\\Stdlib\\Hydrator\\Strategy\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/Exception/InvalidArgumentException.php',
+    'Zend\\Stdlib\\Hydrator\\Strategy\\ExplodeStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/ExplodeStrategy.php',
+    'Zend\\Stdlib\\Hydrator\\Strategy\\SerializableStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/SerializableStrategy.php',
+    'Zend\\Stdlib\\Hydrator\\Strategy\\StrategyChain' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/StrategyChain.php',
+    'Zend\\Stdlib\\Hydrator\\Strategy\\StrategyInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/StrategyInterface.php',
+    'Zend\\Stdlib\\InitializableInterface' => $vendorDir . '/zendframework/zend-stdlib/src/InitializableInterface.php',
+    'Zend\\Stdlib\\JsonSerializable' => $vendorDir . '/zendframework/zend-stdlib/src/JsonSerializable.php',
+    'Zend\\Stdlib\\JsonSerializable\\PhpLegacyCompatibility' => $vendorDir . '/zendframework/zend-stdlib/src/JsonSerializable/PhpLegacyCompatibility.php',
+    'Zend\\Stdlib\\Message' => $vendorDir . '/zendframework/zend-stdlib/src/Message.php',
+    'Zend\\Stdlib\\MessageInterface' => $vendorDir . '/zendframework/zend-stdlib/src/MessageInterface.php',
+    'Zend\\Stdlib\\ParameterObjectInterface' => $vendorDir . '/zendframework/zend-stdlib/src/ParameterObjectInterface.php',
+    'Zend\\Stdlib\\Parameters' => $vendorDir . '/zendframework/zend-stdlib/src/Parameters.php',
+    'Zend\\Stdlib\\ParametersInterface' => $vendorDir . '/zendframework/zend-stdlib/src/ParametersInterface.php',
+    'Zend\\Stdlib\\PriorityList' => $vendorDir . '/zendframework/zend-stdlib/src/PriorityList.php',
+    'Zend\\Stdlib\\PriorityQueue' => $vendorDir . '/zendframework/zend-stdlib/src/PriorityQueue.php',
+    'Zend\\Stdlib\\Request' => $vendorDir . '/zendframework/zend-stdlib/src/Request.php',
+    'Zend\\Stdlib\\RequestInterface' => $vendorDir . '/zendframework/zend-stdlib/src/RequestInterface.php',
+    'Zend\\Stdlib\\Response' => $vendorDir . '/zendframework/zend-stdlib/src/Response.php',
+    'Zend\\Stdlib\\ResponseInterface' => $vendorDir . '/zendframework/zend-stdlib/src/ResponseInterface.php',
+    'Zend\\Stdlib\\SplPriorityQueue' => $vendorDir . '/zendframework/zend-stdlib/src/SplPriorityQueue.php',
+    'Zend\\Stdlib\\SplQueue' => $vendorDir . '/zendframework/zend-stdlib/src/SplQueue.php',
+    'Zend\\Stdlib\\SplStack' => $vendorDir . '/zendframework/zend-stdlib/src/SplStack.php',
+    'Zend\\Stdlib\\StringUtils' => $vendorDir . '/zendframework/zend-stdlib/src/StringUtils.php',
+    'Zend\\Stdlib\\StringWrapper\\AbstractStringWrapper' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/AbstractStringWrapper.php',
+    'Zend\\Stdlib\\StringWrapper\\Iconv' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/Iconv.php',
+    'Zend\\Stdlib\\StringWrapper\\Intl' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/Intl.php',
+    'Zend\\Stdlib\\StringWrapper\\MbString' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/MbString.php',
+    'Zend\\Stdlib\\StringWrapper\\Native' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/Native.php',
+    'Zend\\Stdlib\\StringWrapper\\StringWrapperInterface' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/StringWrapperInterface.php',
+    'bantu\\IniGetWrapper\\IniGetWrapper' => $vendorDir . '/bantu/ini-get-wrapper/src/IniGetWrapper.php',
+    's9e\\TextFormatter\\Bundle' => $vendorDir . '/s9e/text-formatter/src/Bundle.php',
+    's9e\\TextFormatter\\Bundles\\Fatdown' => $vendorDir . '/s9e/text-formatter/src/Bundles/Fatdown.php',
+    's9e\\TextFormatter\\Bundles\\Fatdown\\Renderer' => $vendorDir . '/s9e/text-formatter/src/Bundles/Fatdown/Renderer.php',
+    's9e\\TextFormatter\\Bundles\\Forum' => $vendorDir . '/s9e/text-formatter/src/Bundles/Forum.php',
+    's9e\\TextFormatter\\Bundles\\Forum\\Renderer' => $vendorDir . '/s9e/text-formatter/src/Bundles/Forum/Renderer.php',
+    's9e\\TextFormatter\\Bundles\\MediaPack' => $vendorDir . '/s9e/text-formatter/src/Bundles/MediaPack.php',
+    's9e\\TextFormatter\\Bundles\\MediaPack\\Renderer' => $vendorDir . '/s9e/text-formatter/src/Bundles/MediaPack/Renderer.php',
+    's9e\\TextFormatter\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Bundle' => $vendorDir . '/s9e/text-formatter/src/Configurator/Bundle.php',
+    's9e\\TextFormatter\\Configurator\\BundleGenerator' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Bundles\\Fatdown' => $vendorDir . '/s9e/text-formatter/src/Configurator/Bundles/Fatdown.php',
+    's9e\\TextFormatter\\Configurator\\Bundles\\Forum' => $vendorDir . '/s9e/text-formatter/src/Configurator/Bundles/Forum.php',
+    's9e\\TextFormatter\\Configurator\\Bundles\\MediaPack' => $vendorDir . '/s9e/text-formatter/src/Configurator/Bundles/MediaPack.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\AttributeCollection' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\AttributeFilterChain' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\AttributeFilterCollection' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\AttributeList' => $vendorDir . '/s9e/text-formatter/src/Configurator/Collections/AttributeList.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\AttributePreprocessorCollection' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\Collection' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\FilterChain' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\HostnameList' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\MinifierList' => $vendorDir . '/s9e/text-formatter/src/Configurator/Collections/MinifierList.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\NormalizedCollection' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\NormalizedList' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\PluginCollection' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\RulesGeneratorList' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\Ruleset' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\SchemeList' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\TagCollection' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\TagFilterChain' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\TagList' => $vendorDir . '/s9e/text-formatter/src/Configurator/Collections/TagList.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\TemplateCheckList' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\TemplateNormalizationList' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Collections\\TemplateParameterCollection' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\ConfigProvider' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Exceptions\\InvalidTemplateException' => $vendorDir . '/s9e/text-formatter/src/Configurator/Exceptions/InvalidTemplateException.php',
+    's9e\\TextFormatter\\Configurator\\Exceptions\\InvalidXslException' => $vendorDir . '/s9e/text-formatter/src/Configurator/Exceptions/InvalidXslException.php',
+    's9e\\TextFormatter\\Configurator\\Exceptions\\UnsafeTemplateException' => $vendorDir . '/s9e/text-formatter/src/Configurator/Exceptions/UnsafeTemplateException.php',
+    's9e\\TextFormatter\\Configurator\\FilterableConfigValue' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Helpers\\AVTHelper' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Helpers\\CharacterClassBuilder' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Helpers\\ConfigHelper' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Helpers\\ContextSafeness' => $vendorDir . '/s9e/text-formatter/src/Configurator/Helpers/ContextSafeness.php',
+    's9e\\TextFormatter\\Configurator\\Helpers\\RegexpBuilder' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Helpers\\RegexpParser' => $vendorDir . '/s9e/text-formatter/src/Configurator/Helpers/RegexpParser.php',
+    's9e\\TextFormatter\\Configurator\\Helpers\\RulesHelper' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Helpers\\TemplateForensics' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Helpers\\TemplateHelper' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Helpers\\TemplateParser' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Helpers\\XPathHelper' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Items\\Attribute' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\AlnumFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/AlnumFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\ChoiceFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/ChoiceFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\ColorFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/ColorFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\EmailFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/EmailFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\FalseFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/FalseFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\FloatFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/FloatFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\FontfamilyFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/FontfamilyFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\HashmapFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/HashmapFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\IdentifierFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/IdentifierFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\IntFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/IntFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\IpFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/IpFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\IpportFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/IpportFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\Ipv4Filter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/Ipv4Filter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\Ipv6Filter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/Ipv6Filter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\MapFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/MapFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\NumberFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/NumberFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\RangeFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/RangeFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\RegexpFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/RegexpFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\SimpletextFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/SimpletextFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\UintFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributeFilters/UintFilter.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\UrlFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Items\\AttributePreprocessor' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/AttributePreprocessor.php',
+    's9e\\TextFormatter\\Configurator\\Items\\Filter' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Items\\ProgrammableCallback' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Items\\Regexp' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Items\\Tag' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Items\\TagFilter' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Items\\Template' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Items\\TemplateDocument' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/TemplateDocument.php',
+    's9e\\TextFormatter\\Configurator\\Items\\UnsafeTemplate' => $vendorDir . '/s9e/text-formatter/src/Configurator/Items/UnsafeTemplate.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\CallbackGenerator' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/CallbackGenerator.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\Code' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\ConfigOptimizer' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/ConfigOptimizer.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\ConfigValue' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/ConfigValue.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\Dictionary' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/Dictionary.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\Encoder' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/Encoder.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\FunctionProvider' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\HintGenerator' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/HintGenerator.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\Minifier' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/Minifier.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\Minifiers\\ClosureCompilerApplication' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/Minifiers/ClosureCompilerApplication.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\Minifiers\\ClosureCompilerService' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/Minifiers/ClosureCompilerService.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\Minifiers\\FirstAvailable' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/Minifiers/FirstAvailable.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\Minifiers\\HostedMinifier' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/Minifiers/HostedMinifier.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\Minifiers\\MatthiasMullieMinify' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/Minifiers/MatthiasMullieMinify.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\Minifiers\\Noop' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/Minifiers/Noop.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\Minifiers\\RemoteCache' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/Minifiers/RemoteCache.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\OnlineMinifier' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/OnlineMinifier.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\RegexpConvertor' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/RegexpConvertor.php',
+    's9e\\TextFormatter\\Configurator\\JavaScript\\StylesheetCompressor' => $vendorDir . '/s9e/text-formatter/src/Configurator/JavaScript/StylesheetCompressor.php',
+    's9e\\TextFormatter\\Configurator\\RendererGenerator' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RendererGenerators\\PHP' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RendererGenerators\\PHP\\AbstractOptimizer' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RendererGenerators\\PHP\\BranchOutputOptimizer' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RendererGenerators\\PHP\\ControlStructuresOptimizer' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RendererGenerators\\PHP\\Optimizer' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RendererGenerators\\PHP\\Quick' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RendererGenerators\\PHP\\Serializer' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RendererGenerators\\PHP\\XPathConvertor' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RendererGenerators\\Unformatted' => $vendorDir . '/s9e/text-formatter/src/Configurator/RendererGenerators/Unformatted.php',
+    's9e\\TextFormatter\\Configurator\\RendererGenerators\\XSLT' => $vendorDir . '/s9e/text-formatter/src/Configurator/RendererGenerators/XSLT.php',
+    's9e\\TextFormatter\\Configurator\\RendererGenerators\\XSLT\\Optimizer' => $vendorDir . '/s9e/text-formatter/src/Configurator/RendererGenerators/XSLT/Optimizer.php',
+    's9e\\TextFormatter\\Configurator\\Rendering' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RulesGenerator' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RulesGenerators\\AutoCloseIfVoid' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RulesGenerators\\AutoReopenFormattingElements' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RulesGenerators\\BlockElementsCloseFormattingElements' => $vendorDir . '/s9e/text-formatter/src/Configurator/RulesGenerators/BlockElementsCloseFormattingElements.php',
+    's9e\\TextFormatter\\Configurator\\RulesGenerators\\BlockElementsFosterFormattingElements' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RulesGenerators\\DisableAutoLineBreaksIfNewLinesArePreserved' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RulesGenerators\\EnforceContentModels' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RulesGenerators\\EnforceOptionalEndTags' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RulesGenerators\\IgnoreTagsInCode' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RulesGenerators\\IgnoreTextIfDisallowed' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RulesGenerators\\IgnoreWhitespaceAroundBlockElements' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RulesGenerators\\Interfaces\\BooleanRulesGenerator' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RulesGenerators\\Interfaces\\TargetedRulesGenerator' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\RulesGenerators\\ManageParagraphs' => $vendorDir . '/s9e/text-formatter/src/Configurator/RulesGenerators/ManageParagraphs.php',
+    's9e\\TextFormatter\\Configurator\\RulesGenerators\\TrimFirstLineInCodeBlocks' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateCheck' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecker' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\AbstractDynamicContentCheck' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\AbstractFlashRestriction' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\DisallowAttributeSets' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\DisallowCopy' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\DisallowDisableOutputEscaping' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\DisallowDynamicAttributeNames' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\DisallowDynamicElementNames' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\DisallowElement' => $vendorDir . '/s9e/text-formatter/src/Configurator/TemplateChecks/DisallowElement.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\DisallowElementNS' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\DisallowFlashFullScreen' => $vendorDir . '/s9e/text-formatter/src/Configurator/TemplateChecks/DisallowFlashFullScreen.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\DisallowNodeByXPath' => $vendorDir . '/s9e/text-formatter/src/Configurator/TemplateChecks/DisallowNodeByXPath.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\DisallowObjectParamsWithGeneratedName' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\DisallowPHPTags' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\DisallowUnsafeCopyOf' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\DisallowUnsafeDynamicCSS' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\DisallowUnsafeDynamicJS' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\DisallowUnsafeDynamicURL' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\DisallowXPathFunction' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\RestrictFlashNetworking' => $vendorDir . '/s9e/text-formatter/src/Configurator/TemplateChecks/RestrictFlashNetworking.php',
+    's9e\\TextFormatter\\Configurator\\TemplateChecks\\RestrictFlashScriptAccess' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalization' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\AbstractConstantFolding' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\ConvertCurlyExpressionsInText' => $vendorDir . '/s9e/text-formatter/src/Configurator/TemplateNormalizations/ConvertCurlyExpressionsInText.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\Custom' => $vendorDir . '/s9e/text-formatter/src/Configurator/TemplateNormalizations/Custom.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\FixUnescapedCurlyBracesInHtmlAttributes' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\FoldArithmeticConstants' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\FoldConstantXPathExpressions' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\InlineAttributes' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\InlineCDATA' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\InlineElements' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\InlineInferredValues' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\InlineTextElements' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\InlineXPathLiterals' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\MergeConsecutiveCopyOf' => $vendorDir . '/s9e/text-formatter/src/Configurator/TemplateNormalizations/MergeConsecutiveCopyOf.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\MergeIdenticalConditionalBranches' => $vendorDir . '/s9e/text-formatter/src/Configurator/TemplateNormalizations/MergeIdenticalConditionalBranches.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\MinifyXPathExpressions' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\NormalizeAttributeNames' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\NormalizeElementNames' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\NormalizeUrls' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\OptimizeChoose' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\OptimizeConditionalAttributes' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\OptimizeConditionalValueOf' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\OptimizeNestedConditionals' => $vendorDir . '/s9e/text-formatter/src/Configurator/TemplateNormalizations/OptimizeNestedConditionals.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\PreserveSingleSpaces' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\RemoveComments' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\RemoveInterElementWhitespace' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\SetRelNoreferrerOnTargetedLinks' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\SortAttributesByName' => $vendorDir . '/s9e/text-formatter/src/Configurator/TemplateNormalizations/SortAttributesByName.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\TransposeComments' => $vendorDir . '/s9e/text-formatter/src/Configurator/TemplateNormalizations/TransposeComments.php',
+    's9e\\TextFormatter\\Configurator\\TemplateNormalizer' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\UrlConfig' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Validators\\AttributeName' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Validators\\TagName' => $vendorDir . '/s9e/text-formatter/src/Configurator.php',
+    's9e\\TextFormatter\\Configurator\\Validators\\TemplateParameterName' => $vendorDir . '/s9e/text-formatter/src/Configurator/Validators/TemplateParameterName.php',
+    's9e\\TextFormatter\\Parser' => $vendorDir . '/s9e/text-formatter/src/Parser.php',
+    's9e\\TextFormatter\\Parser\\BuiltInFilters' => $vendorDir . '/s9e/text-formatter/src/Parser/BuiltInFilters.php',
+    's9e\\TextFormatter\\Parser\\Logger' => $vendorDir . '/s9e/text-formatter/src/Parser/Logger.php',
+    's9e\\TextFormatter\\Parser\\Tag' => $vendorDir . '/s9e/text-formatter/src/Parser/Tag.php',
+    's9e\\TextFormatter\\Plugins\\Autoemail\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/Autoemail/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\Autoemail\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/Autoemail/Parser.php',
+    's9e\\TextFormatter\\Plugins\\Autoimage\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/Autoimage/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\Autoimage\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/Autoimage/Parser.php',
+    's9e\\TextFormatter\\Plugins\\Autolink\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/Autolink/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\Autolink\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/Autolink/Parser.php',
+    's9e\\TextFormatter\\Plugins\\Autovideo\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/Autovideo/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\Autovideo\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/Autovideo/Parser.php',
+    's9e\\TextFormatter\\Plugins\\BBCodes\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/BBCodes/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\BBCodes\\Configurator\\AttributeValueCollection' => $vendorDir . '/s9e/text-formatter/src/Plugins/BBCodes/Configurator/AttributeValueCollection.php',
+    's9e\\TextFormatter\\Plugins\\BBCodes\\Configurator\\BBCode' => $vendorDir . '/s9e/text-formatter/src/Plugins/BBCodes/Configurator/BBCode.php',
+    's9e\\TextFormatter\\Plugins\\BBCodes\\Configurator\\BBCodeCollection' => $vendorDir . '/s9e/text-formatter/src/Plugins/BBCodes/Configurator/BBCodeCollection.php',
+    's9e\\TextFormatter\\Plugins\\BBCodes\\Configurator\\BBCodeMonkey' => $vendorDir . '/s9e/text-formatter/src/Plugins/BBCodes/Configurator/BBCodeMonkey.php',
+    's9e\\TextFormatter\\Plugins\\BBCodes\\Configurator\\Repository' => $vendorDir . '/s9e/text-formatter/src/Plugins/BBCodes/Configurator/Repository.php',
+    's9e\\TextFormatter\\Plugins\\BBCodes\\Configurator\\RepositoryCollection' => $vendorDir . '/s9e/text-formatter/src/Plugins/BBCodes/Configurator/RepositoryCollection.php',
+    's9e\\TextFormatter\\Plugins\\BBCodes\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/BBCodes/Parser.php',
+    's9e\\TextFormatter\\Plugins\\Censor\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/Censor/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\Censor\\Helper' => $vendorDir . '/s9e/text-formatter/src/Plugins/Censor/Helper.php',
+    's9e\\TextFormatter\\Plugins\\Censor\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/Censor/Parser.php',
+    's9e\\TextFormatter\\Plugins\\ConfiguratorBase' => $vendorDir . '/s9e/text-formatter/src/Plugins/ConfiguratorBase.php',
+    's9e\\TextFormatter\\Plugins\\Emoji\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/Emoji/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\Emoji\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/Emoji/Parser.php',
+    's9e\\TextFormatter\\Plugins\\Emoticons\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/Emoticons/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\Emoticons\\Configurator\\EmoticonCollection' => $vendorDir . '/s9e/text-formatter/src/Plugins/Emoticons/Configurator/EmoticonCollection.php',
+    's9e\\TextFormatter\\Plugins\\Emoticons\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/Emoticons/Parser.php',
+    's9e\\TextFormatter\\Plugins\\Escaper\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/Escaper/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\Escaper\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/Escaper/Parser.php',
+    's9e\\TextFormatter\\Plugins\\FancyPants\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/FancyPants/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\FancyPants\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/FancyPants/Parser.php',
+    's9e\\TextFormatter\\Plugins\\HTMLComments\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/HTMLComments/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\HTMLComments\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/HTMLComments/Parser.php',
+    's9e\\TextFormatter\\Plugins\\HTMLElements\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/HTMLElements/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\HTMLElements\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/HTMLElements/Parser.php',
+    's9e\\TextFormatter\\Plugins\\HTMLEntities\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/HTMLEntities/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\HTMLEntities\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/HTMLEntities/Parser.php',
+    's9e\\TextFormatter\\Plugins\\Keywords\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/Keywords/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\Keywords\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/Keywords/Parser.php',
+    's9e\\TextFormatter\\Plugins\\Litedown\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/Litedown/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\Litedown\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/Litedown/Parser.php',
+    's9e\\TextFormatter\\Plugins\\MediaEmbed\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\MediaEmbed\\Configurator\\Collections\\CachedDefinitionCollection' => $vendorDir . '/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/Collections/CachedDefinitionCollection.php',
+    's9e\\TextFormatter\\Plugins\\MediaEmbed\\Configurator\\Collections\\SiteCollection' => $vendorDir . '/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/Collections/SiteCollection.php',
+    's9e\\TextFormatter\\Plugins\\MediaEmbed\\Configurator\\Collections\\SiteDefinitionCollection' => $vendorDir . '/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/Collections/SiteDefinitionCollection.php',
+    's9e\\TextFormatter\\Plugins\\MediaEmbed\\Configurator\\Collections\\XmlFileDefinitionCollection' => $vendorDir . '/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/Collections/XmlFileDefinitionCollection.php',
+    's9e\\TextFormatter\\Plugins\\MediaEmbed\\Configurator\\TemplateBuilder' => $vendorDir . '/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/TemplateBuilder.php',
+    's9e\\TextFormatter\\Plugins\\MediaEmbed\\Configurator\\TemplateGenerator' => $vendorDir . '/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/TemplateGenerator.php',
+    's9e\\TextFormatter\\Plugins\\MediaEmbed\\Configurator\\TemplateGenerators\\Choose' => $vendorDir . '/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/TemplateGenerators/Choose.php',
+    's9e\\TextFormatter\\Plugins\\MediaEmbed\\Configurator\\TemplateGenerators\\Flash' => $vendorDir . '/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/TemplateGenerators/Flash.php',
+    's9e\\TextFormatter\\Plugins\\MediaEmbed\\Configurator\\TemplateGenerators\\Iframe' => $vendorDir . '/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/TemplateGenerators/Iframe.php',
+    's9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/MediaEmbed/Parser.php',
+    's9e\\TextFormatter\\Plugins\\ParserBase' => $vendorDir . '/s9e/text-formatter/src/Plugins/ParserBase.php',
+    's9e\\TextFormatter\\Plugins\\PipeTables\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/PipeTables/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\PipeTables\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/PipeTables/Parser.php',
+    's9e\\TextFormatter\\Plugins\\Preg\\Configurator' => $vendorDir . '/s9e/text-formatter/src/Plugins/Preg/Configurator.php',
+    's9e\\TextFormatter\\Plugins\\Preg\\Parser' => $vendorDir . '/s9e/text-formatter/src/Plugins/Preg/Parser.php',
+    's9e\\TextFormatter\\Renderer' => $vendorDir . '/s9e/text-formatter/src/Renderer.php',
+    's9e\\TextFormatter\\Renderers\\Unformatted' => $vendorDir . '/s9e/text-formatter/src/Renderers/Unformatted.php',
+    's9e\\TextFormatter\\Renderers\\XSLT' => $vendorDir . '/s9e/text-formatter/src/Renderers/XSLT.php',
+    's9e\\TextFormatter\\Unparser' => $vendorDir . '/s9e/text-formatter/src/Unparser.php',
+    's9e\\TextFormatter\\Utils' => $vendorDir . '/s9e/text-formatter/src/Utils.php',
+    's9e\\TextFormatter\\Utils\\Http' => $vendorDir . '/s9e/text-formatter/src/Utils/Http.php',
+    's9e\\TextFormatter\\Utils\\Http\\Client' => $vendorDir . '/s9e/text-formatter/src/Utils/Http/Client.php',
+    's9e\\TextFormatter\\Utils\\Http\\Clients\\Curl' => $vendorDir . '/s9e/text-formatter/src/Utils/Http/Clients/Curl.php',
+    's9e\\TextFormatter\\Utils\\Http\\Clients\\Native' => $vendorDir . '/s9e/text-formatter/src/Utils/Http/Clients/Native.php',
 );
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -7,4 +7,9 @@ $baseDir = dirname($vendorDir);
 
 return array(
     '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
+    'e40631d46120a9c38ea139981f8dab26' => $vendorDir . '/ircmaxell/password-compat/lib/password.php',
+    'edc6464955a37aa4d5fbf39d40fb6ee7' => $vendorDir . '/symfony/polyfill-php55/bootstrap.php',
+    '3e2471375464aac821502deb0ac64275' => $vendorDir . '/symfony/polyfill-php54/bootstrap.php',
+    'ad155f8f1cf0d418fe49e248db8c661b' => $vendorDir . '/react/promise/src/functions_include.php',
+    '5255c38a0faeba867671b61dfda6d864' => $vendorDir . '/paragonie/random_compat/lib/random.php',
 );
--- a/vendor/composer/autoload_namespaces.php
+++ b/vendor/composer/autoload_namespaces.php
@@ -7,17 +7,7 @@ $baseDir = dirname($vendorDir);
 
 return array(
     'Twig_' => array($vendorDir . '/twig/twig/lib'),
-    'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
-    'Symfony\\Component\\Routing\\' => array($vendorDir . '/symfony/routing'),
-    'Symfony\\Component\\HttpKernel\\' => array($vendorDir . '/symfony/http-kernel'),
-    'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'),
-    'Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'),
-    'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'),
-    'Symfony\\Component\\DependencyInjection\\' => array($vendorDir . '/symfony/dependency-injection'),
-    'Symfony\\Component\\Debug\\' => array($vendorDir . '/symfony/debug'),
-    'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
-    'Symfony\\Component\\Config\\' => array($vendorDir . '/symfony/config'),
-    'Psr\\Log\\' => array($vendorDir . '/psr/log'),
+    'ProxyManager\\' => array($vendorDir . '/ocramius/proxy-manager/src'),
     'OAuth\\Unit' => array($vendorDir . '/lusitanian/oauth/tests'),
     'OAuth' => array($vendorDir . '/lusitanian/oauth/src'),
 );
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -6,5 +6,34 @@ $vendorDir = dirname(dirname(__FILE__));
 $baseDir = dirname($vendorDir);
 
 return array(
+    's9e\\TextFormatter\\' => array($vendorDir . '/s9e/text-formatter/src'),
+    'bantu\\IniGetWrapper\\' => array($vendorDir . '/bantu/ini-get-wrapper/src'),
+    'Zend\\Stdlib\\' => array($vendorDir . '/zendframework/zend-stdlib/src'),
+    'Zend\\EventManager\\' => array($vendorDir . '/zendframework/zend-eventmanager/src'),
+    'Zend\\Code\\' => array($vendorDir . '/zendframework/zend-code/src'),
+    'Symfony\\Polyfill\\Php55\\' => array($vendorDir . '/symfony/polyfill-php55'),
+    'Symfony\\Polyfill\\Php54\\' => array($vendorDir . '/symfony/polyfill-php54'),
     'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
+    'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
+    'Symfony\\Component\\Routing\\' => array($vendorDir . '/symfony/routing'),
+    'Symfony\\Component\\HttpKernel\\' => array($vendorDir . '/symfony/http-kernel'),
+    'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'),
+    'Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'),
+    'Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'),
+    'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'),
+    'Symfony\\Component\\DependencyInjection\\' => array($vendorDir . '/symfony/dependency-injection'),
+    'Symfony\\Component\\Debug\\' => array($vendorDir . '/symfony/debug'),
+    'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
+    'Symfony\\Component\\Config\\' => array($vendorDir . '/symfony/config'),
+    'Symfony\\Bridge\\Twig\\' => array($vendorDir . '/symfony/twig-bridge'),
+    'Symfony\\Bridge\\ProxyManager\\' => array($vendorDir . '/symfony/proxy-manager-bridge'),
+    'React\\Promise\\' => array($vendorDir . '/react/promise/src'),
+    'ReCaptcha\\' => array($vendorDir . '/google/recaptcha/src/ReCaptcha'),
+    'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
+    'Patchwork\\' => array($vendorDir . '/patchwork/utf8/src/Patchwork'),
+    'GuzzleHttp\\Stream\\' => array($vendorDir . '/guzzlehttp/streams/src'),
+    'GuzzleHttp\\Ring\\' => array($vendorDir . '/guzzlehttp/ringphp/src'),
+    'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
+    'FastImageSize\\tests\\' => array($vendorDir . '/marc1706/fast-image-size/tests'),
+    'FastImageSize\\' => array($vendorDir . '/marc1706/fast-image-size/lib'),
 );
--- a/vendor/composer/autoload_real.php
+++ b/vendor/composer/autoload_real.php
@@ -2,7 +2,7 @@
 
 // autoload_real.php @generated by Composer
 
-class ComposerAutoloaderInit302cb276591cf8e8fafc63fc4c8c0639
+class ComposerAutoloaderInit38fb9e12d1bb4904a885b1eeaa7a0598
 {
     private static $loader;
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInit302cb276591cf8e8fafc63fc4c8c0639
             return self::$loader;
         }
 
-        spl_autoload_register(array('ComposerAutoloaderInit302cb276591cf8e8fafc63fc4c8c0639', 'loadClassLoader'), true, true);
+        spl_autoload_register(array('ComposerAutoloaderInit38fb9e12d1bb4904a885b1eeaa7a0598', 'loadClassLoader'), true, true);
         self::$loader = $loader = new \Composer\Autoload\ClassLoader();
-        spl_autoload_unregister(array('ComposerAutoloaderInit302cb276591cf8e8fafc63fc4c8c0639', 'loadClassLoader'));
+        spl_autoload_unregister(array('ComposerAutoloaderInit38fb9e12d1bb4904a885b1eeaa7a0598', 'loadClassLoader'));
 
         $map = require __DIR__ . '/autoload_namespaces.php';
         foreach ($map as $namespace => $path) {
@@ -42,14 +42,14 @@ class ComposerAutoloaderInit302cb276591cf8e8fafc63fc4c8c0639
 
         $includeFiles = require __DIR__ . '/autoload_files.php';
         foreach ($includeFiles as $fileIdentifier => $file) {
-            composerRequire302cb276591cf8e8fafc63fc4c8c0639($fileIdentifier, $file);
+            composerRequire38fb9e12d1bb4904a885b1eeaa7a0598($fileIdentifier, $file);
         }
 
         return $loader;
     }
 }
 
-function composerRequire302cb276591cf8e8fafc63fc4c8c0639($fileIdentifier, $file)
+function composerRequire38fb9e12d1bb4904a885b1eeaa7a0598($fileIdentifier, $file)
 {
     if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
         require $file;
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1,17 +1,301 @@
 [
     {
+        "name": "bantu/ini-get-wrapper",
+        "version": "v1.0.1",
+        "version_normalized": "1.0.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/bantuXorg/php-ini-get-wrapper.git",
+            "reference": "4770c7feab370c62e23db4f31c112b7c6d90aee2"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/bantuXorg/php-ini-get-wrapper/zipball/4770c7feab370c62e23db4f31c112b7c6d90aee2",
+            "reference": "4770c7feab370c62e23db4f31c112b7c6d90aee2",
+            "shasum": ""
+        },
+        "require-dev": {
+            "phpunit/phpunit": "3.7.*"
+        },
+        "time": "2014-09-15 13:12:35",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "bantu\\IniGetWrapper\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "description": "Convenience wrapper around ini_get()"
+    },
+    {
+        "name": "google/recaptcha",
+        "version": "1.1.2",
+        "version_normalized": "1.1.2.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/google/recaptcha.git",
+            "reference": "2b7e00566afca82a38a1d3adb8e42c118006296e"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/google/recaptcha/zipball/2b7e00566afca82a38a1d3adb8e42c118006296e",
+            "reference": "2b7e00566afca82a38a1d3adb8e42c118006296e",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.2"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "4.5.*"
+        },
+        "time": "2015-09-02 17:23:59",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.1.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "ReCaptcha\\": "src/ReCaptcha"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "description": "Client library for reCAPTCHA, a free service that protect websites from spam and abuse.",
+        "homepage": "http://www.google.com/recaptcha/",
+        "keywords": [
+            "Abuse",
+            "captcha",
+            "recaptcha",
+            "spam"
+        ]
+    },
+    {
+        "name": "react/promise",
+        "version": "v2.4.1",
+        "version_normalized": "2.4.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/reactphp/promise.git",
+            "reference": "8025426794f1944de806618671d4fa476dc7626f"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/reactphp/promise/zipball/8025426794f1944de806618671d4fa476dc7626f",
+            "reference": "8025426794f1944de806618671d4fa476dc7626f",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.4.0"
+        },
+        "time": "2016-05-03 17:50:52",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.0-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "React\\Promise\\": "src/"
+            },
+            "files": [
+                "src/functions_include.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Jan Sorgalla",
+                "email": "jsorgalla@gmail.com"
+            }
+        ],
+        "description": "A lightweight implementation of CommonJS Promises/A for PHP"
+    },
+    {
+        "name": "guzzlehttp/streams",
+        "version": "3.0.0",
+        "version_normalized": "3.0.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/guzzle/streams.git",
+            "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/guzzle/streams/zipball/47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5",
+            "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.4.0"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "~4.0"
+        },
+        "time": "2014-10-12 19:18:40",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.0-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "GuzzleHttp\\Stream\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Michael Dowling",
+                "email": "mtdowling@gmail.com",
+                "homepage": "https://github.com/mtdowling"
+            }
+        ],
+        "description": "Provides a simple abstraction over streams of data",
+        "homepage": "http://guzzlephp.org/",
+        "keywords": [
+            "Guzzle",
+            "stream"
+        ]
+    },
+    {
+        "name": "guzzlehttp/ringphp",
+        "version": "1.1.0",
+        "version_normalized": "1.1.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/guzzle/RingPHP.git",
+            "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/guzzle/RingPHP/zipball/dbbb91d7f6c191e5e405e900e3102ac7f261bc0b",
+            "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b",
+            "shasum": ""
+        },
+        "require": {
+            "guzzlehttp/streams": "~3.0",
+            "php": ">=5.4.0",
+            "react/promise": "~2.0"
+        },
+        "require-dev": {
+            "ext-curl": "*",
+            "phpunit/phpunit": "~4.0"
+        },
+        "suggest": {
+            "ext-curl": "Guzzle will use specific adapters if cURL is present"
+        },
+        "time": "2015-05-20 03:37:09",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.1-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "GuzzleHttp\\Ring\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Michael Dowling",
+                "email": "mtdowling@gmail.com",
+                "homepage": "https://github.com/mtdowling"
+            }
+        ],
+        "description": "Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function."
+    },
+    {
+        "name": "guzzlehttp/guzzle",
+        "version": "5.3.1",
+        "version_normalized": "5.3.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/guzzle/guzzle.git",
+            "reference": "70f1fa53b71c4647bf2762c09068a95f77e12fb8"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/guzzle/guzzle/zipball/70f1fa53b71c4647bf2762c09068a95f77e12fb8",
+            "reference": "70f1fa53b71c4647bf2762c09068a95f77e12fb8",
+            "shasum": ""
+        },
+        "require": {
+            "guzzlehttp/ringphp": "^1.1",
+            "php": ">=5.4.0"
+        },
+        "require-dev": {
+            "ext-curl": "*",
+            "phpunit/phpunit": "^4.0"
+        },
+        "time": "2016-07-15 19:28:39",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "GuzzleHttp\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Michael Dowling",
+                "email": "mtdowling@gmail.com",
+                "homepage": "https://github.com/mtdowling"
+            }
+        ],
+        "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients",
+        "homepage": "http://guzzlephp.org/",
+        "keywords": [
+            "client",
+            "curl",
+            "framework",
+            "http",
+            "http client",
+            "rest",
+            "web service"
+        ]
+    },
+    {
         "name": "lusitanian/oauth",
-        "version": "v0.2.5",
-        "version_normalized": "0.2.5.0",
+        "version": "v0.8.9",
+        "version_normalized": "0.8.9.0",
         "source": {
             "type": "git",
             "url": "https://github.com/Lusitanian/PHPoAuthLib.git",
-            "reference": "27e375e13e1badcd6dca7fb47b154b3c48fdec0c"
+            "reference": "29bda6e176df6c292a9b1c43ae8a44d56a87c30b"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/Lusitanian/PHPoAuthLib/zipball/27e375e13e1badcd6dca7fb47b154b3c48fdec0c",
-            "reference": "27e375e13e1badcd6dca7fb47b154b3c48fdec0c",
+            "url": "https://api.github.com/repos/Lusitanian/PHPoAuthLib/zipball/29bda6e176df6c292a9b1c43ae8a44d56a87c30b",
+            "reference": "29bda6e176df6c292a9b1c43ae8a44d56a87c30b",
             "shasum": ""
         },
         "require": {
@@ -20,13 +304,15 @@
         "require-dev": {
             "phpunit/phpunit": "3.7.*",
             "predis/predis": "0.8.*@dev",
+            "squizlabs/php_codesniffer": "2.*",
             "symfony/http-foundation": "~2.1"
         },
         "suggest": {
+            "ext-openssl": "Allows for usage of secure connections with the stream-based HTTP client.",
             "predis/predis": "Allows using the Redis storage backend.",
             "symfony/http-foundation": "Allows using the Symfony Session storage backend."
         },
-        "time": "2013-12-25 20:05:42",
+        "time": "2016-02-24 00:20:18",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -50,10 +336,12 @@
                 "email": "david@daviddesberg.com"
             },
             {
+                "name": "Elliot Chance",
+                "email": "elliotchance@gmail.com"
+            },
+            {
                 "name": "Pieter Hordijk",
-                "email": "info@pieterhordijk.com",
-                "homepage": "https://pieterhordijk.com",
-                "role": "developer"
+                "email": "info@pieterhordijk.com"
             }
         ],
         "description": "PHP 5.3+ oAuth 1/2 Library",
@@ -65,34 +353,259 @@
         ]
     },
     {
+        "name": "marc1706/fast-image-size",
+        "version": "v1.1.2",
+        "version_normalized": "1.1.2.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/marc1706/fast-image-size.git",
+            "reference": "8bb644f8f767c5763acd61140045a78d10e1eb06"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/marc1706/fast-image-size/zipball/8bb644f8f767c5763acd61140045a78d10e1eb06",
+            "reference": "8bb644f8f767c5763acd61140045a78d10e1eb06",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.0"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "4.*"
+        },
+        "time": "2016-10-30 19:00:39",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "FastImageSize\\": "lib",
+                "FastImageSize\\tests\\": "tests"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Marc Alexander",
+                "email": "admin@m-a-styles.de",
+                "homepage": "https://www.m-a-styles.de",
+                "role": "Developer"
+            }
+        ],
+        "description": "fast-image-size is a PHP library that does almost everything PHP's getimagesize() does but without the large overhead of downloading the complete file.",
+        "homepage": "https://www.m-a-styles.de",
+        "keywords": [
+            "fast",
+            "getimagesize",
+            "image",
+            "imagesize",
+            "php",
+            "size"
+        ]
+    },
+    {
+        "name": "paragonie/random_compat",
+        "version": "v1.4.1",
+        "version_normalized": "1.4.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/paragonie/random_compat.git",
+            "reference": "c7e26a21ba357863de030f0b9e701c7d04593774"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/paragonie/random_compat/zipball/c7e26a21ba357863de030f0b9e701c7d04593774",
+            "reference": "c7e26a21ba357863de030f0b9e701c7d04593774",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.2.0"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "4.*|5.*"
+        },
+        "suggest": {
+            "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+        },
+        "time": "2016-03-18 20:34:03",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "files": [
+                "lib/random.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Paragon Initiative Enterprises",
+                "email": "security@paragonie.com",
+                "homepage": "https://paragonie.com"
+            }
+        ],
+        "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+        "keywords": [
+            "csprng",
+            "pseudorandom",
+            "random"
+        ]
+    },
+    {
+        "name": "patchwork/utf8",
+        "version": "v1.3.1",
+        "version_normalized": "1.3.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/tchwork/utf8.git",
+            "reference": "30ec6451aec7d2536f0af8fe535f70c764f2c47a"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/tchwork/utf8/zipball/30ec6451aec7d2536f0af8fe535f70c764f2c47a",
+            "reference": "30ec6451aec7d2536f0af8fe535f70c764f2c47a",
+            "shasum": ""
+        },
+        "require": {
+            "lib-pcre": ">=7.3",
+            "php": ">=5.3.0"
+        },
+        "suggest": {
+            "ext-iconv": "Use iconv for best performance",
+            "ext-intl": "Use Intl for best performance",
+            "ext-mbstring": "Use Mbstring for best performance",
+            "ext-wfio": "Use WFIO for UTF-8 filesystem access on Windows"
+        },
+        "time": "2016-05-18 13:57:10",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.3-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Patchwork\\": "src/Patchwork/"
+            },
+            "classmap": [
+                "src/Normalizer.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "(Apache-2.0 or GPL-2.0)"
+        ],
+        "authors": [
+            {
+                "name": "Nicolas Grekas",
+                "email": "p@tchwork.com"
+            }
+        ],
+        "description": "Portable and performant UTF-8, Unicode and Grapheme Clusters for PHP",
+        "homepage": "https://github.com/tchwork/utf8",
+        "keywords": [
+            "grapheme",
+            "i18n",
+            "unicode",
+            "utf-8",
+            "utf8"
+        ]
+    },
+    {
+        "name": "s9e/text-formatter",
+        "version": "0.8.4",
+        "version_normalized": "0.8.4.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/s9e/TextFormatter.git",
+            "reference": "919fd772aae4dd889618da1cb18ae746f2a14bb6"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/s9e/TextFormatter/zipball/919fd772aae4dd889618da1cb18ae746f2a14bb6",
+            "reference": "919fd772aae4dd889618da1cb18ae746f2a14bb6",
+            "shasum": ""
+        },
+        "require": {
+            "ext-dom": "*",
+            "ext-filter": "*",
+            "lib-pcre": ">=7.2",
+            "php": ">=5.3.3"
+        },
+        "suggest": {
+            "ext-curl": "Improves the performance of the MediaEmbed plugin and some JavaScript minifiers",
+            "ext-intl": "Allows international URLs to be accepted by the URL filter",
+            "ext-json": "Enables the generation of a JavaScript parser",
+            "ext-mbstring": "Improves the performance of the PHP renderer",
+            "ext-tokenizer": "Improves the performance of the PHP renderer",
+            "ext-xsl": "Enables the XSLT renderer",
+            "ext-zlib": "Enables gzip compression when scraping content via the MediaEmbed plugin"
+        },
+        "time": "2016-11-22 20:10:24",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "s9e\\TextFormatter\\": "src"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "description": "Multi-purpose text formatting and markup library. Plugins offer support for BBCodes, Markdown, emoticons, HTML, embedding media (YouTube, etc...), enhanced typography and more.",
+        "homepage": "https://github.com/s9e/TextFormatter/",
+        "keywords": [
+            "bbcode",
+            "bbcodes",
+            "blog",
+            "censor",
+            "embed",
+            "emoji",
+            "emoticons",
+            "engine",
+            "forum",
+            "html",
+            "markdown",
+            "markup",
+            "media",
+            "parser",
+            "shortcodes"
+        ]
+    },
+    {
         "name": "symfony/filesystem",
-        "version": "v2.3.42",
-        "version_normalized": "2.3.42.0",
-        "target-dir": "Symfony/Component/Filesystem",
+        "version": "v2.8.14",
+        "version_normalized": "2.8.14.0",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/filesystem.git",
-            "reference": "8fd9cd1da0afe63f0d9d4f27875782a2b7d590d3"
+            "reference": "a3784111af9f95f102b6411548376e1ae7c93898"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/filesystem/zipball/8fd9cd1da0afe63f0d9d4f27875782a2b7d590d3",
-            "reference": "8fd9cd1da0afe63f0d9d4f27875782a2b7d590d3",
+            "url": "https://api.github.com/repos/symfony/filesystem/zipball/a3784111af9f95f102b6411548376e1ae7c93898",
+            "reference": "a3784111af9f95f102b6411548376e1ae7c93898",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
+            "php": ">=5.3.9"
         },
-        "time": "2016-04-12 15:20:10",
+        "time": "2016-10-18 04:28:30",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.3-dev"
+                "dev-master": "2.8-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
+            "psr-4": {
                 "Symfony\\Component\\Filesystem\\": ""
             },
             "exclude-from-classmap": [
@@ -118,34 +631,36 @@
     },
     {
         "name": "symfony/config",
-        "version": "v2.3.42",
-        "version_normalized": "2.3.42.0",
-        "target-dir": "Symfony/Component/Config",
+        "version": "v2.8.14",
+        "version_normalized": "2.8.14.0",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/config.git",
-            "reference": "16a645cef1c09ebfc907d3c9b3e9f5836a7d4d3b"
+            "reference": "1361bc4e66f97b6202ae83f4190e962c624b5e61"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/config/zipball/16a645cef1c09ebfc907d3c9b3e9f5836a7d4d3b",
-            "reference": "16a645cef1c09ebfc907d3c9b3e9f5836a7d4d3b",
+            "url": "https://api.github.com/repos/symfony/config/zipball/1361bc4e66f97b6202ae83f4190e962c624b5e61",
+            "reference": "1361bc4e66f97b6202ae83f4190e962c624b5e61",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3",
-            "symfony/filesystem": "~2.3"
+            "php": ">=5.3.9",
+            "symfony/filesystem": "~2.3|~3.0.0"
         },
-        "time": "2016-05-30 08:14:41",
+        "suggest": {
+            "symfony/yaml": "To use the yaml reference dumper"
+        },
+        "time": "2016-11-03 07:52:58",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.3-dev"
+                "dev-master": "2.8-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
+            "psr-4": {
                 "Symfony\\Component\\Config\\": ""
             },
             "exclude-from-classmap": [
@@ -170,40 +685,214 @@
         "homepage": "https://symfony.com"
     },
     {
+        "name": "symfony/polyfill-mbstring",
+        "version": "v1.3.0",
+        "version_normalized": "1.3.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/polyfill-mbstring.git",
+            "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4",
+            "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3"
+        },
+        "suggest": {
+            "ext-mbstring": "For best performance"
+        },
+        "time": "2016-11-14 01:06:16",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.3-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Symfony\\Polyfill\\Mbstring\\": ""
+            },
+            "files": [
+                "bootstrap.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Nicolas Grekas",
+                "email": "p@tchwork.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
+            }
+        ],
+        "description": "Symfony polyfill for the Mbstring extension",
+        "homepage": "https://symfony.com",
+        "keywords": [
+            "compatibility",
+            "mbstring",
+            "polyfill",
+            "portable",
+            "shim"
+        ]
+    },
+    {
+        "name": "psr/log",
+        "version": "1.0.2",
+        "version_normalized": "1.0.2.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/php-fig/log.git",
+            "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+            "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.0"
+        },
+        "time": "2016-10-10 12:19:37",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.0.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Psr\\Log\\": "Psr/Log/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "PHP-FIG",
+                "homepage": "http://www.php-fig.org/"
+            }
+        ],
+        "description": "Common interface for logging libraries",
+        "homepage": "https://github.com/php-fig/log",
+        "keywords": [
+            "log",
+            "psr",
+            "psr-3"
+        ]
+    },
+    {
+        "name": "symfony/debug",
+        "version": "v2.8.14",
+        "version_normalized": "2.8.14.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/debug.git",
+            "reference": "62a68f640456f6761d752c62d81631428ef0d8a1"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/debug/zipball/62a68f640456f6761d752c62d81631428ef0d8a1",
+            "reference": "62a68f640456f6761d752c62d81631428ef0d8a1",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.9",
+            "psr/log": "~1.0"
+        },
+        "conflict": {
+            "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+        },
+        "require-dev": {
+            "symfony/class-loader": "~2.2|~3.0.0",
+            "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2|~3.0.0"
+        },
+        "time": "2016-11-15 12:53:17",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.8-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Symfony\\Component\\Debug\\": ""
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
+            }
+        ],
+        "description": "Symfony Debug Component",
+        "homepage": "https://symfony.com"
+    },
+    {
         "name": "symfony/console",
-        "version": "v2.3.42",
-        "version_normalized": "2.3.42.0",
-        "target-dir": "Symfony/Component/Console",
+        "version": "v2.8.14",
+        "version_normalized": "2.8.14.0",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/console.git",
-            "reference": "20c12c6d6c5a087a66d4e77999451713a92a3507"
+            "reference": "a871ba00e0f604dceac64c56c27f99fbeaf4854e"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/console/zipball/20c12c6d6c5a087a66d4e77999451713a92a3507",
-            "reference": "20c12c6d6c5a087a66d4e77999451713a92a3507",
+            "url": "https://api.github.com/repos/symfony/console/zipball/a871ba00e0f604dceac64c56c27f99fbeaf4854e",
+            "reference": "a871ba00e0f604dceac64c56c27f99fbeaf4854e",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
+            "php": ">=5.3.9",
+            "symfony/debug": "~2.7,>=2.7.2|~3.0.0",
+            "symfony/polyfill-mbstring": "~1.0"
         },
         "require-dev": {
-            "symfony/event-dispatcher": "~2.1"
+            "psr/log": "~1.0",
+            "symfony/event-dispatcher": "~2.1|~3.0.0",
+            "symfony/process": "~2.1|~3.0.0"
         },
         "suggest": {
-            "symfony/event-dispatcher": ""
+            "psr/log": "For using the console logger",
+            "symfony/event-dispatcher": "",
+            "symfony/process": ""
         },
-        "time": "2016-05-26 08:04:58",
+        "time": "2016-11-15 23:02:12",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.3-dev"
+                "dev-master": "2.8-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
+            "psr-4": {
                 "Symfony\\Component\\Console\\": ""
             },
             "exclude-from-classmap": [
@@ -228,44 +917,34 @@
         "homepage": "https://symfony.com"
     },
     {
-        "name": "symfony/dependency-injection",
-        "version": "v2.3.42",
-        "version_normalized": "2.3.42.0",
-        "target-dir": "Symfony/Component/DependencyInjection",
+        "name": "symfony/finder",
+        "version": "v2.8.14",
+        "version_normalized": "2.8.14.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/dependency-injection.git",
-            "reference": "06265ee128644eb70356bd72ab28c9ded6618d19"
+            "url": "https://github.com/symfony/finder.git",
+            "reference": "0023b024363dfc0cd21262e556f25a291fe8d7fd"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/06265ee128644eb70356bd72ab28c9ded6618d19",
-            "reference": "06265ee128644eb70356bd72ab28c9ded6618d19",
+            "url": "https://api.github.com/repos/symfony/finder/zipball/0023b024363dfc0cd21262e556f25a291fe8d7fd",
+            "reference": "0023b024363dfc0cd21262e556f25a291fe8d7fd",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
-        },
-        "require-dev": {
-            "symfony/config": "~2.2",
-            "symfony/yaml": "~2.1"
-        },
-        "suggest": {
-            "symfony/config": "",
-            "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
-            "symfony/yaml": ""
+            "php": ">=5.3.9"
         },
-        "time": "2016-05-30 08:31:06",
+        "time": "2016-11-03 07:52:58",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.3-dev"
+                "dev-master": "2.8-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\DependencyInjection\\": ""
+            "psr-4": {
+                "Symfony\\Component\\Finder\\": ""
             },
             "exclude-from-classmap": [
                 "/Tests/"
@@ -285,44 +964,146 @@
                 "homepage": "https://symfony.com/contributors"
             }
         ],
-        "description": "Symfony DependencyInjection Component",
+        "description": "Symfony Finder Component",
         "homepage": "https://symfony.com"
     },
     {
-        "name": "symfony/polyfill-mbstring",
-        "version": "v1.2.0",
-        "version_normalized": "1.2.0.0",
+        "name": "ircmaxell/password-compat",
+        "version": "v1.0.4",
+        "version_normalized": "1.0.4.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/polyfill-mbstring.git",
-            "reference": "dff51f72b0706335131b00a7f49606168c582594"
+            "url": "https://github.com/ircmaxell/password_compat.git",
+            "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/dff51f72b0706335131b00a7f49606168c582594",
-            "reference": "dff51f72b0706335131b00a7f49606168c582594",
+            "url": "https://api.github.com/repos/ircmaxell/password_compat/zipball/5c5cde8822a69545767f7c7f3058cb15ff84614c",
+            "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c",
+            "shasum": ""
+        },
+        "require-dev": {
+            "phpunit/phpunit": "4.*"
+        },
+        "time": "2014-11-20 16:49:30",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "files": [
+                "lib/password.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Anthony Ferrara",
+                "email": "ircmaxell@php.net",
+                "homepage": "http://blog.ircmaxell.com"
+            }
+        ],
+        "description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash",
+        "homepage": "https://github.com/ircmaxell/password_compat",
+        "keywords": [
+            "hashing",
+            "password"
+        ]
+    },
+    {
+        "name": "symfony/polyfill-php55",
+        "version": "v1.3.0",
+        "version_normalized": "1.3.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/polyfill-php55.git",
+            "reference": "03e3f0350bca2220e3623a0e340eef194405fc67"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/03e3f0350bca2220e3623a0e340eef194405fc67",
+            "reference": "03e3f0350bca2220e3623a0e340eef194405fc67",
             "shasum": ""
         },
         "require": {
+            "ircmaxell/password-compat": "~1.0",
             "php": ">=5.3.3"
         },
-        "suggest": {
-            "ext-mbstring": "For best performance"
+        "time": "2016-11-14 01:06:16",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.3-dev"
+            }
         },
-        "time": "2016-05-18 14:26:46",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Symfony\\Polyfill\\Php55\\": ""
+            },
+            "files": [
+                "bootstrap.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Nicolas Grekas",
+                "email": "p@tchwork.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
+            }
+        ],
+        "description": "Symfony polyfill backporting some PHP 5.5+ features to lower PHP versions",
+        "homepage": "https://symfony.com",
+        "keywords": [
+            "compatibility",
+            "polyfill",
+            "portable",
+            "shim"
+        ]
+    },
+    {
+        "name": "symfony/polyfill-php54",
+        "version": "v1.3.0",
+        "version_normalized": "1.3.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/polyfill-php54.git",
+            "reference": "90e085822963fdcc9d1c5b73deb3d2e5783b16a0"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/90e085822963fdcc9d1c5b73deb3d2e5783b16a0",
+            "reference": "90e085822963fdcc9d1c5b73deb3d2e5783b16a0",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3"
+        },
+        "time": "2016-11-14 01:06:16",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.2-dev"
+                "dev-master": "1.3-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Symfony\\Polyfill\\Mbstring\\": ""
+                "Symfony\\Polyfill\\Php54\\": ""
             },
             "files": [
                 "bootstrap.php"
+            ],
+            "classmap": [
+                "Resources/stubs"
             ]
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -339,11 +1120,10 @@
                 "homepage": "https://symfony.com/contributors"
             }
         ],
-        "description": "Symfony polyfill for the Mbstring extension",
+        "description": "Symfony polyfill backporting some PHP 5.4+ features to lower PHP versions",
         "homepage": "https://symfony.com",
         "keywords": [
             "compatibility",
-            "mbstring",
             "polyfill",
             "portable",
             "shim"
@@ -351,39 +1131,40 @@
     },
     {
         "name": "symfony/http-foundation",
-        "version": "v2.3.42",
-        "version_normalized": "2.3.42.0",
-        "target-dir": "Symfony/Component/HttpFoundation",
+        "version": "v2.8.14",
+        "version_normalized": "2.8.14.0",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/http-foundation.git",
-            "reference": "9f4dbb1f3e3cad22d9462e0306c9c71212458f61"
+            "reference": "4f8c167732bbf3ba4284c0915f57b332091f6b68"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9f4dbb1f3e3cad22d9462e0306c9c71212458f61",
-            "reference": "9f4dbb1f3e3cad22d9462e0306c9c71212458f61",
+            "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4f8c167732bbf3ba4284c0915f57b332091f6b68",
+            "reference": "4f8c167732bbf3ba4284c0915f57b332091f6b68",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3",
-            "symfony/polyfill-mbstring": "~1.1"
+            "php": ">=5.3.9",
+            "symfony/polyfill-mbstring": "~1.1",
+            "symfony/polyfill-php54": "~1.0",
+            "symfony/polyfill-php55": "~1.0"
         },
-        "time": "2016-05-13 15:22:39",
+        "require-dev": {
+            "symfony/expression-language": "~2.4|~3.0.0"
+        },
+        "time": "2016-11-15 23:02:12",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.3-dev"
+                "dev-master": "2.8-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
+            "psr-4": {
                 "Symfony\\Component\\HttpFoundation\\": ""
             },
-            "classmap": [
-                "Symfony/Component/HttpFoundation/Resources/stubs"
-            ],
             "exclude-from-classmap": [
                 "/Tests/"
             ]
@@ -407,40 +1188,43 @@
     },
     {
         "name": "symfony/event-dispatcher",
-        "version": "v2.3.42",
-        "version_normalized": "2.3.42.0",
-        "target-dir": "Symfony/Component/EventDispatcher",
+        "version": "v2.8.14",
+        "version_normalized": "2.8.14.0",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/event-dispatcher.git",
-            "reference": "fd6d162d97bf3e6060622e5c015af39ca72e33bc"
+            "reference": "25c576abd4e0f212e678fe8b2bd9a9a98c7ea934"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/fd6d162d97bf3e6060622e5c015af39ca72e33bc",
-            "reference": "fd6d162d97bf3e6060622e5c015af39ca72e33bc",
+            "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/25c576abd4e0f212e678fe8b2bd9a9a98c7ea934",
+            "reference": "25c576abd4e0f212e678fe8b2bd9a9a98c7ea934",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
+            "php": ">=5.3.9"
         },
         "require-dev": {
-            "symfony/dependency-injection": "~2.0,>=2.0.5"
+            "psr/log": "~1.0",
+            "symfony/config": "~2.0,>=2.0.5|~3.0.0",
+            "symfony/dependency-injection": "~2.6|~3.0.0",
+            "symfony/expression-language": "~2.6|~3.0.0",
+            "symfony/stopwatch": "~2.3|~3.0.0"
         },
         "suggest": {
             "symfony/dependency-injection": "",
             "symfony/http-kernel": ""
         },
-        "time": "2016-04-04 09:22:54",
+        "time": "2016-10-13 01:43:15",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.3-dev"
+                "dev-master": "2.8-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
+            "psr-4": {
                 "Symfony\\Component\\EventDispatcher\\": ""
             },
             "exclude-from-classmap": [
@@ -465,47 +1249,67 @@
         "homepage": "https://symfony.com"
     },
     {
-        "name": "symfony/debug",
-        "version": "v2.3.42",
-        "version_normalized": "2.3.42.0",
-        "target-dir": "Symfony/Component/Debug",
+        "name": "symfony/http-kernel",
+        "version": "v2.8.14",
+        "version_normalized": "2.8.14.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/debug.git",
-            "reference": "863d29c31a1ddfcf1faedf5f8362f392e3261632"
+            "url": "https://github.com/symfony/http-kernel.git",
+            "reference": "29d9bb59c6d895e65d8fea3859c96c3b6e9368ba"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/debug/zipball/863d29c31a1ddfcf1faedf5f8362f392e3261632",
-            "reference": "863d29c31a1ddfcf1faedf5f8362f392e3261632",
+            "url": "https://api.github.com/repos/symfony/http-kernel/zipball/29d9bb59c6d895e65d8fea3859c96c3b6e9368ba",
+            "reference": "29d9bb59c6d895e65d8fea3859c96c3b6e9368ba",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
+            "php": ">=5.3.9",
+            "psr/log": "~1.0",
+            "symfony/debug": "~2.6,>=2.6.2",
+            "symfony/event-dispatcher": "~2.6,>=2.6.7|~3.0.0",
+            "symfony/http-foundation": "~2.7.20|~2.8.13|~3.1.6"
         },
         "conflict": {
-            "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+            "symfony/config": "<2.7"
         },
         "require-dev": {
-            "symfony/http-foundation": "~2.1",
-            "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2"
+            "symfony/browser-kit": "~2.3|~3.0.0",
+            "symfony/class-loader": "~2.1|~3.0.0",
+            "symfony/config": "~2.8",
+            "symfony/console": "~2.3|~3.0.0",
+            "symfony/css-selector": "~2.0,>=2.0.5|~3.0.0",
+            "symfony/dependency-injection": "~2.8|~3.0.0",
+            "symfony/dom-crawler": "~2.0,>=2.0.5|~3.0.0",
+            "symfony/expression-language": "~2.4|~3.0.0",
+            "symfony/finder": "~2.0,>=2.0.5|~3.0.0",
+            "symfony/process": "~2.0,>=2.0.5|~3.0.0",
+            "symfony/routing": "~2.8|~3.0.0",
+            "symfony/stopwatch": "~2.3|~3.0.0",
+            "symfony/templating": "~2.2|~3.0.0",
+            "symfony/translation": "~2.0,>=2.0.5|~3.0.0",
+            "symfony/var-dumper": "~2.6|~3.0.0"
         },
         "suggest": {
+            "symfony/browser-kit": "",
             "symfony/class-loader": "",
-            "symfony/http-foundation": "",
-            "symfony/http-kernel": ""
+            "symfony/config": "",
+            "symfony/console": "",
+            "symfony/dependency-injection": "",
+            "symfony/finder": "",
+            "symfony/var-dumper": ""
         },
-        "time": "2016-03-30 09:02:35",
+        "time": "2016-11-21 02:24:42",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.3-dev"
+                "dev-master": "2.8-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\Debug\\": ""
+            "psr-4": {
+                "Symfony\\Component\\HttpKernel\\": ""
             },
             "exclude-from-classmap": [
                 "/Tests/"
@@ -525,31 +1329,56 @@
                 "homepage": "https://symfony.com/contributors"
             }
         ],
-        "description": "Symfony Debug Component",
+        "description": "Symfony HttpKernel Component",
         "homepage": "https://symfony.com"
     },
     {
-        "name": "psr/log",
-        "version": "1.0.0",
-        "version_normalized": "1.0.0.0",
+        "name": "symfony/dependency-injection",
+        "version": "v2.8.14",
+        "version_normalized": "2.8.14.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/php-fig/log.git",
-            "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
+            "url": "https://github.com/symfony/dependency-injection.git",
+            "reference": "9d2c5033ca70ceade8d7584f997a9d3943f0fe5f"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
-            "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
+            "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/9d2c5033ca70ceade8d7584f997a9d3943f0fe5f",
+            "reference": "9d2c5033ca70ceade8d7584f997a9d3943f0fe5f",
             "shasum": ""
         },
-        "time": "2012-12-21 11:40:51",
+        "require": {
+            "php": ">=5.3.9"
+        },
+        "conflict": {
+            "symfony/expression-language": "<2.6"
+        },
+        "require-dev": {
+            "symfony/config": "~2.2|~3.0.0",
+            "symfony/expression-language": "~2.6|~3.0.0",
+            "symfony/yaml": "~2.3.42|~2.7.14|~2.8.7|~3.0.7"
+        },
+        "suggest": {
+            "symfony/config": "",
+            "symfony/expression-language": "For using expressions in service container configuration",
+            "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
+            "symfony/yaml": ""
+        },
+        "time": "2016-11-18 21:10:01",
         "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.8-dev"
+            }
+        },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
-                "Psr\\Log\\": ""
-            }
+            "psr-4": {
+                "Symfony\\Component\\DependencyInjection\\": ""
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -557,77 +1386,220 @@
         ],
         "authors": [
             {
-                "name": "PHP-FIG",
-                "homepage": "http://www.php-fig.org/"
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
-        "description": "Common interface for logging libraries",
+        "description": "Symfony DependencyInjection Component",
+        "homepage": "https://symfony.com"
+    },
+    {
+        "name": "zendframework/zend-stdlib",
+        "version": "2.5.1",
+        "version_normalized": "2.5.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/zendframework/zend-stdlib.git",
+            "reference": "cc8e90a60dd5d44b9730b77d07b97550091da1ae"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/cc8e90a60dd5d44b9730b77d07b97550091da1ae",
+            "reference": "cc8e90a60dd5d44b9730b77d07b97550091da1ae",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.23"
+        },
+        "require-dev": {
+            "fabpot/php-cs-fixer": "1.7.*",
+            "phpunit/phpunit": "~4.0",
+            "zendframework/zend-config": "~2.5",
+            "zendframework/zend-eventmanager": "~2.5",
+            "zendframework/zend-filter": "~2.5",
+            "zendframework/zend-inputfilter": "~2.5",
+            "zendframework/zend-serializer": "~2.5",
+            "zendframework/zend-servicemanager": "~2.5"
+        },
+        "suggest": {
+            "zendframework/zend-eventmanager": "To support aggregate hydrator usage",
+            "zendframework/zend-filter": "To support naming strategy hydrator usage",
+            "zendframework/zend-serializer": "Zend\\Serializer component",
+            "zendframework/zend-servicemanager": "To support hydrator plugin manager usage"
+        },
+        "time": "2015-06-03 15:32:03",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.5-dev",
+                "dev-develop": "2.6-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Zend\\Stdlib\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "homepage": "https://github.com/zendframework/zend-stdlib",
         "keywords": [
-            "log",
-            "psr",
-            "psr-3"
+            "stdlib",
+            "zf2"
         ]
     },
     {
-        "name": "symfony/http-kernel",
-        "version": "v2.3.42",
-        "version_normalized": "2.3.42.0",
-        "target-dir": "Symfony/Component/HttpKernel",
+        "name": "zendframework/zend-eventmanager",
+        "version": "2.5.1",
+        "version_normalized": "2.5.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/http-kernel.git",
-            "reference": "57e0329236e8edf2b0e683043c604f7c9aba9398"
+            "url": "https://github.com/zendframework/zend-eventmanager.git",
+            "reference": "d94a16039144936f107f906896349900fd634443"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/d94a16039144936f107f906896349900fd634443",
+            "reference": "d94a16039144936f107f906896349900fd634443",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.23",
+            "zendframework/zend-stdlib": "~2.5"
+        },
+        "require-dev": {
+            "fabpot/php-cs-fixer": "1.7.*",
+            "phpunit/phpunit": "~4.0"
+        },
+        "time": "2015-06-03 15:32:01",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.5-dev",
+                "dev-develop": "2.6-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Zend\\EventManager\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "homepage": "https://github.com/zendframework/zend-eventmanager",
+        "keywords": [
+            "eventmanager",
+            "zf2"
+        ]
+    },
+    {
+        "name": "zendframework/zend-code",
+        "version": "2.5.1",
+        "version_normalized": "2.5.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/zendframework/zend-code.git",
+            "reference": "5d998f261ec2a55171c71da57a11622745680153"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/http-kernel/zipball/57e0329236e8edf2b0e683043c604f7c9aba9398",
-            "reference": "57e0329236e8edf2b0e683043c604f7c9aba9398",
+            "url": "https://api.github.com/repos/zendframework/zend-code/zipball/5d998f261ec2a55171c71da57a11622745680153",
+            "reference": "5d998f261ec2a55171c71da57a11622745680153",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.23",
+            "zendframework/zend-eventmanager": "~2.5"
+        },
+        "require-dev": {
+            "doctrine/common": ">=2.1",
+            "fabpot/php-cs-fixer": "1.7.*",
+            "phpunit/phpunit": "~4.0",
+            "zendframework/zend-stdlib": "~2.5",
+            "zendframework/zend-version": "~2.5"
+        },
+        "suggest": {
+            "doctrine/common": "Doctrine\\Common >=2.1 for annotation features",
+            "zendframework/zend-stdlib": "Zend\\Stdlib component"
+        },
+        "time": "2015-06-03 15:31:59",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.5-dev",
+                "dev-develop": "2.6-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Zend\\Code\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "description": "provides facilities to generate arbitrary code using an object oriented interface",
+        "homepage": "https://github.com/zendframework/zend-code",
+        "keywords": [
+            "code",
+            "zf2"
+        ]
+    },
+    {
+        "name": "ocramius/proxy-manager",
+        "version": "1.0.2",
+        "version_normalized": "1.0.2.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/Ocramius/ProxyManager.git",
+            "reference": "57e9272ec0e8deccf09421596e0e2252df440e11"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/57e9272ec0e8deccf09421596e0e2252df440e11",
+            "reference": "57e9272ec0e8deccf09421596e0e2252df440e11",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.3",
-            "psr/log": "~1.0",
-            "symfony/debug": "~2.3.24|~2.5.9|~2.6,>=2.6.2",
-            "symfony/event-dispatcher": "~2.1",
-            "symfony/http-foundation": "~2.3,>=2.3.4"
+            "zendframework/zend-code": ">2.2.5,<3.0"
         },
         "require-dev": {
-            "symfony/browser-kit": "~2.3",
-            "symfony/class-loader": "~2.1",
-            "symfony/config": "~2.0,>=2.0.5",
-            "symfony/console": "~2.2",
-            "symfony/css-selector": "~2.0,>=2.0.5",
-            "symfony/dependency-injection": "~2.2",
-            "symfony/dom-crawler": "~2.0,>=2.0.5",
-            "symfony/finder": "~2.0,>=2.0.5",
-            "symfony/process": "~2.0,>=2.0.5",
-            "symfony/routing": "~2.2",
-            "symfony/stopwatch": "~2.3",
-            "symfony/templating": "~2.2"
+            "ext-phar": "*",
+            "phpunit/phpunit": "~4.0",
+            "squizlabs/php_codesniffer": "1.5.*"
         },
         "suggest": {
-            "symfony/browser-kit": "",
-            "symfony/class-loader": "",
-            "symfony/config": "",
-            "symfony/console": "",
-            "symfony/dependency-injection": "",
-            "symfony/finder": ""
+            "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects",
+            "zendframework/zend-json": "To have the JsonRpc adapter (Remote Object feature)",
+            "zendframework/zend-soap": "To have the Soap adapter (Remote Object feature)",
+            "zendframework/zend-stdlib": "To use the hydrator proxy",
+            "zendframework/zend-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)"
         },
-        "time": "2016-05-30 08:41:10",
+        "time": "2015-08-09 04:28:19",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.3-dev"
+                "dev-master": "2.0.x-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
             "psr-0": {
-                "Symfony\\Component\\HttpKernel\\": ""
-            },
-            "exclude-from-classmap": [
-                "/Tests/"
-            ]
+                "ProxyManager\\": "src"
+            }
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -635,59 +1607,55 @@
         ],
         "authors": [
             {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
+                "name": "Marco Pivetta",
+                "email": "ocramius@gmail.com",
+                "homepage": "http://ocramius.github.com/"
             }
         ],
-        "description": "Symfony HttpKernel Component",
-        "homepage": "https://symfony.com"
+        "description": "A library providing utilities to generate, instantiate and generally operate with Object Proxies",
+        "homepage": "https://github.com/Ocramius/ProxyManager",
+        "keywords": [
+            "aop",
+            "lazy loading",
+            "proxy",
+            "proxy pattern",
+            "service proxies"
+        ]
     },
     {
-        "name": "symfony/routing",
-        "version": "v2.3.42",
-        "version_normalized": "2.3.42.0",
-        "target-dir": "Symfony/Component/Routing",
+        "name": "symfony/proxy-manager-bridge",
+        "version": "v2.8.14",
+        "version_normalized": "2.8.14.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/routing.git",
-            "reference": "5b8a2bb7569df81401171829498809e90d6e446c"
+            "url": "https://github.com/symfony/proxy-manager-bridge.git",
+            "reference": "69922100cdfe37bc9c0429cab5bd523e861e562e"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/routing/zipball/5b8a2bb7569df81401171829498809e90d6e446c",
-            "reference": "5b8a2bb7569df81401171829498809e90d6e446c",
+            "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/69922100cdfe37bc9c0429cab5bd523e861e562e",
+            "reference": "69922100cdfe37bc9c0429cab5bd523e861e562e",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
+            "ocramius/proxy-manager": "~0.4|~1.0|~2.0",
+            "php": ">=5.3.9",
+            "symfony/dependency-injection": "~2.8|~3.0.0"
         },
         "require-dev": {
-            "doctrine/common": "~2.2",
-            "psr/log": "~1.0",
-            "symfony/config": "~2.2",
-            "symfony/http-foundation": "~2.3",
-            "symfony/yaml": "~2.0,>=2.0.5"
+            "symfony/config": "~2.3|~3.0.0"
         },
-        "suggest": {
-            "doctrine/common": "",
-            "symfony/config": "",
-            "symfony/yaml": ""
-        },
-        "time": "2016-05-29 10:13:06",
-        "type": "library",
+        "time": "2016-10-03 15:49:46",
+        "type": "symfony-bridge",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.3-dev"
+                "dev-master": "2.8-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\Routing\\": ""
+            "psr-4": {
+                "Symfony\\Bridge\\ProxyManager\\": ""
             },
             "exclude-from-classmap": [
                 "/Tests/"
@@ -707,39 +1675,58 @@
                 "homepage": "https://symfony.com/contributors"
             }
         ],
-        "description": "Symfony Routing Component",
+        "description": "Symfony ProxyManager Bridge",
         "homepage": "https://symfony.com"
     },
     {
-        "name": "symfony/yaml",
-        "version": "v2.3.42",
-        "version_normalized": "2.3.42.0",
-        "target-dir": "Symfony/Component/Yaml",
+        "name": "symfony/routing",
+        "version": "v2.8.14",
+        "version_normalized": "2.8.14.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/yaml.git",
-            "reference": "2cb5f366f9e0df014fc93de46cc416ba0a3055f8"
+            "url": "https://github.com/symfony/routing.git",
+            "reference": "6cee3ed22c778a7410119a3d51a20f60252a156c"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/yaml/zipball/2cb5f366f9e0df014fc93de46cc416ba0a3055f8",
-            "reference": "2cb5f366f9e0df014fc93de46cc416ba0a3055f8",
+            "url": "https://api.github.com/repos/symfony/routing/zipball/6cee3ed22c778a7410119a3d51a20f60252a156c",
+            "reference": "6cee3ed22c778a7410119a3d51a20f60252a156c",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
+            "php": ">=5.3.9"
+        },
+        "conflict": {
+            "symfony/config": "<2.7"
         },
-        "time": "2016-05-30 08:10:17",
+        "require-dev": {
+            "doctrine/annotations": "~1.0",
+            "doctrine/common": "~2.2",
+            "psr/log": "~1.0",
+            "symfony/config": "~2.7|~3.0.0",
+            "symfony/expression-language": "~2.4|~3.0.0",
+            "symfony/http-foundation": "~2.3|~3.0.0",
+            "symfony/yaml": "~2.0,>=2.0.5|~3.0.0"
+        },
+        "suggest": {
+            "doctrine/annotations": "For using the annotation loader",
+            "symfony/config": "For using the all-in-one router or any loader",
+            "symfony/dependency-injection": "For loading routes from a service",
+            "symfony/expression-language": "For using expression matching",
+            "symfony/http-foundation": "For using a Symfony Request object",
+            "symfony/yaml": "For using the YAML loader"
+        },
+        "time": "2016-08-16 14:56:08",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.3-dev"
+                "dev-master": "2.8-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\Yaml\\": ""
+            "psr-4": {
+                "Symfony\\Component\\Routing\\": ""
             },
             "exclude-from-classmap": [
                 "/Tests/"
@@ -759,22 +1746,28 @@
                 "homepage": "https://symfony.com/contributors"
             }
         ],
-        "description": "Symfony Yaml Component",
-        "homepage": "https://symfony.com"
+        "description": "Symfony Routing Component",
+        "homepage": "https://symfony.com",
+        "keywords": [
+            "router",
+            "routing",
+            "uri",
+            "url"
+        ]
     },
     {
         "name": "twig/twig",
-        "version": "v1.24.1",
-        "version_normalized": "1.24.1.0",
+        "version": "v1.24.2",
+        "version_normalized": "1.24.2.0",
         "source": {
             "type": "git",
             "url": "https://github.com/twigphp/Twig.git",
-            "reference": "3566d311a92aae4deec6e48682dc5a4528c4a512"
+            "reference": "33093f6e310e6976baeac7b14f3a6ec02f2d79b7"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/twigphp/Twig/zipball/3566d311a92aae4deec6e48682dc5a4528c4a512",
-            "reference": "3566d311a92aae4deec6e48682dc5a4528c4a512",
+            "url": "https://api.github.com/repos/twigphp/Twig/zipball/33093f6e310e6976baeac7b14f3a6ec02f2d79b7",
+            "reference": "33093f6e310e6976baeac7b14f3a6ec02f2d79b7",
             "shasum": ""
         },
         "require": {
@@ -784,7 +1777,7 @@
             "symfony/debug": "~2.7",
             "symfony/phpunit-bridge": "~2.7"
         },
-        "time": "2016-05-30 09:11:59",
+        "time": "2016-09-01 17:50:53",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -824,5 +1817,139 @@
         "keywords": [
             "templating"
         ]
+    },
+    {
+        "name": "symfony/twig-bridge",
+        "version": "v2.8.11",
+        "version_normalized": "2.8.11.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/twig-bridge.git",
+            "reference": "5e9679f7085e99adb5248e07b4677494b8f884b5"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/5e9679f7085e99adb5248e07b4677494b8f884b5",
+            "reference": "5e9679f7085e99adb5248e07b4677494b8f884b5",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.9",
+            "twig/twig": "~1.23|~2.0"
+        },
+        "require-dev": {
+            "symfony/asset": "~2.7|~3.0.0",
+            "symfony/console": "~2.8|~3.0.0",
+            "symfony/expression-language": "~2.4|~3.0.0",
+            "symfony/finder": "~2.3|~3.0.0",
+            "symfony/form": "~2.8.4",
+            "symfony/http-kernel": "~2.8|~3.0.0",
+            "symfony/polyfill-intl-icu": "~1.0",
+            "symfony/routing": "~2.2|~3.0.0",
+            "symfony/security": "~2.6|~3.0.0",
+            "symfony/security-acl": "~2.6|~3.0.0",
+            "symfony/stopwatch": "~2.2|~3.0.0",
+            "symfony/templating": "~2.1|~3.0.0",
+            "symfony/translation": "~2.7|~3.0.0",
+            "symfony/var-dumper": "~2.7.16|~2.8.9|~3.0.9",
+            "symfony/yaml": "~2.0,>=2.0.5|~3.0.0"
+        },
+        "suggest": {
+            "symfony/asset": "For using the AssetExtension",
+            "symfony/expression-language": "For using the ExpressionExtension",
+            "symfony/finder": "",
+            "symfony/form": "For using the FormExtension",
+            "symfony/http-kernel": "For using the HttpKernelExtension",
+            "symfony/routing": "For using the RoutingExtension",
+            "symfony/security": "For using the SecurityExtension",
+            "symfony/stopwatch": "For using the StopwatchExtension",
+            "symfony/templating": "For using the TwigEngine",
+            "symfony/translation": "For using the TranslationExtension",
+            "symfony/var-dumper": "For using the DumpExtension",
+            "symfony/yaml": "For using the YamlExtension"
+        },
+        "time": "2016-09-06 10:55:00",
+        "type": "symfony-bridge",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.8-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Symfony\\Bridge\\Twig\\": ""
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
+            }
+        ],
+        "description": "Symfony Twig Bridge",
+        "homepage": "https://symfony.com"
+    },
+    {
+        "name": "symfony/yaml",
+        "version": "v2.8.14",
+        "version_normalized": "2.8.14.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/yaml.git",
+            "reference": "befb26a3713c97af90d25dd12e75621ef14d91ff"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/yaml/zipball/befb26a3713c97af90d25dd12e75621ef14d91ff",
+            "reference": "befb26a3713c97af90d25dd12e75621ef14d91ff",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.9"
+        },
+        "time": "2016-11-14 16:15:57",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.8-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Symfony\\Component\\Yaml\\": ""
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
+            }
+        ],
+        "description": "Symfony Yaml Component",
+        "homepage": "https://symfony.com"
     }
 ]
--- /dev/null
+++ b/vendor/google/recaptcha/LICENSE
@@ -0,0 +1,29 @@
+Copyright 2014, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+    * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
--- /dev/null
+++ b/vendor/google/recaptcha/composer.json
@@ -0,0 +1,28 @@
+{
+    "name": "google/recaptcha",
+    "description": "Client library for reCAPTCHA, a free service that protect websites from spam and abuse.",
+    "type": "library",
+    "keywords": ["recaptcha", "captcha", "spam", "abuse"],
+    "homepage": "http://www.google.com/recaptcha/",
+    "license": "BSD-3-Clause",
+    "support": {
+        "forum": "https://groups.google.com/forum/#!forum/recaptcha",
+        "source": "https://github.com/google/recaptcha"
+    },
+    "require": {
+        "php": ">=5.3.2"
+    },
+    "require-dev": {
+        "phpunit/phpunit": "4.5.*"
+    },
+    "autoload": {
+        "psr-4": {
+            "ReCaptcha\\": "src/ReCaptcha"
+        }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.1.x-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/google/recaptcha/src/ReCaptcha/ReCaptcha.php
@@ -0,0 +1,97 @@
+<?php
+/**
+ * This is a PHP library that handles calling reCAPTCHA.
+ *
+ * @copyright Copyright (c) 2015, Google Inc.
+ * @link      http://www.google.com/recaptcha
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace ReCaptcha;
+
+/**
+ * reCAPTCHA client.
+ */
+class ReCaptcha
+{
+    /**
+     * Version of this client library.
+     * @const string
+     */
+    const VERSION = 'php_1.1.2';
+
+    /**
+     * Shared secret for the site.
+     * @var type string
+     */
+    private $secret;
+
+    /**
+     * Method used to communicate  with service. Defaults to POST request.
+     * @var RequestMethod
+     */
+    private $requestMethod;
+
+    /**
+     * Create a configured instance to use the reCAPTCHA service.
+     *
+     * @param string $secret shared secret between site and reCAPTCHA server.
+     * @param RequestMethod $requestMethod method used to send the request. Defaults to POST.
+     */
+    public function __construct($secret, RequestMethod $requestMethod = null)
+    {
+        if (empty($secret)) {
+            throw new \RuntimeException('No secret provided');
+        }
+
+        if (!is_string($secret)) {
+            throw new \RuntimeException('The provided secret must be a string');
+        }
+
+        $this->secret = $secret;
+
+        if (!is_null($requestMethod)) {
+            $this->requestMethod = $requestMethod;
+        } else {
+            $this->requestMethod = new RequestMethod\Post();
+        }
+    }
+
+    /**
+     * Calls the reCAPTCHA siteverify API to verify whether the user passes
+     * CAPTCHA test.
+     *
+     * @param string $response The value of 'g-recaptcha-response' in the submitted form.
+     * @param string $remoteIp The end user's IP address.
+     * @return Response Response from the service.
+     */
+    public function verify($response, $remoteIp = null)
+    {
+        // Discard empty solution submissions
+        if (empty($response)) {
+            $recaptchaResponse = new Response(false, array('missing-input-response'));
+            return $recaptchaResponse;
+        }
+
+        $params = new RequestParameters($this->secret, $response, $remoteIp, self::VERSION);
+        $rawResponse = $this->requestMethod->submit($params);
+        return Response::fromJson($rawResponse);
+    }
+}
--- /dev/null
+++ b/vendor/google/recaptcha/src/ReCaptcha/RequestMethod.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * This is a PHP library that handles calling reCAPTCHA.
+ *
+ * @copyright Copyright (c) 2015, Google Inc.
+ * @link      http://www.google.com/recaptcha
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace ReCaptcha;
+
+/**
+ * Method used to send the request to the service.
+ */
+interface RequestMethod
+{
+
+    /**
+     * Submit the request with the specified parameters.
+     *
+     * @param RequestParameters $params Request parameters
+     * @return string Body of the reCAPTCHA response
+     */
+    public function submit(RequestParameters $params);
+}
--- /dev/null
+++ b/vendor/google/recaptcha/src/ReCaptcha/RequestMethod/Curl.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * This is a PHP library that handles calling reCAPTCHA.
+ *
+ * @copyright Copyright (c) 2015, Google Inc.
+ * @link      http://www.google.com/recaptcha
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace ReCaptcha\RequestMethod;
+
+/**
+ * Convenience wrapper around the cURL functions to allow mocking.
+ */
+class Curl
+{
+
+    /**
+     * @see http://php.net/curl_init
+     * @param string $url
+     * @return resource cURL handle
+     */
+    public function init($url = null)
+    {
+        return curl_init($url);
+    }
+
+    /**
+     * @see http://php.net/curl_setopt_array
+     * @param resource $ch
+     * @param array $options
+     * @return bool
+     */
+    public function setoptArray($ch, array $options)
+    {
+        return curl_setopt_array($ch, $options);
+    }
+
+    /**
+     * @see http://php.net/curl_exec
+     * @param resource $ch
+     * @return mixed
+     */
+    public function exec($ch)
+    {
+        return curl_exec($ch);
+    }
+
+    /**
+     * @see http://php.net/curl_close
+     * @param resource $ch
+     */
+    public function close($ch)
+    {
+        curl_close($ch);
+    }
+}
--- /dev/null
+++ b/vendor/google/recaptcha/src/ReCaptcha/RequestMethod/CurlPost.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * This is a PHP library that handles calling reCAPTCHA.
+ *
+ * @copyright Copyright (c) 2015, Google Inc.
+ * @link      http://www.google.com/recaptcha
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace ReCaptcha\RequestMethod;
+
+use ReCaptcha\RequestMethod;
+use ReCaptcha\RequestParameters;
+
+/**
+ * Sends cURL request to the reCAPTCHA service.
+ * Note: this requires the cURL extension to be enabled in PHP
+ * @see http://php.net/manual/en/book.curl.php
+ */
+class CurlPost implements RequestMethod
+{
+    /**
+     * URL to which requests are sent via cURL.
+     * @const string
+     */
+    const SITE_VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify';
+
+    /**
+     * Curl connection to the reCAPTCHA service
+     * @var Curl
+     */
+    private $curl;
+
+    public function __construct(Curl $curl = null)
+    {
+        if (!is_null($curl)) {
+            $this->curl = $curl;
+        } else {
+            $this->curl = new Curl();
+        }
+    }
+
+    /**
+     * Submit the cURL request with the specified parameters.
+     *
+     * @param RequestParameters $params Request parameters
+     * @return string Body of the reCAPTCHA response
+     */
+    public function submit(RequestParameters $params)
+    {
+        $handle = $this->curl->init(self::SITE_VERIFY_URL);
+
+        $options = array(
+            CURLOPT_POST => true,
+            CURLOPT_POSTFIELDS => $params->toQueryString(),
+            CURLOPT_HTTPHEADER => array(
+                'Content-Type: application/x-www-form-urlencoded'
+            ),
+            CURLINFO_HEADER_OUT => false,
+            CURLOPT_HEADER => false,
+            CURLOPT_RETURNTRANSFER => true,
+            CURLOPT_SSL_VERIFYPEER => true
+        );
+        $this->curl->setoptArray($handle, $options);
+
+        $response = $this->curl->exec($handle);
+        $this->curl->close($handle);
+
+        return $response;
+    }
+}
--- /dev/null
+++ b/vendor/google/recaptcha/src/ReCaptcha/RequestMethod/Post.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * This is a PHP library that handles calling reCAPTCHA.
+ *
+ * @copyright Copyright (c) 2015, Google Inc.
+ * @link      http://www.google.com/recaptcha
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace ReCaptcha\RequestMethod;
+
+use ReCaptcha\RequestMethod;
+use ReCaptcha\RequestParameters;
+
+/**
+ * Sends POST requests to the reCAPTCHA service.
+ */
+class Post implements RequestMethod
+{
+    /**
+     * URL to which requests are POSTed.
+     * @const string
+     */
+    const SITE_VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify';
+
+    /**
+     * Submit the POST request with the specified parameters.
+     *
+     * @param RequestParameters $params Request parameters
+     * @return string Body of the reCAPTCHA response
+     */
+    public function submit(RequestParameters $params)
+    {
+        /**
+         * PHP 5.6.0 changed the way you specify the peer name for SSL context options.
+         * Using "CN_name" will still work, but it will raise deprecated errors.
+         */
+        $peer_key = version_compare(PHP_VERSION, '5.6.0', '<') ? 'CN_name' : 'peer_name';
+        $options = array(
+            'http' => array(
+                'header' => "Content-type: application/x-www-form-urlencoded\r\n",
+                'method' => 'POST',
+                'content' => $params->toQueryString(),
+                // Force the peer to validate (not needed in 5.6.0+, but still works
+                'verify_peer' => true,
+                // Force the peer validation to use www.google.com
+                $peer_key => 'www.google.com',
+            ),
+        );
+        $context = stream_context_create($options);
+        return file_get_contents(self::SITE_VERIFY_URL, false, $context);
+    }
+}
--- /dev/null
+++ b/vendor/google/recaptcha/src/ReCaptcha/RequestMethod/Socket.php
@@ -0,0 +1,105 @@
+<?php
+/**
+ * This is a PHP library that handles calling reCAPTCHA.
+ *
+ * @copyright Copyright (c) 2015, Google Inc.
+ * @link      http://www.google.com/recaptcha
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace ReCaptcha\RequestMethod;
+
+/**
+ * Convenience wrapper around native socket and file functions to allow for
+ * mocking.
+ */
+class Socket
+{
+    private $handle = null;
+
+    /**
+     * fsockopen
+     * 
+     * @see http://php.net/fsockopen
+     * @param string $hostname
+     * @param int $port
+     * @param int $errno
+     * @param string $errstr
+     * @param float $timeout
+     * @return resource
+     */
+    public function fsockopen($hostname, $port = -1, &$errno = 0, &$errstr = '', $timeout = null)
+    {
+        $this->handle = fsockopen($hostname, $port, $errno, $errstr, (is_null($timeout) ? ini_get("default_socket_timeout") : $timeout));
+
+        if ($this->handle != false && $errno === 0 && $errstr === '') {
+            return $this->handle;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * fwrite
+     * 
+     * @see http://php.net/fwrite
+     * @param string $string
+     * @param int $length
+     * @return int | bool
+     */
+    public function fwrite($string, $length = null)
+    {
+        return fwrite($this->handle, $string, (is_null($length) ? strlen($string) : $length));
+    }
+
+    /**
+     * fgets
+     * 
+     * @see http://php.net/fgets
+     * @param int $length
+     * @return string
+     */
+    public function fgets($length = null)
+    {
+        return fgets($this->handle, $length);
+    }
+
+    /**
+     * feof
+     * 
+     * @see http://php.net/feof
+     * @return bool
+     */
+    public function feof()
+    {
+        return feof($this->handle);
+    }
+
+    /**
+     * fclose
+     * 
+     * @see http://php.net/fclose
+     * @return bool
+     */
+    public function fclose()
+    {
+        return fclose($this->handle);
+    }
+}
--- /dev/null
+++ b/vendor/google/recaptcha/src/ReCaptcha/RequestMethod/SocketPost.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ * This is a PHP library that handles calling reCAPTCHA.
+ *
+ * @copyright Copyright (c) 2015, Google Inc.
+ * @link      http://www.google.com/recaptcha
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace ReCaptcha\RequestMethod;
+
+use ReCaptcha\RequestMethod;
+use ReCaptcha\RequestParameters;
+
+/**
+ * Sends a POST request to the reCAPTCHA service, but makes use of fsockopen()
+ * instead of get_file_contents(). This is to account for people who may be on
+ * servers where allow_furl_open is disabled.
+ */
+class SocketPost implements RequestMethod
+{
+    /**
+     * reCAPTCHA service host.
+     * @const string
+     */
+    const RECAPTCHA_HOST = 'www.google.com';
+
+    /**
+     * @const string reCAPTCHA service path
+     */
+    const SITE_VERIFY_PATH = '/recaptcha/api/siteverify';
+
+    /**
+     * @const string Bad request error
+     */
+    const BAD_REQUEST = '{"success": false, "error-codes": ["invalid-request"]}';
+
+    /**
+     * @const string Bad response error
+     */
+    const BAD_RESPONSE = '{"success": false, "error-codes": ["invalid-response"]}';
+
+    /**
+     * Socket to the reCAPTCHA service
+     * @var Socket
+     */
+    private $socket;
+
+    /**
+     * Constructor
+     *
+     * @param \ReCaptcha\RequestMethod\Socket $socket optional socket, injectable for testing
+     */
+    public function __construct(Socket $socket = null)
+    {
+        if (!is_null($socket)) {
+            $this->socket = $socket;
+        } else {
+            $this->socket = new Socket();
+        }
+    }
+
+    /**
+     * Submit the POST request with the specified parameters.
+     *
+     * @param RequestParameters $params Request parameters
+     * @return string Body of the reCAPTCHA response
+     */
+    public function submit(RequestParameters $params)
+    {
+        $errno = 0;
+        $errstr = '';
+
+        if (false === $this->socket->fsockopen('ssl://' . self::RECAPTCHA_HOST, 443, $errno, $errstr, 30)) {
+            return self::BAD_REQUEST;
+        }
+
+        $content = $params->toQueryString();
+
+        $request = "POST " . self::SITE_VERIFY_PATH . " HTTP/1.1\r\n";
+        $request .= "Host: " . self::RECAPTCHA_HOST . "\r\n";
+        $request .= "Content-Type: application/x-www-form-urlencoded\r\n";
+        $request .= "Content-length: " . strlen($content) . "\r\n";
+        $request .= "Connection: close\r\n\r\n";
+        $request .= $content . "\r\n\r\n";
+
+        $this->socket->fwrite($request);
+        $response = '';
+
+        while (!$this->socket->feof()) {
+            $response .= $this->socket->fgets(4096);
+        }
+
+        $this->socket->fclose();
+
+        if (0 !== strpos($response, 'HTTP/1.1 200 OK')) {
+            return self::BAD_RESPONSE;
+        }
+
+        $parts = preg_split("#\n\s*\n#Uis", $response);
+
+        return $parts[1];
+    }
+}
--- /dev/null
+++ b/vendor/google/recaptcha/src/ReCaptcha/RequestParameters.php
@@ -0,0 +1,103 @@
+<?php
+/**
+ * This is a PHP library that handles calling reCAPTCHA.
+ *
+ * @copyright Copyright (c) 2015, Google Inc.
+ * @link      http://www.google.com/recaptcha
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace ReCaptcha;
+
+/**
+ * Stores and formats the parameters for the request to the reCAPTCHA service.
+ */
+class RequestParameters
+{
+    /**
+     * Site secret.
+     * @var string
+     */
+    private $secret;
+
+    /**
+     * Form response.
+     * @var string
+     */
+    private $response;
+
+    /**
+     * Remote user's IP address.
+     * @var string
+     */
+    private $remoteIp;
+
+    /**
+     * Client version.
+     * @var string
+     */
+    private $version;
+
+    /**
+     * Initialise parameters.
+     *
+     * @param string $secret Site secret.
+     * @param string $response Value from g-captcha-response form field.
+     * @param string $remoteIp User's IP address.
+     * @param string $version Version of this client library.
+     */
+    public function __construct($secret, $response, $remoteIp = null, $version = null)
+    {
+        $this->secret = $secret;
+        $this->response = $response;
+        $this->remoteIp = $remoteIp;
+        $this->version = $version;
+    }
+
+    /**
+     * Array representation.
+     *
+     * @return array Array formatted parameters.
+     */
+    public function toArray()
+    {
+        $params = array('secret' => $this->secret, 'response' => $this->response);
+
+        if (!is_null($this->remoteIp)) {
+            $params['remoteip'] = $this->remoteIp;
+        }
+
+        if (!is_null($this->version)) {
+            $params['version'] = $this->version;
+        }
+
+        return $params;
+    }
+
+    /**
+     * Query string representation for HTTP request.
+     *
+     * @return string Query string formatted parameters.
+     */
+    public function toQueryString()
+    {
+        return http_build_query($this->toArray(), '', '&');
+    }
+}
--- /dev/null
+++ b/vendor/google/recaptcha/src/ReCaptcha/Response.php
@@ -0,0 +1,102 @@
+<?php
+/**
+ * This is a PHP library that handles calling reCAPTCHA.
+ *
+ * @copyright Copyright (c) 2015, Google Inc.
+ * @link      http://www.google.com/recaptcha
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace ReCaptcha;
+
+/**
+ * The response returned from the service.
+ */
+class Response
+{
+    /**
+     * Succes or failure.
+     * @var boolean
+     */
+    private $success = false;
+
+    /**
+     * Error code strings.
+     * @var array
+     */
+    private $errorCodes = array();
+
+    /**
+     * Build the response from the expected JSON returned by the service.
+     *
+     * @param string $json
+     * @return \ReCaptcha\Response
+     */
+    public static function fromJson($json)
+    {
+        $responseData = json_decode($json, true);
+
+        if (!$responseData) {
+            return new Response(false, array('invalid-json'));
+        }
+
+        if (isset($responseData['success']) && $responseData['success'] == true) {
+            return new Response(true);
+        }
+
+        if (isset($responseData['error-codes']) && is_array($responseData['error-codes'])) {
+            return new Response(false, $responseData['error-codes']);
+        }
+
+        return new Response(false);
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param boolean $success
+     * @param array $errorCodes
+     */
+    public function __construct($success, array $errorCodes = array())
+    {
+        $this->success = $success;
+        $this->errorCodes = $errorCodes;
+    }
+
+    /**
+     * Is success?
+     *
+     * @return boolean
+     */
+    public function isSuccess()
+    {
+        return $this->success;
+    }
+
+    /**
+     * Get error codes.
+     *
+     * @return array
+     */
+    public function getErrorCodes()
+    {
+        return $this->errorCodes;
+    }
+}
--- /dev/null
+++ b/vendor/google/recaptcha/src/autoload.php
@@ -0,0 +1,38 @@
+<?php
+
+/* An autoloader for ReCaptcha\Foo classes. This should be require()d
+ * by the user before attempting to instantiate any of the ReCaptcha
+ * classes.
+ */
+
+spl_autoload_register(function ($class) {
+    if (substr($class, 0, 10) !== 'ReCaptcha\\') {
+      /* If the class does not lie under the "ReCaptcha" namespace,
+       * then we can exit immediately.
+       */
+      return;
+    }
+
+    /* All of the classes have names like "ReCaptcha\Foo", so we need
+     * to replace the backslashes with frontslashes if we want the
+     * name to map directly to a location in the filesystem.
+     */
+    $class = str_replace('\\', '/', $class);
+
+    /* First, check under the current directory. It is important that
+     * we look here first, so that we don't waste time searching for
+     * test classes in the common case.
+     */
+    $path = dirname(__FILE__).'/'.$class.'.php';
+    if (is_readable($path)) {
+        require_once $path;
+    }
+
+    /* If we didn't find what we're looking for already, maybe it's
+     * a test class?
+     */
+    $path = dirname(__FILE__).'/../tests/'.$class.'.php';
+    if (is_readable($path)) {
+        require_once $path;
+    }
+});
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2011-2015 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/composer.json
@@ -0,0 +1,33 @@
+{
+    "name": "guzzlehttp/guzzle",
+    "type": "library",
+    "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients",
+    "keywords": ["framework", "http", "rest", "web service", "curl", "client", "HTTP client"],
+    "homepage": "http://guzzlephp.org/",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Michael Dowling",
+            "email": "mtdowling@gmail.com",
+            "homepage": "https://github.com/mtdowling"
+        }
+    ],
+    "require": {
+        "php": ">=5.4.0",
+        "guzzlehttp/ringphp": "^1.1"
+    },
+    "require-dev": {
+        "ext-curl": "*",
+        "phpunit/phpunit": "^4.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "GuzzleHttp\\": "src/"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "GuzzleHttp\\Tests\\": "tests/"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/BatchResults.php
@@ -0,0 +1,148 @@
+<?php
+namespace GuzzleHttp;
+
+/**
+ * Represents the result of a batch operation. This result container is
+ * iterable, countable, and you can can get a result by value using the
+ * getResult function.
+ *
+ * Successful results are anything other than exceptions. Failure results are
+ * exceptions.
+ *
+ * @package GuzzleHttp
+ */
+class BatchResults implements \Countable, \IteratorAggregate, \ArrayAccess
+{
+    private $hash;
+
+    /**
+     * @param \SplObjectStorage $hash Hash of key objects to result values.
+     */
+    public function __construct(\SplObjectStorage $hash)
+    {
+        $this->hash = $hash;
+    }
+
+    /**
+     * Get the keys that are available on the batch result.
+     *
+     * @return array
+     */
+    public function getKeys()
+    {
+        return iterator_to_array($this->hash);
+    }
+
+    /**
+     * Gets a result from the container for the given object. When getting
+     * results for a batch of requests, provide the request object.
+     *
+     * @param object $forObject Object to retrieve the result for.
+     *
+     * @return mixed|null
+     */
+    public function getResult($forObject)
+    {
+        return isset($this->hash[$forObject]) ? $this->hash[$forObject] : null;
+    }
+
+    /**
+     * Get an array of successful results.
+     *
+     * @return array
+     */
+    public function getSuccessful()
+    {
+        $results = [];
+        foreach ($this->hash as $key) {
+            if (!($this->hash[$key] instanceof \Exception)) {
+                $results[] = $this->hash[$key];
+            }
+        }
+
+        return $results;
+    }
+
+    /**
+     * Get an array of failed results.
+     *
+     * @return array
+     */
+    public function getFailures()
+    {
+        $results = [];
+        foreach ($this->hash as $key) {
+            if ($this->hash[$key] instanceof \Exception) {
+                $results[] = $this->hash[$key];
+            }
+        }
+
+        return $results;
+    }
+
+    /**
+     * Allows iteration over all batch result values.
+     *
+     * @return \ArrayIterator
+     */
+    public function getIterator()
+    {
+        $results = [];
+        foreach ($this->hash as $key) {
+            $results[] = $this->hash[$key];
+        }
+
+        return new \ArrayIterator($results);
+    }
+
+    /**
+     * Counts the number of elements in the batch result.
+     *
+     * @return int
+     */
+    public function count()
+    {
+        return count($this->hash);
+    }
+
+    /**
+     * Checks if the batch contains a specific numerical array index.
+     *
+     * @param int $key Index to access
+     *
+     * @return bool
+     */
+    public function offsetExists($key)
+    {
+        return $key < count($this->hash);
+    }
+
+    /**
+     * Allows access of the batch using a numerical array index.
+     *
+     * @param int $key Index to access.
+     *
+     * @return mixed|null
+     */
+    public function offsetGet($key)
+    {
+        $i = -1;
+        foreach ($this->hash as $obj) {
+            if ($key === ++$i) {
+                return $this->hash[$obj];
+            }
+        }
+
+        return null;
+    }
+
+    public function offsetUnset($key)
+    {
+        throw new \RuntimeException('Not implemented');
+    }
+
+    public function offsetSet($key, $value)
+    {
+        throw new \RuntimeException('Not implemented');
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Client.php
@@ -0,0 +1,355 @@
+<?php
+namespace GuzzleHttp;
+
+use GuzzleHttp\Event\HasEmitterTrait;
+use GuzzleHttp\Message\MessageFactory;
+use GuzzleHttp\Message\MessageFactoryInterface;
+use GuzzleHttp\Message\RequestInterface;
+use GuzzleHttp\Message\FutureResponse;
+use GuzzleHttp\Ring\Core;
+use GuzzleHttp\Ring\Future\FutureInterface;
+use GuzzleHttp\Exception\RequestException;
+use React\Promise\FulfilledPromise;
+use React\Promise\RejectedPromise;
+
+/**
+ * HTTP client
+ */
+class Client implements ClientInterface
+{
+    use HasEmitterTrait;
+
+    /** @var MessageFactoryInterface Request factory used by the client */
+    private $messageFactory;
+
+    /** @var Url Base URL of the client */
+    private $baseUrl;
+
+    /** @var array Default request options */
+    private $defaults;
+
+    /** @var callable Request state machine */
+    private $fsm;
+
+    /**
+     * Clients accept an array of constructor parameters.
+     *
+     * Here's an example of creating a client using an URI template for the
+     * client's base_url and an array of default request options to apply
+     * to each request:
+     *
+     *     $client = new Client([
+     *         'base_url' => [
+     *              'http://www.foo.com/{version}/',
+     *              ['version' => '123']
+     *          ],
+     *         'defaults' => [
+     *             'timeout'         => 10,
+     *             'allow_redirects' => false,
+     *             'proxy'           => '192.168.16.1:10'
+     *         ]
+     *     ]);
+     *
+     * @param array $config Client configuration settings
+     *     - base_url: Base URL of the client that is merged into relative URLs.
+     *       Can be a string or an array that contains a URI template followed
+     *       by an associative array of expansion variables to inject into the
+     *       URI template.
+     *     - handler: callable RingPHP handler used to transfer requests
+     *     - message_factory: Factory used to create request and response object
+     *     - defaults: Default request options to apply to each request
+     *     - emitter: Event emitter used for request events
+     *     - fsm: (internal use only) The request finite state machine. A
+     *       function that accepts a transaction and optional final state. The
+     *       function is responsible for transitioning a request through its
+     *       lifecycle events.
+     */
+    public function __construct(array $config = [])
+    {
+        $this->configureBaseUrl($config);
+        $this->configureDefaults($config);
+
+        if (isset($config['emitter'])) {
+            $this->emitter = $config['emitter'];
+        }
+
+        $this->messageFactory = isset($config['message_factory'])
+            ? $config['message_factory']
+            : new MessageFactory();
+
+        if (isset($config['fsm'])) {
+            $this->fsm = $config['fsm'];
+        } else {
+            if (isset($config['handler'])) {
+                $handler = $config['handler'];
+            } elseif (isset($config['adapter'])) {
+                $handler = $config['adapter'];
+            } else {
+                $handler = Utils::getDefaultHandler();
+            }
+            $this->fsm = new RequestFsm($handler, $this->messageFactory);
+        }
+    }
+
+    public function getDefaultOption($keyOrPath = null)
+    {
+        return $keyOrPath === null
+            ? $this->defaults
+            : Utils::getPath($this->defaults, $keyOrPath);
+    }
+
+    public function setDefaultOption($keyOrPath, $value)
+    {
+        Utils::setPath($this->defaults, $keyOrPath, $value);
+    }
+
+    public function getBaseUrl()
+    {
+        return (string) $this->baseUrl;
+    }
+
+    public function createRequest($method, $url = null, array $options = [])
+    {
+        $options = $this->mergeDefaults($options);
+        // Use a clone of the client's emitter
+        $options['config']['emitter'] = clone $this->getEmitter();
+        $url = $url || (is_string($url) && strlen($url))
+            ? $this->buildUrl($url)
+            : (string) $this->baseUrl;
+
+        return $this->messageFactory->createRequest($method, $url, $options);
+    }
+
+    public function get($url = null, $options = [])
+    {
+        return $this->send($this->createRequest('GET', $url, $options));
+    }
+
+    public function head($url = null, array $options = [])
+    {
+        return $this->send($this->createRequest('HEAD', $url, $options));
+    }
+
+    public function delete($url = null, array $options = [])
+    {
+        return $this->send($this->createRequest('DELETE', $url, $options));
+    }
+
+    public function put($url = null, array $options = [])
+    {
+        return $this->send($this->createRequest('PUT', $url, $options));
+    }
+
+    public function patch($url = null, array $options = [])
+    {
+        return $this->send($this->createRequest('PATCH', $url, $options));
+    }
+
+    public function post($url = null, array $options = [])
+    {
+        return $this->send($this->createRequest('POST', $url, $options));
+    }
+
+    public function options($url = null, array $options = [])
+    {
+        return $this->send($this->createRequest('OPTIONS', $url, $options));
+    }
+
+    public function send(RequestInterface $request)
+    {
+        $isFuture = $request->getConfig()->get('future');
+        $trans = new Transaction($this, $request, $isFuture);
+        $fn = $this->fsm;
+
+        try {
+            $fn($trans);
+            if ($isFuture) {
+                // Turn the normal response into a future if needed.
+                return $trans->response instanceof FutureInterface
+                    ? $trans->response
+                    : new FutureResponse(new FulfilledPromise($trans->response));
+            }
+            // Resolve deep futures if this is not a future
+            // transaction. This accounts for things like retries
+            // that do not have an immediate side-effect.
+            while ($trans->response instanceof FutureInterface) {
+                $trans->response = $trans->response->wait();
+            }
+            return $trans->response;
+        } catch (\Exception $e) {
+            if ($isFuture) {
+                // Wrap the exception in a promise
+                return new FutureResponse(new RejectedPromise($e));
+            }
+            throw RequestException::wrapException($trans->request, $e);
+        }
+    }
+
+    /**
+     * Get an array of default options to apply to the client
+     *
+     * @return array
+     */
+    protected function getDefaultOptions()
+    {
+        $settings = [
+            'allow_redirects' => true,
+            'exceptions'      => true,
+            'decode_content'  => true,
+            'verify'          => true
+        ];
+
+        // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set.
+        // We can only trust the HTTP_PROXY environment variable in a CLI
+        // process due to the fact that PHP has no reliable mechanism to
+        // get environment variables that start with "HTTP_".
+        if (php_sapi_name() == 'cli' && getenv('HTTP_PROXY')) {
+            $settings['proxy']['http'] = getenv('HTTP_PROXY');
+        }
+
+        if ($proxy = getenv('HTTPS_PROXY')) {
+            $settings['proxy']['https'] = $proxy;
+        }
+
+        return $settings;
+    }
+
+    /**
+     * Expand a URI template and inherit from the base URL if it's relative
+     *
+     * @param string|array $url URL or an array of the URI template to expand
+     *                          followed by a hash of template varnames.
+     * @return string
+     * @throws \InvalidArgumentException
+     */
+    private function buildUrl($url)
+    {
+        // URI template (absolute or relative)
+        if (!is_array($url)) {
+            return strpos($url, '://')
+                ? (string) $url
+                : (string) $this->baseUrl->combine($url);
+        }
+
+        if (!isset($url[1])) {
+            throw new \InvalidArgumentException('You must provide a hash of '
+                . 'varname options in the second element of a URL array.');
+        }
+
+        // Absolute URL
+        if (strpos($url[0], '://')) {
+            return Utils::uriTemplate($url[0], $url[1]);
+        }
+
+        // Combine the relative URL with the base URL
+        return (string) $this->baseUrl->combine(
+            Utils::uriTemplate($url[0], $url[1])
+        );
+    }
+
+    private function configureBaseUrl(&$config)
+    {
+        if (!isset($config['base_url'])) {
+            $this->baseUrl = new Url('', '');
+        } elseif (!is_array($config['base_url'])) {
+            $this->baseUrl = Url::fromString($config['base_url']);
+        } elseif (count($config['base_url']) < 2) {
+            throw new \InvalidArgumentException('You must provide a hash of '
+                . 'varname options in the second element of a base_url array.');
+        } else {
+            $this->baseUrl = Url::fromString(
+                Utils::uriTemplate(
+                    $config['base_url'][0],
+                    $config['base_url'][1]
+                )
+            );
+            $config['base_url'] = (string) $this->baseUrl;
+        }
+    }
+
+    private function configureDefaults($config)
+    {
+        if (!isset($config['defaults'])) {
+            $this->defaults = $this->getDefaultOptions();
+        } else {
+            $this->defaults = array_replace(
+                $this->getDefaultOptions(),
+                $config['defaults']
+            );
+        }
+
+        // Add the default user-agent header
+        if (!isset($this->defaults['headers'])) {
+            $this->defaults['headers'] = [
+                'User-Agent' => Utils::getDefaultUserAgent()
+            ];
+        } elseif (!Core::hasHeader($this->defaults, 'User-Agent')) {
+            // Add the User-Agent header if one was not already set
+            $this->defaults['headers']['User-Agent'] = Utils::getDefaultUserAgent();
+        }
+    }
+
+    /**
+     * Merges default options into the array passed by reference.
+     *
+     * @param array $options Options to modify by reference
+     *
+     * @return array
+     */
+    private function mergeDefaults($options)
+    {
+        $defaults = $this->defaults;
+
+        // Case-insensitively merge in default headers if both defaults and
+        // options have headers specified.
+        if (!empty($defaults['headers']) && !empty($options['headers'])) {
+            // Create a set of lowercased keys that are present.
+            $lkeys = [];
+            foreach (array_keys($options['headers']) as $k) {
+                $lkeys[strtolower($k)] = true;
+            }
+            // Merge in lowercase default keys when not present in above set.
+            foreach ($defaults['headers'] as $key => $value) {
+                if (!isset($lkeys[strtolower($key)])) {
+                    $options['headers'][$key] = $value;
+                }
+            }
+            // No longer need to merge in headers.
+            unset($defaults['headers']);
+        }
+
+        $result = array_replace_recursive($defaults, $options);
+        foreach ($options as $k => $v) {
+            if ($v === null) {
+                unset($result[$k]);
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * @deprecated Use {@see GuzzleHttp\Pool} instead.
+     * @see GuzzleHttp\Pool
+     */
+    public function sendAll($requests, array $options = [])
+    {
+        Pool::send($this, $requests, $options);
+    }
+
+    /**
+     * @deprecated Use GuzzleHttp\Utils::getDefaultHandler
+     */
+    public static function getDefaultHandler()
+    {
+        return Utils::getDefaultHandler();
+    }
+
+    /**
+     * @deprecated Use GuzzleHttp\Utils::getDefaultUserAgent
+     */
+    public static function getDefaultUserAgent()
+    {
+        return Utils::getDefaultUserAgent();
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/ClientInterface.php
@@ -0,0 +1,150 @@
+<?php
+namespace GuzzleHttp;
+
+use GuzzleHttp\Event\HasEmitterInterface;
+use GuzzleHttp\Exception\RequestException;
+use GuzzleHttp\Message\RequestInterface;
+use GuzzleHttp\Message\ResponseInterface;
+
+/**
+ * Client interface for sending HTTP requests
+ */
+interface ClientInterface extends HasEmitterInterface
+{
+    const VERSION = '5.3.1';
+
+    /**
+     * Create and return a new {@see RequestInterface} object.
+     *
+     * Use an absolute path to override the base path of the client, or a
+     * relative path to append to the base path of the client. The URL can
+     * contain the query string as well. Use an array to provide a URL
+     * template and additional variables to use in the URL template expansion.
+     *
+     * @param string           $method  HTTP method
+     * @param string|array|Url $url     URL or URI template
+     * @param array            $options Array of request options to apply.
+     *
+     * @return RequestInterface
+     */
+    public function createRequest($method, $url = null, array $options = []);
+
+    /**
+     * Send a GET request
+     *
+     * @param string|array|Url $url     URL or URI template
+     * @param array            $options Array of request options to apply.
+     *
+     * @return ResponseInterface
+     * @throws RequestException When an error is encountered
+     */
+    public function get($url = null, $options = []);
+
+    /**
+     * Send a HEAD request
+     *
+     * @param string|array|Url $url     URL or URI template
+     * @param array            $options Array of request options to apply.
+     *
+     * @return ResponseInterface
+     * @throws RequestException When an error is encountered
+     */
+    public function head($url = null, array $options = []);
+
+    /**
+     * Send a DELETE request
+     *
+     * @param string|array|Url $url     URL or URI template
+     * @param array            $options Array of request options to apply.
+     *
+     * @return ResponseInterface
+     * @throws RequestException When an error is encountered
+     */
+    public function delete($url = null, array $options = []);
+
+    /**
+     * Send a PUT request
+     *
+     * @param string|array|Url $url     URL or URI template
+     * @param array            $options Array of request options to apply.
+     *
+     * @return ResponseInterface
+     * @throws RequestException When an error is encountered
+     */
+    public function put($url = null, array $options = []);
+
+    /**
+     * Send a PATCH request
+     *
+     * @param string|array|Url $url     URL or URI template
+     * @param array            $options Array of request options to apply.
+     *
+     * @return ResponseInterface
+     * @throws RequestException When an error is encountered
+     */
+    public function patch($url = null, array $options = []);
+
+    /**
+     * Send a POST request
+     *
+     * @param string|array|Url $url     URL or URI template
+     * @param array            $options Array of request options to apply.
+     *
+     * @return ResponseInterface
+     * @throws RequestException When an error is encountered
+     */
+    public function post($url = null, array $options = []);
+
+    /**
+     * Send an OPTIONS request
+     *
+     * @param string|array|Url $url     URL or URI template
+     * @param array            $options Array of request options to apply.
+     *
+     * @return ResponseInterface
+     * @throws RequestException When an error is encountered
+     */
+    public function options($url = null, array $options = []);
+
+    /**
+     * Sends a single request
+     *
+     * @param RequestInterface $request Request to send
+     *
+     * @return \GuzzleHttp\Message\ResponseInterface
+     * @throws \LogicException When the handler does not populate a response
+     * @throws RequestException When an error is encountered
+     */
+    public function send(RequestInterface $request);
+
+    /**
+     * Get default request options of the client.
+     *
+     * @param string|null $keyOrPath The Path to a particular default request
+     *     option to retrieve or pass null to retrieve all default request
+     *     options. The syntax uses "/" to denote a path through nested PHP
+     *     arrays. For example, "headers/content-type".
+     *
+     * @return mixed
+     */
+    public function getDefaultOption($keyOrPath = null);
+
+    /**
+     * Set a default request option on the client so that any request created
+     * by the client will use the provided default value unless overridden
+     * explicitly when creating a request.
+     *
+     * @param string|null $keyOrPath The Path to a particular configuration
+     *     value to set. The syntax uses a path notation that allows you to
+     *     specify nested configuration values (e.g., 'headers/content-type').
+     * @param mixed $value Default request option value to set
+     */
+    public function setDefaultOption($keyOrPath, $value);
+
+    /**
+     * Get the base URL of the client.
+     *
+     * @return string Returns the base URL if present
+     */
+    public function getBaseUrl();
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Collection.php
@@ -0,0 +1,236 @@
+<?php
+namespace GuzzleHttp;
+
+/**
+ * Key value pair collection object
+ */
+class Collection implements
+    \ArrayAccess,
+    \IteratorAggregate,
+    \Countable,
+    ToArrayInterface
+{
+    use HasDataTrait;
+
+    /**
+     * @param array $data Associative array of data to set
+     */
+    public function __construct(array $data = [])
+    {
+        $this->data = $data;
+    }
+
+    /**
+     * Create a new collection from an array, validate the keys, and add default
+     * values where missing
+     *
+     * @param array $config   Configuration values to apply.
+     * @param array $defaults Default parameters
+     * @param array $required Required parameter names
+     *
+     * @return self
+     * @throws \InvalidArgumentException if a parameter is missing
+     */
+    public static function fromConfig(
+        array $config = [],
+        array $defaults = [],
+        array $required = []
+    ) {
+        $data = $config + $defaults;
+
+        if ($missing = array_diff($required, array_keys($data))) {
+            throw new \InvalidArgumentException(
+                'Config is missing the following keys: ' .
+                implode(', ', $missing));
+        }
+
+        return new self($data);
+    }
+
+    /**
+     * Removes all key value pairs
+     */
+    public function clear()
+    {
+        $this->data = [];
+    }
+
+    /**
+     * Get a specific key value.
+     *
+     * @param string $key Key to retrieve.
+     *
+     * @return mixed|null Value of the key or NULL
+     */
+    public function get($key)
+    {
+        return isset($this->data[$key]) ? $this->data[$key] : null;
+    }
+
+    /**
+     * Set a key value pair
+     *
+     * @param string $key   Key to set
+     * @param mixed  $value Value to set
+     */
+    public function set($key, $value)
+    {
+        $this->data[$key] = $value;
+    }
+
+    /**
+     * Add a value to a key.  If a key of the same name has already been added,
+     * the key value will be converted into an array and the new value will be
+     * pushed to the end of the array.
+     *
+     * @param string $key   Key to add
+     * @param mixed  $value Value to add to the key
+     */
+    public function add($key, $value)
+    {
+        if (!array_key_exists($key, $this->data)) {
+            $this->data[$key] = $value;
+        } elseif (is_array($this->data[$key])) {
+            $this->data[$key][] = $value;
+        } else {
+            $this->data[$key] = array($this->data[$key], $value);
+        }
+    }
+
+    /**
+     * Remove a specific key value pair
+     *
+     * @param string $key A key to remove
+     */
+    public function remove($key)
+    {
+        unset($this->data[$key]);
+    }
+
+    /**
+     * Get all keys in the collection
+     *
+     * @return array
+     */
+    public function getKeys()
+    {
+        return array_keys($this->data);
+    }
+
+    /**
+     * Returns whether or not the specified key is present.
+     *
+     * @param string $key The key for which to check the existence.
+     *
+     * @return bool
+     */
+    public function hasKey($key)
+    {
+        return array_key_exists($key, $this->data);
+    }
+
+    /**
+     * Checks if any keys contains a certain value
+     *
+     * @param string $value Value to search for
+     *
+     * @return mixed Returns the key if the value was found FALSE if the value
+     *     was not found.
+     */
+    public function hasValue($value)
+    {
+        return array_search($value, $this->data, true);
+    }
+
+    /**
+     * Replace the data of the object with the value of an array
+     *
+     * @param array $data Associative array of data
+     */
+    public function replace(array $data)
+    {
+        $this->data = $data;
+    }
+
+    /**
+     * Add and merge in a Collection or array of key value pair data.
+     *
+     * @param Collection|array $data Associative array of key value pair data
+     */
+    public function merge($data)
+    {
+        foreach ($data as $key => $value) {
+            $this->add($key, $value);
+        }
+    }
+
+    /**
+     * Overwrite key value pairs in this collection with all of the data from
+     * an array or collection.
+     *
+     * @param array|\Traversable $data Values to override over this config
+     */
+    public function overwriteWith($data)
+    {
+        if (is_array($data)) {
+            $this->data = $data + $this->data;
+        } elseif ($data instanceof Collection) {
+            $this->data = $data->toArray() + $this->data;
+        } else {
+            foreach ($data as $key => $value) {
+                $this->data[$key] = $value;
+            }
+        }
+    }
+
+    /**
+     * Returns a Collection containing all the elements of the collection after
+     * applying the callback function to each one.
+     *
+     * The callable should accept three arguments:
+     * - (string) $key
+     * - (string) $value
+     * - (array) $context
+     *
+     * The callable must return a the altered or unaltered value.
+     *
+     * @param callable $closure Map function to apply
+     * @param array    $context Context to pass to the callable
+     *
+     * @return Collection
+     */
+    public function map(callable $closure, array $context = [])
+    {
+        $collection = new static();
+        foreach ($this as $key => $value) {
+            $collection[$key] = $closure($key, $value, $context);
+        }
+
+        return $collection;
+    }
+
+    /**
+     * Iterates over each key value pair in the collection passing them to the
+     * callable. If the callable returns true, the current value from input is
+     * returned into the result Collection.
+     *
+     * The callable must accept two arguments:
+     * - (string) $key
+     * - (string) $value
+     *
+     * @param callable $closure Evaluation function
+     *
+     * @return Collection
+     */
+    public function filter(callable $closure)
+    {
+        $collection = new static();
+        foreach ($this->data as $key => $value) {
+            if ($closure($key, $value)) {
+                $collection[$key] = $value;
+            }
+        }
+
+        return $collection;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
@@ -0,0 +1,248 @@
+<?php
+namespace GuzzleHttp\Cookie;
+
+use GuzzleHttp\Message\RequestInterface;
+use GuzzleHttp\Message\ResponseInterface;
+use GuzzleHttp\ToArrayInterface;
+
+/**
+ * Cookie jar that stores cookies an an array
+ */
+class CookieJar implements CookieJarInterface, ToArrayInterface
+{
+    /** @var SetCookie[] Loaded cookie data */
+    private $cookies = [];
+
+    /** @var bool */
+    private $strictMode;
+
+    /**
+     * @param bool $strictMode   Set to true to throw exceptions when invalid
+     *                           cookies are added to the cookie jar.
+     * @param array $cookieArray Array of SetCookie objects or a hash of arrays
+     *                           that can be used with the SetCookie constructor
+     */
+    public function __construct($strictMode = false, $cookieArray = [])
+    {
+        $this->strictMode = $strictMode;
+
+        foreach ($cookieArray as $cookie) {
+            if (!($cookie instanceof SetCookie)) {
+                $cookie = new SetCookie($cookie);
+            }
+            $this->setCookie($cookie);
+        }
+    }
+
+    /**
+     * Create a new Cookie jar from an associative array and domain.
+     *
+     * @param array  $cookies Cookies to create the jar from
+     * @param string $domain  Domain to set the cookies to
+     *
+     * @return self
+     */
+    public static function fromArray(array $cookies, $domain)
+    {
+        $cookieJar = new self();
+        foreach ($cookies as $name => $value) {
+            $cookieJar->setCookie(new SetCookie([
+                'Domain'  => $domain,
+                'Name'    => $name,
+                'Value'   => $value,
+                'Discard' => true
+            ]));
+        }
+
+        return $cookieJar;
+    }
+
+    /**
+     * Quote the cookie value if it is not already quoted and it contains
+     * problematic characters.
+     *
+     * @param string $value Value that may or may not need to be quoted
+     *
+     * @return string
+     */
+    public static function getCookieValue($value)
+    {
+        if (substr($value, 0, 1) !== '"' &&
+            substr($value, -1, 1) !== '"' &&
+            strpbrk($value, ';,')
+        ) {
+            $value = '"' . $value . '"';
+        }
+
+        return $value;
+    }
+
+    public function toArray()
+    {
+        return array_map(function (SetCookie $cookie) {
+            return $cookie->toArray();
+        }, $this->getIterator()->getArrayCopy());
+    }
+
+    public function clear($domain = null, $path = null, $name = null)
+    {
+        if (!$domain) {
+            $this->cookies = [];
+            return;
+        } elseif (!$path) {
+            $this->cookies = array_filter(
+                $this->cookies,
+                function (SetCookie $cookie) use ($path, $domain) {
+                    return !$cookie->matchesDomain($domain);
+                }
+            );
+        } elseif (!$name) {
+            $this->cookies = array_filter(
+                $this->cookies,
+                function (SetCookie $cookie) use ($path, $domain) {
+                    return !($cookie->matchesPath($path) &&
+                        $cookie->matchesDomain($domain));
+                }
+            );
+        } else {
+            $this->cookies = array_filter(
+                $this->cookies,
+                function (SetCookie $cookie) use ($path, $domain, $name) {
+                    return !($cookie->getName() == $name &&
+                        $cookie->matchesPath($path) &&
+                        $cookie->matchesDomain($domain));
+                }
+            );
+        }
+    }
+
+    public function clearSessionCookies()
+    {
+        $this->cookies = array_filter(
+            $this->cookies,
+            function (SetCookie $cookie) {
+                return !$cookie->getDiscard() && $cookie->getExpires();
+            }
+        );
+    }
+
+    public function setCookie(SetCookie $cookie)
+    {
+        // Only allow cookies with set and valid domain, name, value
+        $result = $cookie->validate();
+        if ($result !== true) {
+            if ($this->strictMode) {
+                throw new \RuntimeException('Invalid cookie: ' . $result);
+            } else {
+                $this->removeCookieIfEmpty($cookie);
+                return false;
+            }
+        }
+
+        // Resolve conflicts with previously set cookies
+        foreach ($this->cookies as $i => $c) {
+
+            // Two cookies are identical, when their path, and domain are
+            // identical.
+            if ($c->getPath() != $cookie->getPath() ||
+                $c->getDomain() != $cookie->getDomain() ||
+                $c->getName() != $cookie->getName()
+            ) {
+                continue;
+            }
+
+            // The previously set cookie is a discard cookie and this one is
+            // not so allow the new cookie to be set
+            if (!$cookie->getDiscard() && $c->getDiscard()) {
+                unset($this->cookies[$i]);
+                continue;
+            }
+
+            // If the new cookie's expiration is further into the future, then
+            // replace the old cookie
+            if ($cookie->getExpires() > $c->getExpires()) {
+                unset($this->cookies[$i]);
+                continue;
+            }
+
+            // If the value has changed, we better change it
+            if ($cookie->getValue() !== $c->getValue()) {
+                unset($this->cookies[$i]);
+                continue;
+            }
+
+            // The cookie exists, so no need to continue
+            return false;
+        }
+
+        $this->cookies[] = $cookie;
+
+        return true;
+    }
+
+    public function count()
+    {
+        return count($this->cookies);
+    }
+
+    public function getIterator()
+    {
+        return new \ArrayIterator(array_values($this->cookies));
+    }
+
+    public function extractCookies(
+        RequestInterface $request,
+        ResponseInterface $response
+    ) {
+        if ($cookieHeader = $response->getHeaderAsArray('Set-Cookie')) {
+            foreach ($cookieHeader as $cookie) {
+                $sc = SetCookie::fromString($cookie);
+                if (!$sc->getDomain()) {
+                    $sc->setDomain($request->getHost());
+                }
+                $this->setCookie($sc);
+            }
+        }
+    }
+
+    public function addCookieHeader(RequestInterface $request)
+    {
+        $values = [];
+        $scheme = $request->getScheme();
+        $host = $request->getHost();
+        $path = $request->getPath();
+
+        foreach ($this->cookies as $cookie) {
+            if ($cookie->matchesPath($path) &&
+                $cookie->matchesDomain($host) &&
+                !$cookie->isExpired() &&
+                (!$cookie->getSecure() || $scheme == 'https')
+            ) {
+                $values[] = $cookie->getName() . '='
+                    . self::getCookieValue($cookie->getValue());
+            }
+        }
+
+        if ($values) {
+            $request->setHeader('Cookie', implode('; ', $values));
+        }
+    }
+
+    /**
+     * If a cookie already exists and the server asks to set it again with a
+     * null value, the cookie must be deleted.
+     *
+     * @param SetCookie $cookie
+     */
+    private function removeCookieIfEmpty(SetCookie $cookie)
+    {
+        $cookieValue = $cookie->getValue();
+        if ($cookieValue === null || $cookieValue === '') {
+            $this->clear(
+                $cookie->getDomain(),
+                $cookie->getPath(),
+                $cookie->getName()
+            );
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php
@@ -0,0 +1,75 @@
+<?php
+namespace GuzzleHttp\Cookie;
+
+use GuzzleHttp\Message\RequestInterface;
+use GuzzleHttp\Message\ResponseInterface;
+
+/**
+ * Stores HTTP cookies.
+ *
+ * It extracts cookies from HTTP requests, and returns them in HTTP responses.
+ * CookieJarInterface instances automatically expire contained cookies when
+ * necessary. Subclasses are also responsible for storing and retrieving
+ * cookies from a file, database, etc.
+ *
+ * @link http://docs.python.org/2/library/cookielib.html Inspiration
+ */
+interface CookieJarInterface extends \Countable, \IteratorAggregate
+{
+    /**
+     * Add a Cookie header to a request.
+     *
+     * If no matching cookies are found in the cookie jar, then no Cookie
+     * header is added to the request.
+     *
+     * @param RequestInterface $request Request object to update
+     */
+    public function addCookieHeader(RequestInterface $request);
+
+    /**
+     * Extract cookies from an HTTP response and store them in the CookieJar.
+     *
+     * @param RequestInterface  $request  Request that was sent
+     * @param ResponseInterface $response Response that was received
+     */
+    public function extractCookies(
+        RequestInterface $request,
+        ResponseInterface $response
+    );
+
+    /**
+     * Sets a cookie in the cookie jar.
+     *
+     * @param SetCookie $cookie Cookie to set.
+     *
+     * @return bool Returns true on success or false on failure
+     */
+    public function setCookie(SetCookie $cookie);
+
+    /**
+     * Remove cookies currently held in the cookie jar.
+     *
+     * Invoking this method without arguments will empty the whole cookie jar.
+     * If given a $domain argument only cookies belonging to that domain will
+     * be removed. If given a $domain and $path argument, cookies belonging to
+     * the specified path within that domain are removed. If given all three
+     * arguments, then the cookie with the specified name, path and domain is
+     * removed.
+     *
+     * @param string $domain Clears cookies matching a domain
+     * @param string $path   Clears cookies matching a domain and path
+     * @param string $name   Clears cookies matching a domain, path, and name
+     *
+     * @return CookieJarInterface
+     */
+    public function clear($domain = null, $path = null, $name = null);
+
+    /**
+     * Discard all sessions cookies.
+     *
+     * Removes cookies that don't have an expire field or a have a discard
+     * field set to true. To be called when the user agent shuts down according
+     * to RFC 2965.
+     */
+    public function clearSessionCookies();
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php
@@ -0,0 +1,86 @@
+<?php
+namespace GuzzleHttp\Cookie;
+
+use GuzzleHttp\Utils;
+
+/**
+ * Persists non-session cookies using a JSON formatted file
+ */
+class FileCookieJar extends CookieJar
+{
+    /** @var string filename */
+    private $filename;
+
+    /**
+     * Create a new FileCookieJar object
+     *
+     * @param string $cookieFile File to store the cookie data
+     *
+     * @throws \RuntimeException if the file cannot be found or created
+     */
+    public function __construct($cookieFile)
+    {
+        $this->filename = $cookieFile;
+
+        if (file_exists($cookieFile)) {
+            $this->load($cookieFile);
+        }
+    }
+
+    /**
+     * Saves the file when shutting down
+     */
+    public function __destruct()
+    {
+        $this->save($this->filename);
+    }
+
+    /**
+     * Saves the cookies to a file.
+     *
+     * @param string $filename File to save
+     * @throws \RuntimeException if the file cannot be found or created
+     */
+    public function save($filename)
+    {
+        $json = [];
+        foreach ($this as $cookie) {
+            if ($cookie->getExpires() && !$cookie->getDiscard()) {
+                $json[] = $cookie->toArray();
+            }
+        }
+
+        if (false === file_put_contents($filename, json_encode($json))) {
+            // @codeCoverageIgnoreStart
+            throw new \RuntimeException("Unable to save file {$filename}");
+            // @codeCoverageIgnoreEnd
+        }
+    }
+
+    /**
+     * Load cookies from a JSON formatted file.
+     *
+     * Old cookies are kept unless overwritten by newly loaded ones.
+     *
+     * @param string $filename Cookie file to load.
+     * @throws \RuntimeException if the file cannot be loaded.
+     */
+    public function load($filename)
+    {
+        $json = file_get_contents($filename);
+        if (false === $json) {
+            // @codeCoverageIgnoreStart
+            throw new \RuntimeException("Unable to load file {$filename}");
+            // @codeCoverageIgnoreEnd
+        }
+
+        $data = Utils::jsonDecode($json, true);
+        if (is_array($data)) {
+            foreach (Utils::jsonDecode($json, true) as $cookie) {
+                $this->setCookie(new SetCookie($cookie));
+            }
+        } elseif (strlen($data)) {
+            throw new \RuntimeException("Invalid cookie file: {$filename}");
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php
@@ -0,0 +1,66 @@
+<?php
+namespace GuzzleHttp\Cookie;
+
+use GuzzleHttp\Utils;
+
+/**
+ * Persists cookies in the client session
+ */
+class SessionCookieJar extends CookieJar
+{
+    /** @var string session key */
+    private $sessionKey;
+
+    /**
+     * Create a new SessionCookieJar object
+     *
+     * @param string $sessionKey Session key name to store the cookie data in session
+     */
+    public function __construct($sessionKey)
+    {
+        $this->sessionKey = $sessionKey;
+        $this->load();
+    }
+
+    /**
+     * Saves cookies to session when shutting down
+     */
+    public function __destruct()
+    {
+        $this->save();
+    }
+
+    /**
+     * Save cookies to the client session
+     */
+    public function save()
+    {
+        $json = [];
+        foreach ($this as $cookie) {
+            if ($cookie->getExpires() && !$cookie->getDiscard()) {
+                $json[] = $cookie->toArray();
+            }
+        }
+
+        $_SESSION[$this->sessionKey] = json_encode($json);
+    }
+
+    /**
+     * Load the contents of the client session into the data array
+     */
+    protected function load()
+    {
+        $cookieJar = isset($_SESSION[$this->sessionKey])
+            ? $_SESSION[$this->sessionKey]
+            : null;
+
+        $data = Utils::jsonDecode($cookieJar, true);
+        if (is_array($data)) {
+            foreach ($data as $cookie) {
+                $this->setCookie(new SetCookie($cookie));
+            }
+        } elseif (strlen($data)) {
+            throw new \RuntimeException("Invalid cookie data");
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php
@@ -0,0 +1,373 @@
+<?php
+namespace GuzzleHttp\Cookie;
+
+use GuzzleHttp\ToArrayInterface;
+
+/**
+ * Set-Cookie object
+ */
+class SetCookie implements ToArrayInterface
+{
+    /** @var array */
+    private static $defaults = [
+        'Name'     => null,
+        'Value'    => null,
+        'Domain'   => null,
+        'Path'     => '/',
+        'Max-Age'  => null,
+        'Expires'  => null,
+        'Secure'   => false,
+        'Discard'  => false,
+        'HttpOnly' => false
+    ];
+
+    /** @var array Cookie data */
+    private $data;
+
+    /**
+     * Create a new SetCookie object from a string
+     *
+     * @param string $cookie Set-Cookie header string
+     *
+     * @return self
+     */
+    public static function fromString($cookie)
+    {
+        // Create the default return array
+        $data = self::$defaults;
+        // Explode the cookie string using a series of semicolons
+        $pieces = array_filter(array_map('trim', explode(';', $cookie)));
+        // The name of the cookie (first kvp) must include an equal sign.
+        if (empty($pieces) || !strpos($pieces[0], '=')) {
+            return new self($data);
+        }
+
+        // Add the cookie pieces into the parsed data array
+        foreach ($pieces as $part) {
+
+            $cookieParts = explode('=', $part, 2);
+            $key = trim($cookieParts[0]);
+            $value = isset($cookieParts[1])
+                ? trim($cookieParts[1], " \n\r\t\0\x0B\"")
+                : true;
+
+            // Only check for non-cookies when cookies have been found
+            if (empty($data['Name'])) {
+                $data['Name'] = $key;
+                $data['Value'] = $value;
+            } else {
+                foreach (array_keys(self::$defaults) as $search) {
+                    if (!strcasecmp($search, $key)) {
+                        $data[$search] = $value;
+                        continue 2;
+                    }
+                }
+                $data[$key] = $value;
+            }
+        }
+
+        return new self($data);
+    }
+
+    /**
+     * @param array $data Array of cookie data provided by a Cookie parser
+     */
+    public function __construct(array $data = [])
+    {
+        $this->data = array_replace(self::$defaults, $data);
+        // Extract the Expires value and turn it into a UNIX timestamp if needed
+        if (!$this->getExpires() && $this->getMaxAge()) {
+            // Calculate the Expires date
+            $this->setExpires(time() + $this->getMaxAge());
+        } elseif ($this->getExpires() && !is_numeric($this->getExpires())) {
+            $this->setExpires($this->getExpires());
+        }
+    }
+
+    public function __toString()
+    {
+        $str = $this->data['Name'] . '=' . $this->data['Value'] . '; ';
+        foreach ($this->data as $k => $v) {
+            if ($k != 'Name' && $k != 'Value' && $v !== null && $v !== false) {
+                if ($k == 'Expires') {
+                    $str .= 'Expires=' . gmdate('D, d M Y H:i:s \G\M\T', $v) . '; ';
+                } else {
+                    $str .= ($v === true ? $k : "{$k}={$v}") . '; ';
+                }
+            }
+        }
+
+        return rtrim($str, '; ');
+    }
+
+    public function toArray()
+    {
+        return $this->data;
+    }
+
+    /**
+     * Get the cookie name
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->data['Name'];
+    }
+
+    /**
+     * Set the cookie name
+     *
+     * @param string $name Cookie name
+     */
+    public function setName($name)
+    {
+        $this->data['Name'] = $name;
+    }
+
+    /**
+     * Get the cookie value
+     *
+     * @return string
+     */
+    public function getValue()
+    {
+        return $this->data['Value'];
+    }
+
+    /**
+     * Set the cookie value
+     *
+     * @param string $value Cookie value
+     */
+    public function setValue($value)
+    {
+        $this->data['Value'] = $value;
+    }
+
+    /**
+     * Get the domain
+     *
+     * @return string|null
+     */
+    public function getDomain()
+    {
+        return $this->data['Domain'];
+    }
+
+    /**
+     * Set the domain of the cookie
+     *
+     * @param string $domain
+     */
+    public function setDomain($domain)
+    {
+        $this->data['Domain'] = $domain;
+    }
+
+    /**
+     * Get the path
+     *
+     * @return string
+     */
+    public function getPath()
+    {
+        return $this->data['Path'];
+    }
+
+    /**
+     * Set the path of the cookie
+     *
+     * @param string $path Path of the cookie
+     */
+    public function setPath($path)
+    {
+        $this->data['Path'] = $path;
+    }
+
+    /**
+     * Maximum lifetime of the cookie in seconds
+     *
+     * @return int|null
+     */
+    public function getMaxAge()
+    {
+        return $this->data['Max-Age'];
+    }
+
+    /**
+     * Set the max-age of the cookie
+     *
+     * @param int $maxAge Max age of the cookie in seconds
+     */
+    public function setMaxAge($maxAge)
+    {
+        $this->data['Max-Age'] = $maxAge;
+    }
+
+    /**
+     * The UNIX timestamp when the cookie Expires
+     *
+     * @return mixed
+     */
+    public function getExpires()
+    {
+        return $this->data['Expires'];
+    }
+
+    /**
+     * Set the unix timestamp for which the cookie will expire
+     *
+     * @param int $timestamp Unix timestamp
+     */
+    public function setExpires($timestamp)
+    {
+        $this->data['Expires'] = is_numeric($timestamp)
+            ? (int) $timestamp
+            : strtotime($timestamp);
+    }
+
+    /**
+     * Get whether or not this is a secure cookie
+     *
+     * @return null|bool
+     */
+    public function getSecure()
+    {
+        return $this->data['Secure'];
+    }
+
+    /**
+     * Set whether or not the cookie is secure
+     *
+     * @param bool $secure Set to true or false if secure
+     */
+    public function setSecure($secure)
+    {
+        $this->data['Secure'] = $secure;
+    }
+
+    /**
+     * Get whether or not this is a session cookie
+     *
+     * @return null|bool
+     */
+    public function getDiscard()
+    {
+        return $this->data['Discard'];
+    }
+
+    /**
+     * Set whether or not this is a session cookie
+     *
+     * @param bool $discard Set to true or false if this is a session cookie
+     */
+    public function setDiscard($discard)
+    {
+        $this->data['Discard'] = $discard;
+    }
+
+    /**
+     * Get whether or not this is an HTTP only cookie
+     *
+     * @return bool
+     */
+    public function getHttpOnly()
+    {
+        return $this->data['HttpOnly'];
+    }
+
+    /**
+     * Set whether or not this is an HTTP only cookie
+     *
+     * @param bool $httpOnly Set to true or false if this is HTTP only
+     */
+    public function setHttpOnly($httpOnly)
+    {
+        $this->data['HttpOnly'] = $httpOnly;
+    }
+
+    /**
+     * Check if the cookie matches a path value
+     *
+     * @param string $path Path to check against
+     *
+     * @return bool
+     */
+    public function matchesPath($path)
+    {
+        return !$this->getPath() || 0 === stripos($path, $this->getPath());
+    }
+
+    /**
+     * Check if the cookie matches a domain value
+     *
+     * @param string $domain Domain to check against
+     *
+     * @return bool
+     */
+    public function matchesDomain($domain)
+    {
+        // Remove the leading '.' as per spec in RFC 6265.
+        // http://tools.ietf.org/html/rfc6265#section-5.2.3
+        $cookieDomain = ltrim($this->getDomain(), '.');
+
+        // Domain not set or exact match.
+        if (!$cookieDomain || !strcasecmp($domain, $cookieDomain)) {
+            return true;
+        }
+
+        // Matching the subdomain according to RFC 6265.
+        // http://tools.ietf.org/html/rfc6265#section-5.1.3
+        if (filter_var($domain, FILTER_VALIDATE_IP)) {
+            return false;
+        }
+
+        return (bool) preg_match('/\.' . preg_quote($cookieDomain) . '$/i', $domain);
+    }
+
+    /**
+     * Check if the cookie is expired
+     *
+     * @return bool
+     */
+    public function isExpired()
+    {
+        return $this->getExpires() && time() > $this->getExpires();
+    }
+
+    /**
+     * Check if the cookie is valid according to RFC 6265
+     *
+     * @return bool|string Returns true if valid or an error message if invalid
+     */
+    public function validate()
+    {
+        // Names must not be empty, but can be 0
+        $name = $this->getName();
+        if (empty($name) && !is_numeric($name)) {
+            return 'The cookie name must not be empty';
+        }
+
+        // Check if any of the invalid characters are present in the cookie name
+        if (preg_match("/[=,; \t\r\n\013\014]/", $name)) {
+            return "Cookie name must not cannot invalid characters: =,; \\t\\r\\n\\013\\014";
+        }
+
+        // Value must not be empty, but can be 0
+        $value = $this->getValue();
+        if (empty($value) && !is_numeric($value)) {
+            return 'The cookie value must not be empty';
+        }
+
+        // Domains must not be empty, but can be 0
+        // A "0" is not a valid internet domain, but may be used as server name
+        // in a private network.
+        $domain = $this->getDomain();
+        if (empty($domain) && !is_numeric($domain)) {
+            return 'The cookie domain must not be empty';
+        }
+
+        return true;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/AbstractEvent.php
@@ -0,0 +1,20 @@
+<?php
+namespace GuzzleHttp\Event;
+
+/**
+ * Basic event class that can be extended.
+ */
+abstract class AbstractEvent implements EventInterface
+{
+    private $propagationStopped = false;
+
+    public function isPropagationStopped()
+    {
+        return $this->propagationStopped;
+    }
+
+    public function stopPropagation()
+    {
+        $this->propagationStopped = true;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/AbstractRequestEvent.php
@@ -0,0 +1,61 @@
+<?php
+namespace GuzzleHttp\Event;
+
+use GuzzleHttp\Transaction;
+use GuzzleHttp\ClientInterface;
+use GuzzleHttp\Message\RequestInterface;
+
+/**
+ * Base class for request events, providing a request and client getter.
+ */
+abstract class AbstractRequestEvent extends AbstractEvent
+{
+    /** @var Transaction */
+    protected $transaction;
+
+    /**
+     * @param Transaction $transaction
+     */
+    public function __construct(Transaction $transaction)
+    {
+        $this->transaction = $transaction;
+    }
+
+    /**
+     * Get the HTTP client associated with the event.
+     *
+     * @return ClientInterface
+     */
+    public function getClient()
+    {
+        return $this->transaction->client;
+    }
+
+    /**
+     * Get the request object
+     *
+     * @return RequestInterface
+     */
+    public function getRequest()
+    {
+        return $this->transaction->request;
+    }
+
+    /**
+     * Get the number of transaction retries.
+     *
+     * @return int
+     */
+    public function getRetryCount()
+    {
+        return $this->transaction->retries;
+    }
+
+    /**
+     * @return Transaction
+     */
+    public function getTransaction()
+    {
+        return $this->transaction;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/AbstractRetryableEvent.php
@@ -0,0 +1,40 @@
+<?php
+namespace GuzzleHttp\Event;
+
+/**
+ * Abstract request event that can be retried.
+ */
+class AbstractRetryableEvent extends AbstractTransferEvent
+{
+    /**
+     * Mark the request as needing a retry and stop event propagation.
+     *
+     * This action allows you to retry a request without emitting the "end"
+     * event multiple times for a given request. When retried, the request
+     * emits a before event and is then sent again using the client that sent
+     * the original request.
+     *
+     * When retrying, it is important to limit the number of retries you allow
+     * to prevent infinite loops.
+     *
+     * This action can only be taken during the "complete" and "error" events.
+     *
+     * @param int $afterDelay If specified, the amount of time in milliseconds
+     *                        to delay before retrying. Note that this must
+     *                        be supported by the underlying RingPHP handler
+     *                        to work properly. Set to 0 or provide no value
+     *                        to retry immediately.
+     */
+    public function retry($afterDelay = 0)
+    {
+        // Setting the transition state to 'retry' will cause the next state
+        // transition of the transaction to retry the request.
+        $this->transaction->state = 'retry';
+
+        if ($afterDelay) {
+            $this->transaction->request->getConfig()->set('delay', $afterDelay);
+        }
+
+        $this->stopPropagation();
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/AbstractTransferEvent.php
@@ -0,0 +1,63 @@
+<?php
+namespace GuzzleHttp\Event;
+
+use GuzzleHttp\Message\ResponseInterface;
+use GuzzleHttp\Ring\Future\FutureInterface;
+
+/**
+ * Event that contains transfer statistics, and can be intercepted.
+ */
+abstract class AbstractTransferEvent extends AbstractRequestEvent
+{
+    /**
+     * Get all transfer information as an associative array if no $name
+     * argument is supplied, or gets a specific transfer statistic if
+     * a $name attribute is supplied (e.g., 'total_time').
+     *
+     * @param string $name Name of the transfer stat to retrieve
+     *
+     * @return mixed|null|array
+     */
+    public function getTransferInfo($name = null)
+    {
+        if (!$name) {
+            return $this->transaction->transferInfo;
+        }
+
+        return isset($this->transaction->transferInfo[$name])
+            ? $this->transaction->transferInfo[$name]
+            : null;
+    }
+
+    /**
+     * Returns true/false if a response is available.
+     *
+     * @return bool
+     */
+    public function hasResponse()
+    {
+        return !($this->transaction->response instanceof FutureInterface);
+    }
+
+    /**
+     * Get the response.
+     *
+     * @return ResponseInterface|null
+     */
+    public function getResponse()
+    {
+        return $this->hasResponse() ? $this->transaction->response : null;
+    }
+
+    /**
+     * Intercept the request and associate a response
+     *
+     * @param ResponseInterface $response Response to set
+     */
+    public function intercept(ResponseInterface $response)
+    {
+        $this->transaction->response = $response;
+        $this->transaction->exception = null;
+        $this->stopPropagation();
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/BeforeEvent.php
@@ -0,0 +1,26 @@
+<?php
+namespace GuzzleHttp\Event;
+
+use GuzzleHttp\Message\ResponseInterface;
+
+/**
+ * Event object emitted before a request is sent.
+ *
+ * This event MAY be emitted multiple times (i.e., if a request is retried).
+ * You MAY change the Response associated with the request using the
+ * intercept() method of the event.
+ */
+class BeforeEvent extends AbstractRequestEvent
+{
+    /**
+     * Intercept the request and associate a response
+     *
+     * @param ResponseInterface $response Response to set
+     */
+    public function intercept(ResponseInterface $response)
+    {
+        $this->transaction->response = $response;
+        $this->transaction->exception = null;
+        $this->stopPropagation();
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/CompleteEvent.php
@@ -0,0 +1,14 @@
+<?php
+namespace GuzzleHttp\Event;
+
+/**
+ * Event object emitted after a request has been completed.
+ *
+ * This event MAY be emitted multiple times for a single request. You MAY
+ * change the Response associated with the request using the intercept()
+ * method of the event.
+ *
+ * This event allows the request to be retried if necessary using the retry()
+ * method of the event.
+ */
+class CompleteEvent extends AbstractRetryableEvent {}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/Emitter.php
@@ -0,0 +1,145 @@
+<?php
+namespace GuzzleHttp\Event;
+
+/**
+ * Guzzle event emitter.
+ *
+ * Some of this class is based on the Symfony EventDispatcher component, which
+ * ships with the following license:
+ *
+ *     This file is part of the Symfony package.
+ *
+ *     (c) Fabien Potencier <fabien@symfony.com>
+ *
+ *     For the full copyright and license information, please view the LICENSE
+ *     file that was distributed with this source code.
+ *
+ * @link https://github.com/symfony/symfony/tree/master/src/Symfony/Component/EventDispatcher
+ */
+class Emitter implements EmitterInterface
+{
+    /** @var array */
+    private $listeners = [];
+
+    /** @var array */
+    private $sorted = [];
+
+    public function on($eventName, callable $listener, $priority = 0)
+    {
+        if ($priority === 'first') {
+            $priority = isset($this->listeners[$eventName])
+                ? max(array_keys($this->listeners[$eventName])) + 1
+                : 1;
+        } elseif ($priority === 'last') {
+            $priority = isset($this->listeners[$eventName])
+                ? min(array_keys($this->listeners[$eventName])) - 1
+                : -1;
+        }
+
+        $this->listeners[$eventName][$priority][] = $listener;
+        unset($this->sorted[$eventName]);
+    }
+
+    public function once($eventName, callable $listener, $priority = 0)
+    {
+        $onceListener = function (
+            EventInterface $event
+        ) use (&$onceListener, $eventName, $listener, $priority) {
+            $this->removeListener($eventName, $onceListener);
+            $listener($event, $eventName);
+        };
+
+        $this->on($eventName, $onceListener, $priority);
+    }
+
+    public function removeListener($eventName, callable $listener)
+    {
+        if (empty($this->listeners[$eventName])) {
+            return;
+        }
+
+        foreach ($this->listeners[$eventName] as $priority => $listeners) {
+            if (false !== ($key = array_search($listener, $listeners, true))) {
+                unset(
+                    $this->listeners[$eventName][$priority][$key],
+                    $this->sorted[$eventName]
+                );
+            }
+        }
+    }
+
+    public function listeners($eventName = null)
+    {
+        // Return all events in a sorted priority order
+        if ($eventName === null) {
+            foreach (array_keys($this->listeners) as $eventName) {
+                if (empty($this->sorted[$eventName])) {
+                    $this->listeners($eventName);
+                }
+            }
+            return $this->sorted;
+        }
+
+        // Return the listeners for a specific event, sorted in priority order
+        if (empty($this->sorted[$eventName])) {
+            $this->sorted[$eventName] = [];
+            if (isset($this->listeners[$eventName])) {
+                krsort($this->listeners[$eventName], SORT_NUMERIC);
+                foreach ($this->listeners[$eventName] as $listeners) {
+                    foreach ($listeners as $listener) {
+                        $this->sorted[$eventName][] = $listener;
+                    }
+                }
+            }
+        }
+
+        return $this->sorted[$eventName];
+    }
+
+    public function hasListeners($eventName)
+    {
+        return !empty($this->listeners[$eventName]);
+    }
+
+    public function emit($eventName, EventInterface $event)
+    {
+        if (isset($this->listeners[$eventName])) {
+            foreach ($this->listeners($eventName) as $listener) {
+                $listener($event, $eventName);
+                if ($event->isPropagationStopped()) {
+                    break;
+                }
+            }
+        }
+
+        return $event;
+    }
+
+    public function attach(SubscriberInterface $subscriber)
+    {
+        foreach ($subscriber->getEvents() as $eventName => $listeners) {
+            if (is_array($listeners[0])) {
+                foreach ($listeners as $listener) {
+                    $this->on(
+                        $eventName,
+                        [$subscriber, $listener[0]],
+                        isset($listener[1]) ? $listener[1] : 0
+                    );
+                }
+            } else {
+                $this->on(
+                    $eventName,
+                    [$subscriber, $listeners[0]],
+                    isset($listeners[1]) ? $listeners[1] : 0
+                );
+            }
+        }
+    }
+
+    public function detach(SubscriberInterface $subscriber)
+    {
+        foreach ($subscriber->getEvents() as $eventName => $listener) {
+            $this->removeListener($eventName, [$subscriber, $listener[0]]);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/EmitterInterface.php
@@ -0,0 +1,96 @@
+<?php
+namespace GuzzleHttp\Event;
+
+/**
+ * Guzzle event emitter.
+ */
+interface EmitterInterface
+{
+    /**
+     * Binds a listener to a specific event.
+     *
+     * @param string     $eventName Name of the event to bind to.
+     * @param callable   $listener  Listener to invoke when triggered.
+     * @param int|string $priority  The higher this value, the earlier an event
+     *     listener will be triggered in the chain (defaults to 0). You can
+     *     pass "first" or "last" to dynamically specify the event priority
+     *     based on the current event priorities associated with the given
+     *     event name in the emitter. Use "first" to set the priority to the
+     *     current highest priority plus one. Use "last" to set the priority to
+     *     the current lowest event priority minus one.
+     */
+    public function on($eventName, callable $listener, $priority = 0);
+
+    /**
+     * Binds a listener to a specific event. After the listener is triggered
+     * once, it is removed as a listener.
+     *
+     * @param string   $eventName Name of the event to bind to.
+     * @param callable $listener  Listener to invoke when triggered.
+     * @param int      $priority  The higher this value, the earlier an event
+     *     listener will be triggered in the chain (defaults to 0)
+     */
+    public function once($eventName, callable $listener, $priority = 0);
+
+    /**
+     * Removes an event listener from the specified event.
+     *
+     * @param string   $eventName The event to remove a listener from
+     * @param callable $listener  The listener to remove
+     */
+    public function removeListener($eventName, callable $listener);
+
+    /**
+     * Gets the listeners of a specific event or all listeners if no event is
+     * specified.
+     *
+     * @param string $eventName The name of the event. Pass null (the default)
+     *     to retrieve all listeners.
+     *
+     * @return array The event listeners for the specified event, or all event
+     *   listeners by event name. The format of the array when retrieving a
+     *   specific event list is an array of callables. The format of the array
+     *   when retrieving all listeners is an associative array of arrays of
+     *   callables.
+     */
+    public function listeners($eventName = null);
+
+    /**
+     * Checks if the emitter has listeners by the given name.
+     *
+     * @param string $eventName The name of the event to check.
+     *
+     * @return bool
+     */
+    public function hasListeners($eventName);
+
+    /**
+     * Emits an event to all registered listeners.
+     *
+     * Each event that is bound to the emitted eventName receives a
+     * EventInterface, the name of the event, and the event emitter.
+     *
+     * @param string         $eventName The name of the event to dispatch.
+     * @param EventInterface $event     The event to pass to the event handlers/listeners.
+     *
+     * @return EventInterface Returns the provided event object
+     */
+    public function emit($eventName, EventInterface $event);
+
+    /**
+     * Attaches an event subscriber.
+     *
+     * The subscriber is asked for all the events it is interested in and added
+     * as an event listener for each event.
+     *
+     * @param SubscriberInterface $subscriber Subscriber to attach.
+     */
+    public function attach(SubscriberInterface $subscriber);
+
+    /**
+     * Detaches an event subscriber.
+     *
+     * @param SubscriberInterface $subscriber Subscriber to detach.
+     */
+    public function detach(SubscriberInterface $subscriber);
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/EndEvent.php
@@ -0,0 +1,28 @@
+<?php
+namespace GuzzleHttp\Event;
+
+/**
+ * A terminal event that is emitted when a request transaction has ended.
+ *
+ * This event is emitted for both successful responses and responses that
+ * encountered an exception. You need to check if an exception is present
+ * in your listener to know the difference.
+ *
+ * You MAY intercept the response associated with the event if needed, but keep
+ * in mind that the "complete" event will not be triggered as a result.
+ */
+class EndEvent extends AbstractTransferEvent
+{
+    /**
+     * Get the exception that was encountered (if any).
+     *
+     * This method should be used to check if the request was sent successfully
+     * or if it encountered errors.
+     *
+     * @return \Exception|null
+     */
+    public function getException()
+    {
+        return $this->transaction->exception;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/ErrorEvent.php
@@ -0,0 +1,27 @@
+<?php
+namespace GuzzleHttp\Event;
+
+use GuzzleHttp\Exception\RequestException;
+
+/**
+ * Event emitted when an error occurs while sending a request.
+ *
+ * This event MAY be emitted multiple times. You MAY intercept the exception
+ * and inject a response into the event to rescue the request using the
+ * intercept() method of the event.
+ *
+ * This event allows the request to be retried using the "retry" method of the
+ * event.
+ */
+class ErrorEvent extends AbstractRetryableEvent
+{
+    /**
+     * Get the exception that was encountered
+     *
+     * @return RequestException
+     */
+    public function getException()
+    {
+        return $this->transaction->exception;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/EventInterface.php
@@ -0,0 +1,23 @@
+<?php
+namespace GuzzleHttp\Event;
+
+/**
+ * Base event interface used when dispatching events to listeners using an
+ * event emitter.
+ */
+interface EventInterface
+{
+    /**
+     * Returns whether or not stopPropagation was called on the event.
+     *
+     * @return bool
+     * @see Event::stopPropagation
+     */
+    public function isPropagationStopped();
+
+    /**
+     * Stops the propagation of the event, preventing subsequent listeners
+     * registered to the same event from being invoked.
+     */
+    public function stopPropagation();
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/HasEmitterInterface.php
@@ -0,0 +1,15 @@
+<?php
+namespace GuzzleHttp\Event;
+
+/**
+ * Holds an event emitter
+ */
+interface HasEmitterInterface
+{
+    /**
+     * Get the event emitter of the object
+     *
+     * @return EmitterInterface
+     */
+    public function getEmitter();
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/HasEmitterTrait.php
@@ -0,0 +1,20 @@
+<?php
+namespace GuzzleHttp\Event;
+
+/**
+ * Trait that implements the methods of HasEmitterInterface
+ */
+trait HasEmitterTrait
+{
+    /** @var EmitterInterface */
+    private $emitter;
+
+    public function getEmitter()
+    {
+        if (!$this->emitter) {
+            $this->emitter = new Emitter();
+        }
+
+        return $this->emitter;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/ListenerAttacherTrait.php
@@ -0,0 +1,88 @@
+<?php
+namespace GuzzleHttp\Event;
+
+/**
+ * Trait that provides methods for extract event listeners specified in an array
+ * and attaching them to an emitter owned by the object or one of its direct
+ * dependencies.
+ */
+trait ListenerAttacherTrait
+{
+    /**
+     * Attaches event listeners and properly sets their priorities and whether
+     * or not they are are only executed once.
+     *
+     * @param HasEmitterInterface $object    Object that has the event emitter.
+     * @param array               $listeners Array of hashes representing event
+     *                                       event listeners. Each item contains
+     *                                       "name", "fn", "priority", & "once".
+     */
+    private function attachListeners(HasEmitterInterface $object, array $listeners)
+    {
+        $emitter = $object->getEmitter();
+        foreach ($listeners as $el) {
+            if ($el['once']) {
+                $emitter->once($el['name'], $el['fn'], $el['priority']);
+            } else {
+                $emitter->on($el['name'], $el['fn'], $el['priority']);
+            }
+        }
+    }
+
+    /**
+     * Extracts the allowed events from the provided array, and ignores anything
+     * else in the array. The event listener must be specified as a callable or
+     * as an array of event listener data ("name", "fn", "priority", "once").
+     *
+     * @param array $source Array containing callables or hashes of data to be
+     *                      prepared as event listeners.
+     * @param array $events Names of events to look for in the provided $source
+     *                      array. Other keys are ignored.
+     * @return array
+     */
+    private function prepareListeners(array $source, array $events)
+    {
+        $listeners = [];
+        foreach ($events as $name) {
+            if (isset($source[$name])) {
+                $this->buildListener($name, $source[$name], $listeners);
+            }
+        }
+
+        return $listeners;
+    }
+
+    /**
+     * Creates a complete event listener definition from the provided array of
+     * listener data. Also works recursively if more than one listeners are
+     * contained in the provided array.
+     *
+     * @param string         $name      Name of the event the listener is for.
+     * @param array|callable $data      Event listener data to prepare.
+     * @param array          $listeners Array of listeners, passed by reference.
+     *
+     * @throws \InvalidArgumentException if the event data is malformed.
+     */
+    private function buildListener($name, $data, &$listeners)
+    {
+        static $defaults = ['priority' => 0, 'once' => false];
+
+        // If a callable is provided, normalize it to the array format.
+        if (is_callable($data)) {
+            $data = ['fn' => $data];
+        }
+
+        // Prepare the listener and add it to the array, recursively.
+        if (isset($data['fn'])) {
+            $data['name'] = $name;
+            $listeners[] = $data + $defaults;
+        } elseif (is_array($data)) {
+            foreach ($data as $listenerData) {
+                $this->buildListener($name, $listenerData, $listeners);
+            }
+        } else {
+            throw new \InvalidArgumentException('Each event listener must be a '
+                . 'callable or an associative array containing a "fn" key.');
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/ProgressEvent.php
@@ -0,0 +1,51 @@
+<?php
+namespace GuzzleHttp\Event;
+
+use GuzzleHttp\Transaction;
+
+/**
+ * Event object emitted when upload or download progress is made.
+ *
+ * You can access the progress values using their corresponding public
+ * properties:
+ *
+ * - $downloadSize: The number of bytes that will be downloaded (if known)
+ * - $downloaded: The number of bytes that have been downloaded
+ * - $uploadSize: The number of bytes that will be uploaded (if known)
+ * - $uploaded: The number of bytes that have been uploaded
+ */
+class ProgressEvent extends AbstractRequestEvent
+{
+    /** @var int Amount of data to be downloaded */
+    public $downloadSize;
+
+    /** @var int Amount of data that has been downloaded */
+    public $downloaded;
+
+    /** @var int Amount of data to upload */
+    public $uploadSize;
+
+    /** @var int Amount of data that has been uploaded */
+    public $uploaded;
+
+    /**
+     * @param Transaction $transaction  Transaction being sent.
+     * @param int         $downloadSize Amount of data to download (if known)
+     * @param int         $downloaded   Amount of data that has been downloaded
+     * @param int         $uploadSize   Amount of data to upload (if known)
+     * @param int         $uploaded     Amount of data that had been uploaded
+     */
+    public function __construct(
+        Transaction $transaction,
+        $downloadSize,
+        $downloaded,
+        $uploadSize,
+        $uploaded
+    ) {
+        parent::__construct($transaction);
+        $this->downloadSize = $downloadSize;
+        $this->downloaded = $downloaded;
+        $this->uploadSize = $uploadSize;
+        $this->uploaded = $uploaded;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/RequestEvents.php
@@ -0,0 +1,56 @@
+<?php
+namespace GuzzleHttp\Event;
+
+/**
+ * Contains methods used to manage the request event lifecycle.
+ */
+final class RequestEvents
+{
+    // Generic event priorities
+    const EARLY = 10000;
+    const LATE = -10000;
+
+    // "before" priorities
+    const PREPARE_REQUEST = -100;
+    const SIGN_REQUEST = -10000;
+
+    // "complete" and "error" response priorities
+    const VERIFY_RESPONSE = 100;
+    const REDIRECT_RESPONSE = 200;
+
+    /**
+     * Converts an array of event options into a formatted array of valid event
+     * configuration.
+     *
+     * @param array $options Event array to convert
+     * @param array $events  Event names to convert in the options array.
+     * @param mixed $handler Event handler to utilize
+     *
+     * @return array
+     * @throws \InvalidArgumentException if the event config is invalid
+     * @internal
+     */
+    public static function convertEventArray(
+        array $options,
+        array $events,
+        $handler
+    ) {
+        foreach ($events as $name) {
+            if (!isset($options[$name])) {
+                $options[$name] = [$handler];
+            } elseif (is_callable($options[$name])) {
+                $options[$name] = [$options[$name], $handler];
+            } elseif (is_array($options[$name])) {
+                if (isset($options[$name]['fn'])) {
+                    $options[$name] = [$options[$name], $handler];
+                } else {
+                    $options[$name][] = $handler;
+                }
+            } else {
+                throw new \InvalidArgumentException('Invalid event format');
+            }
+        }
+
+        return $options;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Event/SubscriberInterface.php
@@ -0,0 +1,34 @@
+<?php
+namespace GuzzleHttp\Event;
+
+/**
+ * SubscriberInterface provides an array of events to an
+ * EventEmitterInterface when it is registered. The emitter then binds the
+ * listeners specified by the EventSubscriber.
+ *
+ * This interface is based on the SubscriberInterface of the Symfony.
+ * @link https://github.com/symfony/symfony/tree/master/src/Symfony/Component/EventDispatcher
+ */
+interface SubscriberInterface
+{
+    /**
+     * Returns an array of event names this subscriber wants to listen to.
+     *
+     * The returned array keys MUST map to an event name. Each array value
+     * MUST be an array in which the first element is the name of a function
+     * on the EventSubscriber OR an array of arrays in the aforementioned
+     * format. The second element in the array is optional, and if specified,
+     * designates the event priority.
+     *
+     * For example, the following are all valid:
+     *
+     *  - ['eventName' => ['methodName']]
+     *  - ['eventName' => ['methodName', $priority]]
+     *  - ['eventName' => [['methodName'], ['otherMethod']]
+     *  - ['eventName' => [['methodName'], ['otherMethod', $priority]]
+     *  - ['eventName' => [['methodName', $priority], ['otherMethod', $priority]]
+     *
+     * @return array
+     */
+    public function getEvents();
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php
@@ -0,0 +1,7 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+/**
+ * Exception when an HTTP error occurs (4xx or 5xx error)
+ */
+class BadResponseException extends RequestException {}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php
@@ -0,0 +1,7 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+/**
+ * Exception when a client error is encountered (4xx codes)
+ */
+class ClientException extends BadResponseException {}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php
@@ -0,0 +1,4 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+class ConnectException extends RequestException {}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Exception/CouldNotRewindStreamException.php
@@ -0,0 +1,4 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+class CouldNotRewindStreamException extends RequestException {}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Exception/ParseException.php
@@ -0,0 +1,31 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+use GuzzleHttp\Message\ResponseInterface;
+
+/**
+ * Exception when a client is unable to parse the response body as XML or JSON
+ */
+class ParseException extends TransferException
+{
+    /** @var ResponseInterface */
+    private $response;
+
+    public function __construct(
+        $message = '',
+        ResponseInterface $response = null,
+        \Exception $previous = null
+    ) {
+        parent::__construct($message, 0, $previous);
+        $this->response = $response;
+    }
+    /**
+     * Get the associated response
+     *
+     * @return ResponseInterface|null
+     */
+    public function getResponse()
+    {
+        return $this->response;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php
@@ -0,0 +1,121 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+use GuzzleHttp\Message\RequestInterface;
+use GuzzleHttp\Message\ResponseInterface;
+use GuzzleHttp\Ring\Exception\ConnectException;
+use GuzzleHttp\Exception\ConnectException as HttpConnectException;
+use GuzzleHttp\Ring\Future\FutureInterface;
+
+/**
+ * HTTP Request exception
+ */
+class RequestException extends TransferException
+{
+    /** @var RequestInterface */
+    private $request;
+
+    /** @var ResponseInterface */
+    private $response;
+
+    public function __construct(
+        $message,
+        RequestInterface $request,
+        ResponseInterface $response = null,
+        \Exception $previous = null
+    ) {
+        // Set the code of the exception if the response is set and not future.
+        $code = $response && !($response instanceof FutureInterface)
+            ? $response->getStatusCode()
+            : 0;
+        parent::__construct($message, $code, $previous);
+        $this->request = $request;
+        $this->response = $response;
+    }
+
+    /**
+     * Wrap non-RequestExceptions with a RequestException
+     *
+     * @param RequestInterface $request
+     * @param \Exception       $e
+     *
+     * @return RequestException
+     */
+    public static function wrapException(RequestInterface $request, \Exception $e)
+    {
+        if ($e instanceof RequestException) {
+            return $e;
+        } elseif ($e instanceof ConnectException) {
+            return new HttpConnectException($e->getMessage(), $request, null, $e);
+        } else {
+            return new RequestException($e->getMessage(), $request, null, $e);
+        }
+    }
+
+    /**
+     * Factory method to create a new exception with a normalized error message
+     *
+     * @param RequestInterface  $request  Request
+     * @param ResponseInterface $response Response received
+     * @param \Exception        $previous Previous exception
+     *
+     * @return self
+     */
+    public static function create(
+        RequestInterface $request,
+        ResponseInterface $response = null,
+        \Exception $previous = null
+    ) {
+        if (!$response) {
+            return new self('Error completing request', $request, null, $previous);
+        }
+
+        $level = floor($response->getStatusCode() / 100);
+        if ($level == '4') {
+            $label = 'Client error response';
+            $className = __NAMESPACE__ . '\\ClientException';
+        } elseif ($level == '5') {
+            $label = 'Server error response';
+            $className = __NAMESPACE__ . '\\ServerException';
+        } else {
+            $label = 'Unsuccessful response';
+            $className = __CLASS__;
+        }
+
+        $message = $label . ' [url] ' . $request->getUrl()
+            . ' [status code] ' . $response->getStatusCode()
+            . ' [reason phrase] ' . $response->getReasonPhrase();
+
+        return new $className($message, $request, $response, $previous);
+    }
+
+    /**
+     * Get the request that caused the exception
+     *
+     * @return RequestInterface
+     */
+    public function getRequest()
+    {
+        return $this->request;
+    }
+
+    /**
+     * Get the associated response
+     *
+     * @return ResponseInterface|null
+     */
+    public function getResponse()
+    {
+        return $this->response;
+    }
+
+    /**
+     * Check if a response was received
+     *
+     * @return bool
+     */
+    public function hasResponse()
+    {
+        return $this->response !== null;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php
@@ -0,0 +1,7 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+/**
+ * Exception when a server error is encountered (5xx codes)
+ */
+class ServerException extends BadResponseException {}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Exception/StateException.php
@@ -0,0 +1,4 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+class StateException extends TransferException {};
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php
@@ -0,0 +1,4 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+class TooManyRedirectsException extends RequestException {}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php
@@ -0,0 +1,4 @@
+<?php
+namespace GuzzleHttp\Exception;
+
+class TransferException extends \RuntimeException {}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Exception/XmlParseException.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace GuzzleHttp\Exception;
+
+use GuzzleHttp\Message\ResponseInterface;
+
+/**
+ * Exception when a client is unable to parse the response body as XML
+ */
+class XmlParseException extends ParseException
+{
+    /** @var \LibXMLError */
+    protected $error;
+
+    public function __construct(
+        $message = '',
+        ResponseInterface $response = null,
+        \Exception $previous = null,
+        \LibXMLError $error = null
+    ) {
+        parent::__construct($message, $response, $previous);
+        $this->error = $error;
+    }
+
+    /**
+     * Get the associated error
+     *
+     * @return \LibXMLError|null
+     */
+    public function getError()
+    {
+        return $this->error;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/HasDataTrait.php
@@ -0,0 +1,75 @@
+<?php
+namespace GuzzleHttp;
+
+/**
+ * Trait implementing ToArrayInterface, \ArrayAccess, \Countable,
+ * \IteratorAggregate, and some path style methods.
+ */
+trait HasDataTrait
+{
+    /** @var array */
+    protected $data = [];
+
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->data);
+    }
+
+    public function offsetGet($offset)
+    {
+        return isset($this->data[$offset]) ? $this->data[$offset] : null;
+    }
+
+    public function offsetSet($offset, $value)
+    {
+        $this->data[$offset] = $value;
+    }
+
+    public function offsetExists($offset)
+    {
+        return isset($this->data[$offset]);
+    }
+
+    public function offsetUnset($offset)
+    {
+        unset($this->data[$offset]);
+    }
+
+    public function toArray()
+    {
+        return $this->data;
+    }
+
+    public function count()
+    {
+        return count($this->data);
+    }
+
+    /**
+     * Get a value from the collection using a path syntax to retrieve nested
+     * data.
+     *
+     * @param string $path Path to traverse and retrieve a value from
+     *
+     * @return mixed|null
+     */
+    public function getPath($path)
+    {
+        return Utils::getPath($this->data, $path);
+    }
+
+    /**
+     * Set a value into a nested array key. Keys will be created as needed to
+     * set the value.
+     *
+     * @param string $path  Path to set
+     * @param mixed  $value Value to set at the key
+     *
+     * @throws \RuntimeException when trying to setPath using a nested path
+     *     that travels through a scalar value
+     */
+    public function setPath($path, $value)
+    {
+        Utils::setPath($this->data, $path, $value);
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Message/AbstractMessage.php
@@ -0,0 +1,253 @@
+<?php
+namespace GuzzleHttp\Message;
+
+use GuzzleHttp\Stream\StreamInterface;
+
+abstract class AbstractMessage implements MessageInterface
+{
+    /** @var array HTTP header collection */
+    private $headers = [];
+
+    /** @var array mapping a lowercase header name to its name over the wire */
+    private $headerNames = [];
+
+    /** @var StreamInterface Message body */
+    private $body;
+
+    /** @var string HTTP protocol version of the message */
+    private $protocolVersion = '1.1';
+
+    public function __toString()
+    {
+        return static::getStartLineAndHeaders($this)
+            . "\r\n\r\n" . $this->getBody();
+    }
+
+    public function getProtocolVersion()
+    {
+        return $this->protocolVersion;
+    }
+
+    public function getBody()
+    {
+        return $this->body;
+    }
+
+    public function setBody(StreamInterface $body = null)
+    {
+        if ($body === null) {
+            // Setting a null body will remove the body of the request
+            $this->removeHeader('Content-Length');
+            $this->removeHeader('Transfer-Encoding');
+        }
+
+        $this->body = $body;
+    }
+
+    public function addHeader($header, $value)
+    {
+        if (is_array($value)) {
+            $current = array_merge($this->getHeaderAsArray($header), $value);
+        } else {
+            $current = $this->getHeaderAsArray($header);
+            $current[] = (string) $value;
+        }
+
+        $this->setHeader($header, $current);
+    }
+
+    public function addHeaders(array $headers)
+    {
+        foreach ($headers as $name => $header) {
+            $this->addHeader($name, $header);
+        }
+    }
+
+    public function getHeader($header)
+    {
+        $name = strtolower($header);
+        return isset($this->headers[$name])
+            ? implode(', ', $this->headers[$name])
+            : '';
+    }
+
+    public function getHeaderAsArray($header)
+    {
+        $name = strtolower($header);
+        return isset($this->headers[$name]) ? $this->headers[$name] : [];
+    }
+
+    public function getHeaders()
+    {
+        $headers = [];
+        foreach ($this->headers as $name => $values) {
+            $headers[$this->headerNames[$name]] = $values;
+        }
+
+        return $headers;
+    }
+
+    public function setHeader($header, $value)
+    {
+        $header = trim($header);
+        $name = strtolower($header);
+        $this->headerNames[$name] = $header;
+
+        if (is_array($value)) {
+            foreach ($value as &$v) {
+                $v = trim($v);
+            }
+            $this->headers[$name] = $value;
+        } else {
+            $this->headers[$name] = [trim($value)];
+        }
+    }
+
+    public function setHeaders(array $headers)
+    {
+        $this->headers = $this->headerNames = [];
+        foreach ($headers as $key => $value) {
+            $this->addHeader($key, $value);
+        }
+    }
+
+    public function hasHeader($header)
+    {
+        return isset($this->headers[strtolower($header)]);
+    }
+
+    public function removeHeader($header)
+    {
+        $name = strtolower($header);
+        unset($this->headers[$name], $this->headerNames[$name]);
+    }
+
+    /**
+     * Parse an array of header values containing ";" separated data into an
+     * array of associative arrays representing the header key value pair
+     * data of the header. When a parameter does not contain a value, but just
+     * contains a key, this function will inject a key with a '' string value.
+     *
+     * @param MessageInterface $message That contains the header
+     * @param string           $header  Header to retrieve from the message
+     *
+     * @return array Returns the parsed header values.
+     */
+    public static function parseHeader(MessageInterface $message, $header)
+    {
+        static $trimmed = "\"'  \n\t\r";
+        $params = $matches = [];
+
+        foreach (self::normalizeHeader($message, $header) as $val) {
+            $part = [];
+            foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) {
+                if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) {
+                    $m = $matches[0];
+                    if (isset($m[1])) {
+                        $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed);
+                    } else {
+                        $part[] = trim($m[0], $trimmed);
+                    }
+                }
+            }
+            if ($part) {
+                $params[] = $part;
+            }
+        }
+
+        return $params;
+    }
+
+    /**
+     * Converts an array of header values that may contain comma separated
+     * headers into an array of headers with no comma separated values.
+     *
+     * @param MessageInterface $message That contains the header
+     * @param string              $header  Header to retrieve from the message
+     *
+     * @return array Returns the normalized header field values.
+     */
+    public static function normalizeHeader(MessageInterface $message, $header)
+    {
+        $h = $message->getHeaderAsArray($header);
+        for ($i = 0, $total = count($h); $i < $total; $i++) {
+            if (strpos($h[$i], ',') === false) {
+                continue;
+            }
+            foreach (preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $h[$i]) as $v) {
+                $h[] = trim($v);
+            }
+            unset($h[$i]);
+        }
+
+        return $h;
+    }
+
+    /**
+     * Gets the start-line and headers of a message as a string
+     *
+     * @param MessageInterface $message
+     *
+     * @return string
+     */
+    public static function getStartLineAndHeaders(MessageInterface $message)
+    {
+        return static::getStartLine($message)
+            . self::getHeadersAsString($message);
+    }
+
+    /**
+     * Gets the headers of a message as a string
+     *
+     * @param MessageInterface $message
+     *
+     * @return string
+     */
+    public static function getHeadersAsString(MessageInterface $message)
+    {
+        $result  = '';
+        foreach ($message->getHeaders() as $name => $values) {
+            $result .= "\r\n{$name}: " . implode(', ', $values);
+        }
+
+        return $result;
+    }
+
+    /**
+     * Gets the start line of a message
+     *
+     * @param MessageInterface $message
+     *
+     * @return string
+     * @throws \InvalidArgumentException
+     */
+    public static function getStartLine(MessageInterface $message)
+    {
+        if ($message instanceof RequestInterface) {
+            return trim($message->getMethod() . ' '
+                . $message->getResource())
+                . ' HTTP/' . $message->getProtocolVersion();
+        } elseif ($message instanceof ResponseInterface) {
+            return 'HTTP/' . $message->getProtocolVersion() . ' '
+                . $message->getStatusCode() . ' '
+                . $message->getReasonPhrase();
+        } else {
+            throw new \InvalidArgumentException('Unknown message type');
+        }
+    }
+
+    /**
+     * Accepts and modifies the options provided to the message in the
+     * constructor.
+     *
+     * Can be overridden in subclasses as necessary.
+     *
+     * @param array $options Options array passed by reference.
+     */
+    protected function handleOptions(array &$options)
+    {
+        if (isset($options['protocol_version'])) {
+            $this->protocolVersion = $options['protocol_version'];
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Message/AppliesHeadersInterface.php
@@ -0,0 +1,24 @@
+<?php
+namespace GuzzleHttp\Message;
+
+/**
+ * Applies headers to a request.
+ *
+ * This interface can be used with Guzzle streams to apply body specific
+ * headers to a request during the PREPARE_REQUEST priority of the before event
+ *
+ * NOTE: a body that implements this interface will prevent a default
+ * content-type from being added to a request during the before event. If you
+ * want a default content-type to be added, then it will need to be done
+ * manually (e.g., using {@see GuzzleHttp\Mimetypes}).
+ */
+interface AppliesHeadersInterface
+{
+    /**
+     * Apply headers to a request appropriate for the current state of the
+     * object.
+     *
+     * @param RequestInterface $request Request
+     */
+    public function applyRequestHeaders(RequestInterface $request);
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Message/FutureResponse.php
@@ -0,0 +1,158 @@
+<?php
+namespace GuzzleHttp\Message;
+
+use GuzzleHttp\Ring\Future\MagicFutureTrait;
+use GuzzleHttp\Ring\Future\FutureInterface;
+use GuzzleHttp\Stream\StreamInterface;
+
+/**
+ * Represents a response that has not been fulfilled.
+ *
+ * When created, you must provide a function that is used to dereference the
+ * future result and return it's value. The function has no arguments and MUST
+ * return an instance of a {@see GuzzleHttp\Message\ResponseInterface} object.
+ *
+ * You can optionally provide a function in the constructor that can be used to
+ * cancel the future from completing if possible. This function has no
+ * arguments and returns a boolean value representing whether or not the
+ * response could be cancelled.
+ *
+ * @property ResponseInterface $_value
+ */
+class FutureResponse implements ResponseInterface, FutureInterface
+{
+    use MagicFutureTrait;
+
+    /**
+     * Returns a FutureResponse that wraps another future.
+     *
+     * @param FutureInterface $future      Future to wrap with a new future
+     * @param callable        $onFulfilled Invoked when the future fulfilled
+     * @param callable        $onRejected  Invoked when the future rejected
+     * @param callable        $onProgress  Invoked when the future progresses
+     *
+     * @return FutureResponse
+     */
+    public static function proxy(
+        FutureInterface $future,
+        callable $onFulfilled = null,
+        callable $onRejected = null,
+        callable $onProgress = null
+    ) {
+        return new FutureResponse(
+            $future->then($onFulfilled, $onRejected, $onProgress),
+            [$future, 'wait'],
+            [$future, 'cancel']
+        );
+    }
+
+    public function getStatusCode()
+    {
+        return $this->_value->getStatusCode();
+    }
+
+    public function setStatusCode($code)
+    {
+        $this->_value->setStatusCode($code);
+    }
+
+    public function getReasonPhrase()
+    {
+        return $this->_value->getReasonPhrase();
+    }
+
+    public function setReasonPhrase($phrase)
+    {
+        $this->_value->setReasonPhrase($phrase);
+    }
+
+    public function getEffectiveUrl()
+    {
+        return $this->_value->getEffectiveUrl();
+    }
+
+    public function setEffectiveUrl($url)
+    {
+        $this->_value->setEffectiveUrl($url);
+    }
+
+    public function json(array $config = [])
+    {
+        return $this->_value->json($config);
+    }
+
+    public function xml(array $config = [])
+    {
+        return $this->_value->xml($config);
+    }
+
+    public function __toString()
+    {
+        try {
+            return $this->_value->__toString();
+        } catch (\Exception $e) {
+            trigger_error($e->getMessage(), E_USER_WARNING);
+            return '';
+        }
+    }
+
+    public function getProtocolVersion()
+    {
+        return $this->_value->getProtocolVersion();
+    }
+
+    public function setBody(StreamInterface $body = null)
+    {
+        $this->_value->setBody($body);
+    }
+
+    public function getBody()
+    {
+        return $this->_value->getBody();
+    }
+
+    public function getHeaders()
+    {
+        return $this->_value->getHeaders();
+    }
+
+    public function getHeader($header)
+    {
+        return $this->_value->getHeader($header);
+    }
+
+    public function getHeaderAsArray($header)
+    {
+        return $this->_value->getHeaderAsArray($header);
+    }
+
+    public function hasHeader($header)
+    {
+        return $this->_value->hasHeader($header);
+    }
+
+    public function removeHeader($header)
+    {
+        $this->_value->removeHeader($header);
+    }
+
+    public function addHeader($header, $value)
+    {
+        $this->_value->addHeader($header, $value);
+    }
+
+    public function addHeaders(array $headers)
+    {
+        $this->_value->addHeaders($headers);
+    }
+
+    public function setHeader($header, $value)
+    {
+        $this->_value->setHeader($header, $value);
+    }
+
+    public function setHeaders(array $headers)
+    {
+        $this->_value->setHeaders($headers);
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Message/MessageFactory.php
@@ -0,0 +1,364 @@
+<?php
+namespace GuzzleHttp\Message;
+
+use GuzzleHttp\Cookie\CookieJar;
+use GuzzleHttp\Cookie\CookieJarInterface;
+use GuzzleHttp\Event\ListenerAttacherTrait;
+use GuzzleHttp\Post\PostBody;
+use GuzzleHttp\Post\PostFile;
+use GuzzleHttp\Post\PostFileInterface;
+use GuzzleHttp\Query;
+use GuzzleHttp\Stream\Stream;
+use GuzzleHttp\Subscriber\Cookie;
+use GuzzleHttp\Subscriber\HttpError;
+use GuzzleHttp\Subscriber\Redirect;
+use GuzzleHttp\Url;
+use \InvalidArgumentException as Iae;
+
+/**
+ * Default HTTP request factory used to create Request and Response objects.
+ */
+class MessageFactory implements MessageFactoryInterface
+{
+    use ListenerAttacherTrait;
+
+    /** @var HttpError */
+    private $errorPlugin;
+
+    /** @var Redirect */
+    private $redirectPlugin;
+
+    /** @var array */
+    private $customOptions;
+
+    /** @var array Request options passed through to request Config object */
+    private static $configMap = [
+        'connect_timeout' => 1, 'timeout' => 1, 'verify' => 1, 'ssl_key' => 1,
+        'cert' => 1, 'proxy' => 1, 'debug' => 1, 'save_to' => 1, 'stream' => 1,
+        'expect' => 1, 'future' => 1
+    ];
+
+    /** @var array Default allow_redirects request option settings  */
+    private static $defaultRedirect = [
+        'max'       => 5,
+        'strict'    => false,
+        'referer'   => false,
+        'protocols' => ['http', 'https']
+    ];
+
+    /**
+     * @param array $customOptions Associative array of custom request option
+     *                             names mapping to functions used to apply
+     *                             the option. The function accepts the request
+     *                             and the option value to apply.
+     */
+    public function __construct(array $customOptions = [])
+    {
+        $this->errorPlugin = new HttpError();
+        $this->redirectPlugin = new Redirect();
+        $this->customOptions = $customOptions;
+    }
+
+    public function createResponse(
+        $statusCode,
+        array $headers = [],
+        $body = null,
+        array $options = []
+    ) {
+        if (null !== $body) {
+            $body = Stream::factory($body);
+        }
+
+        return new Response($statusCode, $headers, $body, $options);
+    }
+
+    public function createRequest($method, $url, array $options = [])
+    {
+        // Handle the request protocol version option that needs to be
+        // specified in the request constructor.
+        if (isset($options['version'])) {
+            $options['config']['protocol_version'] = $options['version'];
+            unset($options['version']);
+        }
+
+        $request = new Request($method, $url, [], null,
+            isset($options['config']) ? $options['config'] : []);
+
+        unset($options['config']);
+
+        // Use a POST body by default
+        if (strtoupper($method) == 'POST'
+            && !isset($options['body'])
+            && !isset($options['json'])
+        ) {
+            $options['body'] = [];
+        }
+
+        if ($options) {
+            $this->applyOptions($request, $options);
+        }
+
+        return $request;
+    }
+
+    /**
+     * Create a request or response object from an HTTP message string
+     *
+     * @param string $message Message to parse
+     *
+     * @return RequestInterface|ResponseInterface
+     * @throws \InvalidArgumentException if unable to parse a message
+     */
+    public function fromMessage($message)
+    {
+        static $parser;
+        if (!$parser) {
+            $parser = new MessageParser();
+        }
+
+        // Parse a response
+        if (strtoupper(substr($message, 0, 4)) == 'HTTP') {
+            $data = $parser->parseResponse($message);
+            return $this->createResponse(
+                $data['code'],
+                $data['headers'],
+                $data['body'] === '' ? null : $data['body'],
+                $data
+            );
+        }
+
+        // Parse a request
+        if (!($data = ($parser->parseRequest($message)))) {
+            throw new \InvalidArgumentException('Unable to parse request');
+        }
+
+        return $this->createRequest(
+            $data['method'],
+            Url::buildUrl($data['request_url']),
+            [
+                'headers' => $data['headers'],
+                'body' => $data['body'] === '' ? null : $data['body'],
+                'config' => [
+                    'protocol_version' => $data['protocol_version']
+                ]
+            ]
+        );
+    }
+
+    /**
+     * Apply POST fields and files to a request to attempt to give an accurate
+     * representation.
+     *
+     * @param RequestInterface $request Request to update
+     * @param array            $body    Body to apply
+     */
+    protected function addPostData(RequestInterface $request, array $body)
+    {
+        static $fields = ['string' => true, 'array' => true, 'NULL' => true,
+            'boolean' => true, 'double' => true, 'integer' => true];
+
+        $post = new PostBody();
+        foreach ($body as $key => $value) {
+            if (isset($fields[gettype($value)])) {
+                $post->setField($key, $value);
+            } elseif ($value instanceof PostFileInterface) {
+                $post->addFile($value);
+            } else {
+                $post->addFile(new PostFile($key, $value));
+            }
+        }
+
+        if ($request->getHeader('Content-Type') == 'multipart/form-data') {
+            $post->forceMultipartUpload(true);
+        }
+
+        $request->setBody($post);
+    }
+
+    protected function applyOptions(
+        RequestInterface $request,
+        array $options = []
+    ) {
+        $config = $request->getConfig();
+        $emitter = $request->getEmitter();
+
+        foreach ($options as $key => $value) {
+
+            if (isset(self::$configMap[$key])) {
+                $config[$key] = $value;
+                continue;
+            }
+
+            switch ($key) {
+
+            case 'allow_redirects':
+
+                if ($value === false) {
+                    continue;
+                }
+
+                if ($value === true) {
+                    $value = self::$defaultRedirect;
+                } elseif (!is_array($value)) {
+                    throw new Iae('allow_redirects must be true, false, or array');
+                } else {
+                    // Merge the default settings with the provided settings
+                    $value += self::$defaultRedirect;
+                }
+
+                $config['redirect'] = $value;
+                $emitter->attach($this->redirectPlugin);
+                break;
+
+            case 'decode_content':
+
+                if ($value === false) {
+                    continue;
+                }
+
+                $config['decode_content'] = true;
+                if ($value !== true) {
+                    $request->setHeader('Accept-Encoding', $value);
+                }
+                break;
+
+            case 'headers':
+
+                if (!is_array($value)) {
+                    throw new Iae('header value must be an array');
+                }
+                foreach ($value as $k => $v) {
+                    $request->setHeader($k, $v);
+                }
+                break;
+
+            case 'exceptions':
+
+                if ($value === true) {
+                    $emitter->attach($this->errorPlugin);
+                }
+                break;
+
+            case 'body':
+
+                if (is_array($value)) {
+                    $this->addPostData($request, $value);
+                } elseif ($value !== null) {
+                    $request->setBody(Stream::factory($value));
+                }
+                break;
+
+            case 'auth':
+
+                if (!$value) {
+                    continue;
+                }
+
+                if (is_array($value)) {
+                    $type = isset($value[2]) ? strtolower($value[2]) : 'basic';
+                } else {
+                    $type = strtolower($value);
+                }
+
+                $config['auth'] = $value;
+
+                if ($type == 'basic') {
+                    $request->setHeader(
+                        'Authorization',
+                        'Basic ' . base64_encode("$value[0]:$value[1]")
+                    );
+                } elseif ($type == 'digest') {
+                    // @todo: Do not rely on curl
+                    $config->setPath('curl/' . CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
+                    $config->setPath('curl/' . CURLOPT_USERPWD, "$value[0]:$value[1]");
+                }
+                break;
+
+            case 'query':
+
+                if ($value instanceof Query) {
+                    $original = $request->getQuery();
+                    // Do not overwrite existing query string variables by
+                    // overwriting the object with the query string data passed
+                    // in the URL
+                    $value->overwriteWith($original->toArray());
+                    $request->setQuery($value);
+                } elseif (is_array($value)) {
+                    // Do not overwrite existing query string variables
+                    $query = $request->getQuery();
+                    foreach ($value as $k => $v) {
+                        if (!isset($query[$k])) {
+                            $query[$k] = $v;
+                        }
+                    }
+                } else {
+                    throw new Iae('query must be an array or Query object');
+                }
+                break;
+
+            case 'cookies':
+
+                if ($value === true) {
+                    static $cookie = null;
+                    if (!$cookie) {
+                        $cookie = new Cookie();
+                    }
+                    $emitter->attach($cookie);
+                } elseif (is_array($value)) {
+                    $emitter->attach(
+                        new Cookie(CookieJar::fromArray($value, $request->getHost()))
+                    );
+                } elseif ($value instanceof CookieJarInterface) {
+                    $emitter->attach(new Cookie($value));
+                } elseif ($value !== false) {
+                    throw new Iae('cookies must be an array, true, or CookieJarInterface');
+                }
+                break;
+
+            case 'events':
+
+                if (!is_array($value)) {
+                    throw new Iae('events must be an array');
+                }
+
+                $this->attachListeners($request,
+                    $this->prepareListeners(
+                        $value,
+                        ['before', 'complete', 'error', 'progress', 'end']
+                    )
+                );
+                break;
+
+            case 'subscribers':
+
+                if (!is_array($value)) {
+                    throw new Iae('subscribers must be an array');
+                }
+
+                foreach ($value as $subscribers) {
+                    $emitter->attach($subscribers);
+                }
+                break;
+
+            case 'json':
+
+                $request->setBody(Stream::factory(json_encode($value)));
+                if (!$request->hasHeader('Content-Type')) {
+                    $request->setHeader('Content-Type', 'application/json');
+                }
+                break;
+
+            default:
+
+                // Check for custom handler functions.
+                if (isset($this->customOptions[$key])) {
+                    $fn = $this->customOptions[$key];
+                    $fn($request, $value);
+                    continue;
+                }
+
+                throw new Iae("No method can handle the {$key} config key");
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Message/MessageFactoryInterface.php
@@ -0,0 +1,71 @@
+<?php
+namespace GuzzleHttp\Message;
+
+use GuzzleHttp\Url;
+
+/**
+ * Request and response factory
+ */
+interface MessageFactoryInterface
+{
+    /**
+     * Creates a response
+     *
+     * @param string $statusCode HTTP status code
+     * @param array  $headers    Response headers
+     * @param mixed  $body       Response body
+     * @param array  $options    Response options
+     *     - protocol_version: HTTP protocol version
+     *     - header_factory: Factory used to create headers
+     *     - And any other options used by a concrete message implementation
+     *
+     * @return ResponseInterface
+     */
+    public function createResponse(
+        $statusCode,
+        array $headers = [],
+        $body = null,
+        array $options = []
+    );
+
+    /**
+     * Create a new request based on the HTTP method.
+     *
+     * This method accepts an associative array of request options. Below is a
+     * brief description of each parameter. See
+     * http://docs.guzzlephp.org/en/latest/clients.html#request-options for a much more
+     * in-depth description of each parameter.
+     *
+     * - headers: Associative array of headers to add to the request
+     * - body: string|resource|array|StreamInterface request body to send
+     * - json: mixed Uploads JSON encoded data using an application/json Content-Type header.
+     * - query: Associative array of query string values to add to the request
+     * - auth: array|string HTTP auth settings (user, pass[, type="basic"])
+     * - version: The HTTP protocol version to use with the request
+     * - cookies: true|false|CookieJarInterface To enable or disable cookies
+     * - allow_redirects: true|false|array Controls HTTP redirects
+     * - save_to: string|resource|StreamInterface Where the response is saved
+     * - events: Associative array of event names to callables or arrays
+     * - subscribers: Array of event subscribers to add to the request
+     * - exceptions: Specifies whether or not exceptions are thrown for HTTP protocol errors
+     * - timeout: Timeout of the request in seconds. Use 0 to wait indefinitely
+     * - connect_timeout: Number of seconds to wait while trying to connect. (0 to wait indefinitely)
+     * - verify: SSL validation. True/False or the path to a PEM file
+     * - cert: Path a SSL cert or array of (path, pwd)
+     * - ssl_key: Path to a private SSL key or array of (path, pwd)
+     * - proxy: Specify an HTTP proxy or hash of protocols to proxies
+     * - debug: Set to true or a resource to view handler specific debug info
+     * - stream: Set to true to stream a response body rather than download it all up front
+     * - expect: true/false/integer Controls the "Expect: 100-Continue" header
+     * - config: Associative array of request config collection options
+     * - decode_content: true/false/string to control decoding content-encoding responses
+     *
+     * @param string     $method  HTTP method (GET, POST, PUT, etc.)
+     * @param string|Url $url     HTTP URL to connect to
+     * @param array      $options Array of options to apply to the request
+     *
+     * @return RequestInterface
+     * @link http://docs.guzzlephp.org/en/latest/clients.html#request-options
+     */
+    public function createRequest($method, $url, array $options = []);
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Message/MessageInterface.php
@@ -0,0 +1,136 @@
+<?php
+namespace GuzzleHttp\Message;
+
+use GuzzleHttp\Stream\StreamInterface;
+
+/**
+ * Request and response message interface
+ */
+interface MessageInterface
+{
+    /**
+     * Get a string representation of the message
+     *
+     * @return string
+     */
+    public function __toString();
+
+    /**
+     * Get the HTTP protocol version of the message
+     *
+     * @return string
+     */
+    public function getProtocolVersion();
+
+    /**
+     * Sets the body of the message.
+     *
+     * The body MUST be a StreamInterface object. Setting the body to null MUST
+     * remove the existing body.
+     *
+     * @param StreamInterface|null $body Body.
+     */
+    public function setBody(StreamInterface $body = null);
+
+    /**
+     * Get the body of the message
+     *
+     * @return StreamInterface|null
+     */
+    public function getBody();
+
+    /**
+     * Gets all message headers.
+     *
+     * The keys represent the header name as it will be sent over the wire, and
+     * each value is an array of strings associated with the header.
+     *
+     *     // Represent the headers as a string
+     *     foreach ($message->getHeaders() as $name => $values) {
+     *         echo $name . ": " . implode(", ", $values);
+     *     }
+     *
+     * @return array Returns an associative array of the message's headers.
+     */
+    public function getHeaders();
+
+    /**
+     * Retrieve a header by the given case-insensitive name.
+     *
+     * @param string $header Case-insensitive header name.
+     *
+     * @return string
+     */
+    public function getHeader($header);
+
+    /**
+     * Retrieves a header by the given case-insensitive name as an array of strings.
+     *
+     * @param string $header Case-insensitive header name.
+     *
+     * @return string[]
+     */
+    public function getHeaderAsArray($header);
+
+    /**
+     * Checks if a header exists by the given case-insensitive name.
+     *
+     * @param string $header Case-insensitive header name.
+     *
+     * @return bool Returns true if any header names match the given header
+     *     name using a case-insensitive string comparison. Returns false if
+     *     no matching header name is found in the message.
+     */
+    public function hasHeader($header);
+
+    /**
+     * Remove a specific header by case-insensitive name.
+     *
+     * @param string $header Case-insensitive header name.
+     */
+    public function removeHeader($header);
+
+    /**
+     * Appends a header value to any existing values associated with the
+     * given header name.
+     *
+     * @param string $header Header name to add
+     * @param string $value  Value of the header
+     */
+    public function addHeader($header, $value);
+
+    /**
+     * Merges in an associative array of headers.
+     *
+     * Each array key MUST be a string representing the case-insensitive name
+     * of a header. Each value MUST be either a string or an array of strings.
+     * For each value, the value is appended to any existing header of the same
+     * name, or, if a header does not already exist by the given name, then the
+     * header is added.
+     *
+     * @param array $headers Associative array of headers to add to the message
+     */
+    public function addHeaders(array $headers);
+
+    /**
+     * Sets a header, replacing any existing values of any headers with the
+     * same case-insensitive name.
+     *
+     * The header values MUST be a string or an array of strings.
+     *
+     * @param string       $header Header name
+     * @param string|array $value  Header value(s)
+     */
+    public function setHeader($header, $value);
+
+    /**
+     * Sets headers, replacing any headers that have already been set on the
+     * message.
+     *
+     * The array keys MUST be a string. The array values must be either a
+     * string or an array of strings.
+     *
+     * @param array $headers Headers to set.
+     */
+    public function setHeaders(array $headers);
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Message/MessageParser.php
@@ -0,0 +1,171 @@
+<?php
+namespace GuzzleHttp\Message;
+
+/**
+ * Request and response parser used by Guzzle
+ */
+class MessageParser
+{
+    /**
+     * Parse an HTTP request message into an associative array of parts.
+     *
+     * @param string $message HTTP request to parse
+     *
+     * @return array|bool Returns false if the message is invalid
+     */
+    public function parseRequest($message)
+    {
+        if (!($parts = $this->parseMessage($message))) {
+            return false;
+        }
+
+        // Parse the protocol and protocol version
+        if (isset($parts['start_line'][2])) {
+            $startParts = explode('/', $parts['start_line'][2]);
+            $protocol = strtoupper($startParts[0]);
+            $version = isset($startParts[1]) ? $startParts[1] : '1.1';
+        } else {
+            $protocol = 'HTTP';
+            $version = '1.1';
+        }
+
+        $parsed = [
+            'method'   => strtoupper($parts['start_line'][0]),
+            'protocol' => $protocol,
+            'protocol_version' => $version,
+            'headers'  => $parts['headers'],
+            'body'     => $parts['body']
+        ];
+
+        $parsed['request_url'] = $this->getUrlPartsFromMessage(
+            (isset($parts['start_line'][1]) ? $parts['start_line'][1] : ''), $parsed);
+
+        return $parsed;
+    }
+
+    /**
+     * Parse an HTTP response message into an associative array of parts.
+     *
+     * @param string $message HTTP response to parse
+     *
+     * @return array|bool Returns false if the message is invalid
+     */
+    public function parseResponse($message)
+    {
+        if (!($parts = $this->parseMessage($message))) {
+            return false;
+        }
+
+        list($protocol, $version) = explode('/', trim($parts['start_line'][0]));
+
+        return [
+            'protocol'         => $protocol,
+            'protocol_version' => $version,
+            'code'             => $parts['start_line'][1],
+            'reason_phrase'    => isset($parts['start_line'][2]) ? $parts['start_line'][2] : '',
+            'headers'          => $parts['headers'],
+            'body'             => $parts['body']
+        ];
+    }
+
+    /**
+     * Parse a message into parts
+     *
+     * @param string $message Message to parse
+     *
+     * @return array|bool
+     */
+    private function parseMessage($message)
+    {
+        if (!$message) {
+            return false;
+        }
+
+        $startLine = null;
+        $headers = [];
+        $body = '';
+
+        // Iterate over each line in the message, accounting for line endings
+        $lines = preg_split('/(\\r?\\n)/', $message, -1, PREG_SPLIT_DELIM_CAPTURE);
+        for ($i = 0, $totalLines = count($lines); $i < $totalLines; $i += 2) {
+
+            $line = $lines[$i];
+
+            // If two line breaks were encountered, then this is the end of body
+            if (empty($line)) {
+                if ($i < $totalLines - 1) {
+                    $body = implode('', array_slice($lines, $i + 2));
+                }
+                break;
+            }
+
+            // Parse message headers
+            if (!$startLine) {
+                $startLine = explode(' ', $line, 3);
+            } elseif (strpos($line, ':')) {
+                $parts = explode(':', $line, 2);
+                $key = trim($parts[0]);
+                $value = isset($parts[1]) ? trim($parts[1]) : '';
+                if (!isset($headers[$key])) {
+                    $headers[$key] = $value;
+                } elseif (!is_array($headers[$key])) {
+                    $headers[$key] = [$headers[$key], $value];
+                } else {
+                    $headers[$key][] = $value;
+                }
+            }
+        }
+
+        return [
+            'start_line' => $startLine,
+            'headers'    => $headers,
+            'body'       => $body
+        ];
+    }
+
+    /**
+     * Create URL parts from HTTP message parts
+     *
+     * @param string $requestUrl Associated URL
+     * @param array  $parts      HTTP message parts
+     *
+     * @return array
+     */
+    private function getUrlPartsFromMessage($requestUrl, array $parts)
+    {
+        // Parse the URL information from the message
+        $urlParts = ['path' => $requestUrl, 'scheme' => 'http'];
+
+        // Check for the Host header
+        if (isset($parts['headers']['Host'])) {
+            $urlParts['host'] = $parts['headers']['Host'];
+        } elseif (isset($parts['headers']['host'])) {
+            $urlParts['host'] = $parts['headers']['host'];
+        } else {
+            $urlParts['host'] = null;
+        }
+
+        if (false === strpos($urlParts['host'], ':')) {
+            $urlParts['port'] = '';
+        } else {
+            $hostParts = explode(':', $urlParts['host']);
+            $urlParts['host'] = trim($hostParts[0]);
+            $urlParts['port'] = (int) trim($hostParts[1]);
+            if ($urlParts['port'] == 443) {
+                $urlParts['scheme'] = 'https';
+            }
+        }
+
+        // Check if a query is present
+        $path = $urlParts['path'];
+        $qpos = strpos($path, '?');
+        if ($qpos) {
+            $urlParts['query'] = substr($path, $qpos + 1);
+            $urlParts['path'] = substr($path, 0, $qpos);
+        } else {
+            $urlParts['query'] = '';
+        }
+
+        return $urlParts;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Message/Request.php
@@ -0,0 +1,195 @@
+<?php
+namespace GuzzleHttp\Message;
+
+use GuzzleHttp\Collection;
+use GuzzleHttp\Event\HasEmitterTrait;
+use GuzzleHttp\Subscriber\Prepare;
+use GuzzleHttp\Url;
+
+/**
+ * HTTP request class to send requests
+ */
+class Request extends AbstractMessage implements RequestInterface
+{
+    use HasEmitterTrait;
+
+    /** @var Url HTTP Url */
+    private $url;
+
+    /** @var string HTTP method */
+    private $method;
+
+    /** @var Collection Transfer options */
+    private $transferOptions;
+
+    /**
+     * @param string           $method  HTTP method
+     * @param string|Url       $url     HTTP URL to connect to. The URI scheme,
+     *   host header, and URI are parsed from the full URL. If query string
+     *   parameters are present they will be parsed as well.
+     * @param array|Collection $headers HTTP headers
+     * @param mixed            $body    Body to send with the request
+     * @param array            $options Array of options to use with the request
+     *     - emitter: Event emitter to use with the request
+     */
+    public function __construct(
+        $method,
+        $url,
+        $headers = [],
+        $body = null,
+        array $options = []
+    ) {
+        $this->setUrl($url);
+        $this->method = strtoupper($method);
+        $this->handleOptions($options);
+        $this->transferOptions = new Collection($options);
+        $this->addPrepareEvent();
+
+        if ($body !== null) {
+            $this->setBody($body);
+        }
+
+        if ($headers) {
+            foreach ($headers as $key => $value) {
+                $this->addHeader($key, $value);
+            }
+        }
+    }
+
+    public function __clone()
+    {
+        if ($this->emitter) {
+            $this->emitter = clone $this->emitter;
+        }
+        $this->transferOptions = clone $this->transferOptions;
+        $this->url = clone $this->url;
+    }
+
+    public function setUrl($url)
+    {
+        $this->url = $url instanceof Url ? $url : Url::fromString($url);
+        $this->updateHostHeaderFromUrl();
+    }
+
+    public function getUrl()
+    {
+        return (string) $this->url;
+    }
+
+    public function setQuery($query)
+    {
+        $this->url->setQuery($query);
+    }
+
+    public function getQuery()
+    {
+        return $this->url->getQuery();
+    }
+
+    public function setMethod($method)
+    {
+        $this->method = strtoupper($method);
+    }
+
+    public function getMethod()
+    {
+        return $this->method;
+    }
+
+    public function getScheme()
+    {
+        return $this->url->getScheme();
+    }
+
+    public function setScheme($scheme)
+    {
+        $this->url->setScheme($scheme);
+    }
+
+    public function getPort()
+    {
+        return $this->url->getPort();
+    }
+
+    public function setPort($port)
+    {
+        $this->url->setPort($port);
+        $this->updateHostHeaderFromUrl();
+    }
+
+    public function getHost()
+    {
+        return $this->url->getHost();
+    }
+
+    public function setHost($host)
+    {
+        $this->url->setHost($host);
+        $this->updateHostHeaderFromUrl();
+    }
+
+    public function getPath()
+    {
+        return '/' . ltrim($this->url->getPath(), '/');
+    }
+
+    public function setPath($path)
+    {
+        $this->url->setPath($path);
+    }
+
+    public function getResource()
+    {
+        $resource = $this->getPath();
+        if ($query = (string) $this->url->getQuery()) {
+            $resource .= '?' . $query;
+        }
+
+        return $resource;
+    }
+
+    public function getConfig()
+    {
+        return $this->transferOptions;
+    }
+
+    protected function handleOptions(array &$options)
+    {
+        parent::handleOptions($options);
+        // Use a custom emitter if one is specified, and remove it from
+        // options that are exposed through getConfig()
+        if (isset($options['emitter'])) {
+            $this->emitter = $options['emitter'];
+            unset($options['emitter']);
+        }
+    }
+
+    /**
+     * Adds a subscriber that ensures a request's body is prepared before
+     * sending.
+     */
+    private function addPrepareEvent()
+    {
+        static $subscriber;
+        if (!$subscriber) {
+            $subscriber = new Prepare();
+        }
+
+        $this->getEmitter()->attach($subscriber);
+    }
+
+    private function updateHostHeaderFromUrl()
+    {
+        $port = $this->url->getPort();
+        $scheme = $this->url->getScheme();
+        if ($host = $this->url->getHost()) {
+            if (($port == 80 && $scheme == 'http') ||
+                ($port == 443 && $scheme == 'https')
+            ) {
+                $this->setHeader('Host', $host);
+            } else {
+                $this->setHeader('Host', "{$host}:{$port}");
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Message/RequestInterface.php
@@ -0,0 +1,136 @@
+<?php
+namespace GuzzleHttp\Message;
+
+use GuzzleHttp\Event\HasEmitterInterface;
+use GuzzleHttp\Query;
+
+/**
+ * Generic HTTP request interface
+ */
+interface RequestInterface extends MessageInterface, HasEmitterInterface
+{
+    /**
+     * Sets the request URL.
+     *
+     * The URL MUST be a string, or an object that implements the
+     * `__toString()` method.
+     *
+     * @param string $url Request URL.
+     *
+     * @throws \InvalidArgumentException If the URL is invalid.
+     */
+    public function setUrl($url);
+
+    /**
+     * Gets the request URL as a string.
+     *
+     * @return string Returns the URL as a string.
+     */
+    public function getUrl();
+
+    /**
+     * Get the resource part of the the request, including the path, query
+     * string, and fragment.
+     *
+     * @return string
+     */
+    public function getResource();
+
+    /**
+     * Get the collection of key value pairs that will be used as the query
+     * string in the request.
+     *
+     * @return Query
+     */
+    public function getQuery();
+
+    /**
+     * Set the query string used by the request
+     *
+     * @param array|Query $query Query to set
+     */
+    public function setQuery($query);
+
+    /**
+     * Get the HTTP method of the request.
+     *
+     * @return string
+     */
+    public function getMethod();
+
+    /**
+     * Set the HTTP method of the request.
+     *
+     * @param string $method HTTP method
+     */
+    public function setMethod($method);
+
+    /**
+     * Get the URI scheme of the request (http, https, etc.).
+     *
+     * @return string
+     */
+    public function getScheme();
+
+    /**
+     * Set the URI scheme of the request (http, https, etc.).
+     *
+     * @param string $scheme Scheme to set
+     */
+    public function setScheme($scheme);
+
+    /**
+     * Get the port scheme of the request (e.g., 80, 443, etc.).
+     *
+     * @return int
+     */
+    public function getPort();
+
+    /**
+     * Set the port of the request.
+     *
+     * Setting a port modifies the Host header of a request as necessary.
+     *
+     * @param int $port Port to set
+     */
+    public function setPort($port);
+
+    /**
+     * Get the host of the request.
+     *
+     * @return string
+     */
+    public function getHost();
+
+    /**
+     * Set the host of the request including an optional port.
+     *
+     * Including a port in the host argument will explicitly change the port of
+     * the request. If no port is found, the default port of the current
+     * request scheme will be utilized.
+     *
+     * @param string $host Host to set (e.g. www.yahoo.com, www.yahoo.com:80)
+     */
+    public function setHost($host);
+
+    /**
+     * Get the path of the request (e.g. '/', '/index.html').
+     *
+     * @return string
+     */
+    public function getPath();
+
+    /**
+     * Set the path of the request (e.g. '/', '/index.html').
+     *
+     * @param string|array $path Path to set or array of segments to implode
+     */
+    public function setPath($path);
+
+    /**
+     * Get the request's configuration options.
+     *
+     * @return \GuzzleHttp\Collection
+     */
+    public function getConfig();
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Message/Response.php
@@ -0,0 +1,208 @@
+<?php
+namespace GuzzleHttp\Message;
+
+use GuzzleHttp\Exception\ParseException;
+use GuzzleHttp\Exception\XmlParseException;
+use GuzzleHttp\Stream\StreamInterface;
+use GuzzleHttp\Utils;
+
+/**
+ * Guzzle HTTP response object
+ */
+class Response extends AbstractMessage implements ResponseInterface
+{
+    /** @var array Mapping of status codes to reason phrases */
+    private static $statusTexts = [
+        100 => 'Continue',
+        101 => 'Switching Protocols',
+        102 => 'Processing',
+        200 => 'OK',
+        201 => 'Created',
+        202 => 'Accepted',
+        203 => 'Non-Authoritative Information',
+        204 => 'No Content',
+        205 => 'Reset Content',
+        206 => 'Partial Content',
+        207 => 'Multi-Status',
+        208 => 'Already Reported',
+        226 => 'IM Used',
+        300 => 'Multiple Choices',
+        301 => 'Moved Permanently',
+        302 => 'Found',
+        303 => 'See Other',
+        304 => 'Not Modified',
+        305 => 'Use Proxy',
+        307 => 'Temporary Redirect',
+        308 => 'Permanent Redirect',
+        400 => 'Bad Request',
+        401 => 'Unauthorized',
+        402 => 'Payment Required',
+        403 => 'Forbidden',
+        404 => 'Not Found',
+        405 => 'Method Not Allowed',
+        406 => 'Not Acceptable',
+        407 => 'Proxy Authentication Required',
+        408 => 'Request Timeout',
+        409 => 'Conflict',
+        410 => 'Gone',
+        411 => 'Length Required',
+        412 => 'Precondition Failed',
+        413 => 'Request Entity Too Large',
+        414 => 'Request-URI Too Long',
+        415 => 'Unsupported Media Type',
+        416 => 'Requested Range Not Satisfiable',
+        417 => 'Expectation Failed',
+        422 => 'Unprocessable Entity',
+        423 => 'Locked',
+        424 => 'Failed Dependency',
+        425 => 'Reserved for WebDAV advanced collections expired proposal',
+        426 => 'Upgrade required',
+        428 => 'Precondition Required',
+        429 => 'Too Many Requests',
+        431 => 'Request Header Fields Too Large',
+        500 => 'Internal Server Error',
+        501 => 'Not Implemented',
+        502 => 'Bad Gateway',
+        503 => 'Service Unavailable',
+        504 => 'Gateway Timeout',
+        505 => 'HTTP Version Not Supported',
+        506 => 'Variant Also Negotiates (Experimental)',
+        507 => 'Insufficient Storage',
+        508 => 'Loop Detected',
+        510 => 'Not Extended',
+        511 => 'Network Authentication Required',
+    ];
+
+    /** @var string The reason phrase of the response (human readable code) */
+    private $reasonPhrase;
+
+    /** @var string The status code of the response */
+    private $statusCode;
+
+    /** @var string The effective URL that returned this response */
+    private $effectiveUrl;
+
+    /**
+     * @param int|string      $statusCode The response status code (e.g. 200)
+     * @param array           $headers    The response headers
+     * @param StreamInterface $body       The body of the response
+     * @param array           $options    Response message options
+     *     - reason_phrase: Set a custom reason phrase
+     *     - protocol_version: Set a custom protocol version
+     */
+    public function __construct(
+        $statusCode,
+        array $headers = [],
+        StreamInterface $body = null,
+        array $options = []
+    ) {
+        $this->statusCode = (int) $statusCode;
+        $this->handleOptions($options);
+
+        // Assume a reason phrase if one was not applied as an option
+        if (!$this->reasonPhrase &&
+            isset(self::$statusTexts[$this->statusCode])
+        ) {
+            $this->reasonPhrase = self::$statusTexts[$this->statusCode];
+        }
+
+        if ($headers) {
+            $this->setHeaders($headers);
+        }
+
+        if ($body) {
+            $this->setBody($body);
+        }
+    }
+
+    public function getStatusCode()
+    {
+        return $this->statusCode;
+    }
+
+    public function setStatusCode($code)
+    {
+        return $this->statusCode = (int) $code;
+    }
+
+    public function getReasonPhrase()
+    {
+        return $this->reasonPhrase;
+    }
+
+    public function setReasonPhrase($phrase)
+    {
+        return $this->reasonPhrase = $phrase;
+    }
+
+    public function json(array $config = [])
+    {
+        try {
+            return Utils::jsonDecode(
+                (string) $this->getBody(),
+                isset($config['object']) ? !$config['object'] : true,
+                512,
+                isset($config['big_int_strings']) ? JSON_BIGINT_AS_STRING : 0
+            );
+        } catch (\InvalidArgumentException $e) {
+            throw new ParseException(
+                $e->getMessage(),
+                $this
+            );
+        }
+    }
+
+    public function xml(array $config = [])
+    {
+        $disableEntities = libxml_disable_entity_loader(true);
+        $internalErrors = libxml_use_internal_errors(true);
+
+        try {
+            // Allow XML to be retrieved even if there is no response body
+            $xml = new \SimpleXMLElement(
+                (string) $this->getBody() ?: '<root />',
+                isset($config['libxml_options']) ? $config['libxml_options'] : LIBXML_NONET,
+                false,
+                isset($config['ns']) ? $config['ns'] : '',
+                isset($config['ns_is_prefix']) ? $config['ns_is_prefix'] : false
+            );
+            libxml_disable_entity_loader($disableEntities);
+            libxml_use_internal_errors($internalErrors);
+        } catch (\Exception $e) {
+            libxml_disable_entity_loader($disableEntities);
+            libxml_use_internal_errors($internalErrors);
+            throw new XmlParseException(
+                'Unable to parse response body into XML: ' . $e->getMessage(),
+                $this,
+                $e,
+                (libxml_get_last_error()) ?: null
+            );
+        }
+
+        return $xml;
+    }
+
+    public function getEffectiveUrl()
+    {
+        return $this->effectiveUrl;
+    }
+
+    public function setEffectiveUrl($url)
+    {
+        $this->effectiveUrl = $url;
+    }
+
+    /**
+     * Accepts and modifies the options provided to the response in the
+     * constructor.
+     *
+     * @param array $options Options array passed by reference.
+     */
+    protected function handleOptions(array &$options = [])
+    {
+        parent::handleOptions($options);
+        if (isset($options['reason_phrase'])) {
+            $this->reasonPhrase = $options['reason_phrase'];
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Message/ResponseInterface.php
@@ -0,0 +1,111 @@
+<?php
+namespace GuzzleHttp\Message;
+
+/**
+ * Represents an HTTP response message.
+ */
+interface ResponseInterface extends MessageInterface
+{
+    /**
+     * Gets the response Status-Code.
+     *
+     * The Status-Code is a 3-digit integer result code of the server's attempt
+     * to understand and satisfy the request.
+     *
+     * @return int Status code.
+     */
+    public function getStatusCode();
+
+    /**
+     * Sets the status code of this response.
+     *
+     * @param int $code The 3-digit integer result code to set.
+     */
+    public function setStatusCode($code);
+
+    /**
+     * Gets the response Reason-Phrase, a short textual description of the
+     * Status-Code.
+     *
+     * Because a Reason-Phrase is not a required element in response
+     * Status-Line, the Reason-Phrase value MAY be null. Implementations MAY
+     * choose to return the default RFC 2616 recommended reason phrase for the
+     * response's Status-Code.
+     *
+     * @return string|null Reason phrase, or null if unknown.
+     */
+    public function getReasonPhrase();
+
+    /**
+     * Sets the Reason-Phrase of the response.
+     *
+     * If no Reason-Phrase is specified, implementations MAY choose to default
+     * to the RFC 2616 recommended reason phrase for the response's Status-Code.
+     *
+     * @param string $phrase The Reason-Phrase to set.
+     */
+    public function setReasonPhrase($phrase);
+
+    /**
+     * Get the effective URL that resulted in this response (e.g. the last
+     * redirect URL).
+     *
+     * @return string
+     */
+    public function getEffectiveUrl();
+
+    /**
+     * Set the effective URL that resulted in this response (e.g. the last
+     * redirect URL).
+     *
+     * @param string $url Effective URL
+     */
+    public function setEffectiveUrl($url);
+
+    /**
+     * Parse the JSON response body and return the JSON decoded data.
+     *
+     * @param array $config Associative array of configuration settings used
+     *     to control how the JSON data is parsed. Concrete implementations MAY
+     *     add further configuration settings as needed, but they MUST implement
+     *     functionality for the following options:
+     *
+     *     - object: Set to true to parse JSON objects as PHP objects rather
+     *       than associative arrays. Defaults to false.
+     *     - big_int_strings: When set to true, large integers are converted to
+     *       strings rather than floats. Defaults to false.
+     *
+     *     Implementations are free to add further configuration settings as
+     *     needed.
+     *
+     * @return mixed Returns the JSON decoded data based on the provided
+     *     parse settings.
+     * @throws \RuntimeException if the response body is not in JSON format
+     */
+    public function json(array $config = []);
+
+    /**
+     * Parse the XML response body and return a \SimpleXMLElement.
+     *
+     * In order to prevent XXE attacks, this method disables loading external
+     * entities. If you rely on external entities, then you must parse the
+     * XML response manually by accessing the response body directly.
+     *
+     * @param array $config Associative array of configuration settings used
+     *     to control how the XML is parsed. Concrete implementations MAY add
+     *     further configuration settings as needed, but they MUST implement
+     *     functionality for the following options:
+     *
+     *     - ns: Set to a string to represent the namespace prefix or URI
+     *     - ns_is_prefix: Set to true to specify that the NS is a prefix rather
+     *       than a URI (defaults to false).
+     *     - libxml_options: Bitwise OR of the libxml option constants
+     *       listed at http://php.net/manual/en/libxml.constants.php
+     *       (defaults to LIBXML_NONET)
+     *
+     * @return \SimpleXMLElement
+     * @throws \RuntimeException if the response body is not in XML format
+     * @link http://websec.io/2012/08/27/Preventing-XXE-in-PHP.html
+     */
+    public function xml(array $config = []);
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Mimetypes.php
@@ -0,0 +1,963 @@
+<?php
+namespace GuzzleHttp;
+
+/**
+ * Provides mappings of file extensions to mimetypes
+ * @link http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types
+ */
+class Mimetypes
+{
+    /** @var self */
+    protected static $instance;
+
+    /** @var array Mapping of extension to mimetype */
+    protected $mimetypes = array(
+        '3dml' => 'text/vnd.in3d.3dml',
+        '3g2' => 'video/3gpp2',
+        '3gp' => 'video/3gpp',
+        '7z' => 'application/x-7z-compressed',
+        'aab' => 'application/x-authorware-bin',
+        'aac' => 'audio/x-aac',
+        'aam' => 'application/x-authorware-map',
+        'aas' => 'application/x-authorware-seg',
+        'abw' => 'application/x-abiword',
+        'ac' => 'application/pkix-attr-cert',
+        'acc' => 'application/vnd.americandynamics.acc',
+        'ace' => 'application/x-ace-compressed',
+        'acu' => 'application/vnd.acucobol',
+        'acutc' => 'application/vnd.acucorp',
+        'adp' => 'audio/adpcm',
+        'aep' => 'application/vnd.audiograph',
+        'afm' => 'application/x-font-type1',
+        'afp' => 'application/vnd.ibm.modcap',
+        'ahead' => 'application/vnd.ahead.space',
+        'ai' => 'application/postscript',
+        'aif' => 'audio/x-aiff',
+        'aifc' => 'audio/x-aiff',
+        'aiff' => 'audio/x-aiff',
+        'air' => 'application/vnd.adobe.air-application-installer-package+zip',
+        'ait' => 'application/vnd.dvb.ait',
+        'ami' => 'application/vnd.amiga.ami',
+        'apk' => 'application/vnd.android.package-archive',
+        'application' => 'application/x-ms-application',
+        'apr' => 'application/vnd.lotus-approach',
+        'asa' => 'text/plain',
+        'asax' => 'application/octet-stream',
+        'asc' => 'application/pgp-signature',
+        'ascx' => 'text/plain',
+        'asf' => 'video/x-ms-asf',
+        'ashx' => 'text/plain',
+        'asm' => 'text/x-asm',
+        'asmx' => 'text/plain',
+        'aso' => 'application/vnd.accpac.simply.aso',
+        'asp' => 'text/plain',
+        'aspx' => 'text/plain',
+        'asx' => 'video/x-ms-asf',
+        'atc' => 'application/vnd.acucorp',
+        'atom' => 'application/atom+xml',
+        'atomcat' => 'application/atomcat+xml',
+        'atomsvc' => 'application/atomsvc+xml',
+        'atx' => 'application/vnd.antix.game-component',
+        'au' => 'audio/basic',
+        'avi' => 'video/x-msvideo',
+        'aw' => 'application/applixware',
+        'axd' => 'text/plain',
+        'azf' => 'application/vnd.airzip.filesecure.azf',
+        'azs' => 'application/vnd.airzip.filesecure.azs',
+        'azw' => 'application/vnd.amazon.ebook',
+        'bat' => 'application/x-msdownload',
+        'bcpio' => 'application/x-bcpio',
+        'bdf' => 'application/x-font-bdf',
+        'bdm' => 'application/vnd.syncml.dm+wbxml',
+        'bed' => 'application/vnd.realvnc.bed',
+        'bh2' => 'application/vnd.fujitsu.oasysprs',
+        'bin' => 'application/octet-stream',
+        'bmi' => 'application/vnd.bmi',
+        'bmp' => 'image/bmp',
+        'book' => 'application/vnd.framemaker',
+        'box' => 'application/vnd.previewsystems.box',
+        'boz' => 'application/x-bzip2',
+        'bpk' => 'application/octet-stream',
+        'btif' => 'image/prs.btif',
+        'bz' => 'application/x-bzip',
+        'bz2' => 'application/x-bzip2',
+        'c' => 'text/x-c',
+        'c11amc' => 'application/vnd.cluetrust.cartomobile-config',
+        'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg',
+        'c4d' => 'application/vnd.clonk.c4group',
+        'c4f' => 'application/vnd.clonk.c4group',
+        'c4g' => 'application/vnd.clonk.c4group',
+        'c4p' => 'application/vnd.clonk.c4group',
+        'c4u' => 'application/vnd.clonk.c4group',
+        'cab' => 'application/vnd.ms-cab-compressed',
+        'car' => 'application/vnd.curl.car',
+        'cat' => 'application/vnd.ms-pki.seccat',
+        'cc' => 'text/x-c',
+        'cct' => 'application/x-director',
+        'ccxml' => 'application/ccxml+xml',
+        'cdbcmsg' => 'application/vnd.contact.cmsg',
+        'cdf' => 'application/x-netcdf',
+        'cdkey' => 'application/vnd.mediastation.cdkey',
+        'cdmia' => 'application/cdmi-capability',
+        'cdmic' => 'application/cdmi-container',
+        'cdmid' => 'application/cdmi-domain',
+        'cdmio' => 'application/cdmi-object',
+        'cdmiq' => 'application/cdmi-queue',
+        'cdx' => 'chemical/x-cdx',
+        'cdxml' => 'application/vnd.chemdraw+xml',
+        'cdy' => 'application/vnd.cinderella',
+        'cer' => 'application/pkix-cert',
+        'cfc' => 'application/x-coldfusion',
+        'cfm' => 'application/x-coldfusion',
+        'cgm' => 'image/cgm',
+        'chat' => 'application/x-chat',
+        'chm' => 'application/vnd.ms-htmlhelp',
+        'chrt' => 'application/vnd.kde.kchart',
+        'cif' => 'chemical/x-cif',
+        'cii' => 'application/vnd.anser-web-certificate-issue-initiation',
+        'cil' => 'application/vnd.ms-artgalry',
+        'cla' => 'application/vnd.claymore',
+        'class' => 'application/java-vm',
+        'clkk' => 'application/vnd.crick.clicker.keyboard',
+        'clkp' => 'application/vnd.crick.clicker.palette',
+        'clkt' => 'application/vnd.crick.clicker.template',
+        'clkw' => 'application/vnd.crick.clicker.wordbank',
+        'clkx' => 'application/vnd.crick.clicker',
+        'clp' => 'application/x-msclip',
+        'cmc' => 'application/vnd.cosmocaller',
+        'cmdf' => 'chemical/x-cmdf',
+        'cml' => 'chemical/x-cml',
+        'cmp' => 'application/vnd.yellowriver-custom-menu',
+        'cmx' => 'image/x-cmx',
+        'cod' => 'application/vnd.rim.cod',
+        'com' => 'application/x-msdownload',
+        'conf' => 'text/plain',
+        'cpio' => 'application/x-cpio',
+        'cpp' => 'text/x-c',
+        'cpt' => 'application/mac-compactpro',
+        'crd' => 'application/x-mscardfile',
+        'crl' => 'application/pkix-crl',
+        'crt' => 'application/x-x509-ca-cert',
+        'cryptonote' => 'application/vnd.rig.cryptonote',
+        'cs' => 'text/plain',
+        'csh' => 'application/x-csh',
+        'csml' => 'chemical/x-csml',
+        'csp' => 'application/vnd.commonspace',
+        'css' => 'text/css',
+        'cst' => 'application/x-director',
+        'csv' => 'text/csv',
+        'cu' => 'application/cu-seeme',
+        'curl' => 'text/vnd.curl',
+        'cww' => 'application/prs.cww',
+        'cxt' => 'application/x-director',
+        'cxx' => 'text/x-c',
+        'dae' => 'model/vnd.collada+xml',
+        'daf' => 'application/vnd.mobius.daf',
+        'dataless' => 'application/vnd.fdsn.seed',
+        'davmount' => 'application/davmount+xml',
+        'dcr' => 'application/x-director',
+        'dcurl' => 'text/vnd.curl.dcurl',
+        'dd2' => 'application/vnd.oma.dd2+xml',
+        'ddd' => 'application/vnd.fujixerox.ddd',
+        'deb' => 'application/x-debian-package',
+        'def' => 'text/plain',
+        'deploy' => 'application/octet-stream',
+        'der' => 'application/x-x509-ca-cert',
+        'dfac' => 'application/vnd.dreamfactory',
+        'dic' => 'text/x-c',
+        'dir' => 'application/x-director',
+        'dis' => 'application/vnd.mobius.dis',
+        'dist' => 'application/octet-stream',
+        'distz' => 'application/octet-stream',
+        'djv' => 'image/vnd.djvu',
+        'djvu' => 'image/vnd.djvu',
+        'dll' => 'application/x-msdownload',
+        'dmg' => 'application/octet-stream',
+        'dms' => 'application/octet-stream',
+        'dna' => 'application/vnd.dna',
+        'doc' => 'application/msword',
+        'docm' => 'application/vnd.ms-word.document.macroenabled.12',
+        'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+        'dot' => 'application/msword',
+        'dotm' => 'application/vnd.ms-word.template.macroenabled.12',
+        'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
+        'dp' => 'application/vnd.osgi.dp',
+        'dpg' => 'application/vnd.dpgraph',
+        'dra' => 'audio/vnd.dra',
+        'dsc' => 'text/prs.lines.tag',
+        'dssc' => 'application/dssc+der',
+        'dtb' => 'application/x-dtbook+xml',
+        'dtd' => 'application/xml-dtd',
+        'dts' => 'audio/vnd.dts',
+        'dtshd' => 'audio/vnd.dts.hd',
+        'dump' => 'application/octet-stream',
+        'dvi' => 'application/x-dvi',
+        'dwf' => 'model/vnd.dwf',
+        'dwg' => 'image/vnd.dwg',
+        'dxf' => 'image/vnd.dxf',
+        'dxp' => 'application/vnd.spotfire.dxp',
+        'dxr' => 'application/x-director',
+        'ecelp4800' => 'audio/vnd.nuera.ecelp4800',
+        'ecelp7470' => 'audio/vnd.nuera.ecelp7470',
+        'ecelp9600' => 'audio/vnd.nuera.ecelp9600',
+        'ecma' => 'application/ecmascript',
+        'edm' => 'application/vnd.novadigm.edm',
+        'edx' => 'application/vnd.novadigm.edx',
+        'efif' => 'application/vnd.picsel',
+        'ei6' => 'application/vnd.pg.osasli',
+        'elc' => 'application/octet-stream',
+        'eml' => 'message/rfc822',
+        'emma' => 'application/emma+xml',
+        'eol' => 'audio/vnd.digital-winds',
+        'eot' => 'application/vnd.ms-fontobject',
+        'eps' => 'application/postscript',
+        'epub' => 'application/epub+zip',
+        'es3' => 'application/vnd.eszigno3+xml',
+        'esf' => 'application/vnd.epson.esf',
+        'et3' => 'application/vnd.eszigno3+xml',
+        'etx' => 'text/x-setext',
+        'exe' => 'application/x-msdownload',
+        'exi' => 'application/exi',
+        'ext' => 'application/vnd.novadigm.ext',
+        'ez' => 'application/andrew-inset',
+        'ez2' => 'application/vnd.ezpix-album',
+        'ez3' => 'application/vnd.ezpix-package',
+        'f' => 'text/x-fortran',
+        'f4v' => 'video/x-f4v',
+        'f77' => 'text/x-fortran',
+        'f90' => 'text/x-fortran',
+        'fbs' => 'image/vnd.fastbidsheet',
+        'fcs' => 'application/vnd.isac.fcs',
+        'fdf' => 'application/vnd.fdf',
+        'fe_launch' => 'application/vnd.denovo.fcselayout-link',
+        'fg5' => 'application/vnd.fujitsu.oasysgp',
+        'fgd' => 'application/x-director',
+        'fh' => 'image/x-freehand',
+        'fh4' => 'image/x-freehand',
+        'fh5' => 'image/x-freehand',
+        'fh7' => 'image/x-freehand',
+        'fhc' => 'image/x-freehand',
+        'fig' => 'application/x-xfig',
+        'fli' => 'video/x-fli',
+        'flo' => 'application/vnd.micrografx.flo',
+        'flv' => 'video/x-flv',
+        'flw' => 'application/vnd.kde.kivio',
+        'flx' => 'text/vnd.fmi.flexstor',
+        'fly' => 'text/vnd.fly',
+        'fm' => 'application/vnd.framemaker',
+        'fnc' => 'application/vnd.frogans.fnc',
+        'for' => 'text/x-fortran',
+        'fpx' => 'image/vnd.fpx',
+        'frame' => 'application/vnd.framemaker',
+        'fsc' => 'application/vnd.fsc.weblaunch',
+        'fst' => 'image/vnd.fst',
+        'ftc' => 'application/vnd.fluxtime.clip',
+        'fti' => 'application/vnd.anser-web-funds-transfer-initiation',
+        'fvt' => 'video/vnd.fvt',
+        'fxp' => 'application/vnd.adobe.fxp',
+        'fxpl' => 'application/vnd.adobe.fxp',
+        'fzs' => 'application/vnd.fuzzysheet',
+        'g2w' => 'application/vnd.geoplan',
+        'g3' => 'image/g3fax',
+        'g3w' => 'application/vnd.geospace',
+        'gac' => 'application/vnd.groove-account',
+        'gdl' => 'model/vnd.gdl',
+        'geo' => 'application/vnd.dynageo',
+        'gex' => 'application/vnd.geometry-explorer',
+        'ggb' => 'application/vnd.geogebra.file',
+        'ggt' => 'application/vnd.geogebra.tool',
+        'ghf' => 'application/vnd.groove-help',
+        'gif' => 'image/gif',
+        'gim' => 'application/vnd.groove-identity-message',
+        'gmx' => 'application/vnd.gmx',
+        'gnumeric' => 'application/x-gnumeric',
+        'gph' => 'application/vnd.flographit',
+        'gqf' => 'application/vnd.grafeq',
+        'gqs' => 'application/vnd.grafeq',
+        'gram' => 'application/srgs',
+        'gre' => 'application/vnd.geometry-explorer',
+        'grv' => 'application/vnd.groove-injector',
+        'grxml' => 'application/srgs+xml',
+        'gsf' => 'application/x-font-ghostscript',
+        'gtar' => 'application/x-gtar',
+        'gtm' => 'application/vnd.groove-tool-message',
+        'gtw' => 'model/vnd.gtw',
+        'gv' => 'text/vnd.graphviz',
+        'gxt' => 'application/vnd.geonext',
+        'h' => 'text/x-c',
+        'h261' => 'video/h261',
+        'h263' => 'video/h263',
+        'h264' => 'video/h264',
+        'hal' => 'application/vnd.hal+xml',
+        'hbci' => 'application/vnd.hbci',
+        'hdf' => 'application/x-hdf',
+        'hh' => 'text/x-c',
+        'hlp' => 'application/winhlp',
+        'hpgl' => 'application/vnd.hp-hpgl',
+        'hpid' => 'application/vnd.hp-hpid',
+        'hps' => 'application/vnd.hp-hps',
+        'hqx' => 'application/mac-binhex40',
+        'hta' => 'application/octet-stream',
+        'htc' => 'text/html',
+        'htke' => 'application/vnd.kenameaapp',
+        'htm' => 'text/html',
+        'html' => 'text/html',
+        'hvd' => 'application/vnd.yamaha.hv-dic',
+        'hvp' => 'application/vnd.yamaha.hv-voice',
+        'hvs' => 'application/vnd.yamaha.hv-script',
+        'i2g' => 'application/vnd.intergeo',
+        'icc' => 'application/vnd.iccprofile',
+        'ice' => 'x-conference/x-cooltalk',
+        'icm' => 'application/vnd.iccprofile',
+        'ico' => 'image/x-icon',
+        'ics' => 'text/calendar',
+        'ief' => 'image/ief',
+        'ifb' => 'text/calendar',
+        'ifm' => 'application/vnd.shana.informed.formdata',
+        'iges' => 'model/iges',
+        'igl' => 'application/vnd.igloader',
+        'igm' => 'application/vnd.insors.igm',
+        'igs' => 'model/iges',
+        'igx' => 'application/vnd.micrografx.igx',
+        'iif' => 'application/vnd.shana.informed.interchange',
+        'imp' => 'application/vnd.accpac.simply.imp',
+        'ims' => 'application/vnd.ms-ims',
+        'in' => 'text/plain',
+        'ini' => 'text/plain',
+        'ipfix' => 'application/ipfix',
+        'ipk' => 'application/vnd.shana.informed.package',
+        'irm' => 'application/vnd.ibm.rights-management',
+        'irp' => 'application/vnd.irepository.package+xml',
+        'iso' => 'application/octet-stream',
+        'itp' => 'application/vnd.shana.informed.formtemplate',
+        'ivp' => 'application/vnd.immervision-ivp',
+        'ivu' => 'application/vnd.immervision-ivu',
+        'jad' => 'text/vnd.sun.j2me.app-descriptor',
+        'jam' => 'application/vnd.jam',
+        'jar' => 'application/java-archive',
+        'java' => 'text/x-java-source',
+        'jisp' => 'application/vnd.jisp',
+        'jlt' => 'application/vnd.hp-jlyt',
+        'jnlp' => 'application/x-java-jnlp-file',
+        'joda' => 'application/vnd.joost.joda-archive',
+        'jpe' => 'image/jpeg',
+        'jpeg' => 'image/jpeg',
+        'jpg' => 'image/jpeg',
+        'jpgm' => 'video/jpm',
+        'jpgv' => 'video/jpeg',
+        'jpm' => 'video/jpm',
+        'js' => 'text/javascript',
+        'json' => 'application/json',
+        'kar' => 'audio/midi',
+        'karbon' => 'application/vnd.kde.karbon',
+        'kfo' => 'application/vnd.kde.kformula',
+        'kia' => 'application/vnd.kidspiration',
+        'kml' => 'application/vnd.google-earth.kml+xml',
+        'kmz' => 'application/vnd.google-earth.kmz',
+        'kne' => 'application/vnd.kinar',
+        'knp' => 'application/vnd.kinar',
+        'kon' => 'application/vnd.kde.kontour',
+        'kpr' => 'application/vnd.kde.kpresenter',
+        'kpt' => 'application/vnd.kde.kpresenter',
+        'ksp' => 'application/vnd.kde.kspread',
+        'ktr' => 'application/vnd.kahootz',
+        'ktx' => 'image/ktx',
+        'ktz' => 'application/vnd.kahootz',
+        'kwd' => 'application/vnd.kde.kword',
+        'kwt' => 'application/vnd.kde.kword',
+        'lasxml' => 'application/vnd.las.las+xml',
+        'latex' => 'application/x-latex',
+        'lbd' => 'application/vnd.llamagraphics.life-balance.desktop',
+        'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml',
+        'les' => 'application/vnd.hhe.lesson-player',
+        'lha' => 'application/octet-stream',
+        'link66' => 'application/vnd.route66.link66+xml',
+        'list' => 'text/plain',
+        'list3820' => 'application/vnd.ibm.modcap',
+        'listafp' => 'application/vnd.ibm.modcap',
+        'log' => 'text/plain',
+        'lostxml' => 'application/lost+xml',
+        'lrf' => 'application/octet-stream',
+        'lrm' => 'application/vnd.ms-lrm',
+        'ltf' => 'application/vnd.frogans.ltf',
+        'lvp' => 'audio/vnd.lucent.voice',
+        'lwp' => 'application/vnd.lotus-wordpro',
+        'lzh' => 'application/octet-stream',
+        'm13' => 'application/x-msmediaview',
+        'm14' => 'application/x-msmediaview',
+        'm1v' => 'video/mpeg',
+        'm21' => 'application/mp21',
+        'm2a' => 'audio/mpeg',
+        'm2v' => 'video/mpeg',
+        'm3a' => 'audio/mpeg',
+        'm3u' => 'audio/x-mpegurl',
+        'm3u8' => 'application/vnd.apple.mpegurl',
+        'm4a' => 'audio/mp4',
+        'm4u' => 'video/vnd.mpegurl',
+        'm4v' => 'video/mp4',
+        'ma' => 'application/mathematica',
+        'mads' => 'application/mads+xml',
+        'mag' => 'application/vnd.ecowin.chart',
+        'maker' => 'application/vnd.framemaker',
+        'man' => 'text/troff',
+        'mathml' => 'application/mathml+xml',
+        'mb' => 'application/mathematica',
+        'mbk' => 'application/vnd.mobius.mbk',
+        'mbox' => 'application/mbox',
+        'mc1' => 'application/vnd.medcalcdata',
+        'mcd' => 'application/vnd.mcd',
+        'mcurl' => 'text/vnd.curl.mcurl',
+        'mdb' => 'application/x-msaccess',
+        'mdi' => 'image/vnd.ms-modi',
+        'me' => 'text/troff',
+        'mesh' => 'model/mesh',
+        'meta4' => 'application/metalink4+xml',
+        'mets' => 'application/mets+xml',
+        'mfm' => 'application/vnd.mfmp',
+        'mgp' => 'application/vnd.osgeo.mapguide.package',
+        'mgz' => 'application/vnd.proteus.magazine',
+        'mid' => 'audio/midi',
+        'midi' => 'audio/midi',
+        'mif' => 'application/vnd.mif',
+        'mime' => 'message/rfc822',
+        'mj2' => 'video/mj2',
+        'mjp2' => 'video/mj2',
+        'mlp' => 'application/vnd.dolby.mlp',
+        'mmd' => 'application/vnd.chipnuts.karaoke-mmd',
+        'mmf' => 'application/vnd.smaf',
+        'mmr' => 'image/vnd.fujixerox.edmics-mmr',
+        'mny' => 'application/x-msmoney',
+        'mobi' => 'application/x-mobipocket-ebook',
+        'mods' => 'application/mods+xml',
+        'mov' => 'video/quicktime',
+        'movie' => 'video/x-sgi-movie',
+        'mp2' => 'audio/mpeg',
+        'mp21' => 'application/mp21',
+        'mp2a' => 'audio/mpeg',
+        'mp3' => 'audio/mpeg',
+        'mp4' => 'video/mp4',
+        'mp4a' => 'audio/mp4',
+        'mp4s' => 'application/mp4',
+        'mp4v' => 'video/mp4',
+        'mpc' => 'application/vnd.mophun.certificate',
+        'mpe' => 'video/mpeg',
+        'mpeg' => 'video/mpeg',
+        'mpg' => 'video/mpeg',
+        'mpg4' => 'video/mp4',
+        'mpga' => 'audio/mpeg',
+        'mpkg' => 'application/vnd.apple.installer+xml',
+        'mpm' => 'application/vnd.blueice.multipass',
+        'mpn' => 'application/vnd.mophun.application',
+        'mpp' => 'application/vnd.ms-project',
+        'mpt' => 'application/vnd.ms-project',
+        'mpy' => 'application/vnd.ibm.minipay',
+        'mqy' => 'application/vnd.mobius.mqy',
+        'mrc' => 'application/marc',
+        'mrcx' => 'application/marcxml+xml',
+        'ms' => 'text/troff',
+        'mscml' => 'application/mediaservercontrol+xml',
+        'mseed' => 'application/vnd.fdsn.mseed',
+        'mseq' => 'application/vnd.mseq',
+        'msf' => 'application/vnd.epson.msf',
+        'msh' => 'model/mesh',
+        'msi' => 'application/x-msdownload',
+        'msl' => 'application/vnd.mobius.msl',
+        'msty' => 'application/vnd.muvee.style',
+        'mts' => 'model/vnd.mts',
+        'mus' => 'application/vnd.musician',
+        'musicxml' => 'application/vnd.recordare.musicxml+xml',
+        'mvb' => 'application/x-msmediaview',
+        'mwf' => 'application/vnd.mfer',
+        'mxf' => 'application/mxf',
+        'mxl' => 'application/vnd.recordare.musicxml',
+        'mxml' => 'application/xv+xml',
+        'mxs' => 'application/vnd.triscape.mxs',
+        'mxu' => 'video/vnd.mpegurl',
+        'n-gage' => 'application/vnd.nokia.n-gage.symbian.install',
+        'n3' => 'text/n3',
+        'nb' => 'application/mathematica',
+        'nbp' => 'application/vnd.wolfram.player',
+        'nc' => 'application/x-netcdf',
+        'ncx' => 'application/x-dtbncx+xml',
+        'ngdat' => 'application/vnd.nokia.n-gage.data',
+        'nlu' => 'application/vnd.neurolanguage.nlu',
+        'nml' => 'application/vnd.enliven',
+        'nnd' => 'application/vnd.noblenet-directory',
+        'nns' => 'application/vnd.noblenet-sealer',
+        'nnw' => 'application/vnd.noblenet-web',
+        'npx' => 'image/vnd.net-fpx',
+        'nsf' => 'application/vnd.lotus-notes',
+        'oa2' => 'application/vnd.fujitsu.oasys2',
+        'oa3' => 'application/vnd.fujitsu.oasys3',
+        'oas' => 'application/vnd.fujitsu.oasys',
+        'obd' => 'application/x-msbinder',
+        'oda' => 'application/oda',
+        'odb' => 'application/vnd.oasis.opendocument.database',
+        'odc' => 'application/vnd.oasis.opendocument.chart',
+        'odf' => 'application/vnd.oasis.opendocument.formula',
+        'odft' => 'application/vnd.oasis.opendocument.formula-template',
+        'odg' => 'application/vnd.oasis.opendocument.graphics',
+        'odi' => 'application/vnd.oasis.opendocument.image',
+        'odm' => 'application/vnd.oasis.opendocument.text-master',
+        'odp' => 'application/vnd.oasis.opendocument.presentation',
+        'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
+        'odt' => 'application/vnd.oasis.opendocument.text',
+        'oga' => 'audio/ogg',
+        'ogg' => 'audio/ogg',
+        'ogv' => 'video/ogg',
+        'ogx' => 'application/ogg',
+        'onepkg' => 'application/onenote',
+        'onetmp' => 'application/onenote',
+        'onetoc' => 'application/onenote',
+        'onetoc2' => 'application/onenote',
+        'opf' => 'application/oebps-package+xml',
+        'oprc' => 'application/vnd.palm',
+        'org' => 'application/vnd.lotus-organizer',
+        'osf' => 'application/vnd.yamaha.openscoreformat',
+        'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml',
+        'otc' => 'application/vnd.oasis.opendocument.chart-template',
+        'otf' => 'application/x-font-otf',
+        'otg' => 'application/vnd.oasis.opendocument.graphics-template',
+        'oth' => 'application/vnd.oasis.opendocument.text-web',
+        'oti' => 'application/vnd.oasis.opendocument.image-template',
+        'otp' => 'application/vnd.oasis.opendocument.presentation-template',
+        'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
+        'ott' => 'application/vnd.oasis.opendocument.text-template',
+        'oxt' => 'application/vnd.openofficeorg.extension',
+        'p' => 'text/x-pascal',
+        'p10' => 'application/pkcs10',
+        'p12' => 'application/x-pkcs12',
+        'p7b' => 'application/x-pkcs7-certificates',
+        'p7c' => 'application/pkcs7-mime',
+        'p7m' => 'application/pkcs7-mime',
+        'p7r' => 'application/x-pkcs7-certreqresp',
+        'p7s' => 'application/pkcs7-signature',
+        'p8' => 'application/pkcs8',
+        'pas' => 'text/x-pascal',
+        'paw' => 'application/vnd.pawaafile',
+        'pbd' => 'application/vnd.powerbuilder6',
+        'pbm' => 'image/x-portable-bitmap',
+        'pcf' => 'application/x-font-pcf',
+        'pcl' => 'application/vnd.hp-pcl',
+        'pclxl' => 'application/vnd.hp-pclxl',
+        'pct' => 'image/x-pict',
+        'pcurl' => 'application/vnd.curl.pcurl',
+        'pcx' => 'image/x-pcx',
+        'pdb' => 'application/vnd.palm',
+        'pdf' => 'application/pdf',
+        'pfa' => 'application/x-font-type1',
+        'pfb' => 'application/x-font-type1',
+        'pfm' => 'application/x-font-type1',
+        'pfr' => 'application/font-tdpfr',
+        'pfx' => 'application/x-pkcs12',
+        'pgm' => 'image/x-portable-graymap',
+        'pgn' => 'application/x-chess-pgn',
+        'pgp' => 'application/pgp-encrypted',
+        'php' => 'text/x-php',
+        'phps' => 'application/x-httpd-phps',
+        'pic' => 'image/x-pict',
+        'pkg' => 'application/octet-stream',
+        'pki' => 'application/pkixcmp',
+        'pkipath' => 'application/pkix-pkipath',
+        'plb' => 'application/vnd.3gpp.pic-bw-large',
+        'plc' => 'application/vnd.mobius.plc',
+        'plf' => 'application/vnd.pocketlearn',
+        'pls' => 'application/pls+xml',
+        'pml' => 'application/vnd.ctc-posml',
+        'png' => 'image/png',
+        'pnm' => 'image/x-portable-anymap',
+        'portpkg' => 'application/vnd.macports.portpkg',
+        'pot' => 'application/vnd.ms-powerpoint',
+        'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12',
+        'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
+        'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12',
+        'ppd' => 'application/vnd.cups-ppd',
+        'ppm' => 'image/x-portable-pixmap',
+        'pps' => 'application/vnd.ms-powerpoint',
+        'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12',
+        'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
+        'ppt' => 'application/vnd.ms-powerpoint',
+        'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12',
+        'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+        'pqa' => 'application/vnd.palm',
+        'prc' => 'application/x-mobipocket-ebook',
+        'pre' => 'application/vnd.lotus-freelance',
+        'prf' => 'application/pics-rules',
+        'ps' => 'application/postscript',
+        'psb' => 'application/vnd.3gpp.pic-bw-small',
+        'psd' => 'image/vnd.adobe.photoshop',
+        'psf' => 'application/x-font-linux-psf',
+        'pskcxml' => 'application/pskc+xml',
+        'ptid' => 'application/vnd.pvi.ptid1',
+        'pub' => 'application/x-mspublisher',
+        'pvb' => 'application/vnd.3gpp.pic-bw-var',
+        'pwn' => 'application/vnd.3m.post-it-notes',
+        'pya' => 'audio/vnd.ms-playready.media.pya',
+        'pyv' => 'video/vnd.ms-playready.media.pyv',
+        'qam' => 'application/vnd.epson.quickanime',
+        'qbo' => 'application/vnd.intu.qbo',
+        'qfx' => 'application/vnd.intu.qfx',
+        'qps' => 'application/vnd.publishare-delta-tree',
+        'qt' => 'video/quicktime',
+        'qwd' => 'application/vnd.quark.quarkxpress',
+        'qwt' => 'application/vnd.quark.quarkxpress',
+        'qxb' => 'application/vnd.quark.quarkxpress',
+        'qxd' => 'application/vnd.quark.quarkxpress',
+        'qxl' => 'application/vnd.quark.quarkxpress',
+        'qxt' => 'application/vnd.quark.quarkxpress',
+        'ra' => 'audio/x-pn-realaudio',
+        'ram' => 'audio/x-pn-realaudio',
+        'rar' => 'application/x-rar-compressed',
+        'ras' => 'image/x-cmu-raster',
+        'rb' => 'text/plain',
+        'rcprofile' => 'application/vnd.ipunplugged.rcprofile',
+        'rdf' => 'application/rdf+xml',
+        'rdz' => 'application/vnd.data-vision.rdz',
+        'rep' => 'application/vnd.businessobjects',
+        'res' => 'application/x-dtbresource+xml',
+        'resx' => 'text/xml',
+        'rgb' => 'image/x-rgb',
+        'rif' => 'application/reginfo+xml',
+        'rip' => 'audio/vnd.rip',
+        'rl' => 'application/resource-lists+xml',
+        'rlc' => 'image/vnd.fujixerox.edmics-rlc',
+        'rld' => 'application/resource-lists-diff+xml',
+        'rm' => 'application/vnd.rn-realmedia',
+        'rmi' => 'audio/midi',
+        'rmp' => 'audio/x-pn-realaudio-plugin',
+        'rms' => 'application/vnd.jcp.javame.midlet-rms',
+        'rnc' => 'application/relax-ng-compact-syntax',
+        'roff' => 'text/troff',
+        'rp9' => 'application/vnd.cloanto.rp9',
+        'rpss' => 'application/vnd.nokia.radio-presets',
+        'rpst' => 'application/vnd.nokia.radio-preset',
+        'rq' => 'application/sparql-query',
+        'rs' => 'application/rls-services+xml',
+        'rsd' => 'application/rsd+xml',
+        'rss' => 'application/rss+xml',
+        'rtf' => 'application/rtf',
+        'rtx' => 'text/richtext',
+        's' => 'text/x-asm',
+        'saf' => 'application/vnd.yamaha.smaf-audio',
+        'sbml' => 'application/sbml+xml',
+        'sc' => 'application/vnd.ibm.secure-container',
+        'scd' => 'application/x-msschedule',
+        'scm' => 'application/vnd.lotus-screencam',
+        'scq' => 'application/scvp-cv-request',
+        'scs' => 'application/scvp-cv-response',
+        'scurl' => 'text/vnd.curl.scurl',
+        'sda' => 'application/vnd.stardivision.draw',
+        'sdc' => 'application/vnd.stardivision.calc',
+        'sdd' => 'application/vnd.stardivision.impress',
+        'sdkd' => 'application/vnd.solent.sdkm+xml',
+        'sdkm' => 'application/vnd.solent.sdkm+xml',
+        'sdp' => 'application/sdp',
+        'sdw' => 'application/vnd.stardivision.writer',
+        'see' => 'application/vnd.seemail',
+        'seed' => 'application/vnd.fdsn.seed',
+        'sema' => 'application/vnd.sema',
+        'semd' => 'application/vnd.semd',
+        'semf' => 'application/vnd.semf',
+        'ser' => 'application/java-serialized-object',
+        'setpay' => 'application/set-payment-initiation',
+        'setreg' => 'application/set-registration-initiation',
+        'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data',
+        'sfs' => 'application/vnd.spotfire.sfs',
+        'sgl' => 'application/vnd.stardivision.writer-global',
+        'sgm' => 'text/sgml',
+        'sgml' => 'text/sgml',
+        'sh' => 'application/x-sh',
+        'shar' => 'application/x-shar',
+        'shf' => 'application/shf+xml',
+        'sig' => 'application/pgp-signature',
+        'silo' => 'model/mesh',
+        'sis' => 'application/vnd.symbian.install',
+        'sisx' => 'application/vnd.symbian.install',
+        'sit' => 'application/x-stuffit',
+        'sitx' => 'application/x-stuffitx',
+        'skd' => 'application/vnd.koan',
+        'skm' => 'application/vnd.koan',
+        'skp' => 'application/vnd.koan',
+        'skt' => 'application/vnd.koan',
+        'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12',
+        'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
+        'slt' => 'application/vnd.epson.salt',
+        'sm' => 'application/vnd.stepmania.stepchart',
+        'smf' => 'application/vnd.stardivision.math',
+        'smi' => 'application/smil+xml',
+        'smil' => 'application/smil+xml',
+        'snd' => 'audio/basic',
+        'snf' => 'application/x-font-snf',
+        'so' => 'application/octet-stream',
+        'spc' => 'application/x-pkcs7-certificates',
+        'spf' => 'application/vnd.yamaha.smaf-phrase',
+        'spl' => 'application/x-futuresplash',
+        'spot' => 'text/vnd.in3d.spot',
+        'spp' => 'application/scvp-vp-response',
+        'spq' => 'application/scvp-vp-request',
+        'spx' => 'audio/ogg',
+        'src' => 'application/x-wais-source',
+        'sru' => 'application/sru+xml',
+        'srx' => 'application/sparql-results+xml',
+        'sse' => 'application/vnd.kodak-descriptor',
+        'ssf' => 'application/vnd.epson.ssf',
+        'ssml' => 'application/ssml+xml',
+        'st' => 'application/vnd.sailingtracker.track',
+        'stc' => 'application/vnd.sun.xml.calc.template',
+        'std' => 'application/vnd.sun.xml.draw.template',
+        'stf' => 'application/vnd.wt.stf',
+        'sti' => 'application/vnd.sun.xml.impress.template',
+        'stk' => 'application/hyperstudio',
+        'stl' => 'application/vnd.ms-pki.stl',
+        'str' => 'application/vnd.pg.format',
+        'stw' => 'application/vnd.sun.xml.writer.template',
+        'sub' => 'image/vnd.dvb.subtitle',
+        'sus' => 'application/vnd.sus-calendar',
+        'susp' => 'application/vnd.sus-calendar',
+        'sv4cpio' => 'application/x-sv4cpio',
+        'sv4crc' => 'application/x-sv4crc',
+        'svc' => 'application/vnd.dvb.service',
+        'svd' => 'application/vnd.svd',
+        'svg' => 'image/svg+xml',
+        'svgz' => 'image/svg+xml',
+        'swa' => 'application/x-director',
+        'swf' => 'application/x-shockwave-flash',
+        'swi' => 'application/vnd.aristanetworks.swi',
+        'sxc' => 'application/vnd.sun.xml.calc',
+        'sxd' => 'application/vnd.sun.xml.draw',
+        'sxg' => 'application/vnd.sun.xml.writer.global',
+        'sxi' => 'application/vnd.sun.xml.impress',
+        'sxm' => 'application/vnd.sun.xml.math',
+        'sxw' => 'application/vnd.sun.xml.writer',
+        't' => 'text/troff',
+        'tao' => 'application/vnd.tao.intent-module-archive',
+        'tar' => 'application/x-tar',
+        'tcap' => 'application/vnd.3gpp2.tcap',
+        'tcl' => 'application/x-tcl',
+        'teacher' => 'application/vnd.smart.teacher',
+        'tei' => 'application/tei+xml',
+        'teicorpus' => 'application/tei+xml',
+        'tex' => 'application/x-tex',
+        'texi' => 'application/x-texinfo',
+        'texinfo' => 'application/x-texinfo',
+        'text' => 'text/plain',
+        'tfi' => 'application/thraud+xml',
+        'tfm' => 'application/x-tex-tfm',
+        'thmx' => 'application/vnd.ms-officetheme',
+        'tif' => 'image/tiff',
+        'tiff' => 'image/tiff',
+        'tmo' => 'application/vnd.tmobile-livetv',
+        'torrent' => 'application/x-bittorrent',
+        'tpl' => 'application/vnd.groove-tool-template',
+        'tpt' => 'application/vnd.trid.tpt',
+        'tr' => 'text/troff',
+        'tra' => 'application/vnd.trueapp',
+        'trm' => 'application/x-msterminal',
+        'tsd' => 'application/timestamped-data',
+        'tsv' => 'text/tab-separated-values',
+        'ttc' => 'application/x-font-ttf',
+        'ttf' => 'application/x-font-ttf',
+        'ttl' => 'text/turtle',
+        'twd' => 'application/vnd.simtech-mindmapper',
+        'twds' => 'application/vnd.simtech-mindmapper',
+        'txd' => 'application/vnd.genomatix.tuxedo',
+        'txf' => 'application/vnd.mobius.txf',
+        'txt' => 'text/plain',
+        'u32' => 'application/x-authorware-bin',
+        'udeb' => 'application/x-debian-package',
+        'ufd' => 'application/vnd.ufdl',
+        'ufdl' => 'application/vnd.ufdl',
+        'umj' => 'application/vnd.umajin',
+        'unityweb' => 'application/vnd.unity',
+        'uoml' => 'application/vnd.uoml+xml',
+        'uri' => 'text/uri-list',
+        'uris' => 'text/uri-list',
+        'urls' => 'text/uri-list',
+        'ustar' => 'application/x-ustar',
+        'utz' => 'application/vnd.uiq.theme',
+        'uu' => 'text/x-uuencode',
+        'uva' => 'audio/vnd.dece.audio',
+        'uvd' => 'application/vnd.dece.data',
+        'uvf' => 'application/vnd.dece.data',
+        'uvg' => 'image/vnd.dece.graphic',
+        'uvh' => 'video/vnd.dece.hd',
+        'uvi' => 'image/vnd.dece.graphic',
+        'uvm' => 'video/vnd.dece.mobile',
+        'uvp' => 'video/vnd.dece.pd',
+        'uvs' => 'video/vnd.dece.sd',
+        'uvt' => 'application/vnd.dece.ttml+xml',
+        'uvu' => 'video/vnd.uvvu.mp4',
+        'uvv' => 'video/vnd.dece.video',
+        'uvva' => 'audio/vnd.dece.audio',
+        'uvvd' => 'application/vnd.dece.data',
+        'uvvf' => 'application/vnd.dece.data',
+        'uvvg' => 'image/vnd.dece.graphic',
+        'uvvh' => 'video/vnd.dece.hd',
+        'uvvi' => 'image/vnd.dece.graphic',
+        'uvvm' => 'video/vnd.dece.mobile',
+        'uvvp' => 'video/vnd.dece.pd',
+        'uvvs' => 'video/vnd.dece.sd',
+        'uvvt' => 'application/vnd.dece.ttml+xml',
+        'uvvu' => 'video/vnd.uvvu.mp4',
+        'uvvv' => 'video/vnd.dece.video',
+        'uvvx' => 'application/vnd.dece.unspecified',
+        'uvx' => 'application/vnd.dece.unspecified',
+        'vcd' => 'application/x-cdlink',
+        'vcf' => 'text/x-vcard',
+        'vcg' => 'application/vnd.groove-vcard',
+        'vcs' => 'text/x-vcalendar',
+        'vcx' => 'application/vnd.vcx',
+        'vis' => 'application/vnd.visionary',
+        'viv' => 'video/vnd.vivo',
+        'vor' => 'application/vnd.stardivision.writer',
+        'vox' => 'application/x-authorware-bin',
+        'vrml' => 'model/vrml',
+        'vsd' => 'application/vnd.visio',
+        'vsf' => 'application/vnd.vsf',
+        'vss' => 'application/vnd.visio',
+        'vst' => 'application/vnd.visio',
+        'vsw' => 'application/vnd.visio',
+        'vtu' => 'model/vnd.vtu',
+        'vxml' => 'application/voicexml+xml',
+        'w3d' => 'application/x-director',
+        'wad' => 'application/x-doom',
+        'wav' => 'audio/x-wav',
+        'wax' => 'audio/x-ms-wax',
+        'wbmp' => 'image/vnd.wap.wbmp',
+        'wbs' => 'application/vnd.criticaltools.wbs+xml',
+        'wbxml' => 'application/vnd.wap.wbxml',
+        'wcm' => 'application/vnd.ms-works',
+        'wdb' => 'application/vnd.ms-works',
+        'weba' => 'audio/webm',
+        'webm' => 'video/webm',
+        'webp' => 'image/webp',
+        'wg' => 'application/vnd.pmi.widget',
+        'wgt' => 'application/widget',
+        'wks' => 'application/vnd.ms-works',
+        'wm' => 'video/x-ms-wm',
+        'wma' => 'audio/x-ms-wma',
+        'wmd' => 'application/x-ms-wmd',
+        'wmf' => 'application/x-msmetafile',
+        'wml' => 'text/vnd.wap.wml',
+        'wmlc' => 'application/vnd.wap.wmlc',
+        'wmls' => 'text/vnd.wap.wmlscript',
+        'wmlsc' => 'application/vnd.wap.wmlscriptc',
+        'wmv' => 'video/x-ms-wmv',
+        'wmx' => 'video/x-ms-wmx',
+        'wmz' => 'application/x-ms-wmz',
+        'woff' => 'application/x-font-woff',
+        'wpd' => 'application/vnd.wordperfect',
+        'wpl' => 'application/vnd.ms-wpl',
+        'wps' => 'application/vnd.ms-works',
+        'wqd' => 'application/vnd.wqd',
+        'wri' => 'application/x-mswrite',
+        'wrl' => 'model/vrml',
+        'wsdl' => 'application/wsdl+xml',
+        'wspolicy' => 'application/wspolicy+xml',
+        'wtb' => 'application/vnd.webturbo',
+        'wvx' => 'video/x-ms-wvx',
+        'x32' => 'application/x-authorware-bin',
+        'x3d' => 'application/vnd.hzn-3d-crossword',
+        'xap' => 'application/x-silverlight-app',
+        'xar' => 'application/vnd.xara',
+        'xbap' => 'application/x-ms-xbap',
+        'xbd' => 'application/vnd.fujixerox.docuworks.binder',
+        'xbm' => 'image/x-xbitmap',
+        'xdf' => 'application/xcap-diff+xml',
+        'xdm' => 'application/vnd.syncml.dm+xml',
+        'xdp' => 'application/vnd.adobe.xdp+xml',
+        'xdssc' => 'application/dssc+xml',
+        'xdw' => 'application/vnd.fujixerox.docuworks',
+        'xenc' => 'application/xenc+xml',
+        'xer' => 'application/patch-ops-error+xml',
+        'xfdf' => 'application/vnd.adobe.xfdf',
+        'xfdl' => 'application/vnd.xfdl',
+        'xht' => 'application/xhtml+xml',
+        'xhtml' => 'application/xhtml+xml',
+        'xhvml' => 'application/xv+xml',
+        'xif' => 'image/vnd.xiff',
+        'xla' => 'application/vnd.ms-excel',
+        'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12',
+        'xlc' => 'application/vnd.ms-excel',
+        'xlm' => 'application/vnd.ms-excel',
+        'xls' => 'application/vnd.ms-excel',
+        'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12',
+        'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12',
+        'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+        'xlt' => 'application/vnd.ms-excel',
+        'xltm' => 'application/vnd.ms-excel.template.macroenabled.12',
+        'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
+        'xlw' => 'application/vnd.ms-excel',
+        'xml' => 'application/xml',
+        'xo' => 'application/vnd.olpc-sugar',
+        'xop' => 'application/xop+xml',
+        'xpi' => 'application/x-xpinstall',
+        'xpm' => 'image/x-xpixmap',
+        'xpr' => 'application/vnd.is-xpr',
+        'xps' => 'application/vnd.ms-xpsdocument',
+        'xpw' => 'application/vnd.intercon.formnet',
+        'xpx' => 'application/vnd.intercon.formnet',
+        'xsl' => 'application/xml',
+        'xslt' => 'application/xslt+xml',
+        'xsm' => 'application/vnd.syncml+xml',
+        'xspf' => 'application/xspf+xml',
+        'xul' => 'application/vnd.mozilla.xul+xml',
+        'xvm' => 'application/xv+xml',
+        'xvml' => 'application/xv+xml',
+        'xwd' => 'image/x-xwindowdump',
+        'xyz' => 'chemical/x-xyz',
+        'yaml' => 'text/yaml',
+        'yang' => 'application/yang',
+        'yin' => 'application/yin+xml',
+        'yml' => 'text/yaml',
+        'zaz' => 'application/vnd.zzazz.deck+xml',
+        'zip' => 'application/zip',
+        'zir' => 'application/vnd.zul',
+        'zirz' => 'application/vnd.zul',
+        'zmm' => 'application/vnd.handheld-entertainment+xml'
+    );
+
+    /**
+     * Get a singleton instance of the class
+     *
+     * @return self
+     * @codeCoverageIgnore
+     */
+    public static function getInstance()
+    {
+        if (!self::$instance) {
+            self::$instance = new self();
+        }
+
+        return self::$instance;
+    }
+
+    /**
+     * Get a mimetype value from a file extension
+     *
+     * @param string $extension File extension
+     *
+     * @return string|null
+     *
+     */
+    public function fromExtension($extension)
+    {
+        $extension = strtolower($extension);
+
+        return isset($this->mimetypes[$extension])
+            ? $this->mimetypes[$extension]
+            : null;
+    }
+
+    /**
+     * Get a mimetype from a filename
+     *
+     * @param string $filename Filename to generate a mimetype from
+     *
+     * @return string|null
+     */
+    public function fromFilename($filename)
+    {
+        return $this->fromExtension(pathinfo($filename, PATHINFO_EXTENSION));
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Pool.php
@@ -0,0 +1,333 @@
+<?php
+namespace GuzzleHttp;
+
+use GuzzleHttp\Event\BeforeEvent;
+use GuzzleHttp\Event\RequestEvents;
+use GuzzleHttp\Message\RequestInterface;
+use GuzzleHttp\Message\ResponseInterface;
+use GuzzleHttp\Ring\Core;
+use GuzzleHttp\Ring\Future\FutureInterface;
+use GuzzleHttp\Event\ListenerAttacherTrait;
+use GuzzleHttp\Event\EndEvent;
+use React\Promise\Deferred;
+use React\Promise\FulfilledPromise;
+use React\Promise\PromiseInterface;
+use React\Promise\RejectedPromise;
+
+/**
+ * Sends and iterator of requests concurrently using a capped pool size.
+ *
+ * The Pool object implements FutureInterface, meaning it can be used later
+ * when necessary, the requests provided to the pool can be cancelled, and
+ * you can check the state of the pool to know if it has been dereferenced
+ * (sent) or has been cancelled.
+ *
+ * When sending the pool, keep in mind that no results are returned: callers
+ * are expected to handle results asynchronously using Guzzle's event system.
+ * When requests complete, more are added to the pool to ensure that the
+ * requested pool size is always filled as much as possible.
+ *
+ * IMPORTANT: Do not provide a pool size greater that what the utilized
+ * underlying RingPHP handler can support. This will result is extremely poor
+ * performance.
+ */
+class Pool implements FutureInterface
+{
+    use ListenerAttacherTrait;
+
+    /** @var \GuzzleHttp\ClientInterface */
+    private $client;
+
+    /** @var \Iterator Yields requests */
+    private $iter;
+
+    /** @var Deferred */
+    private $deferred;
+
+    /** @var PromiseInterface */
+    private $promise;
+
+    private $waitQueue = [];
+    private $eventListeners = [];
+    private $poolSize;
+    private $isRealized = false;
+
+    /**
+     * The option values for 'before', 'complete', 'error' and 'end' can be a
+     * callable, an associative array containing event data, or an array of
+     * event data arrays. Event data arrays contain the following keys:
+     *
+     * - fn: callable to invoke that receives the event
+     * - priority: Optional event priority (defaults to 0)
+     * - once: Set to true so that the event is removed after it is triggered
+     *
+     * @param ClientInterface $client   Client used to send the requests.
+     * @param array|\Iterator $requests Requests to send in parallel
+     * @param array           $options  Associative array of options
+     *     - pool_size: (callable|int)   Maximum number of requests to send
+     *                                   concurrently, or a callback that receives
+     *                                   the current queue size and returns the
+     *                                   number of new requests to send
+     *     - before:    (callable|array) Receives a BeforeEvent
+     *     - complete:  (callable|array) Receives a CompleteEvent
+     *     - error:     (callable|array) Receives a ErrorEvent
+     *     - end:       (callable|array) Receives an EndEvent
+     */
+    public function __construct(
+        ClientInterface $client,
+        $requests,
+        array $options = []
+    ) {
+        $this->client = $client;
+        $this->iter = $this->coerceIterable($requests);
+        $this->deferred = new Deferred();
+        $this->promise = $this->deferred->promise();
+        $this->poolSize = isset($options['pool_size'])
+            ? $options['pool_size'] : 25;
+        $this->eventListeners = $this->prepareListeners(
+            $options,
+            ['before', 'complete', 'error', 'end']
+        );
+    }
+
+    /**
+     * Sends multiple requests in parallel and returns an array of responses
+     * and exceptions that uses the same ordering as the provided requests.
+     *
+     * IMPORTANT: This method keeps every request and response in memory, and
+     * as such, is NOT recommended when sending a large number or an
+     * indeterminate number of requests concurrently.
+     *
+     * @param ClientInterface $client   Client used to send the requests
+     * @param array|\Iterator $requests Requests to send in parallel
+     * @param array           $options  Passes through the options available in
+     *                                  {@see GuzzleHttp\Pool::__construct}
+     *
+     * @return BatchResults Returns a container for the results.
+     * @throws \InvalidArgumentException if the event format is incorrect.
+     */
+    public static function batch(
+        ClientInterface $client,
+        $requests,
+        array $options = []
+    ) {
+        $hash = new \SplObjectStorage();
+        foreach ($requests as $request) {
+            $hash->attach($request);
+        }
+
+        // In addition to the normally run events when requests complete, add
+        // and event to continuously track the results of transfers in the hash.
+        (new self($client, $requests, RequestEvents::convertEventArray(
+            $options,
+            ['end'],
+            [
+                'priority' => RequestEvents::LATE,
+                'fn'       => function (EndEvent $e) use ($hash) {
+                    $hash[$e->getRequest()] = $e->getException()
+                        ? $e->getException()
+                        : $e->getResponse();
+                }
+            ]
+        )))->wait();
+
+        return new BatchResults($hash);
+    }
+
+    /**
+     * Creates a Pool and immediately sends the requests.
+     *
+     * @param ClientInterface $client   Client used to send the requests
+     * @param array|\Iterator $requests Requests to send in parallel
+     * @param array           $options  Passes through the options available in
+     *                                  {@see GuzzleHttp\Pool::__construct}
+     */
+    public static function send(
+        ClientInterface $client,
+        $requests,
+        array $options = []
+    ) {
+        $pool = new self($client, $requests, $options);
+        $pool->wait();
+    }
+
+    private function getPoolSize()
+    {
+        return is_callable($this->poolSize)
+            ? call_user_func($this->poolSize, count($this->waitQueue))
+            : $this->poolSize;
+    }
+
+    /**
+     * Add as many requests as possible up to the current pool limit.
+     */
+    private function addNextRequests()
+    {
+        $limit = max($this->getPoolSize() - count($this->waitQueue), 0);
+        while ($limit--) {
+            if (!$this->addNextRequest()) {
+                break;
+            }
+        }
+    }
+
+    public function wait()
+    {
+        if ($this->isRealized) {
+            return false;
+        }
+
+        // Seed the pool with N number of requests.
+        $this->addNextRequests();
+
+        // Stop if the pool was cancelled while transferring requests.
+        if ($this->isRealized) {
+            return false;
+        }
+
+        // Wait on any outstanding FutureResponse objects.
+        while ($response = array_pop($this->waitQueue)) {
+            try {
+                $response->wait();
+            } catch (\Exception $e) {
+                // Eat exceptions because they should be handled asynchronously
+            }
+            $this->addNextRequests();
+        }
+
+        // Clean up no longer needed state.
+        $this->isRealized = true;
+        $this->waitQueue = $this->eventListeners = [];
+        $this->client = $this->iter = null;
+        $this->deferred->resolve(true);
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * Attempt to cancel all outstanding requests (requests that are queued for
+     * dereferencing). Returns true if all outstanding requests can be
+     * cancelled.
+     *
+     * @return bool
+     */
+    public function cancel()
+    {
+        if ($this->isRealized) {
+            return false;
+        }
+
+        $success = $this->isRealized = true;
+        foreach ($this->waitQueue as $response) {
+            if (!$response->cancel()) {
+                $success = false;
+            }
+        }
+
+        return $success;
+    }
+
+    /**
+     * Returns a promise that is invoked when the pool completed. There will be
+     * no passed value.
+     *
+     * {@inheritdoc}
+     */
+    public function then(
+        callable $onFulfilled = null,
+        callable $onRejected = null,
+        callable $onProgress = null
+    ) {
+        return $this->promise->then($onFulfilled, $onRejected, $onProgress);
+    }
+
+    public function promise()
+    {
+        return $this->promise;
+    }
+
+    private function coerceIterable($requests)
+    {
+        if ($requests instanceof \Iterator) {
+            return $requests;
+        } elseif (is_array($requests)) {
+            return new \ArrayIterator($requests);
+        }
+
+        throw new \InvalidArgumentException('Expected Iterator or array. '
+            . 'Found ' . Core::describeType($requests));
+    }
+
+    /**
+     * Adds the next request to pool and tracks what requests need to be
+     * dereferenced when completing the pool.
+     */
+    private function addNextRequest()
+    {
+        add_next:
+
+        if ($this->isRealized || !$this->iter || !$this->iter->valid()) {
+            return false;
+        }
+
+        $request = $this->iter->current();
+        $this->iter->next();
+
+        if (!($request instanceof RequestInterface)) {
+            throw new \InvalidArgumentException(sprintf(
+                'All requests in the provided iterator must implement '
+                . 'RequestInterface. Found %s',
+                Core::describeType($request)
+            ));
+        }
+
+        // Be sure to use "lazy" futures, meaning they do not send right away.
+        $request->getConfig()->set('future', 'lazy');
+        $hash = spl_object_hash($request);
+        $this->attachListeners($request, $this->eventListeners);
+        $request->getEmitter()->on('before', [$this, '_trackRetries'], RequestEvents::EARLY);
+        $response = $this->client->send($request);
+        $this->waitQueue[$hash] = $response;
+        $promise = $response->promise();
+
+        // Don't recursively call itself for completed or rejected responses.
+        if ($promise instanceof FulfilledPromise
+            || $promise instanceof RejectedPromise
+        ) {
+            try {
+                $this->finishResponse($request, $response->wait(), $hash);
+            } catch (\Exception $e) {
+                $this->finishResponse($request, $e, $hash);
+            }
+            goto add_next;
+        }
+
+        // Use this function for both resolution and rejection.
+        $thenFn = function ($value) use ($request, $hash) {
+            $this->finishResponse($request, $value, $hash);
+            if (!$request->getConfig()->get('_pool_retries')) {
+                $this->addNextRequests();
+            }
+        };
+
+        $promise->then($thenFn, $thenFn);
+
+        return true;
+    }
+
+    public function _trackRetries(BeforeEvent $e)
+    {
+        $e->getRequest()->getConfig()->set('_pool_retries', $e->getRetryCount());
+    }
+
+    private function finishResponse($request, $value, $hash)
+    {
+        unset($this->waitQueue[$hash]);
+        $result = $value instanceof ResponseInterface
+            ? ['request' => $request, 'response' => $value, 'error' => null]
+            : ['request' => $request, 'response' => null, 'error' => $value];
+        $this->deferred->notify($result);
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Post/MultipartBody.php
@@ -0,0 +1,109 @@
+<?php
+namespace GuzzleHttp\Post;
+
+use GuzzleHttp\Stream\AppendStream;
+use GuzzleHttp\Stream\Stream;
+use GuzzleHttp\Stream\StreamDecoratorTrait;
+use GuzzleHttp\Stream\StreamInterface;
+
+/**
+ * Stream that when read returns bytes for a streaming multipart/form-data body
+ */
+class MultipartBody implements StreamInterface
+{
+    use StreamDecoratorTrait;
+
+    private $boundary;
+
+    /**
+     * @param array  $fields   Associative array of field names to values where
+     *                         each value is a string or array of strings.
+     * @param array  $files    Associative array of PostFileInterface objects
+     * @param string $boundary You can optionally provide a specific boundary
+     * @throws \InvalidArgumentException
+     */
+    public function __construct(
+        array $fields = [],
+        array $files = [],
+        $boundary = null
+    ) {
+        $this->boundary = $boundary ?: uniqid();
+        $this->stream = $this->createStream($fields, $files);
+    }
+
+    /**
+     * Get the boundary
+     *
+     * @return string
+     */
+    public function getBoundary()
+    {
+        return $this->boundary;
+    }
+
+    public function isWritable()
+    {
+        return false;
+    }
+
+    /**
+     * Get the string needed to transfer a POST field
+     */
+    private function getFieldString($name, $value)
+    {
+        return sprintf(
+            "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n",
+            $this->boundary,
+            $name,
+            $value
+        );
+    }
+
+    /**
+     * Get the headers needed before transferring the content of a POST file
+     */
+    private function getFileHeaders(PostFileInterface $file)
+    {
+        $headers = '';
+        foreach ($file->getHeaders() as $key => $value) {
+            $headers .= "{$key}: {$value}\r\n";
+        }
+
+        return "--{$this->boundary}\r\n" . trim($headers) . "\r\n\r\n";
+    }
+
+    /**
+     * Create the aggregate stream that will be used to upload the POST data
+     */
+    protected function createStream(array $fields, array $files)
+    {
+        $stream = new AppendStream();
+
+        foreach ($fields as $name => $fieldValues) {
+            foreach ((array) $fieldValues as $value) {
+                $stream->addStream(
+                    Stream::factory($this->getFieldString($name, $value))
+                );
+            }
+        }
+
+        foreach ($files as $file) {
+
+            if (!$file instanceof PostFileInterface) {
+                throw new \InvalidArgumentException('All POST fields must '
+                    . 'implement PostFieldInterface');
+            }
+
+            $stream->addStream(
+                Stream::factory($this->getFileHeaders($file))
+            );
+            $stream->addStream($file->getContent());
+            $stream->addStream(Stream::factory("\r\n"));
+        }
+
+        // Add the trailing boundary with CRLF
+        $stream->addStream(Stream::factory("--{$this->boundary}--\r\n"));
+
+        return $stream;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Post/PostBody.php
@@ -0,0 +1,287 @@
+<?php
+namespace GuzzleHttp\Post;
+
+use GuzzleHttp\Message\RequestInterface;
+use GuzzleHttp\Stream\Exception\CannotAttachException;
+use GuzzleHttp\Stream\StreamInterface;
+use GuzzleHttp\Stream\Stream;
+use GuzzleHttp\Query;
+
+/**
+ * Holds POST fields and files and creates a streaming body when read methods
+ * are called on the object.
+ */
+class PostBody implements PostBodyInterface
+{
+    /** @var StreamInterface */
+    private $body;
+
+    /** @var callable */
+    private $aggregator;
+
+    private $fields = [];
+
+    /** @var PostFileInterface[] */
+    private $files = [];
+    private $forceMultipart = false;
+    private $detached = false;
+
+    /**
+     * Applies request headers to a request based on the POST state
+     *
+     * @param RequestInterface $request Request to update
+     */
+    public function applyRequestHeaders(RequestInterface $request)
+    {
+        if ($this->files || $this->forceMultipart) {
+            $request->setHeader(
+                'Content-Type',
+                'multipart/form-data; boundary=' . $this->getBody()->getBoundary()
+            );
+        } elseif ($this->fields && !$request->hasHeader('Content-Type')) {
+            $request->setHeader(
+                'Content-Type',
+                'application/x-www-form-urlencoded'
+            );
+        }
+
+        if ($size = $this->getSize()) {
+            $request->setHeader('Content-Length', $size);
+        }
+    }
+
+    public function forceMultipartUpload($force)
+    {
+        $this->forceMultipart = $force;
+    }
+
+    public function setAggregator(callable $aggregator)
+    {
+        $this->aggregator = $aggregator;
+    }
+
+    public function setField($name, $value)
+    {
+        $this->fields[$name] = $value;
+        $this->mutate();
+    }
+
+    public function replaceFields(array $fields)
+    {
+        $this->fields = $fields;
+        $this->mutate();
+    }
+
+    public function getField($name)
+    {
+        return isset($this->fields[$name]) ? $this->fields[$name] : null;
+    }
+
+    public function removeField($name)
+    {
+        unset($this->fields[$name]);
+        $this->mutate();
+    }
+
+    public function getFields($asString = false)
+    {
+        if (!$asString) {
+            return $this->fields;
+        }
+
+        $query = new Query($this->fields);
+        $query->setEncodingType(Query::RFC1738);
+        $query->setAggregator($this->getAggregator());
+
+        return (string) $query;
+    }
+
+    public function hasField($name)
+    {
+        return isset($this->fields[$name]);
+    }
+
+    public function getFile($name)
+    {
+        foreach ($this->files as $file) {
+            if ($file->getName() == $name) {
+                return $file;
+            }
+        }
+
+        return null;
+    }
+
+    public function getFiles()
+    {
+        return $this->files;
+    }
+
+    public function addFile(PostFileInterface $file)
+    {
+        $this->files[] = $file;
+        $this->mutate();
+    }
+
+    public function clearFiles()
+    {
+        $this->files = [];
+        $this->mutate();
+    }
+
+    /**
+     * Returns the numbers of fields + files
+     *
+     * @return int
+     */
+    public function count()
+    {
+        return count($this->files) + count($this->fields);
+    }
+
+    public function __toString()
+    {
+        return (string) $this->getBody();
+    }
+
+    public function getContents($maxLength = -1)
+    {
+        return $this->getBody()->getContents();
+    }
+
+    public function close()
+    {
+        $this->detach();
+    }
+
+    public function detach()
+    {
+        $this->detached = true;
+        $this->fields = $this->files = [];
+
+        if ($this->body) {
+            $this->body->close();
+            $this->body = null;
+        }
+    }
+
+    public function attach($stream)
+    {
+        throw new CannotAttachException();
+    }
+
+    public function eof()
+    {
+        return $this->getBody()->eof();
+    }
+
+    public function tell()
+    {
+        return $this->body ? $this->body->tell() : 0;
+    }
+
+    public function isSeekable()
+    {
+        return true;
+    }
+
+    public function isReadable()
+    {
+        return true;
+    }
+
+    public function isWritable()
+    {
+        return false;
+    }
+
+    public function getSize()
+    {
+        return $this->getBody()->getSize();
+    }
+
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        return $this->getBody()->seek($offset, $whence);
+    }
+
+    public function read($length)
+    {
+        return $this->getBody()->read($length);
+    }
+
+    public function write($string)
+    {
+        return false;
+    }
+
+    public function getMetadata($key = null)
+    {
+        return $key ? null : [];
+    }
+
+    /**
+     * Return a stream object that is built from the POST fields and files.
+     *
+     * If one has already been created, the previously created stream will be
+     * returned.
+     */
+    private function getBody()
+    {
+        if ($this->body) {
+            return $this->body;
+        } elseif ($this->files || $this->forceMultipart) {
+            return $this->body = $this->createMultipart();
+        } elseif ($this->fields) {
+            return $this->body = $this->createUrlEncoded();
+        } else {
+            return $this->body = Stream::factory();
+        }
+    }
+
+    /**
+     * Get the aggregator used to join multi-valued field parameters
+     *
+     * @return callable
+     */
+    final protected function getAggregator()
+    {
+        if (!$this->aggregator) {
+            $this->aggregator = Query::phpAggregator();
+        }
+
+        return $this->aggregator;
+    }
+
+    /**
+     * Creates a multipart/form-data body stream
+     *
+     * @return MultipartBody
+     */
+    private function createMultipart()
+    {
+        // Flatten the nested query string values using the correct aggregator
+        return new MultipartBody(
+            call_user_func($this->getAggregator(), $this->fields),
+            $this->files
+        );
+    }
+
+    /**
+     * Creates an application/x-www-form-urlencoded stream body
+     *
+     * @return StreamInterface
+     */
+    private function createUrlEncoded()
+    {
+        return Stream::factory($this->getFields(true));
+    }
+
+    /**
+     * Get rid of any cached data
+     */
+    private function mutate()
+    {
+        $this->body = null;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Post/PostBodyInterface.php
@@ -0,0 +1,109 @@
+<?php
+namespace GuzzleHttp\Post;
+
+use GuzzleHttp\Message\AppliesHeadersInterface;
+use GuzzleHttp\Stream\StreamInterface;
+
+/**
+ * Represents a POST body that is sent as either a multipart/form-data stream
+ * or application/x-www-urlencoded stream.
+ */
+interface PostBodyInterface extends StreamInterface, \Countable, AppliesHeadersInterface
+{
+    /**
+     * Set a specific field
+     *
+     * @param string       $name  Name of the field to set
+     * @param string|array $value Value to set
+     */
+    public function setField($name, $value);
+
+    /**
+     * Set the aggregation strategy that will be used to turn multi-valued
+     * fields into a string.
+     *
+     * The aggregation function accepts a deeply nested array of query string
+     * values and returns a flattened associative array of key value pairs.
+     *
+     * @param callable $aggregator
+     */
+    public function setAggregator(callable $aggregator);
+
+    /**
+     * Set to true to force a multipart upload even if there are no files.
+     *
+     * @param bool $force Set to true to force multipart uploads or false to
+     *     remove this flag.
+     */
+    public function forceMultipartUpload($force);
+
+    /**
+     * Replace all existing form fields with an array of fields
+     *
+     * @param array $fields Associative array of fields to set
+     */
+    public function replaceFields(array $fields);
+
+    /**
+     * Get a specific field by name
+     *
+     * @param string $name Name of the POST field to retrieve
+     *
+     * @return string|null
+     */
+    public function getField($name);
+
+    /**
+     * Remove a field by name
+     *
+     * @param string $name Name of the field to remove
+     */
+    public function removeField($name);
+
+    /**
+     * Returns an associative array of names to values or a query string.
+     *
+     * @param bool $asString Set to true to retrieve the fields as a query
+     *     string.
+     *
+     * @return array|string
+     */
+    public function getFields($asString = false);
+
+    /**
+     * Returns true if a field is set
+     *
+     * @param string $name Name of the field to set
+     *
+     * @return bool
+     */
+    public function hasField($name);
+
+    /**
+     * Get all of the files
+     *
+     * @return array Returns an array of PostFileInterface objects
+     */
+    public function getFiles();
+
+    /**
+     * Get a POST file by name.
+     *
+     * @param string $name Name of the POST file to retrieve
+     *
+     * @return PostFileInterface|null
+     */
+    public function getFile($name);
+
+    /**
+     * Add a file to the POST
+     *
+     * @param PostFileInterface $file File to add
+     */
+    public function addFile(PostFileInterface $file);
+
+    /**
+     * Remove all files from the collection
+     */
+    public function clearFiles();
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Post/PostFile.php
@@ -0,0 +1,135 @@
+<?php
+namespace GuzzleHttp\Post;
+
+use GuzzleHttp\Mimetypes;
+use GuzzleHttp\Stream\StreamInterface;
+use GuzzleHttp\Stream\Stream;
+
+/**
+ * Post file upload
+ */
+class PostFile implements PostFileInterface
+{
+    private $name;
+    private $filename;
+    private $content;
+    private $headers = [];
+
+    /**
+     * @param string          $name     Name of the form field
+     * @param mixed           $content  Data to send
+     * @param string|null     $filename Filename content-disposition attribute
+     * @param array           $headers  Array of headers to set on the file
+     *                                  (can override any default headers)
+     * @throws \RuntimeException when filename is not passed or can't be determined
+     */
+    public function __construct(
+        $name,
+        $content,
+        $filename = null,
+        array $headers = []
+    ) {
+        $this->headers = $headers;
+        $this->name = $name;
+        $this->prepareContent($content);
+        $this->prepareFilename($filename);
+        $this->prepareDefaultHeaders();
+    }
+
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    public function getFilename()
+    {
+        return $this->filename;
+    }
+
+    public function getContent()
+    {
+        return $this->content;
+    }
+
+    public function getHeaders()
+    {
+        return $this->headers;
+    }
+
+    /**
+     * Prepares the contents of a POST file.
+     *
+     * @param mixed $content Content of the POST file
+     */
+    private function prepareContent($content)
+    {
+        $this->content = $content;
+
+        if (!($this->content instanceof StreamInterface)) {
+            $this->content = Stream::factory($this->content);
+        } elseif ($this->content instanceof MultipartBody) {
+            if (!$this->hasHeader('Content-Disposition')) {
+                $disposition = 'form-data; name="' . $this->name .'"';
+                $this->headers['Content-Disposition'] = $disposition;
+            }
+
+            if (!$this->hasHeader('Content-Type')) {
+                $this->headers['Content-Type'] = sprintf(
+                    "multipart/form-data; boundary=%s",
+                    $this->content->getBoundary()
+                );
+            }
+        }
+    }
+
+    /**
+     * Applies a file name to the POST file based on various checks.
+     *
+     * @param string|null $filename Filename to apply (or null to guess)
+     */
+    private function prepareFilename($filename)
+    {
+        $this->filename = $filename;
+
+        if (!$this->filename) {
+            $this->filename = $this->content->getMetadata('uri');
+        }
+
+        if (!$this->filename || substr($this->filename, 0, 6) === 'php://') {
+            $this->filename = $this->name;
+        }
+    }
+
+    /**
+     * Applies default Content-Disposition and Content-Type headers if needed.
+     */
+    private function prepareDefaultHeaders()
+    {
+        // Set a default content-disposition header if one was no provided
+        if (!$this->hasHeader('Content-Disposition')) {
+            $this->headers['Content-Disposition'] = sprintf(
+                'form-data; name="%s"; filename="%s"',
+                $this->name,
+                basename($this->filename)
+            );
+        }
+
+        // Set a default Content-Type if one was not supplied
+        if (!$this->hasHeader('Content-Type')) {
+            $this->headers['Content-Type'] = Mimetypes::getInstance()
+                ->fromFilename($this->filename) ?: 'text/plain';
+        }
+    }
+
+    /**
+     * Check if a specific header exists on the POST file by name.
+     *
+     * @param string $name Case-insensitive header to check
+     *
+     * @return bool
+     */
+    private function hasHeader($name)
+    {
+        return isset(array_change_key_case($this->headers)[strtolower($name)]);
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Post/PostFileInterface.php
@@ -0,0 +1,41 @@
+<?php
+namespace GuzzleHttp\Post;
+
+use GuzzleHttp\Stream\StreamInterface;
+
+/**
+ * Post file upload interface
+ */
+interface PostFileInterface
+{
+    /**
+     * Get the name of the form field
+     *
+     * @return string
+     */
+    public function getName();
+
+    /**
+     * Get the full path to the file
+     *
+     * @return string
+     */
+    public function getFilename();
+
+    /**
+     * Get the content
+     *
+     * @return StreamInterface
+     */
+    public function getContent();
+
+    /**
+     * Gets all POST file headers.
+     *
+     * The keys represent the header name as it will be sent over the wire, and
+     * each value is a string.
+     *
+     * @return array Returns an associative array of the file's headers.
+     */
+    public function getHeaders();
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Query.php
@@ -0,0 +1,204 @@
+<?php
+namespace GuzzleHttp;
+
+/**
+ * Manages query string variables and can aggregate them into a string
+ */
+class Query extends Collection
+{
+    const RFC3986 = 'RFC3986';
+    const RFC1738 = 'RFC1738';
+
+    /** @var callable Encoding function */
+    private $encoding = 'rawurlencode';
+    /** @var callable */
+    private $aggregator;
+
+    /**
+     * Parse a query string into a Query object
+     *
+     * $urlEncoding is used to control how the query string is parsed and how
+     * it is ultimately serialized. The value can be set to one of the
+     * following:
+     *
+     * - true: (default) Parse query strings using RFC 3986 while still
+     *   converting "+" to " ".
+     * - false: Disables URL decoding of the input string and URL encoding when
+     *   the query string is serialized.
+     * - 'RFC3986': Use RFC 3986 URL encoding/decoding
+     * - 'RFC1738': Use RFC 1738 URL encoding/decoding
+     *
+     * @param string      $query       Query string to parse
+     * @param bool|string $urlEncoding Controls how the input string is decoded
+     *                                 and encoded.
+     * @return self
+     */
+    public static function fromString($query, $urlEncoding = true)
+    {
+        static $qp;
+        if (!$qp) {
+            $qp = new QueryParser();
+        }
+
+        $q = new static();
+
+        if ($urlEncoding !== true) {
+            $q->setEncodingType($urlEncoding);
+        }
+
+        $qp->parseInto($q, $query, $urlEncoding);
+
+        return $q;
+    }
+
+    /**
+     * Convert the query string parameters to a query string string
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        if (!$this->data) {
+            return '';
+        }
+
+        // The default aggregator is statically cached
+        static $defaultAggregator;
+
+        if (!$this->aggregator) {
+            if (!$defaultAggregator) {
+                $defaultAggregator = self::phpAggregator();
+            }
+            $this->aggregator = $defaultAggregator;
+        }
+
+        $result = '';
+        $aggregator = $this->aggregator;
+        $encoder = $this->encoding;
+
+        foreach ($aggregator($this->data) as $key => $values) {
+            foreach ($values as $value) {
+                if ($result) {
+                    $result .= '&';
+                }
+                $result .= $encoder($key);
+                if ($value !== null) {
+                    $result .= '=' . $encoder($value);
+                }
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Controls how multi-valued query string parameters are aggregated into a
+     * string.
+     *
+     *     $query->setAggregator($query::duplicateAggregator());
+     *
+     * @param callable $aggregator Callable used to convert a deeply nested
+     *     array of query string variables into a flattened array of key value
+     *     pairs. The callable accepts an array of query data and returns a
+     *     flattened array of key value pairs where each value is an array of
+     *     strings.
+     */
+    public function setAggregator(callable $aggregator)
+    {
+        $this->aggregator = $aggregator;
+    }
+
+    /**
+     * Specify how values are URL encoded
+     *
+     * @param string|bool $type One of 'RFC1738', 'RFC3986', or false to disable encoding
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function setEncodingType($type)
+    {
+        switch ($type) {
+            case self::RFC3986:
+                $this->encoding = 'rawurlencode';
+                break;
+            case self::RFC1738:
+                $this->encoding = 'urlencode';
+                break;
+            case false:
+                $this->encoding = function ($v) { return $v; };
+                break;
+            default:
+                throw new \InvalidArgumentException('Invalid URL encoding type');
+        }
+    }
+
+    /**
+     * Query string aggregator that does not aggregate nested query string
+     * values and allows duplicates in the resulting array.
+     *
+     * Example: http://test.com?q=1&q=2
+     *
+     * @return callable
+     */
+    public static function duplicateAggregator()
+    {
+        return function (array $data) {
+            return self::walkQuery($data, '', function ($key, $prefix) {
+                return is_int($key) ? $prefix : "{$prefix}[{$key}]";
+            });
+        };
+    }
+
+    /**
+     * Aggregates nested query string variables using the same technique as
+     * ``http_build_query()``.
+     *
+     * @param bool $numericIndices Pass false to not include numeric indices
+     *     when multi-values query string parameters are present.
+     *
+     * @return callable
+     */
+    public static function phpAggregator($numericIndices = true)
+    {
+        return function (array $data) use ($numericIndices) {
+            return self::walkQuery(
+                $data,
+                '',
+                function ($key, $prefix) use ($numericIndices) {
+                    return !$numericIndices && is_int($key)
+                        ? "{$prefix}[]"
+                        : "{$prefix}[{$key}]";
+                }
+            );
+        };
+    }
+
+    /**
+     * Easily create query aggregation functions by providing a key prefix
+     * function to this query string array walker.
+     *
+     * @param array    $query     Query string to walk
+     * @param string   $keyPrefix Key prefix (start with '')
+     * @param callable $prefixer  Function used to create a key prefix
+     *
+     * @return array
+     */
+    public static function walkQuery(array $query, $keyPrefix, callable $prefixer)
+    {
+        $result = [];
+        foreach ($query as $key => $value) {
+            if ($keyPrefix) {
+                $key = $prefixer($key, $keyPrefix);
+            }
+            if (is_array($value)) {
+                $result += self::walkQuery($value, $key, $prefixer);
+            } elseif (isset($result[$key])) {
+                $result[$key][] = $value;
+            } else {
+                $result[$key] = array($value);
+            }
+        }
+
+        return $result;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/QueryParser.php
@@ -0,0 +1,163 @@
+<?php
+namespace GuzzleHttp;
+
+/**
+ * Parses query strings into a Query object.
+ *
+ * While parsing, the parser will attempt to determine the most appropriate
+ * query string aggregator to use when serializing the parsed query string
+ * object back into a string. The hope is that parsing then serializing a
+ * query string should be a lossless operation.
+ *
+ * @internal Use Query::fromString()
+ */
+class QueryParser
+{
+    private $duplicates;
+    private $numericIndices;
+
+    /**
+     * Parse a query string into a Query object.
+     *
+     * @param Query       $query       Query object to populate
+     * @param string      $str         Query string to parse
+     * @param bool|string $urlEncoding How the query string is encoded
+     */
+    public function parseInto(Query $query, $str, $urlEncoding = true)
+    {
+        if ($str === '') {
+            return;
+        }
+
+        $result = [];
+        $this->duplicates = false;
+        $this->numericIndices = true;
+        $decoder = self::getDecoder($urlEncoding);
+
+        foreach (explode('&', $str) as $kvp) {
+
+            $parts = explode('=', $kvp, 2);
+            $key = $decoder($parts[0]);
+            $value = isset($parts[1]) ? $decoder($parts[1]) : null;
+
+            // Special handling needs to be taken for PHP nested array syntax
+            if (strpos($key, '[') !== false) {
+                $this->parsePhpValue($key, $value, $result);
+                continue;
+            }
+
+            if (!isset($result[$key])) {
+                $result[$key] = $value;
+            } else {
+                $this->duplicates = true;
+                if (!is_array($result[$key])) {
+                    $result[$key] = [$result[$key]];
+                }
+                $result[$key][] = $value;
+            }
+        }
+
+        $query->replace($result);
+
+        if (!$this->numericIndices) {
+            $query->setAggregator(Query::phpAggregator(false));
+        } elseif ($this->duplicates) {
+            $query->setAggregator(Query::duplicateAggregator());
+        }
+    }
+
+    /**
+     * Returns a callable that is used to URL decode query keys and values.
+     *
+     * @param string|bool $type One of true, false, RFC3986, and RFC1738
+     *
+     * @return callable|string
+     */
+    private static function getDecoder($type)
+    {
+        if ($type === true) {
+            return function ($value) {
+                return rawurldecode(str_replace('+', ' ', $value));
+            };
+        } elseif ($type == Query::RFC3986) {
+            return 'rawurldecode';
+        } elseif ($type == Query::RFC1738) {
+            return 'urldecode';
+        } else {
+            return function ($str) { return $str; };
+        }
+    }
+
+    /**
+     * Parses a PHP style key value pair.
+     *
+     * @param string      $key    Key to parse (e.g., "foo[a][b]")
+     * @param string|null $value  Value to set
+     * @param array       $result Result to modify by reference
+     */
+    private function parsePhpValue($key, $value, array &$result)
+    {
+        $node =& $result;
+        $keyBuffer = '';
+
+        for ($i = 0, $t = strlen($key); $i < $t; $i++) {
+            switch ($key[$i]) {
+                case '[':
+                    if ($keyBuffer) {
+                        $this->prepareNode($node, $keyBuffer);
+                        $node =& $node[$keyBuffer];
+                        $keyBuffer = '';
+                    }
+                    break;
+                case ']':
+                    $k = $this->cleanKey($node, $keyBuffer);
+                    $this->prepareNode($node, $k);
+                    $node =& $node[$k];
+                    $keyBuffer = '';
+                    break;
+                default:
+                    $keyBuffer .= $key[$i];
+                    break;
+            }
+        }
+
+        if (isset($node)) {
+            $this->duplicates = true;
+            $node[] = $value;
+        } else {
+            $node = $value;
+        }
+    }
+
+    /**
+     * Prepares a value in the array at the given key.
+     *
+     * If the key already exists, the key value is converted into an array.
+     *
+     * @param array  $node Result node to modify
+     * @param string $key  Key to add or modify in the node
+     */
+    private function prepareNode(&$node, $key)
+    {
+        if (!isset($node[$key])) {
+            $node[$key] = null;
+        } elseif (!is_array($node[$key])) {
+            $node[$key] = [$node[$key]];
+        }
+    }
+
+    /**
+     * Returns the appropriate key based on the node and key.
+     */
+    private function cleanKey($node, $key)
+    {
+        if ($key === '') {
+            $key = $node ? (string) count($node) : 0;
+            // Found a [] key, so track this to ensure that we disable numeric
+            // indexing of keys in the resolved query aggregator.
+            $this->numericIndices = false;
+        }
+
+        return $key;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/RequestFsm.php
@@ -0,0 +1,153 @@
+<?php
+namespace GuzzleHttp;
+
+use GuzzleHttp\Event\BeforeEvent;
+use GuzzleHttp\Event\ErrorEvent;
+use GuzzleHttp\Event\CompleteEvent;
+use GuzzleHttp\Event\EndEvent;
+use GuzzleHttp\Exception\StateException;
+use GuzzleHttp\Exception\RequestException;
+use GuzzleHttp\Message\FutureResponse;
+use GuzzleHttp\Message\MessageFactoryInterface;
+use GuzzleHttp\Ring\Future\FutureInterface;
+
+/**
+ * Responsible for transitioning requests through lifecycle events.
+ */
+class RequestFsm
+{
+    private $handler;
+    private $mf;
+    private $maxTransitions;
+
+    public function __construct(
+        callable $handler,
+        MessageFactoryInterface $messageFactory,
+        $maxTransitions = 200
+    ) {
+        $this->mf = $messageFactory;
+        $this->maxTransitions = $maxTransitions;
+        $this->handler = $handler;
+    }
+
+    /**
+     * Runs the state machine until a terminal state is entered or the
+     * optionally supplied $finalState is entered.
+     *
+     * @param Transaction $trans      Transaction being transitioned.
+     *
+     * @throws \Exception if a terminal state throws an exception.
+     */
+    public function __invoke(Transaction $trans)
+    {
+        $trans->_transitionCount = 0;
+
+        if (!$trans->state) {
+            $trans->state = 'before';
+        }
+
+        transition:
+
+        if (++$trans->_transitionCount > $this->maxTransitions) {
+            throw new StateException("Too many state transitions were "
+                . "encountered ({$trans->_transitionCount}). This likely "
+                . "means that a combination of event listeners are in an "
+                . "infinite loop.");
+        }
+
+        switch ($trans->state) {
+            case 'before': goto before;
+            case 'complete': goto complete;
+            case 'error': goto error;
+            case 'retry': goto retry;
+            case 'send': goto send;
+            case 'end': goto end;
+            default: throw new StateException("Invalid state: {$trans->state}");
+        }
+
+        before: {
+            try {
+                $trans->request->getEmitter()->emit('before', new BeforeEvent($trans));
+                $trans->state = 'send';
+                if ((bool) $trans->response) {
+                    $trans->state = 'complete';
+                }
+            } catch (\Exception $e) {
+                $trans->state = 'error';
+                $trans->exception = $e;
+            }
+            goto transition;
+        }
+
+        complete: {
+            try {
+                if ($trans->response instanceof FutureInterface) {
+                    // Futures will have their own end events emitted when
+                    // dereferenced.
+                    return;
+                }
+                $trans->state = 'end';
+                $trans->response->setEffectiveUrl($trans->request->getUrl());
+                $trans->request->getEmitter()->emit('complete', new CompleteEvent($trans));
+            } catch (\Exception $e) {
+                $trans->state = 'error';
+                $trans->exception = $e;
+            }
+            goto transition;
+        }
+
+        error: {
+            try {
+                // Convert non-request exception to a wrapped exception
+                $trans->exception = RequestException::wrapException(
+                    $trans->request, $trans->exception
+                );
+                $trans->state = 'end';
+                $trans->request->getEmitter()->emit('error', new ErrorEvent($trans));
+                // An intercepted request (not retried) transitions to complete
+                if (!$trans->exception && $trans->state !== 'retry') {
+                    $trans->state = 'complete';
+                }
+            } catch (\Exception $e) {
+                $trans->state = 'end';
+                $trans->exception = $e;
+            }
+            goto transition;
+        }
+
+        retry: {
+            $trans->retries++;
+            $trans->response = null;
+            $trans->exception = null;
+            $trans->state = 'before';
+            goto transition;
+        }
+
+        send: {
+            $fn = $this->handler;
+            $trans->response = FutureResponse::proxy(
+                $fn(RingBridge::prepareRingRequest($trans)),
+                function ($value) use ($trans) {
+                    RingBridge::completeRingResponse($trans, $value, $this->mf, $this);
+                    $this($trans);
+                    return $trans->response;
+                }
+            );
+            return;
+        }
+
+        end: {
+            $trans->request->getEmitter()->emit('end', new EndEvent($trans));
+            // Throw exceptions in the terminal event if the exception
+            // was not handled by an "end" event listener.
+            if ($trans->exception) {
+                if (!($trans->exception instanceof RequestException)) {
+                    $trans->exception = RequestException::wrapException(
+                        $trans->request, $trans->exception
+                    );
+                }
+                throw $trans->exception;
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/RingBridge.php
@@ -0,0 +1,165 @@
+<?php
+namespace GuzzleHttp;
+
+use GuzzleHttp\Message\MessageFactoryInterface;
+use GuzzleHttp\Message\RequestInterface;
+use GuzzleHttp\Event\ProgressEvent;
+use GuzzleHttp\Message\Request;
+use GuzzleHttp\Ring\Core;
+use GuzzleHttp\Stream\Stream;
+use GuzzleHttp\Exception\RequestException;
+
+/**
+ * Provides the bridge between Guzzle requests and responses and Guzzle Ring.
+ */
+class RingBridge
+{
+    /**
+     * Creates a Ring request from a request object.
+     *
+     * This function does not hook up the "then" and "progress" events that
+     * would be required for actually sending a Guzzle request through a
+     * RingPHP handler.
+     *
+     * @param RequestInterface $request Request to convert.
+     *
+     * @return array Converted Guzzle Ring request.
+     */
+    public static function createRingRequest(RequestInterface $request)
+    {
+        $options = $request->getConfig()->toArray();
+        $url = $request->getUrl();
+        // No need to calculate the query string twice (in URL and query).
+        $qs = ($pos = strpos($url, '?')) ? substr($url, $pos + 1) : null;
+
+        return [
+            'scheme'       => $request->getScheme(),
+            'http_method'  => $request->getMethod(),
+            'url'          => $url,
+            'uri'          => $request->getPath(),
+            'headers'      => $request->getHeaders(),
+            'body'         => $request->getBody(),
+            'version'      => $request->getProtocolVersion(),
+            'client'       => $options,
+            'query_string' => $qs,
+            'future'       => isset($options['future']) ? $options['future'] : false
+        ];
+    }
+
+    /**
+     * Creates a Ring request from a request object AND prepares the callbacks.
+     *
+     * @param Transaction $trans Transaction to update.
+     *
+     * @return array Converted Guzzle Ring request.
+     */
+    public static function prepareRingRequest(Transaction $trans)
+    {
+        // Clear out the transaction state when initiating.
+        $trans->exception = null;
+        $request = self::createRingRequest($trans->request);
+
+        // Emit progress events if any progress listeners are registered.
+        if ($trans->request->getEmitter()->hasListeners('progress')) {
+            $emitter = $trans->request->getEmitter();
+            $request['client']['progress'] = function ($a, $b, $c, $d) use ($trans, $emitter) {
+                $emitter->emit('progress', new ProgressEvent($trans, $a, $b, $c, $d));
+            };
+        }
+
+        return $request;
+    }
+
+    /**
+     * Handles the process of processing a response received from a ring
+     * handler. The created response is added to the transaction, and the
+     * transaction stat is set appropriately.
+     *
+     * @param Transaction             $trans          Owns request and response.
+     * @param array                   $response       Ring response array
+     * @param MessageFactoryInterface $messageFactory Creates response objects.
+     */
+    public static function completeRingResponse(
+        Transaction $trans,
+        array $response,
+        MessageFactoryInterface $messageFactory
+    ) {
+        $trans->state = 'complete';
+        $trans->transferInfo = isset($response['transfer_stats'])
+            ? $response['transfer_stats'] : [];
+
+        if (!empty($response['status'])) {
+            $options = [];
+            if (isset($response['version'])) {
+                $options['protocol_version'] = $response['version'];
+            }
+            if (isset($response['reason'])) {
+                $options['reason_phrase'] = $response['reason'];
+            }
+            $trans->response = $messageFactory->createResponse(
+                $response['status'],
+                isset($response['headers']) ? $response['headers'] : [],
+                isset($response['body']) ? $response['body'] : null,
+                $options
+            );
+            if (isset($response['effective_url'])) {
+                $trans->response->setEffectiveUrl($response['effective_url']);
+            }
+        } elseif (empty($response['error'])) {
+            // When nothing was returned, then we need to add an error.
+            $response['error'] = self::getNoRingResponseException($trans->request);
+        }
+
+        if (isset($response['error'])) {
+            $trans->state = 'error';
+            $trans->exception = $response['error'];
+        }
+    }
+
+    /**
+     * Creates a Guzzle request object using a ring request array.
+     *
+     * @param array $request Ring request
+     *
+     * @return Request
+     * @throws \InvalidArgumentException for incomplete requests.
+     */
+    public static function fromRingRequest(array $request)
+    {
+        $options = [];
+        if (isset($request['version'])) {
+            $options['protocol_version'] = $request['version'];
+        }
+
+        if (!isset($request['http_method'])) {
+            throw new \InvalidArgumentException('No http_method');
+        }
+
+        return new Request(
+            $request['http_method'],
+            Core::url($request),
+            isset($request['headers']) ? $request['headers'] : [],
+            isset($request['body']) ? Stream::factory($request['body']) : null,
+            $options
+        );
+    }
+
+    /**
+     * Get an exception that can be used when a RingPHP handler does not
+     * populate a response.
+     *
+     * @param RequestInterface $request
+     *
+     * @return RequestException
+     */
+    public static function getNoRingResponseException(RequestInterface $request)
+    {
+        $message = <<<EOT
+Sending the request did not return a response, exception, or populate the
+transaction with a response. This is most likely due to an incorrectly
+implemented RingPHP handler. If you are simply trying to mock responses,
+then it is recommended to use the GuzzleHttp\Ring\Client\MockHandler.
+EOT;
+        return new RequestException($message, $request);
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Subscriber/Cookie.php
@@ -0,0 +1,58 @@
+<?php
+namespace GuzzleHttp\Subscriber;
+
+use GuzzleHttp\Cookie\CookieJar;
+use GuzzleHttp\Cookie\CookieJarInterface;
+use GuzzleHttp\Event\BeforeEvent;
+use GuzzleHttp\Event\CompleteEvent;
+use GuzzleHttp\Event\RequestEvents;
+use GuzzleHttp\Event\SubscriberInterface;
+
+/**
+ * Adds, extracts, and persists cookies between HTTP requests
+ */
+class Cookie implements SubscriberInterface
+{
+    /** @var CookieJarInterface */
+    private $cookieJar;
+
+    /**
+     * @param CookieJarInterface $cookieJar Cookie jar used to hold cookies
+     */
+    public function __construct(CookieJarInterface $cookieJar = null)
+    {
+        $this->cookieJar = $cookieJar ?: new CookieJar();
+    }
+
+    public function getEvents()
+    {
+        // Fire the cookie plugin complete event before redirecting
+        return [
+            'before'   => ['onBefore'],
+            'complete' => ['onComplete', RequestEvents::REDIRECT_RESPONSE + 10]
+        ];
+    }
+
+    /**
+     * Get the cookie cookieJar
+     *
+     * @return CookieJarInterface
+     */
+    public function getCookieJar()
+    {
+        return $this->cookieJar;
+    }
+
+    public function onBefore(BeforeEvent $event)
+    {
+        $this->cookieJar->addCookieHeader($event->getRequest());
+    }
+
+    public function onComplete(CompleteEvent $event)
+    {
+        $this->cookieJar->extractCookies(
+            $event->getRequest(),
+            $event->getResponse()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Subscriber/History.php
@@ -0,0 +1,172 @@
+<?php
+namespace GuzzleHttp\Subscriber;
+
+use GuzzleHttp\Event\CompleteEvent;
+use GuzzleHttp\Event\ErrorEvent;
+use GuzzleHttp\Event\RequestEvents;
+use GuzzleHttp\Event\SubscriberInterface;
+use GuzzleHttp\Message\RequestInterface;
+use GuzzleHttp\Message\ResponseInterface;
+
+/**
+ * Maintains a list of requests and responses sent using a request or client
+ */
+class History implements SubscriberInterface, \IteratorAggregate, \Countable
+{
+    /** @var int The maximum number of requests to maintain in the history */
+    private $limit;
+
+    /** @var array Requests and responses that have passed through the plugin */
+    private $transactions = [];
+
+    public function __construct($limit = 10)
+    {
+        $this->limit = $limit;
+    }
+
+    public function getEvents()
+    {
+        return [
+            'complete' => ['onComplete', RequestEvents::EARLY],
+            'error'    => ['onError', RequestEvents::EARLY],
+        ];
+    }
+
+    /**
+     * Convert to a string that contains all request and response headers
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        $lines = array();
+        foreach ($this->transactions as $entry) {
+            $response = isset($entry['response']) ? $entry['response'] : '';
+            $lines[] = '> ' . trim($entry['sent_request'])
+                . "\n\n< " . trim($response) . "\n";
+        }
+
+        return implode("\n", $lines);
+    }
+
+    public function onComplete(CompleteEvent $event)
+    {
+        $this->add($event->getRequest(), $event->getResponse());
+    }
+
+    public function onError(ErrorEvent $event)
+    {
+        // Only track when no response is present, meaning this didn't ever
+        // emit a complete event
+        if (!$event->getResponse()) {
+            $this->add($event->getRequest());
+        }
+    }
+
+    /**
+     * Returns an Iterator that yields associative array values where each
+     * associative array contains the following key value pairs:
+     *
+     * - request: Representing the actual request that was received.
+     * - sent_request: A clone of the request that will not be mutated.
+     * - response: The response that was received (if available).
+     *
+     * @return \Iterator
+     */
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->transactions);
+    }
+
+    /**
+     * Get all of the requests sent through the plugin.
+     *
+     * Requests can be modified after they are logged by the history
+     * subscriber. By default this method will return the actual request
+     * instances that were received. Pass true to this method if you wish to
+     * get copies of the requests that represent the request state when it was
+     * initially logged by the history subscriber.
+     *
+     * @param bool $asSent Set to true to get clones of the requests that have
+     *                     not been mutated since the request was received by
+     *                     the history subscriber.
+     *
+     * @return RequestInterface[]
+     */
+    public function getRequests($asSent = false)
+    {
+        return array_map(function ($t) use ($asSent) {
+            return $asSent ? $t['sent_request'] : $t['request'];
+        }, $this->transactions);
+    }
+
+    /**
+     * Get the number of requests in the history
+     *
+     * @return int
+     */
+    public function count()
+    {
+        return count($this->transactions);
+    }
+
+    /**
+     * Get the last request sent.
+     *
+     * Requests can be modified after they are logged by the history
+     * subscriber. By default this method will return the actual request
+     * instance that was received. Pass true to this method if you wish to get
+     * a copy of the request that represents the request state when it was
+     * initially logged by the history subscriber.
+     *
+     * @param bool $asSent Set to true to get a clone of the last request that
+     *                     has not been mutated since the request was received
+     *                     by the history subscriber.
+     *
+     * @return RequestInterface
+     */
+    public function getLastRequest($asSent = false)
+    {
+        return $asSent
+            ? end($this->transactions)['sent_request']
+            : end($this->transactions)['request'];
+    }
+
+    /**
+     * Get the last response in the history
+     *
+     * @return ResponseInterface|null
+     */
+    public function getLastResponse()
+    {
+        return end($this->transactions)['response'];
+    }
+
+    /**
+     * Clears the history
+     */
+    public function clear()
+    {
+        $this->transactions = array();
+    }
+
+    /**
+     * Add a request to the history
+     *
+     * @param RequestInterface  $request  Request to add
+     * @param ResponseInterface $response Response of the request
+     */
+    private function add(
+        RequestInterface $request,
+        ResponseInterface $response = null
+    ) {
+        $this->transactions[] = [
+            'request'      => $request,
+            'sent_request' => clone $request,
+            'response'     => $response
+        ];
+        if (count($this->transactions) > $this->limit) {
+            array_shift($this->transactions);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Subscriber/HttpError.php
@@ -0,0 +1,36 @@
+<?php
+namespace GuzzleHttp\Subscriber;
+
+use GuzzleHttp\Event\CompleteEvent;
+use GuzzleHttp\Event\RequestEvents;
+use GuzzleHttp\Event\SubscriberInterface;
+use GuzzleHttp\Exception\RequestException;
+
+/**
+ * Throws exceptions when a 4xx or 5xx response is received
+ */
+class HttpError implements SubscriberInterface
+{
+    public function getEvents()
+    {
+        return ['complete' => ['onComplete', RequestEvents::VERIFY_RESPONSE]];
+    }
+
+    /**
+     * Throw a RequestException on an HTTP protocol error
+     *
+     * @param CompleteEvent $event Emitted event
+     * @throws RequestException
+     */
+    public function onComplete(CompleteEvent $event)
+    {
+        $code = (string) $event->getResponse()->getStatusCode();
+        // Throw an exception for an unsuccessful response
+        if ($code[0] >= 4) {
+            throw RequestException::create(
+                $event->getRequest(),
+                $event->getResponse()
+            );
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Subscriber/Mock.php
@@ -0,0 +1,147 @@
+<?php
+namespace GuzzleHttp\Subscriber;
+
+use GuzzleHttp\Event\RequestEvents;
+use GuzzleHttp\Event\SubscriberInterface;
+use GuzzleHttp\Event\BeforeEvent;
+use GuzzleHttp\Exception\RequestException;
+use GuzzleHttp\Message\MessageFactory;
+use GuzzleHttp\Message\ResponseInterface;
+use GuzzleHttp\Stream\StreamInterface;
+
+/**
+ * Queues mock responses or exceptions and delivers mock responses or
+ * exceptions in a fifo order.
+ */
+class Mock implements SubscriberInterface, \Countable
+{
+    /** @var array Array of mock responses / exceptions */
+    private $queue = [];
+
+    /** @var bool Whether or not to consume an entity body when mocking */
+    private $readBodies;
+
+    /** @var MessageFactory */
+    private $factory;
+
+    /**
+     * @param array $items      Array of responses or exceptions to queue
+     * @param bool  $readBodies Set to false to not consume the entity body of
+     *                          a request when a mock is served.
+     */
+    public function __construct(array $items = [], $readBodies = true)
+    {
+        $this->factory = new MessageFactory();
+        $this->readBodies = $readBodies;
+        $this->addMultiple($items);
+    }
+
+    public function getEvents()
+    {
+        // Fire the event last, after signing
+        return ['before' => ['onBefore', RequestEvents::SIGN_REQUEST - 10]];
+    }
+
+    /**
+     * @throws \OutOfBoundsException|\Exception
+     */
+    public function onBefore(BeforeEvent $event)
+    {
+        if (!$item = array_shift($this->queue)) {
+            throw new \OutOfBoundsException('Mock queue is empty');
+        } elseif ($item instanceof RequestException) {
+            throw $item;
+        }
+
+        // Emulate reading a response body
+        $request = $event->getRequest();
+        if ($this->readBodies && $request->getBody()) {
+            while (!$request->getBody()->eof()) {
+                $request->getBody()->read(8096);
+            }
+        }
+
+        $saveTo = $event->getRequest()->getConfig()->get('save_to');
+
+        if (null !== $saveTo) {
+            $body = $item->getBody();
+
+            if (is_resource($saveTo)) {
+                fwrite($saveTo, $body);
+            } elseif (is_string($saveTo)) {
+                file_put_contents($saveTo, $body);
+            } elseif ($saveTo instanceof StreamInterface) {
+                $saveTo->write($body);
+            }
+        }
+
+        $event->intercept($item);
+    }
+
+    public function count()
+    {
+        return count($this->queue);
+    }
+
+    /**
+     * Add a response to the end of the queue
+     *
+     * @param string|ResponseInterface $response Response or path to response file
+     *
+     * @return self
+     * @throws \InvalidArgumentException if a string or Response is not passed
+     */
+    public function addResponse($response)
+    {
+        if (is_string($response)) {
+            $response = file_exists($response)
+                ? $this->factory->fromMessage(file_get_contents($response))
+                : $this->factory->fromMessage($response);
+        } elseif (!($response instanceof ResponseInterface)) {
+            throw new \InvalidArgumentException('Response must a message '
+                . 'string, response object, or path to a file');
+        }
+
+        $this->queue[] = $response;
+
+        return $this;
+    }
+
+    /**
+     * Add an exception to the end of the queue
+     *
+     * @param RequestException $e Exception to throw when the request is executed
+     *
+     * @return self
+     */
+    public function addException(RequestException $e)
+    {
+        $this->queue[] = $e;
+
+        return $this;
+    }
+
+    /**
+     * Add multiple items to the queue
+     *
+     * @param array $items Items to add
+     */
+    public function addMultiple(array $items)
+    {
+        foreach ($items as $item) {
+            if ($item instanceof RequestException) {
+                $this->addException($item);
+            } else {
+                $this->addResponse($item);
+            }
+        }
+    }
+
+    /**
+     * Clear the queue
+     */
+    public function clearQueue()
+    {
+        $this->queue = [];
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Subscriber/Prepare.php
@@ -0,0 +1,130 @@
+<?php
+namespace GuzzleHttp\Subscriber;
+
+use GuzzleHttp\Event\BeforeEvent;
+use GuzzleHttp\Event\RequestEvents;
+use GuzzleHttp\Event\SubscriberInterface;
+use GuzzleHttp\Message\AppliesHeadersInterface;
+use GuzzleHttp\Message\RequestInterface;
+use GuzzleHttp\Mimetypes;
+use GuzzleHttp\Stream\StreamInterface;
+
+/**
+ * Prepares requests with a body before sending
+ *
+ * **Request Options**
+ *
+ * - expect: Set to true to enable the "Expect: 100-Continue" header for a
+ *   request that send a body. Set to false to disable "Expect: 100-Continue".
+ *   Set to a number so that the size of the payload must be greater than the
+ *   number in order to send the Expect header. Setting to a number will send
+ *   the Expect header for all requests in which the size of the payload cannot
+ *   be determined or where the body is not rewindable.
+ */
+class Prepare implements SubscriberInterface
+{
+    public function getEvents()
+    {
+        return ['before' => ['onBefore', RequestEvents::PREPARE_REQUEST]];
+    }
+
+    public function onBefore(BeforeEvent $event)
+    {
+        $request = $event->getRequest();
+
+        // Set the appropriate Content-Type for a request if one is not set and
+        // there are form fields
+        if (!($body = $request->getBody())) {
+            return;
+        }
+
+        $this->addContentLength($request, $body);
+
+        if ($body instanceof AppliesHeadersInterface) {
+            // Synchronize the body with the request headers
+            $body->applyRequestHeaders($request);
+        } elseif (!$request->hasHeader('Content-Type')) {
+            $this->addContentType($request, $body);
+        }
+
+        $this->addExpectHeader($request, $body);
+    }
+
+    private function addContentType(
+        RequestInterface $request,
+        StreamInterface $body
+    ) {
+        if (!($uri = $body->getMetadata('uri'))) {
+            return;
+        }
+
+        // Guess the content-type based on the stream's "uri" metadata value.
+        // The file extension is used to determine the appropriate mime-type.
+        if ($contentType = Mimetypes::getInstance()->fromFilename($uri)) {
+            $request->setHeader('Content-Type', $contentType);
+        }
+    }
+
+    private function addContentLength(
+        RequestInterface $request,
+        StreamInterface $body
+    ) {
+        // Set the Content-Length header if it can be determined, and never
+        // send a Transfer-Encoding: chunked and Content-Length header in
+        // the same request.
+        if ($request->hasHeader('Content-Length')) {
+            // Remove transfer-encoding if content-length is set.
+            $request->removeHeader('Transfer-Encoding');
+            return;
+        }
+
+        if ($request->hasHeader('Transfer-Encoding')) {
+            return;
+        }
+
+        if (null !== ($size = $body->getSize())) {
+            $request->setHeader('Content-Length', $size);
+            $request->removeHeader('Transfer-Encoding');
+        } elseif ('1.1' == $request->getProtocolVersion()) {
+            // Use chunked Transfer-Encoding if there is no determinable
+            // content-length header and we're using HTTP/1.1.
+            $request->setHeader('Transfer-Encoding', 'chunked');
+            $request->removeHeader('Content-Length');
+        }
+    }
+
+    private function addExpectHeader(
+        RequestInterface $request,
+        StreamInterface $body
+    ) {
+        // Determine if the Expect header should be used
+        if ($request->hasHeader('Expect')) {
+            return;
+        }
+
+        $expect = $request->getConfig()['expect'];
+
+        // Return if disabled or if you're not using HTTP/1.1
+        if ($expect === false || $request->getProtocolVersion() !== '1.1') {
+            return;
+        }
+
+        // The expect header is unconditionally enabled
+        if ($expect === true) {
+            $request->setHeader('Expect', '100-Continue');
+            return;
+        }
+
+        // By default, send the expect header when the payload is > 1mb
+        if ($expect === null) {
+            $expect = 1048576;
+        }
+
+        // Always add if the body cannot be rewound, the size cannot be
+        // determined, or the size is greater than the cutoff threshold
+        $size = $body->getSize();
+        if ($size === null || $size >= (int) $expect || !$body->isSeekable()) {
+            $request->setHeader('Expect', '100-Continue');
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Subscriber/Redirect.php
@@ -0,0 +1,176 @@
+<?php
+namespace GuzzleHttp\Subscriber;
+
+use GuzzleHttp\Event\CompleteEvent;
+use GuzzleHttp\Event\RequestEvents;
+use GuzzleHttp\Event\SubscriberInterface;
+use GuzzleHttp\Exception\BadResponseException;
+use GuzzleHttp\Exception\CouldNotRewindStreamException;
+use GuzzleHttp\Exception\TooManyRedirectsException;
+use GuzzleHttp\Message\RequestInterface;
+use GuzzleHttp\Message\ResponseInterface;
+use GuzzleHttp\Url;
+
+/**
+ * Subscriber used to implement HTTP redirects.
+ *
+ * **Request options**
+ *
+ * - redirect: Associative array containing the 'max', 'strict', and 'referer'
+ *   keys.
+ *
+ *   - max: Maximum number of redirects allowed per-request
+ *   - strict: You can use strict redirects by setting this value to ``true``.
+ *     Strict redirects adhere to strict RFC compliant redirection (e.g.,
+ *     redirect POST with POST) vs doing what most clients do (e.g., redirect
+ *     POST request with a GET request).
+ *   - referer: Set to true to automatically add the "Referer" header when a
+ *     redirect request is sent.
+ *   - protocols: Array of allowed protocols. Defaults to 'http' and 'https'.
+ *     When a redirect attempts to utilize a protocol that is not white listed,
+ *     an exception is thrown.
+ */
+class Redirect implements SubscriberInterface
+{
+    public function getEvents()
+    {
+        return ['complete' => ['onComplete', RequestEvents::REDIRECT_RESPONSE]];
+    }
+
+    /**
+     * Rewind the entity body of the request if needed
+     *
+     * @param RequestInterface $redirectRequest
+     * @throws CouldNotRewindStreamException
+     */
+    public static function rewindEntityBody(RequestInterface $redirectRequest)
+    {
+        // Rewind the entity body of the request if needed
+        if ($body = $redirectRequest->getBody()) {
+            // Only rewind the body if some of it has been read already, and
+            // throw an exception if the rewind fails
+            if ($body->tell() && !$body->seek(0)) {
+                throw new CouldNotRewindStreamException(
+                    'Unable to rewind the non-seekable request body after redirecting',
+                    $redirectRequest
+                );
+            }
+        }
+    }
+
+    /**
+     * Called when a request receives a redirect response
+     *
+     * @param CompleteEvent $event Event emitted
+     * @throws TooManyRedirectsException
+     */
+    public function onComplete(CompleteEvent $event)
+    {
+        $response = $event->getResponse();
+
+        if (substr($response->getStatusCode(), 0, 1) != '3'
+            || !$response->hasHeader('Location')
+        ) {
+            return;
+        }
+
+        $request = $event->getRequest();
+        $config = $request->getConfig();
+
+        // Increment the redirect and initialize the redirect state.
+        if ($redirectCount = $config['redirect_count']) {
+            $config['redirect_count'] = ++$redirectCount;
+        } else {
+            $config['redirect_scheme'] = $request->getScheme();
+            $config['redirect_count'] = $redirectCount = 1;
+        }
+
+        $max = $config->getPath('redirect/max') ?: 5;
+
+        if ($redirectCount > $max) {
+            throw new TooManyRedirectsException(
+                "Will not follow more than {$redirectCount} redirects",
+                $request
+            );
+        }
+
+        $this->modifyRedirectRequest($request, $response);
+        $event->retry();
+    }
+
+    private function modifyRedirectRequest(
+        RequestInterface $request,
+        ResponseInterface $response
+    ) {
+        $config = $request->getConfig();
+        $protocols = $config->getPath('redirect/protocols') ?: ['http', 'https'];
+
+        // Use a GET request if this is an entity enclosing request and we are
+        // not forcing RFC compliance, but rather emulating what all browsers
+        // would do.
+        $statusCode = $response->getStatusCode();
+        if ($statusCode == 303 ||
+            ($statusCode <= 302 && $request->getBody() && !$config->getPath('redirect/strict'))
+        ) {
+            $request->setMethod('GET');
+            $request->setBody(null);
+        }
+
+        $previousUrl = $request->getUrl();
+        $this->setRedirectUrl($request, $response, $protocols);
+        $this->rewindEntityBody($request);
+
+        // Add the Referer header if it is told to do so and only
+        // add the header if we are not redirecting from https to http.
+        if ($config->getPath('redirect/referer')
+            && ($request->getScheme() == 'https' || $request->getScheme() == $config['redirect_scheme'])
+        ) {
+            $url = Url::fromString($previousUrl);
+            $url->setUsername(null);
+            $url->setPassword(null);
+            $request->setHeader('Referer', (string) $url);
+        } else {
+            $request->removeHeader('Referer');
+        }
+    }
+
+    /**
+     * Set the appropriate URL on the request based on the location header
+     *
+     * @param RequestInterface  $request
+     * @param ResponseInterface $response
+     * @param array             $protocols
+     */
+    private function setRedirectUrl(
+        RequestInterface $request,
+        ResponseInterface $response,
+        array $protocols
+    ) {
+        $location = $response->getHeader('Location');
+        $location = Url::fromString($location);
+
+        // Combine location with the original URL if it is not absolute.
+        if (!$location->isAbsolute()) {
+            $originalUrl = Url::fromString($request->getUrl());
+            // Remove query string parameters and just take what is present on
+            // the redirect Location header
+            $originalUrl->getQuery()->clear();
+            $location = $originalUrl->combine($location);
+        }
+
+        // Ensure that the redirect URL is allowed based on the protocols.
+        if (!in_array($location->getScheme(), $protocols)) {
+            throw new BadResponseException(
+                sprintf(
+                    'Redirect URL, %s, does not use one of the allowed redirect protocols: %s',
+                    $location,
+                    implode(', ', $protocols)
+                ),
+                $request,
+                $response
+            );
+        }
+
+        $request->setUrl($location);
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/ToArrayInterface.php
@@ -0,0 +1,15 @@
+<?php
+namespace GuzzleHttp;
+
+/**
+ * An object that can be represented as an array
+ */
+interface ToArrayInterface
+{
+    /**
+     * Get the array representation of an object
+     *
+     * @return array
+     */
+    public function toArray();
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Transaction.php
@@ -0,0 +1,103 @@
+<?php
+namespace GuzzleHttp;
+
+use GuzzleHttp\Message\RequestInterface;
+use GuzzleHttp\Message\ResponseInterface;
+
+/**
+ * Represents the relationship between a client, request, and response.
+ *
+ * You can access the request, response, and client using their corresponding
+ * public properties.
+ */
+class Transaction
+{
+    /**
+     * HTTP client used to transfer the request.
+     *
+     * @var ClientInterface
+     */
+    public $client;
+
+    /**
+     * The request that is being sent.
+     *
+     * @var RequestInterface
+     */
+    public $request;
+
+    /**
+     * The response associated with the transaction. A response will not be
+     * present when a networking error occurs or an error occurs before sending
+     * the request.
+     *
+     * @var ResponseInterface|null
+     */
+    public $response;
+
+    /**
+     * Exception associated with the transaction. If this exception is present
+     * when processing synchronous or future commands, then it is thrown. When
+     * intercepting a failed transaction, you MUST set this value to null in
+     * order to prevent the exception from being thrown.
+     *
+     * @var \Exception
+     */
+    public $exception;
+
+    /**
+     * Associative array of handler specific transfer statistics and custom
+     * key value pair information. When providing similar information, handlers
+     * should follow the same key value pair naming conventions as PHP's
+     * curl_getinfo() (http://php.net/manual/en/function.curl-getinfo.php).
+     *
+     * @var array
+     */
+    public $transferInfo = [];
+
+    /**
+     * The number of transaction retries.
+     *
+     * @var int
+     */
+    public $retries = 0;
+
+    /**
+     * The transaction's current state.
+     *
+     * @var string
+     */
+    public $state;
+
+    /**
+     * Whether or not this is a future transaction. This value should not be
+     * changed after the future is constructed.
+     *
+     * @var bool
+     */
+    public $future;
+
+    /**
+     * The number of state transitions that this transaction has been through.
+     *
+     * @var int
+     * @internal This is for internal use only. If you modify this, then you
+     *           are asking for trouble.
+     */
+    public $_transitionCount = 0;
+
+    /**
+     * @param ClientInterface  $client  Client that is used to send the requests
+     * @param RequestInterface $request Request to send
+     * @param bool             $future  Whether or not this is a future request.
+     */
+    public function __construct(
+        ClientInterface $client,
+        RequestInterface $request,
+        $future = false
+    ) {
+        $this->client = $client;
+        $this->request = $request;
+        $this->_future = $future;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/UriTemplate.php
@@ -0,0 +1,241 @@
+<?php
+namespace GuzzleHttp;
+
+/**
+ * Expands URI templates. Userland implementation of PECL uri_template.
+ *
+ * @link http://tools.ietf.org/html/rfc6570
+ */
+class UriTemplate
+{
+    /** @var string URI template */
+    private $template;
+
+    /** @var array Variables to use in the template expansion */
+    private $variables;
+
+    /** @var array Hash for quick operator lookups */
+    private static $operatorHash = array(
+        ''  => array('prefix' => '',  'joiner' => ',', 'query' => false),
+        '+' => array('prefix' => '',  'joiner' => ',', 'query' => false),
+        '#' => array('prefix' => '#', 'joiner' => ',', 'query' => false),
+        '.' => array('prefix' => '.', 'joiner' => '.', 'query' => false),
+        '/' => array('prefix' => '/', 'joiner' => '/', 'query' => false),
+        ';' => array('prefix' => ';', 'joiner' => ';', 'query' => true),
+        '?' => array('prefix' => '?', 'joiner' => '&', 'query' => true),
+        '&' => array('prefix' => '&', 'joiner' => '&', 'query' => true)
+    );
+
+    /** @var array Delimiters */
+    private static $delims = array(':', '/', '?', '#', '[', ']', '@', '!', '$',
+        '&', '\'', '(', ')', '*', '+', ',', ';', '=');
+
+    /** @var array Percent encoded delimiters */
+    private static $delimsPct = array('%3A', '%2F', '%3F', '%23', '%5B', '%5D',
+        '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C',
+        '%3B', '%3D');
+
+    public function expand($template, array $variables)
+    {
+        if (false === strpos($template, '{')) {
+            return $template;
+        }
+
+        $this->template = $template;
+        $this->variables = $variables;
+
+        return preg_replace_callback(
+            '/\{([^\}]+)\}/',
+            [$this, 'expandMatch'],
+            $this->template
+        );
+    }
+
+    /**
+     * Parse an expression into parts
+     *
+     * @param string $expression Expression to parse
+     *
+     * @return array Returns an associative array of parts
+     */
+    private function parseExpression($expression)
+    {
+        $result = array();
+
+        if (isset(self::$operatorHash[$expression[0]])) {
+            $result['operator'] = $expression[0];
+            $expression = substr($expression, 1);
+        } else {
+            $result['operator'] = '';
+        }
+
+        foreach (explode(',', $expression) as $value) {
+            $value = trim($value);
+            $varspec = array();
+            if ($colonPos = strpos($value, ':')) {
+                $varspec['value'] = substr($value, 0, $colonPos);
+                $varspec['modifier'] = ':';
+                $varspec['position'] = (int) substr($value, $colonPos + 1);
+            } elseif (substr($value, -1) == '*') {
+                $varspec['modifier'] = '*';
+                $varspec['value'] = substr($value, 0, -1);
+            } else {
+                $varspec['value'] = (string) $value;
+                $varspec['modifier'] = '';
+            }
+            $result['values'][] = $varspec;
+        }
+
+        return $result;
+    }
+
+    /**
+     * Process an expansion
+     *
+     * @param array $matches Matches met in the preg_replace_callback
+     *
+     * @return string Returns the replacement string
+     */
+    private function expandMatch(array $matches)
+    {
+        static $rfc1738to3986 = array('+' => '%20', '%7e' => '~');
+
+        $replacements = array();
+        $parsed = self::parseExpression($matches[1]);
+        $prefix = self::$operatorHash[$parsed['operator']]['prefix'];
+        $joiner = self::$operatorHash[$parsed['operator']]['joiner'];
+        $useQuery = self::$operatorHash[$parsed['operator']]['query'];
+
+        foreach ($parsed['values'] as $value) {
+
+            if (!isset($this->variables[$value['value']])) {
+                continue;
+            }
+
+            $variable = $this->variables[$value['value']];
+            $actuallyUseQuery = $useQuery;
+            $expanded = '';
+
+            if (is_array($variable)) {
+
+                $isAssoc = $this->isAssoc($variable);
+                $kvp = array();
+                foreach ($variable as $key => $var) {
+
+                    if ($isAssoc) {
+                        $key = rawurlencode($key);
+                        $isNestedArray = is_array($var);
+                    } else {
+                        $isNestedArray = false;
+                    }
+
+                    if (!$isNestedArray) {
+                        $var = rawurlencode($var);
+                        if ($parsed['operator'] == '+' ||
+                            $parsed['operator'] == '#'
+                        ) {
+                            $var = $this->decodeReserved($var);
+                        }
+                    }
+
+                    if ($value['modifier'] == '*') {
+                        if ($isAssoc) {
+                            if ($isNestedArray) {
+                                // Nested arrays must allow for deeply nested
+                                // structures.
+                                $var = strtr(
+                                    http_build_query([$key => $var]),
+                                    $rfc1738to3986
+                                );
+                            } else {
+                                $var = $key . '=' . $var;
+                            }
+                        } elseif ($key > 0 && $actuallyUseQuery) {
+                            $var = $value['value'] . '=' . $var;
+                        }
+                    }
+
+                    $kvp[$key] = $var;
+                }
+
+                if (empty($variable)) {
+                    $actuallyUseQuery = false;
+                } elseif ($value['modifier'] == '*') {
+                    $expanded = implode($joiner, $kvp);
+                    if ($isAssoc) {
+                        // Don't prepend the value name when using the explode
+                        // modifier with an associative array.
+                        $actuallyUseQuery = false;
+                    }
+                } else {
+                    if ($isAssoc) {
+                        // When an associative array is encountered and the
+                        // explode modifier is not set, then the result must be
+                        // a comma separated list of keys followed by their
+                        // respective values.
+                        foreach ($kvp as $k => &$v) {
+                            $v = $k . ',' . $v;
+                        }
+                    }
+                    $expanded = implode(',', $kvp);
+                }
+
+            } else {
+                if ($value['modifier'] == ':') {
+                    $variable = substr($variable, 0, $value['position']);
+                }
+                $expanded = rawurlencode($variable);
+                if ($parsed['operator'] == '+' || $parsed['operator'] == '#') {
+                    $expanded = $this->decodeReserved($expanded);
+                }
+            }
+
+            if ($actuallyUseQuery) {
+                if (!$expanded && $joiner != '&') {
+                    $expanded = $value['value'];
+                } else {
+                    $expanded = $value['value'] . '=' . $expanded;
+                }
+            }
+
+            $replacements[] = $expanded;
+        }
+
+        $ret = implode($joiner, $replacements);
+        if ($ret && $prefix) {
+            return $prefix . $ret;
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Determines if an array is associative.
+     *
+     * This makes the assumption that input arrays are sequences or hashes.
+     * This assumption is a tradeoff for accuracy in favor of speed, but it
+     * should work in almost every case where input is supplied for a URI
+     * template.
+     *
+     * @param array $array Array to check
+     *
+     * @return bool
+     */
+    private function isAssoc(array $array)
+    {
+        return $array && array_keys($array)[0] !== 0;
+    }
+
+    /**
+     * Removes percent encoding on reserved characters (used with + and #
+     * modifiers).
+     *
+     * @param string $string String to fix
+     *
+     * @return string
+     */
+    private function decodeReserved($string)
+    {
+        return str_replace(self::$delimsPct, self::$delims, $string);
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Url.php
@@ -0,0 +1,595 @@
+<?php
+namespace GuzzleHttp;
+
+use GuzzleHttp\Ring\Core;
+
+/**
+ * Parses and generates URLs based on URL parts
+ */
+class Url
+{
+    private $scheme;
+    private $host;
+    private $port;
+    private $username;
+    private $password;
+    private $path = '';
+    private $fragment;
+    private static $defaultPorts = ['http' => 80, 'https' => 443, 'ftp' => 21];
+    private static $pathPattern = '/[^a-zA-Z0-9\-\._~!\$&\'\(\)\*\+,;=%:@\/]+|%(?![A-Fa-f0-9]{2})/';
+    private static $queryPattern = '/[^a-zA-Z0-9\-\._~!\$\'\(\)\*\+,;%:@\/\?=&]+|%(?![A-Fa-f0-9]{2})/';
+    /** @var Query|string Query part of the URL */
+    private $query;
+
+    /**
+     * Factory method to create a new URL from a URL string
+     *
+     * @param string $url Full URL used to create a Url object
+     *
+     * @return Url
+     * @throws \InvalidArgumentException
+     */
+    public static function fromString($url)
+    {
+        static $defaults = ['scheme' => null, 'host' => null,
+            'path' => null, 'port' => null, 'query' => null,
+            'user' => null, 'pass' => null, 'fragment' => null];
+
+        if (false === ($parts = parse_url($url))) {
+            throw new \InvalidArgumentException('Unable to parse malformed '
+                . 'url: ' . $url);
+        }
+
+        $parts += $defaults;
+
+        // Convert the query string into a Query object
+        if ($parts['query'] || 0 !== strlen($parts['query'])) {
+            $parts['query'] = Query::fromString($parts['query']);
+        }
+
+        return new static($parts['scheme'], $parts['host'], $parts['user'],
+            $parts['pass'], $parts['port'], $parts['path'], $parts['query'],
+            $parts['fragment']);
+    }
+
+    /**
+     * Build a URL from parse_url parts. The generated URL will be a relative
+     * URL if a scheme or host are not provided.
+     *
+     * @param array $parts Array of parse_url parts
+     *
+     * @return string
+     */
+    public static function buildUrl(array $parts)
+    {
+        $url = $scheme = '';
+
+        if (!empty($parts['scheme'])) {
+            $scheme = $parts['scheme'];
+            $url .= $scheme . ':';
+        }
+
+        if (!empty($parts['host'])) {
+            $url .= '//';
+            if (isset($parts['user'])) {
+                $url .= $parts['user'];
+                if (isset($parts['pass'])) {
+                    $url .= ':' . $parts['pass'];
+                }
+                $url .=  '@';
+            }
+
+            $url .= $parts['host'];
+
+            // Only include the port if it is not the default port of the scheme
+            if (isset($parts['port']) &&
+                (!isset(self::$defaultPorts[$scheme]) ||
+                 $parts['port'] != self::$defaultPorts[$scheme])
+            ) {
+                $url .= ':' . $parts['port'];
+            }
+        }
+
+        // Add the path component if present
+        if (isset($parts['path']) && strlen($parts['path'])) {
+            // Always ensure that the path begins with '/' if set and something
+            // is before the path
+            if (!empty($parts['host']) && $parts['path'][0] != '/') {
+                $url .= '/';
+            }
+            $url .= $parts['path'];
+        }
+
+        // Add the query string if present
+        if (isset($parts['query'])) {
+            $queryStr = (string) $parts['query'];
+            if ($queryStr || $queryStr === '0') {
+                $url .= '?' . $queryStr;
+            }
+        }
+
+        // Ensure that # is only added to the url if fragment contains anything.
+        if (isset($parts['fragment'])) {
+            $url .= '#' . $parts['fragment'];
+        }
+
+        return $url;
+    }
+
+    /**
+     * Create a new URL from URL parts
+     *
+     * @param string             $scheme   Scheme of the URL
+     * @param string             $host     Host of the URL
+     * @param string             $username Username of the URL
+     * @param string             $password Password of the URL
+     * @param int                $port     Port of the URL
+     * @param string             $path     Path of the URL
+     * @param Query|array|string $query    Query string of the URL
+     * @param string             $fragment Fragment of the URL
+     */
+    public function __construct(
+        $scheme,
+        $host,
+        $username = null,
+        $password = null,
+        $port = null,
+        $path = null,
+        $query = null,
+        $fragment = null
+    ) {
+        $this->scheme = strtolower($scheme);
+        $this->host = $host;
+        $this->port = $port;
+        $this->username = $username;
+        $this->password = $password;
+        $this->fragment = $fragment;
+
+        if ($query) {
+            $this->setQuery($query);
+        }
+
+        $this->setPath($path);
+    }
+
+    /**
+     * Clone the URL
+     */
+    public function __clone()
+    {
+        if ($this->query instanceof Query) {
+            $this->query = clone $this->query;
+        }
+    }
+
+    /**
+     * Returns the URL as a URL string
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return static::buildUrl($this->getParts());
+    }
+
+    /**
+     * Get the parts of the URL as an array
+     *
+     * @return array
+     */
+    public function getParts()
+    {
+        return array(
+            'scheme'   => $this->scheme,
+            'user'     => $this->username,
+            'pass'     => $this->password,
+            'host'     => $this->host,
+            'port'     => $this->port,
+            'path'     => $this->path,
+            'query'    => $this->query,
+            'fragment' => $this->fragment,
+        );
+    }
+
+    /**
+     * Set the host of the request.
+     *
+     * @param string $host Host to set (e.g. www.yahoo.com, yahoo.com)
+     *
+     * @return Url
+     */
+    public function setHost($host)
+    {
+        if (strpos($host, ':') === false) {
+            $this->host = $host;
+        } else {
+            list($host, $port) = explode(':', $host);
+            $this->host = $host;
+            $this->setPort($port);
+        }
+    }
+
+    /**
+     * Get the host part of the URL
+     *
+     * @return string
+     */
+    public function getHost()
+    {
+        return $this->host;
+    }
+
+    /**
+     * Set the scheme part of the URL (http, https, ftp, etc.)
+     *
+     * @param string $scheme Scheme to set
+     */
+    public function setScheme($scheme)
+    {
+        // Remove the default port if one is specified
+        if ($this->port
+            && isset(self::$defaultPorts[$this->scheme])
+            && self::$defaultPorts[$this->scheme] == $this->port
+        ) {
+            $this->port = null;
+        }
+
+        $this->scheme = strtolower($scheme);
+    }
+
+    /**
+     * Get the scheme part of the URL
+     *
+     * @return string
+     */
+    public function getScheme()
+    {
+        return $this->scheme;
+    }
+
+    /**
+     * Set the port part of the URL
+     *
+     * @param int $port Port to set
+     */
+    public function setPort($port)
+    {
+        $this->port = $port;
+    }
+
+    /**
+     * Get the port part of the URl.
+     *
+     * If no port was set, this method will return the default port for the
+     * scheme of the URI.
+     *
+     * @return int|null
+     */
+    public function getPort()
+    {
+        if ($this->port) {
+            return $this->port;
+        } elseif (isset(self::$defaultPorts[$this->scheme])) {
+            return self::$defaultPorts[$this->scheme];
+        }
+
+        return null;
+    }
+
+    /**
+     * Set the path part of the URL.
+     *
+     * The provided URL is URL encoded as necessary.
+     *
+     * @param string $path Path string to set
+     */
+    public function setPath($path)
+    {
+        $this->path = self::encodePath($path);
+    }
+
+    /**
+     * Removes dot segments from a URL
+     * @link http://tools.ietf.org/html/rfc3986#section-5.2.4
+     */
+    public function removeDotSegments()
+    {
+        static $noopPaths = ['' => true, '/' => true, '*' => true];
+        static $ignoreSegments = ['.' => true, '..' => true];
+
+        if (isset($noopPaths[$this->path])) {
+            return;
+        }
+
+        $results = [];
+        $segments = $this->getPathSegments();
+        foreach ($segments as $segment) {
+            if ($segment == '..') {
+                array_pop($results);
+            } elseif (!isset($ignoreSegments[$segment])) {
+                $results[] = $segment;
+            }
+        }
+
+        $newPath = implode('/', $results);
+
+        // Add the leading slash if necessary
+        if (substr($this->path, 0, 1) === '/' &&
+            substr($newPath, 0, 1) !== '/'
+        ) {
+            $newPath = '/' . $newPath;
+        }
+
+        // Add the trailing slash if necessary
+        if ($newPath != '/' && isset($ignoreSegments[end($segments)])) {
+            $newPath .= '/';
+        }
+
+        $this->path = $newPath;
+    }
+
+    /**
+     * Add a relative path to the currently set path.
+     *
+     * @param string $relativePath Relative path to add
+     */
+    public function addPath($relativePath)
+    {
+        if ($relativePath != '/' &&
+            is_string($relativePath) &&
+            strlen($relativePath) > 0
+        ) {
+            // Add a leading slash if needed
+            if ($relativePath[0] !== '/' &&
+                substr($this->path, -1, 1) !== '/'
+            ) {
+                $relativePath = '/' . $relativePath;
+            }
+
+            $this->setPath($this->path . $relativePath);
+        }
+    }
+
+    /**
+     * Get the path part of the URL
+     *
+     * @return string
+     */
+    public function getPath()
+    {
+        return $this->path;
+    }
+
+    /**
+     * Get the path segments of the URL as an array
+     *
+     * @return array
+     */
+    public function getPathSegments()
+    {
+        return explode('/', $this->path);
+    }
+
+    /**
+     * Set the password part of the URL
+     *
+     * @param string $password Password to set
+     */
+    public function setPassword($password)
+    {
+        $this->password = $password;
+    }
+
+    /**
+     * Get the password part of the URL
+     *
+     * @return null|string
+     */
+    public function getPassword()
+    {
+        return $this->password;
+    }
+
+    /**
+     * Set the username part of the URL
+     *
+     * @param string $username Username to set
+     */
+    public function setUsername($username)
+    {
+        $this->username = $username;
+    }
+
+    /**
+     * Get the username part of the URl
+     *
+     * @return null|string
+     */
+    public function getUsername()
+    {
+        return $this->username;
+    }
+
+    /**
+     * Get the query part of the URL as a Query object
+     *
+     * @return Query
+     */
+    public function getQuery()
+    {
+        // Convert the query string to a query object if not already done.
+        if (!$this->query instanceof Query) {
+            $this->query = $this->query === null
+                ? new Query()
+                : Query::fromString($this->query);
+        }
+
+        return $this->query;
+    }
+
+    /**
+     * Set the query part of the URL.
+     *
+     * You may provide a query string as a string and pass $rawString as true
+     * to provide a query string that is not parsed until a call to getQuery()
+     * is made. Setting a raw query string will still encode invalid characters
+     * in a query string.
+     *
+     * @param Query|string|array $query Query string value to set. Can
+     *     be a string that will be parsed into a Query object, an array
+     *     of key value pairs, or a Query object.
+     * @param bool $rawString Set to true when providing a raw query string.
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function setQuery($query, $rawString = false)
+    {
+        if ($query instanceof Query) {
+            $this->query = $query;
+        } elseif (is_string($query)) {
+            if (!$rawString) {
+                $this->query = Query::fromString($query);
+            } else {
+                // Ensure the query does not have illegal characters.
+                $this->query = preg_replace_callback(
+                    self::$queryPattern,
+                    [__CLASS__, 'encodeMatch'],
+                    $query
+                );
+            }
+
+        } elseif (is_array($query)) {
+            $this->query = new Query($query);
+        } else {
+            throw new \InvalidArgumentException('Query must be a Query, '
+                . 'array, or string. Got ' . Core::describeType($query));
+        }
+    }
+
+    /**
+     * Get the fragment part of the URL
+     *
+     * @return null|string
+     */
+    public function getFragment()
+    {
+        return $this->fragment;
+    }
+
+    /**
+     * Set the fragment part of the URL
+     *
+     * @param string $fragment Fragment to set
+     */
+    public function setFragment($fragment)
+    {
+        $this->fragment = $fragment;
+    }
+
+    /**
+     * Check if this is an absolute URL
+     *
+     * @return bool
+     */
+    public function isAbsolute()
+    {
+        return $this->scheme && $this->host;
+    }
+
+    /**
+     * Combine the URL with another URL and return a new URL instance.
+     *
+     * Follows the rules specific in RFC 3986 section 5.4.
+     *
+     * @param string $url Relative URL to combine with
+     *
+     * @return Url
+     * @throws \InvalidArgumentException
+     * @link http://tools.ietf.org/html/rfc3986#section-5.4
+     */
+    public function combine($url)
+    {
+        $url = static::fromString($url);
+
+        // Use the more absolute URL as the base URL
+        if (!$this->isAbsolute() && $url->isAbsolute()) {
+            $url = $url->combine($this);
+        }
+
+        $parts = $url->getParts();
+
+        // Passing a URL with a scheme overrides everything
+        if ($parts['scheme']) {
+            return clone $url;
+        }
+
+        // Setting a host overrides the entire rest of the URL
+        if ($parts['host']) {
+            return new static(
+                $this->scheme,
+                $parts['host'],
+                $parts['user'],
+                $parts['pass'],
+                $parts['port'],
+                $parts['path'],
+                $parts['query'] instanceof Query
+                    ? clone $parts['query']
+                    : $parts['query'],
+                $parts['fragment']
+            );
+        }
+
+        if (!$parts['path'] && $parts['path'] !== '0') {
+            // The relative URL has no path, so check if it is just a query
+            $path = $this->path ?: '';
+            $query = $parts['query'] ?: $this->query;
+        } else {
+            $query = $parts['query'];
+            if ($parts['path'][0] == '/' || !$this->path) {
+                // Overwrite the existing path if the rel path starts with "/"
+                $path = $parts['path'];
+            } else {
+                // If the relative URL does not have a path or the base URL
+                // path does not end in a "/" then overwrite the existing path
+                // up to the last "/"
+                $path = substr($this->path, 0, strrpos($this->path, '/') + 1) . $parts['path'];
+            }
+        }
+
+        $result = new self(
+            $this->scheme,
+            $this->host,
+            $this->username,
+            $this->password,
+            $this->port,
+            $path,
+            $query instanceof Query ? clone $query : $query,
+            $parts['fragment']
+        );
+
+        if ($path) {
+            $result->removeDotSegments();
+        }
+
+        return $result;
+    }
+
+    /**
+     * Encodes the path part of a URL without double-encoding percent-encoded
+     * key value pairs.
+     *
+     * @param string $path Path to encode
+     *
+     * @return string
+     */
+    public static function encodePath($path)
+    {
+        static $cb = [__CLASS__, 'encodeMatch'];
+        return preg_replace_callback(self::$pathPattern, $cb, $path);
+    }
+
+    private static function encodeMatch(array $match)
+    {
+        return rawurlencode($match[0]);
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Utils.php
@@ -0,0 +1,211 @@
+<?php
+namespace GuzzleHttp;
+
+use GuzzleHttp\Ring\Client\CurlHandler;
+use GuzzleHttp\Ring\Client\CurlMultiHandler;
+use GuzzleHttp\Ring\Client\StreamHandler;
+use GuzzleHttp\Ring\Client\Middleware;
+
+/**
+ * Utility methods used throughout Guzzle.
+ */
+final class Utils
+{
+    /**
+     * Gets a value from an array using a path syntax to retrieve nested data.
+     *
+     * This method does not allow for keys that contain "/". You must traverse
+     * the array manually or using something more advanced like JMESPath to
+     * work with keys that contain "/".
+     *
+     *     // Get the bar key of a set of nested arrays.
+     *     // This is equivalent to $collection['foo']['baz']['bar'] but won't
+     *     // throw warnings for missing keys.
+     *     GuzzleHttp\get_path($data, 'foo/baz/bar');
+     *
+     * @param array  $data Data to retrieve values from
+     * @param string $path Path to traverse and retrieve a value from
+     *
+     * @return mixed|null
+     */
+    public static function getPath($data, $path)
+    {
+        $path = explode('/', $path);
+
+        while (null !== ($part = array_shift($path))) {
+            if (!is_array($data) || !isset($data[$part])) {
+                return null;
+            }
+            $data = $data[$part];
+        }
+
+        return $data;
+    }
+
+    /**
+     * Set a value in a nested array key. Keys will be created as needed to set
+     * the value.
+     *
+     * This function does not support keys that contain "/" or "[]" characters
+     * because these are special tokens used when traversing the data structure.
+     * A value may be prepended to an existing array by using "[]" as the final
+     * key of a path.
+     *
+     *     GuzzleHttp\get_path($data, 'foo/baz'); // null
+     *     GuzzleHttp\set_path($data, 'foo/baz/[]', 'a');
+     *     GuzzleHttp\set_path($data, 'foo/baz/[]', 'b');
+     *     GuzzleHttp\get_path($data, 'foo/baz');
+     *     // Returns ['a', 'b']
+     *
+     * @param array  $data  Data to modify by reference
+     * @param string $path  Path to set
+     * @param mixed  $value Value to set at the key
+     *
+     * @throws \RuntimeException when trying to setPath using a nested path
+     *     that travels through a scalar value.
+     */
+    public static function setPath(&$data, $path, $value)
+    {
+        $queue = explode('/', $path);
+        // Optimization for simple sets.
+        if (count($queue) === 1) {
+            $data[$path] = $value;
+            return;
+        }
+
+        $current =& $data;
+        while (null !== ($key = array_shift($queue))) {
+            if (!is_array($current)) {
+                throw new \RuntimeException("Trying to setPath {$path}, but "
+                    . "{$key} is set and is not an array");
+            } elseif (!$queue) {
+                if ($key == '[]') {
+                    $current[] = $value;
+                } else {
+                    $current[$key] = $value;
+                }
+            } elseif (isset($current[$key])) {
+                $current =& $current[$key];
+            } else {
+                $current[$key] = [];
+                $current =& $current[$key];
+            }
+        }
+    }
+
+    /**
+     * Expands a URI template
+     *
+     * @param string $template  URI template
+     * @param array  $variables Template variables
+     *
+     * @return string
+     */
+    public static function uriTemplate($template, array $variables)
+    {
+        if (function_exists('\\uri_template')) {
+            return \uri_template($template, $variables);
+        }
+
+        static $uriTemplate;
+        if (!$uriTemplate) {
+            $uriTemplate = new UriTemplate();
+        }
+
+        return $uriTemplate->expand($template, $variables);
+    }
+
+    /**
+     * Wrapper for JSON decode that implements error detection with helpful
+     * error messages.
+     *
+     * @param string $json    JSON data to parse
+     * @param bool $assoc     When true, returned objects will be converted
+     *                        into associative arrays.
+     * @param int    $depth   User specified recursion depth.
+     * @param int    $options Bitmask of JSON decode options.
+     *
+     * @return mixed
+     * @throws \InvalidArgumentException if the JSON cannot be parsed.
+     * @link http://www.php.net/manual/en/function.json-decode.php
+     */
+    public static function jsonDecode($json, $assoc = false, $depth = 512, $options = 0)
+    {
+        static $jsonErrors = [
+            JSON_ERROR_DEPTH => 'JSON_ERROR_DEPTH - Maximum stack depth exceeded',
+            JSON_ERROR_STATE_MISMATCH => 'JSON_ERROR_STATE_MISMATCH - Underflow or the modes mismatch',
+            JSON_ERROR_CTRL_CHAR => 'JSON_ERROR_CTRL_CHAR - Unexpected control character found',
+            JSON_ERROR_SYNTAX => 'JSON_ERROR_SYNTAX - Syntax error, malformed JSON',
+            JSON_ERROR_UTF8 => 'JSON_ERROR_UTF8 - Malformed UTF-8 characters, possibly incorrectly encoded'
+        ];
+
+        $data = \json_decode($json, $assoc, $depth, $options);
+
+        if (JSON_ERROR_NONE !== json_last_error()) {
+            $last = json_last_error();
+            throw new \InvalidArgumentException(
+                'Unable to parse JSON data: '
+                . (isset($jsonErrors[$last])
+                    ? $jsonErrors[$last]
+                    : 'Unknown error')
+            );
+        }
+
+        return $data;
+    }
+
+    /**
+     * Get the default User-Agent string to use with Guzzle
+     *
+     * @return string
+     */
+    public static function getDefaultUserAgent()
+    {
+        static $defaultAgent = '';
+        if (!$defaultAgent) {
+            $defaultAgent = 'Guzzle/' . ClientInterface::VERSION;
+            if (extension_loaded('curl')) {
+                $defaultAgent .= ' curl/' . curl_version()['version'];
+            }
+            $defaultAgent .= ' PHP/' . PHP_VERSION;
+        }
+
+        return $defaultAgent;
+    }
+
+    /**
+     * Create a default handler to use based on the environment
+     *
+     * @throws \RuntimeException if no viable Handler is available.
+     */
+    public static function getDefaultHandler()
+    {
+        $default = $future = null;
+
+        if (extension_loaded('curl')) {
+            $config = [
+                'select_timeout' => getenv('GUZZLE_CURL_SELECT_TIMEOUT') ?: 1
+            ];
+            if ($maxHandles = getenv('GUZZLE_CURL_MAX_HANDLES')) {
+                $config['max_handles'] = $maxHandles;
+            }
+            if (function_exists('curl_reset')) {
+                $default = new CurlHandler();
+                $future = new CurlMultiHandler($config);
+            } else {
+                $default = new CurlMultiHandler($config);
+            }
+        }
+
+        if (ini_get('allow_url_fopen')) {
+            $default = !$default
+                ? new StreamHandler()
+                : Middleware::wrapStreaming($default, new StreamHandler());
+        } elseif (!$default) {
+            throw new \RuntimeException('Guzzle requires cURL, the '
+                . 'allow_url_fopen ini setting, or a custom HTTP handler.');
+        }
+
+        return $future ? Middleware::wrapFuture($default, $future) : $default;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2014 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/composer.json
@@ -0,0 +1,39 @@
+{
+    "name": "guzzlehttp/ringphp",
+    "description": "Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function.",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Michael Dowling",
+            "email": "mtdowling@gmail.com",
+            "homepage": "https://github.com/mtdowling"
+        }
+    ],
+    "require": {
+        "php": ">=5.4.0",
+        "guzzlehttp/streams": "~3.0",
+        "react/promise": "~2.0"
+    },
+    "require-dev": {
+        "ext-curl": "*",
+        "phpunit/phpunit": "~4.0"
+    },
+    "suggest": {
+        "ext-curl": "Guzzle will use specific adapters if cURL is present"
+    },
+    "autoload": {
+        "psr-4": {
+            "GuzzleHttp\\Ring\\": "src/"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "GuzzleHttp\\Tests\\Ring\\": "tests/"
+        }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.1-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Client/ClientUtils.php
@@ -0,0 +1,74 @@
+<?php
+namespace GuzzleHttp\Ring\Client;
+
+/**
+ * Client specific utility functions.
+ */
+class ClientUtils
+{
+    /**
+     * Returns the default cacert bundle for the current system.
+     *
+     * First, the openssl.cafile and curl.cainfo php.ini settings are checked.
+     * If those settings are not configured, then the common locations for
+     * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X
+     * and Windows are checked. If any of these file locations are found on
+     * disk, they will be utilized.
+     *
+     * Note: the result of this function is cached for subsequent calls.
+     *
+     * @return string
+     * @throws \RuntimeException if no bundle can be found.
+     */
+    public static function getDefaultCaBundle()
+    {
+        static $cached = null;
+        static $cafiles = [
+            // Red Hat, CentOS, Fedora (provided by the ca-certificates package)
+            '/etc/pki/tls/certs/ca-bundle.crt',
+            // Ubuntu, Debian (provided by the ca-certificates package)
+            '/etc/ssl/certs/ca-certificates.crt',
+            // FreeBSD (provided by the ca_root_nss package)
+            '/usr/local/share/certs/ca-root-nss.crt',
+            // OS X provided by homebrew (using the default path)
+            '/usr/local/etc/openssl/cert.pem',
+            // Windows?
+            'C:\\windows\\system32\\curl-ca-bundle.crt',
+            'C:\\windows\\curl-ca-bundle.crt',
+        ];
+
+        if ($cached) {
+            return $cached;
+        }
+
+        if ($ca = ini_get('openssl.cafile')) {
+            return $cached = $ca;
+        }
+
+        if ($ca = ini_get('curl.cainfo')) {
+            return $cached = $ca;
+        }
+
+        foreach ($cafiles as $filename) {
+            if (file_exists($filename)) {
+                return $cached = $filename;
+            }
+        }
+
+        throw new \RuntimeException(self::CA_ERR);
+    }
+
+    const CA_ERR = "
+No system CA bundle could be found in any of the the common system locations.
+PHP versions earlier than 5.6 are not properly configured to use the system's
+CA bundle by default. In order to verify peer certificates, you will need to
+supply the path on disk to a certificate bundle to the 'verify' request
+option: http://docs.guzzlephp.org/en/latest/clients.html#verify. If you do not
+need a specific certificate bundle, then Mozilla provides a commonly used CA
+bundle which can be downloaded here (provided by the maintainer of cURL):
+https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt. Once
+you have a CA bundle available on disk, you can set the 'openssl.cafile' PHP
+ini setting to point to the path to the file, allowing you to omit the 'verify'
+request option. See http://curl.haxx.se/docs/sslcerts.html for more
+information.";
+}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Client/CurlFactory.php
@@ -0,0 +1,560 @@
+<?php
+namespace GuzzleHttp\Ring\Client;
+
+use GuzzleHttp\Ring\Core;
+use GuzzleHttp\Ring\Exception\ConnectException;
+use GuzzleHttp\Ring\Exception\RingException;
+use GuzzleHttp\Stream\LazyOpenStream;
+use GuzzleHttp\Stream\StreamInterface;
+
+/**
+ * Creates curl resources from a request
+ */
+class CurlFactory
+{
+    /**
+     * Creates a cURL handle, header resource, and body resource based on a
+     * transaction.
+     *
+     * @param array         $request Request hash
+     * @param null|resource $handle  Optionally provide a curl handle to modify
+     *
+     * @return array Returns an array of the curl handle, headers array, and
+     *               response body handle.
+     * @throws \RuntimeException when an option cannot be applied
+     */
+    public function __invoke(array $request, $handle = null)
+    {
+        $headers = [];
+        $options = $this->getDefaultOptions($request, $headers);
+        $this->applyMethod($request, $options);
+
+        if (isset($request['client'])) {
+            $this->applyHandlerOptions($request, $options);
+        }
+
+        $this->applyHeaders($request, $options);
+        unset($options['_headers']);
+
+        // Add handler options from the request's configuration options
+        if (isset($request['client']['curl'])) {
+            $options = $this->applyCustomCurlOptions(
+                $request['client']['curl'],
+                $options
+            );
+        }
+
+        if (!$handle) {
+            $handle = curl_init();
+        }
+
+        $body = $this->getOutputBody($request, $options);
+        curl_setopt_array($handle, $options);
+
+        return [$handle, &$headers, $body];
+    }
+
+    /**
+     * Creates a response hash from a cURL result.
+     *
+     * @param callable $handler  Handler that was used.
+     * @param array    $request  Request that sent.
+     * @param array    $response Response hash to update.
+     * @param array    $headers  Headers received during transfer.
+     * @param resource $body     Body fopen response.
+     *
+     * @return array
+     */
+    public static function createResponse(
+        callable $handler,
+        array $request,
+        array $response,
+        array $headers,
+        $body
+    ) {
+        if (isset($response['transfer_stats']['url'])) {
+            $response['effective_url'] = $response['transfer_stats']['url'];
+        }
+
+        if (!empty($headers)) {
+            $startLine = explode(' ', array_shift($headers), 3);
+            $headerList = Core::headersFromLines($headers);
+            $response['headers'] = $headerList;
+            $response['version'] = isset($startLine[0]) ? substr($startLine[0], 5) : null;
+            $response['status'] = isset($startLine[1]) ? (int) $startLine[1] : null;
+            $response['reason'] = isset($startLine[2]) ? $startLine[2] : null;
+            $response['body'] = $body;
+            Core::rewindBody($response);
+        }
+
+        return !empty($response['curl']['errno']) || !isset($response['status'])
+            ? self::createErrorResponse($handler, $request, $response)
+            : $response;
+    }
+
+    private static function createErrorResponse(
+        callable $handler,
+        array $request,
+        array $response
+    ) {
+        static $connectionErrors = [
+            CURLE_OPERATION_TIMEOUTED  => true,
+            CURLE_COULDNT_RESOLVE_HOST => true,
+            CURLE_COULDNT_CONNECT      => true,
+            CURLE_SSL_CONNECT_ERROR    => true,
+            CURLE_GOT_NOTHING          => true,
+        ];
+
+        // Retry when nothing is present or when curl failed to rewind.
+        if (!isset($response['err_message'])
+            && (empty($response['curl']['errno'])
+                || $response['curl']['errno'] == 65)
+        ) {
+            return self::retryFailedRewind($handler, $request, $response);
+        }
+
+        $message = isset($response['err_message'])
+            ? $response['err_message']
+            : sprintf('cURL error %s: %s',
+                $response['curl']['errno'],
+                isset($response['curl']['error'])
+                    ? $response['curl']['error']
+                    : 'See http://curl.haxx.se/libcurl/c/libcurl-errors.html');
+
+        $error = isset($response['curl']['errno'])
+            && isset($connectionErrors[$response['curl']['errno']])
+            ? new ConnectException($message)
+            : new RingException($message);
+
+        return $response + [
+            'status'  => null,
+            'reason'  => null,
+            'body'    => null,
+            'headers' => [],
+            'error'   => $error,
+        ];
+    }
+
+    private function getOutputBody(array $request, array &$options)
+    {
+        // Determine where the body of the response (if any) will be streamed.
+        if (isset($options[CURLOPT_WRITEFUNCTION])) {
+            return $request['client']['save_to'];
+        }
+
+        if (isset($options[CURLOPT_FILE])) {
+            return $options[CURLOPT_FILE];
+        }
+
+        if ($request['http_method'] != 'HEAD') {
+            // Create a default body if one was not provided
+            return $options[CURLOPT_FILE] = fopen('php://temp', 'w+');
+        }
+
+        return null;
+    }
+
+    private function getDefaultOptions(array $request, array &$headers)
+    {
+        $url = Core::url($request);
+        $startingResponse = false;
+
+        $options = [
+            '_headers'             => $request['headers'],
+            CURLOPT_CUSTOMREQUEST  => $request['http_method'],
+            CURLOPT_URL            => $url,
+            CURLOPT_RETURNTRANSFER => false,
+            CURLOPT_HEADER         => false,
+            CURLOPT_CONNECTTIMEOUT => 150,
+            CURLOPT_HEADERFUNCTION => function ($ch, $h) use (&$headers, &$startingResponse) {
+                $value = trim($h);
+                if ($value === '') {
+                    $startingResponse = true;
+                } elseif ($startingResponse) {
+                    $startingResponse = false;
+                    $headers = [$value];
+                } else {
+                    $headers[] = $value;
+                }
+                return strlen($h);
+            },
+        ];
+
+        if (isset($request['version'])) {
+            if ($request['version'] == 2.0) {
+                $options[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_2_0;
+            } else if ($request['version'] == 1.1) {
+                $options[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_1;
+            } else {
+                $options[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_0;
+            }
+        }
+
+        if (defined('CURLOPT_PROTOCOLS')) {
+            $options[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS;
+        }
+
+        return $options;
+    }
+
+    private function applyMethod(array $request, array &$options)
+    {
+        if (isset($request['body'])) {
+            $this->applyBody($request, $options);
+            return;
+        }
+
+        switch ($request['http_method']) {
+            case 'PUT':
+            case 'POST':
+                // See http://tools.ietf.org/html/rfc7230#section-3.3.2
+                if (!Core::hasHeader($request, 'Content-Length')) {
+                    $options[CURLOPT_HTTPHEADER][] = 'Content-Length: 0';
+                }
+                break;
+            case 'HEAD':
+                $options[CURLOPT_NOBODY] = true;
+                unset(
+                    $options[CURLOPT_WRITEFUNCTION],
+                    $options[CURLOPT_READFUNCTION],
+                    $options[CURLOPT_FILE],
+                    $options[CURLOPT_INFILE]
+                );
+        }
+    }
+
+    private function applyBody(array $request, array &$options)
+    {
+        $contentLength = Core::firstHeader($request, 'Content-Length');
+        $size = $contentLength !== null ? (int) $contentLength : null;
+
+        // Send the body as a string if the size is less than 1MB OR if the
+        // [client][curl][body_as_string] request value is set.
+        if (($size !== null && $size < 1000000) ||
+            isset($request['client']['curl']['body_as_string']) ||
+            is_string($request['body'])
+        ) {
+            $options[CURLOPT_POSTFIELDS] = Core::body($request);
+            // Don't duplicate the Content-Length header
+            $this->removeHeader('Content-Length', $options);
+            $this->removeHeader('Transfer-Encoding', $options);
+        } else {
+            $options[CURLOPT_UPLOAD] = true;
+            if ($size !== null) {
+                // Let cURL handle setting the Content-Length header
+                $options[CURLOPT_INFILESIZE] = $size;
+                $this->removeHeader('Content-Length', $options);
+            }
+            $this->addStreamingBody($request, $options);
+        }
+
+        // If the Expect header is not present, prevent curl from adding it
+        if (!Core::hasHeader($request, 'Expect')) {
+            $options[CURLOPT_HTTPHEADER][] = 'Expect:';
+        }
+
+        // cURL sometimes adds a content-type by default. Prevent this.
+        if (!Core::hasHeader($request, 'Content-Type')) {
+            $options[CURLOPT_HTTPHEADER][] = 'Content-Type:';
+        }
+    }
+
+    private function addStreamingBody(array $request, array &$options)
+    {
+        $body = $request['body'];
+
+        if ($body instanceof StreamInterface) {
+            $options[CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use ($body) {
+                return (string) $body->read($length);
+            };
+            if (!isset($options[CURLOPT_INFILESIZE])) {
+                if ($size = $body->getSize()) {
+                    $options[CURLOPT_INFILESIZE] = $size;
+                }
+            }
+        } elseif (is_resource($body)) {
+            $options[CURLOPT_INFILE] = $body;
+        } elseif ($body instanceof \Iterator) {
+            $buf = '';
+            $options[CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use ($body, &$buf) {
+                if ($body->valid()) {
+                    $buf .= $body->current();
+                    $body->next();
+                }
+                $result = (string) substr($buf, 0, $length);
+                $buf = substr($buf, $length);
+                return $result;
+            };
+        } else {
+            throw new \InvalidArgumentException('Invalid request body provided');
+        }
+    }
+
+    private function applyHeaders(array $request, array &$options)
+    {
+        foreach ($options['_headers'] as $name => $values) {
+            foreach ($values as $value) {
+                $options[CURLOPT_HTTPHEADER][] = "$name: $value";
+            }
+        }
+
+        // Remove the Accept header if one was not set
+        if (!Core::hasHeader($request, 'Accept')) {
+            $options[CURLOPT_HTTPHEADER][] = 'Accept:';
+        }
+    }
+
+    /**
+     * Takes an array of curl options specified in the 'curl' option of a
+     * request's configuration array and maps them to CURLOPT_* options.
+     *
+     * This method is only called when a  request has a 'curl' config setting.
+     *
+     * @param array $config  Configuration array of custom curl option
+     * @param array $options Array of existing curl options
+     *
+     * @return array Returns a new array of curl options
+     */
+    private function applyCustomCurlOptions(array $config, array $options)
+    {
+        $curlOptions = [];
+        foreach ($config as $key => $value) {
+            if (is_int($key)) {
+                $curlOptions[$key] = $value;
+            }
+        }
+
+        return $curlOptions + $options;
+    }
+
+    /**
+     * Remove a header from the options array.
+     *
+     * @param string $name    Case-insensitive header to remove
+     * @param array  $options Array of options to modify
+     */
+    private function removeHeader($name, array &$options)
+    {
+        foreach (array_keys($options['_headers']) as $key) {
+            if (!strcasecmp($key, $name)) {
+                unset($options['_headers'][$key]);
+                return;
+            }
+        }
+    }
+
+    /**
+     * Applies an array of request client options to a the options array.
+     *
+     * This method uses a large switch rather than double-dispatch to save on
+     * high overhead of calling functions in PHP.
+     */
+    private function applyHandlerOptions(array $request, array &$options)
+    {
+        foreach ($request['client'] as $key => $value) {
+            switch ($key) {
+            // Violating PSR-4 to provide more room.
+            case 'verify':
+
+                if ($value === false) {
+                    unset($options[CURLOPT_CAINFO]);
+                    $options[CURLOPT_SSL_VERIFYHOST] = 0;
+                    $options[CURLOPT_SSL_VERIFYPEER] = false;
+                    continue;
+                }
+
+                $options[CURLOPT_SSL_VERIFYHOST] = 2;
+                $options[CURLOPT_SSL_VERIFYPEER] = true;
+
+                if (is_string($value)) {
+                    $options[CURLOPT_CAINFO] = $value;
+                    if (!file_exists($value)) {
+                        throw new \InvalidArgumentException(
+                            "SSL CA bundle not found: $value"
+                        );
+                    }
+                }
+                break;
+
+            case 'decode_content':
+
+                if ($value === false) {
+                    continue;
+                }
+
+                $accept = Core::firstHeader($request, 'Accept-Encoding');
+                if ($accept) {
+                    $options[CURLOPT_ENCODING] = $accept;
+                } else {
+                    $options[CURLOPT_ENCODING] = '';
+                    // Don't let curl send the header over the wire
+                    $options[CURLOPT_HTTPHEADER][] = 'Accept-Encoding:';
+                }
+                break;
+
+            case 'save_to':
+
+                if (is_string($value)) {
+                    if (!is_dir(dirname($value))) {
+                        throw new \RuntimeException(sprintf(
+                            'Directory %s does not exist for save_to value of %s',
+                            dirname($value),
+                            $value
+                        ));
+                    }
+                    $value = new LazyOpenStream($value, 'w+');
+                }
+
+                if ($value instanceof StreamInterface) {
+                    $options[CURLOPT_WRITEFUNCTION] =
+                        function ($ch, $write) use ($value) {
+                            return $value->write($write);
+                        };
+                } elseif (is_resource($value)) {
+                    $options[CURLOPT_FILE] = $value;
+                } else {
+                    throw new \InvalidArgumentException('save_to must be a '
+                        . 'GuzzleHttp\Stream\StreamInterface or resource');
+                }
+                break;
+
+            case 'timeout':
+
+                if (defined('CURLOPT_TIMEOUT_MS')) {
+                    $options[CURLOPT_TIMEOUT_MS] = $value * 1000;
+                } else {
+                    $options[CURLOPT_TIMEOUT] = $value;
+                }
+                break;
+
+            case 'connect_timeout':
+
+                if (defined('CURLOPT_CONNECTTIMEOUT_MS')) {
+                    $options[CURLOPT_CONNECTTIMEOUT_MS] = $value * 1000;
+                } else {
+                    $options[CURLOPT_CONNECTTIMEOUT] = $value;
+                }
+                break;
+
+            case 'proxy':
+
+                if (!is_array($value)) {
+                    $options[CURLOPT_PROXY] = $value;
+                } elseif (isset($request['scheme'])) {
+                    $scheme = $request['scheme'];
+                    if (isset($value[$scheme])) {
+                        $options[CURLOPT_PROXY] = $value[$scheme];
+                    }
+                }
+                break;
+
+            case 'cert':
+
+                if (is_array($value)) {
+                    $options[CURLOPT_SSLCERTPASSWD] = $value[1];
+                    $value = $value[0];
+                }
+
+                if (!file_exists($value)) {
+                    throw new \InvalidArgumentException(
+                        "SSL certificate not found: {$value}"
+                    );
+                }
+
+                $options[CURLOPT_SSLCERT] = $value;
+                break;
+
+            case 'ssl_key':
+
+                if (is_array($value)) {
+                    $options[CURLOPT_SSLKEYPASSWD] = $value[1];
+                    $value = $value[0];
+                }
+
+                if (!file_exists($value)) {
+                    throw new \InvalidArgumentException(
+                        "SSL private key not found: {$value}"
+                    );
+                }
+
+                $options[CURLOPT_SSLKEY] = $value;
+                break;
+
+            case 'progress':
+
+                if (!is_callable($value)) {
+                    throw new \InvalidArgumentException(
+                        'progress client option must be callable'
+                    );
+                }
+
+                $options[CURLOPT_NOPROGRESS] = false;
+                $options[CURLOPT_PROGRESSFUNCTION] =
+                    function () use ($value) {
+                        $args = func_get_args();
+                        // PHP 5.5 pushed the handle onto the start of the args
+                        if (is_resource($args[0])) {
+                            array_shift($args);
+                        }
+                        call_user_func_array($value, $args);
+                    };
+                break;
+
+            case 'debug':
+
+                if ($value) {
+                    $options[CURLOPT_STDERR] = Core::getDebugResource($value);
+                    $options[CURLOPT_VERBOSE] = true;
+                }
+                break;
+            }
+        }
+    }
+
+    /**
+     * This function ensures that a response was set on a transaction. If one
+     * was not set, then the request is retried if possible. This error
+     * typically means you are sending a payload, curl encountered a
+     * "Connection died, retrying a fresh connect" error, tried to rewind the
+     * stream, and then encountered a "necessary data rewind wasn't possible"
+     * error, causing the request to be sent through curl_multi_info_read()
+     * without an error status.
+     */
+    private static function retryFailedRewind(
+        callable $handler,
+        array $request,
+        array $response
+    ) {
+        // If there is no body, then there is some other kind of issue. This
+        // is weird and should probably never happen.
+        if (!isset($request['body'])) {
+            $response['err_message'] = 'No response was received for a request '
+                . 'with no body. This could mean that you are saturating your '
+                . 'network.';
+            return self::createErrorResponse($handler, $request, $response);
+        }
+
+        if (!Core::rewindBody($request)) {
+            $response['err_message'] = 'The connection unexpectedly failed '
+                . 'without providing an error. The request would have been '
+                . 'retried, but attempting to rewind the request body failed.';
+            return self::createErrorResponse($handler, $request, $response);
+        }
+
+        // Retry no more than 3 times before giving up.
+        if (!isset($request['curl']['retries'])) {
+            $request['curl']['retries'] = 1;
+        } elseif ($request['curl']['retries'] == 2) {
+            $response['err_message'] = 'The cURL request was retried 3 times '
+                . 'and did no succeed. cURL was unable to rewind the body of '
+                . 'the request and subsequent retries resulted in the same '
+                . 'error. Turn on the debug option to see what went wrong. '
+                . 'See https://bugs.php.net/bug.php?id=47204 for more information.';
+            return self::createErrorResponse($handler, $request, $response);
+        } else {
+            $request['curl']['retries']++;
+        }
+
+        return $handler($request);
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Client/CurlHandler.php
@@ -0,0 +1,135 @@
+<?php
+namespace GuzzleHttp\Ring\Client;
+
+use GuzzleHttp\Ring\Future\CompletedFutureArray;
+use GuzzleHttp\Ring\Core;
+
+/**
+ * HTTP handler that uses cURL easy handles as a transport layer.
+ *
+ * Requires PHP 5.5+
+ *
+ * When using the CurlHandler, custom curl options can be specified as an
+ * associative array of curl option constants mapping to values in the
+ * **curl** key of the "client" key of the request.
+ */
+class CurlHandler
+{
+    /** @var callable */
+    private $factory;
+
+    /** @var array Array of curl easy handles */
+    private $handles = [];
+
+    /** @var array Array of owned curl easy handles */
+    private $ownedHandles = [];
+
+    /** @var int Total number of idle handles to keep in cache */
+    private $maxHandles;
+
+    /**
+     * Accepts an associative array of options:
+     *
+     * - factory: Optional callable factory used to create cURL handles.
+     *   The callable is passed a request hash when invoked, and returns an
+     *   array of the curl handle, headers resource, and body resource.
+     * - max_handles: Maximum number of idle handles (defaults to 5).
+     *
+     * @param array $options Array of options to use with the handler
+     */
+    public function __construct(array $options = [])
+    {
+        $this->handles = $this->ownedHandles = [];
+        $this->factory = isset($options['handle_factory'])
+            ? $options['handle_factory']
+            : new CurlFactory();
+        $this->maxHandles = isset($options['max_handles'])
+            ? $options['max_handles']
+            : 5;
+    }
+
+    public function __destruct()
+    {
+        foreach ($this->handles as $handle) {
+            if (is_resource($handle)) {
+                curl_close($handle);
+            }
+        }
+    }
+
+    /**
+     * @param array $request
+     *
+     * @return CompletedFutureArray
+     */
+    public function __invoke(array $request)
+    {
+        return new CompletedFutureArray(
+            $this->_invokeAsArray($request)
+        );
+    }
+
+    /**
+     * @internal
+     *
+     * @param array $request
+     *
+     * @return array
+     */
+    public function _invokeAsArray(array $request)
+    {
+        $factory = $this->factory;
+
+        // Ensure headers are by reference. They're updated elsewhere.
+        $result = $factory($request, $this->checkoutEasyHandle());
+        $h = $result[0];
+        $hd =& $result[1];
+        $bd = $result[2];
+        Core::doSleep($request);
+        curl_exec($h);
+        $response = ['transfer_stats' => curl_getinfo($h)];
+        $response['curl']['error'] = curl_error($h);
+        $response['curl']['errno'] = curl_errno($h);
+        $response['transfer_stats'] = array_merge($response['transfer_stats'], $response['curl']);
+        $this->releaseEasyHandle($h);
+
+        return CurlFactory::createResponse([$this, '_invokeAsArray'], $request, $response, $hd, $bd);
+    }
+
+    private function checkoutEasyHandle()
+    {
+        // Find an unused handle in the cache
+        if (false !== ($key = array_search(false, $this->ownedHandles, true))) {
+            $this->ownedHandles[$key] = true;
+            return $this->handles[$key];
+        }
+
+        // Add a new handle
+        $handle = curl_init();
+        $id = (int) $handle;
+        $this->handles[$id] = $handle;
+        $this->ownedHandles[$id] = true;
+
+        return $handle;
+    }
+
+    private function releaseEasyHandle($handle)
+    {
+        $id = (int) $handle;
+        if (count($this->ownedHandles) > $this->maxHandles) {
+            curl_close($this->handles[$id]);
+            unset($this->handles[$id], $this->ownedHandles[$id]);
+        } else {
+            // curl_reset doesn't clear these out for some reason
+            static $unsetValues = [
+                CURLOPT_HEADERFUNCTION   => null,
+                CURLOPT_WRITEFUNCTION    => null,
+                CURLOPT_READFUNCTION     => null,
+                CURLOPT_PROGRESSFUNCTION => null,
+            ];
+            curl_setopt_array($handle, $unsetValues);
+            curl_reset($handle);
+            $this->ownedHandles[$id] = false;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Client/CurlMultiHandler.php
@@ -0,0 +1,250 @@
+<?php
+namespace GuzzleHttp\Ring\Client;
+
+use GuzzleHttp\Ring\Future\FutureArray;
+use React\Promise\Deferred;
+
+/**
+ * Returns an asynchronous response using curl_multi_* functions.
+ *
+ * This handler supports future responses and the "delay" request client
+ * option that can be used to delay before sending a request.
+ *
+ * When using the CurlMultiHandler, custom curl options can be specified as an
+ * associative array of curl option constants mapping to values in the
+ * **curl** key of the "client" key of the request.
+ *
+ * @property resource $_mh Internal use only. Lazy loaded multi-handle.
+ */
+class CurlMultiHandler
+{
+    /** @var callable */
+    private $factory;
+    private $selectTimeout;
+    private $active;
+    private $handles = [];
+    private $delays = [];
+    private $maxHandles;
+
+    /**
+     * This handler accepts the following options:
+     *
+     * - mh: An optional curl_multi resource
+     * - handle_factory: An optional callable used to generate curl handle
+     *   resources. the callable accepts a request hash and returns an array
+     *   of the handle, headers file resource, and the body resource.
+     * - select_timeout: Optional timeout (in seconds) to block before timing
+     *   out while selecting curl handles. Defaults to 1 second.
+     * - max_handles: Optional integer representing the maximum number of
+     *   open requests. When this number is reached, the queued futures are
+     *   flushed.
+     *
+     * @param array $options
+     */
+    public function __construct(array $options = [])
+    {
+        if (isset($options['mh'])) {
+            $this->_mh = $options['mh'];
+        }
+        $this->factory = isset($options['handle_factory'])
+            ? $options['handle_factory'] : new CurlFactory();
+        $this->selectTimeout = isset($options['select_timeout'])
+            ? $options['select_timeout'] : 1;
+        $this->maxHandles = isset($options['max_handles'])
+            ? $options['max_handles'] : 100;
+    }
+
+    public function __get($name)
+    {
+        if ($name === '_mh') {
+            return $this->_mh = curl_multi_init();
+        }
+
+        throw new \BadMethodCallException();
+    }
+
+    public function __destruct()
+    {
+        // Finish any open connections before terminating the script.
+        if ($this->handles) {
+            $this->execute();
+        }
+
+        if (isset($this->_mh)) {
+            curl_multi_close($this->_mh);
+            unset($this->_mh);
+        }
+    }
+
+    public function __invoke(array $request)
+    {
+        $factory = $this->factory;
+        $result = $factory($request);
+        $entry = [
+            'request'  => $request,
+            'response' => [],
+            'handle'   => $result[0],
+            'headers'  => &$result[1],
+            'body'     => $result[2],
+            'deferred' => new Deferred(),
+        ];
+
+        $id = (int) $result[0];
+
+        $future = new FutureArray(
+            $entry['deferred']->promise(),
+            [$this, 'execute'],
+            function () use ($id) {
+                return $this->cancel($id);
+            }
+        );
+
+        $this->addRequest($entry);
+
+        // Transfer outstanding requests if there are too many open handles.
+        if (count($this->handles) >= $this->maxHandles) {
+            $this->execute();
+        }
+
+        return $future;
+    }
+
+    /**
+     * Runs until all outstanding connections have completed.
+     */
+    public function execute()
+    {
+        do {
+
+            if ($this->active &&
+                curl_multi_select($this->_mh, $this->selectTimeout) === -1
+            ) {
+                // Perform a usleep if a select returns -1.
+                // See: https://bugs.php.net/bug.php?id=61141
+                usleep(250);
+            }
+
+            // Add any delayed futures if needed.
+            if ($this->delays) {
+                $this->addDelays();
+            }
+
+            do {
+                $mrc = curl_multi_exec($this->_mh, $this->active);
+            } while ($mrc === CURLM_CALL_MULTI_PERFORM);
+
+            $this->processMessages();
+
+            // If there are delays but no transfers, then sleep for a bit.
+            if (!$this->active && $this->delays) {
+                usleep(500);
+            }
+
+        } while ($this->active || $this->handles);
+    }
+
+    private function addRequest(array &$entry)
+    {
+        $id = (int) $entry['handle'];
+        $this->handles[$id] = $entry;
+
+        // If the request is a delay, then add the reques to the curl multi
+        // pool only after the specified delay.
+        if (isset($entry['request']['client']['delay'])) {
+            $this->delays[$id] = microtime(true) + ($entry['request']['client']['delay'] / 1000);
+        } elseif (empty($entry['request']['future'])) {
+            curl_multi_add_handle($this->_mh, $entry['handle']);
+        } else {
+            curl_multi_add_handle($this->_mh, $entry['handle']);
+            // "lazy" futures are only sent once the pool has many requests.
+            if ($entry['request']['future'] !== 'lazy') {
+                do {
+                    $mrc = curl_multi_exec($this->_mh, $this->active);
+                } while ($mrc === CURLM_CALL_MULTI_PERFORM);
+                $this->processMessages();
+            }
+        }
+    }
+
+    private function removeProcessed($id)
+    {
+        if (isset($this->handles[$id])) {
+            curl_multi_remove_handle(
+                $this->_mh,
+                $this->handles[$id]['handle']
+            );
+            curl_close($this->handles[$id]['handle']);
+            unset($this->handles[$id], $this->delays[$id]);
+        }
+    }
+
+    /**
+     * Cancels a handle from sending and removes references to it.
+     *
+     * @param int $id Handle ID to cancel and remove.
+     *
+     * @return bool True on success, false on failure.
+     */
+    private function cancel($id)
+    {
+        // Cannot cancel if it has been processed.
+        if (!isset($this->handles[$id])) {
+            return false;
+        }
+
+        $handle = $this->handles[$id]['handle'];
+        unset($this->delays[$id], $this->handles[$id]);
+        curl_multi_remove_handle($this->_mh, $handle);
+        curl_close($handle);
+
+        return true;
+    }
+
+    private function addDelays()
+    {
+        $currentTime = microtime(true);
+
+        foreach ($this->delays as $id => $delay) {
+            if ($currentTime >= $delay) {
+                unset($this->delays[$id]);
+                curl_multi_add_handle(
+                    $this->_mh,
+                    $this->handles[$id]['handle']
+                );
+            }
+        }
+    }
+
+    private function processMessages()
+    {
+        while ($done = curl_multi_info_read($this->_mh)) {
+            $id = (int) $done['handle'];
+
+            if (!isset($this->handles[$id])) {
+                // Probably was cancelled.
+                continue;
+            }
+
+            $entry = $this->handles[$id];
+            $entry['response']['transfer_stats'] = curl_getinfo($done['handle']);
+
+            if ($done['result'] !== CURLM_OK) {
+                $entry['response']['curl']['errno'] = $done['result'];
+                if (function_exists('curl_strerror')) {
+                    $entry['response']['curl']['error'] = curl_strerror($done['result']);
+                }
+            }
+
+            $result = CurlFactory::createResponse(
+                $this,
+                $entry['request'],
+                $entry['response'],
+                $entry['headers'],
+                $entry['body']
+            );
+
+            $this->removeProcessed($id);
+            $entry['deferred']->resolve($result);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Client/Middleware.php
@@ -0,0 +1,58 @@
+<?php
+namespace GuzzleHttp\Ring\Client;
+
+/**
+ * Provides basic middleware wrappers.
+ *
+ * If a middleware is more complex than a few lines of code, then it should
+ * be implemented in a class rather than a static method.
+ */
+class Middleware
+{
+    /**
+     * Sends future requests to a future compatible handler while sending all
+     * other requests to a default handler.
+     *
+     * When the "future" option is not provided on a request, any future responses
+     * are automatically converted to synchronous responses and block.
+     *
+     * @param callable $default Handler used for non-streaming responses
+     * @param callable $future  Handler used for future responses
+     *
+     * @return callable Returns the composed handler.
+     */
+    public static function wrapFuture(
+        callable $default,
+        callable $future
+    ) {
+        return function (array $request) use ($default, $future) {
+            return empty($request['client']['future'])
+                ? $default($request)
+                : $future($request);
+        };
+    }
+
+    /**
+     * Sends streaming requests to a streaming compatible handler while sendin
+     * all other requests to a default handler.
+     *
+     * This, for example, could be useful for taking advantage of the
+     * performance benefits of curl while still supporting true streaming
+     * through the StreamHandler.
+     *
+     * @param callable $default   Handler used for non-streaming responses
+     * @param callable $streaming Handler used for streaming responses
+     *
+     * @return callable Returns the composed handler.
+     */
+    public static function wrapStreaming(
+        callable $default,
+        callable $streaming
+    ) {
+        return function (array $request) use ($default, $streaming) {
+            return empty($request['client']['stream'])
+                ? $default($request)
+                : $streaming($request);
+        };
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Client/MockHandler.php
@@ -0,0 +1,52 @@
+<?php
+namespace GuzzleHttp\Ring\Client;
+
+use GuzzleHttp\Ring\Core;
+use GuzzleHttp\Ring\Future\CompletedFutureArray;
+use GuzzleHttp\Ring\Future\FutureArrayInterface;
+
+/**
+ * Ring handler that returns a canned response or evaluated function result.
+ */
+class MockHandler
+{
+    /** @var callable|array|FutureArrayInterface */
+    private $result;
+
+    /**
+     * Provide an array or future to always return the same value. Provide a
+     * callable that accepts a request object and returns an array or future
+     * to dynamically create a response.
+     *
+     * @param array|FutureArrayInterface|callable $result Mock return value.
+     */
+    public function __construct($result)
+    {
+        $this->result = $result;
+    }
+
+    public function __invoke(array $request)
+    {
+        Core::doSleep($request);
+        $response = is_callable($this->result)
+            ? call_user_func($this->result, $request)
+            : $this->result;
+
+        if (is_array($response)) {
+            $response = new CompletedFutureArray($response + [
+                'status'        => null,
+                'body'          => null,
+                'headers'       => [],
+                'reason'        => null,
+                'effective_url' => null,
+            ]);
+        } elseif (!$response instanceof FutureArrayInterface) {
+            throw new \InvalidArgumentException(
+                'Response must be an array or FutureArrayInterface. Found '
+                . Core::describeType($request)
+            );
+        }
+
+        return $response;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Client/StreamHandler.php
@@ -0,0 +1,414 @@
+<?php
+namespace GuzzleHttp\Ring\Client;
+
+use GuzzleHttp\Ring\Core;
+use GuzzleHttp\Ring\Exception\ConnectException;
+use GuzzleHttp\Ring\Exception\RingException;
+use GuzzleHttp\Ring\Future\CompletedFutureArray;
+use GuzzleHttp\Stream\InflateStream;
+use GuzzleHttp\Stream\StreamInterface;
+use GuzzleHttp\Stream\Stream;
+use GuzzleHttp\Stream\Utils;
+
+/**
+ * RingPHP client handler that uses PHP's HTTP stream wrapper.
+ */
+class StreamHandler
+{
+    private $options;
+    private $lastHeaders;
+
+    public function __construct(array $options = [])
+    {
+        $this->options = $options;
+    }
+
+    public function __invoke(array $request)
+    {
+        $url = Core::url($request);
+        Core::doSleep($request);
+
+        try {
+            // Does not support the expect header.
+            $request = Core::removeHeader($request, 'Expect');
+            $stream = $this->createStream($url, $request);
+            return $this->createResponse($request, $url, $stream);
+        } catch (RingException $e) {
+            return $this->createErrorResponse($url, $e);
+        }
+    }
+
+    private function createResponse(array $request, $url, $stream)
+    {
+        $hdrs = $this->lastHeaders;
+        $this->lastHeaders = null;
+        $parts = explode(' ', array_shift($hdrs), 3);
+        $response = [
+            'version'        => substr($parts[0], 5),
+            'status'         => $parts[1],
+            'reason'         => isset($parts[2]) ? $parts[2] : null,
+            'headers'        => Core::headersFromLines($hdrs),
+            'effective_url'  => $url,
+        ];
+
+        $stream = $this->checkDecode($request, $response, $stream);
+
+        // If not streaming, then drain the response into a stream.
+        if (empty($request['client']['stream'])) {
+            $dest = isset($request['client']['save_to'])
+                ? $request['client']['save_to']
+                : fopen('php://temp', 'r+');
+            $stream = $this->drain($stream, $dest);
+        }
+
+        $response['body'] = $stream;
+
+        return new CompletedFutureArray($response);
+    }
+
+    private function checkDecode(array $request, array $response, $stream)
+    {
+        // Automatically decode responses when instructed.
+        if (!empty($request['client']['decode_content'])) {
+            switch (Core::firstHeader($response, 'Content-Encoding', true)) {
+                case 'gzip':
+                case 'deflate':
+                    $stream = new InflateStream(Stream::factory($stream));
+                    break;
+            }
+        }
+
+        return $stream;
+    }
+
+    /**
+     * Drains the stream into the "save_to" client option.
+     *
+     * @param resource                        $stream
+     * @param string|resource|StreamInterface $dest
+     *
+     * @return Stream
+     * @throws \RuntimeException when the save_to option is invalid.
+     */
+    private function drain($stream, $dest)
+    {
+        if (is_resource($stream)) {
+            if (!is_resource($dest)) {
+                $stream = Stream::factory($stream);
+            } else {
+                stream_copy_to_stream($stream, $dest);
+                fclose($stream);
+                rewind($dest);
+                return $dest;
+            }
+        }
+
+        // Stream the response into the destination stream
+        $dest = is_string($dest)
+            ? new Stream(Utils::open($dest, 'r+'))
+            : Stream::factory($dest);
+
+        Utils::copyToStream($stream, $dest);
+        $dest->seek(0);
+        $stream->close();
+
+        return $dest;
+    }
+
+    /**
+     * Creates an error response for the given stream.
+     *
+     * @param string        $url
+     * @param RingException $e
+     *
+     * @return array
+     */
+    private function createErrorResponse($url, RingException $e)
+    {
+        // Determine if the error was a networking error.
+        $message = $e->getMessage();
+
+        // This list can probably get more comprehensive.
+        if (strpos($message, 'getaddrinfo') // DNS lookup failed
+            || strpos($message, 'Connection refused')
+        ) {
+            $e = new ConnectException($e->getMessage(), 0, $e);
+        }
+
+        return new CompletedFutureArray([
+            'status'        => null,
+            'body'          => null,
+            'headers'       => [],
+            'effective_url' => $url,
+            'error'         => $e
+        ]);
+    }
+
+    /**
+     * Create a resource and check to ensure it was created successfully
+     *
+     * @param callable $callback Callable that returns stream resource
+     *
+     * @return resource
+     * @throws \RuntimeException on error
+     */
+    private function createResource(callable $callback)
+    {
+        $errors = null;
+        set_error_handler(function ($_, $msg, $file, $line) use (&$errors) {
+            $errors[] = [
+                'message' => $msg,
+                'file'    => $file,
+                'line'    => $line
+            ];
+            return true;
+        });
+
+        $resource = $callback();
+        restore_error_handler();
+
+        if (!$resource) {
+            $message = 'Error creating resource: ';
+            foreach ($errors as $err) {
+                foreach ($err as $key => $value) {
+                    $message .= "[$key] $value" . PHP_EOL;
+                }
+            }
+            throw new RingException(trim($message));
+        }
+
+        return $resource;
+    }
+
+    private function createStream($url, array $request)
+    {
+        static $methods;
+        if (!$methods) {
+            $methods = array_flip(get_class_methods(__CLASS__));
+        }
+
+        // HTTP/1.1 streams using the PHP stream wrapper require a
+        // Connection: close header
+        if ((!isset($request['version']) || $request['version'] == '1.1')
+            && !Core::hasHeader($request, 'Connection')
+        ) {
+            $request['headers']['Connection'] = ['close'];
+        }
+
+        // Ensure SSL is verified by default
+        if (!isset($request['client']['verify'])) {
+            $request['client']['verify'] = true;
+        }
+
+        $params = [];
+        $options = $this->getDefaultOptions($request);
+
+        if (isset($request['client'])) {
+            foreach ($request['client'] as $key => $value) {
+                $method = "add_{$key}";
+                if (isset($methods[$method])) {
+                    $this->{$method}($request, $options, $value, $params);
+                }
+            }
+        }
+
+        return $this->createStreamResource(
+            $url,
+            $request,
+            $options,
+            $this->createContext($request, $options, $params)
+        );
+    }
+
+    private function getDefaultOptions(array $request)
+    {
+        $headers = "";
+        foreach ($request['headers'] as $name => $value) {
+            foreach ((array) $value as $val) {
+                $headers .= "$name: $val\r\n";
+            }
+        }
+
+        $context = [
+            'http' => [
+                'method'           => $request['http_method'],
+                'header'           => $headers,
+                'protocol_version' => isset($request['version']) ? $request['version'] : 1.1,
+                'ignore_errors'    => true,
+                'follow_location'  => 0,
+            ],
+        ];
+
+        $body = Core::body($request);
+        if (isset($body)) {
+            $context['http']['content'] = $body;
+            // Prevent the HTTP handler from adding a Content-Type header.
+            if (!Core::hasHeader($request, 'Content-Type')) {
+                $context['http']['header'] .= "Content-Type:\r\n";
+            }
+        }
+
+        $context['http']['header'] = rtrim($context['http']['header']);
+
+        return $context;
+    }
+
+    private function add_proxy(array $request, &$options, $value, &$params)
+    {
+        if (!is_array($value)) {
+            $options['http']['proxy'] = $value;
+        } else {
+            $scheme = isset($request['scheme']) ? $request['scheme'] : 'http';
+            if (isset($value[$scheme])) {
+                $options['http']['proxy'] = $value[$scheme];
+            }
+        }
+    }
+
+    private function add_timeout(array $request, &$options, $value, &$params)
+    {
+        $options['http']['timeout'] = $value;
+    }
+
+    private function add_verify(array $request, &$options, $value, &$params)
+    {
+        if ($value === true) {
+            // PHP 5.6 or greater will find the system cert by default. When
+            // < 5.6, use the Guzzle bundled cacert.
+            if (PHP_VERSION_ID < 50600) {
+                $options['ssl']['cafile'] = ClientUtils::getDefaultCaBundle();
+            }
+        } elseif (is_string($value)) {
+            $options['ssl']['cafile'] = $value;
+            if (!file_exists($value)) {
+                throw new RingException("SSL CA bundle not found: $value");
+            }
+        } elseif ($value === false) {
+            $options['ssl']['verify_peer'] = false;
+            $options['ssl']['allow_self_signed'] = true;
+            return;
+        } else {
+            throw new RingException('Invalid verify request option');
+        }
+
+        $options['ssl']['verify_peer'] = true;
+        $options['ssl']['allow_self_signed'] = false;
+    }
+
+    private function add_cert(array $request, &$options, $value, &$params)
+    {
+        if (is_array($value)) {
+            $options['ssl']['passphrase'] = $value[1];
+            $value = $value[0];
+        }
+
+        if (!file_exists($value)) {
+            throw new RingException("SSL certificate not found: {$value}");
+        }
+
+        $options['ssl']['local_cert'] = $value;
+    }
+
+    private function add_progress(array $request, &$options, $value, &$params)
+    {
+        $fn = function ($code, $_1, $_2, $_3, $transferred, $total) use ($value) {
+            if ($code == STREAM_NOTIFY_PROGRESS) {
+                $value($total, $transferred, null, null);
+            }
+        };
+
+        // Wrap the existing function if needed.
+        $params['notification'] = isset($params['notification'])
+            ? Core::callArray([$params['notification'], $fn])
+            : $fn;
+    }
+
+    private function add_debug(array $request, &$options, $value, &$params)
+    {
+        if ($value === false) {
+            return;
+        }
+
+        static $map = [
+            STREAM_NOTIFY_CONNECT       => 'CONNECT',
+            STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED',
+            STREAM_NOTIFY_AUTH_RESULT   => 'AUTH_RESULT',
+            STREAM_NOTIFY_MIME_TYPE_IS  => 'MIME_TYPE_IS',
+            STREAM_NOTIFY_FILE_SIZE_IS  => 'FILE_SIZE_IS',
+            STREAM_NOTIFY_REDIRECTED    => 'REDIRECTED',
+            STREAM_NOTIFY_PROGRESS      => 'PROGRESS',
+            STREAM_NOTIFY_FAILURE       => 'FAILURE',
+            STREAM_NOTIFY_COMPLETED     => 'COMPLETED',
+            STREAM_NOTIFY_RESOLVE       => 'RESOLVE',
+        ];
+
+        static $args = ['severity', 'message', 'message_code',
+            'bytes_transferred', 'bytes_max'];
+
+        $value = Core::getDebugResource($value);
+        $ident = $request['http_method'] . ' ' . Core::url($request);
+        $fn = function () use ($ident, $value, $map, $args) {
+            $passed = func_get_args();
+            $code = array_shift($passed);
+            fprintf($value, '<%s> [%s] ', $ident, $map[$code]);
+            foreach (array_filter($passed) as $i => $v) {
+                fwrite($value, $args[$i] . ': "' . $v . '" ');
+            }
+            fwrite($value, "\n");
+        };
+
+        // Wrap the existing function if needed.
+        $params['notification'] = isset($params['notification'])
+            ? Core::callArray([$params['notification'], $fn])
+            : $fn;
+    }
+
+    private function applyCustomOptions(array $request, array &$options)
+    {
+        if (!isset($request['client']['stream_context'])) {
+            return;
+        }
+
+        if (!is_array($request['client']['stream_context'])) {
+            throw new RingException('stream_context must be an array');
+        }
+
+        $options = array_replace_recursive(
+            $options,
+            $request['client']['stream_context']
+        );
+    }
+
+    private function createContext(array $request, array $options, array $params)
+    {
+        $this->applyCustomOptions($request, $options);
+        return $this->createResource(
+            function () use ($request, $options, $params) {
+                return stream_context_create($options, $params);
+            },
+            $request,
+            $options
+        );
+    }
+
+    private function createStreamResource(
+        $url,
+        array $request,
+        array $options,
+        $context
+    ) {
+        return $this->createResource(
+            function () use ($url, $context) {
+                if (false === strpos($url, 'http')) {
+                    trigger_error("URL is invalid: {$url}", E_USER_WARNING);
+                    return null;
+                }
+                $resource = fopen($url, 'r', null, $context);
+                $this->lastHeaders = $http_response_header;
+                return $resource;
+            },
+            $request,
+            $options
+        );
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Core.php
@@ -0,0 +1,364 @@
+<?php
+namespace GuzzleHttp\Ring;
+
+use GuzzleHttp\Stream\StreamInterface;
+use GuzzleHttp\Ring\Future\FutureArrayInterface;
+use GuzzleHttp\Ring\Future\FutureArray;
+
+/**
+ * Provides core functionality of Ring handlers and middleware.
+ */
+class Core
+{
+    /**
+     * Returns a function that calls all of the provided functions, in order,
+     * passing the arguments provided to the composed function to each function.
+     *
+     * @param callable[] $functions Array of functions to proxy to.
+     *
+     * @return callable
+     */
+    public static function callArray(array $functions)
+    {
+        return function () use ($functions) {
+            $args = func_get_args();
+            foreach ($functions as $fn) {
+                call_user_func_array($fn, $args);
+            }
+        };
+    }
+
+    /**
+     * Gets an array of header line values from a message for a specific header
+     *
+     * This method searches through the "headers" key of a message for a header
+     * using a case-insensitive search.
+     *
+     * @param array  $message Request or response hash.
+     * @param string $header  Header to retrieve
+     *
+     * @return array
+     */
+    public static function headerLines($message, $header)
+    {
+        $result = [];
+
+        if (!empty($message['headers'])) {
+            foreach ($message['headers'] as $name => $value) {
+                if (!strcasecmp($name, $header)) {
+                    $result = array_merge($result, $value);
+                }
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Gets a header value from a message as a string or null
+     *
+     * This method searches through the "headers" key of a message for a header
+     * using a case-insensitive search. The lines of the header are imploded
+     * using commas into a single string return value.
+     *
+     * @param array  $message Request or response hash.
+     * @param string $header  Header to retrieve
+     *
+     * @return string|null Returns the header string if found, or null if not.
+     */
+    public static function header($message, $header)
+    {
+        $match = self::headerLines($message, $header);
+        return $match ? implode(', ', $match) : null;
+    }
+
+    /**
+     * Returns the first header value from a message as a string or null. If
+     * a header line contains multiple values separated by a comma, then this
+     * function will return the first value in the list.
+     *
+     * @param array  $message Request or response hash.
+     * @param string $header  Header to retrieve
+     *
+     * @return string|null Returns the value as a string if found.
+     */
+    public static function firstHeader($message, $header)
+    {
+        if (!empty($message['headers'])) {
+            foreach ($message['headers'] as $name => $value) {
+                if (!strcasecmp($name, $header)) {
+                    // Return the match itself if it is a single value.
+                    $pos = strpos($value[0], ',');
+                    return $pos ? substr($value[0], 0, $pos) : $value[0];
+                }
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Returns true if a message has the provided case-insensitive header.
+     *
+     * @param array  $message Request or response hash.
+     * @param string $header  Header to check
+     *
+     * @return bool
+     */
+    public static function hasHeader($message, $header)
+    {
+        if (!empty($message['headers'])) {
+            foreach ($message['headers'] as $name => $value) {
+                if (!strcasecmp($name, $header)) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Parses an array of header lines into an associative array of headers.
+     *
+     * @param array $lines Header lines array of strings in the following
+     *                     format: "Name: Value"
+     * @return array
+     */
+    public static function headersFromLines($lines)
+    {
+        $headers = [];
+
+        foreach ($lines as $line) {
+            $parts = explode(':', $line, 2);
+            $headers[trim($parts[0])][] = isset($parts[1])
+                ? trim($parts[1])
+                : null;
+        }
+
+        return $headers;
+    }
+
+    /**
+     * Removes a header from a message using a case-insensitive comparison.
+     *
+     * @param array  $message Message that contains 'headers'
+     * @param string $header  Header to remove
+     *
+     * @return array
+     */
+    public static function removeHeader(array $message, $header)
+    {
+        if (isset($message['headers'])) {
+            foreach (array_keys($message['headers']) as $key) {
+                if (!strcasecmp($header, $key)) {
+                    unset($message['headers'][$key]);
+                }
+            }
+        }
+
+        return $message;
+    }
+
+    /**
+     * Replaces any existing case insensitive headers with the given value.
+     *
+     * @param array  $message Message that contains 'headers'
+     * @param string $header  Header to set.
+     * @param array  $value   Value to set.
+     *
+     * @return array
+     */
+    public static function setHeader(array $message, $header, array $value)
+    {
+        $message = self::removeHeader($message, $header);
+        $message['headers'][$header] = $value;
+
+        return $message;
+    }
+
+    /**
+     * Creates a URL string from a request.
+     *
+     * If the "url" key is present on the request, it is returned, otherwise
+     * the url is built up based on the scheme, host, uri, and query_string
+     * request values.
+     *
+     * @param array $request Request to get the URL from
+     *
+     * @return string Returns the request URL as a string.
+     * @throws \InvalidArgumentException if no Host header is present.
+     */
+    public static function url(array $request)
+    {
+        if (isset($request['url'])) {
+            return $request['url'];
+        }
+
+        $uri = (isset($request['scheme'])
+                ? $request['scheme'] : 'http') . '://';
+
+        if ($host = self::header($request, 'host')) {
+            $uri .= $host;
+        } else {
+            throw new \InvalidArgumentException('No Host header was provided');
+        }
+
+        if (isset($request['uri'])) {
+            $uri .= $request['uri'];
+        }
+
+        if (isset($request['query_string'])) {
+            $uri .= '?' . $request['query_string'];
+        }
+
+        return $uri;
+    }
+
+    /**
+     * Reads the body of a message into a string.
+     *
+     * @param array|FutureArrayInterface $message Array containing a "body" key
+     *
+     * @return null|string Returns the body as a string or null if not set.
+     * @throws \InvalidArgumentException if a request body is invalid.
+     */
+    public static function body($message)
+    {
+        if (!isset($message['body'])) {
+            return null;
+        }
+
+        if ($message['body'] instanceof StreamInterface) {
+            return (string) $message['body'];
+        }
+
+        switch (gettype($message['body'])) {
+            case 'string':
+                return $message['body'];
+            case 'resource':
+                return stream_get_contents($message['body']);
+            case 'object':
+                if ($message['body'] instanceof \Iterator) {
+                    return implode('', iterator_to_array($message['body']));
+                } elseif (method_exists($message['body'], '__toString')) {
+                    return (string) $message['body'];
+                }
+            default:
+                throw new \InvalidArgumentException('Invalid request body: '
+                    . self::describeType($message['body']));
+        }
+    }
+
+    /**
+     * Rewind the body of the provided message if possible.
+     *
+     * @param array $message Message that contains a 'body' field.
+     *
+     * @return bool Returns true on success, false on failure
+     */
+    public static function rewindBody($message)
+    {
+        if ($message['body'] instanceof StreamInterface) {
+            return $message['body']->seek(0);
+        }
+
+        if ($message['body'] instanceof \Generator) {
+            return false;
+        }
+
+        if ($message['body'] instanceof \Iterator) {
+            $message['body']->rewind();
+            return true;
+        }
+
+        if (is_resource($message['body'])) {
+            return rewind($message['body']);
+        }
+
+        return is_string($message['body'])
+            || (is_object($message['body'])
+                && method_exists($message['body'], '__toString'));
+    }
+
+    /**
+     * Debug function used to describe the provided value type and class.
+     *
+     * @param mixed $input
+     *
+     * @return string Returns a string containing the type of the variable and
+     *                if a class is provided, the class name.
+     */
+    public static function describeType($input)
+    {
+        switch (gettype($input)) {
+            case 'object':
+                return 'object(' . get_class($input) . ')';
+            case 'array':
+                return 'array(' . count($input) . ')';
+            default:
+                ob_start();
+                var_dump($input);
+                // normalize float vs double
+                return str_replace('double(', 'float(', rtrim(ob_get_clean()));
+        }
+    }
+
+    /**
+     * Sleep for the specified amount of time specified in the request's
+     * ['client']['delay'] option if present.
+     *
+     * This function should only be used when a non-blocking sleep is not
+     * possible.
+     *
+     * @param array $request Request to sleep
+     */
+    public static function doSleep(array $request)
+    {
+        if (isset($request['client']['delay'])) {
+            usleep($request['client']['delay'] * 1000);
+        }
+    }
+
+    /**
+     * Returns a proxied future that modifies the dereferenced value of another
+     * future using a promise.
+     *
+     * @param FutureArrayInterface $future      Future to wrap with a new future
+     * @param callable    $onFulfilled Invoked when the future fulfilled
+     * @param callable    $onRejected  Invoked when the future rejected
+     * @param callable    $onProgress  Invoked when the future progresses
+     *
+     * @return FutureArray
+     */
+    public static function proxy(
+        FutureArrayInterface $future,
+        callable $onFulfilled = null,
+        callable $onRejected = null,
+        callable $onProgress = null
+    ) {
+        return new FutureArray(
+            $future->then($onFulfilled, $onRejected, $onProgress),
+            [$future, 'wait'],
+            [$future, 'cancel']
+        );
+    }
+
+    /**
+     * Returns a debug stream based on the provided variable.
+     *
+     * @param mixed $value Optional value
+     *
+     * @return resource
+     */
+    public static function getDebugResource($value = null)
+    {
+        if (is_resource($value)) {
+            return $value;
+        } elseif (defined('STDOUT')) {
+            return STDOUT;
+        } else {
+            return fopen('php://output', 'w');
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Exception/CancelledException.php
@@ -0,0 +1,7 @@
+<?php
+namespace GuzzleHttp\Ring\Exception;
+
+/**
+ * Marker interface for cancelled exceptions.
+ */
+interface CancelledException {}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Exception/CancelledFutureAccessException.php
@@ -0,0 +1,4 @@
+<?php
+namespace GuzzleHttp\Ring\Exception;
+
+class CancelledFutureAccessException extends RingException implements CancelledException {}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Exception/ConnectException.php
@@ -0,0 +1,7 @@
+<?php
+namespace GuzzleHttp\Ring\Exception;
+
+/**
+ * Occurs when the connection failed.
+ */
+class ConnectException extends RingException {}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Exception/RingException.php
@@ -0,0 +1,4 @@
+<?php
+namespace GuzzleHttp\Ring\Exception;
+
+class RingException extends \RuntimeException {};
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Future/BaseFutureTrait.php
@@ -0,0 +1,125 @@
+<?php
+namespace GuzzleHttp\Ring\Future;
+
+use GuzzleHttp\Ring\Exception\CancelledFutureAccessException;
+use GuzzleHttp\Ring\Exception\RingException;
+use React\Promise\PromiseInterface;
+
+/**
+ * Implements common future functionality built on top of promises.
+ */
+trait BaseFutureTrait
+{
+    /** @var callable */
+    private $waitfn;
+
+    /** @var callable */
+    private $cancelfn;
+
+    /** @var PromiseInterface */
+    private $wrappedPromise;
+
+    /** @var \Exception Error encountered. */
+    private $error;
+
+    /** @var mixed Result of the future */
+    private $result;
+
+    private $isRealized = false;
+
+    /**
+     * @param PromiseInterface $promise Promise to shadow with the future.
+     * @param callable         $wait    Function that blocks until the deferred
+     *                                  computation has been resolved. This
+     *                                  function MUST resolve the deferred value
+     *                                  associated with the supplied promise.
+     * @param callable         $cancel  If possible and reasonable, provide a
+     *                                  function that can be used to cancel the
+     *                                  future from completing.
+     */
+    public function __construct(
+        PromiseInterface $promise,
+        callable $wait = null,
+        callable $cancel = null
+    ) {
+        $this->wrappedPromise = $promise;
+        $this->waitfn = $wait;
+        $this->cancelfn = $cancel;
+    }
+
+    public function wait()
+    {
+        if (!$this->isRealized) {
+            $this->addShadow();
+            if (!$this->isRealized && $this->waitfn) {
+                $this->invokeWait();
+            }
+            if (!$this->isRealized) {
+                $this->error = new RingException('Waiting did not resolve future');
+            }
+        }
+
+        if ($this->error) {
+            throw $this->error;
+        }
+
+        return $this->result;
+    }
+
+    public function promise()
+    {
+        return $this->wrappedPromise;
+    }
+
+    public function then(
+        callable $onFulfilled = null,
+        callable $onRejected = null,
+        callable $onProgress = null
+    ) {
+        return $this->wrappedPromise->then($onFulfilled, $onRejected, $onProgress);
+    }
+
+    public function cancel()
+    {
+        if (!$this->isRealized) {
+            $cancelfn = $this->cancelfn;
+            $this->waitfn = $this->cancelfn = null;
+            $this->isRealized = true;
+            $this->error = new CancelledFutureAccessException();
+            if ($cancelfn) {
+                $cancelfn($this);
+            }
+        }
+    }
+
+    private function addShadow()
+    {
+        // Get the result and error when the promise is resolved. Note that
+        // calling this function might trigger the resolution immediately.
+        $this->wrappedPromise->then(
+            function ($value) {
+                $this->isRealized = true;
+                $this->result = $value;
+                $this->waitfn = $this->cancelfn = null;
+            },
+            function ($error) {
+                $this->isRealized = true;
+                $this->error = $error;
+                $this->waitfn = $this->cancelfn = null;
+            }
+        );
+    }
+
+    private function invokeWait()
+    {
+        try {
+            $wait = $this->waitfn;
+            $this->waitfn = null;
+            $wait();
+        } catch (\Exception $e) {
+            // Defer can throw to reject.
+            $this->error = $e;
+            $this->isRealized = true;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Future/CompletedFutureArray.php
@@ -0,0 +1,43 @@
+<?php
+namespace GuzzleHttp\Ring\Future;
+
+/**
+ * Represents a future array that has been completed successfully.
+ */
+class CompletedFutureArray extends CompletedFutureValue implements FutureArrayInterface
+{
+    public function __construct(array $result)
+    {
+        parent::__construct($result);
+    }
+
+    public function offsetExists($offset)
+    {
+        return isset($this->result[$offset]);
+    }
+
+    public function offsetGet($offset)
+    {
+        return $this->result[$offset];
+    }
+
+    public function offsetSet($offset, $value)
+    {
+        $this->result[$offset] = $value;
+    }
+
+    public function offsetUnset($offset)
+    {
+        unset($this->result[$offset]);
+    }
+
+    public function count()
+    {
+        return count($this->result);
+    }
+
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->result);
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Future/CompletedFutureValue.php
@@ -0,0 +1,57 @@
+<?php
+namespace GuzzleHttp\Ring\Future;
+
+use React\Promise\FulfilledPromise;
+use React\Promise\RejectedPromise;
+
+/**
+ * Represents a future value that has been resolved or rejected.
+ */
+class CompletedFutureValue implements FutureInterface
+{
+    protected $result;
+    protected $error;
+
+    private $cachedPromise;
+
+    /**
+     * @param mixed      $result Resolved result
+     * @param \Exception $e      Error. Pass a GuzzleHttp\Ring\Exception\CancelledFutureAccessException
+     *                           to mark the future as cancelled.
+     */
+    public function __construct($result, \Exception $e = null)
+    {
+        $this->result = $result;
+        $this->error = $e;
+    }
+
+    public function wait()
+    {
+        if ($this->error) {
+            throw $this->error;
+        }
+
+        return $this->result;
+    }
+
+    public function cancel() {}
+
+    public function promise()
+    {
+        if (!$this->cachedPromise) {
+            $this->cachedPromise = $this->error
+                ? new RejectedPromise($this->error)
+                : new FulfilledPromise($this->result);
+        }
+
+        return $this->cachedPromise;
+    }
+
+    public function then(
+        callable $onFulfilled = null,
+        callable $onRejected = null,
+        callable $onProgress = null
+    ) {
+        return $this->promise()->then($onFulfilled, $onRejected, $onProgress);
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Future/FutureArray.php
@@ -0,0 +1,40 @@
+<?php
+namespace GuzzleHttp\Ring\Future;
+
+/**
+ * Represents a future array value that when dereferenced returns an array.
+ */
+class FutureArray implements FutureArrayInterface
+{
+    use MagicFutureTrait;
+
+    public function offsetExists($offset)
+    {
+        return isset($this->_value[$offset]);
+    }
+
+    public function offsetGet($offset)
+    {
+        return $this->_value[$offset];
+    }
+
+    public function offsetSet($offset, $value)
+    {
+        $this->_value[$offset] = $value;
+    }
+
+    public function offsetUnset($offset)
+    {
+        unset($this->_value[$offset]);
+    }
+
+    public function count()
+    {
+        return count($this->_value);
+    }
+
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->_value);
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Future/FutureArrayInterface.php
@@ -0,0 +1,11 @@
+<?php
+namespace GuzzleHttp\Ring\Future;
+
+/**
+ * Future that provides array-like access.
+ */
+interface FutureArrayInterface extends
+    FutureInterface,
+    \ArrayAccess,
+    \Countable,
+    \IteratorAggregate {};
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Future/FutureInterface.php
@@ -0,0 +1,40 @@
+<?php
+namespace GuzzleHttp\Ring\Future;
+
+use React\Promise\PromiseInterface;
+use React\Promise\PromisorInterface;
+
+/**
+ * Represents the result of a computation that may not have completed yet.
+ *
+ * You can use the future in a blocking manner using the wait() function, or
+ * you can use a promise from the future to receive the result when the future
+ * has been resolved.
+ *
+ * When the future is dereferenced using wait(), the result of the computation
+ * is cached and returned for subsequent calls to wait(). If the result of the
+ * computation has not yet completed when wait() is called, the call to wait()
+ * will block until the future has completed.
+ */
+interface FutureInterface extends PromiseInterface, PromisorInterface
+{
+    /**
+     * Returns the result of the future either from cache or by blocking until
+     * it is complete.
+     *
+     * This method must block until the future has a result or is cancelled.
+     * Throwing an exception in the wait() method will mark the future as
+     * realized and will throw the exception each time wait() is called.
+     * Throwing an instance of GuzzleHttp\Ring\CancelledException will mark
+     * the future as realized, will not throw immediately, but will throw the
+     * exception if the future's wait() method is called again.
+     *
+     * @return mixed
+     */
+    public function wait();
+
+    /**
+     * Cancels the future, if possible.
+     */
+    public function cancel();
+}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Future/FutureValue.php
@@ -0,0 +1,12 @@
+<?php
+namespace GuzzleHttp\Ring\Future;
+
+/**
+ * Represents a future value that responds to wait() to retrieve the promised
+ * value, but can also return promises that are delivered the value when it is
+ * available.
+ */
+class FutureValue implements FutureInterface
+{
+    use BaseFutureTrait;
+}
--- /dev/null
+++ b/vendor/guzzlehttp/ringphp/src/Future/MagicFutureTrait.php
@@ -0,0 +1,32 @@
+<?php
+namespace GuzzleHttp\Ring\Future;
+
+/**
+ * Implements common future functionality that is triggered when the result
+ * property is accessed via a magic __get method.
+ *
+ * @property mixed $_value Actual data used by the future. Accessing this
+ *     property will cause the future to block if needed.
+ */
+trait MagicFutureTrait
+{
+    use BaseFutureTrait;
+
+    /**
+     * This function handles retrieving the dereferenced result when requested.
+     *
+     * @param string $name Should always be "data" or an exception is thrown.
+     *
+     * @return mixed Returns the dereferenced data.
+     * @throws \RuntimeException
+     * @throws \GuzzleHttp\Ring\Exception\CancelledException
+     */
+    public function __get($name)
+    {
+        if ($name !== '_value') {
+            throw new \RuntimeException("Class has no {$name} property");
+        }
+
+        return $this->_value = $this->wait();
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2014 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/guzzlehttp/streams/composer.json
@@ -0,0 +1,28 @@
+{
+    "name": "guzzlehttp/streams",
+    "description": "Provides a simple abstraction over streams of data",
+    "homepage": "http://guzzlephp.org/",
+    "keywords": ["stream", "guzzle"],
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Michael Dowling",
+            "email": "mtdowling@gmail.com",
+            "homepage": "https://github.com/mtdowling"
+        }
+    ],
+    "require": {
+        "php": ">=5.4.0"
+    },
+    "require-dev": {
+        "phpunit/phpunit": "~4.0"
+    },
+    "autoload": {
+        "psr-4": { "GuzzleHttp\\Stream\\": "src/" }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "3.0-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/AppendStream.php
@@ -0,0 +1,220 @@
+<?php
+namespace GuzzleHttp\Stream;
+
+use GuzzleHttp\Stream\Exception\CannotAttachException;
+
+/**
+ * Reads from multiple streams, one after the other.
+ *
+ * This is a read-only stream decorator.
+ */
+class AppendStream implements StreamInterface
+{
+    /** @var StreamInterface[] Streams being decorated */
+    private $streams = [];
+
+    private $seekable = true;
+    private $current = 0;
+    private $pos = 0;
+    private $detached = false;
+
+    /**
+     * @param StreamInterface[] $streams Streams to decorate. Each stream must
+     *                                   be readable.
+     */
+    public function __construct(array $streams = [])
+    {
+        foreach ($streams as $stream) {
+            $this->addStream($stream);
+        }
+    }
+
+    public function __toString()
+    {
+        try {
+            $this->seek(0);
+            return $this->getContents();
+        } catch (\Exception $e) {
+            return '';
+        }
+    }
+
+    /**
+     * Add a stream to the AppendStream
+     *
+     * @param StreamInterface $stream Stream to append. Must be readable.
+     *
+     * @throws \InvalidArgumentException if the stream is not readable
+     */
+    public function addStream(StreamInterface $stream)
+    {
+        if (!$stream->isReadable()) {
+            throw new \InvalidArgumentException('Each stream must be readable');
+        }
+
+        // The stream is only seekable if all streams are seekable
+        if (!$stream->isSeekable()) {
+            $this->seekable = false;
+        }
+
+        $this->streams[] = $stream;
+    }
+
+    public function getContents()
+    {
+        return Utils::copyToString($this);
+    }
+
+    /**
+     * Closes each attached stream.
+     *
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        $this->pos = $this->current = 0;
+
+        foreach ($this->streams as $stream) {
+            $stream->close();
+        }
+
+        $this->streams = [];
+    }
+
+    /**
+     * Detaches each attached stream
+     *
+     * {@inheritdoc}
+     */
+    public function detach()
+    {
+        $this->close();
+        $this->detached = true;
+    }
+
+    public function attach($stream)
+    {
+        throw new CannotAttachException();
+    }
+
+    public function tell()
+    {
+        return $this->pos;
+    }
+
+    /**
+     * Tries to calculate the size by adding the size of each stream.
+     *
+     * If any of the streams do not return a valid number, then the size of the
+     * append stream cannot be determined and null is returned.
+     *
+     * {@inheritdoc}
+     */
+    public function getSize()
+    {
+        $size = 0;
+
+        foreach ($this->streams as $stream) {
+            $s = $stream->getSize();
+            if ($s === null) {
+                return null;
+            }
+            $size += $s;
+        }
+
+        return $size;
+    }
+
+    public function eof()
+    {
+        return !$this->streams ||
+            ($this->current >= count($this->streams) - 1 &&
+             $this->streams[$this->current]->eof());
+    }
+
+    /**
+     * Attempts to seek to the given position. Only supports SEEK_SET.
+     *
+     * {@inheritdoc}
+     */
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        if (!$this->seekable || $whence !== SEEK_SET) {
+            return false;
+        }
+
+        $success = true;
+        $this->pos = $this->current = 0;
+
+        // Rewind each stream
+        foreach ($this->streams as $stream) {
+            if (!$stream->seek(0)) {
+                $success = false;
+            }
+        }
+
+        if (!$success) {
+            return false;
+        }
+
+        // Seek to the actual position by reading from each stream
+        while ($this->pos < $offset && !$this->eof()) {
+            $this->read(min(8096, $offset - $this->pos));
+        }
+
+        return $this->pos == $offset;
+    }
+
+    /**
+     * Reads from all of the appended streams until the length is met or EOF.
+     *
+     * {@inheritdoc}
+     */
+    public function read($length)
+    {
+        $buffer = '';
+        $total = count($this->streams) - 1;
+        $remaining = $length;
+
+        while ($remaining > 0) {
+            // Progress to the next stream if needed.
+            if ($this->streams[$this->current]->eof()) {
+                if ($this->current == $total) {
+                    break;
+                }
+                $this->current++;
+            }
+            $buffer .= $this->streams[$this->current]->read($remaining);
+            $remaining = $length - strlen($buffer);
+        }
+
+        $this->pos += strlen($buffer);
+
+        return $buffer;
+    }
+
+    public function isReadable()
+    {
+        return true;
+    }
+
+    public function isWritable()
+    {
+        return false;
+    }
+
+    public function isSeekable()
+    {
+        return $this->seekable;
+    }
+
+    public function write($string)
+    {
+        return false;
+    }
+
+    public function getMetadata($key = null)
+    {
+        return $key ? null : [];
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/AsyncReadStream.php
@@ -0,0 +1,207 @@
+<?php
+namespace GuzzleHttp\Stream;
+
+/**
+ * Represents an asynchronous read-only stream that supports a drain event and
+ * pumping data from a source stream.
+ *
+ * The AsyncReadStream can be used as a completely asynchronous stream, meaning
+ * the data you can read from the stream will immediately return only
+ * the data that is currently buffered.
+ *
+ * AsyncReadStream can also be used in a "blocking" manner if a "pump" function
+ * is provided. When a caller requests more bytes than are available in the
+ * buffer, then the pump function is used to block until the requested number
+ * of bytes are available or the remote source stream has errored, closed, or
+ * timed-out. This behavior isn't strictly "blocking" because the pump function
+ * can send other transfers while waiting on the desired buffer size to be
+ * ready for reading (e.g., continue to tick an event loop).
+ *
+ * @unstable This class is subject to change.
+ */
+class AsyncReadStream implements StreamInterface
+{
+    use StreamDecoratorTrait;
+
+    /** @var callable|null Fn used to notify writers the buffer has drained */
+    private $drain;
+
+    /** @var callable|null Fn used to block for more data */
+    private $pump;
+
+    /** @var int|null Highwater mark of the underlying buffer */
+    private $hwm;
+
+    /** @var bool Whether or not drain needs to be called at some point */
+    private $needsDrain;
+
+    /** @var int The expected size of the remote source */
+    private $size;
+
+    /**
+     * In order to utilize high water marks to tell writers to slow down, the
+     * provided stream must answer to the "hwm" stream metadata variable,
+     * providing the high water mark. If no "hwm" metadata value is available,
+     * then the "drain" functionality is not utilized.
+     *
+     * This class accepts an associative array of configuration options.
+     *
+     * - drain: (callable) Function to invoke when the stream has drained,
+     *   meaning the buffer is now writable again because the size of the
+     *   buffer is at an acceptable level (e.g., below the high water mark).
+     *   The function accepts a single argument, the buffer stream object that
+     *   has drained.
+     * - pump: (callable) A function that accepts the number of bytes to read
+     *   from the source stream. This function will block until all of the data
+     *   that was requested has been read, EOF of the source stream, or the
+     *   source stream is closed.
+     * - size: (int) The expected size in bytes of the data that will be read
+     *   (if known up-front).
+     *
+     * @param StreamInterface $buffer   Buffer that contains the data that has
+     *                                  been read by the event loop.
+     * @param array           $config   Associative array of options.
+     *
+     * @throws \InvalidArgumentException if the buffer is not readable and
+     *                                   writable.
+     */
+    public function __construct(
+        StreamInterface $buffer,
+        array $config = []
+    ) {
+        if (!$buffer->isReadable() || !$buffer->isWritable()) {
+            throw new \InvalidArgumentException(
+                'Buffer must be readable and writable'
+            );
+        }
+
+        if (isset($config['size'])) {
+            $this->size = $config['size'];
+        }
+
+        static $callables = ['pump', 'drain'];
+        foreach ($callables as $check) {
+            if (isset($config[$check])) {
+                if (!is_callable($config[$check])) {
+                    throw new \InvalidArgumentException(
+                        $check . ' must be callable'
+                    );
+                }
+                $this->{$check} = $config[$check];
+            }
+        }
+
+        $this->hwm = $buffer->getMetadata('hwm');
+
+        // Cannot drain when there's no high water mark.
+        if ($this->hwm === null) {
+            $this->drain = null;
+        }
+
+        $this->stream = $buffer;
+    }
+
+    /**
+     * Factory method used to create new async stream and an underlying buffer
+     * if no buffer is provided.
+     *
+     * This function accepts the same options as AsyncReadStream::__construct,
+     * but added the following key value pairs:
+     *
+     * - buffer: (StreamInterface) Buffer used to buffer data. If none is
+     *   provided, a default buffer is created.
+     * - hwm: (int) High water mark to use if a buffer is created on your
+     *   behalf.
+     * - max_buffer: (int) If provided, wraps the utilized buffer in a
+     *   DroppingStream decorator to ensure that buffer does not exceed a given
+     *   length. When exceeded, the stream will begin dropping data. Set the
+     *   max_buffer to 0, to use a NullStream which does not store data.
+     * - write: (callable) A function that is invoked when data is written
+     *   to the underlying buffer. The function accepts the buffer as the first
+     *   argument, and the data being written as the second. The function MUST
+     *   return the number of bytes that were written or false to let writers
+     *   know to slow down.
+     * - drain: (callable) See constructor documentation.
+     * - pump: (callable) See constructor documentation.
+     *
+     * @param array $options Associative array of options.
+     *
+     * @return array Returns an array containing the buffer used to buffer
+     *               data, followed by the ready to use AsyncReadStream object.
+     */
+    public static function create(array $options = [])
+    {
+        $maxBuffer = isset($options['max_buffer'])
+            ? $options['max_buffer']
+            : null;
+
+        if ($maxBuffer === 0) {
+            $buffer = new NullStream();
+        } elseif (isset($options['buffer'])) {
+            $buffer = $options['buffer'];
+        } else {
+            $hwm = isset($options['hwm']) ? $options['hwm'] : 16384;
+            $buffer = new BufferStream($hwm);
+        }
+
+        if ($maxBuffer > 0) {
+            $buffer = new DroppingStream($buffer, $options['max_buffer']);
+        }
+
+        // Call the on_write callback if an on_write function was provided.
+        if (isset($options['write'])) {
+            $onWrite = $options['write'];
+            $buffer = FnStream::decorate($buffer, [
+                'write' => function ($string) use ($buffer, $onWrite) {
+                    $result = $buffer->write($string);
+                    $onWrite($buffer, $string);
+                    return $result;
+                }
+            ]);
+        }
+
+        return [$buffer, new self($buffer, $options)];
+    }
+
+    public function getSize()
+    {
+        return $this->size;
+    }
+
+    public function isWritable()
+    {
+        return false;
+    }
+
+    public function write($string)
+    {
+        return false;
+    }
+
+    public function read($length)
+    {
+        if (!$this->needsDrain && $this->drain) {
+            $this->needsDrain = $this->stream->getSize() >= $this->hwm;
+        }
+
+        $result = $this->stream->read($length);
+
+        // If we need to drain, then drain when the buffer is empty.
+        if ($this->needsDrain && $this->stream->getSize() === 0) {
+            $this->needsDrain = false;
+            $drainFn = $this->drain;
+            $drainFn($this->stream);
+        }
+
+        $resultLen = strlen($result);
+
+        // If a pump was provided, the buffer is still open, and not enough
+        // data was given, then block until the data is provided.
+        if ($this->pump && $resultLen < $length) {
+            $pumpFn = $this->pump;
+            $result .= $pumpFn($length - $resultLen);
+        }
+
+        return $result;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/BufferStream.php
@@ -0,0 +1,138 @@
+<?php
+namespace GuzzleHttp\Stream;
+
+use GuzzleHttp\Stream\Exception\CannotAttachException;
+
+/**
+ * Provides a buffer stream that can be written to to fill a buffer, and read
+ * from to remove bytes from the buffer.
+ *
+ * This stream returns a "hwm" metadata value that tells upstream consumers
+ * what the configured high water mark of the stream is, or the maximum
+ * preferred size of the buffer.
+ *
+ * @package GuzzleHttp\Stream
+ */
+class BufferStream implements StreamInterface
+{
+    private $hwm;
+    private $buffer = '';
+
+    /**
+     * @param int $hwm High water mark, representing the preferred maximum
+     *                 buffer size. If the size of the buffer exceeds the high
+     *                 water mark, then calls to write will continue to succeed
+     *                 but will return false to inform writers to slow down
+     *                 until the buffer has been drained by reading from it.
+     */
+    public function __construct($hwm = 16384)
+    {
+        $this->hwm = $hwm;
+    }
+
+    public function __toString()
+    {
+        return $this->getContents();
+    }
+
+    public function getContents()
+    {
+        $buffer = $this->buffer;
+        $this->buffer = '';
+
+        return $buffer;
+    }
+
+    public function close()
+    {
+        $this->buffer = '';
+    }
+
+    public function detach()
+    {
+        $this->close();
+    }
+
+    public function attach($stream)
+    {
+        throw new CannotAttachException();
+    }
+
+    public function getSize()
+    {
+        return strlen($this->buffer);
+    }
+
+    public function isReadable()
+    {
+        return true;
+    }
+
+    public function isWritable()
+    {
+        return true;
+    }
+
+    public function isSeekable()
+    {
+        return false;
+    }
+
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        return false;
+    }
+
+    public function eof()
+    {
+        return strlen($this->buffer) === 0;
+    }
+
+    public function tell()
+    {
+        return false;
+    }
+
+    /**
+     * Reads data from the buffer.
+     */
+    public function read($length)
+    {
+        $currentLength = strlen($this->buffer);
+
+        if ($length >= $currentLength) {
+            // No need to slice the buffer because we don't have enough data.
+            $result = $this->buffer;
+            $this->buffer = '';
+        } else {
+            // Slice up the result to provide a subset of the buffer.
+            $result = substr($this->buffer, 0, $length);
+            $this->buffer = substr($this->buffer, $length);
+        }
+
+        return $result;
+    }
+
+    /**
+     * Writes data to the buffer.
+     */
+    public function write($string)
+    {
+        $this->buffer .= $string;
+
+        if (strlen($this->buffer) >= $this->hwm) {
+            return false;
+        }
+
+        return strlen($string);
+    }
+
+    public function getMetadata($key = null)
+    {
+        if ($key == 'hwm') {
+            return $this->hwm;
+        }
+
+        return $key ? null : [];
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/CachingStream.php
@@ -0,0 +1,122 @@
+<?php
+namespace GuzzleHttp\Stream;
+
+use GuzzleHttp\Stream\Exception\SeekException;
+
+/**
+ * Stream decorator that can cache previously read bytes from a sequentially
+ * read stream.
+ */
+class CachingStream implements StreamInterface
+{
+    use StreamDecoratorTrait;
+
+    /** @var StreamInterface Stream being wrapped */
+    private $remoteStream;
+
+    /** @var int Number of bytes to skip reading due to a write on the buffer */
+    private $skipReadBytes = 0;
+
+    /**
+     * We will treat the buffer object as the body of the stream
+     *
+     * @param StreamInterface $stream Stream to cache
+     * @param StreamInterface $target Optionally specify where data is cached
+     */
+    public function __construct(
+        StreamInterface $stream,
+        StreamInterface $target = null
+    ) {
+        $this->remoteStream = $stream;
+        $this->stream = $target ?: new Stream(fopen('php://temp', 'r+'));
+    }
+
+    public function getSize()
+    {
+        return max($this->stream->getSize(), $this->remoteStream->getSize());
+    }
+
+    /**
+     * {@inheritdoc}
+     * @throws SeekException When seeking with SEEK_END or when seeking
+     *     past the total size of the buffer stream
+     */
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        if ($whence == SEEK_SET) {
+            $byte = $offset;
+        } elseif ($whence == SEEK_CUR) {
+            $byte = $offset + $this->tell();
+        } else {
+            return false;
+        }
+
+        // You cannot skip ahead past where you've read from the remote stream
+        if ($byte > $this->stream->getSize()) {
+            throw new SeekException(
+                $this,
+                $byte,
+                sprintf('Cannot seek to byte %d when the buffered stream only'
+                    . ' contains %d bytes', $byte, $this->stream->getSize())
+            );
+        }
+
+        return $this->stream->seek($byte);
+    }
+
+    public function read($length)
+    {
+        // Perform a regular read on any previously read data from the buffer
+        $data = $this->stream->read($length);
+        $remaining = $length - strlen($data);
+
+        // More data was requested so read from the remote stream
+        if ($remaining) {
+            // If data was written to the buffer in a position that would have
+            // been filled from the remote stream, then we must skip bytes on
+            // the remote stream to emulate overwriting bytes from that
+            // position. This mimics the behavior of other PHP stream wrappers.
+            $remoteData = $this->remoteStream->read(
+                $remaining + $this->skipReadBytes
+            );
+
+            if ($this->skipReadBytes) {
+                $len = strlen($remoteData);
+                $remoteData = substr($remoteData, $this->skipReadBytes);
+                $this->skipReadBytes = max(0, $this->skipReadBytes - $len);
+            }
+
+            $data .= $remoteData;
+            $this->stream->write($remoteData);
+        }
+
+        return $data;
+    }
+
+    public function write($string)
+    {
+        // When appending to the end of the currently read stream, you'll want
+        // to skip bytes from being read from the remote stream to emulate
+        // other stream wrappers. Basically replacing bytes of data of a fixed
+        // length.
+        $overflow = (strlen($string) + $this->tell()) - $this->remoteStream->tell();
+        if ($overflow > 0) {
+            $this->skipReadBytes += $overflow;
+        }
+
+        return $this->stream->write($string);
+    }
+
+    public function eof()
+    {
+        return $this->stream->eof() && $this->remoteStream->eof();
+    }
+
+    /**
+     * Close both the remote stream and buffer stream
+     */
+    public function close()
+    {
+        $this->remoteStream->close() && $this->stream->close();
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/DroppingStream.php
@@ -0,0 +1,42 @@
+<?php
+namespace GuzzleHttp\Stream;
+
+/**
+ * Stream decorator that begins dropping data once the size of the underlying
+ * stream becomes too full.
+ */
+class DroppingStream implements StreamInterface
+{
+    use StreamDecoratorTrait;
+
+    private $maxLength;
+
+    /**
+     * @param StreamInterface $stream    Underlying stream to decorate.
+     * @param int             $maxLength Maximum size before dropping data.
+     */
+    public function __construct(StreamInterface $stream, $maxLength)
+    {
+        $this->stream = $stream;
+        $this->maxLength = $maxLength;
+    }
+
+    public function write($string)
+    {
+        $diff = $this->maxLength - $this->stream->getSize();
+
+        // Begin returning false when the underlying stream is too large.
+        if ($diff <= 0) {
+            return false;
+        }
+
+        // Write the stream or a subset of the stream if needed.
+        if (strlen($string) < $diff) {
+            return $this->stream->write($string);
+        }
+
+        $this->stream->write(substr($string, 0, $diff));
+
+        return false;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/Exception/CannotAttachException.php
@@ -0,0 +1,4 @@
+<?php
+namespace GuzzleHttp\Stream\Exception;
+
+class CannotAttachException extends \RuntimeException {}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/Exception/SeekException.php
@@ -0,0 +1,27 @@
+<?php
+namespace GuzzleHttp\Stream\Exception;
+
+use GuzzleHttp\Stream\StreamInterface;
+
+/**
+ * Exception thrown when a seek fails on a stream.
+ */
+class SeekException extends \RuntimeException
+{
+    private $stream;
+
+    public function __construct(StreamInterface $stream, $pos = 0, $msg = '')
+    {
+        $this->stream = $stream;
+        $msg = $msg ?: 'Could not seek the stream to position ' . $pos;
+        parent::__construct($msg);
+    }
+
+    /**
+     * @return StreamInterface
+     */
+    public function getStream()
+    {
+        return $this->stream;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/FnStream.php
@@ -0,0 +1,147 @@
+<?php
+namespace GuzzleHttp\Stream;
+
+/**
+ * Compose stream implementations based on a hash of functions.
+ *
+ * Allows for easy testing and extension of a provided stream without needing
+ * to create a concrete class for a simple extension point.
+ */
+class FnStream implements StreamInterface
+{
+    /** @var array */
+    private $methods;
+
+    /** @var array Methods that must be implemented in the given array */
+    private static $slots = ['__toString', 'close', 'detach', 'attach',
+        'getSize', 'tell', 'eof', 'isSeekable', 'seek', 'isWritable', 'write',
+        'isReadable', 'read', 'getContents', 'getMetadata'];
+
+    /**
+     * @param array $methods Hash of method name to a callable.
+     */
+    public function __construct(array $methods)
+    {
+        $this->methods = $methods;
+
+        // Create the functions on the class
+        foreach ($methods as $name => $fn) {
+            $this->{'_fn_' . $name} = $fn;
+        }
+    }
+
+    /**
+     * Lazily determine which methods are not implemented.
+     * @throws \BadMethodCallException
+     */
+    public function __get($name)
+    {
+        throw new \BadMethodCallException(str_replace('_fn_', '', $name)
+            . '() is not implemented in the FnStream');
+    }
+
+    /**
+     * The close method is called on the underlying stream only if possible.
+     */
+    public function __destruct()
+    {
+        if (isset($this->_fn_close)) {
+            call_user_func($this->_fn_close);
+        }
+    }
+
+    /**
+     * Adds custom functionality to an underlying stream by intercepting
+     * specific method calls.
+     *
+     * @param StreamInterface $stream  Stream to decorate
+     * @param array           $methods Hash of method name to a closure
+     *
+     * @return FnStream
+     */
+    public static function decorate(StreamInterface $stream, array $methods)
+    {
+        // If any of the required methods were not provided, then simply
+        // proxy to the decorated stream.
+        foreach (array_diff(self::$slots, array_keys($methods)) as $diff) {
+            $methods[$diff] = [$stream, $diff];
+        }
+
+        return new self($methods);
+    }
+
+    public function __toString()
+    {
+        return call_user_func($this->_fn___toString);
+    }
+
+    public function close()
+    {
+        return call_user_func($this->_fn_close);
+    }
+
+    public function detach()
+    {
+        return call_user_func($this->_fn_detach);
+    }
+
+    public function attach($stream)
+    {
+        return call_user_func($this->_fn_attach, $stream);
+    }
+
+    public function getSize()
+    {
+        return call_user_func($this->_fn_getSize);
+    }
+
+    public function tell()
+    {
+        return call_user_func($this->_fn_tell);
+    }
+
+    public function eof()
+    {
+        return call_user_func($this->_fn_eof);
+    }
+
+    public function isSeekable()
+    {
+        return call_user_func($this->_fn_isSeekable);
+    }
+
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        return call_user_func($this->_fn_seek, $offset, $whence);
+    }
+
+    public function isWritable()
+    {
+        return call_user_func($this->_fn_isWritable);
+    }
+
+    public function write($string)
+    {
+        return call_user_func($this->_fn_write, $string);
+    }
+
+    public function isReadable()
+    {
+        return call_user_func($this->_fn_isReadable);
+    }
+
+    public function read($length)
+    {
+        return call_user_func($this->_fn_read, $length);
+    }
+
+    public function getContents()
+    {
+        return call_user_func($this->_fn_getContents);
+    }
+
+    public function getMetadata($key = null)
+    {
+        return call_user_func($this->_fn_getMetadata, $key);
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/GuzzleStreamWrapper.php
@@ -0,0 +1,117 @@
+<?php
+namespace GuzzleHttp\Stream;
+
+/**
+ * Converts Guzzle streams into PHP stream resources.
+ */
+class GuzzleStreamWrapper
+{
+    /** @var resource */
+    public $context;
+
+    /** @var StreamInterface */
+    private $stream;
+
+    /** @var string r, r+, or w */
+    private $mode;
+
+    /**
+     * Returns a resource representing the stream.
+     *
+     * @param StreamInterface $stream The stream to get a resource for
+     *
+     * @return resource
+     * @throws \InvalidArgumentException if stream is not readable or writable
+     */
+    public static function getResource(StreamInterface $stream)
+    {
+        self::register();
+
+        if ($stream->isReadable()) {
+            $mode = $stream->isWritable() ? 'r+' : 'r';
+        } elseif ($stream->isWritable()) {
+            $mode = 'w';
+        } else {
+            throw new \InvalidArgumentException('The stream must be readable, '
+                . 'writable, or both.');
+        }
+
+        return fopen('guzzle://stream', $mode, null, stream_context_create([
+            'guzzle' => ['stream' => $stream]
+        ]));
+    }
+
+    /**
+     * Registers the stream wrapper if needed
+     */
+    public static function register()
+    {
+        if (!in_array('guzzle', stream_get_wrappers())) {
+            stream_wrapper_register('guzzle', __CLASS__);
+        }
+    }
+
+    public function stream_open($path, $mode, $options, &$opened_path)
+    {
+        $options = stream_context_get_options($this->context);
+
+        if (!isset($options['guzzle']['stream'])) {
+            return false;
+        }
+
+        $this->mode = $mode;
+        $this->stream = $options['guzzle']['stream'];
+
+        return true;
+    }
+
+    public function stream_read($count)
+    {
+        return $this->stream->read($count);
+    }
+
+    public function stream_write($data)
+    {
+        return (int) $this->stream->write($data);
+    }
+
+    public function stream_tell()
+    {
+        return $this->stream->tell();
+    }
+
+    public function stream_eof()
+    {
+        return $this->stream->eof();
+    }
+
+    public function stream_seek($offset, $whence)
+    {
+        return $this->stream->seek($offset, $whence);
+    }
+
+    public function stream_stat()
+    {
+        static $modeMap = [
+            'r'  => 33060,
+            'r+' => 33206,
+            'w'  => 33188
+        ];
+
+        return [
+            'dev'     => 0,
+            'ino'     => 0,
+            'mode'    => $modeMap[$this->mode],
+            'nlink'   => 0,
+            'uid'     => 0,
+            'gid'     => 0,
+            'rdev'    => 0,
+            'size'    => $this->stream->getSize() ?: 0,
+            'atime'   => 0,
+            'mtime'   => 0,
+            'ctime'   => 0,
+            'blksize' => 0,
+            'blocks'  => 0
+        ];
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/InflateStream.php
@@ -0,0 +1,27 @@
+<?php
+namespace GuzzleHttp\Stream;
+
+/**
+ * Uses PHP's zlib.inflate filter to inflate deflate or gzipped content.
+ *
+ * This stream decorator skips the first 10 bytes of the given stream to remove
+ * the gzip header, converts the provided stream to a PHP stream resource,
+ * then appends the zlib.inflate filter. The stream is then converted back
+ * to a Guzzle stream resource to be used as a Guzzle stream.
+ *
+ * @link http://tools.ietf.org/html/rfc1952
+ * @link http://php.net/manual/en/filters.compression.php
+ */
+class InflateStream implements StreamInterface
+{
+    use StreamDecoratorTrait;
+
+    public function __construct(StreamInterface $stream)
+    {
+        // Skip the first 10 bytes
+        $stream = new LimitStream($stream, -1, 10);
+        $resource = GuzzleStreamWrapper::getResource($stream);
+        stream_filter_append($resource, 'zlib.inflate', STREAM_FILTER_READ);
+        $this->stream = new Stream($resource);
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/LazyOpenStream.php
@@ -0,0 +1,37 @@
+<?php
+namespace GuzzleHttp\Stream;
+
+/**
+ * Lazily reads or writes to a file that is opened only after an IO operation
+ * take place on the stream.
+ */
+class LazyOpenStream implements StreamInterface
+{
+    use StreamDecoratorTrait;
+
+    /** @var string File to open */
+    private $filename;
+
+    /** @var string $mode */
+    private $mode;
+
+    /**
+     * @param string $filename File to lazily open
+     * @param string $mode     fopen mode to use when opening the stream
+     */
+    public function __construct($filename, $mode)
+    {
+        $this->filename = $filename;
+        $this->mode = $mode;
+    }
+
+    /**
+     * Creates the underlying stream lazily when required.
+     *
+     * @return StreamInterface
+     */
+    protected function createStream()
+    {
+        return Stream::factory(Utils::open($this->filename, $this->mode));
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/LimitStream.php
@@ -0,0 +1,161 @@
+<?php
+namespace GuzzleHttp\Stream;
+
+use GuzzleHttp\Stream\Exception\SeekException;
+
+/**
+ * Decorator used to return only a subset of a stream
+ */
+class LimitStream implements StreamInterface
+{
+    use StreamDecoratorTrait;
+
+    /** @var int Offset to start reading from */
+    private $offset;
+
+    /** @var int Limit the number of bytes that can be read */
+    private $limit;
+
+    /**
+     * @param StreamInterface $stream Stream to wrap
+     * @param int             $limit  Total number of bytes to allow to be read
+     *                                from the stream. Pass -1 for no limit.
+     * @param int|null        $offset Position to seek to before reading (only
+     *                                works on seekable streams).
+     */
+    public function __construct(
+        StreamInterface $stream,
+        $limit = -1,
+        $offset = 0
+    ) {
+        $this->stream = $stream;
+        $this->setLimit($limit);
+        $this->setOffset($offset);
+    }
+
+    public function eof()
+    {
+        // Always return true if the underlying stream is EOF
+        if ($this->stream->eof()) {
+            return true;
+        }
+
+        // No limit and the underlying stream is not at EOF
+        if ($this->limit == -1) {
+            return false;
+        }
+
+        $tell = $this->stream->tell();
+        if ($tell === false) {
+            return false;
+        }
+
+        return $tell >= $this->offset + $this->limit;
+    }
+
+    /**
+     * Returns the size of the limited subset of data
+     * {@inheritdoc}
+     */
+    public function getSize()
+    {
+        if (null === ($length = $this->stream->getSize())) {
+            return null;
+        } elseif ($this->limit == -1) {
+            return $length - $this->offset;
+        } else {
+            return min($this->limit, $length - $this->offset);
+        }
+    }
+
+    /**
+     * Allow for a bounded seek on the read limited stream
+     * {@inheritdoc}
+     */
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        if ($whence !== SEEK_SET || $offset < 0) {
+            return false;
+        }
+
+        $offset += $this->offset;
+
+        if ($this->limit !== -1) {
+            if ($offset > $this->offset + $this->limit) {
+                $offset = $this->offset + $this->limit;
+            }
+        }
+
+        return $this->stream->seek($offset);
+    }
+
+    /**
+     * Give a relative tell()
+     * {@inheritdoc}
+     */
+    public function tell()
+    {
+        return $this->stream->tell() - $this->offset;
+    }
+
+    /**
+     * Set the offset to start limiting from
+     *
+     * @param int $offset Offset to seek to and begin byte limiting from
+     *
+     * @return self
+     * @throws SeekException
+     */
+    public function setOffset($offset)
+    {
+        $current = $this->stream->tell();
+
+        if ($current !== $offset) {
+            // If the stream cannot seek to the offset position, then read to it
+            if (!$this->stream->seek($offset)) {
+                if ($current > $offset) {
+                    throw new SeekException($this, $offset);
+                } else {
+                    $this->stream->read($offset - $current);
+                }
+            }
+        }
+
+        $this->offset = $offset;
+
+        return $this;
+    }
+
+    /**
+     * Set the limit of bytes that the decorator allows to be read from the
+     * stream.
+     *
+     * @param int $limit Number of bytes to allow to be read from the stream.
+     *                   Use -1 for no limit.
+     * @return self
+     */
+    public function setLimit($limit)
+    {
+        $this->limit = $limit;
+
+        return $this;
+    }
+
+    public function read($length)
+    {
+        if ($this->limit == -1) {
+            return $this->stream->read($length);
+        }
+
+        // Check if the current position is less than the total allowed
+        // bytes + original offset
+        $remaining = ($this->offset + $this->limit) - $this->stream->tell();
+        if ($remaining > 0) {
+            // Only return the amount of requested data, ensuring that the byte
+            // limit is not exceeded
+            return $this->stream->read(min($remaining, $length));
+        } else {
+            return false;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/MetadataStreamInterface.php
@@ -0,0 +1,11 @@
+<?php
+namespace GuzzleHttp\Stream;
+
+/**
+ * This interface is deprecated and should no longer be used. Just use
+ * StreamInterface now that the getMetadata method has been added to
+ * StreamInterface.
+ *
+ * @deprecated
+ */
+interface MetadataStreamInterface extends StreamInterface {}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/NoSeekStream.php
@@ -0,0 +1,25 @@
+<?php
+namespace GuzzleHttp\Stream;
+
+/**
+ * Stream decorator that prevents a stream from being seeked
+ */
+class NoSeekStream implements StreamInterface
+{
+    use StreamDecoratorTrait;
+
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        return false;
+    }
+
+    public function isSeekable()
+    {
+        return false;
+    }
+
+    public function attach($stream)
+    {
+        $this->stream->attach($stream);
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/NullStream.php
@@ -0,0 +1,78 @@
+<?php
+namespace GuzzleHttp\Stream;
+use GuzzleHttp\Stream\Exception\CannotAttachException;
+
+/**
+ * Does not store any data written to it.
+ */
+class NullStream implements StreamInterface
+{
+    public function __toString()
+    {
+        return '';
+    }
+
+    public function getContents()
+    {
+        return '';
+    }
+
+    public function close() {}
+
+    public function detach() {}
+
+    public function attach($stream)
+    {
+        throw new CannotAttachException();
+    }
+
+    public function getSize()
+    {
+        return 0;
+    }
+
+    public function isReadable()
+    {
+        return true;
+    }
+
+    public function isWritable()
+    {
+        return true;
+    }
+
+    public function isSeekable()
+    {
+        return true;
+    }
+
+    public function eof()
+    {
+        return true;
+    }
+
+    public function tell()
+    {
+        return 0;
+    }
+
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        return false;
+    }
+
+    public function read($length)
+    {
+        return false;
+    }
+
+    public function write($string)
+    {
+        return strlen($string);
+    }
+
+    public function getMetadata($key = null)
+    {
+        return $key ? null : [];
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/PumpStream.php
@@ -0,0 +1,161 @@
+<?php
+namespace GuzzleHttp\Stream;
+
+use GuzzleHttp\Stream\Exception\CannotAttachException;
+
+/**
+ * Provides a read only stream that pumps data from a PHP callable.
+ *
+ * When invoking the provided callable, the PumpStream will pass the amount of
+ * data requested to read to the callable. The callable can choose to ignore
+ * this value and return fewer or more bytes than requested. Any extra data
+ * returned by the provided callable is buffered internally until drained using
+ * the read() function of the PumpStream. The provided callable MUST return
+ * false when there is no more data to read.
+ */
+class PumpStream implements StreamInterface
+{
+    /** @var callable */
+    private $source;
+
+    /** @var int */
+    private $size;
+
+    /** @var int */
+    private $tellPos = 0;
+
+    /** @var array */
+    private $metadata;
+
+    /** @var BufferStream */
+    private $buffer;
+
+    /**
+     * @param callable $source Source of the stream data. The callable MAY
+     *                         accept an integer argument used to control the
+     *                         amount of data to return. The callable MUST
+     *                         return a string when called, or false on error
+     *                         or EOF.
+     * @param array $options   Stream options:
+     *                         - metadata: Hash of metadata to use with stream.
+     *                         - size: Size of the stream, if known.
+     */
+    public function __construct(callable $source, array $options = [])
+    {
+        $this->source = $source;
+        $this->size = isset($options['size']) ? $options['size'] : null;
+        $this->metadata = isset($options['metadata']) ? $options['metadata'] : [];
+        $this->buffer = new BufferStream();
+    }
+
+    public function __toString()
+    {
+        return Utils::copyToString($this);
+    }
+
+    public function close()
+    {
+        $this->detach();
+    }
+
+    public function detach()
+    {
+        $this->tellPos = false;
+        $this->source = null;
+    }
+
+    public function attach($stream)
+    {
+        throw new CannotAttachException();
+    }
+
+    public function getSize()
+    {
+        return $this->size;
+    }
+
+    public function tell()
+    {
+        return $this->tellPos;
+    }
+
+    public function eof()
+    {
+        return !$this->source;
+    }
+
+    public function isSeekable()
+    {
+        return false;
+    }
+
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        return false;
+    }
+
+    public function isWritable()
+    {
+        return false;
+    }
+
+    public function write($string)
+    {
+        return false;
+    }
+
+    public function isReadable()
+    {
+        return true;
+    }
+
+    public function read($length)
+    {
+        $data = $this->buffer->read($length);
+        $readLen = strlen($data);
+        $this->tellPos += $readLen;
+        $remaining = $length - $readLen;
+
+        if ($remaining) {
+            $this->pump($remaining);
+            $data .= $this->buffer->read($remaining);
+            $this->tellPos += strlen($data) - $readLen;
+        }
+
+        return $data;
+    }
+
+    public function getContents()
+    {
+        $result = '';
+        while (!$this->eof()) {
+            $result .= $this->read(1000000);
+        }
+
+        return $result;
+    }
+
+    public function getMetadata($key = null)
+    {
+        if (!$key) {
+            return $this->metadata;
+        }
+
+        return isset($this->metadata[$key]) ? $this->metadata[$key] : null;
+    }
+
+    private function pump($length)
+    {
+        if ($this->source) {
+            do {
+                $data = call_user_func($this->source, $length);
+                if ($data === false || $data === null) {
+                    $this->source = null;
+                    return;
+                }
+                $this->buffer->write($data);
+                $length -= strlen($data);
+            } while ($length > 0);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/Stream.php
@@ -0,0 +1,261 @@
+<?php
+namespace GuzzleHttp\Stream;
+
+/**
+ * PHP stream implementation
+ */
+class Stream implements StreamInterface
+{
+    private $stream;
+    private $size;
+    private $seekable;
+    private $readable;
+    private $writable;
+    private $uri;
+    private $customMetadata;
+
+    /** @var array Hash of readable and writable stream types */
+    private static $readWriteHash = [
+        'read' => [
+            'r' => true, 'w+' => true, 'r+' => true, 'x+' => true, 'c+' => true,
+            'rb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true,
+            'c+b' => true, 'rt' => true, 'w+t' => true, 'r+t' => true,
+            'x+t' => true, 'c+t' => true, 'a+' => true
+        ],
+        'write' => [
+            'w' => true, 'w+' => true, 'rw' => true, 'r+' => true, 'x+' => true,
+            'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true,
+            'x+b' => true, 'c+b' => true, 'w+t' => true, 'r+t' => true,
+            'x+t' => true, 'c+t' => true, 'a' => true, 'a+' => true
+        ]
+    ];
+
+    /**
+     * Create a new stream based on the input type.
+     *
+     * This factory accepts the same associative array of options as described
+     * in the constructor.
+     *
+     * @param resource|string|StreamInterface $resource Entity body data
+     * @param array                           $options  Additional options
+     *
+     * @return Stream
+     * @throws \InvalidArgumentException if the $resource arg is not valid.
+     */
+    public static function factory($resource = '', array $options = [])
+    {
+        $type = gettype($resource);
+
+        if ($type == 'string') {
+            $stream = fopen('php://temp', 'r+');
+            if ($resource !== '') {
+                fwrite($stream, $resource);
+                fseek($stream, 0);
+            }
+            return new self($stream, $options);
+        }
+
+        if ($type == 'resource') {
+            return new self($resource, $options);
+        }
+
+        if ($resource instanceof StreamInterface) {
+            return $resource;
+        }
+
+        if ($type == 'object' && method_exists($resource, '__toString')) {
+            return self::factory((string) $resource, $options);
+        }
+
+        if (is_callable($resource)) {
+            return new PumpStream($resource, $options);
+        }
+
+        if ($resource instanceof \Iterator) {
+            return new PumpStream(function () use ($resource) {
+                if (!$resource->valid()) {
+                    return false;
+                }
+                $result = $resource->current();
+                $resource->next();
+                return $result;
+            }, $options);
+        }
+
+        throw new \InvalidArgumentException('Invalid resource type: ' . $type);
+    }
+
+    /**
+     * This constructor accepts an associative array of options.
+     *
+     * - size: (int) If a read stream would otherwise have an indeterminate
+     *   size, but the size is known due to foreknownledge, then you can
+     *   provide that size, in bytes.
+     * - metadata: (array) Any additional metadata to return when the metadata
+     *   of the stream is accessed.
+     *
+     * @param resource $stream  Stream resource to wrap.
+     * @param array    $options Associative array of options.
+     *
+     * @throws \InvalidArgumentException if the stream is not a stream resource
+     */
+    public function __construct($stream, $options = [])
+    {
+        if (!is_resource($stream)) {
+            throw new \InvalidArgumentException('Stream must be a resource');
+        }
+
+        if (isset($options['size'])) {
+            $this->size = $options['size'];
+        }
+
+        $this->customMetadata = isset($options['metadata'])
+            ? $options['metadata']
+            : [];
+
+        $this->attach($stream);
+    }
+
+    /**
+     * Closes the stream when the destructed
+     */
+    public function __destruct()
+    {
+        $this->close();
+    }
+
+    public function __toString()
+    {
+        if (!$this->stream) {
+            return '';
+        }
+
+        $this->seek(0);
+
+        return (string) stream_get_contents($this->stream);
+    }
+
+    public function getContents()
+    {
+        return $this->stream ? stream_get_contents($this->stream) : '';
+    }
+
+    public function close()
+    {
+        if (is_resource($this->stream)) {
+            fclose($this->stream);
+        }
+
+        $this->detach();
+    }
+
+    public function detach()
+    {
+        $result = $this->stream;
+        $this->stream = $this->size = $this->uri = null;
+        $this->readable = $this->writable = $this->seekable = false;
+
+        return $result;
+    }
+
+    public function attach($stream)
+    {
+        $this->stream = $stream;
+        $meta = stream_get_meta_data($this->stream);
+        $this->seekable = $meta['seekable'];
+        $this->readable = isset(self::$readWriteHash['read'][$meta['mode']]);
+        $this->writable = isset(self::$readWriteHash['write'][$meta['mode']]);
+        $this->uri = $this->getMetadata('uri');
+    }
+
+    public function getSize()
+    {
+        if ($this->size !== null) {
+            return $this->size;
+        }
+
+        if (!$this->stream) {
+            return null;
+        }
+
+        // Clear the stat cache if the stream has a URI
+        if ($this->uri) {
+            clearstatcache(true, $this->uri);
+        }
+
+        $stats = fstat($this->stream);
+        if (isset($stats['size'])) {
+            $this->size = $stats['size'];
+            return $this->size;
+        }
+
+        return null;
+    }
+
+    public function isReadable()
+    {
+        return $this->readable;
+    }
+
+    public function isWritable()
+    {
+        return $this->writable;
+    }
+
+    public function isSeekable()
+    {
+        return $this->seekable;
+    }
+
+    public function eof()
+    {
+        return !$this->stream || feof($this->stream);
+    }
+
+    public function tell()
+    {
+        return $this->stream ? ftell($this->stream) : false;
+    }
+
+    public function setSize($size)
+    {
+        $this->size = $size;
+
+        return $this;
+    }
+
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        return $this->seekable
+            ? fseek($this->stream, $offset, $whence) === 0
+            : false;
+    }
+
+    public function read($length)
+    {
+        return $this->readable ? fread($this->stream, $length) : false;
+    }
+
+    public function write($string)
+    {
+        // We can't know the size after writing anything
+        $this->size = null;
+
+        return $this->writable ? fwrite($this->stream, $string) : false;
+    }
+
+    public function getMetadata($key = null)
+    {
+        if (!$this->stream) {
+            return $key ? null : [];
+        } elseif (!$key) {
+            return $this->customMetadata + stream_get_meta_data($this->stream);
+        } elseif (isset($this->customMetadata[$key])) {
+            return $this->customMetadata[$key];
+        }
+
+        $meta = stream_get_meta_data($this->stream);
+
+        return isset($meta[$key]) ? $meta[$key] : null;
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/StreamDecoratorTrait.php
@@ -0,0 +1,143 @@
+<?php
+namespace GuzzleHttp\Stream;
+use GuzzleHttp\Stream\Exception\CannotAttachException;
+
+/**
+ * Stream decorator trait
+ * @property StreamInterface stream
+ */
+trait StreamDecoratorTrait
+{
+    /**
+     * @param StreamInterface $stream Stream to decorate
+     */
+    public function __construct(StreamInterface $stream)
+    {
+        $this->stream = $stream;
+    }
+
+    /**
+     * Magic method used to create a new stream if streams are not added in
+     * the constructor of a decorator (e.g., LazyOpenStream).
+     */
+    public function __get($name)
+    {
+        if ($name == 'stream') {
+            $this->stream = $this->createStream();
+            return $this->stream;
+        }
+
+        throw new \UnexpectedValueException("$name not found on class");
+    }
+
+    public function __toString()
+    {
+        try {
+            $this->seek(0);
+            return $this->getContents();
+        } catch (\Exception $e) {
+            // Really, PHP? https://bugs.php.net/bug.php?id=53648
+            trigger_error('StreamDecorator::__toString exception: '
+                . (string) $e, E_USER_ERROR);
+            return '';
+        }
+    }
+
+    public function getContents()
+    {
+        return Utils::copyToString($this);
+    }
+
+    /**
+     * Allow decorators to implement custom methods
+     *
+     * @param string $method Missing method name
+     * @param array  $args   Method arguments
+     *
+     * @return mixed
+     */
+    public function __call($method, array $args)
+    {
+        $result = call_user_func_array(array($this->stream, $method), $args);
+
+        // Always return the wrapped object if the result is a return $this
+        return $result === $this->stream ? $this : $result;
+    }
+
+    public function close()
+    {
+        $this->stream->close();
+    }
+
+    public function getMetadata($key = null)
+    {
+        return $this->stream->getMetadata($key);
+    }
+
+    public function detach()
+    {
+        return $this->stream->detach();
+    }
+
+    public function attach($stream)
+    {
+        throw new CannotAttachException();
+    }
+
+    public function getSize()
+    {
+        return $this->stream->getSize();
+    }
+
+    public function eof()
+    {
+        return $this->stream->eof();
+    }
+
+    public function tell()
+    {
+        return $this->stream->tell();
+    }
+
+    public function isReadable()
+    {
+        return $this->stream->isReadable();
+    }
+
+    public function isWritable()
+    {
+        return $this->stream->isWritable();
+    }
+
+    public function isSeekable()
+    {
+        return $this->stream->isSeekable();
+    }
+
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        return $this->stream->seek($offset, $whence);
+    }
+
+    public function read($length)
+    {
+        return $this->stream->read($length);
+    }
+
+    public function write($string)
+    {
+        return $this->stream->write($string);
+    }
+
+    /**
+     * Implement in subclasses to dynamically create streams when requested.
+     *
+     * @return StreamInterface
+     * @throws \BadMethodCallException
+     */
+    protected function createStream()
+    {
+        throw new \BadMethodCallException('createStream() not implemented in '
+            . get_class($this));
+    }
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/StreamInterface.php
@@ -0,0 +1,159 @@
+<?php
+namespace GuzzleHttp\Stream;
+
+/**
+ * Describes a stream instance.
+ */
+interface StreamInterface
+{
+    /**
+     * Attempts to seek to the beginning of the stream and reads all data into
+     * a string until the end of the stream is reached.
+     *
+     * Warning: This could attempt to load a large amount of data into memory.
+     *
+     * @return string
+     */
+    public function __toString();
+
+    /**
+     * Closes the stream and any underlying resources.
+     */
+    public function close();
+
+    /**
+     * Separates any underlying resources from the stream.
+     *
+     * After the underlying resource has been detached, the stream object is in
+     * an unusable state. If you wish to use a Stream object as a PHP stream
+     * but keep the Stream object in a consistent state, use
+     * {@see GuzzleHttp\Stream\GuzzleStreamWrapper::getResource}.
+     *
+     * @return resource|null Returns the underlying PHP stream resource or null
+     *                       if the Stream object did not utilize an underlying
+     *                       stream resource.
+     */
+    public function detach();
+
+    /**
+     * Replaces the underlying stream resource with the provided stream.
+     *
+     * Use this method to replace the underlying stream with another; as an
+     * example, in server-side code, if you decide to return a file, you
+     * would replace the original content-oriented stream with the file
+     * stream.
+     *
+     * Any internal state such as caching of cursor position should be reset
+     * when attach() is called, as the stream has changed.
+     *
+     * @param resource $stream
+     *
+     * @return void
+     */
+    public function attach($stream);
+
+    /**
+     * Get the size of the stream if known
+     *
+     * @return int|null Returns the size in bytes if known, or null if unknown
+     */
+    public function getSize();
+
+    /**
+     * Returns the current position of the file read/write pointer
+     *
+     * @return int|bool Returns the position of the file pointer or false on error
+     */
+    public function tell();
+
+    /**
+     * Returns true if the stream is at the end of the stream.
+     *
+     * @return bool
+     */
+    public function eof();
+
+    /**
+     * Returns whether or not the stream is seekable
+     *
+     * @return bool
+     */
+    public function isSeekable();
+
+    /**
+     * Seek to a position in the stream
+     *
+     * @param int $offset Stream offset
+     * @param int $whence Specifies how the cursor position will be calculated
+     *                    based on the seek offset. Valid values are identical
+     *                    to the built-in PHP $whence values for `fseek()`.
+     *                    SEEK_SET: Set position equal to offset bytes
+     *                    SEEK_CUR: Set position to current location plus offset
+     *                    SEEK_END: Set position to end-of-stream plus offset
+     *
+     * @return bool Returns true on success or false on failure
+     * @link   http://www.php.net/manual/en/function.fseek.php
+     */
+    public function seek($offset, $whence = SEEK_SET);
+
+    /**
+     * Returns whether or not the stream is writable
+     *
+     * @return bool
+     */
+    public function isWritable();
+
+    /**
+     * Write data to the stream
+     *
+     * @param string $string The string that is to be written.
+     *
+     * @return int|bool Returns the number of bytes written to the stream on
+     *                  success returns false on failure (e.g., broken pipe,
+     *                  writer needs to slow down, buffer is full, etc.)
+     */
+    public function write($string);
+
+    /**
+     * Returns whether or not the stream is readable
+     *
+     * @return bool
+     */
+    public function isReadable();
+
+    /**
+     * Read data from the stream
+     *
+     * @param int $length Read up to $length bytes from the object and return
+     *                    them. Fewer than $length bytes may be returned if
+     *                    underlying stream call returns fewer bytes.
+     *
+     * @return string     Returns the data read from the stream.
+     */
+    public function read($length);
+
+    /**
+     * Returns the remaining contents of the stream as a string.
+     *
+     * Note: this could potentially load a large amount of data into memory.
+     *
+     * @return string
+     */
+    public function getContents();
+
+    /**
+     * Get stream metadata as an associative array or retrieve a specific key.
+     *
+     * The keys returned are identical to the keys returned from PHP's
+     * stream_get_meta_data() function.
+     *
+     * @param string $key Specific metadata to retrieve.
+     *
+     * @return array|mixed|null Returns an associative array if no key is
+     *                          no key is provided. Returns a specific key
+     *                          value if a key is provided and the value is
+     *                          found, or null if the key is not found.
+     * @see http://php.net/manual/en/function.stream-get-meta-data.php
+     */
+    public function getMetadata($key = null);
+}
--- /dev/null
+++ b/vendor/guzzlehttp/streams/src/Utils.php
@@ -0,0 +1,196 @@
+<?php
+namespace GuzzleHttp\Stream;
+
+use GuzzleHttp\Stream\Exception\SeekException;
+
+/**
+ * Static utility class because PHP's autoloaders don't support the concept
+ * of namespaced function autoloading.
+ */
+class Utils
+{
+    /**
+     * Safely opens a PHP stream resource using a filename.
+     *
+     * When fopen fails, PHP normally raises a warning. This function adds an
+     * error handler that checks for errors and throws an exception instead.
+     *
+     * @param string $filename File to open
+     * @param string $mode     Mode used to open the file
+     *
+     * @return resource
+     * @throws \RuntimeException if the file cannot be opened
+     */
+    public static function open($filename, $mode)
+    {
+        $ex = null;
+        set_error_handler(function () use ($filename, $mode, &$ex) {
+            $ex = new \RuntimeException(sprintf(
+                'Unable to open %s using mode %s: %s',
+                $filename,
+                $mode,
+                func_get_args()[1]
+            ));
+        });
+
+        $handle = fopen($filename, $mode);
+        restore_error_handler();
+
+        if ($ex) {
+            /** @var $ex \RuntimeException */
+            throw $ex;
+        }
+
+        return $handle;
+    }
+
+    /**
+     * Copy the contents of a stream into a string until the given number of
+     * bytes have been read.
+     *
+     * @param StreamInterface $stream Stream to read
+     * @param int             $maxLen Maximum number of bytes to read. Pass -1
+     *                                to read the entire stream.
+     * @return string
+     */
+    public static function copyToString(StreamInterface $stream, $maxLen = -1)
+    {
+        $buffer = '';
+
+        if ($maxLen === -1) {
+            while (!$stream->eof()) {
+                $buf = $stream->read(1048576);
+                if ($buf === false) {
+                    break;
+                }
+                $buffer .= $buf;
+            }
+            return $buffer;
+        }
+
+        $len = 0;
+        while (!$stream->eof() && $len < $maxLen) {
+            $buf = $stream->read($maxLen - $len);
+            if ($buf === false) {
+                break;
+            }
+            $buffer .= $buf;
+            $len = strlen($buffer);
+        }
+
+        return $buffer;
+    }
+
+    /**
+     * Copy the contents of a stream into another stream until the given number
+     * of bytes have been read.
+     *
+     * @param StreamInterface $source Stream to read from
+     * @param StreamInterface $dest   Stream to write to
+     * @param int             $maxLen Maximum number of bytes to read. Pass -1
+     *                                to read the entire stream.
+     */
+    public static function copyToStream(
+        StreamInterface $source,
+        StreamInterface $dest,
+        $maxLen = -1
+    ) {
+        if ($maxLen === -1) {
+            while (!$source->eof()) {
+                if (!$dest->write($source->read(1048576))) {
+                    break;
+                }
+            }
+            return;
+        }
+
+        $bytes = 0;
+        while (!$source->eof()) {
+            $buf = $source->read($maxLen - $bytes);
+            if (!($len = strlen($buf))) {
+                break;
+            }
+            $bytes += $len;
+            $dest->write($buf);
+            if ($bytes == $maxLen) {
+                break;
+            }
+        }
+    }
+
+    /**
+     * Calculate a hash of a Stream
+     *
+     * @param StreamInterface $stream    Stream to calculate the hash for
+     * @param string          $algo      Hash algorithm (e.g. md5, crc32, etc)
+     * @param bool            $rawOutput Whether or not to use raw output
+     *
+     * @return string Returns the hash of the stream
+     * @throws SeekException
+     */
+    public static function hash(
+        StreamInterface $stream,
+        $algo,
+        $rawOutput = false
+    ) {
+        $pos = $stream->tell();
+
+        if ($pos > 0 && !$stream->seek(0)) {
+            throw new SeekException($stream);
+        }
+
+        $ctx = hash_init($algo);
+        while (!$stream->eof()) {
+            hash_update($ctx, $stream->read(1048576));
+        }
+
+        $out = hash_final($ctx, (bool) $rawOutput);
+        $stream->seek($pos);
+
+        return $out;
+    }
+
+    /**
+     * Read a line from the stream up to the maximum allowed buffer length
+     *
+     * @param StreamInterface $stream    Stream to read from
+     * @param int             $maxLength Maximum buffer length
+     *
+     * @return string|bool
+     */
+    public static function readline(StreamInterface $stream, $maxLength = null)
+    {
+        $buffer = '';
+        $size = 0;
+
+        while (!$stream->eof()) {
+            if (false === ($byte = $stream->read(1))) {
+                return $buffer;
+            }
+            $buffer .= $byte;
+            // Break when a new line is found or the max length - 1 is reached
+            if ($byte == PHP_EOL || ++$size == $maxLength - 1) {
+                break;
+            }
+        }
+
+        return $buffer;
+    }
+
+    /**
+     * Alias of GuzzleHttp\Stream\Stream::factory.
+     *
+     * @param mixed $resource Resource to create
+     * @param array $options  Associative array of stream options defined in
+     *                        {@see \GuzzleHttp\Stream\Stream::__construct}
+     *
+     * @return StreamInterface
+     *
+     * @see GuzzleHttp\Stream\Stream::factory
+     * @see GuzzleHttp\Stream\Stream::__construct
+     */
+    public static function create($resource, array $options = [])
+    {
+        return Stream::factory($resource, $options);
+    }
+}
--- /dev/null
+++ b/vendor/ircmaxell/password-compat/LICENSE.md
@@ -0,0 +1,7 @@
+Copyright (c) 2012 Anthony Ferrara
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
--- /dev/null
+++ b/vendor/ircmaxell/password-compat/composer.json
@@ -0,0 +1,20 @@
+{
+    "name": "ircmaxell/password-compat",
+    "description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash",
+    "keywords": ["password", "hashing"],
+    "homepage": "https://github.com/ircmaxell/password_compat",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Anthony Ferrara",
+            "email": "ircmaxell@php.net",
+            "homepage": "http://blog.ircmaxell.com"
+        }
+    ],
+    "require-dev": {
+        "phpunit/phpunit": "4.*"
+    },
+    "autoload": {
+        "files": ["lib/password.php"]
+    }
+}
--- /dev/null
+++ b/vendor/ircmaxell/password-compat/lib/password.php
@@ -0,0 +1,314 @@
+<?php
+/**
+ * A Compatibility library with PHP 5.5's simplified password hashing API.
+ *
+ * @author Anthony Ferrara <ircmaxell@php.net>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @copyright 2012 The Authors
+ */
+
+namespace {
+
+    if (!defined('PASSWORD_BCRYPT')) {
+        /**
+         * PHPUnit Process isolation caches constants, but not function declarations.
+         * So we need to check if the constants are defined separately from 
+         * the functions to enable supporting process isolation in userland
+         * code.
+         */
+        define('PASSWORD_BCRYPT', 1);
+        define('PASSWORD_DEFAULT', PASSWORD_BCRYPT);
+        define('PASSWORD_BCRYPT_DEFAULT_COST', 10);
+    }
+
+    if (!function_exists('password_hash')) {
+
+        /**
+         * Hash the password using the specified algorithm
+         *
+         * @param string $password The password to hash
+         * @param int    $algo     The algorithm to use (Defined by PASSWORD_* constants)
+         * @param array  $options  The options for the algorithm to use
+         *
+         * @return string|false The hashed password, or false on error.
+         */
+        function password_hash($password, $algo, array $options = array()) {
+            if (!function_exists('crypt')) {
+                trigger_error("Crypt must be loaded for password_hash to function", E_USER_WARNING);
+                return null;
+            }
+            if (is_null($password) || is_int($password)) {
+                $password = (string) $password;
+            }
+            if (!is_string($password)) {
+                trigger_error("password_hash(): Password must be a string", E_USER_WARNING);
+                return null;
+            }
+            if (!is_int($algo)) {
+                trigger_error("password_hash() expects parameter 2 to be long, " . gettype($algo) . " given", E_USER_WARNING);
+                return null;
+            }
+            $resultLength = 0;
+            switch ($algo) {
+                case PASSWORD_BCRYPT:
+                    $cost = PASSWORD_BCRYPT_DEFAULT_COST;
+                    if (isset($options['cost'])) {
+                        $cost = $options['cost'];
+                        if ($cost < 4 || $cost > 31) {
+                            trigger_error(sprintf("password_hash(): Invalid bcrypt cost parameter specified: %d", $cost), E_USER_WARNING);
+                            return null;
+                        }
+                    }
+                    // The length of salt to generate
+                    $raw_salt_len = 16;
+                    // The length required in the final serialization
+                    $required_salt_len = 22;
+                    $hash_format = sprintf("$2y$%02d$", $cost);
+                    // The expected length of the final crypt() output
+                    $resultLength = 60;
+                    break;
+                default:
+                    trigger_error(sprintf("password_hash(): Unknown password hashing algorithm: %s", $algo), E_USER_WARNING);
+                    return null;
+            }
+            $salt_requires_encoding = false;
+            if (isset($options['salt'])) {
+                switch (gettype($options['salt'])) {
+                    case 'NULL':
+                    case 'boolean':
+                    case 'integer':
+                    case 'double':
+                    case 'string':
+                        $salt = (string) $options['salt'];
+                        break;
+                    case 'object':
+                        if (method_exists($options['salt'], '__tostring')) {
+                            $salt = (string) $options['salt'];
+                            break;
+                        }
+                    case 'array':
+                    case 'resource':
+                    default:
+                        trigger_error('password_hash(): Non-string salt parameter supplied', E_USER_WARNING);
+                        return null;
+                }
+                if (PasswordCompat\binary\_strlen($salt) < $required_salt_len) {
+                    trigger_error(sprintf("password_hash(): Provided salt is too short: %d expecting %d", PasswordCompat\binary\_strlen($salt), $required_salt_len), E_USER_WARNING);
+                    return null;
+                } elseif (0 == preg_match('#^[a-zA-Z0-9./]+$#D', $salt)) {
+                    $salt_requires_encoding = true;
+                }
+            } else {
+                $buffer = '';
+                $buffer_valid = false;
+                if (function_exists('mcrypt_create_iv') && !defined('PHALANGER')) {
+                    $buffer = mcrypt_create_iv($raw_salt_len, MCRYPT_DEV_URANDOM);
+                    if ($buffer) {
+                        $buffer_valid = true;
+                    }
+                }
+                if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) {
+                    $buffer = openssl_random_pseudo_bytes($raw_salt_len);
+                    if ($buffer) {
+                        $buffer_valid = true;
+                    }
+                }
+                if (!$buffer_valid && @is_readable('/dev/urandom')) {
+                    $f = fopen('/dev/urandom', 'r');
+                    $read = PasswordCompat\binary\_strlen($buffer);
+                    while ($read < $raw_salt_len) {
+                        $buffer .= fread($f, $raw_salt_len - $read);
+                        $read = PasswordCompat\binary\_strlen($buffer);
+                    }
+                    fclose($f);
+                    if ($read >= $raw_salt_len) {
+                        $buffer_valid = true;
+                    }
+                }
+                if (!$buffer_valid || PasswordCompat\binary\_strlen($buffer) < $raw_salt_len) {
+                    $bl = PasswordCompat\binary\_strlen($buffer);
+                    for ($i = 0; $i < $raw_salt_len; $i++) {
+                        if ($i < $bl) {
+                            $buffer[$i] = $buffer[$i] ^ chr(mt_rand(0, 255));
+                        } else {
+                            $buffer .= chr(mt_rand(0, 255));
+                        }
+                    }
+                }
+                $salt = $buffer;
+                $salt_requires_encoding = true;
+            }
+            if ($salt_requires_encoding) {
+                // encode string with the Base64 variant used by crypt
+                $base64_digits =
+                    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+                $bcrypt64_digits =
+                    './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+
+                $base64_string = base64_encode($salt);
+                $salt = strtr(rtrim($base64_string, '='), $base64_digits, $bcrypt64_digits);
+            }
+            $salt = PasswordCompat\binary\_substr($salt, 0, $required_salt_len);
+
+            $hash = $hash_format . $salt;
+
+            $ret = crypt($password, $hash);
+
+            if (!is_string($ret) || PasswordCompat\binary\_strlen($ret) != $resultLength) {
+                return false;
+            }
+
+            return $ret;
+        }
+
+        /**
+         * Get information about the password hash. Returns an array of the information
+         * that was used to generate the password hash.
+         *
+         * array(
+         *    'algo' => 1,
+         *    'algoName' => 'bcrypt',
+         *    'options' => array(
+         *        'cost' => PASSWORD_BCRYPT_DEFAULT_COST,
+         *    ),
+         * )
+         *
+         * @param string $hash The password hash to extract info from
+         *
+         * @return array The array of information about the hash.
+         */
+        function password_get_info($hash) {
+            $return = array(
+                'algo' => 0,
+                'algoName' => 'unknown',
+                'options' => array(),
+            );
+            if (PasswordCompat\binary\_substr($hash, 0, 4) == '$2y$' && PasswordCompat\binary\_strlen($hash) == 60) {
+                $return['algo'] = PASSWORD_BCRYPT;
+                $return['algoName'] = 'bcrypt';
+                list($cost) = sscanf($hash, "$2y$%d$");
+                $return['options']['cost'] = $cost;
+            }
+            return $return;
+        }
+
+        /**
+         * Determine if the password hash needs to be rehashed according to the options provided
+         *
+         * If the answer is true, after validating the password using password_verify, rehash it.
+         *
+         * @param string $hash    The hash to test
+         * @param int    $algo    The algorithm used for new password hashes
+         * @param array  $options The options array passed to password_hash
+         *
+         * @return boolean True if the password needs to be rehashed.
+         */
+        function password_needs_rehash($hash, $algo, array $options = array()) {
+            $info = password_get_info($hash);
+            if ($info['algo'] != $algo) {
+                return true;
+            }
+            switch ($algo) {
+                case PASSWORD_BCRYPT:
+                    $cost = isset($options['cost']) ? $options['cost'] : PASSWORD_BCRYPT_DEFAULT_COST;
+                    if ($cost != $info['options']['cost']) {
+                        return true;
+                    }
+                    break;
+            }
+            return false;
+        }
+
+        /**
+         * Verify a password against a hash using a timing attack resistant approach
+         *
+         * @param string $password The password to verify
+         * @param string $hash     The hash to verify against
+         *
+         * @return boolean If the password matches the hash
+         */
+        function password_verify($password, $hash) {
+            if (!function_exists('crypt')) {
+                trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING);
+                return false;
+            }
+            $ret = crypt($password, $hash);
+            if (!is_string($ret) || PasswordCompat\binary\_strlen($ret) != PasswordCompat\binary\_strlen($hash) || PasswordCompat\binary\_strlen($ret) <= 13) {
+                return false;
+            }
+
+            $status = 0;
+            for ($i = 0; $i < PasswordCompat\binary\_strlen($ret); $i++) {
+                $status |= (ord($ret[$i]) ^ ord($hash[$i]));
+            }
+
+            return $status === 0;
+        }
+    }
+
+}
+
+namespace PasswordCompat\binary {
+
+    if (!function_exists('PasswordCompat\\binary\\_strlen')) {
+
+        /**
+         * Count the number of bytes in a string
+         *
+         * We cannot simply use strlen() for this, because it might be overwritten by the mbstring extension.
+         * In this case, strlen() will count the number of *characters* based on the internal encoding. A
+         * sequence of bytes might be regarded as a single multibyte character.
+         *
+         * @param string $binary_string The input string
+         *
+         * @internal
+         * @return int The number of bytes
+         */
+        function _strlen($binary_string) {
+            if (function_exists('mb_strlen')) {
+                return mb_strlen($binary_string, '8bit');
+            }
+            return strlen($binary_string);
+        }
+
+        /**
+         * Get a substring based on byte limits
+         *
+         * @see _strlen()
+         *
+         * @param string $binary_string The input string
+         * @param int    $start
+         * @param int    $length
+         *
+         * @internal
+         * @return string The substring
+         */
+        function _substr($binary_string, $start, $length) {
+            if (function_exists('mb_substr')) {
+                return mb_substr($binary_string, $start, $length, '8bit');
+            }
+            return substr($binary_string, $start, $length);
+        }
+
+        /**
+         * Check if current PHP version is compatible with the library
+         *
+         * @return boolean the check result
+         */
+        function check() {
+            static $pass = NULL;
+
+            if (is_null($pass)) {
+                if (function_exists('crypt')) {
+                    $hash = '$2y$04$usesomesillystringfore7hnbRJHxXVLeakoG8K30oukPsA.ztMG';
+                    $test = crypt("password", $hash);
+                    $pass = $test == $hash;
+                } else {
+                    $pass = false;
+                }
+            }
+            return $pass;
+        }
+
+    }
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/ircmaxell/password-compat/version-test.php
@@ -0,0 +1,6 @@
+<?php
+
+require "lib/password.php";
+
+echo "Test for functionality of compat library: " . (PasswordCompat\binary\check() ? "Pass" : "Fail");
+echo "\n";
\ No newline at end of file
--- a/vendor/lusitanian/oauth/composer.json
+++ b/vendor/lusitanian/oauth/composer.json
@@ -11,6 +11,10 @@
         {
             "name": "Pieter Hordijk",
             "email": "info@pieterhordijk.com"
+        },
+        {
+            "name": "Elliot Chance",
+            "email": "elliotchance@gmail.com"
         }
     ],
     "require": {
@@ -19,11 +23,13 @@
     "require-dev": {
         "symfony/http-foundation": "~2.1",
         "predis/predis": "0.8.*@dev",
-        "phpunit/phpunit": "3.7.*"
+        "phpunit/phpunit": "3.7.*",
+        "squizlabs/php_codesniffer": "2.*"
     },
     "suggest": {
         "symfony/http-foundation": "Allows using the Symfony Session storage backend.",
-        "predis/predis": "Allows using the Redis storage backend."
+        "predis/predis": "Allows using the Redis storage backend.",
+        "ext-openssl": "Allows for usage of secure connections with the stream-based HTTP client."
     },
     "autoload": {
         "psr-0": {
--- /dev/null
+++ b/vendor/lusitanian/oauth/composer.lock
@@ -0,0 +1,610 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "hash": "734ee27aca2b4b8a33857520f518ef0c",
+    "packages": [],
+    "packages-dev": [
+        {
+            "name": "phpunit/php-code-coverage",
+            "version": "1.2.18",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+                "reference": "fe2466802556d3fe4e4d1d58ffd3ccfd0a19be0b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/fe2466802556d3fe4e4d1d58ffd3ccfd0a19be0b",
+                "reference": "fe2466802556d3fe4e4d1d58ffd3ccfd0a19be0b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "phpunit/php-file-iterator": ">=1.3.0@stable",
+                "phpunit/php-text-template": ">=1.2.0@stable",
+                "phpunit/php-token-stream": ">=1.1.3,<1.3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "3.7.*@dev"
+            },
+            "suggest": {
+                "ext-dom": "*",
+                "ext-xdebug": ">=2.0.5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "PHP/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+            "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+            "keywords": [
+                "coverage",
+                "testing",
+                "xunit"
+            ],
+            "time": "2014-09-02 10:13:14"
+        },
+        {
+            "name": "phpunit/php-file-iterator",
+            "version": "1.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+                "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+                "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+            "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+            "keywords": [
+                "filesystem",
+                "iterator"
+            ],
+            "time": "2015-06-21 13:08:43"
+        },
+        {
+            "name": "phpunit/php-text-template",
+            "version": "1.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-text-template.git",
+                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Simple template engine.",
+            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+            "keywords": [
+                "template"
+            ],
+            "time": "2015-06-21 13:50:34"
+        },
+        {
+            "name": "phpunit/php-timer",
+            "version": "1.0.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-timer.git",
+                "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b",
+                "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Utility class for timing",
+            "homepage": "https://github.com/sebastianbergmann/php-timer/",
+            "keywords": [
+                "timer"
+            ],
+            "time": "2015-06-21 08:01:12"
+        },
+        {
+            "name": "phpunit/php-token-stream",
+            "version": "1.2.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+                "reference": "ad4e1e23ae01b483c16f600ff1bebec184588e32"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/ad4e1e23ae01b483c16f600ff1bebec184588e32",
+                "reference": "ad4e1e23ae01b483c16f600ff1bebec184588e32",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "PHP/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Wrapper around PHP's tokenizer extension.",
+            "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+            "keywords": [
+                "tokenizer"
+            ],
+            "time": "2014-03-03 05:10:30"
+        },
+        {
+            "name": "phpunit/phpunit",
+            "version": "3.7.38",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit.git",
+                "reference": "38709dc22d519a3d1be46849868aa2ddf822bcf6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/38709dc22d519a3d1be46849868aa2ddf822bcf6",
+                "reference": "38709dc22d519a3d1be46849868aa2ddf822bcf6",
+                "shasum": ""
+            },
+            "require": {
+                "ext-ctype": "*",
+                "ext-dom": "*",
+                "ext-json": "*",
+                "ext-pcre": "*",
+                "ext-reflection": "*",
+                "ext-spl": "*",
+                "php": ">=5.3.3",
+                "phpunit/php-code-coverage": "~1.2",
+                "phpunit/php-file-iterator": "~1.3",
+                "phpunit/php-text-template": "~1.1",
+                "phpunit/php-timer": "~1.0",
+                "phpunit/phpunit-mock-objects": "~1.2",
+                "symfony/yaml": "~2.0"
+            },
+            "require-dev": {
+                "pear-pear.php.net/pear": "1.9.4"
+            },
+            "suggest": {
+                "phpunit/php-invoker": "~1.1"
+            },
+            "bin": [
+                "composer/bin/phpunit"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.7.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "PHPUnit/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                "",
+                "../../symfony/yaml/"
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "The PHP Unit Testing framework.",
+            "homepage": "http://www.phpunit.de/",
+            "keywords": [
+                "phpunit",
+                "testing",
+                "xunit"
+            ],
+            "time": "2014-10-17 09:04:17"
+        },
+        {
+            "name": "phpunit/phpunit-mock-objects",
+            "version": "1.2.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+                "reference": "5794e3c5c5ba0fb037b11d8151add2a07fa82875"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/5794e3c5c5ba0fb037b11d8151add2a07fa82875",
+                "reference": "5794e3c5c5ba0fb037b11d8151add2a07fa82875",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "phpunit/php-text-template": ">=1.1.1@stable"
+            },
+            "suggest": {
+                "ext-soap": "*"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "PHPUnit/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Mock Object library for PHPUnit",
+            "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+            "keywords": [
+                "mock",
+                "xunit"
+            ],
+            "time": "2013-01-13 10:24:48"
+        },
+        {
+            "name": "predis/predis",
+            "version": "0.8.x-dev",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nrk/predis.git",
+                "reference": "192dfd61e54c3d32c9526bba03365fff818e17e4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nrk/predis/zipball/192dfd61e54c3d32c9526bba03365fff818e17e4",
+                "reference": "192dfd61e54c3d32c9526bba03365fff818e17e4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0"
+            },
+            "suggest": {
+                "ext-curl": "Allows access to Webdis when paired with phpiredis",
+                "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "Predis": "lib/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Daniele Alessandri",
+                    "email": "suppakilla@gmail.com",
+                    "homepage": "http://clorophilla.net"
+                }
+            ],
+            "description": "Flexible and feature-complete PHP client library for Redis",
+            "homepage": "http://github.com/nrk/predis",
+            "keywords": [
+                "nosql",
+                "predis",
+                "redis"
+            ],
+            "time": "2015-07-07 17:11:00"
+        },
+        {
+            "name": "squizlabs/php_codesniffer",
+            "version": "2.3.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
+                "reference": "11a2545c44a5915f883e2e5ec12e14ed345e3ab2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/11a2545c44a5915f883e2e5ec12e14ed345e3ab2",
+                "reference": "11a2545c44a5915f883e2e5ec12e14ed345e3ab2",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "ext-xmlwriter": "*",
+                "php": ">=5.1.2"
+            },
+            "bin": [
+                "scripts/phpcs",
+                "scripts/phpcbf"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "CodeSniffer.php",
+                    "CodeSniffer/CLI.php",
+                    "CodeSniffer/Exception.php",
+                    "CodeSniffer/File.php",
+                    "CodeSniffer/Fixer.php",
+                    "CodeSniffer/Report.php",
+                    "CodeSniffer/Reporting.php",
+                    "CodeSniffer/Sniff.php",
+                    "CodeSniffer/Tokens.php",
+                    "CodeSniffer/Reports/",
+                    "CodeSniffer/Tokenizers/",
+                    "CodeSniffer/DocGenerators/",
+                    "CodeSniffer/Standards/AbstractPatternSniff.php",
+                    "CodeSniffer/Standards/AbstractScopeSniff.php",
+                    "CodeSniffer/Standards/AbstractVariableSniff.php",
+                    "CodeSniffer/Standards/IncorrectPatternException.php",
+                    "CodeSniffer/Standards/Generic/Sniffs/",
+                    "CodeSniffer/Standards/MySource/Sniffs/",
+                    "CodeSniffer/Standards/PEAR/Sniffs/",
+                    "CodeSniffer/Standards/PSR1/Sniffs/",
+                    "CodeSniffer/Standards/PSR2/Sniffs/",
+                    "CodeSniffer/Standards/Squiz/Sniffs/",
+                    "CodeSniffer/Standards/Zend/Sniffs/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Greg Sherwood",
+                    "role": "lead"
+                }
+            ],
+            "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
+            "homepage": "http://www.squizlabs.com/php-codesniffer",
+            "keywords": [
+                "phpcs",
+                "standards"
+            ],
+            "time": "2015-09-09 00:18:50"
+        },
+        {
+            "name": "symfony/http-foundation",
+            "version": "v2.7.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/HttpFoundation.git",
+                "reference": "7253c2041652353e71560bbd300d6256d170ddaf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/7253c2041652353e71560bbd300d6256d170ddaf",
+                "reference": "7253c2041652353e71560bbd300d6256d170ddaf",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "require-dev": {
+                "symfony/expression-language": "~2.4",
+                "symfony/phpunit-bridge": "~2.7"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\HttpFoundation\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony HttpFoundation Component",
+            "homepage": "https://symfony.com",
+            "time": "2015-08-27 06:45:45"
+        },
+        {
+            "name": "symfony/yaml",
+            "version": "v2.7.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Yaml.git",
+                "reference": "2dc7b06c065df96cc686c66da2705e5e18aef661"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Yaml/zipball/2dc7b06c065df96cc686c66da2705e5e18aef661",
+                "reference": "2dc7b06c065df96cc686c66da2705e5e18aef661",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "~2.7"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Yaml\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Yaml Component",
+            "homepage": "https://symfony.com",
+            "time": "2015-08-24 07:13:45"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": {
+        "predis/predis": 20
+    },
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">=5.3.0"
+    },
+    "platform-dev": []
+}
--- a/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/AbstractClient.php
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/AbstractClient.php
@@ -33,7 +33,7 @@ abstract class AbstractClient implements ClientInterface
     }
 
     /**
-     * @param int $maxRedirects Maximum redirects for client
+     * @param int $redirects Maximum redirects for client
      *
      * @return ClientInterface
      */
--- a/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/CurlClient.php
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/CurlClient.php
@@ -76,8 +76,8 @@ class CurlClient extends AbstractClient
             throw new \InvalidArgumentException('No body expected for "GET" request.');
         }
 
-        if (!isset($extraHeaders['Content-type']) && $method === 'POST' && is_array($requestBody)) {
-            $extraHeaders['Content-type'] = 'Content-type: application/x-www-form-urlencoded';
+        if (!isset($extraHeaders['Content-Type']) && $method === 'POST' && is_array($requestBody)) {
+            $extraHeaders['Content-Type'] = 'Content-Type: application/x-www-form-urlencoded';
         }
 
         $extraHeaders['Host']       = 'Host: '.$endpoint->getHost();
--- a/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/StreamClient.php
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Http/Client/StreamClient.php
@@ -39,8 +39,8 @@ class StreamClient extends AbstractClient
             throw new \InvalidArgumentException('No body expected for "GET" request.');
         }
 
-        if (!isset($extraHeaders['Content-type']) && $method === 'POST' && is_array($requestBody)) {
-            $extraHeaders['Content-type'] = 'Content-type: application/x-www-form-urlencoded';
+        if (!isset($extraHeaders['Content-Type']) && $method === 'POST' && is_array($requestBody)) {
+            $extraHeaders['Content-Type'] = 'Content-Type: application/x-www-form-urlencoded';
         }
 
         $host = 'Host: '.$endpoint->getHost();
@@ -65,7 +65,10 @@ class StreamClient extends AbstractClient
         if (false === $response) {
             $lastError = error_get_last();
             if (is_null($lastError)) {
-                throw new TokenResponseException('Failed to request resource.');
+                throw new TokenResponseException(
+                    'Failed to request resource. HTTP Code: ' .
+                    ((isset($http_response_header[0]))?$http_response_header[0]:'No response')
+                );
             }
             throw new TokenResponseException($lastError['message']);
         }
--- a/vendor/lusitanian/oauth/src/OAuth/Common/Service/AbstractService.php
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Service/AbstractService.php
@@ -24,7 +24,7 @@ abstract class AbstractService implements ServiceInterface
     protected $storage;
 
     /**
-     * @param Credentials           $credentials
+     * @param CredentialsInterface  $credentials
      * @param ClientInterface       $httpClient
      * @param TokenStorageInterface $storage
      */
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Exception/AuthorizationStateNotFoundException.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace OAuth\Common\Storage\Exception;
+
+/**
+ * Exception thrown when a state is not found in storage.
+ */
+class AuthorizationStateNotFoundException extends StorageException
+{
+}
--- a/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Memory.php
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Memory.php
@@ -4,6 +4,7 @@ namespace OAuth\Common\Storage;
 
 use OAuth\Common\Token\TokenInterface;
 use OAuth\Common\Storage\Exception\TokenNotFoundException;
+use OAuth\Common\Storage\Exception\AuthorizationStateNotFoundException;
 
 /*
  * Stores a token in-memory only (destroyed at end of script execution).
@@ -15,9 +16,15 @@ class Memory implements TokenStorageInterface
      */
     protected $tokens;
 
+    /**
+     * @var array
+     */
+    protected $states;
+
     public function __construct()
     {
         $this->tokens = array();
+        $this->states = array();
     }
 
     /**
@@ -71,6 +78,61 @@ class Memory implements TokenStorageInterface
     {
         $this->tokens = array();
 
+        // allow chaining
+        return $this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function retrieveAuthorizationState($service)
+    {
+        if ($this->hasAuthorizationState($service)) {
+            return $this->states[$service];
+        }
+
+        throw new AuthorizationStateNotFoundException('State not stored');
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function storeAuthorizationState($service, $state)
+    {
+        $this->states[$service] = $state;
+
+        // allow chaining
+        return $this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function hasAuthorizationState($service)
+    {
+        return isset($this->states[$service]) && null !== $this->states[$service];
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function clearAuthorizationState($service)
+    {
+        if (array_key_exists($service, $this->states)) {
+            unset($this->states[$service]);
+        }
+
+        // allow chaining
+        return $this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function clearAllAuthorizationStates()
+    {
+        $this->states = array();
+
         // allow chaining
         return $this;
     }
--- a/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Redis.php
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Redis.php
@@ -4,6 +4,7 @@ namespace OAuth\Common\Storage;
 
 use OAuth\Common\Token\TokenInterface;
 use OAuth\Common\Storage\Exception\TokenNotFoundException;
+use OAuth\Common\Storage\Exception\AuthorizationStateNotFoundException;
 use Predis\Client as Predis;
 
 /*
@@ -16,6 +17,8 @@ class Redis implements TokenStorageInterface
      */
     protected $key;
 
+    protected $stateKey;
+
     /**
      * @var object|\Redis
      */
@@ -26,15 +29,23 @@ class Redis implements TokenStorageInterface
      */
     protected $cachedTokens;
 
+    /**
+     * @var object
+     */
+    protected $cachedStates;
+
     /**
      * @param Predis $redis An instantiated and connected redis client
-     * @param string $key   The key to store the token under in redis.
+     * @param string $key The key to store the token under in redis
+     * @param string $stateKey The key to store the state under in redis.
      */
-    public function __construct(Predis $redis, $key)
+    public function __construct(Predis $redis, $key, $stateKey)
     {
         $this->redis = $redis;
         $this->key = $key;
+        $this->stateKey = $stateKey;
         $this->cachedTokens = array();
+        $this->cachedStates = array();
     }
 
     /**
@@ -119,6 +130,88 @@ class Redis implements TokenStorageInterface
         return $this;
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    public function retrieveAuthorizationState($service)
+    {
+        if (!$this->hasAuthorizationState($service)) {
+            throw new AuthorizationStateNotFoundException('State not found in redis');
+        }
+
+        if (isset($this->cachedStates[$service])) {
+            return $this->cachedStates[$service];
+        }
+
+        $val = $this->redis->hget($this->stateKey, $service);
+
+        return $this->cachedStates[$service] = $val;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function storeAuthorizationState($service, $state)
+    {
+        // (over)write the token
+        $this->redis->hset($this->stateKey, $service, $state);
+        $this->cachedStates[$service] = $state;
+
+        // allow chaining
+        return $this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function hasAuthorizationState($service)
+    {
+        if (isset($this->cachedStates[$service])
+            && null !== $this->cachedStates[$service]
+        ) {
+            return true;
+        }
+
+        return $this->redis->hexists($this->stateKey, $service);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function clearAuthorizationState($service)
+    {
+        $this->redis->hdel($this->stateKey, $service);
+        unset($this->cachedStates[$service]);
+
+        // allow chaining
+        return $this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function clearAllAuthorizationStates()
+    {
+        // memory
+        $this->cachedStates = array();
+
+        // redis
+        $keys = $this->redis->hkeys($this->stateKey);
+        $me = $this; // 5.3 compat
+
+        // pipeline for performance
+        $this->redis->pipeline(
+            function ($pipe) use ($keys, $me) {
+                foreach ($keys as $k) {
+                    $pipe->hdel($me->getKey(), $k);
+                }
+            }
+        );
+
+        // allow chaining
+        return $this;
+    }
+
     /**
      * @return Predis $redis
      */
--- a/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Session.php
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/Session.php
@@ -4,31 +4,51 @@ namespace OAuth\Common\Storage;
 
 use OAuth\Common\Token\TokenInterface;
 use OAuth\Common\Storage\Exception\TokenNotFoundException;
+use OAuth\Common\Storage\Exception\AuthorizationStateNotFoundException;
 
 /**
  * Stores a token in a PHP session.
  */
 class Session implements TokenStorageInterface
 {
+    /**
+     * @var bool
+     */
+    protected $startSession;
+
     /**
      * @var string
      */
     protected $sessionVariableName;
 
     /**
-     * @param bool   $startSession        Whether or not to start the session upon construction.
+     * @var string
+     */
+    protected $stateVariableName;
+
+    /**
+     * @param bool $startSession Whether or not to start the session upon construction.
      * @param string $sessionVariableName the variable name to use within the _SESSION superglobal
+     * @param string $stateVariableName
      */
-    public function __construct($startSession = true, $sessionVariableName = 'lusitanian_oauth_token')
-    {
-        if ($startSession && !isset($_SESSION)) {
+    public function __construct(
+        $startSession = true,
+        $sessionVariableName = 'lusitanian-oauth-token',
+        $stateVariableName = 'lusitanian-oauth-state'
+    ) {
+        if ($startSession && !$this->sessionHasStarted()) {
             session_start();
         }
 
+        $this->startSession = $startSession;
         $this->sessionVariableName = $sessionVariableName;
+        $this->stateVariableName = $stateVariableName;
         if (!isset($_SESSION[$sessionVariableName])) {
             $_SESSION[$sessionVariableName] = array();
         }
+        if (!isset($_SESSION[$stateVariableName])) {
+            $_SESSION[$stateVariableName] = array();
+        }
     }
 
     /**
@@ -96,8 +116,89 @@ class Session implements TokenStorageInterface
         return $this;
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    public function storeAuthorizationState($service, $state)
+    {
+        if (isset($_SESSION[$this->stateVariableName])
+            && is_array($_SESSION[$this->stateVariableName])
+        ) {
+            $_SESSION[$this->stateVariableName][$service] = $state;
+        } else {
+            $_SESSION[$this->stateVariableName] = array(
+                $service => $state,
+            );
+        }
+
+        // allow chaining
+        return $this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function hasAuthorizationState($service)
+    {
+        return isset($_SESSION[$this->stateVariableName], $_SESSION[$this->stateVariableName][$service]);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function retrieveAuthorizationState($service)
+    {
+        if ($this->hasAuthorizationState($service)) {
+            return $_SESSION[$this->stateVariableName][$service];
+        }
+
+        throw new AuthorizationStateNotFoundException('State not found in session, are you sure you stored it?');
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function clearAuthorizationState($service)
+    {
+        if (array_key_exists($service, $_SESSION[$this->stateVariableName])) {
+            unset($_SESSION[$this->stateVariableName][$service]);
+        }
+
+        // allow chaining
+        return $this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function clearAllAuthorizationStates()
+    {
+        unset($_SESSION[$this->stateVariableName]);
+
+        // allow chaining
+        return $this;
+    }
+
     public function __destruct()
     {
-        session_write_close();
+        if ($this->startSession) {
+            session_write_close();
+        }
+    }
+
+    /**
+     * Determine if the session has started.
+     * @url http://stackoverflow.com/a/18542272/1470961
+     * @return bool
+     */
+    protected function sessionHasStarted()
+    {
+        // For more modern PHP versions we use a more reliable method.
+        if (version_compare(PHP_VERSION, '5.4.0') >= 0) {
+            return session_status() != PHP_SESSION_NONE;
+        }
+
+        // Below PHP 5.4 we should test for the current session ID.
+        return session_id() !== '';
     }
 }
--- a/vendor/lusitanian/oauth/src/OAuth/Common/Storage/SymfonySession.php
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/SymfonySession.php
@@ -4,20 +4,30 @@ namespace OAuth\Common\Storage;
 
 use OAuth\Common\Token\TokenInterface;
 use OAuth\Common\Storage\Exception\TokenNotFoundException;
+use OAuth\Common\Storage\Exception\AuthorizationStateNotFoundException;
 use Symfony\Component\HttpFoundation\Session\SessionInterface;
 
 class SymfonySession implements TokenStorageInterface
 {
     private $session;
     private $sessionVariableName;
+    private $stateVariableName;
 
+    /**
+     * @param SessionInterface $session
+     * @param bool $startSession
+     * @param string $sessionVariableName
+     * @param string $stateVariableName
+     */
     public function __construct(
         SessionInterface $session,
         $startSession = true,
-        $sessionVariableName = 'lusitanian_oauth_token'
+        $sessionVariableName = 'lusitanian_oauth_token',
+        $stateVariableName = 'lusitanian_oauth_state'
     ) {
         $this->session = $session;
         $this->sessionVariableName = $sessionVariableName;
+        $this->stateVariableName = $stateVariableName;
     }
 
     /**
@@ -100,6 +110,86 @@ class SymfonySession implements TokenStorageInterface
         return $this;
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    public function retrieveAuthorizationState($service)
+    {
+        if ($this->hasAuthorizationState($service)) {
+            // get from session
+            $states = $this->session->get($this->stateVariableName);
+
+            // one item
+            return $states[$service];
+        }
+
+        throw new AuthorizationStateNotFoundException('State not found in session, are you sure you stored it?');
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function storeAuthorizationState($service, $state)
+    {
+        // get previously saved tokens
+        $states = $this->session->get($this->stateVariableName);
+
+        if (!is_array($states)) {
+            $states = array();
+        }
+
+        $states[$service] = $state;
+
+        // save
+        $this->session->set($this->stateVariableName, $states);
+
+        // allow chaining
+        return $this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function hasAuthorizationState($service)
+    {
+        // get from session
+        $states = $this->session->get($this->stateVariableName);
+
+        return is_array($states)
+        && isset($states[$service])
+        && null !== $states[$service];
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function clearAuthorizationState($service)
+    {
+        // get previously saved tokens
+        $states = $this->session->get($this->stateVariableName);
+
+        if (is_array($states) && array_key_exists($service, $states)) {
+            unset($states[$service]);
+
+            // Replace the stored tokens array
+            $this->session->set($this->stateVariableName, $states);
+        }
+
+        // allow chaining
+        return $this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function clearAllAuthorizationStates()
+    {
+        $this->session->remove($this->stateVariableName);
+
+        // allow chaining
+        return $this;
+    }
+
     /**
      * @return Session
      */
--- a/vendor/lusitanian/oauth/src/OAuth/Common/Storage/TokenStorageInterface.php
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Storage/TokenStorageInterface.php
@@ -50,4 +50,49 @@ interface TokenStorageInterface
      * @return TokenStorageInterface
      */
     public function clearAllTokens();
+
+    /**
+     * Store the authorization state related to a given service
+     *
+     * @param string $service
+     * @param string $state
+     *
+     * @return TokenStorageInterface
+     */
+    public function storeAuthorizationState($service, $state);
+
+    /**
+     * Check if an authorization state for a given service exists
+     *
+     * @param string $service
+     *
+     * @return bool
+     */
+    public function hasAuthorizationState($service);
+
+    /**
+     * Retrieve the authorization state for a given service
+     *
+     * @param string $service
+     *
+     * @return string
+     */
+    public function retrieveAuthorizationState($service);
+
+    /**
+     * Clear the authorization state of a given service
+     *
+     * @param string $service
+     *
+     * @return TokenStorageInterface
+     */
+    public function clearAuthorizationState($service);
+
+    /**
+     * Delete *ALL* user authorization states. Use with care. Most of the time you will likely
+     * want to use clearAuthorization() instead.
+     *
+     * @return TokenStorageInterface
+     */
+    public function clearAllAuthorizationStates();
 }
--- a/vendor/lusitanian/oauth/src/OAuth/Common/Token/AbstractToken.php
+++ b/vendor/lusitanian/oauth/src/OAuth/Common/Token/AbstractToken.php
@@ -118,4 +118,11 @@ abstract class AbstractToken implements TokenInterface
     {
         $this->refreshToken = $refreshToken;
     }
+
+    public function isExpired()
+    {
+        return ($this->getEndOfLife() !== TokenInterface::EOL_NEVER_EXPIRES
+        && $this->getEndOfLife() !== TokenInterface::EOL_UNKNOWN
+        && time() > $this->getEndOfLife());
+    }
 }
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/AbstractService.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/AbstractService.php
@@ -82,10 +82,6 @@ abstract class AbstractService extends BaseAbstractService implements ServiceInt
         }
         $this->signature->setTokenSecret($tokenSecret);
 
-        $extraAuthenticationHeaders = array(
-            'oauth_token' => $token,
-        );
-
         $bodyParams = array(
             'oauth_verifier' => $verifier,
         );
@@ -109,6 +105,15 @@ abstract class AbstractService extends BaseAbstractService implements ServiceInt
         return $token;
     }
 
+    /**
+     * Refreshes an OAuth1 access token
+     * @param  TokenInterface $token
+     * @return TokenInterface $token
+     */
+    public function refreshAccessToken(TokenInterface $token)
+    {
+    }
+
     /**
      * Sends an authenticated API request to the path provided.
      * If the path provided is not an absolute URI, the base API Uri (must be passed into constructor) will be used.
@@ -201,21 +206,25 @@ abstract class AbstractService extends BaseAbstractService implements ServiceInt
         $bodyParams = null
     ) {
         $this->signature->setTokenSecret($token->getAccessTokenSecret());
-        $parameters = $this->getBasicAuthorizationHeaderInfo();
-        if (isset($parameters['oauth_callback'])) {
-            unset($parameters['oauth_callback']);
+        $authParameters = $this->getBasicAuthorizationHeaderInfo();
+        if (isset($authParameters['oauth_callback'])) {
+            unset($authParameters['oauth_callback']);
         }
 
-        $parameters = array_merge($parameters, array('oauth_token' => $token->getAccessToken()));
+        $authParameters = array_merge($authParameters, array('oauth_token' => $token->getAccessToken()));
 
-        $mergedParams = (is_array($bodyParams)) ? array_merge($parameters, $bodyParams) : $parameters;
+        $signatureParams = (is_array($bodyParams)) ? array_merge($authParameters, $bodyParams) : $authParameters;
+        $authParameters['oauth_signature'] = $this->signature->getSignature($uri, $signatureParams, $method);
 
-        $parameters['oauth_signature'] = $this->signature->getSignature($uri, $mergedParams, $method);
+        if (is_array($bodyParams) && isset($bodyParams['oauth_session_handle'])) {
+            $authParameters['oauth_session_handle'] = $bodyParams['oauth_session_handle'];
+            unset($bodyParams['oauth_session_handle']);
+        }
 
         $authorizationHeader = 'OAuth ';
         $delimiter = '';
 
-        foreach ($parameters as $key => $value) {
+        foreach ($authParameters as $key => $value) {
             $authorizationHeader .= $delimiter . rawurlencode($key) . '="' . rawurlencode($value) . '"';
             $delimiter = ', ';
         }
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Etsy.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Etsy.php
@@ -13,6 +13,9 @@ use OAuth\Common\Http\Client\ClientInterface;
 
 class Etsy extends AbstractService
 {
+
+    protected $scopes = array();
+
     public function __construct(
         CredentialsInterface $credentials,
         ClientInterface $httpClient,
@@ -23,7 +26,7 @@ class Etsy extends AbstractService
         parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
 
         if (null === $baseApiUri) {
-            $this->baseApiUri = new Uri('http://openapi.etsy.com/v2/');
+            $this->baseApiUri = new Uri('https://openapi.etsy.com/v2/');
         }
     }
 
@@ -32,7 +35,14 @@ class Etsy extends AbstractService
      */
     public function getRequestTokenEndpoint()
     {
-        return new Uri($this->baseApiUri . 'oauth/request_token');
+        $uri = new Uri($this->baseApiUri . 'oauth/request_token');
+        $scopes = $this->getScopes();
+
+        if (count($scopes)) {
+            $uri->setQuery('scope=' . implode('%20', $scopes));
+        }
+
+        return $uri;
     }
 
     /**
@@ -93,4 +103,30 @@ class Etsy extends AbstractService
 
         return $token;
     }
+
+    /**
+     * Set the scopes for permissions
+     * @see https://www.etsy.com/developers/documentation/getting_started/oauth#section_permission_scopes
+     * @param array $scopes
+     *
+     * @return $this
+     */
+    public function setScopes(array $scopes)
+    {
+        if (!is_array($scopes)) {
+            $scopes = array();
+        }
+
+        $this->scopes = $scopes;
+        return $this;
+    }
+
+    /**
+     * Return the defined scopes
+     * @return array
+     */
+    public function getScopes()
+    {
+        return $this->scopes;
+    }
 }
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/FiveHundredPx.php
@@ -0,0 +1,120 @@
+<?php
+/**
+ * 500px service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    https://developers.500px.com/
+ */
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\OAuth1\Signature\SignatureInterface;
+use OAuth\OAuth1\Token\StdOAuth1Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+
+/**
+ * 500px service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    https://developers.500px.com/
+ */
+class FiveHundredPx extends AbstractService
+{
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        SignatureInterface $signature,
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct(
+            $credentials,
+            $httpClient,
+            $storage,
+            $signature,
+            $baseApiUri
+        );
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://api.500px.com/v1/');
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRequestTokenEndpoint()
+    {
+        return new Uri('https://api.500px.com/v1/oauth/request_token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://api.500px.com/v1/oauth/authorize');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://api.500px.com/v1/oauth/access_token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseRequestTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (!isset($data['oauth_callback_confirmed'])
+            || $data['oauth_callback_confirmed'] !== 'true'
+        ) {
+            throw new TokenResponseException('Error in retrieving token.');
+        }
+
+        return $this->parseAccessTokenResponse($responseBody);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException(
+                'Error in retrieving token: "' . $data['error'] . '"'
+            );
+        }
+
+        $token = new StdOAuth1Token();
+
+        $token->setRequestToken($data['oauth_token']);
+        $token->setRequestTokenSecret($data['oauth_token_secret']);
+        $token->setAccessToken($data['oauth_token']);
+        $token->setAccessTokenSecret($data['oauth_token_secret']);
+
+        $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
+        unset($data['oauth_token'], $data['oauth_token_secret']);
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+}
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Flickr.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Flickr.php
@@ -13,7 +13,8 @@ use OAuth\Common\Http\Client\ClientInterface;
 
 class Flickr extends AbstractService
 {
-    
+    protected $format;
+
     public function __construct(
         CredentialsInterface $credentials,
         ClientInterface $httpClient,
@@ -26,22 +27,22 @@ class Flickr extends AbstractService
             $this->baseApiUri = new Uri('https://api.flickr.com/services/rest/');
         }
     }
-    
+
     public function getRequestTokenEndpoint()
     {
         return new Uri('https://www.flickr.com/services/oauth/request_token');
     }
-    
+
     public function getAuthorizationEndpoint()
     {
         return new Uri('https://www.flickr.com/services/oauth/authorize');
     }
-    
+
     public function getAccessTokenEndpoint()
     {
         return new Uri('https://www.flickr.com/services/oauth/access_token');
     }
-    
+
     protected function parseRequestTokenResponse($responseBody)
     {
         parse_str($responseBody, $data);
@@ -52,7 +53,7 @@ class Flickr extends AbstractService
         }
         return $this->parseAccessTokenResponse($responseBody);
     }
-    
+
     protected function parseAccessTokenResponse($responseBody)
     {
         parse_str($responseBody, $data);
@@ -61,7 +62,7 @@ class Flickr extends AbstractService
         } elseif (isset($data['error'])) {
             throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
         }
-        
+
         $token = new StdOAuth1Token();
         $token->setRequestToken($data['oauth_token']);
         $token->setRequestTokenSecret($data['oauth_token_secret']);
@@ -70,22 +71,63 @@ class Flickr extends AbstractService
         $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
         unset($data['oauth_token'], $data['oauth_token_secret']);
         $token->setExtraParams($data);
-        
+
         return $token;
     }
-    
+
     public function request($path, $method = 'GET', $body = null, array $extraHeaders = array())
     {
         $uri = $this->determineRequestUriFromPath('/', $this->baseApiUri);
         $uri->addToQuery('method', $path);
-        
+
+        if (!empty($this->format)) {
+            $uri->addToQuery('format', $this->format);
+
+            if ($this->format === 'json') {
+                $uri->addToQuery('nojsoncallback', 1);
+            }
+        }
+
         $token = $this->storage->retrieveAccessToken($this->service());
         $extraHeaders = array_merge($this->getExtraApiHeaders(), $extraHeaders);
         $authorizationHeader = array(
             'Authorization' => $this->buildAuthorizationHeaderForAPIRequest($method, $uri, $token, $body)
         );
         $headers = array_merge($authorizationHeader, $extraHeaders);
-        
+
         return $this->httpClient->retrieveResponse($uri, $body, $headers, $method);
     }
+
+    public function requestRest($path, $method = 'GET', $body = null, array $extraHeaders = array())
+    {
+        return $this->request($path, $method, $body, $extraHeaders);
+    }
+
+    public function requestXmlrpc($path, $method = 'GET', $body = null, array $extraHeaders = array())
+    {
+        $this->format = 'xmlrpc';
+
+        return $this->request($path, $method, $body, $extraHeaders);
+    }
+
+    public function requestSoap($path, $method = 'GET', $body = null, array $extraHeaders = array())
+    {
+        $this->format = 'soap';
+
+        return $this->request($path, $method, $body, $extraHeaders);
+    }
+
+    public function requestJson($path, $method = 'GET', $body = null, array $extraHeaders = array())
+    {
+        $this->format = 'json';
+
+        return $this->request($path, $method, $body, $extraHeaders);
+    }
+
+    public function requestPhp($path, $method = 'GET', $body = null, array $extraHeaders = array())
+    {
+        $this->format = 'php_serial';
+
+        return $this->request($path, $method, $body, $extraHeaders);
+    }
 }
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/QuickBooks.php
@@ -0,0 +1,120 @@
+<?php
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\OAuth1\Token\StdOAuth1Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\OAuth1\Signature\SignatureInterface;
+
+class QuickBooks extends AbstractService
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        SignatureInterface $signature,
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct(
+            $credentials,
+            $httpClient,
+            $storage,
+            $signature,
+            $baseApiUri
+        );
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://quickbooks.api.intuit.com/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getRequestTokenEndpoint()
+    {
+        return new Uri('https://oauth.intuit.com/oauth/v1/get_request_token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://appcenter.intuit.com/Connect/Begin');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://oauth.intuit.com/oauth/v1/get_access_token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseRequestTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (!isset($data['oauth_callback_confirmed'])
+            || $data['oauth_callback_confirmed'] !== 'true') {
+            throw new TokenResponseException('Error in retrieving token.');
+        }
+
+        return $this->parseAccessTokenResponse($responseBody);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            $message = 'Error in retrieving token: "' . $data['error'] . '"';
+            throw new TokenResponseException($message);
+        }
+
+        $token = new StdOAuth1Token();
+
+        $token->setRequestToken($data['oauth_token']);
+        $token->setRequestTokenSecret($data['oauth_token_secret']);
+        $token->setAccessToken($data['oauth_token']);
+        $token->setAccessTokenSecret($data['oauth_token_secret']);
+
+        $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
+        unset($data['oauth_token'], $data['oauth_token_secret']);
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function request(
+        $path,
+        $method = 'GET',
+        $body = null,
+        array $extraHeaders = array()
+    ) {
+        $extraHeaders['Accept'] = 'application/json';
+        return parent::request($path, $method, $body, $extraHeaders);
+    }
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Redmine.php
@@ -0,0 +1,96 @@
+<?php
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\OAuth1\Signature\SignatureInterface;
+use OAuth\OAuth1\Token\StdOAuth1Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+
+class Redmine extends AbstractService
+{
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        SignatureInterface $signature,
+        UriInterface $baseApiUri
+    ) {
+        parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
+
+        if (null === $baseApiUri) {
+            throw new \Exception('baseApiUri is a required argument.');
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRequestTokenEndpoint()
+    {
+        return new Uri($this->baseApiUri->getAbsoluteUri() . '/request_token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri($this->baseApiUri->getAbsoluteUri() . '/authorize');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri($this->baseApiUri->getAbsoluteUri() . '/access_token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseRequestTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
+            throw new TokenResponseException('Error in retrieving token.');
+        }
+
+        return $this->parseAccessTokenResponse($responseBody);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+        }
+
+        $token = new StdOAuth1Token();
+
+        $token->setRequestToken($data['oauth_token']);
+        $token->setRequestTokenSecret($data['oauth_token_secret']);
+        $token->setAccessToken($data['oauth_token']);
+        $token->setAccessTokenSecret($data['oauth_token_secret']);
+
+        $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
+        unset($data['oauth_token'], $data['oauth_token_secret']);
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/ScoopIt.php
@@ -0,0 +1,96 @@
+<?php
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\OAuth1\Signature\SignatureInterface;
+use OAuth\OAuth1\Token\StdOAuth1Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+
+class ScoopIt extends AbstractService
+{
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        SignatureInterface $signature,
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://www.scoop.it/api/1/');
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRequestTokenEndpoint()
+    {
+        return new Uri('https://www.scoop.it/oauth/request');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://www.scoop.it/oauth/authorize');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://www.scoop.it/oauth/access');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseRequestTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
+            throw new TokenResponseException('Error in retrieving token.');
+        }
+
+        return $this->parseAccessTokenResponse($responseBody);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+        }
+
+        $token = new StdOAuth1Token();
+
+        $token->setRequestToken($data['oauth_token']);
+        $token->setRequestTokenSecret($data['oauth_token_secret']);
+        $token->setAccessToken($data['oauth_token']);
+        $token->setAccessTokenSecret($data['oauth_token_secret']);
+
+        $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
+        unset($data['oauth_token'], $data['oauth_token_secret']);
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+}
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Twitter.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Twitter.php
@@ -100,9 +100,11 @@ class Twitter extends AbstractService
         parse_str($responseBody, $data);
 
         if (null === $data || !is_array($data)) {
-            throw new TokenResponseException('Unable to parse response.');
+            throw new TokenResponseException('Unable to parse response: ' . $responseBody);
         } elseif (isset($data['error'])) {
             throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+        } elseif (!isset($data["oauth_token"]) || !isset($data["oauth_token_secret"])) {
+            throw new TokenResponseException('Invalid response. OAuth Token data not set: ' . $responseBody);
         }
 
         $token = new StdOAuth1Token();
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Xing.php
@@ -0,0 +1,97 @@
+<?php
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\OAuth1\Signature\SignatureInterface;
+use OAuth\OAuth1\Token\StdOAuth1Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+
+class Xing extends AbstractService
+{
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        SignatureInterface $signature,
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://api.xing.com/v1/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://api.xing.com/v1/authorize');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://api.xing.com/v1/access_token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getRequestTokenEndpoint()
+    {
+        return new Uri('https://api.xing.com/v1/request_token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseRequestTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
+            throw new TokenResponseException('Error in retrieving token.');
+        }
+
+        return $this->parseAccessTokenResponse($responseBody);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+        $errors = json_decode($responseBody);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif ($errors) {
+            throw new TokenResponseException('Error in retrieving token: "' . $errors->error_name . '"');
+        }
+
+        $token = new StdOAuth1Token();
+
+        $token->setRequestToken($data['oauth_token']);
+        $token->setRequestTokenSecret($data['oauth_token_secret']);
+        $token->setAccessToken($data['oauth_token']);
+        $token->setAccessTokenSecret($data['oauth_token_secret']);
+
+        $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
+        unset($data['oauth_token'], $data['oauth_token_secret']);
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth1/Service/Yahoo.php
@@ -0,0 +1,131 @@
+<?php
+
+namespace OAuth\OAuth1\Service;
+
+use OAuth\OAuth1\Signature\SignatureInterface;
+use OAuth\OAuth1\Token\StdOAuth1Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\OAuth1\Token\TokenInterface;
+
+class Yahoo extends AbstractService
+{
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        SignatureInterface $signature,
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://social.yahooapis.com/v1/');
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRequestTokenEndpoint()
+    {
+        return new Uri('https://api.login.yahoo.com/oauth/v2/get_request_token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://api.login.yahoo.com/oauth/v2/request_auth');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://api.login.yahoo.com/oauth/v2/get_token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function refreshAccessToken(TokenInterface $token)
+    {
+        $extraParams = $token->getExtraParams();
+        $bodyParams = array('oauth_session_handle' => $extraParams['oauth_session_handle']);
+
+        $authorizationHeader = array(
+            'Authorization' => $this->buildAuthorizationHeaderForAPIRequest(
+                'POST',
+                $this->getAccessTokenEndpoint(),
+                $this->storage->retrieveAccessToken($this->service()),
+                $bodyParams
+            )
+        );
+
+
+        
+        $headers = array_merge($authorizationHeader, $this->getExtraOAuthHeaders(), array());
+
+        $responseBody = $this->httpClient->retrieveResponse($this->getAccessTokenEndpoint(), $bodyParams, $headers);
+
+        $token = $this->parseAccessTokenResponse($responseBody);
+        $this->storage->storeAccessToken($this->service(), $token);
+
+        return $token;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseRequestTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
+            throw new TokenResponseException('Error in retrieving token.');
+        }
+
+        return $this->parseAccessTokenResponse($responseBody);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+        }
+
+        $token = new StdOAuth1Token();
+
+        $token->setRequestToken($data['oauth_token']);
+        $token->setRequestTokenSecret($data['oauth_token_secret']);
+        $token->setAccessToken($data['oauth_token']);
+        $token->setAccessTokenSecret($data['oauth_token_secret']);
+
+        if (isset($data['oauth_expires_in'])) {
+            $token->setLifetime($data['oauth_expires_in']);
+        } else {
+            $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
+        }
+
+        unset($data['oauth_token'], $data['oauth_token_secret']);
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+}
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/AbstractService.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/AbstractService.php
@@ -9,6 +9,7 @@ use OAuth\Common\Storage\TokenStorageInterface;
 use OAuth\Common\Http\Exception\TokenResponseException;
 use OAuth\Common\Http\Client\ClientInterface;
 use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\OAuth2\Service\Exception\InvalidAuthorizationStateException;
 use OAuth\OAuth2\Service\Exception\InvalidScopeException;
 use OAuth\OAuth2\Service\Exception\MissingRefreshTokenException;
 use OAuth\Common\Token\TokenInterface;
@@ -25,12 +26,20 @@ abstract class AbstractService extends BaseAbstractService implements ServiceInt
     /** @var UriInterface|null */
     protected $baseApiUri;
 
+    /** @var bool */
+    protected $stateParameterInAuthUrl;
+
+    /** @var string */
+    protected $apiVersion;
+
     /**
-     * @param Credentials           $credentials
+     * @param CredentialsInterface  $credentials
      * @param ClientInterface       $httpClient
      * @param TokenStorageInterface $storage
      * @param array                 $scopes
      * @param UriInterface|null     $baseApiUri
+     * @param bool $stateParameterInAutUrl
+     * @param string                $apiVersion
      *
      * @throws InvalidScopeException
      */
@@ -39,9 +48,12 @@ abstract class AbstractService extends BaseAbstractService implements ServiceInt
         ClientInterface $httpClient,
         TokenStorageInterface $storage,
         $scopes = array(),
-        UriInterface $baseApiUri = null
+        UriInterface $baseApiUri = null,
+        $stateParameterInAutUrl = false,
+        $apiVersion = ""
     ) {
         parent::__construct($credentials, $httpClient, $storage);
+        $this->stateParameterInAuthUrl = $stateParameterInAutUrl;
 
         foreach ($scopes as $scope) {
             if (!$this->isValidScope($scope)) {
@@ -52,6 +64,8 @@ abstract class AbstractService extends BaseAbstractService implements ServiceInt
         $this->scopes = $scopes;
 
         $this->baseApiUri = $baseApiUri;
+
+        $this->apiVersion = $apiVersion;
     }
 
     /**
@@ -69,7 +83,14 @@ abstract class AbstractService extends BaseAbstractService implements ServiceInt
             )
         );
 
-        $parameters['scope'] = implode(' ', $this->scopes);
+        $parameters['scope'] = implode($this->getScopesDelimiter(), $this->scopes);
+
+        if ($this->needsStateParameterInAuthUrl()) {
+            if (!isset($parameters['state'])) {
+                $parameters['state'] = $this->generateAuthorizationState();
+            }
+            $this->storeAuthorizationState($parameters['state']);
+        }
 
         // Build the url
         $url = clone $this->getAuthorizationEndpoint();
@@ -83,8 +104,12 @@ abstract class AbstractService extends BaseAbstractService implements ServiceInt
     /**
      * {@inheritdoc}
      */
-    public function requestAccessToken($code)
+    public function requestAccessToken($code, $state = null)
     {
+        if (null !== $state) {
+            $this->validateAuthorizationState($state);
+        }
+
         $bodyParams = array(
             'code'          => $code,
             'client_id'     => $this->credentials->getConsumerId(),
@@ -98,6 +123,7 @@ abstract class AbstractService extends BaseAbstractService implements ServiceInt
             $bodyParams,
             $this->getExtraOAuthHeaders()
         );
+
         $token = $this->parseAccessTokenResponse($responseBody);
         $this->storage->storeAccessToken($this->service(), $token);
 
@@ -144,6 +170,10 @@ abstract class AbstractService extends BaseAbstractService implements ServiceInt
             $uri->addToQuery('access_token', $token->getAccessToken());
         } elseif (static::AUTHORIZATION_METHOD_QUERY_STRING_V2 === $this->getAuthorizationMethod()) {
             $uri->addToQuery('oauth2_access_token', $token->getAccessToken());
+        } elseif (static::AUTHORIZATION_METHOD_QUERY_STRING_V3 === $this->getAuthorizationMethod()) {
+            $uri->addToQuery('apikey', $token->getAccessToken());
+        } elseif (static::AUTHORIZATION_METHOD_QUERY_STRING_V4 === $this->getAuthorizationMethod()) {
+            $uri->addToQuery('auth', $token->getAccessToken());
         } elseif (static::AUTHORIZATION_METHOD_HEADER_BEARER === $this->getAuthorizationMethod()) {
             $extraHeaders = array_merge(array('Authorization' => 'Bearer ' . $token->getAccessToken()), $extraHeaders);
         }
@@ -213,6 +243,59 @@ abstract class AbstractService extends BaseAbstractService implements ServiceInt
         return in_array($scope, $reflectionClass->getConstants(), true);
     }
 
+    /**
+     * Check if the given service need to generate a unique state token to build the authorization url
+     *
+     * @return bool
+     */
+    public function needsStateParameterInAuthUrl()
+    {
+        return $this->stateParameterInAuthUrl;
+    }
+
+    /**
+     * Validates the authorization state against a given one
+     *
+     * @param string $state
+     * @throws InvalidAuthorizationStateException
+     */
+    protected function validateAuthorizationState($state)
+    {
+        if ($this->retrieveAuthorizationState() !== $state) {
+            throw new InvalidAuthorizationStateException();
+        }
+    }
+
+    /**
+     * Generates a random string to be used as state
+     *
+     * @return string
+     */
+    protected function generateAuthorizationState()
+    {
+        return md5(rand());
+    }
+
+    /**
+     * Retrieves the authorization state for the current service
+     *
+     * @return string
+     */
+    protected function retrieveAuthorizationState()
+    {
+        return $this->storage->retrieveAuthorizationState($this->service());
+    }
+
+    /**
+     * Stores a given authorization state into the storage
+     *
+     * @param string $state
+     */
+    protected function storeAuthorizationState($state)
+    {
+        $this->storage->storeAuthorizationState($this->service(), $state);
+    }
+
     /**
      * Return any additional headers always needed for this service implementation's OAuth calls.
      *
@@ -256,4 +339,26 @@ abstract class AbstractService extends BaseAbstractService implements ServiceInt
     {
         return static::AUTHORIZATION_METHOD_HEADER_OAUTH;
     }
+
+    /**
+     * Returns api version string if is set else retrun empty string
+     *
+     * @return string
+     */
+    protected function getApiVersionString()
+    {
+        return !(empty($this->apiVersion)) ? "/".$this->apiVersion : "" ;
+    }
+
+    /**
+     * Returns delimiter to scopes in getAuthorizationUri
+     * For services that do not fully respect the Oauth's RFC,
+     * and use scopes with commas as delimiter
+     *
+     * @return string
+     */
+    protected function getScopesDelimiter()
+    {
+        return ' ';
+    }
 }
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Bitly.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Bitly.php
@@ -77,8 +77,12 @@ class Bitly extends AbstractService
     /**
      * {@inheritdoc}
      */
-    public function requestAccessToken($code)
+    public function requestAccessToken($code, $state = null)
     {
+        if (null !== $state) {
+            $this->validateAuthorizationState($state);
+        }
+
         $bodyParams = array(
             'code'          => $code,
             'client_id'     => $this->credentials->getConsumerId(),
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Bitrix24.php
@@ -0,0 +1,118 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Bitrix24 extends AbstractService
+{
+    const SCOPE_DEPARTMENT = 'department';
+    const SCOPE_CRM = 'crm';
+    const SCOPE_CALENDAR = 'calendar';
+    const SCOPE_USER = 'user';
+    const SCOPE_ENTITY = 'entity';
+    const SCOPE_TASK = 'task';
+    const SCOPE_TASKS_EXTENDED = 'tasks_extended';
+    const SCOPE_IM = 'im';
+    const SCOPE_LOG = 'log';
+    const SCOPE_SONET_GROUP = 'sonet_group';
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri(sprintf('%s/oauth/authorize/', $this->baseApiUri));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri(sprintf('%s/oauth/token/', $this->baseApiUri));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function requestAccessToken($code, $state = null)
+    {
+        if (null !== $state) {
+            $this->validateAuthorizationState($state);
+        }
+
+        $responseBody = $this->httpClient->retrieveResponse(
+            $this->getAccessTokenUri($code),
+            array(),
+            $this->getExtraOAuthHeaders(),
+            'GET'
+        );
+
+        $token = $this->parseAccessTokenResponse($responseBody);
+        $this->storage->storeAccessToken($this->service(), $token);
+
+        return $token;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenUri($code)
+    {
+        $parameters = array(
+            'code'          => $code,
+            'client_id'     => $this->credentials->getConsumerId(),
+            'client_secret' => $this->credentials->getConsumerSecret(),
+            'redirect_uri'  => $this->credentials->getCallbackUrl(),
+            'grant_type'    => 'authorization_code',
+            'scope'         => $this->scopes
+        );
+
+        $parameters['scope'] = implode(' ', $this->scopes);
+
+        // Build the url
+        $url = $this->getAccessTokenEndpoint();
+        foreach ($parameters as $key => $val) {
+            $url->addToQuery($key, $val);
+        }
+
+        return $url;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+        $token->setLifetime($data['expires_in']);
+
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        unset($data['access_token']);
+        unset($data['expires_in']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+}
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Box.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Box.php
@@ -25,7 +25,7 @@ class Box extends AbstractService
         $scopes = array(),
         UriInterface $baseApiUri = null
     ) {
-        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri, true);
 
         if (null === $baseApiUri) {
             $this->baseApiUri = new Uri('https://api.box.com/2.0/');
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Buffer.php
@@ -0,0 +1,151 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+
+/**
+ * Buffer API.
+ * @author  Sumukh Sridhara <@sumukhsridhara>
+ * @link https://bufferapp.com/developers/api
+ */
+class Buffer extends AbstractService
+{
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+        if ($baseApiUri === null) {
+            $this->baseApiUri = new Uri('https://api.bufferapp.com/1/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://bufferapp.com/oauth2/authorize');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://api.bufferapp.com/1/oauth2/token.json');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_QUERY_STRING;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationUri(array $additionalParameters = array())
+    {
+        $parameters = array_merge(
+            $additionalParameters,
+            array(
+                'client_id'     => $this->credentials->getConsumerId(),
+                'redirect_uri'  => $this->credentials->getCallbackUrl(),
+                'response_type' => 'code',
+            )
+        );
+
+        // Build the url
+        $url = clone $this->getAuthorizationEndpoint();
+        foreach ($parameters as $key => $val) {
+            $url->addToQuery($key, $val);
+        }
+
+        return $url;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function requestRequestToken()
+    {
+        $responseBody = $this->httpClient->retrieveResponse(
+            $this->getRequestTokenEndpoint(),
+            array(
+                'client_key' => $this->credentials->getConsumerId(),
+                'redirect_uri' => $this->credentials->getCallbackUrl(),
+                'response_type' => 'code',
+            )
+        );
+
+        $code = $this->parseRequestTokenResponse($responseBody);
+
+        return $code;
+    }
+
+    protected function parseRequestTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (!isset($data['code'])) {
+            throw new TokenResponseException('Error in retrieving code.');
+        }
+        return $data['code'];
+    }
+
+    public function requestAccessToken($code)
+    {
+        $bodyParams = array(
+            'client_id'     => $this->credentials->getConsumerId(),
+            'client_secret' => $this->credentials->getConsumerSecret(),
+            'redirect_uri' => $this->credentials->getCallbackUrl(),
+            'code'          => $code,
+            'grant_type'    => 'authorization_code',
+        );
+
+        $responseBody = $this->httpClient->retrieveResponse(
+            $this->getAccessTokenEndpoint(),
+            $bodyParams,
+            $this->getExtraOAuthHeaders()
+        );
+        $token = $this->parseAccessTokenResponse($responseBody);
+        $this->storage->storeAccessToken($this->service(), $token);
+
+        return $token;
+    }
+
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if ($data === null || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+
+        $token->setEndOfLife(StdOAuth2Token::EOL_NEVER_EXPIRES);
+        unset($data['access_token']);
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Deezer.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ * Deezer service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    http://developers.deezer.com/api/
+ */
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Deezer service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    http://developers.deezer.com/api/
+ */
+class Deezer extends AbstractService
+{
+    /**
+     * Defined scopes
+     * http://developers.deezer.com/api/permissions
+     */
+    const SCOPE_BASIC_ACCESS      = 'basic_access';       // Access users basic information
+    const SCOPE_EMAIL             = 'email';              // Get the user's email
+    const SCOPE_OFFLINE_ACCESS    = 'offline_access';     // Access user data any time
+    const SCOPE_MANAGE_LIBRARY    = 'manage_library';     // Manage users' library
+    const SCOPE_MANAGE_COMMUNITY  = 'manage_community';   // Manage users' friends
+    const SCOPE_DELETE_LIBRARY    = 'delete_library';     // Delete library items
+    const SCOPE_LISTENING_HISTORY = 'listening_history';  // Access the user's listening history
+
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct(
+            $credentials,
+            $httpClient,
+            $storage,
+            $scopes,
+            $baseApiUri,
+            true
+        );
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://api.deezer.com/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://connect.deezer.com/oauth/auth.php');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://connect.deezer.com/oauth/access_token.php');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_QUERY_STRING;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+        if (null === $data || !is_array($data) || empty($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException(
+                'Error in retrieving token: "' . $data['error'] . '"'
+            );
+        } elseif (isset($data['error_reason'])) {
+            throw new TokenResponseException(
+                'Error in retrieving token: "' . $data['error_reason'] . '"'
+            );
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+        $token->setLifeTime($data['expires']);
+
+        // I hope one day Deezer add a refresh token :)
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        unset($data['access_token']);
+        unset($data['expires']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Delicious.php
@@ -0,0 +1,139 @@
+<?php
+/**
+ * Delicious service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html  MIT License
+ * @link    https://github.com/SciDevs/delicious-api/blob/master/api/oauth.md
+ */
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Delicious service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html  MIT License
+ * @link    https://github.com/SciDevs/delicious-api/blob/master/api/oauth.md
+ */
+class Delicious extends AbstractService
+{
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct(
+            $credentials,
+            $httpClient,
+            $storage,
+            $scopes,
+            $baseApiUri,
+            true
+        );
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://api.del.icio.us/v1/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://delicious.com/auth/authorize');
+
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://avosapi.delicious.com/api/v1/oauth/token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException(
+                'Error in retrieving token: "' . $data['error'] . '"'
+            );
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+
+        if (isset($data['expires_in'])) {
+            $token->setLifetime($data['expires_in']);
+            unset($data['expires_in']);
+        }
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        unset($data['access_token']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+
+
+    // Special, delicious didn't respect the oauth2 RFC and need a grant_type='code'
+    /**
+     * {@inheritdoc}
+     */
+    public function requestAccessToken($code, $state = null)
+    {
+        if (null !== $state) {
+            $this->validateAuthorizationState($state);
+        }
+
+        $bodyParams = array(
+            'code'          => $code,
+            'client_id'     => $this->credentials->getConsumerId(),
+            'client_secret' => $this->credentials->getConsumerSecret(),
+            'redirect_uri'  => $this->credentials->getCallbackUrl(),
+            'grant_type'    => 'code',
+        );
+
+        $responseBody = $this->httpClient->retrieveResponse(
+            $this->getAccessTokenEndpoint(),
+            $bodyParams,
+            $this->getExtraOAuthHeaders()
+        );
+
+        $token = $this->parseAccessTokenResponse($responseBody);
+        $this->storage->storeAccessToken($this->service(), $token);
+
+        return $token;
+    }
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/DeviantArt.php
@@ -0,0 +1,99 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\Common\Exception\Exception;
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class DeviantArt extends AbstractService
+{
+    /**
+     * DeviantArt www url - used to build dialog urls
+     */
+    const WWW_URL = 'https://www.deviantart.com/';
+
+    /**
+     * Defined scopes
+     *
+     * If you don't think this is scary you should not be allowed on the web at all
+     *
+     * @link https://www.deviantart.com/developers/authentication
+     * @link https://www.deviantart.com/developers/http/v1/20150217
+     */
+    const SCOPE_FEED                       = 'feed';
+    const SCOPE_BROWSE                     = 'browse';
+    const SCOPE_COMMENT                    = 'comment.post';
+    const SCOPE_STASH                      = 'stash';
+    const SCOPE_USER                       = 'user';
+    const SCOPE_USERMANAGE                 = 'user.manage';
+
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://www.deviantart.com/api/v1/oauth2/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://www.deviantart.com/oauth2/authorize');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://www.deviantart.com/oauth2/token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+
+        if (isset($data['expires_in'])) {
+            $token->setLifeTime($data['expires_in']);
+        }
+
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        unset($data['access_token']);
+        unset($data['expires_in']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/EveOnline.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Contains EveOnline class.
+ * PHP version 5.4
+ * @copyright 2014 Michael Cummings
+ * @author    Michael Cummings <mgcummings@yahoo.com>
+ */
+namespace OAuth\OAuth2\Service;
+
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Token\TokenInterface;
+use OAuth\OAuth2\Token\StdOAuth2Token;
+
+/**
+ * Class EveOnline
+ */
+class EveOnline extends AbstractService
+{
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://login.eveonline.com');
+        }
+    }
+
+    /**
+     * Returns the authorization API endpoint.
+     * @return UriInterface
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri($this->baseApiUri . '/oauth/authorize');
+    }
+
+    /**
+     * Returns the access token API endpoint.
+     * @return UriInterface
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri($this->baseApiUri . '/oauth/token');
+    }
+
+    /**
+     * Parses the access token response and returns a TokenInterface.
+     *
+     * @param string $responseBody
+     *
+     * @return TokenInterface
+     * @throws TokenResponseException
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error_description'])) {
+            throw new TokenResponseException('Error in retrieving token: "' . $data['error_description'] . '"');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+        $token->setLifeTime($data['expires_in']);
+
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        unset($data['access_token']);
+        unset($data['expires_in']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+    }
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidAccessTypeException.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace OAuth\OAuth2\Service\Exception;
+
+use OAuth\Common\Exception\Exception;
+
+/**
+ * Exception thrown when an invalid accessType for the Google Service is specified
+ */
+class InvalidAccessTypeException extends Exception
+{
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Exception/InvalidAuthorizationStateException.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace OAuth\OAuth2\Service\Exception;
+
+/**
+ * Exception thrown when the state parameter received during the authorization process is invalid.
+ */
+class InvalidAuthorizationStateException extends \Exception
+{
+}
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Facebook.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Facebook.php
@@ -2,6 +2,7 @@
 
 namespace OAuth\OAuth2\Service;
 
+use OAuth\Common\Exception\Exception;
 use OAuth\OAuth2\Token\StdOAuth2Token;
 use OAuth\Common\Http\Exception\TokenResponseException;
 use OAuth\Common\Http\Uri\Uri;
@@ -12,33 +13,54 @@ use OAuth\Common\Http\Uri\UriInterface;
 
 class Facebook extends AbstractService
 {
+    /**
+     * Facebook www url - used to build dialog urls
+     */
+    const WWW_URL = 'https://www.facebook.com/';
+
     /**
      * Defined scopes
      *
      * If you don't think this is scary you should not be allowed on the web at all
      *
      * @link https://developers.facebook.com/docs/reference/login/
+     * @link https://developers.facebook.com/tools/explorer For a list of permissions use 'Get Access Token'
      */
-    // email scopes
+    // Default scope
+    const SCOPE_PUBLIC_PROFILE                = 'public_profile';
+    // Email scopes
     const SCOPE_EMAIL                         = 'email';
-    // extended permissions
+    // Extended permissions
     const SCOPE_READ_FRIENDLIST               = 'read_friendlists';
     const SCOPE_READ_INSIGHTS                 = 'read_insights';
     const SCOPE_READ_MAILBOX                  = 'read_mailbox';
+    const SCOPE_READ_PAGE_MAILBOXES           = 'read_page_mailboxes';
     const SCOPE_READ_REQUESTS                 = 'read_requests';
     const SCOPE_READ_STREAM                   = 'read_stream';
+    const SCOPE_VIDEO_UPLOAD                  = 'video_upload';
     const SCOPE_XMPP_LOGIN                    = 'xmpp_login';
     const SCOPE_USER_ONLINE_PRESENCE          = 'user_online_presence';
     const SCOPE_FRIENDS_ONLINE_PRESENCE       = 'friends_online_presence';
     const SCOPE_ADS_MANAGEMENT                = 'ads_management';
+    const SCOPE_ADS_READ                      = 'ads_read';
     const SCOPE_CREATE_EVENT                  = 'create_event';
+    const SCOPE_CREATE_NOTE                   = 'create_note';
+    const SCOPE_EXPORT_STREAM                 = 'export_stream';
     const SCOPE_MANAGE_FRIENDLIST             = 'manage_friendlists';
     const SCOPE_MANAGE_NOTIFICATIONS          = 'manage_notifications';
+    const SCOPE_PHOTO_UPLOAD                  = 'photo_upload';
     const SCOPE_PUBLISH_ACTIONS               = 'publish_actions';
+    const SCOPE_PUBLISH_CHECKINS              = 'publish_checkins';
     const SCOPE_PUBLISH_STREAM                = 'publish_stream';
     const SCOPE_RSVP_EVENT                    = 'rsvp_event';
+    const SCOPE_SHARE_ITEM                    = 'share_item';
+    const SCOPE_SMS                           = 'sms';
+    const SCOPE_STATUS_UPDATE                 = 'status_update';
     // Extended Profile Properties
+    const SCOPE_USER_POSTS                    = 'user_posts';
+    const SCOPE_USER_FRIENDS                  = 'user_friends';
     const SCOPE_USER_ABOUT                    = 'user_about_me';
+    const SCOPE_USER_TAGGED_PLACES            = 'user_tagged_places';
     const SCOPE_FRIENDS_ABOUT                 = 'friends_about_me';
     const SCOPE_USER_ACTIVITIES               = 'user_activities';
     const SCOPE_FRIENDS_ACTIVITIES            = 'friends_activities';
@@ -51,6 +73,7 @@ class Facebook extends AbstractService
     const SCOPE_USER_EVENTS                   = 'user_events';
     const SCOPE_FRIENDS_EVENTS                = 'friends_events';
     const SCOPE_USER_GROUPS                   = 'user_groups';
+    const SCOPE_USER_MANAGED_GROUPS           = 'user_managed_groups';
     const SCOPE_FRIENDS_GROUPS                = 'friends_groups';
     const SCOPE_USER_HOMETOWN                 = 'user_hometown';
     const SCOPE_FRIENDS_HOMETOWN              = 'friends_hometown';
@@ -63,7 +86,9 @@ class Facebook extends AbstractService
     const SCOPE_USER_NOTES                    = 'user_notes';
     const SCOPE_FRIENDS_NOTES                 = 'friends_notes';
     const SCOPE_USER_PHOTOS                   = 'user_photos';
+    const SCOPE_USER_PHOTO_VIDEO_TAGS         = 'user_photo_video_tags';
     const SCOPE_FRIENDS_PHOTOS                = 'friends_photos';
+    const SCOPE_FRIENDS_PHOTO_VIDEO_TAGS      = 'friends_photo_video_tags';
     const SCOPE_USER_QUESTIONS                = 'user_questions';
     const SCOPE_FRIENDS_QUESTIONS             = 'friends_questions';
     const SCOPE_USER_RELATIONSHIPS            = 'user_relationships';
@@ -88,25 +113,27 @@ class Facebook extends AbstractService
     const SCOPE_USER_NEWS                     = 'user_actions.news';
     const SCOPE_FRIENDS_NEWS                  = 'friends_actions.news';
     const SCOPE_USER_VIDEO                    = 'user_actions.video';
-    const SCOPE_FREINDS_VIDEO                 = 'friends_actions.video';
+    const SCOPE_FRIENDS_VIDEO                 = 'friends_actions.video';
     const SCOPE_USER_APP                      = 'user_actions:APP_NAMESPACE';
     const SCOPE_FRIENDS_APP                   = 'friends_actions:APP_NAMESPACE';
     const SCOPE_USER_GAMES                    = 'user_games_activity';
     const SCOPE_FRIENDS_GAMES                 = 'friends_games_activity';
     //Page Permissions
     const SCOPE_PAGES                         = 'manage_pages';
+    const SCOPE_PUBLISH_PAGES                 = 'publish_pages';
 
     public function __construct(
         CredentialsInterface $credentials,
         ClientInterface $httpClient,
         TokenStorageInterface $storage,
         $scopes = array(),
-        UriInterface $baseApiUri = null
+        UriInterface $baseApiUri = null,
+        $apiVersion = ""
     ) {
-        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri, true, $apiVersion);
 
         if (null === $baseApiUri) {
-            $this->baseApiUri = new Uri('https://graph.facebook.com/');
+            $this->baseApiUri = new Uri('https://graph.facebook.com'.$this->getApiVersionString().'/');
         }
     }
 
@@ -115,7 +142,7 @@ class Facebook extends AbstractService
      */
     public function getAuthorizationEndpoint()
     {
-        return new Uri('https://www.facebook.com/dialog/oauth');
+        return new Uri('https://www.facebook.com'.$this->getApiVersionString().'/dialog/oauth');
     }
 
     /**
@@ -123,7 +150,7 @@ class Facebook extends AbstractService
      */
     public function getAccessTokenEndpoint()
     {
-        return new Uri('https://graph.facebook.com/oauth/access_token');
+        return new Uri('https://graph.facebook.com'.$this->getApiVersionString().'/oauth/access_token');
     }
 
     /**
@@ -142,7 +169,10 @@ class Facebook extends AbstractService
 
         $token = new StdOAuth2Token();
         $token->setAccessToken($data['access_token']);
-        $token->setLifeTime($data['expires']);
+
+        if (isset($data['expires'])) {
+            $token->setLifeTime($data['expires']);
+        }
 
         if (isset($data['refresh_token'])) {
             $token->setRefreshToken($data['refresh_token']);
@@ -156,4 +186,31 @@ class Facebook extends AbstractService
 
         return $token;
     }
+
+    public function getDialogUri($dialogPath, array $parameters)
+    {
+        if (!isset($parameters['redirect_uri'])) {
+            throw new Exception("Redirect uri is mandatory for this request");
+        }
+        $parameters['app_id'] = $this->credentials->getConsumerId();
+        $baseUrl = self::WWW_URL .$this->getApiVersionString(). '/dialog/' . $dialogPath;
+        $query = http_build_query($parameters);
+        return new Uri($baseUrl . '?' . $query);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getApiVersionString()
+    {
+        return empty($this->apiVersion) ? '' : '/v' . $this->apiVersion;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getScopesDelimiter()
+    {
+        return ',';
+    }
 }
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Foursquare.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Foursquare.php
@@ -73,7 +73,7 @@ class Foursquare extends AbstractService
      */
     public function request($path, $method = 'GET', $body = null, array $extraHeaders = array())
     {
-        $uri = new Uri($this->baseApiUri . $path);
+        $uri = $this->determineRequestUriFromPath($path, $this->baseApiUri);
         $uri->addToQuery('v', $this->apiVersionDate);
 
         return parent::request($uri, $method, $body, $extraHeaders);
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/GitHub.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/GitHub.php
@@ -50,6 +50,13 @@ class GitHub extends AbstractService
      */
     const SCOPE_REPO = 'repo';
 
+    /**
+     * Grants access to deployment statuses for public and private repositories.
+     * This scope is only necessary to grant other users or services access to deployment statuses,
+     * without granting access to the code.
+     */
+    const SCOPE_REPO_DEPLOYMENT = 'repo_deployment';
+
     /**
      * Read/write access to public and private repository commit statuses. This scope is only necessary to grant other
      * users or services access to private repository commit statuses without granting access to the code. The repo and
@@ -72,6 +79,51 @@ class GitHub extends AbstractService
      */
     const SCOPE_GIST = 'gist';
 
+    /**
+     * Grants read and ping access to hooks in public or private repositories.
+     */
+    const SCOPE_HOOKS_READ = 'read:repo_hook';
+
+    /**
+     * Grants read, write, and ping access to hooks in public or private repositories.
+     */
+    const SCOPE_HOOKS_WRITE = 'write:repo_hook';
+
+    /**
+     * Grants read, write, ping, and delete access to hooks in public or private repositories.
+     */
+    const SCOPE_HOOKS_ADMIN = 'admin:repo_hook';
+
+    /**
+     * Read-only access to organization, teams, and membership.
+     */
+    const SCOPE_ORG_READ = 'read:org';
+
+    /**
+     * Publicize and unpublicize organization membership.
+     */
+    const SCOPE_ORG_WRITE = 'write:org';
+
+    /**
+     * Fully manage organization, teams, and memberships.
+     */
+    const SCOPE_ORG_ADMIN = 'admin:org';
+
+    /**
+     * List and view details for public keys.
+     */
+    const SCOPE_PUBLIC_KEY_READ = 'read:public_key';
+
+    /**
+     * Create, list, and view details for public keys.
+     */
+    const SCOPE_PUBLIC_KEY_WRITE = 'write:public_key';
+
+    /**
+     * Fully manage public keys.
+     */
+    const SCOPE_PUBLIC_KEY_ADMIN = 'admin:public_key';
+
     public function __construct(
         CredentialsInterface $credentials,
         ClientInterface $httpClient,
@@ -153,4 +205,12 @@ class GitHub extends AbstractService
     {
         return array('Accept' => 'application/vnd.github.beta+json');
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getScopesDelimiter()
+    {
+        return ',';
+    }
 }
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Google.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Google.php
@@ -2,61 +2,160 @@
 
 namespace OAuth\OAuth2\Service;
 
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
 use OAuth\OAuth2\Token\StdOAuth2Token;
 use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\OAuth2\Service\Exception\InvalidAccessTypeException;
 use OAuth\Common\Http\Uri\Uri;
 
 class Google extends AbstractService
 {
     /**
-     * Defined scopes -- Google has way too many Application Programming Interfaces
+     * Defined scopes - More scopes are listed here:
+     * https://developers.google.com/oauthplayground/
+     *
+     * Make a pull request if you need more scopes.
      */
-    const SCOPE_ADSENSE = 'https://www.googleapis.com/auth/adsense';
-    const SCOPE_ADWORDS = 'https://adwords.google.com/api/adwords/';
-    const SCOPE_GAN = 'https://www.googleapis.com/auth/gan'; // google affiliate network...?
-    const SCOPE_ANALYTICS = 'https://www.googleapis.com/auth/analytics.readonly';
-    const SCOPE_BOOKS = 'https://www.googleapis.com/auth/books';
-    const SCOPE_BLOGGER = 'https://www.googleapis.com/auth/blogger';
-    const SCOPE_CALENDAR = 'https://www.googleapis.com/auth/calendar';
-    const SCOPE_CLOUDSTORAGE = 'https://www.googleapis.com/auth/devstorage.read_write';
-    const SCOPE_CONTACT = 'https://www.google.com/m8/feeds/';
-    const SCOPE_CONTENTFORSHOPPING = 'https://www.googleapis.com/auth/structuredcontent'; // what even is this
-    const SCOPE_CHROMEWEBSTORE = 'https://www.googleapis.com/auth/chromewebstore.readonly';
-    const SCOPE_DOCUMENTSLIST = 'https://docs.google.com/feeds/';
-    const SCOPE_GOOGLEDRIVE = 'https://www.googleapis.com/auth/drive';
-    const SCOPE_GOOGLEDRIVE_FILES = 'https://www.googleapis.com/auth/drive.file';
-    const SCOPE_GMAIL = 'https://mail.google.com/mail/feed/atom';
-    const SCOPE_GPLUS_ME = 'https://www.googleapis.com/auth/plus.me';
-    const SCOPE_GPLUS_LOGIN = 'https://www.googleapis.com/auth/plus.login';
-    const SCOPE_GROUPS_PROVISIONING = 'https://apps-apis.google.com/a/feeds/groups/';
+
+    // Basic
+    const SCOPE_EMAIL                       = 'email';
+    const SCOPE_PROFILE                     = 'profile';
+
+    const SCOPE_USERINFO_EMAIL              = 'https://www.googleapis.com/auth/userinfo.email';
+    const SCOPE_USERINFO_PROFILE            = 'https://www.googleapis.com/auth/userinfo.profile';
+
+    // Google+
+    const SCOPE_GPLUS_ME                    = 'https://www.googleapis.com/auth/plus.me';
+    const SCOPE_GPLUS_LOGIN                 = 'https://www.googleapis.com/auth/plus.login';
+    const SCOPE_GPLUS_CIRCLES_READ          = 'https://www.googleapis.com/auth/plus.circles.read';
+    const SCOPE_GPLUS_CIRCLES_WRITE         = 'https://www.googleapis.com/auth/plus.circles.write';
+    const SCOPE_GPLUS_STREAM_READ           = 'https://www.googleapis.com/auth/plus.stream.read';
+    const SCOPE_GPLUS_STREAM_WRITE          = 'https://www.googleapis.com/auth/plus.stream.write';
+    const SCOPE_GPLUS_MEDIA                 = 'https://www.googleapis.com/auth/plus.media.upload';
+
+    // Google Drive
+    const SCOPE_DOCUMENTSLIST               = 'https://docs.google.com/feeds/';
+    const SCOPE_SPREADSHEETS                = 'https://spreadsheets.google.com/feeds/';
+    const SCOPE_GOOGLEDRIVE                 = 'https://www.googleapis.com/auth/drive';
+    const SCOPE_DRIVE_APPS                  = 'https://www.googleapis.com/auth/drive.appdata';
+    const SCOPE_DRIVE_APPS_READ_ONLY        = 'https://www.googleapis.com/auth/drive.apps.readonly';
+    const SCOPE_GOOGLEDRIVE_FILES           = 'https://www.googleapis.com/auth/drive.file';
+    const SCOPE_DRIVE_METADATA_READ_ONLY    = 'https://www.googleapis.com/auth/drive.metadata.readonly';
+    const SCOPE_DRIVE_READ_ONLY             = 'https://www.googleapis.com/auth/drive.readonly';
+    const SCOPE_DRIVE_SCRIPTS               = 'https://www.googleapis.com/auth/drive.scripts';
+
+    // Adwords
+    const SCOPE_ADSENSE                     = 'https://www.googleapis.com/auth/adsense';
+    const SCOPE_ADWORDS                     = 'https://www.googleapis.com/auth/adwords/';
+    const SCOPE_GAN                         = 'https://www.googleapis.com/auth/gan'; // google affiliate network...?
+
+    //Doubleclick for Publishers
+    const SCOPE_DFP                         = 'https://www.googleapis.com/auth/dfp';
+    const SCOPE_DFP_TRAFFICKING             = 'https://www.googleapis.com/auth/dfatrafficking';
+    const SCOPE_DFP_REPORTING               = 'https://www.googleapis.com/auth/dfareporting';
+
+    // Google Analytics
+    const SCOPE_ANALYTICS                   = 'https://www.googleapis.com/auth/analytics';
+    const SCOPE_ANALYTICS_EDIT              = 'https://www.googleapis.com/auth/analytics.edit';
+    const SCOPE_ANALYTICS_MANAGE_USERS      = 'https://www.googleapis.com/auth/analytics.manage.users';
+    const SCOPE_ANALYTICS_READ_ONLY         = 'https://www.googleapis.com/auth/analytics.readonly';
+
+    //Gmail
+    const SCOPE_GMAIL_MODIFY                = 'https://www.googleapis.com/auth/gmail.modify';
+    const SCOPE_GMAIL_READONLY              = 'https://www.googleapis.com/auth/gmail.readonly';
+    const SCOPE_GMAIL_COMPOSE               = 'https://www.googleapis.com/auth/gmail.compose';
+    const SCOPE_GMAIL_SEND                  = 'https://www.googleapis.com/auth/gmail.send';
+    const SCOPE_GMAIL_INSERT                = 'https://www.googleapis.com/auth/gmail.insert';
+    const SCOPE_GMAIL_LABELS                = 'https://www.googleapis.com/auth/gmail.labels';
+    const SCOPE_GMAIL_FULL                  = 'https://mail.google.com/';
+
+    // Other services
+    const SCOPE_BOOKS                       = 'https://www.googleapis.com/auth/books';
+    const SCOPE_BLOGGER                     = 'https://www.googleapis.com/auth/blogger';
+    const SCOPE_CALENDAR                    = 'https://www.googleapis.com/auth/calendar';
+    const SCOPE_CALENDAR_READ_ONLY          = 'https://www.googleapis.com/auth/calendar.readonly';
+    const SCOPE_CONTACT                     = 'https://www.google.com/m8/feeds/';
+    const SCOPE_CONTACTS_RO                 = 'https://www.googleapis.com/auth/contacts.readonly';
+    const SCOPE_CHROMEWEBSTORE              = 'https://www.googleapis.com/auth/chromewebstore.readonly';
+    const SCOPE_GMAIL                       = 'https://mail.google.com/mail/feed/atom';
+    const SCOPE_GMAIL_IMAP_SMTP             = 'https://mail.google.com';
+    const SCOPE_PICASAWEB                   = 'https://picasaweb.google.com/data/';
+    const SCOPE_SITES                       = 'https://sites.google.com/feeds/';
+    const SCOPE_URLSHORTENER                = 'https://www.googleapis.com/auth/urlshortener';
+    const SCOPE_WEBMASTERTOOLS              = 'https://www.google.com/webmasters/tools/feeds/';
+    const SCOPE_TASKS                       = 'https://www.googleapis.com/auth/tasks';
+
+    // Cloud services
+    const SCOPE_CLOUDSTORAGE                = 'https://www.googleapis.com/auth/devstorage.read_write';
+    const SCOPE_CONTENTFORSHOPPING          = 'https://www.googleapis.com/auth/structuredcontent'; // what even is this
+    const SCOPE_USER_PROVISIONING           = 'https://apps-apis.google.com/a/feeds/user/';
+    const SCOPE_GROUPS_PROVISIONING         = 'https://apps-apis.google.com/a/feeds/groups/';
+    const SCOPE_NICKNAME_PROVISIONING       = 'https://apps-apis.google.com/a/feeds/alias/';
+
+    // Old
+    const SCOPE_ORKUT                       = 'https://www.googleapis.com/auth/orkut';
     const SCOPE_GOOGLELATITUDE =
         'https://www.googleapis.com/auth/latitude.all.best https://www.googleapis.com/auth/latitude.all.city';
-        // creepy stalker api...
-    const SCOPE_MODERATOR = 'https://www.googleapis.com/auth/moderator';
-    const SCOPE_NICKNAME_PROVISIONING = 'https://apps-apis.google.com/a/feeds/alias/';
-    const SCOPE_ORKUT = 'https://www.googleapis.com/auth/orkut'; // evidently orkut still exists. who knew?
-    const SCOPE_PICASAWEB = 'https://picasaweb.google.com/data/';
-    const SCOPE_SITES = 'https://sites.google.com/feeds/';
-    const SCOPE_SPREADSHEETS = 'https://spreadsheets.google.com/feeds/';
-    const SCOPE_TASKS = 'https://www.googleapis.com/auth/tasks';
-    const SCOPE_URLSHORTENER = 'https://www.googleapis.com/auth/urlshortener';
-    const SCOPE_USERINFO_EMAIL = 'https://www.googleapis.com/auth/userinfo.email';
-    const SCOPE_USERINFO_PROFILE = 'https://www.googleapis.com/auth/userinfo.profile';
-    const SCOPE_USER_PROVISIONING = 'https://apps-apis.google.com/a/feeds/user/';
-    const SCOPE_WEBMASTERTOOLS = 'https://www.google.com/webmasters/tools/feeds/';
-    const SCOPE_YOUTUBE = 'https://gdata.youtube.com';
-    
-    const SCOPE_GLASS_TIMELINE = 'https://www.googleapis.com/auth/glass.timeline';
-    const SCOPE_GLASS_LOCATION = 'https://www.googleapis.com/auth/glass.location';
-    
+    const SCOPE_OPENID                      = 'openid';
+
+    // YouTube
+    const SCOPE_YOUTUBE_GDATA               = 'https://gdata.youtube.com';
+    const SCOPE_YOUTUBE_ANALYTICS_MONETARY  = 'https://www.googleapis.com/auth/yt-analytics-monetary.readonly';
+    const SCOPE_YOUTUBE_ANALYTICS           = 'https://www.googleapis.com/auth/yt-analytics.readonly';
+    const SCOPE_YOUTUBE                     = 'https://www.googleapis.com/auth/youtube';
+    const SCOPE_YOUTUBE_READ_ONLY           = 'https://www.googleapis.com/auth/youtube.readonly';
+    const SCOPE_YOUTUBE_UPLOAD              = 'https://www.googleapis.com/auth/youtube.upload';
+    const SCOPE_YOUTUBE_PARTNER             = 'https://www.googleapis.com/auth/youtubepartner';
+    const SCOPE_YOUTUBE_PARTNER_AUDIT       = 'https://www.googleapis.com/auth/youtubepartner-channel-audit';
 
+    // Google Glass
+    const SCOPE_GLASS_TIMELINE              = 'https://www.googleapis.com/auth/glass.timeline';
+    const SCOPE_GLASS_LOCATION              = 'https://www.googleapis.com/auth/glass.location';
+
+    // Android Publisher
+    const SCOPE_ANDROID_PUBLISHER           = 'https://www.googleapis.com/auth/androidpublisher';
+
+    // Google Classroom
+    const SCOPE_CLASSROOM_COURSES           = 'https://www.googleapis.com/auth/classroom.courses';
+    const SCOPE_CLASSROOM_COURSES_READONLY  = 'https://www.googleapis.com/auth/classroom.courses.readonly';
+    const SCOPE_CLASSROOM_PROFILE_EMAILS    = 'https://www.googleapis.com/auth/classroom.profile.emails';
+    const SCOPE_CLASSROOM_PROFILE_PHOTOS    = 'https://www.googleapis.com/auth/classroom.profile.photos';
+    const SCOPE_CLASSROOM_ROSTERS           = 'https://www.googleapis.com/auth/classroom.rosters';
+    const SCOPE_CLASSROOM_ROSTERS_READONLY  = 'https://www.googleapis.com/auth/classroom.rosters.readonly';
+
+    protected $accessType = 'online';
+
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri, true);
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://www.googleapis.com/oauth2/v1/');
+        }
+    }
+
+    public function setAccessType($accessType)
+    {
+        if (!in_array($accessType, array('online', 'offline'), true)) {
+            throw new InvalidAccessTypeException('Invalid accessType, expected either online or offline');
+        }
+        $this->accessType = $accessType;
+    }
 
     /**
      * {@inheritdoc}
      */
     public function getAuthorizationEndpoint()
     {
-        return new Uri('https://accounts.google.com/o/oauth2/auth');
+        return new Uri('https://accounts.google.com/o/oauth2/auth?access_type=' . $this->accessType);
     }
 
     /**
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Harvest.php
@@ -0,0 +1,157 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Token\TokenInterface;
+use OAuth\OAuth2\Token\StdOAuth2Token;
+
+class Harvest extends AbstractService
+{
+
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://api.harvestapp.com/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationUri(array $additionalParameters = array())
+    {
+        $parameters = array_merge(
+            $additionalParameters,
+            array(
+                'client_id'     => $this->credentials->getConsumerId(),
+                'redirect_uri'  => $this->credentials->getCallbackUrl(),
+                'state' => 'optional-csrf-token',
+                'response_type' => 'code',
+            )
+        );
+
+        // Build the url
+        $url = clone $this->getAuthorizationEndpoint();
+        foreach ($parameters as $key => $val) {
+            $url->addToQuery($key, $val);
+        }
+
+        return $url;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://api.harvestapp.com/oauth2/authorize');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://api.harvestapp.com/oauth2/token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_QUERY_STRING;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || ! is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+        $token->setLifetime($data['expires_in']);
+        $token->setRefreshToken($data['refresh_token']);
+
+        unset($data['access_token']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+
+    /**
+     * Refreshes an OAuth2 access token.
+     *
+     * @param TokenInterface $token
+     *
+     * @return TokenInterface $token
+     *
+     * @throws MissingRefreshTokenException
+     */
+    public function refreshAccessToken(TokenInterface $token)
+    {
+        $refreshToken = $token->getRefreshToken();
+
+        if (empty($refreshToken)) {
+            throw new MissingRefreshTokenException();
+        }
+
+        $parameters = array(
+            'grant_type'    => 'refresh_token',
+            'type'          => 'web_server',
+            'client_id'     => $this->credentials->getConsumerId(),
+            'client_secret' => $this->credentials->getConsumerSecret(),
+            'refresh_token' => $refreshToken,
+        );
+
+        $responseBody = $this->httpClient->retrieveResponse(
+            $this->getAccessTokenEndpoint(),
+            $parameters,
+            $this->getExtraOAuthHeaders()
+        );
+        $token = $this->parseAccessTokenResponse($responseBody);
+        $this->storage->storeAccessToken($this->service(), $token);
+
+        return $token;
+    }
+
+    /**
+     * @return array
+     */
+    protected function getExtraOAuthHeaders()
+    {
+        return array('Accept' => 'application/json');
+    }
+
+    /**
+     * Return any additional headers always needed for this service implementation's API calls.
+     *
+     * @return array
+     */
+    protected function getExtraApiHeaders()
+    {
+        return array('Accept' => 'application/json');
+    }
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Hubic.php
@@ -0,0 +1,155 @@
+<?php
+/**
+ * Hubic service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    https://api.hubic.com/docs/
+ */
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Hubic service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    https://api.hubic.com/docs/
+ */
+class Hubic extends AbstractService
+{
+
+    // Scopes
+    const SCOPE_USAGE_GET       = 'usage.r';
+    const SCOPE_ACCOUNT_GET     = 'account.r';
+    const SCOPE_GETALLLINKS_GET = 'getAllLinks.r';
+    const SCOPE_CREDENTIALS_GET = 'credentials.r';
+    const SCOPE_SPONSORCODE_GET = 'sponsorCode.r';
+    const SCOPE_ACTIVATE_POST   = 'activate.w';
+    const SCOPE_SPONSORED_GET   = 'sponsored.r';
+    const SCOPE_LINKS_GET       = 'links.r';
+    const SCOPE_LINKS_POST      = 'links.rw';
+    const SCOPE_LINKS_ALL       = 'links.drw';
+
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct(
+            $credentials,
+            $httpClient,
+            $storage,
+            $scopes,
+            $baseApiUri,
+            true
+        );
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://api.hubic.com/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://api.hubic.com/oauth/auth');
+
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://api.hubic.com/oauth/token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException(
+                'Error in retrieving token: "' . $data['error'] . '"'
+            );
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+        $token->setLifetime($data['expires_in']);
+
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        unset($data['access_token']);
+        unset($data['expires_in']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationUri(array $additionalParameters = array())
+    {
+        $parameters = array_merge(
+            $additionalParameters,
+            array(
+                'type'          => 'web_server',
+                'client_id'     => $this->credentials->getConsumerId(),
+                'redirect_uri'  => $this->credentials->getCallbackUrl(),
+                'response_type' => 'code',
+            )
+        );
+
+        // special, hubic use a param scope with commas
+        // between scopes instead of spaces
+        $parameters['scope'] = implode(',', $this->scopes);
+
+        if ($this->needsStateParameterInAuthUrl()) {
+            if (!isset($parameters['state'])) {
+                $parameters['state'] = $this->generateAuthorizationState();
+            }
+            $this->storeAuthorizationState($parameters['state']);
+        }
+
+        // Build the url
+        $url = clone $this->getAuthorizationEndpoint();
+        foreach ($parameters as $key => $val) {
+            $url->addToQuery($key, $val);
+        }
+
+        return $url;
+    }
+}
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Instagram.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Instagram.php
@@ -17,9 +17,11 @@ class Instagram extends AbstractService
      * @link http://instagram.com/developer/authentication/#scope
      */
     const SCOPE_BASIC         = 'basic';
+    const SCOPE_PUBLIC_CONTENT = 'public_content';
     const SCOPE_COMMENTS      = 'comments';
     const SCOPE_RELATIONSHIPS = 'relationships';
     const SCOPE_LIKES         = 'likes';
+    const SCOPE_FOLLOWER_LIST = 'follower_list';
 
     public function __construct(
         CredentialsInterface $credentials,
@@ -28,7 +30,7 @@ class Instagram extends AbstractService
         $scopes = array(),
         UriInterface $baseApiUri = null
     ) {
-        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri, true);
 
         if (null === $baseApiUri) {
             $this->baseApiUri = new Uri('https://api.instagram.com/v1/');
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/JawboneUP.php
@@ -0,0 +1,144 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Jawbone UP service.
+ *
+ * @author Andrii Gakhov <andrii.gakhov@gmail.com>
+ * @link https://jawbone.com/up/developer/authentication
+ */
+class JawboneUP extends AbstractService
+{
+    /**
+     * Defined scopes
+     *
+     *
+     * @link https://jawbone.com/up/developer/authentication
+     */
+    // general information scopes
+    const SCOPE_BASIC_READ          = 'basic_read';
+    const SCOPE_EXTENDED_READ       = 'extended_read';
+    const SCOPE_LOCATION_READ       = 'location_read';
+    const SCOPE_FRIENDS_READ        = 'friends_read';
+    // mood scopes
+    const SCOPE_MOOD_READ           = 'mood_read';
+    const SCOPE_MOOD_WRITE          = 'mood_write';
+    // move scopes
+    const SCOPE_MOVE_READ           = 'move_read';
+    const SCOPE_MOVE_WRITE          = 'move_write';
+    // sleep scopes
+    const SCOPE_SLEEP_READ          = 'sleep_read';
+    const SCOPE_SLEEP_WRITE         = 'sleep_write';
+    // meal scopes
+    const SCOPE_MEAL_READ           = 'meal_read';
+    const SCOPE_MEAL_WRITE          = 'meal_write';
+    // weight scopes
+    const SCOPE_WEIGHT_READ         = 'weight_read';
+    const SCOPE_WEIGHT_WRITE        = 'weight_write';
+    // generic event scopes
+    const SCOPE_GENERIC_EVENT_READ  = 'generic_event_read';
+    const SCOPE_GENERIC_EVENT_WRITE = 'generic_event_write';
+
+
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://jawbone.com/nudge/api/v.1.1/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationUri(array $additionalParameters = array())
+    {
+        $parameters = array_merge(
+            $additionalParameters,
+            array(
+                'client_id'     => $this->credentials->getConsumerId(),
+                'redirect_uri'  => $this->credentials->getCallbackUrl(),
+                'response_type' => 'code',
+            )
+        );
+
+        $parameters['scope'] = implode(' ', $this->scopes);
+
+        // Build the url
+        $url = clone $this->getAuthorizationEndpoint();
+        foreach ($parameters as $key => $val) {
+            $url->addToQuery($key, $val);
+        }
+
+        return $url;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://jawbone.com/auth/oauth2/auth');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://jawbone.com/auth/oauth2/token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+        $token->setLifeTime($data['expires_in']);
+
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        unset($data['access_token']);
+        unset($data['expires_in']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+}
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Linkedin.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Linkedin.php
@@ -31,6 +31,7 @@ class Linkedin extends AbstractService
     const SCOPE_RW_COMPANY_ADMIN    = 'rw_company_admin';
     const SCOPE_RW_GROUPS           = 'rw_groups';
     const SCOPE_W_MESSAGES          = 'w_messages';
+    const SCOPE_W_SHARE             = 'w_share';
 
     public function __construct(
         CredentialsInterface $credentials,
@@ -39,7 +40,7 @@ class Linkedin extends AbstractService
         $scopes = array(),
         UriInterface $baseApiUri = null
     ) {
-        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri, true);
 
         if (null === $baseApiUri) {
             $this->baseApiUri = new Uri('https://api.linkedin.com/v1/');
@@ -67,7 +68,7 @@ class Linkedin extends AbstractService
      */
     protected function getAuthorizationMethod()
     {
-        return static::AUTHORIZATION_METHOD_QUERY_STRING_V2;
+        return static::AUTHORIZATION_METHOD_HEADER_BEARER;
     }
 
     /**
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Mailchimp.php
@@ -0,0 +1,114 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Mailchimp extends AbstractService
+{
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+
+        if (is_null($this->baseApiUri) && $storage->hasAccessToken($this->service())) {
+            $this->setBaseApiUri($storage->retrieveAccessToken($this->service()));
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_QUERY_STRING_V3;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://login.mailchimp.com/oauth2/authorize');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://login.mailchimp.com/oauth2/token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        // Parse JSON
+        $data = json_decode($responseBody, true);
+
+        // Do validation.
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+        }
+
+        // Create token object.
+        $token = new StdOAuth2Token($data['access_token']);
+
+        // Set the right API endpoint.
+        $this->setBaseApiUri($token);
+
+        // Mailchimp tokens evidently never expire...
+        $token->setEndOfLife(StdOAuth2Token::EOL_NEVER_EXPIRES);
+
+        return $token;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function request($path, $method = 'GET', $body = null, array $extraHeaders = array())
+    {
+        if (is_null($this->baseApiUri)) {
+            $this->setBaseApiUri($this->storage->retrieveAccessToken($this->service()));
+        }
+
+        return parent::request($path, $method, $body, $extraHeaders);
+    }
+
+    /**
+     * Set the right base endpoint.
+     *
+     * @param StdOAuth2Token $token
+     */
+    protected function setBaseApiUri(StdOAuth2Token $token)
+    {
+        // Make request uri.
+        $endpoint = 'https://login.mailchimp.com/oauth2/metadata?oauth_token='. $token->getAccessToken();
+
+        // Grab meta data about the token.
+        $response = $this->httpClient->retrieveResponse(new Uri($endpoint), array(), array(), 'GET');
+
+        // Parse JSON.
+        $meta = json_decode($response, true);
+
+        // Set base api uri.
+        $this->baseApiUri = new Uri('https://'. $meta['dc'] .'.api.mailchimp.com/2.0/');
+
+        // Allow chaining.
+        return $this;
+    }
+}
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Microsoft.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Microsoft.php
@@ -35,6 +35,20 @@ class Microsoft extends AbstractService
     const SCOPE_WORK_PROFILE = 'wl.work_profile';
     const SCOPE_APPLICATIONS = 'wl.applications';
     const SCOPE_APPLICATIONS_CREATE = 'wl.applications_create';
+    const SCOPE_IMAP = 'wl.imap';
+
+    /**
+     * MS uses some magical not officialy supported scope to get even moar info like full emailaddresses.
+     * They agree that giving 3rd party apps access to 3rd party emailaddresses is a pretty lame thing to do so in all
+     * their wisdom they added this scope because fuck you that's why.
+     *
+     * https://github.com/Lusitanian/PHPoAuthLib/issues/214
+     * http://social.msdn.microsoft.com/Forums/live/en-US/c6dcb9ab-aed4-400a-99fb-5650c393a95d/how-retrieve-users-
+     *                                  contacts-email-address?forum=messengerconnect
+     *
+     * Considering this scope is not officially supported: use with care
+     */
+    const SCOPE_CONTACTS_EMAILS = 'wl.contacts_emails';
 
     public function __construct(
         CredentialsInterface $credentials,
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Nest.php
@@ -0,0 +1,106 @@
+<?php
+/**
+ * Nest service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    https://developer.nest.com/documentation
+ */
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Nest service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    https://developer.nest.com/documentation
+ */
+class Nest extends AbstractService
+{
+
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct(
+            $credentials,
+            $httpClient,
+            $storage,
+            $scopes,
+            $baseApiUri,
+            true
+        );
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://developer-api.nest.com/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://home.nest.com/login/oauth2');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://api.home.nest.com/oauth2/access_token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_QUERY_STRING_V4;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException(
+                'Error in retrieving token: "' . $data['error'] . '"'
+            );
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+        $token->setLifeTime($data['expires_in']);
+
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        unset($data['access_token']);
+        unset($data['expires_in']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Netatmo.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Netatmo service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    https://dev.netatmo.com/doc/
+ */
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Netatmo service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    https://dev.netatmo.com/doc/
+ */
+class Netatmo extends AbstractService
+{
+
+    // SCOPES
+    // @link https://dev.netatmo.com/doc/authentication/scopes
+
+    // Used to read weather station's data (devicelist, getmeasure)
+    const SCOPE_STATION_READ        = 'read_station';
+    // Used to read thermostat's data (devicelist, getmeasure, getthermstate)
+    const SCOPE_THERMOSTAT_READ     = 'read_thermostat';
+    // Used to configure the thermostat (syncschedule, setthermpoint)
+    const SCOPE_THERMOSTAT_WRITE    = 'write_thermostat';
+
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct(
+            $credentials,
+            $httpClient,
+            $storage,
+            $scopes,
+            $baseApiUri,
+            true // use parameter state
+        );
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://api.netatmo.net/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri($this->baseApiUri.'oauth2/authorize');
+
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri($this->baseApiUri.'oauth2/token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_QUERY_STRING;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException(
+                'Error in retrieving token: "' . $data['error'] . '"'
+            );
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+        $token->setLifetime($data['expires_in']);
+
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        unset($data['access_token']);
+        unset($data['expires_in']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/ParrotFlowerPower.php
@@ -0,0 +1,142 @@
+<?php
+/**
+ * ParrotFlowerPower service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    https://flowerpowerdev.parrot.com/projects/flower-power-web-service-api/wiki
+ */
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\OAuth2\Service\Exception\MissingRefreshTokenException;
+use OAuth\Common\Token\TokenInterface;
+
+/**
+ * ParrotFlowerPower service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    https://flowerpowerdev.parrot.com/projects/flower-power-web-service-api/wiki
+ */
+class ParrotFlowerPower extends AbstractService
+{
+
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct(
+            $credentials,
+            $httpClient,
+            $storage,
+            $scopes,
+            $baseApiUri,
+            true
+        );
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://apiflowerpower.parrot.com/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri($this->baseApiUri.'oauth2/v1/authorize');
+
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri($this->baseApiUri.'user/v1/authenticate');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException(
+                'Error in retrieving token: "' . $data['error'] . '"'
+            );
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+        $token->setLifetime($data['expires_in']);
+
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        unset($data['access_token']);
+        unset($data['expires_in']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+
+
+    /**
+     * Parrot use a different endpoint for refresh a token
+     *
+     * {@inheritdoc}
+     */
+    public function refreshAccessToken(TokenInterface $token)
+    {
+        $refreshToken = $token->getRefreshToken();
+
+        if (empty($refreshToken)) {
+            throw new MissingRefreshTokenException();
+        }
+
+        $parameters = array(
+            'grant_type'    => 'refresh_token',
+            'type'          => 'web_server',
+            'client_id'     => $this->credentials->getConsumerId(),
+            'client_secret' => $this->credentials->getConsumerSecret(),
+            'refresh_token' => $refreshToken,
+        );
+
+        $responseBody = $this->httpClient->retrieveResponse(
+            new Uri($this->baseApiUri.'user/v1/refresh'),
+            $parameters,
+            $this->getExtraOAuthHeaders()
+        );
+        $token = $this->parseAccessTokenResponse($responseBody);
+        $this->storage->storeAccessToken($this->service(), $token);
+
+        return $token;
+    }
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Pinterest.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Pinterest service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    https://developers.pinterest.com/docs/api/overview/
+ */
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Pinterest service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    https://developers.pinterest.com/docs/api/overview/
+ */
+class Pinterest extends AbstractService
+{
+    /**
+     * Defined scopes - More scopes are listed here:
+     * https://developers.pinterest.com/docs/api/overview/
+     */
+    const SCOPE_READ_PUBLIC         = 'read_public';            // read a user’s Pins, boards and likes
+    const SCOPE_WRITE_PUBLIC        = 'write_public';           // write Pins, boards, likes
+    const SCOPE_READ_RELATIONSHIPS  = 'read_relationships';     // read a user’s follows (boards, users, interests)
+    const SCOPE_WRITE_RELATIONSHIPS = 'write_relationships';    // follow boards, users and interests
+
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct(
+            $credentials,
+            $httpClient,
+            $storage,
+            $scopes,
+            $baseApiUri,
+            true
+        );
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://api.pinterest.com/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://api.pinterest.com/oauth/');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://api.pinterest.com/v1/oauth/token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException(
+                'Error in retrieving token: "' . $data['error'] . '"'
+            );
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+
+        if (isset($data['expires_in'])) {
+            $token->setLifeTime($data['expires_in']);
+            unset($data['expires_in']);
+        }
+        // I hope one day Pinterest add a refresh token :)
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        unset($data['access_token']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Pocket.php
@@ -0,0 +1,125 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+
+class Pocket extends AbstractService
+{
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+        if ($baseApiUri === null) {
+            $this->baseApiUri = new Uri('https://getpocket.com/v3/');
+        }
+    }
+    
+    public function getRequestTokenEndpoint()
+    {
+        return new Uri('https://getpocket.com/v3/oauth/request');
+    }
+    
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://getpocket.com/auth/authorize');
+    }
+    
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://getpocket.com/v3/oauth/authorize');
+    }
+    
+    public function getAuthorizationUri(array $additionalParameters = array())
+    {
+        $parameters = array_merge(
+            $additionalParameters,
+            array(
+                'redirect_uri' => $this->credentials->getCallbackUrl(),
+            )
+        );
+        
+        // Build the url
+        $url = clone $this->getAuthorizationEndpoint();
+        foreach ($parameters as $key => $val) {
+            $url->addToQuery($key, $val);
+        }
+
+        return $url;
+    }
+    
+    public function requestRequestToken()
+    {
+        $responseBody = $this->httpClient->retrieveResponse(
+            $this->getRequestTokenEndpoint(),
+            array(
+                'consumer_key' => $this->credentials->getConsumerId(),
+                'redirect_uri' => $this->credentials->getCallbackUrl(),
+            )
+        );
+        
+        $code = $this->parseRequestTokenResponse($responseBody);
+
+        return $code;
+    }
+    
+    protected function parseRequestTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+        
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (!isset($data['code'])) {
+            throw new TokenResponseException('Error in retrieving code.');
+        }
+        return $data['code'];
+    }
+    
+    public function requestAccessToken($code)
+    {
+        $bodyParams = array(
+            'consumer_key'     => $this->credentials->getConsumerId(),
+            'code'             => $code,
+        );
+
+        $responseBody = $this->httpClient->retrieveResponse(
+            $this->getAccessTokenEndpoint(),
+            $bodyParams,
+            $this->getExtraOAuthHeaders()
+        );
+        $token = $this->parseAccessTokenResponse($responseBody);
+        $this->storage->storeAccessToken($this->service(), $token);
+
+        return $token;
+    }
+    
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+        
+        if ($data === null || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+        }
+        
+        $token = new StdOAuth2Token();
+        #$token->setRequestToken($data['access_token']);
+        $token->setAccessToken($data['access_token']);
+        $token->setEndOfLife(StdOAuth2Token::EOL_NEVER_EXPIRES);
+        unset($data['access_token']);
+        $token->setExtraParams($data);
+        
+        return $token;
+    }
+}
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Reddit.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Reddit.php
@@ -41,7 +41,7 @@ class Reddit extends AbstractService
         $scopes = array(),
         UriInterface $baseApiUri = null
     ) {
-        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri);
+        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri, true);
 
         if (null === $baseApiUri) {
             $this->baseApiUri = new Uri('https://oauth.reddit.com');
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Salesforce.php
@@ -0,0 +1,92 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Service\AbstractService;
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Salesforce extends AbstractService
+{
+    /**
+     * Scopes
+     *
+     * @var string
+     */
+    const   SCOPE_API           =   'api',
+            SCOPE_REFRESH_TOKEN =   'refresh_token';
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://login.salesforce.com/services/oauth2/authorize');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://na1.salesforce.com/services/oauth2/token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseRequestTokenResponse($responseBody)
+    {
+        parse_str($responseBody, $data);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
+            throw new TokenResponseException('Error in retrieving token.');
+        }
+
+        return $this->parseAccessTokenResponse($responseBody);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+        // Salesforce tokens evidently never expire...
+        $token->setEndOfLife(StdOAuth2Token::EOL_NEVER_EXPIRES);
+        unset($data['access_token']);
+
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getExtraOAuthHeaders()
+    {
+        return array('Accept' => 'application/json');
+    }
+}
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/ServiceInterface.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/ServiceInterface.php
@@ -22,6 +22,8 @@ interface ServiceInterface extends BaseServiceInterface
     const AUTHORIZATION_METHOD_HEADER_BEARER   = 1;
     const AUTHORIZATION_METHOD_QUERY_STRING    = 2;
     const AUTHORIZATION_METHOD_QUERY_STRING_V2 = 3;
+    const AUTHORIZATION_METHOD_QUERY_STRING_V3 = 4;
+    const AUTHORIZATION_METHOD_QUERY_STRING_V4 = 5;
 
     /**
      * Retrieves and stores/returns the OAuth2 access token after a successful authorization.
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Spotify.php
@@ -0,0 +1,112 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Spotify extends AbstractService
+{
+    /**
+     * Scopes
+     *
+     * @var string
+     */
+    const SCOPE_PLAYLIST_MODIFY_PUBLIC = 'playlist-modify-public';
+    const SCOPE_PLAYLIST_MODIFY_PRIVATE = 'playlist-modify-private';
+    const SCOPE_PLAYLIST_READ_PRIVATE = 'playlist-read-private';
+    const SCOPE_PLAYLIST_READ_COLABORATIVE = 'playlist-read-collaborative';
+    const SCOPE_STREAMING = 'streaming';
+    const SCOPE_USER_LIBRARY_MODIFY = 'user-library-modify';
+    const SCOPE_USER_LIBRARY_READ = 'user-library-read';
+    const SCOPE_USER_READ_PRIVATE = 'user-read-private';
+    const SCOPE_USER_READ_EMAIL = 'user-read-email';
+    const SCOPE_USER_READ_BIRTHDAY = 'user-read-birthdate';
+    const SCOPE_USER_READ_FOLLOW = 'user-follow-read';
+
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri, true);
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://api.spotify.com/v1/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://accounts.spotify.com/authorize');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://accounts.spotify.com/api/token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+        }
+
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+
+        if (isset($data['expires_in'])) {
+            $token->setLifetime($data['expires_in']);
+            unset($data['expires_in']);
+        }
+
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        unset($data['access_token']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getExtraOAuthHeaders()
+    {
+        return array('Authorization' => 'Basic ' .
+            base64_encode($this->credentials->getConsumerId() . ':' . $this->credentials->getConsumerSecret()));
+    }
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Strava.php
@@ -0,0 +1,147 @@
+<?php
+/**
+ * Strava service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    http://strava.github.io/
+ * @link    http://strava.github.io/api/v3/oauth/
+ */
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+use OAuth\OAuth2\Service\Exception\InvalidAccessTypeException;
+
+/**
+ * Strava service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    http://strava.github.io/
+ * @link    http://strava.github.io/api/v3/oauth/
+ */
+class Strava extends AbstractService
+{
+    /**
+     * Scopes
+     */
+    // default
+    const SCOPE_PUBLIC       = 'public';
+    // Modify activities, upload on the user’s behalf
+    const SCOPE_WRITE        = 'write';
+    // View private activities and data within privacy zones
+    const SCOPE_VIEW_PRIVATE = 'view_private';
+
+    protected $approvalPrompt = 'auto';
+
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        if (empty($scopes)) {
+            $scopes = array(self::SCOPE_PUBLIC);
+        }
+
+        parent::__construct(
+            $credentials,
+            $httpClient,
+            $storage,
+            $scopes,
+            $baseApiUri,
+            true
+        );
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://www.strava.com/api/v3/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://www.strava.com/oauth/authorize?approval_prompt=' . $this->approvalPrompt);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://www.strava.com/oauth/token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error_description'])) {
+            throw new TokenResponseException(
+                'Error in retrieving token: "' . $data['error_description'] . '"'
+            );
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException(
+                'Error in retrieving token: "' . $data['error'] . '"'
+            );
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+
+        if (isset($data['expires_in'])) {
+            $token->setLifeTime($data['expires_in']);
+            unset($data['expires_in']);
+        }
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        unset($data['access_token']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+
+    public function setApprouvalPrompt($prompt)
+    {
+        if (!in_array($prompt, array('auto', 'force'), true)) {
+            // @todo Maybe could we rename this exception
+            throw new InvalidAccessTypeException('Invalid approuvalPrompt, expected either auto or force.');
+        }
+        $this->approvalPrompt = $prompt;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getScopesDelimiter()
+    {
+        return ',';
+    }
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Ustream.php
@@ -0,0 +1,98 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+class Ustream extends AbstractService
+{
+    /**
+     * Scopes
+     *
+     * @var string
+     */
+    const SCOPE_OFFLINE     = 'offline';
+    const SCOPE_BROADCASTER = 'broadcaster';
+
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri, true);
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://api.ustream.tv/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://www.ustream.tv/oauth2/authorize');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://www.ustream.tv/oauth2/token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+        $token->setLifeTime($data['expires_in']);
+
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        unset($data['access_token']);
+        unset($data['expires_in']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getExtraOAuthHeaders()
+    {
+        return array('Authorization' => 'Basic ' . $this->credentials->getConsumerSecret());
+    }
+}
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Vimeo.php
@@ -0,0 +1,156 @@
+<?php
+/**
+ * Vimeo service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    https://developer.vimeo.com/
+ * @link    https://developer.vimeo.com/api/authentication
+ */
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+use OAuth\Common\Consumer\CredentialsInterface;
+use OAuth\Common\Http\Client\ClientInterface;
+use OAuth\Common\Storage\TokenStorageInterface;
+use OAuth\Common\Http\Uri\UriInterface;
+
+/**
+ * Vimeo service.
+ *
+ * @author  Pedro Amorim <contact@pamorim.fr>
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link    https://developer.vimeo.com/
+ * @link    https://developer.vimeo.com/api/authentication
+ */
+class Vimeo extends AbstractService
+{
+    // API version
+    const VERSION = '3.2';
+    // API Header Accept
+    const HEADER_ACCEPT = 'application/vnd.vimeo.*+json;version=3.2';
+
+    /**
+     * Scopes
+     * @see  https://developer.vimeo.com/api/authentication#scope
+     */
+    // View public videos
+    const SCOPE_PUBLIC    = 'public';
+    // View private videos
+    const SCOPE_PRIVATE   = 'private';
+    // View Vimeo On Demand purchase history
+    const SCOPE_PURCHASED = 'purchased';
+    // Create new videos, groups, albums, etc.
+    const SCOPE_CREATE    = 'create';
+    // Edit videos, groups, albums, etc.
+    const SCOPE_EDIT      = 'edit';
+    // Delete videos, groups, albums, etc.
+    const SCOPE_DELETE    = 'delete';
+    // Interact with a video on behalf of a user, such as liking
+    // a video or adding it to your watch later queue
+    const SCOPE_INTERACT  = 'interact';
+    // Upload a video
+    const SCOPE_UPLOAD    = 'upload';
+
+    public function __construct(
+        CredentialsInterface $credentials,
+        ClientInterface $httpClient,
+        TokenStorageInterface $storage,
+        $scopes = array(),
+        UriInterface $baseApiUri = null
+    ) {
+        parent::__construct(
+            $credentials,
+            $httpClient,
+            $storage,
+            $scopes,
+            $baseApiUri,
+            true
+        );
+
+        if (null === $baseApiUri) {
+            $this->baseApiUri = new Uri('https://api.vimeo.com/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://api.vimeo.com/oauth/authorize');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://api.vimeo.com/oauth/access_token');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error_description'])) {
+            throw new TokenResponseException(
+                'Error in retrieving token: "' . $data['error_description'] . '"'
+            );
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException(
+                'Error in retrieving token: "' . $data['error'] . '"'
+            );
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+
+        if (isset($data['expires_in'])) {
+            $token->setLifeTime($data['expires_in']);
+            unset($data['expires_in']);
+        }
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        unset($data['access_token']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getExtraOAuthHeaders()
+    {
+        return array('Accept' => self::HEADER_ACCEPT);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getExtraApiHeaders()
+    {
+        return array('Accept' => self::HEADER_ACCEPT);
+    }
+}
--- a/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Vkontakte.php
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Vkontakte.php
@@ -17,6 +17,7 @@ class Vkontakte extends AbstractService
      *
      * @link http://vk.com/dev/permissions
      */
+    const SCOPE_EMAIL         = 'email';
     const SCOPE_NOTIFY        = 'notify';
     const SCOPE_FRIENDS       = 'friends';
     const SCOPE_PHOTOS        = 'photos';
@@ -97,4 +98,12 @@ class Vkontakte extends AbstractService
 
         return $token;
     }
+    
+    /**
+     * {@inheritdoc}
+     */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_QUERY_STRING;
+    }
 }
--- /dev/null
+++ b/vendor/lusitanian/oauth/src/OAuth/OAuth2/Service/Yahoo.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace OAuth\OAuth2\Service;
+
+use OAuth\OAuth2\Token\StdOAuth2Token;
+use OAuth\Common\Http\Exception\TokenResponseException;
+use OAuth\Common\Http\Uri\Uri;
+
+class Yahoo extends AbstractService
+{
+
+    /**
+    * {@inheritdoc}
+    */
+    public function getAuthorizationEndpoint()
+    {
+        return new Uri('https://api.login.yahoo.com/oauth2/request_auth');
+    }
+
+    /**
+    * {@inheritdoc}
+    */
+    public function getAccessTokenEndpoint()
+    {
+        return new Uri('https://api.login.yahoo.com/oauth2/get_token');
+    }
+
+    /**
+    * {@inheritdoc}
+    */
+    protected function getAuthorizationMethod()
+    {
+        return static::AUTHORIZATION_METHOD_HEADER_BEARER;
+    }
+
+    /**
+    * {@inheritdoc}
+    */
+    protected function parseAccessTokenResponse($responseBody)
+    {
+        $data = json_decode($responseBody, true);
+
+        if (null === $data || !is_array($data)) {
+            throw new TokenResponseException('Unable to parse response.');
+        } elseif (isset($data['error'])) {
+            throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
+        }
+
+        $token = new StdOAuth2Token();
+        $token->setAccessToken($data['access_token']);
+        $token->setLifetime($data['expires_in']);
+
+        if (isset($data['refresh_token'])) {
+            $token->setRefreshToken($data['refresh_token']);
+            unset($data['refresh_token']);
+        }
+
+        unset($data['access_token']);
+        unset($data['expires_in']);
+
+        $token->setExtraParams($data);
+
+        return $token;
+    }
+
+    /**
+    * {@inheritdoc}
+    */
+    protected function getExtraOAuthHeaders()
+    {
+        $encodedCredentials = base64_encode(
+            $this->credentials->getConsumerId() . ':' . $this->credentials->getConsumerSecret()
+        );
+        return array('Authorization' => 'Basic ' . $encodedCredentials);
+    }
+}
--- a/vendor/lusitanian/oauth/src/OAuth/ServiceFactory.php
+++ b/vendor/lusitanian/oauth/src/OAuth/ServiceFactory.php
@@ -93,21 +93,21 @@ class ServiceFactory
      * It will first try to build an OAuth2 service and if none found it will try to build an OAuth1 service
      *
      * @param string                $serviceName Name of service to create
-     * @param Credentials           $credentials
+     * @param CredentialsInterface  $credentials
      * @param TokenStorageInterface $storage
      * @param array|null            $scopes      If creating an oauth2 service, array of scopes
      * @param UriInterface|null     $baseApiUri
+     * @param string                $apiVersion version of the api call
      *
      * @return ServiceInterface
-     *
-     * @throws Exception
      */
     public function createService(
         $serviceName,
         CredentialsInterface $credentials,
         TokenStorageInterface $storage,
         $scopes = array(),
-        UriInterface $baseApiUri = null
+        UriInterface $baseApiUri = null,
+        $apiVersion = ""
     ) {
         if (!$this->httpClient) {
             // for backwards compatibility.
@@ -118,7 +118,14 @@ class ServiceFactory
             $fullyQualifiedServiceName = $this->getFullyQualifiedServiceName($serviceName, $version);
 
             if (class_exists($fullyQualifiedServiceName)) {
-                return $this->$buildMethod($fullyQualifiedServiceName, $credentials, $storage, $scopes, $baseApiUri);
+                return $this->$buildMethod(
+                    $fullyQualifiedServiceName,
+                    $credentials,
+                    $storage,
+                    $scopes,
+                    $baseApiUri,
+                    $apiVersion
+                );
             }
         }
 
@@ -162,21 +169,23 @@ class ServiceFactory
         CredentialsInterface $credentials,
         TokenStorageInterface $storage,
         array $scopes,
-        UriInterface $baseApiUri = null
+        UriInterface $baseApiUri = null,
+        $apiVersion = ""
     ) {
         return new $serviceName(
             $credentials,
             $this->httpClient,
             $storage,
             $this->resolveScopes($serviceName, $scopes),
-            $baseApiUri
+            $baseApiUri,
+            $apiVersion
         );
     }
 
     /**
      * Resolves scopes for v2 services
      *
-     * @param $string $serviceName The fully qualified service name
+     * @param string  $serviceName The fully qualified service name
      * @param array   $scopes      List of scopes for the service
      *
      * @return array List of resolved scopes
@@ -206,6 +215,8 @@ class ServiceFactory
      * @param string                $serviceName The fully qualified service name
      * @param CredentialsInterface  $credentials
      * @param TokenStorageInterface $storage
+     * @param array                 $scopes
+     * @param UriInterface          $baseApiUri
      *
      * @return ServiceInterface
      *
--- /dev/null
+++ b/vendor/marc1706/fast-image-size/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Marc Alexander
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
--- /dev/null
+++ b/vendor/marc1706/fast-image-size/composer.json
@@ -0,0 +1,28 @@
+{
+  "name": "marc1706/fast-image-size",
+  "type": "library",
+  "description": "fast-image-size is a PHP library that does almost everything PHP's getimagesize() does but without the large overhead of downloading the complete file.",
+  "keywords": ["getimagesize", "fast", "PHP", "image", "size", "imagesize"],
+  "homepage": "https://www.m-a-styles.de",
+  "license": "MIT",
+  "authors": [
+    {
+      "name": "Marc Alexander",
+      "email": "admin@m-a-styles.de",
+      "homepage": "https://www.m-a-styles.de",
+      "role": "Developer"
+    }
+  ],
+  "require": {
+    "php": ">=5.3.0"
+  },
+  "require-dev": {
+    "phpunit/phpunit": "4.*"
+  },
+  "autoload": {
+    "psr-4": {
+      "FastImageSize\\": "lib",
+      "FastImageSize\\tests\\": "tests"
+    }
+  }
+}
--- /dev/null
+++ b/vendor/marc1706/fast-image-size/composer.lock
@@ -0,0 +1,971 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "hash": "c43a2d7770299d097c55b9ce3c48f0cc",
+    "packages": [],
+    "packages-dev": [
+        {
+            "name": "doctrine/instantiator",
+            "version": "1.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/instantiator.git",
+                "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+                "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3,<8.0-DEV"
+            },
+            "require-dev": {
+                "athletic/athletic": "~0.1.8",
+                "ext-pdo": "*",
+                "ext-phar": "*",
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "~2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com",
+                    "homepage": "http://ocramius.github.com/"
+                }
+            ],
+            "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+            "homepage": "https://github.com/doctrine/instantiator",
+            "keywords": [
+                "constructor",
+                "instantiate"
+            ],
+            "time": "2015-06-14 21:17:01"
+        },
+        {
+            "name": "phpdocumentor/reflection-docblock",
+            "version": "2.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+                "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8",
+                "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0"
+            },
+            "suggest": {
+                "dflydev/markdown": "~1.0",
+                "erusev/parsedown": "~1.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "phpDocumentor": [
+                        "src/"
+                    ]
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mike van Riel",
+                    "email": "mike.vanriel@naenius.com"
+                }
+            ],
+            "time": "2015-02-03 12:10:50"
+        },
+        {
+            "name": "phpspec/prophecy",
+            "version": "v1.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpspec/prophecy.git",
+                "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4745ded9307786b730d7a60df5cb5a6c43cf95f7",
+                "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/instantiator": "^1.0.2",
+                "phpdocumentor/reflection-docblock": "~2.0",
+                "sebastian/comparator": "~1.1"
+            },
+            "require-dev": {
+                "phpspec/phpspec": "~2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Prophecy\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com",
+                    "homepage": "http://everzet.com"
+                },
+                {
+                    "name": "Marcello Duarte",
+                    "email": "marcello.duarte@gmail.com"
+                }
+            ],
+            "description": "Highly opinionated mocking framework for PHP 5.3+",
+            "homepage": "https://github.com/phpspec/prophecy",
+            "keywords": [
+                "Double",
+                "Dummy",
+                "fake",
+                "mock",
+                "spy",
+                "stub"
+            ],
+            "time": "2015-08-13 10:07:40"
+        },
+        {
+            "name": "phpunit/php-code-coverage",
+            "version": "2.2.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+                "reference": "2d7c03c0e4e080901b8f33b2897b0577be18a13c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2d7c03c0e4e080901b8f33b2897b0577be18a13c",
+                "reference": "2d7c03c0e4e080901b8f33b2897b0577be18a13c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "phpunit/php-file-iterator": "~1.3",
+                "phpunit/php-text-template": "~1.2",
+                "phpunit/php-token-stream": "~1.3",
+                "sebastian/environment": "^1.3.2",
+                "sebastian/version": "~1.0"
+            },
+            "require-dev": {
+                "ext-xdebug": ">=2.1.4",
+                "phpunit/phpunit": "~4"
+            },
+            "suggest": {
+                "ext-dom": "*",
+                "ext-xdebug": ">=2.2.1",
+                "ext-xmlwriter": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.2.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+            "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+            "keywords": [
+                "coverage",
+                "testing",
+                "xunit"
+            ],
+            "time": "2015-08-04 03:42:39"
+        },
+        {
+            "name": "phpunit/php-file-iterator",
+            "version": "1.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+                "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+                "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+            "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+            "keywords": [
+                "filesystem",
+                "iterator"
+            ],
+            "time": "2015-06-21 13:08:43"
+        },
+        {
+            "name": "phpunit/php-text-template",
+            "version": "1.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-text-template.git",
+                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Simple template engine.",
+            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+            "keywords": [
+                "template"
+            ],
+            "time": "2015-06-21 13:50:34"
+        },
+        {
+            "name": "phpunit/php-timer",
+            "version": "1.0.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-timer.git",
+                "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b",
+                "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Utility class for timing",
+            "homepage": "https://github.com/sebastianbergmann/php-timer/",
+            "keywords": [
+                "timer"
+            ],
+            "time": "2015-06-21 08:01:12"
+        },
+        {
+            "name": "phpunit/php-token-stream",
+            "version": "1.4.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+                "reference": "3ab72c62e550370a6cd5dc873e1a04ab57562f5b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3ab72c62e550370a6cd5dc873e1a04ab57562f5b",
+                "reference": "3ab72c62e550370a6cd5dc873e1a04ab57562f5b",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Wrapper around PHP's tokenizer extension.",
+            "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+            "keywords": [
+                "tokenizer"
+            ],
+            "time": "2015-08-16 08:51:00"
+        },
+        {
+            "name": "phpunit/phpunit",
+            "version": "4.8.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit.git",
+                "reference": "9b7417edaf28059ea63d86be941e6004dbfcc0cc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9b7417edaf28059ea63d86be941e6004dbfcc0cc",
+                "reference": "9b7417edaf28059ea63d86be941e6004dbfcc0cc",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-json": "*",
+                "ext-pcre": "*",
+                "ext-reflection": "*",
+                "ext-spl": "*",
+                "php": ">=5.3.3",
+                "phpspec/prophecy": "^1.3.1",
+                "phpunit/php-code-coverage": "~2.1",
+                "phpunit/php-file-iterator": "~1.4",
+                "phpunit/php-text-template": "~1.2",
+                "phpunit/php-timer": ">=1.0.6",
+                "phpunit/phpunit-mock-objects": "~2.3",
+                "sebastian/comparator": "~1.1",
+                "sebastian/diff": "~1.2",
+                "sebastian/environment": "~1.3",
+                "sebastian/exporter": "~1.2",
+                "sebastian/global-state": "~1.0",
+                "sebastian/version": "~1.0",
+                "symfony/yaml": "~2.1|~3.0"
+            },
+            "suggest": {
+                "phpunit/php-invoker": "~1.1"
+            },
+            "bin": [
+                "phpunit"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.8.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "The PHP Unit Testing framework.",
+            "homepage": "https://phpunit.de/",
+            "keywords": [
+                "phpunit",
+                "testing",
+                "xunit"
+            ],
+            "time": "2015-08-19 09:20:57"
+        },
+        {
+            "name": "phpunit/phpunit-mock-objects",
+            "version": "2.3.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+                "reference": "5e2645ad49d196e020b85598d7c97e482725786a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/5e2645ad49d196e020b85598d7c97e482725786a",
+                "reference": "5e2645ad49d196e020b85598d7c97e482725786a",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/instantiator": "^1.0.2",
+                "php": ">=5.3.3",
+                "phpunit/php-text-template": "~1.2",
+                "sebastian/exporter": "~1.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4"
+            },
+            "suggest": {
+                "ext-soap": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.3.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Mock Object library for PHPUnit",
+            "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+            "keywords": [
+                "mock",
+                "xunit"
+            ],
+            "time": "2015-08-19 09:14:08"
+        },
+        {
+            "name": "sebastian/comparator",
+            "version": "1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/comparator.git",
+                "reference": "937efb279bd37a375bcadf584dec0726f84dbf22"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22",
+                "reference": "937efb279bd37a375bcadf584dec0726f84dbf22",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "sebastian/diff": "~1.2",
+                "sebastian/exporter": "~1.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "github@wallbash.com"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@2bepublished.at"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Provides the functionality to compare PHP values for equality",
+            "homepage": "http://www.github.com/sebastianbergmann/comparator",
+            "keywords": [
+                "comparator",
+                "compare",
+                "equality"
+            ],
+            "time": "2015-07-26 15:48:44"
+        },
+        {
+            "name": "sebastian/diff",
+            "version": "1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/diff.git",
+                "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3",
+                "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Kore Nordmann",
+                    "email": "mail@kore-nordmann.de"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Diff implementation",
+            "homepage": "http://www.github.com/sebastianbergmann/diff",
+            "keywords": [
+                "diff"
+            ],
+            "time": "2015-02-22 15:13:53"
+        },
+        {
+            "name": "sebastian/environment",
+            "version": "1.3.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/environment.git",
+                "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6324c907ce7a52478eeeaede764f48733ef5ae44",
+                "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Provides functionality to handle HHVM/PHP environments",
+            "homepage": "http://www.github.com/sebastianbergmann/environment",
+            "keywords": [
+                "Xdebug",
+                "environment",
+                "hhvm"
+            ],
+            "time": "2015-08-03 06:14:51"
+        },
+        {
+            "name": "sebastian/exporter",
+            "version": "1.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/exporter.git",
+                "reference": "7ae5513327cb536431847bcc0c10edba2701064e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e",
+                "reference": "7ae5513327cb536431847bcc0c10edba2701064e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "sebastian/recursion-context": "~1.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "github@wallbash.com"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@2bepublished.at"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "aharvey@php.net"
+                }
+            ],
+            "description": "Provides the functionality to export PHP variables for visualization",
+            "homepage": "http://www.github.com/sebastianbergmann/exporter",
+            "keywords": [
+                "export",
+                "exporter"
+            ],
+            "time": "2015-06-21 07:55:53"
+        },
+        {
+            "name": "sebastian/global-state",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/global-state.git",
+                "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01",
+                "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.2"
+            },
+            "suggest": {
+                "ext-uopz": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Snapshotting of global state",
+            "homepage": "http://www.github.com/sebastianbergmann/global-state",
+            "keywords": [
+                "global state"
+            ],
+            "time": "2014-10-06 09:23:50"
+        },
+        {
+            "name": "sebastian/recursion-context",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/recursion-context.git",
+                "reference": "994d4a811bafe801fb06dccbee797863ba2792ba"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/994d4a811bafe801fb06dccbee797863ba2792ba",
+                "reference": "994d4a811bafe801fb06dccbee797863ba2792ba",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "aharvey@php.net"
+                }
+            ],
+            "description": "Provides functionality to recursively process PHP variables",
+            "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+            "time": "2015-06-21 08:04:50"
+        },
+        {
+            "name": "sebastian/version",
+            "version": "1.0.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/version.git",
+                "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+                "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+                "shasum": ""
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+            "homepage": "https://github.com/sebastianbergmann/version",
+            "time": "2015-06-21 13:59:46"
+        },
+        {
+            "name": "symfony/yaml",
+            "version": "v2.7.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Yaml.git",
+                "reference": "71340e996171474a53f3d29111d046be4ad8a0ff"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Yaml/zipball/71340e996171474a53f3d29111d046be4ad8a0ff",
+                "reference": "71340e996171474a53f3d29111d046be4ad8a0ff",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "~2.7"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Yaml\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Yaml Component",
+            "homepage": "https://symfony.com",
+            "time": "2015-07-28 14:07:07"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">=5.3.0"
+    },
+    "platform-dev": []
+}
--- /dev/null
+++ b/vendor/marc1706/fast-image-size/lib/FastImageSize.php
@@ -0,0 +1,225 @@
+<?php
+
+/**
+ * fast-image-size base class
+ * @package fast-image-size
+ * @copyright (c) Marc Alexander <admin@m-a-styles.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FastImageSize;
+
+class FastImageSize
+{
+	/** @var array Size info that is returned */
+	protected $size = array();
+
+	/** @var string Data retrieved from remote */
+	protected $data = '';
+
+	/** @var array List of supported image types and associated image types */
+	protected $supportedTypes = array(
+		'png'	=> array('png'),
+		'gif'	=> array('gif'),
+		'jpeg'	=> array(
+				'jpeg',
+				'jpg',
+				'jpe',
+				'jif',
+				'jfif',
+				'jfi',
+			),
+		'jp2'	=> array(
+				'jp2',
+				'j2k',
+				'jpf',
+				'jpg2',
+				'jpx',
+				'jpm',
+			),
+		'psd'	=> array(
+				'psd',
+				'photoshop',
+			),
+		'bmp'	=> array('bmp'),
+		'tif'	=> array(
+				'tif',
+				'tiff',
+			),
+		'wbmp'	=> array(
+				'wbm',
+				'wbmp',
+				'vnd.wap.wbmp',
+			),
+		'iff'	=> array(
+				'iff',
+				'x-iff',
+		),
+		'ico'	=> array(
+				'ico',
+				'vnd.microsoft.icon',
+				'x-icon',
+				'icon',
+		),
+	);
+
+	/** @var array Class map that links image extensions/mime types to class */
+	protected $classMap;
+
+	/** @var array An array containing the classes of supported image types */
+	protected $type;
+
+	/**
+	 * Constructor for fastImageSize class
+	 */
+	public function __construct()
+	{
+		foreach ($this->supportedTypes as $imageType => $extension)
+		{
+			$className = '\FastImageSize\Type\Type' . mb_convert_case(mb_strtolower($imageType), MB_CASE_TITLE);
+			$this->type[$imageType] = new $className($this);
+
+			// Create class map
+			foreach ($extension as $ext)
+			{
+				/** @var Type\TypeInterface */
+				$this->classMap[$ext] = $this->type[$imageType];
+			}
+		}
+	}
+
+	/**
+	 * Get image dimensions of supplied image
+	 *
+	 * @param string $file Path to image that should be checked
+	 * @param string $type Mimetype of image
+	 * @return array|bool Array with image dimensions if successful, false if not
+	 */
+	public function getImageSize($file, $type = '')
+	{
+		// Reset values
+		$this->resetValues();
+
+		// Treat image type as unknown if extension or mime type is unknown
+		if (!preg_match('/\.([a-z0-9]+)$/i', $file, $match) && empty($type))
+		{
+			$this->getImagesizeUnknownType($file);
+		}
+		else
+		{
+			$extension = (isset($match[1])) ? $match[1] : preg_replace('/.+\/([a-z0-9-.]+)$/i', '$1', $type);
+
+			$this->getImageSizeByExtension($file, $extension);
+		}
+
+		return sizeof($this->size) > 1 ? $this->size : false;
+	}
+
+	/**
+	 * Get dimensions of image if type is unknown
+	 *
+	 * @param string $filename Path to file
+	 */
+	protected function getImagesizeUnknownType($filename)
+	{
+		// Grab the maximum amount of bytes we might need
+		$data = $this->getImage($filename, 0, Type\TypeJpeg::JPEG_MAX_HEADER_SIZE, false);
+
+		if ($data !== false)
+		{
+			foreach ($this->type as $imageType)
+			{
+				$imageType->getSize($filename);
+
+				if (sizeof($this->size) > 1)
+				{
+					break;
+				}
+			}
+		}
+	}
+
+	/**
+	 * Get image size by file extension
+	 *
+	 * @param string $file Path to image that should be checked
+	 * @param string $extension Extension/type of image
+	 */
+	protected function getImageSizeByExtension($file, $extension)
+	{
+		$extension = strtolower($extension);
+		if (isset($this->classMap[$extension]))
+		{
+			$this->classMap[$extension]->getSize($file);
+		}
+	}
+
+	/**
+	 * Reset values to default
+	 */
+	protected function resetValues()
+	{
+		$this->size = array();
+		$this->data = '';
+	}
+
+	/**
+	 * Set mime type based on supplied image
+	 *
+	 * @param int $type Type of image
+	 */
+	public function setImageType($type)
+	{
+		$this->size['type'] = $type;
+	}
+
+	/**
+	 * Set size info
+	 *
+	 * @param array $size Array containing size info for image
+	 */
+	public function setSize($size)
+	{
+		$this->size = $size;
+	}
+
+	/**
+	 * Get image from specified path/source
+	 *
+	 * @param string $filename Path to image
+	 * @param int $offset Offset at which reading of the image should start
+	 * @param int $length Maximum length that should be read
+	 * @param bool $forceLength True if the length needs to be the specified
+	 *			length, false if not. Default: true
+	 *
+	 * @return false|string Image data or false if result was empty
+	 */
+	public function getImage($filename, $offset, $length, $forceLength = true)
+	{
+		if (empty($this->data))
+		{
+			$this->data = @file_get_contents($filename, null, null, $offset, $length);
+		}
+
+		// Force length to expected one. Return false if data length
+		// is smaller than expected length
+		if ($forceLength === true)
+		{
+			return (strlen($this->data) < $length) ? false : substr($this->data, $offset, $length) ;
+		}
+
+		return empty($this->data) ? false : $this->data;
+	}
+
+	/**
+	 * Get return data
+	 *
+	 * @return array|bool Size array if dimensions could be found, false if not
+	 */
+	protected function getReturnData()
+	{
+		return sizeof($this->size) > 1 ? $this->size : false;
+	}
+}
--- /dev/null
+++ b/vendor/marc1706/fast-image-size/lib/Type/TypeBase.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * fast-image-size image type base
+ * @package fast-image-size
+ * @copyright (c) Marc Alexander <admin@m-a-styles.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FastImageSize\Type;
+
+use \FastImageSize\FastImageSize;
+
+abstract class TypeBase implements TypeInterface
+{
+	/** @var FastImageSize */
+	protected $fastImageSize;
+
+	/**
+	 * Base constructor for image types
+	 *
+	 * @param FastImageSize $fastImageSize
+	 */
+	public function __construct(FastImageSize $fastImageSize)
+	{
+		$this->fastImageSize = $fastImageSize;
+	}
+}
--- /dev/null
+++ b/vendor/marc1706/fast-image-size/lib/Type/TypeBmp.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * fast-image-size image type bmp
+ * @package fast-image-size
+ * @copyright (c) Marc Alexander <admin@m-a-styles.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FastImageSize\Type;
+
+class TypeBmp extends TypeBase
+{
+	/** @var int BMP header size needed for retrieving dimensions */
+	const BMP_HEADER_SIZE = 26;
+
+	/** @var string BMP signature */
+	const BMP_SIGNATURE = "\x42\x4D";
+
+	/** qvar int BMP dimensions offset */
+	const BMP_DIMENSIONS_OFFSET = 18;
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function getSize($filename)
+	{
+		$data = $this->fastImageSize->getImage($filename, 0, self::BMP_HEADER_SIZE);
+
+		// Check if supplied file is a BMP file
+		if (substr($data, 0, 2) !== self::BMP_SIGNATURE)
+		{
+			return;
+		}
+
+		$size = unpack('lwidth/lheight', substr($data, self::BMP_DIMENSIONS_OFFSET, 2 * self::LONG_SIZE));
+
+		$this->fastImageSize->setSize($size);
+		$this->fastImageSize->setImageType(IMAGETYPE_BMP);
+	}
+}
--- /dev/null
+++ b/vendor/marc1706/fast-image-size/lib/Type/TypeGif.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * fast-image-size image type gif
+ * @package fast-image-size
+ * @copyright (c) Marc Alexander <admin@m-a-styles.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FastImageSize\Type;
+
+class TypeGif extends TypeBase
+{
+	/** @var string GIF87a header */
+	const GIF87A_HEADER = "\x47\x49\x46\x38\x37\x61";
+
+	/** @var string GIF89a header */
+	const GIF89A_HEADER = "\x47\x49\x46\x38\x39\x61";
+
+	/** @var int GIF header size */
+	const GIF_HEADER_SIZE = 6;
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function getSize($filename)
+	{
+		// Get data needed for reading image dimensions as outlined by GIF87a
+		// and GIF89a specifications
+		$data = $this->fastImageSize->getImage($filename, 0, self::GIF_HEADER_SIZE + self::SHORT_SIZE * 2);
+
+		$type = substr($data, 0, self::GIF_HEADER_SIZE);
+		if ($type !== self::GIF87A_HEADER && $type !== self::GIF89A_HEADER)
+		{
+			return;
+		}
+
+		$size = unpack('vwidth/vheight', substr($data, self::GIF_HEADER_SIZE, self::SHORT_SIZE * 2));
+
+		$this->fastImageSize->setSize($size);
+		$this->fastImageSize->setImageType(IMAGETYPE_GIF);
+	}
+}
--- /dev/null
+++ b/vendor/marc1706/fast-image-size/lib/Type/TypeIco.php
@@ -0,0 +1,62 @@
+<?php
+
+/**
+ * fast-image-size image type ico
+ * @package fast-image-size
+ * @copyright (c) Marc Alexander <admin@m-a-styles.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FastImageSize\Type;
+
+class TypeIco extends TypeBase
+{
+	/** @var string ICO reserved field */
+	const ICO_RESERVED = 0;
+
+	/** @var int ICO type field */
+	const ICO_TYPE = 1;
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function getSize($filename)
+	{
+		// Retrieve image data for ICO header and header of first entry.
+		// We assume the first entry to have the same size as the other ones.
+		$data = $this->fastImageSize->getImage($filename, 0, 2 * self::LONG_SIZE);
+
+		if ($data === false)
+		{
+			return;
+		}
+
+		// Check if header fits expected format
+		if (!$this->isValidIco($data))
+		{
+			return;
+		}
+
+		$size = unpack('Cwidth/Cheight', substr($data, self::LONG_SIZE + self::SHORT_SIZE, self::SHORT_SIZE));
+
+		$this->fastImageSize->setSize($size);
+		$this->fastImageSize->setImageType(IMAGETYPE_ICO);
+	}
+
+	/**
+	 * Return whether image is a valid ICO file
+	 *
+	 * @param string $data Image data string
+	 *
+	 * @return bool True if file is a valid ICO file, false if not
+	 */
+	protected function isValidIco($data)
+	{
+		// Get header
+		$header = unpack('vreserved/vtype/vimages', $data);
+
+		return $header['reserved'] === self::ICO_RESERVED && $header['type'] === self::ICO_TYPE && $header['images'] > 0 && $header['images'] <= 255;
+	}
+}
--- /dev/null
+++ b/vendor/marc1706/fast-image-size/lib/Type/TypeIff.php
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * fast-image-size image type iff
+ * @package fast-image-size
+ * @copyright (c) Marc Alexander <admin@m-a-styles.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FastImageSize\Type;
+
+class TypeIff extends TypeBase
+{
+	/** @var int IFF header size. Grab more than what should be needed to make
+	 * sure we have the necessary data */
+	const IFF_HEADER_SIZE = 32;
+
+	/** @var string IFF header for Amiga type */
+	const IFF_HEADER_AMIGA = 'FORM';
+
+	/** @var string IFF header for Maya type */
+	const IFF_HEADER_MAYA = 'FOR4';
+
+	/** @var string IFF BTMHD for Amiga type */
+	const IFF_AMIGA_BTMHD = 'BMHD';
+
+	/** @var string IFF BTMHD for Maya type */
+	const IFF_MAYA_BTMHD = 'BHD';
+
+	/** @var string PHP pack format for unsigned short */
+	const PACK_UNSIGNED_SHORT = 'n';
+
+	/** @var string PHP pack format for unsigned long */
+	const PACK_UNSIGNED_LONG = 'N';
+
+	/** @var string BTMHD of current image */
+	protected $btmhd;
+
+	/** @var int Size of current BTMHD */
+	protected $btmhdSize;
+
+	/** @var string Current byte type */
+	protected $byteType;
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function getSize($filename)
+	{
+		$data = $this->fastImageSize->getImage($filename, 0, self::IFF_HEADER_SIZE);
+
+		$signature = $this->getIffSignature($data);
+
+		// Check if image is IFF
+		if ($signature === false)
+		{
+			return;
+		}
+
+		// Set type constraints
+		$this->setTypeConstraints($signature);
+
+		// Get size from data
+		$btmhdPosition = strpos($data, $this->btmhd);
+		$size = unpack("{$this->byteType}width/{$this->byteType}height", substr($data, $btmhdPosition + self::LONG_SIZE + strlen($this->btmhd), $this->btmhdSize));
+
+		$this->fastImageSize->setSize($size);
+		$this->fastImageSize->setImageType(IMAGETYPE_IFF);
+	}
+
+	/**
+	 * Get IFF signature from data string
+	 *
+	 * @param string|bool $data Image data string
+	 *
+	 * @return false|string Signature if file is a valid IFF file, false if not
+	 */
+	protected function getIffSignature($data)
+	{
+		$signature = substr($data, 0, self::LONG_SIZE);
+
+		// Check if image is IFF
+		if ($signature !== self::IFF_HEADER_AMIGA && $signature !== self::IFF_HEADER_MAYA)
+		{
+			return false;
+		}
+		else
+		{
+			return $signature;
+		}
+	}
+
+	/**
+	 * Set type constraints for current image
+	 *
+	 * @param string $signature IFF signature of image
+	 */
+	protected function setTypeConstraints($signature)
+	{
+		// Amiga version of IFF
+		if ($signature === 'FORM')
+		{
+			$this->btmhd = self::IFF_AMIGA_BTMHD;
+			$this->btmhdSize = self::LONG_SIZE;
+			$this->byteType = self::PACK_UNSIGNED_SHORT;
+		}
+		// Maya version
+		else
+		{
+			$this->btmhd = self::IFF_MAYA_BTMHD;
+			$this->btmhdSize = self::LONG_SIZE * 2;
+			$this->byteType = self::PACK_UNSIGNED_LONG;
+		}
+	}
+}
--- /dev/null
+++ b/vendor/marc1706/fast-image-size/lib/Type/TypeInterface.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * fast-image-size image type interface
+ * @package fast-image-size
+ * @copyright (c) Marc Alexander <admin@m-a-styles.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FastImageSize\Type;
+
+interface TypeInterface
+{
+	/** @var int 4-byte long size */
+	const LONG_SIZE = 4;
+
+	/** @var int 2-byte short size */
+	const SHORT_SIZE = 2;
+
+	/**
+	 * Get size of supplied image
+	 *
+	 * @param string $filename File name of image
+	 *
+	 * @return null
+	 */
+	public function getSize($filename);
+}
--- /dev/null
+++ b/vendor/marc1706/fast-image-size/lib/Type/TypeJp2.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * fast-image-size image type jpeg 2000
+ * @package fast-image-size
+ * @copyright (c) Marc Alexander <admin@m-a-styles.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FastImageSize\Type;
+
+class TypeJp2 extends TypeBase
+{
+	/** @var string JPEG 2000 signature */
+	const JPEG_2000_SIGNATURE = "\x00\x00\x00\x0C\x6A\x50\x20\x20\x0D\x0A\x87\x0A";
+
+	/** @var string JPEG 2000 SOC marker */
+	const JPEG_2000_SOC_MARKER = "\xFF\x4F";
+
+	/** @var string JPEG 2000 SIZ marker */
+	const JPEG_2000_SIZ_MARKER = "\xFF\x51";
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function getSize($filename)
+	{
+		$data = $this->fastImageSize->getImage($filename, 0, TypeJpeg::JPEG_MAX_HEADER_SIZE, false);
+
+		// Check if file is jpeg 2000
+		if (substr($data, 0, strlen(self::JPEG_2000_SIGNATURE)) !== self::JPEG_2000_SIGNATURE)
+		{
+			return;
+		}
+
+		// Get SOC position before starting to search for SIZ.
+		// Make sure we do not get SIZ before SOC by cutting at SOC.
+		$data = substr($data, strpos($data, self::JPEG_2000_SOC_MARKER));
+
+		// Remove SIZ and everything before
+		$data = substr($data, strpos($data, self::JPEG_2000_SIZ_MARKER) + self::SHORT_SIZE);
+
+		// Acquire size info from data
+		$size = unpack('Nwidth/Nheight', substr($data, self::LONG_SIZE, self::LONG_SIZE * 2));
+
+		$this->fastImageSize->setSize($size);
+		$this->fastImageSize->setImageType(IMAGETYPE_JPEG2000);
+	}
+}
--- /dev/null
+++ b/vendor/marc1706/fast-image-size/lib/Type/TypeJpeg.php
@@ -0,0 +1,212 @@
+<?php
+
+/**
+ * fast-image-size image type jpeg
+ * @package fast-image-size
+ * @copyright (c) Marc Alexander <admin@m-a-styles.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FastImageSize\Type;
+
+class TypeJpeg extends TypeBase
+{
+	/** @var int JPEG max header size. Headers can be bigger, but we'll abort
+	 *			going through the header after this */
+	const JPEG_MAX_HEADER_SIZE = 124576;
+
+	/** @var string JPEG header */
+	const JPEG_HEADER = "\xFF\xD8";
+
+	/** @var string Start of frame marker */
+	const SOF_START_MARKER = "\xFF";
+
+	/** @var array JPEG SOF markers */
+	protected $sofMarkers = array(
+		"\xC0",
+		"\xC1",
+		"\xC2",
+		"\xC3",
+		"\xC5",
+		"\xC6",
+		"\xC7",
+		"\xC8",
+		"\xC9",
+		"\xCA",
+		"\xCB",
+		"\xCD",
+		"\xCE",
+		"\xCF"
+	);
+
+	/** @var array JPEG APP markers */
+	protected $appMarkers = array(
+		"\xE0",
+		"\xE1",
+		"\xE2",
+		"\xE3",
+		"\xEC",
+		"\xED",
+		"\xEE",
+	);
+
+	/** @var string|bool $data JPEG data stream */
+	protected $data = '';
+
+	/** @var bool Flag whether exif was found */
+	protected $foundExif = false;
+
+	/** @var bool Flag whether xmp was found */
+	protected $foundXmp = false;
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function getSize($filename)
+	{
+		// Do not force the data length
+		$this->data = $this->fastImageSize->getImage($filename, 0, self::JPEG_MAX_HEADER_SIZE, false);
+
+		// Check if file is jpeg
+		if ($this->data === false || substr($this->data, 0, self::SHORT_SIZE) !== self::JPEG_HEADER)
+		{
+			return;
+		}
+
+		// Look through file for SOF marker
+		$size = $this->getSizeInfo();
+
+		$this->fastImageSize->setSize($size);
+		$this->fastImageSize->setImageType(IMAGETYPE_JPEG);
+	}
+
+	/**
+	 * Return if current data point is an SOF marker
+	 *
+	 * @param string $firstByte First byte to check
+	 * @param string $secondByte Second byte to check
+	 *
+	 * @return bool True if current data point is SOF marker, false if not
+	 */
+	protected function isSofMarker($firstByte, $secondByte)
+	{
+		return $firstByte === self::SOF_START_MARKER && in_array($secondByte, $this->sofMarkers);
+	}
+
+	/**
+	 * Return if current data point is an APP marker
+	 *
+	 * @param string $firstByte First byte to check
+	 * @param string $secondByte Second byte to check
+	 *
+	 * @return bool True if current data point is APP marker, false if not
+	 */
+	protected function isAppMarker($firstByte, $secondByte)
+	{
+		return $firstByte === self::SOF_START_MARKER && in_array($secondByte, $this->appMarkers);
+	}
+
+	/**
+	 * Return if current data point is a valid APP1 marker (EXIF or XMP)
+	 *
+	 * @param string $firstByte First byte to check
+	 * @param string $secondByte Second byte to check
+	 *
+	 * @return bool True if current data point is valid APP1 marker, false if not
+	 */
+	protected function isApp1Marker($firstByte, $secondByte)
+	{
+		return (!$this->foundExif || !$this->foundXmp) && $firstByte === self::SOF_START_MARKER && $secondByte === $this->appMarkers[1];
+	}
+
+	/**
+	 * Get size info from image data
+	 *
+	 * @return array An array with the image's size info or an empty array if
+	 *		size info couldn't be found
+	 */
+	protected function getSizeInfo()
+	{
+		$size = array();
+		// since we check $i + 1 we need to stop one step earlier
+		$dataLength = strlen($this->data) - 1;
+		$this->foundExif = $this->foundXmp = false;
+
+		// Look through file for SOF marker
+		for ($i = 0; $i < $dataLength; $i++)
+		{
+			// Only look for EXIF and XMP app marker once, other types more often
+			if (!$this->checkForAppMarker($dataLength, $i))
+			{
+				break;
+			}
+
+			if ($this->isSofMarker($this->data[$i], $this->data[$i + 1]))
+			{
+				// Extract size info from SOF marker
+				list(, $unpacked) = unpack("H*", substr($this->data, $i + self::LONG_SIZE + 1, self::LONG_SIZE));
+
+				// Get width and height from unpacked size info
+				$size = array(
+					'width'		=> hexdec(substr($unpacked, 4, 4)),
+					'height'	=> hexdec(substr($unpacked, 0, 4)),
+				);
+
+				break;
+			}
+		}
+
+		return $size;
+	}
+
+	/**
+	 * Check for APP marker in data
+	 *
+	 * @param int $dataLength Length of input data
+	 * @param int $index Current data index
+	 *
+	 * @return bool True if searching through data should be continued, false if not
+	 */
+	protected function checkForAppMarker($dataLength, &$index)
+	{
+		if ($this->isApp1Marker($this->data[$index], $this->data[$index + 1]) || $this->isAppMarker($this->data[$index], $this->data[$index + 1]))
+		{
+			// Extract length from APP marker
+			list(, $unpacked) = unpack("H*", substr($this->data, $index + self::SHORT_SIZE, 2));
+
+			$length = hexdec(substr($unpacked, 0, 4));
+
+			$this->setApp1Flags($this->data[$index + 1]);
+
+			// Skip over length of APP header
+			$index += (int) $length;
+
+			// Make sure we don't exceed the data length
+			if ($index >= $dataLength)
+			{
+				return false;
+			}
+		}
+
+		return true;
+	}
+
+	/**
+	 * Set APP1 flags for specified data point
+	 *
+	 * @param string $data Data point
+	 */
+	protected function setApp1Flags($data)
+	{
+		if (!$this->foundExif)
+		{
+			$this->foundExif = $data === $this->appMarkers[1];
+		}
+		else if (!$this->foundXmp)
+		{
+			$this->foundXmp = $data === $this->appMarkers[1];
+		}
+	}
+}
--- /dev/null
+++ b/vendor/marc1706/fast-image-size/lib/Type/TypePng.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * fast-image-size image type png
+ * @package fast-image-size
+ * @copyright (c) Marc Alexander <admin@m-a-styles.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FastImageSize\Type;
+
+class TypePng extends TypeBase
+{
+	/** @var string PNG header */
+	const PNG_HEADER = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a";
+
+	/** @var int PNG IHDR offset */
+	const PNG_IHDR_OFFSET = 12;
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function getSize($filename)
+	{
+		// Retrieve image data including the header, the IHDR tag, and the
+		// following 2 chunks for the image width and height
+		$data = $this->fastImageSize->getImage($filename, 0, self::PNG_IHDR_OFFSET + 3 * self::LONG_SIZE);
+
+		// Check if header fits expected format specified by RFC 2083
+		if (substr($data, 0, self::PNG_IHDR_OFFSET - self::LONG_SIZE) !== self::PNG_HEADER || substr($data, self::PNG_IHDR_OFFSET, self::LONG_SIZE) !== 'IHDR')
+		{
+			return;
+		}
+
+		$size = unpack('Nwidth/Nheight', substr($data, self::PNG_IHDR_OFFSET + self::LONG_SIZE, self::LONG_SIZE * 2));
+
+		$this->fastImageSize->setSize($size);
+		$this->fastImageSize->setImageType(IMAGETYPE_PNG);
+	}
+}
--- /dev/null
+++ b/vendor/marc1706/fast-image-size/lib/Type/TypePsd.php
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * fast-image-size image type psd
+ * @package fast-image-size
+ * @copyright (c) Marc Alexander <admin@m-a-styles.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FastImageSize\Type;
+
+class TypePsd extends TypeBase
+{
+	/** @var string PSD signature */
+	const PSD_SIGNATURE = "8BPS";
+
+	/** @var int PSD header size */
+	const PSD_HEADER_SIZE = 22;
+
+	/** @var int PSD dimensions info offset */
+	const PSD_DIMENSIONS_OFFSET = 14;
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function getSize($filename)
+	{
+		$data = $this->fastImageSize->getImage($filename, 0, self::PSD_HEADER_SIZE);
+
+		if ($data === false)
+		{
+			return;
+		}
+
+		// Offset for version info is length of header but version is only a
+		// 16-bit unsigned value
+		$version = unpack('n', substr($data, self::LONG_SIZE, 2));
+
+		// Check if supplied file is a PSD file
+		if (!$this->validPsd($data, $version))
+		{
+			return;
+		}
+
+		$size = unpack('Nheight/Nwidth', substr($data, self::PSD_DIMENSIONS_OFFSET, 2 * self::LONG_SIZE));
+
+		$this->fastImageSize->setSize($size);
+		$this->fastImageSize->setImageType(IMAGETYPE_PSD);
+	}
+
+	/**
+	 * Return whether file is a valid PSD file
+	 *
+	 * @param string $data Image data string
+	 * @param array $version Version array
+	 *
+	 * @return bool True if image is a valid PSD file, false if not
+	 */
+	protected function validPsd($data, $version)
+	{
+		return substr($data, 0, self::LONG_SIZE) === self::PSD_SIGNATURE && $version[1] === 1;
+	}
+}
--- /dev/null
+++ b/vendor/marc1706/fast-image-size/lib/Type/TypeTif.php
@@ -0,0 +1,140 @@
+<?php
+
+/**
+ * fast-image-size image type tif
+ * @package fast-image-size
+ * @copyright (c) Marc Alexander <admin@m-a-styles.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FastImageSize\Type;
+
+class TypeTif extends TypeBase
+{
+	/** @var int TIF header size. The header might be larger but the dimensions
+	 *			should be in the first 512 bytes */
+	const TIF_HEADER_SIZE = 512;
+
+	/** @var int TIF tag for image height */
+	const TIF_TAG_IMAGE_HEIGHT = 257;
+
+	/** @var int TIF tag for image width */
+	const TIF_TAG_IMAGE_WIDTH = 256;
+
+	/** @var int TIF tag type for short */
+	const TIF_TAG_TYPE_SHORT = 3;
+
+	/** @var int TIF IFD entry size */
+	const TIF_IFD_ENTRY_SIZE = 12;
+
+	/** @var string TIF signature of intel type */
+	const TIF_SIGNATURE_INTEL = 'II';
+
+	/** @var string TIF signature of motorola type */
+	const TIF_SIGNATURE_MOTOROLA = 'MM';
+
+	/** @var array Size info array */
+	protected $size;
+
+	/** @var string Bit type of long field */
+	protected $typeLong;
+
+	/** @var string Bit type of short field */
+	protected $typeShort;
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function getSize($filename)
+	{
+		// Do not force length of header
+		$data = $this->fastImageSize->getImage($filename, 0, self::TIF_HEADER_SIZE, false);
+
+		$this->size = array();
+
+		$signature = substr($data, 0, self::SHORT_SIZE);
+
+		if (!in_array($signature, array(self::TIF_SIGNATURE_INTEL, self::TIF_SIGNATURE_MOTOROLA)))
+		{
+			return;
+		}
+
+		// Set byte type
+		$this->setByteType($signature);
+
+		// Get offset of IFD
+		list(, $offset) = unpack($this->typeLong, substr($data, self::LONG_SIZE, self::LONG_SIZE));
+
+		// Get size of IFD
+		list(, $sizeIfd) = unpack($this->typeShort, substr($data, $offset, self::SHORT_SIZE));
+
+		// Skip 2 bytes that define the IFD size
+		$offset += self::SHORT_SIZE;
+
+		// Filter through IFD
+		for ($i = 0; $i < $sizeIfd; $i++)
+		{
+			// Get IFD tag
+			$type = unpack($this->typeShort, substr($data, $offset, self::SHORT_SIZE));
+
+			// Get field type of tag
+			$fieldType = unpack($this->typeShort . 'type', substr($data, $offset + self::SHORT_SIZE, self::SHORT_SIZE));
+
+			// Get IFD entry
+			$ifdValue = substr($data, $offset + 2 * self::LONG_SIZE, self::LONG_SIZE);
+
+			// Set size of field
+			$this->setSizeInfo($type[1], $fieldType['type'], $ifdValue);
+
+			$offset += self::TIF_IFD_ENTRY_SIZE;
+		}
+
+		$this->fastImageSize->setSize($this->size);
+	}
+
+	/**
+	 * Set byte type based on signature in header
+	 *
+	 * @param string $signature Header signature
+	 */
+	protected function setByteType($signature)
+	{
+		if ($signature === self::TIF_SIGNATURE_INTEL)
+		{
+			$this->typeLong = 'V';
+			$this->typeShort = 'v';
+			$this->size['type'] = IMAGETYPE_TIFF_II;
+		}
+		else
+		{
+			$this->typeLong = 'N';
+			$this->typeShort = 'n';
+			$this->size['type'] = IMAGETYPE_TIFF_MM;
+		}
+	}
+
+	/**
+	 * Set size info
+	 *
+	 * @param int $dimensionType Type of dimension. Either width or height
+	 * @param int $fieldLength Length of field. Either short or long
+	 * @param string $ifdValue String value of IFD field
+	 */
+	protected function setSizeInfo($dimensionType, $fieldLength, $ifdValue)
+	{
+		// Set size of field
+		$fieldSize = $fieldLength === self::TIF_TAG_TYPE_SHORT ? $this->typeShort : $this->typeLong;
+
+		// Get actual dimensions from IFD
+		if ($dimensionType === self::TIF_TAG_IMAGE_HEIGHT)
+		{
+			$this->size = array_merge($this->size, unpack($fieldSize . 'height', $ifdValue));
+		}
+		else if ($dimensionType === self::TIF_TAG_IMAGE_WIDTH)
+		{
+			$this->size = array_merge($this->size, unpack($fieldSize . 'width', $ifdValue));
+		}
+	}
+}
--- /dev/null
+++ b/vendor/marc1706/fast-image-size/lib/Type/TypeWbmp.php
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * fast-image-size image type wbmp
+ * @package fast-image-size
+ * @copyright (c) Marc Alexander <admin@m-a-styles.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace FastImageSize\Type;
+
+class TypeWbmp extends TypeBase
+{
+	/**
+	 * {@inheritdoc}
+	 */
+	public function getSize($filename)
+	{
+		$data = $this->fastImageSize->getImage($filename, 0, self::LONG_SIZE);
+
+		// Check if image is WBMP
+		if ($data === false || !$this->validWBMP($data))
+		{
+			return;
+		}
+
+		$size = unpack('Cwidth/Cheight', substr($data, self::SHORT_SIZE, self::SHORT_SIZE));
+
+		// Check if dimensions are valid. A file might be recognised as WBMP
+		// rather easily (see extra check for JPEG2000).
+		if (!$this->validDimensions($size))
+		{
+			return;
+		}
+
+		$this->fastImageSize->setSize($size);
+		$this->fastImageSize->setImageType(IMAGETYPE_WBMP);
+	}
+
+	/**
+	 * Return if supplied data might be part of a valid WBMP file
+	 *
+	 * @param bool|string $data
+	 *
+	 * @return bool True if data might be part of a valid WBMP file, else false
+	 */
+	protected function validWBMP($data)
+	{
+		return ord($data[0]) === 0 && ord($data[1]) === 0 && $data !== substr(TypeJp2::JPEG_2000_SIGNATURE, 0, self::LONG_SIZE);
+	}
+
+	/**
+	 * Return whether dimensions are valid
+	 *
+	 * @param array $size Size array
+	 *
+	 * @return bool True if dimensions are valid, false if not
+	 */
+	protected function validDimensions($size)
+	{
+		return $size['height'] > 0 && $size['width'] > 0;
+	}
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/.gitignore
@@ -0,0 +1,7 @@
+vendor
+composer.lock
+composer.phar
+phpunit.xml
+phpmd.xml
+phpdox.xml
+clover.xml
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/.scrutinizer.yml
@@ -0,0 +1,45 @@
+before_commands:
+    - "composer install --no-dev --prefer-source"
+
+tools:
+    external_code_coverage:
+        timeout: 600
+    php_code_coverage:
+        enabled: true
+    php_code_sniffer:
+        enabled: true
+        config:
+            standard: PSR2
+        filter:
+            paths: ["src/*", "tests/*"]
+    php_cpd:
+        enabled: true
+        excluded_dirs: ["docs", "examples", "tests", "vendor"]
+    php_cs_fixer:
+        enabled: true
+        config:
+            level: all
+        filter:
+            paths: ["src/*", "tests/*"]
+    php_loc:
+        enabled: true
+        excluded_dirs: ["docs", "examples", "tests", "vendor"]
+    php_mess_detector:
+        enabled: true
+        config:
+            ruleset: phpmd.xml.dist
+            design_rules: { eval_expression: false }
+        filter:
+            paths: ["src/*"]
+    php_pdepend:
+        enabled: true
+        excluded_dirs: ["docs", "examples", "tests", "vendor"]
+    php_analyzer:
+        enabled: true
+        filter:
+            paths: ["src/*", "tests/*"]
+    php_hhvm:
+        enabled: true
+        filter:
+            paths: ["src/*", "tests/*"]
+    sensiolabs_security_checker: true
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/.travis.install.sh
@@ -0,0 +1,11 @@
+set -x
+if [ "$TRAVIS_PHP_VERSION" = 'hhvm' ] || [ "$TRAVIS_PHP_VERSION" = 'hhvm-nightly' ] ; then
+    curl -sS https://getcomposer.org/installer > composer-installer.php
+    hhvm composer-installer.php
+    hhvm -v ResourceLimit.SocketDefaultTimeout=30 -v Http.SlowQueryThreshold=30000 composer.phar update --prefer-source
+    hhvm -v ResourceLimit.SocketDefaultTimeout=30 -v Http.SlowQueryThreshold=30000 composer.phar install --dev --prefer-source
+else
+    composer self-update
+    composer update --prefer-source
+    composer install --dev --prefer-source
+fi
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/.travis.yml
@@ -0,0 +1,28 @@
+language: php
+
+php:
+  - 5.3.3
+  - 5.3
+  - 5.4
+  - 5.5
+  - 5.6
+  - hhvm
+  - hhvm-nightly
+
+before_script:
+  - sh .travis.install.sh
+
+script:
+  - ./vendor/bin/phpunit --disallow-test-output --report-useless-tests --coverage-clover ./clover.xml --group=Coverage
+  - ./vendor/bin/phpunit --disallow-test-output --report-useless-tests --strict --exclude-group=Performance,Coverage
+  - php -n ./vendor/bin/phpunit --group=Performance
+  - ./vendor/bin/phpcs --standard=PSR2 ./src/ ./tests/
+
+matrix:
+  allow_failures:
+    - php: hhvm
+    - php: hhvm-nightly
+
+after_script:
+  - wget https://scrutinizer-ci.com/ocular.phar
+  - php ocular.phar code-coverage:upload --format=php-clover ./clover.xml
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/CONTRIBUTING.md
@@ -0,0 +1,35 @@
+# Contributing
+
+ * Coding standard for the project is [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)
+ * The project will follow strict [object calisthenics](http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php)
+ * Any contribution must provide tests for additional introduced conditions
+ * Any un-confirmed issue needs a failing test case before being accepted
+ * Pull requests must be sent from a new hotfix/feature branch, not from `master`.
+
+## Installation
+
+To install the project and run the tests, you need to clone it first:
+
+```sh
+$ git clone git://github.com/Ocramius/ProxyManager.git
+```
+
+You will then need to run a composer installation:
+
+```sh
+$ cd ProxyManager
+$ curl -s https://getcomposer.org/installer | php
+$ php composer.phar update
+```
+
+## Testing
+
+The PHPUnit version to be used is the one installed as a dev- dependency via composer:
+
+```sh
+$ ./vendor/bin/phpunit
+```
+
+Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement 
+won't be merged.
+
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2013 Marco Pivetta
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/README.md
@@ -0,0 +1,50 @@
+# Proxy Manager
+
+This library aims at providing abstraction for generating various kinds of [proxy classes](http://marco-pivetta.com/proxy-pattern-in-php/).
+
+![ProxyManager](proxy-manager.png)
+
+[![Build Status](https://travis-ci.org/Ocramius/ProxyManager.png?branch=master)](https://travis-ci.org/Ocramius/ProxyManager)
+[![Code Coverage](https://scrutinizer-ci.com/g/Ocramius/ProxyManager/badges/coverage.png?s=ca3b9ceb9e36aeec0e57569cc8983394b7d2a59e)](https://scrutinizer-ci.com/g/Ocramius/ProxyManager/)
+[![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/Ocramius/ProxyManager/badges/quality-score.png?s=eaa858f876137ed281141b1d1e98acfa739729ed)](https://scrutinizer-ci.com/g/Ocramius/ProxyManager/)
+[![SensioLabsInsight](https://insight.sensiolabs.com/projects/69fe5f97-b1c8-4ddd-93ce-900b8b788cf2/mini.png)](https://insight.sensiolabs.com/projects/69fe5f97-b1c8-4ddd-93ce-900b8b788cf2)
+[![Dependency Status](https://www.versioneye.com/package/php--ocramius--proxy-manager/badge.png)](https://www.versioneye.com/package/php--ocramius--proxy-manager)
+[![Reference Status](https://www.versioneye.com/php/ocramius:proxy-manager/reference_badge.svg)](https://www.versioneye.com/php/ocramius:proxy-manager/references)
+[![HHVM Status](http://hhvm.h4cc.de/badge/ocramius/proxy-manager.png)](http://hhvm.h4cc.de/package/ocramius/proxy-manager)
+
+[![Total Downloads](https://poser.pugx.org/ocramius/proxy-manager/downloads.png)](https://packagist.org/packages/ocramius/proxy-manager)
+[![Latest Stable Version](https://poser.pugx.org/ocramius/proxy-manager/v/stable.png)](https://packagist.org/packages/ocramius/proxy-manager)
+[![Latest Unstable Version](https://poser.pugx.org/ocramius/proxy-manager/v/unstable.png)](https://packagist.org/packages/ocramius/proxy-manager)
+
+
+## Documentation
+
+You can learn about the proxy pattern and how to use the **ProxyManager** on the [online documentation](http://ocramius.github.io/ProxyManager).
+
+## Installation
+
+The suggested installation method is via [composer](https://getcomposer.org/):
+
+```sh
+php composer.phar require ocramius/proxy-manager:1.0.*
+```
+
+## Proxy example
+
+Here's how you build a lazy loadable object with ProxyManager using a *Virtual Proxy*
+
+```php
+$factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory();
+
+$proxy = $factory->createProxy(
+    'MyApp\HeavyComplexObject',
+    function (& $wrappedObject, $proxy, $method, $parameters, & $initializer) {
+        $wrappedObject = new HeavyComplexObject(); // instantiation logic here
+        $initializer   = null; // turning off further lazy initialization
+    }
+);
+
+$proxy->doFoo();
+```
+
+See the [online documentation](http://ocramius.github.io/ProxyManager) for more supported proxy types and examples. 
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/STABILITY.md
@@ -0,0 +1,19 @@
+This is a list of supported versions, with their expected release/support time-frames:
+
+# 0.5.x
+
+ * Release date: 2013-12-01
+ * Bug fixes: till 2015-03-11
+ * Security fixes: till 2015-12-11
+
+# 1.0.x
+
+ * Release date: 2014-12-12
+ * Bug fixes: till 2015-12-11
+ * Security fixes: till 2016-12-11
+
+# 2.0.x
+
+ * Release date: TBA
+ * Bug fixes: TBA
+ * Security fixes: TBA
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/UPGRADE.md
@@ -0,0 +1,69 @@
+This is a list of backwards compatibility (BC) breaks introduced in ProxyManager:
+
+# 0.5.0
+
+ * The Generated Hydrator has been removed - it is now available as a separate project
+   at [Ocramius/GeneratedHydrator](https://github.com/Ocramius/GeneratedHydrator) [#65](https://github.com/Ocramius/ProxyManager/pull/65)
+ * When having a `public function __get($name)` defined (by-val) and public properties, it won't be possible to get public
+   properties by-ref while initializing the object. Either drop `__get()` or implement
+   a by-ref `& __get()` [#126](https://github.com/Ocramius/ProxyManager/pull/126)
+ * Proxies are now being always auto-generated if they could not be autoloaded by a factory. The methods
+   [`ProxyManager\Configuration#setAutoGenerateProxies()`](https://github.com/Ocramius/ProxyManager/blob/0.5.0-BETA2/src/ProxyManager/Configuration.php#L67)
+   and [`ProxyManager\Configuration#doesAutoGenerateProxies()`](https://github.com/Ocramius/ProxyManager/blob/0.5.0-BETA2/src/ProxyManager/Configuration.php#L75)
+   are now no-op and deprecated, and will be removed in the next minor
+   version [#87](https://github.com/Ocramius/ProxyManager/pull/87) [#90](https://github.com/Ocramius/ProxyManager/pull/90)
+ * Proxy public properties defaults are now set before initialization [#116](https://github.com/Ocramius/ProxyManager/pull/116) [#122](https://github.com/Ocramius/ProxyManager/pull/122)
+
+# 0.4.0
+
+ * An optional parameter `$options` was introduced
+   in [`ProxyManager\Inflector\ClassNameInflectorInterface#getProxyClassName($className, array $options = array())`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/Inflector/ClassNameInflectorInterface.php)
+   parametrize the generated class name as of [#10](https://github.com/Ocramius/ProxyManager/pull/10)
+   and [#59](https://github.com/Ocramius/ProxyManager/pull/59)
+ * Generated hydrators no longer have constructor arguments. Any required reflection instantiation is now dealt with
+   in the hydrator internally as of [#63](https://github.com/Ocramius/ProxyManager/pull/63)
+
+# 0.3.4
+
+ * Interface names are also supported for proxy generation as of [#40](https://github.com/Ocramius/ProxyManager/pull/40)
+
+# 0.3.3
+
+ * [Generated hydrators](https://github.com/Ocramius/ProxyManager/tree/master/docs/generated-hydrator.md) were introduced
+
+# 0.3.2
+
+ * An additional (optional) [by-ref parameter was added](https://github.com/Ocramius/ProxyManager/pull/31) 
+   to the lazy loading proxies' initializer to allow unsetting the initializer with less overhead.
+
+# 0.3.0
+
+ * Dependency to [jms/cg](https://github.com/schmittjoh/cg-library) removed
+ * Moved code generation logic to [`Zend\Code`](https://github.com/zendframework/zf2)
+ * Added method [`ProxyManager\Inflector\ClassNameInflectorInterface#isProxyClassName($className)`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/Inflector/ClassNameInflectorInterface.php)
+ * The constructor of [`ProxyManager\Autoloader\Autoloader`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/Autoloader/Autoloader.php)
+   changed from `__construct(\ProxyManager\FileLocator\FileLocatorInterface $fileLocator)` to
+   `__construct(\ProxyManager\FileLocator\FileLocatorInterface $fileLocator, \ProxyManager\Inflector\ClassNameInflectorInterface $classNameInflector)`
+ * Classes implementing `CG\Core\GeneratorStrategyInterface` now implement
+   [`ProxyManager\GeneratorStrategy\GeneratorStrategyInterface`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/GeneratorStrategy/GeneratorStrategyInterface.php)
+   instead
+ * All code generation logic has been replaced - If you wrote any logic based on `ProxyManager\ProxyGenerator`, you will
+   have to rewrite it
+
+# 0.2.0
+
+ * The signature of initializers to be used with proxies implementing
+   [`ProxyManager\Proxy\LazyLoadingInterface`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/Proxy/LazyLoadingInterface.php)
+   changed from:
+
+   ```php
+   $initializer = function ($proxy, & $wrappedObject, $method, $parameters) {};
+   ```
+
+   to
+
+   ```php
+   $initializer = function (& $wrappedObject, $proxy, $method, $parameters) {};
+   ```
+
+   Only the order of parameters passed to the closures has been changed.
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/composer.json
@@ -0,0 +1,53 @@
+{
+    "name":              "ocramius/proxy-manager",
+    "description":       "A library providing utilities to generate, instantiate and generally operate with Object Proxies",
+    "type":              "library",
+    "license":           "MIT",
+    "homepage":          "https://github.com/Ocramius/ProxyManager",
+    "keywords":          [
+        "proxy",
+        "proxy pattern",
+        "service proxies",
+        "lazy loading",
+        "aop"
+    ],
+    "authors": [
+        {
+            "name":     "Marco Pivetta",
+            "email":    "ocramius@gmail.com",
+            "homepage": "http://ocramius.github.com/"
+        }
+    ],
+    "require": {
+        "php":                     ">=5.3.3",
+        "zendframework/zend-code": ">2.2.5,<3.0"
+    },
+    "require-dev": {
+        "ext-phar":                    "*",
+        "phpunit/phpunit":             "~4.0",
+        "squizlabs/php_codesniffer":   "1.5.*"
+    },
+    "suggest": {
+        "zendframework/zend-stdlib":   "To use the hydrator proxy",
+        "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects",
+        "zendframework/zend-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)",
+        "zendframework/zend-json": "To have the JsonRpc adapter (Remote Object feature)",
+        "zendframework/zend-soap": "To have the Soap adapter (Remote Object feature)"
+    },
+    "autoload": {
+        "psr-0": {
+            "ProxyManager\\": "src"
+        }
+    },
+    "autoload-dev": {
+        "psr-0": {
+            "ProxyManagerTest\\": "tests",
+            "ProxyManagerTestAsset\\": "tests"
+        }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.0.x-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/docs/access-interceptor-scope-localizer.md
@@ -0,0 +1,105 @@
+# Access Interceptor Scope Localizer Proxy
+
+An access interceptor scope localizer is a smart reference proxy that allows you to dynamically
+define logic to be executed before or after any of the proxied object's methods' logic.
+
+It works exactly like the [access interceptor value holder](access-interceptor-value-holder.md),
+with some minor differences in behavior.
+
+The working concept of an access interceptor scope localizer is to localize scope of a proxied object:
+
+```php
+class Example
+{
+    protected $foo;
+    protected $bar;
+    protected $baz;
+
+    public function doFoo()
+    {
+        // ...
+    }
+}
+
+class ExampleProxy extends Example
+{
+    public function __construct(Example $example)
+    {
+        $this->foo = & $example->foo;
+        $this->bar = & $example->bar;
+        $this->baz = & $example->baz;
+    }
+
+    public function doFoo()
+    {
+        return parent::doFoo();
+    }
+}
+```
+
+This allows to create a mirror copy of the real instance, where any change in the proxy or in the real
+instance is reflected in both objects.
+
+The main advantage of this approach is that the proxy is now safe against fluent interfaces, which
+would break an [access interceptor value holder](access-interceptor-value-holder.md) instead.
+
+## Differences with [access interceptor value holder](access-interceptor-value-holder.md):
+
+ * It does **NOT** implement the `ProxyManager\Proxy\ValueHolderInterface`, since the proxy itself
+   does not keep a reference to the original object being proxied
+ * In all interceptor methods (see [access interceptor value holder](access-interceptor-value-holder.md)),
+   the `$instance` passed in is the proxy itself. There is no way  to gather a reference to the
+   original object right now, and that's mainly to protect from misuse.
+
+## Known limitations
+
+ * It is **NOT** possible to intercept access to public properties
+ * It is **NOT** possible to proxy interfaces, since this proxy relies on `parent::method()` calls.
+   Interfaces obviously don't provide a parent method implementation.
+ * calling `unset` on a property of an access interceptor scope localizer (or the real instance)
+   will cause the two objects to be un-synchronized, with possible unexpected behaviour.
+ * serializing or un-serializing an access interceptor scope localizer (or the real instance)
+   will not cause the real instance (or the proxy) to be serialized or un-serialized
+ * if a proxied object contains private properties, then an exception will be thrown if you use
+   PHP `< 5.4.0`.
+
+## Example
+
+Here's an example of how you can create and use an access interceptor scope localizer :
+
+```php
+<?php
+
+use ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory as Factory;
+
+require_once __DIR__ . '/vendor/autoload.php';
+
+class Foo
+{
+    public function doFoo()
+    {
+        echo "Foo!\n";
+    }
+}
+
+$factory = new Factory();
+
+$proxy = $factory->createProxy(
+    new Foo(),
+    array('doFoo' => function () { echo "PreFoo!\n"; }),
+    array('doFoo' => function () { echo "PostFoo!\n"; })
+);
+
+$proxy->doFoo();
+```
+
+This send something like following to your output:
+
+```
+PreFoo!
+Foo!
+PostFoo!
+```
+
+This is pretty much the same logic that you can find
+in [access interceptor value holder](access-interceptor-value-holder.md).
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/docs/access-interceptor-value-holder.md
@@ -0,0 +1,108 @@
+# Access Interceptor Value Holder Proxy
+
+An access interceptor value holder is a smart reference proxy that allows you to dynamically
+define logic to be executed before or after any of the wrapped object's methods
+logic.
+
+It wraps around a real instance of the object to be proxied, and can be useful for things like:
+
+ * caching execution of slow and heavy methods
+ * log method calls
+ * debugging
+ * event triggering
+ * handling of orthogonal logic, and [AOP](http://en.wikipedia.org/wiki/Aspect-oriented_programming) in general
+
+## Example
+
+Here's an example of how you can create and use an access interceptor value holder:
+
+```php
+<?php
+
+use ProxyManager\Factory\AccessInterceptorValueHolderFactory as Factory;
+
+require_once __DIR__ . '/vendor/autoload.php';
+
+class Foo
+{
+    public function doFoo()
+    {
+        echo "Foo!\n";
+    }
+}
+
+$factory = new Factory();
+
+$proxy = $factory->createProxy(
+    new Foo(),
+    array('doFoo' => function () { echo "PreFoo!\n"; }),
+    array('doFoo' => function () { echo "PostFoo!\n"; })
+);
+
+$proxy->doFoo();
+```
+
+This send something like following to your output:
+
+```
+PreFoo!
+Foo!
+PostFoo!
+```
+
+## Implementing pre- and post- access interceptors
+
+A proxy produced by the
+[`ProxyManager\Factory\AccessInterceptorValueHolderFactory`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/Factory/AccessInterceptorValueHolderFactory.php)
+implements both the
+[`ProxyManager\Proxy\ValueHolderInterface`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/Proxy/ValueHolderInterface.php)
+and the
+[`ProxyManager\Proxy\AccessInterceptorInterface`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/Proxy/ValueHolderInterface.php).
+
+Therefore, you can set an access interceptor callback by calling:
+
+```php
+$proxy->setMethodPrefixInterceptor('methodName', function () { echo 'pre'; });
+$proxy->setMethodSuffixInterceptor('methodName', function () { echo 'post'; });
+```
+
+You can also listen to public properties access by attaching interceptors to `__get`, `__set`, `__isset` and `__unset`.
+
+A prefix interceptor (executed before method logic) should have following signature:
+
+```php
+/**
+ * @var object $proxy       the proxy that intercepted the method call
+ * @var object $instance    the wrapped instance within the proxy
+ * @var string $method      name of the called method
+ * @var array  $params      sorted array of parameters passed to the intercepted
+ *                          method, indexed by parameter name
+ * @var bool   $returnEarly flag to tell the interceptor proxy to return early, returning
+ *                          the interceptor's return value instead of executing the method logic
+ *
+ * @return mixed
+ */
+$prefixInterceptor = function ($proxy, $instance, $method, $params, & $returnEarly) {};
+```
+
+A suffix interceptor (executed after method logic) should have following signature:
+
+```php
+/**
+ * @var object $proxy       the proxy that intercepted the method call
+ * @var object $instance    the wrapped instance within the proxy
+ * @var string $method      name of the called method
+ * @var array  $params      sorted array of parameters passed to the intercepted
+ *                          method, indexed by parameter name
+ * @var mixed  $returnValue the return value of the intercepted method
+ * @var bool   $returnEarly flag to tell the proxy to return early, returning the interceptor's
+ *                          return value instead of the value produced by the method
+ *
+ * @return mixed
+ */
+$suffixInterceptor = function ($proxy, $instance, $method, $params, $returnValue, & $returnEarly) {};
+```
+
+## Tuning performance for production
+
+See [Tuning ProxyManager for Production](https://github.com/Ocramius/ProxyManager/blob/master/docs/tuning-for-production.md).
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/docs/generator-strategies.md
@@ -0,0 +1,16 @@
+# Generator strategies
+
+ProxyManager allows you to generate classes based on generator strategies and a
+given `Zend\Code\Generator\ClassGenerator` as of
+the [interface of a generator strategy](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/GeneratorStrategy/GeneratorStrategyInterface.php).
+
+Currently, 3 generator strategies are shipped with ProxyManager:
+
+ * [`ProxyManager\GeneratorStrategy\BaseGeneratorStrategy`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/GeneratorStrategy/BaseGeneratorStrategy.php),
+   which simply retrieves the string representation of the class from `ClassGenerator`
+ * [`ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/GeneratorStrategy/EvaluatingGeneratorStrategy.php),
+   which calls `eval()` upon the generated class code before returning it. This is useful in cases
+   where you want to generate multiple classes at runtime
+ * [`ProxyManager\GeneratorStrategy\FileWriterGeneratorStrategy`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/GeneratorStrategy/FileWriterGeneratorStrategy.php),
+   which accepts a [`ProxyManager\FileLocator\FileLocatorInterface`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/FileLocator/FileLocatorInterface.php)
+   instance as constructor parameter, and based on it, writes the generated class to a file before returning its code.
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/docs/lazy-loading-ghost-object.md
@@ -0,0 +1,206 @@
+# Lazy Loading Ghost Object Proxies
+
+A lazy loading ghost object proxy is a ghost proxy that looks exactly like the real instance of the proxied subject,
+but which has all properties nulled before initialization.
+
+## Lazy loading with the Ghost Object
+
+In pseudo-code, in userland, [lazy loading](http://www.martinfowler.com/eaaCatalog/lazyLoad.html) in a ghost object
+looks like following:
+
+```php
+class MyObjectProxy
+{
+    private $initialized = false;
+    private $name;
+    private $surname;
+
+    public function doFoo()
+    {
+        $this->init();
+
+        // Perform doFoo routine using loaded variables
+    }
+
+    private function init()
+    {
+        if (! $this->initialized) {
+            $data          = some_logic_that_loads_data();
+
+            $this->name    = $data['name'];
+            $this->surname = $data['surname'];
+
+            $this->initialized = true;
+        }
+    }
+}
+```
+
+Ghost objects work similarly to virtual proxies, but since they don't wrap around a "real" instance of the proxied
+subject, they are better suited for representing dataset rows.
+
+## When do I use a ghost object?
+
+You usually need a ghost object in cases where following applies
+
+ * you are building a small data-mapper and want to lazily load data across associations in your object graph
+ * you want to initialize objects representing rows in a large dataset
+ * you want to compare instances of lazily initialized objects without the risk of comparing a proxy with a real subject
+ * you are aware of the internal state of the object and are confident in working with its internals via reflection
+   or direct property access
+
+## Usage examples
+
+[ProxyManager](https://github.com/Ocramius/ProxyManager) provides a factory that creates lazy loading ghost objects.
+To use it, follow these steps:
+
+First of all, define your object's logic without taking care of lazy loading:
+
+```php
+namespace MyApp;
+
+class Customer
+{
+    private $name;
+    private $surname;
+
+    // just write your business logic or generally logic
+    // don't worry about how complex this object will be!
+    // don't code lazy-loading oriented optimizations in here!
+    public function getName() { return $this->name; }
+    public function setName($name) { $this->name = (string) $name; }
+    public function getSurname() { return $this->surname; }
+    public function setSurname($surname) { $this->surname = (string) $surname; }
+}
+```
+
+Then use the proxy manager to create a ghost object of it.
+You will be responsible of setting its state during lazy loading:
+
+```php
+namespace MyApp;
+
+use ProxyManager\Factory\LazyLoadingGhostFactory;
+use ProxyManager\Proxy\LazyLoadingInterface;
+
+require_once __DIR__ . '/vendor/autoload.php';
+
+$factory     = new LazyLoadingGhostFactory();
+$initializer = function (LazyLoadingInterface $proxy, $method, array $parameters, & $initializer) {
+    $initializer   = null; // disable initialization
+
+    // load data and modify the object here
+    $proxy->setName('Agent');
+    $proxy->setSurname('Smith');
+
+    return true; // confirm that initialization occurred correctly
+};
+
+$instance = $factory->createProxy('MyApp\Customer', $initializer);
+```
+
+You can now simply use your object as before:
+
+```php
+// this will just work as before
+echo $proxy->getName() . ' ' . $proxy->getSurname(); // Agent Smith
+```
+
+## Lazy Initialization
+
+As you can see, we use a closure to handle lazy initialization of the proxy instance at runtime.
+The initializer closure signature for ghost objects should be as following:
+
+```php
+/**
+ * @var object  $proxy         the instance the ghost object proxy that is being initialized
+ * @var string  $method        the name of the method that triggered lazy initialization
+ * @var array   $parameters    an ordered list of parameters passed to the method that
+ *                             triggered initialization, indexed by parameter name
+ * @var Closure $initializer   a reference to the property that is the initializer for the
+ *                             proxy. Set it to null to disable further initialization
+ *
+ * @return bool true on success
+ */
+$initializer = function ($proxy, $method, $parameters, & $initializer) {};
+```
+
+The initializer closure should usually be coded like following:
+
+```php
+$initializer = function ($proxy, $method, $parameters, & $initializer) {
+    $initializer = null; // disable initializer for this proxy instance
+
+    // modify the object with loaded data
+    $proxy->setFoo(/* ... */);
+    $proxy->setBar(/* ... */);
+
+    return true; // report success
+};
+```
+
+The
+[`ProxyManager\Factory\LazyLoadingGhostFactory`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/Factory/LazyLoadingGhostFactory.php)
+produces proxies that implement both the
+[`ProxyManager\Proxy\GhostObjectInterface`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/Proxy/GhostObjectInterface.php)
+and the
+[`ProxyManager\Proxy\LazyLoadingInterface`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/Proxy/LazyLoadingInterface.php).
+
+At any point in time, you can set a new initializer for the proxy:
+
+```php
+$proxy->setProxyInitializer($initializer);
+```
+
+In your initializer, you **MUST** turn off any further initialization:
+
+```php
+$proxy->setProxyInitializer(null);
+```
+
+or
+
+```php
+$initializer = null; // if you use the initializer passed by reference to the closure
+```
+
+## Triggering Initialization
+
+A lazy loading ghost object is initialized whenever you access any property or method of it.
+Any of the following interactions would trigger lazy initialization:
+
+```php
+// calling a method
+$proxy->someMethod();
+
+// reading a property
+echo $proxy->someProperty;
+
+// writing a property
+$proxy->someProperty = 'foo';
+
+// checking for existence of a property
+isset($proxy->someProperty);
+
+// removing a property
+unset($proxy->someProperty);
+
+// cloning the entire proxy
+clone $proxy;
+
+// serializing the proxy
+$unserialized = unserialize(serialize($proxy));
+```
+
+Remember to call `$proxy->setProxyInitializer(null);` to disable initialization of your proxy, or it will happen more
+than once.
+
+## Proxying interfaces
+
+You can also generate proxies from an interface FQCN. By proxying an interface, you will only be able to access the
+methods defined by the interface itself, even if the `wrappedObject` implements more methods. This will anyway save
+some memory since the proxy won't contain any properties.
+
+## Tuning performance for production
+
+See [Tuning ProxyManager for Production](https://github.com/Ocramius/ProxyManager/blob/master/docs/tuning-for-production.md).
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/docs/lazy-loading-value-holder.md
@@ -0,0 +1,202 @@
+# Lazy Loading Value Holder Proxy
+
+A lazy loading value holder proxy is a virtual proxy that wraps and lazily initializes a "real" instance of the proxied
+class.
+
+## What is lazy loading?
+
+In pseudo-code, in userland, [lazy loading](http://www.martinfowler.com/eaaCatalog/lazyLoad.html) looks like following:
+
+```php
+class MyObjectProxy
+{
+    private $wrapped;
+
+    public function doFoo()
+    {
+        $this->init();
+
+        return $this->wrapped->doFoo();
+    }
+
+    private function init()
+    {
+        if (null === $this->wrapped) {
+            $this->wrapped = new MyObject();
+        }
+    }
+}
+```
+
+This code is problematic, and adds a lot of complexity that makes your unit tests' code even worse.
+
+Also, this kind of usage often ends up in coupling your code with a particular
+[Dependency Injection Container](http://martinfowler.com/articles/injection.html)
+or a framework that fetches dependencies for you.
+That way, further complexity is introduced, and some problems related
+with service location raise, as I've explained
+[in this article](http://ocramius.github.com/blog/zf2-and-symfony-service-proxies-with-doctrine-proxies/).
+
+Lazy loading value holders abstract this logic for you, hiding your complex, slow, performance-impacting objects behind
+tiny wrappers that have their same API, and that get initialized at first usage.
+
+## When do I use a lazy value holder?
+
+You usually need a lazy value holder in cases where following applies
+
+ * your object takes a lot of time and memory to be initialized (with all dependencies)
+ * your object is not always used, and the instantiation overhead can be avoided
+
+## Usage examples
+
+[ProxyManager](https://github.com/Ocramius/ProxyManager) provides a factory that eases instantiation of lazy loading
+value holders. To use it, follow these steps:
+
+First of all, define your object's logic without taking care of lazy loading:
+
+```php
+namespace MyApp;
+
+class HeavyComplexObject
+{
+    public function __construct()
+    {
+        // just write your business logic
+        // don't worry about how heavy initialization of this will be!
+    }
+
+    public function doFoo() {
+        echo "OK!"
+    }
+}
+```
+
+Then use the proxy manager to create a lazy version of the object (as a proxy):
+
+```php
+namespace MyApp;
+
+use ProxyManager\Factory\LazyLoadingValueHolderFactory;
+use ProxyManager\Proxy\LazyLoadingInterface;
+
+require_once __DIR__ . '/vendor/autoload.php';
+
+$factory     = new LazyLoadingValueHolderFactory();
+$initializer = function (& $wrappedObject, LazyLoadingInterface $proxy, $method, array $parameters, & $initializer) {
+    $initializer   = null; // disable initialization
+    $wrappedObject = new HeavyComplexObject(); // fill your object with values here
+
+    return true; // confirm that initialization occurred correctly
+};
+
+$instance = $factory->createProxy('MyApp\HeavyComplexObject', $initializer);
+```
+
+You can now simply use your object as before:
+
+```php
+// this will just work as before
+$proxy->doFoo(); // OK!
+```
+
+## Lazy Initialization
+
+As you can see, we use a closure to handle lazy initialization of the proxy instance at runtime.
+The initializer closure signature should be as following:
+
+```php
+/**
+ * @var object  $wrappedObject the instance (passed by reference) of the wrapped object,
+ *                             set it to your real object
+ * @var object  $proxy         the instance proxy that is being initialized
+ * @var string  $method        the name of the method that triggered lazy initialization
+ * @var string  $parameters    an ordered list of parameters passed to the method that
+ *                             triggered initialization, indexed by parameter name
+ * @var Closure $initializer   a reference to the property that is the initializer for the
+ *                             proxy. Set it to null to disable further initialization
+ *
+ * @return bool true on success
+ */
+$initializer = function (& $wrappedObject, $proxy, $method, $parameters, & $initializer) {};
+```
+
+The initializer closure should usually be coded like following:
+
+```php
+$initializer = function (& $wrappedObject, $proxy, $method, $parameters, & $initializer) {
+    $newlyCreatedObject = new Foo(); // instantiation logic
+    $newlyCreatedObject->setBar('baz') // instantiation logic
+    $newlyCreatedObject->setBat('bam') // instantiation logic
+
+    $wrappedObject = $newlyCreatedObject; // set wrapped object in the proxy
+    $initializer   = null; // disable initializer
+
+    return true; // report success
+};
+```
+
+The
+[`ProxyManager\Factory\LazyLoadingValueHolderFactory`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/Factory/LazyLoadingValueHolderFactory.php)
+produces proxies that implement both the
+[`ProxyManager\Proxy\ValueHolderInterface`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/Proxy/ValueHolderInterface.php)
+and the
+[`ProxyManager\Proxy\LazyLoadingInterface`](https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/Proxy/LazyLoadingInterface.php).
+
+At any point in time, you can set a new initializer for the proxy:
+
+```php
+$proxy->setProxyInitializer($initializer);
+```
+
+In your initializer, you currently **MUST** turn off any further initialization:
+
+```php
+$proxy->setProxyInitializer(null);
+```
+
+or
+
+```php
+$initializer = null; // if you use the initializer by reference
+```
+
+## Triggering Initialization
+
+A lazy loading proxy is initialized whenever you access any property or method of it.
+Any of the following interactions would trigger lazy initialization:
+
+```php
+// calling a method
+$proxy->someMethod();
+
+// reading a property
+echo $proxy->someProperty;
+
+// writing a property
+$proxy->someProperty = 'foo';
+
+// checking for existence of a property
+isset($proxy->someProperty);
+
+// removing a property
+unset($proxy->someProperty);
+
+// cloning the entire proxy
+clone $proxy;
+
+// serializing the proxy
+$unserialized = serialize(unserialize($proxy));
+```
+
+Remember to call `$proxy->setProxyInitializer(null);` to disable initialization of your proxy, or it will happen more
+than once.
+
+## Proxying interfaces
+
+You can also generate proxies from an interface FQCN. By proxying an interface, you will only be able to access the
+methods defined by the interface itself, even if the `wrappedObject` implements more methods. This will anyway save
+some memory since the proxy won't contain useless inherited properties.
+
+## Tuning performance for production
+
+See [Tuning ProxyManager for Production](https://github.com/Ocramius/ProxyManager/blob/master/docs/tuning-for-production.md).
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/docs/null-object.md
@@ -0,0 +1,89 @@
+# Null Object Proxy
+
+A Null Object proxy is a [null object pattern](http://en.wikipedia.org/wiki/Null_Object_pattern) implementation.
+The proxy factory creates a new object with defined neutral behavior based on an other object, class name or interface.
+
+## What is null object proxy ?
+
+In your application, when you can't return the object related to the request, the consumer of the model must check 
+for the return value and handle the failing condition gracefully, thus generating an explosion of conditionals throughout your code.
+Fortunately, this seemingly-tangled situation can be sorted out simply by creating a polymorphic implementation of the 
+domain object, which would implement the same interface as the one of the object in question, only that its methods 
+wouldn’t do anything, therefore offloading client code from doing repetitive checks for ugly null values when the operation
+ is executed.
+
+## Usage examples
+
+```php
+class UserMapper
+{   
+    private $adapter;
+    
+    public function __construct(DatabaseAdapterInterface $adapter) {
+        $this->adapter = $adapter;
+    }
+
+    public function fetchById($id) {
+        $this->adapter->select("users", array("id" => $id));
+        if (!$row = $this->adapter->fetch()) {
+            return null;
+        }
+        return $this->createUser($row);
+    }
+     
+    private function createUser(array $row) {
+        $user = new Entity\User($row["name"], $row["email"]);
+        $user->setId($row["id"]);
+        return $user;
+    }
+}
+```
+
+If you want to remove conditionals from client code, you need to have a version of the entity conforming to the corresponding 
+interface. With the Null Object Proxy, you can build this object :
+
+```php
+$factory = new \ProxyManager\Factory\NullObjectFactory();
+
+$nullUser = $factory->createProxy('Entity\User');
+
+var_dump($nullUser->getName()); // empty return
+```
+
+You can now return a valid entity :
+
+```php
+class UserMapper
+{   
+    private $adapter;
+    
+    public function __construct(DatabaseAdapterInterface $adapter) {
+        $this->adapter = $adapter;
+    }
+
+    public function fetchById($id) {
+        $this->adapter->select("users", array("id" => $id));
+        return $this->createUser($this->adapter->fetch());
+    }
+     
+    private function createUser($row) {
+        if (!$row) {
+            $factory = new \ProxyManager\Factory\NullObjectFactory();
+
+            return $factory->createProxy('Entity\User');
+        }
+        $user = new Entity\User($row["name"], $row["email"]);
+        $user->setId($row["id"]);
+        return $user; 
+    }
+}
+```
+
+## Proxying interfaces
+
+You can also generate proxies from an interface FQCN. By proxying an interface, you will only be able to access the
+methods defined by the interface itself, and like with the object, the methods are empty.
+
+## Tuning performance for production
+
+See [Tuning ProxyManager for Production](https://github.com/Ocramius/ProxyManager/blob/master/docs/tuning-for-production.md).
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/docs/remote-object.md
@@ -0,0 +1,100 @@
+# Remote Object Proxy
+
+The remote object implementation is a mechanism that enables an local object to control an other object on an other server.
+Each call method on the local object will do a network call to get information or execute operations on the remote object.
+
+## What is remote object proxy ?
+
+A remote object is based on an interface. The remote interface defines the API that a consumer can call. This interface 
+must be implemented both by the client and the RPC server.
+
+## Adapters
+
+ZendFramework's RPC components (XmlRpc, JsonRpc & Soap) can be used easily with the remote object.
+You will need to require the one you need via composer, though:
+
+```sh
+$ php composer.phar require zendframework/zend-xmlrpc:2.*
+$ php composer.phar require zendframework/zend-json:2.*
+$ php composer.phar require zendframework/zend-soap:2.*
+```
+
+ProxyManager comes with 3 adapters:
+
+ * `ProxyManager\Factory\RemoteObject\Adapter\XmlRpc`
+ * `ProxyManager\Factory\RemoteObject\Adapter\JsonRpc`
+ * `ProxyManager\Factory\RemoteObject\Adapter\Soap`
+
+## Usage examples
+
+RPC server side code (`xmlrpc.php` in your local webroot):
+
+```php
+interface FooServiceInterface
+{
+    public function foo();
+}
+
+class Foo implements FooServiceInterface
+{
+    /**
+     * Foo function
+     * @return string
+     */
+    public function foo()
+    {
+        return 'bar remote';
+    }
+}
+
+$server = new Zend\XmlRpc\Server();
+$server->setClass('Foo', 'FooServiceInterface');  // my FooServiceInterface implementation
+$server->handle();
+```
+
+Client side code (proxy) :
+
+```php
+
+interface FooServiceInterface
+{
+    public function foo();
+}
+
+$factory = new \ProxyManager\Factory\RemoteObjectFactory(
+    new \ProxyManager\Factory\RemoteObject\Adapter\XmlRpc(
+        new \Zend\XmlRpc\Client('https://localhost/xmlrpc.php')
+    )
+);
+
+$proxy = $factory->createProxy('FooServiceInterface');
+
+var_dump($proxy->foo()); // "bar remote"
+```
+
+## Implementing custom adapters
+
+Your adapters must implement `ProxyManager\Factory\RemoteObject\AdapterInterface` :
+
+```php
+interface AdapterInterface
+{
+    /**
+     * Call remote object
+     *
+     * @param string $wrappedClass
+     * @param string $method
+     * @param array $params
+     *
+     * @return mixed
+     */
+    public function call($wrappedClass, $method, array $params = array());
+}
+```
+
+It is very easy to create your own implementation (for RESTful web services, for example). Simply pass
+your own adapter instance to your factory at construction time
+
+## Tuning performance for production
+
+See [Tuning ProxyManager for Production](https://github.com/Ocramius/ProxyManager/blob/master/docs/tuning-for-production.md).
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/docs/tuning-for-production.md
@@ -0,0 +1,24 @@
+## Tuning the ProxyManager for production
+
+By default, all proxy factories generate the required proxy classes at runtime.
+
+Proxy generation causes I/O operations and uses a lot of reflection, so be sure to have
+generated all of your proxies **before deploying your code on a live system**, or you
+may experience poor performance.
+
+You can configure ProxyManager so that it will try autoloading the proxies first.
+Generating them "bulk" is not yet implemented:
+
+```php
+$config = new \ProxyManager\Configuration();
+$config->setProxiesTargetDir(__DIR__ . '/my/generated/classes/cache/dir');
+
+// then register the autoloader
+spl_autoload_register($config->getProxyAutoloader());
+```
+
+Generating a classmap with all your proxy classes in it will also work perfectly.
+
+Please note that all the currently implemented `ProxyManager\Factory\*` classes accept
+a `ProxyManager\Configuration` object as optional constructor parameter. This allows for
+fine-tuning of ProxyManager according to your needs.
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/examples/access-interceptor-scope-localizer.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * This example demonstrates how an access interceptor scope localizer
+ * (which is a specific type of smart reference) is safe to use to
+ * proxy fluent interfaces.
+ */
+
+require_once __DIR__ . '/../vendor/autoload.php';
+
+use ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory;
+
+class FluentCounter
+{
+    public $counter = 0;
+
+    /** @return FluentCounter */
+    public function fluentMethod()
+    {
+        $this->counter += 1;
+
+        return $this;
+    }
+}
+
+$factory = new AccessInterceptorScopeLocalizerFactory();
+$foo = new FluentCounter();
+
+/* @var $proxy FluentCounter */
+$proxy = $factory->createProxy(
+    $foo,
+    array('fluentMethod' => function ($proxy) { echo "pre-fluentMethod #{$proxy->counter}!\n"; }),
+    array('fluentMethod' => function ($proxy) { echo "post-fluentMethod #{$proxy->counter}!\n"; })
+);
+
+$proxy->fluentMethod()->fluentMethod()->fluentMethod()->fluentMethod();
+
+echo 'The proxy counter is now at ' . $proxy->counter . "\n";
+echo 'The real instance counter is now at ' . $foo->counter . "\n";
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/examples/ghost-object.php
@@ -0,0 +1,46 @@
+<?php
+
+require_once __DIR__ . '/../vendor/autoload.php';
+
+use ProxyManager\Factory\LazyLoadingGhostFactory;
+
+class Foo
+{
+    private $foo;
+
+    public function __construct()
+    {
+        sleep(5);
+    }
+
+    public function setFoo($foo)
+    {
+        $this->foo = (string) $foo;
+    }
+
+    public function getFoo()
+    {
+        return $this->foo;
+    }
+}
+
+$startTime = microtime(true);
+$factory   = new LazyLoadingGhostFactory();
+
+for ($i = 0; $i < 1000; $i += 1) {
+    $proxy = $factory->createProxy(
+        'Foo',
+        function ($proxy, $method, $parameters, & $initializer) {
+            $initializer   = null;
+            $proxy->setFoo('Hello World!');
+
+            return true;
+        }
+    );
+}
+
+var_dump('time after 1000 instantiations: ' . (microtime(true) - $startTime));
+
+echo $proxy->getFoo() . "\n";
+
+var_dump('time after single call to doFoo: ' . (microtime(true) - $startTime));
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/examples/remote-proxy.php
@@ -0,0 +1,36 @@
+<?php
+
+require_once __DIR__ . '/../vendor/autoload.php';
+
+use ProxyManager\Factory\RemoteObject\Adapter\XmlRpc;
+use ProxyManager\Factory\RemoteObjectFactory;
+use Zend\XmlRpc\Client;
+
+if (! class_exists('Zend\XmlRpc\Client')) {
+    echo "This example needs Zend\\XmlRpc\\Client to run. \n In order to install it, "
+    . "please run following:\n\n"
+    . "\$ php composer.phar require zendframework/zend-xmlrpc:2.*\n\n";
+
+    exit(2);
+}
+
+class Foo
+{
+    public function bar()
+    {
+        return 'bar local!';
+    }
+}
+
+$factory = new RemoteObjectFactory(
+    new XmlRpc(new Client('http://localhost:9876/remote-proxy/remote-proxy-server.php'))
+);
+$proxy = $factory->createProxy('Foo');
+
+try {
+    var_dump($proxy->bar()); // bar remote !
+} catch (\Zend\Http\Client\Adapter\Exception\RuntimeException $error) {
+    echo "To run this example, please following before:\n\n\$ php -S localhost:9876 -t \"" . __DIR__ . "\"\n";
+
+    exit(2);
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/examples/remote-proxy/remote-proxy-server.php
@@ -0,0 +1,20 @@
+<?php
+
+use Zend\XmlRpc\Server;
+
+require_once __DIR__ . '/../../vendor/autoload.php';
+
+class Foo
+{
+    public function bar()
+    {
+        return 'bar remote!';
+    }
+}
+
+$server = new Server();
+
+$server->setClass(new Foo(), 'Foo');
+$server->setReturnResponse(false);
+
+$server->handle();
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/examples/smart-reference.php
@@ -0,0 +1,23 @@
+<?php
+
+require_once __DIR__ . '/../vendor/autoload.php';
+
+use ProxyManager\Factory\AccessInterceptorValueHolderFactory;
+
+class Foo
+{
+    public function doFoo()
+    {
+        echo "Foo!\n";
+    }
+}
+
+$factory = new AccessInterceptorValueHolderFactory();
+
+$proxy = $factory->createProxy(
+    new Foo(),
+    array('doFoo' => function () { echo "pre-foo!\n"; }),
+    array('doFoo' => function () { echo "post-foo!\n"; })
+);
+
+$proxy->doFoo();
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/examples/virtual-proxy.php
@@ -0,0 +1,39 @@
+<?php
+
+require_once __DIR__ . '/../vendor/autoload.php';
+
+use ProxyManager\Factory\LazyLoadingValueHolderFactory;
+
+class Foo
+{
+    public function __construct()
+    {
+        sleep(5);
+    }
+
+    public function doFoo()
+    {
+        echo "Foo!";
+    }
+}
+
+$startTime = microtime(true);
+$factory   = new LazyLoadingValueHolderFactory();
+
+for ($i = 0; $i < 1000; $i += 1) {
+    $proxy = $factory->createProxy(
+        'Foo',
+        function (& $wrappedObject, $proxy, $method, $parameters, & $initializer) {
+            $initializer   = null;
+            $wrappedObject = new Foo();
+
+            return true;
+        }
+    );
+}
+
+var_dump('time after 1000 instantiations: ' . (microtime(true) - $startTime));
+
+$proxy->doFoo();
+
+var_dump('time after single call to doFoo: ' . (microtime(true) - $startTime));
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/html-docs/access-interceptor-scope-localizer-proxy.html
@@ -0,0 +1,197 @@
+<!DOCTYPE html>
+<html class="no-js" id="top">
+<head>
+    <title>ProxyManager - Tuning the ProxyManager for production</title>
+
+    <meta name="description" content="A proxyManager write in php" />
+    <meta name="keywords" content="ProxyManager, proxy, manager, ocramius, Marco Pivetta, php, production" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+    <link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600' rel='stylesheet' type='text/css'>
+    <link href="css/styles.css" rel="stylesheet" />
+    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/default.min.css">
+    <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/highlight.min.js"></script>
+    <script>hljs.initHighlightingOnLoad();</script>
+    <link rel="shortcut icon" href="favicon.ico">
+</head>
+<body>
+
+<header class="site-header">
+<div class="container">
+<h1><a href="index.html"><img alt="ProxyManager" src="img/block.png" /></a></h1>
+
+<nav class="main-nav" role="navigation">
+<ul>
+    <li><a href="https://github.com/Ocramius/ProxyManager" target="_blank">Github</a>
+    <div class="bcms-clearfix"></div>
+</li>
+</ul>
+</nav>
+</div>
+</header>
+<main role="main">
+<section class="component-content">
+
+<div class="component-demo" id="live-demo">
+    <div class="container">
+            <div class="main-wrapper" style="text-align: right">
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=fork&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="310" height="40"></iframe>
+
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=watch&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="200" height="40"></iframe>
+
+            </div>
+        <div class="bcms-clearfix bcms-clearfix"></div>
+    </div>
+</div>
+<div class="component-info">
+<div class="container">
+<aside class="sidebar">
+    <nav class="spy-nav">
+        <ul>
+            <li><a href="index.html">Intro</a></li>
+            <li><a href="virtual-proxy.html">Virtual Proxy</a></li>
+            <li><a href="null-object.html">Null Objects</a></li>
+            <li><a href="ghost-object.html">Ghost Objects</a></li>
+            <li><a href="remote-object.html">Remote Object</a></li>
+            <li><a href="contributing.html">Contributing</a></li>
+            <li><a href="credits.html">Credits</a></li>
+            <li><a href="copyright.html">Copyright</a></li>
+        </ul>
+    </nav>
+<div class="bcms-clearfix bcms-clearfix"></div>
+<a class="btn btn-action btn-full download-component"
+    href="download.html">Download</a>
+    <div class="bcms-clearfix"></div>
+</aside>
+
+<div class="content">
+    <div class="bcms-clearfix"></div>
+    <h3 class="section-title">Access Interceptor Scope Localizer Proxy</h3>
+
+    <p>An access interceptor scope localizer is a smart reference proxy that allows you to dynamically define logic to be executed before or after any of the proxied object's methods' logic.</p>
+    
+    <p>It works exactly like the <a href="access-interceptor-value-holder-proxy.html">access interceptor value holder</a>, with some minor differences in behavior.</p>
+
+    <p>The working concept of an access interceptor scope localizer is to localize scope of a proxied object:</p>
+   
+    <pre>
+        <code class="php">
+class Example
+{
+    protected $foo;
+    protected $bar;
+    protected $baz;
+
+    public function doFoo()
+    {
+        // ...
+    }
+}
+
+class ExampleProxy extends Example
+{
+    public function __construct(Example $example)
+    {
+        $this->foo = &amp; $example->foo;
+        $this->bar = &amp; $example->bar;
+        $this->baz = &amp; $example->baz;
+    }
+
+    public function doFoo()
+    {
+        return parent::doFoo();
+    }
+}
+        </code>
+    </pre>
+
+    <p>This allows to create a mirror copy of the real instance, where any change in the proxy or in the real instance is reflected in both objects.</p>
+
+    <p>The main advantage of this approach is that the proxy is now safe against fluent interfaces, which would break an <a href="access-interceptor-value-holder-proxy.html">access interceptor value holder</a> instead.</p>
+<hr />    
+    <h3>Differences with <a href="access-interceptor-value-holder-proxy.html">access interceptor value holder</a>:</h3>
+    
+    <ul>
+        <li>It does <strong>NOT</strong> implement the <code>ProxyManager\Proxy\ValueHolderInterface</code>, since the proxy itself does not keep a reference to the original object being proxied</li>
+        <li>In all interceptor methods (see <a href="access-interceptor-value-holder-proxy.html">access interceptor value holder</a>), the $instance passed in is the proxy itself. There is no way to gather a reference to the original object right now, and that's mainly to protect from misuse.</li>
+    </ul>
+<hr />
+
+    <h3>Known limitations</h3>
+
+    <ul>
+        <li>It is <strong>NOT</strong> possible to intercept access to public properties</li>
+        <li>It is <strong>NOT</strong> possible to proxy interfaces, since this proxy relies on <code>parent::method()</code> calls. Interfaces obviously don't provide a parent method implementation.</li>
+        <li>calling unset on a property of an access interceptor scope localizer (or the real instance) will cause the two objects to be un-synchronized, with possible unexpected behaviour.</li>
+        <li>serializing or un-serializing an access interceptor scope localizer (or the real instance) will not cause the real instance (or the proxy) to be serialized or un-serialized</li>
+        <li>if a proxied object contains private properties, then an exception will be thrown if you use PHP <code>&lt; 5.4.0</code>.</li>
+    </ul>
+<hr />
+    <h3>Example</h3>
+
+    <p>Here's an example of how you can create and use an access interceptor scope localizer :</p>
+
+    <pre>
+        <code class="php">
+&lt;?php
+
+use ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory as Factory;
+
+require_once __DIR__ . '/vendor/autoload.php';
+
+class Foo
+{
+    public function doFoo()
+    {
+        echo "Foo!\n";
+    }
+}
+
+$factory = new Factory();
+
+$proxy = $factory->createProxy(
+    new Foo(),
+    array('doFoo' => function () { echo "PreFoo!\n"; }),
+    array('doFoo' => function () { echo "PostFoo!\n"; })
+);
+
+$proxy->doFoo();
+        </code>
+    </pre>
+
+    <p>This send something like following to your output:</p>
+
+    <pre>
+        <code class="php">
+PreFoo!
+Foo!
+PostFoo!
+        </code>
+    </pre>
+
+    <p>This is pretty much the same logic that you can find in <a href="access-interceptor-value-holder-proxy.html">access interceptor value holder</a>.</p>
+    
+</main>
+
+    <footer class="site-footer" role="contentinfo">
+        <div class="container">
+            <div class="footer-logos">
+                <ul>
+                    <li><a href="index.html">Intro</a> | </li>
+                    <li><a href="virtual-proxy.html">Virtual Proxy</a> | </li>
+                    <li><a href="null-object.html">Null Objects</a> | </li>
+                    <li><a href="ghost-object.html">Ghost Objects</a> | </li>
+                    <li><a href="remote-object.html">Remote Object</a> | </li>
+                    <li><a href="contributing.html">Contributing</a> | </li>
+                    <li><a href="credits.html">Credits</a> | </li>
+                    <li><a href="copyright.html">Copyright</a></li>
+                </ul>
+            </div>
+        </div>
+
+        <div class="bcms-clearfix"></div>
+    </footer>
+    <div class="bcms-clearfix"></div>
+    </body>
+</html>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/html-docs/access-interceptor-value-holder-proxy.html
@@ -0,0 +1,208 @@
+<!DOCTYPE html>
+<html class="no-js" id="top">
+<head>
+    <title>ProxyManager - Tuning the ProxyManager for production</title>
+
+    <meta name="description" content="A proxyManager write in php" />
+    <meta name="keywords" content="ProxyManager, proxy, manager, ocramius, Marco Pivetta, php, production" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+    <link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600' rel='stylesheet' type='text/css'>
+    <link href="css/styles.css" rel="stylesheet" />
+    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/default.min.css">
+    <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/highlight.min.js"></script>
+    <script>hljs.initHighlightingOnLoad();</script>
+    <link rel="shortcut icon" href="favicon.ico">
+</head>
+<body>
+
+<header class="site-header">
+<div class="container">
+<h1><a href="index.html"><img alt="ProxyManager" src="img/block.png" /></a></h1>
+
+<nav class="main-nav" role="navigation">
+<ul>
+    <li><a href="https://github.com/Ocramius/ProxyManager" target="_blank">Github</a>
+    <div class="bcms-clearfix"></div>
+</li>
+</ul>
+</nav>
+</div>
+</header>
+<main role="main">
+<section class="component-content">
+
+<div class="component-demo" id="live-demo">
+    <div class="container">
+            <div class="main-wrapper" style="text-align: right">
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=fork&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="310" height="40"></iframe>
+
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=watch&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="200" height="40"></iframe>
+
+            </div>
+        <div class="bcms-clearfix bcms-clearfix"></div>
+    </div>
+</div>
+<div class="component-info">
+<div class="container">
+<aside class="sidebar">
+    <nav class="spy-nav">
+        <ul>
+            <li><a href="index.html">Intro</a></li>
+            <li><a href="virtual-proxy.html">Virtual Proxy</a></li>
+            <li><a href="null-object.html">Null Objects</a></li>
+            <li><a href="ghost-object.html">Ghost Objects</a></li>
+            <li><a href="remote-object.html">Remote Object</a></li>
+            <li><a href="contributing.html">Contributing</a></li>
+            <li><a href="credits.html">Credits</a></li>
+            <li><a href="copyright.html">Copyright</a></li>
+        </ul>
+    </nav>
+<div class="bcms-clearfix bcms-clearfix"></div>
+<a class="btn btn-action btn-full download-component"
+    href="download.html">Download</a>
+    <div class="bcms-clearfix"></div>
+</aside>
+
+<div class="content">
+    <div class="bcms-clearfix"></div>
+    <h3 class="section-title">Access Interceptor Value Holder Proxy</h3>
+
+    <p>An access interceptor value holder is a smart reference proxy that allows you to dynamically define logic to be executed before or after any of the wrapped object's methods logic.</p>
+    
+    <p>It wraps around a real instance of the object to be proxied, and can be useful for things like:</p>
+
+    <ul>
+        <li>caching execution of slow and heavy methods</li>
+        <li>log method calls</li>
+        <li>debugging</li>
+        <li>event triggering</li>
+        <li>handling of orthogonal logic, and <a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming" target="_blank">AOP</a> in general</li>
+    </ul>
+<hr />    
+    <h3>Example</h3>
+
+    <p>Here's an example of how you can create and use an access interceptor value holder:</p>
+
+    <pre>
+        <code class="php">
+&lt;?php
+
+use ProxyManager\Factory\AccessInterceptorValueHolderFactory as Factory;
+
+require_once __DIR__ . '/vendor/autoload.php';
+
+class Foo
+{
+    public function doFoo()
+    {
+        echo "Foo!\n";
+    }
+}
+
+$factory = new Factory();
+
+$proxy = $factory->createProxy(
+    new Foo(),
+    array('doFoo' => function () { echo "PreFoo!\n"; }),
+    array('doFoo' => function () { echo "PostFoo!\n"; })
+);
+
+$proxy->doFoo();
+        </code>
+    </pre>
+
+    <p>This send something like following to your output:</p>
+
+    <pre>
+        <code class="php">
+PreFoo!
+Foo!
+PostFoo!
+        </code>
+    </pre>
+
+<hr />
+    <h3>Implementing pre- and post- access interceptors</h3>
+
+    <p>A proxy produced by the <code><a href="https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/Factory/AccessInterceptorValueHolderFactory.php" target="_blank">ProxyManager\Factory\AccessInterceptorValueHolderFactory</a></code> implements both the <code><a href="https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/Proxy/ValueHolderInterface.php" target="_blank">ProxyManager\Proxy\ValueHolderInterface</a></code> and the <code><a href="https://github.com/Ocramius/ProxyManager/blob/master/src/ProxyManager/Proxy/ValueHolderInterface.php" target="_blank">ProxyManager\Proxy\AccessInterceptorInterface</a></code>.</p>
+
+
+    <p>Therefore, you can set an access interceptor callback by calling:</p>
+
+    <pre>
+        <code class="php">
+$proxy->setMethodPrefixInterceptor('methodName', function () { echo 'pre'; });
+$proxy->setMethodSuffixInterceptor('methodName', function () { echo 'post'; });
+        </code>
+    </pre>
+
+    <p>You can also listen to public properties access by attaching interceptors to <code>__get</code>, <code>__set</code>, <code>__isset</code> and <code>__unset</code>.</p>
+
+    <p>A prefix interceptor (executed before method logic) should have following signature:</p>
+
+    <pre>
+        <code class="php">
+/**
+ * @var object $proxy       the proxy that intercepted the method call
+ * @var object $instance    the wrapped instance within the proxy
+ * @var string $method      name of the called method
+ * @var array  $params      sorted array of parameters passed to the intercepted
+ *                          method, indexed by parameter name
+ * @var bool   $returnEarly flag to tell the interceptor proxy to return early, returning
+ *                          the interceptor's return value instead of executing the method logic
+ *
+ * @return mixed
+ */
+$prefixInterceptor = function ($proxy, $instance, $method, $params, &amp; $returnEarly) {};
+        </code>
+    </pre>
+
+    A suffix interceptor (executed after method logic) should have following signature:
+
+    <pre>
+        <code class="php">
+/**
+ * @var object $proxy       the proxy that intercepted the method call
+ * @var object $instance    the wrapped instance within the proxy
+ * @var string $method      name of the called method
+ * @var array  $params      sorted array of parameters passed to the intercepted
+ *                          method, indexed by parameter name
+ * @var mixed  $returnValue the return value of the intercepted method
+ * @var bool   $returnEarly flag to tell the proxy to return early, returning the interceptor's
+ *                          return value instead of the value produced by the method
+ *
+ * @return mixed
+ */
+$suffixInterceptor = function ($proxy, $instance, $method, $params, $returnValue, & $returnEarly) {};
+        </code>
+    </pre>
+
+<hr />
+    <h3>Tuning performance for production</h3>
+
+    <p>See <a href="production.html">Tuning ProxyManager for Production</a>.</p>
+</main>
+
+    <footer class="site-footer" role="contentinfo">
+        <div class="container">
+            <div class="footer-logos">
+                <ul>
+                    <li><a href="index.html">Intro</a> | </li>
+                    <li><a href="virtual-proxy.html">Virtual Proxy</a> | </li>
+                    <li><a href="null-object.html">Null Objects</a> | </li>
+                    <li><a href="ghost-object.html">Ghost Objects</a> | </li>
+                    <li><a href="remote-object.html">Remote Object</a> | </li>
+                    <li><a href="contributing.html">Contributing</a> | </li>
+                    <li><a href="credits.html">Credits</a> | </li>
+                    <li><a href="copyright.html">Copyright</a></li>
+                </ul>
+            </div>
+        </div>
+
+        <div class="bcms-clearfix"></div>
+    </footer>
+    <div class="bcms-clearfix"></div>
+    </body>
+</html>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/html-docs/contributing.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<html class="no-js" id="top">
+<head>
+    <title>ProxyManager - Contributing</title>
+
+    <meta name="description" content="A proxyManager write in php" />
+    <meta name="keywords" content="ProxyManager, proxy, manager, ocramius, Marco Pivetta, php, contributing" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+    <link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600' rel='stylesheet' type='text/css'>
+    <link href="css/styles.css" rel="stylesheet" />
+    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/default.min.css">
+    <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/highlight.min.js"></script>
+    <script>hljs.initHighlightingOnLoad();</script>
+    <link rel="shortcut icon" href="favicon.ico">
+</head>
+<body>
+
+<header class="site-header">
+<div class="container">
+<h1><a href="index.html"><img alt="ProxyManager" src="img/block.png" /></a></h1>
+
+<nav class="main-nav" role="navigation">
+<ul>
+    <li><a href="https://github.com/Ocramius/ProxyManager" target="_blank">Github</a>
+    <div class="bcms-clearfix"></div>
+</li>
+</ul>
+</nav>
+</div>
+</header>
+<main role="main">
+<section class="component-content">
+
+<div class="component-demo" id="live-demo">
+    <div class="container">
+            <div class="main-wrapper" style="text-align: right">
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=fork&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="310" height="40"></iframe>
+
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=watch&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="200" height="40"></iframe>
+
+            </div>
+        <div class="bcms-clearfix bcms-clearfix"></div>
+    </div>
+</div>
+<div class="component-info">
+<div class="container">
+<aside class="sidebar">
+    <nav class="spy-nav">
+        <ul>
+            <li><a href="index.html">Intro</a></li>
+            <li><a href="virtual-proxy.html">Virtual Proxy</a></li>
+            <li><a href="null-object.html">Null Objects</a></li>
+            <li><a href="ghost-object.html">Ghost Objects</a></li>
+            <li><a href="remote-object.html">Remote Object</a></li>
+            <li><a href="contributing.html">Contributing</a></li>
+            <li><a href="credits.html">Credits</a></li>
+            <li><a href="copyright.html">Copyright</a></li>
+        </ul>
+    </nav>
+<div class="bcms-clearfix bcms-clearfix"></div>
+<a class="btn btn-action btn-full download-component"
+    href="download.html">Download</a>
+    <div class="bcms-clearfix"></div>
+</aside>
+
+<div class="content">
+    <div class="bcms-clearfix"></div>
+    <h3 class="section-title">Contributing</h3>
+
+    <ul>
+        <li>Coding standard for the project is <a href="https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md" target-"_blank">PSR-2</a></li>
+        <li>The project will follow strict <a href="http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php" target-"_blank">object calisthenics</a></li>
+        <li>Any contribution must provide tests for additional introduced conditions</li>
+        <li>Any un-confirmed issue needs a failing test case before being accepted</li>
+        <li>Pull requests must be sent from a new hotfix/feature branch, not from master.</li>
+    </ul>
+
+    
+<hr />
+
+    <h3 class="section-title">Installation</h3>
+
+    <p>To install the project and run the tests, you need to clone it first:</p>
+
+    <pre>
+        <code class="sh">
+$ git clone git://github.com/Ocramius/ProxyManager.git
+            </code>
+    </pre>
+
+    <p>You will then need to run a composer installation:</p>
+
+    <pre>
+        <code class="sh">
+$ cd ProxyManager
+$ curl -s https://getcomposer.org/installer | php
+$ php composer.phar update
+        </code>
+    </pre>
+
+<hr />
+
+    <h3 class="section-title">Testing</h3>
+
+    <p>The PHPUnit version to be used is the one installed as a dev- dependency via composer:</p>
+    
+    <pre>
+        <code class="sh">
+$ ./vendor/bin/phpunit
+        </code>
+    </pre>
+
+    <p>Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement won't be merged.</p>
+
+</main>
+
+    <footer class="site-footer" role="contentinfo">
+        <div class="container">
+            <div class="footer-logos">
+                <ul>
+                    <li><a href="index.html">Intro</a> | </li>
+                    <li><a href="virtual-proxy.html">Virtual Proxy</a> | </li>
+                    <li><a href="null-object.html">Null Objects</a> | </li>
+                    <li><a href="ghost-object.html">Ghost Objects</a> | </li>
+                    <li><a href="remote-object.html">Remote Object</a> | </li>
+                    <li><a href="contributing.html">Contributing</a> | </li>
+                    <li><a href="credits.html">Credits</a> | </li>
+                    <li><a href="copyright.html">Copyright</a></li>
+                </ul>
+            </div>
+        </div>
+
+        <div class="bcms-clearfix"></div>
+    </footer>
+    <div class="bcms-clearfix"></div>
+    </body>
+</html>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/html-docs/copyright.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html>
+<html class="no-js" id="top">
+<head>
+    <title>ProxyManager</title>
+
+    <meta name="description" content="A proxyManager write in php" />
+    <meta name="keywords" content="ProxyManager, proxy, manager, ocramius, Marco Pivetta, php" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+    <link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600' rel='stylesheet' type='text/css'>
+    <link href="css/styles.css" rel="stylesheet" />
+
+    <link rel="shortcut icon" href="favicon.ico">
+</head>
+<body>
+
+<header class="site-header">
+<div class="container">
+<h1><a href="index.html"><img alt="ProxyManager" src="img/block.png" /></a></h1>
+
+<nav class="main-nav" role="navigation">
+<ul>
+    <li><a href="https://github.com/Ocramius/ProxyManager" target="_blank">Github</a>
+    <div class="bcms-clearfix"></div>
+</li>
+</ul>
+</nav>
+</div>
+</header>
+<main role="main">
+<section class="component-content">
+
+<div class="component-demo" id="live-demo">
+    <div class="container">
+            <div class="main-wrapper" style="text-align: right">
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=fork&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="310" height="40"></iframe>
+
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=watch&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="200" height="40"></iframe>
+
+            </div>
+        <div class="bcms-clearfix bcms-clearfix"></div>
+    </div>
+</div>
+<div class="component-info">
+<div class="container">
+<aside class="sidebar">
+    <nav class="spy-nav">
+        <ul>
+            <li><a href="index.html">Intro</a></li>
+            <li><a href="virtual-proxy.html">Virtual Proxy</a></li>
+            <li><a href="null-object.html">Null Objects</a></li>
+            <li><a href="ghost-object.html">Ghost Objects</a></li>
+            <li><a href="remote-object.html">Remote Object</a></li>
+            <li><a href="contributing.html">Contributing</a></li>
+            <li><a href="credits.html">Credits</a></li>
+            <li><a href="copyright.html">Copyright</a></li>
+        </ul>
+    </nav>
+<div class="bcms-clearfix bcms-clearfix"></div>
+<a class="btn btn-action btn-full download-component"
+    href="download.html">Download</a>
+    <div class="bcms-clearfix"></div>
+</aside>
+
+<div class="content">
+    <div class="bcms-clearfix"></div>
+    <h3 class="section-title">License</h3>
+    <p>Copyright (c) 2013 Marco Pivetta</p>
+
+    <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>
+
+    <p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</p>
+
+    <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p>
+<hr />
+
+</main>
+
+    <footer class="site-footer" role="contentinfo">
+        <div class="container">
+            <div class="footer-logos">
+                <ul>
+                    <li><a href="index.html">Intro</a> | </li>
+                    <li><a href="virtual-proxy.html">Virtual Proxy</a> | </li>
+                    <li><a href="null-object.html">Null Objects</a> | </li>
+                    <li><a href="ghost-object.html">Ghost Objects</a> | </li>
+                    <li><a href="remote-object.html">Remote Object</a> | </li>
+                    <li><a href="contributing.html">Contributing</a> | </li>
+                    <li><a href="credits.html">Credits</a> | </li>
+                    <li><a href="copyright.html">Copyright</a></li>
+                </ul>
+            </div>
+        </div>
+
+        <div class="bcms-clearfix"></div>
+    </footer>
+    <div class="bcms-clearfix"></div>
+    </body>
+</html>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/html-docs/credits.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html>
+<html class="no-js" id="top">
+<head>
+    <title>ProxyManager - Credits</title>
+
+    <meta name="description" content="A proxyManager write in php" />
+    <meta name="keywords" content="ProxyManager, proxy, manager, ocramius, Marco Pivetta, php, credits" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+    <link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600' rel='stylesheet' type='text/css'>
+    <link href="css/styles.css" rel="stylesheet" />
+
+    <link rel="shortcut icon" href="favicon.ico">
+</head>
+<body>
+
+<header class="site-header">
+<div class="container">
+<h1><a href="index.html"><img alt="ProxyManager" src="img/block.png" /></a></h1>
+
+<nav class="main-nav" role="navigation">
+<ul>
+    <li><a href="https://github.com/Ocramius/ProxyManager" target="_blank">Github</a>
+    <div class="bcms-clearfix"></div>
+</li>
+</ul>
+</nav>
+</div>
+</header>
+<main role="main">
+<section class="component-content">
+
+<div class="component-demo" id="live-demo">
+    <div class="container">
+            <div class="main-wrapper" style="text-align: right">
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=fork&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="310" height="40"></iframe>
+
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=watch&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="200" height="40"></iframe>
+
+            </div>
+        <div class="bcms-clearfix bcms-clearfix"></div>
+    </div>
+</div>
+<div class="component-info">
+<div class="container">
+<aside class="sidebar">
+    <nav class="spy-nav">
+        <ul>
+            <li><a href="index.html">Intro</a></li>
+            <li><a href="virtual-proxy.html">Virtual Proxy</a></li>
+            <li><a href="null-object.html">Null Objects</a></li>
+            <li><a href="ghost-object.html">Ghost Objects</a></li>
+            <li><a href="remote-object.html">Remote Object</a></li>
+            <li><a href="contributing.html">Contributing</a></li>
+            <li><a href="credits.html">Credits</a></li>
+            <li><a href="copyright.html">Copyright</a></li>
+        </ul>
+    </nav>
+<div class="bcms-clearfix bcms-clearfix"></div>
+<a class="btn btn-action btn-full download-component"
+    href="download.html">Download</a>
+    <div class="bcms-clearfix"></div>
+</aside>
+
+<div class="content">
+    <div class="bcms-clearfix"></div>
+    <h3 class="section-title">Credits</h3>
+
+    <p>The idea was originated by a <a href="http://marco-pivetta.com/proxy-pattern-in-php/" target="_blank">talk about Proxies in PHP OOP</a> that I gave at the <a href="https://twitter.com/phpugffm" target="_blank">@phpugffm</a> in January 2013.</p>
+<hr />
+    <h3>Contributors</h3>
+
+    <ul>
+        <li><a href="https://github.com/Ocramius" target="_blank">Marco Pivetta</a></li>
+        <li><a href="https://github.com/malukenho" target="_blank">Jefersson Nathan</a></li>
+        <li><a href="https://github.com/blanchonvincent" target="_blank">Blanchon Vincent</a></li>
+        <li><a href="https://github.com/staabm" target="_blank">Markus Staab</a></li>
+        <li><a href="https://github.com/gws" target="_blank">Gordon Stratton</a></li>
+        <li><a href="https://github.com/prolic" target="_blank">Prolic</a></li>
+        <li><a href="https://github.com/guilro" target="_blank">Guillaume Royer</a></li>
+        <li><a href="https://github.com/reiz" target="_blank">Robert Reiz</a></li>
+        <li><a href="https://github.com/leedavis81" target="_blank">Lee Davis</a></li>
+        <li><a href="https://github.com/flip111" target="_blank">flip111</a></li>
+        <li><a href="https://github.com/krymen" target="_blank">Krzysztof Menzyk</a></li>
+        <li><a href="https://github.com/Xerkus" target="_blank">Aleksey Khudyakov</a></li>
+        <li><a href="https://github.com/asm89" target="_blank">Alexander</a></li>
+        <li><a href="https://github.com/raulfraile" target="_blank">Raul Fraile</a></li>
+    </ul>
+
+</main>
+
+    <footer class="site-footer" role="contentinfo">
+        <div class="container">
+            <div class="footer-logos">
+                <ul>
+                    <li><a href="index.html">Intro</a> | </li>
+                    <li><a href="virtual-proxy.html">Virtual Proxy</a> | </li>
+                    <li><a href="null-object.html">Null Objects</a> | </li>
+                    <li><a href="ghost-object.html">Ghost Objects</a> | </li>
+                    <li><a href="remote-object.html">Remote Object</a> | </li>
+                    <li><a href="contributing.html">Contributing</a> | </li>
+                    <li><a href="credits.html">Credits</a> | </li>
+                    <li><a href="copyright.html">Copyright</a></li>
+                </ul>
+            </div>
+        </div>
+
+        <div class="bcms-clearfix"></div>
+    </footer>
+    <div class="bcms-clearfix"></div>
+    </body>
+</html>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/html-docs/css/styles.css
@@ -0,0 +1,203 @@
+html { font-family: sans-serif; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; }
+body { margin: 0; }
+article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; }
+audio, canvas, progress, video { display: inline-block; vertical-align: baseline; }
+audio:not([controls]) { display: none; height: 0; }
+[hidden], template { display: none; }
+a { background: transparent; }
+a:active, a:hover { outline: 0; }
+abbr[title] { border-bottom: 1px dotted; }
+b, strong { font-weight: bold; }
+dfn { font-style: italic; }
+h1 { font-size: 2em; margin: 0.67em 0; }
+mark { background: #ff0; color: #000; }
+small { font-size: 80%; }
+sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
+sup { top: -0.5em; }
+sub { bottom: -0.25em; }
+img { border: 0; }
+svg:not(:root) { overflow: hidden; }
+figure { margin: 1em 40px; }
+hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; }
+pre { overflow: auto; }
+code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; }
+button, input, optgroup, select, textarea { color: inherit; font: inherit; margin: 0; }
+button { overflow: visible; }
+button, select { text-transform: none; }
+button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; cursor: pointer; }
+button[disabled], html input[disabled] { cursor: default; }
+button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
+input { line-height: normal; }
+input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; }
+input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; }
+input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; }
+input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
+fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; }
+legend { border: 0; padding: 0; }
+textarea { overflow: auto; }
+optgroup { font-weight: bold; }
+table { border-collapse: collapse; border-spacing: 0; }
+td, th { padding: 0; }
+h1, h2, h3, h4, h5, h6, p, ul, ol, li { margin: 0; padding: 0; line-height: normal; }
+a { color: #31811D; text-decoration: none; }
+a:hover { color: #2F611C; text-decoration: none; }
+strong { font-weight: 600; }
+h3 { margin-bottom: 1em; color: #17324f; font-weight: 400; font-size: 3em; }
+h4 { margin-bottom: 1em; font-weight: 400; font-size: 1.375em; }
+p { margin-bottom: 1.5em; font-size: 1.125em; }
+hr { margin: 2.5em 0; padding: 0; width: 100%; height: 3px; border: 0; background: #e6eaef; }
+pre code { padding: 20px; border: 1px solid #EBEBEB; background: #F5F5F5; color: #08468a; font-weight: 200; font-size: .875em; }
+code { background: transparent; color: #08468a; font-size: .875em; }
+form { margin: 0; }
+label { display: block; color: #18324f; font-weight: 400; font-size: 1.5em; margin-bottom: 2em; }
+legend { position: static; margin: 0; padding: 0; font-weight: normal; }
+legend span { position: absolute; top: 0; right: 0; left: 0; display: block; padding: 7px 0; border-bottom: 1px solid #e0dede; color: #ed4a21; font-size: 18px; line-height: 1em; }
+
+/* Menu Sidebar*/ 
+.button-block { padding-top: 15px; }
+.button-block .btn-1 { margin-right: 6px; }
+.btn, .spy-nav a { position: relative; display: inline-block; margin: 0; padding: 0 20px; height: 57px; border: 0; vertical-align: top; text-align: center; text-transform: uppercase; font-weight: 400; font-size: 1.125em; transitionP: all .2s; line-height: 57px; }
+.btn.btn-action, .spy-nav a.btn-action { background: #ee2d4d; color: #fff; }
+.btn.btn-action:hover, .spy-nav a.btn-action:hover { background: #bf0f2d; }
+.btn.btn-default, .spy-nav a { background: #31811D; color: #fff; }
+.btn.btn-default:hover, .spy-nav a:hover { background: #2F611C; color: #fff; }
+.btn.btn-text, .spy-nav a.btn-text { color: #18324f; font-weight: 600; }
+.btn.btn-full, .spy-nav a { display: block; }
+@media only screen and (max-width: 480px) { 
+	.site-header{ position: fixed !important; top: 0; z-index: 999999}
+	.page-title-wrapper{ margin-top: 70px;}
+	.main-wrapper iframe{ width: 42% !important; float: left; margin-left: 8%;}
+	.content iframe{width: 100%; height: 100%;}
+}
+
+.btn-top { position: relative; display: inline-block; float: right; margin: 20px 0 0; padding: 0 30px 0 50px; height: 57px; border: 2px solid ##31811D; color: #31811D; vertical-align: top; text-align: center; text-transform: uppercase; font-weight: 600; font-size: 1.125em; line-height: 53px; transition: all .2s; }
+.btn-top:before { background-position: 0 -140px; width: 52px; height: 52px; position: absolute; top: 0; left: 0; content: ''; }
+@media only screen and (min-resolution: 2dppx), (-webkit-min-device-pixel-ratio: 2) { .btn-top:before { background-position: 0 -140px; background-size: 152px auto; width: 52px; height: 52px; } }
+.btn-top:hover { border-color: #2F611C; color: #2F611C; }
+@media only screen and (max-width: 768px) { .btn-top { float: none; margin-top: 0; margin-bottom: 30px; white-space: nowrap; } }
+@media only screen and (max-width: 480px) { .btn-top { font-size: 0.9em; line-height: 46px; height: 48px; padding-right: 22px; padding-left: 47px; } }
+
+.btn-download { float: right; padding-left: 50px; }
+.btn-download:before { background-position: -18px -116px; width: 16px; height: 16px; position: absolute; top: 50%; left: 20px; margin-top: -7px; content: ''; }
+@media only screen and (min-resolution: 2dppx), (-webkit-min-device-pixel-ratio: 2) { .btn-download:before { background-position: -18px -116px; background-size: 152px auto; width: 16px; height: 16px; } }
+
+.btn-done { float: right; padding-left: 50px; }
+.btn-done:before { background-position: 0 -116px; width: 18px; height: 14px; position: absolute; top: 50%; margin-top: -7px; left: 20px; content: ''; }
+@media only screen and (min-resolution: 2dppx), (-webkit-min-device-pixel-ratio: 2) { .btn-done:before { background-position: 0 -116px; background-size: 152px auto; width: 18px; height: 13.5px; margin-top: -6.75px; } }
+
+.btn-cancel { float: right; }
+
+*, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; }
+
+html { -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; min-width: 280px; }
+@media only screen and (min-width: 64.063em) and (max-width: 90em) { html { min-width: 960px; } }
+
+body { font-size: 16px; font-family: 'Source Sans Pro', sans-serif; min-width: 290px; }
+@media only screen and (max-width: 480px) { body.page-home { background-image: none; } }
+
+img { max-width: 100%; height: auto !important; }
+
+input { -webkit-appearance: none; -webkit-border-radius: 0; border-radius: 0; }
+
+main { overflow: hidden; }
+
+.clearfix:after { content: ""; display: table; clear: both; }
+
+.container { width: 60em; margin-left: auto; margin-right: auto; }
+.container:after { content: " "; display: block; clear: both; }
+@media only screen and (max-width: 1024px) { .container { margin-left: 15px; margin-right: 15px; width: auto; } }
+
+.content ul { padding-left: 19px; list-style-type: square; margin-top: 15px; }
+
+/* Menu top */
+.main-nav { float: right; }
+.fixed-wrapper .main-nav { display: none; }
+.active .main-nav { display: block; }
+.main-nav > ul { list-style: none; }
+.main-nav > ul > li { float: left; }
+.main-nav > ul > li > a { display: block; padding: 22px 30px; color: #fff; text-decoration: none; text-transform: uppercase; font-weight: 600; font-size: 1.375em; line-height: 29px; transition: all .2s; }
+.main-nav > ul > li > a:hover { color: #bfe5f1; background-color: #2F611C; }
+.main-nav > ul > li > a.active { background-color: #2F611C; color: #fff; }
+.main-nav > ul > li > a.opened { background-color: #18324f; }
+@media only screen and (max-width: 600px) { .main-nav { font-size: 0.86em; }
+  .main-nav > ul > li > a { padding-left: 18px; padding-right: 18px; } }
+@media only screen and (max-width: 480px) { .main-nav > ul > li > a { font-size: 0.95em; padding: 22px 6px; } }
+
+.site-header { position: relative; width: 100%; background: #31811D; }
+.site-header h1 { float: left; margin: 15px 0; }
+.site-header h1 a { display: block; }
+.site-header h1 img { display: block; max-height: 42px; }
+@media only screen and (max-width: 480px) { .site-header h1 img { max-height: 42px; } }
+
+.page-title-wrapper { position: relative; padding: 26px 0 55px; text-align: center; }
+.page-title-wrapper .page-title { margin-top: 44px; color: #17324f; font-weight: 400; font-size: 3.75em; }
+.page-title-wrapper .linguistics { padding: 0 2em 13px; border-bottom: 1px solid #D4DBE3; color: #18324f; text-transform: uppercase; font-weight: 400; font-size: 1.25em; }
+@media only screen and (max-width: 768px) { .page-title-wrapper { font-size: 0.8em; } }
+@media only screen and (max-width: 480px) { .page-title-wrapper { font-size: 0.65em; } }
+
+.site-footer { margin-top: 20px; padding-top: 50px; padding-bottom: 50px; background: #18324f; color: #7c8ea3; text-align: center; }
+.site-footer .container { position: relative; }
+.site-footer + .bcms-clearfix:after { content: ""; }
+.about + .site-footer .main { padding-top: 150px; }
+.footer-logos ul li{ list-style: none; display: inline-block;}
+.footer-logos ul li a{ padding-left: 10px; padding-right: 10px}
+.site-footer a{ color: white !important;}
+.site-footer p { text-align: left; display: block; margin-bottom: 1.5em; font-size: 1.125em; }
+@media only screen and (max-width: 1024px) { .site-footer p { margin-left: 0; } }
+@media only screen and (max-width: 768px) { .site-footer p { text-align: center; margin-left: auto; } }
+@media only screen and (max-width: 600px) { .site-footer { font-size: 0.9em; } }
+
+.main-logo { display: block; float: left; margin: 30px 0; }
+.fixed-wrapper .main-logo { display: none; }
+.main-logo img { display: block; }
+.main-logo figure { position: relative; margin: 0; max-width: 56px; }
+.main-logo figcaption { position: absolute; width: 160px; top: 20px; left: 68px; }
+.active .main-logo { display: block; margin: 0; }
+.active .main-logo figure { max-width: 42px; }
+.active .main-logo figcaption { width: 120px; top: 15px; left: 55px; }
+@media only screen and (max-width: 480px) { .main-logo figcaption { display: none; } }
+
+.container { width: 60em; margin-left: auto; margin-right: auto; }
+.container:after { content: " "; display: block; clear: both; }
+@media only screen and (max-width: 1024px) { .container { margin-left: 15px; margin-right: 15px; width: auto; } }
+
+.component-demo { position: relative; padding: 1px 0 0; background: #e6eaef; }
+.component-demo:before { background-image: url("../img/enf.png"); }
+@media only screen and (max-width: 480px) { .component-demo { padding: 40px 0 0; } }
+
+.component-info .container { position: relative; }
+.component-info .sidebar { width: 220px; float: left; margin-top: 75px; }
+.component-info .sidebar .component-meta { margin-top: 10px; font-size: 1.125em; }
+.component-info .sidebar .component-meta span { white-space: nowrap; margin-bottom: 10px; padding-left: 25px; color: #18324f; }
+.component-info .sidebar.sticky { position: fixed; margin-top: 38px; }
+.component-info .content { width: 64.58333333%; float: right; margin-top: 60px; margin-bottom: 75px; }
+.component-info .content h3 { margin-bottom: .75em; font-size: 2.75em; }
+.component-info .content p { margin-bottom: 1.75em; line-height: 1.45; }
+@media only screen and (max-width: 480px) { .component-info .content .section-title { font-size: 2.1em; } }
+@media only screen and (max-width: 768px) { .component-info .sidebar { float: none; margin-left: auto; margin-right: auto; }
+  .component-info .sidebar .component-meta { margin-top: 30px; text-align: center; }
+  .component-info .sidebar.sticky { position: relative; margin-top: 75px; }
+  .component-info .content { float: none; width: 100%; } }
+@media only screen and (max-width: 480px) { .component-info .content { margin-bottom: 0; } }
+
+.spy-nav { margin-bottom: 10px; }
+.spy-nav ul { list-style: none; }
+.spy-nav a { padding-top: 9px; padding-bottom: 10px; height: auto; border-bottom: 1px solid #4B8B20; text-align: left; text-transform: none; font-size: 1.375em; line-height: normal; }
+.spy-nav .active a { border-bottom-color: #fff; background: #fff; color: #17324f; }
+@media only screen and (max-width: 768px) { /*.spy-nav { display: none; } */}
+
+.main-wrapper { margin: 44px auto 44px; max-width: 600px; }
+.main-wrapper label { display: block; margin-bottom: .75em; color: #3f4e5e; font-size: 1.25em; }
+.main-wrapper .text-field { padding: 0 15px; width: 100%; height: 40px; border: 1px solid #CBD3DD; font-size: 1.125em; }
+.main-wrapper ::-webkit-input-placeholder { color: #CBD3DD; font-style: italic; font-size: 18px; }
+.main-wrapper :-moz-placeholder { color: #CBD3DD; font-style: italic; font-size: 18px; }
+.main-wrapper ::-moz-placeholder { color: #CBD3DD; font-style: italic; font-size: 18px; }
+.main-wrapper :-ms-input-placeholder { color: #CBD3DD; font-style: italic; font-size: 18px; }
+
+.page-icon-wrapper:before, .page-icon-wrapper .logo-asp:before, .page-icon-wrapper .logo-hibernate:before, .page-icon-wrapper .logo-angularjs:before, .page-icon-wrapper .logo-requirejs:before, .page-icon-wrapper .logo-reward:before, .component-demo:before {background-repeat: no-repeat; background-size: 100%; width: 92px; height: 108px; position: absolute; left: 50%; margin-left: -46px; top: 0; bottom: auto; margin-top: -28px; content: ''; }
+
+.container { width: 60em; margin-left: auto; margin-right: auto; }
+.container:after { content: " "; display: block; clear: both; }
+@media only screen and (max-width: 1024px) { .container { margin-left: 15px; margin-right: 15px; width: auto; } }
+
+.bcms-clearfix:after {content: ""; visibility: hidden; display: block; height: 0; clear: both; }
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/html-docs/download.html
@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html class="no-js" id="top">
+<head>
+    <title>ProxyManager</title>
+
+    <meta name="description" content="A proxyManager write in php" />
+    <meta name="keywords" content="ProxyManager, proxy, manager, ocramius, Marco Pivetta, php" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+    <link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600' rel='stylesheet' type='text/css'>
+    <link href="css/styles.css" rel="stylesheet" />
+    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/default.min.css">
+    <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/highlight.min.js"></script>
+    <script>hljs.initHighlightingOnLoad();</script>
+    <link rel="shortcut icon" href="favicon.ico">
+</head>
+<body>
+
+<header class="site-header">
+<div class="container">
+<h1><a href="index.html"><img alt="ProxyManager" src="img/block.png" /></a></h1>
+
+<nav class="main-nav" role="navigation">
+<ul>
+    <li><a href="https://github.com/Ocramius/ProxyManager" target="_blank">Github</a>
+    <div class="bcms-clearfix"></div>
+</li>
+</ul>
+</nav>
+</div>
+</header>
+<main role="main">
+<section class="component-content">
+
+<div class="component-demo" id="live-demo">
+    <div class="container">
+            <div class="main-wrapper" style="text-align: right">
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=fork&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="310" height="40"></iframe>
+
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=watch&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="200" height="40"></iframe>
+
+            </div>
+        <div class="bcms-clearfix bcms-clearfix"></div>
+    </div>
+</div>
+<div class="component-info">
+<div class="container">
+<aside class="sidebar">
+    <nav class="spy-nav">
+        <ul>
+            <li><a href="index.html">Intro</a></li>
+            <li><a href="virtual-proxy.html">Virtual Proxy</a></li>
+            <li><a href="null-object.html">Null Objects</a></li>
+            <li><a href="ghost-object.html">Ghost Objects</a></li>
+            <li><a href="remote-object.html">Remote Object</a></li>
+            <li><a href="contributing.html">Contributing</a></li>
+            <li><a href="credits.html">Credits</a></li>
+            <li><a href="copyright.html">Copyright</a></li>
+        </ul>
+    </nav>
+<div class="bcms-clearfix bcms-clearfix"></div>
+<a class="btn btn-action btn-full download-component"
+    href="download.html">Download</a>
+    <div class="bcms-clearfix"></div>
+</aside>
+
+<div class="content">
+    <div class="bcms-clearfix"></div>
+    <h3 class="section-title">Installation</h3>
+    <p>The suggested installation method is via <a href="https://getcomposer.org/" target="_blank">composer</a>.</p>
+    <pre><code class="sh">php composer.phar require ocramius/proxy-manager:1.0.*</code></pre>
+<hr />
+
+</main>
+
+    <footer class="site-footer" role="contentinfo">
+        <div class="container">
+            <div class="footer-logos">
+                <ul>
+                    <li><a href="index.html">Intro</a> | </li>
+                    <li><a href="virtual-proxy.html">Virtual Proxy</a> | </li>
+                    <li><a href="null-object.html">Null Objects</a> | </li>
+                    <li><a href="ghost-object.html">Ghost Objects</a> | </li>
+                    <li><a href="remote-object.html">Remote Object</a> | </li>
+                    <li><a href="contributing.html">Contributing</a> | </li>
+                    <li><a href="credits.html">Credits</a> | </li>
+                    <li><a href="copyright.html">Copyright</a></li>
+                </ul>
+            </div>
+        </div>
+
+        <div class="bcms-clearfix"></div>
+    </footer>
+    <div class="bcms-clearfix"></div>
+    </body>
+</html>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/html-docs/favicon.ico
@@ -0,0 +1,77 @@
+              (      H           
  
                                                                                                                                                                                                                                                                          xxx xxx www }}} wwwxxxixxxxxxxxxxxxoxxx ~~~ xxx xxx xxx                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 xxx www xxx yyyxxxJxxxxxxxxxxxxxxxxxxxxxxxxQyyy	xxx xxx xxx                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     uuu ttt www rrrxxx4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxx vvv                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      vvv kkk vvv ~~~ vvvxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  zzz yyy {{{                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      }}} uuu zzz vvvwww]xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwfxxxvvv zzz                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           xxx xxx xxx uuuxxxAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxIzzzxxx www www                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         fff  yyy xxx xxxxxx,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww1uuuxxx xxx uuu yyy                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              xxx zzz xxxxxxqxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx{xxxxxx xxx                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   yyy zzz xxx wwwwwwUxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\xxxuuu zzz xxx                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     vvv www xxx zzzxxx;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxCxxxxxx zzz vvv                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         xxx xxx  xxx'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.www uuu                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        xxx xxx xxxxxxjxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxjvvv!xxxbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxqwwwwww xxx sss vvv                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         qqq mmm vvv xxx
+xxxJxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' www yyy xxx"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxTxxxyyy {{{                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              xxx yyy xxx \\\xxx5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;|||xxx yyy yyy xxx xxx yyyyyy3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=yyy xxx xxx                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             fff ||| vvv sss xxx xxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxTxxxxxx |||  yyy     yyy zzz }}} www xxxxxxMxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww$ xxx uuu zzz                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             {{{ ||| xxx zzz vvvxxx`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyoxxxwww xxx uuu zzz                      qqq xxx zzz yyywwwgxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxhyyyxxx xxx qqq zzz                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 xxx xxx xxx xxxxxxCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. xxx zzz www                                     yyy ttt xxx aaa xxx)xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwHwww
+xxx vvv vvv                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     xxx xxx xxx xxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxAxxxyyy zzz yyy                                                     www www www zzzxxx;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3tttxxx yyy vvv                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      xxx xxx xxx xxxxxxtxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]vvv~~~ uuu sss rrr                                                             www  yyy xxx www
wwwUxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx~xxxuuu xxx www                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 www xxx xxxxxxXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzyyy{{{ www                                                                                      {{{ xxx ~~~ wwwxxxqxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`xxxxxx xxx rrr vvv                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         xxx vvv zzz uuuxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww0vvvxxx www zzz                                                                                           uuu yyy xxx,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxCvvvxxx ppp yyy                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ((( zzz vvv xxx ||| www(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxFwww	zzz vvv www                                                                                                             ||| }}} xxx tttwww@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww0WWWxxx www xxx                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 www www yyy yyyxxxkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxexxxxxx www bbb YYY                                                                                                                     www ttt www xxx xxxxxx\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrxxxzzz xxx  qqq                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ||| zzz xxx xxx vvv
+wwwOxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwyyy!~~~ www yyy                                                                                                                                         zzz yyy xxx zzz xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxVwwwyyy www {{{ |||                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 sss qqq www xxxxxx6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:rrrwww www www                                                                                                                                                     www www xxx www3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww;yyywww ttt qqq                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     ||| vvv www  www$xxx}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxQvvv
+xxx uuu ttt                                                                                                                                                                      {{{ yyy www	xxxExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( uuu  zzz                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      lll yyy xxx xxxxxxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxmyyyvvv www www www                                                                                                                                                                             uuu lll xxx xxx wwwxxxexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwkvvvyyy www  xxx                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     EEE }}}  uuu zzz	xxxFxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(mmm yyy sss }}}                                                                                                                                                                                                 www www ooo xxx"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxMwwwyyy   ---                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         vvv vvv xxx yyyxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxAzzzxxx www xxx                                                                                                                                                                                                             www yyy xxx uuuyyy7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1~~~yyy yyy yyy                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 www yyy ||| xxxxxxyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyWxxxyyy xxx yyy                                                                                                                                                                                                                             www vvv xxx xxxxxxPxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ooo xxx xxx                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     {{{ yyy yyy zzzxxx\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvwwwvvv xxx uuu vvv                                                                                                                                                                                                                                       xxx xxx xxxxxxnxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxawwwwww www www                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     zzz  xxx vvvwww>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyy,lllxxx yyy                                                                                                                                                                                                                                                             xxx xxx rrrwww'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxDwwwyyy ~~~ zzz                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     www vvv yyy  xxx)xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxDwwwwww uuu {{{ <<<                                                                                                                                                                                                                                                                 www www yyy tttxxx>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyy0xxx sss xxx                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         vvv vvv yyy wwwxxxlxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx^xxxwww www www                                                                                                                                                                                                                                                                                  sss sss www yyyxxxUxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxqwww~~~ xxx xxx                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         }}} nnn xxx xxx vvv
+xxxRxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}xxxyyy yyy www ooo                                                                                                                                                                                                                                                                                             yyy  yyy {{{ wwwxxxsxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxWxxx
xxx xxx yyy www                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         zzz  xxx yyyxxx6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww3uuuxxx   mmm                                     U - 8 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 2 E /                                         uuu  www xxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<xxxwww zzz                                                                                                                                                              777 888 <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< === MMM FFF                                                                                                         xxx vvv xxx uuu yyy%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxJzzz{{{ www www                                             5 3 2 93(38383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838384-25 4 1 T                                         zzz yyy www qqqwwwExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww(uuu xxx {{{ |||                                                                                                                                             === === ;;; 888<<<!<<<7<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<8<<<1===    === OOO 555                                                                                              uuu zzz yyyxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxfyyyuuu zzz nnn |||                                             6 4 23A3ާ33333333333333333333333333333333333333333333333333޴2Q33 ?                                             }}} ~~~ rrr zzz xxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxmyyyvvv xxx yyy                                                                                                                                  AAA EEE <<< <<<-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===j;;;=== ===                                                                                         xxx {{{ uuuxxxHxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx#sss yyy  {{{                                                     2 % 3V333333333333333333333333333333333333333333333333333333n>9 /                                                 qqq  www sss wwwxxx{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxPwwwyyy yyy yyy                                                                                                                         <<< HHH ;;; <<<6<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:::;;; <<<                                                                                     rrr xxx"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;~~~xxx yyy www                                                         2 3 3%33333333333333333333333333333333333333333333333333333334<6 Zt                                                         uuu yyy xxx zzzxxx3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*fff yyy ttt                                                                                                                     999 <<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<`=== ;;;                                                                                     xxx$yyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxLxxx	yyy zzz xxx                                                             5 2 13މ33333333333333333333333333333333333333333333333333333333ޥ33 1                                                             xxx xxx yyy wwwxxxDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)zzz vvv                                                                                                                     ;;; @@@ <<<a<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;<<< <<<                                                                                 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiyyywww xxx uuu www                                                                 4 2 3>3333333333333333333333333333333333333333333333333333333333W6 -                                                                 uuu ooo xxx xxx wwwxxxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww                                                                                                                 ;;; <<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~DDD>>> :::                                                                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyy& yyy rrr                                                                      5 3 2
3ާ333333333333333333333333333333333333333333333333333333333322 1                                                                         xxx www www www!xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwww                                                                                                             ::: ;;; :::<<<~<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;7=== 888                                                                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwU{{{xxx yyy ||| vvv                                                                         Nq 1 2T333333333333333333333333333333333333333333333333333333333333r0 5                                                                      www xxx xxx cccxxxKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyy+yyy                                                                                                             444 === ;;;4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>	;;;                                                                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx[xxxwww yyy ttt ttt                                                                 3 4 433333333333333333333333333333333333333333333333333333333333333/2 6                                                                 ooo YYY yyy xxx zzzxxxRxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                                         ::: ;;; ;;;	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<MDDD ___ ===                                                                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxAyyyyyy zzz xxx                                                             3 53r33333333333333333333333333333333333333333333333333333333333333ޏ35 S                                                         zzz qqq yyy zzzxxx6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                                          <<< <<<J<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;;; 777                                                                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, yyy xxx }}}                                                 7 3 3,333333333333޽3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3ޱ3޴33333333333333D. x m                                             }}} ~~~ zzz  xxx%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                                     HHH === ;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<jlll >>>                                                                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsyyyxxx xxx  yyy                                     3 5 73ސ33333333333ި33 333333333333333333333333333333333335 3433333333333333ު33 6                                     ppp  xxx yyy yyyxxxlxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                                     <<< BBB <<<h<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;$=== <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"=== >>>                                                                 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxQyyy
vvv ooo eee                              3 3 3E333333333333=3 3                                                                                                                                     4 2 13ޛ333ޱ333333333333]8 2                              sss ppp yyy wwwxxxKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                                 @@@ <<< ;;;#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<dNNN 777 :::                                                                                                                                   ,,,;;;t<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?????? VVV                                                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww7pppxxx yyy yyy                     9 4 23ެ33333333333ދ33                                                                                                                                         5 1 3M3333,3m3333333333333 4                     yyy yyy xxx yyywww3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                             >>> ??? CCC<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;<<< <<<                                                                                                                                     @@@ === <<<,<<<<<<<<<<<<K;;;E<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===:;;; HHH                                                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$ooo xxx xxx                 $ 0 3]333333333333*3 3                                                                                                                                     9 4 33޸333r6 23޽33333333333z64 ){         LLL zzz vvv vvv xxx!xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                             ??? ;;; ===<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<G;;; ;;;                                                                                                                                     888 <<< <<<<<<<<<<<<<<<<<<===	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;<<<                                                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxgxxxxxx xxx vvv     2 3 3333333333333oF]   2~                                                                                                                                 . 5 ( 3i333޾33 3 3Q33333333333334 - uuu sss xxx yyy vvvxxxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                         ;;; <<< :::
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===	=== ,,,                                                                                                                                     zzz ??? <<<C<<<<<<<<<<<<3=== ;;; ;;;1<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===Q;;; ;;;                                                         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxIxxx
+xxx xxx 2 53z33333333333޼34                                                                                                                                       & 3 2(3333U4 3~ 3 0
3ޡ33333333333ޘ32  xxx yyyxxxCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                         @@@ === <<<S<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<1::: ###                                                                                                                                     @@@ ;;; :::<<<<<<<<<<<<}DDD??? === ===<<<y<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=== ===                                                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyxxx7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2wxyR 30333333333333S0 5                                                                                                                                       1 13߅333ޤ54 3 M 3 38333333333332GS yyy-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=yyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                     >>> <<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<y888 JJJ III                                                                                                                                 <<< ??? 888 <<<_<<<<<<<<<====== ::: <<< ;;; ===<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<pAAA===                                                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy xxxxxxSxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyi|$4ݘ33333333333ޢ11 5                                                                                                                                     > 7 283334>2 7     ; 0 03ޅ33333333333޲[-yxvsxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxYwww||| {{{
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                     ;;; *** <<<o<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;<<< BBB                                                                                                                                     <<< <<< <<< <<<<<<<<<<<<`444 ...      999 EEE ;;;^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;(<<< 777                                                 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy xxx yyy xxxxxxqxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyxw`53333333333374 7                                                                                                                                     2 3 3
3ޢ333ވ44 6         1 4 3$33333333333Yxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwxxxvvv vvv yyy {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                 ;;; <<< <<<(<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]DDD 888                                                                                                                                     SSS >>> <<<<<<{<<<<<<<<<====== TTT         @@@ <<< ;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<777888 ===                                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy xxx www xxx yyy xxx*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwrzH33333333333ކ33 *                                                                                                                                     6 0 4T3334&3 3                 3 D 3i3333333333Ap{xxwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww-|||xxx zzz rrr zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                             999 ;;; ;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<====== 777                                                                                                                                     666 ;;; ===0<<<<<<<<<<<<G888 BBB                 ;;; <<< <<<A<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;A::: ===                                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy         xxx xxx xxx yyyxxx?xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]533333333334%3                                                                                                                                      2 3 43޿333khm 1                     6 5 43޵3333333334UwxyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxCwwwyyy yyy yyy         zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                             999 === <<<C<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;A=== ===                                                                                                                                     ;;; === ===
+<<<<<<<<<<<<@@@@@@ @@@                     === ===<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;=== :::                                         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy             yyy ttt xxx yyy yyyxxxWxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyxwo{A23333333333h   7 7                                                                                                                                 W 4 r 3n333޹33 2                       5 3 3K3333333332<i|yxwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]zzzwww www hhh xxx             zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                             === <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<====== HHH                                                                                                                                     ;;; === <<<I<<<<<<<<<<<<.=== @@@                         VVV 999 <<<.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;Y??? @@@                                         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                     xxx }}} yyy www xxxxxxwxxxxxxxxxxxxxxxxxxxxxxxxwxzT43333333333޷44 6                                                                                                                                       # 1 3+3333M6 F                                 2 1
+3ޙ3333333333Muy|xxxxxxxxxxxxxxxxxxxxxxxxxxx~yyyuuu zzz ttt ~~~                     zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                     EEE ;;; <<< <<<Z<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===,<<< '''                                                                                                                                     ;;; <<< ===<<<<<<<<<<<<u@@@===                             GGG 777  <<<r<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<====== <<<                                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                             www yyy xxx lllxxx4xxxxxxxxxxxxxxxxxxyxwi|;33333333333N0 4                                                                                                                                         4 53ތ333ޟ2
+3 0                                  5 2533333333337b~yxwxxxxxxxxxxxxxxxxxxxxx7qqqxxx yyy xxx                             zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                     ::: <<< ===<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<s)))555 ===                                                                                                                                 *** 888 ??? <<<c<<<<<<<<<<<<<<< ===                                 999 ;;; ;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<v@@@===                                  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                     www ttt yyy wwwxxxHxxxxxxxxxxxxuy|L33333333333ޙ1	2 4                                                                                                                                     3 3 2?333475 /                                     % - 23}3333333332FrzxxwxxxxxxxxxxxxNwwwwww vvv uuu                                     zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                     <<< ===<<<y<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:::<<< 777                                                                                                                                         === ;;;%<<<<<<<<<<<<W;;; 999                                         <<< ;;; <<<V<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<0;;; 999                                 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                         ttt ttt vvv ~~~ vvvxxxdxxxyxwb~83333333333423 2                                                                                                                                     4 3 23ި333ށ54 3                                         2 3 3 33333333335[xxxxxxxxxjyyyuuu xxx ||| yyy                                         zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                 ;;; <<< ;;;.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<X::: <<<                                                                                                                                         <<< <<<<<<<<<<<<<<<===<<< ===                                         ;;; <<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<555222 777                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                      vvv ]\\ }wql|E23333333333|53                                                                                                                                         4 . 3\33333 4                                                 4 . 3a3333333333>f}{wr$ʲ xxx kkk                                                  zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                             777 ::: ;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;;; <<<                                                                                                                                     === <<< <<<6<<<<<<<<<<<<@;;; >>>                                                 444 999 <<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;H>>> 333                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                      ttt wz} rv 3l333333333332#5 t                                                                                                                                     . 3 33333d4 3                                                     3 3 33ݰ33333333333߇Y \                                                         zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                             333 ??? <<<H<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<< ;;;                                                                                                                                     === === ===<<<<<<<<<<<<???>>> ===                                                 III <<< ;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:::;;; MMM                         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                         2 2 2'333333333332_0 0                                                                                                                                   5 , )3x333ް35 >                                                         . 1 3D333333333333A5 0                                                         zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                         === ;;; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:::<<<                                                                                                                                         === 999 <<<Q<<<<<<<<<==='=== >>>                                                         666 <<< <<<(<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<a<<< ;;; ===                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                     6 2 /3ފ33333333333ޱ33 3                                                                                                                                     + 2 2/3333H3 7 '                                                         A 3 23ޔ33333333333ަ12                                                         zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                         <<< 999 ===a<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<)=== fff                                                                                                                                     @@@ === <<<<<<<<<<<<<<<o@@@<<<                                                             ;;; 666     <<<l<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;<<< >>>                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                     - 6 2?333333333334E0 8                                                                                                                                     .r 3 43ޔ333ޖ22                                                                     * 4 30333333333333X4 3 -Y                                                 zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                     >>> <<< <<<!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<jBBB :::                                                                                                                                     444 CCC aaa <<<m<<<<<<<<<<<<=== BBB                                                                 666 ;;; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:::;;; ;;;                 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                 5 5 53ީ33333333333ޓ33 2                                                                                                                                     3 2 3D333333 3                                                                     0 5 @3w3333333333332 0                                                 zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                  === AAA<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===<<< <<<                                                                                                                                     TTT === <<<(<<<<<<<<<===Q<<< @@@ ///                                                                     ::: ??? <<<Q<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6;;;                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                              7 . 3Y333333333332,5 :                                                                                                                                     7 5 53ް333z64 2                                                                         7 3 1333333333333v;5 	                                             zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                 <<< ;;; ===6<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===P;;; ???                                                                                                                                      <<< 888<<<<<<<<<<<<;;;<<<                                                                             ::: === ===<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;	;;;              xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                             @ 4 3333333333333v.0                                                                                                                                       6 - 4b33323 4                                                                                 2 6 3[333333333332-4 2                                             zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                             >>> === <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;;; :::                                                                                                                                     <<< === <<<;<<<<<<<<<<<<;::: CCC                                                                                 ::: ;;; <<<5<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<M<<< @@@ 999         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                             4 >3u3333333333343 <                                                                                                                                      | 1 3!3333]/ 6                                                                                     2 3 33ި33333333333ޓ30                                           zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                             @@@ 888 <<<O<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<< ;;;                                                                                                                                     ::: <<< <<<
<<<<<<<<<;;;333888 CCC                                                                                     ;;; :::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;;; 222         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                         4 4 4,333333333333X3 5 7                                                                                                                                 ; ' 3}333ޫ22 0                                                                                         3 3 3=333333333333E5 	 F                                     zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                         ... <<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<888;;;                                                                                                                                         ;;; ??? <<<X<<<<<<<<<===#=== >>>                                                                                          === ;;;$<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;iLLL ;;;         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                     1 0 /3ޒ33333333333ި4
4 3                                                                                                                                      2 353333C3 7w                                                                                                 2 23ލ33333333333ޭ13 Fi                                     zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                          XXX <<<j<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;%<<< 555                                                                                                                                     TTT === ===<<<<<<<<<<<<hMMM ;;;                                                                                                 ;;; ::: ===d<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<$;;; :::     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                     1 4 2F333333333333>3 4                                                                                                                                     -y 5 53ޚ333ޑ-. 3                                                                                                 
 4 2+333333333333_5 1                                     zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                     === <<< <<<%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<c;;; <<< 888                                                                                                                                 <<< JJJ  <<<r<<<<<<<<<====== >>>                                                                                                 <<< <<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<888;;; >>> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                 + 2 33ޮ33333333333ދ22 4                                                                                                                                     1 2 3K3333-3 :                                                 ::: ::: <<< <<< ::: XXX 777                         4EH .   3l3333333333343 <:8 === <<< === <<< <<<             zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                     333 /// <<< === <<< :::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;<<< ???                                                                                                                                     CCC === ===.<<<<<<<<<<<<L666  :::                                                                                                     888 >>> ;;;I<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;<>>> 666 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                             6 - 8 3`333333333334'5 5                                                                                                                                     2 1 23޸333s,2 0                                     333     ;;; ;;; :::	<<<<<<":::>>> <<< 333 '''             ;;; ;;; ?>< <72:PeP6p6v4333333333}/<:8===C<<<O===@<<<<<< === <<<     zzz {{{xxxxxxxxxxxxuuuppppppvvvxxxxxxxxx/xxx             ;;; ;;; ;;; """<<<===#===<<<A<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;I>>> 999                                                                                                                                         === ======<<<<<<<<<;;;=== FFF                                                                                                         === ;;; :::	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                              S 2 3"333333333333o 6b  0y -                                                                                                                                 6 6  3g33321 1                                         CCC @@@ ;;;	<<<R<<<<<<<<<<<<<<<b===@@@ BBB         ;;; ;;; :::;;;9<<<<<<<?A;CJ:Ob6o33333333:Uoy<;:<<<<<<<<<<<<===@AAA@@@ DDD zzz {{{xxxxxxuuubbbMMMGGGGGGNNNddduuuyyy.yyy         === ;;; 333<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===	<<< 999                                                                                                                                     === <<< <<<@<<<<<<<<<<<<6=== 999                                                                                                              III >>> <<<2<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<T;;; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                             4 53}33333333333޺44 X                                                                                                                                       2 4'3332T4 4                                         777 ;;; ;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<     ;;; >>> ;;;M<<<<<<<<<<<;<;;<;:<?C8c3333337g<@D<<;<<<<<<<<<<<<<<<===\ DDD zzz {{{yyysssUUU???;;;;;;;;;;;;@@@RRRhhh6bbb <<<     === ::: <<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;.;;; :::                                                                                                                                     <<< === ===<<<<<<<<<<<<}>>><<< :::                                                                                                                     --- <<<<<<y<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                         @ 4 40333333333333M2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 < 3ބ333ަ23 1                                         999 PPP <<<a<<<<<<<<<<<<<<<<<<<<<<<<<<<:::;;; >>> <<< === <<<<<<<<<<<<<<<<<<<<<<;;;BI6r33335w;DL<<;<<<<<<<<<<<<<<<<<<<<<<<<0<<< yyy {{{xxx]]]>>><<<<<<<<<<<<<<<<<<===BBBx+++;;;     <<< ;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<tAAA <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< >>> <<<]<<<<<<<<<>>>=== ===                                                                                                                         444 ;;; === <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                         C| . 3ޅ333333333333`3W3W3W3W3W3W3W3W3W3W3W3W3W3W3W3[3^3^3^3^3^3^3^3^3^3^3^3^3^3^3^3^3^3^3^3^3]3p3333<1 @                                           <<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3<<< ;;; <<< <<<s<<<<<<<<<<<<<<<<<<<<<<<<<;:9Uo43339Yv<;:<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>hhh kkkFFF;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<(<<< >>> <<< <<<h<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<m<<<O<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<Q<<<P<<<]<<<<<<<<<<<<_=== ===                                                                                                                             111 >>> ;;; <<<Z<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                         5 63޲33333333333333333333333333333333333333333333333333333މ33 5                                             <<< <<<A<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\=== ;;; <<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;IV4333:L]<;:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
]]] YYY@@@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<H<<< FFF  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<====== ===                                                                                                                                 <<< ::: :::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                         1 1
+3޵33333333333333333333333333333333333333333333333333333l2 4 +                                             ;;; ;;;Q<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<l--- <<< <<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;HT4334:L\<;:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\\\ TTT???<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<T;;; <<< ===<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+<<< ;;;                                                                                                                                 ::: >>> >>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                         * nJ 3ޒ333333333333~3z3z3z3z3z3z3z3z3z3z3z3z3z3z3z3t3q3q3q3q3q3q3q3q3q3q3q3q3q3q3q3q3q3q3q3q3p4ߕ3333 4 5                                             <<< <<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<S;;; === <<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<;:9Rh43339Un<;:<<<<<<<<<<<<<<<<<<<<<<<<<<<===ddd ]]]AAA<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<B;;; 555 BBB <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<H>>> 888                                                                                                                             UUU 888 >>> <<<G<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                         + 3 4@333333333332?8 +++++++++++++*6u - - - - - - - - - - - - - - - - - - - - . 33ޭ33312                                          === ===<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<%<<< 888 <<< <<<1<<<<<<<<<<<<<<<<<<<<<<<;<?B7k33336p<@E<<<<<<<<<<<<<<<<<<<<<<<<<<<A;;; www oooJJJ;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 666 <<< <<<P<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<d>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<???<<<w<<<<<<<<<<<<<<< @@@                                                                                                                         888 ;;; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                             4 73ޙ33333333333ޢ2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 3C333442 2                                         === <<< ===H<<<<<<<<<<<<<<<<<<<<<<<<<<<c...999 QQQ === ???<<<n<<<<<<<<<<<<<<<<;:<<<9Xu4333338]~<=><<<<<<<<<<<<<<<<<<<<<|====== zzz {{{yyyddd@@@;;;<<<<<<<<<<<<;;;>>>GGGcWWW 666     <<< >>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< === ===<<<<<<<<<<<<`333 @@@ :::                                                                                                                     ;;; 999 ===_<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                             7 2 32333333333333T1 2                                                                                                                                   2 4 53ގ333ޞ2	1 *                                     === ??? AAA<<<X<<<<<<<<<<<<<<<<<<<<<p888	888 999     666 ::: ===
+<<<c<<<<<<<;:<==;FQ8_433333349Pd<;:<<<<<<<<<<<<<<<s<<<<<< === zzz {{{yyyvvv```FFF<<<;;;;;;<<<FFF^^^rrr1mmm 777     777 @@@ <<<===<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<}>>>=== >>>                                                                                                                                     000 888 <<<Y<<<<<<<<<;;;#<<< ///                                                                                                                 ::: <<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<n xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                             6 1 ,3z33333333333޿24 6                                                                                                                                     4 4 3*3333M5 * ?                                     <<< <<< >>> ;;;*<<<u<<<<<<<<<~<<<7>>>=== ===         OOO 999 === PV[ =;:$;DLd7d6l5{3333333335y=;92<<<b<<<r<<<^===*555;;; <<<     zzz {{{xxxxxxxxxmmm[[[SSSSSS\\\mmmxxxyyy/yyy         ;;; 999 ;;; :::
+===P<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4;;; @@@                                                                                                                                     GGG >>> <<<<<<<<<<<<;;;}666:::                                                                                                             >>> ::: 555<<<}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===<<< xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                 0 2 2333333333333q23 3                                                                                                                                     Z> As 3p333޸34  t                                         ;;; %%% === BBB ===
+;;;777<<< >>> ===                     ==> 3Y <^y 2Q33333333333307 <<; <<< === <<< === 888 999         zzz {{{xxxxxxxxxyyyxxxvvvvvvxxxyyyxxxxxx/xxx                 <<< ;;; ;;; @@@===:::===<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;	<<< <<<                                                                                                                                     <<< ;;; <<<A<<<<<<<<<;;;4<<< === 333                                                                                                     ??? ;;; <<<5<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;RAAA 888 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                     2 7 3]333333333333+4 9                                                                                                                                     6 3 43޾333j5y 6                                                 QQQ ;;; === <<< ;;; RRR                             8 3 23޽33333333333{5* -g 777 999 AAA AAA                 zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                     @@@ AAA === <<< ;;; === ===9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<J<<< EEE                                                                                                                                     === === ===<<<<<<<<<<<<====== ===                                                                                                 ::: 888 888<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;
<<< === xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                     8 5 43ޫ33333333333ޏ44                                                                                                                                         5 1 3T3334%3 2                                                                                                 3 73r333333333333 3 2                                     zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                         AAA @@@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=== DDD                                                                                                                                     === <<< ===(<<<<<<<<<<<<N>>> ;;;                                                                                                 777 >>> <<<M<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9>>> BBB     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                       7 3 4A333333333333@3 <                                                                                                                                   4 2 1
+3ޣ333݈22 2                                                                                         4 4 3*333333333333^. 5 9                                     zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                         >>> ;;; ===%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<g??? <<<                                                                                                                                         === III<<<p<<<<<<<<<<<<<<< :::                                                                                         @@@ <<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===<<< 444     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                             3 33ސ33333333333ީ24 @                                                                                                                                     0 3 393334=0 ;                                                                                     . 1 23ޏ33333333333ޮ23 6                                         zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                         FFF :::  <<<h<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"<<< >>>                                                                                                                                     === <<< <<<<<<<<<<<<<<<i 999                                                                                         ;;; @@@ <<<g<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'<<< @@@         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                             Ey 2 4-333333333333\2 4                                                                                                                                         3 13ބ333ި11 1                                                                                 . 5 3D333333333333B3 2                                             zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                             >>> === ===<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<???=== ;;;                                                                                                                                     666 ::: ===R<<<<<<<<<<<<'<<< ;;;                                                                                 >>> <<< ;;;#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<h BBB >>>         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                             @ 4 23s3333333333333 4                                                                                                                                     ;y 5 4%3332V6 /                                                                                 3 43ޫ33333333333ސ12 2                                             zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                 === <<< <<<K<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;<<< :::                                                                                                                                     >>> ;;; <<<
<<<<<<<<<<<<;;;;;;                                                                             999 <<< ===;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;999;;; DDD             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                 3 3 3333333333333z64 4                                                                                                                                   GS 5 3e333޿23 2                                                                     9 + 4 3[333333333333+4 8                                                 zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                 ;;; <<< ===
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===<<< @@@                                                                                                                                     666 >>> <<<<<<<<<<<<<;;;9<<< >>>                                                                         999 === <<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<L??? ,,,                 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                     5 1 3V33333333333323 5                                                                                                                                     4 2 23޶333t'~2                                                                     - 2 3333333333333s0~3 0                                                 zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                 ===     ::: ===5<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Q::: 111                                                                                                                                     555 === >>><<<<<<<<<<<<<<<;;; :::                                                                     ::: <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;;; :::                 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                     5 3 33ޤ33333333333ޘ43 1                                                                                                                                     + 7 2L3333+3 2                                                                 4 53z3333333333314 3                                                     zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                     III EEE <<<<<<}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<====== ===                                                                                                                                     === <<< <<<#<<<<<<<<<<<<VAAA :::                                                             @@@     EEE ;;;R<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2=== @@@                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                     3 3X 3 3>333333333334G4 8_                                                                                                                                     + 1 2	3ޛ333ޑ64 2                                                         1 3 2.333333333333X5 2                                                         zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                         === <<< ===!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<n ;;;                                                                                                                                         >>>  <<<j<<<<<<<<<:::<<< @@@                                                         777 <<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<CCCFFF :::                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                         3 2 44ވ33333333333޲22 3                                                                                                                                     2 3 413333F4 2                                                     2 1 13ޘ33333333333ަ22 2                                                         zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                             ??? 555 <<<a<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<(<<< <<<                                                                                                                                     666 ;;; ;;;<<<<<<<<<<<<rqqq @@@ <<<                                                     <<< @@@<<<o<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;!=== KKK                         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                             [ 3 4)333333333333c8 2                                                                                                                                         4 73}333ޯ22 +                                                 + 8 2I333333333333<3 2                                                             zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                             >>> === <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<999;;; ===                                                                                                                                 ;;; hhh CCC ;;;M<<<<<<<<<<<<,<<< ===                                                 >>> === <<<&<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;b``` ::: """                         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                             3 4 , 3k333333333334!3 4                                                                                                                                     1 3 3 3333b@~ ) 4                                         5 2 43޴33333333333ވ12                                                                 zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                 @@@ === <<<D<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<B;;; ===                                                                                                                                         ::: <<<	<<<<<<<<<<<<<<<<<< QQQ                                         <<< >>> ???<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;; :::                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                                 4 5 53޻33333333333ހ=6 /                                                                                                                                 9 |BB - 3_3333"2 \                                         Z / 3b333333333331)3 Df                                                                 zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                 777 === ===<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<                                                                                                                                         999 === <<<8<<<<<<<<<===?::: 777                                         AAA ;;; ===?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<E<<< <<<                                 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                                     . 2 2O33333333333395 .                                                                                                                                     @ 3 33ޫ33354 O                                 2 3 4"333333333333jBu *                                                                   zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                     333 === <<</<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<X<<< ;;; <<<                                                                                                                                 ::: ??? EEE<<<~<<<<<<<<<<<<<<< ;;;                                 >>> <<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===;;; 			                                 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                                     W 2 13ޟ33333333333ޜ1
+1                                                                                                                                       0 5 3E333322 0                                 2 33݀33333333333޻33 1                                                                     zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                     <<< DDD NNN<<<x<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;; 999                                                                                                                                     <<< ;;; ;;;<<<<<<<<<<<<\=== ;;;                                  ::: <<<W<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<0<<< ;;;                                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                                         & 4 37333333333333N6 Bo 0                                                                                                                                 0 1 13ݏ333ޜ7
+5 1                         0 2 35333333333332Q7 /                                                                         zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                         DDD === :::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;v<<<;;;                                                                                                                                         ::: CCC ;;;b<<<<<<<<<<<<;;; ===                         <<< === ===<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<u555555                                         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                                         1 . /3ރ33333333333޶34 9                                                                                                                                     3 3 3*3333M5 0                     2 0 03ޞ33333333333ޠ22 4                                                                         zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                             >>> 555 <<<\<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;,<<< ;;;                                                                                                                                     ;;; ;;; ;;;<<<<<<<<<<<<vEEE888 +++                     <<< 888<<<u<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;=== :::                                         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                                             . 4 4"333333333333k) 3                                                                                                                                         4 73r333޹34 3                 2 4 3Q33333333333463 2                                                                             zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                             >>> <<< ;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;::: ...                                                                                                                                     XXX ;;; ===F<<<<<<<<<<<<2???                  ::: <<< <<<-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[999 <<<                                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                                                 4 _ 3f333333333334$3 3                                                                                                                                     4 3 33޾333g5 , ,         + 3 33޷33333333333ނ43                                                                                 zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                 === <<< ===?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<E??? ...                                                                                                                                     === >>> @@@<<<<<<<<<<<<<<<	<<<             >>> <<< :::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:::::: <<<                                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                                                 4 3 23޳33333333334߈34 M                                                                                                                                     3 3 2T3332(3 >     Hr F @ 3k333333333333$3                                                                                   zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                     <<< ???<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;; ***                                                                                                                                     999 === <<<1<<<<<<<<<<<<F=== >>>         ??? ::: <<<G<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>;;; :::                                                 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                                                     2 3 3H333333333333<0 D                                                                                                                                     3 2 03ޥ333ކ12     6 4 3&333333333333f, = 7                                                                                 zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                      >>> <<<,<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===^::: <<<                                                                                                                                     === >>> AAA<<<x<<<<<<<<<===>>> >>> 999 ;;; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;;;                                                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                                                         4 2	3ޘ33333333333ޥ33                                                                                                                                         2 2 2=3333:3 2 2 03އ33333333333޳34 @                                                                                     zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                         777 111<<<o<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ;;;                                                                                                                                     >>> ;;; ;;;<<<<<<<<<<<<cYYY ::: FFF === <<<`<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+=== qqq                                                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                                                         4 3 33333333333333S2 1                                                                                                                                     2 3 43އ333ަ2
3 3 3;333333333333K5 1                                                                                         zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                         ::: <<< ===<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<|:::;;; DDD                                                                                                                                     888 === <<<Z<<<<<<<<<<<<!=== ;;; <<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<pfff     777                                                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                                                             3 33{33333333333޾22 3                                                                                                                                     4 4 4$3333W5 43ޤ33333333333ޘ4	4 0                                                                                         zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                             ??? 777 <<<T<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3;;; ;;;                                                                                                                                     999 ;;; ;;;<<<<<<<<<<<<???AAA<<<}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===<<<                                                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                                                             3 3 3333333333333r53                                                                                                                                         5  4g33323T333333333332/2 1                                                                                             zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                             ::: ;;; ;;;
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=== >>>                                                                                                                                 $$$ ___ === <<<@<<<<<<<<<===3;;;0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<U;;; <<<                                                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                                                                 4 . 3`333333333333*2 .                                                                                                                                     !} 2 43޵333ލ3޼33333333333|,2 7                                                                                             zzz {{{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                             III ;;; <<< <<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<K::: AAA                                                                                                                                     ::: ??? >>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<999::: <<<                                                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy www                                                                                             4 3 23ެ33333333333ސ/, * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + 2 3J333333333333334 3 '                                                                                             yyy zzz {{{	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                                     ;;; 999;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===<<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< === <<<*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;8=== >>>                                                                 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$xxx yyy www ///                                                                                     <P 2 3 2@333333333333ސ4~4444444444444444444444444444444444444އ33333333333333]5 2 &i                                                                                         xxx xxx www xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                                     111 === <<<'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=== '''                                                                 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxKyyyxxx xxx uuu                                                                                      2 13ސ33333333333333333333333333333333333333333333333333333333333333ޮ3
3 3                                                                                 www  xxx xxx xxxxxxCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                                     777 <<< 888 <<<h<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<&<<< 333                                                                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1yyyxxx lll sss                                                                                 4 3 3/33333333333333333333333333333333333333333333333333333333333332C2 3                                                                                      xxx wwwxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxx                                                                                                         === === ===<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<h BBB 777                                                                     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx||| xxx zzz zzz                                                                         3 + îo 3s333333333333333333333333333333333333333333333333333333333333ޏ12 3                                                                         uuu uuu vvv  vvvxxxwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxx                                                                                                             === ;;; <<<M<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>> @@@                                                                         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdyyyuuu www www                                                                         0 3 3333333333333333333333333333333333333333333333333333333333334+4 2                                                                         xxx www zzz wwwxxx[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyy                                                                                                             >>> === >>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<O;;; ===                                                                             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxJuuuxxx xxx ppp vvv                                                                 2 4 3U3333333333333333333333333333333333333333333333333333333333q0 3                                                                     {{{ xxx yyy wwwxxxCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx                                                                                                                 333 ::: <<<1<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>	=== ===                                                                             xxx5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/vvvxxx {{{ yyy                                                             3 2 13ާ3333333333333333333333333333333333333333333333333333333335 o                                                             vvv ooo yyy vvv yyy)xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww:xxx www                                                                                                                 FFF 888 000<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3<<< ===                                                                                 lll www>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvvv xxx rrr yyy                                                         5 4 3;33333333333333333333333333333333333333333333333333333333V0 3 '                                                     yyy yyy vvv {{{ yyyxxxpxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwHiiiuuu xxx                                                                                                                     HHH <<< <<<!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<|999<<<                                                                                     www www vvvwww{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxRxxxzzz xxx xxx                                                     . 3 53q333333333333333333333333333333333333333333333333333333ދ5	5 4                                                     vvv www www uuuwwwMxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww$yyy www www                                                                                                                         ;;; @@@  <<<L<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:::>>> qqq                                                                                     vvv  zzz sssxxx4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww;xxxxxx xxx  kkk                                             ) 3 6	3c3333333333333333333345555555554333333333333333333333v22 5                                             MMM rrr www xxx tttxxx6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyy:xxxxxx ttt mmm                                                                                                                                 @@@ >>> 777<<<J<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>> ccc                                                                                                  www yyy {{{	xxxPxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx#www www |||                                          9 . 3 2 33E3X3[3[3[3[3[3[3[3[3[3[3[3[3[3[3[3[2ZP_________Q1X3[3[3[3[3[3[3[3[3[3[3[3[3[3[3[3[3Z3L3$'x3 6 4                                         zzz  yyy zzz xxxxxx}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwUwwwwww xxx ^^^ vvv                                                                                                                                         ;;; <<< ;;; ;;;<<<?<<<V<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<[<<<Z<<<Q<<<.;;;;;; 888 999                                                                                                         {{{ zzz yyy vvvxxxkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiwwwxxx {{{ zzz                                          4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 H {vreywvyxvyxvyxvyxvyxvyxvyxvyxv{wsoS 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 . ,                                           {{{ www yyyxxx^xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxqwww xxx www                                                                                                                                                         AAA 444 ;;; <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< <<< ;;; ;;;                                                                                                                     www vvv xxx  xxx&xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxOzzz	xxx www yyy ttt                                                                                                                     www wwwhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrxxx                                                                                                                         }}} ttt yyy zzzxxxBxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-sssxxx sss yyy                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     www rrr xxx wwwxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4vvvxxx                                                                                                                   www wwwhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrxxx                                                                                                                  }}} zzz nnnwww/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwxxxBwwwxxx uuu www                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 www yyy xxx www zzzwwwWxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx~www www uuu vvv                                                                                                         www wwwhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrxxx                                                                                                         qqq lll xxx yyy xxxxxxwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`vvvxxx www xxx                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     www yyy {{{ xxxxxxpxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaxxxzzz uuu uuu                                                                                                     xxx xxxhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrxxx                                                                                                     www uuu yyy xxxxxxZxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx~www{{{ vvv xxx                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ttt ttt xxx ||| xxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxItttxxx yyy yyy                                                                                             xxx xxxhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrxxx                                                                                             xxx xxx xxx xxxwww@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1xxx www www                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ^^^ vvv yyyxxxBxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwxxx/~~~www  ppp                                                                                     xxx xxxhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrxxx                                                                                     eee  vvv  xxx*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxHxxxyyy                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            rrr yyy xxx wwwyyy\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwww~~~ xxx www xxx                                                                             xxx xxxhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrxxx                                                                             yyy zzz xxx {{{ vvvxxxnxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxfyyyxxx xxx ||| www                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     RRR www www www xxx xxx{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwwwYwwwxxx yyy yyy                                                                         xxx xxxhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrxxx                                                                          ~~~ xxx xxxxxxPxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyy&~~~ xxx www bbb                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     xxx yyy xxx xxxxxx0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@yyyxxx www uuu vvv                                                             xxx xxxhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsxxx                                                                 xxx xxx yyy xxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww8yyywww xxx vvv                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 eee ~~~ xxx xxx vvv
+wwwKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyy'oooxxx www                                                             www wwwgxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsxxx                                                         [[[ uuu yyy qqq xxx"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyPvvv
{{{ rrr  sss                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 xxx xxx {{{ wwwxxxgxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxx xxx                                                   www wwwgxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsxxx                                                 [[[ RRR xxx www yyyxxxgxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxmwwwvvv vvv  UUU                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         UUU {{{ uuu xxx  xxx$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxOyyyvvv ttt {{{                                             www wwwgxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsxxx                                             vvv ttt {{{ yyy	xxxHxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) xxx {{{ uuu                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          zzz {{{ xxx sssxxx5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:pppyyy www zzz                                     www wwwgxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsxxx                                  uuu xxx www tttwww3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>xxxyyy yyy yyy                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         www rrr www www yyyxxxQxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww" xxx ccc                              www wwwgxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsxxx                                 www www xxx wwwxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwZwwwxxx xxx ggg mmm                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     zzz www yyy www vvvxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxfwwwuuu yyy uuu vvv                     xxx xxxgxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsxxx                     qqq nnn www xxx wwwxxx^xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvyyy yyy }}}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         zzz zzz www  xxx*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxJxxxyyy ttt ttt                 xxx xxxgxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsxxx                 xxx sss zzz vvvxxxAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0yyy uuu                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      qqq ttt www yyyxxx<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5lllxxx xxx xxx         xxx xxxgxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsxxx         xxx vvv xxx \\\www.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxDyyyxxx {{{ {{{                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 {{{  yyy xxx xxxxxxYxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyxxxwww www  uuu xxx xxxgxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsxxx  TTT yyy {{{ xxxxxxrxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxayyyvvv yyy {{{ yyy                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              www xxx sss xxxxxxsxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]wwwzzz zzz xxx xxxgxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsxxx zzz ttt yyyxxxVxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx~xxx xxx yyy rrr                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              www {{{ xxx wwwxxx0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx?{{{xxx xxxfxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsxxx xxxxxx;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7{{{xxx xxx www                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             xxx yyy www wwwxxxExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww+wwwjxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxuxxx#xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxKwww
+zzz www {{{                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |||  xxx yyy yyyxxxbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxjxxxxxx www nnn rrr                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         yyy yyy nnn wwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%^^^ xxx xxx                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         xxx xxx yyy {{{xxx4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<zzzxxx www zzz mmm                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 zzz {{{ yyy xxxyyyGxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyNwww}}} vvv yyy                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 vvv  xxx www yyyxxxhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoyyyvvv www                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      uuu zzz uuu www#wwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww( zzz www                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 zzz yyy www kkkxxx9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxA}}}zzz zzz zzz                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           qqq uuu yyyxxxRxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx[wwwzzz }}}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        ``` yyy yyy wwwxxxnxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvxxxxxx www     vvv                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     {{{ ttt www sss xxx*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwww0111 www ~~~ {{{                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     xxx yyy xxx xxxxxx?xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxIxxxxxx vvv www                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 }}} zzz xxx xxx xxxxxx]xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdwww{{{ vvv vvv yyy                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 www xxx sss wwwxxxyxxxxxxxxxxxxxxxxxxxxxxxxwww ||| xxx  lll                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ppp ttt yyy xxx zzzyyy5xxxxxxxxxxxxxxxxxx<nnnyyy www zzz RRR                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 z I  0QJz(I00QJz H  0QJz(I00QJc, H    c, I0
+           !                                                  !         z     0QJz(I00QJc,       c, I0
+  z       QJz(I00QJc,        c, I0
+  z       QJz(I00QJz       Jz(I00QJz       Jz(I00QJz       Jz(I00QJz       Jz(I00QJ             !         x       Jz(I00QJ`   0   Jz(I00QJ        0          B  0    c   0
+     c, I0
+               !                       B    H   I0   z(I00QJc    I0
+    c, I0
+     I0    z(I00QJc    I0
+   =c, I0
+  c     I0
+   
c, I0
+        B  0          B  0        I00    z(I00QJ                     `    I0
+    c, I0
+      I00P   z(I00QJ      B  0          B  0         I0
+@   c, I0
+                B    H              z(       J                                                       z       @   z(       J    B        @     B       H                                                        ,            ,           z        J  z         J    @        H     B         H                                (             ,             @        @     B         H       I0
+        , 	0
+       @            B        H        0              0             0              0                       B              I0        x  I0   
+       I0
+        ,  I0
+ @        N             @               I0
+          I0
+            I0
+ 0         I0
+           I0
+ 0         I0
+                                                 @                  !                                                                    I00@     I0  Q     I0         I0
+      I0         I0
+ 0                                B              B  0                                   B              B  0          B              B  0         I0   =    I0                                                  I0 0      I0 0Q                                                   
+ I0           (I0 0Q                                                                                    @                         0Q@                         0Q                                                          
+ I0           (I0 0Q                             I0        I0 0Q      I0        I0        I0   =    I0       I0   =    I0       I0 0P      I00Q     I0 0P      I0 0Q     I0 0P      I0 0Q     I0 0P      I0 0Q 
   I0 0P      I0 0Q 
   I0 0P     I0 0Q    I0 0P     I0 Q    I00@     I0  Q      B  0            0                                          !                              @          I0
+ 0        I0
+         I0
+ 0        I0
+        I0 0  J  p I0 P     I0
+         I0
+         I0
+       (  I0
+            0              0         I0
+       ,  I0
+        I0
+       ,  I0
+       I0
+       ,  I0
+      @      H     B               0             0      p I0  J  z  	0   J   @        H     B         H                                                                                        ,            ,                                             B        H     B       H                              ,           ,             z       @   z(       J                                 z          z(       J                              
+ I  0Q   z(I00QJ    I     c, I0
+      I  0Q   z(I00QJ      B             B  0    `   # I     c, I0
+               B    H    I  0    z(I00QJ                                              B    H                    B  0       I      z(I00QJ   I      z(I00QJ             !            	     
+z(I00QJ   	      Jz(I00QJ         Jz(I00QJ            H   B    H@        Jz(I00QJc           c, I0
+                     B  0    c,         c, I0
+                    B  0    z       Jz(I00QJz       Jz(I00QJz       QJz(I00QJz       QJz(I00QJz       QJz(I00QJ  B      H   B    Hc,     0  c, I0
+  c,       c, I0
+  c,      c, I0
+  c, @    c, I0
+           !           B     H   B    H  B     H   B    H
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/html-docs/ghost-object.html
@@ -0,0 +1,314 @@
+<!DOCTYPE html>
+<html class="no-js" id="top">
+<head>
+    <title>ProxyManager - Ghost object</title>
+
+    <meta name="description" content="A proxyManager write in php" />
+    <meta name="keywords" content="ProxyManager, proxy, manager, ocramius, Marco Pivetta, php, ghost object" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+    <link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600' rel='stylesheet' type='text/css'>
+    <link href="css/styles.css" rel="stylesheet" />
+    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/default.min.css">
+    <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/highlight.min.js"></script>
+    <script>hljs.initHighlightingOnLoad();</script>
+    <link rel="shortcut icon" href="favicon.ico">
+</head>
+<body>
+
+<header class="site-header">
+<div class="container">
+<h1><a href="index.html"><img alt="ProxyManager" src="img/block.png" /></a></h1>
+
+<nav class="main-nav" role="navigation">
+<ul>
+    <li><a href="https://github.com/Ocramius/ProxyManager" target="_blank">Github</a>
+    <div class="bcms-clearfix"></div>
+</li>
+</ul>
+</nav>
+</div>
+</header>
+<main role="main">
+<section class="component-content">
+
+<div class="component-demo" id="live-demo">
+    <div class="container">
+            <div class="main-wrapper" style="text-align: right">
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=fork&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="310" height="40"></iframe>
+
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=watch&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="200" height="40"></iframe>
+
+            </div>
+        <div class="bcms-clearfix bcms-clearfix"></div>
+    </div>
+</div>
+<div class="component-info">
+<div class="container">
+<aside class="sidebar">
+    <nav class="spy-nav">
+        <ul>
+            <li><a href="index.html">Intro</a></li>
+            <li><a href="virtual-proxy.html">Virtual Proxy</a></li>
+            <li><a href="null-object.html">Null Objects</a></li>
+            <li><a href="ghost-object.html">Ghost Objects</a></li>
+            <li><a href="remote-object.html">Remote Object</a></li>
+            <li><a href="contributing.html">Contributing</a></li>
+            <li><a href="credits.html">Credits</a></li>
+            <li><a href="copyright.html">Copyright</a></li>
+        </ul>
+    </nav>
+<div class="bcms-clearfix bcms-clearfix"></div>
+<a class="btn btn-action btn-full download-component"
+    href="download.html">Download</a>
+    <div class="bcms-clearfix"></div>
+</aside>
+
+<div class="content">
+    <div class="bcms-clearfix"></div>
+    <h3 class="section-title">Lazy Loading Ghost Object Proxies</h3>
+
+    <p>A lazy loading ghost object proxy is a ghost proxy that looks exactly like the real instance of the proxied subject, but which has all properties nulled before initialization.</p>
+<hr />
+
+    <h3 class="section-title">Lazy loading with the Ghost Object</h3>
+
+    <p>In pseudo-code, in userland, <a href="http://www.martinfowler.com/eaaCatalog/lazyLoad.html" target="_blank">lazy loading</a> in a ghost object looks like following:</p>
+
+    <pre>
+        <code class="php">
+class MyObjectProxy
+{
+    private $initialized = false;
+    private $name;
+    private $surname;
+
+    public function doFoo()
+    {
+        $this->init();
+
+        // Perform doFoo routine using loaded variables
+    }
+
+    private function init()
+    {
+        if (! $this->initialized) {
+            $data          = some_logic_that_loads_data();
+
+            $this->name    = $data['name'];
+            $this->surname = $data['surname'];
+
+            $this->initialized = true;
+        }
+    }
+}
+        </code>
+    </pre>
+
+    <p>Ghost objects work similarly to virtual proxies, but since they don't wrap around a "real" instance of the proxied subject, they are better suited for representing dataset rows.</p>
+    
+<hr />
+
+    <h3 class="section-title">When do I use a ghost object?</h3>
+
+    <p>You usually need a ghost object in cases where following applies</p>
+    
+    <ul>
+        <li>you are building a small data-mapper and want to lazily load data across associations in your object graph</li>
+        <li>you want to initialize objects representing rows in a large dataset</li>
+        <li>you want to compare instances of lazily initialized objects without the risk of comparing a proxy with a real subject</li>
+        <li>you are aware of the internal state of the object and are confident in working with its internals via reflection or direct property access</li>
+    </ul>  
+
+<hr />
+
+    <h3 class="section-title">Usage examples</h3>
+
+    <p><a href="https://github.com/Ocramius/ProxyManager" target="_blank">ProxyManager</a> provides a factory that creates lazy loading ghost objects. To use it, follow these steps:</p>
+
+    <p>First of all, define your object's logic without taking care of lazy loading:</p>
+    
+    <pre>
+        <code class="php">
+namespace MyApp;
+
+class Customer
+{
+    private $name;
+    private $surname;
+
+    // just write your business logic or generally logic
+    // don't worry about how complex this object will be!
+    // don't code lazy-loading oriented optimizations in here!
+    public function getName() { return $this->name; }
+    public function setName($name) { $this->name = (string) $name; }
+    public function getSurname() { return $this->surname; }
+    public function setSurname($surname) { $this->surname = (string) $surname; }
+}
+        </code>
+    </pre>
+
+    <p>Then use the proxy manager to create a ghost object of it. You will be responsible of setting its state during lazy loading:</p>
+    
+    <pre>
+        <code class="php">
+namespace MyApp;
+
+use ProxyManager\Factory\LazyLoadingGhostFactory;
+use ProxyManager\Proxy\LazyLoadingInterface;
+
+require_once __DIR__ . '/vendor/autoload.php';
+
+$factory     = new LazyLoadingGhostFactory();
+$initializer = function (LazyLoadingInterface $proxy, $method, array $parameters, & $initializer) {
+    $initializer   = null; // disable initialization
+
+    // load data and modify the object here
+    $proxy->setName('Agent');
+    $proxy->setSurname('Smith');
+
+    return true; // confirm that initialization occurred correctly
+};
+
+$instance = $factory->createProxy('MyApp\Customer', $initializer);
+        </code>
+    </pre>
+
+    <p>You can now simply use your object as before:</p>
+
+    <pre>
+        <code class="php">
+// this will just work as before
+echo $proxy->getName() . ' ' . $proxy->getSurname(); // Agent Smith
+        </code>
+    </pre>
+<hr />
+
+    <h3 class="section-title">Lazy Initialization</h3>
+
+    <p>As you can see, we use a closure to handle lazy initialization of the proxy instance at runtime. The initializer closure signature for ghost objects should be as following:</p>
+
+    <pre>
+        <code class="php">
+/**
+ * @var object  $proxy         the instance the ghost object proxy that is being initialized
+ * @var string  $method        the name of the method that triggered lazy initialization
+ * @var array   $parameters    an ordered list of parameters passed to the method that
+ *                             triggered initialization, indexed by parameter name
+ * @var Closure $initializer   a reference to the property that is the initializer for the
+ *                             proxy. Set it to null to disable further initialization
+ *
+ * @return bool true on success
+ */
+$initializer = function ($proxy, $method, $parameters, &amp; $initializer) {};
+        </code>
+    </pre>
+
+    <p>The initializer closure should usually be coded like following:</p>
+
+    <pre>
+        <code class="php">
+$initializer = function ($proxy, $method, $parameters, & $initializer) {
+    $initializer = null; // disable initializer for this proxy instance
+
+    // modify the object with loaded data
+    $proxy->setFoo(/* ... */);
+    $proxy->setBar(/* ... */);
+
+    return true; // report success
+};
+        </code>
+    </pre>
+
+    <p>The <code>ProxyManager\Factory\LazyLoadingGhostFactory</code> produces proxies that implement both the <code>ProxyManager\Proxy\GhostObjectInterface</code> and the <code>ProxyManager\Proxy\LazyLoadingInterface</code>.</p>
+
+    <p>At any point in time, you can set a new initializer for the proxy:</p>
+
+    <pre>
+        <code class="php">
+$proxy->setProxyInitializer($initializer);
+        </code>
+    </pre>
+
+    <p>In your initializer, you <strong>MUST</strong> turn off any further initialization:</p>
+
+    <pre>
+        <code class="php">
+$proxy->setProxyInitializer(null);
+        </code>
+    </pre>
+
+    <p>or</p>
+
+    <pre>
+        <code class="php">
+$initializer = null; // if you use the initializer passed by reference to the closure
+        </code>
+    </pre>
+<hr />
+
+    <h3 class="section-title">Triggering Initialization</h3>
+
+    <p>A lazy loading ghost object is initialized whenever you access any property or method of it. Any of the following interactions would trigger lazy initialization:</p>
+
+    <pre>
+        <code class="php">
+// calling a method
+$proxy->someMethod();
+
+// reading a property
+echo $proxy->someProperty;
+
+// writing a property
+$proxy->someProperty = 'foo';
+
+// checking for existence of a property
+isset($proxy->someProperty);
+
+// removing a property
+unset($proxy->someProperty);
+
+// cloning the entire proxy
+clone $proxy;
+
+// serializing the proxy
+$unserialized = unserialize(serialize($proxy));
+        </code>
+    </pre>
+
+    <p>Remember to call <code>$proxy->setProxyInitializer(null);</code> to disable initialization of your proxy, or it will happen more than once.</p>
+
+<hr />
+    
+    <h3 class="section-title">Proxying interfaces</h3>
+    
+    <p>You can also generate proxies from an interface FQCN. By proxying an interface, you will only be able to access the methods defined by the interface itself, even if the <code>wrappedObject</code> implements more methods. This will anyway save some memory since the proxy won't contain any properties.</p>
+
+    <p>Tuning performance for production</p>
+
+    <p>See <a href="production.html">Tuning ProxyManager for Production.</a></p>
+
+</main>
+
+    <footer class="site-footer" role="contentinfo">
+        <div class="container">
+            <div class="footer-logos">
+                <ul>
+                    <li><a href="index.html">Intro</a> | </li>
+                    <li><a href="virtual-proxy.html">Virtual Proxy</a> | </li>
+                    <li><a href="null-object.html">Null Objects</a> | </li>
+                    <li><a href="ghost-object.html">Ghost Objects</a> | </li>
+                    <li><a href="remote-object.html">Remote Object</a> | </li>
+                    <li><a href="contributing.html">Contributing</a> | </li>
+                    <li><a href="credits.html">Credits</a> | </li>
+                    <li><a href="copyright.html">Copyright</a></li>
+                </ul>
+            </div>
+        </div>
+
+        <div class="bcms-clearfix"></div>
+    </footer>
+    <div class="bcms-clearfix"></div>
+    </body>
+</html>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/html-docs/img/block.png
@@ -0,0 +1,21 @@
+PNG
+
+   
IHDR   J   T   %   tEXtSoftware Adobe ImageReadyqe<  #iTXtXML:com.adobe.xmp     <?xpacket begin="﻿" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.154911, 2013/10/29-11:47:16        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC (Macintosh)" xmpMM:InstanceID="xmp.iid:26A6CB80D24111E3A32DBCE6AA9648A2" xmpMM:DocumentID="xmp.did:26A6CB81D24111E3A32DBCE6AA9648A2"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:26A6CB7ED24111E3A32DBCE6AA9648A2" stRef:documentID="xmp.did:26A6CB7FD24111E3A32DBCE6AA9648A2"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>qz  IDATxhVU^k@^"'mGX$+,XE?2"
+esd$ae9Ք
+"+AC&~͘eC3hky|^޷<=ܳw7{NE
տDDYm`?gǘv `Џ.&e&R+/jh!/;i/JubiOieGj]xid_,۩mE5Qgb^Z>C`R -F;maS
BA_%_BuI}j5+Ŝ7!		렶/EJ7qf0(y8AKz	jSj)Wzrب	e@}爚ցA+l2b
+;A憉	,&l.+ZV4TJܬUVX1zW%Pq?
+^ux<mdbIu[A
+%o}
+sDd\	(͕,b
+:T!KO?9`c=
^σb
	\04#ȕNqr(檧jODS,FTg2sT\:rآºS\)arԖ$W*V,\)!arUm֔PgXE
+;n`B77'&*`ЯxA9bgf%aVH]W]טқ=	ƛ^㢂6
+HlԜȳ@7FHOGl?3{nj#ђ1y5X@D:&.cx&L^e+A#uzIڶ{tЙ>Fj(M0}Lێlet&M:iTKEkJRߦ?Dy6
+Лŉr('ʉr(W('ʉr('ʉrŉrl,MR~$vܛδQ}/jB|t9
+%
+PޓdnUp-έM	!bۓ9
+aH`x\1
m>l:"rx9ca
+l-Rk_2<-xGrkD5t3lw%gz3pu?^HB}{p4T	ާ
+nPҝ[fl%X}{
8cp}n{ﺋO;yVn{%fm⶧k>oi	Ikfpyy\_6wuI3O534M;#bNw
+-
+ߘu|	'5.?6wʏ
+Vb-͢=c֡=^ ?"O1wްilz'ΰL\Sxd4QQewneFZb-+ :/܃{    IENDB`
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/html-docs/img/enf.png
@@ -0,0 +1,15 @@
+PNG
+
+   
IHDR         oٯ   gAMA  a   sRGB    iPLTE   ,>*2*0,A+5,C*.+;+9+7,F,H,E-K*,*+kuKPRe**8<z   
+tRNS ꏯ:i%g  
IDATx흉v3Y2I?jAPTDzH=^^;_V~>XUT/@RPܯ__~R~R>P0KK]!,nS>^~l^޾dX/+uz5 c{o\%	B6
7
'[+u~n j7x@Lm4n:T/:MRU!}.+MiEHz[!_.@6BZ}оˆ]%u+X3o=E;s
Yuc'jo[tqiFk:h>=EWCj2DRct5jx&V	@(DaXzց7;hw̼h8A'ڻ ij4s.@j^ټWlx+.rˇS%W;'`f]l^xnT6{X^F'I©^͔IdF
l^3&:Zek^ej$E^)n6}(5!
+=#6"3r~c'w*?g3,=,=ـ5و𾩷
* 60,
{cP&sӥŝ }Ob+(#v}>^y&pW'd@ 0;;b"HR%}J?0\BH?	Tۙwd0yccFUU"pYh[W65ؾ[ŽBAA
+<x(ysOnzn5K4K heZڽI<oG:ulpmgA{bhW)LAm2^̇ށ'5:>S	\KIRJ=BO'%Gs	NDh=:h M-GZ1EZ#vDSmlh.:H#qсri""AD{2#486&#/@>xGNȨBd0㚙+(mA!s $y?+y8pHh'|?\íj<9ėɎzR>|12h8F@#yFsPynlqpyR<\ugMo.J@^Ŵa]QD0
+`OI7u_8.$X)8br2;j0*Np$5;;@h!;Z%	YgIF_A\}فHN\#8x98c÷?q\a}wiU;'쟮~@ # Zs9b;{w+g+p%sD93YԽupR1V6@0)ٸqeLqd,cv4f0h:˔u:Ȍu$z8F=L&unFB"dBV?\tG]*B^-l	mލKf.ѳӗP惃'*՛Pϒe[*P=tt)ved|=\Xyxٜqj?{f5}O+[z*MI;mƱ]fq)~.1TJLgAN:/)i=d`ܥ/^\V|-L1Oi O	%B{t劂L%jYMٯLSVppmz&c:O9Otjd3<4WstbƂiZ,DJY:AK4\>R^
+=%|:^6=
D˦â7+=/`{RYlOQ{&g 	9RΙ^v&<éV؞,79=Zf@0}C$Z Ur@[<;儥x<`80HP
+3%5
ѵnL>[)F3fϑ,˘:e!Xw\>+a_nkLlk`8~._8J덀_8cޣxK^7Jk`ͩ={D=RNpG}e[FG#~.aX6pA<R3U27n!nl:ӾBE<PӆT`Cc,!ju8mJ]4ʜ	N!-Nˁ
%
+݅XZ)_SFx=!|B=HY
y&xP/{fWO7y0h1̜
~x7[2-	_scꄕQW86Ų$Ԏq"ph
ġհC,G;QLCԍ!5ŠnXG#%T-ǱB3⒕)nkG(HlcR$J`v	oWqՊA
+u6VjR0MV~*Jf*Я2\T&QdكTDLZE*@e3^U]*5)fdRQl6Ū錛EGclln[]>c+@#sLO-ߤ\RW9c9=OG}׿¡^(jWzŌ@g]׽v"4<FUL0
+E$'R ָڑKPS^6
+H`Z))HLW, ~֍U&vcVRF˅UH)%p%jAKqfm^rC*5b-S)cdw<XnXlRIʥn.r3ҭq]R/=.eiFRdY,ť{Zڥ}{e#%D	Ӏ_
+p,i4Tx[eI~#_3JNX\ϭr)>J)
+cրR"xޓ9KҐbHhME<ߦG.c_Az<?LJ%V:ؓ
{oW+=AJvޭ.o>%Q;>v9"Vg7wk=V6hف`'>ZZ<$UJ}GI&6p<CAOW~*nPJݽAjûSC.m2.*rc.RX_o Z^}ˆ?<wR?ܲ=Jhc ==-NA?7v?VcEr
Y^^)
tq{ٚLny]ie~}koJ}=
#{.G(nWx<?
e    IENDB`
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/html-docs/index.html
@@ -0,0 +1,295 @@
+<!DOCTYPE html>
+<html class="no-js" id="top">
+<head>
+    <title>ProxyManager</title>
+
+    <meta name="description" content="A proxyManager write in php" />
+    <meta name="keywords" content="ProxyManager, proxy, manager, ocramius, Marco Pivetta, php" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+    <link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600' rel='stylesheet' type='text/css'>
+    <link href="css/styles.css" rel="stylesheet" />
+    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/default.min.css">
+    <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/highlight.min.js"></script>
+    <script>hljs.initHighlightingOnLoad();</script>
+    <link rel="shortcut icon" href="favicon.ico">
+</head>
+<body>
+
+<header class="site-header">
+<div class="container">
+<h1><a href="index.html"><img alt="ProxyManager" src="img/block.png" /></a></h1>
+
+<nav class="main-nav" role="navigation">
+<ul>
+    <li><a href="https://github.com/Ocramius/ProxyManager" target="_blank">Github</a>
+    <div class="bcms-clearfix"></div>
+</li>
+</ul>
+</nav>
+</div>
+</header>
+<main role="main">
+<section class="component-content"><div class="page-title-wrapper">
+<div class="container">
+    <img src="https://github.com/Ocramius/ProxyManager/raw/master/proxy-manager.png">
+    <h2 class="page-title">Proxy Manager</h2>
+</div>
+</div>
+
+<div class="component-demo" id="live-demo">
+    <div class="container">
+            <div class="main-wrapper" style="text-align: right">
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=fork&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="310" height="40"></iframe>
+
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=watch&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="200" height="40"></iframe>
+
+            </div>
+        <div class="bcms-clearfix bcms-clearfix"></div>
+    </div>
+</div>
+<div class="component-info">
+<div class="container">
+
+<aside class="sidebar">
+    <nav class="spy-nav">
+        <ul>
+            <li><a href="index.html">Intro</a></li>
+            <li><a href="virtual-proxy.html">Virtual Proxy</a></li>
+            <li><a href="null-object.html">Null Objects</a></li>
+            <li><a href="ghost-object.html">Ghost Objects</a></li>
+            <li><a href="remote-object.html">Remote Object</a></li>
+            <li><a href="contributing.html">Contributing</a></li>
+            <li><a href="credits.html">Credits</a></li>
+            <li><a href="copyright.html">Copyright</a></li>
+        </ul>
+    </nav>
+<div class="bcms-clearfix bcms-clearfix"></div>
+<a class="btn btn-action btn-full download-component"
+    href="download.html">Download</a>
+    <div class="bcms-clearfix"></div>
+</aside>
+
+<div class="content">
+    <h3>Proxy Manager</h3>
+    <p>This library aims at providing abstraction for generating various kinds of <a href="http://ocramius.github.io/presentations/proxy-pattern-in-php/" target="_blank">proxy classes</a>.</p>
+    <p>If you want to learn more about proxy pattern watch this video:</p>
+
+    <iframe width="640" height="390" src="//www.youtube.com/embed/Ka8wlV8M6Vg" frameborder="0" allowfullscreen></iframe>
+<hr />
+    <div class="bcms-clearfix"></div>
+    <h3 class="section-title">Installation</h3>
+    <p>The suggested installation method is via <a href="https://getcomposer.org/" target="_blank">composer</a>.</p>
+    <pre><code class="sh">php composer.phar require ocramius/proxy-manager:1.0.*</code></pre>
+<hr />
+
+    <h3 class="section-title" id="virtualproxy">Lazy Loading Value Holders (Virtual Proxy)</h3>
+
+    <p>ProxyManager can generate
+        <a href="http://www.martinfowler.com/eaaCatalog/lazyLoad.html" target="_blank">lazy loading value holders</a>,
+         which are virtual proxies capable of saving performance and memory for objects that
+        require a lot of dependencies or CPU cycles to be loaded:
+        particularly useful when you may not always need the object,
+        but are constructing it anyways.</p>
+
+    <pre>
+        <code class="php">
+$factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory();
+
+$proxy = $factory->createProxy(
+    'MyApp\HeavyComplexObject',
+    function (&amp; $wrappedObject, $proxy, $method, $parameters, &amp; $initializer) {
+        $wrappedObject = new HeavyComplexObject(); // instantiation logic here
+        $initializer   = null; // turning off further lazy initialization
+
+        return true;
+    }
+);
+
+$proxy->doFoo();
+        </code>
+    </pre>
+
+    <p>See the <a href="virtual-proxy.html">complete documentation about lazy loading value holders</a>.</p>
+<hr />
+
+    <h3 class="section-title">Access Interceptor Value Holder</h3>
+
+    <p>An access interceptor value holder is a smart reference that allows you to execute
+     logic before and after a particular method is executed or a particular property is
+     accessed, and it allows to manipulate parameters and return values depending on
+     your needs.</p>
+
+    <pre>
+        <code class="php">
+$factory = new \ProxyManager\Factory\AccessInterceptorValueHolderFactory();
+
+$proxy = $factory->createProxy(
+    new \My\Db\Connection(),
+    array('query' => function () { echo "Query being executed!\n"; }),
+    array('query' => function () { echo "Query completed!\n"; })
+);
+
+$proxy->query(); // produces "Query being executed!\nQuery completed!\n"
+        </code>
+    </pre>
+
+    <p>See the <a href="access-interceptor-value-holder-proxy.html">complete documentation about access interceptor value holders</a>.</p>
+<hr />
+
+    <h3 class="section-title">Access Interceptor Scope Localizer</h3>
+
+    <p>An access interceptor scope localizer works exactly like an access interceptor
+     value holder, but it is safe to use to proxy fluent interfaces.</p>
+
+    <p>See the <a href="access-interceptor-scope-localizer-proxy.html">complete documentation about access interceptor scope localizer</a>.</p>
+<hr />
+
+
+    <h3 class="section-title">Null Objects</h3>
+
+    <p>A Null Object proxy implements the null object pattern.</p>
+
+    <p>This kind of proxy allows you to have fallback logic in case loading of the wrapped value failed.</p>
+    <pre>
+        <code class="php">
+$factory = new \ProxyManager\Factory\NullObjectFactory();
+
+$proxy = $factory->createProxy('My\EntityObject');
+
+$proxy->getName(); // empty return
+        </code>
+    </pre>
+
+    <p>A Null Object Proxy can be created from an object, a class name or an interface name:</p>
+    <pre>
+        <code class="php">
+$factory = new \ProxyManager\Factory\NullObjectFactory();
+
+$proxy = $factory->createProxy('My\EntityObjectInterface');
+$proxy->getName(); // empty return
+
+$proxy = $factory->createProxy($entity); // created from object
+$proxy->getName(); // empty return
+        </code>
+    </pre>
+
+    <p>See the <a href="null-object.html">complete documentation about null object proxy</a>.</p>
+
+<hr />
+
+    <h3 class="section-title">Ghost Objects</h3>
+
+    <p>Similar to value holder, a ghost object is usually created to handle lazy loading.</p>
+
+    <p>The difference between a value holder and a ghost object is that the ghost
+        object does not contain a real instance of the required object, but handles
+        lazy loading by initializing its own inherited properties.</p>
+
+    <p>ProxyManager can generate
+        <a href="http://www.martinfowler.com/eaaCatalog/lazyLoad.html" target="_blank">lazy loading ghost objects</a>,
+         which are proxies used to save performance and memory for large datasets and
+         graphs representing relational data. Ghost objects are particularly useful
+         when building data-mappers.</p>
+
+    <p>Additionally, the overhead introduced by ghost objects is very low when
+        compared to the memory and performance overhead caused by virtual proxies.</p>
+
+    <pre>
+        <code class="php">
+$factory = new \ProxyManager\Factory\LazyLoadingGhostFactory();
+
+$proxy = $factory->createProxy(
+    'MyApp\HeavyComplexObject',
+    function ($proxy, $method, $parameters, & $initializer) {
+        $initializer   = null; // turning off further lazy initialization
+
+        // modify the proxy instance
+        $proxy->setFoo('foo');
+        $proxy->setBar('bar');
+
+        return true;
+    }
+);
+
+$proxy->doFoo();
+        </code>
+    </pre>
+
+    <p>See the <a href="ghost-object.html">complete documentation about lazy loading ghost objects</a>.</p>
+
+<hr />
+
+    <h3 class="section-title">Remote Object</h3>
+
+    <p>A remote object proxy is an object that is located on a different system,
+        but is used as if it was available locally. There's various possible
+        remote proxy implementations, which could be based on xmlrpc/jsonrpc/soap/dnode/etc.</p>
+
+    <p>This example uses the XML-RPC client of Zend Framework 2:</p>
+
+    <pre>
+        <code class="php">
+interface FooServiceInterface
+{
+    public function foo();
+}
+
+$factory = new \ProxyManager\Factory\RemoteObjectFactory(
+    new \ProxyManager\Factory\RemoteObject\Adapter\XmlRpc(
+        new \Zend\XmlRpc\Client('https://example.com/rpc-endpoint')
+    )
+);
+
+// proxy is your remote implementation
+$proxy = $factory->createProxy('FooServiceInterface');
+
+var_dump($proxy->foo());
+        </code>
+    </pre>
+
+    <p>See the <a href="remote-object.html">complete documentation about remote objects</a>.</p>
+<hr />
+
+
+<h3 class="section-title">Contributing</h3>
+    <p>Please read the <a href="contributing.html">CONTRIBUTING</a> contents if you wish to help out!</p>
+
+<hr />
+
+<h3 class="section-title">Credits</h3>
+
+    <p>The idea was originated by a <a href="http://marco-pivetta.com/proxy-pattern-in-php/" target="_blank">talk about Proxies in PHP OOP</a> that I gave at the <a href="https://twitter.com/phpugffm" target="_blank">@phpugffm</a> in January 2013.</p>
+
+
+    <div class="bcms-clearfix"></div>
+
+    </div>
+    </div>
+</div>
+
+
+</main>
+
+    <footer class="site-footer" role="contentinfo">
+        <div class="container">
+            <div class="footer-logos">
+                <ul>
+                    <li><a href="index.html">Intro</a> | </li>
+                    <li><a href="virtual-proxy.html">Virtual Proxy</a> | </li>
+                    <li><a href="null-object.html">Null Objects</a> | </li>
+                    <li><a href="ghost-object.html">Ghost Objects</a> | </li>
+                    <li><a href="remote-object.html">Remote Object</a> | </li>
+                    <li><a href="contributing.html">Contributing</a> | </li>
+                    <li><a href="credits.html">Credits</a> | </li>
+                    <li><a href="copyright.html">Copyright</a></li>
+                </ul>
+            </div>
+        </div>
+
+        <div class="bcms-clearfix"></div>
+    </footer>
+    <div class="bcms-clearfix"></div>
+    </body>
+</html>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/html-docs/null-object.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html>
+<html class="no-js" id="top">
+<head>
+    <title>ProxyManager - Null object</title>
+
+    <meta name="description" content="A proxyManager write in php" />
+    <meta name="keywords" content="ProxyManager, proxy, manager, ocramius, Marco Pivetta, php, null object" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+    <link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600' rel='stylesheet' type='text/css'>
+    <link href="css/styles.css" rel="stylesheet" />
+    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/default.min.css">
+    <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/highlight.min.js"></script>
+    <script>hljs.initHighlightingOnLoad();</script>
+    <link rel="shortcut icon" href="favicon.ico">
+</head>
+<body>
+
+<header class="site-header">
+<div class="container">
+<h1><a href="index.html"><img alt="ProxyManager" src="img/block.png" /></a></h1>
+
+<nav class="main-nav" role="navigation">
+<ul>
+    <li><a href="https://github.com/Ocramius/ProxyManager" target="_blank">Github</a>
+    <div class="bcms-clearfix"></div>
+</li>
+</ul>
+</nav>
+</div>
+</header>
+<main role="main">
+<section class="component-content">
+
+<div class="component-demo" id="live-demo">
+    <div class="container">
+            <div class="main-wrapper" style="text-align: right">
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=fork&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="310" height="40"></iframe>
+
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=watch&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="200" height="40"></iframe>
+
+            </div>
+        <div class="bcms-clearfix bcms-clearfix"></div>
+    </div>
+</div>
+<div class="component-info">
+<div class="container">
+<aside class="sidebar">
+    <nav class="spy-nav">
+        <ul>
+            <li><a href="index.html">Intro</a></li>
+            <li><a href="virtual-proxy.html">Virtual Proxy</a></li>
+            <li><a href="null-object.html">Null Objects</a></li>
+            <li><a href="ghost-object.html">Ghost Objects</a></li>
+            <li><a href="remote-object.html">Remote Object</a></li>
+            <li><a href="contributing.html">Contributing</a></li>
+            <li><a href="credits.html">Credits</a></li>
+            <li><a href="copyright.html">Copyright</a></li>
+        </ul>
+    </nav>
+<div class="bcms-clearfix bcms-clearfix"></div>
+<a class="btn btn-action btn-full download-component"
+    href="download.html">Download</a>
+    <div class="bcms-clearfix"></div>
+</aside>
+
+<div class="content">
+    <div class="bcms-clearfix"></div>
+    <h3 class="section-title">Null Object Proxy</h3>
+    <p>A Null Object proxy is a <a href="http://en.wikipedia.org/wiki/Null_Object_pattern" target="_blank">null object pattern</a> implementation. The proxy factory creates a new object with defined neutral behavior based on an other object, class name or interface.</p>
+<hr />
+
+    <h3 class="section-title">What is null object proxy ?</h3>
+
+    <p>In your application, when you can't return the object related to the request, the consumer of the model must check for the return value and handle the failing condition gracefully, thus generating an explosion of conditionals throughout your code. Fortunately, this seemingly-tangled situation can be sorted out simply by creating a polymorphic implementation of the domain object, which would implement the same interface as the one of the object in question, only that its methods wouldn’t do anything, therefore offloading client code from doing repetitive checks for ugly null values when the operation is executed.</p>
+
+<hr />
+
+    <h3 class="section-title">Usage examples</h3>
+
+    <pre>
+        <code class="php">
+class UserMapper
+{   
+    private $adapter;
+
+    public function __construct(DatabaseAdapterInterface $adapter) {
+        $this->adapter = $adapter;
+    }
+
+    public function fetchById($id) {
+        $this->adapter->select("users", array("id" => $id));
+        if (!$row = $this->adapter->fetch()) {
+            return null;
+        }
+        return $this->createUser($row);
+    }
+
+    private function createUser(array $row) {
+        $user = new Entity\User($row["name"], $row["email"]);
+        $user->setId($row["id"]);
+        return $user;
+    }
+}
+        </code>
+    </pre>
+
+    <p>If you want to remove conditionals from client code, you need to have a version of the entity conforming to the corresponding interface. With the Null Object Proxy, you can build this object :</p>
+
+    <pre>
+        <code class="php">
+$factory = new \ProxyManager\Factory\NullObjectFactory();
+
+$nullUser = $factory->createProxy('Entity\User');
+
+var_dump($nullUser->getName()); // empty return
+        </code>
+    </pre>
+
+    <p>You can now return a valid entity :</p>
+
+    <pre>
+        <code class="php">
+class UserMapper
+{   
+    private $adapter;
+
+    public function __construct(DatabaseAdapterInterface $adapter) {
+        $this->adapter = $adapter;
+    }
+
+    public function fetchById($id) {
+        $this->adapter->select("users", array("id" => $id));
+        return $this->createUser($this->adapter->fetch());
+    }
+
+    private function createUser($row) {
+        if (!$row) {
+            $factory = new \ProxyManager\Factory\NullObjectFactory();
+
+            return $factory->createProxy('Entity\User');
+        }
+        $user = new Entity\User($row["name"], $row["email"]);
+        $user->setId($row["id"]);
+        return $user; 
+    }
+}
+        </code>
+    </pre>
+    
+    
+<hr />
+
+    <h3 class="section-title">Proxying interfaces</h3>
+
+    <p>You can also generate proxies from an interface FQCN. By proxying an interface, you will only be able to access the methods defined by the interface itself, and like with the object, the methods are empty.</p>
+
+    <p>Tuning performance for production</p>
+
+    <p>See <a href="production.html">Tuning ProxyManager for Production.</a></p>
+
+</main>
+
+    <footer class="site-footer" role="contentinfo">
+        <div class="container">
+            <div class="footer-logos">
+                <ul>
+                    <li><a href="index.html">Intro</a> | </li>
+                    <li><a href="virtual-proxy.html">Virtual Proxy</a> | </li>
+                    <li><a href="null-object.html">Null Objects</a> | </li>
+                    <li><a href="ghost-object.html">Ghost Objects</a> | </li>
+                    <li><a href="remote-object.html">Remote Object</a> | </li>
+                    <li><a href="contributing.html">Contributing</a> | </li>
+                    <li><a href="credits.html">Credits</a> | </li>
+                    <li><a href="copyright.html">Copyright</a></li>
+                </ul>
+            </div>
+        </div>
+
+        <div class="bcms-clearfix"></div>
+    </footer>
+    <div class="bcms-clearfix"></div>
+    </body>
+</html>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/html-docs/production.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<html class="no-js" id="top">
+<head>
+    <title>ProxyManager - Tuning the ProxyManager for production</title>
+
+    <meta name="description" content="A proxyManager write in php" />
+    <meta name="keywords" content="ProxyManager, proxy, manager, ocramius, Marco Pivetta, php, production" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+    <link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600' rel='stylesheet' type='text/css'>
+    <link href="css/styles.css" rel="stylesheet" />
+    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/default.min.css">
+    <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/highlight.min.js"></script>
+    <script>hljs.initHighlightingOnLoad();</script>
+    <link rel="shortcut icon" href="favicon.ico">
+</head>
+<body>
+
+<header class="site-header">
+<div class="container">
+<h1><a href="index.html"><img alt="ProxyManager" src="img/block.png" /></a></h1>
+
+<nav class="main-nav" role="navigation">
+<ul>
+    <li><a href="https://github.com/Ocramius/ProxyManager" target="_blank">Github</a>
+    <div class="bcms-clearfix"></div>
+</li>
+</ul>
+</nav>
+</div>
+</header>
+<main role="main">
+<section class="component-content">
+
+<div class="component-demo" id="live-demo">
+    <div class="container">
+            <div class="main-wrapper" style="text-align: right">
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=fork&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="310" height="40"></iframe>
+
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=watch&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="200" height="40"></iframe>
+
+            </div>
+        <div class="bcms-clearfix bcms-clearfix"></div>
+    </div>
+</div>
+<div class="component-info">
+<div class="container">
+<aside class="sidebar">
+    <nav class="spy-nav">
+        <ul>
+            <li><a href="index.html">Intro</a></li>
+            <li><a href="virtual-proxy.html">Virtual Proxy</a></li>
+            <li><a href="null-object.html">Null Objects</a></li>
+            <li><a href="ghost-object.html">Ghost Objects</a></li>
+            <li><a href="remote-object.html">Remote Object</a></li>
+            <li><a href="contributing.html">Contributing</a></li>
+            <li><a href="credits.html">Credits</a></li>
+            <li><a href="copyright.html">Copyright</a></li>
+        </ul>
+    </nav>
+<div class="bcms-clearfix bcms-clearfix"></div>
+<a class="btn btn-action btn-full download-component"
+    href="download.html">Download</a>
+    <div class="bcms-clearfix"></div>
+</aside>
+
+<div class="content">
+    <div class="bcms-clearfix"></div>
+    <h3 class="section-title">Tuning the ProxyManager for production</h3>
+
+    <p>By default, all proxy factories generate the required proxy classes at runtime.</p>
+    
+    <p>Proxy generation causes I/O operations and uses a lot of reflection, so be sure to have generated all of your proxies <strong>before deploying your code on a live system</strong>, or you may experience poor performance.</p>
+    
+    <p>You can configure ProxyManager so that it will try autoloading the proxies first. Generating them "bulk" is not yet implemented:</p>
+
+    <pre>
+        <code class="php">
+$config = new \ProxyManager\Configuration();
+$config->setProxiesTargetDir(__DIR__ . '/my/generated/classes/cache/dir');
+
+// then register the autoloader
+spl_autoload_register($config->getProxyAutoloader());
+        </code>
+    </pre>
+
+    <p>Generating a classmap with all your proxy classes in it will also work perfectly.</p>
+
+    <p>Please note that all the currently implemented <code>ProxyManager\Factory\*</code> classes accept a <code>ProxyManager\Configuration</code> object as optional constructor parameter. This allows for fine-tuning of ProxyManager according to your needs.</p>
+
+</main>
+
+    <footer class="site-footer" role="contentinfo">
+        <div class="container">
+            <div class="footer-logos">
+                <ul>
+                    <li><a href="index.html">Intro</a> | </li>
+                    <li><a href="virtual-proxy.html">Virtual Proxy</a> | </li>
+                    <li><a href="null-object.html">Null Objects</a> | </li>
+                    <li><a href="ghost-object.html">Ghost Objects</a> | </li>
+                    <li><a href="remote-object.html">Remote Object</a> | </li>
+                    <li><a href="contributing.html">Contributing</a> | </li>
+                    <li><a href="credits.html">Credits</a> | </li>
+                    <li><a href="copyright.html">Copyright</a></li>
+                </ul>
+            </div>
+        </div>
+
+        <div class="bcms-clearfix"></div>
+    </footer>
+    <div class="bcms-clearfix"></div>
+    </body>
+</html>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/html-docs/remote-object.html
@@ -0,0 +1,203 @@
+<!DOCTYPE html>
+<html class="no-js" id="top">
+<head>
+    <title>ProxyManager - Remote object</title>
+
+    <meta name="description" content="A proxyManager write in php" />
+    <meta name="keywords" content="ProxyManager, proxy, manager, ocramius, Marco Pivetta, php, remote object" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+    <link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600' rel='stylesheet' type='text/css'>
+    <link href="css/styles.css" rel="stylesheet" />
+    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/default.min.css">
+    <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/highlight.min.js"></script>
+    <script>hljs.initHighlightingOnLoad();</script>
+    <link rel="shortcut icon" href="favicon.ico">
+</head>
+<body>
+
+<header class="site-header">
+<div class="container">
+<h1><a href="index.html"><img alt="ProxyManager" src="img/block.png" /></a></h1>
+
+<nav class="main-nav" role="navigation">
+<ul>
+    <li><a href="https://github.com/Ocramius/ProxyManager" target="_blank">Github</a>
+    <div class="bcms-clearfix"></div>
+</li>
+</ul>
+</nav>
+</div>
+</header>
+<main role="main">
+<section class="component-content">
+
+<div class="component-demo" id="live-demo">
+    <div class="container">
+            <div class="main-wrapper" style="text-align: right">
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=fork&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="310" height="40"></iframe>
+
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=watch&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="200" height="40"></iframe>
+
+            </div>
+        <div class="bcms-clearfix bcms-clearfix"></div>
+    </div>
+</div>
+<div class="component-info">
+<div class="container">
+<aside class="sidebar">
+    <nav class="spy-nav">
+        <ul>
+            <li><a href="index.html">Intro</a></li>
+            <li><a href="virtual-proxy.html">Virtual Proxy</a></li>
+            <li><a href="null-object.html">Null Objects</a></li>
+            <li><a href="ghost-object.html">Ghost Objects</a></li>
+            <li><a href="remote-object.html">Remote Object</a></li>
+            <li><a href="contributing.html">Contributing</a></li>
+            <li><a href="credits.html">Credits</a></li>
+            <li><a href="copyright.html">Copyright</a></li>
+        </ul>
+    </nav>
+<div class="bcms-clearfix bcms-clearfix"></div>
+<a class="btn btn-action btn-full download-component"
+    href="download.html">Download</a>
+    <div class="bcms-clearfix"></div>
+</aside>
+
+<div class="content">
+    <div class="bcms-clearfix"></div>
+    <h3 class="section-title">Remote Object Proxy</h3>
+
+    <p>The remote object implementation is a mechanism that enables an local object to control an other object on an other server. Each call method on the local object will do a network call to get information or execute operations on the remote object.</p>
+<hr />
+
+    <h3 class="section-title">What is remote object proxy ?</h3>
+
+    <p>A remote object is based on an interface. The remote interface defines the API that a consumer can call. This interface must be implemented both by the client and the RPC server.</p>
+<hr />
+
+    <h3 class="section-title">Adapters</h3>
+
+    <p>ZendFramework's RPC components (XmlRpc, JsonRpc &amp; Soap) can be used easily with the remote object. You will need to require the one you need via composer, though:</p>
+
+    <pre>
+        <code class="sh">
+$ php composer.phar require zendframework/zend-xmlrpc:2.*
+$ php composer.phar require zendframework/zend-json:2.*
+$ php composer.phar require zendframework/zend-soap:2.*
+        </code>
+    </pre>
+
+    <p>ProxyManager comes with 3 adapters:</p>
+
+    <ul>
+        <li><code>ProxyManager\Factory\RemoteObject\Adapter\XmlRpc</code></li>
+        <li><code>ProxyManager\Factory\RemoteObject\Adapter\JsonRpc</code></li>
+        <li><code>ProxyManager\Factory\RemoteObject\Adapter\Soap</code></li>
+    </ul>
+
+<hr />
+
+    <h3 class="section-title">Usage examples</h3>
+
+    <p>RPC server side code (<code>xmlrpc.php</code> in your local webroot):</p>
+
+    <pre>
+        <code class="php">
+interface FooServiceInterface
+{
+    public function foo();
+}
+
+class Foo implements FooServiceInterface
+{
+    /**
+     * Foo function
+     * @return string
+     */
+    public function foo()
+    {
+        return 'bar remote';
+    }
+}
+
+$server = new Zend\XmlRpc\Server();
+$server->setClass('Foo', 'FooServiceInterface');  // my FooServiceInterface implementation
+$server->handle();
+        </code>
+    </pre>
+
+    <p>Client side code (proxy) :</p>
+
+    <pre>
+        <code class="php">
+interface FooServiceInterface
+{
+    public function foo();
+}
+
+$factory = new \ProxyManager\Factory\RemoteObjectFactory(
+    new \ProxyManager\Factory\RemoteObject\Adapter\XmlRpc(
+        new \Zend\XmlRpc\Client('https://localhost/xmlrpc.php')
+    )
+);
+
+$proxy = $factory->createProxy('FooServiceInterface');
+
+var_dump($proxy->foo()); // "bar remote"
+        </code>
+    </pre>
+<hr />
+
+    <h3 class="section-title">Implementing custom adapters</h3>
+
+    <p>Your adapters must implement <code>ProxyManager\Factory\RemoteObject\AdapterInterface</code> :</p>
+
+    <pre>
+        <code class="php">
+interface AdapterInterface
+{
+    /**
+     * Call remote object
+     *
+     * @param string $wrappedClass
+     * @param string $method
+     * @param array $params
+     *
+     * @return mixed
+     */
+    public function call($wrappedClass, $method, array $params = array());
+}
+        </code>
+    </pre>
+
+    <p>It is very easy to create your own implementation (for RESTful web services, for example). Simply pass your own adapter instance to your factory at construction time</p>
+
+    <p>Tuning performance for production</p>
+
+    <p>See <a href="production.html">Tuning ProxyManager for Production.</a></p>
+
+</main>
+
+    <footer class="site-footer" role="contentinfo">
+        <div class="container">
+            <div class="footer-logos">
+                <ul>
+                    <li><a href="index.html">Intro</a> | </li>
+                    <li><a href="virtual-proxy.html">Virtual Proxy</a> | </li>
+                    <li><a href="null-object.html">Null Objects</a> | </li>
+                    <li><a href="ghost-object.html">Ghost Objects</a> | </li>
+                    <li><a href="remote-object.html">Remote Object</a> | </li>
+                    <li><a href="contributing.html">Contributing</a> | </li>
+                    <li><a href="credits.html">Credits</a> | </li>
+                    <li><a href="copyright.html">Copyright</a></li>
+                </ul>
+            </div>
+        </div>
+
+        <div class="bcms-clearfix"></div>
+    </footer>
+    <div class="bcms-clearfix"></div>
+    </body>
+</html>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/html-docs/virtual-proxy.html
@@ -0,0 +1,305 @@
+<!DOCTYPE html>
+<html class="no-js" id="top">
+<head>
+    <title>ProxyManager - Virtual Proxy</title>
+
+    <meta name="description" content="A proxyManager write in php" />
+    <meta name="keywords" content="ProxyManager, proxy, manager, ocramius, Marco Pivetta, php, virtual proxy" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+    <link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600' rel='stylesheet' type='text/css'>
+    <link href="css/styles.css" rel="stylesheet" />
+    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/default.min.css">
+    <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/highlight.min.js"></script>
+    <script>hljs.initHighlightingOnLoad();</script>
+    <link rel="shortcut icon" href="favicon.ico">
+</head>
+<body>
+
+<header class="site-header">
+<div class="container">
+<h1><a href="index.html"><img alt="ProxyManager" src="img/block.png" /></a></h1>
+
+<nav class="main-nav" role="navigation">
+<ul>
+    <li><a href="https://github.com/Ocramius/ProxyManager" target="_blank">Github</a>
+    <div class="bcms-clearfix"></div>
+</li>
+</ul>
+</nav>
+</div>
+</header>
+<main role="main">
+<section class="component-content">
+
+<div class="component-demo" id="live-demo">
+    <div class="container">
+            <div class="main-wrapper" style="text-align: right">
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=fork&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="310" height="40"></iframe>
+
+                <iframe src="http://ghbtns.com/github-btn.html?user=ocramius&amp;repo=ProxyManager&amp;type=watch&amp;count=true&amp;size=large"
+  allowtransparency="true" frameborder="0" scrolling="0" width="200" height="40"></iframe>
+
+            </div>
+        <div class="bcms-clearfix bcms-clearfix"></div>
+    </div>
+</div>
+<div class="component-info">
+<div class="container">
+<aside class="sidebar">
+    <nav class="spy-nav">
+        <ul>
+            <li><a href="index.html">Intro</a></li>
+            <li><a href="virtual-proxy.html">Virtual Proxy</a></li>
+            <li><a href="null-object.html">Null Objects</a></li>
+            <li><a href="ghost-object.html">Ghost Objects</a></li>
+            <li><a href="remote-object.html">Remote Object</a></li>
+            <li><a href="contributing.html">Contributing</a></li>
+            <li><a href="credits.html">Credits</a></li>
+            <li><a href="copyright.html">Copyright</a></li>
+        </ul>
+    </nav>
+<div class="bcms-clearfix bcms-clearfix"></div>
+<a class="btn btn-action btn-full download-component"
+    href="download.html">Download</a>
+    <div class="bcms-clearfix"></div>
+</aside>
+
+<div class="content">
+    <div class="bcms-clearfix"></div>
+    <h3 class="section-title">Lazy Loading Value Holder Proxy</h3>
+    <p>A lazy loading value holder proxy is a virtual proxy that wraps and lazily initializes a "real" instance of the proxied class.</p>
+<hr />
+
+    <h3 class="section-title">What is lazy loading?</h3>
+
+    <p>In pseudo-code, in userland, <a href="http://www.martinfowler.com/eaaCatalog/lazyLoad.html" target="_blank">lazy loading</a> looks like following:</p>
+
+    <pre>
+        <code class="php">
+class MyObjectProxy
+{
+    private $wrapped;
+
+    public function doFoo()
+    {
+        $this->init();
+
+        return $this->wrapped->doFoo();
+    }
+
+    private function init()
+    {
+        if (null === $this->wrapped) {
+            $this->wrapped = new MyObject();
+        }
+    }
+}
+    </code>
+</pre>
+
+    <p>This code is problematic, and adds a lot of complexity that makes your unit tests' code even worse.</p>
+
+    <p>Also, this kind of usage often ends up in coupling your code with a particular <a href="http://martinfowler.com/articles/injection.html" target="_blank">Dependency Injection Container</a> or a framework that fetches dependencies for you. That way, further complexity is introduced, and some problems related with service location raise, as I've explained <a href="http://ocramius.github.io/blog/zf2-and-symfony-service-proxies-with-doctrine-proxies/" target="_blank">in this article</a>.</p>
+
+    <p>Lazy loading value holders abstract this logic for you, hiding your complex, slow, performance-impacting objects behind tiny wrappers that have their same API, and that get initialized at first usage.</p>
+    
+<hr />
+
+    <h3 class="section-title">When do I use a lazy value holder?</h3>
+
+    <p>You usually need a lazy value holder in cases where following applies</p>
+
+    <ul>
+        <li>your object takes a lot of time and memory to be initialized (with all dependencies)</li>
+        <li>your object is not always used, and the instantiation overhead can be avoided</li>
+    </ul>
+
+<hr />
+
+    <h3 class="section-title">Usage examples</h3>
+
+    <p>ProxyManager provides a factory that eases instantiation of lazy loading value holders. To use it, follow these steps:</p>
+
+    <p>First of all, define your object's logic without taking care of lazy loading:</p>
+
+<pre>
+    <code class="php">
+namespace MyApp;
+
+class HeavyComplexObject
+{
+    public function __construct()
+    {
+        // just write your business logic
+        // don't worry about how heavy initialization of this will be!
+    }
+
+    public function doFoo() {
+        echo "OK!"
+    }
+}
+    </code>
+</pre>
+
+<p>Then use the proxy manager to create a lazy version of the object (as a proxy):</p>
+
+<pre>
+    <code class="php">
+namespace MyApp;
+
+use ProxyManager\Factory\LazyLoadingValueHolderFactory;
+use ProxyManager\Proxy\LazyLoadingInterface;
+
+require_once __DIR__ . '/vendor/autoload.php';
+
+$factory     = new LazyLoadingValueHolderFactory();
+$initializer = function (& $wrappedObject, LazyLoadingInterface $proxy, $method, array $parameters, & $initializer) {
+    $initializer   = null; // disable initialization
+    $wrappedObject = new HeavyComplexObject(); // fill your object with values here
+
+    return true; // confirm that initialization occurred correctly
+};
+
+$instance = $factory->createProxy('MyApp\HeavyComplexObject', $initializer);
+    </code>
+</pre>
+
+<p>You can now simply use your object as before:</p>
+
+<pre>
+    <code class="php">
+// this will just work as before
+$proxy->doFoo(); // OK!
+    </code>
+</pre>
+<hr />
+
+
+    <h3 class="section-title">Lazy Initialization</h3>
+
+    <p>As you can see, we use a closure to handle lazy initialization of the proxy instance at runtime. The initializer closure signature should be as following:</p>
+
+<pre>
+    <code class="php">
+/**
+ * @var object  $wrappedObject the instance (passed by reference) of the wrapped object,
+ *                             set it to your real object
+ * @var object  $proxy         the instance proxy that is being initialized
+ * @var string  $method        the name of the method that triggered lazy initialization
+ * @var string  $parameters    an ordered list of parameters passed to the method that
+ *                             triggered initialization, indexed by parameter name
+ * @var Closure $initializer   a reference to the property that is the initializer for the
+ *                             proxy. Set it to null to disable further initialization
+ *
+ * @return bool true on success
+ */
+$initializer = function (& $wrappedObject, $proxy, $method, $parameters, & $initializer) {};
+    </code>
+</pre>
+
+<p>The initializer closure should usually be coded like following:</p>
+
+<pre>
+    <code class="php">
+$initializer = function (& $wrappedObject, $proxy, $method, $parameters, & $initializer) {
+    $newlyCreatedObject = new Foo(); // instantiation logic
+    $newlyCreatedObject->setBar('baz') // instantiation logic
+    $newlyCreatedObject->setBat('bam') // instantiation logic
+
+    $wrappedObject = $newlyCreatedObject; // set wrapped object in the proxy
+    $initializer   = null; // disable initializer
+
+    return true; // report success
+};
+    </code>
+</pre>
+
+<p>The <code>ProxyManager\Factory\LazyLoadingValueHolderFactory</code> produces proxies that implement both the <code>ProxyManager\Proxy\ValueHolderInterface</code> and the <code>ProxyManager\Proxy\LazyLoadingInterface</code>.</p>
+
+<p>At any point in time, you can set a new initializer for the proxy:</p>
+
+<pre><code class="php">$proxy->setProxyInitializer($initializer);</code></pre>
+
+<p>In your initializer, you currently <strong>MUST</strong> turn off any further initialization:</p>
+
+<pre><code class="php">$proxy->setProxyInitializer(null);</code></pre>
+
+<p>or</p>
+
+<pre><code class="php">$initializer = null; // if you use the initializer by reference</code></pre>
+<hr />
+
+    <h3 class="section-title">Triggering Initialization</h3>
+
+    <p>A lazy loading proxy is initialized whenever you access any property or method of it. Any of the following interactions would trigger lazy initialization:</p>
+
+<pre>
+    <code class="php">
+// calling a method
+$proxy->someMethod();
+
+// reading a property
+echo $proxy->someProperty;
+
+// writing a property
+$proxy->someProperty = 'foo';
+
+// checking for existence of a property
+isset($proxy->someProperty);
+
+// removing a property
+unset($proxy->someProperty);
+
+// cloning the entire proxy
+clone $proxy;
+
+// serializing the proxy
+$unserialized = serialize(unserialize($proxy));
+    </code>
+</pre>
+
+   <p>Remember to call <code>$proxy->setProxyInitializer(null);</code> to disable initialization of your proxy, or it will happen more than once.</p>
+
+
+
+
+
+
+
+
+<hr />
+
+    <h3 class="section-title">Proxying interfaces</h3>
+
+    <p>You can also generate proxies from an interface FQCN. By proxying an interface, you will only be able to access the methods defined by the interface itself, even if the wrappedObject implements more methods. This will anyway save some memory since the proxy won't contain useless inherited properties.</p>
+
+    <p>Tuning performance for production</p>
+
+    <p>See <a href="production.html">Tuning ProxyManager for Production.</a></p>
+
+  
+
+</main>
+
+    <footer class="site-footer" role="contentinfo">
+        <div class="container">
+            <div class="footer-logos">
+                <ul>
+                    <li><a href="index.html">Intro</a> | </li>
+                    <li><a href="virtual-proxy.html">Virtual Proxy</a> | </li>
+                    <li><a href="null-object.html">Null Objects</a> | </li>
+                    <li><a href="ghost-object.html">Ghost Objects</a> | </li>
+                    <li><a href="remote-object.html">Remote Object</a> | </li>
+                    <li><a href="contributing.html">Contributing</a> | </li>
+                    <li><a href="credits.html">Credits</a> | </li>
+                    <li><a href="copyright.html">Copyright</a></li>
+                </ul>
+            </div>
+        </div>
+
+        <div class="bcms-clearfix"></div>
+    </footer>
+    <div class="bcms-clearfix"></div>
+    </body>
+</html>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/index.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="refresh" content="0;URL=html-docs/">
+    <title></title>
+</head>
+<body>
+    
+</body>
+</html>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/phpdox.xml.dist
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<phpdox xmlns="http://phpdox.de/config" silent="false">
+    <project
+        name="ProxyManager"
+        source="src"
+        workdir="build/phpdox"
+    >
+        <collector publiconly="false">
+            <include mask="*.php" />
+        </collector>
+
+        <generator output="build">
+            <build engine="html" enabled="true" output="api"/>
+        </generator>
+    </project>
+</phpdox>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/phpmd.xml.dist
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<ruleset
+    name="ProxyManager rules"
+    xmlns="http://pmd.sf.net/ruleset/1.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
+    xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"
+>
+    <rule ref="rulesets/codesize.xml"/>
+    <rule ref="rulesets/unusedcode.xml"/>
+    <rule ref="rulesets/design.xml">
+        <!-- eval is needed to generate runtime classes -->
+        <exclude name="EvalExpression"/>
+    </rule>
+    <rule ref="rulesets/naming.xml"/>
+</ruleset>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/phpunit.xml.dist
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<phpunit
+    bootstrap="./vendor/autoload.php"
+    colors="true"
+    convertErrorsToExceptions="true"
+    convertNoticesToExceptions="true"
+    convertWarningsToExceptions="true"
+    verbose="true"
+    stopOnFailure="false"
+    processIsolation="false"
+    backupGlobals="false"
+    syntaxCheck="true"
+>
+    <testsuite name="ProxyManager tests">
+        <directory>./tests/ProxyManagerTest</directory>
+    </testsuite>
+    <testsuite name="ProxyManager language integration tests">
+        <directory suffix=".phpt">./tests/language-feature-scripts</directory>
+    </testsuite>
+    <filter>
+        <whitelist addUncoveredFilesFromWhitelist="true">
+            <directory suffix=".php">./src</directory>
+        </whitelist>
+    </filter>
+</phpunit>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/proxy-manager.png
@@ -0,0 +1,73 @@
+PNG
+
+   
IHDR  z      C4   bKGD      	pHYs  
  
B(x   tIME	0    IDATxy`TϽ3EY](jAxMfbj)V[߾b۷.ժ	NH.VH_VcVMa+(d̽}ɐ ܙ9ڑsY<IJiڕ n0G 0/~z%Dr2"
+]矽%pg X֚D"BSUO]4?/kP"HOQt]D"
@H<nfbQD">4mR ӆ 6 mmme]D">	H
 %al5-HL(3p+ W{NYzIu]D"7X
`Yw2:f^U^^~HD"^ DT$ 3z@lD
+d(..j5kRX2p8gBz u}t$ )Z?_QQ,[L"B/9I,XN:  ƧA<xulAD
+8AuD4+
> э75%)())kj"S(J~ii6ٲaD"e Oc VUxoʖHKBWy̃Dt_ffzY"B?lv0RY"BhJJJZU[H;`DD6!Hw.9rdw4, O(R\ZZD
+}Zsᙙ (@Me=`t,Q6)|Gw35;e&OĆ;@^FF}>eϑH>),,<v=3u
+軃Hga@(²j"Ԯc濫_ZZٓ$5?^uWGG݊,gmʶx*u]?<	=뺷DT`lW
+D,ki?^f͚a%}JiTl7bwo &bhdҙ[ut,HOO0>N+ѯTU]k޿!&$ac9}sh(Y+ZM0Æl/gM `a-rI$R)J$-}	ΕUUUSxoy߂gڐ5 kt,$GnxmPYP^^@.Q(((8=33sa燺[rI$RXtD4+ \o70s~8~j0l!LWUy)4'؃L7YA4a̼<++tu|1^L![/3i&!K$6']:6`eYtvx<ә9!vL|Y4]uIb\ZSRRreY 1˲˷U`D_An"(
+ZHw>>PdƯZ50W (: 66s̼8$D2t>>84MN))u}8tnŧi *kCW6MӤ;ddI+}0vȑ;6<?
xX7ifa*,˪0l_oFMXJnbҥL\
Fu"*,++( p۔>f.>>J4MC;ژӱw
+䰕HMN9,X&Dp8|?ax<Y|}6e;kNd+H$iWQ6fy$~wڬ(wYw---?ظq)D&B$c:QDJ+?B(:پpr(K$땁@`(``f~7lНmbklv<i\.עUV!-qg۔	q4C3f]D6d{M4iÖe-+//?$[B"?b	يc6f(/bCn^5cz*~S(:^wX)!K$I`0x.UF
+``KosNmheYp-]=v>`uWW0 XGDmgQifp8l	p%w"H2_hFX|@HCkf>	ȳ{s]rs5M7}sl 63!crKPTTt媄CE02\	2ܮ<Y d0d6z]3"H3k luF+*++ۆiu+'HD	_}6MӞFEH̐C5HNQ;f
+ÏE`;dUU_4-zlS21;w?뤆0ݼbgTrK,HҩDt/;pRGIIb/1[Y8d_`:eʔ= ΰ]  dÇgu]m" p
q3/ßȖ}0̍ifX?ђd+@Ӵ1 2>Yx_lh4~dne.\DT7ހV(m4[";g	(lv{̜S;"//5"
+E=wv2O+^
+`,	3H^~z(ɾ{"ݩ<ܿs73!ggg_( Γ]_"Tzi.޲쮄^~zUbO!~J۝2 t XoYj'C_`o*{,555Bg ?.6ⲲdUBK)krm\2`sK22稪fohVh]3//o\4}	~;s{+u>;l J<ORqVBKuS}!%HFf~w: Rٿ|O O٧ŕ论RF6:4do}V\2ܯ8Gv!=/O-dAu&f.0.÷9
c& \]]]% TRR2ֲ`7iWTT4B+t7̌O.:o.Q	d 8U6%
+ް}D~(Z[g3SC4S LӜ̿a@{"?rss~kIakG x<JKKJ
`J%SdWrV_6.U
+SQQ #Y]
+>6o޼SRv!'ò.HhtaMo)g&ѬT+aOq	3`o" kE"&f_N=ٿ7U
+}/|Xp8Xgg".@yd:V̴P mB3PFa\UVVrv){G0RpUUU`po,˲V>As<СCw5Tf{* @Zxr	
x0 |J~* dUyyyI9( .0cC%l\`{7eXb浲ƨh4zoROdv2cepkեؤE<3l!f7s$7*DT7T'
+ApD+fv~ nͽK;J,UԽwuZGntLuXXfַUUm,NgΜ9g@/uuupz]Ce=ÀYWUdV9]MRs' FJ=p+ H[Q%Nsff#nG0ٜ[E/[񺙩J0zOw0G*ˢ
+/^LDw	&`mm+`B_|#QktӅVwlvr=T&HacXU@H V:b	eC2J^	bSnyj?:Sy6 (q4u&Ǭ=xo2\rrr"?0&0z/hSU  RpU|Jv!ACS:猘[ߣ4pcG-H(f*玖rL"Nc8Q;{^SSSΑr D^gQzz/ӝBD䢭:SwfZ 9T!C,bXWwT$)>|xBc9ƍ)//ϥ(Jޛe:~`}Kc^P
A;Do|bEmDTe;?(l.T?L7


:8}AISS1WM,UOj#bWRl5^Z!
+S]߿ "d2e@b+|QID 8>~C}}q?nDw~we2	?~iʄ)ީ̺yqfZ}1"R//pHDTU__XfLKQ8
_21wnί'"El;2딻;w[j ulUy.H
*jxOURWTnn vVU| "16vg_
+SeB&nuR}W׉vDbϜ;w!I(~|j*'e&aI:JUC+C=qI~siL){ {ƪwJ!81̟?$3W&BCCcN+w-QiccI=,K*vw_
+}=A7rN*~+EUaHQ ȋ;3{ I [qN ):H::{c{#=)YeN-kg#c夂m xXhj~bER b㊟hhhxu"
+ub3f<_+EQB߲f7 1;$B3h;d??A}2X\
+])Jzy!0me9q[?ZWWDͿB$p`2&/3ǯ+<fBdZ91s~K&v .8}窧d(M|]וeY[Q@O`B mCi쭸d$'?$	S`UziRǴiB;$fv+^QٗѭqP_:BR9s"Rh;H{f ݰѴZvP>f")ԞDëE9ƌID+"d!+;;{HίZd@yح!֪K'P'V홡cZg`.S/zp̛7T 
+ɹ@vj~_!z~3
_oK x	K^r2xyЃX"+Q{!HYIf#(γ>'6i|>v	=?@gV:<靺oĂ-LX'̭kgΖ=0|> DE^WE;S%!Ǐ0T/o}f 3Rdvg<{HtG=/'1|7Uw41-sz=~mmm3oƍ- S<(t~vBlxOPL)kwI!0Qy^l8Kvl=kg W1WCU" 56_r?zrR!AηCS:c
+(m)Ğ=;BznfL济^W999~ z6_?|o^3|	pJީhYx/@:,|H9eĈ0]pXunWHNGw\<6TӭzbvH+DǧmjW&oo"/&e@k9Qy̢.\WWGU?~96'2YŮ[*mu/|pн-|;dݮpQ4 M ,"/i+ H4%N~P__S;QSSs
+&{<&|cn8Y˯63L.B~͖Y~)ͽ4<*\c,RWWϯr#'gĝ 1;$-}퐻O$ݑȚdɥdT #үYj֝^`5_
@HCUUW:b
+獍MI*dίbo#Uzd{]F?M-'wj[7u&~ZFκI{~DtN|br>kFd~.L0&BCECExD1pۯv:EꫯdfQ3Kg}	*"jd#t~('~BR1'$L	ny+cv&<` V<17D:t(UnA"}/H%MMMho"vȽg\ALت>E~$6Y^F:fg^W Jh3Z
8зVzc@IDy6tJ]Sս'Id@Q1La>f6P";$W544<Jljj~wq3}>	ϯRR[<B7E:!0QL+ޱUz]k嬫j~'N>`2e%)vH|'k'1Eǡz Bg&hGak(2WT?Rrl:HSOvH 3hk;u?"<`bb!6||pQy
]	?)~96	H0F٤ NPv_3< 7C0QL-0E}9{)z.gN~e˲yאaYVyZ}{cqմo;SV ><Ge- RyLW^hH* ZLy_6bW Ws{d<mx'XL
+ռ{S9//o Qgtor8|bĝ륛+f^{~2B푁o痝omwrNFxDZ	IjizGCGf~<3] ʺ=%#~rǝީ
+P"& tߟ+[9777.
+o
8Ux_?&sߜ9ϯ\qm η#zR2yt]0	8yɖ%6%"<?!Cmʄ)^inKUq{b^{Σ;w謬	<H$fѣv;4MOY-]M$rs渶A:_6Ms sq+ ,Jot{x|Z}ѓEgy0''KDt?)@DD 󁬱DY>;iQi
1ub ~:f FGѨ{~F+xǹw/|MtwwmcƌԩS94Ν;6##c]4G5P\"
+sD-@phTOjjjz=C]][[3%L7la!=nި}w3%(<yN|㵹̈f    IDAT8پ3=؞UvoU=Or#:n+yZ Z`搪>wvvbΝx7#cطo@&oddd슙f$N}/`f}&G=>)@҅ueW A,'#z7 ,W_}u&ǉ{iZvQaygdI;?=
#>,®]''vF7ޘs=̉zx/}?t "+"2''+Iz~rʖ%zc⍎ÝNv=\~_xpС .=[Ggp׀+~~o߾s}<qRU" xaD~yܸq I^}ՙI=o.Ƞ#xY2'ف\̃jqL61cOt@]}˅p7v3OE"yWeYg"frrN~O}}ܞlܸѴ,KCݔX
+.l^ߨMT]*	jg2{^	$jF> |c-Mh|[ŗ:\Ŧi^a8r<Gg$tH=F/|9Y}|Oi,Jz`)As,es"	 `2?7xo<_*pϥ(t }P`|'*"KD"aGoHg56 a
~(e]ޱonFveNXa	3+lD²3Ak9С{Oga3]H{1u0bĈӐXp؃)R[[,QdC"@Q͜DUe?;n][,#(4q퇘qIߜl}:I哑oMu,t_
@bG Lg=U''l}?髪Ͳm	f&3G-y.P3ҨQJ,D\/6nh| JPװ =L&s2cEYNG"k-|y>rSƅ;ě3?cByIye^ M6y` O


Yұ}O<*0S>+~?ӡ*LsP'P /0ZD|)''+


wڷ幢hnݣlƹQt؉E_![+/,Q+C"cmsȲ~.: ^&3O/_t9dd`ĉ
cf:::x)fu8p@qbꫯtڷFѻ xoYVe҄~jTh`T̙V2Q(jODo߿.?<u-s1z|?&LPڗ[n& q&G#HXCŮ](~75IqF̿khhߤvr4 "~)<p84'ƽq;=kgݐ<;::|?N|՝pnhh_f.;w+w.٣N|^pQ
+E駟D=}tqƉ=ddd/9眳$&|D|o9}L_Dm~yt${柒D#_hzθMފKF&"[744,RsL T⺺OvаGsyN<9Kvt)7 ;s~mmmInL>><ϱgEq0k֬?\ :dDo1s>'|[%yKWIwS9YuV 
z{B\O.
{szMyb~>Cq]BSUUG 8ݽ}Ӧihhx~ܹ322W=a\:Ĭs~Mm3_~y1a"S___3uY8묳)UϚ|.1be >#7,>F5 ?G7FbaU_+H4dIeeeCb6i^ok{<ULK|U>h=嗍cz]dom(OII,˲a<=|UdnEN~11DhoDTWW4
sJ0[g*|䢭<-Ӝ.蹯~,Rê%jTilYV'Id*b8}<*2~=^wz}יYʜΫm\SUqz>/q+o۷49,f$zbscc>"
+ND>&ƍW|֧5e#EĢ/XBX};vy{}BXOku bE^{VdSy ^Lcv
+7n4EɏKDB^8獍M񿧔0]!>M
+u_l8̖QoNoh NKgܽSy׮]],*V3Ѳ"Ξ.UmF}N)y LB7H=vzǞܶ Y@e͆T/{w9iɶ:c"( /ӝ^Wi.AUS|>3.MMM寮䉓BmX[ܩIe7΂KRQCbU1PE;NWe멱M+_3]qRKnhZ֍1nndpkXo^3T-s=h@LOL.<	0Â9993^W1ǭEςĝkjj"i# 0x3 Nc9c[=.AH]䂰ҭvkf
+_bpM{겸sK*wܹYԼ\CCÓ'2$jvU)hLw݌Vκ**d!<aKb/.ڟ|iOhsؗΛ7/ίnwX$uJO,ֲfgޱ3TwTJCa!NoUaC$
EQ9ѝ1]\󫎎T ,LV;Y8{@7`r*LXK~A#UʸgԬ!	zMÔ}	yڡCvz]2neYa>7 |LD'uȞBa3¾5{jі_P[*g&lLvȚ)[7bS[[BXuh\.W WD)#t_]]IxNSڶV=􎭀1nIp]Qa;$ʇE`t4]Jy@e܎+>,W^^KQ*d^!!V}2G.tzǞTe;{;z/NV/=)_ P__BDBqp;h1W z;FC0< 3/ٺuIH(7'HՔ4s߱9PU,$ZCie
UUK'|455uQu#F^23gΜ3 G!?544ihmy r L+ޱ!WVei)':tyIY0+w몮\"^gUFFr "(:c㦍OXһ Ro7Wz}N;zkwf۵g<+2/çI444<+z#(uh4Y %a~p0d*Z2*MVhT;0CELN[lW&:x!*^~qZ􊪭q?/77׶+EQ!u`'<M&='k'&𶎚mw[~]^;>yS:0	!:`0[qW3Ʉ|>ϯ,*AUN|ମoڴ#^S4M3 αx{:|ޱ(6Nѕi.0F2YAc pkd0t	@/I;XԮ^IDWo%-


=h-Hv`0H$* rxXbjǪ]f{RWv1斵$*ދbv]	8hlL ˚麮;=@ :"o|>ǟ_߿ϯ%*4%:L} P(<G(y`.\YӜޱڥBuBEUC[	`E$y=~G{o\.W%V|~vMM'AhwJP\\<NӴEid:7OEyTLNv-kfcju-BvȭS"i0|)=D9(ޜ^WDZʲ{H]QǞ)!.4MWU
 7$qDlm,hw쾢v|o%#*e{4^|dM
,ki%5!AsձQF
9EvveDt`{};^Ӵ#Go"cS
+0\ND:
C9z!ƶ0@FiA]30a:6##]u+]طhِLlɪ蒒 0([ńI]Dhth{A$䦠k,>6?D";Bk,~(8Y|;>v)9>ɹ@`;455uQP̲-Dy:owdf`;spz#jW.s
+}CF!q~31
+jҥGѥD@e9]|HIm544|6u5 CX,4	ޙi-sz;jrf`l20q>mncLܭiں`0x*MMM-}/tGOԮȵ@D=/`H$NcsvE&m㘿{e3ޱڥTԁ*H)d<le᥎ɉT7ED/X0Kgn EsU?Q>6LGdX]]ݶ΄
+iS4M{D浥}*-8jN
c3[j|O3HB4D9"2eP?\&
+@4XgL*뷽~Dyyy19ǝ`4@ 0JӴu ^p-+Uv}B+_vzǞrhOp͆{+.Ba"{gs׸v|3bZMӞ4mOrU̇)D]Yht@srr )XM6}B뺢i튢
+`N, VFi_ULPm;dOԮE'Cq	!Gћ23=3& lk i)NW/4 ~/-1znW@KE>pD|ߐ	}0 g>\d^YYF:,"QӔSvzǞT[-n^3_Z*gNd&!;$2pv]׭p8 =Zl, H$j̝c,|@0cZ]\}2;>&")ڵ+!_X๚=ID<ۦ6	a`F/'[ Z+Z/M zG Nx-AI,ѻ
ЈbQs 44
+=ͩ+q`)OMMacvݻ[͛w* чMmMD]D26>pe3H)] ѬJw	K^zkg}8\CtZ>M5eeeq
/@ p(=q膆CCXkc]̼*&}DB 
+dMD	
""ۂAaluOn~ۚΜr {z}Ik<=c\Od.EfP0?{\7|bCU-CQ [Vw2e{~ٹ 
+M6սB̧T&
XlƁ#Q["uC$̝o:XgĝǬG;)0C?9;
:"M$ˡMm)"z~5СCw⧱~wrrr.C!v̼<ߔbƗ^1sآ9k;cO.+j{}:A/͆TbCBX2 F"zR0yyy?FAğ_Ź5WW$yeð̜GMO$4pA5N
+!?n<
9K 64al7
+f
+3B2`TU-2*zjjjz~} ^EB<e|EQ.6l-+ +&!(:cO*ܲ~b%kO WO*P5?5f<8*V0󞸟z^gWQ7nh92e0(--}H,u	C͆-^*ULa;ݵb(ZUUaFزl̇1ϔo
+m DêxHhW̿^gǞGD{<\0&*r4 "V;] ªsb
΄!3EQX/D0윜N'<R@at&:e}grYY뺞ؔMo5Wz}N">I<aÉ.wii鳆a\
+@հUz?]<"zŴ:r6vA ,;3P2u[]w 4~
oKPI ` O.8@ҏDԈ`&deeaP_Q Cz)iԫ^T%dTk:~#ǸMJB­_KVK.`j/t:{ƭ?;S;L70MYYYd< L.[ }".E)JfV^aQJ /&,=/%?MFƉN asa8~,vX{^XwX%
+RZZe;䴠q
+Y6#Ia\£GwwahJ=9E?$]By#+RvLDdfN@tlT`h%L'jkk[!D\{v?iڕXjWr /A(qéV?foѐ,k:׮]X܄s3oKP{0|$L< %M
+>J*,,<SӴGTU}KP6ӵ~/=njjz7B(Mܲ|޲-P,J?Cۧaq1Rmyv$:1L# Pȑ#&J[[O;d2(kP&]דza[-e?J'եBQ`v$y={'8N4toC/֖r \16廙5%Zx+_ J	K^J5j	{|0RVVS'43eحMsgܲ,W><bNʅi-I[deff5Ho	vR[| eb


[R0+4z k L] x<~0в{ʾ9NG͞D[u%  
+xIDAT@GM4G Gъ6g^^+7ٻ᪆%)4Fhd|@x<?q3eG,٣zl}DT
kc?SUuիvr4}S_GG7nڝ*:
3	B `k~`weuŴO˾zBLfⲴ/(nҥMӬ p=CQgKR^fs)G {@J=;ARRR9˲\b"UU-^zvV?@[f7"Dhv+}=\x񰛹s3τoӁ ^1b3pfB "ȭ VMkPx]#?
R0V8Ǧ< Tq@6$@@Ӵ19f^j["Ib)))4ldY֒dH!\(Jm,s̼8KeU 싄
+ES^"I!^(J3O'E).--@6Xpaȑ#Y#l 3/?p6l薭 B~{̘1w"rV>F$h 5 γ)KYFz3H?x˲t x2NDeee͙\dYVy6f[(m$Ri^<-O3s~8%5=(,,<vp MپS$R ;
+ mn y<J,X@2eEYn# Vy<u]o B?>"  dQD-˺7nS`0xUnSq˲J<O"q!(J)oۘ+\*:h6: ؘ;M$Rm$
+]aYV5]jcp\VZ*^(EQVs3$B6kS] ,kYyy!o ζ)N ul$BD4  2m= +yEY̳ܵbl$P|f^DŲpQv!s _-HR\菠i<ܿaS\ߒa;3Olgf`f.H$i&@/w
++jSm *;ACD`_I+HP
+` }fep15N(🍅˳1bQ^- 8@菠iLsrʓP !KQQY.6fV ġB
+Z hMYZ FE{Gu=#>՝뫪:pH.b.(Vxt]$
+]u]*-ߓT"FBK~42Nuf^8\:G0>	b06)c?i6fxw`X;aq%)}~C0 ٔg7yy8)`"6eFmrHJ$Rh*)ۏ>'C13LhfYED
+Ii4  ؘ96kٲez>x0CP"B/"W6f6cX 2#]ףrI$RuDn
+lʶz˲V;#ge}p t0a'HO~ ] \6e.3-`0_fc,59$)	'
+]k\mcc욒K.`>-*n$)Z^(J3O)Kiv}Q )ۃ̼\H'!`M9IUE/--}_-D
+}PRR2޲,m#53s0	KLӬ&XU)D
+}ʢi=rʓUU5thZpM ņamD">]CӴT hS'Áy<Ʀ2w (x<庮n#HO;t]Dם ၸCB_"Mz#{D">	(R
+{!FDKt3EEQʞ=C"B84MC;ژӱ/!I?`@VV㺮[7H$RJGGǷY6e
Ε7>@u*ǲH$R
PS c 6e`Y)K$R臵;>kz?-[X"B/i  &g(x<kbW"HOKriTtDtoYYG%%)
+` }R3vrz 4m&zcZ٘b>X"B/Da?`ugg:zQPP2 $cqUUCW~WD"^ *RID٘?E/--lD
+&EQfV"Hvo$0qCn@8VTVVjH$RLQQHU@)F %a!kV"HO14MAN܇F֤D"B└|޲* ?2#]ף$4a#GgfND<fҊ$4%RUkC. UU}roH$';    IENDB`
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/proxy-manager.svg
@@ -0,0 +1,346 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+This software consists of voluntary contributions made by many individuals
+and is licensed under the MIT license.
+-->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="378.25879"
+   height="241.71141"
+   id="svg9092"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="logo_DEF.svg">
+  <title
+     id="title5929">Logo - Ocramius Proxy Manager</title>
+  <defs
+     id="defs9094">
+    <linearGradient
+       id="linearGradient3798">
+      <stop
+         id="stop3800"
+         offset="0"
+         style="stop-color:#545454;stop-opacity:0;" />
+      <stop
+         id="stop3802"
+         offset="1"
+         style="stop-color:#585858;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3788">
+      <stop
+         style="stop-color:#585858;stop-opacity:1;"
+         offset="0"
+         id="stop3790" />
+      <stop
+         style="stop-color:#585858;stop-opacity:0;"
+         offset="1"
+         id="stop3792" />
+    </linearGradient>
+    <marker
+       inkscape:stockid="DotL"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotL"
+       style="overflow:visible">
+      <path
+         id="path3987"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.8,0,0,0.8,5.92,0.8)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3920">
+      <path
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m -21.125,46.0625 c -1.315071,0 -2.375,1.059929 -2.375,2.375 l 0,262.09375 c 0,1.31507 1.059929,2.375 2.375,2.375 l 292.15625,0 c 1.31507,0 2.375,-1.05993 2.375,-2.375 l 0,-262.09375 c 0,-1.315071 -1.05993,-2.375 -2.375,-2.375 l -292.15625,0 z m 111.28125,68.34375 68.625,0 33.9375,58.75 -33.9375,60.15625 -68.625,0 L 55.8125,173.875 90.15625,114.40625 z"
+         id="path3922"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath3924">
+      <path
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m -21.125,46.0625 c -1.315071,0 -2.375,1.059929 -2.375,2.375 l 0,262.09375 c 0,1.31507 1.059929,2.375 2.375,2.375 l 292.15625,0 c 1.31507,0 2.375,-1.05993 2.375,-2.375 l 0,-262.09375 c 0,-1.315071 -1.05993,-2.375 -2.375,-2.375 l -292.15625,0 z m 111.28125,68.34375 68.625,0 33.9375,58.75 -33.9375,60.15625 -68.625,0 L 55.8125,173.875 90.15625,114.40625 z"
+         id="path3926"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.53214715"
+     inkscape:cx="-234.17911"
+     inkscape:cy="-96.916153"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-nodes="true"
+     inkscape:bbox-paths="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:snap-bbox-midpoints="true"
+     inkscape:object-paths="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:snap-midpoints="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-object-midpoints="true"
+     inkscape:snap-center="true"
+     inkscape:window-width="1366"
+     inkscape:window-height="746"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:snap-page="false"
+     inkscape:snap-grids="false"
+     inkscape:snap-to-guides="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata9097">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>Logo - Ocramius Proxy Manager</dc:title>
+        <dc:date>November 2013</dc:date>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Maestro Pivetta</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:rights>
+          <cc:Agent>
+            <dc:title>MIT</dc:title>
+          </cc:Agent>
+        </dc:rights>
+        <dc:publisher>
+          <cc:Agent>
+            <dc:title>Marco Pivetta</dc:title>
+          </cc:Agent>
+        </dc:publisher>
+        <dc:coverage>Logo</dc:coverage>
+        <dc:subject>
+          <rdf:Bag />
+        </dc:subject>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Layer"
+     transform="translate(-18.781538,-53.01103)" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="low"
+     style="display:inline"
+     transform="translate(-18.781538,-53.01103)">
+    <path
+       style="fill:none;stroke:#787878;stroke-width:14.46100044;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 222.81682,230.67946 -98.45761,-56.81264 0,0 -98.347172,56.81265"
+       id="path3882"
+       inkscape:connector-curvature="0"
+       clip-path="url(#clipPath3924)" />
+    <path
+       style="fill:none;stroke:#787878;stroke-width:14.46100044;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 124.35921,173.86682 0.0552,-113.62529"
+       id="path3785"
+       inkscape:connector-curvature="0"
+       clip-path="url(#clipPath3920)" />
+  </g>
+  <g
+     inkscape:label="base"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline"
+     transform="translate(-18.781538,-53.01103)">
+    <path
+       style="fill:#1a1a1a;fill-opacity:1;stroke:#1e1e1e;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none"
+       d="m 193.11566,173.86682 59.40231,0"
+       id="path12544"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="star"
+       style="fill:none;stroke:#787878;stroke-width:35;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path9100"
+       sodipodi:sides="6"
+       sodipodi:cx="225.71429"
+       sodipodi:cy="372.36218"
+       sodipodi:r1="275.01392"
+       sodipodi:r2="238.16904"
+       sodipodi:arg1="-0.52359878"
+       sodipodi:arg2="0"
+       inkscape:flatsided="true"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m 463.88333,234.85522 0,275.01392 L 225.7143,647.3761 -12.454743,509.86914 -12.454744,234.85523 225.71429,97.348267 z"
+       transform="matrix(0.41316197,0,0,0.41316197,31.157864,20.020928)"
+       clip-path="none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path12548"
+       d="m 154.2419,173.86682 59.40231,0"
+       style="fill:#1a1a1a;fill-opacity:1;stroke:#1e1e1e;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none" />
+    <g
+       id="g5895">
+      <path
+         id="path9626"
+         sodipodi:type="star"
+         style="fill:none;stroke:#de8c33;stroke-width:57.93455887;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:40"
+         sodipodi:sides="6"
+         sodipodi:cx="225.71429"
+         sodipodi:cy="372.36218"
+         sodipodi:r1="275.01392"
+         sodipodi:r2="238.16904"
+         sodipodi:arg1="-0.52359878"
+         sodipodi:arg2="0"
+         inkscape:flatsided="true"
+         inkscape:rounded="0"
+         inkscape:randomized="0"
+         d="m 463.88333,234.85522 0,275.01392 L 225.7143,647.3761 -12.454743,509.86914 -12.454744,234.85523 225.71429,97.348267 z"
+         transform="matrix(0.21616793,0.12480461,-0.12480461,0.21616793,122.14997,65.203872)" />
+      <g
+         style="stroke:#de8c33;stroke-width:4.13199997;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         id="g3786">
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#de8c33;stroke-width:4.13199997;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:78.84750349"
+           d="M 158.79266,233.31601 124.46965,173.86682"
+           id="path9636" />
+        <path
+           style="fill:none;stroke:#de8c33;stroke-width:4.13199997;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:78.84750349"
+           d="m 124.35921,173.86682 34.43344,-59.44919"
+           id="path3884"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#de8c33;stroke-width:4.13199997;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:78.84750349"
+           d="m 55.823635,173.86682 68.701185,0.0956"
+           id="path3886"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+    <g
+       id="g5920"
+       style="fill:#3c3c3c;fill-opacity:1;stroke:#3c3c3c;stroke-width:8;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none">
+      <path
+         d="m 163.10781,173.47926 c 0,2.16916 -1.75845,3.92761 -3.9276,3.92761 -2.16916,0 -3.92761,-1.75845 -3.92761,-3.92761 0,-2.16915 1.75845,-3.9276 3.92761,-3.9276 2.16915,0 3.9276,1.75845 3.9276,3.9276 z"
+         sodipodi:ry="3.9276054"
+         sodipodi:rx="3.9276054"
+         sodipodi:cy="173.47926"
+         sodipodi:cx="159.18021"
+         id="path5902"
+         style="fill:#3c3c3c;fill-opacity:1;stroke:#3c3c3c;stroke-width:8;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         sodipodi:type="arc" />
+      <path
+         transform="translate(21.523427,0.38755669)"
+         sodipodi:type="arc"
+         style="fill:#3c3c3c;fill-opacity:1;stroke:#3c3c3c;stroke-width:8;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         id="path5904"
+         sodipodi:cx="159.18021"
+         sodipodi:cy="173.47926"
+         sodipodi:rx="3.9276054"
+         sodipodi:ry="3.9276054"
+         d="m 163.10781,173.47926 c 0,2.16916 -1.75845,3.92761 -3.9276,3.92761 -2.16916,0 -3.92761,-1.75845 -3.92761,-3.92761 0,-2.16915 1.75845,-3.9276 3.92761,-3.9276 2.16915,0 3.9276,1.75845 3.9276,3.9276 z" />
+      <path
+         d="m 163.10781,173.47926 c 0,2.16916 -1.75845,3.92761 -3.9276,3.92761 -2.16916,0 -3.92761,-1.75845 -3.92761,-3.92761 0,-2.16915 1.75845,-3.9276 3.92761,-3.9276 2.16915,0 3.9276,1.75845 3.9276,3.9276 z"
+         sodipodi:ry="3.9276054"
+         sodipodi:rx="3.9276054"
+         sodipodi:cy="173.47926"
+         sodipodi:cx="159.18021"
+         id="path5906"
+         style="fill:#3c3c3c;fill-opacity:1;stroke:#3c3c3c;stroke-width:8;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         sodipodi:type="arc"
+         transform="translate(43.326071,0.38755669)" />
+      <path
+         transform="translate(64.819008,1.9726929e-6)"
+         sodipodi:type="arc"
+         style="fill:#3c3c3c;fill-opacity:1;stroke:#3c3c3c;stroke-width:8;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         id="path5908"
+         sodipodi:cx="159.18021"
+         sodipodi:cy="173.47926"
+         sodipodi:rx="3.9276054"
+         sodipodi:ry="3.9276054"
+         d="m 163.10781,173.47926 c 0,2.16916 -1.75845,3.92761 -3.9276,3.92761 -2.16916,0 -3.92761,-1.75845 -3.92761,-3.92761 0,-2.16915 1.75845,-3.9276 3.92761,-3.9276 2.16915,0 3.9276,1.75845 3.9276,3.9276 z" />
+      <path
+         d="m 163.10781,173.47926 c 0,2.16916 -1.75845,3.92761 -3.9276,3.92761 -2.16916,0 -3.92761,-1.75845 -3.92761,-3.92761 0,-2.16915 1.75845,-3.9276 3.92761,-3.9276 2.16915,0 3.9276,1.75845 3.9276,3.9276 z"
+         sodipodi:ry="3.9276054"
+         sodipodi:rx="3.9276054"
+         sodipodi:cy="173.47926"
+         sodipodi:cx="159.18021"
+         id="path5910"
+         style="fill:#3c3c3c;fill-opacity:1;stroke:#3c3c3c;stroke-width:8;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         sodipodi:type="arc"
+         transform="translate(86.425344,1.9726929e-6)" />
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="ext cube"
+     style="display:inline"
+     transform="translate(-18.781538,-53.01103)">
+    <g
+       id="g5891"
+       style="stroke:#3c3c3c;stroke-opacity:1">
+      <path
+         transform="matrix(0.21616793,0.12480461,-0.12480461,0.21616793,318.8443,65.203877)"
+         d="m 463.88333,234.85522 0,275.01392 L 225.7143,647.3761 -12.454743,509.86914 -12.454744,234.85523 225.71429,97.348267 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="true"
+         sodipodi:arg2="0"
+         sodipodi:arg1="-0.52359878"
+         sodipodi:r2="238.16904"
+         sodipodi:r1="275.01392"
+         sodipodi:cy="372.36218"
+         sodipodi:cx="225.71429"
+         sodipodi:sides="6"
+         id="path9660"
+         style="fill:none;stroke:#3c3c3c;stroke-width:57.93323135;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="star" />
+      <path
+         id="path9662"
+         style="fill:none;stroke:#3c3c3c;stroke-width:4.13161993;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 252.51797,173.86682 68.64601,0 34.323,-59.44919 m 10e-6,118.89838 -34.32301,-59.44919"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc" />
+    </g>
+  </g>
+</svg>
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Autoloader/Autoloader.php
@@ -0,0 +1,69 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Autoloader;
+
+use ProxyManager\FileLocator\FileLocatorInterface;
+use ProxyManager\Inflector\ClassNameInflectorInterface;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class Autoloader implements AutoloaderInterface
+{
+    /**
+     * @var \ProxyManager\FileLocator\FileLocatorInterface
+     */
+    protected $fileLocator;
+
+    /**
+     * @var \ProxyManager\Inflector\ClassNameInflectorInterface
+     */
+    protected $classNameInflector;
+
+    /**
+     * @param \ProxyManager\FileLocator\FileLocatorInterface      $fileLocator
+     * @param \ProxyManager\Inflector\ClassNameInflectorInterface $classNameInflector
+     */
+    public function __construct(FileLocatorInterface $fileLocator, ClassNameInflectorInterface $classNameInflector)
+    {
+        $this->fileLocator        = $fileLocator;
+        $this->classNameInflector = $classNameInflector;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function __invoke($className)
+    {
+        if (class_exists($className, false) || ! $this->classNameInflector->isProxyClassName($className)) {
+            return false;
+        }
+
+        $file = $this->fileLocator->getProxyFileName($className);
+
+        if (! file_exists($file)) {
+            return false;
+        }
+
+        return (bool) require_once $file;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Autoloader/AutoloaderInterface.php
@@ -0,0 +1,37 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Autoloader;
+
+/**
+ * Basic autoloader utilities required to work with proxy files
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface AutoloaderInterface
+{
+    /**
+     * Callback to allow the object to be handled as autoloader - tries to autoload the given class name
+     *
+     * @param string $className
+     *
+     * @return bool
+     */
+    public function __invoke($className);
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Configuration.php
@@ -0,0 +1,241 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager;
+
+use ProxyManager\Autoloader\Autoloader;
+use ProxyManager\Autoloader\AutoloaderInterface;
+use ProxyManager\FileLocator\FileLocator;
+use ProxyManager\GeneratorStrategy\FileWriterGeneratorStrategy;
+use ProxyManager\GeneratorStrategy\GeneratorStrategyInterface;
+use ProxyManager\Inflector\ClassNameInflector;
+use ProxyManager\Inflector\ClassNameInflectorInterface;
+use ProxyManager\Signature\ClassSignatureGenerator;
+use ProxyManager\Signature\ClassSignatureGeneratorInterface;
+use ProxyManager\Signature\SignatureChecker;
+use ProxyManager\Signature\SignatureCheckerInterface;
+use ProxyManager\Signature\SignatureGenerator;
+use ProxyManager\Signature\SignatureGeneratorInterface;
+
+/**
+ * Base configuration class for the proxy manager - serves as micro disposable DIC/facade
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class Configuration
+{
+    const DEFAULT_PROXY_NAMESPACE = 'ProxyManagerGeneratedProxy';
+
+    /**
+     * @var string|null
+     */
+    protected $proxiesTargetDir;
+
+    /**
+     * @var string
+     */
+    protected $proxiesNamespace = self::DEFAULT_PROXY_NAMESPACE;
+
+    /**
+     * @var GeneratorStrategyInterface|null
+     */
+    protected $generatorStrategy;
+
+    /**
+     * @var callable|null
+     */
+    protected $proxyAutoloader;
+
+    /**
+     * @var ClassNameInflectorInterface|null
+     */
+    protected $classNameInflector;
+
+    /**
+     * @var SignatureGeneratorInterface|null
+     */
+    protected $signatureGenerator;
+
+    /**
+     * @var SignatureCheckerInterface|null
+     */
+    protected $signatureChecker;
+
+    /**
+     * @var ClassSignatureGeneratorInterface|null
+     */
+    protected $classSignatureGenerator;
+
+    /**
+     * @deprecated deprecated since version 0.5
+     * @codeCoverageIgnore
+     */
+    public function setAutoGenerateProxies()
+    {
+    }
+
+    /**
+     * @return bool
+     *
+     * @deprecated deprecated since version 0.5
+     * @codeCoverageIgnore
+     */
+    public function doesAutoGenerateProxies()
+    {
+        return true;
+    }
+
+    /**
+     * @param AutoloaderInterface $proxyAutoloader
+     */
+    public function setProxyAutoloader(AutoloaderInterface $proxyAutoloader)
+    {
+        $this->proxyAutoloader = $proxyAutoloader;
+    }
+
+    /**
+     * @return AutoloaderInterface
+     */
+    public function getProxyAutoloader()
+    {
+        return $this->proxyAutoloader
+            ?: $this->proxyAutoloader = new Autoloader(
+                new FileLocator($this->getProxiesTargetDir()),
+                $this->getClassNameInflector()
+            );
+    }
+
+    /**
+     * @param string $proxiesNamespace
+     */
+    public function setProxiesNamespace($proxiesNamespace)
+    {
+        $this->proxiesNamespace = $proxiesNamespace;
+    }
+
+    /**
+     * @return string
+     */
+    public function getProxiesNamespace()
+    {
+        return $this->proxiesNamespace;
+    }
+
+    /**
+     * @param string $proxiesTargetDir
+     */
+    public function setProxiesTargetDir($proxiesTargetDir)
+    {
+        $this->proxiesTargetDir = (string) $proxiesTargetDir;
+    }
+
+    /**
+     * @return string
+     */
+    public function getProxiesTargetDir()
+    {
+        return $this->proxiesTargetDir ?: $this->proxiesTargetDir = sys_get_temp_dir();
+    }
+
+    /**
+     * @param GeneratorStrategyInterface $generatorStrategy
+     */
+    public function setGeneratorStrategy(GeneratorStrategyInterface $generatorStrategy)
+    {
+        $this->generatorStrategy = $generatorStrategy;
+    }
+
+    /**
+     * @return GeneratorStrategyInterface
+     */
+    public function getGeneratorStrategy()
+    {
+        return $this->generatorStrategy
+            ?: $this->generatorStrategy = new FileWriterGeneratorStrategy(
+                new FileLocator($this->getProxiesTargetDir())
+            );
+    }
+
+    /**
+     * @param ClassNameInflectorInterface $classNameInflector
+     */
+    public function setClassNameInflector(ClassNameInflectorInterface $classNameInflector)
+    {
+        $this->classNameInflector = $classNameInflector;
+    }
+
+    /**
+     * @return ClassNameInflectorInterface
+     */
+    public function getClassNameInflector()
+    {
+        return $this->classNameInflector
+            ?: $this->classNameInflector = new ClassNameInflector($this->getProxiesNamespace());
+    }
+
+    /**
+     * @param SignatureGeneratorInterface $signatureGenerator
+     */
+    public function setSignatureGenerator(SignatureGeneratorInterface $signatureGenerator)
+    {
+        $this->signatureGenerator = $signatureGenerator;
+    }
+
+    /**
+     * @return SignatureGeneratorInterface
+     */
+    public function getSignatureGenerator()
+    {
+        return $this->signatureGenerator ?: $this->signatureGenerator = new SignatureGenerator();
+    }
+
+    /**
+     * @param SignatureCheckerInterface $signatureChecker
+     */
+    public function setSignatureChecker(SignatureCheckerInterface $signatureChecker)
+    {
+        $this->signatureChecker = $signatureChecker;
+    }
+
+    /**
+     * @return SignatureCheckerInterface
+     */
+    public function getSignatureChecker()
+    {
+        return $this->signatureChecker
+            ?: $this->signatureChecker = new SignatureChecker($this->getSignatureGenerator());
+    }
+
+    /**
+     * @param ClassSignatureGeneratorInterface $classSignatureGenerator
+     */
+    public function setClassSignatureGenerator(ClassSignatureGeneratorInterface $classSignatureGenerator)
+    {
+        $this->classSignatureGenerator = $classSignatureGenerator;
+    }
+
+    /**
+     * @return ClassSignatureGeneratorInterface
+     */
+    public function getClassSignatureGenerator()
+    {
+        return $this->classSignatureGenerator
+            ?: new ClassSignatureGenerator($this->getSignatureGenerator());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Exception/DisabledMethodException.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Exception;
+
+use BadMethodCallException;
+
+/**
+ * Exception for forcefully disabled methods
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class DisabledMethodException extends BadMethodCallException implements ExceptionInterface
+{
+    const NAME = __CLASS__;
+
+    /**
+     * @param string $method
+     *
+     * @return self
+     */
+    public static function disabledMethod($method)
+    {
+        return new self(sprintf('Method "%s" is forcefully disabled', (string) $method));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Exception/ExceptionInterface.php
@@ -0,0 +1,29 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Exception;
+
+/**
+ * Base exception class for the proxy manager
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Exception/FileNotWritableException.php
@@ -0,0 +1,69 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Exception;
+
+use InvalidArgumentException;
+use ReflectionClass;
+use ReflectionMethod;
+use UnexpectedValueException;
+
+/**
+ * Exception for non writable files
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class FileNotWritableException extends UnexpectedValueException implements ExceptionInterface
+{
+    /**
+     * @param string $fromPath
+     * @param string $toPath
+     *
+     * @return self
+     */
+    public static function fromInvalidMoveOperation($fromPath, $toPath)
+    {
+        return new self(sprintf(
+            'Could not move file "%s" to location "%s": '
+            . 'either the source file is not readable, or the destination is not writable',
+            $fromPath,
+            $toPath
+        ));
+    }
+
+    /**
+     * @param string $path
+     *
+     * @return self
+     */
+    public static function fromNonWritableLocation($path)
+    {
+        $messages = array();
+
+        if (($destination = realpath($path)) && ! is_file($destination)) {
+            $messages[] = 'exists and is not a file';
+        }
+
+        if (! is_writable($destination)) {
+            $messages[] = 'is not writable';
+        }
+
+        return new self(sprintf('Could not write to path "%s": %s', $path, implode(', ', $messages)));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Exception/InvalidProxiedClassException.php
@@ -0,0 +1,79 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Exception;
+
+use InvalidArgumentException;
+use ReflectionClass;
+use ReflectionMethod;
+
+/**
+ * Exception for invalid proxied classes
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class InvalidProxiedClassException extends InvalidArgumentException implements ExceptionInterface
+{
+    /**
+     * @param ReflectionClass $reflection
+     *
+     * @return self
+     */
+    public static function interfaceNotSupported(ReflectionClass $reflection)
+    {
+        return new self(sprintf('Provided interface "%s" cannot be proxied', $reflection->getName()));
+    }
+
+    /**
+     * @param ReflectionClass $reflection
+     *
+     * @return self
+     */
+    public static function finalClassNotSupported(ReflectionClass $reflection)
+    {
+        return new self(sprintf('Provided class "%s" is final and cannot be proxied', $reflection->getName()));
+    }
+
+    /**
+     * @param ReflectionClass $reflection
+     *
+     * @return self
+     */
+    public static function abstractProtectedMethodsNotSupported(ReflectionClass $reflection)
+    {
+        return new self(sprintf(
+            'Provided class "%s" has following protected abstract methods, and therefore cannot be proxied:' . "\n%s",
+            $reflection->getName(),
+            implode(
+                "\n",
+                array_map(
+                    function (ReflectionMethod $reflectionMethod) {
+                        return $reflectionMethod->getDeclaringClass()->getName() . '::' . $reflectionMethod->getName();
+                    },
+                    array_filter(
+                        $reflection->getMethods(),
+                        function (ReflectionMethod $method) {
+                            return $method->isAbstract() && $method->isProtected();
+                        }
+                    )
+                )
+            )
+        ));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Exception/InvalidProxyDirectoryException.php
@@ -0,0 +1,40 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Exception;
+
+use InvalidArgumentException;
+
+/**
+ * Exception for invalid directories
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class InvalidProxyDirectoryException extends InvalidArgumentException implements ExceptionInterface
+{
+    /**
+     * @param string $directory
+     *
+     * @return self
+     */
+    public static function proxyDirectoryNotFound($directory)
+    {
+        return new self(sprintf('Provided directory "%s" does not exist', (string) $directory));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Exception/UnsupportedProxiedClassException.php
@@ -0,0 +1,47 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Exception;
+
+use LogicException;
+use ReflectionProperty;
+
+/**
+ * Exception for invalid proxied classes
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class UnsupportedProxiedClassException extends LogicException implements ExceptionInterface
+{
+    /**
+     * @param ReflectionProperty $property
+     *
+     * @return self
+     */
+    public static function unsupportedLocalizedReflectionProperty(ReflectionProperty $property)
+    {
+        return new self(
+            sprintf(
+                'Provided reflection property "%s" of class "%s" is private and cannot be localized in PHP 5.3',
+                $property->getName(),
+                $property->getDeclaringClass()->getName()
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Factory/AbstractBaseFactory.php
@@ -0,0 +1,112 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Factory;
+
+use ProxyManager\Configuration;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Version;
+use ReflectionClass;
+
+/**
+ * Base factory common logic
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+abstract class AbstractBaseFactory
+{
+    /**
+     * @var \ProxyManager\Configuration
+     */
+    protected $configuration;
+
+    /**
+     * Cached checked class names
+     *
+     * @var string[]
+     */
+    private $checkedClasses = array();
+
+    /**
+     * @param \ProxyManager\Configuration $configuration
+     */
+    public function __construct(Configuration $configuration = null)
+    {
+        $this->configuration = $configuration ?: new Configuration();
+    }
+
+    /**
+     * Generate a proxy from a class name
+     * @param  string $className
+     * @return string proxy class name
+     */
+    protected function generateProxy($className)
+    {
+        if (isset($this->checkedClasses[$className])) {
+            return $this->checkedClasses[$className];
+        }
+
+        $proxyParameters = array(
+            'className'           => $className,
+            'factory'             => get_class($this),
+            'proxyManagerVersion' => Version::VERSION
+        );
+        $proxyClassName  = $this
+            ->configuration
+            ->getClassNameInflector()
+            ->getProxyClassName($className, $proxyParameters);
+
+        if (! class_exists($proxyClassName)) {
+            $this->generateProxyClass($proxyClassName, $className, $proxyParameters);
+        }
+
+        $this
+            ->configuration
+            ->getSignatureChecker()
+            ->checkSignature(new ReflectionClass($proxyClassName), $proxyParameters);
+
+        return $this->checkedClasses[$className] = $proxyClassName;
+    }
+
+    /**
+     * @return \ProxyManager\ProxyGenerator\ProxyGeneratorInterface
+     */
+    abstract protected function getGenerator();
+
+    /**
+     * Generates the provided `$proxyClassName` from the given `$className` and `$proxyParameters`
+     * @param string $proxyClassName
+     * @param string $className
+     * @param array  $proxyParameters
+     *
+     * @return void
+     */
+    private function generateProxyClass($proxyClassName, $className, array $proxyParameters)
+    {
+        $className = $this->configuration->getClassNameInflector()->getUserClassName($className);
+        $phpClass  = new ClassGenerator($proxyClassName);
+
+        $this->getGenerator()->generate(new ReflectionClass($className), $phpClass);
+
+        $phpClass = $this->configuration->getClassSignatureGenerator()->addSignature($phpClass, $proxyParameters);
+
+        $this->configuration->getGeneratorStrategy()->generate($phpClass);
+        $this->configuration->getProxyAutoloader()->__invoke($proxyClassName);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Factory/AbstractLazyFactory.php
@@ -0,0 +1,46 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Factory;
+
+use Closure;
+
+/**
+ * Base factory common logic
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+abstract class AbstractLazyFactory extends AbstractBaseFactory
+{
+    /**
+     * Creates a new lazy proxy instance of the given class with
+     * the given initializer
+     *
+     * @param string   $className   name of the class to be proxied
+     * @param \Closure $initializer initializer to be passed to the proxy
+     *
+     * @return \ProxyManager\Proxy\LazyLoadingInterface
+     */
+    public function createProxy($className, Closure $initializer)
+    {
+        $proxyClassName = $this->generateProxy($className);
+
+        return new $proxyClassName($initializer);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Factory/AccessInterceptorScopeLocalizerFactory.php
@@ -0,0 +1,59 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Factory;
+
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizerGenerator;
+
+/**
+ * Factory responsible of producing proxy objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class AccessInterceptorScopeLocalizerFactory extends AbstractBaseFactory
+{
+    /**
+     * @var \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizerGenerator|null
+     */
+    private $generator;
+
+    /**
+     * @param object     $instance           the object to be localized within the access interceptor
+     * @param \Closure[] $prefixInterceptors an array (indexed by method name) of interceptor closures to be called
+     *                                       before method logic is executed
+     * @param \Closure[] $suffixInterceptors an array (indexed by method name) of interceptor closures to be called
+     *                                       after method logic is executed
+     *
+     * @return \ProxyManager\Proxy\AccessInterceptorInterface
+     */
+    public function createProxy($instance, array $prefixInterceptors = array(), array $suffixInterceptors = array())
+    {
+        $proxyClassName = $this->generateProxy(get_class($instance));
+
+        return new $proxyClassName($instance, $prefixInterceptors, $suffixInterceptors);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getGenerator()
+    {
+        return $this->generator ?: $this->generator = new AccessInterceptorScopeLocalizerGenerator();
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Factory/AccessInterceptorValueHolderFactory.php
@@ -0,0 +1,59 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Factory;
+
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolderGenerator;
+
+/**
+ * Factory responsible of producing proxy objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class AccessInterceptorValueHolderFactory extends AbstractBaseFactory
+{
+    /**
+     * @var \ProxyManager\ProxyGenerator\AccessInterceptorValueHolderGenerator|null
+     */
+    private $generator;
+
+    /**
+     * @param object     $instance           the object to be wrapped within the value holder
+     * @param \Closure[] $prefixInterceptors an array (indexed by method name) of interceptor closures to be called
+     *                                       before method logic is executed
+     * @param \Closure[] $suffixInterceptors an array (indexed by method name) of interceptor closures to be called
+     *                                       after method logic is executed
+     *
+     * @return \ProxyManager\Proxy\AccessInterceptorInterface|\ProxyManager\Proxy\ValueHolderInterface
+     */
+    public function createProxy($instance, array $prefixInterceptors = array(), array $suffixInterceptors = array())
+    {
+        $proxyClassName = $this->generateProxy(get_class($instance));
+
+        return new $proxyClassName($instance, $prefixInterceptors, $suffixInterceptors);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getGenerator()
+    {
+        return $this->generator ?: $this->generator = new AccessInterceptorValueHolderGenerator();
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Factory/LazyLoadingGhostFactory.php
@@ -0,0 +1,45 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Factory;
+
+use ProxyManager\ProxyGenerator\LazyLoadingGhostGenerator;
+
+/**
+ * Factory responsible of producing ghost instances
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @method \ProxyManager\Proxy\GhostObjectInterface createProxy($className, \Closure $initializer)
+ */
+class LazyLoadingGhostFactory extends AbstractLazyFactory
+{
+    /**
+     * @var \ProxyManager\ProxyGenerator\LazyLoadingGhostGenerator|null
+     */
+    private $generator;
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getGenerator()
+    {
+        return $this->generator ?: $this->generator = new LazyLoadingGhostGenerator();
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Factory/LazyLoadingValueHolderFactory.php
@@ -0,0 +1,45 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Factory;
+
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator;
+
+/**
+ * Factory responsible of producing virtual proxy instances
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @method \ProxyManager\Proxy\VirtualProxyInterface createProxy($className, \Closure $initializer)
+ */
+class LazyLoadingValueHolderFactory extends AbstractLazyFactory
+{
+    /**
+     * @var \ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator|null
+     */
+    private $generator;
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getGenerator()
+    {
+        return $this->generator ?: $this->generator = new LazyLoadingValueHolderGenerator();
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Factory/NullObjectFactory.php
@@ -0,0 +1,56 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Factory;
+
+use ProxyManager\ProxyGenerator\NullObjectGenerator;
+
+/**
+ * Factory responsible of producing proxy objects
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class NullObjectFactory extends AbstractBaseFactory
+{
+    /**
+     * @var \ProxyManager\ProxyGenerator\NullObjectGenerator|null
+     */
+    private $generator;
+
+    /**
+     * @param object $instanceOrClassName the object to be wrapped or interface to transform to null object
+     *
+     * @return \ProxyManager\Proxy\NullobjectInterface
+     */
+    public function createProxy($instanceOrClassName)
+    {
+        $className      = is_object($instanceOrClassName) ? get_class($instanceOrClassName) : $instanceOrClassName;
+        $proxyClassName = $this->generateProxy($className);
+
+        return new $proxyClassName();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getGenerator()
+    {
+        return $this->generator ?: $this->generator = new NullObjectGenerator();
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Factory/RemoteObject/Adapter/BaseAdapter.php
@@ -0,0 +1,81 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Factory\RemoteObject\Adapter;
+
+use ProxyManager\Factory\RemoteObject\AdapterInterface;
+use Zend\Server\Client;
+
+/**
+ * Remote Object base adapter
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+abstract class BaseAdapter implements AdapterInterface
+{
+    /**
+     * Adapter client
+     *
+     * @var \Zend\Server\Client
+     */
+    protected $client;
+
+    /**
+     * Service name mapping
+     *
+     * @var string[]
+     */
+    protected $map = array();
+
+    /**
+     * Constructor
+     *
+     * @param Client $client
+     * @param array  $map    map of service names to their aliases
+     */
+    public function __construct(Client $client, array $map = array())
+    {
+        $this->client = $client;
+        $this->map    = $map;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function call($wrappedClass, $method, array $params = array())
+    {
+        $serviceName = $this->getServiceName($wrappedClass, $method);
+
+        if (isset($this->map[$serviceName])) {
+            $serviceName = $this->map[$serviceName];
+        }
+
+        return $this->client->call($serviceName, $params);
+    }
+
+    /**
+     * Get the service name will be used by the adapter
+     *
+     * @param string $wrappedClass
+     * @param string $method
+     *
+     * @return string Service name
+     */
+    abstract protected function getServiceName($wrappedClass, $method);
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Factory/RemoteObject/Adapter/JsonRpc.php
@@ -0,0 +1,36 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Factory\RemoteObject\Adapter;
+
+/**
+ * Remote Object JSON RPC adapter
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class JsonRpc extends BaseAdapter
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected function getServiceName($wrappedClass, $method)
+    {
+        return $wrappedClass . '.' . $method;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Factory/RemoteObject/Adapter/Soap.php
@@ -0,0 +1,36 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Factory\RemoteObject\Adapter;
+
+/**
+ * Remote Object SOAP adapter
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class Soap extends BaseAdapter
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected function getServiceName($wrappedClass, $method)
+    {
+        return (string) $method;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Factory/RemoteObject/Adapter/XmlRpc.php
@@ -0,0 +1,36 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Factory\RemoteObject\Adapter;
+
+/**
+ * Remote Object XML RPC adapter
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class XmlRpc extends BaseAdapter
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected function getServiceName($wrappedClass, $method)
+    {
+        return $wrappedClass . '.' . $method;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Factory/RemoteObject/AdapterInterface.php
@@ -0,0 +1,37 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Factory\RemoteObject;
+
+/**
+ * Remote Object adapter interface
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+interface AdapterInterface
+{
+    /**
+     * Call remote object
+     *
+     * @param string $wrappedClass
+     * @param string $method
+     * @param array  $params
+     */
+    public function call($wrappedClass, $method, array $params = array());
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Factory/RemoteObjectFactory.php
@@ -0,0 +1,76 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Factory;
+
+use ProxyManager\Configuration;
+use ProxyManager\Factory\RemoteObject\AdapterInterface;
+use ProxyManager\ProxyGenerator\RemoteObjectGenerator;
+
+/**
+ * Factory responsible of producing remote proxy objects
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class RemoteObjectFactory extends AbstractBaseFactory
+{
+    /**
+     * @var AdapterInterface
+     */
+    protected $adapter;
+
+    /**
+     * @var \ProxyManager\ProxyGenerator\RemoteObjectGenerator|null
+     */
+    private $generator;
+
+    /**
+     * {@inheritDoc}
+     *
+     * @param AdapterInterface $adapter
+     * @param Configuration    $configuration
+     */
+    public function __construct(AdapterInterface $adapter, Configuration $configuration = null)
+    {
+        parent::__construct($configuration);
+
+        $this->adapter = $adapter;
+    }
+
+    /**
+     * @param string|object $instanceOrClassName
+     *
+     * @return \ProxyManager\Proxy\RemoteObjectInterface
+     */
+    public function createProxy($instanceOrClassName)
+    {
+        $className      = is_object($instanceOrClassName) ? get_class($instanceOrClassName) : $instanceOrClassName;
+        $proxyClassName = $this->generateProxy($className);
+
+        return new $proxyClassName($this->adapter);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getGenerator()
+    {
+        return $this->generator ?: $this->generator = new RemoteObjectGenerator();
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/FileLocator/FileLocator.php
@@ -0,0 +1,57 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\FileLocator;
+
+use ProxyManager\Exception\InvalidProxyDirectoryException;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class FileLocator implements FileLocatorInterface
+{
+    /**
+     * @var string
+     */
+    protected $proxiesDirectory;
+
+    /**
+     * @param string $proxiesDirectory
+     *
+     * @throws \ProxyManager\Exception\InvalidProxyDirectoryException
+     */
+    public function __construct($proxiesDirectory)
+    {
+        $this->proxiesDirectory = realpath($proxiesDirectory);
+
+        if (false === $this->proxiesDirectory) {
+            throw InvalidProxyDirectoryException::proxyDirectoryNotFound($proxiesDirectory);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getProxyFileName($className)
+    {
+        return $this->proxiesDirectory . DIRECTORY_SEPARATOR . str_replace('\\', '', $className) . '.php';
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/FileLocator/FileLocatorInterface.php
@@ -0,0 +1,37 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\FileLocator;
+
+/**
+ * Basic autoloader utilities required to work with proxy files
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface FileLocatorInterface
+{
+    /**
+     * Retrieves the file name for the given proxy
+     *
+     * @param string $className
+     *
+     * @return string
+     */
+    public function getProxyFileName($className);
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Generator/ClassGenerator.php
@@ -0,0 +1,54 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Generator;
+
+use Zend\Code\Generator\ClassGenerator as ZendClassGenerator;
+
+/**
+ * Class generator that ensures that interfaces/classes that are implemented/extended are FQCNs
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class ClassGenerator extends ZendClassGenerator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function setExtendedClass($extendedClass)
+    {
+        if ($extendedClass) {
+            $extendedClass = '\\' . trim($extendedClass, '\\');
+        }
+
+        return parent::setExtendedClass($extendedClass);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setImplementedInterfaces(array $interfaces)
+    {
+        foreach ($interfaces as & $interface) {
+            $interface = '\\' . trim($interface, '\\');
+        }
+
+        return parent::setImplementedInterfaces($interfaces);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Generator/MagicMethodGenerator.php
@@ -0,0 +1,52 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Generator;
+
+use ReflectionClass;
+
+/**
+ * Method generator for magic methods
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicMethodGenerator extends MethodGenerator
+{
+    /**
+     * @param ReflectionClass $originalClass
+     * @param string          $name
+     * @param array           $parameters
+     */
+    public function __construct(ReflectionClass $originalClass, $name, array $parameters = array())
+    {
+        parent::__construct(
+            $name,
+            $parameters,
+            static::FLAG_PUBLIC,
+            null,
+            $originalClass->hasMethod($name) ? '{@inheritDoc}' : null
+        );
+
+        $this->setReturnsReference(strtolower($name) === '__get');
+
+        if ($originalClass->hasMethod($name)) {
+            $this->setReturnsReference($originalClass->getMethod($name)->returnsReference());
+        }
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Generator/MethodGenerator.php
@@ -0,0 +1,161 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Generator;
+
+use Zend\Code\Generator\DocBlockGenerator;
+use Zend\Code\Generator\MethodGenerator as ZendMethodGenerator;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Method generator that fixes minor quirks in ZF2's method generator
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MethodGenerator extends ZendMethodGenerator
+{
+    /**
+     * @var bool
+     */
+    protected $returnsReference = false;
+
+    /**
+     * @param boolean $returnsReference
+     */
+    public function setReturnsReference($returnsReference)
+    {
+        $this->returnsReference = (bool) $returnsReference;
+    }
+
+    /**
+     * @return boolean
+     */
+    public function returnsReference()
+    {
+        return $this->returnsReference;
+    }
+
+    /**
+     * @override enforces generation of \ProxyManager\Generator\MethodGenerator
+     *
+     * {@inheritDoc}
+     */
+    public static function fromReflection(MethodReflection $reflectionMethod)
+    {
+        /* @var $method self */
+        $method = new static();
+
+        $method->setSourceContent($reflectionMethod->getContents(false));
+        $method->setSourceDirty(false);
+
+        if ($reflectionMethod->getDocComment() != '') {
+            $method->setDocBlock(DocBlockGenerator::fromReflection($reflectionMethod->getDocBlock()));
+        }
+
+        $method->setFinal($reflectionMethod->isFinal());
+        $method->setVisibility(self::extractVisibility($reflectionMethod));
+
+        foreach ($reflectionMethod->getParameters() as $reflectionParameter) {
+            $method->setParameter(ParameterGenerator::fromReflection($reflectionParameter));
+        }
+
+        $method->setStatic($reflectionMethod->isStatic());
+        $method->setName($reflectionMethod->getName());
+        $method->setBody($reflectionMethod->getBody());
+        $method->setReturnsReference($reflectionMethod->returnsReference());
+
+        return $method;
+    }
+
+    /**
+     * Retrieves the visibility for the given method reflection
+     *
+     * @param MethodReflection $reflectionMethod
+     *
+     * @return string
+     */
+    private static function extractVisibility(MethodReflection $reflectionMethod)
+    {
+        if ($reflectionMethod->isPrivate()) {
+            return static::VISIBILITY_PRIVATE;
+        }
+
+        if ($reflectionMethod->isProtected()) {
+            return static::VISIBILITY_PROTECTED;
+        }
+
+        return static::VISIBILITY_PUBLIC;
+    }
+
+    /**
+     * @override fixes by-reference return value in zf2's method generator
+     *
+     * {@inheritDoc}
+     */
+    public function generate()
+    {
+        $output = '';
+        $indent = $this->getIndentation();
+
+        if (null !== ($docBlock = $this->getDocBlock())) {
+            $docBlock->setIndentation($indent);
+
+            $output .= $docBlock->generate();
+        }
+
+        $output .= $indent . $this->generateMethodDeclaration() . self::LINE_FEED . $indent . '{' . self::LINE_FEED;
+
+        if ($this->body) {
+            $output .= preg_replace('#^(.+?)$#m', $indent . $indent . '$1', trim($this->body))
+                . self::LINE_FEED;
+        }
+
+        $output .= $indent . '}' . self::LINE_FEED;
+
+        return $output;
+    }
+
+    /**
+     * @return string
+     */
+    private function generateMethodDeclaration()
+    {
+        $output = $this->generateVisibility()
+            . ' function '
+            . (($this->returnsReference()) ? '& ' : '')
+            . $this->getName() . '(';
+
+        $parameterOutput = array();
+
+        foreach ($this->getParameters() as $parameter) {
+            $parameterOutput[] = $parameter->generate();
+        }
+
+        return $output . implode(', ', $parameterOutput) . ')';
+    }
+
+    /**
+     * @return string
+     */
+    private function generateVisibility()
+    {
+        return $this->isAbstract() ? 'abstract ' : (($this->isFinal()) ? 'final ' : '')
+            . ($this->getVisibility() . (($this->isStatic()) ? ' static' : ''));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Generator/ParameterGenerator.php
@@ -0,0 +1,149 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Generator;
+
+use ReflectionException;
+use Zend\Code\Generator\ParameterGenerator as ZendParameterGenerator;
+use Zend\Code\Generator\ValueGenerator;
+use Zend\Code\Reflection\ParameterReflection;
+
+/**
+ * Parameter generator that ensures that the parameter type is a FQCN when it is a class
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class ParameterGenerator extends ZendParameterGenerator
+{
+    /**
+     * @override - uses `static` to instantiate the parameter
+     *
+     * {@inheritDoc}
+     */
+    public static function fromReflection(ParameterReflection $reflectionParameter)
+    {
+        /* @var $param self */
+        $param = new static();
+
+        $param->setName($reflectionParameter->getName());
+        $param->setPosition($reflectionParameter->getPosition());
+
+        $type = self::extractParameterType($reflectionParameter);
+
+        if (null !== $type) {
+            $param->setType($type);
+        }
+
+        self::setOptionalParameter($param, $reflectionParameter);
+
+        $param->setPassedByReference($reflectionParameter->isPassedByReference());
+
+        return $param;
+    }
+
+    /**
+     * Retrieves the type of a reflection parameter (null if none is found)
+     *
+     * @param ParameterReflection $reflectionParameter
+     *
+     * @return string|null
+     */
+    private static function extractParameterType(ParameterReflection $reflectionParameter)
+    {
+        if ($reflectionParameter->isArray()) {
+            return 'array';
+        }
+
+        if (method_exists($reflectionParameter, 'isCallable') && $reflectionParameter->isCallable()) {
+            return 'callable';
+        }
+
+        if ($typeClass = $reflectionParameter->getClass()) {
+            return $typeClass->getName();
+        }
+
+        return null;
+    }
+
+    /**
+     * @return string
+     */
+    public function generate()
+    {
+        return $this->getGeneratedType()
+            . (true === $this->passedByReference ? '&' : '')
+            . '$' . $this->name
+            . $this->generateDefaultValue();
+    }
+
+    /**
+     * @return string
+     */
+    private function generateDefaultValue()
+    {
+        if (null === $this->defaultValue) {
+            return '';
+        }
+
+        $defaultValue = $this->defaultValue instanceof ValueGenerator
+            ? $this->defaultValue
+            : new ValueGenerator($this->defaultValue);
+
+        $defaultValue->setOutputMode(ValueGenerator::OUTPUT_SINGLE_LINE);
+
+        return ' = ' . $defaultValue;
+    }
+
+    /**
+     * Retrieves the generated parameter type
+     *
+     * @return string
+     */
+    private function getGeneratedType()
+    {
+        if (! $this->type || in_array($this->type, static::$simple)) {
+            return '';
+        }
+
+        if ('array' === $this->type || 'callable' === $this->type) {
+            return $this->type . ' ';
+        }
+
+        return '\\' . trim($this->type, '\\') . ' ';
+    }
+
+    /**
+     * Set the default value for a parameter (if it is optional)
+     *
+     * @param ZendParameterGenerator $parameterGenerator
+     * @param ParameterReflection    $reflectionParameter
+     */
+    private static function setOptionalParameter(
+        ZendParameterGenerator $parameterGenerator,
+        ParameterReflection $reflectionParameter
+    ) {
+        if ($reflectionParameter->isOptional()) {
+            try {
+                $parameterGenerator->setDefaultValue($reflectionParameter->getDefaultValue());
+            } catch (ReflectionException $e) {
+                $parameterGenerator->setDefaultValue(null);
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Generator/Util/ClassGeneratorUtils.php
@@ -0,0 +1,53 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Generator\Util;
+
+use ReflectionClass;
+use Zend\Code\Generator\ClassGenerator;
+use Zend\Code\Generator\MethodGenerator;
+
+/**
+ * Util class to help to generate code
+ *
+ * @author Jefersson Nathan <malukenho@phpse.net>
+ * @license MIT
+ */
+final class ClassGeneratorUtils
+{
+    /**
+     * @param ReflectionClass  $originalClass
+     * @param ClassGenerator   $classGenerator
+     * @param MethodGenerator  $generatedMethod
+     *
+     * @return void|false
+     */
+    public static function addMethodIfNotFinal(
+        ReflectionClass $originalClass,
+        ClassGenerator $classGenerator,
+        MethodGenerator $generatedMethod
+    ) {
+        $methodName = $generatedMethod->getName();
+
+        if ($originalClass->hasMethod($methodName) && $originalClass->getMethod($methodName)->isFinal()) {
+            return false;
+        }
+
+        $classGenerator->addMethodFromGenerator($generatedMethod);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Generator/Util/UniqueIdentifierGenerator.php
@@ -0,0 +1,53 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Generator\Util;
+
+/**
+ * Utility class capable of generating unique
+ * valid class/property/method identifiers
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+abstract class UniqueIdentifierGenerator
+{
+    const VALID_IDENTIFIER_FORMAT = '/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]+$/';
+    const DEFAULT_IDENTIFIER = 'g';
+
+    /**
+     * Generates a valid unique identifier from the given name
+     *
+     * @param string $name
+     *
+     * @return string
+     */
+    public static function getIdentifier($name)
+    {
+        return str_replace(
+            '.',
+            '',
+            uniqid(
+                preg_match(static::VALID_IDENTIFIER_FORMAT, $name)
+                ? $name
+                : static::DEFAULT_IDENTIFIER,
+                true
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/GeneratorStrategy/BaseGeneratorStrategy.php
@@ -0,0 +1,38 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\GeneratorStrategy;
+
+use Zend\Code\Generator\ClassGenerator;
+
+/**
+ * Generator strategy that generates the class body
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class BaseGeneratorStrategy implements GeneratorStrategyInterface
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function generate(ClassGenerator $classGenerator)
+    {
+        return $classGenerator->generate();
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/GeneratorStrategy/EvaluatingGeneratorStrategy.php
@@ -0,0 +1,69 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\GeneratorStrategy;
+
+use Zend\Code\Generator\ClassGenerator;
+
+/**
+ * Generator strategy that produces the code and evaluates it at runtime
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class EvaluatingGeneratorStrategy implements GeneratorStrategyInterface
+{
+    /**
+     * @var bool flag indicating whether {@see eval} can be used
+     */
+    private $canEval = true;
+
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        $this->canEval = ! ini_get('suhosin.executor.disable_eval');
+    }
+
+    /**
+     * Evaluates the generated code before returning it
+     *
+     * {@inheritDoc}
+     */
+    public function generate(ClassGenerator $classGenerator)
+    {
+        $code = $classGenerator->generate();
+
+        if (! $this->canEval) {
+            // @codeCoverageIgnoreStart
+            $fileName = sys_get_temp_dir() . '/EvaluatingGeneratorStrategy.php.tmp.' . uniqid('', true);
+
+            file_put_contents($fileName, "<?php\n" . $code);
+            require $fileName;
+            unlink($fileName);
+
+            return $code;
+            // @codeCoverageIgnoreEnd
+        }
+
+        eval($code);
+
+        return $code;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/GeneratorStrategy/FileWriterGeneratorStrategy.php
@@ -0,0 +1,105 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\GeneratorStrategy;
+
+use ProxyManager\Exception\FileNotWritableException;
+use ProxyManager\FileLocator\FileLocatorInterface;
+use Zend\Code\Generator\ClassGenerator;
+
+/**
+ * Generator strategy that writes the generated classes to disk while generating them
+ *
+ * {@inheritDoc}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class FileWriterGeneratorStrategy implements GeneratorStrategyInterface
+{
+    /**
+     * @var \ProxyManager\FileLocator\FileLocatorInterface
+     */
+    protected $fileLocator;
+
+    /**
+     * @var callable
+     */
+    private $emptyErrorHandler;
+
+    /**
+     * @param \ProxyManager\FileLocator\FileLocatorInterface $fileLocator
+     */
+    public function __construct(FileLocatorInterface $fileLocator)
+    {
+        $this->fileLocator       = $fileLocator;
+        $this->emptyErrorHandler = function () {
+        };
+    }
+
+    /**
+     * Write generated code to disk and return the class code
+     *
+     * {@inheritDoc}
+     */
+    public function generate(ClassGenerator $classGenerator)
+    {
+        $className     = trim($classGenerator->getNamespaceName(), '\\')
+            . '\\' . trim($classGenerator->getName(), '\\');
+        $generatedCode = $classGenerator->generate();
+        $fileName      = $this->fileLocator->getProxyFileName($className);
+
+        set_error_handler($this->emptyErrorHandler);
+
+        try {
+            $this->writeFile("<?php\n\n" . $generatedCode, $fileName);
+        } catch (FileNotWritableException $fileNotWritable) {
+            restore_error_handler();
+
+            throw $fileNotWritable;
+        }
+
+        restore_error_handler();
+
+        return $generatedCode;
+    }
+
+    /**
+     * Writes the source file in such a way that race conditions are avoided when the same file is written
+     * multiple times in a short time period
+     *
+     * @param string $source
+     * @param string $location
+     *
+     * @throws FileNotWritableException
+     */
+    private function writeFile($source, $location)
+    {
+        $tmpFileName   = $location . '.' . uniqid('', true);
+
+        if (! file_put_contents($tmpFileName, $source)) {
+            throw FileNotWritableException::fromNonWritableLocation($tmpFileName);
+        }
+
+        if (! rename($tmpFileName, $location)) {
+            unlink($tmpFileName);
+
+            throw FileNotWritableException::fromInvalidMoveOperation($tmpFileName, $location);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/GeneratorStrategy/GeneratorStrategyInterface.php
@@ -0,0 +1,39 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\GeneratorStrategy;
+
+use Zend\Code\Generator\ClassGenerator;
+
+/**
+ * Generator strategy interface - defines basic behavior of class generators
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface GeneratorStrategyInterface
+{
+    /**
+     * Generate the provided class
+     *
+     * @param ClassGenerator $classGenerator
+     *
+     * @return string the class body
+     */
+    public function generate(ClassGenerator $classGenerator);
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Inflector/ClassNameInflector.php
@@ -0,0 +1,98 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Inflector;
+
+use ProxyManager\Inflector\Util\ParameterHasher;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+final class ClassNameInflector implements ClassNameInflectorInterface
+{
+    /**
+     * @var string
+     */
+    protected $proxyNamespace;
+
+    /**
+     * @var int
+     */
+    private $proxyMarkerLength;
+
+    /**
+     * @var string
+     */
+    private $proxyMarker;
+
+    /**
+     * @var \ProxyManager\Inflector\Util\ParameterHasher
+     */
+    private $parameterHasher;
+
+    /**
+     * @param string $proxyNamespace
+     */
+    public function __construct($proxyNamespace)
+    {
+        $this->proxyNamespace    = (string) $proxyNamespace;
+        $this->proxyMarker       = '\\' . static::PROXY_MARKER . '\\';
+        $this->proxyMarkerLength = strlen($this->proxyMarker);
+        $this->parameterHasher   = new ParameterHasher();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getUserClassName($className)
+    {
+        $className = ltrim($className, '\\');
+
+        if (false === $position = strrpos($className, $this->proxyMarker)) {
+            return $className;
+        }
+
+        return substr(
+            $className,
+            $this->proxyMarkerLength + $position,
+            strrpos($className, '\\') - ($position + $this->proxyMarkerLength)
+        );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getProxyClassName($className, array $options = array())
+    {
+        return $this->proxyNamespace
+            . $this->proxyMarker
+            . $this->getUserClassName($className)
+            . '\\Generated' . $this->parameterHasher->hashParameters($options);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function isProxyClassName($className)
+    {
+        return false !== strrpos($className, $this->proxyMarker);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Inflector/ClassNameInflectorInterface.php
@@ -0,0 +1,61 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Inflector;
+
+/**
+ * Interface for a proxy- to user-class and user- to proxy-class name inflector
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface ClassNameInflectorInterface
+{
+    /**
+     * Marker for proxy classes - classes containing this marker are considered proxies
+     */
+    const PROXY_MARKER = '__PM__';
+
+    /**
+     * Retrieve the class name of a user-defined class
+     *
+     * @param string $className
+     *
+     * @return string
+     */
+    public function getUserClassName($className);
+
+    /**
+     * Retrieve the class name of the proxy for the given user-defined class name
+     *
+     * @param string $className
+     * @param array  $options   arbitrary options to be used for the generated class name
+     *
+     * @return string
+     */
+    public function getProxyClassName($className, array $options = array());
+
+    /**
+     * Retrieve whether the provided class name is a proxy
+     *
+     * @param string $className
+     *
+     * @return bool
+     */
+    public function isProxyClassName($className);
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Inflector/Util/ParameterEncoder.php
@@ -0,0 +1,41 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Inflector\Util;
+
+/**
+ * Encodes parameters into a class-name safe string
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class ParameterEncoder
+{
+    /**
+     * Converts the given parameters into a set of characters that are safe to
+     * use in a class name
+     *
+     * @param array $parameters
+     *
+     * @return string
+     */
+    public function encodeParameters(array $parameters)
+    {
+        return base64_encode(serialize($parameters));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Inflector/Util/ParameterHasher.php
@@ -0,0 +1,40 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Inflector\Util;
+
+/**
+ * Converts given parameters into a likely unique hash
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class ParameterHasher
+{
+    /**
+     * Converts the given parameters into a likely-unique hash
+     *
+     * @param array $parameters
+     *
+     * @return string
+     */
+    public function hashParameters(array $parameters)
+    {
+        return md5(serialize($parameters));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Proxy/AccessInterceptorInterface.php
@@ -0,0 +1,64 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Proxy;
+
+/**
+ * Access interceptor object marker
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface AccessInterceptorInterface extends ProxyInterface
+{
+    /**
+     * Set or remove the prefix interceptor for a method
+     *
+     * @link https://github.com/Ocramius/ProxyManager/blob/master/docs/access-interceptor-value-holder.md
+     *
+     * A prefix interceptor should have a signature like following:
+     *
+     * <code>
+     * $prefixInterceptor = function ($proxy, $instance, $method, $params, & $returnEarly) {};
+     * </code>
+     *
+     * @param string        $methodName        name of the intercepted method
+     * @param \Closure|null $prefixInterceptor interceptor closure or null to unset the currently active interceptor
+     *
+     * @return void
+     */
+    public function setMethodPrefixInterceptor($methodName, \Closure $prefixInterceptor = null);
+
+    /**
+     * Set or remove the suffix interceptor for a method
+     *
+     * @link https://github.com/Ocramius/ProxyManager/blob/master/docs/access-interceptor-value-holder.md
+     *
+     * A prefix interceptor should have a signature like following:
+     *
+     * <code>
+     * $suffixInterceptor = function ($proxy, $instance, $method, $params, $returnValue, & $returnEarly) {};
+     * </code>
+     *
+     * @param string        $methodName        name of the intercepted method
+     * @param \Closure|null $suffixInterceptor interceptor closure or null to unset the currently active interceptor
+     *
+     * @return void
+     */
+    public function setMethodSuffixInterceptor($methodName, \Closure $suffixInterceptor = null);
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Proxy/Exception/RemoteObjectException.php
@@ -0,0 +1,31 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Proxy\Exception;
+
+use RuntimeException;
+
+/**
+ * Remote object exception
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class RemoteObjectException extends RuntimeException
+{
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Proxy/FallbackValueHolderInterface.php
@@ -0,0 +1,29 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Proxy;
+
+/**
+ * Fallback value holder object marker
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface FallbackValueHolderInterface extends ProxyInterface
+{
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Proxy/GhostObjectInterface.php
@@ -0,0 +1,29 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Proxy;
+
+/**
+ * Ghost object marker
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface GhostObjectInterface extends LazyLoadingInterface
+{
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Proxy/LazyLoadingInterface.php
@@ -0,0 +1,64 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Proxy;
+
+/**
+ * Lazy loading object identifier
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface LazyLoadingInterface extends ProxyInterface
+{
+    /**
+     * Set or unset the initializer for the proxy instance
+     *
+     * @link https://github.com/Ocramius/ProxyManager/blob/master/docs/lazy-loading-value-holder.md#lazy-initialization
+     *
+     * An initializer should have a signature like following:
+     *
+     * <code>
+     * $initializer = function (& $wrappedObject, $proxy, $method, $parameters, & $initializer) {};
+     * </code>
+     *
+     * @param \Closure|null $initializer
+     *
+     * @return mixed
+     */
+    public function setProxyInitializer(\Closure $initializer = null);
+
+    /**
+     * @return \Closure|null
+     */
+    public function getProxyInitializer();
+
+    /**
+     * Force initialization of the proxy
+     *
+     * @return bool true if the proxy could be initialized
+     */
+    public function initializeProxy();
+
+    /**
+     * Retrieves current initialization status of the proxy
+     *
+     * @return bool
+     */
+    public function isProxyInitialized();
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Proxy/NullObjectInterface.php
@@ -0,0 +1,29 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Proxy;
+
+/**
+ * Null object marker
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+interface NullObjectInterface extends ProxyInterface
+{
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Proxy/ProxyInterface.php
@@ -0,0 +1,29 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Proxy;
+
+/**
+ * Base proxy marker
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface ProxyInterface
+{
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Proxy/RemoteObjectInterface.php
@@ -0,0 +1,29 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Proxy;
+
+/**
+ * Remote object marker
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface RemoteObjectInterface extends ProxyInterface
+{
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Proxy/SmartReferenceInterface.php
@@ -0,0 +1,29 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Proxy;
+
+/**
+ * Smart reference object marker
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface SmartReferenceInterface extends ProxyInterface
+{
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Proxy/ValueHolderInterface.php
@@ -0,0 +1,33 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Proxy;
+
+/**
+ * Value holder marker
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface ValueHolderInterface extends ProxyInterface
+{
+    /**
+     * @return object|null the wrapped value
+     */
+    public function getWrappedValueHolderValue();
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Proxy/VirtualProxyInterface.php
@@ -0,0 +1,29 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Proxy;
+
+/**
+ * Virtual Proxy - a lazy initializing object wrapping around the proxied subject
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface VirtualProxyInterface extends LazyLoadingInterface, ValueHolderInterface
+{
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptor/MethodGenerator/MagicWakeup.php
@@ -0,0 +1,50 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ReflectionClass;
+use ReflectionProperty;
+
+/**
+ * Magic `__wakeup` for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicWakeup extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(ReflectionClass $originalClass)
+    {
+        parent::__construct($originalClass, '__wakeup');
+
+        /* @var $publicProperties \ReflectionProperty[] */
+        $publicProperties = $originalClass->getProperties(ReflectionProperty::IS_PUBLIC);
+        $unsetProperties  = array();
+
+        foreach ($publicProperties as $publicProperty) {
+            $unsetProperties[] = '$this->' . $publicProperty->getName();
+        }
+
+        $this->setBody($unsetProperties ? 'unset(' . implode(', ', $unsetProperties) . ");" : '');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptor/MethodGenerator/SetMethodPrefixInterceptor.php
@@ -0,0 +1,50 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Implementation for {@see \ProxyManager\Proxy\AccessInterceptorInterface::setMethodPrefixInterceptor}
+ * for access interceptor objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class SetMethodPrefixInterceptor extends MethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(PropertyGenerator $prefixInterceptor)
+    {
+        parent::__construct('setMethodPrefixInterceptor');
+
+        $interceptor = new ParameterGenerator('prefixInterceptor');
+
+        $interceptor->setType('Closure');
+        $interceptor->setDefaultValue(null);
+        $this->setParameter(new ParameterGenerator('methodName'));
+        $this->setParameter($interceptor);
+        $this->setDocblock('{@inheritDoc}');
+        $this->setBody('$this->' . $prefixInterceptor->getName() . '[$methodName] = $prefixInterceptor;');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptor/MethodGenerator/SetMethodSuffixInterceptor.php
@@ -0,0 +1,50 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Implementation for {@see \ProxyManager\Proxy\AccessInterceptorInterface::setMethodSuffixInterceptor}
+ * for access interceptor objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class SetMethodSuffixInterceptor extends MethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(PropertyGenerator $suffixInterceptor)
+    {
+        parent::__construct('setMethodSuffixInterceptor');
+
+        $interceptor = new ParameterGenerator('suffixInterceptor');
+
+        $interceptor->setType('Closure');
+        $interceptor->setDefaultValue(null);
+        $this->setParameter(new ParameterGenerator('methodName'));
+        $this->setParameter($interceptor);
+        $this->setDocblock('{@inheritDoc}');
+        $this->setBody('$this->' . $suffixInterceptor->getName() . '[$methodName] = $suffixInterceptor;');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptor/PropertyGenerator/MethodPrefixInterceptors.php
@@ -0,0 +1,43 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator;
+
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Property that contains the interceptor for operations to be executed before method execution
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MethodPrefixInterceptors extends PropertyGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct(UniqueIdentifierGenerator::getIdentifier('methodPrefixInterceptors'));
+
+        $this->setDefaultValue(array());
+        $this->setVisibility(self::VISIBILITY_PRIVATE);
+        $this->setDocblock('@var \\Closure[] map of interceptors to be called per-method before execution');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptor/PropertyGenerator/MethodSuffixInterceptors.php
@@ -0,0 +1,43 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator;
+
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Property that contains the interceptor for operations to be executed after method execution
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MethodSuffixInterceptors extends PropertyGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct(UniqueIdentifierGenerator::getIdentifier('methodSuffixInterceptors'));
+
+        $this->setDefaultValue(array());
+        $this->setVisibility(self::VISIBILITY_PRIVATE);
+        $this->setDocblock('@var \\Closure[] map of interceptors to be called per-method after execution');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/Constructor.php
@@ -0,0 +1,92 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator;
+
+use ProxyManager\Exception\UnsupportedProxiedClassException;
+use ProxyManager\Generator\MethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * The `__construct` implementation for lazy loading proxies
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class Constructor extends MethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors
+    ) {
+        parent::__construct('__construct');
+
+        $localizedObject = new ParameterGenerator('localizedObject');
+        $prefix          = new ParameterGenerator('prefixInterceptors');
+        $suffix          = new ParameterGenerator('suffixInterceptors');
+
+        $localizedObject->setType($originalClass->getName());
+        $prefix->setDefaultValue(array());
+        $suffix->setDefaultValue(array());
+        $prefix->setType('array');
+        $suffix->setType('array');
+
+        $this->setParameter($localizedObject);
+        $this->setParameter($prefix);
+        $this->setParameter($suffix);
+
+        $localizedProperties = array();
+
+        foreach ($originalClass->getProperties() as $originalProperty) {
+            if ((! method_exists('Closure', 'bind')) && $originalProperty->isPrivate()) {
+                // @codeCoverageIgnoreStart
+                throw UnsupportedProxiedClassException::unsupportedLocalizedReflectionProperty($originalProperty);
+                // @codeCoverageIgnoreEnd
+            }
+
+            $propertyName = $originalProperty->getName();
+
+            if ($originalProperty->isPrivate()) {
+                $localizedProperties[] = "\\Closure::bind(function () use (\$localizedObject) {\n    "
+                    . '$this->' . $propertyName . ' = & $localizedObject->' . $propertyName . ";\n"
+                    . '}, $this, ' . var_export($originalProperty->getDeclaringClass()->getName(), true)
+                    . ')->__invoke();';
+            } else {
+                $localizedProperties[] = '$this->' . $propertyName . ' = & $localizedObject->' . $propertyName . ";";
+            }
+        }
+
+        $this->setDocblock(
+            "@override constructor to setup interceptors\n\n"
+            . "@param \\" . $originalClass->getName() . " \$localizedObject\n"
+            . "@param \\Closure[] \$prefixInterceptors method interceptors to be used before method logic\n"
+            . "@param \\Closure[] \$suffixInterceptors method interceptors to be used before method logic"
+        );
+        $this->setBody(
+            (empty($localizedProperties) ? '' : implode("\n\n", $localizedProperties) . "\n\n")
+            . '$this->' . $prefixInterceptors->getName() . " = \$prefixInterceptors;\n"
+            . '$this->' . $suffixInterceptors->getName() . " = \$suffixInterceptors;"
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/InterceptedMethod.php
@@ -0,0 +1,67 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Util\InterceptorGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Method with additional pre- and post- interceptor logic in the body
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class InterceptedMethod extends MethodGenerator
+{
+    /**
+     * @param \Zend\Code\Reflection\MethodReflection $originalMethod
+     * @param \Zend\Code\Generator\PropertyGenerator $prefixInterceptors
+     * @param \Zend\Code\Generator\PropertyGenerator $suffixInterceptors
+     *
+     * @return self
+     */
+    public static function generateMethod(
+        MethodReflection $originalMethod,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors
+    ) {
+        /* @var $method self */
+        $method          = static::fromReflection($originalMethod);
+        $forwardedParams = array();
+
+        foreach ($originalMethod->getParameters() as $parameter) {
+            $forwardedParams[]   = '$' . $parameter->getName();
+        }
+
+        $method->setDocblock('{@inheritDoc}');
+        $method->setBody(
+            InterceptorGenerator::createInterceptedMethodBody(
+                '$returnValue = parent::'
+                . $originalMethod->getName() . '(' . implode(', ', $forwardedParams) . ');',
+                $method,
+                $prefixInterceptors,
+                $suffixInterceptors
+            )
+        );
+
+        return $method;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicClone.php
@@ -0,0 +1,53 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Util\InterceptorGenerator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__clone` for lazy loading ghost objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicClone extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors
+    ) {
+        parent::__construct($originalClass, '__clone');
+
+        $this->setBody(
+            InterceptorGenerator::createInterceptedMethodBody(
+                $originalClass->hasMethod('__clone') ? '$returnValue = parent::__clone();' : '$returnValue = null;',
+                $this,
+                $prefixInterceptors,
+                $suffixInterceptors
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicGet.php
@@ -0,0 +1,73 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Util\InterceptorGenerator;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__get` for lazy loading ghost objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicGet extends MagicMethodGenerator
+{
+    /**
+     * @param ReflectionClass   $originalClass
+     * @param PropertyGenerator $prefixInterceptors
+     * @param PropertyGenerator $suffixInterceptors
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors
+    ) {
+        parent::__construct($originalClass, '__get', array(new ParameterGenerator('name')));
+
+        $override = $originalClass->hasMethod('__get');
+
+        $this->setDocblock(($override ? "{@inheritDoc}\n" : '') . '@param string $name');
+
+        if ($override) {
+            $callParent = '$returnValue = & parent::__get($name);';
+        } else {
+            $callParent = PublicScopeSimulator::getPublicAccessSimulationCode(
+                PublicScopeSimulator::OPERATION_GET,
+                'name',
+                null,
+                null,
+                'returnValue'
+            );
+        }
+
+        $this->setBody(
+            InterceptorGenerator::createInterceptedMethodBody(
+                $callParent,
+                $this,
+                $prefixInterceptors,
+                $suffixInterceptors
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicIsset.php
@@ -0,0 +1,73 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Util\InterceptorGenerator;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__isset` method for lazy loading ghost objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicIsset extends MagicMethodGenerator
+{
+    /**
+     * @param ReflectionClass   $originalClass
+     * @param PropertyGenerator $prefixInterceptors
+     * @param PropertyGenerator $suffixInterceptors
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors
+    ) {
+        parent::__construct($originalClass, '__isset', array(new ParameterGenerator('name')));
+
+        $override = $originalClass->hasMethod('__isset');
+
+        $this->setDocblock(($override ? "{@inheritDoc}\n" : '') . '@param string $name');
+
+        if ($override) {
+            $callParent = '$returnValue = & parent::__isset($name);';
+        } else {
+            $callParent = PublicScopeSimulator::getPublicAccessSimulationCode(
+                PublicScopeSimulator::OPERATION_ISSET,
+                'name',
+                null,
+                null,
+                'returnValue'
+            );
+        }
+
+        $this->setBody(
+            InterceptorGenerator::createInterceptedMethodBody(
+                $callParent,
+                $this,
+                $prefixInterceptors,
+                $suffixInterceptors
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicSet.php
@@ -0,0 +1,77 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Util\InterceptorGenerator;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__set` for lazy loading ghost objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicSet extends MagicMethodGenerator
+{
+    /**
+     * @param \ReflectionClass                       $originalClass
+     * @param \Zend\Code\Generator\PropertyGenerator $prefixInterceptors
+     * @param \Zend\Code\Generator\PropertyGenerator $suffixInterceptors
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors
+    ) {
+        parent::__construct(
+            $originalClass,
+            '__set',
+            array(new ParameterGenerator('name'), new ParameterGenerator('value'))
+        );
+
+        $override = $originalClass->hasMethod('__set');
+
+        $this->setDocblock(($override ? "{@inheritDoc}\n" : '') . '@param string $name');
+
+        if ($override) {
+            $callParent = '$returnValue = & parent::__set($name, $value);';
+        } else {
+            $callParent = PublicScopeSimulator::getPublicAccessSimulationCode(
+                PublicScopeSimulator::OPERATION_SET,
+                'name',
+                'value',
+                null,
+                'returnValue'
+            );
+        }
+
+        $this->setBody(
+            InterceptorGenerator::createInterceptedMethodBody(
+                $callParent,
+                $this,
+                $prefixInterceptors,
+                $suffixInterceptors
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicSleep.php
@@ -0,0 +1,57 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Util\InterceptorGenerator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__sleep` for lazy loading ghost objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicSleep extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors
+    ) {
+        parent::__construct($originalClass, '__sleep');
+
+        $callParent = $originalClass->hasMethod('__sleep')
+            ? '$returnValue = & parent::__sleep();'
+            : '$returnValue = array_keys((array) $this);';
+
+        $this->setBody(
+            InterceptorGenerator::createInterceptedMethodBody(
+                $callParent,
+                $this,
+                $prefixInterceptors,
+                $suffixInterceptors
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicUnset.php
@@ -0,0 +1,73 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Util\InterceptorGenerator;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__unset` method for lazy loading ghost objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicUnset extends MagicMethodGenerator
+{
+    /**
+     * @param ReflectionClass   $originalClass
+     * @param PropertyGenerator $prefixInterceptors
+     * @param PropertyGenerator $suffixInterceptors
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors
+    ) {
+        parent::__construct($originalClass, '__unset', array(new ParameterGenerator('name')));
+
+        $override = $originalClass->hasMethod('__unset');
+
+        $this->setDocblock(($override ? "{@inheritDoc}\n" : '') . '@param string $name');
+
+        if ($override) {
+            $callParent = '$returnValue = & parent::__unset($name);';
+        } else {
+            $callParent = PublicScopeSimulator::getPublicAccessSimulationCode(
+                PublicScopeSimulator::OPERATION_UNSET,
+                'name',
+                null,
+                null,
+                'returnValue'
+            );
+        }
+
+        $this->setBody(
+            InterceptorGenerator::createInterceptedMethodBody(
+                $callParent,
+                $this,
+                $prefixInterceptors,
+                $suffixInterceptors
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/Util/InterceptorGenerator.php
@@ -0,0 +1,82 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Util;
+
+use ProxyManager\Generator\MethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Utility to create pre- and post- method interceptors around a given method body
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @internal - this class is just here as a small utility for this component,
+ * don't use it in your own code
+ */
+class InterceptorGenerator
+{
+    /**
+     * @param string                                  $methodBody         the body of the previously generated code.
+     *                                                                    It MUST assign the return value to a variable
+     *                                                                    `$returnValue` instead of directly returning
+     * @param \ProxyManager\Generator\MethodGenerator $method
+     * @param \Zend\Code\Generator\PropertyGenerator  $prefixInterceptors
+     * @param \Zend\Code\Generator\PropertyGenerator  $suffixInterceptors
+     *
+     * @return string
+     */
+    public static function createInterceptedMethodBody(
+        $methodBody,
+        MethodGenerator $method,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors
+    ) {
+        $name               = var_export($method->getName(), true);
+        $prefixInterceptors = $prefixInterceptors->getName();
+        $suffixInterceptors = $suffixInterceptors->getName();
+        $params             = array();
+
+        foreach ($method->getParameters() as $parameter) {
+            $parameterName = $parameter->getName();
+            $params[]      = var_export($parameterName, true) . ' => $' . $parameter->getName();
+        }
+
+        $paramsString = 'array(' . implode(', ', $params) . ')';
+
+        return "if (isset(\$this->$prefixInterceptors" . "[$name])) {\n"
+            . "    \$returnEarly       = false;\n"
+            . "    \$prefixReturnValue = \$this->$prefixInterceptors" . "[$name]->__invoke("
+            . "\$this, \$this, $name, $paramsString, \$returnEarly);\n\n"
+            . "    if (\$returnEarly) {\n"
+            . "        return \$prefixReturnValue;\n"
+            . "    }\n"
+            . "}\n\n"
+            . $methodBody . "\n\n"
+            . "if (isset(\$this->$suffixInterceptors" . "[$name])) {\n"
+            . "    \$returnEarly       = false;\n"
+            . "    \$suffixReturnValue = \$this->$suffixInterceptors" . "[$name]->__invoke("
+            . "\$this, \$this, $name, $paramsString, \$returnValue, \$returnEarly);\n\n"
+            . "    if (\$returnEarly) {\n"
+            . "        return \$suffixReturnValue;\n"
+            . "    }\n"
+            . "}\n\n"
+            . "return \$returnValue;";
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorScopeLocalizerGenerator.php
@@ -0,0 +1,96 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator;
+
+use ProxyManager\Generator\Util\ClassGeneratorUtils;
+use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodPrefixInterceptor;
+use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodSuffixInterceptor;
+use ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodPrefixInterceptors;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Constructor;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\InterceptedMethod;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicClone;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicGet;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicIsset;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicSet;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicSleep;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicUnset;
+use ProxyManager\ProxyGenerator\Assertion\CanProxyAssertion;
+use ProxyManager\ProxyGenerator\Util\ProxiedMethodsFilter;
+use ReflectionClass;
+use ReflectionMethod;
+use Zend\Code\Generator\ClassGenerator;
+use Zend\Code\Generator\MethodGenerator;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Generator for proxies implementing {@see \ProxyManager\Proxy\ValueHolderInterface}
+ * and localizing scope of the proxied object at instantiation
+ *
+ * {@inheritDoc}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class AccessInterceptorScopeLocalizerGenerator implements ProxyGeneratorInterface
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function generate(ReflectionClass $originalClass, ClassGenerator $classGenerator)
+    {
+        CanProxyAssertion::assertClassCanBeProxied($originalClass, false);
+
+        $classGenerator->setExtendedClass($originalClass->getName());
+        $classGenerator->setImplementedInterfaces(array('ProxyManager\\Proxy\\AccessInterceptorInterface'));
+        $classGenerator->addPropertyFromGenerator($prefixInterceptors = new MethodPrefixInterceptors());
+        $classGenerator->addPropertyFromGenerator($suffixInterceptors = new MethodPrefixInterceptors());
+
+        array_map(
+            function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator) {
+                ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod);
+            },
+            array_merge(
+                array_map(
+                    function (ReflectionMethod $method) use ($prefixInterceptors, $suffixInterceptors) {
+                        return InterceptedMethod::generateMethod(
+                            new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()),
+                            $prefixInterceptors,
+                            $suffixInterceptors
+                        );
+                    },
+                    ProxiedMethodsFilter::getProxiedMethods(
+                        $originalClass,
+                        array('__get', '__set', '__isset', '__unset', '__clone', '__sleep')
+                    )
+                ),
+                array(
+                    new Constructor($originalClass, $prefixInterceptors, $suffixInterceptors),
+                    new SetMethodPrefixInterceptor($prefixInterceptors),
+                    new SetMethodSuffixInterceptor($suffixInterceptors),
+                    new MagicGet($originalClass, $prefixInterceptors, $suffixInterceptors),
+                    new MagicSet($originalClass, $prefixInterceptors, $suffixInterceptors),
+                    new MagicIsset($originalClass, $prefixInterceptors, $suffixInterceptors),
+                    new MagicUnset($originalClass, $prefixInterceptors, $suffixInterceptors),
+                    new MagicSleep($originalClass, $prefixInterceptors, $suffixInterceptors),
+                    new MagicClone($originalClass, $prefixInterceptors, $suffixInterceptors),
+                )
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/Constructor.php
@@ -0,0 +1,79 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ReflectionClass;
+use ReflectionProperty;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * The `__construct` implementation for lazy loading proxies
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class Constructor extends MethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $valueHolder,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors
+    ) {
+        parent::__construct('__construct');
+
+        $prefix = new ParameterGenerator('prefixInterceptors');
+        $suffix = new ParameterGenerator('suffixInterceptors');
+
+        $prefix->setDefaultValue(array());
+        $suffix->setDefaultValue(array());
+        $prefix->setType('array');
+        $suffix->setType('array');
+
+        $this->setParameter(new ParameterGenerator('wrappedObject'));
+        $this->setParameter($prefix);
+        $this->setParameter($suffix);
+
+        /* @var $publicProperties \ReflectionProperty[] */
+        $publicProperties = $originalClass->getProperties(ReflectionProperty::IS_PUBLIC);
+        $unsetProperties  = array();
+
+        foreach ($publicProperties as $publicProperty) {
+            $unsetProperties[] = '$this->' . $publicProperty->getName();
+        }
+
+        $this->setDocblock(
+            "@override constructor to setup interceptors\n\n"
+            . "@param \\" . $originalClass->getName() . " \$wrappedObject\n"
+            . "@param \\Closure[] \$prefixInterceptors method interceptors to be used before method logic\n"
+            . "@param \\Closure[] \$suffixInterceptors method interceptors to be used before method logic"
+        );
+        $this->setBody(
+            ($unsetProperties ? 'unset(' . implode(', ', $unsetProperties) . ");\n\n" : '')
+            . '$this->' . $valueHolder->getName() . " = \$wrappedObject;\n"
+            . '$this->' . $prefixInterceptors->getName() . " = \$prefixInterceptors;\n"
+            . '$this->' . $suffixInterceptors->getName() . " = \$suffixInterceptors;"
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/InterceptedMethod.php
@@ -0,0 +1,70 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\Util\InterceptorGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Method with additional pre- and post- interceptor logic in the body
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class InterceptedMethod extends MethodGenerator
+{
+    /**
+     * @param \Zend\Code\Reflection\MethodReflection $originalMethod
+     * @param \Zend\Code\Generator\PropertyGenerator $valueHolderProperty
+     * @param \Zend\Code\Generator\PropertyGenerator $prefixInterceptors
+     * @param \Zend\Code\Generator\PropertyGenerator $suffixInterceptors
+     *
+     * @return self
+     */
+    public static function generateMethod(
+        MethodReflection $originalMethod,
+        PropertyGenerator $valueHolderProperty,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors
+    ) {
+        /* @var $method self */
+        $method          = static::fromReflection($originalMethod);
+        $forwardedParams = array();
+
+        foreach ($originalMethod->getParameters() as $parameter) {
+            $forwardedParams[]   = '$' . $parameter->getName();
+        }
+
+        $method->setDocblock('{@inheritDoc}');
+        $method->setBody(
+            InterceptorGenerator::createInterceptedMethodBody(
+                '$returnValue = $this->' . $valueHolderProperty->getName() . '->'
+                . $originalMethod->getName() . '(' . implode(', ', $forwardedParams) . ');',
+                $method,
+                $valueHolderProperty,
+                $prefixInterceptors,
+                $suffixInterceptors
+            )
+        );
+
+        return $method;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/MagicClone.php
@@ -0,0 +1,58 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__clone` for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicClone extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $valueHolderProperty,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors
+    ) {
+        parent::__construct($originalClass, '__clone');
+
+        $valueHolder = $valueHolderProperty->getName();
+        $prefix      = $prefixInterceptors->getName();
+        $suffix      = $suffixInterceptors->getName();
+
+        $this->setBody(
+            "\$this->$valueHolder = clone \$this->$valueHolder;\n\n"
+            . "foreach (\$this->$prefix as \$key => \$value) {\n"
+            . "    \$this->$prefix" . "[\$key] = clone \$value;\n"
+            . "}\n\n"
+            . "foreach (\$this->$suffix as \$key => \$value) {\n"
+            . "    \$this->$suffix" . "[\$key] = clone \$value;\n"
+            . "}"
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/MagicGet.php
@@ -0,0 +1,78 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\Util\InterceptorGenerator;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__get` for method interceptor value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicGet extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $valueHolder,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors,
+        PublicPropertiesMap $publicProperties
+    ) {
+        parent::__construct($originalClass, '__get', array(new ParameterGenerator('name')));
+
+        $override        = $originalClass->hasMethod('__get');
+        $valueHolderName = $valueHolder->getName();
+
+        $this->setDocblock(($override ? "{@inheritDoc}\n" : '') . '@param string $name');
+
+        $callParent = PublicScopeSimulator::getPublicAccessSimulationCode(
+            PublicScopeSimulator::OPERATION_GET,
+            'name',
+            'value',
+            $valueHolder,
+            'returnValue'
+        );
+
+        if (! $publicProperties->isEmpty()) {
+            $callParent = 'if (isset(self::$' . $publicProperties->getName() . "[\$name])) {\n"
+                . '    $returnValue = & $this->' . $valueHolderName . '->$name;'
+                . "\n} else {\n    $callParent\n}\n\n";
+        }
+
+        $this->setBody(
+            InterceptorGenerator::createInterceptedMethodBody(
+                $callParent,
+                $this,
+                $valueHolder,
+                $prefixInterceptors,
+                $suffixInterceptors
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/MagicIsset.php
@@ -0,0 +1,78 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\Util\InterceptorGenerator;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__isset` for method interceptor value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicIsset extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $valueHolder,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors,
+        PublicPropertiesMap $publicProperties
+    ) {
+        parent::__construct($originalClass, '__isset', array(new ParameterGenerator('name')));
+
+        $override        = $originalClass->hasMethod('__isset');
+        $valueHolderName = $valueHolder->getName();
+
+        $this->setDocblock(($override ? "{@inheritDoc}\n" : '') . '@param string $name');
+
+        $callParent = PublicScopeSimulator::getPublicAccessSimulationCode(
+            PublicScopeSimulator::OPERATION_ISSET,
+            'name',
+            'value',
+            $valueHolder,
+            'returnValue'
+        );
+
+        if (! $publicProperties->isEmpty()) {
+            $callParent = 'if (isset(self::$' . $publicProperties->getName() . "[\$name])) {\n"
+                . '    $returnValue = isset($this->' . $valueHolderName . '->$name);'
+                . "\n} else {\n    $callParent\n}\n\n";
+        }
+
+        $this->setBody(
+            InterceptorGenerator::createInterceptedMethodBody(
+                $callParent,
+                $this,
+                $valueHolder,
+                $prefixInterceptors,
+                $suffixInterceptors
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/MagicSet.php
@@ -0,0 +1,82 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\Util\InterceptorGenerator;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__set` for method interceptor value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicSet extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $valueHolder,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors,
+        PublicPropertiesMap $publicProperties
+    ) {
+        parent::__construct(
+            $originalClass,
+            '__set',
+            array(new ParameterGenerator('name'), new ParameterGenerator('value'))
+        );
+
+        $override        = $originalClass->hasMethod('__set');
+        $valueHolderName = $valueHolder->getName();
+
+        $this->setDocblock(($override ? "{@inheritDoc}\n" : '') . '@param string $name');
+
+        $callParent = PublicScopeSimulator::getPublicAccessSimulationCode(
+            PublicScopeSimulator::OPERATION_SET,
+            'name',
+            'value',
+            $valueHolder,
+            'returnValue'
+        );
+
+        if (! $publicProperties->isEmpty()) {
+            $callParent = 'if (isset(self::$' . $publicProperties->getName() . "[\$name])) {\n"
+                . '    $returnValue = ($this->' . $valueHolderName . '->$name = $value);'
+                . "\n} else {\n    $callParent\n}\n\n";
+        }
+
+        $this->setBody(
+            InterceptorGenerator::createInterceptedMethodBody(
+                $callParent,
+                $this,
+                $valueHolder,
+                $prefixInterceptors,
+                $suffixInterceptors
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/MagicUnset.php
@@ -0,0 +1,80 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\Util\InterceptorGenerator;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__unset` for method interceptor value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicUnset extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $valueHolder,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors,
+        PublicPropertiesMap $publicProperties
+    ) {
+        parent::__construct($originalClass, '__unset', array(new ParameterGenerator('name')));
+
+        $override        = $originalClass->hasMethod('__unset');
+        $valueHolderName = $valueHolder->getName();
+
+        $this->setDocblock(($override ? "{@inheritDoc}\n" : '') . '@param string $name');
+
+        $callParent = PublicScopeSimulator::getPublicAccessSimulationCode(
+            PublicScopeSimulator::OPERATION_UNSET,
+            'name',
+            'value',
+            $valueHolder,
+            'returnValue'
+        );
+
+        if (! $publicProperties->isEmpty()) {
+            $callParent = 'if (isset(self::$' . $publicProperties->getName() . "[\$name])) {\n"
+                . '    unset($this->' . $valueHolderName . '->$name);'
+                . "\n} else {\n    $callParent\n}\n\n";
+        }
+
+        $callParent .= '$returnValue = false;';
+
+        $this->setBody(
+            InterceptorGenerator::createInterceptedMethodBody(
+                $callParent,
+                $this,
+                $valueHolder,
+                $prefixInterceptors,
+                $suffixInterceptors
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/Util/InterceptorGenerator.php
@@ -0,0 +1,85 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\Util;
+
+use ProxyManager\Generator\MethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Utility to create pre- and post- method interceptors around a given method body
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @internal - this class is just here as a small utility for this component,
+ * don't use it in your own code
+ */
+class InterceptorGenerator
+{
+    /**
+     * @param string                                  $methodBody         the body of the previously generated code.
+     *                                                                    It MUST assign the return value to a variable
+     *                                                                    `$returnValue` instead of directly returning
+     * @param \ProxyManager\Generator\MethodGenerator $method
+     * @param \Zend\Code\Generator\PropertyGenerator  $valueHolder
+     * @param \Zend\Code\Generator\PropertyGenerator  $prefixInterceptors
+     * @param \Zend\Code\Generator\PropertyGenerator  $suffixInterceptors
+     *
+     * @return string
+     */
+    public static function createInterceptedMethodBody(
+        $methodBody,
+        MethodGenerator $method,
+        PropertyGenerator $valueHolder,
+        PropertyGenerator $prefixInterceptors,
+        PropertyGenerator $suffixInterceptors
+    ) {
+        $name               = var_export($method->getName(), true);
+        $valueHolder        = $valueHolder->getName();
+        $prefixInterceptors = $prefixInterceptors->getName();
+        $suffixInterceptors = $suffixInterceptors->getName();
+        $params             = array();
+
+        foreach ($method->getParameters() as $parameter) {
+            $parameterName = $parameter->getName();
+            $params[]      = var_export($parameterName, true) . ' => $' . $parameter->getName();
+        }
+
+        $paramsString = 'array(' . implode(', ', $params) . ')';
+
+        return "if (isset(\$this->$prefixInterceptors" . "[$name])) {\n"
+            . "    \$returnEarly       = false;\n"
+            . "    \$prefixReturnValue = \$this->$prefixInterceptors" . "[$name]->__invoke("
+            . "\$this, \$this->$valueHolder, $name, $paramsString, \$returnEarly);\n\n"
+            . "    if (\$returnEarly) {\n"
+            . "        return \$prefixReturnValue;\n"
+            . "    }\n"
+            . "}\n\n"
+            . $methodBody . "\n\n"
+            . "if (isset(\$this->$suffixInterceptors" . "[$name])) {\n"
+            . "    \$returnEarly       = false;\n"
+            . "    \$suffixReturnValue = \$this->$suffixInterceptors" . "[$name]->__invoke("
+            . "\$this, \$this->$valueHolder, $name, $paramsString, \$returnValue, \$returnEarly);\n\n"
+            . "    if (\$returnEarly) {\n"
+            . "        return \$suffixReturnValue;\n"
+            . "    }\n"
+            . "}\n\n"
+            . "return \$returnValue;";
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/AccessInterceptorValueHolderGenerator.php
@@ -0,0 +1,138 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator;
+
+use ProxyManager\Generator\Util\ClassGeneratorUtils;
+use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\MagicWakeup;
+use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodPrefixInterceptor;
+use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodSuffixInterceptor;
+use ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodPrefixInterceptors;
+use ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodSuffixInterceptors;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\Constructor;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\InterceptedMethod;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicClone;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicGet;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicIsset;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicSet;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicUnset;
+use ProxyManager\ProxyGenerator\Assertion\CanProxyAssertion;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\ValueHolderProperty;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
+use ProxyManager\ProxyGenerator\Util\ProxiedMethodsFilter;
+use ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\GetWrappedValueHolderValue;
+use ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\MagicSleep;
+use ReflectionClass;
+use ReflectionMethod;
+use Zend\Code\Generator\ClassGenerator;
+use Zend\Code\Generator\MethodGenerator;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Generator for proxies implementing {@see \ProxyManager\Proxy\ValueHolderInterface}
+ * and {@see \ProxyManager\Proxy\AccessInterceptorInterface}
+ *
+ * {@inheritDoc}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class AccessInterceptorValueHolderGenerator implements ProxyGeneratorInterface
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function generate(ReflectionClass $originalClass, ClassGenerator $classGenerator)
+    {
+        CanProxyAssertion::assertClassCanBeProxied($originalClass);
+
+        $publicProperties    = new PublicPropertiesMap($originalClass);
+        $interfaces          = array(
+            'ProxyManager\\Proxy\\AccessInterceptorInterface',
+            'ProxyManager\\Proxy\\ValueHolderInterface',
+        );
+
+        if ($originalClass->isInterface()) {
+            $interfaces[] = $originalClass->getName();
+        } else {
+            $classGenerator->setExtendedClass($originalClass->getName());
+        }
+
+        $classGenerator->setImplementedInterfaces($interfaces);
+        $classGenerator->addPropertyFromGenerator($valueHolder = new ValueHolderProperty());
+        $classGenerator->addPropertyFromGenerator($prefixInterceptors = new MethodPrefixInterceptors());
+        $classGenerator->addPropertyFromGenerator($suffixInterceptors = new MethodSuffixInterceptors());
+        $classGenerator->addPropertyFromGenerator($publicProperties);
+
+        array_map(
+            function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator) {
+                ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod);
+            },
+            array_merge(
+                array_map(
+                    function (ReflectionMethod $method) use ($prefixInterceptors, $suffixInterceptors, $valueHolder) {
+                        return InterceptedMethod::generateMethod(
+                            new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()),
+                            $valueHolder,
+                            $prefixInterceptors,
+                            $suffixInterceptors
+                        );
+                    },
+                    ProxiedMethodsFilter::getProxiedMethods($originalClass)
+                ),
+                array(
+                    new Constructor($originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors),
+                    new GetWrappedValueHolderValue($valueHolder),
+                    new SetMethodPrefixInterceptor($prefixInterceptors),
+                    new SetMethodSuffixInterceptor($suffixInterceptors),
+                    new MagicGet(
+                        $originalClass,
+                        $valueHolder,
+                        $prefixInterceptors,
+                        $suffixInterceptors,
+                        $publicProperties
+                    ),
+                    new MagicSet(
+                        $originalClass,
+                        $valueHolder,
+                        $prefixInterceptors,
+                        $suffixInterceptors,
+                        $publicProperties
+                    ),
+                    new MagicIsset(
+                        $originalClass,
+                        $valueHolder,
+                        $prefixInterceptors,
+                        $suffixInterceptors,
+                        $publicProperties
+                    ),
+                    new MagicUnset(
+                        $originalClass,
+                        $valueHolder,
+                        $prefixInterceptors,
+                        $suffixInterceptors,
+                        $publicProperties
+                    ),
+                    new MagicClone($originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors),
+                    new MagicSleep($originalClass, $valueHolder),
+                    new MagicWakeup($originalClass, $valueHolder),
+                )
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/Assertion/CanProxyAssertion.php
@@ -0,0 +1,102 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\Assertion;
+
+use BadMethodCallException;
+use ProxyManager\Exception\InvalidProxiedClassException;
+use ReflectionClass;
+use ReflectionMethod;
+
+/**
+ * Assertion that verifies that a class can be proxied
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+final class CanProxyAssertion
+{
+    /**
+     * Disabled constructor: not meant to be instantiated
+     *
+     * @throws BadMethodCallException
+     */
+    public function __construct()
+    {
+        throw new BadMethodCallException('Unsupported constructor.');
+    }
+
+    /**
+     * @param ReflectionClass $originalClass
+     * @param bool            $allowInterfaces
+     *
+     * @throws InvalidProxiedClassException
+     */
+    public static function assertClassCanBeProxied(ReflectionClass $originalClass, $allowInterfaces = true)
+    {
+        self::isNotFinal($originalClass);
+        self::hasNoAbstractProtectedMethods($originalClass);
+
+        if (! $allowInterfaces) {
+            self::isNotInterface($originalClass);
+        }
+    }
+
+    /**
+     * @param ReflectionClass $originalClass
+     *
+     * @throws InvalidProxiedClassException
+     */
+    private static function isNotFinal(ReflectionClass $originalClass)
+    {
+        if ($originalClass->isFinal()) {
+            throw InvalidProxiedClassException::finalClassNotSupported($originalClass);
+        }
+    }
+
+    /**
+     * @param ReflectionClass $originalClass
+     *
+     * @throws InvalidProxiedClassException
+     */
+    private static function hasNoAbstractProtectedMethods(ReflectionClass $originalClass)
+    {
+        $protectedAbstract = array_filter(
+            $originalClass->getMethods(),
+            function (ReflectionMethod $method) {
+                return $method->isAbstract() && $method->isProtected();
+            }
+        );
+
+        if ($protectedAbstract) {
+            throw InvalidProxiedClassException::abstractProtectedMethodsNotSupported($originalClass);
+        }
+    }
+
+    /**
+     * @param ReflectionClass $originalClass
+     *
+     * @throws InvalidProxiedClassException
+     */
+    private static function isNotInterface(ReflectionClass $originalClass)
+    {
+        if ($originalClass->isInterface()) {
+            throw InvalidProxiedClassException::interfaceNotSupported($originalClass);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoading/MethodGenerator/Constructor.php
@@ -0,0 +1,58 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoading\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ReflectionClass;
+use ReflectionProperty;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * The `__construct` implementation for lazy loading proxies
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class Constructor extends MethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(ReflectionClass $originalClass, PropertyGenerator $initializerProperty)
+    {
+        parent::__construct('__construct');
+
+        $this->setParameter(new ParameterGenerator('initializer'));
+
+        /* @var $publicProperties \ReflectionProperty[] */
+        $publicProperties = $originalClass->getProperties(ReflectionProperty::IS_PUBLIC);
+        $unsetProperties  = array();
+
+        foreach ($publicProperties as $publicProperty) {
+            $unsetProperties[] = '$this->' . $publicProperty->getName();
+        }
+
+        $this->setDocblock("@override constructor for lazy initialization\n\n@param \\Closure|null \$initializer");
+        $this->setBody(
+            ($unsetProperties ? 'unset(' . implode(', ', $unsetProperties) . ");\n\n" : '')
+            . '$this->' . $initializerProperty->getName() . ' = $initializer;'
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/CallInitializer.php
@@ -0,0 +1,67 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Implementation for {@see \ProxyManager\Proxy\LazyLoadingInterface::isProxyInitialized}
+ * for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class CallInitializer extends MethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        PropertyGenerator $initializerProperty,
+        PropertyGenerator $publicPropsDefaults,
+        PropertyGenerator $initTracker
+    ) {
+        parent::__construct(UniqueIdentifierGenerator::getIdentifier('callInitializer'));
+        $this->setDocblock("Triggers initialization logic for this ghost object");
+
+        $this->setParameters(array(
+            new ParameterGenerator('methodName'),
+            new ParameterGenerator('parameters', 'array'),
+        ));
+
+        $this->setVisibility(static::VISIBILITY_PRIVATE);
+
+        $initializer    = $initializerProperty->getName();
+        $initialization = $initTracker->getName();
+
+        $this->setBody(
+            'if ($this->' . $initialization . ' || ! $this->' . $initializer . ') {' . "\n    return;\n}\n\n"
+            . "\$this->" . $initialization . " = true;\n\n"
+            . "foreach (self::\$" . $publicPropsDefaults->getName() . " as \$key => \$default) {\n"
+            . "    \$this->\$key = \$default;\n"
+            . "}\n\n"
+            . '$this->' . $initializer . '->__invoke'
+            . '($this, $methodName, $parameters, $this->' . $initializer . ');' . "\n\n"
+            . "\$this->" . $initialization . " = false;"
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/GetProxyInitializer.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Implementation for {@see \ProxyManager\Proxy\LazyLoadingInterface::getProxyInitializer}
+ * for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class GetProxyInitializer extends MethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(PropertyGenerator $initializerProperty)
+    {
+        parent::__construct('getProxyInitializer');
+        $this->setDocblock('{@inheritDoc}');
+        $this->setBody('return $this->' . $initializerProperty->getName() . ';');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/InitializeProxy.php
@@ -0,0 +1,47 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use Zend\Code\Generator\MethodGenerator as ZendMethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Implementation for {@see \ProxyManager\Proxy\LazyLoadingInterface::initializeProxy}
+ * for lazy loading ghost objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class InitializeProxy extends MethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(PropertyGenerator $initializerProperty, ZendMethodGenerator $callInitializer)
+    {
+        parent::__construct('initializeProxy');
+        $this->setDocblock('{@inheritDoc}');
+
+        $this->setBody(
+            'return $this->' . $initializerProperty->getName() . ' && $this->' . $callInitializer->getName()
+            . '(\'initializeProxy\', array());'
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/IsProxyInitialized.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Implementation for {@see \ProxyManager\Proxy\LazyLoadingInterface::isProxyInitialized}
+ * for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class IsProxyInitialized extends MethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(PropertyGenerator $initializerProperty)
+    {
+        parent::__construct('isProxyInitialized');
+        $this->setDocblock('{@inheritDoc}');
+        $this->setBody('return ! $this->' . $initializerProperty->getName() . ';');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/LazyLoadingMethodInterceptor.php
@@ -0,0 +1,71 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use Zend\Code\Generator\MethodGenerator as ZendMethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Method decorator for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class LazyLoadingMethodInterceptor extends MethodGenerator
+{
+    /**
+     * @param \Zend\Code\Reflection\MethodReflection $originalMethod
+     * @param \Zend\Code\Generator\PropertyGenerator $initializerProperty
+     * @param \Zend\Code\Generator\MethodGenerator   $callInitializer
+     *
+     * @return LazyLoadingMethodInterceptor|static
+     */
+    public static function generateMethod(
+        MethodReflection $originalMethod,
+        PropertyGenerator $initializerProperty,
+        ZendMethodGenerator $callInitializer
+    ) {
+        /* @var $method self */
+        $method            = static::fromReflection($originalMethod);
+        $parameters        = $originalMethod->getParameters();
+        $methodName        = $originalMethod->getName();
+        $initializerParams = array();
+        $forwardedParams   = array();
+
+        foreach ($parameters as $parameter) {
+            $parameterName       = $parameter->getName();
+            $initializerParams[] = var_export($parameterName, true) . ' => $' . $parameterName;
+            $forwardedParams[]   = '$' . $parameterName;
+        }
+
+        $method->setBody(
+            '$this->' . $initializerProperty->getName()
+            . ' && $this->' . $callInitializer->getName()
+            . '(' . var_export($methodName, true)
+            . ', array(' . implode(', ', $initializerParams) .  "));\n\n"
+            . 'return parent::'
+            . $methodName . '(' . implode(', ', $forwardedParams) . ');'
+        );
+        $method->setDocblock('{@inheritDoc}');
+
+        return $method;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicClone.php
@@ -0,0 +1,50 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ReflectionClass;
+use Zend\Code\Generator\MethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__clone` for lazy loading ghost objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicClone extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $initializerProperty,
+        MethodGenerator $callInitializer
+    ) {
+        parent::__construct($originalClass, '__clone');
+
+        $this->setBody(
+            '$this->' . $initializerProperty->getName() . ' && $this->' . $callInitializer->getName()
+            . '(\'__clone\', array());'
+            . ($originalClass->hasMethod('__clone') ? "\n\nparent::__clone();" : '')
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicGet.php
@@ -0,0 +1,77 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use ReflectionClass;
+use Zend\Code\Generator\MethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__get` for lazy loading ghost objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicGet extends MagicMethodGenerator
+{
+    /**
+     * @param \ReflectionClass                                                   $originalClass
+     * @param \Zend\Code\Generator\PropertyGenerator                             $initializerProperty
+     * @param \Zend\Code\Generator\MethodGenerator                               $callInitializer
+     * @param \ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap $publicProperties
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $initializerProperty,
+        MethodGenerator $callInitializer,
+        PublicPropertiesMap $publicProperties
+    ) {
+        parent::__construct($originalClass, '__get', array(new ParameterGenerator('name')));
+
+        $override   = $originalClass->hasMethod('__get');
+        $callParent = '';
+
+        $this->setDocblock(($override ? "{@inheritDoc}\n" : '') . '@param string $name');
+
+        if (! $publicProperties->isEmpty()) {
+            $callParent = 'if (isset(self::$' . $publicProperties->getName() . "[\$name])) {\n"
+                . '    return $this->$name;'
+                . "\n}\n\n";
+        }
+
+        if ($override) {
+            $callParent .= 'return parent::__get($name);';
+        } else {
+            $callParent .= PublicScopeSimulator::getPublicAccessSimulationCode(
+                PublicScopeSimulator::OPERATION_GET,
+                'name'
+            );
+        }
+
+        $this->setBody(
+            '$this->' . $initializerProperty->getName() . ' && $this->' . $callInitializer->getName()
+            . '(\'__get\', array(\'name\' => $name));'
+            . "\n\n" . $callParent
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicIsset.php
@@ -0,0 +1,77 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use ReflectionClass;
+use Zend\Code\Generator\MethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__isset` method for lazy loading ghost objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicIsset extends MagicMethodGenerator
+{
+    /**
+     * @param \ReflectionClass                                                   $originalClass
+     * @param \Zend\Code\Generator\PropertyGenerator                             $initializerProperty
+     * @param \Zend\Code\Generator\MethodGenerator                               $callInitializer
+     * @param \ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap $publicProperties
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $initializerProperty,
+        MethodGenerator $callInitializer,
+        PublicPropertiesMap $publicProperties
+    ) {
+        parent::__construct($originalClass, '__isset', array(new ParameterGenerator('name')));
+
+        $override   = $originalClass->hasMethod('__isset');
+        $callParent = '';
+
+        $this->setDocblock(($override ? "{@inheritDoc}\n" : '') . '@param string $name');
+
+        if (! $publicProperties->isEmpty()) {
+            $callParent = 'if (isset(self::$' . $publicProperties->getName() . "[\$name])) {\n"
+                . '    return isset($this->$name);'
+                . "\n}\n\n";
+        }
+
+        if ($override) {
+            $callParent .= 'return parent::__isset($name);';
+        } else {
+            $callParent .= PublicScopeSimulator::getPublicAccessSimulationCode(
+                PublicScopeSimulator::OPERATION_ISSET,
+                'name'
+            );
+        }
+
+        $this->setBody(
+            '$this->' . $initializerProperty->getName() . ' && $this->' . $callInitializer->getName()
+            . '(\'__isset\', array(\'name\' => $name));'
+            . "\n\n" . $callParent
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicSet.php
@@ -0,0 +1,81 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use ReflectionClass;
+use Zend\Code\Generator\MethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__set` for lazy loading ghost objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicSet extends MagicMethodGenerator
+{
+    /**
+     * @param \ReflectionClass                                                   $originalClass
+     * @param \Zend\Code\Generator\PropertyGenerator                             $initializerProperty
+     * @param \Zend\Code\Generator\MethodGenerator                               $callInitializer
+     * @param \ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap $publicProperties
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $initializerProperty,
+        MethodGenerator $callInitializer,
+        PublicPropertiesMap $publicProperties
+    ) {
+        parent::__construct(
+            $originalClass,
+            '__set',
+            array(new ParameterGenerator('name'), new ParameterGenerator('value'))
+        );
+
+        $override   = $originalClass->hasMethod('__set');
+        $callParent = '';
+
+        $this->setDocblock(($override ? "{@inheritDoc}\n" : '') . '@param string $name');
+
+        if (! $publicProperties->isEmpty()) {
+            $callParent = 'if (isset(self::$' . $publicProperties->getName() . "[\$name])) {\n"
+                . '    return ($this->$name = $value);'
+                . "\n}\n\n";
+        }
+
+        if ($override) {
+            $callParent .= 'return parent::__set($name, $value);';
+        } else {
+            $callParent .= PublicScopeSimulator::getPublicAccessSimulationCode(
+                PublicScopeSimulator::OPERATION_SET,
+                'name',
+                'value'
+            );
+        }
+
+        $this->setBody(
+            '$this->' . $initializerProperty->getName() . ' && $this->' . $callInitializer->getName()
+            . '(\'__set\', array(\'name\' => $name, \'value\' => $value));' . "\n\n" . $callParent
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicSleep.php
@@ -0,0 +1,50 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ReflectionClass;
+use Zend\Code\Generator\MethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__sleep` for lazy loading ghost objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicSleep extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $initializerProperty,
+        MethodGenerator $callInitializer
+    ) {
+        parent::__construct($originalClass, '__sleep');
+
+        $this->setBody(
+            '$this->' . $initializerProperty->getName() . ' && $this->' . $callInitializer->getName()
+            . '(\'__sleep\', array());' . "\n\n"
+            . ($originalClass->hasMethod('__sleep') ? 'return parent::__sleep();' : 'return array_keys((array) $this);')
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicUnset.php
@@ -0,0 +1,78 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use ReflectionClass;
+use Zend\Code\Generator\MethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__unset` method for lazy loading ghost objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicUnset extends MagicMethodGenerator
+{
+    /**
+     * @param \ReflectionClass                                                   $originalClass
+     * @param \Zend\Code\Generator\PropertyGenerator                             $initializerProperty
+     * @param \Zend\Code\Generator\MethodGenerator                               $callInitializer
+     * @param \ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap $publicProperties
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $initializerProperty,
+        MethodGenerator $callInitializer,
+        PublicPropertiesMap $publicProperties
+    ) {
+        parent::__construct($originalClass, '__unset', array(new ParameterGenerator('name')));
+
+        $override   = $originalClass->hasMethod('__unset');
+        $callParent = '';
+
+        $this->setDocblock(($override ? "{@inheritDoc}\n" : '') . '@param string $name');
+
+        if (! $publicProperties->isEmpty()) {
+            $callParent = 'if (isset(self::$' . $publicProperties->getName() . "[\$name])) {\n"
+                . '    unset($this->$name);'
+                . "\n\n    return;"
+                . "\n}\n\n";
+        }
+
+        if ($override) {
+            $callParent .= "return parent::__unset(\$name);";
+        } else {
+            $callParent .= PublicScopeSimulator::getPublicAccessSimulationCode(
+                PublicScopeSimulator::OPERATION_UNSET,
+                'name'
+            );
+        }
+
+        $this->setBody(
+            '$this->' . $initializerProperty->getName() . ' && $this->' . $callInitializer->getName()
+            . '(\'__unset\', array(\'name\' => $name));'
+            . "\n\n" . $callParent
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/MethodGenerator/SetProxyInitializer.php
@@ -0,0 +1,49 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Implementation for {@see \ProxyManager\Proxy\LazyLoadingInterface::setProxyInitializer}
+ * for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class SetProxyInitializer extends MethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(PropertyGenerator $initializerProperty)
+    {
+        parent::__construct('setProxyInitializer');
+
+        $initializerParameter = new ParameterGenerator('initializer');
+
+        $initializerParameter->setType('Closure');
+        $initializerParameter->setDefaultValue(null);
+        $this->setParameter($initializerParameter);
+        $this->setDocblock('{@inheritDoc}');
+        $this->setBody('$this->' . $initializerProperty->getName() . ' = $initializer;');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/InitializationTracker.php
@@ -0,0 +1,43 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator;
+
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Property that contains the initializer for a lazy object
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class InitializationTracker extends PropertyGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct(UniqueIdentifierGenerator::getIdentifier('initializationTracker'));
+
+        $this->setVisibility(self::VISIBILITY_PRIVATE);
+        $this->setDocblock('@var bool tracks initialization status - true while the object is initializing');
+        $this->setDefaultValue(false);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/InitializerProperty.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator;
+
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Property that contains the initializer for a lazy object
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class InitializerProperty extends PropertyGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct(UniqueIdentifierGenerator::getIdentifier('initializer'));
+
+        $this->setVisibility(self::VISIBILITY_PRIVATE);
+        $this->setDocblock('@var \\Closure|null initializer responsible for generating the wrapped object');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingGhostGenerator.php
@@ -0,0 +1,114 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator;
+
+use ProxyManager\Generator\Util\ClassGeneratorUtils;
+use ProxyManager\ProxyGenerator\Assertion\CanProxyAssertion;
+use ProxyManager\ProxyGenerator\LazyLoading\MethodGenerator\Constructor;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\CallInitializer;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\GetProxyInitializer;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\InitializeProxy;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\IsProxyInitialized;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\LazyLoadingMethodInterceptor;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicClone;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicGet;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicIsset;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicSet;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicSleep;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicUnset;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\SetProxyInitializer;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\InitializationTracker;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\InitializerProperty;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesDefaults;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
+use ProxyManager\ProxyGenerator\Util\ProxiedMethodsFilter;
+use ReflectionClass;
+use ReflectionMethod;
+use Zend\Code\Generator\ClassGenerator;
+use Zend\Code\Generator\MethodGenerator;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Generator for proxies implementing {@see \ProxyManager\Proxy\GhostObjectInterface}
+ *
+ * {@inheritDoc}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class LazyLoadingGhostGenerator implements ProxyGeneratorInterface
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function generate(ReflectionClass $originalClass, ClassGenerator $classGenerator)
+    {
+        CanProxyAssertion::assertClassCanBeProxied($originalClass);
+
+        $interfaces          = array('ProxyManager\\Proxy\\GhostObjectInterface');
+        $publicProperties    = new PublicPropertiesMap($originalClass);
+        $publicPropsDefaults = new PublicPropertiesDefaults($originalClass);
+
+        if ($originalClass->isInterface()) {
+            $interfaces[] = $originalClass->getName();
+        } else {
+            $classGenerator->setExtendedClass($originalClass->getName());
+        }
+
+        $classGenerator->setImplementedInterfaces($interfaces);
+        $classGenerator->addPropertyFromGenerator($initializer = new InitializerProperty());
+        $classGenerator->addPropertyFromGenerator($initializationTracker = new InitializationTracker());
+        $classGenerator->addPropertyFromGenerator($publicProperties);
+        $classGenerator->addPropertyFromGenerator($publicPropsDefaults);
+
+        $init = new CallInitializer($initializer, $publicPropsDefaults, $initializationTracker);
+
+        array_map(
+            function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator) {
+                ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod);
+            },
+            array_merge(
+                array_map(
+                    function (ReflectionMethod $method) use ($initializer, $init) {
+                        return LazyLoadingMethodInterceptor::generateMethod(
+                            new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()),
+                            $initializer,
+                            $init
+                        );
+                    },
+                    ProxiedMethodsFilter::getProxiedMethods($originalClass)
+                ),
+                array(
+                    $init,
+                    new Constructor($originalClass, $initializer),
+                    new MagicGet($originalClass, $initializer, $init, $publicProperties),
+                    new MagicSet($originalClass, $initializer, $init, $publicProperties),
+                    new MagicIsset($originalClass, $initializer, $init, $publicProperties),
+                    new MagicUnset($originalClass, $initializer, $init, $publicProperties),
+                    new MagicClone($originalClass, $initializer, $init, $publicProperties),
+                    new MagicSleep($originalClass, $initializer, $init, $publicProperties),
+                    new SetProxyInitializer($initializer),
+                    new GetProxyInitializer($initializer),
+                    new InitializeProxy($initializer, $init),
+                    new IsProxyInitialized($initializer),
+                )
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/GetProxyInitializer.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Implementation for {@see \ProxyManager\Proxy\LazyLoadingInterface::getProxyInitializer}
+ * for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class GetProxyInitializer extends MethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(PropertyGenerator $initializerProperty)
+    {
+        parent::__construct('getProxyInitializer');
+        $this->setDocblock('{@inheritDoc}');
+        $this->setBody('return $this->' . $initializerProperty->getName() . ';');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/InitializeProxy.php
@@ -0,0 +1,49 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Implementation for {@see \ProxyManager\Proxy\LazyLoadingInterface::initializeProxy}
+ * for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class InitializeProxy extends MethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(PropertyGenerator $initializerProperty, PropertyGenerator $valueHolderProperty)
+    {
+        parent::__construct('initializeProxy');
+        $this->setDocblock('{@inheritDoc}');
+
+        $initializer = $initializerProperty->getName();
+
+        $this->setBody(
+            'return $this->' . $initializer . ' && $this->' . $initializer
+            . '->__invoke($this->' . $valueHolderProperty->getName()
+            . ', $this, \'initializeProxy\', array(), $this->' . $initializer . ');'
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/IsProxyInitialized.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Implementation for {@see \ProxyManager\Proxy\LazyLoadingInterface::isProxyInitialized}
+ * for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class IsProxyInitialized extends MethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(PropertyGenerator $valueHolderProperty)
+    {
+        parent::__construct('isProxyInitialized');
+        $this->setDocblock('{@inheritDoc}');
+        $this->setBody('return null !== $this->' . $valueHolderProperty->getName() . ';');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/LazyLoadingMethodInterceptor.php
@@ -0,0 +1,72 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Method decorator for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class LazyLoadingMethodInterceptor extends MethodGenerator
+{
+    /**
+     * @param \Zend\Code\Reflection\MethodReflection $originalMethod
+     * @param \Zend\Code\Generator\PropertyGenerator $initializerProperty
+     * @param \Zend\Code\Generator\PropertyGenerator $valueHolderProperty
+     *
+     * @return LazyLoadingMethodInterceptor|static
+     */
+    public static function generateMethod(
+        MethodReflection $originalMethod,
+        PropertyGenerator $initializerProperty,
+        PropertyGenerator $valueHolderProperty
+    ) {
+        /* @var $method self */
+        $method            = static::fromReflection($originalMethod);
+        $initializerName   = $initializerProperty->getName();
+        $valueHolderName   = $valueHolderProperty->getName();
+        $parameters        = $originalMethod->getParameters();
+        $methodName        = $originalMethod->getName();
+        $initializerParams = array();
+        $forwardedParams   = array();
+
+        foreach ($parameters as $parameter) {
+            $parameterName       = $parameter->getName();
+            $initializerParams[] = var_export($parameterName, true) . ' => $' . $parameterName;
+            $forwardedParams[]   = '$' . $parameterName;
+        }
+
+        $method->setBody(
+            '$this->' . $initializerName
+            . ' && $this->' . $initializerName
+            . '->__invoke($this->' . $valueHolderName . ', $this, ' . var_export($methodName, true)
+            . ', array(' . implode(', ', $initializerParams) .  '), $this->' . $initializerName . ");\n\n"
+            . 'return $this->' . $valueHolderName . '->'
+            . $methodName . '(' . implode(', ', $forwardedParams) . ');'
+        );
+        $method->setDocblock('{@inheritDoc}');
+
+        return $method;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicClone.php
@@ -0,0 +1,53 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__clone` for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicClone extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $initializerProperty,
+        PropertyGenerator $valueHolderProperty
+    ) {
+        parent::__construct($originalClass, '__clone');
+
+        $initializer = $initializerProperty->getName();
+        $valueHolder = $valueHolderProperty->getName();
+
+        $this->setBody(
+            '$this->' . $initializer . ' && $this->' . $initializer
+            . '->__invoke($this->' . $valueHolder
+            . ', $this, \'__clone\', array(), $this->' . $initializer . ');' . "\n\n"
+            . '$this->' . $valueHolder . ' = clone $this->' . $valueHolder . ';'
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicGet.php
@@ -0,0 +1,69 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__get` for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicGet extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $initializerProperty,
+        PropertyGenerator $valueHolderProperty,
+        PublicPropertiesMap $publicProperties
+    ) {
+        parent::__construct($originalClass, '__get', array(new ParameterGenerator('name')));
+
+        $this->setDocblock(($originalClass->hasMethod('__get') ? "{@inheritDoc}\n" : '') . '@param string $name');
+
+        $initializer = $initializerProperty->getName();
+        $valueHolder = $valueHolderProperty->getName();
+        $callParent  = 'if (isset(self::$' . $publicProperties->getName() . "[\$name])) {\n"
+            . '    return $this->' . $valueHolder . '->$name;'
+            . "\n}\n\n";
+
+        $callParent .= PublicScopeSimulator::getPublicAccessSimulationCode(
+            PublicScopeSimulator::OPERATION_GET,
+            'name',
+            null,
+            $valueHolderProperty
+        );
+
+        $this->setBody(
+            '$this->' . $initializer . ' && $this->' . $initializer
+            . '->__invoke($this->' . $valueHolder . ', $this, \'__get\', array(\'name\' => $name), $this->'
+            . $initializer . ');'
+            . "\n\n" . $callParent
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicIsset.php
@@ -0,0 +1,72 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__isset` method for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicIsset extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $initializerProperty,
+        PropertyGenerator $valueHolderProperty,
+        PublicPropertiesMap $publicProperties
+    ) {
+        parent::__construct($originalClass, '__isset', array(new ParameterGenerator('name')));
+
+        $initializer = $initializerProperty->getName();
+        $valueHolder = $valueHolderProperty->getName();
+        $callParent  = '';
+
+        $this->setDocblock(($originalClass->hasMethod('__isset') ? "{@inheritDoc}\n" : '') . '@param string $name');
+
+        if (! $publicProperties->isEmpty()) {
+            $callParent = 'if (isset(self::$' . $publicProperties->getName() . "[\$name])) {\n"
+                . '    return isset($this->' . $valueHolder . '->$name);'
+                . "\n}\n\n";
+        }
+
+        $callParent .= PublicScopeSimulator::getPublicAccessSimulationCode(
+            PublicScopeSimulator::OPERATION_ISSET,
+            'name',
+            null,
+            $valueHolderProperty
+        );
+
+        $this->setBody(
+            '$this->' . $initializer . ' && $this->' . $initializer
+            . '->__invoke($this->' . $valueHolder . ', $this, \'__isset\', array(\'name\' => $name), $this->'
+            . $initializer . ');' . "\n\n" . $callParent
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicSet.php
@@ -0,0 +1,79 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__set` for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicSet extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $initializerProperty,
+        PropertyGenerator $valueHolderProperty,
+        PublicPropertiesMap $publicProperties
+    ) {
+        parent::__construct(
+            $originalClass,
+            '__set',
+            array(new ParameterGenerator('name'), new ParameterGenerator('value'))
+        );
+
+        $initializer = $initializerProperty->getName();
+        $valueHolder = $valueHolderProperty->getName();
+        $callParent  = '';
+
+        $this->setDocblock(
+            ($originalClass->hasMethod('__set') ? "{@inheritDoc}\n" : '') . "@param string \$name\n@param mixed \$value"
+        );
+
+        if (! $publicProperties->isEmpty()) {
+            $callParent = 'if (isset(self::$' . $publicProperties->getName() . "[\$name])) {\n"
+                . '    return ($this->' . $valueHolder . '->$name = $value);'
+                . "\n}\n\n";
+        }
+
+        $callParent .= PublicScopeSimulator::getPublicAccessSimulationCode(
+            PublicScopeSimulator::OPERATION_SET,
+            'name',
+            'value',
+            $valueHolderProperty
+        );
+
+        $this->setBody(
+            '$this->' . $initializer . ' && $this->' . $initializer
+            . '->__invoke($this->' . $valueHolder . ', $this, '
+            . '\'__set\', array(\'name\' => $name, \'value\' => $value), $this->' . $initializer . ');'
+            . "\n\n" . $callParent
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicSleep.php
@@ -0,0 +1,53 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__sleep` for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicSleep extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $initializerProperty,
+        PropertyGenerator $valueHolderProperty
+    ) {
+        parent::__construct($originalClass, '__sleep');
+
+        $initializer = $initializerProperty->getName();
+        $valueHolder = $valueHolderProperty->getName();
+
+        $this->setBody(
+            '$this->' . $initializer . ' && $this->' . $initializer
+            . '->__invoke($this->' . $valueHolder . ', $this, \'__sleep\', array(), $this->'
+            . $initializer . ');' . "\n\n"
+            . 'return array(' . var_export($valueHolder, true) . ');'
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicUnset.php
@@ -0,0 +1,72 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__unset` method for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicUnset extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(
+        ReflectionClass $originalClass,
+        PropertyGenerator $initializerProperty,
+        PropertyGenerator $valueHolderProperty,
+        PublicPropertiesMap $publicProperties
+    ) {
+        parent::__construct($originalClass, '__unset', array(new ParameterGenerator('name')));
+
+        $initializer = $initializerProperty->getName();
+        $valueHolder = $valueHolderProperty->getName();
+        $callParent  = '';
+
+        $this->setDocblock(($originalClass->hasMethod('__isset') ? "{@inheritDoc}\n" : '') . '@param string $name');
+
+        if (! $publicProperties->isEmpty()) {
+            $callParent = 'if (isset(self::$' . $publicProperties->getName() . "[\$name])) {\n"
+                . '    unset($this->' . $valueHolder . '->$name);' . "\n\n    return;"
+                . "\n}\n\n";
+        }
+
+        $callParent .= PublicScopeSimulator::getPublicAccessSimulationCode(
+            PublicScopeSimulator::OPERATION_UNSET,
+            'name',
+            null,
+            $valueHolderProperty
+        );
+
+        $this->setBody(
+            '$this->' . $initializer . ' && $this->' . $initializer
+            . '->__invoke($this->' . $valueHolder . ', $this, \'__unset\', array(\'name\' => $name), $this->'
+            . $initializer . ');' . "\n\n" . $callParent
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/SetProxyInitializer.php
@@ -0,0 +1,49 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Implementation for {@see \ProxyManager\Proxy\LazyLoadingInterface::setProxyInitializer}
+ * for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class SetProxyInitializer extends MethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(PropertyGenerator $initializerProperty)
+    {
+        parent::__construct('setProxyInitializer');
+
+        $initializerParameter = new ParameterGenerator('initializer');
+
+        $initializerParameter->setType('Closure');
+        $initializerParameter->setDefaultValue(null);
+        $this->setParameter($initializerParameter);
+        $this->setDocblock('{@inheritDoc}');
+        $this->setBody('$this->' . $initializerProperty->getName() . ' = $initializer;');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/PropertyGenerator/InitializerProperty.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator;
+
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Property that contains the initializer for a lazy object
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class InitializerProperty extends PropertyGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct(UniqueIdentifierGenerator::getIdentifier('initializer'));
+
+        $this->setVisibility(self::VISIBILITY_PRIVATE);
+        $this->setDocblock('@var \\Closure|null initializer responsible for generating the wrapped object');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolder/PropertyGenerator/ValueHolderProperty.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator;
+
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Property that contains the wrapped value of a lazy loading proxy
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class ValueHolderProperty extends PropertyGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct(UniqueIdentifierGenerator::getIdentifier('valueHolder'));
+
+        $this->setVisibility(self::VISIBILITY_PRIVATE);
+        $this->setDocblock('@var \\Closure|null initializer responsible for generating the wrapped object');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/LazyLoadingValueHolderGenerator.php
@@ -0,0 +1,111 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator;
+
+use ProxyManager\Generator\Util\ClassGeneratorUtils;
+use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\MagicWakeup;
+use ProxyManager\ProxyGenerator\Assertion\CanProxyAssertion;
+use ProxyManager\ProxyGenerator\LazyLoading\MethodGenerator\Constructor;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\GetProxyInitializer;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\InitializeProxy;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\IsProxyInitialized;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\LazyLoadingMethodInterceptor;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicClone;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicGet;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicIsset;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicSet;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicSleep;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicUnset;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\SetProxyInitializer;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\InitializerProperty;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\ValueHolderProperty;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
+use ProxyManager\ProxyGenerator\Util\ProxiedMethodsFilter;
+use ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\GetWrappedValueHolderValue;
+use ReflectionClass;
+use ReflectionMethod;
+use Zend\Code\Generator\ClassGenerator;
+use Zend\Code\Generator\MethodGenerator;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Generator for proxies implementing {@see \ProxyManager\Proxy\VirtualProxyInterface}
+ *
+ * {@inheritDoc}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class LazyLoadingValueHolderGenerator implements ProxyGeneratorInterface
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function generate(ReflectionClass $originalClass, ClassGenerator $classGenerator)
+    {
+        CanProxyAssertion::assertClassCanBeProxied($originalClass);
+
+        $interfaces          = array('ProxyManager\\Proxy\\VirtualProxyInterface');
+        $publicProperties    = new PublicPropertiesMap($originalClass);
+
+        if ($originalClass->isInterface()) {
+            $interfaces[] = $originalClass->getName();
+        } else {
+            $classGenerator->setExtendedClass($originalClass->getName());
+        }
+
+        $classGenerator->setImplementedInterfaces($interfaces);
+        $classGenerator->addPropertyFromGenerator($valueHolder = new ValueHolderProperty());
+        $classGenerator->addPropertyFromGenerator($initializer = new InitializerProperty());
+        $classGenerator->addPropertyFromGenerator($publicProperties);
+
+        array_map(
+            function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator) {
+                ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod);
+            },
+            array_merge(
+                array_map(
+                    function (ReflectionMethod $method) use ($initializer, $valueHolder) {
+                        return LazyLoadingMethodInterceptor::generateMethod(
+                            new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()),
+                            $initializer,
+                            $valueHolder
+                        );
+                    },
+                    ProxiedMethodsFilter::getProxiedMethods($originalClass)
+                ),
+                array(
+                    new Constructor($originalClass, $initializer),
+                    new MagicGet($originalClass, $initializer, $valueHolder, $publicProperties),
+                    new MagicSet($originalClass, $initializer, $valueHolder, $publicProperties),
+                    new MagicIsset($originalClass, $initializer, $valueHolder, $publicProperties),
+                    new MagicUnset($originalClass, $initializer, $valueHolder, $publicProperties),
+                    new MagicClone($originalClass, $initializer, $valueHolder),
+                    new MagicSleep($originalClass, $initializer, $valueHolder),
+                    new MagicWakeup($originalClass),
+                    new SetProxyInitializer($initializer),
+                    new GetProxyInitializer($initializer),
+                    new InitializeProxy($initializer, $valueHolder),
+                    new IsProxyInitialized($valueHolder),
+                    new GetWrappedValueHolderValue($valueHolder),
+                )
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/NullObject/MethodGenerator/Constructor.php
@@ -0,0 +1,55 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\NullObject\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use ReflectionClass;
+use ReflectionProperty;
+
+/**
+ * The `__construct` implementation for null object proxies
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class Constructor extends MethodGenerator
+{
+    /**
+     * Constructor
+     *
+     * @param ReflectionClass $originalClass Reflection of the class to proxy
+     */
+    public function __construct(ReflectionClass $originalClass)
+    {
+        parent::__construct('__construct');
+
+        /* @var $publicProperties \ReflectionProperty[] */
+        $publicProperties = $originalClass->getProperties(ReflectionProperty::IS_PUBLIC);
+        $nullableProperties  = array();
+
+        foreach ($publicProperties as $publicProperty) {
+            $nullableProperties[] = '$this->' . $publicProperty->getName() . ' = null;';
+        }
+
+        $this->setDocblock("@override constructor for null object initialization");
+        if ($nullableProperties) {
+                $this->setBody(implode("\n", $nullableProperties));
+        }
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/NullObject/MethodGenerator/NullObjectMethodInterceptor.php
@@ -0,0 +1,53 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\NullObject\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Method decorator for null objects
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class NullObjectMethodInterceptor extends MethodGenerator
+{
+    /**
+     * @param \Zend\Code\Reflection\MethodReflection $originalMethod
+     *
+     * @return NullObjectMethodInterceptor|static
+     */
+    public static function generateMethod(MethodReflection $originalMethod)
+    {
+        /* @var $method self */
+        $method = static::fromReflection($originalMethod);
+
+        if ($originalMethod->returnsReference()) {
+            $reference = UniqueIdentifierGenerator::getIdentifier('ref');
+
+            $method->setBody("\$$reference = null;\nreturn \$$reference;");
+        } else {
+            $method->setBody('');
+        }
+
+        return $method;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/NullObjectGenerator.php
@@ -0,0 +1,65 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator;
+
+use ProxyManager\Generator\Util\ClassGeneratorUtils;
+use ProxyManager\ProxyGenerator\Assertion\CanProxyAssertion;
+use ProxyManager\ProxyGenerator\NullObject\MethodGenerator\Constructor;
+use ProxyManager\ProxyGenerator\NullObject\MethodGenerator\NullObjectMethodInterceptor;
+use ProxyManager\ProxyGenerator\Util\ProxiedMethodsFilter;
+use ReflectionClass;
+use Zend\Code\Generator\ClassGenerator;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Generator for proxies implementing {@see \ProxyManager\Proxy\NullObjectInterface}
+ *
+ * {@inheritDoc}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class NullObjectGenerator implements ProxyGeneratorInterface
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function generate(ReflectionClass $originalClass, ClassGenerator $classGenerator)
+    {
+        CanProxyAssertion::assertClassCanBeProxied($originalClass);
+
+        $interfaces = array('ProxyManager\\Proxy\\NullObjectInterface');
+
+        if ($originalClass->isInterface()) {
+            $interfaces[] = $originalClass->getName();
+        }
+
+        $classGenerator->setImplementedInterfaces($interfaces);
+
+        foreach (ProxiedMethodsFilter::getProxiedMethods($originalClass) as $method) {
+            $classGenerator->addMethodFromGenerator(
+                NullObjectMethodInterceptor::generateMethod(
+                    new MethodReflection($method->getDeclaringClass()->getName(), $method->getName())
+                )
+            );
+        }
+
+        ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, new Constructor($originalClass));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/PropertyGenerator/PublicPropertiesDefaults.php
@@ -0,0 +1,58 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\PropertyGenerator;
+
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use ReflectionClass;
+use ReflectionProperty;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Map of public properties that exist in the class being proxied
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class PublicPropertiesDefaults extends PropertyGenerator
+{
+    /**
+     * @var bool[]
+     */
+    private $publicProperties = array();
+
+    /**
+     * @param \ReflectionClass $originalClass
+     */
+    public function __construct(ReflectionClass $originalClass)
+    {
+        parent::__construct(UniqueIdentifierGenerator::getIdentifier('publicPropertiesDefaults'));
+
+        $defaults = $originalClass->getDefaultProperties();
+
+        foreach ($originalClass->getProperties(ReflectionProperty::IS_PUBLIC) as $publicProperty) {
+            $name                          = $publicProperty->getName();
+            $this->publicProperties[$name] = $defaults[$name];
+        }
+
+        $this->setDefaultValue($this->publicProperties);
+        $this->setVisibility(self::VISIBILITY_PRIVATE);
+        $this->setStatic(true);
+        $this->setDocblock('@var mixed[] map of default property values of the parent class');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/PropertyGenerator/PublicPropertiesMap.php
@@ -0,0 +1,63 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\PropertyGenerator;
+
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use ReflectionClass;
+use ReflectionProperty;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Map of public properties that exist in the class being proxied
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class PublicPropertiesMap extends PropertyGenerator
+{
+    /**
+     * @var bool[]
+     */
+    private $publicProperties = array();
+
+    /**
+     * @param \ReflectionClass $originalClass
+     */
+    public function __construct(ReflectionClass $originalClass)
+    {
+        parent::__construct(UniqueIdentifierGenerator::getIdentifier('publicProperties'));
+
+        foreach ($originalClass->getProperties(ReflectionProperty::IS_PUBLIC) as $publicProperty) {
+            $this->publicProperties[$publicProperty->getName()] = true;
+        }
+
+        $this->setDefaultValue($this->publicProperties);
+        $this->setVisibility(self::VISIBILITY_PRIVATE);
+        $this->setStatic(true);
+        $this->setDocblock('@var bool[] map of public properties of the parent class');
+    }
+
+    /**
+     * @return bool whether there are no public properties
+     */
+    public function isEmpty()
+    {
+        return empty($this->publicProperties);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/ProxyGeneratorInterface.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator;
+
+use ReflectionClass;
+use Zend\Code\Generator\ClassGenerator;
+
+/**
+ * Base interface for proxy generators - describes how a proxy generator should use
+ * reflection classes to modify given class generators
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface ProxyGeneratorInterface
+{
+    /**
+     * Apply modifications to the provided $classGenerator to proxy logic from $originalClass
+     *
+     * @param \ReflectionClass                    $originalClass
+     * @param \Zend\Code\Generator\ClassGenerator $classGenerator
+     *
+     * @return void
+     */
+    public function generate(ReflectionClass $originalClass, ClassGenerator $classGenerator);
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/RemoteObject/MethodGenerator/Constructor.php
@@ -0,0 +1,63 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * The `__construct` implementation for remote object proxies
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class Constructor extends MethodGenerator
+{
+    /**
+     * Constructor
+     *
+     * @param ReflectionClass   $originalClass Reflection of the class to proxy
+     * @param PropertyGenerator $adapter       Adapter property
+     */
+    public function __construct(ReflectionClass $originalClass, PropertyGenerator $adapter)
+    {
+        parent::__construct('__construct');
+
+        $adapterName = $adapter->getName();
+
+        $this->setParameter(new ParameterGenerator($adapterName, 'ProxyManager\Factory\RemoteObject\AdapterInterface'));
+
+        $this->setDocblock(
+            '@override constructor for remote object control\n\n'
+            . '@param \\ProxyManager\\Factory\\RemoteObject\\AdapterInterface \$adapter'
+        );
+
+        $body = '$this->' . $adapterName . ' = $' . $adapterName . ';';
+
+        foreach ($originalClass->getProperties() as $property) {
+            if ($property->isPublic() && ! $property->isStatic()) {
+                $body .= "\nunset(\$this->" . $property->getName() . ');';
+            }
+        }
+
+        $this->setBody($body);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/RemoteObject/MethodGenerator/MagicGet.php
@@ -0,0 +1,49 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__get` for remote objects
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class MagicGet extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     * @param ReflectionClass                        $originalClass
+     * @param \Zend\Code\Generator\PropertyGenerator $adapterProperty
+     */
+    public function __construct(ReflectionClass $originalClass, PropertyGenerator $adapterProperty)
+    {
+        parent::__construct($originalClass, '__get', array(new ParameterGenerator('name')));
+
+        $this->setDocblock('@param string $name');
+        $this->setBody(
+            '$return = $this->' . $adapterProperty->getName() . '->call(' . var_export($originalClass->getName(), true)
+            . ', \'__get\', array($name));' . "\n\n" . 'return $return;'
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/RemoteObject/MethodGenerator/MagicIsset.php
@@ -0,0 +1,50 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__isset` method for remote objects
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class MagicIsset extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     * @param ReflectionClass                        $originalClass
+     * @param \Zend\Code\Generator\PropertyGenerator $adapterProperty
+     */
+    public function __construct(ReflectionClass $originalClass, PropertyGenerator $adapterProperty)
+    {
+        parent::__construct($originalClass, '__isset', array(new ParameterGenerator('name')));
+
+        $this->setDocblock('@param string $name');
+        $this->setBody(
+            '$return = $this->' . $adapterProperty->getName() . '->call(' . var_export($originalClass->getName(), true)
+            . ', \'__isset\', array($name));' . "\n\n"
+            . 'return $return;'
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/RemoteObject/MethodGenerator/MagicSet.php
@@ -0,0 +1,54 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__set` for remote objects
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class MagicSet extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     * @param ReflectionClass                        $originalClass
+     * @param \Zend\Code\Generator\PropertyGenerator $adapterProperty
+     */
+    public function __construct(ReflectionClass $originalClass, PropertyGenerator $adapterProperty)
+    {
+        parent::__construct(
+            $originalClass,
+            '__set',
+            array(new ParameterGenerator('name'), new ParameterGenerator('value'))
+        );
+
+        $this->setDocblock('@param string \$name\n@param mixed \$value');
+        $this->setBody(
+            '$return = $this->' . $adapterProperty->getName() . '->call(' . var_export($originalClass->getName(), true)
+            . ', \'__set\', array($name, $value));' . "\n\n"
+            . 'return $return;'
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/RemoteObject/MethodGenerator/MagicUnset.php
@@ -0,0 +1,51 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__unset` method for remote objects
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class MagicUnset extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     *
+     * @param ReflectionClass   $originalClass
+     * @param PropertyGenerator $adapterProperty
+     */
+    public function __construct(ReflectionClass $originalClass, PropertyGenerator $adapterProperty)
+    {
+        parent::__construct($originalClass, '__unset', array(new ParameterGenerator('name')));
+
+        $this->setDocblock('@param string $name');
+        $this->setBody(
+            '$return = $this->' . $adapterProperty->getName() . '->call(' . var_export($originalClass->getName(), true)
+            . ', \'__unset\', array($name));' . "\n\n"
+            . 'return $return;'
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/RemoteObject/MethodGenerator/RemoteObjectMethod.php
@@ -0,0 +1,63 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Method decorator for remote objects
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class RemoteObjectMethod extends MethodGenerator
+{
+    /**
+     * @param \Zend\Code\Reflection\MethodReflection $originalMethod
+     * @param \Zend\Code\Generator\PropertyGenerator $adapterProperty
+     * @param \ReflectionClass                       $originalClass
+     *
+     * @return RemoteObjectMethod|static
+     */
+    public static function generateMethod(
+        MethodReflection $originalMethod,
+        PropertyGenerator $adapterProperty,
+        ReflectionClass $originalClass
+    ) {
+        /* @var $method self */
+        $method        = static::fromReflection($originalMethod);
+        $parameters    = $originalMethod->getParameters();
+        $list          = array();
+
+        foreach ($parameters as $parameter) {
+            $list[] = '$' . $parameter->getName();
+        }
+
+        $method->setBody(
+            '$return = $this->' . $adapterProperty->getName() . '->call(' . var_export($originalClass->getName(), true)
+            . ', ' . var_export($originalMethod->getName(), true) . ', array('. implode(', ', $list) .'));' . "\n\n"
+            . 'return $return;'
+        );
+
+        return $method;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/RemoteObject/PropertyGenerator/AdapterProperty.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\RemoteObject\PropertyGenerator;
+
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Property that contains the remote object adapter
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class AdapterProperty extends PropertyGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        parent::__construct(UniqueIdentifierGenerator::getIdentifier('adapter'));
+
+        $this->setVisibility(self::VISIBILITY_PRIVATE);
+        $this->setDocblock('@var \\ProxyManager\\Factory\\RemoteObject\\AdapterInterface Remote web service adapter');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/RemoteObjectGenerator.php
@@ -0,0 +1,93 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator;
+
+use ProxyManager\Generator\Util\ClassGeneratorUtils;
+use ProxyManager\ProxyGenerator\Assertion\CanProxyAssertion;
+use ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\Constructor;
+use ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\MagicGet;
+use ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\MagicIsset;
+use ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\MagicSet;
+use ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\MagicUnset;
+use ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\RemoteObjectMethod;
+use ProxyManager\ProxyGenerator\RemoteObject\PropertyGenerator\AdapterProperty;
+use ProxyManager\ProxyGenerator\Util\ProxiedMethodsFilter;
+use ReflectionClass;
+use ReflectionMethod;
+use Zend\Code\Generator\ClassGenerator;
+use Zend\Code\Generator\MethodGenerator;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Generator for proxies implementing {@see \ProxyManager\Proxy\RemoteObjectInterface}
+ *
+ * {@inheritDoc}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class RemoteObjectGenerator implements ProxyGeneratorInterface
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function generate(ReflectionClass $originalClass, ClassGenerator $classGenerator)
+    {
+        CanProxyAssertion::assertClassCanBeProxied($originalClass);
+
+        $interfaces = array('ProxyManager\\Proxy\\RemoteObjectInterface');
+
+        if ($originalClass->isInterface()) {
+            $interfaces[] = $originalClass->getName();
+        } else {
+            $classGenerator->setExtendedClass($originalClass->getName());
+        }
+
+        $classGenerator->setImplementedInterfaces($interfaces);
+        $classGenerator->addPropertyFromGenerator($adapter = new AdapterProperty());
+
+        array_map(
+            function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator) {
+                ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod);
+            },
+            array_merge(
+                array_map(
+                    function (ReflectionMethod $method) use ($adapter, $originalClass) {
+                        return RemoteObjectMethod::generateMethod(
+                            new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()),
+                            $adapter,
+                            $originalClass
+                        );
+                    },
+                    ProxiedMethodsFilter::getProxiedMethods(
+                        $originalClass,
+                        array('__get', '__set', '__isset', '__unset')
+                    )
+                ),
+                array(
+                    new Constructor($originalClass, $adapter),
+                    new MagicGet($originalClass, $adapter),
+                    new MagicSet($originalClass, $adapter),
+                    new MagicIsset($originalClass, $adapter),
+                    new MagicUnset($originalClass, $adapter),
+                )
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/Util/ProxiedMethodsFilter.php
@@ -0,0 +1,56 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\Util;
+
+use ReflectionClass;
+use ReflectionMethod;
+
+/**
+ * Utility class used to filter methods that can be proxied
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class ProxiedMethodsFilter
+{
+    /**
+     * @param ReflectionClass $class    reflection class from which methods should be extracted
+     * @param string[]        $excluded methods to be ignored
+     *
+     * @return ReflectionMethod[]
+     */
+    public static function getProxiedMethods(
+        ReflectionClass $class,
+        array $excluded = array('__get', '__set', '__isset', '__unset', '__clone', '__sleep', '__wakeup')
+    ) {
+        $ignored = array_flip(array_map('strtolower', $excluded));
+
+        return array_filter(
+            $class->getMethods(ReflectionMethod::IS_PUBLIC),
+            function (ReflectionMethod $method) use ($ignored) {
+                return ! (
+                    $method->isConstructor()
+                    || isset($ignored[strtolower($method->getName())])
+                    || $method->isFinal()
+                    || $method->isStatic()
+                );
+            }
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/Util/PublicScopeSimulator.php
@@ -0,0 +1,190 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\Util;
+
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Generates code necessary to simulate a fatal error in case of unauthorized
+ * access to class members in magic methods even when in child classes and dealing
+ * with protected members.
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class PublicScopeSimulator
+{
+    const OPERATION_SET   = 'set';
+    const OPERATION_GET   = 'get';
+    const OPERATION_ISSET = 'isset';
+    const OPERATION_UNSET = 'unset';
+
+    /**
+     * Generates code for simulating access to a property from the scope that is accessing a proxy.
+     * This is done by introspecting `debug_backtrace()` and then binding a closure to the scope
+     * of the parent caller.
+     *
+     * @param string            $operationType      operation to execute: one of 'get', 'set', 'isset' or 'unset'
+     * @param string            $nameParameter      name of the `name` parameter of the magic method
+     * @param string|null       $valueParameter     name of the `value` parameter of the magic method
+     * @param PropertyGenerator $valueHolder        name of the property containing the target object from which
+     *                                              to read the property. `$this` if none provided
+     * @param string|null       $returnPropertyName name of the property to which we want to assign the result of
+     *                                              the operation. Return directly if none provided
+     *
+     * @return string
+     *
+     * @throws \InvalidArgumentException
+     */
+    public static function getPublicAccessSimulationCode(
+        $operationType,
+        $nameParameter,
+        $valueParameter = null,
+        PropertyGenerator $valueHolder = null,
+        $returnPropertyName = null
+    ) {
+        $byRef  = self::getByRefReturnValue($operationType);
+        $value  = static::OPERATION_SET === $operationType ? ', $value' : '';
+        $target = '$this';
+
+        if ($valueHolder) {
+            $target = '$this->' . $valueHolder->getName();
+        }
+
+        return '$realInstanceReflection = new \\ReflectionClass(get_parent_class($this));' . "\n\n"
+            . 'if (! $realInstanceReflection->hasProperty($' . $nameParameter . ')) {'   . "\n"
+            . '    $targetObject = ' . $target . ';' . "\n\n"
+            . self::getUndefinedPropertyNotice($operationType, $nameParameter)
+            . '    ' . self::getOperation($operationType, $nameParameter, $valueParameter) . ";\n"
+            . "    return;\n"
+            . '}' . "\n\n"
+            . '$targetObject = ' . self::getTargetObject($valueHolder) . ";\n"
+            . '$accessor = function ' . $byRef . '() use ($targetObject, $name' . $value . ') {' . "\n"
+            . '    ' . self::getOperation($operationType, $nameParameter, $valueParameter) . "\n"
+            . "};\n"
+            . self::getScopeReBind()
+            . (
+                $returnPropertyName
+                    ? '$' . $returnPropertyName . ' = ' . $byRef . '$accessor();'
+                    : '$returnValue = ' . $byRef . '$accessor();' . "\n\n" . 'return $returnValue;'
+            );
+    }
+
+    /**
+     * This will generate code that triggers a notice if access is attempted on a non-existing property
+     *
+     * @param string $operationType
+     * @param string $nameParameter
+     *
+     * @return string
+     */
+    private static function getUndefinedPropertyNotice($operationType, $nameParameter)
+    {
+        if (static::OPERATION_GET !== $operationType) {
+            return '';
+        }
+
+        //
+        return '    $backtrace = debug_backtrace(false);' . "\n"
+            . '    trigger_error(\'Undefined property: \' . get_parent_class($this) . \'::$\' . $'
+            . $nameParameter
+            . ' . \' in \' . $backtrace[0][\'file\'] . \' on line \' . $backtrace[0][\'line\'], \E_USER_NOTICE);'
+            . "\n";
+    }
+
+    /**
+     * Defines whether the given operation produces a reference.
+     *
+     * Note: if the object is a wrapper, the wrapped instance is accessed directly. If the object
+     * is a ghost or the proxy has no wrapper, then an instance of the parent class is created via
+     * on-the-fly unserialization
+     *
+     * @param string $operationType
+     *
+     * @return string
+     */
+    private static function getByRefReturnValue($operationType)
+    {
+        return (static::OPERATION_GET === $operationType || static::OPERATION_SET === $operationType) ? '& ' : '';
+    }
+
+    /**
+     * Retrieves the logic to fetch the object on which access should be attempted
+     *
+     * @param PropertyGenerator $valueHolder
+     *
+     * @return string
+     */
+    private static function getTargetObject(PropertyGenerator $valueHolder = null)
+    {
+        if ($valueHolder) {
+            return '$this->' . $valueHolder->getName();
+        }
+
+        return 'unserialize(sprintf(\'O:%d:"%s":0:{}\', strlen(get_parent_class($this)), get_parent_class($this)))';
+    }
+
+    /**
+     * @param string      $operationType
+     * @param string      $nameParameter
+     * @param string|null $valueParameter
+     *
+     * @return string
+     *
+     * @throws \InvalidArgumentException
+     */
+    private static function getOperation($operationType, $nameParameter, $valueParameter)
+    {
+        switch ($operationType) {
+            case static::OPERATION_GET:
+                return 'return $targetObject->$' . $nameParameter . ";";
+            case static::OPERATION_SET:
+                if (! $valueParameter) {
+                    throw new \InvalidArgumentException('Parameter $valueParameter not provided');
+                }
+
+                return 'return $targetObject->$' . $nameParameter . ' = $' . $valueParameter . ';';
+            case static::OPERATION_ISSET:
+                return 'return isset($targetObject->$' . $nameParameter . ');';
+            case static::OPERATION_UNSET:
+                return 'unset($targetObject->$' . $nameParameter . ');';
+        }
+
+        throw new \InvalidArgumentException(sprintf('Invalid operation "%s" provided', $operationType));
+    }
+
+    /**
+     * Generates code to bind operations to the parent scope if supported by the current PHP implementation
+     *
+     * @return string
+     */
+    private static function getScopeReBind()
+    {
+        if (! method_exists('Closure', 'bind')) {
+            // @codeCoverageIgnoreStart
+            return '';
+            // @codeCoverageIgnoreEnd
+        }
+
+        return '    $backtrace = debug_backtrace(true);' . "\n"
+            . '    $scopeObject = isset($backtrace[1][\'object\'])'
+            . ' ? $backtrace[1][\'object\'] : new \stdClass();' . "\n"
+            . '    $accessor = $accessor->bindTo($scopeObject, get_class($scopeObject));' . "\n";
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/ValueHolder/MethodGenerator/GetWrappedValueHolderValue.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MethodGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Implementation for {@see \ProxyManager\Proxy\ValueHolderInterface::getWrappedValueHolderValue}
+ * for lazy loading value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class GetWrappedValueHolderValue extends MethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(PropertyGenerator $valueHolderProperty)
+    {
+        parent::__construct('getWrappedValueHolderValue');
+        $this->setDocblock('{@inheritDoc}');
+        $this->setBody('return $this->' . $valueHolderProperty->getName() . ';');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/ValueHolder/MethodGenerator/MagicSleep.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator;
+
+use ProxyManager\Generator\MagicMethodGenerator;
+use ReflectionClass;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Magic `__sleep` for value holder objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MagicSleep extends MagicMethodGenerator
+{
+    /**
+     * Constructor
+     */
+    public function __construct(ReflectionClass $originalClass, PropertyGenerator $valueHolderProperty)
+    {
+        parent::__construct($originalClass, '__sleep');
+
+        $this->setBody('return array(' . var_export($valueHolderProperty->getName(), true) . ');');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Signature/ClassSignatureGenerator.php
@@ -0,0 +1,58 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Signature;
+
+use Zend\Code\Generator\ClassGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Applies a signature to a given class generator
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+final class ClassSignatureGenerator implements ClassSignatureGeneratorInterface
+{
+    /**
+     * @var SignatureGeneratorInterface
+     */
+    private $signatureGenerator;
+
+    /**
+     * @param SignatureGeneratorInterface $signatureGenerator
+     */
+    public function __construct(SignatureGeneratorInterface $signatureGenerator)
+    {
+        $this->signatureGenerator = $signatureGenerator;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function addSignature(ClassGenerator $classGenerator, array $parameters)
+    {
+        $classGenerator->addPropertyFromGenerator(new PropertyGenerator(
+            'signature' . $this->signatureGenerator->generateSignatureKey($parameters),
+            $this->signatureGenerator->generateSignature($parameters),
+            PropertyGenerator::FLAG_STATIC | PropertyGenerator::FLAG_PRIVATE
+        ));
+
+        return $classGenerator;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Signature/ClassSignatureGeneratorInterface.php
@@ -0,0 +1,40 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Signature;
+
+use Zend\Code\Generator\ClassGenerator;
+
+/**
+ * Applies a signature to a given class generator
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface ClassSignatureGeneratorInterface
+{
+    /**
+     * Applies a signature to a given class generator
+     *
+     * @param ClassGenerator $classGenerator
+     * @param array          $parameters
+     *
+     * @return ClassGenerator
+     */
+    public function addSignature(ClassGenerator $classGenerator, array $parameters);
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Signature/Exception/ExceptionInterface.php
@@ -0,0 +1,29 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Signature\Exception;
+
+/**
+ * Exception marker for exceptions from the signature sub-component
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Signature/Exception/InvalidSignatureException.php
@@ -0,0 +1,50 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Signature\Exception;
+
+use ReflectionClass;
+use UnexpectedValueException;
+
+/**
+ * Exception for invalid provided signatures
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class InvalidSignatureException extends UnexpectedValueException implements ExceptionInterface
+{
+    /**
+     * @param ReflectionClass $class
+     * @param array           $parameters
+     * @param string          $signature
+     * @param string          $expected
+     *
+     * @return self
+     */
+    public static function fromInvalidSignature(ReflectionClass $class, array $parameters, $signature, $expected)
+    {
+        return new self(sprintf(
+            'Found signature "%s" for class "%s" does not correspond to expected signature "%s" for %d parameters',
+            $signature,
+            $class->getName(),
+            $expected,
+            count($parameters)
+        ));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Signature/Exception/MissingSignatureException.php
@@ -0,0 +1,48 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Signature\Exception;
+
+use ReflectionClass;
+use UnexpectedValueException;
+
+/**
+ * Exception for no found signatures
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class MissingSignatureException extends UnexpectedValueException implements ExceptionInterface
+{
+    /**
+     * @param ReflectionClass $class
+     * @param array           $parameters
+     * @param string          $expected
+     *
+     * @return self
+     */
+    public static function fromMissingSignature(ReflectionClass $class, array $parameters, $expected)
+    {
+        return new self(sprintf(
+            'No signature found for class "%s", expected signature "%s" for %d parameters',
+            $class->getName(),
+            $expected,
+            count($parameters)
+        ));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Signature/SignatureChecker.php
@@ -0,0 +1,68 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Signature;
+
+use ProxyManager\Signature\Exception\InvalidSignatureException;
+use ProxyManager\Signature\Exception\MissingSignatureException;
+use ReflectionClass;
+
+/**
+ * Generator for signatures to be used to check the validity of generated code
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+final class SignatureChecker implements SignatureCheckerInterface
+{
+    /**
+     * @var SignatureGeneratorInterface
+     */
+    private $signatureGenerator;
+
+    /**
+     * @param SignatureGeneratorInterface $signatureGenerator
+     */
+    public function __construct(SignatureGeneratorInterface $signatureGenerator)
+    {
+        $this->signatureGenerator = $signatureGenerator;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function checkSignature(ReflectionClass $class, array $parameters)
+    {
+        $propertyName      = 'signature' . $this->signatureGenerator->generateSignatureKey($parameters);
+        $signature         = $this->signatureGenerator->generateSignature($parameters);
+        $defaultProperties = $class->getDefaultProperties();
+
+        if (! isset($defaultProperties[$propertyName])) {
+            throw MissingSignatureException::fromMissingSignature($class, $parameters, $signature);
+        }
+
+        if ($defaultProperties[$propertyName] !== $signature) {
+            throw InvalidSignatureException::fromInvalidSignature(
+                $class,
+                $parameters,
+                $defaultProperties[$propertyName],
+                $signature
+            );
+        }
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Signature/SignatureCheckerInterface.php
@@ -0,0 +1,43 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Signature;
+
+use ReflectionClass;
+
+/**
+ * Generator for signatures to be used to check the validity of generated code
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface SignatureCheckerInterface
+{
+    /**
+     * Checks whether the given signature is valid or not
+     *
+     * @param ReflectionClass $class
+     * @param array           $parameters
+     *
+     * @return void
+     *
+     * @throws \ProxyManager\Signature\Exception\InvalidSignatureException
+     * @throws \ProxyManager\Signature\Exception\MissingSignatureException
+     */
+    public function checkSignature(ReflectionClass $class, array $parameters);
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Signature/SignatureGenerator.php
@@ -0,0 +1,66 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Signature;
+
+use ProxyManager\Inflector\Util\ParameterEncoder;
+use ProxyManager\Inflector\Util\ParameterHasher;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+final class SignatureGenerator implements SignatureGeneratorInterface
+{
+    /**
+     * @var ParameterEncoder
+     */
+    private $parameterEncoder;
+
+    /**
+     * @var ParameterHasher
+     */
+    private $parameterHasher;
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        $this->parameterEncoder = new ParameterEncoder();
+        $this->parameterHasher  = new ParameterHasher();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function generateSignature(array $parameters)
+    {
+        return $this->parameterEncoder->encodeParameters($parameters);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function generateSignatureKey(array $parameters)
+    {
+        return $this->parameterHasher->hashParameters($parameters);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Signature/SignatureGeneratorInterface.php
@@ -0,0 +1,46 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager\Signature;
+
+/**
+ * Generator for signatures to be used to check the validity of generated code
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface SignatureGeneratorInterface
+{
+    /**
+     * Generates a signature to be used to verify generated code validity
+     *
+     * @param array $parameters
+     *
+     * @return string
+     */
+    public function generateSignature(array $parameters);
+
+    /**
+     * Generates a signature key to be looked up when verifying generated code validity
+     *
+     * @param array $parameters
+     *
+     * @return string
+     */
+    public function generateSignatureKey(array $parameters);
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/src/ProxyManager/Version.php
@@ -0,0 +1,39 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManager;
+
+/**
+ * Version class - to be adjusted when a new release is created.
+ *
+ * Note that we cannot check the version at runtime via `git` because that would cause a lot of I/O operations.
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+final class Version
+{
+    const VERSION = '1.0.0';
+
+    /**
+     * Private constructor - this class is not meant to be instantiated
+     */
+    private function __construct()
+    {
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Autoloader/AutoloaderTest.php
@@ -0,0 +1,133 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Autoloader;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Autoloader\Autoloader;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\Autoloader\Autoloader}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\Autoloader\Autoloader
+ * @group Coverage
+ */
+class AutoloaderTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \ProxyManager\Autoloader\Autoloader
+     */
+    protected $autoloader;
+
+    /**
+     * @var \ProxyManager\FileLocator\FileLocatorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $fileLocator;
+
+    /**
+     * @var \ProxyManager\Inflector\ClassNameInflectorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $classNameInflector;
+
+    /**
+     * @covers \ProxyManager\Autoloader\Autoloader::__construct
+     */
+    public function setUp()
+    {
+        $this->fileLocator        = $this->getMock('ProxyManager\\FileLocator\\FileLocatorInterface');
+        $this->classNameInflector = $this->getMock('ProxyManager\\Inflector\\ClassNameInflectorInterface');
+        $this->autoloader         = new Autoloader($this->fileLocator, $this->classNameInflector);
+    }
+
+    /**
+     * @covers \ProxyManager\Autoloader\Autoloader::__invoke
+     */
+    public function testWillNotAutoloadUserClasses()
+    {
+        $className = 'Foo\\' . UniqueIdentifierGenerator::getIdentifier('Bar');
+        $this
+            ->classNameInflector
+            ->expects($this->once())
+            ->method('isProxyClassName')
+            ->with($className)
+            ->will($this->returnValue(false));
+
+        $this->assertFalse($this->autoloader->__invoke($className));
+    }
+
+    /**
+     * @covers \ProxyManager\Autoloader\Autoloader::__invoke
+     */
+    public function testWillNotAutoloadNonExistingClass()
+    {
+        $className = 'Foo\\' . UniqueIdentifierGenerator::getIdentifier('Bar');
+        $this
+            ->classNameInflector
+            ->expects($this->once())
+            ->method('isProxyClassName')
+            ->with($className)
+            ->will($this->returnValue(true));
+        $this
+            ->fileLocator
+            ->expects($this->once())
+            ->method('getProxyFileName')
+            ->will($this->returnValue(__DIR__ . '/non-existing'));
+
+        $this->assertFalse($this->autoloader->__invoke($className));
+    }
+
+    /**
+     * @covers \ProxyManager\Autoloader\Autoloader::__invoke
+     */
+    public function testWillNotAutoloadExistingClass()
+    {
+        $this->assertFalse($this->autoloader->__invoke(__CLASS__));
+    }
+
+    /**
+     * @covers \ProxyManager\Autoloader\Autoloader::__invoke
+     */
+    public function testWillAutoloadExistingFile()
+    {
+        $namespace = 'Foo';
+        $className = UniqueIdentifierGenerator::getIdentifier('Bar');
+        $fqcn      = $namespace . '\\' . $className;
+        $fileName  = sys_get_temp_dir() . '/foo_' . uniqid() . '.php';
+
+        file_put_contents($fileName, '<?php namespace ' . $namespace . '; class ' . $className . '{}');
+
+        $this
+            ->classNameInflector
+            ->expects($this->once())
+            ->method('isProxyClassName')
+            ->with($fqcn)
+            ->will($this->returnValue(true));
+        $this
+            ->fileLocator
+            ->expects($this->once())
+            ->method('getProxyFileName')
+            ->will($this->returnValue($fileName));
+
+        $this->assertTrue($this->autoloader->__invoke($fqcn));
+        $this->assertTrue(class_exists($fqcn, false));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ConfigurationTest.php
@@ -0,0 +1,183 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Configuration;
+
+/**
+ * Tests for {@see \ProxyManager\Configuration}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class ConfigurationTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \ProxyManager\Configuration
+     */
+    protected $configuration;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setUp()
+    {
+        $this->configuration = new Configuration();
+    }
+
+    /**
+     * @covers \ProxyManager\Configuration::getProxiesNamespace
+     * @covers \ProxyManager\Configuration::setProxiesNamespace
+     */
+    public function testGetSetProxiesNamespace()
+    {
+        $this->assertSame(
+            'ProxyManagerGeneratedProxy',
+            $this->configuration->getProxiesNamespace(),
+            'Default setting check for BC'
+        );
+
+        $this->configuration->setProxiesNamespace('foo');
+        $this->assertSame('foo', $this->configuration->getProxiesNamespace());
+    }
+
+    /**
+     * @covers \ProxyManager\Configuration::getClassNameInflector
+     * @covers \ProxyManager\Configuration::setClassNameInflector
+     */
+    public function testSetGetClassNameInflector()
+    {
+        $this->assertInstanceOf(
+            'ProxyManager\\Inflector\\ClassNameInflectorInterface',
+            $this->configuration->getClassNameInflector()
+        );
+
+        /* @var $inflector \ProxyManager\Inflector\ClassNameInflectorInterface */
+        $inflector = $this->getMock('ProxyManager\\Inflector\\ClassNameInflectorInterface');
+
+        $this->configuration->setClassNameInflector($inflector);
+        $this->assertSame($inflector, $this->configuration->getClassNameInflector());
+    }
+
+    /**
+     * @covers \ProxyManager\Configuration::getGeneratorStrategy
+     * @covers \ProxyManager\Configuration::setGeneratorStrategy
+     */
+    public function testSetGetGeneratorStrategy()
+    {
+
+        $this->assertInstanceOf(
+            'ProxyManager\\GeneratorStrategy\\GeneratorStrategyInterface',
+            $this->configuration->getGeneratorStrategy()
+        );
+
+        /* @var $strategy \ProxyManager\GeneratorStrategy\GeneratorStrategyInterface */
+        $strategy = $this->getMock('ProxyManager\\GeneratorStrategy\\GeneratorStrategyInterface');
+
+        $this->configuration->setGeneratorStrategy($strategy);
+        $this->assertSame($strategy, $this->configuration->getGeneratorStrategy());
+    }
+
+    /**
+     * @covers \ProxyManager\Configuration::getProxiesTargetDir
+     * @covers \ProxyManager\Configuration::setProxiesTargetDir
+     */
+    public function testSetGetProxiesTargetDir()
+    {
+        $this->assertTrue(is_dir($this->configuration->getProxiesTargetDir()));
+
+        $this->configuration->setProxiesTargetDir(__DIR__);
+        $this->assertSame(__DIR__, $this->configuration->getProxiesTargetDir());
+    }
+
+    /**
+     * @covers \ProxyManager\Configuration::getProxyAutoloader
+     * @covers \ProxyManager\Configuration::setProxyAutoloader
+     */
+    public function testSetGetProxyAutoloader()
+    {
+        $this->assertInstanceOf(
+            'ProxyManager\\Autoloader\\AutoloaderInterface',
+            $this->configuration->getProxyAutoloader()
+        );
+
+        /* @var $autoloader \ProxyManager\Autoloader\AutoloaderInterface */
+        $autoloader = $this->getMock('ProxyManager\\Autoloader\\AutoloaderInterface');
+
+        $this->configuration->setProxyAutoloader($autoloader);
+        $this->assertSame($autoloader, $this->configuration->getProxyAutoloader());
+    }
+
+    /**
+     * @covers \ProxyManager\Configuration::getSignatureGenerator
+     * @covers \ProxyManager\Configuration::setSignatureGenerator
+     */
+    public function testSetGetSignatureGenerator()
+    {
+        $this->assertInstanceOf(
+            'ProxyManager\\Signature\\SignatureGeneratorInterface',
+            $this->configuration->getSignatureGenerator()
+        );
+
+        /* @var $signatureGenerator \ProxyManager\Signature\SignatureGeneratorInterface */
+        $signatureGenerator = $this->getMock('ProxyManager\\Signature\\SignatureGeneratorInterface');
+
+        $this->configuration->setSignatureGenerator($signatureGenerator);
+        $this->assertSame($signatureGenerator, $this->configuration->getSignatureGenerator());
+    }
+
+    /**
+     * @covers \ProxyManager\Configuration::getSignatureChecker
+     * @covers \ProxyManager\Configuration::setSignatureChecker
+     */
+    public function testSetGetSignatureChecker()
+    {
+        $this->assertInstanceOf(
+            'ProxyManager\\Signature\\SignatureCheckerInterface',
+            $this->configuration->getSignatureChecker()
+        );
+
+        /* @var $signatureChecker \ProxyManager\Signature\SignatureCheckerInterface */
+        $signatureChecker = $this->getMock('ProxyManager\\Signature\\SignatureCheckerInterface');
+
+        $this->configuration->setSignatureChecker($signatureChecker);
+        $this->assertSame($signatureChecker, $this->configuration->getSignatureChecker());
+    }
+
+    /**
+     * @covers \ProxyManager\Configuration::getClassSignatureGenerator
+     * @covers \ProxyManager\Configuration::setClassSignatureGenerator
+     */
+    public function testSetGetClassSignatureGenerator()
+    {
+        $this->assertInstanceOf(
+            'ProxyManager\\Signature\\ClassSignatureGeneratorInterface',
+            $this->configuration->getClassSignatureGenerator()
+        );
+
+        /* @var $classSignatureGenerator \ProxyManager\Signature\ClassSignatureGeneratorInterface */
+        $classSignatureGenerator = $this->getMock('ProxyManager\\Signature\\ClassSignatureGeneratorInterface');
+
+        $this->configuration->setClassSignatureGenerator($classSignatureGenerator);
+        $this->assertSame($classSignatureGenerator, $this->configuration->getClassSignatureGenerator());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Exception/DisabledMethodExceptionTest.php
@@ -0,0 +1,44 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Exception;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Exception\DisabledMethodException;
+
+/**
+ * Tests for {@see \ProxyManager\Exception\DisabledMethodException}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\Exception\DisabledMethodException
+ * @group Coverage
+ */
+class DisabledMethodExceptionTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\Exception\DisabledMethodException::disabledMethod
+     */
+    public function testProxyDirectoryNotFound()
+    {
+        $exception = DisabledMethodException::disabledMethod('foo::bar');
+
+        $this->assertSame('Method "foo::bar" is forcefully disabled', $exception->getMessage());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Exception/FileNotWritableExceptionTest.php
@@ -0,0 +1,72 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Exception;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Exception\FileNotWritableException;
+
+/**
+ * Tests for {@see \ProxyManager\Exception\FileNotWritableException}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\Exception\FileNotWritableException
+ * @group Coverage
+ */
+class FileNotWritableExceptionTest extends PHPUnit_Framework_TestCase
+{
+    public function testFromInvalidMoveOperation()
+    {
+        $exception = FileNotWritableException::fromInvalidMoveOperation('/tmp/a', '/tmp/b');
+
+        $this->assertInstanceOf('ProxyManager\\Exception\\FileNotWritableException', $exception);
+        $this->assertSame(
+            'Could not move file "/tmp/a" to location "/tmp/b": either the source file is not readable,'
+            . ' or the destination is not writable',
+            $exception->getMessage()
+        );
+    }
+
+    public function testFromNotWritableLocationWithNonFilePath()
+    {
+        $exception = FileNotWritableException::fromNonWritableLocation(__DIR__);
+
+        $this->assertInstanceOf('ProxyManager\\Exception\\FileNotWritableException', $exception);
+        $this->assertSame(
+            'Could not write to path "' . __DIR__ . '": exists and is not a file',
+            $exception->getMessage()
+        );
+    }
+
+    public function testFromNotWritableLocationWithNonWritablePath()
+    {
+        $path = sys_get_temp_dir() . '/' . uniqid('FileNotWritableExceptionTestNonWritable', true);
+
+        mkdir($path, 0555);
+
+        $exception = FileNotWritableException::fromNonWritableLocation($path . '/foo');
+
+        $this->assertInstanceOf('ProxyManager\\Exception\\FileNotWritableException', $exception);
+        $this->assertSame(
+            'Could not write to path "' . $path . '/foo": is not writable',
+            $exception->getMessage()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Exception/InvalidProxiedClassExceptionTest.php
@@ -0,0 +1,67 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Exception;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Exception\InvalidProxiedClassException;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\Exception\InvalidProxiedClassException}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\Exception\InvalidProxiedClassException
+ * @group Coverage
+ */
+class InvalidProxiedClassExceptionTest extends PHPUnit_Framework_TestCase
+{
+    public function testInterfaceNotSupported()
+    {
+        $this->assertSame(
+            'Provided interface "ProxyManagerTestAsset\BaseInterface" cannot be proxied',
+            InvalidProxiedClassException::interfaceNotSupported(
+                new ReflectionClass('ProxyManagerTestAsset\BaseInterface')
+            )->getMessage()
+        );
+    }
+
+    public function testFinalClassNotSupported()
+    {
+        $this->assertSame(
+            'Provided class "ProxyManagerTestAsset\FinalClass" is final and cannot be proxied',
+            InvalidProxiedClassException::finalClassNotSupported(
+                new ReflectionClass('ProxyManagerTestAsset\FinalClass')
+            )->getMessage()
+        );
+    }
+
+    public function testAbstractProtectedMethodsNotSupported()
+    {
+        $this->assertSame(
+            'Provided class "ProxyManagerTestAsset\ClassWithAbstractProtectedMethod" has following protected abstract'
+            . ' methods, and therefore cannot be proxied:' . "\n"
+            . 'ProxyManagerTestAsset\ClassWithAbstractProtectedMethod::protectedAbstractMethod',
+            InvalidProxiedClassException::abstractProtectedMethodsNotSupported(
+                new ReflectionClass('ProxyManagerTestAsset\ClassWithAbstractProtectedMethod')
+            )->getMessage()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Exception/InvalidProxyDirectoryExceptionTest.php
@@ -0,0 +1,44 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Exception;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Exception\InvalidProxyDirectoryException;
+
+/**
+ * Tests for {@see \ProxyManager\Exception\InvalidProxyDirectoryException}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\Exception\InvalidProxyDirectoryException
+ * @group Coverage
+ */
+class InvalidProxyDirectoryExceptionTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\Exception\InvalidProxyDirectoryException::proxyDirectoryNotFound
+     */
+    public function testProxyDirectoryNotFound()
+    {
+        $exception = InvalidProxyDirectoryException::proxyDirectoryNotFound('foo/bar');
+
+        $this->assertSame('Provided directory "foo/bar" does not exist', $exception->getMessage());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Exception/UnsupportedProxiedClassExceptionTest.php
@@ -0,0 +1,49 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Exception;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Exception\UnsupportedProxiedClassException;
+use ReflectionProperty;
+
+/**
+ * Tests for {@see \ProxyManager\Exception\UnsupportedProxiedClassException}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\Exception\UnsupportedProxiedClassException
+ * @group Coverage
+ */
+class UnsupportedProxiedClassExceptionTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\Exception\UnsupportedProxiedClassException::unsupportedLocalizedReflectionProperty
+     */
+    public function testUnsupportedLocalizedReflectionProperty()
+    {
+        $this->assertSame(
+            'Provided reflection property "property0" of class "ProxyManagerTestAsset\ClassWithPrivateProperties" '
+            . 'is private and cannot be localized in PHP 5.3',
+            UnsupportedProxiedClassException::unsupportedLocalizedReflectionProperty(
+                new ReflectionProperty('ProxyManagerTestAsset\ClassWithPrivateProperties', 'property0')
+            )->getMessage()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Factory/AbstractBaseFactoryTest.php
@@ -0,0 +1,158 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Factory;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use ReflectionMethod;
+
+/**
+ * Tests for {@see \ProxyManager\Factory\AbstractBaseFactory}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\Factory\AbstractBaseFactory
+ * @group Coverage
+ */
+class AbstractBaseFactoryTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \ProxyManager\Factory\AbstractBaseFactory
+     */
+    private $factory;
+
+    /**
+     * @var \ProxyManager\ProxyGenerator\ProxyGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $generator;
+
+    /**
+     * @var \ProxyManager\Inflector\ClassNameInflectorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $classNameInflector;
+
+    /**
+     * @var \ProxyManager\GeneratorStrategy\GeneratorStrategyInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $generatorStrategy;
+
+    /**
+     * @var \ProxyManager\Autoloader\AutoloaderInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $proxyAutoloader;
+
+    /**
+     * @var \ProxyManager\Signature\SignatureCheckerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $signatureChecker;
+
+    /**
+     * @var \ProxyManager\Signature\ClassSignatureGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $classSignatureGenerator;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setUp()
+    {
+        $configuration                 = $this->getMock('ProxyManager\\Configuration');
+        $this->generator               = $this->getMock('ProxyManager\\ProxyGenerator\\ProxyGeneratorInterface');
+        $this->classNameInflector      = $this->getMock('ProxyManager\\Inflector\\ClassNameInflectorInterface');
+        $this->generatorStrategy       = $this->getMock('ProxyManager\\GeneratorStrategy\\GeneratorStrategyInterface');
+        $this->proxyAutoloader         = $this->getMock('ProxyManager\\Autoloader\\AutoloaderInterface');
+        $this->signatureChecker        = $this->getMock('ProxyManager\\Signature\\SignatureCheckerInterface');
+        $this->classSignatureGenerator = $this->getMock('ProxyManager\\Signature\\ClassSignatureGeneratorInterface');
+
+        $configuration
+            ->expects($this->any())
+            ->method('getClassNameInflector')
+            ->will($this->returnValue($this->classNameInflector));
+
+        $configuration
+            ->expects($this->any())
+            ->method('getGeneratorStrategy')
+            ->will($this->returnValue($this->generatorStrategy));
+
+        $configuration
+            ->expects($this->any())
+            ->method('getProxyAutoloader')
+            ->will($this->returnValue($this->proxyAutoloader));
+
+        $configuration
+            ->expects($this->any())
+            ->method('getSignatureChecker')
+            ->will($this->returnValue($this->signatureChecker));
+
+        $configuration
+            ->expects($this->any())
+            ->method('getClassSignatureGenerator')
+            ->will($this->returnValue($this->classSignatureGenerator));
+
+        $this
+            ->classNameInflector
+            ->expects($this->any())
+            ->method('getUserClassName')
+            ->will($this->returnValue('stdClass'));
+
+        $this->factory = $this->getMockForAbstractClass(
+            'ProxyManager\\Factory\\AbstractBaseFactory',
+            array($configuration)
+        );
+
+        $this->factory->expects($this->any())->method('getGenerator')->will($this->returnValue($this->generator));
+    }
+
+    public function testGeneratesClass()
+    {
+        $generateProxy = new ReflectionMethod($this->factory, 'generateProxy');
+
+        $generateProxy->setAccessible(true);
+        $generatedClass = UniqueIdentifierGenerator::getIdentifier('fooBar');
+
+        $this
+            ->classNameInflector
+            ->expects($this->any())
+            ->method('getProxyClassName')
+            ->with('stdClass')
+            ->will($this->returnValue($generatedClass));
+
+        $this
+            ->generatorStrategy
+            ->expects($this->once())
+            ->method('generate')
+            ->with($this->isInstanceOf('Zend\\Code\\Generator\\ClassGenerator'));
+        $this
+            ->proxyAutoloader
+            ->expects($this->once())
+            ->method('__invoke')
+            ->with($generatedClass)
+            ->will($this->returnCallback(function ($className) {
+                eval('class ' . $className . ' {}');
+            }));
+
+        $this->signatureChecker->expects($this->atLeastOnce())->method('checkSignature');
+        $this->classSignatureGenerator->expects($this->once())->method('addSignature')->will($this->returnArgument(0));
+
+        $this->assertSame($generatedClass, $generateProxy->invoke($this->factory, 'stdClass'));
+        $this->assertTrue(class_exists($generatedClass, false));
+        $this->assertSame($generatedClass, $generateProxy->invoke($this->factory, 'stdClass'));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Factory/AccessInterceptorScopeLocalizerFactoryTest.php
@@ -0,0 +1,199 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Factory;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory;
+use ProxyManager\Factory\AccessInterceptorValueHolderFactory;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use stdClass;
+
+/**
+ * Tests for {@see \ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class AccessInterceptorScopeLocalizerFactoryTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $inflector;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $signatureChecker;
+
+    /**
+     * @var \ProxyManager\Signature\ClassSignatureGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $classSignatureGenerator;
+
+    /**
+     * @var \ProxyManager\Configuration|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $config;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setUp()
+    {
+        $this->config                  = $this->getMock('ProxyManager\\Configuration');
+        $this->inflector               = $this->getMock('ProxyManager\\Inflector\\ClassNameInflectorInterface');
+        $this->signatureChecker        = $this->getMock('ProxyManager\\Signature\\SignatureCheckerInterface');
+        $this->classSignatureGenerator = $this->getMock('ProxyManager\\Signature\\ClassSignatureGeneratorInterface');
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getClassNameInflector')
+            ->will($this->returnValue($this->inflector));
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getSignatureChecker')
+            ->will($this->returnValue($this->signatureChecker));
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getClassSignatureGenerator')
+            ->will($this->returnValue($this->classSignatureGenerator));
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory::__construct
+     */
+    public function testWithOptionalFactory()
+    {
+        $factory = new AccessInterceptorValueHolderFactory();
+        $this->assertAttributeNotEmpty('configuration', $factory);
+        $this->assertAttributeInstanceOf('ProxyManager\Configuration', 'configuration', $factory);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory::__construct
+     * @covers \ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory::createProxy
+     * @covers \ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory::getGenerator
+     */
+    public function testWillSkipAutoGeneration()
+    {
+        $instance = new stdClass();
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getProxyClassName')
+            ->with('stdClass')
+            ->will($this->returnValue('ProxyManagerTestAsset\\AccessInterceptorValueHolderMock'));
+
+        $factory     = new AccessInterceptorScopeLocalizerFactory($this->config);
+        /* @var $proxy \ProxyManagerTestAsset\AccessInterceptorValueHolderMock */
+        $proxy       = $factory->createProxy($instance, array('foo'), array('bar'));
+
+        $this->assertInstanceOf('ProxyManagerTestAsset\\AccessInterceptorValueHolderMock', $proxy);
+        $this->assertSame($instance, $proxy->instance);
+        $this->assertSame(array('foo'), $proxy->prefixInterceptors);
+        $this->assertSame(array('bar'), $proxy->suffixInterceptors);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory::__construct
+     * @covers \ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory::createProxy
+     * @covers \ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory::getGenerator
+     *
+     * NOTE: serious mocking going on in here (a class is generated on-the-fly) - careful
+     */
+    public function testWillTryAutoGeneration()
+    {
+        $instance       = new stdClass();
+        $proxyClassName = UniqueIdentifierGenerator::getIdentifier('bar');
+        $generator      = $this->getMock('ProxyManager\GeneratorStrategy\\GeneratorStrategyInterface');
+        $autoloader     = $this->getMock('ProxyManager\\Autoloader\\AutoloaderInterface');
+
+        $this->config->expects($this->any())->method('getGeneratorStrategy')->will($this->returnValue($generator));
+        $this->config->expects($this->any())->method('getProxyAutoloader')->will($this->returnValue($autoloader));
+
+        $generator
+            ->expects($this->once())
+            ->method('generate')
+            ->with(
+                $this->callback(
+                    function (ClassGenerator $targetClass) use ($proxyClassName) {
+                        return $targetClass->getName() === $proxyClassName;
+                    }
+                )
+            );
+
+        // simulate autoloading
+        $autoloader
+            ->expects($this->once())
+            ->method('__invoke')
+            ->with($proxyClassName)
+            ->will(
+                $this->returnCallback(
+                    function () use ($proxyClassName) {
+                        eval(
+                            'class ' . $proxyClassName
+                            . ' extends \\ProxyManagerTestAsset\\AccessInterceptorValueHolderMock {}'
+                        );
+                    }
+                )
+            );
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getProxyClassName')
+            ->with('stdClass')
+            ->will($this->returnValue($proxyClassName));
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getUserClassName')
+            ->with('stdClass')
+            ->will($this->returnValue('ProxyManagerTestAsset\\LazyLoadingMock'));
+
+        $this->signatureChecker->expects($this->atLeastOnce())->method('checkSignature');
+        $this->classSignatureGenerator->expects($this->once())->method('addSignature')->will($this->returnArgument(0));
+
+        $factory     = new AccessInterceptorScopeLocalizerFactory($this->config);
+        /* @var $proxy \ProxyManagerTestAsset\AccessInterceptorValueHolderMock */
+        $proxy       = $factory->createProxy($instance, array('foo'), array('bar'));
+
+        $this->assertInstanceOf($proxyClassName, $proxy);
+        $this->assertSame($instance, $proxy->instance);
+        $this->assertSame(array('foo'), $proxy->prefixInterceptors);
+        $this->assertSame(array('bar'), $proxy->suffixInterceptors);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Factory/AccessInterceptorValueHolderFactoryTest.php
@@ -0,0 +1,198 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Factory;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Factory\AccessInterceptorValueHolderFactory;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use stdClass;
+
+/**
+ * Tests for {@see \ProxyManager\Factory\AccessInterceptorValueHolderFactory}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class AccessInterceptorValueHolderFactoryTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $inflector;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $signatureChecker;
+
+    /**
+     * @var \ProxyManager\Signature\ClassSignatureGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $classSignatureGenerator;
+
+    /**
+     * @var \ProxyManager\Configuration|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $config;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setUp()
+    {
+        $this->config                  = $this->getMock('ProxyManager\\Configuration');
+        $this->inflector               = $this->getMock('ProxyManager\\Inflector\\ClassNameInflectorInterface');
+        $this->signatureChecker        = $this->getMock('ProxyManager\\Signature\\SignatureCheckerInterface');
+        $this->classSignatureGenerator = $this->getMock('ProxyManager\\Signature\\ClassSignatureGeneratorInterface');
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getClassNameInflector')
+            ->will($this->returnValue($this->inflector));
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getSignatureChecker')
+            ->will($this->returnValue($this->signatureChecker));
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getClassSignatureGenerator')
+            ->will($this->returnValue($this->classSignatureGenerator));
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\AccessInterceptorValueHolderFactory::__construct
+     */
+    public function testWithOptionalFactory()
+    {
+        $factory = new AccessInterceptorValueHolderFactory();
+        $this->assertAttributeNotEmpty('configuration', $factory);
+        $this->assertAttributeInstanceOf('ProxyManager\Configuration', 'configuration', $factory);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\AccessInterceptorValueHolderFactory::__construct
+     * @covers \ProxyManager\Factory\AccessInterceptorValueHolderFactory::createProxy
+     * @covers \ProxyManager\Factory\AccessInterceptorValueHolderFactory::getGenerator
+     */
+    public function testWillSkipAutoGeneration()
+    {
+        $instance = new stdClass();
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getProxyClassName')
+            ->with('stdClass')
+            ->will($this->returnValue('ProxyManagerTestAsset\\AccessInterceptorValueHolderMock'));
+
+        $factory     = new AccessInterceptorValueHolderFactory($this->config);
+        /* @var $proxy \ProxyManagerTestAsset\AccessInterceptorValueHolderMock */
+        $proxy       = $factory->createProxy($instance, array('foo'), array('bar'));
+
+        $this->assertInstanceOf('ProxyManagerTestAsset\\AccessInterceptorValueHolderMock', $proxy);
+        $this->assertSame($instance, $proxy->instance);
+        $this->assertSame(array('foo'), $proxy->prefixInterceptors);
+        $this->assertSame(array('bar'), $proxy->suffixInterceptors);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\AccessInterceptorValueHolderFactory::__construct
+     * @covers \ProxyManager\Factory\AccessInterceptorValueHolderFactory::createProxy
+     * @covers \ProxyManager\Factory\AccessInterceptorValueHolderFactory::getGenerator
+     *
+     * NOTE: serious mocking going on in here (a class is generated on-the-fly) - careful
+     */
+    public function testWillTryAutoGeneration()
+    {
+        $instance       = new stdClass();
+        $proxyClassName = UniqueIdentifierGenerator::getIdentifier('bar');
+        $generator      = $this->getMock('ProxyManager\GeneratorStrategy\\GeneratorStrategyInterface');
+        $autoloader     = $this->getMock('ProxyManager\\Autoloader\\AutoloaderInterface');
+
+        $this->config->expects($this->any())->method('getGeneratorStrategy')->will($this->returnValue($generator));
+        $this->config->expects($this->any())->method('getProxyAutoloader')->will($this->returnValue($autoloader));
+
+        $generator
+            ->expects($this->once())
+            ->method('generate')
+            ->with(
+                $this->callback(
+                    function (ClassGenerator $targetClass) use ($proxyClassName) {
+                        return $targetClass->getName() === $proxyClassName;
+                    }
+                )
+            );
+
+        // simulate autoloading
+        $autoloader
+            ->expects($this->once())
+            ->method('__invoke')
+            ->with($proxyClassName)
+            ->will(
+                $this->returnCallback(
+                    function () use ($proxyClassName) {
+                        eval(
+                            'class ' . $proxyClassName
+                            . ' extends \\ProxyManagerTestAsset\\AccessInterceptorValueHolderMock {}'
+                        );
+                    }
+                )
+            );
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getProxyClassName')
+            ->with('stdClass')
+            ->will($this->returnValue($proxyClassName));
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getUserClassName')
+            ->with('stdClass')
+            ->will($this->returnValue('ProxyManagerTestAsset\\LazyLoadingMock'));
+
+        $this->signatureChecker->expects($this->atLeastOnce())->method('checkSignature');
+        $this->classSignatureGenerator->expects($this->once())->method('addSignature')->will($this->returnArgument(0));
+
+        $factory     = new AccessInterceptorValueHolderFactory($this->config);
+        /* @var $proxy \ProxyManagerTestAsset\AccessInterceptorValueHolderMock */
+        $proxy       = $factory->createProxy($instance, array('foo'), array('bar'));
+
+        $this->assertInstanceOf($proxyClassName, $proxy);
+        $this->assertSame($instance, $proxy->instance);
+        $this->assertSame(array('foo'), $proxy->prefixInterceptors);
+        $this->assertSame(array('bar'), $proxy->suffixInterceptors);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Factory/LazyLoadingGhostFactoryTest.php
@@ -0,0 +1,193 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Factory;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Factory\LazyLoadingGhostFactory;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\Factory\LazyLoadingGhostFactory}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class LazyLoadingGhostFactoryTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $inflector;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $signatureChecker;
+
+    /**
+     * @var \ProxyManager\Signature\ClassSignatureGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $classSignatureGenerator;
+
+    /**
+     * @var \ProxyManager\Configuration|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $config;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setUp()
+    {
+        $this->config                  = $this->getMock('ProxyManager\\Configuration');
+        $this->inflector               = $this->getMock('ProxyManager\\Inflector\\ClassNameInflectorInterface');
+        $this->signatureChecker        = $this->getMock('ProxyManager\\Signature\\SignatureCheckerInterface');
+        $this->classSignatureGenerator = $this->getMock('ProxyManager\\Signature\\ClassSignatureGeneratorInterface');
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getClassNameInflector')
+            ->will($this->returnValue($this->inflector));
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getSignatureChecker')
+            ->will($this->returnValue($this->signatureChecker));
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getClassSignatureGenerator')
+            ->will($this->returnValue($this->classSignatureGenerator));
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\LazyLoadingGhostFactory::__construct
+     */
+    public function testWithOptionalFactory()
+    {
+        $factory = new LazyLoadingGhostFactory();
+        $this->assertAttributeNotEmpty('configuration', $factory);
+        $this->assertAttributeInstanceOf('ProxyManager\Configuration', 'configuration', $factory);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\LazyLoadingGhostFactory::__construct
+     * @covers \ProxyManager\Factory\LazyLoadingGhostFactory::createProxy
+     */
+    public function testWillSkipAutoGeneration()
+    {
+        $className = UniqueIdentifierGenerator::getIdentifier('foo');
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getProxyClassName')
+            ->with($className)
+            ->will($this->returnValue('ProxyManagerTestAsset\\LazyLoadingMock'));
+
+        $factory     = new LazyLoadingGhostFactory($this->config);
+        $initializer = function () {
+        };
+        /* @var $proxy \ProxyManagerTestAsset\LazyLoadingMock */
+        $proxy       = $factory->createProxy($className, $initializer);
+
+        $this->assertInstanceOf('ProxyManagerTestAsset\\LazyLoadingMock', $proxy);
+        $this->assertSame($initializer, $proxy->initializer);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\LazyLoadingGhostFactory::__construct
+     * @covers \ProxyManager\Factory\LazyLoadingGhostFactory::createProxy
+     * @covers \ProxyManager\Factory\LazyLoadingGhostFactory::getGenerator
+     *
+     * NOTE: serious mocking going on in here (a class is generated on-the-fly) - careful
+     */
+    public function testWillTryAutoGeneration()
+    {
+        $className      = UniqueIdentifierGenerator::getIdentifier('foo');
+        $proxyClassName = UniqueIdentifierGenerator::getIdentifier('bar');
+        $generator      = $this->getMock('ProxyManager\\GeneratorStrategy\\GeneratorStrategyInterface');
+        $autoloader     = $this->getMock('ProxyManager\\Autoloader\\AutoloaderInterface');
+
+        $this->config->expects($this->any())->method('getGeneratorStrategy')->will($this->returnValue($generator));
+        $this->config->expects($this->any())->method('getProxyAutoloader')->will($this->returnValue($autoloader));
+
+        $generator
+            ->expects($this->once())
+            ->method('generate')
+            ->with(
+                $this->callback(
+                    function (ClassGenerator $targetClass) use ($proxyClassName) {
+                        return $targetClass->getName() === $proxyClassName;
+                    }
+                )
+            );
+
+        // simulate autoloading
+        $autoloader
+            ->expects($this->once())
+            ->method('__invoke')
+            ->with($proxyClassName)
+            ->will(
+                $this->returnCallback(
+                    function () use ($proxyClassName) {
+                        eval('class ' . $proxyClassName . ' extends \\ProxyManagerTestAsset\\LazyLoadingMock {}');
+                    }
+                )
+            );
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getProxyClassName')
+            ->with($className)
+            ->will($this->returnValue($proxyClassName));
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getUserClassName')
+            ->with($className)
+            ->will($this->returnValue('ProxyManagerTestAsset\\LazyLoadingMock'));
+
+        $this->signatureChecker->expects($this->atLeastOnce())->method('checkSignature');
+        $this->classSignatureGenerator->expects($this->once())->method('addSignature')->will($this->returnArgument(0));
+
+        $factory     = new LazyLoadingGhostFactory($this->config);
+        $initializer = function () {
+        };
+        /* @var $proxy \ProxyManagerTestAsset\LazyLoadingMock */
+        $proxy       = $factory->createProxy($className, $initializer);
+
+        $this->assertInstanceOf($proxyClassName, $proxy);
+        $this->assertSame($initializer, $proxy->initializer);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Factory/LazyLoadingValueHolderFactoryTest.php
@@ -0,0 +1,193 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Factory;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Factory\LazyLoadingValueHolderFactory;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\Factory\LazyLoadingValueHolderFactory}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class LazyLoadingValueHolderFactoryTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $inflector;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $signatureChecker;
+
+    /**
+     * @var \ProxyManager\Signature\ClassSignatureGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $classSignatureGenerator;
+
+    /**
+     * @var \ProxyManager\Configuration|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $config;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setUp()
+    {
+        $this->config                  = $this->getMock('ProxyManager\\Configuration');
+        $this->inflector               = $this->getMock('ProxyManager\\Inflector\\ClassNameInflectorInterface');
+        $this->signatureChecker        = $this->getMock('ProxyManager\\Signature\\SignatureCheckerInterface');
+        $this->classSignatureGenerator = $this->getMock('ProxyManager\\Signature\\ClassSignatureGeneratorInterface');
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getClassNameInflector')
+            ->will($this->returnValue($this->inflector));
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getSignatureChecker')
+            ->will($this->returnValue($this->signatureChecker));
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getClassSignatureGenerator')
+            ->will($this->returnValue($this->classSignatureGenerator));
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\LazyLoadingValueHolderFactory::__construct
+     */
+    public function testWithOptionalFactory()
+    {
+        $factory = new LazyLoadingValueHolderFactory();
+        $this->assertAttributeNotEmpty('configuration', $factory);
+        $this->assertAttributeInstanceOf('ProxyManager\Configuration', 'configuration', $factory);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\LazyLoadingValueHolderFactory::__construct
+     * @covers \ProxyManager\Factory\LazyLoadingValueHolderFactory::createProxy
+     */
+    public function testWillSkipAutoGeneration()
+    {
+        $className = UniqueIdentifierGenerator::getIdentifier('foo');
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getProxyClassName')
+            ->with($className)
+            ->will($this->returnValue('ProxyManagerTestAsset\\LazyLoadingMock'));
+
+        $factory     = new LazyLoadingValueHolderFactory($this->config);
+        $initializer = function () {
+        };
+        /* @var $proxy \ProxyManagerTestAsset\LazyLoadingMock */
+        $proxy       = $factory->createProxy($className, $initializer);
+
+        $this->assertInstanceOf('ProxyManagerTestAsset\\LazyLoadingMock', $proxy);
+        $this->assertSame($initializer, $proxy->initializer);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\LazyLoadingValueHolderFactory::__construct
+     * @covers \ProxyManager\Factory\LazyLoadingValueHolderFactory::createProxy
+     * @covers \ProxyManager\Factory\LazyLoadingValueHolderFactory::getGenerator
+     *
+     * NOTE: serious mocking going on in here (a class is generated on-the-fly) - careful
+     */
+    public function testWillTryAutoGeneration()
+    {
+        $className      = UniqueIdentifierGenerator::getIdentifier('foo');
+        $proxyClassName = UniqueIdentifierGenerator::getIdentifier('bar');
+        $generator      = $this->getMock('ProxyManager\\GeneratorStrategy\\GeneratorStrategyInterface');
+        $autoloader     = $this->getMock('ProxyManager\\Autoloader\\AutoloaderInterface');
+
+        $this->config->expects($this->any())->method('getGeneratorStrategy')->will($this->returnValue($generator));
+        $this->config->expects($this->any())->method('getProxyAutoloader')->will($this->returnValue($autoloader));
+
+        $generator
+            ->expects($this->once())
+            ->method('generate')
+            ->with(
+                $this->callback(
+                    function (ClassGenerator $targetClass) use ($proxyClassName) {
+                        return $targetClass->getName() === $proxyClassName;
+                    }
+                )
+            );
+
+        // simulate autoloading
+        $autoloader
+            ->expects($this->once())
+            ->method('__invoke')
+            ->with($proxyClassName)
+            ->will(
+                $this->returnCallback(
+                    function () use ($proxyClassName) {
+                        eval('class ' . $proxyClassName . ' extends \\ProxyManagerTestAsset\\LazyLoadingMock {}');
+                    }
+                )
+            );
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getProxyClassName')
+            ->with($className)
+            ->will($this->returnValue($proxyClassName));
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getUserClassName')
+            ->with($className)
+            ->will($this->returnValue('ProxyManagerTestAsset\\LazyLoadingMock'));
+
+        $this->signatureChecker->expects($this->atLeastOnce())->method('checkSignature');
+        $this->classSignatureGenerator->expects($this->once())->method('addSignature')->will($this->returnArgument(0));
+
+        $factory     = new LazyLoadingValueHolderFactory($this->config);
+        $initializer = function () {
+        };
+        /* @var $proxy \ProxyManagerTestAsset\LazyLoadingMock */
+        $proxy       = $factory->createProxy($className, $initializer);
+
+        $this->assertInstanceOf($proxyClassName, $proxy);
+        $this->assertSame($initializer, $proxy->initializer);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Factory/NullObjectFactoryTest.php
@@ -0,0 +1,180 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Factory;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Factory\NullObjectFactory;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use stdClass;
+
+/**
+ * Tests for {@see \ProxyManager\Factory\NullObjectFactory}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class NullObjectFactoryTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $inflector;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $signatureChecker;
+
+    /**
+     * @var \ProxyManager\Signature\ClassSignatureGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $classSignatureGenerator;
+
+    /**
+     * @var \ProxyManager\Configuration|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $config;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setUp()
+    {
+        $this->config                  = $this->getMock('ProxyManager\\Configuration');
+        $this->inflector               = $this->getMock('ProxyManager\\Inflector\\ClassNameInflectorInterface');
+        $this->signatureChecker        = $this->getMock('ProxyManager\\Signature\\SignatureCheckerInterface');
+        $this->classSignatureGenerator = $this->getMock('ProxyManager\\Signature\\ClassSignatureGeneratorInterface');
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getClassNameInflector')
+            ->will($this->returnValue($this->inflector));
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getSignatureChecker')
+            ->will($this->returnValue($this->signatureChecker));
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getClassSignatureGenerator')
+            ->will($this->returnValue($this->classSignatureGenerator));
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\NullObjectFactory::__construct
+     * @covers \ProxyManager\Factory\NullObjectFactory::createProxy
+     * @covers \ProxyManager\Factory\NullObjectFactory::getGenerator
+     */
+    public function testWillSkipAutoGeneration()
+    {
+        $instance = new stdClass();
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getProxyClassName')
+            ->with('stdClass')
+            ->will($this->returnValue('ProxyManagerTestAsset\\NullObjectMock'));
+
+        $factory    = new NullObjectFactory($this->config);
+        /* @var $proxy \ProxyManagerTestAsset\NullObjectMock */
+        $proxy      = $factory->createProxy($instance);
+
+        $this->assertInstanceOf('ProxyManagerTestAsset\\NullObjectMock', $proxy);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\NullObjectFactory::__construct
+     * @covers \ProxyManager\Factory\NullObjectFactory::createProxy
+     * @covers \ProxyManager\Factory\NullObjectFactory::getGenerator
+     *
+     * NOTE: serious mocking going on in here (a class is generated on-the-fly) - careful
+     */
+    public function testWillTryAutoGeneration()
+    {
+        $instance       = new stdClass();
+        $proxyClassName = UniqueIdentifierGenerator::getIdentifier('bar');
+        $generator      = $this->getMock('ProxyManager\GeneratorStrategy\\GeneratorStrategyInterface');
+        $autoloader     = $this->getMock('ProxyManager\\Autoloader\\AutoloaderInterface');
+
+        $this->config->expects($this->any())->method('getGeneratorStrategy')->will($this->returnValue($generator));
+        $this->config->expects($this->any())->method('getProxyAutoloader')->will($this->returnValue($autoloader));
+
+        $generator
+            ->expects($this->once())
+            ->method('generate')
+            ->with(
+                $this->callback(
+                    function (ClassGenerator $targetClass) use ($proxyClassName) {
+                        return $targetClass->getName() === $proxyClassName;
+                    }
+                )
+            );
+
+        // simulate autoloading
+        $autoloader
+            ->expects($this->once())
+            ->method('__invoke')
+            ->with($proxyClassName)
+            ->will(
+                $this->returnCallback(
+                    function () use ($proxyClassName) {
+                        eval(
+                            'class ' . $proxyClassName
+                            . ' extends \\ProxyManagerTestAsset\\NullObjectMock {}'
+                        );
+                    }
+                )
+            );
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getProxyClassName')
+            ->with('stdClass')
+            ->will($this->returnValue($proxyClassName));
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getUserClassName')
+            ->with('stdClass')
+            ->will($this->returnValue('ProxyManagerTestAsset\\NullObjectMock'));
+
+        $this->signatureChecker->expects($this->atLeastOnce())->method('checkSignature');
+        $this->classSignatureGenerator->expects($this->once())->method('addSignature')->will($this->returnArgument(0));
+
+        $factory    = new NullObjectFactory($this->config);
+        /* @var $proxy \ProxyManagerTestAsset\NullObjectMock */
+        $proxy      = $factory->createProxy($instance);
+
+        $this->assertInstanceOf($proxyClassName, $proxy);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/BaseAdapterTest.php
@@ -0,0 +1,101 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Factory\RemoteObject\Adapter;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Factory\RemoteObject\Adapter\Soap;
+
+/**
+ * Tests for {@see \ProxyManager\Factory\RemoteObject\Adapter\Soap}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class BaseAdapterTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\RemoteObject\Adapter\BaseAdapter::__construct
+     * @covers \ProxyManager\Factory\RemoteObject\Adapter\BaseAdapter::call
+     * @covers \ProxyManager\Factory\RemoteObject\Adapter\Soap::getServiceName
+     */
+    public function testBaseAdapter()
+    {
+        $client = $this
+            ->getMockBuilder('Zend\Server\Client')
+            ->setMethods(array('call'))
+            ->getMock();
+
+        $adapter = $this->getMockForAbstractClass(
+            'ProxyManager\\Factory\\RemoteObject\\Adapter\\BaseAdapter',
+            array($client)
+        );
+
+        $client
+            ->expects($this->once())
+            ->method('call')
+            ->with('foobarbaz', array('tab' => 'taz'))
+            ->will($this->returnValue('baz'));
+
+        $adapter
+            ->expects($this->once())
+            ->method('getServiceName')
+            ->with('foo', 'bar')
+            ->will($this->returnValue('foobarbaz'));
+
+        $this->assertSame('baz', $adapter->call('foo', 'bar', array('tab' => 'taz')));
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\RemoteObject\Adapter\BaseAdapter::__construct
+     * @covers \ProxyManager\Factory\RemoteObject\Adapter\BaseAdapter::call
+     * @covers \ProxyManager\Factory\RemoteObject\Adapter\Soap::getServiceName
+     */
+    public function testBaseAdapterWithServiceMap()
+    {
+        $client = $this
+            ->getMockBuilder('Zend\Server\Client')
+            ->setMethods(array('call'))
+            ->getMock();
+
+        $adapter = $this->getMockForAbstractClass(
+            'ProxyManager\\Factory\\RemoteObject\\Adapter\\BaseAdapter',
+            array($client, array('foobarbaz' => 'mapped'))
+        );
+
+        $client
+            ->expects($this->once())
+            ->method('call')
+            ->with('mapped', array('tab' => 'taz'))
+            ->will($this->returnValue('baz'));
+
+        $adapter
+            ->expects($this->once())
+            ->method('getServiceName')
+            ->with('foo', 'bar')
+            ->will($this->returnValue('foobarbaz'));
+
+        $this->assertSame('baz', $adapter->call('foo', 'bar', array('tab' => 'taz')));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/JsonRpcTest.php
@@ -0,0 +1,57 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Factory\RemoteObject\Adapter;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Factory\RemoteObject\Adapter\JsonRpc;
+
+/**
+ * Tests for {@see \ProxyManager\Factory\RemoteObject\Adapter\JsonRpc}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class JsonRpcTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\RemoteObject\Adapter\JsonRpc::__construct
+     * @covers \ProxyManager\Factory\RemoteObject\Adapter\JsonRpc::getServiceName
+     */
+    public function testCanBuildAdapterWithJsonRpcClient()
+    {
+        $client = $this
+            ->getMockBuilder('Zend\Server\Client')
+            ->setMethods(array('call'))
+            ->getMock();
+
+        $adapter = new JsonRpc($client);
+
+        $client
+            ->expects($this->once())
+            ->method('call')
+            ->with('foo.bar', array('tab' => 'taz'))
+            ->will($this->returnValue('baz'));
+
+        $this->assertSame('baz', $adapter->call('foo', 'bar', array('tab' => 'taz')));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/SoapTest.php
@@ -0,0 +1,57 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Factory\RemoteObject\Adapter;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Factory\RemoteObject\Adapter\Soap;
+
+/**
+ * Tests for {@see \ProxyManager\Factory\RemoteObject\Adapter\Soap}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class SoapTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\RemoteObject\Adapter\Soap::__construct
+     * @covers \ProxyManager\Factory\RemoteObject\Adapter\Soap::getServiceName
+     */
+    public function testCanBuildAdapterWithSoapRpcClient()
+    {
+        $client = $this
+            ->getMockBuilder('Zend\Server\Client')
+            ->setMethods(array('call'))
+            ->getMock();
+
+        $adapter = new Soap($client);
+
+        $client
+            ->expects($this->once())
+            ->method('call')
+            ->with('bar', array('tab' => 'taz'))
+            ->will($this->returnValue('baz'));
+
+        $this->assertSame('baz', $adapter->call('foo', 'bar', array('tab' => 'taz')));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/XmlRpcTest.php
@@ -0,0 +1,57 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Factory\RemoteObject\Adapter;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Factory\RemoteObject\Adapter\XmlRpc;
+
+/**
+ * Tests for {@see \ProxyManager\Factory\RemoteObject\Adapter\XmlRpc}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class XmlRpcTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\RemoteObject\Adapter\XmlRpc::__construct
+     * @covers \ProxyManager\Factory\RemoteObject\Adapter\XmlRpc::getServiceName
+     */
+    public function testCanBuildAdapterWithXmlRpcClient()
+    {
+        $client = $this
+            ->getMockBuilder('Zend\Server\Client')
+            ->setMethods(array('call'))
+            ->getMock();
+
+        $adapter = new XmlRpc($client);
+
+        $client
+            ->expects($this->once())
+            ->method('call')
+            ->with('foo.bar', array('tab' => 'taz'))
+            ->will($this->returnValue('baz'));
+
+        $this->assertSame('baz', $adapter->call('foo', 'bar', array('tab' => 'taz')));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Factory/RemoteObjectFactoryTest.php
@@ -0,0 +1,178 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Factory;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Factory\RemoteObjectFactory;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\Factory\RemoteObjectFactory}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class RemoteObjectFactoryTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $inflector;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $signatureChecker;
+
+    /**
+     * @var \ProxyManager\Signature\ClassSignatureGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $classSignatureGenerator;
+
+    /**
+     * @var \ProxyManager\Configuration|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $config;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setUp()
+    {
+        $this->config                  = $this->getMock('ProxyManager\\Configuration');
+        $this->inflector               = $this->getMock('ProxyManager\\Inflector\\ClassNameInflectorInterface');
+        $this->signatureChecker        = $this->getMock('ProxyManager\\Signature\\SignatureCheckerInterface');
+        $this->classSignatureGenerator = $this->getMock('ProxyManager\\Signature\\ClassSignatureGeneratorInterface');
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getClassNameInflector')
+            ->will($this->returnValue($this->inflector));
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getSignatureChecker')
+            ->will($this->returnValue($this->signatureChecker));
+
+        $this
+            ->config
+            ->expects($this->any())
+            ->method('getClassSignatureGenerator')
+            ->will($this->returnValue($this->classSignatureGenerator));
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\RemoteObjectFactory::__construct
+     * @covers \ProxyManager\Factory\RemoteObjectFactory::createProxy
+     * @covers \ProxyManager\Factory\RemoteObjectFactory::getGenerator
+     */
+    public function testWillSkipAutoGeneration()
+    {
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getProxyClassName')
+            ->with('ProxyManagerTestAsset\\BaseInterface')
+            ->will($this->returnValue('StdClass'));
+
+        $adapter = $this->getMock('ProxyManager\Factory\RemoteObject\AdapterInterface');
+        $factory = new RemoteObjectFactory($adapter, $this->config);
+        /* @var $proxy \stdClass */
+        $proxy   = $factory->createProxy('ProxyManagerTestAsset\\BaseInterface', $adapter);
+
+        $this->assertInstanceOf('stdClass', $proxy);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @covers \ProxyManager\Factory\RemoteObjectFactory::__construct
+     * @covers \ProxyManager\Factory\RemoteObjectFactory::createProxy
+     * @covers \ProxyManager\Factory\RemoteObjectFactory::getGenerator
+     *
+     * NOTE: serious mocking going on in here (a class is generated on-the-fly) - careful
+     */
+    public function testWillTryAutoGeneration()
+    {
+        $proxyClassName = UniqueIdentifierGenerator::getIdentifier('bar');
+        $generator      = $this->getMock('ProxyManager\GeneratorStrategy\\GeneratorStrategyInterface');
+        $autoloader     = $this->getMock('ProxyManager\\Autoloader\\AutoloaderInterface');
+
+        $this->config->expects($this->any())->method('getGeneratorStrategy')->will($this->returnValue($generator));
+        $this->config->expects($this->any())->method('getProxyAutoloader')->will($this->returnValue($autoloader));
+
+        $generator
+            ->expects($this->once())
+            ->method('generate')
+            ->with(
+                $this->callback(
+                    function (ClassGenerator $targetClass) use ($proxyClassName) {
+                        return $targetClass->getName() === $proxyClassName;
+                    }
+                )
+            );
+
+        // simulate autoloading
+        $autoloader
+            ->expects($this->once())
+            ->method('__invoke')
+            ->with($proxyClassName)
+            ->will(
+                $this->returnCallback(
+                    function () use ($proxyClassName) {
+                        eval(
+                            'class ' . $proxyClassName
+                            . ' extends stdClass {}'
+                        );
+                    }
+                )
+            );
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getProxyClassName')
+            ->with('ProxyManagerTestAsset\\BaseInterface')
+            ->will($this->returnValue($proxyClassName));
+
+        $this
+            ->inflector
+            ->expects($this->once())
+            ->method('getUserClassName')
+            ->with('ProxyManagerTestAsset\\BaseInterface')
+            ->will($this->returnValue('stdClass'));
+
+        $this->signatureChecker->expects($this->atLeastOnce())->method('checkSignature');
+        $this->classSignatureGenerator->expects($this->once())->method('addSignature')->will($this->returnArgument(0));
+
+        $adapter = $this->getMock('ProxyManager\Factory\RemoteObject\AdapterInterface');
+        $factory = new RemoteObjectFactory($adapter, $this->config);
+        /* @var $proxy \stdClass */
+        $proxy   = $factory->createProxy('ProxyManagerTestAsset\\BaseInterface', $adapter);
+
+        $this->assertInstanceOf($proxyClassName, $proxy);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/FileLocator/FileLocatorTest.php
@@ -0,0 +1,54 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\FileLocator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\FileLocator\FileLocator;
+
+/**
+ * Tests for {@see \ProxyManager\FileLocator\FileLocator}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class FileLocatorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\FileLocator\FileLocator::__construct
+     * @covers \ProxyManager\FileLocator\FileLocator::getProxyFileName
+     */
+    public function testGetProxyFileName()
+    {
+        $locator = new FileLocator(__DIR__);
+
+        $this->assertSame(__DIR__ . DIRECTORY_SEPARATOR . 'FooBarBaz.php', $locator->getProxyFileName('Foo\\Bar\\Baz'));
+        $this->assertSame(__DIR__ . DIRECTORY_SEPARATOR . 'Foo_Bar_Baz.php', $locator->getProxyFileName('Foo_Bar_Baz'));
+    }
+
+    /**
+     * @covers \ProxyManager\FileLocator\FileLocator::__construct
+     */
+    public function testRejectsNonExistingDirectory()
+    {
+        $this->setExpectedException('ProxyManager\\Exception\\InvalidProxyDirectoryException');
+        new FileLocator(__DIR__ . '/non-existing');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Functional/AccessInterceptorScopeLocalizerFunctionalTest.php
@@ -0,0 +1,388 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Functional;
+
+use PHPUnit_Framework_SkippedTestError;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Exception\UnsupportedProxiedClassException;
+use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
+use ProxyManager\Proxy\AccessInterceptorInterface;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizerGenerator;
+use ProxyManagerTestAsset\BaseClass;
+use ProxyManagerTestAsset\ClassWithPublicArrayProperty;
+use ProxyManagerTestAsset\ClassWithPublicProperties;
+use ProxyManagerTestAsset\ClassWithSelfHint;
+use ReflectionClass;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizerGenerator} produced objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Functional
+ * @coversNothing
+ */
+class AccessInterceptorScopeLocalizerFunctionalTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * {@inheritDoc}
+     */
+    public static function setUpBeforeClass()
+    {
+        if (! method_exists('Closure', 'bind')) {
+            throw new PHPUnit_Framework_SkippedTestError(
+                'PHP 5.3 doesn\'t support scope localization of private properties'
+            );
+        }
+    }
+
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCalls($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+
+        /* @var $proxy \ProxyManager\Proxy\AccessInterceptorInterface */
+        $proxy     = new $proxyName($instance);
+
+        $this->assertProxySynchronized($instance, $proxy);
+        $this->assertSame($expectedValue, call_user_func_array(array($proxy, $method), $params));
+
+        $listener  = $this->getMock('stdClass', array('__invoke'));
+        $listener
+            ->expects($this->once())
+            ->method('__invoke')
+            ->with($proxy, $proxy, $method, $params, false);
+
+        $proxy->setMethodPrefixInterceptor(
+            $method,
+            function ($proxy, $instance, $method, $params, & $returnEarly) use ($listener) {
+                $listener->__invoke($proxy, $instance, $method, $params, $returnEarly);
+            }
+        );
+
+        $this->assertSame($expectedValue, call_user_func_array(array($proxy, $method), $params));
+
+        $random = uniqid();
+
+        $proxy->setMethodPrefixInterceptor(
+            $method,
+            function ($proxy, $instance, $method, $params, & $returnEarly) use ($random) {
+                $returnEarly = true;
+
+                return $random;
+            }
+        );
+
+        $this->assertSame($random, call_user_func_array(array($proxy, $method), $params));
+        $this->assertProxySynchronized($instance, $proxy);
+    }
+
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCallsWithSuffixListener($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+
+        /* @var $proxy \ProxyManager\Proxy\AccessInterceptorInterface */
+        $proxy     = new $proxyName($instance);
+        $listener  = $this->getMock('stdClass', array('__invoke'));
+        $listener
+            ->expects($this->once())
+            ->method('__invoke')
+            ->with($proxy, $proxy, $method, $params, $expectedValue, false);
+
+        $proxy->setMethodSuffixInterceptor(
+            $method,
+            function ($proxy, $instance, $method, $params, $returnValue, & $returnEarly) use ($listener) {
+                $listener->__invoke($proxy, $instance, $method, $params, $returnValue, $returnEarly);
+            }
+        );
+
+        $this->assertSame($expectedValue, call_user_func_array(array($proxy, $method), $params));
+
+        $random = uniqid();
+
+        $proxy->setMethodSuffixInterceptor(
+            $method,
+            function ($proxy, $instance, $method, $params, $returnValue, & $returnEarly) use ($random) {
+                $returnEarly = true;
+
+                return $random;
+            }
+        );
+
+        $this->assertSame($random, call_user_func_array(array($proxy, $method), $params));
+        $this->assertProxySynchronized($instance, $proxy);
+    }
+
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCallsAfterUnSerialization($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+        /* @var $proxy \ProxyManager\Proxy\AccessInterceptorInterface */
+        $proxy     = unserialize(serialize(new $proxyName($instance)));
+
+        $this->assertSame($expectedValue, call_user_func_array(array($proxy, $method), $params));
+        $this->assertProxySynchronized($instance, $proxy);
+    }
+
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCallsAfterCloning($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+
+        /* @var $proxy \ProxyManager\Proxy\AccessInterceptorInterface */
+        $proxy     = new $proxyName($instance);
+        $cloned    = clone $proxy;
+
+        $this->assertProxySynchronized($instance, $proxy);
+        $this->assertSame($expectedValue, call_user_func_array(array($cloned, $method), $params));
+        $this->assertProxySynchronized($instance, $proxy);
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyReadAccess($instance, $proxy, $publicProperty, $propertyValue)
+    {
+        /* @var $proxy \ProxyManager\Proxy\AccessInterceptorInterface */
+        $this->assertSame($propertyValue, $proxy->$publicProperty);
+        $this->assertProxySynchronized($instance, $proxy);
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyWriteAccess($instance, $proxy, $publicProperty)
+    {
+        /* @var $proxy \ProxyManager\Proxy\AccessInterceptorInterface */
+        $newValue               = uniqid();
+        $proxy->$publicProperty = $newValue;
+
+        $this->assertSame($newValue, $proxy->$publicProperty);
+        $this->assertProxySynchronized($instance, $proxy);
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyExistence($instance, $proxy, $publicProperty)
+    {
+        /* @var $proxy \ProxyManager\Proxy\AccessInterceptorInterface */
+        $this->assertSame(isset($instance->$publicProperty), isset($proxy->$publicProperty));
+        $this->assertProxySynchronized($instance, $proxy);
+
+        $instance->$publicProperty = null;
+        $this->assertFalse(isset($proxy->$publicProperty));
+        $this->assertProxySynchronized($instance, $proxy);
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyUnset($instance, $proxy, $publicProperty)
+    {
+        $this->markTestSkipped('It is currently not possible to synchronize properties un-setting');
+        /* @var $proxy \ProxyManager\Proxy\AccessInterceptorInterface */
+        unset($proxy->$publicProperty);
+
+        $this->assertFalse(isset($instance->$publicProperty));
+        $this->assertFalse(isset($proxy->$publicProperty));
+        $this->assertProxySynchronized($instance, $proxy);
+    }
+
+    /**
+     * Verifies that accessing a public property containing an array behaves like in a normal context
+     */
+    public function testCanWriteToArrayKeysInPublicProperty()
+    {
+        $instance    = new ClassWithPublicArrayProperty();
+        $className   = get_class($instance);
+        $proxyName   = $this->generateProxy($className);
+        /* @var $proxy ClassWithPublicArrayProperty */
+        $proxy       = new $proxyName($instance);
+
+        $proxy->arrayProperty['foo'] = 'bar';
+
+        $this->assertSame('bar', $proxy->arrayProperty['foo']);
+
+        $proxy->arrayProperty = array('tab' => 'taz');
+
+        $this->assertSame(array('tab' => 'taz'), $proxy->arrayProperty);
+        $this->assertProxySynchronized($instance, $proxy);
+    }
+
+    /**
+     * Verifies that public properties retrieved via `__get` don't get modified in the object state
+     */
+    public function testWillNotModifyRetrievedPublicProperties()
+    {
+        $instance    = new ClassWithPublicProperties();
+        $className   = get_class($instance);
+        $proxyName   = $this->generateProxy($className);
+        /* @var $proxy ClassWithPublicProperties */
+        $proxy       = new $proxyName($instance);
+        $variable    = $proxy->property0;
+
+        $this->assertSame('property0', $variable);
+
+        $variable = 'foo';
+
+        $this->assertSame('property0', $proxy->property0);
+        $this->assertProxySynchronized($instance, $proxy);
+    }
+
+    /**
+     * Verifies that public properties references retrieved via `__get` modify in the object state
+     */
+    public function testWillModifyByRefRetrievedPublicProperties()
+    {
+        $instance    = new ClassWithPublicProperties();
+        $className   = get_class($instance);
+        $proxyName   = $this->generateProxy($className);
+        /* @var $proxy ClassWithPublicProperties */
+        $proxy       = new $proxyName($instance);
+        $variable    = & $proxy->property0;
+
+        $this->assertSame('property0', $variable);
+
+        $variable = 'foo';
+
+        $this->assertSame('foo', $proxy->property0);
+        $this->assertProxySynchronized($instance, $proxy);
+    }
+
+    /**
+     * Generates a proxy for the given class name, and retrieves its class name
+     *
+     * @param string $parentClassName
+     *
+     * @return string
+     *
+     * @throws UnsupportedProxiedClassException
+     */
+    private function generateProxy($parentClassName)
+    {
+        $generatedClassName = __NAMESPACE__ . '\\' . UniqueIdentifierGenerator::getIdentifier('Foo');
+        $generator          = new AccessInterceptorScopeLocalizerGenerator();
+        $generatedClass     = new ClassGenerator($generatedClassName);
+        $strategy           = new EvaluatingGeneratorStrategy();
+
+        $generator->generate(new ReflectionClass($parentClassName), $generatedClass);
+        $strategy->generate($generatedClass);
+
+        return $generatedClassName;
+    }
+
+    /**
+     * Generates a list of object | invoked method | parameters | expected result
+     *
+     * @return array
+     */
+    public function getProxyMethods()
+    {
+        $selfHintParam = new ClassWithSelfHint();
+
+        $data = array(
+            array(
+                'ProxyManagerTestAsset\\BaseClass',
+                new BaseClass(),
+                'publicMethod',
+                array(),
+                'publicMethodDefault'
+            ),
+            array(
+                'ProxyManagerTestAsset\\BaseClass',
+                new BaseClass(),
+                'publicTypeHintedMethod',
+                array('param' => new \stdClass()),
+                'publicTypeHintedMethodDefault'
+            ),
+            array(
+                'ProxyManagerTestAsset\\BaseClass',
+                new BaseClass(),
+                'publicByReferenceMethod',
+                array(),
+                'publicByReferenceMethodDefault'
+            ),
+        );
+
+        if (PHP_VERSION_ID >= 50401) {
+            // PHP < 5.4.1 misbehaves, throwing strict standards, see https://bugs.php.net/bug.php?id=60573
+            $data[] = array(
+                'ProxyManagerTestAsset\\ClassWithSelfHint',
+                new ClassWithSelfHint(),
+                'selfHintMethod',
+                array('parameter' => $selfHintParam),
+                $selfHintParam
+            );
+        }
+
+        return $data;
+    }
+
+    /**
+     * Generates proxies and instances with a public property to feed to the property accessor methods
+     *
+     * @return array
+     */
+    public function getPropertyAccessProxies()
+    {
+        $instance1  = new BaseClass();
+        $proxyName1 = $this->generateProxy(get_class($instance1));
+
+        return array(
+            array(
+                $instance1,
+                new $proxyName1($instance1),
+                'publicProperty',
+                'publicPropertyDefault',
+            ),
+        );
+    }
+
+    /**
+     * @param object                     $instance
+     * @param AccessInterceptorInterface $proxy
+     */
+    private function assertProxySynchronized($instance, AccessInterceptorInterface $proxy)
+    {
+        $reflectionClass = new ReflectionClass($instance);
+
+        foreach ($reflectionClass->getProperties() as $property) {
+            $property->setAccessible(true);
+
+            $this->assertSame(
+                $property->getValue($instance),
+                $property->getValue($proxy),
+                'Property "' . $property->getName() . '" is synchronized between instance and proxy'
+            );
+        }
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Functional/AccessInterceptorValueHolderFunctionalTest.php
@@ -0,0 +1,360 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Functional;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolderGenerator;
+use ProxyManagerTestAsset\BaseClass;
+use ProxyManagerTestAsset\ClassWithPublicArrayProperty;
+use ProxyManagerTestAsset\ClassWithPublicProperties;
+use ProxyManagerTestAsset\ClassWithSelfHint;
+use ReflectionClass;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator} produced objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Functional
+ * @coversNothing
+ */
+class AccessInterceptorValueHolderFunctionalTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCalls($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+
+        /* @var $proxy \ProxyManager\Proxy\AccessInterceptorInterface|\ProxyManager\Proxy\ValueHolderInterface */
+        $proxy     = new $proxyName($instance);
+
+        $this->assertSame($instance, $proxy->getWrappedValueHolderValue());
+        $this->assertSame($expectedValue, call_user_func_array(array($proxy, $method), $params));
+
+        $listener  = $this->getMock('stdClass', array('__invoke'));
+        $listener
+            ->expects($this->once())
+            ->method('__invoke')
+            ->with($proxy, $instance, $method, $params, false);
+
+        $proxy->setMethodPrefixInterceptor(
+            $method,
+            function ($proxy, $instance, $method, $params, & $returnEarly) use ($listener) {
+                $listener->__invoke($proxy, $instance, $method, $params, $returnEarly);
+            }
+        );
+
+        $this->assertSame($expectedValue, call_user_func_array(array($proxy, $method), $params));
+
+        $random = uniqid();
+
+        $proxy->setMethodPrefixInterceptor(
+            $method,
+            function ($proxy, $instance, $method, $params, & $returnEarly) use ($random) {
+                $returnEarly = true;
+
+                return $random;
+            }
+        );
+
+        $this->assertSame($random, call_user_func_array(array($proxy, $method), $params));
+    }
+
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCallsWithSuffixListener($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+
+        /* @var $proxy \ProxyManager\Proxy\AccessInterceptorInterface|\ProxyManager\Proxy\ValueHolderInterface */
+        $proxy     = new $proxyName($instance);
+        $listener  = $this->getMock('stdClass', array('__invoke'));
+        $listener
+            ->expects($this->once())
+            ->method('__invoke')
+            ->with($proxy, $instance, $method, $params, $expectedValue, false);
+
+        $proxy->setMethodSuffixInterceptor(
+            $method,
+            function ($proxy, $instance, $method, $params, $returnValue, & $returnEarly) use ($listener) {
+                $listener->__invoke($proxy, $instance, $method, $params, $returnValue, $returnEarly);
+            }
+        );
+
+        $this->assertSame($expectedValue, call_user_func_array(array($proxy, $method), $params));
+
+        $random = uniqid();
+
+        $proxy->setMethodSuffixInterceptor(
+            $method,
+            function ($proxy, $instance, $method, $params, $returnValue, & $returnEarly) use ($random) {
+                $returnEarly = true;
+
+                return $random;
+            }
+        );
+
+        $this->assertSame($random, call_user_func_array(array($proxy, $method), $params));
+    }
+
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCallsAfterUnSerialization($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+        /* @var $proxy \ProxyManager\Proxy\AccessInterceptorInterface|\ProxyManager\Proxy\ValueHolderInterface */
+        $proxy     = unserialize(serialize(new $proxyName($instance)));
+
+        $this->assertSame($expectedValue, call_user_func_array(array($proxy, $method), $params));
+        $this->assertEquals($instance, $proxy->getWrappedValueHolderValue());
+    }
+
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCallsAfterCloning($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+
+        /* @var $proxy \ProxyManager\Proxy\AccessInterceptorInterface|\ProxyManager\Proxy\ValueHolderInterface */
+        $proxy     = new $proxyName($instance);
+        $cloned    = clone $proxy;
+
+        $this->assertNotSame($proxy->getWrappedValueHolderValue(), $cloned->getWrappedValueHolderValue());
+        $this->assertSame($expectedValue, call_user_func_array(array($cloned, $method), $params));
+        $this->assertEquals($instance, $cloned->getWrappedValueHolderValue());
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyReadAccess($instance, $proxy, $publicProperty, $propertyValue)
+    {
+        /* @var $proxy \ProxyManager\Proxy\AccessInterceptorInterface|\ProxyManager\Proxy\ValueHolderInterface */
+        $this->assertSame($propertyValue, $proxy->$publicProperty);
+        $this->assertEquals($instance, $proxy->getWrappedValueHolderValue());
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyWriteAccess($instance, $proxy, $publicProperty)
+    {
+        /* @var $proxy \ProxyManager\Proxy\AccessInterceptorInterface|\ProxyManager\Proxy\ValueHolderInterface */
+        $newValue               = uniqid();
+        $proxy->$publicProperty = $newValue;
+
+        $this->assertSame($newValue, $proxy->$publicProperty);
+        $this->assertSame($newValue, $proxy->getWrappedValueHolderValue()->$publicProperty);
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyExistence($instance, $proxy, $publicProperty)
+    {
+        /* @var $proxy \ProxyManager\Proxy\AccessInterceptorInterface|\ProxyManager\Proxy\ValueHolderInterface */
+        $this->assertSame(isset($instance->$publicProperty), isset($proxy->$publicProperty));
+        $this->assertEquals($instance, $proxy->getWrappedValueHolderValue());
+
+        $proxy->getWrappedValueHolderValue()->$publicProperty = null;
+        $this->assertFalse(isset($proxy->$publicProperty));
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyUnset($instance, $proxy, $publicProperty)
+    {
+        /* @var $proxy \ProxyManager\Proxy\AccessInterceptorInterface|\ProxyManager\Proxy\ValueHolderInterface */
+        $instance = $proxy->getWrappedValueHolderValue() ? $proxy->getWrappedValueHolderValue() : $instance;
+        unset($proxy->$publicProperty);
+
+        $this->assertFalse(isset($instance->$publicProperty));
+        $this->assertFalse(isset($proxy->$publicProperty));
+    }
+
+    /**
+     * Verifies that accessing a public property containing an array behaves like in a normal context
+     */
+    public function testCanWriteToArrayKeysInPublicProperty()
+    {
+        $instance    = new ClassWithPublicArrayProperty();
+        $className   = get_class($instance);
+        $proxyName   = $this->generateProxy($className);
+        /* @var $proxy ClassWithPublicArrayProperty */
+        $proxy       = new $proxyName($instance);
+
+        $proxy->arrayProperty['foo'] = 'bar';
+
+        $this->assertSame('bar', $proxy->arrayProperty['foo']);
+
+        $proxy->arrayProperty = array('tab' => 'taz');
+
+        $this->assertSame(array('tab' => 'taz'), $proxy->arrayProperty);
+    }
+
+    /**
+     * Verifies that public properties retrieved via `__get` don't get modified in the object state
+     */
+    public function testWillNotModifyRetrievedPublicProperties()
+    {
+        $instance    = new ClassWithPublicProperties();
+        $className   = get_class($instance);
+        $proxyName   = $this->generateProxy($className);
+        /* @var $proxy ClassWithPublicProperties */
+        $proxy       = new $proxyName($instance);
+        $variable    = $proxy->property0;
+
+        $this->assertSame('property0', $variable);
+
+        $variable = 'foo';
+
+        $this->assertSame('property0', $proxy->property0);
+    }
+
+    /**
+     * Verifies that public properties references retrieved via `__get` modify in the object state
+     */
+    public function testWillModifyByRefRetrievedPublicProperties()
+    {
+        $instance    = new ClassWithPublicProperties();
+        $className   = get_class($instance);
+        $proxyName   = $this->generateProxy($className);
+        /* @var $proxy ClassWithPublicProperties */
+        $proxy       = new $proxyName($instance);
+        $variable    = & $proxy->property0;
+
+        $this->assertSame('property0', $variable);
+
+        $variable = 'foo';
+
+        $this->assertSame('foo', $proxy->property0);
+    }
+
+    /**
+     * Generates a proxy for the given class name, and retrieves its class name
+     *
+     * @param string $parentClassName
+     *
+     * @return string
+     */
+    private function generateProxy($parentClassName)
+    {
+        $generatedClassName = __NAMESPACE__ . '\\' . UniqueIdentifierGenerator::getIdentifier('Foo');
+        $generator          = new AccessInterceptorValueHolderGenerator();
+        $generatedClass     = new ClassGenerator($generatedClassName);
+        $strategy           = new EvaluatingGeneratorStrategy();
+
+        $generator->generate(new ReflectionClass($parentClassName), $generatedClass);
+        $strategy->generate($generatedClass);
+
+        return $generatedClassName;
+    }
+
+    /**
+     * Generates a list of object | invoked method | parameters | expected result
+     *
+     * @return array
+     */
+    public function getProxyMethods()
+    {
+        $selfHintParam = new ClassWithSelfHint();
+
+        $data = array(
+            array(
+                'ProxyManagerTestAsset\\BaseClass',
+                new BaseClass(),
+                'publicMethod',
+                array(),
+                'publicMethodDefault'
+            ),
+            array(
+                'ProxyManagerTestAsset\\BaseClass',
+                new BaseClass(),
+                'publicTypeHintedMethod',
+                array('param' => new \stdClass()),
+                'publicTypeHintedMethodDefault'
+            ),
+            array(
+                'ProxyManagerTestAsset\\BaseClass',
+                new BaseClass(),
+                'publicByReferenceMethod',
+                array(),
+                'publicByReferenceMethodDefault'
+            ),
+            array(
+                'ProxyManagerTestAsset\\BaseInterface',
+                new BaseClass(),
+                'publicMethod',
+                array(),
+                'publicMethodDefault'
+            ),
+        );
+
+        if (PHP_VERSION_ID >= 50401) {
+            // PHP < 5.4.1 misbehaves, throwing strict standards, see https://bugs.php.net/bug.php?id=60573
+            $data[] = array(
+                'ProxyManagerTestAsset\\ClassWithSelfHint',
+                new ClassWithSelfHint(),
+                'selfHintMethod',
+                array('parameter' => $selfHintParam),
+                $selfHintParam
+            );
+        }
+
+        return $data;
+    }
+
+    /**
+     * Generates proxies and instances with a public property to feed to the property accessor methods
+     *
+     * @return array
+     */
+    public function getPropertyAccessProxies()
+    {
+        $instance1  = new BaseClass();
+        $proxyName1 = $this->generateProxy(get_class($instance1));
+        $instance2  = new BaseClass();
+        $proxyName2 = $this->generateProxy(get_class($instance2));
+
+        return array(
+            array(
+                $instance1,
+                new $proxyName1($instance1),
+                'publicProperty',
+                'publicPropertyDefault',
+            ),
+            array(
+                $instance2,
+                unserialize(serialize(new $proxyName2($instance2))),
+                'publicProperty',
+                'publicPropertyDefault',
+            ),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Functional/BaseLazyLoadingPerformanceTest.php
@@ -0,0 +1,196 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Functional;
+
+/**
+ * Base performance test logic for lazy loading proxies
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Performance
+ * @coversNothing
+ */
+abstract class BaseLazyLoadingPerformanceTest extends BasePerformanceTest
+{
+    /**
+     * @param string                                     $className
+     * @param object[]                                   $instances
+     * @param \ProxyManager\Proxy\LazyLoadingInterface[] $proxies
+     * @param string                                     $methodName
+     * @param array                                      $parameters
+     */
+    protected function profileMethodAccess($className, array $instances, array $proxies, $methodName, array $parameters)
+    {
+        $iterations = count($instances);
+
+        $this->startCapturing();
+
+        foreach ($instances as $instance) {
+            call_user_func_array(array($instance, $methodName), $parameters);
+        }
+
+        $baseProfile = $this->endCapturing(
+            $iterations . ' calls to ' . $className . '#' . $methodName . ': %fms / %fKb'
+        );
+        $this->startCapturing();
+
+        foreach ($proxies as $proxy) {
+            call_user_func_array(array($proxy, $methodName), $parameters);
+        }
+
+        $proxyProfile = $this->endCapturing(
+            $iterations . ' calls to proxied ' . $className . '#' . $methodName . ': %fms / %fKb'
+        );
+        $this->compareProfile($baseProfile, $proxyProfile);
+    }
+
+    /**
+     * @param string                                     $className
+     * @param object[]                                   $instances
+     * @param \ProxyManager\Proxy\LazyLoadingInterface[] $proxies
+     * @param string                                     $property
+     */
+    protected function profilePropertyWrites($className, array $instances, array $proxies, $property)
+    {
+        $iterations = count($instances);
+
+        $this->startCapturing();
+
+        foreach ($instances as $instance) {
+            $instance->$property = 'foo';
+        }
+
+        $baseProfile = $this->endCapturing(
+            $iterations . ' writes of ' . $className . '::' . $property . ': %fms / %fKb'
+        );
+        $this->startCapturing();
+
+        foreach ($proxies as $proxy) {
+            $proxy->$property = 'foo';
+        }
+
+        $proxyProfile = $this->endCapturing(
+            $iterations . ' writes of proxied ' . $className . '::' . $property . ': %fms / %fKb'
+        );
+        $this->compareProfile($baseProfile, $proxyProfile);
+    }
+
+    /**
+     * @param string                                     $className
+     * @param object[]                                   $instances
+     * @param \ProxyManager\Proxy\LazyLoadingInterface[] $proxies
+     * @param string                                     $property
+     */
+    protected function profilePropertyReads($className, array $instances, array $proxies, $property)
+    {
+        $iterations = count($instances);
+
+        $this->startCapturing();
+
+        foreach ($instances as $instance) {
+            $instance->$property;
+        }
+
+        $baseProfile = $this->endCapturing(
+            $iterations . ' reads of ' . $className . '::' . $property . ': %fms / %fKb'
+        );
+        $this->startCapturing();
+
+        foreach ($proxies as $proxy) {
+            $proxy->$property;
+        }
+
+        $proxyProfile = $this->endCapturing(
+            $iterations . ' reads of proxied ' . $className . '::' . $property . ': %fms / %fKb'
+        );
+        $this->compareProfile($baseProfile, $proxyProfile);
+    }
+
+    /**
+     * @param string                                     $className
+     * @param object[]                                   $instances
+     * @param \ProxyManager\Proxy\LazyLoadingInterface[] $proxies
+     * @param string                                     $property
+     */
+    protected function profilePropertyIsset($className, array $instances, array $proxies, $property)
+    {
+        $iterations = count($instances);
+
+        $this->startCapturing();
+
+        foreach ($instances as $instance) {
+            isset($instance->$property);
+        }
+
+        $baseProfile = $this->endCapturing(
+            $iterations . ' isset of ' . $className . '::' . $property . ': %fms / %fKb'
+        );
+        $this->startCapturing();
+
+        foreach ($proxies as $proxy) {
+            isset($proxy->$property);
+        }
+
+        $proxyProfile = $this->endCapturing(
+            $iterations . ' isset of proxied ' . $className . '::' . $property . ': %fms / %fKb'
+        );
+        $this->compareProfile($baseProfile, $proxyProfile);
+    }
+
+    /**
+     * @param string                                     $className
+     * @param object[]                                   $instances
+     * @param \ProxyManager\Proxy\LazyLoadingInterface[] $proxies
+     * @param string                                     $property
+     */
+    protected function profilePropertyUnset($className, array $instances, array $proxies, $property)
+    {
+        $iterations = count($instances);
+
+        $this->startCapturing();
+
+        foreach ($instances as $instance) {
+            unset($instance->$property);
+        }
+
+        $baseProfile = $this->endCapturing(
+            $iterations . ' unset of ' . $className . '::' . $property . ': %fms / %fKb'
+        );
+        $this->startCapturing();
+
+        foreach ($proxies as $proxy) {
+            unset($proxy->$property);
+        }
+
+        $proxyProfile = $this->endCapturing(
+            $iterations . ' unset of proxied ' . $className . '::' . $property . ': %fms / %fKb'
+        );
+        $this->compareProfile($baseProfile, $proxyProfile);
+    }
+
+    /**
+     * Generates a proxy for the given class name, and retrieves its class name
+     *
+     * @param string $parentClassName
+     *
+     * @return string
+     */
+    abstract protected function generateProxy($parentClassName);
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Functional/BasePerformanceTest.php
@@ -0,0 +1,101 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Functional;
+
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Base performance test logic
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Performance
+ * @coversNothing
+ */
+abstract class BasePerformanceTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var float time when last capture was started
+     */
+    private $startTime   = 0;
+
+    /**
+     * @var int bytes when last capture was started
+     */
+    private $startMemory = 0;
+
+    /**
+     * {@inheritDoc}
+     */
+    public static function setUpBeforeClass()
+    {
+        $header = "Performance test - " . get_called_class() . ":";
+
+        echo "\n\n" . str_repeat('=', strlen($header)) . "\n" . $header . "\n\n";
+    }
+
+    /**
+     * Start profiler snapshot
+     */
+    protected function startCapturing()
+    {
+        $this->startMemory = memory_get_usage();
+        $this->startTime   = microtime(true);
+    }
+
+    /**
+     * Echo current profiler output
+     *
+     * @param string $messageTemplate
+     *
+     * @return array
+     */
+    protected function endCapturing($messageTemplate)
+    {
+        $time     = microtime(true) - $this->startTime;
+        $memory   = memory_get_usage() - $this->startMemory;
+
+        if (gc_enable()) {
+            gc_collect_cycles();
+        }
+
+        echo sprintf($messageTemplate, $time, $memory / 1024) . "\n";
+
+        return array(
+            'time'   => $time,
+            'memory' => $memory
+        );
+    }
+
+    /**
+     * Display comparison between two profiles
+     *
+     * @param array $baseProfile
+     * @param array $proxyProfile
+     */
+    protected function compareProfile(array $baseProfile, array $proxyProfile)
+    {
+        $baseMemory     = max(1, $baseProfile['memory']);
+        $timeOverhead   = (($proxyProfile['time'] / $baseProfile['time']) - 1) * 100;
+        $memoryOverhead = (($proxyProfile['memory'] / $baseMemory) - 1) * 100;
+
+        echo sprintf('Comparison time / memory: %.2f%% / %.2f%%', $timeOverhead, $memoryOverhead) . "\n\n";
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Functional/FatalPreventionFunctionalTest.php
@@ -0,0 +1,171 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Functional;
+
+use PHPUnit_Framework_TestCase;
+use PHPUnit_Util_PHP;
+use ReflectionClass;
+
+/**
+ * Verifies that proxy-manager will not attempt to `eval()` code that will cause fatal errors
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Functional
+ * @coversNothing
+ */
+class FatalPreventionFunctionalTest extends PHPUnit_Framework_TestCase
+{
+    private $template = <<<'PHP'
+<?php
+
+require_once %s;
+
+$className               = %s;
+$generatedClass          = new ProxyManager\Generator\ClassGenerator(uniqid('generated'));
+$generatorStrategy       = new ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy();
+$classGenerator          = new %s;
+$classSignatureGenerator = new ProxyManager\Signature\ClassSignatureGenerator(
+    new ProxyManager\Signature\SignatureGenerator()
+);
+
+try {
+    $classGenerator->generate(new ReflectionClass($className), $generatedClass);
+    $classSignatureGenerator->addSignature($generatedClass, array('eval tests'));
+    $generatorStrategy->generate($generatedClass);
+} catch (ProxyManager\Exception\ExceptionInterface $e) {
+} catch (ReflectionException $e) {
+}
+
+echo 'SUCCESS: ' . %s;
+PHP;
+
+    /**
+     * Verifies that code generation and evaluation will not cause fatals with any given class
+     *
+     * @param string $generatorClass an instantiable class (no arguments) implementing
+     *                               the {@see \ProxyManager\ProxyGenerator\ProxyGeneratorInterface}
+     * @param string $className      a valid (existing/autoloadable) class name
+     *
+     * @dataProvider getTestedClasses
+     */
+    public function testCodeGeneration($generatorClass, $className)
+    {
+        if (defined('HHVM_VERSION')) {
+            $this->markTestSkipped('HHVM is just too slow for this kind of test right now.');
+        }
+
+        if (PHP_VERSION_ID < 50401) {
+            $this->markTestSkipped('Can\'t run this test suite on php < 5.4.1');
+        }
+
+        $runner = PHPUnit_Util_PHP::factory();
+
+        $code = sprintf(
+            $this->template,
+            var_export(realpath(__DIR__ . '/../../../vendor/autoload.php'), true),
+            var_export($className, true),
+            $generatorClass,
+            var_export($className, true)
+        );
+
+        $result = $runner->runJob($code, array('-n'));
+
+        if (('SUCCESS: ' . $className) !== $result['stdout']) {
+            $this->fail(sprintf(
+                "Crashed with class '%s' and generator '%s'.\n\nStdout:\n%s\nStderr:\n%s\nGenerated code:\n%s'",
+                $generatorClass,
+                $className,
+                $result['stdout'],
+                $result['stderr'],
+                $code
+            ));
+        }
+
+        $this->assertSame('SUCCESS: ' . $className, $result['stdout']);
+    }
+
+    /**
+     * @return string[][]
+     */
+    public function getTestedClasses()
+    {
+        $that = $this;
+
+        return call_user_func_array(
+            'array_merge',
+            array_map(
+                function ($generator) use ($that) {
+                    return array_map(
+                        function ($class) use ($generator) {
+                            return array($generator, $class);
+                        },
+                        $that->getProxyTestedClasses()
+                    );
+                },
+                array(
+                    'ProxyManager\\ProxyGenerator\\AccessInterceptorScopeLocalizerGenerator',
+                    'ProxyManager\\ProxyGenerator\\AccessInterceptorValueHolderGenerator',
+                    'ProxyManager\\ProxyGenerator\\LazyLoadingGhostGenerator',
+                    'ProxyManager\\ProxyGenerator\\LazyLoadingValueHolderGenerator',
+                    'ProxyManager\\ProxyGenerator\\NullObjectGenerator',
+                    'ProxyManager\\ProxyGenerator\\RemoteObjectGenerator',
+                )
+            )
+        );
+    }
+
+    /**
+     * @private (public only for PHP 5.3 compatibility)
+     *
+     * @return string[]
+     */
+    public function getProxyTestedClasses()
+    {
+        $skippedPaths = array(
+            realpath(__DIR__ . '/../../src'),
+            realpath(__DIR__ . '/../../vendor'),
+            realpath(__DIR__ . '/../../tests/ProxyManagerTest'),
+        );
+
+        return array_filter(
+            get_declared_classes(),
+            function ($className) use ($skippedPaths) {
+                $reflectionClass = new ReflectionClass($className);
+                $fileName        = $reflectionClass->getFileName();
+
+                if (! $fileName) {
+                    return false;
+                }
+
+                $realPath = realpath($fileName);
+
+                foreach ($skippedPaths as $skippedPath) {
+                    if (0 === strpos($realPath, $skippedPath)) {
+                        // skip classes defined within ProxyManager, vendor or the test suite
+                        return false;
+                    }
+                }
+
+                return true;
+            }
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Functional/LazyLoadingGhostFunctionalTest.php
@@ -0,0 +1,441 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Functional;
+
+use PHPUnit_Framework_TestCase;
+use PHPUnit_Framework_MockObject_MockObject as Mock;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
+use ProxyManager\Proxy\GhostObjectInterface;
+use ProxyManager\ProxyGenerator\LazyLoadingGhostGenerator;
+use ProxyManagerTestAsset\BaseClass;
+use ProxyManagerTestAsset\ClassWithPublicArrayProperty;
+use ProxyManagerTestAsset\ClassWithPublicProperties;
+use ProxyManagerTestAsset\ClassWithProtectedProperties;
+use ProxyManagerTestAsset\ClassWithPrivateProperties;
+use ProxyManagerTestAsset\ClassWithSelfHint;
+use ReflectionClass;
+use ReflectionProperty;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhostGenerator} produced objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Functional
+ * @coversNothing
+ */
+class LazyLoadingGhostFunctionalTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCalls($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+
+        /* @var $proxy \ProxyManager\Proxy\GhostObjectInterface|BaseClass */
+        $proxy = new $proxyName($this->createInitializer($className, $instance));
+
+        $this->assertFalse($proxy->isProxyInitialized());
+        $this->assertSame($expectedValue, call_user_func_array(array($proxy, $method), $params));
+        $this->assertTrue($proxy->isProxyInitialized());
+    }
+
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCallsAfterUnSerialization($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+
+        /* @var $proxy \ProxyManager\Proxy\GhostObjectInterface|BaseClass */
+        $proxy = unserialize(serialize(new $proxyName($this->createInitializer($className, $instance))));
+
+        $this->assertTrue($proxy->isProxyInitialized());
+        $this->assertSame($expectedValue, call_user_func_array(array($proxy, $method), $params));
+    }
+
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCallsAfterCloning($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+
+        /* @var $proxy \ProxyManager\Proxy\GhostObjectInterface|BaseClass */
+        $proxy  = new $proxyName($this->createInitializer($className, $instance));
+        $cloned = clone $proxy;
+
+        $this->assertTrue($cloned->isProxyInitialized());
+        $this->assertSame($expectedValue, call_user_func_array(array($cloned, $method), $params));
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyReadAccess($instance, $proxy, $publicProperty, $propertyValue)
+    {
+        /* @var $proxy \ProxyManager\Proxy\GhostObjectInterface */
+        $this->assertSame($propertyValue, $proxy->$publicProperty);
+        $this->assertTrue($proxy->isProxyInitialized());
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyWriteAccess($instance, $proxy, $publicProperty)
+    {
+        /* @var $proxy \ProxyManager\Proxy\GhostObjectInterface */
+        $newValue               = uniqid();
+        $proxy->$publicProperty = $newValue;
+
+        $this->assertTrue($proxy->isProxyInitialized());
+        $this->assertSame($newValue, $proxy->$publicProperty);
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyExistence($instance, $proxy, $publicProperty)
+    {
+        /* @var $proxy \ProxyManager\Proxy\GhostObjectInterface */
+        $this->assertSame(isset($instance->$publicProperty), isset($proxy->$publicProperty));
+        $this->assertTrue($proxy->isProxyInitialized());
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyAbsence($instance, $proxy, $publicProperty)
+    {
+        /* @var $proxy \ProxyManager\Proxy\GhostObjectInterface */
+        $proxy->$publicProperty = null;
+        $this->assertFalse(isset($proxy->$publicProperty));
+        $this->assertTrue($proxy->isProxyInitialized());
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyUnset($instance, $proxy, $publicProperty)
+    {
+        /* @var $proxy \ProxyManager\Proxy\GhostObjectInterface */
+
+        unset($proxy->$publicProperty);
+
+        $this->assertTrue($proxy->isProxyInitialized());
+        $this->assertTrue(isset($instance->$publicProperty));
+        $this->assertFalse(isset($proxy->$publicProperty));
+    }
+
+    /**
+     * Verifies that accessing a public property containing an array behaves like in a normal context
+     */
+    public function testCanWriteToArrayKeysInPublicProperty()
+    {
+        $instance    = new ClassWithPublicArrayProperty();
+        $className   = get_class($instance);
+        $initializer = $this->createInitializer($className, $instance);
+        $proxyName   = $this->generateProxy($className);
+        /* @var $proxy ClassWithPublicArrayProperty */
+        $proxy       = new $proxyName($initializer);
+
+        $proxy->arrayProperty['foo'] = 'bar';
+
+        $this->assertSame('bar', $proxy->arrayProperty['foo']);
+
+        $proxy->arrayProperty = array('tab' => 'taz');
+
+        $this->assertSame(array('tab' => 'taz'), $proxy->arrayProperty);
+    }
+
+    /**
+     * Verifies that public properties retrieved via `__get` don't get modified in the object itself
+     */
+    public function testWillNotModifyRetrievedPublicProperties()
+    {
+        $instance    = new ClassWithPublicProperties();
+        $className   = get_class($instance);
+        $initializer = $this->createInitializer($className, $instance);
+        $proxyName   = $this->generateProxy($className);
+        /* @var $proxy ClassWithPublicProperties */
+        $proxy       = new $proxyName($initializer);
+        $variable    = $proxy->property0;
+
+        $this->assertSame('property0', $variable);
+
+        $variable = 'foo';
+
+        $this->assertSame('property0', $proxy->property0);
+    }
+
+    /**
+     * Verifies that public properties references retrieved via `__get` modify in the object state
+     */
+    public function testWillModifyByRefRetrievedPublicProperties()
+    {
+        $instance    = new ClassWithPublicProperties();
+        $className   = get_class($instance);
+        $initializer = $this->createInitializer($className, $instance);
+        $proxyName   = $this->generateProxy($className);
+        /* @var $proxy ClassWithPublicProperties */
+        $proxy       = new $proxyName($initializer);
+        $variable    = & $proxy->property0;
+
+        $this->assertSame('property0', $variable);
+
+        $variable = 'foo';
+
+        $this->assertSame('foo', $proxy->property0);
+    }
+
+    public function testKeepsInitializerWhenNotOverwitten()
+    {
+        $instance    = new BaseClass();
+        $proxyName   = $this->generateProxy(get_class($instance));
+        $initializer = function () {
+        };
+        /* @var $proxy \ProxyManager\Proxy\GhostObjectInterface */
+        $proxy       = new $proxyName($initializer);
+
+        $proxy->initializeProxy();
+
+        $this->assertSame($initializer, $proxy->getProxyInitializer());
+    }
+
+    /**
+     * Verifies that public properties are not being initialized multiple times
+     */
+    public function testKeepsInitializedPublicProperties()
+    {
+        $instance    = new BaseClass();
+        $proxyName   = $this->generateProxy(get_class($instance));
+        $initializer = function (BaseClass $proxy, $method, $parameters, & $initializer) {
+            $initializer           = null;
+            $proxy->publicProperty = 'newValue';
+        };
+        /* @var $proxy \ProxyManager\Proxy\GhostObjectInterface|BaseClass */
+        $proxy       = new $proxyName($initializer);
+
+        $proxy->initializeProxy();
+        $this->assertSame('newValue', $proxy->publicProperty);
+
+        $proxy->publicProperty = 'otherValue';
+
+        $proxy->initializeProxy();
+
+        $this->assertSame('otherValue', $proxy->publicProperty);
+    }
+
+    /**
+     * Verifies that properties' default values are preserved
+     */
+    public function testPublicPropertyDefaultWillBePreserved()
+    {
+        $instance    = new ClassWithPublicProperties();
+        $proxyName   = $this->generateProxy(get_class($instance));
+        /* @var $proxy ClassWithPublicProperties */
+        $proxy       = new $proxyName(function () {
+        });
+
+        $this->assertSame('property0', $proxy->property0);
+    }
+
+    /**
+     * Verifies that protected properties' default values are preserved
+     */
+    public function testProtectedPropertyDefaultWillBePreserved()
+    {
+        $instance    = new ClassWithProtectedProperties();
+        $proxyName   = $this->generateProxy(get_class($instance));
+        /* @var $proxy ClassWithProtectedProperties */
+        $proxy       = new $proxyName(function () {
+        });
+
+        // Check protected property via reflection
+        $reflectionProperty = new ReflectionProperty($instance, 'property0');
+        $reflectionProperty->setAccessible(true);
+
+        $this->assertSame('property0', $reflectionProperty->getValue($proxy));
+    }
+
+    /**
+     * Verifies that private properties' default values are preserved
+     */
+    public function testPrivatePropertyDefaultWillBePreserved()
+    {
+        $instance  = new ClassWithPrivateProperties();
+        $proxyName = $this->generateProxy(get_class($instance));
+        /* @var $proxy ClassWithPrivateProperties */
+        $proxy     = new $proxyName(function () {
+        });
+
+        // Check protected property via reflection
+        $reflectionProperty = new ReflectionProperty($instance, 'property0');
+        $reflectionProperty->setAccessible(true);
+
+        $this->assertSame('property0', $reflectionProperty->getValue($proxy));
+    }
+
+    /**
+     * Generates a proxy for the given class name, and retrieves its class name
+     *
+     * @param string $parentClassName
+     *
+     * @return string
+     */
+    private function generateProxy($parentClassName)
+    {
+        $generatedClassName = __NAMESPACE__ . '\\' . UniqueIdentifierGenerator::getIdentifier('Foo');
+        $generator          = new LazyLoadingGhostGenerator();
+        $generatedClass     = new ClassGenerator($generatedClassName);
+        $strategy           = new EvaluatingGeneratorStrategy();
+
+        $generator->generate(new ReflectionClass($parentClassName), $generatedClass);
+        $strategy->generate($generatedClass);
+
+        return $generatedClassName;
+    }
+
+    /**
+     * @param string $className
+     * @param object $realInstance
+     * @param Mock   $initializerMatcher
+     *
+     * @return \Closure
+     */
+    private function createInitializer($className, $realInstance, Mock $initializerMatcher = null)
+    {
+        if (null === $initializerMatcher) {
+            $initializerMatcher = $this->getMock('stdClass', array('__invoke'));
+
+            $initializerMatcher
+                ->expects($this->once())
+                ->method('__invoke')
+                ->with(
+                    $this->logicalAnd(
+                        $this->isInstanceOf('ProxyManager\\Proxy\\GhostObjectInterface'),
+                        $this->isInstanceOf($className)
+                    )
+                );
+        }
+
+        $initializerMatcher = $initializerMatcher ?: $this->getMock('stdClass', array('__invoke'));
+
+        return function (
+            GhostObjectInterface $proxy,
+            $method,
+            $params,
+            & $initializer
+        ) use (
+            $initializerMatcher,
+            $realInstance
+        ) {
+            $initializer     = null;
+            $reflectionClass = new ReflectionClass($realInstance);
+
+            foreach ($reflectionClass->getProperties() as $property) {
+                $property->setAccessible(true);
+                $property->setValue($proxy, $property->getValue($realInstance));
+            }
+
+            $initializerMatcher->__invoke($proxy, $method, $params);
+        };
+    }
+
+    /**
+     * Generates a list of object | invoked method | parameters | expected result
+     *
+     * @return array
+     */
+    public function getProxyMethods()
+    {
+        $selfHintParam = new ClassWithSelfHint();
+
+        $data = array(
+            array(
+                'ProxyManagerTestAsset\\BaseClass',
+                new BaseClass(),
+                'publicMethod',
+                array(),
+                'publicMethodDefault'
+            ),
+            array(
+                'ProxyManagerTestAsset\\BaseClass',
+                new BaseClass(),
+                'publicTypeHintedMethod',
+                array(new \stdClass()),
+                'publicTypeHintedMethodDefault'
+            ),
+            array(
+                'ProxyManagerTestAsset\\BaseClass',
+                new BaseClass(),
+                'publicByReferenceMethod',
+                array(),
+                'publicByReferenceMethodDefault'
+            ),
+        );
+
+        if (PHP_VERSION_ID >= 50401) {
+            // PHP < 5.4.1 misbehaves, throwing strict standards, see https://bugs.php.net/bug.php?id=60573
+            $data[] = array(
+                'ProxyManagerTestAsset\\ClassWithSelfHint',
+                new ClassWithSelfHint(),
+                'selfHintMethod',
+                array('parameter' => $selfHintParam),
+                $selfHintParam
+            );
+        }
+
+        return $data;
+    }
+
+    /**
+     * Generates proxies and instances with a public property to feed to the property accessor methods
+     *
+     * @return array
+     */
+    public function getPropertyAccessProxies()
+    {
+        $instance1 = new BaseClass();
+        $proxyName1 = $this->generateProxy(get_class($instance1));
+        $instance2 = new BaseClass();
+        $proxyName2 = $this->generateProxy(get_class($instance2));
+
+        return array(
+            array(
+                $instance1,
+                new $proxyName1($this->createInitializer('ProxyManagerTestAsset\\BaseClass', $instance1)),
+                'publicProperty',
+                'publicPropertyDefault',
+            ),
+            array(
+                $instance2,
+                unserialize(
+                    serialize(new $proxyName2($this->createInitializer('ProxyManagerTestAsset\\BaseClass', $instance2)))
+                ),
+                'publicProperty',
+                'publicPropertyDefault',
+            ),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Functional/LazyLoadingGhostPerformanceTest.php
@@ -0,0 +1,160 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Functional;
+
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
+use ProxyManager\Proxy\GhostObjectInterface;
+use ProxyManager\ProxyGenerator\LazyLoadingGhostGenerator;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhostGenerator} produced objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Performance
+ * @coversNothing
+ */
+class LazyLoadingGhostPerformanceTest extends BaseLazyLoadingPerformanceTest
+{
+    /**
+     * @outputBuffering
+     * @dataProvider getTestedClasses
+     *
+     * @param string                $className
+     * @param array                 $methods
+     * @param array                 $properties
+     * @param \ReflectionProperty[] $reflectionProperties
+     *
+     * @return void
+     */
+    public function testProxyInstantiationPerformance(
+        $className,
+        array $methods,
+        array $properties,
+        array $reflectionProperties
+    ) {
+        $proxyName    = $this->generateProxy($className);
+        $iterations   = 20000;
+        $instances    = array();
+        /* @var $proxies \ProxyManager\Proxy\GhostObjectInterface[] */
+        $proxies      = array();
+        $realInstance = new $className();
+        $initializer  = function (
+            GhostObjectInterface $proxy,
+            $method,
+            $params,
+            & $initializer
+        ) use (
+            $reflectionProperties,
+            $realInstance
+        ) {
+            $initializer = null;
+
+            foreach ($reflectionProperties as $reflectionProperty) {
+                $reflectionProperty->setValue($proxy, $reflectionProperty->getValue($realInstance));
+            }
+
+            return true;
+        };
+
+        $this->startCapturing();
+
+        for ($i = 0; $i < $iterations; $i += 1) {
+            $instances[] = new $className();
+        }
+
+        $baseProfile = $this->endCapturing(
+            'Instantiation for ' . $iterations . ' objects of type ' . $className . ': %fms / %fKb'
+        );
+        $this->startCapturing();
+
+        for ($i = 0; $i < $iterations; $i += 1) {
+            $proxies[] = new $proxyName($initializer);
+        }
+
+        $proxyProfile = $this->endCapturing(
+            'Instantiation for ' . $iterations . ' proxies of type ' . $className . ': %fms / %fKb'
+        );
+        $this->compareProfile($baseProfile, $proxyProfile);
+        $this->startCapturing();
+
+        foreach ($proxies as $proxy) {
+            $proxy->initializeProxy();
+        }
+
+        $this->endCapturing('Initialization of ' . $iterations . ' proxies of type ' . $className . ': %fms / %fKb');
+
+        foreach ($methods as $methodName => $parameters) {
+            $this->profileMethodAccess($className, $instances, $proxies, $methodName, $parameters);
+        }
+
+        foreach ($properties as $property) {
+            $this->profilePropertyWrites($className, $instances, $proxies, $property);
+            $this->profilePropertyReads($className, $instances, $proxies, $property);
+            $this->profilePropertyIsset($className, $instances, $proxies, $property);
+            $this->profilePropertyUnset($className, $instances, $proxies, $property);
+        }
+    }
+
+    /**
+     * @return array
+     */
+    public function getTestedClasses()
+    {
+        $testedClasses = array(
+            array('stdClass', array(), array()),
+            array('ProxyManagerTestAsset\\BaseClass', array('publicMethod' => array()), array('publicProperty')),
+        );
+
+        foreach ($testedClasses as $key => $testedClass) {
+            $reflectionProperties = array();
+            $reflectionClass      = new ReflectionClass($testedClass[0]);
+
+            foreach ($reflectionClass->getProperties() as $property) {
+                $property->setAccessible(true);
+
+                $reflectionProperties[$property->getName()] = $property;
+            }
+
+            $testedClasses[$key][] = $reflectionProperties;
+        }
+
+        return $testedClasses;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function generateProxy($parentClassName)
+    {
+        $generatedClassName = __NAMESPACE__ . '\\' . UniqueIdentifierGenerator::getIdentifier('Foo');
+        $generator          = new LazyLoadingGhostGenerator();
+        $generatedClass     = new ClassGenerator($generatedClassName);
+        $strategy           = new EvaluatingGeneratorStrategy();
+
+        $generator->generate(new ReflectionClass($parentClassName), $generatedClass);
+        $strategy->generate($generatedClass);
+
+        return $generatedClassName;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Functional/LazyLoadingValueHolderFunctionalTest.php
@@ -0,0 +1,386 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Functional;
+
+use PHPUnit_Framework_TestCase;
+use PHPUnit_Framework_MockObject_MockObject as Mock;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
+use ProxyManager\Proxy\VirtualProxyInterface;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator;
+use ProxyManagerTestAsset\BaseClass;
+use ProxyManagerTestAsset\ClassWithPublicArrayProperty;
+use ProxyManagerTestAsset\ClassWithPublicProperties;
+use ProxyManagerTestAsset\ClassWithSelfHint;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator} produced objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Functional
+ * @coversNothing
+ */
+class LazyLoadingValueHolderFunctionalTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCalls($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+
+        /* @var $proxy \ProxyManager\Proxy\VirtualProxyInterface|BaseClass */
+        $proxy = new $proxyName($this->createInitializer($className, $instance));
+
+        $this->assertFalse($proxy->isProxyInitialized());
+        $this->assertSame($expectedValue, call_user_func_array(array($proxy, $method), $params));
+        $this->assertTrue($proxy->isProxyInitialized());
+        $this->assertSame($instance, $proxy->getWrappedValueHolderValue());
+    }
+
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCallsAfterUnSerialization($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+
+        /* @var $proxy \ProxyManager\Proxy\VirtualProxyInterface|BaseClass */
+        $proxy = unserialize(serialize(new $proxyName($this->createInitializer($className, $instance))));
+
+        $this->assertTrue($proxy->isProxyInitialized());
+        $this->assertSame($expectedValue, call_user_func_array(array($proxy, $method), $params));
+        $this->assertEquals($instance, $proxy->getWrappedValueHolderValue());
+    }
+
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCallsAfterCloning($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+
+        /* @var $proxy \ProxyManager\Proxy\VirtualProxyInterface|BaseClass */
+        $proxy  = new $proxyName($this->createInitializer($className, $instance));
+        $cloned = clone $proxy;
+
+        $this->assertTrue($cloned->isProxyInitialized());
+        $this->assertNotSame($proxy->getWrappedValueHolderValue(), $cloned->getWrappedValueHolderValue());
+        $this->assertSame($expectedValue, call_user_func_array(array($cloned, $method), $params));
+        $this->assertEquals($instance, $cloned->getWrappedValueHolderValue());
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyReadAccess($instance, $proxy, $publicProperty, $propertyValue)
+    {
+        /* @var $proxy \ProxyManager\Proxy\VirtualProxyInterface|BaseClass */
+        $this->assertSame($propertyValue, $proxy->$publicProperty);
+        $this->assertTrue($proxy->isProxyInitialized());
+        $this->assertEquals($instance, $proxy->getWrappedValueHolderValue());
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyWriteAccess($instance, $proxy, $publicProperty)
+    {
+        /* @var $proxy \ProxyManager\Proxy\VirtualProxyInterface|BaseClass */
+        $newValue               = uniqid();
+        $proxy->$publicProperty = $newValue;
+
+        $this->assertTrue($proxy->isProxyInitialized());
+        $this->assertSame($newValue, $proxy->$publicProperty);
+        $this->assertSame($newValue, $proxy->getWrappedValueHolderValue()->$publicProperty);
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyExistence($instance, $proxy, $publicProperty)
+    {
+        /* @var $proxy \ProxyManager\Proxy\VirtualProxyInterface|BaseClass */
+        $this->assertSame(isset($instance->$publicProperty), isset($proxy->$publicProperty));
+        $this->assertTrue($proxy->isProxyInitialized());
+        $this->assertEquals($instance, $proxy->getWrappedValueHolderValue());
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyAbsence($instance, $proxy, $publicProperty)
+    {
+        /* @var $proxy \ProxyManager\Proxy\VirtualProxyInterface|BaseClass */
+        $instance = $proxy->getWrappedValueHolderValue() ? $proxy->getWrappedValueHolderValue() : $instance;
+        $instance->$publicProperty = null;
+        $this->assertFalse(isset($proxy->$publicProperty));
+        $this->assertTrue($proxy->isProxyInitialized());
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyUnset($instance, $proxy, $publicProperty)
+    {
+        /* @var $proxy \ProxyManager\Proxy\VirtualProxyInterface|BaseClass */
+        $instance = $proxy->getWrappedValueHolderValue() ? $proxy->getWrappedValueHolderValue() : $instance;
+        unset($proxy->$publicProperty);
+
+        $this->assertTrue($proxy->isProxyInitialized());
+
+        $this->assertFalse(isset($instance->$publicProperty));
+        $this->assertFalse(isset($proxy->$publicProperty));
+    }
+
+    /**
+     * Verifies that accessing a public property containing an array behaves like in a normal context
+     */
+    public function testCanWriteToArrayKeysInPublicProperty()
+    {
+        $instance    = new ClassWithPublicArrayProperty();
+        $className   = get_class($instance);
+        $initializer = $this->createInitializer($className, $instance);
+        $proxyName   = $this->generateProxy($className);
+        /* @var $proxy ClassWithPublicArrayProperty */
+        $proxy       = new $proxyName($initializer);
+
+        $proxy->arrayProperty['foo'] = 'bar';
+
+        $this->assertSame('bar', $proxy->arrayProperty['foo']);
+
+        $proxy->arrayProperty = array('tab' => 'taz');
+
+        $this->assertSame(array('tab' => 'taz'), $proxy->arrayProperty);
+    }
+
+    /**
+     * Verifies that public properties retrieved via `__get` don't get modified in the object itself
+     */
+    public function testWillNotModifyRetrievedPublicProperties()
+    {
+        $instance    = new ClassWithPublicProperties();
+        $className   = get_class($instance);
+        $initializer = $this->createInitializer($className, $instance);
+        $proxyName   = $this->generateProxy($className);
+        /* @var $proxy ClassWithPublicProperties */
+        $proxy       = new $proxyName($initializer);
+        $variable    = $proxy->property0;
+
+        $this->assertSame('property0', $variable);
+
+        $variable = 'foo';
+
+        $this->assertSame('property0', $proxy->property0);
+    }
+
+    /**
+     * Verifies that public properties references retrieved via `__get` modify in the object state
+     */
+    public function testWillModifyByRefRetrievedPublicProperties()
+    {
+        $instance    = new ClassWithPublicProperties();
+        $className   = get_class($instance);
+        $initializer = $this->createInitializer($className, $instance);
+        $proxyName   = $this->generateProxy($className);
+        /* @var $proxy ClassWithPublicProperties */
+        $proxy       = new $proxyName($initializer);
+        $variable    = & $proxy->property0;
+
+        $this->assertSame('property0', $variable);
+
+        $variable = 'foo';
+
+        $this->assertSame('foo', $proxy->property0);
+    }
+
+    /**
+     * @group 16
+     *
+     * Verifies that initialization of a value holder proxy may happen multiple times
+     */
+    public function testWillAllowMultipleProxyInitialization()
+    {
+        $proxyClass  = $this->generateProxy('ProxyManagerTestAsset\\BaseClass');
+        $counter     = 0;
+        $initializer = function (& $wrappedInstance) use (& $counter) {
+            $wrappedInstance = new BaseClass();
+
+            $wrappedInstance->publicProperty = (string) ($counter += 1);
+        };
+
+        /* @var $proxy BaseClass */
+        $proxy = new $proxyClass($initializer);
+
+        $this->assertSame('1', $proxy->publicProperty);
+        $this->assertSame('2', $proxy->publicProperty);
+        $this->assertSame('3', $proxy->publicProperty);
+    }
+
+    /**
+     * Generates a proxy for the given class name, and retrieves its class name
+     *
+     * @param string $parentClassName
+     *
+     * @return string
+     */
+    private function generateProxy($parentClassName)
+    {
+        $generatedClassName = __NAMESPACE__ . '\\' . UniqueIdentifierGenerator::getIdentifier('Foo');
+        $generator          = new LazyLoadingValueHolderGenerator();
+        $generatedClass     = new ClassGenerator($generatedClassName);
+        $strategy           = new EvaluatingGeneratorStrategy();
+
+        $generator->generate(new ReflectionClass($parentClassName), $generatedClass);
+        $strategy->generate($generatedClass);
+
+        return $generatedClassName;
+    }
+
+    /**
+     * @param string $className
+     * @param object $realInstance
+     * @param Mock   $initializerMatcher
+     *
+     * @return \Closure
+     */
+    private function createInitializer($className, $realInstance, Mock $initializerMatcher = null)
+    {
+        if (null === $initializerMatcher) {
+            $initializerMatcher = $this->getMock('stdClass', array('__invoke'));
+
+            $initializerMatcher
+                ->expects($this->once())
+                ->method('__invoke')
+                ->with(
+                    $this->logicalAnd(
+                        $this->isInstanceOf('ProxyManager\\Proxy\\VirtualProxyInterface'),
+                        $this->isInstanceOf($className)
+                    ),
+                    $realInstance
+                );
+        }
+
+        $initializerMatcher = $initializerMatcher ?: $this->getMock('stdClass', array('__invoke'));
+
+        return function (
+            & $wrappedObject,
+            VirtualProxyInterface $proxy,
+            $method,
+            $params,
+            & $initializer
+        ) use (
+            $initializerMatcher,
+            $realInstance
+        ) {
+            $initializer   = null;
+            $wrappedObject = $realInstance;
+
+            $initializerMatcher->__invoke($proxy, $wrappedObject, $method, $params);
+        };
+    }
+
+    /**
+     * Generates a list of object | invoked method | parameters | expected result
+     *
+     * @return array
+     */
+    public function getProxyMethods()
+    {
+        $selfHintParam = new ClassWithSelfHint();
+
+        $data = array(
+            array(
+                'ProxyManagerTestAsset\\BaseClass',
+                new BaseClass(),
+                'publicMethod',
+                array(),
+                'publicMethodDefault'
+            ),
+            array(
+                'ProxyManagerTestAsset\\BaseClass',
+                new BaseClass(),
+                'publicTypeHintedMethod',
+                array(new \stdClass()),
+                'publicTypeHintedMethodDefault'
+            ),
+            array(
+                'ProxyManagerTestAsset\\BaseClass',
+                new BaseClass(),
+                'publicByReferenceMethod',
+                array(),
+                'publicByReferenceMethodDefault'
+            ),
+            array(
+                'ProxyManagerTestAsset\\BaseInterface',
+                new BaseClass(),
+                'publicMethod',
+                array(),
+                'publicMethodDefault'
+            ),
+        );
+
+        if (PHP_VERSION_ID >= 50401) {
+            // PHP < 5.4.1 misbehaves, throwing strict standards, see https://bugs.php.net/bug.php?id=60573
+            $data[] = array(
+                'ProxyManagerTestAsset\\ClassWithSelfHint',
+                new ClassWithSelfHint(),
+                'selfHintMethod',
+                array('parameter' => $selfHintParam),
+                $selfHintParam
+            );
+        }
+
+        return $data;
+    }
+
+    /**
+     * Generates proxies and instances with a public property to feed to the property accessor methods
+     *
+     * @return array
+     */
+    public function getPropertyAccessProxies()
+    {
+        $instance1 = new BaseClass();
+        $proxyName1 = $this->generateProxy(get_class($instance1));
+        $instance2 = new BaseClass();
+        $proxyName2 = $this->generateProxy(get_class($instance2));
+
+        return array(
+            array(
+                $instance1,
+                new $proxyName1($this->createInitializer('ProxyManagerTestAsset\\BaseClass', $instance1)),
+                'publicProperty',
+                'publicPropertyDefault',
+            ),
+            array(
+                $instance2,
+                unserialize(
+                    serialize(new $proxyName2($this->createInitializer('ProxyManagerTestAsset\\BaseClass', $instance2)))
+                ),
+                'publicProperty',
+                'publicPropertyDefault',
+            ),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Functional/LazyLoadingValueHolderPerformanceTest.php
@@ -0,0 +1,134 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Functional;
+
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
+use ProxyManager\Proxy\VirtualProxyInterface;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator} produced objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Performance
+ * @coversNothing
+ */
+class LazyLoadingValueHolderPerformanceTest extends BaseLazyLoadingPerformanceTest
+{
+    /**
+     * @outputBuffering
+     * @dataProvider getTestedClasses
+     *
+     * @param string $className
+     * @param array  $methods
+     * @param array  $properties
+     *
+     * @return void
+     */
+    public function testProxyInstantiationPerformance($className, array $methods, array $properties)
+    {
+        $proxyName   = $this->generateProxy($className);
+        $iterations  = 20000;
+        $instances   = array();
+        /* @var $proxies \ProxyManager\Proxy\VirtualProxyInterface[] */
+        $proxies     = array();
+        $initializer = function (
+            & $valueHolder,
+            VirtualProxyInterface $proxy,
+            $method,
+            $params,
+            & $initializer
+        ) use ($className) {
+            $initializer = null;
+            $valueHolder = new $className();
+
+            return true;
+        };
+
+        $this->startCapturing();
+
+        for ($i = 0; $i < $iterations; $i += 1) {
+            $instances[] = new $className();
+        }
+
+        $baseProfile = $this->endCapturing(
+            'Instantiation for ' . $iterations . ' objects of type ' . $className . ': %fms / %fKb'
+        );
+        $this->startCapturing();
+
+        for ($i = 0; $i < $iterations; $i += 1) {
+            $proxies[] = new $proxyName($initializer);
+        }
+
+        $proxyProfile = $this->endCapturing(
+            'Instantiation for ' . $iterations . ' proxies of type ' . $className . ': %fms / %fKb'
+        );
+        $this->compareProfile($baseProfile, $proxyProfile);
+        $this->startCapturing();
+
+        foreach ($proxies as $proxy) {
+            $proxy->initializeProxy();
+        }
+
+        $this->endCapturing('Initialization of ' . $iterations . ' proxies of type ' . $className . ': %fms / %fKb');
+
+        foreach ($methods as $methodName => $parameters) {
+            $this->profileMethodAccess($className, $instances, $proxies, $methodName, $parameters);
+        }
+
+        foreach ($properties as $property) {
+            $this->profilePropertyWrites($className, $instances, $proxies, $property);
+            $this->profilePropertyReads($className, $instances, $proxies, $property);
+            $this->profilePropertyIsset($className, $instances, $proxies, $property);
+            $this->profilePropertyUnset($className, $instances, $proxies, $property);
+        }
+    }
+
+    /**
+     * @return array
+     */
+    public function getTestedClasses()
+    {
+        return array(
+            array('stdClass', array(), array()),
+            array('ProxyManagerTestAsset\\BaseClass', array('publicMethod' => array()), array('publicProperty')),
+        );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function generateProxy($parentClassName)
+    {
+        $generatedClassName = __NAMESPACE__ . '\\' . UniqueIdentifierGenerator::getIdentifier('Foo');
+        $generator          = new LazyLoadingValueHolderGenerator();
+        $generatedClass     = new ClassGenerator($generatedClassName);
+        $strategy           = new EvaluatingGeneratorStrategy();
+
+        $generator->generate(new ReflectionClass($parentClassName), $generatedClass);
+        $strategy->generate($generatedClass);
+
+        return $generatedClassName;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Functional/MultipleProxyGenerationTest.php
@@ -0,0 +1,123 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Functional;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory;
+use ProxyManager\Factory\AccessInterceptorValueHolderFactory;
+use ProxyManager\Factory\LazyLoadingGhostFactory;
+use ProxyManager\Factory\LazyLoadingValueHolderFactory;
+use ReflectionClass;
+use ReflectionProperty;
+
+/**
+ * Verifies that proxy factories don't conflict with each other when generating proxies
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @link https://github.com/Ocramius/ProxyManager/issues/10
+ *
+ * @group Functional
+ * @group issue-10
+ * @coversNothing
+ */
+class MultipleProxyGenerationTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * Verifies that proxies generated from different factories will retain their specific implementation
+     * and won't conflict
+     *
+     * @dataProvider getTestedClasses
+     */
+    public function testCanGenerateMultipleDifferentProxiesForSameClass($className)
+    {
+        $skipScopeLocalizerTests                = false;
+        $ghostProxyFactory                      = new LazyLoadingGhostFactory();
+        $virtualProxyFactory                    = new LazyLoadingValueHolderFactory();
+        $accessInterceptorFactory               = new AccessInterceptorValueHolderFactory();
+        $accessInterceptorScopeLocalizerFactory = new AccessInterceptorScopeLocalizerFactory();
+        $initializer                            = function () {
+        };
+
+        $reflectionClass = new ReflectionClass($className);
+
+        if ((! method_exists('Closure', 'bind')) && $reflectionClass->getProperties(ReflectionProperty::IS_PRIVATE)) {
+            $skipScopeLocalizerTests = true;
+        }
+
+        $generated = array(
+            $ghostProxyFactory->createProxy($className, $initializer),
+            $virtualProxyFactory->createProxy($className, $initializer),
+            $accessInterceptorFactory->createProxy(new $className()),
+        );
+
+        if (! $skipScopeLocalizerTests) {
+            $generated[] = $accessInterceptorScopeLocalizerFactory->createProxy(new $className());
+        }
+
+        foreach ($generated as $key => $proxy) {
+            $this->assertInstanceOf($className, $proxy);
+
+            foreach ($generated as $comparedKey => $comparedProxy) {
+                if ($comparedKey === $key) {
+                    continue;
+                }
+
+                $this->assertNotSame(get_class($comparedProxy), get_class($proxy));
+            }
+        }
+
+        $this->assertInstanceOf('ProxyManager\Proxy\GhostObjectInterface', $generated[0]);
+        $this->assertInstanceOf('ProxyManager\Proxy\VirtualProxyInterface', $generated[1]);
+        $this->assertInstanceOf('ProxyManager\Proxy\AccessInterceptorInterface', $generated[2]);
+        $this->assertInstanceOf('ProxyManager\Proxy\ValueHolderInterface', $generated[2]);
+
+        if (! $skipScopeLocalizerTests) {
+            $this->assertInstanceOf('ProxyManager\Proxy\AccessInterceptorInterface', $generated[3]);
+        }
+    }
+
+    /**
+     * @return string[][]
+     */
+    public function getTestedClasses()
+    {
+        $data = array(
+            array('ProxyManagerTestAsset\\BaseClass'),
+            array('ProxyManagerTestAsset\\ClassWithMagicMethods'),
+            array('ProxyManagerTestAsset\\ClassWithFinalMethods'),
+            array('ProxyManagerTestAsset\\ClassWithFinalMagicMethods'),
+            array('ProxyManagerTestAsset\\ClassWithByRefMagicMethods'),
+            array('ProxyManagerTestAsset\\ClassWithMixedProperties'),
+            array('ProxyManagerTestAsset\\ClassWithPrivateProperties'),
+            array('ProxyManagerTestAsset\\ClassWithProtectedProperties'),
+            array('ProxyManagerTestAsset\\ClassWithPublicProperties'),
+            array('ProxyManagerTestAsset\\EmptyClass'),
+            array('ProxyManagerTestAsset\\HydratedObject'),
+        );
+
+        if (PHP_VERSION_ID >= 50401) {
+            // PHP < 5.4.1 misbehaves, throwing strict standards, see https://bugs.php.net/bug.php?id=60573
+            $data[] = array('ProxyManagerTestAsset\\ClassWithSelfHint');
+        }
+
+        return $data;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Functional/NullObjectFunctionalTest.php
@@ -0,0 +1,223 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Functional;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
+use ProxyManager\ProxyGenerator\NullObjectGenerator;
+use ProxyManagerTestAsset\BaseClass;
+use ProxyManagerTestAsset\ClassWithSelfHint;
+use ReflectionClass;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\NullObjectGenerator} produced objects
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @group Functional
+ * @coversNothing
+ */
+class NullObjectFunctionalTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCalls($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+
+        /* @var $proxy \ProxyManager\Proxy\NullObjectInterface */
+        $proxy     = new $proxyName();
+
+        $this->assertSame(null, call_user_func_array(array($proxy, $method), $params));
+    }
+
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCallsAfterUnSerialization($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+        /* @var $proxy \ProxyManager\Proxy\NullObjectInterface */
+        $proxy     = unserialize(serialize(new $proxyName()));
+
+        $this->assertSame(null, call_user_func_array(array($proxy, $method), $params));
+    }
+
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testMethodCallsAfterCloning($className, $instance, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($className);
+
+        /* @var $proxy \ProxyManager\Proxy\NullObjectInterface */
+        $proxy     = new $proxyName();
+        $cloned    = clone $proxy;
+
+        $this->assertSame(null, call_user_func_array(array($cloned, $method), $params));
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyReadAccess($instance, $proxy, $publicProperty, $propertyValue)
+    {
+        /* @var $proxy \ProxyManager\Proxy\NullObjectInterface */
+        $this->assertSame(null, $proxy->$publicProperty);
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyWriteAccess($instance, $proxy, $publicProperty)
+    {
+        /* @var $proxy \ProxyManager\Proxy\NullObjectInterface */
+        $newValue               = uniqid();
+        $proxy->$publicProperty = $newValue;
+
+        $this->assertSame($newValue, $proxy->$publicProperty);
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyExistence($instance, $proxy, $publicProperty)
+    {
+        /* @var $proxy \ProxyManager\Proxy\NullObjectInterface */
+        $this->assertSame(null, $proxy->$publicProperty);
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testPropertyUnset($instance, $proxy, $publicProperty)
+    {
+        /* @var $proxy \ProxyManager\Proxy\NullObjectInterface */
+        unset($proxy->$publicProperty);
+
+        $this->assertTrue(isset($instance->$publicProperty));
+        $this->assertFalse(isset($proxy->$publicProperty));
+    }
+
+    /**
+     * Generates a proxy for the given class name, and retrieves its class name
+     *
+     * @param string $parentClassName
+     *
+     * @return string
+     */
+    private function generateProxy($parentClassName)
+    {
+        $generatedClassName = __NAMESPACE__ . '\\' . UniqueIdentifierGenerator::getIdentifier('Foo');
+        $generator          = new NullObjectGenerator();
+        $generatedClass     = new ClassGenerator($generatedClassName);
+        $strategy           = new EvaluatingGeneratorStrategy();
+
+        $generator->generate(new ReflectionClass($parentClassName), $generatedClass);
+        $strategy->generate($generatedClass);
+
+        return $generatedClassName;
+    }
+
+    /**
+     * Generates a list of object | invoked method | parameters | expected result
+     *
+     * @return array
+     */
+    public function getProxyMethods()
+    {
+        $selfHintParam = new ClassWithSelfHint();
+
+        $data = array(
+            array(
+                'ProxyManagerTestAsset\\BaseClass',
+                new BaseClass(),
+                'publicMethod',
+                array(),
+                'publicMethodDefault'
+            ),
+            array(
+                'ProxyManagerTestAsset\\BaseClass',
+                new BaseClass(),
+                'publicTypeHintedMethod',
+                array('param' => new \stdClass()),
+                'publicTypeHintedMethodDefault'
+            ),
+            array(
+                'ProxyManagerTestAsset\\BaseClass',
+                new BaseClass(),
+                'publicByReferenceMethod',
+                array(),
+                'publicByReferenceMethodDefault'
+            ),
+            array(
+                'ProxyManagerTestAsset\\BaseInterface',
+                new BaseClass(),
+                'publicMethod',
+                array(),
+                'publicMethodDefault'
+            ),
+        );
+
+        if (PHP_VERSION_ID >= 50401) {
+            // PHP < 5.4.1 misbehaves, throwing strict standards, see https://bugs.php.net/bug.php?id=60573
+            $data[] = array(
+                'ProxyManagerTestAsset\\ClassWithSelfHint',
+                new ClassWithSelfHint(),
+                'selfHintMethod',
+                array('parameter' => $selfHintParam),
+                $selfHintParam
+            );
+        }
+
+        return $data;
+    }
+
+    /**
+     * Generates proxies and instances with a public property to feed to the property accessor methods
+     *
+     * @return array
+     */
+    public function getPropertyAccessProxies()
+    {
+        $instance1  = new BaseClass();
+        $proxyName1 = $this->generateProxy(get_class($instance1));
+        $instance2  = new BaseClass();
+        $proxyName2 = $this->generateProxy(get_class($instance2));
+
+        return array(
+            array(
+                $instance1,
+                new $proxyName1($instance1),
+                'publicProperty',
+                'publicPropertyDefault',
+            ),
+            array(
+                $instance2,
+                unserialize(serialize(new $proxyName2($instance2))),
+                'publicProperty',
+                'publicPropertyDefault',
+            ),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Functional/RemoteObjectFunctionalTest.php
@@ -0,0 +1,231 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Functional;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Factory\RemoteObject\Adapter\JsonRpc as JsonRpcAdapter;
+use ProxyManager\Factory\RemoteObject\Adapter\XmlRpc as XmlRpcAdapter;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
+use ProxyManager\ProxyGenerator\RemoteObjectGenerator;
+use ProxyManagerTestAsset\ClassWithSelfHint;
+use ProxyManagerTestAsset\RemoteProxy\Foo;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\RemoteObjectGenerator} produced objects
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @group Functional
+ * @coversNothing
+ */
+class RemoteObjectFunctionalTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @param mixed  $expectedValue
+     * @param string $method
+     * @param array  $params
+     *
+     * @return XmlRpcAdapter
+     */
+    protected function getXmlRpcAdapter($expectedValue, $method, array $params)
+    {
+        $client = $this
+            ->getMockBuilder('Zend\Server\Client')
+            ->setMethods(array('call'))
+            ->getMock();
+
+        $client
+            ->expects($this->any())
+            ->method('call')
+            ->with($this->stringEndsWith($method), $params)
+            ->will($this->returnValue($expectedValue));
+
+        $adapter = new XmlRpcAdapter(
+            $client,
+            array(
+                 'ProxyManagerTestAsset\RemoteProxy\Foo.foo'
+                     => 'ProxyManagerTestAsset\RemoteProxy\FooServiceInterface.foo'
+            )
+        );
+
+        return $adapter;
+    }
+
+    /**
+     * @param mixed  $expectedValue
+     * @param string $method
+     * @param array  $params
+     *
+     * @return JsonRpcAdapter
+     */
+    protected function getJsonRpcAdapter($expectedValue, $method, array $params)
+    {
+        $client = $this
+            ->getMockBuilder('Zend\Server\Client')
+            ->setMethods(array('call'))
+            ->getMock();
+
+        $client
+            ->expects($this->any())
+            ->method('call')
+            ->with($this->stringEndsWith($method), $params)
+            ->will($this->returnValue($expectedValue));
+
+        $adapter = new JsonRpcAdapter(
+            $client,
+            array(
+                 'ProxyManagerTestAsset\RemoteProxy\Foo.foo'
+                    => 'ProxyManagerTestAsset\RemoteProxy\FooServiceInterface.foo'
+            )
+        );
+
+        return $adapter;
+    }
+
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testXmlRpcMethodCalls($instanceOrClassname, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($instanceOrClassname);
+
+        /* @var $proxy \ProxyManager\Proxy\RemoteObjectInterface */
+        $proxy     = new $proxyName($this->getXmlRpcAdapter($expectedValue, $method, $params));
+
+        $this->assertSame($expectedValue, call_user_func_array(array($proxy, $method), $params));
+    }
+
+    /**
+     * @dataProvider getProxyMethods
+     */
+    public function testJsonRpcMethodCalls($instanceOrClassname, $method, $params, $expectedValue)
+    {
+        $proxyName = $this->generateProxy($instanceOrClassname);
+
+        /* @var $proxy \ProxyManager\Proxy\RemoteObjectInterface */
+        $proxy     = new $proxyName($this->getJsonRpcAdapter($expectedValue, $method, $params));
+
+        $this->assertSame($expectedValue, call_user_func_array(array($proxy, $method), $params));
+    }
+
+    /**
+     * @dataProvider getPropertyAccessProxies
+     */
+    public function testJsonRpcPropertyReadAccess($instanceOrClassname, $publicProperty, $propertyValue)
+    {
+        $proxyName = $this->generateProxy($instanceOrClassname);
+
+        /* @var $proxy \ProxyManager\Proxy\RemoteObjectInterface */
+        $proxy     = new $proxyName(
+            $this->getJsonRpcAdapter($propertyValue, '__get', array($publicProperty))
+        );
+
+        /* @var $proxy \ProxyManager\Proxy\NullObjectInterface */
+        $this->assertSame($propertyValue, $proxy->$publicProperty);
+    }
+
+    /**
+     * Generates a proxy for the given class name, and retrieves its class name
+     *
+     * @param string $parentClassName
+     *
+     * @return string
+     */
+    private function generateProxy($parentClassName)
+    {
+        $generatedClassName = __NAMESPACE__ . '\\' . UniqueIdentifierGenerator::getIdentifier('Foo');
+        $generator          = new RemoteObjectGenerator();
+        $generatedClass     = new ClassGenerator($generatedClassName);
+        $strategy           = new EvaluatingGeneratorStrategy();
+
+        $generator->generate(new ReflectionClass($parentClassName), $generatedClass);
+        $strategy->generate($generatedClass);
+
+        return $generatedClassName;
+    }
+
+    /**
+     * Generates a list of object | invoked method | parameters | expected result
+     *
+     * @return array
+     */
+    public function getProxyMethods()
+    {
+        $selfHintParam = new ClassWithSelfHint();
+
+        $data = array(
+            array(
+                'ProxyManagerTestAsset\RemoteProxy\FooServiceInterface',
+                'foo',
+                array(),
+                'bar remote'
+            ),
+            array(
+                'ProxyManagerTestAsset\RemoteProxy\Foo',
+                'foo',
+                array(),
+                'bar remote'
+            ),
+            array(
+                new Foo(),
+                'foo',
+                array(),
+                'bar remote'
+            ),
+            array(
+                'ProxyManagerTestAsset\RemoteProxy\BazServiceInterface',
+                'baz',
+                array('baz'),
+                'baz remote'
+            ),
+        );
+
+        if (PHP_VERSION_ID >= 50401) {
+            // PHP < 5.4.1 misbehaves, throwing strict standards, see https://bugs.php.net/bug.php?id=60573
+            $data[] = array(
+                new ClassWithSelfHint(),
+                'selfHintMethod',
+                array($selfHintParam),
+                $selfHintParam
+            );
+        }
+
+        return $data;
+    }
+
+    /**
+     * Generates proxies and instances with a public property to feed to the property accessor methods
+     *
+     * @return array
+     */
+    public function getPropertyAccessProxies()
+    {
+        return array(
+            array(
+                'ProxyManagerTestAsset\RemoteProxy\FooServiceInterface',
+                'publicProperty',
+                'publicProperty remote',
+            ),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Generator/ClassGeneratorTest.php
@@ -0,0 +1,65 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Generator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Generator\ClassGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\Generator\ClassGenerator}
+ *
+ * @author Gordon Stratton <gordon.stratton@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class ClassGeneratorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\Generator\ClassGenerator::setExtendedClass
+     */
+    public function testExtendedClassesAreFQCNs()
+    {
+        $desiredFqcn     = '\\stdClass';
+        $classNameInputs = array('stdClass', '\\stdClass\\');
+
+        foreach ($classNameInputs as $className) {
+            $classGenerator = new ClassGenerator();
+            $classGenerator->setExtendedClass($className);
+
+            $this->assertEquals($desiredFqcn, $classGenerator->getExtendedClass());
+        }
+    }
+
+    /**
+     * @covers \ProxyManager\Generator\ClassGenerator::setImplementedInterfaces
+     */
+    public function testImplementedInterfacesAreFQCNs()
+    {
+        $desiredFqcns        = array('\\Countable');
+        $interfaceNameInputs = array(array('Countable'), array('\\Countable\\'));
+
+        foreach ($interfaceNameInputs as $interfaceNames) {
+            $classGenerator = new ClassGenerator();
+            $classGenerator->setImplementedInterfaces($interfaceNames);
+
+            $this->assertEquals($desiredFqcns, $classGenerator->getImplementedInterfaces());
+        }
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Generator/MagicMethodGeneratorTest.php
@@ -0,0 +1,56 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Generator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Generator\MagicMethodGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\Generator\MagicMethodGenerator}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicMethodGeneratorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\Generator\MagicMethodGenerator::__construct
+     */
+    public function testGeneratesCorrectByRefReturnValue()
+    {
+        $reflection  = new ReflectionClass('ProxyManagerTestAsset\\ClassWithByRefMagicMethods');
+        $magicMethod = new MagicMethodGenerator($reflection, '__get', array('name'));
+
+        $this->assertTrue($magicMethod->returnsReference());
+    }
+
+    /**
+     * @covers \ProxyManager\Generator\MagicMethodGenerator::__construct
+     */
+    public function testGeneratesCorrectByValReturnValue()
+    {
+        $reflection  = new ReflectionClass('ProxyManagerTestAsset\\ClassWithMagicMethods');
+        $magicMethod = new MagicMethodGenerator($reflection, '__get', array('name'));
+
+        $this->assertFalse($magicMethod->returnsReference());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Generator/MethodGeneratorTest.php
@@ -0,0 +1,97 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Generator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Generator\MethodGenerator;
+use ProxyManager\Generator\ParameterGenerator;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Tests for {@see \ProxyManager\Generator\MethodGenerator}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\Generator\MethodGenerator
+ * @group Coverage
+ */
+class MethodGeneratorTest extends PHPUnit_Framework_TestCase
+{
+    public function testGenerateSimpleMethod()
+    {
+        $methodGenerator = new MethodGenerator();
+
+        $methodGenerator->setReturnsReference(true);
+        $methodGenerator->setName('methodName');
+        $methodGenerator->setVisibility('protected');
+        $methodGenerator->setBody('/* body */');
+        $methodGenerator->setDocBlock('docBlock');
+        $methodGenerator->setParameter(new ParameterGenerator('foo'));
+
+        $this->assertSame(true, $methodGenerator->returnsReference());
+        $this->assertStringMatchesFormat(
+            '%a/**%adocBlock%a*/%aprotected function & methodName($foo)%a{%a/* body */%a}',
+            $methodGenerator->generate()
+        );
+    }
+
+    /**
+     * Verify that building from reflection works
+     */
+    public function testGenerateFromReflection()
+    {
+        $method = MethodGenerator::fromReflection(new MethodReflection(__CLASS__, __FUNCTION__));
+
+        $this->assertSame(__FUNCTION__, $method->getName());
+        $this->assertSame(MethodGenerator::VISIBILITY_PUBLIC, $method->getVisibility());
+        $this->assertFalse($method->isStatic());
+        $this->assertSame('Verify that building from reflection works', $method->getDocBlock()->getShortDescription());
+
+        $method = MethodGenerator::fromReflection(
+            new MethodReflection('ProxyManagerTestAsset\\BaseClass', 'protectedMethod')
+        );
+
+        $this->assertSame(MethodGenerator::VISIBILITY_PROTECTED, $method->getVisibility());
+
+        $method = MethodGenerator::fromReflection(
+            new MethodReflection('ProxyManagerTestAsset\\BaseClass', 'privateMethod')
+        );
+
+        $this->assertSame(MethodGenerator::VISIBILITY_PRIVATE, $method->getVisibility());
+    }
+
+    public function testGeneratedParametersFromReflection()
+    {
+        $method = MethodGenerator::fromReflection(new MethodReflection(
+            'ProxyManagerTestAsset\\BaseClass',
+            'publicTypeHintedMethod'
+        ));
+
+        $this->assertSame('publicTypeHintedMethod', $method->getName());
+
+        $parameters = $method->getParameters();
+
+        $this->assertCount(1, $parameters);
+
+        $param = $parameters['param'];
+
+        $this->assertSame('stdClass', $param->getType());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Generator/ParameterGeneratorTest.php
@@ -0,0 +1,146 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Generator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Generator\ParameterGenerator;
+use Zend\Code\Reflection\ParameterReflection;
+
+/**
+ * Tests for {@see \ProxyManager\Generator\ParameterGenerator}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\Generator\ParameterGenerator
+ * @group Coverage
+ */
+class ParameterGeneratorTest extends PHPUnit_Framework_TestCase
+{
+    public function testGeneratesProperTypeHint()
+    {
+        $generator = new ParameterGenerator('foo');
+
+        $generator->setType('array');
+        $this->assertSame('array $foo', $generator->generate());
+
+        $generator->setType('stdClass');
+        $this->assertSame('\\stdClass $foo', $generator->generate());
+
+        $generator->setType('\\fooClass');
+        $this->assertSame('\\fooClass $foo', $generator->generate());
+    }
+
+    public function testGeneratesMethodWithCallableType()
+    {
+        if (PHP_VERSION_ID < 50400) {
+            $this->markTestSkipped('`callable` is only supported in PHP >=5.4.0');
+        }
+
+        $generator = new ParameterGenerator();
+
+        $generator->setType('callable');
+        $generator->setName('foo');
+
+        $this->assertSame('callable $foo', $generator->generate());
+    }
+
+    public function testVisitMethodWithCallable()
+    {
+        if (PHP_VERSION_ID < 50400) {
+            $this->markTestSkipped('`callable` is only supported in PHP >=5.4.0');
+        }
+
+        $parameter = new ParameterReflection(
+            array('ProxyManagerTestAsset\\CallableTypeHintClass', 'callableTypeHintMethod'),
+            'parameter'
+        );
+
+        $generator = ParameterGenerator::fromReflection($parameter);
+
+        $this->assertSame('callable', $generator->getType());
+    }
+
+    public function testReadsParameterDefaults()
+    {
+        $parameter = ParameterGenerator::fromReflection(new ParameterReflection(
+            array(
+                'ProxyManagerTestAsset\\ClassWithMethodWithDefaultParameters',
+                'publicMethodWithDefaults'
+            ),
+            'parameter'
+        ));
+
+        /* @var $defaultValue \Zend\Code\Generator\ValueGenerator */
+        $defaultValue = $parameter->getDefaultValue();
+
+        $this->assertInstanceOf('Zend\\Code\\Generator\\ValueGenerator', $defaultValue);
+        $this->assertSame(array('foo'), $defaultValue->getValue());
+
+        $this->assertStringMatchesFormat('array%a$parameter%a=%aarray(\'foo\')', $parameter->generate());
+    }
+
+    public function testReadsParameterTypeHint()
+    {
+        $parameter = ParameterGenerator::fromReflection(new ParameterReflection(
+            array('ProxyManagerTestAsset\\BaseClass', 'publicTypeHintedMethod'),
+            'param'
+        ));
+
+        $this->assertSame('stdClass', $parameter->getType());
+    }
+
+    public function testGeneratesParameterPassedByReference()
+    {
+        $parameter = new ParameterGenerator('foo');
+
+        $parameter->setPassedByReference(true);
+
+        $this->assertStringMatchesFormat('&%A$foo', $parameter->generate());
+    }
+
+    public function testGeneratesDefaultParameterForInternalPhpClasses()
+    {
+        $parameter = ParameterGenerator::fromReflection(new ParameterReflection(
+            array(
+                'Phar',
+                'compress'
+            ),
+            1
+        ));
+
+        $this->assertSame('null', strtolower((string) $parameter->getDefaultValue()));
+    }
+
+    public function testGeneratedParametersAreProperlyEscaped()
+    {
+        $parameter = new ParameterGenerator();
+
+        $parameter->setName('foo');
+        $parameter->setDefaultValue('\'bar\\baz');
+
+        $this->assertThat(
+            $parameter->generate(),
+            $this->logicalOr(
+                $this->equalTo('$foo = \'\\\'bar\\baz\''),
+                $this->equalTo('$foo = \'\\\'bar\\\\baz\'')
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Generator/Util/ClassGeneratorUtilsTest.php
@@ -0,0 +1,72 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Generator\Util;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Generator\Util\ClassGeneratorUtils;
+
+/**
+ * Test to {@see ProxyManager\Generator\Util\ClassGeneratorUtils}
+ *
+ * @author Jefersson Nathan <malukenho@phpse.net>
+ * @license MIT
+ *
+ * @covers ProxyManager\Generator\Util\ClassGeneratorUtils
+ */
+class ClassGeneratorUtilsTest extends PHPUnit_Framework_TestCase
+{
+    public function testCantAddAFinalMethod()
+    {
+        $classGenerator  = $this->getMock('Zend\\Code\\Generator\\ClassGenerator');
+        $methodGenerator = $this->getMock('Zend\\Code\\Generator\\MethodGenerator');
+
+        $methodGenerator
+            ->expects($this->once())
+            ->method('getName')
+            ->willReturn('foo');
+
+        $classGenerator
+            ->expects($this->never())
+            ->method('addMethodFromGenerator');
+
+        $reflection = new ReflectionClass('ProxyManagerTestAsset\\ClassWithFinalMethods');
+
+        ClassGeneratorUtils::addMethodIfNotFinal($reflection, $classGenerator, $methodGenerator);
+    }
+
+    public function testCanAddANotFinalMethod()
+    {
+        $classGenerator  = $this->getMock('Zend\\Code\\Generator\\ClassGenerator');
+        $methodGenerator = $this->getMock('Zend\\Code\\Generator\\MethodGenerator');
+
+        $methodGenerator
+            ->expects($this->once())
+            ->method('getName')
+            ->willReturn('publicMethod');
+
+        $classGenerator
+            ->expects($this->once())
+            ->method('addMethodFromGenerator');
+
+        $reflection = new ReflectionClass('ProxyManagerTestAsset\\BaseClass');
+
+        ClassGeneratorUtils::addMethodIfNotFinal($reflection, $classGenerator, $methodGenerator);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Generator/Util/UniqueIdentifierGeneratorTest.php
@@ -0,0 +1,77 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Generator\Util;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\Generator\Util\UniqueIdentifierGenerator}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class UniqueIdentifierGeneratorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider getBaseIdentifierNames
+     *
+     * @covers \ProxyManager\Generator\Util\UniqueIdentifierGenerator::getIdentifier
+     */
+    public function testGeneratesUniqueIdentifiers($name)
+    {
+        $this->assertNotSame(
+            UniqueIdentifierGenerator::getIdentifier($name),
+            UniqueIdentifierGenerator::getIdentifier($name)
+        );
+    }
+
+    /**
+     * @dataProvider getBaseIdentifierNames
+     *
+     * @covers \ProxyManager\Generator\Util\UniqueIdentifierGenerator::getIdentifier
+     */
+    public function testGeneratesValidIdentifiers($name)
+    {
+        $this->assertRegExp(
+            '/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]+$/',
+            UniqueIdentifierGenerator::getIdentifier($name)
+        );
+    }
+
+    /**
+     * Data provider generating identifier names to be checked
+     *
+     * @return string[][]
+     */
+    public function getBaseIdentifierNames()
+    {
+        return array(
+            array(''),
+            array('1'),
+            array('foo'),
+            array('Foo'),
+            array('bar'),
+            array('Bar'),
+            array('foo_bar'),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/GeneratorStrategy/BaseGeneratorStrategyTest.php
@@ -0,0 +1,48 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\GeneratorStrategy;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\GeneratorStrategy\BaseGeneratorStrategy;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\GeneratorStrategy\BaseGeneratorStrategy}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class BaseGeneratorStrategyTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\GeneratorStrategy\BaseGeneratorStrategy::generate
+     */
+    public function testGenerate()
+    {
+        $strategy       = new BaseGeneratorStrategy();
+        $className      = UniqueIdentifierGenerator::getIdentifier('Foo');
+        $classGenerator = new ClassGenerator($className);
+        $generated      = $strategy->generate($classGenerator);
+
+        $this->assertGreaterThan(0, strpos($generated, $className));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/GeneratorStrategy/EvaluatingGeneratorStrategyTest.php
@@ -0,0 +1,69 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\GeneratorStrategy;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
+
+/**
+ * Tests for {@see \ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class EvaluatingGeneratorStrategyTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy::generate
+     * @covers \ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy::__construct
+     */
+    public function testGenerate()
+    {
+        $strategy       = new EvaluatingGeneratorStrategy();
+        $className      = UniqueIdentifierGenerator::getIdentifier('Foo');
+        $classGenerator = new ClassGenerator($className);
+        $generated      = $strategy->generate($classGenerator);
+
+        $this->assertGreaterThan(0, strpos($generated, $className));
+        $this->assertTrue(class_exists($className, false));
+    }
+
+    /**
+     * @covers \ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy::generate
+     * @covers \ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy::__construct
+     */
+    public function testGenerateWithDisabledEval()
+    {
+        if (! ini_get('suhosin.executor.disable_eval')) {
+            $this->markTestSkipped('Ini setting "suhosin.executor.disable_eval" is needed to run this test');
+        }
+
+        $strategy       = new EvaluatingGeneratorStrategy();
+        $className      = 'Foo' . uniqid();
+        $classGenerator = new ClassGenerator($className);
+        $generated      = $strategy->generate($classGenerator);
+
+        $this->assertGreaterThan(0, strpos($generated, $className));
+        $this->assertTrue(class_exists($className, false));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/GeneratorStrategy/FileWriterGeneratorStrategyTest.php
@@ -0,0 +1,148 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\GeneratorStrategy;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Exception\FileNotWritableException;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use ProxyManager\GeneratorStrategy\FileWriterGeneratorStrategy;
+
+/**
+ * Tests for {@see \ProxyManager\GeneratorStrategy\FileWriterGeneratorStrategy}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ *
+ * Note: this test generates temporary files that are not deleted
+ */
+class FileWriterGeneratorStrategyTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\GeneratorStrategy\FileWriterGeneratorStrategy::__construct
+     * @covers \ProxyManager\GeneratorStrategy\FileWriterGeneratorStrategy::generate
+     */
+    public function testGenerate()
+    {
+        /* @var $locator \ProxyManager\FileLocator\FileLocatorInterface|\PHPUnit_Framework_MockObject_MockObject */
+        $locator   = $this->getMock('ProxyManager\\FileLocator\\FileLocatorInterface');
+        $generator = new FileWriterGeneratorStrategy($locator);
+        $tmpFile   = sys_get_temp_dir() . '/' . uniqid('FileWriterGeneratorStrategyTest', true) . '.php';
+        $namespace = 'Foo';
+        $className = UniqueIdentifierGenerator::getIdentifier('Bar');
+        $fqcn      = $namespace . '\\' . $className;
+
+        $locator
+            ->expects($this->any())
+            ->method('getProxyFileName')
+            ->with($fqcn)
+            ->will($this->returnValue($tmpFile));
+
+        $body = $generator->generate(new ClassGenerator($fqcn));
+
+        $this->assertGreaterThan(0, strpos($body, $className));
+        $this->assertFalse(class_exists($fqcn, false));
+        $this->assertTrue(file_exists($tmpFile));
+
+        require $tmpFile;
+
+        $this->assertTrue(class_exists($fqcn, false));
+    }
+
+    public function testGenerateWillFailIfTmpFileCannotBeWrittenToDisk()
+    {
+        $tmpDirPath = sys_get_temp_dir() . '/' . uniqid('nonWritable', true);
+
+        mkdir($tmpDirPath, 0555, true);
+
+        /* @var $locator \ProxyManager\FileLocator\FileLocatorInterface|\PHPUnit_Framework_MockObject_MockObject */
+        $locator   = $this->getMock('ProxyManager\\FileLocator\\FileLocatorInterface');
+        $generator = new FileWriterGeneratorStrategy($locator);
+        $tmpFile   = $tmpDirPath . '/' . uniqid('FileWriterGeneratorStrategyFailedFileWriteTest', true) . '.php';
+        $namespace = 'Foo';
+        $className = UniqueIdentifierGenerator::getIdentifier('Bar');
+        $fqcn      = $namespace . '\\' . $className;
+
+        $locator
+            ->expects($this->any())
+            ->method('getProxyFileName')
+            ->with($fqcn)
+            ->will($this->returnValue($tmpFile));
+
+        $this->setExpectedException('ProxyManager\\Exception\\FileNotWritableException');
+        $generator->generate(new ClassGenerator($fqcn));
+    }
+
+    public function testGenerateWillFailIfTmpFileCannotBeMovedToFinalDestination()
+    {
+        /* @var $locator \ProxyManager\FileLocator\FileLocatorInterface|\PHPUnit_Framework_MockObject_MockObject */
+        $locator   = $this->getMock('ProxyManager\\FileLocator\\FileLocatorInterface');
+        $generator = new FileWriterGeneratorStrategy($locator);
+        $tmpFile   = sys_get_temp_dir() . '/' . uniqid('FileWriterGeneratorStrategyFailedFileMoveTest', true) . '.php';
+        $namespace = 'Foo';
+        $className = UniqueIdentifierGenerator::getIdentifier('Bar');
+        $fqcn      = $namespace . '\\' . $className;
+
+        $locator
+            ->expects($this->any())
+            ->method('getProxyFileName')
+            ->with($fqcn)
+            ->will($this->returnValue($tmpFile));
+
+        mkdir($tmpFile);
+
+        $this->setExpectedException('ProxyManager\\Exception\\FileNotWritableException');
+        $generator->generate(new ClassGenerator($fqcn));
+    }
+
+    public function testWhenFailingAllTemporaryFilesAreRemoved()
+    {
+        $tmpDirPath = sys_get_temp_dir() . '/' . uniqid('noTempFilesLeftBehind', true);
+
+        mkdir($tmpDirPath);
+
+        /* @var $locator \ProxyManager\FileLocator\FileLocatorInterface|\PHPUnit_Framework_MockObject_MockObject */
+        $locator   = $this->getMock('ProxyManager\\FileLocator\\FileLocatorInterface');
+        $generator = new FileWriterGeneratorStrategy($locator);
+        $tmpFile   = $tmpDirPath . '/' . uniqid('FileWriterGeneratorStrategyFailedFileMoveTest', true) . '.php';
+        $namespace = 'Foo';
+        $className = UniqueIdentifierGenerator::getIdentifier('Bar');
+        $fqcn      = $namespace . '\\' . $className;
+
+        $locator
+            ->expects($this->any())
+            ->method('getProxyFileName')
+            ->with($fqcn)
+            ->will($this->returnValue($tmpFile));
+
+        mkdir($tmpFile);
+
+        try {
+            $generator->generate(new ClassGenerator($fqcn));
+
+            $this->fail('An exception was supposed to be thrown');
+        } catch (FileNotWritableException $exception) {
+            rmdir($tmpFile);
+
+            $this->assertEquals(array('.', '..'), scandir($tmpDirPath));
+        }
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Inflector/ClassNameInflectorTest.php
@@ -0,0 +1,161 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Inflector;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Inflector\ClassNameInflector;
+use ProxyManager\Inflector\ClassNameInflectorInterface;
+
+/**
+ * Tests for {@see \ProxyManager\Inflector\ClassNameInflector}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class ClassNameInflectorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider getClassNames
+     *
+     * @covers \ProxyManager\Inflector\ClassNameInflector::__construct
+     * @covers \ProxyManager\Inflector\ClassNameInflector::getUserClassName
+     * @covers \ProxyManager\Inflector\ClassNameInflector::getProxyClassName
+     * @covers \ProxyManager\Inflector\ClassNameInflector::isProxyClassName
+     */
+    public function testInflector($realClassName, $proxyClassName)
+    {
+        $inflector = new ClassNameInflector('ProxyNS');
+
+        $this->assertFalse($inflector->isProxyClassName($realClassName));
+        $this->assertTrue($inflector->isProxyClassName($proxyClassName));
+        $this->assertStringMatchesFormat($realClassName, $inflector->getUserClassName($realClassName));
+        $this->assertStringMatchesFormat($proxyClassName, $inflector->getProxyClassName($proxyClassName));
+        $this->assertStringMatchesFormat($proxyClassName, $inflector->getProxyClassName($realClassName));
+        $this->assertStringMatchesFormat($realClassName, $inflector->getUserClassName($proxyClassName));
+    }
+
+    /**
+     * @covers \ProxyManager\Inflector\ClassNameInflector::getProxyClassName
+     */
+    public function testGeneratesSameClassNameWithSameParameters()
+    {
+        $inflector = new ClassNameInflector('ProxyNS');
+
+        $this->assertSame($inflector->getProxyClassName('Foo\\Bar'), $inflector->getProxyClassName('Foo\\Bar'));
+        $this->assertSame(
+            $inflector->getProxyClassName('Foo\\Bar', array('baz' => 'tab')),
+            $inflector->getProxyClassName('Foo\\Bar', array('baz' => 'tab'))
+        );
+        $this->assertSame(
+            $inflector->getProxyClassName('Foo\\Bar', array('tab' => 'baz')),
+            $inflector->getProxyClassName('Foo\\Bar', array('tab' => 'baz'))
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\Inflector\ClassNameInflector::getProxyClassName
+     */
+    public function testGeneratesDifferentClassNameWithDifferentParameters()
+    {
+        $inflector = new ClassNameInflector('ProxyNS');
+
+        $this->assertNotSame(
+            $inflector->getProxyClassName('Foo\\Bar'),
+            $inflector->getProxyClassName('Foo\\Bar', array('foo' => 'bar'))
+        );
+        $this->assertNotSame(
+            $inflector->getProxyClassName('Foo\\Bar', array('baz' => 'tab')),
+            $inflector->getProxyClassName('Foo\\Bar', array('tab' => 'baz'))
+        );
+        $this->assertNotSame(
+            $inflector->getProxyClassName('Foo\\Bar', array('foo' => 'bar', 'tab' => 'baz')),
+            $inflector->getProxyClassName('Foo\\Bar', array('foo' => 'bar'))
+        );
+        $this->assertNotSame(
+            $inflector->getProxyClassName('Foo\\Bar', array('foo' => 'bar', 'tab' => 'baz')),
+            $inflector->getProxyClassName('Foo\\Bar', array('tab' => 'baz', 'foo' => 'bar'))
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\Inflector\ClassNameInflector::getProxyClassName
+     */
+    public function testGeneratesCorrectClassNameWhenGivenLeadingBackslash()
+    {
+        $inflector = new ClassNameInflector('ProxyNS');
+
+        $this->assertSame(
+            $inflector->getProxyClassName('\\Foo\\Bar', array('tab' => 'baz')),
+            $inflector->getProxyClassName('Foo\\Bar', array('tab' => 'baz'))
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\Inflector\ClassNameInflector::getProxyClassName
+     *
+     * @dataProvider getClassAndParametersCombinations
+     *
+     * @param string $className
+     * @param array  $parameters
+     */
+    public function testClassNameIsValidClassIdentifier($className, array $parameters)
+    {
+        $inflector = new ClassNameInflector('ProxyNS');
+
+        $this->assertRegExp(
+            '/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]+)(\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]+)*/',
+            $inflector->getProxyClassName($className, $parameters),
+            'Class name string is a valid class identifier'
+        );
+    }
+
+    /**
+     * Data provider.
+     *
+     * @return array[]
+     */
+    public function getClassNames()
+    {
+        return array(
+            array('Foo', 'ProxyNS\\' . ClassNameInflectorInterface::PROXY_MARKER . '\\Foo\\%s'),
+            array('Foo\\Bar', 'ProxyNS\\' . ClassNameInflectorInterface::PROXY_MARKER . '\\Foo\\Bar\\%s'),
+        );
+    }
+
+    /**
+     * Data provider.
+     *
+     * @return array[]
+     */
+    public function getClassAndParametersCombinations()
+    {
+        return array(
+            array('Foo', array()),
+            array('Foo\\Bar', array()),
+            array('Foo', array(null)),
+            array('Foo\\Bar', array(null)),
+            array('Foo', array('foo' => 'bar')),
+            array('Foo\\Bar', array('foo' => 'bar')),
+            array('Foo', array("\0" => "very \0 bad")),
+            array('Foo\\Bar', array("\0" => "very \0 bad")),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Inflector/Util/ParameterEncoderTest.php
@@ -0,0 +1,66 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Inflector\Util;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Inflector\Util\ParameterEncoder;
+
+/**
+ * Tests for {@see \ProxyManager\Inflector\Util\ParameterEncoder}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class ParameterEncoderTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider getParameters
+     *
+     * @covers \ProxyManager\Inflector\Util\ParameterEncoder::encodeParameters
+     */
+    public function testGeneratesValidClassName(array $parameters)
+    {
+        $encoder = new ParameterEncoder();
+
+        $this->assertRegExp(
+            '/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]+/',
+            $encoder->encodeParameters($parameters),
+            'Encoded string is a valid class identifier'
+        );
+    }
+
+    /**
+     * @return array
+     */
+    public function getParameters()
+    {
+        return array(
+            array(array()),
+            array(array('foo' => 'bar')),
+            array(array('bar' => 'baz')),
+            array(array(null)),
+            array(array(null, null)),
+            array(array('bar' => null)),
+            array(array('bar' => 12345)),
+            array(array('foo' => 'bar', 'bar' => 'baz')),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Inflector/Util/ParameterHasherTest.php
@@ -0,0 +1,62 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Inflector\Util;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Inflector\Util\ParameterHasher;
+
+/**
+ * Tests for {@see \ProxyManager\Inflector\Util\ParameterHasher}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class ParameterHasherTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider getParameters
+     *
+     * @covers \ProxyManager\Inflector\Util\ParameterHasher::hashParameters
+     */
+    public function testGeneratesValidClassName(array $parameters, $expectedHash)
+    {
+        $encoder = new ParameterHasher();
+
+        $this->assertSame($expectedHash, $encoder->hashParameters($parameters));
+    }
+
+    /**
+     * @return array
+     */
+    public function getParameters()
+    {
+        return array(
+            array(array(), '40cd750bba9870f18aada2478b24840a'),
+            array(array('foo' => 'bar'), '49a3696adf0fbfacc12383a2d7400d51'),
+            array(array('bar' => 'baz'), '6ed41c8a63c1571554ecaeb998198757'),
+            array(array(null), '38017a839aaeb8ff1a658fce9af6edd3'),
+            array(array(null, null), '12051f9a58288e5328ad748881cc4e00'),
+            array(array('bar' => null), '0dbb112e1c4e6e4126232de2daa2d660'),
+            array(array('bar' => 12345), 'eb6291ea4973741bf9b6571f49b4ffd2'),
+            array(array('foo' => 'bar', 'bar' => 'baz'), '4447ff857f244d24c31bd84d7a855eda'),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AbstractProxyGeneratorTest.php
@@ -0,0 +1,95 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
+use ReflectionClass;
+
+/**
+ * Base test for proxy generators
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+abstract class AbstractProxyGeneratorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider getTestedImplementations
+     *
+     * Verifies that generated code is valid and implements expected interfaces
+     */
+    public function testGeneratesValidCode($className)
+    {
+        $generator          = $this->getProxyGenerator();
+        $generatedClassName = UniqueIdentifierGenerator::getIdentifier('AbstractProxyGeneratorTest');
+        $generatedClass     = new ClassGenerator($generatedClassName);
+        $originalClass      = new ReflectionClass($className);
+        $generatorStrategy  = new EvaluatingGeneratorStrategy();
+
+        $generator->generate($originalClass, $generatedClass);
+        $generatorStrategy->generate($generatedClass);
+
+        $generatedReflection = new ReflectionClass($generatedClassName);
+
+        if ($originalClass->isInterface()) {
+            $this->assertTrue($generatedReflection->implementsInterface($className));
+        } else {
+            $this->assertSame($originalClass->getName(), $generatedReflection->getParentClass()->getName());
+        }
+
+        $this->assertSame($generatedClassName, $generatedReflection->getName());
+
+        foreach ($this->getExpectedImplementedInterfaces() as $interface) {
+            $this->assertTrue($generatedReflection->implementsInterface($interface));
+        }
+    }
+
+    /**
+     * Retrieve a new generator instance
+     *
+     * @return \ProxyManager\ProxyGenerator\ProxyGeneratorInterface
+     */
+    abstract protected function getProxyGenerator();
+
+    /**
+     * Retrieve interfaces that should be implemented by the generated code
+     *
+     * @return string[]
+     */
+    abstract protected function getExpectedImplementedInterfaces();
+
+    /**
+     * @return array
+     */
+    public function getTestedImplementations()
+    {
+        return array(
+            array('ProxyManagerTestAsset\\BaseClass'),
+            array('ProxyManagerTestAsset\\ClassWithMagicMethods'),
+            array('ProxyManagerTestAsset\\ClassWithByRefMagicMethods'),
+            array('ProxyManagerTestAsset\\ClassWithMixedProperties'),
+            array('ProxyManagerTestAsset\\BaseInterface'),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptor/MethodGenerator/MagicWakeupTest.php
@@ -0,0 +1,62 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptor\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\MagicWakeup;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\MagicWakeup}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicWakeupTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\MagicWakeup::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection  = new ReflectionClass(
+            'ProxyManagerTestAsset\\ProxyGenerator\\LazyLoading\\MethodGenerator\\ClassWithTwoPublicProperties'
+        );
+
+        $magicWakeup = new MagicWakeup($reflection);
+
+        $this->assertSame('__wakeup', $magicWakeup->getName());
+        $this->assertCount(0, $magicWakeup->getParameters());
+        $this->assertSame("unset(\$this->bar, \$this->baz);", $magicWakeup->getBody());
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\MagicWakeup::__construct
+     */
+    public function testBodyStructureWithoutPublicProperties()
+    {
+        $magicWakeup = new MagicWakeup(new ReflectionClass('ProxyManagerTestAsset\\EmptyClass'));
+
+        $this->assertSame('__wakeup', $magicWakeup->getName());
+        $this->assertCount(0, $magicWakeup->getParameters());
+        $this->assertEmpty($magicWakeup->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptor/MethodGenerator/SetMethodPrefixInterceptorTest.php
@@ -0,0 +1,49 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptor\MethodGenerator;
+
+use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodPrefixInterceptor;
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodPrefixInterceptor}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class SetMethodPrefixInterceptorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodPrefixInterceptor::__construct
+     */
+    public function testBodyStructure()
+    {
+        $suffix = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $suffix->expects($this->once())->method('getName')->will($this->returnValue('foo'));
+
+        $setter = new SetMethodPrefixInterceptor($suffix);
+
+        $this->assertSame('setMethodPrefixInterceptor', $setter->getName());
+        $this->assertCount(2, $setter->getParameters());
+        $this->assertSame('$this->foo[$methodName] = $prefixInterceptor;', $setter->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptor/MethodGenerator/SetMethodSuffixInterceptorTest.php
@@ -0,0 +1,49 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptor\MethodGenerator;
+
+use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodSuffixInterceptor;
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodSuffixInterceptor}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class SetMethodSuffixInterceptorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodSuffixInterceptor::__construct
+     */
+    public function testBodyStructure()
+    {
+        $suffix = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $suffix->expects($this->once())->method('getName')->will($this->returnValue('foo'));
+
+        $setter = new SetMethodSuffixInterceptor($suffix);
+
+        $this->assertSame('setMethodSuffixInterceptor', $setter->getName());
+        $this->assertCount(2, $setter->getParameters());
+        $this->assertSame('$this->foo[$methodName] = $suffixInterceptor;', $setter->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptor/PropertyGenerator/MethodPrefixInterceptorsTest.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptor\PropertyGenerator;
+
+use ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodPrefixInterceptors;
+use ProxyManagerTest\ProxyGenerator\PropertyGenerator\AbstractUniquePropertyNameTest;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodPrefixInterceptors}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodPrefixInterceptors
+ * @group Coverage
+ */
+class MethodPrefixInterceptorsTest extends AbstractUniquePropertyNameTest
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected function createProperty()
+    {
+        return new MethodPrefixInterceptors();
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptor/PropertyGenerator/MethodSuffixInterceptorsTest.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptor\PropertyGenerator;
+
+use ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodSuffixInterceptors;
+use ProxyManagerTest\ProxyGenerator\PropertyGenerator\AbstractUniquePropertyNameTest;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodSuffixInterceptors}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodSuffixInterceptors
+ * @group Coverage
+ */
+class MethodSuffixInterceptorsTest extends AbstractUniquePropertyNameTest
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected function createProperty()
+    {
+        return new MethodSuffixInterceptors();
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/ConstructorTest.php
@@ -0,0 +1,207 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Constructor;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Constructor}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class ConstructorTest extends PHPUnit_Framework_TestCase
+{
+    private $prefixInterceptors;
+    private $suffixInterceptors;
+    public function setUp()
+    {
+        $this->prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $this->suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $this->prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $this->suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Constructor::__construct
+     */
+    public function testSignature()
+    {
+        $constructor = new Constructor(
+            new ReflectionClass('ProxyManagerTestAsset\\ClassWithProtectedProperties'),
+            $this->prefixInterceptors,
+            $this->suffixInterceptors
+        );
+        $this->assertSame('__construct', $constructor->getName());
+
+        $parameters = $constructor->getParameters();
+
+        $this->assertCount(3, $parameters);
+
+        $this->assertSame(
+            'ProxyManagerTestAsset\\ClassWithProtectedProperties',
+            $parameters['localizedObject']->getType()
+        );
+        $this->assertSame('array', $parameters['prefixInterceptors']->getType());
+        $this->assertSame('array', $parameters['suffixInterceptors']->getType());
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Constructor::__construct
+     */
+    public function testBodyStructure()
+    {
+        $constructor = new Constructor(
+            new ReflectionClass('ProxyManagerTestAsset\\ClassWithPublicProperties'),
+            $this->prefixInterceptors,
+            $this->suffixInterceptors
+        );
+
+        $this->assertSame(
+            '$this->property0 = & $localizedObject->property0;
+
+$this->property1 = & $localizedObject->property1;
+
+$this->property2 = & $localizedObject->property2;
+
+$this->property3 = & $localizedObject->property3;
+
+$this->property4 = & $localizedObject->property4;
+
+$this->property5 = & $localizedObject->property5;
+
+$this->property6 = & $localizedObject->property6;
+
+$this->property7 = & $localizedObject->property7;
+
+$this->property8 = & $localizedObject->property8;
+
+$this->property9 = & $localizedObject->property9;
+
+$this->pre = $prefixInterceptors;
+$this->post = $suffixInterceptors;',
+            $constructor->getBody()
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Constructor::__construct
+     */
+    public function testBodyStructureWithProtectedProperties()
+    {
+        $constructor = new Constructor(
+            new ReflectionClass('ProxyManagerTestAsset\\ClassWithProtectedProperties'),
+            $this->prefixInterceptors,
+            $this->suffixInterceptors
+        );
+
+        $this->assertSame(
+            '$this->property0 = & $localizedObject->property0;
+
+$this->property1 = & $localizedObject->property1;
+
+$this->property2 = & $localizedObject->property2;
+
+$this->property3 = & $localizedObject->property3;
+
+$this->property4 = & $localizedObject->property4;
+
+$this->property5 = & $localizedObject->property5;
+
+$this->property6 = & $localizedObject->property6;
+
+$this->property7 = & $localizedObject->property7;
+
+$this->property8 = & $localizedObject->property8;
+
+$this->property9 = & $localizedObject->property9;
+
+$this->pre = $prefixInterceptors;
+$this->post = $suffixInterceptors;',
+            $constructor->getBody()
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Constructor::__construct
+     */
+    public function testBodyStructureWithPrivateProperties()
+    {
+        if (! method_exists('Closure', 'bind')) {
+            $this->setExpectedException('ProxyManager\Exception\UnsupportedProxiedClassException');
+        }
+
+        $constructor = new Constructor(
+            new ReflectionClass('ProxyManagerTestAsset\\ClassWithPrivateProperties'),
+            $this->prefixInterceptors,
+            $this->suffixInterceptors
+        );
+
+        $this->assertSame(
+            '\Closure::bind(function () use ($localizedObject) {
+    $this->property0 = & $localizedObject->property0;
+}, $this, \'ProxyManagerTestAsset\\\\ClassWithPrivateProperties\')->__invoke();
+
+\Closure::bind(function () use ($localizedObject) {
+    $this->property1 = & $localizedObject->property1;
+}, $this, \'ProxyManagerTestAsset\\\\ClassWithPrivateProperties\')->__invoke();
+
+\Closure::bind(function () use ($localizedObject) {
+    $this->property2 = & $localizedObject->property2;
+}, $this, \'ProxyManagerTestAsset\\\\ClassWithPrivateProperties\')->__invoke();
+
+\Closure::bind(function () use ($localizedObject) {
+    $this->property3 = & $localizedObject->property3;
+}, $this, \'ProxyManagerTestAsset\\\\ClassWithPrivateProperties\')->__invoke();
+
+\Closure::bind(function () use ($localizedObject) {
+    $this->property4 = & $localizedObject->property4;
+}, $this, \'ProxyManagerTestAsset\\\\ClassWithPrivateProperties\')->__invoke();
+
+\Closure::bind(function () use ($localizedObject) {
+    $this->property5 = & $localizedObject->property5;
+}, $this, \'ProxyManagerTestAsset\\\\ClassWithPrivateProperties\')->__invoke();
+
+\Closure::bind(function () use ($localizedObject) {
+    $this->property6 = & $localizedObject->property6;
+}, $this, \'ProxyManagerTestAsset\\\\ClassWithPrivateProperties\')->__invoke();
+
+\Closure::bind(function () use ($localizedObject) {
+    $this->property7 = & $localizedObject->property7;
+}, $this, \'ProxyManagerTestAsset\\\\ClassWithPrivateProperties\')->__invoke();
+
+\Closure::bind(function () use ($localizedObject) {
+    $this->property8 = & $localizedObject->property8;
+}, $this, \'ProxyManagerTestAsset\\\\ClassWithPrivateProperties\')->__invoke();
+
+\Closure::bind(function () use ($localizedObject) {
+    $this->property9 = & $localizedObject->property9;
+}, $this, \'ProxyManagerTestAsset\\\\ClassWithPrivateProperties\')->__invoke();
+
+$this->pre = $prefixInterceptors;
+$this->post = $suffixInterceptors;',
+            $constructor->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/InterceptedMethodTest.php
@@ -0,0 +1,62 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\InterceptedMethod;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\InterceptedMethod}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\InterceptedMethod
+ * @group Coverage
+ */
+class InterceptedMethodTest extends PHPUnit_Framework_TestCase
+{
+    public function testBodyStructure()
+    {
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $method = InterceptedMethod::generateMethod(
+            new MethodReflection('ProxyManagerTestAsset\\BaseClass', 'publicByReferenceParameterMethod'),
+            $prefixInterceptors,
+            $suffixInterceptors
+        );
+
+        $this->assertInstanceOf('ProxyManager\\Generator\\MethodGenerator', $method);
+
+        $this->assertSame('publicByReferenceParameterMethod', $method->getName());
+        $this->assertCount(2, $method->getParameters());
+        $this->assertGreaterThan(
+            0,
+            strpos(
+                $method->getBody(),
+                '$returnValue = parent::publicByReferenceParameterMethod($param, $byRefParam);'
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicCloneTest.php
@@ -0,0 +1,72 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicClone;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicClone}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicCloneTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicClone::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $magicClone = new MagicClone($reflection, $prefixInterceptors, $suffixInterceptors);
+
+        $this->assertSame('__clone', $magicClone->getName());
+        $this->assertCount(0, $magicClone->getParameters());
+        $this->assertStringMatchesFormat("%a\n\n\$returnValue = null;\n\n%a", $magicClone->getBody());
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicClone::__construct
+     */
+    public function testBodyStructureWithInheritedMethod()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\ClassWithMagicMethods');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $magicClone = new MagicClone($reflection, $prefixInterceptors, $suffixInterceptors);
+
+        $this->assertSame('__clone', $magicClone->getName());
+        $this->assertCount(0, $magicClone->getParameters());
+        $this->assertStringMatchesFormat("%a\n\n\$returnValue = parent::__clone();\n\n%a", $magicClone->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicGetTest.php
@@ -0,0 +1,80 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicGet;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicGet}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicGetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicGet::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $magicGet = new MagicGet(
+            $reflection,
+            $prefixInterceptors,
+            $suffixInterceptors
+        );
+
+        $this->assertSame('__get', $magicGet->getName());
+        $this->assertCount(1, $magicGet->getParameters());
+        $this->assertStringMatchesFormat('%a$returnValue = & $accessor();%a', $magicGet->getBody());
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicGet::__construct
+     */
+    public function testBodyStructureWithInheritedMethod()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\ClassWithMagicMethods');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $magicGet = new MagicGet(
+            $reflection,
+            $prefixInterceptors,
+            $suffixInterceptors
+        );
+
+        $this->assertSame('__get', $magicGet->getName());
+        $this->assertCount(1, $magicGet->getParameters());
+        $this->assertStringMatchesFormat('%a$returnValue = & parent::__get($name);%a', $magicGet->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicIssetTest.php
@@ -0,0 +1,80 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicIsset;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicIsset}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicIssetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicIsset::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $magicGet = new MagicIsset(
+            $reflection,
+            $prefixInterceptors,
+            $suffixInterceptors
+        );
+
+        $this->assertSame('__isset', $magicGet->getName());
+        $this->assertCount(1, $magicGet->getParameters());
+        $this->assertStringMatchesFormat('%a$returnValue = $accessor();%a', $magicGet->getBody());
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicIsset::__construct
+     */
+    public function testBodyStructureWithInheritedMethod()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\ClassWithMagicMethods');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $magicGet = new MagicIsset(
+            $reflection,
+            $prefixInterceptors,
+            $suffixInterceptors
+        );
+
+        $this->assertSame('__isset', $magicGet->getName());
+        $this->assertCount(1, $magicGet->getParameters());
+        $this->assertStringMatchesFormat('%a$returnValue = & parent::__isset($name);%a', $magicGet->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicSetTest.php
@@ -0,0 +1,80 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicSet;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicSet}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicSetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicSet::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $magicGet = new MagicSet(
+            $reflection,
+            $prefixInterceptors,
+            $suffixInterceptors
+        );
+
+        $this->assertSame('__set', $magicGet->getName());
+        $this->assertCount(2, $magicGet->getParameters());
+        $this->assertStringMatchesFormat('%a$returnValue = & $accessor();%a', $magicGet->getBody());
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicSet::__construct
+     */
+    public function testBodyStructureWithInheritedMethod()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\ClassWithMagicMethods');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $magicGet = new MagicSet(
+            $reflection,
+            $prefixInterceptors,
+            $suffixInterceptors
+        );
+
+        $this->assertSame('__set', $magicGet->getName());
+        $this->assertCount(2, $magicGet->getParameters());
+        $this->assertStringMatchesFormat('%a$returnValue = & parent::__set($name, $value);%a', $magicGet->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicSleepTest.php
@@ -0,0 +1,80 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicSleep;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicSleep}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicSleepTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicSleep::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $magicGet = new MagicSleep(
+            $reflection,
+            $prefixInterceptors,
+            $suffixInterceptors
+        );
+
+        $this->assertSame('__sleep', $magicGet->getName());
+        $this->assertEmpty($magicGet->getParameters());
+        $this->assertStringMatchesFormat('%a$returnValue = array_keys((array) $this);%a', $magicGet->getBody());
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicSleep::__construct
+     */
+    public function testBodyStructureWithInheritedMethod()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\ClassWithMagicMethods');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $magicGet = new MagicSleep(
+            $reflection,
+            $prefixInterceptors,
+            $suffixInterceptors
+        );
+
+        $this->assertSame('__sleep', $magicGet->getName());
+        $this->assertEmpty($magicGet->getParameters());
+        $this->assertStringMatchesFormat('%a$returnValue = & parent::__sleep();%a', $magicGet->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/MagicUnsetTest.php
@@ -0,0 +1,80 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicUnset;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicUnset}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicUnsetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicUnset::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $magicGet = new MagicUnset(
+            $reflection,
+            $prefixInterceptors,
+            $suffixInterceptors
+        );
+
+        $this->assertSame('__unset', $magicGet->getName());
+        $this->assertCount(1, $magicGet->getParameters());
+        $this->assertStringMatchesFormat('%a$returnValue = $accessor();%a', $magicGet->getBody());
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicUnset::__construct
+     */
+    public function testBodyStructureWithInheritedMethod()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\ClassWithMagicMethods');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $magicGet = new MagicUnset(
+            $reflection,
+            $prefixInterceptors,
+            $suffixInterceptors
+        );
+
+        $this->assertSame('__unset', $magicGet->getName());
+        $this->assertCount(1, $magicGet->getParameters());
+        $this->assertStringMatchesFormat('%a$returnValue = & parent::__unset($name);%a', $magicGet->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorScopeLocalizer/MethodGenerator/Util/InterceptorGeneratorTest.php
@@ -0,0 +1,81 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Util;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Util\InterceptorGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorValueHolderGenerator}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class InterceptorGeneratorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\Util\InterceptorGenerator
+     */
+    public function testInterceptorGenerator()
+    {
+        $method             = $this->getMock('ProxyManager\\Generator\\MethodGenerator');
+        $bar                = $this->getMock('ProxyManager\\Generator\\ParameterGenerator');
+        $baz                = $this->getMock('ProxyManager\\Generator\\ParameterGenerator');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $bar->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+        $baz->expects($this->any())->method('getName')->will($this->returnValue('baz'));
+        $method->expects($this->any())->method('getName')->will($this->returnValue('fooMethod'));
+        $method->expects($this->any())->method('getParameters')->will($this->returnValue(array($bar, $baz)));
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $body = InterceptorGenerator::createInterceptedMethodBody(
+            '$returnValue = "foo";',
+            $method,
+            $prefixInterceptors,
+            $suffixInterceptors
+        );
+
+        $this->assertSame(
+            'if (isset($this->pre[\'fooMethod\'])) {' . "\n"
+            . '    $returnEarly       = false;' . "\n"
+            . '    $prefixReturnValue = $this->pre[\'fooMethod\']->__invoke($this, $this, \'fooMethod\', '
+            . 'array(\'bar\' => $bar, \'baz\' => $baz), $returnEarly);' . "\n\n"
+            . '    if ($returnEarly) {' . "\n"
+            . '        return $prefixReturnValue;' . "\n"
+            . '    }' . "\n"
+            . '}' . "\n\n"
+            . '$returnValue = "foo";' . "\n\n"
+            . 'if (isset($this->post[\'fooMethod\'])) {' . "\n"
+            . '    $returnEarly       = false;' . "\n"
+            . '    $suffixReturnValue = $this->post[\'fooMethod\']->__invoke($this, $this, \'fooMethod\', '
+            . 'array(\'bar\' => $bar, \'baz\' => $baz), $returnValue, $returnEarly);' . "\n\n"
+            . '    if ($returnEarly) {' . "\n"
+            . '        return $suffixReturnValue;' . "\n"
+            . '    }' . "\n"
+            . '}' . "\n\n"
+            . 'return $returnValue;',
+            $body
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorScopeLocalizerTest.php
@@ -0,0 +1,76 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator;
+
+use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizerGenerator;
+use ReflectionClass;
+use ReflectionProperty;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizerGenerator}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizerGenerator
+ * @group Coverage
+ */
+class AccessInterceptorScopeLocalizerTest extends AbstractProxyGeneratorTest
+{
+    /**
+     * @dataProvider getTestedImplementations
+     *
+     * {@inheritDoc}
+     */
+    public function testGeneratesValidCode($className)
+    {
+        $reflectionClass = new ReflectionClass($className);
+
+        if ($reflectionClass->isInterface()) {
+            // @todo interfaces *may* be proxied by deferring property localization to the constructor (no hardcoding)
+            $this->setExpectedException('ProxyManager\Exception\InvalidProxiedClassException');
+
+            return parent::testGeneratesValidCode($className);
+        }
+
+        if ((! method_exists('Closure', 'bind'))
+            && $reflectionClass->getProperties(ReflectionProperty::IS_PRIVATE)
+        ) {
+            $this->setExpectedException('ProxyManager\Exception\UnsupportedProxiedClassException');
+        }
+
+        return parent::testGeneratesValidCode($className);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getProxyGenerator()
+    {
+        return new AccessInterceptorScopeLocalizerGenerator();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getExpectedImplementedInterfaces()
+    {
+        return array('ProxyManager\\Proxy\\AccessInterceptorInterface');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorValueHolder/LazyLoading/MethodGenerator/ConstructorTest.php
@@ -0,0 +1,69 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoading\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoading\MethodGenerator\Constructor;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoading\MethodGenerator\Constructor}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class ConstructorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoading\MethodGenerator\Constructor::__construct
+     */
+    public function testBodyStructure()
+    {
+        $initializer = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $reflection  = new ReflectionClass(
+            'ProxyManagerTestAsset\\ProxyGenerator\\LazyLoading\\MethodGenerator\\ClassWithTwoPublicProperties'
+        );
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+
+        $constructor = new Constructor($reflection, $initializer);
+
+        $this->assertSame('__construct', $constructor->getName());
+        $this->assertCount(1, $constructor->getParameters());
+        $this->assertSame("unset(\$this->bar, \$this->baz);\n\n\$this->foo = \$initializer;", $constructor->getBody());
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoading\MethodGenerator\Constructor::__construct
+     */
+    public function testBodyStructureWithoutPublicProperties()
+    {
+        $initializer = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+
+        $constructor = new Constructor(new ReflectionClass('ProxyManagerTestAsset\\EmptyClass'), $initializer);
+
+        $this->assertSame('__construct', $constructor->getName());
+        $this->assertCount(1, $constructor->getParameters());
+        $this->assertSame("\$this->foo = \$initializer;", $constructor->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/ConstructorTest.php
@@ -0,0 +1,86 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\Constructor;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\Constructor}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class ConstructorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\Constructor::__construct
+     */
+    public function testBodyStructure()
+    {
+        $valueHolder        = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $reflection         = new ReflectionClass(
+            'ProxyManagerTestAsset\\ProxyGenerator\\LazyLoading\\MethodGenerator\\ClassWithTwoPublicProperties'
+        );
+
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $constructor = new Constructor($reflection, $valueHolder, $prefixInterceptors, $suffixInterceptors);
+
+        $this->assertSame('__construct', $constructor->getName());
+        $this->assertCount(3, $constructor->getParameters());
+        $this->assertSame(
+            "unset(\$this->bar, \$this->baz);\n\n\$this->foo = \$wrappedObject;\n\$this->pre = \$prefixInterceptors;"
+            . "\n\$this->post = \$suffixInterceptors;",
+            $constructor->getBody()
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\Constructor::__construct
+     */
+    public function testBodyStructureWithoutPublicProperties()
+    {
+        $valueHolder        = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $constructor = new Constructor($reflection, $valueHolder, $prefixInterceptors, $suffixInterceptors);
+
+        $this->assertSame('__construct', $constructor->getName());
+        $this->assertCount(3, $constructor->getParameters());
+        $this->assertSame(
+            "\$this->foo = \$wrappedObject;\n\$this->pre = \$prefixInterceptors;"
+            . "\n\$this->post = \$suffixInterceptors;",
+            $constructor->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/InterceptedMethodTest.php
@@ -0,0 +1,65 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\InterceptedMethod;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\InterceptedMethod}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\InterceptedMethod::generateMethod
+ * @group Coverage
+ */
+class InterceptedMethodTest extends PHPUnit_Framework_TestCase
+{
+    public function testBodyStructure()
+    {
+        $valueHolder        = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $method = InterceptedMethod::generateMethod(
+            new MethodReflection('ProxyManagerTestAsset\\BaseClass', 'publicByReferenceParameterMethod'),
+            $valueHolder,
+            $prefixInterceptors,
+            $suffixInterceptors
+        );
+
+        $this->assertInstanceOf('ProxyManager\\Generator\\MethodGenerator', $method);
+
+        $this->assertSame('publicByReferenceParameterMethod', $method->getName());
+        $this->assertCount(2, $method->getParameters());
+        $this->assertGreaterThan(
+            0,
+            strpos(
+                $method->getBody(),
+                '$returnValue = $this->foo->publicByReferenceParameterMethod($param, $byRefParam);'
+            )
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/MagicCloneTest.php
@@ -0,0 +1,64 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicClone;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicClone}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicCloneTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicClone::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $valueHolder        = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $magicClone = new MagicClone($reflection, $valueHolder, $prefixInterceptors, $suffixInterceptors);
+
+        $this->assertSame('__clone', $magicClone->getName());
+        $this->assertCount(0, $magicClone->getParameters());
+        $this->assertSame(
+            '$this->bar = clone $this->bar;' . "\n\n"
+            . 'foreach ($this->pre as $key => $value) {' . "\n"
+            . '    $this->pre[$key] = clone $value;' . "\n"
+            . '}' . "\n\n"
+            . 'foreach ($this->post as $key => $value) {' . "\n"
+            . '    $this->post[$key] = clone $value;' . "\n"
+            . '}',
+            $magicClone->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/MagicGetTest.php
@@ -0,0 +1,66 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicGet;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicGet}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicGetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicGet::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $valueHolder        = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $publicProperties   = $this
+            ->getMockBuilder('ProxyManager\\ProxyGenerator\\PropertyGenerator\\PublicPropertiesMap')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+        $publicProperties->expects($this->any())->method('isEmpty')->will($this->returnValue(false));
+
+        $magicGet = new MagicGet(
+            $reflection,
+            $valueHolder,
+            $prefixInterceptors,
+            $suffixInterceptors,
+            $publicProperties
+        );
+
+        $this->assertSame('__get', $magicGet->getName());
+        $this->assertCount(1, $magicGet->getParameters());
+        $this->assertStringMatchesFormat('%A$returnValue = & $this->bar->$name;%A', $magicGet->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/MagicIssetTest.php
@@ -0,0 +1,66 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicIsset;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicIsset}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicIssetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicIsset::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $valueHolder        = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $publicProperties   = $this
+            ->getMockBuilder('ProxyManager\\ProxyGenerator\\PropertyGenerator\\PublicPropertiesMap')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+        $publicProperties->expects($this->any())->method('isEmpty')->will($this->returnValue(false));
+
+        $magicIsset = new MagicIsset(
+            $reflection,
+            $valueHolder,
+            $prefixInterceptors,
+            $suffixInterceptors,
+            $publicProperties
+        );
+
+        $this->assertSame('__isset', $magicIsset->getName());
+        $this->assertCount(1, $magicIsset->getParameters());
+        $this->assertGreaterThan(0, strpos($magicIsset->getBody(), '$returnValue = isset($this->bar->$name);'));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/MagicSetTest.php
@@ -0,0 +1,66 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicSet;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicSet}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicSetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicSet::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $valueHolder        = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $publicProperties   = $this
+            ->getMockBuilder('ProxyManager\\ProxyGenerator\\PropertyGenerator\\PublicPropertiesMap')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+        $publicProperties->expects($this->any())->method('isEmpty')->will($this->returnValue(false));
+
+        $magicSet = new MagicSet(
+            $reflection,
+            $valueHolder,
+            $prefixInterceptors,
+            $suffixInterceptors,
+            $publicProperties
+        );
+
+        $this->assertSame('__set', $magicSet->getName());
+        $this->assertCount(2, $magicSet->getParameters());
+        $this->assertGreaterThan(0, strpos($magicSet->getBody(), '$returnValue = ($this->bar->$name = $value);'));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/MagicUnsetTest.php
@@ -0,0 +1,69 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicUnset;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicUnset}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicUnsetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicUnset::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection         = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $valueHolder        = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $publicProperties   = $this
+            ->getMockBuilder('ProxyManager\\ProxyGenerator\\PropertyGenerator\\PublicPropertiesMap')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+        $publicProperties->expects($this->any())->method('isEmpty')->will($this->returnValue(false));
+
+        $magicUnset = new MagicUnset(
+            $reflection,
+            $valueHolder,
+            $prefixInterceptors,
+            $suffixInterceptors,
+            $publicProperties
+        );
+
+        $this->assertSame('__unset', $magicUnset->getName());
+        $this->assertCount(1, $magicUnset->getParameters());
+        $this->assertGreaterThan(
+            0,
+            strpos($magicUnset->getBody(), 'unset($this->bar->$name);')
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorValueHolder/MethodGenerator/Util/InterceptorGeneratorTest.php
@@ -0,0 +1,84 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\Util;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\Util\InterceptorGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorValueHolderGenerator}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class InterceptorGeneratorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\Util\InterceptorGenerator
+     */
+    public function testInterceptorGenerator()
+    {
+        $method             = $this->getMock('ProxyManager\\Generator\\MethodGenerator');
+        $bar                = $this->getMock('ProxyManager\\Generator\\ParameterGenerator');
+        $baz                = $this->getMock('ProxyManager\\Generator\\ParameterGenerator');
+        $valueHolder        = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $prefixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $suffixInterceptors = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $bar->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+        $baz->expects($this->any())->method('getName')->will($this->returnValue('baz'));
+        $method->expects($this->any())->method('getName')->will($this->returnValue('fooMethod'));
+        $method->expects($this->any())->method('getParameters')->will($this->returnValue(array($bar, $baz)));
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $prefixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('pre'));
+        $suffixInterceptors->expects($this->any())->method('getName')->will($this->returnValue('post'));
+
+        $body = InterceptorGenerator::createInterceptedMethodBody(
+            '$returnValue = "foo";',
+            $method,
+            $valueHolder,
+            $prefixInterceptors,
+            $suffixInterceptors
+        );
+
+        $this->assertSame(
+            'if (isset($this->pre[\'fooMethod\'])) {' . "\n"
+            . '    $returnEarly       = false;' . "\n"
+            . '    $prefixReturnValue = $this->pre[\'fooMethod\']->__invoke($this, $this->foo, \'fooMethod\', '
+            . 'array(\'bar\' => $bar, \'baz\' => $baz), $returnEarly);' . "\n\n"
+            . '    if ($returnEarly) {' . "\n"
+            . '        return $prefixReturnValue;' . "\n"
+            . '    }' . "\n"
+            . '}' . "\n\n"
+            . '$returnValue = "foo";' . "\n\n"
+            . 'if (isset($this->post[\'fooMethod\'])) {' . "\n"
+            . '    $returnEarly       = false;' . "\n"
+            . '    $suffixReturnValue = $this->post[\'fooMethod\']->__invoke($this, $this->foo, \'fooMethod\', '
+            . 'array(\'bar\' => $bar, \'baz\' => $baz), $returnValue, $returnEarly);' . "\n\n"
+            . '    if ($returnEarly) {' . "\n"
+            . '        return $suffixReturnValue;' . "\n"
+            . '    }' . "\n"
+            . '}' . "\n\n"
+            . 'return $returnValue;',
+            $body
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorValueHolderTest.php
@@ -0,0 +1,52 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator;
+
+use ProxyManager\ProxyGenerator\AccessInterceptorValueHolderGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorValueHolderGenerator}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\AccessInterceptorValueHolderGenerator
+ * @group Coverage
+ */
+class AccessInterceptorValueHolderTest extends AbstractProxyGeneratorTest
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected function getProxyGenerator()
+    {
+        return new AccessInterceptorValueHolderGenerator();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getExpectedImplementedInterfaces()
+    {
+        return array(
+            'ProxyManager\\Proxy\\AccessInterceptorInterface',
+            'ProxyManager\\Proxy\\ValueHolderInterface',
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/Assertion/CanProxyAssertionTest.php
@@ -0,0 +1,113 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\Assertion;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\Assertion\CanProxyAssertion;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\Assertion\CanProxyAssertion}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\Assertion\CanProxyAssertion
+ * @group Coverage
+ */
+class CanProxyAssertionTest extends PHPUnit_Framework_TestCase
+{
+    public function testDeniesFinalClasses()
+    {
+        $this->setExpectedException('ProxyManager\Exception\InvalidProxiedClassException');
+
+        CanProxyAssertion::assertClassCanBeProxied(new ReflectionClass('ProxyManagerTestAsset\\FinalClass'));
+    }
+
+    public function testDeniesClassesWithAbstractProtectedMethods()
+    {
+        $this->setExpectedException('ProxyManager\Exception\InvalidProxiedClassException');
+
+        CanProxyAssertion::assertClassCanBeProxied(new ReflectionClass(
+            'ProxyManagerTestAsset\\ClassWithAbstractProtectedMethod'
+        ));
+    }
+
+    public function testAllowsInterfaceByDefault()
+    {
+        CanProxyAssertion::assertClassCanBeProxied(new ReflectionClass(
+            'ProxyManagerTestAsset\\BaseInterface'
+        ));
+
+        $this->assertTrue(true); // not nice, but assertions are just fail-checks, no real code executed
+    }
+
+    public function testDeniesInterfaceIfSpecified()
+    {
+        $this->setExpectedException('ProxyManager\Exception\InvalidProxiedClassException');
+
+        CanProxyAssertion::assertClassCanBeProxied(new ReflectionClass('ProxyManagerTestAsset\\BaseInterface'), false);
+    }
+
+    /**
+     * @param string $className
+     *
+     * @dataProvider validClasses
+     */
+    public function testAllowedClass($className)
+    {
+        CanProxyAssertion::assertClassCanBeProxied(new ReflectionClass($className));
+
+        $this->assertTrue(true); // not nice, but assertions are just fail-checks, no real code executed
+    }
+
+    public function testDisallowsConstructor()
+    {
+        $this->setExpectedException('BadMethodCallException');
+
+        new CanProxyAssertion();
+    }
+
+    /**
+     * @return string[][]
+     */
+    public function validClasses()
+    {
+        return array(
+            array('ProxyManagerTestAsset\AccessInterceptorValueHolderMock'),
+            array('ProxyManagerTestAsset\BaseClass'),
+            array('ProxyManagerTestAsset\BaseInterface'),
+            array('ProxyManagerTestAsset\CallableTypeHintClass'),
+            array('ProxyManagerTestAsset\ClassWithByRefMagicMethods'),
+            array('ProxyManagerTestAsset\ClassWithFinalMagicMethods'),
+            array('ProxyManagerTestAsset\ClassWithFinalMethods'),
+            array('ProxyManagerTestAsset\ClassWithMethodWithDefaultParameters'),
+            array('ProxyManagerTestAsset\ClassWithMixedProperties'),
+            array('ProxyManagerTestAsset\ClassWithPrivateProperties'),
+            array('ProxyManagerTestAsset\ClassWithProtectedProperties'),
+            array('ProxyManagerTestAsset\ClassWithPublicProperties'),
+            array('ProxyManagerTestAsset\ClassWithPublicArrayProperty'),
+            array('ProxyManagerTestAsset\ClassWithSelfHint'),
+            array('ProxyManagerTestAsset\EmptyClass'),
+            array('ProxyManagerTestAsset\HydratedObject'),
+            array('ProxyManagerTestAsset\LazyLoadingMock'),
+            array('ProxyManagerTestAsset\NullObjectMock'),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/MethodGenerator/CallInitializerTest.php
@@ -0,0 +1,59 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\CallInitializer;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\CallInitializer}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class CallInitializerTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\CallInitializer::__construct
+     */
+    public function testBodyStructure()
+    {
+        $initializer           = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $propertiesDefaults    = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $initializationTracker = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('init'));
+        $propertiesDefaults->expects($this->any())->method('getName')->will($this->returnValue('props'));
+        $initializationTracker->expects($this->any())->method('getName')->will($this->returnValue('track'));
+
+        $callInitializer = new CallInitializer($initializer, $propertiesDefaults, $initializationTracker);
+
+        $this->assertStringMatchesFormat(
+            '%Aif ($this->track || ! $this->init) {%areturn;%a}%a'
+            . '$this->track = true;%a'
+            . 'foreach (self::$props as $key => $default) {%a'
+            . '$this->$key = $default;%a'
+            . '$this->init->__invoke(%a);%a'
+            . '$this->track = false;',
+            $callInitializer->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/MethodGenerator/GetProxyInitializerTest.php
@@ -0,0 +1,49 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\GetProxyInitializer;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\GetProxyInitializer}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class GetProxyInitializerTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\GetProxyInitializer::__construct
+     */
+    public function testBodyStructure()
+    {
+        $initializer = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+
+        $getter = new GetProxyInitializer($initializer);
+
+        $this->assertSame('getProxyInitializer', $getter->getName());
+        $this->assertCount(0, $getter->getParameters());
+        $this->assertSame('return $this->foo;', $getter->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/MethodGenerator/InitializeProxyTest.php
@@ -0,0 +1,54 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\InitializeProxy;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\InitializeProxy}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class InitializeProxyTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\InitializeProxy::__construct
+     */
+    public function testBodyStructure()
+    {
+        $initializer = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $initCall    = $this->getMock('Zend\\Code\\Generator\\MethodGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $initCall->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+
+        $initializeProxy = new InitializeProxy($initializer, $initCall);
+
+        $this->assertSame('initializeProxy', $initializeProxy->getName());
+        $this->assertCount(0, $initializeProxy->getParameters());
+        $this->assertSame(
+            'return $this->foo && $this->bar(\'initializeProxy\', array());',
+            $initializeProxy->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/MethodGenerator/IsProxyInitializedTest.php
@@ -0,0 +1,49 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\IsProxyInitialized;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\IsProxyInitialized}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class IsProxyInitializedTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\IsProxyInitialized::__construct
+     */
+    public function testBodyStructure()
+    {
+        $initializer = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+
+        $isProxyInitialized = new IsProxyInitialized($initializer);
+
+        $this->assertSame('isProxyInitialized', $isProxyInitialized->getName());
+        $this->assertCount(0, $isProxyInitialized->getParameters());
+        $this->assertSame('return ! $this->foo;', $isProxyInitialized->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/MethodGenerator/LazyLoadingMethodInterceptorTest.php
@@ -0,0 +1,81 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\LazyLoadingMethodInterceptor;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\LazyLoadingMethodInterceptor}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class LazyLoadingMethodInterceptorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\LazyLoadingMethodInterceptor
+     */
+    public function testBodyStructure()
+    {
+        $initializer = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $initCall    = $this->getMock('Zend\\Code\\Generator\\MethodGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $initCall->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+
+        $reflection = new MethodReflection('ProxyManagerTestAsset\\BaseClass', 'publicByReferenceParameterMethod');
+        $method     = LazyLoadingMethodInterceptor::generateMethod($reflection, $initializer, $initCall);
+
+        $this->assertSame('publicByReferenceParameterMethod', $method->getName());
+        $this->assertCount(2, $method->getParameters());
+        $this->assertSame(
+            "\$this->foo && \$this->bar('publicByReferenceParameterMethod', "
+            . "array('param' => \$param, 'byRefParam' => \$byRefParam));\n\n"
+            . "return parent::publicByReferenceParameterMethod(\$param, \$byRefParam);",
+            $method->getBody()
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\LazyLoadingMethodInterceptor
+     */
+    public function testBodyStructureWithoutParameters()
+    {
+        $reflectionMethod = new MethodReflection(__CLASS__, 'testBodyStructureWithoutParameters');
+        $initializer      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $initCall         = $this->getMock('Zend\\Code\\Generator\\MethodGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $initCall->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+
+        $method = LazyLoadingMethodInterceptor::generateMethod($reflectionMethod, $initializer, $initCall);
+
+        $this->assertSame('testBodyStructureWithoutParameters', $method->getName());
+        $this->assertCount(0, $method->getParameters());
+        $this->assertSame(
+            "\$this->foo && \$this->bar('testBodyStructureWithoutParameters', array());\n\n"
+            . "return parent::testBodyStructureWithoutParameters();",
+            $method->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicCloneTest.php
@@ -0,0 +1,56 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicClone;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicClone}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicCloneTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicClone::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection  = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $initializer = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $initCall    = $this->getMock('Zend\\Code\\Generator\\MethodGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $initCall->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+
+        $magicClone = new MagicClone($reflection, $initializer, $initCall);
+
+        $this->assertSame('__clone', $magicClone->getName());
+        $this->assertCount(0, $magicClone->getParameters());
+        $this->assertSame(
+            "\$this->foo && \$this->bar('__clone', array());",
+            $magicClone->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicGetTest.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicGet;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicGet}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicGetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Zend\Code\Generator\PropertyGenerator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $initializer;
+
+    /**
+     * @var \Zend\Code\Generator\MethodGenerator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $initMethod;
+
+    /**
+     * @var \ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $publicProperties;
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function setUp()
+    {
+        $this->initializer      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $this->initMethod       = $this->getMock('Zend\\Code\\Generator\\MethodGenerator');
+        $this->publicProperties = $this
+            ->getMockBuilder('ProxyManager\\ProxyGenerator\\PropertyGenerator\\PublicPropertiesMap')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $this->initMethod->expects($this->any())->method('getName')->will($this->returnValue('baz'));
+        $this->publicProperties->expects($this->any())->method('isEmpty')->will($this->returnValue(false));
+        $this->publicProperties->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicGet::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $magicGet   = new MagicGet($reflection, $this->initializer, $this->initMethod, $this->publicProperties);
+
+        $this->assertSame('__get', $magicGet->getName());
+        $this->assertCount(1, $magicGet->getParameters());
+        $this->assertStringMatchesFormat(
+            "\$this->foo && \$this->baz('__get', array('name' => \$name));\n\n"
+            . "if (isset(self::\$bar[\$name])) {\n    return \$this->\$name;\n}\n\n"
+            . "%a",
+            $magicGet->getBody()
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicGet::__construct
+     */
+    public function testBodyStructureWithPublicProperties()
+    {
+        $reflection = new ReflectionClass(
+            'ProxyManagerTestAsset\\ProxyGenerator\\LazyLoading\\MethodGenerator\\ClassWithTwoPublicProperties'
+        );
+
+        $magicGet = new MagicGet($reflection, $this->initializer, $this->initMethod, $this->publicProperties);
+
+        $this->assertSame('__get', $magicGet->getName());
+        $this->assertCount(1, $magicGet->getParameters());
+        $this->assertStringMatchesFormat(
+            "\$this->foo && \$this->baz('__get', array('name' => \$name));\n\n"
+            . "if (isset(self::\$bar[\$name])) {\n    return \$this->\$name;\n}\n\n"
+            . "%a",
+            $magicGet->getBody()
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicGet::__construct
+     */
+    public function testBodyStructureWithOverriddenMagicGet()
+    {
+        $reflection = new ReflectionClass('ProxyManagerTestAsset\\ClassWithMagicMethods');
+        $magicGet   = new MagicGet($reflection, $this->initializer, $this->initMethod, $this->publicProperties);
+
+        $this->assertSame('__get', $magicGet->getName());
+        $this->assertCount(1, $magicGet->getParameters());
+        $this->assertSame(
+            "\$this->foo && \$this->baz('__get', array('name' => \$name));\n\n"
+            . "if (isset(self::\$bar[\$name])) {\n    return \$this->\$name;\n}\n\n"
+            . "return parent::__get(\$name);",
+            $magicGet->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicIssetTest.php
@@ -0,0 +1,123 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicIsset;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicIsset}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicIssetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Zend\Code\Generator\PropertyGenerator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $initializer;
+
+    /**
+     * @var \Zend\Code\Generator\MethodGenerator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $initMethod;
+
+    /**
+     * @var \ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $publicProperties;
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function setUp()
+    {
+        $this->initializer      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $this->initMethod       = $this->getMock('Zend\\Code\\Generator\\MethodGenerator');
+        $this->publicProperties = $this
+            ->getMockBuilder('ProxyManager\\ProxyGenerator\\PropertyGenerator\\PublicPropertiesMap')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $this->initMethod->expects($this->any())->method('getName')->will($this->returnValue('baz'));
+        $this->publicProperties->expects($this->any())->method('isEmpty')->will($this->returnValue(false));
+        $this->publicProperties->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicIsset::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $magicIsset = new MagicIsset($reflection, $this->initializer, $this->initMethod, $this->publicProperties);
+
+        $this->assertSame('__isset', $magicIsset->getName());
+        $this->assertCount(1, $magicIsset->getParameters());
+        $this->assertStringMatchesFormat(
+            "\$this->foo && \$this->baz('__isset', array('name' => \$name));\n\n"
+            . "if (isset(self::\$bar[\$name])) {\n    return isset(\$this->\$name);\n}\n\n"
+            . "%areturn %s;",
+            $magicIsset->getBody()
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicIsset::__construct
+     */
+    public function testBodyStructureWithPublicProperties()
+    {
+        $reflection = new ReflectionClass(
+            'ProxyManagerTestAsset\\ProxyGenerator\\LazyLoading\\MethodGenerator\\ClassWithTwoPublicProperties'
+        );
+        $magicIsset = new MagicIsset($reflection, $this->initializer, $this->initMethod, $this->publicProperties);
+
+        $this->assertSame('__isset', $magicIsset->getName());
+        $this->assertCount(1, $magicIsset->getParameters());
+        $this->assertStringMatchesFormat(
+            "\$this->foo && \$this->baz('__isset', array('name' => \$name));\n\n"
+            . "if (isset(self::\$bar[\$name])) {\n    return isset(\$this->\$name);\n}\n\n"
+            . "%areturn %s;",
+            $magicIsset->getBody()
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicIsset::__construct
+     */
+    public function testBodyStructureWithOverriddenMagicGet()
+    {
+        $reflection = new ReflectionClass('ProxyManagerTestAsset\\ClassWithMagicMethods');
+        $magicIsset = new MagicIsset($reflection, $this->initializer, $this->initMethod, $this->publicProperties);
+
+        $this->assertSame('__isset', $magicIsset->getName());
+        $this->assertCount(1, $magicIsset->getParameters());
+        $this->assertSame(
+            "\$this->foo && \$this->baz('__isset', array('name' => \$name));\n\n"
+            . "if (isset(self::\$bar[\$name])) {\n    return isset(\$this->\$name);\n}\n\n"
+            . "return parent::__isset(\$name);",
+            $magicIsset->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicSetTest.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicSet;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicSet}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicSetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Zend\Code\Generator\PropertyGenerator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $initializer;
+
+    /**
+     * @var \Zend\Code\Generator\MethodGenerator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $initMethod;
+
+    /**
+     * @var \ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $publicProperties;
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function setUp()
+    {
+        $this->initializer      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $this->initMethod       = $this->getMock('Zend\\Code\\Generator\\MethodGenerator');
+        $this->publicProperties = $this
+            ->getMockBuilder('ProxyManager\\ProxyGenerator\\PropertyGenerator\\PublicPropertiesMap')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $this->initMethod->expects($this->any())->method('getName')->will($this->returnValue('baz'));
+        $this->publicProperties->expects($this->any())->method('isEmpty')->will($this->returnValue(false));
+        $this->publicProperties->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicSet::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $magicSet   = new MagicSet($reflection, $this->initializer, $this->initMethod, $this->publicProperties);
+
+        $this->assertSame('__set', $magicSet->getName());
+        $this->assertCount(2, $magicSet->getParameters());
+        $this->assertStringMatchesFormat(
+            "\$this->foo && \$this->baz('__set', array('name' => \$name, 'value' => \$value));\n\n"
+            . "if (isset(self::\$bar[\$name])) {\n    return (\$this->\$name = \$value);\n}\n\n"
+            . "%areturn %s;",
+            $magicSet->getBody()
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicSet::__construct
+     */
+    public function testBodyStructureWithPublicProperties()
+    {
+        $reflection = new ReflectionClass(
+            'ProxyManagerTestAsset\\ProxyGenerator\\LazyLoading\\MethodGenerator\\ClassWithTwoPublicProperties'
+        );
+
+        $magicSet   = new MagicSet($reflection, $this->initializer, $this->initMethod, $this->publicProperties);
+
+        $this->assertSame('__set', $magicSet->getName());
+        $this->assertCount(2, $magicSet->getParameters());
+        $this->assertStringMatchesFormat(
+            "\$this->foo && \$this->baz('__set', array('name' => \$name, 'value' => \$value));\n\n"
+            . "if (isset(self::\$bar[\$name])) {\n    return (\$this->\$name = \$value);\n}\n\n"
+            . "%areturn %s;",
+            $magicSet->getBody()
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicSet::__construct
+     */
+    public function testBodyStructureWithOverriddenMagicGet()
+    {
+        $reflection = new ReflectionClass('ProxyManagerTestAsset\\ClassWithMagicMethods');
+        $magicSet   = new MagicSet($reflection, $this->initializer, $this->initMethod, $this->publicProperties);
+
+        $this->assertSame('__set', $magicSet->getName());
+        $this->assertCount(2, $magicSet->getParameters());
+        $this->assertSame(
+            "\$this->foo && \$this->baz('__set', array('name' => \$name, 'value' => \$value));\n\n"
+            . "if (isset(self::\$bar[\$name])) {\n    return (\$this->\$name = \$value);\n}\n\n"
+            . "return parent::__set(\$name, \$value);",
+            $magicSet->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicSleepTest.php
@@ -0,0 +1,57 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicSleep;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicSleep}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicSleepTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicSleep::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection  = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $initializer = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $initMethod  = $this->getMock('Zend\\Code\\Generator\\MethodGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $initMethod->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+
+        $magicSleep = new MagicSleep($reflection, $initializer, $initMethod);
+
+        $this->assertSame('__sleep', $magicSleep->getName());
+        $this->assertCount(0, $magicSleep->getParameters());
+        $this->assertSame(
+            "\$this->foo && \$this->bar('__sleep', array());"
+            . "\n\nreturn array_keys((array) \$this);",
+            $magicSleep->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/MethodGenerator/MagicUnsetTest.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicUnset;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicUnset}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicUnsetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Zend\Code\Generator\PropertyGenerator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $initializer;
+
+    /**
+     * @var \Zend\Code\Generator\MethodGenerator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $initMethod;
+
+    /**
+     * @var \ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $publicProperties;
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function setUp()
+    {
+        $this->initializer      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $this->initMethod       = $this->getMock('Zend\\Code\\Generator\\MethodGenerator');
+        $this->publicProperties = $this
+            ->getMockBuilder('ProxyManager\\ProxyGenerator\\PropertyGenerator\\PublicPropertiesMap')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $this->initMethod->expects($this->any())->method('getName')->will($this->returnValue('baz'));
+        $this->publicProperties->expects($this->any())->method('isEmpty')->will($this->returnValue(false));
+        $this->publicProperties->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicUnset::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $magicIsset = new MagicUnset($reflection, $this->initializer, $this->initMethod, $this->publicProperties);
+
+        $this->assertSame('__unset', $magicIsset->getName());
+        $this->assertCount(1, $magicIsset->getParameters());
+        $this->assertStringMatchesFormat(
+            "\$this->foo && \$this->baz('__unset', array('name' => \$name));\n\n"
+            . "if (isset(self::\$bar[\$name])) {\n    unset(\$this->\$name);\n\n    return;\n}"
+            . "%areturn %s;",
+            $magicIsset->getBody()
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicUnset::__construct
+     */
+    public function testBodyStructureWithPublicProperties()
+    {
+        $reflection = new ReflectionClass(
+            'ProxyManagerTestAsset\\ProxyGenerator\\LazyLoading\\MethodGenerator\\ClassWithTwoPublicProperties'
+        );
+
+        $magicIsset = new MagicUnset($reflection, $this->initializer, $this->initMethod, $this->publicProperties);
+
+        $this->assertSame('__unset', $magicIsset->getName());
+        $this->assertCount(1, $magicIsset->getParameters());
+        $this->assertStringMatchesFormat(
+            "\$this->foo && \$this->baz('__unset', array('name' => \$name));\n\n"
+            . "if (isset(self::\$bar[\$name])) {\n    unset(\$this->\$name);\n\n    return;\n}"
+            . "%areturn %s;",
+            $magicIsset->getBody()
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\MagicUnset::__construct
+     */
+    public function testBodyStructureWithOverriddenMagicGet()
+    {
+        $reflection = new ReflectionClass('ProxyManagerTestAsset\\ClassWithMagicMethods');
+        $magicIsset = new MagicUnset($reflection, $this->initializer, $this->initMethod, $this->publicProperties);
+
+        $this->assertSame('__unset', $magicIsset->getName());
+        $this->assertCount(1, $magicIsset->getParameters());
+        $this->assertSame(
+            "\$this->foo && \$this->baz('__unset', array('name' => \$name));\n\n"
+            . "if (isset(self::\$bar[\$name])) {\n    unset(\$this->\$name);\n\n    return;\n}\n\n"
+            . "return parent::__unset(\$name);",
+            $magicIsset->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/MethodGenerator/SetProxyInitializerTest.php
@@ -0,0 +1,56 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\SetProxyInitializer;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\SetProxyInitializer}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class SetProxyInitializerTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\MethodGenerator\SetProxyInitializer::__construct
+     */
+    public function testBodyStructure()
+    {
+        $initializer = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+
+        $setter     = new SetProxyInitializer($initializer);
+        $parameters = $setter->getParameters();
+
+        $this->assertSame('setProxyInitializer', $setter->getName());
+        $this->assertCount(1, $parameters);
+
+        /* @var $initializer \ProxyManager\Generator\ParameterGenerator */
+        $initializer = array_shift($parameters);
+
+        $this->assertInstanceOf('ProxyManager\\Generator\\ParameterGenerator', $initializer);
+        $this->assertSame('initializer', $initializer->getName());
+        $this->assertSame('$this->foo = $initializer;', $setter->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/InitializationTrackerTest.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\PropertyGenerator;
+
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\InitializationTracker;
+use ProxyManagerTest\ProxyGenerator\PropertyGenerator\AbstractUniquePropertyNameTest;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\InitializationTracker}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\InitializationTracker
+ * @group Coverage
+ */
+class InitializationTrackerTest extends AbstractUniquePropertyNameTest
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected function createProperty()
+    {
+        return new InitializationTracker();
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/InitializerPropertyTest.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\PropertyGenerator;
+
+use ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\InitializerProperty;
+use ProxyManagerTest\ProxyGenerator\PropertyGenerator\AbstractUniquePropertyNameTest;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\InitializerProperty}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\InitializerProperty
+ * @group Coverage
+ */
+class InitializerPropertyTest extends AbstractUniquePropertyNameTest
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected function createProperty()
+    {
+        return new InitializerProperty();
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhostGeneratorTest.php
@@ -0,0 +1,49 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator;
+
+use ProxyManager\ProxyGenerator\LazyLoadingGhostGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhostGenerator}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhostGenerator
+ * @group Coverage
+ */
+class LazyLoadingGhostGeneratorTest extends AbstractProxyGeneratorTest
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected function getProxyGenerator()
+    {
+        return new LazyLoadingGhostGenerator();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getExpectedImplementedInterfaces()
+    {
+        return array('ProxyManager\\Proxy\\GhostObjectInterface');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/GetProxyInitializerTest.php
@@ -0,0 +1,49 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\GetProxyInitializer;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\GetProxyInitializer}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class GetProxyInitializerTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\GetProxyInitializer::__construct
+     */
+    public function testBodyStructure()
+    {
+        $initializer = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+
+        $getter = new GetProxyInitializer($initializer);
+
+        $this->assertSame('getProxyInitializer', $getter->getName());
+        $this->assertCount(0, $getter->getParameters());
+        $this->assertSame('return $this->foo;', $getter->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/InitializeProxyTest.php
@@ -0,0 +1,54 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\InitializeProxy;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\InitializeProxy}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class InitializeProxyTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\InitializeProxy::__construct
+     */
+    public function testBodyStructure()
+    {
+        $initializer = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $valueHolder = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+
+        $initializeProxy = new InitializeProxy($initializer, $valueHolder);
+
+        $this->assertSame('initializeProxy', $initializeProxy->getName());
+        $this->assertCount(0, $initializeProxy->getParameters());
+        $this->assertSame(
+            'return $this->foo && $this->foo->__invoke($this->bar, $this, \'initializeProxy\', array(), $this->foo);',
+            $initializeProxy->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/IsProxyInitializedTest.php
@@ -0,0 +1,49 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\IsProxyInitialized;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\IsProxyInitialized}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class IsProxyInitializedTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\IsProxyInitialized::__construct
+     */
+    public function testBodyStructure()
+    {
+        $valueHolder     = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+
+        $isProxyInitialized = new IsProxyInitialized($valueHolder);
+
+        $this->assertSame('isProxyInitialized', $isProxyInitialized->getName());
+        $this->assertCount(0, $isProxyInitialized->getParameters());
+        $this->assertSame('return null !== $this->bar;', $isProxyInitialized->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/LazyLoadingMethodInterceptorTest.php
@@ -0,0 +1,84 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\LazyLoadingMethodInterceptor;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\LazyLoadingMethodInterceptor}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class LazyLoadingMethodInterceptorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\LazyLoadingMethodInterceptor
+     */
+    public function testBodyStructure()
+    {
+        $initializer      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $valueHolder      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+
+        $reflection = new MethodReflection('ProxyManagerTestAsset\\BaseClass', 'publicByReferenceParameterMethod');
+        $method     = LazyLoadingMethodInterceptor::generateMethod($reflection, $initializer, $valueHolder);
+
+        $this->assertSame('publicByReferenceParameterMethod', $method->getName());
+        $this->assertCount(2, $method->getParameters());
+        $this->assertSame(
+            "\$this->foo && \$this->foo->__invoke(\$this->bar, \$this, 'publicByReferenceParameterMethod', "
+            . "array('param' => \$param, 'byRefParam' => \$byRefParam), \$this->foo);\n\n"
+            . "return \$this->bar->publicByReferenceParameterMethod(\$param, \$byRefParam);",
+            $method->getBody()
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\LazyLoadingMethodInterceptor
+     */
+    public function testBodyStructureWithoutParameters()
+    {
+        $reflectionMethod = new MethodReflection(__CLASS__, 'testBodyStructureWithoutParameters');
+        $initializer      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $valueHolder      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+
+        $method = LazyLoadingMethodInterceptor::generateMethod($reflectionMethod, $initializer, $valueHolder);
+
+        $this->assertSame('testBodyStructureWithoutParameters', $method->getName());
+        $this->assertCount(0, $method->getParameters());
+        $this->assertSame(
+            "\$this->foo && \$this->foo->__invoke(\$this->bar, \$this, "
+            . "'testBodyStructureWithoutParameters', array(), \$this->foo);\n\n"
+            . "return \$this->bar->testBodyStructureWithoutParameters();",
+            $method->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicCloneTest.php
@@ -0,0 +1,57 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicClone;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicClone}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicCloneTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicClone::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection  = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $initializer = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $valueHolder = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+
+        $magicClone = new MagicClone($reflection, $initializer, $valueHolder);
+
+        $this->assertSame('__clone', $magicClone->getName());
+        $this->assertCount(0, $magicClone->getParameters());
+        $this->assertSame(
+            "\$this->foo && \$this->foo->__invoke(\$this->bar, \$this, "
+            . "'__clone', array(), \$this->foo);\n\n\$this->bar = clone \$this->bar;",
+            $magicClone->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicGetTest.php
@@ -0,0 +1,65 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicGet;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicGet}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicGetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicGet::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection       = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $initializer      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $valueHolder      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $publicProperties = $this
+            ->getMockBuilder('ProxyManager\\ProxyGenerator\\PropertyGenerator\\PublicPropertiesMap')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+        $publicProperties->expects($this->any())->method('isEmpty')->will($this->returnValue(false));
+        $publicProperties->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+
+        $magicGet = new MagicGet($reflection, $initializer, $valueHolder, $publicProperties);
+
+        $this->assertSame('__get', $magicGet->getName());
+        $this->assertCount(1, $magicGet->getParameters());
+        $this->assertStringMatchesFormat(
+            "\$this->foo && \$this->foo->__invoke(\$this->bar, \$this, '__get', array('name' => \$name)"
+            . ", \$this->foo);\n\n"
+            . "if (isset(self::\$bar[\$name])) {\n    return \$this->bar->\$name;\n}"
+            . "%areturn %s;",
+            $magicGet->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicIssetTest.php
@@ -0,0 +1,65 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicIsset;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicIsset}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicIssetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicIsset::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection       = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $initializer      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $valueHolder      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $publicProperties = $this
+            ->getMockBuilder('ProxyManager\\ProxyGenerator\\PropertyGenerator\\PublicPropertiesMap')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+        $publicProperties->expects($this->any())->method('isEmpty')->will($this->returnValue(false));
+        $publicProperties->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+
+        $magicIsset = new MagicIsset($reflection, $initializer, $valueHolder, $publicProperties);
+
+        $this->assertSame('__isset', $magicIsset->getName());
+        $this->assertCount(1, $magicIsset->getParameters());
+        $this->assertStringMatchesFormat(
+            "\$this->foo && \$this->foo->__invoke(\$this->bar, \$this, '__isset', array('name' => \$name)"
+            . ", \$this->foo);\n\n"
+            . "if (isset(self::\$bar[\$name])) {\n    return isset(\$this->bar->\$name);\n}"
+            . "%areturn %s;",
+            $magicIsset->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicSetTest.php
@@ -0,0 +1,65 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicSet;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicSet}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicSetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicSet::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection       = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $initializer      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $valueHolder      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $publicProperties = $this
+            ->getMockBuilder('ProxyManager\\ProxyGenerator\\PropertyGenerator\\PublicPropertiesMap')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+        $publicProperties->expects($this->any())->method('isEmpty')->will($this->returnValue(false));
+        $publicProperties->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+
+        $magicSet = new MagicSet($reflection, $initializer, $valueHolder, $publicProperties);
+
+        $this->assertSame('__set', $magicSet->getName());
+        $this->assertCount(2, $magicSet->getParameters());
+        $this->assertStringMatchesFormat(
+            "\$this->foo && \$this->foo->__invoke(\$this->bar, \$this, "
+            . "'__set', array('name' => \$name, 'value' => \$value), \$this->foo);\n\n"
+            . "if (isset(self::\$bar[\$name])) {\n    return (\$this->bar->\$name = \$value);\n}"
+            . "%areturn %s;",
+            $magicSet->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicSleepTest.php
@@ -0,0 +1,57 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicSleep;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicSleep}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicSleepTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicSleep::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection  = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $initializer = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $valueHolder = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+
+        $magicSleep = new MagicSleep($reflection, $initializer, $valueHolder);
+
+        $this->assertSame('__sleep', $magicSleep->getName());
+        $this->assertCount(0, $magicSleep->getParameters());
+        $this->assertSame(
+            "\$this->foo && \$this->foo->__invoke(\$this->bar, \$this, '__sleep', array(), \$this->foo);"
+            . "\n\nreturn array('bar');",
+            $magicSleep->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/MagicUnsetTest.php
@@ -0,0 +1,65 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicUnset;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicUnset}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicUnsetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicUnset::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection       = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $initializer      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $valueHolder      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $publicProperties = $this
+            ->getMockBuilder('ProxyManager\\ProxyGenerator\\PropertyGenerator\\PublicPropertiesMap')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+        $publicProperties->expects($this->any())->method('isEmpty')->will($this->returnValue(false));
+        $publicProperties->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+
+        $magicIsset = new MagicUnset($reflection, $initializer, $valueHolder, $publicProperties);
+
+        $this->assertSame('__unset', $magicIsset->getName());
+        $this->assertCount(1, $magicIsset->getParameters());
+        $this->assertStringMatchesFormat(
+            "\$this->foo && \$this->foo->__invoke(\$this->bar, \$this, '__unset', array('name' => \$name)"
+            . ", \$this->foo);\n\n"
+            . "if (isset(self::\$bar[\$name])) {\n    unset(\$this->bar->\$name);\n\n    return;\n}"
+            . "%areturn %s;",
+            $magicIsset->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/MethodGenerator/SetProxyInitializerTest.php
@@ -0,0 +1,56 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\SetProxyInitializer;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\SetProxyInitializer}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class SetProxyInitializerTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\SetProxyInitializer::__construct
+     */
+    public function testBodyStructure()
+    {
+        $initializer = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $initializer->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+
+        $setter     = new SetProxyInitializer($initializer);
+        $parameters = $setter->getParameters();
+
+        $this->assertSame('setProxyInitializer', $setter->getName());
+        $this->assertCount(1, $parameters);
+
+        /* @var $initializer \ProxyManager\Generator\ParameterGenerator */
+        $initializer = array_shift($parameters);
+
+        $this->assertInstanceOf('ProxyManager\\Generator\\ParameterGenerator', $initializer);
+        $this->assertSame('initializer', $initializer->getName());
+        $this->assertSame('$this->foo = $initializer;', $setter->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/PropertyGenerator/InitializerPropertyTest.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator;
+
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\InitializerProperty;
+use ProxyManagerTest\ProxyGenerator\PropertyGenerator\AbstractUniquePropertyNameTest;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\InitializerProperty}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\InitializerProperty
+ * @group Coverage
+ */
+class InitializerPropertyTest extends AbstractUniquePropertyNameTest
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected function createProperty()
+    {
+        return new InitializerProperty();
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/PropertyGenerator/ValueHolderPropertyTest.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator;
+
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\ValueHolderProperty;
+use ProxyManagerTest\ProxyGenerator\PropertyGenerator\AbstractUniquePropertyNameTest;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\ValueHolderProperty}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\ValueHolderProperty
+ * @group Coverage
+ */
+class ValueHolderPropertyTest extends AbstractUniquePropertyNameTest
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected function createProperty()
+    {
+        return new ValueHolderProperty();
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolderGeneratorTest.php
@@ -0,0 +1,49 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator;
+
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator
+ * @group Coverage
+ */
+class LazyLoadingValueHolderGeneratorTest extends AbstractProxyGeneratorTest
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected function getProxyGenerator()
+    {
+        return new LazyLoadingValueHolderGenerator();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getExpectedImplementedInterfaces()
+    {
+        return array('ProxyManager\\Proxy\\VirtualProxyInterface');
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/NullObject/MethodGenerator/ConstructorTest.php
@@ -0,0 +1,64 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\NullObject\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\NullObject\MethodGenerator\Constructor;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\NullObject\MethodGenerator\Constructor}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class ConstructorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\NullObject\MethodGenerator\Constructor::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection  = new ReflectionClass('ProxyManagerTestAsset\\ClassWithMixedProperties');
+        $constructor = new Constructor($reflection);
+
+        $this->assertSame('__construct', $constructor->getName());
+        $this->assertCount(0, $constructor->getParameters());
+        $this->assertSame(
+            "\$this->publicProperty0 = null;\n\$this->publicProperty1 = null;\n\$this->publicProperty2 = null;",
+            $constructor->getBody()
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\NullObject\MethodGenerator\Constructor::__construct
+     */
+    public function testBodyStructureWithoutPublicProperties()
+    {
+        $reflection  = new ReflectionClass('ProxyManagerTestAsset\\ClassWithPrivateProperties');
+        $constructor = new Constructor($reflection);
+
+        $this->assertSame('__construct', $constructor->getName());
+        $this->assertCount(0, $constructor->getParameters());
+        $body = $constructor->getBody();
+        $this->assertTrue(empty($body));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/NullObject/MethodGenerator/NullObjectMethodInterceptorTest.php
@@ -0,0 +1,75 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\NullObject\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\NullObject\MethodGenerator\NullObjectMethodInterceptor;
+use Zend\Code\Reflection\MethodReflection;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\NullObject\MethodGenerator\NullObjectMethodInterceptor}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class NullObjectMethodInterceptorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\NullObject\MethodGenerator\NullObjectMethodInterceptor
+     */
+    public function testBodyStructure()
+    {
+        $reflection = new MethodReflection('ProxyManagerTestAsset\\BaseClass', 'publicByReferenceParameterMethod');
+        $method     = NullObjectMethodInterceptor::generateMethod($reflection);
+
+        $this->assertSame('publicByReferenceParameterMethod', $method->getName());
+        $this->assertCount(2, $method->getParameters());
+        $this->assertSame("", $method->getBody());
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\NullObject\MethodGenerator\NullObjectMethodInterceptor
+     */
+    public function testBodyStructureWithoutParameters()
+    {
+        $reflectionMethod = new MethodReflection(__CLASS__, 'testBodyStructureWithoutParameters');
+
+        $method = NullObjectMethodInterceptor::generateMethod($reflectionMethod);
+
+        $this->assertSame('testBodyStructureWithoutParameters', $method->getName());
+        $this->assertCount(0, $method->getParameters());
+        $this->assertSame("", $method->getBody());
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\NullObject\MethodGenerator\NullObjectMethodInterceptor
+     */
+    public function testBodyStructureWithoutByRefReturn()
+    {
+        $reflectionMethod = new MethodReflection('ProxyManagerTestAsset\BaseClass', 'publicByReferenceMethod');
+
+        $method = NullObjectMethodInterceptor::generateMethod($reflectionMethod);
+
+        $this->assertSame('publicByReferenceMethod', $method->getName());
+        $this->assertCount(0, $method->getParameters());
+        $this->assertStringMatchesFormat("\$ref%s = null;\nreturn \$ref%s;", $method->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/NullObjectGeneratorTest.php
@@ -0,0 +1,113 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
+use ProxyManager\ProxyGenerator\NullObjectGenerator;
+use ReflectionClass;
+use ReflectionProperty;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\NullObjectGenerator}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\NullObjectGenerator
+ * @group Coverage
+ */
+class NullObjectGeneratorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider getTestedImplementations
+     *
+     * Verifies that generated code is valid and implements expected interfaces
+     */
+    public function testGeneratesValidCode($className)
+    {
+        $generator          = $this->getProxyGenerator();
+        $generatedClassName = UniqueIdentifierGenerator::getIdentifier('AbstractProxyGeneratorTest');
+        $generatedClass     = new ClassGenerator($generatedClassName);
+        $originalClass      = new ReflectionClass($className);
+        $generatorStrategy  = new EvaluatingGeneratorStrategy();
+
+        $generator->generate($originalClass, $generatedClass);
+        $generatorStrategy->generate($generatedClass);
+
+        $generatedReflection = new ReflectionClass($generatedClassName);
+
+        if ($originalClass->isInterface()) {
+            $this->assertTrue($generatedReflection->implementsInterface($className));
+        }
+
+        $this->assertSame($generatedClassName, $generatedReflection->getName());
+
+        foreach ($this->getExpectedImplementedInterfaces() as $interface) {
+            $this->assertTrue($generatedReflection->implementsInterface($interface));
+        }
+
+        $proxyGenerated = new $generatedClassName();
+
+        foreach ($generatedReflection->getProperties(ReflectionProperty::IS_PUBLIC) as $property) {
+            $this->assertNull($proxyGenerated->$property);
+        }
+
+        /** @var \ReflectionMethod $method */
+        foreach ($generatedReflection->getMethods(ReflectionProperty::IS_PUBLIC) as $method) {
+            if ($method->getNumberOfParameters() == 0) {
+                $this->assertNull(call_user_func(array($proxyGenerated, $method->getName())));
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getProxyGenerator()
+    {
+        return new NullObjectGenerator();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getExpectedImplementedInterfaces()
+    {
+        return array(
+            'ProxyManager\\Proxy\\NullObjectInterface',
+        );
+    }
+
+    /**
+     * @return array
+     */
+    public function getTestedImplementations()
+    {
+        return array(
+            array('ProxyManagerTestAsset\\BaseClass'),
+            array('ProxyManagerTestAsset\\ClassWithMagicMethods'),
+            array('ProxyManagerTestAsset\\ClassWithByRefMagicMethods'),
+            array('ProxyManagerTestAsset\\ClassWithMixedProperties'),
+            array('ProxyManagerTestAsset\\BaseInterface'),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/PropertyGenerator/AbstractUniquePropertyNameTest.php
@@ -0,0 +1,49 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\PropertyGenerator;
+
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Base test for unique property names
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+abstract class AbstractUniquePropertyNameTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * Verifies that a given property name is unique across two different instantiations of the property
+     */
+    public function testUniqueProperty()
+    {
+        $property1 = $this->createProperty();
+        $property2 = $this->createProperty();
+
+        $this->assertSame($property1->getName(), $property1->getName());
+        $this->assertNotEquals($property1->getName(), $property2->getName());
+    }
+
+    /**
+     * @return \Zend\Code\Generator\PropertyGenerator
+     */
+    abstract protected function createProperty();
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/PropertyGenerator/PublicPropertiesDefaultsTest.php
@@ -0,0 +1,72 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesDefaults;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesDefaults}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesDefaults
+ * @group Coverage
+ */
+class PublicPropertiesDefaultsTest extends PHPUnit_Framework_TestCase
+{
+    public function testEmptyClass()
+    {
+        $publicProperties = new PublicPropertiesDefaults(new ReflectionClass('ProxyManagerTestAsset\\EmptyClass'));
+
+        $this->assertInternalType('array', $publicProperties->getDefaultValue()->getValue());
+        $this->assertEmpty($publicProperties->getDefaultValue()->getValue());
+        $this->assertTrue($publicProperties->isStatic());
+        $this->assertSame(PublicPropertiesDefaults::VISIBILITY_PRIVATE, $publicProperties->getVisibility());
+    }
+
+    public function testClassWithPublicProperties()
+    {
+        $publicProperties = new PublicPropertiesDefaults(
+            new ReflectionClass('ProxyManagerTestAsset\\ClassWithPublicProperties')
+        );
+
+        $this->assertInternalType('array', $publicProperties->getDefaultValue()->getValue());
+        $this->assertCount(10, $publicProperties->getDefaultValue()->getValue());
+        $this->assertTrue($publicProperties->isStatic());
+        $this->assertSame(PublicPropertiesDefaults::VISIBILITY_PRIVATE, $publicProperties->getVisibility());
+    }
+
+    public function testBaseClass()
+    {
+        $publicProperties = new PublicPropertiesDefaults(
+            new ReflectionClass('ProxyManagerTestAsset\\BaseClass')
+        );
+
+        $this->assertInternalType('array', $publicProperties->getDefaultValue()->getValue());
+        $this->assertSame(
+            array('publicProperty' => 'publicPropertyDefault'),
+            $publicProperties->getDefaultValue()->getValue()
+        );
+        $this->assertTrue($publicProperties->isStatic());
+        $this->assertSame(PublicPropertiesDefaults::VISIBILITY_PRIVATE, $publicProperties->getVisibility());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/PropertyGenerator/PublicPropertiesMapTest.php
@@ -0,0 +1,59 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap
+ * @group Coverage
+ */
+class PublicPropertiesMapTest extends PHPUnit_Framework_TestCase
+{
+    public function testEmptyClass()
+    {
+        $publicProperties = new PublicPropertiesMap(new ReflectionClass('ProxyManagerTestAsset\\EmptyClass'));
+
+        $this->assertInternalType('array', $publicProperties->getDefaultValue()->getValue());
+        $this->assertEmpty($publicProperties->getDefaultValue()->getValue());
+        $this->assertTrue($publicProperties->isStatic());
+        $this->assertSame('private', $publicProperties->getVisibility());
+        $this->assertTrue($publicProperties->isEmpty());
+    }
+
+    public function testClassWithPublicProperties()
+    {
+        $publicProperties = new PublicPropertiesMap(
+            new ReflectionClass('ProxyManagerTestAsset\\ClassWithPublicProperties')
+        );
+
+        $this->assertInternalType('array', $publicProperties->getDefaultValue()->getValue());
+        $this->assertCount(10, $publicProperties->getDefaultValue()->getValue());
+        $this->assertTrue($publicProperties->isStatic());
+        $this->assertSame('private', $publicProperties->getVisibility());
+        $this->assertFalse($publicProperties->isEmpty());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/RemoteObject/MethodGenerator/ConstructorTest.php
@@ -0,0 +1,54 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\RemoteObject\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\Constructor;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\Constructor}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class ConstructorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\Constructor::__construct
+     */
+    public function testBodyStructure()
+    {
+        $adapter = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $adapter->expects($this->any())->method('getName')->will($this->returnValue('adapter'));
+
+        $reflection  = new ReflectionClass('ProxyManagerTestAsset\\ClassWithMixedProperties');
+        $constructor = new Constructor($reflection, $adapter);
+
+        $this->assertSame('__construct', $constructor->getName());
+        $this->assertCount(1, $constructor->getParameters());
+        $this->assertSame(
+            "\$this->adapter = \$adapter;\nunset(\$this->publicProperty0);"
+            . "\nunset(\$this->publicProperty1);\nunset(\$this->publicProperty2);",
+            $constructor->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/RemoteObject/MethodGenerator/MagicGetTest.php
@@ -0,0 +1,54 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\RemoteObject\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\MagicGet;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\MagicGet}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicGetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\MagicGet::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection   = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $adapter      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $adapter->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+
+        $magicGet     = new MagicGet($reflection, $adapter);
+
+        $this->assertSame('__get', $magicGet->getName());
+        $this->assertCount(1, $magicGet->getParameters());
+        $this->assertStringMatchesFormat(
+            '$return = $this->foo->call(\'ProxyManagerTestAsset\\\EmptyClass\', \'__get\', array($name));'
+            . "\n\nreturn \$return;",
+            $magicGet->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/RemoteObject/MethodGenerator/MagicIssetTest.php
@@ -0,0 +1,54 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\RemoteObject\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\MagicIsset;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\MagicIsset}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicIssetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\MagicIsset::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection   = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $adapter      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $adapter->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+
+        $magicGet     = new MagicIsset($reflection, $adapter);
+
+        $this->assertSame('__isset', $magicGet->getName());
+        $this->assertCount(1, $magicGet->getParameters());
+        $this->assertStringMatchesFormat(
+            '$return = $this->foo->call(\'ProxyManagerTestAsset\\\EmptyClass\', \'__isset\', array($name));'
+            . "\n\nreturn \$return;",
+            $magicGet->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/RemoteObject/MethodGenerator/MagicSetTest.php
@@ -0,0 +1,54 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\RemoteObject\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\MagicSet;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\MagicSet}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicSetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\MagicSet::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection   = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $adapter      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $adapter->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+
+        $magicGet     = new MagicSet($reflection, $adapter);
+
+        $this->assertSame('__set', $magicGet->getName());
+        $this->assertCount(2, $magicGet->getParameters());
+        $this->assertStringMatchesFormat(
+            '$return = $this->foo->call(\'ProxyManagerTestAsset\\\EmptyClass\', \'__set\', array($name, $value));'
+            . "\n\nreturn \$return;",
+            $magicGet->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/RemoteObject/MethodGenerator/MagicUnsetTest.php
@@ -0,0 +1,54 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\RemoteObject\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\MagicUnset;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\MagicUnset}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicUnsetTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\MagicUnset::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection   = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $adapter      = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $adapter->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+
+        $magicGet     = new MagicUnset($reflection, $adapter);
+
+        $this->assertSame('__unset', $magicGet->getName());
+        $this->assertCount(1, $magicGet->getParameters());
+        $this->assertStringMatchesFormat(
+            '$return = $this->foo->call(\'ProxyManagerTestAsset\\\EmptyClass\', \'__unset\', array($name));'
+            . "\n\nreturn \$return;",
+            $magicGet->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/RemoteObject/MethodGenerator/RemoteObjectMethodTest.php
@@ -0,0 +1,116 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\RemoteObject\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\RemoteObjectMethod;
+use Zend\Code\Reflection\MethodReflection;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\RemoteObjectMethod}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class RemoteObjectMethodTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\RemoteObjectMethod
+     */
+    public function testBodyStructureWithParameters()
+    {
+        $adapter = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $adapter->expects($this->any())->method('getName')->will($this->returnValue('adapter'));
+
+        $reflectionMethod = new MethodReflection(
+            'ProxyManagerTestAsset\\BaseClass',
+            'publicByReferenceParameterMethod'
+        );
+
+        $method = RemoteObjectMethod::generateMethod(
+            $reflectionMethod,
+            $adapter,
+            new ReflectionClass('Zend\\Code\\Generator\\PropertyGenerator')
+        );
+
+        $this->assertSame('publicByReferenceParameterMethod', $method->getName());
+        $this->assertCount(2, $method->getParameters());
+        $this->assertSame(
+            '$return = $this->adapter->call(\'Zend\\\Code\\\Generator\\\PropertyGenerator\', '
+            . '\'publicByReferenceParameterMethod\', array($param, $byRefParam));'
+            . "\n\nreturn \$return;",
+            $method->getBody()
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\RemoteObjectMethod
+     */
+    public function testBodyStructureWithArrayParameter()
+    {
+        $adapter = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $adapter->expects($this->any())->method('getName')->will($this->returnValue('adapter'));
+
+        $reflectionMethod = new MethodReflection('ProxyManagerTestAsset\\BaseClass', 'publicArrayHintedMethod');
+
+        $method = RemoteObjectMethod::generateMethod(
+            $reflectionMethod,
+            $adapter,
+            new ReflectionClass('Zend\\Code\\Generator\\PropertyGenerator')
+        );
+
+        $this->assertSame('publicArrayHintedMethod', $method->getName());
+        $this->assertCount(1, $method->getParameters());
+        $this->assertSame(
+            '$return = $this->adapter->call(\'Zend\\\Code\\\Generator\\\PropertyGenerator\', '
+            . '\'publicArrayHintedMethod\', array($param));'
+            . "\n\nreturn \$return;",
+            $method->getBody()
+        );
+    }
+
+    /**
+     * @covers \ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator\RemoteObjectMethod
+     */
+    public function testBodyStructureWithoutParameters()
+    {
+        $adapter = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+        $adapter->expects($this->any())->method('getName')->will($this->returnValue('adapter'));
+
+        $reflectionMethod = new MethodReflection(__CLASS__, 'testBodyStructureWithoutParameters');
+
+        $method = RemoteObjectMethod::generateMethod(
+            $reflectionMethod,
+            $adapter,
+            new ReflectionClass('Zend\\Code\\Generator\\PropertyGenerator')
+        );
+
+        $this->assertSame('testBodyStructureWithoutParameters', $method->getName());
+        $this->assertCount(0, $method->getParameters());
+        $this->assertSame(
+            '$return = $this->adapter->call(\'Zend\\\Code\\\Generator\\\PropertyGenerator\', '
+            . '\'testBodyStructureWithoutParameters\', array());'
+            . "\n\nreturn \$return;",
+            $method->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/RemoteObject/PropertyGenerator/AdapterPropertyTest.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\RemoteObject\PropertyGenerator;
+
+use ProxyManager\ProxyGenerator\RemoteObject\PropertyGenerator\AdapterProperty;
+use ProxyManagerTest\ProxyGenerator\PropertyGenerator\AbstractUniquePropertyNameTest;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\RemoteObject\PropertyGenerator\AdapterProperty}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\RemoteObject\PropertyGenerator\AdapterProperty
+ * @group Coverage
+ */
+class AdapterPropertyTest extends AbstractUniquePropertyNameTest
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected function createProperty()
+    {
+        return new AdapterProperty();
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/RemoteObjectGeneratorTest.php
@@ -0,0 +1,103 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
+use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
+use ProxyManager\ProxyGenerator\RemoteObjectGenerator;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\RemoteObjectGenerator}
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\RemoteObjectGenerator
+ * @group Coverage
+ */
+class RemoteObjectGeneratorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider getTestedImplementations
+     *
+     * Verifies that generated code is valid and implements expected interfaces
+     */
+    public function testGeneratesValidCode($className)
+    {
+        $generator          = $this->getProxyGenerator();
+        $generatedClassName = UniqueIdentifierGenerator::getIdentifier('AbstractProxyGeneratorTest');
+        $generatedClass     = new ClassGenerator($generatedClassName);
+        $originalClass      = new ReflectionClass($className);
+        $generatorStrategy  = new EvaluatingGeneratorStrategy();
+
+        $generator->generate($originalClass, $generatedClass);
+        $generatorStrategy->generate($generatedClass);
+
+        $generatedReflection = new ReflectionClass($generatedClassName);
+
+        if ($originalClass->isInterface()) {
+            $this->assertTrue($generatedReflection->implementsInterface($className));
+        } else {
+            $this->assertEmpty(
+                array_diff($originalClass->getInterfaceNames(), $generatedReflection->getInterfaceNames())
+            );
+        }
+
+        $this->assertSame($generatedClassName, $generatedReflection->getName());
+
+        foreach ($this->getExpectedImplementedInterfaces() as $interface) {
+            $this->assertTrue($generatedReflection->implementsInterface($interface));
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getProxyGenerator()
+    {
+        return new RemoteObjectGenerator();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getExpectedImplementedInterfaces()
+    {
+        return array(
+            'ProxyManager\\Proxy\\RemoteObjectInterface',
+        );
+    }
+
+    /**
+     * @return array
+     */
+    public function getTestedImplementations()
+    {
+        return array(
+            array('ProxyManagerTestAsset\\BaseClass'),
+            array('ProxyManagerTestAsset\\ClassWithMagicMethods'),
+            array('ProxyManagerTestAsset\\ClassWithByRefMagicMethods'),
+            array('ProxyManagerTestAsset\\ClassWithMixedProperties'),
+            array('ProxyManagerTestAsset\\BaseInterface'),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/Util/ProxiedMethodsFilterTest.php
@@ -0,0 +1,114 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\Util;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\Util\ProxiedMethodsFilter;
+use ReflectionClass;
+use ReflectionMethod;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\Util\ProxiedMethodsFilter}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\Util\ProxiedMethodsFilter
+ * @group Coverage
+ */
+class ProxiedMethodsFilterTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider expectedMethods
+     */
+    public function testFiltering(ReflectionClass $reflectionClass, $excludes, array $expectedMethods)
+    {
+        if (is_array($excludes)) {
+            $filtered = ProxiedMethodsFilter::getProxiedMethods($reflectionClass, $excludes);
+        } else {
+            $filtered = ProxiedMethodsFilter::getProxiedMethods($reflectionClass);
+        }
+
+        foreach ($filtered as $method) {
+            $this->assertInstanceOf('ReflectionMethod', $method);
+        }
+
+        $keys = array_map(
+            function (ReflectionMethod $method) {
+                return $method->getName();
+            },
+            $filtered
+        );
+
+        sort($keys);
+        sort($expectedMethods);
+
+        $this->assertSame($keys, $expectedMethods);
+    }
+
+    /**
+     * @return array[][]
+     */
+    public function expectedMethods()
+    {
+        return array(
+            array(
+                new ReflectionClass('ProxyManagerTestAsset\\BaseClass'),
+                null,
+                array(
+                    'publicArrayHintedMethod',
+                    'publicByReferenceMethod',
+                    'publicByReferenceParameterMethod',
+                    'publicMethod',
+                    'publicTypeHintedMethod',
+                ),
+            ),
+            array(
+                new ReflectionClass('ProxyManagerTestAsset\\EmptyClass'),
+                null,
+                array(),
+            ),
+            array(
+                new ReflectionClass('ProxyManagerTestAsset\\LazyLoadingMock'),
+                null,
+                array(),
+            ),
+            array(
+                new ReflectionClass('ProxyManagerTestAsset\\LazyLoadingMock'),
+                array(),
+                array(),
+            ),
+            array(
+                new ReflectionClass('ProxyManagerTestAsset\\HydratedObject'),
+                array('doFoo'),
+                array('__get'),
+            ),
+            array(
+                new ReflectionClass('ProxyManagerTestAsset\\HydratedObject'),
+                array('Dofoo'),
+                array('__get'),
+            ),
+            array(
+                new ReflectionClass('ProxyManagerTestAsset\\HydratedObject'),
+                array(),
+                array('doFoo', '__get'),
+            ),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/Util/PublicScopeSimulatorTest.php
@@ -0,0 +1,133 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\Util;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\Util\PublicScopeSimulator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\Util\PublicScopeSimulator}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\ProxyGenerator\Util\PublicScopeSimulator
+ * @group Coverage
+ */
+class PublicScopeSimulatorTest extends PHPUnit_Framework_TestCase
+{
+    public function testSimpleGet()
+    {
+        $code = PublicScopeSimulator::getPublicAccessSimulationCode(
+            PublicScopeSimulator::OPERATION_GET,
+            'foo',
+            null,
+            null,
+            'bar'
+        );
+
+        $this->assertStringMatchesFormat('%a{%areturn $%s->$foo;%a}%a$bar = %s;', $code);
+    }
+
+    public function testSimpleSet()
+    {
+        $code = PublicScopeSimulator::getPublicAccessSimulationCode(
+            PublicScopeSimulator::OPERATION_SET,
+            'foo',
+            'baz',
+            null,
+            'bar'
+        );
+
+        $this->assertStringMatchesFormat('%a{%areturn $%s->$foo = $baz;%a}%a$bar = %s;', $code);
+    }
+
+    public function testSimpleIsset()
+    {
+        $code = PublicScopeSimulator::getPublicAccessSimulationCode(
+            PublicScopeSimulator::OPERATION_ISSET,
+            'foo',
+            null,
+            null,
+            'bar'
+        );
+
+        $this->assertStringMatchesFormat('%a{%areturn isset($%s->$foo);%a}%a$bar = %s;', $code);
+    }
+
+    public function testSimpleUnset()
+    {
+        $code = PublicScopeSimulator::getPublicAccessSimulationCode(
+            PublicScopeSimulator::OPERATION_UNSET,
+            'foo',
+            null,
+            null,
+            'bar'
+        );
+
+        $this->assertStringMatchesFormat('%a{%aunset($%s->$foo);%a}%a$bar = %s;', $code);
+    }
+
+    public function testSetRequiresValueParameterName()
+    {
+        $this->setExpectedException('InvalidArgumentException');
+
+        PublicScopeSimulator::getPublicAccessSimulationCode(
+            PublicScopeSimulator::OPERATION_SET,
+            'foo',
+            null,
+            null,
+            'bar'
+        );
+    }
+
+    public function testDelegatesToValueHolderWhenAvailable()
+    {
+        $code = PublicScopeSimulator::getPublicAccessSimulationCode(
+            PublicScopeSimulator::OPERATION_SET,
+            'foo',
+            'baz',
+            new PropertyGenerator('valueHolder'),
+            'bar'
+        );
+
+        $this->assertStringMatchesFormat(
+            '%A$targetObject = $this->valueHolder;%a{%areturn $%s->$foo = $baz;%a}%a$bar = %s;',
+            $code
+        );
+    }
+
+    public function testSetRequiresValidOperation()
+    {
+        $this->setExpectedException('InvalidArgumentException');
+
+        PublicScopeSimulator::getPublicAccessSimulationCode('invalid', 'foo');
+    }
+
+    public function testWillReturnDirectlyWithNoReturnParam()
+    {
+        $code = PublicScopeSimulator::getPublicAccessSimulationCode(
+            PublicScopeSimulator::OPERATION_GET,
+            'foo'
+        );
+
+        $this->assertStringMatchesFormat('%a{%areturn $%s->$foo;%a}%areturn %s;', $code);
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/ValueHolder/MethodGenerator/GetWrappedValueHolderValueTest.php
@@ -0,0 +1,49 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\ValueHolder\MethodGenerator;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\GetWrappedValueHolderValue;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\GetWrappedValueHolderValue}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class GetWrappedValueHolderValueTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\GetWrappedValueHolderValue::__construct
+     */
+    public function testBodyStructure()
+    {
+        $valueHolder = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('foo'));
+
+        $getter = new GetWrappedValueHolderValue($valueHolder);
+
+        $this->assertSame('getWrappedValueHolderValue', $getter->getName());
+        $this->assertCount(0, $getter->getParameters());
+        $this->assertSame('return $this->foo;', $getter->getBody());
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/ProxyGenerator/ValueHolder/MethodGenerator/MagicSleepTest.php
@@ -0,0 +1,54 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\ProxyGenerator\ValueHolder\MethodGenerator;
+
+use ReflectionClass;
+use PHPUnit_Framework_TestCase;
+use ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\MagicSleep;
+
+/**
+ * Tests for {@see \ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\MagicSleep}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @group Coverage
+ */
+class MagicSleepTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers \ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\MagicSleep::__construct
+     */
+    public function testBodyStructure()
+    {
+        $reflection  = new ReflectionClass('ProxyManagerTestAsset\\EmptyClass');
+        $valueHolder = $this->getMock('Zend\\Code\\Generator\\PropertyGenerator');
+
+        $valueHolder->expects($this->any())->method('getName')->will($this->returnValue('bar'));
+
+        $magicSleep = new MagicSleep($reflection, $valueHolder);
+
+        $this->assertSame('__sleep', $magicSleep->getName());
+        $this->assertCount(0, $magicSleep->getParameters());
+        $this->assertSame(
+            "return array('bar');",
+            $magicSleep->getBody()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Signature/ClassSignatureGeneratorTest.php
@@ -0,0 +1,87 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Signature;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Signature\ClassSignatureGenerator;
+use Zend\Code\Generator\PropertyGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\Signature\ClassSignatureGenerator}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\Signature\ClassSignatureGenerator
+ * @group Coverage
+ */
+class ClassSignatureGeneratorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \ProxyManager\Signature\SignatureGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $signatureGenerator;
+
+    /**
+     * @var ClassSignatureGenerator
+     */
+    private $classSignatureGenerator;
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function setUp()
+    {
+        $this->signatureGenerator      = $this->getMock('ProxyManager\\Signature\\SignatureGeneratorInterface');
+        $this->classSignatureGenerator = new ClassSignatureGenerator($this->signatureGenerator);
+    }
+
+    public function testAddSignature()
+    {
+        /* @var $classGenerator \PHPUnit_Framework_MockObject_MockObject|\Zend\Code\Generator\ClassGenerator */
+        $classGenerator = $this->getMock('Zend\\Code\\Generator\\ClassGenerator');
+
+        $classGenerator
+            ->expects($this->once())
+            ->method('addPropertyFromGenerator')
+            ->with($this->callback(function (PropertyGenerator $property) {
+                return $property->getName() === 'signaturePropertyName'
+                    && $property->isStatic()
+                    && $property->getVisibility() === 'private'
+                    && $property->getDefaultValue()->getValue() === 'valid-signature';
+            }));
+
+        $this
+            ->signatureGenerator
+            ->expects($this->any())
+            ->method('generateSignature')
+            ->with(array('foo' => 'bar'))
+            ->will($this->returnValue('valid-signature'));
+
+        $this
+            ->signatureGenerator
+            ->expects($this->any())
+            ->method('generateSignatureKey')
+            ->with(array('foo' => 'bar'))
+            ->will($this->returnValue('PropertyName'));
+
+
+        $this->classSignatureGenerator->addSignature($classGenerator, array('foo' => 'bar'));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Signature/Exception/InvalidSignatureExceptionTest.php
@@ -0,0 +1,57 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Signature\Exception;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Signature\Exception\InvalidSignatureException;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\Signature\Exception\InvalidSignatureException}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\Signature\Exception\InvalidSignatureException
+ * @group Coverage
+ */
+class InvalidSignatureExceptionTest extends PHPUnit_Framework_TestCase
+{
+    public function testFromInvalidSignature()
+    {
+        $exception = InvalidSignatureException::fromInvalidSignature(
+            new ReflectionClass(__CLASS__),
+            array('foo' => 'bar', 'baz' => 'tab'),
+            'blah',
+            'expected-signature'
+        );
+
+        $this->assertInstanceOf(
+            'ProxyManager\Signature\Exception\InvalidSignatureException',
+            $exception
+        );
+
+        $this->assertSame(
+            'Found signature "blah" for class "'
+            . __CLASS__
+            . '" does not correspond to expected signature "expected-signature" for 2 parameters',
+            $exception->getMessage()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Signature/Exception/MissingSignatureExceptionTest.php
@@ -0,0 +1,56 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Signature\Exception;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Signature\Exception\MissingSignatureException;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\Signature\Exception\MissingSignatureException}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\Signature\Exception\MissingSignatureException
+ * @group Coverage
+ */
+class MissingSignatureExceptionTest extends PHPUnit_Framework_TestCase
+{
+    public function testFromMissingSignature()
+    {
+        $exception = MissingSignatureException::fromMissingSignature(
+            new ReflectionClass(__CLASS__),
+            array('foo' => 'bar', 'baz' => 'tab'),
+            'expected-signature'
+        );
+
+        $this->assertInstanceOf(
+            'ProxyManager\Signature\Exception\MissingSignatureException',
+            $exception
+        );
+
+        $this->assertSame(
+            'No signature found for class "'
+            . __CLASS__
+            . '", expected signature "expected-signature" for 2 parameters',
+            $exception->getMessage()
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Signature/SignatureCheckerTest.php
@@ -0,0 +1,117 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Signature;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Signature\SignatureChecker;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \ProxyManager\Signature\SignatureChecker}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\Signature\SignatureChecker
+ * @group Coverage
+ */
+class SignatureCheckerTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var string
+     */
+    protected $signatureExample = 'valid-signature';
+
+    /**
+     * @var SignatureChecker
+     */
+    private $signatureChecker;
+
+    /**
+     * @var \ProxyManager\Signature\SignatureGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $signatureGenerator;
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function setUp()
+    {
+        $this->signatureGenerator = $this->getMock('ProxyManager\Signature\SignatureGeneratorInterface');
+        $this->signatureChecker   = new SignatureChecker($this->signatureGenerator);
+    }
+
+    public function testCheckSignatureWithValidKey()
+    {
+        $this
+            ->signatureGenerator
+            ->expects($this->atLeastOnce())
+            ->method('generateSignatureKey')
+            ->with(array('foo' => 'bar'))
+            ->will($this->returnValue('Example'));
+        $this
+            ->signatureGenerator
+            ->expects($this->atLeastOnce())
+            ->method('generateSignature')
+            ->with(array('foo' => 'bar'))
+            ->will($this->returnValue('valid-signature'));
+
+        $this->signatureChecker->checkSignature(new ReflectionClass($this), array('foo' => 'bar'));
+    }
+
+    public function testCheckSignatureWithInvalidKey()
+    {
+        $this
+            ->signatureGenerator
+            ->expects($this->any())
+            ->method('generateSignatureKey')
+            ->with(array('foo' => 'bar'))
+            ->will($this->returnValue('InvalidKey'));
+        $this
+            ->signatureGenerator
+            ->expects($this->any())
+            ->method('generateSignature')
+            ->with(array('foo' => 'bar'))
+            ->will($this->returnValue('valid-signature'));
+
+        $this->setExpectedException('ProxyManager\Signature\Exception\MissingSignatureException');
+
+        $this->signatureChecker->checkSignature(new ReflectionClass($this), array('foo' => 'bar'));
+    }
+
+    public function testCheckSignatureWithInvalidValue()
+    {
+        $this
+            ->signatureGenerator
+            ->expects($this->any())
+            ->method('generateSignatureKey')
+            ->with(array('foo' => 'bar'))
+            ->will($this->returnValue('Example'));
+        $this
+            ->signatureGenerator
+            ->expects($this->any())
+            ->method('generateSignature')
+            ->with(array('foo' => 'bar'))
+            ->will($this->returnValue('invalid-signature'));
+
+        $this->setExpectedException('ProxyManager\Signature\Exception\InvalidSignatureException');
+
+        $this->signatureChecker->checkSignature(new ReflectionClass($this), array('foo' => 'bar'));
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/Signature/SignatureGeneratorTest.php
@@ -0,0 +1,116 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest\Signature;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Signature\SignatureGenerator;
+
+/**
+ * Tests for {@see \ProxyManager\Signature\SignatureGenerator}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\Signature\SignatureGenerator
+ * @group Coverage
+ */
+class SignatureGeneratorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var SignatureGenerator
+     */
+    private $signatureGenerator;
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function setUp()
+    {
+        $this->signatureGenerator = new SignatureGenerator;
+    }
+
+    /**
+     * @param array  $parameters
+     * @param string $expected
+     *
+     * @dataProvider signatures
+     */
+    public function testGenerateSignature(array $parameters, $expected)
+    {
+        $this->assertSame($expected, $this->signatureGenerator->generateSignature($parameters));
+    }
+
+    /**
+     * @param array  $parameters
+     * @param string $expected
+     *
+     * @dataProvider signatureKeys
+     */
+    public function testGenerateSignatureKey(array $parameters, $expected)
+    {
+        $this->assertSame($expected, $this->signatureGenerator->generateSignatureKey($parameters));
+    }
+
+    /**
+     * Data provider.
+     *
+     * @return array[]
+     */
+    public function signatures()
+    {
+        return array(
+            array(
+                array(),
+                'YTowOnt9'
+            ),
+            array(
+                array('foo' => 'bar'),
+                'YToxOntzOjM6ImZvbyI7czozOiJiYXIiO30='
+            ),
+            array(
+                array('foo' => 'bar', 'baz' => 'tab'),
+                'YToyOntzOjM6ImZvbyI7czozOiJiYXIiO3M6MzoiYmF6IjtzOjM6InRhYiI7fQ=='
+            ),
+            array(
+                array('bar'),
+                'YToxOntpOjA7czozOiJiYXIiO30='
+            ),
+            array(
+                array('bar', 'baz'),
+                'YToyOntpOjA7czozOiJiYXIiO2k6MTtzOjM6ImJheiI7fQ=='
+            ),
+        );
+    }
+
+    /**
+     * Data provider.
+     *
+     * @return array[]
+     */
+    public function signatureKeys()
+    {
+        return array(
+            array(array(), '40cd750bba9870f18aada2478b24840a'),
+            array(array('foo' => 'bar'), '49a3696adf0fbfacc12383a2d7400d51'),
+            array(array('foo' => 'bar', 'baz' => 'tab'), '3f3cabbf33bae82b0711205c913a8fa0'),
+            array(array('bar'), '6fc5f617053f53f56b4734453ec86daa'),
+            array(array('bar', 'baz'), 'b9f31192ffbb4aa958cd1c5f88540c1e'),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTest/VersionTest.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTest;
+
+use PHPUnit_Framework_TestCase;
+use ProxyManager\Version;
+
+/**
+ * Tests for {@see \ProxyManager\Version}
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ *
+ * @covers \ProxyManager\Version
+ * @group Coverage
+ */
+class VersionTest extends PHPUnit_Framework_TestCase
+{
+    public function testVersionNumberIsSemverCompliant()
+    {
+        $this->assertRegExp(
+            '/\d+\.\d+\.\d+(-(ALPHA|BETA|RC(\d+)?|DEV))?/i',
+            Version::VERSION
+        );
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/AccessInterceptorValueHolderMock.php
@@ -0,0 +1,55 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Base test class to catch instantiations of access interceptor value holders
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class AccessInterceptorValueHolderMock
+{
+    /**
+     * @var mixed
+     */
+    public $instance;
+
+    /**
+     * @var mixed
+     */
+    public $prefixInterceptors;
+
+    /**
+     * @var mixed
+     */
+    public $suffixInterceptors;
+
+    /**
+     * @param mixed $instance
+     * @param mixed $prefixInterceptors
+     * @param mixed $suffixInterceptors
+     */
+    public function __construct($instance, $prefixInterceptors, $suffixInterceptors)
+    {
+        $this->instance           = $instance;
+        $this->prefixInterceptors = $prefixInterceptors;
+        $this->suffixInterceptors = $suffixInterceptors;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/BaseClass.php
@@ -0,0 +1,108 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Base test class with various intercepted properties
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class BaseClass implements BaseInterface
+{
+    /**
+     * @var string
+     */
+    public $publicProperty = 'publicPropertyDefault';
+
+    /**
+     * @var string
+     */
+    protected $protectedProperty = 'protectedPropertyDefault';
+
+    /**
+     * @var string
+     */
+    private $privateProperty = 'privatePropertyDefault';
+
+    /**
+     * @return string
+     */
+    public function publicMethod()
+    {
+        return 'publicMethodDefault';
+    }
+
+    /**
+     * @return string
+     */
+    protected function protectedMethod()
+    {
+        return 'protectedMethodDefault';
+    }
+
+    /**
+     * @return string
+     */
+    private function privateMethod()
+    {
+        return 'privateMethodDefault';
+    }
+
+    /**
+     * @param \stdClass $param
+     *
+     * @return string
+     */
+    public function publicTypeHintedMethod(\stdClass $param)
+    {
+        return 'publicTypeHintedMethodDefault';
+    }
+
+    /**
+     * @param array $param
+     *
+     * @return string
+     */
+    public function publicArrayHintedMethod(array $param)
+    {
+        return 'publicArrayHintedMethodDefault';
+    }
+
+    /**
+     * @return string
+     */
+    public function & publicByReferenceMethod()
+    {
+        $returnValue = 'publicByReferenceMethodDefault';
+
+        return $returnValue;
+    }
+
+    /**
+     * @param mixed $param
+     * @param mixed $byRefParam
+     *
+     * @return string
+     */
+    public function publicByReferenceParameterMethod($param, & $byRefParam)
+    {
+        return 'publicByReferenceParameterMethodDefault';
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/BaseInterface.php
@@ -0,0 +1,33 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Base interface used to verify that the proxy generators can actually work with interfaces
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface BaseInterface
+{
+    /**
+     * @return string
+     */
+    public function publicMethod();
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/CallableTypeHintClass.php
@@ -0,0 +1,39 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Class with a callable type hint in a method - used to test callable type hint
+ * generation
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class CallableTypeHintClass
+{
+    /**
+     * @param callable $parameter
+     *
+     * @return callable
+     */
+    public function callableTypeHintMethod(callable $parameter)
+    {
+        return $parameter;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/ClassWithAbstractProtectedMethod.php
@@ -0,0 +1,33 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Class with one abstract protected method
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+abstract class ClassWithAbstractProtectedMethod
+{
+    /**
+     * @return void
+     */
+    abstract protected function protectedAbstractMethod();
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/ClassWithByRefMagicMethods.php
@@ -0,0 +1,74 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Test class used to verify that proxy-manager respects magic getters with a byref return value
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class ClassWithByRefMagicMethods
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function & __set($name, $value)
+    {
+        return array($name => $value);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function & __get($name)
+    {
+        return $name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function & __isset($name)
+    {
+        return (bool) $name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function & __unset($name)
+    {
+        return (bool) $name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function & __sleep()
+    {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function & __wakeup()
+    {
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/ClassWithFinalMagicMethods.php
@@ -0,0 +1,88 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Base test class to play around with final pre-existing magic methods
+ *
+ * @author Jefersson Nathan <malukenho@phpse.net>
+ * @license MIT
+ */
+class ClassWithFinalMagicMethods
+{
+    /**
+     * {@inheritDoc}
+     */
+    final public function __construct()
+    {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    final public function __set($name, $value)
+    {
+        return array($name => $value);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    final public function __get($name)
+    {
+        return $name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    final public function __isset($name)
+    {
+        return (bool) $name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    final public function __unset($name)
+    {
+        return (bool) $name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    final public function __sleep()
+    {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    final public function __wakeup()
+    {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    final public function __clone()
+    {
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/ClassWithFinalMethods.php
@@ -0,0 +1,42 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Base test class to play around with final pre-existing methods
+ *
+ * @author Jefersson Nathan <malukenho@phpse.net>
+ * @license MIT
+ */
+class ClassWithFinalMethods extends PHPUnit_Framework_TestCase
+{
+    final public function foo()
+    {
+    }
+
+    final private function bar()
+    {
+    }
+
+    final protected function baz()
+    {
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/ClassWithMagicMethods.php
@@ -0,0 +1,81 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Base test class to play around with pre-existing magic methods
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class ClassWithMagicMethods
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function __set($name, $value)
+    {
+        return array($name => $value);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function __get($name)
+    {
+        return $name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function __isset($name)
+    {
+        return (bool) $name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function __unset($name)
+    {
+        return (bool) $name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function __sleep()
+    {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function __wakeup()
+    {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function __clone()
+    {
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/ClassWithMethodWithDefaultParameters.php
@@ -0,0 +1,38 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Test asset class with method with default values
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class ClassWithMethodWithDefaultParameters
+{
+    /**
+     * @param array $parameter
+     *
+     * @return string
+     */
+    public function publicMethodWithDefaults(array $parameter = array('foo'))
+    {
+        return 'defaultValue';
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/ClassWithMixedProperties.php
@@ -0,0 +1,46 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Base test class to play around with mixed visibility properties
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class ClassWithMixedProperties
+{
+    public $publicProperty0       = 'publicProperty0';
+
+    public $publicProperty1       = 'publicProperty1';
+
+    public $publicProperty2       = 'publicProperty2';
+
+    protected $protectedProperty0 = 'protectedProperty0';
+
+    protected $protectedProperty1 = 'protectedProperty1';
+
+    protected $protectedProperty2 = 'protectedProperty2';
+
+    private $privateProperty0     = 'privateProperty0';
+
+    private $privateProperty1     = 'privateProperty1';
+
+    private $privateProperty2     = 'privateProperty2';
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/ClassWithPrivateProperties.php
@@ -0,0 +1,48 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Base test class to play around with private properties
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class ClassWithPrivateProperties
+{
+    private $property0 = 'property0';
+
+    private $property1 = 'property1';
+
+    private $property2 = 'property2';
+
+    private $property3 = 'property3';
+
+    private $property4 = 'property4';
+
+    private $property5 = 'property5';
+
+    private $property6 = 'property6';
+
+    private $property7 = 'property7';
+
+    private $property8 = 'property8';
+
+    private $property9 = 'property9';
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/ClassWithProtectedProperties.php
@@ -0,0 +1,48 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Base test class to play around with protected properties
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class ClassWithProtectedProperties
+{
+    protected $property0 = 'property0';
+
+    protected $property1 = 'property1';
+
+    protected $property2 = 'property2';
+
+    protected $property3 = 'property3';
+
+    protected $property4 = 'property4';
+
+    protected $property5 = 'property5';
+
+    protected $property6 = 'property6';
+
+    protected $property7 = 'property7';
+
+    protected $property8 = 'property8';
+
+    protected $property9 = 'property9';
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/ClassWithPublicArrayProperty.php
@@ -0,0 +1,31 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Base test class to verify that proxies actually modify the array keys of
+ * public properties that keep an array
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class ClassWithPublicArrayProperty
+{
+    public $arrayProperty = array();
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/ClassWithPublicProperties.php
@@ -0,0 +1,48 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Base test class to play around with public properties
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class ClassWithPublicProperties
+{
+    public $property0 = 'property0';
+
+    public $property1 = 'property1';
+
+    public $property2 = 'property2';
+
+    public $property3 = 'property3';
+
+    public $property4 = 'property4';
+
+    public $property5 = 'property5';
+
+    public $property6 = 'property6';
+
+    public $property7 = 'property7';
+
+    public $property8 = 'property8';
+
+    public $property9 = 'property9';
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/ClassWithSelfHint.php
@@ -0,0 +1,38 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Class with a `self` type hint in a method - used to test overriding method with the `self` type hint in generators
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class ClassWithSelfHint
+{
+    /**
+     * @param self $parameter
+     *
+     * @return self
+     */
+    public function selfHintMethod(self $parameter)
+    {
+        return $parameter;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/EmptyClass.php
@@ -0,0 +1,29 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Base test asset
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class EmptyClass
+{
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/FinalClass.php
@@ -0,0 +1,29 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Class that is final
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+final class FinalClass
+{
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/HydratedObject.php
@@ -0,0 +1,60 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Test object to be hydrated
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class HydratedObject
+{
+    /**
+     * @var mixed
+     */
+    public $foo = 1;
+
+    /**
+     * @var mixed
+     */
+    protected $bar = 2;
+
+    /**
+     * @var mixed
+     */
+    private $baz = 3;
+
+    /**
+     * Method to be disabled
+     */
+    public function doFoo()
+    {
+    }
+
+    /**
+     * @param string $name
+     *
+     * @return mixed
+     */
+    public function __get($name)
+    {
+        return $this->$name;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/LazyLoadingMock.php
@@ -0,0 +1,41 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Base test class to catch instantiations of lazy loading objects
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class LazyLoadingMock
+{
+    /**
+     * @var mixed
+     */
+    public $initializer;
+
+    /**
+     * @param mixed $initializer
+     */
+    public function __construct($initializer)
+    {
+        $this->initializer = $initializer;
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/NullObjectMock.php
@@ -0,0 +1,29 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset;
+
+/**
+ * Base test class to catch instantiations of null object
+ *
+ * @author Vincent Blanchon <blanchon.vincent@gmail.com>
+ * @license MIT
+ */
+class NullObjectMock
+{
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/ProxyGenerator/LazyLoading/MethodGenerator/ClassWithTwoPublicProperties.php
@@ -0,0 +1,38 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset\ProxyGenerator\LazyLoading\MethodGenerator;
+
+/**
+ * Test asset with 2 public properties
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class ClassWithTwoPublicProperties
+{
+    /**
+     * @var mixed
+     */
+    public $bar;
+
+    /**
+     * @var mixed
+     */
+    public $baz;
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/RemoteProxy/BazServiceInterface.php
@@ -0,0 +1,35 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset\RemoteProxy;
+
+/**
+ * Simple interface for a remote API
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface BazServiceInterface
+{
+    /**
+     * @param string $param
+     *
+     * @return string
+     */
+    public function baz($param);
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/RemoteProxy/Foo.php
@@ -0,0 +1,56 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset\RemoteProxy;
+
+/**
+ * Simple interface for a remote API
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+class Foo implements FooServiceInterface, BazServiceInterface
+{
+    /**
+     * @return string
+     */
+    public function foo()
+    {
+        return 'bar remote';
+    }
+
+    /**
+     * @param string $param
+     *
+     * @return string
+     */
+    public function baz($param)
+    {
+        return $param . ' remote';
+    }
+
+    /**
+     * @param string $name
+     *
+     * @return string
+     */
+    public function __get($name)
+    {
+        return $name . ' remote';
+    }
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/ProxyManagerTestAsset/RemoteProxy/FooServiceInterface.php
@@ -0,0 +1,33 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license.
+ */
+
+namespace ProxyManagerTestAsset\RemoteProxy;
+
+/**
+ * Simple interface for a remote API
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ * @license MIT
+ */
+interface FooServiceInterface
+{
+    /**
+     * @return string
+     */
+    public function foo();
+}
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/README.md
@@ -0,0 +1,9 @@
+## Integration tests for PHP language features of proxies
+
+Since proxies are quire complex code, this directory is dedicated
+to integration tests that are supposed to cause fatal errors or
+failures in general that are hard to handle in traditional
+PHPUnit test cases.
+
+You may find a guide on how to write `.phpt` tests on the
+[PHP QA website](http://qa.php.net/write-test.php).
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-denies-private-property-isset.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated access interceptors disallow private property direct isset check
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets = 'candy';
+}
+
+$factory = new \ProxyManager\Factory\AccessInterceptorValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+var_dump(isset($proxy->sweets));
+?>
+--EXPECT--
+bool(false)
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-denies-private-property-read.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated access interceptors disallow private property direct read
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets;
+}
+
+$factory = new \ProxyManager\Factory\AccessInterceptorValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+$proxy->sweets;
+?>
+--EXPECTF--
+%SFatal error: Cannot access private property %s::$sweets in %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-denies-private-property-unset.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated access interceptors disallow private property direct unset
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets;
+}
+
+$factory = new \ProxyManager\Factory\AccessInterceptorValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+unset($proxy->sweets);
+?>
+--EXPECTF--
+%SFatal error: Cannot %s property %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-denies-private-property-write.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated access interceptors disallow private property direct write
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets;
+}
+
+$factory = new \ProxyManager\Factory\AccessInterceptorValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+$proxy->sweets = 'stolen';
+?>
+--EXPECTF--
+%SFatal error: Cannot access %s property%S in %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-denies-protected-property-isset.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated access interceptors disallow protected property direct isset check
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    protected $sweets = 'candy';
+}
+
+$factory = new \ProxyManager\Factory\AccessInterceptorValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+var_dump(isset($proxy->sweets));
+?>
+--EXPECT--
+bool(false)
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-denies-protected-property-read.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated access interceptors disallow protected property direct read
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    protected $sweets;
+}
+
+$factory = new \ProxyManager\Factory\AccessInterceptorValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+$proxy->sweets;
+?>
+--EXPECTF--
+%SFatal error: Cannot access protected property %s::$sweets in %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-denies-protected-property-unset.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated access interceptors disallow protected property direct unset
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    protected $sweets;
+}
+
+$factory = new \ProxyManager\Factory\AccessInterceptorValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+unset($proxy->sweets);
+?>
+--EXPECTF--
+%SFatal error: Cannot %s property%sin %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-denies-protected-property-write.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated access interceptors disallow protected property direct write
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    protected $sweets;
+}
+
+$factory = new \ProxyManager\Factory\AccessInterceptorValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+$proxy->sweets = 'stolen';
+?>
+--EXPECTF--
+%SFatal error: Cannot %s property%sin %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-scope-localizer-denies-private-property-isset.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Verifies that generated access interceptors disallow private property direct isset check
+--SKIPIF--
+<?php
+if (! method_exists('Closure', 'bind')) {
+    echo 'skip PHP 5.4+ is needed to localize private properties';
+}
+?>
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets = 'candy';
+}
+
+$factory = new \ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+var_dump(isset($proxy->sweets));
+?>
+--EXPECT--
+bool(false)
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-scope-localizer-denies-private-property-read.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Verifies that generated access interceptors disallow private property direct read
+--SKIPIF--
+<?php
+if (! method_exists('Closure', 'bind')) {
+    echo 'skip PHP 5.4+ is needed to localize private properties';
+}
+?>
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets;
+}
+
+$factory = new \ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+$proxy->sweets;
+?>
+--EXPECTF--
+%SFatal error: Cannot access private property %s::$sweets in %s on line %d
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-scope-localizer-denies-private-property-unset.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Verifies that generated access interceptors disallow private property direct unset
+--SKIPIF--
+<?php
+if (! method_exists('Closure', 'bind')) {
+    echo 'skip PHP 5.4+ is needed to localize private properties';
+}
+?>
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets;
+}
+
+$factory = new \ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+unset($proxy->sweets);
+?>
+--EXPECTF--
+%SFatal error: Cannot %s property%sin %s on line %d
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-scope-localizer-denies-private-property-write.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Verifies that generated access interceptors disallow private property direct write
+--SKIPIF--
+<?php
+if (! method_exists('Closure', 'bind')) {
+    echo 'skip PHP 5.4+ is needed to localize private properties';
+}
+?>
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets;
+}
+
+$factory = new \ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+$proxy->sweets = 'stolen';
+?>
+--EXPECTF--
+%SFatal error: Cannot %s property%sin %s on line %d
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-scope-localizer-denies-protected-property-isset.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated access interceptors disallow protected property direct isset check
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    protected $sweets = 'candy';
+}
+
+$factory = new \ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+var_dump(isset($proxy->sweets));
+?>
+--EXPECT--
+bool(false)
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-scope-localizer-denies-protected-property-read.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated access interceptors disallow protected property direct read
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    protected $sweets;
+}
+
+$factory = new \ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+$proxy->sweets;
+?>
+--EXPECTF--
+%SFatal error: Cannot access protected property %s::$sweets in %s on line %d
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-scope-localizer-denies-protected-property-unset.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated access interceptors disallow protected property direct unset
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    protected $sweets;
+}
+
+$factory = new \ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+unset($proxy->sweets);
+?>
+--EXPECTF--
+%SFatal error: Cannot %s property%sin %s on line %d
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-scope-localizer-denies-protected-property-write.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated access interceptors disallow protected property direct write
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    protected $sweets;
+}
+
+$factory = new \ProxyManager\Factory\AccessInterceptorScopeLocalizerFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+$proxy->sweets = 'stolen';
+?>
+--EXPECTF--
+%SFatal error: Cannot %s property%sin %s on line %d
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/access-interceptor-with-cache.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Verifies that access interceptor proxy file is generated
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets = 'candy';
+}
+
+$configuration->setProxiesTargetDir(__DIR__ . '/cache');
+$fileLocator = new \ProxyManager\FileLocator\FileLocator($configuration->getProxiesTargetDir());
+$configuration->setGeneratorStrategy(
+    new \ProxyManager\GeneratorStrategy\FileWriterGeneratorStrategy($fileLocator)
+);
+
+$factory = new \ProxyManager\Factory\AccessInterceptorValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy(new Kitchen());
+
+$filename = $fileLocator->getProxyFileName(get_class($proxy));
+var_dump(file_exists($filename));
+
+$proxy = $factory->createProxy(new Kitchen());
+
+var_dump(file_exists($filename));
+@unlink($filename);
+
+?>
+--EXPECT--
+bool(true)
+bool(true)
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/cache/README.md
@@ -0,0 +1,3 @@
+## Integration tests for PHP language features of proxies
+
+This folder is used for the caches
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/init.php
@@ -0,0 +1,10 @@
+<?php
+
+use ProxyManager\Configuration;
+use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
+
+require_once __DIR__ . '/../../vendor/autoload.php';
+
+$configuration = new Configuration();
+
+$configuration->setGeneratorStrategy(new EvaluatingGeneratorStrategy());
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-ghost-allows-inexisting-magic-property-read.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Verifies that generated lazy loading ghost objects disallow reading non-existing properties via direct read
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets;
+
+    public function & __get($name)
+    {
+        return $name;
+    }
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingGhostFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function () {});
+
+echo $proxy->nonExisting;
+?>
+--EXPECTF--
+nonExisting
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-ghost-allows-inexisting-property-write.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Verifies that generated lazy loading ghost objects disallow reading non-existing properties via direct read
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets;
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingGhostFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function () {});
+
+$proxy->nonExisting = 'I do not exist';
+echo $proxy->nonExisting;
+?>
+--EXPECTF--
+I do not exist
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-ghost-denies-inexisting-property-read.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated lazy loading ghost objects disallow reading non-existing properties via direct read
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets;
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingGhostFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function () {});
+
+$proxy->nonExisting;
+?>
+--EXPECTF--
+%SNotice: Undefined property: Kitchen::$nonExisting in %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-ghost-denies-private-property-isset.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated lazy loading ghost objects disallow private property direct isset check
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets = 'candy';
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingGhostFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function () {});
+
+var_dump(isset($proxy->sweets));
+?>
+--EXPECT--
+bool(false)
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-ghost-denies-private-property-read.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated lazy loading ghost objects disallow private property direct read
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets;
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingGhostFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function () {});
+
+$proxy->sweets;
+?>
+--EXPECTF--
+%SFatal error: Cannot access private property %s::$sweets in %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-ghost-denies-private-property-unset.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated lazy loading ghost objects disallow private property direct unset
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets;
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingGhostFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function () {});
+
+unset($proxy->sweets);
+?>
+--EXPECTF--
+%SFatal error: Cannot %s property %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-ghost-denies-private-property-write.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated lazy loading ghost objects disallow private property direct write
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets;
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingGhostFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function () {});
+
+$proxy->sweets = 'stolen';
+?>
+--EXPECTF--
+%SFatal error: Cannot access %s property%S in %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-ghost-denies-protected-property-isset.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated lazy loading ghost objects disallow protected property direct isset check
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    protected $sweets = 'candy';
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingGhostFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function () {});
+
+var_dump(isset($proxy->sweets));
+?>
+--EXPECT--
+bool(false)
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-ghost-denies-protected-property-read.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated lazy loading ghost objects disallow protected property direct read
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    protected $sweets;
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingGhostFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function () {});
+
+$proxy->sweets;
+?>
+--EXPECTF--
+%SFatal error: Cannot access protected property %s::$sweets in %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-ghost-denies-protected-property-unset.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated lazy loading ghost objects disallow protected property direct unset
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    protected $sweets;
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingGhostFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function () {});
+
+unset($proxy->sweets);
+?>
+--EXPECTF--
+%SFatal error: Cannot %s property%sin %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-ghost-denies-protected-property-write.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated lazy loading ghost objects disallow protected property direct write
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    protected $sweets;
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingGhostFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function () {});
+
+$proxy->sweets = 'stolen';
+?>
+--EXPECTF--
+%SFatal error: Cannot %s property%sin %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-ghost-with-cache.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Verifies that lazy loading ghost proxy file is generated
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets = 'candy';
+}
+
+$configuration->setProxiesTargetDir(__DIR__ . '/cache');
+$fileLocator = new \ProxyManager\FileLocator\FileLocator($configuration->getProxiesTargetDir());
+$configuration->setGeneratorStrategy(
+    new \ProxyManager\GeneratorStrategy\FileWriterGeneratorStrategy($fileLocator)
+);
+
+$factory = new \ProxyManager\Factory\LazyLoadingGhostFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function () {});
+
+$filename = $fileLocator->getProxyFileName(get_class($proxy));
+var_dump(file_exists($filename));
+
+$proxy = $factory->createProxy('Kitchen', function () {});
+
+var_dump(file_exists($filename));
+@unlink($filename);
+
+?>
+--EXPECT--
+bool(true)
+bool(true)
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-value-holder-denies-private-property-isset.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Verifies that generated lazy loading value holders disallow private property direct isset check
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets = 'candy';
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function (& $wrapped, $proxy, $method, array $parameters, & $initializer) {
+    $initializer = null;
+    $wrapped     = new Kitchen();
+});
+
+var_dump(isset($proxy->sweets));
+?>
+--EXPECT--
+bool(false)
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-value-holder-denies-private-property-read.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Verifies that generated lazy loading value holders disallow private property direct read
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets;
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function (& $wrapped, $proxy, $method, array $parameters, & $initializer) {
+    $initializer = null;
+    $wrapped     = new Kitchen();
+});
+
+$proxy->sweets;
+?>
+--EXPECTF--
+%SFatal error: Cannot access private property %s::$sweets in %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-value-holder-denies-private-property-unset.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Verifies that generated lazy loading value holders disallow private property direct unset
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets;
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function (& $wrapped, $proxy, $method, array $parameters, & $initializer) {
+    $initializer = null;
+    $wrapped     = new Kitchen();
+});
+
+unset($proxy->sweets);
+?>
+--EXPECTF--
+%SFatal error: Cannot %s property %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-value-holder-denies-private-property-write.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Verifies that generated lazy loading value holders disallow private property direct write
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets;
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function (& $wrapped, $proxy, $method, array $parameters, & $initializer) {
+    $initializer = null;
+    $wrapped     = new Kitchen();
+});
+
+$proxy->sweets = 'stolen';
+?>
+--EXPECTF--
+%SFatal error: Cannot access %s property %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-value-holder-denies-protected-property-isset.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Verifies that generated lazy loading value holders disallow protected property direct isset check
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    protected $sweets = 'candy';
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function (& $wrapped, $proxy, $method, array $parameters, & $initializer) {
+    $initializer = null;
+    $wrapped     = new Kitchen();
+});
+
+var_dump(isset($proxy->sweets));
+?>
+--EXPECT--
+bool(false)
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-value-holder-denies-protected-property-read.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Verifies that generated lazy loading value holders disallow protected property direct read
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    protected $sweets;
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function (& $wrapped, $proxy, $method, array $parameters, & $initializer) {
+    $initializer = null;
+    $wrapped     = new Kitchen();
+});
+
+$proxy->sweets;
+?>
+--EXPECTF--
+%SFatal error: Cannot access protected property %s::$sweets in %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-value-holder-denies-protected-property-unset.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Verifies that generated lazy loading value holders disallow protected property direct unset
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    protected $sweets;
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function (& $wrapped, $proxy, $method, array $parameters, & $initializer) {
+    $initializer = null;
+    $wrapped     = new Kitchen();
+});
+
+unset($proxy->sweets);
+?>
+--EXPECTF--
+%SFatal error: Cannot %s property%sin %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-value-holder-denies-protected-property-write.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Verifies that generated lazy loading value holders disallow protected property direct write
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    protected $sweets;
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function (& $wrapped, $proxy, $method, array $parameters, & $initializer) {
+    $initializer = null;
+    $wrapped     = new Kitchen();
+});
+
+$proxy->sweets = 'stolen';
+?>
+--EXPECTF--
+%SFatal error: Cannot %s property%sin %s on line %d
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-value-holder-internal-php-classes.phpt
@@ -0,0 +1,31 @@
+--TEST--
+Verifies that lazy loading value holder factory can generate proxy for PHP core classes.
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class PharMock extends Phar
+{
+    public function __construct()
+    {
+    }
+
+    public function compress($compression_type, $file_ext = null)
+    {
+        echo $compression_type;
+    }
+}
+
+$factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory($configuration);
+
+$factory
+    ->createProxy('Phar', function (& $wrapped, $proxy, $method, array $parameters, & $initializer) {
+        $initializer = null;
+        $wrapped     = new PharMock();
+    })
+    ->compress('Lazy Loaded!');
+
+?>
+--EXPECT--
+Lazy Loaded!
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/lazy-loading-value-holder-with-cache.phpt
@@ -0,0 +1,40 @@
+--TEST--
+Verifies that lazy loading value holder proxy file is generated
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    private $sweets = 'candy';
+}
+
+$configuration->setProxiesTargetDir(__DIR__ . '/cache');
+$fileLocator = new \ProxyManager\FileLocator\FileLocator($configuration->getProxiesTargetDir());
+$configuration->setGeneratorStrategy(
+    new \ProxyManager\GeneratorStrategy\FileWriterGeneratorStrategy($fileLocator)
+);
+
+$factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen', function (& $wrapped, $proxy, $method, array $parameters, & $initializer) {
+    $initializer = null;
+    $wrapped     = new Kitchen();
+});
+
+$filename = $fileLocator->getProxyFileName(get_class($proxy));
+var_dump(file_exists($filename));
+
+$proxy = $factory->createProxy('Kitchen', function (& $wrapped, $proxy, $method, array $parameters, & $initializer) {
+    $initializer = null;
+    $wrapped     = new Kitchen();
+});
+
+var_dump(file_exists($filename));
+@unlink($filename);
+
+?>
+--EXPECT--
+bool(true)
+bool(true)
\ No newline at end of file
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/null-object-public-function-empty.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Verifies that generated null object disallow public function
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    public function foo()
+    {
+        return 'bar';
+    }
+}
+
+$factory = new \ProxyManager\Factory\NullObjectFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen');
+
+var_dump($proxy->foo());
+?>
+--EXPECT--
+NULL
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/null-object-public-property-empty.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Verifies that generated null object disallow public function
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+class Kitchen
+{
+    public $foo = 'bar';
+}
+
+$factory = new \ProxyManager\Factory\NullObjectFactory($configuration);
+
+$proxy = $factory->createProxy('Kitchen');
+
+var_dump($proxy->foo);
+?>
+--EXPECT--
+NULL
--- /dev/null
+++ b/vendor/ocramius/proxy-manager/tests/language-feature-scripts/remote-object-json-adapter-denies-unknow-method.phpt
@@ -0,0 +1,43 @@
+--TEST--
+Verifies that generated remote object can call public property
+--FILE--
+<?php
+
+require_once __DIR__ . '/init.php';
+
+use ProxyManager\Factory\RemoteObject\AdapterInterface;
+use Zend\Json\Server\Client;
+
+interface FooServiceInterface
+{
+    public function foo();
+}
+
+class Foo implements FooServiceInterface
+{
+    public $foo = "baz";
+    
+    public function foo()
+    {
+        return 'bar';
+    }
+}
+
+class CustomAdapter implements AdapterInterface
+{
+    public function call($wrappedClass, $method, array $params = array())
+    {
+        return 'baz';
+    }
+}
+
+$factory = new \ProxyManager\Factory\RemoteObjectFactory(new CustomAdapter(), $configuration);
+$proxy   = $factory->createProxy('ProxyManagerTestAsset\RemoteProxy\FooServiceInterface');
+
+var_dump($proxy->foo());
+var_dump($proxy->unknown());
+?>
+--EXPECTF--
+string(3) "baz"
+
+%SFatal error: Call to undefined method %s::unknown%S in %s on line %d
--- /dev/null
+++ b/vendor/paragonie/random_compat/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Paragon Initiative Enterprises
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
--- /dev/null
+++ b/vendor/paragonie/random_compat/composer.json
@@ -0,0 +1,35 @@
+{
+    "name":         "paragonie/random_compat",
+    "description":  "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+    "keywords": [
+            "csprng",
+            "random",
+            "pseudorandom"
+        ],
+    "license":      "MIT",
+    "type":         "library",
+    "authors": [
+            {
+                "name":     "Paragon Initiative Enterprises",
+                "email":    "security@paragonie.com",
+                "homepage": "https://paragonie.com"
+            }
+        ],
+    "support": {
+        "issues":   "https://github.com/paragonie/random_compat/issues",
+        "email":    "info@paragonie.com",
+        "source":   "https://github.com/paragonie/random_compat"
+    },
+    "require": {
+        "php": ">=5.2.0"
+    },
+    "require-dev": {
+        "phpunit/phpunit": "4.*|5.*"
+    },
+    "suggest": {
+        "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+    },
+    "autoload": {
+        "files": ["lib/random.php"]
+    }
+}
--- /dev/null
+++ b/vendor/paragonie/random_compat/lib/byte_safe_strings.php
@@ -0,0 +1,173 @@
+<?php
+/**
+ * Random_* Compatibility Library
+ * for using the new PHP 7 random_* API in PHP 5 projects
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2015 Paragon Initiative Enterprises
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+if (!function_exists('RandomCompat_strlen')) {
+    if (
+        defined('MB_OVERLOAD_STRING') &&
+        ini_get('mbstring.func_overload') & MB_OVERLOAD_STRING
+    ) {
+        /**
+         * strlen() implementation that isn't brittle to mbstring.func_overload
+         *
+         * This version uses mb_strlen() in '8bit' mode to treat strings as raw
+         * binary rather than UTF-8, ISO-8859-1, etc
+         *
+         * @param string $binary_string
+         *
+         * @throws TypeError
+         *
+         * @return int
+         */
+        function RandomCompat_strlen($binary_string)
+        {
+            if (!is_string($binary_string)) {
+                throw new TypeError(
+                    'RandomCompat_strlen() expects a string'
+                );
+            }
+
+            return mb_strlen($binary_string, '8bit');
+        }
+
+    } else {
+        /**
+         * strlen() implementation that isn't brittle to mbstring.func_overload
+         *
+         * This version just used the default strlen()
+         *
+         * @param string $binary_string
+         *
+         * @throws TypeError
+         *
+         * @return int
+         */
+        function RandomCompat_strlen($binary_string)
+        {
+            if (!is_string($binary_string)) {
+                throw new TypeError(
+                    'RandomCompat_strlen() expects a string'
+                );
+            }
+            return strlen($binary_string);
+        }
+    }
+}
+
+if (!function_exists('RandomCompat_substr')) {
+
+    if (
+        defined('MB_OVERLOAD_STRING')
+        &&
+        ini_get('mbstring.func_overload') & MB_OVERLOAD_STRING
+    ) {
+        /**
+         * substr() implementation that isn't brittle to mbstring.func_overload
+         *
+         * This version uses mb_substr() in '8bit' mode to treat strings as raw
+         * binary rather than UTF-8, ISO-8859-1, etc
+         *
+         * @param string $binary_string
+         * @param int $start
+         * @param int $length (optional)
+         *
+         * @throws TypeError
+         *
+         * @return string
+         */
+        function RandomCompat_substr($binary_string, $start, $length = null)
+        {
+            if (!is_string($binary_string)) {
+                throw new TypeError(
+                    'RandomCompat_substr(): First argument should be a string'
+                );
+            }
+
+            if (!is_int($start)) {
+                throw new TypeError(
+                    'RandomCompat_substr(): Second argument should be an integer'
+                );
+            }
+
+            if ($length === null) {
+                /**
+                 * mb_substr($str, 0, NULL, '8bit') returns an empty string on
+                 * PHP 5.3, so we have to find the length ourselves.
+                 */
+                $length = RandomCompat_strlen($length) - $start;
+            } elseif (!is_int($length)) {
+                throw new TypeError(
+                    'RandomCompat_substr(): Third argument should be an integer, or omitted'
+                );
+            }
+
+            return mb_substr($binary_string, $start, $length, '8bit');
+        }
+
+    } else {
+
+        /**
+         * substr() implementation that isn't brittle to mbstring.func_overload
+         *
+         * This version just uses the default substr()
+         *
+         * @param string $binary_string
+         * @param int $start
+         * @param int $length (optional)
+         *
+         * @throws TypeError
+         *
+         * @return string
+         */
+        function RandomCompat_substr($binary_string, $start, $length = null)
+        {
+            if (!is_string($binary_string)) {
+                throw new TypeError(
+                    'RandomCompat_substr(): First argument should be a string'
+                );
+            }
+
+            if (!is_int($start)) {
+                throw new TypeError(
+                    'RandomCompat_substr(): Second argument should be an integer'
+                );
+            }
+
+            if ($length !== null) {
+                if (!is_int($length)) {
+                    throw new TypeError(
+                        'RandomCompat_substr(): Third argument should be an integer, or omitted'
+                    );
+                }
+
+                return substr($binary_string, $start, $length);
+            }
+
+            return substr($binary_string, $start);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/paragonie/random_compat/lib/cast_to_int.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Random_* Compatibility Library
+ * for using the new PHP 7 random_* API in PHP 5 projects
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2015 Paragon Initiative Enterprises
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+if (!function_exists('RandomCompat_intval')) {
+    
+    /**
+     * Cast to an integer if we can, safely.
+     * 
+     * If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX)
+     * (non-inclusive), it will sanely cast it to an int. If you it's equal to
+     * ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats 
+     * lose precision, so the <= and => operators might accidentally let a float
+     * through.
+     * 
+     * @param int|float $number    The number we want to convert to an int
+     * @param boolean   $fail_open Set to true to not throw an exception
+     * 
+     * @return int (or float if $fail_open)
+     *
+     * @throws TypeError
+     */
+    function RandomCompat_intval($number, $fail_open = false)
+    {
+        if (is_numeric($number)) {
+            $number += 0;
+        }
+
+        if (
+            is_float($number)
+            &&
+            $number > ~PHP_INT_MAX
+            &&
+            $number < PHP_INT_MAX
+        ) {
+            $number = (int) $number;
+        }
+
+        if (is_int($number) || $fail_open) {
+            return $number;
+        }
+
+        throw new TypeError(
+            'Expected an integer.'
+        );
+    }
+}
--- /dev/null
+++ b/vendor/paragonie/random_compat/lib/error_polyfill.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Random_* Compatibility Library 
+ * for using the new PHP 7 random_* API in PHP 5 projects
+ * 
+ * The MIT License (MIT)
+ * 
+ * Copyright (c) 2015 Paragon Initiative Enterprises
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+if (!class_exists('Error', false)) {
+    // We can't really avoid making this extend Exception in PHP 5.
+    class Error extends Exception
+    {
+        
+    }
+}
+
+if (!class_exists('TypeError', false)) {
+    class TypeError extends Error
+    {
+        
+    }
+}
--- /dev/null
+++ b/vendor/paragonie/random_compat/lib/random.php
@@ -0,0 +1,221 @@
+<?php
+/**
+ * Random_* Compatibility Library
+ * for using the new PHP 7 random_* API in PHP 5 projects
+ * 
+ * @version 1.4.1
+ * @released 2016-03-18
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2015 Paragon Initiative Enterprises
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+if (!defined('PHP_VERSION_ID')) {
+    // This constant was introduced in PHP 5.2.7
+    $RandomCompatversion = explode('.', PHP_VERSION);
+    define(
+        'PHP_VERSION_ID',
+        $RandomCompatversion[0] * 10000
+        + $RandomCompatversion[1] * 100
+        + $RandomCompatversion[2]
+    );
+    $RandomCompatversion = null;
+}
+
+if (PHP_VERSION_ID < 70000) {
+
+    if (!defined('RANDOM_COMPAT_READ_BUFFER')) {
+        define('RANDOM_COMPAT_READ_BUFFER', 8);
+    }
+
+    $RandomCompatDIR = dirname(__FILE__);
+
+    require_once $RandomCompatDIR.'/byte_safe_strings.php';
+    require_once $RandomCompatDIR.'/cast_to_int.php';
+    require_once $RandomCompatDIR.'/error_polyfill.php';
+
+    if (!function_exists('random_bytes')) {
+        /**
+         * PHP 5.2.0 - 5.6.x way to implement random_bytes()
+         *
+         * We use conditional statements here to define the function in accordance
+         * to the operating environment. It's a micro-optimization.
+         *
+         * In order of preference:
+         *   1. Use libsodium if available.
+         *   2. fread() /dev/urandom if available (never on Windows)
+         *   3. mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM)
+         *   4. COM('CAPICOM.Utilities.1')->GetRandom()
+         *   5. openssl_random_pseudo_bytes() (absolute last resort)
+         *
+         * See ERRATA.md for our reasoning behind this particular order
+         */
+        if (extension_loaded('libsodium')) {
+            // See random_bytes_libsodium.php
+            if (PHP_VERSION_ID >= 50300 && function_exists('\\Sodium\\randombytes_buf')) {
+                require_once $RandomCompatDIR.'/random_bytes_libsodium.php';
+            } elseif (method_exists('Sodium', 'randombytes_buf')) {
+                require_once $RandomCompatDIR.'/random_bytes_libsodium_legacy.php';
+            }
+        }
+
+        /**
+         * Reading directly from /dev/urandom:
+         */
+        if (DIRECTORY_SEPARATOR === '/') {
+            // DIRECTORY_SEPARATOR === '/' on Unix-like OSes -- this is a fast
+            // way to exclude Windows.
+            $RandomCompatUrandom = true;
+            $RandomCompat_basedir = ini_get('open_basedir');
+
+            if (!empty($RandomCompat_basedir)) {
+                $RandomCompat_open_basedir = explode(
+                    PATH_SEPARATOR,
+                    strtolower($RandomCompat_basedir)
+                );
+                $RandomCompatUrandom = (array() !== array_intersect(
+                    array('/dev', '/dev/', '/dev/urandom'),
+                    $RandomCompat_open_basedir
+                ));
+                $RandomCompat_open_basedir = null;
+            }
+
+            if (
+                !function_exists('random_bytes')
+                &&
+                $RandomCompatUrandom
+                &&
+                @is_readable('/dev/urandom')
+            ) {
+                // Error suppression on is_readable() in case of an open_basedir
+                // or safe_mode failure. All we care about is whether or not we
+                // can read it at this point. If the PHP environment is going to
+                // panic over trying to see if the file can be read in the first
+                // place, that is not helpful to us here.
+
+                // See random_bytes_dev_urandom.php
+                require_once $RandomCompatDIR.'/random_bytes_dev_urandom.php';
+            }
+            // Unset variables after use
+            $RandomCompat_basedir = null;
+        } else {
+            $RandomCompatUrandom = false;
+        }
+
+        /**
+         * mcrypt_create_iv()
+         */
+        if (
+            !function_exists('random_bytes')
+            &&
+            PHP_VERSION_ID >= 50307
+            &&
+            extension_loaded('mcrypt')
+            &&
+            (DIRECTORY_SEPARATOR !== '/' || $RandomCompatUrandom)
+        ) {
+            // Prevent this code from hanging indefinitely on non-Windows;
+            // see https://bugs.php.net/bug.php?id=69833
+            if (
+                DIRECTORY_SEPARATOR !== '/' || 
+                (PHP_VERSION_ID <= 50609 || PHP_VERSION_ID >= 50613)
+            ) {
+                // See random_bytes_mcrypt.php
+                require_once $RandomCompatDIR.'/random_bytes_mcrypt.php';
+            }
+        }
+        $RandomCompatUrandom = null;
+
+        if (
+            !function_exists('random_bytes')
+            &&
+            extension_loaded('com_dotnet')
+            &&
+            class_exists('COM')
+        ) {
+            $RandomCompat_disabled_classes = preg_split(
+                '#\s*,\s*#',
+                strtolower(ini_get('disable_classes'))
+            );
+
+            if (!in_array('com', $RandomCompat_disabled_classes)) {
+                try {
+                    $RandomCompatCOMtest = new COM('CAPICOM.Utilities.1');
+                    if (method_exists($RandomCompatCOMtest, 'GetRandom')) {
+                        // See random_bytes_com_dotnet.php
+                        require_once $RandomCompatDIR.'/random_bytes_com_dotnet.php';
+                    }
+                } catch (com_exception $e) {
+                    // Don't try to use it.
+                }
+            }
+            $RandomCompat_disabled_classes = null;
+            $RandomCompatCOMtest = null;
+        }
+
+        /**
+         * openssl_random_pseudo_bytes()
+         */
+        if (
+            (
+                // Unix-like with PHP >= 5.3.0 or
+                (
+                    DIRECTORY_SEPARATOR === '/'
+                    &&
+                    PHP_VERSION_ID >= 50300
+                )
+                ||
+                // Windows with PHP >= 5.4.1
+                PHP_VERSION_ID >= 50401
+            )
+            &&
+            !function_exists('random_bytes')
+            &&
+            extension_loaded('openssl')
+        ) {
+            // See random_bytes_openssl.php
+            require_once $RandomCompatDIR.'/random_bytes_openssl.php';
+        }
+
+        /**
+         * throw new Exception
+         */
+        if (!function_exists('random_bytes')) {
+            /**
+             * We don't have any more options, so let's throw an exception right now
+             * and hope the developer won't let it fail silently.
+             */
+            function random_bytes($length)
+            {
+                throw new Exception(
+                    'There is no suitable CSPRNG installed on your system'
+                );
+            }
+        }
+    }
+
+    if (!function_exists('random_int')) {
+        require_once $RandomCompatDIR.'/random_int.php';
+    }
+
+    $RandomCompatDIR = null;
+}
--- /dev/null
+++ b/vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Random_* Compatibility Library 
+ * for using the new PHP 7 random_* API in PHP 5 projects
+ * 
+ * The MIT License (MIT)
+ * 
+ * Copyright (c) 2015 Paragon Initiative Enterprises
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * Windows with PHP < 5.3.0 will not have the function
+ * openssl_random_pseudo_bytes() available, so let's use
+ * CAPICOM to work around this deficiency.
+ * 
+ * @param int $bytes
+ * 
+ * @throws Exception
+ * 
+ * @return string
+ */
+function random_bytes($bytes)
+{
+    try {
+        $bytes = RandomCompat_intval($bytes);
+    } catch (TypeError $ex) {
+        throw new TypeError(
+            'random_bytes(): $bytes must be an integer'
+        );
+    }
+
+    if ($bytes < 1) {
+        throw new Error(
+            'Length must be greater than 0'
+        );
+    }
+
+    $buf = '';
+    $util = new COM('CAPICOM.Utilities.1');
+    $execCount = 0;
+
+    /**
+     * Let's not let it loop forever. If we run N times and fail to
+     * get N bytes of random data, then CAPICOM has failed us.
+     */
+    do {
+        $buf .= base64_decode($util->GetRandom($bytes, 0));
+        if (RandomCompat_strlen($buf) >= $bytes) {
+            /**
+             * Return our random entropy buffer here:
+             */
+            return RandomCompat_substr($buf, 0, $bytes);
+        }
+        ++$execCount; 
+    } while ($execCount < $bytes);
+
+    /**
+     * If we reach here, PHP has failed us.
+     */
+    throw new Exception(
+        'Could not gather sufficient random data'
+    );
+}
--- /dev/null
+++ b/vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ * Random_* Compatibility Library 
+ * for using the new PHP 7 random_* API in PHP 5 projects
+ * 
+ * The MIT License (MIT)
+ * 
+ * Copyright (c) 2015 Paragon Initiative Enterprises
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+if (!defined('RANDOM_COMPAT_READ_BUFFER')) {
+    define('RANDOM_COMPAT_READ_BUFFER', 8);
+}
+
+/**
+ * Unless open_basedir is enabled, use /dev/urandom for
+ * random numbers in accordance with best practices
+ * 
+ * Why we use /dev/urandom and not /dev/random
+ * @ref http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers
+ * 
+ * @param int $bytes
+ * 
+ * @throws Exception
+ * 
+ * @return string
+ */
+function random_bytes($bytes)
+{
+    static $fp = null;
+    /**
+     * This block should only be run once
+     */
+    if (empty($fp)) {
+        /**
+         * We use /dev/urandom if it is a char device.
+         * We never fall back to /dev/random
+         */
+        $fp = fopen('/dev/urandom', 'rb');
+        if (!empty($fp)) {
+            $st = fstat($fp);
+            if (($st['mode'] & 0170000) !== 020000) {
+                fclose($fp);
+                $fp = false;
+            }
+        }
+
+        if (!empty($fp)) {
+            /**
+             * stream_set_read_buffer() does not exist in HHVM
+             * 
+             * If we don't set the stream's read buffer to 0, PHP will
+             * internally buffer 8192 bytes, which can waste entropy
+             * 
+             * stream_set_read_buffer returns 0 on success
+             */
+            if (function_exists('stream_set_read_buffer')) {
+                stream_set_read_buffer($fp, RANDOM_COMPAT_READ_BUFFER);
+            }
+            if (function_exists('stream_set_chunk_size')) {
+                stream_set_chunk_size($fp, RANDOM_COMPAT_READ_BUFFER);
+            }
+        }
+    }
+
+    try {
+        $bytes = RandomCompat_intval($bytes);
+    } catch (TypeError $ex) {
+        throw new TypeError(
+            'random_bytes(): $bytes must be an integer'
+        );
+    }
+
+    if ($bytes < 1) {
+        throw new Error(
+            'Length must be greater than 0'
+        );
+    }
+
+    /**
+     * This if() block only runs if we managed to open a file handle
+     * 
+     * It does not belong in an else {} block, because the above 
+     * if (empty($fp)) line is logic that should only be run once per
+     * page load.
+     */
+    if (!empty($fp)) {
+        $remaining = $bytes;
+        $buf = '';
+
+        /**
+         * We use fread() in a loop to protect against partial reads
+         */
+        do {
+            $read = fread($fp, $remaining); 
+            if ($read === false) {
+                /**
+                 * We cannot safely read from the file. Exit the
+                 * do-while loop and trigger the exception condition
+                 */
+                $buf = false;
+                break;
+            }
+            /**
+             * Decrease the number of bytes returned from remaining
+             */
+            $remaining -= RandomCompat_strlen($read);
+            $buf .= $read;
+        } while ($remaining > 0);
+        
+        /**
+         * Is our result valid?
+         */
+        if ($buf !== false) {
+            if (RandomCompat_strlen($buf) === $bytes) {
+                /**
+                 * Return our random entropy buffer here:
+                 */
+                return $buf;
+            }
+        }
+    }
+
+    /**
+     * If we reach here, PHP has failed us.
+     */
+    throw new Exception(
+        'Error reading from source device'
+    );
+}
--- /dev/null
+++ b/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php
@@ -0,0 +1,86 @@
+<?php
+/**
+ * Random_* Compatibility Library 
+ * for using the new PHP 7 random_* API in PHP 5 projects
+ * 
+ * The MIT License (MIT)
+ * 
+ * Copyright (c) 2015 Paragon Initiative Enterprises
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * If the libsodium PHP extension is loaded, we'll use it above any other
+ * solution.
+ *
+ * libsodium-php project:
+ * @ref https://github.com/jedisct1/libsodium-php
+ *
+ * @param int $bytes
+ *
+ * @throws Exception
+ *
+ * @return string
+ */
+function random_bytes($bytes)
+{
+    try {
+        $bytes = RandomCompat_intval($bytes);
+    } catch (TypeError $ex) {
+        throw new TypeError(
+            'random_bytes(): $bytes must be an integer'
+        );
+    }
+
+    if ($bytes < 1) {
+        throw new Error(
+            'Length must be greater than 0'
+        );
+    }
+
+    /**
+     * \Sodium\randombytes_buf() doesn't allow more than 2147483647 bytes to be
+     * generated in one invocation.
+     */
+    if ($bytes > 2147483647) {
+        $buf = '';
+        for ($i = 0; $i < $bytes; $i += 1073741824) {
+            $n = ($bytes - $i) > 1073741824
+                ? 1073741824
+                : $bytes - $i;
+            $buf .= \Sodium\randombytes_buf($n);
+        }
+    } else {
+        $buf = \Sodium\randombytes_buf($bytes);
+    }
+
+    if ($buf !== false) {
+        if (RandomCompat_strlen($buf) === $bytes) {
+            return $buf;
+        }
+    }
+
+    /**
+     * If we reach here, PHP has failed us.
+     */
+    throw new Exception(
+        'Could not gather sufficient random data'
+    );
+}
--- /dev/null
+++ b/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php
@@ -0,0 +1,86 @@
+<?php
+/**
+ * Random_* Compatibility Library 
+ * for using the new PHP 7 random_* API in PHP 5 projects
+ * 
+ * The MIT License (MIT)
+ * 
+ * Copyright (c) 2015 Paragon Initiative Enterprises
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * If the libsodium PHP extension is loaded, we'll use it above any other
+ * solution.
+ *
+ * libsodium-php project:
+ * @ref https://github.com/jedisct1/libsodium-php
+ *
+ * @param int $bytes
+ *
+ * @throws Exception
+ *
+ * @return string
+ */
+function random_bytes($bytes)
+{
+    try {
+        $bytes = RandomCompat_intval($bytes);
+    } catch (TypeError $ex) {
+        throw new TypeError(
+            'random_bytes(): $bytes must be an integer'
+        );
+    }
+
+    if ($bytes < 1) {
+        throw new Error(
+            'Length must be greater than 0'
+        );
+    }
+
+    /**
+     * \Sodium\randombytes_buf() doesn't allow more than 2147483647 bytes to be
+     * generated in one invocation.
+     */
+    if ($bytes > 2147483647) {
+        $buf = '';
+        for ($i = 0; $i < $bytes; $i += 1073741824) {
+            $n = ($bytes - $i) > 1073741824
+                ? 1073741824
+                : $bytes - $i;
+            $buf .= Sodium::randombytes_buf($n);
+        }
+    } else {
+        $buf = Sodium::randombytes_buf($bytes);
+    }
+
+    if ($buf !== false) {
+        if (RandomCompat_strlen($buf) === $bytes) {
+            return $buf;
+        }
+    }
+
+    /**
+     * If we reach here, PHP has failed us.
+     */
+    throw new Exception(
+        'Could not gather sufficient random data'
+    );
+}
--- /dev/null
+++ b/vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Random_* Compatibility Library 
+ * for using the new PHP 7 random_* API in PHP 5 projects
+ * 
+ * The MIT License (MIT)
+ * 
+ * Copyright (c) 2015 Paragon Initiative Enterprises
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+
+/**
+ * Powered by ext/mcrypt (and thankfully NOT libmcrypt)
+ * 
+ * @ref https://bugs.php.net/bug.php?id=55169
+ * @ref https://github.com/php/php-src/blob/c568ffe5171d942161fc8dda066bce844bdef676/ext/mcrypt/mcrypt.c#L1321-L1386
+ * 
+ * @param int $bytes
+ * 
+ * @throws Exception
+ * 
+ * @return string
+ */
+function random_bytes($bytes)
+{
+    try {
+        $bytes = RandomCompat_intval($bytes);
+    } catch (TypeError $ex) {
+        throw new TypeError(
+            'random_bytes(): $bytes must be an integer'
+        );
+    }
+
+    if ($bytes < 1) {
+        throw new Error(
+            'Length must be greater than 0'
+        );
+    }
+
+    $buf = @mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM);
+    if (
+        $buf !== false
+        &&
+        RandomCompat_strlen($buf) === $bytes
+    ) {
+        /**
+         * Return our random entropy buffer here:
+         */
+        return $buf;
+    }
+
+    /**
+     * If we reach here, PHP has failed us.
+     */
+    throw new Exception(
+        'Could not gather sufficient random data'
+    );
+}
--- /dev/null
+++ b/vendor/paragonie/random_compat/lib/random_bytes_openssl.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Random_* Compatibility Library 
+ * for using the new PHP 7 random_* API in PHP 5 projects
+ * 
+ * The MIT License (MIT)
+ * 
+ * Copyright (c) 2015 Paragon Initiative Enterprises
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * Since openssl_random_pseudo_bytes() uses openssl's 
+ * RAND_pseudo_bytes() API, which has been marked as deprecated by the
+ * OpenSSL team, this is our last resort before failure.
+ * 
+ * @ref https://www.openssl.org/docs/crypto/RAND_bytes.html
+ * 
+ * @param int $bytes
+ * 
+ * @throws Exception
+ * 
+ * @return string
+ */
+function random_bytes($bytes)
+{
+    try {
+        $bytes = RandomCompat_intval($bytes);
+    } catch (TypeError $ex) {
+        throw new TypeError(
+            'random_bytes(): $bytes must be an integer'
+        );
+    }
+
+    if ($bytes < 1) {
+        throw new Error(
+            'Length must be greater than 0'
+        );
+    }
+
+    /**
+     * $secure is passed by reference. If it's set to false, fail. Note
+     * that this will only return false if this function fails to return
+     * any data.
+     * 
+     * @ref https://github.com/paragonie/random_compat/issues/6#issuecomment-119564973
+     */
+    $secure = true;
+    $buf = openssl_random_pseudo_bytes($bytes, $secure);
+    if (
+        $buf !== false
+        &&
+        $secure
+        &&
+        RandomCompat_strlen($buf) === $bytes
+    ) {
+        return $buf;
+    }
+
+    /**
+     * If we reach here, PHP has failed us.
+     */
+    throw new Exception(
+        'Could not gather sufficient random data'
+    );
+}
--- /dev/null
+++ b/vendor/paragonie/random_compat/lib/random_int.php
@@ -0,0 +1,191 @@
+<?php
+/**
+ * Random_* Compatibility Library 
+ * for using the new PHP 7 random_* API in PHP 5 projects
+ * 
+ * The MIT License (MIT)
+ * 
+ * Copyright (c) 2015 Paragon Initiative Enterprises
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * Fetch a random integer between $min and $max inclusive
+ * 
+ * @param int $min
+ * @param int $max
+ * 
+ * @throws Exception
+ * 
+ * @return int
+ */
+function random_int($min, $max)
+{
+    /**
+     * Type and input logic checks
+     * 
+     * If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX)
+     * (non-inclusive), it will sanely cast it to an int. If you it's equal to
+     * ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats 
+     * lose precision, so the <= and => operators might accidentally let a float
+     * through.
+     */
+    
+    try {
+        $min = RandomCompat_intval($min);
+    } catch (TypeError $ex) {
+        throw new TypeError(
+            'random_int(): $min must be an integer'
+        );
+    }
+
+    try {
+        $max = RandomCompat_intval($max);
+    } catch (TypeError $ex) {
+        throw new TypeError(
+            'random_int(): $max must be an integer'
+        );
+    }
+    
+    /**
+     * Now that we've verified our weak typing system has given us an integer,
+     * let's validate the logic then we can move forward with generating random
+     * integers along a given range.
+     */
+    if ($min > $max) {
+        throw new Error(
+            'Minimum value must be less than or equal to the maximum value'
+        );
+    }
+
+    if ($max === $min) {
+        return $min;
+    }
+
+    /**
+     * Initialize variables to 0
+     * 
+     * We want to store:
+     * $bytes => the number of random bytes we need
+     * $mask => an integer bitmask (for use with the &) operator
+     *          so we can minimize the number of discards
+     */
+    $attempts = $bits = $bytes = $mask = $valueShift = 0;
+
+    /**
+     * At this point, $range is a positive number greater than 0. It might
+     * overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to
+     * a float and we will lose some precision.
+     */
+    $range = $max - $min;
+
+    /**
+     * Test for integer overflow:
+     */
+    if (!is_int($range)) {
+
+        /**
+         * Still safely calculate wider ranges.
+         * Provided by @CodesInChaos, @oittaa
+         * 
+         * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435
+         * 
+         * We use ~0 as a mask in this case because it generates all 1s
+         * 
+         * @ref https://eval.in/400356 (32-bit)
+         * @ref http://3v4l.org/XX9r5  (64-bit)
+         */
+        $bytes = PHP_INT_SIZE;
+        $mask = ~0;
+
+    } else {
+
+        /**
+         * $bits is effectively ceil(log($range, 2)) without dealing with 
+         * type juggling
+         */
+        while ($range > 0) {
+            if ($bits % 8 === 0) {
+               ++$bytes;
+            }
+            ++$bits;
+            $range >>= 1;
+            $mask = $mask << 1 | 1;
+        }
+        $valueShift = $min;
+    }
+
+    /**
+     * Now that we have our parameters set up, let's begin generating
+     * random integers until one falls between $min and $max
+     */
+    do {
+        /**
+         * The rejection probability is at most 0.5, so this corresponds
+         * to a failure probability of 2^-128 for a working RNG
+         */
+        if ($attempts > 128) {
+            throw new Exception(
+                'random_int: RNG is broken - too many rejections'
+            );
+        }
+
+        /**
+         * Let's grab the necessary number of random bytes
+         */
+        $randomByteString = random_bytes($bytes);
+        if ($randomByteString === false) {
+            throw new Exception(
+                'Random number generator failure'
+            );
+        }
+
+        /**
+         * Let's turn $randomByteString into an integer
+         * 
+         * This uses bitwise operators (<< and |) to build an integer
+         * out of the values extracted from ord()
+         * 
+         * Example: [9F] | [6D] | [32] | [0C] =>
+         *   159 + 27904 + 3276800 + 201326592 =>
+         *   204631455
+         */
+        $val = 0;
+        for ($i = 0; $i < $bytes; ++$i) {
+            $val |= ord($randomByteString[$i]) << ($i * 8);
+        }
+
+        /**
+         * Apply mask
+         */
+        $val &= $mask;
+        $val += $valueShift;
+
+        ++$attempts;
+        /**
+         * If $val overflows to a floating point number,
+         * ... or is larger than $max,
+         * ... or smaller than $min,
+         * then try again.
+         */
+    } while (!is_int($val) || $val > $max || $val < $min);
+
+    return (int) $val;
+}
--- /dev/null
+++ b/vendor/patchwork/utf8/.gitignore
@@ -0,0 +1,2 @@
+/composer.lock
+/vendor
--- /dev/null
+++ b/vendor/patchwork/utf8/LICENSE-APACHE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright 2015 Nicolas Grekas
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
--- /dev/null
+++ b/vendor/patchwork/utf8/LICENSE-GPL
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
--- /dev/null
+++ b/vendor/patchwork/utf8/appveyor.yml
@@ -0,0 +1,39 @@
+build: false
+platform: x86
+clone_folder: c:\projects\utf8
+
+cache:
+    - c:\php -> appveyor.yml
+
+branches:
+    only:
+        - master
+
+init:
+    - SET PATH=c:\php;%PATH%
+    - SET COMPOSER_NO_INTERACTION=1
+    - SET PHP=1
+
+install:
+    - IF EXIST c:\php (SET PHP=0) ELSE (mkdir c:\php)
+    - cd c:\php
+    - IF %PHP%==1 appveyor DownloadFile http://windows.php.net/downloads/releases/archives/php-5.5.9-nts-Win32-VC11-x86.zip
+    - IF %PHP%==1 7z x php-5.5.9-nts-Win32-VC11-x86.zip -y >nul
+    - IF %PHP%==1 del /Q *.zip
+    - IF %PHP%==1 appveyor DownloadFile https://phar.phpunit.de/phpunit-4.8.15.phar
+    - IF %PHP%==1 echo @php %%~dp0composer.phar %%* > composer.bat
+    - IF %PHP%==1 echo @php %%~dp0phpunit-4.8.15.phar %%* > phpunit.bat
+    - IF %PHP%==1 copy /Y php.ini-development php.ini
+    - IF %PHP%==1 echo max_execution_time=1200 >> php.ini
+    - IF %PHP%==1 echo date.timezone="UTC" >> php.ini
+    - IF %PHP%==1 echo extension_dir=ext >> php.ini
+    - IF %PHP%==1 echo extension=php_openssl.dll >> php.ini
+    - IF %PHP%==1 echo extension=php_intl.dll >> php.ini
+    - IF %PHP%==1 echo extension=php_mbstring.dll >> php.ini
+    - appveyor DownloadFile https://getcomposer.org/composer.phar
+    - cd c:\projects\utf8
+    - IF %APPVEYOR_REPO_BRANCH%==master (SET COMPOSER_ROOT_VERSION=dev-master) ELSE (SET COMPOSER_ROOT_VERSION=%APPVEYOR_REPO_BRANCH%.x-dev)
+    - composer update --prefer-source --no-progress --ansi
+
+test_script:
+    - phpunit
--- /dev/null
+++ b/vendor/patchwork/utf8/composer.json
@@ -0,0 +1,36 @@
+{
+    "name": "patchwork/utf8",
+    "type": "library",
+    "description": "Portable and performant UTF-8, Unicode and Grapheme Clusters for PHP",
+    "keywords": ["utf8","utf-8","unicode","i18n","grapheme"],
+    "homepage": "https://github.com/tchwork/utf8",
+    "license": "(Apache-2.0 or GPL-2.0)",
+    "authors": [
+        {
+            "name": "Nicolas Grekas",
+            "email": "p@tchwork.com"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.0",
+        "lib-pcre": ">=7.3"
+    },
+    "suggest": {
+        "ext-wfio": "Use WFIO for UTF-8 filesystem access on Windows",
+        "ext-intl": "Use Intl for best performance",
+        "ext-iconv": "Use iconv for best performance",
+        "ext-mbstring": "Use Mbstring for best performance"
+    },
+    "autoload": {
+        "psr-4": {"Patchwork\\": "src/Patchwork/"},
+        "classmap": ["src/Normalizer.php"]
+    },
+    "autoload-dev": {
+        "files": ["tests/bootstrap.php"]
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.3-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Normalizer.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * Copyright (C) 2016 Nicolas Grekas - p@tchwork.com
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the (at your option):
+ * Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
+ * GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
+ */
+
+/**
+ * Normalizer plugs Patchwork\PHP\Shim\Normalizer as a PHP implementation
+ * of intl's Normalizer when the intl extension in not enabled.
+ */
+class Normalizer extends Patchwork\PHP\Shim\Normalizer
+{
+}
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/Iconv.php
@@ -0,0 +1,729 @@
+<?php
+
+/*
+ * Copyright (C) 2016 Nicolas Grekas - p@tchwork.com
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the (at your option):
+ * Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
+ * GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
+ */
+
+namespace Patchwork\PHP\Shim;
+
+/**
+ * iconv implementation in pure PHP, UTF-8 centric.
+ *
+ * Implemented:
+ * - iconv              - Convert string to requested character encoding
+ * - iconv_mime_decode  - Decodes a MIME header field
+ * - iconv_mime_decode_headers - Decodes multiple MIME header fields at once
+ * - iconv_get_encoding - Retrieve internal configuration variables of iconv extension
+ * - iconv_set_encoding - Set current setting for character encoding conversion
+ * - iconv_mime_encode  - Composes a MIME header field
+ * - ob_iconv_handler   - Convert character encoding as output buffer handler
+ * - iconv_strlen       - Returns the character count of string
+ * - iconv_strpos       - Finds position of first occurrence of a needle within a haystack
+ * - iconv_strrpos      - Finds the last occurrence of a needle within a haystack
+ * - iconv_substr       - Cut out part of a string
+ *
+ * Charsets available for conversion are defined by files
+ * in the charset/ directory and by Iconv::$alias below.
+ * You're welcome to send back any addition you make.
+ *
+ * @internal
+ */
+class Iconv
+{
+    const ERROR_ILLEGAL_CHARACTER = 'iconv(): Detected an illegal character in input string';
+    const ERROR_WRONG_CHARSET = 'iconv(): Wrong charset, conversion from `%s\' to `%s\' is not allowed';
+
+    public static $inputEncoding = 'utf-8';
+    public static $outputEncoding = 'utf-8';
+    public static $internalEncoding = 'utf-8';
+
+    private static $alias = array(
+        'utf8' => 'utf-8',
+        'ascii' => 'us-ascii',
+        'tis-620' => 'iso-8859-11',
+        'cp1250' => 'windows-1250',
+        'cp1251' => 'windows-1251',
+        'cp1252' => 'windows-1252',
+        'cp1253' => 'windows-1253',
+        'cp1254' => 'windows-1254',
+        'cp1255' => 'windows-1255',
+        'cp1256' => 'windows-1256',
+        'cp1257' => 'windows-1257',
+        'cp1258' => 'windows-1258',
+        'shift-jis' => 'cp932',
+        'shift_jis' => 'cp932',
+        'latin1' => 'iso-8859-1',
+        'latin2' => 'iso-8859-2',
+        'latin3' => 'iso-8859-3',
+        'latin4' => 'iso-8859-4',
+        'latin5' => 'iso-8859-9',
+        'latin6' => 'iso-8859-10',
+        'latin7' => 'iso-8859-13',
+        'latin8' => 'iso-8859-14',
+        'latin9' => 'iso-8859-15',
+        'latin10' => 'iso-8859-16',
+        'iso8859-1' => 'iso-8859-1',
+        'iso8859-2' => 'iso-8859-2',
+        'iso8859-3' => 'iso-8859-3',
+        'iso8859-4' => 'iso-8859-4',
+        'iso8859-5' => 'iso-8859-5',
+        'iso8859-6' => 'iso-8859-6',
+        'iso8859-7' => 'iso-8859-7',
+        'iso8859-8' => 'iso-8859-8',
+        'iso8859-9' => 'iso-8859-9',
+        'iso8859-10' => 'iso-8859-10',
+        'iso8859-11' => 'iso-8859-11',
+        'iso8859-12' => 'iso-8859-12',
+        'iso8859-13' => 'iso-8859-13',
+        'iso8859-14' => 'iso-8859-14',
+        'iso8859-15' => 'iso-8859-15',
+        'iso8859-16' => 'iso-8859-16',
+        'iso_8859-1' => 'iso-8859-1',
+        'iso_8859-2' => 'iso-8859-2',
+        'iso_8859-3' => 'iso-8859-3',
+        'iso_8859-4' => 'iso-8859-4',
+        'iso_8859-5' => 'iso-8859-5',
+        'iso_8859-6' => 'iso-8859-6',
+        'iso_8859-7' => 'iso-8859-7',
+        'iso_8859-8' => 'iso-8859-8',
+        'iso_8859-9' => 'iso-8859-9',
+        'iso_8859-10' => 'iso-8859-10',
+        'iso_8859-11' => 'iso-8859-11',
+        'iso_8859-12' => 'iso-8859-12',
+        'iso_8859-13' => 'iso-8859-13',
+        'iso_8859-14' => 'iso-8859-14',
+        'iso_8859-15' => 'iso-8859-15',
+        'iso_8859-16' => 'iso-8859-16',
+        'iso88591' => 'iso-8859-1',
+        'iso88592' => 'iso-8859-2',
+        'iso88593' => 'iso-8859-3',
+        'iso88594' => 'iso-8859-4',
+        'iso88595' => 'iso-8859-5',
+        'iso88596' => 'iso-8859-6',
+        'iso88597' => 'iso-8859-7',
+        'iso88598' => 'iso-8859-8',
+        'iso88599' => 'iso-8859-9',
+        'iso885910' => 'iso-8859-10',
+        'iso885911' => 'iso-8859-11',
+        'iso885912' => 'iso-8859-12',
+        'iso885913' => 'iso-8859-13',
+        'iso885914' => 'iso-8859-14',
+        'iso885915' => 'iso-8859-15',
+        'iso885916' => 'iso-8859-16',
+    );
+    private static $translitMap = array();
+    private static $convertMap = array();
+    private static $errorHandler;
+    private static $lastError;
+
+    private static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
+    private static $isValidUtf8;
+
+    public static function iconv($inCharset, $outCharset, $str)
+    {
+        if ('' === $str .= '') {
+            return '';
+        }
+
+        // Prepare for //IGNORE and //TRANSLIT
+
+        $translit = $ignore = '';
+
+        $outCharset = strtolower($outCharset);
+        $inCharset = strtolower($inCharset);
+
+        if ('' === $outCharset) {
+            $outCharset = 'iso-8859-1';
+        }
+        if ('' === $inCharset) {
+            $inCharset = 'iso-8859-1';
+        }
+
+        if ('//translit' === substr($outCharset, -10)) {
+            $translit = '//TRANSLIT';
+            $outCharset = substr($outCharset, 0, -10);
+        }
+
+        if ('//ignore' === substr($outCharset, -8)) {
+            $ignore = '//IGNORE';
+            $outCharset = substr($outCharset, 0, -8);
+        }
+
+        if ('//translit' === substr($inCharset, -10)) {
+            $inCharset = substr($inCharset, 0, -10);
+        }
+        if ('//ignore' === substr($inCharset, -8)) {
+            $inCharset = substr($inCharset, 0, -8);
+        }
+
+        if (isset(self::$alias[ $inCharset])) {
+            $inCharset = self::$alias[ $inCharset];
+        }
+        if (isset(self::$alias[$outCharset])) {
+            $outCharset = self::$alias[$outCharset];
+        }
+
+        // Load charset maps
+
+        if (('utf-8' !== $inCharset && !self::loadMap('from.', $inCharset, $inMap))
+          || ('utf-8' !== $outCharset && !self::loadMap('to.', $outCharset, $outMap))) {
+            trigger_error(sprintf(self::ERROR_WRONG_CHARSET, $inCharset, $outCharset));
+
+            return false;
+        }
+
+        if ('utf-8' !== $inCharset) {
+            // Convert input to UTF-8
+            $result = '';
+            if (self::mapToUtf8($result, $inMap, $str, $ignore)) {
+                $str = $result;
+            } else {
+                $str = false;
+            }
+            self::$isValidUtf8 = true;
+        } else {
+            self::$isValidUtf8 = preg_match('//u', $str);
+
+            if (!self::$isValidUtf8 && !$ignore) {
+                trigger_error(self::ERROR_ILLEGAL_CHARACTER);
+
+                return false;
+            }
+
+            if ('utf-8' === $outCharset) {
+                // UTF-8 validation
+                $str = self::utf8ToUtf8($str, $ignore);
+            }
+        }
+
+        if ('utf-8' !== $outCharset && false !== $str) {
+            // Convert output to UTF-8
+            $result = '';
+            if (self::mapFromUtf8($result, $outMap, $str, $ignore, $translit)) {
+                return $result;
+            }
+
+            return false;
+        }
+
+        return $str;
+    }
+
+    public static function iconv_mime_decode_headers($str, $mode = 0, $charset = null)
+    {
+        if (null === $charset) {
+            $charset = self::$internalEncoding;
+        }
+
+        if (false !== strpos($str, "\r")) {
+            $str = strtr(str_replace("\r\n", "\n", $str), "\r", "\n");
+        }
+        $str = explode("\n\n", $str, 2);
+
+        $headers = array();
+
+        $str = preg_split('/\n(?![ \t])/', $str[0]);
+        foreach ($str as $str) {
+            $str = self::iconv_mime_decode($str, $mode, $charset);
+            if (false === $str) {
+                return false;
+            }
+            $str = explode(':', $str, 2);
+
+            if (2 === count($str)) {
+                if (isset($headers[$str[0]])) {
+                    if (!is_array($headers[$str[0]])) {
+                        $headers[$str[0]] = array($headers[$str[0]]);
+                    }
+                    $headers[$str[0]][] = ltrim($str[1]);
+                } else {
+                    $headers[$str[0]] = ltrim($str[1]);
+                }
+            }
+        }
+
+        return $headers;
+    }
+
+    public static function iconv_mime_decode($str, $mode = 0, $charset = null)
+    {
+        if (null === $charset) {
+            $charset = self::$internalEncoding;
+        }
+        if (ICONV_MIME_DECODE_CONTINUE_ON_ERROR & $mode) {
+            $charset .= '//IGNORE';
+        }
+
+        if (false !== strpos($str, "\r")) {
+            $str = strtr(str_replace("\r\n", "\n", $str), "\r", "\n");
+        }
+        $str = preg_split('/\n(?![ \t])/', rtrim($str), 2);
+        $str = preg_replace('/[ \t]*\n[ \t]+/', ' ', rtrim($str[0]));
+        $str = preg_split('/=\?([^?]+)\?([bqBQ])\?(.*?)\?=/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
+
+        $result = self::iconv('utf-8', $charset, $str[0]);
+        if (false === $result) {
+            return false;
+        }
+
+        $i = 1;
+        $len = count($str);
+
+        while ($i < $len) {
+            $c = strtolower($str[$i]);
+            if ((ICONV_MIME_DECODE_CONTINUE_ON_ERROR & $mode)
+              && 'utf-8' !== $c
+              && !isset(self::$alias[$c])
+              && !self::loadMap('from.', $c,  $d)) {
+                $d = false;
+            } elseif ('B' === strtoupper($str[$i + 1])) {
+                $d = base64_decode($str[$i + 2]);
+            } else {
+                $d = rawurldecode(strtr(str_replace('%', '%25', $str[$i + 2]), '=_', '% '));
+            }
+
+            if (false !== $d) {
+                if ('' !== $d) {
+                    if ('' === $d = self::iconv($c, $charset, $d)) {
+                        $str[$i + 3] = substr($str[$i + 3], 1);
+                    } else {
+                        $result .= $d;
+                    }
+                }
+                $d = self::iconv('utf-8', $charset, $str[$i + 3]);
+                if ('' !== trim($d)) {
+                    $result .= $d;
+                }
+            } elseif (ICONV_MIME_DECODE_CONTINUE_ON_ERROR & $mode) {
+                $result .= "=?{$str[$i]}?{$str[$i + 1]}?{$str[$i + 2]}?={$str[$i + 3]}";
+            } else {
+                $result = false;
+                break;
+            }
+
+            $i += 4;
+        }
+
+        return $result;
+    }
+
+    public static function iconv_get_encoding($type = 'all')
+    {
+        switch ($type) {
+            case 'input_encoding': return self::$inputEncoding;
+            case 'output_encoding': return self::$outputEncoding;
+            case 'internal_encoding': return self::$internalEncoding;
+        }
+
+        return array(
+            'input_encoding' => self::$inputEncoding,
+            'output_encoding' => self::$outputEncoding,
+            'internal_encoding' => self::$internalEncoding,
+        );
+    }
+
+    public static function iconv_set_encoding($type, $charset)
+    {
+        switch ($type) {
+            case 'input_encoding': self::$inputEncoding = $charset; break;
+            case 'output_encoding': self::$outputEncoding = $charset; break;
+            case 'internal_encoding': self::$internalEncoding = $charset; break;
+
+            default: return false;
+        }
+
+        return true;
+    }
+
+    public static function iconv_mime_encode($fieldName, $fieldValue, $pref = null)
+    {
+        if (!is_array($pref)) {
+            $pref = array();
+        }
+
+        $pref += array(
+            'scheme' => 'B',
+            'input-charset' => self::$internalEncoding,
+            'output-charset' => self::$internalEncoding,
+            'line-length' => 76,
+            'line-break-chars' => "\r\n",
+        );
+
+        if (preg_match('/[\x80-\xFF]/', $fieldName)) {
+            $fieldName = '';
+        }
+
+        $scheme = strtoupper(substr($pref['scheme'], 0, 1));
+        $in = strtolower($pref['input-charset']);
+        $out = strtolower($pref['output-charset']);
+
+        if ('utf-8' !== $in && false === $fieldValue = self::iconv($in, 'utf-8', $fieldValue)) {
+            return false;
+        }
+
+        preg_match_all('/./us', $fieldValue, $chars);
+
+        $chars = isset($chars[0]) ? $chars[0] : array();
+
+        $lineBreak = (int) $pref['line-length'];
+        $lineStart = "=?{$pref['output-charset']}?{$scheme}?";
+        $lineLength = strlen($fieldName) + 2 + strlen($lineStart) + 2;
+        $lineOffset = strlen($lineStart) + 3;
+        $lineData = '';
+
+        $fieldValue = array();
+
+        $Q = 'Q' === $scheme;
+
+        foreach ($chars as $c) {
+            if ('utf-8' !== $out && false === $c = self::iconv('utf-8', $out, $c)) {
+                return false;
+            }
+
+            $o = $Q
+                ? $c = preg_replace_callback(
+                    '/[=_\?\x00-\x1F\x80-\xFF]/',
+                    array(__CLASS__, 'qpByteCallback'),
+                    $c
+                )
+                : base64_encode($lineData.$c);
+
+            if (isset($o[$lineBreak - $lineLength])) {
+                if (!$Q) {
+                    $lineData = base64_encode($lineData);
+                }
+                $fieldValue[] = $lineStart.$lineData.'?=';
+                $lineLength = $lineOffset;
+                $lineData = '';
+            }
+
+            $lineData .= $c;
+            $Q && $lineLength += strlen($c);
+        }
+
+        if ('' !== $lineData) {
+            if (!$Q) {
+                $lineData = base64_encode($lineData);
+            }
+            $fieldValue[] = $lineStart.$lineData.'?=';
+        }
+
+        return $fieldName.': '.implode($pref['line-break-chars'].' ', $fieldValue);
+    }
+
+    public static function ob_iconv_handler($buffer, $mode)
+    {
+        return self::iconv(self::$internalEncoding, self::$outputEncoding, $buffer);
+    }
+
+    public static function iconv_strlen($s, $encoding = null)
+    {
+        static $hasXml = null;
+        if (null === $hasXml) {
+            $hasXml = extension_loaded('xml');
+        }
+
+        if ($hasXml) {
+            return self::strlen1($s, $encoding);
+        }
+
+        return self::strlen2($s, $encoding);
+    }
+
+    public static function strlen1($s, $encoding = null)
+    {
+        if (null === $encoding) {
+            $encoding = self::$internalEncoding;
+        }
+        if (0 !== stripos($encoding, 'utf-8') && false === $s = self::iconv($encoding, 'utf-8', $s)) {
+            return false;
+        }
+
+        return strlen(utf8_decode($s));
+    }
+
+    public static function strlen2($s, $encoding = null)
+    {
+        if (null === $encoding) {
+            $encoding = self::$internalEncoding;
+        }
+        if (0 !== stripos($encoding, 'utf-8') && false === $s = self::iconv($encoding, 'utf-8', $s)) {
+            return false;
+        }
+
+        $ulenMask = self::$ulenMask;
+
+        $i = 0;
+        $j = 0;
+        $len = strlen($s);
+
+        while ($i < $len) {
+            $u = $s[$i] & "\xF0";
+            $i += isset($ulenMask[$u]) ? $ulenMask[$u] : 1;
+            ++$j;
+        }
+
+        return $j;
+    }
+
+    public static function iconv_strpos($haystack, $needle, $offset = 0, $encoding = null)
+    {
+        if (null === $encoding) {
+            $encoding = self::$internalEncoding;
+        }
+
+        if (0 !== stripos($encoding, 'utf-8')) {
+            if (false === $haystack = self::iconv($encoding, 'utf-8', $haystack)) {
+                return false;
+            }
+            if (false === $needle = self::iconv($encoding, 'utf-8', $needle)) {
+                return false;
+            }
+        }
+
+        if ($offset = (int) $offset) {
+            $haystack = self::iconv_substr($haystack, $offset, 2147483647, 'utf-8');
+        }
+        $pos = strpos($haystack, $needle);
+
+        return false === $pos ? false : ($offset + ($pos ? self::iconv_strlen(substr($haystack, 0, $pos), 'utf-8') : 0));
+    }
+
+    public static function iconv_strrpos($haystack, $needle, $encoding = null)
+    {
+        if (null === $encoding) {
+            $encoding = self::$internalEncoding;
+        }
+
+        if (0 !== stripos($encoding, 'utf-8')) {
+            if (false === $haystack = self::iconv($encoding, 'utf-8', $haystack)) {
+                return false;
+            }
+            if (false === $needle = self::iconv($encoding, 'utf-8', $needle)) {
+                return false;
+            }
+        }
+
+        $pos = isset($needle[0]) ? strrpos($haystack, $needle) : false;
+
+        return false === $pos ? false : self::iconv_strlen($pos ? substr($haystack, 0, $pos) : $haystack, 'utf-8');
+    }
+
+    public static function iconv_substr($s, $start, $length = 2147483647, $encoding = null)
+    {
+        if (null === $encoding) {
+            $encoding = self::$internalEncoding;
+        }
+        if (0 !== stripos($encoding, 'utf-8')) {
+            $encoding = null;
+        } elseif (false === $s = self::iconv($encoding, 'utf-8', $s)) {
+            return false;
+        }
+
+        $s .= '';
+        $slen = self::iconv_strlen($s, 'utf-8');
+        $start = (int) $start;
+
+        if (0 > $start) {
+            $start += $slen;
+        }
+        if (0 > $start) {
+            return false;
+        }
+        if ($start >= $slen) {
+            return false;
+        }
+
+        $rx = $slen - $start;
+
+        if (0 > $length) {
+            $length += $rx;
+        }
+        if (0 === $length) {
+            return '';
+        }
+        if (0 > $length) {
+            return false;
+        }
+
+        if ($length > $rx) {
+            $length = $rx;
+        }
+
+        $rx = '/^'.($start ? self::pregOffset($start) : '').'('.self::pregOffset($length).')/u';
+
+        $s = preg_match($rx, $s, $s) ? $s[1] : '';
+
+        if (null === $encoding) {
+            return $s;
+        }
+
+        return self::iconv('utf-8', $encoding, $s);
+    }
+
+    private static function loadMap($type, $charset, &$map)
+    {
+        if (!isset(self::$convertMap[$type.$charset])) {
+            if (false === $map = self::getData($type.$charset)) {
+                if ('to.' === $type && self::loadMap('from.', $charset, $map)) {
+                    $map = array_flip($map);
+                } else {
+                    return false;
+                }
+            }
+
+            self::$convertMap[$type.$charset] = $map;
+        } else {
+            $map = self::$convertMap[$type.$charset];
+        }
+
+        return true;
+    }
+
+    private static function utf8ToUtf8($str, $ignore)
+    {
+        $ulenMask = self::$ulenMask;
+        $valid = self::$isValidUtf8;
+
+        $u = $str;
+        $i = $j = 0;
+        $len = strlen($str);
+
+        while ($i < $len) {
+            if ($str[$i] < "\x80") {
+                $u[$j++] = $str[$i++];
+            } else {
+                $ulen = $str[$i] & "\xF0";
+                $ulen = isset($ulenMask[$ulen]) ? $ulenMask[$ulen] : 1;
+                $uchr = substr($str, $i, $ulen);
+
+                if (1 === $ulen || !($valid || preg_match('/^.$/us', $uchr))) {
+                    if ($ignore) {
+                        ++$i;
+                        continue;
+                    }
+
+                    trigger_error(self::ERROR_ILLEGAL_CHARACTER);
+
+                    return false;
+                } else {
+                    $i += $ulen;
+                }
+
+                $u[$j++] = $uchr[0];
+
+                isset($uchr[1]) && 0 !== ($u[$j++] = $uchr[1])
+                    && isset($uchr[2]) && 0 !== ($u[$j++] = $uchr[2])
+                    && isset($uchr[3]) && 0 !== ($u[$j++] = $uchr[3]);
+            }
+        }
+
+        return substr($u, 0, $j);
+    }
+
+    private static function mapToUtf8(&$result, $map, $str, $ignore)
+    {
+        $len = strlen($str);
+        for ($i = 0; $i < $len; ++$i) {
+            if (isset($str[$i + 1], $map[$str[$i].$str[$i + 1]])) {
+                $result .= $map[$str[$i].$str[++$i]];
+            } elseif (isset($map[$str[$i]])) {
+                $result .= $map[$str[$i]];
+            } elseif (!$ignore) {
+                trigger_error(self::ERROR_ILLEGAL_CHARACTER);
+
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private static function mapFromUtf8(&$result, $map, $str, $ignore, $translit)
+    {
+        $ulenMask = self::$ulenMask;
+        $valid = self::$isValidUtf8;
+
+        if ($translit && !self::$translitMap) {
+            self::$translitMap = self::getData('translit');
+        }
+
+        $i = 0;
+        $len = strlen($str);
+
+        while ($i < $len) {
+            if ($str[$i] < "\x80") {
+                $uchr = $str[$i++];
+            } else {
+                $ulen = $str[$i] & "\xF0";
+                $ulen = isset($ulenMask[$ulen]) ? $ulenMask[$ulen] : 1;
+                $uchr = substr($str, $i, $ulen);
+
+                if ($ignore && (1 === $ulen || !($valid || preg_match('/^.$/us', $uchr)))) {
+                    ++$i;
+                    continue;
+                } else {
+                    $i += $ulen;
+                }
+            }
+
+            if (isset($map[$uchr])) {
+                $result .= $map[$uchr];
+            } elseif ($translit) {
+                if (isset(self::$translitMap[$uchr])) {
+                    $uchr = self::$translitMap[$uchr];
+                } elseif ($uchr >= "\xC3\x80") {
+                    $uchr = \Normalizer::normalize($uchr, \Normalizer::NFD);
+
+                    if ($uchr[0] < "\x80") {
+                        $uchr = $uchr[0];
+                    } elseif ($ignore) {
+                        continue;
+                    } else {
+                        return false;
+                    }
+                }
+
+                $str = $uchr.substr($str, $i);
+                $len = strlen($str);
+                $i = 0;
+            } elseif (!$ignore) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private static function qpByteCallback($m)
+    {
+        return '='.strtoupper(dechex(ord($m[0])));
+    }
+
+    private static function pregOffset($offset)
+    {
+        $rx = array();
+        $offset = (int) $offset;
+
+        while ($offset > 65535) {
+            $rx[] = '.{65535}';
+            $offset -= 65535;
+        }
+
+        return implode('', $rx).'.{'.$offset.'}';
+    }
+
+    private static function getData($file)
+    {
+        if (file_exists($file = __DIR__.'/charset/'.$file.'.ser')) {
+            return unserialize(file_get_contents($file));
+        }
+
+        return false;
+    }
+}
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/Intl.php
@@ -0,0 +1,232 @@
+<?php
+
+/*
+ * Copyright (C) 2016 Nicolas Grekas - p@tchwork.com
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the (at your option):
+ * Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
+ * GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
+ */
+
+namespace Patchwork\PHP\Shim;
+
+/**
+ * Partial intl implementation in pure PHP.
+ *
+ * Implemented:
+ * - grapheme_extract  - Extract a sequence of grapheme clusters from a text buffer, which must be encoded in UTF-8
+ * - grapheme_stripos  - Find position (in grapheme units) of first occurrence of a case-insensitive string
+ * - grapheme_stristr  - Returns part of haystack string from the first occurrence of case-insensitive needle to the end of haystack
+ * - grapheme_strlen   - Get string length in grapheme units
+ * - grapheme_strpos   - Find position (in grapheme units) of first occurrence of a string
+ * - grapheme_strripos - Find position (in grapheme units) of last occurrence of a case-insensitive string
+ * - grapheme_strrpos  - Find position (in grapheme units) of last occurrence of a string
+ * - grapheme_strstr   - Returns part of haystack string from the first occurrence of needle to the end of haystack
+ * - grapheme_substr   - Return part of a string
+ *
+ * @internal
+ */
+class Intl
+{
+    // (CRLF|([ZWNJ-ZWJ]|T+|L*(LV?V+|LV|LVT)T*|L+|[^Control])[Extend]*|[Control])
+    // This regular expression is a work around for http://bugs.exim.org/1279
+    const GRAPHEME_CLUSTER_RX = '(?:\r\n|(?:[ -~\x{200C}\x{200D}]|[ᆨ-ᇹ]+|[ᄀ-ᅟ]*(?:[가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기까깨꺄꺠꺼께껴꼐꼬꽈꽤꾀꾜꾸꿔꿰뀌뀨끄끠끼나내냐냬너네녀녜노놔놰뇌뇨누눠눼뉘뉴느늬니다대댜댸더데뎌뎨도돠돼되됴두둬뒈뒤듀드듸디따때땨떄떠떼뗘뗴또똬뙈뙤뚀뚜뚸뛔뛰뜌뜨띄띠라래랴럐러레려례로롸뢔뢰료루뤄뤠뤼류르릐리마매먀먜머메며몌모뫄뫠뫼묘무뭐뭬뮈뮤므믜미바배뱌뱨버베벼볘보봐봬뵈뵤부붜붸뷔뷰브븨비빠빼뺘뺴뻐뻬뼈뼤뽀뽜뽸뾔뾰뿌뿨쀄쀠쀼쁘쁴삐사새샤섀서세셔셰소솨쇄쇠쇼수숴쉐쉬슈스싀시싸쌔쌰썌써쎄쎠쎼쏘쏴쐐쐬쑈쑤쒀쒜쒸쓔쓰씌씨아애야얘어에여예오와왜외요우워웨위유으의이자재쟈쟤저제져졔조좌좨죄죠주줘줴쥐쥬즈즤지짜째쨔쨰쩌쩨쪄쪠쪼쫘쫴쬐쬬쭈쭤쮀쮜쮸쯔쯰찌차채챠챼처체쳐쳬초촤쵀최쵸추춰췌취츄츠츼치카캐캬컈커케켜켸코콰쾌쾨쿄쿠쿼퀘퀴큐크킈키타태탸턔터테텨톄토톼퇘퇴툐투퉈퉤튀튜트틔티파패퍄퍠퍼페펴폐포퐈퐤푀표푸풔풰퓌퓨프픠피하해햐햬허헤혀혜호화홰회효후훠훼휘휴흐희히]?[ᅠ-ᆢ]+|[가-힣])[ᆨ-ᇹ]*|[ᄀ-ᅟ]+|[^\p{Cc}\p{Cf}\p{Zl}\p{Zp}])[\p{Mn}\p{Me}\x{09BE}\x{09D7}\x{0B3E}\x{0B57}\x{0BBE}\x{0BD7}\x{0CC2}\x{0CD5}\x{0CD6}\x{0D3E}\x{0D57}\x{0DCF}\x{0DDF}\x{200C}\x{200D}\x{1D165}\x{1D16E}-\x{1D172}]*|[\p{Cc}\p{Cf}\p{Zl}\p{Zp}])';
+
+    public static function grapheme_extract($s, $size, $type = GRAPHEME_EXTR_COUNT, $start = 0, &$next = 0)
+    {
+        if (!is_scalar($s)) {
+            $hasError = false;
+            set_error_handler(function () use (&$hasError) {$hasError = true;});
+            $next = substr($s, $start);
+            restore_error_handler();
+            if ($hasError) {
+                substr($s, $start);
+                $s = '';
+            } else {
+                $s = $next;
+            }
+        } else {
+            $s = substr($s, $start);
+        }
+        $size = (int) $size;
+        $type = (int) $type;
+        $start = (int) $start;
+
+        if (!isset($s[0]) || 0 > $size || 0 > $start || 0 > $type || 2 < $type) {
+            return false;
+        }
+        if (0 === $size) {
+            return '';
+        }
+
+        $next = $start;
+
+        $s = preg_split('/('.GRAPHEME_CLUSTER_RX.')/u', "\r\n".$s, $size + 1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
+
+        if (!isset($s[1])) {
+            return false;
+        }
+
+        $i = 1;
+        $ret = '';
+
+        do {
+            if (GRAPHEME_EXTR_COUNT === $type) {
+                --$size;
+            } elseif (GRAPHEME_EXTR_MAXBYTES === $type) {
+                $size -= strlen($s[$i]);
+            } else {
+                $size -= iconv_strlen($s[$i], 'UTF-8//IGNORE');
+            }
+
+            if ($size >= 0) {
+                $ret .= $s[$i];
+            }
+        } while (isset($s[++$i]) && $size > 0);
+
+        $next += strlen($ret);
+
+        return $ret;
+    }
+
+    public static function grapheme_strlen($s)
+    {
+        preg_replace('/'.GRAPHEME_CLUSTER_RX.'/u', '', $s, -1, $len);
+
+        return 0 === $len && '' !== $s ? null : $len;
+    }
+
+    public static function grapheme_substr($s, $start, $len = 2147483647)
+    {
+        preg_match_all('/'.GRAPHEME_CLUSTER_RX.'/u', $s, $s);
+
+        $slen = count($s[0]);
+        $start = (int) $start;
+
+        if (0 > $start) {
+            $start += $slen;
+        }
+        if (0 > $start) {
+            return false;
+        }
+        if ($start >= $slen) {
+            return false;
+        }
+
+        $rem = $slen - $start;
+
+        if (0 > $len) {
+            $len += $rem;
+        }
+        if (0 === $len) {
+            return '';
+        }
+        if (0 > $len) {
+            return false;
+        }
+        if ($len > $rem) {
+            $len = $rem;
+        }
+
+        return implode('', array_slice($s[0], $start, $len));
+    }
+
+    public static function grapheme_substr_workaround62759($s, $start, $len)
+    {
+        // Intl based http://bugs.php.net/62759 and 55562 workaround
+
+        if (2147483647 == $len) {
+            return grapheme_substr($s, $start);
+        }
+
+        $s .= '';
+        $slen = grapheme_strlen($s);
+        $start = (int) $start;
+
+        if (0 > $start) {
+            $start += $slen;
+        }
+        if (0 > $start) {
+            return false;
+        }
+        if ($start >= $slen) {
+            return false;
+        }
+
+        $rem = $slen - $start;
+
+        if (0 > $len) {
+            $len += $rem;
+        }
+        if (0 === $len) {
+            return '';
+        }
+        if (0 > $len) {
+            return false;
+        }
+        if ($len > $rem) {
+            $len = $rem;
+        }
+
+        return grapheme_substr($s, $start, $len);
+    }
+
+    public static function grapheme_strpos($s, $needle, $offset = 0)
+    {
+        return self::grapheme_position($s, $needle, $offset, 0);
+    }
+
+    public static function grapheme_stripos($s, $needle, $offset = 0)
+    {
+        return self::grapheme_position($s, $needle, $offset, 1);
+    }
+
+    public static function grapheme_strrpos($s, $needle, $offset = 0)
+    {
+        return self::grapheme_position($s, $needle, $offset, 2);
+    }
+
+    public static function grapheme_strripos($s, $needle, $offset = 0)
+    {
+        return self::grapheme_position($s, $needle, $offset, 3);
+    }
+
+    public static function grapheme_stristr($s, $needle, $beforeNeedle = false)
+    {
+        return mb_stristr($s, $needle, $beforeNeedle, 'UTF-8');
+    }
+
+    public static function grapheme_strstr($s, $needle, $beforeNeedle = false)
+    {
+        return mb_strstr($s, $needle, $beforeNeedle, 'UTF-8');
+    }
+
+    private static function grapheme_position($s, $needle, $offset, $mode)
+    {
+        if (!preg_match('/./us', $needle .= '')) {
+            return false;
+        }
+        if (!preg_match('/./us', $s .= '')) {
+            return false;
+        }
+        if ($offset > 0) {
+            $s = self::grapheme_substr($s, $offset);
+        } elseif ($offset < 0) {
+            if (defined('HHVM_VERSION_ID') || PHP_VERSION_ID < 50535 || (50600 <= PHP_VERSION_ID && PHP_VERSION_ID < 50621) || (70000 <= PHP_VERSION_ID && PHP_VERSION_ID < 70006)) {
+                $offset = 0;
+            } else {
+                return false;
+            }
+        }
+
+        switch ($mode) {
+            case 0: $needle = iconv_strpos($s, $needle, 0, 'UTF-8'); break;
+            case 1: $needle = mb_stripos($s, $needle, 0, 'UTF-8'); break;
+            case 2: $needle = iconv_strrpos($s, $needle, 'UTF-8'); break;
+            default: $needle = mb_strripos($s, $needle, 0, 'UTF-8'); break;
+        }
+
+        return $needle ? self::grapheme_strlen(iconv_substr($s, 0, $needle, 'UTF-8')) + $offset : $needle;
+    }
+}
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/Mbstring.php
@@ -0,0 +1,602 @@
+<?php
+
+/*
+ * Copyright (C) 2016 Nicolas Grekas - p@tchwork.com
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the (at your option):
+ * Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
+ * GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
+ */
+
+namespace Patchwork\PHP\Shim;
+
+/**
+ * Partial mbstring implementation in PHP, iconv based, UTF-8 centric.
+ *
+ * Implemented:
+ * - mb_convert_encoding     - Convert character encoding
+ * - mb_convert_variables    - Convert character code in variable(s)
+ * - mb_decode_mimeheader    - Decode string in MIME header field
+ * - mb_encode_mimeheader    - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED
+ * - mb_convert_case         - Perform case folding on a string
+ * - mb_get_info             - Get internal settings of mbstring
+ * - mb_http_input           - Detect HTTP input character encoding
+ * - mb_http_output          - Set/Get HTTP output character encoding
+ * - mb_internal_encoding    - Set/Get internal character encoding
+ * - mb_list_encodings       - Returns an array of all supported encodings
+ * - mb_output_handler       - Callback function converts character encoding in output buffer
+ * - mb_strlen               - Get string length
+ * - mb_strpos               - Find position of first occurrence of string in a string
+ * - mb_strrpos              - Find position of last occurrence of a string in a string
+ * - mb_strtolower           - Make a string lowercase
+ * - mb_strtoupper           - Make a string uppercase
+ * - mb_substitute_character - Set/Get substitution character
+ * - mb_substr               - Get part of string
+ * - mb_stripos              - Finds position of first occurrence of a string within another, case insensitive
+ * - mb_stristr              - Finds first occurrence of a string within another, case insensitive
+ * - mb_strrchr              - Finds the last occurrence of a character in a string within another
+ * - mb_strrichr             - Finds the last occurrence of a character in a string within another, case insensitive
+ * - mb_strripos             - Finds position of last occurrence of a string within another, case insensitive
+ * - mb_strstr               - Finds first occurrence of a string within anothers
+ * - mb_strwidth             - Return width of string
+ * - mb_substr_count         - Count the number of substring occurrences
+ *
+ * Not implemented:
+ * - mb_convert_kana         - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
+ * - mb_decode_numericentity - Decode HTML numeric string reference to character
+ * - mb_encode_numericentity - Encode character to HTML numeric string reference
+ * - mb_ereg_*               - Regular expression with multibyte support
+ * - mb_parse_str            - Parse GET/POST/COOKIE data and set global variable
+ * - mb_preferred_mime_name  - Get MIME charset string
+ * - mb_regex_encoding       - Returns current encoding for multibyte regex as string
+ * - mb_regex_set_options    - Set/Get the default options for mbregex functions
+ * - mb_send_mail            - Send encoded mail
+ * - mb_split                - Split multibyte string using regular expression
+ * - mb_strcut               - Get part of string
+ * - mb_strimwidth           - Get truncated string with specified width
+ *
+ * @internal
+ */
+class Mbstring
+{
+    const MB_CASE_FOLD = PHP_INT_MAX;
+
+    private static $encodingList = array('ASCII', 'UTF-8');
+    private static $language = 'neutral';
+    private static $internalEncoding = 'UTF-8';
+    private static $caseFold = array(
+        array('µ','ſ',"\xCD\x85",'ς',"\xCF\x90","\xCF\x91","\xCF\x95","\xCF\x96","\xCF\xB0","\xCF\xB1","\xCF\xB5","\xE1\xBA\x9B","\xE1\xBE\xBE"),
+        array('μ','s','ι',       'σ','β',       'θ',       'φ',       'π',       'κ',       'ρ',       'ε',       "\xE1\xB9\xA1",'ι'),
+    );
+
+    public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
+    {
+        if (is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) {
+            $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
+        } else {
+            $fromEncoding = self::getEncoding($fromEncoding);
+        }
+
+        $toEncoding = self::getEncoding($toEncoding);
+
+        if ('BASE64' === $fromEncoding) {
+            $s = base64_decode($s);
+            $fromEncoding = $toEncoding;
+        }
+
+        if ('BASE64' === $toEncoding) {
+            return base64_encode($s);
+        }
+
+        if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {
+            if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {
+                $fromEncoding = 'Windows-1252';
+            }
+            if ('UTF-8' !== $fromEncoding) {
+                $s = iconv($fromEncoding, 'UTF-8', $s);
+            }
+
+            return preg_replace_callback('/[\x80-\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s);
+        }
+
+        if ('HTML-ENTITIES' === $fromEncoding) {
+            $s = html_entity_decode($s, ENT_COMPAT, 'UTF-8');
+            $fromEncoding = 'UTF-8';
+        }
+
+        return iconv($fromEncoding, $toEncoding, $s);
+    }
+
+    public static function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null)
+    {
+        $vars = array(&$a, &$b, &$c, &$d, &$e, &$f);
+
+        $ok = true;
+        array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) {
+            if (false === $v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {
+                $ok = false;
+            }
+        });
+
+        return $ok ? $fromEncoding : false;
+    }
+
+    public static function mb_decode_mimeheader($s)
+    {
+        return iconv_mime_decode($s, 2, self::$internalEncoding);
+    }
+
+    public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
+    {
+        trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING);
+    }
+
+    public static function mb_convert_case($s, $mode, $encoding = null)
+    {
+        if ('' === $s .= '') {
+            return '';
+        }
+
+        $encoding = self::getEncoding($encoding);
+
+        if ('UTF-8' === $encoding) {
+            $encoding = null;
+        } else {
+            $s = iconv($encoding, 'UTF-8', $s);
+        }
+
+        if (MB_CASE_TITLE == $mode) {
+            $s = preg_replace_callback('/\b\p{Ll}/u', array(__CLASS__, 'title_case_upper'), $s);
+            $s = preg_replace_callback('/\B[\p{Lu}\p{Lt}]+/u', array(__CLASS__, 'title_case_lower'), $s);
+        } else {
+            if (MB_CASE_UPPER == $mode) {
+                static $upper = null;
+                if (null === $upper) {
+                    $upper = self::getData('upperCase');
+                }
+                $map = $upper;
+            } else {
+                if (self::MB_CASE_FOLD === $mode) {
+                    $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s);
+                }
+
+                static $lower = null;
+                if (null === $lower) {
+                    $lower = self::getData('lowerCase');
+                }
+                $map = $lower;
+            }
+
+            static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
+
+            $i = 0;
+            $len = strlen($s);
+
+            while ($i < $len) {
+                $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
+                $uchr = substr($s, $i, $ulen);
+                $i += $ulen;
+
+                if (isset($map[$uchr])) {
+                    $uchr = $map[$uchr];
+                    $nlen = strlen($uchr);
+
+                    if ($nlen == $ulen) {
+                        $nlen = $i;
+                        do {
+                            $s[--$nlen] = $uchr[--$ulen];
+                        } while ($ulen);
+                    } else {
+                        $s = substr_replace($s, $uchr, $i - $ulen, $ulen);
+                        $len += $nlen - $ulen;
+                        $i   += $nlen - $ulen;
+                    }
+                }
+            }
+        }
+
+        if (null === $encoding) {
+            return $s;
+        }
+
+        return iconv('UTF-8', $encoding, $s);
+    }
+
+    public static function mb_internal_encoding($encoding = null)
+    {
+        if (null === $encoding) {
+            return self::$internalEncoding;
+        }
+
+        $encoding = self::getEncoding($encoding);
+
+        if ('UTF-8' === $encoding || false !== @iconv($encoding, $encoding, ' ')) {
+            self::$internalEncoding = $encoding;
+
+            return true;
+        }
+
+        return false;
+    }
+
+    public static function mb_language($lang = null)
+    {
+        if (null === $lang) {
+            return self::$language;
+        }
+
+        switch ($lang = strtolower($lang)) {
+            case 'uni':
+            case 'neutral':
+                self::$language = $lang;
+
+                return true;
+        }
+
+        return false;
+    }
+
+    public static function mb_list_encodings()
+    {
+        return array('UTF-8');
+    }
+
+    public static function mb_encoding_aliases($encoding)
+    {
+        switch (strtoupper($encoding)) {
+            case 'UTF8':
+            case 'UTF-8':
+                return array('utf8');
+        }
+
+        return false;
+    }
+
+    public static function mb_check_encoding($var = null, $encoding = null)
+    {
+        if (null === $encoding) {
+            if (null === $var) {
+                return false;
+            }
+            $encoding = self::$internalEncoding;
+        }
+
+        return self::mb_detect_encoding($var, array($encoding)) || false !== @iconv($encoding, $encoding, $var);
+    }
+
+    public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
+    {
+        if (null === $encodingList) {
+            $encodingList = self::$encodingList;
+        } else {
+            if (!is_array($encodingList)) {
+                $encodingList = array_map('trim', explode(',', $encodingList));
+            }
+            $encodingList = array_map('strtoupper', $encodingList);
+        }
+
+        foreach ($encodingList as $enc) {
+            switch ($enc) {
+                case 'ASCII':
+                    if (!preg_match('/[\x80-\xFF]/', $str)) {
+                        return $enc;
+                    }
+                    break;
+
+                case 'UTF8':
+                case 'UTF-8':
+                    if (preg_match('//u', $str)) {
+                        return 'UTF-8';
+                    }
+                    break;
+
+                default:
+                    if (0 === strncmp($enc, 'ISO-8859-', 9)) {
+                        return $enc;
+                    }
+            }
+        }
+
+        return false;
+    }
+
+    public static function mb_detect_order($encodingList = null)
+    {
+        if (null === $encodingList) {
+            return self::$encodingList;
+        }
+
+        if (!is_array($encodingList)) {
+            $encodingList = array_map('trim', explode(',', $encodingList));
+        }
+        $encodingList = array_map('strtoupper', $encodingList);
+
+        foreach ($encodingList as $enc) {
+            switch ($enc) {
+                default:
+                    if (strncmp($enc, 'ISO-8859-', 9)) {
+                        return false;
+                    }
+                case 'ASCII':
+                case 'UTF8':
+                case 'UTF-8':
+            }
+        }
+
+        self::$encodingList = $encodingList;
+
+        return true;
+    }
+
+    public static function mb_strlen($s, $encoding = null)
+    {
+        $encoding = self::getEncoding($encoding);
+
+        return iconv_strlen($s, $encoding);
+    }
+
+    public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
+    {
+        $encoding = self::getEncoding($encoding);
+
+        if ('' === $needle .= '') {
+            trigger_error(__METHOD__.': Empty delimiter', E_USER_WARNING);
+
+            return false;
+        }
+
+        return iconv_strpos($haystack, $needle, $offset, $encoding);
+    }
+
+    public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
+    {
+        $encoding = self::getEncoding($encoding);
+
+        if ($offset != (int) $offset) {
+            $offset = 0;
+        } elseif ($offset = (int) $offset) {
+            if ($offset < 0) {
+                $haystack = self::mb_substr($haystack, 0, $offset, $encoding);
+                $offset = 0;
+            } else {
+                $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);
+            }
+        }
+
+        $pos = iconv_strrpos($haystack, $needle, $encoding);
+
+        return false !== $pos ? $offset + $pos : false;
+    }
+
+    public static function mb_strtolower($s, $encoding = null)
+    {
+        return self::mb_convert_case($s, MB_CASE_LOWER, $encoding);
+    }
+
+    public static function mb_strtoupper($s, $encoding = null)
+    {
+        return self::mb_convert_case($s, MB_CASE_UPPER, $encoding);
+    }
+
+    public static function mb_substitute_character($c = null)
+    {
+        if (0 === strcasecmp($c, 'none')) {
+            return true;
+        }
+
+        return null !== $c ? false : 'none';
+    }
+
+    public static function mb_substr($s, $start, $length = null, $encoding = null)
+    {
+        $encoding = self::getEncoding($encoding);
+
+        if ($start < 0) {
+            $start = iconv_strlen($s, $encoding) + $start;
+            if ($start < 0) {
+                $start = 0;
+            }
+        }
+
+        if (null === $length) {
+            $length = 2147483647;
+        } elseif ($length < 0) {
+            $length = iconv_strlen($s, $encoding) + $length - $start;
+            if ($length < 0) {
+                return '';
+            }
+        }
+
+        return iconv_substr($s, $start, $length, $encoding).'';
+    }
+
+    public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
+    {
+        $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
+        $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
+
+        return self::mb_strpos($haystack, $needle, $offset, $encoding);
+    }
+
+    public static function mb_stristr($haystack, $needle, $part = false, $encoding = null)
+    {
+        $pos = self::mb_stripos($haystack, $needle, 0, $encoding);
+
+        return self::getSubpart($pos, $part, $haystack, $encoding);
+    }
+
+    public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null)
+    {
+        $encoding = self::getEncoding($encoding);
+        $needle = self::mb_substr($needle, 0, 1, $encoding);
+        $pos = iconv_strrpos($haystack, $needle, $encoding);
+
+        return self::getSubpart($pos, $part, $haystack, $encoding);
+    }
+
+    public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null)
+    {
+        $needle = self::mb_substr($needle, 0, 1, $encoding);
+        $pos = self::mb_strripos($haystack, $needle, $encoding);
+
+        return self::getSubpart($pos, $part, $haystack, $encoding);
+    }
+
+    public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)
+    {
+        $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
+        $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
+
+        return self::mb_strrpos($haystack, $needle, $offset, $encoding);
+    }
+
+    public static function mb_strstr($haystack, $needle, $part = false, $encoding = null)
+    {
+        $pos = strpos($haystack, $needle);
+        if (false === $pos) {
+            return false;
+        }
+        if ($part) {
+            return substr($haystack, 0, $pos);
+        }
+
+        return substr($haystack, $pos);
+    }
+
+    public static function mb_get_info($type = 'all')
+    {
+        $info = array(
+            'internal_encoding' => self::$internalEncoding,
+            'http_output' => 'pass',
+            'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)',
+            'func_overload' => 0,
+            'func_overload_list' => 'no overload',
+            'mail_charset' => 'UTF-8',
+            'mail_header_encoding' => 'BASE64',
+            'mail_body_encoding' => 'BASE64',
+            'illegal_chars' => 0,
+            'encoding_translation' => 'Off',
+            'language' => self::$language,
+            'detect_order' => self::$encodingList,
+            'substitute_character' => 'none',
+            'strict_detection' => 'Off',
+        );
+
+        if ('all' === $type) {
+            return $info;
+        }
+        if (isset($info[$type])) {
+            return $info[$type];
+        }
+
+        return false;
+    }
+
+    public static function mb_http_input($type = '')
+    {
+        return false;
+    }
+
+    public static function mb_http_output($encoding = null)
+    {
+        return null !== $encoding ? 'pass' === $encoding : 'pass';
+    }
+
+    public static function mb_strwidth($s, $encoding = null)
+    {
+        $encoding = self::getEncoding($encoding);
+
+        if ('UTF-8' !== $encoding) {
+            $s = iconv($encoding, 'UTF-8', $s);
+        }
+
+        $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide);
+
+        return ($wide << 1) + iconv_strlen($s, 'UTF-8');
+    }
+
+    public static function mb_substr_count($haystack, $needle, $encoding = null)
+    {
+        return substr_count($haystack, $needle);
+    }
+
+    public static function mb_output_handler($contents, $status)
+    {
+        return $contents;
+    }
+
+    private static function getSubpart($pos, $part, $haystack, $encoding)
+    {
+        if (false === $pos) {
+            return false;
+        }
+        if ($part) {
+            return self::mb_substr($haystack, 0, $pos, $encoding);
+        }
+
+        return self::mb_substr($haystack, $pos, null, $encoding);
+    }
+
+    private static function html_encoding_callback($m)
+    {
+        $i = 1;
+        $entities = '';
+        $m = unpack('C*', htmlentities($m[0], ENT_COMPAT, 'UTF-8'));
+
+        while (isset($m[$i])) {
+            if (0x80 > $m[$i]) {
+                $entities .= chr($m[$i++]);
+                continue;
+            }
+            if (0xF0 <= $m[$i]) {
+                $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
+            } elseif (0xE0 <= $m[$i]) {
+                $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
+            } else {
+                $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80;
+            }
+
+            $entities .= '&#'.$c.';';
+        }
+
+        return $entities;
+    }
+
+    private static function title_case_lower($s)
+    {
+        return self::mb_convert_case($s[0], MB_CASE_LOWER, 'UTF-8');
+    }
+
+    private static function title_case_upper($s)
+    {
+        return self::mb_convert_case($s[0], MB_CASE_UPPER, 'UTF-8');
+    }
+
+    private static function getData($file)
+    {
+        if (file_exists($file = __DIR__.'/unidata/'.$file.'.ser')) {
+            return unserialize(file_get_contents($file));
+        }
+
+        return false;
+    }
+
+    private static function getEncoding($encoding)
+    {
+        if (null === $encoding) {
+            return self::$internalEncoding;
+        }
+
+        $encoding = strtoupper($encoding);
+
+        if ('8BIT' === $encoding || 'BINARY' === $encoding) {
+            return 'CP850';
+        }
+        if ('UTF8' === $encoding) {
+            return 'UTF-8';
+        }
+
+        return $encoding;
+    }
+}
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/Normalizer.php
@@ -0,0 +1,301 @@
+<?php
+
+/*
+ * Copyright (C) 2016 Nicolas Grekas - p@tchwork.com
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the (at your option):
+ * Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
+ * GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
+ */
+
+namespace Patchwork\PHP\Shim;
+
+/**
+ * Normalizer is a PHP fallback implementation of the Normalizer class provided by the intl extension.
+ *
+ * It has been validated with Unicode 6.3 Normalization Conformance Test.
+ * See http://www.unicode.org/reports/tr15/ for detailed info about Unicode normalizations.
+ *
+ * @internal
+ */
+class Normalizer
+{
+    const NONE = 1;
+    const FORM_D = 2;
+    const FORM_KD = 3;
+    const FORM_C = 4;
+    const FORM_KC = 5;
+    const NFD = 2;
+    const NFKD = 3;
+    const NFC = 4;
+    const NFKC = 5;
+
+    private static $C;
+    private static $D;
+    private static $KD;
+    private static $cC;
+    private static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
+    private static $ASCII = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F";
+
+    public static function isNormalized($s, $form = self::NFC)
+    {
+        if ($form <= self::NONE || self::NFKC < $form) {
+            return false;
+        }
+        if (!isset($s[strspn($s .= '', self::$ASCII)])) {
+            return true;
+        }
+        if (self::NFC === $form && preg_match('//u', $s) && !preg_match('/[^\x00-\x{2FF}]/u', $s)) {
+            return true;
+        }
+
+        return false; // Pretend false as quick checks implementented in PHP won't be so quick
+    }
+
+    public static function normalize($s, $form = self::NFC)
+    {
+        if (!preg_match('//u', $s .= '')) {
+            return false;
+        }
+
+        switch ($form) {
+            case self::NONE: return $s;
+            case self::NFC: $C = true; $K = false; break;
+            case self::NFD: $C = false; $K = false; break;
+            case self::NFKC: $C = true; $K = true; break;
+            case self::NFKD: $C = false; $K = true; break;
+            default: return false;
+        }
+
+        if ('' === $s) {
+            return '';
+        }
+
+        if ($K && null === self::$KD) {
+            self::$KD = self::getData('compatibilityDecomposition');
+        }
+
+        if (null === self::$D) {
+            self::$D = self::getData('canonicalDecomposition');
+            self::$cC = self::getData('combiningClass');
+        }
+
+        if (null !== $mbEncoding = (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) ? mb_internal_encoding() : null) {
+            mb_internal_encoding('8bit');
+        }
+
+        $r = self::decompose($s, $K);
+
+        if ($C) {
+            if (null === self::$C) {
+                self::$C = self::getData('canonicalComposition');
+            }
+
+            $r = self::recompose($r);
+        }
+        if (null !== $mbEncoding) {
+            mb_internal_encoding($mbEncoding);
+        }
+
+        return $r;
+    }
+
+    private static function recompose($s)
+    {
+        $ASCII = self::$ASCII;
+        $compMap = self::$C;
+        $combClass = self::$cC;
+        $ulenMask = self::$ulenMask;
+
+        $result = $tail = '';
+
+        $i = $s[0] < "\x80" ? 1 : $ulenMask[$s[0] & "\xF0"];
+        $len = strlen($s);
+
+        $lastUchr = substr($s, 0, $i);
+        $lastUcls = isset($combClass[$lastUchr]) ? 256 : 0;
+
+        while ($i < $len) {
+            if ($s[$i] < "\x80") {
+                // ASCII chars
+
+                if ($tail) {
+                    $lastUchr .= $tail;
+                    $tail = '';
+                }
+
+                if ($j = strspn($s, $ASCII, $i + 1)) {
+                    $lastUchr .= substr($s, $i, $j);
+                    $i += $j;
+                }
+
+                $result .= $lastUchr;
+                $lastUchr = $s[$i];
+                $lastUcls = 0;
+                ++$i;
+                continue;
+            }
+
+            $ulen = $ulenMask[$s[$i] & "\xF0"];
+            $uchr = substr($s, $i, $ulen);
+
+            if ($lastUchr < "\xE1\x84\x80" || "\xE1\x84\x92" < $lastUchr
+                ||   $uchr < "\xE1\x85\xA1" || "\xE1\x85\xB5" < $uchr
+                || $lastUcls) {
+                // Table lookup and combining chars composition
+
+                $ucls = isset($combClass[$uchr]) ? $combClass[$uchr] : 0;
+
+                if (isset($compMap[$lastUchr.$uchr]) && (!$lastUcls || $lastUcls < $ucls)) {
+                    $lastUchr = $compMap[$lastUchr.$uchr];
+                } elseif ($lastUcls = $ucls) {
+                    $tail .= $uchr;
+                } else {
+                    if ($tail) {
+                        $lastUchr .= $tail;
+                        $tail = '';
+                    }
+
+                    $result .= $lastUchr;
+                    $lastUchr = $uchr;
+                }
+            } else {
+                // Hangul chars
+
+                $L = ord($lastUchr[2]) - 0x80;
+                $V = ord($uchr[2]) - 0xA1;
+                $T = 0;
+
+                $uchr = substr($s, $i + $ulen, 3);
+
+                if ("\xE1\x86\xA7" <= $uchr && $uchr <= "\xE1\x87\x82") {
+                    $T = ord($uchr[2]) - 0xA7;
+                    0 > $T && $T += 0x40;
+                    $ulen += 3;
+                }
+
+                $L = 0xAC00 + ($L * 21 + $V) * 28 + $T;
+                $lastUchr = chr(0xE0 | $L >> 12).chr(0x80 | $L >> 6 & 0x3F).chr(0x80 | $L & 0x3F);
+            }
+
+            $i += $ulen;
+        }
+
+        return $result.$lastUchr.$tail;
+    }
+
+    private static function decompose($s, $c)
+    {
+        $result = '';
+
+        $ASCII = self::$ASCII;
+        $decompMap = self::$D;
+        $combClass = self::$cC;
+        $ulenMask = self::$ulenMask;
+        if ($c) {
+            $compatMap = self::$KD;
+        }
+
+        $c = array();
+        $i = 0;
+        $len = strlen($s);
+
+        while ($i < $len) {
+            if ($s[$i] < "\x80") {
+                // ASCII chars
+
+                if ($c) {
+                    ksort($c);
+                    $result .= implode('', $c);
+                    $c = array();
+                }
+
+                $j = 1 + strspn($s, $ASCII, $i + 1);
+                $result .= substr($s, $i, $j);
+                $i += $j;
+                continue;
+            }
+
+            $ulen = $ulenMask[$s[$i] & "\xF0"];
+            $uchr = substr($s, $i, $ulen);
+            $i += $ulen;
+
+            if ($uchr < "\xEA\xB0\x80" || "\xED\x9E\xA3" < $uchr) {
+                // Table lookup
+
+                if ($uchr !== $j = isset($compatMap[$uchr]) ? $compatMap[$uchr] : (isset($decompMap[$uchr]) ? $decompMap[$uchr] : $uchr)) {
+                    $uchr = $j;
+
+                    $j = strlen($uchr);
+                    $ulen = $uchr[0] < "\x80" ? 1 : $ulenMask[$uchr[0] & "\xF0"];
+
+                    if ($ulen != $j) {
+                        // Put trailing chars in $s
+
+                        $j -= $ulen;
+                        $i -= $j;
+
+                        if (0 > $i) {
+                            $s = str_repeat(' ', -$i).$s;
+                            $len -= $i;
+                            $i = 0;
+                        }
+
+                        while ($j--) {
+                            $s[$i + $j] = $uchr[$ulen + $j];
+                        }
+
+                        $uchr = substr($uchr, 0, $ulen);
+                    }
+                }
+                if (isset($combClass[$uchr])) {
+                    // Combining chars, for sorting
+
+                    if (!isset($c[$combClass[$uchr]])) {
+                        $c[$combClass[$uchr]] = '';
+                    }
+                    $c[$combClass[$uchr]] .= $uchr;
+                    continue;
+                }
+            } else {
+                // Hangul chars
+
+                $uchr = unpack('C*', $uchr);
+                $j = (($uchr[1] - 224) << 12) + (($uchr[2] - 128) << 6) + $uchr[3] - 0xAC80;
+
+                $uchr = "\xE1\x84".chr(0x80 + (int) ($j / 588))
+                       ."\xE1\x85".chr(0xA1 + (int) (($j % 588) / 28));
+
+                if ($j %= 28) {
+                    $uchr .= $j < 25
+                        ? ("\xE1\x86".chr(0xA7 + $j))
+                        : ("\xE1\x87".chr(0x67 + $j));
+                }
+            }
+            if ($c) {
+                ksort($c);
+                $result .= implode('', $c);
+                $c = array();
+            }
+
+            $result .= $uchr;
+        }
+
+        if ($c) {
+            ksort($c);
+            $result .= implode('', $c);
+        }
+
+        return $result;
+    }
+
+    private static function getData($file)
+    {
+        if (file_exists($file = __DIR__.'/unidata/'.$file.'.ser')) {
+            return unserialize(file_get_contents($file));
+        }
+
+        return false;
+    }
+}
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/Xml.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * Copyright (C) 2016 Nicolas Grekas - p@tchwork.com
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the (at your option):
+ * Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
+ * GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
+ */
+
+namespace Patchwork\PHP\Shim;
+
+/**
+ * @internal
+ */
+class Xml
+{
+    public static function utf8_encode($s)
+    {
+        $s .= $s;
+        $len = strlen($s);
+
+        for ($i = $len >> 1, $j = 0; $i < $len; ++$i, ++$j) {
+            switch (true) {
+                case $s[$i] < "\x80": $s[$j] = $s[$i]; break;
+                case $s[$i] < "\xC0": $s[$j] = "\xC2"; $s[++$j] = $s[$i]; break;
+                default: $s[$j] = "\xC3"; $s[++$j] = chr(ord($s[$i]) - 64); break;
+            }
+        }
+
+        return substr($s, 0, $j);
+    }
+
+    public static function utf8_decode($s)
+    {
+        $s .= '';
+        $len = strlen($s);
+
+        for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) {
+            switch ($s[$i] & "\xF0") {
+                case "\xC0":
+                case "\xD0":
+                    $c = (ord($s[$i] & "\x1F") << 6) | ord($s[++$i] & "\x3F");
+                    $s[$j] = $c < 256 ? chr($c) : '?';
+                    break;
+
+                case "\xF0": ++$i;
+                case "\xE0":
+                    $s[$j] = '?';
+                    $i += 2;
+                    break;
+
+                default:
+                    $s[$j] = $s[$i];
+            }
+        }
+
+        return substr($s, 0, $j);
+    }
+}
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.big5.ser
@@ -0,0 +1 @@
+a:13710:{s:2:"@";s:3:"　";s:2:"A";s:3:"，";s:2:"B";s:3:"、";s:2:"C";s:3:"。";s:2:"D";s:3:"．";s:2:"E";s:3:"•";s:2:"F";s:3:"；";s:2:"G";s:3:"：";s:2:"H";s:3:"？";s:2:"I";s:3:"！";s:2:"J";s:3:"︰";s:2:"K";s:3:"…";s:2:"L";s:3:"‥";s:2:"M";s:3:"﹐";s:2:"N";s:3:"､";s:2:"O";s:3:"﹒";s:2:"P";s:2:"·";s:2:"Q";s:3:"﹔";s:2:"R";s:3:"﹕";s:2:"S";s:3:"﹖";s:2:"T";s:3:"﹗";s:2:"U";s:3:"｜";s:2:"V";s:3:"–";s:2:"W";s:3:"︱";s:2:"X";s:3:"—";s:2:"Y";s:3:"︳";s:2:"Z";s:3:"�";s:2:"[";s:3:"︴";s:2:"\";s:3:"﹏";s:2:"]";s:3:"（";s:2:"^";s:3:"）";s:2:"_";s:3:"︵";s:2:"`";s:3:"︶";s:2:"a";s:3:"｛";s:2:"b";s:3:"｝";s:2:"c";s:3:"︷";s:2:"d";s:3:"︸";s:2:"e";s:3:"〔";s:2:"f";s:3:"〕";s:2:"g";s:3:"︹";s:2:"h";s:3:"︺";s:2:"i";s:3:"【";s:2:"j";s:3:"】";s:2:"k";s:3:"︻";s:2:"l";s:3:"︼";s:2:"m";s:3:"《";s:2:"n";s:3:"》";s:2:"o";s:3:"︽";s:2:"p";s:3:"︾";s:2:"q";s:3:"〈";s:2:"r";s:3:"〉";s:2:"s";s:3:"︿";s:2:"t";s:3:"﹀";s:2:"u";s:3:"「";s:2:"v";s:3:"」";s:2:"w";s:3:"﹁";s:2:"x";s:3:"﹂";s:2:"y";s:3:"『";s:2:"z";s:3:"』";s:2:"{";s:3:"﹃";s:2:"|";s:3:"﹄";s:2:"}";s:3:"﹙";s:2:"~";s:3:"﹚";s:2:"";s:3:"﹛";s:2:"";s:3:"﹜";s:2:"";s:3:"﹝";s:2:"";s:3:"﹞";s:2:"";s:3:"‘";s:2:"";s:3:"’";s:2:"";s:3:"“";s:2:"";s:3:"”";s:2:"";s:3:"〝";s:2:"";s:3:"〞";s:2:"";s:3:"‵";s:2:"";s:3:"′";s:2:"";s:3:"＃";s:2:"";s:3:"＆";s:2:"";s:3:"＊";s:2:"";s:3:"※";s:2:"";s:2:"§";s:2:"";s:3:"〃";s:2:"";s:3:"○";s:2:"";s:3:"●";s:2:"";s:3:"△";s:2:"";s:3:"▲";s:2:"";s:3:"◎";s:2:"";s:3:"☆";s:2:"";s:3:"★";s:2:"";s:3:"◇";s:2:"";s:3:"◆";s:2:"";s:3:"□";s:2:"";s:3:"■";s:2:"";s:3:"▽";s:2:"";s:3:"▼";s:2:"";s:3:"㊣";s:2:"";s:3:"℅";s:2:"";s:3:"‾";s:2:"";s:3:"�";s:2:"";s:3:"＿";s:2:"";s:3:"�";s:2:"";s:3:"﹉";s:2:"";s:3:"﹊";s:2:"";s:3:"﹍";s:2:"";s:3:"﹎";s:2:"";s:3:"﹋";s:2:"";s:3:"﹌";s:2:"";s:3:"﹟";s:2:"";s:3:"﹠";s:2:"";s:3:"﹡";s:2:"";s:3:"＋";s:2:"";s:3:"－";s:2:"";s:2:"×";s:2:"";s:2:"÷";s:2:"";s:2:"±";s:2:"";s:3:"√";s:2:"";s:3:"＜";s:2:"";s:3:"＞";s:2:"";s:3:"＝";s:2:"";s:3:"≦";s:2:"";s:3:"≧";s:2:"";s:3:"≠";s:2:"";s:3:"∞";s:2:"";s:3:"≒";s:2:"";s:3:"≡";s:2:"";s:3:"﹢";s:2:"";s:3:"﹣";s:2:"";s:3:"﹤";s:2:"";s:3:"﹥";s:2:"";s:3:"﹦";s:2:"";s:3:"∼";s:2:"";s:3:"∩";s:2:"";s:3:"∪";s:2:"";s:3:"⊥";s:2:"";s:3:"∠";s:2:"";s:3:"∟";s:2:"";s:3:"⊿";s:2:"";s:3:"㏒";s:2:"";s:3:"㏑";s:2:"";s:3:"∫";s:2:"";s:3:"∮";s:2:"";s:3:"∵";s:2:"";s:3:"∴";s:2:"";s:3:"♀";s:2:"";s:3:"♂";s:2:"";s:3:"♁";s:2:"";s:3:"☉";s:2:"";s:3:"↑";s:2:"";s:3:"↓";s:2:"";s:3:"←";s:2:"";s:3:"→";s:2:"";s:3:"↖";s:2:"";s:3:"↗";s:2:"";s:3:"↙";s:2:"";s:3:"↘";s:2:"";s:3:"∥";s:2:"";s:3:"∣";s:2:"";s:3:"�";s:2:"@";s:3:"�";s:2:"A";s:3:"／";s:2:"B";s:3:"＼";s:2:"C";s:3:"＄";s:2:"D";s:2:"¥";s:2:"E";s:3:"〒";s:2:"F";s:2:"¢";s:2:"G";s:2:"£";s:2:"H";s:3:"％";s:2:"I";s:3:"＠";s:2:"J";s:3:"℃";s:2:"K";s:3:"℉";s:2:"L";s:3:"﹩";s:2:"M";s:3:"﹪";s:2:"N";s:3:"﹫";s:2:"O";s:3:"㏕";s:2:"P";s:3:"㎜";s:2:"Q";s:3:"㎝";s:2:"R";s:3:"㎞";s:2:"S";s:3:"㏎";s:2:"T";s:3:"㎡";s:2:"U";s:3:"㎎";s:2:"V";s:3:"㎏";s:2:"W";s:3:"㏄";s:2:"X";s:2:"°";s:2:"Y";s:3:"兙";s:2:"Z";s:3:"兛";s:2:"[";s:3:"兞";s:2:"\";s:3:"兝";s:2:"]";s:3:"兡";s:2:"^";s:3:"兣";s:2:"_";s:3:"嗧";s:2:"`";s:3:"瓩";s:2:"a";s:3:"糎";s:2:"b";s:3:"▁";s:2:"c";s:3:"▂";s:2:"d";s:3:"▃";s:2:"e";s:3:"▄";s:2:"f";s:3:"▅";s:2:"g";s:3:"▆";s:2:"h";s:3:"▇";s:2:"i";s:3:"█";s:2:"j";s:3:"▏";s:2:"k";s:3:"▎";s:2:"l";s:3:"▍";s:2:"m";s:3:"▌";s:2:"n";s:3:"▋";s:2:"o";s:3:"▊";s:2:"p";s:3:"▉";s:2:"q";s:3:"┼";s:2:"r";s:3:"┴";s:2:"s";s:3:"┬";s:2:"t";s:3:"┤";s:2:"u";s:3:"├";s:2:"v";s:3:"▔";s:2:"w";s:3:"─";s:2:"x";s:3:"│";s:2:"y";s:3:"▕";s:2:"z";s:3:"┌";s:2:"{";s:3:"┐";s:2:"|";s:3:"└";s:2:"}";s:3:"┘";s:2:"~";s:3:"╭";s:2:"";s:3:"╮";s:2:"";s:3:"╰";s:2:"";s:3:"╯";s:2:"";s:3:"═";s:2:"";s:3:"╞";s:2:"";s:3:"╪";s:2:"";s:3:"╡";s:2:"";s:3:"◢";s:2:"";s:3:"◣";s:2:"";s:3:"◥";s:2:"";s:3:"◤";s:2:"";s:3:"╱";s:2:"";s:3:"╲";s:2:"";s:3:"╳";s:2:"";s:3:"０";s:2:"";s:3:"１";s:2:"";s:3:"２";s:2:"";s:3:"３";s:2:"";s:3:"４";s:2:"";s:3:"５";s:2:"";s:3:"６";s:2:"";s:3:"７";s:2:"";s:3:"８";s:2:"";s:3:"９";s:2:"";s:3:"Ⅰ";s:2:"";s:3:"Ⅱ";s:2:"";s:3:"Ⅲ";s:2:"";s:3:"Ⅳ";s:2:"";s:3:"Ⅴ";s:2:"";s:3:"Ⅵ";s:2:"";s:3:"Ⅶ";s:2:"";s:3:"Ⅷ";s:2:"";s:3:"Ⅸ";s:2:"";s:3:"Ⅹ";s:2:"";s:3:"〡";s:2:"";s:3:"〢";s:2:"";s:3:"〣";s:2:"";s:3:"〤";s:2:"";s:3:"〥";s:2:"";s:3:"〦";s:2:"";s:3:"〧";s:2:"";s:3:"〨";s:2:"";s:3:"〩";s:2:"";s:3:"�";s:2:"";s:3:"卄";s:2:"";s:3:"�";s:2:"";s:3:"Ａ";s:2:"";s:3:"Ｂ";s:2:"";s:3:"Ｃ";s:2:"";s:3:"Ｄ";s:2:"";s:3:"Ｅ";s:2:"";s:3:"Ｆ";s:2:"";s:3:"Ｇ";s:2:"";s:3:"Ｈ";s:2:"";s:3:"Ｉ";s:2:"";s:3:"Ｊ";s:2:"";s:3:"Ｋ";s:2:"";s:3:"Ｌ";s:2:"";s:3:"Ｍ";s:2:"";s:3:"Ｎ";s:2:"";s:3:"Ｏ";s:2:"";s:3:"Ｐ";s:2:"";s:3:"Ｑ";s:2:"";s:3:"Ｒ";s:2:"";s:3:"Ｓ";s:2:"";s:3:"Ｔ";s:2:"";s:3:"Ｕ";s:2:"";s:3:"Ｖ";s:2:"";s:3:"Ｗ";s:2:"";s:3:"Ｘ";s:2:"";s:3:"Ｙ";s:2:"";s:3:"Ｚ";s:2:"";s:3:"ａ";s:2:"";s:3:"ｂ";s:2:"";s:3:"ｃ";s:2:"";s:3:"ｄ";s:2:"";s:3:"ｅ";s:2:"";s:3:"ｆ";s:2:"";s:3:"ｇ";s:2:"";s:3:"ｈ";s:2:"";s:3:"ｉ";s:2:"";s:3:"ｊ";s:2:"";s:3:"ｋ";s:2:"";s:3:"ｌ";s:2:"";s:3:"ｍ";s:2:"";s:3:"ｎ";s:2:"";s:3:"ｏ";s:2:"";s:3:"ｐ";s:2:"";s:3:"ｑ";s:2:"";s:3:"ｒ";s:2:"";s:3:"ｓ";s:2:"";s:3:"ｔ";s:2:"";s:3:"ｕ";s:2:"";s:3:"ｖ";s:2:"@";s:3:"ｗ";s:2:"A";s:3:"ｘ";s:2:"B";s:3:"ｙ";s:2:"C";s:3:"ｚ";s:2:"D";s:2:"Α";s:2:"E";s:2:"Β";s:2:"F";s:2:"Γ";s:2:"G";s:2:"Δ";s:2:"H";s:2:"Ε";s:2:"I";s:2:"Ζ";s:2:"J";s:2:"Η";s:2:"K";s:2:"Θ";s:2:"L";s:2:"Ι";s:2:"M";s:2:"Κ";s:2:"N";s:2:"Λ";s:2:"O";s:2:"Μ";s:2:"P";s:2:"Ν";s:2:"Q";s:2:"Ξ";s:2:"R";s:2:"Ο";s:2:"S";s:2:"Π";s:2:"T";s:2:"Ρ";s:2:"U";s:2:"Σ";s:2:"V";s:2:"Τ";s:2:"W";s:2:"Υ";s:2:"X";s:2:"Φ";s:2:"Y";s:2:"Χ";s:2:"Z";s:2:"Ψ";s:2:"[";s:2:"Ω";s:2:"\";s:2:"α";s:2:"]";s:2:"β";s:2:"^";s:2:"γ";s:2:"_";s:2:"δ";s:2:"`";s:2:"ε";s:2:"a";s:2:"ζ";s:2:"b";s:2:"η";s:2:"c";s:2:"θ";s:2:"d";s:2:"ι";s:2:"e";s:2:"κ";s:2:"f";s:2:"λ";s:2:"g";s:2:"μ";s:2:"h";s:2:"ν";s:2:"i";s:2:"ξ";s:2:"j";s:2:"ο";s:2:"k";s:2:"π";s:2:"l";s:2:"ρ";s:2:"m";s:2:"σ";s:2:"n";s:2:"τ";s:2:"o";s:2:"υ";s:2:"p";s:2:"φ";s:2:"q";s:2:"χ";s:2:"r";s:2:"ψ";s:2:"s";s:2:"ω";s:2:"t";s:3:"ㄅ";s:2:"u";s:3:"ㄆ";s:2:"v";s:3:"ㄇ";s:2:"w";s:3:"ㄈ";s:2:"x";s:3:"ㄉ";s:2:"y";s:3:"ㄊ";s:2:"z";s:3:"ㄋ";s:2:"{";s:3:"ㄌ";s:2:"|";s:3:"ㄍ";s:2:"}";s:3:"ㄎ";s:2:"~";s:3:"ㄏ";s:2:"";s:3:"ㄐ";s:2:"";s:3:"ㄑ";s:2:"";s:3:"ㄒ";s:2:"";s:3:"ㄓ";s:2:"";s:3:"ㄔ";s:2:"";s:3:"ㄕ";s:2:"";s:3:"ㄖ";s:2:"";s:3:"ㄗ";s:2:"";s:3:"ㄘ";s:2:"";s:3:"ㄙ";s:2:"";s:3:"ㄚ";s:2:"";s:3:"ㄛ";s:2:"";s:3:"ㄜ";s:2:"";s:3:"ㄝ";s:2:"";s:3:"ㄞ";s:2:"";s:3:"ㄟ";s:2:"";s:3:"ㄠ";s:2:"";s:3:"ㄡ";s:2:"";s:3:"ㄢ";s:2:"";s:3:"ㄣ";s:2:"";s:3:"ㄤ";s:2:"";s:3:"ㄥ";s:2:"";s:3:"ㄦ";s:2:"";s:3:"ㄧ";s:2:"";s:3:"ㄨ";s:2:"";s:3:"ㄩ";s:2:"";s:2:"˙";s:2:"";s:2:"ˉ";s:2:"";s:2:"ˊ";s:2:"";s:2:"ˇ";s:2:"";s:2:"ˋ";s:2:"@";s:3:"一";s:2:"A";s:3:"乙";s:2:"B";s:3:"丁";s:2:"C";s:3:"七";s:2:"D";s:3:"乃";s:2:"E";s:3:"九";s:2:"F";s:3:"了";s:2:"G";s:3:"二";s:2:"H";s:3:"人";s:2:"I";s:3:"儿";s:2:"J";s:3:"入";s:2:"K";s:3:"八";s:2:"L";s:3:"几";s:2:"M";s:3:"刀";s:2:"N";s:3:"刁";s:2:"O";s:3:"力";s:2:"P";s:3:"匕";s:2:"Q";s:3:"十";s:2:"R";s:3:"卜";s:2:"S";s:3:"又";s:2:"T";s:3:"三";s:2:"U";s:3:"下";s:2:"V";s:3:"丈";s:2:"W";s:3:"上";s:2:"X";s:3:"丫";s:2:"Y";s:3:"丸";s:2:"Z";s:3:"凡";s:2:"[";s:3:"久";s:2:"\";s:3:"么";s:2:"]";s:3:"也";s:2:"^";s:3:"乞";s:2:"_";s:3:"于";s:2:"`";s:3:"亡";s:2:"a";s:3:"兀";s:2:"b";s:3:"刃";s:2:"c";s:3:"勺";s:2:"d";s:3:"千";s:2:"e";s:3:"叉";s:2:"f";s:3:"口";s:2:"g";s:3:"土";s:2:"h";s:3:"士";s:2:"i";s:3:"夕";s:2:"j";s:3:"大";s:2:"k";s:3:"女";s:2:"l";s:3:"子";s:2:"m";s:3:"孑";s:2:"n";s:3:"孓";s:2:"o";s:3:"寸";s:2:"p";s:3:"小";s:2:"q";s:3:"尢";s:2:"r";s:3:"尸";s:2:"s";s:3:"山";s:2:"t";s:3:"川";s:2:"u";s:3:"工";s:2:"v";s:3:"己";s:2:"w";s:3:"已";s:2:"x";s:3:"巳";s:2:"y";s:3:"巾";s:2:"z";s:3:"干";s:2:"{";s:3:"廾";s:2:"|";s:3:"弋";s:2:"}";s:3:"弓";s:2:"~";s:3:"才";s:2:"";s:3:"丑";s:2:"";s:3:"丐";s:2:"";s:3:"不";s:2:"";s:3:"中";s:2:"";s:3:"丰";s:2:"";s:3:"丹";s:2:"";s:3:"之";s:2:"";s:3:"尹";s:2:"";s:3:"予";s:2:"";s:3:"云";s:2:"";s:3:"井";s:2:"";s:3:"互";s:2:"";s:3:"五";s:2:"";s:3:"亢";s:2:"";s:3:"仁";s:2:"";s:3:"什";s:2:"";s:3:"仃";s:2:"";s:3:"仆";s:2:"";s:3:"仇";s:2:"";s:3:"仍";s:2:"";s:3:"今";s:2:"";s:3:"介";s:2:"";s:3:"仄";s:2:"";s:3:"元";s:2:"";s:3:"允";s:2:"";s:3:"內";s:2:"";s:3:"六";s:2:"";s:3:"兮";s:2:"";s:3:"公";s:2:"";s:3:"冗";s:2:"";s:3:"凶";s:2:"";s:3:"分";s:2:"";s:3:"切";s:2:"";s:3:"刈";s:2:"";s:3:"勻";s:2:"";s:3:"勾";s:2:"";s:3:"勿";s:2:"";s:3:"化";s:2:"";s:3:"匹";s:2:"";s:3:"午";s:2:"";s:3:"升";s:2:"";s:3:"卅";s:2:"";s:3:"卞";s:2:"";s:3:"厄";s:2:"";s:3:"友";s:2:"";s:3:"及";s:2:"";s:3:"反";s:2:"";s:3:"壬";s:2:"";s:3:"天";s:2:"";s:3:"夫";s:2:"";s:3:"太";s:2:"";s:3:"夭";s:2:"";s:3:"孔";s:2:"";s:3:"少";s:2:"";s:3:"尤";s:2:"";s:3:"尺";s:2:"";s:3:"屯";s:2:"";s:3:"巴";s:2:"";s:3:"幻";s:2:"";s:3:"廿";s:2:"";s:3:"弔";s:2:"";s:3:"引";s:2:"";s:3:"心";s:2:"";s:3:"戈";s:2:"";s:3:"戶";s:2:"";s:3:"手";s:2:"";s:3:"扎";s:2:"";s:3:"支";s:2:"";s:3:"文";s:2:"";s:3:"斗";s:2:"";s:3:"斤";s:2:"";s:3:"方";s:2:"";s:3:"日";s:2:"";s:3:"曰";s:2:"";s:3:"月";s:2:"";s:3:"木";s:2:"";s:3:"欠";s:2:"";s:3:"止";s:2:"";s:3:"歹";s:2:"";s:3:"毋";s:2:"";s:3:"比";s:2:"";s:3:"毛";s:2:"";s:3:"氏";s:2:"";s:3:"水";s:2:"";s:3:"火";s:2:"";s:3:"爪";s:2:"";s:3:"父";s:2:"";s:3:"爻";s:2:"";s:3:"片";s:2:"";s:3:"牙";s:2:"";s:3:"牛";s:2:"";s:3:"犬";s:2:"";s:3:"王";s:2:"";s:3:"丙";s:2:"@";s:3:"世";s:2:"A";s:3:"丕";s:2:"B";s:3:"且";s:2:"C";s:3:"丘";s:2:"D";s:3:"主";s:2:"E";s:3:"乍";s:2:"F";s:3:"乏";s:2:"G";s:3:"乎";s:2:"H";s:3:"以";s:2:"I";s:3:"付";s:2:"J";s:3:"仔";s:2:"K";s:3:"仕";s:2:"L";s:3:"他";s:2:"M";s:3:"仗";s:2:"N";s:3:"代";s:2:"O";s:3:"令";s:2:"P";s:3:"仙";s:2:"Q";s:3:"仞";s:2:"R";s:3:"充";s:2:"S";s:3:"兄";s:2:"T";s:3:"冉";s:2:"U";s:3:"冊";s:2:"V";s:3:"冬";s:2:"W";s:3:"凹";s:2:"X";s:3:"出";s:2:"Y";s:3:"凸";s:2:"Z";s:3:"刊";s:2:"[";s:3:"加";s:2:"\";s:3:"功";s:2:"]";s:3:"包";s:2:"^";s:3:"匆";s:2:"_";s:3:"北";s:2:"`";s:3:"匝";s:2:"a";s:3:"仟";s:2:"b";s:3:"半";s:2:"c";s:3:"卉";s:2:"d";s:3:"卡";s:2:"e";s:3:"占";s:2:"f";s:3:"卯";s:2:"g";s:3:"卮";s:2:"h";s:3:"去";s:2:"i";s:3:"可";s:2:"j";s:3:"古";s:2:"k";s:3:"右";s:2:"l";s:3:"召";s:2:"m";s:3:"叮";s:2:"n";s:3:"叩";s:2:"o";s:3:"叨";s:2:"p";s:3:"叼";s:2:"q";s:3:"司";s:2:"r";s:3:"叵";s:2:"s";s:3:"叫";s:2:"t";s:3:"另";s:2:"u";s:3:"只";s:2:"v";s:3:"史";s:2:"w";s:3:"叱";s:2:"x";s:3:"台";s:2:"y";s:3:"句";s:2:"z";s:3:"叭";s:2:"{";s:3:"叻";s:2:"|";s:3:"四";s:2:"}";s:3:"囚";s:2:"~";s:3:"外";s:2:"";s:3:"央";s:2:"";s:3:"失";s:2:"";s:3:"奴";s:2:"";s:3:"奶";s:2:"";s:3:"孕";s:2:"";s:3:"它";s:2:"";s:3:"尼";s:2:"";s:3:"巨";s:2:"";s:3:"巧";s:2:"";s:3:"左";s:2:"";s:3:"市";s:2:"";s:3:"布";s:2:"";s:3:"平";s:2:"";s:3:"幼";s:2:"";s:3:"弁";s:2:"";s:3:"弘";s:2:"";s:3:"弗";s:2:"";s:3:"必";s:2:"";s:3:"戊";s:2:"";s:3:"打";s:2:"";s:3:"扔";s:2:"";s:3:"扒";s:2:"";s:3:"扑";s:2:"";s:3:"斥";s:2:"";s:3:"旦";s:2:"";s:3:"朮";s:2:"";s:3:"本";s:2:"";s:3:"未";s:2:"";s:3:"末";s:2:"";s:3:"札";s:2:"";s:3:"正";s:2:"";s:3:"母";s:2:"";s:3:"民";s:2:"";s:3:"氐";s:2:"";s:3:"永";s:2:"";s:3:"汁";s:2:"";s:3:"汀";s:2:"";s:3:"氾";s:2:"";s:3:"犯";s:2:"";s:3:"玄";s:2:"";s:3:"玉";s:2:"";s:3:"瓜";s:2:"";s:3:"瓦";s:2:"";s:3:"甘";s:2:"";s:3:"生";s:2:"";s:3:"用";s:2:"";s:3:"甩";s:2:"";s:3:"田";s:2:"";s:3:"由";s:2:"";s:3:"甲";s:2:"";s:3:"申";s:2:"";s:3:"疋";s:2:"";s:3:"白";s:2:"";s:3:"皮";s:2:"";s:3:"皿";s:2:"";s:3:"目";s:2:"";s:3:"矛";s:2:"";s:3:"矢";s:2:"";s:3:"石";s:2:"";s:3:"示";s:2:"";s:3:"禾";s:2:"";s:3:"穴";s:2:"";s:3:"立";s:2:"";s:3:"丞";s:2:"";s:3:"丟";s:2:"";s:3:"乒";s:2:"";s:3:"乓";s:2:"";s:3:"乩";s:2:"";s:3:"亙";s:2:"";s:3:"交";s:2:"";s:3:"亦";s:2:"";s:3:"亥";s:2:"";s:3:"仿";s:2:"";s:3:"伉";s:2:"";s:3:"伙";s:2:"";s:3:"伊";s:2:"";s:3:"伕";s:2:"";s:3:"伍";s:2:"";s:3:"伐";s:2:"";s:3:"休";s:2:"";s:3:"伏";s:2:"";s:3:"仲";s:2:"";s:3:"件";s:2:"";s:3:"任";s:2:"";s:3:"仰";s:2:"";s:3:"仳";s:2:"";s:3:"份";s:2:"";s:3:"企";s:2:"";s:3:"伋";s:2:"";s:3:"光";s:2:"";s:3:"兇";s:2:"";s:3:"兆";s:2:"";s:3:"先";s:2:"";s:3:"全";s:2:"@";s:3:"共";s:2:"A";s:3:"再";s:2:"B";s:3:"冰";s:2:"C";s:3:"列";s:2:"D";s:3:"刑";s:2:"E";s:3:"划";s:2:"F";s:3:"刎";s:2:"G";s:3:"刖";s:2:"H";s:3:"劣";s:2:"I";s:3:"匈";s:2:"J";s:3:"匡";s:2:"K";s:3:"匠";s:2:"L";s:3:"印";s:2:"M";s:3:"危";s:2:"N";s:3:"吉";s:2:"O";s:3:"吏";s:2:"P";s:3:"同";s:2:"Q";s:3:"吊";s:2:"R";s:3:"吐";s:2:"S";s:3:"吁";s:2:"T";s:3:"吋";s:2:"U";s:3:"各";s:2:"V";s:3:"向";s:2:"W";s:3:"名";s:2:"X";s:3:"合";s:2:"Y";s:3:"吃";s:2:"Z";s:3:"后";s:2:"[";s:3:"吆";s:2:"\";s:3:"吒";s:2:"]";s:3:"因";s:2:"^";s:3:"回";s:2:"_";s:3:"囝";s:2:"`";s:3:"圳";s:2:"a";s:3:"地";s:2:"b";s:3:"在";s:2:"c";s:3:"圭";s:2:"d";s:3:"圬";s:2:"e";s:3:"圯";s:2:"f";s:3:"圩";s:2:"g";s:3:"夙";s:2:"h";s:3:"多";s:2:"i";s:3:"夷";s:2:"j";s:3:"夸";s:2:"k";s:3:"妄";s:2:"l";s:3:"奸";s:2:"m";s:3:"妃";s:2:"n";s:3:"好";s:2:"o";s:3:"她";s:2:"p";s:3:"如";s:2:"q";s:3:"妁";s:2:"r";s:3:"字";s:2:"s";s:3:"存";s:2:"t";s:3:"宇";s:2:"u";s:3:"守";s:2:"v";s:3:"宅";s:2:"w";s:3:"安";s:2:"x";s:3:"寺";s:2:"y";s:3:"尖";s:2:"z";s:3:"屹";s:2:"{";s:3:"州";s:2:"|";s:3:"帆";s:2:"}";s:3:"并";s:2:"~";s:3:"年";s:2:"";s:3:"式";s:2:"";s:3:"弛";s:2:"";s:3:"忙";s:2:"";s:3:"忖";s:2:"";s:3:"戎";s:2:"";s:3:"戌";s:2:"";s:3:"戍";s:2:"";s:3:"成";s:2:"";s:3:"扣";s:2:"";s:3:"扛";s:2:"";s:3:"托";s:2:"";s:3:"收";s:2:"";s:3:"早";s:2:"";s:3:"旨";s:2:"";s:3:"旬";s:2:"";s:3:"旭";s:2:"";s:3:"曲";s:2:"";s:3:"曳";s:2:"";s:3:"有";s:2:"";s:3:"朽";s:2:"";s:3:"朴";s:2:"";s:3:"朱";s:2:"";s:3:"朵";s:2:"";s:3:"次";s:2:"";s:3:"此";s:2:"";s:3:"死";s:2:"";s:3:"氖";s:2:"";s:3:"汝";s:2:"";s:3:"汗";s:2:"";s:3:"汙";s:2:"";s:3:"江";s:2:"";s:3:"池";s:2:"";s:3:"汐";s:2:"";s:3:"汕";s:2:"";s:3:"污";s:2:"";s:3:"汛";s:2:"";s:3:"汍";s:2:"";s:3:"汎";s:2:"";s:3:"灰";s:2:"";s:3:"牟";s:2:"";s:3:"牝";s:2:"";s:3:"百";s:2:"";s:3:"竹";s:2:"";s:3:"米";s:2:"";s:3:"糸";s:2:"";s:3:"缶";s:2:"";s:3:"羊";s:2:"";s:3:"羽";s:2:"";s:3:"老";s:2:"";s:3:"考";s:2:"";s:3:"而";s:2:"";s:3:"耒";s:2:"";s:3:"耳";s:2:"";s:3:"聿";s:2:"";s:3:"肉";s:2:"";s:3:"肋";s:2:"";s:3:"肌";s:2:"";s:3:"臣";s:2:"";s:3:"自";s:2:"";s:3:"至";s:2:"";s:3:"臼";s:2:"";s:3:"舌";s:2:"";s:3:"舛";s:2:"";s:3:"舟";s:2:"";s:3:"艮";s:2:"";s:3:"色";s:2:"";s:3:"艾";s:2:"";s:3:"虫";s:2:"";s:3:"血";s:2:"";s:3:"行";s:2:"";s:3:"衣";s:2:"";s:3:"西";s:2:"";s:3:"阡";s:2:"";s:3:"串";s:2:"";s:3:"亨";s:2:"";s:3:"位";s:2:"";s:3:"住";s:2:"";s:3:"佇";s:2:"";s:3:"佗";s:2:"";s:3:"佞";s:2:"";s:3:"伴";s:2:"";s:3:"佛";s:2:"";s:3:"何";s:2:"";s:3:"估";s:2:"";s:3:"佐";s:2:"";s:3:"佑";s:2:"";s:3:"伽";s:2:"";s:3:"伺";s:2:"";s:3:"伸";s:2:"";s:3:"佃";s:2:"";s:3:"佔";s:2:"";s:3:"似";s:2:"";s:3:"但";s:2:"";s:3:"佣";s:2:"@";s:3:"作";s:2:"A";s:3:"你";s:2:"B";s:3:"伯";s:2:"C";s:3:"低";s:2:"D";s:3:"伶";s:2:"E";s:3:"余";s:2:"F";s:3:"佝";s:2:"G";s:3:"佈";s:2:"H";s:3:"佚";s:2:"I";s:3:"兌";s:2:"J";s:3:"克";s:2:"K";s:3:"免";s:2:"L";s:3:"兵";s:2:"M";s:3:"冶";s:2:"N";s:3:"冷";s:2:"O";s:3:"別";s:2:"P";s:3:"判";s:2:"Q";s:3:"利";s:2:"R";s:3:"刪";s:2:"S";s:3:"刨";s:2:"T";s:3:"劫";s:2:"U";s:3:"助";s:2:"V";s:3:"努";s:2:"W";s:3:"劬";s:2:"X";s:3:"匣";s:2:"Y";s:3:"即";s:2:"Z";s:3:"卵";s:2:"[";s:3:"吝";s:2:"\";s:3:"吭";s:2:"]";s:3:"吞";s:2:"^";s:3:"吾";s:2:"_";s:3:"否";s:2:"`";s:3:"呎";s:2:"a";s:3:"吧";s:2:"b";s:3:"呆";s:2:"c";s:3:"呃";s:2:"d";s:3:"吳";s:2:"e";s:3:"呈";s:2:"f";s:3:"呂";s:2:"g";s:3:"君";s:2:"h";s:3:"吩";s:2:"i";s:3:"告";s:2:"j";s:3:"吹";s:2:"k";s:3:"吻";s:2:"l";s:3:"吸";s:2:"m";s:3:"吮";s:2:"n";s:3:"吵";s:2:"o";s:3:"吶";s:2:"p";s:3:"吠";s:2:"q";s:3:"吼";s:2:"r";s:3:"呀";s:2:"s";s:3:"吱";s:2:"t";s:3:"含";s:2:"u";s:3:"吟";s:2:"v";s:3:"听";s:2:"w";s:3:"囪";s:2:"x";s:3:"困";s:2:"y";s:3:"囤";s:2:"z";s:3:"囫";s:2:"{";s:3:"坊";s:2:"|";s:3:"坑";s:2:"}";s:3:"址";s:2:"~";s:3:"坍";s:2:"";s:3:"均";s:2:"";s:3:"坎";s:2:"";s:3:"圾";s:2:"";s:3:"坐";s:2:"";s:3:"坏";s:2:"";s:3:"圻";s:2:"";s:3:"壯";s:2:"";s:3:"夾";s:2:"";s:3:"妝";s:2:"";s:3:"妒";s:2:"";s:3:"妨";s:2:"";s:3:"妞";s:2:"";s:3:"妣";s:2:"";s:3:"妙";s:2:"";s:3:"妖";s:2:"";s:3:"妍";s:2:"";s:3:"妤";s:2:"";s:3:"妓";s:2:"";s:3:"妊";s:2:"";s:3:"妥";s:2:"";s:3:"孝";s:2:"";s:3:"孜";s:2:"";s:3:"孚";s:2:"";s:3:"孛";s:2:"";s:3:"完";s:2:"";s:3:"宋";s:2:"";s:3:"宏";s:2:"";s:3:"尬";s:2:"";s:3:"局";s:2:"";s:3:"屁";s:2:"";s:3:"尿";s:2:"";s:3:"尾";s:2:"";s:3:"岐";s:2:"";s:3:"岑";s:2:"";s:3:"岔";s:2:"";s:3:"岌";s:2:"";s:3:"巫";s:2:"";s:3:"希";s:2:"";s:3:"序";s:2:"";s:3:"庇";s:2:"";s:3:"床";s:2:"";s:3:"廷";s:2:"";s:3:"弄";s:2:"";s:3:"弟";s:2:"";s:3:"彤";s:2:"";s:3:"形";s:2:"";s:3:"彷";s:2:"";s:3:"役";s:2:"";s:3:"忘";s:2:"";s:3:"忌";s:2:"";s:3:"志";s:2:"";s:3:"忍";s:2:"";s:3:"忱";s:2:"";s:3:"快";s:2:"";s:3:"忸";s:2:"";s:3:"忪";s:2:"";s:3:"戒";s:2:"";s:3:"我";s:2:"";s:3:"抄";s:2:"";s:3:"抗";s:2:"";s:3:"抖";s:2:"";s:3:"技";s:2:"";s:3:"扶";s:2:"";s:3:"抉";s:2:"";s:3:"扭";s:2:"";s:3:"把";s:2:"";s:3:"扼";s:2:"";s:3:"找";s:2:"";s:3:"批";s:2:"";s:3:"扳";s:2:"";s:3:"抒";s:2:"";s:3:"扯";s:2:"";s:3:"折";s:2:"";s:3:"扮";s:2:"";s:3:"投";s:2:"";s:3:"抓";s:2:"";s:3:"抑";s:2:"";s:3:"抆";s:2:"";s:3:"改";s:2:"";s:3:"攻";s:2:"";s:3:"攸";s:2:"";s:3:"旱";s:2:"";s:3:"更";s:2:"";s:3:"束";s:2:"";s:3:"李";s:2:"";s:3:"杏";s:2:"";s:3:"材";s:2:"";s:3:"村";s:2:"";s:3:"杜";s:2:"";s:3:"杖";s:2:"";s:3:"杞";s:2:"";s:3:"杉";s:2:"";s:3:"杆";s:2:"";s:3:"杠";s:2:"@";s:3:"杓";s:2:"A";s:3:"杗";s:2:"B";s:3:"步";s:2:"C";s:3:"每";s:2:"D";s:3:"求";s:2:"E";s:3:"汞";s:2:"F";s:3:"沙";s:2:"G";s:3:"沁";s:2:"H";s:3:"沈";s:2:"I";s:3:"沉";s:2:"J";s:3:"沅";s:2:"K";s:3:"沛";s:2:"L";s:3:"汪";s:2:"M";s:3:"決";s:2:"N";s:3:"沐";s:2:"O";s:3:"汰";s:2:"P";s:3:"沌";s:2:"Q";s:3:"汨";s:2:"R";s:3:"沖";s:2:"S";s:3:"沒";s:2:"T";s:3:"汽";s:2:"U";s:3:"沃";s:2:"V";s:3:"汲";s:2:"W";s:3:"汾";s:2:"X";s:3:"汴";s:2:"Y";s:3:"沆";s:2:"Z";s:3:"汶";s:2:"[";s:3:"沍";s:2:"\";s:3:"沔";s:2:"]";s:3:"沘";s:2:"^";s:3:"沂";s:2:"_";s:3:"灶";s:2:"`";s:3:"灼";s:2:"a";s:3:"災";s:2:"b";s:3:"灸";s:2:"c";s:3:"牢";s:2:"d";s:3:"牡";s:2:"e";s:3:"牠";s:2:"f";s:3:"狄";s:2:"g";s:3:"狂";s:2:"h";s:3:"玖";s:2:"i";s:3:"甬";s:2:"j";s:3:"甫";s:2:"k";s:3:"男";s:2:"l";s:3:"甸";s:2:"m";s:3:"皂";s:2:"n";s:3:"盯";s:2:"o";s:3:"矣";s:2:"p";s:3:"私";s:2:"q";s:3:"秀";s:2:"r";s:3:"禿";s:2:"s";s:3:"究";s:2:"t";s:3:"系";s:2:"u";s:3:"罕";s:2:"v";s:3:"肖";s:2:"w";s:3:"肓";s:2:"x";s:3:"肝";s:2:"y";s:3:"肘";s:2:"z";s:3:"肛";s:2:"{";s:3:"肚";s:2:"|";s:3:"育";s:2:"}";s:3:"良";s:2:"~";s:3:"芒";s:2:"";s:3:"芋";s:2:"";s:3:"芍";s:2:"";s:3:"見";s:2:"";s:3:"角";s:2:"";s:3:"言";s:2:"";s:3:"谷";s:2:"";s:3:"豆";s:2:"";s:3:"豕";s:2:"";s:3:"貝";s:2:"";s:3:"赤";s:2:"";s:3:"走";s:2:"";s:3:"足";s:2:"";s:3:"身";s:2:"";s:3:"車";s:2:"";s:3:"辛";s:2:"";s:3:"辰";s:2:"";s:3:"迂";s:2:"";s:3:"迆";s:2:"";s:3:"迅";s:2:"";s:3:"迄";s:2:"";s:3:"巡";s:2:"";s:3:"邑";s:2:"";s:3:"邢";s:2:"";s:3:"邪";s:2:"";s:3:"邦";s:2:"";s:3:"那";s:2:"";s:3:"酉";s:2:"";s:3:"釆";s:2:"";s:3:"里";s:2:"";s:3:"防";s:2:"";s:3:"阮";s:2:"";s:3:"阱";s:2:"";s:3:"阪";s:2:"";s:3:"阬";s:2:"";s:3:"並";s:2:"";s:3:"乖";s:2:"";s:3:"乳";s:2:"";s:3:"事";s:2:"";s:3:"些";s:2:"";s:3:"亞";s:2:"";s:3:"享";s:2:"";s:3:"京";s:2:"";s:3:"佯";s:2:"";s:3:"依";s:2:"";s:3:"侍";s:2:"";s:3:"佳";s:2:"";s:3:"使";s:2:"";s:3:"佬";s:2:"";s:3:"供";s:2:"";s:3:"例";s:2:"";s:3:"來";s:2:"";s:3:"侃";s:2:"";s:3:"佰";s:2:"";s:3:"併";s:2:"";s:3:"侈";s:2:"";s:3:"佩";s:2:"";s:3:"佻";s:2:"";s:3:"侖";s:2:"";s:3:"佾";s:2:"";s:3:"侏";s:2:"";s:3:"侑";s:2:"";s:3:"佺";s:2:"";s:3:"兔";s:2:"";s:3:"兒";s:2:"";s:3:"兕";s:2:"";s:3:"兩";s:2:"";s:3:"具";s:2:"";s:3:"其";s:2:"";s:3:"典";s:2:"";s:3:"冽";s:2:"";s:3:"函";s:2:"";s:3:"刻";s:2:"";s:3:"券";s:2:"";s:3:"刷";s:2:"";s:3:"刺";s:2:"";s:3:"到";s:2:"";s:3:"刮";s:2:"";s:3:"制";s:2:"";s:3:"剁";s:2:"";s:3:"劾";s:2:"";s:3:"劻";s:2:"";s:3:"卒";s:2:"";s:3:"協";s:2:"";s:3:"卓";s:2:"";s:3:"卑";s:2:"";s:3:"卦";s:2:"";s:3:"卷";s:2:"";s:3:"卸";s:2:"";s:3:"卹";s:2:"";s:3:"取";s:2:"";s:3:"叔";s:2:"";s:3:"受";s:2:"";s:3:"味";s:2:"";s:3:"呵";s:2:"@";s:3:"咖";s:2:"A";s:3:"呸";s:2:"B";s:3:"咕";s:2:"C";s:3:"咀";s:2:"D";s:3:"呻";s:2:"E";s:3:"呷";s:2:"F";s:3:"咄";s:2:"G";s:3:"咒";s:2:"H";s:3:"咆";s:2:"I";s:3:"呼";s:2:"J";s:3:"咐";s:2:"K";s:3:"呱";s:2:"L";s:3:"呶";s:2:"M";s:3:"和";s:2:"N";s:3:"咚";s:2:"O";s:3:"呢";s:2:"P";s:3:"周";s:2:"Q";s:3:"咋";s:2:"R";s:3:"命";s:2:"S";s:3:"咎";s:2:"T";s:3:"固";s:2:"U";s:3:"垃";s:2:"V";s:3:"坷";s:2:"W";s:3:"坪";s:2:"X";s:3:"坩";s:2:"Y";s:3:"坡";s:2:"Z";s:3:"坦";s:2:"[";s:3:"坤";s:2:"\";s:3:"坼";s:2:"]";s:3:"夜";s:2:"^";s:3:"奉";s:2:"_";s:3:"奇";s:2:"`";s:3:"奈";s:2:"a";s:3:"奄";s:2:"b";s:3:"奔";s:2:"c";s:3:"妾";s:2:"d";s:3:"妻";s:2:"e";s:3:"委";s:2:"f";s:3:"妹";s:2:"g";s:3:"妮";s:2:"h";s:3:"姑";s:2:"i";s:3:"姆";s:2:"j";s:3:"姐";s:2:"k";s:3:"姍";s:2:"l";s:3:"始";s:2:"m";s:3:"姓";s:2:"n";s:3:"姊";s:2:"o";s:3:"妯";s:2:"p";s:3:"妳";s:2:"q";s:3:"姒";s:2:"r";s:3:"姅";s:2:"s";s:3:"孟";s:2:"t";s:3:"孤";s:2:"u";s:3:"季";s:2:"v";s:3:"宗";s:2:"w";s:3:"定";s:2:"x";s:3:"官";s:2:"y";s:3:"宜";s:2:"z";s:3:"宙";s:2:"{";s:3:"宛";s:2:"|";s:3:"尚";s:2:"}";s:3:"屈";s:2:"~";s:3:"居";s:2:"";s:3:"屆";s:2:"";s:3:"岷";s:2:"";s:3:"岡";s:2:"";s:3:"岸";s:2:"";s:3:"岩";s:2:"";s:3:"岫";s:2:"";s:3:"岱";s:2:"";s:3:"岳";s:2:"";s:3:"帘";s:2:"";s:3:"帚";s:2:"";s:3:"帖";s:2:"";s:3:"帕";s:2:"";s:3:"帛";s:2:"";s:3:"帑";s:2:"";s:3:"幸";s:2:"";s:3:"庚";s:2:"";s:3:"店";s:2:"";s:3:"府";s:2:"";s:3:"底";s:2:"";s:3:"庖";s:2:"";s:3:"延";s:2:"";s:3:"弦";s:2:"";s:3:"弧";s:2:"";s:3:"弩";s:2:"";s:3:"往";s:2:"";s:3:"征";s:2:"";s:3:"彿";s:2:"";s:3:"彼";s:2:"";s:3:"忝";s:2:"";s:3:"忠";s:2:"";s:3:"忽";s:2:"";s:3:"念";s:2:"";s:3:"忿";s:2:"";s:3:"怏";s:2:"";s:3:"怔";s:2:"";s:3:"怯";s:2:"";s:3:"怵";s:2:"";s:3:"怖";s:2:"";s:3:"怪";s:2:"";s:3:"怕";s:2:"";s:3:"怡";s:2:"";s:3:"性";s:2:"";s:3:"怩";s:2:"";s:3:"怫";s:2:"";s:3:"怛";s:2:"";s:3:"或";s:2:"";s:3:"戕";s:2:"";s:3:"房";s:2:"";s:3:"戾";s:2:"";s:3:"所";s:2:"";s:3:"承";s:2:"";s:3:"拉";s:2:"";s:3:"拌";s:2:"";s:3:"拄";s:2:"";s:3:"抿";s:2:"";s:3:"拂";s:2:"";s:3:"抹";s:2:"";s:3:"拒";s:2:"";s:3:"招";s:2:"";s:3:"披";s:2:"";s:3:"拓";s:2:"";s:3:"拔";s:2:"";s:3:"拋";s:2:"";s:3:"拈";s:2:"";s:3:"抨";s:2:"";s:3:"抽";s:2:"";s:3:"押";s:2:"";s:3:"拐";s:2:"";s:3:"拙";s:2:"";s:3:"拇";s:2:"";s:3:"拍";s:2:"";s:3:"抵";s:2:"";s:3:"拚";s:2:"";s:3:"抱";s:2:"";s:3:"拘";s:2:"";s:3:"拖";s:2:"";s:3:"拗";s:2:"";s:3:"拆";s:2:"";s:3:"抬";s:2:"";s:3:"拎";s:2:"";s:3:"放";s:2:"";s:3:"斧";s:2:"";s:3:"於";s:2:"";s:3:"旺";s:2:"";s:3:"昔";s:2:"";s:3:"易";s:2:"";s:3:"昌";s:2:"";s:3:"昆";s:2:"";s:3:"昂";s:2:"";s:3:"明";s:2:"";s:3:"昀";s:2:"";s:3:"昏";s:2:"";s:3:"昕";s:2:"";s:3:"昊";s:2:"@";s:3:"昇";s:2:"A";s:3:"服";s:2:"B";s:3:"朋";s:2:"C";s:3:"杭";s:2:"D";s:3:"枋";s:2:"E";s:3:"枕";s:2:"F";s:3:"東";s:2:"G";s:3:"果";s:2:"H";s:3:"杳";s:2:"I";s:3:"杷";s:2:"J";s:3:"枇";s:2:"K";s:3:"枝";s:2:"L";s:3:"林";s:2:"M";s:3:"杯";s:2:"N";s:3:"杰";s:2:"O";s:3:"板";s:2:"P";s:3:"枉";s:2:"Q";s:3:"松";s:2:"R";s:3:"析";s:2:"S";s:3:"杵";s:2:"T";s:3:"枚";s:2:"U";s:3:"枓";s:2:"V";s:3:"杼";s:2:"W";s:3:"杪";s:2:"X";s:3:"杲";s:2:"Y";s:3:"欣";s:2:"Z";s:3:"武";s:2:"[";s:3:"歧";s:2:"\";s:3:"歿";s:2:"]";s:3:"氓";s:2:"^";s:3:"氛";s:2:"_";s:3:"泣";s:2:"`";s:3:"注";s:2:"a";s:3:"泳";s:2:"b";s:3:"沱";s:2:"c";s:3:"泌";s:2:"d";s:3:"泥";s:2:"e";s:3:"河";s:2:"f";s:3:"沽";s:2:"g";s:3:"沾";s:2:"h";s:3:"沼";s:2:"i";s:3:"波";s:2:"j";s:3:"沫";s:2:"k";s:3:"法";s:2:"l";s:3:"泓";s:2:"m";s:3:"沸";s:2:"n";s:3:"泄";s:2:"o";s:3:"油";s:2:"p";s:3:"況";s:2:"q";s:3:"沮";s:2:"r";s:3:"泗";s:2:"s";s:3:"泅";s:2:"t";s:3:"泱";s:2:"u";s:3:"沿";s:2:"v";s:3:"治";s:2:"w";s:3:"泡";s:2:"x";s:3:"泛";s:2:"y";s:3:"泊";s:2:"z";s:3:"沬";s:2:"{";s:3:"泯";s:2:"|";s:3:"泜";s:2:"}";s:3:"泖";s:2:"~";s:3:"泠";s:2:"";s:3:"炕";s:2:"";s:3:"炎";s:2:"";s:3:"炒";s:2:"";s:3:"炊";s:2:"";s:3:"炙";s:2:"";s:3:"爬";s:2:"";s:3:"爭";s:2:"";s:3:"爸";s:2:"";s:3:"版";s:2:"";s:3:"牧";s:2:"";s:3:"物";s:2:"";s:3:"狀";s:2:"";s:3:"狎";s:2:"";s:3:"狙";s:2:"";s:3:"狗";s:2:"";s:3:"狐";s:2:"";s:3:"玩";s:2:"";s:3:"玨";s:2:"";s:3:"玟";s:2:"";s:3:"玫";s:2:"";s:3:"玥";s:2:"";s:3:"甽";s:2:"";s:3:"疝";s:2:"";s:3:"疙";s:2:"";s:3:"疚";s:2:"";s:3:"的";s:2:"";s:3:"盂";s:2:"";s:3:"盲";s:2:"";s:3:"直";s:2:"";s:3:"知";s:2:"";s:3:"矽";s:2:"";s:3:"社";s:2:"";s:3:"祀";s:2:"";s:3:"祁";s:2:"";s:3:"秉";s:2:"";s:3:"秈";s:2:"";s:3:"空";s:2:"";s:3:"穹";s:2:"";s:3:"竺";s:2:"";s:3:"糾";s:2:"";s:3:"罔";s:2:"";s:3:"羌";s:2:"";s:3:"羋";s:2:"";s:3:"者";s:2:"";s:3:"肺";s:2:"";s:3:"肥";s:2:"";s:3:"肢";s:2:"";s:3:"肱";s:2:"";s:3:"股";s:2:"";s:3:"肫";s:2:"";s:3:"肩";s:2:"";s:3:"肴";s:2:"";s:3:"肪";s:2:"";s:3:"肯";s:2:"";s:3:"臥";s:2:"";s:3:"臾";s:2:"";s:3:"舍";s:2:"";s:3:"芳";s:2:"";s:3:"芝";s:2:"";s:3:"芙";s:2:"";s:3:"芭";s:2:"";s:3:"芽";s:2:"";s:3:"芟";s:2:"";s:3:"芹";s:2:"";s:3:"花";s:2:"";s:3:"芬";s:2:"";s:3:"芥";s:2:"";s:3:"芯";s:2:"";s:3:"芸";s:2:"";s:3:"芣";s:2:"";s:3:"芰";s:2:"";s:3:"芾";s:2:"";s:3:"芷";s:2:"";s:3:"虎";s:2:"";s:3:"虱";s:2:"";s:3:"初";s:2:"";s:3:"表";s:2:"";s:3:"軋";s:2:"";s:3:"迎";s:2:"";s:3:"返";s:2:"";s:3:"近";s:2:"";s:3:"邵";s:2:"";s:3:"邸";s:2:"";s:3:"邱";s:2:"";s:3:"邶";s:2:"";s:3:"采";s:2:"";s:3:"金";s:2:"";s:3:"長";s:2:"";s:3:"門";s:2:"";s:3:"阜";s:2:"";s:3:"陀";s:2:"";s:3:"阿";s:2:"";s:3:"阻";s:2:"";s:3:"附";s:2:"@";s:3:"陂";s:2:"A";s:3:"隹";s:2:"B";s:3:"雨";s:2:"C";s:3:"青";s:2:"D";s:3:"非";s:2:"E";s:3:"亟";s:2:"F";s:3:"亭";s:2:"G";s:3:"亮";s:2:"H";s:3:"信";s:2:"I";s:3:"侵";s:2:"J";s:3:"侯";s:2:"K";s:3:"便";s:2:"L";s:3:"俠";s:2:"M";s:3:"俑";s:2:"N";s:3:"俏";s:2:"O";s:3:"保";s:2:"P";s:3:"促";s:2:"Q";s:3:"侶";s:2:"R";s:3:"俘";s:2:"S";s:3:"俟";s:2:"T";s:3:"俊";s:2:"U";s:3:"俗";s:2:"V";s:3:"侮";s:2:"W";s:3:"俐";s:2:"X";s:3:"俄";s:2:"Y";s:3:"係";s:2:"Z";s:3:"俚";s:2:"[";s:3:"俎";s:2:"\";s:3:"俞";s:2:"]";s:3:"侷";s:2:"^";s:3:"兗";s:2:"_";s:3:"冒";s:2:"`";s:3:"冑";s:2:"a";s:3:"冠";s:2:"b";s:3:"剎";s:2:"c";s:3:"剃";s:2:"d";s:3:"削";s:2:"e";s:3:"前";s:2:"f";s:3:"剌";s:2:"g";s:3:"剋";s:2:"h";s:3:"則";s:2:"i";s:3:"勇";s:2:"j";s:3:"勉";s:2:"k";s:3:"勃";s:2:"l";s:3:"勁";s:2:"m";s:3:"匍";s:2:"n";s:3:"南";s:2:"o";s:3:"卻";s:2:"p";s:3:"厚";s:2:"q";s:3:"叛";s:2:"r";s:3:"咬";s:2:"s";s:3:"哀";s:2:"t";s:3:"咨";s:2:"u";s:3:"哎";s:2:"v";s:3:"哉";s:2:"w";s:3:"咸";s:2:"x";s:3:"咦";s:2:"y";s:3:"咳";s:2:"z";s:3:"哇";s:2:"{";s:3:"哂";s:2:"|";s:3:"咽";s:2:"}";s:3:"咪";s:2:"~";s:3:"品";s:2:"";s:3:"哄";s:2:"";s:3:"哈";s:2:"";s:3:"咯";s:2:"";s:3:"咫";s:2:"";s:3:"咱";s:2:"";s:3:"咻";s:2:"";s:3:"咩";s:2:"";s:3:"咧";s:2:"";s:3:"咿";s:2:"";s:3:"囿";s:2:"";s:3:"垂";s:2:"";s:3:"型";s:2:"";s:3:"垠";s:2:"";s:3:"垣";s:2:"";s:3:"垢";s:2:"";s:3:"城";s:2:"";s:3:"垮";s:2:"";s:3:"垓";s:2:"";s:3:"奕";s:2:"";s:3:"契";s:2:"";s:3:"奏";s:2:"";s:3:"奎";s:2:"";s:3:"奐";s:2:"";s:3:"姜";s:2:"";s:3:"姘";s:2:"";s:3:"姿";s:2:"";s:3:"姣";s:2:"";s:3:"姨";s:2:"";s:3:"娃";s:2:"";s:3:"姥";s:2:"";s:3:"姪";s:2:"";s:3:"姚";s:2:"";s:3:"姦";s:2:"";s:3:"威";s:2:"";s:3:"姻";s:2:"";s:3:"孩";s:2:"";s:3:"宣";s:2:"";s:3:"宦";s:2:"";s:3:"室";s:2:"";s:3:"客";s:2:"";s:3:"宥";s:2:"";s:3:"封";s:2:"";s:3:"屎";s:2:"";s:3:"屏";s:2:"";s:3:"屍";s:2:"";s:3:"屋";s:2:"";s:3:"峙";s:2:"";s:3:"峒";s:2:"";s:3:"巷";s:2:"";s:3:"帝";s:2:"";s:3:"帥";s:2:"";s:3:"帟";s:2:"";s:3:"幽";s:2:"";s:3:"庠";s:2:"";s:3:"度";s:2:"";s:3:"建";s:2:"";s:3:"弈";s:2:"";s:3:"弭";s:2:"";s:3:"彥";s:2:"";s:3:"很";s:2:"";s:3:"待";s:2:"";s:3:"徊";s:2:"";s:3:"律";s:2:"";s:3:"徇";s:2:"";s:3:"後";s:2:"";s:3:"徉";s:2:"";s:3:"怒";s:2:"";s:3:"思";s:2:"";s:3:"怠";s:2:"";s:3:"急";s:2:"";s:3:"怎";s:2:"";s:3:"怨";s:2:"";s:3:"恍";s:2:"";s:3:"恰";s:2:"";s:3:"恨";s:2:"";s:3:"恢";s:2:"";s:3:"恆";s:2:"";s:3:"恃";s:2:"";s:3:"恬";s:2:"";s:3:"恫";s:2:"";s:3:"恪";s:2:"";s:3:"恤";s:2:"";s:3:"扁";s:2:"";s:3:"拜";s:2:"";s:3:"挖";s:2:"";s:3:"按";s:2:"";s:3:"拼";s:2:"";s:3:"拭";s:2:"";s:3:"持";s:2:"";s:3:"拮";s:2:"";s:3:"拽";s:2:"";s:3:"指";s:2:"";s:3:"拱";s:2:"";s:3:"拷";s:2:"@";s:3:"拯";s:2:"A";s:3:"括";s:2:"B";s:3:"拾";s:2:"C";s:3:"拴";s:2:"D";s:3:"挑";s:2:"E";s:3:"挂";s:2:"F";s:3:"政";s:2:"G";s:3:"故";s:2:"H";s:3:"斫";s:2:"I";s:3:"施";s:2:"J";s:3:"既";s:2:"K";s:3:"春";s:2:"L";s:3:"昭";s:2:"M";s:3:"映";s:2:"N";s:3:"昧";s:2:"O";s:3:"是";s:2:"P";s:3:"星";s:2:"Q";s:3:"昨";s:2:"R";s:3:"昱";s:2:"S";s:3:"昤";s:2:"T";s:3:"曷";s:2:"U";s:3:"柿";s:2:"V";s:3:"染";s:2:"W";s:3:"柱";s:2:"X";s:3:"柔";s:2:"Y";s:3:"某";s:2:"Z";s:3:"柬";s:2:"[";s:3:"架";s:2:"\";s:3:"枯";s:2:"]";s:3:"柵";s:2:"^";s:3:"柩";s:2:"_";s:3:"柯";s:2:"`";s:3:"柄";s:2:"a";s:3:"柑";s:2:"b";s:3:"枴";s:2:"c";s:3:"柚";s:2:"d";s:3:"查";s:2:"e";s:3:"枸";s:2:"f";s:3:"柏";s:2:"g";s:3:"柞";s:2:"h";s:3:"柳";s:2:"i";s:3:"枰";s:2:"j";s:3:"柙";s:2:"k";s:3:"柢";s:2:"l";s:3:"柝";s:2:"m";s:3:"柒";s:2:"n";s:3:"歪";s:2:"o";s:3:"殃";s:2:"p";s:3:"殆";s:2:"q";s:3:"段";s:2:"r";s:3:"毒";s:2:"s";s:3:"毗";s:2:"t";s:3:"氟";s:2:"u";s:3:"泉";s:2:"v";s:3:"洋";s:2:"w";s:3:"洲";s:2:"x";s:3:"洪";s:2:"y";s:3:"流";s:2:"z";s:3:"津";s:2:"{";s:3:"洌";s:2:"|";s:3:"洱";s:2:"}";s:3:"洞";s:2:"~";s:3:"洗";s:2:"";s:3:"活";s:2:"";s:3:"洽";s:2:"";s:3:"派";s:2:"";s:3:"洶";s:2:"";s:3:"洛";s:2:"";s:3:"泵";s:2:"";s:3:"洹";s:2:"";s:3:"洧";s:2:"";s:3:"洸";s:2:"";s:3:"洩";s:2:"";s:3:"洮";s:2:"";s:3:"洵";s:2:"";s:3:"洎";s:2:"";s:3:"洫";s:2:"";s:3:"炫";s:2:"";s:3:"為";s:2:"";s:3:"炳";s:2:"";s:3:"炬";s:2:"";s:3:"炯";s:2:"";s:3:"炭";s:2:"";s:3:"炸";s:2:"";s:3:"炮";s:2:"";s:3:"炤";s:2:"";s:3:"爰";s:2:"";s:3:"牲";s:2:"";s:3:"牯";s:2:"";s:3:"牴";s:2:"";s:3:"狩";s:2:"";s:3:"狠";s:2:"";s:3:"狡";s:2:"";s:3:"玷";s:2:"";s:3:"珊";s:2:"";s:3:"玻";s:2:"";s:3:"玲";s:2:"";s:3:"珍";s:2:"";s:3:"珀";s:2:"";s:3:"玳";s:2:"";s:3:"甚";s:2:"";s:3:"甭";s:2:"";s:3:"畏";s:2:"";s:3:"界";s:2:"";s:3:"畎";s:2:"";s:3:"畋";s:2:"";s:3:"疫";s:2:"";s:3:"疤";s:2:"";s:3:"疥";s:2:"";s:3:"疢";s:2:"";s:3:"疣";s:2:"";s:3:"癸";s:2:"";s:3:"皆";s:2:"";s:3:"皇";s:2:"";s:3:"皈";s:2:"";s:3:"盈";s:2:"";s:3:"盆";s:2:"";s:3:"盃";s:2:"";s:3:"盅";s:2:"";s:3:"省";s:2:"";s:3:"盹";s:2:"";s:3:"相";s:2:"";s:3:"眉";s:2:"";s:3:"看";s:2:"";s:3:"盾";s:2:"";s:3:"盼";s:2:"";s:3:"眇";s:2:"";s:3:"矜";s:2:"";s:3:"砂";s:2:"";s:3:"研";s:2:"";s:3:"砌";s:2:"";s:3:"砍";s:2:"";s:3:"祆";s:2:"";s:3:"祉";s:2:"";s:3:"祈";s:2:"";s:3:"祇";s:2:"";s:3:"禹";s:2:"";s:3:"禺";s:2:"";s:3:"科";s:2:"";s:3:"秒";s:2:"";s:3:"秋";s:2:"";s:3:"穿";s:2:"";s:3:"突";s:2:"";s:3:"竿";s:2:"";s:3:"竽";s:2:"";s:3:"籽";s:2:"";s:3:"紂";s:2:"";s:3:"紅";s:2:"";s:3:"紀";s:2:"";s:3:"紉";s:2:"";s:3:"紇";s:2:"";s:3:"約";s:2:"";s:3:"紆";s:2:"";s:3:"缸";s:2:"";s:3:"美";s:2:"";s:3:"羿";s:2:"";s:3:"耄";s:2:"@";s:3:"耐";s:2:"A";s:3:"耍";s:2:"B";s:3:"耑";s:2:"C";s:3:"耶";s:2:"D";s:3:"胖";s:2:"E";s:3:"胥";s:2:"F";s:3:"胚";s:2:"G";s:3:"胃";s:2:"H";s:3:"胄";s:2:"I";s:3:"背";s:2:"J";s:3:"胡";s:2:"K";s:3:"胛";s:2:"L";s:3:"胎";s:2:"M";s:3:"胞";s:2:"N";s:3:"胤";s:2:"O";s:3:"胝";s:2:"P";s:3:"致";s:2:"Q";s:3:"舢";s:2:"R";s:3:"苧";s:2:"S";s:3:"范";s:2:"T";s:3:"茅";s:2:"U";s:3:"苣";s:2:"V";s:3:"苛";s:2:"W";s:3:"苦";s:2:"X";s:3:"茄";s:2:"Y";s:3:"若";s:2:"Z";s:3:"茂";s:2:"[";s:3:"茉";s:2:"\";s:3:"苒";s:2:"]";s:3:"苗";s:2:"^";s:3:"英";s:2:"_";s:3:"茁";s:2:"`";s:3:"苜";s:2:"a";s:3:"苔";s:2:"b";s:3:"苑";s:2:"c";s:3:"苞";s:2:"d";s:3:"苓";s:2:"e";s:3:"苟";s:2:"f";s:3:"苯";s:2:"g";s:3:"茆";s:2:"h";s:3:"虐";s:2:"i";s:3:"虹";s:2:"j";s:3:"虻";s:2:"k";s:3:"虺";s:2:"l";s:3:"衍";s:2:"m";s:3:"衫";s:2:"n";s:3:"要";s:2:"o";s:3:"觔";s:2:"p";s:3:"計";s:2:"q";s:3:"訂";s:2:"r";s:3:"訃";s:2:"s";s:3:"貞";s:2:"t";s:3:"負";s:2:"u";s:3:"赴";s:2:"v";s:3:"赳";s:2:"w";s:3:"趴";s:2:"x";s:3:"軍";s:2:"y";s:3:"軌";s:2:"z";s:3:"述";s:2:"{";s:3:"迦";s:2:"|";s:3:"迢";s:2:"}";s:3:"迪";s:2:"~";s:3:"迥";s:2:"";s:3:"迭";s:2:"";s:3:"迫";s:2:"";s:3:"迤";s:2:"";s:3:"迨";s:2:"";s:3:"郊";s:2:"";s:3:"郎";s:2:"";s:3:"郁";s:2:"";s:3:"郃";s:2:"";s:3:"酋";s:2:"";s:3:"酊";s:2:"";s:3:"重";s:2:"";s:3:"閂";s:2:"";s:3:"限";s:2:"";s:3:"陋";s:2:"";s:3:"陌";s:2:"";s:3:"降";s:2:"";s:3:"面";s:2:"";s:3:"革";s:2:"";s:3:"韋";s:2:"";s:3:"韭";s:2:"";s:3:"音";s:2:"";s:3:"頁";s:2:"";s:3:"風";s:2:"";s:3:"飛";s:2:"";s:3:"食";s:2:"";s:3:"首";s:2:"";s:3:"香";s:2:"";s:3:"乘";s:2:"";s:3:"亳";s:2:"";s:3:"倌";s:2:"";s:3:"倍";s:2:"";s:3:"倣";s:2:"";s:3:"俯";s:2:"";s:3:"倦";s:2:"";s:3:"倥";s:2:"";s:3:"俸";s:2:"";s:3:"倩";s:2:"";s:3:"倖";s:2:"";s:3:"倆";s:2:"";s:3:"值";s:2:"";s:3:"借";s:2:"";s:3:"倚";s:2:"";s:3:"倒";s:2:"";s:3:"們";s:2:"";s:3:"俺";s:2:"";s:3:"倀";s:2:"";s:3:"倔";s:2:"";s:3:"倨";s:2:"";s:3:"俱";s:2:"";s:3:"倡";s:2:"";s:3:"個";s:2:"";s:3:"候";s:2:"";s:3:"倘";s:2:"";s:3:"俳";s:2:"";s:3:"修";s:2:"";s:3:"倭";s:2:"";s:3:"倪";s:2:"";s:3:"俾";s:2:"";s:3:"倫";s:2:"";s:3:"倉";s:2:"";s:3:"兼";s:2:"";s:3:"冤";s:2:"";s:3:"冥";s:2:"";s:3:"冢";s:2:"";s:3:"凍";s:2:"";s:3:"凌";s:2:"";s:3:"准";s:2:"";s:3:"凋";s:2:"";s:3:"剖";s:2:"";s:3:"剜";s:2:"";s:3:"剔";s:2:"";s:3:"剛";s:2:"";s:3:"剝";s:2:"";s:3:"匪";s:2:"";s:3:"卿";s:2:"";s:3:"原";s:2:"";s:3:"厝";s:2:"";s:3:"叟";s:2:"";s:3:"哨";s:2:"";s:3:"唐";s:2:"";s:3:"唁";s:2:"";s:3:"唷";s:2:"";s:3:"哼";s:2:"";s:3:"哥";s:2:"";s:3:"哲";s:2:"";s:3:"唆";s:2:"";s:3:"哺";s:2:"";s:3:"唔";s:2:"";s:3:"哩";s:2:"";s:3:"哭";s:2:"";s:3:"員";s:2:"";s:3:"唉";s:2:"";s:3:"哮";s:2:"";s:3:"哪";s:2:"@";s:3:"哦";s:2:"A";s:3:"唧";s:2:"B";s:3:"唇";s:2:"C";s:3:"哽";s:2:"D";s:3:"唏";s:2:"E";s:3:"圃";s:2:"F";s:3:"圄";s:2:"G";s:3:"埂";s:2:"H";s:3:"埔";s:2:"I";s:3:"埋";s:2:"J";s:3:"埃";s:2:"K";s:3:"堉";s:2:"L";s:3:"夏";s:2:"M";s:3:"套";s:2:"N";s:3:"奘";s:2:"O";s:3:"奚";s:2:"P";s:3:"娑";s:2:"Q";s:3:"娘";s:2:"R";s:3:"娜";s:2:"S";s:3:"娟";s:2:"T";s:3:"娛";s:2:"U";s:3:"娓";s:2:"V";s:3:"姬";s:2:"W";s:3:"娠";s:2:"X";s:3:"娣";s:2:"Y";s:3:"娩";s:2:"Z";s:3:"娥";s:2:"[";s:3:"娌";s:2:"\";s:3:"娉";s:2:"]";s:3:"孫";s:2:"^";s:3:"屘";s:2:"_";s:3:"宰";s:2:"`";s:3:"害";s:2:"a";s:3:"家";s:2:"b";s:3:"宴";s:2:"c";s:3:"宮";s:2:"d";s:3:"宵";s:2:"e";s:3:"容";s:2:"f";s:3:"宸";s:2:"g";s:3:"射";s:2:"h";s:3:"屑";s:2:"i";s:3:"展";s:2:"j";s:3:"屐";s:2:"k";s:3:"峭";s:2:"l";s:3:"峽";s:2:"m";s:3:"峻";s:2:"n";s:3:"峪";s:2:"o";s:3:"峨";s:2:"p";s:3:"峰";s:2:"q";s:3:"島";s:2:"r";s:3:"崁";s:2:"s";s:3:"峴";s:2:"t";s:3:"差";s:2:"u";s:3:"席";s:2:"v";s:3:"師";s:2:"w";s:3:"庫";s:2:"x";s:3:"庭";s:2:"y";s:3:"座";s:2:"z";s:3:"弱";s:2:"{";s:3:"徒";s:2:"|";s:3:"徑";s:2:"}";s:3:"徐";s:2:"~";s:3:"恙";s:2:"";s:3:"恣";s:2:"";s:3:"恥";s:2:"";s:3:"恐";s:2:"";s:3:"恕";s:2:"";s:3:"恭";s:2:"";s:3:"恩";s:2:"";s:3:"息";s:2:"";s:3:"悄";s:2:"";s:3:"悟";s:2:"";s:3:"悚";s:2:"";s:3:"悍";s:2:"";s:3:"悔";s:2:"";s:3:"悌";s:2:"";s:3:"悅";s:2:"";s:3:"悖";s:2:"";s:3:"扇";s:2:"";s:3:"拳";s:2:"";s:3:"挈";s:2:"";s:3:"拿";s:2:"";s:3:"捎";s:2:"";s:3:"挾";s:2:"";s:3:"振";s:2:"";s:3:"捕";s:2:"";s:3:"捂";s:2:"";s:3:"捆";s:2:"";s:3:"捏";s:2:"";s:3:"捉";s:2:"";s:3:"挺";s:2:"";s:3:"捐";s:2:"";s:3:"挽";s:2:"";s:3:"挪";s:2:"";s:3:"挫";s:2:"";s:3:"挨";s:2:"";s:3:"捍";s:2:"";s:3:"捌";s:2:"";s:3:"效";s:2:"";s:3:"敉";s:2:"";s:3:"料";s:2:"";s:3:"旁";s:2:"";s:3:"旅";s:2:"";s:3:"時";s:2:"";s:3:"晉";s:2:"";s:3:"晏";s:2:"";s:3:"晃";s:2:"";s:3:"晒";s:2:"";s:3:"晌";s:2:"";s:3:"晅";s:2:"";s:3:"晁";s:2:"";s:3:"書";s:2:"";s:3:"朔";s:2:"";s:3:"朕";s:2:"";s:3:"朗";s:2:"";s:3:"校";s:2:"";s:3:"核";s:2:"";s:3:"案";s:2:"";s:3:"框";s:2:"";s:3:"桓";s:2:"";s:3:"根";s:2:"";s:3:"桂";s:2:"";s:3:"桔";s:2:"";s:3:"栩";s:2:"";s:3:"梳";s:2:"";s:3:"栗";s:2:"";s:3:"桌";s:2:"";s:3:"桑";s:2:"";s:3:"栽";s:2:"";s:3:"柴";s:2:"";s:3:"桐";s:2:"";s:3:"桀";s:2:"";s:3:"格";s:2:"";s:3:"桃";s:2:"";s:3:"株";s:2:"";s:3:"桅";s:2:"";s:3:"栓";s:2:"";s:3:"栘";s:2:"";s:3:"桁";s:2:"";s:3:"殊";s:2:"";s:3:"殉";s:2:"";s:3:"殷";s:2:"";s:3:"氣";s:2:"";s:3:"氧";s:2:"";s:3:"氨";s:2:"";s:3:"氦";s:2:"";s:3:"氤";s:2:"";s:3:"泰";s:2:"";s:3:"浪";s:2:"";s:3:"涕";s:2:"";s:3:"消";s:2:"";s:3:"涇";s:2:"";s:3:"浦";s:2:"";s:3:"浸";s:2:"";s:3:"海";s:2:"";s:3:"浙";s:2:"";s:3:"涓";s:2:"@";s:3:"浬";s:2:"A";s:3:"涉";s:2:"B";s:3:"浮";s:2:"C";s:3:"浚";s:2:"D";s:3:"浴";s:2:"E";s:3:"浩";s:2:"F";s:3:"涌";s:2:"G";s:3:"涊";s:2:"H";s:3:"浹";s:2:"I";s:3:"涅";s:2:"J";s:3:"浥";s:2:"K";s:3:"涔";s:2:"L";s:3:"烊";s:2:"M";s:3:"烘";s:2:"N";s:3:"烤";s:2:"O";s:3:"烙";s:2:"P";s:3:"烈";s:2:"Q";s:3:"烏";s:2:"R";s:3:"爹";s:2:"S";s:3:"特";s:2:"T";s:3:"狼";s:2:"U";s:3:"狹";s:2:"V";s:3:"狽";s:2:"W";s:3:"狸";s:2:"X";s:3:"狷";s:2:"Y";s:3:"玆";s:2:"Z";s:3:"班";s:2:"[";s:3:"琉";s:2:"\";s:3:"珮";s:2:"]";s:3:"珠";s:2:"^";s:3:"珪";s:2:"_";s:3:"珞";s:2:"`";s:3:"畔";s:2:"a";s:3:"畝";s:2:"b";s:3:"畜";s:2:"c";s:3:"畚";s:2:"d";s:3:"留";s:2:"e";s:3:"疾";s:2:"f";s:3:"病";s:2:"g";s:3:"症";s:2:"h";s:3:"疲";s:2:"i";s:3:"疳";s:2:"j";s:3:"疽";s:2:"k";s:3:"疼";s:2:"l";s:3:"疹";s:2:"m";s:3:"痂";s:2:"n";s:3:"疸";s:2:"o";s:3:"皋";s:2:"p";s:3:"皰";s:2:"q";s:3:"益";s:2:"r";s:3:"盍";s:2:"s";s:3:"盎";s:2:"t";s:3:"眩";s:2:"u";s:3:"真";s:2:"v";s:3:"眠";s:2:"w";s:3:"眨";s:2:"x";s:3:"矩";s:2:"y";s:3:"砰";s:2:"z";s:3:"砧";s:2:"{";s:3:"砸";s:2:"|";s:3:"砝";s:2:"}";s:3:"破";s:2:"~";s:3:"砷";s:2:"";s:3:"砥";s:2:"";s:3:"砭";s:2:"";s:3:"砠";s:2:"";s:3:"砟";s:2:"";s:3:"砲";s:2:"";s:3:"祕";s:2:"";s:3:"祐";s:2:"";s:3:"祠";s:2:"";s:3:"祟";s:2:"";s:3:"祖";s:2:"";s:3:"神";s:2:"";s:3:"祝";s:2:"";s:3:"祗";s:2:"";s:3:"祚";s:2:"";s:3:"秤";s:2:"";s:3:"秣";s:2:"";s:3:"秧";s:2:"";s:3:"租";s:2:"";s:3:"秦";s:2:"";s:3:"秩";s:2:"";s:3:"秘";s:2:"";s:3:"窄";s:2:"";s:3:"窈";s:2:"";s:3:"站";s:2:"";s:3:"笆";s:2:"";s:3:"笑";s:2:"";s:3:"粉";s:2:"";s:3:"紡";s:2:"";s:3:"紗";s:2:"";s:3:"紋";s:2:"";s:3:"紊";s:2:"";s:3:"素";s:2:"";s:3:"索";s:2:"";s:3:"純";s:2:"";s:3:"紐";s:2:"";s:3:"紕";s:2:"";s:3:"級";s:2:"";s:3:"紜";s:2:"";s:3:"納";s:2:"";s:3:"紙";s:2:"";s:3:"紛";s:2:"";s:3:"缺";s:2:"";s:3:"罟";s:2:"";s:3:"羔";s:2:"";s:3:"翅";s:2:"";s:3:"翁";s:2:"";s:3:"耆";s:2:"";s:3:"耘";s:2:"";s:3:"耕";s:2:"";s:3:"耙";s:2:"";s:3:"耗";s:2:"";s:3:"耽";s:2:"";s:3:"耿";s:2:"";s:3:"胱";s:2:"";s:3:"脂";s:2:"";s:3:"胰";s:2:"";s:3:"脅";s:2:"";s:3:"胭";s:2:"";s:3:"胴";s:2:"";s:3:"脆";s:2:"";s:3:"胸";s:2:"";s:3:"胳";s:2:"";s:3:"脈";s:2:"";s:3:"能";s:2:"";s:3:"脊";s:2:"";s:3:"胼";s:2:"";s:3:"胯";s:2:"";s:3:"臭";s:2:"";s:3:"臬";s:2:"";s:3:"舀";s:2:"";s:3:"舐";s:2:"";s:3:"航";s:2:"";s:3:"舫";s:2:"";s:3:"舨";s:2:"";s:3:"般";s:2:"";s:3:"芻";s:2:"";s:3:"茫";s:2:"";s:3:"荒";s:2:"";s:3:"荔";s:2:"";s:3:"荊";s:2:"";s:3:"茸";s:2:"";s:3:"荐";s:2:"";s:3:"草";s:2:"";s:3:"茵";s:2:"";s:3:"茴";s:2:"";s:3:"荏";s:2:"";s:3:"茲";s:2:"";s:3:"茹";s:2:"";s:3:"茶";s:2:"";s:3:"茗";s:2:"";s:3:"荀";s:2:"";s:3:"茱";s:2:"";s:3:"茨";s:2:"";s:3:"荃";s:2:"@";s:3:"虔";s:2:"A";s:3:"蚊";s:2:"B";s:3:"蚪";s:2:"C";s:3:"蚓";s:2:"D";s:3:"蚤";s:2:"E";s:3:"蚩";s:2:"F";s:3:"蚌";s:2:"G";s:3:"蚣";s:2:"H";s:3:"蚜";s:2:"I";s:3:"衰";s:2:"J";s:3:"衷";s:2:"K";s:3:"袁";s:2:"L";s:3:"袂";s:2:"M";s:3:"衽";s:2:"N";s:3:"衹";s:2:"O";s:3:"記";s:2:"P";s:3:"訐";s:2:"Q";s:3:"討";s:2:"R";s:3:"訌";s:2:"S";s:3:"訕";s:2:"T";s:3:"訊";s:2:"U";s:3:"託";s:2:"V";s:3:"訓";s:2:"W";s:3:"訖";s:2:"X";s:3:"訏";s:2:"Y";s:3:"訑";s:2:"Z";s:3:"豈";s:2:"[";s:3:"豺";s:2:"\";s:3:"豹";s:2:"]";s:3:"財";s:2:"^";s:3:"貢";s:2:"_";s:3:"起";s:2:"`";s:3:"躬";s:2:"a";s:3:"軒";s:2:"b";s:3:"軔";s:2:"c";s:3:"軏";s:2:"d";s:3:"辱";s:2:"e";s:3:"送";s:2:"f";s:3:"逆";s:2:"g";s:3:"迷";s:2:"h";s:3:"退";s:2:"i";s:3:"迺";s:2:"j";s:3:"迴";s:2:"k";s:3:"逃";s:2:"l";s:3:"追";s:2:"m";s:3:"逅";s:2:"n";s:3:"迸";s:2:"o";s:3:"邕";s:2:"p";s:3:"郡";s:2:"q";s:3:"郝";s:2:"r";s:3:"郢";s:2:"s";s:3:"酒";s:2:"t";s:3:"配";s:2:"u";s:3:"酌";s:2:"v";s:3:"釘";s:2:"w";s:3:"針";s:2:"x";s:3:"釗";s:2:"y";s:3:"釜";s:2:"z";s:3:"釙";s:2:"{";s:3:"閃";s:2:"|";s:3:"院";s:2:"}";s:3:"陣";s:2:"~";s:3:"陡";s:2:"";s:3:"陛";s:2:"";s:3:"陝";s:2:"";s:3:"除";s:2:"";s:3:"陘";s:2:"";s:3:"陞";s:2:"";s:3:"隻";s:2:"";s:3:"飢";s:2:"";s:3:"馬";s:2:"";s:3:"骨";s:2:"";s:3:"高";s:2:"";s:3:"鬥";s:2:"";s:3:"鬲";s:2:"";s:3:"鬼";s:2:"";s:3:"乾";s:2:"";s:3:"偺";s:2:"";s:3:"偽";s:2:"";s:3:"停";s:2:"";s:3:"假";s:2:"";s:3:"偃";s:2:"";s:3:"偌";s:2:"";s:3:"做";s:2:"";s:3:"偉";s:2:"";s:3:"健";s:2:"";s:3:"偶";s:2:"";s:3:"偎";s:2:"";s:3:"偕";s:2:"";s:3:"偵";s:2:"";s:3:"側";s:2:"";s:3:"偷";s:2:"";s:3:"偏";s:2:"";s:3:"倏";s:2:"";s:3:"偯";s:2:"";s:3:"偭";s:2:"";s:3:"兜";s:2:"";s:3:"冕";s:2:"";s:3:"凰";s:2:"";s:3:"剪";s:2:"";s:3:"副";s:2:"";s:3:"勒";s:2:"";s:3:"務";s:2:"";s:3:"勘";s:2:"";s:3:"動";s:2:"";s:3:"匐";s:2:"";s:3:"匏";s:2:"";s:3:"匙";s:2:"";s:3:"匿";s:2:"";s:3:"區";s:2:"";s:3:"匾";s:2:"";s:3:"參";s:2:"";s:3:"曼";s:2:"";s:3:"商";s:2:"";s:3:"啪";s:2:"";s:3:"啦";s:2:"";s:3:"啄";s:2:"";s:3:"啞";s:2:"";s:3:"啡";s:2:"";s:3:"啃";s:2:"";s:3:"啊";s:2:"";s:3:"唱";s:2:"";s:3:"啖";s:2:"";s:3:"問";s:2:"";s:3:"啕";s:2:"";s:3:"唯";s:2:"";s:3:"啤";s:2:"";s:3:"唸";s:2:"";s:3:"售";s:2:"";s:3:"啜";s:2:"";s:3:"唬";s:2:"";s:3:"啣";s:2:"";s:3:"唳";s:2:"";s:3:"啁";s:2:"";s:3:"啗";s:2:"";s:3:"圈";s:2:"";s:3:"國";s:2:"";s:3:"圉";s:2:"";s:3:"域";s:2:"";s:3:"堅";s:2:"";s:3:"堊";s:2:"";s:3:"堆";s:2:"";s:3:"埠";s:2:"";s:3:"埤";s:2:"";s:3:"基";s:2:"";s:3:"堂";s:2:"";s:3:"堵";s:2:"";s:3:"執";s:2:"";s:3:"培";s:2:"";s:3:"夠";s:2:"";s:3:"奢";s:2:"";s:3:"娶";s:2:"";s:3:"婁";s:2:"";s:3:"婉";s:2:"";s:3:"婦";s:2:"";s:3:"婪";s:2:"";s:3:"婀";s:2:"@";s:3:"娼";s:2:"A";s:3:"婢";s:2:"B";s:3:"婚";s:2:"C";s:3:"婆";s:2:"D";s:3:"婊";s:2:"E";s:3:"孰";s:2:"F";s:3:"寇";s:2:"G";s:3:"寅";s:2:"H";s:3:"寄";s:2:"I";s:3:"寂";s:2:"J";s:3:"宿";s:2:"K";s:3:"密";s:2:"L";s:3:"尉";s:2:"M";s:3:"專";s:2:"N";s:3:"將";s:2:"O";s:3:"屠";s:2:"P";s:3:"屜";s:2:"Q";s:3:"屝";s:2:"R";s:3:"崇";s:2:"S";s:3:"崆";s:2:"T";s:3:"崎";s:2:"U";s:3:"崛";s:2:"V";s:3:"崖";s:2:"W";s:3:"崢";s:2:"X";s:3:"崑";s:2:"Y";s:3:"崩";s:2:"Z";s:3:"崔";s:2:"[";s:3:"崙";s:2:"\";s:3:"崤";s:2:"]";s:3:"崧";s:2:"^";s:3:"崗";s:2:"_";s:3:"巢";s:2:"`";s:3:"常";s:2:"a";s:3:"帶";s:2:"b";s:3:"帳";s:2:"c";s:3:"帷";s:2:"d";s:3:"康";s:2:"e";s:3:"庸";s:2:"f";s:3:"庶";s:2:"g";s:3:"庵";s:2:"h";s:3:"庾";s:2:"i";s:3:"張";s:2:"j";s:3:"強";s:2:"k";s:3:"彗";s:2:"l";s:3:"彬";s:2:"m";s:3:"彩";s:2:"n";s:3:"彫";s:2:"o";s:3:"得";s:2:"p";s:3:"徙";s:2:"q";s:3:"從";s:2:"r";s:3:"徘";s:2:"s";s:3:"御";s:2:"t";s:3:"徠";s:2:"u";s:3:"徜";s:2:"v";s:3:"恿";s:2:"w";s:3:"患";s:2:"x";s:3:"悉";s:2:"y";s:3:"悠";s:2:"z";s:3:"您";s:2:"{";s:3:"惋";s:2:"|";s:3:"悴";s:2:"}";s:3:"惦";s:2:"~";s:3:"悽";s:2:"";s:3:"情";s:2:"";s:3:"悻";s:2:"";s:3:"悵";s:2:"";s:3:"惜";s:2:"";s:3:"悼";s:2:"";s:3:"惘";s:2:"";s:3:"惕";s:2:"";s:3:"惆";s:2:"";s:3:"惟";s:2:"";s:3:"悸";s:2:"";s:3:"惚";s:2:"";s:3:"惇";s:2:"";s:3:"戚";s:2:"";s:3:"戛";s:2:"";s:3:"扈";s:2:"";s:3:"掠";s:2:"";s:3:"控";s:2:"";s:3:"捲";s:2:"";s:3:"掖";s:2:"";s:3:"探";s:2:"";s:3:"接";s:2:"";s:3:"捷";s:2:"";s:3:"捧";s:2:"";s:3:"掘";s:2:"";s:3:"措";s:2:"";s:3:"捱";s:2:"";s:3:"掩";s:2:"";s:3:"掉";s:2:"";s:3:"掃";s:2:"";s:3:"掛";s:2:"";s:3:"捫";s:2:"";s:3:"推";s:2:"";s:3:"掄";s:2:"";s:3:"授";s:2:"";s:3:"掙";s:2:"";s:3:"採";s:2:"";s:3:"掬";s:2:"";s:3:"排";s:2:"";s:3:"掏";s:2:"";s:3:"掀";s:2:"";s:3:"捻";s:2:"";s:3:"捩";s:2:"";s:3:"捨";s:2:"";s:3:"捺";s:2:"";s:3:"敝";s:2:"";s:3:"敖";s:2:"";s:3:"救";s:2:"";s:3:"教";s:2:"";s:3:"敗";s:2:"";s:3:"啟";s:2:"";s:3:"敏";s:2:"";s:3:"敘";s:2:"";s:3:"敕";s:2:"";s:3:"敔";s:2:"";s:3:"斜";s:2:"";s:3:"斛";s:2:"";s:3:"斬";s:2:"";s:3:"族";s:2:"";s:3:"旋";s:2:"";s:3:"旌";s:2:"";s:3:"旎";s:2:"";s:3:"晝";s:2:"";s:3:"晚";s:2:"";s:3:"晤";s:2:"";s:3:"晨";s:2:"";s:3:"晦";s:2:"";s:3:"晞";s:2:"";s:3:"曹";s:2:"";s:3:"勗";s:2:"";s:3:"望";s:2:"";s:3:"梁";s:2:"";s:3:"梯";s:2:"";s:3:"梢";s:2:"";s:3:"梓";s:2:"";s:3:"梵";s:2:"";s:3:"桿";s:2:"";s:3:"桶";s:2:"";s:3:"梱";s:2:"";s:3:"梧";s:2:"";s:3:"梗";s:2:"";s:3:"械";s:2:"";s:3:"梃";s:2:"";s:3:"棄";s:2:"";s:3:"梭";s:2:"";s:3:"梆";s:2:"";s:3:"梅";s:2:"";s:3:"梔";s:2:"";s:3:"條";s:2:"";s:3:"梨";s:2:"";s:3:"梟";s:2:"";s:3:"梡";s:2:"";s:3:"梂";s:2:"";s:3:"欲";s:2:"";s:3:"殺";s:2:"@";s:3:"毫";s:2:"A";s:3:"毬";s:2:"B";s:3:"氫";s:2:"C";s:3:"涎";s:2:"D";s:3:"涼";s:2:"E";s:3:"淳";s:2:"F";s:3:"淙";s:2:"G";s:3:"液";s:2:"H";s:3:"淡";s:2:"I";s:3:"淌";s:2:"J";s:3:"淤";s:2:"K";s:3:"添";s:2:"L";s:3:"淺";s:2:"M";s:3:"清";s:2:"N";s:3:"淇";s:2:"O";s:3:"淋";s:2:"P";s:3:"涯";s:2:"Q";s:3:"淑";s:2:"R";s:3:"涮";s:2:"S";s:3:"淞";s:2:"T";s:3:"淹";s:2:"U";s:3:"涸";s:2:"V";s:3:"混";s:2:"W";s:3:"淵";s:2:"X";s:3:"淅";s:2:"Y";s:3:"淒";s:2:"Z";s:3:"渚";s:2:"[";s:3:"涵";s:2:"\";s:3:"淚";s:2:"]";s:3:"淫";s:2:"^";s:3:"淘";s:2:"_";s:3:"淪";s:2:"`";s:3:"深";s:2:"a";s:3:"淮";s:2:"b";s:3:"淨";s:2:"c";s:3:"淆";s:2:"d";s:3:"淄";s:2:"e";s:3:"涪";s:2:"f";s:3:"淬";s:2:"g";s:3:"涿";s:2:"h";s:3:"淦";s:2:"i";s:3:"烹";s:2:"j";s:3:"焉";s:2:"k";s:3:"焊";s:2:"l";s:3:"烽";s:2:"m";s:3:"烯";s:2:"n";s:3:"爽";s:2:"o";s:3:"牽";s:2:"p";s:3:"犁";s:2:"q";s:3:"猜";s:2:"r";s:3:"猛";s:2:"s";s:3:"猖";s:2:"t";s:3:"猓";s:2:"u";s:3:"猙";s:2:"v";s:3:"率";s:2:"w";s:3:"琅";s:2:"x";s:3:"琊";s:2:"y";s:3:"球";s:2:"z";s:3:"理";s:2:"{";s:3:"現";s:2:"|";s:3:"琍";s:2:"}";s:3:"瓠";s:2:"~";s:3:"瓶";s:2:"";s:3:"瓷";s:2:"";s:3:"甜";s:2:"";s:3:"產";s:2:"";s:3:"略";s:2:"";s:3:"畦";s:2:"";s:3:"畢";s:2:"";s:3:"異";s:2:"";s:3:"疏";s:2:"";s:3:"痔";s:2:"";s:3:"痕";s:2:"";s:3:"疵";s:2:"";s:3:"痊";s:2:"";s:3:"痍";s:2:"";s:3:"皎";s:2:"";s:3:"盔";s:2:"";s:3:"盒";s:2:"";s:3:"盛";s:2:"";s:3:"眷";s:2:"";s:3:"眾";s:2:"";s:3:"眼";s:2:"";s:3:"眶";s:2:"";s:3:"眸";s:2:"";s:3:"眺";s:2:"";s:3:"硫";s:2:"";s:3:"硃";s:2:"";s:3:"硎";s:2:"";s:3:"祥";s:2:"";s:3:"票";s:2:"";s:3:"祭";s:2:"";s:3:"移";s:2:"";s:3:"窒";s:2:"";s:3:"窕";s:2:"";s:3:"笠";s:2:"";s:3:"笨";s:2:"";s:3:"笛";s:2:"";s:3:"第";s:2:"";s:3:"符";s:2:"";s:3:"笙";s:2:"";s:3:"笞";s:2:"";s:3:"笮";s:2:"";s:3:"粒";s:2:"";s:3:"粗";s:2:"";s:3:"粕";s:2:"";s:3:"絆";s:2:"";s:3:"絃";s:2:"";s:3:"統";s:2:"";s:3:"紮";s:2:"";s:3:"紹";s:2:"";s:3:"紼";s:2:"";s:3:"絀";s:2:"";s:3:"細";s:2:"";s:3:"紳";s:2:"";s:3:"組";s:2:"";s:3:"累";s:2:"";s:3:"終";s:2:"";s:3:"紲";s:2:"";s:3:"紱";s:2:"";s:3:"缽";s:2:"";s:3:"羞";s:2:"";s:3:"羚";s:2:"";s:3:"翌";s:2:"";s:3:"翎";s:2:"";s:3:"習";s:2:"";s:3:"耜";s:2:"";s:3:"聊";s:2:"";s:3:"聆";s:2:"";s:3:"脯";s:2:"";s:3:"脖";s:2:"";s:3:"脣";s:2:"";s:3:"脫";s:2:"";s:3:"脩";s:2:"";s:3:"脰";s:2:"";s:3:"脤";s:2:"";s:3:"舂";s:2:"";s:3:"舵";s:2:"";s:3:"舷";s:2:"";s:3:"舶";s:2:"";s:3:"船";s:2:"";s:3:"莎";s:2:"";s:3:"莞";s:2:"";s:3:"莘";s:2:"";s:3:"荸";s:2:"";s:3:"莢";s:2:"";s:3:"莖";s:2:"";s:3:"莽";s:2:"";s:3:"莫";s:2:"";s:3:"莒";s:2:"";s:3:"莊";s:2:"";s:3:"莓";s:2:"";s:3:"莉";s:2:"";s:3:"莠";s:2:"";s:3:"荷";s:2:"";s:3:"荻";s:2:"";s:3:"荼";s:2:"@";s:3:"莆";s:2:"A";s:3:"莧";s:2:"B";s:3:"處";s:2:"C";s:3:"彪";s:2:"D";s:3:"蛇";s:2:"E";s:3:"蛀";s:2:"F";s:3:"蚶";s:2:"G";s:3:"蛄";s:2:"H";s:3:"蚵";s:2:"I";s:3:"蛆";s:2:"J";s:3:"蛋";s:2:"K";s:3:"蚱";s:2:"L";s:3:"蚯";s:2:"M";s:3:"蛉";s:2:"N";s:3:"術";s:2:"O";s:3:"袞";s:2:"P";s:3:"袈";s:2:"Q";s:3:"被";s:2:"R";s:3:"袒";s:2:"S";s:3:"袖";s:2:"T";s:3:"袍";s:2:"U";s:3:"袋";s:2:"V";s:3:"覓";s:2:"W";s:3:"規";s:2:"X";s:3:"訪";s:2:"Y";s:3:"訝";s:2:"Z";s:3:"訣";s:2:"[";s:3:"訥";s:2:"\";s:3:"許";s:2:"]";s:3:"設";s:2:"^";s:3:"訟";s:2:"_";s:3:"訛";s:2:"`";s:3:"訢";s:2:"a";s:3:"豉";s:2:"b";s:3:"豚";s:2:"c";s:3:"販";s:2:"d";s:3:"責";s:2:"e";s:3:"貫";s:2:"f";s:3:"貨";s:2:"g";s:3:"貪";s:2:"h";s:3:"貧";s:2:"i";s:3:"赧";s:2:"j";s:3:"赦";s:2:"k";s:3:"趾";s:2:"l";s:3:"趺";s:2:"m";s:3:"軛";s:2:"n";s:3:"軟";s:2:"o";s:3:"這";s:2:"p";s:3:"逍";s:2:"q";s:3:"通";s:2:"r";s:3:"逗";s:2:"s";s:3:"連";s:2:"t";s:3:"速";s:2:"u";s:3:"逝";s:2:"v";s:3:"逐";s:2:"w";s:3:"逕";s:2:"x";s:3:"逞";s:2:"y";s:3:"造";s:2:"z";s:3:"透";s:2:"{";s:3:"逢";s:2:"|";s:3:"逖";s:2:"}";s:3:"逛";s:2:"~";s:3:"途";s:2:"";s:3:"部";s:2:"";s:3:"郭";s:2:"";s:3:"都";s:2:"";s:3:"酗";s:2:"";s:3:"野";s:2:"";s:3:"釵";s:2:"";s:3:"釦";s:2:"";s:3:"釣";s:2:"";s:3:"釧";s:2:"";s:3:"釭";s:2:"";s:3:"釩";s:2:"";s:3:"閉";s:2:"";s:3:"陪";s:2:"";s:3:"陵";s:2:"";s:3:"陳";s:2:"";s:3:"陸";s:2:"";s:3:"陰";s:2:"";s:3:"陴";s:2:"";s:3:"陶";s:2:"";s:3:"陷";s:2:"";s:3:"陬";s:2:"";s:3:"雀";s:2:"";s:3:"雪";s:2:"";s:3:"雩";s:2:"";s:3:"章";s:2:"";s:3:"竟";s:2:"";s:3:"頂";s:2:"";s:3:"頃";s:2:"";s:3:"魚";s:2:"";s:3:"鳥";s:2:"";s:3:"鹵";s:2:"";s:3:"鹿";s:2:"";s:3:"麥";s:2:"";s:3:"麻";s:2:"";s:3:"傢";s:2:"";s:3:"傍";s:2:"";s:3:"傅";s:2:"";s:3:"備";s:2:"";s:3:"傑";s:2:"";s:3:"傀";s:2:"";s:3:"傖";s:2:"";s:3:"傘";s:2:"";s:3:"傚";s:2:"";s:3:"最";s:2:"";s:3:"凱";s:2:"";s:3:"割";s:2:"";s:3:"剴";s:2:"";s:3:"創";s:2:"";s:3:"剩";s:2:"";s:3:"勞";s:2:"";s:3:"勝";s:2:"";s:3:"勛";s:2:"";s:3:"博";s:2:"";s:3:"厥";s:2:"";s:3:"啻";s:2:"";s:3:"喀";s:2:"";s:3:"喧";s:2:"";s:3:"啼";s:2:"";s:3:"喊";s:2:"";s:3:"喝";s:2:"";s:3:"喘";s:2:"";s:3:"喂";s:2:"";s:3:"喜";s:2:"";s:3:"喪";s:2:"";s:3:"喔";s:2:"";s:3:"喇";s:2:"";s:3:"喋";s:2:"";s:3:"喃";s:2:"";s:3:"喳";s:2:"";s:3:"單";s:2:"";s:3:"喟";s:2:"";s:3:"唾";s:2:"";s:3:"喲";s:2:"";s:3:"喚";s:2:"";s:3:"喻";s:2:"";s:3:"喬";s:2:"";s:3:"喱";s:2:"";s:3:"啾";s:2:"";s:3:"喉";s:2:"";s:3:"喫";s:2:"";s:3:"喙";s:2:"";s:3:"圍";s:2:"";s:3:"堯";s:2:"";s:3:"堪";s:2:"";s:3:"場";s:2:"";s:3:"堤";s:2:"";s:3:"堰";s:2:"";s:3:"報";s:2:"";s:3:"堡";s:2:"";s:3:"堝";s:2:"";s:3:"堠";s:2:"";s:3:"壹";s:2:"";s:3:"壺";s:2:"";s:3:"奠";s:2:"@";s:3:"婷";s:2:"A";s:3:"媚";s:2:"B";s:3:"婿";s:2:"C";s:3:"媒";s:2:"D";s:3:"媛";s:2:"E";s:3:"媧";s:2:"F";s:3:"孳";s:2:"G";s:3:"孱";s:2:"H";s:3:"寒";s:2:"I";s:3:"富";s:2:"J";s:3:"寓";s:2:"K";s:3:"寐";s:2:"L";s:3:"尊";s:2:"M";s:3:"尋";s:2:"N";s:3:"就";s:2:"O";s:3:"嵌";s:2:"P";s:3:"嵐";s:2:"Q";s:3:"崴";s:2:"R";s:3:"嵇";s:2:"S";s:3:"巽";s:2:"T";s:3:"幅";s:2:"U";s:3:"帽";s:2:"V";s:3:"幀";s:2:"W";s:3:"幃";s:2:"X";s:3:"幾";s:2:"Y";s:3:"廊";s:2:"Z";s:3:"廁";s:2:"[";s:3:"廂";s:2:"\";s:3:"廄";s:2:"]";s:3:"弼";s:2:"^";s:3:"彭";s:2:"_";s:3:"復";s:2:"`";s:3:"循";s:2:"a";s:3:"徨";s:2:"b";s:3:"惑";s:2:"c";s:3:"惡";s:2:"d";s:3:"悲";s:2:"e";s:3:"悶";s:2:"f";s:3:"惠";s:2:"g";s:3:"愜";s:2:"h";s:3:"愣";s:2:"i";s:3:"惺";s:2:"j";s:3:"愕";s:2:"k";s:3:"惰";s:2:"l";s:3:"惻";s:2:"m";s:3:"惴";s:2:"n";s:3:"慨";s:2:"o";s:3:"惱";s:2:"p";s:3:"愎";s:2:"q";s:3:"惶";s:2:"r";s:3:"愉";s:2:"s";s:3:"愀";s:2:"t";s:3:"愒";s:2:"u";s:3:"戟";s:2:"v";s:3:"扉";s:2:"w";s:3:"掣";s:2:"x";s:3:"掌";s:2:"y";s:3:"描";s:2:"z";s:3:"揀";s:2:"{";s:3:"揩";s:2:"|";s:3:"揉";s:2:"}";s:3:"揆";s:2:"~";s:3:"揍";s:2:"";s:3:"插";s:2:"";s:3:"揣";s:2:"";s:3:"提";s:2:"";s:3:"握";s:2:"";s:3:"揖";s:2:"";s:3:"揭";s:2:"";s:3:"揮";s:2:"";s:3:"捶";s:2:"";s:3:"援";s:2:"";s:3:"揪";s:2:"";s:3:"換";s:2:"";s:3:"摒";s:2:"";s:3:"揚";s:2:"";s:3:"揹";s:2:"";s:3:"敞";s:2:"";s:3:"敦";s:2:"";s:3:"敢";s:2:"";s:3:"散";s:2:"";s:3:"斑";s:2:"";s:3:"斐";s:2:"";s:3:"斯";s:2:"";s:3:"普";s:2:"";s:3:"晰";s:2:"";s:3:"晴";s:2:"";s:3:"晶";s:2:"";s:3:"景";s:2:"";s:3:"暑";s:2:"";s:3:"智";s:2:"";s:3:"晾";s:2:"";s:3:"晷";s:2:"";s:3:"曾";s:2:"";s:3:"替";s:2:"";s:3:"期";s:2:"";s:3:"朝";s:2:"";s:3:"棺";s:2:"";s:3:"棕";s:2:"";s:3:"棠";s:2:"";s:3:"棘";s:2:"";s:3:"棗";s:2:"";s:3:"椅";s:2:"";s:3:"棟";s:2:"";s:3:"棵";s:2:"";s:3:"森";s:2:"";s:3:"棧";s:2:"";s:3:"棹";s:2:"";s:3:"棒";s:2:"";s:3:"棲";s:2:"";s:3:"棣";s:2:"";s:3:"棋";s:2:"";s:3:"棍";s:2:"";s:3:"植";s:2:"";s:3:"椒";s:2:"";s:3:"椎";s:2:"";s:3:"棉";s:2:"";s:3:"棚";s:2:"";s:3:"楮";s:2:"";s:3:"棻";s:2:"";s:3:"款";s:2:"";s:3:"欺";s:2:"";s:3:"欽";s:2:"";s:3:"殘";s:2:"";s:3:"殖";s:2:"";s:3:"殼";s:2:"";s:3:"毯";s:2:"";s:3:"氮";s:2:"";s:3:"氯";s:2:"";s:3:"氬";s:2:"";s:3:"港";s:2:"";s:3:"游";s:2:"";s:3:"湔";s:2:"";s:3:"渡";s:2:"";s:3:"渲";s:2:"";s:3:"湧";s:2:"";s:3:"湊";s:2:"";s:3:"渠";s:2:"";s:3:"渥";s:2:"";s:3:"渣";s:2:"";s:3:"減";s:2:"";s:3:"湛";s:2:"";s:3:"湘";s:2:"";s:3:"渤";s:2:"";s:3:"湖";s:2:"";s:3:"湮";s:2:"";s:3:"渭";s:2:"";s:3:"渦";s:2:"";s:3:"湯";s:2:"";s:3:"渴";s:2:"";s:3:"湍";s:2:"";s:3:"渺";s:2:"";s:3:"測";s:2:"";s:3:"湃";s:2:"";s:3:"渝";s:2:"";s:3:"渾";s:2:"";s:3:"滋";s:2:"@";s:3:"溉";s:2:"A";s:3:"渙";s:2:"B";s:3:"湎";s:2:"C";s:3:"湣";s:2:"D";s:3:"湄";s:2:"E";s:3:"湲";s:2:"F";s:3:"湩";s:2:"G";s:3:"湟";s:2:"H";s:3:"焙";s:2:"I";s:3:"焚";s:2:"J";s:3:"焦";s:2:"K";s:3:"焰";s:2:"L";s:3:"無";s:2:"M";s:3:"然";s:2:"N";s:3:"煮";s:2:"O";s:3:"焜";s:2:"P";s:3:"牌";s:2:"Q";s:3:"犄";s:2:"R";s:3:"犀";s:2:"S";s:3:"猶";s:2:"T";s:3:"猥";s:2:"U";s:3:"猴";s:2:"V";s:3:"猩";s:2:"W";s:3:"琺";s:2:"X";s:3:"琪";s:2:"Y";s:3:"琳";s:2:"Z";s:3:"琢";s:2:"[";s:3:"琥";s:2:"\";s:3:"琵";s:2:"]";s:3:"琶";s:2:"^";s:3:"琴";s:2:"_";s:3:"琯";s:2:"`";s:3:"琛";s:2:"a";s:3:"琦";s:2:"b";s:3:"琨";s:2:"c";s:3:"甥";s:2:"d";s:3:"甦";s:2:"e";s:3:"畫";s:2:"f";s:3:"番";s:2:"g";s:3:"痢";s:2:"h";s:3:"痛";s:2:"i";s:3:"痣";s:2:"j";s:3:"痙";s:2:"k";s:3:"痘";s:2:"l";s:3:"痞";s:2:"m";s:3:"痠";s:2:"n";s:3:"登";s:2:"o";s:3:"發";s:2:"p";s:3:"皖";s:2:"q";s:3:"皓";s:2:"r";s:3:"皴";s:2:"s";s:3:"盜";s:2:"t";s:3:"睏";s:2:"u";s:3:"短";s:2:"v";s:3:"硝";s:2:"w";s:3:"硬";s:2:"x";s:3:"硯";s:2:"y";s:3:"稍";s:2:"z";s:3:"稈";s:2:"{";s:3:"程";s:2:"|";s:3:"稅";s:2:"}";s:3:"稀";s:2:"~";s:3:"窘";s:2:"";s:3:"窗";s:2:"";s:3:"窖";s:2:"";s:3:"童";s:2:"";s:3:"竣";s:2:"";s:3:"等";s:2:"";s:3:"策";s:2:"";s:3:"筆";s:2:"";s:3:"筐";s:2:"";s:3:"筒";s:2:"";s:3:"答";s:2:"";s:3:"筍";s:2:"";s:3:"筋";s:2:"";s:3:"筏";s:2:"";s:3:"筑";s:2:"";s:3:"粟";s:2:"";s:3:"粥";s:2:"";s:3:"絞";s:2:"";s:3:"結";s:2:"";s:3:"絨";s:2:"";s:3:"絕";s:2:"";s:3:"紫";s:2:"";s:3:"絮";s:2:"";s:3:"絲";s:2:"";s:3:"絡";s:2:"";s:3:"給";s:2:"";s:3:"絢";s:2:"";s:3:"絰";s:2:"";s:3:"絳";s:2:"";s:3:"善";s:2:"";s:3:"翔";s:2:"";s:3:"翕";s:2:"";s:3:"耋";s:2:"";s:3:"聒";s:2:"";s:3:"肅";s:2:"";s:3:"腕";s:2:"";s:3:"腔";s:2:"";s:3:"腋";s:2:"";s:3:"腑";s:2:"";s:3:"腎";s:2:"";s:3:"脹";s:2:"";s:3:"腆";s:2:"";s:3:"脾";s:2:"";s:3:"腌";s:2:"";s:3:"腓";s:2:"";s:3:"腴";s:2:"";s:3:"舒";s:2:"";s:3:"舜";s:2:"";s:3:"菩";s:2:"";s:3:"萃";s:2:"";s:3:"菸";s:2:"";s:3:"萍";s:2:"";s:3:"菠";s:2:"";s:3:"菅";s:2:"";s:3:"萋";s:2:"";s:3:"菁";s:2:"";s:3:"華";s:2:"";s:3:"菱";s:2:"";s:3:"菴";s:2:"";s:3:"著";s:2:"";s:3:"萊";s:2:"";s:3:"菰";s:2:"";s:3:"萌";s:2:"";s:3:"菌";s:2:"";s:3:"菽";s:2:"";s:3:"菲";s:2:"";s:3:"菊";s:2:"";s:3:"萸";s:2:"";s:3:"萎";s:2:"";s:3:"萄";s:2:"";s:3:"菜";s:2:"";s:3:"萇";s:2:"";s:3:"菔";s:2:"";s:3:"菟";s:2:"";s:3:"虛";s:2:"";s:3:"蛟";s:2:"";s:3:"蛙";s:2:"";s:3:"蛭";s:2:"";s:3:"蛔";s:2:"";s:3:"蛛";s:2:"";s:3:"蛤";s:2:"";s:3:"蛐";s:2:"";s:3:"蛞";s:2:"";s:3:"街";s:2:"";s:3:"裁";s:2:"";s:3:"裂";s:2:"";s:3:"袱";s:2:"";s:3:"覃";s:2:"";s:3:"視";s:2:"";s:3:"註";s:2:"";s:3:"詠";s:2:"";s:3:"評";s:2:"";s:3:"詞";s:2:"";s:3:"証";s:2:"";s:3:"詁";s:2:"@";s:3:"詔";s:2:"A";s:3:"詛";s:2:"B";s:3:"詐";s:2:"C";s:3:"詆";s:2:"D";s:3:"訴";s:2:"E";s:3:"診";s:2:"F";s:3:"訶";s:2:"G";s:3:"詖";s:2:"H";s:3:"象";s:2:"I";s:3:"貂";s:2:"J";s:3:"貯";s:2:"K";s:3:"貼";s:2:"L";s:3:"貳";s:2:"M";s:3:"貽";s:2:"N";s:3:"賁";s:2:"O";s:3:"費";s:2:"P";s:3:"賀";s:2:"Q";s:3:"貴";s:2:"R";s:3:"買";s:2:"S";s:3:"貶";s:2:"T";s:3:"貿";s:2:"U";s:3:"貸";s:2:"V";s:3:"越";s:2:"W";s:3:"超";s:2:"X";s:3:"趁";s:2:"Y";s:3:"跎";s:2:"Z";s:3:"距";s:2:"[";s:3:"跋";s:2:"\";s:3:"跚";s:2:"]";s:3:"跑";s:2:"^";s:3:"跌";s:2:"_";s:3:"跛";s:2:"`";s:3:"跆";s:2:"a";s:3:"軻";s:2:"b";s:3:"軸";s:2:"c";s:3:"軼";s:2:"d";s:3:"辜";s:2:"e";s:3:"逮";s:2:"f";s:3:"逵";s:2:"g";s:3:"週";s:2:"h";s:3:"逸";s:2:"i";s:3:"進";s:2:"j";s:3:"逶";s:2:"k";s:3:"鄂";s:2:"l";s:3:"郵";s:2:"m";s:3:"鄉";s:2:"n";s:3:"郾";s:2:"o";s:3:"酣";s:2:"p";s:3:"酥";s:2:"q";s:3:"量";s:2:"r";s:3:"鈔";s:2:"s";s:3:"鈕";s:2:"t";s:3:"鈣";s:2:"u";s:3:"鈉";s:2:"v";s:3:"鈞";s:2:"w";s:3:"鈍";s:2:"x";s:3:"鈐";s:2:"y";s:3:"鈇";s:2:"z";s:3:"鈑";s:2:"{";s:3:"閔";s:2:"|";s:3:"閏";s:2:"}";s:3:"開";s:2:"~";s:3:"閑";s:2:"";s:3:"間";s:2:"";s:3:"閒";s:2:"";s:3:"閎";s:2:"";s:3:"隊";s:2:"";s:3:"階";s:2:"";s:3:"隋";s:2:"";s:3:"陽";s:2:"";s:3:"隅";s:2:"";s:3:"隆";s:2:"";s:3:"隍";s:2:"";s:3:"陲";s:2:"";s:3:"隄";s:2:"";s:3:"雁";s:2:"";s:3:"雅";s:2:"";s:3:"雄";s:2:"";s:3:"集";s:2:"";s:3:"雇";s:2:"";s:3:"雯";s:2:"";s:3:"雲";s:2:"";s:3:"韌";s:2:"";s:3:"項";s:2:"";s:3:"順";s:2:"";s:3:"須";s:2:"";s:3:"飧";s:2:"";s:3:"飪";s:2:"";s:3:"飯";s:2:"";s:3:"飩";s:2:"";s:3:"飲";s:2:"";s:3:"飭";s:2:"";s:3:"馮";s:2:"";s:3:"馭";s:2:"";s:3:"黃";s:2:"";s:3:"黍";s:2:"";s:3:"黑";s:2:"";s:3:"亂";s:2:"";s:3:"傭";s:2:"";s:3:"債";s:2:"";s:3:"傲";s:2:"";s:3:"傳";s:2:"";s:3:"僅";s:2:"";s:3:"傾";s:2:"";s:3:"催";s:2:"";s:3:"傷";s:2:"";s:3:"傻";s:2:"";s:3:"傯";s:2:"";s:3:"僇";s:2:"";s:3:"剿";s:2:"";s:3:"剷";s:2:"";s:3:"剽";s:2:"";s:3:"募";s:2:"";s:3:"勦";s:2:"";s:3:"勤";s:2:"";s:3:"勢";s:2:"";s:3:"勣";s:2:"";s:3:"匯";s:2:"";s:3:"嗟";s:2:"";s:3:"嗨";s:2:"";s:3:"嗓";s:2:"";s:3:"嗦";s:2:"";s:3:"嗎";s:2:"";s:3:"嗜";s:2:"";s:3:"嗇";s:2:"";s:3:"嗑";s:2:"";s:3:"嗣";s:2:"";s:3:"嗤";s:2:"";s:3:"嗯";s:2:"";s:3:"嗚";s:2:"";s:3:"嗡";s:2:"";s:3:"嗅";s:2:"";s:3:"嗆";s:2:"";s:3:"嗥";s:2:"";s:3:"嗉";s:2:"";s:3:"園";s:2:"";s:3:"圓";s:2:"";s:3:"塞";s:2:"";s:3:"塑";s:2:"";s:3:"塘";s:2:"";s:3:"塗";s:2:"";s:3:"塚";s:2:"";s:3:"塔";s:2:"";s:3:"填";s:2:"";s:3:"塌";s:2:"";s:3:"塭";s:2:"";s:3:"塊";s:2:"";s:3:"塢";s:2:"";s:3:"塒";s:2:"";s:3:"塋";s:2:"";s:3:"奧";s:2:"";s:3:"嫁";s:2:"";s:3:"嫉";s:2:"";s:3:"嫌";s:2:"";s:3:"媾";s:2:"";s:3:"媽";s:2:"";s:3:"媼";s:2:"@";s:3:"媳";s:2:"A";s:3:"嫂";s:2:"B";s:3:"媲";s:2:"C";s:3:"嵩";s:2:"D";s:3:"嵯";s:2:"E";s:3:"幌";s:2:"F";s:3:"幹";s:2:"G";s:3:"廉";s:2:"H";s:3:"廈";s:2:"I";s:3:"弒";s:2:"J";s:3:"彙";s:2:"K";s:3:"徬";s:2:"L";s:3:"微";s:2:"M";s:3:"愚";s:2:"N";s:3:"意";s:2:"O";s:3:"慈";s:2:"P";s:3:"感";s:2:"Q";s:3:"想";s:2:"R";s:3:"愛";s:2:"S";s:3:"惹";s:2:"T";s:3:"愁";s:2:"U";s:3:"愈";s:2:"V";s:3:"慎";s:2:"W";s:3:"慌";s:2:"X";s:3:"慄";s:2:"Y";s:3:"慍";s:2:"Z";s:3:"愾";s:2:"[";s:3:"愴";s:2:"\";s:3:"愧";s:2:"]";s:3:"愍";s:2:"^";s:3:"愆";s:2:"_";s:3:"愷";s:2:"`";s:3:"戡";s:2:"a";s:3:"戢";s:2:"b";s:3:"搓";s:2:"c";s:3:"搾";s:2:"d";s:3:"搞";s:2:"e";s:3:"搪";s:2:"f";s:3:"搭";s:2:"g";s:3:"搽";s:2:"h";s:3:"搬";s:2:"i";s:3:"搏";s:2:"j";s:3:"搜";s:2:"k";s:3:"搔";s:2:"l";s:3:"損";s:2:"m";s:3:"搶";s:2:"n";s:3:"搖";s:2:"o";s:3:"搗";s:2:"p";s:3:"搆";s:2:"q";s:3:"敬";s:2:"r";s:3:"斟";s:2:"s";s:3:"新";s:2:"t";s:3:"暗";s:2:"u";s:3:"暉";s:2:"v";s:3:"暇";s:2:"w";s:3:"暈";s:2:"x";s:3:"暖";s:2:"y";s:3:"暄";s:2:"z";s:3:"暘";s:2:"{";s:3:"暍";s:2:"|";s:3:"會";s:2:"}";s:3:"榔";s:2:"~";s:3:"業";s:2:"";s:3:"楚";s:2:"";s:3:"楷";s:2:"";s:3:"楠";s:2:"";s:3:"楔";s:2:"";s:3:"極";s:2:"";s:3:"椰";s:2:"";s:3:"概";s:2:"";s:3:"楊";s:2:"";s:3:"楨";s:2:"";s:3:"楫";s:2:"";s:3:"楞";s:2:"";s:3:"楓";s:2:"";s:3:"楹";s:2:"";s:3:"榆";s:2:"";s:3:"楝";s:2:"";s:3:"楣";s:2:"";s:3:"楛";s:2:"";s:3:"歇";s:2:"";s:3:"歲";s:2:"";s:3:"毀";s:2:"";s:3:"殿";s:2:"";s:3:"毓";s:2:"";s:3:"毽";s:2:"";s:3:"溢";s:2:"";s:3:"溯";s:2:"";s:3:"滓";s:2:"";s:3:"溶";s:2:"";s:3:"滂";s:2:"";s:3:"源";s:2:"";s:3:"溝";s:2:"";s:3:"滇";s:2:"";s:3:"滅";s:2:"";s:3:"溥";s:2:"";s:3:"溘";s:2:"";s:3:"溼";s:2:"";s:3:"溺";s:2:"";s:3:"溫";s:2:"";s:3:"滑";s:2:"";s:3:"準";s:2:"";s:3:"溜";s:2:"";s:3:"滄";s:2:"";s:3:"滔";s:2:"";s:3:"溪";s:2:"";s:3:"溧";s:2:"";s:3:"溴";s:2:"";s:3:"煎";s:2:"";s:3:"煙";s:2:"";s:3:"煩";s:2:"";s:3:"煤";s:2:"";s:3:"煉";s:2:"";s:3:"照";s:2:"";s:3:"煜";s:2:"";s:3:"煬";s:2:"";s:3:"煦";s:2:"";s:3:"煌";s:2:"";s:3:"煥";s:2:"";s:3:"煞";s:2:"";s:3:"煆";s:2:"";s:3:"煨";s:2:"";s:3:"煖";s:2:"";s:3:"爺";s:2:"";s:3:"牒";s:2:"";s:3:"猷";s:2:"";s:3:"獅";s:2:"";s:3:"猿";s:2:"";s:3:"猾";s:2:"";s:3:"瑯";s:2:"";s:3:"瑚";s:2:"";s:3:"瑕";s:2:"";s:3:"瑟";s:2:"";s:3:"瑞";s:2:"";s:3:"瑁";s:2:"";s:3:"琿";s:2:"";s:3:"瑙";s:2:"";s:3:"瑛";s:2:"";s:3:"瑜";s:2:"";s:3:"當";s:2:"";s:3:"畸";s:2:"";s:3:"瘀";s:2:"";s:3:"痰";s:2:"";s:3:"瘁";s:2:"";s:3:"痲";s:2:"";s:3:"痱";s:2:"";s:3:"痺";s:2:"";s:3:"痿";s:2:"";s:3:"痴";s:2:"";s:3:"痳";s:2:"";s:3:"盞";s:2:"";s:3:"盟";s:2:"";s:3:"睛";s:2:"";s:3:"睫";s:2:"";s:3:"睦";s:2:"";s:3:"睞";s:2:"";s:3:"督";s:2:"@";s:3:"睹";s:2:"A";s:3:"睪";s:2:"B";s:3:"睬";s:2:"C";s:3:"睜";s:2:"D";s:3:"睥";s:2:"E";s:3:"睨";s:2:"F";s:3:"睢";s:2:"G";s:3:"矮";s:2:"H";s:3:"碎";s:2:"I";s:3:"碰";s:2:"J";s:3:"碗";s:2:"K";s:3:"碘";s:2:"L";s:3:"碌";s:2:"M";s:3:"碉";s:2:"N";s:3:"硼";s:2:"O";s:3:"碑";s:2:"P";s:3:"碓";s:2:"Q";s:3:"硿";s:2:"R";s:3:"祺";s:2:"S";s:3:"祿";s:2:"T";s:3:"禁";s:2:"U";s:3:"萬";s:2:"V";s:3:"禽";s:2:"W";s:3:"稜";s:2:"X";s:3:"稚";s:2:"Y";s:3:"稠";s:2:"Z";s:3:"稔";s:2:"[";s:3:"稟";s:2:"\";s:3:"稞";s:2:"]";s:3:"窟";s:2:"^";s:3:"窠";s:2:"_";s:3:"筷";s:2:"`";s:3:"節";s:2:"a";s:3:"筠";s:2:"b";s:3:"筮";s:2:"c";s:3:"筧";s:2:"d";s:3:"粱";s:2:"e";s:3:"粳";s:2:"f";s:3:"粵";s:2:"g";s:3:"經";s:2:"h";s:3:"絹";s:2:"i";s:3:"綑";s:2:"j";s:3:"綁";s:2:"k";s:3:"綏";s:2:"l";s:3:"絛";s:2:"m";s:3:"置";s:2:"n";s:3:"罩";s:2:"o";s:3:"罪";s:2:"p";s:3:"署";s:2:"q";s:3:"義";s:2:"r";s:3:"羨";s:2:"s";s:3:"群";s:2:"t";s:3:"聖";s:2:"u";s:3:"聘";s:2:"v";s:3:"肆";s:2:"w";s:3:"肄";s:2:"x";s:3:"腱";s:2:"y";s:3:"腰";s:2:"z";s:3:"腸";s:2:"{";s:3:"腥";s:2:"|";s:3:"腮";s:2:"}";s:3:"腳";s:2:"~";s:3:"腫";s:2:"";s:3:"腹";s:2:"";s:3:"腺";s:2:"";s:3:"腦";s:2:"";s:3:"舅";s:2:"";s:3:"艇";s:2:"";s:3:"蒂";s:2:"";s:3:"葷";s:2:"";s:3:"落";s:2:"";s:3:"萱";s:2:"";s:3:"葵";s:2:"";s:3:"葦";s:2:"";s:3:"葫";s:2:"";s:3:"葉";s:2:"";s:3:"葬";s:2:"";s:3:"葛";s:2:"";s:3:"萼";s:2:"";s:3:"萵";s:2:"";s:3:"葡";s:2:"";s:3:"董";s:2:"";s:3:"葩";s:2:"";s:3:"葭";s:2:"";s:3:"葆";s:2:"";s:3:"虞";s:2:"";s:3:"虜";s:2:"";s:3:"號";s:2:"";s:3:"蛹";s:2:"";s:3:"蜓";s:2:"";s:3:"蜈";s:2:"";s:3:"蜇";s:2:"";s:3:"蜀";s:2:"";s:3:"蛾";s:2:"";s:3:"蛻";s:2:"";s:3:"蜂";s:2:"";s:3:"蜃";s:2:"";s:3:"蜆";s:2:"";s:3:"蜊";s:2:"";s:3:"衙";s:2:"";s:3:"裟";s:2:"";s:3:"裔";s:2:"";s:3:"裙";s:2:"";s:3:"補";s:2:"";s:3:"裘";s:2:"";s:3:"裝";s:2:"";s:3:"裡";s:2:"";s:3:"裊";s:2:"";s:3:"裕";s:2:"";s:3:"裒";s:2:"";s:3:"覜";s:2:"";s:3:"解";s:2:"";s:3:"詫";s:2:"";s:3:"該";s:2:"";s:3:"詳";s:2:"";s:3:"試";s:2:"";s:3:"詩";s:2:"";s:3:"詰";s:2:"";s:3:"誇";s:2:"";s:3:"詼";s:2:"";s:3:"詣";s:2:"";s:3:"誠";s:2:"";s:3:"話";s:2:"";s:3:"誅";s:2:"";s:3:"詭";s:2:"";s:3:"詢";s:2:"";s:3:"詮";s:2:"";s:3:"詬";s:2:"";s:3:"詹";s:2:"";s:3:"詻";s:2:"";s:3:"訾";s:2:"";s:3:"詨";s:2:"";s:3:"豢";s:2:"";s:3:"貊";s:2:"";s:3:"貉";s:2:"";s:3:"賊";s:2:"";s:3:"資";s:2:"";s:3:"賈";s:2:"";s:3:"賄";s:2:"";s:3:"貲";s:2:"";s:3:"賃";s:2:"";s:3:"賂";s:2:"";s:3:"賅";s:2:"";s:3:"跡";s:2:"";s:3:"跟";s:2:"";s:3:"跨";s:2:"";s:3:"路";s:2:"";s:3:"跳";s:2:"";s:3:"跺";s:2:"";s:3:"跪";s:2:"";s:3:"跤";s:2:"";s:3:"跦";s:2:"";s:3:"躲";s:2:"";s:3:"較";s:2:"";s:3:"載";s:2:"";s:3:"軾";s:2:"";s:3:"輊";s:2:"@";s:3:"辟";s:2:"A";s:3:"農";s:2:"B";s:3:"運";s:2:"C";s:3:"遊";s:2:"D";s:3:"道";s:2:"E";s:3:"遂";s:2:"F";s:3:"達";s:2:"G";s:3:"逼";s:2:"H";s:3:"違";s:2:"I";s:3:"遐";s:2:"J";s:3:"遇";s:2:"K";s:3:"遏";s:2:"L";s:3:"過";s:2:"M";s:3:"遍";s:2:"N";s:3:"遑";s:2:"O";s:3:"逾";s:2:"P";s:3:"遁";s:2:"Q";s:3:"鄒";s:2:"R";s:3:"鄗";s:2:"S";s:3:"酬";s:2:"T";s:3:"酪";s:2:"U";s:3:"酩";s:2:"V";s:3:"釉";s:2:"W";s:3:"鈷";s:2:"X";s:3:"鉗";s:2:"Y";s:3:"鈸";s:2:"Z";s:3:"鈽";s:2:"[";s:3:"鉀";s:2:"\";s:3:"鈾";s:2:"]";s:3:"鉛";s:2:"^";s:3:"鉋";s:2:"_";s:3:"鉤";s:2:"`";s:3:"鉑";s:2:"a";s:3:"鈴";s:2:"b";s:3:"鉉";s:2:"c";s:3:"鉍";s:2:"d";s:3:"鉅";s:2:"e";s:3:"鈹";s:2:"f";s:3:"鈿";s:2:"g";s:3:"鉚";s:2:"h";s:3:"閘";s:2:"i";s:3:"隘";s:2:"j";s:3:"隔";s:2:"k";s:3:"隕";s:2:"l";s:3:"雍";s:2:"m";s:3:"雋";s:2:"n";s:3:"雉";s:2:"o";s:3:"雊";s:2:"p";s:3:"雷";s:2:"q";s:3:"電";s:2:"r";s:3:"雹";s:2:"s";s:3:"零";s:2:"t";s:3:"靖";s:2:"u";s:3:"靴";s:2:"v";s:3:"靶";s:2:"w";s:3:"預";s:2:"x";s:3:"頑";s:2:"y";s:3:"頓";s:2:"z";s:3:"頊";s:2:"{";s:3:"頒";s:2:"|";s:3:"頌";s:2:"}";s:3:"飼";s:2:"~";s:3:"飴";s:2:"";s:3:"飽";s:2:"";s:3:"飾";s:2:"";s:3:"馳";s:2:"";s:3:"馱";s:2:"";s:3:"馴";s:2:"";s:3:"髡";s:2:"";s:3:"鳩";s:2:"";s:3:"麂";s:2:"";s:3:"鼎";s:2:"";s:3:"鼓";s:2:"";s:3:"鼠";s:2:"";s:3:"僧";s:2:"";s:3:"僮";s:2:"";s:3:"僥";s:2:"";s:3:"僖";s:2:"";s:3:"僭";s:2:"";s:3:"僚";s:2:"";s:3:"僕";s:2:"";s:3:"像";s:2:"";s:3:"僑";s:2:"";s:3:"僱";s:2:"";s:3:"僎";s:2:"";s:3:"僩";s:2:"";s:3:"兢";s:2:"";s:3:"凳";s:2:"";s:3:"劃";s:2:"";s:3:"劂";s:2:"";s:3:"匱";s:2:"";s:3:"厭";s:2:"";s:3:"嗾";s:2:"";s:3:"嘀";s:2:"";s:3:"嘛";s:2:"";s:3:"嘗";s:2:"";s:3:"嗽";s:2:"";s:3:"嘔";s:2:"";s:3:"嘆";s:2:"";s:3:"嘉";s:2:"";s:3:"嘍";s:2:"";s:3:"嘎";s:2:"";s:3:"嗷";s:2:"";s:3:"嘖";s:2:"";s:3:"嘟";s:2:"";s:3:"嘈";s:2:"";s:3:"嘐";s:2:"";s:3:"嗶";s:2:"";s:3:"團";s:2:"";s:3:"圖";s:2:"";s:3:"塵";s:2:"";s:3:"塾";s:2:"";s:3:"境";s:2:"";s:3:"墓";s:2:"";s:3:"墊";s:2:"";s:3:"塹";s:2:"";s:3:"墅";s:2:"";s:3:"塽";s:2:"";s:3:"壽";s:2:"";s:3:"夥";s:2:"";s:3:"夢";s:2:"";s:3:"夤";s:2:"";s:3:"奪";s:2:"";s:3:"奩";s:2:"";s:3:"嫡";s:2:"";s:3:"嫦";s:2:"";s:3:"嫩";s:2:"";s:3:"嫗";s:2:"";s:3:"嫖";s:2:"";s:3:"嫘";s:2:"";s:3:"嫣";s:2:"";s:3:"孵";s:2:"";s:3:"寞";s:2:"";s:3:"寧";s:2:"";s:3:"寡";s:2:"";s:3:"寥";s:2:"";s:3:"實";s:2:"";s:3:"寨";s:2:"";s:3:"寢";s:2:"";s:3:"寤";s:2:"";s:3:"察";s:2:"";s:3:"對";s:2:"";s:3:"屢";s:2:"";s:3:"嶄";s:2:"";s:3:"嶇";s:2:"";s:3:"幛";s:2:"";s:3:"幣";s:2:"";s:3:"幕";s:2:"";s:3:"幗";s:2:"";s:3:"幔";s:2:"";s:3:"廓";s:2:"";s:3:"廖";s:2:"";s:3:"弊";s:2:"";s:3:"彆";s:2:"";s:3:"彰";s:2:"";s:3:"徹";s:2:"";s:3:"慇";s:2:"@";s:3:"愿";s:2:"A";s:3:"態";s:2:"B";s:3:"慷";s:2:"C";s:3:"慢";s:2:"D";s:3:"慣";s:2:"E";s:3:"慟";s:2:"F";s:3:"慚";s:2:"G";s:3:"慘";s:2:"H";s:3:"慵";s:2:"I";s:3:"截";s:2:"J";s:3:"撇";s:2:"K";s:3:"摘";s:2:"L";s:3:"摔";s:2:"M";s:3:"撤";s:2:"N";s:3:"摸";s:2:"O";s:3:"摟";s:2:"P";s:3:"摺";s:2:"Q";s:3:"摑";s:2:"R";s:3:"摧";s:2:"S";s:3:"搴";s:2:"T";s:3:"摭";s:2:"U";s:3:"摻";s:2:"V";s:3:"敲";s:2:"W";s:3:"斡";s:2:"X";s:3:"旗";s:2:"Y";s:3:"旖";s:2:"Z";s:3:"暢";s:2:"[";s:3:"暨";s:2:"\";s:3:"暝";s:2:"]";s:3:"榜";s:2:"^";s:3:"榨";s:2:"_";s:3:"榕";s:2:"`";s:3:"槁";s:2:"a";s:3:"榮";s:2:"b";s:3:"槓";s:2:"c";s:3:"構";s:2:"d";s:3:"榛";s:2:"e";s:3:"榷";s:2:"f";s:3:"榻";s:2:"g";s:3:"榫";s:2:"h";s:3:"榴";s:2:"i";s:3:"槐";s:2:"j";s:3:"槍";s:2:"k";s:3:"榭";s:2:"l";s:3:"槌";s:2:"m";s:3:"榦";s:2:"n";s:3:"槃";s:2:"o";s:3:"榣";s:2:"p";s:3:"歉";s:2:"q";s:3:"歌";s:2:"r";s:3:"氳";s:2:"s";s:3:"漳";s:2:"t";s:3:"演";s:2:"u";s:3:"滾";s:2:"v";s:3:"漓";s:2:"w";s:3:"滴";s:2:"x";s:3:"漩";s:2:"y";s:3:"漾";s:2:"z";s:3:"漠";s:2:"{";s:3:"漬";s:2:"|";s:3:"漏";s:2:"}";s:3:"漂";s:2:"~";s:3:"漢";s:2:"";s:3:"滿";s:2:"";s:3:"滯";s:2:"";s:3:"漆";s:2:"";s:3:"漱";s:2:"";s:3:"漸";s:2:"";s:3:"漲";s:2:"";s:3:"漣";s:2:"";s:3:"漕";s:2:"";s:3:"漫";s:2:"";s:3:"漯";s:2:"";s:3:"澈";s:2:"";s:3:"漪";s:2:"";s:3:"滬";s:2:"";s:3:"漁";s:2:"";s:3:"滲";s:2:"";s:3:"滌";s:2:"";s:3:"滷";s:2:"";s:3:"熔";s:2:"";s:3:"熙";s:2:"";s:3:"煽";s:2:"";s:3:"熊";s:2:"";s:3:"熄";s:2:"";s:3:"熒";s:2:"";s:3:"爾";s:2:"";s:3:"犒";s:2:"";s:3:"犖";s:2:"";s:3:"獄";s:2:"";s:3:"獐";s:2:"";s:3:"瑤";s:2:"";s:3:"瑣";s:2:"";s:3:"瑪";s:2:"";s:3:"瑰";s:2:"";s:3:"瑭";s:2:"";s:3:"甄";s:2:"";s:3:"疑";s:2:"";s:3:"瘧";s:2:"";s:3:"瘍";s:2:"";s:3:"瘋";s:2:"";s:3:"瘉";s:2:"";s:3:"瘓";s:2:"";s:3:"盡";s:2:"";s:3:"監";s:2:"";s:3:"瞄";s:2:"";s:3:"睽";s:2:"";s:3:"睿";s:2:"";s:3:"睡";s:2:"";s:3:"磁";s:2:"";s:3:"碟";s:2:"";s:3:"碧";s:2:"";s:3:"碳";s:2:"";s:3:"碩";s:2:"";s:3:"碣";s:2:"";s:3:"禎";s:2:"";s:3:"福";s:2:"";s:3:"禍";s:2:"";s:3:"種";s:2:"";s:3:"稱";s:2:"";s:3:"窪";s:2:"";s:3:"窩";s:2:"";s:3:"竭";s:2:"";s:3:"端";s:2:"";s:3:"管";s:2:"";s:3:"箕";s:2:"";s:3:"箋";s:2:"";s:3:"筵";s:2:"";s:3:"算";s:2:"";s:3:"箝";s:2:"";s:3:"箔";s:2:"";s:3:"箏";s:2:"";s:3:"箸";s:2:"";s:3:"箇";s:2:"";s:3:"箄";s:2:"";s:3:"粹";s:2:"";s:3:"粽";s:2:"";s:3:"精";s:2:"";s:3:"綻";s:2:"";s:3:"綰";s:2:"";s:3:"綜";s:2:"";s:3:"綽";s:2:"";s:3:"綾";s:2:"";s:3:"綠";s:2:"";s:3:"緊";s:2:"";s:3:"綴";s:2:"";s:3:"網";s:2:"";s:3:"綱";s:2:"";s:3:"綺";s:2:"";s:3:"綢";s:2:"";s:3:"綿";s:2:"";s:3:"綵";s:2:"";s:3:"綸";s:2:"";s:3:"維";s:2:"";s:3:"緒";s:2:"";s:3:"緇";s:2:"";s:3:"綬";s:2:"@";s:3:"罰";s:2:"A";s:3:"翠";s:2:"B";s:3:"翡";s:2:"C";s:3:"翟";s:2:"D";s:3:"聞";s:2:"E";s:3:"聚";s:2:"F";s:3:"肇";s:2:"G";s:3:"腐";s:2:"H";s:3:"膀";s:2:"I";s:3:"膏";s:2:"J";s:3:"膈";s:2:"K";s:3:"膊";s:2:"L";s:3:"腿";s:2:"M";s:3:"膂";s:2:"N";s:3:"臧";s:2:"O";s:3:"臺";s:2:"P";s:3:"與";s:2:"Q";s:3:"舔";s:2:"R";s:3:"舞";s:2:"S";s:3:"艋";s:2:"T";s:3:"蓉";s:2:"U";s:3:"蒿";s:2:"V";s:3:"蓆";s:2:"W";s:3:"蓄";s:2:"X";s:3:"蒙";s:2:"Y";s:3:"蒞";s:2:"Z";s:3:"蒲";s:2:"[";s:3:"蒜";s:2:"\";s:3:"蓋";s:2:"]";s:3:"蒸";s:2:"^";s:3:"蓀";s:2:"_";s:3:"蓓";s:2:"`";s:3:"蒐";s:2:"a";s:3:"蒼";s:2:"b";s:3:"蓑";s:2:"c";s:3:"蓊";s:2:"d";s:3:"蜿";s:2:"e";s:3:"蜜";s:2:"f";s:3:"蜻";s:2:"g";s:3:"蜢";s:2:"h";s:3:"蜥";s:2:"i";s:3:"蜴";s:2:"j";s:3:"蜘";s:2:"k";s:3:"蝕";s:2:"l";s:3:"蜷";s:2:"m";s:3:"蜩";s:2:"n";s:3:"裳";s:2:"o";s:3:"褂";s:2:"p";s:3:"裴";s:2:"q";s:3:"裹";s:2:"r";s:3:"裸";s:2:"s";s:3:"製";s:2:"t";s:3:"裨";s:2:"u";s:3:"褚";s:2:"v";s:3:"裯";s:2:"w";s:3:"誦";s:2:"x";s:3:"誌";s:2:"y";s:3:"語";s:2:"z";s:3:"誣";s:2:"{";s:3:"認";s:2:"|";s:3:"誡";s:2:"}";s:3:"誓";s:2:"~";s:3:"誤";s:2:"";s:3:"說";s:2:"";s:3:"誥";s:2:"";s:3:"誨";s:2:"";s:3:"誘";s:2:"";s:3:"誑";s:2:"";s:3:"誚";s:2:"";s:3:"誧";s:2:"";s:3:"豪";s:2:"";s:3:"貍";s:2:"";s:3:"貌";s:2:"";s:3:"賓";s:2:"";s:3:"賑";s:2:"";s:3:"賒";s:2:"";s:3:"赫";s:2:"";s:3:"趙";s:2:"";s:3:"趕";s:2:"";s:3:"跼";s:2:"";s:3:"輔";s:2:"";s:3:"輒";s:2:"";s:3:"輕";s:2:"";s:3:"輓";s:2:"";s:3:"辣";s:2:"";s:3:"遠";s:2:"";s:3:"遘";s:2:"";s:3:"遜";s:2:"";s:3:"遣";s:2:"";s:3:"遙";s:2:"";s:3:"遞";s:2:"";s:3:"遢";s:2:"";s:3:"遝";s:2:"";s:3:"遛";s:2:"";s:3:"鄙";s:2:"";s:3:"鄘";s:2:"";s:3:"鄞";s:2:"";s:3:"酵";s:2:"";s:3:"酸";s:2:"";s:3:"酷";s:2:"";s:3:"酴";s:2:"";s:3:"鉸";s:2:"";s:3:"銀";s:2:"";s:3:"銅";s:2:"";s:3:"銘";s:2:"";s:3:"銖";s:2:"";s:3:"鉻";s:2:"";s:3:"銓";s:2:"";s:3:"銜";s:2:"";s:3:"銨";s:2:"";s:3:"鉼";s:2:"";s:3:"銑";s:2:"";s:3:"閡";s:2:"";s:3:"閨";s:2:"";s:3:"閩";s:2:"";s:3:"閣";s:2:"";s:3:"閥";s:2:"";s:3:"閤";s:2:"";s:3:"隙";s:2:"";s:3:"障";s:2:"";s:3:"際";s:2:"";s:3:"雌";s:2:"";s:3:"雒";s:2:"";s:3:"需";s:2:"";s:3:"靼";s:2:"";s:3:"鞅";s:2:"";s:3:"韶";s:2:"";s:3:"頗";s:2:"";s:3:"領";s:2:"";s:3:"颯";s:2:"";s:3:"颱";s:2:"";s:3:"餃";s:2:"";s:3:"餅";s:2:"";s:3:"餌";s:2:"";s:3:"餉";s:2:"";s:3:"駁";s:2:"";s:3:"骯";s:2:"";s:3:"骰";s:2:"";s:3:"髦";s:2:"";s:3:"魁";s:2:"";s:3:"魂";s:2:"";s:3:"鳴";s:2:"";s:3:"鳶";s:2:"";s:3:"鳳";s:2:"";s:3:"麼";s:2:"";s:3:"鼻";s:2:"";s:3:"齊";s:2:"";s:3:"億";s:2:"";s:3:"儀";s:2:"";s:3:"僻";s:2:"";s:3:"僵";s:2:"";s:3:"價";s:2:"";s:3:"儂";s:2:"";s:3:"儈";s:2:"";s:3:"儉";s:2:"";s:3:"儅";s:2:"";s:3:"凜";s:2:"@";s:3:"劇";s:2:"A";s:3:"劈";s:2:"B";s:3:"劉";s:2:"C";s:3:"劍";s:2:"D";s:3:"劊";s:2:"E";s:3:"勰";s:2:"F";s:3:"厲";s:2:"G";s:3:"嘮";s:2:"H";s:3:"嘻";s:2:"I";s:3:"嘹";s:2:"J";s:3:"嘲";s:2:"K";s:3:"嘿";s:2:"L";s:3:"嘴";s:2:"M";s:3:"嘩";s:2:"N";s:3:"噓";s:2:"O";s:3:"噎";s:2:"P";s:3:"噗";s:2:"Q";s:3:"噴";s:2:"R";s:3:"嘶";s:2:"S";s:3:"嘯";s:2:"T";s:3:"嘰";s:2:"U";s:3:"墀";s:2:"V";s:3:"墟";s:2:"W";s:3:"增";s:2:"X";s:3:"墳";s:2:"Y";s:3:"墜";s:2:"Z";s:3:"墮";s:2:"[";s:3:"墩";s:2:"\";s:3:"墦";s:2:"]";s:3:"奭";s:2:"^";s:3:"嬉";s:2:"_";s:3:"嫻";s:2:"`";s:3:"嬋";s:2:"a";s:3:"嫵";s:2:"b";s:3:"嬌";s:2:"c";s:3:"嬈";s:2:"d";s:3:"寮";s:2:"e";s:3:"寬";s:2:"f";s:3:"審";s:2:"g";s:3:"寫";s:2:"h";s:3:"層";s:2:"i";s:3:"履";s:2:"j";s:3:"嶝";s:2:"k";s:3:"嶔";s:2:"l";s:3:"幢";s:2:"m";s:3:"幟";s:2:"n";s:3:"幡";s:2:"o";s:3:"廢";s:2:"p";s:3:"廚";s:2:"q";s:3:"廟";s:2:"r";s:3:"廝";s:2:"s";s:3:"廣";s:2:"t";s:3:"廠";s:2:"u";s:3:"彈";s:2:"v";s:3:"影";s:2:"w";s:3:"德";s:2:"x";s:3:"徵";s:2:"y";s:3:"慶";s:2:"z";s:3:"慧";s:2:"{";s:3:"慮";s:2:"|";s:3:"慝";s:2:"}";s:3:"慕";s:2:"~";s:3:"憂";s:2:"";s:3:"慼";s:2:"";s:3:"慰";s:2:"";s:3:"慫";s:2:"";s:3:"慾";s:2:"";s:3:"憧";s:2:"";s:3:"憐";s:2:"";s:3:"憫";s:2:"";s:3:"憎";s:2:"";s:3:"憬";s:2:"";s:3:"憚";s:2:"";s:3:"憤";s:2:"";s:3:"憔";s:2:"";s:3:"憮";s:2:"";s:3:"戮";s:2:"";s:3:"摩";s:2:"";s:3:"摯";s:2:"";s:3:"摹";s:2:"";s:3:"撞";s:2:"";s:3:"撲";s:2:"";s:3:"撈";s:2:"";s:3:"撐";s:2:"";s:3:"撰";s:2:"";s:3:"撥";s:2:"";s:3:"撓";s:2:"";s:3:"撕";s:2:"";s:3:"撩";s:2:"";s:3:"撒";s:2:"";s:3:"撮";s:2:"";s:3:"播";s:2:"";s:3:"撫";s:2:"";s:3:"撚";s:2:"";s:3:"撬";s:2:"";s:3:"撙";s:2:"";s:3:"撢";s:2:"";s:3:"撳";s:2:"";s:3:"敵";s:2:"";s:3:"敷";s:2:"";s:3:"數";s:2:"";s:3:"暮";s:2:"";s:3:"暫";s:2:"";s:3:"暴";s:2:"";s:3:"暱";s:2:"";s:3:"樣";s:2:"";s:3:"樟";s:2:"";s:3:"槨";s:2:"";s:3:"樁";s:2:"";s:3:"樞";s:2:"";s:3:"標";s:2:"";s:3:"槽";s:2:"";s:3:"模";s:2:"";s:3:"樓";s:2:"";s:3:"樊";s:2:"";s:3:"槳";s:2:"";s:3:"樂";s:2:"";s:3:"樅";s:2:"";s:3:"槭";s:2:"";s:3:"樑";s:2:"";s:3:"歐";s:2:"";s:3:"歎";s:2:"";s:3:"殤";s:2:"";s:3:"毅";s:2:"";s:3:"毆";s:2:"";s:3:"漿";s:2:"";s:3:"潼";s:2:"";s:3:"澄";s:2:"";s:3:"潑";s:2:"";s:3:"潦";s:2:"";s:3:"潔";s:2:"";s:3:"澆";s:2:"";s:3:"潭";s:2:"";s:3:"潛";s:2:"";s:3:"潸";s:2:"";s:3:"潮";s:2:"";s:3:"澎";s:2:"";s:3:"潺";s:2:"";s:3:"潰";s:2:"";s:3:"潤";s:2:"";s:3:"澗";s:2:"";s:3:"潘";s:2:"";s:3:"滕";s:2:"";s:3:"潯";s:2:"";s:3:"潠";s:2:"";s:3:"潟";s:2:"";s:3:"熟";s:2:"";s:3:"熬";s:2:"";s:3:"熱";s:2:"";s:3:"熨";s:2:"";s:3:"牖";s:2:"";s:3:"犛";s:2:"";s:3:"獎";s:2:"";s:3:"獗";s:2:"";s:3:"瑩";s:2:"";s:3:"璋";s:2:"";s:3:"璃";s:2:"@";s:3:"瑾";s:2:"A";s:3:"璀";s:2:"B";s:3:"畿";s:2:"C";s:3:"瘠";s:2:"D";s:3:"瘩";s:2:"E";s:3:"瘟";s:2:"F";s:3:"瘤";s:2:"G";s:3:"瘦";s:2:"H";s:3:"瘡";s:2:"I";s:3:"瘢";s:2:"J";s:3:"皚";s:2:"K";s:3:"皺";s:2:"L";s:3:"盤";s:2:"M";s:3:"瞎";s:2:"N";s:3:"瞇";s:2:"O";s:3:"瞌";s:2:"P";s:3:"瞑";s:2:"Q";s:3:"瞋";s:2:"R";s:3:"磋";s:2:"S";s:3:"磅";s:2:"T";s:3:"確";s:2:"U";s:3:"磊";s:2:"V";s:3:"碾";s:2:"W";s:3:"磕";s:2:"X";s:3:"碼";s:2:"Y";s:3:"磐";s:2:"Z";s:3:"稿";s:2:"[";s:3:"稼";s:2:"\";s:3:"穀";s:2:"]";s:3:"稽";s:2:"^";s:3:"稷";s:2:"_";s:3:"稻";s:2:"`";s:3:"窯";s:2:"a";s:3:"窮";s:2:"b";s:3:"箭";s:2:"c";s:3:"箱";s:2:"d";s:3:"範";s:2:"e";s:3:"箴";s:2:"f";s:3:"篆";s:2:"g";s:3:"篇";s:2:"h";s:3:"篁";s:2:"i";s:3:"箠";s:2:"j";s:3:"篌";s:2:"k";s:3:"糊";s:2:"l";s:3:"締";s:2:"m";s:3:"練";s:2:"n";s:3:"緯";s:2:"o";s:3:"緻";s:2:"p";s:3:"緘";s:2:"q";s:3:"緬";s:2:"r";s:3:"緝";s:2:"s";s:3:"編";s:2:"t";s:3:"緣";s:2:"u";s:3:"線";s:2:"v";s:3:"緞";s:2:"w";s:3:"緩";s:2:"x";s:3:"綞";s:2:"y";s:3:"緙";s:2:"z";s:3:"緲";s:2:"{";s:3:"緹";s:2:"|";s:3:"罵";s:2:"}";s:3:"罷";s:2:"~";s:3:"羯";s:2:"";s:3:"翩";s:2:"";s:3:"耦";s:2:"";s:3:"膛";s:2:"";s:3:"膜";s:2:"";s:3:"膝";s:2:"";s:3:"膠";s:2:"";s:3:"膚";s:2:"";s:3:"膘";s:2:"";s:3:"蔗";s:2:"";s:3:"蔽";s:2:"";s:3:"蔚";s:2:"";s:3:"蓮";s:2:"";s:3:"蔬";s:2:"";s:3:"蔭";s:2:"";s:3:"蔓";s:2:"";s:3:"蔑";s:2:"";s:3:"蔣";s:2:"";s:3:"蔡";s:2:"";s:3:"蔔";s:2:"";s:3:"蓬";s:2:"";s:3:"蔥";s:2:"";s:3:"蓿";s:2:"";s:3:"蔆";s:2:"";s:3:"螂";s:2:"";s:3:"蝴";s:2:"";s:3:"蝶";s:2:"";s:3:"蝠";s:2:"";s:3:"蝦";s:2:"";s:3:"蝸";s:2:"";s:3:"蝨";s:2:"";s:3:"蝙";s:2:"";s:3:"蝗";s:2:"";s:3:"蝌";s:2:"";s:3:"蝓";s:2:"";s:3:"衛";s:2:"";s:3:"衝";s:2:"";s:3:"褐";s:2:"";s:3:"複";s:2:"";s:3:"褒";s:2:"";s:3:"褓";s:2:"";s:3:"褕";s:2:"";s:3:"褊";s:2:"";s:3:"誼";s:2:"";s:3:"諒";s:2:"";s:3:"談";s:2:"";s:3:"諄";s:2:"";s:3:"誕";s:2:"";s:3:"請";s:2:"";s:3:"諸";s:2:"";s:3:"課";s:2:"";s:3:"諉";s:2:"";s:3:"諂";s:2:"";s:3:"調";s:2:"";s:3:"誰";s:2:"";s:3:"論";s:2:"";s:3:"諍";s:2:"";s:3:"誶";s:2:"";s:3:"誹";s:2:"";s:3:"諛";s:2:"";s:3:"豌";s:2:"";s:3:"豎";s:2:"";s:3:"豬";s:2:"";s:3:"賠";s:2:"";s:3:"賞";s:2:"";s:3:"賦";s:2:"";s:3:"賤";s:2:"";s:3:"賬";s:2:"";s:3:"賭";s:2:"";s:3:"賢";s:2:"";s:3:"賣";s:2:"";s:3:"賜";s:2:"";s:3:"質";s:2:"";s:3:"賡";s:2:"";s:3:"赭";s:2:"";s:3:"趟";s:2:"";s:3:"趣";s:2:"";s:3:"踫";s:2:"";s:3:"踐";s:2:"";s:3:"踝";s:2:"";s:3:"踢";s:2:"";s:3:"踏";s:2:"";s:3:"踩";s:2:"";s:3:"踟";s:2:"";s:3:"踡";s:2:"";s:3:"踞";s:2:"";s:3:"躺";s:2:"";s:3:"輝";s:2:"";s:3:"輛";s:2:"";s:3:"輟";s:2:"";s:3:"輩";s:2:"";s:3:"輦";s:2:"";s:3:"輪";s:2:"";s:3:"輜";s:2:"";s:3:"輞";s:2:"@";s:3:"輥";s:2:"A";s:3:"適";s:2:"B";s:3:"遮";s:2:"C";s:3:"遨";s:2:"D";s:3:"遭";s:2:"E";s:3:"遷";s:2:"F";s:3:"鄰";s:2:"G";s:3:"鄭";s:2:"H";s:3:"鄧";s:2:"I";s:3:"鄱";s:2:"J";s:3:"醇";s:2:"K";s:3:"醉";s:2:"L";s:3:"醋";s:2:"M";s:3:"醃";s:2:"N";s:3:"鋅";s:2:"O";s:3:"銻";s:2:"P";s:3:"銷";s:2:"Q";s:3:"鋪";s:2:"R";s:3:"銬";s:2:"S";s:3:"鋤";s:2:"T";s:3:"鋁";s:2:"U";s:3:"銳";s:2:"V";s:3:"銼";s:2:"W";s:3:"鋒";s:2:"X";s:3:"鋇";s:2:"Y";s:3:"鋰";s:2:"Z";s:3:"銲";s:2:"[";s:3:"閭";s:2:"\";s:3:"閱";s:2:"]";s:3:"霄";s:2:"^";s:3:"霆";s:2:"_";s:3:"震";s:2:"`";s:3:"霉";s:2:"a";s:3:"靠";s:2:"b";s:3:"鞍";s:2:"c";s:3:"鞋";s:2:"d";s:3:"鞏";s:2:"e";s:3:"頡";s:2:"f";s:3:"頫";s:2:"g";s:3:"頜";s:2:"h";s:3:"颳";s:2:"i";s:3:"養";s:2:"j";s:3:"餓";s:2:"k";s:3:"餒";s:2:"l";s:3:"餘";s:2:"m";s:3:"駝";s:2:"n";s:3:"駐";s:2:"o";s:3:"駟";s:2:"p";s:3:"駛";s:2:"q";s:3:"駑";s:2:"r";s:3:"駕";s:2:"s";s:3:"駒";s:2:"t";s:3:"駙";s:2:"u";s:3:"骷";s:2:"v";s:3:"髮";s:2:"w";s:3:"髯";s:2:"x";s:3:"鬧";s:2:"y";s:3:"魅";s:2:"z";s:3:"魄";s:2:"{";s:3:"魷";s:2:"|";s:3:"魯";s:2:"}";s:3:"鴆";s:2:"~";s:3:"鴉";s:2:"";s:3:"鴃";s:2:"";s:3:"麩";s:2:"";s:3:"麾";s:2:"";s:3:"黎";s:2:"";s:3:"墨";s:2:"";s:3:"齒";s:2:"";s:3:"儒";s:2:"";s:3:"儘";s:2:"";s:3:"儔";s:2:"";s:3:"儐";s:2:"";s:3:"儕";s:2:"";s:3:"冀";s:2:"";s:3:"冪";s:2:"";s:3:"凝";s:2:"";s:3:"劑";s:2:"";s:3:"劓";s:2:"";s:3:"勳";s:2:"";s:3:"噙";s:2:"";s:3:"噫";s:2:"";s:3:"噹";s:2:"";s:3:"噩";s:2:"";s:3:"噤";s:2:"";s:3:"噸";s:2:"";s:3:"噪";s:2:"";s:3:"器";s:2:"";s:3:"噥";s:2:"";s:3:"噱";s:2:"";s:3:"噯";s:2:"";s:3:"噬";s:2:"";s:3:"噢";s:2:"";s:3:"噶";s:2:"";s:3:"壁";s:2:"";s:3:"墾";s:2:"";s:3:"壇";s:2:"";s:3:"壅";s:2:"";s:3:"奮";s:2:"";s:3:"嬝";s:2:"";s:3:"嬴";s:2:"";s:3:"學";s:2:"";s:3:"寰";s:2:"";s:3:"導";s:2:"";s:3:"彊";s:2:"";s:3:"憲";s:2:"";s:3:"憑";s:2:"";s:3:"憩";s:2:"";s:3:"憊";s:2:"";s:3:"懍";s:2:"";s:3:"憶";s:2:"";s:3:"憾";s:2:"";s:3:"懊";s:2:"";s:3:"懈";s:2:"";s:3:"戰";s:2:"";s:3:"擅";s:2:"";s:3:"擁";s:2:"";s:3:"擋";s:2:"";s:3:"撻";s:2:"";s:3:"撼";s:2:"";s:3:"據";s:2:"";s:3:"擄";s:2:"";s:3:"擇";s:2:"";s:3:"擂";s:2:"";s:3:"操";s:2:"";s:3:"撿";s:2:"";s:3:"擒";s:2:"";s:3:"擔";s:2:"";s:3:"撾";s:2:"";s:3:"整";s:2:"";s:3:"曆";s:2:"";s:3:"曉";s:2:"";s:3:"暹";s:2:"";s:3:"曄";s:2:"";s:3:"曇";s:2:"";s:3:"暸";s:2:"";s:3:"樽";s:2:"";s:3:"樸";s:2:"";s:3:"樺";s:2:"";s:3:"橙";s:2:"";s:3:"橫";s:2:"";s:3:"橘";s:2:"";s:3:"樹";s:2:"";s:3:"橄";s:2:"";s:3:"橢";s:2:"";s:3:"橡";s:2:"";s:3:"橋";s:2:"";s:3:"橇";s:2:"";s:3:"樵";s:2:"";s:3:"機";s:2:"";s:3:"橈";s:2:"";s:3:"歙";s:2:"";s:3:"歷";s:2:"";s:3:"氅";s:2:"";s:3:"濂";s:2:"";s:3:"澱";s:2:"";s:3:"澡";s:2:"@";s:3:"濃";s:2:"A";s:3:"澤";s:2:"B";s:3:"濁";s:2:"C";s:3:"澧";s:2:"D";s:3:"澳";s:2:"E";s:3:"激";s:2:"F";s:3:"澹";s:2:"G";s:3:"澶";s:2:"H";s:3:"澦";s:2:"I";s:3:"澠";s:2:"J";s:3:"澴";s:2:"K";s:3:"熾";s:2:"L";s:3:"燉";s:2:"M";s:3:"燐";s:2:"N";s:3:"燒";s:2:"O";s:3:"燈";s:2:"P";s:3:"燕";s:2:"Q";s:3:"熹";s:2:"R";s:3:"燎";s:2:"S";s:3:"燙";s:2:"T";s:3:"燜";s:2:"U";s:3:"燃";s:2:"V";s:3:"燄";s:2:"W";s:3:"獨";s:2:"X";s:3:"璜";s:2:"Y";s:3:"璣";s:2:"Z";s:3:"璘";s:2:"[";s:3:"璟";s:2:"\";s:3:"璞";s:2:"]";s:3:"瓢";s:2:"^";s:3:"甌";s:2:"_";s:3:"甍";s:2:"`";s:3:"瘴";s:2:"a";s:3:"瘸";s:2:"b";s:3:"瘺";s:2:"c";s:3:"盧";s:2:"d";s:3:"盥";s:2:"e";s:3:"瞠";s:2:"f";s:3:"瞞";s:2:"g";s:3:"瞟";s:2:"h";s:3:"瞥";s:2:"i";s:3:"磨";s:2:"j";s:3:"磚";s:2:"k";s:3:"磬";s:2:"l";s:3:"磧";s:2:"m";s:3:"禦";s:2:"n";s:3:"積";s:2:"o";s:3:"穎";s:2:"p";s:3:"穆";s:2:"q";s:3:"穌";s:2:"r";s:3:"穋";s:2:"s";s:3:"窺";s:2:"t";s:3:"篙";s:2:"u";s:3:"簑";s:2:"v";s:3:"築";s:2:"w";s:3:"篤";s:2:"x";s:3:"篛";s:2:"y";s:3:"篡";s:2:"z";s:3:"篩";s:2:"{";s:3:"篦";s:2:"|";s:3:"糕";s:2:"}";s:3:"糖";s:2:"~";s:3:"縊";s:2:"";s:3:"縑";s:2:"";s:3:"縈";s:2:"";s:3:"縛";s:2:"";s:3:"縣";s:2:"";s:3:"縞";s:2:"";s:3:"縝";s:2:"";s:3:"縉";s:2:"";s:3:"縐";s:2:"";s:3:"罹";s:2:"";s:3:"羲";s:2:"";s:3:"翰";s:2:"";s:3:"翱";s:2:"";s:3:"翮";s:2:"";s:3:"耨";s:2:"";s:3:"膳";s:2:"";s:3:"膩";s:2:"";s:3:"膨";s:2:"";s:3:"臻";s:2:"";s:3:"興";s:2:"";s:3:"艘";s:2:"";s:3:"艙";s:2:"";s:3:"蕊";s:2:"";s:3:"蕙";s:2:"";s:3:"蕈";s:2:"";s:3:"蕨";s:2:"";s:3:"蕩";s:2:"";s:3:"蕃";s:2:"";s:3:"蕉";s:2:"";s:3:"蕭";s:2:"";s:3:"蕪";s:2:"";s:3:"蕞";s:2:"";s:3:"螃";s:2:"";s:3:"螟";s:2:"";s:3:"螞";s:2:"";s:3:"螢";s:2:"";s:3:"融";s:2:"";s:3:"衡";s:2:"";s:3:"褪";s:2:"";s:3:"褲";s:2:"";s:3:"褥";s:2:"";s:3:"褫";s:2:"";s:3:"褡";s:2:"";s:3:"親";s:2:"";s:3:"覦";s:2:"";s:3:"諦";s:2:"";s:3:"諺";s:2:"";s:3:"諫";s:2:"";s:3:"諱";s:2:"";s:3:"謀";s:2:"";s:3:"諜";s:2:"";s:3:"諧";s:2:"";s:3:"諮";s:2:"";s:3:"諾";s:2:"";s:3:"謁";s:2:"";s:3:"謂";s:2:"";s:3:"諷";s:2:"";s:3:"諭";s:2:"";s:3:"諳";s:2:"";s:3:"諶";s:2:"";s:3:"諼";s:2:"";s:3:"豫";s:2:"";s:3:"豭";s:2:"";s:3:"貓";s:2:"";s:3:"賴";s:2:"";s:3:"蹄";s:2:"";s:3:"踱";s:2:"";s:3:"踴";s:2:"";s:3:"蹂";s:2:"";s:3:"踹";s:2:"";s:3:"踵";s:2:"";s:3:"輻";s:2:"";s:3:"輯";s:2:"";s:3:"輸";s:2:"";s:3:"輳";s:2:"";s:3:"辨";s:2:"";s:3:"辦";s:2:"";s:3:"遵";s:2:"";s:3:"遴";s:2:"";s:3:"選";s:2:"";s:3:"遲";s:2:"";s:3:"遼";s:2:"";s:3:"遺";s:2:"";s:3:"鄴";s:2:"";s:3:"醒";s:2:"";s:3:"錠";s:2:"";s:3:"錶";s:2:"";s:3:"鋸";s:2:"";s:3:"錳";s:2:"";s:3:"錯";s:2:"";s:3:"錢";s:2:"";s:3:"鋼";s:2:"";s:3:"錫";s:2:"";s:3:"錄";s:2:"";s:3:"錚";s:2:"@";s:3:"錐";s:2:"A";s:3:"錦";s:2:"B";s:3:"錡";s:2:"C";s:3:"錕";s:2:"D";s:3:"錮";s:2:"E";s:3:"錙";s:2:"F";s:3:"閻";s:2:"G";s:3:"隧";s:2:"H";s:3:"隨";s:2:"I";s:3:"險";s:2:"J";s:3:"雕";s:2:"K";s:3:"霎";s:2:"L";s:3:"霑";s:2:"M";s:3:"霖";s:2:"N";s:3:"霍";s:2:"O";s:3:"霓";s:2:"P";s:3:"霏";s:2:"Q";s:3:"靛";s:2:"R";s:3:"靜";s:2:"S";s:3:"靦";s:2:"T";s:3:"鞘";s:2:"U";s:3:"頰";s:2:"V";s:3:"頸";s:2:"W";s:3:"頻";s:2:"X";s:3:"頷";s:2:"Y";s:3:"頭";s:2:"Z";s:3:"頹";s:2:"[";s:3:"頤";s:2:"\";s:3:"餐";s:2:"]";s:3:"館";s:2:"^";s:3:"餞";s:2:"_";s:3:"餛";s:2:"`";s:3:"餡";s:2:"a";s:3:"餚";s:2:"b";s:3:"駭";s:2:"c";s:3:"駢";s:2:"d";s:3:"駱";s:2:"e";s:3:"骸";s:2:"f";s:3:"骼";s:2:"g";s:3:"髻";s:2:"h";s:3:"髭";s:2:"i";s:3:"鬨";s:2:"j";s:3:"鮑";s:2:"k";s:3:"鴕";s:2:"l";s:3:"鴣";s:2:"m";s:3:"鴦";s:2:"n";s:3:"鴨";s:2:"o";s:3:"鴒";s:2:"p";s:3:"鴛";s:2:"q";s:3:"默";s:2:"r";s:3:"黔";s:2:"s";s:3:"龍";s:2:"t";s:3:"龜";s:2:"u";s:3:"優";s:2:"v";s:3:"償";s:2:"w";s:3:"儡";s:2:"x";s:3:"儲";s:2:"y";s:3:"勵";s:2:"z";s:3:"嚎";s:2:"{";s:3:"嚀";s:2:"|";s:3:"嚐";s:2:"}";s:3:"嚅";s:2:"~";s:3:"嚇";s:2:"";s:3:"嚏";s:2:"";s:3:"壕";s:2:"";s:3:"壓";s:2:"";s:3:"壑";s:2:"";s:3:"壎";s:2:"";s:3:"嬰";s:2:"";s:3:"嬪";s:2:"";s:3:"嬤";s:2:"";s:3:"孺";s:2:"";s:3:"尷";s:2:"";s:3:"屨";s:2:"";s:3:"嶼";s:2:"";s:3:"嶺";s:2:"";s:3:"嶽";s:2:"";s:3:"嶸";s:2:"";s:3:"幫";s:2:"";s:3:"彌";s:2:"";s:3:"徽";s:2:"";s:3:"應";s:2:"";s:3:"懂";s:2:"";s:3:"懇";s:2:"";s:3:"懦";s:2:"";s:3:"懋";s:2:"";s:3:"戲";s:2:"";s:3:"戴";s:2:"";s:3:"擎";s:2:"";s:3:"擊";s:2:"";s:3:"擘";s:2:"";s:3:"擠";s:2:"";s:3:"擰";s:2:"";s:3:"擦";s:2:"";s:3:"擬";s:2:"";s:3:"擱";s:2:"";s:3:"擢";s:2:"";s:3:"擭";s:2:"";s:3:"斂";s:2:"";s:3:"斃";s:2:"";s:3:"曙";s:2:"";s:3:"曖";s:2:"";s:3:"檀";s:2:"";s:3:"檔";s:2:"";s:3:"檄";s:2:"";s:3:"檢";s:2:"";s:3:"檜";s:2:"";s:3:"櫛";s:2:"";s:3:"檣";s:2:"";s:3:"橾";s:2:"";s:3:"檗";s:2:"";s:3:"檐";s:2:"";s:3:"檠";s:2:"";s:3:"歜";s:2:"";s:3:"殮";s:2:"";s:3:"毚";s:2:"";s:3:"氈";s:2:"";s:3:"濘";s:2:"";s:3:"濱";s:2:"";s:3:"濟";s:2:"";s:3:"濠";s:2:"";s:3:"濛";s:2:"";s:3:"濤";s:2:"";s:3:"濫";s:2:"";s:3:"濯";s:2:"";s:3:"澀";s:2:"";s:3:"濬";s:2:"";s:3:"濡";s:2:"";s:3:"濩";s:2:"";s:3:"濕";s:2:"";s:3:"濮";s:2:"";s:3:"濰";s:2:"";s:3:"燧";s:2:"";s:3:"營";s:2:"";s:3:"燮";s:2:"";s:3:"燦";s:2:"";s:3:"燥";s:2:"";s:3:"燭";s:2:"";s:3:"燬";s:2:"";s:3:"燴";s:2:"";s:3:"燠";s:2:"";s:3:"爵";s:2:"";s:3:"牆";s:2:"";s:3:"獰";s:2:"";s:3:"獲";s:2:"";s:3:"璩";s:2:"";s:3:"環";s:2:"";s:3:"璦";s:2:"";s:3:"璨";s:2:"";s:3:"癆";s:2:"";s:3:"療";s:2:"";s:3:"癌";s:2:"";s:3:"盪";s:2:"";s:3:"瞳";s:2:"";s:3:"瞪";s:2:"";s:3:"瞰";s:2:"";s:3:"瞬";s:2:"@";s:3:"瞧";s:2:"A";s:3:"瞭";s:2:"B";s:3:"矯";s:2:"C";s:3:"磷";s:2:"D";s:3:"磺";s:2:"E";s:3:"磴";s:2:"F";s:3:"磯";s:2:"G";s:3:"礁";s:2:"H";s:3:"禧";s:2:"I";s:3:"禪";s:2:"J";s:3:"穗";s:2:"K";s:3:"窿";s:2:"L";s:3:"簇";s:2:"M";s:3:"簍";s:2:"N";s:3:"篾";s:2:"O";s:3:"篷";s:2:"P";s:3:"簌";s:2:"Q";s:3:"篠";s:2:"R";s:3:"糠";s:2:"S";s:3:"糜";s:2:"T";s:3:"糞";s:2:"U";s:3:"糢";s:2:"V";s:3:"糟";s:2:"W";s:3:"糙";s:2:"X";s:3:"糝";s:2:"Y";s:3:"縮";s:2:"Z";s:3:"績";s:2:"[";s:3:"繆";s:2:"\";s:3:"縷";s:2:"]";s:3:"縲";s:2:"^";s:3:"繃";s:2:"_";s:3:"縫";s:2:"`";s:3:"總";s:2:"a";s:3:"縱";s:2:"b";s:3:"繅";s:2:"c";s:3:"繁";s:2:"d";s:3:"縴";s:2:"e";s:3:"縹";s:2:"f";s:3:"繈";s:2:"g";s:3:"縵";s:2:"h";s:3:"縿";s:2:"i";s:3:"縯";s:2:"j";s:3:"罄";s:2:"k";s:3:"翳";s:2:"l";s:3:"翼";s:2:"m";s:3:"聱";s:2:"n";s:3:"聲";s:2:"o";s:3:"聰";s:2:"p";s:3:"聯";s:2:"q";s:3:"聳";s:2:"r";s:3:"臆";s:2:"s";s:3:"臃";s:2:"t";s:3:"膺";s:2:"u";s:3:"臂";s:2:"v";s:3:"臀";s:2:"w";s:3:"膿";s:2:"x";s:3:"膽";s:2:"y";s:3:"臉";s:2:"z";s:3:"膾";s:2:"{";s:3:"臨";s:2:"|";s:3:"舉";s:2:"}";s:3:"艱";s:2:"~";s:3:"薪";s:2:"";s:3:"薄";s:2:"";s:3:"蕾";s:2:"";s:3:"薜";s:2:"";s:3:"薑";s:2:"";s:3:"薔";s:2:"";s:3:"薯";s:2:"";s:3:"薛";s:2:"";s:3:"薇";s:2:"";s:3:"薨";s:2:"";s:3:"薊";s:2:"";s:3:"虧";s:2:"";s:3:"蟀";s:2:"";s:3:"蟑";s:2:"";s:3:"螳";s:2:"";s:3:"蟒";s:2:"";s:3:"蟆";s:2:"";s:3:"螫";s:2:"";s:3:"螻";s:2:"";s:3:"螺";s:2:"";s:3:"蟈";s:2:"";s:3:"蟋";s:2:"";s:3:"褻";s:2:"";s:3:"褶";s:2:"";s:3:"襄";s:2:"";s:3:"褸";s:2:"";s:3:"褽";s:2:"";s:3:"覬";s:2:"";s:3:"謎";s:2:"";s:3:"謗";s:2:"";s:3:"謙";s:2:"";s:3:"講";s:2:"";s:3:"謊";s:2:"";s:3:"謠";s:2:"";s:3:"謝";s:2:"";s:3:"謄";s:2:"";s:3:"謐";s:2:"";s:3:"豁";s:2:"";s:3:"谿";s:2:"";s:3:"豳";s:2:"";s:3:"賺";s:2:"";s:3:"賽";s:2:"";s:3:"購";s:2:"";s:3:"賸";s:2:"";s:3:"賻";s:2:"";s:3:"趨";s:2:"";s:3:"蹉";s:2:"";s:3:"蹋";s:2:"";s:3:"蹈";s:2:"";s:3:"蹊";s:2:"";s:3:"轄";s:2:"";s:3:"輾";s:2:"";s:3:"轂";s:2:"";s:3:"轅";s:2:"";s:3:"輿";s:2:"";s:3:"避";s:2:"";s:3:"遽";s:2:"";s:3:"還";s:2:"";s:3:"邁";s:2:"";s:3:"邂";s:2:"";s:3:"邀";s:2:"";s:3:"鄹";s:2:"";s:3:"醣";s:2:"";s:3:"醞";s:2:"";s:3:"醜";s:2:"";s:3:"鍍";s:2:"";s:3:"鎂";s:2:"";s:3:"錨";s:2:"";s:3:"鍵";s:2:"";s:3:"鍊";s:2:"";s:3:"鍥";s:2:"";s:3:"鍋";s:2:"";s:3:"錘";s:2:"";s:3:"鍾";s:2:"";s:3:"鍬";s:2:"";s:3:"鍛";s:2:"";s:3:"鍰";s:2:"";s:3:"鍚";s:2:"";s:3:"鍔";s:2:"";s:3:"闊";s:2:"";s:3:"闋";s:2:"";s:3:"闌";s:2:"";s:3:"闈";s:2:"";s:3:"闆";s:2:"";s:3:"隱";s:2:"";s:3:"隸";s:2:"";s:3:"雖";s:2:"";s:3:"霜";s:2:"";s:3:"霞";s:2:"";s:3:"鞠";s:2:"";s:3:"韓";s:2:"";s:3:"顆";s:2:"";s:3:"颶";s:2:"";s:3:"餵";s:2:"";s:3:"騁";s:2:"@";s:3:"駿";s:2:"A";s:3:"鮮";s:2:"B";s:3:"鮫";s:2:"C";s:3:"鮪";s:2:"D";s:3:"鮭";s:2:"E";s:3:"鴻";s:2:"F";s:3:"鴿";s:2:"G";s:3:"麋";s:2:"H";s:3:"黏";s:2:"I";s:3:"點";s:2:"J";s:3:"黜";s:2:"K";s:3:"黝";s:2:"L";s:3:"黛";s:2:"M";s:3:"鼾";s:2:"N";s:3:"齋";s:2:"O";s:3:"叢";s:2:"P";s:3:"嚕";s:2:"Q";s:3:"嚮";s:2:"R";s:3:"壙";s:2:"S";s:3:"壘";s:2:"T";s:3:"嬸";s:2:"U";s:3:"彝";s:2:"V";s:3:"懣";s:2:"W";s:3:"戳";s:2:"X";s:3:"擴";s:2:"Y";s:3:"擲";s:2:"Z";s:3:"擾";s:2:"[";s:3:"攆";s:2:"\";s:3:"擺";s:2:"]";s:3:"擻";s:2:"^";s:3:"擷";s:2:"_";s:3:"斷";s:2:"`";s:3:"曜";s:2:"a";s:3:"朦";s:2:"b";s:3:"檳";s:2:"c";s:3:"檬";s:2:"d";s:3:"櫃";s:2:"e";s:3:"檻";s:2:"f";s:3:"檸";s:2:"g";s:3:"櫂";s:2:"h";s:3:"檮";s:2:"i";s:3:"檯";s:2:"j";s:3:"歟";s:2:"k";s:3:"歸";s:2:"l";s:3:"殯";s:2:"m";s:3:"瀉";s:2:"n";s:3:"瀋";s:2:"o";s:3:"濾";s:2:"p";s:3:"瀆";s:2:"q";s:3:"濺";s:2:"r";s:3:"瀑";s:2:"s";s:3:"瀏";s:2:"t";s:3:"燻";s:2:"u";s:3:"燼";s:2:"v";s:3:"燾";s:2:"w";s:3:"燸";s:2:"x";s:3:"獷";s:2:"y";s:3:"獵";s:2:"z";s:3:"璧";s:2:"{";s:3:"璿";s:2:"|";s:3:"甕";s:2:"}";s:3:"癖";s:2:"~";s:3:"癘";s:2:"¡";s:3:"癒";s:2:"¢";s:3:"瞽";s:2:"£";s:3:"瞿";s:2:"¤";s:3:"瞻";s:2:"¥";s:3:"瞼";s:2:"¦";s:3:"礎";s:2:"§";s:3:"禮";s:2:"¨";s:3:"穡";s:2:"©";s:3:"穢";s:2:"ª";s:3:"穠";s:2:"«";s:3:"竄";s:2:"¬";s:3:"竅";s:2:"­";s:3:"簫";s:2:"®";s:3:"簧";s:2:"¯";s:3:"簪";s:2:"°";s:3:"簞";s:2:"±";s:3:"簣";s:2:"²";s:3:"簡";s:2:"³";s:3:"糧";s:2:"´";s:3:"織";s:2:"µ";s:3:"繕";s:2:"¶";s:3:"繞";s:2:"·";s:3:"繚";s:2:"¸";s:3:"繡";s:2:"¹";s:3:"繒";s:2:"º";s:3:"繙";s:2:"»";s:3:"罈";s:2:"¼";s:3:"翹";s:2:"½";s:3:"翻";s:2:"¾";s:3:"職";s:2:"¿";s:3:"聶";s:2:"";s:3:"臍";s:2:"";s:3:"臏";s:2:"";s:3:"舊";s:2:"";s:3:"藏";s:2:"";s:3:"薩";s:2:"";s:3:"藍";s:2:"";s:3:"藐";s:2:"";s:3:"藉";s:2:"";s:3:"薰";s:2:"";s:3:"薺";s:2:"";s:3:"薹";s:2:"";s:3:"薦";s:2:"";s:3:"蟯";s:2:"";s:3:"蟬";s:2:"";s:3:"蟲";s:2:"";s:3:"蟠";s:2:"";s:3:"覆";s:2:"";s:3:"覲";s:2:"";s:3:"觴";s:2:"";s:3:"謨";s:2:"";s:3:"謹";s:2:"";s:3:"謬";s:2:"";s:3:"謫";s:2:"";s:3:"豐";s:2:"";s:3:"贅";s:2:"";s:3:"蹙";s:2:"";s:3:"蹣";s:2:"";s:3:"蹦";s:2:"";s:3:"蹤";s:2:"";s:3:"蹟";s:2:"";s:3:"蹕";s:2:"";s:3:"軀";s:2:"";s:3:"轉";s:2:"";s:3:"轍";s:2:"";s:3:"邇";s:2:"";s:3:"邃";s:2:"";s:3:"邈";s:2:"";s:3:"醫";s:2:"";s:3:"醬";s:2:"";s:3:"釐";s:2:"";s:3:"鎔";s:2:"";s:3:"鎊";s:2:"";s:3:"鎖";s:2:"";s:3:"鎢";s:2:"";s:3:"鎳";s:2:"";s:3:"鎮";s:2:"";s:3:"鎬";s:2:"";s:3:"鎰";s:2:"";s:3:"鎘";s:2:"";s:3:"鎚";s:2:"";s:3:"鎗";s:2:"";s:3:"闔";s:2:"";s:3:"闖";s:2:"";s:3:"闐";s:2:"";s:3:"闕";s:2:"";s:3:"離";s:2:"";s:3:"雜";s:2:"";s:3:"雙";s:2:"";s:3:"雛";s:2:"";s:3:"雞";s:2:"";s:3:"霤";s:2:"";s:3:"鞣";s:2:"";s:3:"鞦";s:2:"@";s:3:"鞭";s:2:"A";s:3:"韹";s:2:"B";s:3:"額";s:2:"C";s:3:"顏";s:2:"D";s:3:"題";s:2:"E";s:3:"顎";s:2:"F";s:3:"顓";s:2:"G";s:3:"颺";s:2:"H";s:3:"餾";s:2:"I";s:3:"餿";s:2:"J";s:3:"餽";s:2:"K";s:3:"餮";s:2:"L";s:3:"馥";s:2:"M";s:3:"騎";s:2:"N";s:3:"髁";s:2:"O";s:3:"鬃";s:2:"P";s:3:"鬆";s:2:"Q";s:3:"魏";s:2:"R";s:3:"魎";s:2:"S";s:3:"魍";s:2:"T";s:3:"鯊";s:2:"U";s:3:"鯉";s:2:"V";s:3:"鯽";s:2:"W";s:3:"鯈";s:2:"X";s:3:"鯀";s:2:"Y";s:3:"鵑";s:2:"Z";s:3:"鵝";s:2:"[";s:3:"鵠";s:2:"\";s:3:"黠";s:2:"]";s:3:"鼕";s:2:"^";s:3:"鼬";s:2:"_";s:3:"儳";s:2:"`";s:3:"嚥";s:2:"a";s:3:"壞";s:2:"b";s:3:"壟";s:2:"c";s:3:"壢";s:2:"d";s:3:"寵";s:2:"e";s:3:"龐";s:2:"f";s:3:"廬";s:2:"g";s:3:"懲";s:2:"h";s:3:"懷";s:2:"i";s:3:"懶";s:2:"j";s:3:"懵";s:2:"k";s:3:"攀";s:2:"l";s:3:"攏";s:2:"m";s:3:"曠";s:2:"n";s:3:"曝";s:2:"o";s:3:"櫥";s:2:"p";s:3:"櫝";s:2:"q";s:3:"櫚";s:2:"r";s:3:"櫓";s:2:"s";s:3:"瀛";s:2:"t";s:3:"瀟";s:2:"u";s:3:"瀨";s:2:"v";s:3:"瀚";s:2:"w";s:3:"瀝";s:2:"x";s:3:"瀕";s:2:"y";s:3:"瀘";s:2:"z";s:3:"爆";s:2:"{";s:3:"爍";s:2:"|";s:3:"牘";s:2:"}";s:3:"犢";s:2:"~";s:3:"獸";s:2:"á";s:3:"獺";s:2:"â";s:3:"璽";s:2:"ã";s:3:"瓊";s:2:"ä";s:3:"瓣";s:2:"å";s:3:"疇";s:2:"æ";s:3:"疆";s:2:"ç";s:3:"癟";s:2:"è";s:3:"癡";s:2:"é";s:3:"矇";s:2:"ê";s:3:"礙";s:2:"ë";s:3:"禱";s:2:"ì";s:3:"穫";s:2:"í";s:3:"穩";s:2:"î";s:3:"簾";s:2:"ï";s:3:"簿";s:2:"ð";s:3:"簸";s:2:"ñ";s:3:"簽";s:2:"ò";s:3:"簷";s:2:"ó";s:3:"籀";s:2:"ô";s:3:"繫";s:2:"õ";s:3:"繭";s:2:"ö";s:3:"繹";s:2:"÷";s:3:"繩";s:2:"ø";s:3:"繪";s:2:"ù";s:3:"羅";s:2:"ú";s:3:"繳";s:2:"û";s:3:"羶";s:2:"ü";s:3:"羹";s:2:"ý";s:3:"羸";s:2:"þ";s:3:"臘";s:2:"ÿ";s:3:"藩";s:2:"";s:3:"藝";s:2:"";s:3:"藪";s:2:"";s:3:"藕";s:2:"";s:3:"藤";s:2:"";s:3:"藥";s:2:"";s:3:"藷";s:2:"";s:3:"蟻";s:2:"";s:3:"蠅";s:2:"";s:3:"蠍";s:2:"";s:3:"蟹";s:2:"";s:3:"蟾";s:2:"";s:3:"襠";s:2:"";s:3:"襟";s:2:"";s:3:"襖";s:2:"";s:3:"襞";s:2:"";s:3:"譁";s:2:"";s:3:"譜";s:2:"";s:3:"識";s:2:"";s:3:"證";s:2:"";s:3:"譚";s:2:"";s:3:"譎";s:2:"";s:3:"譏";s:2:"";s:3:"譆";s:2:"";s:3:"譙";s:2:"";s:3:"贈";s:2:"";s:3:"贊";s:2:"";s:3:"蹼";s:2:"";s:3:"蹲";s:2:"";s:3:"躇";s:2:"";s:3:"蹶";s:2:"";s:3:"蹬";s:2:"";s:3:"蹺";s:2:"";s:3:"蹴";s:2:"";s:3:"轔";s:2:"";s:3:"轎";s:2:"";s:3:"辭";s:2:"";s:3:"邊";s:2:"";s:3:"邋";s:2:"";s:3:"醱";s:2:"";s:3:"醮";s:2:"";s:3:"鏡";s:2:"";s:3:"鏑";s:2:"";s:3:"鏟";s:2:"";s:3:"鏃";s:2:"";s:3:"鏈";s:2:"";s:3:"鏜";s:2:"";s:3:"鏝";s:2:"";s:3:"鏖";s:2:"";s:3:"鏢";s:2:"";s:3:"鏍";s:2:"";s:3:"鏘";s:2:"";s:3:"鏤";s:2:"";s:3:"鏗";s:2:"";s:3:"鏨";s:2:"";s:3:"關";s:2:"";s:3:"隴";s:2:"";s:3:"難";s:2:"";s:3:"霪";s:2:"";s:3:"霧";s:2:"";s:3:"靡";s:2:"";s:3:"韜";s:2:"";s:3:"韻";s:2:"";s:3:"類";s:2:"@";s:3:"願";s:2:"A";s:3:"顛";s:2:"B";s:3:"颼";s:2:"C";s:3:"饅";s:2:"D";s:3:"饉";s:2:"E";s:3:"騖";s:2:"F";s:3:"騙";s:2:"G";s:3:"鬍";s:2:"H";s:3:"鯨";s:2:"I";s:3:"鯧";s:2:"J";s:3:"鯖";s:2:"K";s:3:"鯛";s:2:"L";s:3:"鶉";s:2:"M";s:3:"鵡";s:2:"N";s:3:"鵲";s:2:"O";s:3:"鵪";s:2:"P";s:3:"鵬";s:2:"Q";s:3:"麒";s:2:"R";s:3:"麗";s:2:"S";s:3:"麓";s:2:"T";s:3:"麴";s:2:"U";s:3:"勸";s:2:"V";s:3:"嚨";s:2:"W";s:3:"嚷";s:2:"X";s:3:"嚶";s:2:"Y";s:3:"嚴";s:2:"Z";s:3:"嚼";s:2:"[";s:3:"壤";s:2:"\";s:3:"孀";s:2:"]";s:3:"孃";s:2:"^";s:3:"孽";s:2:"_";s:3:"寶";s:2:"`";s:3:"巉";s:2:"a";s:3:"懸";s:2:"b";s:3:"懺";s:2:"c";s:3:"攘";s:2:"d";s:3:"攔";s:2:"e";s:3:"攙";s:2:"f";s:3:"曦";s:2:"g";s:3:"朧";s:2:"h";s:3:"櫬";s:2:"i";s:3:"瀾";s:2:"j";s:3:"瀰";s:2:"k";s:3:"瀲";s:2:"l";s:3:"爐";s:2:"m";s:3:"獻";s:2:"n";s:3:"瓏";s:2:"o";s:3:"癢";s:2:"p";s:3:"癥";s:2:"q";s:3:"礦";s:2:"r";s:3:"礪";s:2:"s";s:3:"礬";s:2:"t";s:3:"礫";s:2:"u";s:3:"竇";s:2:"v";s:3:"競";s:2:"w";s:3:"籌";s:2:"x";s:3:"籃";s:2:"y";s:3:"籍";s:2:"z";s:3:"糯";s:2:"{";s:3:"糰";s:2:"|";s:3:"辮";s:2:"}";s:3:"繽";s:2:"~";s:3:"繼";s:2:"ġ";s:3:"纂";s:2:"Ģ";s:3:"罌";s:2:"ģ";s:3:"耀";s:2:"Ĥ";s:3:"臚";s:2:"ĥ";s:3:"艦";s:2:"Ħ";s:3:"藻";s:2:"ħ";s:3:"藹";s:2:"Ĩ";s:3:"蘑";s:2:"ĩ";s:3:"藺";s:2:"Ī";s:3:"蘆";s:2:"ī";s:3:"蘋";s:2:"Ĭ";s:3:"蘇";s:2:"ĭ";s:3:"蘊";s:2:"Į";s:3:"蠔";s:2:"į";s:3:"蠕";s:2:"İ";s:3:"襤";s:2:"ı";s:3:"覺";s:2:"Ĳ";s:3:"觸";s:2:"ĳ";s:3:"議";s:2:"Ĵ";s:3:"譬";s:2:"ĵ";s:3:"警";s:2:"Ķ";s:3:"譯";s:2:"ķ";s:3:"譟";s:2:"ĸ";s:3:"譫";s:2:"Ĺ";s:3:"贏";s:2:"ĺ";s:3:"贍";s:2:"Ļ";s:3:"躉";s:2:"ļ";s:3:"躁";s:2:"Ľ";s:3:"躅";s:2:"ľ";s:3:"躂";s:2:"Ŀ";s:3:"醴";s:2:"";s:3:"釋";s:2:"";s:3:"鐘";s:2:"";s:3:"鐃";s:2:"";s:3:"鏽";s:2:"";s:3:"闡";s:2:"";s:3:"霰";s:2:"";s:3:"飄";s:2:"";s:3:"饒";s:2:"";s:3:"饑";s:2:"";s:3:"馨";s:2:"";s:3:"騫";s:2:"";s:3:"騰";s:2:"";s:3:"騷";s:2:"";s:3:"騵";s:2:"";s:3:"鰓";s:2:"";s:3:"鰍";s:2:"";s:3:"鹹";s:2:"";s:3:"麵";s:2:"";s:3:"黨";s:2:"";s:3:"鼯";s:2:"";s:3:"齟";s:2:"";s:3:"齣";s:2:"";s:3:"齡";s:2:"";s:3:"儷";s:2:"";s:3:"儸";s:2:"";s:3:"囁";s:2:"";s:3:"囀";s:2:"";s:3:"囂";s:2:"";s:3:"夔";s:2:"";s:3:"屬";s:2:"";s:3:"巍";s:2:"";s:3:"懼";s:2:"";s:3:"懾";s:2:"";s:3:"攝";s:2:"";s:3:"攜";s:2:"";s:3:"斕";s:2:"";s:3:"曩";s:2:"";s:3:"櫻";s:2:"";s:3:"欄";s:2:"";s:3:"櫺";s:2:"";s:3:"殲";s:2:"";s:3:"灌";s:2:"";s:3:"爛";s:2:"";s:3:"犧";s:2:"";s:3:"瓖";s:2:"";s:3:"瓔";s:2:"";s:3:"癩";s:2:"";s:3:"矓";s:2:"";s:3:"籐";s:2:"";s:3:"纏";s:2:"";s:3:"續";s:2:"";s:3:"羼";s:2:"";s:3:"蘗";s:2:"";s:3:"蘭";s:2:"";s:3:"蘚";s:2:"";s:3:"蠣";s:2:"";s:3:"蠢";s:2:"";s:3:"蠡";s:2:"";s:3:"蠟";s:2:"";s:3:"襪";s:2:"";s:3:"襬";s:2:"";s:3:"覽";s:2:"";s:3:"譴";s:2:"@";s:3:"護";s:2:"A";s:3:"譽";s:2:"B";s:3:"贓";s:2:"C";s:3:"躊";s:2:"D";s:3:"躍";s:2:"E";s:3:"躋";s:2:"F";s:3:"轟";s:2:"G";s:3:"辯";s:2:"H";s:3:"醺";s:2:"I";s:3:"鐮";s:2:"J";s:3:"鐳";s:2:"K";s:3:"鐵";s:2:"L";s:3:"鐺";s:2:"M";s:3:"鐸";s:2:"N";s:3:"鐲";s:2:"O";s:3:"鐫";s:2:"P";s:3:"闢";s:2:"Q";s:3:"霸";s:2:"R";s:3:"霹";s:2:"S";s:3:"露";s:2:"T";s:3:"響";s:2:"U";s:3:"顧";s:2:"V";s:3:"顥";s:2:"W";s:3:"饗";s:2:"X";s:3:"驅";s:2:"Y";s:3:"驃";s:2:"Z";s:3:"驀";s:2:"[";s:3:"騾";s:2:"\";s:3:"髏";s:2:"]";s:3:"魔";s:2:"^";s:3:"魑";s:2:"_";s:3:"鰭";s:2:"`";s:3:"鰥";s:2:"a";s:3:"鶯";s:2:"b";s:3:"鶴";s:2:"c";s:3:"鷂";s:2:"d";s:3:"鶸";s:2:"e";s:3:"麝";s:2:"f";s:3:"黯";s:2:"g";s:3:"鼙";s:2:"h";s:3:"齜";s:2:"i";s:3:"齦";s:2:"j";s:3:"齧";s:2:"k";s:3:"儼";s:2:"l";s:3:"儻";s:2:"m";s:3:"囈";s:2:"n";s:3:"囊";s:2:"o";s:3:"囉";s:2:"p";s:3:"孿";s:2:"q";s:3:"巔";s:2:"r";s:3:"巒";s:2:"s";s:3:"彎";s:2:"t";s:3:"懿";s:2:"u";s:3:"攤";s:2:"v";s:3:"權";s:2:"w";s:3:"歡";s:2:"x";s:3:"灑";s:2:"y";s:3:"灘";s:2:"z";s:3:"玀";s:2:"{";s:3:"瓤";s:2:"|";s:3:"疊";s:2:"}";s:3:"癮";s:2:"~";s:3:"癬";s:2:"š";s:3:"禳";s:2:"Ţ";s:3:"籠";s:2:"ţ";s:3:"籟";s:2:"Ť";s:3:"聾";s:2:"ť";s:3:"聽";s:2:"Ŧ";s:3:"臟";s:2:"ŧ";s:3:"襲";s:2:"Ũ";s:3:"襯";s:2:"ũ";s:3:"觼";s:2:"Ū";s:3:"讀";s:2:"ū";s:3:"贖";s:2:"Ŭ";s:3:"贗";s:2:"ŭ";s:3:"躑";s:2:"Ů";s:3:"躓";s:2:"ů";s:3:"轡";s:2:"Ű";s:3:"酈";s:2:"ű";s:3:"鑄";s:2:"Ų";s:3:"鑑";s:2:"ų";s:3:"鑒";s:2:"Ŵ";s:3:"霽";s:2:"ŵ";s:3:"霾";s:2:"Ŷ";s:3:"韃";s:2:"ŷ";s:3:"韁";s:2:"Ÿ";s:3:"顫";s:2:"Ź";s:3:"饕";s:2:"ź";s:3:"驕";s:2:"Ż";s:3:"驍";s:2:"ż";s:3:"髒";s:2:"Ž";s:3:"鬚";s:2:"ž";s:3:"鱉";s:2:"ſ";s:3:"鰱";s:2:"";s:3:"鰾";s:2:"";s:3:"鰻";s:2:"";s:3:"鷓";s:2:"";s:3:"鷗";s:2:"";s:3:"鼴";s:2:"";s:3:"齬";s:2:"";s:3:"齪";s:2:"";s:3:"龔";s:2:"";s:3:"囌";s:2:"";s:3:"巖";s:2:"";s:3:"戀";s:2:"";s:3:"攣";s:2:"";s:3:"攫";s:2:"";s:3:"攪";s:2:"";s:3:"曬";s:2:"";s:3:"欐";s:2:"";s:3:"瓚";s:2:"";s:3:"竊";s:2:"";s:3:"籤";s:2:"";s:3:"籣";s:2:"";s:3:"籥";s:2:"";s:3:"纓";s:2:"";s:3:"纖";s:2:"";s:3:"纔";s:2:"";s:3:"臢";s:2:"";s:3:"蘸";s:2:"";s:3:"蘿";s:2:"";s:3:"蠱";s:2:"";s:3:"變";s:2:"";s:3:"邐";s:2:"";s:3:"邏";s:2:"";s:3:"鑣";s:2:"";s:3:"鑠";s:2:"";s:3:"鑤";s:2:"";s:3:"靨";s:2:"";s:3:"顯";s:2:"";s:3:"饜";s:2:"";s:3:"驚";s:2:"";s:3:"驛";s:2:"";s:3:"驗";s:2:"";s:3:"髓";s:2:"";s:3:"體";s:2:"";s:3:"髑";s:2:"";s:3:"鱔";s:2:"";s:3:"鱗";s:2:"";s:3:"鱖";s:2:"";s:3:"鷥";s:2:"";s:3:"麟";s:2:"";s:3:"黴";s:2:"";s:3:"囑";s:2:"";s:3:"壩";s:2:"";s:3:"攬";s:2:"";s:3:"灞";s:2:"";s:3:"癱";s:2:"";s:3:"癲";s:2:"";s:3:"矗";s:2:"";s:3:"罐";s:2:"";s:3:"羈";s:2:"";s:3:"蠶";s:2:"";s:3:"蠹";s:2:"";s:3:"衢";s:2:"";s:3:"讓";s:2:"";s:3:"讒";s:2:"@";s:3:"讖";s:2:"A";s:3:"艷";s:2:"B";s:3:"贛";s:2:"C";s:3:"釀";s:2:"D";s:3:"鑪";s:2:"E";s:3:"靂";s:2:"F";s:3:"靈";s:2:"G";s:3:"靄";s:2:"H";s:3:"韆";s:2:"I";s:3:"顰";s:2:"J";s:3:"驟";s:2:"K";s:3:"鬢";s:2:"L";s:3:"魘";s:2:"M";s:3:"鱟";s:2:"N";s:3:"鷹";s:2:"O";s:3:"鷺";s:2:"P";s:3:"鹼";s:2:"Q";s:3:"鹽";s:2:"R";s:3:"鼇";s:2:"S";s:3:"齷";s:2:"T";s:3:"齲";s:2:"U";s:3:"廳";s:2:"V";s:3:"欖";s:2:"W";s:3:"灣";s:2:"X";s:3:"籬";s:2:"Y";s:3:"籮";s:2:"Z";s:3:"蠻";s:2:"[";s:3:"觀";s:2:"\";s:3:"躡";s:2:"]";s:3:"釁";s:2:"^";s:3:"鑲";s:2:"_";s:3:"鑰";s:2:"`";s:3:"顱";s:2:"a";s:3:"饞";s:2:"b";s:3:"髖";s:2:"c";s:3:"鬣";s:2:"d";s:3:"黌";s:2:"e";s:3:"灤";s:2:"f";s:3:"矚";s:2:"g";s:3:"讚";s:2:"h";s:3:"鑷";s:2:"i";s:3:"韉";s:2:"j";s:3:"驢";s:2:"k";s:3:"驥";s:2:"l";s:3:"纜";s:2:"m";s:3:"讜";s:2:"n";s:3:"躪";s:2:"o";s:3:"釅";s:2:"p";s:3:"鑽";s:2:"q";s:3:"鑾";s:2:"r";s:3:"鑼";s:2:"s";s:3:"鱷";s:2:"t";s:3:"鱸";s:2:"u";s:3:"黷";s:2:"v";s:3:"豔";s:2:"w";s:3:"鑿";s:2:"x";s:3:"鸚";s:2:"y";s:3:"爨";s:2:"z";s:3:"驪";s:2:"{";s:3:"鬱";s:2:"|";s:3:"鸛";s:2:"}";s:3:"鸞";s:2:"~";s:3:"籲";s:2:"ơ";s:3:"ヾ";s:2:"Ƣ";s:3:"ゝ";s:2:"ƣ";s:3:"ゞ";s:2:"Ƥ";s:3:"々";s:2:"ƥ";s:3:"ぁ";s:2:"Ʀ";s:3:"あ";s:2:"Ƨ";s:3:"ぃ";s:2:"ƨ";s:3:"い";s:2:"Ʃ";s:3:"ぅ";s:2:"ƪ";s:3:"う";s:2:"ƫ";s:3:"ぇ";s:2:"Ƭ";s:3:"え";s:2:"ƭ";s:3:"ぉ";s:2:"Ʈ";s:3:"お";s:2:"Ư";s:3:"か";s:2:"ư";s:3:"が";s:2:"Ʊ";s:3:"き";s:2:"Ʋ";s:3:"ぎ";s:2:"Ƴ";s:3:"く";s:2:"ƴ";s:3:"ぐ";s:2:"Ƶ";s:3:"け";s:2:"ƶ";s:3:"げ";s:2:"Ʒ";s:3:"こ";s:2:"Ƹ";s:3:"ご";s:2:"ƹ";s:3:"さ";s:2:"ƺ";s:3:"ざ";s:2:"ƻ";s:3:"し";s:2:"Ƽ";s:3:"じ";s:2:"ƽ";s:3:"す";s:2:"ƾ";s:3:"ず";s:2:"ƿ";s:3:"せ";s:2:"";s:3:"ぜ";s:2:"";s:3:"そ";s:2:"";s:3:"ぞ";s:2:"";s:3:"た";s:2:"";s:3:"だ";s:2:"";s:3:"ち";s:2:"";s:3:"ぢ";s:2:"";s:3:"っ";s:2:"";s:3:"つ";s:2:"";s:3:"づ";s:2:"";s:3:"て";s:2:"";s:3:"で";s:2:"";s:3:"と";s:2:"";s:3:"ど";s:2:"";s:3:"な";s:2:"";s:3:"に";s:2:"";s:3:"ぬ";s:2:"";s:3:"ね";s:2:"";s:3:"の";s:2:"";s:3:"は";s:2:"";s:3:"ば";s:2:"";s:3:"ぱ";s:2:"";s:3:"ひ";s:2:"";s:3:"び";s:2:"";s:3:"ぴ";s:2:"";s:3:"ふ";s:2:"";s:3:"ぶ";s:2:"";s:3:"ぷ";s:2:"";s:3:"へ";s:2:"";s:3:"べ";s:2:"";s:3:"ぺ";s:2:"";s:3:"ほ";s:2:"";s:3:"ぼ";s:2:"";s:3:"ぽ";s:2:"";s:3:"ま";s:2:"";s:3:"み";s:2:"";s:3:"む";s:2:"";s:3:"め";s:2:"";s:3:"も";s:2:"";s:3:"ゃ";s:2:"";s:3:"や";s:2:"";s:3:"ゅ";s:2:"";s:3:"ゆ";s:2:"";s:3:"ょ";s:2:"";s:3:"よ";s:2:"";s:3:"ら";s:2:"";s:3:"り";s:2:"";s:3:"る";s:2:"";s:3:"れ";s:2:"";s:3:"ろ";s:2:"";s:3:"ゎ";s:2:"";s:3:"わ";s:2:"";s:3:"ゐ";s:2:"";s:3:"ゑ";s:2:"";s:3:"を";s:2:"";s:3:"ん";s:2:"";s:3:"ァ";s:2:"";s:3:"ア";s:2:"";s:3:"ィ";s:2:"";s:3:"イ";s:2:"";s:3:"ゥ";s:2:"";s:3:"ウ";s:2:"";s:3:"ェ";s:2:"@";s:3:"エ";s:2:"A";s:3:"ォ";s:2:"B";s:3:"オ";s:2:"C";s:3:"カ";s:2:"D";s:3:"ガ";s:2:"E";s:3:"キ";s:2:"F";s:3:"ギ";s:2:"G";s:3:"ク";s:2:"H";s:3:"グ";s:2:"I";s:3:"ケ";s:2:"J";s:3:"ゲ";s:2:"K";s:3:"コ";s:2:"L";s:3:"ゴ";s:2:"M";s:3:"サ";s:2:"N";s:3:"ザ";s:2:"O";s:3:"シ";s:2:"P";s:3:"ジ";s:2:"Q";s:3:"ス";s:2:"R";s:3:"ズ";s:2:"S";s:3:"セ";s:2:"T";s:3:"ゼ";s:2:"U";s:3:"ソ";s:2:"V";s:3:"ゾ";s:2:"W";s:3:"タ";s:2:"X";s:3:"ダ";s:2:"Y";s:3:"チ";s:2:"Z";s:3:"ヂ";s:2:"[";s:3:"ッ";s:2:"\";s:3:"ツ";s:2:"]";s:3:"ヅ";s:2:"^";s:3:"テ";s:2:"_";s:3:"デ";s:2:"`";s:3:"ト";s:2:"a";s:3:"ド";s:2:"b";s:3:"ナ";s:2:"c";s:3:"ニ";s:2:"d";s:3:"ヌ";s:2:"e";s:3:"ネ";s:2:"f";s:3:"ノ";s:2:"g";s:3:"ハ";s:2:"h";s:3:"バ";s:2:"i";s:3:"パ";s:2:"j";s:3:"ヒ";s:2:"k";s:3:"ビ";s:2:"l";s:3:"ピ";s:2:"m";s:3:"フ";s:2:"n";s:3:"ブ";s:2:"o";s:3:"プ";s:2:"p";s:3:"ヘ";s:2:"q";s:3:"ベ";s:2:"r";s:3:"ペ";s:2:"s";s:3:"ホ";s:2:"t";s:3:"ボ";s:2:"u";s:3:"ポ";s:2:"v";s:3:"マ";s:2:"w";s:3:"ミ";s:2:"x";s:3:"ム";s:2:"y";s:3:"メ";s:2:"z";s:3:"モ";s:2:"{";s:3:"ャ";s:2:"|";s:3:"ヤ";s:2:"}";s:3:"ュ";s:2:"~";s:3:"ユ";s:2:"ǡ";s:3:"ョ";s:2:"Ǣ";s:3:"ヨ";s:2:"ǣ";s:3:"ラ";s:2:"Ǥ";s:3:"リ";s:2:"ǥ";s:3:"ル";s:2:"Ǧ";s:3:"レ";s:2:"ǧ";s:3:"ロ";s:2:"Ǩ";s:3:"ヮ";s:2:"ǩ";s:3:"ワ";s:2:"Ǫ";s:3:"ヰ";s:2:"ǫ";s:3:"ヱ";s:2:"Ǭ";s:3:"ヲ";s:2:"ǭ";s:3:"ン";s:2:"Ǯ";s:3:"ヴ";s:2:"ǯ";s:3:"ヵ";s:2:"ǰ";s:3:"ヶ";s:2:"Ǳ";s:2:"Д";s:2:"ǲ";s:2:"Е";s:2:"ǳ";s:2:"Ё";s:2:"Ǵ";s:2:"Ж";s:2:"ǵ";s:2:"З";s:2:"Ƕ";s:2:"И";s:2:"Ƿ";s:2:"Й";s:2:"Ǹ";s:2:"К";s:2:"ǹ";s:2:"Л";s:2:"Ǻ";s:2:"М";s:2:"ǻ";s:2:"У";s:2:"Ǽ";s:2:"Ф";s:2:"ǽ";s:2:"Х";s:2:"Ǿ";s:2:"Ц";s:2:"ǿ";s:2:"Ч";s:2:"";s:2:"Ш";s:2:"";s:2:"Щ";s:2:"";s:2:"Ъ";s:2:"";s:2:"Ы";s:2:"";s:2:"Ь";s:2:"";s:2:"Э";s:2:"";s:2:"Ю";s:2:"";s:2:"Я";s:2:"";s:2:"а";s:2:"";s:2:"б";s:2:"";s:2:"в";s:2:"";s:2:"г";s:2:"";s:2:"д";s:2:"";s:2:"е";s:2:"";s:2:"ё";s:2:"";s:2:"ж";s:2:"";s:2:"з";s:2:"";s:2:"и";s:2:"";s:2:"й";s:2:"";s:2:"к";s:2:"";s:2:"л";s:2:"";s:2:"м";s:2:"";s:2:"н";s:2:"";s:2:"о";s:2:"";s:2:"п";s:2:"";s:2:"р";s:2:"";s:2:"с";s:2:"";s:2:"т";s:2:"";s:2:"у";s:2:"";s:2:"ф";s:2:"";s:2:"х";s:2:"";s:2:"ц";s:2:"";s:2:"ч";s:2:"";s:2:"ш";s:2:"";s:2:"щ";s:2:"";s:2:"ъ";s:2:"";s:2:"ы";s:2:"";s:2:"ь";s:2:"";s:2:"э";s:2:"";s:2:"ю";s:2:"";s:2:"я";s:2:"";s:3:"①";s:2:"";s:3:"②";s:2:"";s:3:"③";s:2:"";s:3:"④";s:2:"";s:3:"⑤";s:2:"";s:3:"⑥";s:2:"";s:3:"⑦";s:2:"";s:3:"⑧";s:2:"";s:3:"⑨";s:2:"";s:3:"⑩";s:2:"";s:3:"⑴";s:2:"";s:3:"⑵";s:2:"";s:3:"⑶";s:2:"";s:3:"⑷";s:2:"";s:3:"⑸";s:2:"";s:3:"⑹";s:2:"";s:3:"⑺";s:2:"";s:3:"⑻";s:2:"";s:3:"⑼";s:2:"";s:3:"⑽";s:2:"@";s:3:"乂";s:2:"A";s:3:"乜";s:2:"B";s:3:"凵";s:2:"C";s:3:"匚";s:2:"D";s:3:"厂";s:2:"E";s:3:"万";s:2:"F";s:3:"丌";s:2:"G";s:3:"乇";s:2:"H";s:3:"亍";s:2:"I";s:3:"囗";s:2:"J";s:3:"兀";s:2:"K";s:3:"屮";s:2:"L";s:3:"彳";s:2:"M";s:3:"丏";s:2:"N";s:3:"冇";s:2:"O";s:3:"与";s:2:"P";s:3:"丮";s:2:"Q";s:3:"亓";s:2:"R";s:3:"仂";s:2:"S";s:3:"仉";s:2:"T";s:3:"仈";s:2:"U";s:3:"冘";s:2:"V";s:3:"勼";s:2:"W";s:3:"卬";s:2:"X";s:3:"厹";s:2:"Y";s:3:"圠";s:2:"Z";s:3:"夃";s:2:"[";s:3:"夬";s:2:"\";s:3:"尐";s:2:"]";s:3:"巿";s:2:"^";s:3:"旡";s:2:"_";s:3:"殳";s:2:"`";s:3:"毌";s:2:"a";s:3:"气";s:2:"b";s:3:"爿";s:2:"c";s:3:"丱";s:2:"d";s:3:"丼";s:2:"e";s:3:"仨";s:2:"f";s:3:"仜";s:2:"g";s:3:"仩";s:2:"h";s:3:"仡";s:2:"i";s:3:"仝";s:2:"j";s:3:"仚";s:2:"k";s:3:"刌";s:2:"l";s:3:"匜";s:2:"m";s:3:"卌";s:2:"n";s:3:"圢";s:2:"o";s:3:"圣";s:2:"p";s:3:"夗";s:2:"q";s:3:"夯";s:2:"r";s:3:"宁";s:2:"s";s:3:"宄";s:2:"t";s:3:"尒";s:2:"u";s:3:"尻";s:2:"v";s:3:"屴";s:2:"w";s:3:"屳";s:2:"x";s:3:"帄";s:2:"y";s:3:"庀";s:2:"z";s:3:"庂";s:2:"{";s:3:"忉";s:2:"|";s:3:"戉";s:2:"}";s:3:"扐";s:2:"~";s:3:"氕";s:2:"ɡ";s:3:"氶";s:2:"ɢ";s:3:"汃";s:2:"ɣ";s:3:"氿";s:2:"ɤ";s:3:"氻";s:2:"ɥ";s:3:"犮";s:2:"ɦ";s:3:"犰";s:2:"ɧ";s:3:"玊";s:2:"ɨ";s:3:"禸";s:2:"ɩ";s:3:"肊";s:2:"ɪ";s:3:"阞";s:2:"ɫ";s:3:"伎";s:2:"ɬ";s:3:"优";s:2:"ɭ";s:3:"伬";s:2:"ɮ";s:3:"仵";s:2:"ɯ";s:3:"伔";s:2:"ɰ";s:3:"仱";s:2:"ɱ";s:3:"伀";s:2:"ɲ";s:3:"价";s:2:"ɳ";s:3:"伈";s:2:"ɴ";s:3:"伝";s:2:"ɵ";s:3:"伂";s:2:"ɶ";s:3:"伅";s:2:"ɷ";s:3:"伢";s:2:"ɸ";s:3:"伓";s:2:"ɹ";s:3:"伄";s:2:"ɺ";s:3:"仴";s:2:"ɻ";s:3:"伒";s:2:"ɼ";s:3:"冱";s:2:"ɽ";s:3:"刓";s:2:"ɾ";s:3:"刉";s:2:"ɿ";s:3:"刐";s:2:"";s:3:"劦";s:2:"";s:3:"匢";s:2:"";s:3:"匟";s:2:"";s:3:"卍";s:2:"";s:3:"厊";s:2:"";s:3:"吇";s:2:"";s:3:"囡";s:2:"";s:3:"囟";s:2:"";s:3:"圮";s:2:"";s:3:"圪";s:2:"";s:3:"圴";s:2:"";s:3:"夼";s:2:"";s:3:"妀";s:2:"";s:3:"奼";s:2:"";s:3:"妅";s:2:"";s:3:"奻";s:2:"";s:3:"奾";s:2:"";s:3:"奷";s:2:"";s:3:"奿";s:2:"";s:3:"孖";s:2:"";s:3:"尕";s:2:"";s:3:"尥";s:2:"";s:3:"屼";s:2:"";s:3:"屺";s:2:"";s:3:"屻";s:2:"";s:3:"屾";s:2:"";s:3:"巟";s:2:"";s:3:"幵";s:2:"";s:3:"庄";s:2:"";s:3:"异";s:2:"";s:3:"弚";s:2:"";s:3:"彴";s:2:"";s:3:"忕";s:2:"";s:3:"忔";s:2:"";s:3:"忏";s:2:"";s:3:"扜";s:2:"";s:3:"扞";s:2:"";s:3:"扤";s:2:"";s:3:"扡";s:2:"";s:3:"扦";s:2:"";s:3:"扢";s:2:"";s:3:"扙";s:2:"";s:3:"扠";s:2:"";s:3:"扚";s:2:"";s:3:"扥";s:2:"";s:3:"旯";s:2:"";s:3:"旮";s:2:"";s:3:"朾";s:2:"";s:3:"朹";s:2:"";s:3:"朸";s:2:"";s:3:"朻";s:2:"";s:3:"机";s:2:"";s:3:"朿";s:2:"";s:3:"朼";s:2:"";s:3:"朳";s:2:"";s:3:"氘";s:2:"";s:3:"汆";s:2:"";s:3:"汒";s:2:"";s:3:"汜";s:2:"";s:3:"汏";s:2:"";s:3:"汊";s:2:"";s:3:"汔";s:2:"";s:3:"汋";s:2:"@";s:3:"汌";s:2:"A";s:3:"灱";s:2:"B";s:3:"牞";s:2:"C";s:3:"犴";s:2:"D";s:3:"犵";s:2:"E";s:3:"玎";s:2:"F";s:3:"甪";s:2:"G";s:3:"癿";s:2:"H";s:3:"穵";s:2:"I";s:3:"网";s:2:"J";s:3:"艸";s:2:"K";s:3:"艼";s:2:"L";s:3:"芀";s:2:"M";s:3:"艽";s:2:"N";s:3:"艿";s:2:"O";s:3:"虍";s:2:"P";s:3:"襾";s:2:"Q";s:3:"邙";s:2:"R";s:3:"邗";s:2:"S";s:3:"邘";s:2:"T";s:3:"邛";s:2:"U";s:3:"邔";s:2:"V";s:3:"阢";s:2:"W";s:3:"阤";s:2:"X";s:3:"阠";s:2:"Y";s:3:"阣";s:2:"Z";s:3:"佖";s:2:"[";s:3:"伻";s:2:"\";s:3:"佢";s:2:"]";s:3:"佉";s:2:"^";s:3:"体";s:2:"_";s:3:"佤";s:2:"`";s:3:"伾";s:2:"a";s:3:"佧";s:2:"b";s:3:"佒";s:2:"c";s:3:"佟";s:2:"d";s:3:"佁";s:2:"e";s:3:"佘";s:2:"f";s:3:"伭";s:2:"g";s:3:"伳";s:2:"h";s:3:"伿";s:2:"i";s:3:"佡";s:2:"j";s:3:"冏";s:2:"k";s:3:"冹";s:2:"l";s:3:"刜";s:2:"m";s:3:"刞";s:2:"n";s:3:"刡";s:2:"o";s:3:"劭";s:2:"p";s:3:"劮";s:2:"q";s:3:"匉";s:2:"r";s:3:"卣";s:2:"s";s:3:"卲";s:2:"t";s:3:"厎";s:2:"u";s:3:"厏";s:2:"v";s:3:"吰";s:2:"w";s:3:"吷";s:2:"x";s:3:"吪";s:2:"y";s:3:"呔";s:2:"z";s:3:"呅";s:2:"{";s:3:"吙";s:2:"|";s:3:"吜";s:2:"}";s:3:"吥";s:2:"~";s:3:"吘";s:2:"ʡ";s:3:"吽";s:2:"ʢ";s:3:"呏";s:2:"ʣ";s:3:"呁";s:2:"ʤ";s:3:"吨";s:2:"ʥ";s:3:"吤";s:2:"ʦ";s:3:"呇";s:2:"ʧ";s:3:"囮";s:2:"ʨ";s:3:"囧";s:2:"ʩ";s:3:"囥";s:2:"ʪ";s:3:"坁";s:2:"ʫ";s:3:"坅";s:2:"ʬ";s:3:"坌";s:2:"ʭ";s:3:"坉";s:2:"ʮ";s:3:"坋";s:2:"ʯ";s:3:"坒";s:2:"ʰ";s:3:"夆";s:2:"ʱ";s:3:"奀";s:2:"ʲ";s:3:"妦";s:2:"ʳ";s:3:"妘";s:2:"ʴ";s:3:"妠";s:2:"ʵ";s:3:"妗";s:2:"ʶ";s:3:"妎";s:2:"ʷ";s:3:"妢";s:2:"ʸ";s:3:"妐";s:2:"ʹ";s:3:"妏";s:2:"ʺ";s:3:"妧";s:2:"ʻ";s:3:"妡";s:2:"ʼ";s:3:"宎";s:2:"ʽ";s:3:"宒";s:2:"ʾ";s:3:"尨";s:2:"ʿ";s:3:"尪";s:2:"";s:3:"岍";s:2:"";s:3:"岏";s:2:"";s:3:"岈";s:2:"";s:3:"岋";s:2:"";s:3:"岉";s:2:"";s:3:"岒";s:2:"";s:3:"岊";s:2:"";s:3:"岆";s:2:"";s:3:"岓";s:2:"";s:3:"岕";s:2:"";s:3:"巠";s:2:"";s:3:"帊";s:2:"";s:3:"帎";s:2:"";s:3:"庋";s:2:"";s:3:"庉";s:2:"";s:3:"庌";s:2:"";s:3:"庈";s:2:"";s:3:"庍";s:2:"";s:3:"弅";s:2:"";s:3:"弝";s:2:"";s:3:"彸";s:2:"";s:3:"彶";s:2:"";s:3:"忒";s:2:"";s:3:"忑";s:2:"";s:3:"忐";s:2:"";s:3:"忭";s:2:"";s:3:"忨";s:2:"";s:3:"忮";s:2:"";s:3:"忳";s:2:"";s:3:"忡";s:2:"";s:3:"忤";s:2:"";s:3:"忣";s:2:"";s:3:"忺";s:2:"";s:3:"忯";s:2:"";s:3:"忷";s:2:"";s:3:"忻";s:2:"";s:3:"怀";s:2:"";s:3:"忴";s:2:"";s:3:"戺";s:2:"";s:3:"抃";s:2:"";s:3:"抌";s:2:"";s:3:"抎";s:2:"";s:3:"抏";s:2:"";s:3:"抔";s:2:"";s:3:"抇";s:2:"";s:3:"扱";s:2:"";s:3:"扻";s:2:"";s:3:"扺";s:2:"";s:3:"扰";s:2:"";s:3:"抁";s:2:"";s:3:"抈";s:2:"";s:3:"扷";s:2:"";s:3:"扽";s:2:"";s:3:"扲";s:2:"";s:3:"扴";s:2:"";s:3:"攷";s:2:"";s:3:"旰";s:2:"";s:3:"旴";s:2:"";s:3:"旳";s:2:"";s:3:"旲";s:2:"";s:3:"旵";s:2:"";s:3:"杅";s:2:"";s:3:"杇";s:2:"@";s:3:"杙";s:2:"A";s:3:"杕";s:2:"B";s:3:"杌";s:2:"C";s:3:"杈";s:2:"D";s:3:"杝";s:2:"E";s:3:"杍";s:2:"F";s:3:"杚";s:2:"G";s:3:"杋";s:2:"H";s:3:"毐";s:2:"I";s:3:"氙";s:2:"J";s:3:"氚";s:2:"K";s:3:"汸";s:2:"L";s:3:"汧";s:2:"M";s:3:"汫";s:2:"N";s:3:"沄";s:2:"O";s:3:"沋";s:2:"P";s:3:"沏";s:2:"Q";s:3:"汱";s:2:"R";s:3:"汯";s:2:"S";s:3:"汩";s:2:"T";s:3:"沚";s:2:"U";s:3:"汭";s:2:"V";s:3:"沇";s:2:"W";s:3:"沕";s:2:"X";s:3:"沜";s:2:"Y";s:3:"汦";s:2:"Z";s:3:"汳";s:2:"[";s:3:"汥";s:2:"\";s:3:"汻";s:2:"]";s:3:"沎";s:2:"^";s:3:"灴";s:2:"_";s:3:"灺";s:2:"`";s:3:"牣";s:2:"a";s:3:"犿";s:2:"b";s:3:"犽";s:2:"c";s:3:"狃";s:2:"d";s:3:"狆";s:2:"e";s:3:"狁";s:2:"f";s:3:"犺";s:2:"g";s:3:"狅";s:2:"h";s:3:"玕";s:2:"i";s:3:"玗";s:2:"j";s:3:"玓";s:2:"k";s:3:"玔";s:2:"l";s:3:"玒";s:2:"m";s:3:"町";s:2:"n";s:3:"甹";s:2:"o";s:3:"疔";s:2:"p";s:3:"疕";s:2:"q";s:3:"皁";s:2:"r";s:3:"礽";s:2:"s";s:3:"耴";s:2:"t";s:3:"肕";s:2:"u";s:3:"肙";s:2:"v";s:3:"肐";s:2:"w";s:3:"肒";s:2:"x";s:3:"肜";s:2:"y";s:3:"芐";s:2:"z";s:3:"芏";s:2:"{";s:3:"芅";s:2:"|";s:3:"芎";s:2:"}";s:3:"芑";s:2:"~";s:3:"芓";s:2:"ˡ";s:3:"芊";s:2:"ˢ";s:3:"芃";s:2:"ˣ";s:3:"芄";s:2:"ˤ";s:3:"豸";s:2:"˥";s:3:"迉";s:2:"˦";s:3:"辿";s:2:"˧";s:3:"邟";s:2:"˨";s:3:"邡";s:2:"˩";s:3:"邥";s:2:"˪";s:3:"邞";s:2:"˫";s:3:"邧";s:2:"ˬ";s:3:"邠";s:2:"˭";s:3:"阰";s:2:"ˮ";s:3:"阨";s:2:"˯";s:3:"阯";s:2:"˰";s:3:"阭";s:2:"˱";s:3:"丳";s:2:"˲";s:3:"侘";s:2:"˳";s:3:"佼";s:2:"˴";s:3:"侅";s:2:"˵";s:3:"佽";s:2:"˶";s:3:"侀";s:2:"˷";s:3:"侇";s:2:"˸";s:3:"佶";s:2:"˹";s:3:"佴";s:2:"˺";s:3:"侉";s:2:"˻";s:3:"侄";s:2:"˼";s:3:"佷";s:2:"˽";s:3:"佌";s:2:"˾";s:3:"侗";s:2:"˿";s:3:"佪";s:2:"";s:3:"侚";s:2:"";s:3:"佹";s:2:"";s:3:"侁";s:2:"";s:3:"佸";s:2:"";s:3:"侐";s:2:"";s:3:"侜";s:2:"";s:3:"侔";s:2:"";s:3:"侞";s:2:"";s:3:"侒";s:2:"";s:3:"侂";s:2:"";s:3:"侕";s:2:"";s:3:"佫";s:2:"";s:3:"佮";s:2:"";s:3:"冞";s:2:"";s:3:"冼";s:2:"";s:3:"冾";s:2:"";s:3:"刵";s:2:"";s:3:"刲";s:2:"";s:3:"刳";s:2:"";s:3:"剆";s:2:"";s:3:"刱";s:2:"";s:3:"劼";s:2:"";s:3:"匊";s:2:"";s:3:"匋";s:2:"";s:3:"匼";s:2:"";s:3:"厒";s:2:"";s:3:"厔";s:2:"";s:3:"咇";s:2:"";s:3:"呿";s:2:"";s:3:"咁";s:2:"";s:3:"咑";s:2:"";s:3:"咂";s:2:"";s:3:"咈";s:2:"";s:3:"呫";s:2:"";s:3:"呺";s:2:"";s:3:"呾";s:2:"";s:3:"呥";s:2:"";s:3:"呬";s:2:"";s:3:"呴";s:2:"";s:3:"呦";s:2:"";s:3:"咍";s:2:"";s:3:"呯";s:2:"";s:3:"呡";s:2:"";s:3:"呠";s:2:"";s:3:"咘";s:2:"";s:3:"呣";s:2:"";s:3:"呧";s:2:"";s:3:"呤";s:2:"";s:3:"囷";s:2:"";s:3:"囹";s:2:"";s:3:"坯";s:2:"";s:3:"坲";s:2:"";s:3:"坭";s:2:"";s:3:"坫";s:2:"";s:3:"坱";s:2:"";s:3:"坰";s:2:"";s:3:"坶";s:2:"";s:3:"垀";s:2:"";s:3:"坵";s:2:"";s:3:"坻";s:2:"";s:3:"坳";s:2:"";s:3:"坴";s:2:"";s:3:"坢";s:2:"@";s:3:"坨";s:2:"A";s:3:"坽";s:2:"B";s:3:"夌";s:2:"C";s:3:"奅";s:2:"D";s:3:"妵";s:2:"E";s:3:"妺";s:2:"F";s:3:"姏";s:2:"G";s:3:"姎";s:2:"H";s:3:"妲";s:2:"I";s:3:"姌";s:2:"J";s:3:"姁";s:2:"K";s:3:"妶";s:2:"L";s:3:"妼";s:2:"M";s:3:"姃";s:2:"N";s:3:"姖";s:2:"O";s:3:"妱";s:2:"P";s:3:"妽";s:2:"Q";s:3:"姀";s:2:"R";s:3:"姈";s:2:"S";s:3:"妴";s:2:"T";s:3:"姇";s:2:"U";s:3:"孢";s:2:"V";s:3:"孥";s:2:"W";s:3:"宓";s:2:"X";s:3:"宕";s:2:"Y";s:3:"屄";s:2:"Z";s:3:"屇";s:2:"[";s:3:"岮";s:2:"\";s:3:"岤";s:2:"]";s:3:"岠";s:2:"^";s:3:"岵";s:2:"_";s:3:"岯";s:2:"`";s:3:"岨";s:2:"a";s:3:"岬";s:2:"b";s:3:"岟";s:2:"c";s:3:"岣";s:2:"d";s:3:"岭";s:2:"e";s:3:"岢";s:2:"f";s:3:"岪";s:2:"g";s:3:"岧";s:2:"h";s:3:"岝";s:2:"i";s:3:"岥";s:2:"j";s:3:"岶";s:2:"k";s:3:"岰";s:2:"l";s:3:"岦";s:2:"m";s:3:"帗";s:2:"n";s:3:"帔";s:2:"o";s:3:"帙";s:2:"p";s:3:"弨";s:2:"q";s:3:"弢";s:2:"r";s:3:"弣";s:2:"s";s:3:"弤";s:2:"t";s:3:"彔";s:2:"u";s:3:"徂";s:2:"v";s:3:"彾";s:2:"w";s:3:"彽";s:2:"x";s:3:"忞";s:2:"y";s:3:"忥";s:2:"z";s:3:"怭";s:2:"{";s:3:"怦";s:2:"|";s:3:"怙";s:2:"}";s:3:"怲";s:2:"~";s:3:"怋";s:2:"̡";s:3:"怴";s:2:"̢";s:3:"怊";s:2:"̣";s:3:"怗";s:2:"̤";s:3:"怳";s:2:"̥";s:3:"怚";s:2:"̦";s:3:"怞";s:2:"̧";s:3:"怬";s:2:"̨";s:3:"怢";s:2:"̩";s:3:"怍";s:2:"̪";s:3:"怐";s:2:"̫";s:3:"怮";s:2:"̬";s:3:"怓";s:2:"̭";s:3:"怑";s:2:"̮";s:3:"怌";s:2:"̯";s:3:"怉";s:2:"̰";s:3:"怜";s:2:"̱";s:3:"戔";s:2:"̲";s:3:"戽";s:2:"̳";s:3:"抭";s:2:"̴";s:3:"抴";s:2:"̵";s:3:"拑";s:2:"̶";s:3:"抾";s:2:"̷";s:3:"抪";s:2:"̸";s:3:"抶";s:2:"̹";s:3:"拊";s:2:"̺";s:3:"抮";s:2:"̻";s:3:"抳";s:2:"̼";s:3:"抯";s:2:"̽";s:3:"抻";s:2:"̾";s:3:"抩";s:2:"̿";s:3:"抰";s:2:"";s:3:"抸";s:2:"";s:3:"攽";s:2:"";s:3:"斨";s:2:"";s:3:"斻";s:2:"";s:3:"昉";s:2:"";s:3:"旼";s:2:"";s:3:"昄";s:2:"";s:3:"昒";s:2:"";s:3:"昈";s:2:"";s:3:"旻";s:2:"";s:3:"昃";s:2:"";s:3:"昋";s:2:"";s:3:"昍";s:2:"";s:3:"昅";s:2:"";s:3:"旽";s:2:"";s:3:"昑";s:2:"";s:3:"昐";s:2:"";s:3:"曶";s:2:"";s:3:"朊";s:2:"";s:3:"枅";s:2:"";s:3:"杬";s:2:"";s:3:"枎";s:2:"";s:3:"枒";s:2:"";s:3:"杶";s:2:"";s:3:"杻";s:2:"";s:3:"枘";s:2:"";s:3:"枆";s:2:"";s:3:"构";s:2:"";s:3:"杴";s:2:"";s:3:"枍";s:2:"";s:3:"枌";s:2:"";s:3:"杺";s:2:"";s:3:"枟";s:2:"";s:3:"枑";s:2:"";s:3:"枙";s:2:"";s:3:"枃";s:2:"";s:3:"杽";s:2:"";s:3:"极";s:2:"";s:3:"杸";s:2:"";s:3:"杹";s:2:"";s:3:"枔";s:2:"";s:3:"欥";s:2:"";s:3:"殀";s:2:"";s:3:"歾";s:2:"";s:3:"毞";s:2:"";s:3:"氝";s:2:"";s:3:"沓";s:2:"";s:3:"泬";s:2:"";s:3:"泫";s:2:"";s:3:"泮";s:2:"";s:3:"泙";s:2:"";s:3:"沶";s:2:"";s:3:"泔";s:2:"";s:3:"沭";s:2:"";s:3:"泧";s:2:"";s:3:"沷";s:2:"";s:3:"泐";s:2:"";s:3:"泂";s:2:"";s:3:"沺";s:2:"";s:3:"泃";s:2:"";s:3:"泆";s:2:"";s:3:"泭";s:2:"";s:3:"泲";s:2:"@";s:3:"泒";s:2:"A";s:3:"泝";s:2:"B";s:3:"沴";s:2:"C";s:3:"沊";s:2:"D";s:3:"沝";s:2:"E";s:3:"沀";s:2:"F";s:3:"泞";s:2:"G";s:3:"泀";s:2:"H";s:3:"洰";s:2:"I";s:3:"泍";s:2:"J";s:3:"泇";s:2:"K";s:3:"沰";s:2:"L";s:3:"泹";s:2:"M";s:3:"泏";s:2:"N";s:3:"泩";s:2:"O";s:3:"泑";s:2:"P";s:3:"炔";s:2:"Q";s:3:"炘";s:2:"R";s:3:"炅";s:2:"S";s:3:"炓";s:2:"T";s:3:"炆";s:2:"U";s:3:"炄";s:2:"V";s:3:"炑";s:2:"W";s:3:"炖";s:2:"X";s:3:"炂";s:2:"Y";s:3:"炚";s:2:"Z";s:3:"炃";s:2:"[";s:3:"牪";s:2:"\";s:3:"狖";s:2:"]";s:3:"狋";s:2:"^";s:3:"狘";s:2:"_";s:3:"狉";s:2:"`";s:3:"狜";s:2:"a";s:3:"狒";s:2:"b";s:3:"狔";s:2:"c";s:3:"狚";s:2:"d";s:3:"狌";s:2:"e";s:3:"狑";s:2:"f";s:3:"玤";s:2:"g";s:3:"玡";s:2:"h";s:3:"玭";s:2:"i";s:3:"玦";s:2:"j";s:3:"玢";s:2:"k";s:3:"玠";s:2:"l";s:3:"玬";s:2:"m";s:3:"玝";s:2:"n";s:3:"瓝";s:2:"o";s:3:"瓨";s:2:"p";s:3:"甿";s:2:"q";s:3:"畀";s:2:"r";s:3:"甾";s:2:"s";s:3:"疌";s:2:"t";s:3:"疘";s:2:"u";s:3:"皯";s:2:"v";s:3:"盳";s:2:"w";s:3:"盱";s:2:"x";s:3:"盰";s:2:"y";s:3:"盵";s:2:"z";s:3:"矸";s:2:"{";s:3:"矼";s:2:"|";s:3:"矹";s:2:"}";s:3:"矻";s:2:"~";s:3:"矺";s:2:"͡";s:3:"矷";s:2:"͢";s:3:"祂";s:2:"ͣ";s:3:"礿";s:2:"ͤ";s:3:"秅";s:2:"ͥ";s:3:"穸";s:2:"ͦ";s:3:"穻";s:2:"ͧ";s:3:"竻";s:2:"ͨ";s:3:"籵";s:2:"ͩ";s:3:"糽";s:2:"ͪ";s:3:"耵";s:2:"ͫ";s:3:"肏";s:2:"ͬ";s:3:"肮";s:2:"ͭ";s:3:"肣";s:2:"ͮ";s:3:"肸";s:2:"ͯ";s:3:"肵";s:2:"Ͱ";s:3:"肭";s:2:"ͱ";s:3:"舠";s:2:"Ͳ";s:3:"芠";s:2:"ͳ";s:3:"苀";s:2:"ʹ";s:3:"芫";s:2:"͵";s:3:"芚";s:2:"Ͷ";s:3:"芘";s:2:"ͷ";s:3:"芛";s:2:"͸";s:3:"芵";s:2:"͹";s:3:"芧";s:2:"ͺ";s:3:"芮";s:2:"ͻ";s:3:"芼";s:2:"ͼ";s:3:"芞";s:2:"ͽ";s:3:"芺";s:2:";";s:3:"芴";s:2:"Ϳ";s:3:"芨";s:2:"";s:3:"芡";s:2:"";s:3:"芩";s:2:"";s:3:"苂";s:2:"";s:3:"芤";s:2:"";s:3:"苃";s:2:"";s:3:"芶";s:2:"";s:3:"芢";s:2:"";s:3:"虰";s:2:"";s:3:"虯";s:2:"";s:3:"虭";s:2:"";s:3:"虮";s:2:"";s:3:"豖";s:2:"";s:3:"迒";s:2:"";s:3:"迋";s:2:"";s:3:"迓";s:2:"";s:3:"迍";s:2:"";s:3:"迖";s:2:"";s:3:"迕";s:2:"";s:3:"迗";s:2:"";s:3:"邲";s:2:"";s:3:"邴";s:2:"";s:3:"邯";s:2:"";s:3:"邳";s:2:"";s:3:"邰";s:2:"";s:3:"阹";s:2:"";s:3:"阽";s:2:"";s:3:"阼";s:2:"";s:3:"阺";s:2:"";s:3:"陃";s:2:"";s:3:"俍";s:2:"";s:3:"俅";s:2:"";s:3:"俓";s:2:"";s:3:"侲";s:2:"";s:3:"俉";s:2:"";s:3:"俋";s:2:"";s:3:"俁";s:2:"";s:3:"俔";s:2:"";s:3:"俜";s:2:"";s:3:"俙";s:2:"";s:3:"侻";s:2:"";s:3:"侳";s:2:"";s:3:"俛";s:2:"";s:3:"俇";s:2:"";s:3:"俖";s:2:"";s:3:"侺";s:2:"";s:3:"俀";s:2:"";s:3:"侹";s:2:"";s:3:"俬";s:2:"";s:3:"剄";s:2:"";s:3:"剉";s:2:"";s:3:"勀";s:2:"";s:3:"勂";s:2:"";s:3:"匽";s:2:"";s:3:"卼";s:2:"";s:3:"厗";s:2:"";s:3:"厖";s:2:"";s:3:"厙";s:2:"";s:3:"厘";s:2:"";s:3:"咺";s:2:"";s:3:"咡";s:2:"";s:3:"咭";s:2:"";s:3:"咥";s:2:"";s:3:"哏";s:2:"@";s:3:"哃";s:2:"A";s:3:"茍";s:2:"B";s:3:"咷";s:2:"C";s:3:"咮";s:2:"D";s:3:"哖";s:2:"E";s:3:"咶";s:2:"F";s:3:"哅";s:2:"G";s:3:"哆";s:2:"H";s:3:"咠";s:2:"I";s:3:"呰";s:2:"J";s:3:"咼";s:2:"K";s:3:"咢";s:2:"L";s:3:"咾";s:2:"M";s:3:"呲";s:2:"N";s:3:"哞";s:2:"O";s:3:"咰";s:2:"P";s:3:"垵";s:2:"Q";s:3:"垞";s:2:"R";s:3:"垟";s:2:"S";s:3:"垤";s:2:"T";s:3:"垌";s:2:"U";s:3:"垗";s:2:"V";s:3:"垝";s:2:"W";s:3:"垛";s:2:"X";s:3:"垔";s:2:"Y";s:3:"垘";s:2:"Z";s:3:"垏";s:2:"[";s:3:"垙";s:2:"\";s:3:"垥";s:2:"]";s:3:"垚";s:2:"^";s:3:"垕";s:2:"_";s:3:"壴";s:2:"`";s:3:"复";s:2:"a";s:3:"奓";s:2:"b";s:3:"姡";s:2:"c";s:3:"姞";s:2:"d";s:3:"姮";s:2:"e";s:3:"娀";s:2:"f";s:3:"姱";s:2:"g";s:3:"姝";s:2:"h";s:3:"姺";s:2:"i";s:3:"姽";s:2:"j";s:3:"姼";s:2:"k";s:3:"姶";s:2:"l";s:3:"姤";s:2:"m";s:3:"姲";s:2:"n";s:3:"姷";s:2:"o";s:3:"姛";s:2:"p";s:3:"姩";s:2:"q";s:3:"姳";s:2:"r";s:3:"姵";s:2:"s";s:3:"姠";s:2:"t";s:3:"姾";s:2:"u";s:3:"姴";s:2:"v";s:3:"姭";s:2:"w";s:3:"宨";s:2:"x";s:3:"屌";s:2:"y";s:3:"峐";s:2:"z";s:3:"峘";s:2:"{";s:3:"峌";s:2:"|";s:3:"峗";s:2:"}";s:3:"峋";s:2:"~";s:3:"峛";s:2:"Ρ";s:3:"峞";s:2:"΢";s:3:"峚";s:2:"Σ";s:3:"峉";s:2:"Τ";s:3:"峇";s:2:"Υ";s:3:"峊";s:2:"Φ";s:3:"峖";s:2:"Χ";s:3:"峓";s:2:"Ψ";s:3:"峔";s:2:"Ω";s:3:"峏";s:2:"Ϊ";s:3:"峈";s:2:"Ϋ";s:3:"峆";s:2:"ά";s:3:"峎";s:2:"έ";s:3:"峟";s:2:"ή";s:3:"峸";s:2:"ί";s:3:"巹";s:2:"ΰ";s:3:"帡";s:2:"α";s:3:"帢";s:2:"β";s:3:"帣";s:2:"γ";s:3:"帠";s:2:"δ";s:3:"帤";s:2:"ε";s:3:"庰";s:2:"ζ";s:3:"庤";s:2:"η";s:3:"庢";s:2:"θ";s:3:"庛";s:2:"ι";s:3:"庣";s:2:"κ";s:3:"庥";s:2:"λ";s:3:"弇";s:2:"μ";s:3:"弮";s:2:"ν";s:3:"彖";s:2:"ξ";s:3:"徆";s:2:"ο";s:3:"怷";s:2:"";s:3:"怹";s:2:"";s:3:"恔";s:2:"";s:3:"恲";s:2:"";s:3:"恞";s:2:"";s:3:"恅";s:2:"";s:3:"恓";s:2:"";s:3:"恇";s:2:"";s:3:"恉";s:2:"";s:3:"恛";s:2:"";s:3:"恌";s:2:"";s:3:"恀";s:2:"";s:3:"恂";s:2:"";s:3:"恟";s:2:"";s:3:"怤";s:2:"";s:3:"恄";s:2:"";s:3:"恘";s:2:"";s:3:"恦";s:2:"";s:3:"恮";s:2:"";s:3:"扂";s:2:"";s:3:"扃";s:2:"";s:3:"拏";s:2:"";s:3:"挍";s:2:"";s:3:"挋";s:2:"";s:3:"拵";s:2:"";s:3:"挎";s:2:"";s:3:"挃";s:2:"";s:3:"拫";s:2:"";s:3:"拹";s:2:"";s:3:"挏";s:2:"";s:3:"挌";s:2:"";s:3:"拸";s:2:"";s:3:"拶";s:2:"";s:3:"挀";s:2:"";s:3:"挓";s:2:"";s:3:"挔";s:2:"";s:3:"拺";s:2:"";s:3:"挕";s:2:"";s:3:"拻";s:2:"";s:3:"拰";s:2:"";s:3:"敁";s:2:"";s:3:"敃";s:2:"";s:3:"斪";s:2:"";s:3:"斿";s:2:"";s:3:"昶";s:2:"";s:3:"昡";s:2:"";s:3:"昲";s:2:"";s:3:"昵";s:2:"";s:3:"昜";s:2:"";s:3:"昦";s:2:"";s:3:"昢";s:2:"";s:3:"昳";s:2:"";s:3:"昫";s:2:"";s:3:"昺";s:2:"";s:3:"昝";s:2:"";s:3:"昴";s:2:"";s:3:"昹";s:2:"";s:3:"昮";s:2:"";s:3:"朏";s:2:"";s:3:"朐";s:2:"";s:3:"柁";s:2:"";s:3:"柲";s:2:"";s:3:"柈";s:2:"";s:3:"枺";s:2:"@";s:3:"柜";s:2:"A";s:3:"枻";s:2:"B";s:3:"柸";s:2:"C";s:3:"柘";s:2:"D";s:3:"柀";s:2:"E";s:3:"枷";s:2:"F";s:3:"柅";s:2:"G";s:3:"柫";s:2:"H";s:3:"柤";s:2:"I";s:3:"柟";s:2:"J";s:3:"枵";s:2:"K";s:3:"柍";s:2:"L";s:3:"枳";s:2:"M";s:3:"柷";s:2:"N";s:3:"柶";s:2:"O";s:3:"柮";s:2:"P";s:3:"柣";s:2:"Q";s:3:"柂";s:2:"R";s:3:"枹";s:2:"S";s:3:"柎";s:2:"T";s:3:"柧";s:2:"U";s:3:"柰";s:2:"V";s:3:"枲";s:2:"W";s:3:"柼";s:2:"X";s:3:"柆";s:2:"Y";s:3:"柭";s:2:"Z";s:3:"柌";s:2:"[";s:3:"枮";s:2:"\";s:3:"柦";s:2:"]";s:3:"柛";s:2:"^";s:3:"柺";s:2:"_";s:3:"柉";s:2:"`";s:3:"柊";s:2:"a";s:3:"柃";s:2:"b";s:3:"柪";s:2:"c";s:3:"柋";s:2:"d";s:3:"欨";s:2:"e";s:3:"殂";s:2:"f";s:3:"殄";s:2:"g";s:3:"殶";s:2:"h";s:3:"毖";s:2:"i";s:3:"毘";s:2:"j";s:3:"毠";s:2:"k";s:3:"氠";s:2:"l";s:3:"氡";s:2:"m";s:3:"洨";s:2:"n";s:3:"洴";s:2:"o";s:3:"洭";s:2:"p";s:3:"洟";s:2:"q";s:3:"洼";s:2:"r";s:3:"洿";s:2:"s";s:3:"洒";s:2:"t";s:3:"洊";s:2:"u";s:3:"泚";s:2:"v";s:3:"洳";s:2:"w";s:3:"洄";s:2:"x";s:3:"洙";s:2:"y";s:3:"洺";s:2:"z";s:3:"洚";s:2:"{";s:3:"洑";s:2:"|";s:3:"洀";s:2:"}";s:3:"洝";s:2:"~";s:3:"浂";s:2:"ϡ";s:3:"洁";s:2:"Ϣ";s:3:"洘";s:2:"ϣ";s:3:"洷";s:2:"Ϥ";s:3:"洃";s:2:"ϥ";s:3:"洏";s:2:"Ϧ";s:3:"浀";s:2:"ϧ";s:3:"洇";s:2:"Ϩ";s:3:"洠";s:2:"ϩ";s:3:"洬";s:2:"Ϫ";s:3:"洈";s:2:"ϫ";s:3:"洢";s:2:"Ϭ";s:3:"洉";s:2:"ϭ";s:3:"洐";s:2:"Ϯ";s:3:"炷";s:2:"ϯ";s:3:"炟";s:2:"ϰ";s:3:"炾";s:2:"ϱ";s:3:"炱";s:2:"ϲ";s:3:"炰";s:2:"ϳ";s:3:"炡";s:2:"ϴ";s:3:"炴";s:2:"ϵ";s:3:"炵";s:2:"϶";s:3:"炩";s:2:"Ϸ";s:3:"牁";s:2:"ϸ";s:3:"牉";s:2:"Ϲ";s:3:"牊";s:2:"Ϻ";s:3:"牬";s:2:"ϻ";s:3:"牰";s:2:"ϼ";s:3:"牳";s:2:"Ͻ";s:3:"牮";s:2:"Ͼ";s:3:"狊";s:2:"Ͽ";s:3:"狤";s:2:"";s:3:"狨";s:2:"";s:3:"狫";s:2:"";s:3:"狟";s:2:"";s:3:"狪";s:2:"";s:3:"狦";s:2:"";s:3:"狣";s:2:"";s:3:"玅";s:2:"";s:3:"珌";s:2:"";s:3:"珂";s:2:"";s:3:"珈";s:2:"";s:3:"珅";s:2:"";s:3:"玹";s:2:"";s:3:"玶";s:2:"";s:3:"玵";s:2:"";s:3:"玴";s:2:"";s:3:"珫";s:2:"";s:3:"玿";s:2:"";s:3:"珇";s:2:"";s:3:"玾";s:2:"";s:3:"珃";s:2:"";s:3:"珆";s:2:"";s:3:"玸";s:2:"";s:3:"珋";s:2:"";s:3:"瓬";s:2:"";s:3:"瓮";s:2:"";s:3:"甮";s:2:"";s:3:"畇";s:2:"";s:3:"畈";s:2:"";s:3:"疧";s:2:"";s:3:"疪";s:2:"";s:3:"癹";s:2:"";s:3:"盄";s:2:"";s:3:"眈";s:2:"";s:3:"眃";s:2:"";s:3:"眄";s:2:"";s:3:"眅";s:2:"";s:3:"眊";s:2:"";s:3:"盷";s:2:"";s:3:"盻";s:2:"";s:3:"盺";s:2:"";s:3:"矧";s:2:"";s:3:"矨";s:2:"";s:3:"砆";s:2:"";s:3:"砑";s:2:"";s:3:"砒";s:2:"";s:3:"砅";s:2:"";s:3:"砐";s:2:"";s:3:"砏";s:2:"";s:3:"砎";s:2:"";s:3:"砉";s:2:"";s:3:"砃";s:2:"";s:3:"砓";s:2:"";s:3:"祊";s:2:"";s:3:"祌";s:2:"";s:3:"祋";s:2:"";s:3:"祅";s:2:"";s:3:"祄";s:2:"";s:3:"秕";s:2:"";s:3:"种";s:2:"";s:3:"秏";s:2:"";s:3:"秖";s:2:"";s:3:"秎";s:2:"";s:3:"窀";s:2:"@";s:3:"穾";s:2:"A";s:3:"竑";s:2:"B";s:3:"笀";s:2:"C";s:3:"笁";s:2:"D";s:3:"籺";s:2:"E";s:3:"籸";s:2:"F";s:3:"籹";s:2:"G";s:3:"籿";s:2:"H";s:3:"粀";s:2:"I";s:3:"粁";s:2:"J";s:3:"紃";s:2:"K";s:3:"紈";s:2:"L";s:3:"紁";s:2:"M";s:3:"罘";s:2:"N";s:3:"羑";s:2:"O";s:3:"羍";s:2:"P";s:3:"羾";s:2:"Q";s:3:"耇";s:2:"R";s:3:"耎";s:2:"S";s:3:"耏";s:2:"T";s:3:"耔";s:2:"U";s:3:"耷";s:2:"V";s:3:"胘";s:2:"W";s:3:"胇";s:2:"X";s:3:"胠";s:2:"Y";s:3:"胑";s:2:"Z";s:3:"胈";s:2:"[";s:3:"胂";s:2:"\";s:3:"胐";s:2:"]";s:3:"胅";s:2:"^";s:3:"胣";s:2:"_";s:3:"胙";s:2:"`";s:3:"胜";s:2:"a";s:3:"胊";s:2:"b";s:3:"胕";s:2:"c";s:3:"胉";s:2:"d";s:3:"胏";s:2:"e";s:3:"胗";s:2:"f";s:3:"胦";s:2:"g";s:3:"胍";s:2:"h";s:3:"臿";s:2:"i";s:3:"舡";s:2:"j";s:3:"芔";s:2:"k";s:3:"苙";s:2:"l";s:3:"苾";s:2:"m";s:3:"苹";s:2:"n";s:3:"茇";s:2:"o";s:3:"苨";s:2:"p";s:3:"茀";s:2:"q";s:3:"苕";s:2:"r";s:3:"茺";s:2:"s";s:3:"苫";s:2:"t";s:3:"苖";s:2:"u";s:3:"苴";s:2:"v";s:3:"苬";s:2:"w";s:3:"苡";s:2:"x";s:3:"苲";s:2:"y";s:3:"苵";s:2:"z";s:3:"茌";s:2:"{";s:3:"苻";s:2:"|";s:3:"苶";s:2:"}";s:3:"苰";s:2:"~";s:3:"苪";s:2:"С";s:3:"苤";s:2:"Т";s:3:"苠";s:2:"У";s:3:"苺";s:2:"Ф";s:3:"苳";s:2:"Х";s:3:"苭";s:2:"Ц";s:3:"虷";s:2:"Ч";s:3:"虴";s:2:"Ш";s:3:"虼";s:2:"Щ";s:3:"虳";s:2:"Ъ";s:3:"衁";s:2:"Ы";s:3:"衎";s:2:"Ь";s:3:"衧";s:2:"Э";s:3:"衪";s:2:"Ю";s:3:"衩";s:2:"Я";s:3:"觓";s:2:"а";s:3:"訄";s:2:"б";s:3:"訇";s:2:"в";s:3:"赲";s:2:"г";s:3:"迣";s:2:"д";s:3:"迡";s:2:"е";s:3:"迮";s:2:"ж";s:3:"迠";s:2:"з";s:3:"郱";s:2:"и";s:3:"邽";s:2:"й";s:3:"邿";s:2:"к";s:3:"郕";s:2:"л";s:3:"郅";s:2:"м";s:3:"邾";s:2:"н";s:3:"郇";s:2:"о";s:3:"郋";s:2:"п";s:3:"郈";s:2:"";s:3:"釔";s:2:"";s:3:"釓";s:2:"";s:3:"陔";s:2:"";s:3:"陏";s:2:"";s:3:"陑";s:2:"";s:3:"陓";s:2:"";s:3:"陊";s:2:"";s:3:"陎";s:2:"";s:3:"倞";s:2:"";s:3:"倅";s:2:"";s:3:"倇";s:2:"";s:3:"倓";s:2:"";s:3:"倢";s:2:"";s:3:"倰";s:2:"";s:3:"倛";s:2:"";s:3:"俵";s:2:"";s:3:"俴";s:2:"";s:3:"倳";s:2:"";s:3:"倷";s:2:"";s:3:"倬";s:2:"";s:3:"俶";s:2:"";s:3:"俷";s:2:"";s:3:"倗";s:2:"";s:3:"倜";s:2:"";s:3:"倠";s:2:"";s:3:"倧";s:2:"";s:3:"倵";s:2:"";s:3:"倯";s:2:"";s:3:"倱";s:2:"";s:3:"倎";s:2:"";s:3:"党";s:2:"";s:3:"冔";s:2:"";s:3:"冓";s:2:"";s:3:"凊";s:2:"";s:3:"凄";s:2:"";s:3:"凅";s:2:"";s:3:"凈";s:2:"";s:3:"凎";s:2:"";s:3:"剡";s:2:"";s:3:"剚";s:2:"";s:3:"剒";s:2:"";s:3:"剞";s:2:"";s:3:"剟";s:2:"";s:3:"剕";s:2:"";s:3:"剢";s:2:"";s:3:"勍";s:2:"";s:3:"匎";s:2:"";s:3:"厞";s:2:"";s:3:"唦";s:2:"";s:3:"哢";s:2:"";s:3:"唗";s:2:"";s:3:"唒";s:2:"";s:3:"哧";s:2:"";s:3:"哳";s:2:"";s:3:"哤";s:2:"";s:3:"唚";s:2:"";s:3:"哿";s:2:"";s:3:"唄";s:2:"";s:3:"唈";s:2:"";s:3:"哫";s:2:"";s:3:"唑";s:2:"";s:3:"唅";s:2:"";s:3:"哱";s:2:"@";s:3:"唊";s:2:"A";s:3:"哻";s:2:"B";s:3:"哷";s:2:"C";s:3:"哸";s:2:"D";s:3:"哠";s:2:"E";s:3:"唎";s:2:"F";s:3:"唃";s:2:"G";s:3:"唋";s:2:"H";s:3:"圁";s:2:"I";s:3:"圂";s:2:"J";s:3:"埌";s:2:"K";s:3:"堲";s:2:"L";s:3:"埕";s:2:"M";s:3:"埒";s:2:"N";s:3:"垺";s:2:"O";s:3:"埆";s:2:"P";s:3:"垽";s:2:"Q";s:3:"垼";s:2:"R";s:3:"垸";s:2:"S";s:3:"垶";s:2:"T";s:3:"垿";s:2:"U";s:3:"埇";s:2:"V";s:3:"埐";s:2:"W";s:3:"垹";s:2:"X";s:3:"埁";s:2:"Y";s:3:"夎";s:2:"Z";s:3:"奊";s:2:"[";s:3:"娙";s:2:"\";s:3:"娖";s:2:"]";s:3:"娭";s:2:"^";s:3:"娮";s:2:"_";s:3:"娕";s:2:"`";s:3:"娏";s:2:"a";s:3:"娗";s:2:"b";s:3:"娊";s:2:"c";s:3:"娞";s:2:"d";s:3:"娳";s:2:"e";s:3:"孬";s:2:"f";s:3:"宧";s:2:"g";s:3:"宭";s:2:"h";s:3:"宬";s:2:"i";s:3:"尃";s:2:"j";s:3:"屖";s:2:"k";s:3:"屔";s:2:"l";s:3:"峬";s:2:"m";s:3:"峿";s:2:"n";s:3:"峮";s:2:"o";s:3:"峱";s:2:"p";s:3:"峷";s:2:"q";s:3:"崀";s:2:"r";s:3:"峹";s:2:"s";s:3:"帩";s:2:"t";s:3:"帨";s:2:"u";s:3:"庨";s:2:"v";s:3:"庮";s:2:"w";s:3:"庪";s:2:"x";s:3:"庬";s:2:"y";s:3:"弳";s:2:"z";s:3:"弰";s:2:"{";s:3:"彧";s:2:"|";s:3:"恝";s:2:"}";s:3:"恚";s:2:"~";s:3:"恧";s:2:"ѡ";s:3:"恁";s:2:"Ѣ";s:3:"悢";s:2:"ѣ";s:3:"悈";s:2:"Ѥ";s:3:"悀";s:2:"ѥ";s:3:"悒";s:2:"Ѧ";s:3:"悁";s:2:"ѧ";s:3:"悝";s:2:"Ѩ";s:3:"悃";s:2:"ѩ";s:3:"悕";s:2:"Ѫ";s:3:"悛";s:2:"ѫ";s:3:"悗";s:2:"Ѭ";s:3:"悇";s:2:"ѭ";s:3:"悜";s:2:"Ѯ";s:3:"悎";s:2:"ѯ";s:3:"戙";s:2:"Ѱ";s:3:"扆";s:2:"ѱ";s:3:"拲";s:2:"Ѳ";s:3:"挐";s:2:"ѳ";s:3:"捖";s:2:"Ѵ";s:3:"挬";s:2:"ѵ";s:3:"捄";s:2:"Ѷ";s:3:"捅";s:2:"ѷ";s:3:"挶";s:2:"Ѹ";s:3:"捃";s:2:"ѹ";s:3:"揤";s:2:"Ѻ";s:3:"挹";s:2:"ѻ";s:3:"捋";s:2:"Ѽ";s:3:"捊";s:2:"ѽ";s:3:"挼";s:2:"Ѿ";s:3:"挩";s:2:"ѿ";s:3:"捁";s:2:"";s:3:"挴";s:2:"";s:3:"捘";s:2:"";s:3:"捔";s:2:"";s:3:"捙";s:2:"";s:3:"挭";s:2:"";s:3:"捇";s:2:"";s:3:"挳";s:2:"";s:3:"捚";s:2:"";s:3:"捑";s:2:"";s:3:"挸";s:2:"";s:3:"捗";s:2:"";s:3:"捀";s:2:"";s:3:"捈";s:2:"";s:3:"敊";s:2:"";s:3:"敆";s:2:"";s:3:"旆";s:2:"";s:3:"旃";s:2:"";s:3:"旄";s:2:"";s:3:"旂";s:2:"";s:3:"晊";s:2:"";s:3:"晟";s:2:"";s:3:"晇";s:2:"";s:3:"晑";s:2:"";s:3:"朒";s:2:"";s:3:"朓";s:2:"";s:3:"栟";s:2:"";s:3:"栚";s:2:"";s:3:"桉";s:2:"";s:3:"栲";s:2:"";s:3:"栳";s:2:"";s:3:"栻";s:2:"";s:3:"桋";s:2:"";s:3:"桏";s:2:"";s:3:"栖";s:2:"";s:3:"栱";s:2:"";s:3:"栜";s:2:"";s:3:"栵";s:2:"";s:3:"栫";s:2:"";s:3:"栭";s:2:"";s:3:"栯";s:2:"";s:3:"桎";s:2:"";s:3:"桄";s:2:"";s:3:"栴";s:2:"";s:3:"栝";s:2:"";s:3:"栒";s:2:"";s:3:"栔";s:2:"";s:3:"栦";s:2:"";s:3:"栨";s:2:"";s:3:"栮";s:2:"";s:3:"桍";s:2:"";s:3:"栺";s:2:"";s:3:"栥";s:2:"";s:3:"栠";s:2:"";s:3:"欬";s:2:"";s:3:"欯";s:2:"";s:3:"欭";s:2:"";s:3:"欱";s:2:"";s:3:"欴";s:2:"";s:3:"歭";s:2:"";s:3:"肂";s:2:"";s:3:"殈";s:2:"";s:3:"毦";s:2:"";s:3:"毤";s:2:"@";s:3:"毨";s:2:"A";s:3:"毣";s:2:"B";s:3:"毢";s:2:"C";s:3:"毧";s:2:"D";s:3:"氥";s:2:"E";s:3:"浺";s:2:"F";s:3:"浣";s:2:"G";s:3:"浤";s:2:"H";s:3:"浶";s:2:"I";s:3:"洍";s:2:"J";s:3:"浡";s:2:"K";s:3:"涒";s:2:"L";s:3:"浘";s:2:"M";s:3:"浢";s:2:"N";s:3:"浭";s:2:"O";s:3:"浯";s:2:"P";s:3:"涑";s:2:"Q";s:3:"涍";s:2:"R";s:3:"淯";s:2:"S";s:3:"浿";s:2:"T";s:3:"涆";s:2:"U";s:3:"浞";s:2:"V";s:3:"浧";s:2:"W";s:3:"浠";s:2:"X";s:3:"涗";s:2:"Y";s:3:"浰";s:2:"Z";s:3:"浼";s:2:"[";s:3:"浟";s:2:"\";s:3:"涂";s:2:"]";s:3:"涘";s:2:"^";s:3:"洯";s:2:"_";s:3:"浨";s:2:"`";s:3:"涋";s:2:"a";s:3:"浾";s:2:"b";s:3:"涀";s:2:"c";s:3:"涄";s:2:"d";s:3:"洖";s:2:"e";s:3:"涃";s:2:"f";s:3:"浻";s:2:"g";s:3:"浽";s:2:"h";s:3:"浵";s:2:"i";s:3:"涐";s:2:"j";s:3:"烜";s:2:"k";s:3:"烓";s:2:"l";s:3:"烑";s:2:"m";s:3:"烝";s:2:"n";s:3:"烋";s:2:"o";s:3:"缹";s:2:"p";s:3:"烢";s:2:"q";s:3:"烗";s:2:"r";s:3:"烒";s:2:"s";s:3:"烞";s:2:"t";s:3:"烠";s:2:"u";s:3:"烔";s:2:"v";s:3:"烍";s:2:"w";s:3:"烅";s:2:"x";s:3:"烆";s:2:"y";s:3:"烇";s:2:"z";s:3:"烚";s:2:"{";s:3:"烎";s:2:"|";s:3:"烡";s:2:"}";s:3:"牂";s:2:"~";s:3:"牸";s:2:"ҡ";s:3:"牷";s:2:"Ң";s:3:"牶";s:2:"ң";s:3:"猀";s:2:"Ҥ";s:3:"狺";s:2:"ҥ";s:3:"狴";s:2:"Ҧ";s:3:"狾";s:2:"ҧ";s:3:"狶";s:2:"Ҩ";s:3:"狳";s:2:"ҩ";s:3:"狻";s:2:"Ҫ";s:3:"猁";s:2:"ҫ";s:3:"珓";s:2:"Ҭ";s:3:"珙";s:2:"ҭ";s:3:"珥";s:2:"Ү";s:3:"珖";s:2:"ү";s:3:"玼";s:2:"Ұ";s:3:"珧";s:2:"ұ";s:3:"珣";s:2:"Ҳ";s:3:"珩";s:2:"ҳ";s:3:"珜";s:2:"Ҵ";s:3:"珒";s:2:"ҵ";s:3:"珛";s:2:"Ҷ";s:3:"珔";s:2:"ҷ";s:3:"珝";s:2:"Ҹ";s:3:"珚";s:2:"ҹ";s:3:"珗";s:2:"Һ";s:3:"珘";s:2:"һ";s:3:"珨";s:2:"Ҽ";s:3:"瓞";s:2:"ҽ";s:3:"瓟";s:2:"Ҿ";s:3:"瓴";s:2:"ҿ";s:3:"瓵";s:2:"";s:3:"甡";s:2:"";s:3:"畛";s:2:"";s:3:"畟";s:2:"";s:3:"疰";s:2:"";s:3:"痁";s:2:"";s:3:"疻";s:2:"";s:3:"痄";s:2:"";s:3:"痀";s:2:"";s:3:"疿";s:2:"";s:3:"疶";s:2:"";s:3:"疺";s:2:"";s:3:"皊";s:2:"";s:3:"盉";s:2:"";s:3:"眝";s:2:"";s:3:"眛";s:2:"";s:3:"眐";s:2:"";s:3:"眓";s:2:"";s:3:"眒";s:2:"";s:3:"眣";s:2:"";s:3:"眑";s:2:"";s:3:"眕";s:2:"";s:3:"眙";s:2:"";s:3:"眚";s:2:"";s:3:"眢";s:2:"";s:3:"眧";s:2:"";s:3:"砣";s:2:"";s:3:"砬";s:2:"";s:3:"砢";s:2:"";s:3:"砵";s:2:"";s:3:"砯";s:2:"";s:3:"砨";s:2:"";s:3:"砮";s:2:"";s:3:"砫";s:2:"";s:3:"砡";s:2:"";s:3:"砩";s:2:"";s:3:"砳";s:2:"";s:3:"砪";s:2:"";s:3:"砱";s:2:"";s:3:"祔";s:2:"";s:3:"祛";s:2:"";s:3:"祏";s:2:"";s:3:"祜";s:2:"";s:3:"祓";s:2:"";s:3:"祒";s:2:"";s:3:"祑";s:2:"";s:3:"秫";s:2:"";s:3:"秬";s:2:"";s:3:"秠";s:2:"";s:3:"秮";s:2:"";s:3:"秭";s:2:"";s:3:"秪";s:2:"";s:3:"秜";s:2:"";s:3:"秞";s:2:"";s:3:"秝";s:2:"";s:3:"窆";s:2:"";s:3:"窉";s:2:"";s:3:"窅";s:2:"";s:3:"窋";s:2:"";s:3:"窌";s:2:"";s:3:"窊";s:2:"";s:3:"窇";s:2:"";s:3:"竘";s:2:"";s:3:"笐";s:2:"@";s:3:"笄";s:2:"A";s:3:"笓";s:2:"B";s:3:"笅";s:2:"C";s:3:"笏";s:2:"D";s:3:"笈";s:2:"E";s:3:"笊";s:2:"F";s:3:"笎";s:2:"G";s:3:"笉";s:2:"H";s:3:"笒";s:2:"I";s:3:"粄";s:2:"J";s:3:"粑";s:2:"K";s:3:"粊";s:2:"L";s:3:"粌";s:2:"M";s:3:"粈";s:2:"N";s:3:"粍";s:2:"O";s:3:"粅";s:2:"P";s:3:"紞";s:2:"Q";s:3:"紝";s:2:"R";s:3:"紑";s:2:"S";s:3:"紎";s:2:"T";s:3:"紘";s:2:"U";s:3:"紖";s:2:"V";s:3:"紓";s:2:"W";s:3:"紟";s:2:"X";s:3:"紒";s:2:"Y";s:3:"紏";s:2:"Z";s:3:"紌";s:2:"[";s:3:"罜";s:2:"\";s:3:"罡";s:2:"]";s:3:"罞";s:2:"^";s:3:"罠";s:2:"_";s:3:"罝";s:2:"`";s:3:"罛";s:2:"a";s:3:"羖";s:2:"b";s:3:"羒";s:2:"c";s:3:"翃";s:2:"d";s:3:"翂";s:2:"e";s:3:"翀";s:2:"f";s:3:"耖";s:2:"g";s:3:"耾";s:2:"h";s:3:"耹";s:2:"i";s:3:"胺";s:2:"j";s:3:"胲";s:2:"k";s:3:"胹";s:2:"l";s:3:"胵";s:2:"m";s:3:"脁";s:2:"n";s:3:"胻";s:2:"o";s:3:"脀";s:2:"p";s:3:"舁";s:2:"q";s:3:"舯";s:2:"r";s:3:"舥";s:2:"s";s:3:"茳";s:2:"t";s:3:"茭";s:2:"u";s:3:"荄";s:2:"v";s:3:"茙";s:2:"w";s:3:"荑";s:2:"x";s:3:"茥";s:2:"y";s:3:"荖";s:2:"z";s:3:"茿";s:2:"{";s:3:"荁";s:2:"|";s:3:"茦";s:2:"}";s:3:"茜";s:2:"~";s:3:"茢";s:2:"ӡ";s:3:"荂";s:2:"Ӣ";s:3:"荎";s:2:"ӣ";s:3:"茛";s:2:"Ӥ";s:3:"茪";s:2:"ӥ";s:3:"茈";s:2:"Ӧ";s:3:"茼";s:2:"ӧ";s:3:"荍";s:2:"Ө";s:3:"茖";s:2:"ө";s:3:"茤";s:2:"Ӫ";s:3:"茠";s:2:"ӫ";s:3:"茷";s:2:"Ӭ";s:3:"茯";s:2:"ӭ";s:3:"茩";s:2:"Ӯ";s:3:"荇";s:2:"ӯ";s:3:"荅";s:2:"Ӱ";s:3:"荌";s:2:"ӱ";s:3:"荓";s:2:"Ӳ";s:3:"茞";s:2:"ӳ";s:3:"茬";s:2:"Ӵ";s:3:"荋";s:2:"ӵ";s:3:"茧";s:2:"Ӷ";s:3:"荈";s:2:"ӷ";s:3:"虓";s:2:"Ӹ";s:3:"虒";s:2:"ӹ";s:3:"蚢";s:2:"Ӻ";s:3:"蚨";s:2:"ӻ";s:3:"蚖";s:2:"Ӽ";s:3:"蚍";s:2:"ӽ";s:3:"蚑";s:2:"Ӿ";s:3:"蚞";s:2:"ӿ";s:3:"蚇";s:2:"";s:3:"蚗";s:2:"";s:3:"蚆";s:2:"";s:3:"蚋";s:2:"";s:3:"蚚";s:2:"";s:3:"蚅";s:2:"";s:3:"蚥";s:2:"";s:3:"蚙";s:2:"";s:3:"蚡";s:2:"";s:3:"蚧";s:2:"";s:3:"蚕";s:2:"";s:3:"蚘";s:2:"";s:3:"蚎";s:2:"";s:3:"蚝";s:2:"";s:3:"蚐";s:2:"";s:3:"蚔";s:2:"";s:3:"衃";s:2:"";s:3:"衄";s:2:"";s:3:"衭";s:2:"";s:3:"衵";s:2:"";s:3:"衶";s:2:"";s:3:"衲";s:2:"";s:3:"袀";s:2:"";s:3:"衱";s:2:"";s:3:"衿";s:2:"";s:3:"衯";s:2:"";s:3:"袃";s:2:"";s:3:"衾";s:2:"";s:3:"衴";s:2:"";s:3:"衼";s:2:"";s:3:"訒";s:2:"";s:3:"豇";s:2:"";s:3:"豗";s:2:"";s:3:"豻";s:2:"";s:3:"貤";s:2:"";s:3:"貣";s:2:"";s:3:"赶";s:2:"";s:3:"赸";s:2:"";s:3:"趵";s:2:"";s:3:"趷";s:2:"";s:3:"趶";s:2:"";s:3:"軑";s:2:"";s:3:"軓";s:2:"";s:3:"迾";s:2:"";s:3:"迵";s:2:"";s:3:"适";s:2:"";s:3:"迿";s:2:"";s:3:"迻";s:2:"";s:3:"逄";s:2:"";s:3:"迼";s:2:"";s:3:"迶";s:2:"";s:3:"郖";s:2:"";s:3:"郠";s:2:"";s:3:"郙";s:2:"";s:3:"郚";s:2:"";s:3:"郣";s:2:"";s:3:"郟";s:2:"";s:3:"郥";s:2:"";s:3:"郘";s:2:"";s:3:"郛";s:2:"";s:3:"郗";s:2:"";s:3:"郜";s:2:"";s:3:"郤";s:2:"";s:3:"酐";s:2:"@";s:3:"酎";s:2:"A";s:3:"酏";s:2:"B";s:3:"釕";s:2:"C";s:3:"釢";s:2:"D";s:3:"釚";s:2:"E";s:3:"陜";s:2:"F";s:3:"陟";s:2:"G";s:3:"隼";s:2:"H";s:3:"飣";s:2:"I";s:3:"髟";s:2:"J";s:3:"鬯";s:2:"K";s:3:"乿";s:2:"L";s:3:"偰";s:2:"M";s:3:"偪";s:2:"N";s:3:"偡";s:2:"O";s:3:"偞";s:2:"P";s:3:"偠";s:2:"Q";s:3:"偓";s:2:"R";s:3:"偋";s:2:"S";s:3:"偝";s:2:"T";s:3:"偲";s:2:"U";s:3:"偈";s:2:"V";s:3:"偍";s:2:"W";s:3:"偁";s:2:"X";s:3:"偛";s:2:"Y";s:3:"偊";s:2:"Z";s:3:"偢";s:2:"[";s:3:"倕";s:2:"\";s:3:"偅";s:2:"]";s:3:"偟";s:2:"^";s:3:"偩";s:2:"_";s:3:"偫";s:2:"`";s:3:"偣";s:2:"a";s:3:"偤";s:2:"b";s:3:"偆";s:2:"c";s:3:"偀";s:2:"d";s:3:"偮";s:2:"e";s:3:"偳";s:2:"f";s:3:"偗";s:2:"g";s:3:"偑";s:2:"h";s:3:"凐";s:2:"i";s:3:"剫";s:2:"j";s:3:"剭";s:2:"k";s:3:"剬";s:2:"l";s:3:"剮";s:2:"m";s:3:"勖";s:2:"n";s:3:"勓";s:2:"o";s:3:"匭";s:2:"p";s:3:"厜";s:2:"q";s:3:"啵";s:2:"r";s:3:"啶";s:2:"s";s:3:"唼";s:2:"t";s:3:"啍";s:2:"u";s:3:"啐";s:2:"v";s:3:"唴";s:2:"w";s:3:"唪";s:2:"x";s:3:"啑";s:2:"y";s:3:"啢";s:2:"z";s:3:"唶";s:2:"{";s:3:"唵";s:2:"|";s:3:"唰";s:2:"}";s:3:"啒";s:2:"~";s:3:"啅";s:2:"ԡ";s:3:"唌";s:2:"Ԣ";s:3:"唲";s:2:"ԣ";s:3:"啥";s:2:"Ԥ";s:3:"啎";s:2:"ԥ";s:3:"唹";s:2:"Ԧ";s:3:"啈";s:2:"ԧ";s:3:"唭";s:2:"Ԩ";s:3:"唻";s:2:"ԩ";s:3:"啀";s:2:"Ԫ";s:3:"啋";s:2:"ԫ";s:3:"圊";s:2:"Ԭ";s:3:"圇";s:2:"ԭ";s:3:"埻";s:2:"Ԯ";s:3:"堔";s:2:"ԯ";s:3:"埢";s:2:"԰";s:3:"埶";s:2:"Ա";s:3:"埜";s:2:"Բ";s:3:"埴";s:2:"Գ";s:3:"堀";s:2:"Դ";s:3:"埭";s:2:"Ե";s:3:"埽";s:2:"Զ";s:3:"堈";s:2:"Է";s:3:"埸";s:2:"Ը";s:3:"堋";s:2:"Թ";s:3:"埳";s:2:"Ժ";s:3:"埏";s:2:"Ի";s:3:"堇";s:2:"Լ";s:3:"埮";s:2:"Խ";s:3:"埣";s:2:"Ծ";s:3:"埲";s:2:"Կ";s:3:"埥";s:2:"";s:3:"埬";s:2:"";s:3:"埡";s:2:"";s:3:"堎";s:2:"";s:3:"埼";s:2:"";s:3:"堐";s:2:"";s:3:"埧";s:2:"";s:3:"堁";s:2:"";s:3:"堌";s:2:"";s:3:"埱";s:2:"";s:3:"埩";s:2:"";s:3:"埰";s:2:"";s:3:"堍";s:2:"";s:3:"堄";s:2:"";s:3:"奜";s:2:"";s:3:"婠";s:2:"";s:3:"婘";s:2:"";s:3:"婕";s:2:"";s:3:"婧";s:2:"";s:3:"婞";s:2:"";s:3:"娸";s:2:"";s:3:"娵";s:2:"";s:3:"婭";s:2:"";s:3:"婐";s:2:"";s:3:"婟";s:2:"";s:3:"婥";s:2:"";s:3:"婬";s:2:"";s:3:"婓";s:2:"";s:3:"婤";s:2:"";s:3:"婗";s:2:"";s:3:"婃";s:2:"";s:3:"婝";s:2:"";s:3:"婒";s:2:"";s:3:"婄";s:2:"";s:3:"婛";s:2:"";s:3:"婈";s:2:"";s:3:"媎";s:2:"";s:3:"娾";s:2:"";s:3:"婍";s:2:"";s:3:"娹";s:2:"";s:3:"婌";s:2:"";s:3:"婰";s:2:"";s:3:"婩";s:2:"";s:3:"婇";s:2:"";s:3:"婑";s:2:"";s:3:"婖";s:2:"";s:3:"婂";s:2:"";s:3:"婜";s:2:"";s:3:"孲";s:2:"";s:3:"孮";s:2:"";s:3:"寁";s:2:"";s:3:"寀";s:2:"";s:3:"屙";s:2:"";s:3:"崞";s:2:"";s:3:"崋";s:2:"";s:3:"崝";s:2:"";s:3:"崚";s:2:"";s:3:"崠";s:2:"";s:3:"崌";s:2:"";s:3:"崨";s:2:"";s:3:"崍";s:2:"";s:3:"崦";s:2:"";s:3:"崥";s:2:"";s:3:"崏";s:2:"@";s:3:"崰";s:2:"A";s:3:"崒";s:2:"B";s:3:"崣";s:2:"C";s:3:"崟";s:2:"D";s:3:"崮";s:2:"E";s:3:"帾";s:2:"F";s:3:"帴";s:2:"G";s:3:"庱";s:2:"H";s:3:"庴";s:2:"I";s:3:"庹";s:2:"J";s:3:"庲";s:2:"K";s:3:"庳";s:2:"L";s:3:"弶";s:2:"M";s:3:"弸";s:2:"N";s:3:"徛";s:2:"O";s:3:"徖";s:2:"P";s:3:"徟";s:2:"Q";s:3:"悊";s:2:"R";s:3:"悐";s:2:"S";s:3:"悆";s:2:"T";s:3:"悾";s:2:"U";s:3:"悰";s:2:"V";s:3:"悺";s:2:"W";s:3:"惓";s:2:"X";s:3:"惔";s:2:"Y";s:3:"惏";s:2:"Z";s:3:"惤";s:2:"[";s:3:"惙";s:2:"\";s:3:"惝";s:2:"]";s:3:"惈";s:2:"^";s:3:"悱";s:2:"_";s:3:"惛";s:2:"`";s:3:"悷";s:2:"a";s:3:"惊";s:2:"b";s:3:"悿";s:2:"c";s:3:"惃";s:2:"d";s:3:"惍";s:2:"e";s:3:"惀";s:2:"f";s:3:"挲";s:2:"g";s:3:"捥";s:2:"h";s:3:"掊";s:2:"i";s:3:"掂";s:2:"j";s:3:"捽";s:2:"k";s:3:"掽";s:2:"l";s:3:"掞";s:2:"m";s:3:"掭";s:2:"n";s:3:"掝";s:2:"o";s:3:"掗";s:2:"p";s:3:"掫";s:2:"q";s:3:"掎";s:2:"r";s:3:"捯";s:2:"s";s:3:"掇";s:2:"t";s:3:"掐";s:2:"u";s:3:"据";s:2:"v";s:3:"掯";s:2:"w";s:3:"捵";s:2:"x";s:3:"掜";s:2:"y";s:3:"捭";s:2:"z";s:3:"掮";s:2:"{";s:3:"捼";s:2:"|";s:3:"掤";s:2:"}";s:3:"挻";s:2:"~";s:3:"掟";s:2:"ա";s:3:"捸";s:2:"բ";s:3:"掅";s:2:"գ";s:3:"掁";s:2:"դ";s:3:"掑";s:2:"ե";s:3:"掍";s:2:"զ";s:3:"捰";s:2:"է";s:3:"敓";s:2:"ը";s:3:"旍";s:2:"թ";s:3:"晥";s:2:"ժ";s:3:"晡";s:2:"ի";s:3:"晛";s:2:"լ";s:3:"晙";s:2:"խ";s:3:"晜";s:2:"ծ";s:3:"晢";s:2:"կ";s:3:"朘";s:2:"հ";s:3:"桹";s:2:"ձ";s:3:"梇";s:2:"ղ";s:3:"梐";s:2:"ճ";s:3:"梜";s:2:"մ";s:3:"桭";s:2:"յ";s:3:"桮";s:2:"ն";s:3:"梮";s:2:"շ";s:3:"梫";s:2:"ո";s:3:"楖";s:2:"չ";s:3:"桯";s:2:"պ";s:3:"梣";s:2:"ջ";s:3:"梬";s:2:"ռ";s:3:"梩";s:2:"ս";s:3:"桵";s:2:"վ";s:3:"桴";s:2:"տ";s:3:"梲";s:2:"";s:3:"梏";s:2:"";s:3:"桷";s:2:"";s:3:"梒";s:2:"";s:3:"桼";s:2:"";s:3:"桫";s:2:"";s:3:"桲";s:2:"";s:3:"梪";s:2:"";s:3:"梀";s:2:"";s:3:"桱";s:2:"";s:3:"桾";s:2:"";s:3:"梛";s:2:"";s:3:"梖";s:2:"";s:3:"梋";s:2:"";s:3:"梠";s:2:"";s:3:"梉";s:2:"";s:3:"梤";s:2:"";s:3:"桸";s:2:"";s:3:"桻";s:2:"";s:3:"梑";s:2:"";s:3:"梌";s:2:"";s:3:"梊";s:2:"";s:3:"桽";s:2:"";s:3:"欶";s:2:"";s:3:"欳";s:2:"";s:3:"欷";s:2:"";s:3:"欸";s:2:"";s:3:"殑";s:2:"";s:3:"殏";s:2:"";s:3:"殍";s:2:"";s:3:"殎";s:2:"";s:3:"殌";s:2:"";s:3:"氪";s:2:"";s:3:"淀";s:2:"";s:3:"涫";s:2:"";s:3:"涴";s:2:"";s:3:"涳";s:2:"";s:3:"湴";s:2:"";s:3:"涬";s:2:"";s:3:"淩";s:2:"";s:3:"淢";s:2:"";s:3:"涷";s:2:"";s:3:"淶";s:2:"";s:3:"淔";s:2:"";s:3:"渀";s:2:"";s:3:"淈";s:2:"";s:3:"淠";s:2:"";s:3:"淟";s:2:"";s:3:"淖";s:2:"";s:3:"涾";s:2:"";s:3:"淥";s:2:"";s:3:"淜";s:2:"";s:3:"淝";s:2:"";s:3:"淛";s:2:"";s:3:"淴";s:2:"";s:3:"淊";s:2:"";s:3:"涽";s:2:"";s:3:"淭";s:2:"";s:3:"淰";s:2:"";s:3:"涺";s:2:"";s:3:"淕";s:2:"";s:3:"淂";s:2:"";s:3:"淏";s:2:"";s:3:"淉";s:2:"@";s:3:"淐";s:2:"A";s:3:"淲";s:2:"B";s:3:"淓";s:2:"C";s:3:"淽";s:2:"D";s:3:"淗";s:2:"E";s:3:"淍";s:2:"F";s:3:"淣";s:2:"G";s:3:"涻";s:2:"H";s:3:"烺";s:2:"I";s:3:"焍";s:2:"J";s:3:"烷";s:2:"K";s:3:"焗";s:2:"L";s:3:"烴";s:2:"M";s:3:"焌";s:2:"N";s:3:"烰";s:2:"O";s:3:"焄";s:2:"P";s:3:"烳";s:2:"Q";s:3:"焐";s:2:"R";s:3:"烼";s:2:"S";s:3:"烿";s:2:"T";s:3:"焆";s:2:"U";s:3:"焓";s:2:"V";s:3:"焀";s:2:"W";s:3:"烸";s:2:"X";s:3:"烶";s:2:"Y";s:3:"焋";s:2:"Z";s:3:"焂";s:2:"[";s:3:"焎";s:2:"\";s:3:"牾";s:2:"]";s:3:"牻";s:2:"^";s:3:"牼";s:2:"_";s:3:"牿";s:2:"`";s:3:"猝";s:2:"a";s:3:"猗";s:2:"b";s:3:"猇";s:2:"c";s:3:"猑";s:2:"d";s:3:"猘";s:2:"e";s:3:"猊";s:2:"f";s:3:"猈";s:2:"g";s:3:"狿";s:2:"h";s:3:"猏";s:2:"i";s:3:"猞";s:2:"j";s:3:"玈";s:2:"k";s:3:"珶";s:2:"l";s:3:"珸";s:2:"m";s:3:"珵";s:2:"n";s:3:"琄";s:2:"o";s:3:"琁";s:2:"p";s:3:"珽";s:2:"q";s:3:"琇";s:2:"r";s:3:"琀";s:2:"s";s:3:"珺";s:2:"t";s:3:"珼";s:2:"u";s:3:"珿";s:2:"v";s:3:"琌";s:2:"w";s:3:"琋";s:2:"x";s:3:"珴";s:2:"y";s:3:"琈";s:2:"z";s:3:"畤";s:2:"{";s:3:"畣";s:2:"|";s:3:"痎";s:2:"}";s:3:"痒";s:2:"~";s:3:"痏";s:2:"֡";s:3:"痋";s:2:"֢";s:3:"痌";s:2:"֣";s:3:"痑";s:2:"֤";s:3:"痐";s:2:"֥";s:3:"皏";s:2:"֦";s:3:"皉";s:2:"֧";s:3:"盓";s:2:"֨";s:3:"眹";s:2:"֩";s:3:"眯";s:2:"֪";s:3:"眭";s:2:"֫";s:3:"眱";s:2:"֬";s:3:"眲";s:2:"֭";s:3:"眴";s:2:"֮";s:3:"眳";s:2:"֯";s:3:"眽";s:2:"ְ";s:3:"眥";s:2:"ֱ";s:3:"眻";s:2:"ֲ";s:3:"眵";s:2:"ֳ";s:3:"硈";s:2:"ִ";s:3:"硒";s:2:"ֵ";s:3:"硉";s:2:"ֶ";s:3:"硍";s:2:"ַ";s:3:"硊";s:2:"ָ";s:3:"硌";s:2:"ֹ";s:3:"砦";s:2:"ֺ";s:3:"硅";s:2:"ֻ";s:3:"硐";s:2:"ּ";s:3:"祤";s:2:"ֽ";s:3:"祧";s:2:"־";s:3:"祩";s:2:"ֿ";s:3:"祪";s:2:"";s:3:"祣";s:2:"";s:3:"祫";s:2:"";s:3:"祡";s:2:"";s:3:"离";s:2:"";s:3:"秺";s:2:"";s:3:"秸";s:2:"";s:3:"秶";s:2:"";s:3:"秷";s:2:"";s:3:"窏";s:2:"";s:3:"窔";s:2:"";s:3:"窐";s:2:"";s:3:"笵";s:2:"";s:3:"筇";s:2:"";s:3:"笴";s:2:"";s:3:"笥";s:2:"";s:3:"笰";s:2:"";s:3:"笢";s:2:"";s:3:"笤";s:2:"";s:3:"笳";s:2:"";s:3:"笘";s:2:"";s:3:"笪";s:2:"";s:3:"笝";s:2:"";s:3:"笱";s:2:"";s:3:"笫";s:2:"";s:3:"笭";s:2:"";s:3:"笯";s:2:"";s:3:"笲";s:2:"";s:3:"笸";s:2:"";s:3:"笚";s:2:"";s:3:"笣";s:2:"";s:3:"粔";s:2:"";s:3:"粘";s:2:"";s:3:"粖";s:2:"";s:3:"粣";s:2:"";s:3:"紵";s:2:"";s:3:"紽";s:2:"";s:3:"紸";s:2:"";s:3:"紶";s:2:"";s:3:"紺";s:2:"";s:3:"絅";s:2:"";s:3:"紬";s:2:"";s:3:"紩";s:2:"";s:3:"絁";s:2:"";s:3:"絇";s:2:"";s:3:"紾";s:2:"";s:3:"紿";s:2:"";s:3:"絊";s:2:"";s:3:"紻";s:2:"";s:3:"紨";s:2:"";s:3:"罣";s:2:"";s:3:"羕";s:2:"";s:3:"羜";s:2:"";s:3:"羝";s:2:"";s:3:"羛";s:2:"";s:3:"翊";s:2:"";s:3:"翋";s:2:"";s:3:"翍";s:2:"";s:3:"翐";s:2:"";s:3:"翑";s:2:"";s:3:"翇";s:2:"";s:3:"翏";s:2:"";s:3:"翉";s:2:"";s:3:"耟";s:2:"@";s:3:"耞";s:2:"A";s:3:"耛";s:2:"B";s:3:"聇";s:2:"C";s:3:"聃";s:2:"D";s:3:"聈";s:2:"E";s:3:"脘";s:2:"F";s:3:"脥";s:2:"G";s:3:"脙";s:2:"H";s:3:"脛";s:2:"I";s:3:"脭";s:2:"J";s:3:"脟";s:2:"K";s:3:"脬";s:2:"L";s:3:"脞";s:2:"M";s:3:"脡";s:2:"N";s:3:"脕";s:2:"O";s:3:"脧";s:2:"P";s:3:"脝";s:2:"Q";s:3:"脢";s:2:"R";s:3:"舑";s:2:"S";s:3:"舸";s:2:"T";s:3:"舳";s:2:"U";s:3:"舺";s:2:"V";s:3:"舴";s:2:"W";s:3:"舲";s:2:"X";s:3:"艴";s:2:"Y";s:3:"莐";s:2:"Z";s:3:"莣";s:2:"[";s:3:"莨";s:2:"\";s:3:"莍";s:2:"]";s:3:"荺";s:2:"^";s:3:"荳";s:2:"_";s:3:"莤";s:2:"`";s:3:"荴";s:2:"a";s:3:"莏";s:2:"b";s:3:"莁";s:2:"c";s:3:"莕";s:2:"d";s:3:"莙";s:2:"e";s:3:"荵";s:2:"f";s:3:"莔";s:2:"g";s:3:"莩";s:2:"h";s:3:"荽";s:2:"i";s:3:"莃";s:2:"j";s:3:"莌";s:2:"k";s:3:"莝";s:2:"l";s:3:"莛";s:2:"m";s:3:"莪";s:2:"n";s:3:"莋";s:2:"o";s:3:"荾";s:2:"p";s:3:"莥";s:2:"q";s:3:"莯";s:2:"r";s:3:"莈";s:2:"s";s:3:"莗";s:2:"t";s:3:"莰";s:2:"u";s:3:"荿";s:2:"v";s:3:"莦";s:2:"w";s:3:"莇";s:2:"x";s:3:"莮";s:2:"y";s:3:"荶";s:2:"z";s:3:"莚";s:2:"{";s:3:"虙";s:2:"|";s:3:"虖";s:2:"}";s:3:"蚿";s:2:"~";s:3:"蚷";s:2:"ס";s:3:"蛂";s:2:"ע";s:3:"蛁";s:2:"ף";s:3:"蛅";s:2:"פ";s:3:"蚺";s:2:"ץ";s:3:"蚰";s:2:"צ";s:3:"蛈";s:2:"ק";s:3:"蚹";s:2:"ר";s:3:"蚳";s:2:"ש";s:3:"蚸";s:2:"ת";s:3:"蛌";s:2:"׫";s:3:"蚴";s:2:"׬";s:3:"蚻";s:2:"׭";s:3:"蚼";s:2:"׮";s:3:"蛃";s:2:"ׯ";s:3:"蚽";s:2:"װ";s:3:"蚾";s:2:"ױ";s:3:"衒";s:2:"ײ";s:3:"袉";s:2:"׳";s:3:"袕";s:2:"״";s:3:"袨";s:2:"׵";s:3:"袢";s:2:"׶";s:3:"袪";s:2:"׷";s:3:"袚";s:2:"׸";s:3:"袑";s:2:"׹";s:3:"袡";s:2:"׺";s:3:"袟";s:2:"׻";s:3:"袘";s:2:"׼";s:3:"袧";s:2:"׽";s:3:"袙";s:2:"׾";s:3:"袛";s:2:"׿";s:3:"袗";s:2:"";s:3:"袤";s:2:"";s:3:"袬";s:2:"";s:3:"袌";s:2:"";s:3:"袓";s:2:"";s:3:"袎";s:2:"";s:3:"覂";s:2:"";s:3:"觖";s:2:"";s:3:"觙";s:2:"";s:3:"觕";s:2:"";s:3:"訰";s:2:"";s:3:"訧";s:2:"";s:3:"訬";s:2:"";s:3:"訞";s:2:"";s:3:"谹";s:2:"";s:3:"谻";s:2:"";s:3:"豜";s:2:"";s:3:"豝";s:2:"";s:3:"豽";s:2:"";s:3:"貥";s:2:"";s:3:"赽";s:2:"";s:3:"赻";s:2:"";s:3:"赹";s:2:"";s:3:"趼";s:2:"";s:3:"跂";s:2:"";s:3:"趹";s:2:"";s:3:"趿";s:2:"";s:3:"跁";s:2:"";s:3:"軘";s:2:"";s:3:"軞";s:2:"";s:3:"軝";s:2:"";s:3:"軜";s:2:"";s:3:"軗";s:2:"";s:3:"軠";s:2:"";s:3:"軡";s:2:"";s:3:"逤";s:2:"";s:3:"逋";s:2:"";s:3:"逑";s:2:"";s:3:"逜";s:2:"";s:3:"逌";s:2:"";s:3:"逡";s:2:"";s:3:"郯";s:2:"";s:3:"郪";s:2:"";s:3:"郰";s:2:"";s:3:"郴";s:2:"";s:3:"郲";s:2:"";s:3:"郳";s:2:"";s:3:"郔";s:2:"";s:3:"郫";s:2:"";s:3:"郬";s:2:"";s:3:"郩";s:2:"";s:3:"酖";s:2:"";s:3:"酘";s:2:"";s:3:"酚";s:2:"";s:3:"酓";s:2:"";s:3:"酕";s:2:"";s:3:"釬";s:2:"";s:3:"釴";s:2:"";s:3:"釱";s:2:"";s:3:"釳";s:2:"";s:3:"釸";s:2:"";s:3:"釤";s:2:"";s:3:"釹";s:2:"";s:3:"釪";s:2:"@";s:3:"釫";s:2:"A";s:3:"釷";s:2:"B";s:3:"釨";s:2:"C";s:3:"釮";s:2:"D";s:3:"镺";s:2:"E";s:3:"閆";s:2:"F";s:3:"閈";s:2:"G";s:3:"陼";s:2:"H";s:3:"陭";s:2:"I";s:3:"陫";s:2:"J";s:3:"陱";s:2:"K";s:3:"陯";s:2:"L";s:3:"隿";s:2:"M";s:3:"靪";s:2:"N";s:3:"頄";s:2:"O";s:3:"飥";s:2:"P";s:3:"馗";s:2:"Q";s:3:"傛";s:2:"R";s:3:"傕";s:2:"S";s:3:"傔";s:2:"T";s:3:"傞";s:2:"U";s:3:"傋";s:2:"V";s:3:"傣";s:2:"W";s:3:"傃";s:2:"X";s:3:"傌";s:2:"Y";s:3:"傎";s:2:"Z";s:3:"傝";s:2:"[";s:3:"偨";s:2:"\";s:3:"傜";s:2:"]";s:3:"傒";s:2:"^";s:3:"傂";s:2:"_";s:3:"傇";s:2:"`";s:3:"兟";s:2:"a";s:3:"凔";s:2:"b";s:3:"匒";s:2:"c";s:3:"匑";s:2:"d";s:3:"厤";s:2:"e";s:3:"厧";s:2:"f";s:3:"喑";s:2:"g";s:3:"喨";s:2:"h";s:3:"喥";s:2:"i";s:3:"喭";s:2:"j";s:3:"啷";s:2:"k";s:3:"噅";s:2:"l";s:3:"喢";s:2:"m";s:3:"喓";s:2:"n";s:3:"喈";s:2:"o";s:3:"喏";s:2:"p";s:3:"喵";s:2:"q";s:3:"喁";s:2:"r";s:3:"喣";s:2:"s";s:3:"喒";s:2:"t";s:3:"喤";s:2:"u";s:3:"啽";s:2:"v";s:3:"喌";s:2:"w";s:3:"喦";s:2:"x";s:3:"啿";s:2:"y";s:3:"喕";s:2:"z";s:3:"喡";s:2:"{";s:3:"喎";s:2:"|";s:3:"圌";s:2:"}";s:3:"堩";s:2:"~";s:3:"堷";s:2:"ء";s:3:"堙";s:2:"آ";s:3:"堞";s:2:"أ";s:3:"堧";s:2:"ؤ";s:3:"堣";s:2:"إ";s:3:"堨";s:2:"ئ";s:3:"埵";s:2:"ا";s:3:"塈";s:2:"ب";s:3:"堥";s:2:"ة";s:3:"堜";s:2:"ت";s:3:"堛";s:2:"ث";s:3:"堳";s:2:"ج";s:3:"堿";s:2:"ح";s:3:"堶";s:2:"خ";s:3:"堮";s:2:"د";s:3:"堹";s:2:"ذ";s:3:"堸";s:2:"ر";s:3:"堭";s:2:"ز";s:3:"堬";s:2:"س";s:3:"堻";s:2:"ش";s:3:"奡";s:2:"ص";s:3:"媯";s:2:"ض";s:3:"媔";s:2:"ط";s:3:"媟";s:2:"ظ";s:3:"婺";s:2:"ع";s:3:"媢";s:2:"غ";s:3:"媞";s:2:"ػ";s:3:"婸";s:2:"ؼ";s:3:"媦";s:2:"ؽ";s:3:"婼";s:2:"ؾ";s:3:"媥";s:2:"ؿ";s:3:"媬";s:2:"";s:3:"媕";s:2:"";s:3:"媮";s:2:"";s:3:"娷";s:2:"";s:3:"媄";s:2:"";s:3:"媊";s:2:"";s:3:"媗";s:2:"";s:3:"媃";s:2:"";s:3:"媋";s:2:"";s:3:"媩";s:2:"";s:3:"婻";s:2:"";s:3:"婽";s:2:"";s:3:"媌";s:2:"";s:3:"媜";s:2:"";s:3:"媏";s:2:"";s:3:"媓";s:2:"";s:3:"媝";s:2:"";s:3:"寪";s:2:"";s:3:"寍";s:2:"";s:3:"寋";s:2:"";s:3:"寔";s:2:"";s:3:"寑";s:2:"";s:3:"寊";s:2:"";s:3:"寎";s:2:"";s:3:"尌";s:2:"";s:3:"尰";s:2:"";s:3:"崷";s:2:"";s:3:"嵃";s:2:"";s:3:"嵫";s:2:"";s:3:"嵁";s:2:"";s:3:"嵋";s:2:"";s:3:"崿";s:2:"";s:3:"崵";s:2:"";s:3:"嵑";s:2:"";s:3:"嵎";s:2:"";s:3:"嵕";s:2:"";s:3:"崳";s:2:"";s:3:"崺";s:2:"";s:3:"嵒";s:2:"";s:3:"崽";s:2:"";s:3:"崱";s:2:"";s:3:"嵙";s:2:"";s:3:"嵂";s:2:"";s:3:"崹";s:2:"";s:3:"嵉";s:2:"";s:3:"崸";s:2:"";s:3:"崼";s:2:"";s:3:"崲";s:2:"";s:3:"崶";s:2:"";s:3:"嵀";s:2:"";s:3:"嵅";s:2:"";s:3:"幄";s:2:"";s:3:"幁";s:2:"";s:3:"彘";s:2:"";s:3:"徦";s:2:"";s:3:"徥";s:2:"";s:3:"徫";s:2:"";s:3:"惉";s:2:"";s:3:"悹";s:2:"";s:3:"惌";s:2:"";s:3:"惢";s:2:"";s:3:"惎";s:2:"";s:3:"惄";s:2:"";s:3:"愔";s:2:"@";s:3:"惲";s:2:"A";s:3:"愊";s:2:"B";s:3:"愖";s:2:"C";s:3:"愅";s:2:"D";s:3:"惵";s:2:"E";s:3:"愓";s:2:"F";s:3:"惸";s:2:"G";s:3:"惼";s:2:"H";s:3:"惾";s:2:"I";s:3:"惁";s:2:"J";s:3:"愃";s:2:"K";s:3:"愘";s:2:"L";s:3:"愝";s:2:"M";s:3:"愐";s:2:"N";s:3:"惿";s:2:"O";s:3:"愄";s:2:"P";s:3:"愋";s:2:"Q";s:3:"扊";s:2:"R";s:3:"掔";s:2:"S";s:3:"掱";s:2:"T";s:3:"掰";s:2:"U";s:3:"揎";s:2:"V";s:3:"揥";s:2:"W";s:3:"揨";s:2:"X";s:3:"揯";s:2:"Y";s:3:"揃";s:2:"Z";s:3:"撝";s:2:"[";s:3:"揳";s:2:"\";s:3:"揊";s:2:"]";s:3:"揠";s:2:"^";s:3:"揶";s:2:"_";s:3:"揕";s:2:"`";s:3:"揲";s:2:"a";s:3:"揵";s:2:"b";s:3:"摡";s:2:"c";s:3:"揟";s:2:"d";s:3:"掾";s:2:"e";s:3:"揝";s:2:"f";s:3:"揜";s:2:"g";s:3:"揄";s:2:"h";s:3:"揘";s:2:"i";s:3:"揓";s:2:"j";s:3:"揂";s:2:"k";s:3:"揇";s:2:"l";s:3:"揌";s:2:"m";s:3:"揋";s:2:"n";s:3:"揈";s:2:"o";s:3:"揰";s:2:"p";s:3:"揗";s:2:"q";s:3:"揙";s:2:"r";s:3:"攲";s:2:"s";s:3:"敧";s:2:"t";s:3:"敪";s:2:"u";s:3:"敤";s:2:"v";s:3:"敜";s:2:"w";s:3:"敨";s:2:"x";s:3:"敥";s:2:"y";s:3:"斌";s:2:"z";s:3:"斝";s:2:"{";s:3:"斞";s:2:"|";s:3:"斮";s:2:"}";s:3:"旐";s:2:"~";s:3:"旒";s:2:"١";s:3:"晼";s:2:"٢";s:3:"晬";s:2:"٣";s:3:"晻";s:2:"٤";s:3:"暀";s:2:"٥";s:3:"晱";s:2:"٦";s:3:"晹";s:2:"٧";s:3:"晪";s:2:"٨";s:3:"晲";s:2:"٩";s:3:"朁";s:2:"٪";s:3:"椌";s:2:"٫";s:3:"棓";s:2:"٬";s:3:"椄";s:2:"٭";s:3:"棜";s:2:"ٮ";s:3:"椪";s:2:"ٯ";s:3:"棬";s:2:"ٰ";s:3:"棪";s:2:"ٱ";s:3:"棱";s:2:"ٲ";s:3:"椏";s:2:"ٳ";s:3:"棖";s:2:"ٴ";s:3:"棷";s:2:"ٵ";s:3:"棫";s:2:"ٶ";s:3:"棤";s:2:"ٷ";s:3:"棶";s:2:"ٸ";s:3:"椓";s:2:"ٹ";s:3:"椐";s:2:"ٺ";s:3:"棳";s:2:"ٻ";s:3:"棡";s:2:"ټ";s:3:"椇";s:2:"ٽ";s:3:"棌";s:2:"پ";s:3:"椈";s:2:"ٿ";s:3:"楰";s:2:"";s:3:"梴";s:2:"";s:3:"椑";s:2:"";s:3:"棯";s:2:"";s:3:"棆";s:2:"";s:3:"椔";s:2:"";s:3:"棸";s:2:"";s:3:"棐";s:2:"";s:3:"棽";s:2:"";s:3:"棼";s:2:"";s:3:"棨";s:2:"";s:3:"椋";s:2:"";s:3:"椊";s:2:"";s:3:"椗";s:2:"";s:3:"棎";s:2:"";s:3:"棈";s:2:"";s:3:"棝";s:2:"";s:3:"棞";s:2:"";s:3:"棦";s:2:"";s:3:"棴";s:2:"";s:3:"棑";s:2:"";s:3:"椆";s:2:"";s:3:"棔";s:2:"";s:3:"棩";s:2:"";s:3:"椕";s:2:"";s:3:"椥";s:2:"";s:3:"棇";s:2:"";s:3:"欹";s:2:"";s:3:"欻";s:2:"";s:3:"欿";s:2:"";s:3:"欼";s:2:"";s:3:"殔";s:2:"";s:3:"殗";s:2:"";s:3:"殙";s:2:"";s:3:"殕";s:2:"";s:3:"殽";s:2:"";s:3:"毰";s:2:"";s:3:"毲";s:2:"";s:3:"毳";s:2:"";s:3:"氰";s:2:"";s:3:"淼";s:2:"";s:3:"湆";s:2:"";s:3:"湇";s:2:"";s:3:"渟";s:2:"";s:3:"湉";s:2:"";s:3:"溈";s:2:"";s:3:"渼";s:2:"";s:3:"渽";s:2:"";s:3:"湅";s:2:"";s:3:"湢";s:2:"";s:3:"渫";s:2:"";s:3:"渿";s:2:"";s:3:"湁";s:2:"";s:3:"湝";s:2:"";s:3:"湳";s:2:"";s:3:"渜";s:2:"";s:3:"渳";s:2:"";s:3:"湋";s:2:"";s:3:"湀";s:2:"";s:3:"湑";s:2:"";s:3:"渻";s:2:"";s:3:"渃";s:2:"";s:3:"渮";s:2:"";s:3:"湞";s:2:"@";s:3:"湨";s:2:"A";s:3:"湜";s:2:"B";s:3:"湡";s:2:"C";s:3:"渱";s:2:"D";s:3:"渨";s:2:"E";s:3:"湠";s:2:"F";s:3:"湱";s:2:"G";s:3:"湫";s:2:"H";s:3:"渹";s:2:"I";s:3:"渢";s:2:"J";s:3:"渰";s:2:"K";s:3:"湓";s:2:"L";s:3:"湥";s:2:"M";s:3:"渧";s:2:"N";s:3:"湸";s:2:"O";s:3:"湤";s:2:"P";s:3:"湷";s:2:"Q";s:3:"湕";s:2:"R";s:3:"湹";s:2:"S";s:3:"湒";s:2:"T";s:3:"湦";s:2:"U";s:3:"渵";s:2:"V";s:3:"渶";s:2:"W";s:3:"湚";s:2:"X";s:3:"焠";s:2:"Y";s:3:"焞";s:2:"Z";s:3:"焯";s:2:"[";s:3:"烻";s:2:"\";s:3:"焮";s:2:"]";s:3:"焱";s:2:"^";s:3:"焣";s:2:"_";s:3:"焥";s:2:"`";s:3:"焢";s:2:"a";s:3:"焲";s:2:"b";s:3:"焟";s:2:"c";s:3:"焨";s:2:"d";s:3:"焺";s:2:"e";s:3:"焛";s:2:"f";s:3:"牋";s:2:"g";s:3:"牚";s:2:"h";s:3:"犈";s:2:"i";s:3:"犉";s:2:"j";s:3:"犆";s:2:"k";s:3:"犅";s:2:"l";s:3:"犋";s:2:"m";s:3:"猒";s:2:"n";s:3:"猋";s:2:"o";s:3:"猰";s:2:"p";s:3:"猢";s:2:"q";s:3:"猱";s:2:"r";s:3:"猳";s:2:"s";s:3:"猧";s:2:"t";s:3:"猲";s:2:"u";s:3:"猭";s:2:"v";s:3:"猦";s:2:"w";s:3:"猣";s:2:"x";s:3:"猵";s:2:"y";s:3:"猌";s:2:"z";s:3:"琮";s:2:"{";s:3:"琬";s:2:"|";s:3:"琰";s:2:"}";s:3:"琫";s:2:"~";s:3:"琖";s:2:"ڡ";s:3:"琚";s:2:"ڢ";s:3:"琡";s:2:"ڣ";s:3:"琭";s:2:"ڤ";s:3:"琱";s:2:"ڥ";s:3:"琤";s:2:"ڦ";s:3:"琣";s:2:"ڧ";s:3:"琝";s:2:"ڨ";s:3:"琩";s:2:"ک";s:3:"琠";s:2:"ڪ";s:3:"琲";s:2:"ګ";s:3:"瓻";s:2:"ڬ";s:3:"甯";s:2:"ڭ";s:3:"畯";s:2:"ڮ";s:3:"畬";s:2:"گ";s:3:"痧";s:2:"ڰ";s:3:"痚";s:2:"ڱ";s:3:"痡";s:2:"ڲ";s:3:"痦";s:2:"ڳ";s:3:"痝";s:2:"ڴ";s:3:"痟";s:2:"ڵ";s:3:"痤";s:2:"ڶ";s:3:"痗";s:2:"ڷ";s:3:"皕";s:2:"ڸ";s:3:"皒";s:2:"ڹ";s:3:"盚";s:2:"ں";s:3:"睆";s:2:"ڻ";s:3:"睇";s:2:"ڼ";s:3:"睄";s:2:"ڽ";s:3:"睍";s:2:"ھ";s:3:"睅";s:2:"ڿ";s:3:"睊";s:2:"";s:3:"睎";s:2:"";s:3:"睋";s:2:"";s:3:"睌";s:2:"";s:3:"矞";s:2:"";s:3:"矬";s:2:"";s:3:"硠";s:2:"";s:3:"硤";s:2:"";s:3:"硥";s:2:"";s:3:"硜";s:2:"";s:3:"硭";s:2:"";s:3:"硱";s:2:"";s:3:"硪";s:2:"";s:3:"确";s:2:"";s:3:"硰";s:2:"";s:3:"硩";s:2:"";s:3:"硨";s:2:"";s:3:"硞";s:2:"";s:3:"硢";s:2:"";s:3:"祴";s:2:"";s:3:"祳";s:2:"";s:3:"祲";s:2:"";s:3:"祰";s:2:"";s:3:"稂";s:2:"";s:3:"稊";s:2:"";s:3:"稃";s:2:"";s:3:"稌";s:2:"";s:3:"稄";s:2:"";s:3:"窙";s:2:"";s:3:"竦";s:2:"";s:3:"竤";s:2:"";s:3:"筊";s:2:"";s:3:"笻";s:2:"";s:3:"筄";s:2:"";s:3:"筈";s:2:"";s:3:"筌";s:2:"";s:3:"筎";s:2:"";s:3:"筀";s:2:"";s:3:"筘";s:2:"";s:3:"筅";s:2:"";s:3:"粢";s:2:"";s:3:"粞";s:2:"";s:3:"粨";s:2:"";s:3:"粡";s:2:"";s:3:"絘";s:2:"";s:3:"絯";s:2:"";s:3:"絣";s:2:"";s:3:"絓";s:2:"";s:3:"絖";s:2:"";s:3:"絧";s:2:"";s:3:"絪";s:2:"";s:3:"絏";s:2:"";s:3:"絭";s:2:"";s:3:"絜";s:2:"";s:3:"絫";s:2:"";s:3:"絒";s:2:"";s:3:"絔";s:2:"";s:3:"絩";s:2:"";s:3:"絑";s:2:"";s:3:"絟";s:2:"";s:3:"絎";s:2:"";s:3:"缾";s:2:"";s:3:"缿";s:2:"";s:3:"罥";s:2:"@";s:3:"罦";s:2:"A";s:3:"羢";s:2:"B";s:3:"羠";s:2:"C";s:3:"羡";s:2:"D";s:3:"翗";s:2:"E";s:3:"聑";s:2:"F";s:3:"聏";s:2:"G";s:3:"聐";s:2:"H";s:3:"胾";s:2:"I";s:3:"胔";s:2:"J";s:3:"腃";s:2:"K";s:3:"腊";s:2:"L";s:3:"腒";s:2:"M";s:3:"腏";s:2:"N";s:3:"腇";s:2:"O";s:3:"脽";s:2:"P";s:3:"腍";s:2:"Q";s:3:"脺";s:2:"R";s:3:"臦";s:2:"S";s:3:"臮";s:2:"T";s:3:"臷";s:2:"U";s:3:"臸";s:2:"V";s:3:"臹";s:2:"W";s:3:"舄";s:2:"X";s:3:"舼";s:2:"Y";s:3:"舽";s:2:"Z";s:3:"舿";s:2:"[";s:3:"艵";s:2:"\";s:3:"茻";s:2:"]";s:3:"菏";s:2:"^";s:3:"菹";s:2:"_";s:3:"萣";s:2:"`";s:3:"菀";s:2:"a";s:3:"菨";s:2:"b";s:3:"萒";s:2:"c";s:3:"菧";s:2:"d";s:3:"菤";s:2:"e";s:3:"菼";s:2:"f";s:3:"菶";s:2:"g";s:3:"萐";s:2:"h";s:3:"菆";s:2:"i";s:3:"菈";s:2:"j";s:3:"菫";s:2:"k";s:3:"菣";s:2:"l";s:3:"莿";s:2:"m";s:3:"萁";s:2:"n";s:3:"菝";s:2:"o";s:3:"菥";s:2:"p";s:3:"菘";s:2:"q";s:3:"菿";s:2:"r";s:3:"菡";s:2:"s";s:3:"菋";s:2:"t";s:3:"菎";s:2:"u";s:3:"菖";s:2:"v";s:3:"菵";s:2:"w";s:3:"菉";s:2:"x";s:3:"萉";s:2:"y";s:3:"萏";s:2:"z";s:3:"菞";s:2:"{";s:3:"萑";s:2:"|";s:3:"萆";s:2:"}";s:3:"菂";s:2:"~";s:3:"菳";s:2:"ۡ";s:3:"菕";s:2:"ۢ";s:3:"菺";s:2:"ۣ";s:3:"菇";s:2:"ۤ";s:3:"菑";s:2:"ۥ";s:3:"菪";s:2:"ۦ";s:3:"萓";s:2:"ۧ";s:3:"菃";s:2:"ۨ";s:3:"菬";s:2:"۩";s:3:"菮";s:2:"۪";s:3:"菄";s:2:"۫";s:3:"菻";s:2:"۬";s:3:"菗";s:2:"ۭ";s:3:"菢";s:2:"ۮ";s:3:"萛";s:2:"ۯ";s:3:"菛";s:2:"۰";s:3:"菾";s:2:"۱";s:3:"蛘";s:2:"۲";s:3:"蛢";s:2:"۳";s:3:"蛦";s:2:"۴";s:3:"蛓";s:2:"۵";s:3:"蛣";s:2:"۶";s:3:"蛚";s:2:"۷";s:3:"蛪";s:2:"۸";s:3:"蛝";s:2:"۹";s:3:"蛫";s:2:"ۺ";s:3:"蛜";s:2:"ۻ";s:3:"蛬";s:2:"ۼ";s:3:"蛩";s:2:"۽";s:3:"蛗";s:2:"۾";s:3:"蛨";s:2:"ۿ";s:3:"蛑";s:2:"";s:3:"衈";s:2:"";s:3:"衖";s:2:"";s:3:"衕";s:2:"";s:3:"袺";s:2:"";s:3:"裗";s:2:"";s:3:"袹";s:2:"";s:3:"袸";s:2:"";s:3:"裀";s:2:"";s:3:"袾";s:2:"";s:3:"袶";s:2:"";s:3:"袼";s:2:"";s:3:"袷";s:2:"";s:3:"袽";s:2:"";s:3:"袲";s:2:"";s:3:"褁";s:2:"";s:3:"裉";s:2:"";s:3:"覕";s:2:"";s:3:"覘";s:2:"";s:3:"覗";s:2:"";s:3:"觝";s:2:"";s:3:"觚";s:2:"";s:3:"觛";s:2:"";s:3:"詎";s:2:"";s:3:"詍";s:2:"";s:3:"訹";s:2:"";s:3:"詙";s:2:"";s:3:"詀";s:2:"";s:3:"詗";s:2:"";s:3:"詘";s:2:"";s:3:"詄";s:2:"";s:3:"詅";s:2:"";s:3:"詒";s:2:"";s:3:"詈";s:2:"";s:3:"詑";s:2:"";s:3:"詊";s:2:"";s:3:"詌";s:2:"";s:3:"詏";s:2:"";s:3:"豟";s:2:"";s:3:"貁";s:2:"";s:3:"貀";s:2:"";s:3:"貺";s:2:"";s:3:"貾";s:2:"";s:3:"貰";s:2:"";s:3:"貹";s:2:"";s:3:"貵";s:2:"";s:3:"趄";s:2:"";s:3:"趀";s:2:"";s:3:"趉";s:2:"";s:3:"跘";s:2:"";s:3:"跓";s:2:"";s:3:"跍";s:2:"";s:3:"跇";s:2:"";s:3:"跖";s:2:"";s:3:"跜";s:2:"";s:3:"跏";s:2:"";s:3:"跕";s:2:"";s:3:"跙";s:2:"";s:3:"跈";s:2:"";s:3:"跗";s:2:"";s:3:"跅";s:2:"";s:3:"軯";s:2:"";s:3:"軷";s:2:"";s:3:"軺";s:2:"@";s:3:"軹";s:2:"A";s:3:"軦";s:2:"B";s:3:"軮";s:2:"C";s:3:"軥";s:2:"D";s:3:"軵";s:2:"E";s:3:"軧";s:2:"F";s:3:"軨";s:2:"G";s:3:"軶";s:2:"H";s:3:"軫";s:2:"I";s:3:"軱";s:2:"J";s:3:"軬";s:2:"K";s:3:"軴";s:2:"L";s:3:"軩";s:2:"M";s:3:"逭";s:2:"N";s:3:"逴";s:2:"O";s:3:"逯";s:2:"P";s:3:"鄆";s:2:"Q";s:3:"鄬";s:2:"R";s:3:"鄄";s:2:"S";s:3:"郿";s:2:"T";s:3:"郼";s:2:"U";s:3:"鄈";s:2:"V";s:3:"郹";s:2:"W";s:3:"郻";s:2:"X";s:3:"鄁";s:2:"Y";s:3:"鄀";s:2:"Z";s:3:"鄇";s:2:"[";s:3:"鄅";s:2:"\";s:3:"鄃";s:2:"]";s:3:"酡";s:2:"^";s:3:"酤";s:2:"_";s:3:"酟";s:2:"`";s:3:"酢";s:2:"a";s:3:"酠";s:2:"b";s:3:"鈁";s:2:"c";s:3:"鈊";s:2:"d";s:3:"鈥";s:2:"e";s:3:"鈃";s:2:"f";s:3:"鈚";s:2:"g";s:3:"鈦";s:2:"h";s:3:"鈏";s:2:"i";s:3:"鈌";s:2:"j";s:3:"鈀";s:2:"k";s:3:"鈒";s:2:"l";s:3:"釿";s:2:"m";s:3:"釽";s:2:"n";s:3:"鈆";s:2:"o";s:3:"鈄";s:2:"p";s:3:"鈧";s:2:"q";s:3:"鈂";s:2:"r";s:3:"鈜";s:2:"s";s:3:"鈤";s:2:"t";s:3:"鈙";s:2:"u";s:3:"鈗";s:2:"v";s:3:"鈅";s:2:"w";s:3:"鈖";s:2:"x";s:3:"镻";s:2:"y";s:3:"閍";s:2:"z";s:3:"閌";s:2:"{";s:3:"閐";s:2:"|";s:3:"隇";s:2:"}";s:3:"陾";s:2:"~";s:3:"隈";s:2:"ܡ";s:3:"隉";s:2:"ܢ";s:3:"隃";s:2:"ܣ";s:3:"隀";s:2:"ܤ";s:3:"雂";s:2:"ܥ";s:3:"雈";s:2:"ܦ";s:3:"雃";s:2:"ܧ";s:3:"雱";s:2:"ܨ";s:3:"雰";s:2:"ܩ";s:3:"靬";s:2:"ܪ";s:3:"靰";s:2:"ܫ";s:3:"靮";s:2:"ܬ";s:3:"頇";s:2:"ܭ";s:3:"颩";s:2:"ܮ";s:3:"飫";s:2:"ܯ";s:3:"鳦";s:2:"ܰ";s:3:"黹";s:2:"ܱ";s:3:"亃";s:2:"ܲ";s:3:"亄";s:2:"ܳ";s:3:"亶";s:2:"ܴ";s:3:"傽";s:2:"ܵ";s:3:"傿";s:2:"ܶ";s:3:"僆";s:2:"ܷ";s:3:"傮";s:2:"ܸ";s:3:"僄";s:2:"ܹ";s:3:"僊";s:2:"ܺ";s:3:"傴";s:2:"ܻ";s:3:"僈";s:2:"ܼ";s:3:"僂";s:2:"ܽ";s:3:"傰";s:2:"ܾ";s:3:"僁";s:2:"ܿ";s:3:"傺";s:2:"";s:3:"傱";s:2:"";s:3:"僋";s:2:"";s:3:"僉";s:2:"";s:3:"傶";s:2:"";s:3:"傸";s:2:"";s:3:"凗";s:2:"";s:3:"剺";s:2:"";s:3:"剸";s:2:"";s:3:"剻";s:2:"";s:3:"剼";s:2:"";s:3:"嗃";s:2:"";s:3:"嗛";s:2:"";s:3:"嗌";s:2:"";s:3:"嗐";s:2:"";s:3:"嗋";s:2:"";s:3:"嗊";s:2:"";s:3:"嗝";s:2:"";s:3:"嗀";s:2:"";s:3:"嗔";s:2:"";s:3:"嗄";s:2:"";s:3:"嗩";s:2:"";s:3:"喿";s:2:"";s:3:"嗒";s:2:"";s:3:"喍";s:2:"";s:3:"嗏";s:2:"";s:3:"嗕";s:2:"";s:3:"嗢";s:2:"";s:3:"嗖";s:2:"";s:3:"嗈";s:2:"";s:3:"嗲";s:2:"";s:3:"嗍";s:2:"";s:3:"嗙";s:2:"";s:3:"嗂";s:2:"";s:3:"圔";s:2:"";s:3:"塓";s:2:"";s:3:"塨";s:2:"";s:3:"塤";s:2:"";s:3:"塏";s:2:"";s:3:"塍";s:2:"";s:3:"塉";s:2:"";s:3:"塯";s:2:"";s:3:"塕";s:2:"";s:3:"塎";s:2:"";s:3:"塝";s:2:"";s:3:"塙";s:2:"";s:3:"塥";s:2:"";s:3:"塛";s:2:"";s:3:"堽";s:2:"";s:3:"塣";s:2:"";s:3:"塱";s:2:"";s:3:"壼";s:2:"";s:3:"嫇";s:2:"";s:3:"嫄";s:2:"";s:3:"嫋";s:2:"";s:3:"媺";s:2:"";s:3:"媸";s:2:"";s:3:"媱";s:2:"";s:3:"媵";s:2:"";s:3:"媰";s:2:"";s:3:"媿";s:2:"";s:3:"嫈";s:2:"";s:3:"媻";s:2:"";s:3:"嫆";s:2:"@";s:3:"媷";s:2:"A";s:3:"嫀";s:2:"B";s:3:"嫊";s:2:"C";s:3:"媴";s:2:"D";s:3:"媶";s:2:"E";s:3:"嫍";s:2:"F";s:3:"媹";s:2:"G";s:3:"媐";s:2:"H";s:3:"寖";s:2:"I";s:3:"寘";s:2:"J";s:3:"寙";s:2:"K";s:3:"尟";s:2:"L";s:3:"尳";s:2:"M";s:3:"嵱";s:2:"N";s:3:"嵣";s:2:"O";s:3:"嵊";s:2:"P";s:3:"嵥";s:2:"Q";s:3:"嵲";s:2:"R";s:3:"嵬";s:2:"S";s:3:"嵞";s:2:"T";s:3:"嵨";s:2:"U";s:3:"嵧";s:2:"V";s:3:"嵢";s:2:"W";s:3:"巰";s:2:"X";s:3:"幏";s:2:"Y";s:3:"幎";s:2:"Z";s:3:"幊";s:2:"[";s:3:"幍";s:2:"\";s:3:"幋";s:2:"]";s:3:"廅";s:2:"^";s:3:"廌";s:2:"_";s:3:"廆";s:2:"`";s:3:"廋";s:2:"a";s:3:"廇";s:2:"b";s:3:"彀";s:2:"c";s:3:"徯";s:2:"d";s:3:"徭";s:2:"e";s:3:"惷";s:2:"f";s:3:"慉";s:2:"g";s:3:"慊";s:2:"h";s:3:"愫";s:2:"i";s:3:"慅";s:2:"j";s:3:"愶";s:2:"k";s:3:"愲";s:2:"l";s:3:"愮";s:2:"m";s:3:"慆";s:2:"n";s:3:"愯";s:2:"o";s:3:"慏";s:2:"p";s:3:"愩";s:2:"q";s:3:"慀";s:2:"r";s:3:"戠";s:2:"s";s:3:"酨";s:2:"t";s:3:"戣";s:2:"u";s:3:"戥";s:2:"v";s:3:"戤";s:2:"w";s:3:"揅";s:2:"x";s:3:"揱";s:2:"y";s:3:"揫";s:2:"z";s:3:"搐";s:2:"{";s:3:"搒";s:2:"|";s:3:"搉";s:2:"}";s:3:"搠";s:2:"~";s:3:"搤";s:2:"ݡ";s:3:"搳";s:2:"ݢ";s:3:"摃";s:2:"ݣ";s:3:"搟";s:2:"ݤ";s:3:"搕";s:2:"ݥ";s:3:"搘";s:2:"ݦ";s:3:"搹";s:2:"ݧ";s:3:"搷";s:2:"ݨ";s:3:"搢";s:2:"ݩ";s:3:"搣";s:2:"ݪ";s:3:"搌";s:2:"ݫ";s:3:"搦";s:2:"ݬ";s:3:"搰";s:2:"ݭ";s:3:"搨";s:2:"ݮ";s:3:"摁";s:2:"ݯ";s:3:"搵";s:2:"ݰ";s:3:"搯";s:2:"ݱ";s:3:"搊";s:2:"ݲ";s:3:"搚";s:2:"ݳ";s:3:"摀";s:2:"ݴ";s:3:"搥";s:2:"ݵ";s:3:"搧";s:2:"ݶ";s:3:"搋";s:2:"ݷ";s:3:"揧";s:2:"ݸ";s:3:"搛";s:2:"ݹ";s:3:"搮";s:2:"ݺ";s:3:"搡";s:2:"ݻ";s:3:"搎";s:2:"ݼ";s:3:"敯";s:2:"ݽ";s:3:"斒";s:2:"ݾ";s:3:"旓";s:2:"ݿ";s:3:"暆";s:2:"";s:3:"暌";s:2:"";s:3:"暕";s:2:"";s:3:"暐";s:2:"";s:3:"暋";s:2:"";s:3:"暊";s:2:"";s:3:"暙";s:2:"";s:3:"暔";s:2:"";s:3:"晸";s:2:"";s:3:"朠";s:2:"";s:3:"楦";s:2:"";s:3:"楟";s:2:"";s:3:"椸";s:2:"";s:3:"楎";s:2:"";s:3:"楢";s:2:"";s:3:"楱";s:2:"";s:3:"椿";s:2:"";s:3:"楅";s:2:"";s:3:"楪";s:2:"";s:3:"椹";s:2:"";s:3:"楂";s:2:"";s:3:"楗";s:2:"";s:3:"楙";s:2:"";s:3:"楺";s:2:"";s:3:"楈";s:2:"";s:3:"楉";s:2:"";s:3:"椵";s:2:"";s:3:"楬";s:2:"";s:3:"椳";s:2:"";s:3:"椽";s:2:"";s:3:"楥";s:2:"";s:3:"棰";s:2:"";s:3:"楸";s:2:"";s:3:"椴";s:2:"";s:3:"楩";s:2:"";s:3:"楀";s:2:"";s:3:"楯";s:2:"";s:3:"楄";s:2:"";s:3:"楶";s:2:"";s:3:"楘";s:2:"";s:3:"楁";s:2:"";s:3:"楴";s:2:"";s:3:"楌";s:2:"";s:3:"椻";s:2:"";s:3:"楋";s:2:"";s:3:"椷";s:2:"";s:3:"楜";s:2:"";s:3:"楏";s:2:"";s:3:"楑";s:2:"";s:3:"椲";s:2:"";s:3:"楒";s:2:"";s:3:"椯";s:2:"";s:3:"楻";s:2:"";s:3:"椼";s:2:"";s:3:"歆";s:2:"";s:3:"歅";s:2:"";s:3:"歃";s:2:"";s:3:"歂";s:2:"";s:3:"歈";s:2:"";s:3:"歁";s:2:"";s:3:"殛";s:2:"";s:3:"嗀";s:2:"";s:3:"毻";s:2:"";s:3:"毼";s:2:"@";s:3:"毹";s:2:"A";s:3:"毷";s:2:"B";s:3:"毸";s:2:"C";s:3:"溛";s:2:"D";s:3:"滖";s:2:"E";s:3:"滈";s:2:"F";s:3:"溏";s:2:"G";s:3:"滀";s:2:"H";s:3:"溟";s:2:"I";s:3:"溓";s:2:"J";s:3:"溔";s:2:"K";s:3:"溠";s:2:"L";s:3:"溱";s:2:"M";s:3:"溹";s:2:"N";s:3:"滆";s:2:"O";s:3:"滒";s:2:"P";s:3:"溽";s:2:"Q";s:3:"滁";s:2:"R";s:3:"溞";s:2:"S";s:3:"滉";s:2:"T";s:3:"溷";s:2:"U";s:3:"溰";s:2:"V";s:3:"滍";s:2:"W";s:3:"溦";s:2:"X";s:3:"滏";s:2:"Y";s:3:"溲";s:2:"Z";s:3:"溾";s:2:"[";s:3:"滃";s:2:"\";s:3:"滜";s:2:"]";s:3:"滘";s:2:"^";s:3:"溙";s:2:"_";s:3:"溒";s:2:"`";s:3:"溎";s:2:"a";s:3:"溍";s:2:"b";s:3:"溤";s:2:"c";s:3:"溡";s:2:"d";s:3:"溿";s:2:"e";s:3:"溳";s:2:"f";s:3:"滐";s:2:"g";s:3:"滊";s:2:"h";s:3:"溗";s:2:"i";s:3:"溮";s:2:"j";s:3:"溣";s:2:"k";s:3:"煇";s:2:"l";s:3:"煔";s:2:"m";s:3:"煒";s:2:"n";s:3:"煣";s:2:"o";s:3:"煠";s:2:"p";s:3:"煁";s:2:"q";s:3:"煝";s:2:"r";s:3:"煢";s:2:"s";s:3:"煲";s:2:"t";s:3:"煸";s:2:"u";s:3:"煪";s:2:"v";s:3:"煡";s:2:"w";s:3:"煂";s:2:"x";s:3:"煘";s:2:"y";s:3:"煃";s:2:"z";s:3:"煋";s:2:"{";s:3:"煰";s:2:"|";s:3:"煟";s:2:"}";s:3:"煐";s:2:"~";s:3:"煓";s:2:"ޡ";s:3:"煄";s:2:"ޢ";s:3:"煍";s:2:"ޣ";s:3:"煚";s:2:"ޤ";s:3:"牏";s:2:"ޥ";s:3:"犍";s:2:"ަ";s:3:"犌";s:2:"ާ";s:3:"犑";s:2:"ި";s:3:"犐";s:2:"ީ";s:3:"犎";s:2:"ު";s:3:"猼";s:2:"ޫ";s:3:"獂";s:2:"ެ";s:3:"猻";s:2:"ޭ";s:3:"猺";s:2:"ޮ";s:3:"獀";s:2:"ޯ";s:3:"獊";s:2:"ް";s:3:"獉";s:2:"ޱ";s:3:"瑄";s:2:"޲";s:3:"瑊";s:2:"޳";s:3:"瑋";s:2:"޴";s:3:"瑒";s:2:"޵";s:3:"瑑";s:2:"޶";s:3:"瑗";s:2:"޷";s:3:"瑀";s:2:"޸";s:3:"瑏";s:2:"޹";s:3:"瑐";s:2:"޺";s:3:"瑎";s:2:"޻";s:3:"瑂";s:2:"޼";s:3:"瑆";s:2:"޽";s:3:"瑍";s:2:"޾";s:3:"瑔";s:2:"޿";s:3:"瓡";s:2:"";s:3:"瓿";s:2:"";s:3:"瓾";s:2:"";s:3:"瓽";s:2:"";s:3:"甝";s:2:"";s:3:"畹";s:2:"";s:3:"畷";s:2:"";s:3:"榃";s:2:"";s:3:"痯";s:2:"";s:3:"瘏";s:2:"";s:3:"瘃";s:2:"";s:3:"痷";s:2:"";s:3:"痾";s:2:"";s:3:"痼";s:2:"";s:3:"痹";s:2:"";s:3:"痸";s:2:"";s:3:"瘐";s:2:"";s:3:"痻";s:2:"";s:3:"痶";s:2:"";s:3:"痭";s:2:"";s:3:"痵";s:2:"";s:3:"痽";s:2:"";s:3:"皙";s:2:"";s:3:"皵";s:2:"";s:3:"盝";s:2:"";s:3:"睕";s:2:"";s:3:"睟";s:2:"";s:3:"睠";s:2:"";s:3:"睒";s:2:"";s:3:"睖";s:2:"";s:3:"睚";s:2:"";s:3:"睩";s:2:"";s:3:"睧";s:2:"";s:3:"睔";s:2:"";s:3:"睙";s:2:"";s:3:"睭";s:2:"";s:3:"矠";s:2:"";s:3:"碇";s:2:"";s:3:"碚";s:2:"";s:3:"碔";s:2:"";s:3:"碏";s:2:"";s:3:"碄";s:2:"";s:3:"碕";s:2:"";s:3:"碅";s:2:"";s:3:"碆";s:2:"";s:3:"碡";s:2:"";s:3:"碃";s:2:"";s:3:"硹";s:2:"";s:3:"碙";s:2:"";s:3:"碀";s:2:"";s:3:"碖";s:2:"";s:3:"硻";s:2:"";s:3:"祼";s:2:"";s:3:"禂";s:2:"";s:3:"祽";s:2:"";s:3:"祹";s:2:"";s:3:"稑";s:2:"";s:3:"稘";s:2:"";s:3:"稙";s:2:"";s:3:"稒";s:2:"";s:3:"稗";s:2:"";s:3:"稕";s:2:"";s:3:"稢";s:2:"";s:3:"稓";s:2:"@";s:3:"稛";s:2:"A";s:3:"稐";s:2:"B";s:3:"窣";s:2:"C";s:3:"窢";s:2:"D";s:3:"窞";s:2:"E";s:3:"竫";s:2:"F";s:3:"筦";s:2:"G";s:3:"筤";s:2:"H";s:3:"筭";s:2:"I";s:3:"筴";s:2:"J";s:3:"筩";s:2:"K";s:3:"筲";s:2:"L";s:3:"筥";s:2:"M";s:3:"筳";s:2:"N";s:3:"筱";s:2:"O";s:3:"筰";s:2:"P";s:3:"筡";s:2:"Q";s:3:"筸";s:2:"R";s:3:"筶";s:2:"S";s:3:"筣";s:2:"T";s:3:"粲";s:2:"U";s:3:"粴";s:2:"V";s:3:"粯";s:2:"W";s:3:"綈";s:2:"X";s:3:"綆";s:2:"Y";s:3:"綀";s:2:"Z";s:3:"綍";s:2:"[";s:3:"絿";s:2:"\";s:3:"綅";s:2:"]";s:3:"絺";s:2:"^";s:3:"綎";s:2:"_";s:3:"絻";s:2:"`";s:3:"綃";s:2:"a";s:3:"絼";s:2:"b";s:3:"綌";s:2:"c";s:3:"綔";s:2:"d";s:3:"綄";s:2:"e";s:3:"絽";s:2:"f";s:3:"綒";s:2:"g";s:3:"罭";s:2:"h";s:3:"罫";s:2:"i";s:3:"罧";s:2:"j";s:3:"罨";s:2:"k";s:3:"罬";s:2:"l";s:3:"羦";s:2:"m";s:3:"羥";s:2:"n";s:3:"羧";s:2:"o";s:3:"翛";s:2:"p";s:3:"翜";s:2:"q";s:3:"耡";s:2:"r";s:3:"腤";s:2:"s";s:3:"腠";s:2:"t";s:3:"腷";s:2:"u";s:3:"腜";s:2:"v";s:3:"腩";s:2:"w";s:3:"腛";s:2:"x";s:3:"腢";s:2:"y";s:3:"腲";s:2:"z";s:3:"朡";s:2:"{";s:3:"腞";s:2:"|";s:3:"腶";s:2:"}";s:3:"腧";s:2:"~";s:3:"腯";s:2:"ߡ";s:3:"腄";s:2:"ߢ";s:3:"腡";s:2:"ߣ";s:3:"舝";s:2:"ߤ";s:3:"艉";s:2:"ߥ";s:3:"艄";s:2:"ߦ";s:3:"艀";s:2:"ߧ";s:3:"艂";s:2:"ߨ";s:3:"艅";s:2:"ߩ";s:3:"蓱";s:2:"ߪ";s:3:"萿";s:2:"߫";s:3:"葖";s:2:"߬";s:3:"葶";s:2:"߭";s:3:"葹";s:2:"߮";s:3:"蒏";s:2:"߯";s:3:"蒍";s:2:"߰";s:3:"葥";s:2:"߱";s:3:"葑";s:2:"߲";s:3:"葀";s:2:"߳";s:3:"蒆";s:2:"ߴ";s:3:"葧";s:2:"ߵ";s:3:"萰";s:2:"߶";s:3:"葍";s:2:"߷";s:3:"葽";s:2:"߸";s:3:"葚";s:2:"߹";s:3:"葙";s:2:"ߺ";s:3:"葴";s:2:"߻";s:3:"葳";s:2:"߼";s:3:"葝";s:2:"߽";s:3:"蔇";s:2:"߾";s:3:"葞";s:2:"߿";s:3:"萷";s:2:"";s:3:"萺";s:2:"";s:3:"萴";s:2:"";s:3:"葺";s:2:"";s:3:"葃";s:2:"";s:3:"葸";s:2:"";s:3:"萲";s:2:"";s:3:"葅";s:2:"";s:3:"萩";s:2:"";s:3:"菙";s:2:"";s:3:"葋";s:2:"";s:3:"萯";s:2:"";s:3:"葂";s:2:"";s:3:"萭";s:2:"";s:3:"葟";s:2:"";s:3:"葰";s:2:"";s:3:"萹";s:2:"";s:3:"葎";s:2:"";s:3:"葌";s:2:"";s:3:"葒";s:2:"";s:3:"葯";s:2:"";s:3:"蓅";s:2:"";s:3:"蒎";s:2:"";s:3:"萻";s:2:"";s:3:"葇";s:2:"";s:3:"萶";s:2:"";s:3:"萳";s:2:"";s:3:"葨";s:2:"";s:3:"葾";s:2:"";s:3:"葄";s:2:"";s:3:"萫";s:2:"";s:3:"葠";s:2:"";s:3:"葔";s:2:"";s:3:"葮";s:2:"";s:3:"葐";s:2:"";s:3:"蜋";s:2:"";s:3:"蜄";s:2:"";s:3:"蛷";s:2:"";s:3:"蜌";s:2:"";s:3:"蛺";s:2:"";s:3:"蛖";s:2:"";s:3:"蛵";s:2:"";s:3:"蝍";s:2:"";s:3:"蛸";s:2:"";s:3:"蜎";s:2:"";s:3:"蜉";s:2:"";s:3:"蜁";s:2:"";s:3:"蛶";s:2:"";s:3:"蜍";s:2:"";s:3:"蜅";s:2:"";s:3:"裖";s:2:"";s:3:"裋";s:2:"";s:3:"裍";s:2:"";s:3:"裎";s:2:"";s:3:"裞";s:2:"";s:3:"裛";s:2:"";s:3:"裚";s:2:"";s:3:"裌";s:2:"";s:3:"裐";s:2:"";s:3:"覅";s:2:"";s:3:"覛";s:2:"";s:3:"觟";s:2:"";s:3:"觥";s:2:"";s:3:"觤";s:2:"@";s:3:"觡";s:2:"A";s:3:"觠";s:2:"B";s:3:"觢";s:2:"C";s:3:"觜";s:2:"D";s:3:"触";s:2:"E";s:3:"詶";s:2:"F";s:3:"誆";s:2:"G";s:3:"詿";s:2:"H";s:3:"詡";s:2:"I";s:3:"訿";s:2:"J";s:3:"詷";s:2:"K";s:3:"誂";s:2:"L";s:3:"誄";s:2:"M";s:3:"詵";s:2:"N";s:3:"誃";s:2:"O";s:3:"誁";s:2:"P";s:3:"詴";s:2:"Q";s:3:"詺";s:2:"R";s:3:"谼";s:2:"S";s:3:"豋";s:2:"T";s:3:"豊";s:2:"U";s:3:"豥";s:2:"V";s:3:"豤";s:2:"W";s:3:"豦";s:2:"X";s:3:"貆";s:2:"Y";s:3:"貄";s:2:"Z";s:3:"貅";s:2:"[";s:3:"賌";s:2:"\";s:3:"赨";s:2:"]";s:3:"赩";s:2:"^";s:3:"趑";s:2:"_";s:3:"趌";s:2:"`";s:3:"趎";s:2:"a";s:3:"趏";s:2:"b";s:3:"趍";s:2:"c";s:3:"趓";s:2:"d";s:3:"趔";s:2:"e";s:3:"趐";s:2:"f";s:3:"趒";s:2:"g";s:3:"跰";s:2:"h";s:3:"跠";s:2:"i";s:3:"跬";s:2:"j";s:3:"跱";s:2:"k";s:3:"跮";s:2:"l";s:3:"跐";s:2:"m";s:3:"跩";s:2:"n";s:3:"跣";s:2:"o";s:3:"跢";s:2:"p";s:3:"跧";s:2:"q";s:3:"跲";s:2:"r";s:3:"跫";s:2:"s";s:3:"跴";s:2:"t";s:3:"輆";s:2:"u";s:3:"軿";s:2:"v";s:3:"輁";s:2:"w";s:3:"輀";s:2:"x";s:3:"輅";s:2:"y";s:3:"輇";s:2:"z";s:3:"輈";s:2:"{";s:3:"輂";s:2:"|";s:3:"輋";s:2:"}";s:3:"遒";s:2:"~";s:3:"逿";s:2:"";s:3:"遄";s:2:"";s:3:"遉";s:2:"";s:3:"逽";s:2:"";s:3:"鄐";s:2:"";s:3:"鄍";s:2:"";s:3:"鄏";s:2:"";s:3:"鄑";s:2:"";s:3:"鄖";s:2:"";s:3:"鄔";s:2:"";s:3:"鄋";s:2:"";s:3:"鄎";s:2:"";s:3:"酮";s:2:"";s:3:"酯";s:2:"";s:3:"鉈";s:2:"";s:3:"鉒";s:2:"";s:3:"鈰";s:2:"";s:3:"鈺";s:2:"";s:3:"鉦";s:2:"";s:3:"鈳";s:2:"";s:3:"鉥";s:2:"";s:3:"鉞";s:2:"";s:3:"銃";s:2:"";s:3:"鈮";s:2:"";s:3:"鉊";s:2:"";s:3:"鉆";s:2:"";s:3:"鉭";s:2:"";s:3:"鉬";s:2:"";s:3:"鉏";s:2:"";s:3:"鉠";s:2:"";s:3:"鉧";s:2:"";s:3:"鉯";s:2:"";s:3:"鈶";s:2:"";s:3:"鉡";s:2:"";s:3:"鉰";s:2:"";s:3:"鈱";s:2:"";s:3:"鉔";s:2:"";s:3:"鉣";s:2:"";s:3:"鉐";s:2:"";s:3:"鉲";s:2:"";s:3:"鉎";s:2:"";s:3:"鉓";s:2:"";s:3:"鉌";s:2:"";s:3:"鉖";s:2:"";s:3:"鈲";s:2:"";s:3:"閟";s:2:"";s:3:"閜";s:2:"";s:3:"閞";s:2:"";s:3:"閛";s:2:"";s:3:"隒";s:2:"";s:3:"隓";s:2:"";s:3:"隑";s:2:"";s:3:"隗";s:2:"";s:3:"雎";s:2:"";s:3:"雺";s:2:"";s:3:"雽";s:2:"";s:3:"雸";s:2:"";s:3:"雵";s:2:"";s:3:"靳";s:2:"";s:3:"靷";s:2:"";s:3:"靸";s:2:"";s:3:"靲";s:2:"";s:3:"頏";s:2:"";s:3:"頍";s:2:"";s:3:"頎";s:2:"";s:3:"颬";s:2:"";s:3:"飶";s:2:"";s:3:"飹";s:2:"";s:3:"馯";s:2:"";s:3:"馲";s:2:"";s:3:"馰";s:2:"";s:3:"馵";s:2:"";s:3:"骭";s:2:"";s:3:"骫";s:2:"";s:3:"魛";s:2:"";s:3:"鳪";s:2:"";s:3:"鳭";s:2:"";s:3:"鳧";s:2:"";s:3:"麀";s:2:"";s:3:"黽";s:2:"";s:3:"僦";s:2:"";s:3:"僔";s:2:"";s:3:"僗";s:2:"";s:3:"僨";s:2:"";s:3:"僳";s:2:"";s:3:"僛";s:2:"";s:3:"僪";s:2:"";s:3:"僝";s:2:"";s:3:"僤";s:2:"";s:3:"僓";s:2:"";s:3:"僬";s:2:"";s:3:"僰";s:2:"";s:3:"僯";s:2:"";s:3:"僣";s:2:"";s:3:"僠";s:2:"@";s:3:"凘";s:2:"A";s:3:"劀";s:2:"B";s:3:"劁";s:2:"C";s:3:"勩";s:2:"D";s:3:"勫";s:2:"E";s:3:"匰";s:2:"F";s:3:"厬";s:2:"G";s:3:"嘧";s:2:"H";s:3:"嘕";s:2:"I";s:3:"嘌";s:2:"J";s:3:"嘒";s:2:"K";s:3:"嗼";s:2:"L";s:3:"嘏";s:2:"M";s:3:"嘜";s:2:"N";s:3:"嘁";s:2:"O";s:3:"嘓";s:2:"P";s:3:"嘂";s:2:"Q";s:3:"嗺";s:2:"R";s:3:"嘝";s:2:"S";s:3:"嘄";s:2:"T";s:3:"嗿";s:2:"U";s:3:"嗹";s:2:"V";s:3:"墉";s:2:"W";s:3:"塼";s:2:"X";s:3:"墐";s:2:"Y";s:3:"墘";s:2:"Z";s:3:"墆";s:2:"[";s:3:"墁";s:2:"\";s:3:"塿";s:2:"]";s:3:"塴";s:2:"^";s:3:"墋";s:2:"_";s:3:"塺";s:2:"`";s:3:"墇";s:2:"a";s:3:"墑";s:2:"b";s:3:"墎";s:2:"c";s:3:"塶";s:2:"d";s:3:"墂";s:2:"e";s:3:"墈";s:2:"f";s:3:"塻";s:2:"g";s:3:"墔";s:2:"h";s:3:"墏";s:2:"i";s:3:"壾";s:2:"j";s:3:"奫";s:2:"k";s:3:"嫜";s:2:"l";s:3:"嫮";s:2:"m";s:3:"嫥";s:2:"n";s:3:"嫕";s:2:"o";s:3:"嫪";s:2:"p";s:3:"嫚";s:2:"q";s:3:"嫭";s:2:"r";s:3:"嫫";s:2:"s";s:3:"嫳";s:2:"t";s:3:"嫢";s:2:"u";s:3:"嫠";s:2:"v";s:3:"嫛";s:2:"w";s:3:"嫬";s:2:"x";s:3:"嫞";s:2:"y";s:3:"嫝";s:2:"z";s:3:"嫙";s:2:"{";s:3:"嫨";s:2:"|";s:3:"嫟";s:2:"}";s:3:"孷";s:2:"~";s:3:"寠";s:2:"";s:3:"寣";s:2:"";s:3:"屣";s:2:"";s:3:"嶂";s:2:"";s:3:"嶀";s:2:"";s:3:"嵽";s:2:"";s:3:"嶆";s:2:"";s:3:"嵺";s:2:"";s:3:"嶁";s:2:"";s:3:"嵷";s:2:"";s:3:"嶊";s:2:"";s:3:"嶉";s:2:"";s:3:"嶈";s:2:"";s:3:"嵾";s:2:"";s:3:"嵼";s:2:"";s:3:"嶍";s:2:"";s:3:"嵹";s:2:"";s:3:"嵿";s:2:"";s:3:"幘";s:2:"";s:3:"幙";s:2:"";s:3:"幓";s:2:"";s:3:"廘";s:2:"";s:3:"廑";s:2:"";s:3:"廗";s:2:"";s:3:"廎";s:2:"";s:3:"廜";s:2:"";s:3:"廕";s:2:"";s:3:"廙";s:2:"";s:3:"廒";s:2:"";s:3:"廔";s:2:"";s:3:"彄";s:2:"";s:3:"彃";s:2:"";s:3:"彯";s:2:"";s:3:"徶";s:2:"";s:3:"愬";s:2:"";s:3:"愨";s:2:"";s:3:"慁";s:2:"";s:3:"慞";s:2:"";s:3:"慱";s:2:"";s:3:"慳";s:2:"";s:3:"慒";s:2:"";s:3:"慓";s:2:"";s:3:"慲";s:2:"";s:3:"慬";s:2:"";s:3:"憀";s:2:"";s:3:"慴";s:2:"";s:3:"慔";s:2:"";s:3:"慺";s:2:"";s:3:"慛";s:2:"";s:3:"慥";s:2:"";s:3:"愻";s:2:"";s:3:"慪";s:2:"";s:3:"慡";s:2:"";s:3:"慖";s:2:"";s:3:"戩";s:2:"";s:3:"戧";s:2:"";s:3:"戫";s:2:"";s:3:"搫";s:2:"";s:3:"摍";s:2:"";s:3:"摛";s:2:"";s:3:"摝";s:2:"";s:3:"摴";s:2:"";s:3:"摶";s:2:"";s:3:"摲";s:2:"";s:3:"摳";s:2:"";s:3:"摽";s:2:"";s:3:"摵";s:2:"";s:3:"摦";s:2:"";s:3:"撦";s:2:"";s:3:"摎";s:2:"";s:3:"撂";s:2:"";s:3:"摞";s:2:"";s:3:"摜";s:2:"";s:3:"摋";s:2:"";s:3:"摓";s:2:"";s:3:"摠";s:2:"";s:3:"摐";s:2:"";s:3:"摿";s:2:"";s:3:"搿";s:2:"";s:3:"摬";s:2:"";s:3:"摫";s:2:"";s:3:"摙";s:2:"";s:3:"摥";s:2:"";s:3:"摷";s:2:"";s:3:"敳";s:2:"";s:3:"斠";s:2:"";s:3:"暡";s:2:"";s:3:"暠";s:2:"";s:3:"暟";s:2:"";s:3:"朅";s:2:"";s:3:"朄";s:2:"";s:3:"朢";s:2:"";s:3:"榱";s:2:"";s:3:"榶";s:2:"";s:3:"槉";s:2:"@";s:3:"榠";s:2:"A";s:3:"槎";s:2:"B";s:3:"榖";s:2:"C";s:3:"榰";s:2:"D";s:3:"榬";s:2:"E";s:3:"榼";s:2:"F";s:3:"榑";s:2:"G";s:3:"榙";s:2:"H";s:3:"榎";s:2:"I";s:3:"榧";s:2:"J";s:3:"榍";s:2:"K";s:3:"榩";s:2:"L";s:3:"榾";s:2:"M";s:3:"榯";s:2:"N";s:3:"榿";s:2:"O";s:3:"槄";s:2:"P";s:3:"榽";s:2:"Q";s:3:"榤";s:2:"R";s:3:"槔";s:2:"S";s:3:"榹";s:2:"T";s:3:"槊";s:2:"U";s:3:"榚";s:2:"V";s:3:"槏";s:2:"W";s:3:"榳";s:2:"X";s:3:"榓";s:2:"Y";s:3:"榪";s:2:"Z";s:3:"榡";s:2:"[";s:3:"榞";s:2:"\";s:3:"槙";s:2:"]";s:3:"榗";s:2:"^";s:3:"榐";s:2:"_";s:3:"槂";s:2:"`";s:3:"榵";s:2:"a";s:3:"榥";s:2:"b";s:3:"槆";s:2:"c";s:3:"歊";s:2:"d";s:3:"歍";s:2:"e";s:3:"歋";s:2:"f";s:3:"殞";s:2:"g";s:3:"殟";s:2:"h";s:3:"殠";s:2:"i";s:3:"毃";s:2:"j";s:3:"毄";s:2:"k";s:3:"毾";s:2:"l";s:3:"滎";s:2:"m";s:3:"滵";s:2:"n";s:3:"滱";s:2:"o";s:3:"漃";s:2:"p";s:3:"漥";s:2:"q";s:3:"滸";s:2:"r";s:3:"漷";s:2:"s";s:3:"滻";s:2:"t";s:3:"漮";s:2:"u";s:3:"漉";s:2:"v";s:3:"潎";s:2:"w";s:3:"漙";s:2:"x";s:3:"漚";s:2:"y";s:3:"漧";s:2:"z";s:3:"漘";s:2:"{";s:3:"漻";s:2:"|";s:3:"漒";s:2:"}";s:3:"滭";s:2:"~";s:3:"漊";s:2:"";s:3:"漶";s:2:"";s:3:"潳";s:2:"";s:3:"滹";s:2:"";s:3:"滮";s:2:"";s:3:"漭";s:2:"";s:3:"潀";s:2:"";s:3:"漰";s:2:"";s:3:"漼";s:2:"";s:3:"漵";s:2:"";s:3:"滫";s:2:"";s:3:"漇";s:2:"";s:3:"漎";s:2:"";s:3:"潃";s:2:"";s:3:"漅";s:2:"";s:3:"滽";s:2:"";s:3:"滶";s:2:"";s:3:"漹";s:2:"";s:3:"漜";s:2:"";s:3:"滼";s:2:"";s:3:"漺";s:2:"";s:3:"漟";s:2:"";s:3:"漍";s:2:"";s:3:"漞";s:2:"";s:3:"漈";s:2:"";s:3:"漡";s:2:"";s:3:"熇";s:2:"";s:3:"熐";s:2:"";s:3:"熉";s:2:"";s:3:"熀";s:2:"";s:3:"熅";s:2:"";s:3:"熂";s:2:"";s:3:"熏";s:2:"";s:3:"煻";s:2:"";s:3:"熆";s:2:"";s:3:"熁";s:2:"";s:3:"熗";s:2:"";s:3:"牄";s:2:"";s:3:"牓";s:2:"";s:3:"犗";s:2:"";s:3:"犕";s:2:"";s:3:"犓";s:2:"";s:3:"獃";s:2:"";s:3:"獍";s:2:"";s:3:"獑";s:2:"";s:3:"獌";s:2:"";s:3:"瑢";s:2:"";s:3:"瑳";s:2:"";s:3:"瑱";s:2:"";s:3:"瑵";s:2:"";s:3:"瑲";s:2:"";s:3:"瑧";s:2:"";s:3:"瑮";s:2:"";s:3:"甀";s:2:"";s:3:"甂";s:2:"";s:3:"甃";s:2:"";s:3:"畽";s:2:"";s:3:"疐";s:2:"";s:3:"瘖";s:2:"";s:3:"瘈";s:2:"";s:3:"瘌";s:2:"";s:3:"瘕";s:2:"";s:3:"瘑";s:2:"";s:3:"瘊";s:2:"";s:3:"瘔";s:2:"";s:3:"皸";s:2:"";s:3:"瞁";s:2:"";s:3:"睼";s:2:"";s:3:"瞅";s:2:"";s:3:"瞂";s:2:"";s:3:"睮";s:2:"";s:3:"瞀";s:2:"";s:3:"睯";s:2:"";s:3:"睾";s:2:"";s:3:"瞃";s:2:"";s:3:"碲";s:2:"";s:3:"碪";s:2:"";s:3:"碴";s:2:"";s:3:"碭";s:2:"";s:3:"碨";s:2:"";s:3:"硾";s:2:"";s:3:"碫";s:2:"";s:3:"碞";s:2:"";s:3:"碥";s:2:"";s:3:"碠";s:2:"";s:3:"碬";s:2:"";s:3:"碢";s:2:"";s:3:"碤";s:2:"";s:3:"禘";s:2:"";s:3:"禊";s:2:"";s:3:"禋";s:2:"";s:3:"禖";s:2:"";s:3:"禕";s:2:"";s:3:"禔";s:2:"";s:3:"禓";s:2:"@";s:3:"禗";s:2:"A";s:3:"禈";s:2:"B";s:3:"禒";s:2:"C";s:3:"禐";s:2:"D";s:3:"稫";s:2:"E";s:3:"穊";s:2:"F";s:3:"稰";s:2:"G";s:3:"稯";s:2:"H";s:3:"稨";s:2:"I";s:3:"稦";s:2:"J";s:3:"窨";s:2:"K";s:3:"窫";s:2:"L";s:3:"窬";s:2:"M";s:3:"竮";s:2:"N";s:3:"箈";s:2:"O";s:3:"箜";s:2:"P";s:3:"箊";s:2:"Q";s:3:"箑";s:2:"R";s:3:"箐";s:2:"S";s:3:"箖";s:2:"T";s:3:"箍";s:2:"U";s:3:"箌";s:2:"V";s:3:"箛";s:2:"W";s:3:"箎";s:2:"X";s:3:"箅";s:2:"Y";s:3:"箘";s:2:"Z";s:3:"劄";s:2:"[";s:3:"箙";s:2:"\";s:3:"箤";s:2:"]";s:3:"箂";s:2:"^";s:3:"粻";s:2:"_";s:3:"粿";s:2:"`";s:3:"粼";s:2:"a";s:3:"粺";s:2:"b";s:3:"綧";s:2:"c";s:3:"綷";s:2:"d";s:3:"緂";s:2:"e";s:3:"綣";s:2:"f";s:3:"綪";s:2:"g";s:3:"緁";s:2:"h";s:3:"緀";s:2:"i";s:3:"緅";s:2:"j";s:3:"綝";s:2:"k";s:3:"緎";s:2:"l";s:3:"緄";s:2:"m";s:3:"緆";s:2:"n";s:3:"緋";s:2:"o";s:3:"緌";s:2:"p";s:3:"綯";s:2:"q";s:3:"綹";s:2:"r";s:3:"綖";s:2:"s";s:3:"綼";s:2:"t";s:3:"綟";s:2:"u";s:3:"綦";s:2:"v";s:3:"綮";s:2:"w";s:3:"綩";s:2:"x";s:3:"綡";s:2:"y";s:3:"緉";s:2:"z";s:3:"罳";s:2:"{";s:3:"翢";s:2:"|";s:3:"翣";s:2:"}";s:3:"翥";s:2:"~";s:3:"翞";s:2:"";s:3:"耤";s:2:"";s:3:"聝";s:2:"";s:3:"聜";s:2:"";s:3:"膉";s:2:"";s:3:"膆";s:2:"";s:3:"膃";s:2:"";s:3:"膇";s:2:"";s:3:"膍";s:2:"";s:3:"膌";s:2:"";s:3:"膋";s:2:"";s:3:"舕";s:2:"";s:3:"蒗";s:2:"";s:3:"蒤";s:2:"";s:3:"蒡";s:2:"";s:3:"蒟";s:2:"";s:3:"蒺";s:2:"";s:3:"蓎";s:2:"";s:3:"蓂";s:2:"";s:3:"蒬";s:2:"";s:3:"蒮";s:2:"";s:3:"蒫";s:2:"";s:3:"蒹";s:2:"";s:3:"蒴";s:2:"";s:3:"蓁";s:2:"";s:3:"蓍";s:2:"";s:3:"蒪";s:2:"";s:3:"蒚";s:2:"";s:3:"蒱";s:2:"";s:3:"蓐";s:2:"";s:3:"蒝";s:2:"";s:3:"蒧";s:2:"";s:3:"蒻";s:2:"";s:3:"蒢";s:2:"";s:3:"蒔";s:2:"";s:3:"蓇";s:2:"";s:3:"蓌";s:2:"";s:3:"蒛";s:2:"";s:3:"蒩";s:2:"";s:3:"蒯";s:2:"";s:3:"蒨";s:2:"";s:3:"蓖";s:2:"";s:3:"蒘";s:2:"";s:3:"蒶";s:2:"";s:3:"蓏";s:2:"";s:3:"蒠";s:2:"";s:3:"蓗";s:2:"";s:3:"蓔";s:2:"";s:3:"蓒";s:2:"";s:3:"蓛";s:2:"";s:3:"蒰";s:2:"";s:3:"蒑";s:2:"";s:3:"虡";s:2:"";s:3:"蜳";s:2:"";s:3:"蜣";s:2:"";s:3:"蜨";s:2:"";s:3:"蝫";s:2:"";s:3:"蝀";s:2:"";s:3:"蜮";s:2:"";s:3:"蜞";s:2:"";s:3:"蜡";s:2:"";s:3:"蜙";s:2:"";s:3:"蜛";s:2:"";s:3:"蝃";s:2:"";s:3:"蜬";s:2:"";s:3:"蝁";s:2:"";s:3:"蜾";s:2:"";s:3:"蝆";s:2:"";s:3:"蜠";s:2:"";s:3:"蜲";s:2:"";s:3:"蜪";s:2:"";s:3:"蜭";s:2:"";s:3:"蜼";s:2:"";s:3:"蜒";s:2:"";s:3:"蜺";s:2:"";s:3:"蜱";s:2:"";s:3:"蜵";s:2:"";s:3:"蝂";s:2:"";s:3:"蜦";s:2:"";s:3:"蜧";s:2:"";s:3:"蜸";s:2:"";s:3:"蜤";s:2:"";s:3:"蜚";s:2:"";s:3:"蜰";s:2:"";s:3:"蜑";s:2:"";s:3:"裷";s:2:"";s:3:"裧";s:2:"";s:3:"裱";s:2:"";s:3:"裲";s:2:"";s:3:"裺";s:2:"";s:3:"裾";s:2:"";s:3:"裮";s:2:"";s:3:"裼";s:2:"";s:3:"裶";s:2:"";s:3:"裻";s:2:"@";s:3:"裰";s:2:"A";s:3:"裬";s:2:"B";s:3:"裫";s:2:"C";s:3:"覝";s:2:"D";s:3:"覡";s:2:"E";s:3:"覟";s:2:"F";s:3:"覞";s:2:"G";s:3:"觩";s:2:"H";s:3:"觫";s:2:"I";s:3:"觨";s:2:"J";s:3:"誫";s:2:"K";s:3:"誙";s:2:"L";s:3:"誋";s:2:"M";s:3:"誒";s:2:"N";s:3:"誏";s:2:"O";s:3:"誖";s:2:"P";s:3:"谽";s:2:"Q";s:3:"豨";s:2:"R";s:3:"豩";s:2:"S";s:3:"賕";s:2:"T";s:3:"賏";s:2:"U";s:3:"賗";s:2:"V";s:3:"趖";s:2:"W";s:3:"踉";s:2:"X";s:3:"踂";s:2:"Y";s:3:"跿";s:2:"Z";s:3:"踍";s:2:"[";s:3:"跽";s:2:"\";s:3:"踊";s:2:"]";s:3:"踃";s:2:"^";s:3:"踇";s:2:"_";s:3:"踆";s:2:"`";s:3:"踅";s:2:"a";s:3:"跾";s:2:"b";s:3:"踀";s:2:"c";s:3:"踄";s:2:"d";s:3:"輐";s:2:"e";s:3:"輑";s:2:"f";s:3:"輎";s:2:"g";s:3:"輍";s:2:"h";s:3:"鄣";s:2:"i";s:3:"鄜";s:2:"j";s:3:"鄠";s:2:"k";s:3:"鄢";s:2:"l";s:3:"鄟";s:2:"m";s:3:"鄝";s:2:"n";s:3:"鄚";s:2:"o";s:3:"鄤";s:2:"p";s:3:"鄡";s:2:"q";s:3:"鄛";s:2:"r";s:3:"酺";s:2:"s";s:3:"酲";s:2:"t";s:3:"酹";s:2:"u";s:3:"酳";s:2:"v";s:3:"銥";s:2:"w";s:3:"銤";s:2:"x";s:3:"鉶";s:2:"y";s:3:"銛";s:2:"z";s:3:"鉺";s:2:"{";s:3:"銠";s:2:"|";s:3:"銔";s:2:"}";s:3:"銪";s:2:"~";s:3:"銍";s:2:"";s:3:"銦";s:2:"";s:3:"銚";s:2:"";s:3:"銫";s:2:"";s:3:"鉹";s:2:"";s:3:"銗";s:2:"";s:3:"鉿";s:2:"";s:3:"銣";s:2:"";s:3:"鋮";s:2:"";s:3:"銎";s:2:"";s:3:"銂";s:2:"";s:3:"銕";s:2:"";s:3:"銢";s:2:"";s:3:"鉽";s:2:"";s:3:"銈";s:2:"";s:3:"銡";s:2:"";s:3:"銊";s:2:"";s:3:"銆";s:2:"";s:3:"銌";s:2:"";s:3:"銙";s:2:"";s:3:"銧";s:2:"";s:3:"鉾";s:2:"";s:3:"銇";s:2:"";s:3:"銩";s:2:"";s:3:"銝";s:2:"";s:3:"銋";s:2:"";s:3:"鈭";s:2:"";s:3:"隞";s:2:"";s:3:"隡";s:2:"";s:3:"雿";s:2:"";s:3:"靘";s:2:"";s:3:"靽";s:2:"";s:3:"靺";s:2:"";s:3:"靾";s:2:"";s:3:"鞃";s:2:"";s:3:"鞀";s:2:"";s:3:"鞂";s:2:"";s:3:"靻";s:2:"";s:3:"鞄";s:2:"";s:3:"鞁";s:2:"";s:3:"靿";s:2:"";s:3:"韎";s:2:"";s:3:"韍";s:2:"";s:3:"頖";s:2:"";s:3:"颭";s:2:"";s:3:"颮";s:2:"";s:3:"餂";s:2:"";s:3:"餀";s:2:"";s:3:"餇";s:2:"";s:3:"馝";s:2:"";s:3:"馜";s:2:"";s:3:"駃";s:2:"";s:3:"馹";s:2:"";s:3:"馻";s:2:"";s:3:"馺";s:2:"";s:3:"駂";s:2:"";s:3:"馽";s:2:"";s:3:"駇";s:2:"";s:3:"骱";s:2:"";s:3:"髣";s:2:"";s:3:"髧";s:2:"";s:3:"鬾";s:2:"";s:3:"鬿";s:2:"";s:3:"魠";s:2:"";s:3:"魡";s:2:"";s:3:"魟";s:2:"";s:3:"鳱";s:2:"";s:3:"鳲";s:2:"";s:3:"鳵";s:2:"";s:3:"麧";s:2:"";s:3:"僿";s:2:"";s:3:"儃";s:2:"";s:3:"儰";s:2:"";s:3:"僸";s:2:"";s:3:"儆";s:2:"";s:3:"儇";s:2:"";s:3:"僶";s:2:"";s:3:"僾";s:2:"";s:3:"儋";s:2:"";s:3:"儌";s:2:"";s:3:"僽";s:2:"";s:3:"儊";s:2:"";s:3:"劋";s:2:"";s:3:"劌";s:2:"";s:3:"勱";s:2:"";s:3:"勯";s:2:"";s:3:"噈";s:2:"";s:3:"噂";s:2:"";s:3:"噌";s:2:"";s:3:"嘵";s:2:"";s:3:"噁";s:2:"";s:3:"噊";s:2:"";s:3:"噉";s:2:"";s:3:"噆";s:2:"";s:3:"噘";s:2:"@";s:3:"噚";s:2:"A";s:3:"噀";s:2:"B";s:3:"嘳";s:2:"C";s:3:"嘽";s:2:"D";s:3:"嘬";s:2:"E";s:3:"嘾";s:2:"F";s:3:"嘸";s:2:"G";s:3:"嘪";s:2:"H";s:3:"嘺";s:2:"I";s:3:"圚";s:2:"J";s:3:"墫";s:2:"K";s:3:"墝";s:2:"L";s:3:"墱";s:2:"M";s:3:"墠";s:2:"N";s:3:"墣";s:2:"O";s:3:"墯";s:2:"P";s:3:"墬";s:2:"Q";s:3:"墥";s:2:"R";s:3:"墡";s:2:"S";s:3:"壿";s:2:"T";s:3:"嫿";s:2:"U";s:3:"嫴";s:2:"V";s:3:"嫽";s:2:"W";s:3:"嫷";s:2:"X";s:3:"嫶";s:2:"Y";s:3:"嬃";s:2:"Z";s:3:"嫸";s:2:"[";s:3:"嬂";s:2:"\";s:3:"嫹";s:2:"]";s:3:"嬁";s:2:"^";s:3:"嬇";s:2:"_";s:3:"嬅";s:2:"`";s:3:"嬏";s:2:"a";s:3:"屧";s:2:"b";s:3:"嶙";s:2:"c";s:3:"嶗";s:2:"d";s:3:"嶟";s:2:"e";s:3:"嶒";s:2:"f";s:3:"嶢";s:2:"g";s:3:"嶓";s:2:"h";s:3:"嶕";s:2:"i";s:3:"嶠";s:2:"j";s:3:"嶜";s:2:"k";s:3:"嶡";s:2:"l";s:3:"嶚";s:2:"m";s:3:"嶞";s:2:"n";s:3:"幩";s:2:"o";s:3:"幝";s:2:"p";s:3:"幠";s:2:"q";s:3:"幜";s:2:"r";s:3:"緳";s:2:"s";s:3:"廛";s:2:"t";s:3:"廞";s:2:"u";s:3:"廡";s:2:"v";s:3:"彉";s:2:"w";s:3:"徲";s:2:"x";s:3:"憋";s:2:"y";s:3:"憃";s:2:"z";s:3:"慹";s:2:"{";s:3:"憱";s:2:"|";s:3:"憰";s:2:"}";s:3:"憢";s:2:"~";s:3:"憉";s:2:"";s:3:"憛";s:2:"";s:3:"憓";s:2:"";s:3:"憯";s:2:"";s:3:"憭";s:2:"";s:3:"憟";s:2:"";s:3:"憒";s:2:"";s:3:"憪";s:2:"";s:3:"憡";s:2:"";s:3:"憍";s:2:"";s:3:"慦";s:2:"";s:3:"憳";s:2:"";s:3:"戭";s:2:"";s:3:"摮";s:2:"";s:3:"摰";s:2:"";s:3:"撖";s:2:"";s:3:"撠";s:2:"";s:3:"撅";s:2:"";s:3:"撗";s:2:"";s:3:"撜";s:2:"";s:3:"撏";s:2:"";s:3:"撋";s:2:"";s:3:"撊";s:2:"";s:3:"撌";s:2:"";s:3:"撣";s:2:"";s:3:"撟";s:2:"";s:3:"摨";s:2:"";s:3:"撱";s:2:"";s:3:"撘";s:2:"";s:3:"敶";s:2:"";s:3:"敺";s:2:"";s:3:"敹";s:2:"";s:3:"敻";s:2:"";s:3:"斲";s:2:"";s:3:"斳";s:2:"";s:3:"暵";s:2:"";s:3:"暰";s:2:"";s:3:"暩";s:2:"";s:3:"暲";s:2:"";s:3:"暷";s:2:"";s:3:"暪";s:2:"";s:3:"暯";s:2:"";s:3:"樀";s:2:"";s:3:"樆";s:2:"";s:3:"樗";s:2:"";s:3:"槥";s:2:"";s:3:"槸";s:2:"";s:3:"樕";s:2:"";s:3:"槱";s:2:"";s:3:"槤";s:2:"";s:3:"樠";s:2:"";s:3:"槿";s:2:"";s:3:"槬";s:2:"";s:3:"槢";s:2:"";s:3:"樛";s:2:"";s:3:"樝";s:2:"";s:3:"槾";s:2:"";s:3:"樧";s:2:"";s:3:"槲";s:2:"";s:3:"槮";s:2:"";s:3:"樔";s:2:"";s:3:"槷";s:2:"";s:3:"槧";s:2:"";s:3:"橀";s:2:"";s:3:"樈";s:2:"";s:3:"槦";s:2:"";s:3:"槻";s:2:"";s:3:"樍";s:2:"";s:3:"槼";s:2:"";s:3:"槫";s:2:"";s:3:"樉";s:2:"";s:3:"樄";s:2:"";s:3:"樘";s:2:"";s:3:"樥";s:2:"";s:3:"樏";s:2:"";s:3:"槶";s:2:"";s:3:"樦";s:2:"";s:3:"樇";s:2:"";s:3:"槴";s:2:"";s:3:"樖";s:2:"";s:3:"歑";s:2:"";s:3:"殥";s:2:"";s:3:"殣";s:2:"";s:3:"殢";s:2:"";s:3:"殦";s:2:"";s:3:"氁";s:2:"";s:3:"氀";s:2:"";s:3:"毿";s:2:"";s:3:"氂";s:2:"";s:3:"潁";s:2:"";s:3:"漦";s:2:"";s:3:"潾";s:2:"";s:3:"澇";s:2:"";s:3:"濆";s:2:"";s:3:"澒";s:2:"@";s:3:"澍";s:2:"A";s:3:"澉";s:2:"B";s:3:"澌";s:2:"C";s:3:"潢";s:2:"D";s:3:"潏";s:2:"E";s:3:"澅";s:2:"F";s:3:"潚";s:2:"G";s:3:"澖";s:2:"H";s:3:"潶";s:2:"I";s:3:"潬";s:2:"J";s:3:"澂";s:2:"K";s:3:"潕";s:2:"L";s:3:"潲";s:2:"M";s:3:"潒";s:2:"N";s:3:"潐";s:2:"O";s:3:"潗";s:2:"P";s:3:"澔";s:2:"Q";s:3:"澓";s:2:"R";s:3:"潝";s:2:"S";s:3:"漀";s:2:"T";s:3:"潡";s:2:"U";s:3:"潫";s:2:"V";s:3:"潽";s:2:"W";s:3:"潧";s:2:"X";s:3:"澐";s:2:"Y";s:3:"潓";s:2:"Z";s:3:"澋";s:2:"[";s:3:"潩";s:2:"\";s:3:"潿";s:2:"]";s:3:"澕";s:2:"^";s:3:"潣";s:2:"_";s:3:"潷";s:2:"`";s:3:"潪";s:2:"a";s:3:"潻";s:2:"b";s:3:"熲";s:2:"c";s:3:"熯";s:2:"d";s:3:"熛";s:2:"e";s:3:"熰";s:2:"f";s:3:"熠";s:2:"g";s:3:"熚";s:2:"h";s:3:"熩";s:2:"i";s:3:"熵";s:2:"j";s:3:"熝";s:2:"k";s:3:"熥";s:2:"l";s:3:"熞";s:2:"m";s:3:"熤";s:2:"n";s:3:"熡";s:2:"o";s:3:"熪";s:2:"p";s:3:"熜";s:2:"q";s:3:"熧";s:2:"r";s:3:"熳";s:2:"s";s:3:"犘";s:2:"t";s:3:"犚";s:2:"u";s:3:"獘";s:2:"v";s:3:"獒";s:2:"w";s:3:"獞";s:2:"x";s:3:"獟";s:2:"y";s:3:"獠";s:2:"z";s:3:"獝";s:2:"{";s:3:"獛";s:2:"|";s:3:"獡";s:2:"}";s:3:"獚";s:2:"~";s:3:"獙";s:2:"";s:3:"獢";s:2:"";s:3:"璇";s:2:"";s:3:"璉";s:2:"";s:3:"璊";s:2:"";s:3:"璆";s:2:"";s:3:"璁";s:2:"";s:3:"瑽";s:2:"";s:3:"璅";s:2:"";s:3:"璈";s:2:"";s:3:"瑼";s:2:"";s:3:"瑹";s:2:"";s:3:"甈";s:2:"";s:3:"甇";s:2:"";s:3:"畾";s:2:"";s:3:"瘥";s:2:"";s:3:"瘞";s:2:"";s:3:"瘙";s:2:"";s:3:"瘝";s:2:"";s:3:"瘜";s:2:"";s:3:"瘣";s:2:"";s:3:"瘚";s:2:"";s:3:"瘨";s:2:"";s:3:"瘛";s:2:"";s:3:"皜";s:2:"";s:3:"皝";s:2:"";s:3:"皞";s:2:"";s:3:"皛";s:2:"";s:3:"瞍";s:2:"";s:3:"瞏";s:2:"";s:3:"瞉";s:2:"";s:3:"瞈";s:2:"";s:3:"磍";s:2:"";s:3:"碻";s:2:"";s:3:"磏";s:2:"";s:3:"磌";s:2:"";s:3:"磑";s:2:"";s:3:"磎";s:2:"";s:3:"磔";s:2:"";s:3:"磈";s:2:"";s:3:"磃";s:2:"";s:3:"磄";s:2:"";s:3:"磉";s:2:"";s:3:"禚";s:2:"";s:3:"禡";s:2:"";s:3:"禠";s:2:"";s:3:"禜";s:2:"";s:3:"禢";s:2:"";s:3:"禛";s:2:"";s:3:"歶";s:2:"";s:3:"稹";s:2:"";s:3:"窲";s:2:"";s:3:"窴";s:2:"";s:3:"窳";s:2:"";s:3:"箷";s:2:"";s:3:"篋";s:2:"";s:3:"箾";s:2:"";s:3:"箬";s:2:"";s:3:"篎";s:2:"";s:3:"箯";s:2:"";s:3:"箹";s:2:"";s:3:"篊";s:2:"";s:3:"箵";s:2:"";s:3:"糅";s:2:"";s:3:"糈";s:2:"";s:3:"糌";s:2:"";s:3:"糋";s:2:"";s:3:"緷";s:2:"";s:3:"緛";s:2:"";s:3:"緪";s:2:"";s:3:"緧";s:2:"";s:3:"緗";s:2:"";s:3:"緡";s:2:"";s:3:"縃";s:2:"";s:3:"緺";s:2:"";s:3:"緦";s:2:"";s:3:"緶";s:2:"";s:3:"緱";s:2:"";s:3:"緰";s:2:"";s:3:"緮";s:2:"";s:3:"緟";s:2:"";s:3:"罶";s:2:"";s:3:"羬";s:2:"";s:3:"羰";s:2:"";s:3:"羭";s:2:"";s:3:"翭";s:2:"";s:3:"翫";s:2:"";s:3:"翪";s:2:"";s:3:"翬";s:2:"";s:3:"翦";s:2:"";s:3:"翨";s:2:"";s:3:"聤";s:2:"";s:3:"聧";s:2:"";s:3:"膣";s:2:"";s:3:"膟";s:2:"@";s:3:"膞";s:2:"A";s:3:"膕";s:2:"B";s:3:"膢";s:2:"C";s:3:"膙";s:2:"D";s:3:"膗";s:2:"E";s:3:"舖";s:2:"F";s:3:"艏";s:2:"G";s:3:"艓";s:2:"H";s:3:"艒";s:2:"I";s:3:"艐";s:2:"J";s:3:"艎";s:2:"K";s:3:"艑";s:2:"L";s:3:"蔤";s:2:"M";s:3:"蔻";s:2:"N";s:3:"蔏";s:2:"O";s:3:"蔀";s:2:"P";s:3:"蔩";s:2:"Q";s:3:"蔎";s:2:"R";s:3:"蔉";s:2:"S";s:3:"蔍";s:2:"T";s:3:"蔟";s:2:"U";s:3:"蔊";s:2:"V";s:3:"蔧";s:2:"W";s:3:"蔜";s:2:"X";s:3:"蓻";s:2:"Y";s:3:"蔫";s:2:"Z";s:3:"蓺";s:2:"[";s:3:"蔈";s:2:"\";s:3:"蔌";s:2:"]";s:3:"蓴";s:2:"^";s:3:"蔪";s:2:"_";s:3:"蓲";s:2:"`";s:3:"蔕";s:2:"a";s:3:"蓷";s:2:"b";s:3:"蓫";s:2:"c";s:3:"蓳";s:2:"d";s:3:"蓼";s:2:"e";s:3:"蔒";s:2:"f";s:3:"蓪";s:2:"g";s:3:"蓩";s:2:"h";s:3:"蔖";s:2:"i";s:3:"蓾";s:2:"j";s:3:"蔨";s:2:"k";s:3:"蔝";s:2:"l";s:3:"蔮";s:2:"m";s:3:"蔂";s:2:"n";s:3:"蓽";s:2:"o";s:3:"蔞";s:2:"p";s:3:"蓶";s:2:"q";s:3:"蔱";s:2:"r";s:3:"蔦";s:2:"s";s:3:"蓧";s:2:"t";s:3:"蓨";s:2:"u";s:3:"蓰";s:2:"v";s:3:"蓯";s:2:"w";s:3:"蓹";s:2:"x";s:3:"蔘";s:2:"y";s:3:"蔠";s:2:"z";s:3:"蔰";s:2:"{";s:3:"蔋";s:2:"|";s:3:"蔙";s:2:"}";s:3:"蔯";s:2:"~";s:3:"虢";s:2:"";s:3:"蝖";s:2:"";s:3:"蝣";s:2:"";s:3:"蝤";s:2:"";s:3:"蝷";s:2:"";s:3:"蟡";s:2:"";s:3:"蝳";s:2:"";s:3:"蝘";s:2:"";s:3:"蝔";s:2:"";s:3:"蝛";s:2:"";s:3:"蝒";s:2:"";s:3:"蝡";s:2:"";s:3:"蝚";s:2:"";s:3:"蝑";s:2:"";s:3:"蝞";s:2:"";s:3:"蝭";s:2:"";s:3:"蝪";s:2:"";s:3:"蝐";s:2:"";s:3:"蝎";s:2:"";s:3:"蝟";s:2:"";s:3:"蝝";s:2:"";s:3:"蝯";s:2:"";s:3:"蝬";s:2:"";s:3:"蝺";s:2:"";s:3:"蝮";s:2:"";s:3:"蝜";s:2:"";s:3:"蝥";s:2:"";s:3:"蝏";s:2:"";s:3:"蝻";s:2:"";s:3:"蝵";s:2:"";s:3:"蝢";s:2:"";s:3:"蝧";s:2:"";s:3:"蝩";s:2:"";s:3:"衚";s:2:"";s:3:"褅";s:2:"";s:3:"褌";s:2:"";s:3:"褔";s:2:"";s:3:"褋";s:2:"";s:3:"褗";s:2:"";s:3:"褘";s:2:"";s:3:"褙";s:2:"";s:3:"褆";s:2:"";s:3:"褖";s:2:"";s:3:"褑";s:2:"";s:3:"褎";s:2:"";s:3:"褉";s:2:"";s:3:"覢";s:2:"";s:3:"覤";s:2:"";s:3:"覣";s:2:"";s:3:"觭";s:2:"";s:3:"觰";s:2:"";s:3:"觬";s:2:"";s:3:"諏";s:2:"";s:3:"諆";s:2:"";s:3:"誸";s:2:"";s:3:"諓";s:2:"";s:3:"諑";s:2:"";s:3:"諔";s:2:"";s:3:"諕";s:2:"";s:3:"誻";s:2:"";s:3:"諗";s:2:"";s:3:"誾";s:2:"";s:3:"諀";s:2:"";s:3:"諅";s:2:"";s:3:"諘";s:2:"";s:3:"諃";s:2:"";s:3:"誺";s:2:"";s:3:"誽";s:2:"";s:3:"諙";s:2:"";s:3:"谾";s:2:"";s:3:"豍";s:2:"";s:3:"貏";s:2:"";s:3:"賥";s:2:"";s:3:"賟";s:2:"";s:3:"賙";s:2:"";s:3:"賨";s:2:"";s:3:"賚";s:2:"";s:3:"賝";s:2:"";s:3:"賧";s:2:"";s:3:"趠";s:2:"";s:3:"趜";s:2:"";s:3:"趡";s:2:"";s:3:"趛";s:2:"";s:3:"踠";s:2:"";s:3:"踣";s:2:"";s:3:"踥";s:2:"";s:3:"踤";s:2:"";s:3:"踮";s:2:"";s:3:"踕";s:2:"";s:3:"踛";s:2:"";s:3:"踖";s:2:"";s:3:"踑";s:2:"";s:3:"踙";s:2:"";s:3:"踦";s:2:"";s:3:"踧";s:2:"@";s:3:"踔";s:2:"A";s:3:"踒";s:2:"B";s:3:"踘";s:2:"C";s:3:"踓";s:2:"D";s:3:"踜";s:2:"E";s:3:"踗";s:2:"F";s:3:"踚";s:2:"G";s:3:"輬";s:2:"H";s:3:"輤";s:2:"I";s:3:"輘";s:2:"J";s:3:"輚";s:2:"K";s:3:"輠";s:2:"L";s:3:"輣";s:2:"M";s:3:"輖";s:2:"N";s:3:"輗";s:2:"O";s:3:"遳";s:2:"P";s:3:"遰";s:2:"Q";s:3:"遯";s:2:"R";s:3:"遧";s:2:"S";s:3:"遫";s:2:"T";s:3:"鄯";s:2:"U";s:3:"鄫";s:2:"V";s:3:"鄩";s:2:"W";s:3:"鄪";s:2:"X";s:3:"鄲";s:2:"Y";s:3:"鄦";s:2:"Z";s:3:"鄮";s:2:"[";s:3:"醅";s:2:"\";s:3:"醆";s:2:"]";s:3:"醊";s:2:"^";s:3:"醁";s:2:"_";s:3:"醂";s:2:"`";s:3:"醄";s:2:"a";s:3:"醀";s:2:"b";s:3:"鋐";s:2:"c";s:3:"鋃";s:2:"d";s:3:"鋄";s:2:"e";s:3:"鋀";s:2:"f";s:3:"鋙";s:2:"g";s:3:"銶";s:2:"h";s:3:"鋏";s:2:"i";s:3:"鋱";s:2:"j";s:3:"鋟";s:2:"k";s:3:"鋘";s:2:"l";s:3:"鋩";s:2:"m";s:3:"鋗";s:2:"n";s:3:"鋝";s:2:"o";s:3:"鋌";s:2:"p";s:3:"鋯";s:2:"q";s:3:"鋂";s:2:"r";s:3:"鋨";s:2:"s";s:3:"鋊";s:2:"t";s:3:"鋈";s:2:"u";s:3:"鋎";s:2:"v";s:3:"鋦";s:2:"w";s:3:"鋍";s:2:"x";s:3:"鋕";s:2:"y";s:3:"鋉";s:2:"z";s:3:"鋠";s:2:"{";s:3:"鋞";s:2:"|";s:3:"鋧";s:2:"}";s:3:"鋑";s:2:"~";s:3:"鋓";s:2:"";s:3:"銵";s:2:"";s:3:"鋡";s:2:"";s:3:"鋆";s:2:"";s:3:"銴";s:2:"";s:3:"镼";s:2:"";s:3:"閬";s:2:"";s:3:"閫";s:2:"";s:3:"閮";s:2:"";s:3:"閰";s:2:"";s:3:"隤";s:2:"";s:3:"隢";s:2:"";s:3:"雓";s:2:"";s:3:"霅";s:2:"";s:3:"霈";s:2:"";s:3:"霂";s:2:"";s:3:"靚";s:2:"";s:3:"鞊";s:2:"";s:3:"鞎";s:2:"";s:3:"鞈";s:2:"";s:3:"韐";s:2:"";s:3:"韏";s:2:"";s:3:"頞";s:2:"";s:3:"頝";s:2:"";s:3:"頦";s:2:"";s:3:"頩";s:2:"";s:3:"頨";s:2:"";s:3:"頠";s:2:"";s:3:"頛";s:2:"";s:3:"頧";s:2:"";s:3:"颲";s:2:"";s:3:"餈";s:2:"";s:3:"飺";s:2:"";s:3:"餑";s:2:"";s:3:"餔";s:2:"";s:3:"餖";s:2:"";s:3:"餗";s:2:"";s:3:"餕";s:2:"";s:3:"駜";s:2:"";s:3:"駍";s:2:"";s:3:"駏";s:2:"";s:3:"駓";s:2:"";s:3:"駔";s:2:"";s:3:"駎";s:2:"";s:3:"駉";s:2:"";s:3:"駖";s:2:"";s:3:"駘";s:2:"";s:3:"駋";s:2:"";s:3:"駗";s:2:"";s:3:"駌";s:2:"";s:3:"骳";s:2:"";s:3:"髬";s:2:"";s:3:"髫";s:2:"";s:3:"髳";s:2:"";s:3:"髲";s:2:"";s:3:"髱";s:2:"";s:3:"魆";s:2:"";s:3:"魃";s:2:"";s:3:"魧";s:2:"";s:3:"魴";s:2:"";s:3:"魱";s:2:"";s:3:"魦";s:2:"";s:3:"魶";s:2:"";s:3:"魵";s:2:"";s:3:"魰";s:2:"";s:3:"魨";s:2:"";s:3:"魤";s:2:"";s:3:"魬";s:2:"";s:3:"鳼";s:2:"";s:3:"鳺";s:2:"";s:3:"鳽";s:2:"";s:3:"鳿";s:2:"";s:3:"鳷";s:2:"";s:3:"鴇";s:2:"";s:3:"鴀";s:2:"";s:3:"鳹";s:2:"";s:3:"鳻";s:2:"";s:3:"鴈";s:2:"";s:3:"鴅";s:2:"";s:3:"鴄";s:2:"";s:3:"麃";s:2:"";s:3:"黓";s:2:"";s:3:"鼏";s:2:"";s:3:"鼐";s:2:"";s:3:"儜";s:2:"";s:3:"儓";s:2:"";s:3:"儗";s:2:"";s:3:"儚";s:2:"";s:3:"儑";s:2:"";s:3:"凞";s:2:"";s:3:"匴";s:2:"";s:3:"叡";s:2:"";s:3:"噰";s:2:"";s:3:"噠";s:2:"";s:3:"噮";s:2:"@";s:3:"噳";s:2:"A";s:3:"噦";s:2:"B";s:3:"噣";s:2:"C";s:3:"噭";s:2:"D";s:3:"噲";s:2:"E";s:3:"噞";s:2:"F";s:3:"噷";s:2:"G";s:3:"圜";s:2:"H";s:3:"圛";s:2:"I";s:3:"壈";s:2:"J";s:3:"墽";s:2:"K";s:3:"壉";s:2:"L";s:3:"墿";s:2:"M";s:3:"墺";s:2:"N";s:3:"壂";s:2:"O";s:3:"墼";s:2:"P";s:3:"壆";s:2:"Q";s:3:"嬗";s:2:"R";s:3:"嬙";s:2:"S";s:3:"嬛";s:2:"T";s:3:"嬡";s:2:"U";s:3:"嬔";s:2:"V";s:3:"嬓";s:2:"W";s:3:"嬐";s:2:"X";s:3:"嬖";s:2:"Y";s:3:"嬨";s:2:"Z";s:3:"嬚";s:2:"[";s:3:"嬠";s:2:"\";s:3:"嬞";s:2:"]";s:3:"寯";s:2:"^";s:3:"嶬";s:2:"_";s:3:"嶱";s:2:"`";s:3:"嶩";s:2:"a";s:3:"嶧";s:2:"b";s:3:"嶵";s:2:"c";s:3:"嶰";s:2:"d";s:3:"嶮";s:2:"e";s:3:"嶪";s:2:"f";s:3:"嶨";s:2:"g";s:3:"嶲";s:2:"h";s:3:"嶭";s:2:"i";s:3:"嶯";s:2:"j";s:3:"嶴";s:2:"k";s:3:"幧";s:2:"l";s:3:"幨";s:2:"m";s:3:"幦";s:2:"n";s:3:"幯";s:2:"o";s:3:"廩";s:2:"p";s:3:"廧";s:2:"q";s:3:"廦";s:2:"r";s:3:"廨";s:2:"s";s:3:"廥";s:2:"t";s:3:"彋";s:2:"u";s:3:"徼";s:2:"v";s:3:"憝";s:2:"w";s:3:"憨";s:2:"x";s:3:"憖";s:2:"y";s:3:"懅";s:2:"z";s:3:"憴";s:2:"{";s:3:"懆";s:2:"|";s:3:"懁";s:2:"}";s:3:"懌";s:2:"~";s:3:"憺";s:2:"";s:3:"憿";s:2:"";s:3:"憸";s:2:"";s:3:"憌";s:2:"";s:3:"擗";s:2:"";s:3:"擖";s:2:"";s:3:"擐";s:2:"";s:3:"擏";s:2:"";s:3:"擉";s:2:"";s:3:"撽";s:2:"";s:3:"撉";s:2:"";s:3:"擃";s:2:"";s:3:"擛";s:2:"";s:3:"擳";s:2:"";s:3:"擙";s:2:"";s:3:"攳";s:2:"";s:3:"敿";s:2:"";s:3:"敼";s:2:"";s:3:"斢";s:2:"";s:3:"曈";s:2:"";s:3:"暾";s:2:"";s:3:"曀";s:2:"";s:3:"曊";s:2:"";s:3:"曋";s:2:"";s:3:"曏";s:2:"";s:3:"暽";s:2:"";s:3:"暻";s:2:"";s:3:"暺";s:2:"";s:3:"曌";s:2:"";s:3:"朣";s:2:"";s:3:"樴";s:2:"";s:3:"橦";s:2:"";s:3:"橉";s:2:"";s:3:"橧";s:2:"";s:3:"樲";s:2:"";s:3:"橨";s:2:"";s:3:"樾";s:2:"";s:3:"橝";s:2:"";s:3:"橭";s:2:"";s:3:"橶";s:2:"";s:3:"橛";s:2:"";s:3:"橑";s:2:"";s:3:"樨";s:2:"";s:3:"橚";s:2:"";s:3:"樻";s:2:"";s:3:"樿";s:2:"";s:3:"橁";s:2:"";s:3:"橪";s:2:"";s:3:"橤";s:2:"";s:3:"橐";s:2:"";s:3:"橏";s:2:"";s:3:"橔";s:2:"";s:3:"橯";s:2:"";s:3:"橩";s:2:"";s:3:"橠";s:2:"";s:3:"樼";s:2:"";s:3:"橞";s:2:"";s:3:"橖";s:2:"";s:3:"橕";s:2:"";s:3:"橍";s:2:"";s:3:"橎";s:2:"";s:3:"橆";s:2:"";s:3:"歕";s:2:"";s:3:"歔";s:2:"";s:3:"歖";s:2:"";s:3:"殧";s:2:"";s:3:"殪";s:2:"";s:3:"殫";s:2:"";s:3:"毈";s:2:"";s:3:"毇";s:2:"";s:3:"氄";s:2:"";s:3:"氃";s:2:"";s:3:"氆";s:2:"";s:3:"澭";s:2:"";s:3:"濋";s:2:"";s:3:"澣";s:2:"";s:3:"濇";s:2:"";s:3:"澼";s:2:"";s:3:"濎";s:2:"";s:3:"濈";s:2:"";s:3:"潞";s:2:"";s:3:"濄";s:2:"";s:3:"澽";s:2:"";s:3:"澞";s:2:"";s:3:"濊";s:2:"";s:3:"澨";s:2:"";s:3:"瀄";s:2:"";s:3:"澥";s:2:"";s:3:"澮";s:2:"";s:3:"澺";s:2:"";s:3:"澬";s:2:"";s:3:"澪";s:2:"";s:3:"濏";s:2:"";s:3:"澿";s:2:"";s:3:"澸";s:2:"@";s:3:"澢";s:2:"A";s:3:"濉";s:2:"B";s:3:"澫";s:2:"C";s:3:"濍";s:2:"D";s:3:"澯";s:2:"E";s:3:"澲";s:2:"F";s:3:"澰";s:2:"G";s:3:"燅";s:2:"H";s:3:"燂";s:2:"I";s:3:"熿";s:2:"J";s:3:"熸";s:2:"K";s:3:"燖";s:2:"L";s:3:"燀";s:2:"M";s:3:"燁";s:2:"N";s:3:"燋";s:2:"O";s:3:"燔";s:2:"P";s:3:"燊";s:2:"Q";s:3:"燇";s:2:"R";s:3:"燏";s:2:"S";s:3:"熽";s:2:"T";s:3:"燘";s:2:"U";s:3:"熼";s:2:"V";s:3:"燆";s:2:"W";s:3:"燚";s:2:"X";s:3:"燛";s:2:"Y";s:3:"犝";s:2:"Z";s:3:"犞";s:2:"[";s:3:"獩";s:2:"\";s:3:"獦";s:2:"]";s:3:"獧";s:2:"^";s:3:"獬";s:2:"_";s:3:"獥";s:2:"`";s:3:"獫";s:2:"a";s:3:"獪";s:2:"b";s:3:"瑿";s:2:"c";s:3:"璚";s:2:"d";s:3:"璠";s:2:"e";s:3:"璔";s:2:"f";s:3:"璒";s:2:"g";s:3:"璕";s:2:"h";s:3:"璡";s:2:"i";s:3:"甋";s:2:"j";s:3:"疀";s:2:"k";s:3:"瘯";s:2:"l";s:3:"瘭";s:2:"m";s:3:"瘱";s:2:"n";s:3:"瘽";s:2:"o";s:3:"瘳";s:2:"p";s:3:"瘼";s:2:"q";s:3:"瘵";s:2:"r";s:3:"瘲";s:2:"s";s:3:"瘰";s:2:"t";s:3:"皻";s:2:"u";s:3:"盦";s:2:"v";s:3:"瞚";s:2:"w";s:3:"瞝";s:2:"x";s:3:"瞡";s:2:"y";s:3:"瞜";s:2:"z";s:3:"瞛";s:2:"{";s:3:"瞢";s:2:"|";s:3:"瞣";s:2:"}";s:3:"瞕";s:2:"~";s:3:"瞙";s:2:"";s:3:"瞗";s:2:"";s:3:"磝";s:2:"";s:3:"磩";s:2:"";s:3:"磥";s:2:"";s:3:"磪";s:2:"";s:3:"磞";s:2:"";s:3:"磣";s:2:"";s:3:"磛";s:2:"";s:3:"磡";s:2:"";s:3:"磢";s:2:"";s:3:"磭";s:2:"";s:3:"磟";s:2:"";s:3:"磠";s:2:"";s:3:"禤";s:2:"";s:3:"穄";s:2:"";s:3:"穈";s:2:"";s:3:"穇";s:2:"";s:3:"窶";s:2:"";s:3:"窸";s:2:"";s:3:"窵";s:2:"";s:3:"窱";s:2:"";s:3:"窷";s:2:"";s:3:"篞";s:2:"";s:3:"篣";s:2:"";s:3:"篧";s:2:"";s:3:"篝";s:2:"";s:3:"篕";s:2:"";s:3:"篥";s:2:"";s:3:"篚";s:2:"";s:3:"篨";s:2:"";s:3:"篹";s:2:"";s:3:"篔";s:2:"";s:3:"篪";s:2:"";s:3:"篢";s:2:"";s:3:"篜";s:2:"";s:3:"篫";s:2:"";s:3:"篘";s:2:"";s:3:"篟";s:2:"";s:3:"糒";s:2:"";s:3:"糔";s:2:"";s:3:"糗";s:2:"";s:3:"糐";s:2:"";s:3:"糑";s:2:"";s:3:"縒";s:2:"";s:3:"縡";s:2:"";s:3:"縗";s:2:"";s:3:"縌";s:2:"";s:3:"縟";s:2:"";s:3:"縠";s:2:"";s:3:"縓";s:2:"";s:3:"縎";s:2:"";s:3:"縜";s:2:"";s:3:"縕";s:2:"";s:3:"縚";s:2:"";s:3:"縢";s:2:"";s:3:"縋";s:2:"";s:3:"縏";s:2:"";s:3:"縖";s:2:"";s:3:"縍";s:2:"";s:3:"縔";s:2:"";s:3:"縥";s:2:"";s:3:"縤";s:2:"";s:3:"罃";s:2:"";s:3:"罻";s:2:"";s:3:"罼";s:2:"";s:3:"罺";s:2:"";s:3:"羱";s:2:"";s:3:"翯";s:2:"";s:3:"耪";s:2:"";s:3:"耩";s:2:"";s:3:"聬";s:2:"";s:3:"膱";s:2:"";s:3:"膦";s:2:"";s:3:"膮";s:2:"";s:3:"膹";s:2:"";s:3:"膵";s:2:"";s:3:"膫";s:2:"";s:3:"膰";s:2:"";s:3:"膬";s:2:"";s:3:"膴";s:2:"";s:3:"膲";s:2:"";s:3:"膷";s:2:"";s:3:"膧";s:2:"";s:3:"臲";s:2:"";s:3:"艕";s:2:"";s:3:"艖";s:2:"";s:3:"艗";s:2:"";s:3:"蕖";s:2:"";s:3:"蕅";s:2:"";s:3:"蕫";s:2:"";s:3:"蕍";s:2:"";s:3:"蕓";s:2:"";s:3:"蕡";s:2:"";s:3:"蕘";s:2:"@";s:3:"蕀";s:2:"A";s:3:"蕆";s:2:"B";s:3:"蕤";s:2:"C";s:3:"蕁";s:2:"D";s:3:"蕢";s:2:"E";s:3:"蕄";s:2:"F";s:3:"蕑";s:2:"G";s:3:"蕇";s:2:"H";s:3:"蕣";s:2:"I";s:3:"蔾";s:2:"J";s:3:"蕛";s:2:"K";s:3:"蕱";s:2:"L";s:3:"蕎";s:2:"M";s:3:"蕮";s:2:"N";s:3:"蕵";s:2:"O";s:3:"蕕";s:2:"P";s:3:"蕧";s:2:"Q";s:3:"蕠";s:2:"R";s:3:"薌";s:2:"S";s:3:"蕦";s:2:"T";s:3:"蕝";s:2:"U";s:3:"蕔";s:2:"V";s:3:"蕥";s:2:"W";s:3:"蕬";s:2:"X";s:3:"虣";s:2:"Y";s:3:"虥";s:2:"Z";s:3:"虤";s:2:"[";s:3:"螛";s:2:"\";s:3:"螏";s:2:"]";s:3:"螗";s:2:"^";s:3:"螓";s:2:"_";s:3:"螒";s:2:"`";s:3:"螈";s:2:"a";s:3:"螁";s:2:"b";s:3:"螖";s:2:"c";s:3:"螘";s:2:"d";s:3:"蝹";s:2:"e";s:3:"螇";s:2:"f";s:3:"螣";s:2:"g";s:3:"螅";s:2:"h";s:3:"螐";s:2:"i";s:3:"螑";s:2:"j";s:3:"螝";s:2:"k";s:3:"螄";s:2:"l";s:3:"螔";s:2:"m";s:3:"螜";s:2:"n";s:3:"螚";s:2:"o";s:3:"螉";s:2:"p";s:3:"褞";s:2:"q";s:3:"褦";s:2:"r";s:3:"褰";s:2:"s";s:3:"褭";s:2:"t";s:3:"褮";s:2:"u";s:3:"褧";s:2:"v";s:3:"褱";s:2:"w";s:3:"褢";s:2:"x";s:3:"褩";s:2:"y";s:3:"褣";s:2:"z";s:3:"褯";s:2:"{";s:3:"褬";s:2:"|";s:3:"褟";s:2:"}";s:3:"觱";s:2:"~";s:3:"諠";s:2:"";s:3:"諢";s:2:"";s:3:"諲";s:2:"";s:3:"諴";s:2:"";s:3:"諵";s:2:"";s:3:"諝";s:2:"";s:3:"謔";s:2:"";s:3:"諤";s:2:"";s:3:"諟";s:2:"";s:3:"諰";s:2:"";s:3:"諈";s:2:"";s:3:"諞";s:2:"";s:3:"諡";s:2:"";s:3:"諨";s:2:"";s:3:"諿";s:2:"";s:3:"諯";s:2:"";s:3:"諻";s:2:"";s:3:"貑";s:2:"";s:3:"貒";s:2:"";s:3:"貐";s:2:"";s:3:"賵";s:2:"";s:3:"賮";s:2:"";s:3:"賱";s:2:"";s:3:"賰";s:2:"";s:3:"賳";s:2:"";s:3:"赬";s:2:"";s:3:"赮";s:2:"";s:3:"趥";s:2:"";s:3:"趧";s:2:"";s:3:"踳";s:2:"";s:3:"踾";s:2:"";s:3:"踸";s:2:"";s:3:"蹀";s:2:"";s:3:"蹅";s:2:"";s:3:"踶";s:2:"";s:3:"踼";s:2:"";s:3:"踽";s:2:"";s:3:"蹁";s:2:"";s:3:"踰";s:2:"";s:3:"踿";s:2:"";s:3:"躽";s:2:"";s:3:"輶";s:2:"";s:3:"輮";s:2:"";s:3:"輵";s:2:"";s:3:"輲";s:2:"";s:3:"輹";s:2:"";s:3:"輷";s:2:"";s:3:"輴";s:2:"";s:3:"遶";s:2:"";s:3:"遹";s:2:"";s:3:"遻";s:2:"";s:3:"邆";s:2:"";s:3:"郺";s:2:"";s:3:"鄳";s:2:"";s:3:"鄵";s:2:"";s:3:"鄶";s:2:"";s:3:"醓";s:2:"";s:3:"醐";s:2:"";s:3:"醑";s:2:"";s:3:"醍";s:2:"";s:3:"醏";s:2:"";s:3:"錧";s:2:"";s:3:"錞";s:2:"";s:3:"錈";s:2:"";s:3:"錟";s:2:"";s:3:"錆";s:2:"";s:3:"錏";s:2:"";s:3:"鍺";s:2:"";s:3:"錸";s:2:"";s:3:"錼";s:2:"";s:3:"錛";s:2:"";s:3:"錣";s:2:"";s:3:"錒";s:2:"";s:3:"錁";s:2:"";s:3:"鍆";s:2:"";s:3:"錭";s:2:"";s:3:"錎";s:2:"";s:3:"錍";s:2:"";s:3:"鋋";s:2:"";s:3:"錝";s:2:"";s:3:"鋺";s:2:"";s:3:"錥";s:2:"";s:3:"錓";s:2:"";s:3:"鋹";s:2:"";s:3:"鋷";s:2:"";s:3:"錴";s:2:"";s:3:"錂";s:2:"";s:3:"錤";s:2:"";s:3:"鋿";s:2:"";s:3:"錩";s:2:"";s:3:"錹";s:2:"";s:3:"錵";s:2:"";s:3:"錪";s:2:"";s:3:"錔";s:2:"";s:3:"錌";s:2:"@";s:3:"錋";s:2:"A";s:3:"鋾";s:2:"B";s:3:"錉";s:2:"C";s:3:"錀";s:2:"D";s:3:"鋻";s:2:"E";s:3:"錖";s:2:"F";s:3:"閼";s:2:"G";s:3:"闍";s:2:"H";s:3:"閾";s:2:"I";s:3:"閹";s:2:"J";s:3:"閺";s:2:"K";s:3:"閶";s:2:"L";s:3:"閿";s:2:"M";s:3:"閵";s:2:"N";s:3:"閽";s:2:"O";s:3:"隩";s:2:"P";s:3:"雔";s:2:"Q";s:3:"霋";s:2:"R";s:3:"霒";s:2:"S";s:3:"霐";s:2:"T";s:3:"鞙";s:2:"U";s:3:"鞗";s:2:"V";s:3:"鞔";s:2:"W";s:3:"韰";s:2:"X";s:3:"韸";s:2:"Y";s:3:"頵";s:2:"Z";s:3:"頯";s:2:"[";s:3:"頲";s:2:"\";s:3:"餤";s:2:"]";s:3:"餟";s:2:"^";s:3:"餧";s:2:"_";s:3:"餩";s:2:"`";s:3:"馞";s:2:"a";s:3:"駮";s:2:"b";s:3:"駬";s:2:"c";s:3:"駥";s:2:"d";s:3:"駤";s:2:"e";s:3:"駰";s:2:"f";s:3:"駣";s:2:"g";s:3:"駪";s:2:"h";s:3:"駩";s:2:"i";s:3:"駧";s:2:"j";s:3:"骹";s:2:"k";s:3:"骿";s:2:"l";s:3:"骴";s:2:"m";s:3:"骻";s:2:"n";s:3:"髶";s:2:"o";s:3:"髺";s:2:"p";s:3:"髹";s:2:"q";s:3:"髷";s:2:"r";s:3:"鬳";s:2:"s";s:3:"鮀";s:2:"t";s:3:"鮅";s:2:"u";s:3:"鮇";s:2:"v";s:3:"魼";s:2:"w";s:3:"魾";s:2:"x";s:3:"魻";s:2:"y";s:3:"鮂";s:2:"z";s:3:"鮓";s:2:"{";s:3:"鮒";s:2:"|";s:3:"鮐";s:2:"}";s:3:"魺";s:2:"~";s:3:"鮕";s:2:"";s:3:"魽";s:2:"";s:3:"鮈";s:2:"";s:3:"鴥";s:2:"";s:3:"鴗";s:2:"";s:3:"鴠";s:2:"";s:3:"鴞";s:2:"";s:3:"鴔";s:2:"";s:3:"鴩";s:2:"";s:3:"鴝";s:2:"";s:3:"鴘";s:2:"";s:3:"鴢";s:2:"";s:3:"鴐";s:2:"";s:3:"鴙";s:2:"";s:3:"鴟";s:2:"";s:3:"麈";s:2:"";s:3:"麆";s:2:"";s:3:"麇";s:2:"";s:3:"麮";s:2:"";s:3:"麭";s:2:"";s:3:"黕";s:2:"";s:3:"黖";s:2:"";s:3:"黺";s:2:"";s:3:"鼒";s:2:"";s:3:"鼽";s:2:"";s:3:"儦";s:2:"";s:3:"儥";s:2:"";s:3:"儢";s:2:"";s:3:"儤";s:2:"";s:3:"儠";s:2:"";s:3:"儩";s:2:"";s:3:"勴";s:2:"";s:3:"嚓";s:2:"";s:3:"嚌";s:2:"";s:3:"嚍";s:2:"";s:3:"嚆";s:2:"";s:3:"嚄";s:2:"";s:3:"嚃";s:2:"";s:3:"噾";s:2:"";s:3:"嚂";s:2:"";s:3:"噿";s:2:"";s:3:"嚁";s:2:"";s:3:"壖";s:2:"";s:3:"壔";s:2:"";s:3:"壏";s:2:"";s:3:"壒";s:2:"";s:3:"嬭";s:2:"";s:3:"嬥";s:2:"";s:3:"嬲";s:2:"";s:3:"嬣";s:2:"";s:3:"嬬";s:2:"";s:3:"嬧";s:2:"";s:3:"嬦";s:2:"";s:3:"嬯";s:2:"";s:3:"嬮";s:2:"";s:3:"孻";s:2:"";s:3:"寱";s:2:"";s:3:"寲";s:2:"";s:3:"嶷";s:2:"";s:3:"幬";s:2:"";s:3:"幪";s:2:"";s:3:"徾";s:2:"";s:3:"徻";s:2:"";s:3:"懃";s:2:"";s:3:"憵";s:2:"";s:3:"憼";s:2:"";s:3:"懧";s:2:"";s:3:"懠";s:2:"";s:3:"懥";s:2:"";s:3:"懤";s:2:"";s:3:"懨";s:2:"";s:3:"懞";s:2:"";s:3:"擯";s:2:"";s:3:"擩";s:2:"";s:3:"擣";s:2:"";s:3:"擫";s:2:"";s:3:"擤";s:2:"";s:3:"擨";s:2:"";s:3:"斁";s:2:"";s:3:"斀";s:2:"";s:3:"斶";s:2:"";s:3:"旚";s:2:"";s:3:"曒";s:2:"";s:3:"檍";s:2:"";s:3:"檖";s:2:"";s:3:"檁";s:2:"";s:3:"檥";s:2:"";s:3:"檉";s:2:"";s:3:"檟";s:2:"";s:3:"檛";s:2:"";s:3:"檡";s:2:"";s:3:"檞";s:2:"";s:3:"檇";s:2:"";s:3:"檓";s:2:"";s:3:"檎";s:2:"@";s:3:"檕";s:2:"A";s:3:"檃";s:2:"B";s:3:"檨";s:2:"C";s:3:"檤";s:2:"D";s:3:"檑";s:2:"E";s:3:"橿";s:2:"F";s:3:"檦";s:2:"G";s:3:"檚";s:2:"H";s:3:"檅";s:2:"I";s:3:"檌";s:2:"J";s:3:"檒";s:2:"K";s:3:"歛";s:2:"L";s:3:"殭";s:2:"M";s:3:"氉";s:2:"N";s:3:"濌";s:2:"O";s:3:"澩";s:2:"P";s:3:"濴";s:2:"Q";s:3:"濔";s:2:"R";s:3:"濣";s:2:"S";s:3:"濜";s:2:"T";s:3:"濭";s:2:"U";s:3:"濧";s:2:"V";s:3:"濦";s:2:"W";s:3:"濞";s:2:"X";s:3:"濲";s:2:"Y";s:3:"濝";s:2:"Z";s:3:"濢";s:2:"[";s:3:"濨";s:2:"\";s:3:"燡";s:2:"]";s:3:"燱";s:2:"^";s:3:"燨";s:2:"_";s:3:"燲";s:2:"`";s:3:"燤";s:2:"a";s:3:"燰";s:2:"b";s:3:"燢";s:2:"c";s:3:"獳";s:2:"d";s:3:"獮";s:2:"e";s:3:"獯";s:2:"f";s:3:"璗";s:2:"g";s:3:"璲";s:2:"h";s:3:"璫";s:2:"i";s:3:"璐";s:2:"j";s:3:"璪";s:2:"k";s:3:"璭";s:2:"l";s:3:"璱";s:2:"m";s:3:"璥";s:2:"n";s:3:"璯";s:2:"o";s:3:"甐";s:2:"p";s:3:"甑";s:2:"q";s:3:"甒";s:2:"r";s:3:"甏";s:2:"s";s:3:"疄";s:2:"t";s:3:"癃";s:2:"u";s:3:"癈";s:2:"v";s:3:"癉";s:2:"w";s:3:"癇";s:2:"x";s:3:"皤";s:2:"y";s:3:"盩";s:2:"z";s:3:"瞵";s:2:"{";s:3:"瞫";s:2:"|";s:3:"瞲";s:2:"}";s:3:"瞷";s:2:"~";s:3:"瞶";s:2:"";s:3:"瞴";s:2:"";s:3:"瞱";s:2:"";s:3:"瞨";s:2:"";s:3:"矰";s:2:"";s:3:"磳";s:2:"";s:3:"磽";s:2:"";s:3:"礂";s:2:"";s:3:"磻";s:2:"";s:3:"磼";s:2:"";s:3:"磲";s:2:"";s:3:"礅";s:2:"";s:3:"磹";s:2:"";s:3:"磾";s:2:"";s:3:"礄";s:2:"";s:3:"禫";s:2:"";s:3:"禨";s:2:"";s:3:"穜";s:2:"";s:3:"穛";s:2:"";s:3:"穖";s:2:"";s:3:"穘";s:2:"";s:3:"穔";s:2:"";s:3:"穚";s:2:"";s:3:"窾";s:2:"";s:3:"竀";s:2:"";s:3:"竁";s:2:"";s:3:"簅";s:2:"";s:3:"簏";s:2:"";s:3:"篲";s:2:"";s:3:"簀";s:2:"";s:3:"篿";s:2:"";s:3:"篻";s:2:"";s:3:"簎";s:2:"";s:3:"篴";s:2:"";s:3:"簋";s:2:"";s:3:"篳";s:2:"";s:3:"簂";s:2:"";s:3:"簉";s:2:"";s:3:"簃";s:2:"";s:3:"簁";s:2:"";s:3:"篸";s:2:"";s:3:"篽";s:2:"";s:3:"簆";s:2:"";s:3:"篰";s:2:"";s:3:"篱";s:2:"";s:3:"簐";s:2:"";s:3:"簊";s:2:"";s:3:"糨";s:2:"";s:3:"縭";s:2:"";s:3:"縼";s:2:"";s:3:"繂";s:2:"";s:3:"縳";s:2:"";s:3:"顈";s:2:"";s:3:"縸";s:2:"";s:3:"縪";s:2:"";s:3:"繉";s:2:"";s:3:"繀";s:2:"";s:3:"繇";s:2:"";s:3:"縩";s:2:"";s:3:"繌";s:2:"";s:3:"縰";s:2:"";s:3:"縻";s:2:"";s:3:"縶";s:2:"";s:3:"繄";s:2:"";s:3:"縺";s:2:"";s:3:"罅";s:2:"";s:3:"罿";s:2:"";s:3:"罾";s:2:"";s:3:"罽";s:2:"";s:3:"翴";s:2:"";s:3:"翲";s:2:"";s:3:"耬";s:2:"";s:3:"膻";s:2:"";s:3:"臄";s:2:"";s:3:"臌";s:2:"";s:3:"臊";s:2:"";s:3:"臅";s:2:"";s:3:"臇";s:2:"";s:3:"膼";s:2:"";s:3:"臩";s:2:"";s:3:"艛";s:2:"";s:3:"艚";s:2:"";s:3:"艜";s:2:"";s:3:"薃";s:2:"";s:3:"薀";s:2:"";s:3:"薏";s:2:"";s:3:"薧";s:2:"";s:3:"薕";s:2:"";s:3:"薠";s:2:"";s:3:"薋";s:2:"";s:3:"薣";s:2:"";s:3:"蕻";s:2:"";s:3:"薤";s:2:"";s:3:"薚";s:2:"";s:3:"薞";s:2:"@";s:3:"蕷";s:2:"A";s:3:"蕼";s:2:"B";s:3:"薉";s:2:"C";s:3:"薡";s:2:"D";s:3:"蕺";s:2:"E";s:3:"蕸";s:2:"F";s:3:"蕗";s:2:"G";s:3:"薎";s:2:"H";s:3:"薖";s:2:"I";s:3:"薆";s:2:"J";s:3:"薍";s:2:"K";s:3:"薙";s:2:"L";s:3:"薝";s:2:"M";s:3:"薁";s:2:"N";s:3:"薢";s:2:"O";s:3:"薂";s:2:"P";s:3:"薈";s:2:"Q";s:3:"薅";s:2:"R";s:3:"蕹";s:2:"S";s:3:"蕶";s:2:"T";s:3:"薘";s:2:"U";s:3:"薐";s:2:"V";s:3:"薟";s:2:"W";s:3:"虨";s:2:"X";s:3:"螾";s:2:"Y";s:3:"螪";s:2:"Z";s:3:"螭";s:2:"[";s:3:"蟅";s:2:"\";s:3:"螰";s:2:"]";s:3:"螬";s:2:"^";s:3:"螹";s:2:"_";s:3:"螵";s:2:"`";s:3:"螼";s:2:"a";s:3:"螮";s:2:"b";s:3:"蟉";s:2:"c";s:3:"蟃";s:2:"d";s:3:"蟂";s:2:"e";s:3:"蟌";s:2:"f";s:3:"螷";s:2:"g";s:3:"螯";s:2:"h";s:3:"蟄";s:2:"i";s:3:"蟊";s:2:"j";s:3:"螴";s:2:"k";s:3:"螶";s:2:"l";s:3:"螿";s:2:"m";s:3:"螸";s:2:"n";s:3:"螽";s:2:"o";s:3:"蟞";s:2:"p";s:3:"螲";s:2:"q";s:3:"褵";s:2:"r";s:3:"褳";s:2:"s";s:3:"褼";s:2:"t";s:3:"褾";s:2:"u";s:3:"襁";s:2:"v";s:3:"襒";s:2:"w";s:3:"褷";s:2:"x";s:3:"襂";s:2:"y";s:3:"覭";s:2:"z";s:3:"覯";s:2:"{";s:3:"覮";s:2:"|";s:3:"觲";s:2:"}";s:3:"觳";s:2:"~";s:3:"謞";s:2:"";s:3:"謘";s:2:"";s:3:"謖";s:2:"";s:3:"謑";s:2:"";s:3:"謅";s:2:"";s:3:"謋";s:2:"";s:3:"謢";s:2:"";s:3:"謏";s:2:"";s:3:"謒";s:2:"";s:3:"謕";s:2:"";s:3:"謇";s:2:"";s:3:"謍";s:2:"";s:3:"謈";s:2:"";s:3:"謆";s:2:"";s:3:"謜";s:2:"";s:3:"謓";s:2:"";s:3:"謚";s:2:"";s:3:"豏";s:2:"";s:3:"豰";s:2:"";s:3:"豲";s:2:"";s:3:"豱";s:2:"";s:3:"豯";s:2:"";s:3:"貕";s:2:"";s:3:"貔";s:2:"";s:3:"賹";s:2:"";s:3:"赯";s:2:"";s:3:"蹎";s:2:"";s:3:"蹍";s:2:"";s:3:"蹓";s:2:"";s:3:"蹐";s:2:"";s:3:"蹌";s:2:"";s:3:"蹇";s:2:"";s:3:"轃";s:2:"";s:3:"轀";s:2:"";s:3:"邅";s:2:"";s:3:"遾";s:2:"";s:3:"鄸";s:2:"";s:3:"醚";s:2:"";s:3:"醢";s:2:"";s:3:"醛";s:2:"";s:3:"醙";s:2:"";s:3:"醟";s:2:"";s:3:"醡";s:2:"";s:3:"醝";s:2:"";s:3:"醠";s:2:"";s:3:"鎡";s:2:"";s:3:"鎃";s:2:"";s:3:"鎯";s:2:"";s:3:"鍤";s:2:"";s:3:"鍖";s:2:"";s:3:"鍇";s:2:"";s:3:"鍼";s:2:"";s:3:"鍘";s:2:"";s:3:"鍜";s:2:"";s:3:"鍶";s:2:"";s:3:"鍉";s:2:"";s:3:"鍐";s:2:"";s:3:"鍑";s:2:"";s:3:"鍠";s:2:"";s:3:"鍭";s:2:"";s:3:"鎏";s:2:"";s:3:"鍌";s:2:"";s:3:"鍪";s:2:"";s:3:"鍹";s:2:"";s:3:"鍗";s:2:"";s:3:"鍕";s:2:"";s:3:"鍒";s:2:"";s:3:"鍏";s:2:"";s:3:"鍱";s:2:"";s:3:"鍷";s:2:"";s:3:"鍻";s:2:"";s:3:"鍡";s:2:"";s:3:"鍞";s:2:"";s:3:"鍣";s:2:"";s:3:"鍧";s:2:"";s:3:"鎀";s:2:"";s:3:"鍎";s:2:"";s:3:"鍙";s:2:"";s:3:"闇";s:2:"";s:3:"闀";s:2:"";s:3:"闉";s:2:"";s:3:"闃";s:2:"";s:3:"闅";s:2:"";s:3:"閷";s:2:"";s:3:"隮";s:2:"";s:3:"隰";s:2:"";s:3:"隬";s:2:"";s:3:"霠";s:2:"";s:3:"霟";s:2:"";s:3:"霘";s:2:"";s:3:"霝";s:2:"";s:3:"霙";s:2:"";s:3:"鞚";s:2:"";s:3:"鞡";s:2:"";s:3:"鞜";s:2:"@";s:3:"鞞";s:2:"A";s:3:"鞝";s:2:"B";s:3:"韕";s:2:"C";s:3:"韔";s:2:"D";s:3:"韱";s:2:"E";s:3:"顁";s:2:"F";s:3:"顄";s:2:"G";s:3:"顊";s:2:"H";s:3:"顉";s:2:"I";s:3:"顅";s:2:"J";s:3:"顃";s:2:"K";s:3:"餥";s:2:"L";s:3:"餫";s:2:"M";s:3:"餬";s:2:"N";s:3:"餪";s:2:"O";s:3:"餳";s:2:"P";s:3:"餲";s:2:"Q";s:3:"餯";s:2:"R";s:3:"餭";s:2:"S";s:3:"餱";s:2:"T";s:3:"餰";s:2:"U";s:3:"馘";s:2:"V";s:3:"馣";s:2:"W";s:3:"馡";s:2:"X";s:3:"騂";s:2:"Y";s:3:"駺";s:2:"Z";s:3:"駴";s:2:"[";s:3:"駷";s:2:"\";s:3:"駹";s:2:"]";s:3:"駸";s:2:"^";s:3:"駶";s:2:"_";s:3:"駻";s:2:"`";s:3:"駽";s:2:"a";s:3:"駾";s:2:"b";s:3:"駼";s:2:"c";s:3:"騃";s:2:"d";s:3:"骾";s:2:"e";s:3:"髾";s:2:"f";s:3:"髽";s:2:"g";s:3:"鬁";s:2:"h";s:3:"髼";s:2:"i";s:3:"魈";s:2:"j";s:3:"鮚";s:2:"k";s:3:"鮨";s:2:"l";s:3:"鮞";s:2:"m";s:3:"鮛";s:2:"n";s:3:"鮦";s:2:"o";s:3:"鮡";s:2:"p";s:3:"鮥";s:2:"q";s:3:"鮤";s:2:"r";s:3:"鮆";s:2:"s";s:3:"鮢";s:2:"t";s:3:"鮠";s:2:"u";s:3:"鮯";s:2:"v";s:3:"鴳";s:2:"w";s:3:"鵁";s:2:"x";s:3:"鵧";s:2:"y";s:3:"鴶";s:2:"z";s:3:"鴮";s:2:"{";s:3:"鴯";s:2:"|";s:3:"鴱";s:2:"}";s:3:"鴸";s:2:"~";s:3:"鴰";s:2:"";s:3:"鵅";s:2:"";s:3:"鵂";s:2:"";s:3:"鵃";s:2:"";s:3:"鴾";s:2:"";s:3:"鴷";s:2:"";s:3:"鵀";s:2:"";s:3:"鴽";s:2:"";s:3:"翵";s:2:"";s:3:"鴭";s:2:"";s:3:"麊";s:2:"";s:3:"麉";s:2:"";s:3:"麍";s:2:"";s:3:"麰";s:2:"";s:3:"黈";s:2:"";s:3:"黚";s:2:"";s:3:"黻";s:2:"";s:3:"黿";s:2:"";s:3:"鼤";s:2:"";s:3:"鼣";s:2:"";s:3:"鼢";s:2:"";s:3:"齔";s:2:"";s:3:"龠";s:2:"";s:3:"儱";s:2:"";s:3:"儭";s:2:"";s:3:"儮";s:2:"";s:3:"嚘";s:2:"";s:3:"嚜";s:2:"";s:3:"嚗";s:2:"";s:3:"嚚";s:2:"";s:3:"嚝";s:2:"";s:3:"嚙";s:2:"";s:3:"奰";s:2:"";s:3:"嬼";s:2:"";s:3:"屩";s:2:"";s:3:"屪";s:2:"";s:3:"巀";s:2:"";s:3:"幭";s:2:"";s:3:"幮";s:2:"";s:3:"懘";s:2:"";s:3:"懟";s:2:"";s:3:"懭";s:2:"";s:3:"懮";s:2:"";s:3:"懱";s:2:"";s:3:"懪";s:2:"";s:3:"懰";s:2:"";s:3:"懫";s:2:"";s:3:"懖";s:2:"";s:3:"懩";s:2:"";s:3:"擿";s:2:"";s:3:"攄";s:2:"";s:3:"擽";s:2:"";s:3:"擸";s:2:"";s:3:"攁";s:2:"";s:3:"攃";s:2:"";s:3:"擼";s:2:"";s:3:"斔";s:2:"";s:3:"旛";s:2:"";s:3:"曚";s:2:"";s:3:"曛";s:2:"";s:3:"曘";s:2:"";s:3:"櫅";s:2:"";s:3:"檹";s:2:"";s:3:"檽";s:2:"";s:3:"櫡";s:2:"";s:3:"櫆";s:2:"";s:3:"檺";s:2:"";s:3:"檶";s:2:"";s:3:"檷";s:2:"";s:3:"櫇";s:2:"";s:3:"檴";s:2:"";s:3:"檭";s:2:"";s:3:"歞";s:2:"";s:3:"毉";s:2:"";s:3:"氋";s:2:"";s:3:"瀇";s:2:"";s:3:"瀌";s:2:"";s:3:"瀍";s:2:"";s:3:"瀁";s:2:"";s:3:"瀅";s:2:"";s:3:"瀔";s:2:"";s:3:"瀎";s:2:"";s:3:"濿";s:2:"";s:3:"瀀";s:2:"";s:3:"濻";s:2:"";s:3:"瀦";s:2:"";s:3:"濼";s:2:"";s:3:"濷";s:2:"";s:3:"瀊";s:2:"";s:3:"爁";s:2:"";s:3:"燿";s:2:"";s:3:"燹";s:2:"";s:3:"爃";s:2:"";s:3:"燽";s:2:"";s:3:"獶";s:2:"@";s:3:"璸";s:2:"A";s:3:"瓀";s:2:"B";s:3:"璵";s:2:"C";s:3:"瓁";s:2:"D";s:3:"璾";s:2:"E";s:3:"璶";s:2:"F";s:3:"璻";s:2:"G";s:3:"瓂";s:2:"H";s:3:"甔";s:2:"I";s:3:"甓";s:2:"J";s:3:"癜";s:2:"K";s:3:"癤";s:2:"L";s:3:"癙";s:2:"M";s:3:"癐";s:2:"N";s:3:"癓";s:2:"O";s:3:"癗";s:2:"P";s:3:"癚";s:2:"Q";s:3:"皦";s:2:"R";s:3:"皽";s:2:"S";s:3:"盬";s:2:"T";s:3:"矂";s:2:"U";s:3:"瞺";s:2:"V";s:3:"磿";s:2:"W";s:3:"礌";s:2:"X";s:3:"礓";s:2:"Y";s:3:"礔";s:2:"Z";s:3:"礉";s:2:"[";s:3:"礐";s:2:"\";s:3:"礒";s:2:"]";s:3:"礑";s:2:"^";s:3:"禭";s:2:"_";s:3:"禬";s:2:"`";s:3:"穟";s:2:"a";s:3:"簜";s:2:"b";s:3:"簩";s:2:"c";s:3:"簙";s:2:"d";s:3:"簠";s:2:"e";s:3:"簟";s:2:"f";s:3:"簭";s:2:"g";s:3:"簝";s:2:"h";s:3:"簦";s:2:"i";s:3:"簨";s:2:"j";s:3:"簢";s:2:"k";s:3:"簥";s:2:"l";s:3:"簰";s:2:"m";s:3:"繜";s:2:"n";s:3:"繐";s:2:"o";s:3:"繖";s:2:"p";s:3:"繣";s:2:"q";s:3:"繘";s:2:"r";s:3:"繢";s:2:"s";s:3:"繟";s:2:"t";s:3:"繑";s:2:"u";s:3:"繠";s:2:"v";s:3:"繗";s:2:"w";s:3:"繓";s:2:"x";s:3:"羵";s:2:"y";s:3:"羳";s:2:"z";s:3:"翷";s:2:"{";s:3:"翸";s:2:"|";s:3:"聵";s:2:"}";s:3:"臑";s:2:"~";s:3:"臒";s:2:"";s:3:"臐";s:2:"";s:3:"艟";s:2:"";s:3:"艞";s:2:"";s:3:"薴";s:2:"";s:3:"藆";s:2:"";s:3:"藀";s:2:"";s:3:"藃";s:2:"";s:3:"藂";s:2:"";s:3:"薳";s:2:"";s:3:"薵";s:2:"";s:3:"薽";s:2:"";s:3:"藇";s:2:"";s:3:"藄";s:2:"";s:3:"薿";s:2:"";s:3:"藋";s:2:"";s:3:"藎";s:2:"";s:3:"藈";s:2:"";s:3:"藅";s:2:"";s:3:"薱";s:2:"";s:3:"薶";s:2:"";s:3:"藒";s:2:"";s:3:"蘤";s:2:"";s:3:"薸";s:2:"";s:3:"薷";s:2:"";s:3:"薾";s:2:"";s:3:"虩";s:2:"";s:3:"蟧";s:2:"";s:3:"蟦";s:2:"";s:3:"蟢";s:2:"";s:3:"蟛";s:2:"";s:3:"蟫";s:2:"";s:3:"蟪";s:2:"";s:3:"蟥";s:2:"";s:3:"蟟";s:2:"";s:3:"蟳";s:2:"";s:3:"蟤";s:2:"";s:3:"蟔";s:2:"";s:3:"蟜";s:2:"";s:3:"蟓";s:2:"";s:3:"蟭";s:2:"";s:3:"蟘";s:2:"";s:3:"蟣";s:2:"";s:3:"螤";s:2:"";s:3:"蟗";s:2:"";s:3:"蟙";s:2:"";s:3:"蠁";s:2:"";s:3:"蟴";s:2:"";s:3:"蟨";s:2:"";s:3:"蟝";s:2:"";s:3:"襓";s:2:"";s:3:"襋";s:2:"";s:3:"襏";s:2:"";s:3:"襌";s:2:"";s:3:"襆";s:2:"";s:3:"襐";s:2:"";s:3:"襑";s:2:"";s:3:"襉";s:2:"";s:3:"謪";s:2:"";s:3:"謧";s:2:"";s:3:"謣";s:2:"";s:3:"謳";s:2:"";s:3:"謰";s:2:"";s:3:"謵";s:2:"";s:3:"譇";s:2:"";s:3:"謯";s:2:"";s:3:"謼";s:2:"";s:3:"謾";s:2:"";s:3:"謱";s:2:"";s:3:"謥";s:2:"";s:3:"謷";s:2:"";s:3:"謦";s:2:"";s:3:"謶";s:2:"";s:3:"謮";s:2:"";s:3:"謤";s:2:"";s:3:"謻";s:2:"";s:3:"謽";s:2:"";s:3:"謺";s:2:"";s:3:"豂";s:2:"";s:3:"豵";s:2:"";s:3:"貙";s:2:"";s:3:"貘";s:2:"";s:3:"貗";s:2:"";s:3:"賾";s:2:"";s:3:"贄";s:2:"";s:3:"贂";s:2:"";s:3:"贀";s:2:"";s:3:"蹜";s:2:"";s:3:"蹢";s:2:"";s:3:"蹠";s:2:"";s:3:"蹗";s:2:"";s:3:"蹖";s:2:"";s:3:"蹞";s:2:"";s:3:"蹥";s:2:"";s:3:"蹧";s:2:"@";s:3:"蹛";s:2:"A";s:3:"蹚";s:2:"B";s:3:"蹡";s:2:"C";s:3:"蹝";s:2:"D";s:3:"蹩";s:2:"E";s:3:"蹔";s:2:"F";s:3:"轆";s:2:"G";s:3:"轇";s:2:"H";s:3:"轈";s:2:"I";s:3:"轋";s:2:"J";s:3:"鄨";s:2:"K";s:3:"鄺";s:2:"L";s:3:"鄻";s:2:"M";s:3:"鄾";s:2:"N";s:3:"醨";s:2:"O";s:3:"醥";s:2:"P";s:3:"醧";s:2:"Q";s:3:"醯";s:2:"R";s:3:"醪";s:2:"S";s:3:"鎵";s:2:"T";s:3:"鎌";s:2:"U";s:3:"鎒";s:2:"V";s:3:"鎷";s:2:"W";s:3:"鎛";s:2:"X";s:3:"鎝";s:2:"Y";s:3:"鎉";s:2:"Z";s:3:"鎧";s:2:"[";s:3:"鎎";s:2:"\";s:3:"鎪";s:2:"]";s:3:"鎞";s:2:"^";s:3:"鎦";s:2:"_";s:3:"鎕";s:2:"`";s:3:"鎈";s:2:"a";s:3:"鎙";s:2:"b";s:3:"鎟";s:2:"c";s:3:"鎍";s:2:"d";s:3:"鎱";s:2:"e";s:3:"鎑";s:2:"f";s:3:"鎲";s:2:"g";s:3:"鎤";s:2:"h";s:3:"鎨";s:2:"i";s:3:"鎴";s:2:"j";s:3:"鎣";s:2:"k";s:3:"鎥";s:2:"l";s:3:"闒";s:2:"m";s:3:"闓";s:2:"n";s:3:"闑";s:2:"o";s:3:"隳";s:2:"p";s:3:"雗";s:2:"q";s:3:"雚";s:2:"r";s:3:"巂";s:2:"s";s:3:"雟";s:2:"t";s:3:"雘";s:2:"u";s:3:"雝";s:2:"v";s:3:"霣";s:2:"w";s:3:"霢";s:2:"x";s:3:"霥";s:2:"y";s:3:"鞬";s:2:"z";s:3:"鞮";s:2:"{";s:3:"鞨";s:2:"|";s:3:"鞫";s:2:"}";s:3:"鞤";s:2:"~";s:3:"鞪";s:2:"";s:3:"鞢";s:2:"";s:3:"鞥";s:2:"";s:3:"韗";s:2:"";s:3:"韙";s:2:"";s:3:"韖";s:2:"";s:3:"韘";s:2:"";s:3:"韺";s:2:"";s:3:"顐";s:2:"";s:3:"顑";s:2:"";s:3:"顒";s:2:"";s:3:"颸";s:2:"";s:3:"饁";s:2:"";s:3:"餼";s:2:"";s:3:"餺";s:2:"";s:3:"騏";s:2:"";s:3:"騋";s:2:"";s:3:"騉";s:2:"";s:3:"騍";s:2:"";s:3:"騄";s:2:"";s:3:"騑";s:2:"";s:3:"騊";s:2:"";s:3:"騅";s:2:"";s:3:"騇";s:2:"";s:3:"騆";s:2:"";s:3:"髀";s:2:"";s:3:"髜";s:2:"";s:3:"鬈";s:2:"";s:3:"鬄";s:2:"";s:3:"鬅";s:2:"";s:3:"鬩";s:2:"";s:3:"鬵";s:2:"";s:3:"魊";s:2:"";s:3:"魌";s:2:"";s:3:"魋";s:2:"";s:3:"鯇";s:2:"";s:3:"鯆";s:2:"";s:3:"鯃";s:2:"";s:3:"鮿";s:2:"";s:3:"鯁";s:2:"";s:3:"鮵";s:2:"";s:3:"鮸";s:2:"";s:3:"鯓";s:2:"";s:3:"鮶";s:2:"";s:3:"鯄";s:2:"";s:3:"鮹";s:2:"";s:3:"鮽";s:2:"";s:3:"鵜";s:2:"";s:3:"鵓";s:2:"";s:3:"鵏";s:2:"";s:3:"鵊";s:2:"";s:3:"鵛";s:2:"";s:3:"鵋";s:2:"";s:3:"鵙";s:2:"";s:3:"鵖";s:2:"";s:3:"鵌";s:2:"";s:3:"鵗";s:2:"";s:3:"鵒";s:2:"";s:3:"鵔";s:2:"";s:3:"鵟";s:2:"";s:3:"鵘";s:2:"";s:3:"鵚";s:2:"";s:3:"麎";s:2:"";s:3:"麌";s:2:"";s:3:"黟";s:2:"";s:3:"鼁";s:2:"";s:3:"鼀";s:2:"";s:3:"鼖";s:2:"";s:3:"鼥";s:2:"";s:3:"鼫";s:2:"";s:3:"鼪";s:2:"";s:3:"鼩";s:2:"";s:3:"鼨";s:2:"";s:3:"齌";s:2:"";s:3:"齕";s:2:"";s:3:"儴";s:2:"";s:3:"儵";s:2:"";s:3:"劖";s:2:"";s:3:"勷";s:2:"";s:3:"厴";s:2:"";s:3:"嚫";s:2:"";s:3:"嚭";s:2:"";s:3:"嚦";s:2:"";s:3:"嚧";s:2:"";s:3:"嚪";s:2:"";s:3:"嚬";s:2:"";s:3:"壚";s:2:"";s:3:"壝";s:2:"";s:3:"壛";s:2:"";s:3:"夒";s:2:"";s:3:"嬽";s:2:"";s:3:"嬾";s:2:"";s:3:"嬿";s:2:"";s:3:"巃";s:2:"";s:3:"幰";s:2:"@";s:3:"徿";s:2:"A";s:3:"懻";s:2:"B";s:3:"攇";s:2:"C";s:3:"攐";s:2:"D";s:3:"攍";s:2:"E";s:3:"攉";s:2:"F";s:3:"攌";s:2:"G";s:3:"攎";s:2:"H";s:3:"斄";s:2:"I";s:3:"旞";s:2:"J";s:3:"旝";s:2:"K";s:3:"曞";s:2:"L";s:3:"櫧";s:2:"M";s:3:"櫠";s:2:"N";s:3:"櫌";s:2:"O";s:3:"櫑";s:2:"P";s:3:"櫙";s:2:"Q";s:3:"櫋";s:2:"R";s:3:"櫟";s:2:"S";s:3:"櫜";s:2:"T";s:3:"櫐";s:2:"U";s:3:"櫫";s:2:"V";s:3:"櫏";s:2:"W";s:3:"櫍";s:2:"X";s:3:"櫞";s:2:"Y";s:3:"歠";s:2:"Z";s:3:"殰";s:2:"[";s:3:"氌";s:2:"\";s:3:"瀙";s:2:"]";s:3:"瀧";s:2:"^";s:3:"瀠";s:2:"_";s:3:"瀖";s:2:"`";s:3:"瀫";s:2:"a";s:3:"瀡";s:2:"b";s:3:"瀢";s:2:"c";s:3:"瀣";s:2:"d";s:3:"瀩";s:2:"e";s:3:"瀗";s:2:"f";s:3:"瀤";s:2:"g";s:3:"瀜";s:2:"h";s:3:"瀪";s:2:"i";s:3:"爌";s:2:"j";s:3:"爊";s:2:"k";s:3:"爇";s:2:"l";s:3:"爂";s:2:"m";s:3:"爅";s:2:"n";s:3:"犥";s:2:"o";s:3:"犦";s:2:"p";s:3:"犤";s:2:"q";s:3:"犣";s:2:"r";s:3:"犡";s:2:"s";s:3:"瓋";s:2:"t";s:3:"瓅";s:2:"u";s:3:"璷";s:2:"v";s:3:"瓃";s:2:"w";s:3:"甖";s:2:"x";s:3:"癠";s:2:"y";s:3:"矉";s:2:"z";s:3:"矊";s:2:"{";s:3:"矄";s:2:"|";s:3:"矱";s:2:"}";s:3:"礝";s:2:"~";s:3:"礛";s:2:"";s:3:"礡";s:2:"";s:3:"礜";s:2:"";s:3:"礗";s:2:"";s:3:"礞";s:2:"";s:3:"禰";s:2:"";s:3:"穧";s:2:"";s:3:"穨";s:2:"";s:3:"簳";s:2:"";s:3:"簼";s:2:"";s:3:"簹";s:2:"";s:3:"簬";s:2:"";s:3:"簻";s:2:"";s:3:"糬";s:2:"";s:3:"糪";s:2:"";s:3:"繶";s:2:"";s:3:"繵";s:2:"";s:3:"繸";s:2:"";s:3:"繰";s:2:"";s:3:"繷";s:2:"";s:3:"繯";s:2:"";s:3:"繺";s:2:"";s:3:"繲";s:2:"";s:3:"繴";s:2:"";s:3:"繨";s:2:"";s:3:"罋";s:2:"";s:3:"罊";s:2:"";s:3:"羃";s:2:"";s:3:"羆";s:2:"";s:3:"羷";s:2:"";s:3:"翽";s:2:"";s:3:"翾";s:2:"";s:3:"聸";s:2:"";s:3:"臗";s:2:"";s:3:"臕";s:2:"";s:3:"艤";s:2:"";s:3:"艡";s:2:"";s:3:"艣";s:2:"";s:3:"藫";s:2:"";s:3:"藱";s:2:"";s:3:"藭";s:2:"";s:3:"藙";s:2:"";s:3:"藡";s:2:"";s:3:"藨";s:2:"";s:3:"藚";s:2:"";s:3:"藗";s:2:"";s:3:"藬";s:2:"";s:3:"藲";s:2:"";s:3:"藸";s:2:"";s:3:"藘";s:2:"";s:3:"藟";s:2:"";s:3:"藣";s:2:"";s:3:"藜";s:2:"";s:3:"藑";s:2:"";s:3:"藰";s:2:"";s:3:"藦";s:2:"";s:3:"藯";s:2:"";s:3:"藞";s:2:"";s:3:"藢";s:2:"";s:3:"蠀";s:2:"";s:3:"蟺";s:2:"";s:3:"蠃";s:2:"";s:3:"蟶";s:2:"";s:3:"蟷";s:2:"";s:3:"蠉";s:2:"";s:3:"蠌";s:2:"";s:3:"蠋";s:2:"";s:3:"蠆";s:2:"";s:3:"蟼";s:2:"";s:3:"蠈";s:2:"";s:3:"蟿";s:2:"";s:3:"蠊";s:2:"";s:3:"蠂";s:2:"";s:3:"襢";s:2:"";s:3:"襚";s:2:"";s:3:"襛";s:2:"";s:3:"襗";s:2:"";s:3:"襡";s:2:"";s:3:"襜";s:2:"";s:3:"襘";s:2:"";s:3:"襝";s:2:"";s:3:"襙";s:2:"";s:3:"覈";s:2:"";s:3:"覷";s:2:"";s:3:"覶";s:2:"";s:3:"觶";s:2:"";s:3:"譐";s:2:"";s:3:"譈";s:2:"";s:3:"譊";s:2:"";s:3:"譀";s:2:"";s:3:"譓";s:2:"";s:3:"譖";s:2:"";s:3:"譔";s:2:"";s:3:"譋";s:2:"";s:3:"譕";s:2:"@";s:3:"譑";s:2:"A";s:3:"譂";s:2:"B";s:3:"譒";s:2:"C";s:3:"譗";s:2:"D";s:3:"豃";s:2:"E";s:3:"豷";s:2:"F";s:3:"豶";s:2:"G";s:3:"貚";s:2:"H";s:3:"贆";s:2:"I";s:3:"贇";s:2:"J";s:3:"贉";s:2:"K";s:3:"趬";s:2:"L";s:3:"趪";s:2:"M";s:3:"趭";s:2:"N";s:3:"趫";s:2:"O";s:3:"蹭";s:2:"P";s:3:"蹸";s:2:"Q";s:3:"蹳";s:2:"R";s:3:"蹪";s:2:"S";s:3:"蹯";s:2:"T";s:3:"蹻";s:2:"U";s:3:"軂";s:2:"V";s:3:"轒";s:2:"W";s:3:"轑";s:2:"X";s:3:"轏";s:2:"Y";s:3:"轐";s:2:"Z";s:3:"轓";s:2:"[";s:3:"辴";s:2:"\";s:3:"酀";s:2:"]";s:3:"鄿";s:2:"^";s:3:"醰";s:2:"_";s:3:"醭";s:2:"`";s:3:"鏞";s:2:"a";s:3:"鏇";s:2:"b";s:3:"鏏";s:2:"c";s:3:"鏂";s:2:"d";s:3:"鏚";s:2:"e";s:3:"鏐";s:2:"f";s:3:"鏹";s:2:"g";s:3:"鏬";s:2:"h";s:3:"鏌";s:2:"i";s:3:"鏙";s:2:"j";s:3:"鎩";s:2:"k";s:3:"鏦";s:2:"l";s:3:"鏊";s:2:"m";s:3:"鏔";s:2:"n";s:3:"鏮";s:2:"o";s:3:"鏣";s:2:"p";s:3:"鏕";s:2:"q";s:3:"鏄";s:2:"r";s:3:"鏎";s:2:"s";s:3:"鏀";s:2:"t";s:3:"鏒";s:2:"u";s:3:"鏧";s:2:"v";s:3:"镽";s:2:"w";s:3:"闚";s:2:"x";s:3:"闛";s:2:"y";s:3:"雡";s:2:"z";s:3:"霩";s:2:"{";s:3:"霫";s:2:"|";s:3:"霬";s:2:"}";s:3:"霨";s:2:"~";s:3:"霦";s:2:"";s:3:"鞳";s:2:"";s:3:"鞷";s:2:"";s:3:"鞶";s:2:"";s:3:"韝";s:2:"";s:3:"韞";s:2:"";s:3:"韟";s:2:"";s:3:"顜";s:2:"";s:3:"顙";s:2:"";s:3:"顝";s:2:"";s:3:"顗";s:2:"";s:3:"颿";s:2:"";s:3:"颽";s:2:"";s:3:"颻";s:2:"";s:3:"颾";s:2:"";s:3:"饈";s:2:"";s:3:"饇";s:2:"";s:3:"饃";s:2:"";s:3:"馦";s:2:"";s:3:"馧";s:2:"";s:3:"騚";s:2:"";s:3:"騕";s:2:"";s:3:"騥";s:2:"";s:3:"騝";s:2:"";s:3:"騤";s:2:"";s:3:"騛";s:2:"";s:3:"騢";s:2:"";s:3:"騠";s:2:"";s:3:"騧";s:2:"";s:3:"騣";s:2:"";s:3:"騞";s:2:"";s:3:"騜";s:2:"";s:3:"騔";s:2:"";s:3:"髂";s:2:"";s:3:"鬋";s:2:"";s:3:"鬊";s:2:"";s:3:"鬎";s:2:"";s:3:"鬌";s:2:"";s:3:"鬷";s:2:"";s:3:"鯪";s:2:"";s:3:"鯫";s:2:"";s:3:"鯠";s:2:"";s:3:"鯞";s:2:"";s:3:"鯤";s:2:"";s:3:"鯦";s:2:"";s:3:"鯢";s:2:"";s:3:"鯰";s:2:"";s:3:"鯔";s:2:"";s:3:"鯗";s:2:"";s:3:"鯬";s:2:"";s:3:"鯜";s:2:"";s:3:"鯙";s:2:"";s:3:"鯥";s:2:"";s:3:"鯕";s:2:"";s:3:"鯡";s:2:"";s:3:"鯚";s:2:"";s:3:"鵷";s:2:"";s:3:"鶁";s:2:"";s:3:"鶊";s:2:"";s:3:"鶄";s:2:"";s:3:"鶈";s:2:"";s:3:"鵱";s:2:"";s:3:"鶀";s:2:"";s:3:"鵸";s:2:"";s:3:"鶆";s:2:"";s:3:"鶋";s:2:"";s:3:"鶌";s:2:"";s:3:"鵽";s:2:"";s:3:"鵫";s:2:"";s:3:"鵴";s:2:"";s:3:"鵵";s:2:"";s:3:"鵰";s:2:"";s:3:"鵩";s:2:"";s:3:"鶅";s:2:"";s:3:"鵳";s:2:"";s:3:"鵻";s:2:"";s:3:"鶂";s:2:"";s:3:"鵯";s:2:"";s:3:"鵹";s:2:"";s:3:"鵿";s:2:"";s:3:"鶇";s:2:"";s:3:"鵨";s:2:"";s:3:"麔";s:2:"";s:3:"麑";s:2:"";s:3:"黀";s:2:"";s:3:"黼";s:2:"";s:3:"鼭";s:2:"";s:3:"齀";s:2:"";s:3:"齁";s:2:"";s:3:"齍";s:2:"";s:3:"齖";s:2:"";s:3:"齗";s:2:"";s:3:"齘";s:2:"";s:3:"匷";s:2:"";s:3:"嚲";s:2:"@";s:3:"嚵";s:2:"A";s:3:"嚳";s:2:"B";s:3:"壣";s:2:"C";s:3:"孅";s:2:"D";s:3:"巆";s:2:"E";s:3:"巇";s:2:"F";s:3:"廮";s:2:"G";s:3:"廯";s:2:"H";s:3:"忀";s:2:"I";s:3:"忁";s:2:"J";s:3:"懹";s:2:"K";s:3:"攗";s:2:"L";s:3:"攖";s:2:"M";s:3:"攕";s:2:"N";s:3:"攓";s:2:"O";s:3:"旟";s:2:"P";s:3:"曨";s:2:"Q";s:3:"曣";s:2:"R";s:3:"曤";s:2:"S";s:3:"櫳";s:2:"T";s:3:"櫰";s:2:"U";s:3:"櫪";s:2:"V";s:3:"櫨";s:2:"W";s:3:"櫹";s:2:"X";s:3:"櫱";s:2:"Y";s:3:"櫮";s:2:"Z";s:3:"櫯";s:2:"[";s:3:"瀼";s:2:"\";s:3:"瀵";s:2:"]";s:3:"瀯";s:2:"^";s:3:"瀷";s:2:"_";s:3:"瀴";s:2:"`";s:3:"瀱";s:2:"a";s:3:"灂";s:2:"b";s:3:"瀸";s:2:"c";s:3:"瀿";s:2:"d";s:3:"瀺";s:2:"e";s:3:"瀹";s:2:"f";s:3:"灀";s:2:"g";s:3:"瀻";s:2:"h";s:3:"瀳";s:2:"i";s:3:"灁";s:2:"j";s:3:"爓";s:2:"k";s:3:"爔";s:2:"l";s:3:"犨";s:2:"m";s:3:"獽";s:2:"n";s:3:"獼";s:2:"o";s:3:"璺";s:2:"p";s:3:"皫";s:2:"q";s:3:"皪";s:2:"r";s:3:"皾";s:2:"s";s:3:"盭";s:2:"t";s:3:"矌";s:2:"u";s:3:"矎";s:2:"v";s:3:"矏";s:2:"w";s:3:"矍";s:2:"x";s:3:"矲";s:2:"y";s:3:"礥";s:2:"z";s:3:"礣";s:2:"{";s:3:"礧";s:2:"|";s:3:"礨";s:2:"}";s:3:"礤";s:2:"~";s:3:"礩";s:2:"";s:3:"禲";s:2:"";s:3:"穮";s:2:"";s:3:"穬";s:2:"";s:3:"穭";s:2:"";s:3:"竷";s:2:"";s:3:"籉";s:2:"";s:3:"籈";s:2:"";s:3:"籊";s:2:"";s:3:"籇";s:2:"";s:3:"籅";s:2:"";s:3:"糮";s:2:"";s:3:"繻";s:2:"";s:3:"繾";s:2:"";s:3:"纁";s:2:"";s:3:"纀";s:2:"";s:3:"羺";s:2:"";s:3:"翿";s:2:"";s:3:"聹";s:2:"";s:3:"臛";s:2:"";s:3:"臙";s:2:"";s:3:"舋";s:2:"";s:3:"艨";s:2:"";s:3:"艩";s:2:"";s:3:"蘢";s:2:"";s:3:"藿";s:2:"";s:3:"蘁";s:2:"";s:3:"藾";s:2:"";s:3:"蘛";s:2:"";s:3:"蘀";s:2:"";s:3:"藶";s:2:"";s:3:"蘄";s:2:"";s:3:"蘉";s:2:"";s:3:"蘅";s:2:"";s:3:"蘌";s:2:"";s:3:"藽";s:2:"";s:3:"蠙";s:2:"";s:3:"蠐";s:2:"";s:3:"蠑";s:2:"";s:3:"蠗";s:2:"";s:3:"蠓";s:2:"";s:3:"蠖";s:2:"";s:3:"襣";s:2:"";s:3:"襦";s:2:"";s:3:"覹";s:2:"";s:3:"觷";s:2:"";s:3:"譠";s:2:"";s:3:"譪";s:2:"";s:3:"譝";s:2:"";s:3:"譨";s:2:"";s:3:"譣";s:2:"";s:3:"譥";s:2:"";s:3:"譧";s:2:"";s:3:"譭";s:2:"";s:3:"趮";s:2:"";s:3:"躆";s:2:"";s:3:"躈";s:2:"";s:3:"躄";s:2:"";s:3:"轙";s:2:"";s:3:"轖";s:2:"";s:3:"轗";s:2:"";s:3:"轕";s:2:"";s:3:"轘";s:2:"";s:3:"轚";s:2:"";s:3:"邍";s:2:"";s:3:"酃";s:2:"";s:3:"酁";s:2:"";s:3:"醷";s:2:"";s:3:"醵";s:2:"";s:3:"醲";s:2:"";s:3:"醳";s:2:"";s:3:"鐋";s:2:"";s:3:"鐓";s:2:"";s:3:"鏻";s:2:"";s:3:"鐠";s:2:"";s:3:"鐏";s:2:"";s:3:"鐔";s:2:"";s:3:"鏾";s:2:"";s:3:"鐕";s:2:"";s:3:"鐐";s:2:"";s:3:"鐨";s:2:"";s:3:"鐙";s:2:"";s:3:"鐍";s:2:"";s:3:"鏵";s:2:"";s:3:"鐀";s:2:"";s:3:"鏷";s:2:"";s:3:"鐇";s:2:"";s:3:"鐎";s:2:"";s:3:"鐖";s:2:"";s:3:"鐒";s:2:"";s:3:"鏺";s:2:"";s:3:"鐉";s:2:"";s:3:"鏸";s:2:"";s:3:"鐊";s:2:"";s:3:"鏿";s:2:"@";s:3:"鏼";s:2:"A";s:3:"鐌";s:2:"B";s:3:"鏶";s:2:"C";s:3:"鐑";s:2:"D";s:3:"鐆";s:2:"E";s:3:"闞";s:2:"F";s:3:"闠";s:2:"G";s:3:"闟";s:2:"H";s:3:"霮";s:2:"I";s:3:"霯";s:2:"J";s:3:"鞹";s:2:"K";s:3:"鞻";s:2:"L";s:3:"韽";s:2:"M";s:3:"韾";s:2:"N";s:3:"顠";s:2:"O";s:3:"顢";s:2:"P";s:3:"顣";s:2:"Q";s:3:"顟";s:2:"R";s:3:"飁";s:2:"S";s:3:"飂";s:2:"T";s:3:"饐";s:2:"U";s:3:"饎";s:2:"V";s:3:"饙";s:2:"W";s:3:"饌";s:2:"X";s:3:"饋";s:2:"Y";s:3:"饓";s:2:"Z";s:3:"騲";s:2:"[";s:3:"騴";s:2:"\";s:3:"騱";s:2:"]";s:3:"騬";s:2:"^";s:3:"騪";s:2:"_";s:3:"騶";s:2:"`";s:3:"騩";s:2:"a";s:3:"騮";s:2:"b";s:3:"騸";s:2:"c";s:3:"騭";s:2:"d";s:3:"髇";s:2:"e";s:3:"髊";s:2:"f";s:3:"髆";s:2:"g";s:3:"鬐";s:2:"h";s:3:"鬒";s:2:"i";s:3:"鬑";s:2:"j";s:3:"鰋";s:2:"k";s:3:"鰈";s:2:"l";s:3:"鯷";s:2:"m";s:3:"鰅";s:2:"n";s:3:"鰒";s:2:"o";s:3:"鯸";s:2:"p";s:3:"鱀";s:2:"q";s:3:"鰇";s:2:"r";s:3:"鰎";s:2:"s";s:3:"鰆";s:2:"t";s:3:"鰗";s:2:"u";s:3:"鰔";s:2:"v";s:3:"鰉";s:2:"w";s:3:"鶟";s:2:"x";s:3:"鶙";s:2:"y";s:3:"鶤";s:2:"z";s:3:"鶝";s:2:"{";s:3:"鶒";s:2:"|";s:3:"鶘";s:2:"}";s:3:"鶐";s:2:"~";s:3:"鶛";s:2:"";s:3:"鶠";s:2:"";s:3:"鶔";s:2:"";s:3:"鶜";s:2:"";s:3:"鶪";s:2:"";s:3:"鶗";s:2:"";s:3:"鶡";s:2:"";s:3:"鶚";s:2:"";s:3:"鶢";s:2:"";s:3:"鶨";s:2:"";s:3:"鶞";s:2:"";s:3:"鶣";s:2:"";s:3:"鶿";s:2:"";s:3:"鶩";s:2:"";s:3:"鶖";s:2:"";s:3:"鶦";s:2:"";s:3:"鶧";s:2:"";s:3:"麙";s:2:"";s:3:"麛";s:2:"";s:3:"麚";s:2:"";s:3:"黥";s:2:"";s:3:"黤";s:2:"";s:3:"黧";s:2:"";s:3:"黦";s:2:"";s:3:"鼰";s:2:"";s:3:"鼮";s:2:"";s:3:"齛";s:2:"";s:3:"齠";s:2:"";s:3:"齞";s:2:"";s:3:"齝";s:2:"";s:3:"齙";s:2:"";s:3:"龑";s:2:"";s:3:"儺";s:2:"";s:3:"儹";s:2:"";s:3:"劘";s:2:"";s:3:"劗";s:2:"";s:3:"囃";s:2:"";s:3:"嚽";s:2:"";s:3:"嚾";s:2:"";s:3:"孈";s:2:"";s:3:"孇";s:2:"";s:3:"巋";s:2:"";s:3:"巏";s:2:"";s:3:"廱";s:2:"";s:3:"懽";s:2:"";s:3:"攛";s:2:"";s:3:"欂";s:2:"";s:3:"櫼";s:2:"";s:3:"欃";s:2:"";s:3:"櫸";s:2:"";s:3:"欀";s:2:"";s:3:"灃";s:2:"";s:3:"灄";s:2:"";s:3:"灊";s:2:"";s:3:"灈";s:2:"";s:3:"灉";s:2:"";s:3:"灅";s:2:"";s:3:"灆";s:2:"";s:3:"爝";s:2:"";s:3:"爚";s:2:"";s:3:"爙";s:2:"";s:3:"獾";s:2:"";s:3:"甗";s:2:"";s:3:"癪";s:2:"";s:3:"矐";s:2:"";s:3:"礭";s:2:"";s:3:"礱";s:2:"";s:3:"礯";s:2:"";s:3:"籔";s:2:"";s:3:"籓";s:2:"";s:3:"糲";s:2:"";s:3:"纊";s:2:"";s:3:"纇";s:2:"";s:3:"纈";s:2:"";s:3:"纋";s:2:"";s:3:"纆";s:2:"";s:3:"纍";s:2:"";s:3:"罍";s:2:"";s:3:"羻";s:2:"";s:3:"耰";s:2:"";s:3:"臝";s:2:"";s:3:"蘘";s:2:"";s:3:"蘪";s:2:"";s:3:"蘦";s:2:"";s:3:"蘟";s:2:"";s:3:"蘣";s:2:"";s:3:"蘜";s:2:"";s:3:"蘙";s:2:"";s:3:"蘧";s:2:"";s:3:"蘮";s:2:"";s:3:"蘡";s:2:"";s:3:"蘠";s:2:"";s:3:"蘩";s:2:"";s:3:"蘞";s:2:"";s:3:"蘥";s:2:"@";s:3:"蠩";s:2:"A";s:3:"蠝";s:2:"B";s:3:"蠛";s:2:"C";s:3:"蠠";s:2:"D";s:3:"蠤";s:2:"E";s:3:"蠜";s:2:"F";s:3:"蠫";s:2:"G";s:3:"衊";s:2:"H";s:3:"襭";s:2:"I";s:3:"襩";s:2:"J";s:3:"襮";s:2:"K";s:3:"襫";s:2:"L";s:3:"觺";s:2:"M";s:3:"譹";s:2:"N";s:3:"譸";s:2:"O";s:3:"譅";s:2:"P";s:3:"譺";s:2:"Q";s:3:"譻";s:2:"R";s:3:"贐";s:2:"S";s:3:"贔";s:2:"T";s:3:"趯";s:2:"U";s:3:"躎";s:2:"V";s:3:"躌";s:2:"W";s:3:"轞";s:2:"X";s:3:"轛";s:2:"Y";s:3:"轝";s:2:"Z";s:3:"酆";s:2:"[";s:3:"酄";s:2:"\";s:3:"酅";s:2:"]";s:3:"醹";s:2:"^";s:3:"鐿";s:2:"_";s:3:"鐻";s:2:"`";s:3:"鐶";s:2:"a";s:3:"鐩";s:2:"b";s:3:"鐽";s:2:"c";s:3:"鐼";s:2:"d";s:3:"鐰";s:2:"e";s:3:"鐹";s:2:"f";s:3:"鐪";s:2:"g";s:3:"鐷";s:2:"h";s:3:"鐬";s:2:"i";s:3:"鑀";s:2:"j";s:3:"鐱";s:2:"k";s:3:"闥";s:2:"l";s:3:"闤";s:2:"m";s:3:"闣";s:2:"n";s:3:"霵";s:2:"o";s:3:"霺";s:2:"p";s:3:"鞿";s:2:"q";s:3:"韡";s:2:"r";s:3:"顤";s:2:"s";s:3:"飉";s:2:"t";s:3:"飆";s:2:"u";s:3:"飀";s:2:"v";s:3:"饘";s:2:"w";s:3:"饖";s:2:"x";s:3:"騹";s:2:"y";s:3:"騽";s:2:"z";s:3:"驆";s:2:"{";s:3:"驄";s:2:"|";s:3:"驂";s:2:"}";s:3:"驁";s:2:"~";s:3:"騺";s:2:"";s:3:"騿";s:2:"";s:3:"髍";s:2:"";s:3:"鬕";s:2:"";s:3:"鬗";s:2:"";s:3:"鬘";s:2:"";s:3:"鬖";s:2:"";s:3:"鬺";s:2:"";s:3:"魒";s:2:"";s:3:"鰫";s:2:"";s:3:"鰝";s:2:"";s:3:"鰜";s:2:"";s:3:"鰬";s:2:"";s:3:"鰣";s:2:"";s:3:"鰨";s:2:"";s:3:"鰩";s:2:"";s:3:"鰤";s:2:"";s:3:"鰡";s:2:"";s:3:"鶷";s:2:"";s:3:"鶶";s:2:"";s:3:"鶼";s:2:"";s:3:"鷁";s:2:"";s:3:"鷇";s:2:"";s:3:"鷊";s:2:"";s:3:"鷏";s:2:"";s:3:"鶾";s:2:"";s:3:"鷅";s:2:"";s:3:"鷃";s:2:"";s:3:"鶻";s:2:"";s:3:"鶵";s:2:"";s:3:"鷎";s:2:"";s:3:"鶹";s:2:"";s:3:"鶺";s:2:"";s:3:"鶬";s:2:"";s:3:"鷈";s:2:"";s:3:"鶱";s:2:"";s:3:"鶭";s:2:"";s:3:"鷌";s:2:"";s:3:"鶳";s:2:"";s:3:"鷍";s:2:"";s:3:"鶲";s:2:"";s:3:"鹺";s:2:"";s:3:"麜";s:2:"";s:3:"黫";s:2:"";s:3:"黮";s:2:"";s:3:"黭";s:2:"";s:3:"鼛";s:2:"";s:3:"鼘";s:2:"";s:3:"鼚";s:2:"";s:3:"鼱";s:2:"";s:3:"齎";s:2:"";s:3:"齥";s:2:"";s:3:"齤";s:2:"";s:3:"龒";s:2:"";s:3:"亹";s:2:"";s:3:"囆";s:2:"";s:3:"囅";s:2:"";s:3:"囋";s:2:"";s:3:"奱";s:2:"";s:3:"孋";s:2:"";s:3:"孌";s:2:"";s:3:"巕";s:2:"";s:3:"巑";s:2:"";s:3:"廲";s:2:"";s:3:"攡";s:2:"";s:3:"攠";s:2:"";s:3:"攦";s:2:"";s:3:"攢";s:2:"";s:3:"欋";s:2:"";s:3:"欈";s:2:"";s:3:"欉";s:2:"";s:3:"氍";s:2:"";s:3:"灕";s:2:"";s:3:"灖";s:2:"";s:3:"灗";s:2:"";s:3:"灒";s:2:"";s:3:"爞";s:2:"";s:3:"爟";s:2:"";s:3:"犩";s:2:"";s:3:"獿";s:2:"";s:3:"瓘";s:2:"";s:3:"瓕";s:2:"";s:3:"瓙";s:2:"";s:3:"瓗";s:2:"";s:3:"癭";s:2:"";s:3:"皭";s:2:"";s:3:"礵";s:2:"";s:3:"禴";s:2:"";s:3:"穰";s:2:"";s:3:"穱";s:2:"";s:3:"籗";s:2:"";s:3:"籜";s:2:"";s:3:"籙";s:2:"";s:3:"籛";s:2:"";s:3:"籚";s:2:"@";s:3:"糴";s:2:"A";s:3:"糱";s:2:"B";s:3:"纑";s:2:"C";s:3:"罏";s:2:"D";s:3:"羇";s:2:"E";s:3:"臞";s:2:"F";s:3:"艫";s:2:"G";s:3:"蘴";s:2:"H";s:3:"蘵";s:2:"I";s:3:"蘳";s:2:"J";s:3:"蘬";s:2:"K";s:3:"蘲";s:2:"L";s:3:"蘶";s:2:"M";s:3:"蠬";s:2:"N";s:3:"蠨";s:2:"O";s:3:"蠦";s:2:"P";s:3:"蠪";s:2:"Q";s:3:"蠥";s:2:"R";s:3:"襱";s:2:"S";s:3:"覿";s:2:"T";s:3:"覾";s:2:"U";s:3:"觻";s:2:"V";s:3:"譾";s:2:"W";s:3:"讄";s:2:"X";s:3:"讂";s:2:"Y";s:3:"讆";s:2:"Z";s:3:"讅";s:2:"[";s:3:"譿";s:2:"\";s:3:"贕";s:2:"]";s:3:"躕";s:2:"^";s:3:"躔";s:2:"_";s:3:"躚";s:2:"`";s:3:"躒";s:2:"a";s:3:"躐";s:2:"b";s:3:"躖";s:2:"c";s:3:"躗";s:2:"d";s:3:"轠";s:2:"e";s:3:"轢";s:2:"f";s:3:"酇";s:2:"g";s:3:"鑌";s:2:"h";s:3:"鑐";s:2:"i";s:3:"鑊";s:2:"j";s:3:"鑋";s:2:"k";s:3:"鑏";s:2:"l";s:3:"鑇";s:2:"m";s:3:"鑅";s:2:"n";s:3:"鑈";s:2:"o";s:3:"鑉";s:2:"p";s:3:"鑆";s:2:"q";s:3:"霿";s:2:"r";s:3:"韣";s:2:"s";s:3:"顪";s:2:"t";s:3:"顩";s:2:"u";s:3:"飋";s:2:"v";s:3:"饔";s:2:"w";s:3:"饛";s:2:"x";s:3:"驎";s:2:"y";s:3:"驓";s:2:"z";s:3:"驔";s:2:"{";s:3:"驌";s:2:"|";s:3:"驏";s:2:"}";s:3:"驈";s:2:"~";s:3:"驊";s:2:"";s:3:"驉";s:2:"";s:3:"驒";s:2:"";s:3:"驐";s:2:"";s:3:"髐";s:2:"";s:3:"鬙";s:2:"";s:3:"鬫";s:2:"";s:3:"鬻";s:2:"";s:3:"魖";s:2:"";s:3:"魕";s:2:"";s:3:"鱆";s:2:"";s:3:"鱈";s:2:"";s:3:"鰿";s:2:"";s:3:"鱄";s:2:"";s:3:"鰹";s:2:"";s:3:"鰳";s:2:"";s:3:"鱁";s:2:"";s:3:"鰼";s:2:"";s:3:"鰷";s:2:"";s:3:"鰴";s:2:"";s:3:"鰲";s:2:"";s:3:"鰽";s:2:"";s:3:"鰶";s:2:"";s:3:"鷛";s:2:"";s:3:"鷒";s:2:"";s:3:"鷞";s:2:"";s:3:"鷚";s:2:"";s:3:"鷋";s:2:"";s:3:"鷐";s:2:"";s:3:"鷜";s:2:"";s:3:"鷑";s:2:"";s:3:"鷟";s:2:"";s:3:"鷩";s:2:"";s:3:"鷙";s:2:"";s:3:"鷘";s:2:"";s:3:"鷖";s:2:"";s:3:"鷵";s:2:"";s:3:"鷕";s:2:"";s:3:"鷝";s:2:"";s:3:"麶";s:2:"";s:3:"黰";s:2:"";s:3:"鼵";s:2:"";s:3:"鼳";s:2:"";s:3:"鼲";s:2:"";s:3:"齂";s:2:"";s:3:"齫";s:2:"";s:3:"龕";s:2:"";s:3:"龢";s:2:"";s:3:"儽";s:2:"";s:3:"劙";s:2:"";s:3:"壨";s:2:"";s:3:"壧";s:2:"";s:3:"奲";s:2:"";s:3:"孍";s:2:"";s:3:"巘";s:2:"";s:3:"蠯";s:2:"";s:3:"彏";s:2:"";s:3:"戁";s:2:"";s:3:"戃";s:2:"";s:3:"戄";s:2:"";s:3:"攩";s:2:"";s:3:"攥";s:2:"";s:3:"斖";s:2:"";s:3:"曫";s:2:"";s:3:"欑";s:2:"";s:3:"欒";s:2:"";s:3:"欏";s:2:"";s:3:"毊";s:2:"";s:3:"灛";s:2:"";s:3:"灚";s:2:"";s:3:"爢";s:2:"";s:3:"玂";s:2:"";s:3:"玁";s:2:"";s:3:"玃";s:2:"";s:3:"癰";s:2:"";s:3:"矔";s:2:"";s:3:"籧";s:2:"";s:3:"籦";s:2:"";s:3:"纕";s:2:"";s:3:"艬";s:2:"";s:3:"蘺";s:2:"";s:3:"虀";s:2:"";s:3:"蘹";s:2:"";s:3:"蘼";s:2:"";s:3:"蘱";s:2:"";s:3:"蘻";s:2:"";s:3:"蘾";s:2:"";s:3:"蠰";s:2:"";s:3:"蠲";s:2:"";s:3:"蠮";s:2:"";s:3:"蠳";s:2:"";s:3:"襶";s:2:"";s:3:"襴";s:2:"";s:3:"襳";s:2:"";s:3:"觾";s:2:"@";s:3:"讌";s:2:"A";s:3:"讎";s:2:"B";s:3:"讋";s:2:"C";s:3:"讈";s:2:"D";s:3:"豅";s:2:"E";s:3:"贙";s:2:"F";s:3:"躘";s:2:"G";s:3:"轤";s:2:"H";s:3:"轣";s:2:"I";s:3:"醼";s:2:"J";s:3:"鑢";s:2:"K";s:3:"鑕";s:2:"L";s:3:"鑝";s:2:"M";s:3:"鑗";s:2:"N";s:3:"鑞";s:2:"O";s:3:"韄";s:2:"P";s:3:"韅";s:2:"Q";s:3:"頀";s:2:"R";s:3:"驖";s:2:"S";s:3:"驙";s:2:"T";s:3:"鬞";s:2:"U";s:3:"鬟";s:2:"V";s:3:"鬠";s:2:"W";s:3:"鱒";s:2:"X";s:3:"鱘";s:2:"Y";s:3:"鱐";s:2:"Z";s:3:"鱊";s:2:"[";s:3:"鱍";s:2:"\";s:3:"鱋";s:2:"]";s:3:"鱕";s:2:"^";s:3:"鱙";s:2:"_";s:3:"鱌";s:2:"`";s:3:"鱎";s:2:"a";s:3:"鷻";s:2:"b";s:3:"鷷";s:2:"c";s:3:"鷯";s:2:"d";s:3:"鷣";s:2:"e";s:3:"鷫";s:2:"f";s:3:"鷸";s:2:"g";s:3:"鷤";s:2:"h";s:3:"鷶";s:2:"i";s:3:"鷡";s:2:"j";s:3:"鷮";s:2:"k";s:3:"鷦";s:2:"l";s:3:"鷲";s:2:"m";s:3:"鷰";s:2:"n";s:3:"鷢";s:2:"o";s:3:"鷬";s:2:"p";s:3:"鷴";s:2:"q";s:3:"鷳";s:2:"r";s:3:"鷨";s:2:"s";s:3:"鷭";s:2:"t";s:3:"黂";s:2:"u";s:3:"黐";s:2:"v";s:3:"黲";s:2:"w";s:3:"黳";s:2:"x";s:3:"鼆";s:2:"y";s:3:"鼜";s:2:"z";s:3:"鼸";s:2:"{";s:3:"鼷";s:2:"|";s:3:"鼶";s:2:"}";s:3:"齃";s:2:"~";s:3:"齏";s:2:"";s:3:"齱";s:2:"";s:3:"齰";s:2:"";s:3:"齮";s:2:"";s:3:"齯";s:2:"";s:3:"囓";s:2:"";s:3:"囍";s:2:"";s:3:"孎";s:2:"";s:3:"屭";s:2:"";s:3:"攭";s:2:"";s:3:"曭";s:2:"";s:3:"曮";s:2:"";s:3:"欓";s:2:"";s:3:"灟";s:2:"";s:3:"灡";s:2:"";s:3:"灝";s:2:"";s:3:"灠";s:2:"";s:3:"爣";s:2:"";s:3:"瓛";s:2:"";s:3:"瓥";s:2:"";s:3:"矕";s:2:"";s:3:"礸";s:2:"";s:3:"禷";s:2:"";s:3:"禶";s:2:"";s:3:"籪";s:2:"";s:3:"纗";s:2:"";s:3:"羉";s:2:"";s:3:"艭";s:2:"";s:3:"虃";s:2:"";s:3:"蠸";s:2:"";s:3:"蠷";s:2:"";s:3:"蠵";s:2:"";s:3:"衋";s:2:"";s:3:"讔";s:2:"";s:3:"讕";s:2:"";s:3:"躞";s:2:"";s:3:"躟";s:2:"";s:3:"躠";s:2:"";s:3:"躝";s:2:"";s:3:"醾";s:2:"";s:3:"醽";s:2:"";s:3:"釂";s:2:"";s:3:"鑫";s:2:"";s:3:"鑨";s:2:"";s:3:"鑩";s:2:"";s:3:"雥";s:2:"";s:3:"靆";s:2:"";s:3:"靃";s:2:"";s:3:"靇";s:2:"";s:3:"韇";s:2:"";s:3:"韥";s:2:"";s:3:"驞";s:2:"";s:3:"髕";s:2:"";s:3:"魙";s:2:"";s:3:"鱣";s:2:"";s:3:"鱧";s:2:"";s:3:"鱦";s:2:"";s:3:"鱢";s:2:"";s:3:"鱞";s:2:"";s:3:"鱠";s:2:"";s:3:"鸂";s:2:"";s:3:"鷾";s:2:"";s:3:"鸇";s:2:"";s:3:"鸃";s:2:"";s:3:"鸆";s:2:"";s:3:"鸅";s:2:"";s:3:"鸀";s:2:"";s:3:"鸁";s:2:"";s:3:"鸉";s:2:"";s:3:"鷿";s:2:"";s:3:"鷽";s:2:"";s:3:"鸄";s:2:"";s:3:"麠";s:2:"";s:3:"鼞";s:2:"";s:3:"齆";s:2:"";s:3:"齴";s:2:"";s:3:"齵";s:2:"";s:3:"齶";s:2:"";s:3:"囔";s:2:"";s:3:"攮";s:2:"";s:3:"斸";s:2:"";s:3:"欘";s:2:"";s:3:"欙";s:2:"";s:3:"欗";s:2:"";s:3:"欚";s:2:"";s:3:"灢";s:2:"";s:3:"爦";s:2:"";s:3:"犪";s:2:"";s:3:"矘";s:2:"";s:3:"矙";s:2:"";s:3:"礹";s:2:"";s:3:"籩";s:2:"";s:3:"籫";s:2:"";s:3:"糶";s:2:"";s:3:"纚";s:2:"@";s:3:"纘";s:2:"A";s:3:"纛";s:2:"B";s:3:"纙";s:2:"C";s:3:"臠";s:2:"D";s:3:"臡";s:2:"E";s:3:"虆";s:2:"F";s:3:"虇";s:2:"G";s:3:"虈";s:2:"H";s:3:"襹";s:2:"I";s:3:"襺";s:2:"J";s:3:"襼";s:2:"K";s:3:"襻";s:2:"L";s:3:"觿";s:2:"M";s:3:"讘";s:2:"N";s:3:"讙";s:2:"O";s:3:"躥";s:2:"P";s:3:"躤";s:2:"Q";s:3:"躣";s:2:"R";s:3:"鑮";s:2:"S";s:3:"鑭";s:2:"T";s:3:"鑯";s:2:"U";s:3:"鑱";s:2:"V";s:3:"鑳";s:2:"W";s:3:"靉";s:2:"X";s:3:"顲";s:2:"Y";s:3:"饟";s:2:"Z";s:3:"鱨";s:2:"[";s:3:"鱮";s:2:"\";s:3:"鱭";s:2:"]";s:3:"鸋";s:2:"^";s:3:"鸍";s:2:"_";s:3:"鸐";s:2:"`";s:3:"鸏";s:2:"a";s:3:"鸒";s:2:"b";s:3:"鸑";s:2:"c";s:3:"麡";s:2:"d";s:3:"黵";s:2:"e";s:3:"鼉";s:2:"f";s:3:"齇";s:2:"g";s:3:"齸";s:2:"h";s:3:"齻";s:2:"i";s:3:"齺";s:2:"j";s:3:"齹";s:2:"k";s:3:"圞";s:2:"l";s:3:"灦";s:2:"m";s:3:"籯";s:2:"n";s:3:"蠼";s:2:"o";s:3:"趲";s:2:"p";s:3:"躦";s:2:"q";s:3:"釃";s:2:"r";s:3:"鑴";s:2:"s";s:3:"鑸";s:2:"t";s:3:"鑶";s:2:"u";s:3:"鑵";s:2:"v";s:3:"驠";s:2:"w";s:3:"鱴";s:2:"x";s:3:"鱳";s:2:"y";s:3:"鱱";s:2:"z";s:3:"鱵";s:2:"{";s:3:"鸔";s:2:"|";s:3:"鸓";s:2:"}";s:3:"黶";s:2:"~";s:3:"鼊";s:2:"";s:3:"龤";s:2:"";s:3:"灨";s:2:"";s:3:"灥";s:2:"";s:3:"糷";s:2:"";s:3:"虪";s:2:"";s:3:"蠾";s:2:"";s:3:"蠽";s:2:"";s:3:"蠿";s:2:"";s:3:"讞";s:2:"";s:3:"貜";s:2:"";s:3:"躩";s:2:"";s:3:"軉";s:2:"";s:3:"靋";s:2:"";s:3:"顳";s:2:"";s:3:"顴";s:2:"";s:3:"飌";s:2:"";s:3:"饡";s:2:"";s:3:"馫";s:2:"";s:3:"驤";s:2:"";s:3:"驦";s:2:"";s:3:"驧";s:2:"";s:3:"鬤";s:2:"";s:3:"鸕";s:2:"";s:3:"鸗";s:2:"";s:3:"齈";s:2:"";s:3:"戇";s:2:"";s:3:"欞";s:2:"";s:3:"爧";s:2:"";s:3:"虌";s:2:"";s:3:"躨";s:2:"";s:3:"钂";s:2:"";s:3:"钀";s:2:"";s:3:"钁";s:2:"";s:3:"驩";s:2:"";s:3:"驨";s:2:"";s:3:"鬮";s:2:"";s:3:"鸙";s:2:"";s:3:"爩";s:2:"";s:3:"虋";s:2:"";s:3:"讟";s:2:"";s:3:"钃";s:2:"";s:3:"鱹";s:2:"";s:3:"麷";s:2:"";s:3:"癵";s:2:"";s:3:"驫";s:2:"";s:3:"鱺";s:2:"";s:3:"鸝";s:2:"";s:3:"灩";s:2:"";s:3:"灪";s:2:"";s:3:"麤";s:2:"";s:3:"齾";s:2:"";s:3:"齉";s:2:"";s:3:"龘";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp037.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:1:"	";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"	";s:2:"";s:1:"
+";s:2:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:2:"";s:1:"!";s:2:"";s:1:""";s:2:"";s:1:"#";s:2:"";s:1:"$";s:2:"";s:1:"%";s:1:"
+";s:1:"&";s:1:"";s:1:"'";s:1:"";s:1:"(";s:2:"";s:1:")";s:2:"";s:1:"*";s:2:"";s:1:"+";s:2:"";s:1:",";s:2:"";s:1:"-";s:1:"";s:1:".";s:1:"";s:1:"/";s:1:"";i:0;s:2:"";i:1;s:2:"";i:2;s:1:"";i:3;s:2:"";i:4;s:2:"";i:5;s:2:"";i:6;s:2:"";i:7;s:1:"";i:8;s:2:"";i:9;s:2:"";s:1:":";s:2:"";s:1:";";s:2:"";s:1:"<";s:1:"";s:1:"=";s:1:"";s:1:">";s:2:"";s:1:"?";s:1:"";s:1:"@";s:1:" ";s:1:"A";s:2:" ";s:1:"B";s:2:"â";s:1:"C";s:2:"ä";s:1:"D";s:2:"à";s:1:"E";s:2:"á";s:1:"F";s:2:"ã";s:1:"G";s:2:"å";s:1:"H";s:2:"ç";s:1:"I";s:2:"ñ";s:1:"J";s:2:"¢";s:1:"K";s:1:".";s:1:"L";s:1:"<";s:1:"M";s:1:"(";s:1:"N";s:1:"+";s:1:"O";s:1:"|";s:1:"P";s:1:"&";s:1:"Q";s:2:"é";s:1:"R";s:2:"ê";s:1:"S";s:2:"ë";s:1:"T";s:2:"è";s:1:"U";s:2:"í";s:1:"V";s:2:"î";s:1:"W";s:2:"ï";s:1:"X";s:2:"ì";s:1:"Y";s:2:"ß";s:1:"Z";s:1:"!";s:1:"[";s:1:"$";s:1:"\";s:1:"*";s:1:"]";s:1:")";s:1:"^";s:1:";";s:1:"_";s:2:"¬";s:1:"`";s:1:"-";s:1:"a";s:1:"/";s:1:"b";s:2:"Â";s:1:"c";s:2:"Ä";s:1:"d";s:2:"À";s:1:"e";s:2:"Á";s:1:"f";s:2:"Ã";s:1:"g";s:2:"Å";s:1:"h";s:2:"Ç";s:1:"i";s:2:"Ñ";s:1:"j";s:2:"¦";s:1:"k";s:1:",";s:1:"l";s:1:"%";s:1:"m";s:1:"_";s:1:"n";s:1:">";s:1:"o";s:1:"?";s:1:"p";s:2:"ø";s:1:"q";s:2:"É";s:1:"r";s:2:"Ê";s:1:"s";s:2:"Ë";s:1:"t";s:2:"È";s:1:"u";s:2:"Í";s:1:"v";s:2:"Î";s:1:"w";s:2:"Ï";s:1:"x";s:2:"Ì";s:1:"y";s:1:"`";s:1:"z";s:1:":";s:1:"{";s:1:"#";s:1:"|";s:1:"@";s:1:"}";s:1:"'";s:1:"~";s:1:"=";s:1:"";s:1:""";s:1:"";s:2:"Ø";s:1:"";s:1:"a";s:1:"";s:1:"b";s:1:"";s:1:"c";s:1:"";s:1:"d";s:1:"";s:1:"e";s:1:"";s:1:"f";s:1:"";s:1:"g";s:1:"";s:1:"h";s:1:"";s:1:"i";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:2:"ð";s:1:"";s:2:"ý";s:1:"";s:2:"þ";s:1:"";s:2:"±";s:1:"";s:2:"°";s:1:"";s:1:"j";s:1:"";s:1:"k";s:1:"";s:1:"l";s:1:"";s:1:"m";s:1:"";s:1:"n";s:1:"";s:1:"o";s:1:"";s:1:"p";s:1:"";s:1:"q";s:1:"";s:1:"r";s:1:"";s:2:"ª";s:1:"";s:2:"º";s:1:"";s:2:"æ";s:1:"";s:2:"¸";s:1:"";s:2:"Æ";s:1:"";s:2:"¤";s:1:"";s:2:"µ";s:1:"";s:1:"~";s:1:"";s:1:"s";s:1:"";s:1:"t";s:1:"";s:1:"u";s:1:"";s:1:"v";s:1:"";s:1:"w";s:1:"";s:1:"x";s:1:"";s:1:"y";s:1:"";s:1:"z";s:1:"";s:2:"¡";s:1:"";s:2:"¿";s:1:"";s:2:"Ð";s:1:"";s:2:"Ý";s:1:"";s:2:"Þ";s:1:"";s:2:"®";s:1:"";s:1:"^";s:1:"";s:2:"£";s:1:"";s:2:"¥";s:1:"";s:2:"·";s:1:"";s:2:"©";s:1:"";s:2:"§";s:1:"";s:2:"¶";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:1:"[";s:1:"";s:1:"]";s:1:"";s:2:"¯";s:1:"";s:2:"¨";s:1:"";s:2:"´";s:1:"";s:2:"×";s:1:"";s:1:"{";s:1:"";s:1:"A";s:1:"";s:1:"B";s:1:"";s:1:"C";s:1:"";s:1:"D";s:1:"";s:1:"E";s:1:"";s:1:"F";s:1:"";s:1:"G";s:1:"";s:1:"H";s:1:"";s:1:"I";s:1:"";s:2:"­";s:1:"";s:2:"ô";s:1:"";s:2:"ö";s:1:"";s:2:"ò";s:1:"";s:2:"ó";s:1:"";s:2:"õ";s:1:"";s:1:"}";s:1:"";s:1:"J";s:1:"";s:1:"K";s:1:"";s:1:"L";s:1:"";s:1:"M";s:1:"";s:1:"N";s:1:"";s:1:"O";s:1:"";s:1:"P";s:1:"";s:1:"Q";s:1:"";s:1:"R";s:1:"";s:2:"¹";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"ù";s:1:"";s:2:"ú";s:1:"";s:2:"ÿ";s:1:"";s:1:"\";s:1:"";s:2:"÷";s:1:"";s:1:"S";s:1:"";s:1:"T";s:1:"";s:1:"U";s:1:"";s:1:"V";s:1:"";s:1:"W";s:1:"";s:1:"X";s:1:"";s:1:"Y";s:1:"";s:1:"Z";s:1:"";s:2:"²";s:1:"";s:2:"Ô";s:1:"";s:2:"Ö";s:1:"";s:2:"Ò";s:1:"";s:2:"Ó";s:1:"";s:2:"Õ";s:1:"";s:1:"0";s:1:"";s:1:"1";s:1:"";s:1:"2";s:1:"";s:1:"3";s:1:"";s:1:"4";s:1:"";s:1:"5";s:1:"";s:1:"6";s:1:"";s:1:"7";s:1:"";s:1:"8";s:1:"";s:1:"9";s:1:"";s:2:"³";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"Ù";s:1:"";s:2:"Ú";s:1:"";s:2:"";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp1006.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"۰";s:1:"";s:2:"۱";s:1:"";s:2:"۲";s:1:"";s:2:"۳";s:1:"";s:2:"۴";s:1:"";s:2:"۵";s:1:"";s:2:"۶";s:1:"";s:2:"۷";s:1:"";s:2:"۸";s:1:"";s:2:"۹";s:1:"";s:2:"،";s:1:"";s:2:"؛";s:1:"";s:2:"­";s:1:"";s:2:"؟";s:1:"";s:3:"ﺁ";s:1:"";s:3:"ﺍ";s:1:"";s:3:"ﺎ";s:1:"";s:3:"ﺎ";s:1:"";s:3:"ﺏ";s:1:"";s:3:"ﺑ";s:1:"";s:3:"ﭖ";s:1:"";s:3:"ﭘ";s:1:"";s:3:"ﺓ";s:1:"";s:3:"ﺕ";s:1:"";s:3:"ﺗ";s:1:"";s:3:"ﭦ";s:1:"";s:3:"ﭨ";s:1:"";s:3:"ﺙ";s:1:"";s:3:"ﺛ";s:1:"";s:3:"ﺝ";s:1:"";s:3:"ﺟ";s:1:"";s:3:"ﭺ";s:1:"";s:3:"ﭼ";s:1:"";s:3:"ﺡ";s:1:"";s:3:"ﺣ";s:1:"";s:3:"ﺥ";s:1:"";s:3:"ﺧ";s:1:"";s:3:"ﺩ";s:1:"";s:3:"ﮄ";s:1:"";s:3:"ﺫ";s:1:"";s:3:"ﺭ";s:1:"";s:3:"ﮌ";s:1:"";s:3:"ﺯ";s:1:"";s:3:"ﮊ";s:1:"";s:3:"ﺱ";s:1:"";s:3:"ﺳ";s:1:"";s:3:"ﺵ";s:1:"";s:3:"ﺷ";s:1:"";s:3:"ﺹ";s:1:"";s:3:"ﺻ";s:1:"";s:3:"ﺽ";s:1:"";s:3:"ﺿ";s:1:"";s:3:"ﻁ";s:1:"";s:3:"ﻅ";s:1:"";s:3:"ﻉ";s:1:"";s:3:"ﻊ";s:1:"";s:3:"ﻋ";s:1:"";s:3:"ﻌ";s:1:"";s:3:"ﻍ";s:1:"";s:3:"ﻎ";s:1:"";s:3:"ﻏ";s:1:"";s:3:"ﻐ";s:1:"";s:3:"ﻑ";s:1:"";s:3:"ﻓ";s:1:"";s:3:"ﻕ";s:1:"";s:3:"ﻗ";s:1:"";s:3:"ﻙ";s:1:"";s:3:"ﻛ";s:1:"";s:3:"ﮒ";s:1:"";s:3:"ﮔ";s:1:"";s:3:"ﻝ";s:1:"";s:3:"ﻟ";s:1:"";s:3:"ﻠ";s:1:"";s:3:"ﻡ";s:1:"";s:3:"ﻣ";s:1:"";s:3:"ﮞ";s:1:"";s:3:"ﻥ";s:1:"";s:3:"ﻧ";s:1:"";s:3:"ﺅ";s:1:"";s:3:"ﻭ";s:1:"";s:3:"ﮦ";s:1:"";s:3:"ﮨ";s:1:"";s:3:"ﮩ";s:1:"";s:3:"ﮪ";s:1:"";s:3:"ﺀ";s:1:"";s:3:"ﺉ";s:1:"";s:3:"ﺊ";s:1:"";s:3:"ﺋ";s:1:"";s:3:"ﻱ";s:1:"";s:3:"ﻲ";s:1:"";s:3:"ﻳ";s:1:"";s:3:"ﮰ";s:1:"";s:3:"ﮮ";s:1:"";s:3:"ﹼ";s:1:"";s:3:"ﹽ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp1026.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:1:"	";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"	";s:2:"";s:1:"
+";s:2:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:2:"";s:1:"!";s:2:"";s:1:""";s:2:"";s:1:"#";s:2:"";s:1:"$";s:2:"";s:1:"%";s:1:"
+";s:1:"&";s:1:"";s:1:"'";s:1:"";s:1:"(";s:2:"";s:1:")";s:2:"";s:1:"*";s:2:"";s:1:"+";s:2:"";s:1:",";s:2:"";s:1:"-";s:1:"";s:1:".";s:1:"";s:1:"/";s:1:"";i:0;s:2:"";i:1;s:2:"";i:2;s:1:"";i:3;s:2:"";i:4;s:2:"";i:5;s:2:"";i:6;s:2:"";i:7;s:1:"";i:8;s:2:"";i:9;s:2:"";s:1:":";s:2:"";s:1:";";s:2:"";s:1:"<";s:1:"";s:1:"=";s:1:"";s:1:">";s:2:"";s:1:"?";s:1:"";s:1:"@";s:1:" ";s:1:"A";s:2:" ";s:1:"B";s:2:"â";s:1:"C";s:2:"ä";s:1:"D";s:2:"à";s:1:"E";s:2:"á";s:1:"F";s:2:"ã";s:1:"G";s:2:"å";s:1:"H";s:1:"{";s:1:"I";s:2:"ñ";s:1:"J";s:2:"Ç";s:1:"K";s:1:".";s:1:"L";s:1:"<";s:1:"M";s:1:"(";s:1:"N";s:1:"+";s:1:"O";s:1:"!";s:1:"P";s:1:"&";s:1:"Q";s:2:"é";s:1:"R";s:2:"ê";s:1:"S";s:2:"ë";s:1:"T";s:2:"è";s:1:"U";s:2:"í";s:1:"V";s:2:"î";s:1:"W";s:2:"ï";s:1:"X";s:2:"ì";s:1:"Y";s:2:"ß";s:1:"Z";s:2:"Ğ";s:1:"[";s:2:"İ";s:1:"\";s:1:"*";s:1:"]";s:1:")";s:1:"^";s:1:";";s:1:"_";s:1:"^";s:1:"`";s:1:"-";s:1:"a";s:1:"/";s:1:"b";s:2:"Â";s:1:"c";s:2:"Ä";s:1:"d";s:2:"À";s:1:"e";s:2:"Á";s:1:"f";s:2:"Ã";s:1:"g";s:2:"Å";s:1:"h";s:1:"[";s:1:"i";s:2:"Ñ";s:1:"j";s:2:"ş";s:1:"k";s:1:",";s:1:"l";s:1:"%";s:1:"m";s:1:"_";s:1:"n";s:1:">";s:1:"o";s:1:"?";s:1:"p";s:2:"ø";s:1:"q";s:2:"É";s:1:"r";s:2:"Ê";s:1:"s";s:2:"Ë";s:1:"t";s:2:"È";s:1:"u";s:2:"Í";s:1:"v";s:2:"Î";s:1:"w";s:2:"Ï";s:1:"x";s:2:"Ì";s:1:"y";s:2:"ı";s:1:"z";s:1:":";s:1:"{";s:2:"Ö";s:1:"|";s:2:"Ş";s:1:"}";s:1:"'";s:1:"~";s:1:"=";s:1:"";s:2:"Ü";s:1:"";s:2:"Ø";s:1:"";s:1:"a";s:1:"";s:1:"b";s:1:"";s:1:"c";s:1:"";s:1:"d";s:1:"";s:1:"e";s:1:"";s:1:"f";s:1:"";s:1:"g";s:1:"";s:1:"h";s:1:"";s:1:"i";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:1:"}";s:1:"";s:1:"`";s:1:"";s:2:"¦";s:1:"";s:2:"±";s:1:"";s:2:"°";s:1:"";s:1:"j";s:1:"";s:1:"k";s:1:"";s:1:"l";s:1:"";s:1:"m";s:1:"";s:1:"n";s:1:"";s:1:"o";s:1:"";s:1:"p";s:1:"";s:1:"q";s:1:"";s:1:"r";s:1:"";s:2:"ª";s:1:"";s:2:"º";s:1:"";s:2:"æ";s:1:"";s:2:"¸";s:1:"";s:2:"Æ";s:1:"";s:2:"¤";s:1:"";s:2:"µ";s:1:"";s:2:"ö";s:1:"";s:1:"s";s:1:"";s:1:"t";s:1:"";s:1:"u";s:1:"";s:1:"v";s:1:"";s:1:"w";s:1:"";s:1:"x";s:1:"";s:1:"y";s:1:"";s:1:"z";s:1:"";s:2:"¡";s:1:"";s:2:"¿";s:1:"";s:1:"]";s:1:"";s:1:"$";s:1:"";s:1:"@";s:1:"";s:2:"®";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¥";s:1:"";s:2:"·";s:1:"";s:2:"©";s:1:"";s:2:"§";s:1:"";s:2:"¶";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"¬";s:1:"";s:1:"|";s:1:"";s:2:"¯";s:1:"";s:2:"¨";s:1:"";s:2:"´";s:1:"";s:2:"×";s:1:"";s:2:"ç";s:1:"";s:1:"A";s:1:"";s:1:"B";s:1:"";s:1:"C";s:1:"";s:1:"D";s:1:"";s:1:"E";s:1:"";s:1:"F";s:1:"";s:1:"G";s:1:"";s:1:"H";s:1:"";s:1:"I";s:1:"";s:2:"­";s:1:"";s:2:"ô";s:1:"";s:1:"~";s:1:"";s:2:"ò";s:1:"";s:2:"ó";s:1:"";s:2:"õ";s:1:"";s:2:"ğ";s:1:"";s:1:"J";s:1:"";s:1:"K";s:1:"";s:1:"L";s:1:"";s:1:"M";s:1:"";s:1:"N";s:1:"";s:1:"O";s:1:"";s:1:"P";s:1:"";s:1:"Q";s:1:"";s:1:"R";s:1:"";s:2:"¹";s:1:"";s:2:"û";s:1:"";s:1:"\";s:1:"";s:2:"ù";s:1:"";s:2:"ú";s:1:"";s:2:"ÿ";s:1:"";s:2:"ü";s:1:"";s:2:"÷";s:1:"";s:1:"S";s:1:"";s:1:"T";s:1:"";s:1:"U";s:1:"";s:1:"V";s:1:"";s:1:"W";s:1:"";s:1:"X";s:1:"";s:1:"Y";s:1:"";s:1:"Z";s:1:"";s:2:"²";s:1:"";s:2:"Ô";s:1:"";s:1:"#";s:1:"";s:2:"Ò";s:1:"";s:2:"Ó";s:1:"";s:2:"Õ";s:1:"";s:1:"0";s:1:"";s:1:"1";s:1:"";s:1:"2";s:1:"";s:1:"3";s:1:"";s:1:"4";s:1:"";s:1:"5";s:1:"";s:1:"6";s:1:"";s:1:"7";s:1:"";s:1:"8";s:1:"";s:1:"9";s:1:"";s:2:"³";s:1:"";s:2:"Û";s:1:"";s:1:""";s:1:"";s:2:"Ù";s:1:"";s:2:"Ú";s:1:"";s:2:"";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp424.ser
@@ -0,0 +1,3 @@
+a:218:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:1:"	";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"	";s:2:"";s:1:"
+";s:2:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:2:"";s:1:"!";s:2:"";s:1:""";s:2:"";s:1:"#";s:2:"";s:1:"$";s:2:"";s:1:"%";s:1:"
+";s:1:"&";s:1:"";s:1:"'";s:1:"";s:1:"(";s:2:"";s:1:")";s:2:"";s:1:"*";s:2:"";s:1:"+";s:2:"";s:1:",";s:2:"";s:1:"-";s:1:"";s:1:".";s:1:"";s:1:"/";s:1:"";i:0;s:2:"";i:1;s:2:"";i:2;s:1:"";i:3;s:2:"";i:4;s:2:"";i:5;s:2:"";i:6;s:2:"";i:7;s:1:"";i:8;s:2:"";i:9;s:2:"";s:1:":";s:2:"";s:1:";";s:2:"";s:1:"<";s:1:"";s:1:"=";s:1:"";s:1:">";s:2:"";s:1:"?";s:1:"";s:1:"@";s:1:" ";s:1:"A";s:2:"א";s:1:"B";s:2:"ב";s:1:"C";s:2:"ג";s:1:"D";s:2:"ד";s:1:"E";s:2:"ה";s:1:"F";s:2:"ו";s:1:"G";s:2:"ז";s:1:"H";s:2:"ח";s:1:"I";s:2:"ט";s:1:"J";s:2:"¢";s:1:"K";s:1:".";s:1:"L";s:1:"<";s:1:"M";s:1:"(";s:1:"N";s:1:"+";s:1:"O";s:1:"|";s:1:"P";s:1:"&";s:1:"Q";s:2:"י";s:1:"R";s:2:"ך";s:1:"S";s:2:"כ";s:1:"T";s:2:"ל";s:1:"U";s:2:"ם";s:1:"V";s:2:"מ";s:1:"W";s:2:"ן";s:1:"X";s:2:"נ";s:1:"Y";s:2:"ס";s:1:"Z";s:1:"!";s:1:"[";s:1:"$";s:1:"\";s:1:"*";s:1:"]";s:1:")";s:1:"^";s:1:";";s:1:"_";s:2:"¬";s:1:"`";s:1:"-";s:1:"a";s:1:"/";s:1:"b";s:2:"ע";s:1:"c";s:2:"ף";s:1:"d";s:2:"פ";s:1:"e";s:2:"ץ";s:1:"f";s:2:"צ";s:1:"g";s:2:"ק";s:1:"h";s:2:"ר";s:1:"i";s:2:"ש";s:1:"j";s:2:"¦";s:1:"k";s:1:",";s:1:"l";s:1:"%";s:1:"m";s:1:"_";s:1:"n";s:1:">";s:1:"o";s:1:"?";s:1:"q";s:2:"ת";s:1:"t";s:2:" ";s:1:"x";s:3:"‗";s:1:"y";s:1:"`";s:1:"z";s:1:":";s:1:"{";s:1:"#";s:1:"|";s:1:"@";s:1:"}";s:1:"'";s:1:"~";s:1:"=";s:1:"";s:1:""";s:1:"";s:1:"a";s:1:"";s:1:"b";s:1:"";s:1:"c";s:1:"";s:1:"d";s:1:"";s:1:"e";s:1:"";s:1:"f";s:1:"";s:1:"g";s:1:"";s:1:"h";s:1:"";s:1:"i";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:2:"±";s:1:"";s:2:"°";s:1:"";s:1:"j";s:1:"";s:1:"k";s:1:"";s:1:"l";s:1:"";s:1:"m";s:1:"";s:1:"n";s:1:"";s:1:"o";s:1:"";s:1:"p";s:1:"";s:1:"q";s:1:"";s:1:"r";s:1:"";s:2:"¸";s:1:"";s:2:"¤";s:1:"";s:2:"µ";s:1:"";s:1:"~";s:1:"";s:1:"s";s:1:"";s:1:"t";s:1:"";s:1:"u";s:1:"";s:1:"v";s:1:"";s:1:"w";s:1:"";s:1:"x";s:1:"";s:1:"y";s:1:"";s:1:"z";s:1:"";s:2:"®";s:1:"";s:1:"^";s:1:"";s:2:"£";s:1:"";s:2:"¥";s:1:"";s:2:"·";s:1:"";s:2:"©";s:1:"";s:2:"§";s:1:"";s:2:"¶";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:1:"[";s:1:"";s:1:"]";s:1:"";s:2:"¯";s:1:"";s:2:"¨";s:1:"";s:2:"´";s:1:"";s:2:"×";s:1:"";s:1:"{";s:1:"";s:1:"A";s:1:"";s:1:"B";s:1:"";s:1:"C";s:1:"";s:1:"D";s:1:"";s:1:"E";s:1:"";s:1:"F";s:1:"";s:1:"G";s:1:"";s:1:"H";s:1:"";s:1:"I";s:1:"";s:2:"­";s:1:"";s:1:"}";s:1:"";s:1:"J";s:1:"";s:1:"K";s:1:"";s:1:"L";s:1:"";s:1:"M";s:1:"";s:1:"N";s:1:"";s:1:"O";s:1:"";s:1:"P";s:1:"";s:1:"Q";s:1:"";s:1:"R";s:1:"";s:2:"¹";s:1:"";s:1:"\";s:1:"";s:2:"÷";s:1:"";s:1:"S";s:1:"";s:1:"T";s:1:"";s:1:"U";s:1:"";s:1:"V";s:1:"";s:1:"W";s:1:"";s:1:"X";s:1:"";s:1:"Y";s:1:"";s:1:"Z";s:1:"";s:2:"²";s:1:"";s:1:"0";s:1:"";s:1:"1";s:1:"";s:1:"2";s:1:"";s:1:"3";s:1:"";s:1:"4";s:1:"";s:1:"5";s:1:"";s:1:"6";s:1:"";s:1:"7";s:1:"";s:1:"8";s:1:"";s:1:"9";s:1:"";s:2:"³";s:1:"";s:2:"";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp437.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ç";s:1:"";s:2:"ü";s:1:"";s:2:"é";s:1:"";s:2:"â";s:1:"";s:2:"ä";s:1:"";s:2:"à";s:1:"";s:2:"å";s:1:"";s:2:"ç";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"è";s:1:"";s:2:"ï";s:1:"";s:2:"î";s:1:"";s:2:"ì";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"É";s:1:"";s:2:"æ";s:1:"";s:2:"Æ";s:1:"";s:2:"ô";s:1:"";s:2:"ö";s:1:"";s:2:"ò";s:1:"";s:2:"û";s:1:"";s:2:"ù";s:1:"";s:2:"ÿ";s:1:"";s:2:"Ö";s:1:"";s:2:"Ü";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¥";s:1:"";s:3:"₧";s:1:"";s:2:"ƒ";s:1:"";s:2:"á";s:1:"";s:2:"í";s:1:"";s:2:"ó";s:1:"";s:2:"ú";s:1:"";s:2:"ñ";s:1:"";s:2:"Ñ";s:1:"";s:2:"ª";s:1:"";s:2:"º";s:1:"";s:2:"¿";s:1:"";s:3:"⌐";s:1:"";s:2:"¬";s:1:"";s:2:"½";s:1:"";s:2:"¼";s:1:"";s:2:"¡";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:3:"╡";s:1:"";s:3:"╢";s:1:"";s:3:"╖";s:1:"";s:3:"╕";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:3:"╜";s:1:"";s:3:"╛";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:3:"╞";s:1:"";s:3:"╟";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:3:"╧";s:1:"";s:3:"╨";s:1:"";s:3:"╤";s:1:"";s:3:"╥";s:1:"";s:3:"╙";s:1:"";s:3:"╘";s:1:"";s:3:"╒";s:1:"";s:3:"╓";s:1:"";s:3:"╫";s:1:"";s:3:"╪";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:3:"▌";s:1:"";s:3:"▐";s:1:"";s:3:"▀";s:1:"";s:2:"α";s:1:"";s:2:"ß";s:1:"";s:2:"Γ";s:1:"";s:2:"π";s:1:"";s:2:"Σ";s:1:"";s:2:"σ";s:1:"";s:2:"µ";s:1:"";s:2:"τ";s:1:"";s:2:"Φ";s:1:"";s:2:"Θ";s:1:"";s:2:"Ω";s:1:"";s:2:"δ";s:1:"";s:3:"∞";s:1:"";s:2:"φ";s:1:"";s:2:"ε";s:1:"";s:3:"∩";s:1:"";s:3:"≡";s:1:"";s:2:"±";s:1:"";s:3:"≥";s:1:"";s:3:"≤";s:1:"";s:3:"⌠";s:1:"";s:3:"⌡";s:1:"";s:2:"÷";s:1:"";s:3:"≈";s:1:"";s:2:"°";s:1:"";s:3:"∙";s:1:"";s:2:"·";s:1:"";s:3:"√";s:1:"";s:3:"ⁿ";s:1:"";s:2:"²";s:1:"";s:3:"■";s:1:"";s:2:" ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp500.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:1:"	";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"	";s:2:"";s:1:"
+";s:2:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:2:"";s:1:"!";s:2:"";s:1:""";s:2:"";s:1:"#";s:2:"";s:1:"$";s:2:"";s:1:"%";s:1:"
+";s:1:"&";s:1:"";s:1:"'";s:1:"";s:1:"(";s:2:"";s:1:")";s:2:"";s:1:"*";s:2:"";s:1:"+";s:2:"";s:1:",";s:2:"";s:1:"-";s:1:"";s:1:".";s:1:"";s:1:"/";s:1:"";i:0;s:2:"";i:1;s:2:"";i:2;s:1:"";i:3;s:2:"";i:4;s:2:"";i:5;s:2:"";i:6;s:2:"";i:7;s:1:"";i:8;s:2:"";i:9;s:2:"";s:1:":";s:2:"";s:1:";";s:2:"";s:1:"<";s:1:"";s:1:"=";s:1:"";s:1:">";s:2:"";s:1:"?";s:1:"";s:1:"@";s:1:" ";s:1:"A";s:2:" ";s:1:"B";s:2:"â";s:1:"C";s:2:"ä";s:1:"D";s:2:"à";s:1:"E";s:2:"á";s:1:"F";s:2:"ã";s:1:"G";s:2:"å";s:1:"H";s:2:"ç";s:1:"I";s:2:"ñ";s:1:"J";s:1:"[";s:1:"K";s:1:".";s:1:"L";s:1:"<";s:1:"M";s:1:"(";s:1:"N";s:1:"+";s:1:"O";s:1:"!";s:1:"P";s:1:"&";s:1:"Q";s:2:"é";s:1:"R";s:2:"ê";s:1:"S";s:2:"ë";s:1:"T";s:2:"è";s:1:"U";s:2:"í";s:1:"V";s:2:"î";s:1:"W";s:2:"ï";s:1:"X";s:2:"ì";s:1:"Y";s:2:"ß";s:1:"Z";s:1:"]";s:1:"[";s:1:"$";s:1:"\";s:1:"*";s:1:"]";s:1:")";s:1:"^";s:1:";";s:1:"_";s:1:"^";s:1:"`";s:1:"-";s:1:"a";s:1:"/";s:1:"b";s:2:"Â";s:1:"c";s:2:"Ä";s:1:"d";s:2:"À";s:1:"e";s:2:"Á";s:1:"f";s:2:"Ã";s:1:"g";s:2:"Å";s:1:"h";s:2:"Ç";s:1:"i";s:2:"Ñ";s:1:"j";s:2:"¦";s:1:"k";s:1:",";s:1:"l";s:1:"%";s:1:"m";s:1:"_";s:1:"n";s:1:">";s:1:"o";s:1:"?";s:1:"p";s:2:"ø";s:1:"q";s:2:"É";s:1:"r";s:2:"Ê";s:1:"s";s:2:"Ë";s:1:"t";s:2:"È";s:1:"u";s:2:"Í";s:1:"v";s:2:"Î";s:1:"w";s:2:"Ï";s:1:"x";s:2:"Ì";s:1:"y";s:1:"`";s:1:"z";s:1:":";s:1:"{";s:1:"#";s:1:"|";s:1:"@";s:1:"}";s:1:"'";s:1:"~";s:1:"=";s:1:"";s:1:""";s:1:"";s:2:"Ø";s:1:"";s:1:"a";s:1:"";s:1:"b";s:1:"";s:1:"c";s:1:"";s:1:"d";s:1:"";s:1:"e";s:1:"";s:1:"f";s:1:"";s:1:"g";s:1:"";s:1:"h";s:1:"";s:1:"i";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:2:"ð";s:1:"";s:2:"ý";s:1:"";s:2:"þ";s:1:"";s:2:"±";s:1:"";s:2:"°";s:1:"";s:1:"j";s:1:"";s:1:"k";s:1:"";s:1:"l";s:1:"";s:1:"m";s:1:"";s:1:"n";s:1:"";s:1:"o";s:1:"";s:1:"p";s:1:"";s:1:"q";s:1:"";s:1:"r";s:1:"";s:2:"ª";s:1:"";s:2:"º";s:1:"";s:2:"æ";s:1:"";s:2:"¸";s:1:"";s:2:"Æ";s:1:"";s:2:"¤";s:1:"";s:2:"µ";s:1:"";s:1:"~";s:1:"";s:1:"s";s:1:"";s:1:"t";s:1:"";s:1:"u";s:1:"";s:1:"v";s:1:"";s:1:"w";s:1:"";s:1:"x";s:1:"";s:1:"y";s:1:"";s:1:"z";s:1:"";s:2:"¡";s:1:"";s:2:"¿";s:1:"";s:2:"Ð";s:1:"";s:2:"Ý";s:1:"";s:2:"Þ";s:1:"";s:2:"®";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¥";s:1:"";s:2:"·";s:1:"";s:2:"©";s:1:"";s:2:"§";s:1:"";s:2:"¶";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"¬";s:1:"";s:1:"|";s:1:"";s:2:"¯";s:1:"";s:2:"¨";s:1:"";s:2:"´";s:1:"";s:2:"×";s:1:"";s:1:"{";s:1:"";s:1:"A";s:1:"";s:1:"B";s:1:"";s:1:"C";s:1:"";s:1:"D";s:1:"";s:1:"E";s:1:"";s:1:"F";s:1:"";s:1:"G";s:1:"";s:1:"H";s:1:"";s:1:"I";s:1:"";s:2:"­";s:1:"";s:2:"ô";s:1:"";s:2:"ö";s:1:"";s:2:"ò";s:1:"";s:2:"ó";s:1:"";s:2:"õ";s:1:"";s:1:"}";s:1:"";s:1:"J";s:1:"";s:1:"K";s:1:"";s:1:"L";s:1:"";s:1:"M";s:1:"";s:1:"N";s:1:"";s:1:"O";s:1:"";s:1:"P";s:1:"";s:1:"Q";s:1:"";s:1:"R";s:1:"";s:2:"¹";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"ù";s:1:"";s:2:"ú";s:1:"";s:2:"ÿ";s:1:"";s:1:"\";s:1:"";s:2:"÷";s:1:"";s:1:"S";s:1:"";s:1:"T";s:1:"";s:1:"U";s:1:"";s:1:"V";s:1:"";s:1:"W";s:1:"";s:1:"X";s:1:"";s:1:"Y";s:1:"";s:1:"Z";s:1:"";s:2:"²";s:1:"";s:2:"Ô";s:1:"";s:2:"Ö";s:1:"";s:2:"Ò";s:1:"";s:2:"Ó";s:1:"";s:2:"Õ";s:1:"";s:1:"0";s:1:"";s:1:"1";s:1:"";s:1:"2";s:1:"";s:1:"3";s:1:"";s:1:"4";s:1:"";s:1:"5";s:1:"";s:1:"6";s:1:"";s:1:"7";s:1:"";s:1:"8";s:1:"";s:1:"9";s:1:"";s:2:"³";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"Ù";s:1:"";s:2:"Ú";s:1:"";s:2:"";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp737.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Α";s:1:"";s:2:"Β";s:1:"";s:2:"Γ";s:1:"";s:2:"Δ";s:1:"";s:2:"Ε";s:1:"";s:2:"Ζ";s:1:"";s:2:"Η";s:1:"";s:2:"Θ";s:1:"";s:2:"Ι";s:1:"";s:2:"Κ";s:1:"";s:2:"Λ";s:1:"";s:2:"Μ";s:1:"";s:2:"Ν";s:1:"";s:2:"Ξ";s:1:"";s:2:"Ο";s:1:"";s:2:"Π";s:1:"";s:2:"Ρ";s:1:"";s:2:"Σ";s:1:"";s:2:"Τ";s:1:"";s:2:"Υ";s:1:"";s:2:"Φ";s:1:"";s:2:"Χ";s:1:"";s:2:"Ψ";s:1:"";s:2:"Ω";s:1:"";s:2:"α";s:1:"";s:2:"β";s:1:"";s:2:"γ";s:1:"";s:2:"δ";s:1:"";s:2:"ε";s:1:"";s:2:"ζ";s:1:"";s:2:"η";s:1:"";s:2:"θ";s:1:"";s:2:"ι";s:1:"";s:2:"κ";s:1:"";s:2:"λ";s:1:"";s:2:"μ";s:1:"";s:2:"ν";s:1:"";s:2:"ξ";s:1:"";s:2:"ο";s:1:"";s:2:"π";s:1:"";s:2:"ρ";s:1:"";s:2:"σ";s:1:"";s:2:"ς";s:1:"";s:2:"τ";s:1:"";s:2:"υ";s:1:"";s:2:"φ";s:1:"";s:2:"χ";s:1:"";s:2:"ψ";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:3:"╡";s:1:"";s:3:"╢";s:1:"";s:3:"╖";s:1:"";s:3:"╕";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:3:"╜";s:1:"";s:3:"╛";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:3:"╞";s:1:"";s:3:"╟";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:3:"╧";s:1:"";s:3:"╨";s:1:"";s:3:"╤";s:1:"";s:3:"╥";s:1:"";s:3:"╙";s:1:"";s:3:"╘";s:1:"";s:3:"╒";s:1:"";s:3:"╓";s:1:"";s:3:"╫";s:1:"";s:3:"╪";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:3:"▌";s:1:"";s:3:"▐";s:1:"";s:3:"▀";s:1:"";s:2:"ω";s:1:"";s:2:"ά";s:1:"";s:2:"έ";s:1:"";s:2:"ή";s:1:"";s:2:"ϊ";s:1:"";s:2:"ί";s:1:"";s:2:"ό";s:1:"";s:2:"ύ";s:1:"";s:2:"ϋ";s:1:"";s:2:"ώ";s:1:"";s:2:"Ά";s:1:"";s:2:"Έ";s:1:"";s:2:"Ή";s:1:"";s:2:"Ί";s:1:"";s:2:"Ό";s:1:"";s:2:"Ύ";s:1:"";s:2:"Ώ";s:1:"";s:2:"±";s:1:"";s:3:"≥";s:1:"";s:3:"≤";s:1:"";s:2:"Ϊ";s:1:"";s:2:"Ϋ";s:1:"";s:2:"÷";s:1:"";s:3:"≈";s:1:"";s:2:"°";s:1:"";s:3:"∙";s:1:"";s:2:"·";s:1:"";s:3:"√";s:1:"";s:3:"ⁿ";s:1:"";s:2:"²";s:1:"";s:3:"■";s:1:"";s:2:" ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp775.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ć";s:1:"";s:2:"ü";s:1:"";s:2:"é";s:1:"";s:2:"ā";s:1:"";s:2:"ä";s:1:"";s:2:"ģ";s:1:"";s:2:"å";s:1:"";s:2:"ć";s:1:"";s:2:"ł";s:1:"";s:2:"ē";s:1:"";s:2:"Ŗ";s:1:"";s:2:"ŗ";s:1:"";s:2:"ī";s:1:"";s:2:"Ź";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"É";s:1:"";s:2:"æ";s:1:"";s:2:"Æ";s:1:"";s:2:"ō";s:1:"";s:2:"ö";s:1:"";s:2:"Ģ";s:1:"";s:2:"¢";s:1:"";s:2:"Ś";s:1:"";s:2:"ś";s:1:"";s:2:"Ö";s:1:"";s:2:"Ü";s:1:"";s:2:"ø";s:1:"";s:2:"£";s:1:"";s:2:"Ø";s:1:"";s:2:"×";s:1:"";s:2:"¤";s:1:"";s:2:"Ā";s:1:"";s:2:"Ī";s:1:"";s:2:"ó";s:1:"";s:2:"Ż";s:1:"";s:2:"ż";s:1:"";s:2:"ź";s:1:"";s:3:"”";s:1:"";s:2:"¦";s:1:"";s:2:"©";s:1:"";s:2:"®";s:1:"";s:2:"¬";s:1:"";s:2:"½";s:1:"";s:2:"¼";s:1:"";s:2:"Ł";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:2:"Ą";s:1:"";s:2:"Č";s:1:"";s:2:"Ę";s:1:"";s:2:"Ė";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:2:"Į";s:1:"";s:2:"Š";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:2:"Ų";s:1:"";s:2:"Ū";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:2:"Ž";s:1:"";s:2:"ą";s:1:"";s:2:"č";s:1:"";s:2:"ę";s:1:"";s:2:"ė";s:1:"";s:2:"į";s:1:"";s:2:"š";s:1:"";s:2:"ų";s:1:"";s:2:"ū";s:1:"";s:2:"ž";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:3:"▌";s:1:"";s:3:"▐";s:1:"";s:3:"▀";s:1:"";s:2:"Ó";s:1:"";s:2:"ß";s:1:"";s:2:"Ō";s:1:"";s:2:"Ń";s:1:"";s:2:"õ";s:1:"";s:2:"Õ";s:1:"";s:2:"µ";s:1:"";s:2:"ń";s:1:"";s:2:"Ķ";s:1:"";s:2:"ķ";s:1:"";s:2:"Ļ";s:1:"";s:2:"ļ";s:1:"";s:2:"ņ";s:1:"";s:2:"Ē";s:1:"";s:2:"Ņ";s:1:"";s:3:"’";s:1:"";s:2:"­";s:1:"";s:2:"±";s:1:"";s:3:"“";s:1:"";s:2:"¾";s:1:"";s:2:"¶";s:1:"";s:2:"§";s:1:"";s:2:"÷";s:1:"";s:3:"„";s:1:"";s:2:"°";s:1:"";s:3:"∙";s:1:"";s:2:"·";s:1:"";s:2:"¹";s:1:"";s:2:"³";s:1:"";s:2:"²";s:1:"";s:3:"■";s:1:"";s:2:" ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp850.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ç";s:1:"";s:2:"ü";s:1:"";s:2:"é";s:1:"";s:2:"â";s:1:"";s:2:"ä";s:1:"";s:2:"à";s:1:"";s:2:"å";s:1:"";s:2:"ç";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"è";s:1:"";s:2:"ï";s:1:"";s:2:"î";s:1:"";s:2:"ì";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"É";s:1:"";s:2:"æ";s:1:"";s:2:"Æ";s:1:"";s:2:"ô";s:1:"";s:2:"ö";s:1:"";s:2:"ò";s:1:"";s:2:"û";s:1:"";s:2:"ù";s:1:"";s:2:"ÿ";s:1:"";s:2:"Ö";s:1:"";s:2:"Ü";s:1:"";s:2:"ø";s:1:"";s:2:"£";s:1:"";s:2:"Ø";s:1:"";s:2:"×";s:1:"";s:2:"ƒ";s:1:"";s:2:"á";s:1:"";s:2:"í";s:1:"";s:2:"ó";s:1:"";s:2:"ú";s:1:"";s:2:"ñ";s:1:"";s:2:"Ñ";s:1:"";s:2:"ª";s:1:"";s:2:"º";s:1:"";s:2:"¿";s:1:"";s:2:"®";s:1:"";s:2:"¬";s:1:"";s:2:"½";s:1:"";s:2:"¼";s:1:"";s:2:"¡";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"À";s:1:"";s:2:"©";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:2:"¢";s:1:"";s:2:"¥";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:2:"ã";s:1:"";s:2:"Ã";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:2:"¤";s:1:"";s:2:"ð";s:1:"";s:2:"Ð";s:1:"";s:2:"Ê";s:1:"";s:2:"Ë";s:1:"";s:2:"È";s:1:"";s:2:"ı";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:2:"¦";s:1:"";s:2:"Ì";s:1:"";s:3:"▀";s:1:"";s:2:"Ó";s:1:"";s:2:"ß";s:1:"";s:2:"Ô";s:1:"";s:2:"Ò";s:1:"";s:2:"õ";s:1:"";s:2:"Õ";s:1:"";s:2:"µ";s:1:"";s:2:"þ";s:1:"";s:2:"Þ";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ù";s:1:"";s:2:"ý";s:1:"";s:2:"Ý";s:1:"";s:2:"¯";s:1:"";s:2:"´";s:1:"";s:2:"­";s:1:"";s:2:"±";s:1:"";s:3:"‗";s:1:"";s:2:"¾";s:1:"";s:2:"¶";s:1:"";s:2:"§";s:1:"";s:2:"÷";s:1:"";s:2:"¸";s:1:"";s:2:"°";s:1:"";s:2:"¨";s:1:"";s:2:"·";s:1:"";s:2:"¹";s:1:"";s:2:"³";s:1:"";s:2:"²";s:1:"";s:3:"■";s:1:"";s:2:" ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp852.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ç";s:1:"";s:2:"ü";s:1:"";s:2:"é";s:1:"";s:2:"â";s:1:"";s:2:"ä";s:1:"";s:2:"ů";s:1:"";s:2:"ć";s:1:"";s:2:"ç";s:1:"";s:2:"ł";s:1:"";s:2:"ë";s:1:"";s:2:"Ő";s:1:"";s:2:"ő";s:1:"";s:2:"î";s:1:"";s:2:"Ź";s:1:"";s:2:"Ä";s:1:"";s:2:"Ć";s:1:"";s:2:"É";s:1:"";s:2:"Ĺ";s:1:"";s:2:"ĺ";s:1:"";s:2:"ô";s:1:"";s:2:"ö";s:1:"";s:2:"Ľ";s:1:"";s:2:"ľ";s:1:"";s:2:"Ś";s:1:"";s:2:"ś";s:1:"";s:2:"Ö";s:1:"";s:2:"Ü";s:1:"";s:2:"Ť";s:1:"";s:2:"ť";s:1:"";s:2:"Ł";s:1:"";s:2:"×";s:1:"";s:2:"č";s:1:"";s:2:"á";s:1:"";s:2:"í";s:1:"";s:2:"ó";s:1:"";s:2:"ú";s:1:"";s:2:"Ą";s:1:"";s:2:"ą";s:1:"";s:2:"Ž";s:1:"";s:2:"ž";s:1:"";s:2:"Ę";s:1:"";s:2:"ę";s:1:"";s:2:"¬";s:1:"";s:2:"ź";s:1:"";s:2:"Č";s:1:"";s:2:"ş";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ě";s:1:"";s:2:"Ş";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:2:"Ż";s:1:"";s:2:"ż";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:2:"Ă";s:1:"";s:2:"ă";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:2:"¤";s:1:"";s:2:"đ";s:1:"";s:2:"Đ";s:1:"";s:2:"Ď";s:1:"";s:2:"Ë";s:1:"";s:2:"ď";s:1:"";s:2:"Ň";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"ě";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:2:"Ţ";s:1:"";s:2:"Ů";s:1:"";s:3:"▀";s:1:"";s:2:"Ó";s:1:"";s:2:"ß";s:1:"";s:2:"Ô";s:1:"";s:2:"Ń";s:1:"";s:2:"ń";s:1:"";s:2:"ň";s:1:"";s:2:"Š";s:1:"";s:2:"š";s:1:"";s:2:"Ŕ";s:1:"";s:2:"Ú";s:1:"";s:2:"ŕ";s:1:"";s:2:"Ű";s:1:"";s:2:"ý";s:1:"";s:2:"Ý";s:1:"";s:2:"ţ";s:1:"";s:2:"´";s:1:"";s:2:"­";s:1:"";s:2:"˝";s:1:"";s:2:"˛";s:1:"";s:2:"ˇ";s:1:"";s:2:"˘";s:1:"";s:2:"§";s:1:"";s:2:"÷";s:1:"";s:2:"¸";s:1:"";s:2:"°";s:1:"";s:2:"¨";s:1:"";s:2:"˙";s:1:"";s:2:"ű";s:1:"";s:2:"Ř";s:1:"";s:2:"ř";s:1:"";s:3:"■";s:1:"";s:2:" ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp855.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"ђ";s:1:"";s:2:"Ђ";s:1:"";s:2:"ѓ";s:1:"";s:2:"Ѓ";s:1:"";s:2:"ё";s:1:"";s:2:"Ё";s:1:"";s:2:"є";s:1:"";s:2:"Є";s:1:"";s:2:"ѕ";s:1:"";s:2:"Ѕ";s:1:"";s:2:"і";s:1:"";s:2:"І";s:1:"";s:2:"ї";s:1:"";s:2:"Ї";s:1:"";s:2:"ј";s:1:"";s:2:"Ј";s:1:"";s:2:"љ";s:1:"";s:2:"Љ";s:1:"";s:2:"њ";s:1:"";s:2:"Њ";s:1:"";s:2:"ћ";s:1:"";s:2:"Ћ";s:1:"";s:2:"ќ";s:1:"";s:2:"Ќ";s:1:"";s:2:"ў";s:1:"";s:2:"Ў";s:1:"";s:2:"џ";s:1:"";s:2:"Џ";s:1:"";s:2:"ю";s:1:"";s:2:"Ю";s:1:"";s:2:"ъ";s:1:"";s:2:"Ъ";s:1:"";s:2:"а";s:1:"";s:2:"А";s:1:"";s:2:"б";s:1:"";s:2:"Б";s:1:"";s:2:"ц";s:1:"";s:2:"Ц";s:1:"";s:2:"д";s:1:"";s:2:"Д";s:1:"";s:2:"е";s:1:"";s:2:"Е";s:1:"";s:2:"ф";s:1:"";s:2:"Ф";s:1:"";s:2:"г";s:1:"";s:2:"Г";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:2:"х";s:1:"";s:2:"Х";s:1:"";s:2:"и";s:1:"";s:2:"И";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:2:"й";s:1:"";s:2:"Й";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:2:"к";s:1:"";s:2:"К";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:2:"¤";s:1:"";s:2:"л";s:1:"";s:2:"Л";s:1:"";s:2:"м";s:1:"";s:2:"М";s:1:"";s:2:"н";s:1:"";s:2:"Н";s:1:"";s:2:"о";s:1:"";s:2:"О";s:1:"";s:2:"п";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:2:"П";s:1:"";s:2:"я";s:1:"";s:3:"▀";s:1:"";s:2:"Я";s:1:"";s:2:"р";s:1:"";s:2:"Р";s:1:"";s:2:"с";s:1:"";s:2:"С";s:1:"";s:2:"т";s:1:"";s:2:"Т";s:1:"";s:2:"у";s:1:"";s:2:"У";s:1:"";s:2:"ж";s:1:"";s:2:"Ж";s:1:"";s:2:"в";s:1:"";s:2:"В";s:1:"";s:2:"ь";s:1:"";s:2:"Ь";s:1:"";s:3:"№";s:1:"";s:2:"­";s:1:"";s:2:"ы";s:1:"";s:2:"Ы";s:1:"";s:2:"з";s:1:"";s:2:"З";s:1:"";s:2:"ш";s:1:"";s:2:"Ш";s:1:"";s:2:"э";s:1:"";s:2:"Э";s:1:"";s:2:"щ";s:1:"";s:2:"Щ";s:1:"";s:2:"ч";s:1:"";s:2:"Ч";s:1:"";s:2:"§";s:1:"";s:3:"■";s:1:"";s:2:" ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp856.ser
@@ -0,0 +1,3 @@
+a:215:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"א";s:1:"";s:2:"ב";s:1:"";s:2:"ג";s:1:"";s:2:"ד";s:1:"";s:2:"ה";s:1:"";s:2:"ו";s:1:"";s:2:"ז";s:1:"";s:2:"ח";s:1:"";s:2:"ט";s:1:"";s:2:"י";s:1:"";s:2:"ך";s:1:"";s:2:"כ";s:1:"";s:2:"ל";s:1:"";s:2:"ם";s:1:"";s:2:"מ";s:1:"";s:2:"ן";s:1:"";s:2:"נ";s:1:"";s:2:"ס";s:1:"";s:2:"ע";s:1:"";s:2:"ף";s:1:"";s:2:"פ";s:1:"";s:2:"ץ";s:1:"";s:2:"צ";s:1:"";s:2:"ק";s:1:"";s:2:"ר";s:1:"";s:2:"ש";s:1:"";s:2:"ת";s:1:"";s:2:"£";s:1:"";s:2:"×";s:1:"";s:2:"®";s:1:"";s:2:"¬";s:1:"";s:2:"½";s:1:"";s:2:"¼";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:2:"©";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:2:"¢";s:1:"";s:2:"¥";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:2:"¤";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:2:"¦";s:1:"";s:3:"▀";s:1:"";s:2:"µ";s:1:"";s:2:"¯";s:1:"";s:2:"´";s:1:"";s:2:"­";s:1:"";s:2:"±";s:1:"";s:3:"‗";s:1:"";s:2:"¾";s:1:"";s:2:"¶";s:1:"";s:2:"§";s:1:"";s:2:"÷";s:1:"";s:2:"¸";s:1:"";s:2:"°";s:1:"";s:2:"¨";s:1:"";s:2:"·";s:1:"";s:2:"¹";s:1:"";s:2:"³";s:1:"";s:2:"²";s:1:"";s:3:"■";s:1:"";s:2:" ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp857.ser
@@ -0,0 +1,3 @@
+a:253:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ç";s:1:"";s:2:"ü";s:1:"";s:2:"é";s:1:"";s:2:"â";s:1:"";s:2:"ä";s:1:"";s:2:"à";s:1:"";s:2:"å";s:1:"";s:2:"ç";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"è";s:1:"";s:2:"ï";s:1:"";s:2:"î";s:1:"";s:2:"ı";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"É";s:1:"";s:2:"æ";s:1:"";s:2:"Æ";s:1:"";s:2:"ô";s:1:"";s:2:"ö";s:1:"";s:2:"ò";s:1:"";s:2:"û";s:1:"";s:2:"ù";s:1:"";s:2:"İ";s:1:"";s:2:"Ö";s:1:"";s:2:"Ü";s:1:"";s:2:"ø";s:1:"";s:2:"£";s:1:"";s:2:"Ø";s:1:"";s:2:"Ş";s:1:"";s:2:"ş";s:1:"";s:2:"á";s:1:"";s:2:"í";s:1:"";s:2:"ó";s:1:"";s:2:"ú";s:1:"";s:2:"ñ";s:1:"";s:2:"Ñ";s:1:"";s:2:"Ğ";s:1:"";s:2:"ğ";s:1:"";s:2:"¿";s:1:"";s:2:"®";s:1:"";s:2:"¬";s:1:"";s:2:"½";s:1:"";s:2:"¼";s:1:"";s:2:"¡";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"À";s:1:"";s:2:"©";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:2:"¢";s:1:"";s:2:"¥";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:2:"ã";s:1:"";s:2:"Ã";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:2:"¤";s:1:"";s:2:"º";s:1:"";s:2:"ª";s:1:"";s:2:"Ê";s:1:"";s:2:"Ë";s:1:"";s:2:"È";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:2:"¦";s:1:"";s:2:"Ì";s:1:"";s:3:"▀";s:1:"";s:2:"Ó";s:1:"";s:2:"ß";s:1:"";s:2:"Ô";s:1:"";s:2:"Ò";s:1:"";s:2:"õ";s:1:"";s:2:"Õ";s:1:"";s:2:"µ";s:1:"";s:2:"×";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ù";s:1:"";s:2:"ì";s:1:"";s:2:"ÿ";s:1:"";s:2:"¯";s:1:"";s:2:"´";s:1:"";s:2:"­";s:1:"";s:2:"±";s:1:"";s:2:"¾";s:1:"";s:2:"¶";s:1:"";s:2:"§";s:1:"";s:2:"÷";s:1:"";s:2:"¸";s:1:"";s:2:"°";s:1:"";s:2:"¨";s:1:"";s:2:"·";s:1:"";s:2:"¹";s:1:"";s:2:"³";s:1:"";s:2:"²";s:1:"";s:3:"■";s:1:"";s:2:" ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp860.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ç";s:1:"";s:2:"ü";s:1:"";s:2:"é";s:1:"";s:2:"â";s:1:"";s:2:"ã";s:1:"";s:2:"à";s:1:"";s:2:"Á";s:1:"";s:2:"ç";s:1:"";s:2:"ê";s:1:"";s:2:"Ê";s:1:"";s:2:"è";s:1:"";s:2:"Í";s:1:"";s:2:"Ô";s:1:"";s:2:"ì";s:1:"";s:2:"Ã";s:1:"";s:2:"Â";s:1:"";s:2:"É";s:1:"";s:2:"À";s:1:"";s:2:"È";s:1:"";s:2:"ô";s:1:"";s:2:"õ";s:1:"";s:2:"ò";s:1:"";s:2:"Ú";s:1:"";s:2:"ù";s:1:"";s:2:"Ì";s:1:"";s:2:"Õ";s:1:"";s:2:"Ü";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"Ù";s:1:"";s:3:"₧";s:1:"";s:2:"Ó";s:1:"";s:2:"á";s:1:"";s:2:"í";s:1:"";s:2:"ó";s:1:"";s:2:"ú";s:1:"";s:2:"ñ";s:1:"";s:2:"Ñ";s:1:"";s:2:"ª";s:1:"";s:2:"º";s:1:"";s:2:"¿";s:1:"";s:2:"Ò";s:1:"";s:2:"¬";s:1:"";s:2:"½";s:1:"";s:2:"¼";s:1:"";s:2:"¡";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:3:"╡";s:1:"";s:3:"╢";s:1:"";s:3:"╖";s:1:"";s:3:"╕";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:3:"╜";s:1:"";s:3:"╛";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:3:"╞";s:1:"";s:3:"╟";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:3:"╧";s:1:"";s:3:"╨";s:1:"";s:3:"╤";s:1:"";s:3:"╥";s:1:"";s:3:"╙";s:1:"";s:3:"╘";s:1:"";s:3:"╒";s:1:"";s:3:"╓";s:1:"";s:3:"╫";s:1:"";s:3:"╪";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:3:"▌";s:1:"";s:3:"▐";s:1:"";s:3:"▀";s:1:"";s:2:"α";s:1:"";s:2:"ß";s:1:"";s:2:"Γ";s:1:"";s:2:"π";s:1:"";s:2:"Σ";s:1:"";s:2:"σ";s:1:"";s:2:"µ";s:1:"";s:2:"τ";s:1:"";s:2:"Φ";s:1:"";s:2:"Θ";s:1:"";s:2:"Ω";s:1:"";s:2:"δ";s:1:"";s:3:"∞";s:1:"";s:2:"φ";s:1:"";s:2:"ε";s:1:"";s:3:"∩";s:1:"";s:3:"≡";s:1:"";s:2:"±";s:1:"";s:3:"≥";s:1:"";s:3:"≤";s:1:"";s:3:"⌠";s:1:"";s:3:"⌡";s:1:"";s:2:"÷";s:1:"";s:3:"≈";s:1:"";s:2:"°";s:1:"";s:3:"∙";s:1:"";s:2:"·";s:1:"";s:3:"√";s:1:"";s:3:"ⁿ";s:1:"";s:2:"²";s:1:"";s:3:"■";s:1:"";s:2:" ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp861.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ç";s:1:"";s:2:"ü";s:1:"";s:2:"é";s:1:"";s:2:"â";s:1:"";s:2:"ä";s:1:"";s:2:"à";s:1:"";s:2:"å";s:1:"";s:2:"ç";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"è";s:1:"";s:2:"Ð";s:1:"";s:2:"ð";s:1:"";s:2:"Þ";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"É";s:1:"";s:2:"æ";s:1:"";s:2:"Æ";s:1:"";s:2:"ô";s:1:"";s:2:"ö";s:1:"";s:2:"þ";s:1:"";s:2:"û";s:1:"";s:2:"Ý";s:1:"";s:2:"ý";s:1:"";s:2:"Ö";s:1:"";s:2:"Ü";s:1:"";s:2:"ø";s:1:"";s:2:"£";s:1:"";s:2:"Ø";s:1:"";s:3:"₧";s:1:"";s:2:"ƒ";s:1:"";s:2:"á";s:1:"";s:2:"í";s:1:"";s:2:"ó";s:1:"";s:2:"ú";s:1:"";s:2:"Á";s:1:"";s:2:"Í";s:1:"";s:2:"Ó";s:1:"";s:2:"Ú";s:1:"";s:2:"¿";s:1:"";s:3:"⌐";s:1:"";s:2:"¬";s:1:"";s:2:"½";s:1:"";s:2:"¼";s:1:"";s:2:"¡";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:3:"╡";s:1:"";s:3:"╢";s:1:"";s:3:"╖";s:1:"";s:3:"╕";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:3:"╜";s:1:"";s:3:"╛";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:3:"╞";s:1:"";s:3:"╟";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:3:"╧";s:1:"";s:3:"╨";s:1:"";s:3:"╤";s:1:"";s:3:"╥";s:1:"";s:3:"╙";s:1:"";s:3:"╘";s:1:"";s:3:"╒";s:1:"";s:3:"╓";s:1:"";s:3:"╫";s:1:"";s:3:"╪";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:3:"▌";s:1:"";s:3:"▐";s:1:"";s:3:"▀";s:1:"";s:2:"α";s:1:"";s:2:"ß";s:1:"";s:2:"Γ";s:1:"";s:2:"π";s:1:"";s:2:"Σ";s:1:"";s:2:"σ";s:1:"";s:2:"µ";s:1:"";s:2:"τ";s:1:"";s:2:"Φ";s:1:"";s:2:"Θ";s:1:"";s:2:"Ω";s:1:"";s:2:"δ";s:1:"";s:3:"∞";s:1:"";s:2:"φ";s:1:"";s:2:"ε";s:1:"";s:3:"∩";s:1:"";s:3:"≡";s:1:"";s:2:"±";s:1:"";s:3:"≥";s:1:"";s:3:"≤";s:1:"";s:3:"⌠";s:1:"";s:3:"⌡";s:1:"";s:2:"÷";s:1:"";s:3:"≈";s:1:"";s:2:"°";s:1:"";s:3:"∙";s:1:"";s:2:"·";s:1:"";s:3:"√";s:1:"";s:3:"ⁿ";s:1:"";s:2:"²";s:1:"";s:3:"■";s:1:"";s:2:" ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp862.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"א";s:1:"";s:2:"ב";s:1:"";s:2:"ג";s:1:"";s:2:"ד";s:1:"";s:2:"ה";s:1:"";s:2:"ו";s:1:"";s:2:"ז";s:1:"";s:2:"ח";s:1:"";s:2:"ט";s:1:"";s:2:"י";s:1:"";s:2:"ך";s:1:"";s:2:"כ";s:1:"";s:2:"ל";s:1:"";s:2:"ם";s:1:"";s:2:"מ";s:1:"";s:2:"ן";s:1:"";s:2:"נ";s:1:"";s:2:"ס";s:1:"";s:2:"ע";s:1:"";s:2:"ף";s:1:"";s:2:"פ";s:1:"";s:2:"ץ";s:1:"";s:2:"צ";s:1:"";s:2:"ק";s:1:"";s:2:"ר";s:1:"";s:2:"ש";s:1:"";s:2:"ת";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¥";s:1:"";s:3:"₧";s:1:"";s:2:"ƒ";s:1:"";s:2:"á";s:1:"";s:2:"í";s:1:"";s:2:"ó";s:1:"";s:2:"ú";s:1:"";s:2:"ñ";s:1:"";s:2:"Ñ";s:1:"";s:2:"ª";s:1:"";s:2:"º";s:1:"";s:2:"¿";s:1:"";s:3:"⌐";s:1:"";s:2:"¬";s:1:"";s:2:"½";s:1:"";s:2:"¼";s:1:"";s:2:"¡";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:3:"╡";s:1:"";s:3:"╢";s:1:"";s:3:"╖";s:1:"";s:3:"╕";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:3:"╜";s:1:"";s:3:"╛";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:3:"╞";s:1:"";s:3:"╟";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:3:"╧";s:1:"";s:3:"╨";s:1:"";s:3:"╤";s:1:"";s:3:"╥";s:1:"";s:3:"╙";s:1:"";s:3:"╘";s:1:"";s:3:"╒";s:1:"";s:3:"╓";s:1:"";s:3:"╫";s:1:"";s:3:"╪";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:3:"▌";s:1:"";s:3:"▐";s:1:"";s:3:"▀";s:1:"";s:2:"α";s:1:"";s:2:"ß";s:1:"";s:2:"Γ";s:1:"";s:2:"π";s:1:"";s:2:"Σ";s:1:"";s:2:"σ";s:1:"";s:2:"µ";s:1:"";s:2:"τ";s:1:"";s:2:"Φ";s:1:"";s:2:"Θ";s:1:"";s:2:"Ω";s:1:"";s:2:"δ";s:1:"";s:3:"∞";s:1:"";s:2:"φ";s:1:"";s:2:"ε";s:1:"";s:3:"∩";s:1:"";s:3:"≡";s:1:"";s:2:"±";s:1:"";s:3:"≥";s:1:"";s:3:"≤";s:1:"";s:3:"⌠";s:1:"";s:3:"⌡";s:1:"";s:2:"÷";s:1:"";s:3:"≈";s:1:"";s:2:"°";s:1:"";s:3:"∙";s:1:"";s:2:"·";s:1:"";s:3:"√";s:1:"";s:3:"ⁿ";s:1:"";s:2:"²";s:1:"";s:3:"■";s:1:"";s:2:" ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp863.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ç";s:1:"";s:2:"ü";s:1:"";s:2:"é";s:1:"";s:2:"â";s:1:"";s:2:"Â";s:1:"";s:2:"à";s:1:"";s:2:"¶";s:1:"";s:2:"ç";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"è";s:1:"";s:2:"ï";s:1:"";s:2:"î";s:1:"";s:3:"‗";s:1:"";s:2:"À";s:1:"";s:2:"§";s:1:"";s:2:"É";s:1:"";s:2:"È";s:1:"";s:2:"Ê";s:1:"";s:2:"ô";s:1:"";s:2:"Ë";s:1:"";s:2:"Ï";s:1:"";s:2:"û";s:1:"";s:2:"ù";s:1:"";s:2:"¤";s:1:"";s:2:"Ô";s:1:"";s:2:"Ü";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"Ù";s:1:"";s:2:"Û";s:1:"";s:2:"ƒ";s:1:"";s:2:"¦";s:1:"";s:2:"´";s:1:"";s:2:"ó";s:1:"";s:2:"ú";s:1:"";s:2:"¨";s:1:"";s:2:"¸";s:1:"";s:2:"³";s:1:"";s:2:"¯";s:1:"";s:2:"Î";s:1:"";s:3:"⌐";s:1:"";s:2:"¬";s:1:"";s:2:"½";s:1:"";s:2:"¼";s:1:"";s:2:"¾";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:3:"╡";s:1:"";s:3:"╢";s:1:"";s:3:"╖";s:1:"";s:3:"╕";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:3:"╜";s:1:"";s:3:"╛";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:3:"╞";s:1:"";s:3:"╟";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:3:"╧";s:1:"";s:3:"╨";s:1:"";s:3:"╤";s:1:"";s:3:"╥";s:1:"";s:3:"╙";s:1:"";s:3:"╘";s:1:"";s:3:"╒";s:1:"";s:3:"╓";s:1:"";s:3:"╫";s:1:"";s:3:"╪";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:3:"▌";s:1:"";s:3:"▐";s:1:"";s:3:"▀";s:1:"";s:2:"α";s:1:"";s:2:"ß";s:1:"";s:2:"Γ";s:1:"";s:2:"π";s:1:"";s:2:"Σ";s:1:"";s:2:"σ";s:1:"";s:2:"µ";s:1:"";s:2:"τ";s:1:"";s:2:"Φ";s:1:"";s:2:"Θ";s:1:"";s:2:"Ω";s:1:"";s:2:"δ";s:1:"";s:3:"∞";s:1:"";s:2:"φ";s:1:"";s:2:"ε";s:1:"";s:3:"∩";s:1:"";s:3:"≡";s:1:"";s:2:"±";s:1:"";s:3:"≥";s:1:"";s:3:"≤";s:1:"";s:3:"⌠";s:1:"";s:3:"⌡";s:1:"";s:2:"÷";s:1:"";s:3:"≈";s:1:"";s:2:"°";s:1:"";s:3:"∙";s:1:"";s:2:"·";s:1:"";s:3:"√";s:1:"";s:3:"ⁿ";s:1:"";s:2:"²";s:1:"";s:3:"■";s:1:"";s:2:" ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp864.ser
@@ -0,0 +1,3 @@
+a:250:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:2:"٪";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"°";s:1:"";s:2:"·";s:1:"";s:3:"∙";s:1:"";s:3:"√";s:1:"";s:3:"▒";s:1:"";s:3:"─";s:1:"";s:3:"│";s:1:"";s:3:"┼";s:1:"";s:3:"┤";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"┴";s:1:"";s:3:"┐";s:1:"";s:3:"┌";s:1:"";s:3:"└";s:1:"";s:3:"┘";s:1:"";s:2:"β";s:1:"";s:3:"∞";s:1:"";s:2:"φ";s:1:"";s:2:"±";s:1:"";s:2:"½";s:1:"";s:2:"¼";s:1:"";s:3:"≈";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"ﻷ";s:1:"";s:3:"ﻸ";s:1:"";s:3:"ﻻ";s:1:"";s:3:"ﻼ";s:1:"";s:2:" ";s:1:"";s:2:"­";s:1:"";s:3:"ﺂ";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:3:"ﺄ";s:1:"";s:3:"ﺎ";s:1:"";s:3:"ﺏ";s:1:"";s:3:"ﺕ";s:1:"";s:3:"ﺙ";s:1:"";s:2:"،";s:1:"";s:3:"ﺝ";s:1:"";s:3:"ﺡ";s:1:"";s:3:"ﺥ";s:1:"";s:2:"٠";s:1:"";s:2:"١";s:1:"";s:2:"٢";s:1:"";s:2:"٣";s:1:"";s:2:"٤";s:1:"";s:2:"٥";s:1:"";s:2:"٦";s:1:"";s:2:"٧";s:1:"";s:2:"٨";s:1:"";s:2:"٩";s:1:"";s:3:"ﻑ";s:1:"";s:2:"؛";s:1:"";s:3:"ﺱ";s:1:"";s:3:"ﺵ";s:1:"";s:3:"ﺹ";s:1:"";s:2:"؟";s:1:"";s:2:"¢";s:1:"";s:3:"ﺀ";s:1:"";s:3:"ﺁ";s:1:"";s:3:"ﺃ";s:1:"";s:3:"ﺅ";s:1:"";s:3:"ﻊ";s:1:"";s:3:"ﺋ";s:1:"";s:3:"ﺍ";s:1:"";s:3:"ﺑ";s:1:"";s:3:"ﺓ";s:1:"";s:3:"ﺗ";s:1:"";s:3:"ﺛ";s:1:"";s:3:"ﺟ";s:1:"";s:3:"ﺣ";s:1:"";s:3:"ﺧ";s:1:"";s:3:"ﺩ";s:1:"";s:3:"ﺫ";s:1:"";s:3:"ﺭ";s:1:"";s:3:"ﺯ";s:1:"";s:3:"ﺳ";s:1:"";s:3:"ﺷ";s:1:"";s:3:"ﺻ";s:1:"";s:3:"ﺿ";s:1:"";s:3:"ﻁ";s:1:"";s:3:"ﻅ";s:1:"";s:3:"ﻋ";s:1:"";s:3:"ﻏ";s:1:"";s:2:"¦";s:1:"";s:2:"¬";s:1:"";s:2:"÷";s:1:"";s:2:"×";s:1:"";s:3:"ﻉ";s:1:"";s:2:"ـ";s:1:"";s:3:"ﻓ";s:1:"";s:3:"ﻗ";s:1:"";s:3:"ﻛ";s:1:"";s:3:"ﻟ";s:1:"";s:3:"ﻣ";s:1:"";s:3:"ﻧ";s:1:"";s:3:"ﻫ";s:1:"";s:3:"ﻭ";s:1:"";s:3:"ﻯ";s:1:"";s:3:"ﻳ";s:1:"";s:3:"ﺽ";s:1:"";s:3:"ﻌ";s:1:"";s:3:"ﻎ";s:1:"";s:3:"ﻍ";s:1:"";s:3:"ﻡ";s:1:"";s:3:"ﹽ";s:1:"";s:2:"ّ";s:1:"";s:3:"ﻥ";s:1:"";s:3:"ﻩ";s:1:"";s:3:"ﻬ";s:1:"";s:3:"ﻰ";s:1:"";s:3:"ﻲ";s:1:"";s:3:"ﻐ";s:1:"";s:3:"ﻕ";s:1:"";s:3:"ﻵ";s:1:"";s:3:"ﻶ";s:1:"";s:3:"ﻝ";s:1:"";s:3:"ﻙ";s:1:"";s:3:"ﻱ";s:1:"";s:3:"■";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp865.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ç";s:1:"";s:2:"ü";s:1:"";s:2:"é";s:1:"";s:2:"â";s:1:"";s:2:"ä";s:1:"";s:2:"à";s:1:"";s:2:"å";s:1:"";s:2:"ç";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"è";s:1:"";s:2:"ï";s:1:"";s:2:"î";s:1:"";s:2:"ì";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"É";s:1:"";s:2:"æ";s:1:"";s:2:"Æ";s:1:"";s:2:"ô";s:1:"";s:2:"ö";s:1:"";s:2:"ò";s:1:"";s:2:"û";s:1:"";s:2:"ù";s:1:"";s:2:"ÿ";s:1:"";s:2:"Ö";s:1:"";s:2:"Ü";s:1:"";s:2:"ø";s:1:"";s:2:"£";s:1:"";s:2:"Ø";s:1:"";s:3:"₧";s:1:"";s:2:"ƒ";s:1:"";s:2:"á";s:1:"";s:2:"í";s:1:"";s:2:"ó";s:1:"";s:2:"ú";s:1:"";s:2:"ñ";s:1:"";s:2:"Ñ";s:1:"";s:2:"ª";s:1:"";s:2:"º";s:1:"";s:2:"¿";s:1:"";s:3:"⌐";s:1:"";s:2:"¬";s:1:"";s:2:"½";s:1:"";s:2:"¼";s:1:"";s:2:"¡";s:1:"";s:2:"«";s:1:"";s:2:"¤";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:3:"╡";s:1:"";s:3:"╢";s:1:"";s:3:"╖";s:1:"";s:3:"╕";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:3:"╜";s:1:"";s:3:"╛";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:3:"╞";s:1:"";s:3:"╟";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:3:"╧";s:1:"";s:3:"╨";s:1:"";s:3:"╤";s:1:"";s:3:"╥";s:1:"";s:3:"╙";s:1:"";s:3:"╘";s:1:"";s:3:"╒";s:1:"";s:3:"╓";s:1:"";s:3:"╫";s:1:"";s:3:"╪";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:3:"▌";s:1:"";s:3:"▐";s:1:"";s:3:"▀";s:1:"";s:2:"α";s:1:"";s:2:"ß";s:1:"";s:2:"Γ";s:1:"";s:2:"π";s:1:"";s:2:"Σ";s:1:"";s:2:"σ";s:1:"";s:2:"µ";s:1:"";s:2:"τ";s:1:"";s:2:"Φ";s:1:"";s:2:"Θ";s:1:"";s:2:"Ω";s:1:"";s:2:"δ";s:1:"";s:3:"∞";s:1:"";s:2:"φ";s:1:"";s:2:"ε";s:1:"";s:3:"∩";s:1:"";s:3:"≡";s:1:"";s:2:"±";s:1:"";s:3:"≥";s:1:"";s:3:"≤";s:1:"";s:3:"⌠";s:1:"";s:3:"⌡";s:1:"";s:2:"÷";s:1:"";s:3:"≈";s:1:"";s:2:"°";s:1:"";s:3:"∙";s:1:"";s:2:"·";s:1:"";s:3:"√";s:1:"";s:3:"ⁿ";s:1:"";s:2:"²";s:1:"";s:3:"■";s:1:"";s:2:" ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp866.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"А";s:1:"";s:2:"Б";s:1:"";s:2:"В";s:1:"";s:2:"Г";s:1:"";s:2:"Д";s:1:"";s:2:"Е";s:1:"";s:2:"Ж";s:1:"";s:2:"З";s:1:"";s:2:"И";s:1:"";s:2:"Й";s:1:"";s:2:"К";s:1:"";s:2:"Л";s:1:"";s:2:"М";s:1:"";s:2:"Н";s:1:"";s:2:"О";s:1:"";s:2:"П";s:1:"";s:2:"Р";s:1:"";s:2:"С";s:1:"";s:2:"Т";s:1:"";s:2:"У";s:1:"";s:2:"Ф";s:1:"";s:2:"Х";s:1:"";s:2:"Ц";s:1:"";s:2:"Ч";s:1:"";s:2:"Ш";s:1:"";s:2:"Щ";s:1:"";s:2:"Ъ";s:1:"";s:2:"Ы";s:1:"";s:2:"Ь";s:1:"";s:2:"Э";s:1:"";s:2:"Ю";s:1:"";s:2:"Я";s:1:"";s:2:"а";s:1:"";s:2:"б";s:1:"";s:2:"в";s:1:"";s:2:"г";s:1:"";s:2:"д";s:1:"";s:2:"е";s:1:"";s:2:"ж";s:1:"";s:2:"з";s:1:"";s:2:"и";s:1:"";s:2:"й";s:1:"";s:2:"к";s:1:"";s:2:"л";s:1:"";s:2:"м";s:1:"";s:2:"н";s:1:"";s:2:"о";s:1:"";s:2:"п";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:3:"╡";s:1:"";s:3:"╢";s:1:"";s:3:"╖";s:1:"";s:3:"╕";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:3:"╜";s:1:"";s:3:"╛";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:3:"╞";s:1:"";s:3:"╟";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:3:"╧";s:1:"";s:3:"╨";s:1:"";s:3:"╤";s:1:"";s:3:"╥";s:1:"";s:3:"╙";s:1:"";s:3:"╘";s:1:"";s:3:"╒";s:1:"";s:3:"╓";s:1:"";s:3:"╫";s:1:"";s:3:"╪";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:3:"▌";s:1:"";s:3:"▐";s:1:"";s:3:"▀";s:1:"";s:2:"р";s:1:"";s:2:"с";s:1:"";s:2:"т";s:1:"";s:2:"у";s:1:"";s:2:"ф";s:1:"";s:2:"х";s:1:"";s:2:"ц";s:1:"";s:2:"ч";s:1:"";s:2:"ш";s:1:"";s:2:"щ";s:1:"";s:2:"ъ";s:1:"";s:2:"ы";s:1:"";s:2:"ь";s:1:"";s:2:"э";s:1:"";s:2:"ю";s:1:"";s:2:"я";s:1:"";s:2:"Ё";s:1:"";s:2:"ё";s:1:"";s:2:"Є";s:1:"";s:2:"є";s:1:"";s:2:"Ї";s:1:"";s:2:"ї";s:1:"";s:2:"Ў";s:1:"";s:2:"ў";s:1:"";s:2:"°";s:1:"";s:3:"∙";s:1:"";s:2:"·";s:1:"";s:3:"√";s:1:"";s:3:"№";s:1:"";s:2:"¤";s:1:"";s:3:"■";s:1:"";s:2:" ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp869.ser
@@ -0,0 +1,3 @@
+a:247:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ά";s:1:"";s:2:"·";s:1:"";s:2:"¬";s:1:"";s:2:"¦";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:2:"Έ";s:1:"";s:3:"―";s:1:"";s:2:"Ή";s:1:"";s:2:"Ί";s:1:"";s:2:"Ϊ";s:1:"";s:2:"Ό";s:1:"";s:2:"Ύ";s:1:"";s:2:"Ϋ";s:1:"";s:2:"©";s:1:"";s:2:"Ώ";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"ά";s:1:"";s:2:"£";s:1:"";s:2:"έ";s:1:"";s:2:"ή";s:1:"";s:2:"ί";s:1:"";s:2:"ϊ";s:1:"";s:2:"ΐ";s:1:"";s:2:"ό";s:1:"";s:2:"ύ";s:1:"";s:2:"Α";s:1:"";s:2:"Β";s:1:"";s:2:"Γ";s:1:"";s:2:"Δ";s:1:"";s:2:"Ε";s:1:"";s:2:"Ζ";s:1:"";s:2:"Η";s:1:"";s:2:"½";s:1:"";s:2:"Θ";s:1:"";s:2:"Ι";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:2:"Κ";s:1:"";s:2:"Λ";s:1:"";s:2:"Μ";s:1:"";s:2:"Ν";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:2:"Ξ";s:1:"";s:2:"Ο";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:2:"Π";s:1:"";s:2:"Ρ";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:2:"Σ";s:1:"";s:2:"Τ";s:1:"";s:2:"Υ";s:1:"";s:2:"Φ";s:1:"";s:2:"Χ";s:1:"";s:2:"Ψ";s:1:"";s:2:"Ω";s:1:"";s:2:"α";s:1:"";s:2:"β";s:1:"";s:2:"γ";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:2:"δ";s:1:"";s:2:"ε";s:1:"";s:3:"▀";s:1:"";s:2:"ζ";s:1:"";s:2:"η";s:1:"";s:2:"θ";s:1:"";s:2:"ι";s:1:"";s:2:"κ";s:1:"";s:2:"λ";s:1:"";s:2:"μ";s:1:"";s:2:"ν";s:1:"";s:2:"ξ";s:1:"";s:2:"ο";s:1:"";s:2:"π";s:1:"";s:2:"ρ";s:1:"";s:2:"σ";s:1:"";s:2:"ς";s:1:"";s:2:"τ";s:1:"";s:2:"΄";s:1:"";s:2:"­";s:1:"";s:2:"±";s:1:"";s:2:"υ";s:1:"";s:2:"φ";s:1:"";s:2:"χ";s:1:"";s:2:"§";s:1:"";s:2:"ψ";s:1:"";s:2:"΅";s:1:"";s:2:"°";s:1:"";s:2:"¨";s:1:"";s:2:"ω";s:1:"";s:2:"ϋ";s:1:"";s:2:"ΰ";s:1:"";s:2:"ώ";s:1:"";s:3:"■";s:1:"";s:2:" ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp874.ser
@@ -0,0 +1,3 @@
+a:225:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:3:"€";s:1:"";s:3:"…";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"•";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:2:" ";s:1:"";s:3:"ก";s:1:"";s:3:"ข";s:1:"";s:3:"ฃ";s:1:"";s:3:"ค";s:1:"";s:3:"ฅ";s:1:"";s:3:"ฆ";s:1:"";s:3:"ง";s:1:"";s:3:"จ";s:1:"";s:3:"ฉ";s:1:"";s:3:"ช";s:1:"";s:3:"ซ";s:1:"";s:3:"ฌ";s:1:"";s:3:"ญ";s:1:"";s:3:"ฎ";s:1:"";s:3:"ฏ";s:1:"";s:3:"ฐ";s:1:"";s:3:"ฑ";s:1:"";s:3:"ฒ";s:1:"";s:3:"ณ";s:1:"";s:3:"ด";s:1:"";s:3:"ต";s:1:"";s:3:"ถ";s:1:"";s:3:"ท";s:1:"";s:3:"ธ";s:1:"";s:3:"น";s:1:"";s:3:"บ";s:1:"";s:3:"ป";s:1:"";s:3:"ผ";s:1:"";s:3:"ฝ";s:1:"";s:3:"พ";s:1:"";s:3:"ฟ";s:1:"";s:3:"ภ";s:1:"";s:3:"ม";s:1:"";s:3:"ย";s:1:"";s:3:"ร";s:1:"";s:3:"ฤ";s:1:"";s:3:"ล";s:1:"";s:3:"ฦ";s:1:"";s:3:"ว";s:1:"";s:3:"ศ";s:1:"";s:3:"ษ";s:1:"";s:3:"ส";s:1:"";s:3:"ห";s:1:"";s:3:"ฬ";s:1:"";s:3:"อ";s:1:"";s:3:"ฮ";s:1:"";s:3:"ฯ";s:1:"";s:3:"ะ";s:1:"";s:3:"ั";s:1:"";s:3:"า";s:1:"";s:3:"ำ";s:1:"";s:3:"ิ";s:1:"";s:3:"ี";s:1:"";s:3:"ึ";s:1:"";s:3:"ื";s:1:"";s:3:"ุ";s:1:"";s:3:"ู";s:1:"";s:3:"ฺ";s:1:"";s:3:"฿";s:1:"";s:3:"เ";s:1:"";s:3:"แ";s:1:"";s:3:"โ";s:1:"";s:3:"ใ";s:1:"";s:3:"ไ";s:1:"";s:3:"ๅ";s:1:"";s:3:"ๆ";s:1:"";s:3:"็";s:1:"";s:3:"่";s:1:"";s:3:"้";s:1:"";s:3:"๊";s:1:"";s:3:"๋";s:1:"";s:3:"์";s:1:"";s:3:"ํ";s:1:"";s:3:"๎";s:1:"";s:3:"๏";s:1:"";s:3:"๐";s:1:"";s:3:"๑";s:1:"";s:3:"๒";s:1:"";s:3:"๓";s:1:"";s:3:"๔";s:1:"";s:3:"๕";s:1:"";s:3:"๖";s:1:"";s:3:"๗";s:1:"";s:3:"๘";s:1:"";s:3:"๙";s:1:"";s:3:"๚";s:1:"";s:3:"๛";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp875.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:1:"	";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"	";s:2:"";s:1:"
+";s:2:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:2:"";s:1:"!";s:2:"";s:1:""";s:2:"";s:1:"#";s:2:"";s:1:"$";s:2:"";s:1:"%";s:1:"
+";s:1:"&";s:1:"";s:1:"'";s:1:"";s:1:"(";s:2:"";s:1:")";s:2:"";s:1:"*";s:2:"";s:1:"+";s:2:"";s:1:",";s:2:"";s:1:"-";s:1:"";s:1:".";s:1:"";s:1:"/";s:1:"";i:0;s:2:"";i:1;s:2:"";i:2;s:1:"";i:3;s:2:"";i:4;s:2:"";i:5;s:2:"";i:6;s:2:"";i:7;s:1:"";i:8;s:2:"";i:9;s:2:"";s:1:":";s:2:"";s:1:";";s:2:"";s:1:"<";s:1:"";s:1:"=";s:1:"";s:1:">";s:2:"";s:1:"?";s:1:"";s:1:"@";s:1:" ";s:1:"A";s:2:"Α";s:1:"B";s:2:"Β";s:1:"C";s:2:"Γ";s:1:"D";s:2:"Δ";s:1:"E";s:2:"Ε";s:1:"F";s:2:"Ζ";s:1:"G";s:2:"Η";s:1:"H";s:2:"Θ";s:1:"I";s:2:"Ι";s:1:"J";s:1:"[";s:1:"K";s:1:".";s:1:"L";s:1:"<";s:1:"M";s:1:"(";s:1:"N";s:1:"+";s:1:"O";s:1:"!";s:1:"P";s:1:"&";s:1:"Q";s:2:"Κ";s:1:"R";s:2:"Λ";s:1:"S";s:2:"Μ";s:1:"T";s:2:"Ν";s:1:"U";s:2:"Ξ";s:1:"V";s:2:"Ο";s:1:"W";s:2:"Π";s:1:"X";s:2:"Ρ";s:1:"Y";s:2:"Σ";s:1:"Z";s:1:"]";s:1:"[";s:1:"$";s:1:"\";s:1:"*";s:1:"]";s:1:")";s:1:"^";s:1:";";s:1:"_";s:1:"^";s:1:"`";s:1:"-";s:1:"a";s:1:"/";s:1:"b";s:2:"Τ";s:1:"c";s:2:"Υ";s:1:"d";s:2:"Φ";s:1:"e";s:2:"Χ";s:1:"f";s:2:"Ψ";s:1:"g";s:2:"Ω";s:1:"h";s:2:"Ϊ";s:1:"i";s:2:"Ϋ";s:1:"j";s:1:"|";s:1:"k";s:1:",";s:1:"l";s:1:"%";s:1:"m";s:1:"_";s:1:"n";s:1:">";s:1:"o";s:1:"?";s:1:"p";s:2:"¨";s:1:"q";s:2:"Ά";s:1:"r";s:2:"Έ";s:1:"s";s:2:"Ή";s:1:"t";s:2:" ";s:1:"u";s:2:"Ί";s:1:"v";s:2:"Ό";s:1:"w";s:2:"Ύ";s:1:"x";s:2:"Ώ";s:1:"y";s:1:"`";s:1:"z";s:1:":";s:1:"{";s:1:"#";s:1:"|";s:1:"@";s:1:"}";s:1:"'";s:1:"~";s:1:"=";s:1:"";s:1:""";s:1:"";s:2:"΅";s:1:"";s:1:"a";s:1:"";s:1:"b";s:1:"";s:1:"c";s:1:"";s:1:"d";s:1:"";s:1:"e";s:1:"";s:1:"f";s:1:"";s:1:"g";s:1:"";s:1:"h";s:1:"";s:1:"i";s:1:"";s:2:"α";s:1:"";s:2:"β";s:1:"";s:2:"γ";s:1:"";s:2:"δ";s:1:"";s:2:"ε";s:1:"";s:2:"ζ";s:1:"";s:2:"°";s:1:"";s:1:"j";s:1:"";s:1:"k";s:1:"";s:1:"l";s:1:"";s:1:"m";s:1:"";s:1:"n";s:1:"";s:1:"o";s:1:"";s:1:"p";s:1:"";s:1:"q";s:1:"";s:1:"r";s:1:"";s:2:"η";s:1:"";s:2:"θ";s:1:"";s:2:"ι";s:1:"";s:2:"κ";s:1:"";s:2:"λ";s:1:"";s:2:"μ";s:1:"";s:2:"´";s:1:"";s:1:"~";s:1:"";s:1:"s";s:1:"";s:1:"t";s:1:"";s:1:"u";s:1:"";s:1:"v";s:1:"";s:1:"w";s:1:"";s:1:"x";s:1:"";s:1:"y";s:1:"";s:1:"z";s:1:"";s:2:"ν";s:1:"";s:2:"ξ";s:1:"";s:2:"ο";s:1:"";s:2:"π";s:1:"";s:2:"ρ";s:1:"";s:2:"σ";s:1:"";s:2:"£";s:1:"";s:2:"ά";s:1:"";s:2:"έ";s:1:"";s:2:"ή";s:1:"";s:2:"ϊ";s:1:"";s:2:"ί";s:1:"";s:2:"ό";s:1:"";s:2:"ύ";s:1:"";s:2:"ϋ";s:1:"";s:2:"ώ";s:1:"";s:2:"ς";s:1:"";s:2:"τ";s:1:"";s:2:"υ";s:1:"";s:2:"φ";s:1:"";s:2:"χ";s:1:"";s:2:"ψ";s:1:"";s:1:"{";s:1:"";s:1:"A";s:1:"";s:1:"B";s:1:"";s:1:"C";s:1:"";s:1:"D";s:1:"";s:1:"E";s:1:"";s:1:"F";s:1:"";s:1:"G";s:1:"";s:1:"H";s:1:"";s:1:"I";s:1:"";s:2:"­";s:1:"";s:2:"ω";s:1:"";s:2:"ΐ";s:1:"";s:2:"ΰ";s:1:"";s:3:"‘";s:1:"";s:3:"―";s:1:"";s:1:"}";s:1:"";s:1:"J";s:1:"";s:1:"K";s:1:"";s:1:"L";s:1:"";s:1:"M";s:1:"";s:1:"N";s:1:"";s:1:"O";s:1:"";s:1:"P";s:1:"";s:1:"Q";s:1:"";s:1:"R";s:1:"";s:2:"±";s:1:"";s:2:"½";s:1:"";s:1:"";s:1:"";s:2:"·";s:1:"";s:3:"’";s:1:"";s:2:"¦";s:1:"";s:1:"\";s:1:"";s:1:"";s:1:"";s:1:"S";s:1:"";s:1:"T";s:1:"";s:1:"U";s:1:"";s:1:"V";s:1:"";s:1:"W";s:1:"";s:1:"X";s:1:"";s:1:"Y";s:1:"";s:1:"Z";s:1:"";s:2:"²";s:1:"";s:2:"§";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:1:"0";s:1:"";s:1:"1";s:1:"";s:1:"2";s:1:"";s:1:"3";s:1:"";s:1:"4";s:1:"";s:1:"5";s:1:"";s:1:"6";s:1:"";s:1:"7";s:1:"";s:1:"8";s:1:"";s:1:"9";s:1:"";s:2:"³";s:1:"";s:2:"©";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:2:"»";s:1:"";s:2:"";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp932.ser
@@ -0,0 +1,3 @@
+a:7915:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:3:"｡";s:1:"";s:3:"｢";s:1:"";s:3:"｣";s:1:"";s:3:"､";s:1:"";s:3:"･";s:1:"";s:3:"ｦ";s:1:"";s:3:"ｧ";s:1:"";s:3:"ｨ";s:1:"";s:3:"ｩ";s:1:"";s:3:"ｪ";s:1:"";s:3:"ｫ";s:1:"";s:3:"ｬ";s:1:"";s:3:"ｭ";s:1:"";s:3:"ｮ";s:1:"";s:3:"ｯ";s:1:"";s:3:"ｰ";s:1:"";s:3:"ｱ";s:1:"";s:3:"ｲ";s:1:"";s:3:"ｳ";s:1:"";s:3:"ｴ";s:1:"";s:3:"ｵ";s:1:"";s:3:"ｶ";s:1:"";s:3:"ｷ";s:1:"";s:3:"ｸ";s:1:"";s:3:"ｹ";s:1:"";s:3:"ｺ";s:1:"";s:3:"ｻ";s:1:"";s:3:"ｼ";s:1:"";s:3:"ｽ";s:1:"";s:3:"ｾ";s:1:"";s:3:"ｿ";s:1:"";s:3:"ﾀ";s:1:"";s:3:"ﾁ";s:1:"";s:3:"ﾂ";s:1:"";s:3:"ﾃ";s:1:"";s:3:"ﾄ";s:1:"";s:3:"ﾅ";s:1:"";s:3:"ﾆ";s:1:"";s:3:"ﾇ";s:1:"";s:3:"ﾈ";s:1:"";s:3:"ﾉ";s:1:"";s:3:"ﾊ";s:1:"";s:3:"ﾋ";s:1:"";s:3:"ﾌ";s:1:"";s:3:"ﾍ";s:1:"";s:3:"ﾎ";s:1:"";s:3:"ﾏ";s:1:"";s:3:"ﾐ";s:1:"";s:3:"ﾑ";s:1:"";s:3:"ﾒ";s:1:"";s:3:"ﾓ";s:1:"";s:3:"ﾔ";s:1:"";s:3:"ﾕ";s:1:"";s:3:"ﾖ";s:1:"";s:3:"ﾗ";s:1:"";s:3:"ﾘ";s:1:"";s:3:"ﾙ";s:1:"";s:3:"ﾚ";s:1:"";s:3:"ﾛ";s:1:"";s:3:"ﾜ";s:1:"";s:3:"ﾝ";s:1:"";s:3:"ﾞ";s:1:"";s:3:"ﾟ";s:2:"@";s:3:"　";s:2:"A";s:3:"、";s:2:"B";s:3:"。";s:2:"C";s:3:"，";s:2:"D";s:3:"．";s:2:"E";s:3:"・";s:2:"F";s:3:"：";s:2:"G";s:3:"；";s:2:"H";s:3:"？";s:2:"I";s:3:"！";s:2:"J";s:3:"゛";s:2:"K";s:3:"゜";s:2:"L";s:2:"´";s:2:"M";s:3:"｀";s:2:"N";s:2:"¨";s:2:"O";s:3:"＾";s:2:"P";s:3:"￣";s:2:"Q";s:3:"＿";s:2:"R";s:3:"ヽ";s:2:"S";s:3:"ヾ";s:2:"T";s:3:"ゝ";s:2:"U";s:3:"ゞ";s:2:"V";s:3:"〃";s:2:"W";s:3:"仝";s:2:"X";s:3:"々";s:2:"Y";s:3:"〆";s:2:"Z";s:3:"〇";s:2:"[";s:3:"ー";s:2:"\";s:3:"―";s:2:"]";s:3:"‐";s:2:"^";s:3:"／";s:2:"_";s:3:"＼";s:2:"`";s:3:"～";s:2:"a";s:3:"∥";s:2:"b";s:3:"｜";s:2:"c";s:3:"…";s:2:"d";s:3:"‥";s:2:"e";s:3:"‘";s:2:"f";s:3:"’";s:2:"g";s:3:"“";s:2:"h";s:3:"”";s:2:"i";s:3:"（";s:2:"j";s:3:"）";s:2:"k";s:3:"〔";s:2:"l";s:3:"〕";s:2:"m";s:3:"［";s:2:"n";s:3:"］";s:2:"o";s:3:"｛";s:2:"p";s:3:"｝";s:2:"q";s:3:"〈";s:2:"r";s:3:"〉";s:2:"s";s:3:"《";s:2:"t";s:3:"》";s:2:"u";s:3:"「";s:2:"v";s:3:"」";s:2:"w";s:3:"『";s:2:"x";s:3:"』";s:2:"y";s:3:"【";s:2:"z";s:3:"】";s:2:"{";s:3:"＋";s:2:"|";s:3:"－";s:2:"}";s:2:"±";s:2:"~";s:2:"×";s:2:"";s:2:"÷";s:2:"";s:3:"＝";s:2:"";s:3:"≠";s:2:"";s:3:"＜";s:2:"";s:3:"＞";s:2:"";s:3:"≦";s:2:"";s:3:"≧";s:2:"";s:3:"∞";s:2:"";s:3:"∴";s:2:"";s:3:"♂";s:2:"";s:3:"♀";s:2:"";s:2:"°";s:2:"";s:3:"′";s:2:"";s:3:"″";s:2:"";s:3:"℃";s:2:"";s:3:"￥";s:2:"";s:3:"＄";s:2:"";s:3:"￠";s:2:"";s:3:"￡";s:2:"";s:3:"％";s:2:"";s:3:"＃";s:2:"";s:3:"＆";s:2:"";s:3:"＊";s:2:"";s:3:"＠";s:2:"";s:2:"§";s:2:"";s:3:"☆";s:2:"";s:3:"★";s:2:"";s:3:"○";s:2:"";s:3:"●";s:2:"";s:3:"◎";s:2:"";s:3:"◇";s:2:"";s:3:"◆";s:2:"";s:3:"□";s:2:"";s:3:"■";s:2:"";s:3:"△";s:2:"";s:3:"▲";s:2:"";s:3:"▽";s:2:"";s:3:"▼";s:2:"";s:3:"※";s:2:"";s:3:"〒";s:2:"";s:3:"→";s:2:"";s:3:"←";s:2:"";s:3:"↑";s:2:"";s:3:"↓";s:2:"";s:3:"〓";s:2:"";s:3:"∈";s:2:"";s:3:"∋";s:2:"";s:3:"⊆";s:2:"";s:3:"⊇";s:2:"";s:3:"⊂";s:2:"";s:3:"⊃";s:2:"";s:3:"∪";s:2:"";s:3:"∩";s:2:"";s:3:"∧";s:2:"";s:3:"∨";s:2:"";s:3:"￢";s:2:"";s:3:"⇒";s:2:"";s:3:"⇔";s:2:"";s:3:"∀";s:2:"";s:3:"∃";s:2:"";s:3:"∠";s:2:"";s:3:"⊥";s:2:"";s:3:"⌒";s:2:"";s:3:"∂";s:2:"";s:3:"∇";s:2:"";s:3:"≡";s:2:"";s:3:"≒";s:2:"";s:3:"≪";s:2:"";s:3:"≫";s:2:"";s:3:"√";s:2:"";s:3:"∽";s:2:"";s:3:"∝";s:2:"";s:3:"∵";s:2:"";s:3:"∫";s:2:"";s:3:"∬";s:2:"";s:3:"Å";s:2:"";s:3:"‰";s:2:"";s:3:"♯";s:2:"";s:3:"♭";s:2:"";s:3:"♪";s:2:"";s:3:"†";s:2:"";s:3:"‡";s:2:"";s:2:"¶";s:2:"";s:3:"◯";s:2:"O";s:3:"０";s:2:"P";s:3:"１";s:2:"Q";s:3:"２";s:2:"R";s:3:"３";s:2:"S";s:3:"４";s:2:"T";s:3:"５";s:2:"U";s:3:"６";s:2:"V";s:3:"７";s:2:"W";s:3:"８";s:2:"X";s:3:"９";s:2:"`";s:3:"Ａ";s:2:"a";s:3:"Ｂ";s:2:"b";s:3:"Ｃ";s:2:"c";s:3:"Ｄ";s:2:"d";s:3:"Ｅ";s:2:"e";s:3:"Ｆ";s:2:"f";s:3:"Ｇ";s:2:"g";s:3:"Ｈ";s:2:"h";s:3:"Ｉ";s:2:"i";s:3:"Ｊ";s:2:"j";s:3:"Ｋ";s:2:"k";s:3:"Ｌ";s:2:"l";s:3:"Ｍ";s:2:"m";s:3:"Ｎ";s:2:"n";s:3:"Ｏ";s:2:"o";s:3:"Ｐ";s:2:"p";s:3:"Ｑ";s:2:"q";s:3:"Ｒ";s:2:"r";s:3:"Ｓ";s:2:"s";s:3:"Ｔ";s:2:"t";s:3:"Ｕ";s:2:"u";s:3:"Ｖ";s:2:"v";s:3:"Ｗ";s:2:"w";s:3:"Ｘ";s:2:"x";s:3:"Ｙ";s:2:"y";s:3:"Ｚ";s:2:"";s:3:"ａ";s:2:"";s:3:"ｂ";s:2:"";s:3:"ｃ";s:2:"";s:3:"ｄ";s:2:"";s:3:"ｅ";s:2:"";s:3:"ｆ";s:2:"";s:3:"ｇ";s:2:"";s:3:"ｈ";s:2:"";s:3:"ｉ";s:2:"";s:3:"ｊ";s:2:"";s:3:"ｋ";s:2:"";s:3:"ｌ";s:2:"";s:3:"ｍ";s:2:"";s:3:"ｎ";s:2:"";s:3:"ｏ";s:2:"";s:3:"ｐ";s:2:"";s:3:"ｑ";s:2:"";s:3:"ｒ";s:2:"";s:3:"ｓ";s:2:"";s:3:"ｔ";s:2:"";s:3:"ｕ";s:2:"";s:3:"ｖ";s:2:"";s:3:"ｗ";s:2:"";s:3:"ｘ";s:2:"";s:3:"ｙ";s:2:"";s:3:"ｚ";s:2:"";s:3:"ぁ";s:2:"";s:3:"あ";s:2:"";s:3:"ぃ";s:2:"";s:3:"い";s:2:"";s:3:"ぅ";s:2:"";s:3:"う";s:2:"";s:3:"ぇ";s:2:"";s:3:"え";s:2:"";s:3:"ぉ";s:2:"";s:3:"お";s:2:"";s:3:"か";s:2:"";s:3:"が";s:2:"";s:3:"き";s:2:"";s:3:"ぎ";s:2:"";s:3:"く";s:2:"";s:3:"ぐ";s:2:"";s:3:"け";s:2:"";s:3:"げ";s:2:"";s:3:"こ";s:2:"";s:3:"ご";s:2:"";s:3:"さ";s:2:"";s:3:"ざ";s:2:"";s:3:"し";s:2:"";s:3:"じ";s:2:"";s:3:"す";s:2:"";s:3:"ず";s:2:"";s:3:"せ";s:2:"";s:3:"ぜ";s:2:"";s:3:"そ";s:2:"";s:3:"ぞ";s:2:"";s:3:"た";s:2:"";s:3:"だ";s:2:"";s:3:"ち";s:2:"";s:3:"ぢ";s:2:"";s:3:"っ";s:2:"";s:3:"つ";s:2:"";s:3:"づ";s:2:"";s:3:"て";s:2:"";s:3:"で";s:2:"";s:3:"と";s:2:"";s:3:"ど";s:2:"";s:3:"な";s:2:"";s:3:"に";s:2:"";s:3:"ぬ";s:2:"";s:3:"ね";s:2:"";s:3:"の";s:2:"";s:3:"は";s:2:"";s:3:"ば";s:2:"";s:3:"ぱ";s:2:"";s:3:"ひ";s:2:"";s:3:"び";s:2:"";s:3:"ぴ";s:2:"";s:3:"ふ";s:2:"";s:3:"ぶ";s:2:"";s:3:"ぷ";s:2:"";s:3:"へ";s:2:"";s:3:"べ";s:2:"";s:3:"ぺ";s:2:"";s:3:"ほ";s:2:"";s:3:"ぼ";s:2:"";s:3:"ぽ";s:2:"";s:3:"ま";s:2:"";s:3:"み";s:2:"";s:3:"む";s:2:"";s:3:"め";s:2:"";s:3:"も";s:2:"";s:3:"ゃ";s:2:"";s:3:"や";s:2:"";s:3:"ゅ";s:2:"";s:3:"ゆ";s:2:"";s:3:"ょ";s:2:"";s:3:"よ";s:2:"";s:3:"ら";s:2:"";s:3:"り";s:2:"";s:3:"る";s:2:"";s:3:"れ";s:2:"";s:3:"ろ";s:2:"";s:3:"ゎ";s:2:"";s:3:"わ";s:2:"";s:3:"ゐ";s:2:"";s:3:"ゑ";s:2:"";s:3:"を";s:2:"";s:3:"ん";s:2:"@";s:3:"ァ";s:2:"A";s:3:"ア";s:2:"B";s:3:"ィ";s:2:"C";s:3:"イ";s:2:"D";s:3:"ゥ";s:2:"E";s:3:"ウ";s:2:"F";s:3:"ェ";s:2:"G";s:3:"エ";s:2:"H";s:3:"ォ";s:2:"I";s:3:"オ";s:2:"J";s:3:"カ";s:2:"K";s:3:"ガ";s:2:"L";s:3:"キ";s:2:"M";s:3:"ギ";s:2:"N";s:3:"ク";s:2:"O";s:3:"グ";s:2:"P";s:3:"ケ";s:2:"Q";s:3:"ゲ";s:2:"R";s:3:"コ";s:2:"S";s:3:"ゴ";s:2:"T";s:3:"サ";s:2:"U";s:3:"ザ";s:2:"V";s:3:"シ";s:2:"W";s:3:"ジ";s:2:"X";s:3:"ス";s:2:"Y";s:3:"ズ";s:2:"Z";s:3:"セ";s:2:"[";s:3:"ゼ";s:2:"\";s:3:"ソ";s:2:"]";s:3:"ゾ";s:2:"^";s:3:"タ";s:2:"_";s:3:"ダ";s:2:"`";s:3:"チ";s:2:"a";s:3:"ヂ";s:2:"b";s:3:"ッ";s:2:"c";s:3:"ツ";s:2:"d";s:3:"ヅ";s:2:"e";s:3:"テ";s:2:"f";s:3:"デ";s:2:"g";s:3:"ト";s:2:"h";s:3:"ド";s:2:"i";s:3:"ナ";s:2:"j";s:3:"ニ";s:2:"k";s:3:"ヌ";s:2:"l";s:3:"ネ";s:2:"m";s:3:"ノ";s:2:"n";s:3:"ハ";s:2:"o";s:3:"バ";s:2:"p";s:3:"パ";s:2:"q";s:3:"ヒ";s:2:"r";s:3:"ビ";s:2:"s";s:3:"ピ";s:2:"t";s:3:"フ";s:2:"u";s:3:"ブ";s:2:"v";s:3:"プ";s:2:"w";s:3:"ヘ";s:2:"x";s:3:"ベ";s:2:"y";s:3:"ペ";s:2:"z";s:3:"ホ";s:2:"{";s:3:"ボ";s:2:"|";s:3:"ポ";s:2:"}";s:3:"マ";s:2:"~";s:3:"ミ";s:2:"";s:3:"ム";s:2:"";s:3:"メ";s:2:"";s:3:"モ";s:2:"";s:3:"ャ";s:2:"";s:3:"ヤ";s:2:"";s:3:"ュ";s:2:"";s:3:"ユ";s:2:"";s:3:"ョ";s:2:"";s:3:"ヨ";s:2:"";s:3:"ラ";s:2:"";s:3:"リ";s:2:"";s:3:"ル";s:2:"";s:3:"レ";s:2:"";s:3:"ロ";s:2:"";s:3:"ヮ";s:2:"";s:3:"ワ";s:2:"";s:3:"ヰ";s:2:"";s:3:"ヱ";s:2:"";s:3:"ヲ";s:2:"";s:3:"ン";s:2:"";s:3:"ヴ";s:2:"";s:3:"ヵ";s:2:"";s:3:"ヶ";s:2:"";s:2:"Α";s:2:"";s:2:"Β";s:2:"";s:2:"Γ";s:2:"";s:2:"Δ";s:2:"";s:2:"Ε";s:2:"";s:2:"Ζ";s:2:"";s:2:"Η";s:2:"";s:2:"Θ";s:2:"";s:2:"Ι";s:2:"";s:2:"Κ";s:2:"";s:2:"Λ";s:2:"";s:2:"Μ";s:2:"";s:2:"Ν";s:2:"";s:2:"Ξ";s:2:"";s:2:"Ο";s:2:"";s:2:"Π";s:2:"";s:2:"Ρ";s:2:"";s:2:"Σ";s:2:"";s:2:"Τ";s:2:"";s:2:"Υ";s:2:"";s:2:"Φ";s:2:"";s:2:"Χ";s:2:"";s:2:"Ψ";s:2:"";s:2:"Ω";s:2:"";s:2:"α";s:2:"";s:2:"β";s:2:"";s:2:"γ";s:2:"";s:2:"δ";s:2:"";s:2:"ε";s:2:"";s:2:"ζ";s:2:"";s:2:"η";s:2:"";s:2:"θ";s:2:"";s:2:"ι";s:2:"";s:2:"κ";s:2:"";s:2:"λ";s:2:"";s:2:"μ";s:2:"";s:2:"ν";s:2:"";s:2:"ξ";s:2:"";s:2:"ο";s:2:"";s:2:"π";s:2:"";s:2:"ρ";s:2:"";s:2:"σ";s:2:"";s:2:"τ";s:2:"";s:2:"υ";s:2:"";s:2:"φ";s:2:"";s:2:"χ";s:2:"";s:2:"ψ";s:2:"";s:2:"ω";s:2:"@";s:2:"А";s:2:"A";s:2:"Б";s:2:"B";s:2:"В";s:2:"C";s:2:"Г";s:2:"D";s:2:"Д";s:2:"E";s:2:"Е";s:2:"F";s:2:"Ё";s:2:"G";s:2:"Ж";s:2:"H";s:2:"З";s:2:"I";s:2:"И";s:2:"J";s:2:"Й";s:2:"K";s:2:"К";s:2:"L";s:2:"Л";s:2:"M";s:2:"М";s:2:"N";s:2:"Н";s:2:"O";s:2:"О";s:2:"P";s:2:"П";s:2:"Q";s:2:"Р";s:2:"R";s:2:"С";s:2:"S";s:2:"Т";s:2:"T";s:2:"У";s:2:"U";s:2:"Ф";s:2:"V";s:2:"Х";s:2:"W";s:2:"Ц";s:2:"X";s:2:"Ч";s:2:"Y";s:2:"Ш";s:2:"Z";s:2:"Щ";s:2:"[";s:2:"Ъ";s:2:"\";s:2:"Ы";s:2:"]";s:2:"Ь";s:2:"^";s:2:"Э";s:2:"_";s:2:"Ю";s:2:"`";s:2:"Я";s:2:"p";s:2:"а";s:2:"q";s:2:"б";s:2:"r";s:2:"в";s:2:"s";s:2:"г";s:2:"t";s:2:"д";s:2:"u";s:2:"е";s:2:"v";s:2:"ё";s:2:"w";s:2:"ж";s:2:"x";s:2:"з";s:2:"y";s:2:"и";s:2:"z";s:2:"й";s:2:"{";s:2:"к";s:2:"|";s:2:"л";s:2:"}";s:2:"м";s:2:"~";s:2:"н";s:2:"";s:2:"о";s:2:"";s:2:"п";s:2:"";s:2:"р";s:2:"";s:2:"с";s:2:"";s:2:"т";s:2:"";s:2:"у";s:2:"";s:2:"ф";s:2:"";s:2:"х";s:2:"";s:2:"ц";s:2:"";s:2:"ч";s:2:"";s:2:"ш";s:2:"";s:2:"щ";s:2:"";s:2:"ъ";s:2:"";s:2:"ы";s:2:"";s:2:"ь";s:2:"";s:2:"э";s:2:"";s:2:"ю";s:2:"";s:2:"я";s:2:"";s:3:"─";s:2:"";s:3:"│";s:2:"";s:3:"┌";s:2:"";s:3:"┐";s:2:"";s:3:"┘";s:2:"";s:3:"└";s:2:"";s:3:"├";s:2:"";s:3:"┬";s:2:"";s:3:"┤";s:2:"";s:3:"┴";s:2:"";s:3:"┼";s:2:"";s:3:"━";s:2:"";s:3:"┃";s:2:"";s:3:"┏";s:2:"";s:3:"┓";s:2:"";s:3:"┛";s:2:"";s:3:"┗";s:2:"";s:3:"┣";s:2:"";s:3:"┳";s:2:"";s:3:"┫";s:2:"";s:3:"┻";s:2:"";s:3:"╋";s:2:"";s:3:"┠";s:2:"";s:3:"┯";s:2:"";s:3:"┨";s:2:"";s:3:"┷";s:2:"";s:3:"┿";s:2:"";s:3:"┝";s:2:"";s:3:"┰";s:2:"";s:3:"┥";s:2:"";s:3:"┸";s:2:"";s:3:"╂";s:2:"@";s:3:"①";s:2:"A";s:3:"②";s:2:"B";s:3:"③";s:2:"C";s:3:"④";s:2:"D";s:3:"⑤";s:2:"E";s:3:"⑥";s:2:"F";s:3:"⑦";s:2:"G";s:3:"⑧";s:2:"H";s:3:"⑨";s:2:"I";s:3:"⑩";s:2:"J";s:3:"⑪";s:2:"K";s:3:"⑫";s:2:"L";s:3:"⑬";s:2:"M";s:3:"⑭";s:2:"N";s:3:"⑮";s:2:"O";s:3:"⑯";s:2:"P";s:3:"⑰";s:2:"Q";s:3:"⑱";s:2:"R";s:3:"⑲";s:2:"S";s:3:"⑳";s:2:"T";s:3:"Ⅰ";s:2:"U";s:3:"Ⅱ";s:2:"V";s:3:"Ⅲ";s:2:"W";s:3:"Ⅳ";s:2:"X";s:3:"Ⅴ";s:2:"Y";s:3:"Ⅵ";s:2:"Z";s:3:"Ⅶ";s:2:"[";s:3:"Ⅷ";s:2:"\";s:3:"Ⅸ";s:2:"]";s:3:"Ⅹ";s:2:"_";s:3:"㍉";s:2:"`";s:3:"㌔";s:2:"a";s:3:"㌢";s:2:"b";s:3:"㍍";s:2:"c";s:3:"㌘";s:2:"d";s:3:"㌧";s:2:"e";s:3:"㌃";s:2:"f";s:3:"㌶";s:2:"g";s:3:"㍑";s:2:"h";s:3:"㍗";s:2:"i";s:3:"㌍";s:2:"j";s:3:"㌦";s:2:"k";s:3:"㌣";s:2:"l";s:3:"㌫";s:2:"m";s:3:"㍊";s:2:"n";s:3:"㌻";s:2:"o";s:3:"㎜";s:2:"p";s:3:"㎝";s:2:"q";s:3:"㎞";s:2:"r";s:3:"㎎";s:2:"s";s:3:"㎏";s:2:"t";s:3:"㏄";s:2:"u";s:3:"㎡";s:2:"~";s:3:"㍻";s:2:"";s:3:"〝";s:2:"";s:3:"〟";s:2:"";s:3:"№";s:2:"";s:3:"㏍";s:2:"";s:3:"℡";s:2:"";s:3:"㊤";s:2:"";s:3:"㊥";s:2:"";s:3:"㊦";s:2:"";s:3:"㊧";s:2:"";s:3:"㊨";s:2:"";s:3:"㈱";s:2:"";s:3:"㈲";s:2:"";s:3:"㈹";s:2:"";s:3:"㍾";s:2:"";s:3:"㍽";s:2:"";s:3:"㍼";s:2:"";s:3:"≒";s:2:"";s:3:"≡";s:2:"";s:3:"∫";s:2:"";s:3:"∮";s:2:"";s:3:"∑";s:2:"";s:3:"√";s:2:"";s:3:"⊥";s:2:"";s:3:"∠";s:2:"";s:3:"∟";s:2:"";s:3:"⊿";s:2:"";s:3:"∵";s:2:"";s:3:"∩";s:2:"";s:3:"∪";s:2:"";s:3:"亜";s:2:"";s:3:"唖";s:2:"";s:3:"娃";s:2:"";s:3:"阿";s:2:"";s:3:"哀";s:2:"";s:3:"愛";s:2:"";s:3:"挨";s:2:"";s:3:"姶";s:2:"";s:3:"逢";s:2:"";s:3:"葵";s:2:"";s:3:"茜";s:2:"";s:3:"穐";s:2:"";s:3:"悪";s:2:"";s:3:"握";s:2:"";s:3:"渥";s:2:"";s:3:"旭";s:2:"";s:3:"葦";s:2:"";s:3:"芦";s:2:"";s:3:"鯵";s:2:"";s:3:"梓";s:2:"";s:3:"圧";s:2:"";s:3:"斡";s:2:"";s:3:"扱";s:2:"";s:3:"宛";s:2:"";s:3:"姐";s:2:"";s:3:"虻";s:2:"";s:3:"飴";s:2:"";s:3:"絢";s:2:"";s:3:"綾";s:2:"";s:3:"鮎";s:2:"";s:3:"或";s:2:"";s:3:"粟";s:2:"";s:3:"袷";s:2:"";s:3:"安";s:2:"";s:3:"庵";s:2:"";s:3:"按";s:2:"";s:3:"暗";s:2:"";s:3:"案";s:2:"";s:3:"闇";s:2:"";s:3:"鞍";s:2:"";s:3:"杏";s:2:"";s:3:"以";s:2:"";s:3:"伊";s:2:"";s:3:"位";s:2:"";s:3:"依";s:2:"";s:3:"偉";s:2:"";s:3:"囲";s:2:"";s:3:"夷";s:2:"";s:3:"委";s:2:"";s:3:"威";s:2:"";s:3:"尉";s:2:"";s:3:"惟";s:2:"";s:3:"意";s:2:"";s:3:"慰";s:2:"";s:3:"易";s:2:"";s:3:"椅";s:2:"";s:3:"為";s:2:"";s:3:"畏";s:2:"";s:3:"異";s:2:"";s:3:"移";s:2:"";s:3:"維";s:2:"";s:3:"緯";s:2:"";s:3:"胃";s:2:"";s:3:"萎";s:2:"";s:3:"衣";s:2:"";s:3:"謂";s:2:"";s:3:"違";s:2:"";s:3:"遺";s:2:"";s:3:"医";s:2:"";s:3:"井";s:2:"";s:3:"亥";s:2:"";s:3:"域";s:2:"";s:3:"育";s:2:"";s:3:"郁";s:2:"";s:3:"磯";s:2:"";s:3:"一";s:2:"";s:3:"壱";s:2:"";s:3:"溢";s:2:"";s:3:"逸";s:2:"";s:3:"稲";s:2:"";s:3:"茨";s:2:"";s:3:"芋";s:2:"";s:3:"鰯";s:2:"";s:3:"允";s:2:"";s:3:"印";s:2:"";s:3:"咽";s:2:"";s:3:"員";s:2:"";s:3:"因";s:2:"";s:3:"姻";s:2:"";s:3:"引";s:2:"";s:3:"飲";s:2:"";s:3:"淫";s:2:"";s:3:"胤";s:2:"";s:3:"蔭";s:2:"@";s:3:"院";s:2:"A";s:3:"陰";s:2:"B";s:3:"隠";s:2:"C";s:3:"韻";s:2:"D";s:3:"吋";s:2:"E";s:3:"右";s:2:"F";s:3:"宇";s:2:"G";s:3:"烏";s:2:"H";s:3:"羽";s:2:"I";s:3:"迂";s:2:"J";s:3:"雨";s:2:"K";s:3:"卯";s:2:"L";s:3:"鵜";s:2:"M";s:3:"窺";s:2:"N";s:3:"丑";s:2:"O";s:3:"碓";s:2:"P";s:3:"臼";s:2:"Q";s:3:"渦";s:2:"R";s:3:"嘘";s:2:"S";s:3:"唄";s:2:"T";s:3:"欝";s:2:"U";s:3:"蔚";s:2:"V";s:3:"鰻";s:2:"W";s:3:"姥";s:2:"X";s:3:"厩";s:2:"Y";s:3:"浦";s:2:"Z";s:3:"瓜";s:2:"[";s:3:"閏";s:2:"\";s:3:"噂";s:2:"]";s:3:"云";s:2:"^";s:3:"運";s:2:"_";s:3:"雲";s:2:"`";s:3:"荏";s:2:"a";s:3:"餌";s:2:"b";s:3:"叡";s:2:"c";s:3:"営";s:2:"d";s:3:"嬰";s:2:"e";s:3:"影";s:2:"f";s:3:"映";s:2:"g";s:3:"曳";s:2:"h";s:3:"栄";s:2:"i";s:3:"永";s:2:"j";s:3:"泳";s:2:"k";s:3:"洩";s:2:"l";s:3:"瑛";s:2:"m";s:3:"盈";s:2:"n";s:3:"穎";s:2:"o";s:3:"頴";s:2:"p";s:3:"英";s:2:"q";s:3:"衛";s:2:"r";s:3:"詠";s:2:"s";s:3:"鋭";s:2:"t";s:3:"液";s:2:"u";s:3:"疫";s:2:"v";s:3:"益";s:2:"w";s:3:"駅";s:2:"x";s:3:"悦";s:2:"y";s:3:"謁";s:2:"z";s:3:"越";s:2:"{";s:3:"閲";s:2:"|";s:3:"榎";s:2:"}";s:3:"厭";s:2:"~";s:3:"円";s:2:"";s:3:"園";s:2:"";s:3:"堰";s:2:"";s:3:"奄";s:2:"";s:3:"宴";s:2:"";s:3:"延";s:2:"";s:3:"怨";s:2:"";s:3:"掩";s:2:"";s:3:"援";s:2:"";s:3:"沿";s:2:"";s:3:"演";s:2:"";s:3:"炎";s:2:"";s:3:"焔";s:2:"";s:3:"煙";s:2:"";s:3:"燕";s:2:"";s:3:"猿";s:2:"";s:3:"縁";s:2:"";s:3:"艶";s:2:"";s:3:"苑";s:2:"";s:3:"薗";s:2:"";s:3:"遠";s:2:"";s:3:"鉛";s:2:"";s:3:"鴛";s:2:"";s:3:"塩";s:2:"";s:3:"於";s:2:"";s:3:"汚";s:2:"";s:3:"甥";s:2:"";s:3:"凹";s:2:"";s:3:"央";s:2:"";s:3:"奥";s:2:"";s:3:"往";s:2:"";s:3:"応";s:2:"";s:3:"押";s:2:"";s:3:"旺";s:2:"";s:3:"横";s:2:"";s:3:"欧";s:2:"";s:3:"殴";s:2:"";s:3:"王";s:2:"";s:3:"翁";s:2:"";s:3:"襖";s:2:"";s:3:"鴬";s:2:"";s:3:"鴎";s:2:"";s:3:"黄";s:2:"";s:3:"岡";s:2:"";s:3:"沖";s:2:"";s:3:"荻";s:2:"";s:3:"億";s:2:"";s:3:"屋";s:2:"";s:3:"憶";s:2:"";s:3:"臆";s:2:"";s:3:"桶";s:2:"";s:3:"牡";s:2:"";s:3:"乙";s:2:"";s:3:"俺";s:2:"";s:3:"卸";s:2:"";s:3:"恩";s:2:"";s:3:"温";s:2:"";s:3:"穏";s:2:"";s:3:"音";s:2:"";s:3:"下";s:2:"";s:3:"化";s:2:"";s:3:"仮";s:2:"";s:3:"何";s:2:"";s:3:"伽";s:2:"";s:3:"価";s:2:"";s:3:"佳";s:2:"";s:3:"加";s:2:"";s:3:"可";s:2:"";s:3:"嘉";s:2:"";s:3:"夏";s:2:"";s:3:"嫁";s:2:"";s:3:"家";s:2:"";s:3:"寡";s:2:"";s:3:"科";s:2:"";s:3:"暇";s:2:"";s:3:"果";s:2:"";s:3:"架";s:2:"";s:3:"歌";s:2:"";s:3:"河";s:2:"";s:3:"火";s:2:"";s:3:"珂";s:2:"";s:3:"禍";s:2:"";s:3:"禾";s:2:"";s:3:"稼";s:2:"";s:3:"箇";s:2:"";s:3:"花";s:2:"";s:3:"苛";s:2:"";s:3:"茄";s:2:"";s:3:"荷";s:2:"";s:3:"華";s:2:"";s:3:"菓";s:2:"";s:3:"蝦";s:2:"";s:3:"課";s:2:"";s:3:"嘩";s:2:"";s:3:"貨";s:2:"";s:3:"迦";s:2:"";s:3:"過";s:2:"";s:3:"霞";s:2:"";s:3:"蚊";s:2:"";s:3:"俄";s:2:"";s:3:"峨";s:2:"";s:3:"我";s:2:"";s:3:"牙";s:2:"";s:3:"画";s:2:"";s:3:"臥";s:2:"";s:3:"芽";s:2:"";s:3:"蛾";s:2:"";s:3:"賀";s:2:"";s:3:"雅";s:2:"";s:3:"餓";s:2:"";s:3:"駕";s:2:"";s:3:"介";s:2:"";s:3:"会";s:2:"";s:3:"解";s:2:"";s:3:"回";s:2:"";s:3:"塊";s:2:"";s:3:"壊";s:2:"";s:3:"廻";s:2:"";s:3:"快";s:2:"";s:3:"怪";s:2:"";s:3:"悔";s:2:"";s:3:"恢";s:2:"";s:3:"懐";s:2:"";s:3:"戒";s:2:"";s:3:"拐";s:2:"";s:3:"改";s:2:"@";s:3:"魁";s:2:"A";s:3:"晦";s:2:"B";s:3:"械";s:2:"C";s:3:"海";s:2:"D";s:3:"灰";s:2:"E";s:3:"界";s:2:"F";s:3:"皆";s:2:"G";s:3:"絵";s:2:"H";s:3:"芥";s:2:"I";s:3:"蟹";s:2:"J";s:3:"開";s:2:"K";s:3:"階";s:2:"L";s:3:"貝";s:2:"M";s:3:"凱";s:2:"N";s:3:"劾";s:2:"O";s:3:"外";s:2:"P";s:3:"咳";s:2:"Q";s:3:"害";s:2:"R";s:3:"崖";s:2:"S";s:3:"慨";s:2:"T";s:3:"概";s:2:"U";s:3:"涯";s:2:"V";s:3:"碍";s:2:"W";s:3:"蓋";s:2:"X";s:3:"街";s:2:"Y";s:3:"該";s:2:"Z";s:3:"鎧";s:2:"[";s:3:"骸";s:2:"\";s:3:"浬";s:2:"]";s:3:"馨";s:2:"^";s:3:"蛙";s:2:"_";s:3:"垣";s:2:"`";s:3:"柿";s:2:"a";s:3:"蛎";s:2:"b";s:3:"鈎";s:2:"c";s:3:"劃";s:2:"d";s:3:"嚇";s:2:"e";s:3:"各";s:2:"f";s:3:"廓";s:2:"g";s:3:"拡";s:2:"h";s:3:"撹";s:2:"i";s:3:"格";s:2:"j";s:3:"核";s:2:"k";s:3:"殻";s:2:"l";s:3:"獲";s:2:"m";s:3:"確";s:2:"n";s:3:"穫";s:2:"o";s:3:"覚";s:2:"p";s:3:"角";s:2:"q";s:3:"赫";s:2:"r";s:3:"較";s:2:"s";s:3:"郭";s:2:"t";s:3:"閣";s:2:"u";s:3:"隔";s:2:"v";s:3:"革";s:2:"w";s:3:"学";s:2:"x";s:3:"岳";s:2:"y";s:3:"楽";s:2:"z";s:3:"額";s:2:"{";s:3:"顎";s:2:"|";s:3:"掛";s:2:"}";s:3:"笠";s:2:"~";s:3:"樫";s:2:"";s:3:"橿";s:2:"";s:3:"梶";s:2:"";s:3:"鰍";s:2:"";s:3:"潟";s:2:"";s:3:"割";s:2:"";s:3:"喝";s:2:"";s:3:"恰";s:2:"";s:3:"括";s:2:"";s:3:"活";s:2:"";s:3:"渇";s:2:"";s:3:"滑";s:2:"";s:3:"葛";s:2:"";s:3:"褐";s:2:"";s:3:"轄";s:2:"";s:3:"且";s:2:"";s:3:"鰹";s:2:"";s:3:"叶";s:2:"";s:3:"椛";s:2:"";s:3:"樺";s:2:"";s:3:"鞄";s:2:"";s:3:"株";s:2:"";s:3:"兜";s:2:"";s:3:"竃";s:2:"";s:3:"蒲";s:2:"";s:3:"釜";s:2:"";s:3:"鎌";s:2:"";s:3:"噛";s:2:"";s:3:"鴨";s:2:"";s:3:"栢";s:2:"";s:3:"茅";s:2:"";s:3:"萱";s:2:"";s:3:"粥";s:2:"";s:3:"刈";s:2:"";s:3:"苅";s:2:"";s:3:"瓦";s:2:"";s:3:"乾";s:2:"";s:3:"侃";s:2:"";s:3:"冠";s:2:"";s:3:"寒";s:2:"";s:3:"刊";s:2:"";s:3:"勘";s:2:"";s:3:"勧";s:2:"";s:3:"巻";s:2:"";s:3:"喚";s:2:"";s:3:"堪";s:2:"";s:3:"姦";s:2:"";s:3:"完";s:2:"";s:3:"官";s:2:"";s:3:"寛";s:2:"";s:3:"干";s:2:"";s:3:"幹";s:2:"";s:3:"患";s:2:"";s:3:"感";s:2:"";s:3:"慣";s:2:"";s:3:"憾";s:2:"";s:3:"換";s:2:"";s:3:"敢";s:2:"";s:3:"柑";s:2:"";s:3:"桓";s:2:"";s:3:"棺";s:2:"";s:3:"款";s:2:"";s:3:"歓";s:2:"";s:3:"汗";s:2:"";s:3:"漢";s:2:"";s:3:"澗";s:2:"";s:3:"潅";s:2:"";s:3:"環";s:2:"";s:3:"甘";s:2:"";s:3:"監";s:2:"";s:3:"看";s:2:"";s:3:"竿";s:2:"";s:3:"管";s:2:"";s:3:"簡";s:2:"";s:3:"緩";s:2:"";s:3:"缶";s:2:"";s:3:"翰";s:2:"";s:3:"肝";s:2:"";s:3:"艦";s:2:"";s:3:"莞";s:2:"";s:3:"観";s:2:"";s:3:"諌";s:2:"";s:3:"貫";s:2:"";s:3:"還";s:2:"";s:3:"鑑";s:2:"";s:3:"間";s:2:"";s:3:"閑";s:2:"";s:3:"関";s:2:"";s:3:"陥";s:2:"";s:3:"韓";s:2:"";s:3:"館";s:2:"";s:3:"舘";s:2:"";s:3:"丸";s:2:"";s:3:"含";s:2:"";s:3:"岸";s:2:"";s:3:"巌";s:2:"";s:3:"玩";s:2:"";s:3:"癌";s:2:"";s:3:"眼";s:2:"";s:3:"岩";s:2:"";s:3:"翫";s:2:"";s:3:"贋";s:2:"";s:3:"雁";s:2:"";s:3:"頑";s:2:"";s:3:"顔";s:2:"";s:3:"願";s:2:"";s:3:"企";s:2:"";s:3:"伎";s:2:"";s:3:"危";s:2:"";s:3:"喜";s:2:"";s:3:"器";s:2:"";s:3:"基";s:2:"";s:3:"奇";s:2:"";s:3:"嬉";s:2:"";s:3:"寄";s:2:"";s:3:"岐";s:2:"";s:3:"希";s:2:"";s:3:"幾";s:2:"";s:3:"忌";s:2:"";s:3:"揮";s:2:"";s:3:"机";s:2:"";s:3:"旗";s:2:"";s:3:"既";s:2:"";s:3:"期";s:2:"";s:3:"棋";s:2:"";s:3:"棄";s:2:"@";s:3:"機";s:2:"A";s:3:"帰";s:2:"B";s:3:"毅";s:2:"C";s:3:"気";s:2:"D";s:3:"汽";s:2:"E";s:3:"畿";s:2:"F";s:3:"祈";s:2:"G";s:3:"季";s:2:"H";s:3:"稀";s:2:"I";s:3:"紀";s:2:"J";s:3:"徽";s:2:"K";s:3:"規";s:2:"L";s:3:"記";s:2:"M";s:3:"貴";s:2:"N";s:3:"起";s:2:"O";s:3:"軌";s:2:"P";s:3:"輝";s:2:"Q";s:3:"飢";s:2:"R";s:3:"騎";s:2:"S";s:3:"鬼";s:2:"T";s:3:"亀";s:2:"U";s:3:"偽";s:2:"V";s:3:"儀";s:2:"W";s:3:"妓";s:2:"X";s:3:"宜";s:2:"Y";s:3:"戯";s:2:"Z";s:3:"技";s:2:"[";s:3:"擬";s:2:"\";s:3:"欺";s:2:"]";s:3:"犠";s:2:"^";s:3:"疑";s:2:"_";s:3:"祇";s:2:"`";s:3:"義";s:2:"a";s:3:"蟻";s:2:"b";s:3:"誼";s:2:"c";s:3:"議";s:2:"d";s:3:"掬";s:2:"e";s:3:"菊";s:2:"f";s:3:"鞠";s:2:"g";s:3:"吉";s:2:"h";s:3:"吃";s:2:"i";s:3:"喫";s:2:"j";s:3:"桔";s:2:"k";s:3:"橘";s:2:"l";s:3:"詰";s:2:"m";s:3:"砧";s:2:"n";s:3:"杵";s:2:"o";s:3:"黍";s:2:"p";s:3:"却";s:2:"q";s:3:"客";s:2:"r";s:3:"脚";s:2:"s";s:3:"虐";s:2:"t";s:3:"逆";s:2:"u";s:3:"丘";s:2:"v";s:3:"久";s:2:"w";s:3:"仇";s:2:"x";s:3:"休";s:2:"y";s:3:"及";s:2:"z";s:3:"吸";s:2:"{";s:3:"宮";s:2:"|";s:3:"弓";s:2:"}";s:3:"急";s:2:"~";s:3:"救";s:2:"";s:3:"朽";s:2:"";s:3:"求";s:2:"";s:3:"汲";s:2:"";s:3:"泣";s:2:"";s:3:"灸";s:2:"";s:3:"球";s:2:"";s:3:"究";s:2:"";s:3:"窮";s:2:"";s:3:"笈";s:2:"";s:3:"級";s:2:"";s:3:"糾";s:2:"";s:3:"給";s:2:"";s:3:"旧";s:2:"";s:3:"牛";s:2:"";s:3:"去";s:2:"";s:3:"居";s:2:"";s:3:"巨";s:2:"";s:3:"拒";s:2:"";s:3:"拠";s:2:"";s:3:"挙";s:2:"";s:3:"渠";s:2:"";s:3:"虚";s:2:"";s:3:"許";s:2:"";s:3:"距";s:2:"";s:3:"鋸";s:2:"";s:3:"漁";s:2:"";s:3:"禦";s:2:"";s:3:"魚";s:2:"";s:3:"亨";s:2:"";s:3:"享";s:2:"";s:3:"京";s:2:"";s:3:"供";s:2:"";s:3:"侠";s:2:"";s:3:"僑";s:2:"";s:3:"兇";s:2:"";s:3:"競";s:2:"";s:3:"共";s:2:"";s:3:"凶";s:2:"";s:3:"協";s:2:"";s:3:"匡";s:2:"";s:3:"卿";s:2:"";s:3:"叫";s:2:"";s:3:"喬";s:2:"";s:3:"境";s:2:"";s:3:"峡";s:2:"";s:3:"強";s:2:"";s:3:"彊";s:2:"";s:3:"怯";s:2:"";s:3:"恐";s:2:"";s:3:"恭";s:2:"";s:3:"挟";s:2:"";s:3:"教";s:2:"";s:3:"橋";s:2:"";s:3:"況";s:2:"";s:3:"狂";s:2:"";s:3:"狭";s:2:"";s:3:"矯";s:2:"";s:3:"胸";s:2:"";s:3:"脅";s:2:"";s:3:"興";s:2:"";s:3:"蕎";s:2:"";s:3:"郷";s:2:"";s:3:"鏡";s:2:"";s:3:"響";s:2:"";s:3:"饗";s:2:"";s:3:"驚";s:2:"";s:3:"仰";s:2:"";s:3:"凝";s:2:"";s:3:"尭";s:2:"";s:3:"暁";s:2:"";s:3:"業";s:2:"";s:3:"局";s:2:"";s:3:"曲";s:2:"";s:3:"極";s:2:"";s:3:"玉";s:2:"";s:3:"桐";s:2:"";s:3:"粁";s:2:"";s:3:"僅";s:2:"";s:3:"勤";s:2:"";s:3:"均";s:2:"";s:3:"巾";s:2:"";s:3:"錦";s:2:"";s:3:"斤";s:2:"";s:3:"欣";s:2:"";s:3:"欽";s:2:"";s:3:"琴";s:2:"";s:3:"禁";s:2:"";s:3:"禽";s:2:"";s:3:"筋";s:2:"";s:3:"緊";s:2:"";s:3:"芹";s:2:"";s:3:"菌";s:2:"";s:3:"衿";s:2:"";s:3:"襟";s:2:"";s:3:"謹";s:2:"";s:3:"近";s:2:"";s:3:"金";s:2:"";s:3:"吟";s:2:"";s:3:"銀";s:2:"";s:3:"九";s:2:"";s:3:"倶";s:2:"";s:3:"句";s:2:"";s:3:"区";s:2:"";s:3:"狗";s:2:"";s:3:"玖";s:2:"";s:3:"矩";s:2:"";s:3:"苦";s:2:"";s:3:"躯";s:2:"";s:3:"駆";s:2:"";s:3:"駈";s:2:"";s:3:"駒";s:2:"";s:3:"具";s:2:"";s:3:"愚";s:2:"";s:3:"虞";s:2:"";s:3:"喰";s:2:"";s:3:"空";s:2:"";s:3:"偶";s:2:"";s:3:"寓";s:2:"";s:3:"遇";s:2:"";s:3:"隅";s:2:"";s:3:"串";s:2:"";s:3:"櫛";s:2:"";s:3:"釧";s:2:"";s:3:"屑";s:2:"";s:3:"屈";s:2:"@";s:3:"掘";s:2:"A";s:3:"窟";s:2:"B";s:3:"沓";s:2:"C";s:3:"靴";s:2:"D";s:3:"轡";s:2:"E";s:3:"窪";s:2:"F";s:3:"熊";s:2:"G";s:3:"隈";s:2:"H";s:3:"粂";s:2:"I";s:3:"栗";s:2:"J";s:3:"繰";s:2:"K";s:3:"桑";s:2:"L";s:3:"鍬";s:2:"M";s:3:"勲";s:2:"N";s:3:"君";s:2:"O";s:3:"薫";s:2:"P";s:3:"訓";s:2:"Q";s:3:"群";s:2:"R";s:3:"軍";s:2:"S";s:3:"郡";s:2:"T";s:3:"卦";s:2:"U";s:3:"袈";s:2:"V";s:3:"祁";s:2:"W";s:3:"係";s:2:"X";s:3:"傾";s:2:"Y";s:3:"刑";s:2:"Z";s:3:"兄";s:2:"[";s:3:"啓";s:2:"\";s:3:"圭";s:2:"]";s:3:"珪";s:2:"^";s:3:"型";s:2:"_";s:3:"契";s:2:"`";s:3:"形";s:2:"a";s:3:"径";s:2:"b";s:3:"恵";s:2:"c";s:3:"慶";s:2:"d";s:3:"慧";s:2:"e";s:3:"憩";s:2:"f";s:3:"掲";s:2:"g";s:3:"携";s:2:"h";s:3:"敬";s:2:"i";s:3:"景";s:2:"j";s:3:"桂";s:2:"k";s:3:"渓";s:2:"l";s:3:"畦";s:2:"m";s:3:"稽";s:2:"n";s:3:"系";s:2:"o";s:3:"経";s:2:"p";s:3:"継";s:2:"q";s:3:"繋";s:2:"r";s:3:"罫";s:2:"s";s:3:"茎";s:2:"t";s:3:"荊";s:2:"u";s:3:"蛍";s:2:"v";s:3:"計";s:2:"w";s:3:"詣";s:2:"x";s:3:"警";s:2:"y";s:3:"軽";s:2:"z";s:3:"頚";s:2:"{";s:3:"鶏";s:2:"|";s:3:"芸";s:2:"}";s:3:"迎";s:2:"~";s:3:"鯨";s:2:"";s:3:"劇";s:2:"";s:3:"戟";s:2:"";s:3:"撃";s:2:"";s:3:"激";s:2:"";s:3:"隙";s:2:"";s:3:"桁";s:2:"";s:3:"傑";s:2:"";s:3:"欠";s:2:"";s:3:"決";s:2:"";s:3:"潔";s:2:"";s:3:"穴";s:2:"";s:3:"結";s:2:"";s:3:"血";s:2:"";s:3:"訣";s:2:"";s:3:"月";s:2:"";s:3:"件";s:2:"";s:3:"倹";s:2:"";s:3:"倦";s:2:"";s:3:"健";s:2:"";s:3:"兼";s:2:"";s:3:"券";s:2:"";s:3:"剣";s:2:"";s:3:"喧";s:2:"";s:3:"圏";s:2:"";s:3:"堅";s:2:"";s:3:"嫌";s:2:"";s:3:"建";s:2:"";s:3:"憲";s:2:"";s:3:"懸";s:2:"";s:3:"拳";s:2:"";s:3:"捲";s:2:"";s:3:"検";s:2:"";s:3:"権";s:2:"";s:3:"牽";s:2:"";s:3:"犬";s:2:"";s:3:"献";s:2:"";s:3:"研";s:2:"";s:3:"硯";s:2:"";s:3:"絹";s:2:"";s:3:"県";s:2:"";s:3:"肩";s:2:"";s:3:"見";s:2:"";s:3:"謙";s:2:"";s:3:"賢";s:2:"";s:3:"軒";s:2:"";s:3:"遣";s:2:"";s:3:"鍵";s:2:"";s:3:"険";s:2:"";s:3:"顕";s:2:"";s:3:"験";s:2:"";s:3:"鹸";s:2:"";s:3:"元";s:2:"";s:3:"原";s:2:"";s:3:"厳";s:2:"";s:3:"幻";s:2:"";s:3:"弦";s:2:"";s:3:"減";s:2:"";s:3:"源";s:2:"";s:3:"玄";s:2:"";s:3:"現";s:2:"";s:3:"絃";s:2:"";s:3:"舷";s:2:"";s:3:"言";s:2:"";s:3:"諺";s:2:"";s:3:"限";s:2:"";s:3:"乎";s:2:"";s:3:"個";s:2:"";s:3:"古";s:2:"";s:3:"呼";s:2:"";s:3:"固";s:2:"";s:3:"姑";s:2:"";s:3:"孤";s:2:"";s:3:"己";s:2:"";s:3:"庫";s:2:"";s:3:"弧";s:2:"";s:3:"戸";s:2:"";s:3:"故";s:2:"";s:3:"枯";s:2:"";s:3:"湖";s:2:"";s:3:"狐";s:2:"";s:3:"糊";s:2:"";s:3:"袴";s:2:"";s:3:"股";s:2:"";s:3:"胡";s:2:"";s:3:"菰";s:2:"";s:3:"虎";s:2:"";s:3:"誇";s:2:"";s:3:"跨";s:2:"";s:3:"鈷";s:2:"";s:3:"雇";s:2:"";s:3:"顧";s:2:"";s:3:"鼓";s:2:"";s:3:"五";s:2:"";s:3:"互";s:2:"";s:3:"伍";s:2:"";s:3:"午";s:2:"";s:3:"呉";s:2:"";s:3:"吾";s:2:"";s:3:"娯";s:2:"";s:3:"後";s:2:"";s:3:"御";s:2:"";s:3:"悟";s:2:"";s:3:"梧";s:2:"";s:3:"檎";s:2:"";s:3:"瑚";s:2:"";s:3:"碁";s:2:"";s:3:"語";s:2:"";s:3:"誤";s:2:"";s:3:"護";s:2:"";s:3:"醐";s:2:"";s:3:"乞";s:2:"";s:3:"鯉";s:2:"";s:3:"交";s:2:"";s:3:"佼";s:2:"";s:3:"侯";s:2:"";s:3:"候";s:2:"";s:3:"倖";s:2:"";s:3:"光";s:2:"";s:3:"公";s:2:"";s:3:"功";s:2:"";s:3:"効";s:2:"";s:3:"勾";s:2:"";s:3:"厚";s:2:"";s:3:"口";s:2:"";s:3:"向";s:2:"@";s:3:"后";s:2:"A";s:3:"喉";s:2:"B";s:3:"坑";s:2:"C";s:3:"垢";s:2:"D";s:3:"好";s:2:"E";s:3:"孔";s:2:"F";s:3:"孝";s:2:"G";s:3:"宏";s:2:"H";s:3:"工";s:2:"I";s:3:"巧";s:2:"J";s:3:"巷";s:2:"K";s:3:"幸";s:2:"L";s:3:"広";s:2:"M";s:3:"庚";s:2:"N";s:3:"康";s:2:"O";s:3:"弘";s:2:"P";s:3:"恒";s:2:"Q";s:3:"慌";s:2:"R";s:3:"抗";s:2:"S";s:3:"拘";s:2:"T";s:3:"控";s:2:"U";s:3:"攻";s:2:"V";s:3:"昂";s:2:"W";s:3:"晃";s:2:"X";s:3:"更";s:2:"Y";s:3:"杭";s:2:"Z";s:3:"校";s:2:"[";s:3:"梗";s:2:"\";s:3:"構";s:2:"]";s:3:"江";s:2:"^";s:3:"洪";s:2:"_";s:3:"浩";s:2:"`";s:3:"港";s:2:"a";s:3:"溝";s:2:"b";s:3:"甲";s:2:"c";s:3:"皇";s:2:"d";s:3:"硬";s:2:"e";s:3:"稿";s:2:"f";s:3:"糠";s:2:"g";s:3:"紅";s:2:"h";s:3:"紘";s:2:"i";s:3:"絞";s:2:"j";s:3:"綱";s:2:"k";s:3:"耕";s:2:"l";s:3:"考";s:2:"m";s:3:"肯";s:2:"n";s:3:"肱";s:2:"o";s:3:"腔";s:2:"p";s:3:"膏";s:2:"q";s:3:"航";s:2:"r";s:3:"荒";s:2:"s";s:3:"行";s:2:"t";s:3:"衡";s:2:"u";s:3:"講";s:2:"v";s:3:"貢";s:2:"w";s:3:"購";s:2:"x";s:3:"郊";s:2:"y";s:3:"酵";s:2:"z";s:3:"鉱";s:2:"{";s:3:"砿";s:2:"|";s:3:"鋼";s:2:"}";s:3:"閤";s:2:"~";s:3:"降";s:2:"";s:3:"項";s:2:"";s:3:"香";s:2:"";s:3:"高";s:2:"";s:3:"鴻";s:2:"";s:3:"剛";s:2:"";s:3:"劫";s:2:"";s:3:"号";s:2:"";s:3:"合";s:2:"";s:3:"壕";s:2:"";s:3:"拷";s:2:"";s:3:"濠";s:2:"";s:3:"豪";s:2:"";s:3:"轟";s:2:"";s:3:"麹";s:2:"";s:3:"克";s:2:"";s:3:"刻";s:2:"";s:3:"告";s:2:"";s:3:"国";s:2:"";s:3:"穀";s:2:"";s:3:"酷";s:2:"";s:3:"鵠";s:2:"";s:3:"黒";s:2:"";s:3:"獄";s:2:"";s:3:"漉";s:2:"";s:3:"腰";s:2:"";s:3:"甑";s:2:"";s:3:"忽";s:2:"";s:3:"惚";s:2:"";s:3:"骨";s:2:"";s:3:"狛";s:2:"";s:3:"込";s:2:"";s:3:"此";s:2:"";s:3:"頃";s:2:"";s:3:"今";s:2:"";s:3:"困";s:2:"";s:3:"坤";s:2:"";s:3:"墾";s:2:"";s:3:"婚";s:2:"";s:3:"恨";s:2:"";s:3:"懇";s:2:"";s:3:"昏";s:2:"";s:3:"昆";s:2:"";s:3:"根";s:2:"";s:3:"梱";s:2:"";s:3:"混";s:2:"";s:3:"痕";s:2:"";s:3:"紺";s:2:"";s:3:"艮";s:2:"";s:3:"魂";s:2:"";s:3:"些";s:2:"";s:3:"佐";s:2:"";s:3:"叉";s:2:"";s:3:"唆";s:2:"";s:3:"嵯";s:2:"";s:3:"左";s:2:"";s:3:"差";s:2:"";s:3:"査";s:2:"";s:3:"沙";s:2:"";s:3:"瑳";s:2:"";s:3:"砂";s:2:"";s:3:"詐";s:2:"";s:3:"鎖";s:2:"";s:3:"裟";s:2:"";s:3:"坐";s:2:"";s:3:"座";s:2:"";s:3:"挫";s:2:"";s:3:"債";s:2:"";s:3:"催";s:2:"";s:3:"再";s:2:"";s:3:"最";s:2:"";s:3:"哉";s:2:"";s:3:"塞";s:2:"";s:3:"妻";s:2:"";s:3:"宰";s:2:"";s:3:"彩";s:2:"";s:3:"才";s:2:"";s:3:"採";s:2:"";s:3:"栽";s:2:"";s:3:"歳";s:2:"";s:3:"済";s:2:"";s:3:"災";s:2:"";s:3:"采";s:2:"";s:3:"犀";s:2:"";s:3:"砕";s:2:"";s:3:"砦";s:2:"";s:3:"祭";s:2:"";s:3:"斎";s:2:"";s:3:"細";s:2:"";s:3:"菜";s:2:"";s:3:"裁";s:2:"";s:3:"載";s:2:"";s:3:"際";s:2:"";s:3:"剤";s:2:"";s:3:"在";s:2:"";s:3:"材";s:2:"";s:3:"罪";s:2:"";s:3:"財";s:2:"";s:3:"冴";s:2:"";s:3:"坂";s:2:"";s:3:"阪";s:2:"";s:3:"堺";s:2:"";s:3:"榊";s:2:"";s:3:"肴";s:2:"";s:3:"咲";s:2:"";s:3:"崎";s:2:"";s:3:"埼";s:2:"";s:3:"碕";s:2:"";s:3:"鷺";s:2:"";s:3:"作";s:2:"";s:3:"削";s:2:"";s:3:"咋";s:2:"";s:3:"搾";s:2:"";s:3:"昨";s:2:"";s:3:"朔";s:2:"";s:3:"柵";s:2:"";s:3:"窄";s:2:"";s:3:"策";s:2:"";s:3:"索";s:2:"";s:3:"錯";s:2:"";s:3:"桜";s:2:"";s:3:"鮭";s:2:"";s:3:"笹";s:2:"";s:3:"匙";s:2:"";s:3:"冊";s:2:"";s:3:"刷";s:2:"@";s:3:"察";s:2:"A";s:3:"拶";s:2:"B";s:3:"撮";s:2:"C";s:3:"擦";s:2:"D";s:3:"札";s:2:"E";s:3:"殺";s:2:"F";s:3:"薩";s:2:"G";s:3:"雑";s:2:"H";s:3:"皐";s:2:"I";s:3:"鯖";s:2:"J";s:3:"捌";s:2:"K";s:3:"錆";s:2:"L";s:3:"鮫";s:2:"M";s:3:"皿";s:2:"N";s:3:"晒";s:2:"O";s:3:"三";s:2:"P";s:3:"傘";s:2:"Q";s:3:"参";s:2:"R";s:3:"山";s:2:"S";s:3:"惨";s:2:"T";s:3:"撒";s:2:"U";s:3:"散";s:2:"V";s:3:"桟";s:2:"W";s:3:"燦";s:2:"X";s:3:"珊";s:2:"Y";s:3:"産";s:2:"Z";s:3:"算";s:2:"[";s:3:"纂";s:2:"\";s:3:"蚕";s:2:"]";s:3:"讃";s:2:"^";s:3:"賛";s:2:"_";s:3:"酸";s:2:"`";s:3:"餐";s:2:"a";s:3:"斬";s:2:"b";s:3:"暫";s:2:"c";s:3:"残";s:2:"d";s:3:"仕";s:2:"e";s:3:"仔";s:2:"f";s:3:"伺";s:2:"g";s:3:"使";s:2:"h";s:3:"刺";s:2:"i";s:3:"司";s:2:"j";s:3:"史";s:2:"k";s:3:"嗣";s:2:"l";s:3:"四";s:2:"m";s:3:"士";s:2:"n";s:3:"始";s:2:"o";s:3:"姉";s:2:"p";s:3:"姿";s:2:"q";s:3:"子";s:2:"r";s:3:"屍";s:2:"s";s:3:"市";s:2:"t";s:3:"師";s:2:"u";s:3:"志";s:2:"v";s:3:"思";s:2:"w";s:3:"指";s:2:"x";s:3:"支";s:2:"y";s:3:"孜";s:2:"z";s:3:"斯";s:2:"{";s:3:"施";s:2:"|";s:3:"旨";s:2:"}";s:3:"枝";s:2:"~";s:3:"止";s:2:"";s:3:"死";s:2:"";s:3:"氏";s:2:"";s:3:"獅";s:2:"";s:3:"祉";s:2:"";s:3:"私";s:2:"";s:3:"糸";s:2:"";s:3:"紙";s:2:"";s:3:"紫";s:2:"";s:3:"肢";s:2:"";s:3:"脂";s:2:"";s:3:"至";s:2:"";s:3:"視";s:2:"";s:3:"詞";s:2:"";s:3:"詩";s:2:"";s:3:"試";s:2:"";s:3:"誌";s:2:"";s:3:"諮";s:2:"";s:3:"資";s:2:"";s:3:"賜";s:2:"";s:3:"雌";s:2:"";s:3:"飼";s:2:"";s:3:"歯";s:2:"";s:3:"事";s:2:"";s:3:"似";s:2:"";s:3:"侍";s:2:"";s:3:"児";s:2:"";s:3:"字";s:2:"";s:3:"寺";s:2:"";s:3:"慈";s:2:"";s:3:"持";s:2:"";s:3:"時";s:2:"";s:3:"次";s:2:"";s:3:"滋";s:2:"";s:3:"治";s:2:"";s:3:"爾";s:2:"";s:3:"璽";s:2:"";s:3:"痔";s:2:"";s:3:"磁";s:2:"";s:3:"示";s:2:"";s:3:"而";s:2:"";s:3:"耳";s:2:"";s:3:"自";s:2:"";s:3:"蒔";s:2:"";s:3:"辞";s:2:"";s:3:"汐";s:2:"";s:3:"鹿";s:2:"";s:3:"式";s:2:"";s:3:"識";s:2:"";s:3:"鴫";s:2:"";s:3:"竺";s:2:"";s:3:"軸";s:2:"";s:3:"宍";s:2:"";s:3:"雫";s:2:"";s:3:"七";s:2:"";s:3:"叱";s:2:"";s:3:"執";s:2:"";s:3:"失";s:2:"";s:3:"嫉";s:2:"";s:3:"室";s:2:"";s:3:"悉";s:2:"";s:3:"湿";s:2:"";s:3:"漆";s:2:"";s:3:"疾";s:2:"";s:3:"質";s:2:"";s:3:"実";s:2:"";s:3:"蔀";s:2:"";s:3:"篠";s:2:"";s:3:"偲";s:2:"";s:3:"柴";s:2:"";s:3:"芝";s:2:"";s:3:"屡";s:2:"";s:3:"蕊";s:2:"";s:3:"縞";s:2:"";s:3:"舎";s:2:"";s:3:"写";s:2:"";s:3:"射";s:2:"";s:3:"捨";s:2:"";s:3:"赦";s:2:"";s:3:"斜";s:2:"";s:3:"煮";s:2:"";s:3:"社";s:2:"";s:3:"紗";s:2:"";s:3:"者";s:2:"";s:3:"謝";s:2:"";s:3:"車";s:2:"";s:3:"遮";s:2:"";s:3:"蛇";s:2:"";s:3:"邪";s:2:"";s:3:"借";s:2:"";s:3:"勺";s:2:"";s:3:"尺";s:2:"";s:3:"杓";s:2:"";s:3:"灼";s:2:"";s:3:"爵";s:2:"";s:3:"酌";s:2:"";s:3:"釈";s:2:"";s:3:"錫";s:2:"";s:3:"若";s:2:"";s:3:"寂";s:2:"";s:3:"弱";s:2:"";s:3:"惹";s:2:"";s:3:"主";s:2:"";s:3:"取";s:2:"";s:3:"守";s:2:"";s:3:"手";s:2:"";s:3:"朱";s:2:"";s:3:"殊";s:2:"";s:3:"狩";s:2:"";s:3:"珠";s:2:"";s:3:"種";s:2:"";s:3:"腫";s:2:"";s:3:"趣";s:2:"";s:3:"酒";s:2:"";s:3:"首";s:2:"";s:3:"儒";s:2:"";s:3:"受";s:2:"";s:3:"呪";s:2:"";s:3:"寿";s:2:"";s:3:"授";s:2:"";s:3:"樹";s:2:"";s:3:"綬";s:2:"";s:3:"需";s:2:"";s:3:"囚";s:2:"";s:3:"収";s:2:"";s:3:"周";s:2:"@";s:3:"宗";s:2:"A";s:3:"就";s:2:"B";s:3:"州";s:2:"C";s:3:"修";s:2:"D";s:3:"愁";s:2:"E";s:3:"拾";s:2:"F";s:3:"洲";s:2:"G";s:3:"秀";s:2:"H";s:3:"秋";s:2:"I";s:3:"終";s:2:"J";s:3:"繍";s:2:"K";s:3:"習";s:2:"L";s:3:"臭";s:2:"M";s:3:"舟";s:2:"N";s:3:"蒐";s:2:"O";s:3:"衆";s:2:"P";s:3:"襲";s:2:"Q";s:3:"讐";s:2:"R";s:3:"蹴";s:2:"S";s:3:"輯";s:2:"T";s:3:"週";s:2:"U";s:3:"酋";s:2:"V";s:3:"酬";s:2:"W";s:3:"集";s:2:"X";s:3:"醜";s:2:"Y";s:3:"什";s:2:"Z";s:3:"住";s:2:"[";s:3:"充";s:2:"\";s:3:"十";s:2:"]";s:3:"従";s:2:"^";s:3:"戎";s:2:"_";s:3:"柔";s:2:"`";s:3:"汁";s:2:"a";s:3:"渋";s:2:"b";s:3:"獣";s:2:"c";s:3:"縦";s:2:"d";s:3:"重";s:2:"e";s:3:"銃";s:2:"f";s:3:"叔";s:2:"g";s:3:"夙";s:2:"h";s:3:"宿";s:2:"i";s:3:"淑";s:2:"j";s:3:"祝";s:2:"k";s:3:"縮";s:2:"l";s:3:"粛";s:2:"m";s:3:"塾";s:2:"n";s:3:"熟";s:2:"o";s:3:"出";s:2:"p";s:3:"術";s:2:"q";s:3:"述";s:2:"r";s:3:"俊";s:2:"s";s:3:"峻";s:2:"t";s:3:"春";s:2:"u";s:3:"瞬";s:2:"v";s:3:"竣";s:2:"w";s:3:"舜";s:2:"x";s:3:"駿";s:2:"y";s:3:"准";s:2:"z";s:3:"循";s:2:"{";s:3:"旬";s:2:"|";s:3:"楯";s:2:"}";s:3:"殉";s:2:"~";s:3:"淳";s:2:"";s:3:"準";s:2:"";s:3:"潤";s:2:"";s:3:"盾";s:2:"";s:3:"純";s:2:"";s:3:"巡";s:2:"";s:3:"遵";s:2:"";s:3:"醇";s:2:"";s:3:"順";s:2:"";s:3:"処";s:2:"";s:3:"初";s:2:"";s:3:"所";s:2:"";s:3:"暑";s:2:"";s:3:"曙";s:2:"";s:3:"渚";s:2:"";s:3:"庶";s:2:"";s:3:"緒";s:2:"";s:3:"署";s:2:"";s:3:"書";s:2:"";s:3:"薯";s:2:"";s:3:"藷";s:2:"";s:3:"諸";s:2:"";s:3:"助";s:2:"";s:3:"叙";s:2:"";s:3:"女";s:2:"";s:3:"序";s:2:"";s:3:"徐";s:2:"";s:3:"恕";s:2:"";s:3:"鋤";s:2:"";s:3:"除";s:2:"";s:3:"傷";s:2:"";s:3:"償";s:2:"";s:3:"勝";s:2:"";s:3:"匠";s:2:"";s:3:"升";s:2:"";s:3:"召";s:2:"";s:3:"哨";s:2:"";s:3:"商";s:2:"";s:3:"唱";s:2:"";s:3:"嘗";s:2:"";s:3:"奨";s:2:"";s:3:"妾";s:2:"";s:3:"娼";s:2:"";s:3:"宵";s:2:"";s:3:"将";s:2:"";s:3:"小";s:2:"";s:3:"少";s:2:"";s:3:"尚";s:2:"";s:3:"庄";s:2:"";s:3:"床";s:2:"";s:3:"廠";s:2:"";s:3:"彰";s:2:"";s:3:"承";s:2:"";s:3:"抄";s:2:"";s:3:"招";s:2:"";s:3:"掌";s:2:"";s:3:"捷";s:2:"";s:3:"昇";s:2:"";s:3:"昌";s:2:"";s:3:"昭";s:2:"";s:3:"晶";s:2:"";s:3:"松";s:2:"";s:3:"梢";s:2:"";s:3:"樟";s:2:"";s:3:"樵";s:2:"";s:3:"沼";s:2:"";s:3:"消";s:2:"";s:3:"渉";s:2:"";s:3:"湘";s:2:"";s:3:"焼";s:2:"";s:3:"焦";s:2:"";s:3:"照";s:2:"";s:3:"症";s:2:"";s:3:"省";s:2:"";s:3:"硝";s:2:"";s:3:"礁";s:2:"";s:3:"祥";s:2:"";s:3:"称";s:2:"";s:3:"章";s:2:"";s:3:"笑";s:2:"";s:3:"粧";s:2:"";s:3:"紹";s:2:"";s:3:"肖";s:2:"";s:3:"菖";s:2:"";s:3:"蒋";s:2:"";s:3:"蕉";s:2:"";s:3:"衝";s:2:"";s:3:"裳";s:2:"";s:3:"訟";s:2:"";s:3:"証";s:2:"";s:3:"詔";s:2:"";s:3:"詳";s:2:"";s:3:"象";s:2:"";s:3:"賞";s:2:"";s:3:"醤";s:2:"";s:3:"鉦";s:2:"";s:3:"鍾";s:2:"";s:3:"鐘";s:2:"";s:3:"障";s:2:"";s:3:"鞘";s:2:"";s:3:"上";s:2:"";s:3:"丈";s:2:"";s:3:"丞";s:2:"";s:3:"乗";s:2:"";s:3:"冗";s:2:"";s:3:"剰";s:2:"";s:3:"城";s:2:"";s:3:"場";s:2:"";s:3:"壌";s:2:"";s:3:"嬢";s:2:"";s:3:"常";s:2:"";s:3:"情";s:2:"";s:3:"擾";s:2:"";s:3:"条";s:2:"";s:3:"杖";s:2:"";s:3:"浄";s:2:"";s:3:"状";s:2:"";s:3:"畳";s:2:"";s:3:"穣";s:2:"";s:3:"蒸";s:2:"";s:3:"譲";s:2:"";s:3:"醸";s:2:"";s:3:"錠";s:2:"";s:3:"嘱";s:2:"";s:3:"埴";s:2:"";s:3:"飾";s:2:"@";s:3:"拭";s:2:"A";s:3:"植";s:2:"B";s:3:"殖";s:2:"C";s:3:"燭";s:2:"D";s:3:"織";s:2:"E";s:3:"職";s:2:"F";s:3:"色";s:2:"G";s:3:"触";s:2:"H";s:3:"食";s:2:"I";s:3:"蝕";s:2:"J";s:3:"辱";s:2:"K";s:3:"尻";s:2:"L";s:3:"伸";s:2:"M";s:3:"信";s:2:"N";s:3:"侵";s:2:"O";s:3:"唇";s:2:"P";s:3:"娠";s:2:"Q";s:3:"寝";s:2:"R";s:3:"審";s:2:"S";s:3:"心";s:2:"T";s:3:"慎";s:2:"U";s:3:"振";s:2:"V";s:3:"新";s:2:"W";s:3:"晋";s:2:"X";s:3:"森";s:2:"Y";s:3:"榛";s:2:"Z";s:3:"浸";s:2:"[";s:3:"深";s:2:"\";s:3:"申";s:2:"]";s:3:"疹";s:2:"^";s:3:"真";s:2:"_";s:3:"神";s:2:"`";s:3:"秦";s:2:"a";s:3:"紳";s:2:"b";s:3:"臣";s:2:"c";s:3:"芯";s:2:"d";s:3:"薪";s:2:"e";s:3:"親";s:2:"f";s:3:"診";s:2:"g";s:3:"身";s:2:"h";s:3:"辛";s:2:"i";s:3:"進";s:2:"j";s:3:"針";s:2:"k";s:3:"震";s:2:"l";s:3:"人";s:2:"m";s:3:"仁";s:2:"n";s:3:"刃";s:2:"o";s:3:"塵";s:2:"p";s:3:"壬";s:2:"q";s:3:"尋";s:2:"r";s:3:"甚";s:2:"s";s:3:"尽";s:2:"t";s:3:"腎";s:2:"u";s:3:"訊";s:2:"v";s:3:"迅";s:2:"w";s:3:"陣";s:2:"x";s:3:"靭";s:2:"y";s:3:"笥";s:2:"z";s:3:"諏";s:2:"{";s:3:"須";s:2:"|";s:3:"酢";s:2:"}";s:3:"図";s:2:"~";s:3:"厨";s:2:"";s:3:"逗";s:2:"";s:3:"吹";s:2:"";s:3:"垂";s:2:"";s:3:"帥";s:2:"";s:3:"推";s:2:"";s:3:"水";s:2:"";s:3:"炊";s:2:"";s:3:"睡";s:2:"";s:3:"粋";s:2:"";s:3:"翠";s:2:"";s:3:"衰";s:2:"";s:3:"遂";s:2:"";s:3:"酔";s:2:"";s:3:"錐";s:2:"";s:3:"錘";s:2:"";s:3:"随";s:2:"";s:3:"瑞";s:2:"";s:3:"髄";s:2:"";s:3:"崇";s:2:"";s:3:"嵩";s:2:"";s:3:"数";s:2:"";s:3:"枢";s:2:"";s:3:"趨";s:2:"";s:3:"雛";s:2:"";s:3:"据";s:2:"";s:3:"杉";s:2:"";s:3:"椙";s:2:"";s:3:"菅";s:2:"";s:3:"頗";s:2:"";s:3:"雀";s:2:"";s:3:"裾";s:2:"";s:3:"澄";s:2:"";s:3:"摺";s:2:"";s:3:"寸";s:2:"";s:3:"世";s:2:"";s:3:"瀬";s:2:"";s:3:"畝";s:2:"";s:3:"是";s:2:"";s:3:"凄";s:2:"";s:3:"制";s:2:"";s:3:"勢";s:2:"";s:3:"姓";s:2:"";s:3:"征";s:2:"";s:3:"性";s:2:"";s:3:"成";s:2:"";s:3:"政";s:2:"";s:3:"整";s:2:"";s:3:"星";s:2:"";s:3:"晴";s:2:"";s:3:"棲";s:2:"";s:3:"栖";s:2:"";s:3:"正";s:2:"";s:3:"清";s:2:"";s:3:"牲";s:2:"";s:3:"生";s:2:"";s:3:"盛";s:2:"";s:3:"精";s:2:"";s:3:"聖";s:2:"";s:3:"声";s:2:"";s:3:"製";s:2:"";s:3:"西";s:2:"";s:3:"誠";s:2:"";s:3:"誓";s:2:"";s:3:"請";s:2:"";s:3:"逝";s:2:"";s:3:"醒";s:2:"";s:3:"青";s:2:"";s:3:"静";s:2:"";s:3:"斉";s:2:"";s:3:"税";s:2:"";s:3:"脆";s:2:"";s:3:"隻";s:2:"";s:3:"席";s:2:"";s:3:"惜";s:2:"";s:3:"戚";s:2:"";s:3:"斥";s:2:"";s:3:"昔";s:2:"";s:3:"析";s:2:"";s:3:"石";s:2:"";s:3:"積";s:2:"";s:3:"籍";s:2:"";s:3:"績";s:2:"";s:3:"脊";s:2:"";s:3:"責";s:2:"";s:3:"赤";s:2:"";s:3:"跡";s:2:"";s:3:"蹟";s:2:"";s:3:"碩";s:2:"";s:3:"切";s:2:"";s:3:"拙";s:2:"";s:3:"接";s:2:"";s:3:"摂";s:2:"";s:3:"折";s:2:"";s:3:"設";s:2:"";s:3:"窃";s:2:"";s:3:"節";s:2:"";s:3:"説";s:2:"";s:3:"雪";s:2:"";s:3:"絶";s:2:"";s:3:"舌";s:2:"";s:3:"蝉";s:2:"";s:3:"仙";s:2:"";s:3:"先";s:2:"";s:3:"千";s:2:"";s:3:"占";s:2:"";s:3:"宣";s:2:"";s:3:"専";s:2:"";s:3:"尖";s:2:"";s:3:"川";s:2:"";s:3:"戦";s:2:"";s:3:"扇";s:2:"";s:3:"撰";s:2:"";s:3:"栓";s:2:"";s:3:"栴";s:2:"";s:3:"泉";s:2:"";s:3:"浅";s:2:"";s:3:"洗";s:2:"";s:3:"染";s:2:"";s:3:"潜";s:2:"";s:3:"煎";s:2:"";s:3:"煽";s:2:"";s:3:"旋";s:2:"";s:3:"穿";s:2:"";s:3:"箭";s:2:"";s:3:"線";s:2:"@";s:3:"繊";s:2:"A";s:3:"羨";s:2:"B";s:3:"腺";s:2:"C";s:3:"舛";s:2:"D";s:3:"船";s:2:"E";s:3:"薦";s:2:"F";s:3:"詮";s:2:"G";s:3:"賎";s:2:"H";s:3:"践";s:2:"I";s:3:"選";s:2:"J";s:3:"遷";s:2:"K";s:3:"銭";s:2:"L";s:3:"銑";s:2:"M";s:3:"閃";s:2:"N";s:3:"鮮";s:2:"O";s:3:"前";s:2:"P";s:3:"善";s:2:"Q";s:3:"漸";s:2:"R";s:3:"然";s:2:"S";s:3:"全";s:2:"T";s:3:"禅";s:2:"U";s:3:"繕";s:2:"V";s:3:"膳";s:2:"W";s:3:"糎";s:2:"X";s:3:"噌";s:2:"Y";s:3:"塑";s:2:"Z";s:3:"岨";s:2:"[";s:3:"措";s:2:"\";s:3:"曾";s:2:"]";s:3:"曽";s:2:"^";s:3:"楚";s:2:"_";s:3:"狙";s:2:"`";s:3:"疏";s:2:"a";s:3:"疎";s:2:"b";s:3:"礎";s:2:"c";s:3:"祖";s:2:"d";s:3:"租";s:2:"e";s:3:"粗";s:2:"f";s:3:"素";s:2:"g";s:3:"組";s:2:"h";s:3:"蘇";s:2:"i";s:3:"訴";s:2:"j";s:3:"阻";s:2:"k";s:3:"遡";s:2:"l";s:3:"鼠";s:2:"m";s:3:"僧";s:2:"n";s:3:"創";s:2:"o";s:3:"双";s:2:"p";s:3:"叢";s:2:"q";s:3:"倉";s:2:"r";s:3:"喪";s:2:"s";s:3:"壮";s:2:"t";s:3:"奏";s:2:"u";s:3:"爽";s:2:"v";s:3:"宋";s:2:"w";s:3:"層";s:2:"x";s:3:"匝";s:2:"y";s:3:"惣";s:2:"z";s:3:"想";s:2:"{";s:3:"捜";s:2:"|";s:3:"掃";s:2:"}";s:3:"挿";s:2:"~";s:3:"掻";s:2:"";s:3:"操";s:2:"";s:3:"早";s:2:"";s:3:"曹";s:2:"";s:3:"巣";s:2:"";s:3:"槍";s:2:"";s:3:"槽";s:2:"";s:3:"漕";s:2:"";s:3:"燥";s:2:"";s:3:"争";s:2:"";s:3:"痩";s:2:"";s:3:"相";s:2:"";s:3:"窓";s:2:"";s:3:"糟";s:2:"";s:3:"総";s:2:"";s:3:"綜";s:2:"";s:3:"聡";s:2:"";s:3:"草";s:2:"";s:3:"荘";s:2:"";s:3:"葬";s:2:"";s:3:"蒼";s:2:"";s:3:"藻";s:2:"";s:3:"装";s:2:"";s:3:"走";s:2:"";s:3:"送";s:2:"";s:3:"遭";s:2:"";s:3:"鎗";s:2:"";s:3:"霜";s:2:"";s:3:"騒";s:2:"";s:3:"像";s:2:"";s:3:"増";s:2:"";s:3:"憎";s:2:"";s:3:"臓";s:2:"";s:3:"蔵";s:2:"";s:3:"贈";s:2:"";s:3:"造";s:2:"";s:3:"促";s:2:"";s:3:"側";s:2:"";s:3:"則";s:2:"";s:3:"即";s:2:"";s:3:"息";s:2:"";s:3:"捉";s:2:"";s:3:"束";s:2:"";s:3:"測";s:2:"";s:3:"足";s:2:"";s:3:"速";s:2:"";s:3:"俗";s:2:"";s:3:"属";s:2:"";s:3:"賊";s:2:"";s:3:"族";s:2:"";s:3:"続";s:2:"";s:3:"卒";s:2:"";s:3:"袖";s:2:"";s:3:"其";s:2:"";s:3:"揃";s:2:"";s:3:"存";s:2:"";s:3:"孫";s:2:"";s:3:"尊";s:2:"";s:3:"損";s:2:"";s:3:"村";s:2:"";s:3:"遜";s:2:"";s:3:"他";s:2:"";s:3:"多";s:2:"";s:3:"太";s:2:"";s:3:"汰";s:2:"";s:3:"詑";s:2:"";s:3:"唾";s:2:"";s:3:"堕";s:2:"";s:3:"妥";s:2:"";s:3:"惰";s:2:"";s:3:"打";s:2:"";s:3:"柁";s:2:"";s:3:"舵";s:2:"";s:3:"楕";s:2:"";s:3:"陀";s:2:"";s:3:"駄";s:2:"";s:3:"騨";s:2:"";s:3:"体";s:2:"";s:3:"堆";s:2:"";s:3:"対";s:2:"";s:3:"耐";s:2:"";s:3:"岱";s:2:"";s:3:"帯";s:2:"";s:3:"待";s:2:"";s:3:"怠";s:2:"";s:3:"態";s:2:"";s:3:"戴";s:2:"";s:3:"替";s:2:"";s:3:"泰";s:2:"";s:3:"滞";s:2:"";s:3:"胎";s:2:"";s:3:"腿";s:2:"";s:3:"苔";s:2:"";s:3:"袋";s:2:"";s:3:"貸";s:2:"";s:3:"退";s:2:"";s:3:"逮";s:2:"";s:3:"隊";s:2:"";s:3:"黛";s:2:"";s:3:"鯛";s:2:"";s:3:"代";s:2:"";s:3:"台";s:2:"";s:3:"大";s:2:"";s:3:"第";s:2:"";s:3:"醍";s:2:"";s:3:"題";s:2:"";s:3:"鷹";s:2:"";s:3:"滝";s:2:"";s:3:"瀧";s:2:"";s:3:"卓";s:2:"";s:3:"啄";s:2:"";s:3:"宅";s:2:"";s:3:"托";s:2:"";s:3:"択";s:2:"";s:3:"拓";s:2:"";s:3:"沢";s:2:"";s:3:"濯";s:2:"";s:3:"琢";s:2:"";s:3:"託";s:2:"";s:3:"鐸";s:2:"";s:3:"濁";s:2:"";s:3:"諾";s:2:"";s:3:"茸";s:2:"";s:3:"凧";s:2:"";s:3:"蛸";s:2:"";s:3:"只";s:2:"@";s:3:"叩";s:2:"A";s:3:"但";s:2:"B";s:3:"達";s:2:"C";s:3:"辰";s:2:"D";s:3:"奪";s:2:"E";s:3:"脱";s:2:"F";s:3:"巽";s:2:"G";s:3:"竪";s:2:"H";s:3:"辿";s:2:"I";s:3:"棚";s:2:"J";s:3:"谷";s:2:"K";s:3:"狸";s:2:"L";s:3:"鱈";s:2:"M";s:3:"樽";s:2:"N";s:3:"誰";s:2:"O";s:3:"丹";s:2:"P";s:3:"単";s:2:"Q";s:3:"嘆";s:2:"R";s:3:"坦";s:2:"S";s:3:"担";s:2:"T";s:3:"探";s:2:"U";s:3:"旦";s:2:"V";s:3:"歎";s:2:"W";s:3:"淡";s:2:"X";s:3:"湛";s:2:"Y";s:3:"炭";s:2:"Z";s:3:"短";s:2:"[";s:3:"端";s:2:"\";s:3:"箪";s:2:"]";s:3:"綻";s:2:"^";s:3:"耽";s:2:"_";s:3:"胆";s:2:"`";s:3:"蛋";s:2:"a";s:3:"誕";s:2:"b";s:3:"鍛";s:2:"c";s:3:"団";s:2:"d";s:3:"壇";s:2:"e";s:3:"弾";s:2:"f";s:3:"断";s:2:"g";s:3:"暖";s:2:"h";s:3:"檀";s:2:"i";s:3:"段";s:2:"j";s:3:"男";s:2:"k";s:3:"談";s:2:"l";s:3:"値";s:2:"m";s:3:"知";s:2:"n";s:3:"地";s:2:"o";s:3:"弛";s:2:"p";s:3:"恥";s:2:"q";s:3:"智";s:2:"r";s:3:"池";s:2:"s";s:3:"痴";s:2:"t";s:3:"稚";s:2:"u";s:3:"置";s:2:"v";s:3:"致";s:2:"w";s:3:"蜘";s:2:"x";s:3:"遅";s:2:"y";s:3:"馳";s:2:"z";s:3:"築";s:2:"{";s:3:"畜";s:2:"|";s:3:"竹";s:2:"}";s:3:"筑";s:2:"~";s:3:"蓄";s:2:"";s:3:"逐";s:2:"";s:3:"秩";s:2:"";s:3:"窒";s:2:"";s:3:"茶";s:2:"";s:3:"嫡";s:2:"";s:3:"着";s:2:"";s:3:"中";s:2:"";s:3:"仲";s:2:"";s:3:"宙";s:2:"";s:3:"忠";s:2:"";s:3:"抽";s:2:"";s:3:"昼";s:2:"";s:3:"柱";s:2:"";s:3:"注";s:2:"";s:3:"虫";s:2:"";s:3:"衷";s:2:"";s:3:"註";s:2:"";s:3:"酎";s:2:"";s:3:"鋳";s:2:"";s:3:"駐";s:2:"";s:3:"樗";s:2:"";s:3:"瀦";s:2:"";s:3:"猪";s:2:"";s:3:"苧";s:2:"";s:3:"著";s:2:"";s:3:"貯";s:2:"";s:3:"丁";s:2:"";s:3:"兆";s:2:"";s:3:"凋";s:2:"";s:3:"喋";s:2:"";s:3:"寵";s:2:"";s:3:"帖";s:2:"";s:3:"帳";s:2:"";s:3:"庁";s:2:"";s:3:"弔";s:2:"";s:3:"張";s:2:"";s:3:"彫";s:2:"";s:3:"徴";s:2:"";s:3:"懲";s:2:"";s:3:"挑";s:2:"";s:3:"暢";s:2:"";s:3:"朝";s:2:"";s:3:"潮";s:2:"";s:3:"牒";s:2:"";s:3:"町";s:2:"";s:3:"眺";s:2:"";s:3:"聴";s:2:"";s:3:"脹";s:2:"";s:3:"腸";s:2:"";s:3:"蝶";s:2:"";s:3:"調";s:2:"";s:3:"諜";s:2:"";s:3:"超";s:2:"";s:3:"跳";s:2:"";s:3:"銚";s:2:"";s:3:"長";s:2:"";s:3:"頂";s:2:"";s:3:"鳥";s:2:"";s:3:"勅";s:2:"";s:3:"捗";s:2:"";s:3:"直";s:2:"";s:3:"朕";s:2:"";s:3:"沈";s:2:"";s:3:"珍";s:2:"";s:3:"賃";s:2:"";s:3:"鎮";s:2:"";s:3:"陳";s:2:"";s:3:"津";s:2:"";s:3:"墜";s:2:"";s:3:"椎";s:2:"";s:3:"槌";s:2:"";s:3:"追";s:2:"";s:3:"鎚";s:2:"";s:3:"痛";s:2:"";s:3:"通";s:2:"";s:3:"塚";s:2:"";s:3:"栂";s:2:"";s:3:"掴";s:2:"";s:3:"槻";s:2:"";s:3:"佃";s:2:"";s:3:"漬";s:2:"";s:3:"柘";s:2:"";s:3:"辻";s:2:"";s:3:"蔦";s:2:"";s:3:"綴";s:2:"";s:3:"鍔";s:2:"";s:3:"椿";s:2:"";s:3:"潰";s:2:"";s:3:"坪";s:2:"";s:3:"壷";s:2:"";s:3:"嬬";s:2:"";s:3:"紬";s:2:"";s:3:"爪";s:2:"";s:3:"吊";s:2:"";s:3:"釣";s:2:"";s:3:"鶴";s:2:"";s:3:"亭";s:2:"";s:3:"低";s:2:"";s:3:"停";s:2:"";s:3:"偵";s:2:"";s:3:"剃";s:2:"";s:3:"貞";s:2:"";s:3:"呈";s:2:"";s:3:"堤";s:2:"";s:3:"定";s:2:"";s:3:"帝";s:2:"";s:3:"底";s:2:"";s:3:"庭";s:2:"";s:3:"廷";s:2:"";s:3:"弟";s:2:"";s:3:"悌";s:2:"";s:3:"抵";s:2:"";s:3:"挺";s:2:"";s:3:"提";s:2:"";s:3:"梯";s:2:"";s:3:"汀";s:2:"";s:3:"碇";s:2:"";s:3:"禎";s:2:"";s:3:"程";s:2:"";s:3:"締";s:2:"";s:3:"艇";s:2:"";s:3:"訂";s:2:"";s:3:"諦";s:2:"";s:3:"蹄";s:2:"";s:3:"逓";s:2:"@";s:3:"邸";s:2:"A";s:3:"鄭";s:2:"B";s:3:"釘";s:2:"C";s:3:"鼎";s:2:"D";s:3:"泥";s:2:"E";s:3:"摘";s:2:"F";s:3:"擢";s:2:"G";s:3:"敵";s:2:"H";s:3:"滴";s:2:"I";s:3:"的";s:2:"J";s:3:"笛";s:2:"K";s:3:"適";s:2:"L";s:3:"鏑";s:2:"M";s:3:"溺";s:2:"N";s:3:"哲";s:2:"O";s:3:"徹";s:2:"P";s:3:"撤";s:2:"Q";s:3:"轍";s:2:"R";s:3:"迭";s:2:"S";s:3:"鉄";s:2:"T";s:3:"典";s:2:"U";s:3:"填";s:2:"V";s:3:"天";s:2:"W";s:3:"展";s:2:"X";s:3:"店";s:2:"Y";s:3:"添";s:2:"Z";s:3:"纏";s:2:"[";s:3:"甜";s:2:"\";s:3:"貼";s:2:"]";s:3:"転";s:2:"^";s:3:"顛";s:2:"_";s:3:"点";s:2:"`";s:3:"伝";s:2:"a";s:3:"殿";s:2:"b";s:3:"澱";s:2:"c";s:3:"田";s:2:"d";s:3:"電";s:2:"e";s:3:"兎";s:2:"f";s:3:"吐";s:2:"g";s:3:"堵";s:2:"h";s:3:"塗";s:2:"i";s:3:"妬";s:2:"j";s:3:"屠";s:2:"k";s:3:"徒";s:2:"l";s:3:"斗";s:2:"m";s:3:"杜";s:2:"n";s:3:"渡";s:2:"o";s:3:"登";s:2:"p";s:3:"菟";s:2:"q";s:3:"賭";s:2:"r";s:3:"途";s:2:"s";s:3:"都";s:2:"t";s:3:"鍍";s:2:"u";s:3:"砥";s:2:"v";s:3:"砺";s:2:"w";s:3:"努";s:2:"x";s:3:"度";s:2:"y";s:3:"土";s:2:"z";s:3:"奴";s:2:"{";s:3:"怒";s:2:"|";s:3:"倒";s:2:"}";s:3:"党";s:2:"~";s:3:"冬";s:2:"";s:3:"凍";s:2:"";s:3:"刀";s:2:"";s:3:"唐";s:2:"";s:3:"塔";s:2:"";s:3:"塘";s:2:"";s:3:"套";s:2:"";s:3:"宕";s:2:"";s:3:"島";s:2:"";s:3:"嶋";s:2:"";s:3:"悼";s:2:"";s:3:"投";s:2:"";s:3:"搭";s:2:"";s:3:"東";s:2:"";s:3:"桃";s:2:"";s:3:"梼";s:2:"";s:3:"棟";s:2:"";s:3:"盗";s:2:"";s:3:"淘";s:2:"";s:3:"湯";s:2:"";s:3:"涛";s:2:"";s:3:"灯";s:2:"";s:3:"燈";s:2:"";s:3:"当";s:2:"";s:3:"痘";s:2:"";s:3:"祷";s:2:"";s:3:"等";s:2:"";s:3:"答";s:2:"";s:3:"筒";s:2:"";s:3:"糖";s:2:"";s:3:"統";s:2:"";s:3:"到";s:2:"";s:3:"董";s:2:"";s:3:"蕩";s:2:"";s:3:"藤";s:2:"";s:3:"討";s:2:"";s:3:"謄";s:2:"";s:3:"豆";s:2:"";s:3:"踏";s:2:"";s:3:"逃";s:2:"";s:3:"透";s:2:"";s:3:"鐙";s:2:"";s:3:"陶";s:2:"";s:3:"頭";s:2:"";s:3:"騰";s:2:"";s:3:"闘";s:2:"";s:3:"働";s:2:"";s:3:"動";s:2:"";s:3:"同";s:2:"";s:3:"堂";s:2:"";s:3:"導";s:2:"";s:3:"憧";s:2:"";s:3:"撞";s:2:"";s:3:"洞";s:2:"";s:3:"瞳";s:2:"";s:3:"童";s:2:"";s:3:"胴";s:2:"";s:3:"萄";s:2:"";s:3:"道";s:2:"";s:3:"銅";s:2:"";s:3:"峠";s:2:"";s:3:"鴇";s:2:"";s:3:"匿";s:2:"";s:3:"得";s:2:"";s:3:"徳";s:2:"";s:3:"涜";s:2:"";s:3:"特";s:2:"";s:3:"督";s:2:"";s:3:"禿";s:2:"";s:3:"篤";s:2:"";s:3:"毒";s:2:"";s:3:"独";s:2:"";s:3:"読";s:2:"";s:3:"栃";s:2:"";s:3:"橡";s:2:"";s:3:"凸";s:2:"";s:3:"突";s:2:"";s:3:"椴";s:2:"";s:3:"届";s:2:"";s:3:"鳶";s:2:"";s:3:"苫";s:2:"";s:3:"寅";s:2:"";s:3:"酉";s:2:"";s:3:"瀞";s:2:"";s:3:"噸";s:2:"";s:3:"屯";s:2:"";s:3:"惇";s:2:"";s:3:"敦";s:2:"";s:3:"沌";s:2:"";s:3:"豚";s:2:"";s:3:"遁";s:2:"";s:3:"頓";s:2:"";s:3:"呑";s:2:"";s:3:"曇";s:2:"";s:3:"鈍";s:2:"";s:3:"奈";s:2:"";s:3:"那";s:2:"";s:3:"内";s:2:"";s:3:"乍";s:2:"";s:3:"凪";s:2:"";s:3:"薙";s:2:"";s:3:"謎";s:2:"";s:3:"灘";s:2:"";s:3:"捺";s:2:"";s:3:"鍋";s:2:"";s:3:"楢";s:2:"";s:3:"馴";s:2:"";s:3:"縄";s:2:"";s:3:"畷";s:2:"";s:3:"南";s:2:"";s:3:"楠";s:2:"";s:3:"軟";s:2:"";s:3:"難";s:2:"";s:3:"汝";s:2:"";s:3:"二";s:2:"";s:3:"尼";s:2:"";s:3:"弐";s:2:"";s:3:"迩";s:2:"";s:3:"匂";s:2:"";s:3:"賑";s:2:"";s:3:"肉";s:2:"";s:3:"虹";s:2:"";s:3:"廿";s:2:"";s:3:"日";s:2:"";s:3:"乳";s:2:"";s:3:"入";s:2:"@";s:3:"如";s:2:"A";s:3:"尿";s:2:"B";s:3:"韮";s:2:"C";s:3:"任";s:2:"D";s:3:"妊";s:2:"E";s:3:"忍";s:2:"F";s:3:"認";s:2:"G";s:3:"濡";s:2:"H";s:3:"禰";s:2:"I";s:3:"祢";s:2:"J";s:3:"寧";s:2:"K";s:3:"葱";s:2:"L";s:3:"猫";s:2:"M";s:3:"熱";s:2:"N";s:3:"年";s:2:"O";s:3:"念";s:2:"P";s:3:"捻";s:2:"Q";s:3:"撚";s:2:"R";s:3:"燃";s:2:"S";s:3:"粘";s:2:"T";s:3:"乃";s:2:"U";s:3:"廼";s:2:"V";s:3:"之";s:2:"W";s:3:"埜";s:2:"X";s:3:"嚢";s:2:"Y";s:3:"悩";s:2:"Z";s:3:"濃";s:2:"[";s:3:"納";s:2:"\";s:3:"能";s:2:"]";s:3:"脳";s:2:"^";s:3:"膿";s:2:"_";s:3:"農";s:2:"`";s:3:"覗";s:2:"a";s:3:"蚤";s:2:"b";s:3:"巴";s:2:"c";s:3:"把";s:2:"d";s:3:"播";s:2:"e";s:3:"覇";s:2:"f";s:3:"杷";s:2:"g";s:3:"波";s:2:"h";s:3:"派";s:2:"i";s:3:"琶";s:2:"j";s:3:"破";s:2:"k";s:3:"婆";s:2:"l";s:3:"罵";s:2:"m";s:3:"芭";s:2:"n";s:3:"馬";s:2:"o";s:3:"俳";s:2:"p";s:3:"廃";s:2:"q";s:3:"拝";s:2:"r";s:3:"排";s:2:"s";s:3:"敗";s:2:"t";s:3:"杯";s:2:"u";s:3:"盃";s:2:"v";s:3:"牌";s:2:"w";s:3:"背";s:2:"x";s:3:"肺";s:2:"y";s:3:"輩";s:2:"z";s:3:"配";s:2:"{";s:3:"倍";s:2:"|";s:3:"培";s:2:"}";s:3:"媒";s:2:"~";s:3:"梅";s:2:"";s:3:"楳";s:2:"";s:3:"煤";s:2:"";s:3:"狽";s:2:"";s:3:"買";s:2:"";s:3:"売";s:2:"";s:3:"賠";s:2:"";s:3:"陪";s:2:"";s:3:"這";s:2:"";s:3:"蝿";s:2:"";s:3:"秤";s:2:"";s:3:"矧";s:2:"";s:3:"萩";s:2:"";s:3:"伯";s:2:"";s:3:"剥";s:2:"";s:3:"博";s:2:"";s:3:"拍";s:2:"";s:3:"柏";s:2:"";s:3:"泊";s:2:"";s:3:"白";s:2:"";s:3:"箔";s:2:"";s:3:"粕";s:2:"";s:3:"舶";s:2:"";s:3:"薄";s:2:"";s:3:"迫";s:2:"";s:3:"曝";s:2:"";s:3:"漠";s:2:"";s:3:"爆";s:2:"";s:3:"縛";s:2:"";s:3:"莫";s:2:"";s:3:"駁";s:2:"";s:3:"麦";s:2:"";s:3:"函";s:2:"";s:3:"箱";s:2:"";s:3:"硲";s:2:"";s:3:"箸";s:2:"";s:3:"肇";s:2:"";s:3:"筈";s:2:"";s:3:"櫨";s:2:"";s:3:"幡";s:2:"";s:3:"肌";s:2:"";s:3:"畑";s:2:"";s:3:"畠";s:2:"";s:3:"八";s:2:"";s:3:"鉢";s:2:"";s:3:"溌";s:2:"";s:3:"発";s:2:"";s:3:"醗";s:2:"";s:3:"髪";s:2:"";s:3:"伐";s:2:"";s:3:"罰";s:2:"";s:3:"抜";s:2:"";s:3:"筏";s:2:"";s:3:"閥";s:2:"";s:3:"鳩";s:2:"";s:3:"噺";s:2:"";s:3:"塙";s:2:"";s:3:"蛤";s:2:"";s:3:"隼";s:2:"";s:3:"伴";s:2:"";s:3:"判";s:2:"";s:3:"半";s:2:"";s:3:"反";s:2:"";s:3:"叛";s:2:"";s:3:"帆";s:2:"";s:3:"搬";s:2:"";s:3:"斑";s:2:"";s:3:"板";s:2:"";s:3:"氾";s:2:"";s:3:"汎";s:2:"";s:3:"版";s:2:"";s:3:"犯";s:2:"";s:3:"班";s:2:"";s:3:"畔";s:2:"";s:3:"繁";s:2:"";s:3:"般";s:2:"";s:3:"藩";s:2:"";s:3:"販";s:2:"";s:3:"範";s:2:"";s:3:"釆";s:2:"";s:3:"煩";s:2:"";s:3:"頒";s:2:"";s:3:"飯";s:2:"";s:3:"挽";s:2:"";s:3:"晩";s:2:"";s:3:"番";s:2:"";s:3:"盤";s:2:"";s:3:"磐";s:2:"";s:3:"蕃";s:2:"";s:3:"蛮";s:2:"";s:3:"匪";s:2:"";s:3:"卑";s:2:"";s:3:"否";s:2:"";s:3:"妃";s:2:"";s:3:"庇";s:2:"";s:3:"彼";s:2:"";s:3:"悲";s:2:"";s:3:"扉";s:2:"";s:3:"批";s:2:"";s:3:"披";s:2:"";s:3:"斐";s:2:"";s:3:"比";s:2:"";s:3:"泌";s:2:"";s:3:"疲";s:2:"";s:3:"皮";s:2:"";s:3:"碑";s:2:"";s:3:"秘";s:2:"";s:3:"緋";s:2:"";s:3:"罷";s:2:"";s:3:"肥";s:2:"";s:3:"被";s:2:"";s:3:"誹";s:2:"";s:3:"費";s:2:"";s:3:"避";s:2:"";s:3:"非";s:2:"";s:3:"飛";s:2:"";s:3:"樋";s:2:"";s:3:"簸";s:2:"";s:3:"備";s:2:"";s:3:"尾";s:2:"";s:3:"微";s:2:"";s:3:"枇";s:2:"";s:3:"毘";s:2:"";s:3:"琵";s:2:"";s:3:"眉";s:2:"";s:3:"美";s:2:"@";s:3:"鼻";s:2:"A";s:3:"柊";s:2:"B";s:3:"稗";s:2:"C";s:3:"匹";s:2:"D";s:3:"疋";s:2:"E";s:3:"髭";s:2:"F";s:3:"彦";s:2:"G";s:3:"膝";s:2:"H";s:3:"菱";s:2:"I";s:3:"肘";s:2:"J";s:3:"弼";s:2:"K";s:3:"必";s:2:"L";s:3:"畢";s:2:"M";s:3:"筆";s:2:"N";s:3:"逼";s:2:"O";s:3:"桧";s:2:"P";s:3:"姫";s:2:"Q";s:3:"媛";s:2:"R";s:3:"紐";s:2:"S";s:3:"百";s:2:"T";s:3:"謬";s:2:"U";s:3:"俵";s:2:"V";s:3:"彪";s:2:"W";s:3:"標";s:2:"X";s:3:"氷";s:2:"Y";s:3:"漂";s:2:"Z";s:3:"瓢";s:2:"[";s:3:"票";s:2:"\";s:3:"表";s:2:"]";s:3:"評";s:2:"^";s:3:"豹";s:2:"_";s:3:"廟";s:2:"`";s:3:"描";s:2:"a";s:3:"病";s:2:"b";s:3:"秒";s:2:"c";s:3:"苗";s:2:"d";s:3:"錨";s:2:"e";s:3:"鋲";s:2:"f";s:3:"蒜";s:2:"g";s:3:"蛭";s:2:"h";s:3:"鰭";s:2:"i";s:3:"品";s:2:"j";s:3:"彬";s:2:"k";s:3:"斌";s:2:"l";s:3:"浜";s:2:"m";s:3:"瀕";s:2:"n";s:3:"貧";s:2:"o";s:3:"賓";s:2:"p";s:3:"頻";s:2:"q";s:3:"敏";s:2:"r";s:3:"瓶";s:2:"s";s:3:"不";s:2:"t";s:3:"付";s:2:"u";s:3:"埠";s:2:"v";s:3:"夫";s:2:"w";s:3:"婦";s:2:"x";s:3:"富";s:2:"y";s:3:"冨";s:2:"z";s:3:"布";s:2:"{";s:3:"府";s:2:"|";s:3:"怖";s:2:"}";s:3:"扶";s:2:"~";s:3:"敷";s:2:"";s:3:"斧";s:2:"";s:3:"普";s:2:"";s:3:"浮";s:2:"";s:3:"父";s:2:"";s:3:"符";s:2:"";s:3:"腐";s:2:"";s:3:"膚";s:2:"";s:3:"芙";s:2:"";s:3:"譜";s:2:"";s:3:"負";s:2:"";s:3:"賦";s:2:"";s:3:"赴";s:2:"";s:3:"阜";s:2:"";s:3:"附";s:2:"";s:3:"侮";s:2:"";s:3:"撫";s:2:"";s:3:"武";s:2:"";s:3:"舞";s:2:"";s:3:"葡";s:2:"";s:3:"蕪";s:2:"";s:3:"部";s:2:"";s:3:"封";s:2:"";s:3:"楓";s:2:"";s:3:"風";s:2:"";s:3:"葺";s:2:"";s:3:"蕗";s:2:"";s:3:"伏";s:2:"";s:3:"副";s:2:"";s:3:"復";s:2:"";s:3:"幅";s:2:"";s:3:"服";s:2:"";s:3:"福";s:2:"";s:3:"腹";s:2:"";s:3:"複";s:2:"";s:3:"覆";s:2:"";s:3:"淵";s:2:"";s:3:"弗";s:2:"";s:3:"払";s:2:"";s:3:"沸";s:2:"";s:3:"仏";s:2:"";s:3:"物";s:2:"";s:3:"鮒";s:2:"";s:3:"分";s:2:"";s:3:"吻";s:2:"";s:3:"噴";s:2:"";s:3:"墳";s:2:"";s:3:"憤";s:2:"";s:3:"扮";s:2:"";s:3:"焚";s:2:"";s:3:"奮";s:2:"";s:3:"粉";s:2:"";s:3:"糞";s:2:"";s:3:"紛";s:2:"";s:3:"雰";s:2:"";s:3:"文";s:2:"";s:3:"聞";s:2:"";s:3:"丙";s:2:"";s:3:"併";s:2:"";s:3:"兵";s:2:"";s:3:"塀";s:2:"";s:3:"幣";s:2:"";s:3:"平";s:2:"";s:3:"弊";s:2:"";s:3:"柄";s:2:"";s:3:"並";s:2:"";s:3:"蔽";s:2:"";s:3:"閉";s:2:"";s:3:"陛";s:2:"";s:3:"米";s:2:"";s:3:"頁";s:2:"";s:3:"僻";s:2:"";s:3:"壁";s:2:"";s:3:"癖";s:2:"";s:3:"碧";s:2:"";s:3:"別";s:2:"";s:3:"瞥";s:2:"";s:3:"蔑";s:2:"";s:3:"箆";s:2:"";s:3:"偏";s:2:"";s:3:"変";s:2:"";s:3:"片";s:2:"";s:3:"篇";s:2:"";s:3:"編";s:2:"";s:3:"辺";s:2:"";s:3:"返";s:2:"";s:3:"遍";s:2:"";s:3:"便";s:2:"";s:3:"勉";s:2:"";s:3:"娩";s:2:"";s:3:"弁";s:2:"";s:3:"鞭";s:2:"";s:3:"保";s:2:"";s:3:"舗";s:2:"";s:3:"鋪";s:2:"";s:3:"圃";s:2:"";s:3:"捕";s:2:"";s:3:"歩";s:2:"";s:3:"甫";s:2:"";s:3:"補";s:2:"";s:3:"輔";s:2:"";s:3:"穂";s:2:"";s:3:"募";s:2:"";s:3:"墓";s:2:"";s:3:"慕";s:2:"";s:3:"戊";s:2:"";s:3:"暮";s:2:"";s:3:"母";s:2:"";s:3:"簿";s:2:"";s:3:"菩";s:2:"";s:3:"倣";s:2:"";s:3:"俸";s:2:"";s:3:"包";s:2:"";s:3:"呆";s:2:"";s:3:"報";s:2:"";s:3:"奉";s:2:"";s:3:"宝";s:2:"";s:3:"峰";s:2:"";s:3:"峯";s:2:"";s:3:"崩";s:2:"";s:3:"庖";s:2:"";s:3:"抱";s:2:"";s:3:"捧";s:2:"";s:3:"放";s:2:"";s:3:"方";s:2:"";s:3:"朋";s:2:"@";s:3:"法";s:2:"A";s:3:"泡";s:2:"B";s:3:"烹";s:2:"C";s:3:"砲";s:2:"D";s:3:"縫";s:2:"E";s:3:"胞";s:2:"F";s:3:"芳";s:2:"G";s:3:"萌";s:2:"H";s:3:"蓬";s:2:"I";s:3:"蜂";s:2:"J";s:3:"褒";s:2:"K";s:3:"訪";s:2:"L";s:3:"豊";s:2:"M";s:3:"邦";s:2:"N";s:3:"鋒";s:2:"O";s:3:"飽";s:2:"P";s:3:"鳳";s:2:"Q";s:3:"鵬";s:2:"R";s:3:"乏";s:2:"S";s:3:"亡";s:2:"T";s:3:"傍";s:2:"U";s:3:"剖";s:2:"V";s:3:"坊";s:2:"W";s:3:"妨";s:2:"X";s:3:"帽";s:2:"Y";s:3:"忘";s:2:"Z";s:3:"忙";s:2:"[";s:3:"房";s:2:"\";s:3:"暴";s:2:"]";s:3:"望";s:2:"^";s:3:"某";s:2:"_";s:3:"棒";s:2:"`";s:3:"冒";s:2:"a";s:3:"紡";s:2:"b";s:3:"肪";s:2:"c";s:3:"膨";s:2:"d";s:3:"謀";s:2:"e";s:3:"貌";s:2:"f";s:3:"貿";s:2:"g";s:3:"鉾";s:2:"h";s:3:"防";s:2:"i";s:3:"吠";s:2:"j";s:3:"頬";s:2:"k";s:3:"北";s:2:"l";s:3:"僕";s:2:"m";s:3:"卜";s:2:"n";s:3:"墨";s:2:"o";s:3:"撲";s:2:"p";s:3:"朴";s:2:"q";s:3:"牧";s:2:"r";s:3:"睦";s:2:"s";s:3:"穆";s:2:"t";s:3:"釦";s:2:"u";s:3:"勃";s:2:"v";s:3:"没";s:2:"w";s:3:"殆";s:2:"x";s:3:"堀";s:2:"y";s:3:"幌";s:2:"z";s:3:"奔";s:2:"{";s:3:"本";s:2:"|";s:3:"翻";s:2:"}";s:3:"凡";s:2:"~";s:3:"盆";s:2:"";s:3:"摩";s:2:"";s:3:"磨";s:2:"";s:3:"魔";s:2:"";s:3:"麻";s:2:"";s:3:"埋";s:2:"";s:3:"妹";s:2:"";s:3:"昧";s:2:"";s:3:"枚";s:2:"";s:3:"毎";s:2:"";s:3:"哩";s:2:"";s:3:"槙";s:2:"";s:3:"幕";s:2:"";s:3:"膜";s:2:"";s:3:"枕";s:2:"";s:3:"鮪";s:2:"";s:3:"柾";s:2:"";s:3:"鱒";s:2:"";s:3:"桝";s:2:"";s:3:"亦";s:2:"";s:3:"俣";s:2:"";s:3:"又";s:2:"";s:3:"抹";s:2:"";s:3:"末";s:2:"";s:3:"沫";s:2:"";s:3:"迄";s:2:"";s:3:"侭";s:2:"";s:3:"繭";s:2:"";s:3:"麿";s:2:"";s:3:"万";s:2:"";s:3:"慢";s:2:"";s:3:"満";s:2:"";s:3:"漫";s:2:"";s:3:"蔓";s:2:"";s:3:"味";s:2:"";s:3:"未";s:2:"";s:3:"魅";s:2:"";s:3:"巳";s:2:"";s:3:"箕";s:2:"";s:3:"岬";s:2:"";s:3:"密";s:2:"";s:3:"蜜";s:2:"";s:3:"湊";s:2:"";s:3:"蓑";s:2:"";s:3:"稔";s:2:"";s:3:"脈";s:2:"";s:3:"妙";s:2:"";s:3:"粍";s:2:"";s:3:"民";s:2:"";s:3:"眠";s:2:"";s:3:"務";s:2:"";s:3:"夢";s:2:"";s:3:"無";s:2:"";s:3:"牟";s:2:"";s:3:"矛";s:2:"";s:3:"霧";s:2:"";s:3:"鵡";s:2:"";s:3:"椋";s:2:"";s:3:"婿";s:2:"";s:3:"娘";s:2:"";s:3:"冥";s:2:"";s:3:"名";s:2:"";s:3:"命";s:2:"";s:3:"明";s:2:"";s:3:"盟";s:2:"";s:3:"迷";s:2:"";s:3:"銘";s:2:"";s:3:"鳴";s:2:"";s:3:"姪";s:2:"";s:3:"牝";s:2:"";s:3:"滅";s:2:"";s:3:"免";s:2:"";s:3:"棉";s:2:"";s:3:"綿";s:2:"";s:3:"緬";s:2:"";s:3:"面";s:2:"";s:3:"麺";s:2:"";s:3:"摸";s:2:"";s:3:"模";s:2:"";s:3:"茂";s:2:"";s:3:"妄";s:2:"";s:3:"孟";s:2:"";s:3:"毛";s:2:"";s:3:"猛";s:2:"";s:3:"盲";s:2:"";s:3:"網";s:2:"";s:3:"耗";s:2:"";s:3:"蒙";s:2:"";s:3:"儲";s:2:"";s:3:"木";s:2:"";s:3:"黙";s:2:"";s:3:"目";s:2:"";s:3:"杢";s:2:"";s:3:"勿";s:2:"";s:3:"餅";s:2:"";s:3:"尤";s:2:"";s:3:"戻";s:2:"";s:3:"籾";s:2:"";s:3:"貰";s:2:"";s:3:"問";s:2:"";s:3:"悶";s:2:"";s:3:"紋";s:2:"";s:3:"門";s:2:"";s:3:"匁";s:2:"";s:3:"也";s:2:"";s:3:"冶";s:2:"";s:3:"夜";s:2:"";s:3:"爺";s:2:"";s:3:"耶";s:2:"";s:3:"野";s:2:"";s:3:"弥";s:2:"";s:3:"矢";s:2:"";s:3:"厄";s:2:"";s:3:"役";s:2:"";s:3:"約";s:2:"";s:3:"薬";s:2:"";s:3:"訳";s:2:"";s:3:"躍";s:2:"";s:3:"靖";s:2:"";s:3:"柳";s:2:"";s:3:"薮";s:2:"";s:3:"鑓";s:2:"";s:3:"愉";s:2:"";s:3:"愈";s:2:"";s:3:"油";s:2:"";s:3:"癒";s:2:"@";s:3:"諭";s:2:"A";s:3:"輸";s:2:"B";s:3:"唯";s:2:"C";s:3:"佑";s:2:"D";s:3:"優";s:2:"E";s:3:"勇";s:2:"F";s:3:"友";s:2:"G";s:3:"宥";s:2:"H";s:3:"幽";s:2:"I";s:3:"悠";s:2:"J";s:3:"憂";s:2:"K";s:3:"揖";s:2:"L";s:3:"有";s:2:"M";s:3:"柚";s:2:"N";s:3:"湧";s:2:"O";s:3:"涌";s:2:"P";s:3:"猶";s:2:"Q";s:3:"猷";s:2:"R";s:3:"由";s:2:"S";s:3:"祐";s:2:"T";s:3:"裕";s:2:"U";s:3:"誘";s:2:"V";s:3:"遊";s:2:"W";s:3:"邑";s:2:"X";s:3:"郵";s:2:"Y";s:3:"雄";s:2:"Z";s:3:"融";s:2:"[";s:3:"夕";s:2:"\";s:3:"予";s:2:"]";s:3:"余";s:2:"^";s:3:"与";s:2:"_";s:3:"誉";s:2:"`";s:3:"輿";s:2:"a";s:3:"預";s:2:"b";s:3:"傭";s:2:"c";s:3:"幼";s:2:"d";s:3:"妖";s:2:"e";s:3:"容";s:2:"f";s:3:"庸";s:2:"g";s:3:"揚";s:2:"h";s:3:"揺";s:2:"i";s:3:"擁";s:2:"j";s:3:"曜";s:2:"k";s:3:"楊";s:2:"l";s:3:"様";s:2:"m";s:3:"洋";s:2:"n";s:3:"溶";s:2:"o";s:3:"熔";s:2:"p";s:3:"用";s:2:"q";s:3:"窯";s:2:"r";s:3:"羊";s:2:"s";s:3:"耀";s:2:"t";s:3:"葉";s:2:"u";s:3:"蓉";s:2:"v";s:3:"要";s:2:"w";s:3:"謡";s:2:"x";s:3:"踊";s:2:"y";s:3:"遥";s:2:"z";s:3:"陽";s:2:"{";s:3:"養";s:2:"|";s:3:"慾";s:2:"}";s:3:"抑";s:2:"~";s:3:"欲";s:2:"";s:3:"沃";s:2:"";s:3:"浴";s:2:"";s:3:"翌";s:2:"";s:3:"翼";s:2:"";s:3:"淀";s:2:"";s:3:"羅";s:2:"";s:3:"螺";s:2:"";s:3:"裸";s:2:"";s:3:"来";s:2:"";s:3:"莱";s:2:"";s:3:"頼";s:2:"";s:3:"雷";s:2:"";s:3:"洛";s:2:"";s:3:"絡";s:2:"";s:3:"落";s:2:"";s:3:"酪";s:2:"";s:3:"乱";s:2:"";s:3:"卵";s:2:"";s:3:"嵐";s:2:"";s:3:"欄";s:2:"";s:3:"濫";s:2:"";s:3:"藍";s:2:"";s:3:"蘭";s:2:"";s:3:"覧";s:2:"";s:3:"利";s:2:"";s:3:"吏";s:2:"";s:3:"履";s:2:"";s:3:"李";s:2:"";s:3:"梨";s:2:"";s:3:"理";s:2:"";s:3:"璃";s:2:"";s:3:"痢";s:2:"";s:3:"裏";s:2:"";s:3:"裡";s:2:"";s:3:"里";s:2:"";s:3:"離";s:2:"";s:3:"陸";s:2:"";s:3:"律";s:2:"";s:3:"率";s:2:"";s:3:"立";s:2:"";s:3:"葎";s:2:"";s:3:"掠";s:2:"";s:3:"略";s:2:"";s:3:"劉";s:2:"";s:3:"流";s:2:"";s:3:"溜";s:2:"";s:3:"琉";s:2:"";s:3:"留";s:2:"";s:3:"硫";s:2:"";s:3:"粒";s:2:"";s:3:"隆";s:2:"";s:3:"竜";s:2:"";s:3:"龍";s:2:"";s:3:"侶";s:2:"";s:3:"慮";s:2:"";s:3:"旅";s:2:"";s:3:"虜";s:2:"";s:3:"了";s:2:"";s:3:"亮";s:2:"";s:3:"僚";s:2:"";s:3:"両";s:2:"";s:3:"凌";s:2:"";s:3:"寮";s:2:"";s:3:"料";s:2:"";s:3:"梁";s:2:"";s:3:"涼";s:2:"";s:3:"猟";s:2:"";s:3:"療";s:2:"";s:3:"瞭";s:2:"";s:3:"稜";s:2:"";s:3:"糧";s:2:"";s:3:"良";s:2:"";s:3:"諒";s:2:"";s:3:"遼";s:2:"";s:3:"量";s:2:"";s:3:"陵";s:2:"";s:3:"領";s:2:"";s:3:"力";s:2:"";s:3:"緑";s:2:"";s:3:"倫";s:2:"";s:3:"厘";s:2:"";s:3:"林";s:2:"";s:3:"淋";s:2:"";s:3:"燐";s:2:"";s:3:"琳";s:2:"";s:3:"臨";s:2:"";s:3:"輪";s:2:"";s:3:"隣";s:2:"";s:3:"鱗";s:2:"";s:3:"麟";s:2:"";s:3:"瑠";s:2:"";s:3:"塁";s:2:"";s:3:"涙";s:2:"";s:3:"累";s:2:"";s:3:"類";s:2:"";s:3:"令";s:2:"";s:3:"伶";s:2:"";s:3:"例";s:2:"";s:3:"冷";s:2:"";s:3:"励";s:2:"";s:3:"嶺";s:2:"";s:3:"怜";s:2:"";s:3:"玲";s:2:"";s:3:"礼";s:2:"";s:3:"苓";s:2:"";s:3:"鈴";s:2:"";s:3:"隷";s:2:"";s:3:"零";s:2:"";s:3:"霊";s:2:"";s:3:"麗";s:2:"";s:3:"齢";s:2:"";s:3:"暦";s:2:"";s:3:"歴";s:2:"";s:3:"列";s:2:"";s:3:"劣";s:2:"";s:3:"烈";s:2:"";s:3:"裂";s:2:"";s:3:"廉";s:2:"";s:3:"恋";s:2:"";s:3:"憐";s:2:"";s:3:"漣";s:2:"";s:3:"煉";s:2:"";s:3:"簾";s:2:"";s:3:"練";s:2:"";s:3:"聯";s:2:"@";s:3:"蓮";s:2:"A";s:3:"連";s:2:"B";s:3:"錬";s:2:"C";s:3:"呂";s:2:"D";s:3:"魯";s:2:"E";s:3:"櫓";s:2:"F";s:3:"炉";s:2:"G";s:3:"賂";s:2:"H";s:3:"路";s:2:"I";s:3:"露";s:2:"J";s:3:"労";s:2:"K";s:3:"婁";s:2:"L";s:3:"廊";s:2:"M";s:3:"弄";s:2:"N";s:3:"朗";s:2:"O";s:3:"楼";s:2:"P";s:3:"榔";s:2:"Q";s:3:"浪";s:2:"R";s:3:"漏";s:2:"S";s:3:"牢";s:2:"T";s:3:"狼";s:2:"U";s:3:"篭";s:2:"V";s:3:"老";s:2:"W";s:3:"聾";s:2:"X";s:3:"蝋";s:2:"Y";s:3:"郎";s:2:"Z";s:3:"六";s:2:"[";s:3:"麓";s:2:"\";s:3:"禄";s:2:"]";s:3:"肋";s:2:"^";s:3:"録";s:2:"_";s:3:"論";s:2:"`";s:3:"倭";s:2:"a";s:3:"和";s:2:"b";s:3:"話";s:2:"c";s:3:"歪";s:2:"d";s:3:"賄";s:2:"e";s:3:"脇";s:2:"f";s:3:"惑";s:2:"g";s:3:"枠";s:2:"h";s:3:"鷲";s:2:"i";s:3:"亙";s:2:"j";s:3:"亘";s:2:"k";s:3:"鰐";s:2:"l";s:3:"詫";s:2:"m";s:3:"藁";s:2:"n";s:3:"蕨";s:2:"o";s:3:"椀";s:2:"p";s:3:"湾";s:2:"q";s:3:"碗";s:2:"r";s:3:"腕";s:2:"";s:3:"弌";s:2:"";s:3:"丐";s:2:"";s:3:"丕";s:2:"";s:3:"个";s:2:"";s:3:"丱";s:2:"";s:3:"丶";s:2:"";s:3:"丼";s:2:"";s:3:"丿";s:2:"";s:3:"乂";s:2:"";s:3:"乖";s:2:"";s:3:"乘";s:2:"";s:3:"亂";s:2:"";s:3:"亅";s:2:"";s:3:"豫";s:2:"";s:3:"亊";s:2:"";s:3:"舒";s:2:"";s:3:"弍";s:2:"";s:3:"于";s:2:"";s:3:"亞";s:2:"";s:3:"亟";s:2:"";s:3:"亠";s:2:"";s:3:"亢";s:2:"";s:3:"亰";s:2:"";s:3:"亳";s:2:"";s:3:"亶";s:2:"";s:3:"从";s:2:"";s:3:"仍";s:2:"";s:3:"仄";s:2:"";s:3:"仆";s:2:"";s:3:"仂";s:2:"";s:3:"仗";s:2:"";s:3:"仞";s:2:"";s:3:"仭";s:2:"";s:3:"仟";s:2:"";s:3:"价";s:2:"";s:3:"伉";s:2:"";s:3:"佚";s:2:"";s:3:"估";s:2:"";s:3:"佛";s:2:"";s:3:"佝";s:2:"";s:3:"佗";s:2:"";s:3:"佇";s:2:"";s:3:"佶";s:2:"";s:3:"侈";s:2:"";s:3:"侏";s:2:"";s:3:"侘";s:2:"";s:3:"佻";s:2:"";s:3:"佩";s:2:"";s:3:"佰";s:2:"";s:3:"侑";s:2:"";s:3:"佯";s:2:"";s:3:"來";s:2:"";s:3:"侖";s:2:"";s:3:"儘";s:2:"";s:3:"俔";s:2:"";s:3:"俟";s:2:"";s:3:"俎";s:2:"";s:3:"俘";s:2:"";s:3:"俛";s:2:"";s:3:"俑";s:2:"";s:3:"俚";s:2:"";s:3:"俐";s:2:"";s:3:"俤";s:2:"";s:3:"俥";s:2:"";s:3:"倚";s:2:"";s:3:"倨";s:2:"";s:3:"倔";s:2:"";s:3:"倪";s:2:"";s:3:"倥";s:2:"";s:3:"倅";s:2:"";s:3:"伜";s:2:"";s:3:"俶";s:2:"";s:3:"倡";s:2:"";s:3:"倩";s:2:"";s:3:"倬";s:2:"";s:3:"俾";s:2:"";s:3:"俯";s:2:"";s:3:"們";s:2:"";s:3:"倆";s:2:"";s:3:"偃";s:2:"";s:3:"假";s:2:"";s:3:"會";s:2:"";s:3:"偕";s:2:"";s:3:"偐";s:2:"";s:3:"偈";s:2:"";s:3:"做";s:2:"";s:3:"偖";s:2:"";s:3:"偬";s:2:"";s:3:"偸";s:2:"";s:3:"傀";s:2:"";s:3:"傚";s:2:"";s:3:"傅";s:2:"";s:3:"傴";s:2:"";s:3:"傲";s:2:"@";s:3:"僉";s:2:"A";s:3:"僊";s:2:"B";s:3:"傳";s:2:"C";s:3:"僂";s:2:"D";s:3:"僖";s:2:"E";s:3:"僞";s:2:"F";s:3:"僥";s:2:"G";s:3:"僭";s:2:"H";s:3:"僣";s:2:"I";s:3:"僮";s:2:"J";s:3:"價";s:2:"K";s:3:"僵";s:2:"L";s:3:"儉";s:2:"M";s:3:"儁";s:2:"N";s:3:"儂";s:2:"O";s:3:"儖";s:2:"P";s:3:"儕";s:2:"Q";s:3:"儔";s:2:"R";s:3:"儚";s:2:"S";s:3:"儡";s:2:"T";s:3:"儺";s:2:"U";s:3:"儷";s:2:"V";s:3:"儼";s:2:"W";s:3:"儻";s:2:"X";s:3:"儿";s:2:"Y";s:3:"兀";s:2:"Z";s:3:"兒";s:2:"[";s:3:"兌";s:2:"\";s:3:"兔";s:2:"]";s:3:"兢";s:2:"^";s:3:"竸";s:2:"_";s:3:"兩";s:2:"`";s:3:"兪";s:2:"a";s:3:"兮";s:2:"b";s:3:"冀";s:2:"c";s:3:"冂";s:2:"d";s:3:"囘";s:2:"e";s:3:"册";s:2:"f";s:3:"冉";s:2:"g";s:3:"冏";s:2:"h";s:3:"冑";s:2:"i";s:3:"冓";s:2:"j";s:3:"冕";s:2:"k";s:3:"冖";s:2:"l";s:3:"冤";s:2:"m";s:3:"冦";s:2:"n";s:3:"冢";s:2:"o";s:3:"冩";s:2:"p";s:3:"冪";s:2:"q";s:3:"冫";s:2:"r";s:3:"决";s:2:"s";s:3:"冱";s:2:"t";s:3:"冲";s:2:"u";s:3:"冰";s:2:"v";s:3:"况";s:2:"w";s:3:"冽";s:2:"x";s:3:"凅";s:2:"y";s:3:"凉";s:2:"z";s:3:"凛";s:2:"{";s:3:"几";s:2:"|";s:3:"處";s:2:"}";s:3:"凩";s:2:"~";s:3:"凭";s:2:"";s:3:"凰";s:2:"";s:3:"凵";s:2:"";s:3:"凾";s:2:"";s:3:"刄";s:2:"";s:3:"刋";s:2:"";s:3:"刔";s:2:"";s:3:"刎";s:2:"";s:3:"刧";s:2:"";s:3:"刪";s:2:"";s:3:"刮";s:2:"";s:3:"刳";s:2:"";s:3:"刹";s:2:"";s:3:"剏";s:2:"";s:3:"剄";s:2:"";s:3:"剋";s:2:"";s:3:"剌";s:2:"";s:3:"剞";s:2:"";s:3:"剔";s:2:"";s:3:"剪";s:2:"";s:3:"剴";s:2:"";s:3:"剩";s:2:"";s:3:"剳";s:2:"";s:3:"剿";s:2:"";s:3:"剽";s:2:"";s:3:"劍";s:2:"";s:3:"劔";s:2:"";s:3:"劒";s:2:"";s:3:"剱";s:2:"";s:3:"劈";s:2:"";s:3:"劑";s:2:"";s:3:"辨";s:2:"";s:3:"辧";s:2:"";s:3:"劬";s:2:"";s:3:"劭";s:2:"";s:3:"劼";s:2:"";s:3:"劵";s:2:"";s:3:"勁";s:2:"";s:3:"勍";s:2:"";s:3:"勗";s:2:"";s:3:"勞";s:2:"";s:3:"勣";s:2:"";s:3:"勦";s:2:"";s:3:"飭";s:2:"";s:3:"勠";s:2:"";s:3:"勳";s:2:"";s:3:"勵";s:2:"";s:3:"勸";s:2:"";s:3:"勹";s:2:"";s:3:"匆";s:2:"";s:3:"匈";s:2:"";s:3:"甸";s:2:"";s:3:"匍";s:2:"";s:3:"匐";s:2:"";s:3:"匏";s:2:"";s:3:"匕";s:2:"";s:3:"匚";s:2:"";s:3:"匣";s:2:"";s:3:"匯";s:2:"";s:3:"匱";s:2:"";s:3:"匳";s:2:"";s:3:"匸";s:2:"";s:3:"區";s:2:"";s:3:"卆";s:2:"";s:3:"卅";s:2:"";s:3:"丗";s:2:"";s:3:"卉";s:2:"";s:3:"卍";s:2:"";s:3:"凖";s:2:"";s:3:"卞";s:2:"";s:3:"卩";s:2:"";s:3:"卮";s:2:"";s:3:"夘";s:2:"";s:3:"卻";s:2:"";s:3:"卷";s:2:"";s:3:"厂";s:2:"";s:3:"厖";s:2:"";s:3:"厠";s:2:"";s:3:"厦";s:2:"";s:3:"厥";s:2:"";s:3:"厮";s:2:"";s:3:"厰";s:2:"";s:3:"厶";s:2:"";s:3:"參";s:2:"";s:3:"簒";s:2:"";s:3:"雙";s:2:"";s:3:"叟";s:2:"";s:3:"曼";s:2:"";s:3:"燮";s:2:"";s:3:"叮";s:2:"";s:3:"叨";s:2:"";s:3:"叭";s:2:"";s:3:"叺";s:2:"";s:3:"吁";s:2:"";s:3:"吽";s:2:"";s:3:"呀";s:2:"";s:3:"听";s:2:"";s:3:"吭";s:2:"";s:3:"吼";s:2:"";s:3:"吮";s:2:"";s:3:"吶";s:2:"";s:3:"吩";s:2:"";s:3:"吝";s:2:"";s:3:"呎";s:2:"";s:3:"咏";s:2:"";s:3:"呵";s:2:"";s:3:"咎";s:2:"";s:3:"呟";s:2:"";s:3:"呱";s:2:"";s:3:"呷";s:2:"";s:3:"呰";s:2:"";s:3:"咒";s:2:"";s:3:"呻";s:2:"";s:3:"咀";s:2:"";s:3:"呶";s:2:"";s:3:"咄";s:2:"";s:3:"咐";s:2:"";s:3:"咆";s:2:"";s:3:"哇";s:2:"";s:3:"咢";s:2:"";s:3:"咸";s:2:"";s:3:"咥";s:2:"";s:3:"咬";s:2:"";s:3:"哄";s:2:"";s:3:"哈";s:2:"";s:3:"咨";s:2:"@";s:3:"咫";s:2:"A";s:3:"哂";s:2:"B";s:3:"咤";s:2:"C";s:3:"咾";s:2:"D";s:3:"咼";s:2:"E";s:3:"哘";s:2:"F";s:3:"哥";s:2:"G";s:3:"哦";s:2:"H";s:3:"唏";s:2:"I";s:3:"唔";s:2:"J";s:3:"哽";s:2:"K";s:3:"哮";s:2:"L";s:3:"哭";s:2:"M";s:3:"哺";s:2:"N";s:3:"哢";s:2:"O";s:3:"唹";s:2:"P";s:3:"啀";s:2:"Q";s:3:"啣";s:2:"R";s:3:"啌";s:2:"S";s:3:"售";s:2:"T";s:3:"啜";s:2:"U";s:3:"啅";s:2:"V";s:3:"啖";s:2:"W";s:3:"啗";s:2:"X";s:3:"唸";s:2:"Y";s:3:"唳";s:2:"Z";s:3:"啝";s:2:"[";s:3:"喙";s:2:"\";s:3:"喀";s:2:"]";s:3:"咯";s:2:"^";s:3:"喊";s:2:"_";s:3:"喟";s:2:"`";s:3:"啻";s:2:"a";s:3:"啾";s:2:"b";s:3:"喘";s:2:"c";s:3:"喞";s:2:"d";s:3:"單";s:2:"e";s:3:"啼";s:2:"f";s:3:"喃";s:2:"g";s:3:"喩";s:2:"h";s:3:"喇";s:2:"i";s:3:"喨";s:2:"j";s:3:"嗚";s:2:"k";s:3:"嗅";s:2:"l";s:3:"嗟";s:2:"m";s:3:"嗄";s:2:"n";s:3:"嗜";s:2:"o";s:3:"嗤";s:2:"p";s:3:"嗔";s:2:"q";s:3:"嘔";s:2:"r";s:3:"嗷";s:2:"s";s:3:"嘖";s:2:"t";s:3:"嗾";s:2:"u";s:3:"嗽";s:2:"v";s:3:"嘛";s:2:"w";s:3:"嗹";s:2:"x";s:3:"噎";s:2:"y";s:3:"噐";s:2:"z";s:3:"營";s:2:"{";s:3:"嘴";s:2:"|";s:3:"嘶";s:2:"}";s:3:"嘲";s:2:"~";s:3:"嘸";s:2:"";s:3:"噫";s:2:"";s:3:"噤";s:2:"";s:3:"嘯";s:2:"";s:3:"噬";s:2:"";s:3:"噪";s:2:"";s:3:"嚆";s:2:"";s:3:"嚀";s:2:"";s:3:"嚊";s:2:"";s:3:"嚠";s:2:"";s:3:"嚔";s:2:"";s:3:"嚏";s:2:"";s:3:"嚥";s:2:"";s:3:"嚮";s:2:"";s:3:"嚶";s:2:"";s:3:"嚴";s:2:"";s:3:"囂";s:2:"";s:3:"嚼";s:2:"";s:3:"囁";s:2:"";s:3:"囃";s:2:"";s:3:"囀";s:2:"";s:3:"囈";s:2:"";s:3:"囎";s:2:"";s:3:"囑";s:2:"";s:3:"囓";s:2:"";s:3:"囗";s:2:"";s:3:"囮";s:2:"";s:3:"囹";s:2:"";s:3:"圀";s:2:"";s:3:"囿";s:2:"";s:3:"圄";s:2:"";s:3:"圉";s:2:"";s:3:"圈";s:2:"";s:3:"國";s:2:"";s:3:"圍";s:2:"";s:3:"圓";s:2:"";s:3:"團";s:2:"";s:3:"圖";s:2:"";s:3:"嗇";s:2:"";s:3:"圜";s:2:"";s:3:"圦";s:2:"";s:3:"圷";s:2:"";s:3:"圸";s:2:"";s:3:"坎";s:2:"";s:3:"圻";s:2:"";s:3:"址";s:2:"";s:3:"坏";s:2:"";s:3:"坩";s:2:"";s:3:"埀";s:2:"";s:3:"垈";s:2:"";s:3:"坡";s:2:"";s:3:"坿";s:2:"";s:3:"垉";s:2:"";s:3:"垓";s:2:"";s:3:"垠";s:2:"";s:3:"垳";s:2:"";s:3:"垤";s:2:"";s:3:"垪";s:2:"";s:3:"垰";s:2:"";s:3:"埃";s:2:"";s:3:"埆";s:2:"";s:3:"埔";s:2:"";s:3:"埒";s:2:"";s:3:"埓";s:2:"";s:3:"堊";s:2:"";s:3:"埖";s:2:"";s:3:"埣";s:2:"";s:3:"堋";s:2:"";s:3:"堙";s:2:"";s:3:"堝";s:2:"";s:3:"塲";s:2:"";s:3:"堡";s:2:"";s:3:"塢";s:2:"";s:3:"塋";s:2:"";s:3:"塰";s:2:"";s:3:"毀";s:2:"";s:3:"塒";s:2:"";s:3:"堽";s:2:"";s:3:"塹";s:2:"";s:3:"墅";s:2:"";s:3:"墹";s:2:"";s:3:"墟";s:2:"";s:3:"墫";s:2:"";s:3:"墺";s:2:"";s:3:"壞";s:2:"";s:3:"墻";s:2:"";s:3:"墸";s:2:"";s:3:"墮";s:2:"";s:3:"壅";s:2:"";s:3:"壓";s:2:"";s:3:"壑";s:2:"";s:3:"壗";s:2:"";s:3:"壙";s:2:"";s:3:"壘";s:2:"";s:3:"壥";s:2:"";s:3:"壜";s:2:"";s:3:"壤";s:2:"";s:3:"壟";s:2:"";s:3:"壯";s:2:"";s:3:"壺";s:2:"";s:3:"壹";s:2:"";s:3:"壻";s:2:"";s:3:"壼";s:2:"";s:3:"壽";s:2:"";s:3:"夂";s:2:"";s:3:"夊";s:2:"";s:3:"夐";s:2:"";s:3:"夛";s:2:"";s:3:"梦";s:2:"";s:3:"夥";s:2:"";s:3:"夬";s:2:"";s:3:"夭";s:2:"";s:3:"夲";s:2:"";s:3:"夸";s:2:"";s:3:"夾";s:2:"";s:3:"竒";s:2:"";s:3:"奕";s:2:"";s:3:"奐";s:2:"";s:3:"奎";s:2:"";s:3:"奚";s:2:"";s:3:"奘";s:2:"";s:3:"奢";s:2:"";s:3:"奠";s:2:"";s:3:"奧";s:2:"";s:3:"奬";s:2:"";s:3:"奩";s:2:"@";s:3:"奸";s:2:"A";s:3:"妁";s:2:"B";s:3:"妝";s:2:"C";s:3:"佞";s:2:"D";s:3:"侫";s:2:"E";s:3:"妣";s:2:"F";s:3:"妲";s:2:"G";s:3:"姆";s:2:"H";s:3:"姨";s:2:"I";s:3:"姜";s:2:"J";s:3:"妍";s:2:"K";s:3:"姙";s:2:"L";s:3:"姚";s:2:"M";s:3:"娥";s:2:"N";s:3:"娟";s:2:"O";s:3:"娑";s:2:"P";s:3:"娜";s:2:"Q";s:3:"娉";s:2:"R";s:3:"娚";s:2:"S";s:3:"婀";s:2:"T";s:3:"婬";s:2:"U";s:3:"婉";s:2:"V";s:3:"娵";s:2:"W";s:3:"娶";s:2:"X";s:3:"婢";s:2:"Y";s:3:"婪";s:2:"Z";s:3:"媚";s:2:"[";s:3:"媼";s:2:"\";s:3:"媾";s:2:"]";s:3:"嫋";s:2:"^";s:3:"嫂";s:2:"_";s:3:"媽";s:2:"`";s:3:"嫣";s:2:"a";s:3:"嫗";s:2:"b";s:3:"嫦";s:2:"c";s:3:"嫩";s:2:"d";s:3:"嫖";s:2:"e";s:3:"嫺";s:2:"f";s:3:"嫻";s:2:"g";s:3:"嬌";s:2:"h";s:3:"嬋";s:2:"i";s:3:"嬖";s:2:"j";s:3:"嬲";s:2:"k";s:3:"嫐";s:2:"l";s:3:"嬪";s:2:"m";s:3:"嬶";s:2:"n";s:3:"嬾";s:2:"o";s:3:"孃";s:2:"p";s:3:"孅";s:2:"q";s:3:"孀";s:2:"r";s:3:"孑";s:2:"s";s:3:"孕";s:2:"t";s:3:"孚";s:2:"u";s:3:"孛";s:2:"v";s:3:"孥";s:2:"w";s:3:"孩";s:2:"x";s:3:"孰";s:2:"y";s:3:"孳";s:2:"z";s:3:"孵";s:2:"{";s:3:"學";s:2:"|";s:3:"斈";s:2:"}";s:3:"孺";s:2:"~";s:3:"宀";s:2:"";s:3:"它";s:2:"";s:3:"宦";s:2:"";s:3:"宸";s:2:"";s:3:"寃";s:2:"";s:3:"寇";s:2:"";s:3:"寉";s:2:"";s:3:"寔";s:2:"";s:3:"寐";s:2:"";s:3:"寤";s:2:"";s:3:"實";s:2:"";s:3:"寢";s:2:"";s:3:"寞";s:2:"";s:3:"寥";s:2:"";s:3:"寫";s:2:"";s:3:"寰";s:2:"";s:3:"寶";s:2:"";s:3:"寳";s:2:"";s:3:"尅";s:2:"";s:3:"將";s:2:"";s:3:"專";s:2:"";s:3:"對";s:2:"";s:3:"尓";s:2:"";s:3:"尠";s:2:"";s:3:"尢";s:2:"";s:3:"尨";s:2:"";s:3:"尸";s:2:"";s:3:"尹";s:2:"";s:3:"屁";s:2:"";s:3:"屆";s:2:"";s:3:"屎";s:2:"";s:3:"屓";s:2:"";s:3:"屐";s:2:"";s:3:"屏";s:2:"";s:3:"孱";s:2:"";s:3:"屬";s:2:"";s:3:"屮";s:2:"";s:3:"乢";s:2:"";s:3:"屶";s:2:"";s:3:"屹";s:2:"";s:3:"岌";s:2:"";s:3:"岑";s:2:"";s:3:"岔";s:2:"";s:3:"妛";s:2:"";s:3:"岫";s:2:"";s:3:"岻";s:2:"";s:3:"岶";s:2:"";s:3:"岼";s:2:"";s:3:"岷";s:2:"";s:3:"峅";s:2:"";s:3:"岾";s:2:"";s:3:"峇";s:2:"";s:3:"峙";s:2:"";s:3:"峩";s:2:"";s:3:"峽";s:2:"";s:3:"峺";s:2:"";s:3:"峭";s:2:"";s:3:"嶌";s:2:"";s:3:"峪";s:2:"";s:3:"崋";s:2:"";s:3:"崕";s:2:"";s:3:"崗";s:2:"";s:3:"嵜";s:2:"";s:3:"崟";s:2:"";s:3:"崛";s:2:"";s:3:"崑";s:2:"";s:3:"崔";s:2:"";s:3:"崢";s:2:"";s:3:"崚";s:2:"";s:3:"崙";s:2:"";s:3:"崘";s:2:"";s:3:"嵌";s:2:"";s:3:"嵒";s:2:"";s:3:"嵎";s:2:"";s:3:"嵋";s:2:"";s:3:"嵬";s:2:"";s:3:"嵳";s:2:"";s:3:"嵶";s:2:"";s:3:"嶇";s:2:"";s:3:"嶄";s:2:"";s:3:"嶂";s:2:"";s:3:"嶢";s:2:"";s:3:"嶝";s:2:"";s:3:"嶬";s:2:"";s:3:"嶮";s:2:"";s:3:"嶽";s:2:"";s:3:"嶐";s:2:"";s:3:"嶷";s:2:"";s:3:"嶼";s:2:"";s:3:"巉";s:2:"";s:3:"巍";s:2:"";s:3:"巓";s:2:"";s:3:"巒";s:2:"";s:3:"巖";s:2:"";s:3:"巛";s:2:"";s:3:"巫";s:2:"";s:3:"已";s:2:"";s:3:"巵";s:2:"";s:3:"帋";s:2:"";s:3:"帚";s:2:"";s:3:"帙";s:2:"";s:3:"帑";s:2:"";s:3:"帛";s:2:"";s:3:"帶";s:2:"";s:3:"帷";s:2:"";s:3:"幄";s:2:"";s:3:"幃";s:2:"";s:3:"幀";s:2:"";s:3:"幎";s:2:"";s:3:"幗";s:2:"";s:3:"幔";s:2:"";s:3:"幟";s:2:"";s:3:"幢";s:2:"";s:3:"幤";s:2:"";s:3:"幇";s:2:"";s:3:"幵";s:2:"";s:3:"并";s:2:"";s:3:"幺";s:2:"";s:3:"麼";s:2:"";s:3:"广";s:2:"";s:3:"庠";s:2:"";s:3:"廁";s:2:"";s:3:"廂";s:2:"";s:3:"廈";s:2:"";s:3:"廐";s:2:"";s:3:"廏";s:2:"@";s:3:"廖";s:2:"A";s:3:"廣";s:2:"B";s:3:"廝";s:2:"C";s:3:"廚";s:2:"D";s:3:"廛";s:2:"E";s:3:"廢";s:2:"F";s:3:"廡";s:2:"G";s:3:"廨";s:2:"H";s:3:"廩";s:2:"I";s:3:"廬";s:2:"J";s:3:"廱";s:2:"K";s:3:"廳";s:2:"L";s:3:"廰";s:2:"M";s:3:"廴";s:2:"N";s:3:"廸";s:2:"O";s:3:"廾";s:2:"P";s:3:"弃";s:2:"Q";s:3:"弉";s:2:"R";s:3:"彝";s:2:"S";s:3:"彜";s:2:"T";s:3:"弋";s:2:"U";s:3:"弑";s:2:"V";s:3:"弖";s:2:"W";s:3:"弩";s:2:"X";s:3:"弭";s:2:"Y";s:3:"弸";s:2:"Z";s:3:"彁";s:2:"[";s:3:"彈";s:2:"\";s:3:"彌";s:2:"]";s:3:"彎";s:2:"^";s:3:"弯";s:2:"_";s:3:"彑";s:2:"`";s:3:"彖";s:2:"a";s:3:"彗";s:2:"b";s:3:"彙";s:2:"c";s:3:"彡";s:2:"d";s:3:"彭";s:2:"e";s:3:"彳";s:2:"f";s:3:"彷";s:2:"g";s:3:"徃";s:2:"h";s:3:"徂";s:2:"i";s:3:"彿";s:2:"j";s:3:"徊";s:2:"k";s:3:"很";s:2:"l";s:3:"徑";s:2:"m";s:3:"徇";s:2:"n";s:3:"從";s:2:"o";s:3:"徙";s:2:"p";s:3:"徘";s:2:"q";s:3:"徠";s:2:"r";s:3:"徨";s:2:"s";s:3:"徭";s:2:"t";s:3:"徼";s:2:"u";s:3:"忖";s:2:"v";s:3:"忻";s:2:"w";s:3:"忤";s:2:"x";s:3:"忸";s:2:"y";s:3:"忱";s:2:"z";s:3:"忝";s:2:"{";s:3:"悳";s:2:"|";s:3:"忿";s:2:"}";s:3:"怡";s:2:"~";s:3:"恠";s:2:"";s:3:"怙";s:2:"";s:3:"怐";s:2:"";s:3:"怩";s:2:"";s:3:"怎";s:2:"";s:3:"怱";s:2:"";s:3:"怛";s:2:"";s:3:"怕";s:2:"";s:3:"怫";s:2:"";s:3:"怦";s:2:"";s:3:"怏";s:2:"";s:3:"怺";s:2:"";s:3:"恚";s:2:"";s:3:"恁";s:2:"";s:3:"恪";s:2:"";s:3:"恷";s:2:"";s:3:"恟";s:2:"";s:3:"恊";s:2:"";s:3:"恆";s:2:"";s:3:"恍";s:2:"";s:3:"恣";s:2:"";s:3:"恃";s:2:"";s:3:"恤";s:2:"";s:3:"恂";s:2:"";s:3:"恬";s:2:"";s:3:"恫";s:2:"";s:3:"恙";s:2:"";s:3:"悁";s:2:"";s:3:"悍";s:2:"";s:3:"惧";s:2:"";s:3:"悃";s:2:"";s:3:"悚";s:2:"";s:3:"悄";s:2:"";s:3:"悛";s:2:"";s:3:"悖";s:2:"";s:3:"悗";s:2:"";s:3:"悒";s:2:"";s:3:"悧";s:2:"";s:3:"悋";s:2:"";s:3:"惡";s:2:"";s:3:"悸";s:2:"";s:3:"惠";s:2:"";s:3:"惓";s:2:"";s:3:"悴";s:2:"";s:3:"忰";s:2:"";s:3:"悽";s:2:"";s:3:"惆";s:2:"";s:3:"悵";s:2:"";s:3:"惘";s:2:"";s:3:"慍";s:2:"";s:3:"愕";s:2:"";s:3:"愆";s:2:"";s:3:"惶";s:2:"";s:3:"惷";s:2:"";s:3:"愀";s:2:"";s:3:"惴";s:2:"";s:3:"惺";s:2:"";s:3:"愃";s:2:"";s:3:"愡";s:2:"";s:3:"惻";s:2:"";s:3:"惱";s:2:"";s:3:"愍";s:2:"";s:3:"愎";s:2:"";s:3:"慇";s:2:"";s:3:"愾";s:2:"";s:3:"愨";s:2:"";s:3:"愧";s:2:"";s:3:"慊";s:2:"";s:3:"愿";s:2:"";s:3:"愼";s:2:"";s:3:"愬";s:2:"";s:3:"愴";s:2:"";s:3:"愽";s:2:"";s:3:"慂";s:2:"";s:3:"慄";s:2:"";s:3:"慳";s:2:"";s:3:"慷";s:2:"";s:3:"慘";s:2:"";s:3:"慙";s:2:"";s:3:"慚";s:2:"";s:3:"慫";s:2:"";s:3:"慴";s:2:"";s:3:"慯";s:2:"";s:3:"慥";s:2:"";s:3:"慱";s:2:"";s:3:"慟";s:2:"";s:3:"慝";s:2:"";s:3:"慓";s:2:"";s:3:"慵";s:2:"";s:3:"憙";s:2:"";s:3:"憖";s:2:"";s:3:"憇";s:2:"";s:3:"憬";s:2:"";s:3:"憔";s:2:"";s:3:"憚";s:2:"";s:3:"憊";s:2:"";s:3:"憑";s:2:"";s:3:"憫";s:2:"";s:3:"憮";s:2:"";s:3:"懌";s:2:"";s:3:"懊";s:2:"";s:3:"應";s:2:"";s:3:"懷";s:2:"";s:3:"懈";s:2:"";s:3:"懃";s:2:"";s:3:"懆";s:2:"";s:3:"憺";s:2:"";s:3:"懋";s:2:"";s:3:"罹";s:2:"";s:3:"懍";s:2:"";s:3:"懦";s:2:"";s:3:"懣";s:2:"";s:3:"懶";s:2:"";s:3:"懺";s:2:"";s:3:"懴";s:2:"";s:3:"懿";s:2:"";s:3:"懽";s:2:"";s:3:"懼";s:2:"";s:3:"懾";s:2:"";s:3:"戀";s:2:"";s:3:"戈";s:2:"";s:3:"戉";s:2:"";s:3:"戍";s:2:"";s:3:"戌";s:2:"";s:3:"戔";s:2:"";s:3:"戛";s:2:"@";s:3:"戞";s:2:"A";s:3:"戡";s:2:"B";s:3:"截";s:2:"C";s:3:"戮";s:2:"D";s:3:"戰";s:2:"E";s:3:"戲";s:2:"F";s:3:"戳";s:2:"G";s:3:"扁";s:2:"H";s:3:"扎";s:2:"I";s:3:"扞";s:2:"J";s:3:"扣";s:2:"K";s:3:"扛";s:2:"L";s:3:"扠";s:2:"M";s:3:"扨";s:2:"N";s:3:"扼";s:2:"O";s:3:"抂";s:2:"P";s:3:"抉";s:2:"Q";s:3:"找";s:2:"R";s:3:"抒";s:2:"S";s:3:"抓";s:2:"T";s:3:"抖";s:2:"U";s:3:"拔";s:2:"V";s:3:"抃";s:2:"W";s:3:"抔";s:2:"X";s:3:"拗";s:2:"Y";s:3:"拑";s:2:"Z";s:3:"抻";s:2:"[";s:3:"拏";s:2:"\";s:3:"拿";s:2:"]";s:3:"拆";s:2:"^";s:3:"擔";s:2:"_";s:3:"拈";s:2:"`";s:3:"拜";s:2:"a";s:3:"拌";s:2:"b";s:3:"拊";s:2:"c";s:3:"拂";s:2:"d";s:3:"拇";s:2:"e";s:3:"抛";s:2:"f";s:3:"拉";s:2:"g";s:3:"挌";s:2:"h";s:3:"拮";s:2:"i";s:3:"拱";s:2:"j";s:3:"挧";s:2:"k";s:3:"挂";s:2:"l";s:3:"挈";s:2:"m";s:3:"拯";s:2:"n";s:3:"拵";s:2:"o";s:3:"捐";s:2:"p";s:3:"挾";s:2:"q";s:3:"捍";s:2:"r";s:3:"搜";s:2:"s";s:3:"捏";s:2:"t";s:3:"掖";s:2:"u";s:3:"掎";s:2:"v";s:3:"掀";s:2:"w";s:3:"掫";s:2:"x";s:3:"捶";s:2:"y";s:3:"掣";s:2:"z";s:3:"掏";s:2:"{";s:3:"掉";s:2:"|";s:3:"掟";s:2:"}";s:3:"掵";s:2:"~";s:3:"捫";s:2:"";s:3:"捩";s:2:"";s:3:"掾";s:2:"";s:3:"揩";s:2:"";s:3:"揀";s:2:"";s:3:"揆";s:2:"";s:3:"揣";s:2:"";s:3:"揉";s:2:"";s:3:"插";s:2:"";s:3:"揶";s:2:"";s:3:"揄";s:2:"";s:3:"搖";s:2:"";s:3:"搴";s:2:"";s:3:"搆";s:2:"";s:3:"搓";s:2:"";s:3:"搦";s:2:"";s:3:"搶";s:2:"";s:3:"攝";s:2:"";s:3:"搗";s:2:"";s:3:"搨";s:2:"";s:3:"搏";s:2:"";s:3:"摧";s:2:"";s:3:"摯";s:2:"";s:3:"摶";s:2:"";s:3:"摎";s:2:"";s:3:"攪";s:2:"";s:3:"撕";s:2:"";s:3:"撓";s:2:"";s:3:"撥";s:2:"";s:3:"撩";s:2:"";s:3:"撈";s:2:"";s:3:"撼";s:2:"";s:3:"據";s:2:"";s:3:"擒";s:2:"";s:3:"擅";s:2:"";s:3:"擇";s:2:"";s:3:"撻";s:2:"";s:3:"擘";s:2:"";s:3:"擂";s:2:"";s:3:"擱";s:2:"";s:3:"擧";s:2:"";s:3:"舉";s:2:"";s:3:"擠";s:2:"";s:3:"擡";s:2:"";s:3:"抬";s:2:"";s:3:"擣";s:2:"";s:3:"擯";s:2:"";s:3:"攬";s:2:"";s:3:"擶";s:2:"";s:3:"擴";s:2:"";s:3:"擲";s:2:"";s:3:"擺";s:2:"";s:3:"攀";s:2:"";s:3:"擽";s:2:"";s:3:"攘";s:2:"";s:3:"攜";s:2:"";s:3:"攅";s:2:"";s:3:"攤";s:2:"";s:3:"攣";s:2:"";s:3:"攫";s:2:"";s:3:"攴";s:2:"";s:3:"攵";s:2:"";s:3:"攷";s:2:"";s:3:"收";s:2:"";s:3:"攸";s:2:"";s:3:"畋";s:2:"";s:3:"效";s:2:"";s:3:"敖";s:2:"";s:3:"敕";s:2:"";s:3:"敍";s:2:"";s:3:"敘";s:2:"";s:3:"敞";s:2:"";s:3:"敝";s:2:"";s:3:"敲";s:2:"";s:3:"數";s:2:"";s:3:"斂";s:2:"";s:3:"斃";s:2:"";s:3:"變";s:2:"";s:3:"斛";s:2:"";s:3:"斟";s:2:"";s:3:"斫";s:2:"";s:3:"斷";s:2:"";s:3:"旃";s:2:"";s:3:"旆";s:2:"";s:3:"旁";s:2:"";s:3:"旄";s:2:"";s:3:"旌";s:2:"";s:3:"旒";s:2:"";s:3:"旛";s:2:"";s:3:"旙";s:2:"";s:3:"无";s:2:"";s:3:"旡";s:2:"";s:3:"旱";s:2:"";s:3:"杲";s:2:"";s:3:"昊";s:2:"";s:3:"昃";s:2:"";s:3:"旻";s:2:"";s:3:"杳";s:2:"";s:3:"昵";s:2:"";s:3:"昶";s:2:"";s:3:"昴";s:2:"";s:3:"昜";s:2:"";s:3:"晏";s:2:"";s:3:"晄";s:2:"";s:3:"晉";s:2:"";s:3:"晁";s:2:"";s:3:"晞";s:2:"";s:3:"晝";s:2:"";s:3:"晤";s:2:"";s:3:"晧";s:2:"";s:3:"晨";s:2:"";s:3:"晟";s:2:"";s:3:"晢";s:2:"";s:3:"晰";s:2:"";s:3:"暃";s:2:"";s:3:"暈";s:2:"";s:3:"暎";s:2:"";s:3:"暉";s:2:"";s:3:"暄";s:2:"";s:3:"暘";s:2:"";s:3:"暝";s:2:"";s:3:"曁";s:2:"";s:3:"暹";s:2:"";s:3:"曉";s:2:"";s:3:"暾";s:2:"";s:3:"暼";s:2:"@";s:3:"曄";s:2:"A";s:3:"暸";s:2:"B";s:3:"曖";s:2:"C";s:3:"曚";s:2:"D";s:3:"曠";s:2:"E";s:3:"昿";s:2:"F";s:3:"曦";s:2:"G";s:3:"曩";s:2:"H";s:3:"曰";s:2:"I";s:3:"曵";s:2:"J";s:3:"曷";s:2:"K";s:3:"朏";s:2:"L";s:3:"朖";s:2:"M";s:3:"朞";s:2:"N";s:3:"朦";s:2:"O";s:3:"朧";s:2:"P";s:3:"霸";s:2:"Q";s:3:"朮";s:2:"R";s:3:"朿";s:2:"S";s:3:"朶";s:2:"T";s:3:"杁";s:2:"U";s:3:"朸";s:2:"V";s:3:"朷";s:2:"W";s:3:"杆";s:2:"X";s:3:"杞";s:2:"Y";s:3:"杠";s:2:"Z";s:3:"杙";s:2:"[";s:3:"杣";s:2:"\";s:3:"杤";s:2:"]";s:3:"枉";s:2:"^";s:3:"杰";s:2:"_";s:3:"枩";s:2:"`";s:3:"杼";s:2:"a";s:3:"杪";s:2:"b";s:3:"枌";s:2:"c";s:3:"枋";s:2:"d";s:3:"枦";s:2:"e";s:3:"枡";s:2:"f";s:3:"枅";s:2:"g";s:3:"枷";s:2:"h";s:3:"柯";s:2:"i";s:3:"枴";s:2:"j";s:3:"柬";s:2:"k";s:3:"枳";s:2:"l";s:3:"柩";s:2:"m";s:3:"枸";s:2:"n";s:3:"柤";s:2:"o";s:3:"柞";s:2:"p";s:3:"柝";s:2:"q";s:3:"柢";s:2:"r";s:3:"柮";s:2:"s";s:3:"枹";s:2:"t";s:3:"柎";s:2:"u";s:3:"柆";s:2:"v";s:3:"柧";s:2:"w";s:3:"檜";s:2:"x";s:3:"栞";s:2:"y";s:3:"框";s:2:"z";s:3:"栩";s:2:"{";s:3:"桀";s:2:"|";s:3:"桍";s:2:"}";s:3:"栲";s:2:"~";s:3:"桎";s:2:"";s:3:"梳";s:2:"";s:3:"栫";s:2:"";s:3:"桙";s:2:"";s:3:"档";s:2:"";s:3:"桷";s:2:"";s:3:"桿";s:2:"";s:3:"梟";s:2:"";s:3:"梏";s:2:"";s:3:"梭";s:2:"";s:3:"梔";s:2:"";s:3:"條";s:2:"";s:3:"梛";s:2:"";s:3:"梃";s:2:"";s:3:"檮";s:2:"";s:3:"梹";s:2:"";s:3:"桴";s:2:"";s:3:"梵";s:2:"";s:3:"梠";s:2:"";s:3:"梺";s:2:"";s:3:"椏";s:2:"";s:3:"梍";s:2:"";s:3:"桾";s:2:"";s:3:"椁";s:2:"";s:3:"棊";s:2:"";s:3:"椈";s:2:"";s:3:"棘";s:2:"";s:3:"椢";s:2:"";s:3:"椦";s:2:"";s:3:"棡";s:2:"";s:3:"椌";s:2:"";s:3:"棍";s:2:"";s:3:"棔";s:2:"";s:3:"棧";s:2:"";s:3:"棕";s:2:"";s:3:"椶";s:2:"";s:3:"椒";s:2:"";s:3:"椄";s:2:"";s:3:"棗";s:2:"";s:3:"棣";s:2:"";s:3:"椥";s:2:"";s:3:"棹";s:2:"";s:3:"棠";s:2:"";s:3:"棯";s:2:"";s:3:"椨";s:2:"";s:3:"椪";s:2:"";s:3:"椚";s:2:"";s:3:"椣";s:2:"";s:3:"椡";s:2:"";s:3:"棆";s:2:"";s:3:"楹";s:2:"";s:3:"楷";s:2:"";s:3:"楜";s:2:"";s:3:"楸";s:2:"";s:3:"楫";s:2:"";s:3:"楔";s:2:"";s:3:"楾";s:2:"";s:3:"楮";s:2:"";s:3:"椹";s:2:"";s:3:"楴";s:2:"";s:3:"椽";s:2:"";s:3:"楙";s:2:"";s:3:"椰";s:2:"";s:3:"楡";s:2:"";s:3:"楞";s:2:"";s:3:"楝";s:2:"";s:3:"榁";s:2:"";s:3:"楪";s:2:"";s:3:"榲";s:2:"";s:3:"榮";s:2:"";s:3:"槐";s:2:"";s:3:"榿";s:2:"";s:3:"槁";s:2:"";s:3:"槓";s:2:"";s:3:"榾";s:2:"";s:3:"槎";s:2:"";s:3:"寨";s:2:"";s:3:"槊";s:2:"";s:3:"槝";s:2:"";s:3:"榻";s:2:"";s:3:"槃";s:2:"";s:3:"榧";s:2:"";s:3:"樮";s:2:"";s:3:"榑";s:2:"";s:3:"榠";s:2:"";s:3:"榜";s:2:"";s:3:"榕";s:2:"";s:3:"榴";s:2:"";s:3:"槞";s:2:"";s:3:"槨";s:2:"";s:3:"樂";s:2:"";s:3:"樛";s:2:"";s:3:"槿";s:2:"";s:3:"權";s:2:"";s:3:"槹";s:2:"";s:3:"槲";s:2:"";s:3:"槧";s:2:"";s:3:"樅";s:2:"";s:3:"榱";s:2:"";s:3:"樞";s:2:"";s:3:"槭";s:2:"";s:3:"樔";s:2:"";s:3:"槫";s:2:"";s:3:"樊";s:2:"";s:3:"樒";s:2:"";s:3:"櫁";s:2:"";s:3:"樣";s:2:"";s:3:"樓";s:2:"";s:3:"橄";s:2:"";s:3:"樌";s:2:"";s:3:"橲";s:2:"";s:3:"樶";s:2:"";s:3:"橸";s:2:"";s:3:"橇";s:2:"";s:3:"橢";s:2:"";s:3:"橙";s:2:"";s:3:"橦";s:2:"";s:3:"橈";s:2:"";s:3:"樸";s:2:"";s:3:"樢";s:2:"";s:3:"檐";s:2:"";s:3:"檍";s:2:"";s:3:"檠";s:2:"";s:3:"檄";s:2:"";s:3:"檢";s:2:"";s:3:"檣";s:2:"@";s:3:"檗";s:2:"A";s:3:"蘗";s:2:"B";s:3:"檻";s:2:"C";s:3:"櫃";s:2:"D";s:3:"櫂";s:2:"E";s:3:"檸";s:2:"F";s:3:"檳";s:2:"G";s:3:"檬";s:2:"H";s:3:"櫞";s:2:"I";s:3:"櫑";s:2:"J";s:3:"櫟";s:2:"K";s:3:"檪";s:2:"L";s:3:"櫚";s:2:"M";s:3:"櫪";s:2:"N";s:3:"櫻";s:2:"O";s:3:"欅";s:2:"P";s:3:"蘖";s:2:"Q";s:3:"櫺";s:2:"R";s:3:"欒";s:2:"S";s:3:"欖";s:2:"T";s:3:"鬱";s:2:"U";s:3:"欟";s:2:"V";s:3:"欸";s:2:"W";s:3:"欷";s:2:"X";s:3:"盜";s:2:"Y";s:3:"欹";s:2:"Z";s:3:"飮";s:2:"[";s:3:"歇";s:2:"\";s:3:"歃";s:2:"]";s:3:"歉";s:2:"^";s:3:"歐";s:2:"_";s:3:"歙";s:2:"`";s:3:"歔";s:2:"a";s:3:"歛";s:2:"b";s:3:"歟";s:2:"c";s:3:"歡";s:2:"d";s:3:"歸";s:2:"e";s:3:"歹";s:2:"f";s:3:"歿";s:2:"g";s:3:"殀";s:2:"h";s:3:"殄";s:2:"i";s:3:"殃";s:2:"j";s:3:"殍";s:2:"k";s:3:"殘";s:2:"l";s:3:"殕";s:2:"m";s:3:"殞";s:2:"n";s:3:"殤";s:2:"o";s:3:"殪";s:2:"p";s:3:"殫";s:2:"q";s:3:"殯";s:2:"r";s:3:"殲";s:2:"s";s:3:"殱";s:2:"t";s:3:"殳";s:2:"u";s:3:"殷";s:2:"v";s:3:"殼";s:2:"w";s:3:"毆";s:2:"x";s:3:"毋";s:2:"y";s:3:"毓";s:2:"z";s:3:"毟";s:2:"{";s:3:"毬";s:2:"|";s:3:"毫";s:2:"}";s:3:"毳";s:2:"~";s:3:"毯";s:2:"";s:3:"麾";s:2:"";s:3:"氈";s:2:"";s:3:"氓";s:2:"";s:3:"气";s:2:"";s:3:"氛";s:2:"";s:3:"氤";s:2:"";s:3:"氣";s:2:"";s:3:"汞";s:2:"";s:3:"汕";s:2:"";s:3:"汢";s:2:"";s:3:"汪";s:2:"";s:3:"沂";s:2:"";s:3:"沍";s:2:"";s:3:"沚";s:2:"";s:3:"沁";s:2:"";s:3:"沛";s:2:"";s:3:"汾";s:2:"";s:3:"汨";s:2:"";s:3:"汳";s:2:"";s:3:"沒";s:2:"";s:3:"沐";s:2:"";s:3:"泄";s:2:"";s:3:"泱";s:2:"";s:3:"泓";s:2:"";s:3:"沽";s:2:"";s:3:"泗";s:2:"";s:3:"泅";s:2:"";s:3:"泝";s:2:"";s:3:"沮";s:2:"";s:3:"沱";s:2:"";s:3:"沾";s:2:"";s:3:"沺";s:2:"";s:3:"泛";s:2:"";s:3:"泯";s:2:"";s:3:"泙";s:2:"";s:3:"泪";s:2:"";s:3:"洟";s:2:"";s:3:"衍";s:2:"";s:3:"洶";s:2:"";s:3:"洫";s:2:"";s:3:"洽";s:2:"";s:3:"洸";s:2:"";s:3:"洙";s:2:"";s:3:"洵";s:2:"";s:3:"洳";s:2:"";s:3:"洒";s:2:"";s:3:"洌";s:2:"";s:3:"浣";s:2:"";s:3:"涓";s:2:"";s:3:"浤";s:2:"";s:3:"浚";s:2:"";s:3:"浹";s:2:"";s:3:"浙";s:2:"";s:3:"涎";s:2:"";s:3:"涕";s:2:"";s:3:"濤";s:2:"";s:3:"涅";s:2:"";s:3:"淹";s:2:"";s:3:"渕";s:2:"";s:3:"渊";s:2:"";s:3:"涵";s:2:"";s:3:"淇";s:2:"";s:3:"淦";s:2:"";s:3:"涸";s:2:"";s:3:"淆";s:2:"";s:3:"淬";s:2:"";s:3:"淞";s:2:"";s:3:"淌";s:2:"";s:3:"淨";s:2:"";s:3:"淒";s:2:"";s:3:"淅";s:2:"";s:3:"淺";s:2:"";s:3:"淙";s:2:"";s:3:"淤";s:2:"";s:3:"淕";s:2:"";s:3:"淪";s:2:"";s:3:"淮";s:2:"";s:3:"渭";s:2:"";s:3:"湮";s:2:"";s:3:"渮";s:2:"";s:3:"渙";s:2:"";s:3:"湲";s:2:"";s:3:"湟";s:2:"";s:3:"渾";s:2:"";s:3:"渣";s:2:"";s:3:"湫";s:2:"";s:3:"渫";s:2:"";s:3:"湶";s:2:"";s:3:"湍";s:2:"";s:3:"渟";s:2:"";s:3:"湃";s:2:"";s:3:"渺";s:2:"";s:3:"湎";s:2:"";s:3:"渤";s:2:"";s:3:"滿";s:2:"";s:3:"渝";s:2:"";s:3:"游";s:2:"";s:3:"溂";s:2:"";s:3:"溪";s:2:"";s:3:"溘";s:2:"";s:3:"滉";s:2:"";s:3:"溷";s:2:"";s:3:"滓";s:2:"";s:3:"溽";s:2:"";s:3:"溯";s:2:"";s:3:"滄";s:2:"";s:3:"溲";s:2:"";s:3:"滔";s:2:"";s:3:"滕";s:2:"";s:3:"溏";s:2:"";s:3:"溥";s:2:"";s:3:"滂";s:2:"";s:3:"溟";s:2:"";s:3:"潁";s:2:"";s:3:"漑";s:2:"";s:3:"灌";s:2:"";s:3:"滬";s:2:"";s:3:"滸";s:2:"";s:3:"滾";s:2:"";s:3:"漿";s:2:"";s:3:"滲";s:2:"";s:3:"漱";s:2:"";s:3:"滯";s:2:"";s:3:"漲";s:2:"";s:3:"滌";s:2:"@";s:3:"漾";s:2:"A";s:3:"漓";s:2:"B";s:3:"滷";s:2:"C";s:3:"澆";s:2:"D";s:3:"潺";s:2:"E";s:3:"潸";s:2:"F";s:3:"澁";s:2:"G";s:3:"澀";s:2:"H";s:3:"潯";s:2:"I";s:3:"潛";s:2:"J";s:3:"濳";s:2:"K";s:3:"潭";s:2:"L";s:3:"澂";s:2:"M";s:3:"潼";s:2:"N";s:3:"潘";s:2:"O";s:3:"澎";s:2:"P";s:3:"澑";s:2:"Q";s:3:"濂";s:2:"R";s:3:"潦";s:2:"S";s:3:"澳";s:2:"T";s:3:"澣";s:2:"U";s:3:"澡";s:2:"V";s:3:"澤";s:2:"W";s:3:"澹";s:2:"X";s:3:"濆";s:2:"Y";s:3:"澪";s:2:"Z";s:3:"濟";s:2:"[";s:3:"濕";s:2:"\";s:3:"濬";s:2:"]";s:3:"濔";s:2:"^";s:3:"濘";s:2:"_";s:3:"濱";s:2:"`";s:3:"濮";s:2:"a";s:3:"濛";s:2:"b";s:3:"瀉";s:2:"c";s:3:"瀋";s:2:"d";s:3:"濺";s:2:"e";s:3:"瀑";s:2:"f";s:3:"瀁";s:2:"g";s:3:"瀏";s:2:"h";s:3:"濾";s:2:"i";s:3:"瀛";s:2:"j";s:3:"瀚";s:2:"k";s:3:"潴";s:2:"l";s:3:"瀝";s:2:"m";s:3:"瀘";s:2:"n";s:3:"瀟";s:2:"o";s:3:"瀰";s:2:"p";s:3:"瀾";s:2:"q";s:3:"瀲";s:2:"r";s:3:"灑";s:2:"s";s:3:"灣";s:2:"t";s:3:"炙";s:2:"u";s:3:"炒";s:2:"v";s:3:"炯";s:2:"w";s:3:"烱";s:2:"x";s:3:"炬";s:2:"y";s:3:"炸";s:2:"z";s:3:"炳";s:2:"{";s:3:"炮";s:2:"|";s:3:"烟";s:2:"}";s:3:"烋";s:2:"~";s:3:"烝";s:2:"";s:3:"烙";s:2:"";s:3:"焉";s:2:"";s:3:"烽";s:2:"";s:3:"焜";s:2:"";s:3:"焙";s:2:"";s:3:"煥";s:2:"";s:3:"煕";s:2:"";s:3:"熈";s:2:"";s:3:"煦";s:2:"";s:3:"煢";s:2:"";s:3:"煌";s:2:"";s:3:"煖";s:2:"";s:3:"煬";s:2:"";s:3:"熏";s:2:"";s:3:"燻";s:2:"";s:3:"熄";s:2:"";s:3:"熕";s:2:"";s:3:"熨";s:2:"";s:3:"熬";s:2:"";s:3:"燗";s:2:"";s:3:"熹";s:2:"";s:3:"熾";s:2:"";s:3:"燒";s:2:"";s:3:"燉";s:2:"";s:3:"燔";s:2:"";s:3:"燎";s:2:"";s:3:"燠";s:2:"";s:3:"燬";s:2:"";s:3:"燧";s:2:"";s:3:"燵";s:2:"";s:3:"燼";s:2:"";s:3:"燹";s:2:"";s:3:"燿";s:2:"";s:3:"爍";s:2:"";s:3:"爐";s:2:"";s:3:"爛";s:2:"";s:3:"爨";s:2:"";s:3:"爭";s:2:"";s:3:"爬";s:2:"";s:3:"爰";s:2:"";s:3:"爲";s:2:"";s:3:"爻";s:2:"";s:3:"爼";s:2:"";s:3:"爿";s:2:"";s:3:"牀";s:2:"";s:3:"牆";s:2:"";s:3:"牋";s:2:"";s:3:"牘";s:2:"";s:3:"牴";s:2:"";s:3:"牾";s:2:"";s:3:"犂";s:2:"";s:3:"犁";s:2:"";s:3:"犇";s:2:"";s:3:"犒";s:2:"";s:3:"犖";s:2:"";s:3:"犢";s:2:"";s:3:"犧";s:2:"";s:3:"犹";s:2:"";s:3:"犲";s:2:"";s:3:"狃";s:2:"";s:3:"狆";s:2:"";s:3:"狄";s:2:"";s:3:"狎";s:2:"";s:3:"狒";s:2:"";s:3:"狢";s:2:"";s:3:"狠";s:2:"";s:3:"狡";s:2:"";s:3:"狹";s:2:"";s:3:"狷";s:2:"";s:3:"倏";s:2:"";s:3:"猗";s:2:"";s:3:"猊";s:2:"";s:3:"猜";s:2:"";s:3:"猖";s:2:"";s:3:"猝";s:2:"";s:3:"猴";s:2:"";s:3:"猯";s:2:"";s:3:"猩";s:2:"";s:3:"猥";s:2:"";s:3:"猾";s:2:"";s:3:"獎";s:2:"";s:3:"獏";s:2:"";s:3:"默";s:2:"";s:3:"獗";s:2:"";s:3:"獪";s:2:"";s:3:"獨";s:2:"";s:3:"獰";s:2:"";s:3:"獸";s:2:"";s:3:"獵";s:2:"";s:3:"獻";s:2:"";s:3:"獺";s:2:"";s:3:"珈";s:2:"";s:3:"玳";s:2:"";s:3:"珎";s:2:"";s:3:"玻";s:2:"";s:3:"珀";s:2:"";s:3:"珥";s:2:"";s:3:"珮";s:2:"";s:3:"珞";s:2:"";s:3:"璢";s:2:"";s:3:"琅";s:2:"";s:3:"瑯";s:2:"";s:3:"琥";s:2:"";s:3:"珸";s:2:"";s:3:"琲";s:2:"";s:3:"琺";s:2:"";s:3:"瑕";s:2:"";s:3:"琿";s:2:"";s:3:"瑟";s:2:"";s:3:"瑙";s:2:"";s:3:"瑁";s:2:"";s:3:"瑜";s:2:"";s:3:"瑩";s:2:"";s:3:"瑰";s:2:"";s:3:"瑣";s:2:"";s:3:"瑪";s:2:"";s:3:"瑶";s:2:"";s:3:"瑾";s:2:"";s:3:"璋";s:2:"";s:3:"璞";s:2:"";s:3:"璧";s:2:"";s:3:"瓊";s:2:"";s:3:"瓏";s:2:"";s:3:"瓔";s:2:"";s:3:"珱";s:2:"@";s:3:"瓠";s:2:"A";s:3:"瓣";s:2:"B";s:3:"瓧";s:2:"C";s:3:"瓩";s:2:"D";s:3:"瓮";s:2:"E";s:3:"瓲";s:2:"F";s:3:"瓰";s:2:"G";s:3:"瓱";s:2:"H";s:3:"瓸";s:2:"I";s:3:"瓷";s:2:"J";s:3:"甄";s:2:"K";s:3:"甃";s:2:"L";s:3:"甅";s:2:"M";s:3:"甌";s:2:"N";s:3:"甎";s:2:"O";s:3:"甍";s:2:"P";s:3:"甕";s:2:"Q";s:3:"甓";s:2:"R";s:3:"甞";s:2:"S";s:3:"甦";s:2:"T";s:3:"甬";s:2:"U";s:3:"甼";s:2:"V";s:3:"畄";s:2:"W";s:3:"畍";s:2:"X";s:3:"畊";s:2:"Y";s:3:"畉";s:2:"Z";s:3:"畛";s:2:"[";s:3:"畆";s:2:"\";s:3:"畚";s:2:"]";s:3:"畩";s:2:"^";s:3:"畤";s:2:"_";s:3:"畧";s:2:"`";s:3:"畫";s:2:"a";s:3:"畭";s:2:"b";s:3:"畸";s:2:"c";s:3:"當";s:2:"d";s:3:"疆";s:2:"e";s:3:"疇";s:2:"f";s:3:"畴";s:2:"g";s:3:"疊";s:2:"h";s:3:"疉";s:2:"i";s:3:"疂";s:2:"j";s:3:"疔";s:2:"k";s:3:"疚";s:2:"l";s:3:"疝";s:2:"m";s:3:"疥";s:2:"n";s:3:"疣";s:2:"o";s:3:"痂";s:2:"p";s:3:"疳";s:2:"q";s:3:"痃";s:2:"r";s:3:"疵";s:2:"s";s:3:"疽";s:2:"t";s:3:"疸";s:2:"u";s:3:"疼";s:2:"v";s:3:"疱";s:2:"w";s:3:"痍";s:2:"x";s:3:"痊";s:2:"y";s:3:"痒";s:2:"z";s:3:"痙";s:2:"{";s:3:"痣";s:2:"|";s:3:"痞";s:2:"}";s:3:"痾";s:2:"~";s:3:"痿";s:2:"";s:3:"痼";s:2:"";s:3:"瘁";s:2:"";s:3:"痰";s:2:"";s:3:"痺";s:2:"";s:3:"痲";s:2:"";s:3:"痳";s:2:"";s:3:"瘋";s:2:"";s:3:"瘍";s:2:"";s:3:"瘉";s:2:"";s:3:"瘟";s:2:"";s:3:"瘧";s:2:"";s:3:"瘠";s:2:"";s:3:"瘡";s:2:"";s:3:"瘢";s:2:"";s:3:"瘤";s:2:"";s:3:"瘴";s:2:"";s:3:"瘰";s:2:"";s:3:"瘻";s:2:"";s:3:"癇";s:2:"";s:3:"癈";s:2:"";s:3:"癆";s:2:"";s:3:"癜";s:2:"";s:3:"癘";s:2:"";s:3:"癡";s:2:"";s:3:"癢";s:2:"";s:3:"癨";s:2:"";s:3:"癩";s:2:"";s:3:"癪";s:2:"";s:3:"癧";s:2:"";s:3:"癬";s:2:"";s:3:"癰";s:2:"";s:3:"癲";s:2:"";s:3:"癶";s:2:"";s:3:"癸";s:2:"";s:3:"發";s:2:"";s:3:"皀";s:2:"";s:3:"皃";s:2:"";s:3:"皈";s:2:"";s:3:"皋";s:2:"";s:3:"皎";s:2:"";s:3:"皖";s:2:"";s:3:"皓";s:2:"";s:3:"皙";s:2:"";s:3:"皚";s:2:"";s:3:"皰";s:2:"";s:3:"皴";s:2:"";s:3:"皸";s:2:"";s:3:"皹";s:2:"";s:3:"皺";s:2:"";s:3:"盂";s:2:"";s:3:"盍";s:2:"";s:3:"盖";s:2:"";s:3:"盒";s:2:"";s:3:"盞";s:2:"";s:3:"盡";s:2:"";s:3:"盥";s:2:"";s:3:"盧";s:2:"";s:3:"盪";s:2:"";s:3:"蘯";s:2:"";s:3:"盻";s:2:"";s:3:"眈";s:2:"";s:3:"眇";s:2:"";s:3:"眄";s:2:"";s:3:"眩";s:2:"";s:3:"眤";s:2:"";s:3:"眞";s:2:"";s:3:"眥";s:2:"";s:3:"眦";s:2:"";s:3:"眛";s:2:"";s:3:"眷";s:2:"";s:3:"眸";s:2:"";s:3:"睇";s:2:"";s:3:"睚";s:2:"";s:3:"睨";s:2:"";s:3:"睫";s:2:"";s:3:"睛";s:2:"";s:3:"睥";s:2:"";s:3:"睿";s:2:"";s:3:"睾";s:2:"";s:3:"睹";s:2:"";s:3:"瞎";s:2:"";s:3:"瞋";s:2:"";s:3:"瞑";s:2:"";s:3:"瞠";s:2:"";s:3:"瞞";s:2:"";s:3:"瞰";s:2:"";s:3:"瞶";s:2:"";s:3:"瞹";s:2:"";s:3:"瞿";s:2:"";s:3:"瞼";s:2:"";s:3:"瞽";s:2:"";s:3:"瞻";s:2:"";s:3:"矇";s:2:"";s:3:"矍";s:2:"";s:3:"矗";s:2:"";s:3:"矚";s:2:"";s:3:"矜";s:2:"";s:3:"矣";s:2:"";s:3:"矮";s:2:"";s:3:"矼";s:2:"";s:3:"砌";s:2:"";s:3:"砒";s:2:"";s:3:"礦";s:2:"";s:3:"砠";s:2:"";s:3:"礪";s:2:"";s:3:"硅";s:2:"";s:3:"碎";s:2:"";s:3:"硴";s:2:"";s:3:"碆";s:2:"";s:3:"硼";s:2:"";s:3:"碚";s:2:"";s:3:"碌";s:2:"";s:3:"碣";s:2:"";s:3:"碵";s:2:"";s:3:"碪";s:2:"";s:3:"碯";s:2:"";s:3:"磑";s:2:"";s:3:"磆";s:2:"";s:3:"磋";s:2:"";s:3:"磔";s:2:"";s:3:"碾";s:2:"";s:3:"碼";s:2:"";s:3:"磅";s:2:"";s:3:"磊";s:2:"";s:3:"磬";s:2:"@";s:3:"磧";s:2:"A";s:3:"磚";s:2:"B";s:3:"磽";s:2:"C";s:3:"磴";s:2:"D";s:3:"礇";s:2:"E";s:3:"礒";s:2:"F";s:3:"礑";s:2:"G";s:3:"礙";s:2:"H";s:3:"礬";s:2:"I";s:3:"礫";s:2:"J";s:3:"祀";s:2:"K";s:3:"祠";s:2:"L";s:3:"祗";s:2:"M";s:3:"祟";s:2:"N";s:3:"祚";s:2:"O";s:3:"祕";s:2:"P";s:3:"祓";s:2:"Q";s:3:"祺";s:2:"R";s:3:"祿";s:2:"S";s:3:"禊";s:2:"T";s:3:"禝";s:2:"U";s:3:"禧";s:2:"V";s:3:"齋";s:2:"W";s:3:"禪";s:2:"X";s:3:"禮";s:2:"Y";s:3:"禳";s:2:"Z";s:3:"禹";s:2:"[";s:3:"禺";s:2:"\";s:3:"秉";s:2:"]";s:3:"秕";s:2:"^";s:3:"秧";s:2:"_";s:3:"秬";s:2:"`";s:3:"秡";s:2:"a";s:3:"秣";s:2:"b";s:3:"稈";s:2:"c";s:3:"稍";s:2:"d";s:3:"稘";s:2:"e";s:3:"稙";s:2:"f";s:3:"稠";s:2:"g";s:3:"稟";s:2:"h";s:3:"禀";s:2:"i";s:3:"稱";s:2:"j";s:3:"稻";s:2:"k";s:3:"稾";s:2:"l";s:3:"稷";s:2:"m";s:3:"穃";s:2:"n";s:3:"穗";s:2:"o";s:3:"穉";s:2:"p";s:3:"穡";s:2:"q";s:3:"穢";s:2:"r";s:3:"穩";s:2:"s";s:3:"龝";s:2:"t";s:3:"穰";s:2:"u";s:3:"穹";s:2:"v";s:3:"穽";s:2:"w";s:3:"窈";s:2:"x";s:3:"窗";s:2:"y";s:3:"窕";s:2:"z";s:3:"窘";s:2:"{";s:3:"窖";s:2:"|";s:3:"窩";s:2:"}";s:3:"竈";s:2:"~";s:3:"窰";s:2:"";s:3:"窶";s:2:"";s:3:"竅";s:2:"";s:3:"竄";s:2:"";s:3:"窿";s:2:"";s:3:"邃";s:2:"";s:3:"竇";s:2:"";s:3:"竊";s:2:"";s:3:"竍";s:2:"";s:3:"竏";s:2:"";s:3:"竕";s:2:"";s:3:"竓";s:2:"";s:3:"站";s:2:"";s:3:"竚";s:2:"";s:3:"竝";s:2:"";s:3:"竡";s:2:"";s:3:"竢";s:2:"";s:3:"竦";s:2:"";s:3:"竭";s:2:"";s:3:"竰";s:2:"";s:3:"笂";s:2:"";s:3:"笏";s:2:"";s:3:"笊";s:2:"";s:3:"笆";s:2:"";s:3:"笳";s:2:"";s:3:"笘";s:2:"";s:3:"笙";s:2:"";s:3:"笞";s:2:"";s:3:"笵";s:2:"";s:3:"笨";s:2:"";s:3:"笶";s:2:"";s:3:"筐";s:2:"";s:3:"筺";s:2:"";s:3:"笄";s:2:"";s:3:"筍";s:2:"";s:3:"笋";s:2:"";s:3:"筌";s:2:"";s:3:"筅";s:2:"";s:3:"筵";s:2:"";s:3:"筥";s:2:"";s:3:"筴";s:2:"";s:3:"筧";s:2:"";s:3:"筰";s:2:"";s:3:"筱";s:2:"";s:3:"筬";s:2:"";s:3:"筮";s:2:"";s:3:"箝";s:2:"";s:3:"箘";s:2:"";s:3:"箟";s:2:"";s:3:"箍";s:2:"";s:3:"箜";s:2:"";s:3:"箚";s:2:"";s:3:"箋";s:2:"";s:3:"箒";s:2:"";s:3:"箏";s:2:"";s:3:"筝";s:2:"";s:3:"箙";s:2:"";s:3:"篋";s:2:"";s:3:"篁";s:2:"";s:3:"篌";s:2:"";s:3:"篏";s:2:"";s:3:"箴";s:2:"";s:3:"篆";s:2:"";s:3:"篝";s:2:"";s:3:"篩";s:2:"";s:3:"簑";s:2:"";s:3:"簔";s:2:"";s:3:"篦";s:2:"";s:3:"篥";s:2:"";s:3:"籠";s:2:"";s:3:"簀";s:2:"";s:3:"簇";s:2:"";s:3:"簓";s:2:"";s:3:"篳";s:2:"";s:3:"篷";s:2:"";s:3:"簗";s:2:"";s:3:"簍";s:2:"";s:3:"篶";s:2:"";s:3:"簣";s:2:"";s:3:"簧";s:2:"";s:3:"簪";s:2:"";s:3:"簟";s:2:"";s:3:"簷";s:2:"";s:3:"簫";s:2:"";s:3:"簽";s:2:"";s:3:"籌";s:2:"";s:3:"籃";s:2:"";s:3:"籔";s:2:"";s:3:"籏";s:2:"";s:3:"籀";s:2:"";s:3:"籐";s:2:"";s:3:"籘";s:2:"";s:3:"籟";s:2:"";s:3:"籤";s:2:"";s:3:"籖";s:2:"";s:3:"籥";s:2:"";s:3:"籬";s:2:"";s:3:"籵";s:2:"";s:3:"粃";s:2:"";s:3:"粐";s:2:"";s:3:"粤";s:2:"";s:3:"粭";s:2:"";s:3:"粢";s:2:"";s:3:"粫";s:2:"";s:3:"粡";s:2:"";s:3:"粨";s:2:"";s:3:"粳";s:2:"";s:3:"粲";s:2:"";s:3:"粱";s:2:"";s:3:"粮";s:2:"";s:3:"粹";s:2:"";s:3:"粽";s:2:"";s:3:"糀";s:2:"";s:3:"糅";s:2:"";s:3:"糂";s:2:"";s:3:"糘";s:2:"";s:3:"糒";s:2:"";s:3:"糜";s:2:"";s:3:"糢";s:2:"";s:3:"鬻";s:2:"";s:3:"糯";s:2:"";s:3:"糲";s:2:"";s:3:"糴";s:2:"";s:3:"糶";s:2:"";s:3:"糺";s:2:"";s:3:"紆";s:2:"@";s:3:"紂";s:2:"A";s:3:"紜";s:2:"B";s:3:"紕";s:2:"C";s:3:"紊";s:2:"D";s:3:"絅";s:2:"E";s:3:"絋";s:2:"F";s:3:"紮";s:2:"G";s:3:"紲";s:2:"H";s:3:"紿";s:2:"I";s:3:"紵";s:2:"J";s:3:"絆";s:2:"K";s:3:"絳";s:2:"L";s:3:"絖";s:2:"M";s:3:"絎";s:2:"N";s:3:"絲";s:2:"O";s:3:"絨";s:2:"P";s:3:"絮";s:2:"Q";s:3:"絏";s:2:"R";s:3:"絣";s:2:"S";s:3:"經";s:2:"T";s:3:"綉";s:2:"U";s:3:"絛";s:2:"V";s:3:"綏";s:2:"W";s:3:"絽";s:2:"X";s:3:"綛";s:2:"Y";s:3:"綺";s:2:"Z";s:3:"綮";s:2:"[";s:3:"綣";s:2:"\";s:3:"綵";s:2:"]";s:3:"緇";s:2:"^";s:3:"綽";s:2:"_";s:3:"綫";s:2:"`";s:3:"總";s:2:"a";s:3:"綢";s:2:"b";s:3:"綯";s:2:"c";s:3:"緜";s:2:"d";s:3:"綸";s:2:"e";s:3:"綟";s:2:"f";s:3:"綰";s:2:"g";s:3:"緘";s:2:"h";s:3:"緝";s:2:"i";s:3:"緤";s:2:"j";s:3:"緞";s:2:"k";s:3:"緻";s:2:"l";s:3:"緲";s:2:"m";s:3:"緡";s:2:"n";s:3:"縅";s:2:"o";s:3:"縊";s:2:"p";s:3:"縣";s:2:"q";s:3:"縡";s:2:"r";s:3:"縒";s:2:"s";s:3:"縱";s:2:"t";s:3:"縟";s:2:"u";s:3:"縉";s:2:"v";s:3:"縋";s:2:"w";s:3:"縢";s:2:"x";s:3:"繆";s:2:"y";s:3:"繦";s:2:"z";s:3:"縻";s:2:"{";s:3:"縵";s:2:"|";s:3:"縹";s:2:"}";s:3:"繃";s:2:"~";s:3:"縷";s:2:"";s:3:"縲";s:2:"";s:3:"縺";s:2:"";s:3:"繧";s:2:"";s:3:"繝";s:2:"";s:3:"繖";s:2:"";s:3:"繞";s:2:"";s:3:"繙";s:2:"";s:3:"繚";s:2:"";s:3:"繹";s:2:"";s:3:"繪";s:2:"";s:3:"繩";s:2:"";s:3:"繼";s:2:"";s:3:"繻";s:2:"";s:3:"纃";s:2:"";s:3:"緕";s:2:"";s:3:"繽";s:2:"";s:3:"辮";s:2:"";s:3:"繿";s:2:"";s:3:"纈";s:2:"";s:3:"纉";s:2:"";s:3:"續";s:2:"";s:3:"纒";s:2:"";s:3:"纐";s:2:"";s:3:"纓";s:2:"";s:3:"纔";s:2:"";s:3:"纖";s:2:"";s:3:"纎";s:2:"";s:3:"纛";s:2:"";s:3:"纜";s:2:"";s:3:"缸";s:2:"";s:3:"缺";s:2:"";s:3:"罅";s:2:"";s:3:"罌";s:2:"";s:3:"罍";s:2:"";s:3:"罎";s:2:"";s:3:"罐";s:2:"";s:3:"网";s:2:"";s:3:"罕";s:2:"";s:3:"罔";s:2:"";s:3:"罘";s:2:"";s:3:"罟";s:2:"";s:3:"罠";s:2:"";s:3:"罨";s:2:"";s:3:"罩";s:2:"";s:3:"罧";s:2:"";s:3:"罸";s:2:"";s:3:"羂";s:2:"";s:3:"羆";s:2:"";s:3:"羃";s:2:"";s:3:"羈";s:2:"";s:3:"羇";s:2:"";s:3:"羌";s:2:"";s:3:"羔";s:2:"";s:3:"羞";s:2:"";s:3:"羝";s:2:"";s:3:"羚";s:2:"";s:3:"羣";s:2:"";s:3:"羯";s:2:"";s:3:"羲";s:2:"";s:3:"羹";s:2:"";s:3:"羮";s:2:"";s:3:"羶";s:2:"";s:3:"羸";s:2:"";s:3:"譱";s:2:"";s:3:"翅";s:2:"";s:3:"翆";s:2:"";s:3:"翊";s:2:"";s:3:"翕";s:2:"";s:3:"翔";s:2:"";s:3:"翡";s:2:"";s:3:"翦";s:2:"";s:3:"翩";s:2:"";s:3:"翳";s:2:"";s:3:"翹";s:2:"";s:3:"飜";s:2:"";s:3:"耆";s:2:"";s:3:"耄";s:2:"";s:3:"耋";s:2:"";s:3:"耒";s:2:"";s:3:"耘";s:2:"";s:3:"耙";s:2:"";s:3:"耜";s:2:"";s:3:"耡";s:2:"";s:3:"耨";s:2:"";s:3:"耿";s:2:"";s:3:"耻";s:2:"";s:3:"聊";s:2:"";s:3:"聆";s:2:"";s:3:"聒";s:2:"";s:3:"聘";s:2:"";s:3:"聚";s:2:"";s:3:"聟";s:2:"";s:3:"聢";s:2:"";s:3:"聨";s:2:"";s:3:"聳";s:2:"";s:3:"聲";s:2:"";s:3:"聰";s:2:"";s:3:"聶";s:2:"";s:3:"聹";s:2:"";s:3:"聽";s:2:"";s:3:"聿";s:2:"";s:3:"肄";s:2:"";s:3:"肆";s:2:"";s:3:"肅";s:2:"";s:3:"肛";s:2:"";s:3:"肓";s:2:"";s:3:"肚";s:2:"";s:3:"肭";s:2:"";s:3:"冐";s:2:"";s:3:"肬";s:2:"";s:3:"胛";s:2:"";s:3:"胥";s:2:"";s:3:"胙";s:2:"";s:3:"胝";s:2:"";s:3:"胄";s:2:"";s:3:"胚";s:2:"";s:3:"胖";s:2:"";s:3:"脉";s:2:"";s:3:"胯";s:2:"";s:3:"胱";s:2:"";s:3:"脛";s:2:"";s:3:"脩";s:2:"";s:3:"脣";s:2:"";s:3:"脯";s:2:"";s:3:"腋";s:2:"@";s:3:"隋";s:2:"A";s:3:"腆";s:2:"B";s:3:"脾";s:2:"C";s:3:"腓";s:2:"D";s:3:"腑";s:2:"E";s:3:"胼";s:2:"F";s:3:"腱";s:2:"G";s:3:"腮";s:2:"H";s:3:"腥";s:2:"I";s:3:"腦";s:2:"J";s:3:"腴";s:2:"K";s:3:"膃";s:2:"L";s:3:"膈";s:2:"M";s:3:"膊";s:2:"N";s:3:"膀";s:2:"O";s:3:"膂";s:2:"P";s:3:"膠";s:2:"Q";s:3:"膕";s:2:"R";s:3:"膤";s:2:"S";s:3:"膣";s:2:"T";s:3:"腟";s:2:"U";s:3:"膓";s:2:"V";s:3:"膩";s:2:"W";s:3:"膰";s:2:"X";s:3:"膵";s:2:"Y";s:3:"膾";s:2:"Z";s:3:"膸";s:2:"[";s:3:"膽";s:2:"\";s:3:"臀";s:2:"]";s:3:"臂";s:2:"^";s:3:"膺";s:2:"_";s:3:"臉";s:2:"`";s:3:"臍";s:2:"a";s:3:"臑";s:2:"b";s:3:"臙";s:2:"c";s:3:"臘";s:2:"d";s:3:"臈";s:2:"e";s:3:"臚";s:2:"f";s:3:"臟";s:2:"g";s:3:"臠";s:2:"h";s:3:"臧";s:2:"i";s:3:"臺";s:2:"j";s:3:"臻";s:2:"k";s:3:"臾";s:2:"l";s:3:"舁";s:2:"m";s:3:"舂";s:2:"n";s:3:"舅";s:2:"o";s:3:"與";s:2:"p";s:3:"舊";s:2:"q";s:3:"舍";s:2:"r";s:3:"舐";s:2:"s";s:3:"舖";s:2:"t";s:3:"舩";s:2:"u";s:3:"舫";s:2:"v";s:3:"舸";s:2:"w";s:3:"舳";s:2:"x";s:3:"艀";s:2:"y";s:3:"艙";s:2:"z";s:3:"艘";s:2:"{";s:3:"艝";s:2:"|";s:3:"艚";s:2:"}";s:3:"艟";s:2:"~";s:3:"艤";s:2:"";s:3:"艢";s:2:"";s:3:"艨";s:2:"";s:3:"艪";s:2:"";s:3:"艫";s:2:"";s:3:"舮";s:2:"";s:3:"艱";s:2:"";s:3:"艷";s:2:"";s:3:"艸";s:2:"";s:3:"艾";s:2:"";s:3:"芍";s:2:"";s:3:"芒";s:2:"";s:3:"芫";s:2:"";s:3:"芟";s:2:"";s:3:"芻";s:2:"";s:3:"芬";s:2:"";s:3:"苡";s:2:"";s:3:"苣";s:2:"";s:3:"苟";s:2:"";s:3:"苒";s:2:"";s:3:"苴";s:2:"";s:3:"苳";s:2:"";s:3:"苺";s:2:"";s:3:"莓";s:2:"";s:3:"范";s:2:"";s:3:"苻";s:2:"";s:3:"苹";s:2:"";s:3:"苞";s:2:"";s:3:"茆";s:2:"";s:3:"苜";s:2:"";s:3:"茉";s:2:"";s:3:"苙";s:2:"";s:3:"茵";s:2:"";s:3:"茴";s:2:"";s:3:"茖";s:2:"";s:3:"茲";s:2:"";s:3:"茱";s:2:"";s:3:"荀";s:2:"";s:3:"茹";s:2:"";s:3:"荐";s:2:"";s:3:"荅";s:2:"";s:3:"茯";s:2:"";s:3:"茫";s:2:"";s:3:"茗";s:2:"";s:3:"茘";s:2:"";s:3:"莅";s:2:"";s:3:"莚";s:2:"";s:3:"莪";s:2:"";s:3:"莟";s:2:"";s:3:"莢";s:2:"";s:3:"莖";s:2:"";s:3:"茣";s:2:"";s:3:"莎";s:2:"";s:3:"莇";s:2:"";s:3:"莊";s:2:"";s:3:"荼";s:2:"";s:3:"莵";s:2:"";s:3:"荳";s:2:"";s:3:"荵";s:2:"";s:3:"莠";s:2:"";s:3:"莉";s:2:"";s:3:"莨";s:2:"";s:3:"菴";s:2:"";s:3:"萓";s:2:"";s:3:"菫";s:2:"";s:3:"菎";s:2:"";s:3:"菽";s:2:"";s:3:"萃";s:2:"";s:3:"菘";s:2:"";s:3:"萋";s:2:"";s:3:"菁";s:2:"";s:3:"菷";s:2:"";s:3:"萇";s:2:"";s:3:"菠";s:2:"";s:3:"菲";s:2:"";s:3:"萍";s:2:"";s:3:"萢";s:2:"";s:3:"萠";s:2:"";s:3:"莽";s:2:"";s:3:"萸";s:2:"";s:3:"蔆";s:2:"";s:3:"菻";s:2:"";s:3:"葭";s:2:"";s:3:"萪";s:2:"";s:3:"萼";s:2:"";s:3:"蕚";s:2:"";s:3:"蒄";s:2:"";s:3:"葷";s:2:"";s:3:"葫";s:2:"";s:3:"蒭";s:2:"";s:3:"葮";s:2:"";s:3:"蒂";s:2:"";s:3:"葩";s:2:"";s:3:"葆";s:2:"";s:3:"萬";s:2:"";s:3:"葯";s:2:"";s:3:"葹";s:2:"";s:3:"萵";s:2:"";s:3:"蓊";s:2:"";s:3:"葢";s:2:"";s:3:"蒹";s:2:"";s:3:"蒿";s:2:"";s:3:"蒟";s:2:"";s:3:"蓙";s:2:"";s:3:"蓍";s:2:"";s:3:"蒻";s:2:"";s:3:"蓚";s:2:"";s:3:"蓐";s:2:"";s:3:"蓁";s:2:"";s:3:"蓆";s:2:"";s:3:"蓖";s:2:"";s:3:"蒡";s:2:"";s:3:"蔡";s:2:"";s:3:"蓿";s:2:"";s:3:"蓴";s:2:"";s:3:"蔗";s:2:"";s:3:"蔘";s:2:"";s:3:"蔬";s:2:"";s:3:"蔟";s:2:"";s:3:"蔕";s:2:"";s:3:"蔔";s:2:"";s:3:"蓼";s:2:"";s:3:"蕀";s:2:"";s:3:"蕣";s:2:"";s:3:"蕘";s:2:"";s:3:"蕈";s:2:"@";s:3:"蕁";s:2:"A";s:3:"蘂";s:2:"B";s:3:"蕋";s:2:"C";s:3:"蕕";s:2:"D";s:3:"薀";s:2:"E";s:3:"薤";s:2:"F";s:3:"薈";s:2:"G";s:3:"薑";s:2:"H";s:3:"薊";s:2:"I";s:3:"薨";s:2:"J";s:3:"蕭";s:2:"K";s:3:"薔";s:2:"L";s:3:"薛";s:2:"M";s:3:"藪";s:2:"N";s:3:"薇";s:2:"O";s:3:"薜";s:2:"P";s:3:"蕷";s:2:"Q";s:3:"蕾";s:2:"R";s:3:"薐";s:2:"S";s:3:"藉";s:2:"T";s:3:"薺";s:2:"U";s:3:"藏";s:2:"V";s:3:"薹";s:2:"W";s:3:"藐";s:2:"X";s:3:"藕";s:2:"Y";s:3:"藝";s:2:"Z";s:3:"藥";s:2:"[";s:3:"藜";s:2:"\";s:3:"藹";s:2:"]";s:3:"蘊";s:2:"^";s:3:"蘓";s:2:"_";s:3:"蘋";s:2:"`";s:3:"藾";s:2:"a";s:3:"藺";s:2:"b";s:3:"蘆";s:2:"c";s:3:"蘢";s:2:"d";s:3:"蘚";s:2:"e";s:3:"蘰";s:2:"f";s:3:"蘿";s:2:"g";s:3:"虍";s:2:"h";s:3:"乕";s:2:"i";s:3:"虔";s:2:"j";s:3:"號";s:2:"k";s:3:"虧";s:2:"l";s:3:"虱";s:2:"m";s:3:"蚓";s:2:"n";s:3:"蚣";s:2:"o";s:3:"蚩";s:2:"p";s:3:"蚪";s:2:"q";s:3:"蚋";s:2:"r";s:3:"蚌";s:2:"s";s:3:"蚶";s:2:"t";s:3:"蚯";s:2:"u";s:3:"蛄";s:2:"v";s:3:"蛆";s:2:"w";s:3:"蚰";s:2:"x";s:3:"蛉";s:2:"y";s:3:"蠣";s:2:"z";s:3:"蚫";s:2:"{";s:3:"蛔";s:2:"|";s:3:"蛞";s:2:"}";s:3:"蛩";s:2:"~";s:3:"蛬";s:2:"";s:3:"蛟";s:2:"";s:3:"蛛";s:2:"";s:3:"蛯";s:2:"";s:3:"蜒";s:2:"";s:3:"蜆";s:2:"";s:3:"蜈";s:2:"";s:3:"蜀";s:2:"";s:3:"蜃";s:2:"";s:3:"蛻";s:2:"";s:3:"蜑";s:2:"";s:3:"蜉";s:2:"";s:3:"蜍";s:2:"";s:3:"蛹";s:2:"";s:3:"蜊";s:2:"";s:3:"蜴";s:2:"";s:3:"蜿";s:2:"";s:3:"蜷";s:2:"";s:3:"蜻";s:2:"";s:3:"蜥";s:2:"";s:3:"蜩";s:2:"";s:3:"蜚";s:2:"";s:3:"蝠";s:2:"";s:3:"蝟";s:2:"";s:3:"蝸";s:2:"";s:3:"蝌";s:2:"";s:3:"蝎";s:2:"";s:3:"蝴";s:2:"";s:3:"蝗";s:2:"";s:3:"蝨";s:2:"";s:3:"蝮";s:2:"";s:3:"蝙";s:2:"";s:3:"蝓";s:2:"";s:3:"蝣";s:2:"";s:3:"蝪";s:2:"";s:3:"蠅";s:2:"";s:3:"螢";s:2:"";s:3:"螟";s:2:"";s:3:"螂";s:2:"";s:3:"螯";s:2:"";s:3:"蟋";s:2:"";s:3:"螽";s:2:"";s:3:"蟀";s:2:"";s:3:"蟐";s:2:"";s:3:"雖";s:2:"";s:3:"螫";s:2:"";s:3:"蟄";s:2:"";s:3:"螳";s:2:"";s:3:"蟇";s:2:"";s:3:"蟆";s:2:"";s:3:"螻";s:2:"";s:3:"蟯";s:2:"";s:3:"蟲";s:2:"";s:3:"蟠";s:2:"";s:3:"蠏";s:2:"";s:3:"蠍";s:2:"";s:3:"蟾";s:2:"";s:3:"蟶";s:2:"";s:3:"蟷";s:2:"";s:3:"蠎";s:2:"";s:3:"蟒";s:2:"";s:3:"蠑";s:2:"";s:3:"蠖";s:2:"";s:3:"蠕";s:2:"";s:3:"蠢";s:2:"";s:3:"蠡";s:2:"";s:3:"蠱";s:2:"";s:3:"蠶";s:2:"";s:3:"蠹";s:2:"";s:3:"蠧";s:2:"";s:3:"蠻";s:2:"";s:3:"衄";s:2:"";s:3:"衂";s:2:"";s:3:"衒";s:2:"";s:3:"衙";s:2:"";s:3:"衞";s:2:"";s:3:"衢";s:2:"";s:3:"衫";s:2:"";s:3:"袁";s:2:"";s:3:"衾";s:2:"";s:3:"袞";s:2:"";s:3:"衵";s:2:"";s:3:"衽";s:2:"";s:3:"袵";s:2:"";s:3:"衲";s:2:"";s:3:"袂";s:2:"";s:3:"袗";s:2:"";s:3:"袒";s:2:"";s:3:"袮";s:2:"";s:3:"袙";s:2:"";s:3:"袢";s:2:"";s:3:"袍";s:2:"";s:3:"袤";s:2:"";s:3:"袰";s:2:"";s:3:"袿";s:2:"";s:3:"袱";s:2:"";s:3:"裃";s:2:"";s:3:"裄";s:2:"";s:3:"裔";s:2:"";s:3:"裘";s:2:"";s:3:"裙";s:2:"";s:3:"裝";s:2:"";s:3:"裹";s:2:"";s:3:"褂";s:2:"";s:3:"裼";s:2:"";s:3:"裴";s:2:"";s:3:"裨";s:2:"";s:3:"裲";s:2:"";s:3:"褄";s:2:"";s:3:"褌";s:2:"";s:3:"褊";s:2:"";s:3:"褓";s:2:"";s:3:"襃";s:2:"";s:3:"褞";s:2:"";s:3:"褥";s:2:"";s:3:"褪";s:2:"";s:3:"褫";s:2:"";s:3:"襁";s:2:"";s:3:"襄";s:2:"";s:3:"褻";s:2:"";s:3:"褶";s:2:"";s:3:"褸";s:2:"";s:3:"襌";s:2:"";s:3:"褝";s:2:"";s:3:"襠";s:2:"";s:3:"襞";s:2:"@";s:3:"襦";s:2:"A";s:3:"襤";s:2:"B";s:3:"襭";s:2:"C";s:3:"襪";s:2:"D";s:3:"襯";s:2:"E";s:3:"襴";s:2:"F";s:3:"襷";s:2:"G";s:3:"襾";s:2:"H";s:3:"覃";s:2:"I";s:3:"覈";s:2:"J";s:3:"覊";s:2:"K";s:3:"覓";s:2:"L";s:3:"覘";s:2:"M";s:3:"覡";s:2:"N";s:3:"覩";s:2:"O";s:3:"覦";s:2:"P";s:3:"覬";s:2:"Q";s:3:"覯";s:2:"R";s:3:"覲";s:2:"S";s:3:"覺";s:2:"T";s:3:"覽";s:2:"U";s:3:"覿";s:2:"V";s:3:"觀";s:2:"W";s:3:"觚";s:2:"X";s:3:"觜";s:2:"Y";s:3:"觝";s:2:"Z";s:3:"觧";s:2:"[";s:3:"觴";s:2:"\";s:3:"觸";s:2:"]";s:3:"訃";s:2:"^";s:3:"訖";s:2:"_";s:3:"訐";s:2:"`";s:3:"訌";s:2:"a";s:3:"訛";s:2:"b";s:3:"訝";s:2:"c";s:3:"訥";s:2:"d";s:3:"訶";s:2:"e";s:3:"詁";s:2:"f";s:3:"詛";s:2:"g";s:3:"詒";s:2:"h";s:3:"詆";s:2:"i";s:3:"詈";s:2:"j";s:3:"詼";s:2:"k";s:3:"詭";s:2:"l";s:3:"詬";s:2:"m";s:3:"詢";s:2:"n";s:3:"誅";s:2:"o";s:3:"誂";s:2:"p";s:3:"誄";s:2:"q";s:3:"誨";s:2:"r";s:3:"誡";s:2:"s";s:3:"誑";s:2:"t";s:3:"誥";s:2:"u";s:3:"誦";s:2:"v";s:3:"誚";s:2:"w";s:3:"誣";s:2:"x";s:3:"諄";s:2:"y";s:3:"諍";s:2:"z";s:3:"諂";s:2:"{";s:3:"諚";s:2:"|";s:3:"諫";s:2:"}";s:3:"諳";s:2:"~";s:3:"諧";s:2:"";s:3:"諤";s:2:"";s:3:"諱";s:2:"";s:3:"謔";s:2:"";s:3:"諠";s:2:"";s:3:"諢";s:2:"";s:3:"諷";s:2:"";s:3:"諞";s:2:"";s:3:"諛";s:2:"";s:3:"謌";s:2:"";s:3:"謇";s:2:"";s:3:"謚";s:2:"";s:3:"諡";s:2:"";s:3:"謖";s:2:"";s:3:"謐";s:2:"";s:3:"謗";s:2:"";s:3:"謠";s:2:"";s:3:"謳";s:2:"";s:3:"鞫";s:2:"";s:3:"謦";s:2:"";s:3:"謫";s:2:"";s:3:"謾";s:2:"";s:3:"謨";s:2:"";s:3:"譁";s:2:"";s:3:"譌";s:2:"";s:3:"譏";s:2:"";s:3:"譎";s:2:"";s:3:"證";s:2:"";s:3:"譖";s:2:"";s:3:"譛";s:2:"";s:3:"譚";s:2:"";s:3:"譫";s:2:"";s:3:"譟";s:2:"";s:3:"譬";s:2:"";s:3:"譯";s:2:"";s:3:"譴";s:2:"";s:3:"譽";s:2:"";s:3:"讀";s:2:"";s:3:"讌";s:2:"";s:3:"讎";s:2:"";s:3:"讒";s:2:"";s:3:"讓";s:2:"";s:3:"讖";s:2:"";s:3:"讙";s:2:"";s:3:"讚";s:2:"";s:3:"谺";s:2:"";s:3:"豁";s:2:"";s:3:"谿";s:2:"";s:3:"豈";s:2:"";s:3:"豌";s:2:"";s:3:"豎";s:2:"";s:3:"豐";s:2:"";s:3:"豕";s:2:"";s:3:"豢";s:2:"";s:3:"豬";s:2:"";s:3:"豸";s:2:"";s:3:"豺";s:2:"";s:3:"貂";s:2:"";s:3:"貉";s:2:"";s:3:"貅";s:2:"";s:3:"貊";s:2:"";s:3:"貍";s:2:"";s:3:"貎";s:2:"";s:3:"貔";s:2:"";s:3:"豼";s:2:"";s:3:"貘";s:2:"";s:3:"戝";s:2:"";s:3:"貭";s:2:"";s:3:"貪";s:2:"";s:3:"貽";s:2:"";s:3:"貲";s:2:"";s:3:"貳";s:2:"";s:3:"貮";s:2:"";s:3:"貶";s:2:"";s:3:"賈";s:2:"";s:3:"賁";s:2:"";s:3:"賤";s:2:"";s:3:"賣";s:2:"";s:3:"賚";s:2:"";s:3:"賽";s:2:"";s:3:"賺";s:2:"";s:3:"賻";s:2:"";s:3:"贄";s:2:"";s:3:"贅";s:2:"";s:3:"贊";s:2:"";s:3:"贇";s:2:"";s:3:"贏";s:2:"";s:3:"贍";s:2:"";s:3:"贐";s:2:"";s:3:"齎";s:2:"";s:3:"贓";s:2:"";s:3:"賍";s:2:"";s:3:"贔";s:2:"";s:3:"贖";s:2:"";s:3:"赧";s:2:"";s:3:"赭";s:2:"";s:3:"赱";s:2:"";s:3:"赳";s:2:"";s:3:"趁";s:2:"";s:3:"趙";s:2:"";s:3:"跂";s:2:"";s:3:"趾";s:2:"";s:3:"趺";s:2:"";s:3:"跏";s:2:"";s:3:"跚";s:2:"";s:3:"跖";s:2:"";s:3:"跌";s:2:"";s:3:"跛";s:2:"";s:3:"跋";s:2:"";s:3:"跪";s:2:"";s:3:"跫";s:2:"";s:3:"跟";s:2:"";s:3:"跣";s:2:"";s:3:"跼";s:2:"";s:3:"踈";s:2:"";s:3:"踉";s:2:"";s:3:"跿";s:2:"";s:3:"踝";s:2:"";s:3:"踞";s:2:"";s:3:"踐";s:2:"";s:3:"踟";s:2:"";s:3:"蹂";s:2:"";s:3:"踵";s:2:"";s:3:"踰";s:2:"";s:3:"踴";s:2:"";s:3:"蹊";s:2:"@";s:3:"蹇";s:2:"A";s:3:"蹉";s:2:"B";s:3:"蹌";s:2:"C";s:3:"蹐";s:2:"D";s:3:"蹈";s:2:"E";s:3:"蹙";s:2:"F";s:3:"蹤";s:2:"G";s:3:"蹠";s:2:"H";s:3:"踪";s:2:"I";s:3:"蹣";s:2:"J";s:3:"蹕";s:2:"K";s:3:"蹶";s:2:"L";s:3:"蹲";s:2:"M";s:3:"蹼";s:2:"N";s:3:"躁";s:2:"O";s:3:"躇";s:2:"P";s:3:"躅";s:2:"Q";s:3:"躄";s:2:"R";s:3:"躋";s:2:"S";s:3:"躊";s:2:"T";s:3:"躓";s:2:"U";s:3:"躑";s:2:"V";s:3:"躔";s:2:"W";s:3:"躙";s:2:"X";s:3:"躪";s:2:"Y";s:3:"躡";s:2:"Z";s:3:"躬";s:2:"[";s:3:"躰";s:2:"\";s:3:"軆";s:2:"]";s:3:"躱";s:2:"^";s:3:"躾";s:2:"_";s:3:"軅";s:2:"`";s:3:"軈";s:2:"a";s:3:"軋";s:2:"b";s:3:"軛";s:2:"c";s:3:"軣";s:2:"d";s:3:"軼";s:2:"e";s:3:"軻";s:2:"f";s:3:"軫";s:2:"g";s:3:"軾";s:2:"h";s:3:"輊";s:2:"i";s:3:"輅";s:2:"j";s:3:"輕";s:2:"k";s:3:"輒";s:2:"l";s:3:"輙";s:2:"m";s:3:"輓";s:2:"n";s:3:"輜";s:2:"o";s:3:"輟";s:2:"p";s:3:"輛";s:2:"q";s:3:"輌";s:2:"r";s:3:"輦";s:2:"s";s:3:"輳";s:2:"t";s:3:"輻";s:2:"u";s:3:"輹";s:2:"v";s:3:"轅";s:2:"w";s:3:"轂";s:2:"x";s:3:"輾";s:2:"y";s:3:"轌";s:2:"z";s:3:"轉";s:2:"{";s:3:"轆";s:2:"|";s:3:"轎";s:2:"}";s:3:"轗";s:2:"~";s:3:"轜";s:2:"";s:3:"轢";s:2:"";s:3:"轣";s:2:"";s:3:"轤";s:2:"";s:3:"辜";s:2:"";s:3:"辟";s:2:"";s:3:"辣";s:2:"";s:3:"辭";s:2:"";s:3:"辯";s:2:"";s:3:"辷";s:2:"";s:3:"迚";s:2:"";s:3:"迥";s:2:"";s:3:"迢";s:2:"";s:3:"迪";s:2:"";s:3:"迯";s:2:"";s:3:"邇";s:2:"";s:3:"迴";s:2:"";s:3:"逅";s:2:"";s:3:"迹";s:2:"";s:3:"迺";s:2:"";s:3:"逑";s:2:"";s:3:"逕";s:2:"";s:3:"逡";s:2:"";s:3:"逍";s:2:"";s:3:"逞";s:2:"";s:3:"逖";s:2:"";s:3:"逋";s:2:"";s:3:"逧";s:2:"";s:3:"逶";s:2:"";s:3:"逵";s:2:"";s:3:"逹";s:2:"";s:3:"迸";s:2:"";s:3:"遏";s:2:"";s:3:"遐";s:2:"";s:3:"遑";s:2:"";s:3:"遒";s:2:"";s:3:"逎";s:2:"";s:3:"遉";s:2:"";s:3:"逾";s:2:"";s:3:"遖";s:2:"";s:3:"遘";s:2:"";s:3:"遞";s:2:"";s:3:"遨";s:2:"";s:3:"遯";s:2:"";s:3:"遶";s:2:"";s:3:"隨";s:2:"";s:3:"遲";s:2:"";s:3:"邂";s:2:"";s:3:"遽";s:2:"";s:3:"邁";s:2:"";s:3:"邀";s:2:"";s:3:"邊";s:2:"";s:3:"邉";s:2:"";s:3:"邏";s:2:"";s:3:"邨";s:2:"";s:3:"邯";s:2:"";s:3:"邱";s:2:"";s:3:"邵";s:2:"";s:3:"郢";s:2:"";s:3:"郤";s:2:"";s:3:"扈";s:2:"";s:3:"郛";s:2:"";s:3:"鄂";s:2:"";s:3:"鄒";s:2:"";s:3:"鄙";s:2:"";s:3:"鄲";s:2:"";s:3:"鄰";s:2:"";s:3:"酊";s:2:"";s:3:"酖";s:2:"";s:3:"酘";s:2:"";s:3:"酣";s:2:"";s:3:"酥";s:2:"";s:3:"酩";s:2:"";s:3:"酳";s:2:"";s:3:"酲";s:2:"";s:3:"醋";s:2:"";s:3:"醉";s:2:"";s:3:"醂";s:2:"";s:3:"醢";s:2:"";s:3:"醫";s:2:"";s:3:"醯";s:2:"";s:3:"醪";s:2:"";s:3:"醵";s:2:"";s:3:"醴";s:2:"";s:3:"醺";s:2:"";s:3:"釀";s:2:"";s:3:"釁";s:2:"";s:3:"釉";s:2:"";s:3:"釋";s:2:"";s:3:"釐";s:2:"";s:3:"釖";s:2:"";s:3:"釟";s:2:"";s:3:"釡";s:2:"";s:3:"釛";s:2:"";s:3:"釼";s:2:"";s:3:"釵";s:2:"";s:3:"釶";s:2:"";s:3:"鈞";s:2:"";s:3:"釿";s:2:"";s:3:"鈔";s:2:"";s:3:"鈬";s:2:"";s:3:"鈕";s:2:"";s:3:"鈑";s:2:"";s:3:"鉞";s:2:"";s:3:"鉗";s:2:"";s:3:"鉅";s:2:"";s:3:"鉉";s:2:"";s:3:"鉤";s:2:"";s:3:"鉈";s:2:"";s:3:"銕";s:2:"";s:3:"鈿";s:2:"";s:3:"鉋";s:2:"";s:3:"鉐";s:2:"";s:3:"銜";s:2:"";s:3:"銖";s:2:"";s:3:"銓";s:2:"";s:3:"銛";s:2:"";s:3:"鉚";s:2:"";s:3:"鋏";s:2:"";s:3:"銹";s:2:"";s:3:"銷";s:2:"";s:3:"鋩";s:2:"";s:3:"錏";s:2:"";s:3:"鋺";s:2:"";s:3:"鍄";s:2:"";s:3:"錮";s:2:"@";s:3:"錙";s:2:"A";s:3:"錢";s:2:"B";s:3:"錚";s:2:"C";s:3:"錣";s:2:"D";s:3:"錺";s:2:"E";s:3:"錵";s:2:"F";s:3:"錻";s:2:"G";s:3:"鍜";s:2:"H";s:3:"鍠";s:2:"I";s:3:"鍼";s:2:"J";s:3:"鍮";s:2:"K";s:3:"鍖";s:2:"L";s:3:"鎰";s:2:"M";s:3:"鎬";s:2:"N";s:3:"鎭";s:2:"O";s:3:"鎔";s:2:"P";s:3:"鎹";s:2:"Q";s:3:"鏖";s:2:"R";s:3:"鏗";s:2:"S";s:3:"鏨";s:2:"T";s:3:"鏥";s:2:"U";s:3:"鏘";s:2:"V";s:3:"鏃";s:2:"W";s:3:"鏝";s:2:"X";s:3:"鏐";s:2:"Y";s:3:"鏈";s:2:"Z";s:3:"鏤";s:2:"[";s:3:"鐚";s:2:"\";s:3:"鐔";s:2:"]";s:3:"鐓";s:2:"^";s:3:"鐃";s:2:"_";s:3:"鐇";s:2:"`";s:3:"鐐";s:2:"a";s:3:"鐶";s:2:"b";s:3:"鐫";s:2:"c";s:3:"鐵";s:2:"d";s:3:"鐡";s:2:"e";s:3:"鐺";s:2:"f";s:3:"鑁";s:2:"g";s:3:"鑒";s:2:"h";s:3:"鑄";s:2:"i";s:3:"鑛";s:2:"j";s:3:"鑠";s:2:"k";s:3:"鑢";s:2:"l";s:3:"鑞";s:2:"m";s:3:"鑪";s:2:"n";s:3:"鈩";s:2:"o";s:3:"鑰";s:2:"p";s:3:"鑵";s:2:"q";s:3:"鑷";s:2:"r";s:3:"鑽";s:2:"s";s:3:"鑚";s:2:"t";s:3:"鑼";s:2:"u";s:3:"鑾";s:2:"v";s:3:"钁";s:2:"w";s:3:"鑿";s:2:"x";s:3:"閂";s:2:"y";s:3:"閇";s:2:"z";s:3:"閊";s:2:"{";s:3:"閔";s:2:"|";s:3:"閖";s:2:"}";s:3:"閘";s:2:"~";s:3:"閙";s:2:"";s:3:"閠";s:2:"";s:3:"閨";s:2:"";s:3:"閧";s:2:"";s:3:"閭";s:2:"";s:3:"閼";s:2:"";s:3:"閻";s:2:"";s:3:"閹";s:2:"";s:3:"閾";s:2:"";s:3:"闊";s:2:"";s:3:"濶";s:2:"";s:3:"闃";s:2:"";s:3:"闍";s:2:"";s:3:"闌";s:2:"";s:3:"闕";s:2:"";s:3:"闔";s:2:"";s:3:"闖";s:2:"";s:3:"關";s:2:"";s:3:"闡";s:2:"";s:3:"闥";s:2:"";s:3:"闢";s:2:"";s:3:"阡";s:2:"";s:3:"阨";s:2:"";s:3:"阮";s:2:"";s:3:"阯";s:2:"";s:3:"陂";s:2:"";s:3:"陌";s:2:"";s:3:"陏";s:2:"";s:3:"陋";s:2:"";s:3:"陷";s:2:"";s:3:"陜";s:2:"";s:3:"陞";s:2:"";s:3:"陝";s:2:"";s:3:"陟";s:2:"";s:3:"陦";s:2:"";s:3:"陲";s:2:"";s:3:"陬";s:2:"";s:3:"隍";s:2:"";s:3:"隘";s:2:"";s:3:"隕";s:2:"";s:3:"隗";s:2:"";s:3:"險";s:2:"";s:3:"隧";s:2:"";s:3:"隱";s:2:"";s:3:"隲";s:2:"";s:3:"隰";s:2:"";s:3:"隴";s:2:"";s:3:"隶";s:2:"";s:3:"隸";s:2:"";s:3:"隹";s:2:"";s:3:"雎";s:2:"";s:3:"雋";s:2:"";s:3:"雉";s:2:"";s:3:"雍";s:2:"";s:3:"襍";s:2:"";s:3:"雜";s:2:"";s:3:"霍";s:2:"";s:3:"雕";s:2:"";s:3:"雹";s:2:"";s:3:"霄";s:2:"";s:3:"霆";s:2:"";s:3:"霈";s:2:"";s:3:"霓";s:2:"";s:3:"霎";s:2:"";s:3:"霑";s:2:"";s:3:"霏";s:2:"";s:3:"霖";s:2:"";s:3:"霙";s:2:"";s:3:"霤";s:2:"";s:3:"霪";s:2:"";s:3:"霰";s:2:"";s:3:"霹";s:2:"";s:3:"霽";s:2:"";s:3:"霾";s:2:"";s:3:"靄";s:2:"";s:3:"靆";s:2:"";s:3:"靈";s:2:"";s:3:"靂";s:2:"";s:3:"靉";s:2:"";s:3:"靜";s:2:"";s:3:"靠";s:2:"";s:3:"靤";s:2:"";s:3:"靦";s:2:"";s:3:"靨";s:2:"";s:3:"勒";s:2:"";s:3:"靫";s:2:"";s:3:"靱";s:2:"";s:3:"靹";s:2:"";s:3:"鞅";s:2:"";s:3:"靼";s:2:"";s:3:"鞁";s:2:"";s:3:"靺";s:2:"";s:3:"鞆";s:2:"";s:3:"鞋";s:2:"";s:3:"鞏";s:2:"";s:3:"鞐";s:2:"";s:3:"鞜";s:2:"";s:3:"鞨";s:2:"";s:3:"鞦";s:2:"";s:3:"鞣";s:2:"";s:3:"鞳";s:2:"";s:3:"鞴";s:2:"";s:3:"韃";s:2:"";s:3:"韆";s:2:"";s:3:"韈";s:2:"";s:3:"韋";s:2:"";s:3:"韜";s:2:"";s:3:"韭";s:2:"";s:3:"齏";s:2:"";s:3:"韲";s:2:"";s:3:"竟";s:2:"";s:3:"韶";s:2:"";s:3:"韵";s:2:"";s:3:"頏";s:2:"";s:3:"頌";s:2:"";s:3:"頸";s:2:"";s:3:"頤";s:2:"";s:3:"頡";s:2:"";s:3:"頷";s:2:"";s:3:"頽";s:2:"";s:3:"顆";s:2:"";s:3:"顏";s:2:"";s:3:"顋";s:2:"";s:3:"顫";s:2:"";s:3:"顯";s:2:"";s:3:"顰";s:2:"@";s:3:"顱";s:2:"A";s:3:"顴";s:2:"B";s:3:"顳";s:2:"C";s:3:"颪";s:2:"D";s:3:"颯";s:2:"E";s:3:"颱";s:2:"F";s:3:"颶";s:2:"G";s:3:"飄";s:2:"H";s:3:"飃";s:2:"I";s:3:"飆";s:2:"J";s:3:"飩";s:2:"K";s:3:"飫";s:2:"L";s:3:"餃";s:2:"M";s:3:"餉";s:2:"N";s:3:"餒";s:2:"O";s:3:"餔";s:2:"P";s:3:"餘";s:2:"Q";s:3:"餡";s:2:"R";s:3:"餝";s:2:"S";s:3:"餞";s:2:"T";s:3:"餤";s:2:"U";s:3:"餠";s:2:"V";s:3:"餬";s:2:"W";s:3:"餮";s:2:"X";s:3:"餽";s:2:"Y";s:3:"餾";s:2:"Z";s:3:"饂";s:2:"[";s:3:"饉";s:2:"\";s:3:"饅";s:2:"]";s:3:"饐";s:2:"^";s:3:"饋";s:2:"_";s:3:"饑";s:2:"`";s:3:"饒";s:2:"a";s:3:"饌";s:2:"b";s:3:"饕";s:2:"c";s:3:"馗";s:2:"d";s:3:"馘";s:2:"e";s:3:"馥";s:2:"f";s:3:"馭";s:2:"g";s:3:"馮";s:2:"h";s:3:"馼";s:2:"i";s:3:"駟";s:2:"j";s:3:"駛";s:2:"k";s:3:"駝";s:2:"l";s:3:"駘";s:2:"m";s:3:"駑";s:2:"n";s:3:"駭";s:2:"o";s:3:"駮";s:2:"p";s:3:"駱";s:2:"q";s:3:"駲";s:2:"r";s:3:"駻";s:2:"s";s:3:"駸";s:2:"t";s:3:"騁";s:2:"u";s:3:"騏";s:2:"v";s:3:"騅";s:2:"w";s:3:"駢";s:2:"x";s:3:"騙";s:2:"y";s:3:"騫";s:2:"z";s:3:"騷";s:2:"{";s:3:"驅";s:2:"|";s:3:"驂";s:2:"}";s:3:"驀";s:2:"~";s:3:"驃";s:2:"";s:3:"騾";s:2:"";s:3:"驕";s:2:"";s:3:"驍";s:2:"";s:3:"驛";s:2:"";s:3:"驗";s:2:"";s:3:"驟";s:2:"";s:3:"驢";s:2:"";s:3:"驥";s:2:"";s:3:"驤";s:2:"";s:3:"驩";s:2:"";s:3:"驫";s:2:"";s:3:"驪";s:2:"";s:3:"骭";s:2:"";s:3:"骰";s:2:"";s:3:"骼";s:2:"";s:3:"髀";s:2:"";s:3:"髏";s:2:"";s:3:"髑";s:2:"";s:3:"髓";s:2:"";s:3:"體";s:2:"";s:3:"髞";s:2:"";s:3:"髟";s:2:"";s:3:"髢";s:2:"";s:3:"髣";s:2:"";s:3:"髦";s:2:"";s:3:"髯";s:2:"";s:3:"髫";s:2:"";s:3:"髮";s:2:"";s:3:"髴";s:2:"";s:3:"髱";s:2:"";s:3:"髷";s:2:"";s:3:"髻";s:2:"";s:3:"鬆";s:2:"";s:3:"鬘";s:2:"";s:3:"鬚";s:2:"";s:3:"鬟";s:2:"";s:3:"鬢";s:2:"";s:3:"鬣";s:2:"";s:3:"鬥";s:2:"";s:3:"鬧";s:2:"";s:3:"鬨";s:2:"";s:3:"鬩";s:2:"";s:3:"鬪";s:2:"";s:3:"鬮";s:2:"";s:3:"鬯";s:2:"";s:3:"鬲";s:2:"";s:3:"魄";s:2:"";s:3:"魃";s:2:"";s:3:"魏";s:2:"";s:3:"魍";s:2:"";s:3:"魎";s:2:"";s:3:"魑";s:2:"";s:3:"魘";s:2:"";s:3:"魴";s:2:"";s:3:"鮓";s:2:"";s:3:"鮃";s:2:"";s:3:"鮑";s:2:"";s:3:"鮖";s:2:"";s:3:"鮗";s:2:"";s:3:"鮟";s:2:"";s:3:"鮠";s:2:"";s:3:"鮨";s:2:"";s:3:"鮴";s:2:"";s:3:"鯀";s:2:"";s:3:"鯊";s:2:"";s:3:"鮹";s:2:"";s:3:"鯆";s:2:"";s:3:"鯏";s:2:"";s:3:"鯑";s:2:"";s:3:"鯒";s:2:"";s:3:"鯣";s:2:"";s:3:"鯢";s:2:"";s:3:"鯤";s:2:"";s:3:"鯔";s:2:"";s:3:"鯡";s:2:"";s:3:"鰺";s:2:"";s:3:"鯲";s:2:"";s:3:"鯱";s:2:"";s:3:"鯰";s:2:"";s:3:"鰕";s:2:"";s:3:"鰔";s:2:"";s:3:"鰉";s:2:"";s:3:"鰓";s:2:"";s:3:"鰌";s:2:"";s:3:"鰆";s:2:"";s:3:"鰈";s:2:"";s:3:"鰒";s:2:"";s:3:"鰊";s:2:"";s:3:"鰄";s:2:"";s:3:"鰮";s:2:"";s:3:"鰛";s:2:"";s:3:"鰥";s:2:"";s:3:"鰤";s:2:"";s:3:"鰡";s:2:"";s:3:"鰰";s:2:"";s:3:"鱇";s:2:"";s:3:"鰲";s:2:"";s:3:"鱆";s:2:"";s:3:"鰾";s:2:"";s:3:"鱚";s:2:"";s:3:"鱠";s:2:"";s:3:"鱧";s:2:"";s:3:"鱶";s:2:"";s:3:"鱸";s:2:"";s:3:"鳧";s:2:"";s:3:"鳬";s:2:"";s:3:"鳰";s:2:"";s:3:"鴉";s:2:"";s:3:"鴈";s:2:"";s:3:"鳫";s:2:"";s:3:"鴃";s:2:"";s:3:"鴆";s:2:"";s:3:"鴪";s:2:"";s:3:"鴦";s:2:"";s:3:"鶯";s:2:"";s:3:"鴣";s:2:"";s:3:"鴟";s:2:"";s:3:"鵄";s:2:"";s:3:"鴕";s:2:"";s:3:"鴒";s:2:"";s:3:"鵁";s:2:"";s:3:"鴿";s:2:"";s:3:"鴾";s:2:"";s:3:"鵆";s:2:"";s:3:"鵈";s:2:"@";s:3:"鵝";s:2:"A";s:3:"鵞";s:2:"B";s:3:"鵤";s:2:"C";s:3:"鵑";s:2:"D";s:3:"鵐";s:2:"E";s:3:"鵙";s:2:"F";s:3:"鵲";s:2:"G";s:3:"鶉";s:2:"H";s:3:"鶇";s:2:"I";s:3:"鶫";s:2:"J";s:3:"鵯";s:2:"K";s:3:"鵺";s:2:"L";s:3:"鶚";s:2:"M";s:3:"鶤";s:2:"N";s:3:"鶩";s:2:"O";s:3:"鶲";s:2:"P";s:3:"鷄";s:2:"Q";s:3:"鷁";s:2:"R";s:3:"鶻";s:2:"S";s:3:"鶸";s:2:"T";s:3:"鶺";s:2:"U";s:3:"鷆";s:2:"V";s:3:"鷏";s:2:"W";s:3:"鷂";s:2:"X";s:3:"鷙";s:2:"Y";s:3:"鷓";s:2:"Z";s:3:"鷸";s:2:"[";s:3:"鷦";s:2:"\";s:3:"鷭";s:2:"]";s:3:"鷯";s:2:"^";s:3:"鷽";s:2:"_";s:3:"鸚";s:2:"`";s:3:"鸛";s:2:"a";s:3:"鸞";s:2:"b";s:3:"鹵";s:2:"c";s:3:"鹹";s:2:"d";s:3:"鹽";s:2:"e";s:3:"麁";s:2:"f";s:3:"麈";s:2:"g";s:3:"麋";s:2:"h";s:3:"麌";s:2:"i";s:3:"麒";s:2:"j";s:3:"麕";s:2:"k";s:3:"麑";s:2:"l";s:3:"麝";s:2:"m";s:3:"麥";s:2:"n";s:3:"麩";s:2:"o";s:3:"麸";s:2:"p";s:3:"麪";s:2:"q";s:3:"麭";s:2:"r";s:3:"靡";s:2:"s";s:3:"黌";s:2:"t";s:3:"黎";s:2:"u";s:3:"黏";s:2:"v";s:3:"黐";s:2:"w";s:3:"黔";s:2:"x";s:3:"黜";s:2:"y";s:3:"點";s:2:"z";s:3:"黝";s:2:"{";s:3:"黠";s:2:"|";s:3:"黥";s:2:"}";s:3:"黨";s:2:"~";s:3:"黯";s:2:"";s:3:"黴";s:2:"";s:3:"黶";s:2:"";s:3:"黷";s:2:"";s:3:"黹";s:2:"";s:3:"黻";s:2:"";s:3:"黼";s:2:"";s:3:"黽";s:2:"";s:3:"鼇";s:2:"";s:3:"鼈";s:2:"";s:3:"皷";s:2:"";s:3:"鼕";s:2:"";s:3:"鼡";s:2:"";s:3:"鼬";s:2:"";s:3:"鼾";s:2:"";s:3:"齊";s:2:"";s:3:"齒";s:2:"";s:3:"齔";s:2:"";s:3:"齣";s:2:"";s:3:"齟";s:2:"";s:3:"齠";s:2:"";s:3:"齡";s:2:"";s:3:"齦";s:2:"";s:3:"齧";s:2:"";s:3:"齬";s:2:"";s:3:"齪";s:2:"";s:3:"齷";s:2:"";s:3:"齲";s:2:"";s:3:"齶";s:2:"";s:3:"龕";s:2:"";s:3:"龜";s:2:"";s:3:"龠";s:2:"";s:3:"堯";s:2:"";s:3:"槇";s:2:"";s:3:"遙";s:2:"";s:3:"瑤";s:2:"";s:3:"凜";s:2:"";s:3:"熙";s:2:"@";s:3:"纊";s:2:"A";s:3:"褜";s:2:"B";s:3:"鍈";s:2:"C";s:3:"銈";s:2:"D";s:3:"蓜";s:2:"E";s:3:"俉";s:2:"F";s:3:"炻";s:2:"G";s:3:"昱";s:2:"H";s:3:"棈";s:2:"I";s:3:"鋹";s:2:"J";s:3:"曻";s:2:"K";s:3:"彅";s:2:"L";s:3:"丨";s:2:"M";s:3:"仡";s:2:"N";s:3:"仼";s:2:"O";s:3:"伀";s:2:"P";s:3:"伃";s:2:"Q";s:3:"伹";s:2:"R";s:3:"佖";s:2:"S";s:3:"侒";s:2:"T";s:3:"侊";s:2:"U";s:3:"侚";s:2:"V";s:3:"侔";s:2:"W";s:3:"俍";s:2:"X";s:3:"偀";s:2:"Y";s:3:"倢";s:2:"Z";s:3:"俿";s:2:"[";s:3:"倞";s:2:"\";s:3:"偆";s:2:"]";s:3:"偰";s:2:"^";s:3:"偂";s:2:"_";s:3:"傔";s:2:"`";s:3:"僴";s:2:"a";s:3:"僘";s:2:"b";s:3:"兊";s:2:"c";s:3:"兤";s:2:"d";s:3:"冝";s:2:"e";s:3:"冾";s:2:"f";s:3:"凬";s:2:"g";s:3:"刕";s:2:"h";s:3:"劜";s:2:"i";s:3:"劦";s:2:"j";s:3:"勀";s:2:"k";s:3:"勛";s:2:"l";s:3:"匀";s:2:"m";s:3:"匇";s:2:"n";s:3:"匤";s:2:"o";s:3:"卲";s:2:"p";s:3:"厓";s:2:"q";s:3:"厲";s:2:"r";s:3:"叝";s:2:"s";s:3:"﨎";s:2:"t";s:3:"咜";s:2:"u";s:3:"咊";s:2:"v";s:3:"咩";s:2:"w";s:3:"哿";s:2:"x";s:3:"喆";s:2:"y";s:3:"坙";s:2:"z";s:3:"坥";s:2:"{";s:3:"垬";s:2:"|";s:3:"埈";s:2:"}";s:3:"埇";s:2:"~";s:3:"﨏";s:2:"";s:3:"塚";s:2:"";s:3:"增";s:2:"";s:3:"墲";s:2:"";s:3:"夋";s:2:"";s:3:"奓";s:2:"";s:3:"奛";s:2:"";s:3:"奝";s:2:"";s:3:"奣";s:2:"";s:3:"妤";s:2:"";s:3:"妺";s:2:"";s:3:"孖";s:2:"";s:3:"寀";s:2:"";s:3:"甯";s:2:"";s:3:"寘";s:2:"";s:3:"寬";s:2:"";s:3:"尞";s:2:"";s:3:"岦";s:2:"";s:3:"岺";s:2:"";s:3:"峵";s:2:"";s:3:"崧";s:2:"";s:3:"嵓";s:2:"";s:3:"﨑";s:2:"";s:3:"嵂";s:2:"";s:3:"嵭";s:2:"";s:3:"嶸";s:2:"";s:3:"嶹";s:2:"";s:3:"巐";s:2:"";s:3:"弡";s:2:"";s:3:"弴";s:2:"";s:3:"彧";s:2:"";s:3:"德";s:2:"";s:3:"忞";s:2:"";s:3:"恝";s:2:"";s:3:"悅";s:2:"";s:3:"悊";s:2:"";s:3:"惞";s:2:"";s:3:"惕";s:2:"";s:3:"愠";s:2:"";s:3:"惲";s:2:"";s:3:"愑";s:2:"";s:3:"愷";s:2:"";s:3:"愰";s:2:"";s:3:"憘";s:2:"";s:3:"戓";s:2:"";s:3:"抦";s:2:"";s:3:"揵";s:2:"";s:3:"摠";s:2:"";s:3:"撝";s:2:"";s:3:"擎";s:2:"";s:3:"敎";s:2:"";s:3:"昀";s:2:"";s:3:"昕";s:2:"";s:3:"昻";s:2:"";s:3:"昉";s:2:"";s:3:"昮";s:2:"";s:3:"昞";s:2:"";s:3:"昤";s:2:"";s:3:"晥";s:2:"";s:3:"晗";s:2:"";s:3:"晙";s:2:"";s:3:"晴";s:2:"";s:3:"晳";s:2:"";s:3:"暙";s:2:"";s:3:"暠";s:2:"";s:3:"暲";s:2:"";s:3:"暿";s:2:"";s:3:"曺";s:2:"";s:3:"朎";s:2:"";s:3:"朗";s:2:"";s:3:"杦";s:2:"";s:3:"枻";s:2:"";s:3:"桒";s:2:"";s:3:"柀";s:2:"";s:3:"栁";s:2:"";s:3:"桄";s:2:"";s:3:"棏";s:2:"";s:3:"﨓";s:2:"";s:3:"楨";s:2:"";s:3:"﨔";s:2:"";s:3:"榘";s:2:"";s:3:"槢";s:2:"";s:3:"樰";s:2:"";s:3:"橫";s:2:"";s:3:"橆";s:2:"";s:3:"橳";s:2:"";s:3:"橾";s:2:"";s:3:"櫢";s:2:"";s:3:"櫤";s:2:"";s:3:"毖";s:2:"";s:3:"氿";s:2:"";s:3:"汜";s:2:"";s:3:"沆";s:2:"";s:3:"汯";s:2:"";s:3:"泚";s:2:"";s:3:"洄";s:2:"";s:3:"涇";s:2:"";s:3:"浯";s:2:"";s:3:"涖";s:2:"";s:3:"涬";s:2:"";s:3:"淏";s:2:"";s:3:"淸";s:2:"";s:3:"淲";s:2:"";s:3:"淼";s:2:"";s:3:"渹";s:2:"";s:3:"湜";s:2:"";s:3:"渧";s:2:"";s:3:"渼";s:2:"";s:3:"溿";s:2:"";s:3:"澈";s:2:"";s:3:"澵";s:2:"";s:3:"濵";s:2:"";s:3:"瀅";s:2:"";s:3:"瀇";s:2:"";s:3:"瀨";s:2:"";s:3:"炅";s:2:"";s:3:"炫";s:2:"";s:3:"焏";s:2:"";s:3:"焄";s:2:"";s:3:"煜";s:2:"";s:3:"煆";s:2:"";s:3:"煇";s:2:"";s:3:"凞";s:2:"";s:3:"燁";s:2:"";s:3:"燾";s:2:"";s:3:"犱";s:2:"@";s:3:"犾";s:2:"A";s:3:"猤";s:2:"B";s:3:"猪";s:2:"C";s:3:"獷";s:2:"D";s:3:"玽";s:2:"E";s:3:"珉";s:2:"F";s:3:"珖";s:2:"G";s:3:"珣";s:2:"H";s:3:"珒";s:2:"I";s:3:"琇";s:2:"J";s:3:"珵";s:2:"K";s:3:"琦";s:2:"L";s:3:"琪";s:2:"M";s:3:"琩";s:2:"N";s:3:"琮";s:2:"O";s:3:"瑢";s:2:"P";s:3:"璉";s:2:"Q";s:3:"璟";s:2:"R";s:3:"甁";s:2:"S";s:3:"畯";s:2:"T";s:3:"皂";s:2:"U";s:3:"皜";s:2:"V";s:3:"皞";s:2:"W";s:3:"皛";s:2:"X";s:3:"皦";s:2:"Y";s:3:"益";s:2:"Z";s:3:"睆";s:2:"[";s:3:"劯";s:2:"\";s:3:"砡";s:2:"]";s:3:"硎";s:2:"^";s:3:"硤";s:2:"_";s:3:"硺";s:2:"`";s:3:"礰";s:2:"a";s:3:"礼";s:2:"b";s:3:"神";s:2:"c";s:3:"祥";s:2:"d";s:3:"禔";s:2:"e";s:3:"福";s:2:"f";s:3:"禛";s:2:"g";s:3:"竑";s:2:"h";s:3:"竧";s:2:"i";s:3:"靖";s:2:"j";s:3:"竫";s:2:"k";s:3:"箞";s:2:"l";s:3:"精";s:2:"m";s:3:"絈";s:2:"n";s:3:"絜";s:2:"o";s:3:"綷";s:2:"p";s:3:"綠";s:2:"q";s:3:"緖";s:2:"r";s:3:"繒";s:2:"s";s:3:"罇";s:2:"t";s:3:"羡";s:2:"u";s:3:"羽";s:2:"v";s:3:"茁";s:2:"w";s:3:"荢";s:2:"x";s:3:"荿";s:2:"y";s:3:"菇";s:2:"z";s:3:"菶";s:2:"{";s:3:"葈";s:2:"|";s:3:"蒴";s:2:"}";s:3:"蕓";s:2:"~";s:3:"蕙";s:2:"";s:3:"蕫";s:2:"";s:3:"﨟";s:2:"";s:3:"薰";s:2:"";s:3:"蘒";s:2:"";s:3:"﨡";s:2:"";s:3:"蠇";s:2:"";s:3:"裵";s:2:"";s:3:"訒";s:2:"";s:3:"訷";s:2:"";s:3:"詹";s:2:"";s:3:"誧";s:2:"";s:3:"誾";s:2:"";s:3:"諟";s:2:"";s:3:"諸";s:2:"";s:3:"諶";s:2:"";s:3:"譓";s:2:"";s:3:"譿";s:2:"";s:3:"賰";s:2:"";s:3:"賴";s:2:"";s:3:"贒";s:2:"";s:3:"赶";s:2:"";s:3:"﨣";s:2:"";s:3:"軏";s:2:"";s:3:"﨤";s:2:"";s:3:"逸";s:2:"";s:3:"遧";s:2:"";s:3:"郞";s:2:"";s:3:"都";s:2:"";s:3:"鄕";s:2:"";s:3:"鄧";s:2:"";s:3:"釚";s:2:"";s:3:"釗";s:2:"";s:3:"釞";s:2:"";s:3:"釭";s:2:"";s:3:"釮";s:2:"";s:3:"釤";s:2:"";s:3:"釥";s:2:"";s:3:"鈆";s:2:"";s:3:"鈐";s:2:"";s:3:"鈊";s:2:"";s:3:"鈺";s:2:"";s:3:"鉀";s:2:"";s:3:"鈼";s:2:"";s:3:"鉎";s:2:"";s:3:"鉙";s:2:"";s:3:"鉑";s:2:"";s:3:"鈹";s:2:"";s:3:"鉧";s:2:"";s:3:"銧";s:2:"";s:3:"鉷";s:2:"";s:3:"鉸";s:2:"";s:3:"鋧";s:2:"";s:3:"鋗";s:2:"";s:3:"鋙";s:2:"";s:3:"鋐";s:2:"";s:3:"﨧";s:2:"";s:3:"鋕";s:2:"";s:3:"鋠";s:2:"";s:3:"鋓";s:2:"";s:3:"錥";s:2:"";s:3:"錡";s:2:"";s:3:"鋻";s:2:"";s:3:"﨨";s:2:"";s:3:"錞";s:2:"";s:3:"鋿";s:2:"";s:3:"錝";s:2:"";s:3:"錂";s:2:"";s:3:"鍰";s:2:"";s:3:"鍗";s:2:"";s:3:"鎤";s:2:"";s:3:"鏆";s:2:"";s:3:"鏞";s:2:"";s:3:"鏸";s:2:"";s:3:"鐱";s:2:"";s:3:"鑅";s:2:"";s:3:"鑈";s:2:"";s:3:"閒";s:2:"";s:3:"隆";s:2:"";s:3:"﨩";s:2:"";s:3:"隝";s:2:"";s:3:"隯";s:2:"";s:3:"霳";s:2:"";s:3:"霻";s:2:"";s:3:"靃";s:2:"";s:3:"靍";s:2:"";s:3:"靏";s:2:"";s:3:"靑";s:2:"";s:3:"靕";s:2:"";s:3:"顗";s:2:"";s:3:"顥";s:2:"";s:3:"飯";s:2:"";s:3:"飼";s:2:"";s:3:"餧";s:2:"";s:3:"館";s:2:"";s:3:"馞";s:2:"";s:3:"驎";s:2:"";s:3:"髙";s:2:"";s:3:"髜";s:2:"";s:3:"魵";s:2:"";s:3:"魲";s:2:"";s:3:"鮏";s:2:"";s:3:"鮱";s:2:"";s:3:"鮻";s:2:"";s:3:"鰀";s:2:"";s:3:"鵰";s:2:"";s:3:"鵫";s:2:"";s:3:"鶴";s:2:"";s:3:"鸙";s:2:"";s:3:"黑";s:2:"";s:3:"ⅰ";s:2:"";s:3:"ⅱ";s:2:"";s:3:"ⅲ";s:2:"";s:3:"ⅳ";s:2:"";s:3:"ⅴ";s:2:"";s:3:"ⅵ";s:2:"";s:3:"ⅶ";s:2:"";s:3:"ⅷ";s:2:"";s:3:"ⅸ";s:2:"";s:3:"ⅹ";s:2:"";s:3:"￢";s:2:"";s:3:"￤";s:2:"";s:3:"＇";s:2:"";s:3:"＂";s:2:"@";s:3:"ⅰ";s:2:"A";s:3:"ⅱ";s:2:"B";s:3:"ⅲ";s:2:"C";s:3:"ⅳ";s:2:"D";s:3:"ⅴ";s:2:"E";s:3:"ⅵ";s:2:"F";s:3:"ⅶ";s:2:"G";s:3:"ⅷ";s:2:"H";s:3:"ⅸ";s:2:"I";s:3:"ⅹ";s:2:"J";s:3:"Ⅰ";s:2:"K";s:3:"Ⅱ";s:2:"L";s:3:"Ⅲ";s:2:"M";s:3:"Ⅳ";s:2:"N";s:3:"Ⅴ";s:2:"O";s:3:"Ⅵ";s:2:"P";s:3:"Ⅶ";s:2:"Q";s:3:"Ⅷ";s:2:"R";s:3:"Ⅸ";s:2:"S";s:3:"Ⅹ";s:2:"T";s:3:"￢";s:2:"U";s:3:"￤";s:2:"V";s:3:"＇";s:2:"W";s:3:"＂";s:2:"X";s:3:"㈱";s:2:"Y";s:3:"№";s:2:"Z";s:3:"℡";s:2:"[";s:3:"∵";s:2:"\";s:3:"纊";s:2:"]";s:3:"褜";s:2:"^";s:3:"鍈";s:2:"_";s:3:"銈";s:2:"`";s:3:"蓜";s:2:"a";s:3:"俉";s:2:"b";s:3:"炻";s:2:"c";s:3:"昱";s:2:"d";s:3:"棈";s:2:"e";s:3:"鋹";s:2:"f";s:3:"曻";s:2:"g";s:3:"彅";s:2:"h";s:3:"丨";s:2:"i";s:3:"仡";s:2:"j";s:3:"仼";s:2:"k";s:3:"伀";s:2:"l";s:3:"伃";s:2:"m";s:3:"伹";s:2:"n";s:3:"佖";s:2:"o";s:3:"侒";s:2:"p";s:3:"侊";s:2:"q";s:3:"侚";s:2:"r";s:3:"侔";s:2:"s";s:3:"俍";s:2:"t";s:3:"偀";s:2:"u";s:3:"倢";s:2:"v";s:3:"俿";s:2:"w";s:3:"倞";s:2:"x";s:3:"偆";s:2:"y";s:3:"偰";s:2:"z";s:3:"偂";s:2:"{";s:3:"傔";s:2:"|";s:3:"僴";s:2:"}";s:3:"僘";s:2:"~";s:3:"兊";s:2:"";s:3:"兤";s:2:"";s:3:"冝";s:2:"";s:3:"冾";s:2:"";s:3:"凬";s:2:"";s:3:"刕";s:2:"";s:3:"劜";s:2:"";s:3:"劦";s:2:"";s:3:"勀";s:2:"";s:3:"勛";s:2:"";s:3:"匀";s:2:"";s:3:"匇";s:2:"";s:3:"匤";s:2:"";s:3:"卲";s:2:"";s:3:"厓";s:2:"";s:3:"厲";s:2:"";s:3:"叝";s:2:"";s:3:"﨎";s:2:"";s:3:"咜";s:2:"";s:3:"咊";s:2:"";s:3:"咩";s:2:"";s:3:"哿";s:2:"";s:3:"喆";s:2:"";s:3:"坙";s:2:"";s:3:"坥";s:2:"";s:3:"垬";s:2:"";s:3:"埈";s:2:"";s:3:"埇";s:2:"";s:3:"﨏";s:2:"";s:3:"塚";s:2:"";s:3:"增";s:2:"";s:3:"墲";s:2:"";s:3:"夋";s:2:"";s:3:"奓";s:2:"";s:3:"奛";s:2:"";s:3:"奝";s:2:"";s:3:"奣";s:2:"";s:3:"妤";s:2:"";s:3:"妺";s:2:"";s:3:"孖";s:2:"";s:3:"寀";s:2:"";s:3:"甯";s:2:"";s:3:"寘";s:2:"";s:3:"寬";s:2:"";s:3:"尞";s:2:"";s:3:"岦";s:2:"";s:3:"岺";s:2:"";s:3:"峵";s:2:"";s:3:"崧";s:2:"";s:3:"嵓";s:2:"";s:3:"﨑";s:2:"";s:3:"嵂";s:2:"";s:3:"嵭";s:2:"";s:3:"嶸";s:2:"";s:3:"嶹";s:2:"";s:3:"巐";s:2:"";s:3:"弡";s:2:"";s:3:"弴";s:2:"";s:3:"彧";s:2:"";s:3:"德";s:2:"";s:3:"忞";s:2:"";s:3:"恝";s:2:"";s:3:"悅";s:2:"";s:3:"悊";s:2:"";s:3:"惞";s:2:"";s:3:"惕";s:2:"";s:3:"愠";s:2:"";s:3:"惲";s:2:"";s:3:"愑";s:2:"";s:3:"愷";s:2:"";s:3:"愰";s:2:"";s:3:"憘";s:2:"";s:3:"戓";s:2:"";s:3:"抦";s:2:"";s:3:"揵";s:2:"";s:3:"摠";s:2:"";s:3:"撝";s:2:"";s:3:"擎";s:2:"";s:3:"敎";s:2:"";s:3:"昀";s:2:"";s:3:"昕";s:2:"";s:3:"昻";s:2:"";s:3:"昉";s:2:"";s:3:"昮";s:2:"";s:3:"昞";s:2:"";s:3:"昤";s:2:"";s:3:"晥";s:2:"";s:3:"晗";s:2:"";s:3:"晙";s:2:"";s:3:"晴";s:2:"";s:3:"晳";s:2:"";s:3:"暙";s:2:"";s:3:"暠";s:2:"";s:3:"暲";s:2:"";s:3:"暿";s:2:"";s:3:"曺";s:2:"";s:3:"朎";s:2:"";s:3:"朗";s:2:"";s:3:"杦";s:2:"";s:3:"枻";s:2:"";s:3:"桒";s:2:"";s:3:"柀";s:2:"";s:3:"栁";s:2:"";s:3:"桄";s:2:"";s:3:"棏";s:2:"";s:3:"﨓";s:2:"";s:3:"楨";s:2:"";s:3:"﨔";s:2:"";s:3:"榘";s:2:"";s:3:"槢";s:2:"";s:3:"樰";s:2:"";s:3:"橫";s:2:"";s:3:"橆";s:2:"";s:3:"橳";s:2:"";s:3:"橾";s:2:"";s:3:"櫢";s:2:"";s:3:"櫤";s:2:"";s:3:"毖";s:2:"";s:3:"氿";s:2:"";s:3:"汜";s:2:"";s:3:"沆";s:2:"";s:3:"汯";s:2:"";s:3:"泚";s:2:"";s:3:"洄";s:2:"";s:3:"涇";s:2:"";s:3:"浯";s:2:"@";s:3:"涖";s:2:"A";s:3:"涬";s:2:"B";s:3:"淏";s:2:"C";s:3:"淸";s:2:"D";s:3:"淲";s:2:"E";s:3:"淼";s:2:"F";s:3:"渹";s:2:"G";s:3:"湜";s:2:"H";s:3:"渧";s:2:"I";s:3:"渼";s:2:"J";s:3:"溿";s:2:"K";s:3:"澈";s:2:"L";s:3:"澵";s:2:"M";s:3:"濵";s:2:"N";s:3:"瀅";s:2:"O";s:3:"瀇";s:2:"P";s:3:"瀨";s:2:"Q";s:3:"炅";s:2:"R";s:3:"炫";s:2:"S";s:3:"焏";s:2:"T";s:3:"焄";s:2:"U";s:3:"煜";s:2:"V";s:3:"煆";s:2:"W";s:3:"煇";s:2:"X";s:3:"凞";s:2:"Y";s:3:"燁";s:2:"Z";s:3:"燾";s:2:"[";s:3:"犱";s:2:"\";s:3:"犾";s:2:"]";s:3:"猤";s:2:"^";s:3:"猪";s:2:"_";s:3:"獷";s:2:"`";s:3:"玽";s:2:"a";s:3:"珉";s:2:"b";s:3:"珖";s:2:"c";s:3:"珣";s:2:"d";s:3:"珒";s:2:"e";s:3:"琇";s:2:"f";s:3:"珵";s:2:"g";s:3:"琦";s:2:"h";s:3:"琪";s:2:"i";s:3:"琩";s:2:"j";s:3:"琮";s:2:"k";s:3:"瑢";s:2:"l";s:3:"璉";s:2:"m";s:3:"璟";s:2:"n";s:3:"甁";s:2:"o";s:3:"畯";s:2:"p";s:3:"皂";s:2:"q";s:3:"皜";s:2:"r";s:3:"皞";s:2:"s";s:3:"皛";s:2:"t";s:3:"皦";s:2:"u";s:3:"益";s:2:"v";s:3:"睆";s:2:"w";s:3:"劯";s:2:"x";s:3:"砡";s:2:"y";s:3:"硎";s:2:"z";s:3:"硤";s:2:"{";s:3:"硺";s:2:"|";s:3:"礰";s:2:"}";s:3:"礼";s:2:"~";s:3:"神";s:2:"";s:3:"祥";s:2:"";s:3:"禔";s:2:"";s:3:"福";s:2:"";s:3:"禛";s:2:"";s:3:"竑";s:2:"";s:3:"竧";s:2:"";s:3:"靖";s:2:"";s:3:"竫";s:2:"";s:3:"箞";s:2:"";s:3:"精";s:2:"";s:3:"絈";s:2:"";s:3:"絜";s:2:"";s:3:"綷";s:2:"";s:3:"綠";s:2:"";s:3:"緖";s:2:"";s:3:"繒";s:2:"";s:3:"罇";s:2:"";s:3:"羡";s:2:"";s:3:"羽";s:2:"";s:3:"茁";s:2:"";s:3:"荢";s:2:"";s:3:"荿";s:2:"";s:3:"菇";s:2:"";s:3:"菶";s:2:"";s:3:"葈";s:2:"";s:3:"蒴";s:2:"";s:3:"蕓";s:2:"";s:3:"蕙";s:2:"";s:3:"蕫";s:2:"";s:3:"﨟";s:2:"";s:3:"薰";s:2:"";s:3:"蘒";s:2:"";s:3:"﨡";s:2:"";s:3:"蠇";s:2:"";s:3:"裵";s:2:"";s:3:"訒";s:2:"";s:3:"訷";s:2:"";s:3:"詹";s:2:"";s:3:"誧";s:2:"";s:3:"誾";s:2:"";s:3:"諟";s:2:"";s:3:"諸";s:2:"";s:3:"諶";s:2:"";s:3:"譓";s:2:"";s:3:"譿";s:2:"";s:3:"賰";s:2:"";s:3:"賴";s:2:"";s:3:"贒";s:2:"";s:3:"赶";s:2:"";s:3:"﨣";s:2:"";s:3:"軏";s:2:"";s:3:"﨤";s:2:"";s:3:"逸";s:2:"";s:3:"遧";s:2:"";s:3:"郞";s:2:"";s:3:"都";s:2:"";s:3:"鄕";s:2:"";s:3:"鄧";s:2:"";s:3:"釚";s:2:"";s:3:"釗";s:2:"";s:3:"釞";s:2:"";s:3:"釭";s:2:"";s:3:"釮";s:2:"";s:3:"釤";s:2:"";s:3:"釥";s:2:"";s:3:"鈆";s:2:"";s:3:"鈐";s:2:"";s:3:"鈊";s:2:"";s:3:"鈺";s:2:"";s:3:"鉀";s:2:"";s:3:"鈼";s:2:"";s:3:"鉎";s:2:"";s:3:"鉙";s:2:"";s:3:"鉑";s:2:"";s:3:"鈹";s:2:"";s:3:"鉧";s:2:"";s:3:"銧";s:2:"";s:3:"鉷";s:2:"";s:3:"鉸";s:2:"";s:3:"鋧";s:2:"";s:3:"鋗";s:2:"";s:3:"鋙";s:2:"";s:3:"鋐";s:2:"";s:3:"﨧";s:2:"";s:3:"鋕";s:2:"";s:3:"鋠";s:2:"";s:3:"鋓";s:2:"";s:3:"錥";s:2:"";s:3:"錡";s:2:"";s:3:"鋻";s:2:"";s:3:"﨨";s:2:"";s:3:"錞";s:2:"";s:3:"鋿";s:2:"";s:3:"錝";s:2:"";s:3:"錂";s:2:"";s:3:"鍰";s:2:"";s:3:"鍗";s:2:"";s:3:"鎤";s:2:"";s:3:"鏆";s:2:"";s:3:"鏞";s:2:"";s:3:"鏸";s:2:"";s:3:"鐱";s:2:"";s:3:"鑅";s:2:"";s:3:"鑈";s:2:"";s:3:"閒";s:2:"";s:3:"隆";s:2:"";s:3:"﨩";s:2:"";s:3:"隝";s:2:"";s:3:"隯";s:2:"";s:3:"霳";s:2:"";s:3:"霻";s:2:"";s:3:"靃";s:2:"";s:3:"靍";s:2:"";s:3:"靏";s:2:"";s:3:"靑";s:2:"";s:3:"靕";s:2:"";s:3:"顗";s:2:"";s:3:"顥";s:2:"";s:3:"飯";s:2:"";s:3:"飼";s:2:"";s:3:"餧";s:2:"";s:3:"館";s:2:"";s:3:"馞";s:2:"";s:3:"驎";s:2:"";s:3:"髙";s:2:"@";s:3:"髜";s:2:"A";s:3:"魵";s:2:"B";s:3:"魲";s:2:"C";s:3:"鮏";s:2:"D";s:3:"鮱";s:2:"E";s:3:"鮻";s:2:"F";s:3:"鰀";s:2:"G";s:3:"鵰";s:2:"H";s:3:"鵫";s:2:"I";s:3:"鶴";s:2:"J";s:3:"鸙";s:2:"K";s:3:"黑";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp936.ser
@@ -0,0 +1,3 @@
+a:21920:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:3:"€";s:2:"@";s:3:"丂";s:2:"A";s:3:"丄";s:2:"B";s:3:"丅";s:2:"C";s:3:"丆";s:2:"D";s:3:"丏";s:2:"E";s:3:"丒";s:2:"F";s:3:"丗";s:2:"G";s:3:"丟";s:2:"H";s:3:"丠";s:2:"I";s:3:"両";s:2:"J";s:3:"丣";s:2:"K";s:3:"並";s:2:"L";s:3:"丩";s:2:"M";s:3:"丮";s:2:"N";s:3:"丯";s:2:"O";s:3:"丱";s:2:"P";s:3:"丳";s:2:"Q";s:3:"丵";s:2:"R";s:3:"丷";s:2:"S";s:3:"丼";s:2:"T";s:3:"乀";s:2:"U";s:3:"乁";s:2:"V";s:3:"乂";s:2:"W";s:3:"乄";s:2:"X";s:3:"乆";s:2:"Y";s:3:"乊";s:2:"Z";s:3:"乑";s:2:"[";s:3:"乕";s:2:"\";s:3:"乗";s:2:"]";s:3:"乚";s:2:"^";s:3:"乛";s:2:"_";s:3:"乢";s:2:"`";s:3:"乣";s:2:"a";s:3:"乤";s:2:"b";s:3:"乥";s:2:"c";s:3:"乧";s:2:"d";s:3:"乨";s:2:"e";s:3:"乪";s:2:"f";s:3:"乫";s:2:"g";s:3:"乬";s:2:"h";s:3:"乭";s:2:"i";s:3:"乮";s:2:"j";s:3:"乯";s:2:"k";s:3:"乲";s:2:"l";s:3:"乴";s:2:"m";s:3:"乵";s:2:"n";s:3:"乶";s:2:"o";s:3:"乷";s:2:"p";s:3:"乸";s:2:"q";s:3:"乹";s:2:"r";s:3:"乺";s:2:"s";s:3:"乻";s:2:"t";s:3:"乼";s:2:"u";s:3:"乽";s:2:"v";s:3:"乿";s:2:"w";s:3:"亀";s:2:"x";s:3:"亁";s:2:"y";s:3:"亂";s:2:"z";s:3:"亃";s:2:"{";s:3:"亄";s:2:"|";s:3:"亅";s:2:"}";s:3:"亇";s:2:"~";s:3:"亊";s:2:"";s:3:"亐";s:2:"";s:3:"亖";s:2:"";s:3:"亗";s:2:"";s:3:"亙";s:2:"";s:3:"亜";s:2:"";s:3:"亝";s:2:"";s:3:"亞";s:2:"";s:3:"亣";s:2:"";s:3:"亪";s:2:"";s:3:"亯";s:2:"";s:3:"亰";s:2:"";s:3:"亱";s:2:"";s:3:"亴";s:2:"";s:3:"亶";s:2:"";s:3:"亷";s:2:"";s:3:"亸";s:2:"";s:3:"亹";s:2:"";s:3:"亼";s:2:"";s:3:"亽";s:2:"";s:3:"亾";s:2:"";s:3:"仈";s:2:"";s:3:"仌";s:2:"";s:3:"仏";s:2:"";s:3:"仐";s:2:"";s:3:"仒";s:2:"";s:3:"仚";s:2:"";s:3:"仛";s:2:"";s:3:"仜";s:2:"";s:3:"仠";s:2:"";s:3:"仢";s:2:"";s:3:"仦";s:2:"";s:3:"仧";s:2:"";s:3:"仩";s:2:"";s:3:"仭";s:2:"";s:3:"仮";s:2:"";s:3:"仯";s:2:"";s:3:"仱";s:2:"";s:3:"仴";s:2:"";s:3:"仸";s:2:"";s:3:"仹";s:2:"";s:3:"仺";s:2:"";s:3:"仼";s:2:"";s:3:"仾";s:2:"";s:3:"伀";s:2:"";s:3:"伂";s:2:"";s:3:"伃";s:2:"";s:3:"伄";s:2:"";s:3:"伅";s:2:"";s:3:"伆";s:2:"";s:3:"伇";s:2:"";s:3:"伈";s:2:"";s:3:"伋";s:2:"";s:3:"伌";s:2:"";s:3:"伒";s:2:"";s:3:"伓";s:2:"";s:3:"伔";s:2:"";s:3:"伕";s:2:"";s:3:"伖";s:2:"";s:3:"伜";s:2:"";s:3:"伝";s:2:"";s:3:"伡";s:2:"";s:3:"伣";s:2:"";s:3:"伨";s:2:"";s:3:"伩";s:2:"";s:3:"伬";s:2:"";s:3:"伭";s:2:"";s:3:"伮";s:2:"";s:3:"伱";s:2:"";s:3:"伳";s:2:"";s:3:"伵";s:2:"";s:3:"伷";s:2:"";s:3:"伹";s:2:"";s:3:"伻";s:2:"";s:3:"伾";s:2:"";s:3:"伿";s:2:"";s:3:"佀";s:2:"";s:3:"佁";s:2:"";s:3:"佂";s:2:"";s:3:"佄";s:2:"";s:3:"佅";s:2:"";s:3:"佇";s:2:"";s:3:"佈";s:2:"";s:3:"佉";s:2:"";s:3:"佊";s:2:"";s:3:"佋";s:2:"";s:3:"佌";s:2:"";s:3:"佒";s:2:"";s:3:"佔";s:2:"";s:3:"佖";s:2:"";s:3:"佡";s:2:"";s:3:"佢";s:2:"";s:3:"佦";s:2:"";s:3:"佨";s:2:"";s:3:"佪";s:2:"";s:3:"佫";s:2:"";s:3:"佭";s:2:"";s:3:"佮";s:2:"";s:3:"佱";s:2:"";s:3:"佲";s:2:"";s:3:"併";s:2:"";s:3:"佷";s:2:"";s:3:"佸";s:2:"";s:3:"佹";s:2:"";s:3:"佺";s:2:"";s:3:"佽";s:2:"";s:3:"侀";s:2:"";s:3:"侁";s:2:"";s:3:"侂";s:2:"";s:3:"侅";s:2:"";s:3:"來";s:2:"";s:3:"侇";s:2:"";s:3:"侊";s:2:"";s:3:"侌";s:2:"";s:3:"侎";s:2:"";s:3:"侐";s:2:"";s:3:"侒";s:2:"";s:3:"侓";s:2:"";s:3:"侕";s:2:"";s:3:"侖";s:2:"";s:3:"侘";s:2:"";s:3:"侙";s:2:"";s:3:"侚";s:2:"";s:3:"侜";s:2:"";s:3:"侞";s:2:"";s:3:"侟";s:2:"";s:3:"価";s:2:"";s:3:"侢";s:2:"@";s:3:"侤";s:2:"A";s:3:"侫";s:2:"B";s:3:"侭";s:2:"C";s:3:"侰";s:2:"D";s:3:"侱";s:2:"E";s:3:"侲";s:2:"F";s:3:"侳";s:2:"G";s:3:"侴";s:2:"H";s:3:"侶";s:2:"I";s:3:"侷";s:2:"J";s:3:"侸";s:2:"K";s:3:"侹";s:2:"L";s:3:"侺";s:2:"M";s:3:"侻";s:2:"N";s:3:"侼";s:2:"O";s:3:"侽";s:2:"P";s:3:"侾";s:2:"Q";s:3:"俀";s:2:"R";s:3:"俁";s:2:"S";s:3:"係";s:2:"T";s:3:"俆";s:2:"U";s:3:"俇";s:2:"V";s:3:"俈";s:2:"W";s:3:"俉";s:2:"X";s:3:"俋";s:2:"Y";s:3:"俌";s:2:"Z";s:3:"俍";s:2:"[";s:3:"俒";s:2:"\";s:3:"俓";s:2:"]";s:3:"俔";s:2:"^";s:3:"俕";s:2:"_";s:3:"俖";s:2:"`";s:3:"俙";s:2:"a";s:3:"俛";s:2:"b";s:3:"俠";s:2:"c";s:3:"俢";s:2:"d";s:3:"俤";s:2:"e";s:3:"俥";s:2:"f";s:3:"俧";s:2:"g";s:3:"俫";s:2:"h";s:3:"俬";s:2:"i";s:3:"俰";s:2:"j";s:3:"俲";s:2:"k";s:3:"俴";s:2:"l";s:3:"俵";s:2:"m";s:3:"俶";s:2:"n";s:3:"俷";s:2:"o";s:3:"俹";s:2:"p";s:3:"俻";s:2:"q";s:3:"俼";s:2:"r";s:3:"俽";s:2:"s";s:3:"俿";s:2:"t";s:3:"倀";s:2:"u";s:3:"倁";s:2:"v";s:3:"倂";s:2:"w";s:3:"倃";s:2:"x";s:3:"倄";s:2:"y";s:3:"倅";s:2:"z";s:3:"倆";s:2:"{";s:3:"倇";s:2:"|";s:3:"倈";s:2:"}";s:3:"倉";s:2:"~";s:3:"倊";s:2:"";s:3:"個";s:2:"";s:3:"倎";s:2:"";s:3:"倐";s:2:"";s:3:"們";s:2:"";s:3:"倓";s:2:"";s:3:"倕";s:2:"";s:3:"倖";s:2:"";s:3:"倗";s:2:"";s:3:"倛";s:2:"";s:3:"倝";s:2:"";s:3:"倞";s:2:"";s:3:"倠";s:2:"";s:3:"倢";s:2:"";s:3:"倣";s:2:"";s:3:"値";s:2:"";s:3:"倧";s:2:"";s:3:"倫";s:2:"";s:3:"倯";s:2:"";s:3:"倰";s:2:"";s:3:"倱";s:2:"";s:3:"倲";s:2:"";s:3:"倳";s:2:"";s:3:"倴";s:2:"";s:3:"倵";s:2:"";s:3:"倶";s:2:"";s:3:"倷";s:2:"";s:3:"倸";s:2:"";s:3:"倹";s:2:"";s:3:"倻";s:2:"";s:3:"倽";s:2:"";s:3:"倿";s:2:"";s:3:"偀";s:2:"";s:3:"偁";s:2:"";s:3:"偂";s:2:"";s:3:"偄";s:2:"";s:3:"偅";s:2:"";s:3:"偆";s:2:"";s:3:"偉";s:2:"";s:3:"偊";s:2:"";s:3:"偋";s:2:"";s:3:"偍";s:2:"";s:3:"偐";s:2:"";s:3:"偑";s:2:"";s:3:"偒";s:2:"";s:3:"偓";s:2:"";s:3:"偔";s:2:"";s:3:"偖";s:2:"";s:3:"偗";s:2:"";s:3:"偘";s:2:"";s:3:"偙";s:2:"";s:3:"偛";s:2:"";s:3:"偝";s:2:"";s:3:"偞";s:2:"";s:3:"偟";s:2:"";s:3:"偠";s:2:"";s:3:"偡";s:2:"";s:3:"偢";s:2:"";s:3:"偣";s:2:"";s:3:"偤";s:2:"";s:3:"偦";s:2:"";s:3:"偧";s:2:"";s:3:"偨";s:2:"";s:3:"偩";s:2:"";s:3:"偪";s:2:"";s:3:"偫";s:2:"";s:3:"偭";s:2:"";s:3:"偮";s:2:"";s:3:"偯";s:2:"";s:3:"偰";s:2:"";s:3:"偱";s:2:"";s:3:"偲";s:2:"";s:3:"偳";s:2:"";s:3:"側";s:2:"";s:3:"偵";s:2:"";s:3:"偸";s:2:"";s:3:"偹";s:2:"";s:3:"偺";s:2:"";s:3:"偼";s:2:"";s:3:"偽";s:2:"";s:3:"傁";s:2:"";s:3:"傂";s:2:"";s:3:"傃";s:2:"";s:3:"傄";s:2:"";s:3:"傆";s:2:"";s:3:"傇";s:2:"";s:3:"傉";s:2:"";s:3:"傊";s:2:"";s:3:"傋";s:2:"";s:3:"傌";s:2:"";s:3:"傎";s:2:"";s:3:"傏";s:2:"";s:3:"傐";s:2:"";s:3:"傑";s:2:"";s:3:"傒";s:2:"";s:3:"傓";s:2:"";s:3:"傔";s:2:"";s:3:"傕";s:2:"";s:3:"傖";s:2:"";s:3:"傗";s:2:"";s:3:"傘";s:2:"";s:3:"備";s:2:"";s:3:"傚";s:2:"";s:3:"傛";s:2:"";s:3:"傜";s:2:"";s:3:"傝";s:2:"";s:3:"傞";s:2:"";s:3:"傟";s:2:"";s:3:"傠";s:2:"";s:3:"傡";s:2:"";s:3:"傢";s:2:"";s:3:"傤";s:2:"";s:3:"傦";s:2:"";s:3:"傪";s:2:"";s:3:"傫";s:2:"";s:3:"傭";s:2:"";s:3:"傮";s:2:"";s:3:"傯";s:2:"";s:3:"傰";s:2:"";s:3:"傱";s:2:"";s:3:"傳";s:2:"";s:3:"傴";s:2:"";s:3:"債";s:2:"";s:3:"傶";s:2:"";s:3:"傷";s:2:"";s:3:"傸";s:2:"";s:3:"傹";s:2:"";s:3:"傼";s:2:"@";s:3:"傽";s:2:"A";s:3:"傾";s:2:"B";s:3:"傿";s:2:"C";s:3:"僀";s:2:"D";s:3:"僁";s:2:"E";s:3:"僂";s:2:"F";s:3:"僃";s:2:"G";s:3:"僄";s:2:"H";s:3:"僅";s:2:"I";s:3:"僆";s:2:"J";s:3:"僇";s:2:"K";s:3:"僈";s:2:"L";s:3:"僉";s:2:"M";s:3:"僊";s:2:"N";s:3:"僋";s:2:"O";s:3:"僌";s:2:"P";s:3:"働";s:2:"Q";s:3:"僎";s:2:"R";s:3:"僐";s:2:"S";s:3:"僑";s:2:"T";s:3:"僒";s:2:"U";s:3:"僓";s:2:"V";s:3:"僔";s:2:"W";s:3:"僕";s:2:"X";s:3:"僗";s:2:"Y";s:3:"僘";s:2:"Z";s:3:"僙";s:2:"[";s:3:"僛";s:2:"\";s:3:"僜";s:2:"]";s:3:"僝";s:2:"^";s:3:"僞";s:2:"_";s:3:"僟";s:2:"`";s:3:"僠";s:2:"a";s:3:"僡";s:2:"b";s:3:"僢";s:2:"c";s:3:"僣";s:2:"d";s:3:"僤";s:2:"e";s:3:"僥";s:2:"f";s:3:"僨";s:2:"g";s:3:"僩";s:2:"h";s:3:"僪";s:2:"i";s:3:"僫";s:2:"j";s:3:"僯";s:2:"k";s:3:"僰";s:2:"l";s:3:"僱";s:2:"m";s:3:"僲";s:2:"n";s:3:"僴";s:2:"o";s:3:"僶";s:2:"p";s:3:"僷";s:2:"q";s:3:"僸";s:2:"r";s:3:"價";s:2:"s";s:3:"僺";s:2:"t";s:3:"僼";s:2:"u";s:3:"僽";s:2:"v";s:3:"僾";s:2:"w";s:3:"僿";s:2:"x";s:3:"儀";s:2:"y";s:3:"儁";s:2:"z";s:3:"儂";s:2:"{";s:3:"儃";s:2:"|";s:3:"億";s:2:"}";s:3:"儅";s:2:"~";s:3:"儈";s:2:"";s:3:"儉";s:2:"";s:3:"儊";s:2:"";s:3:"儌";s:2:"";s:3:"儍";s:2:"";s:3:"儎";s:2:"";s:3:"儏";s:2:"";s:3:"儐";s:2:"";s:3:"儑";s:2:"";s:3:"儓";s:2:"";s:3:"儔";s:2:"";s:3:"儕";s:2:"";s:3:"儖";s:2:"";s:3:"儗";s:2:"";s:3:"儘";s:2:"";s:3:"儙";s:2:"";s:3:"儚";s:2:"";s:3:"儛";s:2:"";s:3:"儜";s:2:"";s:3:"儝";s:2:"";s:3:"儞";s:2:"";s:3:"償";s:2:"";s:3:"儠";s:2:"";s:3:"儢";s:2:"";s:3:"儣";s:2:"";s:3:"儤";s:2:"";s:3:"儥";s:2:"";s:3:"儦";s:2:"";s:3:"儧";s:2:"";s:3:"儨";s:2:"";s:3:"儩";s:2:"";s:3:"優";s:2:"";s:3:"儫";s:2:"";s:3:"儬";s:2:"";s:3:"儭";s:2:"";s:3:"儮";s:2:"";s:3:"儯";s:2:"";s:3:"儰";s:2:"";s:3:"儱";s:2:"";s:3:"儲";s:2:"";s:3:"儳";s:2:"";s:3:"儴";s:2:"";s:3:"儵";s:2:"";s:3:"儶";s:2:"";s:3:"儷";s:2:"";s:3:"儸";s:2:"";s:3:"儹";s:2:"";s:3:"儺";s:2:"";s:3:"儻";s:2:"";s:3:"儼";s:2:"";s:3:"儽";s:2:"";s:3:"儾";s:2:"";s:3:"兂";s:2:"";s:3:"兇";s:2:"";s:3:"兊";s:2:"";s:3:"兌";s:2:"";s:3:"兎";s:2:"";s:3:"兏";s:2:"";s:3:"児";s:2:"";s:3:"兒";s:2:"";s:3:"兓";s:2:"";s:3:"兗";s:2:"";s:3:"兘";s:2:"";s:3:"兙";s:2:"";s:3:"兛";s:2:"";s:3:"兝";s:2:"";s:3:"兞";s:2:"";s:3:"兟";s:2:"";s:3:"兠";s:2:"";s:3:"兡";s:2:"";s:3:"兣";s:2:"";s:3:"兤";s:2:"";s:3:"兦";s:2:"";s:3:"內";s:2:"";s:3:"兩";s:2:"";s:3:"兪";s:2:"";s:3:"兯";s:2:"";s:3:"兲";s:2:"";s:3:"兺";s:2:"";s:3:"兾";s:2:"";s:3:"兿";s:2:"";s:3:"冃";s:2:"";s:3:"冄";s:2:"";s:3:"円";s:2:"";s:3:"冇";s:2:"";s:3:"冊";s:2:"";s:3:"冋";s:2:"";s:3:"冎";s:2:"";s:3:"冏";s:2:"";s:3:"冐";s:2:"";s:3:"冑";s:2:"";s:3:"冓";s:2:"";s:3:"冔";s:2:"";s:3:"冘";s:2:"";s:3:"冚";s:2:"";s:3:"冝";s:2:"";s:3:"冞";s:2:"";s:3:"冟";s:2:"";s:3:"冡";s:2:"";s:3:"冣";s:2:"";s:3:"冦";s:2:"";s:3:"冧";s:2:"";s:3:"冨";s:2:"";s:3:"冩";s:2:"";s:3:"冪";s:2:"";s:3:"冭";s:2:"";s:3:"冮";s:2:"";s:3:"冴";s:2:"";s:3:"冸";s:2:"";s:3:"冹";s:2:"";s:3:"冺";s:2:"";s:3:"冾";s:2:"";s:3:"冿";s:2:"";s:3:"凁";s:2:"";s:3:"凂";s:2:"";s:3:"凃";s:2:"";s:3:"凅";s:2:"";s:3:"凈";s:2:"";s:3:"凊";s:2:"";s:3:"凍";s:2:"";s:3:"凎";s:2:"";s:3:"凐";s:2:"";s:3:"凒";s:2:"";s:3:"凓";s:2:"";s:3:"凔";s:2:"";s:3:"凕";s:2:"";s:3:"凖";s:2:"";s:3:"凗";s:2:"@";s:3:"凘";s:2:"A";s:3:"凙";s:2:"B";s:3:"凚";s:2:"C";s:3:"凜";s:2:"D";s:3:"凞";s:2:"E";s:3:"凟";s:2:"F";s:3:"凢";s:2:"G";s:3:"凣";s:2:"H";s:3:"凥";s:2:"I";s:3:"処";s:2:"J";s:3:"凧";s:2:"K";s:3:"凨";s:2:"L";s:3:"凩";s:2:"M";s:3:"凪";s:2:"N";s:3:"凬";s:2:"O";s:3:"凮";s:2:"P";s:3:"凱";s:2:"Q";s:3:"凲";s:2:"R";s:3:"凴";s:2:"S";s:3:"凷";s:2:"T";s:3:"凾";s:2:"U";s:3:"刄";s:2:"V";s:3:"刅";s:2:"W";s:3:"刉";s:2:"X";s:3:"刋";s:2:"Y";s:3:"刌";s:2:"Z";s:3:"刏";s:2:"[";s:3:"刐";s:2:"\";s:3:"刓";s:2:"]";s:3:"刔";s:2:"^";s:3:"刕";s:2:"_";s:3:"刜";s:2:"`";s:3:"刞";s:2:"a";s:3:"刟";s:2:"b";s:3:"刡";s:2:"c";s:3:"刢";s:2:"d";s:3:"刣";s:2:"e";s:3:"別";s:2:"f";s:3:"刦";s:2:"g";s:3:"刧";s:2:"h";s:3:"刪";s:2:"i";s:3:"刬";s:2:"j";s:3:"刯";s:2:"k";s:3:"刱";s:2:"l";s:3:"刲";s:2:"m";s:3:"刴";s:2:"n";s:3:"刵";s:2:"o";s:3:"刼";s:2:"p";s:3:"刾";s:2:"q";s:3:"剄";s:2:"r";s:3:"剅";s:2:"s";s:3:"剆";s:2:"t";s:3:"則";s:2:"u";s:3:"剈";s:2:"v";s:3:"剉";s:2:"w";s:3:"剋";s:2:"x";s:3:"剎";s:2:"y";s:3:"剏";s:2:"z";s:3:"剒";s:2:"{";s:3:"剓";s:2:"|";s:3:"剕";s:2:"}";s:3:"剗";s:2:"~";s:3:"剘";s:2:"";s:3:"剙";s:2:"";s:3:"剚";s:2:"";s:3:"剛";s:2:"";s:3:"剝";s:2:"";s:3:"剟";s:2:"";s:3:"剠";s:2:"";s:3:"剢";s:2:"";s:3:"剣";s:2:"";s:3:"剤";s:2:"";s:3:"剦";s:2:"";s:3:"剨";s:2:"";s:3:"剫";s:2:"";s:3:"剬";s:2:"";s:3:"剭";s:2:"";s:3:"剮";s:2:"";s:3:"剰";s:2:"";s:3:"剱";s:2:"";s:3:"剳";s:2:"";s:3:"剴";s:2:"";s:3:"創";s:2:"";s:3:"剶";s:2:"";s:3:"剷";s:2:"";s:3:"剸";s:2:"";s:3:"剹";s:2:"";s:3:"剺";s:2:"";s:3:"剻";s:2:"";s:3:"剼";s:2:"";s:3:"剾";s:2:"";s:3:"劀";s:2:"";s:3:"劃";s:2:"";s:3:"劄";s:2:"";s:3:"劅";s:2:"";s:3:"劆";s:2:"";s:3:"劇";s:2:"";s:3:"劉";s:2:"";s:3:"劊";s:2:"";s:3:"劋";s:2:"";s:3:"劌";s:2:"";s:3:"劍";s:2:"";s:3:"劎";s:2:"";s:3:"劏";s:2:"";s:3:"劑";s:2:"";s:3:"劒";s:2:"";s:3:"劔";s:2:"";s:3:"劕";s:2:"";s:3:"劖";s:2:"";s:3:"劗";s:2:"";s:3:"劘";s:2:"";s:3:"劙";s:2:"";s:3:"劚";s:2:"";s:3:"劜";s:2:"";s:3:"劤";s:2:"";s:3:"劥";s:2:"";s:3:"劦";s:2:"";s:3:"劧";s:2:"";s:3:"劮";s:2:"";s:3:"劯";s:2:"";s:3:"劰";s:2:"";s:3:"労";s:2:"";s:3:"劵";s:2:"";s:3:"劶";s:2:"";s:3:"劷";s:2:"";s:3:"劸";s:2:"";s:3:"効";s:2:"";s:3:"劺";s:2:"";s:3:"劻";s:2:"";s:3:"劼";s:2:"";s:3:"劽";s:2:"";s:3:"勀";s:2:"";s:3:"勁";s:2:"";s:3:"勂";s:2:"";s:3:"勄";s:2:"";s:3:"勅";s:2:"";s:3:"勆";s:2:"";s:3:"勈";s:2:"";s:3:"勊";s:2:"";s:3:"勌";s:2:"";s:3:"勍";s:2:"";s:3:"勎";s:2:"";s:3:"勏";s:2:"";s:3:"勑";s:2:"";s:3:"勓";s:2:"";s:3:"勔";s:2:"";s:3:"動";s:2:"";s:3:"勗";s:2:"";s:3:"務";s:2:"";s:3:"勚";s:2:"";s:3:"勛";s:2:"";s:3:"勜";s:2:"";s:3:"勝";s:2:"";s:3:"勞";s:2:"";s:3:"勠";s:2:"";s:3:"勡";s:2:"";s:3:"勢";s:2:"";s:3:"勣";s:2:"";s:3:"勥";s:2:"";s:3:"勦";s:2:"";s:3:"勧";s:2:"";s:3:"勨";s:2:"";s:3:"勩";s:2:"";s:3:"勪";s:2:"";s:3:"勫";s:2:"";s:3:"勬";s:2:"";s:3:"勭";s:2:"";s:3:"勮";s:2:"";s:3:"勯";s:2:"";s:3:"勱";s:2:"";s:3:"勲";s:2:"";s:3:"勳";s:2:"";s:3:"勴";s:2:"";s:3:"勵";s:2:"";s:3:"勶";s:2:"";s:3:"勷";s:2:"";s:3:"勸";s:2:"";s:3:"勻";s:2:"";s:3:"勼";s:2:"";s:3:"勽";s:2:"";s:3:"匁";s:2:"";s:3:"匂";s:2:"";s:3:"匃";s:2:"";s:3:"匄";s:2:"";s:3:"匇";s:2:"";s:3:"匉";s:2:"";s:3:"匊";s:2:"";s:3:"匋";s:2:"";s:3:"匌";s:2:"";s:3:"匎";s:2:"@";s:3:"匑";s:2:"A";s:3:"匒";s:2:"B";s:3:"匓";s:2:"C";s:3:"匔";s:2:"D";s:3:"匘";s:2:"E";s:3:"匛";s:2:"F";s:3:"匜";s:2:"G";s:3:"匞";s:2:"H";s:3:"匟";s:2:"I";s:3:"匢";s:2:"J";s:3:"匤";s:2:"K";s:3:"匥";s:2:"L";s:3:"匧";s:2:"M";s:3:"匨";s:2:"N";s:3:"匩";s:2:"O";s:3:"匫";s:2:"P";s:3:"匬";s:2:"Q";s:3:"匭";s:2:"R";s:3:"匯";s:2:"S";s:3:"匰";s:2:"T";s:3:"匱";s:2:"U";s:3:"匲";s:2:"V";s:3:"匳";s:2:"W";s:3:"匴";s:2:"X";s:3:"匵";s:2:"Y";s:3:"匶";s:2:"Z";s:3:"匷";s:2:"[";s:3:"匸";s:2:"\";s:3:"匼";s:2:"]";s:3:"匽";s:2:"^";s:3:"區";s:2:"_";s:3:"卂";s:2:"`";s:3:"卄";s:2:"a";s:3:"卆";s:2:"b";s:3:"卋";s:2:"c";s:3:"卌";s:2:"d";s:3:"卍";s:2:"e";s:3:"卐";s:2:"f";s:3:"協";s:2:"g";s:3:"単";s:2:"h";s:3:"卙";s:2:"i";s:3:"卛";s:2:"j";s:3:"卝";s:2:"k";s:3:"卥";s:2:"l";s:3:"卨";s:2:"m";s:3:"卪";s:2:"n";s:3:"卬";s:2:"o";s:3:"卭";s:2:"p";s:3:"卲";s:2:"q";s:3:"卶";s:2:"r";s:3:"卹";s:2:"s";s:3:"卻";s:2:"t";s:3:"卼";s:2:"u";s:3:"卽";s:2:"v";s:3:"卾";s:2:"w";s:3:"厀";s:2:"x";s:3:"厁";s:2:"y";s:3:"厃";s:2:"z";s:3:"厇";s:2:"{";s:3:"厈";s:2:"|";s:3:"厊";s:2:"}";s:3:"厎";s:2:"~";s:3:"厏";s:2:"";s:3:"厐";s:2:"";s:3:"厑";s:2:"";s:3:"厒";s:2:"";s:3:"厓";s:2:"";s:3:"厔";s:2:"";s:3:"厖";s:2:"";s:3:"厗";s:2:"";s:3:"厙";s:2:"";s:3:"厛";s:2:"";s:3:"厜";s:2:"";s:3:"厞";s:2:"";s:3:"厠";s:2:"";s:3:"厡";s:2:"";s:3:"厤";s:2:"";s:3:"厧";s:2:"";s:3:"厪";s:2:"";s:3:"厫";s:2:"";s:3:"厬";s:2:"";s:3:"厭";s:2:"";s:3:"厯";s:2:"";s:3:"厰";s:2:"";s:3:"厱";s:2:"";s:3:"厲";s:2:"";s:3:"厳";s:2:"";s:3:"厴";s:2:"";s:3:"厵";s:2:"";s:3:"厷";s:2:"";s:3:"厸";s:2:"";s:3:"厹";s:2:"";s:3:"厺";s:2:"";s:3:"厼";s:2:"";s:3:"厽";s:2:"";s:3:"厾";s:2:"";s:3:"叀";s:2:"";s:3:"參";s:2:"";s:3:"叄";s:2:"";s:3:"叅";s:2:"";s:3:"叆";s:2:"";s:3:"叇";s:2:"";s:3:"収";s:2:"";s:3:"叏";s:2:"";s:3:"叐";s:2:"";s:3:"叒";s:2:"";s:3:"叓";s:2:"";s:3:"叕";s:2:"";s:3:"叚";s:2:"";s:3:"叜";s:2:"";s:3:"叝";s:2:"";s:3:"叞";s:2:"";s:3:"叡";s:2:"";s:3:"叢";s:2:"";s:3:"叧";s:2:"";s:3:"叴";s:2:"";s:3:"叺";s:2:"";s:3:"叾";s:2:"";s:3:"叿";s:2:"";s:3:"吀";s:2:"";s:3:"吂";s:2:"";s:3:"吅";s:2:"";s:3:"吇";s:2:"";s:3:"吋";s:2:"";s:3:"吔";s:2:"";s:3:"吘";s:2:"";s:3:"吙";s:2:"";s:3:"吚";s:2:"";s:3:"吜";s:2:"";s:3:"吢";s:2:"";s:3:"吤";s:2:"";s:3:"吥";s:2:"";s:3:"吪";s:2:"";s:3:"吰";s:2:"";s:3:"吳";s:2:"";s:3:"吶";s:2:"";s:3:"吷";s:2:"";s:3:"吺";s:2:"";s:3:"吽";s:2:"";s:3:"吿";s:2:"";s:3:"呁";s:2:"";s:3:"呂";s:2:"";s:3:"呄";s:2:"";s:3:"呅";s:2:"";s:3:"呇";s:2:"";s:3:"呉";s:2:"";s:3:"呌";s:2:"";s:3:"呍";s:2:"";s:3:"呎";s:2:"";s:3:"呏";s:2:"";s:3:"呑";s:2:"";s:3:"呚";s:2:"";s:3:"呝";s:2:"";s:3:"呞";s:2:"";s:3:"呟";s:2:"";s:3:"呠";s:2:"";s:3:"呡";s:2:"";s:3:"呣";s:2:"";s:3:"呥";s:2:"";s:3:"呧";s:2:"";s:3:"呩";s:2:"";s:3:"呪";s:2:"";s:3:"呫";s:2:"";s:3:"呬";s:2:"";s:3:"呭";s:2:"";s:3:"呮";s:2:"";s:3:"呯";s:2:"";s:3:"呰";s:2:"";s:3:"呴";s:2:"";s:3:"呹";s:2:"";s:3:"呺";s:2:"";s:3:"呾";s:2:"";s:3:"呿";s:2:"";s:3:"咁";s:2:"";s:3:"咃";s:2:"";s:3:"咅";s:2:"";s:3:"咇";s:2:"";s:3:"咈";s:2:"";s:3:"咉";s:2:"";s:3:"咊";s:2:"";s:3:"咍";s:2:"";s:3:"咑";s:2:"";s:3:"咓";s:2:"";s:3:"咗";s:2:"";s:3:"咘";s:2:"";s:3:"咜";s:2:"";s:3:"咞";s:2:"";s:3:"咟";s:2:"";s:3:"咠";s:2:"";s:3:"咡";s:2:"@";s:3:"咢";s:2:"A";s:3:"咥";s:2:"B";s:3:"咮";s:2:"C";s:3:"咰";s:2:"D";s:3:"咲";s:2:"E";s:3:"咵";s:2:"F";s:3:"咶";s:2:"G";s:3:"咷";s:2:"H";s:3:"咹";s:2:"I";s:3:"咺";s:2:"J";s:3:"咼";s:2:"K";s:3:"咾";s:2:"L";s:3:"哃";s:2:"M";s:3:"哅";s:2:"N";s:3:"哊";s:2:"O";s:3:"哋";s:2:"P";s:3:"哖";s:2:"Q";s:3:"哘";s:2:"R";s:3:"哛";s:2:"S";s:3:"哠";s:2:"T";s:3:"員";s:2:"U";s:3:"哢";s:2:"V";s:3:"哣";s:2:"W";s:3:"哤";s:2:"X";s:3:"哫";s:2:"Y";s:3:"哬";s:2:"Z";s:3:"哯";s:2:"[";s:3:"哰";s:2:"\";s:3:"哱";s:2:"]";s:3:"哴";s:2:"^";s:3:"哵";s:2:"_";s:3:"哶";s:2:"`";s:3:"哷";s:2:"a";s:3:"哸";s:2:"b";s:3:"哹";s:2:"c";s:3:"哻";s:2:"d";s:3:"哾";s:2:"e";s:3:"唀";s:2:"f";s:3:"唂";s:2:"g";s:3:"唃";s:2:"h";s:3:"唄";s:2:"i";s:3:"唅";s:2:"j";s:3:"唈";s:2:"k";s:3:"唊";s:2:"l";s:3:"唋";s:2:"m";s:3:"唌";s:2:"n";s:3:"唍";s:2:"o";s:3:"唎";s:2:"p";s:3:"唒";s:2:"q";s:3:"唓";s:2:"r";s:3:"唕";s:2:"s";s:3:"唖";s:2:"t";s:3:"唗";s:2:"u";s:3:"唘";s:2:"v";s:3:"唙";s:2:"w";s:3:"唚";s:2:"x";s:3:"唜";s:2:"y";s:3:"唝";s:2:"z";s:3:"唞";s:2:"{";s:3:"唟";s:2:"|";s:3:"唡";s:2:"}";s:3:"唥";s:2:"~";s:3:"唦";s:2:"";s:3:"唨";s:2:"";s:3:"唩";s:2:"";s:3:"唫";s:2:"";s:3:"唭";s:2:"";s:3:"唲";s:2:"";s:3:"唴";s:2:"";s:3:"唵";s:2:"";s:3:"唶";s:2:"";s:3:"唸";s:2:"";s:3:"唹";s:2:"";s:3:"唺";s:2:"";s:3:"唻";s:2:"";s:3:"唽";s:2:"";s:3:"啀";s:2:"";s:3:"啂";s:2:"";s:3:"啅";s:2:"";s:3:"啇";s:2:"";s:3:"啈";s:2:"";s:3:"啋";s:2:"";s:3:"啌";s:2:"";s:3:"啍";s:2:"";s:3:"啎";s:2:"";s:3:"問";s:2:"";s:3:"啑";s:2:"";s:3:"啒";s:2:"";s:3:"啓";s:2:"";s:3:"啔";s:2:"";s:3:"啗";s:2:"";s:3:"啘";s:2:"";s:3:"啙";s:2:"";s:3:"啚";s:2:"";s:3:"啛";s:2:"";s:3:"啝";s:2:"";s:3:"啞";s:2:"";s:3:"啟";s:2:"";s:3:"啠";s:2:"";s:3:"啢";s:2:"";s:3:"啣";s:2:"";s:3:"啨";s:2:"";s:3:"啩";s:2:"";s:3:"啫";s:2:"";s:3:"啯";s:2:"";s:3:"啰";s:2:"";s:3:"啱";s:2:"";s:3:"啲";s:2:"";s:3:"啳";s:2:"";s:3:"啴";s:2:"";s:3:"啹";s:2:"";s:3:"啺";s:2:"";s:3:"啽";s:2:"";s:3:"啿";s:2:"";s:3:"喅";s:2:"";s:3:"喆";s:2:"";s:3:"喌";s:2:"";s:3:"喍";s:2:"";s:3:"喎";s:2:"";s:3:"喐";s:2:"";s:3:"喒";s:2:"";s:3:"喓";s:2:"";s:3:"喕";s:2:"";s:3:"喖";s:2:"";s:3:"喗";s:2:"";s:3:"喚";s:2:"";s:3:"喛";s:2:"";s:3:"喞";s:2:"";s:3:"喠";s:2:"";s:3:"喡";s:2:"";s:3:"喢";s:2:"";s:3:"喣";s:2:"";s:3:"喤";s:2:"";s:3:"喥";s:2:"";s:3:"喦";s:2:"";s:3:"喨";s:2:"";s:3:"喩";s:2:"";s:3:"喪";s:2:"";s:3:"喫";s:2:"";s:3:"喬";s:2:"";s:3:"喭";s:2:"";s:3:"單";s:2:"";s:3:"喯";s:2:"";s:3:"喰";s:2:"";s:3:"喲";s:2:"";s:3:"喴";s:2:"";s:3:"営";s:2:"";s:3:"喸";s:2:"";s:3:"喺";s:2:"";s:3:"喼";s:2:"";s:3:"喿";s:2:"";s:3:"嗀";s:2:"";s:3:"嗁";s:2:"";s:3:"嗂";s:2:"";s:3:"嗃";s:2:"";s:3:"嗆";s:2:"";s:3:"嗇";s:2:"";s:3:"嗈";s:2:"";s:3:"嗊";s:2:"";s:3:"嗋";s:2:"";s:3:"嗎";s:2:"";s:3:"嗏";s:2:"";s:3:"嗐";s:2:"";s:3:"嗕";s:2:"";s:3:"嗗";s:2:"";s:3:"嗘";s:2:"";s:3:"嗙";s:2:"";s:3:"嗚";s:2:"";s:3:"嗛";s:2:"";s:3:"嗞";s:2:"";s:3:"嗠";s:2:"";s:3:"嗢";s:2:"";s:3:"嗧";s:2:"";s:3:"嗩";s:2:"";s:3:"嗭";s:2:"";s:3:"嗮";s:2:"";s:3:"嗰";s:2:"";s:3:"嗱";s:2:"";s:3:"嗴";s:2:"";s:3:"嗶";s:2:"";s:3:"嗸";s:2:"";s:3:"嗹";s:2:"";s:3:"嗺";s:2:"";s:3:"嗻";s:2:"";s:3:"嗼";s:2:"";s:3:"嗿";s:2:"";s:3:"嘂";s:2:"";s:3:"嘃";s:2:"";s:3:"嘄";s:2:"";s:3:"嘅";s:2:"@";s:3:"嘆";s:2:"A";s:3:"嘇";s:2:"B";s:3:"嘊";s:2:"C";s:3:"嘋";s:2:"D";s:3:"嘍";s:2:"E";s:3:"嘐";s:2:"F";s:3:"嘑";s:2:"G";s:3:"嘒";s:2:"H";s:3:"嘓";s:2:"I";s:3:"嘔";s:2:"J";s:3:"嘕";s:2:"K";s:3:"嘖";s:2:"L";s:3:"嘗";s:2:"M";s:3:"嘙";s:2:"N";s:3:"嘚";s:2:"O";s:3:"嘜";s:2:"P";s:3:"嘝";s:2:"Q";s:3:"嘠";s:2:"R";s:3:"嘡";s:2:"S";s:3:"嘢";s:2:"T";s:3:"嘥";s:2:"U";s:3:"嘦";s:2:"V";s:3:"嘨";s:2:"W";s:3:"嘩";s:2:"X";s:3:"嘪";s:2:"Y";s:3:"嘫";s:2:"Z";s:3:"嘮";s:2:"[";s:3:"嘯";s:2:"\";s:3:"嘰";s:2:"]";s:3:"嘳";s:2:"^";s:3:"嘵";s:2:"_";s:3:"嘷";s:2:"`";s:3:"嘸";s:2:"a";s:3:"嘺";s:2:"b";s:3:"嘼";s:2:"c";s:3:"嘽";s:2:"d";s:3:"嘾";s:2:"e";s:3:"噀";s:2:"f";s:3:"噁";s:2:"g";s:3:"噂";s:2:"h";s:3:"噃";s:2:"i";s:3:"噄";s:2:"j";s:3:"噅";s:2:"k";s:3:"噆";s:2:"l";s:3:"噇";s:2:"m";s:3:"噈";s:2:"n";s:3:"噉";s:2:"o";s:3:"噊";s:2:"p";s:3:"噋";s:2:"q";s:3:"噏";s:2:"r";s:3:"噐";s:2:"s";s:3:"噑";s:2:"t";s:3:"噒";s:2:"u";s:3:"噓";s:2:"v";s:3:"噕";s:2:"w";s:3:"噖";s:2:"x";s:3:"噚";s:2:"y";s:3:"噛";s:2:"z";s:3:"噝";s:2:"{";s:3:"噞";s:2:"|";s:3:"噟";s:2:"}";s:3:"噠";s:2:"~";s:3:"噡";s:2:"";s:3:"噣";s:2:"";s:3:"噥";s:2:"";s:3:"噦";s:2:"";s:3:"噧";s:2:"";s:3:"噭";s:2:"";s:3:"噮";s:2:"";s:3:"噯";s:2:"";s:3:"噰";s:2:"";s:3:"噲";s:2:"";s:3:"噳";s:2:"";s:3:"噴";s:2:"";s:3:"噵";s:2:"";s:3:"噷";s:2:"";s:3:"噸";s:2:"";s:3:"噹";s:2:"";s:3:"噺";s:2:"";s:3:"噽";s:2:"";s:3:"噾";s:2:"";s:3:"噿";s:2:"";s:3:"嚀";s:2:"";s:3:"嚁";s:2:"";s:3:"嚂";s:2:"";s:3:"嚃";s:2:"";s:3:"嚄";s:2:"";s:3:"嚇";s:2:"";s:3:"嚈";s:2:"";s:3:"嚉";s:2:"";s:3:"嚊";s:2:"";s:3:"嚋";s:2:"";s:3:"嚌";s:2:"";s:3:"嚍";s:2:"";s:3:"嚐";s:2:"";s:3:"嚑";s:2:"";s:3:"嚒";s:2:"";s:3:"嚔";s:2:"";s:3:"嚕";s:2:"";s:3:"嚖";s:2:"";s:3:"嚗";s:2:"";s:3:"嚘";s:2:"";s:3:"嚙";s:2:"";s:3:"嚚";s:2:"";s:3:"嚛";s:2:"";s:3:"嚜";s:2:"";s:3:"嚝";s:2:"";s:3:"嚞";s:2:"";s:3:"嚟";s:2:"";s:3:"嚠";s:2:"";s:3:"嚡";s:2:"";s:3:"嚢";s:2:"";s:3:"嚤";s:2:"";s:3:"嚥";s:2:"";s:3:"嚦";s:2:"";s:3:"嚧";s:2:"";s:3:"嚨";s:2:"";s:3:"嚩";s:2:"";s:3:"嚪";s:2:"";s:3:"嚫";s:2:"";s:3:"嚬";s:2:"";s:3:"嚭";s:2:"";s:3:"嚮";s:2:"";s:3:"嚰";s:2:"";s:3:"嚱";s:2:"";s:3:"嚲";s:2:"";s:3:"嚳";s:2:"";s:3:"嚴";s:2:"";s:3:"嚵";s:2:"";s:3:"嚶";s:2:"";s:3:"嚸";s:2:"";s:3:"嚹";s:2:"";s:3:"嚺";s:2:"";s:3:"嚻";s:2:"";s:3:"嚽";s:2:"";s:3:"嚾";s:2:"";s:3:"嚿";s:2:"";s:3:"囀";s:2:"";s:3:"囁";s:2:"";s:3:"囂";s:2:"";s:3:"囃";s:2:"";s:3:"囄";s:2:"";s:3:"囅";s:2:"";s:3:"囆";s:2:"";s:3:"囇";s:2:"";s:3:"囈";s:2:"";s:3:"囉";s:2:"";s:3:"囋";s:2:"";s:3:"囌";s:2:"";s:3:"囍";s:2:"";s:3:"囎";s:2:"";s:3:"囏";s:2:"";s:3:"囐";s:2:"";s:3:"囑";s:2:"";s:3:"囒";s:2:"";s:3:"囓";s:2:"";s:3:"囕";s:2:"";s:3:"囖";s:2:"";s:3:"囘";s:2:"";s:3:"囙";s:2:"";s:3:"囜";s:2:"";s:3:"団";s:2:"";s:3:"囥";s:2:"";s:3:"囦";s:2:"";s:3:"囧";s:2:"";s:3:"囨";s:2:"";s:3:"囩";s:2:"";s:3:"囪";s:2:"";s:3:"囬";s:2:"";s:3:"囮";s:2:"";s:3:"囯";s:2:"";s:3:"囲";s:2:"";s:3:"図";s:2:"";s:3:"囶";s:2:"";s:3:"囷";s:2:"";s:3:"囸";s:2:"";s:3:"囻";s:2:"";s:3:"囼";s:2:"";s:3:"圀";s:2:"";s:3:"圁";s:2:"";s:3:"圂";s:2:"";s:3:"圅";s:2:"";s:3:"圇";s:2:"";s:3:"國";s:2:"";s:3:"圌";s:2:"";s:3:"圍";s:2:"";s:3:"圎";s:2:"";s:3:"圏";s:2:"";s:3:"圐";s:2:"";s:3:"圑";s:2:"@";s:3:"園";s:2:"A";s:3:"圓";s:2:"B";s:3:"圔";s:2:"C";s:3:"圕";s:2:"D";s:3:"圖";s:2:"E";s:3:"圗";s:2:"F";s:3:"團";s:2:"G";s:3:"圙";s:2:"H";s:3:"圚";s:2:"I";s:3:"圛";s:2:"J";s:3:"圝";s:2:"K";s:3:"圞";s:2:"L";s:3:"圠";s:2:"M";s:3:"圡";s:2:"N";s:3:"圢";s:2:"O";s:3:"圤";s:2:"P";s:3:"圥";s:2:"Q";s:3:"圦";s:2:"R";s:3:"圧";s:2:"S";s:3:"圫";s:2:"T";s:3:"圱";s:2:"U";s:3:"圲";s:2:"V";s:3:"圴";s:2:"W";s:3:"圵";s:2:"X";s:3:"圶";s:2:"Y";s:3:"圷";s:2:"Z";s:3:"圸";s:2:"[";s:3:"圼";s:2:"\";s:3:"圽";s:2:"]";s:3:"圿";s:2:"^";s:3:"坁";s:2:"_";s:3:"坃";s:2:"`";s:3:"坄";s:2:"a";s:3:"坅";s:2:"b";s:3:"坆";s:2:"c";s:3:"坈";s:2:"d";s:3:"坉";s:2:"e";s:3:"坋";s:2:"f";s:3:"坒";s:2:"g";s:3:"坓";s:2:"h";s:3:"坔";s:2:"i";s:3:"坕";s:2:"j";s:3:"坖";s:2:"k";s:3:"坘";s:2:"l";s:3:"坙";s:2:"m";s:3:"坢";s:2:"n";s:3:"坣";s:2:"o";s:3:"坥";s:2:"p";s:3:"坧";s:2:"q";s:3:"坬";s:2:"r";s:3:"坮";s:2:"s";s:3:"坰";s:2:"t";s:3:"坱";s:2:"u";s:3:"坲";s:2:"v";s:3:"坴";s:2:"w";s:3:"坵";s:2:"x";s:3:"坸";s:2:"y";s:3:"坹";s:2:"z";s:3:"坺";s:2:"{";s:3:"坽";s:2:"|";s:3:"坾";s:2:"}";s:3:"坿";s:2:"~";s:3:"垀";s:2:"";s:3:"垁";s:2:"";s:3:"垇";s:2:"";s:3:"垈";s:2:"";s:3:"垉";s:2:"";s:3:"垊";s:2:"";s:3:"垍";s:2:"";s:3:"垎";s:2:"";s:3:"垏";s:2:"";s:3:"垐";s:2:"";s:3:"垑";s:2:"";s:3:"垔";s:2:"";s:3:"垕";s:2:"";s:3:"垖";s:2:"";s:3:"垗";s:2:"";s:3:"垘";s:2:"";s:3:"垙";s:2:"";s:3:"垚";s:2:"";s:3:"垜";s:2:"";s:3:"垝";s:2:"";s:3:"垞";s:2:"";s:3:"垟";s:2:"";s:3:"垥";s:2:"";s:3:"垨";s:2:"";s:3:"垪";s:2:"";s:3:"垬";s:2:"";s:3:"垯";s:2:"";s:3:"垰";s:2:"";s:3:"垱";s:2:"";s:3:"垳";s:2:"";s:3:"垵";s:2:"";s:3:"垶";s:2:"";s:3:"垷";s:2:"";s:3:"垹";s:2:"";s:3:"垺";s:2:"";s:3:"垻";s:2:"";s:3:"垼";s:2:"";s:3:"垽";s:2:"";s:3:"垾";s:2:"";s:3:"垿";s:2:"";s:3:"埀";s:2:"";s:3:"埁";s:2:"";s:3:"埄";s:2:"";s:3:"埅";s:2:"";s:3:"埆";s:2:"";s:3:"埇";s:2:"";s:3:"埈";s:2:"";s:3:"埉";s:2:"";s:3:"埊";s:2:"";s:3:"埌";s:2:"";s:3:"埍";s:2:"";s:3:"埐";s:2:"";s:3:"埑";s:2:"";s:3:"埓";s:2:"";s:3:"埖";s:2:"";s:3:"埗";s:2:"";s:3:"埛";s:2:"";s:3:"埜";s:2:"";s:3:"埞";s:2:"";s:3:"埡";s:2:"";s:3:"埢";s:2:"";s:3:"埣";s:2:"";s:3:"埥";s:2:"";s:3:"埦";s:2:"";s:3:"埧";s:2:"";s:3:"埨";s:2:"";s:3:"埩";s:2:"";s:3:"埪";s:2:"";s:3:"埫";s:2:"";s:3:"埬";s:2:"";s:3:"埮";s:2:"";s:3:"埰";s:2:"";s:3:"埱";s:2:"";s:3:"埲";s:2:"";s:3:"埳";s:2:"";s:3:"埵";s:2:"";s:3:"埶";s:2:"";s:3:"執";s:2:"";s:3:"埻";s:2:"";s:3:"埼";s:2:"";s:3:"埾";s:2:"";s:3:"埿";s:2:"";s:3:"堁";s:2:"";s:3:"堃";s:2:"";s:3:"堄";s:2:"";s:3:"堅";s:2:"";s:3:"堈";s:2:"";s:3:"堉";s:2:"";s:3:"堊";s:2:"";s:3:"堌";s:2:"";s:3:"堎";s:2:"";s:3:"堏";s:2:"";s:3:"堐";s:2:"";s:3:"堒";s:2:"";s:3:"堓";s:2:"";s:3:"堔";s:2:"";s:3:"堖";s:2:"";s:3:"堗";s:2:"";s:3:"堘";s:2:"";s:3:"堚";s:2:"";s:3:"堛";s:2:"";s:3:"堜";s:2:"";s:3:"堝";s:2:"";s:3:"堟";s:2:"";s:3:"堢";s:2:"";s:3:"堣";s:2:"";s:3:"堥";s:2:"";s:3:"堦";s:2:"";s:3:"堧";s:2:"";s:3:"堨";s:2:"";s:3:"堩";s:2:"";s:3:"堫";s:2:"";s:3:"堬";s:2:"";s:3:"堭";s:2:"";s:3:"堮";s:2:"";s:3:"堯";s:2:"";s:3:"報";s:2:"";s:3:"堲";s:2:"";s:3:"堳";s:2:"";s:3:"場";s:2:"";s:3:"堶";s:2:"";s:3:"堷";s:2:"";s:3:"堸";s:2:"";s:3:"堹";s:2:"";s:3:"堺";s:2:"";s:3:"堻";s:2:"";s:3:"堼";s:2:"";s:3:"堽";s:2:"@";s:3:"堾";s:2:"A";s:3:"堿";s:2:"B";s:3:"塀";s:2:"C";s:3:"塁";s:2:"D";s:3:"塂";s:2:"E";s:3:"塃";s:2:"F";s:3:"塅";s:2:"G";s:3:"塆";s:2:"H";s:3:"塇";s:2:"I";s:3:"塈";s:2:"J";s:3:"塉";s:2:"K";s:3:"塊";s:2:"L";s:3:"塋";s:2:"M";s:3:"塎";s:2:"N";s:3:"塏";s:2:"O";s:3:"塐";s:2:"P";s:3:"塒";s:2:"Q";s:3:"塓";s:2:"R";s:3:"塕";s:2:"S";s:3:"塖";s:2:"T";s:3:"塗";s:2:"U";s:3:"塙";s:2:"V";s:3:"塚";s:2:"W";s:3:"塛";s:2:"X";s:3:"塜";s:2:"Y";s:3:"塝";s:2:"Z";s:3:"塟";s:2:"[";s:3:"塠";s:2:"\";s:3:"塡";s:2:"]";s:3:"塢";s:2:"^";s:3:"塣";s:2:"_";s:3:"塤";s:2:"`";s:3:"塦";s:2:"a";s:3:"塧";s:2:"b";s:3:"塨";s:2:"c";s:3:"塩";s:2:"d";s:3:"塪";s:2:"e";s:3:"塭";s:2:"f";s:3:"塮";s:2:"g";s:3:"塯";s:2:"h";s:3:"塰";s:2:"i";s:3:"塱";s:2:"j";s:3:"塲";s:2:"k";s:3:"塳";s:2:"l";s:3:"塴";s:2:"m";s:3:"塵";s:2:"n";s:3:"塶";s:2:"o";s:3:"塷";s:2:"p";s:3:"塸";s:2:"q";s:3:"塹";s:2:"r";s:3:"塺";s:2:"s";s:3:"塻";s:2:"t";s:3:"塼";s:2:"u";s:3:"塽";s:2:"v";s:3:"塿";s:2:"w";s:3:"墂";s:2:"x";s:3:"墄";s:2:"y";s:3:"墆";s:2:"z";s:3:"墇";s:2:"{";s:3:"墈";s:2:"|";s:3:"墊";s:2:"}";s:3:"墋";s:2:"~";s:3:"墌";s:2:"";s:3:"墍";s:2:"";s:3:"墎";s:2:"";s:3:"墏";s:2:"";s:3:"墐";s:2:"";s:3:"墑";s:2:"";s:3:"墔";s:2:"";s:3:"墕";s:2:"";s:3:"墖";s:2:"";s:3:"増";s:2:"";s:3:"墘";s:2:"";s:3:"墛";s:2:"";s:3:"墜";s:2:"";s:3:"墝";s:2:"";s:3:"墠";s:2:"";s:3:"墡";s:2:"";s:3:"墢";s:2:"";s:3:"墣";s:2:"";s:3:"墤";s:2:"";s:3:"墥";s:2:"";s:3:"墦";s:2:"";s:3:"墧";s:2:"";s:3:"墪";s:2:"";s:3:"墫";s:2:"";s:3:"墬";s:2:"";s:3:"墭";s:2:"";s:3:"墮";s:2:"";s:3:"墯";s:2:"";s:3:"墰";s:2:"";s:3:"墱";s:2:"";s:3:"墲";s:2:"";s:3:"墳";s:2:"";s:3:"墴";s:2:"";s:3:"墵";s:2:"";s:3:"墶";s:2:"";s:3:"墷";s:2:"";s:3:"墸";s:2:"";s:3:"墹";s:2:"";s:3:"墺";s:2:"";s:3:"墻";s:2:"";s:3:"墽";s:2:"";s:3:"墾";s:2:"";s:3:"墿";s:2:"";s:3:"壀";s:2:"";s:3:"壂";s:2:"";s:3:"壃";s:2:"";s:3:"壄";s:2:"";s:3:"壆";s:2:"";s:3:"壇";s:2:"";s:3:"壈";s:2:"";s:3:"壉";s:2:"";s:3:"壊";s:2:"";s:3:"壋";s:2:"";s:3:"壌";s:2:"";s:3:"壍";s:2:"";s:3:"壎";s:2:"";s:3:"壏";s:2:"";s:3:"壐";s:2:"";s:3:"壒";s:2:"";s:3:"壓";s:2:"";s:3:"壔";s:2:"";s:3:"壖";s:2:"";s:3:"壗";s:2:"";s:3:"壘";s:2:"";s:3:"壙";s:2:"";s:3:"壚";s:2:"";s:3:"壛";s:2:"";s:3:"壜";s:2:"";s:3:"壝";s:2:"";s:3:"壞";s:2:"";s:3:"壟";s:2:"";s:3:"壠";s:2:"";s:3:"壡";s:2:"";s:3:"壢";s:2:"";s:3:"壣";s:2:"";s:3:"壥";s:2:"";s:3:"壦";s:2:"";s:3:"壧";s:2:"";s:3:"壨";s:2:"";s:3:"壩";s:2:"";s:3:"壪";s:2:"";s:3:"壭";s:2:"";s:3:"壯";s:2:"";s:3:"壱";s:2:"";s:3:"売";s:2:"";s:3:"壴";s:2:"";s:3:"壵";s:2:"";s:3:"壷";s:2:"";s:3:"壸";s:2:"";s:3:"壺";s:2:"";s:3:"壻";s:2:"";s:3:"壼";s:2:"";s:3:"壽";s:2:"";s:3:"壾";s:2:"";s:3:"壿";s:2:"";s:3:"夀";s:2:"";s:3:"夁";s:2:"";s:3:"夃";s:2:"";s:3:"夅";s:2:"";s:3:"夆";s:2:"";s:3:"夈";s:2:"";s:3:"変";s:2:"";s:3:"夊";s:2:"";s:3:"夋";s:2:"";s:3:"夌";s:2:"";s:3:"夎";s:2:"";s:3:"夐";s:2:"";s:3:"夑";s:2:"";s:3:"夒";s:2:"";s:3:"夓";s:2:"";s:3:"夗";s:2:"";s:3:"夘";s:2:"";s:3:"夛";s:2:"";s:3:"夝";s:2:"";s:3:"夞";s:2:"";s:3:"夠";s:2:"";s:3:"夡";s:2:"";s:3:"夢";s:2:"";s:3:"夣";s:2:"";s:3:"夦";s:2:"";s:3:"夨";s:2:"";s:3:"夬";s:2:"";s:3:"夰";s:2:"";s:3:"夲";s:2:"";s:3:"夳";s:2:"";s:3:"夵";s:2:"";s:3:"夶";s:2:"";s:3:"夻";s:2:"@";s:3:"夽";s:2:"A";s:3:"夾";s:2:"B";s:3:"夿";s:2:"C";s:3:"奀";s:2:"D";s:3:"奃";s:2:"E";s:3:"奅";s:2:"F";s:3:"奆";s:2:"G";s:3:"奊";s:2:"H";s:3:"奌";s:2:"I";s:3:"奍";s:2:"J";s:3:"奐";s:2:"K";s:3:"奒";s:2:"L";s:3:"奓";s:2:"M";s:3:"奙";s:2:"N";s:3:"奛";s:2:"O";s:3:"奜";s:2:"P";s:3:"奝";s:2:"Q";s:3:"奞";s:2:"R";s:3:"奟";s:2:"S";s:3:"奡";s:2:"T";s:3:"奣";s:2:"U";s:3:"奤";s:2:"V";s:3:"奦";s:2:"W";s:3:"奧";s:2:"X";s:3:"奨";s:2:"Y";s:3:"奩";s:2:"Z";s:3:"奪";s:2:"[";s:3:"奫";s:2:"\";s:3:"奬";s:2:"]";s:3:"奭";s:2:"^";s:3:"奮";s:2:"_";s:3:"奯";s:2:"`";s:3:"奰";s:2:"a";s:3:"奱";s:2:"b";s:3:"奲";s:2:"c";s:3:"奵";s:2:"d";s:3:"奷";s:2:"e";s:3:"奺";s:2:"f";s:3:"奻";s:2:"g";s:3:"奼";s:2:"h";s:3:"奾";s:2:"i";s:3:"奿";s:2:"j";s:3:"妀";s:2:"k";s:3:"妅";s:2:"l";s:3:"妉";s:2:"m";s:3:"妋";s:2:"n";s:3:"妌";s:2:"o";s:3:"妎";s:2:"p";s:3:"妏";s:2:"q";s:3:"妐";s:2:"r";s:3:"妑";s:2:"s";s:3:"妔";s:2:"t";s:3:"妕";s:2:"u";s:3:"妘";s:2:"v";s:3:"妚";s:2:"w";s:3:"妛";s:2:"x";s:3:"妜";s:2:"y";s:3:"妝";s:2:"z";s:3:"妟";s:2:"{";s:3:"妠";s:2:"|";s:3:"妡";s:2:"}";s:3:"妢";s:2:"~";s:3:"妦";s:2:"";s:3:"妧";s:2:"";s:3:"妬";s:2:"";s:3:"妭";s:2:"";s:3:"妰";s:2:"";s:3:"妱";s:2:"";s:3:"妳";s:2:"";s:3:"妴";s:2:"";s:3:"妵";s:2:"";s:3:"妶";s:2:"";s:3:"妷";s:2:"";s:3:"妸";s:2:"";s:3:"妺";s:2:"";s:3:"妼";s:2:"";s:3:"妽";s:2:"";s:3:"妿";s:2:"";s:3:"姀";s:2:"";s:3:"姁";s:2:"";s:3:"姂";s:2:"";s:3:"姃";s:2:"";s:3:"姄";s:2:"";s:3:"姅";s:2:"";s:3:"姇";s:2:"";s:3:"姈";s:2:"";s:3:"姉";s:2:"";s:3:"姌";s:2:"";s:3:"姍";s:2:"";s:3:"姎";s:2:"";s:3:"姏";s:2:"";s:3:"姕";s:2:"";s:3:"姖";s:2:"";s:3:"姙";s:2:"";s:3:"姛";s:2:"";s:3:"姞";s:2:"";s:3:"姟";s:2:"";s:3:"姠";s:2:"";s:3:"姡";s:2:"";s:3:"姢";s:2:"";s:3:"姤";s:2:"";s:3:"姦";s:2:"";s:3:"姧";s:2:"";s:3:"姩";s:2:"";s:3:"姪";s:2:"";s:3:"姫";s:2:"";s:3:"姭";s:2:"";s:3:"姮";s:2:"";s:3:"姯";s:2:"";s:3:"姰";s:2:"";s:3:"姱";s:2:"";s:3:"姲";s:2:"";s:3:"姳";s:2:"";s:3:"姴";s:2:"";s:3:"姵";s:2:"";s:3:"姶";s:2:"";s:3:"姷";s:2:"";s:3:"姸";s:2:"";s:3:"姺";s:2:"";s:3:"姼";s:2:"";s:3:"姽";s:2:"";s:3:"姾";s:2:"";s:3:"娀";s:2:"";s:3:"娂";s:2:"";s:3:"娊";s:2:"";s:3:"娋";s:2:"";s:3:"娍";s:2:"";s:3:"娎";s:2:"";s:3:"娏";s:2:"";s:3:"娐";s:2:"";s:3:"娒";s:2:"";s:3:"娔";s:2:"";s:3:"娕";s:2:"";s:3:"娖";s:2:"";s:3:"娗";s:2:"";s:3:"娙";s:2:"";s:3:"娚";s:2:"";s:3:"娛";s:2:"";s:3:"娝";s:2:"";s:3:"娞";s:2:"";s:3:"娡";s:2:"";s:3:"娢";s:2:"";s:3:"娤";s:2:"";s:3:"娦";s:2:"";s:3:"娧";s:2:"";s:3:"娨";s:2:"";s:3:"娪";s:2:"";s:3:"娫";s:2:"";s:3:"娬";s:2:"";s:3:"娭";s:2:"";s:3:"娮";s:2:"";s:3:"娯";s:2:"";s:3:"娰";s:2:"";s:3:"娳";s:2:"";s:3:"娵";s:2:"";s:3:"娷";s:2:"";s:3:"娸";s:2:"";s:3:"娹";s:2:"";s:3:"娺";s:2:"";s:3:"娻";s:2:"";s:3:"娽";s:2:"";s:3:"娾";s:2:"";s:3:"娿";s:2:"";s:3:"婁";s:2:"";s:3:"婂";s:2:"";s:3:"婃";s:2:"";s:3:"婄";s:2:"";s:3:"婅";s:2:"";s:3:"婇";s:2:"";s:3:"婈";s:2:"";s:3:"婋";s:2:"";s:3:"婌";s:2:"";s:3:"婍";s:2:"";s:3:"婎";s:2:"";s:3:"婏";s:2:"";s:3:"婐";s:2:"";s:3:"婑";s:2:"";s:3:"婒";s:2:"";s:3:"婓";s:2:"";s:3:"婔";s:2:"";s:3:"婖";s:2:"";s:3:"婗";s:2:"";s:3:"婘";s:2:"";s:3:"婙";s:2:"";s:3:"婛";s:2:"";s:3:"婜";s:2:"";s:3:"婝";s:2:"";s:3:"婞";s:2:"";s:3:"婟";s:2:"";s:3:"婠";s:2:"@";s:3:"婡";s:2:"A";s:3:"婣";s:2:"B";s:3:"婤";s:2:"C";s:3:"婥";s:2:"D";s:3:"婦";s:2:"E";s:3:"婨";s:2:"F";s:3:"婩";s:2:"G";s:3:"婫";s:2:"H";s:3:"婬";s:2:"I";s:3:"婭";s:2:"J";s:3:"婮";s:2:"K";s:3:"婯";s:2:"L";s:3:"婰";s:2:"M";s:3:"婱";s:2:"N";s:3:"婲";s:2:"O";s:3:"婳";s:2:"P";s:3:"婸";s:2:"Q";s:3:"婹";s:2:"R";s:3:"婻";s:2:"S";s:3:"婼";s:2:"T";s:3:"婽";s:2:"U";s:3:"婾";s:2:"V";s:3:"媀";s:2:"W";s:3:"媁";s:2:"X";s:3:"媂";s:2:"Y";s:3:"媃";s:2:"Z";s:3:"媄";s:2:"[";s:3:"媅";s:2:"\";s:3:"媆";s:2:"]";s:3:"媇";s:2:"^";s:3:"媈";s:2:"_";s:3:"媉";s:2:"`";s:3:"媊";s:2:"a";s:3:"媋";s:2:"b";s:3:"媌";s:2:"c";s:3:"媍";s:2:"d";s:3:"媎";s:2:"e";s:3:"媏";s:2:"f";s:3:"媐";s:2:"g";s:3:"媑";s:2:"h";s:3:"媓";s:2:"i";s:3:"媔";s:2:"j";s:3:"媕";s:2:"k";s:3:"媖";s:2:"l";s:3:"媗";s:2:"m";s:3:"媘";s:2:"n";s:3:"媙";s:2:"o";s:3:"媜";s:2:"p";s:3:"媝";s:2:"q";s:3:"媞";s:2:"r";s:3:"媟";s:2:"s";s:3:"媠";s:2:"t";s:3:"媡";s:2:"u";s:3:"媢";s:2:"v";s:3:"媣";s:2:"w";s:3:"媤";s:2:"x";s:3:"媥";s:2:"y";s:3:"媦";s:2:"z";s:3:"媧";s:2:"{";s:3:"媨";s:2:"|";s:3:"媩";s:2:"}";s:3:"媫";s:2:"~";s:3:"媬";s:2:"";s:3:"媭";s:2:"";s:3:"媮";s:2:"";s:3:"媯";s:2:"";s:3:"媰";s:2:"";s:3:"媱";s:2:"";s:3:"媴";s:2:"";s:3:"媶";s:2:"";s:3:"媷";s:2:"";s:3:"媹";s:2:"";s:3:"媺";s:2:"";s:3:"媻";s:2:"";s:3:"媼";s:2:"";s:3:"媽";s:2:"";s:3:"媿";s:2:"";s:3:"嫀";s:2:"";s:3:"嫃";s:2:"";s:3:"嫄";s:2:"";s:3:"嫅";s:2:"";s:3:"嫆";s:2:"";s:3:"嫇";s:2:"";s:3:"嫈";s:2:"";s:3:"嫊";s:2:"";s:3:"嫋";s:2:"";s:3:"嫍";s:2:"";s:3:"嫎";s:2:"";s:3:"嫏";s:2:"";s:3:"嫐";s:2:"";s:3:"嫑";s:2:"";s:3:"嫓";s:2:"";s:3:"嫕";s:2:"";s:3:"嫗";s:2:"";s:3:"嫙";s:2:"";s:3:"嫚";s:2:"";s:3:"嫛";s:2:"";s:3:"嫝";s:2:"";s:3:"嫞";s:2:"";s:3:"嫟";s:2:"";s:3:"嫢";s:2:"";s:3:"嫤";s:2:"";s:3:"嫥";s:2:"";s:3:"嫧";s:2:"";s:3:"嫨";s:2:"";s:3:"嫪";s:2:"";s:3:"嫬";s:2:"";s:3:"嫭";s:2:"";s:3:"嫮";s:2:"";s:3:"嫯";s:2:"";s:3:"嫰";s:2:"";s:3:"嫲";s:2:"";s:3:"嫳";s:2:"";s:3:"嫴";s:2:"";s:3:"嫵";s:2:"";s:3:"嫶";s:2:"";s:3:"嫷";s:2:"";s:3:"嫸";s:2:"";s:3:"嫹";s:2:"";s:3:"嫺";s:2:"";s:3:"嫻";s:2:"";s:3:"嫼";s:2:"";s:3:"嫽";s:2:"";s:3:"嫾";s:2:"";s:3:"嫿";s:2:"";s:3:"嬀";s:2:"";s:3:"嬁";s:2:"";s:3:"嬂";s:2:"";s:3:"嬃";s:2:"";s:3:"嬄";s:2:"";s:3:"嬅";s:2:"";s:3:"嬆";s:2:"";s:3:"嬇";s:2:"";s:3:"嬈";s:2:"";s:3:"嬊";s:2:"";s:3:"嬋";s:2:"";s:3:"嬌";s:2:"";s:3:"嬍";s:2:"";s:3:"嬎";s:2:"";s:3:"嬏";s:2:"";s:3:"嬐";s:2:"";s:3:"嬑";s:2:"";s:3:"嬒";s:2:"";s:3:"嬓";s:2:"";s:3:"嬔";s:2:"";s:3:"嬕";s:2:"";s:3:"嬘";s:2:"";s:3:"嬙";s:2:"";s:3:"嬚";s:2:"";s:3:"嬛";s:2:"";s:3:"嬜";s:2:"";s:3:"嬝";s:2:"";s:3:"嬞";s:2:"";s:3:"嬟";s:2:"";s:3:"嬠";s:2:"";s:3:"嬡";s:2:"";s:3:"嬢";s:2:"";s:3:"嬣";s:2:"";s:3:"嬤";s:2:"";s:3:"嬥";s:2:"";s:3:"嬦";s:2:"";s:3:"嬧";s:2:"";s:3:"嬨";s:2:"";s:3:"嬩";s:2:"";s:3:"嬪";s:2:"";s:3:"嬫";s:2:"";s:3:"嬬";s:2:"";s:3:"嬭";s:2:"";s:3:"嬮";s:2:"";s:3:"嬯";s:2:"";s:3:"嬰";s:2:"";s:3:"嬱";s:2:"";s:3:"嬳";s:2:"";s:3:"嬵";s:2:"";s:3:"嬶";s:2:"";s:3:"嬸";s:2:"";s:3:"嬹";s:2:"";s:3:"嬺";s:2:"";s:3:"嬻";s:2:"";s:3:"嬼";s:2:"";s:3:"嬽";s:2:"";s:3:"嬾";s:2:"";s:3:"嬿";s:2:"";s:3:"孁";s:2:"";s:3:"孂";s:2:"";s:3:"孃";s:2:"";s:3:"孄";s:2:"";s:3:"孅";s:2:"";s:3:"孆";s:2:"";s:3:"孇";s:2:"@";s:3:"孈";s:2:"A";s:3:"孉";s:2:"B";s:3:"孊";s:2:"C";s:3:"孋";s:2:"D";s:3:"孌";s:2:"E";s:3:"孍";s:2:"F";s:3:"孎";s:2:"G";s:3:"孏";s:2:"H";s:3:"孒";s:2:"I";s:3:"孖";s:2:"J";s:3:"孞";s:2:"K";s:3:"孠";s:2:"L";s:3:"孡";s:2:"M";s:3:"孧";s:2:"N";s:3:"孨";s:2:"O";s:3:"孫";s:2:"P";s:3:"孭";s:2:"Q";s:3:"孮";s:2:"R";s:3:"孯";s:2:"S";s:3:"孲";s:2:"T";s:3:"孴";s:2:"U";s:3:"孶";s:2:"V";s:3:"孷";s:2:"W";s:3:"學";s:2:"X";s:3:"孹";s:2:"Y";s:3:"孻";s:2:"Z";s:3:"孼";s:2:"[";s:3:"孾";s:2:"\";s:3:"孿";s:2:"]";s:3:"宂";s:2:"^";s:3:"宆";s:2:"_";s:3:"宊";s:2:"`";s:3:"宍";s:2:"a";s:3:"宎";s:2:"b";s:3:"宐";s:2:"c";s:3:"宑";s:2:"d";s:3:"宒";s:2:"e";s:3:"宔";s:2:"f";s:3:"宖";s:2:"g";s:3:"実";s:2:"h";s:3:"宧";s:2:"i";s:3:"宨";s:2:"j";s:3:"宩";s:2:"k";s:3:"宬";s:2:"l";s:3:"宭";s:2:"m";s:3:"宮";s:2:"n";s:3:"宯";s:2:"o";s:3:"宱";s:2:"p";s:3:"宲";s:2:"q";s:3:"宷";s:2:"r";s:3:"宺";s:2:"s";s:3:"宻";s:2:"t";s:3:"宼";s:2:"u";s:3:"寀";s:2:"v";s:3:"寁";s:2:"w";s:3:"寃";s:2:"x";s:3:"寈";s:2:"y";s:3:"寉";s:2:"z";s:3:"寊";s:2:"{";s:3:"寋";s:2:"|";s:3:"寍";s:2:"}";s:3:"寎";s:2:"~";s:3:"寏";s:2:"";s:3:"寑";s:2:"";s:3:"寔";s:2:"";s:3:"寕";s:2:"";s:3:"寖";s:2:"";s:3:"寗";s:2:"";s:3:"寘";s:2:"";s:3:"寙";s:2:"";s:3:"寚";s:2:"";s:3:"寛";s:2:"";s:3:"寜";s:2:"";s:3:"寠";s:2:"";s:3:"寢";s:2:"";s:3:"寣";s:2:"";s:3:"實";s:2:"";s:3:"寧";s:2:"";s:3:"審";s:2:"";s:3:"寪";s:2:"";s:3:"寫";s:2:"";s:3:"寬";s:2:"";s:3:"寭";s:2:"";s:3:"寯";s:2:"";s:3:"寱";s:2:"";s:3:"寲";s:2:"";s:3:"寳";s:2:"";s:3:"寴";s:2:"";s:3:"寵";s:2:"";s:3:"寶";s:2:"";s:3:"寷";s:2:"";s:3:"寽";s:2:"";s:3:"対";s:2:"";s:3:"尀";s:2:"";s:3:"専";s:2:"";s:3:"尃";s:2:"";s:3:"尅";s:2:"";s:3:"將";s:2:"";s:3:"專";s:2:"";s:3:"尋";s:2:"";s:3:"尌";s:2:"";s:3:"對";s:2:"";s:3:"導";s:2:"";s:3:"尐";s:2:"";s:3:"尒";s:2:"";s:3:"尓";s:2:"";s:3:"尗";s:2:"";s:3:"尙";s:2:"";s:3:"尛";s:2:"";s:3:"尞";s:2:"";s:3:"尟";s:2:"";s:3:"尠";s:2:"";s:3:"尡";s:2:"";s:3:"尣";s:2:"";s:3:"尦";s:2:"";s:3:"尨";s:2:"";s:3:"尩";s:2:"";s:3:"尪";s:2:"";s:3:"尫";s:2:"";s:3:"尭";s:2:"";s:3:"尮";s:2:"";s:3:"尯";s:2:"";s:3:"尰";s:2:"";s:3:"尲";s:2:"";s:3:"尳";s:2:"";s:3:"尵";s:2:"";s:3:"尶";s:2:"";s:3:"尷";s:2:"";s:3:"屃";s:2:"";s:3:"屄";s:2:"";s:3:"屆";s:2:"";s:3:"屇";s:2:"";s:3:"屌";s:2:"";s:3:"屍";s:2:"";s:3:"屒";s:2:"";s:3:"屓";s:2:"";s:3:"屔";s:2:"";s:3:"屖";s:2:"";s:3:"屗";s:2:"";s:3:"屘";s:2:"";s:3:"屚";s:2:"";s:3:"屛";s:2:"";s:3:"屜";s:2:"";s:3:"屝";s:2:"";s:3:"屟";s:2:"";s:3:"屢";s:2:"";s:3:"層";s:2:"";s:3:"屧";s:2:"";s:3:"屨";s:2:"";s:3:"屩";s:2:"";s:3:"屪";s:2:"";s:3:"屫";s:2:"";s:3:"屬";s:2:"";s:3:"屭";s:2:"";s:3:"屰";s:2:"";s:3:"屲";s:2:"";s:3:"屳";s:2:"";s:3:"屴";s:2:"";s:3:"屵";s:2:"";s:3:"屶";s:2:"";s:3:"屷";s:2:"";s:3:"屸";s:2:"";s:3:"屻";s:2:"";s:3:"屼";s:2:"";s:3:"屽";s:2:"";s:3:"屾";s:2:"";s:3:"岀";s:2:"";s:3:"岃";s:2:"";s:3:"岄";s:2:"";s:3:"岅";s:2:"";s:3:"岆";s:2:"";s:3:"岇";s:2:"";s:3:"岉";s:2:"";s:3:"岊";s:2:"";s:3:"岋";s:2:"";s:3:"岎";s:2:"";s:3:"岏";s:2:"";s:3:"岒";s:2:"";s:3:"岓";s:2:"";s:3:"岕";s:2:"";s:3:"岝";s:2:"";s:3:"岞";s:2:"";s:3:"岟";s:2:"";s:3:"岠";s:2:"";s:3:"岡";s:2:"";s:3:"岤";s:2:"";s:3:"岥";s:2:"";s:3:"岦";s:2:"";s:3:"岧";s:2:"";s:3:"岨";s:2:"@";s:3:"岪";s:2:"A";s:3:"岮";s:2:"B";s:3:"岯";s:2:"C";s:3:"岰";s:2:"D";s:3:"岲";s:2:"E";s:3:"岴";s:2:"F";s:3:"岶";s:2:"G";s:3:"岹";s:2:"H";s:3:"岺";s:2:"I";s:3:"岻";s:2:"J";s:3:"岼";s:2:"K";s:3:"岾";s:2:"L";s:3:"峀";s:2:"M";s:3:"峂";s:2:"N";s:3:"峃";s:2:"O";s:3:"峅";s:2:"P";s:3:"峆";s:2:"Q";s:3:"峇";s:2:"R";s:3:"峈";s:2:"S";s:3:"峉";s:2:"T";s:3:"峊";s:2:"U";s:3:"峌";s:2:"V";s:3:"峍";s:2:"W";s:3:"峎";s:2:"X";s:3:"峏";s:2:"Y";s:3:"峐";s:2:"Z";s:3:"峑";s:2:"[";s:3:"峓";s:2:"\";s:3:"峔";s:2:"]";s:3:"峕";s:2:"^";s:3:"峖";s:2:"_";s:3:"峗";s:2:"`";s:3:"峘";s:2:"a";s:3:"峚";s:2:"b";s:3:"峛";s:2:"c";s:3:"峜";s:2:"d";s:3:"峝";s:2:"e";s:3:"峞";s:2:"f";s:3:"峟";s:2:"g";s:3:"峠";s:2:"h";s:3:"峢";s:2:"i";s:3:"峣";s:2:"j";s:3:"峧";s:2:"k";s:3:"峩";s:2:"l";s:3:"峫";s:2:"m";s:3:"峬";s:2:"n";s:3:"峮";s:2:"o";s:3:"峯";s:2:"p";s:3:"峱";s:2:"q";s:3:"峲";s:2:"r";s:3:"峳";s:2:"s";s:3:"峴";s:2:"t";s:3:"峵";s:2:"u";s:3:"島";s:2:"v";s:3:"峷";s:2:"w";s:3:"峸";s:2:"x";s:3:"峹";s:2:"y";s:3:"峺";s:2:"z";s:3:"峼";s:2:"{";s:3:"峽";s:2:"|";s:3:"峾";s:2:"}";s:3:"峿";s:2:"~";s:3:"崀";s:2:"";s:3:"崁";s:2:"";s:3:"崄";s:2:"";s:3:"崅";s:2:"";s:3:"崈";s:2:"";s:3:"崉";s:2:"";s:3:"崊";s:2:"";s:3:"崋";s:2:"";s:3:"崌";s:2:"";s:3:"崍";s:2:"";s:3:"崏";s:2:"";s:3:"崐";s:2:"";s:3:"崑";s:2:"";s:3:"崒";s:2:"";s:3:"崓";s:2:"";s:3:"崕";s:2:"";s:3:"崗";s:2:"";s:3:"崘";s:2:"";s:3:"崙";s:2:"";s:3:"崚";s:2:"";s:3:"崜";s:2:"";s:3:"崝";s:2:"";s:3:"崟";s:2:"";s:3:"崠";s:2:"";s:3:"崡";s:2:"";s:3:"崢";s:2:"";s:3:"崣";s:2:"";s:3:"崥";s:2:"";s:3:"崨";s:2:"";s:3:"崪";s:2:"";s:3:"崫";s:2:"";s:3:"崬";s:2:"";s:3:"崯";s:2:"";s:3:"崰";s:2:"";s:3:"崱";s:2:"";s:3:"崲";s:2:"";s:3:"崳";s:2:"";s:3:"崵";s:2:"";s:3:"崶";s:2:"";s:3:"崷";s:2:"";s:3:"崸";s:2:"";s:3:"崹";s:2:"";s:3:"崺";s:2:"";s:3:"崻";s:2:"";s:3:"崼";s:2:"";s:3:"崿";s:2:"";s:3:"嵀";s:2:"";s:3:"嵁";s:2:"";s:3:"嵂";s:2:"";s:3:"嵃";s:2:"";s:3:"嵄";s:2:"";s:3:"嵅";s:2:"";s:3:"嵆";s:2:"";s:3:"嵈";s:2:"";s:3:"嵉";s:2:"";s:3:"嵍";s:2:"";s:3:"嵎";s:2:"";s:3:"嵏";s:2:"";s:3:"嵐";s:2:"";s:3:"嵑";s:2:"";s:3:"嵒";s:2:"";s:3:"嵓";s:2:"";s:3:"嵔";s:2:"";s:3:"嵕";s:2:"";s:3:"嵖";s:2:"";s:3:"嵗";s:2:"";s:3:"嵙";s:2:"";s:3:"嵚";s:2:"";s:3:"嵜";s:2:"";s:3:"嵞";s:2:"";s:3:"嵟";s:2:"";s:3:"嵠";s:2:"";s:3:"嵡";s:2:"";s:3:"嵢";s:2:"";s:3:"嵣";s:2:"";s:3:"嵤";s:2:"";s:3:"嵥";s:2:"";s:3:"嵦";s:2:"";s:3:"嵧";s:2:"";s:3:"嵨";s:2:"";s:3:"嵪";s:2:"";s:3:"嵭";s:2:"";s:3:"嵮";s:2:"";s:3:"嵰";s:2:"";s:3:"嵱";s:2:"";s:3:"嵲";s:2:"";s:3:"嵳";s:2:"";s:3:"嵵";s:2:"";s:3:"嵶";s:2:"";s:3:"嵷";s:2:"";s:3:"嵸";s:2:"";s:3:"嵹";s:2:"";s:3:"嵺";s:2:"";s:3:"嵻";s:2:"";s:3:"嵼";s:2:"";s:3:"嵽";s:2:"";s:3:"嵾";s:2:"";s:3:"嵿";s:2:"";s:3:"嶀";s:2:"";s:3:"嶁";s:2:"";s:3:"嶃";s:2:"";s:3:"嶄";s:2:"";s:3:"嶅";s:2:"";s:3:"嶆";s:2:"";s:3:"嶇";s:2:"";s:3:"嶈";s:2:"";s:3:"嶉";s:2:"";s:3:"嶊";s:2:"";s:3:"嶋";s:2:"";s:3:"嶌";s:2:"";s:3:"嶍";s:2:"";s:3:"嶎";s:2:"";s:3:"嶏";s:2:"";s:3:"嶐";s:2:"";s:3:"嶑";s:2:"";s:3:"嶒";s:2:"";s:3:"嶓";s:2:"";s:3:"嶔";s:2:"";s:3:"嶕";s:2:"";s:3:"嶖";s:2:"";s:3:"嶗";s:2:"";s:3:"嶘";s:2:"";s:3:"嶚";s:2:"";s:3:"嶛";s:2:"";s:3:"嶜";s:2:"";s:3:"嶞";s:2:"";s:3:"嶟";s:2:"";s:3:"嶠";s:2:"@";s:3:"嶡";s:2:"A";s:3:"嶢";s:2:"B";s:3:"嶣";s:2:"C";s:3:"嶤";s:2:"D";s:3:"嶥";s:2:"E";s:3:"嶦";s:2:"F";s:3:"嶧";s:2:"G";s:3:"嶨";s:2:"H";s:3:"嶩";s:2:"I";s:3:"嶪";s:2:"J";s:3:"嶫";s:2:"K";s:3:"嶬";s:2:"L";s:3:"嶭";s:2:"M";s:3:"嶮";s:2:"N";s:3:"嶯";s:2:"O";s:3:"嶰";s:2:"P";s:3:"嶱";s:2:"Q";s:3:"嶲";s:2:"R";s:3:"嶳";s:2:"S";s:3:"嶴";s:2:"T";s:3:"嶵";s:2:"U";s:3:"嶶";s:2:"V";s:3:"嶸";s:2:"W";s:3:"嶹";s:2:"X";s:3:"嶺";s:2:"Y";s:3:"嶻";s:2:"Z";s:3:"嶼";s:2:"[";s:3:"嶽";s:2:"\";s:3:"嶾";s:2:"]";s:3:"嶿";s:2:"^";s:3:"巀";s:2:"_";s:3:"巁";s:2:"`";s:3:"巂";s:2:"a";s:3:"巃";s:2:"b";s:3:"巄";s:2:"c";s:3:"巆";s:2:"d";s:3:"巇";s:2:"e";s:3:"巈";s:2:"f";s:3:"巉";s:2:"g";s:3:"巊";s:2:"h";s:3:"巋";s:2:"i";s:3:"巌";s:2:"j";s:3:"巎";s:2:"k";s:3:"巏";s:2:"l";s:3:"巐";s:2:"m";s:3:"巑";s:2:"n";s:3:"巒";s:2:"o";s:3:"巓";s:2:"p";s:3:"巔";s:2:"q";s:3:"巕";s:2:"r";s:3:"巖";s:2:"s";s:3:"巗";s:2:"t";s:3:"巘";s:2:"u";s:3:"巙";s:2:"v";s:3:"巚";s:2:"w";s:3:"巜";s:2:"x";s:3:"巟";s:2:"y";s:3:"巠";s:2:"z";s:3:"巣";s:2:"{";s:3:"巤";s:2:"|";s:3:"巪";s:2:"}";s:3:"巬";s:2:"~";s:3:"巭";s:2:"";s:3:"巰";s:2:"";s:3:"巵";s:2:"";s:3:"巶";s:2:"";s:3:"巸";s:2:"";s:3:"巹";s:2:"";s:3:"巺";s:2:"";s:3:"巻";s:2:"";s:3:"巼";s:2:"";s:3:"巿";s:2:"";s:3:"帀";s:2:"";s:3:"帄";s:2:"";s:3:"帇";s:2:"";s:3:"帉";s:2:"";s:3:"帊";s:2:"";s:3:"帋";s:2:"";s:3:"帍";s:2:"";s:3:"帎";s:2:"";s:3:"帒";s:2:"";s:3:"帓";s:2:"";s:3:"帗";s:2:"";s:3:"帞";s:2:"";s:3:"帟";s:2:"";s:3:"帠";s:2:"";s:3:"帡";s:2:"";s:3:"帢";s:2:"";s:3:"帣";s:2:"";s:3:"帤";s:2:"";s:3:"帥";s:2:"";s:3:"帨";s:2:"";s:3:"帩";s:2:"";s:3:"帪";s:2:"";s:3:"師";s:2:"";s:3:"帬";s:2:"";s:3:"帯";s:2:"";s:3:"帰";s:2:"";s:3:"帲";s:2:"";s:3:"帳";s:2:"";s:3:"帴";s:2:"";s:3:"帵";s:2:"";s:3:"帶";s:2:"";s:3:"帹";s:2:"";s:3:"帺";s:2:"";s:3:"帾";s:2:"";s:3:"帿";s:2:"";s:3:"幀";s:2:"";s:3:"幁";s:2:"";s:3:"幃";s:2:"";s:3:"幆";s:2:"";s:3:"幇";s:2:"";s:3:"幈";s:2:"";s:3:"幉";s:2:"";s:3:"幊";s:2:"";s:3:"幋";s:2:"";s:3:"幍";s:2:"";s:3:"幎";s:2:"";s:3:"幏";s:2:"";s:3:"幐";s:2:"";s:3:"幑";s:2:"";s:3:"幒";s:2:"";s:3:"幓";s:2:"";s:3:"幖";s:2:"";s:3:"幗";s:2:"";s:3:"幘";s:2:"";s:3:"幙";s:2:"";s:3:"幚";s:2:"";s:3:"幜";s:2:"";s:3:"幝";s:2:"";s:3:"幟";s:2:"";s:3:"幠";s:2:"";s:3:"幣";s:2:"";s:3:"幤";s:2:"";s:3:"幥";s:2:"";s:3:"幦";s:2:"";s:3:"幧";s:2:"";s:3:"幨";s:2:"";s:3:"幩";s:2:"";s:3:"幪";s:2:"";s:3:"幫";s:2:"";s:3:"幬";s:2:"";s:3:"幭";s:2:"";s:3:"幮";s:2:"";s:3:"幯";s:2:"";s:3:"幰";s:2:"";s:3:"幱";s:2:"";s:3:"幵";s:2:"";s:3:"幷";s:2:"";s:3:"幹";s:2:"";s:3:"幾";s:2:"";s:3:"庁";s:2:"";s:3:"庂";s:2:"";s:3:"広";s:2:"";s:3:"庅";s:2:"";s:3:"庈";s:2:"";s:3:"庉";s:2:"";s:3:"庌";s:2:"";s:3:"庍";s:2:"";s:3:"庎";s:2:"";s:3:"庒";s:2:"";s:3:"庘";s:2:"";s:3:"庛";s:2:"";s:3:"庝";s:2:"";s:3:"庡";s:2:"";s:3:"庢";s:2:"";s:3:"庣";s:2:"";s:3:"庤";s:2:"";s:3:"庨";s:2:"";s:3:"庩";s:2:"";s:3:"庪";s:2:"";s:3:"庫";s:2:"";s:3:"庬";s:2:"";s:3:"庮";s:2:"";s:3:"庯";s:2:"";s:3:"庰";s:2:"";s:3:"庱";s:2:"";s:3:"庲";s:2:"";s:3:"庴";s:2:"";s:3:"庺";s:2:"";s:3:"庻";s:2:"";s:3:"庼";s:2:"";s:3:"庽";s:2:"";s:3:"庿";s:2:"";s:3:"廀";s:2:"";s:3:"廁";s:2:"";s:3:"廂";s:2:"";s:3:"廃";s:2:"";s:3:"廄";s:2:"";s:3:"廅";s:2:"@";s:3:"廆";s:2:"A";s:3:"廇";s:2:"B";s:3:"廈";s:2:"C";s:3:"廋";s:2:"D";s:3:"廌";s:2:"E";s:3:"廍";s:2:"F";s:3:"廎";s:2:"G";s:3:"廏";s:2:"H";s:3:"廐";s:2:"I";s:3:"廔";s:2:"J";s:3:"廕";s:2:"K";s:3:"廗";s:2:"L";s:3:"廘";s:2:"M";s:3:"廙";s:2:"N";s:3:"廚";s:2:"O";s:3:"廜";s:2:"P";s:3:"廝";s:2:"Q";s:3:"廞";s:2:"R";s:3:"廟";s:2:"S";s:3:"廠";s:2:"T";s:3:"廡";s:2:"U";s:3:"廢";s:2:"V";s:3:"廣";s:2:"W";s:3:"廤";s:2:"X";s:3:"廥";s:2:"Y";s:3:"廦";s:2:"Z";s:3:"廧";s:2:"[";s:3:"廩";s:2:"\";s:3:"廫";s:2:"]";s:3:"廬";s:2:"^";s:3:"廭";s:2:"_";s:3:"廮";s:2:"`";s:3:"廯";s:2:"a";s:3:"廰";s:2:"b";s:3:"廱";s:2:"c";s:3:"廲";s:2:"d";s:3:"廳";s:2:"e";s:3:"廵";s:2:"f";s:3:"廸";s:2:"g";s:3:"廹";s:2:"h";s:3:"廻";s:2:"i";s:3:"廼";s:2:"j";s:3:"廽";s:2:"k";s:3:"弅";s:2:"l";s:3:"弆";s:2:"m";s:3:"弇";s:2:"n";s:3:"弉";s:2:"o";s:3:"弌";s:2:"p";s:3:"弍";s:2:"q";s:3:"弎";s:2:"r";s:3:"弐";s:2:"s";s:3:"弒";s:2:"t";s:3:"弔";s:2:"u";s:3:"弖";s:2:"v";s:3:"弙";s:2:"w";s:3:"弚";s:2:"x";s:3:"弜";s:2:"y";s:3:"弝";s:2:"z";s:3:"弞";s:2:"{";s:3:"弡";s:2:"|";s:3:"弢";s:2:"}";s:3:"弣";s:2:"~";s:3:"弤";s:2:"";s:3:"弨";s:2:"";s:3:"弫";s:2:"";s:3:"弬";s:2:"";s:3:"弮";s:2:"";s:3:"弰";s:2:"";s:3:"弲";s:2:"";s:3:"弳";s:2:"";s:3:"弴";s:2:"";s:3:"張";s:2:"";s:3:"弶";s:2:"";s:3:"強";s:2:"";s:3:"弸";s:2:"";s:3:"弻";s:2:"";s:3:"弽";s:2:"";s:3:"弾";s:2:"";s:3:"弿";s:2:"";s:3:"彁";s:2:"";s:3:"彂";s:2:"";s:3:"彃";s:2:"";s:3:"彄";s:2:"";s:3:"彅";s:2:"";s:3:"彆";s:2:"";s:3:"彇";s:2:"";s:3:"彈";s:2:"";s:3:"彉";s:2:"";s:3:"彊";s:2:"";s:3:"彋";s:2:"";s:3:"彌";s:2:"";s:3:"彍";s:2:"";s:3:"彎";s:2:"";s:3:"彏";s:2:"";s:3:"彑";s:2:"";s:3:"彔";s:2:"";s:3:"彙";s:2:"";s:3:"彚";s:2:"";s:3:"彛";s:2:"";s:3:"彜";s:2:"";s:3:"彞";s:2:"";s:3:"彟";s:2:"";s:3:"彠";s:2:"";s:3:"彣";s:2:"";s:3:"彥";s:2:"";s:3:"彧";s:2:"";s:3:"彨";s:2:"";s:3:"彫";s:2:"";s:3:"彮";s:2:"";s:3:"彯";s:2:"";s:3:"彲";s:2:"";s:3:"彴";s:2:"";s:3:"彵";s:2:"";s:3:"彶";s:2:"";s:3:"彸";s:2:"";s:3:"彺";s:2:"";s:3:"彽";s:2:"";s:3:"彾";s:2:"";s:3:"彿";s:2:"";s:3:"徃";s:2:"";s:3:"徆";s:2:"";s:3:"徍";s:2:"";s:3:"徎";s:2:"";s:3:"徏";s:2:"";s:3:"徑";s:2:"";s:3:"従";s:2:"";s:3:"徔";s:2:"";s:3:"徖";s:2:"";s:3:"徚";s:2:"";s:3:"徛";s:2:"";s:3:"徝";s:2:"";s:3:"從";s:2:"";s:3:"徟";s:2:"";s:3:"徠";s:2:"";s:3:"徢";s:2:"";s:3:"徣";s:2:"";s:3:"徤";s:2:"";s:3:"徥";s:2:"";s:3:"徦";s:2:"";s:3:"徧";s:2:"";s:3:"復";s:2:"";s:3:"徫";s:2:"";s:3:"徬";s:2:"";s:3:"徯";s:2:"";s:3:"徰";s:2:"";s:3:"徱";s:2:"";s:3:"徲";s:2:"";s:3:"徳";s:2:"";s:3:"徴";s:2:"";s:3:"徶";s:2:"";s:3:"徸";s:2:"";s:3:"徹";s:2:"";s:3:"徺";s:2:"";s:3:"徻";s:2:"";s:3:"徾";s:2:"";s:3:"徿";s:2:"";s:3:"忀";s:2:"";s:3:"忁";s:2:"";s:3:"忂";s:2:"";s:3:"忇";s:2:"";s:3:"忈";s:2:"";s:3:"忊";s:2:"";s:3:"忋";s:2:"";s:3:"忎";s:2:"";s:3:"忓";s:2:"";s:3:"忔";s:2:"";s:3:"忕";s:2:"";s:3:"忚";s:2:"";s:3:"忛";s:2:"";s:3:"応";s:2:"";s:3:"忞";s:2:"";s:3:"忟";s:2:"";s:3:"忢";s:2:"";s:3:"忣";s:2:"";s:3:"忥";s:2:"";s:3:"忦";s:2:"";s:3:"忨";s:2:"";s:3:"忩";s:2:"";s:3:"忬";s:2:"";s:3:"忯";s:2:"";s:3:"忰";s:2:"";s:3:"忲";s:2:"";s:3:"忳";s:2:"";s:3:"忴";s:2:"";s:3:"忶";s:2:"";s:3:"忷";s:2:"";s:3:"忹";s:2:"";s:3:"忺";s:2:"";s:3:"忼";s:2:"";s:3:"怇";s:2:"@";s:3:"怈";s:2:"A";s:3:"怉";s:2:"B";s:3:"怋";s:2:"C";s:3:"怌";s:2:"D";s:3:"怐";s:2:"E";s:3:"怑";s:2:"F";s:3:"怓";s:2:"G";s:3:"怗";s:2:"H";s:3:"怘";s:2:"I";s:3:"怚";s:2:"J";s:3:"怞";s:2:"K";s:3:"怟";s:2:"L";s:3:"怢";s:2:"M";s:3:"怣";s:2:"N";s:3:"怤";s:2:"O";s:3:"怬";s:2:"P";s:3:"怭";s:2:"Q";s:3:"怮";s:2:"R";s:3:"怰";s:2:"S";s:3:"怱";s:2:"T";s:3:"怲";s:2:"U";s:3:"怳";s:2:"V";s:3:"怴";s:2:"W";s:3:"怶";s:2:"X";s:3:"怷";s:2:"Y";s:3:"怸";s:2:"Z";s:3:"怹";s:2:"[";s:3:"怺";s:2:"\";s:3:"怽";s:2:"]";s:3:"怾";s:2:"^";s:3:"恀";s:2:"_";s:3:"恄";s:2:"`";s:3:"恅";s:2:"a";s:3:"恆";s:2:"b";s:3:"恇";s:2:"c";s:3:"恈";s:2:"d";s:3:"恉";s:2:"e";s:3:"恊";s:2:"f";s:3:"恌";s:2:"g";s:3:"恎";s:2:"h";s:3:"恏";s:2:"i";s:3:"恑";s:2:"j";s:3:"恓";s:2:"k";s:3:"恔";s:2:"l";s:3:"恖";s:2:"m";s:3:"恗";s:2:"n";s:3:"恘";s:2:"o";s:3:"恛";s:2:"p";s:3:"恜";s:2:"q";s:3:"恞";s:2:"r";s:3:"恟";s:2:"s";s:3:"恠";s:2:"t";s:3:"恡";s:2:"u";s:3:"恥";s:2:"v";s:3:"恦";s:2:"w";s:3:"恮";s:2:"x";s:3:"恱";s:2:"y";s:3:"恲";s:2:"z";s:3:"恴";s:2:"{";s:3:"恵";s:2:"|";s:3:"恷";s:2:"}";s:3:"恾";s:2:"~";s:3:"悀";s:2:"";s:3:"悁";s:2:"";s:3:"悂";s:2:"";s:3:"悅";s:2:"";s:3:"悆";s:2:"";s:3:"悇";s:2:"";s:3:"悈";s:2:"";s:3:"悊";s:2:"";s:3:"悋";s:2:"";s:3:"悎";s:2:"";s:3:"悏";s:2:"";s:3:"悐";s:2:"";s:3:"悑";s:2:"";s:3:"悓";s:2:"";s:3:"悕";s:2:"";s:3:"悗";s:2:"";s:3:"悘";s:2:"";s:3:"悙";s:2:"";s:3:"悜";s:2:"";s:3:"悞";s:2:"";s:3:"悡";s:2:"";s:3:"悢";s:2:"";s:3:"悤";s:2:"";s:3:"悥";s:2:"";s:3:"悧";s:2:"";s:3:"悩";s:2:"";s:3:"悪";s:2:"";s:3:"悮";s:2:"";s:3:"悰";s:2:"";s:3:"悳";s:2:"";s:3:"悵";s:2:"";s:3:"悶";s:2:"";s:3:"悷";s:2:"";s:3:"悹";s:2:"";s:3:"悺";s:2:"";s:3:"悽";s:2:"";s:3:"悾";s:2:"";s:3:"悿";s:2:"";s:3:"惀";s:2:"";s:3:"惁";s:2:"";s:3:"惂";s:2:"";s:3:"惃";s:2:"";s:3:"惄";s:2:"";s:3:"惇";s:2:"";s:3:"惈";s:2:"";s:3:"惉";s:2:"";s:3:"惌";s:2:"";s:3:"惍";s:2:"";s:3:"惎";s:2:"";s:3:"惏";s:2:"";s:3:"惐";s:2:"";s:3:"惒";s:2:"";s:3:"惓";s:2:"";s:3:"惔";s:2:"";s:3:"惖";s:2:"";s:3:"惗";s:2:"";s:3:"惙";s:2:"";s:3:"惛";s:2:"";s:3:"惞";s:2:"";s:3:"惡";s:2:"";s:3:"惢";s:2:"";s:3:"惣";s:2:"";s:3:"惤";s:2:"";s:3:"惥";s:2:"";s:3:"惪";s:2:"";s:3:"惱";s:2:"";s:3:"惲";s:2:"";s:3:"惵";s:2:"";s:3:"惷";s:2:"";s:3:"惸";s:2:"";s:3:"惻";s:2:"";s:3:"惼";s:2:"";s:3:"惽";s:2:"";s:3:"惾";s:2:"";s:3:"惿";s:2:"";s:3:"愂";s:2:"";s:3:"愃";s:2:"";s:3:"愄";s:2:"";s:3:"愅";s:2:"";s:3:"愇";s:2:"";s:3:"愊";s:2:"";s:3:"愋";s:2:"";s:3:"愌";s:2:"";s:3:"愐";s:2:"";s:3:"愑";s:2:"";s:3:"愒";s:2:"";s:3:"愓";s:2:"";s:3:"愔";s:2:"";s:3:"愖";s:2:"";s:3:"愗";s:2:"";s:3:"愘";s:2:"";s:3:"愙";s:2:"";s:3:"愛";s:2:"";s:3:"愜";s:2:"";s:3:"愝";s:2:"";s:3:"愞";s:2:"";s:3:"愡";s:2:"";s:3:"愢";s:2:"";s:3:"愥";s:2:"";s:3:"愨";s:2:"";s:3:"愩";s:2:"";s:3:"愪";s:2:"";s:3:"愬";s:2:"";s:3:"愭";s:2:"";s:3:"愮";s:2:"";s:3:"愯";s:2:"";s:3:"愰";s:2:"";s:3:"愱";s:2:"";s:3:"愲";s:2:"";s:3:"愳";s:2:"";s:3:"愴";s:2:"";s:3:"愵";s:2:"";s:3:"愶";s:2:"";s:3:"愷";s:2:"";s:3:"愸";s:2:"";s:3:"愹";s:2:"";s:3:"愺";s:2:"";s:3:"愻";s:2:"";s:3:"愼";s:2:"";s:3:"愽";s:2:"";s:3:"愾";s:2:"";s:3:"慀";s:2:"";s:3:"慁";s:2:"";s:3:"慂";s:2:"";s:3:"慃";s:2:"";s:3:"慄";s:2:"";s:3:"慅";s:2:"";s:3:"慆";s:2:"@";s:3:"慇";s:2:"A";s:3:"慉";s:2:"B";s:3:"態";s:2:"C";s:3:"慍";s:2:"D";s:3:"慏";s:2:"E";s:3:"慐";s:2:"F";s:3:"慒";s:2:"G";s:3:"慓";s:2:"H";s:3:"慔";s:2:"I";s:3:"慖";s:2:"J";s:3:"慗";s:2:"K";s:3:"慘";s:2:"L";s:3:"慙";s:2:"M";s:3:"慚";s:2:"N";s:3:"慛";s:2:"O";s:3:"慜";s:2:"P";s:3:"慞";s:2:"Q";s:3:"慟";s:2:"R";s:3:"慠";s:2:"S";s:3:"慡";s:2:"T";s:3:"慣";s:2:"U";s:3:"慤";s:2:"V";s:3:"慥";s:2:"W";s:3:"慦";s:2:"X";s:3:"慩";s:2:"Y";s:3:"慪";s:2:"Z";s:3:"慫";s:2:"[";s:3:"慬";s:2:"\";s:3:"慭";s:2:"]";s:3:"慮";s:2:"^";s:3:"慯";s:2:"_";s:3:"慱";s:2:"`";s:3:"慲";s:2:"a";s:3:"慳";s:2:"b";s:3:"慴";s:2:"c";s:3:"慶";s:2:"d";s:3:"慸";s:2:"e";s:3:"慹";s:2:"f";s:3:"慺";s:2:"g";s:3:"慻";s:2:"h";s:3:"慼";s:2:"i";s:3:"慽";s:2:"j";s:3:"慾";s:2:"k";s:3:"慿";s:2:"l";s:3:"憀";s:2:"m";s:3:"憁";s:2:"n";s:3:"憂";s:2:"o";s:3:"憃";s:2:"p";s:3:"憄";s:2:"q";s:3:"憅";s:2:"r";s:3:"憆";s:2:"s";s:3:"憇";s:2:"t";s:3:"憈";s:2:"u";s:3:"憉";s:2:"v";s:3:"憊";s:2:"w";s:3:"憌";s:2:"x";s:3:"憍";s:2:"y";s:3:"憏";s:2:"z";s:3:"憐";s:2:"{";s:3:"憑";s:2:"|";s:3:"憒";s:2:"}";s:3:"憓";s:2:"~";s:3:"憕";s:2:"";s:3:"憖";s:2:"";s:3:"憗";s:2:"";s:3:"憘";s:2:"";s:3:"憙";s:2:"";s:3:"憚";s:2:"";s:3:"憛";s:2:"";s:3:"憜";s:2:"";s:3:"憞";s:2:"";s:3:"憟";s:2:"";s:3:"憠";s:2:"";s:3:"憡";s:2:"";s:3:"憢";s:2:"";s:3:"憣";s:2:"";s:3:"憤";s:2:"";s:3:"憥";s:2:"";s:3:"憦";s:2:"";s:3:"憪";s:2:"";s:3:"憫";s:2:"";s:3:"憭";s:2:"";s:3:"憮";s:2:"";s:3:"憯";s:2:"";s:3:"憰";s:2:"";s:3:"憱";s:2:"";s:3:"憲";s:2:"";s:3:"憳";s:2:"";s:3:"憴";s:2:"";s:3:"憵";s:2:"";s:3:"憶";s:2:"";s:3:"憸";s:2:"";s:3:"憹";s:2:"";s:3:"憺";s:2:"";s:3:"憻";s:2:"";s:3:"憼";s:2:"";s:3:"憽";s:2:"";s:3:"憿";s:2:"";s:3:"懀";s:2:"";s:3:"懁";s:2:"";s:3:"懃";s:2:"";s:3:"懄";s:2:"";s:3:"懅";s:2:"";s:3:"懆";s:2:"";s:3:"懇";s:2:"";s:3:"應";s:2:"";s:3:"懌";s:2:"";s:3:"懍";s:2:"";s:3:"懎";s:2:"";s:3:"懏";s:2:"";s:3:"懐";s:2:"";s:3:"懓";s:2:"";s:3:"懕";s:2:"";s:3:"懖";s:2:"";s:3:"懗";s:2:"";s:3:"懘";s:2:"";s:3:"懙";s:2:"";s:3:"懚";s:2:"";s:3:"懛";s:2:"";s:3:"懜";s:2:"";s:3:"懝";s:2:"";s:3:"懞";s:2:"";s:3:"懟";s:2:"";s:3:"懠";s:2:"";s:3:"懡";s:2:"";s:3:"懢";s:2:"";s:3:"懣";s:2:"";s:3:"懤";s:2:"";s:3:"懥";s:2:"";s:3:"懧";s:2:"";s:3:"懨";s:2:"";s:3:"懩";s:2:"";s:3:"懪";s:2:"";s:3:"懫";s:2:"";s:3:"懬";s:2:"";s:3:"懭";s:2:"";s:3:"懮";s:2:"";s:3:"懯";s:2:"";s:3:"懰";s:2:"";s:3:"懱";s:2:"";s:3:"懲";s:2:"";s:3:"懳";s:2:"";s:3:"懴";s:2:"";s:3:"懶";s:2:"";s:3:"懷";s:2:"";s:3:"懸";s:2:"";s:3:"懹";s:2:"";s:3:"懺";s:2:"";s:3:"懻";s:2:"";s:3:"懼";s:2:"";s:3:"懽";s:2:"";s:3:"懾";s:2:"";s:3:"戀";s:2:"";s:3:"戁";s:2:"";s:3:"戂";s:2:"";s:3:"戃";s:2:"";s:3:"戄";s:2:"";s:3:"戅";s:2:"";s:3:"戇";s:2:"";s:3:"戉";s:2:"";s:3:"戓";s:2:"";s:3:"戔";s:2:"";s:3:"戙";s:2:"";s:3:"戜";s:2:"";s:3:"戝";s:2:"";s:3:"戞";s:2:"";s:3:"戠";s:2:"";s:3:"戣";s:2:"";s:3:"戦";s:2:"";s:3:"戧";s:2:"";s:3:"戨";s:2:"";s:3:"戩";s:2:"";s:3:"戫";s:2:"";s:3:"戭";s:2:"";s:3:"戯";s:2:"";s:3:"戰";s:2:"";s:3:"戱";s:2:"";s:3:"戲";s:2:"";s:3:"戵";s:2:"";s:3:"戶";s:2:"";s:3:"戸";s:2:"";s:3:"戹";s:2:"";s:3:"戺";s:2:"";s:3:"戻";s:2:"";s:3:"戼";s:2:"";s:3:"扂";s:2:"";s:3:"扄";s:2:"";s:3:"扅";s:2:"";s:3:"扆";s:2:"";s:3:"扊";s:2:"@";s:3:"扏";s:2:"A";s:3:"扐";s:2:"B";s:3:"払";s:2:"C";s:3:"扖";s:2:"D";s:3:"扗";s:2:"E";s:3:"扙";s:2:"F";s:3:"扚";s:2:"G";s:3:"扜";s:2:"H";s:3:"扝";s:2:"I";s:3:"扞";s:2:"J";s:3:"扟";s:2:"K";s:3:"扠";s:2:"L";s:3:"扡";s:2:"M";s:3:"扢";s:2:"N";s:3:"扤";s:2:"O";s:3:"扥";s:2:"P";s:3:"扨";s:2:"Q";s:3:"扱";s:2:"R";s:3:"扲";s:2:"S";s:3:"扴";s:2:"T";s:3:"扵";s:2:"U";s:3:"扷";s:2:"V";s:3:"扸";s:2:"W";s:3:"扺";s:2:"X";s:3:"扻";s:2:"Y";s:3:"扽";s:2:"Z";s:3:"抁";s:2:"[";s:3:"抂";s:2:"\";s:3:"抃";s:2:"]";s:3:"抅";s:2:"^";s:3:"抆";s:2:"_";s:3:"抇";s:2:"`";s:3:"抈";s:2:"a";s:3:"抋";s:2:"b";s:3:"抌";s:2:"c";s:3:"抍";s:2:"d";s:3:"抎";s:2:"e";s:3:"抏";s:2:"f";s:3:"抐";s:2:"g";s:3:"抔";s:2:"h";s:3:"抙";s:2:"i";s:3:"抜";s:2:"j";s:3:"抝";s:2:"k";s:3:"択";s:2:"l";s:3:"抣";s:2:"m";s:3:"抦";s:2:"n";s:3:"抧";s:2:"o";s:3:"抩";s:2:"p";s:3:"抪";s:2:"q";s:3:"抭";s:2:"r";s:3:"抮";s:2:"s";s:3:"抯";s:2:"t";s:3:"抰";s:2:"u";s:3:"抲";s:2:"v";s:3:"抳";s:2:"w";s:3:"抴";s:2:"x";s:3:"抶";s:2:"y";s:3:"抷";s:2:"z";s:3:"抸";s:2:"{";s:3:"抺";s:2:"|";s:3:"抾";s:2:"}";s:3:"拀";s:2:"~";s:3:"拁";s:2:"";s:3:"拃";s:2:"";s:3:"拋";s:2:"";s:3:"拏";s:2:"";s:3:"拑";s:2:"";s:3:"拕";s:2:"";s:3:"拝";s:2:"";s:3:"拞";s:2:"";s:3:"拠";s:2:"";s:3:"拡";s:2:"";s:3:"拤";s:2:"";s:3:"拪";s:2:"";s:3:"拫";s:2:"";s:3:"拰";s:2:"";s:3:"拲";s:2:"";s:3:"拵";s:2:"";s:3:"拸";s:2:"";s:3:"拹";s:2:"";s:3:"拺";s:2:"";s:3:"拻";s:2:"";s:3:"挀";s:2:"";s:3:"挃";s:2:"";s:3:"挄";s:2:"";s:3:"挅";s:2:"";s:3:"挆";s:2:"";s:3:"挊";s:2:"";s:3:"挋";s:2:"";s:3:"挌";s:2:"";s:3:"挍";s:2:"";s:3:"挏";s:2:"";s:3:"挐";s:2:"";s:3:"挒";s:2:"";s:3:"挓";s:2:"";s:3:"挔";s:2:"";s:3:"挕";s:2:"";s:3:"挗";s:2:"";s:3:"挘";s:2:"";s:3:"挙";s:2:"";s:3:"挜";s:2:"";s:3:"挦";s:2:"";s:3:"挧";s:2:"";s:3:"挩";s:2:"";s:3:"挬";s:2:"";s:3:"挭";s:2:"";s:3:"挮";s:2:"";s:3:"挰";s:2:"";s:3:"挱";s:2:"";s:3:"挳";s:2:"";s:3:"挴";s:2:"";s:3:"挵";s:2:"";s:3:"挶";s:2:"";s:3:"挷";s:2:"";s:3:"挸";s:2:"";s:3:"挻";s:2:"";s:3:"挼";s:2:"";s:3:"挾";s:2:"";s:3:"挿";s:2:"";s:3:"捀";s:2:"";s:3:"捁";s:2:"";s:3:"捄";s:2:"";s:3:"捇";s:2:"";s:3:"捈";s:2:"";s:3:"捊";s:2:"";s:3:"捑";s:2:"";s:3:"捒";s:2:"";s:3:"捓";s:2:"";s:3:"捔";s:2:"";s:3:"捖";s:2:"";s:3:"捗";s:2:"";s:3:"捘";s:2:"";s:3:"捙";s:2:"";s:3:"捚";s:2:"";s:3:"捛";s:2:"";s:3:"捜";s:2:"";s:3:"捝";s:2:"";s:3:"捠";s:2:"";s:3:"捤";s:2:"";s:3:"捥";s:2:"";s:3:"捦";s:2:"";s:3:"捨";s:2:"";s:3:"捪";s:2:"";s:3:"捫";s:2:"";s:3:"捬";s:2:"";s:3:"捯";s:2:"";s:3:"捰";s:2:"";s:3:"捲";s:2:"";s:3:"捳";s:2:"";s:3:"捴";s:2:"";s:3:"捵";s:2:"";s:3:"捸";s:2:"";s:3:"捹";s:2:"";s:3:"捼";s:2:"";s:3:"捽";s:2:"";s:3:"捾";s:2:"";s:3:"捿";s:2:"";s:3:"掁";s:2:"";s:3:"掃";s:2:"";s:3:"掄";s:2:"";s:3:"掅";s:2:"";s:3:"掆";s:2:"";s:3:"掋";s:2:"";s:3:"掍";s:2:"";s:3:"掑";s:2:"";s:3:"掓";s:2:"";s:3:"掔";s:2:"";s:3:"掕";s:2:"";s:3:"掗";s:2:"";s:3:"掙";s:2:"";s:3:"掚";s:2:"";s:3:"掛";s:2:"";s:3:"掜";s:2:"";s:3:"掝";s:2:"";s:3:"掞";s:2:"";s:3:"掟";s:2:"";s:3:"採";s:2:"";s:3:"掤";s:2:"";s:3:"掦";s:2:"";s:3:"掫";s:2:"";s:3:"掯";s:2:"";s:3:"掱";s:2:"";s:3:"掲";s:2:"";s:3:"掵";s:2:"";s:3:"掶";s:2:"";s:3:"掹";s:2:"";s:3:"掻";s:2:"";s:3:"掽";s:2:"";s:3:"掿";s:2:"";s:3:"揀";s:2:"@";s:3:"揁";s:2:"A";s:3:"揂";s:2:"B";s:3:"揃";s:2:"C";s:3:"揅";s:2:"D";s:3:"揇";s:2:"E";s:3:"揈";s:2:"F";s:3:"揊";s:2:"G";s:3:"揋";s:2:"H";s:3:"揌";s:2:"I";s:3:"揑";s:2:"J";s:3:"揓";s:2:"K";s:3:"揔";s:2:"L";s:3:"揕";s:2:"M";s:3:"揗";s:2:"N";s:3:"揘";s:2:"O";s:3:"揙";s:2:"P";s:3:"揚";s:2:"Q";s:3:"換";s:2:"R";s:3:"揜";s:2:"S";s:3:"揝";s:2:"T";s:3:"揟";s:2:"U";s:3:"揢";s:2:"V";s:3:"揤";s:2:"W";s:3:"揥";s:2:"X";s:3:"揦";s:2:"Y";s:3:"揧";s:2:"Z";s:3:"揨";s:2:"[";s:3:"揫";s:2:"\";s:3:"揬";s:2:"]";s:3:"揮";s:2:"^";s:3:"揯";s:2:"_";s:3:"揰";s:2:"`";s:3:"揱";s:2:"a";s:3:"揳";s:2:"b";s:3:"揵";s:2:"c";s:3:"揷";s:2:"d";s:3:"揹";s:2:"e";s:3:"揺";s:2:"f";s:3:"揻";s:2:"g";s:3:"揼";s:2:"h";s:3:"揾";s:2:"i";s:3:"搃";s:2:"j";s:3:"搄";s:2:"k";s:3:"搆";s:2:"l";s:3:"搇";s:2:"m";s:3:"搈";s:2:"n";s:3:"搉";s:2:"o";s:3:"搊";s:2:"p";s:3:"損";s:2:"q";s:3:"搎";s:2:"r";s:3:"搑";s:2:"s";s:3:"搒";s:2:"t";s:3:"搕";s:2:"u";s:3:"搖";s:2:"v";s:3:"搗";s:2:"w";s:3:"搘";s:2:"x";s:3:"搙";s:2:"y";s:3:"搚";s:2:"z";s:3:"搝";s:2:"{";s:3:"搟";s:2:"|";s:3:"搢";s:2:"}";s:3:"搣";s:2:"~";s:3:"搤";s:2:"";s:3:"搥";s:2:"";s:3:"搧";s:2:"";s:3:"搨";s:2:"";s:3:"搩";s:2:"";s:3:"搫";s:2:"";s:3:"搮";s:2:"";s:3:"搯";s:2:"";s:3:"搰";s:2:"";s:3:"搱";s:2:"";s:3:"搲";s:2:"";s:3:"搳";s:2:"";s:3:"搵";s:2:"";s:3:"搶";s:2:"";s:3:"搷";s:2:"";s:3:"搸";s:2:"";s:3:"搹";s:2:"";s:3:"搻";s:2:"";s:3:"搼";s:2:"";s:3:"搾";s:2:"";s:3:"摀";s:2:"";s:3:"摂";s:2:"";s:3:"摃";s:2:"";s:3:"摉";s:2:"";s:3:"摋";s:2:"";s:3:"摌";s:2:"";s:3:"摍";s:2:"";s:3:"摎";s:2:"";s:3:"摏";s:2:"";s:3:"摐";s:2:"";s:3:"摑";s:2:"";s:3:"摓";s:2:"";s:3:"摕";s:2:"";s:3:"摖";s:2:"";s:3:"摗";s:2:"";s:3:"摙";s:2:"";s:3:"摚";s:2:"";s:3:"摛";s:2:"";s:3:"摜";s:2:"";s:3:"摝";s:2:"";s:3:"摟";s:2:"";s:3:"摠";s:2:"";s:3:"摡";s:2:"";s:3:"摢";s:2:"";s:3:"摣";s:2:"";s:3:"摤";s:2:"";s:3:"摥";s:2:"";s:3:"摦";s:2:"";s:3:"摨";s:2:"";s:3:"摪";s:2:"";s:3:"摫";s:2:"";s:3:"摬";s:2:"";s:3:"摮";s:2:"";s:3:"摯";s:2:"";s:3:"摰";s:2:"";s:3:"摱";s:2:"";s:3:"摲";s:2:"";s:3:"摳";s:2:"";s:3:"摴";s:2:"";s:3:"摵";s:2:"";s:3:"摶";s:2:"";s:3:"摷";s:2:"";s:3:"摻";s:2:"";s:3:"摼";s:2:"";s:3:"摽";s:2:"";s:3:"摾";s:2:"";s:3:"摿";s:2:"";s:3:"撀";s:2:"";s:3:"撁";s:2:"";s:3:"撃";s:2:"";s:3:"撆";s:2:"";s:3:"撈";s:2:"";s:3:"撉";s:2:"";s:3:"撊";s:2:"";s:3:"撋";s:2:"";s:3:"撌";s:2:"";s:3:"撍";s:2:"";s:3:"撎";s:2:"";s:3:"撏";s:2:"";s:3:"撐";s:2:"";s:3:"撓";s:2:"";s:3:"撔";s:2:"";s:3:"撗";s:2:"";s:3:"撘";s:2:"";s:3:"撚";s:2:"";s:3:"撛";s:2:"";s:3:"撜";s:2:"";s:3:"撝";s:2:"";s:3:"撟";s:2:"";s:3:"撠";s:2:"";s:3:"撡";s:2:"";s:3:"撢";s:2:"";s:3:"撣";s:2:"";s:3:"撥";s:2:"";s:3:"撦";s:2:"";s:3:"撧";s:2:"";s:3:"撨";s:2:"";s:3:"撪";s:2:"";s:3:"撫";s:2:"";s:3:"撯";s:2:"";s:3:"撱";s:2:"";s:3:"撲";s:2:"";s:3:"撳";s:2:"";s:3:"撴";s:2:"";s:3:"撶";s:2:"";s:3:"撹";s:2:"";s:3:"撻";s:2:"";s:3:"撽";s:2:"";s:3:"撾";s:2:"";s:3:"撿";s:2:"";s:3:"擁";s:2:"";s:3:"擃";s:2:"";s:3:"擄";s:2:"";s:3:"擆";s:2:"";s:3:"擇";s:2:"";s:3:"擈";s:2:"";s:3:"擉";s:2:"";s:3:"擊";s:2:"";s:3:"擋";s:2:"";s:3:"擌";s:2:"";s:3:"擏";s:2:"";s:3:"擑";s:2:"";s:3:"擓";s:2:"";s:3:"擔";s:2:"";s:3:"擕";s:2:"";s:3:"擖";s:2:"";s:3:"擙";s:2:"";s:3:"據";s:2:"@";s:3:"擛";s:2:"A";s:3:"擜";s:2:"B";s:3:"擝";s:2:"C";s:3:"擟";s:2:"D";s:3:"擠";s:2:"E";s:3:"擡";s:2:"F";s:3:"擣";s:2:"G";s:3:"擥";s:2:"H";s:3:"擧";s:2:"I";s:3:"擨";s:2:"J";s:3:"擩";s:2:"K";s:3:"擪";s:2:"L";s:3:"擫";s:2:"M";s:3:"擬";s:2:"N";s:3:"擭";s:2:"O";s:3:"擮";s:2:"P";s:3:"擯";s:2:"Q";s:3:"擰";s:2:"R";s:3:"擱";s:2:"S";s:3:"擲";s:2:"T";s:3:"擳";s:2:"U";s:3:"擴";s:2:"V";s:3:"擵";s:2:"W";s:3:"擶";s:2:"X";s:3:"擷";s:2:"Y";s:3:"擸";s:2:"Z";s:3:"擹";s:2:"[";s:3:"擺";s:2:"\";s:3:"擻";s:2:"]";s:3:"擼";s:2:"^";s:3:"擽";s:2:"_";s:3:"擾";s:2:"`";s:3:"擿";s:2:"a";s:3:"攁";s:2:"b";s:3:"攂";s:2:"c";s:3:"攃";s:2:"d";s:3:"攄";s:2:"e";s:3:"攅";s:2:"f";s:3:"攆";s:2:"g";s:3:"攇";s:2:"h";s:3:"攈";s:2:"i";s:3:"攊";s:2:"j";s:3:"攋";s:2:"k";s:3:"攌";s:2:"l";s:3:"攍";s:2:"m";s:3:"攎";s:2:"n";s:3:"攏";s:2:"o";s:3:"攐";s:2:"p";s:3:"攑";s:2:"q";s:3:"攓";s:2:"r";s:3:"攔";s:2:"s";s:3:"攕";s:2:"t";s:3:"攖";s:2:"u";s:3:"攗";s:2:"v";s:3:"攙";s:2:"w";s:3:"攚";s:2:"x";s:3:"攛";s:2:"y";s:3:"攜";s:2:"z";s:3:"攝";s:2:"{";s:3:"攞";s:2:"|";s:3:"攟";s:2:"}";s:3:"攠";s:2:"~";s:3:"攡";s:2:"";s:3:"攢";s:2:"";s:3:"攣";s:2:"";s:3:"攤";s:2:"";s:3:"攦";s:2:"";s:3:"攧";s:2:"";s:3:"攨";s:2:"";s:3:"攩";s:2:"";s:3:"攪";s:2:"";s:3:"攬";s:2:"";s:3:"攭";s:2:"";s:3:"攰";s:2:"";s:3:"攱";s:2:"";s:3:"攲";s:2:"";s:3:"攳";s:2:"";s:3:"攷";s:2:"";s:3:"攺";s:2:"";s:3:"攼";s:2:"";s:3:"攽";s:2:"";s:3:"敀";s:2:"";s:3:"敁";s:2:"";s:3:"敂";s:2:"";s:3:"敃";s:2:"";s:3:"敄";s:2:"";s:3:"敆";s:2:"";s:3:"敇";s:2:"";s:3:"敊";s:2:"";s:3:"敋";s:2:"";s:3:"敍";s:2:"";s:3:"敎";s:2:"";s:3:"敐";s:2:"";s:3:"敒";s:2:"";s:3:"敓";s:2:"";s:3:"敔";s:2:"";s:3:"敗";s:2:"";s:3:"敘";s:2:"";s:3:"敚";s:2:"";s:3:"敜";s:2:"";s:3:"敟";s:2:"";s:3:"敠";s:2:"";s:3:"敡";s:2:"";s:3:"敤";s:2:"";s:3:"敥";s:2:"";s:3:"敧";s:2:"";s:3:"敨";s:2:"";s:3:"敩";s:2:"";s:3:"敪";s:2:"";s:3:"敭";s:2:"";s:3:"敮";s:2:"";s:3:"敯";s:2:"";s:3:"敱";s:2:"";s:3:"敳";s:2:"";s:3:"敵";s:2:"";s:3:"敶";s:2:"";s:3:"數";s:2:"";s:3:"敹";s:2:"";s:3:"敺";s:2:"";s:3:"敻";s:2:"";s:3:"敼";s:2:"";s:3:"敽";s:2:"";s:3:"敾";s:2:"";s:3:"敿";s:2:"";s:3:"斀";s:2:"";s:3:"斁";s:2:"";s:3:"斂";s:2:"";s:3:"斃";s:2:"";s:3:"斄";s:2:"";s:3:"斅";s:2:"";s:3:"斆";s:2:"";s:3:"斈";s:2:"";s:3:"斉";s:2:"";s:3:"斊";s:2:"";s:3:"斍";s:2:"";s:3:"斎";s:2:"";s:3:"斏";s:2:"";s:3:"斒";s:2:"";s:3:"斔";s:2:"";s:3:"斕";s:2:"";s:3:"斖";s:2:"";s:3:"斘";s:2:"";s:3:"斚";s:2:"";s:3:"斝";s:2:"";s:3:"斞";s:2:"";s:3:"斠";s:2:"";s:3:"斢";s:2:"";s:3:"斣";s:2:"";s:3:"斦";s:2:"";s:3:"斨";s:2:"";s:3:"斪";s:2:"";s:3:"斬";s:2:"";s:3:"斮";s:2:"";s:3:"斱";s:2:"";s:3:"斲";s:2:"";s:3:"斳";s:2:"";s:3:"斴";s:2:"";s:3:"斵";s:2:"";s:3:"斶";s:2:"";s:3:"斷";s:2:"";s:3:"斸";s:2:"";s:3:"斺";s:2:"";s:3:"斻";s:2:"";s:3:"斾";s:2:"";s:3:"斿";s:2:"";s:3:"旀";s:2:"";s:3:"旂";s:2:"";s:3:"旇";s:2:"";s:3:"旈";s:2:"";s:3:"旉";s:2:"";s:3:"旊";s:2:"";s:3:"旍";s:2:"";s:3:"旐";s:2:"";s:3:"旑";s:2:"";s:3:"旓";s:2:"";s:3:"旔";s:2:"";s:3:"旕";s:2:"";s:3:"旘";s:2:"";s:3:"旙";s:2:"";s:3:"旚";s:2:"";s:3:"旛";s:2:"";s:3:"旜";s:2:"";s:3:"旝";s:2:"";s:3:"旞";s:2:"";s:3:"旟";s:2:"";s:3:"旡";s:2:"";s:3:"旣";s:2:"";s:3:"旤";s:2:"";s:3:"旪";s:2:"";s:3:"旫";s:2:"@";s:3:"旲";s:2:"A";s:3:"旳";s:2:"B";s:3:"旴";s:2:"C";s:3:"旵";s:2:"D";s:3:"旸";s:2:"E";s:3:"旹";s:2:"F";s:3:"旻";s:2:"G";s:3:"旼";s:2:"H";s:3:"旽";s:2:"I";s:3:"旾";s:2:"J";s:3:"旿";s:2:"K";s:3:"昁";s:2:"L";s:3:"昄";s:2:"M";s:3:"昅";s:2:"N";s:3:"昇";s:2:"O";s:3:"昈";s:2:"P";s:3:"昉";s:2:"Q";s:3:"昋";s:2:"R";s:3:"昍";s:2:"S";s:3:"昐";s:2:"T";s:3:"昑";s:2:"U";s:3:"昒";s:2:"V";s:3:"昖";s:2:"W";s:3:"昗";s:2:"X";s:3:"昘";s:2:"Y";s:3:"昚";s:2:"Z";s:3:"昛";s:2:"[";s:3:"昜";s:2:"\";s:3:"昞";s:2:"]";s:3:"昡";s:2:"^";s:3:"昢";s:2:"_";s:3:"昣";s:2:"`";s:3:"昤";s:2:"a";s:3:"昦";s:2:"b";s:3:"昩";s:2:"c";s:3:"昪";s:2:"d";s:3:"昫";s:2:"e";s:3:"昬";s:2:"f";s:3:"昮";s:2:"g";s:3:"昰";s:2:"h";s:3:"昲";s:2:"i";s:3:"昳";s:2:"j";s:3:"昷";s:2:"k";s:3:"昸";s:2:"l";s:3:"昹";s:2:"m";s:3:"昺";s:2:"n";s:3:"昻";s:2:"o";s:3:"昽";s:2:"p";s:3:"昿";s:2:"q";s:3:"晀";s:2:"r";s:3:"時";s:2:"s";s:3:"晄";s:2:"t";s:3:"晅";s:2:"u";s:3:"晆";s:2:"v";s:3:"晇";s:2:"w";s:3:"晈";s:2:"x";s:3:"晉";s:2:"y";s:3:"晊";s:2:"z";s:3:"晍";s:2:"{";s:3:"晎";s:2:"|";s:3:"晐";s:2:"}";s:3:"晑";s:2:"~";s:3:"晘";s:2:"";s:3:"晙";s:2:"";s:3:"晛";s:2:"";s:3:"晜";s:2:"";s:3:"晝";s:2:"";s:3:"晞";s:2:"";s:3:"晠";s:2:"";s:3:"晢";s:2:"";s:3:"晣";s:2:"";s:3:"晥";s:2:"";s:3:"晧";s:2:"";s:3:"晩";s:2:"";s:3:"晪";s:2:"";s:3:"晫";s:2:"";s:3:"晬";s:2:"";s:3:"晭";s:2:"";s:3:"晱";s:2:"";s:3:"晲";s:2:"";s:3:"晳";s:2:"";s:3:"晵";s:2:"";s:3:"晸";s:2:"";s:3:"晹";s:2:"";s:3:"晻";s:2:"";s:3:"晼";s:2:"";s:3:"晽";s:2:"";s:3:"晿";s:2:"";s:3:"暀";s:2:"";s:3:"暁";s:2:"";s:3:"暃";s:2:"";s:3:"暅";s:2:"";s:3:"暆";s:2:"";s:3:"暈";s:2:"";s:3:"暉";s:2:"";s:3:"暊";s:2:"";s:3:"暋";s:2:"";s:3:"暍";s:2:"";s:3:"暎";s:2:"";s:3:"暏";s:2:"";s:3:"暐";s:2:"";s:3:"暒";s:2:"";s:3:"暓";s:2:"";s:3:"暔";s:2:"";s:3:"暕";s:2:"";s:3:"暘";s:2:"";s:3:"暙";s:2:"";s:3:"暚";s:2:"";s:3:"暛";s:2:"";s:3:"暜";s:2:"";s:3:"暞";s:2:"";s:3:"暟";s:2:"";s:3:"暠";s:2:"";s:3:"暡";s:2:"";s:3:"暢";s:2:"";s:3:"暣";s:2:"";s:3:"暤";s:2:"";s:3:"暥";s:2:"";s:3:"暦";s:2:"";s:3:"暩";s:2:"";s:3:"暪";s:2:"";s:3:"暫";s:2:"";s:3:"暬";s:2:"";s:3:"暭";s:2:"";s:3:"暯";s:2:"";s:3:"暰";s:2:"";s:3:"暱";s:2:"";s:3:"暲";s:2:"";s:3:"暳";s:2:"";s:3:"暵";s:2:"";s:3:"暶";s:2:"";s:3:"暷";s:2:"";s:3:"暸";s:2:"";s:3:"暺";s:2:"";s:3:"暻";s:2:"";s:3:"暼";s:2:"";s:3:"暽";s:2:"";s:3:"暿";s:2:"";s:3:"曀";s:2:"";s:3:"曁";s:2:"";s:3:"曂";s:2:"";s:3:"曃";s:2:"";s:3:"曄";s:2:"";s:3:"曅";s:2:"";s:3:"曆";s:2:"";s:3:"曇";s:2:"";s:3:"曈";s:2:"";s:3:"曉";s:2:"";s:3:"曊";s:2:"";s:3:"曋";s:2:"";s:3:"曌";s:2:"";s:3:"曍";s:2:"";s:3:"曎";s:2:"";s:3:"曏";s:2:"";s:3:"曐";s:2:"";s:3:"曑";s:2:"";s:3:"曒";s:2:"";s:3:"曓";s:2:"";s:3:"曔";s:2:"";s:3:"曕";s:2:"";s:3:"曖";s:2:"";s:3:"曗";s:2:"";s:3:"曘";s:2:"";s:3:"曚";s:2:"";s:3:"曞";s:2:"";s:3:"曟";s:2:"";s:3:"曠";s:2:"";s:3:"曡";s:2:"";s:3:"曢";s:2:"";s:3:"曣";s:2:"";s:3:"曤";s:2:"";s:3:"曥";s:2:"";s:3:"曧";s:2:"";s:3:"曨";s:2:"";s:3:"曪";s:2:"";s:3:"曫";s:2:"";s:3:"曬";s:2:"";s:3:"曭";s:2:"";s:3:"曮";s:2:"";s:3:"曯";s:2:"";s:3:"曱";s:2:"";s:3:"曵";s:2:"";s:3:"曶";s:2:"";s:3:"書";s:2:"";s:3:"曺";s:2:"";s:3:"曻";s:2:"";s:3:"曽";s:2:"";s:3:"朁";s:2:"";s:3:"朂";s:2:"";s:3:"會";s:2:"@";s:3:"朄";s:2:"A";s:3:"朅";s:2:"B";s:3:"朆";s:2:"C";s:3:"朇";s:2:"D";s:3:"朌";s:2:"E";s:3:"朎";s:2:"F";s:3:"朏";s:2:"G";s:3:"朑";s:2:"H";s:3:"朒";s:2:"I";s:3:"朓";s:2:"J";s:3:"朖";s:2:"K";s:3:"朘";s:2:"L";s:3:"朙";s:2:"M";s:3:"朚";s:2:"N";s:3:"朜";s:2:"O";s:3:"朞";s:2:"P";s:3:"朠";s:2:"Q";s:3:"朡";s:2:"R";s:3:"朢";s:2:"S";s:3:"朣";s:2:"T";s:3:"朤";s:2:"U";s:3:"朥";s:2:"V";s:3:"朧";s:2:"W";s:3:"朩";s:2:"X";s:3:"朮";s:2:"Y";s:3:"朰";s:2:"Z";s:3:"朲";s:2:"[";s:3:"朳";s:2:"\";s:3:"朶";s:2:"]";s:3:"朷";s:2:"^";s:3:"朸";s:2:"_";s:3:"朹";s:2:"`";s:3:"朻";s:2:"a";s:3:"朼";s:2:"b";s:3:"朾";s:2:"c";s:3:"朿";s:2:"d";s:3:"杁";s:2:"e";s:3:"杄";s:2:"f";s:3:"杅";s:2:"g";s:3:"杇";s:2:"h";s:3:"杊";s:2:"i";s:3:"杋";s:2:"j";s:3:"杍";s:2:"k";s:3:"杒";s:2:"l";s:3:"杔";s:2:"m";s:3:"杕";s:2:"n";s:3:"杗";s:2:"o";s:3:"杘";s:2:"p";s:3:"杙";s:2:"q";s:3:"杚";s:2:"r";s:3:"杛";s:2:"s";s:3:"杝";s:2:"t";s:3:"杢";s:2:"u";s:3:"杣";s:2:"v";s:3:"杤";s:2:"w";s:3:"杦";s:2:"x";s:3:"杧";s:2:"y";s:3:"杫";s:2:"z";s:3:"杬";s:2:"{";s:3:"杮";s:2:"|";s:3:"東";s:2:"}";s:3:"杴";s:2:"~";s:3:"杶";s:2:"";s:3:"杸";s:2:"";s:3:"杹";s:2:"";s:3:"杺";s:2:"";s:3:"杻";s:2:"";s:3:"杽";s:2:"";s:3:"枀";s:2:"";s:3:"枂";s:2:"";s:3:"枃";s:2:"";s:3:"枅";s:2:"";s:3:"枆";s:2:"";s:3:"枈";s:2:"";s:3:"枊";s:2:"";s:3:"枌";s:2:"";s:3:"枍";s:2:"";s:3:"枎";s:2:"";s:3:"枏";s:2:"";s:3:"枑";s:2:"";s:3:"枒";s:2:"";s:3:"枓";s:2:"";s:3:"枔";s:2:"";s:3:"枖";s:2:"";s:3:"枙";s:2:"";s:3:"枛";s:2:"";s:3:"枟";s:2:"";s:3:"枠";s:2:"";s:3:"枡";s:2:"";s:3:"枤";s:2:"";s:3:"枦";s:2:"";s:3:"枩";s:2:"";s:3:"枬";s:2:"";s:3:"枮";s:2:"";s:3:"枱";s:2:"";s:3:"枲";s:2:"";s:3:"枴";s:2:"";s:3:"枹";s:2:"";s:3:"枺";s:2:"";s:3:"枻";s:2:"";s:3:"枼";s:2:"";s:3:"枽";s:2:"";s:3:"枾";s:2:"";s:3:"枿";s:2:"";s:3:"柀";s:2:"";s:3:"柂";s:2:"";s:3:"柅";s:2:"";s:3:"柆";s:2:"";s:3:"柇";s:2:"";s:3:"柈";s:2:"";s:3:"柉";s:2:"";s:3:"柊";s:2:"";s:3:"柋";s:2:"";s:3:"柌";s:2:"";s:3:"柍";s:2:"";s:3:"柎";s:2:"";s:3:"柕";s:2:"";s:3:"柖";s:2:"";s:3:"柗";s:2:"";s:3:"柛";s:2:"";s:3:"柟";s:2:"";s:3:"柡";s:2:"";s:3:"柣";s:2:"";s:3:"柤";s:2:"";s:3:"柦";s:2:"";s:3:"柧";s:2:"";s:3:"柨";s:2:"";s:3:"柪";s:2:"";s:3:"柫";s:2:"";s:3:"柭";s:2:"";s:3:"柮";s:2:"";s:3:"柲";s:2:"";s:3:"柵";s:2:"";s:3:"柶";s:2:"";s:3:"柷";s:2:"";s:3:"柸";s:2:"";s:3:"柹";s:2:"";s:3:"柺";s:2:"";s:3:"査";s:2:"";s:3:"柼";s:2:"";s:3:"柾";s:2:"";s:3:"栁";s:2:"";s:3:"栂";s:2:"";s:3:"栃";s:2:"";s:3:"栄";s:2:"";s:3:"栆";s:2:"";s:3:"栍";s:2:"";s:3:"栐";s:2:"";s:3:"栒";s:2:"";s:3:"栔";s:2:"";s:3:"栕";s:2:"";s:3:"栘";s:2:"";s:3:"栙";s:2:"";s:3:"栚";s:2:"";s:3:"栛";s:2:"";s:3:"栜";s:2:"";s:3:"栞";s:2:"";s:3:"栟";s:2:"";s:3:"栠";s:2:"";s:3:"栢";s:2:"";s:3:"栣";s:2:"";s:3:"栤";s:2:"";s:3:"栥";s:2:"";s:3:"栦";s:2:"";s:3:"栧";s:2:"";s:3:"栨";s:2:"";s:3:"栫";s:2:"";s:3:"栬";s:2:"";s:3:"栭";s:2:"";s:3:"栮";s:2:"";s:3:"栯";s:2:"";s:3:"栰";s:2:"";s:3:"栱";s:2:"";s:3:"栴";s:2:"";s:3:"栵";s:2:"";s:3:"栶";s:2:"";s:3:"栺";s:2:"";s:3:"栻";s:2:"";s:3:"栿";s:2:"";s:3:"桇";s:2:"";s:3:"桋";s:2:"";s:3:"桍";s:2:"";s:3:"桏";s:2:"";s:3:"桒";s:2:"";s:3:"桖";s:2:"";s:3:"桗";s:2:"";s:3:"桘";s:2:"";s:3:"桙";s:2:"";s:3:"桚";s:2:"";s:3:"桛";s:2:"@";s:3:"桜";s:2:"A";s:3:"桝";s:2:"B";s:3:"桞";s:2:"C";s:3:"桟";s:2:"D";s:3:"桪";s:2:"E";s:3:"桬";s:2:"F";s:3:"桭";s:2:"G";s:3:"桮";s:2:"H";s:3:"桯";s:2:"I";s:3:"桰";s:2:"J";s:3:"桱";s:2:"K";s:3:"桲";s:2:"L";s:3:"桳";s:2:"M";s:3:"桵";s:2:"N";s:3:"桸";s:2:"O";s:3:"桹";s:2:"P";s:3:"桺";s:2:"Q";s:3:"桻";s:2:"R";s:3:"桼";s:2:"S";s:3:"桽";s:2:"T";s:3:"桾";s:2:"U";s:3:"桿";s:2:"V";s:3:"梀";s:2:"W";s:3:"梂";s:2:"X";s:3:"梄";s:2:"Y";s:3:"梇";s:2:"Z";s:3:"梈";s:2:"[";s:3:"梉";s:2:"\";s:3:"梊";s:2:"]";s:3:"梋";s:2:"^";s:3:"梌";s:2:"_";s:3:"梍";s:2:"`";s:3:"梎";s:2:"a";s:3:"梐";s:2:"b";s:3:"梑";s:2:"c";s:3:"梒";s:2:"d";s:3:"梔";s:2:"e";s:3:"梕";s:2:"f";s:3:"梖";s:2:"g";s:3:"梘";s:2:"h";s:3:"梙";s:2:"i";s:3:"梚";s:2:"j";s:3:"梛";s:2:"k";s:3:"梜";s:2:"l";s:3:"條";s:2:"m";s:3:"梞";s:2:"n";s:3:"梟";s:2:"o";s:3:"梠";s:2:"p";s:3:"梡";s:2:"q";s:3:"梣";s:2:"r";s:3:"梤";s:2:"s";s:3:"梥";s:2:"t";s:3:"梩";s:2:"u";s:3:"梪";s:2:"v";s:3:"梫";s:2:"w";s:3:"梬";s:2:"x";s:3:"梮";s:2:"y";s:3:"梱";s:2:"z";s:3:"梲";s:2:"{";s:3:"梴";s:2:"|";s:3:"梶";s:2:"}";s:3:"梷";s:2:"~";s:3:"梸";s:2:"";s:3:"梹";s:2:"";s:3:"梺";s:2:"";s:3:"梻";s:2:"";s:3:"梼";s:2:"";s:3:"梽";s:2:"";s:3:"梾";s:2:"";s:3:"梿";s:2:"";s:3:"棁";s:2:"";s:3:"棃";s:2:"";s:3:"棄";s:2:"";s:3:"棅";s:2:"";s:3:"棆";s:2:"";s:3:"棇";s:2:"";s:3:"棈";s:2:"";s:3:"棊";s:2:"";s:3:"棌";s:2:"";s:3:"棎";s:2:"";s:3:"棏";s:2:"";s:3:"棐";s:2:"";s:3:"棑";s:2:"";s:3:"棓";s:2:"";s:3:"棔";s:2:"";s:3:"棖";s:2:"";s:3:"棗";s:2:"";s:3:"棙";s:2:"";s:3:"棛";s:2:"";s:3:"棜";s:2:"";s:3:"棝";s:2:"";s:3:"棞";s:2:"";s:3:"棟";s:2:"";s:3:"棡";s:2:"";s:3:"棢";s:2:"";s:3:"棤";s:2:"";s:3:"棥";s:2:"";s:3:"棦";s:2:"";s:3:"棧";s:2:"";s:3:"棨";s:2:"";s:3:"棩";s:2:"";s:3:"棪";s:2:"";s:3:"棫";s:2:"";s:3:"棬";s:2:"";s:3:"棭";s:2:"";s:3:"棯";s:2:"";s:3:"棲";s:2:"";s:3:"棳";s:2:"";s:3:"棴";s:2:"";s:3:"棶";s:2:"";s:3:"棷";s:2:"";s:3:"棸";s:2:"";s:3:"棻";s:2:"";s:3:"棽";s:2:"";s:3:"棾";s:2:"";s:3:"棿";s:2:"";s:3:"椀";s:2:"";s:3:"椂";s:2:"";s:3:"椃";s:2:"";s:3:"椄";s:2:"";s:3:"椆";s:2:"";s:3:"椇";s:2:"";s:3:"椈";s:2:"";s:3:"椉";s:2:"";s:3:"椊";s:2:"";s:3:"椌";s:2:"";s:3:"椏";s:2:"";s:3:"椑";s:2:"";s:3:"椓";s:2:"";s:3:"椔";s:2:"";s:3:"椕";s:2:"";s:3:"椖";s:2:"";s:3:"椗";s:2:"";s:3:"椘";s:2:"";s:3:"椙";s:2:"";s:3:"椚";s:2:"";s:3:"椛";s:2:"";s:3:"検";s:2:"";s:3:"椝";s:2:"";s:3:"椞";s:2:"";s:3:"椡";s:2:"";s:3:"椢";s:2:"";s:3:"椣";s:2:"";s:3:"椥";s:2:"";s:3:"椦";s:2:"";s:3:"椧";s:2:"";s:3:"椨";s:2:"";s:3:"椩";s:2:"";s:3:"椪";s:2:"";s:3:"椫";s:2:"";s:3:"椬";s:2:"";s:3:"椮";s:2:"";s:3:"椯";s:2:"";s:3:"椱";s:2:"";s:3:"椲";s:2:"";s:3:"椳";s:2:"";s:3:"椵";s:2:"";s:3:"椶";s:2:"";s:3:"椷";s:2:"";s:3:"椸";s:2:"";s:3:"椺";s:2:"";s:3:"椻";s:2:"";s:3:"椼";s:2:"";s:3:"椾";s:2:"";s:3:"楀";s:2:"";s:3:"楁";s:2:"";s:3:"楃";s:2:"";s:3:"楄";s:2:"";s:3:"楅";s:2:"";s:3:"楆";s:2:"";s:3:"楇";s:2:"";s:3:"楈";s:2:"";s:3:"楉";s:2:"";s:3:"楊";s:2:"";s:3:"楋";s:2:"";s:3:"楌";s:2:"";s:3:"楍";s:2:"";s:3:"楎";s:2:"";s:3:"楏";s:2:"";s:3:"楐";s:2:"";s:3:"楑";s:2:"";s:3:"楒";s:2:"";s:3:"楓";s:2:"";s:3:"楕";s:2:"";s:3:"楖";s:2:"";s:3:"楘";s:2:"";s:3:"楙";s:2:"";s:3:"楛";s:2:"";s:3:"楜";s:2:"";s:3:"楟";s:2:"@";s:3:"楡";s:2:"A";s:3:"楢";s:2:"B";s:3:"楤";s:2:"C";s:3:"楥";s:2:"D";s:3:"楧";s:2:"E";s:3:"楨";s:2:"F";s:3:"楩";s:2:"G";s:3:"楪";s:2:"H";s:3:"楬";s:2:"I";s:3:"業";s:2:"J";s:3:"楯";s:2:"K";s:3:"楰";s:2:"L";s:3:"楲";s:2:"M";s:3:"楳";s:2:"N";s:3:"楴";s:2:"O";s:3:"極";s:2:"P";s:3:"楶";s:2:"Q";s:3:"楺";s:2:"R";s:3:"楻";s:2:"S";s:3:"楽";s:2:"T";s:3:"楾";s:2:"U";s:3:"楿";s:2:"V";s:3:"榁";s:2:"W";s:3:"榃";s:2:"X";s:3:"榅";s:2:"Y";s:3:"榊";s:2:"Z";s:3:"榋";s:2:"[";s:3:"榌";s:2:"\";s:3:"榎";s:2:"]";s:3:"榏";s:2:"^";s:3:"榐";s:2:"_";s:3:"榑";s:2:"`";s:3:"榒";s:2:"a";s:3:"榓";s:2:"b";s:3:"榖";s:2:"c";s:3:"榗";s:2:"d";s:3:"榙";s:2:"e";s:3:"榚";s:2:"f";s:3:"榝";s:2:"g";s:3:"榞";s:2:"h";s:3:"榟";s:2:"i";s:3:"榠";s:2:"j";s:3:"榡";s:2:"k";s:3:"榢";s:2:"l";s:3:"榣";s:2:"m";s:3:"榤";s:2:"n";s:3:"榥";s:2:"o";s:3:"榦";s:2:"p";s:3:"榩";s:2:"q";s:3:"榪";s:2:"r";s:3:"榬";s:2:"s";s:3:"榮";s:2:"t";s:3:"榯";s:2:"u";s:3:"榰";s:2:"v";s:3:"榲";s:2:"w";s:3:"榳";s:2:"x";s:3:"榵";s:2:"y";s:3:"榶";s:2:"z";s:3:"榸";s:2:"{";s:3:"榹";s:2:"|";s:3:"榺";s:2:"}";s:3:"榼";s:2:"~";s:3:"榽";s:2:"";s:3:"榾";s:2:"";s:3:"榿";s:2:"";s:3:"槀";s:2:"";s:3:"槂";s:2:"";s:3:"槃";s:2:"";s:3:"槄";s:2:"";s:3:"槅";s:2:"";s:3:"槆";s:2:"";s:3:"槇";s:2:"";s:3:"槈";s:2:"";s:3:"槉";s:2:"";s:3:"構";s:2:"";s:3:"槍";s:2:"";s:3:"槏";s:2:"";s:3:"槑";s:2:"";s:3:"槒";s:2:"";s:3:"槓";s:2:"";s:3:"槕";s:2:"";s:3:"槖";s:2:"";s:3:"槗";s:2:"";s:3:"様";s:2:"";s:3:"槙";s:2:"";s:3:"槚";s:2:"";s:3:"槜";s:2:"";s:3:"槝";s:2:"";s:3:"槞";s:2:"";s:3:"槡";s:2:"";s:3:"槢";s:2:"";s:3:"槣";s:2:"";s:3:"槤";s:2:"";s:3:"槥";s:2:"";s:3:"槦";s:2:"";s:3:"槧";s:2:"";s:3:"槨";s:2:"";s:3:"槩";s:2:"";s:3:"槪";s:2:"";s:3:"槫";s:2:"";s:3:"槬";s:2:"";s:3:"槮";s:2:"";s:3:"槯";s:2:"";s:3:"槰";s:2:"";s:3:"槱";s:2:"";s:3:"槳";s:2:"";s:3:"槴";s:2:"";s:3:"槵";s:2:"";s:3:"槶";s:2:"";s:3:"槷";s:2:"";s:3:"槸";s:2:"";s:3:"槹";s:2:"";s:3:"槺";s:2:"";s:3:"槻";s:2:"";s:3:"槼";s:2:"";s:3:"槾";s:2:"";s:3:"樀";s:2:"";s:3:"樁";s:2:"";s:3:"樂";s:2:"";s:3:"樃";s:2:"";s:3:"樄";s:2:"";s:3:"樅";s:2:"";s:3:"樆";s:2:"";s:3:"樇";s:2:"";s:3:"樈";s:2:"";s:3:"樉";s:2:"";s:3:"樋";s:2:"";s:3:"樌";s:2:"";s:3:"樍";s:2:"";s:3:"樎";s:2:"";s:3:"樏";s:2:"";s:3:"樐";s:2:"";s:3:"樑";s:2:"";s:3:"樒";s:2:"";s:3:"樓";s:2:"";s:3:"樔";s:2:"";s:3:"樕";s:2:"";s:3:"樖";s:2:"";s:3:"標";s:2:"";s:3:"樚";s:2:"";s:3:"樛";s:2:"";s:3:"樜";s:2:"";s:3:"樝";s:2:"";s:3:"樞";s:2:"";s:3:"樠";s:2:"";s:3:"樢";s:2:"";s:3:"樣";s:2:"";s:3:"樤";s:2:"";s:3:"樥";s:2:"";s:3:"樦";s:2:"";s:3:"樧";s:2:"";s:3:"権";s:2:"";s:3:"樫";s:2:"";s:3:"樬";s:2:"";s:3:"樭";s:2:"";s:3:"樮";s:2:"";s:3:"樰";s:2:"";s:3:"樲";s:2:"";s:3:"樳";s:2:"";s:3:"樴";s:2:"";s:3:"樶";s:2:"";s:3:"樷";s:2:"";s:3:"樸";s:2:"";s:3:"樹";s:2:"";s:3:"樺";s:2:"";s:3:"樻";s:2:"";s:3:"樼";s:2:"";s:3:"樿";s:2:"";s:3:"橀";s:2:"";s:3:"橁";s:2:"";s:3:"橂";s:2:"";s:3:"橃";s:2:"";s:3:"橅";s:2:"";s:3:"橆";s:2:"";s:3:"橈";s:2:"";s:3:"橉";s:2:"";s:3:"橊";s:2:"";s:3:"橋";s:2:"";s:3:"橌";s:2:"";s:3:"橍";s:2:"";s:3:"橎";s:2:"";s:3:"橏";s:2:"";s:3:"橑";s:2:"";s:3:"橒";s:2:"";s:3:"橓";s:2:"";s:3:"橔";s:2:"";s:3:"橕";s:2:"";s:3:"橖";s:2:"";s:3:"橗";s:2:"";s:3:"橚";s:2:"@";s:3:"橜";s:2:"A";s:3:"橝";s:2:"B";s:3:"橞";s:2:"C";s:3:"機";s:2:"D";s:3:"橠";s:2:"E";s:3:"橢";s:2:"F";s:3:"橣";s:2:"G";s:3:"橤";s:2:"H";s:3:"橦";s:2:"I";s:3:"橧";s:2:"J";s:3:"橨";s:2:"K";s:3:"橩";s:2:"L";s:3:"橪";s:2:"M";s:3:"橫";s:2:"N";s:3:"橬";s:2:"O";s:3:"橭";s:2:"P";s:3:"橮";s:2:"Q";s:3:"橯";s:2:"R";s:3:"橰";s:2:"S";s:3:"橲";s:2:"T";s:3:"橳";s:2:"U";s:3:"橴";s:2:"V";s:3:"橵";s:2:"W";s:3:"橶";s:2:"X";s:3:"橷";s:2:"Y";s:3:"橸";s:2:"Z";s:3:"橺";s:2:"[";s:3:"橻";s:2:"\";s:3:"橽";s:2:"]";s:3:"橾";s:2:"^";s:3:"橿";s:2:"_";s:3:"檁";s:2:"`";s:3:"檂";s:2:"a";s:3:"檃";s:2:"b";s:3:"檅";s:2:"c";s:3:"檆";s:2:"d";s:3:"檇";s:2:"e";s:3:"檈";s:2:"f";s:3:"檉";s:2:"g";s:3:"檊";s:2:"h";s:3:"檋";s:2:"i";s:3:"檌";s:2:"j";s:3:"檍";s:2:"k";s:3:"檏";s:2:"l";s:3:"檒";s:2:"m";s:3:"檓";s:2:"n";s:3:"檔";s:2:"o";s:3:"檕";s:2:"p";s:3:"檖";s:2:"q";s:3:"檘";s:2:"r";s:3:"檙";s:2:"s";s:3:"檚";s:2:"t";s:3:"檛";s:2:"u";s:3:"檜";s:2:"v";s:3:"檝";s:2:"w";s:3:"檞";s:2:"x";s:3:"檟";s:2:"y";s:3:"檡";s:2:"z";s:3:"檢";s:2:"{";s:3:"檣";s:2:"|";s:3:"檤";s:2:"}";s:3:"檥";s:2:"~";s:3:"檦";s:2:"";s:3:"檧";s:2:"";s:3:"檨";s:2:"";s:3:"檪";s:2:"";s:3:"檭";s:2:"";s:3:"檮";s:2:"";s:3:"檯";s:2:"";s:3:"檰";s:2:"";s:3:"檱";s:2:"";s:3:"檲";s:2:"";s:3:"檳";s:2:"";s:3:"檴";s:2:"";s:3:"檵";s:2:"";s:3:"檶";s:2:"";s:3:"檷";s:2:"";s:3:"檸";s:2:"";s:3:"檹";s:2:"";s:3:"檺";s:2:"";s:3:"檻";s:2:"";s:3:"檼";s:2:"";s:3:"檽";s:2:"";s:3:"檾";s:2:"";s:3:"檿";s:2:"";s:3:"櫀";s:2:"";s:3:"櫁";s:2:"";s:3:"櫂";s:2:"";s:3:"櫃";s:2:"";s:3:"櫄";s:2:"";s:3:"櫅";s:2:"";s:3:"櫆";s:2:"";s:3:"櫇";s:2:"";s:3:"櫈";s:2:"";s:3:"櫉";s:2:"";s:3:"櫊";s:2:"";s:3:"櫋";s:2:"";s:3:"櫌";s:2:"";s:3:"櫍";s:2:"";s:3:"櫎";s:2:"";s:3:"櫏";s:2:"";s:3:"櫐";s:2:"";s:3:"櫑";s:2:"";s:3:"櫒";s:2:"";s:3:"櫓";s:2:"";s:3:"櫔";s:2:"";s:3:"櫕";s:2:"";s:3:"櫖";s:2:"";s:3:"櫗";s:2:"";s:3:"櫘";s:2:"";s:3:"櫙";s:2:"";s:3:"櫚";s:2:"";s:3:"櫛";s:2:"";s:3:"櫜";s:2:"";s:3:"櫝";s:2:"";s:3:"櫞";s:2:"";s:3:"櫟";s:2:"";s:3:"櫠";s:2:"";s:3:"櫡";s:2:"";s:3:"櫢";s:2:"";s:3:"櫣";s:2:"";s:3:"櫤";s:2:"";s:3:"櫥";s:2:"";s:3:"櫦";s:2:"";s:3:"櫧";s:2:"";s:3:"櫨";s:2:"";s:3:"櫩";s:2:"";s:3:"櫪";s:2:"";s:3:"櫫";s:2:"";s:3:"櫬";s:2:"";s:3:"櫭";s:2:"";s:3:"櫮";s:2:"";s:3:"櫯";s:2:"";s:3:"櫰";s:2:"";s:3:"櫱";s:2:"";s:3:"櫲";s:2:"";s:3:"櫳";s:2:"";s:3:"櫴";s:2:"";s:3:"櫵";s:2:"";s:3:"櫶";s:2:"";s:3:"櫷";s:2:"";s:3:"櫸";s:2:"";s:3:"櫹";s:2:"";s:3:"櫺";s:2:"";s:3:"櫻";s:2:"";s:3:"櫼";s:2:"";s:3:"櫽";s:2:"";s:3:"櫾";s:2:"";s:3:"櫿";s:2:"";s:3:"欀";s:2:"";s:3:"欁";s:2:"";s:3:"欂";s:2:"";s:3:"欃";s:2:"";s:3:"欄";s:2:"";s:3:"欅";s:2:"";s:3:"欆";s:2:"";s:3:"欇";s:2:"";s:3:"欈";s:2:"";s:3:"欉";s:2:"";s:3:"權";s:2:"";s:3:"欋";s:2:"";s:3:"欌";s:2:"";s:3:"欍";s:2:"";s:3:"欎";s:2:"";s:3:"欏";s:2:"";s:3:"欐";s:2:"";s:3:"欑";s:2:"";s:3:"欒";s:2:"";s:3:"欓";s:2:"";s:3:"欔";s:2:"";s:3:"欕";s:2:"";s:3:"欖";s:2:"";s:3:"欗";s:2:"";s:3:"欘";s:2:"";s:3:"欙";s:2:"";s:3:"欚";s:2:"";s:3:"欛";s:2:"";s:3:"欜";s:2:"";s:3:"欝";s:2:"";s:3:"欞";s:2:"";s:3:"欟";s:2:"";s:3:"欥";s:2:"";s:3:"欦";s:2:"";s:3:"欨";s:2:"";s:3:"欩";s:2:"";s:3:"欪";s:2:"";s:3:"欫";s:2:"";s:3:"欬";s:2:"";s:3:"欭";s:2:"";s:3:"欮";s:2:"@";s:3:"欯";s:2:"A";s:3:"欰";s:2:"B";s:3:"欱";s:2:"C";s:3:"欳";s:2:"D";s:3:"欴";s:2:"E";s:3:"欵";s:2:"F";s:3:"欶";s:2:"G";s:3:"欸";s:2:"H";s:3:"欻";s:2:"I";s:3:"欼";s:2:"J";s:3:"欽";s:2:"K";s:3:"欿";s:2:"L";s:3:"歀";s:2:"M";s:3:"歁";s:2:"N";s:3:"歂";s:2:"O";s:3:"歄";s:2:"P";s:3:"歅";s:2:"Q";s:3:"歈";s:2:"R";s:3:"歊";s:2:"S";s:3:"歋";s:2:"T";s:3:"歍";s:2:"U";s:3:"歎";s:2:"V";s:3:"歏";s:2:"W";s:3:"歐";s:2:"X";s:3:"歑";s:2:"Y";s:3:"歒";s:2:"Z";s:3:"歓";s:2:"[";s:3:"歔";s:2:"\";s:3:"歕";s:2:"]";s:3:"歖";s:2:"^";s:3:"歗";s:2:"_";s:3:"歘";s:2:"`";s:3:"歚";s:2:"a";s:3:"歛";s:2:"b";s:3:"歜";s:2:"c";s:3:"歝";s:2:"d";s:3:"歞";s:2:"e";s:3:"歟";s:2:"f";s:3:"歠";s:2:"g";s:3:"歡";s:2:"h";s:3:"歨";s:2:"i";s:3:"歩";s:2:"j";s:3:"歫";s:2:"k";s:3:"歬";s:2:"l";s:3:"歭";s:2:"m";s:3:"歮";s:2:"n";s:3:"歯";s:2:"o";s:3:"歰";s:2:"p";s:3:"歱";s:2:"q";s:3:"歲";s:2:"r";s:3:"歳";s:2:"s";s:3:"歴";s:2:"t";s:3:"歵";s:2:"u";s:3:"歶";s:2:"v";s:3:"歷";s:2:"w";s:3:"歸";s:2:"x";s:3:"歺";s:2:"y";s:3:"歽";s:2:"z";s:3:"歾";s:2:"{";s:3:"歿";s:2:"|";s:3:"殀";s:2:"}";s:3:"殅";s:2:"~";s:3:"殈";s:2:"";s:3:"殌";s:2:"";s:3:"殎";s:2:"";s:3:"殏";s:2:"";s:3:"殐";s:2:"";s:3:"殑";s:2:"";s:3:"殔";s:2:"";s:3:"殕";s:2:"";s:3:"殗";s:2:"";s:3:"殘";s:2:"";s:3:"殙";s:2:"";s:3:"殜";s:2:"";s:3:"殝";s:2:"";s:3:"殞";s:2:"";s:3:"殟";s:2:"";s:3:"殠";s:2:"";s:3:"殢";s:2:"";s:3:"殣";s:2:"";s:3:"殤";s:2:"";s:3:"殥";s:2:"";s:3:"殦";s:2:"";s:3:"殧";s:2:"";s:3:"殨";s:2:"";s:3:"殩";s:2:"";s:3:"殫";s:2:"";s:3:"殬";s:2:"";s:3:"殭";s:2:"";s:3:"殮";s:2:"";s:3:"殯";s:2:"";s:3:"殰";s:2:"";s:3:"殱";s:2:"";s:3:"殲";s:2:"";s:3:"殶";s:2:"";s:3:"殸";s:2:"";s:3:"殹";s:2:"";s:3:"殺";s:2:"";s:3:"殻";s:2:"";s:3:"殼";s:2:"";s:3:"殽";s:2:"";s:3:"殾";s:2:"";s:3:"毀";s:2:"";s:3:"毃";s:2:"";s:3:"毄";s:2:"";s:3:"毆";s:2:"";s:3:"毇";s:2:"";s:3:"毈";s:2:"";s:3:"毉";s:2:"";s:3:"毊";s:2:"";s:3:"毌";s:2:"";s:3:"毎";s:2:"";s:3:"毐";s:2:"";s:3:"毑";s:2:"";s:3:"毘";s:2:"";s:3:"毚";s:2:"";s:3:"毜";s:2:"";s:3:"毝";s:2:"";s:3:"毞";s:2:"";s:3:"毟";s:2:"";s:3:"毠";s:2:"";s:3:"毢";s:2:"";s:3:"毣";s:2:"";s:3:"毤";s:2:"";s:3:"毥";s:2:"";s:3:"毦";s:2:"";s:3:"毧";s:2:"";s:3:"毨";s:2:"";s:3:"毩";s:2:"";s:3:"毬";s:2:"";s:3:"毭";s:2:"";s:3:"毮";s:2:"";s:3:"毰";s:2:"";s:3:"毱";s:2:"";s:3:"毲";s:2:"";s:3:"毴";s:2:"";s:3:"毶";s:2:"";s:3:"毷";s:2:"";s:3:"毸";s:2:"";s:3:"毺";s:2:"";s:3:"毻";s:2:"";s:3:"毼";s:2:"";s:3:"毾";s:2:"";s:3:"毿";s:2:"";s:3:"氀";s:2:"";s:3:"氁";s:2:"";s:3:"氂";s:2:"";s:3:"氃";s:2:"";s:3:"氄";s:2:"";s:3:"氈";s:2:"";s:3:"氉";s:2:"";s:3:"氊";s:2:"";s:3:"氋";s:2:"";s:3:"氌";s:2:"";s:3:"氎";s:2:"";s:3:"氒";s:2:"";s:3:"気";s:2:"";s:3:"氜";s:2:"";s:3:"氝";s:2:"";s:3:"氞";s:2:"";s:3:"氠";s:2:"";s:3:"氣";s:2:"";s:3:"氥";s:2:"";s:3:"氫";s:2:"";s:3:"氬";s:2:"";s:3:"氭";s:2:"";s:3:"氱";s:2:"";s:3:"氳";s:2:"";s:3:"氶";s:2:"";s:3:"氷";s:2:"";s:3:"氹";s:2:"";s:3:"氺";s:2:"";s:3:"氻";s:2:"";s:3:"氼";s:2:"";s:3:"氾";s:2:"";s:3:"氿";s:2:"";s:3:"汃";s:2:"";s:3:"汄";s:2:"";s:3:"汅";s:2:"";s:3:"汈";s:2:"";s:3:"汋";s:2:"";s:3:"汌";s:2:"";s:3:"汍";s:2:"";s:3:"汎";s:2:"";s:3:"汏";s:2:"";s:3:"汑";s:2:"";s:3:"汒";s:2:"";s:3:"汓";s:2:"";s:3:"汖";s:2:"";s:3:"汘";s:2:"@";s:3:"汙";s:2:"A";s:3:"汚";s:2:"B";s:3:"汢";s:2:"C";s:3:"汣";s:2:"D";s:3:"汥";s:2:"E";s:3:"汦";s:2:"F";s:3:"汧";s:2:"G";s:3:"汫";s:2:"H";s:3:"汬";s:2:"I";s:3:"汭";s:2:"J";s:3:"汮";s:2:"K";s:3:"汯";s:2:"L";s:3:"汱";s:2:"M";s:3:"汳";s:2:"N";s:3:"汵";s:2:"O";s:3:"汷";s:2:"P";s:3:"汸";s:2:"Q";s:3:"決";s:2:"R";s:3:"汻";s:2:"S";s:3:"汼";s:2:"T";s:3:"汿";s:2:"U";s:3:"沀";s:2:"V";s:3:"沄";s:2:"W";s:3:"沇";s:2:"X";s:3:"沊";s:2:"Y";s:3:"沋";s:2:"Z";s:3:"沍";s:2:"[";s:3:"沎";s:2:"\";s:3:"沑";s:2:"]";s:3:"沒";s:2:"^";s:3:"沕";s:2:"_";s:3:"沖";s:2:"`";s:3:"沗";s:2:"a";s:3:"沘";s:2:"b";s:3:"沚";s:2:"c";s:3:"沜";s:2:"d";s:3:"沝";s:2:"e";s:3:"沞";s:2:"f";s:3:"沠";s:2:"g";s:3:"沢";s:2:"h";s:3:"沨";s:2:"i";s:3:"沬";s:2:"j";s:3:"沯";s:2:"k";s:3:"沰";s:2:"l";s:3:"沴";s:2:"m";s:3:"沵";s:2:"n";s:3:"沶";s:2:"o";s:3:"沷";s:2:"p";s:3:"沺";s:2:"q";s:3:"泀";s:2:"r";s:3:"況";s:2:"s";s:3:"泂";s:2:"t";s:3:"泃";s:2:"u";s:3:"泆";s:2:"v";s:3:"泇";s:2:"w";s:3:"泈";s:2:"x";s:3:"泋";s:2:"y";s:3:"泍";s:2:"z";s:3:"泎";s:2:"{";s:3:"泏";s:2:"|";s:3:"泑";s:2:"}";s:3:"泒";s:2:"~";s:3:"泘";s:2:"";s:3:"泙";s:2:"";s:3:"泚";s:2:"";s:3:"泜";s:2:"";s:3:"泝";s:2:"";s:3:"泟";s:2:"";s:3:"泤";s:2:"";s:3:"泦";s:2:"";s:3:"泧";s:2:"";s:3:"泩";s:2:"";s:3:"泬";s:2:"";s:3:"泭";s:2:"";s:3:"泲";s:2:"";s:3:"泴";s:2:"";s:3:"泹";s:2:"";s:3:"泿";s:2:"";s:3:"洀";s:2:"";s:3:"洂";s:2:"";s:3:"洃";s:2:"";s:3:"洅";s:2:"";s:3:"洆";s:2:"";s:3:"洈";s:2:"";s:3:"洉";s:2:"";s:3:"洊";s:2:"";s:3:"洍";s:2:"";s:3:"洏";s:2:"";s:3:"洐";s:2:"";s:3:"洑";s:2:"";s:3:"洓";s:2:"";s:3:"洔";s:2:"";s:3:"洕";s:2:"";s:3:"洖";s:2:"";s:3:"洘";s:2:"";s:3:"洜";s:2:"";s:3:"洝";s:2:"";s:3:"洟";s:2:"";s:3:"洠";s:2:"";s:3:"洡";s:2:"";s:3:"洢";s:2:"";s:3:"洣";s:2:"";s:3:"洤";s:2:"";s:3:"洦";s:2:"";s:3:"洨";s:2:"";s:3:"洩";s:2:"";s:3:"洬";s:2:"";s:3:"洭";s:2:"";s:3:"洯";s:2:"";s:3:"洰";s:2:"";s:3:"洴";s:2:"";s:3:"洶";s:2:"";s:3:"洷";s:2:"";s:3:"洸";s:2:"";s:3:"洺";s:2:"";s:3:"洿";s:2:"";s:3:"浀";s:2:"";s:3:"浂";s:2:"";s:3:"浄";s:2:"";s:3:"浉";s:2:"";s:3:"浌";s:2:"";s:3:"浐";s:2:"";s:3:"浕";s:2:"";s:3:"浖";s:2:"";s:3:"浗";s:2:"";s:3:"浘";s:2:"";s:3:"浛";s:2:"";s:3:"浝";s:2:"";s:3:"浟";s:2:"";s:3:"浡";s:2:"";s:3:"浢";s:2:"";s:3:"浤";s:2:"";s:3:"浥";s:2:"";s:3:"浧";s:2:"";s:3:"浨";s:2:"";s:3:"浫";s:2:"";s:3:"浬";s:2:"";s:3:"浭";s:2:"";s:3:"浰";s:2:"";s:3:"浱";s:2:"";s:3:"浲";s:2:"";s:3:"浳";s:2:"";s:3:"浵";s:2:"";s:3:"浶";s:2:"";s:3:"浹";s:2:"";s:3:"浺";s:2:"";s:3:"浻";s:2:"";s:3:"浽";s:2:"";s:3:"浾";s:2:"";s:3:"浿";s:2:"";s:3:"涀";s:2:"";s:3:"涁";s:2:"";s:3:"涃";s:2:"";s:3:"涄";s:2:"";s:3:"涆";s:2:"";s:3:"涇";s:2:"";s:3:"涊";s:2:"";s:3:"涋";s:2:"";s:3:"涍";s:2:"";s:3:"涏";s:2:"";s:3:"涐";s:2:"";s:3:"涒";s:2:"";s:3:"涖";s:2:"";s:3:"涗";s:2:"";s:3:"涘";s:2:"";s:3:"涙";s:2:"";s:3:"涚";s:2:"";s:3:"涜";s:2:"";s:3:"涢";s:2:"";s:3:"涥";s:2:"";s:3:"涬";s:2:"";s:3:"涭";s:2:"";s:3:"涰";s:2:"";s:3:"涱";s:2:"";s:3:"涳";s:2:"";s:3:"涴";s:2:"";s:3:"涶";s:2:"";s:3:"涷";s:2:"";s:3:"涹";s:2:"";s:3:"涺";s:2:"";s:3:"涻";s:2:"";s:3:"涼";s:2:"";s:3:"涽";s:2:"";s:3:"涾";s:2:"";s:3:"淁";s:2:"";s:3:"淂";s:2:"";s:3:"淃";s:2:"";s:3:"淈";s:2:"";s:3:"淉";s:2:"";s:3:"淊";s:2:"@";s:3:"淍";s:2:"A";s:3:"淎";s:2:"B";s:3:"淏";s:2:"C";s:3:"淐";s:2:"D";s:3:"淒";s:2:"E";s:3:"淓";s:2:"F";s:3:"淔";s:2:"G";s:3:"淕";s:2:"H";s:3:"淗";s:2:"I";s:3:"淚";s:2:"J";s:3:"淛";s:2:"K";s:3:"淜";s:2:"L";s:3:"淟";s:2:"M";s:3:"淢";s:2:"N";s:3:"淣";s:2:"O";s:3:"淥";s:2:"P";s:3:"淧";s:2:"Q";s:3:"淨";s:2:"R";s:3:"淩";s:2:"S";s:3:"淪";s:2:"T";s:3:"淭";s:2:"U";s:3:"淯";s:2:"V";s:3:"淰";s:2:"W";s:3:"淲";s:2:"X";s:3:"淴";s:2:"Y";s:3:"淵";s:2:"Z";s:3:"淶";s:2:"[";s:3:"淸";s:2:"\";s:3:"淺";s:2:"]";s:3:"淽";s:2:"^";s:3:"淾";s:2:"_";s:3:"淿";s:2:"`";s:3:"渀";s:2:"a";s:3:"渁";s:2:"b";s:3:"渂";s:2:"c";s:3:"渃";s:2:"d";s:3:"渄";s:2:"e";s:3:"渆";s:2:"f";s:3:"渇";s:2:"g";s:3:"済";s:2:"h";s:3:"渉";s:2:"i";s:3:"渋";s:2:"j";s:3:"渏";s:2:"k";s:3:"渒";s:2:"l";s:3:"渓";s:2:"m";s:3:"渕";s:2:"n";s:3:"渘";s:2:"o";s:3:"渙";s:2:"p";s:3:"減";s:2:"q";s:3:"渜";s:2:"r";s:3:"渞";s:2:"s";s:3:"渟";s:2:"t";s:3:"渢";s:2:"u";s:3:"渦";s:2:"v";s:3:"渧";s:2:"w";s:3:"渨";s:2:"x";s:3:"渪";s:2:"y";s:3:"測";s:2:"z";s:3:"渮";s:2:"{";s:3:"渰";s:2:"|";s:3:"渱";s:2:"}";s:3:"渳";s:2:"~";s:3:"渵";s:2:"";s:3:"渶";s:2:"";s:3:"渷";s:2:"";s:3:"渹";s:2:"";s:3:"渻";s:2:"";s:3:"渼";s:2:"";s:3:"渽";s:2:"";s:3:"渾";s:2:"";s:3:"渿";s:2:"";s:3:"湀";s:2:"";s:3:"湁";s:2:"";s:3:"湂";s:2:"";s:3:"湅";s:2:"";s:3:"湆";s:2:"";s:3:"湇";s:2:"";s:3:"湈";s:2:"";s:3:"湉";s:2:"";s:3:"湊";s:2:"";s:3:"湋";s:2:"";s:3:"湌";s:2:"";s:3:"湏";s:2:"";s:3:"湐";s:2:"";s:3:"湑";s:2:"";s:3:"湒";s:2:"";s:3:"湕";s:2:"";s:3:"湗";s:2:"";s:3:"湙";s:2:"";s:3:"湚";s:2:"";s:3:"湜";s:2:"";s:3:"湝";s:2:"";s:3:"湞";s:2:"";s:3:"湠";s:2:"";s:3:"湡";s:2:"";s:3:"湢";s:2:"";s:3:"湣";s:2:"";s:3:"湤";s:2:"";s:3:"湥";s:2:"";s:3:"湦";s:2:"";s:3:"湧";s:2:"";s:3:"湨";s:2:"";s:3:"湩";s:2:"";s:3:"湪";s:2:"";s:3:"湬";s:2:"";s:3:"湭";s:2:"";s:3:"湯";s:2:"";s:3:"湰";s:2:"";s:3:"湱";s:2:"";s:3:"湲";s:2:"";s:3:"湳";s:2:"";s:3:"湴";s:2:"";s:3:"湵";s:2:"";s:3:"湶";s:2:"";s:3:"湷";s:2:"";s:3:"湸";s:2:"";s:3:"湹";s:2:"";s:3:"湺";s:2:"";s:3:"湻";s:2:"";s:3:"湼";s:2:"";s:3:"湽";s:2:"";s:3:"満";s:2:"";s:3:"溁";s:2:"";s:3:"溂";s:2:"";s:3:"溄";s:2:"";s:3:"溇";s:2:"";s:3:"溈";s:2:"";s:3:"溊";s:2:"";s:3:"溋";s:2:"";s:3:"溌";s:2:"";s:3:"溍";s:2:"";s:3:"溎";s:2:"";s:3:"溑";s:2:"";s:3:"溒";s:2:"";s:3:"溓";s:2:"";s:3:"溔";s:2:"";s:3:"溕";s:2:"";s:3:"準";s:2:"";s:3:"溗";s:2:"";s:3:"溙";s:2:"";s:3:"溚";s:2:"";s:3:"溛";s:2:"";s:3:"溝";s:2:"";s:3:"溞";s:2:"";s:3:"溠";s:2:"";s:3:"溡";s:2:"";s:3:"溣";s:2:"";s:3:"溤";s:2:"";s:3:"溦";s:2:"";s:3:"溨";s:2:"";s:3:"溩";s:2:"";s:3:"溫";s:2:"";s:3:"溬";s:2:"";s:3:"溭";s:2:"";s:3:"溮";s:2:"";s:3:"溰";s:2:"";s:3:"溳";s:2:"";s:3:"溵";s:2:"";s:3:"溸";s:2:"";s:3:"溹";s:2:"";s:3:"溼";s:2:"";s:3:"溾";s:2:"";s:3:"溿";s:2:"";s:3:"滀";s:2:"";s:3:"滃";s:2:"";s:3:"滄";s:2:"";s:3:"滅";s:2:"";s:3:"滆";s:2:"";s:3:"滈";s:2:"";s:3:"滉";s:2:"";s:3:"滊";s:2:"";s:3:"滌";s:2:"";s:3:"滍";s:2:"";s:3:"滎";s:2:"";s:3:"滐";s:2:"";s:3:"滒";s:2:"";s:3:"滖";s:2:"";s:3:"滘";s:2:"";s:3:"滙";s:2:"";s:3:"滛";s:2:"";s:3:"滜";s:2:"";s:3:"滝";s:2:"";s:3:"滣";s:2:"";s:3:"滧";s:2:"";s:3:"滪";s:2:"";s:3:"滫";s:2:"";s:3:"滬";s:2:"";s:3:"滭";s:2:"";s:3:"滮";s:2:"";s:3:"滯";s:2:"@";s:3:"滰";s:2:"A";s:3:"滱";s:2:"B";s:3:"滲";s:2:"C";s:3:"滳";s:2:"D";s:3:"滵";s:2:"E";s:3:"滶";s:2:"F";s:3:"滷";s:2:"G";s:3:"滸";s:2:"H";s:3:"滺";s:2:"I";s:3:"滻";s:2:"J";s:3:"滼";s:2:"K";s:3:"滽";s:2:"L";s:3:"滾";s:2:"M";s:3:"滿";s:2:"N";s:3:"漀";s:2:"O";s:3:"漁";s:2:"P";s:3:"漃";s:2:"Q";s:3:"漄";s:2:"R";s:3:"漅";s:2:"S";s:3:"漇";s:2:"T";s:3:"漈";s:2:"U";s:3:"漊";s:2:"V";s:3:"漋";s:2:"W";s:3:"漌";s:2:"X";s:3:"漍";s:2:"Y";s:3:"漎";s:2:"Z";s:3:"漐";s:2:"[";s:3:"漑";s:2:"\";s:3:"漒";s:2:"]";s:3:"漖";s:2:"^";s:3:"漗";s:2:"_";s:3:"漘";s:2:"`";s:3:"漙";s:2:"a";s:3:"漚";s:2:"b";s:3:"漛";s:2:"c";s:3:"漜";s:2:"d";s:3:"漝";s:2:"e";s:3:"漞";s:2:"f";s:3:"漟";s:2:"g";s:3:"漡";s:2:"h";s:3:"漢";s:2:"i";s:3:"漣";s:2:"j";s:3:"漥";s:2:"k";s:3:"漦";s:2:"l";s:3:"漧";s:2:"m";s:3:"漨";s:2:"n";s:3:"漬";s:2:"o";s:3:"漮";s:2:"p";s:3:"漰";s:2:"q";s:3:"漲";s:2:"r";s:3:"漴";s:2:"s";s:3:"漵";s:2:"t";s:3:"漷";s:2:"u";s:3:"漸";s:2:"v";s:3:"漹";s:2:"w";s:3:"漺";s:2:"x";s:3:"漻";s:2:"y";s:3:"漼";s:2:"z";s:3:"漽";s:2:"{";s:3:"漿";s:2:"|";s:3:"潀";s:2:"}";s:3:"潁";s:2:"~";s:3:"潂";s:2:"";s:3:"潃";s:2:"";s:3:"潄";s:2:"";s:3:"潅";s:2:"";s:3:"潈";s:2:"";s:3:"潉";s:2:"";s:3:"潊";s:2:"";s:3:"潌";s:2:"";s:3:"潎";s:2:"";s:3:"潏";s:2:"";s:3:"潐";s:2:"";s:3:"潑";s:2:"";s:3:"潒";s:2:"";s:3:"潓";s:2:"";s:3:"潔";s:2:"";s:3:"潕";s:2:"";s:3:"潖";s:2:"";s:3:"潗";s:2:"";s:3:"潙";s:2:"";s:3:"潚";s:2:"";s:3:"潛";s:2:"";s:3:"潝";s:2:"";s:3:"潟";s:2:"";s:3:"潠";s:2:"";s:3:"潡";s:2:"";s:3:"潣";s:2:"";s:3:"潤";s:2:"";s:3:"潥";s:2:"";s:3:"潧";s:2:"";s:3:"潨";s:2:"";s:3:"潩";s:2:"";s:3:"潪";s:2:"";s:3:"潫";s:2:"";s:3:"潬";s:2:"";s:3:"潯";s:2:"";s:3:"潰";s:2:"";s:3:"潱";s:2:"";s:3:"潳";s:2:"";s:3:"潵";s:2:"";s:3:"潶";s:2:"";s:3:"潷";s:2:"";s:3:"潹";s:2:"";s:3:"潻";s:2:"";s:3:"潽";s:2:"";s:3:"潾";s:2:"";s:3:"潿";s:2:"";s:3:"澀";s:2:"";s:3:"澁";s:2:"";s:3:"澂";s:2:"";s:3:"澃";s:2:"";s:3:"澅";s:2:"";s:3:"澆";s:2:"";s:3:"澇";s:2:"";s:3:"澊";s:2:"";s:3:"澋";s:2:"";s:3:"澏";s:2:"";s:3:"澐";s:2:"";s:3:"澑";s:2:"";s:3:"澒";s:2:"";s:3:"澓";s:2:"";s:3:"澔";s:2:"";s:3:"澕";s:2:"";s:3:"澖";s:2:"";s:3:"澗";s:2:"";s:3:"澘";s:2:"";s:3:"澙";s:2:"";s:3:"澚";s:2:"";s:3:"澛";s:2:"";s:3:"澝";s:2:"";s:3:"澞";s:2:"";s:3:"澟";s:2:"";s:3:"澠";s:2:"";s:3:"澢";s:2:"";s:3:"澣";s:2:"";s:3:"澤";s:2:"";s:3:"澥";s:2:"";s:3:"澦";s:2:"";s:3:"澨";s:2:"";s:3:"澩";s:2:"";s:3:"澪";s:2:"";s:3:"澫";s:2:"";s:3:"澬";s:2:"";s:3:"澭";s:2:"";s:3:"澮";s:2:"";s:3:"澯";s:2:"";s:3:"澰";s:2:"";s:3:"澱";s:2:"";s:3:"澲";s:2:"";s:3:"澴";s:2:"";s:3:"澵";s:2:"";s:3:"澷";s:2:"";s:3:"澸";s:2:"";s:3:"澺";s:2:"";s:3:"澻";s:2:"";s:3:"澼";s:2:"";s:3:"澽";s:2:"";s:3:"澾";s:2:"";s:3:"澿";s:2:"";s:3:"濁";s:2:"";s:3:"濃";s:2:"";s:3:"濄";s:2:"";s:3:"濅";s:2:"";s:3:"濆";s:2:"";s:3:"濇";s:2:"";s:3:"濈";s:2:"";s:3:"濊";s:2:"";s:3:"濋";s:2:"";s:3:"濌";s:2:"";s:3:"濍";s:2:"";s:3:"濎";s:2:"";s:3:"濏";s:2:"";s:3:"濐";s:2:"";s:3:"濓";s:2:"";s:3:"濔";s:2:"";s:3:"濕";s:2:"";s:3:"濖";s:2:"";s:3:"濗";s:2:"";s:3:"濘";s:2:"";s:3:"濙";s:2:"";s:3:"濚";s:2:"";s:3:"濛";s:2:"";s:3:"濜";s:2:"";s:3:"濝";s:2:"";s:3:"濟";s:2:"";s:3:"濢";s:2:"";s:3:"濣";s:2:"";s:3:"濤";s:2:"";s:3:"濥";s:2:"@";s:3:"濦";s:2:"A";s:3:"濧";s:2:"B";s:3:"濨";s:2:"C";s:3:"濩";s:2:"D";s:3:"濪";s:2:"E";s:3:"濫";s:2:"F";s:3:"濬";s:2:"G";s:3:"濭";s:2:"H";s:3:"濰";s:2:"I";s:3:"濱";s:2:"J";s:3:"濲";s:2:"K";s:3:"濳";s:2:"L";s:3:"濴";s:2:"M";s:3:"濵";s:2:"N";s:3:"濶";s:2:"O";s:3:"濷";s:2:"P";s:3:"濸";s:2:"Q";s:3:"濹";s:2:"R";s:3:"濺";s:2:"S";s:3:"濻";s:2:"T";s:3:"濼";s:2:"U";s:3:"濽";s:2:"V";s:3:"濾";s:2:"W";s:3:"濿";s:2:"X";s:3:"瀀";s:2:"Y";s:3:"瀁";s:2:"Z";s:3:"瀂";s:2:"[";s:3:"瀃";s:2:"\";s:3:"瀄";s:2:"]";s:3:"瀅";s:2:"^";s:3:"瀆";s:2:"_";s:3:"瀇";s:2:"`";s:3:"瀈";s:2:"a";s:3:"瀉";s:2:"b";s:3:"瀊";s:2:"c";s:3:"瀋";s:2:"d";s:3:"瀌";s:2:"e";s:3:"瀍";s:2:"f";s:3:"瀎";s:2:"g";s:3:"瀏";s:2:"h";s:3:"瀐";s:2:"i";s:3:"瀒";s:2:"j";s:3:"瀓";s:2:"k";s:3:"瀔";s:2:"l";s:3:"瀕";s:2:"m";s:3:"瀖";s:2:"n";s:3:"瀗";s:2:"o";s:3:"瀘";s:2:"p";s:3:"瀙";s:2:"q";s:3:"瀜";s:2:"r";s:3:"瀝";s:2:"s";s:3:"瀞";s:2:"t";s:3:"瀟";s:2:"u";s:3:"瀠";s:2:"v";s:3:"瀡";s:2:"w";s:3:"瀢";s:2:"x";s:3:"瀤";s:2:"y";s:3:"瀥";s:2:"z";s:3:"瀦";s:2:"{";s:3:"瀧";s:2:"|";s:3:"瀨";s:2:"}";s:3:"瀩";s:2:"~";s:3:"瀪";s:2:"";s:3:"瀫";s:2:"";s:3:"瀬";s:2:"";s:3:"瀭";s:2:"";s:3:"瀮";s:2:"";s:3:"瀯";s:2:"";s:3:"瀰";s:2:"";s:3:"瀱";s:2:"";s:3:"瀲";s:2:"";s:3:"瀳";s:2:"";s:3:"瀴";s:2:"";s:3:"瀶";s:2:"";s:3:"瀷";s:2:"";s:3:"瀸";s:2:"";s:3:"瀺";s:2:"";s:3:"瀻";s:2:"";s:3:"瀼";s:2:"";s:3:"瀽";s:2:"";s:3:"瀾";s:2:"";s:3:"瀿";s:2:"";s:3:"灀";s:2:"";s:3:"灁";s:2:"";s:3:"灂";s:2:"";s:3:"灃";s:2:"";s:3:"灄";s:2:"";s:3:"灅";s:2:"";s:3:"灆";s:2:"";s:3:"灇";s:2:"";s:3:"灈";s:2:"";s:3:"灉";s:2:"";s:3:"灊";s:2:"";s:3:"灋";s:2:"";s:3:"灍";s:2:"";s:3:"灎";s:2:"";s:3:"灐";s:2:"";s:3:"灑";s:2:"";s:3:"灒";s:2:"";s:3:"灓";s:2:"";s:3:"灔";s:2:"";s:3:"灕";s:2:"";s:3:"灖";s:2:"";s:3:"灗";s:2:"";s:3:"灘";s:2:"";s:3:"灙";s:2:"";s:3:"灚";s:2:"";s:3:"灛";s:2:"";s:3:"灜";s:2:"";s:3:"灝";s:2:"";s:3:"灟";s:2:"";s:3:"灠";s:2:"";s:3:"灡";s:2:"";s:3:"灢";s:2:"";s:3:"灣";s:2:"";s:3:"灤";s:2:"";s:3:"灥";s:2:"";s:3:"灦";s:2:"";s:3:"灧";s:2:"";s:3:"灨";s:2:"";s:3:"灩";s:2:"";s:3:"灪";s:2:"";s:3:"灮";s:2:"";s:3:"灱";s:2:"";s:3:"灲";s:2:"";s:3:"灳";s:2:"";s:3:"灴";s:2:"";s:3:"灷";s:2:"";s:3:"灹";s:2:"";s:3:"灺";s:2:"";s:3:"灻";s:2:"";s:3:"災";s:2:"";s:3:"炁";s:2:"";s:3:"炂";s:2:"";s:3:"炃";s:2:"";s:3:"炄";s:2:"";s:3:"炆";s:2:"";s:3:"炇";s:2:"";s:3:"炈";s:2:"";s:3:"炋";s:2:"";s:3:"炌";s:2:"";s:3:"炍";s:2:"";s:3:"炏";s:2:"";s:3:"炐";s:2:"";s:3:"炑";s:2:"";s:3:"炓";s:2:"";s:3:"炗";s:2:"";s:3:"炘";s:2:"";s:3:"炚";s:2:"";s:3:"炛";s:2:"";s:3:"炞";s:2:"";s:3:"炟";s:2:"";s:3:"炠";s:2:"";s:3:"炡";s:2:"";s:3:"炢";s:2:"";s:3:"炣";s:2:"";s:3:"炤";s:2:"";s:3:"炥";s:2:"";s:3:"炦";s:2:"";s:3:"炧";s:2:"";s:3:"炨";s:2:"";s:3:"炩";s:2:"";s:3:"炪";s:2:"";s:3:"炰";s:2:"";s:3:"炲";s:2:"";s:3:"炴";s:2:"";s:3:"炵";s:2:"";s:3:"炶";s:2:"";s:3:"為";s:2:"";s:3:"炾";s:2:"";s:3:"炿";s:2:"";s:3:"烄";s:2:"";s:3:"烅";s:2:"";s:3:"烆";s:2:"";s:3:"烇";s:2:"";s:3:"烉";s:2:"";s:3:"烋";s:2:"";s:3:"烌";s:2:"";s:3:"烍";s:2:"";s:3:"烎";s:2:"";s:3:"烏";s:2:"";s:3:"烐";s:2:"";s:3:"烑";s:2:"";s:3:"烒";s:2:"";s:3:"烓";s:2:"";s:3:"烔";s:2:"";s:3:"烕";s:2:"";s:3:"烖";s:2:"";s:3:"烗";s:2:"";s:3:"烚";s:2:"@";s:3:"烜";s:2:"A";s:3:"烝";s:2:"B";s:3:"烞";s:2:"C";s:3:"烠";s:2:"D";s:3:"烡";s:2:"E";s:3:"烢";s:2:"F";s:3:"烣";s:2:"G";s:3:"烥";s:2:"H";s:3:"烪";s:2:"I";s:3:"烮";s:2:"J";s:3:"烰";s:2:"K";s:3:"烱";s:2:"L";s:3:"烲";s:2:"M";s:3:"烳";s:2:"N";s:3:"烴";s:2:"O";s:3:"烵";s:2:"P";s:3:"烶";s:2:"Q";s:3:"烸";s:2:"R";s:3:"烺";s:2:"S";s:3:"烻";s:2:"T";s:3:"烼";s:2:"U";s:3:"烾";s:2:"V";s:3:"烿";s:2:"W";s:3:"焀";s:2:"X";s:3:"焁";s:2:"Y";s:3:"焂";s:2:"Z";s:3:"焃";s:2:"[";s:3:"焄";s:2:"\";s:3:"焅";s:2:"]";s:3:"焆";s:2:"^";s:3:"焇";s:2:"_";s:3:"焈";s:2:"`";s:3:"焋";s:2:"a";s:3:"焌";s:2:"b";s:3:"焍";s:2:"c";s:3:"焎";s:2:"d";s:3:"焏";s:2:"e";s:3:"焑";s:2:"f";s:3:"焒";s:2:"g";s:3:"焔";s:2:"h";s:3:"焗";s:2:"i";s:3:"焛";s:2:"j";s:3:"焜";s:2:"k";s:3:"焝";s:2:"l";s:3:"焞";s:2:"m";s:3:"焟";s:2:"n";s:3:"焠";s:2:"o";s:3:"無";s:2:"p";s:3:"焢";s:2:"q";s:3:"焣";s:2:"r";s:3:"焤";s:2:"s";s:3:"焥";s:2:"t";s:3:"焧";s:2:"u";s:3:"焨";s:2:"v";s:3:"焩";s:2:"w";s:3:"焪";s:2:"x";s:3:"焫";s:2:"y";s:3:"焬";s:2:"z";s:3:"焭";s:2:"{";s:3:"焮";s:2:"|";s:3:"焲";s:2:"}";s:3:"焳";s:2:"~";s:3:"焴";s:2:"";s:3:"焵";s:2:"";s:3:"焷";s:2:"";s:3:"焸";s:2:"";s:3:"焹";s:2:"";s:3:"焺";s:2:"";s:3:"焻";s:2:"";s:3:"焼";s:2:"";s:3:"焽";s:2:"";s:3:"焾";s:2:"";s:3:"焿";s:2:"";s:3:"煀";s:2:"";s:3:"煁";s:2:"";s:3:"煂";s:2:"";s:3:"煃";s:2:"";s:3:"煄";s:2:"";s:3:"煆";s:2:"";s:3:"煇";s:2:"";s:3:"煈";s:2:"";s:3:"煉";s:2:"";s:3:"煋";s:2:"";s:3:"煍";s:2:"";s:3:"煏";s:2:"";s:3:"煐";s:2:"";s:3:"煑";s:2:"";s:3:"煒";s:2:"";s:3:"煓";s:2:"";s:3:"煔";s:2:"";s:3:"煕";s:2:"";s:3:"煖";s:2:"";s:3:"煗";s:2:"";s:3:"煘";s:2:"";s:3:"煙";s:2:"";s:3:"煚";s:2:"";s:3:"煛";s:2:"";s:3:"煝";s:2:"";s:3:"煟";s:2:"";s:3:"煠";s:2:"";s:3:"煡";s:2:"";s:3:"煢";s:2:"";s:3:"煣";s:2:"";s:3:"煥";s:2:"";s:3:"煩";s:2:"";s:3:"煪";s:2:"";s:3:"煫";s:2:"";s:3:"煬";s:2:"";s:3:"煭";s:2:"";s:3:"煯";s:2:"";s:3:"煰";s:2:"";s:3:"煱";s:2:"";s:3:"煴";s:2:"";s:3:"煵";s:2:"";s:3:"煶";s:2:"";s:3:"煷";s:2:"";s:3:"煹";s:2:"";s:3:"煻";s:2:"";s:3:"煼";s:2:"";s:3:"煾";s:2:"";s:3:"煿";s:2:"";s:3:"熀";s:2:"";s:3:"熁";s:2:"";s:3:"熂";s:2:"";s:3:"熃";s:2:"";s:3:"熅";s:2:"";s:3:"熆";s:2:"";s:3:"熇";s:2:"";s:3:"熈";s:2:"";s:3:"熉";s:2:"";s:3:"熋";s:2:"";s:3:"熌";s:2:"";s:3:"熍";s:2:"";s:3:"熎";s:2:"";s:3:"熐";s:2:"";s:3:"熑";s:2:"";s:3:"熒";s:2:"";s:3:"熓";s:2:"";s:3:"熕";s:2:"";s:3:"熖";s:2:"";s:3:"熗";s:2:"";s:3:"熚";s:2:"";s:3:"熛";s:2:"";s:3:"熜";s:2:"";s:3:"熝";s:2:"";s:3:"熞";s:2:"";s:3:"熡";s:2:"";s:3:"熢";s:2:"";s:3:"熣";s:2:"";s:3:"熤";s:2:"";s:3:"熥";s:2:"";s:3:"熦";s:2:"";s:3:"熧";s:2:"";s:3:"熩";s:2:"";s:3:"熪";s:2:"";s:3:"熫";s:2:"";s:3:"熭";s:2:"";s:3:"熮";s:2:"";s:3:"熯";s:2:"";s:3:"熰";s:2:"";s:3:"熱";s:2:"";s:3:"熲";s:2:"";s:3:"熴";s:2:"";s:3:"熶";s:2:"";s:3:"熷";s:2:"";s:3:"熸";s:2:"";s:3:"熺";s:2:"";s:3:"熻";s:2:"";s:3:"熼";s:2:"";s:3:"熽";s:2:"";s:3:"熾";s:2:"";s:3:"熿";s:2:"";s:3:"燀";s:2:"";s:3:"燁";s:2:"";s:3:"燂";s:2:"";s:3:"燄";s:2:"";s:3:"燅";s:2:"";s:3:"燆";s:2:"";s:3:"燇";s:2:"";s:3:"燈";s:2:"";s:3:"燉";s:2:"";s:3:"燊";s:2:"";s:3:"燋";s:2:"";s:3:"燌";s:2:"";s:3:"燍";s:2:"";s:3:"燏";s:2:"";s:3:"燐";s:2:"";s:3:"燑";s:2:"";s:3:"燒";s:2:"";s:3:"燓";s:2:"@";s:3:"燖";s:2:"A";s:3:"燗";s:2:"B";s:3:"燘";s:2:"C";s:3:"燙";s:2:"D";s:3:"燚";s:2:"E";s:3:"燛";s:2:"F";s:3:"燜";s:2:"G";s:3:"燝";s:2:"H";s:3:"燞";s:2:"I";s:3:"營";s:2:"J";s:3:"燡";s:2:"K";s:3:"燢";s:2:"L";s:3:"燣";s:2:"M";s:3:"燤";s:2:"N";s:3:"燦";s:2:"O";s:3:"燨";s:2:"P";s:3:"燩";s:2:"Q";s:3:"燪";s:2:"R";s:3:"燫";s:2:"S";s:3:"燬";s:2:"T";s:3:"燭";s:2:"U";s:3:"燯";s:2:"V";s:3:"燰";s:2:"W";s:3:"燱";s:2:"X";s:3:"燲";s:2:"Y";s:3:"燳";s:2:"Z";s:3:"燴";s:2:"[";s:3:"燵";s:2:"\";s:3:"燶";s:2:"]";s:3:"燷";s:2:"^";s:3:"燸";s:2:"_";s:3:"燺";s:2:"`";s:3:"燻";s:2:"a";s:3:"燼";s:2:"b";s:3:"燽";s:2:"c";s:3:"燾";s:2:"d";s:3:"燿";s:2:"e";s:3:"爀";s:2:"f";s:3:"爁";s:2:"g";s:3:"爂";s:2:"h";s:3:"爃";s:2:"i";s:3:"爄";s:2:"j";s:3:"爅";s:2:"k";s:3:"爇";s:2:"l";s:3:"爈";s:2:"m";s:3:"爉";s:2:"n";s:3:"爊";s:2:"o";s:3:"爋";s:2:"p";s:3:"爌";s:2:"q";s:3:"爍";s:2:"r";s:3:"爎";s:2:"s";s:3:"爏";s:2:"t";s:3:"爐";s:2:"u";s:3:"爑";s:2:"v";s:3:"爒";s:2:"w";s:3:"爓";s:2:"x";s:3:"爔";s:2:"y";s:3:"爕";s:2:"z";s:3:"爖";s:2:"{";s:3:"爗";s:2:"|";s:3:"爘";s:2:"}";s:3:"爙";s:2:"~";s:3:"爚";s:2:"";s:3:"爛";s:2:"";s:3:"爜";s:2:"";s:3:"爞";s:2:"";s:3:"爟";s:2:"";s:3:"爠";s:2:"";s:3:"爡";s:2:"";s:3:"爢";s:2:"";s:3:"爣";s:2:"";s:3:"爤";s:2:"";s:3:"爥";s:2:"";s:3:"爦";s:2:"";s:3:"爧";s:2:"";s:3:"爩";s:2:"";s:3:"爫";s:2:"";s:3:"爭";s:2:"";s:3:"爮";s:2:"";s:3:"爯";s:2:"";s:3:"爲";s:2:"";s:3:"爳";s:2:"";s:3:"爴";s:2:"";s:3:"爺";s:2:"";s:3:"爼";s:2:"";s:3:"爾";s:2:"";s:3:"牀";s:2:"";s:3:"牁";s:2:"";s:3:"牂";s:2:"";s:3:"牃";s:2:"";s:3:"牄";s:2:"";s:3:"牅";s:2:"";s:3:"牆";s:2:"";s:3:"牉";s:2:"";s:3:"牊";s:2:"";s:3:"牋";s:2:"";s:3:"牎";s:2:"";s:3:"牏";s:2:"";s:3:"牐";s:2:"";s:3:"牑";s:2:"";s:3:"牓";s:2:"";s:3:"牔";s:2:"";s:3:"牕";s:2:"";s:3:"牗";s:2:"";s:3:"牘";s:2:"";s:3:"牚";s:2:"";s:3:"牜";s:2:"";s:3:"牞";s:2:"";s:3:"牠";s:2:"";s:3:"牣";s:2:"";s:3:"牤";s:2:"";s:3:"牥";s:2:"";s:3:"牨";s:2:"";s:3:"牪";s:2:"";s:3:"牫";s:2:"";s:3:"牬";s:2:"";s:3:"牭";s:2:"";s:3:"牰";s:2:"";s:3:"牱";s:2:"";s:3:"牳";s:2:"";s:3:"牴";s:2:"";s:3:"牶";s:2:"";s:3:"牷";s:2:"";s:3:"牸";s:2:"";s:3:"牻";s:2:"";s:3:"牼";s:2:"";s:3:"牽";s:2:"";s:3:"犂";s:2:"";s:3:"犃";s:2:"";s:3:"犅";s:2:"";s:3:"犆";s:2:"";s:3:"犇";s:2:"";s:3:"犈";s:2:"";s:3:"犉";s:2:"";s:3:"犌";s:2:"";s:3:"犎";s:2:"";s:3:"犐";s:2:"";s:3:"犑";s:2:"";s:3:"犓";s:2:"";s:3:"犔";s:2:"";s:3:"犕";s:2:"";s:3:"犖";s:2:"";s:3:"犗";s:2:"";s:3:"犘";s:2:"";s:3:"犙";s:2:"";s:3:"犚";s:2:"";s:3:"犛";s:2:"";s:3:"犜";s:2:"";s:3:"犝";s:2:"";s:3:"犞";s:2:"";s:3:"犠";s:2:"";s:3:"犡";s:2:"";s:3:"犢";s:2:"";s:3:"犣";s:2:"";s:3:"犤";s:2:"";s:3:"犥";s:2:"";s:3:"犦";s:2:"";s:3:"犧";s:2:"";s:3:"犨";s:2:"";s:3:"犩";s:2:"";s:3:"犪";s:2:"";s:3:"犫";s:2:"";s:3:"犮";s:2:"";s:3:"犱";s:2:"";s:3:"犲";s:2:"";s:3:"犳";s:2:"";s:3:"犵";s:2:"";s:3:"犺";s:2:"";s:3:"犻";s:2:"";s:3:"犼";s:2:"";s:3:"犽";s:2:"";s:3:"犾";s:2:"";s:3:"犿";s:2:"";s:3:"狀";s:2:"";s:3:"狅";s:2:"";s:3:"狆";s:2:"";s:3:"狇";s:2:"";s:3:"狉";s:2:"";s:3:"狊";s:2:"";s:3:"狋";s:2:"";s:3:"狌";s:2:"";s:3:"狏";s:2:"";s:3:"狑";s:2:"";s:3:"狓";s:2:"";s:3:"狔";s:2:"";s:3:"狕";s:2:"";s:3:"狖";s:2:"";s:3:"狘";s:2:"";s:3:"狚";s:2:"";s:3:"狛";s:2:"";s:3:"　";s:2:"";s:3:"、";s:2:"";s:3:"。";s:2:"";s:2:"·";s:2:"";s:2:"ˉ";s:2:"";s:2:"ˇ";s:2:"";s:2:"¨";s:2:"";s:3:"〃";s:2:"";s:3:"々";s:2:"";s:3:"—";s:2:"";s:3:"～";s:2:"";s:3:"‖";s:2:"";s:3:"…";s:2:"";s:3:"‘";s:2:"";s:3:"’";s:2:"";s:3:"“";s:2:"";s:3:"”";s:2:"";s:3:"〔";s:2:"";s:3:"〕";s:2:"";s:3:"〈";s:2:"";s:3:"〉";s:2:"";s:3:"《";s:2:"";s:3:"》";s:2:"";s:3:"「";s:2:"";s:3:"」";s:2:"";s:3:"『";s:2:"";s:3:"』";s:2:"";s:3:"〖";s:2:"";s:3:"〗";s:2:"";s:3:"【";s:2:"";s:3:"】";s:2:"";s:2:"±";s:2:"";s:2:"×";s:2:"";s:2:"÷";s:2:"";s:3:"∶";s:2:"";s:3:"∧";s:2:"";s:3:"∨";s:2:"";s:3:"∑";s:2:"";s:3:"∏";s:2:"";s:3:"∪";s:2:"";s:3:"∩";s:2:"";s:3:"∈";s:2:"";s:3:"∷";s:2:"";s:3:"√";s:2:"";s:3:"⊥";s:2:"";s:3:"∥";s:2:"";s:3:"∠";s:2:"";s:3:"⌒";s:2:"";s:3:"⊙";s:2:"";s:3:"∫";s:2:"";s:3:"∮";s:2:"";s:3:"≡";s:2:"";s:3:"≌";s:2:"";s:3:"≈";s:2:"";s:3:"∽";s:2:"";s:3:"∝";s:2:"";s:3:"≠";s:2:"";s:3:"≮";s:2:"";s:3:"≯";s:2:"";s:3:"≤";s:2:"";s:3:"≥";s:2:"";s:3:"∞";s:2:"";s:3:"∵";s:2:"";s:3:"∴";s:2:"";s:3:"♂";s:2:"";s:3:"♀";s:2:"";s:2:"°";s:2:"";s:3:"′";s:2:"";s:3:"″";s:2:"";s:3:"℃";s:2:"";s:3:"＄";s:2:"";s:2:"¤";s:2:"";s:3:"￠";s:2:"";s:3:"￡";s:2:"";s:3:"‰";s:2:"";s:2:"§";s:2:"";s:3:"№";s:2:"";s:3:"☆";s:2:"";s:3:"★";s:2:"";s:3:"○";s:2:"";s:3:"●";s:2:"";s:3:"◎";s:2:"";s:3:"◇";s:2:"";s:3:"◆";s:2:"";s:3:"□";s:2:"";s:3:"■";s:2:"";s:3:"△";s:2:"";s:3:"▲";s:2:"";s:3:"※";s:2:"";s:3:"→";s:2:"";s:3:"←";s:2:"";s:3:"↑";s:2:"";s:3:"↓";s:2:"";s:3:"〓";s:2:"";s:3:"ⅰ";s:2:"";s:3:"ⅱ";s:2:"";s:3:"ⅲ";s:2:"";s:3:"ⅳ";s:2:"";s:3:"ⅴ";s:2:"";s:3:"ⅵ";s:2:"";s:3:"ⅶ";s:2:"";s:3:"ⅷ";s:2:"";s:3:"ⅸ";s:2:"";s:3:"ⅹ";s:2:"";s:3:"⒈";s:2:"";s:3:"⒉";s:2:"";s:3:"⒊";s:2:"";s:3:"⒋";s:2:"";s:3:"⒌";s:2:"";s:3:"⒍";s:2:"";s:3:"⒎";s:2:"";s:3:"⒏";s:2:"";s:3:"⒐";s:2:"";s:3:"⒑";s:2:"";s:3:"⒒";s:2:"";s:3:"⒓";s:2:"";s:3:"⒔";s:2:"";s:3:"⒕";s:2:"";s:3:"⒖";s:2:"";s:3:"⒗";s:2:"";s:3:"⒘";s:2:"";s:3:"⒙";s:2:"";s:3:"⒚";s:2:"";s:3:"⒛";s:2:"";s:3:"⑴";s:2:"";s:3:"⑵";s:2:"";s:3:"⑶";s:2:"";s:3:"⑷";s:2:"";s:3:"⑸";s:2:"";s:3:"⑹";s:2:"";s:3:"⑺";s:2:"";s:3:"⑻";s:2:"";s:3:"⑼";s:2:"";s:3:"⑽";s:2:"";s:3:"⑾";s:2:"";s:3:"⑿";s:2:"";s:3:"⒀";s:2:"";s:3:"⒁";s:2:"";s:3:"⒂";s:2:"";s:3:"⒃";s:2:"";s:3:"⒄";s:2:"";s:3:"⒅";s:2:"";s:3:"⒆";s:2:"";s:3:"⒇";s:2:"";s:3:"①";s:2:"";s:3:"②";s:2:"";s:3:"③";s:2:"";s:3:"④";s:2:"";s:3:"⑤";s:2:"";s:3:"⑥";s:2:"";s:3:"⑦";s:2:"";s:3:"⑧";s:2:"";s:3:"⑨";s:2:"";s:3:"⑩";s:2:"";s:3:"㈠";s:2:"";s:3:"㈡";s:2:"";s:3:"㈢";s:2:"";s:3:"㈣";s:2:"";s:3:"㈤";s:2:"";s:3:"㈥";s:2:"";s:3:"㈦";s:2:"";s:3:"㈧";s:2:"";s:3:"㈨";s:2:"";s:3:"㈩";s:2:"";s:3:"Ⅰ";s:2:"";s:3:"Ⅱ";s:2:"";s:3:"Ⅲ";s:2:"";s:3:"Ⅳ";s:2:"";s:3:"Ⅴ";s:2:"";s:3:"Ⅵ";s:2:"";s:3:"Ⅶ";s:2:"";s:3:"Ⅷ";s:2:"";s:3:"Ⅸ";s:2:"";s:3:"Ⅹ";s:2:"";s:3:"Ⅺ";s:2:"";s:3:"Ⅻ";s:2:"";s:3:"！";s:2:"";s:3:"＂";s:2:"";s:3:"＃";s:2:"";s:3:"￥";s:2:"";s:3:"％";s:2:"";s:3:"＆";s:2:"";s:3:"＇";s:2:"";s:3:"（";s:2:"";s:3:"）";s:2:"";s:3:"＊";s:2:"";s:3:"＋";s:2:"";s:3:"，";s:2:"";s:3:"－";s:2:"";s:3:"．";s:2:"";s:3:"／";s:2:"";s:3:"０";s:2:"";s:3:"１";s:2:"";s:3:"２";s:2:"";s:3:"３";s:2:"";s:3:"４";s:2:"";s:3:"５";s:2:"";s:3:"６";s:2:"";s:3:"７";s:2:"";s:3:"８";s:2:"";s:3:"９";s:2:"";s:3:"：";s:2:"";s:3:"；";s:2:"";s:3:"＜";s:2:"";s:3:"＝";s:2:"";s:3:"＞";s:2:"";s:3:"？";s:2:"";s:3:"＠";s:2:"";s:3:"Ａ";s:2:"";s:3:"Ｂ";s:2:"";s:3:"Ｃ";s:2:"";s:3:"Ｄ";s:2:"";s:3:"Ｅ";s:2:"";s:3:"Ｆ";s:2:"";s:3:"Ｇ";s:2:"";s:3:"Ｈ";s:2:"";s:3:"Ｉ";s:2:"";s:3:"Ｊ";s:2:"";s:3:"Ｋ";s:2:"";s:3:"Ｌ";s:2:"";s:3:"Ｍ";s:2:"";s:3:"Ｎ";s:2:"";s:3:"Ｏ";s:2:"";s:3:"Ｐ";s:2:"";s:3:"Ｑ";s:2:"";s:3:"Ｒ";s:2:"";s:3:"Ｓ";s:2:"";s:3:"Ｔ";s:2:"";s:3:"Ｕ";s:2:"";s:3:"Ｖ";s:2:"";s:3:"Ｗ";s:2:"";s:3:"Ｘ";s:2:"";s:3:"Ｙ";s:2:"";s:3:"Ｚ";s:2:"";s:3:"［";s:2:"";s:3:"＼";s:2:"";s:3:"］";s:2:"";s:3:"＾";s:2:"";s:3:"＿";s:2:"";s:3:"｀";s:2:"";s:3:"ａ";s:2:"";s:3:"ｂ";s:2:"";s:3:"ｃ";s:2:"";s:3:"ｄ";s:2:"";s:3:"ｅ";s:2:"";s:3:"ｆ";s:2:"";s:3:"ｇ";s:2:"";s:3:"ｈ";s:2:"";s:3:"ｉ";s:2:"";s:3:"ｊ";s:2:"";s:3:"ｋ";s:2:"";s:3:"ｌ";s:2:"";s:3:"ｍ";s:2:"";s:3:"ｎ";s:2:"";s:3:"ｏ";s:2:"";s:3:"ｐ";s:2:"";s:3:"ｑ";s:2:"";s:3:"ｒ";s:2:"";s:3:"ｓ";s:2:"";s:3:"ｔ";s:2:"";s:3:"ｕ";s:2:"";s:3:"ｖ";s:2:"";s:3:"ｗ";s:2:"";s:3:"ｘ";s:2:"";s:3:"ｙ";s:2:"";s:3:"ｚ";s:2:"";s:3:"｛";s:2:"";s:3:"｜";s:2:"";s:3:"｝";s:2:"";s:3:"￣";s:2:"";s:3:"ぁ";s:2:"";s:3:"あ";s:2:"";s:3:"ぃ";s:2:"";s:3:"い";s:2:"";s:3:"ぅ";s:2:"";s:3:"う";s:2:"";s:3:"ぇ";s:2:"";s:3:"え";s:2:"";s:3:"ぉ";s:2:"";s:3:"お";s:2:"";s:3:"か";s:2:"";s:3:"が";s:2:"";s:3:"き";s:2:"";s:3:"ぎ";s:2:"";s:3:"く";s:2:"";s:3:"ぐ";s:2:"";s:3:"け";s:2:"";s:3:"げ";s:2:"";s:3:"こ";s:2:"";s:3:"ご";s:2:"";s:3:"さ";s:2:"";s:3:"ざ";s:2:"";s:3:"し";s:2:"";s:3:"じ";s:2:"";s:3:"す";s:2:"";s:3:"ず";s:2:"";s:3:"せ";s:2:"";s:3:"ぜ";s:2:"";s:3:"そ";s:2:"";s:3:"ぞ";s:2:"";s:3:"た";s:2:"";s:3:"だ";s:2:"";s:3:"ち";s:2:"";s:3:"ぢ";s:2:"";s:3:"っ";s:2:"";s:3:"つ";s:2:"";s:3:"づ";s:2:"";s:3:"て";s:2:"";s:3:"で";s:2:"";s:3:"と";s:2:"";s:3:"ど";s:2:"";s:3:"な";s:2:"";s:3:"に";s:2:"";s:3:"ぬ";s:2:"";s:3:"ね";s:2:"";s:3:"の";s:2:"";s:3:"は";s:2:"";s:3:"ば";s:2:"";s:3:"ぱ";s:2:"";s:3:"ひ";s:2:"";s:3:"び";s:2:"";s:3:"ぴ";s:2:"";s:3:"ふ";s:2:"";s:3:"ぶ";s:2:"";s:3:"ぷ";s:2:"";s:3:"へ";s:2:"";s:3:"べ";s:2:"";s:3:"ぺ";s:2:"";s:3:"ほ";s:2:"";s:3:"ぼ";s:2:"";s:3:"ぽ";s:2:"";s:3:"ま";s:2:"";s:3:"み";s:2:"";s:3:"む";s:2:"";s:3:"め";s:2:"";s:3:"も";s:2:"";s:3:"ゃ";s:2:"";s:3:"や";s:2:"";s:3:"ゅ";s:2:"";s:3:"ゆ";s:2:"";s:3:"ょ";s:2:"";s:3:"よ";s:2:"";s:3:"ら";s:2:"";s:3:"り";s:2:"";s:3:"る";s:2:"";s:3:"れ";s:2:"";s:3:"ろ";s:2:"";s:3:"ゎ";s:2:"";s:3:"わ";s:2:"";s:3:"ゐ";s:2:"";s:3:"ゑ";s:2:"";s:3:"を";s:2:"";s:3:"ん";s:2:"";s:3:"ァ";s:2:"";s:3:"ア";s:2:"";s:3:"ィ";s:2:"";s:3:"イ";s:2:"";s:3:"ゥ";s:2:"";s:3:"ウ";s:2:"";s:3:"ェ";s:2:"";s:3:"エ";s:2:"";s:3:"ォ";s:2:"";s:3:"オ";s:2:"";s:3:"カ";s:2:"";s:3:"ガ";s:2:"";s:3:"キ";s:2:"";s:3:"ギ";s:2:"";s:3:"ク";s:2:"";s:3:"グ";s:2:"";s:3:"ケ";s:2:"";s:3:"ゲ";s:2:"";s:3:"コ";s:2:"";s:3:"ゴ";s:2:"";s:3:"サ";s:2:"";s:3:"ザ";s:2:"";s:3:"シ";s:2:"";s:3:"ジ";s:2:"";s:3:"ス";s:2:"";s:3:"ズ";s:2:"";s:3:"セ";s:2:"";s:3:"ゼ";s:2:"";s:3:"ソ";s:2:"";s:3:"ゾ";s:2:"";s:3:"タ";s:2:"";s:3:"ダ";s:2:"";s:3:"チ";s:2:"";s:3:"ヂ";s:2:"";s:3:"ッ";s:2:"";s:3:"ツ";s:2:"";s:3:"ヅ";s:2:"";s:3:"テ";s:2:"";s:3:"デ";s:2:"";s:3:"ト";s:2:"";s:3:"ド";s:2:"";s:3:"ナ";s:2:"";s:3:"ニ";s:2:"";s:3:"ヌ";s:2:"";s:3:"ネ";s:2:"";s:3:"ノ";s:2:"";s:3:"ハ";s:2:"";s:3:"バ";s:2:"";s:3:"パ";s:2:"";s:3:"ヒ";s:2:"";s:3:"ビ";s:2:"";s:3:"ピ";s:2:"";s:3:"フ";s:2:"";s:3:"ブ";s:2:"";s:3:"プ";s:2:"";s:3:"ヘ";s:2:"";s:3:"ベ";s:2:"";s:3:"ペ";s:2:"";s:3:"ホ";s:2:"";s:3:"ボ";s:2:"";s:3:"ポ";s:2:"";s:3:"マ";s:2:"";s:3:"ミ";s:2:"";s:3:"ム";s:2:"";s:3:"メ";s:2:"";s:3:"モ";s:2:"";s:3:"ャ";s:2:"";s:3:"ヤ";s:2:"";s:3:"ュ";s:2:"";s:3:"ユ";s:2:"";s:3:"ョ";s:2:"";s:3:"ヨ";s:2:"";s:3:"ラ";s:2:"";s:3:"リ";s:2:"";s:3:"ル";s:2:"";s:3:"レ";s:2:"";s:3:"ロ";s:2:"";s:3:"ヮ";s:2:"";s:3:"ワ";s:2:"";s:3:"ヰ";s:2:"";s:3:"ヱ";s:2:"";s:3:"ヲ";s:2:"";s:3:"ン";s:2:"";s:3:"ヴ";s:2:"";s:3:"ヵ";s:2:"";s:3:"ヶ";s:2:"";s:2:"Α";s:2:"";s:2:"Β";s:2:"";s:2:"Γ";s:2:"";s:2:"Δ";s:2:"";s:2:"Ε";s:2:"";s:2:"Ζ";s:2:"";s:2:"Η";s:2:"";s:2:"Θ";s:2:"";s:2:"Ι";s:2:"";s:2:"Κ";s:2:"";s:2:"Λ";s:2:"";s:2:"Μ";s:2:"";s:2:"Ν";s:2:"";s:2:"Ξ";s:2:"";s:2:"Ο";s:2:"";s:2:"Π";s:2:"";s:2:"Ρ";s:2:"";s:2:"Σ";s:2:"";s:2:"Τ";s:2:"";s:2:"Υ";s:2:"";s:2:"Φ";s:2:"";s:2:"Χ";s:2:"";s:2:"Ψ";s:2:"";s:2:"Ω";s:2:"";s:2:"α";s:2:"";s:2:"β";s:2:"";s:2:"γ";s:2:"";s:2:"δ";s:2:"";s:2:"ε";s:2:"";s:2:"ζ";s:2:"";s:2:"η";s:2:"";s:2:"θ";s:2:"";s:2:"ι";s:2:"";s:2:"κ";s:2:"";s:2:"λ";s:2:"";s:2:"μ";s:2:"";s:2:"ν";s:2:"";s:2:"ξ";s:2:"";s:2:"ο";s:2:"";s:2:"π";s:2:"";s:2:"ρ";s:2:"";s:2:"σ";s:2:"";s:2:"τ";s:2:"";s:2:"υ";s:2:"";s:2:"φ";s:2:"";s:2:"χ";s:2:"";s:2:"ψ";s:2:"";s:2:"ω";s:2:"";s:3:"︵";s:2:"";s:3:"︶";s:2:"";s:3:"︹";s:2:"";s:3:"︺";s:2:"";s:3:"︿";s:2:"";s:3:"﹀";s:2:"";s:3:"︽";s:2:"";s:3:"︾";s:2:"";s:3:"﹁";s:2:"";s:3:"﹂";s:2:"";s:3:"﹃";s:2:"";s:3:"﹄";s:2:"";s:3:"︻";s:2:"";s:3:"︼";s:2:"";s:3:"︷";s:2:"";s:3:"︸";s:2:"";s:3:"︱";s:2:"";s:3:"︳";s:2:"";s:3:"︴";s:2:"";s:2:"А";s:2:"";s:2:"Б";s:2:"";s:2:"В";s:2:"";s:2:"Г";s:2:"";s:2:"Д";s:2:"";s:2:"Е";s:2:"";s:2:"Ё";s:2:"";s:2:"Ж";s:2:"";s:2:"З";s:2:"";s:2:"И";s:2:"";s:2:"Й";s:2:"";s:2:"К";s:2:"";s:2:"Л";s:2:"";s:2:"М";s:2:"";s:2:"Н";s:2:"";s:2:"О";s:2:"";s:2:"П";s:2:"";s:2:"Р";s:2:"";s:2:"С";s:2:"";s:2:"Т";s:2:"";s:2:"У";s:2:"";s:2:"Ф";s:2:"";s:2:"Х";s:2:"";s:2:"Ц";s:2:"";s:2:"Ч";s:2:"";s:2:"Ш";s:2:"";s:2:"Щ";s:2:"";s:2:"Ъ";s:2:"";s:2:"Ы";s:2:"";s:2:"Ь";s:2:"";s:2:"Э";s:2:"";s:2:"Ю";s:2:"";s:2:"Я";s:2:"";s:2:"а";s:2:"";s:2:"б";s:2:"";s:2:"в";s:2:"";s:2:"г";s:2:"";s:2:"д";s:2:"";s:2:"е";s:2:"";s:2:"ё";s:2:"";s:2:"ж";s:2:"";s:2:"з";s:2:"";s:2:"и";s:2:"";s:2:"й";s:2:"";s:2:"к";s:2:"";s:2:"л";s:2:"";s:2:"м";s:2:"";s:2:"н";s:2:"";s:2:"о";s:2:"";s:2:"п";s:2:"";s:2:"р";s:2:"";s:2:"с";s:2:"";s:2:"т";s:2:"";s:2:"у";s:2:"";s:2:"ф";s:2:"";s:2:"х";s:2:"";s:2:"ц";s:2:"";s:2:"ч";s:2:"";s:2:"ш";s:2:"";s:2:"щ";s:2:"";s:2:"ъ";s:2:"";s:2:"ы";s:2:"";s:2:"ь";s:2:"";s:2:"э";s:2:"";s:2:"ю";s:2:"";s:2:"я";s:2:"@";s:2:"ˊ";s:2:"A";s:2:"ˋ";s:2:"B";s:2:"˙";s:2:"C";s:3:"–";s:2:"D";s:3:"―";s:2:"E";s:3:"‥";s:2:"F";s:3:"‵";s:2:"G";s:3:"℅";s:2:"H";s:3:"℉";s:2:"I";s:3:"↖";s:2:"J";s:3:"↗";s:2:"K";s:3:"↘";s:2:"L";s:3:"↙";s:2:"M";s:3:"∕";s:2:"N";s:3:"∟";s:2:"O";s:3:"∣";s:2:"P";s:3:"≒";s:2:"Q";s:3:"≦";s:2:"R";s:3:"≧";s:2:"S";s:3:"⊿";s:2:"T";s:3:"═";s:2:"U";s:3:"║";s:2:"V";s:3:"╒";s:2:"W";s:3:"╓";s:2:"X";s:3:"╔";s:2:"Y";s:3:"╕";s:2:"Z";s:3:"╖";s:2:"[";s:3:"╗";s:2:"\";s:3:"╘";s:2:"]";s:3:"╙";s:2:"^";s:3:"╚";s:2:"_";s:3:"╛";s:2:"`";s:3:"╜";s:2:"a";s:3:"╝";s:2:"b";s:3:"╞";s:2:"c";s:3:"╟";s:2:"d";s:3:"╠";s:2:"e";s:3:"╡";s:2:"f";s:3:"╢";s:2:"g";s:3:"╣";s:2:"h";s:3:"╤";s:2:"i";s:3:"╥";s:2:"j";s:3:"╦";s:2:"k";s:3:"╧";s:2:"l";s:3:"╨";s:2:"m";s:3:"╩";s:2:"n";s:3:"╪";s:2:"o";s:3:"╫";s:2:"p";s:3:"╬";s:2:"q";s:3:"╭";s:2:"r";s:3:"╮";s:2:"s";s:3:"╯";s:2:"t";s:3:"╰";s:2:"u";s:3:"╱";s:2:"v";s:3:"╲";s:2:"w";s:3:"╳";s:2:"x";s:3:"▁";s:2:"y";s:3:"▂";s:2:"z";s:3:"▃";s:2:"{";s:3:"▄";s:2:"|";s:3:"▅";s:2:"}";s:3:"▆";s:2:"~";s:3:"▇";s:2:"";s:3:"█";s:2:"";s:3:"▉";s:2:"";s:3:"▊";s:2:"";s:3:"▋";s:2:"";s:3:"▌";s:2:"";s:3:"▍";s:2:"";s:3:"▎";s:2:"";s:3:"▏";s:2:"";s:3:"▓";s:2:"";s:3:"▔";s:2:"";s:3:"▕";s:2:"";s:3:"▼";s:2:"";s:3:"▽";s:2:"";s:3:"◢";s:2:"";s:3:"◣";s:2:"";s:3:"◤";s:2:"";s:3:"◥";s:2:"";s:3:"☉";s:2:"";s:3:"⊕";s:2:"";s:3:"〒";s:2:"";s:3:"〝";s:2:"";s:3:"〞";s:2:"";s:2:"ā";s:2:"";s:2:"á";s:2:"";s:2:"ǎ";s:2:"";s:2:"à";s:2:"";s:2:"ē";s:2:"";s:2:"é";s:2:"";s:2:"ě";s:2:"";s:2:"è";s:2:"";s:2:"ī";s:2:"";s:2:"í";s:2:"";s:2:"ǐ";s:2:"";s:2:"ì";s:2:"";s:2:"ō";s:2:"";s:2:"ó";s:2:"";s:2:"ǒ";s:2:"";s:2:"ò";s:2:"";s:2:"ū";s:2:"";s:2:"ú";s:2:"";s:2:"ǔ";s:2:"";s:2:"ù";s:2:"";s:2:"ǖ";s:2:"";s:2:"ǘ";s:2:"";s:2:"ǚ";s:2:"";s:2:"ǜ";s:2:"";s:2:"ü";s:2:"";s:2:"ê";s:2:"";s:2:"ɑ";s:2:"";s:2:"ń";s:2:"";s:2:"ň";s:2:"";s:2:"ɡ";s:2:"";s:3:"ㄅ";s:2:"";s:3:"ㄆ";s:2:"";s:3:"ㄇ";s:2:"";s:3:"ㄈ";s:2:"";s:3:"ㄉ";s:2:"";s:3:"ㄊ";s:2:"";s:3:"ㄋ";s:2:"";s:3:"ㄌ";s:2:"";s:3:"ㄍ";s:2:"";s:3:"ㄎ";s:2:"";s:3:"ㄏ";s:2:"";s:3:"ㄐ";s:2:"";s:3:"ㄑ";s:2:"";s:3:"ㄒ";s:2:"";s:3:"ㄓ";s:2:"";s:3:"ㄔ";s:2:"";s:3:"ㄕ";s:2:"";s:3:"ㄖ";s:2:"";s:3:"ㄗ";s:2:"";s:3:"ㄘ";s:2:"";s:3:"ㄙ";s:2:"";s:3:"ㄚ";s:2:"";s:3:"ㄛ";s:2:"";s:3:"ㄜ";s:2:"";s:3:"ㄝ";s:2:"";s:3:"ㄞ";s:2:"";s:3:"ㄟ";s:2:"";s:3:"ㄠ";s:2:"";s:3:"ㄡ";s:2:"";s:3:"ㄢ";s:2:"";s:3:"ㄣ";s:2:"";s:3:"ㄤ";s:2:"";s:3:"ㄥ";s:2:"";s:3:"ㄦ";s:2:"";s:3:"ㄧ";s:2:"";s:3:"ㄨ";s:2:"";s:3:"ㄩ";s:2:"@";s:3:"〡";s:2:"A";s:3:"〢";s:2:"B";s:3:"〣";s:2:"C";s:3:"〤";s:2:"D";s:3:"〥";s:2:"E";s:3:"〦";s:2:"F";s:3:"〧";s:2:"G";s:3:"〨";s:2:"H";s:3:"〩";s:2:"I";s:3:"㊣";s:2:"J";s:3:"㎎";s:2:"K";s:3:"㎏";s:2:"L";s:3:"㎜";s:2:"M";s:3:"㎝";s:2:"N";s:3:"㎞";s:2:"O";s:3:"㎡";s:2:"P";s:3:"㏄";s:2:"Q";s:3:"㏎";s:2:"R";s:3:"㏑";s:2:"S";s:3:"㏒";s:2:"T";s:3:"㏕";s:2:"U";s:3:"︰";s:2:"V";s:3:"￢";s:2:"W";s:3:"￤";s:2:"Y";s:3:"℡";s:2:"Z";s:3:"㈱";s:2:"\";s:3:"‐";s:2:"`";s:3:"ー";s:2:"a";s:3:"゛";s:2:"b";s:3:"゜";s:2:"c";s:3:"ヽ";s:2:"d";s:3:"ヾ";s:2:"e";s:3:"〆";s:2:"f";s:3:"ゝ";s:2:"g";s:3:"ゞ";s:2:"h";s:3:"﹉";s:2:"i";s:3:"﹊";s:2:"j";s:3:"﹋";s:2:"k";s:3:"﹌";s:2:"l";s:3:"﹍";s:2:"m";s:3:"﹎";s:2:"n";s:3:"﹏";s:2:"o";s:3:"﹐";s:2:"p";s:3:"﹑";s:2:"q";s:3:"﹒";s:2:"r";s:3:"﹔";s:2:"s";s:3:"﹕";s:2:"t";s:3:"﹖";s:2:"u";s:3:"﹗";s:2:"v";s:3:"﹙";s:2:"w";s:3:"﹚";s:2:"x";s:3:"﹛";s:2:"y";s:3:"﹜";s:2:"z";s:3:"﹝";s:2:"{";s:3:"﹞";s:2:"|";s:3:"﹟";s:2:"}";s:3:"﹠";s:2:"~";s:3:"﹡";s:2:"";s:3:"﹢";s:2:"";s:3:"﹣";s:2:"";s:3:"﹤";s:2:"";s:3:"﹥";s:2:"";s:3:"﹦";s:2:"";s:3:"﹨";s:2:"";s:3:"﹩";s:2:"";s:3:"﹪";s:2:"";s:3:"﹫";s:2:"";s:3:"〇";s:2:"";s:3:"─";s:2:"";s:3:"━";s:2:"";s:3:"│";s:2:"";s:3:"┃";s:2:"";s:3:"┄";s:2:"";s:3:"┅";s:2:"";s:3:"┆";s:2:"";s:3:"┇";s:2:"";s:3:"┈";s:2:"";s:3:"┉";s:2:"";s:3:"┊";s:2:"";s:3:"┋";s:2:"";s:3:"┌";s:2:"";s:3:"┍";s:2:"";s:3:"┎";s:2:"";s:3:"┏";s:2:"";s:3:"┐";s:2:"";s:3:"┑";s:2:"";s:3:"┒";s:2:"";s:3:"┓";s:2:"";s:3:"└";s:2:"";s:3:"┕";s:2:"";s:3:"┖";s:2:"";s:3:"┗";s:2:"";s:3:"┘";s:2:"";s:3:"┙";s:2:"";s:3:"┚";s:2:"";s:3:"┛";s:2:"";s:3:"├";s:2:"";s:3:"┝";s:2:"";s:3:"┞";s:2:"";s:3:"┟";s:2:"";s:3:"┠";s:2:"";s:3:"┡";s:2:"";s:3:"┢";s:2:"";s:3:"┣";s:2:"";s:3:"┤";s:2:"";s:3:"┥";s:2:"";s:3:"┦";s:2:"";s:3:"┧";s:2:"";s:3:"┨";s:2:"";s:3:"┩";s:2:"";s:3:"┪";s:2:"";s:3:"┫";s:2:"";s:3:"┬";s:2:"";s:3:"┭";s:2:"";s:3:"┮";s:2:"";s:3:"┯";s:2:"";s:3:"┰";s:2:"";s:3:"┱";s:2:"";s:3:"┲";s:2:"";s:3:"┳";s:2:"";s:3:"┴";s:2:"";s:3:"┵";s:2:"";s:3:"┶";s:2:"";s:3:"┷";s:2:"";s:3:"┸";s:2:"";s:3:"┹";s:2:"";s:3:"┺";s:2:"";s:3:"┻";s:2:"";s:3:"┼";s:2:"";s:3:"┽";s:2:"";s:3:"┾";s:2:"";s:3:"┿";s:2:"";s:3:"╀";s:2:"";s:3:"╁";s:2:"";s:3:"╂";s:2:"";s:3:"╃";s:2:"";s:3:"╄";s:2:"";s:3:"╅";s:2:"";s:3:"╆";s:2:"";s:3:"╇";s:2:"";s:3:"╈";s:2:"";s:3:"╉";s:2:"";s:3:"╊";s:2:"";s:3:"╋";s:2:"@";s:3:"狜";s:2:"A";s:3:"狝";s:2:"B";s:3:"狟";s:2:"C";s:3:"狢";s:2:"D";s:3:"狣";s:2:"E";s:3:"狤";s:2:"F";s:3:"狥";s:2:"G";s:3:"狦";s:2:"H";s:3:"狧";s:2:"I";s:3:"狪";s:2:"J";s:3:"狫";s:2:"K";s:3:"狵";s:2:"L";s:3:"狶";s:2:"M";s:3:"狹";s:2:"N";s:3:"狽";s:2:"O";s:3:"狾";s:2:"P";s:3:"狿";s:2:"Q";s:3:"猀";s:2:"R";s:3:"猂";s:2:"S";s:3:"猄";s:2:"T";s:3:"猅";s:2:"U";s:3:"猆";s:2:"V";s:3:"猇";s:2:"W";s:3:"猈";s:2:"X";s:3:"猉";s:2:"Y";s:3:"猋";s:2:"Z";s:3:"猌";s:2:"[";s:3:"猍";s:2:"\";s:3:"猏";s:2:"]";s:3:"猐";s:2:"^";s:3:"猑";s:2:"_";s:3:"猒";s:2:"`";s:3:"猔";s:2:"a";s:3:"猘";s:2:"b";s:3:"猙";s:2:"c";s:3:"猚";s:2:"d";s:3:"猟";s:2:"e";s:3:"猠";s:2:"f";s:3:"猣";s:2:"g";s:3:"猤";s:2:"h";s:3:"猦";s:2:"i";s:3:"猧";s:2:"j";s:3:"猨";s:2:"k";s:3:"猭";s:2:"l";s:3:"猯";s:2:"m";s:3:"猰";s:2:"n";s:3:"猲";s:2:"o";s:3:"猳";s:2:"p";s:3:"猵";s:2:"q";s:3:"猶";s:2:"r";s:3:"猺";s:2:"s";s:3:"猻";s:2:"t";s:3:"猼";s:2:"u";s:3:"猽";s:2:"v";s:3:"獀";s:2:"w";s:3:"獁";s:2:"x";s:3:"獂";s:2:"y";s:3:"獃";s:2:"z";s:3:"獄";s:2:"{";s:3:"獅";s:2:"|";s:3:"獆";s:2:"}";s:3:"獇";s:2:"~";s:3:"獈";s:2:"";s:3:"獉";s:2:"";s:3:"獊";s:2:"";s:3:"獋";s:2:"";s:3:"獌";s:2:"";s:3:"獎";s:2:"";s:3:"獏";s:2:"";s:3:"獑";s:2:"";s:3:"獓";s:2:"";s:3:"獔";s:2:"";s:3:"獕";s:2:"";s:3:"獖";s:2:"";s:3:"獘";s:2:"";s:3:"獙";s:2:"";s:3:"獚";s:2:"";s:3:"獛";s:2:"";s:3:"獜";s:2:"";s:3:"獝";s:2:"";s:3:"獞";s:2:"";s:3:"獟";s:2:"";s:3:"獡";s:2:"";s:3:"獢";s:2:"";s:3:"獣";s:2:"";s:3:"獤";s:2:"";s:3:"獥";s:2:"";s:3:"獦";s:2:"";s:3:"獧";s:2:"";s:3:"獨";s:2:"";s:3:"獩";s:2:"";s:3:"獪";s:2:"";s:3:"獫";s:2:"";s:3:"獮";s:2:"";s:3:"獰";s:2:"";s:3:"獱";s:2:"@";s:3:"獲";s:2:"A";s:3:"獳";s:2:"B";s:3:"獴";s:2:"C";s:3:"獵";s:2:"D";s:3:"獶";s:2:"E";s:3:"獷";s:2:"F";s:3:"獸";s:2:"G";s:3:"獹";s:2:"H";s:3:"獺";s:2:"I";s:3:"獻";s:2:"J";s:3:"獼";s:2:"K";s:3:"獽";s:2:"L";s:3:"獿";s:2:"M";s:3:"玀";s:2:"N";s:3:"玁";s:2:"O";s:3:"玂";s:2:"P";s:3:"玃";s:2:"Q";s:3:"玅";s:2:"R";s:3:"玆";s:2:"S";s:3:"玈";s:2:"T";s:3:"玊";s:2:"U";s:3:"玌";s:2:"V";s:3:"玍";s:2:"W";s:3:"玏";s:2:"X";s:3:"玐";s:2:"Y";s:3:"玒";s:2:"Z";s:3:"玓";s:2:"[";s:3:"玔";s:2:"\";s:3:"玕";s:2:"]";s:3:"玗";s:2:"^";s:3:"玘";s:2:"_";s:3:"玙";s:2:"`";s:3:"玚";s:2:"a";s:3:"玜";s:2:"b";s:3:"玝";s:2:"c";s:3:"玞";s:2:"d";s:3:"玠";s:2:"e";s:3:"玡";s:2:"f";s:3:"玣";s:2:"g";s:3:"玤";s:2:"h";s:3:"玥";s:2:"i";s:3:"玦";s:2:"j";s:3:"玧";s:2:"k";s:3:"玨";s:2:"l";s:3:"玪";s:2:"m";s:3:"玬";s:2:"n";s:3:"玭";s:2:"o";s:3:"玱";s:2:"p";s:3:"玴";s:2:"q";s:3:"玵";s:2:"r";s:3:"玶";s:2:"s";s:3:"玸";s:2:"t";s:3:"玹";s:2:"u";s:3:"玼";s:2:"v";s:3:"玽";s:2:"w";s:3:"玾";s:2:"x";s:3:"玿";s:2:"y";s:3:"珁";s:2:"z";s:3:"珃";s:2:"{";s:3:"珄";s:2:"|";s:3:"珅";s:2:"}";s:3:"珆";s:2:"~";s:3:"珇";s:2:"";s:3:"珋";s:2:"";s:3:"珌";s:2:"";s:3:"珎";s:2:"";s:3:"珒";s:2:"";s:3:"珓";s:2:"";s:3:"珔";s:2:"";s:3:"珕";s:2:"";s:3:"珖";s:2:"";s:3:"珗";s:2:"";s:3:"珘";s:2:"";s:3:"珚";s:2:"";s:3:"珛";s:2:"";s:3:"珜";s:2:"";s:3:"珝";s:2:"";s:3:"珟";s:2:"";s:3:"珡";s:2:"";s:3:"珢";s:2:"";s:3:"珣";s:2:"";s:3:"珤";s:2:"";s:3:"珦";s:2:"";s:3:"珨";s:2:"";s:3:"珪";s:2:"";s:3:"珫";s:2:"";s:3:"珬";s:2:"";s:3:"珮";s:2:"";s:3:"珯";s:2:"";s:3:"珰";s:2:"";s:3:"珱";s:2:"";s:3:"珳";s:2:"";s:3:"珴";s:2:"";s:3:"珵";s:2:"";s:3:"珶";s:2:"";s:3:"珷";s:2:"@";s:3:"珸";s:2:"A";s:3:"珹";s:2:"B";s:3:"珺";s:2:"C";s:3:"珻";s:2:"D";s:3:"珼";s:2:"E";s:3:"珽";s:2:"F";s:3:"現";s:2:"G";s:3:"珿";s:2:"H";s:3:"琀";s:2:"I";s:3:"琁";s:2:"J";s:3:"琂";s:2:"K";s:3:"琄";s:2:"L";s:3:"琇";s:2:"M";s:3:"琈";s:2:"N";s:3:"琋";s:2:"O";s:3:"琌";s:2:"P";s:3:"琍";s:2:"Q";s:3:"琎";s:2:"R";s:3:"琑";s:2:"S";s:3:"琒";s:2:"T";s:3:"琓";s:2:"U";s:3:"琔";s:2:"V";s:3:"琕";s:2:"W";s:3:"琖";s:2:"X";s:3:"琗";s:2:"Y";s:3:"琘";s:2:"Z";s:3:"琙";s:2:"[";s:3:"琜";s:2:"\";s:3:"琝";s:2:"]";s:3:"琞";s:2:"^";s:3:"琟";s:2:"_";s:3:"琠";s:2:"`";s:3:"琡";s:2:"a";s:3:"琣";s:2:"b";s:3:"琤";s:2:"c";s:3:"琧";s:2:"d";s:3:"琩";s:2:"e";s:3:"琫";s:2:"f";s:3:"琭";s:2:"g";s:3:"琯";s:2:"h";s:3:"琱";s:2:"i";s:3:"琲";s:2:"j";s:3:"琷";s:2:"k";s:3:"琸";s:2:"l";s:3:"琹";s:2:"m";s:3:"琺";s:2:"n";s:3:"琻";s:2:"o";s:3:"琽";s:2:"p";s:3:"琾";s:2:"q";s:3:"琿";s:2:"r";s:3:"瑀";s:2:"s";s:3:"瑂";s:2:"t";s:3:"瑃";s:2:"u";s:3:"瑄";s:2:"v";s:3:"瑅";s:2:"w";s:3:"瑆";s:2:"x";s:3:"瑇";s:2:"y";s:3:"瑈";s:2:"z";s:3:"瑉";s:2:"{";s:3:"瑊";s:2:"|";s:3:"瑋";s:2:"}";s:3:"瑌";s:2:"~";s:3:"瑍";s:2:"";s:3:"瑎";s:2:"";s:3:"瑏";s:2:"";s:3:"瑐";s:2:"";s:3:"瑑";s:2:"";s:3:"瑒";s:2:"";s:3:"瑓";s:2:"";s:3:"瑔";s:2:"";s:3:"瑖";s:2:"";s:3:"瑘";s:2:"";s:3:"瑝";s:2:"";s:3:"瑠";s:2:"";s:3:"瑡";s:2:"";s:3:"瑢";s:2:"";s:3:"瑣";s:2:"";s:3:"瑤";s:2:"";s:3:"瑥";s:2:"";s:3:"瑦";s:2:"";s:3:"瑧";s:2:"";s:3:"瑨";s:2:"";s:3:"瑩";s:2:"";s:3:"瑪";s:2:"";s:3:"瑫";s:2:"";s:3:"瑬";s:2:"";s:3:"瑮";s:2:"";s:3:"瑯";s:2:"";s:3:"瑱";s:2:"";s:3:"瑲";s:2:"";s:3:"瑳";s:2:"";s:3:"瑴";s:2:"";s:3:"瑵";s:2:"";s:3:"瑸";s:2:"";s:3:"瑹";s:2:"";s:3:"瑺";s:2:"@";s:3:"瑻";s:2:"A";s:3:"瑼";s:2:"B";s:3:"瑽";s:2:"C";s:3:"瑿";s:2:"D";s:3:"璂";s:2:"E";s:3:"璄";s:2:"F";s:3:"璅";s:2:"G";s:3:"璆";s:2:"H";s:3:"璈";s:2:"I";s:3:"璉";s:2:"J";s:3:"璊";s:2:"K";s:3:"璌";s:2:"L";s:3:"璍";s:2:"M";s:3:"璏";s:2:"N";s:3:"璑";s:2:"O";s:3:"璒";s:2:"P";s:3:"璓";s:2:"Q";s:3:"璔";s:2:"R";s:3:"璕";s:2:"S";s:3:"璖";s:2:"T";s:3:"璗";s:2:"U";s:3:"璘";s:2:"V";s:3:"璙";s:2:"W";s:3:"璚";s:2:"X";s:3:"璛";s:2:"Y";s:3:"璝";s:2:"Z";s:3:"璟";s:2:"[";s:3:"璠";s:2:"\";s:3:"璡";s:2:"]";s:3:"璢";s:2:"^";s:3:"璣";s:2:"_";s:3:"璤";s:2:"`";s:3:"璥";s:2:"a";s:3:"璦";s:2:"b";s:3:"璪";s:2:"c";s:3:"璫";s:2:"d";s:3:"璬";s:2:"e";s:3:"璭";s:2:"f";s:3:"璮";s:2:"g";s:3:"璯";s:2:"h";s:3:"環";s:2:"i";s:3:"璱";s:2:"j";s:3:"璲";s:2:"k";s:3:"璳";s:2:"l";s:3:"璴";s:2:"m";s:3:"璵";s:2:"n";s:3:"璶";s:2:"o";s:3:"璷";s:2:"p";s:3:"璸";s:2:"q";s:3:"璹";s:2:"r";s:3:"璻";s:2:"s";s:3:"璼";s:2:"t";s:3:"璽";s:2:"u";s:3:"璾";s:2:"v";s:3:"璿";s:2:"w";s:3:"瓀";s:2:"x";s:3:"瓁";s:2:"y";s:3:"瓂";s:2:"z";s:3:"瓃";s:2:"{";s:3:"瓄";s:2:"|";s:3:"瓅";s:2:"}";s:3:"瓆";s:2:"~";s:3:"瓇";s:2:"";s:3:"瓈";s:2:"";s:3:"瓉";s:2:"";s:3:"瓊";s:2:"";s:3:"瓋";s:2:"";s:3:"瓌";s:2:"";s:3:"瓍";s:2:"";s:3:"瓎";s:2:"";s:3:"瓏";s:2:"";s:3:"瓐";s:2:"";s:3:"瓑";s:2:"";s:3:"瓓";s:2:"";s:3:"瓔";s:2:"";s:3:"瓕";s:2:"";s:3:"瓖";s:2:"";s:3:"瓗";s:2:"";s:3:"瓘";s:2:"";s:3:"瓙";s:2:"";s:3:"瓚";s:2:"";s:3:"瓛";s:2:"";s:3:"瓝";s:2:"";s:3:"瓟";s:2:"";s:3:"瓡";s:2:"";s:3:"瓥";s:2:"";s:3:"瓧";s:2:"";s:3:"瓨";s:2:"";s:3:"瓩";s:2:"";s:3:"瓪";s:2:"";s:3:"瓫";s:2:"";s:3:"瓬";s:2:"";s:3:"瓭";s:2:"";s:3:"瓰";s:2:"";s:3:"瓱";s:2:"";s:3:"瓲";s:2:"@";s:3:"瓳";s:2:"A";s:3:"瓵";s:2:"B";s:3:"瓸";s:2:"C";s:3:"瓹";s:2:"D";s:3:"瓺";s:2:"E";s:3:"瓻";s:2:"F";s:3:"瓼";s:2:"G";s:3:"瓽";s:2:"H";s:3:"瓾";s:2:"I";s:3:"甀";s:2:"J";s:3:"甁";s:2:"K";s:3:"甂";s:2:"L";s:3:"甃";s:2:"M";s:3:"甅";s:2:"N";s:3:"甆";s:2:"O";s:3:"甇";s:2:"P";s:3:"甈";s:2:"Q";s:3:"甉";s:2:"R";s:3:"甊";s:2:"S";s:3:"甋";s:2:"T";s:3:"甌";s:2:"U";s:3:"甎";s:2:"V";s:3:"甐";s:2:"W";s:3:"甒";s:2:"X";s:3:"甔";s:2:"Y";s:3:"甕";s:2:"Z";s:3:"甖";s:2:"[";s:3:"甗";s:2:"\";s:3:"甛";s:2:"]";s:3:"甝";s:2:"^";s:3:"甞";s:2:"_";s:3:"甠";s:2:"`";s:3:"甡";s:2:"a";s:3:"產";s:2:"b";s:3:"産";s:2:"c";s:3:"甤";s:2:"d";s:3:"甦";s:2:"e";s:3:"甧";s:2:"f";s:3:"甪";s:2:"g";s:3:"甮";s:2:"h";s:3:"甴";s:2:"i";s:3:"甶";s:2:"j";s:3:"甹";s:2:"k";s:3:"甼";s:2:"l";s:3:"甽";s:2:"m";s:3:"甿";s:2:"n";s:3:"畁";s:2:"o";s:3:"畂";s:2:"p";s:3:"畃";s:2:"q";s:3:"畄";s:2:"r";s:3:"畆";s:2:"s";s:3:"畇";s:2:"t";s:3:"畉";s:2:"u";s:3:"畊";s:2:"v";s:3:"畍";s:2:"w";s:3:"畐";s:2:"x";s:3:"畑";s:2:"y";s:3:"畒";s:2:"z";s:3:"畓";s:2:"{";s:3:"畕";s:2:"|";s:3:"畖";s:2:"}";s:3:"畗";s:2:"~";s:3:"畘";s:2:"";s:3:"畝";s:2:"";s:3:"畞";s:2:"";s:3:"畟";s:2:"";s:3:"畠";s:2:"";s:3:"畡";s:2:"";s:3:"畢";s:2:"";s:3:"畣";s:2:"";s:3:"畤";s:2:"";s:3:"畧";s:2:"";s:3:"畨";s:2:"";s:3:"畩";s:2:"";s:3:"畫";s:2:"";s:3:"畬";s:2:"";s:3:"畭";s:2:"";s:3:"畮";s:2:"";s:3:"畯";s:2:"";s:3:"異";s:2:"";s:3:"畱";s:2:"";s:3:"畳";s:2:"";s:3:"畵";s:2:"";s:3:"當";s:2:"";s:3:"畷";s:2:"";s:3:"畺";s:2:"";s:3:"畻";s:2:"";s:3:"畼";s:2:"";s:3:"畽";s:2:"";s:3:"畾";s:2:"";s:3:"疀";s:2:"";s:3:"疁";s:2:"";s:3:"疂";s:2:"";s:3:"疄";s:2:"";s:3:"疅";s:2:"";s:3:"疇";s:2:"@";s:3:"疈";s:2:"A";s:3:"疉";s:2:"B";s:3:"疊";s:2:"C";s:3:"疌";s:2:"D";s:3:"疍";s:2:"E";s:3:"疎";s:2:"F";s:3:"疐";s:2:"G";s:3:"疓";s:2:"H";s:3:"疕";s:2:"I";s:3:"疘";s:2:"J";s:3:"疛";s:2:"K";s:3:"疜";s:2:"L";s:3:"疞";s:2:"M";s:3:"疢";s:2:"N";s:3:"疦";s:2:"O";s:3:"疧";s:2:"P";s:3:"疨";s:2:"Q";s:3:"疩";s:2:"R";s:3:"疪";s:2:"S";s:3:"疭";s:2:"T";s:3:"疶";s:2:"U";s:3:"疷";s:2:"V";s:3:"疺";s:2:"W";s:3:"疻";s:2:"X";s:3:"疿";s:2:"Y";s:3:"痀";s:2:"Z";s:3:"痁";s:2:"[";s:3:"痆";s:2:"\";s:3:"痋";s:2:"]";s:3:"痌";s:2:"^";s:3:"痎";s:2:"_";s:3:"痏";s:2:"`";s:3:"痐";s:2:"a";s:3:"痑";s:2:"b";s:3:"痓";s:2:"c";s:3:"痗";s:2:"d";s:3:"痙";s:2:"e";s:3:"痚";s:2:"f";s:3:"痜";s:2:"g";s:3:"痝";s:2:"h";s:3:"痟";s:2:"i";s:3:"痠";s:2:"j";s:3:"痡";s:2:"k";s:3:"痥";s:2:"l";s:3:"痩";s:2:"m";s:3:"痬";s:2:"n";s:3:"痭";s:2:"o";s:3:"痮";s:2:"p";s:3:"痯";s:2:"q";s:3:"痲";s:2:"r";s:3:"痳";s:2:"s";s:3:"痵";s:2:"t";s:3:"痶";s:2:"u";s:3:"痷";s:2:"v";s:3:"痸";s:2:"w";s:3:"痺";s:2:"x";s:3:"痻";s:2:"y";s:3:"痽";s:2:"z";s:3:"痾";s:2:"{";s:3:"瘂";s:2:"|";s:3:"瘄";s:2:"}";s:3:"瘆";s:2:"~";s:3:"瘇";s:2:"";s:3:"瘈";s:2:"";s:3:"瘉";s:2:"";s:3:"瘋";s:2:"";s:3:"瘍";s:2:"";s:3:"瘎";s:2:"";s:3:"瘏";s:2:"";s:3:"瘑";s:2:"";s:3:"瘒";s:2:"";s:3:"瘓";s:2:"";s:3:"瘔";s:2:"";s:3:"瘖";s:2:"";s:3:"瘚";s:2:"";s:3:"瘜";s:2:"";s:3:"瘝";s:2:"";s:3:"瘞";s:2:"";s:3:"瘡";s:2:"";s:3:"瘣";s:2:"";s:3:"瘧";s:2:"";s:3:"瘨";s:2:"";s:3:"瘬";s:2:"";s:3:"瘮";s:2:"";s:3:"瘯";s:2:"";s:3:"瘱";s:2:"";s:3:"瘲";s:2:"";s:3:"瘶";s:2:"";s:3:"瘷";s:2:"";s:3:"瘹";s:2:"";s:3:"瘺";s:2:"";s:3:"瘻";s:2:"";s:3:"瘽";s:2:"";s:3:"癁";s:2:"";s:3:"療";s:2:"";s:3:"癄";s:2:"@";s:3:"癅";s:2:"A";s:3:"癆";s:2:"B";s:3:"癇";s:2:"C";s:3:"癈";s:2:"D";s:3:"癉";s:2:"E";s:3:"癊";s:2:"F";s:3:"癋";s:2:"G";s:3:"癎";s:2:"H";s:3:"癏";s:2:"I";s:3:"癐";s:2:"J";s:3:"癑";s:2:"K";s:3:"癒";s:2:"L";s:3:"癓";s:2:"M";s:3:"癕";s:2:"N";s:3:"癗";s:2:"O";s:3:"癘";s:2:"P";s:3:"癙";s:2:"Q";s:3:"癚";s:2:"R";s:3:"癛";s:2:"S";s:3:"癝";s:2:"T";s:3:"癟";s:2:"U";s:3:"癠";s:2:"V";s:3:"癡";s:2:"W";s:3:"癢";s:2:"X";s:3:"癤";s:2:"Y";s:3:"癥";s:2:"Z";s:3:"癦";s:2:"[";s:3:"癧";s:2:"\";s:3:"癨";s:2:"]";s:3:"癩";s:2:"^";s:3:"癪";s:2:"_";s:3:"癬";s:2:"`";s:3:"癭";s:2:"a";s:3:"癮";s:2:"b";s:3:"癰";s:2:"c";s:3:"癱";s:2:"d";s:3:"癲";s:2:"e";s:3:"癳";s:2:"f";s:3:"癴";s:2:"g";s:3:"癵";s:2:"h";s:3:"癶";s:2:"i";s:3:"癷";s:2:"j";s:3:"癹";s:2:"k";s:3:"発";s:2:"l";s:3:"發";s:2:"m";s:3:"癿";s:2:"n";s:3:"皀";s:2:"o";s:3:"皁";s:2:"p";s:3:"皃";s:2:"q";s:3:"皅";s:2:"r";s:3:"皉";s:2:"s";s:3:"皊";s:2:"t";s:3:"皌";s:2:"u";s:3:"皍";s:2:"v";s:3:"皏";s:2:"w";s:3:"皐";s:2:"x";s:3:"皒";s:2:"y";s:3:"皔";s:2:"z";s:3:"皕";s:2:"{";s:3:"皗";s:2:"|";s:3:"皘";s:2:"}";s:3:"皚";s:2:"~";s:3:"皛";s:2:"";s:3:"皜";s:2:"";s:3:"皝";s:2:"";s:3:"皞";s:2:"";s:3:"皟";s:2:"";s:3:"皠";s:2:"";s:3:"皡";s:2:"";s:3:"皢";s:2:"";s:3:"皣";s:2:"";s:3:"皥";s:2:"";s:3:"皦";s:2:"";s:3:"皧";s:2:"";s:3:"皨";s:2:"";s:3:"皩";s:2:"";s:3:"皪";s:2:"";s:3:"皫";s:2:"";s:3:"皬";s:2:"";s:3:"皭";s:2:"";s:3:"皯";s:2:"";s:3:"皰";s:2:"";s:3:"皳";s:2:"";s:3:"皵";s:2:"";s:3:"皶";s:2:"";s:3:"皷";s:2:"";s:3:"皸";s:2:"";s:3:"皹";s:2:"";s:3:"皺";s:2:"";s:3:"皻";s:2:"";s:3:"皼";s:2:"";s:3:"皽";s:2:"";s:3:"皾";s:2:"";s:3:"盀";s:2:"";s:3:"盁";s:2:"";s:3:"盃";s:2:"";s:3:"啊";s:2:"";s:3:"阿";s:2:"";s:3:"埃";s:2:"";s:3:"挨";s:2:"";s:3:"哎";s:2:"";s:3:"唉";s:2:"";s:3:"哀";s:2:"";s:3:"皑";s:2:"";s:3:"癌";s:2:"";s:3:"蔼";s:2:"";s:3:"矮";s:2:"";s:3:"艾";s:2:"";s:3:"碍";s:2:"";s:3:"爱";s:2:"";s:3:"隘";s:2:"";s:3:"鞍";s:2:"";s:3:"氨";s:2:"";s:3:"安";s:2:"";s:3:"俺";s:2:"";s:3:"按";s:2:"";s:3:"暗";s:2:"";s:3:"岸";s:2:"";s:3:"胺";s:2:"";s:3:"案";s:2:"";s:3:"肮";s:2:"";s:3:"昂";s:2:"";s:3:"盎";s:2:"";s:3:"凹";s:2:"";s:3:"敖";s:2:"";s:3:"熬";s:2:"";s:3:"翱";s:2:"";s:3:"袄";s:2:"";s:3:"傲";s:2:"";s:3:"奥";s:2:"";s:3:"懊";s:2:"";s:3:"澳";s:2:"";s:3:"芭";s:2:"";s:3:"捌";s:2:"";s:3:"扒";s:2:"";s:3:"叭";s:2:"";s:3:"吧";s:2:"";s:3:"笆";s:2:"";s:3:"八";s:2:"";s:3:"疤";s:2:"";s:3:"巴";s:2:"";s:3:"拔";s:2:"";s:3:"跋";s:2:"";s:3:"靶";s:2:"";s:3:"把";s:2:"";s:3:"耙";s:2:"";s:3:"坝";s:2:"";s:3:"霸";s:2:"";s:3:"罢";s:2:"";s:3:"爸";s:2:"";s:3:"白";s:2:"";s:3:"柏";s:2:"";s:3:"百";s:2:"";s:3:"摆";s:2:"";s:3:"佰";s:2:"";s:3:"败";s:2:"";s:3:"拜";s:2:"";s:3:"稗";s:2:"";s:3:"斑";s:2:"";s:3:"班";s:2:"";s:3:"搬";s:2:"";s:3:"扳";s:2:"";s:3:"般";s:2:"";s:3:"颁";s:2:"";s:3:"板";s:2:"";s:3:"版";s:2:"";s:3:"扮";s:2:"";s:3:"拌";s:2:"";s:3:"伴";s:2:"";s:3:"瓣";s:2:"";s:3:"半";s:2:"";s:3:"办";s:2:"";s:3:"绊";s:2:"";s:3:"邦";s:2:"";s:3:"帮";s:2:"";s:3:"梆";s:2:"";s:3:"榜";s:2:"";s:3:"膀";s:2:"";s:3:"绑";s:2:"";s:3:"棒";s:2:"";s:3:"磅";s:2:"";s:3:"蚌";s:2:"";s:3:"镑";s:2:"";s:3:"傍";s:2:"";s:3:"谤";s:2:"";s:3:"苞";s:2:"";s:3:"胞";s:2:"";s:3:"包";s:2:"";s:3:"褒";s:2:"";s:3:"剥";s:2:"@";s:3:"盄";s:2:"A";s:3:"盇";s:2:"B";s:3:"盉";s:2:"C";s:3:"盋";s:2:"D";s:3:"盌";s:2:"E";s:3:"盓";s:2:"F";s:3:"盕";s:2:"G";s:3:"盙";s:2:"H";s:3:"盚";s:2:"I";s:3:"盜";s:2:"J";s:3:"盝";s:2:"K";s:3:"盞";s:2:"L";s:3:"盠";s:2:"M";s:3:"盡";s:2:"N";s:3:"盢";s:2:"O";s:3:"監";s:2:"P";s:3:"盤";s:2:"Q";s:3:"盦";s:2:"R";s:3:"盧";s:2:"S";s:3:"盨";s:2:"T";s:3:"盩";s:2:"U";s:3:"盪";s:2:"V";s:3:"盫";s:2:"W";s:3:"盬";s:2:"X";s:3:"盭";s:2:"Y";s:3:"盰";s:2:"Z";s:3:"盳";s:2:"[";s:3:"盵";s:2:"\";s:3:"盶";s:2:"]";s:3:"盷";s:2:"^";s:3:"盺";s:2:"_";s:3:"盻";s:2:"`";s:3:"盽";s:2:"a";s:3:"盿";s:2:"b";s:3:"眀";s:2:"c";s:3:"眂";s:2:"d";s:3:"眃";s:2:"e";s:3:"眅";s:2:"f";s:3:"眆";s:2:"g";s:3:"眊";s:2:"h";s:3:"県";s:2:"i";s:3:"眎";s:2:"j";s:3:"眏";s:2:"k";s:3:"眐";s:2:"l";s:3:"眑";s:2:"m";s:3:"眒";s:2:"n";s:3:"眓";s:2:"o";s:3:"眔";s:2:"p";s:3:"眕";s:2:"q";s:3:"眖";s:2:"r";s:3:"眗";s:2:"s";s:3:"眘";s:2:"t";s:3:"眛";s:2:"u";s:3:"眜";s:2:"v";s:3:"眝";s:2:"w";s:3:"眞";s:2:"x";s:3:"眡";s:2:"y";s:3:"眣";s:2:"z";s:3:"眤";s:2:"{";s:3:"眥";s:2:"|";s:3:"眧";s:2:"}";s:3:"眪";s:2:"~";s:3:"眫";s:2:"";s:3:"眬";s:2:"";s:3:"眮";s:2:"";s:3:"眰";s:2:"";s:3:"眱";s:2:"";s:3:"眲";s:2:"";s:3:"眳";s:2:"";s:3:"眴";s:2:"";s:3:"眹";s:2:"";s:3:"眻";s:2:"";s:3:"眽";s:2:"";s:3:"眾";s:2:"";s:3:"眿";s:2:"";s:3:"睂";s:2:"";s:3:"睄";s:2:"";s:3:"睅";s:2:"";s:3:"睆";s:2:"";s:3:"睈";s:2:"";s:3:"睉";s:2:"";s:3:"睊";s:2:"";s:3:"睋";s:2:"";s:3:"睌";s:2:"";s:3:"睍";s:2:"";s:3:"睎";s:2:"";s:3:"睏";s:2:"";s:3:"睒";s:2:"";s:3:"睓";s:2:"";s:3:"睔";s:2:"";s:3:"睕";s:2:"";s:3:"睖";s:2:"";s:3:"睗";s:2:"";s:3:"睘";s:2:"";s:3:"睙";s:2:"";s:3:"睜";s:2:"";s:3:"薄";s:2:"";s:3:"雹";s:2:"";s:3:"保";s:2:"";s:3:"堡";s:2:"";s:3:"饱";s:2:"";s:3:"宝";s:2:"";s:3:"抱";s:2:"";s:3:"报";s:2:"";s:3:"暴";s:2:"";s:3:"豹";s:2:"";s:3:"鲍";s:2:"";s:3:"爆";s:2:"";s:3:"杯";s:2:"";s:3:"碑";s:2:"";s:3:"悲";s:2:"";s:3:"卑";s:2:"";s:3:"北";s:2:"";s:3:"辈";s:2:"";s:3:"背";s:2:"";s:3:"贝";s:2:"";s:3:"钡";s:2:"";s:3:"倍";s:2:"";s:3:"狈";s:2:"";s:3:"备";s:2:"";s:3:"惫";s:2:"";s:3:"焙";s:2:"";s:3:"被";s:2:"";s:3:"奔";s:2:"";s:3:"苯";s:2:"";s:3:"本";s:2:"";s:3:"笨";s:2:"";s:3:"崩";s:2:"";s:3:"绷";s:2:"";s:3:"甭";s:2:"";s:3:"泵";s:2:"";s:3:"蹦";s:2:"";s:3:"迸";s:2:"";s:3:"逼";s:2:"";s:3:"鼻";s:2:"";s:3:"比";s:2:"";s:3:"鄙";s:2:"";s:3:"笔";s:2:"";s:3:"彼";s:2:"";s:3:"碧";s:2:"";s:3:"蓖";s:2:"";s:3:"蔽";s:2:"";s:3:"毕";s:2:"";s:3:"毙";s:2:"";s:3:"毖";s:2:"";s:3:"币";s:2:"";s:3:"庇";s:2:"";s:3:"痹";s:2:"";s:3:"闭";s:2:"";s:3:"敝";s:2:"";s:3:"弊";s:2:"";s:3:"必";s:2:"";s:3:"辟";s:2:"";s:3:"壁";s:2:"";s:3:"臂";s:2:"";s:3:"避";s:2:"";s:3:"陛";s:2:"";s:3:"鞭";s:2:"";s:3:"边";s:2:"";s:3:"编";s:2:"";s:3:"贬";s:2:"";s:3:"扁";s:2:"";s:3:"便";s:2:"";s:3:"变";s:2:"";s:3:"卞";s:2:"";s:3:"辨";s:2:"";s:3:"辩";s:2:"";s:3:"辫";s:2:"";s:3:"遍";s:2:"";s:3:"标";s:2:"";s:3:"彪";s:2:"";s:3:"膘";s:2:"";s:3:"表";s:2:"";s:3:"鳖";s:2:"";s:3:"憋";s:2:"";s:3:"别";s:2:"";s:3:"瘪";s:2:"";s:3:"彬";s:2:"";s:3:"斌";s:2:"";s:3:"濒";s:2:"";s:3:"滨";s:2:"";s:3:"宾";s:2:"";s:3:"摈";s:2:"";s:3:"兵";s:2:"";s:3:"冰";s:2:"";s:3:"柄";s:2:"";s:3:"丙";s:2:"";s:3:"秉";s:2:"";s:3:"饼";s:2:"";s:3:"炳";s:2:"@";s:3:"睝";s:2:"A";s:3:"睞";s:2:"B";s:3:"睟";s:2:"C";s:3:"睠";s:2:"D";s:3:"睤";s:2:"E";s:3:"睧";s:2:"F";s:3:"睩";s:2:"G";s:3:"睪";s:2:"H";s:3:"睭";s:2:"I";s:3:"睮";s:2:"J";s:3:"睯";s:2:"K";s:3:"睰";s:2:"L";s:3:"睱";s:2:"M";s:3:"睲";s:2:"N";s:3:"睳";s:2:"O";s:3:"睴";s:2:"P";s:3:"睵";s:2:"Q";s:3:"睶";s:2:"R";s:3:"睷";s:2:"S";s:3:"睸";s:2:"T";s:3:"睺";s:2:"U";s:3:"睻";s:2:"V";s:3:"睼";s:2:"W";s:3:"瞁";s:2:"X";s:3:"瞂";s:2:"Y";s:3:"瞃";s:2:"Z";s:3:"瞆";s:2:"[";s:3:"瞇";s:2:"\";s:3:"瞈";s:2:"]";s:3:"瞉";s:2:"^";s:3:"瞊";s:2:"_";s:3:"瞋";s:2:"`";s:3:"瞏";s:2:"a";s:3:"瞐";s:2:"b";s:3:"瞓";s:2:"c";s:3:"瞔";s:2:"d";s:3:"瞕";s:2:"e";s:3:"瞖";s:2:"f";s:3:"瞗";s:2:"g";s:3:"瞘";s:2:"h";s:3:"瞙";s:2:"i";s:3:"瞚";s:2:"j";s:3:"瞛";s:2:"k";s:3:"瞜";s:2:"l";s:3:"瞝";s:2:"m";s:3:"瞞";s:2:"n";s:3:"瞡";s:2:"o";s:3:"瞣";s:2:"p";s:3:"瞤";s:2:"q";s:3:"瞦";s:2:"r";s:3:"瞨";s:2:"s";s:3:"瞫";s:2:"t";s:3:"瞭";s:2:"u";s:3:"瞮";s:2:"v";s:3:"瞯";s:2:"w";s:3:"瞱";s:2:"x";s:3:"瞲";s:2:"y";s:3:"瞴";s:2:"z";s:3:"瞶";s:2:"{";s:3:"瞷";s:2:"|";s:3:"瞸";s:2:"}";s:3:"瞹";s:2:"~";s:3:"瞺";s:2:"";s:3:"瞼";s:2:"";s:3:"瞾";s:2:"";s:3:"矀";s:2:"";s:3:"矁";s:2:"";s:3:"矂";s:2:"";s:3:"矃";s:2:"";s:3:"矄";s:2:"";s:3:"矅";s:2:"";s:3:"矆";s:2:"";s:3:"矇";s:2:"";s:3:"矈";s:2:"";s:3:"矉";s:2:"";s:3:"矊";s:2:"";s:3:"矋";s:2:"";s:3:"矌";s:2:"";s:3:"矎";s:2:"";s:3:"矏";s:2:"";s:3:"矐";s:2:"";s:3:"矑";s:2:"";s:3:"矒";s:2:"";s:3:"矓";s:2:"";s:3:"矔";s:2:"";s:3:"矕";s:2:"";s:3:"矖";s:2:"";s:3:"矘";s:2:"";s:3:"矙";s:2:"";s:3:"矚";s:2:"";s:3:"矝";s:2:"";s:3:"矞";s:2:"";s:3:"矟";s:2:"";s:3:"矠";s:2:"";s:3:"矡";s:2:"";s:3:"矤";s:2:"";s:3:"病";s:2:"";s:3:"并";s:2:"";s:3:"玻";s:2:"";s:3:"菠";s:2:"";s:3:"播";s:2:"";s:3:"拨";s:2:"";s:3:"钵";s:2:"";s:3:"波";s:2:"";s:3:"博";s:2:"";s:3:"勃";s:2:"";s:3:"搏";s:2:"";s:3:"铂";s:2:"";s:3:"箔";s:2:"";s:3:"伯";s:2:"";s:3:"帛";s:2:"";s:3:"舶";s:2:"";s:3:"脖";s:2:"";s:3:"膊";s:2:"";s:3:"渤";s:2:"";s:3:"泊";s:2:"";s:3:"驳";s:2:"";s:3:"捕";s:2:"";s:3:"卜";s:2:"";s:3:"哺";s:2:"";s:3:"补";s:2:"";s:3:"埠";s:2:"";s:3:"不";s:2:"";s:3:"布";s:2:"";s:3:"步";s:2:"";s:3:"簿";s:2:"";s:3:"部";s:2:"";s:3:"怖";s:2:"";s:3:"擦";s:2:"";s:3:"猜";s:2:"";s:3:"裁";s:2:"";s:3:"材";s:2:"";s:3:"才";s:2:"";s:3:"财";s:2:"";s:3:"睬";s:2:"";s:3:"踩";s:2:"";s:3:"采";s:2:"";s:3:"彩";s:2:"";s:3:"菜";s:2:"";s:3:"蔡";s:2:"";s:3:"餐";s:2:"";s:3:"参";s:2:"";s:3:"蚕";s:2:"";s:3:"残";s:2:"";s:3:"惭";s:2:"";s:3:"惨";s:2:"";s:3:"灿";s:2:"";s:3:"苍";s:2:"";s:3:"舱";s:2:"";s:3:"仓";s:2:"";s:3:"沧";s:2:"";s:3:"藏";s:2:"";s:3:"操";s:2:"";s:3:"糙";s:2:"";s:3:"槽";s:2:"";s:3:"曹";s:2:"";s:3:"草";s:2:"";s:3:"厕";s:2:"";s:3:"策";s:2:"";s:3:"侧";s:2:"";s:3:"册";s:2:"";s:3:"测";s:2:"";s:3:"层";s:2:"";s:3:"蹭";s:2:"";s:3:"插";s:2:"";s:3:"叉";s:2:"";s:3:"茬";s:2:"";s:3:"茶";s:2:"";s:3:"查";s:2:"";s:3:"碴";s:2:"";s:3:"搽";s:2:"";s:3:"察";s:2:"";s:3:"岔";s:2:"";s:3:"差";s:2:"";s:3:"诧";s:2:"";s:3:"拆";s:2:"";s:3:"柴";s:2:"";s:3:"豺";s:2:"";s:3:"搀";s:2:"";s:3:"掺";s:2:"";s:3:"蝉";s:2:"";s:3:"馋";s:2:"";s:3:"谗";s:2:"";s:3:"缠";s:2:"";s:3:"铲";s:2:"";s:3:"产";s:2:"";s:3:"阐";s:2:"";s:3:"颤";s:2:"";s:3:"昌";s:2:"";s:3:"猖";s:2:"@";s:3:"矦";s:2:"A";s:3:"矨";s:2:"B";s:3:"矪";s:2:"C";s:3:"矯";s:2:"D";s:3:"矰";s:2:"E";s:3:"矱";s:2:"F";s:3:"矲";s:2:"G";s:3:"矴";s:2:"H";s:3:"矵";s:2:"I";s:3:"矷";s:2:"J";s:3:"矹";s:2:"K";s:3:"矺";s:2:"L";s:3:"矻";s:2:"M";s:3:"矼";s:2:"N";s:3:"砃";s:2:"O";s:3:"砄";s:2:"P";s:3:"砅";s:2:"Q";s:3:"砆";s:2:"R";s:3:"砇";s:2:"S";s:3:"砈";s:2:"T";s:3:"砊";s:2:"U";s:3:"砋";s:2:"V";s:3:"砎";s:2:"W";s:3:"砏";s:2:"X";s:3:"砐";s:2:"Y";s:3:"砓";s:2:"Z";s:3:"砕";s:2:"[";s:3:"砙";s:2:"\";s:3:"砛";s:2:"]";s:3:"砞";s:2:"^";s:3:"砠";s:2:"_";s:3:"砡";s:2:"`";s:3:"砢";s:2:"a";s:3:"砤";s:2:"b";s:3:"砨";s:2:"c";s:3:"砪";s:2:"d";s:3:"砫";s:2:"e";s:3:"砮";s:2:"f";s:3:"砯";s:2:"g";s:3:"砱";s:2:"h";s:3:"砲";s:2:"i";s:3:"砳";s:2:"j";s:3:"砵";s:2:"k";s:3:"砶";s:2:"l";s:3:"砽";s:2:"m";s:3:"砿";s:2:"n";s:3:"硁";s:2:"o";s:3:"硂";s:2:"p";s:3:"硃";s:2:"q";s:3:"硄";s:2:"r";s:3:"硆";s:2:"s";s:3:"硈";s:2:"t";s:3:"硉";s:2:"u";s:3:"硊";s:2:"v";s:3:"硋";s:2:"w";s:3:"硍";s:2:"x";s:3:"硏";s:2:"y";s:3:"硑";s:2:"z";s:3:"硓";s:2:"{";s:3:"硔";s:2:"|";s:3:"硘";s:2:"}";s:3:"硙";s:2:"~";s:3:"硚";s:2:"";s:3:"硛";s:2:"";s:3:"硜";s:2:"";s:3:"硞";s:2:"";s:3:"硟";s:2:"";s:3:"硠";s:2:"";s:3:"硡";s:2:"";s:3:"硢";s:2:"";s:3:"硣";s:2:"";s:3:"硤";s:2:"";s:3:"硥";s:2:"";s:3:"硦";s:2:"";s:3:"硧";s:2:"";s:3:"硨";s:2:"";s:3:"硩";s:2:"";s:3:"硯";s:2:"";s:3:"硰";s:2:"";s:3:"硱";s:2:"";s:3:"硲";s:2:"";s:3:"硳";s:2:"";s:3:"硴";s:2:"";s:3:"硵";s:2:"";s:3:"硶";s:2:"";s:3:"硸";s:2:"";s:3:"硹";s:2:"";s:3:"硺";s:2:"";s:3:"硻";s:2:"";s:3:"硽";s:2:"";s:3:"硾";s:2:"";s:3:"硿";s:2:"";s:3:"碀";s:2:"";s:3:"碁";s:2:"";s:3:"碂";s:2:"";s:3:"碃";s:2:"";s:3:"场";s:2:"";s:3:"尝";s:2:"";s:3:"常";s:2:"";s:3:"长";s:2:"";s:3:"偿";s:2:"";s:3:"肠";s:2:"";s:3:"厂";s:2:"";s:3:"敞";s:2:"";s:3:"畅";s:2:"";s:3:"唱";s:2:"";s:3:"倡";s:2:"";s:3:"超";s:2:"";s:3:"抄";s:2:"";s:3:"钞";s:2:"";s:3:"朝";s:2:"";s:3:"嘲";s:2:"";s:3:"潮";s:2:"";s:3:"巢";s:2:"";s:3:"吵";s:2:"";s:3:"炒";s:2:"";s:3:"车";s:2:"";s:3:"扯";s:2:"";s:3:"撤";s:2:"";s:3:"掣";s:2:"";s:3:"彻";s:2:"";s:3:"澈";s:2:"";s:3:"郴";s:2:"";s:3:"臣";s:2:"";s:3:"辰";s:2:"";s:3:"尘";s:2:"";s:3:"晨";s:2:"";s:3:"忱";s:2:"";s:3:"沉";s:2:"";s:3:"陈";s:2:"";s:3:"趁";s:2:"";s:3:"衬";s:2:"";s:3:"撑";s:2:"";s:3:"称";s:2:"";s:3:"城";s:2:"";s:3:"橙";s:2:"";s:3:"成";s:2:"";s:3:"呈";s:2:"";s:3:"乘";s:2:"";s:3:"程";s:2:"";s:3:"惩";s:2:"";s:3:"澄";s:2:"";s:3:"诚";s:2:"";s:3:"承";s:2:"";s:3:"逞";s:2:"";s:3:"骋";s:2:"";s:3:"秤";s:2:"";s:3:"吃";s:2:"";s:3:"痴";s:2:"";s:3:"持";s:2:"";s:3:"匙";s:2:"";s:3:"池";s:2:"";s:3:"迟";s:2:"";s:3:"弛";s:2:"";s:3:"驰";s:2:"";s:3:"耻";s:2:"";s:3:"齿";s:2:"";s:3:"侈";s:2:"";s:3:"尺";s:2:"";s:3:"赤";s:2:"";s:3:"翅";s:2:"";s:3:"斥";s:2:"";s:3:"炽";s:2:"";s:3:"充";s:2:"";s:3:"冲";s:2:"";s:3:"虫";s:2:"";s:3:"崇";s:2:"";s:3:"宠";s:2:"";s:3:"抽";s:2:"";s:3:"酬";s:2:"";s:3:"畴";s:2:"";s:3:"踌";s:2:"";s:3:"稠";s:2:"";s:3:"愁";s:2:"";s:3:"筹";s:2:"";s:3:"仇";s:2:"";s:3:"绸";s:2:"";s:3:"瞅";s:2:"";s:3:"丑";s:2:"";s:3:"臭";s:2:"";s:3:"初";s:2:"";s:3:"出";s:2:"";s:3:"橱";s:2:"";s:3:"厨";s:2:"";s:3:"躇";s:2:"";s:3:"锄";s:2:"";s:3:"雏";s:2:"";s:3:"滁";s:2:"";s:3:"除";s:2:"";s:3:"楚";s:2:"@";s:3:"碄";s:2:"A";s:3:"碅";s:2:"B";s:3:"碆";s:2:"C";s:3:"碈";s:2:"D";s:3:"碊";s:2:"E";s:3:"碋";s:2:"F";s:3:"碏";s:2:"G";s:3:"碐";s:2:"H";s:3:"碒";s:2:"I";s:3:"碔";s:2:"J";s:3:"碕";s:2:"K";s:3:"碖";s:2:"L";s:3:"碙";s:2:"M";s:3:"碝";s:2:"N";s:3:"碞";s:2:"O";s:3:"碠";s:2:"P";s:3:"碢";s:2:"Q";s:3:"碤";s:2:"R";s:3:"碦";s:2:"S";s:3:"碨";s:2:"T";s:3:"碩";s:2:"U";s:3:"碪";s:2:"V";s:3:"碫";s:2:"W";s:3:"碬";s:2:"X";s:3:"碭";s:2:"Y";s:3:"碮";s:2:"Z";s:3:"碯";s:2:"[";s:3:"碵";s:2:"\";s:3:"碶";s:2:"]";s:3:"碷";s:2:"^";s:3:"碸";s:2:"_";s:3:"確";s:2:"`";s:3:"碻";s:2:"a";s:3:"碼";s:2:"b";s:3:"碽";s:2:"c";s:3:"碿";s:2:"d";s:3:"磀";s:2:"e";s:3:"磂";s:2:"f";s:3:"磃";s:2:"g";s:3:"磄";s:2:"h";s:3:"磆";s:2:"i";s:3:"磇";s:2:"j";s:3:"磈";s:2:"k";s:3:"磌";s:2:"l";s:3:"磍";s:2:"m";s:3:"磎";s:2:"n";s:3:"磏";s:2:"o";s:3:"磑";s:2:"p";s:3:"磒";s:2:"q";s:3:"磓";s:2:"r";s:3:"磖";s:2:"s";s:3:"磗";s:2:"t";s:3:"磘";s:2:"u";s:3:"磚";s:2:"v";s:3:"磛";s:2:"w";s:3:"磜";s:2:"x";s:3:"磝";s:2:"y";s:3:"磞";s:2:"z";s:3:"磟";s:2:"{";s:3:"磠";s:2:"|";s:3:"磡";s:2:"}";s:3:"磢";s:2:"~";s:3:"磣";s:2:"";s:3:"磤";s:2:"";s:3:"磥";s:2:"";s:3:"磦";s:2:"";s:3:"磧";s:2:"";s:3:"磩";s:2:"";s:3:"磪";s:2:"";s:3:"磫";s:2:"";s:3:"磭";s:2:"";s:3:"磮";s:2:"";s:3:"磯";s:2:"";s:3:"磰";s:2:"";s:3:"磱";s:2:"";s:3:"磳";s:2:"";s:3:"磵";s:2:"";s:3:"磶";s:2:"";s:3:"磸";s:2:"";s:3:"磹";s:2:"";s:3:"磻";s:2:"";s:3:"磼";s:2:"";s:3:"磽";s:2:"";s:3:"磾";s:2:"";s:3:"磿";s:2:"";s:3:"礀";s:2:"";s:3:"礂";s:2:"";s:3:"礃";s:2:"";s:3:"礄";s:2:"";s:3:"礆";s:2:"";s:3:"礇";s:2:"";s:3:"礈";s:2:"";s:3:"礉";s:2:"";s:3:"礊";s:2:"";s:3:"礋";s:2:"";s:3:"礌";s:2:"";s:3:"础";s:2:"";s:3:"储";s:2:"";s:3:"矗";s:2:"";s:3:"搐";s:2:"";s:3:"触";s:2:"";s:3:"处";s:2:"";s:3:"揣";s:2:"";s:3:"川";s:2:"";s:3:"穿";s:2:"";s:3:"椽";s:2:"";s:3:"传";s:2:"";s:3:"船";s:2:"";s:3:"喘";s:2:"";s:3:"串";s:2:"";s:3:"疮";s:2:"";s:3:"窗";s:2:"";s:3:"幢";s:2:"";s:3:"床";s:2:"";s:3:"闯";s:2:"";s:3:"创";s:2:"";s:3:"吹";s:2:"";s:3:"炊";s:2:"";s:3:"捶";s:2:"";s:3:"锤";s:2:"";s:3:"垂";s:2:"";s:3:"春";s:2:"";s:3:"椿";s:2:"";s:3:"醇";s:2:"";s:3:"唇";s:2:"";s:3:"淳";s:2:"";s:3:"纯";s:2:"";s:3:"蠢";s:2:"";s:3:"戳";s:2:"";s:3:"绰";s:2:"";s:3:"疵";s:2:"";s:3:"茨";s:2:"";s:3:"磁";s:2:"";s:3:"雌";s:2:"";s:3:"辞";s:2:"";s:3:"慈";s:2:"";s:3:"瓷";s:2:"";s:3:"词";s:2:"";s:3:"此";s:2:"";s:3:"刺";s:2:"";s:3:"赐";s:2:"";s:3:"次";s:2:"";s:3:"聪";s:2:"";s:3:"葱";s:2:"";s:3:"囱";s:2:"";s:3:"匆";s:2:"";s:3:"从";s:2:"";s:3:"丛";s:2:"";s:3:"凑";s:2:"";s:3:"粗";s:2:"";s:3:"醋";s:2:"";s:3:"簇";s:2:"";s:3:"促";s:2:"";s:3:"蹿";s:2:"";s:3:"篡";s:2:"";s:3:"窜";s:2:"";s:3:"摧";s:2:"";s:3:"崔";s:2:"";s:3:"催";s:2:"";s:3:"脆";s:2:"";s:3:"瘁";s:2:"";s:3:"粹";s:2:"";s:3:"淬";s:2:"";s:3:"翠";s:2:"";s:3:"村";s:2:"";s:3:"存";s:2:"";s:3:"寸";s:2:"";s:3:"磋";s:2:"";s:3:"撮";s:2:"";s:3:"搓";s:2:"";s:3:"措";s:2:"";s:3:"挫";s:2:"";s:3:"错";s:2:"";s:3:"搭";s:2:"";s:3:"达";s:2:"";s:3:"答";s:2:"";s:3:"瘩";s:2:"";s:3:"打";s:2:"";s:3:"大";s:2:"";s:3:"呆";s:2:"";s:3:"歹";s:2:"";s:3:"傣";s:2:"";s:3:"戴";s:2:"";s:3:"带";s:2:"";s:3:"殆";s:2:"";s:3:"代";s:2:"";s:3:"贷";s:2:"";s:3:"袋";s:2:"";s:3:"待";s:2:"";s:3:"逮";s:2:"@";s:3:"礍";s:2:"A";s:3:"礎";s:2:"B";s:3:"礏";s:2:"C";s:3:"礐";s:2:"D";s:3:"礑";s:2:"E";s:3:"礒";s:2:"F";s:3:"礔";s:2:"G";s:3:"礕";s:2:"H";s:3:"礖";s:2:"I";s:3:"礗";s:2:"J";s:3:"礘";s:2:"K";s:3:"礙";s:2:"L";s:3:"礚";s:2:"M";s:3:"礛";s:2:"N";s:3:"礜";s:2:"O";s:3:"礝";s:2:"P";s:3:"礟";s:2:"Q";s:3:"礠";s:2:"R";s:3:"礡";s:2:"S";s:3:"礢";s:2:"T";s:3:"礣";s:2:"U";s:3:"礥";s:2:"V";s:3:"礦";s:2:"W";s:3:"礧";s:2:"X";s:3:"礨";s:2:"Y";s:3:"礩";s:2:"Z";s:3:"礪";s:2:"[";s:3:"礫";s:2:"\";s:3:"礬";s:2:"]";s:3:"礭";s:2:"^";s:3:"礮";s:2:"_";s:3:"礯";s:2:"`";s:3:"礰";s:2:"a";s:3:"礱";s:2:"b";s:3:"礲";s:2:"c";s:3:"礳";s:2:"d";s:3:"礵";s:2:"e";s:3:"礶";s:2:"f";s:3:"礷";s:2:"g";s:3:"礸";s:2:"h";s:3:"礹";s:2:"i";s:3:"礽";s:2:"j";s:3:"礿";s:2:"k";s:3:"祂";s:2:"l";s:3:"祃";s:2:"m";s:3:"祄";s:2:"n";s:3:"祅";s:2:"o";s:3:"祇";s:2:"p";s:3:"祊";s:2:"q";s:3:"祋";s:2:"r";s:3:"祌";s:2:"s";s:3:"祍";s:2:"t";s:3:"祎";s:2:"u";s:3:"祏";s:2:"v";s:3:"祐";s:2:"w";s:3:"祑";s:2:"x";s:3:"祒";s:2:"y";s:3:"祔";s:2:"z";s:3:"祕";s:2:"{";s:3:"祘";s:2:"|";s:3:"祙";s:2:"}";s:3:"祡";s:2:"~";s:3:"祣";s:2:"";s:3:"祤";s:2:"";s:3:"祦";s:2:"";s:3:"祩";s:2:"";s:3:"祪";s:2:"";s:3:"祫";s:2:"";s:3:"祬";s:2:"";s:3:"祮";s:2:"";s:3:"祰";s:2:"";s:3:"祱";s:2:"";s:3:"祲";s:2:"";s:3:"祳";s:2:"";s:3:"祴";s:2:"";s:3:"祵";s:2:"";s:3:"祶";s:2:"";s:3:"祹";s:2:"";s:3:"祻";s:2:"";s:3:"祼";s:2:"";s:3:"祽";s:2:"";s:3:"祾";s:2:"";s:3:"祿";s:2:"";s:3:"禂";s:2:"";s:3:"禃";s:2:"";s:3:"禆";s:2:"";s:3:"禇";s:2:"";s:3:"禈";s:2:"";s:3:"禉";s:2:"";s:3:"禋";s:2:"";s:3:"禌";s:2:"";s:3:"禍";s:2:"";s:3:"禎";s:2:"";s:3:"禐";s:2:"";s:3:"禑";s:2:"";s:3:"禒";s:2:"";s:3:"怠";s:2:"";s:3:"耽";s:2:"";s:3:"担";s:2:"";s:3:"丹";s:2:"";s:3:"单";s:2:"";s:3:"郸";s:2:"";s:3:"掸";s:2:"";s:3:"胆";s:2:"";s:3:"旦";s:2:"";s:3:"氮";s:2:"";s:3:"但";s:2:"";s:3:"惮";s:2:"";s:3:"淡";s:2:"";s:3:"诞";s:2:"";s:3:"弹";s:2:"";s:3:"蛋";s:2:"";s:3:"当";s:2:"";s:3:"挡";s:2:"";s:3:"党";s:2:"";s:3:"荡";s:2:"";s:3:"档";s:2:"";s:3:"刀";s:2:"";s:3:"捣";s:2:"";s:3:"蹈";s:2:"";s:3:"倒";s:2:"";s:3:"岛";s:2:"";s:3:"祷";s:2:"";s:3:"导";s:2:"";s:3:"到";s:2:"";s:3:"稻";s:2:"";s:3:"悼";s:2:"";s:3:"道";s:2:"";s:3:"盗";s:2:"";s:3:"德";s:2:"";s:3:"得";s:2:"";s:3:"的";s:2:"";s:3:"蹬";s:2:"";s:3:"灯";s:2:"";s:3:"登";s:2:"";s:3:"等";s:2:"";s:3:"瞪";s:2:"";s:3:"凳";s:2:"";s:3:"邓";s:2:"";s:3:"堤";s:2:"";s:3:"低";s:2:"";s:3:"滴";s:2:"";s:3:"迪";s:2:"";s:3:"敌";s:2:"";s:3:"笛";s:2:"";s:3:"狄";s:2:"";s:3:"涤";s:2:"";s:3:"翟";s:2:"";s:3:"嫡";s:2:"";s:3:"抵";s:2:"";s:3:"底";s:2:"";s:3:"地";s:2:"";s:3:"蒂";s:2:"";s:3:"第";s:2:"";s:3:"帝";s:2:"";s:3:"弟";s:2:"";s:3:"递";s:2:"";s:3:"缔";s:2:"";s:3:"颠";s:2:"";s:3:"掂";s:2:"";s:3:"滇";s:2:"";s:3:"碘";s:2:"";s:3:"点";s:2:"";s:3:"典";s:2:"";s:3:"靛";s:2:"";s:3:"垫";s:2:"";s:3:"电";s:2:"";s:3:"佃";s:2:"";s:3:"甸";s:2:"";s:3:"店";s:2:"";s:3:"惦";s:2:"";s:3:"奠";s:2:"";s:3:"淀";s:2:"";s:3:"殿";s:2:"";s:3:"碉";s:2:"";s:3:"叼";s:2:"";s:3:"雕";s:2:"";s:3:"凋";s:2:"";s:3:"刁";s:2:"";s:3:"掉";s:2:"";s:3:"吊";s:2:"";s:3:"钓";s:2:"";s:3:"调";s:2:"";s:3:"跌";s:2:"";s:3:"爹";s:2:"";s:3:"碟";s:2:"";s:3:"蝶";s:2:"";s:3:"迭";s:2:"";s:3:"谍";s:2:"";s:3:"叠";s:2:"@";s:3:"禓";s:2:"A";s:3:"禔";s:2:"B";s:3:"禕";s:2:"C";s:3:"禖";s:2:"D";s:3:"禗";s:2:"E";s:3:"禘";s:2:"F";s:3:"禙";s:2:"G";s:3:"禛";s:2:"H";s:3:"禜";s:2:"I";s:3:"禝";s:2:"J";s:3:"禞";s:2:"K";s:3:"禟";s:2:"L";s:3:"禠";s:2:"M";s:3:"禡";s:2:"N";s:3:"禢";s:2:"O";s:3:"禣";s:2:"P";s:3:"禤";s:2:"Q";s:3:"禥";s:2:"R";s:3:"禦";s:2:"S";s:3:"禨";s:2:"T";s:3:"禩";s:2:"U";s:3:"禪";s:2:"V";s:3:"禫";s:2:"W";s:3:"禬";s:2:"X";s:3:"禭";s:2:"Y";s:3:"禮";s:2:"Z";s:3:"禯";s:2:"[";s:3:"禰";s:2:"\";s:3:"禱";s:2:"]";s:3:"禲";s:2:"^";s:3:"禴";s:2:"_";s:3:"禵";s:2:"`";s:3:"禶";s:2:"a";s:3:"禷";s:2:"b";s:3:"禸";s:2:"c";s:3:"禼";s:2:"d";s:3:"禿";s:2:"e";s:3:"秂";s:2:"f";s:3:"秄";s:2:"g";s:3:"秅";s:2:"h";s:3:"秇";s:2:"i";s:3:"秈";s:2:"j";s:3:"秊";s:2:"k";s:3:"秌";s:2:"l";s:3:"秎";s:2:"m";s:3:"秏";s:2:"n";s:3:"秐";s:2:"o";s:3:"秓";s:2:"p";s:3:"秔";s:2:"q";s:3:"秖";s:2:"r";s:3:"秗";s:2:"s";s:3:"秙";s:2:"t";s:3:"秚";s:2:"u";s:3:"秛";s:2:"v";s:3:"秜";s:2:"w";s:3:"秝";s:2:"x";s:3:"秞";s:2:"y";s:3:"秠";s:2:"z";s:3:"秡";s:2:"{";s:3:"秢";s:2:"|";s:3:"秥";s:2:"}";s:3:"秨";s:2:"~";s:3:"秪";s:2:"";s:3:"秬";s:2:"";s:3:"秮";s:2:"";s:3:"秱";s:2:"";s:3:"秲";s:2:"";s:3:"秳";s:2:"";s:3:"秴";s:2:"";s:3:"秵";s:2:"";s:3:"秶";s:2:"";s:3:"秷";s:2:"";s:3:"秹";s:2:"";s:3:"秺";s:2:"";s:3:"秼";s:2:"";s:3:"秾";s:2:"";s:3:"秿";s:2:"";s:3:"稁";s:2:"";s:3:"稄";s:2:"";s:3:"稅";s:2:"";s:3:"稇";s:2:"";s:3:"稈";s:2:"";s:3:"稉";s:2:"";s:3:"稊";s:2:"";s:3:"稌";s:2:"";s:3:"稏";s:2:"";s:3:"稐";s:2:"";s:3:"稑";s:2:"";s:3:"稒";s:2:"";s:3:"稓";s:2:"";s:3:"稕";s:2:"";s:3:"稖";s:2:"";s:3:"稘";s:2:"";s:3:"稙";s:2:"";s:3:"稛";s:2:"";s:3:"稜";s:2:"";s:3:"丁";s:2:"";s:3:"盯";s:2:"";s:3:"叮";s:2:"";s:3:"钉";s:2:"";s:3:"顶";s:2:"";s:3:"鼎";s:2:"";s:3:"锭";s:2:"";s:3:"定";s:2:"";s:3:"订";s:2:"";s:3:"丢";s:2:"";s:3:"东";s:2:"";s:3:"冬";s:2:"";s:3:"董";s:2:"";s:3:"懂";s:2:"";s:3:"动";s:2:"";s:3:"栋";s:2:"";s:3:"侗";s:2:"";s:3:"恫";s:2:"";s:3:"冻";s:2:"";s:3:"洞";s:2:"";s:3:"兜";s:2:"";s:3:"抖";s:2:"";s:3:"斗";s:2:"";s:3:"陡";s:2:"";s:3:"豆";s:2:"";s:3:"逗";s:2:"";s:3:"痘";s:2:"";s:3:"都";s:2:"";s:3:"督";s:2:"";s:3:"毒";s:2:"";s:3:"犊";s:2:"";s:3:"独";s:2:"";s:3:"读";s:2:"";s:3:"堵";s:2:"";s:3:"睹";s:2:"";s:3:"赌";s:2:"";s:3:"杜";s:2:"";s:3:"镀";s:2:"";s:3:"肚";s:2:"";s:3:"度";s:2:"";s:3:"渡";s:2:"";s:3:"妒";s:2:"";s:3:"端";s:2:"";s:3:"短";s:2:"";s:3:"锻";s:2:"";s:3:"段";s:2:"";s:3:"断";s:2:"";s:3:"缎";s:2:"";s:3:"堆";s:2:"";s:3:"兑";s:2:"";s:3:"队";s:2:"";s:3:"对";s:2:"";s:3:"墩";s:2:"";s:3:"吨";s:2:"";s:3:"蹲";s:2:"";s:3:"敦";s:2:"";s:3:"顿";s:2:"";s:3:"囤";s:2:"";s:3:"钝";s:2:"";s:3:"盾";s:2:"";s:3:"遁";s:2:"";s:3:"掇";s:2:"";s:3:"哆";s:2:"";s:3:"多";s:2:"";s:3:"夺";s:2:"";s:3:"垛";s:2:"";s:3:"躲";s:2:"";s:3:"朵";s:2:"";s:3:"跺";s:2:"";s:3:"舵";s:2:"";s:3:"剁";s:2:"";s:3:"惰";s:2:"";s:3:"堕";s:2:"";s:3:"蛾";s:2:"";s:3:"峨";s:2:"";s:3:"鹅";s:2:"";s:3:"俄";s:2:"";s:3:"额";s:2:"";s:3:"讹";s:2:"";s:3:"娥";s:2:"";s:3:"恶";s:2:"";s:3:"厄";s:2:"";s:3:"扼";s:2:"";s:3:"遏";s:2:"";s:3:"鄂";s:2:"";s:3:"饿";s:2:"";s:3:"恩";s:2:"";s:3:"而";s:2:"";s:3:"儿";s:2:"";s:3:"耳";s:2:"";s:3:"尔";s:2:"";s:3:"饵";s:2:"";s:3:"洱";s:2:"";s:3:"二";s:2:"@";s:3:"稝";s:2:"A";s:3:"稟";s:2:"B";s:3:"稡";s:2:"C";s:3:"稢";s:2:"D";s:3:"稤";s:2:"E";s:3:"稥";s:2:"F";s:3:"稦";s:2:"G";s:3:"稧";s:2:"H";s:3:"稨";s:2:"I";s:3:"稩";s:2:"J";s:3:"稪";s:2:"K";s:3:"稫";s:2:"L";s:3:"稬";s:2:"M";s:3:"稭";s:2:"N";s:3:"種";s:2:"O";s:3:"稯";s:2:"P";s:3:"稰";s:2:"Q";s:3:"稱";s:2:"R";s:3:"稲";s:2:"S";s:3:"稴";s:2:"T";s:3:"稵";s:2:"U";s:3:"稶";s:2:"V";s:3:"稸";s:2:"W";s:3:"稺";s:2:"X";s:3:"稾";s:2:"Y";s:3:"穀";s:2:"Z";s:3:"穁";s:2:"[";s:3:"穂";s:2:"\";s:3:"穃";s:2:"]";s:3:"穄";s:2:"^";s:3:"穅";s:2:"_";s:3:"穇";s:2:"`";s:3:"穈";s:2:"a";s:3:"穉";s:2:"b";s:3:"穊";s:2:"c";s:3:"穋";s:2:"d";s:3:"穌";s:2:"e";s:3:"積";s:2:"f";s:3:"穎";s:2:"g";s:3:"穏";s:2:"h";s:3:"穐";s:2:"i";s:3:"穒";s:2:"j";s:3:"穓";s:2:"k";s:3:"穔";s:2:"l";s:3:"穕";s:2:"m";s:3:"穖";s:2:"n";s:3:"穘";s:2:"o";s:3:"穙";s:2:"p";s:3:"穚";s:2:"q";s:3:"穛";s:2:"r";s:3:"穜";s:2:"s";s:3:"穝";s:2:"t";s:3:"穞";s:2:"u";s:3:"穟";s:2:"v";s:3:"穠";s:2:"w";s:3:"穡";s:2:"x";s:3:"穢";s:2:"y";s:3:"穣";s:2:"z";s:3:"穤";s:2:"{";s:3:"穥";s:2:"|";s:3:"穦";s:2:"}";s:3:"穧";s:2:"~";s:3:"穨";s:2:"";s:3:"穩";s:2:"";s:3:"穪";s:2:"";s:3:"穫";s:2:"";s:3:"穬";s:2:"";s:3:"穭";s:2:"";s:3:"穮";s:2:"";s:3:"穯";s:2:"";s:3:"穱";s:2:"";s:3:"穲";s:2:"";s:3:"穳";s:2:"";s:3:"穵";s:2:"";s:3:"穻";s:2:"";s:3:"穼";s:2:"";s:3:"穽";s:2:"";s:3:"穾";s:2:"";s:3:"窂";s:2:"";s:3:"窅";s:2:"";s:3:"窇";s:2:"";s:3:"窉";s:2:"";s:3:"窊";s:2:"";s:3:"窋";s:2:"";s:3:"窌";s:2:"";s:3:"窎";s:2:"";s:3:"窏";s:2:"";s:3:"窐";s:2:"";s:3:"窓";s:2:"";s:3:"窔";s:2:"";s:3:"窙";s:2:"";s:3:"窚";s:2:"";s:3:"窛";s:2:"";s:3:"窞";s:2:"";s:3:"窡";s:2:"";s:3:"窢";s:2:"";s:3:"贰";s:2:"";s:3:"发";s:2:"";s:3:"罚";s:2:"";s:3:"筏";s:2:"";s:3:"伐";s:2:"";s:3:"乏";s:2:"";s:3:"阀";s:2:"";s:3:"法";s:2:"";s:3:"珐";s:2:"";s:3:"藩";s:2:"";s:3:"帆";s:2:"";s:3:"番";s:2:"";s:3:"翻";s:2:"";s:3:"樊";s:2:"";s:3:"矾";s:2:"";s:3:"钒";s:2:"";s:3:"繁";s:2:"";s:3:"凡";s:2:"";s:3:"烦";s:2:"";s:3:"反";s:2:"";s:3:"返";s:2:"";s:3:"范";s:2:"";s:3:"贩";s:2:"";s:3:"犯";s:2:"";s:3:"饭";s:2:"";s:3:"泛";s:2:"";s:3:"坊";s:2:"";s:3:"芳";s:2:"";s:3:"方";s:2:"";s:3:"肪";s:2:"";s:3:"房";s:2:"";s:3:"防";s:2:"";s:3:"妨";s:2:"";s:3:"仿";s:2:"";s:3:"访";s:2:"";s:3:"纺";s:2:"";s:3:"放";s:2:"";s:3:"菲";s:2:"";s:3:"非";s:2:"";s:3:"啡";s:2:"";s:3:"飞";s:2:"";s:3:"肥";s:2:"";s:3:"匪";s:2:"";s:3:"诽";s:2:"";s:3:"吠";s:2:"";s:3:"肺";s:2:"";s:3:"废";s:2:"";s:3:"沸";s:2:"";s:3:"费";s:2:"";s:3:"芬";s:2:"";s:3:"酚";s:2:"";s:3:"吩";s:2:"";s:3:"氛";s:2:"";s:3:"分";s:2:"";s:3:"纷";s:2:"";s:3:"坟";s:2:"";s:3:"焚";s:2:"";s:3:"汾";s:2:"";s:3:"粉";s:2:"";s:3:"奋";s:2:"";s:3:"份";s:2:"";s:3:"忿";s:2:"";s:3:"愤";s:2:"";s:3:"粪";s:2:"";s:3:"丰";s:2:"";s:3:"封";s:2:"";s:3:"枫";s:2:"";s:3:"蜂";s:2:"";s:3:"峰";s:2:"";s:3:"锋";s:2:"";s:3:"风";s:2:"";s:3:"疯";s:2:"";s:3:"烽";s:2:"";s:3:"逢";s:2:"";s:3:"冯";s:2:"";s:3:"缝";s:2:"";s:3:"讽";s:2:"";s:3:"奉";s:2:"";s:3:"凤";s:2:"";s:3:"佛";s:2:"";s:3:"否";s:2:"";s:3:"夫";s:2:"";s:3:"敷";s:2:"";s:3:"肤";s:2:"";s:3:"孵";s:2:"";s:3:"扶";s:2:"";s:3:"拂";s:2:"";s:3:"辐";s:2:"";s:3:"幅";s:2:"";s:3:"氟";s:2:"";s:3:"符";s:2:"";s:3:"伏";s:2:"";s:3:"俘";s:2:"";s:3:"服";s:2:"@";s:3:"窣";s:2:"A";s:3:"窤";s:2:"B";s:3:"窧";s:2:"C";s:3:"窩";s:2:"D";s:3:"窪";s:2:"E";s:3:"窫";s:2:"F";s:3:"窮";s:2:"G";s:3:"窯";s:2:"H";s:3:"窰";s:2:"I";s:3:"窱";s:2:"J";s:3:"窲";s:2:"K";s:3:"窴";s:2:"L";s:3:"窵";s:2:"M";s:3:"窶";s:2:"N";s:3:"窷";s:2:"O";s:3:"窸";s:2:"P";s:3:"窹";s:2:"Q";s:3:"窺";s:2:"R";s:3:"窻";s:2:"S";s:3:"窼";s:2:"T";s:3:"窽";s:2:"U";s:3:"窾";s:2:"V";s:3:"竀";s:2:"W";s:3:"竁";s:2:"X";s:3:"竂";s:2:"Y";s:3:"竃";s:2:"Z";s:3:"竄";s:2:"[";s:3:"竅";s:2:"\";s:3:"竆";s:2:"]";s:3:"竇";s:2:"^";s:3:"竈";s:2:"_";s:3:"竉";s:2:"`";s:3:"竊";s:2:"a";s:3:"竌";s:2:"b";s:3:"竍";s:2:"c";s:3:"竎";s:2:"d";s:3:"竏";s:2:"e";s:3:"竐";s:2:"f";s:3:"竑";s:2:"g";s:3:"竒";s:2:"h";s:3:"竓";s:2:"i";s:3:"竔";s:2:"j";s:3:"竕";s:2:"k";s:3:"竗";s:2:"l";s:3:"竘";s:2:"m";s:3:"竚";s:2:"n";s:3:"竛";s:2:"o";s:3:"竜";s:2:"p";s:3:"竝";s:2:"q";s:3:"竡";s:2:"r";s:3:"竢";s:2:"s";s:3:"竤";s:2:"t";s:3:"竧";s:2:"u";s:3:"竨";s:2:"v";s:3:"竩";s:2:"w";s:3:"竪";s:2:"x";s:3:"竫";s:2:"y";s:3:"竬";s:2:"z";s:3:"竮";s:2:"{";s:3:"竰";s:2:"|";s:3:"竱";s:2:"}";s:3:"竲";s:2:"~";s:3:"竳";s:2:"";s:3:"竴";s:2:"";s:3:"竵";s:2:"";s:3:"競";s:2:"";s:3:"竷";s:2:"";s:3:"竸";s:2:"";s:3:"竻";s:2:"";s:3:"竼";s:2:"";s:3:"竾";s:2:"";s:3:"笀";s:2:"";s:3:"笁";s:2:"";s:3:"笂";s:2:"";s:3:"笅";s:2:"";s:3:"笇";s:2:"";s:3:"笉";s:2:"";s:3:"笌";s:2:"";s:3:"笍";s:2:"";s:3:"笎";s:2:"";s:3:"笐";s:2:"";s:3:"笒";s:2:"";s:3:"笓";s:2:"";s:3:"笖";s:2:"";s:3:"笗";s:2:"";s:3:"笘";s:2:"";s:3:"笚";s:2:"";s:3:"笜";s:2:"";s:3:"笝";s:2:"";s:3:"笟";s:2:"";s:3:"笡";s:2:"";s:3:"笢";s:2:"";s:3:"笣";s:2:"";s:3:"笧";s:2:"";s:3:"笩";s:2:"";s:3:"笭";s:2:"";s:3:"浮";s:2:"";s:3:"涪";s:2:"";s:3:"福";s:2:"";s:3:"袱";s:2:"";s:3:"弗";s:2:"";s:3:"甫";s:2:"";s:3:"抚";s:2:"";s:3:"辅";s:2:"";s:3:"俯";s:2:"";s:3:"釜";s:2:"";s:3:"斧";s:2:"";s:3:"脯";s:2:"";s:3:"腑";s:2:"";s:3:"府";s:2:"";s:3:"腐";s:2:"";s:3:"赴";s:2:"";s:3:"副";s:2:"";s:3:"覆";s:2:"";s:3:"赋";s:2:"";s:3:"复";s:2:"";s:3:"傅";s:2:"";s:3:"付";s:2:"";s:3:"阜";s:2:"";s:3:"父";s:2:"";s:3:"腹";s:2:"";s:3:"负";s:2:"";s:3:"富";s:2:"";s:3:"讣";s:2:"";s:3:"附";s:2:"";s:3:"妇";s:2:"";s:3:"缚";s:2:"";s:3:"咐";s:2:"";s:3:"噶";s:2:"";s:3:"嘎";s:2:"";s:3:"该";s:2:"";s:3:"改";s:2:"";s:3:"概";s:2:"";s:3:"钙";s:2:"";s:3:"盖";s:2:"";s:3:"溉";s:2:"";s:3:"干";s:2:"";s:3:"甘";s:2:"";s:3:"杆";s:2:"";s:3:"柑";s:2:"";s:3:"竿";s:2:"";s:3:"肝";s:2:"";s:3:"赶";s:2:"";s:3:"感";s:2:"";s:3:"秆";s:2:"";s:3:"敢";s:2:"";s:3:"赣";s:2:"";s:3:"冈";s:2:"";s:3:"刚";s:2:"";s:3:"钢";s:2:"";s:3:"缸";s:2:"";s:3:"肛";s:2:"";s:3:"纲";s:2:"";s:3:"岗";s:2:"";s:3:"港";s:2:"";s:3:"杠";s:2:"";s:3:"篙";s:2:"";s:3:"皋";s:2:"";s:3:"高";s:2:"";s:3:"膏";s:2:"";s:3:"羔";s:2:"";s:3:"糕";s:2:"";s:3:"搞";s:2:"";s:3:"镐";s:2:"";s:3:"稿";s:2:"";s:3:"告";s:2:"";s:3:"哥";s:2:"";s:3:"歌";s:2:"";s:3:"搁";s:2:"";s:3:"戈";s:2:"";s:3:"鸽";s:2:"";s:3:"胳";s:2:"";s:3:"疙";s:2:"";s:3:"割";s:2:"";s:3:"革";s:2:"";s:3:"葛";s:2:"";s:3:"格";s:2:"";s:3:"蛤";s:2:"";s:3:"阁";s:2:"";s:3:"隔";s:2:"";s:3:"铬";s:2:"";s:3:"个";s:2:"";s:3:"各";s:2:"";s:3:"给";s:2:"";s:3:"根";s:2:"";s:3:"跟";s:2:"";s:3:"耕";s:2:"";s:3:"更";s:2:"";s:3:"庚";s:2:"";s:3:"羹";s:2:"@";s:3:"笯";s:2:"A";s:3:"笰";s:2:"B";s:3:"笲";s:2:"C";s:3:"笴";s:2:"D";s:3:"笵";s:2:"E";s:3:"笶";s:2:"F";s:3:"笷";s:2:"G";s:3:"笹";s:2:"H";s:3:"笻";s:2:"I";s:3:"笽";s:2:"J";s:3:"笿";s:2:"K";s:3:"筀";s:2:"L";s:3:"筁";s:2:"M";s:3:"筂";s:2:"N";s:3:"筃";s:2:"O";s:3:"筄";s:2:"P";s:3:"筆";s:2:"Q";s:3:"筈";s:2:"R";s:3:"筊";s:2:"S";s:3:"筍";s:2:"T";s:3:"筎";s:2:"U";s:3:"筓";s:2:"V";s:3:"筕";s:2:"W";s:3:"筗";s:2:"X";s:3:"筙";s:2:"Y";s:3:"筜";s:2:"Z";s:3:"筞";s:2:"[";s:3:"筟";s:2:"\";s:3:"筡";s:2:"]";s:3:"筣";s:2:"^";s:3:"筤";s:2:"_";s:3:"筥";s:2:"`";s:3:"筦";s:2:"a";s:3:"筧";s:2:"b";s:3:"筨";s:2:"c";s:3:"筩";s:2:"d";s:3:"筪";s:2:"e";s:3:"筫";s:2:"f";s:3:"筬";s:2:"g";s:3:"筭";s:2:"h";s:3:"筯";s:2:"i";s:3:"筰";s:2:"j";s:3:"筳";s:2:"k";s:3:"筴";s:2:"l";s:3:"筶";s:2:"m";s:3:"筸";s:2:"n";s:3:"筺";s:2:"o";s:3:"筼";s:2:"p";s:3:"筽";s:2:"q";s:3:"筿";s:2:"r";s:3:"箁";s:2:"s";s:3:"箂";s:2:"t";s:3:"箃";s:2:"u";s:3:"箄";s:2:"v";s:3:"箆";s:2:"w";s:3:"箇";s:2:"x";s:3:"箈";s:2:"y";s:3:"箉";s:2:"z";s:3:"箊";s:2:"{";s:3:"箋";s:2:"|";s:3:"箌";s:2:"}";s:3:"箎";s:2:"~";s:3:"箏";s:2:"";s:3:"箑";s:2:"";s:3:"箒";s:2:"";s:3:"箓";s:2:"";s:3:"箖";s:2:"";s:3:"箘";s:2:"";s:3:"箙";s:2:"";s:3:"箚";s:2:"";s:3:"箛";s:2:"";s:3:"箞";s:2:"";s:3:"箟";s:2:"";s:3:"箠";s:2:"";s:3:"箣";s:2:"";s:3:"箤";s:2:"";s:3:"箥";s:2:"";s:3:"箮";s:2:"";s:3:"箯";s:2:"";s:3:"箰";s:2:"";s:3:"箲";s:2:"";s:3:"箳";s:2:"";s:3:"箵";s:2:"";s:3:"箶";s:2:"";s:3:"箷";s:2:"";s:3:"箹";s:2:"";s:3:"箺";s:2:"";s:3:"箻";s:2:"";s:3:"箼";s:2:"";s:3:"箽";s:2:"";s:3:"箾";s:2:"";s:3:"箿";s:2:"";s:3:"節";s:2:"";s:3:"篂";s:2:"";s:3:"篃";s:2:"";s:3:"範";s:2:"";s:3:"埂";s:2:"";s:3:"耿";s:2:"";s:3:"梗";s:2:"";s:3:"工";s:2:"";s:3:"攻";s:2:"";s:3:"功";s:2:"";s:3:"恭";s:2:"";s:3:"龚";s:2:"";s:3:"供";s:2:"";s:3:"躬";s:2:"";s:3:"公";s:2:"";s:3:"宫";s:2:"";s:3:"弓";s:2:"";s:3:"巩";s:2:"";s:3:"汞";s:2:"";s:3:"拱";s:2:"";s:3:"贡";s:2:"";s:3:"共";s:2:"";s:3:"钩";s:2:"";s:3:"勾";s:2:"";s:3:"沟";s:2:"";s:3:"苟";s:2:"";s:3:"狗";s:2:"";s:3:"垢";s:2:"";s:3:"构";s:2:"";s:3:"购";s:2:"";s:3:"够";s:2:"";s:3:"辜";s:2:"";s:3:"菇";s:2:"";s:3:"咕";s:2:"";s:3:"箍";s:2:"";s:3:"估";s:2:"";s:3:"沽";s:2:"";s:3:"孤";s:2:"";s:3:"姑";s:2:"";s:3:"鼓";s:2:"";s:3:"古";s:2:"";s:3:"蛊";s:2:"";s:3:"骨";s:2:"";s:3:"谷";s:2:"";s:3:"股";s:2:"";s:3:"故";s:2:"";s:3:"顾";s:2:"";s:3:"固";s:2:"";s:3:"雇";s:2:"";s:3:"刮";s:2:"";s:3:"瓜";s:2:"";s:3:"剐";s:2:"";s:3:"寡";s:2:"";s:3:"挂";s:2:"";s:3:"褂";s:2:"";s:3:"乖";s:2:"";s:3:"拐";s:2:"";s:3:"怪";s:2:"";s:3:"棺";s:2:"";s:3:"关";s:2:"";s:3:"官";s:2:"";s:3:"冠";s:2:"";s:3:"观";s:2:"";s:3:"管";s:2:"";s:3:"馆";s:2:"";s:3:"罐";s:2:"";s:3:"惯";s:2:"";s:3:"灌";s:2:"";s:3:"贯";s:2:"";s:3:"光";s:2:"";s:3:"广";s:2:"";s:3:"逛";s:2:"";s:3:"瑰";s:2:"";s:3:"规";s:2:"";s:3:"圭";s:2:"";s:3:"硅";s:2:"";s:3:"归";s:2:"";s:3:"龟";s:2:"";s:3:"闺";s:2:"";s:3:"轨";s:2:"";s:3:"鬼";s:2:"";s:3:"诡";s:2:"";s:3:"癸";s:2:"";s:3:"桂";s:2:"";s:3:"柜";s:2:"";s:3:"跪";s:2:"";s:3:"贵";s:2:"";s:3:"刽";s:2:"";s:3:"辊";s:2:"";s:3:"滚";s:2:"";s:3:"棍";s:2:"";s:3:"锅";s:2:"";s:3:"郭";s:2:"";s:3:"国";s:2:"";s:3:"果";s:2:"";s:3:"裹";s:2:"";s:3:"过";s:2:"";s:3:"哈";s:2:"@";s:3:"篅";s:2:"A";s:3:"篈";s:2:"B";s:3:"築";s:2:"C";s:3:"篊";s:2:"D";s:3:"篋";s:2:"E";s:3:"篍";s:2:"F";s:3:"篎";s:2:"G";s:3:"篏";s:2:"H";s:3:"篐";s:2:"I";s:3:"篒";s:2:"J";s:3:"篔";s:2:"K";s:3:"篕";s:2:"L";s:3:"篖";s:2:"M";s:3:"篗";s:2:"N";s:3:"篘";s:2:"O";s:3:"篛";s:2:"P";s:3:"篜";s:2:"Q";s:3:"篞";s:2:"R";s:3:"篟";s:2:"S";s:3:"篠";s:2:"T";s:3:"篢";s:2:"U";s:3:"篣";s:2:"V";s:3:"篤";s:2:"W";s:3:"篧";s:2:"X";s:3:"篨";s:2:"Y";s:3:"篩";s:2:"Z";s:3:"篫";s:2:"[";s:3:"篬";s:2:"\";s:3:"篭";s:2:"]";s:3:"篯";s:2:"^";s:3:"篰";s:2:"_";s:3:"篲";s:2:"`";s:3:"篳";s:2:"a";s:3:"篴";s:2:"b";s:3:"篵";s:2:"c";s:3:"篶";s:2:"d";s:3:"篸";s:2:"e";s:3:"篹";s:2:"f";s:3:"篺";s:2:"g";s:3:"篻";s:2:"h";s:3:"篽";s:2:"i";s:3:"篿";s:2:"j";s:3:"簀";s:2:"k";s:3:"簁";s:2:"l";s:3:"簂";s:2:"m";s:3:"簃";s:2:"n";s:3:"簄";s:2:"o";s:3:"簅";s:2:"p";s:3:"簆";s:2:"q";s:3:"簈";s:2:"r";s:3:"簉";s:2:"s";s:3:"簊";s:2:"t";s:3:"簍";s:2:"u";s:3:"簎";s:2:"v";s:3:"簐";s:2:"w";s:3:"簑";s:2:"x";s:3:"簒";s:2:"y";s:3:"簓";s:2:"z";s:3:"簔";s:2:"{";s:3:"簕";s:2:"|";s:3:"簗";s:2:"}";s:3:"簘";s:2:"~";s:3:"簙";s:2:"";s:3:"簚";s:2:"";s:3:"簛";s:2:"";s:3:"簜";s:2:"";s:3:"簝";s:2:"";s:3:"簞";s:2:"";s:3:"簠";s:2:"";s:3:"簡";s:2:"";s:3:"簢";s:2:"";s:3:"簣";s:2:"";s:3:"簤";s:2:"";s:3:"簥";s:2:"";s:3:"簨";s:2:"";s:3:"簩";s:2:"";s:3:"簫";s:2:"";s:3:"簬";s:2:"";s:3:"簭";s:2:"";s:3:"簮";s:2:"";s:3:"簯";s:2:"";s:3:"簰";s:2:"";s:3:"簱";s:2:"";s:3:"簲";s:2:"";s:3:"簳";s:2:"";s:3:"簴";s:2:"";s:3:"簵";s:2:"";s:3:"簶";s:2:"";s:3:"簷";s:2:"";s:3:"簹";s:2:"";s:3:"簺";s:2:"";s:3:"簻";s:2:"";s:3:"簼";s:2:"";s:3:"簽";s:2:"";s:3:"簾";s:2:"";s:3:"籂";s:2:"";s:3:"骸";s:2:"";s:3:"孩";s:2:"";s:3:"海";s:2:"";s:3:"氦";s:2:"";s:3:"亥";s:2:"";s:3:"害";s:2:"";s:3:"骇";s:2:"";s:3:"酣";s:2:"";s:3:"憨";s:2:"";s:3:"邯";s:2:"";s:3:"韩";s:2:"";s:3:"含";s:2:"";s:3:"涵";s:2:"";s:3:"寒";s:2:"";s:3:"函";s:2:"";s:3:"喊";s:2:"";s:3:"罕";s:2:"";s:3:"翰";s:2:"";s:3:"撼";s:2:"";s:3:"捍";s:2:"";s:3:"旱";s:2:"";s:3:"憾";s:2:"";s:3:"悍";s:2:"";s:3:"焊";s:2:"";s:3:"汗";s:2:"";s:3:"汉";s:2:"";s:3:"夯";s:2:"";s:3:"杭";s:2:"";s:3:"航";s:2:"";s:3:"壕";s:2:"";s:3:"嚎";s:2:"";s:3:"豪";s:2:"";s:3:"毫";s:2:"";s:3:"郝";s:2:"";s:3:"好";s:2:"";s:3:"耗";s:2:"";s:3:"号";s:2:"";s:3:"浩";s:2:"";s:3:"呵";s:2:"";s:3:"喝";s:2:"";s:3:"荷";s:2:"";s:3:"菏";s:2:"";s:3:"核";s:2:"";s:3:"禾";s:2:"";s:3:"和";s:2:"";s:3:"何";s:2:"";s:3:"合";s:2:"";s:3:"盒";s:2:"";s:3:"貉";s:2:"";s:3:"阂";s:2:"";s:3:"河";s:2:"";s:3:"涸";s:2:"";s:3:"赫";s:2:"";s:3:"褐";s:2:"";s:3:"鹤";s:2:"";s:3:"贺";s:2:"";s:3:"嘿";s:2:"";s:3:"黑";s:2:"";s:3:"痕";s:2:"";s:3:"很";s:2:"";s:3:"狠";s:2:"";s:3:"恨";s:2:"";s:3:"哼";s:2:"";s:3:"亨";s:2:"";s:3:"横";s:2:"";s:3:"衡";s:2:"";s:3:"恒";s:2:"";s:3:"轰";s:2:"";s:3:"哄";s:2:"";s:3:"烘";s:2:"";s:3:"虹";s:2:"";s:3:"鸿";s:2:"";s:3:"洪";s:2:"";s:3:"宏";s:2:"";s:3:"弘";s:2:"";s:3:"红";s:2:"";s:3:"喉";s:2:"";s:3:"侯";s:2:"";s:3:"猴";s:2:"";s:3:"吼";s:2:"";s:3:"厚";s:2:"";s:3:"候";s:2:"";s:3:"后";s:2:"";s:3:"呼";s:2:"";s:3:"乎";s:2:"";s:3:"忽";s:2:"";s:3:"瑚";s:2:"";s:3:"壶";s:2:"";s:3:"葫";s:2:"";s:3:"胡";s:2:"";s:3:"蝴";s:2:"";s:3:"狐";s:2:"";s:3:"糊";s:2:"";s:3:"湖";s:2:"@";s:3:"籃";s:2:"A";s:3:"籄";s:2:"B";s:3:"籅";s:2:"C";s:3:"籆";s:2:"D";s:3:"籇";s:2:"E";s:3:"籈";s:2:"F";s:3:"籉";s:2:"G";s:3:"籊";s:2:"H";s:3:"籋";s:2:"I";s:3:"籌";s:2:"J";s:3:"籎";s:2:"K";s:3:"籏";s:2:"L";s:3:"籐";s:2:"M";s:3:"籑";s:2:"N";s:3:"籒";s:2:"O";s:3:"籓";s:2:"P";s:3:"籔";s:2:"Q";s:3:"籕";s:2:"R";s:3:"籖";s:2:"S";s:3:"籗";s:2:"T";s:3:"籘";s:2:"U";s:3:"籙";s:2:"V";s:3:"籚";s:2:"W";s:3:"籛";s:2:"X";s:3:"籜";s:2:"Y";s:3:"籝";s:2:"Z";s:3:"籞";s:2:"[";s:3:"籟";s:2:"\";s:3:"籠";s:2:"]";s:3:"籡";s:2:"^";s:3:"籢";s:2:"_";s:3:"籣";s:2:"`";s:3:"籤";s:2:"a";s:3:"籥";s:2:"b";s:3:"籦";s:2:"c";s:3:"籧";s:2:"d";s:3:"籨";s:2:"e";s:3:"籩";s:2:"f";s:3:"籪";s:2:"g";s:3:"籫";s:2:"h";s:3:"籬";s:2:"i";s:3:"籭";s:2:"j";s:3:"籮";s:2:"k";s:3:"籯";s:2:"l";s:3:"籰";s:2:"m";s:3:"籱";s:2:"n";s:3:"籲";s:2:"o";s:3:"籵";s:2:"p";s:3:"籶";s:2:"q";s:3:"籷";s:2:"r";s:3:"籸";s:2:"s";s:3:"籹";s:2:"t";s:3:"籺";s:2:"u";s:3:"籾";s:2:"v";s:3:"籿";s:2:"w";s:3:"粀";s:2:"x";s:3:"粁";s:2:"y";s:3:"粂";s:2:"z";s:3:"粃";s:2:"{";s:3:"粄";s:2:"|";s:3:"粅";s:2:"}";s:3:"粆";s:2:"~";s:3:"粇";s:2:"";s:3:"粈";s:2:"";s:3:"粊";s:2:"";s:3:"粋";s:2:"";s:3:"粌";s:2:"";s:3:"粍";s:2:"";s:3:"粎";s:2:"";s:3:"粏";s:2:"";s:3:"粐";s:2:"";s:3:"粓";s:2:"";s:3:"粔";s:2:"";s:3:"粖";s:2:"";s:3:"粙";s:2:"";s:3:"粚";s:2:"";s:3:"粛";s:2:"";s:3:"粠";s:2:"";s:3:"粡";s:2:"";s:3:"粣";s:2:"";s:3:"粦";s:2:"";s:3:"粧";s:2:"";s:3:"粨";s:2:"";s:3:"粩";s:2:"";s:3:"粫";s:2:"";s:3:"粬";s:2:"";s:3:"粭";s:2:"";s:3:"粯";s:2:"";s:3:"粰";s:2:"";s:3:"粴";s:2:"";s:3:"粵";s:2:"";s:3:"粶";s:2:"";s:3:"粷";s:2:"";s:3:"粸";s:2:"";s:3:"粺";s:2:"";s:3:"粻";s:2:"";s:3:"弧";s:2:"";s:3:"虎";s:2:"";s:3:"唬";s:2:"";s:3:"护";s:2:"";s:3:"互";s:2:"";s:3:"沪";s:2:"";s:3:"户";s:2:"";s:3:"花";s:2:"";s:3:"哗";s:2:"";s:3:"华";s:2:"";s:3:"猾";s:2:"";s:3:"滑";s:2:"";s:3:"画";s:2:"";s:3:"划";s:2:"";s:3:"化";s:2:"";s:3:"话";s:2:"";s:3:"槐";s:2:"";s:3:"徊";s:2:"";s:3:"怀";s:2:"";s:3:"淮";s:2:"";s:3:"坏";s:2:"";s:3:"欢";s:2:"";s:3:"环";s:2:"";s:3:"桓";s:2:"";s:3:"还";s:2:"";s:3:"缓";s:2:"";s:3:"换";s:2:"";s:3:"患";s:2:"";s:3:"唤";s:2:"";s:3:"痪";s:2:"";s:3:"豢";s:2:"";s:3:"焕";s:2:"";s:3:"涣";s:2:"";s:3:"宦";s:2:"";s:3:"幻";s:2:"";s:3:"荒";s:2:"";s:3:"慌";s:2:"";s:3:"黄";s:2:"";s:3:"磺";s:2:"";s:3:"蝗";s:2:"";s:3:"簧";s:2:"";s:3:"皇";s:2:"";s:3:"凰";s:2:"";s:3:"惶";s:2:"";s:3:"煌";s:2:"";s:3:"晃";s:2:"";s:3:"幌";s:2:"";s:3:"恍";s:2:"";s:3:"谎";s:2:"";s:3:"灰";s:2:"";s:3:"挥";s:2:"";s:3:"辉";s:2:"";s:3:"徽";s:2:"";s:3:"恢";s:2:"";s:3:"蛔";s:2:"";s:3:"回";s:2:"";s:3:"毁";s:2:"";s:3:"悔";s:2:"";s:3:"慧";s:2:"";s:3:"卉";s:2:"";s:3:"惠";s:2:"";s:3:"晦";s:2:"";s:3:"贿";s:2:"";s:3:"秽";s:2:"";s:3:"会";s:2:"";s:3:"烩";s:2:"";s:3:"汇";s:2:"";s:3:"讳";s:2:"";s:3:"诲";s:2:"";s:3:"绘";s:2:"";s:3:"荤";s:2:"";s:3:"昏";s:2:"";s:3:"婚";s:2:"";s:3:"魂";s:2:"";s:3:"浑";s:2:"";s:3:"混";s:2:"";s:3:"豁";s:2:"";s:3:"活";s:2:"";s:3:"伙";s:2:"";s:3:"火";s:2:"";s:3:"获";s:2:"";s:3:"或";s:2:"";s:3:"惑";s:2:"";s:3:"霍";s:2:"";s:3:"货";s:2:"";s:3:"祸";s:2:"";s:3:"击";s:2:"";s:3:"圾";s:2:"";s:3:"基";s:2:"";s:3:"机";s:2:"";s:3:"畸";s:2:"";s:3:"稽";s:2:"";s:3:"积";s:2:"";s:3:"箕";s:2:"@";s:3:"粿";s:2:"A";s:3:"糀";s:2:"B";s:3:"糂";s:2:"C";s:3:"糃";s:2:"D";s:3:"糄";s:2:"E";s:3:"糆";s:2:"F";s:3:"糉";s:2:"G";s:3:"糋";s:2:"H";s:3:"糎";s:2:"I";s:3:"糏";s:2:"J";s:3:"糐";s:2:"K";s:3:"糑";s:2:"L";s:3:"糒";s:2:"M";s:3:"糓";s:2:"N";s:3:"糔";s:2:"O";s:3:"糘";s:2:"P";s:3:"糚";s:2:"Q";s:3:"糛";s:2:"R";s:3:"糝";s:2:"S";s:3:"糞";s:2:"T";s:3:"糡";s:2:"U";s:3:"糢";s:2:"V";s:3:"糣";s:2:"W";s:3:"糤";s:2:"X";s:3:"糥";s:2:"Y";s:3:"糦";s:2:"Z";s:3:"糧";s:2:"[";s:3:"糩";s:2:"\";s:3:"糪";s:2:"]";s:3:"糫";s:2:"^";s:3:"糬";s:2:"_";s:3:"糭";s:2:"`";s:3:"糮";s:2:"a";s:3:"糰";s:2:"b";s:3:"糱";s:2:"c";s:3:"糲";s:2:"d";s:3:"糳";s:2:"e";s:3:"糴";s:2:"f";s:3:"糵";s:2:"g";s:3:"糶";s:2:"h";s:3:"糷";s:2:"i";s:3:"糹";s:2:"j";s:3:"糺";s:2:"k";s:3:"糼";s:2:"l";s:3:"糽";s:2:"m";s:3:"糾";s:2:"n";s:3:"糿";s:2:"o";s:3:"紀";s:2:"p";s:3:"紁";s:2:"q";s:3:"紂";s:2:"r";s:3:"紃";s:2:"s";s:3:"約";s:2:"t";s:3:"紅";s:2:"u";s:3:"紆";s:2:"v";s:3:"紇";s:2:"w";s:3:"紈";s:2:"x";s:3:"紉";s:2:"y";s:3:"紋";s:2:"z";s:3:"紌";s:2:"{";s:3:"納";s:2:"|";s:3:"紎";s:2:"}";s:3:"紏";s:2:"~";s:3:"紐";s:2:"";s:3:"紑";s:2:"";s:3:"紒";s:2:"";s:3:"紓";s:2:"";s:3:"純";s:2:"";s:3:"紕";s:2:"";s:3:"紖";s:2:"";s:3:"紗";s:2:"";s:3:"紘";s:2:"";s:3:"紙";s:2:"";s:3:"級";s:2:"";s:3:"紛";s:2:"";s:3:"紜";s:2:"";s:3:"紝";s:2:"";s:3:"紞";s:2:"";s:3:"紟";s:2:"";s:3:"紡";s:2:"";s:3:"紣";s:2:"";s:3:"紤";s:2:"";s:3:"紥";s:2:"";s:3:"紦";s:2:"";s:3:"紨";s:2:"";s:3:"紩";s:2:"";s:3:"紪";s:2:"";s:3:"紬";s:2:"";s:3:"紭";s:2:"";s:3:"紮";s:2:"";s:3:"細";s:2:"";s:3:"紱";s:2:"";s:3:"紲";s:2:"";s:3:"紳";s:2:"";s:3:"紴";s:2:"";s:3:"紵";s:2:"";s:3:"紶";s:2:"";s:3:"肌";s:2:"";s:3:"饥";s:2:"";s:3:"迹";s:2:"";s:3:"激";s:2:"";s:3:"讥";s:2:"";s:3:"鸡";s:2:"";s:3:"姬";s:2:"";s:3:"绩";s:2:"";s:3:"缉";s:2:"";s:3:"吉";s:2:"";s:3:"极";s:2:"";s:3:"棘";s:2:"";s:3:"辑";s:2:"";s:3:"籍";s:2:"";s:3:"集";s:2:"";s:3:"及";s:2:"";s:3:"急";s:2:"";s:3:"疾";s:2:"";s:3:"汲";s:2:"";s:3:"即";s:2:"";s:3:"嫉";s:2:"";s:3:"级";s:2:"";s:3:"挤";s:2:"";s:3:"几";s:2:"";s:3:"脊";s:2:"";s:3:"己";s:2:"";s:3:"蓟";s:2:"";s:3:"技";s:2:"";s:3:"冀";s:2:"";s:3:"季";s:2:"";s:3:"伎";s:2:"";s:3:"祭";s:2:"";s:3:"剂";s:2:"";s:3:"悸";s:2:"";s:3:"济";s:2:"";s:3:"寄";s:2:"";s:3:"寂";s:2:"";s:3:"计";s:2:"";s:3:"记";s:2:"";s:3:"既";s:2:"";s:3:"忌";s:2:"";s:3:"际";s:2:"";s:3:"妓";s:2:"";s:3:"继";s:2:"";s:3:"纪";s:2:"";s:3:"嘉";s:2:"";s:3:"枷";s:2:"";s:3:"夹";s:2:"";s:3:"佳";s:2:"";s:3:"家";s:2:"";s:3:"加";s:2:"";s:3:"荚";s:2:"";s:3:"颊";s:2:"";s:3:"贾";s:2:"";s:3:"甲";s:2:"";s:3:"钾";s:2:"";s:3:"假";s:2:"";s:3:"稼";s:2:"";s:3:"价";s:2:"";s:3:"架";s:2:"";s:3:"驾";s:2:"";s:3:"嫁";s:2:"";s:3:"歼";s:2:"";s:3:"监";s:2:"";s:3:"坚";s:2:"";s:3:"尖";s:2:"";s:3:"笺";s:2:"";s:3:"间";s:2:"";s:3:"煎";s:2:"";s:3:"兼";s:2:"";s:3:"肩";s:2:"";s:3:"艰";s:2:"";s:3:"奸";s:2:"";s:3:"缄";s:2:"";s:3:"茧";s:2:"";s:3:"检";s:2:"";s:3:"柬";s:2:"";s:3:"碱";s:2:"";s:3:"硷";s:2:"";s:3:"拣";s:2:"";s:3:"捡";s:2:"";s:3:"简";s:2:"";s:3:"俭";s:2:"";s:3:"剪";s:2:"";s:3:"减";s:2:"";s:3:"荐";s:2:"";s:3:"槛";s:2:"";s:3:"鉴";s:2:"";s:3:"践";s:2:"";s:3:"贱";s:2:"";s:3:"见";s:2:"";s:3:"键";s:2:"";s:3:"箭";s:2:"";s:3:"件";s:2:"@";s:3:"紷";s:2:"A";s:3:"紸";s:2:"B";s:3:"紹";s:2:"C";s:3:"紺";s:2:"D";s:3:"紻";s:2:"E";s:3:"紼";s:2:"F";s:3:"紽";s:2:"G";s:3:"紾";s:2:"H";s:3:"紿";s:2:"I";s:3:"絀";s:2:"J";s:3:"絁";s:2:"K";s:3:"終";s:2:"L";s:3:"絃";s:2:"M";s:3:"組";s:2:"N";s:3:"絅";s:2:"O";s:3:"絆";s:2:"P";s:3:"絇";s:2:"Q";s:3:"絈";s:2:"R";s:3:"絉";s:2:"S";s:3:"絊";s:2:"T";s:3:"絋";s:2:"U";s:3:"経";s:2:"V";s:3:"絍";s:2:"W";s:3:"絎";s:2:"X";s:3:"絏";s:2:"Y";s:3:"結";s:2:"Z";s:3:"絑";s:2:"[";s:3:"絒";s:2:"\";s:3:"絓";s:2:"]";s:3:"絔";s:2:"^";s:3:"絕";s:2:"_";s:3:"絖";s:2:"`";s:3:"絗";s:2:"a";s:3:"絘";s:2:"b";s:3:"絙";s:2:"c";s:3:"絚";s:2:"d";s:3:"絛";s:2:"e";s:3:"絜";s:2:"f";s:3:"絝";s:2:"g";s:3:"絞";s:2:"h";s:3:"絟";s:2:"i";s:3:"絠";s:2:"j";s:3:"絡";s:2:"k";s:3:"絢";s:2:"l";s:3:"絣";s:2:"m";s:3:"絤";s:2:"n";s:3:"絥";s:2:"o";s:3:"給";s:2:"p";s:3:"絧";s:2:"q";s:3:"絨";s:2:"r";s:3:"絩";s:2:"s";s:3:"絪";s:2:"t";s:3:"絫";s:2:"u";s:3:"絬";s:2:"v";s:3:"絭";s:2:"w";s:3:"絯";s:2:"x";s:3:"絰";s:2:"y";s:3:"統";s:2:"z";s:3:"絲";s:2:"{";s:3:"絳";s:2:"|";s:3:"絴";s:2:"}";s:3:"絵";s:2:"~";s:3:"絶";s:2:"";s:3:"絸";s:2:"";s:3:"絹";s:2:"";s:3:"絺";s:2:"";s:3:"絻";s:2:"";s:3:"絼";s:2:"";s:3:"絽";s:2:"";s:3:"絾";s:2:"";s:3:"絿";s:2:"";s:3:"綀";s:2:"";s:3:"綁";s:2:"";s:3:"綂";s:2:"";s:3:"綃";s:2:"";s:3:"綄";s:2:"";s:3:"綅";s:2:"";s:3:"綆";s:2:"";s:3:"綇";s:2:"";s:3:"綈";s:2:"";s:3:"綉";s:2:"";s:3:"綊";s:2:"";s:3:"綋";s:2:"";s:3:"綌";s:2:"";s:3:"綍";s:2:"";s:3:"綎";s:2:"";s:3:"綏";s:2:"";s:3:"綐";s:2:"";s:3:"綑";s:2:"";s:3:"綒";s:2:"";s:3:"經";s:2:"";s:3:"綔";s:2:"";s:3:"綕";s:2:"";s:3:"綖";s:2:"";s:3:"綗";s:2:"";s:3:"綘";s:2:"";s:3:"健";s:2:"";s:3:"舰";s:2:"";s:3:"剑";s:2:"";s:3:"饯";s:2:"";s:3:"渐";s:2:"";s:3:"溅";s:2:"";s:3:"涧";s:2:"";s:3:"建";s:2:"";s:3:"僵";s:2:"";s:3:"姜";s:2:"";s:3:"将";s:2:"";s:3:"浆";s:2:"";s:3:"江";s:2:"";s:3:"疆";s:2:"";s:3:"蒋";s:2:"";s:3:"桨";s:2:"";s:3:"奖";s:2:"";s:3:"讲";s:2:"";s:3:"匠";s:2:"";s:3:"酱";s:2:"";s:3:"降";s:2:"";s:3:"蕉";s:2:"";s:3:"椒";s:2:"";s:3:"礁";s:2:"";s:3:"焦";s:2:"";s:3:"胶";s:2:"";s:3:"交";s:2:"";s:3:"郊";s:2:"";s:3:"浇";s:2:"";s:3:"骄";s:2:"";s:3:"娇";s:2:"";s:3:"嚼";s:2:"";s:3:"搅";s:2:"";s:3:"铰";s:2:"";s:3:"矫";s:2:"";s:3:"侥";s:2:"";s:3:"脚";s:2:"";s:3:"狡";s:2:"";s:3:"角";s:2:"";s:3:"饺";s:2:"";s:3:"缴";s:2:"";s:3:"绞";s:2:"";s:3:"剿";s:2:"";s:3:"教";s:2:"";s:3:"酵";s:2:"";s:3:"轿";s:2:"";s:3:"较";s:2:"";s:3:"叫";s:2:"";s:3:"窖";s:2:"";s:3:"揭";s:2:"";s:3:"接";s:2:"";s:3:"皆";s:2:"";s:3:"秸";s:2:"";s:3:"街";s:2:"";s:3:"阶";s:2:"";s:3:"截";s:2:"";s:3:"劫";s:2:"";s:3:"节";s:2:"";s:3:"桔";s:2:"";s:3:"杰";s:2:"";s:3:"捷";s:2:"";s:3:"睫";s:2:"";s:3:"竭";s:2:"";s:3:"洁";s:2:"";s:3:"结";s:2:"";s:3:"解";s:2:"";s:3:"姐";s:2:"";s:3:"戒";s:2:"";s:3:"藉";s:2:"";s:3:"芥";s:2:"";s:3:"界";s:2:"";s:3:"借";s:2:"";s:3:"介";s:2:"";s:3:"疥";s:2:"";s:3:"诫";s:2:"";s:3:"届";s:2:"";s:3:"巾";s:2:"";s:3:"筋";s:2:"";s:3:"斤";s:2:"";s:3:"金";s:2:"";s:3:"今";s:2:"";s:3:"津";s:2:"";s:3:"襟";s:2:"";s:3:"紧";s:2:"";s:3:"锦";s:2:"";s:3:"仅";s:2:"";s:3:"谨";s:2:"";s:3:"进";s:2:"";s:3:"靳";s:2:"";s:3:"晋";s:2:"";s:3:"禁";s:2:"";s:3:"近";s:2:"";s:3:"烬";s:2:"";s:3:"浸";s:2:"@";s:3:"継";s:2:"A";s:3:"続";s:2:"B";s:3:"綛";s:2:"C";s:3:"綜";s:2:"D";s:3:"綝";s:2:"E";s:3:"綞";s:2:"F";s:3:"綟";s:2:"G";s:3:"綠";s:2:"H";s:3:"綡";s:2:"I";s:3:"綢";s:2:"J";s:3:"綣";s:2:"K";s:3:"綤";s:2:"L";s:3:"綥";s:2:"M";s:3:"綧";s:2:"N";s:3:"綨";s:2:"O";s:3:"綩";s:2:"P";s:3:"綪";s:2:"Q";s:3:"綫";s:2:"R";s:3:"綬";s:2:"S";s:3:"維";s:2:"T";s:3:"綯";s:2:"U";s:3:"綰";s:2:"V";s:3:"綱";s:2:"W";s:3:"網";s:2:"X";s:3:"綳";s:2:"Y";s:3:"綴";s:2:"Z";s:3:"綵";s:2:"[";s:3:"綶";s:2:"\";s:3:"綷";s:2:"]";s:3:"綸";s:2:"^";s:3:"綹";s:2:"_";s:3:"綺";s:2:"`";s:3:"綻";s:2:"a";s:3:"綼";s:2:"b";s:3:"綽";s:2:"c";s:3:"綾";s:2:"d";s:3:"綿";s:2:"e";s:3:"緀";s:2:"f";s:3:"緁";s:2:"g";s:3:"緂";s:2:"h";s:3:"緃";s:2:"i";s:3:"緄";s:2:"j";s:3:"緅";s:2:"k";s:3:"緆";s:2:"l";s:3:"緇";s:2:"m";s:3:"緈";s:2:"n";s:3:"緉";s:2:"o";s:3:"緊";s:2:"p";s:3:"緋";s:2:"q";s:3:"緌";s:2:"r";s:3:"緍";s:2:"s";s:3:"緎";s:2:"t";s:3:"総";s:2:"u";s:3:"緐";s:2:"v";s:3:"緑";s:2:"w";s:3:"緒";s:2:"x";s:3:"緓";s:2:"y";s:3:"緔";s:2:"z";s:3:"緕";s:2:"{";s:3:"緖";s:2:"|";s:3:"緗";s:2:"}";s:3:"緘";s:2:"~";s:3:"緙";s:2:"";s:3:"線";s:2:"";s:3:"緛";s:2:"";s:3:"緜";s:2:"";s:3:"緝";s:2:"";s:3:"緞";s:2:"";s:3:"緟";s:2:"";s:3:"締";s:2:"";s:3:"緡";s:2:"";s:3:"緢";s:2:"";s:3:"緣";s:2:"";s:3:"緤";s:2:"";s:3:"緥";s:2:"";s:3:"緦";s:2:"";s:3:"緧";s:2:"";s:3:"編";s:2:"";s:3:"緩";s:2:"";s:3:"緪";s:2:"";s:3:"緫";s:2:"";s:3:"緬";s:2:"";s:3:"緭";s:2:"";s:3:"緮";s:2:"";s:3:"緯";s:2:"";s:3:"緰";s:2:"";s:3:"緱";s:2:"";s:3:"緲";s:2:"";s:3:"緳";s:2:"";s:3:"練";s:2:"";s:3:"緵";s:2:"";s:3:"緶";s:2:"";s:3:"緷";s:2:"";s:3:"緸";s:2:"";s:3:"緹";s:2:"";s:3:"緺";s:2:"";s:3:"尽";s:2:"";s:3:"劲";s:2:"";s:3:"荆";s:2:"";s:3:"兢";s:2:"";s:3:"茎";s:2:"";s:3:"睛";s:2:"";s:3:"晶";s:2:"";s:3:"鲸";s:2:"";s:3:"京";s:2:"";s:3:"惊";s:2:"";s:3:"精";s:2:"";s:3:"粳";s:2:"";s:3:"经";s:2:"";s:3:"井";s:2:"";s:3:"警";s:2:"";s:3:"景";s:2:"";s:3:"颈";s:2:"";s:3:"静";s:2:"";s:3:"境";s:2:"";s:3:"敬";s:2:"";s:3:"镜";s:2:"";s:3:"径";s:2:"";s:3:"痉";s:2:"";s:3:"靖";s:2:"";s:3:"竟";s:2:"";s:3:"竞";s:2:"";s:3:"净";s:2:"";s:3:"炯";s:2:"";s:3:"窘";s:2:"";s:3:"揪";s:2:"";s:3:"究";s:2:"";s:3:"纠";s:2:"";s:3:"玖";s:2:"";s:3:"韭";s:2:"";s:3:"久";s:2:"";s:3:"灸";s:2:"";s:3:"九";s:2:"";s:3:"酒";s:2:"";s:3:"厩";s:2:"";s:3:"救";s:2:"";s:3:"旧";s:2:"";s:3:"臼";s:2:"";s:3:"舅";s:2:"";s:3:"咎";s:2:"";s:3:"就";s:2:"";s:3:"疚";s:2:"";s:3:"鞠";s:2:"";s:3:"拘";s:2:"";s:3:"狙";s:2:"";s:3:"疽";s:2:"";s:3:"居";s:2:"";s:3:"驹";s:2:"";s:3:"菊";s:2:"";s:3:"局";s:2:"";s:3:"咀";s:2:"";s:3:"矩";s:2:"";s:3:"举";s:2:"";s:3:"沮";s:2:"";s:3:"聚";s:2:"";s:3:"拒";s:2:"";s:3:"据";s:2:"";s:3:"巨";s:2:"";s:3:"具";s:2:"";s:3:"距";s:2:"";s:3:"踞";s:2:"";s:3:"锯";s:2:"";s:3:"俱";s:2:"";s:3:"句";s:2:"";s:3:"惧";s:2:"";s:3:"炬";s:2:"";s:3:"剧";s:2:"";s:3:"捐";s:2:"";s:3:"鹃";s:2:"";s:3:"娟";s:2:"";s:3:"倦";s:2:"";s:3:"眷";s:2:"";s:3:"卷";s:2:"";s:3:"绢";s:2:"";s:3:"撅";s:2:"";s:3:"攫";s:2:"";s:3:"抉";s:2:"";s:3:"掘";s:2:"";s:3:"倔";s:2:"";s:3:"爵";s:2:"";s:3:"觉";s:2:"";s:3:"决";s:2:"";s:3:"诀";s:2:"";s:3:"绝";s:2:"";s:3:"均";s:2:"";s:3:"菌";s:2:"";s:3:"钧";s:2:"";s:3:"军";s:2:"";s:3:"君";s:2:"";s:3:"峻";s:2:"@";s:3:"緻";s:2:"A";s:3:"緼";s:2:"B";s:3:"緽";s:2:"C";s:3:"緾";s:2:"D";s:3:"緿";s:2:"E";s:3:"縀";s:2:"F";s:3:"縁";s:2:"G";s:3:"縂";s:2:"H";s:3:"縃";s:2:"I";s:3:"縄";s:2:"J";s:3:"縅";s:2:"K";s:3:"縆";s:2:"L";s:3:"縇";s:2:"M";s:3:"縈";s:2:"N";s:3:"縉";s:2:"O";s:3:"縊";s:2:"P";s:3:"縋";s:2:"Q";s:3:"縌";s:2:"R";s:3:"縍";s:2:"S";s:3:"縎";s:2:"T";s:3:"縏";s:2:"U";s:3:"縐";s:2:"V";s:3:"縑";s:2:"W";s:3:"縒";s:2:"X";s:3:"縓";s:2:"Y";s:3:"縔";s:2:"Z";s:3:"縕";s:2:"[";s:3:"縖";s:2:"\";s:3:"縗";s:2:"]";s:3:"縘";s:2:"^";s:3:"縙";s:2:"_";s:3:"縚";s:2:"`";s:3:"縛";s:2:"a";s:3:"縜";s:2:"b";s:3:"縝";s:2:"c";s:3:"縞";s:2:"d";s:3:"縟";s:2:"e";s:3:"縠";s:2:"f";s:3:"縡";s:2:"g";s:3:"縢";s:2:"h";s:3:"縣";s:2:"i";s:3:"縤";s:2:"j";s:3:"縥";s:2:"k";s:3:"縦";s:2:"l";s:3:"縧";s:2:"m";s:3:"縨";s:2:"n";s:3:"縩";s:2:"o";s:3:"縪";s:2:"p";s:3:"縫";s:2:"q";s:3:"縬";s:2:"r";s:3:"縭";s:2:"s";s:3:"縮";s:2:"t";s:3:"縯";s:2:"u";s:3:"縰";s:2:"v";s:3:"縱";s:2:"w";s:3:"縲";s:2:"x";s:3:"縳";s:2:"y";s:3:"縴";s:2:"z";s:3:"縵";s:2:"{";s:3:"縶";s:2:"|";s:3:"縷";s:2:"}";s:3:"縸";s:2:"~";s:3:"縹";s:2:"";s:3:"縺";s:2:"";s:3:"縼";s:2:"";s:3:"總";s:2:"";s:3:"績";s:2:"";s:3:"縿";s:2:"";s:3:"繀";s:2:"";s:3:"繂";s:2:"";s:3:"繃";s:2:"";s:3:"繄";s:2:"";s:3:"繅";s:2:"";s:3:"繆";s:2:"";s:3:"繈";s:2:"";s:3:"繉";s:2:"";s:3:"繊";s:2:"";s:3:"繋";s:2:"";s:3:"繌";s:2:"";s:3:"繍";s:2:"";s:3:"繎";s:2:"";s:3:"繏";s:2:"";s:3:"繐";s:2:"";s:3:"繑";s:2:"";s:3:"繒";s:2:"";s:3:"繓";s:2:"";s:3:"織";s:2:"";s:3:"繕";s:2:"";s:3:"繖";s:2:"";s:3:"繗";s:2:"";s:3:"繘";s:2:"";s:3:"繙";s:2:"";s:3:"繚";s:2:"";s:3:"繛";s:2:"";s:3:"繜";s:2:"";s:3:"繝";s:2:"";s:3:"俊";s:2:"";s:3:"竣";s:2:"";s:3:"浚";s:2:"";s:3:"郡";s:2:"";s:3:"骏";s:2:"";s:3:"喀";s:2:"";s:3:"咖";s:2:"";s:3:"卡";s:2:"";s:3:"咯";s:2:"";s:3:"开";s:2:"";s:3:"揩";s:2:"";s:3:"楷";s:2:"";s:3:"凯";s:2:"";s:3:"慨";s:2:"";s:3:"刊";s:2:"";s:3:"堪";s:2:"";s:3:"勘";s:2:"";s:3:"坎";s:2:"";s:3:"砍";s:2:"";s:3:"看";s:2:"";s:3:"康";s:2:"";s:3:"慷";s:2:"";s:3:"糠";s:2:"";s:3:"扛";s:2:"";s:3:"抗";s:2:"";s:3:"亢";s:2:"";s:3:"炕";s:2:"";s:3:"考";s:2:"";s:3:"拷";s:2:"";s:3:"烤";s:2:"";s:3:"靠";s:2:"";s:3:"坷";s:2:"";s:3:"苛";s:2:"";s:3:"柯";s:2:"";s:3:"棵";s:2:"";s:3:"磕";s:2:"";s:3:"颗";s:2:"";s:3:"科";s:2:"";s:3:"壳";s:2:"";s:3:"咳";s:2:"";s:3:"可";s:2:"";s:3:"渴";s:2:"";s:3:"克";s:2:"";s:3:"刻";s:2:"";s:3:"客";s:2:"";s:3:"课";s:2:"";s:3:"肯";s:2:"";s:3:"啃";s:2:"";s:3:"垦";s:2:"";s:3:"恳";s:2:"";s:3:"坑";s:2:"";s:3:"吭";s:2:"";s:3:"空";s:2:"";s:3:"恐";s:2:"";s:3:"孔";s:2:"";s:3:"控";s:2:"";s:3:"抠";s:2:"";s:3:"口";s:2:"";s:3:"扣";s:2:"";s:3:"寇";s:2:"";s:3:"枯";s:2:"";s:3:"哭";s:2:"";s:3:"窟";s:2:"";s:3:"苦";s:2:"";s:3:"酷";s:2:"";s:3:"库";s:2:"";s:3:"裤";s:2:"";s:3:"夸";s:2:"";s:3:"垮";s:2:"";s:3:"挎";s:2:"";s:3:"跨";s:2:"";s:3:"胯";s:2:"";s:3:"块";s:2:"";s:3:"筷";s:2:"";s:3:"侩";s:2:"";s:3:"快";s:2:"";s:3:"宽";s:2:"";s:3:"款";s:2:"";s:3:"匡";s:2:"";s:3:"筐";s:2:"";s:3:"狂";s:2:"";s:3:"框";s:2:"";s:3:"矿";s:2:"";s:3:"眶";s:2:"";s:3:"旷";s:2:"";s:3:"况";s:2:"";s:3:"亏";s:2:"";s:3:"盔";s:2:"";s:3:"岿";s:2:"";s:3:"窥";s:2:"";s:3:"葵";s:2:"";s:3:"奎";s:2:"";s:3:"魁";s:2:"";s:3:"傀";s:2:"@";s:3:"繞";s:2:"A";s:3:"繟";s:2:"B";s:3:"繠";s:2:"C";s:3:"繡";s:2:"D";s:3:"繢";s:2:"E";s:3:"繣";s:2:"F";s:3:"繤";s:2:"G";s:3:"繥";s:2:"H";s:3:"繦";s:2:"I";s:3:"繧";s:2:"J";s:3:"繨";s:2:"K";s:3:"繩";s:2:"L";s:3:"繪";s:2:"M";s:3:"繫";s:2:"N";s:3:"繬";s:2:"O";s:3:"繭";s:2:"P";s:3:"繮";s:2:"Q";s:3:"繯";s:2:"R";s:3:"繰";s:2:"S";s:3:"繱";s:2:"T";s:3:"繲";s:2:"U";s:3:"繳";s:2:"V";s:3:"繴";s:2:"W";s:3:"繵";s:2:"X";s:3:"繶";s:2:"Y";s:3:"繷";s:2:"Z";s:3:"繸";s:2:"[";s:3:"繹";s:2:"\";s:3:"繺";s:2:"]";s:3:"繻";s:2:"^";s:3:"繼";s:2:"_";s:3:"繽";s:2:"`";s:3:"繾";s:2:"a";s:3:"繿";s:2:"b";s:3:"纀";s:2:"c";s:3:"纁";s:2:"d";s:3:"纃";s:2:"e";s:3:"纄";s:2:"f";s:3:"纅";s:2:"g";s:3:"纆";s:2:"h";s:3:"纇";s:2:"i";s:3:"纈";s:2:"j";s:3:"纉";s:2:"k";s:3:"纊";s:2:"l";s:3:"纋";s:2:"m";s:3:"續";s:2:"n";s:3:"纍";s:2:"o";s:3:"纎";s:2:"p";s:3:"纏";s:2:"q";s:3:"纐";s:2:"r";s:3:"纑";s:2:"s";s:3:"纒";s:2:"t";s:3:"纓";s:2:"u";s:3:"纔";s:2:"v";s:3:"纕";s:2:"w";s:3:"纖";s:2:"x";s:3:"纗";s:2:"y";s:3:"纘";s:2:"z";s:3:"纙";s:2:"{";s:3:"纚";s:2:"|";s:3:"纜";s:2:"}";s:3:"纝";s:2:"~";s:3:"纞";s:2:"";s:3:"纮";s:2:"";s:3:"纴";s:2:"";s:3:"纻";s:2:"";s:3:"纼";s:2:"";s:3:"绖";s:2:"";s:3:"绤";s:2:"";s:3:"绬";s:2:"";s:3:"绹";s:2:"";s:3:"缊";s:2:"";s:3:"缐";s:2:"";s:3:"缞";s:2:"";s:3:"缷";s:2:"";s:3:"缹";s:2:"";s:3:"缻";s:2:"";s:3:"缼";s:2:"";s:3:"缽";s:2:"";s:3:"缾";s:2:"";s:3:"缿";s:2:"";s:3:"罀";s:2:"";s:3:"罁";s:2:"";s:3:"罃";s:2:"";s:3:"罆";s:2:"";s:3:"罇";s:2:"";s:3:"罈";s:2:"";s:3:"罉";s:2:"";s:3:"罊";s:2:"";s:3:"罋";s:2:"";s:3:"罌";s:2:"";s:3:"罍";s:2:"";s:3:"罎";s:2:"";s:3:"罏";s:2:"";s:3:"罒";s:2:"";s:3:"罓";s:2:"";s:3:"馈";s:2:"";s:3:"愧";s:2:"";s:3:"溃";s:2:"";s:3:"坤";s:2:"";s:3:"昆";s:2:"";s:3:"捆";s:2:"";s:3:"困";s:2:"";s:3:"括";s:2:"";s:3:"扩";s:2:"";s:3:"廓";s:2:"";s:3:"阔";s:2:"";s:3:"垃";s:2:"";s:3:"拉";s:2:"";s:3:"喇";s:2:"";s:3:"蜡";s:2:"";s:3:"腊";s:2:"";s:3:"辣";s:2:"";s:3:"啦";s:2:"";s:3:"莱";s:2:"";s:3:"来";s:2:"";s:3:"赖";s:2:"";s:3:"蓝";s:2:"";s:3:"婪";s:2:"";s:3:"栏";s:2:"";s:3:"拦";s:2:"";s:3:"篮";s:2:"";s:3:"阑";s:2:"";s:3:"兰";s:2:"";s:3:"澜";s:2:"";s:3:"谰";s:2:"";s:3:"揽";s:2:"";s:3:"览";s:2:"";s:3:"懒";s:2:"";s:3:"缆";s:2:"";s:3:"烂";s:2:"";s:3:"滥";s:2:"";s:3:"琅";s:2:"";s:3:"榔";s:2:"";s:3:"狼";s:2:"";s:3:"廊";s:2:"";s:3:"郎";s:2:"";s:3:"朗";s:2:"";s:3:"浪";s:2:"";s:3:"捞";s:2:"";s:3:"劳";s:2:"";s:3:"牢";s:2:"";s:3:"老";s:2:"";s:3:"佬";s:2:"";s:3:"姥";s:2:"";s:3:"酪";s:2:"";s:3:"烙";s:2:"";s:3:"涝";s:2:"";s:3:"勒";s:2:"";s:3:"乐";s:2:"";s:3:"雷";s:2:"";s:3:"镭";s:2:"";s:3:"蕾";s:2:"";s:3:"磊";s:2:"";s:3:"累";s:2:"";s:3:"儡";s:2:"";s:3:"垒";s:2:"";s:3:"擂";s:2:"";s:3:"肋";s:2:"";s:3:"类";s:2:"";s:3:"泪";s:2:"";s:3:"棱";s:2:"";s:3:"楞";s:2:"";s:3:"冷";s:2:"";s:3:"厘";s:2:"";s:3:"梨";s:2:"";s:3:"犁";s:2:"";s:3:"黎";s:2:"";s:3:"篱";s:2:"";s:3:"狸";s:2:"";s:3:"离";s:2:"";s:3:"漓";s:2:"";s:3:"理";s:2:"";s:3:"李";s:2:"";s:3:"里";s:2:"";s:3:"鲤";s:2:"";s:3:"礼";s:2:"";s:3:"莉";s:2:"";s:3:"荔";s:2:"";s:3:"吏";s:2:"";s:3:"栗";s:2:"";s:3:"丽";s:2:"";s:3:"厉";s:2:"";s:3:"励";s:2:"";s:3:"砾";s:2:"";s:3:"历";s:2:"";s:3:"利";s:2:"";s:3:"傈";s:2:"";s:3:"例";s:2:"";s:3:"俐";s:2:"@";s:3:"罖";s:2:"A";s:3:"罙";s:2:"B";s:3:"罛";s:2:"C";s:3:"罜";s:2:"D";s:3:"罝";s:2:"E";s:3:"罞";s:2:"F";s:3:"罠";s:2:"G";s:3:"罣";s:2:"H";s:3:"罤";s:2:"I";s:3:"罥";s:2:"J";s:3:"罦";s:2:"K";s:3:"罧";s:2:"L";s:3:"罫";s:2:"M";s:3:"罬";s:2:"N";s:3:"罭";s:2:"O";s:3:"罯";s:2:"P";s:3:"罰";s:2:"Q";s:3:"罳";s:2:"R";s:3:"罵";s:2:"S";s:3:"罶";s:2:"T";s:3:"罷";s:2:"U";s:3:"罸";s:2:"V";s:3:"罺";s:2:"W";s:3:"罻";s:2:"X";s:3:"罼";s:2:"Y";s:3:"罽";s:2:"Z";s:3:"罿";s:2:"[";s:3:"羀";s:2:"\";s:3:"羂";s:2:"]";s:3:"羃";s:2:"^";s:3:"羄";s:2:"_";s:3:"羅";s:2:"`";s:3:"羆";s:2:"a";s:3:"羇";s:2:"b";s:3:"羈";s:2:"c";s:3:"羉";s:2:"d";s:3:"羋";s:2:"e";s:3:"羍";s:2:"f";s:3:"羏";s:2:"g";s:3:"羐";s:2:"h";s:3:"羑";s:2:"i";s:3:"羒";s:2:"j";s:3:"羓";s:2:"k";s:3:"羕";s:2:"l";s:3:"羖";s:2:"m";s:3:"羗";s:2:"n";s:3:"羘";s:2:"o";s:3:"羙";s:2:"p";s:3:"羛";s:2:"q";s:3:"羜";s:2:"r";s:3:"羠";s:2:"s";s:3:"羢";s:2:"t";s:3:"羣";s:2:"u";s:3:"羥";s:2:"v";s:3:"羦";s:2:"w";s:3:"羨";s:2:"x";s:3:"義";s:2:"y";s:3:"羪";s:2:"z";s:3:"羫";s:2:"{";s:3:"羬";s:2:"|";s:3:"羭";s:2:"}";s:3:"羮";s:2:"~";s:3:"羱";s:2:"";s:3:"羳";s:2:"";s:3:"羴";s:2:"";s:3:"羵";s:2:"";s:3:"羶";s:2:"";s:3:"羷";s:2:"";s:3:"羺";s:2:"";s:3:"羻";s:2:"";s:3:"羾";s:2:"";s:3:"翀";s:2:"";s:3:"翂";s:2:"";s:3:"翃";s:2:"";s:3:"翄";s:2:"";s:3:"翆";s:2:"";s:3:"翇";s:2:"";s:3:"翈";s:2:"";s:3:"翉";s:2:"";s:3:"翋";s:2:"";s:3:"翍";s:2:"";s:3:"翏";s:2:"";s:3:"翐";s:2:"";s:3:"翑";s:2:"";s:3:"習";s:2:"";s:3:"翓";s:2:"";s:3:"翖";s:2:"";s:3:"翗";s:2:"";s:3:"翙";s:2:"";s:3:"翚";s:2:"";s:3:"翛";s:2:"";s:3:"翜";s:2:"";s:3:"翝";s:2:"";s:3:"翞";s:2:"";s:3:"翢";s:2:"";s:3:"翣";s:2:"";s:3:"痢";s:2:"";s:3:"立";s:2:"";s:3:"粒";s:2:"";s:3:"沥";s:2:"";s:3:"隶";s:2:"";s:3:"力";s:2:"";s:3:"璃";s:2:"";s:3:"哩";s:2:"";s:3:"俩";s:2:"";s:3:"联";s:2:"";s:3:"莲";s:2:"";s:3:"连";s:2:"";s:3:"镰";s:2:"";s:3:"廉";s:2:"";s:3:"怜";s:2:"";s:3:"涟";s:2:"";s:3:"帘";s:2:"";s:3:"敛";s:2:"";s:3:"脸";s:2:"";s:3:"链";s:2:"";s:3:"恋";s:2:"";s:3:"炼";s:2:"";s:3:"练";s:2:"";s:3:"粮";s:2:"";s:3:"凉";s:2:"";s:3:"梁";s:2:"";s:3:"粱";s:2:"";s:3:"良";s:2:"";s:3:"两";s:2:"";s:3:"辆";s:2:"";s:3:"量";s:2:"";s:3:"晾";s:2:"";s:3:"亮";s:2:"";s:3:"谅";s:2:"";s:3:"撩";s:2:"";s:3:"聊";s:2:"";s:3:"僚";s:2:"";s:3:"疗";s:2:"";s:3:"燎";s:2:"";s:3:"寥";s:2:"";s:3:"辽";s:2:"";s:3:"潦";s:2:"";s:3:"了";s:2:"";s:3:"撂";s:2:"";s:3:"镣";s:2:"";s:3:"廖";s:2:"";s:3:"料";s:2:"";s:3:"列";s:2:"";s:3:"裂";s:2:"";s:3:"烈";s:2:"";s:3:"劣";s:2:"";s:3:"猎";s:2:"";s:3:"琳";s:2:"";s:3:"林";s:2:"";s:3:"磷";s:2:"";s:3:"霖";s:2:"";s:3:"临";s:2:"";s:3:"邻";s:2:"";s:3:"鳞";s:2:"";s:3:"淋";s:2:"";s:3:"凛";s:2:"";s:3:"赁";s:2:"";s:3:"吝";s:2:"";s:3:"拎";s:2:"";s:3:"玲";s:2:"";s:3:"菱";s:2:"";s:3:"零";s:2:"";s:3:"龄";s:2:"";s:3:"铃";s:2:"";s:3:"伶";s:2:"";s:3:"羚";s:2:"";s:3:"凌";s:2:"";s:3:"灵";s:2:"";s:3:"陵";s:2:"";s:3:"岭";s:2:"";s:3:"领";s:2:"";s:3:"另";s:2:"";s:3:"令";s:2:"";s:3:"溜";s:2:"";s:3:"琉";s:2:"";s:3:"榴";s:2:"";s:3:"硫";s:2:"";s:3:"馏";s:2:"";s:3:"留";s:2:"";s:3:"刘";s:2:"";s:3:"瘤";s:2:"";s:3:"流";s:2:"";s:3:"柳";s:2:"";s:3:"六";s:2:"";s:3:"龙";s:2:"";s:3:"聋";s:2:"";s:3:"咙";s:2:"";s:3:"笼";s:2:"";s:3:"窿";s:2:"@";s:3:"翤";s:2:"A";s:3:"翧";s:2:"B";s:3:"翨";s:2:"C";s:3:"翪";s:2:"D";s:3:"翫";s:2:"E";s:3:"翬";s:2:"F";s:3:"翭";s:2:"G";s:3:"翯";s:2:"H";s:3:"翲";s:2:"I";s:3:"翴";s:2:"J";s:3:"翵";s:2:"K";s:3:"翶";s:2:"L";s:3:"翷";s:2:"M";s:3:"翸";s:2:"N";s:3:"翹";s:2:"O";s:3:"翺";s:2:"P";s:3:"翽";s:2:"Q";s:3:"翾";s:2:"R";s:3:"翿";s:2:"S";s:3:"耂";s:2:"T";s:3:"耇";s:2:"U";s:3:"耈";s:2:"V";s:3:"耉";s:2:"W";s:3:"耊";s:2:"X";s:3:"耎";s:2:"Y";s:3:"耏";s:2:"Z";s:3:"耑";s:2:"[";s:3:"耓";s:2:"\";s:3:"耚";s:2:"]";s:3:"耛";s:2:"^";s:3:"耝";s:2:"_";s:3:"耞";s:2:"`";s:3:"耟";s:2:"a";s:3:"耡";s:2:"b";s:3:"耣";s:2:"c";s:3:"耤";s:2:"d";s:3:"耫";s:2:"e";s:3:"耬";s:2:"f";s:3:"耭";s:2:"g";s:3:"耮";s:2:"h";s:3:"耯";s:2:"i";s:3:"耰";s:2:"j";s:3:"耲";s:2:"k";s:3:"耴";s:2:"l";s:3:"耹";s:2:"m";s:3:"耺";s:2:"n";s:3:"耼";s:2:"o";s:3:"耾";s:2:"p";s:3:"聀";s:2:"q";s:3:"聁";s:2:"r";s:3:"聄";s:2:"s";s:3:"聅";s:2:"t";s:3:"聇";s:2:"u";s:3:"聈";s:2:"v";s:3:"聉";s:2:"w";s:3:"聎";s:2:"x";s:3:"聏";s:2:"y";s:3:"聐";s:2:"z";s:3:"聑";s:2:"{";s:3:"聓";s:2:"|";s:3:"聕";s:2:"}";s:3:"聖";s:2:"~";s:3:"聗";s:2:"";s:3:"聙";s:2:"";s:3:"聛";s:2:"";s:3:"聜";s:2:"";s:3:"聝";s:2:"";s:3:"聞";s:2:"";s:3:"聟";s:2:"";s:3:"聠";s:2:"";s:3:"聡";s:2:"";s:3:"聢";s:2:"";s:3:"聣";s:2:"";s:3:"聤";s:2:"";s:3:"聥";s:2:"";s:3:"聦";s:2:"";s:3:"聧";s:2:"";s:3:"聨";s:2:"";s:3:"聫";s:2:"";s:3:"聬";s:2:"";s:3:"聭";s:2:"";s:3:"聮";s:2:"";s:3:"聯";s:2:"";s:3:"聰";s:2:"";s:3:"聲";s:2:"";s:3:"聳";s:2:"";s:3:"聴";s:2:"";s:3:"聵";s:2:"";s:3:"聶";s:2:"";s:3:"職";s:2:"";s:3:"聸";s:2:"";s:3:"聹";s:2:"";s:3:"聺";s:2:"";s:3:"聻";s:2:"";s:3:"聼";s:2:" ";s:3:"聽";s:2:"¡";s:3:"隆";s:2:"¢";s:3:"垄";s:2:"£";s:3:"拢";s:2:"¤";s:3:"陇";s:2:"¥";s:3:"楼";s:2:"¦";s:3:"娄";s:2:"§";s:3:"搂";s:2:"¨";s:3:"篓";s:2:"©";s:3:"漏";s:2:"ª";s:3:"陋";s:2:"«";s:3:"芦";s:2:"¬";s:3:"卢";s:2:"­";s:3:"颅";s:2:"®";s:3:"庐";s:2:"¯";s:3:"炉";s:2:"°";s:3:"掳";s:2:"±";s:3:"卤";s:2:"²";s:3:"虏";s:2:"³";s:3:"鲁";s:2:"´";s:3:"麓";s:2:"µ";s:3:"碌";s:2:"¶";s:3:"露";s:2:"·";s:3:"路";s:2:"¸";s:3:"赂";s:2:"¹";s:3:"鹿";s:2:"º";s:3:"潞";s:2:"»";s:3:"禄";s:2:"¼";s:3:"录";s:2:"½";s:3:"陆";s:2:"¾";s:3:"戮";s:2:"¿";s:3:"驴";s:2:"";s:3:"吕";s:2:"";s:3:"铝";s:2:"";s:3:"侣";s:2:"";s:3:"旅";s:2:"";s:3:"履";s:2:"";s:3:"屡";s:2:"";s:3:"缕";s:2:"";s:3:"虑";s:2:"";s:3:"氯";s:2:"";s:3:"律";s:2:"";s:3:"率";s:2:"";s:3:"滤";s:2:"";s:3:"绿";s:2:"";s:3:"峦";s:2:"";s:3:"挛";s:2:"";s:3:"孪";s:2:"";s:3:"滦";s:2:"";s:3:"卵";s:2:"";s:3:"乱";s:2:"";s:3:"掠";s:2:"";s:3:"略";s:2:"";s:3:"抡";s:2:"";s:3:"轮";s:2:"";s:3:"伦";s:2:"";s:3:"仑";s:2:"";s:3:"沦";s:2:"";s:3:"纶";s:2:"";s:3:"论";s:2:"";s:3:"萝";s:2:"";s:3:"螺";s:2:"";s:3:"罗";s:2:"";s:3:"逻";s:2:"";s:3:"锣";s:2:"";s:3:"箩";s:2:"";s:3:"骡";s:2:"";s:3:"裸";s:2:"";s:3:"落";s:2:"";s:3:"洛";s:2:"";s:3:"骆";s:2:"";s:3:"络";s:2:"";s:3:"妈";s:2:"";s:3:"麻";s:2:"";s:3:"玛";s:2:"";s:3:"码";s:2:"";s:3:"蚂";s:2:"";s:3:"马";s:2:"";s:3:"骂";s:2:"";s:3:"嘛";s:2:"";s:3:"吗";s:2:"";s:3:"埋";s:2:"";s:3:"买";s:2:"";s:3:"麦";s:2:"";s:3:"卖";s:2:"";s:3:"迈";s:2:"";s:3:"脉";s:2:"";s:3:"瞒";s:2:"";s:3:"馒";s:2:"";s:3:"蛮";s:2:"";s:3:"满";s:2:"";s:3:"蔓";s:2:"";s:3:"曼";s:2:"";s:3:"慢";s:2:"";s:3:"漫";s:2:"@";s:3:"聾";s:2:"A";s:3:"肁";s:2:"B";s:3:"肂";s:2:"C";s:3:"肅";s:2:"D";s:3:"肈";s:2:"E";s:3:"肊";s:2:"F";s:3:"肍";s:2:"G";s:3:"肎";s:2:"H";s:3:"肏";s:2:"I";s:3:"肐";s:2:"J";s:3:"肑";s:2:"K";s:3:"肒";s:2:"L";s:3:"肔";s:2:"M";s:3:"肕";s:2:"N";s:3:"肗";s:2:"O";s:3:"肙";s:2:"P";s:3:"肞";s:2:"Q";s:3:"肣";s:2:"R";s:3:"肦";s:2:"S";s:3:"肧";s:2:"T";s:3:"肨";s:2:"U";s:3:"肬";s:2:"V";s:3:"肰";s:2:"W";s:3:"肳";s:2:"X";s:3:"肵";s:2:"Y";s:3:"肶";s:2:"Z";s:3:"肸";s:2:"[";s:3:"肹";s:2:"\";s:3:"肻";s:2:"]";s:3:"胅";s:2:"^";s:3:"胇";s:2:"_";s:3:"胈";s:2:"`";s:3:"胉";s:2:"a";s:3:"胊";s:2:"b";s:3:"胋";s:2:"c";s:3:"胏";s:2:"d";s:3:"胐";s:2:"e";s:3:"胑";s:2:"f";s:3:"胒";s:2:"g";s:3:"胓";s:2:"h";s:3:"胔";s:2:"i";s:3:"胕";s:2:"j";s:3:"胘";s:2:"k";s:3:"胟";s:2:"l";s:3:"胠";s:2:"m";s:3:"胢";s:2:"n";s:3:"胣";s:2:"o";s:3:"胦";s:2:"p";s:3:"胮";s:2:"q";s:3:"胵";s:2:"r";s:3:"胷";s:2:"s";s:3:"胹";s:2:"t";s:3:"胻";s:2:"u";s:3:"胾";s:2:"v";s:3:"胿";s:2:"w";s:3:"脀";s:2:"x";s:3:"脁";s:2:"y";s:3:"脃";s:2:"z";s:3:"脄";s:2:"{";s:3:"脅";s:2:"|";s:3:"脇";s:2:"}";s:3:"脈";s:2:"~";s:3:"脋";s:2:"À";s:3:"脌";s:2:"Á";s:3:"脕";s:2:"Â";s:3:"脗";s:2:"Ã";s:3:"脙";s:2:"Ä";s:3:"脛";s:2:"Å";s:3:"脜";s:2:"Æ";s:3:"脝";s:2:"Ç";s:3:"脟";s:2:"È";s:3:"脠";s:2:"É";s:3:"脡";s:2:"Ê";s:3:"脢";s:2:"Ë";s:3:"脣";s:2:"Ì";s:3:"脤";s:2:"Í";s:3:"脥";s:2:"Î";s:3:"脦";s:2:"Ï";s:3:"脧";s:2:"Ð";s:3:"脨";s:2:"Ñ";s:3:"脩";s:2:"Ò";s:3:"脪";s:2:"Ó";s:3:"脫";s:2:"Ô";s:3:"脭";s:2:"Õ";s:3:"脮";s:2:"Ö";s:3:"脰";s:2:"×";s:3:"脳";s:2:"Ø";s:3:"脴";s:2:"Ù";s:3:"脵";s:2:"Ú";s:3:"脷";s:2:"Û";s:3:"脹";s:2:"Ü";s:3:"脺";s:2:"Ý";s:3:"脻";s:2:"Þ";s:3:"脼";s:2:"ß";s:3:"脽";s:2:"à";s:3:"脿";s:2:"á";s:3:"谩";s:2:"â";s:3:"芒";s:2:"ã";s:3:"茫";s:2:"ä";s:3:"盲";s:2:"å";s:3:"氓";s:2:"æ";s:3:"忙";s:2:"ç";s:3:"莽";s:2:"è";s:3:"猫";s:2:"é";s:3:"茅";s:2:"ê";s:3:"锚";s:2:"ë";s:3:"毛";s:2:"ì";s:3:"矛";s:2:"í";s:3:"铆";s:2:"î";s:3:"卯";s:2:"ï";s:3:"茂";s:2:"ð";s:3:"冒";s:2:"ñ";s:3:"帽";s:2:"ò";s:3:"貌";s:2:"ó";s:3:"贸";s:2:"ô";s:3:"么";s:2:"õ";s:3:"玫";s:2:"ö";s:3:"枚";s:2:"÷";s:3:"梅";s:2:"ø";s:3:"酶";s:2:"ù";s:3:"霉";s:2:"ú";s:3:"煤";s:2:"û";s:3:"没";s:2:"ü";s:3:"眉";s:2:"ý";s:3:"媒";s:2:"þ";s:3:"镁";s:2:"ÿ";s:3:"每";s:2:"";s:3:"美";s:2:"";s:3:"昧";s:2:"";s:3:"寐";s:2:"";s:3:"妹";s:2:"";s:3:"媚";s:2:"";s:3:"门";s:2:"";s:3:"闷";s:2:"";s:3:"们";s:2:"";s:3:"萌";s:2:"";s:3:"蒙";s:2:"";s:3:"檬";s:2:"";s:3:"盟";s:2:"";s:3:"锰";s:2:"";s:3:"猛";s:2:"";s:3:"梦";s:2:"";s:3:"孟";s:2:"";s:3:"眯";s:2:"";s:3:"醚";s:2:"";s:3:"靡";s:2:"";s:3:"糜";s:2:"";s:3:"迷";s:2:"";s:3:"谜";s:2:"";s:3:"弥";s:2:"";s:3:"米";s:2:"";s:3:"秘";s:2:"";s:3:"觅";s:2:"";s:3:"泌";s:2:"";s:3:"蜜";s:2:"";s:3:"密";s:2:"";s:3:"幂";s:2:"";s:3:"棉";s:2:"";s:3:"眠";s:2:"";s:3:"绵";s:2:"";s:3:"冕";s:2:"";s:3:"免";s:2:"";s:3:"勉";s:2:"";s:3:"娩";s:2:"";s:3:"缅";s:2:"";s:3:"面";s:2:"";s:3:"苗";s:2:"";s:3:"描";s:2:"";s:3:"瞄";s:2:"";s:3:"藐";s:2:"";s:3:"秒";s:2:"";s:3:"渺";s:2:"";s:3:"庙";s:2:"";s:3:"妙";s:2:"";s:3:"蔑";s:2:"";s:3:"灭";s:2:"";s:3:"民";s:2:"";s:3:"抿";s:2:"";s:3:"皿";s:2:"";s:3:"敏";s:2:"";s:3:"悯";s:2:"";s:3:"闽";s:2:"";s:3:"明";s:2:"";s:3:"螟";s:2:"";s:3:"鸣";s:2:"";s:3:"铭";s:2:"";s:3:"名";s:2:"";s:3:"命";s:2:"";s:3:"谬";s:2:"";s:3:"摸";s:2:"@";s:3:"腀";s:2:"A";s:3:"腁";s:2:"B";s:3:"腂";s:2:"C";s:3:"腃";s:2:"D";s:3:"腄";s:2:"E";s:3:"腅";s:2:"F";s:3:"腇";s:2:"G";s:3:"腉";s:2:"H";s:3:"腍";s:2:"I";s:3:"腎";s:2:"J";s:3:"腏";s:2:"K";s:3:"腒";s:2:"L";s:3:"腖";s:2:"M";s:3:"腗";s:2:"N";s:3:"腘";s:2:"O";s:3:"腛";s:2:"P";s:3:"腜";s:2:"Q";s:3:"腝";s:2:"R";s:3:"腞";s:2:"S";s:3:"腟";s:2:"T";s:3:"腡";s:2:"U";s:3:"腢";s:2:"V";s:3:"腣";s:2:"W";s:3:"腤";s:2:"X";s:3:"腦";s:2:"Y";s:3:"腨";s:2:"Z";s:3:"腪";s:2:"[";s:3:"腫";s:2:"\";s:3:"腬";s:2:"]";s:3:"腯";s:2:"^";s:3:"腲";s:2:"_";s:3:"腳";s:2:"`";s:3:"腵";s:2:"a";s:3:"腶";s:2:"b";s:3:"腷";s:2:"c";s:3:"腸";s:2:"d";s:3:"膁";s:2:"e";s:3:"膃";s:2:"f";s:3:"膄";s:2:"g";s:3:"膅";s:2:"h";s:3:"膆";s:2:"i";s:3:"膇";s:2:"j";s:3:"膉";s:2:"k";s:3:"膋";s:2:"l";s:3:"膌";s:2:"m";s:3:"膍";s:2:"n";s:3:"膎";s:2:"o";s:3:"膐";s:2:"p";s:3:"膒";s:2:"q";s:3:"膓";s:2:"r";s:3:"膔";s:2:"s";s:3:"膕";s:2:"t";s:3:"膖";s:2:"u";s:3:"膗";s:2:"v";s:3:"膙";s:2:"w";s:3:"膚";s:2:"x";s:3:"膞";s:2:"y";s:3:"膟";s:2:"z";s:3:"膠";s:2:"{";s:3:"膡";s:2:"|";s:3:"膢";s:2:"}";s:3:"膤";s:2:"~";s:3:"膥";s:2:"Ā";s:3:"膧";s:2:"ā";s:3:"膩";s:2:"Ă";s:3:"膫";s:2:"ă";s:3:"膬";s:2:"Ą";s:3:"膭";s:2:"ą";s:3:"膮";s:2:"Ć";s:3:"膯";s:2:"ć";s:3:"膰";s:2:"Ĉ";s:3:"膱";s:2:"ĉ";s:3:"膲";s:2:"Ċ";s:3:"膴";s:2:"ċ";s:3:"膵";s:2:"Č";s:3:"膶";s:2:"č";s:3:"膷";s:2:"Ď";s:3:"膸";s:2:"ď";s:3:"膹";s:2:"Đ";s:3:"膼";s:2:"đ";s:3:"膽";s:2:"Ē";s:3:"膾";s:2:"ē";s:3:"膿";s:2:"Ĕ";s:3:"臄";s:2:"ĕ";s:3:"臅";s:2:"Ė";s:3:"臇";s:2:"ė";s:3:"臈";s:2:"Ę";s:3:"臉";s:2:"ę";s:3:"臋";s:2:"Ě";s:3:"臍";s:2:"ě";s:3:"臎";s:2:"Ĝ";s:3:"臏";s:2:"ĝ";s:3:"臐";s:2:"Ğ";s:3:"臑";s:2:"ğ";s:3:"臒";s:2:"Ġ";s:3:"臓";s:2:"ġ";s:3:"摹";s:2:"Ģ";s:3:"蘑";s:2:"ģ";s:3:"模";s:2:"Ĥ";s:3:"膜";s:2:"ĥ";s:3:"磨";s:2:"Ħ";s:3:"摩";s:2:"ħ";s:3:"魔";s:2:"Ĩ";s:3:"抹";s:2:"ĩ";s:3:"末";s:2:"Ī";s:3:"莫";s:2:"ī";s:3:"墨";s:2:"Ĭ";s:3:"默";s:2:"ĭ";s:3:"沫";s:2:"Į";s:3:"漠";s:2:"į";s:3:"寞";s:2:"İ";s:3:"陌";s:2:"ı";s:3:"谋";s:2:"Ĳ";s:3:"牟";s:2:"ĳ";s:3:"某";s:2:"Ĵ";s:3:"拇";s:2:"ĵ";s:3:"牡";s:2:"Ķ";s:3:"亩";s:2:"ķ";s:3:"姆";s:2:"ĸ";s:3:"母";s:2:"Ĺ";s:3:"墓";s:2:"ĺ";s:3:"暮";s:2:"Ļ";s:3:"幕";s:2:"ļ";s:3:"募";s:2:"Ľ";s:3:"慕";s:2:"ľ";s:3:"木";s:2:"Ŀ";s:3:"目";s:2:"";s:3:"睦";s:2:"";s:3:"牧";s:2:"";s:3:"穆";s:2:"";s:3:"拿";s:2:"";s:3:"哪";s:2:"";s:3:"呐";s:2:"";s:3:"钠";s:2:"";s:3:"那";s:2:"";s:3:"娜";s:2:"";s:3:"纳";s:2:"";s:3:"氖";s:2:"";s:3:"乃";s:2:"";s:3:"奶";s:2:"";s:3:"耐";s:2:"";s:3:"奈";s:2:"";s:3:"南";s:2:"";s:3:"男";s:2:"";s:3:"难";s:2:"";s:3:"囊";s:2:"";s:3:"挠";s:2:"";s:3:"脑";s:2:"";s:3:"恼";s:2:"";s:3:"闹";s:2:"";s:3:"淖";s:2:"";s:3:"呢";s:2:"";s:3:"馁";s:2:"";s:3:"内";s:2:"";s:3:"嫩";s:2:"";s:3:"能";s:2:"";s:3:"妮";s:2:"";s:3:"霓";s:2:"";s:3:"倪";s:2:"";s:3:"泥";s:2:"";s:3:"尼";s:2:"";s:3:"拟";s:2:"";s:3:"你";s:2:"";s:3:"匿";s:2:"";s:3:"腻";s:2:"";s:3:"逆";s:2:"";s:3:"溺";s:2:"";s:3:"蔫";s:2:"";s:3:"拈";s:2:"";s:3:"年";s:2:"";s:3:"碾";s:2:"";s:3:"撵";s:2:"";s:3:"捻";s:2:"";s:3:"念";s:2:"";s:3:"娘";s:2:"";s:3:"酿";s:2:"";s:3:"鸟";s:2:"";s:3:"尿";s:2:"";s:3:"捏";s:2:"";s:3:"聂";s:2:"";s:3:"孽";s:2:"";s:3:"啮";s:2:"";s:3:"镊";s:2:"";s:3:"镍";s:2:"";s:3:"涅";s:2:"";s:3:"您";s:2:"";s:3:"柠";s:2:"";s:3:"狞";s:2:"";s:3:"凝";s:2:"";s:3:"宁";s:2:"@";s:3:"臔";s:2:"A";s:3:"臕";s:2:"B";s:3:"臖";s:2:"C";s:3:"臗";s:2:"D";s:3:"臘";s:2:"E";s:3:"臙";s:2:"F";s:3:"臚";s:2:"G";s:3:"臛";s:2:"H";s:3:"臜";s:2:"I";s:3:"臝";s:2:"J";s:3:"臞";s:2:"K";s:3:"臟";s:2:"L";s:3:"臠";s:2:"M";s:3:"臡";s:2:"N";s:3:"臢";s:2:"O";s:3:"臤";s:2:"P";s:3:"臥";s:2:"Q";s:3:"臦";s:2:"R";s:3:"臨";s:2:"S";s:3:"臩";s:2:"T";s:3:"臫";s:2:"U";s:3:"臮";s:2:"V";s:3:"臯";s:2:"W";s:3:"臰";s:2:"X";s:3:"臱";s:2:"Y";s:3:"臲";s:2:"Z";s:3:"臵";s:2:"[";s:3:"臶";s:2:"\";s:3:"臷";s:2:"]";s:3:"臸";s:2:"^";s:3:"臹";s:2:"_";s:3:"臺";s:2:"`";s:3:"臽";s:2:"a";s:3:"臿";s:2:"b";s:3:"舃";s:2:"c";s:3:"與";s:2:"d";s:3:"興";s:2:"e";s:3:"舉";s:2:"f";s:3:"舊";s:2:"g";s:3:"舋";s:2:"h";s:3:"舎";s:2:"i";s:3:"舏";s:2:"j";s:3:"舑";s:2:"k";s:3:"舓";s:2:"l";s:3:"舕";s:2:"m";s:3:"舖";s:2:"n";s:3:"舗";s:2:"o";s:3:"舘";s:2:"p";s:3:"舙";s:2:"q";s:3:"舚";s:2:"r";s:3:"舝";s:2:"s";s:3:"舠";s:2:"t";s:3:"舤";s:2:"u";s:3:"舥";s:2:"v";s:3:"舦";s:2:"w";s:3:"舧";s:2:"x";s:3:"舩";s:2:"y";s:3:"舮";s:2:"z";s:3:"舲";s:2:"{";s:3:"舺";s:2:"|";s:3:"舼";s:2:"}";s:3:"舽";s:2:"~";s:3:"舿";s:2:"ŀ";s:3:"艀";s:2:"Ł";s:3:"艁";s:2:"ł";s:3:"艂";s:2:"Ń";s:3:"艃";s:2:"ń";s:3:"艅";s:2:"Ņ";s:3:"艆";s:2:"ņ";s:3:"艈";s:2:"Ň";s:3:"艊";s:2:"ň";s:3:"艌";s:2:"ŉ";s:3:"艍";s:2:"Ŋ";s:3:"艎";s:2:"ŋ";s:3:"艐";s:2:"Ō";s:3:"艑";s:2:"ō";s:3:"艒";s:2:"Ŏ";s:3:"艓";s:2:"ŏ";s:3:"艔";s:2:"Ő";s:3:"艕";s:2:"ő";s:3:"艖";s:2:"Œ";s:3:"艗";s:2:"œ";s:3:"艙";s:2:"Ŕ";s:3:"艛";s:2:"ŕ";s:3:"艜";s:2:"Ŗ";s:3:"艝";s:2:"ŗ";s:3:"艞";s:2:"Ř";s:3:"艠";s:2:"ř";s:3:"艡";s:2:"Ś";s:3:"艢";s:2:"ś";s:3:"艣";s:2:"Ŝ";s:3:"艤";s:2:"ŝ";s:3:"艥";s:2:"Ş";s:3:"艦";s:2:"ş";s:3:"艧";s:2:"Š";s:3:"艩";s:2:"š";s:3:"拧";s:2:"Ţ";s:3:"泞";s:2:"ţ";s:3:"牛";s:2:"Ť";s:3:"扭";s:2:"ť";s:3:"钮";s:2:"Ŧ";s:3:"纽";s:2:"ŧ";s:3:"脓";s:2:"Ũ";s:3:"浓";s:2:"ũ";s:3:"农";s:2:"Ū";s:3:"弄";s:2:"ū";s:3:"奴";s:2:"Ŭ";s:3:"努";s:2:"ŭ";s:3:"怒";s:2:"Ů";s:3:"女";s:2:"ů";s:3:"暖";s:2:"Ű";s:3:"虐";s:2:"ű";s:3:"疟";s:2:"Ų";s:3:"挪";s:2:"ų";s:3:"懦";s:2:"Ŵ";s:3:"糯";s:2:"ŵ";s:3:"诺";s:2:"Ŷ";s:3:"哦";s:2:"ŷ";s:3:"欧";s:2:"Ÿ";s:3:"鸥";s:2:"Ź";s:3:"殴";s:2:"ź";s:3:"藕";s:2:"Ż";s:3:"呕";s:2:"ż";s:3:"偶";s:2:"Ž";s:3:"沤";s:2:"ž";s:3:"啪";s:2:"ſ";s:3:"趴";s:2:"";s:3:"爬";s:2:"";s:3:"帕";s:2:"";s:3:"怕";s:2:"";s:3:"琶";s:2:"";s:3:"拍";s:2:"";s:3:"排";s:2:"";s:3:"牌";s:2:"";s:3:"徘";s:2:"";s:3:"湃";s:2:"";s:3:"派";s:2:"";s:3:"攀";s:2:"";s:3:"潘";s:2:"";s:3:"盘";s:2:"";s:3:"磐";s:2:"";s:3:"盼";s:2:"";s:3:"畔";s:2:"";s:3:"判";s:2:"";s:3:"叛";s:2:"";s:3:"乓";s:2:"";s:3:"庞";s:2:"";s:3:"旁";s:2:"";s:3:"耪";s:2:"";s:3:"胖";s:2:"";s:3:"抛";s:2:"";s:3:"咆";s:2:"";s:3:"刨";s:2:"";s:3:"炮";s:2:"";s:3:"袍";s:2:"";s:3:"跑";s:2:"";s:3:"泡";s:2:"";s:3:"呸";s:2:"";s:3:"胚";s:2:"";s:3:"培";s:2:"";s:3:"裴";s:2:"";s:3:"赔";s:2:"";s:3:"陪";s:2:"";s:3:"配";s:2:"";s:3:"佩";s:2:"";s:3:"沛";s:2:"";s:3:"喷";s:2:"";s:3:"盆";s:2:"";s:3:"砰";s:2:"";s:3:"抨";s:2:"";s:3:"烹";s:2:"";s:3:"澎";s:2:"";s:3:"彭";s:2:"";s:3:"蓬";s:2:"";s:3:"棚";s:2:"";s:3:"硼";s:2:"";s:3:"篷";s:2:"";s:3:"膨";s:2:"";s:3:"朋";s:2:"";s:3:"鹏";s:2:"";s:3:"捧";s:2:"";s:3:"碰";s:2:"";s:3:"坯";s:2:"";s:3:"砒";s:2:"";s:3:"霹";s:2:"";s:3:"批";s:2:"";s:3:"披";s:2:"";s:3:"劈";s:2:"";s:3:"琵";s:2:"";s:3:"毗";s:2:"@";s:3:"艪";s:2:"A";s:3:"艫";s:2:"B";s:3:"艬";s:2:"C";s:3:"艭";s:2:"D";s:3:"艱";s:2:"E";s:3:"艵";s:2:"F";s:3:"艶";s:2:"G";s:3:"艷";s:2:"H";s:3:"艸";s:2:"I";s:3:"艻";s:2:"J";s:3:"艼";s:2:"K";s:3:"芀";s:2:"L";s:3:"芁";s:2:"M";s:3:"芃";s:2:"N";s:3:"芅";s:2:"O";s:3:"芆";s:2:"P";s:3:"芇";s:2:"Q";s:3:"芉";s:2:"R";s:3:"芌";s:2:"S";s:3:"芐";s:2:"T";s:3:"芓";s:2:"U";s:3:"芔";s:2:"V";s:3:"芕";s:2:"W";s:3:"芖";s:2:"X";s:3:"芚";s:2:"Y";s:3:"芛";s:2:"Z";s:3:"芞";s:2:"[";s:3:"芠";s:2:"\";s:3:"芢";s:2:"]";s:3:"芣";s:2:"^";s:3:"芧";s:2:"_";s:3:"芲";s:2:"`";s:3:"芵";s:2:"a";s:3:"芶";s:2:"b";s:3:"芺";s:2:"c";s:3:"芻";s:2:"d";s:3:"芼";s:2:"e";s:3:"芿";s:2:"f";s:3:"苀";s:2:"g";s:3:"苂";s:2:"h";s:3:"苃";s:2:"i";s:3:"苅";s:2:"j";s:3:"苆";s:2:"k";s:3:"苉";s:2:"l";s:3:"苐";s:2:"m";s:3:"苖";s:2:"n";s:3:"苙";s:2:"o";s:3:"苚";s:2:"p";s:3:"苝";s:2:"q";s:3:"苢";s:2:"r";s:3:"苧";s:2:"s";s:3:"苨";s:2:"t";s:3:"苩";s:2:"u";s:3:"苪";s:2:"v";s:3:"苬";s:2:"w";s:3:"苭";s:2:"x";s:3:"苮";s:2:"y";s:3:"苰";s:2:"z";s:3:"苲";s:2:"{";s:3:"苳";s:2:"|";s:3:"苵";s:2:"}";s:3:"苶";s:2:"~";s:3:"苸";s:2:"ƀ";s:3:"苺";s:2:"Ɓ";s:3:"苼";s:2:"Ƃ";s:3:"苽";s:2:"ƃ";s:3:"苾";s:2:"Ƅ";s:3:"苿";s:2:"ƅ";s:3:"茀";s:2:"Ɔ";s:3:"茊";s:2:"Ƈ";s:3:"茋";s:2:"ƈ";s:3:"茍";s:2:"Ɖ";s:3:"茐";s:2:"Ɗ";s:3:"茒";s:2:"Ƌ";s:3:"茓";s:2:"ƌ";s:3:"茖";s:2:"ƍ";s:3:"茘";s:2:"Ǝ";s:3:"茙";s:2:"Ə";s:3:"茝";s:2:"Ɛ";s:3:"茞";s:2:"Ƒ";s:3:"茟";s:2:"ƒ";s:3:"茠";s:2:"Ɠ";s:3:"茡";s:2:"Ɣ";s:3:"茢";s:2:"ƕ";s:3:"茣";s:2:"Ɩ";s:3:"茤";s:2:"Ɨ";s:3:"茥";s:2:"Ƙ";s:3:"茦";s:2:"ƙ";s:3:"茩";s:2:"ƚ";s:3:"茪";s:2:"ƛ";s:3:"茮";s:2:"Ɯ";s:3:"茰";s:2:"Ɲ";s:3:"茲";s:2:"ƞ";s:3:"茷";s:2:"Ɵ";s:3:"茻";s:2:"Ơ";s:3:"茽";s:2:"ơ";s:3:"啤";s:2:"Ƣ";s:3:"脾";s:2:"ƣ";s:3:"疲";s:2:"Ƥ";s:3:"皮";s:2:"ƥ";s:3:"匹";s:2:"Ʀ";s:3:"痞";s:2:"Ƨ";s:3:"僻";s:2:"ƨ";s:3:"屁";s:2:"Ʃ";s:3:"譬";s:2:"ƪ";s:3:"篇";s:2:"ƫ";s:3:"偏";s:2:"Ƭ";s:3:"片";s:2:"ƭ";s:3:"骗";s:2:"Ʈ";s:3:"飘";s:2:"Ư";s:3:"漂";s:2:"ư";s:3:"瓢";s:2:"Ʊ";s:3:"票";s:2:"Ʋ";s:3:"撇";s:2:"Ƴ";s:3:"瞥";s:2:"ƴ";s:3:"拼";s:2:"Ƶ";s:3:"频";s:2:"ƶ";s:3:"贫";s:2:"Ʒ";s:3:"品";s:2:"Ƹ";s:3:"聘";s:2:"ƹ";s:3:"乒";s:2:"ƺ";s:3:"坪";s:2:"ƻ";s:3:"苹";s:2:"Ƽ";s:3:"萍";s:2:"ƽ";s:3:"平";s:2:"ƾ";s:3:"凭";s:2:"ƿ";s:3:"瓶";s:2:"";s:3:"评";s:2:"";s:3:"屏";s:2:"";s:3:"坡";s:2:"";s:3:"泼";s:2:"";s:3:"颇";s:2:"";s:3:"婆";s:2:"";s:3:"破";s:2:"";s:3:"魄";s:2:"";s:3:"迫";s:2:"";s:3:"粕";s:2:"";s:3:"剖";s:2:"";s:3:"扑";s:2:"";s:3:"铺";s:2:"";s:3:"仆";s:2:"";s:3:"莆";s:2:"";s:3:"葡";s:2:"";s:3:"菩";s:2:"";s:3:"蒲";s:2:"";s:3:"埔";s:2:"";s:3:"朴";s:2:"";s:3:"圃";s:2:"";s:3:"普";s:2:"";s:3:"浦";s:2:"";s:3:"谱";s:2:"";s:3:"曝";s:2:"";s:3:"瀑";s:2:"";s:3:"期";s:2:"";s:3:"欺";s:2:"";s:3:"栖";s:2:"";s:3:"戚";s:2:"";s:3:"妻";s:2:"";s:3:"七";s:2:"";s:3:"凄";s:2:"";s:3:"漆";s:2:"";s:3:"柒";s:2:"";s:3:"沏";s:2:"";s:3:"其";s:2:"";s:3:"棋";s:2:"";s:3:"奇";s:2:"";s:3:"歧";s:2:"";s:3:"畦";s:2:"";s:3:"崎";s:2:"";s:3:"脐";s:2:"";s:3:"齐";s:2:"";s:3:"旗";s:2:"";s:3:"祈";s:2:"";s:3:"祁";s:2:"";s:3:"骑";s:2:"";s:3:"起";s:2:"";s:3:"岂";s:2:"";s:3:"乞";s:2:"";s:3:"企";s:2:"";s:3:"启";s:2:"";s:3:"契";s:2:"";s:3:"砌";s:2:"";s:3:"器";s:2:"";s:3:"气";s:2:"";s:3:"迄";s:2:"";s:3:"弃";s:2:"";s:3:"汽";s:2:"";s:3:"泣";s:2:"";s:3:"讫";s:2:"";s:3:"掐";s:2:"@";s:3:"茾";s:2:"A";s:3:"茿";s:2:"B";s:3:"荁";s:2:"C";s:3:"荂";s:2:"D";s:3:"荄";s:2:"E";s:3:"荅";s:2:"F";s:3:"荈";s:2:"G";s:3:"荊";s:2:"H";s:3:"荋";s:2:"I";s:3:"荌";s:2:"J";s:3:"荍";s:2:"K";s:3:"荎";s:2:"L";s:3:"荓";s:2:"M";s:3:"荕";s:2:"N";s:3:"荖";s:2:"O";s:3:"荗";s:2:"P";s:3:"荘";s:2:"Q";s:3:"荙";s:2:"R";s:3:"荝";s:2:"S";s:3:"荢";s:2:"T";s:3:"荰";s:2:"U";s:3:"荱";s:2:"V";s:3:"荲";s:2:"W";s:3:"荳";s:2:"X";s:3:"荴";s:2:"Y";s:3:"荵";s:2:"Z";s:3:"荶";s:2:"[";s:3:"荹";s:2:"\";s:3:"荺";s:2:"]";s:3:"荾";s:2:"^";s:3:"荿";s:2:"_";s:3:"莀";s:2:"`";s:3:"莁";s:2:"a";s:3:"莂";s:2:"b";s:3:"莃";s:2:"c";s:3:"莄";s:2:"d";s:3:"莇";s:2:"e";s:3:"莈";s:2:"f";s:3:"莊";s:2:"g";s:3:"莋";s:2:"h";s:3:"莌";s:2:"i";s:3:"莍";s:2:"j";s:3:"莏";s:2:"k";s:3:"莐";s:2:"l";s:3:"莑";s:2:"m";s:3:"莔";s:2:"n";s:3:"莕";s:2:"o";s:3:"莖";s:2:"p";s:3:"莗";s:2:"q";s:3:"莙";s:2:"r";s:3:"莚";s:2:"s";s:3:"莝";s:2:"t";s:3:"莟";s:2:"u";s:3:"莡";s:2:"v";s:3:"莢";s:2:"w";s:3:"莣";s:2:"x";s:3:"莤";s:2:"y";s:3:"莥";s:2:"z";s:3:"莦";s:2:"{";s:3:"莧";s:2:"|";s:3:"莬";s:2:"}";s:3:"莭";s:2:"~";s:3:"莮";s:2:"ǀ";s:3:"莯";s:2:"ǁ";s:3:"莵";s:2:"ǂ";s:3:"莻";s:2:"ǃ";s:3:"莾";s:2:"Ǆ";s:3:"莿";s:2:"ǅ";s:3:"菂";s:2:"ǆ";s:3:"菃";s:2:"Ǉ";s:3:"菄";s:2:"ǈ";s:3:"菆";s:2:"ǉ";s:3:"菈";s:2:"Ǌ";s:3:"菉";s:2:"ǋ";s:3:"菋";s:2:"ǌ";s:3:"菍";s:2:"Ǎ";s:3:"菎";s:2:"ǎ";s:3:"菐";s:2:"Ǐ";s:3:"菑";s:2:"ǐ";s:3:"菒";s:2:"Ǒ";s:3:"菓";s:2:"ǒ";s:3:"菕";s:2:"Ǔ";s:3:"菗";s:2:"ǔ";s:3:"菙";s:2:"Ǖ";s:3:"菚";s:2:"ǖ";s:3:"菛";s:2:"Ǘ";s:3:"菞";s:2:"ǘ";s:3:"菢";s:2:"Ǚ";s:3:"菣";s:2:"ǚ";s:3:"菤";s:2:"Ǜ";s:3:"菦";s:2:"ǜ";s:3:"菧";s:2:"ǝ";s:3:"菨";s:2:"Ǟ";s:3:"菫";s:2:"ǟ";s:3:"菬";s:2:"Ǡ";s:3:"菭";s:2:"ǡ";s:3:"恰";s:2:"Ǣ";s:3:"洽";s:2:"ǣ";s:3:"牵";s:2:"Ǥ";s:3:"扦";s:2:"ǥ";s:3:"钎";s:2:"Ǧ";s:3:"铅";s:2:"ǧ";s:3:"千";s:2:"Ǩ";s:3:"迁";s:2:"ǩ";s:3:"签";s:2:"Ǫ";s:3:"仟";s:2:"ǫ";s:3:"谦";s:2:"Ǭ";s:3:"乾";s:2:"ǭ";s:3:"黔";s:2:"Ǯ";s:3:"钱";s:2:"ǯ";s:3:"钳";s:2:"ǰ";s:3:"前";s:2:"Ǳ";s:3:"潜";s:2:"ǲ";s:3:"遣";s:2:"ǳ";s:3:"浅";s:2:"Ǵ";s:3:"谴";s:2:"ǵ";s:3:"堑";s:2:"Ƕ";s:3:"嵌";s:2:"Ƿ";s:3:"欠";s:2:"Ǹ";s:3:"歉";s:2:"ǹ";s:3:"枪";s:2:"Ǻ";s:3:"呛";s:2:"ǻ";s:3:"腔";s:2:"Ǽ";s:3:"羌";s:2:"ǽ";s:3:"墙";s:2:"Ǿ";s:3:"蔷";s:2:"ǿ";s:3:"强";s:2:"";s:3:"抢";s:2:"";s:3:"橇";s:2:"";s:3:"锹";s:2:"";s:3:"敲";s:2:"";s:3:"悄";s:2:"";s:3:"桥";s:2:"";s:3:"瞧";s:2:"";s:3:"乔";s:2:"";s:3:"侨";s:2:"";s:3:"巧";s:2:"";s:3:"鞘";s:2:"";s:3:"撬";s:2:"";s:3:"翘";s:2:"";s:3:"峭";s:2:"";s:3:"俏";s:2:"";s:3:"窍";s:2:"";s:3:"切";s:2:"";s:3:"茄";s:2:"";s:3:"且";s:2:"";s:3:"怯";s:2:"";s:3:"窃";s:2:"";s:3:"钦";s:2:"";s:3:"侵";s:2:"";s:3:"亲";s:2:"";s:3:"秦";s:2:"";s:3:"琴";s:2:"";s:3:"勤";s:2:"";s:3:"芹";s:2:"";s:3:"擒";s:2:"";s:3:"禽";s:2:"";s:3:"寝";s:2:"";s:3:"沁";s:2:"";s:3:"青";s:2:"";s:3:"轻";s:2:"";s:3:"氢";s:2:"";s:3:"倾";s:2:"";s:3:"卿";s:2:"";s:3:"清";s:2:"";s:3:"擎";s:2:"";s:3:"晴";s:2:"";s:3:"氰";s:2:"";s:3:"情";s:2:"";s:3:"顷";s:2:"";s:3:"请";s:2:"";s:3:"庆";s:2:"";s:3:"琼";s:2:"";s:3:"穷";s:2:"";s:3:"秋";s:2:"";s:3:"丘";s:2:"";s:3:"邱";s:2:"";s:3:"球";s:2:"";s:3:"求";s:2:"";s:3:"囚";s:2:"";s:3:"酋";s:2:"";s:3:"泅";s:2:"";s:3:"趋";s:2:"";s:3:"区";s:2:"";s:3:"蛆";s:2:"";s:3:"曲";s:2:"";s:3:"躯";s:2:"";s:3:"屈";s:2:"";s:3:"驱";s:2:"";s:3:"渠";s:2:"@";s:3:"菮";s:2:"A";s:3:"華";s:2:"B";s:3:"菳";s:2:"C";s:3:"菴";s:2:"D";s:3:"菵";s:2:"E";s:3:"菶";s:2:"F";s:3:"菷";s:2:"G";s:3:"菺";s:2:"H";s:3:"菻";s:2:"I";s:3:"菼";s:2:"J";s:3:"菾";s:2:"K";s:3:"菿";s:2:"L";s:3:"萀";s:2:"M";s:3:"萂";s:2:"N";s:3:"萅";s:2:"O";s:3:"萇";s:2:"P";s:3:"萈";s:2:"Q";s:3:"萉";s:2:"R";s:3:"萊";s:2:"S";s:3:"萐";s:2:"T";s:3:"萒";s:2:"U";s:3:"萓";s:2:"V";s:3:"萔";s:2:"W";s:3:"萕";s:2:"X";s:3:"萖";s:2:"Y";s:3:"萗";s:2:"Z";s:3:"萙";s:2:"[";s:3:"萚";s:2:"\";s:3:"萛";s:2:"]";s:3:"萞";s:2:"^";s:3:"萟";s:2:"_";s:3:"萠";s:2:"`";s:3:"萡";s:2:"a";s:3:"萢";s:2:"b";s:3:"萣";s:2:"c";s:3:"萩";s:2:"d";s:3:"萪";s:2:"e";s:3:"萫";s:2:"f";s:3:"萬";s:2:"g";s:3:"萭";s:2:"h";s:3:"萮";s:2:"i";s:3:"萯";s:2:"j";s:3:"萰";s:2:"k";s:3:"萲";s:2:"l";s:3:"萳";s:2:"m";s:3:"萴";s:2:"n";s:3:"萵";s:2:"o";s:3:"萶";s:2:"p";s:3:"萷";s:2:"q";s:3:"萹";s:2:"r";s:3:"萺";s:2:"s";s:3:"萻";s:2:"t";s:3:"萾";s:2:"u";s:3:"萿";s:2:"v";s:3:"葀";s:2:"w";s:3:"葁";s:2:"x";s:3:"葂";s:2:"y";s:3:"葃";s:2:"z";s:3:"葄";s:2:"{";s:3:"葅";s:2:"|";s:3:"葇";s:2:"}";s:3:"葈";s:2:"~";s:3:"葉";s:2:"Ȁ";s:3:"葊";s:2:"ȁ";s:3:"葋";s:2:"Ȃ";s:3:"葌";s:2:"ȃ";s:3:"葍";s:2:"Ȅ";s:3:"葎";s:2:"ȅ";s:3:"葏";s:2:"Ȇ";s:3:"葐";s:2:"ȇ";s:3:"葒";s:2:"Ȉ";s:3:"葓";s:2:"ȉ";s:3:"葔";s:2:"Ȋ";s:3:"葕";s:2:"ȋ";s:3:"葖";s:2:"Ȍ";s:3:"葘";s:2:"ȍ";s:3:"葝";s:2:"Ȏ";s:3:"葞";s:2:"ȏ";s:3:"葟";s:2:"Ȑ";s:3:"葠";s:2:"ȑ";s:3:"葢";s:2:"Ȓ";s:3:"葤";s:2:"ȓ";s:3:"葥";s:2:"Ȕ";s:3:"葦";s:2:"ȕ";s:3:"葧";s:2:"Ȗ";s:3:"葨";s:2:"ȗ";s:3:"葪";s:2:"Ș";s:3:"葮";s:2:"ș";s:3:"葯";s:2:"Ț";s:3:"葰";s:2:"ț";s:3:"葲";s:2:"Ȝ";s:3:"葴";s:2:"ȝ";s:3:"葷";s:2:"Ȟ";s:3:"葹";s:2:"ȟ";s:3:"葻";s:2:"Ƞ";s:3:"葼";s:2:"ȡ";s:3:"取";s:2:"Ȣ";s:3:"娶";s:2:"ȣ";s:3:"龋";s:2:"Ȥ";s:3:"趣";s:2:"ȥ";s:3:"去";s:2:"Ȧ";s:3:"圈";s:2:"ȧ";s:3:"颧";s:2:"Ȩ";s:3:"权";s:2:"ȩ";s:3:"醛";s:2:"Ȫ";s:3:"泉";s:2:"ȫ";s:3:"全";s:2:"Ȭ";s:3:"痊";s:2:"ȭ";s:3:"拳";s:2:"Ȯ";s:3:"犬";s:2:"ȯ";s:3:"券";s:2:"Ȱ";s:3:"劝";s:2:"ȱ";s:3:"缺";s:2:"Ȳ";s:3:"炔";s:2:"ȳ";s:3:"瘸";s:2:"ȴ";s:3:"却";s:2:"ȵ";s:3:"鹊";s:2:"ȶ";s:3:"榷";s:2:"ȷ";s:3:"确";s:2:"ȸ";s:3:"雀";s:2:"ȹ";s:3:"裙";s:2:"Ⱥ";s:3:"群";s:2:"Ȼ";s:3:"然";s:2:"ȼ";s:3:"燃";s:2:"Ƚ";s:3:"冉";s:2:"Ⱦ";s:3:"染";s:2:"ȿ";s:3:"瓤";s:2:"";s:3:"壤";s:2:"";s:3:"攘";s:2:"";s:3:"嚷";s:2:"";s:3:"让";s:2:"";s:3:"饶";s:2:"";s:3:"扰";s:2:"";s:3:"绕";s:2:"";s:3:"惹";s:2:"";s:3:"热";s:2:"";s:3:"壬";s:2:"";s:3:"仁";s:2:"";s:3:"人";s:2:"";s:3:"忍";s:2:"";s:3:"韧";s:2:"";s:3:"任";s:2:"";s:3:"认";s:2:"";s:3:"刃";s:2:"";s:3:"妊";s:2:"";s:3:"纫";s:2:"";s:3:"扔";s:2:"";s:3:"仍";s:2:"";s:3:"日";s:2:"";s:3:"戎";s:2:"";s:3:"茸";s:2:"";s:3:"蓉";s:2:"";s:3:"荣";s:2:"";s:3:"融";s:2:"";s:3:"熔";s:2:"";s:3:"溶";s:2:"";s:3:"容";s:2:"";s:3:"绒";s:2:"";s:3:"冗";s:2:"";s:3:"揉";s:2:"";s:3:"柔";s:2:"";s:3:"肉";s:2:"";s:3:"茹";s:2:"";s:3:"蠕";s:2:"";s:3:"儒";s:2:"";s:3:"孺";s:2:"";s:3:"如";s:2:"";s:3:"辱";s:2:"";s:3:"乳";s:2:"";s:3:"汝";s:2:"";s:3:"入";s:2:"";s:3:"褥";s:2:"";s:3:"软";s:2:"";s:3:"阮";s:2:"";s:3:"蕊";s:2:"";s:3:"瑞";s:2:"";s:3:"锐";s:2:"";s:3:"闰";s:2:"";s:3:"润";s:2:"";s:3:"若";s:2:"";s:3:"弱";s:2:"";s:3:"撒";s:2:"";s:3:"洒";s:2:"";s:3:"萨";s:2:"";s:3:"腮";s:2:"";s:3:"鳃";s:2:"";s:3:"塞";s:2:"";s:3:"赛";s:2:"";s:3:"三";s:2:"";s:3:"叁";s:2:"@";s:3:"葽";s:2:"A";s:3:"葾";s:2:"B";s:3:"葿";s:2:"C";s:3:"蒀";s:2:"D";s:3:"蒁";s:2:"E";s:3:"蒃";s:2:"F";s:3:"蒄";s:2:"G";s:3:"蒅";s:2:"H";s:3:"蒆";s:2:"I";s:3:"蒊";s:2:"J";s:3:"蒍";s:2:"K";s:3:"蒏";s:2:"L";s:3:"蒐";s:2:"M";s:3:"蒑";s:2:"N";s:3:"蒒";s:2:"O";s:3:"蒓";s:2:"P";s:3:"蒔";s:2:"Q";s:3:"蒕";s:2:"R";s:3:"蒖";s:2:"S";s:3:"蒘";s:2:"T";s:3:"蒚";s:2:"U";s:3:"蒛";s:2:"V";s:3:"蒝";s:2:"W";s:3:"蒞";s:2:"X";s:3:"蒟";s:2:"Y";s:3:"蒠";s:2:"Z";s:3:"蒢";s:2:"[";s:3:"蒣";s:2:"\";s:3:"蒤";s:2:"]";s:3:"蒥";s:2:"^";s:3:"蒦";s:2:"_";s:3:"蒧";s:2:"`";s:3:"蒨";s:2:"a";s:3:"蒩";s:2:"b";s:3:"蒪";s:2:"c";s:3:"蒫";s:2:"d";s:3:"蒬";s:2:"e";s:3:"蒭";s:2:"f";s:3:"蒮";s:2:"g";s:3:"蒰";s:2:"h";s:3:"蒱";s:2:"i";s:3:"蒳";s:2:"j";s:3:"蒵";s:2:"k";s:3:"蒶";s:2:"l";s:3:"蒷";s:2:"m";s:3:"蒻";s:2:"n";s:3:"蒼";s:2:"o";s:3:"蒾";s:2:"p";s:3:"蓀";s:2:"q";s:3:"蓂";s:2:"r";s:3:"蓃";s:2:"s";s:3:"蓅";s:2:"t";s:3:"蓆";s:2:"u";s:3:"蓇";s:2:"v";s:3:"蓈";s:2:"w";s:3:"蓋";s:2:"x";s:3:"蓌";s:2:"y";s:3:"蓎";s:2:"z";s:3:"蓏";s:2:"{";s:3:"蓒";s:2:"|";s:3:"蓔";s:2:"}";s:3:"蓕";s:2:"~";s:3:"蓗";s:2:"ɀ";s:3:"蓘";s:2:"Ɂ";s:3:"蓙";s:2:"ɂ";s:3:"蓚";s:2:"Ƀ";s:3:"蓛";s:2:"Ʉ";s:3:"蓜";s:2:"Ʌ";s:3:"蓞";s:2:"Ɇ";s:3:"蓡";s:2:"ɇ";s:3:"蓢";s:2:"Ɉ";s:3:"蓤";s:2:"ɉ";s:3:"蓧";s:2:"Ɋ";s:3:"蓨";s:2:"ɋ";s:3:"蓩";s:2:"Ɍ";s:3:"蓪";s:2:"ɍ";s:3:"蓫";s:2:"Ɏ";s:3:"蓭";s:2:"ɏ";s:3:"蓮";s:2:"ɐ";s:3:"蓯";s:2:"ɑ";s:3:"蓱";s:2:"ɒ";s:3:"蓲";s:2:"ɓ";s:3:"蓳";s:2:"ɔ";s:3:"蓴";s:2:"ɕ";s:3:"蓵";s:2:"ɖ";s:3:"蓶";s:2:"ɗ";s:3:"蓷";s:2:"ɘ";s:3:"蓸";s:2:"ə";s:3:"蓹";s:2:"ɚ";s:3:"蓺";s:2:"ɛ";s:3:"蓻";s:2:"ɜ";s:3:"蓽";s:2:"ɝ";s:3:"蓾";s:2:"ɞ";s:3:"蔀";s:2:"ɟ";s:3:"蔁";s:2:"ɠ";s:3:"蔂";s:2:"ɡ";s:3:"伞";s:2:"ɢ";s:3:"散";s:2:"ɣ";s:3:"桑";s:2:"ɤ";s:3:"嗓";s:2:"ɥ";s:3:"丧";s:2:"ɦ";s:3:"搔";s:2:"ɧ";s:3:"骚";s:2:"ɨ";s:3:"扫";s:2:"ɩ";s:3:"嫂";s:2:"ɪ";s:3:"瑟";s:2:"ɫ";s:3:"色";s:2:"ɬ";s:3:"涩";s:2:"ɭ";s:3:"森";s:2:"ɮ";s:3:"僧";s:2:"ɯ";s:3:"莎";s:2:"ɰ";s:3:"砂";s:2:"ɱ";s:3:"杀";s:2:"ɲ";s:3:"刹";s:2:"ɳ";s:3:"沙";s:2:"ɴ";s:3:"纱";s:2:"ɵ";s:3:"傻";s:2:"ɶ";s:3:"啥";s:2:"ɷ";s:3:"煞";s:2:"ɸ";s:3:"筛";s:2:"ɹ";s:3:"晒";s:2:"ɺ";s:3:"珊";s:2:"ɻ";s:3:"苫";s:2:"ɼ";s:3:"杉";s:2:"ɽ";s:3:"山";s:2:"ɾ";s:3:"删";s:2:"ɿ";s:3:"煽";s:2:"";s:3:"衫";s:2:"";s:3:"闪";s:2:"";s:3:"陕";s:2:"";s:3:"擅";s:2:"";s:3:"赡";s:2:"";s:3:"膳";s:2:"";s:3:"善";s:2:"";s:3:"汕";s:2:"";s:3:"扇";s:2:"";s:3:"缮";s:2:"";s:3:"墒";s:2:"";s:3:"伤";s:2:"";s:3:"商";s:2:"";s:3:"赏";s:2:"";s:3:"晌";s:2:"";s:3:"上";s:2:"";s:3:"尚";s:2:"";s:3:"裳";s:2:"";s:3:"梢";s:2:"";s:3:"捎";s:2:"";s:3:"稍";s:2:"";s:3:"烧";s:2:"";s:3:"芍";s:2:"";s:3:"勺";s:2:"";s:3:"韶";s:2:"";s:3:"少";s:2:"";s:3:"哨";s:2:"";s:3:"邵";s:2:"";s:3:"绍";s:2:"";s:3:"奢";s:2:"";s:3:"赊";s:2:"";s:3:"蛇";s:2:"";s:3:"舌";s:2:"";s:3:"舍";s:2:"";s:3:"赦";s:2:"";s:3:"摄";s:2:"";s:3:"射";s:2:"";s:3:"慑";s:2:"";s:3:"涉";s:2:"";s:3:"社";s:2:"";s:3:"设";s:2:"";s:3:"砷";s:2:"";s:3:"申";s:2:"";s:3:"呻";s:2:"";s:3:"伸";s:2:"";s:3:"身";s:2:"";s:3:"深";s:2:"";s:3:"娠";s:2:"";s:3:"绅";s:2:"";s:3:"神";s:2:"";s:3:"沈";s:2:"";s:3:"审";s:2:"";s:3:"婶";s:2:"";s:3:"甚";s:2:"";s:3:"肾";s:2:"";s:3:"慎";s:2:"";s:3:"渗";s:2:"";s:3:"声";s:2:"";s:3:"生";s:2:"";s:3:"甥";s:2:"";s:3:"牲";s:2:"";s:3:"升";s:2:"";s:3:"绳";s:2:"@";s:3:"蔃";s:2:"A";s:3:"蔄";s:2:"B";s:3:"蔅";s:2:"C";s:3:"蔆";s:2:"D";s:3:"蔇";s:2:"E";s:3:"蔈";s:2:"F";s:3:"蔉";s:2:"G";s:3:"蔊";s:2:"H";s:3:"蔋";s:2:"I";s:3:"蔍";s:2:"J";s:3:"蔎";s:2:"K";s:3:"蔏";s:2:"L";s:3:"蔐";s:2:"M";s:3:"蔒";s:2:"N";s:3:"蔔";s:2:"O";s:3:"蔕";s:2:"P";s:3:"蔖";s:2:"Q";s:3:"蔘";s:2:"R";s:3:"蔙";s:2:"S";s:3:"蔛";s:2:"T";s:3:"蔜";s:2:"U";s:3:"蔝";s:2:"V";s:3:"蔞";s:2:"W";s:3:"蔠";s:2:"X";s:3:"蔢";s:2:"Y";s:3:"蔣";s:2:"Z";s:3:"蔤";s:2:"[";s:3:"蔥";s:2:"\";s:3:"蔦";s:2:"]";s:3:"蔧";s:2:"^";s:3:"蔨";s:2:"_";s:3:"蔩";s:2:"`";s:3:"蔪";s:2:"a";s:3:"蔭";s:2:"b";s:3:"蔮";s:2:"c";s:3:"蔯";s:2:"d";s:3:"蔰";s:2:"e";s:3:"蔱";s:2:"f";s:3:"蔲";s:2:"g";s:3:"蔳";s:2:"h";s:3:"蔴";s:2:"i";s:3:"蔵";s:2:"j";s:3:"蔶";s:2:"k";s:3:"蔾";s:2:"l";s:3:"蔿";s:2:"m";s:3:"蕀";s:2:"n";s:3:"蕁";s:2:"o";s:3:"蕂";s:2:"p";s:3:"蕄";s:2:"q";s:3:"蕅";s:2:"r";s:3:"蕆";s:2:"s";s:3:"蕇";s:2:"t";s:3:"蕋";s:2:"u";s:3:"蕌";s:2:"v";s:3:"蕍";s:2:"w";s:3:"蕎";s:2:"x";s:3:"蕏";s:2:"y";s:3:"蕐";s:2:"z";s:3:"蕑";s:2:"{";s:3:"蕒";s:2:"|";s:3:"蕓";s:2:"}";s:3:"蕔";s:2:"~";s:3:"蕕";s:2:"ʀ";s:3:"蕗";s:2:"ʁ";s:3:"蕘";s:2:"ʂ";s:3:"蕚";s:2:"ʃ";s:3:"蕛";s:2:"ʄ";s:3:"蕜";s:2:"ʅ";s:3:"蕝";s:2:"ʆ";s:3:"蕟";s:2:"ʇ";s:3:"蕠";s:2:"ʈ";s:3:"蕡";s:2:"ʉ";s:3:"蕢";s:2:"ʊ";s:3:"蕣";s:2:"ʋ";s:3:"蕥";s:2:"ʌ";s:3:"蕦";s:2:"ʍ";s:3:"蕧";s:2:"ʎ";s:3:"蕩";s:2:"ʏ";s:3:"蕪";s:2:"ʐ";s:3:"蕫";s:2:"ʑ";s:3:"蕬";s:2:"ʒ";s:3:"蕭";s:2:"ʓ";s:3:"蕮";s:2:"ʔ";s:3:"蕯";s:2:"ʕ";s:3:"蕰";s:2:"ʖ";s:3:"蕱";s:2:"ʗ";s:3:"蕳";s:2:"ʘ";s:3:"蕵";s:2:"ʙ";s:3:"蕶";s:2:"ʚ";s:3:"蕷";s:2:"ʛ";s:3:"蕸";s:2:"ʜ";s:3:"蕼";s:2:"ʝ";s:3:"蕽";s:2:"ʞ";s:3:"蕿";s:2:"ʟ";s:3:"薀";s:2:"ʠ";s:3:"薁";s:2:"ʡ";s:3:"省";s:2:"ʢ";s:3:"盛";s:2:"ʣ";s:3:"剩";s:2:"ʤ";s:3:"胜";s:2:"ʥ";s:3:"圣";s:2:"ʦ";s:3:"师";s:2:"ʧ";s:3:"失";s:2:"ʨ";s:3:"狮";s:2:"ʩ";s:3:"施";s:2:"ʪ";s:3:"湿";s:2:"ʫ";s:3:"诗";s:2:"ʬ";s:3:"尸";s:2:"ʭ";s:3:"虱";s:2:"ʮ";s:3:"十";s:2:"ʯ";s:3:"石";s:2:"ʰ";s:3:"拾";s:2:"ʱ";s:3:"时";s:2:"ʲ";s:3:"什";s:2:"ʳ";s:3:"食";s:2:"ʴ";s:3:"蚀";s:2:"ʵ";s:3:"实";s:2:"ʶ";s:3:"识";s:2:"ʷ";s:3:"史";s:2:"ʸ";s:3:"矢";s:2:"ʹ";s:3:"使";s:2:"ʺ";s:3:"屎";s:2:"ʻ";s:3:"驶";s:2:"ʼ";s:3:"始";s:2:"ʽ";s:3:"式";s:2:"ʾ";s:3:"示";s:2:"ʿ";s:3:"士";s:2:"";s:3:"世";s:2:"";s:3:"柿";s:2:"";s:3:"事";s:2:"";s:3:"拭";s:2:"";s:3:"誓";s:2:"";s:3:"逝";s:2:"";s:3:"势";s:2:"";s:3:"是";s:2:"";s:3:"嗜";s:2:"";s:3:"噬";s:2:"";s:3:"适";s:2:"";s:3:"仕";s:2:"";s:3:"侍";s:2:"";s:3:"释";s:2:"";s:3:"饰";s:2:"";s:3:"氏";s:2:"";s:3:"市";s:2:"";s:3:"恃";s:2:"";s:3:"室";s:2:"";s:3:"视";s:2:"";s:3:"试";s:2:"";s:3:"收";s:2:"";s:3:"手";s:2:"";s:3:"首";s:2:"";s:3:"守";s:2:"";s:3:"寿";s:2:"";s:3:"授";s:2:"";s:3:"售";s:2:"";s:3:"受";s:2:"";s:3:"瘦";s:2:"";s:3:"兽";s:2:"";s:3:"蔬";s:2:"";s:3:"枢";s:2:"";s:3:"梳";s:2:"";s:3:"殊";s:2:"";s:3:"抒";s:2:"";s:3:"输";s:2:"";s:3:"叔";s:2:"";s:3:"舒";s:2:"";s:3:"淑";s:2:"";s:3:"疏";s:2:"";s:3:"书";s:2:"";s:3:"赎";s:2:"";s:3:"孰";s:2:"";s:3:"熟";s:2:"";s:3:"薯";s:2:"";s:3:"暑";s:2:"";s:3:"曙";s:2:"";s:3:"署";s:2:"";s:3:"蜀";s:2:"";s:3:"黍";s:2:"";s:3:"鼠";s:2:"";s:3:"属";s:2:"";s:3:"术";s:2:"";s:3:"述";s:2:"";s:3:"树";s:2:"";s:3:"束";s:2:"";s:3:"戍";s:2:"";s:3:"竖";s:2:"";s:3:"墅";s:2:"";s:3:"庶";s:2:"";s:3:"数";s:2:"";s:3:"漱";s:2:"@";s:3:"薂";s:2:"A";s:3:"薃";s:2:"B";s:3:"薆";s:2:"C";s:3:"薈";s:2:"D";s:3:"薉";s:2:"E";s:3:"薊";s:2:"F";s:3:"薋";s:2:"G";s:3:"薌";s:2:"H";s:3:"薍";s:2:"I";s:3:"薎";s:2:"J";s:3:"薐";s:2:"K";s:3:"薑";s:2:"L";s:3:"薒";s:2:"M";s:3:"薓";s:2:"N";s:3:"薔";s:2:"O";s:3:"薕";s:2:"P";s:3:"薖";s:2:"Q";s:3:"薗";s:2:"R";s:3:"薘";s:2:"S";s:3:"薙";s:2:"T";s:3:"薚";s:2:"U";s:3:"薝";s:2:"V";s:3:"薞";s:2:"W";s:3:"薟";s:2:"X";s:3:"薠";s:2:"Y";s:3:"薡";s:2:"Z";s:3:"薢";s:2:"[";s:3:"薣";s:2:"\";s:3:"薥";s:2:"]";s:3:"薦";s:2:"^";s:3:"薧";s:2:"_";s:3:"薩";s:2:"`";s:3:"薫";s:2:"a";s:3:"薬";s:2:"b";s:3:"薭";s:2:"c";s:3:"薱";s:2:"d";s:3:"薲";s:2:"e";s:3:"薳";s:2:"f";s:3:"薴";s:2:"g";s:3:"薵";s:2:"h";s:3:"薶";s:2:"i";s:3:"薸";s:2:"j";s:3:"薺";s:2:"k";s:3:"薻";s:2:"l";s:3:"薼";s:2:"m";s:3:"薽";s:2:"n";s:3:"薾";s:2:"o";s:3:"薿";s:2:"p";s:3:"藀";s:2:"q";s:3:"藂";s:2:"r";s:3:"藃";s:2:"s";s:3:"藄";s:2:"t";s:3:"藅";s:2:"u";s:3:"藆";s:2:"v";s:3:"藇";s:2:"w";s:3:"藈";s:2:"x";s:3:"藊";s:2:"y";s:3:"藋";s:2:"z";s:3:"藌";s:2:"{";s:3:"藍";s:2:"|";s:3:"藎";s:2:"}";s:3:"藑";s:2:"~";s:3:"藒";s:2:"ˀ";s:3:"藔";s:2:"ˁ";s:3:"藖";s:2:"˂";s:3:"藗";s:2:"˃";s:3:"藘";s:2:"˄";s:3:"藙";s:2:"˅";s:3:"藚";s:2:"ˆ";s:3:"藛";s:2:"ˇ";s:3:"藝";s:2:"ˈ";s:3:"藞";s:2:"ˉ";s:3:"藟";s:2:"ˊ";s:3:"藠";s:2:"ˋ";s:3:"藡";s:2:"ˌ";s:3:"藢";s:2:"ˍ";s:3:"藣";s:2:"ˎ";s:3:"藥";s:2:"ˏ";s:3:"藦";s:2:"ː";s:3:"藧";s:2:"ˑ";s:3:"藨";s:2:"˒";s:3:"藪";s:2:"˓";s:3:"藫";s:2:"˔";s:3:"藬";s:2:"˕";s:3:"藭";s:2:"˖";s:3:"藮";s:2:"˗";s:3:"藯";s:2:"˘";s:3:"藰";s:2:"˙";s:3:"藱";s:2:"˚";s:3:"藲";s:2:"˛";s:3:"藳";s:2:"˜";s:3:"藴";s:2:"˝";s:3:"藵";s:2:"˞";s:3:"藶";s:2:"˟";s:3:"藷";s:2:"ˠ";s:3:"藸";s:2:"ˡ";s:3:"恕";s:2:"ˢ";s:3:"刷";s:2:"ˣ";s:3:"耍";s:2:"ˤ";s:3:"摔";s:2:"˥";s:3:"衰";s:2:"˦";s:3:"甩";s:2:"˧";s:3:"帅";s:2:"˨";s:3:"栓";s:2:"˩";s:3:"拴";s:2:"˪";s:3:"霜";s:2:"˫";s:3:"双";s:2:"ˬ";s:3:"爽";s:2:"˭";s:3:"谁";s:2:"ˮ";s:3:"水";s:2:"˯";s:3:"睡";s:2:"˰";s:3:"税";s:2:"˱";s:3:"吮";s:2:"˲";s:3:"瞬";s:2:"˳";s:3:"顺";s:2:"˴";s:3:"舜";s:2:"˵";s:3:"说";s:2:"˶";s:3:"硕";s:2:"˷";s:3:"朔";s:2:"˸";s:3:"烁";s:2:"˹";s:3:"斯";s:2:"˺";s:3:"撕";s:2:"˻";s:3:"嘶";s:2:"˼";s:3:"思";s:2:"˽";s:3:"私";s:2:"˾";s:3:"司";s:2:"˿";s:3:"丝";s:2:"";s:3:"死";s:2:"";s:3:"肆";s:2:"";s:3:"寺";s:2:"";s:3:"嗣";s:2:"";s:3:"四";s:2:"";s:3:"伺";s:2:"";s:3:"似";s:2:"";s:3:"饲";s:2:"";s:3:"巳";s:2:"";s:3:"松";s:2:"";s:3:"耸";s:2:"";s:3:"怂";s:2:"";s:3:"颂";s:2:"";s:3:"送";s:2:"";s:3:"宋";s:2:"";s:3:"讼";s:2:"";s:3:"诵";s:2:"";s:3:"搜";s:2:"";s:3:"艘";s:2:"";s:3:"擞";s:2:"";s:3:"嗽";s:2:"";s:3:"苏";s:2:"";s:3:"酥";s:2:"";s:3:"俗";s:2:"";s:3:"素";s:2:"";s:3:"速";s:2:"";s:3:"粟";s:2:"";s:3:"僳";s:2:"";s:3:"塑";s:2:"";s:3:"溯";s:2:"";s:3:"宿";s:2:"";s:3:"诉";s:2:"";s:3:"肃";s:2:"";s:3:"酸";s:2:"";s:3:"蒜";s:2:"";s:3:"算";s:2:"";s:3:"虽";s:2:"";s:3:"隋";s:2:"";s:3:"随";s:2:"";s:3:"绥";s:2:"";s:3:"髓";s:2:"";s:3:"碎";s:2:"";s:3:"岁";s:2:"";s:3:"穗";s:2:"";s:3:"遂";s:2:"";s:3:"隧";s:2:"";s:3:"祟";s:2:"";s:3:"孙";s:2:"";s:3:"损";s:2:"";s:3:"笋";s:2:"";s:3:"蓑";s:2:"";s:3:"梭";s:2:"";s:3:"唆";s:2:"";s:3:"缩";s:2:"";s:3:"琐";s:2:"";s:3:"索";s:2:"";s:3:"锁";s:2:"";s:3:"所";s:2:"";s:3:"塌";s:2:"";s:3:"他";s:2:"";s:3:"它";s:2:"";s:3:"她";s:2:"";s:3:"塔";s:2:"@";s:3:"藹";s:2:"A";s:3:"藺";s:2:"B";s:3:"藼";s:2:"C";s:3:"藽";s:2:"D";s:3:"藾";s:2:"E";s:3:"蘀";s:2:"F";s:3:"蘁";s:2:"G";s:3:"蘂";s:2:"H";s:3:"蘃";s:2:"I";s:3:"蘄";s:2:"J";s:3:"蘆";s:2:"K";s:3:"蘇";s:2:"L";s:3:"蘈";s:2:"M";s:3:"蘉";s:2:"N";s:3:"蘊";s:2:"O";s:3:"蘋";s:2:"P";s:3:"蘌";s:2:"Q";s:3:"蘍";s:2:"R";s:3:"蘎";s:2:"S";s:3:"蘏";s:2:"T";s:3:"蘐";s:2:"U";s:3:"蘒";s:2:"V";s:3:"蘓";s:2:"W";s:3:"蘔";s:2:"X";s:3:"蘕";s:2:"Y";s:3:"蘗";s:2:"Z";s:3:"蘘";s:2:"[";s:3:"蘙";s:2:"\";s:3:"蘚";s:2:"]";s:3:"蘛";s:2:"^";s:3:"蘜";s:2:"_";s:3:"蘝";s:2:"`";s:3:"蘞";s:2:"a";s:3:"蘟";s:2:"b";s:3:"蘠";s:2:"c";s:3:"蘡";s:2:"d";s:3:"蘢";s:2:"e";s:3:"蘣";s:2:"f";s:3:"蘤";s:2:"g";s:3:"蘥";s:2:"h";s:3:"蘦";s:2:"i";s:3:"蘨";s:2:"j";s:3:"蘪";s:2:"k";s:3:"蘫";s:2:"l";s:3:"蘬";s:2:"m";s:3:"蘭";s:2:"n";s:3:"蘮";s:2:"o";s:3:"蘯";s:2:"p";s:3:"蘰";s:2:"q";s:3:"蘱";s:2:"r";s:3:"蘲";s:2:"s";s:3:"蘳";s:2:"t";s:3:"蘴";s:2:"u";s:3:"蘵";s:2:"v";s:3:"蘶";s:2:"w";s:3:"蘷";s:2:"x";s:3:"蘹";s:2:"y";s:3:"蘺";s:2:"z";s:3:"蘻";s:2:"{";s:3:"蘽";s:2:"|";s:3:"蘾";s:2:"}";s:3:"蘿";s:2:"~";s:3:"虀";s:2:"̀";s:3:"虁";s:2:"́";s:3:"虂";s:2:"̂";s:3:"虃";s:2:"̃";s:3:"虄";s:2:"̄";s:3:"虅";s:2:"̅";s:3:"虆";s:2:"̆";s:3:"虇";s:2:"̇";s:3:"虈";s:2:"̈";s:3:"虉";s:2:"̉";s:3:"虊";s:2:"̊";s:3:"虋";s:2:"̋";s:3:"虌";s:2:"̌";s:3:"虒";s:2:"̍";s:3:"虓";s:2:"̎";s:3:"處";s:2:"̏";s:3:"虖";s:2:"̐";s:3:"虗";s:2:"̑";s:3:"虘";s:2:"̒";s:3:"虙";s:2:"̓";s:3:"虛";s:2:"̔";s:3:"虜";s:2:"̕";s:3:"虝";s:2:"̖";s:3:"號";s:2:"̗";s:3:"虠";s:2:"̘";s:3:"虡";s:2:"̙";s:3:"虣";s:2:"̚";s:3:"虤";s:2:"̛";s:3:"虥";s:2:"̜";s:3:"虦";s:2:"̝";s:3:"虧";s:2:"̞";s:3:"虨";s:2:"̟";s:3:"虩";s:2:"̠";s:3:"虪";s:2:"̡";s:3:"獭";s:2:"̢";s:3:"挞";s:2:"̣";s:3:"蹋";s:2:"̤";s:3:"踏";s:2:"̥";s:3:"胎";s:2:"̦";s:3:"苔";s:2:"̧";s:3:"抬";s:2:"̨";s:3:"台";s:2:"̩";s:3:"泰";s:2:"̪";s:3:"酞";s:2:"̫";s:3:"太";s:2:"̬";s:3:"态";s:2:"̭";s:3:"汰";s:2:"̮";s:3:"坍";s:2:"̯";s:3:"摊";s:2:"̰";s:3:"贪";s:2:"̱";s:3:"瘫";s:2:"̲";s:3:"滩";s:2:"̳";s:3:"坛";s:2:"̴";s:3:"檀";s:2:"̵";s:3:"痰";s:2:"̶";s:3:"潭";s:2:"̷";s:3:"谭";s:2:"̸";s:3:"谈";s:2:"̹";s:3:"坦";s:2:"̺";s:3:"毯";s:2:"̻";s:3:"袒";s:2:"̼";s:3:"碳";s:2:"̽";s:3:"探";s:2:"̾";s:3:"叹";s:2:"̿";s:3:"炭";s:2:"";s:3:"汤";s:2:"";s:3:"塘";s:2:"";s:3:"搪";s:2:"";s:3:"堂";s:2:"";s:3:"棠";s:2:"";s:3:"膛";s:2:"";s:3:"唐";s:2:"";s:3:"糖";s:2:"";s:3:"倘";s:2:"";s:3:"躺";s:2:"";s:3:"淌";s:2:"";s:3:"趟";s:2:"";s:3:"烫";s:2:"";s:3:"掏";s:2:"";s:3:"涛";s:2:"";s:3:"滔";s:2:"";s:3:"绦";s:2:"";s:3:"萄";s:2:"";s:3:"桃";s:2:"";s:3:"逃";s:2:"";s:3:"淘";s:2:"";s:3:"陶";s:2:"";s:3:"讨";s:2:"";s:3:"套";s:2:"";s:3:"特";s:2:"";s:3:"藤";s:2:"";s:3:"腾";s:2:"";s:3:"疼";s:2:"";s:3:"誊";s:2:"";s:3:"梯";s:2:"";s:3:"剔";s:2:"";s:3:"踢";s:2:"";s:3:"锑";s:2:"";s:3:"提";s:2:"";s:3:"题";s:2:"";s:3:"蹄";s:2:"";s:3:"啼";s:2:"";s:3:"体";s:2:"";s:3:"替";s:2:"";s:3:"嚏";s:2:"";s:3:"惕";s:2:"";s:3:"涕";s:2:"";s:3:"剃";s:2:"";s:3:"屉";s:2:"";s:3:"天";s:2:"";s:3:"添";s:2:"";s:3:"填";s:2:"";s:3:"田";s:2:"";s:3:"甜";s:2:"";s:3:"恬";s:2:"";s:3:"舔";s:2:"";s:3:"腆";s:2:"";s:3:"挑";s:2:"";s:3:"条";s:2:"";s:3:"迢";s:2:"";s:3:"眺";s:2:"";s:3:"跳";s:2:"";s:3:"贴";s:2:"";s:3:"铁";s:2:"";s:3:"帖";s:2:"";s:3:"厅";s:2:"";s:3:"听";s:2:"";s:3:"烃";s:2:"@";s:3:"虭";s:2:"A";s:3:"虯";s:2:"B";s:3:"虰";s:2:"C";s:3:"虲";s:2:"D";s:3:"虳";s:2:"E";s:3:"虴";s:2:"F";s:3:"虵";s:2:"G";s:3:"虶";s:2:"H";s:3:"虷";s:2:"I";s:3:"虸";s:2:"J";s:3:"蚃";s:2:"K";s:3:"蚄";s:2:"L";s:3:"蚅";s:2:"M";s:3:"蚆";s:2:"N";s:3:"蚇";s:2:"O";s:3:"蚈";s:2:"P";s:3:"蚉";s:2:"Q";s:3:"蚎";s:2:"R";s:3:"蚏";s:2:"S";s:3:"蚐";s:2:"T";s:3:"蚑";s:2:"U";s:3:"蚒";s:2:"V";s:3:"蚔";s:2:"W";s:3:"蚖";s:2:"X";s:3:"蚗";s:2:"Y";s:3:"蚘";s:2:"Z";s:3:"蚙";s:2:"[";s:3:"蚚";s:2:"\";s:3:"蚛";s:2:"]";s:3:"蚞";s:2:"^";s:3:"蚟";s:2:"_";s:3:"蚠";s:2:"`";s:3:"蚡";s:2:"a";s:3:"蚢";s:2:"b";s:3:"蚥";s:2:"c";s:3:"蚦";s:2:"d";s:3:"蚫";s:2:"e";s:3:"蚭";s:2:"f";s:3:"蚮";s:2:"g";s:3:"蚲";s:2:"h";s:3:"蚳";s:2:"i";s:3:"蚷";s:2:"j";s:3:"蚸";s:2:"k";s:3:"蚹";s:2:"l";s:3:"蚻";s:2:"m";s:3:"蚼";s:2:"n";s:3:"蚽";s:2:"o";s:3:"蚾";s:2:"p";s:3:"蚿";s:2:"q";s:3:"蛁";s:2:"r";s:3:"蛂";s:2:"s";s:3:"蛃";s:2:"t";s:3:"蛅";s:2:"u";s:3:"蛈";s:2:"v";s:3:"蛌";s:2:"w";s:3:"蛍";s:2:"x";s:3:"蛒";s:2:"y";s:3:"蛓";s:2:"z";s:3:"蛕";s:2:"{";s:3:"蛖";s:2:"|";s:3:"蛗";s:2:"}";s:3:"蛚";s:2:"~";s:3:"蛜";s:2:"̀";s:3:"蛝";s:2:"́";s:3:"蛠";s:2:"͂";s:3:"蛡";s:2:"̓";s:3:"蛢";s:2:"̈́";s:3:"蛣";s:2:"ͅ";s:3:"蛥";s:2:"͆";s:3:"蛦";s:2:"͇";s:3:"蛧";s:2:"͈";s:3:"蛨";s:2:"͉";s:3:"蛪";s:2:"͊";s:3:"蛫";s:2:"͋";s:3:"蛬";s:2:"͌";s:3:"蛯";s:2:"͍";s:3:"蛵";s:2:"͎";s:3:"蛶";s:2:"͏";s:3:"蛷";s:2:"͐";s:3:"蛺";s:2:"͑";s:3:"蛻";s:2:"͒";s:3:"蛼";s:2:"͓";s:3:"蛽";s:2:"͔";s:3:"蛿";s:2:"͕";s:3:"蜁";s:2:"͖";s:3:"蜄";s:2:"͗";s:3:"蜅";s:2:"͘";s:3:"蜆";s:2:"͙";s:3:"蜋";s:2:"͚";s:3:"蜌";s:2:"͛";s:3:"蜎";s:2:"͜";s:3:"蜏";s:2:"͝";s:3:"蜐";s:2:"͞";s:3:"蜑";s:2:"͟";s:3:"蜔";s:2:"͠";s:3:"蜖";s:2:"͡";s:3:"汀";s:2:"͢";s:3:"廷";s:2:"ͣ";s:3:"停";s:2:"ͤ";s:3:"亭";s:2:"ͥ";s:3:"庭";s:2:"ͦ";s:3:"挺";s:2:"ͧ";s:3:"艇";s:2:"ͨ";s:3:"通";s:2:"ͩ";s:3:"桐";s:2:"ͪ";s:3:"酮";s:2:"ͫ";s:3:"瞳";s:2:"ͬ";s:3:"同";s:2:"ͭ";s:3:"铜";s:2:"ͮ";s:3:"彤";s:2:"ͯ";s:3:"童";s:2:"Ͱ";s:3:"桶";s:2:"ͱ";s:3:"捅";s:2:"Ͳ";s:3:"筒";s:2:"ͳ";s:3:"统";s:2:"ʹ";s:3:"痛";s:2:"͵";s:3:"偷";s:2:"Ͷ";s:3:"投";s:2:"ͷ";s:3:"头";s:2:"͸";s:3:"透";s:2:"͹";s:3:"凸";s:2:"ͺ";s:3:"秃";s:2:"ͻ";s:3:"突";s:2:"ͼ";s:3:"图";s:2:"ͽ";s:3:"徒";s:2:";";s:3:"途";s:2:"Ϳ";s:3:"涂";s:2:"";s:3:"屠";s:2:"";s:3:"土";s:2:"";s:3:"吐";s:2:"";s:3:"兔";s:2:"";s:3:"湍";s:2:"";s:3:"团";s:2:"";s:3:"推";s:2:"";s:3:"颓";s:2:"";s:3:"腿";s:2:"";s:3:"蜕";s:2:"";s:3:"褪";s:2:"";s:3:"退";s:2:"";s:3:"吞";s:2:"";s:3:"屯";s:2:"";s:3:"臀";s:2:"";s:3:"拖";s:2:"";s:3:"托";s:2:"";s:3:"脱";s:2:"";s:3:"鸵";s:2:"";s:3:"陀";s:2:"";s:3:"驮";s:2:"";s:3:"驼";s:2:"";s:3:"椭";s:2:"";s:3:"妥";s:2:"";s:3:"拓";s:2:"";s:3:"唾";s:2:"";s:3:"挖";s:2:"";s:3:"哇";s:2:"";s:3:"蛙";s:2:"";s:3:"洼";s:2:"";s:3:"娃";s:2:"";s:3:"瓦";s:2:"";s:3:"袜";s:2:"";s:3:"歪";s:2:"";s:3:"外";s:2:"";s:3:"豌";s:2:"";s:3:"弯";s:2:"";s:3:"湾";s:2:"";s:3:"玩";s:2:"";s:3:"顽";s:2:"";s:3:"丸";s:2:"";s:3:"烷";s:2:"";s:3:"完";s:2:"";s:3:"碗";s:2:"";s:3:"挽";s:2:"";s:3:"晚";s:2:"";s:3:"皖";s:2:"";s:3:"惋";s:2:"";s:3:"宛";s:2:"";s:3:"婉";s:2:"";s:3:"万";s:2:"";s:3:"腕";s:2:"";s:3:"汪";s:2:"";s:3:"王";s:2:"";s:3:"亡";s:2:"";s:3:"枉";s:2:"";s:3:"网";s:2:"";s:3:"往";s:2:"";s:3:"旺";s:2:"";s:3:"望";s:2:"";s:3:"忘";s:2:"";s:3:"妄";s:2:"";s:3:"威";s:2:"@";s:3:"蜙";s:2:"A";s:3:"蜛";s:2:"B";s:3:"蜝";s:2:"C";s:3:"蜟";s:2:"D";s:3:"蜠";s:2:"E";s:3:"蜤";s:2:"F";s:3:"蜦";s:2:"G";s:3:"蜧";s:2:"H";s:3:"蜨";s:2:"I";s:3:"蜪";s:2:"J";s:3:"蜫";s:2:"K";s:3:"蜬";s:2:"L";s:3:"蜭";s:2:"M";s:3:"蜯";s:2:"N";s:3:"蜰";s:2:"O";s:3:"蜲";s:2:"P";s:3:"蜳";s:2:"Q";s:3:"蜵";s:2:"R";s:3:"蜶";s:2:"S";s:3:"蜸";s:2:"T";s:3:"蜹";s:2:"U";s:3:"蜺";s:2:"V";s:3:"蜼";s:2:"W";s:3:"蜽";s:2:"X";s:3:"蝀";s:2:"Y";s:3:"蝁";s:2:"Z";s:3:"蝂";s:2:"[";s:3:"蝃";s:2:"\";s:3:"蝄";s:2:"]";s:3:"蝅";s:2:"^";s:3:"蝆";s:2:"_";s:3:"蝊";s:2:"`";s:3:"蝋";s:2:"a";s:3:"蝍";s:2:"b";s:3:"蝏";s:2:"c";s:3:"蝐";s:2:"d";s:3:"蝑";s:2:"e";s:3:"蝒";s:2:"f";s:3:"蝔";s:2:"g";s:3:"蝕";s:2:"h";s:3:"蝖";s:2:"i";s:3:"蝘";s:2:"j";s:3:"蝚";s:2:"k";s:3:"蝛";s:2:"l";s:3:"蝜";s:2:"m";s:3:"蝝";s:2:"n";s:3:"蝞";s:2:"o";s:3:"蝟";s:2:"p";s:3:"蝡";s:2:"q";s:3:"蝢";s:2:"r";s:3:"蝦";s:2:"s";s:3:"蝧";s:2:"t";s:3:"蝨";s:2:"u";s:3:"蝩";s:2:"v";s:3:"蝪";s:2:"w";s:3:"蝫";s:2:"x";s:3:"蝬";s:2:"y";s:3:"蝭";s:2:"z";s:3:"蝯";s:2:"{";s:3:"蝱";s:2:"|";s:3:"蝲";s:2:"}";s:3:"蝳";s:2:"~";s:3:"蝵";s:2:"΀";s:3:"蝷";s:2:"΁";s:3:"蝸";s:2:"΂";s:3:"蝹";s:2:"΃";s:3:"蝺";s:2:"΄";s:3:"蝿";s:2:"΅";s:3:"螀";s:2:"Ά";s:3:"螁";s:2:"·";s:3:"螄";s:2:"Έ";s:3:"螆";s:2:"Ή";s:3:"螇";s:2:"Ί";s:3:"螉";s:2:"΋";s:3:"螊";s:2:"Ό";s:3:"螌";s:2:"΍";s:3:"螎";s:2:"Ύ";s:3:"螏";s:2:"Ώ";s:3:"螐";s:2:"ΐ";s:3:"螑";s:2:"Α";s:3:"螒";s:2:"Β";s:3:"螔";s:2:"Γ";s:3:"螕";s:2:"Δ";s:3:"螖";s:2:"Ε";s:3:"螘";s:2:"Ζ";s:3:"螙";s:2:"Η";s:3:"螚";s:2:"Θ";s:3:"螛";s:2:"Ι";s:3:"螜";s:2:"Κ";s:3:"螝";s:2:"Λ";s:3:"螞";s:2:"Μ";s:3:"螠";s:2:"Ν";s:3:"螡";s:2:"Ξ";s:3:"螢";s:2:"Ο";s:3:"螣";s:2:"Π";s:3:"螤";s:2:"Ρ";s:3:"巍";s:2:"΢";s:3:"微";s:2:"Σ";s:3:"危";s:2:"Τ";s:3:"韦";s:2:"Υ";s:3:"违";s:2:"Φ";s:3:"桅";s:2:"Χ";s:3:"围";s:2:"Ψ";s:3:"唯";s:2:"Ω";s:3:"惟";s:2:"Ϊ";s:3:"为";s:2:"Ϋ";s:3:"潍";s:2:"ά";s:3:"维";s:2:"έ";s:3:"苇";s:2:"ή";s:3:"萎";s:2:"ί";s:3:"委";s:2:"ΰ";s:3:"伟";s:2:"α";s:3:"伪";s:2:"β";s:3:"尾";s:2:"γ";s:3:"纬";s:2:"δ";s:3:"未";s:2:"ε";s:3:"蔚";s:2:"ζ";s:3:"味";s:2:"η";s:3:"畏";s:2:"θ";s:3:"胃";s:2:"ι";s:3:"喂";s:2:"κ";s:3:"魏";s:2:"λ";s:3:"位";s:2:"μ";s:3:"渭";s:2:"ν";s:3:"谓";s:2:"ξ";s:3:"尉";s:2:"ο";s:3:"慰";s:2:"";s:3:"卫";s:2:"";s:3:"瘟";s:2:"";s:3:"温";s:2:"";s:3:"蚊";s:2:"";s:3:"文";s:2:"";s:3:"闻";s:2:"";s:3:"纹";s:2:"";s:3:"吻";s:2:"";s:3:"稳";s:2:"";s:3:"紊";s:2:"";s:3:"问";s:2:"";s:3:"嗡";s:2:"";s:3:"翁";s:2:"";s:3:"瓮";s:2:"";s:3:"挝";s:2:"";s:3:"蜗";s:2:"";s:3:"涡";s:2:"";s:3:"窝";s:2:"";s:3:"我";s:2:"";s:3:"斡";s:2:"";s:3:"卧";s:2:"";s:3:"握";s:2:"";s:3:"沃";s:2:"";s:3:"巫";s:2:"";s:3:"呜";s:2:"";s:3:"钨";s:2:"";s:3:"乌";s:2:"";s:3:"污";s:2:"";s:3:"诬";s:2:"";s:3:"屋";s:2:"";s:3:"无";s:2:"";s:3:"芜";s:2:"";s:3:"梧";s:2:"";s:3:"吾";s:2:"";s:3:"吴";s:2:"";s:3:"毋";s:2:"";s:3:"武";s:2:"";s:3:"五";s:2:"";s:3:"捂";s:2:"";s:3:"午";s:2:"";s:3:"舞";s:2:"";s:3:"伍";s:2:"";s:3:"侮";s:2:"";s:3:"坞";s:2:"";s:3:"戊";s:2:"";s:3:"雾";s:2:"";s:3:"晤";s:2:"";s:3:"物";s:2:"";s:3:"勿";s:2:"";s:3:"务";s:2:"";s:3:"悟";s:2:"";s:3:"误";s:2:"";s:3:"昔";s:2:"";s:3:"熙";s:2:"";s:3:"析";s:2:"";s:3:"西";s:2:"";s:3:"硒";s:2:"";s:3:"矽";s:2:"";s:3:"晰";s:2:"";s:3:"嘻";s:2:"";s:3:"吸";s:2:"";s:3:"锡";s:2:"";s:3:"牺";s:2:"@";s:3:"螥";s:2:"A";s:3:"螦";s:2:"B";s:3:"螧";s:2:"C";s:3:"螩";s:2:"D";s:3:"螪";s:2:"E";s:3:"螮";s:2:"F";s:3:"螰";s:2:"G";s:3:"螱";s:2:"H";s:3:"螲";s:2:"I";s:3:"螴";s:2:"J";s:3:"螶";s:2:"K";s:3:"螷";s:2:"L";s:3:"螸";s:2:"M";s:3:"螹";s:2:"N";s:3:"螻";s:2:"O";s:3:"螼";s:2:"P";s:3:"螾";s:2:"Q";s:3:"螿";s:2:"R";s:3:"蟁";s:2:"S";s:3:"蟂";s:2:"T";s:3:"蟃";s:2:"U";s:3:"蟄";s:2:"V";s:3:"蟅";s:2:"W";s:3:"蟇";s:2:"X";s:3:"蟈";s:2:"Y";s:3:"蟉";s:2:"Z";s:3:"蟌";s:2:"[";s:3:"蟍";s:2:"\";s:3:"蟎";s:2:"]";s:3:"蟏";s:2:"^";s:3:"蟐";s:2:"_";s:3:"蟔";s:2:"`";s:3:"蟕";s:2:"a";s:3:"蟖";s:2:"b";s:3:"蟗";s:2:"c";s:3:"蟘";s:2:"d";s:3:"蟙";s:2:"e";s:3:"蟚";s:2:"f";s:3:"蟜";s:2:"g";s:3:"蟝";s:2:"h";s:3:"蟞";s:2:"i";s:3:"蟟";s:2:"j";s:3:"蟡";s:2:"k";s:3:"蟢";s:2:"l";s:3:"蟣";s:2:"m";s:3:"蟤";s:2:"n";s:3:"蟦";s:2:"o";s:3:"蟧";s:2:"p";s:3:"蟨";s:2:"q";s:3:"蟩";s:2:"r";s:3:"蟫";s:2:"s";s:3:"蟬";s:2:"t";s:3:"蟭";s:2:"u";s:3:"蟯";s:2:"v";s:3:"蟰";s:2:"w";s:3:"蟱";s:2:"x";s:3:"蟲";s:2:"y";s:3:"蟳";s:2:"z";s:3:"蟴";s:2:"{";s:3:"蟵";s:2:"|";s:3:"蟶";s:2:"}";s:3:"蟷";s:2:"~";s:3:"蟸";s:2:"π";s:3:"蟺";s:2:"ρ";s:3:"蟻";s:2:"ς";s:3:"蟼";s:2:"σ";s:3:"蟽";s:2:"τ";s:3:"蟿";s:2:"υ";s:3:"蠀";s:2:"φ";s:3:"蠁";s:2:"χ";s:3:"蠂";s:2:"ψ";s:3:"蠄";s:2:"ω";s:3:"蠅";s:2:"ϊ";s:3:"蠆";s:2:"ϋ";s:3:"蠇";s:2:"ό";s:3:"蠈";s:2:"ύ";s:3:"蠉";s:2:"ώ";s:3:"蠋";s:2:"Ϗ";s:3:"蠌";s:2:"ϐ";s:3:"蠍";s:2:"ϑ";s:3:"蠎";s:2:"ϒ";s:3:"蠏";s:2:"ϓ";s:3:"蠐";s:2:"ϔ";s:3:"蠑";s:2:"ϕ";s:3:"蠒";s:2:"ϖ";s:3:"蠔";s:2:"ϗ";s:3:"蠗";s:2:"Ϙ";s:3:"蠘";s:2:"ϙ";s:3:"蠙";s:2:"Ϛ";s:3:"蠚";s:2:"ϛ";s:3:"蠜";s:2:"Ϝ";s:3:"蠝";s:2:"ϝ";s:3:"蠞";s:2:"Ϟ";s:3:"蠟";s:2:"ϟ";s:3:"蠠";s:2:"Ϡ";s:3:"蠣";s:2:"ϡ";s:3:"稀";s:2:"Ϣ";s:3:"息";s:2:"ϣ";s:3:"希";s:2:"Ϥ";s:3:"悉";s:2:"ϥ";s:3:"膝";s:2:"Ϧ";s:3:"夕";s:2:"ϧ";s:3:"惜";s:2:"Ϩ";s:3:"熄";s:2:"ϩ";s:3:"烯";s:2:"Ϫ";s:3:"溪";s:2:"ϫ";s:3:"汐";s:2:"Ϭ";s:3:"犀";s:2:"ϭ";s:3:"檄";s:2:"Ϯ";s:3:"袭";s:2:"ϯ";s:3:"席";s:2:"ϰ";s:3:"习";s:2:"ϱ";s:3:"媳";s:2:"ϲ";s:3:"喜";s:2:"ϳ";s:3:"铣";s:2:"ϴ";s:3:"洗";s:2:"ϵ";s:3:"系";s:2:"϶";s:3:"隙";s:2:"Ϸ";s:3:"戏";s:2:"ϸ";s:3:"细";s:2:"Ϲ";s:3:"瞎";s:2:"Ϻ";s:3:"虾";s:2:"ϻ";s:3:"匣";s:2:"ϼ";s:3:"霞";s:2:"Ͻ";s:3:"辖";s:2:"Ͼ";s:3:"暇";s:2:"Ͽ";s:3:"峡";s:2:"";s:3:"侠";s:2:"";s:3:"狭";s:2:"";s:3:"下";s:2:"";s:3:"厦";s:2:"";s:3:"夏";s:2:"";s:3:"吓";s:2:"";s:3:"掀";s:2:"";s:3:"锨";s:2:"";s:3:"先";s:2:"";s:3:"仙";s:2:"";s:3:"鲜";s:2:"";s:3:"纤";s:2:"";s:3:"咸";s:2:"";s:3:"贤";s:2:"";s:3:"衔";s:2:"";s:3:"舷";s:2:"";s:3:"闲";s:2:"";s:3:"涎";s:2:"";s:3:"弦";s:2:"";s:3:"嫌";s:2:"";s:3:"显";s:2:"";s:3:"险";s:2:"";s:3:"现";s:2:"";s:3:"献";s:2:"";s:3:"县";s:2:"";s:3:"腺";s:2:"";s:3:"馅";s:2:"";s:3:"羡";s:2:"";s:3:"宪";s:2:"";s:3:"陷";s:2:"";s:3:"限";s:2:"";s:3:"线";s:2:"";s:3:"相";s:2:"";s:3:"厢";s:2:"";s:3:"镶";s:2:"";s:3:"香";s:2:"";s:3:"箱";s:2:"";s:3:"襄";s:2:"";s:3:"湘";s:2:"";s:3:"乡";s:2:"";s:3:"翔";s:2:"";s:3:"祥";s:2:"";s:3:"详";s:2:"";s:3:"想";s:2:"";s:3:"响";s:2:"";s:3:"享";s:2:"";s:3:"项";s:2:"";s:3:"巷";s:2:"";s:3:"橡";s:2:"";s:3:"像";s:2:"";s:3:"向";s:2:"";s:3:"象";s:2:"";s:3:"萧";s:2:"";s:3:"硝";s:2:"";s:3:"霄";s:2:"";s:3:"削";s:2:"";s:3:"哮";s:2:"";s:3:"嚣";s:2:"";s:3:"销";s:2:"";s:3:"消";s:2:"";s:3:"宵";s:2:"";s:3:"淆";s:2:"";s:3:"晓";s:2:"@";s:3:"蠤";s:2:"A";s:3:"蠥";s:2:"B";s:3:"蠦";s:2:"C";s:3:"蠧";s:2:"D";s:3:"蠨";s:2:"E";s:3:"蠩";s:2:"F";s:3:"蠪";s:2:"G";s:3:"蠫";s:2:"H";s:3:"蠬";s:2:"I";s:3:"蠭";s:2:"J";s:3:"蠮";s:2:"K";s:3:"蠯";s:2:"L";s:3:"蠰";s:2:"M";s:3:"蠱";s:2:"N";s:3:"蠳";s:2:"O";s:3:"蠴";s:2:"P";s:3:"蠵";s:2:"Q";s:3:"蠶";s:2:"R";s:3:"蠷";s:2:"S";s:3:"蠸";s:2:"T";s:3:"蠺";s:2:"U";s:3:"蠻";s:2:"V";s:3:"蠽";s:2:"W";s:3:"蠾";s:2:"X";s:3:"蠿";s:2:"Y";s:3:"衁";s:2:"Z";s:3:"衂";s:2:"[";s:3:"衃";s:2:"\";s:3:"衆";s:2:"]";s:3:"衇";s:2:"^";s:3:"衈";s:2:"_";s:3:"衉";s:2:"`";s:3:"衊";s:2:"a";s:3:"衋";s:2:"b";s:3:"衎";s:2:"c";s:3:"衏";s:2:"d";s:3:"衐";s:2:"e";s:3:"衑";s:2:"f";s:3:"衒";s:2:"g";s:3:"術";s:2:"h";s:3:"衕";s:2:"i";s:3:"衖";s:2:"j";s:3:"衘";s:2:"k";s:3:"衚";s:2:"l";s:3:"衛";s:2:"m";s:3:"衜";s:2:"n";s:3:"衝";s:2:"o";s:3:"衞";s:2:"p";s:3:"衟";s:2:"q";s:3:"衠";s:2:"r";s:3:"衦";s:2:"s";s:3:"衧";s:2:"t";s:3:"衪";s:2:"u";s:3:"衭";s:2:"v";s:3:"衯";s:2:"w";s:3:"衱";s:2:"x";s:3:"衳";s:2:"y";s:3:"衴";s:2:"z";s:3:"衵";s:2:"{";s:3:"衶";s:2:"|";s:3:"衸";s:2:"}";s:3:"衹";s:2:"~";s:3:"衺";s:2:"Ѐ";s:3:"衻";s:2:"Ё";s:3:"衼";s:2:"Ђ";s:3:"袀";s:2:"Ѓ";s:3:"袃";s:2:"Є";s:3:"袆";s:2:"Ѕ";s:3:"袇";s:2:"І";s:3:"袉";s:2:"Ї";s:3:"袊";s:2:"Ј";s:3:"袌";s:2:"Љ";s:3:"袎";s:2:"Њ";s:3:"袏";s:2:"Ћ";s:3:"袐";s:2:"Ќ";s:3:"袑";s:2:"Ѝ";s:3:"袓";s:2:"Ў";s:3:"袔";s:2:"Џ";s:3:"袕";s:2:"А";s:3:"袗";s:2:"Б";s:3:"袘";s:2:"В";s:3:"袙";s:2:"Г";s:3:"袚";s:2:"Д";s:3:"袛";s:2:"Е";s:3:"袝";s:2:"Ж";s:3:"袞";s:2:"З";s:3:"袟";s:2:"И";s:3:"袠";s:2:"Й";s:3:"袡";s:2:"К";s:3:"袣";s:2:"Л";s:3:"袥";s:2:"М";s:3:"袦";s:2:"Н";s:3:"袧";s:2:"О";s:3:"袨";s:2:"П";s:3:"袩";s:2:"Р";s:3:"袪";s:2:"С";s:3:"小";s:2:"Т";s:3:"孝";s:2:"У";s:3:"校";s:2:"Ф";s:3:"肖";s:2:"Х";s:3:"啸";s:2:"Ц";s:3:"笑";s:2:"Ч";s:3:"效";s:2:"Ш";s:3:"楔";s:2:"Щ";s:3:"些";s:2:"Ъ";s:3:"歇";s:2:"Ы";s:3:"蝎";s:2:"Ь";s:3:"鞋";s:2:"Э";s:3:"协";s:2:"Ю";s:3:"挟";s:2:"Я";s:3:"携";s:2:"а";s:3:"邪";s:2:"б";s:3:"斜";s:2:"в";s:3:"胁";s:2:"г";s:3:"谐";s:2:"д";s:3:"写";s:2:"е";s:3:"械";s:2:"ж";s:3:"卸";s:2:"з";s:3:"蟹";s:2:"и";s:3:"懈";s:2:"й";s:3:"泄";s:2:"к";s:3:"泻";s:2:"л";s:3:"谢";s:2:"м";s:3:"屑";s:2:"н";s:3:"薪";s:2:"о";s:3:"芯";s:2:"п";s:3:"锌";s:2:"";s:3:"欣";s:2:"";s:3:"辛";s:2:"";s:3:"新";s:2:"";s:3:"忻";s:2:"";s:3:"心";s:2:"";s:3:"信";s:2:"";s:3:"衅";s:2:"";s:3:"星";s:2:"";s:3:"腥";s:2:"";s:3:"猩";s:2:"";s:3:"惺";s:2:"";s:3:"兴";s:2:"";s:3:"刑";s:2:"";s:3:"型";s:2:"";s:3:"形";s:2:"";s:3:"邢";s:2:"";s:3:"行";s:2:"";s:3:"醒";s:2:"";s:3:"幸";s:2:"";s:3:"杏";s:2:"";s:3:"性";s:2:"";s:3:"姓";s:2:"";s:3:"兄";s:2:"";s:3:"凶";s:2:"";s:3:"胸";s:2:"";s:3:"匈";s:2:"";s:3:"汹";s:2:"";s:3:"雄";s:2:"";s:3:"熊";s:2:"";s:3:"休";s:2:"";s:3:"修";s:2:"";s:3:"羞";s:2:"";s:3:"朽";s:2:"";s:3:"嗅";s:2:"";s:3:"锈";s:2:"";s:3:"秀";s:2:"";s:3:"袖";s:2:"";s:3:"绣";s:2:"";s:3:"墟";s:2:"";s:3:"戌";s:2:"";s:3:"需";s:2:"";s:3:"虚";s:2:"";s:3:"嘘";s:2:"";s:3:"须";s:2:"";s:3:"徐";s:2:"";s:3:"许";s:2:"";s:3:"蓄";s:2:"";s:3:"酗";s:2:"";s:3:"叙";s:2:"";s:3:"旭";s:2:"";s:3:"序";s:2:"";s:3:"畜";s:2:"";s:3:"恤";s:2:"";s:3:"絮";s:2:"";s:3:"婿";s:2:"";s:3:"绪";s:2:"";s:3:"续";s:2:"";s:3:"轩";s:2:"";s:3:"喧";s:2:"";s:3:"宣";s:2:"";s:3:"悬";s:2:"";s:3:"旋";s:2:"";s:3:"玄";s:2:"@";s:3:"袬";s:2:"A";s:3:"袮";s:2:"B";s:3:"袯";s:2:"C";s:3:"袰";s:2:"D";s:3:"袲";s:2:"E";s:3:"袳";s:2:"F";s:3:"袴";s:2:"G";s:3:"袵";s:2:"H";s:3:"袶";s:2:"I";s:3:"袸";s:2:"J";s:3:"袹";s:2:"K";s:3:"袺";s:2:"L";s:3:"袻";s:2:"M";s:3:"袽";s:2:"N";s:3:"袾";s:2:"O";s:3:"袿";s:2:"P";s:3:"裀";s:2:"Q";s:3:"裃";s:2:"R";s:3:"裄";s:2:"S";s:3:"裇";s:2:"T";s:3:"裈";s:2:"U";s:3:"裊";s:2:"V";s:3:"裋";s:2:"W";s:3:"裌";s:2:"X";s:3:"裍";s:2:"Y";s:3:"裏";s:2:"Z";s:3:"裐";s:2:"[";s:3:"裑";s:2:"\";s:3:"裓";s:2:"]";s:3:"裖";s:2:"^";s:3:"裗";s:2:"_";s:3:"裚";s:2:"`";s:3:"裛";s:2:"a";s:3:"補";s:2:"b";s:3:"裝";s:2:"c";s:3:"裞";s:2:"d";s:3:"裠";s:2:"e";s:3:"裡";s:2:"f";s:3:"裦";s:2:"g";s:3:"裧";s:2:"h";s:3:"裩";s:2:"i";s:3:"裪";s:2:"j";s:3:"裫";s:2:"k";s:3:"裬";s:2:"l";s:3:"裭";s:2:"m";s:3:"裮";s:2:"n";s:3:"裯";s:2:"o";s:3:"裲";s:2:"p";s:3:"裵";s:2:"q";s:3:"裶";s:2:"r";s:3:"裷";s:2:"s";s:3:"裺";s:2:"t";s:3:"裻";s:2:"u";s:3:"製";s:2:"v";s:3:"裿";s:2:"w";s:3:"褀";s:2:"x";s:3:"褁";s:2:"y";s:3:"褃";s:2:"z";s:3:"褄";s:2:"{";s:3:"褅";s:2:"|";s:3:"褆";s:2:"}";s:3:"複";s:2:"~";s:3:"褈";s:2:"р";s:3:"褉";s:2:"с";s:3:"褋";s:2:"т";s:3:"褌";s:2:"у";s:3:"褍";s:2:"ф";s:3:"褎";s:2:"х";s:3:"褏";s:2:"ц";s:3:"褑";s:2:"ч";s:3:"褔";s:2:"ш";s:3:"褕";s:2:"щ";s:3:"褖";s:2:"ъ";s:3:"褗";s:2:"ы";s:3:"褘";s:2:"ь";s:3:"褜";s:2:"э";s:3:"褝";s:2:"ю";s:3:"褞";s:2:"я";s:3:"褟";s:2:"ѐ";s:3:"褠";s:2:"ё";s:3:"褢";s:2:"ђ";s:3:"褣";s:2:"ѓ";s:3:"褤";s:2:"є";s:3:"褦";s:2:"ѕ";s:3:"褧";s:2:"і";s:3:"褨";s:2:"ї";s:3:"褩";s:2:"ј";s:3:"褬";s:2:"љ";s:3:"褭";s:2:"њ";s:3:"褮";s:2:"ћ";s:3:"褯";s:2:"ќ";s:3:"褱";s:2:"ѝ";s:3:"褲";s:2:"ў";s:3:"褳";s:2:"џ";s:3:"褵";s:2:"Ѡ";s:3:"褷";s:2:"ѡ";s:3:"选";s:2:"Ѣ";s:3:"癣";s:2:"ѣ";s:3:"眩";s:2:"Ѥ";s:3:"绚";s:2:"ѥ";s:3:"靴";s:2:"Ѧ";s:3:"薛";s:2:"ѧ";s:3:"学";s:2:"Ѩ";s:3:"穴";s:2:"ѩ";s:3:"雪";s:2:"Ѫ";s:3:"血";s:2:"ѫ";s:3:"勋";s:2:"Ѭ";s:3:"熏";s:2:"ѭ";s:3:"循";s:2:"Ѯ";s:3:"旬";s:2:"ѯ";s:3:"询";s:2:"Ѱ";s:3:"寻";s:2:"ѱ";s:3:"驯";s:2:"Ѳ";s:3:"巡";s:2:"ѳ";s:3:"殉";s:2:"Ѵ";s:3:"汛";s:2:"ѵ";s:3:"训";s:2:"Ѷ";s:3:"讯";s:2:"ѷ";s:3:"逊";s:2:"Ѹ";s:3:"迅";s:2:"ѹ";s:3:"压";s:2:"Ѻ";s:3:"押";s:2:"ѻ";s:3:"鸦";s:2:"Ѽ";s:3:"鸭";s:2:"ѽ";s:3:"呀";s:2:"Ѿ";s:3:"丫";s:2:"ѿ";s:3:"芽";s:2:"";s:3:"牙";s:2:"";s:3:"蚜";s:2:"";s:3:"崖";s:2:"";s:3:"衙";s:2:"";s:3:"涯";s:2:"";s:3:"雅";s:2:"";s:3:"哑";s:2:"";s:3:"亚";s:2:"";s:3:"讶";s:2:"";s:3:"焉";s:2:"";s:3:"咽";s:2:"";s:3:"阉";s:2:"";s:3:"烟";s:2:"";s:3:"淹";s:2:"";s:3:"盐";s:2:"";s:3:"严";s:2:"";s:3:"研";s:2:"";s:3:"蜒";s:2:"";s:3:"岩";s:2:"";s:3:"延";s:2:"";s:3:"言";s:2:"";s:3:"颜";s:2:"";s:3:"阎";s:2:"";s:3:"炎";s:2:"";s:3:"沿";s:2:"";s:3:"奄";s:2:"";s:3:"掩";s:2:"";s:3:"眼";s:2:"";s:3:"衍";s:2:"";s:3:"演";s:2:"";s:3:"艳";s:2:"";s:3:"堰";s:2:"";s:3:"燕";s:2:"";s:3:"厌";s:2:"";s:3:"砚";s:2:"";s:3:"雁";s:2:"";s:3:"唁";s:2:"";s:3:"彦";s:2:"";s:3:"焰";s:2:"";s:3:"宴";s:2:"";s:3:"谚";s:2:"";s:3:"验";s:2:"";s:3:"殃";s:2:"";s:3:"央";s:2:"";s:3:"鸯";s:2:"";s:3:"秧";s:2:"";s:3:"杨";s:2:"";s:3:"扬";s:2:"";s:3:"佯";s:2:"";s:3:"疡";s:2:"";s:3:"羊";s:2:"";s:3:"洋";s:2:"";s:3:"阳";s:2:"";s:3:"氧";s:2:"";s:3:"仰";s:2:"";s:3:"痒";s:2:"";s:3:"养";s:2:"";s:3:"样";s:2:"";s:3:"漾";s:2:"";s:3:"邀";s:2:"";s:3:"腰";s:2:"";s:3:"妖";s:2:"";s:3:"瑶";s:2:"@";s:3:"褸";s:2:"A";s:3:"褹";s:2:"B";s:3:"褺";s:2:"C";s:3:"褻";s:2:"D";s:3:"褼";s:2:"E";s:3:"褽";s:2:"F";s:3:"褾";s:2:"G";s:3:"褿";s:2:"H";s:3:"襀";s:2:"I";s:3:"襂";s:2:"J";s:3:"襃";s:2:"K";s:3:"襅";s:2:"L";s:3:"襆";s:2:"M";s:3:"襇";s:2:"N";s:3:"襈";s:2:"O";s:3:"襉";s:2:"P";s:3:"襊";s:2:"Q";s:3:"襋";s:2:"R";s:3:"襌";s:2:"S";s:3:"襍";s:2:"T";s:3:"襎";s:2:"U";s:3:"襏";s:2:"V";s:3:"襐";s:2:"W";s:3:"襑";s:2:"X";s:3:"襒";s:2:"Y";s:3:"襓";s:2:"Z";s:3:"襔";s:2:"[";s:3:"襕";s:2:"\";s:3:"襖";s:2:"]";s:3:"襗";s:2:"^";s:3:"襘";s:2:"_";s:3:"襙";s:2:"`";s:3:"襚";s:2:"a";s:3:"襛";s:2:"b";s:3:"襜";s:2:"c";s:3:"襝";s:2:"d";s:3:"襠";s:2:"e";s:3:"襡";s:2:"f";s:3:"襢";s:2:"g";s:3:"襣";s:2:"h";s:3:"襤";s:2:"i";s:3:"襥";s:2:"j";s:3:"襧";s:2:"k";s:3:"襨";s:2:"l";s:3:"襩";s:2:"m";s:3:"襪";s:2:"n";s:3:"襫";s:2:"o";s:3:"襬";s:2:"p";s:3:"襭";s:2:"q";s:3:"襮";s:2:"r";s:3:"襯";s:2:"s";s:3:"襰";s:2:"t";s:3:"襱";s:2:"u";s:3:"襲";s:2:"v";s:3:"襳";s:2:"w";s:3:"襴";s:2:"x";s:3:"襵";s:2:"y";s:3:"襶";s:2:"z";s:3:"襷";s:2:"{";s:3:"襸";s:2:"|";s:3:"襹";s:2:"}";s:3:"襺";s:2:"~";s:3:"襼";s:2:"Ҁ";s:3:"襽";s:2:"ҁ";s:3:"襾";s:2:"҂";s:3:"覀";s:2:"҃";s:3:"覂";s:2:"҄";s:3:"覄";s:2:"҅";s:3:"覅";s:2:"҆";s:3:"覇";s:2:"҇";s:3:"覈";s:2:"҈";s:3:"覉";s:2:"҉";s:3:"覊";s:2:"Ҋ";s:3:"見";s:2:"ҋ";s:3:"覌";s:2:"Ҍ";s:3:"覍";s:2:"ҍ";s:3:"覎";s:2:"Ҏ";s:3:"規";s:2:"ҏ";s:3:"覐";s:2:"Ґ";s:3:"覑";s:2:"ґ";s:3:"覒";s:2:"Ғ";s:3:"覓";s:2:"ғ";s:3:"覔";s:2:"Ҕ";s:3:"覕";s:2:"ҕ";s:3:"視";s:2:"Җ";s:3:"覗";s:2:"җ";s:3:"覘";s:2:"Ҙ";s:3:"覙";s:2:"ҙ";s:3:"覚";s:2:"Қ";s:3:"覛";s:2:"қ";s:3:"覜";s:2:"Ҝ";s:3:"覝";s:2:"ҝ";s:3:"覞";s:2:"Ҟ";s:3:"覟";s:2:"ҟ";s:3:"覠";s:2:"Ҡ";s:3:"覡";s:2:"ҡ";s:3:"摇";s:2:"Ң";s:3:"尧";s:2:"ң";s:3:"遥";s:2:"Ҥ";s:3:"窑";s:2:"ҥ";s:3:"谣";s:2:"Ҧ";s:3:"姚";s:2:"ҧ";s:3:"咬";s:2:"Ҩ";s:3:"舀";s:2:"ҩ";s:3:"药";s:2:"Ҫ";s:3:"要";s:2:"ҫ";s:3:"耀";s:2:"Ҭ";s:3:"椰";s:2:"ҭ";s:3:"噎";s:2:"Ү";s:3:"耶";s:2:"ү";s:3:"爷";s:2:"Ұ";s:3:"野";s:2:"ұ";s:3:"冶";s:2:"Ҳ";s:3:"也";s:2:"ҳ";s:3:"页";s:2:"Ҵ";s:3:"掖";s:2:"ҵ";s:3:"业";s:2:"Ҷ";s:3:"叶";s:2:"ҷ";s:3:"曳";s:2:"Ҹ";s:3:"腋";s:2:"ҹ";s:3:"夜";s:2:"Һ";s:3:"液";s:2:"һ";s:3:"一";s:2:"Ҽ";s:3:"壹";s:2:"ҽ";s:3:"医";s:2:"Ҿ";s:3:"揖";s:2:"ҿ";s:3:"铱";s:2:"";s:3:"依";s:2:"";s:3:"伊";s:2:"";s:3:"衣";s:2:"";s:3:"颐";s:2:"";s:3:"夷";s:2:"";s:3:"遗";s:2:"";s:3:"移";s:2:"";s:3:"仪";s:2:"";s:3:"胰";s:2:"";s:3:"疑";s:2:"";s:3:"沂";s:2:"";s:3:"宜";s:2:"";s:3:"姨";s:2:"";s:3:"彝";s:2:"";s:3:"椅";s:2:"";s:3:"蚁";s:2:"";s:3:"倚";s:2:"";s:3:"已";s:2:"";s:3:"乙";s:2:"";s:3:"矣";s:2:"";s:3:"以";s:2:"";s:3:"艺";s:2:"";s:3:"抑";s:2:"";s:3:"易";s:2:"";s:3:"邑";s:2:"";s:3:"屹";s:2:"";s:3:"亿";s:2:"";s:3:"役";s:2:"";s:3:"臆";s:2:"";s:3:"逸";s:2:"";s:3:"肄";s:2:"";s:3:"疫";s:2:"";s:3:"亦";s:2:"";s:3:"裔";s:2:"";s:3:"意";s:2:"";s:3:"毅";s:2:"";s:3:"忆";s:2:"";s:3:"义";s:2:"";s:3:"益";s:2:"";s:3:"溢";s:2:"";s:3:"诣";s:2:"";s:3:"议";s:2:"";s:3:"谊";s:2:"";s:3:"译";s:2:"";s:3:"异";s:2:"";s:3:"翼";s:2:"";s:3:"翌";s:2:"";s:3:"绎";s:2:"";s:3:"茵";s:2:"";s:3:"荫";s:2:"";s:3:"因";s:2:"";s:3:"殷";s:2:"";s:3:"音";s:2:"";s:3:"阴";s:2:"";s:3:"姻";s:2:"";s:3:"吟";s:2:"";s:3:"银";s:2:"";s:3:"淫";s:2:"";s:3:"寅";s:2:"";s:3:"饮";s:2:"";s:3:"尹";s:2:"";s:3:"引";s:2:"";s:3:"隐";s:2:"@";s:3:"覢";s:2:"A";s:3:"覣";s:2:"B";s:3:"覤";s:2:"C";s:3:"覥";s:2:"D";s:3:"覦";s:2:"E";s:3:"覧";s:2:"F";s:3:"覨";s:2:"G";s:3:"覩";s:2:"H";s:3:"親";s:2:"I";s:3:"覫";s:2:"J";s:3:"覬";s:2:"K";s:3:"覭";s:2:"L";s:3:"覮";s:2:"M";s:3:"覯";s:2:"N";s:3:"覰";s:2:"O";s:3:"覱";s:2:"P";s:3:"覲";s:2:"Q";s:3:"観";s:2:"R";s:3:"覴";s:2:"S";s:3:"覵";s:2:"T";s:3:"覶";s:2:"U";s:3:"覷";s:2:"V";s:3:"覸";s:2:"W";s:3:"覹";s:2:"X";s:3:"覺";s:2:"Y";s:3:"覻";s:2:"Z";s:3:"覼";s:2:"[";s:3:"覽";s:2:"\";s:3:"覾";s:2:"]";s:3:"覿";s:2:"^";s:3:"觀";s:2:"_";s:3:"觃";s:2:"`";s:3:"觍";s:2:"a";s:3:"觓";s:2:"b";s:3:"觔";s:2:"c";s:3:"觕";s:2:"d";s:3:"觗";s:2:"e";s:3:"觘";s:2:"f";s:3:"觙";s:2:"g";s:3:"觛";s:2:"h";s:3:"觝";s:2:"i";s:3:"觟";s:2:"j";s:3:"觠";s:2:"k";s:3:"觡";s:2:"l";s:3:"觢";s:2:"m";s:3:"觤";s:2:"n";s:3:"觧";s:2:"o";s:3:"觨";s:2:"p";s:3:"觩";s:2:"q";s:3:"觪";s:2:"r";s:3:"觬";s:2:"s";s:3:"觭";s:2:"t";s:3:"觮";s:2:"u";s:3:"觰";s:2:"v";s:3:"觱";s:2:"w";s:3:"觲";s:2:"x";s:3:"觴";s:2:"y";s:3:"觵";s:2:"z";s:3:"觶";s:2:"{";s:3:"觷";s:2:"|";s:3:"觸";s:2:"}";s:3:"觹";s:2:"~";s:3:"觺";s:2:"Ӏ";s:3:"觻";s:2:"Ӂ";s:3:"觼";s:2:"ӂ";s:3:"觽";s:2:"Ӄ";s:3:"觾";s:2:"ӄ";s:3:"觿";s:2:"Ӆ";s:3:"訁";s:2:"ӆ";s:3:"訂";s:2:"Ӈ";s:3:"訃";s:2:"ӈ";s:3:"訄";s:2:"Ӊ";s:3:"訅";s:2:"ӊ";s:3:"訆";s:2:"Ӌ";s:3:"計";s:2:"ӌ";s:3:"訉";s:2:"Ӎ";s:3:"訊";s:2:"ӎ";s:3:"訋";s:2:"ӏ";s:3:"訌";s:2:"Ӑ";s:3:"訍";s:2:"ӑ";s:3:"討";s:2:"Ӓ";s:3:"訏";s:2:"ӓ";s:3:"訐";s:2:"Ӕ";s:3:"訑";s:2:"ӕ";s:3:"訒";s:2:"Ӗ";s:3:"訓";s:2:"ӗ";s:3:"訔";s:2:"Ә";s:3:"訕";s:2:"ә";s:3:"訖";s:2:"Ӛ";s:3:"託";s:2:"ӛ";s:3:"記";s:2:"Ӝ";s:3:"訙";s:2:"ӝ";s:3:"訚";s:2:"Ӟ";s:3:"訛";s:2:"ӟ";s:3:"訜";s:2:"Ӡ";s:3:"訝";s:2:"ӡ";s:3:"印";s:2:"Ӣ";s:3:"英";s:2:"ӣ";s:3:"樱";s:2:"Ӥ";s:3:"婴";s:2:"ӥ";s:3:"鹰";s:2:"Ӧ";s:3:"应";s:2:"ӧ";s:3:"缨";s:2:"Ө";s:3:"莹";s:2:"ө";s:3:"萤";s:2:"Ӫ";s:3:"营";s:2:"ӫ";s:3:"荧";s:2:"Ӭ";s:3:"蝇";s:2:"ӭ";s:3:"迎";s:2:"Ӯ";s:3:"赢";s:2:"ӯ";s:3:"盈";s:2:"Ӱ";s:3:"影";s:2:"ӱ";s:3:"颖";s:2:"Ӳ";s:3:"硬";s:2:"ӳ";s:3:"映";s:2:"Ӵ";s:3:"哟";s:2:"ӵ";s:3:"拥";s:2:"Ӷ";s:3:"佣";s:2:"ӷ";s:3:"臃";s:2:"Ӹ";s:3:"痈";s:2:"ӹ";s:3:"庸";s:2:"Ӻ";s:3:"雍";s:2:"ӻ";s:3:"踊";s:2:"Ӽ";s:3:"蛹";s:2:"ӽ";s:3:"咏";s:2:"Ӿ";s:3:"泳";s:2:"ӿ";s:3:"涌";s:2:"";s:3:"永";s:2:"";s:3:"恿";s:2:"";s:3:"勇";s:2:"";s:3:"用";s:2:"";s:3:"幽";s:2:"";s:3:"优";s:2:"";s:3:"悠";s:2:"";s:3:"忧";s:2:"";s:3:"尤";s:2:"";s:3:"由";s:2:"";s:3:"邮";s:2:"";s:3:"铀";s:2:"";s:3:"犹";s:2:"";s:3:"油";s:2:"";s:3:"游";s:2:"";s:3:"酉";s:2:"";s:3:"有";s:2:"";s:3:"友";s:2:"";s:3:"右";s:2:"";s:3:"佑";s:2:"";s:3:"釉";s:2:"";s:3:"诱";s:2:"";s:3:"又";s:2:"";s:3:"幼";s:2:"";s:3:"迂";s:2:"";s:3:"淤";s:2:"";s:3:"于";s:2:"";s:3:"盂";s:2:"";s:3:"榆";s:2:"";s:3:"虞";s:2:"";s:3:"愚";s:2:"";s:3:"舆";s:2:"";s:3:"余";s:2:"";s:3:"俞";s:2:"";s:3:"逾";s:2:"";s:3:"鱼";s:2:"";s:3:"愉";s:2:"";s:3:"渝";s:2:"";s:3:"渔";s:2:"";s:3:"隅";s:2:"";s:3:"予";s:2:"";s:3:"娱";s:2:"";s:3:"雨";s:2:"";s:3:"与";s:2:"";s:3:"屿";s:2:"";s:3:"禹";s:2:"";s:3:"宇";s:2:"";s:3:"语";s:2:"";s:3:"羽";s:2:"";s:3:"玉";s:2:"";s:3:"域";s:2:"";s:3:"芋";s:2:"";s:3:"郁";s:2:"";s:3:"吁";s:2:"";s:3:"遇";s:2:"";s:3:"喻";s:2:"";s:3:"峪";s:2:"";s:3:"御";s:2:"";s:3:"愈";s:2:"";s:3:"欲";s:2:"";s:3:"狱";s:2:"";s:3:"育";s:2:"";s:3:"誉";s:2:"@";s:3:"訞";s:2:"A";s:3:"訟";s:2:"B";s:3:"訠";s:2:"C";s:3:"訡";s:2:"D";s:3:"訢";s:2:"E";s:3:"訣";s:2:"F";s:3:"訤";s:2:"G";s:3:"訥";s:2:"H";s:3:"訦";s:2:"I";s:3:"訧";s:2:"J";s:3:"訨";s:2:"K";s:3:"訩";s:2:"L";s:3:"訪";s:2:"M";s:3:"訫";s:2:"N";s:3:"訬";s:2:"O";s:3:"設";s:2:"P";s:3:"訮";s:2:"Q";s:3:"訯";s:2:"R";s:3:"訰";s:2:"S";s:3:"許";s:2:"T";s:3:"訲";s:2:"U";s:3:"訳";s:2:"V";s:3:"訴";s:2:"W";s:3:"訵";s:2:"X";s:3:"訶";s:2:"Y";s:3:"訷";s:2:"Z";s:3:"訸";s:2:"[";s:3:"訹";s:2:"\";s:3:"診";s:2:"]";s:3:"註";s:2:"^";s:3:"証";s:2:"_";s:3:"訽";s:2:"`";s:3:"訿";s:2:"a";s:3:"詀";s:2:"b";s:3:"詁";s:2:"c";s:3:"詂";s:2:"d";s:3:"詃";s:2:"e";s:3:"詄";s:2:"f";s:3:"詅";s:2:"g";s:3:"詆";s:2:"h";s:3:"詇";s:2:"i";s:3:"詉";s:2:"j";s:3:"詊";s:2:"k";s:3:"詋";s:2:"l";s:3:"詌";s:2:"m";s:3:"詍";s:2:"n";s:3:"詎";s:2:"o";s:3:"詏";s:2:"p";s:3:"詐";s:2:"q";s:3:"詑";s:2:"r";s:3:"詒";s:2:"s";s:3:"詓";s:2:"t";s:3:"詔";s:2:"u";s:3:"評";s:2:"v";s:3:"詖";s:2:"w";s:3:"詗";s:2:"x";s:3:"詘";s:2:"y";s:3:"詙";s:2:"z";s:3:"詚";s:2:"{";s:3:"詛";s:2:"|";s:3:"詜";s:2:"}";s:3:"詝";s:2:"~";s:3:"詞";s:2:"Ԁ";s:3:"詟";s:2:"ԁ";s:3:"詠";s:2:"Ԃ";s:3:"詡";s:2:"ԃ";s:3:"詢";s:2:"Ԅ";s:3:"詣";s:2:"ԅ";s:3:"詤";s:2:"Ԇ";s:3:"詥";s:2:"ԇ";s:3:"試";s:2:"Ԉ";s:3:"詧";s:2:"ԉ";s:3:"詨";s:2:"Ԋ";s:3:"詩";s:2:"ԋ";s:3:"詪";s:2:"Ԍ";s:3:"詫";s:2:"ԍ";s:3:"詬";s:2:"Ԏ";s:3:"詭";s:2:"ԏ";s:3:"詮";s:2:"Ԑ";s:3:"詯";s:2:"ԑ";s:3:"詰";s:2:"Ԓ";s:3:"話";s:2:"ԓ";s:3:"該";s:2:"Ԕ";s:3:"詳";s:2:"ԕ";s:3:"詴";s:2:"Ԗ";s:3:"詵";s:2:"ԗ";s:3:"詶";s:2:"Ԙ";s:3:"詷";s:2:"ԙ";s:3:"詸";s:2:"Ԛ";s:3:"詺";s:2:"ԛ";s:3:"詻";s:2:"Ԝ";s:3:"詼";s:2:"ԝ";s:3:"詽";s:2:"Ԟ";s:3:"詾";s:2:"ԟ";s:3:"詿";s:2:"Ԡ";s:3:"誀";s:2:"ԡ";s:3:"浴";s:2:"Ԣ";s:3:"寓";s:2:"ԣ";s:3:"裕";s:2:"Ԥ";s:3:"预";s:2:"ԥ";s:3:"豫";s:2:"Ԧ";s:3:"驭";s:2:"ԧ";s:3:"鸳";s:2:"Ԩ";s:3:"渊";s:2:"ԩ";s:3:"冤";s:2:"Ԫ";s:3:"元";s:2:"ԫ";s:3:"垣";s:2:"Ԭ";s:3:"袁";s:2:"ԭ";s:3:"原";s:2:"Ԯ";s:3:"援";s:2:"ԯ";s:3:"辕";s:2:"԰";s:3:"园";s:2:"Ա";s:3:"员";s:2:"Բ";s:3:"圆";s:2:"Գ";s:3:"猿";s:2:"Դ";s:3:"源";s:2:"Ե";s:3:"缘";s:2:"Զ";s:3:"远";s:2:"Է";s:3:"苑";s:2:"Ը";s:3:"愿";s:2:"Թ";s:3:"怨";s:2:"Ժ";s:3:"院";s:2:"Ի";s:3:"曰";s:2:"Լ";s:3:"约";s:2:"Խ";s:3:"越";s:2:"Ծ";s:3:"跃";s:2:"Կ";s:3:"钥";s:2:"";s:3:"岳";s:2:"";s:3:"粤";s:2:"";s:3:"月";s:2:"";s:3:"悦";s:2:"";s:3:"阅";s:2:"";s:3:"耘";s:2:"";s:3:"云";s:2:"";s:3:"郧";s:2:"";s:3:"匀";s:2:"";s:3:"陨";s:2:"";s:3:"允";s:2:"";s:3:"运";s:2:"";s:3:"蕴";s:2:"";s:3:"酝";s:2:"";s:3:"晕";s:2:"";s:3:"韵";s:2:"";s:3:"孕";s:2:"";s:3:"匝";s:2:"";s:3:"砸";s:2:"";s:3:"杂";s:2:"";s:3:"栽";s:2:"";s:3:"哉";s:2:"";s:3:"灾";s:2:"";s:3:"宰";s:2:"";s:3:"载";s:2:"";s:3:"再";s:2:"";s:3:"在";s:2:"";s:3:"咱";s:2:"";s:3:"攒";s:2:"";s:3:"暂";s:2:"";s:3:"赞";s:2:"";s:3:"赃";s:2:"";s:3:"脏";s:2:"";s:3:"葬";s:2:"";s:3:"遭";s:2:"";s:3:"糟";s:2:"";s:3:"凿";s:2:"";s:3:"藻";s:2:"";s:3:"枣";s:2:"";s:3:"早";s:2:"";s:3:"澡";s:2:"";s:3:"蚤";s:2:"";s:3:"躁";s:2:"";s:3:"噪";s:2:"";s:3:"造";s:2:"";s:3:"皂";s:2:"";s:3:"灶";s:2:"";s:3:"燥";s:2:"";s:3:"责";s:2:"";s:3:"择";s:2:"";s:3:"则";s:2:"";s:3:"泽";s:2:"";s:3:"贼";s:2:"";s:3:"怎";s:2:"";s:3:"增";s:2:"";s:3:"憎";s:2:"";s:3:"曾";s:2:"";s:3:"赠";s:2:"";s:3:"扎";s:2:"";s:3:"喳";s:2:"";s:3:"渣";s:2:"";s:3:"札";s:2:"";s:3:"轧";s:2:"@";s:3:"誁";s:2:"A";s:3:"誂";s:2:"B";s:3:"誃";s:2:"C";s:3:"誄";s:2:"D";s:3:"誅";s:2:"E";s:3:"誆";s:2:"F";s:3:"誇";s:2:"G";s:3:"誈";s:2:"H";s:3:"誋";s:2:"I";s:3:"誌";s:2:"J";s:3:"認";s:2:"K";s:3:"誎";s:2:"L";s:3:"誏";s:2:"M";s:3:"誐";s:2:"N";s:3:"誑";s:2:"O";s:3:"誒";s:2:"P";s:3:"誔";s:2:"Q";s:3:"誕";s:2:"R";s:3:"誖";s:2:"S";s:3:"誗";s:2:"T";s:3:"誘";s:2:"U";s:3:"誙";s:2:"V";s:3:"誚";s:2:"W";s:3:"誛";s:2:"X";s:3:"誜";s:2:"Y";s:3:"誝";s:2:"Z";s:3:"語";s:2:"[";s:3:"誟";s:2:"\";s:3:"誠";s:2:"]";s:3:"誡";s:2:"^";s:3:"誢";s:2:"_";s:3:"誣";s:2:"`";s:3:"誤";s:2:"a";s:3:"誥";s:2:"b";s:3:"誦";s:2:"c";s:3:"誧";s:2:"d";s:3:"誨";s:2:"e";s:3:"誩";s:2:"f";s:3:"說";s:2:"g";s:3:"誫";s:2:"h";s:3:"説";s:2:"i";s:3:"読";s:2:"j";s:3:"誮";s:2:"k";s:3:"誯";s:2:"l";s:3:"誰";s:2:"m";s:3:"誱";s:2:"n";s:3:"課";s:2:"o";s:3:"誳";s:2:"p";s:3:"誴";s:2:"q";s:3:"誵";s:2:"r";s:3:"誶";s:2:"s";s:3:"誷";s:2:"t";s:3:"誸";s:2:"u";s:3:"誹";s:2:"v";s:3:"誺";s:2:"w";s:3:"誻";s:2:"x";s:3:"誼";s:2:"y";s:3:"誽";s:2:"z";s:3:"誾";s:2:"{";s:3:"調";s:2:"|";s:3:"諀";s:2:"}";s:3:"諁";s:2:"~";s:3:"諂";s:2:"Հ";s:3:"諃";s:2:"Ձ";s:3:"諄";s:2:"Ղ";s:3:"諅";s:2:"Ճ";s:3:"諆";s:2:"Մ";s:3:"談";s:2:"Յ";s:3:"諈";s:2:"Ն";s:3:"諉";s:2:"Շ";s:3:"諊";s:2:"Ո";s:3:"請";s:2:"Չ";s:3:"諌";s:2:"Պ";s:3:"諍";s:2:"Ջ";s:3:"諎";s:2:"Ռ";s:3:"諏";s:2:"Ս";s:3:"諐";s:2:"Վ";s:3:"諑";s:2:"Տ";s:3:"諒";s:2:"Ր";s:3:"諓";s:2:"Ց";s:3:"諔";s:2:"Ւ";s:3:"諕";s:2:"Փ";s:3:"論";s:2:"Ք";s:3:"諗";s:2:"Օ";s:3:"諘";s:2:"Ֆ";s:3:"諙";s:2:"՗";s:3:"諚";s:2:"՘";s:3:"諛";s:2:"ՙ";s:3:"諜";s:2:"՚";s:3:"諝";s:2:"՛";s:3:"諞";s:2:"՜";s:3:"諟";s:2:"՝";s:3:"諠";s:2:"՞";s:3:"諡";s:2:"՟";s:3:"諢";s:2:"ՠ";s:3:"諣";s:2:"ա";s:3:"铡";s:2:"բ";s:3:"闸";s:2:"գ";s:3:"眨";s:2:"դ";s:3:"栅";s:2:"ե";s:3:"榨";s:2:"զ";s:3:"咋";s:2:"է";s:3:"乍";s:2:"ը";s:3:"炸";s:2:"թ";s:3:"诈";s:2:"ժ";s:3:"摘";s:2:"ի";s:3:"斋";s:2:"լ";s:3:"宅";s:2:"խ";s:3:"窄";s:2:"ծ";s:3:"债";s:2:"կ";s:3:"寨";s:2:"հ";s:3:"瞻";s:2:"ձ";s:3:"毡";s:2:"ղ";s:3:"詹";s:2:"ճ";s:3:"粘";s:2:"մ";s:3:"沾";s:2:"յ";s:3:"盏";s:2:"ն";s:3:"斩";s:2:"շ";s:3:"辗";s:2:"ո";s:3:"崭";s:2:"չ";s:3:"展";s:2:"պ";s:3:"蘸";s:2:"ջ";s:3:"栈";s:2:"ռ";s:3:"占";s:2:"ս";s:3:"战";s:2:"վ";s:3:"站";s:2:"տ";s:3:"湛";s:2:"";s:3:"绽";s:2:"";s:3:"樟";s:2:"";s:3:"章";s:2:"";s:3:"彰";s:2:"";s:3:"漳";s:2:"";s:3:"张";s:2:"";s:3:"掌";s:2:"";s:3:"涨";s:2:"";s:3:"杖";s:2:"";s:3:"丈";s:2:"";s:3:"帐";s:2:"";s:3:"账";s:2:"";s:3:"仗";s:2:"";s:3:"胀";s:2:"";s:3:"瘴";s:2:"";s:3:"障";s:2:"";s:3:"招";s:2:"";s:3:"昭";s:2:"";s:3:"找";s:2:"";s:3:"沼";s:2:"";s:3:"赵";s:2:"";s:3:"照";s:2:"";s:3:"罩";s:2:"";s:3:"兆";s:2:"";s:3:"肇";s:2:"";s:3:"召";s:2:"";s:3:"遮";s:2:"";s:3:"折";s:2:"";s:3:"哲";s:2:"";s:3:"蛰";s:2:"";s:3:"辙";s:2:"";s:3:"者";s:2:"";s:3:"锗";s:2:"";s:3:"蔗";s:2:"";s:3:"这";s:2:"";s:3:"浙";s:2:"";s:3:"珍";s:2:"";s:3:"斟";s:2:"";s:3:"真";s:2:"";s:3:"甄";s:2:"";s:3:"砧";s:2:"";s:3:"臻";s:2:"";s:3:"贞";s:2:"";s:3:"针";s:2:"";s:3:"侦";s:2:"";s:3:"枕";s:2:"";s:3:"疹";s:2:"";s:3:"诊";s:2:"";s:3:"震";s:2:"";s:3:"振";s:2:"";s:3:"镇";s:2:"";s:3:"阵";s:2:"";s:3:"蒸";s:2:"";s:3:"挣";s:2:"";s:3:"睁";s:2:"";s:3:"征";s:2:"";s:3:"狰";s:2:"";s:3:"争";s:2:"";s:3:"怔";s:2:"";s:3:"整";s:2:"";s:3:"拯";s:2:"";s:3:"正";s:2:"";s:3:"政";s:2:"@";s:3:"諤";s:2:"A";s:3:"諥";s:2:"B";s:3:"諦";s:2:"C";s:3:"諧";s:2:"D";s:3:"諨";s:2:"E";s:3:"諩";s:2:"F";s:3:"諪";s:2:"G";s:3:"諫";s:2:"H";s:3:"諬";s:2:"I";s:3:"諭";s:2:"J";s:3:"諮";s:2:"K";s:3:"諯";s:2:"L";s:3:"諰";s:2:"M";s:3:"諱";s:2:"N";s:3:"諲";s:2:"O";s:3:"諳";s:2:"P";s:3:"諴";s:2:"Q";s:3:"諵";s:2:"R";s:3:"諶";s:2:"S";s:3:"諷";s:2:"T";s:3:"諸";s:2:"U";s:3:"諹";s:2:"V";s:3:"諺";s:2:"W";s:3:"諻";s:2:"X";s:3:"諼";s:2:"Y";s:3:"諽";s:2:"Z";s:3:"諾";s:2:"[";s:3:"諿";s:2:"\";s:3:"謀";s:2:"]";s:3:"謁";s:2:"^";s:3:"謂";s:2:"_";s:3:"謃";s:2:"`";s:3:"謄";s:2:"a";s:3:"謅";s:2:"b";s:3:"謆";s:2:"c";s:3:"謈";s:2:"d";s:3:"謉";s:2:"e";s:3:"謊";s:2:"f";s:3:"謋";s:2:"g";s:3:"謌";s:2:"h";s:3:"謍";s:2:"i";s:3:"謎";s:2:"j";s:3:"謏";s:2:"k";s:3:"謐";s:2:"l";s:3:"謑";s:2:"m";s:3:"謒";s:2:"n";s:3:"謓";s:2:"o";s:3:"謔";s:2:"p";s:3:"謕";s:2:"q";s:3:"謖";s:2:"r";s:3:"謗";s:2:"s";s:3:"謘";s:2:"t";s:3:"謙";s:2:"u";s:3:"謚";s:2:"v";s:3:"講";s:2:"w";s:3:"謜";s:2:"x";s:3:"謝";s:2:"y";s:3:"謞";s:2:"z";s:3:"謟";s:2:"{";s:3:"謠";s:2:"|";s:3:"謡";s:2:"}";s:3:"謢";s:2:"~";s:3:"謣";s:2:"ր";s:3:"謤";s:2:"ց";s:3:"謥";s:2:"ւ";s:3:"謧";s:2:"փ";s:3:"謨";s:2:"ք";s:3:"謩";s:2:"օ";s:3:"謪";s:2:"ֆ";s:3:"謫";s:2:"և";s:3:"謬";s:2:"ֈ";s:3:"謭";s:2:"։";s:3:"謮";s:2:"֊";s:3:"謯";s:2:"֋";s:3:"謰";s:2:"֌";s:3:"謱";s:2:"֍";s:3:"謲";s:2:"֎";s:3:"謳";s:2:"֏";s:3:"謴";s:2:"֐";s:3:"謵";s:2:"֑";s:3:"謶";s:2:"֒";s:3:"謷";s:2:"֓";s:3:"謸";s:2:"֔";s:3:"謹";s:2:"֕";s:3:"謺";s:2:"֖";s:3:"謻";s:2:"֗";s:3:"謼";s:2:"֘";s:3:"謽";s:2:"֙";s:3:"謾";s:2:"֚";s:3:"謿";s:2:"֛";s:3:"譀";s:2:"֜";s:3:"譁";s:2:"֝";s:3:"譂";s:2:"֞";s:3:"譃";s:2:"֟";s:3:"譄";s:2:"֠";s:3:"譅";s:2:"֡";s:3:"帧";s:2:"֢";s:3:"症";s:2:"֣";s:3:"郑";s:2:"֤";s:3:"证";s:2:"֥";s:3:"芝";s:2:"֦";s:3:"枝";s:2:"֧";s:3:"支";s:2:"֨";s:3:"吱";s:2:"֩";s:3:"蜘";s:2:"֪";s:3:"知";s:2:"֫";s:3:"肢";s:2:"֬";s:3:"脂";s:2:"֭";s:3:"汁";s:2:"֮";s:3:"之";s:2:"֯";s:3:"织";s:2:"ְ";s:3:"职";s:2:"ֱ";s:3:"直";s:2:"ֲ";s:3:"植";s:2:"ֳ";s:3:"殖";s:2:"ִ";s:3:"执";s:2:"ֵ";s:3:"值";s:2:"ֶ";s:3:"侄";s:2:"ַ";s:3:"址";s:2:"ָ";s:3:"指";s:2:"ֹ";s:3:"止";s:2:"ֺ";s:3:"趾";s:2:"ֻ";s:3:"只";s:2:"ּ";s:3:"旨";s:2:"ֽ";s:3:"纸";s:2:"־";s:3:"志";s:2:"ֿ";s:3:"挚";s:2:"";s:3:"掷";s:2:"";s:3:"至";s:2:"";s:3:"致";s:2:"";s:3:"置";s:2:"";s:3:"帜";s:2:"";s:3:"峙";s:2:"";s:3:"制";s:2:"";s:3:"智";s:2:"";s:3:"秩";s:2:"";s:3:"稚";s:2:"";s:3:"质";s:2:"";s:3:"炙";s:2:"";s:3:"痔";s:2:"";s:3:"滞";s:2:"";s:3:"治";s:2:"";s:3:"窒";s:2:"";s:3:"中";s:2:"";s:3:"盅";s:2:"";s:3:"忠";s:2:"";s:3:"钟";s:2:"";s:3:"衷";s:2:"";s:3:"终";s:2:"";s:3:"种";s:2:"";s:3:"肿";s:2:"";s:3:"重";s:2:"";s:3:"仲";s:2:"";s:3:"众";s:2:"";s:3:"舟";s:2:"";s:3:"周";s:2:"";s:3:"州";s:2:"";s:3:"洲";s:2:"";s:3:"诌";s:2:"";s:3:"粥";s:2:"";s:3:"轴";s:2:"";s:3:"肘";s:2:"";s:3:"帚";s:2:"";s:3:"咒";s:2:"";s:3:"皱";s:2:"";s:3:"宙";s:2:"";s:3:"昼";s:2:"";s:3:"骤";s:2:"";s:3:"珠";s:2:"";s:3:"株";s:2:"";s:3:"蛛";s:2:"";s:3:"朱";s:2:"";s:3:"猪";s:2:"";s:3:"诸";s:2:"";s:3:"诛";s:2:"";s:3:"逐";s:2:"";s:3:"竹";s:2:"";s:3:"烛";s:2:"";s:3:"煮";s:2:"";s:3:"拄";s:2:"";s:3:"瞩";s:2:"";s:3:"嘱";s:2:"";s:3:"主";s:2:"";s:3:"著";s:2:"";s:3:"柱";s:2:"";s:3:"助";s:2:"";s:3:"蛀";s:2:"";s:3:"贮";s:2:"";s:3:"铸";s:2:"";s:3:"筑";s:2:"@";s:3:"譆";s:2:"A";s:3:"譇";s:2:"B";s:3:"譈";s:2:"C";s:3:"證";s:2:"D";s:3:"譊";s:2:"E";s:3:"譋";s:2:"F";s:3:"譌";s:2:"G";s:3:"譍";s:2:"H";s:3:"譎";s:2:"I";s:3:"譏";s:2:"J";s:3:"譐";s:2:"K";s:3:"譑";s:2:"L";s:3:"譒";s:2:"M";s:3:"譓";s:2:"N";s:3:"譔";s:2:"O";s:3:"譕";s:2:"P";s:3:"譖";s:2:"Q";s:3:"譗";s:2:"R";s:3:"識";s:2:"S";s:3:"譙";s:2:"T";s:3:"譚";s:2:"U";s:3:"譛";s:2:"V";s:3:"譜";s:2:"W";s:3:"譝";s:2:"X";s:3:"譞";s:2:"Y";s:3:"譟";s:2:"Z";s:3:"譠";s:2:"[";s:3:"譡";s:2:"\";s:3:"譢";s:2:"]";s:3:"譣";s:2:"^";s:3:"譤";s:2:"_";s:3:"譥";s:2:"`";s:3:"譧";s:2:"a";s:3:"譨";s:2:"b";s:3:"譩";s:2:"c";s:3:"譪";s:2:"d";s:3:"譫";s:2:"e";s:3:"譭";s:2:"f";s:3:"譮";s:2:"g";s:3:"譯";s:2:"h";s:3:"議";s:2:"i";s:3:"譱";s:2:"j";s:3:"譲";s:2:"k";s:3:"譳";s:2:"l";s:3:"譴";s:2:"m";s:3:"譵";s:2:"n";s:3:"譶";s:2:"o";s:3:"護";s:2:"p";s:3:"譸";s:2:"q";s:3:"譹";s:2:"r";s:3:"譺";s:2:"s";s:3:"譻";s:2:"t";s:3:"譼";s:2:"u";s:3:"譽";s:2:"v";s:3:"譾";s:2:"w";s:3:"譿";s:2:"x";s:3:"讀";s:2:"y";s:3:"讁";s:2:"z";s:3:"讂";s:2:"{";s:3:"讃";s:2:"|";s:3:"讄";s:2:"}";s:3:"讅";s:2:"~";s:3:"讆";s:2:"׀";s:3:"讇";s:2:"ׁ";s:3:"讈";s:2:"ׂ";s:3:"讉";s:2:"׃";s:3:"變";s:2:"ׄ";s:3:"讋";s:2:"ׅ";s:3:"讌";s:2:"׆";s:3:"讍";s:2:"ׇ";s:3:"讎";s:2:"׈";s:3:"讏";s:2:"׉";s:3:"讐";s:2:"׊";s:3:"讑";s:2:"׋";s:3:"讒";s:2:"׌";s:3:"讓";s:2:"׍";s:3:"讔";s:2:"׎";s:3:"讕";s:2:"׏";s:3:"讖";s:2:"א";s:3:"讗";s:2:"ב";s:3:"讘";s:2:"ג";s:3:"讙";s:2:"ד";s:3:"讚";s:2:"ה";s:3:"讛";s:2:"ו";s:3:"讜";s:2:"ז";s:3:"讝";s:2:"ח";s:3:"讞";s:2:"ט";s:3:"讟";s:2:"י";s:3:"讬";s:2:"ך";s:3:"讱";s:2:"כ";s:3:"讻";s:2:"ל";s:3:"诇";s:2:"ם";s:3:"诐";s:2:"מ";s:3:"诪";s:2:"ן";s:3:"谉";s:2:"נ";s:3:"谞";s:2:"ס";s:3:"住";s:2:"ע";s:3:"注";s:2:"ף";s:3:"祝";s:2:"פ";s:3:"驻";s:2:"ץ";s:3:"抓";s:2:"צ";s:3:"爪";s:2:"ק";s:3:"拽";s:2:"ר";s:3:"专";s:2:"ש";s:3:"砖";s:2:"ת";s:3:"转";s:2:"׫";s:3:"撰";s:2:"׬";s:3:"赚";s:2:"׭";s:3:"篆";s:2:"׮";s:3:"桩";s:2:"ׯ";s:3:"庄";s:2:"װ";s:3:"装";s:2:"ױ";s:3:"妆";s:2:"ײ";s:3:"撞";s:2:"׳";s:3:"壮";s:2:"״";s:3:"状";s:2:"׵";s:3:"椎";s:2:"׶";s:3:"锥";s:2:"׷";s:3:"追";s:2:"׸";s:3:"赘";s:2:"׹";s:3:"坠";s:2:"׺";s:3:"缀";s:2:"׻";s:3:"谆";s:2:"׼";s:3:"准";s:2:"׽";s:3:"捉";s:2:"׾";s:3:"拙";s:2:"׿";s:3:"卓";s:2:"";s:3:"桌";s:2:"";s:3:"琢";s:2:"";s:3:"茁";s:2:"";s:3:"酌";s:2:"";s:3:"啄";s:2:"";s:3:"着";s:2:"";s:3:"灼";s:2:"";s:3:"浊";s:2:"";s:3:"兹";s:2:"";s:3:"咨";s:2:"";s:3:"资";s:2:"";s:3:"姿";s:2:"";s:3:"滋";s:2:"";s:3:"淄";s:2:"";s:3:"孜";s:2:"";s:3:"紫";s:2:"";s:3:"仔";s:2:"";s:3:"籽";s:2:"";s:3:"滓";s:2:"";s:3:"子";s:2:"";s:3:"自";s:2:"";s:3:"渍";s:2:"";s:3:"字";s:2:"";s:3:"鬃";s:2:"";s:3:"棕";s:2:"";s:3:"踪";s:2:"";s:3:"宗";s:2:"";s:3:"综";s:2:"";s:3:"总";s:2:"";s:3:"纵";s:2:"";s:3:"邹";s:2:"";s:3:"走";s:2:"";s:3:"奏";s:2:"";s:3:"揍";s:2:"";s:3:"租";s:2:"";s:3:"足";s:2:"";s:3:"卒";s:2:"";s:3:"族";s:2:"";s:3:"祖";s:2:"";s:3:"诅";s:2:"";s:3:"阻";s:2:"";s:3:"组";s:2:"";s:3:"钻";s:2:"";s:3:"纂";s:2:"";s:3:"嘴";s:2:"";s:3:"醉";s:2:"";s:3:"最";s:2:"";s:3:"罪";s:2:"";s:3:"尊";s:2:"";s:3:"遵";s:2:"";s:3:"昨";s:2:"";s:3:"左";s:2:"";s:3:"佐";s:2:"";s:3:"柞";s:2:"";s:3:"做";s:2:"";s:3:"作";s:2:"";s:3:"坐";s:2:"";s:3:"座";s:2:"@";s:3:"谸";s:2:"A";s:3:"谹";s:2:"B";s:3:"谺";s:2:"C";s:3:"谻";s:2:"D";s:3:"谼";s:2:"E";s:3:"谽";s:2:"F";s:3:"谾";s:2:"G";s:3:"谿";s:2:"H";s:3:"豀";s:2:"I";s:3:"豂";s:2:"J";s:3:"豃";s:2:"K";s:3:"豄";s:2:"L";s:3:"豅";s:2:"M";s:3:"豈";s:2:"N";s:3:"豊";s:2:"O";s:3:"豋";s:2:"P";s:3:"豍";s:2:"Q";s:3:"豎";s:2:"R";s:3:"豏";s:2:"S";s:3:"豐";s:2:"T";s:3:"豑";s:2:"U";s:3:"豒";s:2:"V";s:3:"豓";s:2:"W";s:3:"豔";s:2:"X";s:3:"豖";s:2:"Y";s:3:"豗";s:2:"Z";s:3:"豘";s:2:"[";s:3:"豙";s:2:"\";s:3:"豛";s:2:"]";s:3:"豜";s:2:"^";s:3:"豝";s:2:"_";s:3:"豞";s:2:"`";s:3:"豟";s:2:"a";s:3:"豠";s:2:"b";s:3:"豣";s:2:"c";s:3:"豤";s:2:"d";s:3:"豥";s:2:"e";s:3:"豦";s:2:"f";s:3:"豧";s:2:"g";s:3:"豨";s:2:"h";s:3:"豩";s:2:"i";s:3:"豬";s:2:"j";s:3:"豭";s:2:"k";s:3:"豮";s:2:"l";s:3:"豯";s:2:"m";s:3:"豰";s:2:"n";s:3:"豱";s:2:"o";s:3:"豲";s:2:"p";s:3:"豴";s:2:"q";s:3:"豵";s:2:"r";s:3:"豶";s:2:"s";s:3:"豷";s:2:"t";s:3:"豻";s:2:"u";s:3:"豼";s:2:"v";s:3:"豽";s:2:"w";s:3:"豾";s:2:"x";s:3:"豿";s:2:"y";s:3:"貀";s:2:"z";s:3:"貁";s:2:"{";s:3:"貃";s:2:"|";s:3:"貄";s:2:"}";s:3:"貆";s:2:"~";s:3:"貇";s:2:"؀";s:3:"貈";s:2:"؁";s:3:"貋";s:2:"؂";s:3:"貍";s:2:"؃";s:3:"貎";s:2:"؄";s:3:"貏";s:2:"؅";s:3:"貐";s:2:"؆";s:3:"貑";s:2:"؇";s:3:"貒";s:2:"؈";s:3:"貓";s:2:"؉";s:3:"貕";s:2:"؊";s:3:"貖";s:2:"؋";s:3:"貗";s:2:"،";s:3:"貙";s:2:"؍";s:3:"貚";s:2:"؎";s:3:"貛";s:2:"؏";s:3:"貜";s:2:"ؐ";s:3:"貝";s:2:"ؑ";s:3:"貞";s:2:"ؒ";s:3:"貟";s:2:"ؓ";s:3:"負";s:2:"ؔ";s:3:"財";s:2:"ؕ";s:3:"貢";s:2:"ؖ";s:3:"貣";s:2:"ؗ";s:3:"貤";s:2:"ؘ";s:3:"貥";s:2:"ؙ";s:3:"貦";s:2:"ؚ";s:3:"貧";s:2:"؛";s:3:"貨";s:2:"؜";s:3:"販";s:2:"؝";s:3:"貪";s:2:"؞";s:3:"貫";s:2:"؟";s:3:"責";s:2:"ؠ";s:3:"貭";s:2:"ء";s:3:"亍";s:2:"آ";s:3:"丌";s:2:"أ";s:3:"兀";s:2:"ؤ";s:3:"丐";s:2:"إ";s:3:"廿";s:2:"ئ";s:3:"卅";s:2:"ا";s:3:"丕";s:2:"ب";s:3:"亘";s:2:"ة";s:3:"丞";s:2:"ت";s:3:"鬲";s:2:"ث";s:3:"孬";s:2:"ج";s:3:"噩";s:2:"ح";s:3:"丨";s:2:"خ";s:3:"禺";s:2:"د";s:3:"丿";s:2:"ذ";s:3:"匕";s:2:"ر";s:3:"乇";s:2:"ز";s:3:"夭";s:2:"س";s:3:"爻";s:2:"ش";s:3:"卮";s:2:"ص";s:3:"氐";s:2:"ض";s:3:"囟";s:2:"ط";s:3:"胤";s:2:"ظ";s:3:"馗";s:2:"ع";s:3:"毓";s:2:"غ";s:3:"睾";s:2:"ػ";s:3:"鼗";s:2:"ؼ";s:3:"丶";s:2:"ؽ";s:3:"亟";s:2:"ؾ";s:3:"鼐";s:2:"ؿ";s:3:"乜";s:2:"";s:3:"乩";s:2:"";s:3:"亓";s:2:"";s:3:"芈";s:2:"";s:3:"孛";s:2:"";s:3:"啬";s:2:"";s:3:"嘏";s:2:"";s:3:"仄";s:2:"";s:3:"厍";s:2:"";s:3:"厝";s:2:"";s:3:"厣";s:2:"";s:3:"厥";s:2:"";s:3:"厮";s:2:"";s:3:"靥";s:2:"";s:3:"赝";s:2:"";s:3:"匚";s:2:"";s:3:"叵";s:2:"";s:3:"匦";s:2:"";s:3:"匮";s:2:"";s:3:"匾";s:2:"";s:3:"赜";s:2:"";s:3:"卦";s:2:"";s:3:"卣";s:2:"";s:3:"刂";s:2:"";s:3:"刈";s:2:"";s:3:"刎";s:2:"";s:3:"刭";s:2:"";s:3:"刳";s:2:"";s:3:"刿";s:2:"";s:3:"剀";s:2:"";s:3:"剌";s:2:"";s:3:"剞";s:2:"";s:3:"剡";s:2:"";s:3:"剜";s:2:"";s:3:"蒯";s:2:"";s:3:"剽";s:2:"";s:3:"劂";s:2:"";s:3:"劁";s:2:"";s:3:"劐";s:2:"";s:3:"劓";s:2:"";s:3:"冂";s:2:"";s:3:"罔";s:2:"";s:3:"亻";s:2:"";s:3:"仃";s:2:"";s:3:"仉";s:2:"";s:3:"仂";s:2:"";s:3:"仨";s:2:"";s:3:"仡";s:2:"";s:3:"仫";s:2:"";s:3:"仞";s:2:"";s:3:"伛";s:2:"";s:3:"仳";s:2:"";s:3:"伢";s:2:"";s:3:"佤";s:2:"";s:3:"仵";s:2:"";s:3:"伥";s:2:"";s:3:"伧";s:2:"";s:3:"伉";s:2:"";s:3:"伫";s:2:"";s:3:"佞";s:2:"";s:3:"佧";s:2:"";s:3:"攸";s:2:"";s:3:"佚";s:2:"";s:3:"佝";s:2:"@";s:3:"貮";s:2:"A";s:3:"貯";s:2:"B";s:3:"貰";s:2:"C";s:3:"貱";s:2:"D";s:3:"貲";s:2:"E";s:3:"貳";s:2:"F";s:3:"貴";s:2:"G";s:3:"貵";s:2:"H";s:3:"貶";s:2:"I";s:3:"買";s:2:"J";s:3:"貸";s:2:"K";s:3:"貹";s:2:"L";s:3:"貺";s:2:"M";s:3:"費";s:2:"N";s:3:"貼";s:2:"O";s:3:"貽";s:2:"P";s:3:"貾";s:2:"Q";s:3:"貿";s:2:"R";s:3:"賀";s:2:"S";s:3:"賁";s:2:"T";s:3:"賂";s:2:"U";s:3:"賃";s:2:"V";s:3:"賄";s:2:"W";s:3:"賅";s:2:"X";s:3:"賆";s:2:"Y";s:3:"資";s:2:"Z";s:3:"賈";s:2:"[";s:3:"賉";s:2:"\";s:3:"賊";s:2:"]";s:3:"賋";s:2:"^";s:3:"賌";s:2:"_";s:3:"賍";s:2:"`";s:3:"賎";s:2:"a";s:3:"賏";s:2:"b";s:3:"賐";s:2:"c";s:3:"賑";s:2:"d";s:3:"賒";s:2:"e";s:3:"賓";s:2:"f";s:3:"賔";s:2:"g";s:3:"賕";s:2:"h";s:3:"賖";s:2:"i";s:3:"賗";s:2:"j";s:3:"賘";s:2:"k";s:3:"賙";s:2:"l";s:3:"賚";s:2:"m";s:3:"賛";s:2:"n";s:3:"賜";s:2:"o";s:3:"賝";s:2:"p";s:3:"賞";s:2:"q";s:3:"賟";s:2:"r";s:3:"賠";s:2:"s";s:3:"賡";s:2:"t";s:3:"賢";s:2:"u";s:3:"賣";s:2:"v";s:3:"賤";s:2:"w";s:3:"賥";s:2:"x";s:3:"賦";s:2:"y";s:3:"賧";s:2:"z";s:3:"賨";s:2:"{";s:3:"賩";s:2:"|";s:3:"質";s:2:"}";s:3:"賫";s:2:"~";s:3:"賬";s:2:"ـ";s:3:"賭";s:2:"ف";s:3:"賮";s:2:"ق";s:3:"賯";s:2:"ك";s:3:"賰";s:2:"ل";s:3:"賱";s:2:"م";s:3:"賲";s:2:"ن";s:3:"賳";s:2:"ه";s:3:"賴";s:2:"و";s:3:"賵";s:2:"ى";s:3:"賶";s:2:"ي";s:3:"賷";s:2:"ً";s:3:"賸";s:2:"ٌ";s:3:"賹";s:2:"ٍ";s:3:"賺";s:2:"َ";s:3:"賻";s:2:"ُ";s:3:"購";s:2:"ِ";s:3:"賽";s:2:"ّ";s:3:"賾";s:2:"ْ";s:3:"賿";s:2:"ٓ";s:3:"贀";s:2:"ٔ";s:3:"贁";s:2:"ٕ";s:3:"贂";s:2:"ٖ";s:3:"贃";s:2:"ٗ";s:3:"贄";s:2:"٘";s:3:"贅";s:2:"ٙ";s:3:"贆";s:2:"ٚ";s:3:"贇";s:2:"ٛ";s:3:"贈";s:2:"ٜ";s:3:"贉";s:2:"ٝ";s:3:"贊";s:2:"ٞ";s:3:"贋";s:2:"ٟ";s:3:"贌";s:2:"٠";s:3:"贍";s:2:"١";s:3:"佟";s:2:"٢";s:3:"佗";s:2:"٣";s:3:"伲";s:2:"٤";s:3:"伽";s:2:"٥";s:3:"佶";s:2:"٦";s:3:"佴";s:2:"٧";s:3:"侑";s:2:"٨";s:3:"侉";s:2:"٩";s:3:"侃";s:2:"٪";s:3:"侏";s:2:"٫";s:3:"佾";s:2:"٬";s:3:"佻";s:2:"٭";s:3:"侪";s:2:"ٮ";s:3:"佼";s:2:"ٯ";s:3:"侬";s:2:"ٰ";s:3:"侔";s:2:"ٱ";s:3:"俦";s:2:"ٲ";s:3:"俨";s:2:"ٳ";s:3:"俪";s:2:"ٴ";s:3:"俅";s:2:"ٵ";s:3:"俚";s:2:"ٶ";s:3:"俣";s:2:"ٷ";s:3:"俜";s:2:"ٸ";s:3:"俑";s:2:"ٹ";s:3:"俟";s:2:"ٺ";s:3:"俸";s:2:"ٻ";s:3:"倩";s:2:"ټ";s:3:"偌";s:2:"ٽ";s:3:"俳";s:2:"پ";s:3:"倬";s:2:"ٿ";s:3:"倏";s:2:"";s:3:"倮";s:2:"";s:3:"倭";s:2:"";s:3:"俾";s:2:"";s:3:"倜";s:2:"";s:3:"倌";s:2:"";s:3:"倥";s:2:"";s:3:"倨";s:2:"";s:3:"偾";s:2:"";s:3:"偃";s:2:"";s:3:"偕";s:2:"";s:3:"偈";s:2:"";s:3:"偎";s:2:"";s:3:"偬";s:2:"";s:3:"偻";s:2:"";s:3:"傥";s:2:"";s:3:"傧";s:2:"";s:3:"傩";s:2:"";s:3:"傺";s:2:"";s:3:"僖";s:2:"";s:3:"儆";s:2:"";s:3:"僭";s:2:"";s:3:"僬";s:2:"";s:3:"僦";s:2:"";s:3:"僮";s:2:"";s:3:"儇";s:2:"";s:3:"儋";s:2:"";s:3:"仝";s:2:"";s:3:"氽";s:2:"";s:3:"佘";s:2:"";s:3:"佥";s:2:"";s:3:"俎";s:2:"";s:3:"龠";s:2:"";s:3:"汆";s:2:"";s:3:"籴";s:2:"";s:3:"兮";s:2:"";s:3:"巽";s:2:"";s:3:"黉";s:2:"";s:3:"馘";s:2:"";s:3:"冁";s:2:"";s:3:"夔";s:2:"";s:3:"勹";s:2:"";s:3:"匍";s:2:"";s:3:"訇";s:2:"";s:3:"匐";s:2:"";s:3:"凫";s:2:"";s:3:"夙";s:2:"";s:3:"兕";s:2:"";s:3:"亠";s:2:"";s:3:"兖";s:2:"";s:3:"亳";s:2:"";s:3:"衮";s:2:"";s:3:"袤";s:2:"";s:3:"亵";s:2:"";s:3:"脔";s:2:"";s:3:"裒";s:2:"";s:3:"禀";s:2:"";s:3:"嬴";s:2:"";s:3:"蠃";s:2:"";s:3:"羸";s:2:"";s:3:"冫";s:2:"";s:3:"冱";s:2:"";s:3:"冽";s:2:"";s:3:"冼";s:2:"@";s:3:"贎";s:2:"A";s:3:"贏";s:2:"B";s:3:"贐";s:2:"C";s:3:"贑";s:2:"D";s:3:"贒";s:2:"E";s:3:"贓";s:2:"F";s:3:"贔";s:2:"G";s:3:"贕";s:2:"H";s:3:"贖";s:2:"I";s:3:"贗";s:2:"J";s:3:"贘";s:2:"K";s:3:"贙";s:2:"L";s:3:"贚";s:2:"M";s:3:"贛";s:2:"N";s:3:"贜";s:2:"O";s:3:"贠";s:2:"P";s:3:"赑";s:2:"Q";s:3:"赒";s:2:"R";s:3:"赗";s:2:"S";s:3:"赟";s:2:"T";s:3:"赥";s:2:"U";s:3:"赨";s:2:"V";s:3:"赩";s:2:"W";s:3:"赪";s:2:"X";s:3:"赬";s:2:"Y";s:3:"赮";s:2:"Z";s:3:"赯";s:2:"[";s:3:"赱";s:2:"\";s:3:"赲";s:2:"]";s:3:"赸";s:2:"^";s:3:"赹";s:2:"_";s:3:"赺";s:2:"`";s:3:"赻";s:2:"a";s:3:"赼";s:2:"b";s:3:"赽";s:2:"c";s:3:"赾";s:2:"d";s:3:"赿";s:2:"e";s:3:"趀";s:2:"f";s:3:"趂";s:2:"g";s:3:"趃";s:2:"h";s:3:"趆";s:2:"i";s:3:"趇";s:2:"j";s:3:"趈";s:2:"k";s:3:"趉";s:2:"l";s:3:"趌";s:2:"m";s:3:"趍";s:2:"n";s:3:"趎";s:2:"o";s:3:"趏";s:2:"p";s:3:"趐";s:2:"q";s:3:"趒";s:2:"r";s:3:"趓";s:2:"s";s:3:"趕";s:2:"t";s:3:"趖";s:2:"u";s:3:"趗";s:2:"v";s:3:"趘";s:2:"w";s:3:"趙";s:2:"x";s:3:"趚";s:2:"y";s:3:"趛";s:2:"z";s:3:"趜";s:2:"{";s:3:"趝";s:2:"|";s:3:"趞";s:2:"}";s:3:"趠";s:2:"~";s:3:"趡";s:2:"ڀ";s:3:"趢";s:2:"ځ";s:3:"趤";s:2:"ڂ";s:3:"趥";s:2:"ڃ";s:3:"趦";s:2:"ڄ";s:3:"趧";s:2:"څ";s:3:"趨";s:2:"چ";s:3:"趩";s:2:"ڇ";s:3:"趪";s:2:"ڈ";s:3:"趫";s:2:"ډ";s:3:"趬";s:2:"ڊ";s:3:"趭";s:2:"ڋ";s:3:"趮";s:2:"ڌ";s:3:"趯";s:2:"ڍ";s:3:"趰";s:2:"ڎ";s:3:"趲";s:2:"ڏ";s:3:"趶";s:2:"ڐ";s:3:"趷";s:2:"ڑ";s:3:"趹";s:2:"ڒ";s:3:"趻";s:2:"ړ";s:3:"趽";s:2:"ڔ";s:3:"跀";s:2:"ڕ";s:3:"跁";s:2:"ږ";s:3:"跂";s:2:"ڗ";s:3:"跅";s:2:"ژ";s:3:"跇";s:2:"ڙ";s:3:"跈";s:2:"ښ";s:3:"跉";s:2:"ڛ";s:3:"跊";s:2:"ڜ";s:3:"跍";s:2:"ڝ";s:3:"跐";s:2:"ڞ";s:3:"跒";s:2:"ڟ";s:3:"跓";s:2:"ڠ";s:3:"跔";s:2:"ڡ";s:3:"凇";s:2:"ڢ";s:3:"冖";s:2:"ڣ";s:3:"冢";s:2:"ڤ";s:3:"冥";s:2:"ڥ";s:3:"讠";s:2:"ڦ";s:3:"讦";s:2:"ڧ";s:3:"讧";s:2:"ڨ";s:3:"讪";s:2:"ک";s:3:"讴";s:2:"ڪ";s:3:"讵";s:2:"ګ";s:3:"讷";s:2:"ڬ";s:3:"诂";s:2:"ڭ";s:3:"诃";s:2:"ڮ";s:3:"诋";s:2:"گ";s:3:"诏";s:2:"ڰ";s:3:"诎";s:2:"ڱ";s:3:"诒";s:2:"ڲ";s:3:"诓";s:2:"ڳ";s:3:"诔";s:2:"ڴ";s:3:"诖";s:2:"ڵ";s:3:"诘";s:2:"ڶ";s:3:"诙";s:2:"ڷ";s:3:"诜";s:2:"ڸ";s:3:"诟";s:2:"ڹ";s:3:"诠";s:2:"ں";s:3:"诤";s:2:"ڻ";s:3:"诨";s:2:"ڼ";s:3:"诩";s:2:"ڽ";s:3:"诮";s:2:"ھ";s:3:"诰";s:2:"ڿ";s:3:"诳";s:2:"";s:3:"诶";s:2:"";s:3:"诹";s:2:"";s:3:"诼";s:2:"";s:3:"诿";s:2:"";s:3:"谀";s:2:"";s:3:"谂";s:2:"";s:3:"谄";s:2:"";s:3:"谇";s:2:"";s:3:"谌";s:2:"";s:3:"谏";s:2:"";s:3:"谑";s:2:"";s:3:"谒";s:2:"";s:3:"谔";s:2:"";s:3:"谕";s:2:"";s:3:"谖";s:2:"";s:3:"谙";s:2:"";s:3:"谛";s:2:"";s:3:"谘";s:2:"";s:3:"谝";s:2:"";s:3:"谟";s:2:"";s:3:"谠";s:2:"";s:3:"谡";s:2:"";s:3:"谥";s:2:"";s:3:"谧";s:2:"";s:3:"谪";s:2:"";s:3:"谫";s:2:"";s:3:"谮";s:2:"";s:3:"谯";s:2:"";s:3:"谲";s:2:"";s:3:"谳";s:2:"";s:3:"谵";s:2:"";s:3:"谶";s:2:"";s:3:"卩";s:2:"";s:3:"卺";s:2:"";s:3:"阝";s:2:"";s:3:"阢";s:2:"";s:3:"阡";s:2:"";s:3:"阱";s:2:"";s:3:"阪";s:2:"";s:3:"阽";s:2:"";s:3:"阼";s:2:"";s:3:"陂";s:2:"";s:3:"陉";s:2:"";s:3:"陔";s:2:"";s:3:"陟";s:2:"";s:3:"陧";s:2:"";s:3:"陬";s:2:"";s:3:"陲";s:2:"";s:3:"陴";s:2:"";s:3:"隈";s:2:"";s:3:"隍";s:2:"";s:3:"隗";s:2:"";s:3:"隰";s:2:"";s:3:"邗";s:2:"";s:3:"邛";s:2:"";s:3:"邝";s:2:"";s:3:"邙";s:2:"";s:3:"邬";s:2:"";s:3:"邡";s:2:"";s:3:"邴";s:2:"";s:3:"邳";s:2:"";s:3:"邶";s:2:"";s:3:"邺";s:2:"@";s:3:"跕";s:2:"A";s:3:"跘";s:2:"B";s:3:"跙";s:2:"C";s:3:"跜";s:2:"D";s:3:"跠";s:2:"E";s:3:"跡";s:2:"F";s:3:"跢";s:2:"G";s:3:"跥";s:2:"H";s:3:"跦";s:2:"I";s:3:"跧";s:2:"J";s:3:"跩";s:2:"K";s:3:"跭";s:2:"L";s:3:"跮";s:2:"M";s:3:"跰";s:2:"N";s:3:"跱";s:2:"O";s:3:"跲";s:2:"P";s:3:"跴";s:2:"Q";s:3:"跶";s:2:"R";s:3:"跼";s:2:"S";s:3:"跾";s:2:"T";s:3:"跿";s:2:"U";s:3:"踀";s:2:"V";s:3:"踁";s:2:"W";s:3:"踂";s:2:"X";s:3:"踃";s:2:"Y";s:3:"踄";s:2:"Z";s:3:"踆";s:2:"[";s:3:"踇";s:2:"\";s:3:"踈";s:2:"]";s:3:"踋";s:2:"^";s:3:"踍";s:2:"_";s:3:"踎";s:2:"`";s:3:"踐";s:2:"a";s:3:"踑";s:2:"b";s:3:"踒";s:2:"c";s:3:"踓";s:2:"d";s:3:"踕";s:2:"e";s:3:"踖";s:2:"f";s:3:"踗";s:2:"g";s:3:"踘";s:2:"h";s:3:"踙";s:2:"i";s:3:"踚";s:2:"j";s:3:"踛";s:2:"k";s:3:"踜";s:2:"l";s:3:"踠";s:2:"m";s:3:"踡";s:2:"n";s:3:"踤";s:2:"o";s:3:"踥";s:2:"p";s:3:"踦";s:2:"q";s:3:"踧";s:2:"r";s:3:"踨";s:2:"s";s:3:"踫";s:2:"t";s:3:"踭";s:2:"u";s:3:"踰";s:2:"v";s:3:"踲";s:2:"w";s:3:"踳";s:2:"x";s:3:"踴";s:2:"y";s:3:"踶";s:2:"z";s:3:"踷";s:2:"{";s:3:"踸";s:2:"|";s:3:"踻";s:2:"}";s:3:"踼";s:2:"~";s:3:"踾";s:2:"ۀ";s:3:"踿";s:2:"ہ";s:3:"蹃";s:2:"ۂ";s:3:"蹅";s:2:"ۃ";s:3:"蹆";s:2:"ۄ";s:3:"蹌";s:2:"ۅ";s:3:"蹍";s:2:"ۆ";s:3:"蹎";s:2:"ۇ";s:3:"蹏";s:2:"ۈ";s:3:"蹐";s:2:"ۉ";s:3:"蹓";s:2:"ۊ";s:3:"蹔";s:2:"ۋ";s:3:"蹕";s:2:"ی";s:3:"蹖";s:2:"ۍ";s:3:"蹗";s:2:"ێ";s:3:"蹘";s:2:"ۏ";s:3:"蹚";s:2:"ې";s:3:"蹛";s:2:"ۑ";s:3:"蹜";s:2:"ے";s:3:"蹝";s:2:"ۓ";s:3:"蹞";s:2:"۔";s:3:"蹟";s:2:"ە";s:3:"蹠";s:2:"ۖ";s:3:"蹡";s:2:"ۗ";s:3:"蹢";s:2:"ۘ";s:3:"蹣";s:2:"ۙ";s:3:"蹤";s:2:"ۚ";s:3:"蹥";s:2:"ۛ";s:3:"蹧";s:2:"ۜ";s:3:"蹨";s:2:"۝";s:3:"蹪";s:2:"۞";s:3:"蹫";s:2:"۟";s:3:"蹮";s:2:"۠";s:3:"蹱";s:2:"ۡ";s:3:"邸";s:2:"ۢ";s:3:"邰";s:2:"ۣ";s:3:"郏";s:2:"ۤ";s:3:"郅";s:2:"ۥ";s:3:"邾";s:2:"ۦ";s:3:"郐";s:2:"ۧ";s:3:"郄";s:2:"ۨ";s:3:"郇";s:2:"۩";s:3:"郓";s:2:"۪";s:3:"郦";s:2:"۫";s:3:"郢";s:2:"۬";s:3:"郜";s:2:"ۭ";s:3:"郗";s:2:"ۮ";s:3:"郛";s:2:"ۯ";s:3:"郫";s:2:"۰";s:3:"郯";s:2:"۱";s:3:"郾";s:2:"۲";s:3:"鄄";s:2:"۳";s:3:"鄢";s:2:"۴";s:3:"鄞";s:2:"۵";s:3:"鄣";s:2:"۶";s:3:"鄱";s:2:"۷";s:3:"鄯";s:2:"۸";s:3:"鄹";s:2:"۹";s:3:"酃";s:2:"ۺ";s:3:"酆";s:2:"ۻ";s:3:"刍";s:2:"ۼ";s:3:"奂";s:2:"۽";s:3:"劢";s:2:"۾";s:3:"劬";s:2:"ۿ";s:3:"劭";s:2:"";s:3:"劾";s:2:"";s:3:"哿";s:2:"";s:3:"勐";s:2:"";s:3:"勖";s:2:"";s:3:"勰";s:2:"";s:3:"叟";s:2:"";s:3:"燮";s:2:"";s:3:"矍";s:2:"";s:3:"廴";s:2:"";s:3:"凵";s:2:"";s:3:"凼";s:2:"";s:3:"鬯";s:2:"";s:3:"厶";s:2:"";s:3:"弁";s:2:"";s:3:"畚";s:2:"";s:3:"巯";s:2:"";s:3:"坌";s:2:"";s:3:"垩";s:2:"";s:3:"垡";s:2:"";s:3:"塾";s:2:"";s:3:"墼";s:2:"";s:3:"壅";s:2:"";s:3:"壑";s:2:"";s:3:"圩";s:2:"";s:3:"圬";s:2:"";s:3:"圪";s:2:"";s:3:"圳";s:2:"";s:3:"圹";s:2:"";s:3:"圮";s:2:"";s:3:"圯";s:2:"";s:3:"坜";s:2:"";s:3:"圻";s:2:"";s:3:"坂";s:2:"";s:3:"坩";s:2:"";s:3:"垅";s:2:"";s:3:"坫";s:2:"";s:3:"垆";s:2:"";s:3:"坼";s:2:"";s:3:"坻";s:2:"";s:3:"坨";s:2:"";s:3:"坭";s:2:"";s:3:"坶";s:2:"";s:3:"坳";s:2:"";s:3:"垭";s:2:"";s:3:"垤";s:2:"";s:3:"垌";s:2:"";s:3:"垲";s:2:"";s:3:"埏";s:2:"";s:3:"垧";s:2:"";s:3:"垴";s:2:"";s:3:"垓";s:2:"";s:3:"垠";s:2:"";s:3:"埕";s:2:"";s:3:"埘";s:2:"";s:3:"埚";s:2:"";s:3:"埙";s:2:"";s:3:"埒";s:2:"";s:3:"垸";s:2:"";s:3:"埴";s:2:"";s:3:"埯";s:2:"";s:3:"埸";s:2:"";s:3:"埤";s:2:"";s:3:"埝";s:2:"@";s:3:"蹳";s:2:"A";s:3:"蹵";s:2:"B";s:3:"蹷";s:2:"C";s:3:"蹸";s:2:"D";s:3:"蹹";s:2:"E";s:3:"蹺";s:2:"F";s:3:"蹻";s:2:"G";s:3:"蹽";s:2:"H";s:3:"蹾";s:2:"I";s:3:"躀";s:2:"J";s:3:"躂";s:2:"K";s:3:"躃";s:2:"L";s:3:"躄";s:2:"M";s:3:"躆";s:2:"N";s:3:"躈";s:2:"O";s:3:"躉";s:2:"P";s:3:"躊";s:2:"Q";s:3:"躋";s:2:"R";s:3:"躌";s:2:"S";s:3:"躍";s:2:"T";s:3:"躎";s:2:"U";s:3:"躑";s:2:"V";s:3:"躒";s:2:"W";s:3:"躓";s:2:"X";s:3:"躕";s:2:"Y";s:3:"躖";s:2:"Z";s:3:"躗";s:2:"[";s:3:"躘";s:2:"\";s:3:"躙";s:2:"]";s:3:"躚";s:2:"^";s:3:"躛";s:2:"_";s:3:"躝";s:2:"`";s:3:"躟";s:2:"a";s:3:"躠";s:2:"b";s:3:"躡";s:2:"c";s:3:"躢";s:2:"d";s:3:"躣";s:2:"e";s:3:"躤";s:2:"f";s:3:"躥";s:2:"g";s:3:"躦";s:2:"h";s:3:"躧";s:2:"i";s:3:"躨";s:2:"j";s:3:"躩";s:2:"k";s:3:"躪";s:2:"l";s:3:"躭";s:2:"m";s:3:"躮";s:2:"n";s:3:"躰";s:2:"o";s:3:"躱";s:2:"p";s:3:"躳";s:2:"q";s:3:"躴";s:2:"r";s:3:"躵";s:2:"s";s:3:"躶";s:2:"t";s:3:"躷";s:2:"u";s:3:"躸";s:2:"v";s:3:"躹";s:2:"w";s:3:"躻";s:2:"x";s:3:"躼";s:2:"y";s:3:"躽";s:2:"z";s:3:"躾";s:2:"{";s:3:"躿";s:2:"|";s:3:"軀";s:2:"}";s:3:"軁";s:2:"~";s:3:"軂";s:2:"܀";s:3:"軃";s:2:"܁";s:3:"軄";s:2:"܂";s:3:"軅";s:2:"܃";s:3:"軆";s:2:"܄";s:3:"軇";s:2:"܅";s:3:"軈";s:2:"܆";s:3:"軉";s:2:"܇";s:3:"車";s:2:"܈";s:3:"軋";s:2:"܉";s:3:"軌";s:2:"܊";s:3:"軍";s:2:"܋";s:3:"軏";s:2:"܌";s:3:"軐";s:2:"܍";s:3:"軑";s:2:"܎";s:3:"軒";s:2:"܏";s:3:"軓";s:2:"ܐ";s:3:"軔";s:2:"ܑ";s:3:"軕";s:2:"ܒ";s:3:"軖";s:2:"ܓ";s:3:"軗";s:2:"ܔ";s:3:"軘";s:2:"ܕ";s:3:"軙";s:2:"ܖ";s:3:"軚";s:2:"ܗ";s:3:"軛";s:2:"ܘ";s:3:"軜";s:2:"ܙ";s:3:"軝";s:2:"ܚ";s:3:"軞";s:2:"ܛ";s:3:"軟";s:2:"ܜ";s:3:"軠";s:2:"ܝ";s:3:"軡";s:2:"ܞ";s:3:"転";s:2:"ܟ";s:3:"軣";s:2:"ܠ";s:3:"軤";s:2:"ܡ";s:3:"堋";s:2:"ܢ";s:3:"堍";s:2:"ܣ";s:3:"埽";s:2:"ܤ";s:3:"埭";s:2:"ܥ";s:3:"堀";s:2:"ܦ";s:3:"堞";s:2:"ܧ";s:3:"堙";s:2:"ܨ";s:3:"塄";s:2:"ܩ";s:3:"堠";s:2:"ܪ";s:3:"塥";s:2:"ܫ";s:3:"塬";s:2:"ܬ";s:3:"墁";s:2:"ܭ";s:3:"墉";s:2:"ܮ";s:3:"墚";s:2:"ܯ";s:3:"墀";s:2:"ܰ";s:3:"馨";s:2:"ܱ";s:3:"鼙";s:2:"ܲ";s:3:"懿";s:2:"ܳ";s:3:"艹";s:2:"ܴ";s:3:"艽";s:2:"ܵ";s:3:"艿";s:2:"ܶ";s:3:"芏";s:2:"ܷ";s:3:"芊";s:2:"ܸ";s:3:"芨";s:2:"ܹ";s:3:"芄";s:2:"ܺ";s:3:"芎";s:2:"ܻ";s:3:"芑";s:2:"ܼ";s:3:"芗";s:2:"ܽ";s:3:"芙";s:2:"ܾ";s:3:"芫";s:2:"ܿ";s:3:"芸";s:2:"";s:3:"芾";s:2:"";s:3:"芰";s:2:"";s:3:"苈";s:2:"";s:3:"苊";s:2:"";s:3:"苣";s:2:"";s:3:"芘";s:2:"";s:3:"芷";s:2:"";s:3:"芮";s:2:"";s:3:"苋";s:2:"";s:3:"苌";s:2:"";s:3:"苁";s:2:"";s:3:"芩";s:2:"";s:3:"芴";s:2:"";s:3:"芡";s:2:"";s:3:"芪";s:2:"";s:3:"芟";s:2:"";s:3:"苄";s:2:"";s:3:"苎";s:2:"";s:3:"芤";s:2:"";s:3:"苡";s:2:"";s:3:"茉";s:2:"";s:3:"苷";s:2:"";s:3:"苤";s:2:"";s:3:"茏";s:2:"";s:3:"茇";s:2:"";s:3:"苜";s:2:"";s:3:"苴";s:2:"";s:3:"苒";s:2:"";s:3:"苘";s:2:"";s:3:"茌";s:2:"";s:3:"苻";s:2:"";s:3:"苓";s:2:"";s:3:"茑";s:2:"";s:3:"茚";s:2:"";s:3:"茆";s:2:"";s:3:"茔";s:2:"";s:3:"茕";s:2:"";s:3:"苠";s:2:"";s:3:"苕";s:2:"";s:3:"茜";s:2:"";s:3:"荑";s:2:"";s:3:"荛";s:2:"";s:3:"荜";s:2:"";s:3:"茈";s:2:"";s:3:"莒";s:2:"";s:3:"茼";s:2:"";s:3:"茴";s:2:"";s:3:"茱";s:2:"";s:3:"莛";s:2:"";s:3:"荞";s:2:"";s:3:"茯";s:2:"";s:3:"荏";s:2:"";s:3:"荇";s:2:"";s:3:"荃";s:2:"";s:3:"荟";s:2:"";s:3:"荀";s:2:"";s:3:"茗";s:2:"";s:3:"荠";s:2:"";s:3:"茭";s:2:"";s:3:"茺";s:2:"";s:3:"茳";s:2:"";s:3:"荦";s:2:"";s:3:"荥";s:2:"@";s:3:"軥";s:2:"A";s:3:"軦";s:2:"B";s:3:"軧";s:2:"C";s:3:"軨";s:2:"D";s:3:"軩";s:2:"E";s:3:"軪";s:2:"F";s:3:"軫";s:2:"G";s:3:"軬";s:2:"H";s:3:"軭";s:2:"I";s:3:"軮";s:2:"J";s:3:"軯";s:2:"K";s:3:"軰";s:2:"L";s:3:"軱";s:2:"M";s:3:"軲";s:2:"N";s:3:"軳";s:2:"O";s:3:"軴";s:2:"P";s:3:"軵";s:2:"Q";s:3:"軶";s:2:"R";s:3:"軷";s:2:"S";s:3:"軸";s:2:"T";s:3:"軹";s:2:"U";s:3:"軺";s:2:"V";s:3:"軻";s:2:"W";s:3:"軼";s:2:"X";s:3:"軽";s:2:"Y";s:3:"軾";s:2:"Z";s:3:"軿";s:2:"[";s:3:"輀";s:2:"\";s:3:"輁";s:2:"]";s:3:"輂";s:2:"^";s:3:"較";s:2:"_";s:3:"輄";s:2:"`";s:3:"輅";s:2:"a";s:3:"輆";s:2:"b";s:3:"輇";s:2:"c";s:3:"輈";s:2:"d";s:3:"載";s:2:"e";s:3:"輊";s:2:"f";s:3:"輋";s:2:"g";s:3:"輌";s:2:"h";s:3:"輍";s:2:"i";s:3:"輎";s:2:"j";s:3:"輏";s:2:"k";s:3:"輐";s:2:"l";s:3:"輑";s:2:"m";s:3:"輒";s:2:"n";s:3:"輓";s:2:"o";s:3:"輔";s:2:"p";s:3:"輕";s:2:"q";s:3:"輖";s:2:"r";s:3:"輗";s:2:"s";s:3:"輘";s:2:"t";s:3:"輙";s:2:"u";s:3:"輚";s:2:"v";s:3:"輛";s:2:"w";s:3:"輜";s:2:"x";s:3:"輝";s:2:"y";s:3:"輞";s:2:"z";s:3:"輟";s:2:"{";s:3:"輠";s:2:"|";s:3:"輡";s:2:"}";s:3:"輢";s:2:"~";s:3:"輣";s:2:"݀";s:3:"輤";s:2:"݁";s:3:"輥";s:2:"݂";s:3:"輦";s:2:"݃";s:3:"輧";s:2:"݄";s:3:"輨";s:2:"݅";s:3:"輩";s:2:"݆";s:3:"輪";s:2:"݇";s:3:"輫";s:2:"݈";s:3:"輬";s:2:"݉";s:3:"輭";s:2:"݊";s:3:"輮";s:2:"݋";s:3:"輯";s:2:"݌";s:3:"輰";s:2:"ݍ";s:3:"輱";s:2:"ݎ";s:3:"輲";s:2:"ݏ";s:3:"輳";s:2:"ݐ";s:3:"輴";s:2:"ݑ";s:3:"輵";s:2:"ݒ";s:3:"輶";s:2:"ݓ";s:3:"輷";s:2:"ݔ";s:3:"輸";s:2:"ݕ";s:3:"輹";s:2:"ݖ";s:3:"輺";s:2:"ݗ";s:3:"輻";s:2:"ݘ";s:3:"輼";s:2:"ݙ";s:3:"輽";s:2:"ݚ";s:3:"輾";s:2:"ݛ";s:3:"輿";s:2:"ݜ";s:3:"轀";s:2:"ݝ";s:3:"轁";s:2:"ݞ";s:3:"轂";s:2:"ݟ";s:3:"轃";s:2:"ݠ";s:3:"轄";s:2:"ݡ";s:3:"荨";s:2:"ݢ";s:3:"茛";s:2:"ݣ";s:3:"荩";s:2:"ݤ";s:3:"荬";s:2:"ݥ";s:3:"荪";s:2:"ݦ";s:3:"荭";s:2:"ݧ";s:3:"荮";s:2:"ݨ";s:3:"莰";s:2:"ݩ";s:3:"荸";s:2:"ݪ";s:3:"莳";s:2:"ݫ";s:3:"莴";s:2:"ݬ";s:3:"莠";s:2:"ݭ";s:3:"莪";s:2:"ݮ";s:3:"莓";s:2:"ݯ";s:3:"莜";s:2:"ݰ";s:3:"莅";s:2:"ݱ";s:3:"荼";s:2:"ݲ";s:3:"莶";s:2:"ݳ";s:3:"莩";s:2:"ݴ";s:3:"荽";s:2:"ݵ";s:3:"莸";s:2:"ݶ";s:3:"荻";s:2:"ݷ";s:3:"莘";s:2:"ݸ";s:3:"莞";s:2:"ݹ";s:3:"莨";s:2:"ݺ";s:3:"莺";s:2:"ݻ";s:3:"莼";s:2:"ݼ";s:3:"菁";s:2:"ݽ";s:3:"萁";s:2:"ݾ";s:3:"菥";s:2:"ݿ";s:3:"菘";s:2:"";s:3:"堇";s:2:"";s:3:"萘";s:2:"";s:3:"萋";s:2:"";s:3:"菝";s:2:"";s:3:"菽";s:2:"";s:3:"菖";s:2:"";s:3:"萜";s:2:"";s:3:"萸";s:2:"";s:3:"萑";s:2:"";s:3:"萆";s:2:"";s:3:"菔";s:2:"";s:3:"菟";s:2:"";s:3:"萏";s:2:"";s:3:"萃";s:2:"";s:3:"菸";s:2:"";s:3:"菹";s:2:"";s:3:"菪";s:2:"";s:3:"菅";s:2:"";s:3:"菀";s:2:"";s:3:"萦";s:2:"";s:3:"菰";s:2:"";s:3:"菡";s:2:"";s:3:"葜";s:2:"";s:3:"葑";s:2:"";s:3:"葚";s:2:"";s:3:"葙";s:2:"";s:3:"葳";s:2:"";s:3:"蒇";s:2:"";s:3:"蒈";s:2:"";s:3:"葺";s:2:"";s:3:"蒉";s:2:"";s:3:"葸";s:2:"";s:3:"萼";s:2:"";s:3:"葆";s:2:"";s:3:"葩";s:2:"";s:3:"葶";s:2:"";s:3:"蒌";s:2:"";s:3:"蒎";s:2:"";s:3:"萱";s:2:"";s:3:"葭";s:2:"";s:3:"蓁";s:2:"";s:3:"蓍";s:2:"";s:3:"蓐";s:2:"";s:3:"蓦";s:2:"";s:3:"蒽";s:2:"";s:3:"蓓";s:2:"";s:3:"蓊";s:2:"";s:3:"蒿";s:2:"";s:3:"蒺";s:2:"";s:3:"蓠";s:2:"";s:3:"蒡";s:2:"";s:3:"蒹";s:2:"";s:3:"蒴";s:2:"";s:3:"蒗";s:2:"";s:3:"蓥";s:2:"";s:3:"蓣";s:2:"";s:3:"蔌";s:2:"";s:3:"甍";s:2:"";s:3:"蔸";s:2:"";s:3:"蓰";s:2:"";s:3:"蔹";s:2:"";s:3:"蔟";s:2:"";s:3:"蔺";s:2:"@";s:3:"轅";s:2:"A";s:3:"轆";s:2:"B";s:3:"轇";s:2:"C";s:3:"轈";s:2:"D";s:3:"轉";s:2:"E";s:3:"轊";s:2:"F";s:3:"轋";s:2:"G";s:3:"轌";s:2:"H";s:3:"轍";s:2:"I";s:3:"轎";s:2:"J";s:3:"轏";s:2:"K";s:3:"轐";s:2:"L";s:3:"轑";s:2:"M";s:3:"轒";s:2:"N";s:3:"轓";s:2:"O";s:3:"轔";s:2:"P";s:3:"轕";s:2:"Q";s:3:"轖";s:2:"R";s:3:"轗";s:2:"S";s:3:"轘";s:2:"T";s:3:"轙";s:2:"U";s:3:"轚";s:2:"V";s:3:"轛";s:2:"W";s:3:"轜";s:2:"X";s:3:"轝";s:2:"Y";s:3:"轞";s:2:"Z";s:3:"轟";s:2:"[";s:3:"轠";s:2:"\";s:3:"轡";s:2:"]";s:3:"轢";s:2:"^";s:3:"轣";s:2:"_";s:3:"轤";s:2:"`";s:3:"轥";s:2:"a";s:3:"轪";s:2:"b";s:3:"辀";s:2:"c";s:3:"辌";s:2:"d";s:3:"辒";s:2:"e";s:3:"辝";s:2:"f";s:3:"辠";s:2:"g";s:3:"辡";s:2:"h";s:3:"辢";s:2:"i";s:3:"辤";s:2:"j";s:3:"辥";s:2:"k";s:3:"辦";s:2:"l";s:3:"辧";s:2:"m";s:3:"辪";s:2:"n";s:3:"辬";s:2:"o";s:3:"辭";s:2:"p";s:3:"辮";s:2:"q";s:3:"辯";s:2:"r";s:3:"農";s:2:"s";s:3:"辳";s:2:"t";s:3:"辴";s:2:"u";s:3:"辵";s:2:"v";s:3:"辷";s:2:"w";s:3:"辸";s:2:"x";s:3:"辺";s:2:"y";s:3:"辻";s:2:"z";s:3:"込";s:2:"{";s:3:"辿";s:2:"|";s:3:"迀";s:2:"}";s:3:"迃";s:2:"~";s:3:"迆";s:2:"ހ";s:3:"迉";s:2:"ށ";s:3:"迊";s:2:"ނ";s:3:"迋";s:2:"ރ";s:3:"迌";s:2:"ބ";s:3:"迍";s:2:"ޅ";s:3:"迏";s:2:"ކ";s:3:"迒";s:2:"އ";s:3:"迖";s:2:"ވ";s:3:"迗";s:2:"މ";s:3:"迚";s:2:"ފ";s:3:"迠";s:2:"ދ";s:3:"迡";s:2:"ތ";s:3:"迣";s:2:"ލ";s:3:"迧";s:2:"ގ";s:3:"迬";s:2:"ޏ";s:3:"迯";s:2:"ސ";s:3:"迱";s:2:"ޑ";s:3:"迲";s:2:"ޒ";s:3:"迴";s:2:"ޓ";s:3:"迵";s:2:"ޔ";s:3:"迶";s:2:"ޕ";s:3:"迺";s:2:"ޖ";s:3:"迻";s:2:"ޗ";s:3:"迼";s:2:"ޘ";s:3:"迾";s:2:"ޙ";s:3:"迿";s:2:"ޚ";s:3:"逇";s:2:"ޛ";s:3:"逈";s:2:"ޜ";s:3:"逌";s:2:"ޝ";s:3:"逎";s:2:"ޞ";s:3:"逓";s:2:"ޟ";s:3:"逕";s:2:"ޠ";s:3:"逘";s:2:"ޡ";s:3:"蕖";s:2:"ޢ";s:3:"蔻";s:2:"ޣ";s:3:"蓿";s:2:"ޤ";s:3:"蓼";s:2:"ޥ";s:3:"蕙";s:2:"ަ";s:3:"蕈";s:2:"ާ";s:3:"蕨";s:2:"ި";s:3:"蕤";s:2:"ީ";s:3:"蕞";s:2:"ު";s:3:"蕺";s:2:"ޫ";s:3:"瞢";s:2:"ެ";s:3:"蕃";s:2:"ޭ";s:3:"蕲";s:2:"ޮ";s:3:"蕻";s:2:"ޯ";s:3:"薤";s:2:"ް";s:3:"薨";s:2:"ޱ";s:3:"薇";s:2:"޲";s:3:"薏";s:2:"޳";s:3:"蕹";s:2:"޴";s:3:"薮";s:2:"޵";s:3:"薜";s:2:"޶";s:3:"薅";s:2:"޷";s:3:"薹";s:2:"޸";s:3:"薷";s:2:"޹";s:3:"薰";s:2:"޺";s:3:"藓";s:2:"޻";s:3:"藁";s:2:"޼";s:3:"藜";s:2:"޽";s:3:"藿";s:2:"޾";s:3:"蘧";s:2:"޿";s:3:"蘅";s:2:"";s:3:"蘩";s:2:"";s:3:"蘖";s:2:"";s:3:"蘼";s:2:"";s:3:"廾";s:2:"";s:3:"弈";s:2:"";s:3:"夼";s:2:"";s:3:"奁";s:2:"";s:3:"耷";s:2:"";s:3:"奕";s:2:"";s:3:"奚";s:2:"";s:3:"奘";s:2:"";s:3:"匏";s:2:"";s:3:"尢";s:2:"";s:3:"尥";s:2:"";s:3:"尬";s:2:"";s:3:"尴";s:2:"";s:3:"扌";s:2:"";s:3:"扪";s:2:"";s:3:"抟";s:2:"";s:3:"抻";s:2:"";s:3:"拊";s:2:"";s:3:"拚";s:2:"";s:3:"拗";s:2:"";s:3:"拮";s:2:"";s:3:"挢";s:2:"";s:3:"拶";s:2:"";s:3:"挹";s:2:"";s:3:"捋";s:2:"";s:3:"捃";s:2:"";s:3:"掭";s:2:"";s:3:"揶";s:2:"";s:3:"捱";s:2:"";s:3:"捺";s:2:"";s:3:"掎";s:2:"";s:3:"掴";s:2:"";s:3:"捭";s:2:"";s:3:"掬";s:2:"";s:3:"掊";s:2:"";s:3:"捩";s:2:"";s:3:"掮";s:2:"";s:3:"掼";s:2:"";s:3:"揲";s:2:"";s:3:"揸";s:2:"";s:3:"揠";s:2:"";s:3:"揿";s:2:"";s:3:"揄";s:2:"";s:3:"揞";s:2:"";s:3:"揎";s:2:"";s:3:"摒";s:2:"";s:3:"揆";s:2:"";s:3:"掾";s:2:"";s:3:"摅";s:2:"";s:3:"摁";s:2:"";s:3:"搋";s:2:"";s:3:"搛";s:2:"";s:3:"搠";s:2:"";s:3:"搌";s:2:"";s:3:"搦";s:2:"";s:3:"搡";s:2:"";s:3:"摞";s:2:"";s:3:"撄";s:2:"";s:3:"摭";s:2:"";s:3:"撖";s:2:"@";s:3:"這";s:2:"A";s:3:"逜";s:2:"B";s:3:"連";s:2:"C";s:3:"逤";s:2:"D";s:3:"逥";s:2:"E";s:3:"逧";s:2:"F";s:3:"逨";s:2:"G";s:3:"逩";s:2:"H";s:3:"逪";s:2:"I";s:3:"逫";s:2:"J";s:3:"逬";s:2:"K";s:3:"逰";s:2:"L";s:3:"週";s:2:"M";s:3:"進";s:2:"N";s:3:"逳";s:2:"O";s:3:"逴";s:2:"P";s:3:"逷";s:2:"Q";s:3:"逹";s:2:"R";s:3:"逺";s:2:"S";s:3:"逽";s:2:"T";s:3:"逿";s:2:"U";s:3:"遀";s:2:"V";s:3:"遃";s:2:"W";s:3:"遅";s:2:"X";s:3:"遆";s:2:"Y";s:3:"遈";s:2:"Z";s:3:"遉";s:2:"[";s:3:"遊";s:2:"\";s:3:"運";s:2:"]";s:3:"遌";s:2:"^";s:3:"過";s:2:"_";s:3:"達";s:2:"`";s:3:"違";s:2:"a";s:3:"遖";s:2:"b";s:3:"遙";s:2:"c";s:3:"遚";s:2:"d";s:3:"遜";s:2:"e";s:3:"遝";s:2:"f";s:3:"遞";s:2:"g";s:3:"遟";s:2:"h";s:3:"遠";s:2:"i";s:3:"遡";s:2:"j";s:3:"遤";s:2:"k";s:3:"遦";s:2:"l";s:3:"遧";s:2:"m";s:3:"適";s:2:"n";s:3:"遪";s:2:"o";s:3:"遫";s:2:"p";s:3:"遬";s:2:"q";s:3:"遯";s:2:"r";s:3:"遰";s:2:"s";s:3:"遱";s:2:"t";s:3:"遲";s:2:"u";s:3:"遳";s:2:"v";s:3:"遶";s:2:"w";s:3:"遷";s:2:"x";s:3:"選";s:2:"y";s:3:"遹";s:2:"z";s:3:"遺";s:2:"{";s:3:"遻";s:2:"|";s:3:"遼";s:2:"}";s:3:"遾";s:2:"~";s:3:"邁";s:2:"߀";s:3:"還";s:2:"߁";s:3:"邅";s:2:"߂";s:3:"邆";s:2:"߃";s:3:"邇";s:2:"߄";s:3:"邉";s:2:"߅";s:3:"邊";s:2:"߆";s:3:"邌";s:2:"߇";s:3:"邍";s:2:"߈";s:3:"邎";s:2:"߉";s:3:"邏";s:2:"ߊ";s:3:"邐";s:2:"ߋ";s:3:"邒";s:2:"ߌ";s:3:"邔";s:2:"ߍ";s:3:"邖";s:2:"ߎ";s:3:"邘";s:2:"ߏ";s:3:"邚";s:2:"ߐ";s:3:"邜";s:2:"ߑ";s:3:"邞";s:2:"ߒ";s:3:"邟";s:2:"ߓ";s:3:"邠";s:2:"ߔ";s:3:"邤";s:2:"ߕ";s:3:"邥";s:2:"ߖ";s:3:"邧";s:2:"ߗ";s:3:"邨";s:2:"ߘ";s:3:"邩";s:2:"ߙ";s:3:"邫";s:2:"ߚ";s:3:"邭";s:2:"ߛ";s:3:"邲";s:2:"ߜ";s:3:"邷";s:2:"ߝ";s:3:"邼";s:2:"ߞ";s:3:"邽";s:2:"ߟ";s:3:"邿";s:2:"ߠ";s:3:"郀";s:2:"ߡ";s:3:"摺";s:2:"ߢ";s:3:"撷";s:2:"ߣ";s:3:"撸";s:2:"ߤ";s:3:"撙";s:2:"ߥ";s:3:"撺";s:2:"ߦ";s:3:"擀";s:2:"ߧ";s:3:"擐";s:2:"ߨ";s:3:"擗";s:2:"ߩ";s:3:"擤";s:2:"ߪ";s:3:"擢";s:2:"߫";s:3:"攉";s:2:"߬";s:3:"攥";s:2:"߭";s:3:"攮";s:2:"߮";s:3:"弋";s:2:"߯";s:3:"忒";s:2:"߰";s:3:"甙";s:2:"߱";s:3:"弑";s:2:"߲";s:3:"卟";s:2:"߳";s:3:"叱";s:2:"ߴ";s:3:"叽";s:2:"ߵ";s:3:"叩";s:2:"߶";s:3:"叨";s:2:"߷";s:3:"叻";s:2:"߸";s:3:"吒";s:2:"߹";s:3:"吖";s:2:"ߺ";s:3:"吆";s:2:"߻";s:3:"呋";s:2:"߼";s:3:"呒";s:2:"߽";s:3:"呓";s:2:"߾";s:3:"呔";s:2:"߿";s:3:"呖";s:2:"";s:3:"呃";s:2:"";s:3:"吡";s:2:"";s:3:"呗";s:2:"";s:3:"呙";s:2:"";s:3:"吣";s:2:"";s:3:"吲";s:2:"";s:3:"咂";s:2:"";s:3:"咔";s:2:"";s:3:"呷";s:2:"";s:3:"呱";s:2:"";s:3:"呤";s:2:"";s:3:"咚";s:2:"";s:3:"咛";s:2:"";s:3:"咄";s:2:"";s:3:"呶";s:2:"";s:3:"呦";s:2:"";s:3:"咝";s:2:"";s:3:"哐";s:2:"";s:3:"咭";s:2:"";s:3:"哂";s:2:"";s:3:"咴";s:2:"";s:3:"哒";s:2:"";s:3:"咧";s:2:"";s:3:"咦";s:2:"";s:3:"哓";s:2:"";s:3:"哔";s:2:"";s:3:"呲";s:2:"";s:3:"咣";s:2:"";s:3:"哕";s:2:"";s:3:"咻";s:2:"";s:3:"咿";s:2:"";s:3:"哌";s:2:"";s:3:"哙";s:2:"";s:3:"哚";s:2:"";s:3:"哜";s:2:"";s:3:"咩";s:2:"";s:3:"咪";s:2:"";s:3:"咤";s:2:"";s:3:"哝";s:2:"";s:3:"哏";s:2:"";s:3:"哞";s:2:"";s:3:"唛";s:2:"";s:3:"哧";s:2:"";s:3:"唠";s:2:"";s:3:"哽";s:2:"";s:3:"唔";s:2:"";s:3:"哳";s:2:"";s:3:"唢";s:2:"";s:3:"唣";s:2:"";s:3:"唏";s:2:"";s:3:"唑";s:2:"";s:3:"唧";s:2:"";s:3:"唪";s:2:"";s:3:"啧";s:2:"";s:3:"喏";s:2:"";s:3:"喵";s:2:"";s:3:"啉";s:2:"";s:3:"啭";s:2:"";s:3:"啁";s:2:"";s:3:"啕";s:2:"";s:3:"唿";s:2:"";s:3:"啐";s:2:"";s:3:"唼";s:2:"@";s:3:"郂";s:2:"A";s:3:"郃";s:2:"B";s:3:"郆";s:2:"C";s:3:"郈";s:2:"D";s:3:"郉";s:2:"E";s:3:"郋";s:2:"F";s:3:"郌";s:2:"G";s:3:"郍";s:2:"H";s:3:"郒";s:2:"I";s:3:"郔";s:2:"J";s:3:"郕";s:2:"K";s:3:"郖";s:2:"L";s:3:"郘";s:2:"M";s:3:"郙";s:2:"N";s:3:"郚";s:2:"O";s:3:"郞";s:2:"P";s:3:"郟";s:2:"Q";s:3:"郠";s:2:"R";s:3:"郣";s:2:"S";s:3:"郤";s:2:"T";s:3:"郥";s:2:"U";s:3:"郩";s:2:"V";s:3:"郪";s:2:"W";s:3:"郬";s:2:"X";s:3:"郮";s:2:"Y";s:3:"郰";s:2:"Z";s:3:"郱";s:2:"[";s:3:"郲";s:2:"\";s:3:"郳";s:2:"]";s:3:"郵";s:2:"^";s:3:"郶";s:2:"_";s:3:"郷";s:2:"`";s:3:"郹";s:2:"a";s:3:"郺";s:2:"b";s:3:"郻";s:2:"c";s:3:"郼";s:2:"d";s:3:"郿";s:2:"e";s:3:"鄀";s:2:"f";s:3:"鄁";s:2:"g";s:3:"鄃";s:2:"h";s:3:"鄅";s:2:"i";s:3:"鄆";s:2:"j";s:3:"鄇";s:2:"k";s:3:"鄈";s:2:"l";s:3:"鄉";s:2:"m";s:3:"鄊";s:2:"n";s:3:"鄋";s:2:"o";s:3:"鄌";s:2:"p";s:3:"鄍";s:2:"q";s:3:"鄎";s:2:"r";s:3:"鄏";s:2:"s";s:3:"鄐";s:2:"t";s:3:"鄑";s:2:"u";s:3:"鄒";s:2:"v";s:3:"鄓";s:2:"w";s:3:"鄔";s:2:"x";s:3:"鄕";s:2:"y";s:3:"鄖";s:2:"z";s:3:"鄗";s:2:"{";s:3:"鄘";s:2:"|";s:3:"鄚";s:2:"}";s:3:"鄛";s:2:"~";s:3:"鄜";s:2:"";s:3:"鄝";s:2:"";s:3:"鄟";s:2:"";s:3:"鄠";s:2:"";s:3:"鄡";s:2:"";s:3:"鄤";s:2:"";s:3:"鄥";s:2:"";s:3:"鄦";s:2:"";s:3:"鄧";s:2:"";s:3:"鄨";s:2:"";s:3:"鄩";s:2:"";s:3:"鄪";s:2:"";s:3:"鄫";s:2:"";s:3:"鄬";s:2:"";s:3:"鄭";s:2:"";s:3:"鄮";s:2:"";s:3:"鄰";s:2:"";s:3:"鄲";s:2:"";s:3:"鄳";s:2:"";s:3:"鄴";s:2:"";s:3:"鄵";s:2:"";s:3:"鄶";s:2:"";s:3:"鄷";s:2:"";s:3:"鄸";s:2:"";s:3:"鄺";s:2:"";s:3:"鄻";s:2:"";s:3:"鄼";s:2:"";s:3:"鄽";s:2:"";s:3:"鄾";s:2:"";s:3:"鄿";s:2:"";s:3:"酀";s:2:"";s:3:"酁";s:2:"";s:3:"酂";s:2:"";s:3:"酄";s:2:"";s:3:"唷";s:2:"";s:3:"啖";s:2:"";s:3:"啵";s:2:"";s:3:"啶";s:2:"";s:3:"啷";s:2:"";s:3:"唳";s:2:"";s:3:"唰";s:2:"";s:3:"啜";s:2:"";s:3:"喋";s:2:"";s:3:"嗒";s:2:"";s:3:"喃";s:2:"";s:3:"喱";s:2:"";s:3:"喹";s:2:"";s:3:"喈";s:2:"";s:3:"喁";s:2:"";s:3:"喟";s:2:"";s:3:"啾";s:2:"";s:3:"嗖";s:2:"";s:3:"喑";s:2:"";s:3:"啻";s:2:"";s:3:"嗟";s:2:"";s:3:"喽";s:2:"";s:3:"喾";s:2:"";s:3:"喔";s:2:"";s:3:"喙";s:2:"";s:3:"嗪";s:2:"";s:3:"嗷";s:2:"";s:3:"嗉";s:2:"";s:3:"嘟";s:2:"";s:3:"嗑";s:2:"";s:3:"嗫";s:2:"";s:3:"嗬";s:2:"";s:3:"嗔";s:2:"";s:3:"嗦";s:2:"";s:3:"嗝";s:2:"";s:3:"嗄";s:2:"";s:3:"嗯";s:2:"";s:3:"嗥";s:2:"";s:3:"嗲";s:2:"";s:3:"嗳";s:2:"";s:3:"嗌";s:2:"";s:3:"嗍";s:2:"";s:3:"嗨";s:2:"";s:3:"嗵";s:2:"";s:3:"嗤";s:2:"";s:3:"辔";s:2:"";s:3:"嘞";s:2:"";s:3:"嘈";s:2:"";s:3:"嘌";s:2:"";s:3:"嘁";s:2:"";s:3:"嘤";s:2:"";s:3:"嘣";s:2:"";s:3:"嗾";s:2:"";s:3:"嘀";s:2:"";s:3:"嘧";s:2:"";s:3:"嘭";s:2:"";s:3:"噘";s:2:"";s:3:"嘹";s:2:"";s:3:"噗";s:2:"";s:3:"嘬";s:2:"";s:3:"噍";s:2:"";s:3:"噢";s:2:"";s:3:"噙";s:2:"";s:3:"噜";s:2:"";s:3:"噌";s:2:"";s:3:"噔";s:2:"";s:3:"嚆";s:2:"";s:3:"噤";s:2:"";s:3:"噱";s:2:"";s:3:"噫";s:2:"";s:3:"噻";s:2:"";s:3:"噼";s:2:"";s:3:"嚅";s:2:"";s:3:"嚓";s:2:"";s:3:"嚯";s:2:"";s:3:"囔";s:2:"";s:3:"囗";s:2:"";s:3:"囝";s:2:"";s:3:"囡";s:2:"";s:3:"囵";s:2:"";s:3:"囫";s:2:"";s:3:"囹";s:2:"";s:3:"囿";s:2:"";s:3:"圄";s:2:"";s:3:"圊";s:2:"";s:3:"圉";s:2:"";s:3:"圜";s:2:"";s:3:"帏";s:2:"";s:3:"帙";s:2:"";s:3:"帔";s:2:"";s:3:"帑";s:2:"";s:3:"帱";s:2:"";s:3:"帻";s:2:"";s:3:"帼";s:2:"@";s:3:"酅";s:2:"A";s:3:"酇";s:2:"B";s:3:"酈";s:2:"C";s:3:"酑";s:2:"D";s:3:"酓";s:2:"E";s:3:"酔";s:2:"F";s:3:"酕";s:2:"G";s:3:"酖";s:2:"H";s:3:"酘";s:2:"I";s:3:"酙";s:2:"J";s:3:"酛";s:2:"K";s:3:"酜";s:2:"L";s:3:"酟";s:2:"M";s:3:"酠";s:2:"N";s:3:"酦";s:2:"O";s:3:"酧";s:2:"P";s:3:"酨";s:2:"Q";s:3:"酫";s:2:"R";s:3:"酭";s:2:"S";s:3:"酳";s:2:"T";s:3:"酺";s:2:"U";s:3:"酻";s:2:"V";s:3:"酼";s:2:"W";s:3:"醀";s:2:"X";s:3:"醁";s:2:"Y";s:3:"醂";s:2:"Z";s:3:"醃";s:2:"[";s:3:"醄";s:2:"\";s:3:"醆";s:2:"]";s:3:"醈";s:2:"^";s:3:"醊";s:2:"_";s:3:"醎";s:2:"`";s:3:"醏";s:2:"a";s:3:"醓";s:2:"b";s:3:"醔";s:2:"c";s:3:"醕";s:2:"d";s:3:"醖";s:2:"e";s:3:"醗";s:2:"f";s:3:"醘";s:2:"g";s:3:"醙";s:2:"h";s:3:"醜";s:2:"i";s:3:"醝";s:2:"j";s:3:"醞";s:2:"k";s:3:"醟";s:2:"l";s:3:"醠";s:2:"m";s:3:"醡";s:2:"n";s:3:"醤";s:2:"o";s:3:"醥";s:2:"p";s:3:"醦";s:2:"q";s:3:"醧";s:2:"r";s:3:"醨";s:2:"s";s:3:"醩";s:2:"t";s:3:"醫";s:2:"u";s:3:"醬";s:2:"v";s:3:"醰";s:2:"w";s:3:"醱";s:2:"x";s:3:"醲";s:2:"y";s:3:"醳";s:2:"z";s:3:"醶";s:2:"{";s:3:"醷";s:2:"|";s:3:"醸";s:2:"}";s:3:"醹";s:2:"~";s:3:"醻";s:2:"";s:3:"醼";s:2:"";s:3:"醽";s:2:"";s:3:"醾";s:2:"";s:3:"醿";s:2:"";s:3:"釀";s:2:"";s:3:"釁";s:2:"";s:3:"釂";s:2:"";s:3:"釃";s:2:"";s:3:"釄";s:2:"";s:3:"釅";s:2:"";s:3:"釆";s:2:"";s:3:"釈";s:2:"";s:3:"釋";s:2:"";s:3:"釐";s:2:"";s:3:"釒";s:2:"";s:3:"釓";s:2:"";s:3:"釔";s:2:"";s:3:"釕";s:2:"";s:3:"釖";s:2:"";s:3:"釗";s:2:"";s:3:"釘";s:2:"";s:3:"釙";s:2:"";s:3:"釚";s:2:"";s:3:"釛";s:2:"";s:3:"針";s:2:"";s:3:"釞";s:2:"";s:3:"釟";s:2:"";s:3:"釠";s:2:"";s:3:"釡";s:2:"";s:3:"釢";s:2:"";s:3:"釣";s:2:"";s:3:"釤";s:2:"";s:3:"釥";s:2:"";s:3:"帷";s:2:"";s:3:"幄";s:2:"";s:3:"幔";s:2:"";s:3:"幛";s:2:"";s:3:"幞";s:2:"";s:3:"幡";s:2:"";s:3:"岌";s:2:"";s:3:"屺";s:2:"";s:3:"岍";s:2:"";s:3:"岐";s:2:"";s:3:"岖";s:2:"";s:3:"岈";s:2:"";s:3:"岘";s:2:"";s:3:"岙";s:2:"";s:3:"岑";s:2:"";s:3:"岚";s:2:"";s:3:"岜";s:2:"";s:3:"岵";s:2:"";s:3:"岢";s:2:"";s:3:"岽";s:2:"";s:3:"岬";s:2:"";s:3:"岫";s:2:"";s:3:"岱";s:2:"";s:3:"岣";s:2:"";s:3:"峁";s:2:"";s:3:"岷";s:2:"";s:3:"峄";s:2:"";s:3:"峒";s:2:"";s:3:"峤";s:2:"";s:3:"峋";s:2:"";s:3:"峥";s:2:"";s:3:"崂";s:2:"";s:3:"崃";s:2:"";s:3:"崧";s:2:"";s:3:"崦";s:2:"";s:3:"崮";s:2:"";s:3:"崤";s:2:"";s:3:"崞";s:2:"";s:3:"崆";s:2:"";s:3:"崛";s:2:"";s:3:"嵘";s:2:"";s:3:"崾";s:2:"";s:3:"崴";s:2:"";s:3:"崽";s:2:"";s:3:"嵬";s:2:"";s:3:"嵛";s:2:"";s:3:"嵯";s:2:"";s:3:"嵝";s:2:"";s:3:"嵫";s:2:"";s:3:"嵋";s:2:"";s:3:"嵊";s:2:"";s:3:"嵩";s:2:"";s:3:"嵴";s:2:"";s:3:"嶂";s:2:"";s:3:"嶙";s:2:"";s:3:"嶝";s:2:"";s:3:"豳";s:2:"";s:3:"嶷";s:2:"";s:3:"巅";s:2:"";s:3:"彳";s:2:"";s:3:"彷";s:2:"";s:3:"徂";s:2:"";s:3:"徇";s:2:"";s:3:"徉";s:2:"";s:3:"後";s:2:"";s:3:"徕";s:2:"";s:3:"徙";s:2:"";s:3:"徜";s:2:"";s:3:"徨";s:2:"";s:3:"徭";s:2:"";s:3:"徵";s:2:"";s:3:"徼";s:2:"";s:3:"衢";s:2:"";s:3:"彡";s:2:"";s:3:"犭";s:2:"";s:3:"犰";s:2:"";s:3:"犴";s:2:"";s:3:"犷";s:2:"";s:3:"犸";s:2:"";s:3:"狃";s:2:"";s:3:"狁";s:2:"";s:3:"狎";s:2:"";s:3:"狍";s:2:"";s:3:"狒";s:2:"";s:3:"狨";s:2:"";s:3:"狯";s:2:"";s:3:"狩";s:2:"";s:3:"狲";s:2:"";s:3:"狴";s:2:"";s:3:"狷";s:2:"";s:3:"猁";s:2:"";s:3:"狳";s:2:"";s:3:"猃";s:2:"";s:3:"狺";s:2:"@";s:3:"釦";s:2:"A";s:3:"釧";s:2:"B";s:3:"釨";s:2:"C";s:3:"釩";s:2:"D";s:3:"釪";s:2:"E";s:3:"釫";s:2:"F";s:3:"釬";s:2:"G";s:3:"釭";s:2:"H";s:3:"釮";s:2:"I";s:3:"釯";s:2:"J";s:3:"釰";s:2:"K";s:3:"釱";s:2:"L";s:3:"釲";s:2:"M";s:3:"釳";s:2:"N";s:3:"釴";s:2:"O";s:3:"釵";s:2:"P";s:3:"釶";s:2:"Q";s:3:"釷";s:2:"R";s:3:"釸";s:2:"S";s:3:"釹";s:2:"T";s:3:"釺";s:2:"U";s:3:"釻";s:2:"V";s:3:"釼";s:2:"W";s:3:"釽";s:2:"X";s:3:"釾";s:2:"Y";s:3:"釿";s:2:"Z";s:3:"鈀";s:2:"[";s:3:"鈁";s:2:"\";s:3:"鈂";s:2:"]";s:3:"鈃";s:2:"^";s:3:"鈄";s:2:"_";s:3:"鈅";s:2:"`";s:3:"鈆";s:2:"a";s:3:"鈇";s:2:"b";s:3:"鈈";s:2:"c";s:3:"鈉";s:2:"d";s:3:"鈊";s:2:"e";s:3:"鈋";s:2:"f";s:3:"鈌";s:2:"g";s:3:"鈍";s:2:"h";s:3:"鈎";s:2:"i";s:3:"鈏";s:2:"j";s:3:"鈐";s:2:"k";s:3:"鈑";s:2:"l";s:3:"鈒";s:2:"m";s:3:"鈓";s:2:"n";s:3:"鈔";s:2:"o";s:3:"鈕";s:2:"p";s:3:"鈖";s:2:"q";s:3:"鈗";s:2:"r";s:3:"鈘";s:2:"s";s:3:"鈙";s:2:"t";s:3:"鈚";s:2:"u";s:3:"鈛";s:2:"v";s:3:"鈜";s:2:"w";s:3:"鈝";s:2:"x";s:3:"鈞";s:2:"y";s:3:"鈟";s:2:"z";s:3:"鈠";s:2:"{";s:3:"鈡";s:2:"|";s:3:"鈢";s:2:"}";s:3:"鈣";s:2:"~";s:3:"鈤";s:2:"";s:3:"鈥";s:2:"";s:3:"鈦";s:2:"";s:3:"鈧";s:2:"";s:3:"鈨";s:2:"";s:3:"鈩";s:2:"";s:3:"鈪";s:2:"";s:3:"鈫";s:2:"";s:3:"鈬";s:2:"";s:3:"鈭";s:2:"";s:3:"鈮";s:2:"";s:3:"鈯";s:2:"";s:3:"鈰";s:2:"";s:3:"鈱";s:2:"";s:3:"鈲";s:2:"";s:3:"鈳";s:2:"";s:3:"鈴";s:2:"";s:3:"鈵";s:2:"";s:3:"鈶";s:2:"";s:3:"鈷";s:2:"";s:3:"鈸";s:2:"";s:3:"鈹";s:2:"";s:3:"鈺";s:2:"";s:3:"鈻";s:2:"";s:3:"鈼";s:2:"";s:3:"鈽";s:2:"";s:3:"鈾";s:2:"";s:3:"鈿";s:2:"";s:3:"鉀";s:2:"";s:3:"鉁";s:2:"";s:3:"鉂";s:2:"";s:3:"鉃";s:2:"";s:3:"鉄";s:2:"";s:3:"鉅";s:2:"";s:3:"狻";s:2:"";s:3:"猗";s:2:"";s:3:"猓";s:2:"";s:3:"猡";s:2:"";s:3:"猊";s:2:"";s:3:"猞";s:2:"";s:3:"猝";s:2:"";s:3:"猕";s:2:"";s:3:"猢";s:2:"";s:3:"猹";s:2:"";s:3:"猥";s:2:"";s:3:"猬";s:2:"";s:3:"猸";s:2:"";s:3:"猱";s:2:"";s:3:"獐";s:2:"";s:3:"獍";s:2:"";s:3:"獗";s:2:"";s:3:"獠";s:2:"";s:3:"獬";s:2:"";s:3:"獯";s:2:"";s:3:"獾";s:2:"";s:3:"舛";s:2:"";s:3:"夥";s:2:"";s:3:"飧";s:2:"";s:3:"夤";s:2:"";s:3:"夂";s:2:"";s:3:"饣";s:2:"";s:3:"饧";s:2:"";s:3:"饨";s:2:"";s:3:"饩";s:2:"";s:3:"饪";s:2:"";s:3:"饫";s:2:"";s:3:"饬";s:2:"";s:3:"饴";s:2:"";s:3:"饷";s:2:"";s:3:"饽";s:2:"";s:3:"馀";s:2:"";s:3:"馄";s:2:"";s:3:"馇";s:2:"";s:3:"馊";s:2:"";s:3:"馍";s:2:"";s:3:"馐";s:2:"";s:3:"馑";s:2:"";s:3:"馓";s:2:"";s:3:"馔";s:2:"";s:3:"馕";s:2:"";s:3:"庀";s:2:"";s:3:"庑";s:2:"";s:3:"庋";s:2:"";s:3:"庖";s:2:"";s:3:"庥";s:2:"";s:3:"庠";s:2:"";s:3:"庹";s:2:"";s:3:"庵";s:2:"";s:3:"庾";s:2:"";s:3:"庳";s:2:"";s:3:"赓";s:2:"";s:3:"廒";s:2:"";s:3:"廑";s:2:"";s:3:"廛";s:2:"";s:3:"廨";s:2:"";s:3:"廪";s:2:"";s:3:"膺";s:2:"";s:3:"忄";s:2:"";s:3:"忉";s:2:"";s:3:"忖";s:2:"";s:3:"忏";s:2:"";s:3:"怃";s:2:"";s:3:"忮";s:2:"";s:3:"怄";s:2:"";s:3:"忡";s:2:"";s:3:"忤";s:2:"";s:3:"忾";s:2:"";s:3:"怅";s:2:"";s:3:"怆";s:2:"";s:3:"忪";s:2:"";s:3:"忭";s:2:"";s:3:"忸";s:2:"";s:3:"怙";s:2:"";s:3:"怵";s:2:"";s:3:"怦";s:2:"";s:3:"怛";s:2:"";s:3:"怏";s:2:"";s:3:"怍";s:2:"";s:3:"怩";s:2:"";s:3:"怫";s:2:"";s:3:"怊";s:2:"";s:3:"怿";s:2:"";s:3:"怡";s:2:"";s:3:"恸";s:2:"";s:3:"恹";s:2:"";s:3:"恻";s:2:"";s:3:"恺";s:2:"";s:3:"恂";s:2:"@";s:3:"鉆";s:2:"A";s:3:"鉇";s:2:"B";s:3:"鉈";s:2:"C";s:3:"鉉";s:2:"D";s:3:"鉊";s:2:"E";s:3:"鉋";s:2:"F";s:3:"鉌";s:2:"G";s:3:"鉍";s:2:"H";s:3:"鉎";s:2:"I";s:3:"鉏";s:2:"J";s:3:"鉐";s:2:"K";s:3:"鉑";s:2:"L";s:3:"鉒";s:2:"M";s:3:"鉓";s:2:"N";s:3:"鉔";s:2:"O";s:3:"鉕";s:2:"P";s:3:"鉖";s:2:"Q";s:3:"鉗";s:2:"R";s:3:"鉘";s:2:"S";s:3:"鉙";s:2:"T";s:3:"鉚";s:2:"U";s:3:"鉛";s:2:"V";s:3:"鉜";s:2:"W";s:3:"鉝";s:2:"X";s:3:"鉞";s:2:"Y";s:3:"鉟";s:2:"Z";s:3:"鉠";s:2:"[";s:3:"鉡";s:2:"\";s:3:"鉢";s:2:"]";s:3:"鉣";s:2:"^";s:3:"鉤";s:2:"_";s:3:"鉥";s:2:"`";s:3:"鉦";s:2:"a";s:3:"鉧";s:2:"b";s:3:"鉨";s:2:"c";s:3:"鉩";s:2:"d";s:3:"鉪";s:2:"e";s:3:"鉫";s:2:"f";s:3:"鉬";s:2:"g";s:3:"鉭";s:2:"h";s:3:"鉮";s:2:"i";s:3:"鉯";s:2:"j";s:3:"鉰";s:2:"k";s:3:"鉱";s:2:"l";s:3:"鉲";s:2:"m";s:3:"鉳";s:2:"n";s:3:"鉵";s:2:"o";s:3:"鉶";s:2:"p";s:3:"鉷";s:2:"q";s:3:"鉸";s:2:"r";s:3:"鉹";s:2:"s";s:3:"鉺";s:2:"t";s:3:"鉻";s:2:"u";s:3:"鉼";s:2:"v";s:3:"鉽";s:2:"w";s:3:"鉾";s:2:"x";s:3:"鉿";s:2:"y";s:3:"銀";s:2:"z";s:3:"銁";s:2:"{";s:3:"銂";s:2:"|";s:3:"銃";s:2:"}";s:3:"銄";s:2:"~";s:3:"銅";s:2:"";s:3:"銆";s:2:"";s:3:"銇";s:2:"";s:3:"銈";s:2:"";s:3:"銉";s:2:"";s:3:"銊";s:2:"";s:3:"銋";s:2:"";s:3:"銌";s:2:"";s:3:"銍";s:2:"";s:3:"銏";s:2:"";s:3:"銐";s:2:"";s:3:"銑";s:2:"";s:3:"銒";s:2:"";s:3:"銓";s:2:"";s:3:"銔";s:2:"";s:3:"銕";s:2:"";s:3:"銖";s:2:"";s:3:"銗";s:2:"";s:3:"銘";s:2:"";s:3:"銙";s:2:"";s:3:"銚";s:2:"";s:3:"銛";s:2:"";s:3:"銜";s:2:"";s:3:"銝";s:2:"";s:3:"銞";s:2:"";s:3:"銟";s:2:"";s:3:"銠";s:2:"";s:3:"銡";s:2:"";s:3:"銢";s:2:"";s:3:"銣";s:2:"";s:3:"銤";s:2:"";s:3:"銥";s:2:"";s:3:"銦";s:2:"";s:3:"銧";s:2:"";s:3:"恪";s:2:"";s:3:"恽";s:2:"";s:3:"悖";s:2:"";s:3:"悚";s:2:"";s:3:"悭";s:2:"";s:3:"悝";s:2:"";s:3:"悃";s:2:"";s:3:"悒";s:2:"";s:3:"悌";s:2:"";s:3:"悛";s:2:"";s:3:"惬";s:2:"";s:3:"悻";s:2:"";s:3:"悱";s:2:"";s:3:"惝";s:2:"";s:3:"惘";s:2:"";s:3:"惆";s:2:"";s:3:"惚";s:2:"";s:3:"悴";s:2:"";s:3:"愠";s:2:"";s:3:"愦";s:2:"";s:3:"愕";s:2:"";s:3:"愣";s:2:"";s:3:"惴";s:2:"";s:3:"愀";s:2:"";s:3:"愎";s:2:"";s:3:"愫";s:2:"";s:3:"慊";s:2:"";s:3:"慵";s:2:"";s:3:"憬";s:2:"";s:3:"憔";s:2:"";s:3:"憧";s:2:"";s:3:"憷";s:2:"";s:3:"懔";s:2:"";s:3:"懵";s:2:"";s:3:"忝";s:2:"";s:3:"隳";s:2:"";s:3:"闩";s:2:"";s:3:"闫";s:2:"";s:3:"闱";s:2:"";s:3:"闳";s:2:"";s:3:"闵";s:2:"";s:3:"闶";s:2:"";s:3:"闼";s:2:"";s:3:"闾";s:2:"";s:3:"阃";s:2:"";s:3:"阄";s:2:"";s:3:"阆";s:2:"";s:3:"阈";s:2:"";s:3:"阊";s:2:"";s:3:"阋";s:2:"";s:3:"阌";s:2:"";s:3:"阍";s:2:"";s:3:"阏";s:2:"";s:3:"阒";s:2:"";s:3:"阕";s:2:"";s:3:"阖";s:2:"";s:3:"阗";s:2:"";s:3:"阙";s:2:"";s:3:"阚";s:2:"";s:3:"丬";s:2:"";s:3:"爿";s:2:"";s:3:"戕";s:2:"";s:3:"氵";s:2:"";s:3:"汔";s:2:"";s:3:"汜";s:2:"";s:3:"汊";s:2:"";s:3:"沣";s:2:"";s:3:"沅";s:2:"";s:3:"沐";s:2:"";s:3:"沔";s:2:"";s:3:"沌";s:2:"";s:3:"汨";s:2:"";s:3:"汩";s:2:"";s:3:"汴";s:2:"";s:3:"汶";s:2:"";s:3:"沆";s:2:"";s:3:"沩";s:2:"";s:3:"泐";s:2:"";s:3:"泔";s:2:"";s:3:"沭";s:2:"";s:3:"泷";s:2:"";s:3:"泸";s:2:"";s:3:"泱";s:2:"";s:3:"泗";s:2:"";s:3:"沲";s:2:"";s:3:"泠";s:2:"";s:3:"泖";s:2:"";s:3:"泺";s:2:"";s:3:"泫";s:2:"";s:3:"泮";s:2:"";s:3:"沱";s:2:"";s:3:"泓";s:2:"";s:3:"泯";s:2:"";s:3:"泾";s:2:"@";s:3:"銨";s:2:"A";s:3:"銩";s:2:"B";s:3:"銪";s:2:"C";s:3:"銫";s:2:"D";s:3:"銬";s:2:"E";s:3:"銭";s:2:"F";s:3:"銯";s:2:"G";s:3:"銰";s:2:"H";s:3:"銱";s:2:"I";s:3:"銲";s:2:"J";s:3:"銳";s:2:"K";s:3:"銴";s:2:"L";s:3:"銵";s:2:"M";s:3:"銶";s:2:"N";s:3:"銷";s:2:"O";s:3:"銸";s:2:"P";s:3:"銹";s:2:"Q";s:3:"銺";s:2:"R";s:3:"銻";s:2:"S";s:3:"銼";s:2:"T";s:3:"銽";s:2:"U";s:3:"銾";s:2:"V";s:3:"銿";s:2:"W";s:3:"鋀";s:2:"X";s:3:"鋁";s:2:"Y";s:3:"鋂";s:2:"Z";s:3:"鋃";s:2:"[";s:3:"鋄";s:2:"\";s:3:"鋅";s:2:"]";s:3:"鋆";s:2:"^";s:3:"鋇";s:2:"_";s:3:"鋉";s:2:"`";s:3:"鋊";s:2:"a";s:3:"鋋";s:2:"b";s:3:"鋌";s:2:"c";s:3:"鋍";s:2:"d";s:3:"鋎";s:2:"e";s:3:"鋏";s:2:"f";s:3:"鋐";s:2:"g";s:3:"鋑";s:2:"h";s:3:"鋒";s:2:"i";s:3:"鋓";s:2:"j";s:3:"鋔";s:2:"k";s:3:"鋕";s:2:"l";s:3:"鋖";s:2:"m";s:3:"鋗";s:2:"n";s:3:"鋘";s:2:"o";s:3:"鋙";s:2:"p";s:3:"鋚";s:2:"q";s:3:"鋛";s:2:"r";s:3:"鋜";s:2:"s";s:3:"鋝";s:2:"t";s:3:"鋞";s:2:"u";s:3:"鋟";s:2:"v";s:3:"鋠";s:2:"w";s:3:"鋡";s:2:"x";s:3:"鋢";s:2:"y";s:3:"鋣";s:2:"z";s:3:"鋤";s:2:"{";s:3:"鋥";s:2:"|";s:3:"鋦";s:2:"}";s:3:"鋧";s:2:"~";s:3:"鋨";s:2:"";s:3:"鋩";s:2:"";s:3:"鋪";s:2:"";s:3:"鋫";s:2:"";s:3:"鋬";s:2:"";s:3:"鋭";s:2:"";s:3:"鋮";s:2:"";s:3:"鋯";s:2:"";s:3:"鋰";s:2:"";s:3:"鋱";s:2:"";s:3:"鋲";s:2:"";s:3:"鋳";s:2:"";s:3:"鋴";s:2:"";s:3:"鋵";s:2:"";s:3:"鋶";s:2:"";s:3:"鋷";s:2:"";s:3:"鋸";s:2:"";s:3:"鋹";s:2:"";s:3:"鋺";s:2:"";s:3:"鋻";s:2:"";s:3:"鋼";s:2:"";s:3:"鋽";s:2:"";s:3:"鋾";s:2:"";s:3:"鋿";s:2:"";s:3:"錀";s:2:"";s:3:"錁";s:2:"";s:3:"錂";s:2:"";s:3:"錃";s:2:"";s:3:"錄";s:2:"";s:3:"錅";s:2:"";s:3:"錆";s:2:"";s:3:"錇";s:2:"";s:3:"錈";s:2:"";s:3:"錉";s:2:"";s:3:"洹";s:2:"";s:3:"洧";s:2:"";s:3:"洌";s:2:"";s:3:"浃";s:2:"";s:3:"浈";s:2:"";s:3:"洇";s:2:"";s:3:"洄";s:2:"";s:3:"洙";s:2:"";s:3:"洎";s:2:"";s:3:"洫";s:2:"";s:3:"浍";s:2:"";s:3:"洮";s:2:"";s:3:"洵";s:2:"";s:3:"洚";s:2:"";s:3:"浏";s:2:"";s:3:"浒";s:2:"";s:3:"浔";s:2:"";s:3:"洳";s:2:"";s:3:"涑";s:2:"";s:3:"浯";s:2:"";s:3:"涞";s:2:"";s:3:"涠";s:2:"";s:3:"浞";s:2:"";s:3:"涓";s:2:"";s:3:"涔";s:2:"";s:3:"浜";s:2:"";s:3:"浠";s:2:"";s:3:"浼";s:2:"";s:3:"浣";s:2:"";s:3:"渚";s:2:"";s:3:"淇";s:2:"";s:3:"淅";s:2:"";s:3:"淞";s:2:"";s:3:"渎";s:2:"";s:3:"涿";s:2:"";s:3:"淠";s:2:"";s:3:"渑";s:2:"";s:3:"淦";s:2:"";s:3:"淝";s:2:"";s:3:"淙";s:2:"";s:3:"渖";s:2:"";s:3:"涫";s:2:"";s:3:"渌";s:2:"";s:3:"涮";s:2:"";s:3:"渫";s:2:"";s:3:"湮";s:2:"";s:3:"湎";s:2:"";s:3:"湫";s:2:"";s:3:"溲";s:2:"";s:3:"湟";s:2:"";s:3:"溆";s:2:"";s:3:"湓";s:2:"";s:3:"湔";s:2:"";s:3:"渲";s:2:"";s:3:"渥";s:2:"";s:3:"湄";s:2:"";s:3:"滟";s:2:"";s:3:"溱";s:2:"";s:3:"溘";s:2:"";s:3:"滠";s:2:"";s:3:"漭";s:2:"";s:3:"滢";s:2:"";s:3:"溥";s:2:"";s:3:"溧";s:2:"";s:3:"溽";s:2:"";s:3:"溻";s:2:"";s:3:"溷";s:2:"";s:3:"滗";s:2:"";s:3:"溴";s:2:"";s:3:"滏";s:2:"";s:3:"溏";s:2:"";s:3:"滂";s:2:"";s:3:"溟";s:2:"";s:3:"潢";s:2:"";s:3:"潆";s:2:"";s:3:"潇";s:2:"";s:3:"漤";s:2:"";s:3:"漕";s:2:"";s:3:"滹";s:2:"";s:3:"漯";s:2:"";s:3:"漶";s:2:"";s:3:"潋";s:2:"";s:3:"潴";s:2:"";s:3:"漪";s:2:"";s:3:"漉";s:2:"";s:3:"漩";s:2:"";s:3:"澉";s:2:"";s:3:"澍";s:2:"";s:3:"澌";s:2:"";s:3:"潸";s:2:"";s:3:"潲";s:2:"";s:3:"潼";s:2:"";s:3:"潺";s:2:"";s:3:"濑";s:2:"@";s:3:"錊";s:2:"A";s:3:"錋";s:2:"B";s:3:"錌";s:2:"C";s:3:"錍";s:2:"D";s:3:"錎";s:2:"E";s:3:"錏";s:2:"F";s:3:"錐";s:2:"G";s:3:"錑";s:2:"H";s:3:"錒";s:2:"I";s:3:"錓";s:2:"J";s:3:"錔";s:2:"K";s:3:"錕";s:2:"L";s:3:"錖";s:2:"M";s:3:"錗";s:2:"N";s:3:"錘";s:2:"O";s:3:"錙";s:2:"P";s:3:"錚";s:2:"Q";s:3:"錛";s:2:"R";s:3:"錜";s:2:"S";s:3:"錝";s:2:"T";s:3:"錞";s:2:"U";s:3:"錟";s:2:"V";s:3:"錠";s:2:"W";s:3:"錡";s:2:"X";s:3:"錢";s:2:"Y";s:3:"錣";s:2:"Z";s:3:"錤";s:2:"[";s:3:"錥";s:2:"\";s:3:"錦";s:2:"]";s:3:"錧";s:2:"^";s:3:"錨";s:2:"_";s:3:"錩";s:2:"`";s:3:"錪";s:2:"a";s:3:"錫";s:2:"b";s:3:"錬";s:2:"c";s:3:"錭";s:2:"d";s:3:"錮";s:2:"e";s:3:"錯";s:2:"f";s:3:"錰";s:2:"g";s:3:"錱";s:2:"h";s:3:"録";s:2:"i";s:3:"錳";s:2:"j";s:3:"錴";s:2:"k";s:3:"錵";s:2:"l";s:3:"錶";s:2:"m";s:3:"錷";s:2:"n";s:3:"錸";s:2:"o";s:3:"錹";s:2:"p";s:3:"錺";s:2:"q";s:3:"錻";s:2:"r";s:3:"錼";s:2:"s";s:3:"錽";s:2:"t";s:3:"錿";s:2:"u";s:3:"鍀";s:2:"v";s:3:"鍁";s:2:"w";s:3:"鍂";s:2:"x";s:3:"鍃";s:2:"y";s:3:"鍄";s:2:"z";s:3:"鍅";s:2:"{";s:3:"鍆";s:2:"|";s:3:"鍇";s:2:"}";s:3:"鍈";s:2:"~";s:3:"鍉";s:2:"";s:3:"鍊";s:2:"";s:3:"鍋";s:2:"";s:3:"鍌";s:2:"";s:3:"鍍";s:2:"";s:3:"鍎";s:2:"";s:3:"鍏";s:2:"";s:3:"鍐";s:2:"";s:3:"鍑";s:2:"";s:3:"鍒";s:2:"";s:3:"鍓";s:2:"";s:3:"鍔";s:2:"";s:3:"鍕";s:2:"";s:3:"鍖";s:2:"";s:3:"鍗";s:2:"";s:3:"鍘";s:2:"";s:3:"鍙";s:2:"";s:3:"鍚";s:2:"";s:3:"鍛";s:2:"";s:3:"鍜";s:2:"";s:3:"鍝";s:2:"";s:3:"鍞";s:2:"";s:3:"鍟";s:2:"";s:3:"鍠";s:2:"";s:3:"鍡";s:2:"";s:3:"鍢";s:2:"";s:3:"鍣";s:2:"";s:3:"鍤";s:2:"";s:3:"鍥";s:2:"";s:3:"鍦";s:2:"";s:3:"鍧";s:2:"";s:3:"鍨";s:2:"";s:3:"鍩";s:2:"";s:3:"鍫";s:2:"";s:3:"濉";s:2:"";s:3:"澧";s:2:"";s:3:"澹";s:2:"";s:3:"澶";s:2:"";s:3:"濂";s:2:"";s:3:"濡";s:2:"";s:3:"濮";s:2:"";s:3:"濞";s:2:"";s:3:"濠";s:2:"";s:3:"濯";s:2:"";s:3:"瀚";s:2:"";s:3:"瀣";s:2:"";s:3:"瀛";s:2:"";s:3:"瀹";s:2:"";s:3:"瀵";s:2:"";s:3:"灏";s:2:"";s:3:"灞";s:2:"";s:3:"宀";s:2:"";s:3:"宄";s:2:"";s:3:"宕";s:2:"";s:3:"宓";s:2:"";s:3:"宥";s:2:"";s:3:"宸";s:2:"";s:3:"甯";s:2:"";s:3:"骞";s:2:"";s:3:"搴";s:2:"";s:3:"寤";s:2:"";s:3:"寮";s:2:"";s:3:"褰";s:2:"";s:3:"寰";s:2:"";s:3:"蹇";s:2:"";s:3:"謇";s:2:"";s:3:"辶";s:2:"";s:3:"迓";s:2:"";s:3:"迕";s:2:"";s:3:"迥";s:2:"";s:3:"迮";s:2:"";s:3:"迤";s:2:"";s:3:"迩";s:2:"";s:3:"迦";s:2:"";s:3:"迳";s:2:"";s:3:"迨";s:2:"";s:3:"逅";s:2:"";s:3:"逄";s:2:"";s:3:"逋";s:2:"";s:3:"逦";s:2:"";s:3:"逑";s:2:"";s:3:"逍";s:2:"";s:3:"逖";s:2:"";s:3:"逡";s:2:"";s:3:"逵";s:2:"";s:3:"逶";s:2:"";s:3:"逭";s:2:"";s:3:"逯";s:2:"";s:3:"遄";s:2:"";s:3:"遑";s:2:"";s:3:"遒";s:2:"";s:3:"遐";s:2:"";s:3:"遨";s:2:"";s:3:"遘";s:2:"";s:3:"遢";s:2:"";s:3:"遛";s:2:"";s:3:"暹";s:2:"";s:3:"遴";s:2:"";s:3:"遽";s:2:"";s:3:"邂";s:2:"";s:3:"邈";s:2:"";s:3:"邃";s:2:"";s:3:"邋";s:2:"";s:3:"彐";s:2:"";s:3:"彗";s:2:"";s:3:"彖";s:2:"";s:3:"彘";s:2:"";s:3:"尻";s:2:"";s:3:"咫";s:2:"";s:3:"屐";s:2:"";s:3:"屙";s:2:"";s:3:"孱";s:2:"";s:3:"屣";s:2:"";s:3:"屦";s:2:"";s:3:"羼";s:2:"";s:3:"弪";s:2:"";s:3:"弩";s:2:"";s:3:"弭";s:2:"";s:3:"艴";s:2:"";s:3:"弼";s:2:"";s:3:"鬻";s:2:"";s:3:"屮";s:2:"";s:3:"妁";s:2:"";s:3:"妃";s:2:"";s:3:"妍";s:2:"";s:3:"妩";s:2:"";s:3:"妪";s:2:"";s:3:"妣";s:2:"@";s:3:"鍬";s:2:"A";s:3:"鍭";s:2:"B";s:3:"鍮";s:2:"C";s:3:"鍯";s:2:"D";s:3:"鍰";s:2:"E";s:3:"鍱";s:2:"F";s:3:"鍲";s:2:"G";s:3:"鍳";s:2:"H";s:3:"鍴";s:2:"I";s:3:"鍵";s:2:"J";s:3:"鍶";s:2:"K";s:3:"鍷";s:2:"L";s:3:"鍸";s:2:"M";s:3:"鍹";s:2:"N";s:3:"鍺";s:2:"O";s:3:"鍻";s:2:"P";s:3:"鍼";s:2:"Q";s:3:"鍽";s:2:"R";s:3:"鍾";s:2:"S";s:3:"鍿";s:2:"T";s:3:"鎀";s:2:"U";s:3:"鎁";s:2:"V";s:3:"鎂";s:2:"W";s:3:"鎃";s:2:"X";s:3:"鎄";s:2:"Y";s:3:"鎅";s:2:"Z";s:3:"鎆";s:2:"[";s:3:"鎇";s:2:"\";s:3:"鎈";s:2:"]";s:3:"鎉";s:2:"^";s:3:"鎊";s:2:"_";s:3:"鎋";s:2:"`";s:3:"鎌";s:2:"a";s:3:"鎍";s:2:"b";s:3:"鎎";s:2:"c";s:3:"鎐";s:2:"d";s:3:"鎑";s:2:"e";s:3:"鎒";s:2:"f";s:3:"鎓";s:2:"g";s:3:"鎔";s:2:"h";s:3:"鎕";s:2:"i";s:3:"鎖";s:2:"j";s:3:"鎗";s:2:"k";s:3:"鎘";s:2:"l";s:3:"鎙";s:2:"m";s:3:"鎚";s:2:"n";s:3:"鎛";s:2:"o";s:3:"鎜";s:2:"p";s:3:"鎝";s:2:"q";s:3:"鎞";s:2:"r";s:3:"鎟";s:2:"s";s:3:"鎠";s:2:"t";s:3:"鎡";s:2:"u";s:3:"鎢";s:2:"v";s:3:"鎣";s:2:"w";s:3:"鎤";s:2:"x";s:3:"鎥";s:2:"y";s:3:"鎦";s:2:"z";s:3:"鎧";s:2:"{";s:3:"鎨";s:2:"|";s:3:"鎩";s:2:"}";s:3:"鎪";s:2:"~";s:3:"鎫";s:2:"";s:3:"鎬";s:2:"";s:3:"鎭";s:2:"";s:3:"鎮";s:2:"";s:3:"鎯";s:2:"";s:3:"鎰";s:2:"";s:3:"鎱";s:2:"";s:3:"鎲";s:2:"";s:3:"鎳";s:2:"";s:3:"鎴";s:2:"";s:3:"鎵";s:2:"";s:3:"鎶";s:2:"";s:3:"鎷";s:2:"";s:3:"鎸";s:2:"";s:3:"鎹";s:2:"";s:3:"鎺";s:2:"";s:3:"鎻";s:2:"";s:3:"鎼";s:2:"";s:3:"鎽";s:2:"";s:3:"鎾";s:2:"";s:3:"鎿";s:2:"";s:3:"鏀";s:2:"";s:3:"鏁";s:2:"";s:3:"鏂";s:2:"";s:3:"鏃";s:2:"";s:3:"鏄";s:2:"";s:3:"鏅";s:2:"";s:3:"鏆";s:2:"";s:3:"鏇";s:2:"";s:3:"鏈";s:2:"";s:3:"鏉";s:2:"";s:3:"鏋";s:2:"";s:3:"鏌";s:2:"";s:3:"鏍";s:2:"";s:3:"妗";s:2:"";s:3:"姊";s:2:"";s:3:"妫";s:2:"";s:3:"妞";s:2:"";s:3:"妤";s:2:"";s:3:"姒";s:2:"";s:3:"妲";s:2:"";s:3:"妯";s:2:"";s:3:"姗";s:2:"";s:3:"妾";s:2:"";s:3:"娅";s:2:"";s:3:"娆";s:2:"";s:3:"姝";s:2:"";s:3:"娈";s:2:"";s:3:"姣";s:2:"";s:3:"姘";s:2:"";s:3:"姹";s:2:"";s:3:"娌";s:2:"";s:3:"娉";s:2:"";s:3:"娲";s:2:"";s:3:"娴";s:2:"";s:3:"娑";s:2:"";s:3:"娣";s:2:"";s:3:"娓";s:2:"";s:3:"婀";s:2:"";s:3:"婧";s:2:"";s:3:"婊";s:2:"";s:3:"婕";s:2:"";s:3:"娼";s:2:"";s:3:"婢";s:2:"";s:3:"婵";s:2:"";s:3:"胬";s:2:"";s:3:"媪";s:2:"";s:3:"媛";s:2:"";s:3:"婷";s:2:"";s:3:"婺";s:2:"";s:3:"媾";s:2:"";s:3:"嫫";s:2:"";s:3:"媲";s:2:"";s:3:"嫒";s:2:"";s:3:"嫔";s:2:"";s:3:"媸";s:2:"";s:3:"嫠";s:2:"";s:3:"嫣";s:2:"";s:3:"嫱";s:2:"";s:3:"嫖";s:2:"";s:3:"嫦";s:2:"";s:3:"嫘";s:2:"";s:3:"嫜";s:2:"";s:3:"嬉";s:2:"";s:3:"嬗";s:2:"";s:3:"嬖";s:2:"";s:3:"嬲";s:2:"";s:3:"嬷";s:2:"";s:3:"孀";s:2:"";s:3:"尕";s:2:"";s:3:"尜";s:2:"";s:3:"孚";s:2:"";s:3:"孥";s:2:"";s:3:"孳";s:2:"";s:3:"孑";s:2:"";s:3:"孓";s:2:"";s:3:"孢";s:2:"";s:3:"驵";s:2:"";s:3:"驷";s:2:"";s:3:"驸";s:2:"";s:3:"驺";s:2:"";s:3:"驿";s:2:"";s:3:"驽";s:2:"";s:3:"骀";s:2:"";s:3:"骁";s:2:"";s:3:"骅";s:2:"";s:3:"骈";s:2:"";s:3:"骊";s:2:"";s:3:"骐";s:2:"";s:3:"骒";s:2:"";s:3:"骓";s:2:"";s:3:"骖";s:2:"";s:3:"骘";s:2:"";s:3:"骛";s:2:"";s:3:"骜";s:2:"";s:3:"骝";s:2:"";s:3:"骟";s:2:"";s:3:"骠";s:2:"";s:3:"骢";s:2:"";s:3:"骣";s:2:"";s:3:"骥";s:2:"";s:3:"骧";s:2:"";s:3:"纟";s:2:"";s:3:"纡";s:2:"";s:3:"纣";s:2:"";s:3:"纥";s:2:"";s:3:"纨";s:2:"";s:3:"纩";s:2:"@";s:3:"鏎";s:2:"A";s:3:"鏏";s:2:"B";s:3:"鏐";s:2:"C";s:3:"鏑";s:2:"D";s:3:"鏒";s:2:"E";s:3:"鏓";s:2:"F";s:3:"鏔";s:2:"G";s:3:"鏕";s:2:"H";s:3:"鏗";s:2:"I";s:3:"鏘";s:2:"J";s:3:"鏙";s:2:"K";s:3:"鏚";s:2:"L";s:3:"鏛";s:2:"M";s:3:"鏜";s:2:"N";s:3:"鏝";s:2:"O";s:3:"鏞";s:2:"P";s:3:"鏟";s:2:"Q";s:3:"鏠";s:2:"R";s:3:"鏡";s:2:"S";s:3:"鏢";s:2:"T";s:3:"鏣";s:2:"U";s:3:"鏤";s:2:"V";s:3:"鏥";s:2:"W";s:3:"鏦";s:2:"X";s:3:"鏧";s:2:"Y";s:3:"鏨";s:2:"Z";s:3:"鏩";s:2:"[";s:3:"鏪";s:2:"\";s:3:"鏫";s:2:"]";s:3:"鏬";s:2:"^";s:3:"鏭";s:2:"_";s:3:"鏮";s:2:"`";s:3:"鏯";s:2:"a";s:3:"鏰";s:2:"b";s:3:"鏱";s:2:"c";s:3:"鏲";s:2:"d";s:3:"鏳";s:2:"e";s:3:"鏴";s:2:"f";s:3:"鏵";s:2:"g";s:3:"鏶";s:2:"h";s:3:"鏷";s:2:"i";s:3:"鏸";s:2:"j";s:3:"鏹";s:2:"k";s:3:"鏺";s:2:"l";s:3:"鏻";s:2:"m";s:3:"鏼";s:2:"n";s:3:"鏽";s:2:"o";s:3:"鏾";s:2:"p";s:3:"鏿";s:2:"q";s:3:"鐀";s:2:"r";s:3:"鐁";s:2:"s";s:3:"鐂";s:2:"t";s:3:"鐃";s:2:"u";s:3:"鐄";s:2:"v";s:3:"鐅";s:2:"w";s:3:"鐆";s:2:"x";s:3:"鐇";s:2:"y";s:3:"鐈";s:2:"z";s:3:"鐉";s:2:"{";s:3:"鐊";s:2:"|";s:3:"鐋";s:2:"}";s:3:"鐌";s:2:"~";s:3:"鐍";s:2:"";s:3:"鐎";s:2:"";s:3:"鐏";s:2:"";s:3:"鐐";s:2:"";s:3:"鐑";s:2:"";s:3:"鐒";s:2:"";s:3:"鐓";s:2:"";s:3:"鐔";s:2:"";s:3:"鐕";s:2:"";s:3:"鐖";s:2:"";s:3:"鐗";s:2:"";s:3:"鐘";s:2:"";s:3:"鐙";s:2:"";s:3:"鐚";s:2:"";s:3:"鐛";s:2:"";s:3:"鐜";s:2:"";s:3:"鐝";s:2:"";s:3:"鐞";s:2:"";s:3:"鐟";s:2:"";s:3:"鐠";s:2:"";s:3:"鐡";s:2:"";s:3:"鐢";s:2:"";s:3:"鐣";s:2:"";s:3:"鐤";s:2:"";s:3:"鐥";s:2:"";s:3:"鐦";s:2:"";s:3:"鐧";s:2:"";s:3:"鐨";s:2:"";s:3:"鐩";s:2:"";s:3:"鐪";s:2:"";s:3:"鐫";s:2:"";s:3:"鐬";s:2:"";s:3:"鐭";s:2:"";s:3:"鐮";s:2:"";s:3:"纭";s:2:"";s:3:"纰";s:2:"";s:3:"纾";s:2:"";s:3:"绀";s:2:"";s:3:"绁";s:2:"";s:3:"绂";s:2:"";s:3:"绉";s:2:"";s:3:"绋";s:2:"";s:3:"绌";s:2:"";s:3:"绐";s:2:"";s:3:"绔";s:2:"";s:3:"绗";s:2:"";s:3:"绛";s:2:"";s:3:"绠";s:2:"";s:3:"绡";s:2:"";s:3:"绨";s:2:"";s:3:"绫";s:2:"";s:3:"绮";s:2:"";s:3:"绯";s:2:"";s:3:"绱";s:2:"";s:3:"绲";s:2:"";s:3:"缍";s:2:"";s:3:"绶";s:2:"";s:3:"绺";s:2:"";s:3:"绻";s:2:"";s:3:"绾";s:2:"";s:3:"缁";s:2:"";s:3:"缂";s:2:"";s:3:"缃";s:2:"";s:3:"缇";s:2:"";s:3:"缈";s:2:"";s:3:"缋";s:2:"";s:3:"缌";s:2:"";s:3:"缏";s:2:"";s:3:"缑";s:2:"";s:3:"缒";s:2:"";s:3:"缗";s:2:"";s:3:"缙";s:2:"";s:3:"缜";s:2:"";s:3:"缛";s:2:"";s:3:"缟";s:2:"";s:3:"缡";s:2:"";s:3:"缢";s:2:"";s:3:"缣";s:2:"";s:3:"缤";s:2:"";s:3:"缥";s:2:"";s:3:"缦";s:2:"";s:3:"缧";s:2:"";s:3:"缪";s:2:"";s:3:"缫";s:2:"";s:3:"缬";s:2:"";s:3:"缭";s:2:"";s:3:"缯";s:2:"";s:3:"缰";s:2:"";s:3:"缱";s:2:"";s:3:"缲";s:2:"";s:3:"缳";s:2:"";s:3:"缵";s:2:"";s:3:"幺";s:2:"";s:3:"畿";s:2:"";s:3:"巛";s:2:"";s:3:"甾";s:2:"";s:3:"邕";s:2:"";s:3:"玎";s:2:"";s:3:"玑";s:2:"";s:3:"玮";s:2:"";s:3:"玢";s:2:"";s:3:"玟";s:2:"";s:3:"珏";s:2:"";s:3:"珂";s:2:"";s:3:"珑";s:2:"";s:3:"玷";s:2:"";s:3:"玳";s:2:"";s:3:"珀";s:2:"";s:3:"珉";s:2:"";s:3:"珈";s:2:"";s:3:"珥";s:2:"";s:3:"珙";s:2:"";s:3:"顼";s:2:"";s:3:"琊";s:2:"";s:3:"珩";s:2:"";s:3:"珧";s:2:"";s:3:"珞";s:2:"";s:3:"玺";s:2:"";s:3:"珲";s:2:"";s:3:"琏";s:2:"";s:3:"琪";s:2:"";s:3:"瑛";s:2:"";s:3:"琦";s:2:"";s:3:"琥";s:2:"";s:3:"琨";s:2:"";s:3:"琰";s:2:"";s:3:"琮";s:2:"";s:3:"琬";s:2:"@";s:3:"鐯";s:2:"A";s:3:"鐰";s:2:"B";s:3:"鐱";s:2:"C";s:3:"鐲";s:2:"D";s:3:"鐳";s:2:"E";s:3:"鐴";s:2:"F";s:3:"鐵";s:2:"G";s:3:"鐶";s:2:"H";s:3:"鐷";s:2:"I";s:3:"鐸";s:2:"J";s:3:"鐹";s:2:"K";s:3:"鐺";s:2:"L";s:3:"鐻";s:2:"M";s:3:"鐼";s:2:"N";s:3:"鐽";s:2:"O";s:3:"鐿";s:2:"P";s:3:"鑀";s:2:"Q";s:3:"鑁";s:2:"R";s:3:"鑂";s:2:"S";s:3:"鑃";s:2:"T";s:3:"鑄";s:2:"U";s:3:"鑅";s:2:"V";s:3:"鑆";s:2:"W";s:3:"鑇";s:2:"X";s:3:"鑈";s:2:"Y";s:3:"鑉";s:2:"Z";s:3:"鑊";s:2:"[";s:3:"鑋";s:2:"\";s:3:"鑌";s:2:"]";s:3:"鑍";s:2:"^";s:3:"鑎";s:2:"_";s:3:"鑏";s:2:"`";s:3:"鑐";s:2:"a";s:3:"鑑";s:2:"b";s:3:"鑒";s:2:"c";s:3:"鑓";s:2:"d";s:3:"鑔";s:2:"e";s:3:"鑕";s:2:"f";s:3:"鑖";s:2:"g";s:3:"鑗";s:2:"h";s:3:"鑘";s:2:"i";s:3:"鑙";s:2:"j";s:3:"鑚";s:2:"k";s:3:"鑛";s:2:"l";s:3:"鑜";s:2:"m";s:3:"鑝";s:2:"n";s:3:"鑞";s:2:"o";s:3:"鑟";s:2:"p";s:3:"鑠";s:2:"q";s:3:"鑡";s:2:"r";s:3:"鑢";s:2:"s";s:3:"鑣";s:2:"t";s:3:"鑤";s:2:"u";s:3:"鑥";s:2:"v";s:3:"鑦";s:2:"w";s:3:"鑧";s:2:"x";s:3:"鑨";s:2:"y";s:3:"鑩";s:2:"z";s:3:"鑪";s:2:"{";s:3:"鑬";s:2:"|";s:3:"鑭";s:2:"}";s:3:"鑮";s:2:"~";s:3:"鑯";s:2:"";s:3:"鑰";s:2:"";s:3:"鑱";s:2:"";s:3:"鑲";s:2:"";s:3:"鑳";s:2:"";s:3:"鑴";s:2:"";s:3:"鑵";s:2:"";s:3:"鑶";s:2:"";s:3:"鑷";s:2:"";s:3:"鑸";s:2:"";s:3:"鑹";s:2:"";s:3:"鑺";s:2:"";s:3:"鑻";s:2:"";s:3:"鑼";s:2:"";s:3:"鑽";s:2:"";s:3:"鑾";s:2:"";s:3:"鑿";s:2:"";s:3:"钀";s:2:"";s:3:"钁";s:2:"";s:3:"钂";s:2:"";s:3:"钃";s:2:"";s:3:"钄";s:2:"";s:3:"钑";s:2:"";s:3:"钖";s:2:"";s:3:"钘";s:2:"";s:3:"铇";s:2:"";s:3:"铏";s:2:"";s:3:"铓";s:2:"";s:3:"铔";s:2:"";s:3:"铚";s:2:"";s:3:"铦";s:2:"";s:3:"铻";s:2:"";s:3:"锜";s:2:"";s:3:"锠";s:2:"";s:3:"琛";s:2:"";s:3:"琚";s:2:"";s:3:"瑁";s:2:"";s:3:"瑜";s:2:"";s:3:"瑗";s:2:"";s:3:"瑕";s:2:"";s:3:"瑙";s:2:"";s:3:"瑷";s:2:"";s:3:"瑭";s:2:"";s:3:"瑾";s:2:"";s:3:"璜";s:2:"";s:3:"璎";s:2:"";s:3:"璀";s:2:"";s:3:"璁";s:2:"";s:3:"璇";s:2:"";s:3:"璋";s:2:"";s:3:"璞";s:2:"";s:3:"璨";s:2:"";s:3:"璩";s:2:"";s:3:"璐";s:2:"";s:3:"璧";s:2:"";s:3:"瓒";s:2:"";s:3:"璺";s:2:"";s:3:"韪";s:2:"";s:3:"韫";s:2:"";s:3:"韬";s:2:"";s:3:"杌";s:2:"";s:3:"杓";s:2:"";s:3:"杞";s:2:"";s:3:"杈";s:2:"";s:3:"杩";s:2:"";s:3:"枥";s:2:"";s:3:"枇";s:2:"";s:3:"杪";s:2:"";s:3:"杳";s:2:"";s:3:"枘";s:2:"";s:3:"枧";s:2:"";s:3:"杵";s:2:"";s:3:"枨";s:2:"";s:3:"枞";s:2:"";s:3:"枭";s:2:"";s:3:"枋";s:2:"";s:3:"杷";s:2:"";s:3:"杼";s:2:"";s:3:"柰";s:2:"";s:3:"栉";s:2:"";s:3:"柘";s:2:"";s:3:"栊";s:2:"";s:3:"柩";s:2:"";s:3:"枰";s:2:"";s:3:"栌";s:2:"";s:3:"柙";s:2:"";s:3:"枵";s:2:"";s:3:"柚";s:2:"";s:3:"枳";s:2:"";s:3:"柝";s:2:"";s:3:"栀";s:2:"";s:3:"柃";s:2:"";s:3:"枸";s:2:"";s:3:"柢";s:2:"";s:3:"栎";s:2:"";s:3:"柁";s:2:"";s:3:"柽";s:2:"";s:3:"栲";s:2:"";s:3:"栳";s:2:"";s:3:"桠";s:2:"";s:3:"桡";s:2:"";s:3:"桎";s:2:"";s:3:"桢";s:2:"";s:3:"桄";s:2:"";s:3:"桤";s:2:"";s:3:"梃";s:2:"";s:3:"栝";s:2:"";s:3:"桕";s:2:"";s:3:"桦";s:2:"";s:3:"桁";s:2:"";s:3:"桧";s:2:"";s:3:"桀";s:2:"";s:3:"栾";s:2:"";s:3:"桊";s:2:"";s:3:"桉";s:2:"";s:3:"栩";s:2:"";s:3:"梵";s:2:"";s:3:"梏";s:2:"";s:3:"桴";s:2:"";s:3:"桷";s:2:"";s:3:"梓";s:2:"";s:3:"桫";s:2:"";s:3:"棂";s:2:"";s:3:"楮";s:2:"";s:3:"棼";s:2:"";s:3:"椟";s:2:"";s:3:"椠";s:2:"";s:3:"棹";s:2:"@";s:3:"锧";s:2:"A";s:3:"锳";s:2:"B";s:3:"锽";s:2:"C";s:3:"镃";s:2:"D";s:3:"镈";s:2:"E";s:3:"镋";s:2:"F";s:3:"镕";s:2:"G";s:3:"镚";s:2:"H";s:3:"镠";s:2:"I";s:3:"镮";s:2:"J";s:3:"镴";s:2:"K";s:3:"镵";s:2:"L";s:3:"長";s:2:"M";s:3:"镸";s:2:"N";s:3:"镹";s:2:"O";s:3:"镺";s:2:"P";s:3:"镻";s:2:"Q";s:3:"镼";s:2:"R";s:3:"镽";s:2:"S";s:3:"镾";s:2:"T";s:3:"門";s:2:"U";s:3:"閁";s:2:"V";s:3:"閂";s:2:"W";s:3:"閃";s:2:"X";s:3:"閄";s:2:"Y";s:3:"閅";s:2:"Z";s:3:"閆";s:2:"[";s:3:"閇";s:2:"\";s:3:"閈";s:2:"]";s:3:"閉";s:2:"^";s:3:"閊";s:2:"_";s:3:"開";s:2:"`";s:3:"閌";s:2:"a";s:3:"閍";s:2:"b";s:3:"閎";s:2:"c";s:3:"閏";s:2:"d";s:3:"閐";s:2:"e";s:3:"閑";s:2:"f";s:3:"閒";s:2:"g";s:3:"間";s:2:"h";s:3:"閔";s:2:"i";s:3:"閕";s:2:"j";s:3:"閖";s:2:"k";s:3:"閗";s:2:"l";s:3:"閘";s:2:"m";s:3:"閙";s:2:"n";s:3:"閚";s:2:"o";s:3:"閛";s:2:"p";s:3:"閜";s:2:"q";s:3:"閝";s:2:"r";s:3:"閞";s:2:"s";s:3:"閟";s:2:"t";s:3:"閠";s:2:"u";s:3:"閡";s:2:"v";s:3:"関";s:2:"w";s:3:"閣";s:2:"x";s:3:"閤";s:2:"y";s:3:"閥";s:2:"z";s:3:"閦";s:2:"{";s:3:"閧";s:2:"|";s:3:"閨";s:2:"}";s:3:"閩";s:2:"~";s:3:"閪";s:2:"";s:3:"閫";s:2:"";s:3:"閬";s:2:"";s:3:"閭";s:2:"";s:3:"閮";s:2:"";s:3:"閯";s:2:"";s:3:"閰";s:2:"";s:3:"閱";s:2:"";s:3:"閲";s:2:"";s:3:"閳";s:2:"";s:3:"閴";s:2:"";s:3:"閵";s:2:"";s:3:"閶";s:2:"";s:3:"閷";s:2:"";s:3:"閸";s:2:"";s:3:"閹";s:2:"";s:3:"閺";s:2:"";s:3:"閻";s:2:"";s:3:"閼";s:2:"";s:3:"閽";s:2:"";s:3:"閾";s:2:"";s:3:"閿";s:2:"";s:3:"闀";s:2:"";s:3:"闁";s:2:"";s:3:"闂";s:2:"";s:3:"闃";s:2:"";s:3:"闄";s:2:"";s:3:"闅";s:2:"";s:3:"闆";s:2:"";s:3:"闇";s:2:"";s:3:"闈";s:2:"";s:3:"闉";s:2:"";s:3:"闊";s:2:"";s:3:"闋";s:2:"";s:3:"椤";s:2:"";s:3:"棰";s:2:"";s:3:"椋";s:2:"";s:3:"椁";s:2:"";s:3:"楗";s:2:"";s:3:"棣";s:2:"";s:3:"椐";s:2:"";s:3:"楱";s:2:"";s:3:"椹";s:2:"";s:3:"楠";s:2:"";s:3:"楂";s:2:"";s:3:"楝";s:2:"";s:3:"榄";s:2:"";s:3:"楫";s:2:"";s:3:"榀";s:2:"";s:3:"榘";s:2:"";s:3:"楸";s:2:"";s:3:"椴";s:2:"";s:3:"槌";s:2:"";s:3:"榇";s:2:"";s:3:"榈";s:2:"";s:3:"槎";s:2:"";s:3:"榉";s:2:"";s:3:"楦";s:2:"";s:3:"楣";s:2:"";s:3:"楹";s:2:"";s:3:"榛";s:2:"";s:3:"榧";s:2:"";s:3:"榻";s:2:"";s:3:"榫";s:2:"";s:3:"榭";s:2:"";s:3:"槔";s:2:"";s:3:"榱";s:2:"";s:3:"槁";s:2:"";s:3:"槊";s:2:"";s:3:"槟";s:2:"";s:3:"榕";s:2:"";s:3:"槠";s:2:"";s:3:"榍";s:2:"";s:3:"槿";s:2:"";s:3:"樯";s:2:"";s:3:"槭";s:2:"";s:3:"樗";s:2:"";s:3:"樘";s:2:"";s:3:"橥";s:2:"";s:3:"槲";s:2:"";s:3:"橄";s:2:"";s:3:"樾";s:2:"";s:3:"檠";s:2:"";s:3:"橐";s:2:"";s:3:"橛";s:2:"";s:3:"樵";s:2:"";s:3:"檎";s:2:"";s:3:"橹";s:2:"";s:3:"樽";s:2:"";s:3:"樨";s:2:"";s:3:"橘";s:2:"";s:3:"橼";s:2:"";s:3:"檑";s:2:"";s:3:"檐";s:2:"";s:3:"檩";s:2:"";s:3:"檗";s:2:"";s:3:"檫";s:2:"";s:3:"猷";s:2:"";s:3:"獒";s:2:"";s:3:"殁";s:2:"";s:3:"殂";s:2:"";s:3:"殇";s:2:"";s:3:"殄";s:2:"";s:3:"殒";s:2:"";s:3:"殓";s:2:"";s:3:"殍";s:2:"";s:3:"殚";s:2:"";s:3:"殛";s:2:"";s:3:"殡";s:2:"";s:3:"殪";s:2:"";s:3:"轫";s:2:"";s:3:"轭";s:2:"";s:3:"轱";s:2:"";s:3:"轲";s:2:"";s:3:"轳";s:2:"";s:3:"轵";s:2:"";s:3:"轶";s:2:"";s:3:"轸";s:2:"";s:3:"轷";s:2:"";s:3:"轹";s:2:"";s:3:"轺";s:2:"";s:3:"轼";s:2:"";s:3:"轾";s:2:"";s:3:"辁";s:2:"";s:3:"辂";s:2:"";s:3:"辄";s:2:"";s:3:"辇";s:2:"";s:3:"辋";s:2:"@";s:3:"闌";s:2:"A";s:3:"闍";s:2:"B";s:3:"闎";s:2:"C";s:3:"闏";s:2:"D";s:3:"闐";s:2:"E";s:3:"闑";s:2:"F";s:3:"闒";s:2:"G";s:3:"闓";s:2:"H";s:3:"闔";s:2:"I";s:3:"闕";s:2:"J";s:3:"闖";s:2:"K";s:3:"闗";s:2:"L";s:3:"闘";s:2:"M";s:3:"闙";s:2:"N";s:3:"闚";s:2:"O";s:3:"闛";s:2:"P";s:3:"關";s:2:"Q";s:3:"闝";s:2:"R";s:3:"闞";s:2:"S";s:3:"闟";s:2:"T";s:3:"闠";s:2:"U";s:3:"闡";s:2:"V";s:3:"闢";s:2:"W";s:3:"闣";s:2:"X";s:3:"闤";s:2:"Y";s:3:"闥";s:2:"Z";s:3:"闦";s:2:"[";s:3:"闧";s:2:"\";s:3:"闬";s:2:"]";s:3:"闿";s:2:"^";s:3:"阇";s:2:"_";s:3:"阓";s:2:"`";s:3:"阘";s:2:"a";s:3:"阛";s:2:"b";s:3:"阞";s:2:"c";s:3:"阠";s:2:"d";s:3:"阣";s:2:"e";s:3:"阤";s:2:"f";s:3:"阥";s:2:"g";s:3:"阦";s:2:"h";s:3:"阧";s:2:"i";s:3:"阨";s:2:"j";s:3:"阩";s:2:"k";s:3:"阫";s:2:"l";s:3:"阬";s:2:"m";s:3:"阭";s:2:"n";s:3:"阯";s:2:"o";s:3:"阰";s:2:"p";s:3:"阷";s:2:"q";s:3:"阸";s:2:"r";s:3:"阹";s:2:"s";s:3:"阺";s:2:"t";s:3:"阾";s:2:"u";s:3:"陁";s:2:"v";s:3:"陃";s:2:"w";s:3:"陊";s:2:"x";s:3:"陎";s:2:"y";s:3:"陏";s:2:"z";s:3:"陑";s:2:"{";s:3:"陒";s:2:"|";s:3:"陓";s:2:"}";s:3:"陖";s:2:"~";s:3:"陗";s:2:"";s:3:"陘";s:2:"";s:3:"陙";s:2:"";s:3:"陚";s:2:"";s:3:"陜";s:2:"";s:3:"陝";s:2:"";s:3:"陞";s:2:"";s:3:"陠";s:2:"";s:3:"陣";s:2:"";s:3:"陥";s:2:"";s:3:"陦";s:2:"";s:3:"陫";s:2:"";s:3:"陭";s:2:"";s:3:"陮";s:2:"";s:3:"陯";s:2:"";s:3:"陰";s:2:"";s:3:"陱";s:2:"";s:3:"陳";s:2:"";s:3:"陸";s:2:"";s:3:"陹";s:2:"";s:3:"険";s:2:"";s:3:"陻";s:2:"";s:3:"陼";s:2:"";s:3:"陽";s:2:"";s:3:"陾";s:2:"";s:3:"陿";s:2:"";s:3:"隀";s:2:"";s:3:"隁";s:2:"";s:3:"隂";s:2:"";s:3:"隃";s:2:"";s:3:"隄";s:2:"";s:3:"隇";s:2:"";s:3:"隉";s:2:"";s:3:"隊";s:2:"";s:3:"辍";s:2:"";s:3:"辎";s:2:"";s:3:"辏";s:2:"";s:3:"辘";s:2:"";s:3:"辚";s:2:"";s:3:"軎";s:2:"";s:3:"戋";s:2:"";s:3:"戗";s:2:"";s:3:"戛";s:2:"";s:3:"戟";s:2:"";s:3:"戢";s:2:"";s:3:"戡";s:2:"";s:3:"戥";s:2:"";s:3:"戤";s:2:"";s:3:"戬";s:2:"";s:3:"臧";s:2:"";s:3:"瓯";s:2:"";s:3:"瓴";s:2:"";s:3:"瓿";s:2:"";s:3:"甏";s:2:"";s:3:"甑";s:2:"";s:3:"甓";s:2:"";s:3:"攴";s:2:"";s:3:"旮";s:2:"";s:3:"旯";s:2:"";s:3:"旰";s:2:"";s:3:"昊";s:2:"";s:3:"昙";s:2:"";s:3:"杲";s:2:"";s:3:"昃";s:2:"";s:3:"昕";s:2:"";s:3:"昀";s:2:"";s:3:"炅";s:2:"";s:3:"曷";s:2:"";s:3:"昝";s:2:"";s:3:"昴";s:2:"";s:3:"昱";s:2:"";s:3:"昶";s:2:"";s:3:"昵";s:2:"";s:3:"耆";s:2:"";s:3:"晟";s:2:"";s:3:"晔";s:2:"";s:3:"晁";s:2:"";s:3:"晏";s:2:"";s:3:"晖";s:2:"";s:3:"晡";s:2:"";s:3:"晗";s:2:"";s:3:"晷";s:2:"";s:3:"暄";s:2:"";s:3:"暌";s:2:"";s:3:"暧";s:2:"";s:3:"暝";s:2:"";s:3:"暾";s:2:"";s:3:"曛";s:2:"";s:3:"曜";s:2:"";s:3:"曦";s:2:"";s:3:"曩";s:2:"";s:3:"贲";s:2:"";s:3:"贳";s:2:"";s:3:"贶";s:2:"";s:3:"贻";s:2:"";s:3:"贽";s:2:"";s:3:"赀";s:2:"";s:3:"赅";s:2:"";s:3:"赆";s:2:"";s:3:"赈";s:2:"";s:3:"赉";s:2:"";s:3:"赇";s:2:"";s:3:"赍";s:2:"";s:3:"赕";s:2:"";s:3:"赙";s:2:"";s:3:"觇";s:2:"";s:3:"觊";s:2:"";s:3:"觋";s:2:"";s:3:"觌";s:2:"";s:3:"觎";s:2:"";s:3:"觏";s:2:"";s:3:"觐";s:2:"";s:3:"觑";s:2:"";s:3:"牮";s:2:"";s:3:"犟";s:2:"";s:3:"牝";s:2:"";s:3:"牦";s:2:"";s:3:"牯";s:2:"";s:3:"牾";s:2:"";s:3:"牿";s:2:"";s:3:"犄";s:2:"";s:3:"犋";s:2:"";s:3:"犍";s:2:"";s:3:"犏";s:2:"";s:3:"犒";s:2:"";s:3:"挈";s:2:"";s:3:"挲";s:2:"";s:3:"掰";s:2:"@";s:3:"隌";s:2:"A";s:3:"階";s:2:"B";s:3:"隑";s:2:"C";s:3:"隒";s:2:"D";s:3:"隓";s:2:"E";s:3:"隕";s:2:"F";s:3:"隖";s:2:"G";s:3:"隚";s:2:"H";s:3:"際";s:2:"I";s:3:"隝";s:2:"J";s:3:"隞";s:2:"K";s:3:"隟";s:2:"L";s:3:"隠";s:2:"M";s:3:"隡";s:2:"N";s:3:"隢";s:2:"O";s:3:"隣";s:2:"P";s:3:"隤";s:2:"Q";s:3:"隥";s:2:"R";s:3:"隦";s:2:"S";s:3:"隨";s:2:"T";s:3:"隩";s:2:"U";s:3:"險";s:2:"V";s:3:"隫";s:2:"W";s:3:"隬";s:2:"X";s:3:"隭";s:2:"Y";s:3:"隮";s:2:"Z";s:3:"隯";s:2:"[";s:3:"隱";s:2:"\";s:3:"隲";s:2:"]";s:3:"隴";s:2:"^";s:3:"隵";s:2:"_";s:3:"隷";s:2:"`";s:3:"隸";s:2:"a";s:3:"隺";s:2:"b";s:3:"隻";s:2:"c";s:3:"隿";s:2:"d";s:3:"雂";s:2:"e";s:3:"雃";s:2:"f";s:3:"雈";s:2:"g";s:3:"雊";s:2:"h";s:3:"雋";s:2:"i";s:3:"雐";s:2:"j";s:3:"雑";s:2:"k";s:3:"雓";s:2:"l";s:3:"雔";s:2:"m";s:3:"雖";s:2:"n";s:3:"雗";s:2:"o";s:3:"雘";s:2:"p";s:3:"雙";s:2:"q";s:3:"雚";s:2:"r";s:3:"雛";s:2:"s";s:3:"雜";s:2:"t";s:3:"雝";s:2:"u";s:3:"雞";s:2:"v";s:3:"雟";s:2:"w";s:3:"雡";s:2:"x";s:3:"離";s:2:"y";s:3:"難";s:2:"z";s:3:"雤";s:2:"{";s:3:"雥";s:2:"|";s:3:"雦";s:2:"}";s:3:"雧";s:2:"~";s:3:"雫";s:2:"";s:3:"雬";s:2:"";s:3:"雭";s:2:"";s:3:"雮";s:2:"";s:3:"雰";s:2:"";s:3:"雱";s:2:"";s:3:"雲";s:2:"";s:3:"雴";s:2:"";s:3:"雵";s:2:"";s:3:"雸";s:2:"";s:3:"雺";s:2:"";s:3:"電";s:2:"";s:3:"雼";s:2:"";s:3:"雽";s:2:"";s:3:"雿";s:2:"";s:3:"霂";s:2:"";s:3:"霃";s:2:"";s:3:"霅";s:2:"";s:3:"霊";s:2:"";s:3:"霋";s:2:"";s:3:"霌";s:2:"";s:3:"霐";s:2:"";s:3:"霑";s:2:"";s:3:"霒";s:2:"";s:3:"霔";s:2:"";s:3:"霕";s:2:"";s:3:"霗";s:2:"";s:3:"霘";s:2:"";s:3:"霙";s:2:"";s:3:"霚";s:2:"";s:3:"霛";s:2:"";s:3:"霝";s:2:"";s:3:"霟";s:2:"";s:3:"霠";s:2:"";s:3:"搿";s:2:"";s:3:"擘";s:2:"";s:3:"耄";s:2:"";s:3:"毪";s:2:"";s:3:"毳";s:2:"";s:3:"毽";s:2:"";s:3:"毵";s:2:"";s:3:"毹";s:2:"";s:3:"氅";s:2:"";s:3:"氇";s:2:"";s:3:"氆";s:2:"";s:3:"氍";s:2:"";s:3:"氕";s:2:"";s:3:"氘";s:2:"";s:3:"氙";s:2:"";s:3:"氚";s:2:"";s:3:"氡";s:2:"";s:3:"氩";s:2:"";s:3:"氤";s:2:"";s:3:"氪";s:2:"";s:3:"氲";s:2:"";s:3:"攵";s:2:"";s:3:"敕";s:2:"";s:3:"敫";s:2:"";s:3:"牍";s:2:"";s:3:"牒";s:2:"";s:3:"牖";s:2:"";s:3:"爰";s:2:"";s:3:"虢";s:2:"";s:3:"刖";s:2:"";s:3:"肟";s:2:"";s:3:"肜";s:2:"";s:3:"肓";s:2:"";s:3:"肼";s:2:"";s:3:"朊";s:2:"";s:3:"肽";s:2:"";s:3:"肱";s:2:"";s:3:"肫";s:2:"";s:3:"肭";s:2:"";s:3:"肴";s:2:"";s:3:"肷";s:2:"";s:3:"胧";s:2:"";s:3:"胨";s:2:"";s:3:"胩";s:2:"";s:3:"胪";s:2:"";s:3:"胛";s:2:"";s:3:"胂";s:2:"";s:3:"胄";s:2:"";s:3:"胙";s:2:"";s:3:"胍";s:2:"";s:3:"胗";s:2:"";s:3:"朐";s:2:"";s:3:"胝";s:2:"";s:3:"胫";s:2:"";s:3:"胱";s:2:"";s:3:"胴";s:2:"";s:3:"胭";s:2:"";s:3:"脍";s:2:"";s:3:"脎";s:2:"";s:3:"胲";s:2:"";s:3:"胼";s:2:"";s:3:"朕";s:2:"";s:3:"脒";s:2:"";s:3:"豚";s:2:"";s:3:"脶";s:2:"";s:3:"脞";s:2:"";s:3:"脬";s:2:"";s:3:"脘";s:2:"";s:3:"脲";s:2:"";s:3:"腈";s:2:"";s:3:"腌";s:2:"";s:3:"腓";s:2:"";s:3:"腴";s:2:"";s:3:"腙";s:2:"";s:3:"腚";s:2:"";s:3:"腱";s:2:"";s:3:"腠";s:2:"";s:3:"腩";s:2:"";s:3:"腼";s:2:"";s:3:"腽";s:2:"";s:3:"腭";s:2:"";s:3:"腧";s:2:"";s:3:"塍";s:2:"";s:3:"媵";s:2:"";s:3:"膈";s:2:"";s:3:"膂";s:2:"";s:3:"膑";s:2:"";s:3:"滕";s:2:"";s:3:"膣";s:2:"";s:3:"膪";s:2:"";s:3:"臌";s:2:"";s:3:"朦";s:2:"";s:3:"臊";s:2:"";s:3:"膻";s:2:"@";s:3:"霡";s:2:"A";s:3:"霢";s:2:"B";s:3:"霣";s:2:"C";s:3:"霤";s:2:"D";s:3:"霥";s:2:"E";s:3:"霦";s:2:"F";s:3:"霧";s:2:"G";s:3:"霨";s:2:"H";s:3:"霩";s:2:"I";s:3:"霫";s:2:"J";s:3:"霬";s:2:"K";s:3:"霮";s:2:"L";s:3:"霯";s:2:"M";s:3:"霱";s:2:"N";s:3:"霳";s:2:"O";s:3:"霴";s:2:"P";s:3:"霵";s:2:"Q";s:3:"霶";s:2:"R";s:3:"霷";s:2:"S";s:3:"霺";s:2:"T";s:3:"霻";s:2:"U";s:3:"霼";s:2:"V";s:3:"霽";s:2:"W";s:3:"霿";s:2:"X";s:3:"靀";s:2:"Y";s:3:"靁";s:2:"Z";s:3:"靂";s:2:"[";s:3:"靃";s:2:"\";s:3:"靄";s:2:"]";s:3:"靅";s:2:"^";s:3:"靆";s:2:"_";s:3:"靇";s:2:"`";s:3:"靈";s:2:"a";s:3:"靉";s:2:"b";s:3:"靊";s:2:"c";s:3:"靋";s:2:"d";s:3:"靌";s:2:"e";s:3:"靍";s:2:"f";s:3:"靎";s:2:"g";s:3:"靏";s:2:"h";s:3:"靐";s:2:"i";s:3:"靑";s:2:"j";s:3:"靔";s:2:"k";s:3:"靕";s:2:"l";s:3:"靗";s:2:"m";s:3:"靘";s:2:"n";s:3:"靚";s:2:"o";s:3:"靜";s:2:"p";s:3:"靝";s:2:"q";s:3:"靟";s:2:"r";s:3:"靣";s:2:"s";s:3:"靤";s:2:"t";s:3:"靦";s:2:"u";s:3:"靧";s:2:"v";s:3:"靨";s:2:"w";s:3:"靪";s:2:"x";s:3:"靫";s:2:"y";s:3:"靬";s:2:"z";s:3:"靭";s:2:"{";s:3:"靮";s:2:"|";s:3:"靯";s:2:"}";s:3:"靰";s:2:"~";s:3:"靱";s:2:"";s:3:"靲";s:2:"";s:3:"靵";s:2:"";s:3:"靷";s:2:"";s:3:"靸";s:2:"";s:3:"靹";s:2:"";s:3:"靺";s:2:"";s:3:"靻";s:2:"";s:3:"靽";s:2:"";s:3:"靾";s:2:"";s:3:"靿";s:2:"";s:3:"鞀";s:2:"";s:3:"鞁";s:2:"";s:3:"鞂";s:2:"";s:3:"鞃";s:2:"";s:3:"鞄";s:2:"";s:3:"鞆";s:2:"";s:3:"鞇";s:2:"";s:3:"鞈";s:2:"";s:3:"鞉";s:2:"";s:3:"鞊";s:2:"";s:3:"鞌";s:2:"";s:3:"鞎";s:2:"";s:3:"鞏";s:2:"";s:3:"鞐";s:2:"";s:3:"鞓";s:2:"";s:3:"鞕";s:2:"";s:3:"鞖";s:2:"";s:3:"鞗";s:2:"";s:3:"鞙";s:2:"";s:3:"鞚";s:2:"";s:3:"鞛";s:2:"";s:3:"鞜";s:2:"";s:3:"鞝";s:2:"";s:3:"臁";s:2:"";s:3:"膦";s:2:"";s:3:"欤";s:2:"";s:3:"欷";s:2:"";s:3:"欹";s:2:"";s:3:"歃";s:2:"";s:3:"歆";s:2:"";s:3:"歙";s:2:"";s:3:"飑";s:2:"";s:3:"飒";s:2:"";s:3:"飓";s:2:"";s:3:"飕";s:2:"";s:3:"飙";s:2:"";s:3:"飚";s:2:"";s:3:"殳";s:2:"";s:3:"彀";s:2:"";s:3:"毂";s:2:"";s:3:"觳";s:2:"";s:3:"斐";s:2:"";s:3:"齑";s:2:"";s:3:"斓";s:2:"";s:3:"於";s:2:"";s:3:"旆";s:2:"";s:3:"旄";s:2:"";s:3:"旃";s:2:"";s:3:"旌";s:2:"";s:3:"旎";s:2:"";s:3:"旒";s:2:"";s:3:"旖";s:2:"";s:3:"炀";s:2:"";s:3:"炜";s:2:"";s:3:"炖";s:2:"";s:3:"炝";s:2:"";s:3:"炻";s:2:"";s:3:"烀";s:2:"";s:3:"炷";s:2:"";s:3:"炫";s:2:"";s:3:"炱";s:2:"";s:3:"烨";s:2:"";s:3:"烊";s:2:"";s:3:"焐";s:2:"";s:3:"焓";s:2:"";s:3:"焖";s:2:"";s:3:"焯";s:2:"";s:3:"焱";s:2:"";s:3:"煳";s:2:"";s:3:"煜";s:2:"";s:3:"煨";s:2:"";s:3:"煅";s:2:"";s:3:"煲";s:2:"";s:3:"煊";s:2:"";s:3:"煸";s:2:"";s:3:"煺";s:2:"";s:3:"熘";s:2:"";s:3:"熳";s:2:"";s:3:"熵";s:2:"";s:3:"熨";s:2:"";s:3:"熠";s:2:"";s:3:"燠";s:2:"";s:3:"燔";s:2:"";s:3:"燧";s:2:"";s:3:"燹";s:2:"";s:3:"爝";s:2:"";s:3:"爨";s:2:"";s:3:"灬";s:2:"";s:3:"焘";s:2:"";s:3:"煦";s:2:"";s:3:"熹";s:2:"";s:3:"戾";s:2:"";s:3:"戽";s:2:"";s:3:"扃";s:2:"";s:3:"扈";s:2:"";s:3:"扉";s:2:"";s:3:"礻";s:2:"";s:3:"祀";s:2:"";s:3:"祆";s:2:"";s:3:"祉";s:2:"";s:3:"祛";s:2:"";s:3:"祜";s:2:"";s:3:"祓";s:2:"";s:3:"祚";s:2:"";s:3:"祢";s:2:"";s:3:"祗";s:2:"";s:3:"祠";s:2:"";s:3:"祯";s:2:"";s:3:"祧";s:2:"";s:3:"祺";s:2:"";s:3:"禅";s:2:"";s:3:"禊";s:2:"";s:3:"禚";s:2:"";s:3:"禧";s:2:"";s:3:"禳";s:2:"";s:3:"忑";s:2:"";s:3:"忐";s:2:"@";s:3:"鞞";s:2:"A";s:3:"鞟";s:2:"B";s:3:"鞡";s:2:"C";s:3:"鞢";s:2:"D";s:3:"鞤";s:2:"E";s:3:"鞥";s:2:"F";s:3:"鞦";s:2:"G";s:3:"鞧";s:2:"H";s:3:"鞨";s:2:"I";s:3:"鞩";s:2:"J";s:3:"鞪";s:2:"K";s:3:"鞬";s:2:"L";s:3:"鞮";s:2:"M";s:3:"鞰";s:2:"N";s:3:"鞱";s:2:"O";s:3:"鞳";s:2:"P";s:3:"鞵";s:2:"Q";s:3:"鞶";s:2:"R";s:3:"鞷";s:2:"S";s:3:"鞸";s:2:"T";s:3:"鞹";s:2:"U";s:3:"鞺";s:2:"V";s:3:"鞻";s:2:"W";s:3:"鞼";s:2:"X";s:3:"鞽";s:2:"Y";s:3:"鞾";s:2:"Z";s:3:"鞿";s:2:"[";s:3:"韀";s:2:"\";s:3:"韁";s:2:"]";s:3:"韂";s:2:"^";s:3:"韃";s:2:"_";s:3:"韄";s:2:"`";s:3:"韅";s:2:"a";s:3:"韆";s:2:"b";s:3:"韇";s:2:"c";s:3:"韈";s:2:"d";s:3:"韉";s:2:"e";s:3:"韊";s:2:"f";s:3:"韋";s:2:"g";s:3:"韌";s:2:"h";s:3:"韍";s:2:"i";s:3:"韎";s:2:"j";s:3:"韏";s:2:"k";s:3:"韐";s:2:"l";s:3:"韑";s:2:"m";s:3:"韒";s:2:"n";s:3:"韓";s:2:"o";s:3:"韔";s:2:"p";s:3:"韕";s:2:"q";s:3:"韖";s:2:"r";s:3:"韗";s:2:"s";s:3:"韘";s:2:"t";s:3:"韙";s:2:"u";s:3:"韚";s:2:"v";s:3:"韛";s:2:"w";s:3:"韜";s:2:"x";s:3:"韝";s:2:"y";s:3:"韞";s:2:"z";s:3:"韟";s:2:"{";s:3:"韠";s:2:"|";s:3:"韡";s:2:"}";s:3:"韢";s:2:"~";s:3:"韣";s:2:"";s:3:"韤";s:2:"";s:3:"韥";s:2:"";s:3:"韨";s:2:"";s:3:"韮";s:2:"";s:3:"韯";s:2:"";s:3:"韰";s:2:"";s:3:"韱";s:2:"";s:3:"韲";s:2:"";s:3:"韴";s:2:"";s:3:"韷";s:2:"";s:3:"韸";s:2:"";s:3:"韹";s:2:"";s:3:"韺";s:2:"";s:3:"韻";s:2:"";s:3:"韼";s:2:"";s:3:"韽";s:2:"";s:3:"韾";s:2:"";s:3:"響";s:2:"";s:3:"頀";s:2:"";s:3:"頁";s:2:"";s:3:"頂";s:2:"";s:3:"頃";s:2:"";s:3:"頄";s:2:"";s:3:"項";s:2:"";s:3:"順";s:2:"";s:3:"頇";s:2:"";s:3:"須";s:2:"";s:3:"頉";s:2:"";s:3:"頊";s:2:"";s:3:"頋";s:2:"";s:3:"頌";s:2:"";s:3:"頍";s:2:"";s:3:"頎";s:2:"";s:3:"怼";s:2:"";s:3:"恝";s:2:"";s:3:"恚";s:2:"";s:3:"恧";s:2:"";s:3:"恁";s:2:"";s:3:"恙";s:2:"";s:3:"恣";s:2:"";s:3:"悫";s:2:"";s:3:"愆";s:2:"";s:3:"愍";s:2:"";s:3:"慝";s:2:"";s:3:"憩";s:2:"";s:3:"憝";s:2:"";s:3:"懋";s:2:"";s:3:"懑";s:2:"";s:3:"戆";s:2:"";s:3:"肀";s:2:"";s:3:"聿";s:2:"";s:3:"沓";s:2:"";s:3:"泶";s:2:"";s:3:"淼";s:2:"";s:3:"矶";s:2:"";s:3:"矸";s:2:"";s:3:"砀";s:2:"";s:3:"砉";s:2:"";s:3:"砗";s:2:"";s:3:"砘";s:2:"";s:3:"砑";s:2:"";s:3:"斫";s:2:"";s:3:"砭";s:2:"";s:3:"砜";s:2:"";s:3:"砝";s:2:"";s:3:"砹";s:2:"";s:3:"砺";s:2:"";s:3:"砻";s:2:"";s:3:"砟";s:2:"";s:3:"砼";s:2:"";s:3:"砥";s:2:"";s:3:"砬";s:2:"";s:3:"砣";s:2:"";s:3:"砩";s:2:"";s:3:"硎";s:2:"";s:3:"硭";s:2:"";s:3:"硖";s:2:"";s:3:"硗";s:2:"";s:3:"砦";s:2:"";s:3:"硐";s:2:"";s:3:"硇";s:2:"";s:3:"硌";s:2:"";s:3:"硪";s:2:"";s:3:"碛";s:2:"";s:3:"碓";s:2:"";s:3:"碚";s:2:"";s:3:"碇";s:2:"";s:3:"碜";s:2:"";s:3:"碡";s:2:"";s:3:"碣";s:2:"";s:3:"碲";s:2:"";s:3:"碹";s:2:"";s:3:"碥";s:2:"";s:3:"磔";s:2:"";s:3:"磙";s:2:"";s:3:"磉";s:2:"";s:3:"磬";s:2:"";s:3:"磲";s:2:"";s:3:"礅";s:2:"";s:3:"磴";s:2:"";s:3:"礓";s:2:"";s:3:"礤";s:2:"";s:3:"礞";s:2:"";s:3:"礴";s:2:"";s:3:"龛";s:2:"";s:3:"黹";s:2:"";s:3:"黻";s:2:"";s:3:"黼";s:2:"";s:3:"盱";s:2:"";s:3:"眄";s:2:"";s:3:"眍";s:2:"";s:3:"盹";s:2:"";s:3:"眇";s:2:"";s:3:"眈";s:2:"";s:3:"眚";s:2:"";s:3:"眢";s:2:"";s:3:"眙";s:2:"";s:3:"眭";s:2:"";s:3:"眦";s:2:"";s:3:"眵";s:2:"";s:3:"眸";s:2:"";s:3:"睐";s:2:"";s:3:"睑";s:2:"";s:3:"睇";s:2:"";s:3:"睃";s:2:"";s:3:"睚";s:2:"";s:3:"睨";s:2:"@";s:3:"頏";s:2:"A";s:3:"預";s:2:"B";s:3:"頑";s:2:"C";s:3:"頒";s:2:"D";s:3:"頓";s:2:"E";s:3:"頔";s:2:"F";s:3:"頕";s:2:"G";s:3:"頖";s:2:"H";s:3:"頗";s:2:"I";s:3:"領";s:2:"J";s:3:"頙";s:2:"K";s:3:"頚";s:2:"L";s:3:"頛";s:2:"M";s:3:"頜";s:2:"N";s:3:"頝";s:2:"O";s:3:"頞";s:2:"P";s:3:"頟";s:2:"Q";s:3:"頠";s:2:"R";s:3:"頡";s:2:"S";s:3:"頢";s:2:"T";s:3:"頣";s:2:"U";s:3:"頤";s:2:"V";s:3:"頥";s:2:"W";s:3:"頦";s:2:"X";s:3:"頧";s:2:"Y";s:3:"頨";s:2:"Z";s:3:"頩";s:2:"[";s:3:"頪";s:2:"\";s:3:"頫";s:2:"]";s:3:"頬";s:2:"^";s:3:"頭";s:2:"_";s:3:"頮";s:2:"`";s:3:"頯";s:2:"a";s:3:"頰";s:2:"b";s:3:"頱";s:2:"c";s:3:"頲";s:2:"d";s:3:"頳";s:2:"e";s:3:"頴";s:2:"f";s:3:"頵";s:2:"g";s:3:"頶";s:2:"h";s:3:"頷";s:2:"i";s:3:"頸";s:2:"j";s:3:"頹";s:2:"k";s:3:"頺";s:2:"l";s:3:"頻";s:2:"m";s:3:"頼";s:2:"n";s:3:"頽";s:2:"o";s:3:"頾";s:2:"p";s:3:"頿";s:2:"q";s:3:"顀";s:2:"r";s:3:"顁";s:2:"s";s:3:"顂";s:2:"t";s:3:"顃";s:2:"u";s:3:"顄";s:2:"v";s:3:"顅";s:2:"w";s:3:"顆";s:2:"x";s:3:"顇";s:2:"y";s:3:"顈";s:2:"z";s:3:"顉";s:2:"{";s:3:"顊";s:2:"|";s:3:"顋";s:2:"}";s:3:"題";s:2:"~";s:3:"額";s:2:"";s:3:"顎";s:2:"";s:3:"顏";s:2:"";s:3:"顐";s:2:"";s:3:"顑";s:2:"";s:3:"顒";s:2:"";s:3:"顓";s:2:"";s:3:"顔";s:2:"";s:3:"顕";s:2:"";s:3:"顖";s:2:"";s:3:"顗";s:2:"";s:3:"願";s:2:"";s:3:"顙";s:2:"";s:3:"顚";s:2:"";s:3:"顛";s:2:"";s:3:"顜";s:2:"";s:3:"顝";s:2:"";s:3:"類";s:2:"";s:3:"顟";s:2:"";s:3:"顠";s:2:"";s:3:"顡";s:2:"";s:3:"顢";s:2:"";s:3:"顣";s:2:"";s:3:"顤";s:2:"";s:3:"顥";s:2:"";s:3:"顦";s:2:"";s:3:"顧";s:2:"";s:3:"顨";s:2:"";s:3:"顩";s:2:"";s:3:"顪";s:2:"";s:3:"顫";s:2:"";s:3:"顬";s:2:"";s:3:"顭";s:2:"";s:3:"顮";s:2:"";s:3:"睢";s:2:"";s:3:"睥";s:2:"";s:3:"睿";s:2:"";s:3:"瞍";s:2:"";s:3:"睽";s:2:"";s:3:"瞀";s:2:"";s:3:"瞌";s:2:"";s:3:"瞑";s:2:"";s:3:"瞟";s:2:"";s:3:"瞠";s:2:"";s:3:"瞰";s:2:"";s:3:"瞵";s:2:"";s:3:"瞽";s:2:"";s:3:"町";s:2:"";s:3:"畀";s:2:"";s:3:"畎";s:2:"";s:3:"畋";s:2:"";s:3:"畈";s:2:"";s:3:"畛";s:2:"";s:3:"畲";s:2:"";s:3:"畹";s:2:"";s:3:"疃";s:2:"";s:3:"罘";s:2:"";s:3:"罡";s:2:"";s:3:"罟";s:2:"";s:3:"詈";s:2:"";s:3:"罨";s:2:"";s:3:"罴";s:2:"";s:3:"罱";s:2:"";s:3:"罹";s:2:"";s:3:"羁";s:2:"";s:3:"罾";s:2:"";s:3:"盍";s:2:"";s:3:"盥";s:2:"";s:3:"蠲";s:2:"";s:3:"钅";s:2:"";s:3:"钆";s:2:"";s:3:"钇";s:2:"";s:3:"钋";s:2:"";s:3:"钊";s:2:"";s:3:"钌";s:2:"";s:3:"钍";s:2:"";s:3:"钏";s:2:"";s:3:"钐";s:2:"";s:3:"钔";s:2:"";s:3:"钗";s:2:"";s:3:"钕";s:2:"";s:3:"钚";s:2:"";s:3:"钛";s:2:"";s:3:"钜";s:2:"";s:3:"钣";s:2:"";s:3:"钤";s:2:"";s:3:"钫";s:2:"";s:3:"钪";s:2:"";s:3:"钭";s:2:"";s:3:"钬";s:2:"";s:3:"钯";s:2:"";s:3:"钰";s:2:"";s:3:"钲";s:2:"";s:3:"钴";s:2:"";s:3:"钶";s:2:"";s:3:"钷";s:2:"";s:3:"钸";s:2:"";s:3:"钹";s:2:"";s:3:"钺";s:2:"";s:3:"钼";s:2:"";s:3:"钽";s:2:"";s:3:"钿";s:2:"";s:3:"铄";s:2:"";s:3:"铈";s:2:"";s:3:"铉";s:2:"";s:3:"铊";s:2:"";s:3:"铋";s:2:"";s:3:"铌";s:2:"";s:3:"铍";s:2:"";s:3:"铎";s:2:"";s:3:"铐";s:2:"";s:3:"铑";s:2:"";s:3:"铒";s:2:"";s:3:"铕";s:2:"";s:3:"铖";s:2:"";s:3:"铗";s:2:"";s:3:"铙";s:2:"";s:3:"铘";s:2:"";s:3:"铛";s:2:"";s:3:"铞";s:2:"";s:3:"铟";s:2:"";s:3:"铠";s:2:"";s:3:"铢";s:2:"";s:3:"铤";s:2:"";s:3:"铥";s:2:"";s:3:"铧";s:2:"";s:3:"铨";s:2:"";s:3:"铪";s:2:"@";s:3:"顯";s:2:"A";s:3:"顰";s:2:"B";s:3:"顱";s:2:"C";s:3:"顲";s:2:"D";s:3:"顳";s:2:"E";s:3:"顴";s:2:"F";s:3:"颋";s:2:"G";s:3:"颎";s:2:"H";s:3:"颒";s:2:"I";s:3:"颕";s:2:"J";s:3:"颙";s:2:"K";s:3:"颣";s:2:"L";s:3:"風";s:2:"M";s:3:"颩";s:2:"N";s:3:"颪";s:2:"O";s:3:"颫";s:2:"P";s:3:"颬";s:2:"Q";s:3:"颭";s:2:"R";s:3:"颮";s:2:"S";s:3:"颯";s:2:"T";s:3:"颰";s:2:"U";s:3:"颱";s:2:"V";s:3:"颲";s:2:"W";s:3:"颳";s:2:"X";s:3:"颴";s:2:"Y";s:3:"颵";s:2:"Z";s:3:"颶";s:2:"[";s:3:"颷";s:2:"\";s:3:"颸";s:2:"]";s:3:"颹";s:2:"^";s:3:"颺";s:2:"_";s:3:"颻";s:2:"`";s:3:"颼";s:2:"a";s:3:"颽";s:2:"b";s:3:"颾";s:2:"c";s:3:"颿";s:2:"d";s:3:"飀";s:2:"e";s:3:"飁";s:2:"f";s:3:"飂";s:2:"g";s:3:"飃";s:2:"h";s:3:"飄";s:2:"i";s:3:"飅";s:2:"j";s:3:"飆";s:2:"k";s:3:"飇";s:2:"l";s:3:"飈";s:2:"m";s:3:"飉";s:2:"n";s:3:"飊";s:2:"o";s:3:"飋";s:2:"p";s:3:"飌";s:2:"q";s:3:"飍";s:2:"r";s:3:"飏";s:2:"s";s:3:"飐";s:2:"t";s:3:"飔";s:2:"u";s:3:"飖";s:2:"v";s:3:"飗";s:2:"w";s:3:"飛";s:2:"x";s:3:"飜";s:2:"y";s:3:"飝";s:2:"z";s:3:"飠";s:2:"{";s:3:"飡";s:2:"|";s:3:"飢";s:2:"}";s:3:"飣";s:2:"~";s:3:"飤";s:2:"";s:3:"飥";s:2:"";s:3:"飦";s:2:"";s:3:"飩";s:2:"";s:3:"飪";s:2:"";s:3:"飫";s:2:"";s:3:"飬";s:2:"";s:3:"飭";s:2:"";s:3:"飮";s:2:"";s:3:"飯";s:2:"";s:3:"飰";s:2:"";s:3:"飱";s:2:"";s:3:"飲";s:2:"";s:3:"飳";s:2:"";s:3:"飴";s:2:"";s:3:"飵";s:2:"";s:3:"飶";s:2:"";s:3:"飷";s:2:"";s:3:"飸";s:2:"";s:3:"飹";s:2:"";s:3:"飺";s:2:"";s:3:"飻";s:2:"";s:3:"飼";s:2:"";s:3:"飽";s:2:"";s:3:"飾";s:2:"";s:3:"飿";s:2:"";s:3:"餀";s:2:"";s:3:"餁";s:2:"";s:3:"餂";s:2:"";s:3:"餃";s:2:"";s:3:"餄";s:2:"";s:3:"餅";s:2:"";s:3:"餆";s:2:"";s:3:"餇";s:2:"";s:3:"铩";s:2:"";s:3:"铫";s:2:"";s:3:"铮";s:2:"";s:3:"铯";s:2:"";s:3:"铳";s:2:"";s:3:"铴";s:2:"";s:3:"铵";s:2:"";s:3:"铷";s:2:"";s:3:"铹";s:2:"";s:3:"铼";s:2:"";s:3:"铽";s:2:"";s:3:"铿";s:2:"";s:3:"锃";s:2:"";s:3:"锂";s:2:"";s:3:"锆";s:2:"";s:3:"锇";s:2:"";s:3:"锉";s:2:"";s:3:"锊";s:2:"";s:3:"锍";s:2:"";s:3:"锎";s:2:"";s:3:"锏";s:2:"";s:3:"锒";s:2:"";s:3:"锓";s:2:"";s:3:"锔";s:2:"";s:3:"锕";s:2:"";s:3:"锖";s:2:"";s:3:"锘";s:2:"";s:3:"锛";s:2:"";s:3:"锝";s:2:"";s:3:"锞";s:2:"";s:3:"锟";s:2:"";s:3:"锢";s:2:"";s:3:"锪";s:2:"";s:3:"锫";s:2:"";s:3:"锩";s:2:"";s:3:"锬";s:2:"";s:3:"锱";s:2:"";s:3:"锲";s:2:"";s:3:"锴";s:2:"";s:3:"锶";s:2:"";s:3:"锷";s:2:"";s:3:"锸";s:2:"";s:3:"锼";s:2:"";s:3:"锾";s:2:"";s:3:"锿";s:2:"";s:3:"镂";s:2:"";s:3:"锵";s:2:"";s:3:"镄";s:2:"";s:3:"镅";s:2:"";s:3:"镆";s:2:"";s:3:"镉";s:2:"";s:3:"镌";s:2:"";s:3:"镎";s:2:"";s:3:"镏";s:2:"";s:3:"镒";s:2:"";s:3:"镓";s:2:"";s:3:"镔";s:2:"";s:3:"镖";s:2:"";s:3:"镗";s:2:"";s:3:"镘";s:2:"";s:3:"镙";s:2:"";s:3:"镛";s:2:"";s:3:"镞";s:2:"";s:3:"镟";s:2:"";s:3:"镝";s:2:"";s:3:"镡";s:2:"";s:3:"镢";s:2:"";s:3:"镤";s:2:"";s:3:"镥";s:2:"";s:3:"镦";s:2:"";s:3:"镧";s:2:"";s:3:"镨";s:2:"";s:3:"镩";s:2:"";s:3:"镪";s:2:"";s:3:"镫";s:2:"";s:3:"镬";s:2:"";s:3:"镯";s:2:"";s:3:"镱";s:2:"";s:3:"镲";s:2:"";s:3:"镳";s:2:"";s:3:"锺";s:2:"";s:3:"矧";s:2:"";s:3:"矬";s:2:"";s:3:"雉";s:2:"";s:3:"秕";s:2:"";s:3:"秭";s:2:"";s:3:"秣";s:2:"";s:3:"秫";s:2:"";s:3:"稆";s:2:"";s:3:"嵇";s:2:"";s:3:"稃";s:2:"";s:3:"稂";s:2:"";s:3:"稞";s:2:"";s:3:"稔";s:2:"@";s:3:"餈";s:2:"A";s:3:"餉";s:2:"B";s:3:"養";s:2:"C";s:3:"餋";s:2:"D";s:3:"餌";s:2:"E";s:3:"餎";s:2:"F";s:3:"餏";s:2:"G";s:3:"餑";s:2:"H";s:3:"餒";s:2:"I";s:3:"餓";s:2:"J";s:3:"餔";s:2:"K";s:3:"餕";s:2:"L";s:3:"餖";s:2:"M";s:3:"餗";s:2:"N";s:3:"餘";s:2:"O";s:3:"餙";s:2:"P";s:3:"餚";s:2:"Q";s:3:"餛";s:2:"R";s:3:"餜";s:2:"S";s:3:"餝";s:2:"T";s:3:"餞";s:2:"U";s:3:"餟";s:2:"V";s:3:"餠";s:2:"W";s:3:"餡";s:2:"X";s:3:"餢";s:2:"Y";s:3:"餣";s:2:"Z";s:3:"餤";s:2:"[";s:3:"餥";s:2:"\";s:3:"餦";s:2:"]";s:3:"餧";s:2:"^";s:3:"館";s:2:"_";s:3:"餩";s:2:"`";s:3:"餪";s:2:"a";s:3:"餫";s:2:"b";s:3:"餬";s:2:"c";s:3:"餭";s:2:"d";s:3:"餯";s:2:"e";s:3:"餰";s:2:"f";s:3:"餱";s:2:"g";s:3:"餲";s:2:"h";s:3:"餳";s:2:"i";s:3:"餴";s:2:"j";s:3:"餵";s:2:"k";s:3:"餶";s:2:"l";s:3:"餷";s:2:"m";s:3:"餸";s:2:"n";s:3:"餹";s:2:"o";s:3:"餺";s:2:"p";s:3:"餻";s:2:"q";s:3:"餼";s:2:"r";s:3:"餽";s:2:"s";s:3:"餾";s:2:"t";s:3:"餿";s:2:"u";s:3:"饀";s:2:"v";s:3:"饁";s:2:"w";s:3:"饂";s:2:"x";s:3:"饃";s:2:"y";s:3:"饄";s:2:"z";s:3:"饅";s:2:"{";s:3:"饆";s:2:"|";s:3:"饇";s:2:"}";s:3:"饈";s:2:"~";s:3:"饉";s:2:"";s:3:"饊";s:2:"";s:3:"饋";s:2:"";s:3:"饌";s:2:"";s:3:"饍";s:2:"";s:3:"饎";s:2:"";s:3:"饏";s:2:"";s:3:"饐";s:2:"";s:3:"饑";s:2:"";s:3:"饒";s:2:"";s:3:"饓";s:2:"";s:3:"饖";s:2:"";s:3:"饗";s:2:"";s:3:"饘";s:2:"";s:3:"饙";s:2:"";s:3:"饚";s:2:"";s:3:"饛";s:2:"";s:3:"饜";s:2:"";s:3:"饝";s:2:"";s:3:"饞";s:2:"";s:3:"饟";s:2:"";s:3:"饠";s:2:"";s:3:"饡";s:2:"";s:3:"饢";s:2:"";s:3:"饤";s:2:"";s:3:"饦";s:2:"";s:3:"饳";s:2:"";s:3:"饸";s:2:"";s:3:"饹";s:2:"";s:3:"饻";s:2:"";s:3:"饾";s:2:"";s:3:"馂";s:2:"";s:3:"馃";s:2:"";s:3:"馉";s:2:"";s:3:"稹";s:2:"";s:3:"稷";s:2:"";s:3:"穑";s:2:"";s:3:"黏";s:2:"";s:3:"馥";s:2:"";s:3:"穰";s:2:"";s:3:"皈";s:2:"";s:3:"皎";s:2:"";s:3:"皓";s:2:"";s:3:"皙";s:2:"";s:3:"皤";s:2:"";s:3:"瓞";s:2:"";s:3:"瓠";s:2:"";s:3:"甬";s:2:"";s:3:"鸠";s:2:"";s:3:"鸢";s:2:"";s:3:"鸨";s:2:"";s:3:"鸩";s:2:"";s:3:"鸪";s:2:"";s:3:"鸫";s:2:"";s:3:"鸬";s:2:"";s:3:"鸲";s:2:"";s:3:"鸱";s:2:"";s:3:"鸶";s:2:"";s:3:"鸸";s:2:"";s:3:"鸷";s:2:"";s:3:"鸹";s:2:"";s:3:"鸺";s:2:"";s:3:"鸾";s:2:"";s:3:"鹁";s:2:"";s:3:"鹂";s:2:"";s:3:"鹄";s:2:"";s:3:"鹆";s:2:"";s:3:"鹇";s:2:"";s:3:"鹈";s:2:"";s:3:"鹉";s:2:"";s:3:"鹋";s:2:"";s:3:"鹌";s:2:"";s:3:"鹎";s:2:"";s:3:"鹑";s:2:"";s:3:"鹕";s:2:"";s:3:"鹗";s:2:"";s:3:"鹚";s:2:"";s:3:"鹛";s:2:"";s:3:"鹜";s:2:"";s:3:"鹞";s:2:"";s:3:"鹣";s:2:"";s:3:"鹦";s:2:"";s:3:"鹧";s:2:"";s:3:"鹨";s:2:"";s:3:"鹩";s:2:"";s:3:"鹪";s:2:"";s:3:"鹫";s:2:"";s:3:"鹬";s:2:"";s:3:"鹱";s:2:"";s:3:"鹭";s:2:"";s:3:"鹳";s:2:"";s:3:"疒";s:2:"";s:3:"疔";s:2:"";s:3:"疖";s:2:"";s:3:"疠";s:2:"";s:3:"疝";s:2:"";s:3:"疬";s:2:"";s:3:"疣";s:2:"";s:3:"疳";s:2:"";s:3:"疴";s:2:"";s:3:"疸";s:2:"";s:3:"痄";s:2:"";s:3:"疱";s:2:"";s:3:"疰";s:2:"";s:3:"痃";s:2:"";s:3:"痂";s:2:"";s:3:"痖";s:2:"";s:3:"痍";s:2:"";s:3:"痣";s:2:"";s:3:"痨";s:2:"";s:3:"痦";s:2:"";s:3:"痤";s:2:"";s:3:"痫";s:2:"";s:3:"痧";s:2:"";s:3:"瘃";s:2:"";s:3:"痱";s:2:"";s:3:"痼";s:2:"";s:3:"痿";s:2:"";s:3:"瘐";s:2:"";s:3:"瘀";s:2:"";s:3:"瘅";s:2:"";s:3:"瘌";s:2:"";s:3:"瘗";s:2:"";s:3:"瘊";s:2:"";s:3:"瘥";s:2:"";s:3:"瘘";s:2:"";s:3:"瘕";s:2:"";s:3:"瘙";s:2:"@";s:3:"馌";s:2:"A";s:3:"馎";s:2:"B";s:3:"馚";s:2:"C";s:3:"馛";s:2:"D";s:3:"馜";s:2:"E";s:3:"馝";s:2:"F";s:3:"馞";s:2:"G";s:3:"馟";s:2:"H";s:3:"馠";s:2:"I";s:3:"馡";s:2:"J";s:3:"馢";s:2:"K";s:3:"馣";s:2:"L";s:3:"馤";s:2:"M";s:3:"馦";s:2:"N";s:3:"馧";s:2:"O";s:3:"馩";s:2:"P";s:3:"馪";s:2:"Q";s:3:"馫";s:2:"R";s:3:"馬";s:2:"S";s:3:"馭";s:2:"T";s:3:"馮";s:2:"U";s:3:"馯";s:2:"V";s:3:"馰";s:2:"W";s:3:"馱";s:2:"X";s:3:"馲";s:2:"Y";s:3:"馳";s:2:"Z";s:3:"馴";s:2:"[";s:3:"馵";s:2:"\";s:3:"馶";s:2:"]";s:3:"馷";s:2:"^";s:3:"馸";s:2:"_";s:3:"馹";s:2:"`";s:3:"馺";s:2:"a";s:3:"馻";s:2:"b";s:3:"馼";s:2:"c";s:3:"馽";s:2:"d";s:3:"馾";s:2:"e";s:3:"馿";s:2:"f";s:3:"駀";s:2:"g";s:3:"駁";s:2:"h";s:3:"駂";s:2:"i";s:3:"駃";s:2:"j";s:3:"駄";s:2:"k";s:3:"駅";s:2:"l";s:3:"駆";s:2:"m";s:3:"駇";s:2:"n";s:3:"駈";s:2:"o";s:3:"駉";s:2:"p";s:3:"駊";s:2:"q";s:3:"駋";s:2:"r";s:3:"駌";s:2:"s";s:3:"駍";s:2:"t";s:3:"駎";s:2:"u";s:3:"駏";s:2:"v";s:3:"駐";s:2:"w";s:3:"駑";s:2:"x";s:3:"駒";s:2:"y";s:3:"駓";s:2:"z";s:3:"駔";s:2:"{";s:3:"駕";s:2:"|";s:3:"駖";s:2:"}";s:3:"駗";s:2:"~";s:3:"駘";s:2:"";s:3:"駙";s:2:"";s:3:"駚";s:2:"";s:3:"駛";s:2:"";s:3:"駜";s:2:"";s:3:"駝";s:2:"";s:3:"駞";s:2:"";s:3:"駟";s:2:"";s:3:"駠";s:2:"";s:3:"駡";s:2:"";s:3:"駢";s:2:"";s:3:"駣";s:2:"";s:3:"駤";s:2:"";s:3:"駥";s:2:"";s:3:"駦";s:2:"";s:3:"駧";s:2:"";s:3:"駨";s:2:"";s:3:"駩";s:2:"";s:3:"駪";s:2:"";s:3:"駫";s:2:"";s:3:"駬";s:2:"";s:3:"駭";s:2:"";s:3:"駮";s:2:"";s:3:"駯";s:2:"";s:3:"駰";s:2:"";s:3:"駱";s:2:"";s:3:"駲";s:2:"";s:3:"駳";s:2:"";s:3:"駴";s:2:"";s:3:"駵";s:2:"";s:3:"駶";s:2:"";s:3:"駷";s:2:"";s:3:"駸";s:2:"";s:3:"駹";s:2:"";s:3:"瘛";s:2:"";s:3:"瘼";s:2:"";s:3:"瘢";s:2:"";s:3:"瘠";s:2:"";s:3:"癀";s:2:"";s:3:"瘭";s:2:"";s:3:"瘰";s:2:"";s:3:"瘿";s:2:"";s:3:"瘵";s:2:"";s:3:"癃";s:2:"";s:3:"瘾";s:2:"";s:3:"瘳";s:2:"";s:3:"癍";s:2:"";s:3:"癞";s:2:"";s:3:"癔";s:2:"";s:3:"癜";s:2:"";s:3:"癖";s:2:"";s:3:"癫";s:2:"";s:3:"癯";s:2:"";s:3:"翊";s:2:"";s:3:"竦";s:2:"";s:3:"穸";s:2:"";s:3:"穹";s:2:"";s:3:"窀";s:2:"";s:3:"窆";s:2:"";s:3:"窈";s:2:"";s:3:"窕";s:2:"";s:3:"窦";s:2:"";s:3:"窠";s:2:"";s:3:"窬";s:2:"";s:3:"窨";s:2:"";s:3:"窭";s:2:"";s:3:"窳";s:2:"";s:3:"衤";s:2:"";s:3:"衩";s:2:"";s:3:"衲";s:2:"";s:3:"衽";s:2:"";s:3:"衿";s:2:"";s:3:"袂";s:2:"";s:3:"袢";s:2:"";s:3:"裆";s:2:"";s:3:"袷";s:2:"";s:3:"袼";s:2:"";s:3:"裉";s:2:"";s:3:"裢";s:2:"";s:3:"裎";s:2:"";s:3:"裣";s:2:"";s:3:"裥";s:2:"";s:3:"裱";s:2:"";s:3:"褚";s:2:"";s:3:"裼";s:2:"";s:3:"裨";s:2:"";s:3:"裾";s:2:"";s:3:"裰";s:2:"";s:3:"褡";s:2:"";s:3:"褙";s:2:"";s:3:"褓";s:2:"";s:3:"褛";s:2:"";s:3:"褊";s:2:"";s:3:"褴";s:2:"";s:3:"褫";s:2:"";s:3:"褶";s:2:"";s:3:"襁";s:2:"";s:3:"襦";s:2:"";s:3:"襻";s:2:"";s:3:"疋";s:2:"";s:3:"胥";s:2:"";s:3:"皲";s:2:"";s:3:"皴";s:2:"";s:3:"矜";s:2:"";s:3:"耒";s:2:"";s:3:"耔";s:2:"";s:3:"耖";s:2:"";s:3:"耜";s:2:"";s:3:"耠";s:2:"";s:3:"耢";s:2:"";s:3:"耥";s:2:"";s:3:"耦";s:2:"";s:3:"耧";s:2:"";s:3:"耩";s:2:"";s:3:"耨";s:2:"";s:3:"耱";s:2:"";s:3:"耋";s:2:"";s:3:"耵";s:2:"";s:3:"聃";s:2:"";s:3:"聆";s:2:"";s:3:"聍";s:2:"";s:3:"聒";s:2:"";s:3:"聩";s:2:"";s:3:"聱";s:2:"";s:3:"覃";s:2:"";s:3:"顸";s:2:"";s:3:"颀";s:2:"";s:3:"颃";s:2:"@";s:3:"駺";s:2:"A";s:3:"駻";s:2:"B";s:3:"駼";s:2:"C";s:3:"駽";s:2:"D";s:3:"駾";s:2:"E";s:3:"駿";s:2:"F";s:3:"騀";s:2:"G";s:3:"騁";s:2:"H";s:3:"騂";s:2:"I";s:3:"騃";s:2:"J";s:3:"騄";s:2:"K";s:3:"騅";s:2:"L";s:3:"騆";s:2:"M";s:3:"騇";s:2:"N";s:3:"騈";s:2:"O";s:3:"騉";s:2:"P";s:3:"騊";s:2:"Q";s:3:"騋";s:2:"R";s:3:"騌";s:2:"S";s:3:"騍";s:2:"T";s:3:"騎";s:2:"U";s:3:"騏";s:2:"V";s:3:"騐";s:2:"W";s:3:"騑";s:2:"X";s:3:"騒";s:2:"Y";s:3:"験";s:2:"Z";s:3:"騔";s:2:"[";s:3:"騕";s:2:"\";s:3:"騖";s:2:"]";s:3:"騗";s:2:"^";s:3:"騘";s:2:"_";s:3:"騙";s:2:"`";s:3:"騚";s:2:"a";s:3:"騛";s:2:"b";s:3:"騜";s:2:"c";s:3:"騝";s:2:"d";s:3:"騞";s:2:"e";s:3:"騟";s:2:"f";s:3:"騠";s:2:"g";s:3:"騡";s:2:"h";s:3:"騢";s:2:"i";s:3:"騣";s:2:"j";s:3:"騤";s:2:"k";s:3:"騥";s:2:"l";s:3:"騦";s:2:"m";s:3:"騧";s:2:"n";s:3:"騨";s:2:"o";s:3:"騩";s:2:"p";s:3:"騪";s:2:"q";s:3:"騫";s:2:"r";s:3:"騬";s:2:"s";s:3:"騭";s:2:"t";s:3:"騮";s:2:"u";s:3:"騯";s:2:"v";s:3:"騰";s:2:"w";s:3:"騱";s:2:"x";s:3:"騲";s:2:"y";s:3:"騳";s:2:"z";s:3:"騴";s:2:"{";s:3:"騵";s:2:"|";s:3:"騶";s:2:"}";s:3:"騷";s:2:"~";s:3:"騸";s:2:"";s:3:"騹";s:2:"";s:3:"騺";s:2:"";s:3:"騻";s:2:"";s:3:"騼";s:2:"";s:3:"騽";s:2:"";s:3:"騾";s:2:"";s:3:"騿";s:2:"";s:3:"驀";s:2:"";s:3:"驁";s:2:"";s:3:"驂";s:2:"";s:3:"驃";s:2:"";s:3:"驄";s:2:"";s:3:"驅";s:2:"";s:3:"驆";s:2:"";s:3:"驇";s:2:"";s:3:"驈";s:2:"";s:3:"驉";s:2:"";s:3:"驊";s:2:"";s:3:"驋";s:2:"";s:3:"驌";s:2:"";s:3:"驍";s:2:"";s:3:"驎";s:2:"";s:3:"驏";s:2:"";s:3:"驐";s:2:"";s:3:"驑";s:2:"";s:3:"驒";s:2:"";s:3:"驓";s:2:"";s:3:"驔";s:2:"";s:3:"驕";s:2:"";s:3:"驖";s:2:"";s:3:"驗";s:2:"";s:3:"驘";s:2:"";s:3:"驙";s:2:"";s:3:"颉";s:2:"";s:3:"颌";s:2:"";s:3:"颍";s:2:"";s:3:"颏";s:2:"";s:3:"颔";s:2:"";s:3:"颚";s:2:"";s:3:"颛";s:2:"";s:3:"颞";s:2:"";s:3:"颟";s:2:"";s:3:"颡";s:2:"";s:3:"颢";s:2:"";s:3:"颥";s:2:"";s:3:"颦";s:2:"";s:3:"虍";s:2:"";s:3:"虔";s:2:"";s:3:"虬";s:2:"";s:3:"虮";s:2:"";s:3:"虿";s:2:"";s:3:"虺";s:2:"";s:3:"虼";s:2:"";s:3:"虻";s:2:"";s:3:"蚨";s:2:"";s:3:"蚍";s:2:"";s:3:"蚋";s:2:"";s:3:"蚬";s:2:"";s:3:"蚝";s:2:"";s:3:"蚧";s:2:"";s:3:"蚣";s:2:"";s:3:"蚪";s:2:"";s:3:"蚓";s:2:"";s:3:"蚩";s:2:"";s:3:"蚶";s:2:"";s:3:"蛄";s:2:"";s:3:"蚵";s:2:"";s:3:"蛎";s:2:"";s:3:"蚰";s:2:"";s:3:"蚺";s:2:"";s:3:"蚱";s:2:"";s:3:"蚯";s:2:"";s:3:"蛉";s:2:"";s:3:"蛏";s:2:"";s:3:"蚴";s:2:"";s:3:"蛩";s:2:"";s:3:"蛱";s:2:"";s:3:"蛲";s:2:"";s:3:"蛭";s:2:"";s:3:"蛳";s:2:"";s:3:"蛐";s:2:"";s:3:"蜓";s:2:"";s:3:"蛞";s:2:"";s:3:"蛴";s:2:"";s:3:"蛟";s:2:"";s:3:"蛘";s:2:"";s:3:"蛑";s:2:"";s:3:"蜃";s:2:"";s:3:"蜇";s:2:"";s:3:"蛸";s:2:"";s:3:"蜈";s:2:"";s:3:"蜊";s:2:"";s:3:"蜍";s:2:"";s:3:"蜉";s:2:"";s:3:"蜣";s:2:"";s:3:"蜻";s:2:"";s:3:"蜞";s:2:"";s:3:"蜥";s:2:"";s:3:"蜮";s:2:"";s:3:"蜚";s:2:"";s:3:"蜾";s:2:"";s:3:"蝈";s:2:"";s:3:"蜴";s:2:"";s:3:"蜱";s:2:"";s:3:"蜩";s:2:"";s:3:"蜷";s:2:"";s:3:"蜿";s:2:"";s:3:"螂";s:2:"";s:3:"蜢";s:2:"";s:3:"蝽";s:2:"";s:3:"蝾";s:2:"";s:3:"蝻";s:2:"";s:3:"蝠";s:2:"";s:3:"蝰";s:2:"";s:3:"蝌";s:2:"";s:3:"蝮";s:2:"";s:3:"螋";s:2:"";s:3:"蝓";s:2:"";s:3:"蝣";s:2:"";s:3:"蝼";s:2:"";s:3:"蝤";s:2:"";s:3:"蝙";s:2:"";s:3:"蝥";s:2:"";s:3:"螓";s:2:"";s:3:"螯";s:2:"";s:3:"螨";s:2:"";s:3:"蟒";s:2:"@";s:3:"驚";s:2:"A";s:3:"驛";s:2:"B";s:3:"驜";s:2:"C";s:3:"驝";s:2:"D";s:3:"驞";s:2:"E";s:3:"驟";s:2:"F";s:3:"驠";s:2:"G";s:3:"驡";s:2:"H";s:3:"驢";s:2:"I";s:3:"驣";s:2:"J";s:3:"驤";s:2:"K";s:3:"驥";s:2:"L";s:3:"驦";s:2:"M";s:3:"驧";s:2:"N";s:3:"驨";s:2:"O";s:3:"驩";s:2:"P";s:3:"驪";s:2:"Q";s:3:"驫";s:2:"R";s:3:"驲";s:2:"S";s:3:"骃";s:2:"T";s:3:"骉";s:2:"U";s:3:"骍";s:2:"V";s:3:"骎";s:2:"W";s:3:"骔";s:2:"X";s:3:"骕";s:2:"Y";s:3:"骙";s:2:"Z";s:3:"骦";s:2:"[";s:3:"骩";s:2:"\";s:3:"骪";s:2:"]";s:3:"骫";s:2:"^";s:3:"骬";s:2:"_";s:3:"骭";s:2:"`";s:3:"骮";s:2:"a";s:3:"骯";s:2:"b";s:3:"骲";s:2:"c";s:3:"骳";s:2:"d";s:3:"骴";s:2:"e";s:3:"骵";s:2:"f";s:3:"骹";s:2:"g";s:3:"骻";s:2:"h";s:3:"骽";s:2:"i";s:3:"骾";s:2:"j";s:3:"骿";s:2:"k";s:3:"髃";s:2:"l";s:3:"髄";s:2:"m";s:3:"髆";s:2:"n";s:3:"髇";s:2:"o";s:3:"髈";s:2:"p";s:3:"髉";s:2:"q";s:3:"髊";s:2:"r";s:3:"髍";s:2:"s";s:3:"髎";s:2:"t";s:3:"髏";s:2:"u";s:3:"髐";s:2:"v";s:3:"髒";s:2:"w";s:3:"體";s:2:"x";s:3:"髕";s:2:"y";s:3:"髖";s:2:"z";s:3:"髗";s:2:"{";s:3:"髙";s:2:"|";s:3:"髚";s:2:"}";s:3:"髛";s:2:"~";s:3:"髜";s:2:"";s:3:"髝";s:2:"";s:3:"髞";s:2:"";s:3:"髠";s:2:"";s:3:"髢";s:2:"";s:3:"髣";s:2:"";s:3:"髤";s:2:"";s:3:"髥";s:2:"";s:3:"髧";s:2:"";s:3:"髨";s:2:"";s:3:"髩";s:2:"";s:3:"髪";s:2:"";s:3:"髬";s:2:"";s:3:"髮";s:2:"";s:3:"髰";s:2:"";s:3:"髱";s:2:"";s:3:"髲";s:2:"";s:3:"髳";s:2:"";s:3:"髴";s:2:"";s:3:"髵";s:2:"";s:3:"髶";s:2:"";s:3:"髷";s:2:"";s:3:"髸";s:2:"";s:3:"髺";s:2:"";s:3:"髼";s:2:"";s:3:"髽";s:2:"";s:3:"髾";s:2:"";s:3:"髿";s:2:"";s:3:"鬀";s:2:"";s:3:"鬁";s:2:"";s:3:"鬂";s:2:"";s:3:"鬄";s:2:"";s:3:"鬅";s:2:"";s:3:"鬆";s:2:"";s:3:"蟆";s:2:"";s:3:"螈";s:2:"";s:3:"螅";s:2:"";s:3:"螭";s:2:"";s:3:"螗";s:2:"";s:3:"螃";s:2:"";s:3:"螫";s:2:"";s:3:"蟥";s:2:"";s:3:"螬";s:2:"";s:3:"螵";s:2:"";s:3:"螳";s:2:"";s:3:"蟋";s:2:"";s:3:"蟓";s:2:"";s:3:"螽";s:2:"";s:3:"蟑";s:2:"";s:3:"蟀";s:2:"";s:3:"蟊";s:2:"";s:3:"蟛";s:2:"";s:3:"蟪";s:2:"";s:3:"蟠";s:2:"";s:3:"蟮";s:2:"";s:3:"蠖";s:2:"";s:3:"蠓";s:2:"";s:3:"蟾";s:2:"";s:3:"蠊";s:2:"";s:3:"蠛";s:2:"";s:3:"蠡";s:2:"";s:3:"蠹";s:2:"";s:3:"蠼";s:2:"";s:3:"缶";s:2:"";s:3:"罂";s:2:"";s:3:"罄";s:2:"";s:3:"罅";s:2:"";s:3:"舐";s:2:"";s:3:"竺";s:2:"";s:3:"竽";s:2:"";s:3:"笈";s:2:"";s:3:"笃";s:2:"";s:3:"笄";s:2:"";s:3:"笕";s:2:"";s:3:"笊";s:2:"";s:3:"笫";s:2:"";s:3:"笏";s:2:"";s:3:"筇";s:2:"";s:3:"笸";s:2:"";s:3:"笪";s:2:"";s:3:"笙";s:2:"";s:3:"笮";s:2:"";s:3:"笱";s:2:"";s:3:"笠";s:2:"";s:3:"笥";s:2:"";s:3:"笤";s:2:"";s:3:"笳";s:2:"";s:3:"笾";s:2:"";s:3:"笞";s:2:"";s:3:"筘";s:2:"";s:3:"筚";s:2:"";s:3:"筅";s:2:"";s:3:"筵";s:2:"";s:3:"筌";s:2:"";s:3:"筝";s:2:"";s:3:"筠";s:2:"";s:3:"筮";s:2:"";s:3:"筻";s:2:"";s:3:"筢";s:2:"";s:3:"筲";s:2:"";s:3:"筱";s:2:"";s:3:"箐";s:2:"";s:3:"箦";s:2:"";s:3:"箧";s:2:"";s:3:"箸";s:2:"";s:3:"箬";s:2:"";s:3:"箝";s:2:"";s:3:"箨";s:2:"";s:3:"箅";s:2:"";s:3:"箪";s:2:"";s:3:"箜";s:2:"";s:3:"箢";s:2:"";s:3:"箫";s:2:"";s:3:"箴";s:2:"";s:3:"篑";s:2:"";s:3:"篁";s:2:"";s:3:"篌";s:2:"";s:3:"篝";s:2:"";s:3:"篚";s:2:"";s:3:"篥";s:2:"";s:3:"篦";s:2:"";s:3:"篪";s:2:"";s:3:"簌";s:2:"";s:3:"篾";s:2:"";s:3:"篼";s:2:"";s:3:"簏";s:2:"";s:3:"簖";s:2:"";s:3:"簋";s:2:"@";s:3:"鬇";s:2:"A";s:3:"鬉";s:2:"B";s:3:"鬊";s:2:"C";s:3:"鬋";s:2:"D";s:3:"鬌";s:2:"E";s:3:"鬍";s:2:"F";s:3:"鬎";s:2:"G";s:3:"鬐";s:2:"H";s:3:"鬑";s:2:"I";s:3:"鬒";s:2:"J";s:3:"鬔";s:2:"K";s:3:"鬕";s:2:"L";s:3:"鬖";s:2:"M";s:3:"鬗";s:2:"N";s:3:"鬘";s:2:"O";s:3:"鬙";s:2:"P";s:3:"鬚";s:2:"Q";s:3:"鬛";s:2:"R";s:3:"鬜";s:2:"S";s:3:"鬝";s:2:"T";s:3:"鬞";s:2:"U";s:3:"鬠";s:2:"V";s:3:"鬡";s:2:"W";s:3:"鬢";s:2:"X";s:3:"鬤";s:2:"Y";s:3:"鬥";s:2:"Z";s:3:"鬦";s:2:"[";s:3:"鬧";s:2:"\";s:3:"鬨";s:2:"]";s:3:"鬩";s:2:"^";s:3:"鬪";s:2:"_";s:3:"鬫";s:2:"`";s:3:"鬬";s:2:"a";s:3:"鬭";s:2:"b";s:3:"鬮";s:2:"c";s:3:"鬰";s:2:"d";s:3:"鬱";s:2:"e";s:3:"鬳";s:2:"f";s:3:"鬴";s:2:"g";s:3:"鬵";s:2:"h";s:3:"鬶";s:2:"i";s:3:"鬷";s:2:"j";s:3:"鬸";s:2:"k";s:3:"鬹";s:2:"l";s:3:"鬺";s:2:"m";s:3:"鬽";s:2:"n";s:3:"鬾";s:2:"o";s:3:"鬿";s:2:"p";s:3:"魀";s:2:"q";s:3:"魆";s:2:"r";s:3:"魊";s:2:"s";s:3:"魋";s:2:"t";s:3:"魌";s:2:"u";s:3:"魎";s:2:"v";s:3:"魐";s:2:"w";s:3:"魒";s:2:"x";s:3:"魓";s:2:"y";s:3:"魕";s:2:"z";s:3:"魖";s:2:"{";s:3:"魗";s:2:"|";s:3:"魘";s:2:"}";s:3:"魙";s:2:"~";s:3:"魚";s:2:"";s:3:"魛";s:2:"";s:3:"魜";s:2:"";s:3:"魝";s:2:"";s:3:"魞";s:2:"";s:3:"魟";s:2:"";s:3:"魠";s:2:"";s:3:"魡";s:2:"";s:3:"魢";s:2:"";s:3:"魣";s:2:"";s:3:"魤";s:2:"";s:3:"魥";s:2:"";s:3:"魦";s:2:"";s:3:"魧";s:2:"";s:3:"魨";s:2:"";s:3:"魩";s:2:"";s:3:"魪";s:2:"";s:3:"魫";s:2:"";s:3:"魬";s:2:"";s:3:"魭";s:2:"";s:3:"魮";s:2:"";s:3:"魯";s:2:"";s:3:"魰";s:2:"";s:3:"魱";s:2:"";s:3:"魲";s:2:"";s:3:"魳";s:2:"";s:3:"魴";s:2:"";s:3:"魵";s:2:"";s:3:"魶";s:2:"";s:3:"魷";s:2:"";s:3:"魸";s:2:"";s:3:"魹";s:2:"";s:3:"魺";s:2:"";s:3:"魻";s:2:"";s:3:"簟";s:2:"";s:3:"簪";s:2:"";s:3:"簦";s:2:"";s:3:"簸";s:2:"";s:3:"籁";s:2:"";s:3:"籀";s:2:"";s:3:"臾";s:2:"";s:3:"舁";s:2:"";s:3:"舂";s:2:"";s:3:"舄";s:2:"";s:3:"臬";s:2:"";s:3:"衄";s:2:"";s:3:"舡";s:2:"";s:3:"舢";s:2:"";s:3:"舣";s:2:"";s:3:"舭";s:2:"";s:3:"舯";s:2:"";s:3:"舨";s:2:"";s:3:"舫";s:2:"";s:3:"舸";s:2:"";s:3:"舻";s:2:"";s:3:"舳";s:2:"";s:3:"舴";s:2:"";s:3:"舾";s:2:"";s:3:"艄";s:2:"";s:3:"艉";s:2:"";s:3:"艋";s:2:"";s:3:"艏";s:2:"";s:3:"艚";s:2:"";s:3:"艟";s:2:"";s:3:"艨";s:2:"";s:3:"衾";s:2:"";s:3:"袅";s:2:"";s:3:"袈";s:2:"";s:3:"裘";s:2:"";s:3:"裟";s:2:"";s:3:"襞";s:2:"";s:3:"羝";s:2:"";s:3:"羟";s:2:"";s:3:"羧";s:2:"";s:3:"羯";s:2:"";s:3:"羰";s:2:"";s:3:"羲";s:2:"";s:3:"籼";s:2:"";s:3:"敉";s:2:"";s:3:"粑";s:2:"";s:3:"粝";s:2:"";s:3:"粜";s:2:"";s:3:"粞";s:2:"";s:3:"粢";s:2:"";s:3:"粲";s:2:"";s:3:"粼";s:2:"";s:3:"粽";s:2:"";s:3:"糁";s:2:"";s:3:"糇";s:2:"";s:3:"糌";s:2:"";s:3:"糍";s:2:"";s:3:"糈";s:2:"";s:3:"糅";s:2:"";s:3:"糗";s:2:"";s:3:"糨";s:2:"";s:3:"艮";s:2:"";s:3:"暨";s:2:"";s:3:"羿";s:2:"";s:3:"翎";s:2:"";s:3:"翕";s:2:"";s:3:"翥";s:2:"";s:3:"翡";s:2:"";s:3:"翦";s:2:"";s:3:"翩";s:2:"";s:3:"翮";s:2:"";s:3:"翳";s:2:"";s:3:"糸";s:2:"";s:3:"絷";s:2:"";s:3:"綦";s:2:"";s:3:"綮";s:2:"";s:3:"繇";s:2:"";s:3:"纛";s:2:"";s:3:"麸";s:2:"";s:3:"麴";s:2:"";s:3:"赳";s:2:"";s:3:"趄";s:2:"";s:3:"趔";s:2:"";s:3:"趑";s:2:"";s:3:"趱";s:2:"";s:3:"赧";s:2:"";s:3:"赭";s:2:"";s:3:"豇";s:2:"";s:3:"豉";s:2:"";s:3:"酊";s:2:"";s:3:"酐";s:2:"";s:3:"酎";s:2:"";s:3:"酏";s:2:"";s:3:"酤";s:2:"@";s:3:"魼";s:2:"A";s:3:"魽";s:2:"B";s:3:"魾";s:2:"C";s:3:"魿";s:2:"D";s:3:"鮀";s:2:"E";s:3:"鮁";s:2:"F";s:3:"鮂";s:2:"G";s:3:"鮃";s:2:"H";s:3:"鮄";s:2:"I";s:3:"鮅";s:2:"J";s:3:"鮆";s:2:"K";s:3:"鮇";s:2:"L";s:3:"鮈";s:2:"M";s:3:"鮉";s:2:"N";s:3:"鮊";s:2:"O";s:3:"鮋";s:2:"P";s:3:"鮌";s:2:"Q";s:3:"鮍";s:2:"R";s:3:"鮎";s:2:"S";s:3:"鮏";s:2:"T";s:3:"鮐";s:2:"U";s:3:"鮑";s:2:"V";s:3:"鮒";s:2:"W";s:3:"鮓";s:2:"X";s:3:"鮔";s:2:"Y";s:3:"鮕";s:2:"Z";s:3:"鮖";s:2:"[";s:3:"鮗";s:2:"\";s:3:"鮘";s:2:"]";s:3:"鮙";s:2:"^";s:3:"鮚";s:2:"_";s:3:"鮛";s:2:"`";s:3:"鮜";s:2:"a";s:3:"鮝";s:2:"b";s:3:"鮞";s:2:"c";s:3:"鮟";s:2:"d";s:3:"鮠";s:2:"e";s:3:"鮡";s:2:"f";s:3:"鮢";s:2:"g";s:3:"鮣";s:2:"h";s:3:"鮤";s:2:"i";s:3:"鮥";s:2:"j";s:3:"鮦";s:2:"k";s:3:"鮧";s:2:"l";s:3:"鮨";s:2:"m";s:3:"鮩";s:2:"n";s:3:"鮪";s:2:"o";s:3:"鮫";s:2:"p";s:3:"鮬";s:2:"q";s:3:"鮭";s:2:"r";s:3:"鮮";s:2:"s";s:3:"鮯";s:2:"t";s:3:"鮰";s:2:"u";s:3:"鮱";s:2:"v";s:3:"鮲";s:2:"w";s:3:"鮳";s:2:"x";s:3:"鮴";s:2:"y";s:3:"鮵";s:2:"z";s:3:"鮶";s:2:"{";s:3:"鮷";s:2:"|";s:3:"鮸";s:2:"}";s:3:"鮹";s:2:"~";s:3:"鮺";s:2:"";s:3:"鮻";s:2:"";s:3:"鮼";s:2:"";s:3:"鮽";s:2:"";s:3:"鮾";s:2:"";s:3:"鮿";s:2:"";s:3:"鯀";s:2:"";s:3:"鯁";s:2:"";s:3:"鯂";s:2:"";s:3:"鯃";s:2:"";s:3:"鯄";s:2:"";s:3:"鯅";s:2:"";s:3:"鯆";s:2:"";s:3:"鯇";s:2:"";s:3:"鯈";s:2:"";s:3:"鯉";s:2:"";s:3:"鯊";s:2:"";s:3:"鯋";s:2:"";s:3:"鯌";s:2:"";s:3:"鯍";s:2:"";s:3:"鯎";s:2:"";s:3:"鯏";s:2:"";s:3:"鯐";s:2:"";s:3:"鯑";s:2:"";s:3:"鯒";s:2:"";s:3:"鯓";s:2:"";s:3:"鯔";s:2:"";s:3:"鯕";s:2:"";s:3:"鯖";s:2:"";s:3:"鯗";s:2:"";s:3:"鯘";s:2:"";s:3:"鯙";s:2:"";s:3:"鯚";s:2:"";s:3:"鯛";s:2:"";s:3:"酢";s:2:"";s:3:"酡";s:2:"";s:3:"酰";s:2:"";s:3:"酩";s:2:"";s:3:"酯";s:2:"";s:3:"酽";s:2:"";s:3:"酾";s:2:"";s:3:"酲";s:2:"";s:3:"酴";s:2:"";s:3:"酹";s:2:"";s:3:"醌";s:2:"";s:3:"醅";s:2:"";s:3:"醐";s:2:"";s:3:"醍";s:2:"";s:3:"醑";s:2:"";s:3:"醢";s:2:"";s:3:"醣";s:2:"";s:3:"醪";s:2:"";s:3:"醭";s:2:"";s:3:"醮";s:2:"";s:3:"醯";s:2:"";s:3:"醵";s:2:"";s:3:"醴";s:2:"";s:3:"醺";s:2:"";s:3:"豕";s:2:"";s:3:"鹾";s:2:"";s:3:"趸";s:2:"";s:3:"跫";s:2:"";s:3:"踅";s:2:"";s:3:"蹙";s:2:"";s:3:"蹩";s:2:"";s:3:"趵";s:2:"";s:3:"趿";s:2:"";s:3:"趼";s:2:"";s:3:"趺";s:2:"";s:3:"跄";s:2:"";s:3:"跖";s:2:"";s:3:"跗";s:2:"";s:3:"跚";s:2:"";s:3:"跞";s:2:"";s:3:"跎";s:2:"";s:3:"跏";s:2:"";s:3:"跛";s:2:"";s:3:"跆";s:2:"";s:3:"跬";s:2:"";s:3:"跷";s:2:"";s:3:"跸";s:2:"";s:3:"跣";s:2:"";s:3:"跹";s:2:"";s:3:"跻";s:2:"";s:3:"跤";s:2:"";s:3:"踉";s:2:"";s:3:"跽";s:2:"";s:3:"踔";s:2:"";s:3:"踝";s:2:"";s:3:"踟";s:2:"";s:3:"踬";s:2:"";s:3:"踮";s:2:"";s:3:"踣";s:2:"";s:3:"踯";s:2:"";s:3:"踺";s:2:"";s:3:"蹀";s:2:"";s:3:"踹";s:2:"";s:3:"踵";s:2:"";s:3:"踽";s:2:"";s:3:"踱";s:2:"";s:3:"蹉";s:2:"";s:3:"蹁";s:2:"";s:3:"蹂";s:2:"";s:3:"蹑";s:2:"";s:3:"蹒";s:2:"";s:3:"蹊";s:2:"";s:3:"蹰";s:2:"";s:3:"蹶";s:2:"";s:3:"蹼";s:2:"";s:3:"蹯";s:2:"";s:3:"蹴";s:2:"";s:3:"躅";s:2:"";s:3:"躏";s:2:"";s:3:"躔";s:2:"";s:3:"躐";s:2:"";s:3:"躜";s:2:"";s:3:"躞";s:2:"";s:3:"豸";s:2:"";s:3:"貂";s:2:"";s:3:"貊";s:2:"";s:3:"貅";s:2:"";s:3:"貘";s:2:"";s:3:"貔";s:2:"";s:3:"斛";s:2:"";s:3:"觖";s:2:"";s:3:"觞";s:2:"";s:3:"觚";s:2:"";s:3:"觜";s:2:"@";s:3:"鯜";s:2:"A";s:3:"鯝";s:2:"B";s:3:"鯞";s:2:"C";s:3:"鯟";s:2:"D";s:3:"鯠";s:2:"E";s:3:"鯡";s:2:"F";s:3:"鯢";s:2:"G";s:3:"鯣";s:2:"H";s:3:"鯤";s:2:"I";s:3:"鯥";s:2:"J";s:3:"鯦";s:2:"K";s:3:"鯧";s:2:"L";s:3:"鯨";s:2:"M";s:3:"鯩";s:2:"N";s:3:"鯪";s:2:"O";s:3:"鯫";s:2:"P";s:3:"鯬";s:2:"Q";s:3:"鯭";s:2:"R";s:3:"鯮";s:2:"S";s:3:"鯯";s:2:"T";s:3:"鯰";s:2:"U";s:3:"鯱";s:2:"V";s:3:"鯲";s:2:"W";s:3:"鯳";s:2:"X";s:3:"鯴";s:2:"Y";s:3:"鯵";s:2:"Z";s:3:"鯶";s:2:"[";s:3:"鯷";s:2:"\";s:3:"鯸";s:2:"]";s:3:"鯹";s:2:"^";s:3:"鯺";s:2:"_";s:3:"鯻";s:2:"`";s:3:"鯼";s:2:"a";s:3:"鯽";s:2:"b";s:3:"鯾";s:2:"c";s:3:"鯿";s:2:"d";s:3:"鰀";s:2:"e";s:3:"鰁";s:2:"f";s:3:"鰂";s:2:"g";s:3:"鰃";s:2:"h";s:3:"鰄";s:2:"i";s:3:"鰅";s:2:"j";s:3:"鰆";s:2:"k";s:3:"鰇";s:2:"l";s:3:"鰈";s:2:"m";s:3:"鰉";s:2:"n";s:3:"鰊";s:2:"o";s:3:"鰋";s:2:"p";s:3:"鰌";s:2:"q";s:3:"鰍";s:2:"r";s:3:"鰎";s:2:"s";s:3:"鰏";s:2:"t";s:3:"鰐";s:2:"u";s:3:"鰑";s:2:"v";s:3:"鰒";s:2:"w";s:3:"鰓";s:2:"x";s:3:"鰔";s:2:"y";s:3:"鰕";s:2:"z";s:3:"鰖";s:2:"{";s:3:"鰗";s:2:"|";s:3:"鰘";s:2:"}";s:3:"鰙";s:2:"~";s:3:"鰚";s:2:"";s:3:"鰛";s:2:"";s:3:"鰜";s:2:"";s:3:"鰝";s:2:"";s:3:"鰞";s:2:"";s:3:"鰟";s:2:"";s:3:"鰠";s:2:"";s:3:"鰡";s:2:"";s:3:"鰢";s:2:"";s:3:"鰣";s:2:"";s:3:"鰤";s:2:"";s:3:"鰥";s:2:"";s:3:"鰦";s:2:"";s:3:"鰧";s:2:"";s:3:"鰨";s:2:"";s:3:"鰩";s:2:"";s:3:"鰪";s:2:"";s:3:"鰫";s:2:"";s:3:"鰬";s:2:"";s:3:"鰭";s:2:"";s:3:"鰮";s:2:"";s:3:"鰯";s:2:"";s:3:"鰰";s:2:"";s:3:"鰱";s:2:"";s:3:"鰲";s:2:"";s:3:"鰳";s:2:"";s:3:"鰴";s:2:"";s:3:"鰵";s:2:"";s:3:"鰶";s:2:"";s:3:"鰷";s:2:"";s:3:"鰸";s:2:"";s:3:"鰹";s:2:"";s:3:"鰺";s:2:"";s:3:"鰻";s:2:"";s:3:"觥";s:2:"";s:3:"觫";s:2:"";s:3:"觯";s:2:"";s:3:"訾";s:2:"";s:3:"謦";s:2:"";s:3:"靓";s:2:"";s:3:"雩";s:2:"";s:3:"雳";s:2:"";s:3:"雯";s:2:"";s:3:"霆";s:2:"";s:3:"霁";s:2:"";s:3:"霈";s:2:"";s:3:"霏";s:2:"";s:3:"霎";s:2:"";s:3:"霪";s:2:"";s:3:"霭";s:2:"";s:3:"霰";s:2:"";s:3:"霾";s:2:"";s:3:"龀";s:2:"";s:3:"龃";s:2:"";s:3:"龅";s:2:"";s:3:"龆";s:2:"";s:3:"龇";s:2:"";s:3:"龈";s:2:"";s:3:"龉";s:2:"";s:3:"龊";s:2:"";s:3:"龌";s:2:"";s:3:"黾";s:2:"";s:3:"鼋";s:2:"";s:3:"鼍";s:2:"";s:3:"隹";s:2:"";s:3:"隼";s:2:"";s:3:"隽";s:2:"";s:3:"雎";s:2:"";s:3:"雒";s:2:"";s:3:"瞿";s:2:"";s:3:"雠";s:2:"";s:3:"銎";s:2:"";s:3:"銮";s:2:"";s:3:"鋈";s:2:"";s:3:"錾";s:2:"";s:3:"鍪";s:2:"";s:3:"鏊";s:2:"";s:3:"鎏";s:2:"";s:3:"鐾";s:2:"";s:3:"鑫";s:2:"";s:3:"鱿";s:2:"";s:3:"鲂";s:2:"";s:3:"鲅";s:2:"";s:3:"鲆";s:2:"";s:3:"鲇";s:2:"";s:3:"鲈";s:2:"";s:3:"稣";s:2:"";s:3:"鲋";s:2:"";s:3:"鲎";s:2:"";s:3:"鲐";s:2:"";s:3:"鲑";s:2:"";s:3:"鲒";s:2:"";s:3:"鲔";s:2:"";s:3:"鲕";s:2:"";s:3:"鲚";s:2:"";s:3:"鲛";s:2:"";s:3:"鲞";s:2:"";s:3:"鲟";s:2:"";s:3:"鲠";s:2:"";s:3:"鲡";s:2:"";s:3:"鲢";s:2:"";s:3:"鲣";s:2:"";s:3:"鲥";s:2:"";s:3:"鲦";s:2:"";s:3:"鲧";s:2:"";s:3:"鲨";s:2:"";s:3:"鲩";s:2:"";s:3:"鲫";s:2:"";s:3:"鲭";s:2:"";s:3:"鲮";s:2:"";s:3:"鲰";s:2:"";s:3:"鲱";s:2:"";s:3:"鲲";s:2:"";s:3:"鲳";s:2:"";s:3:"鲴";s:2:"";s:3:"鲵";s:2:"";s:3:"鲶";s:2:"";s:3:"鲷";s:2:"";s:3:"鲺";s:2:"";s:3:"鲻";s:2:"";s:3:"鲼";s:2:"";s:3:"鲽";s:2:"";s:3:"鳄";s:2:"";s:3:"鳅";s:2:"";s:3:"鳆";s:2:"";s:3:"鳇";s:2:"";s:3:"鳊";s:2:"";s:3:"鳋";s:2:"@";s:3:"鰼";s:2:"A";s:3:"鰽";s:2:"B";s:3:"鰾";s:2:"C";s:3:"鰿";s:2:"D";s:3:"鱀";s:2:"E";s:3:"鱁";s:2:"F";s:3:"鱂";s:2:"G";s:3:"鱃";s:2:"H";s:3:"鱄";s:2:"I";s:3:"鱅";s:2:"J";s:3:"鱆";s:2:"K";s:3:"鱇";s:2:"L";s:3:"鱈";s:2:"M";s:3:"鱉";s:2:"N";s:3:"鱊";s:2:"O";s:3:"鱋";s:2:"P";s:3:"鱌";s:2:"Q";s:3:"鱍";s:2:"R";s:3:"鱎";s:2:"S";s:3:"鱏";s:2:"T";s:3:"鱐";s:2:"U";s:3:"鱑";s:2:"V";s:3:"鱒";s:2:"W";s:3:"鱓";s:2:"X";s:3:"鱔";s:2:"Y";s:3:"鱕";s:2:"Z";s:3:"鱖";s:2:"[";s:3:"鱗";s:2:"\";s:3:"鱘";s:2:"]";s:3:"鱙";s:2:"^";s:3:"鱚";s:2:"_";s:3:"鱛";s:2:"`";s:3:"鱜";s:2:"a";s:3:"鱝";s:2:"b";s:3:"鱞";s:2:"c";s:3:"鱟";s:2:"d";s:3:"鱠";s:2:"e";s:3:"鱡";s:2:"f";s:3:"鱢";s:2:"g";s:3:"鱣";s:2:"h";s:3:"鱤";s:2:"i";s:3:"鱥";s:2:"j";s:3:"鱦";s:2:"k";s:3:"鱧";s:2:"l";s:3:"鱨";s:2:"m";s:3:"鱩";s:2:"n";s:3:"鱪";s:2:"o";s:3:"鱫";s:2:"p";s:3:"鱬";s:2:"q";s:3:"鱭";s:2:"r";s:3:"鱮";s:2:"s";s:3:"鱯";s:2:"t";s:3:"鱰";s:2:"u";s:3:"鱱";s:2:"v";s:3:"鱲";s:2:"w";s:3:"鱳";s:2:"x";s:3:"鱴";s:2:"y";s:3:"鱵";s:2:"z";s:3:"鱶";s:2:"{";s:3:"鱷";s:2:"|";s:3:"鱸";s:2:"}";s:3:"鱹";s:2:"~";s:3:"鱺";s:2:"";s:3:"鱻";s:2:"";s:3:"鱽";s:2:"";s:3:"鱾";s:2:"";s:3:"鲀";s:2:"";s:3:"鲃";s:2:"";s:3:"鲄";s:2:"";s:3:"鲉";s:2:"";s:3:"鲊";s:2:"";s:3:"鲌";s:2:"";s:3:"鲏";s:2:"";s:3:"鲓";s:2:"";s:3:"鲖";s:2:"";s:3:"鲗";s:2:"";s:3:"鲘";s:2:"";s:3:"鲙";s:2:"";s:3:"鲝";s:2:"";s:3:"鲪";s:2:"";s:3:"鲬";s:2:"";s:3:"鲯";s:2:"";s:3:"鲹";s:2:"";s:3:"鲾";s:2:"";s:3:"鲿";s:2:"";s:3:"鳀";s:2:"";s:3:"鳁";s:2:"";s:3:"鳂";s:2:"";s:3:"鳈";s:2:"";s:3:"鳉";s:2:"";s:3:"鳑";s:2:"";s:3:"鳒";s:2:"";s:3:"鳚";s:2:"";s:3:"鳛";s:2:"";s:3:"鳠";s:2:"";s:3:"鳡";s:2:"";s:3:"鳌";s:2:"";s:3:"鳍";s:2:"";s:3:"鳎";s:2:"";s:3:"鳏";s:2:"";s:3:"鳐";s:2:"";s:3:"鳓";s:2:"";s:3:"鳔";s:2:"";s:3:"鳕";s:2:"";s:3:"鳗";s:2:"";s:3:"鳘";s:2:"";s:3:"鳙";s:2:"";s:3:"鳜";s:2:"";s:3:"鳝";s:2:"";s:3:"鳟";s:2:"";s:3:"鳢";s:2:"";s:3:"靼";s:2:"";s:3:"鞅";s:2:"";s:3:"鞑";s:2:"";s:3:"鞒";s:2:"";s:3:"鞔";s:2:"";s:3:"鞯";s:2:"";s:3:"鞫";s:2:"";s:3:"鞣";s:2:"";s:3:"鞲";s:2:"";s:3:"鞴";s:2:"";s:3:"骱";s:2:"";s:3:"骰";s:2:"";s:3:"骷";s:2:"";s:3:"鹘";s:2:"";s:3:"骶";s:2:"";s:3:"骺";s:2:"";s:3:"骼";s:2:"";s:3:"髁";s:2:"";s:3:"髀";s:2:"";s:3:"髅";s:2:"";s:3:"髂";s:2:"";s:3:"髋";s:2:"";s:3:"髌";s:2:"";s:3:"髑";s:2:"";s:3:"魅";s:2:"";s:3:"魃";s:2:"";s:3:"魇";s:2:"";s:3:"魉";s:2:"";s:3:"魈";s:2:"";s:3:"魍";s:2:"";s:3:"魑";s:2:"";s:3:"飨";s:2:"";s:3:"餍";s:2:"";s:3:"餮";s:2:"";s:3:"饕";s:2:"";s:3:"饔";s:2:"";s:3:"髟";s:2:"";s:3:"髡";s:2:"";s:3:"髦";s:2:"";s:3:"髯";s:2:"";s:3:"髫";s:2:"";s:3:"髻";s:2:"";s:3:"髭";s:2:"";s:3:"髹";s:2:"";s:3:"鬈";s:2:"";s:3:"鬏";s:2:"";s:3:"鬓";s:2:"";s:3:"鬟";s:2:"";s:3:"鬣";s:2:"";s:3:"麽";s:2:"";s:3:"麾";s:2:"";s:3:"縻";s:2:"";s:3:"麂";s:2:"";s:3:"麇";s:2:"";s:3:"麈";s:2:"";s:3:"麋";s:2:"";s:3:"麒";s:2:"";s:3:"鏖";s:2:"";s:3:"麝";s:2:"";s:3:"麟";s:2:"";s:3:"黛";s:2:"";s:3:"黜";s:2:"";s:3:"黝";s:2:"";s:3:"黠";s:2:"";s:3:"黟";s:2:"";s:3:"黢";s:2:"";s:3:"黩";s:2:"";s:3:"黧";s:2:"";s:3:"黥";s:2:"";s:3:"黪";s:2:"";s:3:"黯";s:2:"";s:3:"鼢";s:2:"";s:3:"鼬";s:2:"";s:3:"鼯";s:2:"";s:3:"鼹";s:2:"";s:3:"鼷";s:2:"";s:3:"鼽";s:2:"";s:3:"鼾";s:2:"";s:3:"齄";s:2:"@";s:3:"鳣";s:2:"A";s:3:"鳤";s:2:"B";s:3:"鳥";s:2:"C";s:3:"鳦";s:2:"D";s:3:"鳧";s:2:"E";s:3:"鳨";s:2:"F";s:3:"鳩";s:2:"G";s:3:"鳪";s:2:"H";s:3:"鳫";s:2:"I";s:3:"鳬";s:2:"J";s:3:"鳭";s:2:"K";s:3:"鳮";s:2:"L";s:3:"鳯";s:2:"M";s:3:"鳰";s:2:"N";s:3:"鳱";s:2:"O";s:3:"鳲";s:2:"P";s:3:"鳳";s:2:"Q";s:3:"鳴";s:2:"R";s:3:"鳵";s:2:"S";s:3:"鳶";s:2:"T";s:3:"鳷";s:2:"U";s:3:"鳸";s:2:"V";s:3:"鳹";s:2:"W";s:3:"鳺";s:2:"X";s:3:"鳻";s:2:"Y";s:3:"鳼";s:2:"Z";s:3:"鳽";s:2:"[";s:3:"鳾";s:2:"\";s:3:"鳿";s:2:"]";s:3:"鴀";s:2:"^";s:3:"鴁";s:2:"_";s:3:"鴂";s:2:"`";s:3:"鴃";s:2:"a";s:3:"鴄";s:2:"b";s:3:"鴅";s:2:"c";s:3:"鴆";s:2:"d";s:3:"鴇";s:2:"e";s:3:"鴈";s:2:"f";s:3:"鴉";s:2:"g";s:3:"鴊";s:2:"h";s:3:"鴋";s:2:"i";s:3:"鴌";s:2:"j";s:3:"鴍";s:2:"k";s:3:"鴎";s:2:"l";s:3:"鴏";s:2:"m";s:3:"鴐";s:2:"n";s:3:"鴑";s:2:"o";s:3:"鴒";s:2:"p";s:3:"鴓";s:2:"q";s:3:"鴔";s:2:"r";s:3:"鴕";s:2:"s";s:3:"鴖";s:2:"t";s:3:"鴗";s:2:"u";s:3:"鴘";s:2:"v";s:3:"鴙";s:2:"w";s:3:"鴚";s:2:"x";s:3:"鴛";s:2:"y";s:3:"鴜";s:2:"z";s:3:"鴝";s:2:"{";s:3:"鴞";s:2:"|";s:3:"鴟";s:2:"}";s:3:"鴠";s:2:"~";s:3:"鴡";s:2:"";s:3:"鴢";s:2:"";s:3:"鴣";s:2:"";s:3:"鴤";s:2:"";s:3:"鴥";s:2:"";s:3:"鴦";s:2:"";s:3:"鴧";s:2:"";s:3:"鴨";s:2:"";s:3:"鴩";s:2:"";s:3:"鴪";s:2:"";s:3:"鴫";s:2:"";s:3:"鴬";s:2:"";s:3:"鴭";s:2:"";s:3:"鴮";s:2:"";s:3:"鴯";s:2:"";s:3:"鴰";s:2:"";s:3:"鴱";s:2:"";s:3:"鴲";s:2:"";s:3:"鴳";s:2:"";s:3:"鴴";s:2:"";s:3:"鴵";s:2:"";s:3:"鴶";s:2:"";s:3:"鴷";s:2:"";s:3:"鴸";s:2:"";s:3:"鴹";s:2:"";s:3:"鴺";s:2:"";s:3:"鴻";s:2:"";s:3:"鴼";s:2:"";s:3:"鴽";s:2:"";s:3:"鴾";s:2:"";s:3:"鴿";s:2:"";s:3:"鵀";s:2:"";s:3:"鵁";s:2:"";s:3:"鵂";s:2:"@";s:3:"鵃";s:2:"A";s:3:"鵄";s:2:"B";s:3:"鵅";s:2:"C";s:3:"鵆";s:2:"D";s:3:"鵇";s:2:"E";s:3:"鵈";s:2:"F";s:3:"鵉";s:2:"G";s:3:"鵊";s:2:"H";s:3:"鵋";s:2:"I";s:3:"鵌";s:2:"J";s:3:"鵍";s:2:"K";s:3:"鵎";s:2:"L";s:3:"鵏";s:2:"M";s:3:"鵐";s:2:"N";s:3:"鵑";s:2:"O";s:3:"鵒";s:2:"P";s:3:"鵓";s:2:"Q";s:3:"鵔";s:2:"R";s:3:"鵕";s:2:"S";s:3:"鵖";s:2:"T";s:3:"鵗";s:2:"U";s:3:"鵘";s:2:"V";s:3:"鵙";s:2:"W";s:3:"鵚";s:2:"X";s:3:"鵛";s:2:"Y";s:3:"鵜";s:2:"Z";s:3:"鵝";s:2:"[";s:3:"鵞";s:2:"\";s:3:"鵟";s:2:"]";s:3:"鵠";s:2:"^";s:3:"鵡";s:2:"_";s:3:"鵢";s:2:"`";s:3:"鵣";s:2:"a";s:3:"鵤";s:2:"b";s:3:"鵥";s:2:"c";s:3:"鵦";s:2:"d";s:3:"鵧";s:2:"e";s:3:"鵨";s:2:"f";s:3:"鵩";s:2:"g";s:3:"鵪";s:2:"h";s:3:"鵫";s:2:"i";s:3:"鵬";s:2:"j";s:3:"鵭";s:2:"k";s:3:"鵮";s:2:"l";s:3:"鵯";s:2:"m";s:3:"鵰";s:2:"n";s:3:"鵱";s:2:"o";s:3:"鵲";s:2:"p";s:3:"鵳";s:2:"q";s:3:"鵴";s:2:"r";s:3:"鵵";s:2:"s";s:3:"鵶";s:2:"t";s:3:"鵷";s:2:"u";s:3:"鵸";s:2:"v";s:3:"鵹";s:2:"w";s:3:"鵺";s:2:"x";s:3:"鵻";s:2:"y";s:3:"鵼";s:2:"z";s:3:"鵽";s:2:"{";s:3:"鵾";s:2:"|";s:3:"鵿";s:2:"}";s:3:"鶀";s:2:"~";s:3:"鶁";s:2:"";s:3:"鶂";s:2:"";s:3:"鶃";s:2:"";s:3:"鶄";s:2:"";s:3:"鶅";s:2:"";s:3:"鶆";s:2:"";s:3:"鶇";s:2:"";s:3:"鶈";s:2:"";s:3:"鶉";s:2:"";s:3:"鶊";s:2:"";s:3:"鶋";s:2:"";s:3:"鶌";s:2:"";s:3:"鶍";s:2:"";s:3:"鶎";s:2:"";s:3:"鶏";s:2:"";s:3:"鶐";s:2:"";s:3:"鶑";s:2:"";s:3:"鶒";s:2:"";s:3:"鶓";s:2:"";s:3:"鶔";s:2:"";s:3:"鶕";s:2:"";s:3:"鶖";s:2:"";s:3:"鶗";s:2:"";s:3:"鶘";s:2:"";s:3:"鶙";s:2:"";s:3:"鶚";s:2:"";s:3:"鶛";s:2:"";s:3:"鶜";s:2:"";s:3:"鶝";s:2:"";s:3:"鶞";s:2:"";s:3:"鶟";s:2:"";s:3:"鶠";s:2:"";s:3:"鶡";s:2:"";s:3:"鶢";s:2:"@";s:3:"鶣";s:2:"A";s:3:"鶤";s:2:"B";s:3:"鶥";s:2:"C";s:3:"鶦";s:2:"D";s:3:"鶧";s:2:"E";s:3:"鶨";s:2:"F";s:3:"鶩";s:2:"G";s:3:"鶪";s:2:"H";s:3:"鶫";s:2:"I";s:3:"鶬";s:2:"J";s:3:"鶭";s:2:"K";s:3:"鶮";s:2:"L";s:3:"鶯";s:2:"M";s:3:"鶰";s:2:"N";s:3:"鶱";s:2:"O";s:3:"鶲";s:2:"P";s:3:"鶳";s:2:"Q";s:3:"鶴";s:2:"R";s:3:"鶵";s:2:"S";s:3:"鶶";s:2:"T";s:3:"鶷";s:2:"U";s:3:"鶸";s:2:"V";s:3:"鶹";s:2:"W";s:3:"鶺";s:2:"X";s:3:"鶻";s:2:"Y";s:3:"鶼";s:2:"Z";s:3:"鶽";s:2:"[";s:3:"鶾";s:2:"\";s:3:"鶿";s:2:"]";s:3:"鷀";s:2:"^";s:3:"鷁";s:2:"_";s:3:"鷂";s:2:"`";s:3:"鷃";s:2:"a";s:3:"鷄";s:2:"b";s:3:"鷅";s:2:"c";s:3:"鷆";s:2:"d";s:3:"鷇";s:2:"e";s:3:"鷈";s:2:"f";s:3:"鷉";s:2:"g";s:3:"鷊";s:2:"h";s:3:"鷋";s:2:"i";s:3:"鷌";s:2:"j";s:3:"鷍";s:2:"k";s:3:"鷎";s:2:"l";s:3:"鷏";s:2:"m";s:3:"鷐";s:2:"n";s:3:"鷑";s:2:"o";s:3:"鷒";s:2:"p";s:3:"鷓";s:2:"q";s:3:"鷔";s:2:"r";s:3:"鷕";s:2:"s";s:3:"鷖";s:2:"t";s:3:"鷗";s:2:"u";s:3:"鷘";s:2:"v";s:3:"鷙";s:2:"w";s:3:"鷚";s:2:"x";s:3:"鷛";s:2:"y";s:3:"鷜";s:2:"z";s:3:"鷝";s:2:"{";s:3:"鷞";s:2:"|";s:3:"鷟";s:2:"}";s:3:"鷠";s:2:"~";s:3:"鷡";s:2:"";s:3:"鷢";s:2:"";s:3:"鷣";s:2:"";s:3:"鷤";s:2:"";s:3:"鷥";s:2:"";s:3:"鷦";s:2:"";s:3:"鷧";s:2:"";s:3:"鷨";s:2:"";s:3:"鷩";s:2:"";s:3:"鷪";s:2:"";s:3:"鷫";s:2:"";s:3:"鷬";s:2:"";s:3:"鷭";s:2:"";s:3:"鷮";s:2:"";s:3:"鷯";s:2:"";s:3:"鷰";s:2:"";s:3:"鷱";s:2:"";s:3:"鷲";s:2:"";s:3:"鷳";s:2:"";s:3:"鷴";s:2:"";s:3:"鷵";s:2:"";s:3:"鷶";s:2:"";s:3:"鷷";s:2:"";s:3:"鷸";s:2:"";s:3:"鷹";s:2:"";s:3:"鷺";s:2:"";s:3:"鷻";s:2:"";s:3:"鷼";s:2:"";s:3:"鷽";s:2:"";s:3:"鷾";s:2:"";s:3:"鷿";s:2:"";s:3:"鸀";s:2:"";s:3:"鸁";s:2:"";s:3:"鸂";s:2:"@";s:3:"鸃";s:2:"A";s:3:"鸄";s:2:"B";s:3:"鸅";s:2:"C";s:3:"鸆";s:2:"D";s:3:"鸇";s:2:"E";s:3:"鸈";s:2:"F";s:3:"鸉";s:2:"G";s:3:"鸊";s:2:"H";s:3:"鸋";s:2:"I";s:3:"鸌";s:2:"J";s:3:"鸍";s:2:"K";s:3:"鸎";s:2:"L";s:3:"鸏";s:2:"M";s:3:"鸐";s:2:"N";s:3:"鸑";s:2:"O";s:3:"鸒";s:2:"P";s:3:"鸓";s:2:"Q";s:3:"鸔";s:2:"R";s:3:"鸕";s:2:"S";s:3:"鸖";s:2:"T";s:3:"鸗";s:2:"U";s:3:"鸘";s:2:"V";s:3:"鸙";s:2:"W";s:3:"鸚";s:2:"X";s:3:"鸛";s:2:"Y";s:3:"鸜";s:2:"Z";s:3:"鸝";s:2:"[";s:3:"鸞";s:2:"\";s:3:"鸤";s:2:"]";s:3:"鸧";s:2:"^";s:3:"鸮";s:2:"_";s:3:"鸰";s:2:"`";s:3:"鸴";s:2:"a";s:3:"鸻";s:2:"b";s:3:"鸼";s:2:"c";s:3:"鹀";s:2:"d";s:3:"鹍";s:2:"e";s:3:"鹐";s:2:"f";s:3:"鹒";s:2:"g";s:3:"鹓";s:2:"h";s:3:"鹔";s:2:"i";s:3:"鹖";s:2:"j";s:3:"鹙";s:2:"k";s:3:"鹝";s:2:"l";s:3:"鹟";s:2:"m";s:3:"鹠";s:2:"n";s:3:"鹡";s:2:"o";s:3:"鹢";s:2:"p";s:3:"鹥";s:2:"q";s:3:"鹮";s:2:"r";s:3:"鹯";s:2:"s";s:3:"鹲";s:2:"t";s:3:"鹴";s:2:"u";s:3:"鹵";s:2:"v";s:3:"鹶";s:2:"w";s:3:"鹷";s:2:"x";s:3:"鹸";s:2:"y";s:3:"鹹";s:2:"z";s:3:"鹺";s:2:"{";s:3:"鹻";s:2:"|";s:3:"鹼";s:2:"}";s:3:"鹽";s:2:"~";s:3:"麀";s:2:"";s:3:"麁";s:2:"";s:3:"麃";s:2:"";s:3:"麄";s:2:"";s:3:"麅";s:2:"";s:3:"麆";s:2:"";s:3:"麉";s:2:"";s:3:"麊";s:2:"";s:3:"麌";s:2:"";s:3:"麍";s:2:"";s:3:"麎";s:2:"";s:3:"麏";s:2:"";s:3:"麐";s:2:"";s:3:"麑";s:2:"";s:3:"麔";s:2:"";s:3:"麕";s:2:"";s:3:"麖";s:2:"";s:3:"麗";s:2:"";s:3:"麘";s:2:"";s:3:"麙";s:2:"";s:3:"麚";s:2:"";s:3:"麛";s:2:"";s:3:"麜";s:2:"";s:3:"麞";s:2:"";s:3:"麠";s:2:"";s:3:"麡";s:2:"";s:3:"麢";s:2:"";s:3:"麣";s:2:"";s:3:"麤";s:2:"";s:3:"麥";s:2:"";s:3:"麧";s:2:"";s:3:"麨";s:2:"";s:3:"麩";s:2:"";s:3:"麪";s:2:"@";s:3:"麫";s:2:"A";s:3:"麬";s:2:"B";s:3:"麭";s:2:"C";s:3:"麮";s:2:"D";s:3:"麯";s:2:"E";s:3:"麰";s:2:"F";s:3:"麱";s:2:"G";s:3:"麲";s:2:"H";s:3:"麳";s:2:"I";s:3:"麵";s:2:"J";s:3:"麶";s:2:"K";s:3:"麷";s:2:"L";s:3:"麹";s:2:"M";s:3:"麺";s:2:"N";s:3:"麼";s:2:"O";s:3:"麿";s:2:"P";s:3:"黀";s:2:"Q";s:3:"黁";s:2:"R";s:3:"黂";s:2:"S";s:3:"黃";s:2:"T";s:3:"黅";s:2:"U";s:3:"黆";s:2:"V";s:3:"黇";s:2:"W";s:3:"黈";s:2:"X";s:3:"黊";s:2:"Y";s:3:"黋";s:2:"Z";s:3:"黌";s:2:"[";s:3:"黐";s:2:"\";s:3:"黒";s:2:"]";s:3:"黓";s:2:"^";s:3:"黕";s:2:"_";s:3:"黖";s:2:"`";s:3:"黗";s:2:"a";s:3:"黙";s:2:"b";s:3:"黚";s:2:"c";s:3:"點";s:2:"d";s:3:"黡";s:2:"e";s:3:"黣";s:2:"f";s:3:"黤";s:2:"g";s:3:"黦";s:2:"h";s:3:"黨";s:2:"i";s:3:"黫";s:2:"j";s:3:"黬";s:2:"k";s:3:"黭";s:2:"l";s:3:"黮";s:2:"m";s:3:"黰";s:2:"n";s:3:"黱";s:2:"o";s:3:"黲";s:2:"p";s:3:"黳";s:2:"q";s:3:"黴";s:2:"r";s:3:"黵";s:2:"s";s:3:"黶";s:2:"t";s:3:"黷";s:2:"u";s:3:"黸";s:2:"v";s:3:"黺";s:2:"w";s:3:"黽";s:2:"x";s:3:"黿";s:2:"y";s:3:"鼀";s:2:"z";s:3:"鼁";s:2:"{";s:3:"鼂";s:2:"|";s:3:"鼃";s:2:"}";s:3:"鼄";s:2:"~";s:3:"鼅";s:2:"";s:3:"鼆";s:2:"";s:3:"鼇";s:2:"";s:3:"鼈";s:2:"";s:3:"鼉";s:2:"";s:3:"鼊";s:2:"";s:3:"鼌";s:2:"";s:3:"鼏";s:2:"";s:3:"鼑";s:2:"";s:3:"鼒";s:2:"";s:3:"鼔";s:2:"";s:3:"鼕";s:2:"";s:3:"鼖";s:2:"";s:3:"鼘";s:2:"";s:3:"鼚";s:2:"";s:3:"鼛";s:2:"";s:3:"鼜";s:2:"";s:3:"鼝";s:2:"";s:3:"鼞";s:2:"";s:3:"鼟";s:2:"";s:3:"鼡";s:2:"";s:3:"鼣";s:2:"";s:3:"鼤";s:2:"";s:3:"鼥";s:2:"";s:3:"鼦";s:2:"";s:3:"鼧";s:2:"";s:3:"鼨";s:2:"";s:3:"鼩";s:2:"";s:3:"鼪";s:2:"";s:3:"鼫";s:2:"";s:3:"鼭";s:2:"";s:3:"鼮";s:2:"";s:3:"鼰";s:2:"";s:3:"鼱";s:2:"@";s:3:"鼲";s:2:"A";s:3:"鼳";s:2:"B";s:3:"鼴";s:2:"C";s:3:"鼵";s:2:"D";s:3:"鼶";s:2:"E";s:3:"鼸";s:2:"F";s:3:"鼺";s:2:"G";s:3:"鼼";s:2:"H";s:3:"鼿";s:2:"I";s:3:"齀";s:2:"J";s:3:"齁";s:2:"K";s:3:"齂";s:2:"L";s:3:"齃";s:2:"M";s:3:"齅";s:2:"N";s:3:"齆";s:2:"O";s:3:"齇";s:2:"P";s:3:"齈";s:2:"Q";s:3:"齉";s:2:"R";s:3:"齊";s:2:"S";s:3:"齋";s:2:"T";s:3:"齌";s:2:"U";s:3:"齍";s:2:"V";s:3:"齎";s:2:"W";s:3:"齏";s:2:"X";s:3:"齒";s:2:"Y";s:3:"齓";s:2:"Z";s:3:"齔";s:2:"[";s:3:"齕";s:2:"\";s:3:"齖";s:2:"]";s:3:"齗";s:2:"^";s:3:"齘";s:2:"_";s:3:"齙";s:2:"`";s:3:"齚";s:2:"a";s:3:"齛";s:2:"b";s:3:"齜";s:2:"c";s:3:"齝";s:2:"d";s:3:"齞";s:2:"e";s:3:"齟";s:2:"f";s:3:"齠";s:2:"g";s:3:"齡";s:2:"h";s:3:"齢";s:2:"i";s:3:"齣";s:2:"j";s:3:"齤";s:2:"k";s:3:"齥";s:2:"l";s:3:"齦";s:2:"m";s:3:"齧";s:2:"n";s:3:"齨";s:2:"o";s:3:"齩";s:2:"p";s:3:"齪";s:2:"q";s:3:"齫";s:2:"r";s:3:"齬";s:2:"s";s:3:"齭";s:2:"t";s:3:"齮";s:2:"u";s:3:"齯";s:2:"v";s:3:"齰";s:2:"w";s:3:"齱";s:2:"x";s:3:"齲";s:2:"y";s:3:"齳";s:2:"z";s:3:"齴";s:2:"{";s:3:"齵";s:2:"|";s:3:"齶";s:2:"}";s:3:"齷";s:2:"~";s:3:"齸";s:2:"";s:3:"齹";s:2:"";s:3:"齺";s:2:"";s:3:"齻";s:2:"";s:3:"齼";s:2:"";s:3:"齽";s:2:"";s:3:"齾";s:2:"";s:3:"龁";s:2:"";s:3:"龂";s:2:"";s:3:"龍";s:2:"";s:3:"龎";s:2:"";s:3:"龏";s:2:"";s:3:"龐";s:2:"";s:3:"龑";s:2:"";s:3:"龒";s:2:"";s:3:"龓";s:2:"";s:3:"龔";s:2:"";s:3:"龕";s:2:"";s:3:"龖";s:2:"";s:3:"龗";s:2:"";s:3:"龘";s:2:"";s:3:"龜";s:2:"";s:3:"龝";s:2:"";s:3:"龞";s:2:"";s:3:"龡";s:2:"";s:3:"龢";s:2:"";s:3:"龣";s:2:"";s:3:"龤";s:2:"";s:3:"龥";s:2:"";s:3:"郎";s:2:"";s:3:"凉";s:2:"";s:3:"秊";s:2:"";s:3:"裏";s:2:"";s:3:"隣";s:2:"@";s:3:"兀";s:2:"A";s:3:"嗀";s:2:"B";s:3:"﨎";s:2:"C";s:3:"﨏";s:2:"D";s:3:"﨑";s:2:"E";s:3:"﨓";s:2:"F";s:3:"﨔";s:2:"G";s:3:"礼";s:2:"H";s:3:"﨟";s:2:"I";s:3:"蘒";s:2:"J";s:3:"﨡";s:2:"K";s:3:"﨣";s:2:"L";s:3:"﨤";s:2:"M";s:3:"﨧";s:2:"N";s:3:"﨨";s:2:"O";s:3:"﨩";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp949.ser
@@ -0,0 +1,3 @@
+a:17176:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:"A";s:3:"갂";s:2:"B";s:3:"갃";s:2:"C";s:3:"갅";s:2:"D";s:3:"갆";s:2:"E";s:3:"갋";s:2:"F";s:3:"갌";s:2:"G";s:3:"갍";s:2:"H";s:3:"갎";s:2:"I";s:3:"갏";s:2:"J";s:3:"갘";s:2:"K";s:3:"갞";s:2:"L";s:3:"갟";s:2:"M";s:3:"갡";s:2:"N";s:3:"갢";s:2:"O";s:3:"갣";s:2:"P";s:3:"갥";s:2:"Q";s:3:"갦";s:2:"R";s:3:"갧";s:2:"S";s:3:"갨";s:2:"T";s:3:"갩";s:2:"U";s:3:"갪";s:2:"V";s:3:"갫";s:2:"W";s:3:"갮";s:2:"X";s:3:"갲";s:2:"Y";s:3:"갳";s:2:"Z";s:3:"갴";s:2:"a";s:3:"갵";s:2:"b";s:3:"갶";s:2:"c";s:3:"갷";s:2:"d";s:3:"갺";s:2:"e";s:3:"갻";s:2:"f";s:3:"갽";s:2:"g";s:3:"갾";s:2:"h";s:3:"갿";s:2:"i";s:3:"걁";s:2:"j";s:3:"걂";s:2:"k";s:3:"걃";s:2:"l";s:3:"걄";s:2:"m";s:3:"걅";s:2:"n";s:3:"걆";s:2:"o";s:3:"걇";s:2:"p";s:3:"걈";s:2:"q";s:3:"걉";s:2:"r";s:3:"걊";s:2:"s";s:3:"걌";s:2:"t";s:3:"걎";s:2:"u";s:3:"걏";s:2:"v";s:3:"걐";s:2:"w";s:3:"걑";s:2:"x";s:3:"걒";s:2:"y";s:3:"걓";s:2:"z";s:3:"걕";s:2:"";s:3:"걖";s:2:"";s:3:"걗";s:2:"";s:3:"걙";s:2:"";s:3:"걚";s:2:"";s:3:"걛";s:2:"";s:3:"걝";s:2:"";s:3:"걞";s:2:"";s:3:"걟";s:2:"";s:3:"걠";s:2:"";s:3:"걡";s:2:"";s:3:"걢";s:2:"";s:3:"걣";s:2:"";s:3:"걤";s:2:"";s:3:"걥";s:2:"";s:3:"걦";s:2:"";s:3:"걧";s:2:"";s:3:"걨";s:2:"";s:3:"걩";s:2:"";s:3:"걪";s:2:"";s:3:"걫";s:2:"";s:3:"걬";s:2:"";s:3:"걭";s:2:"";s:3:"걮";s:2:"";s:3:"걯";s:2:"";s:3:"걲";s:2:"";s:3:"걳";s:2:"";s:3:"걵";s:2:"";s:3:"걶";s:2:"";s:3:"걹";s:2:"";s:3:"걻";s:2:"";s:3:"걼";s:2:"";s:3:"걽";s:2:"";s:3:"걾";s:2:"";s:3:"걿";s:2:"";s:3:"겂";s:2:"";s:3:"겇";s:2:"";s:3:"겈";s:2:"";s:3:"겍";s:2:"";s:3:"겎";s:2:"";s:3:"겏";s:2:"";s:3:"겑";s:2:"";s:3:"겒";s:2:"";s:3:"겓";s:2:"";s:3:"겕";s:2:"";s:3:"겖";s:2:"";s:3:"겗";s:2:"";s:3:"겘";s:2:"";s:3:"겙";s:2:"";s:3:"겚";s:2:"";s:3:"겛";s:2:"";s:3:"겞";s:2:"";s:3:"겢";s:2:"";s:3:"겣";s:2:"";s:3:"겤";s:2:"";s:3:"겥";s:2:"";s:3:"겦";s:2:"";s:3:"겧";s:2:"";s:3:"겫";s:2:"";s:3:"겭";s:2:"";s:3:"겮";s:2:"";s:3:"겱";s:2:"";s:3:"겲";s:2:"";s:3:"겳";s:2:"";s:3:"겴";s:2:"";s:3:"겵";s:2:"";s:3:"겶";s:2:"";s:3:"겷";s:2:"";s:3:"겺";s:2:"";s:3:"겾";s:2:"";s:3:"겿";s:2:"";s:3:"곀";s:2:"";s:3:"곂";s:2:"";s:3:"곃";s:2:"";s:3:"곅";s:2:"";s:3:"곆";s:2:"";s:3:"곇";s:2:"";s:3:"곉";s:2:"";s:3:"곊";s:2:"";s:3:"곋";s:2:"";s:3:"곍";s:2:"";s:3:"곎";s:2:"";s:3:"곏";s:2:"";s:3:"곐";s:2:"";s:3:"곑";s:2:"";s:3:"곒";s:2:"";s:3:"곓";s:2:"";s:3:"곔";s:2:"";s:3:"곖";s:2:"";s:3:"곘";s:2:"";s:3:"곙";s:2:"";s:3:"곚";s:2:"";s:3:"곛";s:2:"";s:3:"곜";s:2:"";s:3:"곝";s:2:"";s:3:"곞";s:2:"";s:3:"곟";s:2:"";s:3:"곢";s:2:"";s:3:"곣";s:2:"";s:3:"곥";s:2:"";s:3:"곦";s:2:"";s:3:"곩";s:2:"";s:3:"곫";s:2:"";s:3:"곭";s:2:"";s:3:"곮";s:2:"";s:3:"곲";s:2:"";s:3:"곴";s:2:"";s:3:"곷";s:2:"";s:3:"곸";s:2:"";s:3:"곹";s:2:"";s:3:"곺";s:2:"";s:3:"곻";s:2:"";s:3:"곾";s:2:"";s:3:"곿";s:2:"";s:3:"괁";s:2:"";s:3:"괂";s:2:"";s:3:"괃";s:2:"";s:3:"괅";s:2:"";s:3:"괇";s:2:"";s:3:"괈";s:2:"";s:3:"괉";s:2:"";s:3:"괊";s:2:"";s:3:"괋";s:2:"";s:3:"괎";s:2:"";s:3:"괐";s:2:"";s:3:"괒";s:2:"";s:3:"괓";s:2:"A";s:3:"괔";s:2:"B";s:3:"괕";s:2:"C";s:3:"괖";s:2:"D";s:3:"괗";s:2:"E";s:3:"괙";s:2:"F";s:3:"괚";s:2:"G";s:3:"괛";s:2:"H";s:3:"괝";s:2:"I";s:3:"괞";s:2:"J";s:3:"괟";s:2:"K";s:3:"괡";s:2:"L";s:3:"괢";s:2:"M";s:3:"괣";s:2:"N";s:3:"괤";s:2:"O";s:3:"괥";s:2:"P";s:3:"괦";s:2:"Q";s:3:"괧";s:2:"R";s:3:"괨";s:2:"S";s:3:"괪";s:2:"T";s:3:"괫";s:2:"U";s:3:"괮";s:2:"V";s:3:"괯";s:2:"W";s:3:"괰";s:2:"X";s:3:"괱";s:2:"Y";s:3:"괲";s:2:"Z";s:3:"괳";s:2:"a";s:3:"괶";s:2:"b";s:3:"괷";s:2:"c";s:3:"괹";s:2:"d";s:3:"괺";s:2:"e";s:3:"괻";s:2:"f";s:3:"괽";s:2:"g";s:3:"괾";s:2:"h";s:3:"괿";s:2:"i";s:3:"굀";s:2:"j";s:3:"굁";s:2:"k";s:3:"굂";s:2:"l";s:3:"굃";s:2:"m";s:3:"굆";s:2:"n";s:3:"굈";s:2:"o";s:3:"굊";s:2:"p";s:3:"굋";s:2:"q";s:3:"굌";s:2:"r";s:3:"굍";s:2:"s";s:3:"굎";s:2:"t";s:3:"굏";s:2:"u";s:3:"굑";s:2:"v";s:3:"굒";s:2:"w";s:3:"굓";s:2:"x";s:3:"굕";s:2:"y";s:3:"굖";s:2:"z";s:3:"굗";s:2:"";s:3:"굙";s:2:"";s:3:"굚";s:2:"";s:3:"굛";s:2:"";s:3:"굜";s:2:"";s:3:"굝";s:2:"";s:3:"굞";s:2:"";s:3:"굟";s:2:"";s:3:"굠";s:2:"";s:3:"굢";s:2:"";s:3:"굤";s:2:"";s:3:"굥";s:2:"";s:3:"굦";s:2:"";s:3:"굧";s:2:"";s:3:"굨";s:2:"";s:3:"굩";s:2:"";s:3:"굪";s:2:"";s:3:"굫";s:2:"";s:3:"굮";s:2:"";s:3:"굯";s:2:"";s:3:"굱";s:2:"";s:3:"굲";s:2:"";s:3:"굷";s:2:"";s:3:"굸";s:2:"";s:3:"굹";s:2:"";s:3:"굺";s:2:"";s:3:"굾";s:2:"";s:3:"궀";s:2:"";s:3:"궃";s:2:"";s:3:"궄";s:2:"";s:3:"궅";s:2:"";s:3:"궆";s:2:"";s:3:"궇";s:2:"";s:3:"궊";s:2:"";s:3:"궋";s:2:"";s:3:"궍";s:2:"";s:3:"궎";s:2:"";s:3:"궏";s:2:"";s:3:"궑";s:2:"";s:3:"궒";s:2:"";s:3:"궓";s:2:"";s:3:"궔";s:2:"";s:3:"궕";s:2:"";s:3:"궖";s:2:"";s:3:"궗";s:2:"";s:3:"궘";s:2:"";s:3:"궙";s:2:"";s:3:"궚";s:2:"";s:3:"궛";s:2:"";s:3:"궞";s:2:"";s:3:"궟";s:2:"";s:3:"궠";s:2:"";s:3:"궡";s:2:"";s:3:"궢";s:2:"";s:3:"궣";s:2:"";s:3:"궥";s:2:"";s:3:"궦";s:2:"";s:3:"궧";s:2:"";s:3:"궨";s:2:"";s:3:"궩";s:2:"";s:3:"궪";s:2:"";s:3:"궫";s:2:"";s:3:"궬";s:2:"";s:3:"궭";s:2:"";s:3:"궮";s:2:"";s:3:"궯";s:2:"";s:3:"궰";s:2:"";s:3:"궱";s:2:"";s:3:"궲";s:2:"";s:3:"궳";s:2:"";s:3:"궴";s:2:"";s:3:"궵";s:2:"";s:3:"궶";s:2:"";s:3:"궸";s:2:"";s:3:"궹";s:2:"";s:3:"궺";s:2:"";s:3:"궻";s:2:"";s:3:"궼";s:2:"";s:3:"궽";s:2:"";s:3:"궾";s:2:"";s:3:"궿";s:2:"";s:3:"귂";s:2:"";s:3:"귃";s:2:"";s:3:"귅";s:2:"";s:3:"귆";s:2:"";s:3:"귇";s:2:"";s:3:"귉";s:2:"";s:3:"귊";s:2:"";s:3:"귋";s:2:"";s:3:"귌";s:2:"";s:3:"귍";s:2:"";s:3:"귎";s:2:"";s:3:"귏";s:2:"";s:3:"귒";s:2:"";s:3:"귔";s:2:"";s:3:"귕";s:2:"";s:3:"귖";s:2:"";s:3:"귗";s:2:"";s:3:"귘";s:2:"";s:3:"귙";s:2:"";s:3:"귚";s:2:"";s:3:"귛";s:2:"";s:3:"귝";s:2:"";s:3:"귞";s:2:"";s:3:"귟";s:2:"";s:3:"귡";s:2:"";s:3:"귢";s:2:"";s:3:"귣";s:2:"";s:3:"귥";s:2:"";s:3:"귦";s:2:"";s:3:"귧";s:2:"";s:3:"귨";s:2:"";s:3:"귩";s:2:"";s:3:"귪";s:2:"";s:3:"귫";s:2:"";s:3:"귬";s:2:"";s:3:"귭";s:2:"";s:3:"귮";s:2:"";s:3:"귯";s:2:"";s:3:"귰";s:2:"";s:3:"귱";s:2:"";s:3:"귲";s:2:"";s:3:"귳";s:2:"";s:3:"귴";s:2:"";s:3:"귵";s:2:"";s:3:"귶";s:2:"";s:3:"귷";s:2:"A";s:3:"귺";s:2:"B";s:3:"귻";s:2:"C";s:3:"귽";s:2:"D";s:3:"귾";s:2:"E";s:3:"긂";s:2:"F";s:3:"긃";s:2:"G";s:3:"긄";s:2:"H";s:3:"긅";s:2:"I";s:3:"긆";s:2:"J";s:3:"긇";s:2:"K";s:3:"긊";s:2:"L";s:3:"긌";s:2:"M";s:3:"긎";s:2:"N";s:3:"긏";s:2:"O";s:3:"긐";s:2:"P";s:3:"긑";s:2:"Q";s:3:"긒";s:2:"R";s:3:"긓";s:2:"S";s:3:"긕";s:2:"T";s:3:"긖";s:2:"U";s:3:"긗";s:2:"V";s:3:"긘";s:2:"W";s:3:"긙";s:2:"X";s:3:"긚";s:2:"Y";s:3:"긛";s:2:"Z";s:3:"긜";s:2:"a";s:3:"긝";s:2:"b";s:3:"긞";s:2:"c";s:3:"긟";s:2:"d";s:3:"긠";s:2:"e";s:3:"긡";s:2:"f";s:3:"긢";s:2:"g";s:3:"긣";s:2:"h";s:3:"긤";s:2:"i";s:3:"긥";s:2:"j";s:3:"긦";s:2:"k";s:3:"긧";s:2:"l";s:3:"긨";s:2:"m";s:3:"긩";s:2:"n";s:3:"긪";s:2:"o";s:3:"긫";s:2:"p";s:3:"긬";s:2:"q";s:3:"긭";s:2:"r";s:3:"긮";s:2:"s";s:3:"긯";s:2:"t";s:3:"긲";s:2:"u";s:3:"긳";s:2:"v";s:3:"긵";s:2:"w";s:3:"긶";s:2:"x";s:3:"긹";s:2:"y";s:3:"긻";s:2:"z";s:3:"긼";s:2:"";s:3:"긽";s:2:"";s:3:"긾";s:2:"";s:3:"긿";s:2:"";s:3:"깂";s:2:"";s:3:"깄";s:2:"";s:3:"깇";s:2:"";s:3:"깈";s:2:"";s:3:"깉";s:2:"";s:3:"깋";s:2:"";s:3:"깏";s:2:"";s:3:"깑";s:2:"";s:3:"깒";s:2:"";s:3:"깓";s:2:"";s:3:"깕";s:2:"";s:3:"깗";s:2:"";s:3:"깘";s:2:"";s:3:"깙";s:2:"";s:3:"깚";s:2:"";s:3:"깛";s:2:"";s:3:"깞";s:2:"";s:3:"깢";s:2:"";s:3:"깣";s:2:"";s:3:"깤";s:2:"";s:3:"깦";s:2:"";s:3:"깧";s:2:"";s:3:"깪";s:2:"";s:3:"깫";s:2:"";s:3:"깭";s:2:"";s:3:"깮";s:2:"";s:3:"깯";s:2:"";s:3:"깱";s:2:"";s:3:"깲";s:2:"";s:3:"깳";s:2:"";s:3:"깴";s:2:"";s:3:"깵";s:2:"";s:3:"깶";s:2:"";s:3:"깷";s:2:"";s:3:"깺";s:2:"";s:3:"깾";s:2:"";s:3:"깿";s:2:"";s:3:"꺀";s:2:"";s:3:"꺁";s:2:"";s:3:"꺂";s:2:"";s:3:"꺃";s:2:"";s:3:"꺆";s:2:"";s:3:"꺇";s:2:"";s:3:"꺈";s:2:"";s:3:"꺉";s:2:"";s:3:"꺊";s:2:"";s:3:"꺋";s:2:"";s:3:"꺍";s:2:"";s:3:"꺎";s:2:"";s:3:"꺏";s:2:"";s:3:"꺐";s:2:"";s:3:"꺑";s:2:"";s:3:"꺒";s:2:"";s:3:"꺓";s:2:"";s:3:"꺔";s:2:"";s:3:"꺕";s:2:"";s:3:"꺖";s:2:"";s:3:"꺗";s:2:"";s:3:"꺘";s:2:"";s:3:"꺙";s:2:"";s:3:"꺚";s:2:"";s:3:"꺛";s:2:"";s:3:"꺜";s:2:"";s:3:"꺝";s:2:"";s:3:"꺞";s:2:"";s:3:"꺟";s:2:"";s:3:"꺠";s:2:"";s:3:"꺡";s:2:"";s:3:"꺢";s:2:"";s:3:"꺣";s:2:"";s:3:"꺤";s:2:"";s:3:"꺥";s:2:"";s:3:"꺦";s:2:"";s:3:"꺧";s:2:"";s:3:"꺨";s:2:"";s:3:"꺩";s:2:"";s:3:"꺪";s:2:"";s:3:"꺫";s:2:"";s:3:"꺬";s:2:"";s:3:"꺭";s:2:"";s:3:"꺮";s:2:"";s:3:"꺯";s:2:"";s:3:"꺰";s:2:"";s:3:"꺱";s:2:"";s:3:"꺲";s:2:"";s:3:"꺳";s:2:"";s:3:"꺴";s:2:"";s:3:"꺵";s:2:"";s:3:"꺶";s:2:"";s:3:"꺷";s:2:"";s:3:"꺸";s:2:"";s:3:"꺹";s:2:"";s:3:"꺺";s:2:"";s:3:"꺻";s:2:"";s:3:"꺿";s:2:"";s:3:"껁";s:2:"";s:3:"껂";s:2:"";s:3:"껃";s:2:"";s:3:"껅";s:2:"";s:3:"껆";s:2:"";s:3:"껇";s:2:"";s:3:"껈";s:2:"";s:3:"껉";s:2:"";s:3:"껊";s:2:"";s:3:"껋";s:2:"";s:3:"껎";s:2:"";s:3:"껒";s:2:"";s:3:"껓";s:2:"";s:3:"껔";s:2:"";s:3:"껕";s:2:"";s:3:"껖";s:2:"";s:3:"껗";s:2:"";s:3:"껚";s:2:"";s:3:"껛";s:2:"";s:3:"껝";s:2:"";s:3:"껞";s:2:"";s:3:"껟";s:2:"";s:3:"껠";s:2:"";s:3:"껡";s:2:"";s:3:"껢";s:2:"";s:3:"껣";s:2:"";s:3:"껤";s:2:"";s:3:"껥";s:2:"A";s:3:"껦";s:2:"B";s:3:"껧";s:2:"C";s:3:"껩";s:2:"D";s:3:"껪";s:2:"E";s:3:"껬";s:2:"F";s:3:"껮";s:2:"G";s:3:"껯";s:2:"H";s:3:"껰";s:2:"I";s:3:"껱";s:2:"J";s:3:"껲";s:2:"K";s:3:"껳";s:2:"L";s:3:"껵";s:2:"M";s:3:"껶";s:2:"N";s:3:"껷";s:2:"O";s:3:"껹";s:2:"P";s:3:"껺";s:2:"Q";s:3:"껻";s:2:"R";s:3:"껽";s:2:"S";s:3:"껾";s:2:"T";s:3:"껿";s:2:"U";s:3:"꼀";s:2:"V";s:3:"꼁";s:2:"W";s:3:"꼂";s:2:"X";s:3:"꼃";s:2:"Y";s:3:"꼄";s:2:"Z";s:3:"꼅";s:2:"a";s:3:"꼆";s:2:"b";s:3:"꼉";s:2:"c";s:3:"꼊";s:2:"d";s:3:"꼋";s:2:"e";s:3:"꼌";s:2:"f";s:3:"꼎";s:2:"g";s:3:"꼏";s:2:"h";s:3:"꼑";s:2:"i";s:3:"꼒";s:2:"j";s:3:"꼓";s:2:"k";s:3:"꼔";s:2:"l";s:3:"꼕";s:2:"m";s:3:"꼖";s:2:"n";s:3:"꼗";s:2:"o";s:3:"꼘";s:2:"p";s:3:"꼙";s:2:"q";s:3:"꼚";s:2:"r";s:3:"꼛";s:2:"s";s:3:"꼜";s:2:"t";s:3:"꼝";s:2:"u";s:3:"꼞";s:2:"v";s:3:"꼟";s:2:"w";s:3:"꼠";s:2:"x";s:3:"꼡";s:2:"y";s:3:"꼢";s:2:"z";s:3:"꼣";s:2:"";s:3:"꼤";s:2:"";s:3:"꼥";s:2:"";s:3:"꼦";s:2:"";s:3:"꼧";s:2:"";s:3:"꼨";s:2:"";s:3:"꼩";s:2:"";s:3:"꼪";s:2:"";s:3:"꼫";s:2:"";s:3:"꼮";s:2:"";s:3:"꼯";s:2:"";s:3:"꼱";s:2:"";s:3:"꼳";s:2:"";s:3:"꼵";s:2:"";s:3:"꼶";s:2:"";s:3:"꼷";s:2:"";s:3:"꼸";s:2:"";s:3:"꼹";s:2:"";s:3:"꼺";s:2:"";s:3:"꼻";s:2:"";s:3:"꼾";s:2:"";s:3:"꽀";s:2:"";s:3:"꽄";s:2:"";s:3:"꽅";s:2:"";s:3:"꽆";s:2:"";s:3:"꽇";s:2:"";s:3:"꽊";s:2:"";s:3:"꽋";s:2:"";s:3:"꽌";s:2:"";s:3:"꽍";s:2:"";s:3:"꽎";s:2:"";s:3:"꽏";s:2:"";s:3:"꽑";s:2:"";s:3:"꽒";s:2:"";s:3:"꽓";s:2:"";s:3:"꽔";s:2:"";s:3:"꽕";s:2:"";s:3:"꽖";s:2:"";s:3:"꽗";s:2:"";s:3:"꽘";s:2:"";s:3:"꽙";s:2:"";s:3:"꽚";s:2:"";s:3:"꽛";s:2:"";s:3:"꽞";s:2:"";s:3:"꽟";s:2:"";s:3:"꽠";s:2:"";s:3:"꽡";s:2:"";s:3:"꽢";s:2:"";s:3:"꽣";s:2:"";s:3:"꽦";s:2:"";s:3:"꽧";s:2:"";s:3:"꽨";s:2:"";s:3:"꽩";s:2:"";s:3:"꽪";s:2:"";s:3:"꽫";s:2:"";s:3:"꽬";s:2:"";s:3:"꽭";s:2:"";s:3:"꽮";s:2:"";s:3:"꽯";s:2:"";s:3:"꽰";s:2:"";s:3:"꽱";s:2:"";s:3:"꽲";s:2:"";s:3:"꽳";s:2:"";s:3:"꽴";s:2:"";s:3:"꽵";s:2:"";s:3:"꽶";s:2:"";s:3:"꽷";s:2:"";s:3:"꽸";s:2:"";s:3:"꽺";s:2:"";s:3:"꽻";s:2:"";s:3:"꽼";s:2:"";s:3:"꽽";s:2:"";s:3:"꽾";s:2:"";s:3:"꽿";s:2:"";s:3:"꾁";s:2:"";s:3:"꾂";s:2:"";s:3:"꾃";s:2:"";s:3:"꾅";s:2:"";s:3:"꾆";s:2:"";s:3:"꾇";s:2:"";s:3:"꾉";s:2:"";s:3:"꾊";s:2:"";s:3:"꾋";s:2:"";s:3:"꾌";s:2:"";s:3:"꾍";s:2:"";s:3:"꾎";s:2:"";s:3:"꾏";s:2:"";s:3:"꾒";s:2:"";s:3:"꾓";s:2:"";s:3:"꾔";s:2:"";s:3:"꾖";s:2:"";s:3:"꾗";s:2:"";s:3:"꾘";s:2:"";s:3:"꾙";s:2:"";s:3:"꾚";s:2:"";s:3:"꾛";s:2:"";s:3:"꾝";s:2:"";s:3:"꾞";s:2:"";s:3:"꾟";s:2:"";s:3:"꾠";s:2:"";s:3:"꾡";s:2:"";s:3:"꾢";s:2:"";s:3:"꾣";s:2:"";s:3:"꾤";s:2:"";s:3:"꾥";s:2:"";s:3:"꾦";s:2:"";s:3:"꾧";s:2:"";s:3:"꾨";s:2:"";s:3:"꾩";s:2:"";s:3:"꾪";s:2:"";s:3:"꾫";s:2:"";s:3:"꾬";s:2:"";s:3:"꾭";s:2:"";s:3:"꾮";s:2:"";s:3:"꾯";s:2:"";s:3:"꾰";s:2:"";s:3:"꾱";s:2:"";s:3:"꾲";s:2:"";s:3:"꾳";s:2:"";s:3:"꾴";s:2:"";s:3:"꾵";s:2:"";s:3:"꾶";s:2:"";s:3:"꾷";s:2:"";s:3:"꾺";s:2:"";s:3:"꾻";s:2:"";s:3:"꾽";s:2:"";s:3:"꾾";s:2:"A";s:3:"꾿";s:2:"B";s:3:"꿁";s:2:"C";s:3:"꿂";s:2:"D";s:3:"꿃";s:2:"E";s:3:"꿄";s:2:"F";s:3:"꿅";s:2:"G";s:3:"꿆";s:2:"H";s:3:"꿊";s:2:"I";s:3:"꿌";s:2:"J";s:3:"꿏";s:2:"K";s:3:"꿐";s:2:"L";s:3:"꿑";s:2:"M";s:3:"꿒";s:2:"N";s:3:"꿓";s:2:"O";s:3:"꿕";s:2:"P";s:3:"꿖";s:2:"Q";s:3:"꿗";s:2:"R";s:3:"꿘";s:2:"S";s:3:"꿙";s:2:"T";s:3:"꿚";s:2:"U";s:3:"꿛";s:2:"V";s:3:"꿝";s:2:"W";s:3:"꿞";s:2:"X";s:3:"꿟";s:2:"Y";s:3:"꿠";s:2:"Z";s:3:"꿡";s:2:"a";s:3:"꿢";s:2:"b";s:3:"꿣";s:2:"c";s:3:"꿤";s:2:"d";s:3:"꿥";s:2:"e";s:3:"꿦";s:2:"f";s:3:"꿧";s:2:"g";s:3:"꿪";s:2:"h";s:3:"꿫";s:2:"i";s:3:"꿬";s:2:"j";s:3:"꿭";s:2:"k";s:3:"꿮";s:2:"l";s:3:"꿯";s:2:"m";s:3:"꿲";s:2:"n";s:3:"꿳";s:2:"o";s:3:"꿵";s:2:"p";s:3:"꿶";s:2:"q";s:3:"꿷";s:2:"r";s:3:"꿹";s:2:"s";s:3:"꿺";s:2:"t";s:3:"꿻";s:2:"u";s:3:"꿼";s:2:"v";s:3:"꿽";s:2:"w";s:3:"꿾";s:2:"x";s:3:"꿿";s:2:"y";s:3:"뀂";s:2:"z";s:3:"뀃";s:2:"";s:3:"뀅";s:2:"";s:3:"뀆";s:2:"";s:3:"뀇";s:2:"";s:3:"뀈";s:2:"";s:3:"뀉";s:2:"";s:3:"뀊";s:2:"";s:3:"뀋";s:2:"";s:3:"뀍";s:2:"";s:3:"뀎";s:2:"";s:3:"뀏";s:2:"";s:3:"뀑";s:2:"";s:3:"뀒";s:2:"";s:3:"뀓";s:2:"";s:3:"뀕";s:2:"";s:3:"뀖";s:2:"";s:3:"뀗";s:2:"";s:3:"뀘";s:2:"";s:3:"뀙";s:2:"";s:3:"뀚";s:2:"";s:3:"뀛";s:2:"";s:3:"뀞";s:2:"";s:3:"뀟";s:2:"";s:3:"뀠";s:2:"";s:3:"뀡";s:2:"";s:3:"뀢";s:2:"";s:3:"뀣";s:2:"";s:3:"뀤";s:2:"";s:3:"뀥";s:2:"";s:3:"뀦";s:2:"";s:3:"뀧";s:2:"";s:3:"뀩";s:2:"";s:3:"뀪";s:2:"";s:3:"뀫";s:2:"";s:3:"뀬";s:2:"";s:3:"뀭";s:2:"";s:3:"뀮";s:2:"";s:3:"뀯";s:2:"";s:3:"뀰";s:2:"";s:3:"뀱";s:2:"";s:3:"뀲";s:2:"";s:3:"뀳";s:2:"";s:3:"뀴";s:2:"";s:3:"뀵";s:2:"";s:3:"뀶";s:2:"";s:3:"뀷";s:2:"";s:3:"뀸";s:2:"";s:3:"뀹";s:2:"";s:3:"뀺";s:2:"";s:3:"뀻";s:2:"";s:3:"뀼";s:2:"";s:3:"뀽";s:2:"";s:3:"뀾";s:2:"";s:3:"뀿";s:2:"";s:3:"끀";s:2:"";s:3:"끁";s:2:"";s:3:"끂";s:2:"";s:3:"끃";s:2:"";s:3:"끆";s:2:"";s:3:"끇";s:2:"";s:3:"끉";s:2:"";s:3:"끋";s:2:"";s:3:"끍";s:2:"";s:3:"끏";s:2:"";s:3:"끐";s:2:"";s:3:"끑";s:2:"";s:3:"끒";s:2:"";s:3:"끖";s:2:"";s:3:"끘";s:2:"";s:3:"끚";s:2:"";s:3:"끛";s:2:"";s:3:"끜";s:2:"";s:3:"끞";s:2:"";s:3:"끟";s:2:"";s:3:"끠";s:2:"";s:3:"끡";s:2:"";s:3:"끢";s:2:"";s:3:"끣";s:2:"";s:3:"끤";s:2:"";s:3:"끥";s:2:"";s:3:"끦";s:2:"";s:3:"끧";s:2:"";s:3:"끨";s:2:"";s:3:"끩";s:2:"";s:3:"끪";s:2:"";s:3:"끫";s:2:"";s:3:"끬";s:2:"";s:3:"끭";s:2:"";s:3:"끮";s:2:"";s:3:"끯";s:2:"";s:3:"끰";s:2:"";s:3:"끱";s:2:"";s:3:"끲";s:2:"";s:3:"끳";s:2:"";s:3:"끴";s:2:"";s:3:"끵";s:2:"";s:3:"끶";s:2:"";s:3:"끷";s:2:"";s:3:"끸";s:2:"";s:3:"끹";s:2:"";s:3:"끺";s:2:"";s:3:"끻";s:2:"";s:3:"끾";s:2:"";s:3:"끿";s:2:"";s:3:"낁";s:2:"";s:3:"낂";s:2:"";s:3:"낃";s:2:"";s:3:"낅";s:2:"";s:3:"낆";s:2:"";s:3:"낇";s:2:"";s:3:"낈";s:2:"";s:3:"낉";s:2:"";s:3:"낊";s:2:"";s:3:"낋";s:2:"";s:3:"낎";s:2:"";s:3:"낐";s:2:"";s:3:"낒";s:2:"";s:3:"낓";s:2:"";s:3:"낔";s:2:"";s:3:"낕";s:2:"";s:3:"낖";s:2:"";s:3:"낗";s:2:"";s:3:"낛";s:2:"";s:3:"낝";s:2:"";s:3:"낞";s:2:"";s:3:"낣";s:2:"";s:3:"낤";s:2:"A";s:3:"낥";s:2:"B";s:3:"낦";s:2:"C";s:3:"낧";s:2:"D";s:3:"낪";s:2:"E";s:3:"낰";s:2:"F";s:3:"낲";s:2:"G";s:3:"낶";s:2:"H";s:3:"낷";s:2:"I";s:3:"낹";s:2:"J";s:3:"낺";s:2:"K";s:3:"낻";s:2:"L";s:3:"낽";s:2:"M";s:3:"낾";s:2:"N";s:3:"낿";s:2:"O";s:3:"냀";s:2:"P";s:3:"냁";s:2:"Q";s:3:"냂";s:2:"R";s:3:"냃";s:2:"S";s:3:"냆";s:2:"T";s:3:"냊";s:2:"U";s:3:"냋";s:2:"V";s:3:"냌";s:2:"W";s:3:"냍";s:2:"X";s:3:"냎";s:2:"Y";s:3:"냏";s:2:"Z";s:3:"냒";s:2:"a";s:3:"냓";s:2:"b";s:3:"냕";s:2:"c";s:3:"냖";s:2:"d";s:3:"냗";s:2:"e";s:3:"냙";s:2:"f";s:3:"냚";s:2:"g";s:3:"냛";s:2:"h";s:3:"냜";s:2:"i";s:3:"냝";s:2:"j";s:3:"냞";s:2:"k";s:3:"냟";s:2:"l";s:3:"냡";s:2:"m";s:3:"냢";s:2:"n";s:3:"냣";s:2:"o";s:3:"냤";s:2:"p";s:3:"냦";s:2:"q";s:3:"냧";s:2:"r";s:3:"냨";s:2:"s";s:3:"냩";s:2:"t";s:3:"냪";s:2:"u";s:3:"냫";s:2:"v";s:3:"냬";s:2:"w";s:3:"냭";s:2:"x";s:3:"냮";s:2:"y";s:3:"냯";s:2:"z";s:3:"냰";s:2:"";s:3:"냱";s:2:"";s:3:"냲";s:2:"";s:3:"냳";s:2:"";s:3:"냴";s:2:"";s:3:"냵";s:2:"";s:3:"냶";s:2:"";s:3:"냷";s:2:"";s:3:"냸";s:2:"";s:3:"냹";s:2:"";s:3:"냺";s:2:"";s:3:"냻";s:2:"";s:3:"냼";s:2:"";s:3:"냽";s:2:"";s:3:"냾";s:2:"";s:3:"냿";s:2:"";s:3:"넀";s:2:"";s:3:"넁";s:2:"";s:3:"넂";s:2:"";s:3:"넃";s:2:"";s:3:"넄";s:2:"";s:3:"넅";s:2:"";s:3:"넆";s:2:"";s:3:"넇";s:2:"";s:3:"넊";s:2:"";s:3:"넍";s:2:"";s:3:"넎";s:2:"";s:3:"넏";s:2:"";s:3:"넑";s:2:"";s:3:"넔";s:2:"";s:3:"넕";s:2:"";s:3:"넖";s:2:"";s:3:"넗";s:2:"";s:3:"넚";s:2:"";s:3:"넞";s:2:"";s:3:"넟";s:2:"";s:3:"넠";s:2:"";s:3:"넡";s:2:"";s:3:"넢";s:2:"";s:3:"넦";s:2:"";s:3:"넧";s:2:"";s:3:"넩";s:2:"";s:3:"넪";s:2:"";s:3:"넫";s:2:"";s:3:"넭";s:2:"";s:3:"넮";s:2:"";s:3:"넯";s:2:"";s:3:"넰";s:2:"";s:3:"넱";s:2:"";s:3:"넲";s:2:"";s:3:"넳";s:2:"";s:3:"넶";s:2:"";s:3:"넺";s:2:"";s:3:"넻";s:2:"";s:3:"넼";s:2:"";s:3:"넽";s:2:"";s:3:"넾";s:2:"";s:3:"넿";s:2:"";s:3:"녂";s:2:"";s:3:"녃";s:2:"";s:3:"녅";s:2:"";s:3:"녆";s:2:"";s:3:"녇";s:2:"";s:3:"녉";s:2:"";s:3:"녊";s:2:"";s:3:"녋";s:2:"";s:3:"녌";s:2:"";s:3:"녍";s:2:"";s:3:"녎";s:2:"";s:3:"녏";s:2:"";s:3:"녒";s:2:"";s:3:"녓";s:2:"";s:3:"녖";s:2:"";s:3:"녗";s:2:"";s:3:"녙";s:2:"";s:3:"녚";s:2:"";s:3:"녛";s:2:"";s:3:"녝";s:2:"";s:3:"녞";s:2:"";s:3:"녟";s:2:"";s:3:"녡";s:2:"";s:3:"녢";s:2:"";s:3:"녣";s:2:"";s:3:"녤";s:2:"";s:3:"녥";s:2:"";s:3:"녦";s:2:"";s:3:"녧";s:2:"";s:3:"녨";s:2:"";s:3:"녩";s:2:"";s:3:"녪";s:2:"";s:3:"녫";s:2:"";s:3:"녬";s:2:"";s:3:"녭";s:2:"";s:3:"녮";s:2:"";s:3:"녯";s:2:"";s:3:"녰";s:2:"";s:3:"녱";s:2:"";s:3:"녲";s:2:"";s:3:"녳";s:2:"";s:3:"녴";s:2:"";s:3:"녵";s:2:"";s:3:"녶";s:2:"";s:3:"녷";s:2:"";s:3:"녺";s:2:"";s:3:"녻";s:2:"";s:3:"녽";s:2:"";s:3:"녾";s:2:"";s:3:"녿";s:2:"";s:3:"놁";s:2:"";s:3:"놃";s:2:"";s:3:"놄";s:2:"";s:3:"놅";s:2:"";s:3:"놆";s:2:"";s:3:"놇";s:2:"";s:3:"놊";s:2:"";s:3:"놌";s:2:"";s:3:"놎";s:2:"";s:3:"놏";s:2:"";s:3:"놐";s:2:"";s:3:"놑";s:2:"";s:3:"놕";s:2:"";s:3:"놖";s:2:"";s:3:"놗";s:2:"";s:3:"놙";s:2:"";s:3:"놚";s:2:"";s:3:"놛";s:2:"";s:3:"놝";s:2:"A";s:3:"놞";s:2:"B";s:3:"놟";s:2:"C";s:3:"놠";s:2:"D";s:3:"놡";s:2:"E";s:3:"놢";s:2:"F";s:3:"놣";s:2:"G";s:3:"놤";s:2:"H";s:3:"놥";s:2:"I";s:3:"놦";s:2:"J";s:3:"놧";s:2:"K";s:3:"놩";s:2:"L";s:3:"놪";s:2:"M";s:3:"놫";s:2:"N";s:3:"놬";s:2:"O";s:3:"놭";s:2:"P";s:3:"놮";s:2:"Q";s:3:"놯";s:2:"R";s:3:"놰";s:2:"S";s:3:"놱";s:2:"T";s:3:"놲";s:2:"U";s:3:"놳";s:2:"V";s:3:"놴";s:2:"W";s:3:"놵";s:2:"X";s:3:"놶";s:2:"Y";s:3:"놷";s:2:"Z";s:3:"놸";s:2:"a";s:3:"놹";s:2:"b";s:3:"놺";s:2:"c";s:3:"놻";s:2:"d";s:3:"놼";s:2:"e";s:3:"놽";s:2:"f";s:3:"놾";s:2:"g";s:3:"놿";s:2:"h";s:3:"뇀";s:2:"i";s:3:"뇁";s:2:"j";s:3:"뇂";s:2:"k";s:3:"뇃";s:2:"l";s:3:"뇄";s:2:"m";s:3:"뇅";s:2:"n";s:3:"뇆";s:2:"o";s:3:"뇇";s:2:"p";s:3:"뇈";s:2:"q";s:3:"뇉";s:2:"r";s:3:"뇊";s:2:"s";s:3:"뇋";s:2:"t";s:3:"뇍";s:2:"u";s:3:"뇎";s:2:"v";s:3:"뇏";s:2:"w";s:3:"뇑";s:2:"x";s:3:"뇒";s:2:"y";s:3:"뇓";s:2:"z";s:3:"뇕";s:2:"";s:3:"뇖";s:2:"";s:3:"뇗";s:2:"";s:3:"뇘";s:2:"";s:3:"뇙";s:2:"";s:3:"뇚";s:2:"";s:3:"뇛";s:2:"";s:3:"뇞";s:2:"";s:3:"뇠";s:2:"";s:3:"뇡";s:2:"";s:3:"뇢";s:2:"";s:3:"뇣";s:2:"";s:3:"뇤";s:2:"";s:3:"뇥";s:2:"";s:3:"뇦";s:2:"";s:3:"뇧";s:2:"";s:3:"뇪";s:2:"";s:3:"뇫";s:2:"";s:3:"뇭";s:2:"";s:3:"뇮";s:2:"";s:3:"뇯";s:2:"";s:3:"뇱";s:2:"";s:3:"뇲";s:2:"";s:3:"뇳";s:2:"";s:3:"뇴";s:2:"";s:3:"뇵";s:2:"";s:3:"뇶";s:2:"";s:3:"뇷";s:2:"";s:3:"뇸";s:2:"";s:3:"뇺";s:2:"";s:3:"뇼";s:2:"";s:3:"뇾";s:2:"";s:3:"뇿";s:2:"";s:3:"눀";s:2:"";s:3:"눁";s:2:"";s:3:"눂";s:2:"";s:3:"눃";s:2:"";s:3:"눆";s:2:"";s:3:"눇";s:2:"";s:3:"눉";s:2:"";s:3:"눊";s:2:"";s:3:"눍";s:2:"";s:3:"눎";s:2:"";s:3:"눏";s:2:"";s:3:"눐";s:2:"";s:3:"눑";s:2:"";s:3:"눒";s:2:"";s:3:"눓";s:2:"";s:3:"눖";s:2:"";s:3:"눘";s:2:"";s:3:"눚";s:2:"";s:3:"눛";s:2:"";s:3:"눜";s:2:"";s:3:"눝";s:2:"";s:3:"눞";s:2:"";s:3:"눟";s:2:"";s:3:"눡";s:2:"";s:3:"눢";s:2:"";s:3:"눣";s:2:"";s:3:"눤";s:2:"";s:3:"눥";s:2:"";s:3:"눦";s:2:"";s:3:"눧";s:2:"";s:3:"눨";s:2:"";s:3:"눩";s:2:"";s:3:"눪";s:2:"";s:3:"눫";s:2:"";s:3:"눬";s:2:"";s:3:"눭";s:2:"";s:3:"눮";s:2:"";s:3:"눯";s:2:"";s:3:"눰";s:2:"";s:3:"눱";s:2:"";s:3:"눲";s:2:"";s:3:"눳";s:2:"";s:3:"눵";s:2:"";s:3:"눶";s:2:"";s:3:"눷";s:2:"";s:3:"눸";s:2:"";s:3:"눹";s:2:"";s:3:"눺";s:2:"";s:3:"눻";s:2:"";s:3:"눽";s:2:"";s:3:"눾";s:2:"";s:3:"눿";s:2:"";s:3:"뉀";s:2:"";s:3:"뉁";s:2:"";s:3:"뉂";s:2:"";s:3:"뉃";s:2:"";s:3:"뉄";s:2:"";s:3:"뉅";s:2:"";s:3:"뉆";s:2:"";s:3:"뉇";s:2:"";s:3:"뉈";s:2:"";s:3:"뉉";s:2:"";s:3:"뉊";s:2:"";s:3:"뉋";s:2:"";s:3:"뉌";s:2:"";s:3:"뉍";s:2:"";s:3:"뉎";s:2:"";s:3:"뉏";s:2:"";s:3:"뉐";s:2:"";s:3:"뉑";s:2:"";s:3:"뉒";s:2:"";s:3:"뉓";s:2:"";s:3:"뉔";s:2:"";s:3:"뉕";s:2:"";s:3:"뉖";s:2:"";s:3:"뉗";s:2:"";s:3:"뉙";s:2:"";s:3:"뉚";s:2:"";s:3:"뉛";s:2:"";s:3:"뉝";s:2:"";s:3:"뉞";s:2:"";s:3:"뉟";s:2:"";s:3:"뉡";s:2:"";s:3:"뉢";s:2:"";s:3:"뉣";s:2:"";s:3:"뉤";s:2:"";s:3:"뉥";s:2:"";s:3:"뉦";s:2:"";s:3:"뉧";s:2:"";s:3:"뉪";s:2:"";s:3:"뉫";s:2:"";s:3:"뉬";s:2:"";s:3:"뉭";s:2:"";s:3:"뉮";s:2:"A";s:3:"뉯";s:2:"B";s:3:"뉰";s:2:"C";s:3:"뉱";s:2:"D";s:3:"뉲";s:2:"E";s:3:"뉳";s:2:"F";s:3:"뉶";s:2:"G";s:3:"뉷";s:2:"H";s:3:"뉸";s:2:"I";s:3:"뉹";s:2:"J";s:3:"뉺";s:2:"K";s:3:"뉻";s:2:"L";s:3:"뉽";s:2:"M";s:3:"뉾";s:2:"N";s:3:"뉿";s:2:"O";s:3:"늀";s:2:"P";s:3:"늁";s:2:"Q";s:3:"늂";s:2:"R";s:3:"늃";s:2:"S";s:3:"늆";s:2:"T";s:3:"늇";s:2:"U";s:3:"늈";s:2:"V";s:3:"늊";s:2:"W";s:3:"늋";s:2:"X";s:3:"늌";s:2:"Y";s:3:"늍";s:2:"Z";s:3:"늎";s:2:"a";s:3:"늏";s:2:"b";s:3:"늒";s:2:"c";s:3:"늓";s:2:"d";s:3:"늕";s:2:"e";s:3:"늖";s:2:"f";s:3:"늗";s:2:"g";s:3:"늛";s:2:"h";s:3:"늜";s:2:"i";s:3:"늝";s:2:"j";s:3:"늞";s:2:"k";s:3:"늟";s:2:"l";s:3:"늢";s:2:"m";s:3:"늤";s:2:"n";s:3:"늧";s:2:"o";s:3:"늨";s:2:"p";s:3:"늩";s:2:"q";s:3:"늫";s:2:"r";s:3:"늭";s:2:"s";s:3:"늮";s:2:"t";s:3:"늯";s:2:"u";s:3:"늱";s:2:"v";s:3:"늲";s:2:"w";s:3:"늳";s:2:"x";s:3:"늵";s:2:"y";s:3:"늶";s:2:"z";s:3:"늷";s:2:"";s:3:"늸";s:2:"";s:3:"늹";s:2:"";s:3:"늺";s:2:"";s:3:"늻";s:2:"";s:3:"늼";s:2:"";s:3:"늽";s:2:"";s:3:"늾";s:2:"";s:3:"늿";s:2:"";s:3:"닀";s:2:"";s:3:"닁";s:2:"";s:3:"닂";s:2:"";s:3:"닃";s:2:"";s:3:"닄";s:2:"";s:3:"닅";s:2:"";s:3:"닆";s:2:"";s:3:"닇";s:2:"";s:3:"닊";s:2:"";s:3:"닋";s:2:"";s:3:"닍";s:2:"";s:3:"닎";s:2:"";s:3:"닏";s:2:"";s:3:"닑";s:2:"";s:3:"닓";s:2:"";s:3:"닔";s:2:"";s:3:"닕";s:2:"";s:3:"닖";s:2:"";s:3:"닗";s:2:"";s:3:"닚";s:2:"";s:3:"닜";s:2:"";s:3:"닞";s:2:"";s:3:"닟";s:2:"";s:3:"닠";s:2:"";s:3:"닡";s:2:"";s:3:"닣";s:2:"";s:3:"닧";s:2:"";s:3:"닩";s:2:"";s:3:"닪";s:2:"";s:3:"닰";s:2:"";s:3:"닱";s:2:"";s:3:"닲";s:2:"";s:3:"닶";s:2:"";s:3:"닼";s:2:"";s:3:"닽";s:2:"";s:3:"닾";s:2:"";s:3:"댂";s:2:"";s:3:"댃";s:2:"";s:3:"댅";s:2:"";s:3:"댆";s:2:"";s:3:"댇";s:2:"";s:3:"댉";s:2:"";s:3:"댊";s:2:"";s:3:"댋";s:2:"";s:3:"댌";s:2:"";s:3:"댍";s:2:"";s:3:"댎";s:2:"";s:3:"댏";s:2:"";s:3:"댒";s:2:"";s:3:"댖";s:2:"";s:3:"댗";s:2:"";s:3:"댘";s:2:"";s:3:"댙";s:2:"";s:3:"댚";s:2:"";s:3:"댛";s:2:"";s:3:"댝";s:2:"";s:3:"댞";s:2:"";s:3:"댟";s:2:"";s:3:"댠";s:2:"";s:3:"댡";s:2:"";s:3:"댢";s:2:"";s:3:"댣";s:2:"";s:3:"댤";s:2:"";s:3:"댥";s:2:"";s:3:"댦";s:2:"";s:3:"댧";s:2:"";s:3:"댨";s:2:"";s:3:"댩";s:2:"";s:3:"댪";s:2:"";s:3:"댫";s:2:"";s:3:"댬";s:2:"";s:3:"댭";s:2:"";s:3:"댮";s:2:"";s:3:"댯";s:2:"";s:3:"댰";s:2:"";s:3:"댱";s:2:"";s:3:"댲";s:2:"";s:3:"댳";s:2:"";s:3:"댴";s:2:"";s:3:"댵";s:2:"";s:3:"댶";s:2:"";s:3:"댷";s:2:"";s:3:"댸";s:2:"";s:3:"댹";s:2:"";s:3:"댺";s:2:"";s:3:"댻";s:2:"";s:3:"댼";s:2:"";s:3:"댽";s:2:"";s:3:"댾";s:2:"";s:3:"댿";s:2:"";s:3:"덀";s:2:"";s:3:"덁";s:2:"";s:3:"덂";s:2:"";s:3:"덃";s:2:"";s:3:"덄";s:2:"";s:3:"덅";s:2:"";s:3:"덆";s:2:"";s:3:"덇";s:2:"";s:3:"덈";s:2:"";s:3:"덉";s:2:"";s:3:"덊";s:2:"";s:3:"덋";s:2:"";s:3:"덌";s:2:"";s:3:"덍";s:2:"";s:3:"덎";s:2:"";s:3:"덏";s:2:"";s:3:"덐";s:2:"";s:3:"덑";s:2:"";s:3:"덒";s:2:"";s:3:"덓";s:2:"";s:3:"덗";s:2:"";s:3:"덙";s:2:"";s:3:"덚";s:2:"";s:3:"덝";s:2:"";s:3:"덠";s:2:"";s:3:"덡";s:2:"";s:3:"덢";s:2:"";s:3:"덣";s:2:"A";s:3:"덦";s:2:"B";s:3:"덨";s:2:"C";s:3:"덪";s:2:"D";s:3:"덬";s:2:"E";s:3:"덭";s:2:"F";s:3:"덯";s:2:"G";s:3:"덲";s:2:"H";s:3:"덳";s:2:"I";s:3:"덵";s:2:"J";s:3:"덶";s:2:"K";s:3:"덷";s:2:"L";s:3:"덹";s:2:"M";s:3:"덺";s:2:"N";s:3:"덻";s:2:"O";s:3:"덼";s:2:"P";s:3:"덽";s:2:"Q";s:3:"덾";s:2:"R";s:3:"덿";s:2:"S";s:3:"뎂";s:2:"T";s:3:"뎆";s:2:"U";s:3:"뎇";s:2:"V";s:3:"뎈";s:2:"W";s:3:"뎉";s:2:"X";s:3:"뎊";s:2:"Y";s:3:"뎋";s:2:"Z";s:3:"뎍";s:2:"a";s:3:"뎎";s:2:"b";s:3:"뎏";s:2:"c";s:3:"뎑";s:2:"d";s:3:"뎒";s:2:"e";s:3:"뎓";s:2:"f";s:3:"뎕";s:2:"g";s:3:"뎖";s:2:"h";s:3:"뎗";s:2:"i";s:3:"뎘";s:2:"j";s:3:"뎙";s:2:"k";s:3:"뎚";s:2:"l";s:3:"뎛";s:2:"m";s:3:"뎜";s:2:"n";s:3:"뎝";s:2:"o";s:3:"뎞";s:2:"p";s:3:"뎟";s:2:"q";s:3:"뎢";s:2:"r";s:3:"뎣";s:2:"s";s:3:"뎤";s:2:"t";s:3:"뎥";s:2:"u";s:3:"뎦";s:2:"v";s:3:"뎧";s:2:"w";s:3:"뎩";s:2:"x";s:3:"뎪";s:2:"y";s:3:"뎫";s:2:"z";s:3:"뎭";s:2:"";s:3:"뎮";s:2:"";s:3:"뎯";s:2:"";s:3:"뎰";s:2:"";s:3:"뎱";s:2:"";s:3:"뎲";s:2:"";s:3:"뎳";s:2:"";s:3:"뎴";s:2:"";s:3:"뎵";s:2:"";s:3:"뎶";s:2:"";s:3:"뎷";s:2:"";s:3:"뎸";s:2:"";s:3:"뎹";s:2:"";s:3:"뎺";s:2:"";s:3:"뎻";s:2:"";s:3:"뎼";s:2:"";s:3:"뎽";s:2:"";s:3:"뎾";s:2:"";s:3:"뎿";s:2:"";s:3:"돀";s:2:"";s:3:"돁";s:2:"";s:3:"돂";s:2:"";s:3:"돃";s:2:"";s:3:"돆";s:2:"";s:3:"돇";s:2:"";s:3:"돉";s:2:"";s:3:"돊";s:2:"";s:3:"돍";s:2:"";s:3:"돏";s:2:"";s:3:"돑";s:2:"";s:3:"돒";s:2:"";s:3:"돓";s:2:"";s:3:"돖";s:2:"";s:3:"돘";s:2:"";s:3:"돚";s:2:"";s:3:"돜";s:2:"";s:3:"돞";s:2:"";s:3:"돟";s:2:"";s:3:"돡";s:2:"";s:3:"돢";s:2:"";s:3:"돣";s:2:"";s:3:"돥";s:2:"";s:3:"돦";s:2:"";s:3:"돧";s:2:"";s:3:"돩";s:2:"";s:3:"돪";s:2:"";s:3:"돫";s:2:"";s:3:"돬";s:2:"";s:3:"돭";s:2:"";s:3:"돮";s:2:"";s:3:"돯";s:2:"";s:3:"돰";s:2:"";s:3:"돱";s:2:"";s:3:"돲";s:2:"";s:3:"돳";s:2:"";s:3:"돴";s:2:"";s:3:"돵";s:2:"";s:3:"돶";s:2:"";s:3:"돷";s:2:"";s:3:"돸";s:2:"";s:3:"돹";s:2:"";s:3:"돺";s:2:"";s:3:"돻";s:2:"";s:3:"돽";s:2:"";s:3:"돾";s:2:"";s:3:"돿";s:2:"";s:3:"됀";s:2:"";s:3:"됁";s:2:"";s:3:"됂";s:2:"";s:3:"됃";s:2:"";s:3:"됄";s:2:"";s:3:"됅";s:2:"";s:3:"됆";s:2:"";s:3:"됇";s:2:"";s:3:"됈";s:2:"";s:3:"됉";s:2:"";s:3:"됊";s:2:"";s:3:"됋";s:2:"";s:3:"됌";s:2:"";s:3:"됍";s:2:"";s:3:"됎";s:2:"";s:3:"됏";s:2:"";s:3:"됑";s:2:"";s:3:"됒";s:2:"";s:3:"됓";s:2:"";s:3:"됔";s:2:"";s:3:"됕";s:2:"";s:3:"됖";s:2:"";s:3:"됗";s:2:"";s:3:"됙";s:2:"";s:3:"됚";s:2:"";s:3:"됛";s:2:"";s:3:"됝";s:2:"";s:3:"됞";s:2:"";s:3:"됟";s:2:"";s:3:"됡";s:2:"";s:3:"됢";s:2:"";s:3:"됣";s:2:"";s:3:"됤";s:2:"";s:3:"됥";s:2:"";s:3:"됦";s:2:"";s:3:"됧";s:2:"";s:3:"됪";s:2:"";s:3:"됬";s:2:"";s:3:"됭";s:2:"";s:3:"됮";s:2:"";s:3:"됯";s:2:"";s:3:"됰";s:2:"";s:3:"됱";s:2:"";s:3:"됲";s:2:"";s:3:"됳";s:2:"";s:3:"됵";s:2:"";s:3:"됶";s:2:"";s:3:"됷";s:2:"";s:3:"됸";s:2:"";s:3:"됹";s:2:"";s:3:"됺";s:2:"";s:3:"됻";s:2:"";s:3:"됼";s:2:"";s:3:"됽";s:2:"";s:3:"됾";s:2:"";s:3:"됿";s:2:"";s:3:"둀";s:2:"";s:3:"둁";s:2:"";s:3:"둂";s:2:"";s:3:"둃";s:2:"";s:3:"둄";s:2:"A";s:3:"둅";s:2:"B";s:3:"둆";s:2:"C";s:3:"둇";s:2:"D";s:3:"둈";s:2:"E";s:3:"둉";s:2:"F";s:3:"둊";s:2:"G";s:3:"둋";s:2:"H";s:3:"둌";s:2:"I";s:3:"둍";s:2:"J";s:3:"둎";s:2:"K";s:3:"둏";s:2:"L";s:3:"둒";s:2:"M";s:3:"둓";s:2:"N";s:3:"둕";s:2:"O";s:3:"둖";s:2:"P";s:3:"둗";s:2:"Q";s:3:"둙";s:2:"R";s:3:"둚";s:2:"S";s:3:"둛";s:2:"T";s:3:"둜";s:2:"U";s:3:"둝";s:2:"V";s:3:"둞";s:2:"W";s:3:"둟";s:2:"X";s:3:"둢";s:2:"Y";s:3:"둤";s:2:"Z";s:3:"둦";s:2:"a";s:3:"둧";s:2:"b";s:3:"둨";s:2:"c";s:3:"둩";s:2:"d";s:3:"둪";s:2:"e";s:3:"둫";s:2:"f";s:3:"둭";s:2:"g";s:3:"둮";s:2:"h";s:3:"둯";s:2:"i";s:3:"둰";s:2:"j";s:3:"둱";s:2:"k";s:3:"둲";s:2:"l";s:3:"둳";s:2:"m";s:3:"둴";s:2:"n";s:3:"둵";s:2:"o";s:3:"둶";s:2:"p";s:3:"둷";s:2:"q";s:3:"둸";s:2:"r";s:3:"둹";s:2:"s";s:3:"둺";s:2:"t";s:3:"둻";s:2:"u";s:3:"둼";s:2:"v";s:3:"둽";s:2:"w";s:3:"둾";s:2:"x";s:3:"둿";s:2:"y";s:3:"뒁";s:2:"z";s:3:"뒂";s:2:"";s:3:"뒃";s:2:"";s:3:"뒄";s:2:"";s:3:"뒅";s:2:"";s:3:"뒆";s:2:"";s:3:"뒇";s:2:"";s:3:"뒉";s:2:"";s:3:"뒊";s:2:"";s:3:"뒋";s:2:"";s:3:"뒌";s:2:"";s:3:"뒍";s:2:"";s:3:"뒎";s:2:"";s:3:"뒏";s:2:"";s:3:"뒐";s:2:"";s:3:"뒑";s:2:"";s:3:"뒒";s:2:"";s:3:"뒓";s:2:"";s:3:"뒔";s:2:"";s:3:"뒕";s:2:"";s:3:"뒖";s:2:"";s:3:"뒗";s:2:"";s:3:"뒘";s:2:"";s:3:"뒙";s:2:"";s:3:"뒚";s:2:"";s:3:"뒛";s:2:"";s:3:"뒜";s:2:"";s:3:"뒞";s:2:"";s:3:"뒟";s:2:"";s:3:"뒠";s:2:"";s:3:"뒡";s:2:"";s:3:"뒢";s:2:"";s:3:"뒣";s:2:"";s:3:"뒥";s:2:"";s:3:"뒦";s:2:"";s:3:"뒧";s:2:"";s:3:"뒩";s:2:"";s:3:"뒪";s:2:"";s:3:"뒫";s:2:"";s:3:"뒭";s:2:"";s:3:"뒮";s:2:"";s:3:"뒯";s:2:"";s:3:"뒰";s:2:"";s:3:"뒱";s:2:"";s:3:"뒲";s:2:"";s:3:"뒳";s:2:"";s:3:"뒴";s:2:"";s:3:"뒶";s:2:"";s:3:"뒸";s:2:"";s:3:"뒺";s:2:"";s:3:"뒻";s:2:"";s:3:"뒼";s:2:"";s:3:"뒽";s:2:"";s:3:"뒾";s:2:"";s:3:"뒿";s:2:"";s:3:"듁";s:2:"";s:3:"듂";s:2:"";s:3:"듃";s:2:"";s:3:"듅";s:2:"";s:3:"듆";s:2:"";s:3:"듇";s:2:"";s:3:"듉";s:2:"";s:3:"듊";s:2:"";s:3:"듋";s:2:"";s:3:"듌";s:2:"";s:3:"듍";s:2:"";s:3:"듎";s:2:"";s:3:"듏";s:2:"";s:3:"듑";s:2:"";s:3:"듒";s:2:"";s:3:"듓";s:2:"";s:3:"듔";s:2:"";s:3:"듖";s:2:"";s:3:"듗";s:2:"";s:3:"듘";s:2:"";s:3:"듙";s:2:"";s:3:"듚";s:2:"";s:3:"듛";s:2:"";s:3:"듞";s:2:"";s:3:"듟";s:2:"";s:3:"듡";s:2:"";s:3:"듢";s:2:"";s:3:"듥";s:2:"";s:3:"듧";s:2:"";s:3:"듨";s:2:"";s:3:"듩";s:2:"";s:3:"듪";s:2:"";s:3:"듫";s:2:"";s:3:"듮";s:2:"";s:3:"듰";s:2:"";s:3:"듲";s:2:"";s:3:"듳";s:2:"";s:3:"듴";s:2:"";s:3:"듵";s:2:"";s:3:"듶";s:2:"";s:3:"듷";s:2:"";s:3:"듹";s:2:"";s:3:"듺";s:2:"";s:3:"듻";s:2:"";s:3:"듼";s:2:"";s:3:"듽";s:2:"";s:3:"듾";s:2:"";s:3:"듿";s:2:"";s:3:"딀";s:2:"";s:3:"딁";s:2:"";s:3:"딂";s:2:"";s:3:"딃";s:2:"";s:3:"딄";s:2:"";s:3:"딅";s:2:"";s:3:"딆";s:2:"";s:3:"딇";s:2:"";s:3:"딈";s:2:"";s:3:"딉";s:2:"";s:3:"딊";s:2:"";s:3:"딋";s:2:"";s:3:"딌";s:2:"";s:3:"딍";s:2:"";s:3:"딎";s:2:"";s:3:"딏";s:2:"";s:3:"딐";s:2:"";s:3:"딑";s:2:"";s:3:"딒";s:2:"";s:3:"딓";s:2:"";s:3:"딖";s:2:"";s:3:"딗";s:2:"";s:3:"딙";s:2:"";s:3:"딚";s:2:"";s:3:"딝";s:2:"A";s:3:"딞";s:2:"B";s:3:"딟";s:2:"C";s:3:"딠";s:2:"D";s:3:"딡";s:2:"E";s:3:"딢";s:2:"F";s:3:"딣";s:2:"G";s:3:"딦";s:2:"H";s:3:"딫";s:2:"I";s:3:"딬";s:2:"J";s:3:"딭";s:2:"K";s:3:"딮";s:2:"L";s:3:"딯";s:2:"M";s:3:"딲";s:2:"N";s:3:"딳";s:2:"O";s:3:"딵";s:2:"P";s:3:"딶";s:2:"Q";s:3:"딷";s:2:"R";s:3:"딹";s:2:"S";s:3:"딺";s:2:"T";s:3:"딻";s:2:"U";s:3:"딼";s:2:"V";s:3:"딽";s:2:"W";s:3:"딾";s:2:"X";s:3:"딿";s:2:"Y";s:3:"땂";s:2:"Z";s:3:"땆";s:2:"a";s:3:"땇";s:2:"b";s:3:"땈";s:2:"c";s:3:"땉";s:2:"d";s:3:"땊";s:2:"e";s:3:"땎";s:2:"f";s:3:"땏";s:2:"g";s:3:"땑";s:2:"h";s:3:"땒";s:2:"i";s:3:"땓";s:2:"j";s:3:"땕";s:2:"k";s:3:"땖";s:2:"l";s:3:"땗";s:2:"m";s:3:"땘";s:2:"n";s:3:"땙";s:2:"o";s:3:"땚";s:2:"p";s:3:"땛";s:2:"q";s:3:"땞";s:2:"r";s:3:"땢";s:2:"s";s:3:"땣";s:2:"t";s:3:"땤";s:2:"u";s:3:"땥";s:2:"v";s:3:"땦";s:2:"w";s:3:"땧";s:2:"x";s:3:"땨";s:2:"y";s:3:"땩";s:2:"z";s:3:"땪";s:2:"";s:3:"땫";s:2:"";s:3:"땬";s:2:"";s:3:"땭";s:2:"";s:3:"땮";s:2:"";s:3:"땯";s:2:"";s:3:"땰";s:2:"";s:3:"땱";s:2:"";s:3:"땲";s:2:"";s:3:"땳";s:2:"";s:3:"땴";s:2:"";s:3:"땵";s:2:"";s:3:"땶";s:2:"";s:3:"땷";s:2:"";s:3:"땸";s:2:"";s:3:"땹";s:2:"";s:3:"땺";s:2:"";s:3:"땻";s:2:"";s:3:"땼";s:2:"";s:3:"땽";s:2:"";s:3:"땾";s:2:"";s:3:"땿";s:2:"";s:3:"떀";s:2:"";s:3:"떁";s:2:"";s:3:"떂";s:2:"";s:3:"떃";s:2:"";s:3:"떄";s:2:"";s:3:"떅";s:2:"";s:3:"떆";s:2:"";s:3:"떇";s:2:"";s:3:"떈";s:2:"";s:3:"떉";s:2:"";s:3:"떊";s:2:"";s:3:"떋";s:2:"";s:3:"떌";s:2:"";s:3:"떍";s:2:"";s:3:"떎";s:2:"";s:3:"떏";s:2:"";s:3:"떐";s:2:"";s:3:"떑";s:2:"";s:3:"떒";s:2:"";s:3:"떓";s:2:"";s:3:"떔";s:2:"";s:3:"떕";s:2:"";s:3:"떖";s:2:"";s:3:"떗";s:2:"";s:3:"떘";s:2:"";s:3:"떙";s:2:"";s:3:"떚";s:2:"";s:3:"떛";s:2:"";s:3:"떜";s:2:"";s:3:"떝";s:2:"";s:3:"떞";s:2:"";s:3:"떟";s:2:"";s:3:"떢";s:2:"";s:3:"떣";s:2:"";s:3:"떥";s:2:"";s:3:"떦";s:2:"";s:3:"떧";s:2:"";s:3:"떩";s:2:"";s:3:"떬";s:2:"";s:3:"떭";s:2:"";s:3:"떮";s:2:"";s:3:"떯";s:2:"";s:3:"떲";s:2:"";s:3:"떶";s:2:"";s:3:"떷";s:2:"";s:3:"떸";s:2:"";s:3:"떹";s:2:"";s:3:"떺";s:2:"";s:3:"떾";s:2:"";s:3:"떿";s:2:"";s:3:"뗁";s:2:"";s:3:"뗂";s:2:"";s:3:"뗃";s:2:"";s:3:"뗅";s:2:"";s:3:"뗆";s:2:"";s:3:"뗇";s:2:"";s:3:"뗈";s:2:"";s:3:"뗉";s:2:"";s:3:"뗊";s:2:"";s:3:"뗋";s:2:"";s:3:"뗎";s:2:"";s:3:"뗒";s:2:"";s:3:"뗓";s:2:"";s:3:"뗔";s:2:"";s:3:"뗕";s:2:"";s:3:"뗖";s:2:"";s:3:"뗗";s:2:"";s:3:"뗙";s:2:"";s:3:"뗚";s:2:"";s:3:"뗛";s:2:"";s:3:"뗜";s:2:"";s:3:"뗝";s:2:"";s:3:"뗞";s:2:"";s:3:"뗟";s:2:"";s:3:"뗠";s:2:"";s:3:"뗡";s:2:"";s:3:"뗢";s:2:"";s:3:"뗣";s:2:"";s:3:"뗤";s:2:"";s:3:"뗥";s:2:"";s:3:"뗦";s:2:"";s:3:"뗧";s:2:"";s:3:"뗨";s:2:"";s:3:"뗩";s:2:"";s:3:"뗪";s:2:"";s:3:"뗫";s:2:"";s:3:"뗭";s:2:"";s:3:"뗮";s:2:"";s:3:"뗯";s:2:"";s:3:"뗰";s:2:"";s:3:"뗱";s:2:"";s:3:"뗲";s:2:"";s:3:"뗳";s:2:"";s:3:"뗴";s:2:"";s:3:"뗵";s:2:"";s:3:"뗶";s:2:"";s:3:"뗷";s:2:"";s:3:"뗸";s:2:"";s:3:"뗹";s:2:"";s:3:"뗺";s:2:"";s:3:"뗻";s:2:"";s:3:"뗼";s:2:"";s:3:"뗽";s:2:"";s:3:"뗾";s:2:"";s:3:"뗿";s:2:"A";s:3:"똀";s:2:"B";s:3:"똁";s:2:"C";s:3:"똂";s:2:"D";s:3:"똃";s:2:"E";s:3:"똄";s:2:"F";s:3:"똅";s:2:"G";s:3:"똆";s:2:"H";s:3:"똇";s:2:"I";s:3:"똈";s:2:"J";s:3:"똉";s:2:"K";s:3:"똊";s:2:"L";s:3:"똋";s:2:"M";s:3:"똌";s:2:"N";s:3:"똍";s:2:"O";s:3:"똎";s:2:"P";s:3:"똏";s:2:"Q";s:3:"똒";s:2:"R";s:3:"똓";s:2:"S";s:3:"똕";s:2:"T";s:3:"똖";s:2:"U";s:3:"똗";s:2:"V";s:3:"똙";s:2:"W";s:3:"똚";s:2:"X";s:3:"똛";s:2:"Y";s:3:"똜";s:2:"Z";s:3:"똝";s:2:"a";s:3:"똞";s:2:"b";s:3:"똟";s:2:"c";s:3:"똠";s:2:"d";s:3:"똡";s:2:"e";s:3:"똢";s:2:"f";s:3:"똣";s:2:"g";s:3:"똤";s:2:"h";s:3:"똦";s:2:"i";s:3:"똧";s:2:"j";s:3:"똨";s:2:"k";s:3:"똩";s:2:"l";s:3:"똪";s:2:"m";s:3:"똫";s:2:"n";s:3:"똭";s:2:"o";s:3:"똮";s:2:"p";s:3:"똯";s:2:"q";s:3:"똰";s:2:"r";s:3:"똱";s:2:"s";s:3:"똲";s:2:"t";s:3:"똳";s:2:"u";s:3:"똵";s:2:"v";s:3:"똶";s:2:"w";s:3:"똷";s:2:"x";s:3:"똸";s:2:"y";s:3:"똹";s:2:"z";s:3:"똺";s:2:"";s:3:"똻";s:2:"";s:3:"똼";s:2:"";s:3:"똽";s:2:"";s:3:"똾";s:2:"";s:3:"똿";s:2:"";s:3:"뙀";s:2:"";s:3:"뙁";s:2:"";s:3:"뙂";s:2:"";s:3:"뙃";s:2:"";s:3:"뙄";s:2:"";s:3:"뙅";s:2:"";s:3:"뙆";s:2:"";s:3:"뙇";s:2:"";s:3:"뙉";s:2:"";s:3:"뙊";s:2:"";s:3:"뙋";s:2:"";s:3:"뙌";s:2:"";s:3:"뙍";s:2:"";s:3:"뙎";s:2:"";s:3:"뙏";s:2:"";s:3:"뙐";s:2:"";s:3:"뙑";s:2:"";s:3:"뙒";s:2:"";s:3:"뙓";s:2:"";s:3:"뙔";s:2:"";s:3:"뙕";s:2:"";s:3:"뙖";s:2:"";s:3:"뙗";s:2:"";s:3:"뙘";s:2:"";s:3:"뙙";s:2:"";s:3:"뙚";s:2:"";s:3:"뙛";s:2:"";s:3:"뙜";s:2:"";s:3:"뙝";s:2:"";s:3:"뙞";s:2:"";s:3:"뙟";s:2:"";s:3:"뙠";s:2:"";s:3:"뙡";s:2:"";s:3:"뙢";s:2:"";s:3:"뙣";s:2:"";s:3:"뙥";s:2:"";s:3:"뙦";s:2:"";s:3:"뙧";s:2:"";s:3:"뙩";s:2:"";s:3:"뙪";s:2:"";s:3:"뙫";s:2:"";s:3:"뙬";s:2:"";s:3:"뙭";s:2:"";s:3:"뙮";s:2:"";s:3:"뙯";s:2:"";s:3:"뙰";s:2:"";s:3:"뙱";s:2:"";s:3:"뙲";s:2:"";s:3:"뙳";s:2:"";s:3:"뙴";s:2:"";s:3:"뙵";s:2:"";s:3:"뙶";s:2:"";s:3:"뙷";s:2:"";s:3:"뙸";s:2:"";s:3:"뙹";s:2:"";s:3:"뙺";s:2:"";s:3:"뙻";s:2:"";s:3:"뙼";s:2:"";s:3:"뙽";s:2:"";s:3:"뙾";s:2:"";s:3:"뙿";s:2:"";s:3:"뚀";s:2:"";s:3:"뚁";s:2:"";s:3:"뚂";s:2:"";s:3:"뚃";s:2:"";s:3:"뚄";s:2:"";s:3:"뚅";s:2:"";s:3:"뚆";s:2:"";s:3:"뚇";s:2:"";s:3:"뚈";s:2:"";s:3:"뚉";s:2:"";s:3:"뚊";s:2:"";s:3:"뚋";s:2:"";s:3:"뚌";s:2:"";s:3:"뚍";s:2:"";s:3:"뚎";s:2:"";s:3:"뚏";s:2:"";s:3:"뚐";s:2:"";s:3:"뚑";s:2:"";s:3:"뚒";s:2:"";s:3:"뚓";s:2:"";s:3:"뚔";s:2:"";s:3:"뚕";s:2:"";s:3:"뚖";s:2:"";s:3:"뚗";s:2:"";s:3:"뚘";s:2:"";s:3:"뚙";s:2:"";s:3:"뚚";s:2:"";s:3:"뚛";s:2:"";s:3:"뚞";s:2:"";s:3:"뚟";s:2:"";s:3:"뚡";s:2:"";s:3:"뚢";s:2:"";s:3:"뚣";s:2:"";s:3:"뚥";s:2:"";s:3:"뚦";s:2:"";s:3:"뚧";s:2:"";s:3:"뚨";s:2:"";s:3:"뚩";s:2:"";s:3:"뚪";s:2:"";s:3:"뚭";s:2:"";s:3:"뚮";s:2:"";s:3:"뚯";s:2:"";s:3:"뚰";s:2:"";s:3:"뚲";s:2:"";s:3:"뚳";s:2:"";s:3:"뚴";s:2:"";s:3:"뚵";s:2:"";s:3:"뚶";s:2:"";s:3:"뚷";s:2:"";s:3:"뚸";s:2:"";s:3:"뚹";s:2:"";s:3:"뚺";s:2:"";s:3:"뚻";s:2:"";s:3:"뚼";s:2:"";s:3:"뚽";s:2:"";s:3:"뚾";s:2:"";s:3:"뚿";s:2:"";s:3:"뛀";s:2:"";s:3:"뛁";s:2:"";s:3:"뛂";s:2:"A";s:3:"뛃";s:2:"B";s:3:"뛄";s:2:"C";s:3:"뛅";s:2:"D";s:3:"뛆";s:2:"E";s:3:"뛇";s:2:"F";s:3:"뛈";s:2:"G";s:3:"뛉";s:2:"H";s:3:"뛊";s:2:"I";s:3:"뛋";s:2:"J";s:3:"뛌";s:2:"K";s:3:"뛍";s:2:"L";s:3:"뛎";s:2:"M";s:3:"뛏";s:2:"N";s:3:"뛐";s:2:"O";s:3:"뛑";s:2:"P";s:3:"뛒";s:2:"Q";s:3:"뛓";s:2:"R";s:3:"뛕";s:2:"S";s:3:"뛖";s:2:"T";s:3:"뛗";s:2:"U";s:3:"뛘";s:2:"V";s:3:"뛙";s:2:"W";s:3:"뛚";s:2:"X";s:3:"뛛";s:2:"Y";s:3:"뛜";s:2:"Z";s:3:"뛝";s:2:"a";s:3:"뛞";s:2:"b";s:3:"뛟";s:2:"c";s:3:"뛠";s:2:"d";s:3:"뛡";s:2:"e";s:3:"뛢";s:2:"f";s:3:"뛣";s:2:"g";s:3:"뛤";s:2:"h";s:3:"뛥";s:2:"i";s:3:"뛦";s:2:"j";s:3:"뛧";s:2:"k";s:3:"뛨";s:2:"l";s:3:"뛩";s:2:"m";s:3:"뛪";s:2:"n";s:3:"뛫";s:2:"o";s:3:"뛬";s:2:"p";s:3:"뛭";s:2:"q";s:3:"뛮";s:2:"r";s:3:"뛯";s:2:"s";s:3:"뛱";s:2:"t";s:3:"뛲";s:2:"u";s:3:"뛳";s:2:"v";s:3:"뛵";s:2:"w";s:3:"뛶";s:2:"x";s:3:"뛷";s:2:"y";s:3:"뛹";s:2:"z";s:3:"뛺";s:2:"";s:3:"뛻";s:2:"";s:3:"뛼";s:2:"";s:3:"뛽";s:2:"";s:3:"뛾";s:2:"";s:3:"뛿";s:2:"";s:3:"뜂";s:2:"";s:3:"뜃";s:2:"";s:3:"뜄";s:2:"";s:3:"뜆";s:2:"";s:3:"뜇";s:2:"";s:3:"뜈";s:2:"";s:3:"뜉";s:2:"";s:3:"뜊";s:2:"";s:3:"뜋";s:2:"";s:3:"뜌";s:2:"";s:3:"뜍";s:2:"";s:3:"뜎";s:2:"";s:3:"뜏";s:2:"";s:3:"뜐";s:2:"";s:3:"뜑";s:2:"";s:3:"뜒";s:2:"";s:3:"뜓";s:2:"";s:3:"뜔";s:2:"";s:3:"뜕";s:2:"";s:3:"뜖";s:2:"";s:3:"뜗";s:2:"";s:3:"뜘";s:2:"";s:3:"뜙";s:2:"";s:3:"뜚";s:2:"";s:3:"뜛";s:2:"";s:3:"뜜";s:2:"";s:3:"뜝";s:2:"";s:3:"뜞";s:2:"";s:3:"뜟";s:2:"";s:3:"뜠";s:2:"";s:3:"뜡";s:2:"";s:3:"뜢";s:2:"";s:3:"뜣";s:2:"";s:3:"뜤";s:2:"";s:3:"뜥";s:2:"";s:3:"뜦";s:2:"";s:3:"뜧";s:2:"";s:3:"뜪";s:2:"";s:3:"뜫";s:2:"";s:3:"뜭";s:2:"";s:3:"뜮";s:2:"";s:3:"뜱";s:2:"";s:3:"뜲";s:2:"";s:3:"뜳";s:2:"";s:3:"뜴";s:2:"";s:3:"뜵";s:2:"";s:3:"뜶";s:2:"";s:3:"뜷";s:2:"";s:3:"뜺";s:2:"";s:3:"뜼";s:2:"";s:3:"뜽";s:2:"";s:3:"뜾";s:2:"";s:3:"뜿";s:2:"";s:3:"띀";s:2:"";s:3:"띁";s:2:"";s:3:"띂";s:2:"";s:3:"띃";s:2:"";s:3:"띅";s:2:"";s:3:"띆";s:2:"";s:3:"띇";s:2:"";s:3:"띉";s:2:"";s:3:"띊";s:2:"";s:3:"띋";s:2:"";s:3:"띍";s:2:"";s:3:"띎";s:2:"";s:3:"띏";s:2:"";s:3:"띐";s:2:"";s:3:"띑";s:2:"";s:3:"띒";s:2:"";s:3:"띓";s:2:"";s:3:"띖";s:2:"";s:3:"띗";s:2:"";s:3:"띘";s:2:"";s:3:"띙";s:2:"";s:3:"띚";s:2:"";s:3:"띛";s:2:"";s:3:"띜";s:2:"";s:3:"띝";s:2:"";s:3:"띞";s:2:"";s:3:"띟";s:2:"";s:3:"띡";s:2:"";s:3:"띢";s:2:"";s:3:"띣";s:2:"";s:3:"띥";s:2:"";s:3:"띦";s:2:"";s:3:"띧";s:2:"";s:3:"띩";s:2:"";s:3:"띪";s:2:"";s:3:"띫";s:2:"";s:3:"띬";s:2:"";s:3:"띭";s:2:"";s:3:"띮";s:2:"";s:3:"띯";s:2:"";s:3:"띲";s:2:"";s:3:"띴";s:2:"";s:3:"띶";s:2:"";s:3:"띷";s:2:"";s:3:"띸";s:2:"";s:3:"띹";s:2:"";s:3:"띺";s:2:"";s:3:"띻";s:2:"";s:3:"띾";s:2:"";s:3:"띿";s:2:"";s:3:"랁";s:2:"";s:3:"랂";s:2:"";s:3:"랃";s:2:"";s:3:"랅";s:2:"";s:3:"랆";s:2:"";s:3:"랇";s:2:"";s:3:"랈";s:2:"";s:3:"랉";s:2:"";s:3:"랊";s:2:"";s:3:"랋";s:2:"";s:3:"랎";s:2:"";s:3:"랓";s:2:"";s:3:"랔";s:2:"";s:3:"랕";s:2:"";s:3:"랚";s:2:"";s:3:"랛";s:2:"";s:3:"랝";s:2:"";s:3:"랞";s:2:"A";s:3:"랟";s:2:"B";s:3:"랡";s:2:"C";s:3:"랢";s:2:"D";s:3:"랣";s:2:"E";s:3:"랤";s:2:"F";s:3:"랥";s:2:"G";s:3:"랦";s:2:"H";s:3:"랧";s:2:"I";s:3:"랪";s:2:"J";s:3:"랮";s:2:"K";s:3:"랯";s:2:"L";s:3:"랰";s:2:"M";s:3:"랱";s:2:"N";s:3:"랲";s:2:"O";s:3:"랳";s:2:"P";s:3:"랶";s:2:"Q";s:3:"랷";s:2:"R";s:3:"랹";s:2:"S";s:3:"랺";s:2:"T";s:3:"랻";s:2:"U";s:3:"랼";s:2:"V";s:3:"랽";s:2:"W";s:3:"랾";s:2:"X";s:3:"랿";s:2:"Y";s:3:"럀";s:2:"Z";s:3:"럁";s:2:"a";s:3:"럂";s:2:"b";s:3:"럃";s:2:"c";s:3:"럄";s:2:"d";s:3:"럅";s:2:"e";s:3:"럆";s:2:"f";s:3:"럈";s:2:"g";s:3:"럊";s:2:"h";s:3:"럋";s:2:"i";s:3:"럌";s:2:"j";s:3:"럍";s:2:"k";s:3:"럎";s:2:"l";s:3:"럏";s:2:"m";s:3:"럐";s:2:"n";s:3:"럑";s:2:"o";s:3:"럒";s:2:"p";s:3:"럓";s:2:"q";s:3:"럔";s:2:"r";s:3:"럕";s:2:"s";s:3:"럖";s:2:"t";s:3:"럗";s:2:"u";s:3:"럘";s:2:"v";s:3:"럙";s:2:"w";s:3:"럚";s:2:"x";s:3:"럛";s:2:"y";s:3:"럜";s:2:"z";s:3:"럝";s:2:"";s:3:"럞";s:2:"";s:3:"럟";s:2:"";s:3:"럠";s:2:"";s:3:"럡";s:2:"";s:3:"럢";s:2:"";s:3:"럣";s:2:"";s:3:"럤";s:2:"";s:3:"럥";s:2:"";s:3:"럦";s:2:"";s:3:"럧";s:2:"";s:3:"럨";s:2:"";s:3:"럩";s:2:"";s:3:"럪";s:2:"";s:3:"럫";s:2:"";s:3:"럮";s:2:"";s:3:"럯";s:2:"";s:3:"럱";s:2:"";s:3:"럲";s:2:"";s:3:"럳";s:2:"";s:3:"럵";s:2:"";s:3:"럶";s:2:"";s:3:"럷";s:2:"";s:3:"럸";s:2:"";s:3:"럹";s:2:"";s:3:"럺";s:2:"";s:3:"럻";s:2:"";s:3:"럾";s:2:"";s:3:"렂";s:2:"";s:3:"렃";s:2:"";s:3:"렄";s:2:"";s:3:"렅";s:2:"";s:3:"렆";s:2:"";s:3:"렊";s:2:"";s:3:"렋";s:2:"";s:3:"렍";s:2:"";s:3:"렎";s:2:"";s:3:"렏";s:2:"";s:3:"렑";s:2:"";s:3:"렒";s:2:"";s:3:"렓";s:2:"";s:3:"렔";s:2:"";s:3:"렕";s:2:"";s:3:"렖";s:2:"";s:3:"렗";s:2:"";s:3:"렚";s:2:"";s:3:"렜";s:2:"";s:3:"렞";s:2:"";s:3:"렟";s:2:"";s:3:"렠";s:2:"";s:3:"렡";s:2:"";s:3:"렢";s:2:"";s:3:"렣";s:2:"";s:3:"렦";s:2:"";s:3:"렧";s:2:"";s:3:"렩";s:2:"";s:3:"렪";s:2:"";s:3:"렫";s:2:"";s:3:"렭";s:2:"";s:3:"렮";s:2:"";s:3:"렯";s:2:"";s:3:"렰";s:2:"";s:3:"렱";s:2:"";s:3:"렲";s:2:"";s:3:"렳";s:2:"";s:3:"렶";s:2:"";s:3:"렺";s:2:"";s:3:"렻";s:2:"";s:3:"렼";s:2:"";s:3:"렽";s:2:"";s:3:"렾";s:2:"";s:3:"렿";s:2:"";s:3:"롁";s:2:"";s:3:"롂";s:2:"";s:3:"롃";s:2:"";s:3:"롅";s:2:"";s:3:"롆";s:2:"";s:3:"롇";s:2:"";s:3:"롈";s:2:"";s:3:"롉";s:2:"";s:3:"롊";s:2:"";s:3:"롋";s:2:"";s:3:"롌";s:2:"";s:3:"롍";s:2:"";s:3:"롎";s:2:"";s:3:"롏";s:2:"";s:3:"롐";s:2:"";s:3:"롒";s:2:"";s:3:"롔";s:2:"";s:3:"롕";s:2:"";s:3:"롖";s:2:"";s:3:"롗";s:2:"";s:3:"롘";s:2:"";s:3:"롙";s:2:"";s:3:"롚";s:2:"";s:3:"롛";s:2:"";s:3:"롞";s:2:"";s:3:"롟";s:2:"";s:3:"롡";s:2:"";s:3:"롢";s:2:"";s:3:"롣";s:2:"";s:3:"롥";s:2:"";s:3:"롦";s:2:"";s:3:"롧";s:2:"";s:3:"롨";s:2:"";s:3:"롩";s:2:"";s:3:"롪";s:2:"";s:3:"롫";s:2:"";s:3:"롮";s:2:"";s:3:"롰";s:2:"";s:3:"롲";s:2:"";s:3:"롳";s:2:"";s:3:"롴";s:2:"";s:3:"롵";s:2:"";s:3:"롶";s:2:"";s:3:"롷";s:2:"";s:3:"롹";s:2:"";s:3:"롺";s:2:"";s:3:"롻";s:2:"";s:3:"롽";s:2:"";s:3:"롾";s:2:"";s:3:"롿";s:2:"";s:3:"뢀";s:2:"";s:3:"뢁";s:2:"";s:3:"뢂";s:2:"";s:3:"뢃";s:2:"";s:3:"뢄";s:2:"A";s:3:"뢅";s:2:"B";s:3:"뢆";s:2:"C";s:3:"뢇";s:2:"D";s:3:"뢈";s:2:"E";s:3:"뢉";s:2:"F";s:3:"뢊";s:2:"G";s:3:"뢋";s:2:"H";s:3:"뢌";s:2:"I";s:3:"뢎";s:2:"J";s:3:"뢏";s:2:"K";s:3:"뢐";s:2:"L";s:3:"뢑";s:2:"M";s:3:"뢒";s:2:"N";s:3:"뢓";s:2:"O";s:3:"뢔";s:2:"P";s:3:"뢕";s:2:"Q";s:3:"뢖";s:2:"R";s:3:"뢗";s:2:"S";s:3:"뢘";s:2:"T";s:3:"뢙";s:2:"U";s:3:"뢚";s:2:"V";s:3:"뢛";s:2:"W";s:3:"뢜";s:2:"X";s:3:"뢝";s:2:"Y";s:3:"뢞";s:2:"Z";s:3:"뢟";s:2:"a";s:3:"뢠";s:2:"b";s:3:"뢡";s:2:"c";s:3:"뢢";s:2:"d";s:3:"뢣";s:2:"e";s:3:"뢤";s:2:"f";s:3:"뢥";s:2:"g";s:3:"뢦";s:2:"h";s:3:"뢧";s:2:"i";s:3:"뢩";s:2:"j";s:3:"뢪";s:2:"k";s:3:"뢫";s:2:"l";s:3:"뢬";s:2:"m";s:3:"뢭";s:2:"n";s:3:"뢮";s:2:"o";s:3:"뢯";s:2:"p";s:3:"뢱";s:2:"q";s:3:"뢲";s:2:"r";s:3:"뢳";s:2:"s";s:3:"뢵";s:2:"t";s:3:"뢶";s:2:"u";s:3:"뢷";s:2:"v";s:3:"뢹";s:2:"w";s:3:"뢺";s:2:"x";s:3:"뢻";s:2:"y";s:3:"뢼";s:2:"z";s:3:"뢽";s:2:"";s:3:"뢾";s:2:"";s:3:"뢿";s:2:"";s:3:"룂";s:2:"";s:3:"룄";s:2:"";s:3:"룆";s:2:"";s:3:"룇";s:2:"";s:3:"룈";s:2:"";s:3:"룉";s:2:"";s:3:"룊";s:2:"";s:3:"룋";s:2:"";s:3:"룍";s:2:"";s:3:"룎";s:2:"";s:3:"룏";s:2:"";s:3:"룑";s:2:"";s:3:"룒";s:2:"";s:3:"룓";s:2:"";s:3:"룕";s:2:"";s:3:"룖";s:2:"";s:3:"룗";s:2:"";s:3:"룘";s:2:"";s:3:"룙";s:2:"";s:3:"룚";s:2:"";s:3:"룛";s:2:"";s:3:"룜";s:2:"";s:3:"룞";s:2:"";s:3:"룠";s:2:"";s:3:"룢";s:2:"";s:3:"룣";s:2:"";s:3:"룤";s:2:"";s:3:"룥";s:2:"";s:3:"룦";s:2:"";s:3:"룧";s:2:"";s:3:"룪";s:2:"";s:3:"룫";s:2:"";s:3:"룭";s:2:"";s:3:"룮";s:2:"";s:3:"룯";s:2:"";s:3:"룱";s:2:"";s:3:"룲";s:2:"";s:3:"룳";s:2:"";s:3:"룴";s:2:"";s:3:"룵";s:2:"";s:3:"룶";s:2:"";s:3:"룷";s:2:"";s:3:"룺";s:2:"";s:3:"룼";s:2:"";s:3:"룾";s:2:"";s:3:"룿";s:2:"";s:3:"뤀";s:2:"";s:3:"뤁";s:2:"";s:3:"뤂";s:2:"";s:3:"뤃";s:2:"";s:3:"뤅";s:2:"";s:3:"뤆";s:2:"";s:3:"뤇";s:2:"";s:3:"뤈";s:2:"";s:3:"뤉";s:2:"";s:3:"뤊";s:2:"";s:3:"뤋";s:2:"";s:3:"뤌";s:2:"";s:3:"뤍";s:2:"";s:3:"뤎";s:2:"";s:3:"뤏";s:2:"";s:3:"뤐";s:2:"";s:3:"뤑";s:2:"";s:3:"뤒";s:2:"";s:3:"뤓";s:2:"";s:3:"뤔";s:2:"";s:3:"뤕";s:2:"";s:3:"뤖";s:2:"";s:3:"뤗";s:2:"";s:3:"뤙";s:2:"";s:3:"뤚";s:2:"";s:3:"뤛";s:2:"";s:3:"뤜";s:2:"";s:3:"뤝";s:2:"";s:3:"뤞";s:2:"";s:3:"뤟";s:2:"";s:3:"뤡";s:2:"";s:3:"뤢";s:2:"";s:3:"뤣";s:2:"";s:3:"뤤";s:2:"";s:3:"뤥";s:2:"";s:3:"뤦";s:2:"";s:3:"뤧";s:2:"";s:3:"뤨";s:2:"";s:3:"뤩";s:2:"";s:3:"뤪";s:2:"";s:3:"뤫";s:2:"";s:3:"뤬";s:2:"";s:3:"뤭";s:2:"";s:3:"뤮";s:2:"";s:3:"뤯";s:2:"";s:3:"뤰";s:2:"";s:3:"뤱";s:2:"";s:3:"뤲";s:2:"";s:3:"뤳";s:2:"";s:3:"뤴";s:2:"";s:3:"뤵";s:2:"";s:3:"뤶";s:2:"";s:3:"뤷";s:2:"";s:3:"뤸";s:2:"";s:3:"뤹";s:2:"";s:3:"뤺";s:2:"";s:3:"뤻";s:2:"";s:3:"뤾";s:2:"";s:3:"뤿";s:2:"";s:3:"륁";s:2:"";s:3:"륂";s:2:"";s:3:"륃";s:2:"";s:3:"륅";s:2:"";s:3:"륆";s:2:"";s:3:"륇";s:2:"";s:3:"륈";s:2:"";s:3:"륉";s:2:"";s:3:"륊";s:2:"";s:3:"륋";s:2:"";s:3:"륍";s:2:"";s:3:"륎";s:2:"";s:3:"륐";s:2:"";s:3:"륒";s:2:"";s:3:"륓";s:2:"";s:3:"륔";s:2:"";s:3:"륕";s:2:"";s:3:"륖";s:2:"";s:3:"륗";s:2:"A";s:3:"륚";s:2:"B";s:3:"륛";s:2:"C";s:3:"륝";s:2:"D";s:3:"륞";s:2:"E";s:3:"륟";s:2:"F";s:3:"륡";s:2:"G";s:3:"륢";s:2:"H";s:3:"륣";s:2:"I";s:3:"륤";s:2:"J";s:3:"륥";s:2:"K";s:3:"륦";s:2:"L";s:3:"륧";s:2:"M";s:3:"륪";s:2:"N";s:3:"륬";s:2:"O";s:3:"륮";s:2:"P";s:3:"륯";s:2:"Q";s:3:"륰";s:2:"R";s:3:"륱";s:2:"S";s:3:"륲";s:2:"T";s:3:"륳";s:2:"U";s:3:"륶";s:2:"V";s:3:"륷";s:2:"W";s:3:"륹";s:2:"X";s:3:"륺";s:2:"Y";s:3:"륻";s:2:"Z";s:3:"륽";s:2:"a";s:3:"륾";s:2:"b";s:3:"륿";s:2:"c";s:3:"릀";s:2:"d";s:3:"릁";s:2:"e";s:3:"릂";s:2:"f";s:3:"릃";s:2:"g";s:3:"릆";s:2:"h";s:3:"릈";s:2:"i";s:3:"릋";s:2:"j";s:3:"릌";s:2:"k";s:3:"릏";s:2:"l";s:3:"릐";s:2:"m";s:3:"릑";s:2:"n";s:3:"릒";s:2:"o";s:3:"릓";s:2:"p";s:3:"릔";s:2:"q";s:3:"릕";s:2:"r";s:3:"릖";s:2:"s";s:3:"릗";s:2:"t";s:3:"릘";s:2:"u";s:3:"릙";s:2:"v";s:3:"릚";s:2:"w";s:3:"릛";s:2:"x";s:3:"릜";s:2:"y";s:3:"릝";s:2:"z";s:3:"릞";s:2:"";s:3:"릟";s:2:"";s:3:"릠";s:2:"";s:3:"릡";s:2:"";s:3:"릢";s:2:"";s:3:"릣";s:2:"";s:3:"릤";s:2:"";s:3:"릥";s:2:"";s:3:"릦";s:2:"";s:3:"릧";s:2:"";s:3:"릨";s:2:"";s:3:"릩";s:2:"";s:3:"릪";s:2:"";s:3:"릫";s:2:"";s:3:"릮";s:2:"";s:3:"릯";s:2:"";s:3:"릱";s:2:"";s:3:"릲";s:2:"";s:3:"릳";s:2:"";s:3:"릵";s:2:"";s:3:"릶";s:2:"";s:3:"릷";s:2:"";s:3:"릸";s:2:"";s:3:"릹";s:2:"";s:3:"릺";s:2:"";s:3:"릻";s:2:"";s:3:"릾";s:2:"";s:3:"맀";s:2:"";s:3:"맂";s:2:"";s:3:"맃";s:2:"";s:3:"맄";s:2:"";s:3:"맅";s:2:"";s:3:"맆";s:2:"";s:3:"맇";s:2:"";s:3:"맊";s:2:"";s:3:"맋";s:2:"";s:3:"맍";s:2:"";s:3:"맓";s:2:"";s:3:"맔";s:2:"";s:3:"맕";s:2:"";s:3:"맖";s:2:"";s:3:"맗";s:2:"";s:3:"맚";s:2:"";s:3:"맜";s:2:"";s:3:"맟";s:2:"";s:3:"맠";s:2:"";s:3:"맢";s:2:"";s:3:"맦";s:2:"";s:3:"맧";s:2:"";s:3:"맩";s:2:"";s:3:"맪";s:2:"";s:3:"맫";s:2:"";s:3:"맭";s:2:"";s:3:"맮";s:2:"";s:3:"맯";s:2:"";s:3:"맰";s:2:"";s:3:"맱";s:2:"";s:3:"맲";s:2:"";s:3:"맳";s:2:"";s:3:"맶";s:2:"";s:3:"맻";s:2:"";s:3:"맼";s:2:"";s:3:"맽";s:2:"";s:3:"맾";s:2:"";s:3:"맿";s:2:"";s:3:"먂";s:2:"";s:3:"먃";s:2:"";s:3:"먄";s:2:"";s:3:"먅";s:2:"";s:3:"먆";s:2:"";s:3:"먇";s:2:"";s:3:"먉";s:2:"";s:3:"먊";s:2:"";s:3:"먋";s:2:"";s:3:"먌";s:2:"";s:3:"먍";s:2:"";s:3:"먎";s:2:"";s:3:"먏";s:2:"";s:3:"먐";s:2:"";s:3:"먑";s:2:"";s:3:"먒";s:2:"";s:3:"먓";s:2:"";s:3:"먔";s:2:"";s:3:"먖";s:2:"";s:3:"먗";s:2:"";s:3:"먘";s:2:"";s:3:"먙";s:2:"";s:3:"먚";s:2:"";s:3:"먛";s:2:"";s:3:"먜";s:2:"";s:3:"먝";s:2:"";s:3:"먞";s:2:"";s:3:"먟";s:2:"";s:3:"먠";s:2:"";s:3:"먡";s:2:"";s:3:"먢";s:2:"";s:3:"먣";s:2:"";s:3:"먤";s:2:"";s:3:"먥";s:2:"";s:3:"먦";s:2:"";s:3:"먧";s:2:"";s:3:"먨";s:2:"";s:3:"먩";s:2:"";s:3:"먪";s:2:"";s:3:"먫";s:2:"";s:3:"먬";s:2:"";s:3:"먭";s:2:"";s:3:"먮";s:2:"";s:3:"먯";s:2:"";s:3:"먰";s:2:"";s:3:"먱";s:2:"";s:3:"먲";s:2:"";s:3:"먳";s:2:"";s:3:"먴";s:2:"";s:3:"먵";s:2:"";s:3:"먶";s:2:"";s:3:"먷";s:2:"";s:3:"먺";s:2:"";s:3:"먻";s:2:"";s:3:"먽";s:2:"";s:3:"먾";s:2:"";s:3:"먿";s:2:"";s:3:"멁";s:2:"";s:3:"멃";s:2:"";s:3:"멄";s:2:"";s:3:"멅";s:2:"";s:3:"멆";s:2:"A";s:3:"멇";s:2:"B";s:3:"멊";s:2:"C";s:3:"멌";s:2:"D";s:3:"멏";s:2:"E";s:3:"멐";s:2:"F";s:3:"멑";s:2:"G";s:3:"멒";s:2:"H";s:3:"멖";s:2:"I";s:3:"멗";s:2:"J";s:3:"멙";s:2:"K";s:3:"멚";s:2:"L";s:3:"멛";s:2:"M";s:3:"멝";s:2:"N";s:3:"멞";s:2:"O";s:3:"멟";s:2:"P";s:3:"멠";s:2:"Q";s:3:"멡";s:2:"R";s:3:"멢";s:2:"S";s:3:"멣";s:2:"T";s:3:"멦";s:2:"U";s:3:"멪";s:2:"V";s:3:"멫";s:2:"W";s:3:"멬";s:2:"X";s:3:"멭";s:2:"Y";s:3:"멮";s:2:"Z";s:3:"멯";s:2:"a";s:3:"멲";s:2:"b";s:3:"멳";s:2:"c";s:3:"멵";s:2:"d";s:3:"멶";s:2:"e";s:3:"멷";s:2:"f";s:3:"멹";s:2:"g";s:3:"멺";s:2:"h";s:3:"멻";s:2:"i";s:3:"멼";s:2:"j";s:3:"멽";s:2:"k";s:3:"멾";s:2:"l";s:3:"멿";s:2:"m";s:3:"몀";s:2:"n";s:3:"몁";s:2:"o";s:3:"몂";s:2:"p";s:3:"몆";s:2:"q";s:3:"몈";s:2:"r";s:3:"몉";s:2:"s";s:3:"몊";s:2:"t";s:3:"몋";s:2:"u";s:3:"몍";s:2:"v";s:3:"몎";s:2:"w";s:3:"몏";s:2:"x";s:3:"몐";s:2:"y";s:3:"몑";s:2:"z";s:3:"몒";s:2:"";s:3:"몓";s:2:"";s:3:"몔";s:2:"";s:3:"몕";s:2:"";s:3:"몖";s:2:"";s:3:"몗";s:2:"";s:3:"몘";s:2:"";s:3:"몙";s:2:"";s:3:"몚";s:2:"";s:3:"몛";s:2:"";s:3:"몜";s:2:"";s:3:"몝";s:2:"";s:3:"몞";s:2:"";s:3:"몟";s:2:"";s:3:"몠";s:2:"";s:3:"몡";s:2:"";s:3:"몢";s:2:"";s:3:"몣";s:2:"";s:3:"몤";s:2:"";s:3:"몥";s:2:"";s:3:"몦";s:2:"";s:3:"몧";s:2:"";s:3:"몪";s:2:"";s:3:"몭";s:2:"";s:3:"몮";s:2:"";s:3:"몯";s:2:"";s:3:"몱";s:2:"";s:3:"몳";s:2:"";s:3:"몴";s:2:"";s:3:"몵";s:2:"";s:3:"몶";s:2:"";s:3:"몷";s:2:"";s:3:"몺";s:2:"";s:3:"몼";s:2:"";s:3:"몾";s:2:"";s:3:"몿";s:2:"";s:3:"뫀";s:2:"";s:3:"뫁";s:2:"";s:3:"뫂";s:2:"";s:3:"뫃";s:2:"";s:3:"뫅";s:2:"";s:3:"뫆";s:2:"";s:3:"뫇";s:2:"";s:3:"뫉";s:2:"";s:3:"뫊";s:2:"";s:3:"뫋";s:2:"";s:3:"뫌";s:2:"";s:3:"뫍";s:2:"";s:3:"뫎";s:2:"";s:3:"뫏";s:2:"";s:3:"뫐";s:2:"";s:3:"뫑";s:2:"";s:3:"뫒";s:2:"";s:3:"뫓";s:2:"";s:3:"뫔";s:2:"";s:3:"뫕";s:2:"";s:3:"뫖";s:2:"";s:3:"뫗";s:2:"";s:3:"뫚";s:2:"";s:3:"뫛";s:2:"";s:3:"뫜";s:2:"";s:3:"뫝";s:2:"";s:3:"뫞";s:2:"";s:3:"뫟";s:2:"";s:3:"뫠";s:2:"";s:3:"뫡";s:2:"";s:3:"뫢";s:2:"";s:3:"뫣";s:2:"";s:3:"뫤";s:2:"";s:3:"뫥";s:2:"";s:3:"뫦";s:2:"";s:3:"뫧";s:2:"";s:3:"뫨";s:2:"";s:3:"뫩";s:2:"";s:3:"뫪";s:2:"";s:3:"뫫";s:2:"";s:3:"뫬";s:2:"";s:3:"뫭";s:2:"";s:3:"뫮";s:2:"";s:3:"뫯";s:2:"";s:3:"뫰";s:2:"";s:3:"뫱";s:2:"";s:3:"뫲";s:2:"";s:3:"뫳";s:2:"";s:3:"뫴";s:2:"";s:3:"뫵";s:2:"";s:3:"뫶";s:2:"";s:3:"뫷";s:2:"";s:3:"뫸";s:2:"";s:3:"뫹";s:2:"";s:3:"뫺";s:2:"";s:3:"뫻";s:2:"";s:3:"뫽";s:2:"";s:3:"뫾";s:2:"";s:3:"뫿";s:2:"";s:3:"묁";s:2:"";s:3:"묂";s:2:"";s:3:"묃";s:2:"";s:3:"묅";s:2:"";s:3:"묆";s:2:"";s:3:"묇";s:2:"";s:3:"묈";s:2:"";s:3:"묉";s:2:"";s:3:"묊";s:2:"";s:3:"묋";s:2:"";s:3:"묌";s:2:"";s:3:"묎";s:2:"";s:3:"묐";s:2:"";s:3:"묒";s:2:"";s:3:"묓";s:2:"";s:3:"묔";s:2:"";s:3:"묕";s:2:"";s:3:"묖";s:2:"";s:3:"묗";s:2:"";s:3:"묙";s:2:"";s:3:"묚";s:2:"";s:3:"묛";s:2:"";s:3:"묝";s:2:"";s:3:"묞";s:2:"";s:3:"묟";s:2:"";s:3:"묡";s:2:"";s:3:"묢";s:2:"";s:3:"묣";s:2:"";s:3:"묤";s:2:"";s:3:"묥";s:2:"";s:3:"묦";s:2:"";s:3:"묧";s:2:"A";s:3:"묨";s:2:"B";s:3:"묪";s:2:"C";s:3:"묬";s:2:"D";s:3:"묭";s:2:"E";s:3:"묮";s:2:"F";s:3:"묯";s:2:"G";s:3:"묰";s:2:"H";s:3:"묱";s:2:"I";s:3:"묲";s:2:"J";s:3:"묳";s:2:"K";s:3:"묷";s:2:"L";s:3:"묹";s:2:"M";s:3:"묺";s:2:"N";s:3:"묿";s:2:"O";s:3:"뭀";s:2:"P";s:3:"뭁";s:2:"Q";s:3:"뭂";s:2:"R";s:3:"뭃";s:2:"S";s:3:"뭆";s:2:"T";s:3:"뭈";s:2:"U";s:3:"뭊";s:2:"V";s:3:"뭋";s:2:"W";s:3:"뭌";s:2:"X";s:3:"뭎";s:2:"Y";s:3:"뭑";s:2:"Z";s:3:"뭒";s:2:"a";s:3:"뭓";s:2:"b";s:3:"뭕";s:2:"c";s:3:"뭖";s:2:"d";s:3:"뭗";s:2:"e";s:3:"뭙";s:2:"f";s:3:"뭚";s:2:"g";s:3:"뭛";s:2:"h";s:3:"뭜";s:2:"i";s:3:"뭝";s:2:"j";s:3:"뭞";s:2:"k";s:3:"뭟";s:2:"l";s:3:"뭠";s:2:"m";s:3:"뭢";s:2:"n";s:3:"뭤";s:2:"o";s:3:"뭥";s:2:"p";s:3:"뭦";s:2:"q";s:3:"뭧";s:2:"r";s:3:"뭨";s:2:"s";s:3:"뭩";s:2:"t";s:3:"뭪";s:2:"u";s:3:"뭫";s:2:"v";s:3:"뭭";s:2:"w";s:3:"뭮";s:2:"x";s:3:"뭯";s:2:"y";s:3:"뭰";s:2:"z";s:3:"뭱";s:2:"";s:3:"뭲";s:2:"";s:3:"뭳";s:2:"";s:3:"뭴";s:2:"";s:3:"뭵";s:2:"";s:3:"뭶";s:2:"";s:3:"뭷";s:2:"";s:3:"뭸";s:2:"";s:3:"뭹";s:2:"";s:3:"뭺";s:2:"";s:3:"뭻";s:2:"";s:3:"뭼";s:2:"";s:3:"뭽";s:2:"";s:3:"뭾";s:2:"";s:3:"뭿";s:2:"";s:3:"뮀";s:2:"";s:3:"뮁";s:2:"";s:3:"뮂";s:2:"";s:3:"뮃";s:2:"";s:3:"뮄";s:2:"";s:3:"뮅";s:2:"";s:3:"뮆";s:2:"";s:3:"뮇";s:2:"";s:3:"뮉";s:2:"";s:3:"뮊";s:2:"";s:3:"뮋";s:2:"";s:3:"뮍";s:2:"";s:3:"뮎";s:2:"";s:3:"뮏";s:2:"";s:3:"뮑";s:2:"";s:3:"뮒";s:2:"";s:3:"뮓";s:2:"";s:3:"뮔";s:2:"";s:3:"뮕";s:2:"";s:3:"뮖";s:2:"";s:3:"뮗";s:2:"";s:3:"뮘";s:2:"";s:3:"뮙";s:2:"";s:3:"뮚";s:2:"";s:3:"뮛";s:2:"";s:3:"뮜";s:2:"";s:3:"뮝";s:2:"";s:3:"뮞";s:2:"";s:3:"뮟";s:2:"";s:3:"뮠";s:2:"";s:3:"뮡";s:2:"";s:3:"뮢";s:2:"";s:3:"뮣";s:2:"";s:3:"뮥";s:2:"";s:3:"뮦";s:2:"";s:3:"뮧";s:2:"";s:3:"뮩";s:2:"";s:3:"뮪";s:2:"";s:3:"뮫";s:2:"";s:3:"뮭";s:2:"";s:3:"뮮";s:2:"";s:3:"뮯";s:2:"";s:3:"뮰";s:2:"";s:3:"뮱";s:2:"";s:3:"뮲";s:2:"";s:3:"뮳";s:2:"";s:3:"뮵";s:2:"";s:3:"뮶";s:2:"";s:3:"뮸";s:2:"";s:3:"뮹";s:2:"";s:3:"뮺";s:2:"";s:3:"뮻";s:2:"";s:3:"뮼";s:2:"";s:3:"뮽";s:2:"";s:3:"뮾";s:2:"";s:3:"뮿";s:2:"";s:3:"믁";s:2:"";s:3:"믂";s:2:"";s:3:"믃";s:2:"";s:3:"믅";s:2:"";s:3:"믆";s:2:"";s:3:"믇";s:2:"";s:3:"믉";s:2:"";s:3:"믊";s:2:"";s:3:"믋";s:2:"";s:3:"믌";s:2:"";s:3:"믍";s:2:"";s:3:"믎";s:2:"";s:3:"믏";s:2:"";s:3:"믑";s:2:"";s:3:"믒";s:2:"";s:3:"믔";s:2:"";s:3:"믕";s:2:"";s:3:"믖";s:2:"";s:3:"믗";s:2:"";s:3:"믘";s:2:"";s:3:"믙";s:2:"";s:3:"믚";s:2:"";s:3:"믛";s:2:"";s:3:"믜";s:2:"";s:3:"믝";s:2:"";s:3:"믞";s:2:"";s:3:"믟";s:2:"";s:3:"믠";s:2:"";s:3:"믡";s:2:"";s:3:"믢";s:2:"";s:3:"믣";s:2:"";s:3:"믤";s:2:"";s:3:"믥";s:2:"";s:3:"믦";s:2:"";s:3:"믧";s:2:"";s:3:"믨";s:2:"";s:3:"믩";s:2:"";s:3:"믪";s:2:"";s:3:"믫";s:2:"";s:3:"믬";s:2:"";s:3:"믭";s:2:"";s:3:"믮";s:2:"";s:3:"믯";s:2:"";s:3:"믰";s:2:"";s:3:"믱";s:2:"";s:3:"믲";s:2:"";s:3:"믳";s:2:"";s:3:"믴";s:2:"";s:3:"믵";s:2:"";s:3:"믶";s:2:"";s:3:"믷";s:2:"";s:3:"믺";s:2:"";s:3:"믻";s:2:"";s:3:"믽";s:2:"";s:3:"믾";s:2:"";s:3:"밁";s:2:"A";s:3:"밃";s:2:"B";s:3:"밄";s:2:"C";s:3:"밅";s:2:"D";s:3:"밆";s:2:"E";s:3:"밇";s:2:"F";s:3:"밊";s:2:"G";s:3:"밎";s:2:"H";s:3:"밐";s:2:"I";s:3:"밒";s:2:"J";s:3:"밓";s:2:"K";s:3:"밙";s:2:"L";s:3:"밚";s:2:"M";s:3:"밠";s:2:"N";s:3:"밡";s:2:"O";s:3:"밢";s:2:"P";s:3:"밣";s:2:"Q";s:3:"밦";s:2:"R";s:3:"밨";s:2:"S";s:3:"밪";s:2:"T";s:3:"밫";s:2:"U";s:3:"밬";s:2:"V";s:3:"밮";s:2:"W";s:3:"밯";s:2:"X";s:3:"밲";s:2:"Y";s:3:"밳";s:2:"Z";s:3:"밵";s:2:"a";s:3:"밶";s:2:"b";s:3:"밷";s:2:"c";s:3:"밹";s:2:"d";s:3:"밺";s:2:"e";s:3:"밻";s:2:"f";s:3:"밼";s:2:"g";s:3:"밽";s:2:"h";s:3:"밾";s:2:"i";s:3:"밿";s:2:"j";s:3:"뱂";s:2:"k";s:3:"뱆";s:2:"l";s:3:"뱇";s:2:"m";s:3:"뱈";s:2:"n";s:3:"뱊";s:2:"o";s:3:"뱋";s:2:"p";s:3:"뱎";s:2:"q";s:3:"뱏";s:2:"r";s:3:"뱑";s:2:"s";s:3:"뱒";s:2:"t";s:3:"뱓";s:2:"u";s:3:"뱔";s:2:"v";s:3:"뱕";s:2:"w";s:3:"뱖";s:2:"x";s:3:"뱗";s:2:"y";s:3:"뱘";s:2:"z";s:3:"뱙";s:2:"";s:3:"뱚";s:2:"";s:3:"뱛";s:2:"";s:3:"뱜";s:2:"";s:3:"뱞";s:2:"";s:3:"뱟";s:2:"";s:3:"뱠";s:2:"";s:3:"뱡";s:2:"";s:3:"뱢";s:2:"";s:3:"뱣";s:2:"";s:3:"뱤";s:2:"";s:3:"뱥";s:2:"";s:3:"뱦";s:2:"";s:3:"뱧";s:2:"";s:3:"뱨";s:2:"";s:3:"뱩";s:2:"";s:3:"뱪";s:2:"";s:3:"뱫";s:2:"";s:3:"뱬";s:2:"";s:3:"뱭";s:2:"";s:3:"뱮";s:2:"";s:3:"뱯";s:2:"";s:3:"뱰";s:2:"";s:3:"뱱";s:2:"";s:3:"뱲";s:2:"";s:3:"뱳";s:2:"";s:3:"뱴";s:2:"";s:3:"뱵";s:2:"";s:3:"뱶";s:2:"";s:3:"뱷";s:2:"";s:3:"뱸";s:2:"";s:3:"뱹";s:2:"";s:3:"뱺";s:2:"";s:3:"뱻";s:2:"";s:3:"뱼";s:2:"";s:3:"뱽";s:2:"";s:3:"뱾";s:2:"";s:3:"뱿";s:2:"";s:3:"벀";s:2:"";s:3:"벁";s:2:"";s:3:"벂";s:2:"";s:3:"벃";s:2:"";s:3:"벆";s:2:"";s:3:"벇";s:2:"";s:3:"벉";s:2:"";s:3:"벊";s:2:"";s:3:"벍";s:2:"";s:3:"벏";s:2:"";s:3:"벐";s:2:"";s:3:"벑";s:2:"";s:3:"벒";s:2:"";s:3:"벓";s:2:"";s:3:"벖";s:2:"";s:3:"벘";s:2:"";s:3:"벛";s:2:"";s:3:"벜";s:2:"";s:3:"벝";s:2:"";s:3:"벞";s:2:"";s:3:"벟";s:2:"";s:3:"벢";s:2:"";s:3:"벣";s:2:"";s:3:"벥";s:2:"";s:3:"벦";s:2:"";s:3:"벩";s:2:"";s:3:"벪";s:2:"";s:3:"벫";s:2:"";s:3:"벬";s:2:"";s:3:"벭";s:2:"";s:3:"벮";s:2:"";s:3:"벯";s:2:"";s:3:"벲";s:2:"";s:3:"벶";s:2:"";s:3:"벷";s:2:"";s:3:"벸";s:2:"";s:3:"벹";s:2:"";s:3:"벺";s:2:"";s:3:"벻";s:2:"";s:3:"벾";s:2:"";s:3:"벿";s:2:"";s:3:"볁";s:2:"";s:3:"볂";s:2:"";s:3:"볃";s:2:"";s:3:"볅";s:2:"";s:3:"볆";s:2:"";s:3:"볇";s:2:"";s:3:"볈";s:2:"";s:3:"볉";s:2:"";s:3:"볊";s:2:"";s:3:"볋";s:2:"";s:3:"볌";s:2:"";s:3:"볎";s:2:"";s:3:"볒";s:2:"";s:3:"볓";s:2:"";s:3:"볔";s:2:"";s:3:"볖";s:2:"";s:3:"볗";s:2:"";s:3:"볙";s:2:"";s:3:"볚";s:2:"";s:3:"볛";s:2:"";s:3:"볝";s:2:"";s:3:"볞";s:2:"";s:3:"볟";s:2:"";s:3:"볠";s:2:"";s:3:"볡";s:2:"";s:3:"볢";s:2:"";s:3:"볣";s:2:"";s:3:"볤";s:2:"";s:3:"볥";s:2:"";s:3:"볦";s:2:"";s:3:"볧";s:2:"";s:3:"볨";s:2:"";s:3:"볩";s:2:"";s:3:"볪";s:2:"";s:3:"볫";s:2:"";s:3:"볬";s:2:"";s:3:"볭";s:2:"";s:3:"볮";s:2:"";s:3:"볯";s:2:"";s:3:"볰";s:2:"";s:3:"볱";s:2:"";s:3:"볲";s:2:"";s:3:"볳";s:2:"";s:3:"볷";s:2:"";s:3:"볹";s:2:"";s:3:"볺";s:2:"";s:3:"볻";s:2:"";s:3:"볽";s:2:"A";s:3:"볾";s:2:"B";s:3:"볿";s:2:"C";s:3:"봀";s:2:"D";s:3:"봁";s:2:"E";s:3:"봂";s:2:"F";s:3:"봃";s:2:"G";s:3:"봆";s:2:"H";s:3:"봈";s:2:"I";s:3:"봊";s:2:"J";s:3:"봋";s:2:"K";s:3:"봌";s:2:"L";s:3:"봍";s:2:"M";s:3:"봎";s:2:"N";s:3:"봏";s:2:"O";s:3:"봑";s:2:"P";s:3:"봒";s:2:"Q";s:3:"봓";s:2:"R";s:3:"봕";s:2:"S";s:3:"봖";s:2:"T";s:3:"봗";s:2:"U";s:3:"봘";s:2:"V";s:3:"봙";s:2:"W";s:3:"봚";s:2:"X";s:3:"봛";s:2:"Y";s:3:"봜";s:2:"Z";s:3:"봝";s:2:"a";s:3:"봞";s:2:"b";s:3:"봟";s:2:"c";s:3:"봠";s:2:"d";s:3:"봡";s:2:"e";s:3:"봢";s:2:"f";s:3:"봣";s:2:"g";s:3:"봥";s:2:"h";s:3:"봦";s:2:"i";s:3:"봧";s:2:"j";s:3:"봨";s:2:"k";s:3:"봩";s:2:"l";s:3:"봪";s:2:"m";s:3:"봫";s:2:"n";s:3:"봭";s:2:"o";s:3:"봮";s:2:"p";s:3:"봯";s:2:"q";s:3:"봰";s:2:"r";s:3:"봱";s:2:"s";s:3:"봲";s:2:"t";s:3:"봳";s:2:"u";s:3:"봴";s:2:"v";s:3:"봵";s:2:"w";s:3:"봶";s:2:"x";s:3:"봷";s:2:"y";s:3:"봸";s:2:"z";s:3:"봹";s:2:"";s:3:"봺";s:2:"";s:3:"봻";s:2:"";s:3:"봼";s:2:"";s:3:"봽";s:2:"";s:3:"봾";s:2:"";s:3:"봿";s:2:"";s:3:"뵁";s:2:"";s:3:"뵂";s:2:"";s:3:"뵃";s:2:"";s:3:"뵄";s:2:"";s:3:"뵅";s:2:"";s:3:"뵆";s:2:"";s:3:"뵇";s:2:"";s:3:"뵊";s:2:"";s:3:"뵋";s:2:"";s:3:"뵍";s:2:"";s:3:"뵎";s:2:"";s:3:"뵏";s:2:"";s:3:"뵑";s:2:"";s:3:"뵒";s:2:"";s:3:"뵓";s:2:"";s:3:"뵔";s:2:"";s:3:"뵕";s:2:"";s:3:"뵖";s:2:"";s:3:"뵗";s:2:"";s:3:"뵚";s:2:"";s:3:"뵛";s:2:"";s:3:"뵜";s:2:"";s:3:"뵝";s:2:"";s:3:"뵞";s:2:"";s:3:"뵟";s:2:"";s:3:"뵠";s:2:"";s:3:"뵡";s:2:"";s:3:"뵢";s:2:"";s:3:"뵣";s:2:"";s:3:"뵥";s:2:"";s:3:"뵦";s:2:"";s:3:"뵧";s:2:"";s:3:"뵩";s:2:"";s:3:"뵪";s:2:"";s:3:"뵫";s:2:"";s:3:"뵬";s:2:"";s:3:"뵭";s:2:"";s:3:"뵮";s:2:"";s:3:"뵯";s:2:"";s:3:"뵰";s:2:"";s:3:"뵱";s:2:"";s:3:"뵲";s:2:"";s:3:"뵳";s:2:"";s:3:"뵴";s:2:"";s:3:"뵵";s:2:"";s:3:"뵶";s:2:"";s:3:"뵷";s:2:"";s:3:"뵸";s:2:"";s:3:"뵹";s:2:"";s:3:"뵺";s:2:"";s:3:"뵻";s:2:"";s:3:"뵼";s:2:"";s:3:"뵽";s:2:"";s:3:"뵾";s:2:"";s:3:"뵿";s:2:"";s:3:"붂";s:2:"";s:3:"붃";s:2:"";s:3:"붅";s:2:"";s:3:"붆";s:2:"";s:3:"붋";s:2:"";s:3:"붌";s:2:"";s:3:"붍";s:2:"";s:3:"붎";s:2:"";s:3:"붏";s:2:"";s:3:"붒";s:2:"";s:3:"붔";s:2:"";s:3:"붖";s:2:"";s:3:"붗";s:2:"";s:3:"붘";s:2:"";s:3:"붛";s:2:"";s:3:"붝";s:2:"";s:3:"붞";s:2:"";s:3:"붟";s:2:"";s:3:"붠";s:2:"";s:3:"붡";s:2:"";s:3:"붢";s:2:"";s:3:"붣";s:2:"";s:3:"붥";s:2:"";s:3:"붦";s:2:"";s:3:"붧";s:2:"";s:3:"붨";s:2:"";s:3:"붩";s:2:"";s:3:"붪";s:2:"";s:3:"붫";s:2:"";s:3:"붬";s:2:"";s:3:"붭";s:2:"";s:3:"붮";s:2:"";s:3:"붯";s:2:"";s:3:"붱";s:2:"";s:3:"붲";s:2:"";s:3:"붳";s:2:"";s:3:"붴";s:2:"";s:3:"붵";s:2:"";s:3:"붶";s:2:"";s:3:"붷";s:2:"";s:3:"붹";s:2:"";s:3:"붺";s:2:"";s:3:"붻";s:2:"";s:3:"붼";s:2:"";s:3:"붽";s:2:"";s:3:"붾";s:2:"";s:3:"붿";s:2:"";s:3:"뷀";s:2:"";s:3:"뷁";s:2:"";s:3:"뷂";s:2:"";s:3:"뷃";s:2:"";s:3:"뷄";s:2:"";s:3:"뷅";s:2:"";s:3:"뷆";s:2:"";s:3:"뷇";s:2:"";s:3:"뷈";s:2:"";s:3:"뷉";s:2:"";s:3:"뷊";s:2:"";s:3:"뷋";s:2:"";s:3:"뷌";s:2:"";s:3:"뷍";s:2:"";s:3:"뷎";s:2:"";s:3:"뷏";s:2:"";s:3:"뷐";s:2:"";s:3:"뷑";s:2:"A";s:3:"뷒";s:2:"B";s:3:"뷓";s:2:"C";s:3:"뷖";s:2:"D";s:3:"뷗";s:2:"E";s:3:"뷙";s:2:"F";s:3:"뷚";s:2:"G";s:3:"뷛";s:2:"H";s:3:"뷝";s:2:"I";s:3:"뷞";s:2:"J";s:3:"뷟";s:2:"K";s:3:"뷠";s:2:"L";s:3:"뷡";s:2:"M";s:3:"뷢";s:2:"N";s:3:"뷣";s:2:"O";s:3:"뷤";s:2:"P";s:3:"뷥";s:2:"Q";s:3:"뷦";s:2:"R";s:3:"뷧";s:2:"S";s:3:"뷨";s:2:"T";s:3:"뷪";s:2:"U";s:3:"뷫";s:2:"V";s:3:"뷬";s:2:"W";s:3:"뷭";s:2:"X";s:3:"뷮";s:2:"Y";s:3:"뷯";s:2:"Z";s:3:"뷱";s:2:"a";s:3:"뷲";s:2:"b";s:3:"뷳";s:2:"c";s:3:"뷵";s:2:"d";s:3:"뷶";s:2:"e";s:3:"뷷";s:2:"f";s:3:"뷹";s:2:"g";s:3:"뷺";s:2:"h";s:3:"뷻";s:2:"i";s:3:"뷼";s:2:"j";s:3:"뷽";s:2:"k";s:3:"뷾";s:2:"l";s:3:"뷿";s:2:"m";s:3:"븁";s:2:"n";s:3:"븂";s:2:"o";s:3:"븄";s:2:"p";s:3:"븆";s:2:"q";s:3:"븇";s:2:"r";s:3:"븈";s:2:"s";s:3:"븉";s:2:"t";s:3:"븊";s:2:"u";s:3:"븋";s:2:"v";s:3:"븎";s:2:"w";s:3:"븏";s:2:"x";s:3:"븑";s:2:"y";s:3:"븒";s:2:"z";s:3:"븓";s:2:"";s:3:"븕";s:2:"";s:3:"븖";s:2:"";s:3:"븗";s:2:"";s:3:"븘";s:2:"";s:3:"븙";s:2:"";s:3:"븚";s:2:"";s:3:"븛";s:2:"";s:3:"븞";s:2:"";s:3:"븠";s:2:"";s:3:"븡";s:2:"";s:3:"븢";s:2:"";s:3:"븣";s:2:"";s:3:"븤";s:2:"";s:3:"븥";s:2:"";s:3:"븦";s:2:"";s:3:"븧";s:2:"";s:3:"븨";s:2:"";s:3:"븩";s:2:"";s:3:"븪";s:2:"";s:3:"븫";s:2:"";s:3:"븬";s:2:"";s:3:"븭";s:2:"";s:3:"븮";s:2:"";s:3:"븯";s:2:"";s:3:"븰";s:2:"";s:3:"븱";s:2:"";s:3:"븲";s:2:"";s:3:"븳";s:2:"";s:3:"븴";s:2:"";s:3:"븵";s:2:"";s:3:"븶";s:2:"";s:3:"븷";s:2:"";s:3:"븸";s:2:"";s:3:"븹";s:2:"";s:3:"븺";s:2:"";s:3:"븻";s:2:"";s:3:"븼";s:2:"";s:3:"븽";s:2:"";s:3:"븾";s:2:"";s:3:"븿";s:2:"";s:3:"빀";s:2:"";s:3:"빁";s:2:"";s:3:"빂";s:2:"";s:3:"빃";s:2:"";s:3:"빆";s:2:"";s:3:"빇";s:2:"";s:3:"빉";s:2:"";s:3:"빊";s:2:"";s:3:"빋";s:2:"";s:3:"빍";s:2:"";s:3:"빏";s:2:"";s:3:"빐";s:2:"";s:3:"빑";s:2:"";s:3:"빒";s:2:"";s:3:"빓";s:2:"";s:3:"빖";s:2:"";s:3:"빘";s:2:"";s:3:"빜";s:2:"";s:3:"빝";s:2:"";s:3:"빞";s:2:"";s:3:"빟";s:2:"";s:3:"빢";s:2:"";s:3:"빣";s:2:"";s:3:"빥";s:2:"";s:3:"빦";s:2:"";s:3:"빧";s:2:"";s:3:"빩";s:2:"";s:3:"빫";s:2:"";s:3:"빬";s:2:"";s:3:"빭";s:2:"";s:3:"빮";s:2:"";s:3:"빯";s:2:"";s:3:"빲";s:2:"";s:3:"빶";s:2:"";s:3:"빷";s:2:"";s:3:"빸";s:2:"";s:3:"빹";s:2:"";s:3:"빺";s:2:"";s:3:"빾";s:2:"";s:3:"빿";s:2:"";s:3:"뺁";s:2:"";s:3:"뺂";s:2:"";s:3:"뺃";s:2:"";s:3:"뺅";s:2:"";s:3:"뺆";s:2:"";s:3:"뺇";s:2:"";s:3:"뺈";s:2:"";s:3:"뺉";s:2:"";s:3:"뺊";s:2:"";s:3:"뺋";s:2:"";s:3:"뺎";s:2:"";s:3:"뺒";s:2:"";s:3:"뺓";s:2:"";s:3:"뺔";s:2:"";s:3:"뺕";s:2:"";s:3:"뺖";s:2:"";s:3:"뺗";s:2:"";s:3:"뺚";s:2:"";s:3:"뺛";s:2:"";s:3:"뺜";s:2:"";s:3:"뺝";s:2:"";s:3:"뺞";s:2:"";s:3:"뺟";s:2:"";s:3:"뺠";s:2:"";s:3:"뺡";s:2:"";s:3:"뺢";s:2:"";s:3:"뺣";s:2:"";s:3:"뺤";s:2:"";s:3:"뺥";s:2:"";s:3:"뺦";s:2:"";s:3:"뺧";s:2:"";s:3:"뺩";s:2:"";s:3:"뺪";s:2:"";s:3:"뺫";s:2:"";s:3:"뺬";s:2:"";s:3:"뺭";s:2:"";s:3:"뺮";s:2:"";s:3:"뺯";s:2:"";s:3:"뺰";s:2:"";s:3:"뺱";s:2:"";s:3:"뺲";s:2:"";s:3:"뺳";s:2:"";s:3:"뺴";s:2:"";s:3:"뺵";s:2:"";s:3:"뺶";s:2:"";s:3:"뺷";s:2:"A";s:3:"뺸";s:2:"B";s:3:"뺹";s:2:"C";s:3:"뺺";s:2:"D";s:3:"뺻";s:2:"E";s:3:"뺼";s:2:"F";s:3:"뺽";s:2:"G";s:3:"뺾";s:2:"H";s:3:"뺿";s:2:"I";s:3:"뻀";s:2:"J";s:3:"뻁";s:2:"K";s:3:"뻂";s:2:"L";s:3:"뻃";s:2:"M";s:3:"뻄";s:2:"N";s:3:"뻅";s:2:"O";s:3:"뻆";s:2:"P";s:3:"뻇";s:2:"Q";s:3:"뻈";s:2:"R";s:3:"뻉";s:2:"S";s:3:"뻊";s:2:"T";s:3:"뻋";s:2:"U";s:3:"뻌";s:2:"V";s:3:"뻍";s:2:"W";s:3:"뻎";s:2:"X";s:3:"뻏";s:2:"Y";s:3:"뻒";s:2:"Z";s:3:"뻓";s:2:"a";s:3:"뻕";s:2:"b";s:3:"뻖";s:2:"c";s:3:"뻙";s:2:"d";s:3:"뻚";s:2:"e";s:3:"뻛";s:2:"f";s:3:"뻜";s:2:"g";s:3:"뻝";s:2:"h";s:3:"뻞";s:2:"i";s:3:"뻟";s:2:"j";s:3:"뻡";s:2:"k";s:3:"뻢";s:2:"l";s:3:"뻦";s:2:"m";s:3:"뻧";s:2:"n";s:3:"뻨";s:2:"o";s:3:"뻩";s:2:"p";s:3:"뻪";s:2:"q";s:3:"뻫";s:2:"r";s:3:"뻭";s:2:"s";s:3:"뻮";s:2:"t";s:3:"뻯";s:2:"u";s:3:"뻰";s:2:"v";s:3:"뻱";s:2:"w";s:3:"뻲";s:2:"x";s:3:"뻳";s:2:"y";s:3:"뻴";s:2:"z";s:3:"뻵";s:2:"";s:3:"뻶";s:2:"";s:3:"뻷";s:2:"";s:3:"뻸";s:2:"";s:3:"뻹";s:2:"";s:3:"뻺";s:2:"";s:3:"뻻";s:2:"";s:3:"뻼";s:2:"";s:3:"뻽";s:2:"";s:3:"뻾";s:2:"";s:3:"뻿";s:2:"";s:3:"뼀";s:2:"";s:3:"뼂";s:2:"";s:3:"뼃";s:2:"";s:3:"뼄";s:2:"";s:3:"뼅";s:2:"";s:3:"뼆";s:2:"";s:3:"뼇";s:2:"";s:3:"뼊";s:2:"";s:3:"뼋";s:2:"";s:3:"뼌";s:2:"";s:3:"뼍";s:2:"";s:3:"뼎";s:2:"";s:3:"뼏";s:2:"";s:3:"뼐";s:2:"";s:3:"뼑";s:2:"";s:3:"뼒";s:2:"";s:3:"뼓";s:2:"";s:3:"뼔";s:2:"";s:3:"뼕";s:2:"";s:3:"뼖";s:2:"";s:3:"뼗";s:2:"";s:3:"뼚";s:2:"";s:3:"뼞";s:2:"";s:3:"뼟";s:2:"";s:3:"뼠";s:2:"";s:3:"뼡";s:2:"";s:3:"뼢";s:2:"";s:3:"뼣";s:2:"";s:3:"뼤";s:2:"";s:3:"뼥";s:2:"";s:3:"뼦";s:2:"";s:3:"뼧";s:2:"";s:3:"뼨";s:2:"";s:3:"뼩";s:2:"";s:3:"뼪";s:2:"";s:3:"뼫";s:2:"";s:3:"뼬";s:2:"";s:3:"뼭";s:2:"";s:3:"뼮";s:2:"";s:3:"뼯";s:2:"";s:3:"뼰";s:2:"";s:3:"뼱";s:2:"";s:3:"뼲";s:2:"";s:3:"뼳";s:2:"";s:3:"뼴";s:2:"";s:3:"뼵";s:2:"";s:3:"뼶";s:2:"";s:3:"뼷";s:2:"";s:3:"뼸";s:2:"";s:3:"뼹";s:2:"";s:3:"뼺";s:2:"";s:3:"뼻";s:2:"";s:3:"뼼";s:2:"";s:3:"뼽";s:2:"";s:3:"뼾";s:2:"";s:3:"뼿";s:2:"";s:3:"뽂";s:2:"";s:3:"뽃";s:2:"";s:3:"뽅";s:2:"";s:3:"뽆";s:2:"";s:3:"뽇";s:2:"";s:3:"뽉";s:2:"";s:3:"뽊";s:2:"";s:3:"뽋";s:2:"";s:3:"뽌";s:2:"";s:3:"뽍";s:2:"";s:3:"뽎";s:2:"";s:3:"뽏";s:2:"";s:3:"뽒";s:2:"";s:3:"뽓";s:2:"";s:3:"뽔";s:2:"";s:3:"뽖";s:2:"";s:3:"뽗";s:2:"";s:3:"뽘";s:2:"";s:3:"뽙";s:2:"";s:3:"뽚";s:2:"";s:3:"뽛";s:2:"";s:3:"뽜";s:2:"";s:3:"뽝";s:2:"";s:3:"뽞";s:2:"";s:3:"뽟";s:2:"";s:3:"뽠";s:2:"";s:3:"뽡";s:2:"";s:3:"뽢";s:2:"";s:3:"뽣";s:2:"";s:3:"뽤";s:2:"";s:3:"뽥";s:2:"";s:3:"뽦";s:2:"";s:3:"뽧";s:2:"";s:3:"뽨";s:2:"";s:3:"뽩";s:2:"";s:3:"뽪";s:2:"";s:3:"뽫";s:2:"";s:3:"뽬";s:2:"";s:3:"뽭";s:2:"";s:3:"뽮";s:2:"";s:3:"뽯";s:2:"";s:3:"뽰";s:2:"";s:3:"뽱";s:2:"";s:3:"뽲";s:2:"";s:3:"뽳";s:2:"";s:3:"뽴";s:2:"";s:3:"뽵";s:2:"";s:3:"뽶";s:2:"";s:3:"뽷";s:2:"";s:3:"뽸";s:2:"";s:3:"뽹";s:2:"";s:3:"뽺";s:2:"";s:3:"뽻";s:2:"";s:3:"뽼";s:2:"";s:3:"뽽";s:2:"";s:3:"뽾";s:2:"";s:3:"뽿";s:2:"";s:3:"뾀";s:2:"";s:3:"뾁";s:2:"";s:3:"뾂";s:2:"A";s:3:"뾃";s:2:"B";s:3:"뾄";s:2:"C";s:3:"뾅";s:2:"D";s:3:"뾆";s:2:"E";s:3:"뾇";s:2:"F";s:3:"뾈";s:2:"G";s:3:"뾉";s:2:"H";s:3:"뾊";s:2:"I";s:3:"뾋";s:2:"J";s:3:"뾌";s:2:"K";s:3:"뾍";s:2:"L";s:3:"뾎";s:2:"M";s:3:"뾏";s:2:"N";s:3:"뾐";s:2:"O";s:3:"뾑";s:2:"P";s:3:"뾒";s:2:"Q";s:3:"뾓";s:2:"R";s:3:"뾕";s:2:"S";s:3:"뾖";s:2:"T";s:3:"뾗";s:2:"U";s:3:"뾘";s:2:"V";s:3:"뾙";s:2:"W";s:3:"뾚";s:2:"X";s:3:"뾛";s:2:"Y";s:3:"뾜";s:2:"Z";s:3:"뾝";s:2:"a";s:3:"뾞";s:2:"b";s:3:"뾟";s:2:"c";s:3:"뾠";s:2:"d";s:3:"뾡";s:2:"e";s:3:"뾢";s:2:"f";s:3:"뾣";s:2:"g";s:3:"뾤";s:2:"h";s:3:"뾥";s:2:"i";s:3:"뾦";s:2:"j";s:3:"뾧";s:2:"k";s:3:"뾨";s:2:"l";s:3:"뾩";s:2:"m";s:3:"뾪";s:2:"n";s:3:"뾫";s:2:"o";s:3:"뾬";s:2:"p";s:3:"뾭";s:2:"q";s:3:"뾮";s:2:"r";s:3:"뾯";s:2:"s";s:3:"뾱";s:2:"t";s:3:"뾲";s:2:"u";s:3:"뾳";s:2:"v";s:3:"뾴";s:2:"w";s:3:"뾵";s:2:"x";s:3:"뾶";s:2:"y";s:3:"뾷";s:2:"z";s:3:"뾸";s:2:"";s:3:"뾹";s:2:"";s:3:"뾺";s:2:"";s:3:"뾻";s:2:"";s:3:"뾼";s:2:"";s:3:"뾽";s:2:"";s:3:"뾾";s:2:"";s:3:"뾿";s:2:"";s:3:"뿀";s:2:"";s:3:"뿁";s:2:"";s:3:"뿂";s:2:"";s:3:"뿃";s:2:"";s:3:"뿄";s:2:"";s:3:"뿆";s:2:"";s:3:"뿇";s:2:"";s:3:"뿈";s:2:"";s:3:"뿉";s:2:"";s:3:"뿊";s:2:"";s:3:"뿋";s:2:"";s:3:"뿎";s:2:"";s:3:"뿏";s:2:"";s:3:"뿑";s:2:"";s:3:"뿒";s:2:"";s:3:"뿓";s:2:"";s:3:"뿕";s:2:"";s:3:"뿖";s:2:"";s:3:"뿗";s:2:"";s:3:"뿘";s:2:"";s:3:"뿙";s:2:"";s:3:"뿚";s:2:"";s:3:"뿛";s:2:"";s:3:"뿝";s:2:"";s:3:"뿞";s:2:"";s:3:"뿠";s:2:"";s:3:"뿢";s:2:"";s:3:"뿣";s:2:"";s:3:"뿤";s:2:"";s:3:"뿥";s:2:"";s:3:"뿦";s:2:"";s:3:"뿧";s:2:"";s:3:"뿨";s:2:"";s:3:"뿩";s:2:"";s:3:"뿪";s:2:"";s:3:"뿫";s:2:"";s:3:"뿬";s:2:"";s:3:"뿭";s:2:"";s:3:"뿮";s:2:"";s:3:"뿯";s:2:"";s:3:"뿰";s:2:"";s:3:"뿱";s:2:"";s:3:"뿲";s:2:"";s:3:"뿳";s:2:"";s:3:"뿴";s:2:"";s:3:"뿵";s:2:"";s:3:"뿶";s:2:"";s:3:"뿷";s:2:"";s:3:"뿸";s:2:"";s:3:"뿹";s:2:"";s:3:"뿺";s:2:"";s:3:"뿻";s:2:"";s:3:"뿼";s:2:"";s:3:"뿽";s:2:"";s:3:"뿾";s:2:"";s:3:"뿿";s:2:"";s:3:"쀀";s:2:"";s:3:"쀁";s:2:"";s:3:"쀂";s:2:"";s:3:"쀃";s:2:"";s:3:"쀄";s:2:"";s:3:"쀅";s:2:"";s:3:"쀆";s:2:"";s:3:"쀇";s:2:"";s:3:"쀈";s:2:"";s:3:"쀉";s:2:"";s:3:"쀊";s:2:"";s:3:"쀋";s:2:"";s:3:"쀌";s:2:"";s:3:"쀍";s:2:"";s:3:"쀎";s:2:"";s:3:"쀏";s:2:"";s:3:"쀐";s:2:"";s:3:"쀑";s:2:"";s:3:"쀒";s:2:"";s:3:"쀓";s:2:"";s:3:"쀔";s:2:"";s:3:"쀕";s:2:"";s:3:"쀖";s:2:"";s:3:"쀗";s:2:"";s:3:"쀘";s:2:"";s:3:"쀙";s:2:"";s:3:"쀚";s:2:"";s:3:"쀛";s:2:"";s:3:"쀜";s:2:"";s:3:"쀝";s:2:"";s:3:"쀞";s:2:"";s:3:"쀟";s:2:"";s:3:"쀠";s:2:"";s:3:"쀡";s:2:"";s:3:"쀢";s:2:"";s:3:"쀣";s:2:"";s:3:"쀤";s:2:"";s:3:"쀥";s:2:"";s:3:"쀦";s:2:"";s:3:"쀧";s:2:"";s:3:"쀨";s:2:"";s:3:"쀩";s:2:"";s:3:"쀪";s:2:"";s:3:"쀫";s:2:"";s:3:"쀬";s:2:"";s:3:"쀭";s:2:"";s:3:"쀮";s:2:"";s:3:"쀯";s:2:"";s:3:"쀰";s:2:"";s:3:"쀱";s:2:"";s:3:"쀲";s:2:"";s:3:"쀳";s:2:"";s:3:"쀴";s:2:"";s:3:"쀵";s:2:"";s:3:"쀶";s:2:"";s:3:"쀷";s:2:"";s:3:"쀸";s:2:"";s:3:"쀹";s:2:"";s:3:"쀺";s:2:"";s:3:"쀻";s:2:"";s:3:"쀽";s:2:"";s:3:"쀾";s:2:"";s:3:"쀿";s:2:"A";s:3:"쁀";s:2:"B";s:3:"쁁";s:2:"C";s:3:"쁂";s:2:"D";s:3:"쁃";s:2:"E";s:3:"쁄";s:2:"F";s:3:"쁅";s:2:"G";s:3:"쁆";s:2:"H";s:3:"쁇";s:2:"I";s:3:"쁈";s:2:"J";s:3:"쁉";s:2:"K";s:3:"쁊";s:2:"L";s:3:"쁋";s:2:"M";s:3:"쁌";s:2:"N";s:3:"쁍";s:2:"O";s:3:"쁎";s:2:"P";s:3:"쁏";s:2:"Q";s:3:"쁐";s:2:"R";s:3:"쁒";s:2:"S";s:3:"쁓";s:2:"T";s:3:"쁔";s:2:"U";s:3:"쁕";s:2:"V";s:3:"쁖";s:2:"W";s:3:"쁗";s:2:"X";s:3:"쁙";s:2:"Y";s:3:"쁚";s:2:"Z";s:3:"쁛";s:2:"a";s:3:"쁝";s:2:"b";s:3:"쁞";s:2:"c";s:3:"쁟";s:2:"d";s:3:"쁡";s:2:"e";s:3:"쁢";s:2:"f";s:3:"쁣";s:2:"g";s:3:"쁤";s:2:"h";s:3:"쁥";s:2:"i";s:3:"쁦";s:2:"j";s:3:"쁧";s:2:"k";s:3:"쁪";s:2:"l";s:3:"쁫";s:2:"m";s:3:"쁬";s:2:"n";s:3:"쁭";s:2:"o";s:3:"쁮";s:2:"p";s:3:"쁯";s:2:"q";s:3:"쁰";s:2:"r";s:3:"쁱";s:2:"s";s:3:"쁲";s:2:"t";s:3:"쁳";s:2:"u";s:3:"쁴";s:2:"v";s:3:"쁵";s:2:"w";s:3:"쁶";s:2:"x";s:3:"쁷";s:2:"y";s:3:"쁸";s:2:"z";s:3:"쁹";s:2:"";s:3:"쁺";s:2:"";s:3:"쁻";s:2:"";s:3:"쁼";s:2:"";s:3:"쁽";s:2:"";s:3:"쁾";s:2:"";s:3:"쁿";s:2:"";s:3:"삀";s:2:"";s:3:"삁";s:2:"";s:3:"삂";s:2:"";s:3:"삃";s:2:"";s:3:"삄";s:2:"";s:3:"삅";s:2:"";s:3:"삆";s:2:"";s:3:"삇";s:2:"";s:3:"삈";s:2:"";s:3:"삉";s:2:"";s:3:"삊";s:2:"";s:3:"삋";s:2:"";s:3:"삌";s:2:"";s:3:"삍";s:2:"";s:3:"삎";s:2:"";s:3:"삏";s:2:"";s:3:"삒";s:2:"";s:3:"삓";s:2:"";s:3:"삕";s:2:"";s:3:"삖";s:2:"";s:3:"삗";s:2:"";s:3:"삙";s:2:"";s:3:"삚";s:2:"";s:3:"삛";s:2:"";s:3:"삜";s:2:"";s:3:"삝";s:2:"";s:3:"삞";s:2:"";s:3:"삟";s:2:"";s:3:"삢";s:2:"";s:3:"삤";s:2:"";s:3:"삦";s:2:"";s:3:"삧";s:2:"";s:3:"삨";s:2:"";s:3:"삩";s:2:"";s:3:"삪";s:2:"";s:3:"삫";s:2:"";s:3:"삮";s:2:"";s:3:"삱";s:2:"";s:3:"삲";s:2:"";s:3:"삷";s:2:"";s:3:"삸";s:2:"";s:3:"삹";s:2:"";s:3:"삺";s:2:"";s:3:"삻";s:2:"";s:3:"삾";s:2:"";s:3:"샂";s:2:"";s:3:"샃";s:2:"";s:3:"샄";s:2:"";s:3:"샆";s:2:"";s:3:"샇";s:2:"";s:3:"샊";s:2:"";s:3:"샋";s:2:"";s:3:"샍";s:2:"";s:3:"샎";s:2:"";s:3:"샏";s:2:"";s:3:"샑";s:2:"";s:3:"샒";s:2:"";s:3:"샓";s:2:"";s:3:"샔";s:2:"";s:3:"샕";s:2:"";s:3:"샖";s:2:"";s:3:"샗";s:2:"";s:3:"샚";s:2:"";s:3:"샞";s:2:"";s:3:"샟";s:2:"";s:3:"샠";s:2:"";s:3:"샡";s:2:"";s:3:"샢";s:2:"";s:3:"샣";s:2:"";s:3:"샦";s:2:"";s:3:"샧";s:2:"";s:3:"샩";s:2:"";s:3:"샪";s:2:"";s:3:"샫";s:2:"";s:3:"샭";s:2:"";s:3:"샮";s:2:"";s:3:"샯";s:2:"";s:3:"샰";s:2:"";s:3:"샱";s:2:"";s:3:"샲";s:2:"";s:3:"샳";s:2:"";s:3:"샶";s:2:"";s:3:"샸";s:2:"";s:3:"샺";s:2:"";s:3:"샻";s:2:"";s:3:"샼";s:2:"";s:3:"샽";s:2:"";s:3:"샾";s:2:"";s:3:"샿";s:2:"";s:3:"섁";s:2:"";s:3:"섂";s:2:"";s:3:"섃";s:2:"";s:3:"섅";s:2:"";s:3:"섆";s:2:"";s:3:"섇";s:2:"";s:3:"섉";s:2:"";s:3:"섊";s:2:"";s:3:"섋";s:2:"";s:3:"섌";s:2:"";s:3:"섍";s:2:"";s:3:"섎";s:2:"";s:3:"섏";s:2:"";s:3:"섑";s:2:"";s:3:"섒";s:2:"";s:3:"섓";s:2:"";s:3:"섔";s:2:"";s:3:"섖";s:2:"";s:3:"섗";s:2:"";s:3:"섘";s:2:"";s:3:"섙";s:2:"";s:3:"섚";s:2:"";s:3:"섛";s:2:"";s:3:"섡";s:2:"";s:3:"섢";s:2:"";s:3:"섥";s:2:"";s:3:"섨";s:2:"";s:3:"섩";s:2:"";s:3:"섪";s:2:"";s:3:"섫";s:2:"";s:3:"섮";s:2:"A";s:3:"섲";s:2:"B";s:3:"섳";s:2:"C";s:3:"섴";s:2:"D";s:3:"섵";s:2:"E";s:3:"섷";s:2:"F";s:3:"섺";s:2:"G";s:3:"섻";s:2:"H";s:3:"섽";s:2:"I";s:3:"섾";s:2:"J";s:3:"섿";s:2:"K";s:3:"셁";s:2:"L";s:3:"셂";s:2:"M";s:3:"셃";s:2:"N";s:3:"셄";s:2:"O";s:3:"셅";s:2:"P";s:3:"셆";s:2:"Q";s:3:"셇";s:2:"R";s:3:"셊";s:2:"S";s:3:"셎";s:2:"T";s:3:"셏";s:2:"U";s:3:"셐";s:2:"V";s:3:"셑";s:2:"W";s:3:"셒";s:2:"X";s:3:"셓";s:2:"Y";s:3:"셖";s:2:"Z";s:3:"셗";s:2:"a";s:3:"셙";s:2:"b";s:3:"셚";s:2:"c";s:3:"셛";s:2:"d";s:3:"셝";s:2:"e";s:3:"셞";s:2:"f";s:3:"셟";s:2:"g";s:3:"셠";s:2:"h";s:3:"셡";s:2:"i";s:3:"셢";s:2:"j";s:3:"셣";s:2:"k";s:3:"셦";s:2:"l";s:3:"셪";s:2:"m";s:3:"셫";s:2:"n";s:3:"셬";s:2:"o";s:3:"셭";s:2:"p";s:3:"셮";s:2:"q";s:3:"셯";s:2:"r";s:3:"셱";s:2:"s";s:3:"셲";s:2:"t";s:3:"셳";s:2:"u";s:3:"셵";s:2:"v";s:3:"셶";s:2:"w";s:3:"셷";s:2:"x";s:3:"셹";s:2:"y";s:3:"셺";s:2:"z";s:3:"셻";s:2:"";s:3:"셼";s:2:"";s:3:"셽";s:2:"";s:3:"셾";s:2:"";s:3:"셿";s:2:"";s:3:"솀";s:2:"";s:3:"솁";s:2:"";s:3:"솂";s:2:"";s:3:"솃";s:2:"";s:3:"솄";s:2:"";s:3:"솆";s:2:"";s:3:"솇";s:2:"";s:3:"솈";s:2:"";s:3:"솉";s:2:"";s:3:"솊";s:2:"";s:3:"솋";s:2:"";s:3:"솏";s:2:"";s:3:"솑";s:2:"";s:3:"솒";s:2:"";s:3:"솓";s:2:"";s:3:"솕";s:2:"";s:3:"솗";s:2:"";s:3:"솘";s:2:"";s:3:"솙";s:2:"";s:3:"솚";s:2:"";s:3:"솛";s:2:"";s:3:"솞";s:2:"";s:3:"솠";s:2:"";s:3:"솢";s:2:"";s:3:"솣";s:2:"";s:3:"솤";s:2:"";s:3:"솦";s:2:"";s:3:"솧";s:2:"";s:3:"솪";s:2:"";s:3:"솫";s:2:"";s:3:"솭";s:2:"";s:3:"솮";s:2:"";s:3:"솯";s:2:"";s:3:"솱";s:2:"";s:3:"솲";s:2:"";s:3:"솳";s:2:"";s:3:"솴";s:2:"";s:3:"솵";s:2:"";s:3:"솶";s:2:"";s:3:"솷";s:2:"";s:3:"솸";s:2:"";s:3:"솹";s:2:"";s:3:"솺";s:2:"";s:3:"솻";s:2:"";s:3:"솼";s:2:"";s:3:"솾";s:2:"";s:3:"솿";s:2:"";s:3:"쇀";s:2:"";s:3:"쇁";s:2:"";s:3:"쇂";s:2:"";s:3:"쇃";s:2:"";s:3:"쇅";s:2:"";s:3:"쇆";s:2:"";s:3:"쇇";s:2:"";s:3:"쇉";s:2:"";s:3:"쇊";s:2:"";s:3:"쇋";s:2:"";s:3:"쇍";s:2:"";s:3:"쇎";s:2:"";s:3:"쇏";s:2:"";s:3:"쇐";s:2:"";s:3:"쇑";s:2:"";s:3:"쇒";s:2:"";s:3:"쇓";s:2:"";s:3:"쇕";s:2:"";s:3:"쇖";s:2:"";s:3:"쇙";s:2:"";s:3:"쇚";s:2:"";s:3:"쇛";s:2:"";s:3:"쇜";s:2:"";s:3:"쇝";s:2:"";s:3:"쇞";s:2:"";s:3:"쇟";s:2:"";s:3:"쇡";s:2:"";s:3:"쇢";s:2:"";s:3:"쇣";s:2:"";s:3:"쇥";s:2:"";s:3:"쇦";s:2:"";s:3:"쇧";s:2:"";s:3:"쇩";s:2:"";s:3:"쇪";s:2:"";s:3:"쇫";s:2:"";s:3:"쇬";s:2:"";s:3:"쇭";s:2:"";s:3:"쇮";s:2:"";s:3:"쇯";s:2:"";s:3:"쇲";s:2:"";s:3:"쇴";s:2:"";s:3:"쇵";s:2:"";s:3:"쇶";s:2:"";s:3:"쇷";s:2:"";s:3:"쇸";s:2:"";s:3:"쇹";s:2:"";s:3:"쇺";s:2:"";s:3:"쇻";s:2:"";s:3:"쇾";s:2:"";s:3:"쇿";s:2:"";s:3:"숁";s:2:"";s:3:"숂";s:2:"";s:3:"숃";s:2:"";s:3:"숅";s:2:"";s:3:"숆";s:2:"";s:3:"숇";s:2:"";s:3:"숈";s:2:"";s:3:"숉";s:2:"";s:3:"숊";s:2:"";s:3:"숋";s:2:"";s:3:"숎";s:2:"";s:3:"숐";s:2:"";s:3:"숒";s:2:"";s:3:"숓";s:2:"";s:3:"숔";s:2:"";s:3:"숕";s:2:"";s:3:"숖";s:2:"";s:3:"숗";s:2:"";s:3:"숚";s:2:"";s:3:"숛";s:2:"";s:3:"숝";s:2:"";s:3:"숞";s:2:"";s:3:"숡";s:2:"";s:3:"숢";s:2:"";s:3:"숣";s:2:"A";s:3:"숤";s:2:"B";s:3:"숥";s:2:"C";s:3:"숦";s:2:"D";s:3:"숧";s:2:"E";s:3:"숪";s:2:"F";s:3:"숬";s:2:"G";s:3:"숮";s:2:"H";s:3:"숰";s:2:"I";s:3:"숳";s:2:"J";s:3:"숵";s:2:"K";s:3:"숶";s:2:"L";s:3:"숷";s:2:"M";s:3:"숸";s:2:"N";s:3:"숹";s:2:"O";s:3:"숺";s:2:"P";s:3:"숻";s:2:"Q";s:3:"숼";s:2:"R";s:3:"숽";s:2:"S";s:3:"숾";s:2:"T";s:3:"숿";s:2:"U";s:3:"쉀";s:2:"V";s:3:"쉁";s:2:"W";s:3:"쉂";s:2:"X";s:3:"쉃";s:2:"Y";s:3:"쉄";s:2:"Z";s:3:"쉅";s:2:"a";s:3:"쉆";s:2:"b";s:3:"쉇";s:2:"c";s:3:"쉉";s:2:"d";s:3:"쉊";s:2:"e";s:3:"쉋";s:2:"f";s:3:"쉌";s:2:"g";s:3:"쉍";s:2:"h";s:3:"쉎";s:2:"i";s:3:"쉏";s:2:"j";s:3:"쉒";s:2:"k";s:3:"쉓";s:2:"l";s:3:"쉕";s:2:"m";s:3:"쉖";s:2:"n";s:3:"쉗";s:2:"o";s:3:"쉙";s:2:"p";s:3:"쉚";s:2:"q";s:3:"쉛";s:2:"r";s:3:"쉜";s:2:"s";s:3:"쉝";s:2:"t";s:3:"쉞";s:2:"u";s:3:"쉟";s:2:"v";s:3:"쉡";s:2:"w";s:3:"쉢";s:2:"x";s:3:"쉣";s:2:"y";s:3:"쉤";s:2:"z";s:3:"쉦";s:2:"";s:3:"쉧";s:2:"";s:3:"쉨";s:2:"";s:3:"쉩";s:2:"";s:3:"쉪";s:2:"";s:3:"쉫";s:2:"";s:3:"쉮";s:2:"";s:3:"쉯";s:2:"";s:3:"쉱";s:2:"";s:3:"쉲";s:2:"";s:3:"쉳";s:2:"";s:3:"쉵";s:2:"";s:3:"쉶";s:2:"";s:3:"쉷";s:2:"";s:3:"쉸";s:2:"";s:3:"쉹";s:2:"";s:3:"쉺";s:2:"";s:3:"쉻";s:2:"";s:3:"쉾";s:2:"";s:3:"슀";s:2:"";s:3:"슂";s:2:"";s:3:"슃";s:2:"";s:3:"슄";s:2:"";s:3:"슅";s:2:"";s:3:"슆";s:2:"";s:3:"슇";s:2:"";s:3:"슊";s:2:"";s:3:"슋";s:2:"";s:3:"슌";s:2:"";s:3:"슍";s:2:"";s:3:"슎";s:2:"";s:3:"슏";s:2:"";s:3:"슑";s:2:"";s:3:"슒";s:2:"";s:3:"슓";s:2:"";s:3:"슔";s:2:"";s:3:"슕";s:2:"";s:3:"슖";s:2:"";s:3:"슗";s:2:"";s:3:"슙";s:2:"";s:3:"슚";s:2:"";s:3:"슜";s:2:"";s:3:"슞";s:2:"";s:3:"슟";s:2:"";s:3:"슠";s:2:"";s:3:"슡";s:2:"";s:3:"슢";s:2:"";s:3:"슣";s:2:"";s:3:"슦";s:2:"";s:3:"슧";s:2:"";s:3:"슩";s:2:"";s:3:"슪";s:2:"";s:3:"슫";s:2:"";s:3:"슮";s:2:"";s:3:"슯";s:2:"";s:3:"슰";s:2:"";s:3:"슱";s:2:"";s:3:"슲";s:2:"";s:3:"슳";s:2:"";s:3:"슶";s:2:"";s:3:"슸";s:2:"";s:3:"슺";s:2:"";s:3:"슻";s:2:"";s:3:"슼";s:2:"";s:3:"슽";s:2:"";s:3:"슾";s:2:"";s:3:"슿";s:2:"";s:3:"싀";s:2:"";s:3:"싁";s:2:"";s:3:"싂";s:2:"";s:3:"싃";s:2:"";s:3:"싄";s:2:"";s:3:"싅";s:2:"";s:3:"싆";s:2:"";s:3:"싇";s:2:"";s:3:"싈";s:2:"";s:3:"싉";s:2:"";s:3:"싊";s:2:"";s:3:"싋";s:2:"";s:3:"싌";s:2:"";s:3:"싍";s:2:"";s:3:"싎";s:2:"";s:3:"싏";s:2:"";s:3:"싐";s:2:"";s:3:"싑";s:2:"";s:3:"싒";s:2:"";s:3:"싓";s:2:"";s:3:"싔";s:2:"";s:3:"싕";s:2:"";s:3:"싖";s:2:"";s:3:"싗";s:2:"";s:3:"싘";s:2:"";s:3:"싙";s:2:"";s:3:"싚";s:2:"";s:3:"싛";s:2:"";s:3:"싞";s:2:"";s:3:"싟";s:2:"";s:3:"싡";s:2:"";s:3:"싢";s:2:"";s:3:"싥";s:2:"";s:3:"싦";s:2:"";s:3:"싧";s:2:"";s:3:"싨";s:2:"";s:3:"싩";s:2:"";s:3:"싪";s:2:"";s:3:"싮";s:2:"";s:3:"싰";s:2:"";s:3:"싲";s:2:"";s:3:"싳";s:2:"";s:3:"싴";s:2:"";s:3:"싵";s:2:"";s:3:"싷";s:2:"";s:3:"싺";s:2:"";s:3:"싽";s:2:"";s:3:"싾";s:2:"";s:3:"싿";s:2:"";s:3:"쌁";s:2:"";s:3:"쌂";s:2:"";s:3:"쌃";s:2:"";s:3:"쌄";s:2:"";s:3:"쌅";s:2:"";s:3:"쌆";s:2:"";s:3:"쌇";s:2:"";s:3:"쌊";s:2:"";s:3:"쌋";s:2:"";s:3:"쌎";s:2:"";s:3:"쌏";s:2:"A";s:3:"쌐";s:2:"B";s:3:"쌑";s:2:"C";s:3:"쌒";s:2:"D";s:3:"쌖";s:2:"E";s:3:"쌗";s:2:"F";s:3:"쌙";s:2:"G";s:3:"쌚";s:2:"H";s:3:"쌛";s:2:"I";s:3:"쌝";s:2:"J";s:3:"쌞";s:2:"K";s:3:"쌟";s:2:"L";s:3:"쌠";s:2:"M";s:3:"쌡";s:2:"N";s:3:"쌢";s:2:"O";s:3:"쌣";s:2:"P";s:3:"쌦";s:2:"Q";s:3:"쌧";s:2:"R";s:3:"쌪";s:2:"S";s:3:"쌫";s:2:"T";s:3:"쌬";s:2:"U";s:3:"쌭";s:2:"V";s:3:"쌮";s:2:"W";s:3:"쌯";s:2:"X";s:3:"쌰";s:2:"Y";s:3:"쌱";s:2:"Z";s:3:"쌲";s:2:"a";s:3:"쌳";s:2:"b";s:3:"쌴";s:2:"c";s:3:"쌵";s:2:"d";s:3:"쌶";s:2:"e";s:3:"쌷";s:2:"f";s:3:"쌸";s:2:"g";s:3:"쌹";s:2:"h";s:3:"쌺";s:2:"i";s:3:"쌻";s:2:"j";s:3:"쌼";s:2:"k";s:3:"쌽";s:2:"l";s:3:"쌾";s:2:"m";s:3:"쌿";s:2:"n";s:3:"썀";s:2:"o";s:3:"썁";s:2:"p";s:3:"썂";s:2:"q";s:3:"썃";s:2:"r";s:3:"썄";s:2:"s";s:3:"썆";s:2:"t";s:3:"썇";s:2:"u";s:3:"썈";s:2:"v";s:3:"썉";s:2:"w";s:3:"썊";s:2:"x";s:3:"썋";s:2:"y";s:3:"썌";s:2:"z";s:3:"썍";s:2:"";s:3:"썎";s:2:"";s:3:"썏";s:2:"";s:3:"썐";s:2:"";s:3:"썑";s:2:"";s:3:"썒";s:2:"";s:3:"썓";s:2:"";s:3:"썔";s:2:"";s:3:"썕";s:2:"";s:3:"썖";s:2:"";s:3:"썗";s:2:"";s:3:"썘";s:2:"";s:3:"썙";s:2:"";s:3:"썚";s:2:"";s:3:"썛";s:2:"";s:3:"썜";s:2:"";s:3:"썝";s:2:"";s:3:"썞";s:2:"";s:3:"썟";s:2:"";s:3:"썠";s:2:"";s:3:"썡";s:2:"";s:3:"썢";s:2:"";s:3:"썣";s:2:"";s:3:"썤";s:2:"";s:3:"썥";s:2:"";s:3:"썦";s:2:"";s:3:"썧";s:2:"";s:3:"썪";s:2:"";s:3:"썫";s:2:"";s:3:"썭";s:2:"";s:3:"썮";s:2:"";s:3:"썯";s:2:"";s:3:"썱";s:2:"";s:3:"썳";s:2:"";s:3:"썴";s:2:"";s:3:"썵";s:2:"";s:3:"썶";s:2:"";s:3:"썷";s:2:"";s:3:"썺";s:2:"";s:3:"썻";s:2:"";s:3:"썾";s:2:"";s:3:"썿";s:2:"";s:3:"쎀";s:2:"";s:3:"쎁";s:2:"";s:3:"쎂";s:2:"";s:3:"쎃";s:2:"";s:3:"쎅";s:2:"";s:3:"쎆";s:2:"";s:3:"쎇";s:2:"";s:3:"쎉";s:2:"";s:3:"쎊";s:2:"";s:3:"쎋";s:2:"";s:3:"쎍";s:2:"";s:3:"쎎";s:2:"";s:3:"쎏";s:2:"";s:3:"쎐";s:2:"";s:3:"쎑";s:2:"";s:3:"쎒";s:2:"";s:3:"쎓";s:2:"";s:3:"쎔";s:2:"";s:3:"쎕";s:2:"";s:3:"쎖";s:2:"";s:3:"쎗";s:2:"";s:3:"쎘";s:2:"";s:3:"쎙";s:2:"";s:3:"쎚";s:2:"";s:3:"쎛";s:2:"";s:3:"쎜";s:2:"";s:3:"쎝";s:2:"";s:3:"쎞";s:2:"";s:3:"쎟";s:2:"";s:3:"쎠";s:2:"";s:3:"쎡";s:2:"";s:3:"쎢";s:2:"";s:3:"쎣";s:2:"";s:3:"쎤";s:2:"";s:3:"쎥";s:2:"";s:3:"쎦";s:2:"";s:3:"쎧";s:2:"";s:3:"쎨";s:2:"";s:3:"쎩";s:2:"";s:3:"쎪";s:2:"";s:3:"쎫";s:2:"";s:3:"쎬";s:2:"";s:3:"쎭";s:2:"";s:3:"쎮";s:2:"";s:3:"쎯";s:2:"";s:3:"쎰";s:2:"";s:3:"쎱";s:2:"";s:3:"쎲";s:2:"";s:3:"쎳";s:2:"";s:3:"쎴";s:2:"";s:3:"쎵";s:2:"";s:3:"쎶";s:2:"";s:3:"쎷";s:2:"";s:3:"쎸";s:2:"";s:3:"쎹";s:2:"";s:3:"쎺";s:2:"";s:3:"쎻";s:2:"";s:3:"쎼";s:2:"";s:3:"쎽";s:2:"";s:3:"쎾";s:2:"";s:3:"쎿";s:2:"";s:3:"쏁";s:2:"";s:3:"쏂";s:2:"";s:3:"쏃";s:2:"";s:3:"쏄";s:2:"";s:3:"쏅";s:2:"";s:3:"쏆";s:2:"";s:3:"쏇";s:2:"";s:3:"쏈";s:2:"";s:3:"쏉";s:2:"";s:3:"쏊";s:2:"";s:3:"쏋";s:2:"";s:3:"쏌";s:2:"";s:3:"쏍";s:2:"";s:3:"쏎";s:2:"";s:3:"쏏";s:2:"";s:3:"쏐";s:2:"";s:3:"쏑";s:2:"";s:3:"쏒";s:2:"";s:3:"쏓";s:2:"";s:3:"쏔";s:2:"";s:3:"쏕";s:2:"";s:3:"쏖";s:2:"";s:3:"쏗";s:2:"";s:3:"쏚";s:2:"A";s:3:"쏛";s:2:"B";s:3:"쏝";s:2:"C";s:3:"쏞";s:2:"D";s:3:"쏡";s:2:"E";s:3:"쏣";s:2:"F";s:3:"쏤";s:2:"G";s:3:"쏥";s:2:"H";s:3:"쏦";s:2:"I";s:3:"쏧";s:2:"J";s:3:"쏪";s:2:"K";s:3:"쏫";s:2:"L";s:3:"쏬";s:2:"M";s:3:"쏮";s:2:"N";s:3:"쏯";s:2:"O";s:3:"쏰";s:2:"P";s:3:"쏱";s:2:"Q";s:3:"쏲";s:2:"R";s:3:"쏳";s:2:"S";s:3:"쏶";s:2:"T";s:3:"쏷";s:2:"U";s:3:"쏹";s:2:"V";s:3:"쏺";s:2:"W";s:3:"쏻";s:2:"X";s:3:"쏼";s:2:"Y";s:3:"쏽";s:2:"Z";s:3:"쏾";s:2:"a";s:3:"쏿";s:2:"b";s:3:"쐀";s:2:"c";s:3:"쐁";s:2:"d";s:3:"쐂";s:2:"e";s:3:"쐃";s:2:"f";s:3:"쐄";s:2:"g";s:3:"쐅";s:2:"h";s:3:"쐆";s:2:"i";s:3:"쐇";s:2:"j";s:3:"쐉";s:2:"k";s:3:"쐊";s:2:"l";s:3:"쐋";s:2:"m";s:3:"쐌";s:2:"n";s:3:"쐍";s:2:"o";s:3:"쐎";s:2:"p";s:3:"쐏";s:2:"q";s:3:"쐑";s:2:"r";s:3:"쐒";s:2:"s";s:3:"쐓";s:2:"t";s:3:"쐔";s:2:"u";s:3:"쐕";s:2:"v";s:3:"쐖";s:2:"w";s:3:"쐗";s:2:"x";s:3:"쐘";s:2:"y";s:3:"쐙";s:2:"z";s:3:"쐚";s:2:"";s:3:"쐛";s:2:"";s:3:"쐜";s:2:"";s:3:"쐝";s:2:"";s:3:"쐞";s:2:"";s:3:"쐟";s:2:"";s:3:"쐠";s:2:"";s:3:"쐡";s:2:"";s:3:"쐢";s:2:"";s:3:"쐣";s:2:"";s:3:"쐥";s:2:"";s:3:"쐦";s:2:"";s:3:"쐧";s:2:"";s:3:"쐨";s:2:"";s:3:"쐩";s:2:"";s:3:"쐪";s:2:"";s:3:"쐫";s:2:"";s:3:"쐭";s:2:"";s:3:"쐮";s:2:"";s:3:"쐯";s:2:"";s:3:"쐱";s:2:"";s:3:"쐲";s:2:"";s:3:"쐳";s:2:"";s:3:"쐵";s:2:"";s:3:"쐶";s:2:"";s:3:"쐷";s:2:"";s:3:"쐸";s:2:"";s:3:"쐹";s:2:"";s:3:"쐺";s:2:"";s:3:"쐻";s:2:"";s:3:"쐾";s:2:"";s:3:"쐿";s:2:"";s:3:"쑀";s:2:"";s:3:"쑁";s:2:"";s:3:"쑂";s:2:"";s:3:"쑃";s:2:"";s:3:"쑄";s:2:"";s:3:"쑅";s:2:"";s:3:"쑆";s:2:"";s:3:"쑇";s:2:"";s:3:"쑉";s:2:"";s:3:"쑊";s:2:"";s:3:"쑋";s:2:"";s:3:"쑌";s:2:"";s:3:"쑍";s:2:"";s:3:"쑎";s:2:"";s:3:"쑏";s:2:"";s:3:"쑐";s:2:"";s:3:"쑑";s:2:"";s:3:"쑒";s:2:"";s:3:"쑓";s:2:"";s:3:"쑔";s:2:"";s:3:"쑕";s:2:"";s:3:"쑖";s:2:"";s:3:"쑗";s:2:"";s:3:"쑘";s:2:"";s:3:"쑙";s:2:"";s:3:"쑚";s:2:"";s:3:"쑛";s:2:"";s:3:"쑜";s:2:"";s:3:"쑝";s:2:"";s:3:"쑞";s:2:"";s:3:"쑟";s:2:"";s:3:"쑠";s:2:"";s:3:"쑡";s:2:"";s:3:"쑢";s:2:"";s:3:"쑣";s:2:"";s:3:"쑦";s:2:"";s:3:"쑧";s:2:"";s:3:"쑩";s:2:"";s:3:"쑪";s:2:"";s:3:"쑫";s:2:"";s:3:"쑭";s:2:"";s:3:"쑮";s:2:"";s:3:"쑯";s:2:"";s:3:"쑰";s:2:"";s:3:"쑱";s:2:"";s:3:"쑲";s:2:"";s:3:"쑳";s:2:"";s:3:"쑶";s:2:"";s:3:"쑷";s:2:"";s:3:"쑸";s:2:"";s:3:"쑺";s:2:"";s:3:"쑻";s:2:"";s:3:"쑼";s:2:"";s:3:"쑽";s:2:"";s:3:"쑾";s:2:"";s:3:"쑿";s:2:"";s:3:"쒁";s:2:"";s:3:"쒂";s:2:"";s:3:"쒃";s:2:"";s:3:"쒄";s:2:"";s:3:"쒅";s:2:"";s:3:"쒆";s:2:"";s:3:"쒇";s:2:"";s:3:"쒈";s:2:"";s:3:"쒉";s:2:"";s:3:"쒊";s:2:"";s:3:"쒋";s:2:"";s:3:"쒌";s:2:"";s:3:"쒍";s:2:"";s:3:"쒎";s:2:"";s:3:"쒏";s:2:"";s:3:"쒐";s:2:"";s:3:"쒑";s:2:"";s:3:"쒒";s:2:"";s:3:"쒓";s:2:"";s:3:"쒕";s:2:"";s:3:"쒖";s:2:"";s:3:"쒗";s:2:"";s:3:"쒘";s:2:"";s:3:"쒙";s:2:"";s:3:"쒚";s:2:"";s:3:"쒛";s:2:"";s:3:"쒝";s:2:"";s:3:"쒞";s:2:"";s:3:"쒟";s:2:"";s:3:"쒠";s:2:"";s:3:"쒡";s:2:"";s:3:"쒢";s:2:"";s:3:"쒣";s:2:"";s:3:"쒤";s:2:"";s:3:"쒥";s:2:"";s:3:"쒦";s:2:"";s:3:"쒧";s:2:"";s:3:"쒨";s:2:"";s:3:"쒩";s:2:"A";s:3:"쒪";s:2:"B";s:3:"쒫";s:2:"C";s:3:"쒬";s:2:"D";s:3:"쒭";s:2:"E";s:3:"쒮";s:2:"F";s:3:"쒯";s:2:"G";s:3:"쒰";s:2:"H";s:3:"쒱";s:2:"I";s:3:"쒲";s:2:"J";s:3:"쒳";s:2:"K";s:3:"쒴";s:2:"L";s:3:"쒵";s:2:"M";s:3:"쒶";s:2:"N";s:3:"쒷";s:2:"O";s:3:"쒹";s:2:"P";s:3:"쒺";s:2:"Q";s:3:"쒻";s:2:"R";s:3:"쒽";s:2:"S";s:3:"쒾";s:2:"T";s:3:"쒿";s:2:"U";s:3:"쓀";s:2:"V";s:3:"쓁";s:2:"W";s:3:"쓂";s:2:"X";s:3:"쓃";s:2:"Y";s:3:"쓄";s:2:"Z";s:3:"쓅";s:2:"a";s:3:"쓆";s:2:"b";s:3:"쓇";s:2:"c";s:3:"쓈";s:2:"d";s:3:"쓉";s:2:"e";s:3:"쓊";s:2:"f";s:3:"쓋";s:2:"g";s:3:"쓌";s:2:"h";s:3:"쓍";s:2:"i";s:3:"쓎";s:2:"j";s:3:"쓏";s:2:"k";s:3:"쓐";s:2:"l";s:3:"쓑";s:2:"m";s:3:"쓒";s:2:"n";s:3:"쓓";s:2:"o";s:3:"쓔";s:2:"p";s:3:"쓕";s:2:"q";s:3:"쓖";s:2:"r";s:3:"쓗";s:2:"s";s:3:"쓘";s:2:"t";s:3:"쓙";s:2:"u";s:3:"쓚";s:2:"v";s:3:"쓛";s:2:"w";s:3:"쓜";s:2:"x";s:3:"쓝";s:2:"y";s:3:"쓞";s:2:"z";s:3:"쓟";s:2:"";s:3:"쓠";s:2:"";s:3:"쓡";s:2:"";s:3:"쓢";s:2:"";s:3:"쓣";s:2:"";s:3:"쓤";s:2:"";s:3:"쓥";s:2:"";s:3:"쓦";s:2:"";s:3:"쓧";s:2:"";s:3:"쓨";s:2:"";s:3:"쓪";s:2:"";s:3:"쓫";s:2:"";s:3:"쓬";s:2:"";s:3:"쓭";s:2:"";s:3:"쓮";s:2:"";s:3:"쓯";s:2:"";s:3:"쓲";s:2:"";s:3:"쓳";s:2:"";s:3:"쓵";s:2:"";s:3:"쓶";s:2:"";s:3:"쓷";s:2:"";s:3:"쓹";s:2:"";s:3:"쓻";s:2:"";s:3:"쓼";s:2:"";s:3:"쓽";s:2:"";s:3:"쓾";s:2:"";s:3:"씂";s:2:"";s:3:"씃";s:2:"";s:3:"씄";s:2:"";s:3:"씅";s:2:"";s:3:"씆";s:2:"";s:3:"씇";s:2:"";s:3:"씈";s:2:"";s:3:"씉";s:2:"";s:3:"씊";s:2:"";s:3:"씋";s:2:"";s:3:"씍";s:2:"";s:3:"씎";s:2:"";s:3:"씏";s:2:"";s:3:"씑";s:2:"";s:3:"씒";s:2:"";s:3:"씓";s:2:"";s:3:"씕";s:2:"";s:3:"씖";s:2:"";s:3:"씗";s:2:"";s:3:"씘";s:2:"";s:3:"씙";s:2:"";s:3:"씚";s:2:"";s:3:"씛";s:2:"";s:3:"씝";s:2:"";s:3:"씞";s:2:"";s:3:"씟";s:2:"";s:3:"씠";s:2:"";s:3:"씡";s:2:"";s:3:"씢";s:2:"";s:3:"씣";s:2:"";s:3:"씤";s:2:"";s:3:"씥";s:2:"";s:3:"씦";s:2:"";s:3:"씧";s:2:"";s:3:"씪";s:2:"";s:3:"씫";s:2:"";s:3:"씭";s:2:"";s:3:"씮";s:2:"";s:3:"씯";s:2:"";s:3:"씱";s:2:"";s:3:"씲";s:2:"";s:3:"씳";s:2:"";s:3:"씴";s:2:"";s:3:"씵";s:2:"";s:3:"씶";s:2:"";s:3:"씷";s:2:"";s:3:"씺";s:2:"";s:3:"씼";s:2:"";s:3:"씾";s:2:"";s:3:"씿";s:2:"";s:3:"앀";s:2:"";s:3:"앁";s:2:"";s:3:"앂";s:2:"";s:3:"앃";s:2:"";s:3:"앆";s:2:"";s:3:"앇";s:2:"";s:3:"앋";s:2:"";s:3:"앏";s:2:"";s:3:"앐";s:2:"";s:3:"앑";s:2:"";s:3:"앒";s:2:"";s:3:"앖";s:2:"";s:3:"앚";s:2:"";s:3:"앛";s:2:"";s:3:"앜";s:2:"";s:3:"앟";s:2:"";s:3:"앢";s:2:"";s:3:"앣";s:2:"";s:3:"앥";s:2:"";s:3:"앦";s:2:"";s:3:"앧";s:2:"";s:3:"앩";s:2:"";s:3:"앪";s:2:"";s:3:"앫";s:2:"";s:3:"앬";s:2:"";s:3:"앭";s:2:"";s:3:"앮";s:2:"";s:3:"앯";s:2:"";s:3:"앲";s:2:"";s:3:"앶";s:2:"";s:3:"앷";s:2:"";s:3:"앸";s:2:"";s:3:"앹";s:2:"";s:3:"앺";s:2:"";s:3:"앻";s:2:"";s:3:"앾";s:2:"";s:3:"앿";s:2:"";s:3:"얁";s:2:"";s:3:"얂";s:2:"";s:3:"얃";s:2:"";s:3:"얅";s:2:"";s:3:"얆";s:2:"";s:3:"얈";s:2:"";s:3:"얉";s:2:"";s:3:"얊";s:2:"";s:3:"얋";s:2:"";s:3:"얎";s:2:"";s:3:"얐";s:2:"";s:3:"얒";s:2:"";s:3:"얓";s:2:"";s:3:"얔";s:2:"A";s:3:"얖";s:2:"B";s:3:"얙";s:2:"C";s:3:"얚";s:2:"D";s:3:"얛";s:2:"E";s:3:"얝";s:2:"F";s:3:"얞";s:2:"G";s:3:"얟";s:2:"H";s:3:"얡";s:2:"I";s:3:"얢";s:2:"J";s:3:"얣";s:2:"K";s:3:"얤";s:2:"L";s:3:"얥";s:2:"M";s:3:"얦";s:2:"N";s:3:"얧";s:2:"O";s:3:"얨";s:2:"P";s:3:"얪";s:2:"Q";s:3:"얫";s:2:"R";s:3:"얬";s:2:"S";s:3:"얭";s:2:"T";s:3:"얮";s:2:"U";s:3:"얯";s:2:"V";s:3:"얰";s:2:"W";s:3:"얱";s:2:"X";s:3:"얲";s:2:"Y";s:3:"얳";s:2:"Z";s:3:"얶";s:2:"a";s:3:"얷";s:2:"b";s:3:"얺";s:2:"c";s:3:"얿";s:2:"d";s:3:"엀";s:2:"e";s:3:"엁";s:2:"f";s:3:"엂";s:2:"g";s:3:"엃";s:2:"h";s:3:"엋";s:2:"i";s:3:"엍";s:2:"j";s:3:"엏";s:2:"k";s:3:"엒";s:2:"l";s:3:"엓";s:2:"m";s:3:"엕";s:2:"n";s:3:"엖";s:2:"o";s:3:"엗";s:2:"p";s:3:"엙";s:2:"q";s:3:"엚";s:2:"r";s:3:"엛";s:2:"s";s:3:"엜";s:2:"t";s:3:"엝";s:2:"u";s:3:"엞";s:2:"v";s:3:"엟";s:2:"w";s:3:"엢";s:2:"x";s:3:"엤";s:2:"y";s:3:"엦";s:2:"z";s:3:"엧";s:2:"";s:3:"엨";s:2:"";s:3:"엩";s:2:"";s:3:"엪";s:2:"";s:3:"엫";s:2:"";s:3:"엯";s:2:"";s:3:"엱";s:2:"";s:3:"엲";s:2:"";s:3:"엳";s:2:"";s:3:"엵";s:2:"";s:3:"엸";s:2:"";s:3:"엹";s:2:"";s:3:"엺";s:2:"";s:3:"엻";s:2:"";s:3:"옂";s:2:"";s:3:"옃";s:2:"";s:3:"옄";s:2:"";s:3:"옉";s:2:"";s:3:"옊";s:2:"";s:3:"옋";s:2:"";s:3:"옍";s:2:"";s:3:"옎";s:2:"";s:3:"옏";s:2:"";s:3:"옑";s:2:"";s:3:"옒";s:2:"";s:3:"옓";s:2:"";s:3:"옔";s:2:"";s:3:"옕";s:2:"";s:3:"옖";s:2:"";s:3:"옗";s:2:"";s:3:"옚";s:2:"";s:3:"옝";s:2:"";s:3:"옞";s:2:"";s:3:"옟";s:2:"";s:3:"옠";s:2:"";s:3:"옡";s:2:"";s:3:"옢";s:2:"";s:3:"옣";s:2:"";s:3:"옦";s:2:"";s:3:"옧";s:2:"";s:3:"옩";s:2:"";s:3:"옪";s:2:"";s:3:"옫";s:2:"";s:3:"옯";s:2:"";s:3:"옱";s:2:"";s:3:"옲";s:2:"";s:3:"옶";s:2:"";s:3:"옸";s:2:"";s:3:"옺";s:2:"";s:3:"옼";s:2:"";s:3:"옽";s:2:"";s:3:"옾";s:2:"";s:3:"옿";s:2:"";s:3:"왂";s:2:"";s:3:"왃";s:2:"";s:3:"왅";s:2:"";s:3:"왆";s:2:"";s:3:"왇";s:2:"";s:3:"왉";s:2:"";s:3:"왊";s:2:"";s:3:"왋";s:2:"";s:3:"왌";s:2:"";s:3:"왍";s:2:"";s:3:"왎";s:2:"";s:3:"왏";s:2:"";s:3:"왒";s:2:"";s:3:"왖";s:2:"";s:3:"왗";s:2:"";s:3:"왘";s:2:"";s:3:"왙";s:2:"";s:3:"왚";s:2:"";s:3:"왛";s:2:"";s:3:"왞";s:2:"";s:3:"왟";s:2:"";s:3:"왡";s:2:"";s:3:"왢";s:2:"";s:3:"왣";s:2:"";s:3:"왤";s:2:"";s:3:"왥";s:2:"";s:3:"왦";s:2:"";s:3:"왧";s:2:"";s:3:"왨";s:2:"";s:3:"왩";s:2:"";s:3:"왪";s:2:"";s:3:"왫";s:2:"";s:3:"왭";s:2:"";s:3:"왮";s:2:"";s:3:"왰";s:2:"";s:3:"왲";s:2:"";s:3:"왳";s:2:"";s:3:"왴";s:2:"";s:3:"왵";s:2:"";s:3:"왶";s:2:"";s:3:"왷";s:2:"";s:3:"왺";s:2:"";s:3:"왻";s:2:"";s:3:"왽";s:2:"";s:3:"왾";s:2:"";s:3:"왿";s:2:"";s:3:"욁";s:2:"";s:3:"욂";s:2:"";s:3:"욃";s:2:"";s:3:"욄";s:2:"";s:3:"욅";s:2:"";s:3:"욆";s:2:"";s:3:"욇";s:2:"";s:3:"욊";s:2:"";s:3:"욌";s:2:"";s:3:"욎";s:2:"";s:3:"욏";s:2:"";s:3:"욐";s:2:"";s:3:"욑";s:2:"";s:3:"욒";s:2:"";s:3:"욓";s:2:"";s:3:"욖";s:2:"";s:3:"욗";s:2:"";s:3:"욙";s:2:"";s:3:"욚";s:2:"";s:3:"욛";s:2:"";s:3:"욝";s:2:"";s:3:"욞";s:2:"";s:3:"욟";s:2:"";s:3:"욠";s:2:"";s:3:"욡";s:2:"";s:3:"욢";s:2:"";s:3:"욣";s:2:"";s:3:"욦";s:2:"A";s:3:"욨";s:2:"B";s:3:"욪";s:2:"C";s:3:"욫";s:2:"D";s:3:"욬";s:2:"E";s:3:"욭";s:2:"F";s:3:"욮";s:2:"G";s:3:"욯";s:2:"H";s:3:"욲";s:2:"I";s:3:"욳";s:2:"J";s:3:"욵";s:2:"K";s:3:"욶";s:2:"L";s:3:"욷";s:2:"M";s:3:"욻";s:2:"N";s:3:"욼";s:2:"O";s:3:"욽";s:2:"P";s:3:"욾";s:2:"Q";s:3:"욿";s:2:"R";s:3:"웂";s:2:"S";s:3:"웄";s:2:"T";s:3:"웆";s:2:"U";s:3:"웇";s:2:"V";s:3:"웈";s:2:"W";s:3:"웉";s:2:"X";s:3:"웊";s:2:"Y";s:3:"웋";s:2:"Z";s:3:"웎";s:2:"a";s:3:"웏";s:2:"b";s:3:"웑";s:2:"c";s:3:"웒";s:2:"d";s:3:"웓";s:2:"e";s:3:"웕";s:2:"f";s:3:"웖";s:2:"g";s:3:"웗";s:2:"h";s:3:"웘";s:2:"i";s:3:"웙";s:2:"j";s:3:"웚";s:2:"k";s:3:"웛";s:2:"l";s:3:"웞";s:2:"m";s:3:"웟";s:2:"n";s:3:"웢";s:2:"o";s:3:"웣";s:2:"p";s:3:"웤";s:2:"q";s:3:"웥";s:2:"r";s:3:"웦";s:2:"s";s:3:"웧";s:2:"t";s:3:"웪";s:2:"u";s:3:"웫";s:2:"v";s:3:"웭";s:2:"w";s:3:"웮";s:2:"x";s:3:"웯";s:2:"y";s:3:"웱";s:2:"z";s:3:"웲";s:2:"";s:3:"웳";s:2:"";s:3:"웴";s:2:"";s:3:"웵";s:2:"";s:3:"웶";s:2:"";s:3:"웷";s:2:"";s:3:"웺";s:2:"";s:3:"웻";s:2:"";s:3:"웼";s:2:"";s:3:"웾";s:2:"";s:3:"웿";s:2:"";s:3:"윀";s:2:"";s:3:"윁";s:2:"";s:3:"윂";s:2:"";s:3:"윃";s:2:"";s:3:"윆";s:2:"";s:3:"윇";s:2:"";s:3:"윉";s:2:"";s:3:"윊";s:2:"";s:3:"윋";s:2:"";s:3:"윍";s:2:"";s:3:"윎";s:2:"";s:3:"윏";s:2:"";s:3:"윐";s:2:"";s:3:"윑";s:2:"";s:3:"윒";s:2:"";s:3:"윓";s:2:"";s:3:"윖";s:2:"";s:3:"윘";s:2:"";s:3:"윚";s:2:"";s:3:"윛";s:2:"";s:3:"윜";s:2:"";s:3:"윝";s:2:"";s:3:"윞";s:2:"";s:3:"윟";s:2:"";s:3:"윢";s:2:"";s:3:"윣";s:2:"";s:3:"윥";s:2:"";s:3:"윦";s:2:"";s:3:"윧";s:2:"";s:3:"윩";s:2:"";s:3:"윪";s:2:"";s:3:"윫";s:2:"";s:3:"윬";s:2:"";s:3:"윭";s:2:"";s:3:"윮";s:2:"";s:3:"윯";s:2:"";s:3:"윲";s:2:"";s:3:"윴";s:2:"";s:3:"윶";s:2:"";s:3:"윸";s:2:"";s:3:"윹";s:2:"";s:3:"윺";s:2:"";s:3:"윻";s:2:"";s:3:"윾";s:2:"";s:3:"윿";s:2:"";s:3:"읁";s:2:"";s:3:"읂";s:2:"";s:3:"읃";s:2:"";s:3:"읅";s:2:"";s:3:"읆";s:2:"";s:3:"읇";s:2:"";s:3:"읈";s:2:"";s:3:"읉";s:2:"";s:3:"읋";s:2:"";s:3:"읎";s:2:"";s:3:"읐";s:2:"";s:3:"읙";s:2:"";s:3:"읚";s:2:"";s:3:"읛";s:2:"";s:3:"읝";s:2:"";s:3:"읞";s:2:"";s:3:"읟";s:2:"";s:3:"읡";s:2:"";s:3:"읢";s:2:"";s:3:"읣";s:2:"";s:3:"읤";s:2:"";s:3:"읥";s:2:"";s:3:"읦";s:2:"";s:3:"읧";s:2:"";s:3:"읩";s:2:"";s:3:"읪";s:2:"";s:3:"읬";s:2:"";s:3:"읭";s:2:"";s:3:"읮";s:2:"";s:3:"읯";s:2:"";s:3:"읰";s:2:"";s:3:"읱";s:2:"";s:3:"읲";s:2:"";s:3:"읳";s:2:"";s:3:"읶";s:2:"";s:3:"읷";s:2:"";s:3:"읹";s:2:"";s:3:"읺";s:2:"";s:3:"읻";s:2:"";s:3:"읿";s:2:"";s:3:"잀";s:2:"";s:3:"잁";s:2:"";s:3:"잂";s:2:"";s:3:"잆";s:2:"";s:3:"잋";s:2:"";s:3:"잌";s:2:"";s:3:"잍";s:2:"";s:3:"잏";s:2:"";s:3:"잒";s:2:"";s:3:"잓";s:2:"";s:3:"잕";s:2:"";s:3:"잙";s:2:"";s:3:"잛";s:2:"";s:3:"잜";s:2:"";s:3:"잝";s:2:"";s:3:"잞";s:2:"";s:3:"잟";s:2:"";s:3:"잢";s:2:"";s:3:"잧";s:2:"";s:3:"잨";s:2:"";s:3:"잩";s:2:"";s:3:"잪";s:2:"";s:3:"잫";s:2:"";s:3:"잮";s:2:"";s:3:"잯";s:2:"";s:3:"잱";s:2:"";s:3:"잲";s:2:"";s:3:"잳";s:2:"";s:3:"잵";s:2:"";s:3:"잶";s:2:"";s:3:"잷";s:2:"A";s:3:"잸";s:2:"B";s:3:"잹";s:2:"C";s:3:"잺";s:2:"D";s:3:"잻";s:2:"E";s:3:"잾";s:2:"F";s:3:"쟂";s:2:"G";s:3:"쟃";s:2:"H";s:3:"쟄";s:2:"I";s:3:"쟅";s:2:"J";s:3:"쟆";s:2:"K";s:3:"쟇";s:2:"L";s:3:"쟊";s:2:"M";s:3:"쟋";s:2:"N";s:3:"쟍";s:2:"O";s:3:"쟏";s:2:"P";s:3:"쟑";s:2:"Q";s:3:"쟒";s:2:"R";s:3:"쟓";s:2:"S";s:3:"쟔";s:2:"T";s:3:"쟕";s:2:"U";s:3:"쟖";s:2:"V";s:3:"쟗";s:2:"W";s:3:"쟙";s:2:"X";s:3:"쟚";s:2:"Y";s:3:"쟛";s:2:"Z";s:3:"쟜";s:2:"a";s:3:"쟞";s:2:"b";s:3:"쟟";s:2:"c";s:3:"쟠";s:2:"d";s:3:"쟡";s:2:"e";s:3:"쟢";s:2:"f";s:3:"쟣";s:2:"g";s:3:"쟥";s:2:"h";s:3:"쟦";s:2:"i";s:3:"쟧";s:2:"j";s:3:"쟩";s:2:"k";s:3:"쟪";s:2:"l";s:3:"쟫";s:2:"m";s:3:"쟭";s:2:"n";s:3:"쟮";s:2:"o";s:3:"쟯";s:2:"p";s:3:"쟰";s:2:"q";s:3:"쟱";s:2:"r";s:3:"쟲";s:2:"s";s:3:"쟳";s:2:"t";s:3:"쟴";s:2:"u";s:3:"쟵";s:2:"v";s:3:"쟶";s:2:"w";s:3:"쟷";s:2:"x";s:3:"쟸";s:2:"y";s:3:"쟹";s:2:"z";s:3:"쟺";s:2:"";s:3:"쟻";s:2:"";s:3:"쟼";s:2:"";s:3:"쟽";s:2:"";s:3:"쟾";s:2:"";s:3:"쟿";s:2:"";s:3:"젂";s:2:"";s:3:"젃";s:2:"";s:3:"젅";s:2:"";s:3:"젆";s:2:"";s:3:"젇";s:2:"";s:3:"젉";s:2:"";s:3:"젋";s:2:"";s:3:"젌";s:2:"";s:3:"젍";s:2:"";s:3:"젎";s:2:"";s:3:"젏";s:2:"";s:3:"젒";s:2:"";s:3:"젔";s:2:"";s:3:"젗";s:2:"";s:3:"젘";s:2:"";s:3:"젙";s:2:"";s:3:"젚";s:2:"";s:3:"젛";s:2:"";s:3:"젞";s:2:"";s:3:"젟";s:2:"";s:3:"젡";s:2:"";s:3:"젢";s:2:"";s:3:"젣";s:2:"";s:3:"젥";s:2:"";s:3:"젦";s:2:"";s:3:"젧";s:2:"";s:3:"젨";s:2:"";s:3:"젩";s:2:"";s:3:"젪";s:2:"";s:3:"젫";s:2:"";s:3:"젮";s:2:"";s:3:"젰";s:2:"";s:3:"젲";s:2:"";s:3:"젳";s:2:"";s:3:"젴";s:2:"";s:3:"젵";s:2:"";s:3:"젶";s:2:"";s:3:"젷";s:2:"";s:3:"젹";s:2:"";s:3:"젺";s:2:"";s:3:"젻";s:2:"";s:3:"젽";s:2:"";s:3:"젾";s:2:"";s:3:"젿";s:2:"";s:3:"졁";s:2:"";s:3:"졂";s:2:"";s:3:"졃";s:2:"";s:3:"졄";s:2:"";s:3:"졅";s:2:"";s:3:"졆";s:2:"";s:3:"졇";s:2:"";s:3:"졊";s:2:"";s:3:"졋";s:2:"";s:3:"졎";s:2:"";s:3:"졏";s:2:"";s:3:"졐";s:2:"";s:3:"졑";s:2:"";s:3:"졒";s:2:"";s:3:"졓";s:2:"";s:3:"졕";s:2:"";s:3:"졖";s:2:"";s:3:"졗";s:2:"";s:3:"졘";s:2:"";s:3:"졙";s:2:"";s:3:"졚";s:2:"";s:3:"졛";s:2:"";s:3:"졜";s:2:"";s:3:"졝";s:2:"";s:3:"졞";s:2:"";s:3:"졟";s:2:"";s:3:"졠";s:2:"";s:3:"졡";s:2:"";s:3:"졢";s:2:"";s:3:"졣";s:2:"";s:3:"졤";s:2:"";s:3:"졥";s:2:"";s:3:"졦";s:2:"";s:3:"졧";s:2:"";s:3:"졨";s:2:"";s:3:"졩";s:2:"";s:3:"졪";s:2:"";s:3:"졫";s:2:"";s:3:"졬";s:2:"";s:3:"졭";s:2:"";s:3:"졮";s:2:"";s:3:"졯";s:2:"";s:3:"졲";s:2:"";s:3:"졳";s:2:"";s:3:"졵";s:2:"";s:3:"졶";s:2:"";s:3:"졷";s:2:"";s:3:"졹";s:2:"";s:3:"졻";s:2:"";s:3:"졼";s:2:"";s:3:"졽";s:2:"";s:3:"졾";s:2:"";s:3:"졿";s:2:"";s:3:"좂";s:2:"";s:3:"좄";s:2:"";s:3:"좈";s:2:"";s:3:"좉";s:2:"";s:3:"좊";s:2:"";s:3:"좎";s:2:"";s:3:"좏";s:2:"";s:3:"좐";s:2:"";s:3:"좑";s:2:"";s:3:"좒";s:2:"";s:3:"좓";s:2:"";s:3:"좕";s:2:"";s:3:"좖";s:2:"";s:3:"좗";s:2:"";s:3:"좘";s:2:"";s:3:"좙";s:2:"";s:3:"좚";s:2:"";s:3:"좛";s:2:"";s:3:"좜";s:2:"";s:3:"좞";s:2:"";s:3:"좠";s:2:"";s:3:"좢";s:2:"";s:3:"좣";s:2:"";s:3:"좤";s:2:"A";s:3:"좥";s:2:"B";s:3:"좦";s:2:"C";s:3:"좧";s:2:"D";s:3:"좩";s:2:"E";s:3:"좪";s:2:"F";s:3:"좫";s:2:"G";s:3:"좬";s:2:"H";s:3:"좭";s:2:"I";s:3:"좮";s:2:"J";s:3:"좯";s:2:"K";s:3:"좰";s:2:"L";s:3:"좱";s:2:"M";s:3:"좲";s:2:"N";s:3:"좳";s:2:"O";s:3:"좴";s:2:"P";s:3:"좵";s:2:"Q";s:3:"좶";s:2:"R";s:3:"좷";s:2:"S";s:3:"좸";s:2:"T";s:3:"좹";s:2:"U";s:3:"좺";s:2:"V";s:3:"좻";s:2:"W";s:3:"좾";s:2:"X";s:3:"좿";s:2:"Y";s:3:"죀";s:2:"Z";s:3:"죁";s:2:"a";s:3:"죂";s:2:"b";s:3:"죃";s:2:"c";s:3:"죅";s:2:"d";s:3:"죆";s:2:"e";s:3:"죇";s:2:"f";s:3:"죉";s:2:"g";s:3:"죊";s:2:"h";s:3:"죋";s:2:"i";s:3:"죍";s:2:"j";s:3:"죎";s:2:"k";s:3:"죏";s:2:"l";s:3:"죐";s:2:"m";s:3:"죑";s:2:"n";s:3:"죒";s:2:"o";s:3:"죓";s:2:"p";s:3:"죖";s:2:"q";s:3:"죘";s:2:"r";s:3:"죚";s:2:"s";s:3:"죛";s:2:"t";s:3:"죜";s:2:"u";s:3:"죝";s:2:"v";s:3:"죞";s:2:"w";s:3:"죟";s:2:"x";s:3:"죢";s:2:"y";s:3:"죣";s:2:"z";s:3:"죥";s:2:"";s:3:"죦";s:2:"";s:3:"죧";s:2:"";s:3:"죨";s:2:"";s:3:"죩";s:2:"";s:3:"죪";s:2:"";s:3:"죫";s:2:"";s:3:"죬";s:2:"";s:3:"죭";s:2:"";s:3:"죮";s:2:"";s:3:"죯";s:2:"";s:3:"죰";s:2:"";s:3:"죱";s:2:"";s:3:"죲";s:2:"";s:3:"죳";s:2:"";s:3:"죴";s:2:"";s:3:"죶";s:2:"";s:3:"죷";s:2:"";s:3:"죸";s:2:"";s:3:"죹";s:2:"";s:3:"죺";s:2:"";s:3:"죻";s:2:"";s:3:"죾";s:2:"";s:3:"죿";s:2:"";s:3:"줁";s:2:"";s:3:"줂";s:2:"";s:3:"줃";s:2:"";s:3:"줇";s:2:"";s:3:"줈";s:2:"";s:3:"줉";s:2:"";s:3:"줊";s:2:"";s:3:"줋";s:2:"";s:3:"줎";s:2:"";s:3:"　";s:2:"";s:3:"、";s:2:"";s:3:"。";s:2:"";s:2:"·";s:2:"";s:3:"‥";s:2:"";s:3:"…";s:2:"";s:2:"¨";s:2:"";s:3:"〃";s:2:"";s:2:"­";s:2:"";s:3:"―";s:2:"";s:3:"∥";s:2:"";s:3:"＼";s:2:"";s:3:"∼";s:2:"";s:3:"‘";s:2:"";s:3:"’";s:2:"";s:3:"“";s:2:"";s:3:"”";s:2:"";s:3:"〔";s:2:"";s:3:"〕";s:2:"";s:3:"〈";s:2:"";s:3:"〉";s:2:"";s:3:"《";s:2:"";s:3:"》";s:2:"";s:3:"「";s:2:"";s:3:"」";s:2:"";s:3:"『";s:2:"";s:3:"』";s:2:"";s:3:"【";s:2:"";s:3:"】";s:2:"";s:2:"±";s:2:"";s:2:"×";s:2:"";s:2:"÷";s:2:"";s:3:"≠";s:2:"";s:3:"≤";s:2:"";s:3:"≥";s:2:"";s:3:"∞";s:2:"";s:3:"∴";s:2:"";s:2:"°";s:2:"";s:3:"′";s:2:"";s:3:"″";s:2:"";s:3:"℃";s:2:"";s:3:"Å";s:2:"";s:3:"￠";s:2:"";s:3:"￡";s:2:"";s:3:"￥";s:2:"";s:3:"♂";s:2:"";s:3:"♀";s:2:"";s:3:"∠";s:2:"";s:3:"⊥";s:2:"";s:3:"⌒";s:2:"";s:3:"∂";s:2:"";s:3:"∇";s:2:"";s:3:"≡";s:2:"";s:3:"≒";s:2:"";s:2:"§";s:2:"";s:3:"※";s:2:"";s:3:"☆";s:2:"";s:3:"★";s:2:"";s:3:"○";s:2:"";s:3:"●";s:2:"";s:3:"◎";s:2:"";s:3:"◇";s:2:"";s:3:"◆";s:2:"";s:3:"□";s:2:"";s:3:"■";s:2:"";s:3:"△";s:2:"";s:3:"▲";s:2:"";s:3:"▽";s:2:"";s:3:"▼";s:2:"";s:3:"→";s:2:"";s:3:"←";s:2:"";s:3:"↑";s:2:"";s:3:"↓";s:2:"";s:3:"↔";s:2:"";s:3:"〓";s:2:"";s:3:"≪";s:2:"";s:3:"≫";s:2:"";s:3:"√";s:2:"";s:3:"∽";s:2:"";s:3:"∝";s:2:"";s:3:"∵";s:2:"";s:3:"∫";s:2:"";s:3:"∬";s:2:"";s:3:"∈";s:2:"";s:3:"∋";s:2:"";s:3:"⊆";s:2:"";s:3:"⊇";s:2:"";s:3:"⊂";s:2:"";s:3:"⊃";s:2:"";s:3:"∪";s:2:"";s:3:"∩";s:2:"";s:3:"∧";s:2:"";s:3:"∨";s:2:"";s:3:"￢";s:2:"A";s:3:"줐";s:2:"B";s:3:"줒";s:2:"C";s:3:"줓";s:2:"D";s:3:"줔";s:2:"E";s:3:"줕";s:2:"F";s:3:"줖";s:2:"G";s:3:"줗";s:2:"H";s:3:"줙";s:2:"I";s:3:"줚";s:2:"J";s:3:"줛";s:2:"K";s:3:"줜";s:2:"L";s:3:"줝";s:2:"M";s:3:"줞";s:2:"N";s:3:"줟";s:2:"O";s:3:"줠";s:2:"P";s:3:"줡";s:2:"Q";s:3:"줢";s:2:"R";s:3:"줣";s:2:"S";s:3:"줤";s:2:"T";s:3:"줥";s:2:"U";s:3:"줦";s:2:"V";s:3:"줧";s:2:"W";s:3:"줨";s:2:"X";s:3:"줩";s:2:"Y";s:3:"줪";s:2:"Z";s:3:"줫";s:2:"a";s:3:"줭";s:2:"b";s:3:"줮";s:2:"c";s:3:"줯";s:2:"d";s:3:"줰";s:2:"e";s:3:"줱";s:2:"f";s:3:"줲";s:2:"g";s:3:"줳";s:2:"h";s:3:"줵";s:2:"i";s:3:"줶";s:2:"j";s:3:"줷";s:2:"k";s:3:"줸";s:2:"l";s:3:"줹";s:2:"m";s:3:"줺";s:2:"n";s:3:"줻";s:2:"o";s:3:"줼";s:2:"p";s:3:"줽";s:2:"q";s:3:"줾";s:2:"r";s:3:"줿";s:2:"s";s:3:"쥀";s:2:"t";s:3:"쥁";s:2:"u";s:3:"쥂";s:2:"v";s:3:"쥃";s:2:"w";s:3:"쥄";s:2:"x";s:3:"쥅";s:2:"y";s:3:"쥆";s:2:"z";s:3:"쥇";s:2:"";s:3:"쥈";s:2:"";s:3:"쥉";s:2:"";s:3:"쥊";s:2:"";s:3:"쥋";s:2:"";s:3:"쥌";s:2:"";s:3:"쥍";s:2:"";s:3:"쥎";s:2:"";s:3:"쥏";s:2:"";s:3:"쥒";s:2:"";s:3:"쥓";s:2:"";s:3:"쥕";s:2:"";s:3:"쥖";s:2:"";s:3:"쥗";s:2:"";s:3:"쥙";s:2:"";s:3:"쥚";s:2:"";s:3:"쥛";s:2:"";s:3:"쥜";s:2:"";s:3:"쥝";s:2:"";s:3:"쥞";s:2:"";s:3:"쥟";s:2:"";s:3:"쥢";s:2:"";s:3:"쥤";s:2:"";s:3:"쥥";s:2:"";s:3:"쥦";s:2:"";s:3:"쥧";s:2:"";s:3:"쥨";s:2:"";s:3:"쥩";s:2:"";s:3:"쥪";s:2:"";s:3:"쥫";s:2:"";s:3:"쥭";s:2:"";s:3:"쥮";s:2:"";s:3:"쥯";s:2:"";s:3:"⇒";s:2:"";s:3:"⇔";s:2:"";s:3:"∀";s:2:"";s:3:"∃";s:2:"";s:2:"´";s:2:"";s:3:"～";s:2:"";s:2:"ˇ";s:2:"";s:2:"˘";s:2:"";s:2:"˝";s:2:"";s:2:"˚";s:2:"";s:2:"˙";s:2:"";s:2:"¸";s:2:"";s:2:"˛";s:2:"";s:2:"¡";s:2:"";s:2:"¿";s:2:"";s:2:"ː";s:2:"";s:3:"∮";s:2:"";s:3:"∑";s:2:"";s:3:"∏";s:2:"";s:2:"¤";s:2:"";s:3:"℉";s:2:"";s:3:"‰";s:2:"";s:3:"◁";s:2:"";s:3:"◀";s:2:"";s:3:"▷";s:2:"";s:3:"▶";s:2:"";s:3:"♤";s:2:"";s:3:"♠";s:2:"";s:3:"♡";s:2:"";s:3:"♥";s:2:"";s:3:"♧";s:2:"";s:3:"♣";s:2:"";s:3:"⊙";s:2:"";s:3:"◈";s:2:"";s:3:"▣";s:2:"";s:3:"◐";s:2:"";s:3:"◑";s:2:"";s:3:"▒";s:2:"";s:3:"▤";s:2:"";s:3:"▥";s:2:"";s:3:"▨";s:2:"";s:3:"▧";s:2:"";s:3:"▦";s:2:"";s:3:"▩";s:2:"";s:3:"♨";s:2:"";s:3:"☏";s:2:"";s:3:"☎";s:2:"";s:3:"☜";s:2:"";s:3:"☞";s:2:"";s:2:"¶";s:2:"";s:3:"†";s:2:"";s:3:"‡";s:2:"";s:3:"↕";s:2:"";s:3:"↗";s:2:"";s:3:"↙";s:2:"";s:3:"↖";s:2:"";s:3:"↘";s:2:"";s:3:"♭";s:2:"";s:3:"♩";s:2:"";s:3:"♪";s:2:"";s:3:"♬";s:2:"";s:3:"㉿";s:2:"";s:3:"㈜";s:2:"";s:3:"№";s:2:"";s:3:"㏇";s:2:"";s:3:"™";s:2:"";s:3:"㏂";s:2:"";s:3:"㏘";s:2:"";s:3:"℡";s:2:"";s:3:"€";s:2:"";s:2:"®";s:2:"A";s:3:"쥱";s:2:"B";s:3:"쥲";s:2:"C";s:3:"쥳";s:2:"D";s:3:"쥵";s:2:"E";s:3:"쥶";s:2:"F";s:3:"쥷";s:2:"G";s:3:"쥸";s:2:"H";s:3:"쥹";s:2:"I";s:3:"쥺";s:2:"J";s:3:"쥻";s:2:"K";s:3:"쥽";s:2:"L";s:3:"쥾";s:2:"M";s:3:"쥿";s:2:"N";s:3:"즀";s:2:"O";s:3:"즁";s:2:"P";s:3:"즂";s:2:"Q";s:3:"즃";s:2:"R";s:3:"즄";s:2:"S";s:3:"즅";s:2:"T";s:3:"즆";s:2:"U";s:3:"즇";s:2:"V";s:3:"즊";s:2:"W";s:3:"즋";s:2:"X";s:3:"즍";s:2:"Y";s:3:"즎";s:2:"Z";s:3:"즏";s:2:"a";s:3:"즑";s:2:"b";s:3:"즒";s:2:"c";s:3:"즓";s:2:"d";s:3:"즔";s:2:"e";s:3:"즕";s:2:"f";s:3:"즖";s:2:"g";s:3:"즗";s:2:"h";s:3:"즚";s:2:"i";s:3:"즜";s:2:"j";s:3:"즞";s:2:"k";s:3:"즟";s:2:"l";s:3:"즠";s:2:"m";s:3:"즡";s:2:"n";s:3:"즢";s:2:"o";s:3:"즣";s:2:"p";s:3:"즤";s:2:"q";s:3:"즥";s:2:"r";s:3:"즦";s:2:"s";s:3:"즧";s:2:"t";s:3:"즨";s:2:"u";s:3:"즩";s:2:"v";s:3:"즪";s:2:"w";s:3:"즫";s:2:"x";s:3:"즬";s:2:"y";s:3:"즭";s:2:"z";s:3:"즮";s:2:"";s:3:"즯";s:2:"";s:3:"즰";s:2:"";s:3:"즱";s:2:"";s:3:"즲";s:2:"";s:3:"즳";s:2:"";s:3:"즴";s:2:"";s:3:"즵";s:2:"";s:3:"즶";s:2:"";s:3:"즷";s:2:"";s:3:"즸";s:2:"";s:3:"즹";s:2:"";s:3:"즺";s:2:"";s:3:"즻";s:2:"";s:3:"즼";s:2:"";s:3:"즽";s:2:"";s:3:"즾";s:2:"";s:3:"즿";s:2:"";s:3:"짂";s:2:"";s:3:"짃";s:2:"";s:3:"짅";s:2:"";s:3:"짆";s:2:"";s:3:"짉";s:2:"";s:3:"짋";s:2:"";s:3:"짌";s:2:"";s:3:"짍";s:2:"";s:3:"짎";s:2:"";s:3:"짏";s:2:"";s:3:"짒";s:2:"";s:3:"짔";s:2:"";s:3:"짗";s:2:"";s:3:"짘";s:2:"";s:3:"짛";s:2:"";s:3:"！";s:2:"";s:3:"＂";s:2:"";s:3:"＃";s:2:"";s:3:"＄";s:2:"";s:3:"％";s:2:"";s:3:"＆";s:2:"";s:3:"＇";s:2:"";s:3:"（";s:2:"";s:3:"）";s:2:"";s:3:"＊";s:2:"";s:3:"＋";s:2:"";s:3:"，";s:2:"";s:3:"－";s:2:"";s:3:"．";s:2:"";s:3:"／";s:2:"";s:3:"０";s:2:"";s:3:"１";s:2:"";s:3:"２";s:2:"";s:3:"３";s:2:"";s:3:"４";s:2:"";s:3:"５";s:2:"";s:3:"６";s:2:"";s:3:"７";s:2:"";s:3:"８";s:2:"";s:3:"９";s:2:"";s:3:"：";s:2:"";s:3:"；";s:2:"";s:3:"＜";s:2:"";s:3:"＝";s:2:"";s:3:"＞";s:2:"";s:3:"？";s:2:"";s:3:"＠";s:2:"";s:3:"Ａ";s:2:"";s:3:"Ｂ";s:2:"";s:3:"Ｃ";s:2:"";s:3:"Ｄ";s:2:"";s:3:"Ｅ";s:2:"";s:3:"Ｆ";s:2:"";s:3:"Ｇ";s:2:"";s:3:"Ｈ";s:2:"";s:3:"Ｉ";s:2:"";s:3:"Ｊ";s:2:"";s:3:"Ｋ";s:2:"";s:3:"Ｌ";s:2:"";s:3:"Ｍ";s:2:"";s:3:"Ｎ";s:2:"";s:3:"Ｏ";s:2:"";s:3:"Ｐ";s:2:"";s:3:"Ｑ";s:2:"";s:3:"Ｒ";s:2:"";s:3:"Ｓ";s:2:"";s:3:"Ｔ";s:2:"";s:3:"Ｕ";s:2:"";s:3:"Ｖ";s:2:"";s:3:"Ｗ";s:2:"";s:3:"Ｘ";s:2:"";s:3:"Ｙ";s:2:"";s:3:"Ｚ";s:2:"";s:3:"［";s:2:"";s:3:"￦";s:2:"";s:3:"］";s:2:"";s:3:"＾";s:2:"";s:3:"＿";s:2:"";s:3:"｀";s:2:"";s:3:"ａ";s:2:"";s:3:"ｂ";s:2:"";s:3:"ｃ";s:2:"";s:3:"ｄ";s:2:"";s:3:"ｅ";s:2:"";s:3:"ｆ";s:2:"";s:3:"ｇ";s:2:"";s:3:"ｈ";s:2:"";s:3:"ｉ";s:2:"";s:3:"ｊ";s:2:"";s:3:"ｋ";s:2:"";s:3:"ｌ";s:2:"";s:3:"ｍ";s:2:"";s:3:"ｎ";s:2:"";s:3:"ｏ";s:2:"";s:3:"ｐ";s:2:"";s:3:"ｑ";s:2:"";s:3:"ｒ";s:2:"";s:3:"ｓ";s:2:"";s:3:"ｔ";s:2:"";s:3:"ｕ";s:2:"";s:3:"ｖ";s:2:"";s:3:"ｗ";s:2:"";s:3:"ｘ";s:2:"";s:3:"ｙ";s:2:"";s:3:"ｚ";s:2:"";s:3:"｛";s:2:"";s:3:"｜";s:2:"";s:3:"｝";s:2:"";s:3:"￣";s:2:"A";s:3:"짞";s:2:"B";s:3:"짟";s:2:"C";s:3:"짡";s:2:"D";s:3:"짣";s:2:"E";s:3:"짥";s:2:"F";s:3:"짦";s:2:"G";s:3:"짨";s:2:"H";s:3:"짩";s:2:"I";s:3:"짪";s:2:"J";s:3:"짫";s:2:"K";s:3:"짮";s:2:"L";s:3:"짲";s:2:"M";s:3:"짳";s:2:"N";s:3:"짴";s:2:"O";s:3:"짵";s:2:"P";s:3:"짶";s:2:"Q";s:3:"짷";s:2:"R";s:3:"짺";s:2:"S";s:3:"짻";s:2:"T";s:3:"짽";s:2:"U";s:3:"짾";s:2:"V";s:3:"짿";s:2:"W";s:3:"쨁";s:2:"X";s:3:"쨂";s:2:"Y";s:3:"쨃";s:2:"Z";s:3:"쨄";s:2:"a";s:3:"쨅";s:2:"b";s:3:"쨆";s:2:"c";s:3:"쨇";s:2:"d";s:3:"쨊";s:2:"e";s:3:"쨎";s:2:"f";s:3:"쨏";s:2:"g";s:3:"쨐";s:2:"h";s:3:"쨑";s:2:"i";s:3:"쨒";s:2:"j";s:3:"쨓";s:2:"k";s:3:"쨕";s:2:"l";s:3:"쨖";s:2:"m";s:3:"쨗";s:2:"n";s:3:"쨙";s:2:"o";s:3:"쨚";s:2:"p";s:3:"쨛";s:2:"q";s:3:"쨜";s:2:"r";s:3:"쨝";s:2:"s";s:3:"쨞";s:2:"t";s:3:"쨟";s:2:"u";s:3:"쨠";s:2:"v";s:3:"쨡";s:2:"w";s:3:"쨢";s:2:"x";s:3:"쨣";s:2:"y";s:3:"쨤";s:2:"z";s:3:"쨥";s:2:"";s:3:"쨦";s:2:"";s:3:"쨧";s:2:"";s:3:"쨨";s:2:"";s:3:"쨪";s:2:"";s:3:"쨫";s:2:"";s:3:"쨬";s:2:"";s:3:"쨭";s:2:"";s:3:"쨮";s:2:"";s:3:"쨯";s:2:"";s:3:"쨰";s:2:"";s:3:"쨱";s:2:"";s:3:"쨲";s:2:"";s:3:"쨳";s:2:"";s:3:"쨴";s:2:"";s:3:"쨵";s:2:"";s:3:"쨶";s:2:"";s:3:"쨷";s:2:"";s:3:"쨸";s:2:"";s:3:"쨹";s:2:"";s:3:"쨺";s:2:"";s:3:"쨻";s:2:"";s:3:"쨼";s:2:"";s:3:"쨽";s:2:"";s:3:"쨾";s:2:"";s:3:"쨿";s:2:"";s:3:"쩀";s:2:"";s:3:"쩁";s:2:"";s:3:"쩂";s:2:"";s:3:"쩃";s:2:"";s:3:"쩄";s:2:"";s:3:"쩅";s:2:"";s:3:"쩆";s:2:"";s:3:"ㄱ";s:2:"";s:3:"ㄲ";s:2:"";s:3:"ㄳ";s:2:"";s:3:"ㄴ";s:2:"";s:3:"ㄵ";s:2:"";s:3:"ㄶ";s:2:"";s:3:"ㄷ";s:2:"";s:3:"ㄸ";s:2:"";s:3:"ㄹ";s:2:"";s:3:"ㄺ";s:2:"";s:3:"ㄻ";s:2:"";s:3:"ㄼ";s:2:"";s:3:"ㄽ";s:2:"";s:3:"ㄾ";s:2:"";s:3:"ㄿ";s:2:"";s:3:"ㅀ";s:2:"";s:3:"ㅁ";s:2:"";s:3:"ㅂ";s:2:"";s:3:"ㅃ";s:2:"";s:3:"ㅄ";s:2:"";s:3:"ㅅ";s:2:"";s:3:"ㅆ";s:2:"";s:3:"ㅇ";s:2:"";s:3:"ㅈ";s:2:"";s:3:"ㅉ";s:2:"";s:3:"ㅊ";s:2:"";s:3:"ㅋ";s:2:"";s:3:"ㅌ";s:2:"";s:3:"ㅍ";s:2:"";s:3:"ㅎ";s:2:"";s:3:"ㅏ";s:2:"";s:3:"ㅐ";s:2:"";s:3:"ㅑ";s:2:"";s:3:"ㅒ";s:2:"";s:3:"ㅓ";s:2:"";s:3:"ㅔ";s:2:"";s:3:"ㅕ";s:2:"";s:3:"ㅖ";s:2:"";s:3:"ㅗ";s:2:"";s:3:"ㅘ";s:2:"";s:3:"ㅙ";s:2:"";s:3:"ㅚ";s:2:"";s:3:"ㅛ";s:2:"";s:3:"ㅜ";s:2:"";s:3:"ㅝ";s:2:"";s:3:"ㅞ";s:2:"";s:3:"ㅟ";s:2:"";s:3:"ㅠ";s:2:"";s:3:"ㅡ";s:2:"";s:3:"ㅢ";s:2:"";s:3:"ㅣ";s:2:"";s:3:"ㅤ";s:2:"";s:3:"ㅥ";s:2:"";s:3:"ㅦ";s:2:"";s:3:"ㅧ";s:2:"";s:3:"ㅨ";s:2:"";s:3:"ㅩ";s:2:"";s:3:"ㅪ";s:2:"";s:3:"ㅫ";s:2:"";s:3:"ㅬ";s:2:"";s:3:"ㅭ";s:2:"";s:3:"ㅮ";s:2:"";s:3:"ㅯ";s:2:"";s:3:"ㅰ";s:2:"";s:3:"ㅱ";s:2:"";s:3:"ㅲ";s:2:"";s:3:"ㅳ";s:2:"";s:3:"ㅴ";s:2:"";s:3:"ㅵ";s:2:"";s:3:"ㅶ";s:2:"";s:3:"ㅷ";s:2:"";s:3:"ㅸ";s:2:"";s:3:"ㅹ";s:2:"";s:3:"ㅺ";s:2:"";s:3:"ㅻ";s:2:"";s:3:"ㅼ";s:2:"";s:3:"ㅽ";s:2:"";s:3:"ㅾ";s:2:"";s:3:"ㅿ";s:2:"";s:3:"ㆀ";s:2:"";s:3:"ㆁ";s:2:"";s:3:"ㆂ";s:2:"";s:3:"ㆃ";s:2:"";s:3:"ㆄ";s:2:"";s:3:"ㆅ";s:2:"";s:3:"ㆆ";s:2:"";s:3:"ㆇ";s:2:"";s:3:"ㆈ";s:2:"";s:3:"ㆉ";s:2:"";s:3:"ㆊ";s:2:"";s:3:"ㆋ";s:2:"";s:3:"ㆌ";s:2:"";s:3:"ㆍ";s:2:"";s:3:"ㆎ";s:2:"A";s:3:"쩇";s:2:"B";s:3:"쩈";s:2:"C";s:3:"쩉";s:2:"D";s:3:"쩊";s:2:"E";s:3:"쩋";s:2:"F";s:3:"쩎";s:2:"G";s:3:"쩏";s:2:"H";s:3:"쩑";s:2:"I";s:3:"쩒";s:2:"J";s:3:"쩓";s:2:"K";s:3:"쩕";s:2:"L";s:3:"쩖";s:2:"M";s:3:"쩗";s:2:"N";s:3:"쩘";s:2:"O";s:3:"쩙";s:2:"P";s:3:"쩚";s:2:"Q";s:3:"쩛";s:2:"R";s:3:"쩞";s:2:"S";s:3:"쩢";s:2:"T";s:3:"쩣";s:2:"U";s:3:"쩤";s:2:"V";s:3:"쩥";s:2:"W";s:3:"쩦";s:2:"X";s:3:"쩧";s:2:"Y";s:3:"쩩";s:2:"Z";s:3:"쩪";s:2:"a";s:3:"쩫";s:2:"b";s:3:"쩬";s:2:"c";s:3:"쩭";s:2:"d";s:3:"쩮";s:2:"e";s:3:"쩯";s:2:"f";s:3:"쩰";s:2:"g";s:3:"쩱";s:2:"h";s:3:"쩲";s:2:"i";s:3:"쩳";s:2:"j";s:3:"쩴";s:2:"k";s:3:"쩵";s:2:"l";s:3:"쩶";s:2:"m";s:3:"쩷";s:2:"n";s:3:"쩸";s:2:"o";s:3:"쩹";s:2:"p";s:3:"쩺";s:2:"q";s:3:"쩻";s:2:"r";s:3:"쩼";s:2:"s";s:3:"쩾";s:2:"t";s:3:"쩿";s:2:"u";s:3:"쪀";s:2:"v";s:3:"쪁";s:2:"w";s:3:"쪂";s:2:"x";s:3:"쪃";s:2:"y";s:3:"쪅";s:2:"z";s:3:"쪆";s:2:"";s:3:"쪇";s:2:"";s:3:"쪈";s:2:"";s:3:"쪉";s:2:"";s:3:"쪊";s:2:"";s:3:"쪋";s:2:"";s:3:"쪌";s:2:"";s:3:"쪍";s:2:"";s:3:"쪎";s:2:"";s:3:"쪏";s:2:"";s:3:"쪐";s:2:"";s:3:"쪑";s:2:"";s:3:"쪒";s:2:"";s:3:"쪓";s:2:"";s:3:"쪔";s:2:"";s:3:"쪕";s:2:"";s:3:"쪖";s:2:"";s:3:"쪗";s:2:"";s:3:"쪙";s:2:"";s:3:"쪚";s:2:"";s:3:"쪛";s:2:"";s:3:"쪜";s:2:"";s:3:"쪝";s:2:"";s:3:"쪞";s:2:"";s:3:"쪟";s:2:"";s:3:"쪠";s:2:"";s:3:"쪡";s:2:"";s:3:"쪢";s:2:"";s:3:"쪣";s:2:"";s:3:"쪤";s:2:"";s:3:"쪥";s:2:"";s:3:"쪦";s:2:"";s:3:"쪧";s:2:"";s:3:"ⅰ";s:2:"";s:3:"ⅱ";s:2:"";s:3:"ⅲ";s:2:"";s:3:"ⅳ";s:2:"";s:3:"ⅴ";s:2:"";s:3:"ⅵ";s:2:"";s:3:"ⅶ";s:2:"";s:3:"ⅷ";s:2:"";s:3:"ⅸ";s:2:"";s:3:"ⅹ";s:2:"";s:3:"Ⅰ";s:2:"";s:3:"Ⅱ";s:2:"";s:3:"Ⅲ";s:2:"";s:3:"Ⅳ";s:2:"";s:3:"Ⅴ";s:2:"";s:3:"Ⅵ";s:2:"";s:3:"Ⅶ";s:2:"";s:3:"Ⅷ";s:2:"";s:3:"Ⅸ";s:2:"";s:3:"Ⅹ";s:2:"";s:2:"Α";s:2:"";s:2:"Β";s:2:"";s:2:"Γ";s:2:"";s:2:"Δ";s:2:"";s:2:"Ε";s:2:"";s:2:"Ζ";s:2:"";s:2:"Η";s:2:"";s:2:"Θ";s:2:"";s:2:"Ι";s:2:"";s:2:"Κ";s:2:"";s:2:"Λ";s:2:"";s:2:"Μ";s:2:"";s:2:"Ν";s:2:"";s:2:"Ξ";s:2:"";s:2:"Ο";s:2:"";s:2:"Π";s:2:"";s:2:"Ρ";s:2:"";s:2:"Σ";s:2:"";s:2:"Τ";s:2:"";s:2:"Υ";s:2:"";s:2:"Φ";s:2:"";s:2:"Χ";s:2:"";s:2:"Ψ";s:2:"";s:2:"Ω";s:2:"";s:2:"α";s:2:"";s:2:"β";s:2:"";s:2:"γ";s:2:"";s:2:"δ";s:2:"";s:2:"ε";s:2:"";s:2:"ζ";s:2:"";s:2:"η";s:2:"";s:2:"θ";s:2:"";s:2:"ι";s:2:"";s:2:"κ";s:2:"";s:2:"λ";s:2:"";s:2:"μ";s:2:"";s:2:"ν";s:2:"";s:2:"ξ";s:2:"";s:2:"ο";s:2:"";s:2:"π";s:2:"";s:2:"ρ";s:2:"";s:2:"σ";s:2:"";s:2:"τ";s:2:"";s:2:"υ";s:2:"";s:2:"φ";s:2:"";s:2:"χ";s:2:"";s:2:"ψ";s:2:"";s:2:"ω";s:2:"A";s:3:"쪨";s:2:"B";s:3:"쪩";s:2:"C";s:3:"쪪";s:2:"D";s:3:"쪫";s:2:"E";s:3:"쪬";s:2:"F";s:3:"쪭";s:2:"G";s:3:"쪮";s:2:"H";s:3:"쪯";s:2:"I";s:3:"쪰";s:2:"J";s:3:"쪱";s:2:"K";s:3:"쪲";s:2:"L";s:3:"쪳";s:2:"M";s:3:"쪴";s:2:"N";s:3:"쪵";s:2:"O";s:3:"쪶";s:2:"P";s:3:"쪷";s:2:"Q";s:3:"쪸";s:2:"R";s:3:"쪹";s:2:"S";s:3:"쪺";s:2:"T";s:3:"쪻";s:2:"U";s:3:"쪾";s:2:"V";s:3:"쪿";s:2:"W";s:3:"쫁";s:2:"X";s:3:"쫂";s:2:"Y";s:3:"쫃";s:2:"Z";s:3:"쫅";s:2:"a";s:3:"쫆";s:2:"b";s:3:"쫇";s:2:"c";s:3:"쫈";s:2:"d";s:3:"쫉";s:2:"e";s:3:"쫊";s:2:"f";s:3:"쫋";s:2:"g";s:3:"쫎";s:2:"h";s:3:"쫐";s:2:"i";s:3:"쫒";s:2:"j";s:3:"쫔";s:2:"k";s:3:"쫕";s:2:"l";s:3:"쫖";s:2:"m";s:3:"쫗";s:2:"n";s:3:"쫚";s:2:"o";s:3:"쫛";s:2:"p";s:3:"쫜";s:2:"q";s:3:"쫝";s:2:"r";s:3:"쫞";s:2:"s";s:3:"쫟";s:2:"t";s:3:"쫡";s:2:"u";s:3:"쫢";s:2:"v";s:3:"쫣";s:2:"w";s:3:"쫤";s:2:"x";s:3:"쫥";s:2:"y";s:3:"쫦";s:2:"z";s:3:"쫧";s:2:"";s:3:"쫨";s:2:"";s:3:"쫩";s:2:"";s:3:"쫪";s:2:"";s:3:"쫫";s:2:"";s:3:"쫭";s:2:"";s:3:"쫮";s:2:"";s:3:"쫯";s:2:"";s:3:"쫰";s:2:"";s:3:"쫱";s:2:"";s:3:"쫲";s:2:"";s:3:"쫳";s:2:"";s:3:"쫵";s:2:"";s:3:"쫶";s:2:"";s:3:"쫷";s:2:"";s:3:"쫸";s:2:"";s:3:"쫹";s:2:"";s:3:"쫺";s:2:"";s:3:"쫻";s:2:"";s:3:"쫼";s:2:"";s:3:"쫽";s:2:"";s:3:"쫾";s:2:"";s:3:"쫿";s:2:"";s:3:"쬀";s:2:"";s:3:"쬁";s:2:"";s:3:"쬂";s:2:"";s:3:"쬃";s:2:"";s:3:"쬄";s:2:"";s:3:"쬅";s:2:"";s:3:"쬆";s:2:"";s:3:"쬇";s:2:"";s:3:"쬉";s:2:"";s:3:"쬊";s:2:"";s:3:"─";s:2:"";s:3:"│";s:2:"";s:3:"┌";s:2:"";s:3:"┐";s:2:"";s:3:"┘";s:2:"";s:3:"└";s:2:"";s:3:"├";s:2:"";s:3:"┬";s:2:"";s:3:"┤";s:2:"";s:3:"┴";s:2:"";s:3:"┼";s:2:"";s:3:"━";s:2:"";s:3:"┃";s:2:"";s:3:"┏";s:2:"";s:3:"┓";s:2:"";s:3:"┛";s:2:"";s:3:"┗";s:2:"";s:3:"┣";s:2:"";s:3:"┳";s:2:"";s:3:"┫";s:2:"";s:3:"┻";s:2:"";s:3:"╋";s:2:"";s:3:"┠";s:2:"";s:3:"┯";s:2:"";s:3:"┨";s:2:"";s:3:"┷";s:2:"";s:3:"┿";s:2:"";s:3:"┝";s:2:"";s:3:"┰";s:2:"";s:3:"┥";s:2:"";s:3:"┸";s:2:"";s:3:"╂";s:2:"";s:3:"┒";s:2:"";s:3:"┑";s:2:"";s:3:"┚";s:2:"";s:3:"┙";s:2:"";s:3:"┖";s:2:"";s:3:"┕";s:2:"";s:3:"┎";s:2:"";s:3:"┍";s:2:"";s:3:"┞";s:2:"";s:3:"┟";s:2:"";s:3:"┡";s:2:"";s:3:"┢";s:2:"";s:3:"┦";s:2:"";s:3:"┧";s:2:"";s:3:"┩";s:2:"";s:3:"┪";s:2:"";s:3:"┭";s:2:"";s:3:"┮";s:2:"";s:3:"┱";s:2:"";s:3:"┲";s:2:"";s:3:"┵";s:2:"";s:3:"┶";s:2:"";s:3:"┹";s:2:"";s:3:"┺";s:2:"";s:3:"┽";s:2:"";s:3:"┾";s:2:"";s:3:"╀";s:2:"";s:3:"╁";s:2:"";s:3:"╃";s:2:"";s:3:"╄";s:2:"";s:3:"╅";s:2:"";s:3:"╆";s:2:"";s:3:"╇";s:2:"";s:3:"╈";s:2:"";s:3:"╉";s:2:"";s:3:"╊";s:2:"A";s:3:"쬋";s:2:"B";s:3:"쬌";s:2:"C";s:3:"쬍";s:2:"D";s:3:"쬎";s:2:"E";s:3:"쬏";s:2:"F";s:3:"쬑";s:2:"G";s:3:"쬒";s:2:"H";s:3:"쬓";s:2:"I";s:3:"쬕";s:2:"J";s:3:"쬖";s:2:"K";s:3:"쬗";s:2:"L";s:3:"쬙";s:2:"M";s:3:"쬚";s:2:"N";s:3:"쬛";s:2:"O";s:3:"쬜";s:2:"P";s:3:"쬝";s:2:"Q";s:3:"쬞";s:2:"R";s:3:"쬟";s:2:"S";s:3:"쬢";s:2:"T";s:3:"쬣";s:2:"U";s:3:"쬤";s:2:"V";s:3:"쬥";s:2:"W";s:3:"쬦";s:2:"X";s:3:"쬧";s:2:"Y";s:3:"쬨";s:2:"Z";s:3:"쬩";s:2:"a";s:3:"쬪";s:2:"b";s:3:"쬫";s:2:"c";s:3:"쬬";s:2:"d";s:3:"쬭";s:2:"e";s:3:"쬮";s:2:"f";s:3:"쬯";s:2:"g";s:3:"쬰";s:2:"h";s:3:"쬱";s:2:"i";s:3:"쬲";s:2:"j";s:3:"쬳";s:2:"k";s:3:"쬴";s:2:"l";s:3:"쬵";s:2:"m";s:3:"쬶";s:2:"n";s:3:"쬷";s:2:"o";s:3:"쬸";s:2:"p";s:3:"쬹";s:2:"q";s:3:"쬺";s:2:"r";s:3:"쬻";s:2:"s";s:3:"쬼";s:2:"t";s:3:"쬽";s:2:"u";s:3:"쬾";s:2:"v";s:3:"쬿";s:2:"w";s:3:"쭀";s:2:"x";s:3:"쭂";s:2:"y";s:3:"쭃";s:2:"z";s:3:"쭄";s:2:"";s:3:"쭅";s:2:"";s:3:"쭆";s:2:"";s:3:"쭇";s:2:"";s:3:"쭊";s:2:"";s:3:"쭋";s:2:"";s:3:"쭍";s:2:"";s:3:"쭎";s:2:"";s:3:"쭏";s:2:"";s:3:"쭑";s:2:"";s:3:"쭒";s:2:"";s:3:"쭓";s:2:"";s:3:"쭔";s:2:"";s:3:"쭕";s:2:"";s:3:"쭖";s:2:"";s:3:"쭗";s:2:"";s:3:"쭚";s:2:"";s:3:"쭛";s:2:"";s:3:"쭜";s:2:"";s:3:"쭞";s:2:"";s:3:"쭟";s:2:"";s:3:"쭠";s:2:"";s:3:"쭡";s:2:"";s:3:"쭢";s:2:"";s:3:"쭣";s:2:"";s:3:"쭥";s:2:"";s:3:"쭦";s:2:"";s:3:"쭧";s:2:"";s:3:"쭨";s:2:"";s:3:"쭩";s:2:"";s:3:"쭪";s:2:"";s:3:"쭫";s:2:"";s:3:"쭬";s:2:"";s:3:"㎕";s:2:"";s:3:"㎖";s:2:"";s:3:"㎗";s:2:"";s:3:"ℓ";s:2:"";s:3:"㎘";s:2:"";s:3:"㏄";s:2:"";s:3:"㎣";s:2:"";s:3:"㎤";s:2:"";s:3:"㎥";s:2:"";s:3:"㎦";s:2:"";s:3:"㎙";s:2:"";s:3:"㎚";s:2:"";s:3:"㎛";s:2:"";s:3:"㎜";s:2:"";s:3:"㎝";s:2:"";s:3:"㎞";s:2:"";s:3:"㎟";s:2:"";s:3:"㎠";s:2:"";s:3:"㎡";s:2:"";s:3:"㎢";s:2:"";s:3:"㏊";s:2:"";s:3:"㎍";s:2:"";s:3:"㎎";s:2:"";s:3:"㎏";s:2:"";s:3:"㏏";s:2:"";s:3:"㎈";s:2:"";s:3:"㎉";s:2:"";s:3:"㏈";s:2:"";s:3:"㎧";s:2:"";s:3:"㎨";s:2:"";s:3:"㎰";s:2:"";s:3:"㎱";s:2:"";s:3:"㎲";s:2:"";s:3:"㎳";s:2:"";s:3:"㎴";s:2:"";s:3:"㎵";s:2:"";s:3:"㎶";s:2:"";s:3:"㎷";s:2:"";s:3:"㎸";s:2:"";s:3:"㎹";s:2:"";s:3:"㎀";s:2:"";s:3:"㎁";s:2:"";s:3:"㎂";s:2:"";s:3:"㎃";s:2:"";s:3:"㎄";s:2:"";s:3:"㎺";s:2:"";s:3:"㎻";s:2:"";s:3:"㎼";s:2:"";s:3:"㎽";s:2:"";s:3:"㎾";s:2:"";s:3:"㎿";s:2:"";s:3:"㎐";s:2:"";s:3:"㎑";s:2:"";s:3:"㎒";s:2:"";s:3:"㎓";s:2:"";s:3:"㎔";s:2:"";s:3:"Ω";s:2:"";s:3:"㏀";s:2:"";s:3:"㏁";s:2:"";s:3:"㎊";s:2:"";s:3:"㎋";s:2:"";s:3:"㎌";s:2:"";s:3:"㏖";s:2:"";s:3:"㏅";s:2:"";s:3:"㎭";s:2:"";s:3:"㎮";s:2:"";s:3:"㎯";s:2:"";s:3:"㏛";s:2:"";s:3:"㎩";s:2:"";s:3:"㎪";s:2:"";s:3:"㎫";s:2:"";s:3:"㎬";s:2:"";s:3:"㏝";s:2:"";s:3:"㏐";s:2:"";s:3:"㏓";s:2:"";s:3:"㏃";s:2:"";s:3:"㏉";s:2:"";s:3:"㏜";s:2:"";s:3:"㏆";s:2:"A";s:3:"쭭";s:2:"B";s:3:"쭮";s:2:"C";s:3:"쭯";s:2:"D";s:3:"쭰";s:2:"E";s:3:"쭱";s:2:"F";s:3:"쭲";s:2:"G";s:3:"쭳";s:2:"H";s:3:"쭴";s:2:"I";s:3:"쭵";s:2:"J";s:3:"쭶";s:2:"K";s:3:"쭷";s:2:"L";s:3:"쭺";s:2:"M";s:3:"쭻";s:2:"N";s:3:"쭼";s:2:"O";s:3:"쭽";s:2:"P";s:3:"쭾";s:2:"Q";s:3:"쭿";s:2:"R";s:3:"쮀";s:2:"S";s:3:"쮁";s:2:"T";s:3:"쮂";s:2:"U";s:3:"쮃";s:2:"V";s:3:"쮄";s:2:"W";s:3:"쮅";s:2:"X";s:3:"쮆";s:2:"Y";s:3:"쮇";s:2:"Z";s:3:"쮈";s:2:"a";s:3:"쮉";s:2:"b";s:3:"쮊";s:2:"c";s:3:"쮋";s:2:"d";s:3:"쮌";s:2:"e";s:3:"쮍";s:2:"f";s:3:"쮎";s:2:"g";s:3:"쮏";s:2:"h";s:3:"쮐";s:2:"i";s:3:"쮑";s:2:"j";s:3:"쮒";s:2:"k";s:3:"쮓";s:2:"l";s:3:"쮔";s:2:"m";s:3:"쮕";s:2:"n";s:3:"쮖";s:2:"o";s:3:"쮗";s:2:"p";s:3:"쮘";s:2:"q";s:3:"쮙";s:2:"r";s:3:"쮚";s:2:"s";s:3:"쮛";s:2:"t";s:3:"쮝";s:2:"u";s:3:"쮞";s:2:"v";s:3:"쮟";s:2:"w";s:3:"쮠";s:2:"x";s:3:"쮡";s:2:"y";s:3:"쮢";s:2:"z";s:3:"쮣";s:2:"";s:3:"쮤";s:2:"";s:3:"쮥";s:2:"";s:3:"쮦";s:2:"";s:3:"쮧";s:2:"";s:3:"쮨";s:2:"";s:3:"쮩";s:2:"";s:3:"쮪";s:2:"";s:3:"쮫";s:2:"";s:3:"쮬";s:2:"";s:3:"쮭";s:2:"";s:3:"쮮";s:2:"";s:3:"쮯";s:2:"";s:3:"쮰";s:2:"";s:3:"쮱";s:2:"";s:3:"쮲";s:2:"";s:3:"쮳";s:2:"";s:3:"쮴";s:2:"";s:3:"쮵";s:2:"";s:3:"쮶";s:2:"";s:3:"쮷";s:2:"";s:3:"쮹";s:2:"";s:3:"쮺";s:2:"";s:3:"쮻";s:2:"";s:3:"쮼";s:2:"";s:3:"쮽";s:2:"";s:3:"쮾";s:2:"";s:3:"쮿";s:2:"";s:3:"쯀";s:2:"";s:3:"쯁";s:2:"";s:3:"쯂";s:2:"";s:3:"쯃";s:2:"";s:3:"쯄";s:2:"";s:2:"Æ";s:2:"";s:2:"Ð";s:2:"";s:2:"ª";s:2:"";s:2:"Ħ";s:2:"";s:2:"Ĳ";s:2:"";s:2:"Ŀ";s:2:"";s:2:"Ł";s:2:"";s:2:"Ø";s:2:"";s:2:"Œ";s:2:"";s:2:"º";s:2:"";s:2:"Þ";s:2:"";s:2:"Ŧ";s:2:"";s:2:"Ŋ";s:2:"";s:3:"㉠";s:2:"";s:3:"㉡";s:2:"";s:3:"㉢";s:2:"";s:3:"㉣";s:2:"";s:3:"㉤";s:2:"";s:3:"㉥";s:2:"";s:3:"㉦";s:2:"";s:3:"㉧";s:2:"";s:3:"㉨";s:2:"";s:3:"㉩";s:2:"";s:3:"㉪";s:2:"";s:3:"㉫";s:2:"";s:3:"㉬";s:2:"";s:3:"㉭";s:2:"";s:3:"㉮";s:2:"";s:3:"㉯";s:2:"";s:3:"㉰";s:2:"";s:3:"㉱";s:2:"";s:3:"㉲";s:2:"";s:3:"㉳";s:2:"";s:3:"㉴";s:2:"";s:3:"㉵";s:2:"";s:3:"㉶";s:2:"";s:3:"㉷";s:2:"";s:3:"㉸";s:2:"";s:3:"㉹";s:2:"";s:3:"㉺";s:2:"";s:3:"㉻";s:2:"";s:3:"ⓐ";s:2:"";s:3:"ⓑ";s:2:"";s:3:"ⓒ";s:2:"";s:3:"ⓓ";s:2:"";s:3:"ⓔ";s:2:"";s:3:"ⓕ";s:2:"";s:3:"ⓖ";s:2:"";s:3:"ⓗ";s:2:"";s:3:"ⓘ";s:2:"";s:3:"ⓙ";s:2:"";s:3:"ⓚ";s:2:"";s:3:"ⓛ";s:2:"";s:3:"ⓜ";s:2:"";s:3:"ⓝ";s:2:"";s:3:"ⓞ";s:2:"";s:3:"ⓟ";s:2:"";s:3:"ⓠ";s:2:"";s:3:"ⓡ";s:2:"";s:3:"ⓢ";s:2:"";s:3:"ⓣ";s:2:"";s:3:"ⓤ";s:2:"";s:3:"ⓥ";s:2:"";s:3:"ⓦ";s:2:"";s:3:"ⓧ";s:2:"";s:3:"ⓨ";s:2:"";s:3:"ⓩ";s:2:"";s:3:"①";s:2:"";s:3:"②";s:2:"";s:3:"③";s:2:"";s:3:"④";s:2:"";s:3:"⑤";s:2:"";s:3:"⑥";s:2:"";s:3:"⑦";s:2:"";s:3:"⑧";s:2:"";s:3:"⑨";s:2:"";s:3:"⑩";s:2:"";s:3:"⑪";s:2:"";s:3:"⑫";s:2:"";s:3:"⑬";s:2:"";s:3:"⑭";s:2:"";s:3:"⑮";s:2:"";s:2:"½";s:2:"";s:3:"⅓";s:2:"";s:3:"⅔";s:2:"";s:2:"¼";s:2:"";s:2:"¾";s:2:"";s:3:"⅛";s:2:"";s:3:"⅜";s:2:"";s:3:"⅝";s:2:"";s:3:"⅞";s:2:"A";s:3:"쯅";s:2:"B";s:3:"쯆";s:2:"C";s:3:"쯇";s:2:"D";s:3:"쯈";s:2:"E";s:3:"쯉";s:2:"F";s:3:"쯊";s:2:"G";s:3:"쯋";s:2:"H";s:3:"쯌";s:2:"I";s:3:"쯍";s:2:"J";s:3:"쯎";s:2:"K";s:3:"쯏";s:2:"L";s:3:"쯐";s:2:"M";s:3:"쯑";s:2:"N";s:3:"쯒";s:2:"O";s:3:"쯓";s:2:"P";s:3:"쯕";s:2:"Q";s:3:"쯖";s:2:"R";s:3:"쯗";s:2:"S";s:3:"쯘";s:2:"T";s:3:"쯙";s:2:"U";s:3:"쯚";s:2:"V";s:3:"쯛";s:2:"W";s:3:"쯜";s:2:"X";s:3:"쯝";s:2:"Y";s:3:"쯞";s:2:"Z";s:3:"쯟";s:2:"a";s:3:"쯠";s:2:"b";s:3:"쯡";s:2:"c";s:3:"쯢";s:2:"d";s:3:"쯣";s:2:"e";s:3:"쯥";s:2:"f";s:3:"쯦";s:2:"g";s:3:"쯨";s:2:"h";s:3:"쯪";s:2:"i";s:3:"쯫";s:2:"j";s:3:"쯬";s:2:"k";s:3:"쯭";s:2:"l";s:3:"쯮";s:2:"m";s:3:"쯯";s:2:"n";s:3:"쯰";s:2:"o";s:3:"쯱";s:2:"p";s:3:"쯲";s:2:"q";s:3:"쯳";s:2:"r";s:3:"쯴";s:2:"s";s:3:"쯵";s:2:"t";s:3:"쯶";s:2:"u";s:3:"쯷";s:2:"v";s:3:"쯸";s:2:"w";s:3:"쯹";s:2:"x";s:3:"쯺";s:2:"y";s:3:"쯻";s:2:"z";s:3:"쯼";s:2:"";s:3:"쯽";s:2:"";s:3:"쯾";s:2:"";s:3:"쯿";s:2:"";s:3:"찀";s:2:"";s:3:"찁";s:2:"";s:3:"찂";s:2:"";s:3:"찃";s:2:"";s:3:"찄";s:2:"";s:3:"찅";s:2:"";s:3:"찆";s:2:"";s:3:"찇";s:2:"";s:3:"찈";s:2:"";s:3:"찉";s:2:"";s:3:"찊";s:2:"";s:3:"찋";s:2:"";s:3:"찎";s:2:"";s:3:"찏";s:2:"";s:3:"찑";s:2:"";s:3:"찒";s:2:"";s:3:"찓";s:2:"";s:3:"찕";s:2:"";s:3:"찖";s:2:"";s:3:"찗";s:2:"";s:3:"찘";s:2:"";s:3:"찙";s:2:"";s:3:"찚";s:2:"";s:3:"찛";s:2:"";s:3:"찞";s:2:"";s:3:"찟";s:2:"";s:3:"찠";s:2:"";s:3:"찣";s:2:"";s:3:"찤";s:2:"";s:2:"æ";s:2:"";s:2:"đ";s:2:"";s:2:"ð";s:2:"";s:2:"ħ";s:2:"";s:2:"ı";s:2:"";s:2:"ĳ";s:2:"";s:2:"ĸ";s:2:"";s:2:"ŀ";s:2:"";s:2:"ł";s:2:"";s:2:"ø";s:2:"";s:2:"œ";s:2:"";s:2:"ß";s:2:"";s:2:"þ";s:2:"";s:2:"ŧ";s:2:"";s:2:"ŋ";s:2:"";s:2:"ŉ";s:2:"";s:3:"㈀";s:2:"";s:3:"㈁";s:2:"";s:3:"㈂";s:2:"";s:3:"㈃";s:2:"";s:3:"㈄";s:2:"";s:3:"㈅";s:2:"";s:3:"㈆";s:2:"";s:3:"㈇";s:2:"";s:3:"㈈";s:2:"";s:3:"㈉";s:2:"";s:3:"㈊";s:2:"";s:3:"㈋";s:2:"";s:3:"㈌";s:2:"";s:3:"㈍";s:2:"";s:3:"㈎";s:2:"";s:3:"㈏";s:2:"";s:3:"㈐";s:2:"";s:3:"㈑";s:2:"";s:3:"㈒";s:2:"";s:3:"㈓";s:2:"";s:3:"㈔";s:2:"";s:3:"㈕";s:2:"";s:3:"㈖";s:2:"";s:3:"㈗";s:2:"";s:3:"㈘";s:2:"";s:3:"㈙";s:2:"";s:3:"㈚";s:2:"";s:3:"㈛";s:2:"";s:3:"⒜";s:2:"";s:3:"⒝";s:2:"";s:3:"⒞";s:2:"";s:3:"⒟";s:2:"";s:3:"⒠";s:2:"";s:3:"⒡";s:2:"";s:3:"⒢";s:2:"";s:3:"⒣";s:2:"";s:3:"⒤";s:2:"";s:3:"⒥";s:2:"";s:3:"⒦";s:2:"";s:3:"⒧";s:2:"";s:3:"⒨";s:2:"";s:3:"⒩";s:2:"";s:3:"⒪";s:2:"";s:3:"⒫";s:2:"";s:3:"⒬";s:2:"";s:3:"⒭";s:2:"";s:3:"⒮";s:2:"";s:3:"⒯";s:2:"";s:3:"⒰";s:2:"";s:3:"⒱";s:2:"";s:3:"⒲";s:2:"";s:3:"⒳";s:2:"";s:3:"⒴";s:2:"";s:3:"⒵";s:2:"";s:3:"⑴";s:2:"";s:3:"⑵";s:2:"";s:3:"⑶";s:2:"";s:3:"⑷";s:2:"";s:3:"⑸";s:2:"";s:3:"⑹";s:2:"";s:3:"⑺";s:2:"";s:3:"⑻";s:2:"";s:3:"⑼";s:2:"";s:3:"⑽";s:2:"";s:3:"⑾";s:2:"";s:3:"⑿";s:2:"";s:3:"⒀";s:2:"";s:3:"⒁";s:2:"";s:3:"⒂";s:2:"";s:2:"¹";s:2:"";s:2:"²";s:2:"";s:2:"³";s:2:"";s:3:"⁴";s:2:"";s:3:"ⁿ";s:2:"";s:3:"₁";s:2:"";s:3:"₂";s:2:"";s:3:"₃";s:2:"";s:3:"₄";s:2:"A";s:3:"찥";s:2:"B";s:3:"찦";s:2:"C";s:3:"찪";s:2:"D";s:3:"찫";s:2:"E";s:3:"찭";s:2:"F";s:3:"찯";s:2:"G";s:3:"찱";s:2:"H";s:3:"찲";s:2:"I";s:3:"찳";s:2:"J";s:3:"찴";s:2:"K";s:3:"찵";s:2:"L";s:3:"찶";s:2:"M";s:3:"찷";s:2:"N";s:3:"찺";s:2:"O";s:3:"찿";s:2:"P";s:3:"챀";s:2:"Q";s:3:"챁";s:2:"R";s:3:"챂";s:2:"S";s:3:"챃";s:2:"T";s:3:"챆";s:2:"U";s:3:"챇";s:2:"V";s:3:"챉";s:2:"W";s:3:"챊";s:2:"X";s:3:"챋";s:2:"Y";s:3:"챍";s:2:"Z";s:3:"챎";s:2:"a";s:3:"챏";s:2:"b";s:3:"챐";s:2:"c";s:3:"챑";s:2:"d";s:3:"챒";s:2:"e";s:3:"챓";s:2:"f";s:3:"챖";s:2:"g";s:3:"챚";s:2:"h";s:3:"챛";s:2:"i";s:3:"챜";s:2:"j";s:3:"챝";s:2:"k";s:3:"챞";s:2:"l";s:3:"챟";s:2:"m";s:3:"챡";s:2:"n";s:3:"챢";s:2:"o";s:3:"챣";s:2:"p";s:3:"챥";s:2:"q";s:3:"챧";s:2:"r";s:3:"챩";s:2:"s";s:3:"챪";s:2:"t";s:3:"챫";s:2:"u";s:3:"챬";s:2:"v";s:3:"챭";s:2:"w";s:3:"챮";s:2:"x";s:3:"챯";s:2:"y";s:3:"챱";s:2:"z";s:3:"챲";s:2:"";s:3:"챳";s:2:"";s:3:"챴";s:2:"";s:3:"챶";s:2:"";s:3:"챷";s:2:"";s:3:"챸";s:2:"";s:3:"챹";s:2:"";s:3:"챺";s:2:"";s:3:"챻";s:2:"";s:3:"챼";s:2:"";s:3:"챽";s:2:"";s:3:"챾";s:2:"";s:3:"챿";s:2:"";s:3:"첀";s:2:"";s:3:"첁";s:2:"";s:3:"첂";s:2:"";s:3:"첃";s:2:"";s:3:"첄";s:2:"";s:3:"첅";s:2:"";s:3:"첆";s:2:"";s:3:"첇";s:2:"";s:3:"첈";s:2:"";s:3:"첉";s:2:"";s:3:"첊";s:2:"";s:3:"첋";s:2:"";s:3:"첌";s:2:"";s:3:"첍";s:2:"";s:3:"첎";s:2:"";s:3:"첏";s:2:"";s:3:"첐";s:2:"";s:3:"첑";s:2:"";s:3:"첒";s:2:"";s:3:"첓";s:2:"";s:3:"ぁ";s:2:"";s:3:"あ";s:2:"";s:3:"ぃ";s:2:"";s:3:"い";s:2:"";s:3:"ぅ";s:2:"";s:3:"う";s:2:"";s:3:"ぇ";s:2:"";s:3:"え";s:2:"";s:3:"ぉ";s:2:"";s:3:"お";s:2:"";s:3:"か";s:2:"";s:3:"が";s:2:"";s:3:"き";s:2:"";s:3:"ぎ";s:2:"";s:3:"く";s:2:"";s:3:"ぐ";s:2:"";s:3:"け";s:2:"";s:3:"げ";s:2:"";s:3:"こ";s:2:"";s:3:"ご";s:2:"";s:3:"さ";s:2:"";s:3:"ざ";s:2:"";s:3:"し";s:2:"";s:3:"じ";s:2:"";s:3:"す";s:2:"";s:3:"ず";s:2:"";s:3:"せ";s:2:"";s:3:"ぜ";s:2:"";s:3:"そ";s:2:"";s:3:"ぞ";s:2:"";s:3:"た";s:2:"";s:3:"だ";s:2:"";s:3:"ち";s:2:"";s:3:"ぢ";s:2:"";s:3:"っ";s:2:"";s:3:"つ";s:2:"";s:3:"づ";s:2:"";s:3:"て";s:2:"";s:3:"で";s:2:"";s:3:"と";s:2:"";s:3:"ど";s:2:"";s:3:"な";s:2:"";s:3:"に";s:2:"";s:3:"ぬ";s:2:"";s:3:"ね";s:2:"";s:3:"の";s:2:"";s:3:"は";s:2:"";s:3:"ば";s:2:"";s:3:"ぱ";s:2:"";s:3:"ひ";s:2:"";s:3:"び";s:2:"";s:3:"ぴ";s:2:"";s:3:"ふ";s:2:"";s:3:"ぶ";s:2:"";s:3:"ぷ";s:2:"";s:3:"へ";s:2:"";s:3:"べ";s:2:"";s:3:"ぺ";s:2:"";s:3:"ほ";s:2:"";s:3:"ぼ";s:2:"";s:3:"ぽ";s:2:"";s:3:"ま";s:2:"";s:3:"み";s:2:"";s:3:"む";s:2:"";s:3:"め";s:2:"";s:3:"も";s:2:"";s:3:"ゃ";s:2:"";s:3:"や";s:2:"";s:3:"ゅ";s:2:"";s:3:"ゆ";s:2:"";s:3:"ょ";s:2:"";s:3:"よ";s:2:"";s:3:"ら";s:2:"";s:3:"り";s:2:"";s:3:"る";s:2:"";s:3:"れ";s:2:"";s:3:"ろ";s:2:"";s:3:"ゎ";s:2:"";s:3:"わ";s:2:"";s:3:"ゐ";s:2:"";s:3:"ゑ";s:2:"";s:3:"を";s:2:"";s:3:"ん";s:2:"A";s:3:"첔";s:2:"B";s:3:"첕";s:2:"C";s:3:"첖";s:2:"D";s:3:"첗";s:2:"E";s:3:"첚";s:2:"F";s:3:"첛";s:2:"G";s:3:"첝";s:2:"H";s:3:"첞";s:2:"I";s:3:"첟";s:2:"J";s:3:"첡";s:2:"K";s:3:"첢";s:2:"L";s:3:"첣";s:2:"M";s:3:"첤";s:2:"N";s:3:"첥";s:2:"O";s:3:"첦";s:2:"P";s:3:"첧";s:2:"Q";s:3:"첪";s:2:"R";s:3:"첮";s:2:"S";s:3:"첯";s:2:"T";s:3:"첰";s:2:"U";s:3:"첱";s:2:"V";s:3:"첲";s:2:"W";s:3:"첳";s:2:"X";s:3:"첶";s:2:"Y";s:3:"첷";s:2:"Z";s:3:"첹";s:2:"a";s:3:"첺";s:2:"b";s:3:"첻";s:2:"c";s:3:"첽";s:2:"d";s:3:"첾";s:2:"e";s:3:"첿";s:2:"f";s:3:"쳀";s:2:"g";s:3:"쳁";s:2:"h";s:3:"쳂";s:2:"i";s:3:"쳃";s:2:"j";s:3:"쳆";s:2:"k";s:3:"쳈";s:2:"l";s:3:"쳊";s:2:"m";s:3:"쳋";s:2:"n";s:3:"쳌";s:2:"o";s:3:"쳍";s:2:"p";s:3:"쳎";s:2:"q";s:3:"쳏";s:2:"r";s:3:"쳑";s:2:"s";s:3:"쳒";s:2:"t";s:3:"쳓";s:2:"u";s:3:"쳕";s:2:"v";s:3:"쳖";s:2:"w";s:3:"쳗";s:2:"x";s:3:"쳘";s:2:"y";s:3:"쳙";s:2:"z";s:3:"쳚";s:2:"";s:3:"쳛";s:2:"";s:3:"쳜";s:2:"";s:3:"쳝";s:2:"";s:3:"쳞";s:2:"";s:3:"쳟";s:2:"";s:3:"쳠";s:2:"";s:3:"쳡";s:2:"";s:3:"쳢";s:2:"";s:3:"쳣";s:2:"";s:3:"쳥";s:2:"";s:3:"쳦";s:2:"";s:3:"쳧";s:2:"";s:3:"쳨";s:2:"";s:3:"쳩";s:2:"";s:3:"쳪";s:2:"";s:3:"쳫";s:2:"";s:3:"쳭";s:2:"";s:3:"쳮";s:2:"";s:3:"쳯";s:2:"";s:3:"쳱";s:2:"";s:3:"쳲";s:2:"";s:3:"쳳";s:2:"";s:3:"쳴";s:2:"";s:3:"쳵";s:2:"";s:3:"쳶";s:2:"";s:3:"쳷";s:2:"";s:3:"쳸";s:2:"";s:3:"쳹";s:2:"";s:3:"쳺";s:2:"";s:3:"쳻";s:2:"";s:3:"쳼";s:2:"";s:3:"쳽";s:2:"";s:3:"ァ";s:2:"";s:3:"ア";s:2:"";s:3:"ィ";s:2:"";s:3:"イ";s:2:"";s:3:"ゥ";s:2:"";s:3:"ウ";s:2:"";s:3:"ェ";s:2:"";s:3:"エ";s:2:"";s:3:"ォ";s:2:"";s:3:"オ";s:2:"";s:3:"カ";s:2:"";s:3:"ガ";s:2:"";s:3:"キ";s:2:"";s:3:"ギ";s:2:"";s:3:"ク";s:2:"";s:3:"グ";s:2:"";s:3:"ケ";s:2:"";s:3:"ゲ";s:2:"";s:3:"コ";s:2:"";s:3:"ゴ";s:2:"";s:3:"サ";s:2:"";s:3:"ザ";s:2:"";s:3:"シ";s:2:"";s:3:"ジ";s:2:"";s:3:"ス";s:2:"";s:3:"ズ";s:2:"";s:3:"セ";s:2:"";s:3:"ゼ";s:2:"";s:3:"ソ";s:2:"";s:3:"ゾ";s:2:"";s:3:"タ";s:2:"";s:3:"ダ";s:2:"";s:3:"チ";s:2:"";s:3:"ヂ";s:2:"";s:3:"ッ";s:2:"";s:3:"ツ";s:2:"";s:3:"ヅ";s:2:"";s:3:"テ";s:2:"";s:3:"デ";s:2:"";s:3:"ト";s:2:"";s:3:"ド";s:2:"";s:3:"ナ";s:2:"";s:3:"ニ";s:2:"";s:3:"ヌ";s:2:"";s:3:"ネ";s:2:"";s:3:"ノ";s:2:"";s:3:"ハ";s:2:"";s:3:"バ";s:2:"";s:3:"パ";s:2:"";s:3:"ヒ";s:2:"";s:3:"ビ";s:2:"";s:3:"ピ";s:2:"";s:3:"フ";s:2:"";s:3:"ブ";s:2:"";s:3:"プ";s:2:"";s:3:"ヘ";s:2:"";s:3:"ベ";s:2:"";s:3:"ペ";s:2:"";s:3:"ホ";s:2:"";s:3:"ボ";s:2:"";s:3:"ポ";s:2:"";s:3:"マ";s:2:"";s:3:"ミ";s:2:"";s:3:"ム";s:2:"";s:3:"メ";s:2:"";s:3:"モ";s:2:"";s:3:"ャ";s:2:"";s:3:"ヤ";s:2:"";s:3:"ュ";s:2:"";s:3:"ユ";s:2:"";s:3:"ョ";s:2:"";s:3:"ヨ";s:2:"";s:3:"ラ";s:2:"";s:3:"リ";s:2:"";s:3:"ル";s:2:"";s:3:"レ";s:2:"";s:3:"ロ";s:2:"";s:3:"ヮ";s:2:"";s:3:"ワ";s:2:"";s:3:"ヰ";s:2:"";s:3:"ヱ";s:2:"";s:3:"ヲ";s:2:"";s:3:"ン";s:2:"";s:3:"ヴ";s:2:"";s:3:"ヵ";s:2:"";s:3:"ヶ";s:2:"A";s:3:"쳾";s:2:"B";s:3:"쳿";s:2:"C";s:3:"촀";s:2:"D";s:3:"촂";s:2:"E";s:3:"촃";s:2:"F";s:3:"촄";s:2:"G";s:3:"촅";s:2:"H";s:3:"촆";s:2:"I";s:3:"촇";s:2:"J";s:3:"촊";s:2:"K";s:3:"촋";s:2:"L";s:3:"촍";s:2:"M";s:3:"촎";s:2:"N";s:3:"촏";s:2:"O";s:3:"촑";s:2:"P";s:3:"촒";s:2:"Q";s:3:"촓";s:2:"R";s:3:"촔";s:2:"S";s:3:"촕";s:2:"T";s:3:"촖";s:2:"U";s:3:"촗";s:2:"V";s:3:"촚";s:2:"W";s:3:"촜";s:2:"X";s:3:"촞";s:2:"Y";s:3:"촟";s:2:"Z";s:3:"촠";s:2:"a";s:3:"촡";s:2:"b";s:3:"촢";s:2:"c";s:3:"촣";s:2:"d";s:3:"촥";s:2:"e";s:3:"촦";s:2:"f";s:3:"촧";s:2:"g";s:3:"촩";s:2:"h";s:3:"촪";s:2:"i";s:3:"촫";s:2:"j";s:3:"촭";s:2:"k";s:3:"촮";s:2:"l";s:3:"촯";s:2:"m";s:3:"촰";s:2:"n";s:3:"촱";s:2:"o";s:3:"촲";s:2:"p";s:3:"촳";s:2:"q";s:3:"촴";s:2:"r";s:3:"촵";s:2:"s";s:3:"촶";s:2:"t";s:3:"촷";s:2:"u";s:3:"촸";s:2:"v";s:3:"촺";s:2:"w";s:3:"촻";s:2:"x";s:3:"촼";s:2:"y";s:3:"촽";s:2:"z";s:3:"촾";s:2:"";s:3:"촿";s:2:"";s:3:"쵀";s:2:"";s:3:"쵁";s:2:"";s:3:"쵂";s:2:"";s:3:"쵃";s:2:"";s:3:"쵄";s:2:"";s:3:"쵅";s:2:"";s:3:"쵆";s:2:"";s:3:"쵇";s:2:"";s:3:"쵈";s:2:"";s:3:"쵉";s:2:"";s:3:"쵊";s:2:"";s:3:"쵋";s:2:"";s:3:"쵌";s:2:"";s:3:"쵍";s:2:"";s:3:"쵎";s:2:"";s:3:"쵏";s:2:"";s:3:"쵐";s:2:"";s:3:"쵑";s:2:"";s:3:"쵒";s:2:"";s:3:"쵓";s:2:"";s:3:"쵔";s:2:"";s:3:"쵕";s:2:"";s:3:"쵖";s:2:"";s:3:"쵗";s:2:"";s:3:"쵘";s:2:"";s:3:"쵙";s:2:"";s:3:"쵚";s:2:"";s:3:"쵛";s:2:"";s:3:"쵝";s:2:"";s:3:"쵞";s:2:"";s:3:"쵟";s:2:"";s:2:"А";s:2:"";s:2:"Б";s:2:"";s:2:"В";s:2:"";s:2:"Г";s:2:"";s:2:"Д";s:2:"";s:2:"Е";s:2:"";s:2:"Ё";s:2:"";s:2:"Ж";s:2:"";s:2:"З";s:2:"";s:2:"И";s:2:"";s:2:"Й";s:2:"";s:2:"К";s:2:"";s:2:"Л";s:2:"";s:2:"М";s:2:"";s:2:"Н";s:2:"";s:2:"О";s:2:"";s:2:"П";s:2:"";s:2:"Р";s:2:"";s:2:"С";s:2:"";s:2:"Т";s:2:"";s:2:"У";s:2:"";s:2:"Ф";s:2:"";s:2:"Х";s:2:"";s:2:"Ц";s:2:"";s:2:"Ч";s:2:"";s:2:"Ш";s:2:"";s:2:"Щ";s:2:"";s:2:"Ъ";s:2:"";s:2:"Ы";s:2:"";s:2:"Ь";s:2:"";s:2:"Э";s:2:"";s:2:"Ю";s:2:"";s:2:"Я";s:2:"";s:2:"а";s:2:"";s:2:"б";s:2:"";s:2:"в";s:2:"";s:2:"г";s:2:"";s:2:"д";s:2:"";s:2:"е";s:2:"";s:2:"ё";s:2:"";s:2:"ж";s:2:"";s:2:"з";s:2:"";s:2:"и";s:2:"";s:2:"й";s:2:"";s:2:"к";s:2:"";s:2:"л";s:2:"";s:2:"м";s:2:"";s:2:"н";s:2:"";s:2:"о";s:2:"";s:2:"п";s:2:"";s:2:"р";s:2:"";s:2:"с";s:2:"";s:2:"т";s:2:"";s:2:"у";s:2:"";s:2:"ф";s:2:"";s:2:"х";s:2:"";s:2:"ц";s:2:"";s:2:"ч";s:2:"";s:2:"ш";s:2:"";s:2:"щ";s:2:"";s:2:"ъ";s:2:"";s:2:"ы";s:2:"";s:2:"ь";s:2:"";s:2:"э";s:2:"";s:2:"ю";s:2:"";s:2:"я";s:2:"A";s:3:"쵡";s:2:"B";s:3:"쵢";s:2:"C";s:3:"쵣";s:2:"D";s:3:"쵥";s:2:"E";s:3:"쵦";s:2:"F";s:3:"쵧";s:2:"G";s:3:"쵨";s:2:"H";s:3:"쵩";s:2:"I";s:3:"쵪";s:2:"J";s:3:"쵫";s:2:"K";s:3:"쵮";s:2:"L";s:3:"쵰";s:2:"M";s:3:"쵲";s:2:"N";s:3:"쵳";s:2:"O";s:3:"쵴";s:2:"P";s:3:"쵵";s:2:"Q";s:3:"쵶";s:2:"R";s:3:"쵷";s:2:"S";s:3:"쵹";s:2:"T";s:3:"쵺";s:2:"U";s:3:"쵻";s:2:"V";s:3:"쵼";s:2:"W";s:3:"쵽";s:2:"X";s:3:"쵾";s:2:"Y";s:3:"쵿";s:2:"Z";s:3:"춀";s:2:"a";s:3:"춁";s:2:"b";s:3:"춂";s:2:"c";s:3:"춃";s:2:"d";s:3:"춄";s:2:"e";s:3:"춅";s:2:"f";s:3:"춆";s:2:"g";s:3:"춇";s:2:"h";s:3:"춉";s:2:"i";s:3:"춊";s:2:"j";s:3:"춋";s:2:"k";s:3:"춌";s:2:"l";s:3:"춍";s:2:"m";s:3:"춎";s:2:"n";s:3:"춏";s:2:"o";s:3:"춐";s:2:"p";s:3:"춑";s:2:"q";s:3:"춒";s:2:"r";s:3:"춓";s:2:"s";s:3:"춖";s:2:"t";s:3:"춗";s:2:"u";s:3:"춙";s:2:"v";s:3:"춚";s:2:"w";s:3:"춛";s:2:"x";s:3:"춝";s:2:"y";s:3:"춞";s:2:"z";s:3:"춟";s:2:"";s:3:"춠";s:2:"";s:3:"춡";s:2:"";s:3:"춢";s:2:"";s:3:"춣";s:2:"";s:3:"춦";s:2:"";s:3:"춨";s:2:"";s:3:"춪";s:2:"";s:3:"춫";s:2:"";s:3:"춬";s:2:"";s:3:"춭";s:2:"";s:3:"춮";s:2:"";s:3:"춯";s:2:"";s:3:"춱";s:2:"";s:3:"춲";s:2:"";s:3:"춳";s:2:"";s:3:"춴";s:2:"";s:3:"춵";s:2:"";s:3:"춶";s:2:"";s:3:"춷";s:2:"";s:3:"춸";s:2:"";s:3:"춹";s:2:"";s:3:"춺";s:2:"";s:3:"춻";s:2:"";s:3:"춼";s:2:"";s:3:"춽";s:2:"";s:3:"춾";s:2:"";s:3:"춿";s:2:"";s:3:"췀";s:2:"";s:3:"췁";s:2:"";s:3:"췂";s:2:"";s:3:"췃";s:2:"";s:3:"췅";s:2:"A";s:3:"췆";s:2:"B";s:3:"췇";s:2:"C";s:3:"췈";s:2:"D";s:3:"췉";s:2:"E";s:3:"췊";s:2:"F";s:3:"췋";s:2:"G";s:3:"췍";s:2:"H";s:3:"췎";s:2:"I";s:3:"췏";s:2:"J";s:3:"췑";s:2:"K";s:3:"췒";s:2:"L";s:3:"췓";s:2:"M";s:3:"췔";s:2:"N";s:3:"췕";s:2:"O";s:3:"췖";s:2:"P";s:3:"췗";s:2:"Q";s:3:"췘";s:2:"R";s:3:"췙";s:2:"S";s:3:"췚";s:2:"T";s:3:"췛";s:2:"U";s:3:"췜";s:2:"V";s:3:"췝";s:2:"W";s:3:"췞";s:2:"X";s:3:"췟";s:2:"Y";s:3:"췠";s:2:"Z";s:3:"췡";s:2:"a";s:3:"췢";s:2:"b";s:3:"췣";s:2:"c";s:3:"췤";s:2:"d";s:3:"췥";s:2:"e";s:3:"췦";s:2:"f";s:3:"췧";s:2:"g";s:3:"췩";s:2:"h";s:3:"췪";s:2:"i";s:3:"췫";s:2:"j";s:3:"췭";s:2:"k";s:3:"췮";s:2:"l";s:3:"췯";s:2:"m";s:3:"췱";s:2:"n";s:3:"췲";s:2:"o";s:3:"췳";s:2:"p";s:3:"췴";s:2:"q";s:3:"췵";s:2:"r";s:3:"췶";s:2:"s";s:3:"췷";s:2:"t";s:3:"췺";s:2:"u";s:3:"췼";s:2:"v";s:3:"췾";s:2:"w";s:3:"췿";s:2:"x";s:3:"츀";s:2:"y";s:3:"츁";s:2:"z";s:3:"츂";s:2:"";s:3:"츃";s:2:"";s:3:"츅";s:2:"";s:3:"츆";s:2:"";s:3:"츇";s:2:"";s:3:"츉";s:2:"";s:3:"츊";s:2:"";s:3:"츋";s:2:"";s:3:"츍";s:2:"";s:3:"츎";s:2:"";s:3:"츏";s:2:"";s:3:"츐";s:2:"";s:3:"츑";s:2:"";s:3:"츒";s:2:"";s:3:"츓";s:2:"";s:3:"츕";s:2:"";s:3:"츖";s:2:"";s:3:"츗";s:2:"";s:3:"츘";s:2:"";s:3:"츚";s:2:"";s:3:"츛";s:2:"";s:3:"츜";s:2:"";s:3:"츝";s:2:"";s:3:"츞";s:2:"";s:3:"츟";s:2:"";s:3:"츢";s:2:"";s:3:"츣";s:2:"";s:3:"츥";s:2:"";s:3:"츦";s:2:"";s:3:"츧";s:2:"";s:3:"츩";s:2:"";s:3:"츪";s:2:"";s:3:"츫";s:2:"A";s:3:"츬";s:2:"B";s:3:"츭";s:2:"C";s:3:"츮";s:2:"D";s:3:"츯";s:2:"E";s:3:"츲";s:2:"F";s:3:"츴";s:2:"G";s:3:"츶";s:2:"H";s:3:"츷";s:2:"I";s:3:"츸";s:2:"J";s:3:"츹";s:2:"K";s:3:"츺";s:2:"L";s:3:"츻";s:2:"M";s:3:"츼";s:2:"N";s:3:"츽";s:2:"O";s:3:"츾";s:2:"P";s:3:"츿";s:2:"Q";s:3:"칀";s:2:"R";s:3:"칁";s:2:"S";s:3:"칂";s:2:"T";s:3:"칃";s:2:"U";s:3:"칄";s:2:"V";s:3:"칅";s:2:"W";s:3:"칆";s:2:"X";s:3:"칇";s:2:"Y";s:3:"칈";s:2:"Z";s:3:"칉";s:2:"a";s:3:"칊";s:2:"b";s:3:"칋";s:2:"c";s:3:"칌";s:2:"d";s:3:"칍";s:2:"e";s:3:"칎";s:2:"f";s:3:"칏";s:2:"g";s:3:"칐";s:2:"h";s:3:"칑";s:2:"i";s:3:"칒";s:2:"j";s:3:"칓";s:2:"k";s:3:"칔";s:2:"l";s:3:"칕";s:2:"m";s:3:"칖";s:2:"n";s:3:"칗";s:2:"o";s:3:"칚";s:2:"p";s:3:"칛";s:2:"q";s:3:"칝";s:2:"r";s:3:"칞";s:2:"s";s:3:"칢";s:2:"t";s:3:"칣";s:2:"u";s:3:"칤";s:2:"v";s:3:"칥";s:2:"w";s:3:"칦";s:2:"x";s:3:"칧";s:2:"y";s:3:"칪";s:2:"z";s:3:"칬";s:2:"";s:3:"칮";s:2:"";s:3:"칯";s:2:"";s:3:"칰";s:2:"";s:3:"칱";s:2:"";s:3:"칲";s:2:"";s:3:"칳";s:2:"";s:3:"칶";s:2:"";s:3:"칷";s:2:"";s:3:"칹";s:2:"";s:3:"칺";s:2:"";s:3:"칻";s:2:"";s:3:"칽";s:2:"";s:3:"칾";s:2:"";s:3:"칿";s:2:"";s:3:"캀";s:2:"";s:3:"캁";s:2:"";s:3:"캂";s:2:"";s:3:"캃";s:2:"";s:3:"캆";s:2:"";s:3:"캈";s:2:"";s:3:"캊";s:2:"";s:3:"캋";s:2:"";s:3:"캌";s:2:"";s:3:"캍";s:2:"";s:3:"캎";s:2:"";s:3:"캏";s:2:"";s:3:"캒";s:2:"";s:3:"캓";s:2:"";s:3:"캕";s:2:"";s:3:"캖";s:2:"";s:3:"캗";s:2:"";s:3:"캙";s:2:"A";s:3:"캚";s:2:"B";s:3:"캛";s:2:"C";s:3:"캜";s:2:"D";s:3:"캝";s:2:"E";s:3:"캞";s:2:"F";s:3:"캟";s:2:"G";s:3:"캢";s:2:"H";s:3:"캦";s:2:"I";s:3:"캧";s:2:"J";s:3:"캨";s:2:"K";s:3:"캩";s:2:"L";s:3:"캪";s:2:"M";s:3:"캫";s:2:"N";s:3:"캮";s:2:"O";s:3:"캯";s:2:"P";s:3:"캰";s:2:"Q";s:3:"캱";s:2:"R";s:3:"캲";s:2:"S";s:3:"캳";s:2:"T";s:3:"캴";s:2:"U";s:3:"캵";s:2:"V";s:3:"캶";s:2:"W";s:3:"캷";s:2:"X";s:3:"캸";s:2:"Y";s:3:"캹";s:2:"Z";s:3:"캺";s:2:"a";s:3:"캻";s:2:"b";s:3:"캼";s:2:"c";s:3:"캽";s:2:"d";s:3:"캾";s:2:"e";s:3:"캿";s:2:"f";s:3:"컀";s:2:"g";s:3:"컂";s:2:"h";s:3:"컃";s:2:"i";s:3:"컄";s:2:"j";s:3:"컅";s:2:"k";s:3:"컆";s:2:"l";s:3:"컇";s:2:"m";s:3:"컈";s:2:"n";s:3:"컉";s:2:"o";s:3:"컊";s:2:"p";s:3:"컋";s:2:"q";s:3:"컌";s:2:"r";s:3:"컍";s:2:"s";s:3:"컎";s:2:"t";s:3:"컏";s:2:"u";s:3:"컐";s:2:"v";s:3:"컑";s:2:"w";s:3:"컒";s:2:"x";s:3:"컓";s:2:"y";s:3:"컔";s:2:"z";s:3:"컕";s:2:"";s:3:"컖";s:2:"";s:3:"컗";s:2:"";s:3:"컘";s:2:"";s:3:"컙";s:2:"";s:3:"컚";s:2:"";s:3:"컛";s:2:"";s:3:"컜";s:2:"";s:3:"컝";s:2:"";s:3:"컞";s:2:"";s:3:"컟";s:2:"";s:3:"컠";s:2:"";s:3:"컡";s:2:"";s:3:"컢";s:2:"";s:3:"컣";s:2:"";s:3:"컦";s:2:"";s:3:"컧";s:2:"";s:3:"컩";s:2:"";s:3:"컪";s:2:"";s:3:"컭";s:2:"";s:3:"컮";s:2:"";s:3:"컯";s:2:"";s:3:"컰";s:2:"";s:3:"컱";s:2:"";s:3:"컲";s:2:"";s:3:"컳";s:2:"";s:3:"컶";s:2:"";s:3:"컺";s:2:"";s:3:"컻";s:2:"";s:3:"컼";s:2:"";s:3:"컽";s:2:"";s:3:"컾";s:2:"";s:3:"컿";s:2:"";s:3:"가";s:2:"";s:3:"각";s:2:"";s:3:"간";s:2:"";s:3:"갇";s:2:"";s:3:"갈";s:2:"";s:3:"갉";s:2:"";s:3:"갊";s:2:"";s:3:"감";s:2:"";s:3:"갑";s:2:"";s:3:"값";s:2:"";s:3:"갓";s:2:"";s:3:"갔";s:2:"";s:3:"강";s:2:"";s:3:"갖";s:2:"";s:3:"갗";s:2:"";s:3:"같";s:2:"";s:3:"갚";s:2:"";s:3:"갛";s:2:"";s:3:"개";s:2:"";s:3:"객";s:2:"";s:3:"갠";s:2:"";s:3:"갤";s:2:"";s:3:"갬";s:2:"";s:3:"갭";s:2:"";s:3:"갯";s:2:"";s:3:"갰";s:2:"";s:3:"갱";s:2:"";s:3:"갸";s:2:"";s:3:"갹";s:2:"";s:3:"갼";s:2:"";s:3:"걀";s:2:"";s:3:"걋";s:2:"";s:3:"걍";s:2:"";s:3:"걔";s:2:"";s:3:"걘";s:2:"";s:3:"걜";s:2:"";s:3:"거";s:2:"";s:3:"걱";s:2:"";s:3:"건";s:2:"";s:3:"걷";s:2:"";s:3:"걸";s:2:"";s:3:"걺";s:2:"";s:3:"검";s:2:"";s:3:"겁";s:2:"";s:3:"것";s:2:"";s:3:"겄";s:2:"";s:3:"겅";s:2:"";s:3:"겆";s:2:"";s:3:"겉";s:2:"";s:3:"겊";s:2:"";s:3:"겋";s:2:"";s:3:"게";s:2:"";s:3:"겐";s:2:"";s:3:"겔";s:2:"";s:3:"겜";s:2:"";s:3:"겝";s:2:"";s:3:"겟";s:2:"";s:3:"겠";s:2:"";s:3:"겡";s:2:"";s:3:"겨";s:2:"";s:3:"격";s:2:"";s:3:"겪";s:2:"";s:3:"견";s:2:"";s:3:"겯";s:2:"";s:3:"결";s:2:"";s:3:"겸";s:2:"";s:3:"겹";s:2:"";s:3:"겻";s:2:"";s:3:"겼";s:2:"";s:3:"경";s:2:"";s:3:"곁";s:2:"";s:3:"계";s:2:"";s:3:"곈";s:2:"";s:3:"곌";s:2:"";s:3:"곕";s:2:"";s:3:"곗";s:2:"";s:3:"고";s:2:"";s:3:"곡";s:2:"";s:3:"곤";s:2:"";s:3:"곧";s:2:"";s:3:"골";s:2:"";s:3:"곪";s:2:"";s:3:"곬";s:2:"";s:3:"곯";s:2:"";s:3:"곰";s:2:"";s:3:"곱";s:2:"";s:3:"곳";s:2:"";s:3:"공";s:2:"";s:3:"곶";s:2:"";s:3:"과";s:2:"";s:3:"곽";s:2:"";s:3:"관";s:2:"";s:3:"괄";s:2:"";s:3:"괆";s:2:"A";s:3:"켂";s:2:"B";s:3:"켃";s:2:"C";s:3:"켅";s:2:"D";s:3:"켆";s:2:"E";s:3:"켇";s:2:"F";s:3:"켉";s:2:"G";s:3:"켊";s:2:"H";s:3:"켋";s:2:"I";s:3:"켌";s:2:"J";s:3:"켍";s:2:"K";s:3:"켎";s:2:"L";s:3:"켏";s:2:"M";s:3:"켒";s:2:"N";s:3:"켔";s:2:"O";s:3:"켖";s:2:"P";s:3:"켗";s:2:"Q";s:3:"켘";s:2:"R";s:3:"켙";s:2:"S";s:3:"켚";s:2:"T";s:3:"켛";s:2:"U";s:3:"켝";s:2:"V";s:3:"켞";s:2:"W";s:3:"켟";s:2:"X";s:3:"켡";s:2:"Y";s:3:"켢";s:2:"Z";s:3:"켣";s:2:"a";s:3:"켥";s:2:"b";s:3:"켦";s:2:"c";s:3:"켧";s:2:"d";s:3:"켨";s:2:"e";s:3:"켩";s:2:"f";s:3:"켪";s:2:"g";s:3:"켫";s:2:"h";s:3:"켮";s:2:"i";s:3:"켲";s:2:"j";s:3:"켳";s:2:"k";s:3:"켴";s:2:"l";s:3:"켵";s:2:"m";s:3:"켶";s:2:"n";s:3:"켷";s:2:"o";s:3:"켹";s:2:"p";s:3:"켺";s:2:"q";s:3:"켻";s:2:"r";s:3:"켼";s:2:"s";s:3:"켽";s:2:"t";s:3:"켾";s:2:"u";s:3:"켿";s:2:"v";s:3:"콀";s:2:"w";s:3:"콁";s:2:"x";s:3:"콂";s:2:"y";s:3:"콃";s:2:"z";s:3:"콄";s:2:"";s:3:"콅";s:2:"";s:3:"콆";s:2:"";s:3:"콇";s:2:"";s:3:"콈";s:2:"";s:3:"콉";s:2:"";s:3:"콊";s:2:"";s:3:"콋";s:2:"";s:3:"콌";s:2:"";s:3:"콍";s:2:"";s:3:"콎";s:2:"";s:3:"콏";s:2:"";s:3:"콐";s:2:"";s:3:"콑";s:2:"";s:3:"콒";s:2:"";s:3:"콓";s:2:"";s:3:"콖";s:2:"";s:3:"콗";s:2:"";s:3:"콙";s:2:"";s:3:"콚";s:2:"";s:3:"콛";s:2:"";s:3:"콝";s:2:"";s:3:"콞";s:2:"";s:3:"콟";s:2:"";s:3:"콠";s:2:"";s:3:"콡";s:2:"";s:3:"콢";s:2:"";s:3:"콣";s:2:"";s:3:"콦";s:2:"";s:3:"콨";s:2:"";s:3:"콪";s:2:"";s:3:"콫";s:2:"";s:3:"콬";s:2:"";s:3:"괌";s:2:"";s:3:"괍";s:2:"";s:3:"괏";s:2:"";s:3:"광";s:2:"";s:3:"괘";s:2:"";s:3:"괜";s:2:"";s:3:"괠";s:2:"";s:3:"괩";s:2:"";s:3:"괬";s:2:"";s:3:"괭";s:2:"";s:3:"괴";s:2:"";s:3:"괵";s:2:"";s:3:"괸";s:2:"";s:3:"괼";s:2:"";s:3:"굄";s:2:"";s:3:"굅";s:2:"";s:3:"굇";s:2:"";s:3:"굉";s:2:"";s:3:"교";s:2:"";s:3:"굔";s:2:"";s:3:"굘";s:2:"";s:3:"굡";s:2:"";s:3:"굣";s:2:"";s:3:"구";s:2:"";s:3:"국";s:2:"";s:3:"군";s:2:"";s:3:"굳";s:2:"";s:3:"굴";s:2:"";s:3:"굵";s:2:"";s:3:"굶";s:2:"";s:3:"굻";s:2:"";s:3:"굼";s:2:"";s:3:"굽";s:2:"";s:3:"굿";s:2:"";s:3:"궁";s:2:"";s:3:"궂";s:2:"";s:3:"궈";s:2:"";s:3:"궉";s:2:"";s:3:"권";s:2:"";s:3:"궐";s:2:"";s:3:"궜";s:2:"";s:3:"궝";s:2:"";s:3:"궤";s:2:"";s:3:"궷";s:2:"";s:3:"귀";s:2:"";s:3:"귁";s:2:"";s:3:"귄";s:2:"";s:3:"귈";s:2:"";s:3:"귐";s:2:"";s:3:"귑";s:2:"";s:3:"귓";s:2:"";s:3:"규";s:2:"";s:3:"균";s:2:"";s:3:"귤";s:2:"";s:3:"그";s:2:"";s:3:"극";s:2:"";s:3:"근";s:2:"";s:3:"귿";s:2:"";s:3:"글";s:2:"";s:3:"긁";s:2:"";s:3:"금";s:2:"";s:3:"급";s:2:"";s:3:"긋";s:2:"";s:3:"긍";s:2:"";s:3:"긔";s:2:"";s:3:"기";s:2:"";s:3:"긱";s:2:"";s:3:"긴";s:2:"";s:3:"긷";s:2:"";s:3:"길";s:2:"";s:3:"긺";s:2:"";s:3:"김";s:2:"";s:3:"깁";s:2:"";s:3:"깃";s:2:"";s:3:"깅";s:2:"";s:3:"깆";s:2:"";s:3:"깊";s:2:"";s:3:"까";s:2:"";s:3:"깍";s:2:"";s:3:"깎";s:2:"";s:3:"깐";s:2:"";s:3:"깔";s:2:"";s:3:"깖";s:2:"";s:3:"깜";s:2:"";s:3:"깝";s:2:"";s:3:"깟";s:2:"";s:3:"깠";s:2:"";s:3:"깡";s:2:"";s:3:"깥";s:2:"";s:3:"깨";s:2:"";s:3:"깩";s:2:"";s:3:"깬";s:2:"";s:3:"깰";s:2:"";s:3:"깸";s:2:"A";s:3:"콭";s:2:"B";s:3:"콮";s:2:"C";s:3:"콯";s:2:"D";s:3:"콲";s:2:"E";s:3:"콳";s:2:"F";s:3:"콵";s:2:"G";s:3:"콶";s:2:"H";s:3:"콷";s:2:"I";s:3:"콹";s:2:"J";s:3:"콺";s:2:"K";s:3:"콻";s:2:"L";s:3:"콼";s:2:"M";s:3:"콽";s:2:"N";s:3:"콾";s:2:"O";s:3:"콿";s:2:"P";s:3:"쾁";s:2:"Q";s:3:"쾂";s:2:"R";s:3:"쾃";s:2:"S";s:3:"쾄";s:2:"T";s:3:"쾆";s:2:"U";s:3:"쾇";s:2:"V";s:3:"쾈";s:2:"W";s:3:"쾉";s:2:"X";s:3:"쾊";s:2:"Y";s:3:"쾋";s:2:"Z";s:3:"쾍";s:2:"a";s:3:"쾎";s:2:"b";s:3:"쾏";s:2:"c";s:3:"쾐";s:2:"d";s:3:"쾑";s:2:"e";s:3:"쾒";s:2:"f";s:3:"쾓";s:2:"g";s:3:"쾔";s:2:"h";s:3:"쾕";s:2:"i";s:3:"쾖";s:2:"j";s:3:"쾗";s:2:"k";s:3:"쾘";s:2:"l";s:3:"쾙";s:2:"m";s:3:"쾚";s:2:"n";s:3:"쾛";s:2:"o";s:3:"쾜";s:2:"p";s:3:"쾝";s:2:"q";s:3:"쾞";s:2:"r";s:3:"쾟";s:2:"s";s:3:"쾠";s:2:"t";s:3:"쾢";s:2:"u";s:3:"쾣";s:2:"v";s:3:"쾤";s:2:"w";s:3:"쾥";s:2:"x";s:3:"쾦";s:2:"y";s:3:"쾧";s:2:"z";s:3:"쾩";s:2:"";s:3:"쾪";s:2:"";s:3:"쾫";s:2:"";s:3:"쾬";s:2:"";s:3:"쾭";s:2:"";s:3:"쾮";s:2:"";s:3:"쾯";s:2:"";s:3:"쾱";s:2:"";s:3:"쾲";s:2:"";s:3:"쾳";s:2:"";s:3:"쾴";s:2:"";s:3:"쾵";s:2:"";s:3:"쾶";s:2:"";s:3:"쾷";s:2:"";s:3:"쾸";s:2:"";s:3:"쾹";s:2:"";s:3:"쾺";s:2:"";s:3:"쾻";s:2:"";s:3:"쾼";s:2:"";s:3:"쾽";s:2:"";s:3:"쾾";s:2:"";s:3:"쾿";s:2:"";s:3:"쿀";s:2:"";s:3:"쿁";s:2:"";s:3:"쿂";s:2:"";s:3:"쿃";s:2:"";s:3:"쿅";s:2:"";s:3:"쿆";s:2:"";s:3:"쿇";s:2:"";s:3:"쿈";s:2:"";s:3:"쿉";s:2:"";s:3:"쿊";s:2:"";s:3:"쿋";s:2:"";s:3:"깹";s:2:"";s:3:"깻";s:2:"";s:3:"깼";s:2:"";s:3:"깽";s:2:"";s:3:"꺄";s:2:"";s:3:"꺅";s:2:"";s:3:"꺌";s:2:"";s:3:"꺼";s:2:"";s:3:"꺽";s:2:"";s:3:"꺾";s:2:"";s:3:"껀";s:2:"";s:3:"껄";s:2:"";s:3:"껌";s:2:"";s:3:"껍";s:2:"";s:3:"껏";s:2:"";s:3:"껐";s:2:"";s:3:"껑";s:2:"";s:3:"께";s:2:"";s:3:"껙";s:2:"";s:3:"껜";s:2:"";s:3:"껨";s:2:"";s:3:"껫";s:2:"";s:3:"껭";s:2:"";s:3:"껴";s:2:"";s:3:"껸";s:2:"";s:3:"껼";s:2:"";s:3:"꼇";s:2:"";s:3:"꼈";s:2:"";s:3:"꼍";s:2:"";s:3:"꼐";s:2:"";s:3:"꼬";s:2:"";s:3:"꼭";s:2:"";s:3:"꼰";s:2:"";s:3:"꼲";s:2:"";s:3:"꼴";s:2:"";s:3:"꼼";s:2:"";s:3:"꼽";s:2:"";s:3:"꼿";s:2:"";s:3:"꽁";s:2:"";s:3:"꽂";s:2:"";s:3:"꽃";s:2:"";s:3:"꽈";s:2:"";s:3:"꽉";s:2:"";s:3:"꽐";s:2:"";s:3:"꽜";s:2:"";s:3:"꽝";s:2:"";s:3:"꽤";s:2:"";s:3:"꽥";s:2:"";s:3:"꽹";s:2:"";s:3:"꾀";s:2:"";s:3:"꾄";s:2:"";s:3:"꾈";s:2:"";s:3:"꾐";s:2:"";s:3:"꾑";s:2:"";s:3:"꾕";s:2:"";s:3:"꾜";s:2:"";s:3:"꾸";s:2:"";s:3:"꾹";s:2:"";s:3:"꾼";s:2:"";s:3:"꿀";s:2:"";s:3:"꿇";s:2:"";s:3:"꿈";s:2:"";s:3:"꿉";s:2:"";s:3:"꿋";s:2:"";s:3:"꿍";s:2:"";s:3:"꿎";s:2:"";s:3:"꿔";s:2:"";s:3:"꿜";s:2:"";s:3:"꿨";s:2:"";s:3:"꿩";s:2:"";s:3:"꿰";s:2:"";s:3:"꿱";s:2:"";s:3:"꿴";s:2:"";s:3:"꿸";s:2:"";s:3:"뀀";s:2:"";s:3:"뀁";s:2:"";s:3:"뀄";s:2:"";s:3:"뀌";s:2:"";s:3:"뀐";s:2:"";s:3:"뀔";s:2:"";s:3:"뀜";s:2:"";s:3:"뀝";s:2:"";s:3:"뀨";s:2:"";s:3:"끄";s:2:"";s:3:"끅";s:2:"";s:3:"끈";s:2:"";s:3:"끊";s:2:"";s:3:"끌";s:2:"";s:3:"끎";s:2:"";s:3:"끓";s:2:"";s:3:"끔";s:2:"";s:3:"끕";s:2:"";s:3:"끗";s:2:"";s:3:"끙";s:2:"A";s:3:"쿌";s:2:"B";s:3:"쿍";s:2:"C";s:3:"쿎";s:2:"D";s:3:"쿏";s:2:"E";s:3:"쿐";s:2:"F";s:3:"쿑";s:2:"G";s:3:"쿒";s:2:"H";s:3:"쿓";s:2:"I";s:3:"쿔";s:2:"J";s:3:"쿕";s:2:"K";s:3:"쿖";s:2:"L";s:3:"쿗";s:2:"M";s:3:"쿘";s:2:"N";s:3:"쿙";s:2:"O";s:3:"쿚";s:2:"P";s:3:"쿛";s:2:"Q";s:3:"쿜";s:2:"R";s:3:"쿝";s:2:"S";s:3:"쿞";s:2:"T";s:3:"쿟";s:2:"U";s:3:"쿢";s:2:"V";s:3:"쿣";s:2:"W";s:3:"쿥";s:2:"X";s:3:"쿦";s:2:"Y";s:3:"쿧";s:2:"Z";s:3:"쿩";s:2:"a";s:3:"쿪";s:2:"b";s:3:"쿫";s:2:"c";s:3:"쿬";s:2:"d";s:3:"쿭";s:2:"e";s:3:"쿮";s:2:"f";s:3:"쿯";s:2:"g";s:3:"쿲";s:2:"h";s:3:"쿴";s:2:"i";s:3:"쿶";s:2:"j";s:3:"쿷";s:2:"k";s:3:"쿸";s:2:"l";s:3:"쿹";s:2:"m";s:3:"쿺";s:2:"n";s:3:"쿻";s:2:"o";s:3:"쿽";s:2:"p";s:3:"쿾";s:2:"q";s:3:"쿿";s:2:"r";s:3:"퀁";s:2:"s";s:3:"퀂";s:2:"t";s:3:"퀃";s:2:"u";s:3:"퀅";s:2:"v";s:3:"퀆";s:2:"w";s:3:"퀇";s:2:"x";s:3:"퀈";s:2:"y";s:3:"퀉";s:2:"z";s:3:"퀊";s:2:"";s:3:"퀋";s:2:"";s:3:"퀌";s:2:"";s:3:"퀍";s:2:"";s:3:"퀎";s:2:"";s:3:"퀏";s:2:"";s:3:"퀐";s:2:"";s:3:"퀒";s:2:"";s:3:"퀓";s:2:"";s:3:"퀔";s:2:"";s:3:"퀕";s:2:"";s:3:"퀖";s:2:"";s:3:"퀗";s:2:"";s:3:"퀙";s:2:"";s:3:"퀚";s:2:"";s:3:"퀛";s:2:"";s:3:"퀜";s:2:"";s:3:"퀝";s:2:"";s:3:"퀞";s:2:"";s:3:"퀟";s:2:"";s:3:"퀠";s:2:"";s:3:"퀡";s:2:"";s:3:"퀢";s:2:"";s:3:"퀣";s:2:"";s:3:"퀤";s:2:"";s:3:"퀥";s:2:"";s:3:"퀦";s:2:"";s:3:"퀧";s:2:"";s:3:"퀨";s:2:"";s:3:"퀩";s:2:"";s:3:"퀪";s:2:"";s:3:"퀫";s:2:"";s:3:"퀬";s:2:"";s:3:"끝";s:2:"";s:3:"끼";s:2:"";s:3:"끽";s:2:"";s:3:"낀";s:2:"";s:3:"낄";s:2:"";s:3:"낌";s:2:"";s:3:"낍";s:2:"";s:3:"낏";s:2:"";s:3:"낑";s:2:"";s:3:"나";s:2:"";s:3:"낙";s:2:"";s:3:"낚";s:2:"";s:3:"난";s:2:"";s:3:"낟";s:2:"";s:3:"날";s:2:"";s:3:"낡";s:2:"";s:3:"낢";s:2:"";s:3:"남";s:2:"";s:3:"납";s:2:"";s:3:"낫";s:2:"";s:3:"났";s:2:"";s:3:"낭";s:2:"";s:3:"낮";s:2:"";s:3:"낯";s:2:"";s:3:"낱";s:2:"";s:3:"낳";s:2:"";s:3:"내";s:2:"";s:3:"낵";s:2:"";s:3:"낸";s:2:"";s:3:"낼";s:2:"";s:3:"냄";s:2:"";s:3:"냅";s:2:"";s:3:"냇";s:2:"";s:3:"냈";s:2:"";s:3:"냉";s:2:"";s:3:"냐";s:2:"";s:3:"냑";s:2:"";s:3:"냔";s:2:"";s:3:"냘";s:2:"";s:3:"냠";s:2:"";s:3:"냥";s:2:"";s:3:"너";s:2:"";s:3:"넉";s:2:"";s:3:"넋";s:2:"";s:3:"넌";s:2:"";s:3:"널";s:2:"";s:3:"넒";s:2:"";s:3:"넓";s:2:"";s:3:"넘";s:2:"";s:3:"넙";s:2:"";s:3:"넛";s:2:"";s:3:"넜";s:2:"";s:3:"넝";s:2:"";s:3:"넣";s:2:"";s:3:"네";s:2:"";s:3:"넥";s:2:"";s:3:"넨";s:2:"";s:3:"넬";s:2:"";s:3:"넴";s:2:"";s:3:"넵";s:2:"";s:3:"넷";s:2:"";s:3:"넸";s:2:"";s:3:"넹";s:2:"";s:3:"녀";s:2:"";s:3:"녁";s:2:"";s:3:"년";s:2:"";s:3:"녈";s:2:"";s:3:"념";s:2:"";s:3:"녑";s:2:"";s:3:"녔";s:2:"";s:3:"녕";s:2:"";s:3:"녘";s:2:"";s:3:"녜";s:2:"";s:3:"녠";s:2:"";s:3:"노";s:2:"";s:3:"녹";s:2:"";s:3:"논";s:2:"";s:3:"놀";s:2:"";s:3:"놂";s:2:"";s:3:"놈";s:2:"";s:3:"놉";s:2:"";s:3:"놋";s:2:"";s:3:"농";s:2:"";s:3:"높";s:2:"";s:3:"놓";s:2:"";s:3:"놔";s:2:"";s:3:"놘";s:2:"";s:3:"놜";s:2:"";s:3:"놨";s:2:"";s:3:"뇌";s:2:"";s:3:"뇐";s:2:"";s:3:"뇔";s:2:"";s:3:"뇜";s:2:"";s:3:"뇝";s:2:"A";s:3:"퀮";s:2:"B";s:3:"퀯";s:2:"C";s:3:"퀰";s:2:"D";s:3:"퀱";s:2:"E";s:3:"퀲";s:2:"F";s:3:"퀳";s:2:"G";s:3:"퀶";s:2:"H";s:3:"퀷";s:2:"I";s:3:"퀹";s:2:"J";s:3:"퀺";s:2:"K";s:3:"퀻";s:2:"L";s:3:"퀽";s:2:"M";s:3:"퀾";s:2:"N";s:3:"퀿";s:2:"O";s:3:"큀";s:2:"P";s:3:"큁";s:2:"Q";s:3:"큂";s:2:"R";s:3:"큃";s:2:"S";s:3:"큆";s:2:"T";s:3:"큈";s:2:"U";s:3:"큊";s:2:"V";s:3:"큋";s:2:"W";s:3:"큌";s:2:"X";s:3:"큍";s:2:"Y";s:3:"큎";s:2:"Z";s:3:"큏";s:2:"a";s:3:"큑";s:2:"b";s:3:"큒";s:2:"c";s:3:"큓";s:2:"d";s:3:"큕";s:2:"e";s:3:"큖";s:2:"f";s:3:"큗";s:2:"g";s:3:"큙";s:2:"h";s:3:"큚";s:2:"i";s:3:"큛";s:2:"j";s:3:"큜";s:2:"k";s:3:"큝";s:2:"l";s:3:"큞";s:2:"m";s:3:"큟";s:2:"n";s:3:"큡";s:2:"o";s:3:"큢";s:2:"p";s:3:"큣";s:2:"q";s:3:"큤";s:2:"r";s:3:"큥";s:2:"s";s:3:"큦";s:2:"t";s:3:"큧";s:2:"u";s:3:"큨";s:2:"v";s:3:"큩";s:2:"w";s:3:"큪";s:2:"x";s:3:"큫";s:2:"y";s:3:"큮";s:2:"z";s:3:"큯";s:2:"";s:3:"큱";s:2:"";s:3:"큲";s:2:"";s:3:"큳";s:2:"";s:3:"큵";s:2:"";s:3:"큶";s:2:"";s:3:"큷";s:2:"";s:3:"큸";s:2:"";s:3:"큹";s:2:"";s:3:"큺";s:2:"";s:3:"큻";s:2:"";s:3:"큾";s:2:"";s:3:"큿";s:2:"";s:3:"킀";s:2:"";s:3:"킂";s:2:"";s:3:"킃";s:2:"";s:3:"킄";s:2:"";s:3:"킅";s:2:"";s:3:"킆";s:2:"";s:3:"킇";s:2:"";s:3:"킈";s:2:"";s:3:"킉";s:2:"";s:3:"킊";s:2:"";s:3:"킋";s:2:"";s:3:"킌";s:2:"";s:3:"킍";s:2:"";s:3:"킎";s:2:"";s:3:"킏";s:2:"";s:3:"킐";s:2:"";s:3:"킑";s:2:"";s:3:"킒";s:2:"";s:3:"킓";s:2:"";s:3:"킔";s:2:"";s:3:"뇟";s:2:"";s:3:"뇨";s:2:"";s:3:"뇩";s:2:"";s:3:"뇬";s:2:"";s:3:"뇰";s:2:"";s:3:"뇹";s:2:"";s:3:"뇻";s:2:"";s:3:"뇽";s:2:"";s:3:"누";s:2:"";s:3:"눅";s:2:"";s:3:"눈";s:2:"";s:3:"눋";s:2:"";s:3:"눌";s:2:"";s:3:"눔";s:2:"";s:3:"눕";s:2:"";s:3:"눗";s:2:"";s:3:"눙";s:2:"";s:3:"눠";s:2:"";s:3:"눴";s:2:"";s:3:"눼";s:2:"";s:3:"뉘";s:2:"";s:3:"뉜";s:2:"";s:3:"뉠";s:2:"";s:3:"뉨";s:2:"";s:3:"뉩";s:2:"";s:3:"뉴";s:2:"";s:3:"뉵";s:2:"";s:3:"뉼";s:2:"";s:3:"늄";s:2:"";s:3:"늅";s:2:"";s:3:"늉";s:2:"";s:3:"느";s:2:"";s:3:"늑";s:2:"";s:3:"는";s:2:"";s:3:"늘";s:2:"";s:3:"늙";s:2:"";s:3:"늚";s:2:"";s:3:"늠";s:2:"";s:3:"늡";s:2:"";s:3:"늣";s:2:"";s:3:"능";s:2:"";s:3:"늦";s:2:"";s:3:"늪";s:2:"";s:3:"늬";s:2:"";s:3:"늰";s:2:"";s:3:"늴";s:2:"";s:3:"니";s:2:"";s:3:"닉";s:2:"";s:3:"닌";s:2:"";s:3:"닐";s:2:"";s:3:"닒";s:2:"";s:3:"님";s:2:"";s:3:"닙";s:2:"";s:3:"닛";s:2:"";s:3:"닝";s:2:"";s:3:"닢";s:2:"";s:3:"다";s:2:"";s:3:"닥";s:2:"";s:3:"닦";s:2:"";s:3:"단";s:2:"";s:3:"닫";s:2:"";s:3:"달";s:2:"";s:3:"닭";s:2:"";s:3:"닮";s:2:"";s:3:"닯";s:2:"";s:3:"닳";s:2:"";s:3:"담";s:2:"";s:3:"답";s:2:"";s:3:"닷";s:2:"";s:3:"닸";s:2:"";s:3:"당";s:2:"";s:3:"닺";s:2:"";s:3:"닻";s:2:"";s:3:"닿";s:2:"";s:3:"대";s:2:"";s:3:"댁";s:2:"";s:3:"댄";s:2:"";s:3:"댈";s:2:"";s:3:"댐";s:2:"";s:3:"댑";s:2:"";s:3:"댓";s:2:"";s:3:"댔";s:2:"";s:3:"댕";s:2:"";s:3:"댜";s:2:"";s:3:"더";s:2:"";s:3:"덕";s:2:"";s:3:"덖";s:2:"";s:3:"던";s:2:"";s:3:"덛";s:2:"";s:3:"덜";s:2:"";s:3:"덞";s:2:"";s:3:"덟";s:2:"";s:3:"덤";s:2:"";s:3:"덥";s:2:"A";s:3:"킕";s:2:"B";s:3:"킖";s:2:"C";s:3:"킗";s:2:"D";s:3:"킘";s:2:"E";s:3:"킙";s:2:"F";s:3:"킚";s:2:"G";s:3:"킛";s:2:"H";s:3:"킜";s:2:"I";s:3:"킝";s:2:"J";s:3:"킞";s:2:"K";s:3:"킟";s:2:"L";s:3:"킠";s:2:"M";s:3:"킡";s:2:"N";s:3:"킢";s:2:"O";s:3:"킣";s:2:"P";s:3:"킦";s:2:"Q";s:3:"킧";s:2:"R";s:3:"킩";s:2:"S";s:3:"킪";s:2:"T";s:3:"킫";s:2:"U";s:3:"킭";s:2:"V";s:3:"킮";s:2:"W";s:3:"킯";s:2:"X";s:3:"킰";s:2:"Y";s:3:"킱";s:2:"Z";s:3:"킲";s:2:"a";s:3:"킳";s:2:"b";s:3:"킶";s:2:"c";s:3:"킸";s:2:"d";s:3:"킺";s:2:"e";s:3:"킻";s:2:"f";s:3:"킼";s:2:"g";s:3:"킽";s:2:"h";s:3:"킾";s:2:"i";s:3:"킿";s:2:"j";s:3:"탂";s:2:"k";s:3:"탃";s:2:"l";s:3:"탅";s:2:"m";s:3:"탆";s:2:"n";s:3:"탇";s:2:"o";s:3:"탊";s:2:"p";s:3:"탋";s:2:"q";s:3:"탌";s:2:"r";s:3:"탍";s:2:"s";s:3:"탎";s:2:"t";s:3:"탏";s:2:"u";s:3:"탒";s:2:"v";s:3:"탖";s:2:"w";s:3:"탗";s:2:"x";s:3:"탘";s:2:"y";s:3:"탙";s:2:"z";s:3:"탚";s:2:"";s:3:"탛";s:2:"";s:3:"탞";s:2:"";s:3:"탟";s:2:"";s:3:"탡";s:2:"";s:3:"탢";s:2:"";s:3:"탣";s:2:"";s:3:"탥";s:2:"";s:3:"탦";s:2:"";s:3:"탧";s:2:"";s:3:"탨";s:2:"";s:3:"탩";s:2:"";s:3:"탪";s:2:"";s:3:"탫";s:2:"";s:3:"탮";s:2:"";s:3:"탲";s:2:"";s:3:"탳";s:2:"";s:3:"탴";s:2:"";s:3:"탵";s:2:"";s:3:"탶";s:2:"";s:3:"탷";s:2:"";s:3:"탹";s:2:"";s:3:"탺";s:2:"";s:3:"탻";s:2:"";s:3:"탼";s:2:"";s:3:"탽";s:2:"";s:3:"탾";s:2:"";s:3:"탿";s:2:"";s:3:"턀";s:2:"";s:3:"턁";s:2:"";s:3:"턂";s:2:"";s:3:"턃";s:2:"";s:3:"턄";s:2:"";s:3:"덧";s:2:"";s:3:"덩";s:2:"";s:3:"덫";s:2:"";s:3:"덮";s:2:"";s:3:"데";s:2:"";s:3:"덱";s:2:"";s:3:"덴";s:2:"";s:3:"델";s:2:"";s:3:"뎀";s:2:"";s:3:"뎁";s:2:"";s:3:"뎃";s:2:"";s:3:"뎄";s:2:"";s:3:"뎅";s:2:"";s:3:"뎌";s:2:"";s:3:"뎐";s:2:"";s:3:"뎔";s:2:"";s:3:"뎠";s:2:"";s:3:"뎡";s:2:"";s:3:"뎨";s:2:"";s:3:"뎬";s:2:"";s:3:"도";s:2:"";s:3:"독";s:2:"";s:3:"돈";s:2:"";s:3:"돋";s:2:"";s:3:"돌";s:2:"";s:3:"돎";s:2:"";s:3:"돐";s:2:"";s:3:"돔";s:2:"";s:3:"돕";s:2:"";s:3:"돗";s:2:"";s:3:"동";s:2:"";s:3:"돛";s:2:"";s:3:"돝";s:2:"";s:3:"돠";s:2:"";s:3:"돤";s:2:"";s:3:"돨";s:2:"";s:3:"돼";s:2:"";s:3:"됐";s:2:"";s:3:"되";s:2:"";s:3:"된";s:2:"";s:3:"될";s:2:"";s:3:"됨";s:2:"";s:3:"됩";s:2:"";s:3:"됫";s:2:"";s:3:"됴";s:2:"";s:3:"두";s:2:"";s:3:"둑";s:2:"";s:3:"둔";s:2:"";s:3:"둘";s:2:"";s:3:"둠";s:2:"";s:3:"둡";s:2:"";s:3:"둣";s:2:"";s:3:"둥";s:2:"";s:3:"둬";s:2:"";s:3:"뒀";s:2:"";s:3:"뒈";s:2:"";s:3:"뒝";s:2:"";s:3:"뒤";s:2:"";s:3:"뒨";s:2:"";s:3:"뒬";s:2:"";s:3:"뒵";s:2:"";s:3:"뒷";s:2:"";s:3:"뒹";s:2:"";s:3:"듀";s:2:"";s:3:"듄";s:2:"";s:3:"듈";s:2:"";s:3:"듐";s:2:"";s:3:"듕";s:2:"";s:3:"드";s:2:"";s:3:"득";s:2:"";s:3:"든";s:2:"";s:3:"듣";s:2:"";s:3:"들";s:2:"";s:3:"듦";s:2:"";s:3:"듬";s:2:"";s:3:"듭";s:2:"";s:3:"듯";s:2:"";s:3:"등";s:2:"";s:3:"듸";s:2:"";s:3:"디";s:2:"";s:3:"딕";s:2:"";s:3:"딘";s:2:"";s:3:"딛";s:2:"";s:3:"딜";s:2:"";s:3:"딤";s:2:"";s:3:"딥";s:2:"";s:3:"딧";s:2:"";s:3:"딨";s:2:"";s:3:"딩";s:2:"";s:3:"딪";s:2:"";s:3:"따";s:2:"";s:3:"딱";s:2:"";s:3:"딴";s:2:"";s:3:"딸";s:2:"A";s:3:"턅";s:2:"B";s:3:"턆";s:2:"C";s:3:"턇";s:2:"D";s:3:"턈";s:2:"E";s:3:"턉";s:2:"F";s:3:"턊";s:2:"G";s:3:"턋";s:2:"H";s:3:"턌";s:2:"I";s:3:"턎";s:2:"J";s:3:"턏";s:2:"K";s:3:"턐";s:2:"L";s:3:"턑";s:2:"M";s:3:"턒";s:2:"N";s:3:"턓";s:2:"O";s:3:"턔";s:2:"P";s:3:"턕";s:2:"Q";s:3:"턖";s:2:"R";s:3:"턗";s:2:"S";s:3:"턘";s:2:"T";s:3:"턙";s:2:"U";s:3:"턚";s:2:"V";s:3:"턛";s:2:"W";s:3:"턜";s:2:"X";s:3:"턝";s:2:"Y";s:3:"턞";s:2:"Z";s:3:"턟";s:2:"a";s:3:"턠";s:2:"b";s:3:"턡";s:2:"c";s:3:"턢";s:2:"d";s:3:"턣";s:2:"e";s:3:"턤";s:2:"f";s:3:"턥";s:2:"g";s:3:"턦";s:2:"h";s:3:"턧";s:2:"i";s:3:"턨";s:2:"j";s:3:"턩";s:2:"k";s:3:"턪";s:2:"l";s:3:"턫";s:2:"m";s:3:"턬";s:2:"n";s:3:"턭";s:2:"o";s:3:"턮";s:2:"p";s:3:"턯";s:2:"q";s:3:"턲";s:2:"r";s:3:"턳";s:2:"s";s:3:"턵";s:2:"t";s:3:"턶";s:2:"u";s:3:"턷";s:2:"v";s:3:"턹";s:2:"w";s:3:"턻";s:2:"x";s:3:"턼";s:2:"y";s:3:"턽";s:2:"z";s:3:"턾";s:2:"";s:3:"턿";s:2:"";s:3:"텂";s:2:"";s:3:"텆";s:2:"";s:3:"텇";s:2:"";s:3:"텈";s:2:"";s:3:"텉";s:2:"";s:3:"텊";s:2:"";s:3:"텋";s:2:"";s:3:"텎";s:2:"";s:3:"텏";s:2:"";s:3:"텑";s:2:"";s:3:"텒";s:2:"";s:3:"텓";s:2:"";s:3:"텕";s:2:"";s:3:"텖";s:2:"";s:3:"텗";s:2:"";s:3:"텘";s:2:"";s:3:"텙";s:2:"";s:3:"텚";s:2:"";s:3:"텛";s:2:"";s:3:"텞";s:2:"";s:3:"텠";s:2:"";s:3:"텢";s:2:"";s:3:"텣";s:2:"";s:3:"텤";s:2:"";s:3:"텥";s:2:"";s:3:"텦";s:2:"";s:3:"텧";s:2:"";s:3:"텩";s:2:"";s:3:"텪";s:2:"";s:3:"텫";s:2:"";s:3:"텭";s:2:"";s:3:"땀";s:2:"";s:3:"땁";s:2:"";s:3:"땃";s:2:"";s:3:"땄";s:2:"";s:3:"땅";s:2:"";s:3:"땋";s:2:"";s:3:"때";s:2:"";s:3:"땍";s:2:"";s:3:"땐";s:2:"";s:3:"땔";s:2:"";s:3:"땜";s:2:"";s:3:"땝";s:2:"";s:3:"땟";s:2:"";s:3:"땠";s:2:"";s:3:"땡";s:2:"";s:3:"떠";s:2:"";s:3:"떡";s:2:"";s:3:"떤";s:2:"";s:3:"떨";s:2:"";s:3:"떪";s:2:"";s:3:"떫";s:2:"";s:3:"떰";s:2:"";s:3:"떱";s:2:"";s:3:"떳";s:2:"";s:3:"떴";s:2:"";s:3:"떵";s:2:"";s:3:"떻";s:2:"";s:3:"떼";s:2:"";s:3:"떽";s:2:"";s:3:"뗀";s:2:"";s:3:"뗄";s:2:"";s:3:"뗌";s:2:"";s:3:"뗍";s:2:"";s:3:"뗏";s:2:"";s:3:"뗐";s:2:"";s:3:"뗑";s:2:"";s:3:"뗘";s:2:"";s:3:"뗬";s:2:"";s:3:"또";s:2:"";s:3:"똑";s:2:"";s:3:"똔";s:2:"";s:3:"똘";s:2:"";s:3:"똥";s:2:"";s:3:"똬";s:2:"";s:3:"똴";s:2:"";s:3:"뙈";s:2:"";s:3:"뙤";s:2:"";s:3:"뙨";s:2:"";s:3:"뚜";s:2:"";s:3:"뚝";s:2:"";s:3:"뚠";s:2:"";s:3:"뚤";s:2:"";s:3:"뚫";s:2:"";s:3:"뚬";s:2:"";s:3:"뚱";s:2:"";s:3:"뛔";s:2:"";s:3:"뛰";s:2:"";s:3:"뛴";s:2:"";s:3:"뛸";s:2:"";s:3:"뜀";s:2:"";s:3:"뜁";s:2:"";s:3:"뜅";s:2:"";s:3:"뜨";s:2:"";s:3:"뜩";s:2:"";s:3:"뜬";s:2:"";s:3:"뜯";s:2:"";s:3:"뜰";s:2:"";s:3:"뜸";s:2:"";s:3:"뜹";s:2:"";s:3:"뜻";s:2:"";s:3:"띄";s:2:"";s:3:"띈";s:2:"";s:3:"띌";s:2:"";s:3:"띔";s:2:"";s:3:"띕";s:2:"";s:3:"띠";s:2:"";s:3:"띤";s:2:"";s:3:"띨";s:2:"";s:3:"띰";s:2:"";s:3:"띱";s:2:"";s:3:"띳";s:2:"";s:3:"띵";s:2:"";s:3:"라";s:2:"";s:3:"락";s:2:"";s:3:"란";s:2:"";s:3:"랄";s:2:"";s:3:"람";s:2:"";s:3:"랍";s:2:"";s:3:"랏";s:2:"";s:3:"랐";s:2:"";s:3:"랑";s:2:"";s:3:"랒";s:2:"";s:3:"랖";s:2:"";s:3:"랗";s:2:"A";s:3:"텮";s:2:"B";s:3:"텯";s:2:"C";s:3:"텰";s:2:"D";s:3:"텱";s:2:"E";s:3:"텲";s:2:"F";s:3:"텳";s:2:"G";s:3:"텴";s:2:"H";s:3:"텵";s:2:"I";s:3:"텶";s:2:"J";s:3:"텷";s:2:"K";s:3:"텸";s:2:"L";s:3:"텹";s:2:"M";s:3:"텺";s:2:"N";s:3:"텻";s:2:"O";s:3:"텽";s:2:"P";s:3:"텾";s:2:"Q";s:3:"텿";s:2:"R";s:3:"톀";s:2:"S";s:3:"톁";s:2:"T";s:3:"톂";s:2:"U";s:3:"톃";s:2:"V";s:3:"톅";s:2:"W";s:3:"톆";s:2:"X";s:3:"톇";s:2:"Y";s:3:"톉";s:2:"Z";s:3:"톊";s:2:"a";s:3:"톋";s:2:"b";s:3:"톌";s:2:"c";s:3:"톍";s:2:"d";s:3:"톎";s:2:"e";s:3:"톏";s:2:"f";s:3:"톐";s:2:"g";s:3:"톑";s:2:"h";s:3:"톒";s:2:"i";s:3:"톓";s:2:"j";s:3:"톔";s:2:"k";s:3:"톕";s:2:"l";s:3:"톖";s:2:"m";s:3:"톗";s:2:"n";s:3:"톘";s:2:"o";s:3:"톙";s:2:"p";s:3:"톚";s:2:"q";s:3:"톛";s:2:"r";s:3:"톜";s:2:"s";s:3:"톝";s:2:"t";s:3:"톞";s:2:"u";s:3:"톟";s:2:"v";s:3:"톢";s:2:"w";s:3:"톣";s:2:"x";s:3:"톥";s:2:"y";s:3:"톦";s:2:"z";s:3:"톧";s:2:"";s:3:"톩";s:2:"";s:3:"톪";s:2:"";s:3:"톫";s:2:"";s:3:"톬";s:2:"";s:3:"톭";s:2:"";s:3:"톮";s:2:"";s:3:"톯";s:2:"";s:3:"톲";s:2:"";s:3:"톴";s:2:"";s:3:"톶";s:2:"";s:3:"톷";s:2:"";s:3:"톸";s:2:"";s:3:"톹";s:2:"";s:3:"톻";s:2:"";s:3:"톽";s:2:"";s:3:"톾";s:2:"";s:3:"톿";s:2:"";s:3:"퇁";s:2:"";s:3:"퇂";s:2:"";s:3:"퇃";s:2:"";s:3:"퇄";s:2:"";s:3:"퇅";s:2:"";s:3:"퇆";s:2:"";s:3:"퇇";s:2:"";s:3:"퇈";s:2:"";s:3:"퇉";s:2:"";s:3:"퇊";s:2:"";s:3:"퇋";s:2:"";s:3:"퇌";s:2:"";s:3:"퇍";s:2:"";s:3:"퇎";s:2:"";s:3:"퇏";s:2:"";s:3:"래";s:2:"";s:3:"랙";s:2:"";s:3:"랜";s:2:"";s:3:"랠";s:2:"";s:3:"램";s:2:"";s:3:"랩";s:2:"";s:3:"랫";s:2:"";s:3:"랬";s:2:"";s:3:"랭";s:2:"";s:3:"랴";s:2:"";s:3:"략";s:2:"";s:3:"랸";s:2:"";s:3:"럇";s:2:"";s:3:"량";s:2:"";s:3:"러";s:2:"";s:3:"럭";s:2:"";s:3:"런";s:2:"";s:3:"럴";s:2:"";s:3:"럼";s:2:"";s:3:"럽";s:2:"";s:3:"럿";s:2:"";s:3:"렀";s:2:"";s:3:"렁";s:2:"";s:3:"렇";s:2:"";s:3:"레";s:2:"";s:3:"렉";s:2:"";s:3:"렌";s:2:"";s:3:"렐";s:2:"";s:3:"렘";s:2:"";s:3:"렙";s:2:"";s:3:"렛";s:2:"";s:3:"렝";s:2:"";s:3:"려";s:2:"";s:3:"력";s:2:"";s:3:"련";s:2:"";s:3:"렬";s:2:"";s:3:"렴";s:2:"";s:3:"렵";s:2:"";s:3:"렷";s:2:"";s:3:"렸";s:2:"";s:3:"령";s:2:"";s:3:"례";s:2:"";s:3:"롄";s:2:"";s:3:"롑";s:2:"";s:3:"롓";s:2:"";s:3:"로";s:2:"";s:3:"록";s:2:"";s:3:"론";s:2:"";s:3:"롤";s:2:"";s:3:"롬";s:2:"";s:3:"롭";s:2:"";s:3:"롯";s:2:"";s:3:"롱";s:2:"";s:3:"롸";s:2:"";s:3:"롼";s:2:"";s:3:"뢍";s:2:"";s:3:"뢨";s:2:"";s:3:"뢰";s:2:"";s:3:"뢴";s:2:"";s:3:"뢸";s:2:"";s:3:"룀";s:2:"";s:3:"룁";s:2:"";s:3:"룃";s:2:"";s:3:"룅";s:2:"";s:3:"료";s:2:"";s:3:"룐";s:2:"";s:3:"룔";s:2:"";s:3:"룝";s:2:"";s:3:"룟";s:2:"";s:3:"룡";s:2:"";s:3:"루";s:2:"";s:3:"룩";s:2:"";s:3:"룬";s:2:"";s:3:"룰";s:2:"";s:3:"룸";s:2:"";s:3:"룹";s:2:"";s:3:"룻";s:2:"";s:3:"룽";s:2:"";s:3:"뤄";s:2:"";s:3:"뤘";s:2:"";s:3:"뤠";s:2:"";s:3:"뤼";s:2:"";s:3:"뤽";s:2:"";s:3:"륀";s:2:"";s:3:"륄";s:2:"";s:3:"륌";s:2:"";s:3:"륏";s:2:"";s:3:"륑";s:2:"";s:3:"류";s:2:"";s:3:"륙";s:2:"";s:3:"륜";s:2:"";s:3:"률";s:2:"";s:3:"륨";s:2:"";s:3:"륩";s:2:"A";s:3:"퇐";s:2:"B";s:3:"퇑";s:2:"C";s:3:"퇒";s:2:"D";s:3:"퇓";s:2:"E";s:3:"퇔";s:2:"F";s:3:"퇕";s:2:"G";s:3:"퇖";s:2:"H";s:3:"퇗";s:2:"I";s:3:"퇙";s:2:"J";s:3:"퇚";s:2:"K";s:3:"퇛";s:2:"L";s:3:"퇜";s:2:"M";s:3:"퇝";s:2:"N";s:3:"퇞";s:2:"O";s:3:"퇟";s:2:"P";s:3:"퇠";s:2:"Q";s:3:"퇡";s:2:"R";s:3:"퇢";s:2:"S";s:3:"퇣";s:2:"T";s:3:"퇤";s:2:"U";s:3:"퇥";s:2:"V";s:3:"퇦";s:2:"W";s:3:"퇧";s:2:"X";s:3:"퇨";s:2:"Y";s:3:"퇩";s:2:"Z";s:3:"퇪";s:2:"a";s:3:"퇫";s:2:"b";s:3:"퇬";s:2:"c";s:3:"퇭";s:2:"d";s:3:"퇮";s:2:"e";s:3:"퇯";s:2:"f";s:3:"퇰";s:2:"g";s:3:"퇱";s:2:"h";s:3:"퇲";s:2:"i";s:3:"퇳";s:2:"j";s:3:"퇵";s:2:"k";s:3:"퇶";s:2:"l";s:3:"퇷";s:2:"m";s:3:"퇹";s:2:"n";s:3:"퇺";s:2:"o";s:3:"퇻";s:2:"p";s:3:"퇼";s:2:"q";s:3:"퇽";s:2:"r";s:3:"퇾";s:2:"s";s:3:"퇿";s:2:"t";s:3:"툀";s:2:"u";s:3:"툁";s:2:"v";s:3:"툂";s:2:"w";s:3:"툃";s:2:"x";s:3:"툄";s:2:"y";s:3:"툅";s:2:"z";s:3:"툆";s:2:"";s:3:"툈";s:2:"";s:3:"툊";s:2:"";s:3:"툋";s:2:"";s:3:"툌";s:2:"";s:3:"툍";s:2:"";s:3:"툎";s:2:"";s:3:"툏";s:2:"";s:3:"툑";s:2:"";s:3:"툒";s:2:"";s:3:"툓";s:2:"";s:3:"툔";s:2:"";s:3:"툕";s:2:"";s:3:"툖";s:2:"";s:3:"툗";s:2:"";s:3:"툘";s:2:"";s:3:"툙";s:2:"";s:3:"툚";s:2:"";s:3:"툛";s:2:"";s:3:"툜";s:2:"";s:3:"툝";s:2:"";s:3:"툞";s:2:"";s:3:"툟";s:2:"";s:3:"툠";s:2:"";s:3:"툡";s:2:"";s:3:"툢";s:2:"";s:3:"툣";s:2:"";s:3:"툤";s:2:"";s:3:"툥";s:2:"";s:3:"툦";s:2:"";s:3:"툧";s:2:"";s:3:"툨";s:2:"";s:3:"툩";s:2:"";s:3:"륫";s:2:"";s:3:"륭";s:2:"";s:3:"르";s:2:"";s:3:"륵";s:2:"";s:3:"른";s:2:"";s:3:"를";s:2:"";s:3:"름";s:2:"";s:3:"릅";s:2:"";s:3:"릇";s:2:"";s:3:"릉";s:2:"";s:3:"릊";s:2:"";s:3:"릍";s:2:"";s:3:"릎";s:2:"";s:3:"리";s:2:"";s:3:"릭";s:2:"";s:3:"린";s:2:"";s:3:"릴";s:2:"";s:3:"림";s:2:"";s:3:"립";s:2:"";s:3:"릿";s:2:"";s:3:"링";s:2:"";s:3:"마";s:2:"";s:3:"막";s:2:"";s:3:"만";s:2:"";s:3:"많";s:2:"";s:3:"맏";s:2:"";s:3:"말";s:2:"";s:3:"맑";s:2:"";s:3:"맒";s:2:"";s:3:"맘";s:2:"";s:3:"맙";s:2:"";s:3:"맛";s:2:"";s:3:"망";s:2:"";s:3:"맞";s:2:"";s:3:"맡";s:2:"";s:3:"맣";s:2:"";s:3:"매";s:2:"";s:3:"맥";s:2:"";s:3:"맨";s:2:"";s:3:"맬";s:2:"";s:3:"맴";s:2:"";s:3:"맵";s:2:"";s:3:"맷";s:2:"";s:3:"맸";s:2:"";s:3:"맹";s:2:"";s:3:"맺";s:2:"";s:3:"먀";s:2:"";s:3:"먁";s:2:"";s:3:"먈";s:2:"";s:3:"먕";s:2:"";s:3:"머";s:2:"";s:3:"먹";s:2:"";s:3:"먼";s:2:"";s:3:"멀";s:2:"";s:3:"멂";s:2:"";s:3:"멈";s:2:"";s:3:"멉";s:2:"";s:3:"멋";s:2:"";s:3:"멍";s:2:"";s:3:"멎";s:2:"";s:3:"멓";s:2:"";s:3:"메";s:2:"";s:3:"멕";s:2:"";s:3:"멘";s:2:"";s:3:"멜";s:2:"";s:3:"멤";s:2:"";s:3:"멥";s:2:"";s:3:"멧";s:2:"";s:3:"멨";s:2:"";s:3:"멩";s:2:"";s:3:"며";s:2:"";s:3:"멱";s:2:"";s:3:"면";s:2:"";s:3:"멸";s:2:"";s:3:"몃";s:2:"";s:3:"몄";s:2:"";s:3:"명";s:2:"";s:3:"몇";s:2:"";s:3:"몌";s:2:"";s:3:"모";s:2:"";s:3:"목";s:2:"";s:3:"몫";s:2:"";s:3:"몬";s:2:"";s:3:"몰";s:2:"";s:3:"몲";s:2:"";s:3:"몸";s:2:"";s:3:"몹";s:2:"";s:3:"못";s:2:"";s:3:"몽";s:2:"";s:3:"뫄";s:2:"";s:3:"뫈";s:2:"";s:3:"뫘";s:2:"";s:3:"뫙";s:2:"";s:3:"뫼";s:2:"A";s:3:"툪";s:2:"B";s:3:"툫";s:2:"C";s:3:"툮";s:2:"D";s:3:"툯";s:2:"E";s:3:"툱";s:2:"F";s:3:"툲";s:2:"G";s:3:"툳";s:2:"H";s:3:"툵";s:2:"I";s:3:"툶";s:2:"J";s:3:"툷";s:2:"K";s:3:"툸";s:2:"L";s:3:"툹";s:2:"M";s:3:"툺";s:2:"N";s:3:"툻";s:2:"O";s:3:"툾";s:2:"P";s:3:"퉀";s:2:"Q";s:3:"퉂";s:2:"R";s:3:"퉃";s:2:"S";s:3:"퉄";s:2:"T";s:3:"퉅";s:2:"U";s:3:"퉆";s:2:"V";s:3:"퉇";s:2:"W";s:3:"퉉";s:2:"X";s:3:"퉊";s:2:"Y";s:3:"퉋";s:2:"Z";s:3:"퉌";s:2:"a";s:3:"퉍";s:2:"b";s:3:"퉎";s:2:"c";s:3:"퉏";s:2:"d";s:3:"퉐";s:2:"e";s:3:"퉑";s:2:"f";s:3:"퉒";s:2:"g";s:3:"퉓";s:2:"h";s:3:"퉔";s:2:"i";s:3:"퉕";s:2:"j";s:3:"퉖";s:2:"k";s:3:"퉗";s:2:"l";s:3:"퉘";s:2:"m";s:3:"퉙";s:2:"n";s:3:"퉚";s:2:"o";s:3:"퉛";s:2:"p";s:3:"퉝";s:2:"q";s:3:"퉞";s:2:"r";s:3:"퉟";s:2:"s";s:3:"퉠";s:2:"t";s:3:"퉡";s:2:"u";s:3:"퉢";s:2:"v";s:3:"퉣";s:2:"w";s:3:"퉥";s:2:"x";s:3:"퉦";s:2:"y";s:3:"퉧";s:2:"z";s:3:"퉨";s:2:"";s:3:"퉩";s:2:"";s:3:"퉪";s:2:"";s:3:"퉫";s:2:"";s:3:"퉬";s:2:"";s:3:"퉭";s:2:"";s:3:"퉮";s:2:"";s:3:"퉯";s:2:"";s:3:"퉰";s:2:"";s:3:"퉱";s:2:"";s:3:"퉲";s:2:"";s:3:"퉳";s:2:"";s:3:"퉴";s:2:"";s:3:"퉵";s:2:"";s:3:"퉶";s:2:"";s:3:"퉷";s:2:"";s:3:"퉸";s:2:"";s:3:"퉹";s:2:"";s:3:"퉺";s:2:"";s:3:"퉻";s:2:"";s:3:"퉼";s:2:"";s:3:"퉽";s:2:"";s:3:"퉾";s:2:"";s:3:"퉿";s:2:"";s:3:"튂";s:2:"";s:3:"튃";s:2:"";s:3:"튅";s:2:"";s:3:"튆";s:2:"";s:3:"튇";s:2:"";s:3:"튉";s:2:"";s:3:"튊";s:2:"";s:3:"튋";s:2:"";s:3:"튌";s:2:"";s:3:"묀";s:2:"";s:3:"묄";s:2:"";s:3:"묍";s:2:"";s:3:"묏";s:2:"";s:3:"묑";s:2:"";s:3:"묘";s:2:"";s:3:"묜";s:2:"";s:3:"묠";s:2:"";s:3:"묩";s:2:"";s:3:"묫";s:2:"";s:3:"무";s:2:"";s:3:"묵";s:2:"";s:3:"묶";s:2:"";s:3:"문";s:2:"";s:3:"묻";s:2:"";s:3:"물";s:2:"";s:3:"묽";s:2:"";s:3:"묾";s:2:"";s:3:"뭄";s:2:"";s:3:"뭅";s:2:"";s:3:"뭇";s:2:"";s:3:"뭉";s:2:"";s:3:"뭍";s:2:"";s:3:"뭏";s:2:"";s:3:"뭐";s:2:"";s:3:"뭔";s:2:"";s:3:"뭘";s:2:"";s:3:"뭡";s:2:"";s:3:"뭣";s:2:"";s:3:"뭬";s:2:"";s:3:"뮈";s:2:"";s:3:"뮌";s:2:"";s:3:"뮐";s:2:"";s:3:"뮤";s:2:"";s:3:"뮨";s:2:"";s:3:"뮬";s:2:"";s:3:"뮴";s:2:"";s:3:"뮷";s:2:"";s:3:"므";s:2:"";s:3:"믄";s:2:"";s:3:"믈";s:2:"";s:3:"믐";s:2:"";s:3:"믓";s:2:"";s:3:"미";s:2:"";s:3:"믹";s:2:"";s:3:"민";s:2:"";s:3:"믿";s:2:"";s:3:"밀";s:2:"";s:3:"밂";s:2:"";s:3:"밈";s:2:"";s:3:"밉";s:2:"";s:3:"밋";s:2:"";s:3:"밌";s:2:"";s:3:"밍";s:2:"";s:3:"및";s:2:"";s:3:"밑";s:2:"";s:3:"바";s:2:"";s:3:"박";s:2:"";s:3:"밖";s:2:"";s:3:"밗";s:2:"";s:3:"반";s:2:"";s:3:"받";s:2:"";s:3:"발";s:2:"";s:3:"밝";s:2:"";s:3:"밞";s:2:"";s:3:"밟";s:2:"";s:3:"밤";s:2:"";s:3:"밥";s:2:"";s:3:"밧";s:2:"";s:3:"방";s:2:"";s:3:"밭";s:2:"";s:3:"배";s:2:"";s:3:"백";s:2:"";s:3:"밴";s:2:"";s:3:"밸";s:2:"";s:3:"뱀";s:2:"";s:3:"뱁";s:2:"";s:3:"뱃";s:2:"";s:3:"뱄";s:2:"";s:3:"뱅";s:2:"";s:3:"뱉";s:2:"";s:3:"뱌";s:2:"";s:3:"뱍";s:2:"";s:3:"뱐";s:2:"";s:3:"뱝";s:2:"";s:3:"버";s:2:"";s:3:"벅";s:2:"";s:3:"번";s:2:"";s:3:"벋";s:2:"";s:3:"벌";s:2:"";s:3:"벎";s:2:"";s:3:"범";s:2:"";s:3:"법";s:2:"";s:3:"벗";s:2:"A";s:3:"튍";s:2:"B";s:3:"튎";s:2:"C";s:3:"튏";s:2:"D";s:3:"튒";s:2:"E";s:3:"튓";s:2:"F";s:3:"튔";s:2:"G";s:3:"튖";s:2:"H";s:3:"튗";s:2:"I";s:3:"튘";s:2:"J";s:3:"튙";s:2:"K";s:3:"튚";s:2:"L";s:3:"튛";s:2:"M";s:3:"튝";s:2:"N";s:3:"튞";s:2:"O";s:3:"튟";s:2:"P";s:3:"튡";s:2:"Q";s:3:"튢";s:2:"R";s:3:"튣";s:2:"S";s:3:"튥";s:2:"T";s:3:"튦";s:2:"U";s:3:"튧";s:2:"V";s:3:"튨";s:2:"W";s:3:"튩";s:2:"X";s:3:"튪";s:2:"Y";s:3:"튫";s:2:"Z";s:3:"튭";s:2:"a";s:3:"튮";s:2:"b";s:3:"튯";s:2:"c";s:3:"튰";s:2:"d";s:3:"튲";s:2:"e";s:3:"튳";s:2:"f";s:3:"튴";s:2:"g";s:3:"튵";s:2:"h";s:3:"튶";s:2:"i";s:3:"튷";s:2:"j";s:3:"튺";s:2:"k";s:3:"튻";s:2:"l";s:3:"튽";s:2:"m";s:3:"튾";s:2:"n";s:3:"틁";s:2:"o";s:3:"틃";s:2:"p";s:3:"틄";s:2:"q";s:3:"틅";s:2:"r";s:3:"틆";s:2:"s";s:3:"틇";s:2:"t";s:3:"틊";s:2:"u";s:3:"틌";s:2:"v";s:3:"틍";s:2:"w";s:3:"틎";s:2:"x";s:3:"틏";s:2:"y";s:3:"틐";s:2:"z";s:3:"틑";s:2:"";s:3:"틒";s:2:"";s:3:"틓";s:2:"";s:3:"틕";s:2:"";s:3:"틖";s:2:"";s:3:"틗";s:2:"";s:3:"틙";s:2:"";s:3:"틚";s:2:"";s:3:"틛";s:2:"";s:3:"틝";s:2:"";s:3:"틞";s:2:"";s:3:"틟";s:2:"";s:3:"틠";s:2:"";s:3:"틡";s:2:"";s:3:"틢";s:2:"";s:3:"틣";s:2:"";s:3:"틦";s:2:"";s:3:"틧";s:2:"";s:3:"틨";s:2:"";s:3:"틩";s:2:"";s:3:"틪";s:2:"";s:3:"틫";s:2:"";s:3:"틬";s:2:"";s:3:"틭";s:2:"";s:3:"틮";s:2:"";s:3:"틯";s:2:"";s:3:"틲";s:2:"";s:3:"틳";s:2:"";s:3:"틵";s:2:"";s:3:"틶";s:2:"";s:3:"틷";s:2:"";s:3:"틹";s:2:"";s:3:"틺";s:2:"";s:3:"벙";s:2:"";s:3:"벚";s:2:"";s:3:"베";s:2:"";s:3:"벡";s:2:"";s:3:"벤";s:2:"";s:3:"벧";s:2:"";s:3:"벨";s:2:"";s:3:"벰";s:2:"";s:3:"벱";s:2:"";s:3:"벳";s:2:"";s:3:"벴";s:2:"";s:3:"벵";s:2:"";s:3:"벼";s:2:"";s:3:"벽";s:2:"";s:3:"변";s:2:"";s:3:"별";s:2:"";s:3:"볍";s:2:"";s:3:"볏";s:2:"";s:3:"볐";s:2:"";s:3:"병";s:2:"";s:3:"볕";s:2:"";s:3:"볘";s:2:"";s:3:"볜";s:2:"";s:3:"보";s:2:"";s:3:"복";s:2:"";s:3:"볶";s:2:"";s:3:"본";s:2:"";s:3:"볼";s:2:"";s:3:"봄";s:2:"";s:3:"봅";s:2:"";s:3:"봇";s:2:"";s:3:"봉";s:2:"";s:3:"봐";s:2:"";s:3:"봔";s:2:"";s:3:"봤";s:2:"";s:3:"봬";s:2:"";s:3:"뵀";s:2:"";s:3:"뵈";s:2:"";s:3:"뵉";s:2:"";s:3:"뵌";s:2:"";s:3:"뵐";s:2:"";s:3:"뵘";s:2:"";s:3:"뵙";s:2:"";s:3:"뵤";s:2:"";s:3:"뵨";s:2:"";s:3:"부";s:2:"";s:3:"북";s:2:"";s:3:"분";s:2:"";s:3:"붇";s:2:"";s:3:"불";s:2:"";s:3:"붉";s:2:"";s:3:"붊";s:2:"";s:3:"붐";s:2:"";s:3:"붑";s:2:"";s:3:"붓";s:2:"";s:3:"붕";s:2:"";s:3:"붙";s:2:"";s:3:"붚";s:2:"";s:3:"붜";s:2:"";s:3:"붤";s:2:"";s:3:"붰";s:2:"";s:3:"붸";s:2:"";s:3:"뷔";s:2:"";s:3:"뷕";s:2:"";s:3:"뷘";s:2:"";s:3:"뷜";s:2:"";s:3:"뷩";s:2:"";s:3:"뷰";s:2:"";s:3:"뷴";s:2:"";s:3:"뷸";s:2:"";s:3:"븀";s:2:"";s:3:"븃";s:2:"";s:3:"븅";s:2:"";s:3:"브";s:2:"";s:3:"븍";s:2:"";s:3:"븐";s:2:"";s:3:"블";s:2:"";s:3:"븜";s:2:"";s:3:"븝";s:2:"";s:3:"븟";s:2:"";s:3:"비";s:2:"";s:3:"빅";s:2:"";s:3:"빈";s:2:"";s:3:"빌";s:2:"";s:3:"빎";s:2:"";s:3:"빔";s:2:"";s:3:"빕";s:2:"";s:3:"빗";s:2:"";s:3:"빙";s:2:"";s:3:"빚";s:2:"";s:3:"빛";s:2:"";s:3:"빠";s:2:"";s:3:"빡";s:2:"";s:3:"빤";s:2:"A";s:3:"틻";s:2:"B";s:3:"틼";s:2:"C";s:3:"틽";s:2:"D";s:3:"틾";s:2:"E";s:3:"틿";s:2:"F";s:3:"팂";s:2:"G";s:3:"팄";s:2:"H";s:3:"팆";s:2:"I";s:3:"팇";s:2:"J";s:3:"팈";s:2:"K";s:3:"팉";s:2:"L";s:3:"팊";s:2:"M";s:3:"팋";s:2:"N";s:3:"팏";s:2:"O";s:3:"팑";s:2:"P";s:3:"팒";s:2:"Q";s:3:"팓";s:2:"R";s:3:"팕";s:2:"S";s:3:"팗";s:2:"T";s:3:"팘";s:2:"U";s:3:"팙";s:2:"V";s:3:"팚";s:2:"W";s:3:"팛";s:2:"X";s:3:"팞";s:2:"Y";s:3:"팢";s:2:"Z";s:3:"팣";s:2:"a";s:3:"팤";s:2:"b";s:3:"팦";s:2:"c";s:3:"팧";s:2:"d";s:3:"팪";s:2:"e";s:3:"팫";s:2:"f";s:3:"팭";s:2:"g";s:3:"팮";s:2:"h";s:3:"팯";s:2:"i";s:3:"팱";s:2:"j";s:3:"팲";s:2:"k";s:3:"팳";s:2:"l";s:3:"팴";s:2:"m";s:3:"팵";s:2:"n";s:3:"팶";s:2:"o";s:3:"팷";s:2:"p";s:3:"팺";s:2:"q";s:3:"팾";s:2:"r";s:3:"팿";s:2:"s";s:3:"퍀";s:2:"t";s:3:"퍁";s:2:"u";s:3:"퍂";s:2:"v";s:3:"퍃";s:2:"w";s:3:"퍆";s:2:"x";s:3:"퍇";s:2:"y";s:3:"퍈";s:2:"z";s:3:"퍉";s:2:"";s:3:"퍊";s:2:"";s:3:"퍋";s:2:"";s:3:"퍌";s:2:"";s:3:"퍍";s:2:"";s:3:"퍎";s:2:"";s:3:"퍏";s:2:"";s:3:"퍐";s:2:"";s:3:"퍑";s:2:"";s:3:"퍒";s:2:"";s:3:"퍓";s:2:"";s:3:"퍔";s:2:"";s:3:"퍕";s:2:"";s:3:"퍖";s:2:"";s:3:"퍗";s:2:"";s:3:"퍘";s:2:"";s:3:"퍙";s:2:"";s:3:"퍚";s:2:"";s:3:"퍛";s:2:"";s:3:"퍜";s:2:"";s:3:"퍝";s:2:"";s:3:"퍞";s:2:"";s:3:"퍟";s:2:"";s:3:"퍠";s:2:"";s:3:"퍡";s:2:"";s:3:"퍢";s:2:"";s:3:"퍣";s:2:"";s:3:"퍤";s:2:"";s:3:"퍥";s:2:"";s:3:"퍦";s:2:"";s:3:"퍧";s:2:"";s:3:"퍨";s:2:"";s:3:"퍩";s:2:"";s:3:"빨";s:2:"";s:3:"빪";s:2:"";s:3:"빰";s:2:"";s:3:"빱";s:2:"";s:3:"빳";s:2:"";s:3:"빴";s:2:"";s:3:"빵";s:2:"";s:3:"빻";s:2:"";s:3:"빼";s:2:"";s:3:"빽";s:2:"";s:3:"뺀";s:2:"";s:3:"뺄";s:2:"";s:3:"뺌";s:2:"";s:3:"뺍";s:2:"";s:3:"뺏";s:2:"";s:3:"뺐";s:2:"";s:3:"뺑";s:2:"";s:3:"뺘";s:2:"";s:3:"뺙";s:2:"";s:3:"뺨";s:2:"";s:3:"뻐";s:2:"";s:3:"뻑";s:2:"";s:3:"뻔";s:2:"";s:3:"뻗";s:2:"";s:3:"뻘";s:2:"";s:3:"뻠";s:2:"";s:3:"뻣";s:2:"";s:3:"뻤";s:2:"";s:3:"뻥";s:2:"";s:3:"뻬";s:2:"";s:3:"뼁";s:2:"";s:3:"뼈";s:2:"";s:3:"뼉";s:2:"";s:3:"뼘";s:2:"";s:3:"뼙";s:2:"";s:3:"뼛";s:2:"";s:3:"뼜";s:2:"";s:3:"뼝";s:2:"";s:3:"뽀";s:2:"";s:3:"뽁";s:2:"";s:3:"뽄";s:2:"";s:3:"뽈";s:2:"";s:3:"뽐";s:2:"";s:3:"뽑";s:2:"";s:3:"뽕";s:2:"";s:3:"뾔";s:2:"";s:3:"뾰";s:2:"";s:3:"뿅";s:2:"";s:3:"뿌";s:2:"";s:3:"뿍";s:2:"";s:3:"뿐";s:2:"";s:3:"뿔";s:2:"";s:3:"뿜";s:2:"";s:3:"뿟";s:2:"";s:3:"뿡";s:2:"";s:3:"쀼";s:2:"";s:3:"쁑";s:2:"";s:3:"쁘";s:2:"";s:3:"쁜";s:2:"";s:3:"쁠";s:2:"";s:3:"쁨";s:2:"";s:3:"쁩";s:2:"";s:3:"삐";s:2:"";s:3:"삑";s:2:"";s:3:"삔";s:2:"";s:3:"삘";s:2:"";s:3:"삠";s:2:"";s:3:"삡";s:2:"";s:3:"삣";s:2:"";s:3:"삥";s:2:"";s:3:"사";s:2:"";s:3:"삭";s:2:"";s:3:"삯";s:2:"";s:3:"산";s:2:"";s:3:"삳";s:2:"";s:3:"살";s:2:"";s:3:"삵";s:2:"";s:3:"삶";s:2:"";s:3:"삼";s:2:"";s:3:"삽";s:2:"";s:3:"삿";s:2:"";s:3:"샀";s:2:"";s:3:"상";s:2:"";s:3:"샅";s:2:"";s:3:"새";s:2:"";s:3:"색";s:2:"";s:3:"샌";s:2:"";s:3:"샐";s:2:"";s:3:"샘";s:2:"";s:3:"샙";s:2:"";s:3:"샛";s:2:"";s:3:"샜";s:2:"";s:3:"생";s:2:"";s:3:"샤";s:2:"A";s:3:"퍪";s:2:"B";s:3:"퍫";s:2:"C";s:3:"퍬";s:2:"D";s:3:"퍭";s:2:"E";s:3:"퍮";s:2:"F";s:3:"퍯";s:2:"G";s:3:"퍰";s:2:"H";s:3:"퍱";s:2:"I";s:3:"퍲";s:2:"J";s:3:"퍳";s:2:"K";s:3:"퍴";s:2:"L";s:3:"퍵";s:2:"M";s:3:"퍶";s:2:"N";s:3:"퍷";s:2:"O";s:3:"퍸";s:2:"P";s:3:"퍹";s:2:"Q";s:3:"퍺";s:2:"R";s:3:"퍻";s:2:"S";s:3:"퍾";s:2:"T";s:3:"퍿";s:2:"U";s:3:"펁";s:2:"V";s:3:"펂";s:2:"W";s:3:"펃";s:2:"X";s:3:"펅";s:2:"Y";s:3:"펆";s:2:"Z";s:3:"펇";s:2:"a";s:3:"펈";s:2:"b";s:3:"펉";s:2:"c";s:3:"펊";s:2:"d";s:3:"펋";s:2:"e";s:3:"펎";s:2:"f";s:3:"펒";s:2:"g";s:3:"펓";s:2:"h";s:3:"펔";s:2:"i";s:3:"펕";s:2:"j";s:3:"펖";s:2:"k";s:3:"펗";s:2:"l";s:3:"펚";s:2:"m";s:3:"펛";s:2:"n";s:3:"펝";s:2:"o";s:3:"펞";s:2:"p";s:3:"펟";s:2:"q";s:3:"펡";s:2:"r";s:3:"펢";s:2:"s";s:3:"펣";s:2:"t";s:3:"펤";s:2:"u";s:3:"펥";s:2:"v";s:3:"펦";s:2:"w";s:3:"펧";s:2:"x";s:3:"펪";s:2:"y";s:3:"펬";s:2:"z";s:3:"펮";s:2:"";s:3:"펯";s:2:"";s:3:"펰";s:2:"";s:3:"펱";s:2:"";s:3:"펲";s:2:"";s:3:"펳";s:2:"";s:3:"펵";s:2:"";s:3:"펶";s:2:"";s:3:"펷";s:2:"";s:3:"펹";s:2:"";s:3:"펺";s:2:"";s:3:"펻";s:2:"";s:3:"펽";s:2:"";s:3:"펾";s:2:"";s:3:"펿";s:2:"";s:3:"폀";s:2:"";s:3:"폁";s:2:"";s:3:"폂";s:2:"";s:3:"폃";s:2:"";s:3:"폆";s:2:"";s:3:"폇";s:2:"";s:3:"폊";s:2:"";s:3:"폋";s:2:"";s:3:"폌";s:2:"";s:3:"폍";s:2:"";s:3:"폎";s:2:"";s:3:"폏";s:2:"";s:3:"폑";s:2:"";s:3:"폒";s:2:"";s:3:"폓";s:2:"";s:3:"폔";s:2:"";s:3:"폕";s:2:"";s:3:"폖";s:2:"";s:3:"샥";s:2:"";s:3:"샨";s:2:"";s:3:"샬";s:2:"";s:3:"샴";s:2:"";s:3:"샵";s:2:"";s:3:"샷";s:2:"";s:3:"샹";s:2:"";s:3:"섀";s:2:"";s:3:"섄";s:2:"";s:3:"섈";s:2:"";s:3:"섐";s:2:"";s:3:"섕";s:2:"";s:3:"서";s:2:"";s:3:"석";s:2:"";s:3:"섞";s:2:"";s:3:"섟";s:2:"";s:3:"선";s:2:"";s:3:"섣";s:2:"";s:3:"설";s:2:"";s:3:"섦";s:2:"";s:3:"섧";s:2:"";s:3:"섬";s:2:"";s:3:"섭";s:2:"";s:3:"섯";s:2:"";s:3:"섰";s:2:"";s:3:"성";s:2:"";s:3:"섶";s:2:"";s:3:"세";s:2:"";s:3:"섹";s:2:"";s:3:"센";s:2:"";s:3:"셀";s:2:"";s:3:"셈";s:2:"";s:3:"셉";s:2:"";s:3:"셋";s:2:"";s:3:"셌";s:2:"";s:3:"셍";s:2:"";s:3:"셔";s:2:"";s:3:"셕";s:2:"";s:3:"션";s:2:"";s:3:"셜";s:2:"";s:3:"셤";s:2:"";s:3:"셥";s:2:"";s:3:"셧";s:2:"";s:3:"셨";s:2:"";s:3:"셩";s:2:"";s:3:"셰";s:2:"";s:3:"셴";s:2:"";s:3:"셸";s:2:"";s:3:"솅";s:2:"";s:3:"소";s:2:"";s:3:"속";s:2:"";s:3:"솎";s:2:"";s:3:"손";s:2:"";s:3:"솔";s:2:"";s:3:"솖";s:2:"";s:3:"솜";s:2:"";s:3:"솝";s:2:"";s:3:"솟";s:2:"";s:3:"송";s:2:"";s:3:"솥";s:2:"";s:3:"솨";s:2:"";s:3:"솩";s:2:"";s:3:"솬";s:2:"";s:3:"솰";s:2:"";s:3:"솽";s:2:"";s:3:"쇄";s:2:"";s:3:"쇈";s:2:"";s:3:"쇌";s:2:"";s:3:"쇔";s:2:"";s:3:"쇗";s:2:"";s:3:"쇘";s:2:"";s:3:"쇠";s:2:"";s:3:"쇤";s:2:"";s:3:"쇨";s:2:"";s:3:"쇰";s:2:"";s:3:"쇱";s:2:"";s:3:"쇳";s:2:"";s:3:"쇼";s:2:"";s:3:"쇽";s:2:"";s:3:"숀";s:2:"";s:3:"숄";s:2:"";s:3:"숌";s:2:"";s:3:"숍";s:2:"";s:3:"숏";s:2:"";s:3:"숑";s:2:"";s:3:"수";s:2:"";s:3:"숙";s:2:"";s:3:"순";s:2:"";s:3:"숟";s:2:"";s:3:"술";s:2:"";s:3:"숨";s:2:"";s:3:"숩";s:2:"";s:3:"숫";s:2:"";s:3:"숭";s:2:"A";s:3:"폗";s:2:"B";s:3:"폙";s:2:"C";s:3:"폚";s:2:"D";s:3:"폛";s:2:"E";s:3:"폜";s:2:"F";s:3:"폝";s:2:"G";s:3:"폞";s:2:"H";s:3:"폟";s:2:"I";s:3:"폠";s:2:"J";s:3:"폢";s:2:"K";s:3:"폤";s:2:"L";s:3:"폥";s:2:"M";s:3:"폦";s:2:"N";s:3:"폧";s:2:"O";s:3:"폨";s:2:"P";s:3:"폩";s:2:"Q";s:3:"폪";s:2:"R";s:3:"폫";s:2:"S";s:3:"폮";s:2:"T";s:3:"폯";s:2:"U";s:3:"폱";s:2:"V";s:3:"폲";s:2:"W";s:3:"폳";s:2:"X";s:3:"폵";s:2:"Y";s:3:"폶";s:2:"Z";s:3:"폷";s:2:"a";s:3:"폸";s:2:"b";s:3:"폹";s:2:"c";s:3:"폺";s:2:"d";s:3:"폻";s:2:"e";s:3:"폾";s:2:"f";s:3:"퐀";s:2:"g";s:3:"퐂";s:2:"h";s:3:"퐃";s:2:"i";s:3:"퐄";s:2:"j";s:3:"퐅";s:2:"k";s:3:"퐆";s:2:"l";s:3:"퐇";s:2:"m";s:3:"퐉";s:2:"n";s:3:"퐊";s:2:"o";s:3:"퐋";s:2:"p";s:3:"퐌";s:2:"q";s:3:"퐍";s:2:"r";s:3:"퐎";s:2:"s";s:3:"퐏";s:2:"t";s:3:"퐐";s:2:"u";s:3:"퐑";s:2:"v";s:3:"퐒";s:2:"w";s:3:"퐓";s:2:"x";s:3:"퐔";s:2:"y";s:3:"퐕";s:2:"z";s:3:"퐖";s:2:"";s:3:"퐗";s:2:"";s:3:"퐘";s:2:"";s:3:"퐙";s:2:"";s:3:"퐚";s:2:"";s:3:"퐛";s:2:"";s:3:"퐜";s:2:"";s:3:"퐞";s:2:"";s:3:"퐟";s:2:"";s:3:"퐠";s:2:"";s:3:"퐡";s:2:"";s:3:"퐢";s:2:"";s:3:"퐣";s:2:"";s:3:"퐤";s:2:"";s:3:"퐥";s:2:"";s:3:"퐦";s:2:"";s:3:"퐧";s:2:"";s:3:"퐨";s:2:"";s:3:"퐩";s:2:"";s:3:"퐪";s:2:"";s:3:"퐫";s:2:"";s:3:"퐬";s:2:"";s:3:"퐭";s:2:"";s:3:"퐮";s:2:"";s:3:"퐯";s:2:"";s:3:"퐰";s:2:"";s:3:"퐱";s:2:"";s:3:"퐲";s:2:"";s:3:"퐳";s:2:"";s:3:"퐴";s:2:"";s:3:"퐵";s:2:"";s:3:"퐶";s:2:"";s:3:"퐷";s:2:"";s:3:"숯";s:2:"";s:3:"숱";s:2:"";s:3:"숲";s:2:"";s:3:"숴";s:2:"";s:3:"쉈";s:2:"";s:3:"쉐";s:2:"";s:3:"쉑";s:2:"";s:3:"쉔";s:2:"";s:3:"쉘";s:2:"";s:3:"쉠";s:2:"";s:3:"쉥";s:2:"";s:3:"쉬";s:2:"";s:3:"쉭";s:2:"";s:3:"쉰";s:2:"";s:3:"쉴";s:2:"";s:3:"쉼";s:2:"";s:3:"쉽";s:2:"";s:3:"쉿";s:2:"";s:3:"슁";s:2:"";s:3:"슈";s:2:"";s:3:"슉";s:2:"";s:3:"슐";s:2:"";s:3:"슘";s:2:"";s:3:"슛";s:2:"";s:3:"슝";s:2:"";s:3:"스";s:2:"";s:3:"슥";s:2:"";s:3:"슨";s:2:"";s:3:"슬";s:2:"";s:3:"슭";s:2:"";s:3:"슴";s:2:"";s:3:"습";s:2:"";s:3:"슷";s:2:"";s:3:"승";s:2:"";s:3:"시";s:2:"";s:3:"식";s:2:"";s:3:"신";s:2:"";s:3:"싣";s:2:"";s:3:"실";s:2:"";s:3:"싫";s:2:"";s:3:"심";s:2:"";s:3:"십";s:2:"";s:3:"싯";s:2:"";s:3:"싱";s:2:"";s:3:"싶";s:2:"";s:3:"싸";s:2:"";s:3:"싹";s:2:"";s:3:"싻";s:2:"";s:3:"싼";s:2:"";s:3:"쌀";s:2:"";s:3:"쌈";s:2:"";s:3:"쌉";s:2:"";s:3:"쌌";s:2:"";s:3:"쌍";s:2:"";s:3:"쌓";s:2:"";s:3:"쌔";s:2:"";s:3:"쌕";s:2:"";s:3:"쌘";s:2:"";s:3:"쌜";s:2:"";s:3:"쌤";s:2:"";s:3:"쌥";s:2:"";s:3:"쌨";s:2:"";s:3:"쌩";s:2:"";s:3:"썅";s:2:"";s:3:"써";s:2:"";s:3:"썩";s:2:"";s:3:"썬";s:2:"";s:3:"썰";s:2:"";s:3:"썲";s:2:"";s:3:"썸";s:2:"";s:3:"썹";s:2:"";s:3:"썼";s:2:"";s:3:"썽";s:2:"";s:3:"쎄";s:2:"";s:3:"쎈";s:2:"";s:3:"쎌";s:2:"";s:3:"쏀";s:2:"";s:3:"쏘";s:2:"";s:3:"쏙";s:2:"";s:3:"쏜";s:2:"";s:3:"쏟";s:2:"";s:3:"쏠";s:2:"";s:3:"쏢";s:2:"";s:3:"쏨";s:2:"";s:3:"쏩";s:2:"";s:3:"쏭";s:2:"";s:3:"쏴";s:2:"";s:3:"쏵";s:2:"";s:3:"쏸";s:2:"";s:3:"쐈";s:2:"";s:3:"쐐";s:2:"";s:3:"쐤";s:2:"";s:3:"쐬";s:2:"";s:3:"쐰";s:2:"A";s:3:"퐸";s:2:"B";s:3:"퐹";s:2:"C";s:3:"퐺";s:2:"D";s:3:"퐻";s:2:"E";s:3:"퐼";s:2:"F";s:3:"퐽";s:2:"G";s:3:"퐾";s:2:"H";s:3:"퐿";s:2:"I";s:3:"푁";s:2:"J";s:3:"푂";s:2:"K";s:3:"푃";s:2:"L";s:3:"푅";s:2:"M";s:3:"푆";s:2:"N";s:3:"푇";s:2:"O";s:3:"푈";s:2:"P";s:3:"푉";s:2:"Q";s:3:"푊";s:2:"R";s:3:"푋";s:2:"S";s:3:"푌";s:2:"T";s:3:"푍";s:2:"U";s:3:"푎";s:2:"V";s:3:"푏";s:2:"W";s:3:"푐";s:2:"X";s:3:"푑";s:2:"Y";s:3:"푒";s:2:"Z";s:3:"푓";s:2:"a";s:3:"푔";s:2:"b";s:3:"푕";s:2:"c";s:3:"푖";s:2:"d";s:3:"푗";s:2:"e";s:3:"푘";s:2:"f";s:3:"푙";s:2:"g";s:3:"푚";s:2:"h";s:3:"푛";s:2:"i";s:3:"푝";s:2:"j";s:3:"푞";s:2:"k";s:3:"푟";s:2:"l";s:3:"푡";s:2:"m";s:3:"푢";s:2:"n";s:3:"푣";s:2:"o";s:3:"푥";s:2:"p";s:3:"푦";s:2:"q";s:3:"푧";s:2:"r";s:3:"푨";s:2:"s";s:3:"푩";s:2:"t";s:3:"푪";s:2:"u";s:3:"푫";s:2:"v";s:3:"푬";s:2:"w";s:3:"푮";s:2:"x";s:3:"푰";s:2:"y";s:3:"푱";s:2:"z";s:3:"푲";s:2:"";s:3:"푳";s:2:"";s:3:"푴";s:2:"";s:3:"푵";s:2:"";s:3:"푶";s:2:"";s:3:"푷";s:2:"";s:3:"푺";s:2:"";s:3:"푻";s:2:"";s:3:"푽";s:2:"";s:3:"푾";s:2:"";s:3:"풁";s:2:"";s:3:"풃";s:2:"";s:3:"풄";s:2:"";s:3:"풅";s:2:"";s:3:"풆";s:2:"";s:3:"풇";s:2:"";s:3:"풊";s:2:"";s:3:"풌";s:2:"";s:3:"풎";s:2:"";s:3:"풏";s:2:"";s:3:"풐";s:2:"";s:3:"풑";s:2:"";s:3:"풒";s:2:"";s:3:"풓";s:2:"";s:3:"풕";s:2:"";s:3:"풖";s:2:"";s:3:"풗";s:2:"";s:3:"풘";s:2:"";s:3:"풙";s:2:"";s:3:"풚";s:2:"";s:3:"풛";s:2:"";s:3:"풜";s:2:"";s:3:"풝";s:2:"";s:3:"쐴";s:2:"";s:3:"쐼";s:2:"";s:3:"쐽";s:2:"";s:3:"쑈";s:2:"";s:3:"쑤";s:2:"";s:3:"쑥";s:2:"";s:3:"쑨";s:2:"";s:3:"쑬";s:2:"";s:3:"쑴";s:2:"";s:3:"쑵";s:2:"";s:3:"쑹";s:2:"";s:3:"쒀";s:2:"";s:3:"쒔";s:2:"";s:3:"쒜";s:2:"";s:3:"쒸";s:2:"";s:3:"쒼";s:2:"";s:3:"쓩";s:2:"";s:3:"쓰";s:2:"";s:3:"쓱";s:2:"";s:3:"쓴";s:2:"";s:3:"쓸";s:2:"";s:3:"쓺";s:2:"";s:3:"쓿";s:2:"";s:3:"씀";s:2:"";s:3:"씁";s:2:"";s:3:"씌";s:2:"";s:3:"씐";s:2:"";s:3:"씔";s:2:"";s:3:"씜";s:2:"";s:3:"씨";s:2:"";s:3:"씩";s:2:"";s:3:"씬";s:2:"";s:3:"씰";s:2:"";s:3:"씸";s:2:"";s:3:"씹";s:2:"";s:3:"씻";s:2:"";s:3:"씽";s:2:"";s:3:"아";s:2:"";s:3:"악";s:2:"";s:3:"안";s:2:"";s:3:"앉";s:2:"";s:3:"않";s:2:"";s:3:"알";s:2:"";s:3:"앍";s:2:"";s:3:"앎";s:2:"";s:3:"앓";s:2:"";s:3:"암";s:2:"";s:3:"압";s:2:"";s:3:"앗";s:2:"";s:3:"았";s:2:"";s:3:"앙";s:2:"";s:3:"앝";s:2:"";s:3:"앞";s:2:"";s:3:"애";s:2:"";s:3:"액";s:2:"";s:3:"앤";s:2:"";s:3:"앨";s:2:"";s:3:"앰";s:2:"";s:3:"앱";s:2:"";s:3:"앳";s:2:"";s:3:"앴";s:2:"";s:3:"앵";s:2:"";s:3:"야";s:2:"";s:3:"약";s:2:"";s:3:"얀";s:2:"";s:3:"얄";s:2:"";s:3:"얇";s:2:"";s:3:"얌";s:2:"";s:3:"얍";s:2:"";s:3:"얏";s:2:"";s:3:"양";s:2:"";s:3:"얕";s:2:"";s:3:"얗";s:2:"";s:3:"얘";s:2:"";s:3:"얜";s:2:"";s:3:"얠";s:2:"";s:3:"얩";s:2:"";s:3:"어";s:2:"";s:3:"억";s:2:"";s:3:"언";s:2:"";s:3:"얹";s:2:"";s:3:"얻";s:2:"";s:3:"얼";s:2:"";s:3:"얽";s:2:"";s:3:"얾";s:2:"";s:3:"엄";s:2:"";s:3:"업";s:2:"";s:3:"없";s:2:"";s:3:"엇";s:2:"";s:3:"었";s:2:"";s:3:"엉";s:2:"";s:3:"엊";s:2:"";s:3:"엌";s:2:"";s:3:"엎";s:2:"A";s:3:"풞";s:2:"B";s:3:"풟";s:2:"C";s:3:"풠";s:2:"D";s:3:"풡";s:2:"E";s:3:"풢";s:2:"F";s:3:"풣";s:2:"G";s:3:"풤";s:2:"H";s:3:"풥";s:2:"I";s:3:"풦";s:2:"J";s:3:"풧";s:2:"K";s:3:"풨";s:2:"L";s:3:"풪";s:2:"M";s:3:"풫";s:2:"N";s:3:"풬";s:2:"O";s:3:"풭";s:2:"P";s:3:"풮";s:2:"Q";s:3:"풯";s:2:"R";s:3:"풰";s:2:"S";s:3:"풱";s:2:"T";s:3:"풲";s:2:"U";s:3:"풳";s:2:"V";s:3:"풴";s:2:"W";s:3:"풵";s:2:"X";s:3:"풶";s:2:"Y";s:3:"풷";s:2:"Z";s:3:"풸";s:2:"a";s:3:"풹";s:2:"b";s:3:"풺";s:2:"c";s:3:"풻";s:2:"d";s:3:"풼";s:2:"e";s:3:"풽";s:2:"f";s:3:"풾";s:2:"g";s:3:"풿";s:2:"h";s:3:"퓀";s:2:"i";s:3:"퓁";s:2:"j";s:3:"퓂";s:2:"k";s:3:"퓃";s:2:"l";s:3:"퓄";s:2:"m";s:3:"퓅";s:2:"n";s:3:"퓆";s:2:"o";s:3:"퓇";s:2:"p";s:3:"퓈";s:2:"q";s:3:"퓉";s:2:"r";s:3:"퓊";s:2:"s";s:3:"퓋";s:2:"t";s:3:"퓍";s:2:"u";s:3:"퓎";s:2:"v";s:3:"퓏";s:2:"w";s:3:"퓑";s:2:"x";s:3:"퓒";s:2:"y";s:3:"퓓";s:2:"z";s:3:"퓕";s:2:"";s:3:"퓖";s:2:"";s:3:"퓗";s:2:"";s:3:"퓘";s:2:"";s:3:"퓙";s:2:"";s:3:"퓚";s:2:"";s:3:"퓛";s:2:"";s:3:"퓝";s:2:"";s:3:"퓞";s:2:"";s:3:"퓠";s:2:"";s:3:"퓡";s:2:"";s:3:"퓢";s:2:"";s:3:"퓣";s:2:"";s:3:"퓤";s:2:"";s:3:"퓥";s:2:"";s:3:"퓦";s:2:"";s:3:"퓧";s:2:"";s:3:"퓩";s:2:"";s:3:"퓪";s:2:"";s:3:"퓫";s:2:"";s:3:"퓭";s:2:"";s:3:"퓮";s:2:"";s:3:"퓯";s:2:"";s:3:"퓱";s:2:"";s:3:"퓲";s:2:"";s:3:"퓳";s:2:"";s:3:"퓴";s:2:"";s:3:"퓵";s:2:"";s:3:"퓶";s:2:"";s:3:"퓷";s:2:"";s:3:"퓹";s:2:"";s:3:"퓺";s:2:"";s:3:"퓼";s:2:"";s:3:"에";s:2:"";s:3:"엑";s:2:"";s:3:"엔";s:2:"";s:3:"엘";s:2:"";s:3:"엠";s:2:"";s:3:"엡";s:2:"";s:3:"엣";s:2:"";s:3:"엥";s:2:"";s:3:"여";s:2:"";s:3:"역";s:2:"";s:3:"엮";s:2:"";s:3:"연";s:2:"";s:3:"열";s:2:"";s:3:"엶";s:2:"";s:3:"엷";s:2:"";s:3:"염";s:2:"";s:3:"엽";s:2:"";s:3:"엾";s:2:"";s:3:"엿";s:2:"";s:3:"였";s:2:"";s:3:"영";s:2:"";s:3:"옅";s:2:"";s:3:"옆";s:2:"";s:3:"옇";s:2:"";s:3:"예";s:2:"";s:3:"옌";s:2:"";s:3:"옐";s:2:"";s:3:"옘";s:2:"";s:3:"옙";s:2:"";s:3:"옛";s:2:"";s:3:"옜";s:2:"";s:3:"오";s:2:"";s:3:"옥";s:2:"";s:3:"온";s:2:"";s:3:"올";s:2:"";s:3:"옭";s:2:"";s:3:"옮";s:2:"";s:3:"옰";s:2:"";s:3:"옳";s:2:"";s:3:"옴";s:2:"";s:3:"옵";s:2:"";s:3:"옷";s:2:"";s:3:"옹";s:2:"";s:3:"옻";s:2:"";s:3:"와";s:2:"";s:3:"왁";s:2:"";s:3:"완";s:2:"";s:3:"왈";s:2:"";s:3:"왐";s:2:"";s:3:"왑";s:2:"";s:3:"왓";s:2:"";s:3:"왔";s:2:"";s:3:"왕";s:2:"";s:3:"왜";s:2:"";s:3:"왝";s:2:"";s:3:"왠";s:2:"";s:3:"왬";s:2:"";s:3:"왯";s:2:"";s:3:"왱";s:2:"";s:3:"외";s:2:"";s:3:"왹";s:2:"";s:3:"왼";s:2:"";s:3:"욀";s:2:"";s:3:"욈";s:2:"";s:3:"욉";s:2:"";s:3:"욋";s:2:"";s:3:"욍";s:2:"";s:3:"요";s:2:"";s:3:"욕";s:2:"";s:3:"욘";s:2:"";s:3:"욜";s:2:"";s:3:"욤";s:2:"";s:3:"욥";s:2:"";s:3:"욧";s:2:"";s:3:"용";s:2:"";s:3:"우";s:2:"";s:3:"욱";s:2:"";s:3:"운";s:2:"";s:3:"울";s:2:"";s:3:"욹";s:2:"";s:3:"욺";s:2:"";s:3:"움";s:2:"";s:3:"웁";s:2:"";s:3:"웃";s:2:"";s:3:"웅";s:2:"";s:3:"워";s:2:"";s:3:"웍";s:2:"";s:3:"원";s:2:"";s:3:"월";s:2:"";s:3:"웜";s:2:"";s:3:"웝";s:2:"";s:3:"웠";s:2:"";s:3:"웡";s:2:"";s:3:"웨";s:2:"A";s:3:"퓾";s:2:"B";s:3:"퓿";s:2:"C";s:3:"픀";s:2:"D";s:3:"픁";s:2:"E";s:3:"픂";s:2:"F";s:3:"픃";s:2:"G";s:3:"픅";s:2:"H";s:3:"픆";s:2:"I";s:3:"픇";s:2:"J";s:3:"픉";s:2:"K";s:3:"픊";s:2:"L";s:3:"픋";s:2:"M";s:3:"픍";s:2:"N";s:3:"픎";s:2:"O";s:3:"픏";s:2:"P";s:3:"픐";s:2:"Q";s:3:"픑";s:2:"R";s:3:"픒";s:2:"S";s:3:"픓";s:2:"T";s:3:"픖";s:2:"U";s:3:"픘";s:2:"V";s:3:"픙";s:2:"W";s:3:"픚";s:2:"X";s:3:"픛";s:2:"Y";s:3:"픜";s:2:"Z";s:3:"픝";s:2:"a";s:3:"픞";s:2:"b";s:3:"픟";s:2:"c";s:3:"픠";s:2:"d";s:3:"픡";s:2:"e";s:3:"픢";s:2:"f";s:3:"픣";s:2:"g";s:3:"픤";s:2:"h";s:3:"픥";s:2:"i";s:3:"픦";s:2:"j";s:3:"픧";s:2:"k";s:3:"픨";s:2:"l";s:3:"픩";s:2:"m";s:3:"픪";s:2:"n";s:3:"픫";s:2:"o";s:3:"픬";s:2:"p";s:3:"픭";s:2:"q";s:3:"픮";s:2:"r";s:3:"픯";s:2:"s";s:3:"픰";s:2:"t";s:3:"픱";s:2:"u";s:3:"픲";s:2:"v";s:3:"픳";s:2:"w";s:3:"픴";s:2:"x";s:3:"픵";s:2:"y";s:3:"픶";s:2:"z";s:3:"픷";s:2:"";s:3:"픸";s:2:"";s:3:"픹";s:2:"";s:3:"픺";s:2:"";s:3:"픻";s:2:"";s:3:"픾";s:2:"";s:3:"픿";s:2:"";s:3:"핁";s:2:"";s:3:"핂";s:2:"";s:3:"핃";s:2:"";s:3:"핅";s:2:"";s:3:"핆";s:2:"";s:3:"핇";s:2:"";s:3:"핈";s:2:"";s:3:"핉";s:2:"";s:3:"핊";s:2:"";s:3:"핋";s:2:"";s:3:"핎";s:2:"";s:3:"핐";s:2:"";s:3:"핒";s:2:"";s:3:"핓";s:2:"";s:3:"핔";s:2:"";s:3:"핕";s:2:"";s:3:"핖";s:2:"";s:3:"핗";s:2:"";s:3:"핚";s:2:"";s:3:"핛";s:2:"";s:3:"핝";s:2:"";s:3:"핞";s:2:"";s:3:"핟";s:2:"";s:3:"핡";s:2:"";s:3:"핢";s:2:"";s:3:"핣";s:2:"";s:3:"웩";s:2:"";s:3:"웬";s:2:"";s:3:"웰";s:2:"";s:3:"웸";s:2:"";s:3:"웹";s:2:"";s:3:"웽";s:2:"";s:3:"위";s:2:"";s:3:"윅";s:2:"";s:3:"윈";s:2:"";s:3:"윌";s:2:"";s:3:"윔";s:2:"";s:3:"윕";s:2:"";s:3:"윗";s:2:"";s:3:"윙";s:2:"";s:3:"유";s:2:"";s:3:"육";s:2:"";s:3:"윤";s:2:"";s:3:"율";s:2:"";s:3:"윰";s:2:"";s:3:"윱";s:2:"";s:3:"윳";s:2:"";s:3:"융";s:2:"";s:3:"윷";s:2:"";s:3:"으";s:2:"";s:3:"윽";s:2:"";s:3:"은";s:2:"";s:3:"을";s:2:"";s:3:"읊";s:2:"";s:3:"음";s:2:"";s:3:"읍";s:2:"";s:3:"읏";s:2:"";s:3:"응";s:2:"";s:3:"읒";s:2:"";s:3:"읓";s:2:"";s:3:"읔";s:2:"";s:3:"읕";s:2:"";s:3:"읖";s:2:"";s:3:"읗";s:2:"";s:3:"의";s:2:"";s:3:"읜";s:2:"";s:3:"읠";s:2:"";s:3:"읨";s:2:"";s:3:"읫";s:2:"";s:3:"이";s:2:"";s:3:"익";s:2:"";s:3:"인";s:2:"";s:3:"일";s:2:"";s:3:"읽";s:2:"";s:3:"읾";s:2:"";s:3:"잃";s:2:"";s:3:"임";s:2:"";s:3:"입";s:2:"";s:3:"잇";s:2:"";s:3:"있";s:2:"";s:3:"잉";s:2:"";s:3:"잊";s:2:"";s:3:"잎";s:2:"";s:3:"자";s:2:"";s:3:"작";s:2:"";s:3:"잔";s:2:"";s:3:"잖";s:2:"";s:3:"잗";s:2:"";s:3:"잘";s:2:"";s:3:"잚";s:2:"";s:3:"잠";s:2:"";s:3:"잡";s:2:"";s:3:"잣";s:2:"";s:3:"잤";s:2:"";s:3:"장";s:2:"";s:3:"잦";s:2:"";s:3:"재";s:2:"";s:3:"잭";s:2:"";s:3:"잰";s:2:"";s:3:"잴";s:2:"";s:3:"잼";s:2:"";s:3:"잽";s:2:"";s:3:"잿";s:2:"";s:3:"쟀";s:2:"";s:3:"쟁";s:2:"";s:3:"쟈";s:2:"";s:3:"쟉";s:2:"";s:3:"쟌";s:2:"";s:3:"쟎";s:2:"";s:3:"쟐";s:2:"";s:3:"쟘";s:2:"";s:3:"쟝";s:2:"";s:3:"쟤";s:2:"";s:3:"쟨";s:2:"";s:3:"쟬";s:2:"";s:3:"저";s:2:"";s:3:"적";s:2:"";s:3:"전";s:2:"";s:3:"절";s:2:"";s:3:"젊";s:2:"A";s:3:"핤";s:2:"B";s:3:"핦";s:2:"C";s:3:"핧";s:2:"D";s:3:"핪";s:2:"E";s:3:"핬";s:2:"F";s:3:"핮";s:2:"G";s:3:"핯";s:2:"H";s:3:"핰";s:2:"I";s:3:"핱";s:2:"J";s:3:"핲";s:2:"K";s:3:"핳";s:2:"L";s:3:"핶";s:2:"M";s:3:"핷";s:2:"N";s:3:"핹";s:2:"O";s:3:"핺";s:2:"P";s:3:"핻";s:2:"Q";s:3:"핽";s:2:"R";s:3:"핾";s:2:"S";s:3:"핿";s:2:"T";s:3:"햀";s:2:"U";s:3:"햁";s:2:"V";s:3:"햂";s:2:"W";s:3:"햃";s:2:"X";s:3:"햆";s:2:"Y";s:3:"햊";s:2:"Z";s:3:"햋";s:2:"a";s:3:"햌";s:2:"b";s:3:"햍";s:2:"c";s:3:"햎";s:2:"d";s:3:"햏";s:2:"e";s:3:"햑";s:2:"f";s:3:"햒";s:2:"g";s:3:"햓";s:2:"h";s:3:"햔";s:2:"i";s:3:"햕";s:2:"j";s:3:"햖";s:2:"k";s:3:"햗";s:2:"l";s:3:"햘";s:2:"m";s:3:"햙";s:2:"n";s:3:"햚";s:2:"o";s:3:"햛";s:2:"p";s:3:"햜";s:2:"q";s:3:"햝";s:2:"r";s:3:"햞";s:2:"s";s:3:"햟";s:2:"t";s:3:"햠";s:2:"u";s:3:"햡";s:2:"v";s:3:"햢";s:2:"w";s:3:"햣";s:2:"x";s:3:"햤";s:2:"y";s:3:"햦";s:2:"z";s:3:"햧";s:2:"";s:3:"햨";s:2:"";s:3:"햩";s:2:"";s:3:"햪";s:2:"";s:3:"햫";s:2:"";s:3:"햬";s:2:"";s:3:"햭";s:2:"";s:3:"햮";s:2:"";s:3:"햯";s:2:"";s:3:"햰";s:2:"";s:3:"햱";s:2:"";s:3:"햲";s:2:"";s:3:"햳";s:2:"";s:3:"햴";s:2:"";s:3:"햵";s:2:"";s:3:"햶";s:2:"";s:3:"햷";s:2:"";s:3:"햸";s:2:"";s:3:"햹";s:2:"";s:3:"햺";s:2:"";s:3:"햻";s:2:"";s:3:"햼";s:2:"";s:3:"햽";s:2:"";s:3:"햾";s:2:"";s:3:"햿";s:2:"";s:3:"헀";s:2:"";s:3:"헁";s:2:"";s:3:"헂";s:2:"";s:3:"헃";s:2:"";s:3:"헄";s:2:"";s:3:"헅";s:2:"";s:3:"헆";s:2:"";s:3:"헇";s:2:"";s:3:"점";s:2:"";s:3:"접";s:2:"";s:3:"젓";s:2:"";s:3:"정";s:2:"";s:3:"젖";s:2:"";s:3:"제";s:2:"";s:3:"젝";s:2:"";s:3:"젠";s:2:"";s:3:"젤";s:2:"";s:3:"젬";s:2:"";s:3:"젭";s:2:"";s:3:"젯";s:2:"";s:3:"젱";s:2:"";s:3:"져";s:2:"";s:3:"젼";s:2:"";s:3:"졀";s:2:"";s:3:"졈";s:2:"";s:3:"졉";s:2:"";s:3:"졌";s:2:"";s:3:"졍";s:2:"";s:3:"졔";s:2:"";s:3:"조";s:2:"";s:3:"족";s:2:"";s:3:"존";s:2:"";s:3:"졸";s:2:"";s:3:"졺";s:2:"";s:3:"좀";s:2:"";s:3:"좁";s:2:"";s:3:"좃";s:2:"";s:3:"종";s:2:"";s:3:"좆";s:2:"";s:3:"좇";s:2:"";s:3:"좋";s:2:"";s:3:"좌";s:2:"";s:3:"좍";s:2:"";s:3:"좔";s:2:"";s:3:"좝";s:2:"";s:3:"좟";s:2:"";s:3:"좡";s:2:"";s:3:"좨";s:2:"";s:3:"좼";s:2:"";s:3:"좽";s:2:"";s:3:"죄";s:2:"";s:3:"죈";s:2:"";s:3:"죌";s:2:"";s:3:"죔";s:2:"";s:3:"죕";s:2:"";s:3:"죗";s:2:"";s:3:"죙";s:2:"";s:3:"죠";s:2:"";s:3:"죡";s:2:"";s:3:"죤";s:2:"";s:3:"죵";s:2:"";s:3:"주";s:2:"";s:3:"죽";s:2:"";s:3:"준";s:2:"";s:3:"줄";s:2:"";s:3:"줅";s:2:"";s:3:"줆";s:2:"";s:3:"줌";s:2:"";s:3:"줍";s:2:"";s:3:"줏";s:2:"";s:3:"중";s:2:"";s:3:"줘";s:2:"";s:3:"줬";s:2:"";s:3:"줴";s:2:"";s:3:"쥐";s:2:"";s:3:"쥑";s:2:"";s:3:"쥔";s:2:"";s:3:"쥘";s:2:"";s:3:"쥠";s:2:"";s:3:"쥡";s:2:"";s:3:"쥣";s:2:"";s:3:"쥬";s:2:"";s:3:"쥰";s:2:"";s:3:"쥴";s:2:"";s:3:"쥼";s:2:"";s:3:"즈";s:2:"";s:3:"즉";s:2:"";s:3:"즌";s:2:"";s:3:"즐";s:2:"";s:3:"즘";s:2:"";s:3:"즙";s:2:"";s:3:"즛";s:2:"";s:3:"증";s:2:"";s:3:"지";s:2:"";s:3:"직";s:2:"";s:3:"진";s:2:"";s:3:"짇";s:2:"";s:3:"질";s:2:"";s:3:"짊";s:2:"";s:3:"짐";s:2:"";s:3:"집";s:2:"";s:3:"짓";s:2:"A";s:3:"헊";s:2:"B";s:3:"헋";s:2:"C";s:3:"헍";s:2:"D";s:3:"헎";s:2:"E";s:3:"헏";s:2:"F";s:3:"헑";s:2:"G";s:3:"헓";s:2:"H";s:3:"헔";s:2:"I";s:3:"헕";s:2:"J";s:3:"헖";s:2:"K";s:3:"헗";s:2:"L";s:3:"헚";s:2:"M";s:3:"헜";s:2:"N";s:3:"헞";s:2:"O";s:3:"헟";s:2:"P";s:3:"헠";s:2:"Q";s:3:"헡";s:2:"R";s:3:"헢";s:2:"S";s:3:"헣";s:2:"T";s:3:"헦";s:2:"U";s:3:"헧";s:2:"V";s:3:"헩";s:2:"W";s:3:"헪";s:2:"X";s:3:"헫";s:2:"Y";s:3:"헭";s:2:"Z";s:3:"헮";s:2:"a";s:3:"헯";s:2:"b";s:3:"헰";s:2:"c";s:3:"헱";s:2:"d";s:3:"헲";s:2:"e";s:3:"헳";s:2:"f";s:3:"헶";s:2:"g";s:3:"헸";s:2:"h";s:3:"헺";s:2:"i";s:3:"헻";s:2:"j";s:3:"헼";s:2:"k";s:3:"헽";s:2:"l";s:3:"헾";s:2:"m";s:3:"헿";s:2:"n";s:3:"혂";s:2:"o";s:3:"혃";s:2:"p";s:3:"혅";s:2:"q";s:3:"혆";s:2:"r";s:3:"혇";s:2:"s";s:3:"혉";s:2:"t";s:3:"혊";s:2:"u";s:3:"혋";s:2:"v";s:3:"혌";s:2:"w";s:3:"혍";s:2:"x";s:3:"혎";s:2:"y";s:3:"혏";s:2:"z";s:3:"혒";s:2:"";s:3:"혖";s:2:"";s:3:"혗";s:2:"";s:3:"혘";s:2:"";s:3:"혙";s:2:"";s:3:"혚";s:2:"";s:3:"혛";s:2:"";s:3:"혝";s:2:"";s:3:"혞";s:2:"";s:3:"혟";s:2:"";s:3:"혡";s:2:"";s:3:"혢";s:2:"";s:3:"혣";s:2:"";s:3:"혥";s:2:"";s:3:"혦";s:2:"";s:3:"혧";s:2:"";s:3:"혨";s:2:"";s:3:"혩";s:2:"";s:3:"혪";s:2:"";s:3:"혫";s:2:"";s:3:"혬";s:2:"";s:3:"혮";s:2:"";s:3:"혯";s:2:"";s:3:"혰";s:2:"";s:3:"혱";s:2:"";s:3:"혲";s:2:"";s:3:"혳";s:2:"";s:3:"혴";s:2:"";s:3:"혵";s:2:"";s:3:"혶";s:2:"";s:3:"혷";s:2:"";s:3:"혺";s:2:" ";s:3:"혻";s:2:"¡";s:3:"징";s:2:"¢";s:3:"짖";s:2:"£";s:3:"짙";s:2:"¤";s:3:"짚";s:2:"¥";s:3:"짜";s:2:"¦";s:3:"짝";s:2:"§";s:3:"짠";s:2:"¨";s:3:"짢";s:2:"©";s:3:"짤";s:2:"ª";s:3:"짧";s:2:"«";s:3:"짬";s:2:"¬";s:3:"짭";s:2:"­";s:3:"짯";s:2:"®";s:3:"짰";s:2:"¯";s:3:"짱";s:2:"°";s:3:"째";s:2:"±";s:3:"짹";s:2:"²";s:3:"짼";s:2:"³";s:3:"쨀";s:2:"´";s:3:"쨈";s:2:"µ";s:3:"쨉";s:2:"¶";s:3:"쨋";s:2:"·";s:3:"쨌";s:2:"¸";s:3:"쨍";s:2:"¹";s:3:"쨔";s:2:"º";s:3:"쨘";s:2:"»";s:3:"쨩";s:2:"¼";s:3:"쩌";s:2:"½";s:3:"쩍";s:2:"¾";s:3:"쩐";s:2:"¿";s:3:"쩔";s:2:"";s:3:"쩜";s:2:"";s:3:"쩝";s:2:"";s:3:"쩟";s:2:"";s:3:"쩠";s:2:"";s:3:"쩡";s:2:"";s:3:"쩨";s:2:"";s:3:"쩽";s:2:"";s:3:"쪄";s:2:"";s:3:"쪘";s:2:"";s:3:"쪼";s:2:"";s:3:"쪽";s:2:"";s:3:"쫀";s:2:"";s:3:"쫄";s:2:"";s:3:"쫌";s:2:"";s:3:"쫍";s:2:"";s:3:"쫏";s:2:"";s:3:"쫑";s:2:"";s:3:"쫓";s:2:"";s:3:"쫘";s:2:"";s:3:"쫙";s:2:"";s:3:"쫠";s:2:"";s:3:"쫬";s:2:"";s:3:"쫴";s:2:"";s:3:"쬈";s:2:"";s:3:"쬐";s:2:"";s:3:"쬔";s:2:"";s:3:"쬘";s:2:"";s:3:"쬠";s:2:"";s:3:"쬡";s:2:"";s:3:"쭁";s:2:"";s:3:"쭈";s:2:"";s:3:"쭉";s:2:"";s:3:"쭌";s:2:"";s:3:"쭐";s:2:"";s:3:"쭘";s:2:"";s:3:"쭙";s:2:"";s:3:"쭝";s:2:"";s:3:"쭤";s:2:"";s:3:"쭸";s:2:"";s:3:"쭹";s:2:"";s:3:"쮜";s:2:"";s:3:"쮸";s:2:"";s:3:"쯔";s:2:"";s:3:"쯤";s:2:"";s:3:"쯧";s:2:"";s:3:"쯩";s:2:"";s:3:"찌";s:2:"";s:3:"찍";s:2:"";s:3:"찐";s:2:"";s:3:"찔";s:2:"";s:3:"찜";s:2:"";s:3:"찝";s:2:"";s:3:"찡";s:2:"";s:3:"찢";s:2:"";s:3:"찧";s:2:"";s:3:"차";s:2:"";s:3:"착";s:2:"";s:3:"찬";s:2:"";s:3:"찮";s:2:"";s:3:"찰";s:2:"";s:3:"참";s:2:"";s:3:"찹";s:2:"";s:3:"찻";s:2:"A";s:3:"혽";s:2:"B";s:3:"혾";s:2:"C";s:3:"혿";s:2:"D";s:3:"홁";s:2:"E";s:3:"홂";s:2:"F";s:3:"홃";s:2:"G";s:3:"홄";s:2:"H";s:3:"홆";s:2:"I";s:3:"홇";s:2:"J";s:3:"홊";s:2:"K";s:3:"홌";s:2:"L";s:3:"홎";s:2:"M";s:3:"홏";s:2:"N";s:3:"홐";s:2:"O";s:3:"홒";s:2:"P";s:3:"홓";s:2:"Q";s:3:"홖";s:2:"R";s:3:"홗";s:2:"S";s:3:"홙";s:2:"T";s:3:"홚";s:2:"U";s:3:"홛";s:2:"V";s:3:"홝";s:2:"W";s:3:"홞";s:2:"X";s:3:"홟";s:2:"Y";s:3:"홠";s:2:"Z";s:3:"홡";s:2:"a";s:3:"홢";s:2:"b";s:3:"홣";s:2:"c";s:3:"홤";s:2:"d";s:3:"홥";s:2:"e";s:3:"홦";s:2:"f";s:3:"홨";s:2:"g";s:3:"홪";s:2:"h";s:3:"홫";s:2:"i";s:3:"홬";s:2:"j";s:3:"홭";s:2:"k";s:3:"홮";s:2:"l";s:3:"홯";s:2:"m";s:3:"홲";s:2:"n";s:3:"홳";s:2:"o";s:3:"홵";s:2:"p";s:3:"홶";s:2:"q";s:3:"홷";s:2:"r";s:3:"홸";s:2:"s";s:3:"홹";s:2:"t";s:3:"홺";s:2:"u";s:3:"홻";s:2:"v";s:3:"홼";s:2:"w";s:3:"홽";s:2:"x";s:3:"홾";s:2:"y";s:3:"홿";s:2:"z";s:3:"횀";s:2:"Á";s:3:"횁";s:2:"Â";s:3:"횂";s:2:"Ã";s:3:"횄";s:2:"Ä";s:3:"횆";s:2:"Å";s:3:"횇";s:2:"Æ";s:3:"횈";s:2:"Ç";s:3:"횉";s:2:"È";s:3:"횊";s:2:"É";s:3:"횋";s:2:"Ê";s:3:"횎";s:2:"Ë";s:3:"횏";s:2:"Ì";s:3:"횑";s:2:"Í";s:3:"횒";s:2:"Î";s:3:"횓";s:2:"Ï";s:3:"횕";s:2:"Ð";s:3:"횖";s:2:"Ñ";s:3:"횗";s:2:"Ò";s:3:"횘";s:2:"Ó";s:3:"횙";s:2:"Ô";s:3:"횚";s:2:"Õ";s:3:"횛";s:2:"Ö";s:3:"횜";s:2:"×";s:3:"횞";s:2:"Ø";s:3:"횠";s:2:"Ù";s:3:"횢";s:2:"Ú";s:3:"횣";s:2:"Û";s:3:"횤";s:2:"Ü";s:3:"횥";s:2:"Ý";s:3:"횦";s:2:"Þ";s:3:"횧";s:2:"ß";s:3:"횩";s:2:"à";s:3:"횪";s:2:"á";s:3:"찼";s:2:"â";s:3:"창";s:2:"ã";s:3:"찾";s:2:"ä";s:3:"채";s:2:"å";s:3:"책";s:2:"æ";s:3:"챈";s:2:"ç";s:3:"챌";s:2:"è";s:3:"챔";s:2:"é";s:3:"챕";s:2:"ê";s:3:"챗";s:2:"ë";s:3:"챘";s:2:"ì";s:3:"챙";s:2:"í";s:3:"챠";s:2:"î";s:3:"챤";s:2:"ï";s:3:"챦";s:2:"ð";s:3:"챨";s:2:"ñ";s:3:"챰";s:2:"ò";s:3:"챵";s:2:"ó";s:3:"처";s:2:"ô";s:3:"척";s:2:"õ";s:3:"천";s:2:"ö";s:3:"철";s:2:"÷";s:3:"첨";s:2:"ø";s:3:"첩";s:2:"ù";s:3:"첫";s:2:"ú";s:3:"첬";s:2:"û";s:3:"청";s:2:"ü";s:3:"체";s:2:"ý";s:3:"첵";s:2:"þ";s:3:"첸";s:2:"ÿ";s:3:"첼";s:2:"";s:3:"쳄";s:2:"";s:3:"쳅";s:2:"";s:3:"쳇";s:2:"";s:3:"쳉";s:2:"";s:3:"쳐";s:2:"";s:3:"쳔";s:2:"";s:3:"쳤";s:2:"";s:3:"쳬";s:2:"";s:3:"쳰";s:2:"";s:3:"촁";s:2:"";s:3:"초";s:2:"";s:3:"촉";s:2:"";s:3:"촌";s:2:"";s:3:"촐";s:2:"";s:3:"촘";s:2:"";s:3:"촙";s:2:"";s:3:"촛";s:2:"";s:3:"총";s:2:"";s:3:"촤";s:2:"";s:3:"촨";s:2:"";s:3:"촬";s:2:"";s:3:"촹";s:2:"";s:3:"최";s:2:"";s:3:"쵠";s:2:"";s:3:"쵤";s:2:"";s:3:"쵬";s:2:"";s:3:"쵭";s:2:"";s:3:"쵯";s:2:"";s:3:"쵱";s:2:"";s:3:"쵸";s:2:"";s:3:"춈";s:2:"";s:3:"추";s:2:"";s:3:"축";s:2:"";s:3:"춘";s:2:"";s:3:"출";s:2:"";s:3:"춤";s:2:"";s:3:"춥";s:2:"";s:3:"춧";s:2:"";s:3:"충";s:2:"";s:3:"춰";s:2:"";s:3:"췄";s:2:"";s:3:"췌";s:2:"";s:3:"췐";s:2:"";s:3:"취";s:2:"";s:3:"췬";s:2:"";s:3:"췰";s:2:"";s:3:"췸";s:2:"";s:3:"췹";s:2:"";s:3:"췻";s:2:"";s:3:"췽";s:2:"";s:3:"츄";s:2:"";s:3:"츈";s:2:"";s:3:"츌";s:2:"";s:3:"츔";s:2:"";s:3:"츙";s:2:"";s:3:"츠";s:2:"";s:3:"측";s:2:"";s:3:"츤";s:2:"";s:3:"츨";s:2:"";s:3:"츰";s:2:"";s:3:"츱";s:2:"";s:3:"츳";s:2:"";s:3:"층";s:2:"A";s:3:"횫";s:2:"B";s:3:"횭";s:2:"C";s:3:"횮";s:2:"D";s:3:"횯";s:2:"E";s:3:"횱";s:2:"F";s:3:"횲";s:2:"G";s:3:"횳";s:2:"H";s:3:"횴";s:2:"I";s:3:"횵";s:2:"J";s:3:"횶";s:2:"K";s:3:"횷";s:2:"L";s:3:"횸";s:2:"M";s:3:"횺";s:2:"N";s:3:"횼";s:2:"O";s:3:"횽";s:2:"P";s:3:"횾";s:2:"Q";s:3:"횿";s:2:"R";s:3:"훀";s:2:"S";s:3:"훁";s:2:"T";s:3:"훂";s:2:"U";s:3:"훃";s:2:"V";s:3:"훆";s:2:"W";s:3:"훇";s:2:"X";s:3:"훉";s:2:"Y";s:3:"훊";s:2:"Z";s:3:"훋";s:2:"a";s:3:"훍";s:2:"b";s:3:"훎";s:2:"c";s:3:"훏";s:2:"d";s:3:"훐";s:2:"e";s:3:"훒";s:2:"f";s:3:"훓";s:2:"g";s:3:"훕";s:2:"h";s:3:"훖";s:2:"i";s:3:"훘";s:2:"j";s:3:"훚";s:2:"k";s:3:"훛";s:2:"l";s:3:"훜";s:2:"m";s:3:"훝";s:2:"n";s:3:"훞";s:2:"o";s:3:"훟";s:2:"p";s:3:"훡";s:2:"q";s:3:"훢";s:2:"r";s:3:"훣";s:2:"s";s:3:"훥";s:2:"t";s:3:"훦";s:2:"u";s:3:"훧";s:2:"v";s:3:"훩";s:2:"w";s:3:"훪";s:2:"x";s:3:"훫";s:2:"y";s:3:"훬";s:2:"z";s:3:"훭";s:2:"ā";s:3:"훮";s:2:"Ă";s:3:"훯";s:2:"ă";s:3:"훱";s:2:"Ą";s:3:"훲";s:2:"ą";s:3:"훳";s:2:"Ć";s:3:"훴";s:2:"ć";s:3:"훶";s:2:"Ĉ";s:3:"훷";s:2:"ĉ";s:3:"훸";s:2:"Ċ";s:3:"훹";s:2:"ċ";s:3:"훺";s:2:"Č";s:3:"훻";s:2:"č";s:3:"훾";s:2:"Ď";s:3:"훿";s:2:"ď";s:3:"휁";s:2:"Đ";s:3:"휂";s:2:"đ";s:3:"휃";s:2:"Ē";s:3:"휅";s:2:"ē";s:3:"휆";s:2:"Ĕ";s:3:"휇";s:2:"ĕ";s:3:"휈";s:2:"Ė";s:3:"휉";s:2:"ė";s:3:"휊";s:2:"Ę";s:3:"휋";s:2:"ę";s:3:"휌";s:2:"Ě";s:3:"휍";s:2:"ě";s:3:"휎";s:2:"Ĝ";s:3:"휏";s:2:"ĝ";s:3:"휐";s:2:"Ğ";s:3:"휒";s:2:"ğ";s:3:"휓";s:2:"Ġ";s:3:"휔";s:2:"ġ";s:3:"치";s:2:"Ģ";s:3:"칙";s:2:"ģ";s:3:"친";s:2:"Ĥ";s:3:"칟";s:2:"ĥ";s:3:"칠";s:2:"Ħ";s:3:"칡";s:2:"ħ";s:3:"침";s:2:"Ĩ";s:3:"칩";s:2:"ĩ";s:3:"칫";s:2:"Ī";s:3:"칭";s:2:"ī";s:3:"카";s:2:"Ĭ";s:3:"칵";s:2:"ĭ";s:3:"칸";s:2:"Į";s:3:"칼";s:2:"į";s:3:"캄";s:2:"İ";s:3:"캅";s:2:"ı";s:3:"캇";s:2:"Ĳ";s:3:"캉";s:2:"ĳ";s:3:"캐";s:2:"Ĵ";s:3:"캑";s:2:"ĵ";s:3:"캔";s:2:"Ķ";s:3:"캘";s:2:"ķ";s:3:"캠";s:2:"ĸ";s:3:"캡";s:2:"Ĺ";s:3:"캣";s:2:"ĺ";s:3:"캤";s:2:"Ļ";s:3:"캥";s:2:"ļ";s:3:"캬";s:2:"Ľ";s:3:"캭";s:2:"ľ";s:3:"컁";s:2:"Ŀ";s:3:"커";s:2:"";s:3:"컥";s:2:"";s:3:"컨";s:2:"";s:3:"컫";s:2:"";s:3:"컬";s:2:"";s:3:"컴";s:2:"";s:3:"컵";s:2:"";s:3:"컷";s:2:"";s:3:"컸";s:2:"";s:3:"컹";s:2:"";s:3:"케";s:2:"";s:3:"켁";s:2:"";s:3:"켄";s:2:"";s:3:"켈";s:2:"";s:3:"켐";s:2:"";s:3:"켑";s:2:"";s:3:"켓";s:2:"";s:3:"켕";s:2:"";s:3:"켜";s:2:"";s:3:"켠";s:2:"";s:3:"켤";s:2:"";s:3:"켬";s:2:"";s:3:"켭";s:2:"";s:3:"켯";s:2:"";s:3:"켰";s:2:"";s:3:"켱";s:2:"";s:3:"켸";s:2:"";s:3:"코";s:2:"";s:3:"콕";s:2:"";s:3:"콘";s:2:"";s:3:"콜";s:2:"";s:3:"콤";s:2:"";s:3:"콥";s:2:"";s:3:"콧";s:2:"";s:3:"콩";s:2:"";s:3:"콰";s:2:"";s:3:"콱";s:2:"";s:3:"콴";s:2:"";s:3:"콸";s:2:"";s:3:"쾀";s:2:"";s:3:"쾅";s:2:"";s:3:"쾌";s:2:"";s:3:"쾡";s:2:"";s:3:"쾨";s:2:"";s:3:"쾰";s:2:"";s:3:"쿄";s:2:"";s:3:"쿠";s:2:"";s:3:"쿡";s:2:"";s:3:"쿤";s:2:"";s:3:"쿨";s:2:"";s:3:"쿰";s:2:"";s:3:"쿱";s:2:"";s:3:"쿳";s:2:"";s:3:"쿵";s:2:"";s:3:"쿼";s:2:"";s:3:"퀀";s:2:"";s:3:"퀄";s:2:"";s:3:"퀑";s:2:"";s:3:"퀘";s:2:"";s:3:"퀭";s:2:"";s:3:"퀴";s:2:"";s:3:"퀵";s:2:"";s:3:"퀸";s:2:"";s:3:"퀼";s:2:"A";s:3:"휕";s:2:"B";s:3:"휖";s:2:"C";s:3:"휗";s:2:"D";s:3:"휚";s:2:"E";s:3:"휛";s:2:"F";s:3:"휝";s:2:"G";s:3:"휞";s:2:"H";s:3:"휟";s:2:"I";s:3:"휡";s:2:"J";s:3:"휢";s:2:"K";s:3:"휣";s:2:"L";s:3:"휤";s:2:"M";s:3:"휥";s:2:"N";s:3:"휦";s:2:"O";s:3:"휧";s:2:"P";s:3:"휪";s:2:"Q";s:3:"휬";s:2:"R";s:3:"휮";s:2:"S";s:3:"휯";s:2:"T";s:3:"휰";s:2:"U";s:3:"휱";s:2:"V";s:3:"휲";s:2:"W";s:3:"휳";s:2:"X";s:3:"휶";s:2:"Y";s:3:"휷";s:2:"Z";s:3:"휹";s:2:"a";s:3:"휺";s:2:"b";s:3:"휻";s:2:"c";s:3:"휽";s:2:"d";s:3:"휾";s:2:"e";s:3:"휿";s:2:"f";s:3:"흀";s:2:"g";s:3:"흁";s:2:"h";s:3:"흂";s:2:"i";s:3:"흃";s:2:"j";s:3:"흅";s:2:"k";s:3:"흆";s:2:"l";s:3:"흈";s:2:"m";s:3:"흊";s:2:"n";s:3:"흋";s:2:"o";s:3:"흌";s:2:"p";s:3:"흍";s:2:"q";s:3:"흎";s:2:"r";s:3:"흏";s:2:"s";s:3:"흒";s:2:"t";s:3:"흓";s:2:"u";s:3:"흕";s:2:"v";s:3:"흚";s:2:"w";s:3:"흛";s:2:"x";s:3:"흜";s:2:"y";s:3:"흝";s:2:"z";s:3:"흞";s:2:"Ł";s:3:"흟";s:2:"ł";s:3:"흢";s:2:"Ń";s:3:"흤";s:2:"ń";s:3:"흦";s:2:"Ņ";s:3:"흧";s:2:"ņ";s:3:"흨";s:2:"Ň";s:3:"흪";s:2:"ň";s:3:"흫";s:2:"ŉ";s:3:"흭";s:2:"Ŋ";s:3:"흮";s:2:"ŋ";s:3:"흯";s:2:"Ō";s:3:"흱";s:2:"ō";s:3:"흲";s:2:"Ŏ";s:3:"흳";s:2:"ŏ";s:3:"흵";s:2:"Ő";s:3:"흶";s:2:"ő";s:3:"흷";s:2:"Œ";s:3:"흸";s:2:"œ";s:3:"흹";s:2:"Ŕ";s:3:"흺";s:2:"ŕ";s:3:"흻";s:2:"Ŗ";s:3:"흾";s:2:"ŗ";s:3:"흿";s:2:"Ř";s:3:"힀";s:2:"ř";s:3:"힂";s:2:"Ś";s:3:"힃";s:2:"ś";s:3:"힄";s:2:"Ŝ";s:3:"힅";s:2:"ŝ";s:3:"힆";s:2:"Ş";s:3:"힇";s:2:"ş";s:3:"힊";s:2:"Š";s:3:"힋";s:2:"š";s:3:"큄";s:2:"Ţ";s:3:"큅";s:2:"ţ";s:3:"큇";s:2:"Ť";s:3:"큉";s:2:"ť";s:3:"큐";s:2:"Ŧ";s:3:"큔";s:2:"ŧ";s:3:"큘";s:2:"Ũ";s:3:"큠";s:2:"ũ";s:3:"크";s:2:"Ū";s:3:"큭";s:2:"ū";s:3:"큰";s:2:"Ŭ";s:3:"클";s:2:"ŭ";s:3:"큼";s:2:"Ů";s:3:"큽";s:2:"ů";s:3:"킁";s:2:"Ű";s:3:"키";s:2:"ű";s:3:"킥";s:2:"Ų";s:3:"킨";s:2:"ų";s:3:"킬";s:2:"Ŵ";s:3:"킴";s:2:"ŵ";s:3:"킵";s:2:"Ŷ";s:3:"킷";s:2:"ŷ";s:3:"킹";s:2:"Ÿ";s:3:"타";s:2:"Ź";s:3:"탁";s:2:"ź";s:3:"탄";s:2:"Ż";s:3:"탈";s:2:"ż";s:3:"탉";s:2:"Ž";s:3:"탐";s:2:"ž";s:3:"탑";s:2:"ſ";s:3:"탓";s:2:"";s:3:"탔";s:2:"";s:3:"탕";s:2:"";s:3:"태";s:2:"";s:3:"택";s:2:"";s:3:"탠";s:2:"";s:3:"탤";s:2:"";s:3:"탬";s:2:"";s:3:"탭";s:2:"";s:3:"탯";s:2:"";s:3:"탰";s:2:"";s:3:"탱";s:2:"";s:3:"탸";s:2:"";s:3:"턍";s:2:"";s:3:"터";s:2:"";s:3:"턱";s:2:"";s:3:"턴";s:2:"";s:3:"털";s:2:"";s:3:"턺";s:2:"";s:3:"텀";s:2:"";s:3:"텁";s:2:"";s:3:"텃";s:2:"";s:3:"텄";s:2:"";s:3:"텅";s:2:"";s:3:"테";s:2:"";s:3:"텍";s:2:"";s:3:"텐";s:2:"";s:3:"텔";s:2:"";s:3:"템";s:2:"";s:3:"텝";s:2:"";s:3:"텟";s:2:"";s:3:"텡";s:2:"";s:3:"텨";s:2:"";s:3:"텬";s:2:"";s:3:"텼";s:2:"";s:3:"톄";s:2:"";s:3:"톈";s:2:"";s:3:"토";s:2:"";s:3:"톡";s:2:"";s:3:"톤";s:2:"";s:3:"톨";s:2:"";s:3:"톰";s:2:"";s:3:"톱";s:2:"";s:3:"톳";s:2:"";s:3:"통";s:2:"";s:3:"톺";s:2:"";s:3:"톼";s:2:"";s:3:"퇀";s:2:"";s:3:"퇘";s:2:"";s:3:"퇴";s:2:"";s:3:"퇸";s:2:"";s:3:"툇";s:2:"";s:3:"툉";s:2:"";s:3:"툐";s:2:"";s:3:"투";s:2:"";s:3:"툭";s:2:"";s:3:"툰";s:2:"";s:3:"툴";s:2:"";s:3:"툼";s:2:"";s:3:"툽";s:2:"";s:3:"툿";s:2:"";s:3:"퉁";s:2:"";s:3:"퉈";s:2:"";s:3:"퉜";s:2:"A";s:3:"힍";s:2:"B";s:3:"힎";s:2:"C";s:3:"힏";s:2:"D";s:3:"힑";s:2:"E";s:3:"힒";s:2:"F";s:3:"힓";s:2:"G";s:3:"힔";s:2:"H";s:3:"힕";s:2:"I";s:3:"힖";s:2:"J";s:3:"힗";s:2:"K";s:3:"힚";s:2:"L";s:3:"힜";s:2:"M";s:3:"힞";s:2:"N";s:3:"힟";s:2:"O";s:3:"힠";s:2:"P";s:3:"힡";s:2:"Q";s:3:"힢";s:2:"R";s:3:"힣";s:2:"ơ";s:3:"퉤";s:2:"Ƣ";s:3:"튀";s:2:"ƣ";s:3:"튁";s:2:"Ƥ";s:3:"튄";s:2:"ƥ";s:3:"튈";s:2:"Ʀ";s:3:"튐";s:2:"Ƨ";s:3:"튑";s:2:"ƨ";s:3:"튕";s:2:"Ʃ";s:3:"튜";s:2:"ƪ";s:3:"튠";s:2:"ƫ";s:3:"튤";s:2:"Ƭ";s:3:"튬";s:2:"ƭ";s:3:"튱";s:2:"Ʈ";s:3:"트";s:2:"Ư";s:3:"특";s:2:"ư";s:3:"튼";s:2:"Ʊ";s:3:"튿";s:2:"Ʋ";s:3:"틀";s:2:"Ƴ";s:3:"틂";s:2:"ƴ";s:3:"틈";s:2:"Ƶ";s:3:"틉";s:2:"ƶ";s:3:"틋";s:2:"Ʒ";s:3:"틔";s:2:"Ƹ";s:3:"틘";s:2:"ƹ";s:3:"틜";s:2:"ƺ";s:3:"틤";s:2:"ƻ";s:3:"틥";s:2:"Ƽ";s:3:"티";s:2:"ƽ";s:3:"틱";s:2:"ƾ";s:3:"틴";s:2:"ƿ";s:3:"틸";s:2:"";s:3:"팀";s:2:"";s:3:"팁";s:2:"";s:3:"팃";s:2:"";s:3:"팅";s:2:"";s:3:"파";s:2:"";s:3:"팍";s:2:"";s:3:"팎";s:2:"";s:3:"판";s:2:"";s:3:"팔";s:2:"";s:3:"팖";s:2:"";s:3:"팜";s:2:"";s:3:"팝";s:2:"";s:3:"팟";s:2:"";s:3:"팠";s:2:"";s:3:"팡";s:2:"";s:3:"팥";s:2:"";s:3:"패";s:2:"";s:3:"팩";s:2:"";s:3:"팬";s:2:"";s:3:"팰";s:2:"";s:3:"팸";s:2:"";s:3:"팹";s:2:"";s:3:"팻";s:2:"";s:3:"팼";s:2:"";s:3:"팽";s:2:"";s:3:"퍄";s:2:"";s:3:"퍅";s:2:"";s:3:"퍼";s:2:"";s:3:"퍽";s:2:"";s:3:"펀";s:2:"";s:3:"펄";s:2:"";s:3:"펌";s:2:"";s:3:"펍";s:2:"";s:3:"펏";s:2:"";s:3:"펐";s:2:"";s:3:"펑";s:2:"";s:3:"페";s:2:"";s:3:"펙";s:2:"";s:3:"펜";s:2:"";s:3:"펠";s:2:"";s:3:"펨";s:2:"";s:3:"펩";s:2:"";s:3:"펫";s:2:"";s:3:"펭";s:2:"";s:3:"펴";s:2:"";s:3:"편";s:2:"";s:3:"펼";s:2:"";s:3:"폄";s:2:"";s:3:"폅";s:2:"";s:3:"폈";s:2:"";s:3:"평";s:2:"";s:3:"폐";s:2:"";s:3:"폘";s:2:"";s:3:"폡";s:2:"";s:3:"폣";s:2:"";s:3:"포";s:2:"";s:3:"폭";s:2:"";s:3:"폰";s:2:"";s:3:"폴";s:2:"";s:3:"폼";s:2:"";s:3:"폽";s:2:"";s:3:"폿";s:2:"";s:3:"퐁";s:2:"ǡ";s:3:"퐈";s:2:"Ǣ";s:3:"퐝";s:2:"ǣ";s:3:"푀";s:2:"Ǥ";s:3:"푄";s:2:"ǥ";s:3:"표";s:2:"Ǧ";s:3:"푠";s:2:"ǧ";s:3:"푤";s:2:"Ǩ";s:3:"푭";s:2:"ǩ";s:3:"푯";s:2:"Ǫ";s:3:"푸";s:2:"ǫ";s:3:"푹";s:2:"Ǭ";s:3:"푼";s:2:"ǭ";s:3:"푿";s:2:"Ǯ";s:3:"풀";s:2:"ǯ";s:3:"풂";s:2:"ǰ";s:3:"품";s:2:"Ǳ";s:3:"풉";s:2:"ǲ";s:3:"풋";s:2:"ǳ";s:3:"풍";s:2:"Ǵ";s:3:"풔";s:2:"ǵ";s:3:"풩";s:2:"Ƕ";s:3:"퓌";s:2:"Ƿ";s:3:"퓐";s:2:"Ǹ";s:3:"퓔";s:2:"ǹ";s:3:"퓜";s:2:"Ǻ";s:3:"퓟";s:2:"ǻ";s:3:"퓨";s:2:"Ǽ";s:3:"퓬";s:2:"ǽ";s:3:"퓰";s:2:"Ǿ";s:3:"퓸";s:2:"ǿ";s:3:"퓻";s:2:"";s:3:"퓽";s:2:"";s:3:"프";s:2:"";s:3:"픈";s:2:"";s:3:"플";s:2:"";s:3:"픔";s:2:"";s:3:"픕";s:2:"";s:3:"픗";s:2:"";s:3:"피";s:2:"";s:3:"픽";s:2:"";s:3:"핀";s:2:"";s:3:"필";s:2:"";s:3:"핌";s:2:"";s:3:"핍";s:2:"";s:3:"핏";s:2:"";s:3:"핑";s:2:"";s:3:"하";s:2:"";s:3:"학";s:2:"";s:3:"한";s:2:"";s:3:"할";s:2:"";s:3:"핥";s:2:"";s:3:"함";s:2:"";s:3:"합";s:2:"";s:3:"핫";s:2:"";s:3:"항";s:2:"";s:3:"해";s:2:"";s:3:"핵";s:2:"";s:3:"핸";s:2:"";s:3:"핼";s:2:"";s:3:"햄";s:2:"";s:3:"햅";s:2:"";s:3:"햇";s:2:"";s:3:"했";s:2:"";s:3:"행";s:2:"";s:3:"햐";s:2:"";s:3:"향";s:2:"";s:3:"허";s:2:"";s:3:"헉";s:2:"";s:3:"헌";s:2:"";s:3:"헐";s:2:"";s:3:"헒";s:2:"";s:3:"험";s:2:"";s:3:"헙";s:2:"";s:3:"헛";s:2:"";s:3:"헝";s:2:"";s:3:"헤";s:2:"";s:3:"헥";s:2:"";s:3:"헨";s:2:"";s:3:"헬";s:2:"";s:3:"헴";s:2:"";s:3:"헵";s:2:"";s:3:"헷";s:2:"";s:3:"헹";s:2:"";s:3:"혀";s:2:"";s:3:"혁";s:2:"";s:3:"현";s:2:"";s:3:"혈";s:2:"";s:3:"혐";s:2:"";s:3:"협";s:2:"";s:3:"혓";s:2:"";s:3:"혔";s:2:"";s:3:"형";s:2:"";s:3:"혜";s:2:"";s:3:"혠";s:2:"ȡ";s:3:"혤";s:2:"Ȣ";s:3:"혭";s:2:"ȣ";s:3:"호";s:2:"Ȥ";s:3:"혹";s:2:"ȥ";s:3:"혼";s:2:"Ȧ";s:3:"홀";s:2:"ȧ";s:3:"홅";s:2:"Ȩ";s:3:"홈";s:2:"ȩ";s:3:"홉";s:2:"Ȫ";s:3:"홋";s:2:"ȫ";s:3:"홍";s:2:"Ȭ";s:3:"홑";s:2:"ȭ";s:3:"화";s:2:"Ȯ";s:3:"확";s:2:"ȯ";s:3:"환";s:2:"Ȱ";s:3:"활";s:2:"ȱ";s:3:"홧";s:2:"Ȳ";s:3:"황";s:2:"ȳ";s:3:"홰";s:2:"ȴ";s:3:"홱";s:2:"ȵ";s:3:"홴";s:2:"ȶ";s:3:"횃";s:2:"ȷ";s:3:"횅";s:2:"ȸ";s:3:"회";s:2:"ȹ";s:3:"획";s:2:"Ⱥ";s:3:"횐";s:2:"Ȼ";s:3:"횔";s:2:"ȼ";s:3:"횝";s:2:"Ƚ";s:3:"횟";s:2:"Ⱦ";s:3:"횡";s:2:"ȿ";s:3:"효";s:2:"";s:3:"횬";s:2:"";s:3:"횰";s:2:"";s:3:"횹";s:2:"";s:3:"횻";s:2:"";s:3:"후";s:2:"";s:3:"훅";s:2:"";s:3:"훈";s:2:"";s:3:"훌";s:2:"";s:3:"훑";s:2:"";s:3:"훔";s:2:"";s:3:"훗";s:2:"";s:3:"훙";s:2:"";s:3:"훠";s:2:"";s:3:"훤";s:2:"";s:3:"훨";s:2:"";s:3:"훰";s:2:"";s:3:"훵";s:2:"";s:3:"훼";s:2:"";s:3:"훽";s:2:"";s:3:"휀";s:2:"";s:3:"휄";s:2:"";s:3:"휑";s:2:"";s:3:"휘";s:2:"";s:3:"휙";s:2:"";s:3:"휜";s:2:"";s:3:"휠";s:2:"";s:3:"휨";s:2:"";s:3:"휩";s:2:"";s:3:"휫";s:2:"";s:3:"휭";s:2:"";s:3:"휴";s:2:"";s:3:"휵";s:2:"";s:3:"휸";s:2:"";s:3:"휼";s:2:"";s:3:"흄";s:2:"";s:3:"흇";s:2:"";s:3:"흉";s:2:"";s:3:"흐";s:2:"";s:3:"흑";s:2:"";s:3:"흔";s:2:"";s:3:"흖";s:2:"";s:3:"흗";s:2:"";s:3:"흘";s:2:"";s:3:"흙";s:2:"";s:3:"흠";s:2:"";s:3:"흡";s:2:"";s:3:"흣";s:2:"";s:3:"흥";s:2:"";s:3:"흩";s:2:"";s:3:"희";s:2:"";s:3:"흰";s:2:"";s:3:"흴";s:2:"";s:3:"흼";s:2:"";s:3:"흽";s:2:"";s:3:"힁";s:2:"";s:3:"히";s:2:"";s:3:"힉";s:2:"";s:3:"힌";s:2:"";s:3:"힐";s:2:"";s:3:"힘";s:2:"";s:3:"힙";s:2:"";s:3:"힛";s:2:"";s:3:"힝";s:2:"ʡ";s:3:"伽";s:2:"ʢ";s:3:"佳";s:2:"ʣ";s:3:"假";s:2:"ʤ";s:3:"價";s:2:"ʥ";s:3:"加";s:2:"ʦ";s:3:"可";s:2:"ʧ";s:3:"呵";s:2:"ʨ";s:3:"哥";s:2:"ʩ";s:3:"嘉";s:2:"ʪ";s:3:"嫁";s:2:"ʫ";s:3:"家";s:2:"ʬ";s:3:"暇";s:2:"ʭ";s:3:"架";s:2:"ʮ";s:3:"枷";s:2:"ʯ";s:3:"柯";s:2:"ʰ";s:3:"歌";s:2:"ʱ";s:3:"珂";s:2:"ʲ";s:3:"痂";s:2:"ʳ";s:3:"稼";s:2:"ʴ";s:3:"苛";s:2:"ʵ";s:3:"茄";s:2:"ʶ";s:3:"街";s:2:"ʷ";s:3:"袈";s:2:"ʸ";s:3:"訶";s:2:"ʹ";s:3:"賈";s:2:"ʺ";s:3:"跏";s:2:"ʻ";s:3:"軻";s:2:"ʼ";s:3:"迦";s:2:"ʽ";s:3:"駕";s:2:"ʾ";s:3:"刻";s:2:"ʿ";s:3:"却";s:2:"";s:3:"各";s:2:"";s:3:"恪";s:2:"";s:3:"慤";s:2:"";s:3:"殼";s:2:"";s:3:"珏";s:2:"";s:3:"脚";s:2:"";s:3:"覺";s:2:"";s:3:"角";s:2:"";s:3:"閣";s:2:"";s:3:"侃";s:2:"";s:3:"刊";s:2:"";s:3:"墾";s:2:"";s:3:"奸";s:2:"";s:3:"姦";s:2:"";s:3:"干";s:2:"";s:3:"幹";s:2:"";s:3:"懇";s:2:"";s:3:"揀";s:2:"";s:3:"杆";s:2:"";s:3:"柬";s:2:"";s:3:"桿";s:2:"";s:3:"澗";s:2:"";s:3:"癎";s:2:"";s:3:"看";s:2:"";s:3:"磵";s:2:"";s:3:"稈";s:2:"";s:3:"竿";s:2:"";s:3:"簡";s:2:"";s:3:"肝";s:2:"";s:3:"艮";s:2:"";s:3:"艱";s:2:"";s:3:"諫";s:2:"";s:3:"間";s:2:"";s:3:"乫";s:2:"";s:3:"喝";s:2:"";s:3:"曷";s:2:"";s:3:"渴";s:2:"";s:3:"碣";s:2:"";s:3:"竭";s:2:"";s:3:"葛";s:2:"";s:3:"褐";s:2:"";s:3:"蝎";s:2:"";s:3:"鞨";s:2:"";s:3:"勘";s:2:"";s:3:"坎";s:2:"";s:3:"堪";s:2:"";s:3:"嵌";s:2:"";s:3:"感";s:2:"";s:3:"憾";s:2:"";s:3:"戡";s:2:"";s:3:"敢";s:2:"";s:3:"柑";s:2:"";s:3:"橄";s:2:"";s:3:"減";s:2:"";s:3:"甘";s:2:"";s:3:"疳";s:2:"";s:3:"監";s:2:"";s:3:"瞰";s:2:"";s:3:"紺";s:2:"";s:3:"邯";s:2:"";s:3:"鑑";s:2:"";s:3:"鑒";s:2:"";s:3:"龕";s:2:"ˡ";s:3:"匣";s:2:"ˢ";s:3:"岬";s:2:"ˣ";s:3:"甲";s:2:"ˤ";s:3:"胛";s:2:"˥";s:3:"鉀";s:2:"˦";s:3:"閘";s:2:"˧";s:3:"剛";s:2:"˨";s:3:"堈";s:2:"˩";s:3:"姜";s:2:"˪";s:3:"岡";s:2:"˫";s:3:"崗";s:2:"ˬ";s:3:"康";s:2:"˭";s:3:"强";s:2:"ˮ";s:3:"彊";s:2:"˯";s:3:"慷";s:2:"˰";s:3:"江";s:2:"˱";s:3:"畺";s:2:"˲";s:3:"疆";s:2:"˳";s:3:"糠";s:2:"˴";s:3:"絳";s:2:"˵";s:3:"綱";s:2:"˶";s:3:"羌";s:2:"˷";s:3:"腔";s:2:"˸";s:3:"舡";s:2:"˹";s:3:"薑";s:2:"˺";s:3:"襁";s:2:"˻";s:3:"講";s:2:"˼";s:3:"鋼";s:2:"˽";s:3:"降";s:2:"˾";s:3:"鱇";s:2:"˿";s:3:"介";s:2:"";s:3:"价";s:2:"";s:3:"個";s:2:"";s:3:"凱";s:2:"";s:3:"塏";s:2:"";s:3:"愷";s:2:"";s:3:"愾";s:2:"";s:3:"慨";s:2:"";s:3:"改";s:2:"";s:3:"槪";s:2:"";s:3:"漑";s:2:"";s:3:"疥";s:2:"";s:3:"皆";s:2:"";s:3:"盖";s:2:"";s:3:"箇";s:2:"";s:3:"芥";s:2:"";s:3:"蓋";s:2:"";s:3:"豈";s:2:"";s:3:"鎧";s:2:"";s:3:"開";s:2:"";s:3:"喀";s:2:"";s:3:"客";s:2:"";s:3:"坑";s:2:"";s:3:"更";s:2:"";s:3:"粳";s:2:"";s:3:"羹";s:2:"";s:3:"醵";s:2:"";s:3:"倨";s:2:"";s:3:"去";s:2:"";s:3:"居";s:2:"";s:3:"巨";s:2:"";s:3:"拒";s:2:"";s:3:"据";s:2:"";s:3:"據";s:2:"";s:3:"擧";s:2:"";s:3:"渠";s:2:"";s:3:"炬";s:2:"";s:3:"祛";s:2:"";s:3:"距";s:2:"";s:3:"踞";s:2:"";s:3:"車";s:2:"";s:3:"遽";s:2:"";s:3:"鉅";s:2:"";s:3:"鋸";s:2:"";s:3:"乾";s:2:"";s:3:"件";s:2:"";s:3:"健";s:2:"";s:3:"巾";s:2:"";s:3:"建";s:2:"";s:3:"愆";s:2:"";s:3:"楗";s:2:"";s:3:"腱";s:2:"";s:3:"虔";s:2:"";s:3:"蹇";s:2:"";s:3:"鍵";s:2:"";s:3:"騫";s:2:"";s:3:"乞";s:2:"";s:3:"傑";s:2:"";s:3:"杰";s:2:"";s:3:"桀";s:2:"";s:3:"儉";s:2:"";s:3:"劍";s:2:"";s:3:"劒";s:2:"";s:3:"檢";s:2:"̡";s:3:"瞼";s:2:"̢";s:3:"鈐";s:2:"̣";s:3:"黔";s:2:"̤";s:3:"劫";s:2:"̥";s:3:"怯";s:2:"̦";s:3:"迲";s:2:"̧";s:3:"偈";s:2:"̨";s:3:"憩";s:2:"̩";s:3:"揭";s:2:"̪";s:3:"擊";s:2:"̫";s:3:"格";s:2:"̬";s:3:"檄";s:2:"̭";s:3:"激";s:2:"̮";s:3:"膈";s:2:"̯";s:3:"覡";s:2:"̰";s:3:"隔";s:2:"̱";s:3:"堅";s:2:"̲";s:3:"牽";s:2:"̳";s:3:"犬";s:2:"̴";s:3:"甄";s:2:"̵";s:3:"絹";s:2:"̶";s:3:"繭";s:2:"̷";s:3:"肩";s:2:"̸";s:3:"見";s:2:"̹";s:3:"譴";s:2:"̺";s:3:"遣";s:2:"̻";s:3:"鵑";s:2:"̼";s:3:"抉";s:2:"̽";s:3:"決";s:2:"̾";s:3:"潔";s:2:"̿";s:3:"結";s:2:"";s:3:"缺";s:2:"";s:3:"訣";s:2:"";s:3:"兼";s:2:"";s:3:"慊";s:2:"";s:3:"箝";s:2:"";s:3:"謙";s:2:"";s:3:"鉗";s:2:"";s:3:"鎌";s:2:"";s:3:"京";s:2:"";s:3:"俓";s:2:"";s:3:"倞";s:2:"";s:3:"傾";s:2:"";s:3:"儆";s:2:"";s:3:"勁";s:2:"";s:3:"勍";s:2:"";s:3:"卿";s:2:"";s:3:"坰";s:2:"";s:3:"境";s:2:"";s:3:"庚";s:2:"";s:3:"徑";s:2:"";s:3:"慶";s:2:"";s:3:"憬";s:2:"";s:3:"擎";s:2:"";s:3:"敬";s:2:"";s:3:"景";s:2:"";s:3:"暻";s:2:"";s:3:"更";s:2:"";s:3:"梗";s:2:"";s:3:"涇";s:2:"";s:3:"炅";s:2:"";s:3:"烱";s:2:"";s:3:"璟";s:2:"";s:3:"璥";s:2:"";s:3:"瓊";s:2:"";s:3:"痙";s:2:"";s:3:"硬";s:2:"";s:3:"磬";s:2:"";s:3:"竟";s:2:"";s:3:"競";s:2:"";s:3:"絅";s:2:"";s:3:"經";s:2:"";s:3:"耕";s:2:"";s:3:"耿";s:2:"";s:3:"脛";s:2:"";s:3:"莖";s:2:"";s:3:"警";s:2:"";s:3:"輕";s:2:"";s:3:"逕";s:2:"";s:3:"鏡";s:2:"";s:3:"頃";s:2:"";s:3:"頸";s:2:"";s:3:"驚";s:2:"";s:3:"鯨";s:2:"";s:3:"係";s:2:"";s:3:"啓";s:2:"";s:3:"堺";s:2:"";s:3:"契";s:2:"";s:3:"季";s:2:"";s:3:"屆";s:2:"";s:3:"悸";s:2:"";s:3:"戒";s:2:"";s:3:"桂";s:2:"";s:3:"械";s:2:"͡";s:3:"棨";s:2:"͢";s:3:"溪";s:2:"ͣ";s:3:"界";s:2:"ͤ";s:3:"癸";s:2:"ͥ";s:3:"磎";s:2:"ͦ";s:3:"稽";s:2:"ͧ";s:3:"系";s:2:"ͨ";s:3:"繫";s:2:"ͩ";s:3:"繼";s:2:"ͪ";s:3:"計";s:2:"ͫ";s:3:"誡";s:2:"ͬ";s:3:"谿";s:2:"ͭ";s:3:"階";s:2:"ͮ";s:3:"鷄";s:2:"ͯ";s:3:"古";s:2:"Ͱ";s:3:"叩";s:2:"ͱ";s:3:"告";s:2:"Ͳ";s:3:"呱";s:2:"ͳ";s:3:"固";s:2:"ʹ";s:3:"姑";s:2:"͵";s:3:"孤";s:2:"Ͷ";s:3:"尻";s:2:"ͷ";s:3:"庫";s:2:"͸";s:3:"拷";s:2:"͹";s:3:"攷";s:2:"ͺ";s:3:"故";s:2:"ͻ";s:3:"敲";s:2:"ͼ";s:3:"暠";s:2:"ͽ";s:3:"枯";s:2:";";s:3:"槁";s:2:"Ϳ";s:3:"沽";s:2:"";s:3:"痼";s:2:"";s:3:"皐";s:2:"";s:3:"睾";s:2:"";s:3:"稿";s:2:"";s:3:"羔";s:2:"";s:3:"考";s:2:"";s:3:"股";s:2:"";s:3:"膏";s:2:"";s:3:"苦";s:2:"";s:3:"苽";s:2:"";s:3:"菰";s:2:"";s:3:"藁";s:2:"";s:3:"蠱";s:2:"";s:3:"袴";s:2:"";s:3:"誥";s:2:"";s:3:"賈";s:2:"";s:3:"辜";s:2:"";s:3:"錮";s:2:"";s:3:"雇";s:2:"";s:3:"顧";s:2:"";s:3:"高";s:2:"";s:3:"鼓";s:2:"";s:3:"哭";s:2:"";s:3:"斛";s:2:"";s:3:"曲";s:2:"";s:3:"梏";s:2:"";s:3:"穀";s:2:"";s:3:"谷";s:2:"";s:3:"鵠";s:2:"";s:3:"困";s:2:"";s:3:"坤";s:2:"";s:3:"崑";s:2:"";s:3:"昆";s:2:"";s:3:"梱";s:2:"";s:3:"棍";s:2:"";s:3:"滾";s:2:"";s:3:"琨";s:2:"";s:3:"袞";s:2:"";s:3:"鯤";s:2:"";s:3:"汨";s:2:"";s:3:"滑";s:2:"";s:3:"骨";s:2:"";s:3:"供";s:2:"";s:3:"公";s:2:"";s:3:"共";s:2:"";s:3:"功";s:2:"";s:3:"孔";s:2:"";s:3:"工";s:2:"";s:3:"恐";s:2:"";s:3:"恭";s:2:"";s:3:"拱";s:2:"";s:3:"控";s:2:"";s:3:"攻";s:2:"";s:3:"珙";s:2:"";s:3:"空";s:2:"";s:3:"蚣";s:2:"";s:3:"貢";s:2:"";s:3:"鞏";s:2:"";s:3:"串";s:2:"";s:3:"寡";s:2:"";s:3:"戈";s:2:"";s:3:"果";s:2:"";s:3:"瓜";s:2:"Ρ";s:3:"科";s:2:"΢";s:3:"菓";s:2:"Σ";s:3:"誇";s:2:"Τ";s:3:"課";s:2:"Υ";s:3:"跨";s:2:"Φ";s:3:"過";s:2:"Χ";s:3:"鍋";s:2:"Ψ";s:3:"顆";s:2:"Ω";s:3:"廓";s:2:"Ϊ";s:3:"槨";s:2:"Ϋ";s:3:"藿";s:2:"ά";s:3:"郭";s:2:"έ";s:3:"串";s:2:"ή";s:3:"冠";s:2:"ί";s:3:"官";s:2:"ΰ";s:3:"寬";s:2:"α";s:3:"慣";s:2:"β";s:3:"棺";s:2:"γ";s:3:"款";s:2:"δ";s:3:"灌";s:2:"ε";s:3:"琯";s:2:"ζ";s:3:"瓘";s:2:"η";s:3:"管";s:2:"θ";s:3:"罐";s:2:"ι";s:3:"菅";s:2:"κ";s:3:"觀";s:2:"λ";s:3:"貫";s:2:"μ";s:3:"關";s:2:"ν";s:3:"館";s:2:"ξ";s:3:"刮";s:2:"ο";s:3:"恝";s:2:"";s:3:"括";s:2:"";s:3:"适";s:2:"";s:3:"侊";s:2:"";s:3:"光";s:2:"";s:3:"匡";s:2:"";s:3:"壙";s:2:"";s:3:"廣";s:2:"";s:3:"曠";s:2:"";s:3:"洸";s:2:"";s:3:"炚";s:2:"";s:3:"狂";s:2:"";s:3:"珖";s:2:"";s:3:"筐";s:2:"";s:3:"胱";s:2:"";s:3:"鑛";s:2:"";s:3:"卦";s:2:"";s:3:"掛";s:2:"";s:3:"罫";s:2:"";s:3:"乖";s:2:"";s:3:"傀";s:2:"";s:3:"塊";s:2:"";s:3:"壞";s:2:"";s:3:"怪";s:2:"";s:3:"愧";s:2:"";s:3:"拐";s:2:"";s:3:"槐";s:2:"";s:3:"魁";s:2:"";s:3:"宏";s:2:"";s:3:"紘";s:2:"";s:3:"肱";s:2:"";s:3:"轟";s:2:"";s:3:"交";s:2:"";s:3:"僑";s:2:"";s:3:"咬";s:2:"";s:3:"喬";s:2:"";s:3:"嬌";s:2:"";s:3:"嶠";s:2:"";s:3:"巧";s:2:"";s:3:"攪";s:2:"";s:3:"敎";s:2:"";s:3:"校";s:2:"";s:3:"橋";s:2:"";s:3:"狡";s:2:"";s:3:"皎";s:2:"";s:3:"矯";s:2:"";s:3:"絞";s:2:"";s:3:"翹";s:2:"";s:3:"膠";s:2:"";s:3:"蕎";s:2:"";s:3:"蛟";s:2:"";s:3:"較";s:2:"";s:3:"轎";s:2:"";s:3:"郊";s:2:"";s:3:"餃";s:2:"";s:3:"驕";s:2:"";s:3:"鮫";s:2:"";s:3:"丘";s:2:"";s:3:"久";s:2:"";s:3:"九";s:2:"";s:3:"仇";s:2:"";s:3:"俱";s:2:"";s:3:"具";s:2:"";s:3:"勾";s:2:"ϡ";s:3:"區";s:2:"Ϣ";s:3:"口";s:2:"ϣ";s:3:"句";s:2:"Ϥ";s:3:"咎";s:2:"ϥ";s:3:"嘔";s:2:"Ϧ";s:3:"坵";s:2:"ϧ";s:3:"垢";s:2:"Ϩ";s:3:"寇";s:2:"ϩ";s:3:"嶇";s:2:"Ϫ";s:3:"廐";s:2:"ϫ";s:3:"懼";s:2:"Ϭ";s:3:"拘";s:2:"ϭ";s:3:"救";s:2:"Ϯ";s:3:"枸";s:2:"ϯ";s:3:"柩";s:2:"ϰ";s:3:"構";s:2:"ϱ";s:3:"歐";s:2:"ϲ";s:3:"毆";s:2:"ϳ";s:3:"毬";s:2:"ϴ";s:3:"求";s:2:"ϵ";s:3:"溝";s:2:"϶";s:3:"灸";s:2:"Ϸ";s:3:"狗";s:2:"ϸ";s:3:"玖";s:2:"Ϲ";s:3:"球";s:2:"Ϻ";s:3:"瞿";s:2:"ϻ";s:3:"矩";s:2:"ϼ";s:3:"究";s:2:"Ͻ";s:3:"絿";s:2:"Ͼ";s:3:"耉";s:2:"Ͽ";s:3:"臼";s:2:"";s:3:"舅";s:2:"";s:3:"舊";s:2:"";s:3:"苟";s:2:"";s:3:"衢";s:2:"";s:3:"謳";s:2:"";s:3:"購";s:2:"";s:3:"軀";s:2:"";s:3:"逑";s:2:"";s:3:"邱";s:2:"";s:3:"鉤";s:2:"";s:3:"銶";s:2:"";s:3:"駒";s:2:"";s:3:"驅";s:2:"";s:3:"鳩";s:2:"";s:3:"鷗";s:2:"";s:3:"龜";s:2:"";s:3:"國";s:2:"";s:3:"局";s:2:"";s:3:"菊";s:2:"";s:3:"鞠";s:2:"";s:3:"鞫";s:2:"";s:3:"麴";s:2:"";s:3:"君";s:2:"";s:3:"窘";s:2:"";s:3:"群";s:2:"";s:3:"裙";s:2:"";s:3:"軍";s:2:"";s:3:"郡";s:2:"";s:3:"堀";s:2:"";s:3:"屈";s:2:"";s:3:"掘";s:2:"";s:3:"窟";s:2:"";s:3:"宮";s:2:"";s:3:"弓";s:2:"";s:3:"穹";s:2:"";s:3:"窮";s:2:"";s:3:"芎";s:2:"";s:3:"躬";s:2:"";s:3:"倦";s:2:"";s:3:"券";s:2:"";s:3:"勸";s:2:"";s:3:"卷";s:2:"";s:3:"圈";s:2:"";s:3:"拳";s:2:"";s:3:"捲";s:2:"";s:3:"權";s:2:"";s:3:"淃";s:2:"";s:3:"眷";s:2:"";s:3:"厥";s:2:"";s:3:"獗";s:2:"";s:3:"蕨";s:2:"";s:3:"蹶";s:2:"";s:3:"闕";s:2:"";s:3:"机";s:2:"";s:3:"櫃";s:2:"";s:3:"潰";s:2:"";s:3:"詭";s:2:"";s:3:"軌";s:2:"";s:3:"饋";s:2:"";s:3:"句";s:2:"";s:3:"晷";s:2:"";s:3:"歸";s:2:"";s:3:"貴";s:2:"С";s:3:"鬼";s:2:"Т";s:3:"龜";s:2:"У";s:3:"叫";s:2:"Ф";s:3:"圭";s:2:"Х";s:3:"奎";s:2:"Ц";s:3:"揆";s:2:"Ч";s:3:"槻";s:2:"Ш";s:3:"珪";s:2:"Щ";s:3:"硅";s:2:"Ъ";s:3:"窺";s:2:"Ы";s:3:"竅";s:2:"Ь";s:3:"糾";s:2:"Э";s:3:"葵";s:2:"Ю";s:3:"規";s:2:"Я";s:3:"赳";s:2:"а";s:3:"逵";s:2:"б";s:3:"閨";s:2:"в";s:3:"勻";s:2:"г";s:3:"均";s:2:"д";s:3:"畇";s:2:"е";s:3:"筠";s:2:"ж";s:3:"菌";s:2:"з";s:3:"鈞";s:2:"и";s:3:"龜";s:2:"й";s:3:"橘";s:2:"к";s:3:"克";s:2:"л";s:3:"剋";s:2:"м";s:3:"劇";s:2:"н";s:3:"戟";s:2:"о";s:3:"棘";s:2:"п";s:3:"極";s:2:"";s:3:"隙";s:2:"";s:3:"僅";s:2:"";s:3:"劤";s:2:"";s:3:"勤";s:2:"";s:3:"懃";s:2:"";s:3:"斤";s:2:"";s:3:"根";s:2:"";s:3:"槿";s:2:"";s:3:"瑾";s:2:"";s:3:"筋";s:2:"";s:3:"芹";s:2:"";s:3:"菫";s:2:"";s:3:"覲";s:2:"";s:3:"謹";s:2:"";s:3:"近";s:2:"";s:3:"饉";s:2:"";s:3:"契";s:2:"";s:3:"今";s:2:"";s:3:"妗";s:2:"";s:3:"擒";s:2:"";s:3:"昑";s:2:"";s:3:"檎";s:2:"";s:3:"琴";s:2:"";s:3:"禁";s:2:"";s:3:"禽";s:2:"";s:3:"芩";s:2:"";s:3:"衾";s:2:"";s:3:"衿";s:2:"";s:3:"襟";s:2:"";s:3:"金";s:2:"";s:3:"錦";s:2:"";s:3:"伋";s:2:"";s:3:"及";s:2:"";s:3:"急";s:2:"";s:3:"扱";s:2:"";s:3:"汲";s:2:"";s:3:"級";s:2:"";s:3:"給";s:2:"";s:3:"亘";s:2:"";s:3:"兢";s:2:"";s:3:"矜";s:2:"";s:3:"肯";s:2:"";s:3:"企";s:2:"";s:3:"伎";s:2:"";s:3:"其";s:2:"";s:3:"冀";s:2:"";s:3:"嗜";s:2:"";s:3:"器";s:2:"";s:3:"圻";s:2:"";s:3:"基";s:2:"";s:3:"埼";s:2:"";s:3:"夔";s:2:"";s:3:"奇";s:2:"";s:3:"妓";s:2:"";s:3:"寄";s:2:"";s:3:"岐";s:2:"";s:3:"崎";s:2:"";s:3:"己";s:2:"";s:3:"幾";s:2:"";s:3:"忌";s:2:"";s:3:"技";s:2:"";s:3:"旗";s:2:"";s:3:"旣";s:2:"ѡ";s:3:"朞";s:2:"Ѣ";s:3:"期";s:2:"ѣ";s:3:"杞";s:2:"Ѥ";s:3:"棋";s:2:"ѥ";s:3:"棄";s:2:"Ѧ";s:3:"機";s:2:"ѧ";s:3:"欺";s:2:"Ѩ";s:3:"氣";s:2:"ѩ";s:3:"汽";s:2:"Ѫ";s:3:"沂";s:2:"ѫ";s:3:"淇";s:2:"Ѭ";s:3:"玘";s:2:"ѭ";s:3:"琦";s:2:"Ѯ";s:3:"琪";s:2:"ѯ";s:3:"璂";s:2:"Ѱ";s:3:"璣";s:2:"ѱ";s:3:"畸";s:2:"Ѳ";s:3:"畿";s:2:"ѳ";s:3:"碁";s:2:"Ѵ";s:3:"磯";s:2:"ѵ";s:3:"祁";s:2:"Ѷ";s:3:"祇";s:2:"ѷ";s:3:"祈";s:2:"Ѹ";s:3:"祺";s:2:"ѹ";s:3:"箕";s:2:"Ѻ";s:3:"紀";s:2:"ѻ";s:3:"綺";s:2:"Ѽ";s:3:"羈";s:2:"ѽ";s:3:"耆";s:2:"Ѿ";s:3:"耭";s:2:"ѿ";s:3:"肌";s:2:"";s:3:"記";s:2:"";s:3:"譏";s:2:"";s:3:"豈";s:2:"";s:3:"起";s:2:"";s:3:"錡";s:2:"";s:3:"錤";s:2:"";s:3:"飢";s:2:"";s:3:"饑";s:2:"";s:3:"騎";s:2:"";s:3:"騏";s:2:"";s:3:"驥";s:2:"";s:3:"麒";s:2:"";s:3:"緊";s:2:"";s:3:"佶";s:2:"";s:3:"吉";s:2:"";s:3:"拮";s:2:"";s:3:"桔";s:2:"";s:3:"金";s:2:"";s:3:"喫";s:2:"";s:3:"儺";s:2:"";s:3:"喇";s:2:"";s:3:"奈";s:2:"";s:3:"娜";s:2:"";s:3:"懦";s:2:"";s:3:"懶";s:2:"";s:3:"拏";s:2:"";s:3:"拿";s:2:"";s:3:"癩";s:2:"";s:3:"羅";s:2:"";s:3:"蘿";s:2:"";s:3:"螺";s:2:"";s:3:"裸";s:2:"";s:3:"邏";s:2:"";s:3:"那";s:2:"";s:3:"樂";s:2:"";s:3:"洛";s:2:"";s:3:"烙";s:2:"";s:3:"珞";s:2:"";s:3:"落";s:2:"";s:3:"諾";s:2:"";s:3:"酪";s:2:"";s:3:"駱";s:2:"";s:3:"亂";s:2:"";s:3:"卵";s:2:"";s:3:"暖";s:2:"";s:3:"欄";s:2:"";s:3:"煖";s:2:"";s:3:"爛";s:2:"";s:3:"蘭";s:2:"";s:3:"難";s:2:"";s:3:"鸞";s:2:"";s:3:"捏";s:2:"";s:3:"捺";s:2:"";s:3:"南";s:2:"";s:3:"嵐";s:2:"";s:3:"枏";s:2:"";s:3:"楠";s:2:"";s:3:"湳";s:2:"";s:3:"濫";s:2:"";s:3:"男";s:2:"";s:3:"藍";s:2:"";s:3:"襤";s:2:"";s:3:"拉";s:2:"ҡ";s:3:"納";s:2:"Ң";s:3:"臘";s:2:"ң";s:3:"蠟";s:2:"Ҥ";s:3:"衲";s:2:"ҥ";s:3:"囊";s:2:"Ҧ";s:3:"娘";s:2:"ҧ";s:3:"廊";s:2:"Ҩ";s:3:"朗";s:2:"ҩ";s:3:"浪";s:2:"Ҫ";s:3:"狼";s:2:"ҫ";s:3:"郎";s:2:"Ҭ";s:3:"乃";s:2:"ҭ";s:3:"來";s:2:"Ү";s:3:"內";s:2:"ү";s:3:"奈";s:2:"Ұ";s:3:"柰";s:2:"ұ";s:3:"耐";s:2:"Ҳ";s:3:"冷";s:2:"ҳ";s:3:"女";s:2:"Ҵ";s:3:"年";s:2:"ҵ";s:3:"撚";s:2:"Ҷ";s:3:"秊";s:2:"ҷ";s:3:"念";s:2:"Ҹ";s:3:"恬";s:2:"ҹ";s:3:"拈";s:2:"Һ";s:3:"捻";s:2:"һ";s:3:"寧";s:2:"Ҽ";s:3:"寗";s:2:"ҽ";s:3:"努";s:2:"Ҿ";s:3:"勞";s:2:"ҿ";s:3:"奴";s:2:"";s:3:"弩";s:2:"";s:3:"怒";s:2:"";s:3:"擄";s:2:"";s:3:"櫓";s:2:"";s:3:"爐";s:2:"";s:3:"瑙";s:2:"";s:3:"盧";s:2:"";s:3:"老";s:2:"";s:3:"蘆";s:2:"";s:3:"虜";s:2:"";s:3:"路";s:2:"";s:3:"露";s:2:"";s:3:"駑";s:2:"";s:3:"魯";s:2:"";s:3:"鷺";s:2:"";s:3:"碌";s:2:"";s:3:"祿";s:2:"";s:3:"綠";s:2:"";s:3:"菉";s:2:"";s:3:"錄";s:2:"";s:3:"鹿";s:2:"";s:3:"論";s:2:"";s:3:"壟";s:2:"";s:3:"弄";s:2:"";s:3:"濃";s:2:"";s:3:"籠";s:2:"";s:3:"聾";s:2:"";s:3:"膿";s:2:"";s:3:"農";s:2:"";s:3:"惱";s:2:"";s:3:"牢";s:2:"";s:3:"磊";s:2:"";s:3:"腦";s:2:"";s:3:"賂";s:2:"";s:3:"雷";s:2:"";s:3:"尿";s:2:"";s:3:"壘";s:2:"";s:3:"屢";s:2:"";s:3:"樓";s:2:"";s:3:"淚";s:2:"";s:3:"漏";s:2:"";s:3:"累";s:2:"";s:3:"縷";s:2:"";s:3:"陋";s:2:"";s:3:"嫩";s:2:"";s:3:"訥";s:2:"";s:3:"杻";s:2:"";s:3:"紐";s:2:"";s:3:"勒";s:2:"";s:3:"肋";s:2:"";s:3:"凜";s:2:"";s:3:"凌";s:2:"";s:3:"稜";s:2:"";s:3:"綾";s:2:"";s:3:"能";s:2:"";s:3:"菱";s:2:"";s:3:"陵";s:2:"";s:3:"尼";s:2:"";s:3:"泥";s:2:"";s:3:"匿";s:2:"";s:3:"溺";s:2:"";s:3:"多";s:2:"";s:3:"茶";s:2:"ӡ";s:3:"丹";s:2:"Ӣ";s:3:"亶";s:2:"ӣ";s:3:"但";s:2:"Ӥ";s:3:"單";s:2:"ӥ";s:3:"團";s:2:"Ӧ";s:3:"壇";s:2:"ӧ";s:3:"彖";s:2:"Ө";s:3:"斷";s:2:"ө";s:3:"旦";s:2:"Ӫ";s:3:"檀";s:2:"ӫ";s:3:"段";s:2:"Ӭ";s:3:"湍";s:2:"ӭ";s:3:"短";s:2:"Ӯ";s:3:"端";s:2:"ӯ";s:3:"簞";s:2:"Ӱ";s:3:"緞";s:2:"ӱ";s:3:"蛋";s:2:"Ӳ";s:3:"袒";s:2:"ӳ";s:3:"鄲";s:2:"Ӵ";s:3:"鍛";s:2:"ӵ";s:3:"撻";s:2:"Ӷ";s:3:"澾";s:2:"ӷ";s:3:"獺";s:2:"Ӹ";s:3:"疸";s:2:"ӹ";s:3:"達";s:2:"Ӻ";s:3:"啖";s:2:"ӻ";s:3:"坍";s:2:"Ӽ";s:3:"憺";s:2:"ӽ";s:3:"擔";s:2:"Ӿ";s:3:"曇";s:2:"ӿ";s:3:"淡";s:2:"";s:3:"湛";s:2:"";s:3:"潭";s:2:"";s:3:"澹";s:2:"";s:3:"痰";s:2:"";s:3:"聃";s:2:"";s:3:"膽";s:2:"";s:3:"蕁";s:2:"";s:3:"覃";s:2:"";s:3:"談";s:2:"";s:3:"譚";s:2:"";s:3:"錟";s:2:"";s:3:"沓";s:2:"";s:3:"畓";s:2:"";s:3:"答";s:2:"";s:3:"踏";s:2:"";s:3:"遝";s:2:"";s:3:"唐";s:2:"";s:3:"堂";s:2:"";s:3:"塘";s:2:"";s:3:"幢";s:2:"";s:3:"戇";s:2:"";s:3:"撞";s:2:"";s:3:"棠";s:2:"";s:3:"當";s:2:"";s:3:"糖";s:2:"";s:3:"螳";s:2:"";s:3:"黨";s:2:"";s:3:"代";s:2:"";s:3:"垈";s:2:"";s:3:"坮";s:2:"";s:3:"大";s:2:"";s:3:"對";s:2:"";s:3:"岱";s:2:"";s:3:"帶";s:2:"";s:3:"待";s:2:"";s:3:"戴";s:2:"";s:3:"擡";s:2:"";s:3:"玳";s:2:"";s:3:"臺";s:2:"";s:3:"袋";s:2:"";s:3:"貸";s:2:"";s:3:"隊";s:2:"";s:3:"黛";s:2:"";s:3:"宅";s:2:"";s:3:"德";s:2:"";s:3:"悳";s:2:"";s:3:"倒";s:2:"";s:3:"刀";s:2:"";s:3:"到";s:2:"";s:3:"圖";s:2:"";s:3:"堵";s:2:"";s:3:"塗";s:2:"";s:3:"導";s:2:"";s:3:"屠";s:2:"";s:3:"島";s:2:"";s:3:"嶋";s:2:"";s:3:"度";s:2:"";s:3:"徒";s:2:"";s:3:"悼";s:2:"";s:3:"挑";s:2:"";s:3:"掉";s:2:"";s:3:"搗";s:2:"";s:3:"桃";s:2:"ԡ";s:3:"棹";s:2:"Ԣ";s:3:"櫂";s:2:"ԣ";s:3:"淘";s:2:"Ԥ";s:3:"渡";s:2:"ԥ";s:3:"滔";s:2:"Ԧ";s:3:"濤";s:2:"ԧ";s:3:"燾";s:2:"Ԩ";s:3:"盜";s:2:"ԩ";s:3:"睹";s:2:"Ԫ";s:3:"禱";s:2:"ԫ";s:3:"稻";s:2:"Ԭ";s:3:"萄";s:2:"ԭ";s:3:"覩";s:2:"Ԯ";s:3:"賭";s:2:"ԯ";s:3:"跳";s:2:"԰";s:3:"蹈";s:2:"Ա";s:3:"逃";s:2:"Բ";s:3:"途";s:2:"Գ";s:3:"道";s:2:"Դ";s:3:"都";s:2:"Ե";s:3:"鍍";s:2:"Զ";s:3:"陶";s:2:"Է";s:3:"韜";s:2:"Ը";s:3:"毒";s:2:"Թ";s:3:"瀆";s:2:"Ժ";s:3:"牘";s:2:"Ի";s:3:"犢";s:2:"Լ";s:3:"獨";s:2:"Խ";s:3:"督";s:2:"Ծ";s:3:"禿";s:2:"Կ";s:3:"篤";s:2:"";s:3:"纛";s:2:"";s:3:"讀";s:2:"";s:3:"墩";s:2:"";s:3:"惇";s:2:"";s:3:"敦";s:2:"";s:3:"旽";s:2:"";s:3:"暾";s:2:"";s:3:"沌";s:2:"";s:3:"焞";s:2:"";s:3:"燉";s:2:"";s:3:"豚";s:2:"";s:3:"頓";s:2:"";s:3:"乭";s:2:"";s:3:"突";s:2:"";s:3:"仝";s:2:"";s:3:"冬";s:2:"";s:3:"凍";s:2:"";s:3:"動";s:2:"";s:3:"同";s:2:"";s:3:"憧";s:2:"";s:3:"東";s:2:"";s:3:"桐";s:2:"";s:3:"棟";s:2:"";s:3:"洞";s:2:"";s:3:"潼";s:2:"";s:3:"疼";s:2:"";s:3:"瞳";s:2:"";s:3:"童";s:2:"";s:3:"胴";s:2:"";s:3:"董";s:2:"";s:3:"銅";s:2:"";s:3:"兜";s:2:"";s:3:"斗";s:2:"";s:3:"杜";s:2:"";s:3:"枓";s:2:"";s:3:"痘";s:2:"";s:3:"竇";s:2:"";s:3:"荳";s:2:"";s:3:"讀";s:2:"";s:3:"豆";s:2:"";s:3:"逗";s:2:"";s:3:"頭";s:2:"";s:3:"屯";s:2:"";s:3:"臀";s:2:"";s:3:"芚";s:2:"";s:3:"遁";s:2:"";s:3:"遯";s:2:"";s:3:"鈍";s:2:"";s:3:"得";s:2:"";s:3:"嶝";s:2:"";s:3:"橙";s:2:"";s:3:"燈";s:2:"";s:3:"登";s:2:"";s:3:"等";s:2:"";s:3:"藤";s:2:"";s:3:"謄";s:2:"";s:3:"鄧";s:2:"";s:3:"騰";s:2:"";s:3:"喇";s:2:"";s:3:"懶";s:2:"";s:3:"拏";s:2:"";s:3:"癩";s:2:"";s:3:"羅";s:2:"ա";s:3:"蘿";s:2:"բ";s:3:"螺";s:2:"գ";s:3:"裸";s:2:"դ";s:3:"邏";s:2:"ե";s:3:"樂";s:2:"զ";s:3:"洛";s:2:"է";s:3:"烙";s:2:"ը";s:3:"珞";s:2:"թ";s:3:"絡";s:2:"ժ";s:3:"落";s:2:"ի";s:3:"諾";s:2:"լ";s:3:"酪";s:2:"խ";s:3:"駱";s:2:"ծ";s:3:"丹";s:2:"կ";s:3:"亂";s:2:"հ";s:3:"卵";s:2:"ձ";s:3:"欄";s:2:"ղ";s:3:"欒";s:2:"ճ";s:3:"瀾";s:2:"մ";s:3:"爛";s:2:"յ";s:3:"蘭";s:2:"ն";s:3:"鸞";s:2:"շ";s:3:"剌";s:2:"ո";s:3:"辣";s:2:"չ";s:3:"嵐";s:2:"պ";s:3:"擥";s:2:"ջ";s:3:"攬";s:2:"ռ";s:3:"欖";s:2:"ս";s:3:"濫";s:2:"վ";s:3:"籃";s:2:"տ";s:3:"纜";s:2:"";s:3:"藍";s:2:"";s:3:"襤";s:2:"";s:3:"覽";s:2:"";s:3:"拉";s:2:"";s:3:"臘";s:2:"";s:3:"蠟";s:2:"";s:3:"廊";s:2:"";s:3:"朗";s:2:"";s:3:"浪";s:2:"";s:3:"狼";s:2:"";s:3:"琅";s:2:"";s:3:"瑯";s:2:"";s:3:"螂";s:2:"";s:3:"郞";s:2:"";s:3:"來";s:2:"";s:3:"崍";s:2:"";s:3:"徠";s:2:"";s:3:"萊";s:2:"";s:3:"冷";s:2:"";s:3:"掠";s:2:"";s:3:"略";s:2:"";s:3:"亮";s:2:"";s:3:"倆";s:2:"";s:3:"兩";s:2:"";s:3:"凉";s:2:"";s:3:"梁";s:2:"";s:3:"樑";s:2:"";s:3:"粮";s:2:"";s:3:"粱";s:2:"";s:3:"糧";s:2:"";s:3:"良";s:2:"";s:3:"諒";s:2:"";s:3:"輛";s:2:"";s:3:"量";s:2:"";s:3:"侶";s:2:"";s:3:"儷";s:2:"";s:3:"勵";s:2:"";s:3:"呂";s:2:"";s:3:"廬";s:2:"";s:3:"慮";s:2:"";s:3:"戾";s:2:"";s:3:"旅";s:2:"";s:3:"櫚";s:2:"";s:3:"濾";s:2:"";s:3:"礪";s:2:"";s:3:"藜";s:2:"";s:3:"蠣";s:2:"";s:3:"閭";s:2:"";s:3:"驢";s:2:"";s:3:"驪";s:2:"";s:3:"麗";s:2:"";s:3:"黎";s:2:"";s:3:"力";s:2:"";s:3:"曆";s:2:"";s:3:"歷";s:2:"";s:3:"瀝";s:2:"";s:3:"礫";s:2:"";s:3:"轢";s:2:"";s:3:"靂";s:2:"";s:3:"憐";s:2:"";s:3:"戀";s:2:"";s:3:"攣";s:2:"";s:3:"漣";s:2:"֡";s:3:"煉";s:2:"֢";s:3:"璉";s:2:"֣";s:3:"練";s:2:"֤";s:3:"聯";s:2:"֥";s:3:"蓮";s:2:"֦";s:3:"輦";s:2:"֧";s:3:"連";s:2:"֨";s:3:"鍊";s:2:"֩";s:3:"冽";s:2:"֪";s:3:"列";s:2:"֫";s:3:"劣";s:2:"֬";s:3:"洌";s:2:"֭";s:3:"烈";s:2:"֮";s:3:"裂";s:2:"֯";s:3:"廉";s:2:"ְ";s:3:"斂";s:2:"ֱ";s:3:"殮";s:2:"ֲ";s:3:"濂";s:2:"ֳ";s:3:"簾";s:2:"ִ";s:3:"獵";s:2:"ֵ";s:3:"令";s:2:"ֶ";s:3:"伶";s:2:"ַ";s:3:"囹";s:2:"ָ";s:3:"寧";s:2:"ֹ";s:3:"岺";s:2:"ֺ";s:3:"嶺";s:2:"ֻ";s:3:"怜";s:2:"ּ";s:3:"玲";s:2:"ֽ";s:3:"笭";s:2:"־";s:3:"羚";s:2:"ֿ";s:3:"翎";s:2:"";s:3:"聆";s:2:"";s:3:"逞";s:2:"";s:3:"鈴";s:2:"";s:3:"零";s:2:"";s:3:"靈";s:2:"";s:3:"領";s:2:"";s:3:"齡";s:2:"";s:3:"例";s:2:"";s:3:"澧";s:2:"";s:3:"禮";s:2:"";s:3:"醴";s:2:"";s:3:"隷";s:2:"";s:3:"勞";s:2:"";s:3:"怒";s:2:"";s:3:"撈";s:2:"";s:3:"擄";s:2:"";s:3:"櫓";s:2:"";s:3:"潞";s:2:"";s:3:"瀘";s:2:"";s:3:"爐";s:2:"";s:3:"盧";s:2:"";s:3:"老";s:2:"";s:3:"蘆";s:2:"";s:3:"虜";s:2:"";s:3:"路";s:2:"";s:3:"輅";s:2:"";s:3:"露";s:2:"";s:3:"魯";s:2:"";s:3:"鷺";s:2:"";s:3:"鹵";s:2:"";s:3:"碌";s:2:"";s:3:"祿";s:2:"";s:3:"綠";s:2:"";s:3:"菉";s:2:"";s:3:"錄";s:2:"";s:3:"鹿";s:2:"";s:3:"麓";s:2:"";s:3:"論";s:2:"";s:3:"壟";s:2:"";s:3:"弄";s:2:"";s:3:"朧";s:2:"";s:3:"瀧";s:2:"";s:3:"瓏";s:2:"";s:3:"籠";s:2:"";s:3:"聾";s:2:"";s:3:"儡";s:2:"";s:3:"瀨";s:2:"";s:3:"牢";s:2:"";s:3:"磊";s:2:"";s:3:"賂";s:2:"";s:3:"賚";s:2:"";s:3:"賴";s:2:"";s:3:"雷";s:2:"";s:3:"了";s:2:"";s:3:"僚";s:2:"";s:3:"寮";s:2:"";s:3:"廖";s:2:"";s:3:"料";s:2:"";s:3:"燎";s:2:"";s:3:"療";s:2:"";s:3:"瞭";s:2:"";s:3:"聊";s:2:"";s:3:"蓼";s:2:"ס";s:3:"遼";s:2:"ע";s:3:"鬧";s:2:"ף";s:3:"龍";s:2:"פ";s:3:"壘";s:2:"ץ";s:3:"婁";s:2:"צ";s:3:"屢";s:2:"ק";s:3:"樓";s:2:"ר";s:3:"淚";s:2:"ש";s:3:"漏";s:2:"ת";s:3:"瘻";s:2:"׫";s:3:"累";s:2:"׬";s:3:"縷";s:2:"׭";s:3:"蔞";s:2:"׮";s:3:"褸";s:2:"ׯ";s:3:"鏤";s:2:"װ";s:3:"陋";s:2:"ױ";s:3:"劉";s:2:"ײ";s:3:"旒";s:2:"׳";s:3:"柳";s:2:"״";s:3:"榴";s:2:"׵";s:3:"流";s:2:"׶";s:3:"溜";s:2:"׷";s:3:"瀏";s:2:"׸";s:3:"琉";s:2:"׹";s:3:"瑠";s:2:"׺";s:3:"留";s:2:"׻";s:3:"瘤";s:2:"׼";s:3:"硫";s:2:"׽";s:3:"謬";s:2:"׾";s:3:"類";s:2:"׿";s:3:"六";s:2:"";s:3:"戮";s:2:"";s:3:"陸";s:2:"";s:3:"侖";s:2:"";s:3:"倫";s:2:"";s:3:"崙";s:2:"";s:3:"淪";s:2:"";s:3:"綸";s:2:"";s:3:"輪";s:2:"";s:3:"律";s:2:"";s:3:"慄";s:2:"";s:3:"栗";s:2:"";s:3:"率";s:2:"";s:3:"隆";s:2:"";s:3:"勒";s:2:"";s:3:"肋";s:2:"";s:3:"凜";s:2:"";s:3:"凌";s:2:"";s:3:"楞";s:2:"";s:3:"稜";s:2:"";s:3:"綾";s:2:"";s:3:"菱";s:2:"";s:3:"陵";s:2:"";s:3:"俚";s:2:"";s:3:"利";s:2:"";s:3:"厘";s:2:"";s:3:"吏";s:2:"";s:3:"唎";s:2:"";s:3:"履";s:2:"";s:3:"悧";s:2:"";s:3:"李";s:2:"";s:3:"梨";s:2:"";s:3:"浬";s:2:"";s:3:"犁";s:2:"";s:3:"狸";s:2:"";s:3:"理";s:2:"";s:3:"璃";s:2:"";s:3:"異";s:2:"";s:3:"痢";s:2:"";s:3:"籬";s:2:"";s:3:"罹";s:2:"";s:3:"羸";s:2:"";s:3:"莉";s:2:"";s:3:"裏";s:2:"";s:3:"裡";s:2:"";s:3:"里";s:2:"";s:3:"釐";s:2:"";s:3:"離";s:2:"";s:3:"鯉";s:2:"";s:3:"吝";s:2:"";s:3:"潾";s:2:"";s:3:"燐";s:2:"";s:3:"璘";s:2:"";s:3:"藺";s:2:"";s:3:"躪";s:2:"";s:3:"隣";s:2:"";s:3:"鱗";s:2:"";s:3:"麟";s:2:"";s:3:"林";s:2:"";s:3:"淋";s:2:"";s:3:"琳";s:2:"";s:3:"臨";s:2:"";s:3:"霖";s:2:"";s:3:"砬";s:2:"ء";s:3:"立";s:2:"آ";s:3:"笠";s:2:"أ";s:3:"粒";s:2:"ؤ";s:3:"摩";s:2:"إ";s:3:"瑪";s:2:"ئ";s:3:"痲";s:2:"ا";s:3:"碼";s:2:"ب";s:3:"磨";s:2:"ة";s:3:"馬";s:2:"ت";s:3:"魔";s:2:"ث";s:3:"麻";s:2:"ج";s:3:"寞";s:2:"ح";s:3:"幕";s:2:"خ";s:3:"漠";s:2:"د";s:3:"膜";s:2:"ذ";s:3:"莫";s:2:"ر";s:3:"邈";s:2:"ز";s:3:"万";s:2:"س";s:3:"卍";s:2:"ش";s:3:"娩";s:2:"ص";s:3:"巒";s:2:"ض";s:3:"彎";s:2:"ط";s:3:"慢";s:2:"ظ";s:3:"挽";s:2:"ع";s:3:"晩";s:2:"غ";s:3:"曼";s:2:"ػ";s:3:"滿";s:2:"ؼ";s:3:"漫";s:2:"ؽ";s:3:"灣";s:2:"ؾ";s:3:"瞞";s:2:"ؿ";s:3:"萬";s:2:"";s:3:"蔓";s:2:"";s:3:"蠻";s:2:"";s:3:"輓";s:2:"";s:3:"饅";s:2:"";s:3:"鰻";s:2:"";s:3:"唜";s:2:"";s:3:"抹";s:2:"";s:3:"末";s:2:"";s:3:"沫";s:2:"";s:3:"茉";s:2:"";s:3:"襪";s:2:"";s:3:"靺";s:2:"";s:3:"亡";s:2:"";s:3:"妄";s:2:"";s:3:"忘";s:2:"";s:3:"忙";s:2:"";s:3:"望";s:2:"";s:3:"網";s:2:"";s:3:"罔";s:2:"";s:3:"芒";s:2:"";s:3:"茫";s:2:"";s:3:"莽";s:2:"";s:3:"輞";s:2:"";s:3:"邙";s:2:"";s:3:"埋";s:2:"";s:3:"妹";s:2:"";s:3:"媒";s:2:"";s:3:"寐";s:2:"";s:3:"昧";s:2:"";s:3:"枚";s:2:"";s:3:"梅";s:2:"";s:3:"每";s:2:"";s:3:"煤";s:2:"";s:3:"罵";s:2:"";s:3:"買";s:2:"";s:3:"賣";s:2:"";s:3:"邁";s:2:"";s:3:"魅";s:2:"";s:3:"脈";s:2:"";s:3:"貊";s:2:"";s:3:"陌";s:2:"";s:3:"驀";s:2:"";s:3:"麥";s:2:"";s:3:"孟";s:2:"";s:3:"氓";s:2:"";s:3:"猛";s:2:"";s:3:"盲";s:2:"";s:3:"盟";s:2:"";s:3:"萌";s:2:"";s:3:"冪";s:2:"";s:3:"覓";s:2:"";s:3:"免";s:2:"";s:3:"冕";s:2:"";s:3:"勉";s:2:"";s:3:"棉";s:2:"";s:3:"沔";s:2:"";s:3:"眄";s:2:"";s:3:"眠";s:2:"";s:3:"綿";s:2:"";s:3:"緬";s:2:"";s:3:"面";s:2:"";s:3:"麵";s:2:"";s:3:"滅";s:2:"١";s:3:"蔑";s:2:"٢";s:3:"冥";s:2:"٣";s:3:"名";s:2:"٤";s:3:"命";s:2:"٥";s:3:"明";s:2:"٦";s:3:"暝";s:2:"٧";s:3:"椧";s:2:"٨";s:3:"溟";s:2:"٩";s:3:"皿";s:2:"٪";s:3:"瞑";s:2:"٫";s:3:"茗";s:2:"٬";s:3:"蓂";s:2:"٭";s:3:"螟";s:2:"ٮ";s:3:"酩";s:2:"ٯ";s:3:"銘";s:2:"ٰ";s:3:"鳴";s:2:"ٱ";s:3:"袂";s:2:"ٲ";s:3:"侮";s:2:"ٳ";s:3:"冒";s:2:"ٴ";s:3:"募";s:2:"ٵ";s:3:"姆";s:2:"ٶ";s:3:"帽";s:2:"ٷ";s:3:"慕";s:2:"ٸ";s:3:"摸";s:2:"ٹ";s:3:"摹";s:2:"ٺ";s:3:"暮";s:2:"ٻ";s:3:"某";s:2:"ټ";s:3:"模";s:2:"ٽ";s:3:"母";s:2:"پ";s:3:"毛";s:2:"ٿ";s:3:"牟";s:2:"";s:3:"牡";s:2:"";s:3:"瑁";s:2:"";s:3:"眸";s:2:"";s:3:"矛";s:2:"";s:3:"耗";s:2:"";s:3:"芼";s:2:"";s:3:"茅";s:2:"";s:3:"謀";s:2:"";s:3:"謨";s:2:"";s:3:"貌";s:2:"";s:3:"木";s:2:"";s:3:"沐";s:2:"";s:3:"牧";s:2:"";s:3:"目";s:2:"";s:3:"睦";s:2:"";s:3:"穆";s:2:"";s:3:"鶩";s:2:"";s:3:"歿";s:2:"";s:3:"沒";s:2:"";s:3:"夢";s:2:"";s:3:"朦";s:2:"";s:3:"蒙";s:2:"";s:3:"卯";s:2:"";s:3:"墓";s:2:"";s:3:"妙";s:2:"";s:3:"廟";s:2:"";s:3:"描";s:2:"";s:3:"昴";s:2:"";s:3:"杳";s:2:"";s:3:"渺";s:2:"";s:3:"猫";s:2:"";s:3:"竗";s:2:"";s:3:"苗";s:2:"";s:3:"錨";s:2:"";s:3:"務";s:2:"";s:3:"巫";s:2:"";s:3:"憮";s:2:"";s:3:"懋";s:2:"";s:3:"戊";s:2:"";s:3:"拇";s:2:"";s:3:"撫";s:2:"";s:3:"无";s:2:"";s:3:"楙";s:2:"";s:3:"武";s:2:"";s:3:"毋";s:2:"";s:3:"無";s:2:"";s:3:"珷";s:2:"";s:3:"畝";s:2:"";s:3:"繆";s:2:"";s:3:"舞";s:2:"";s:3:"茂";s:2:"";s:3:"蕪";s:2:"";s:3:"誣";s:2:"";s:3:"貿";s:2:"";s:3:"霧";s:2:"";s:3:"鵡";s:2:"";s:3:"墨";s:2:"";s:3:"默";s:2:"";s:3:"們";s:2:"";s:3:"刎";s:2:"";s:3:"吻";s:2:"";s:3:"問";s:2:"";s:3:"文";s:2:"ڡ";s:3:"汶";s:2:"ڢ";s:3:"紊";s:2:"ڣ";s:3:"紋";s:2:"ڤ";s:3:"聞";s:2:"ڥ";s:3:"蚊";s:2:"ڦ";s:3:"門";s:2:"ڧ";s:3:"雯";s:2:"ڨ";s:3:"勿";s:2:"ک";s:3:"沕";s:2:"ڪ";s:3:"物";s:2:"ګ";s:3:"味";s:2:"ڬ";s:3:"媚";s:2:"ڭ";s:3:"尾";s:2:"ڮ";s:3:"嵋";s:2:"گ";s:3:"彌";s:2:"ڰ";s:3:"微";s:2:"ڱ";s:3:"未";s:2:"ڲ";s:3:"梶";s:2:"ڳ";s:3:"楣";s:2:"ڴ";s:3:"渼";s:2:"ڵ";s:3:"湄";s:2:"ڶ";s:3:"眉";s:2:"ڷ";s:3:"米";s:2:"ڸ";s:3:"美";s:2:"ڹ";s:3:"薇";s:2:"ں";s:3:"謎";s:2:"ڻ";s:3:"迷";s:2:"ڼ";s:3:"靡";s:2:"ڽ";s:3:"黴";s:2:"ھ";s:3:"岷";s:2:"ڿ";s:3:"悶";s:2:"";s:3:"愍";s:2:"";s:3:"憫";s:2:"";s:3:"敏";s:2:"";s:3:"旻";s:2:"";s:3:"旼";s:2:"";s:3:"民";s:2:"";s:3:"泯";s:2:"";s:3:"玟";s:2:"";s:3:"珉";s:2:"";s:3:"緡";s:2:"";s:3:"閔";s:2:"";s:3:"密";s:2:"";s:3:"蜜";s:2:"";s:3:"謐";s:2:"";s:3:"剝";s:2:"";s:3:"博";s:2:"";s:3:"拍";s:2:"";s:3:"搏";s:2:"";s:3:"撲";s:2:"";s:3:"朴";s:2:"";s:3:"樸";s:2:"";s:3:"泊";s:2:"";s:3:"珀";s:2:"";s:3:"璞";s:2:"";s:3:"箔";s:2:"";s:3:"粕";s:2:"";s:3:"縛";s:2:"";s:3:"膊";s:2:"";s:3:"舶";s:2:"";s:3:"薄";s:2:"";s:3:"迫";s:2:"";s:3:"雹";s:2:"";s:3:"駁";s:2:"";s:3:"伴";s:2:"";s:3:"半";s:2:"";s:3:"反";s:2:"";s:3:"叛";s:2:"";s:3:"拌";s:2:"";s:3:"搬";s:2:"";s:3:"攀";s:2:"";s:3:"斑";s:2:"";s:3:"槃";s:2:"";s:3:"泮";s:2:"";s:3:"潘";s:2:"";s:3:"班";s:2:"";s:3:"畔";s:2:"";s:3:"瘢";s:2:"";s:3:"盤";s:2:"";s:3:"盼";s:2:"";s:3:"磐";s:2:"";s:3:"磻";s:2:"";s:3:"礬";s:2:"";s:3:"絆";s:2:"";s:3:"般";s:2:"";s:3:"蟠";s:2:"";s:3:"返";s:2:"";s:3:"頒";s:2:"";s:3:"飯";s:2:"";s:3:"勃";s:2:"";s:3:"拔";s:2:"";s:3:"撥";s:2:"";s:3:"渤";s:2:"";s:3:"潑";s:2:"ۡ";s:3:"發";s:2:"ۢ";s:3:"跋";s:2:"ۣ";s:3:"醱";s:2:"ۤ";s:3:"鉢";s:2:"ۥ";s:3:"髮";s:2:"ۦ";s:3:"魃";s:2:"ۧ";s:3:"倣";s:2:"ۨ";s:3:"傍";s:2:"۩";s:3:"坊";s:2:"۪";s:3:"妨";s:2:"۫";s:3:"尨";s:2:"۬";s:3:"幇";s:2:"ۭ";s:3:"彷";s:2:"ۮ";s:3:"房";s:2:"ۯ";s:3:"放";s:2:"۰";s:3:"方";s:2:"۱";s:3:"旁";s:2:"۲";s:3:"昉";s:2:"۳";s:3:"枋";s:2:"۴";s:3:"榜";s:2:"۵";s:3:"滂";s:2:"۶";s:3:"磅";s:2:"۷";s:3:"紡";s:2:"۸";s:3:"肪";s:2:"۹";s:3:"膀";s:2:"ۺ";s:3:"舫";s:2:"ۻ";s:3:"芳";s:2:"ۼ";s:3:"蒡";s:2:"۽";s:3:"蚌";s:2:"۾";s:3:"訪";s:2:"ۿ";s:3:"謗";s:2:"";s:3:"邦";s:2:"";s:3:"防";s:2:"";s:3:"龐";s:2:"";s:3:"倍";s:2:"";s:3:"俳";s:2:"";s:3:"北";s:2:"";s:3:"培";s:2:"";s:3:"徘";s:2:"";s:3:"拜";s:2:"";s:3:"排";s:2:"";s:3:"杯";s:2:"";s:3:"湃";s:2:"";s:3:"焙";s:2:"";s:3:"盃";s:2:"";s:3:"背";s:2:"";s:3:"胚";s:2:"";s:3:"裴";s:2:"";s:3:"裵";s:2:"";s:3:"褙";s:2:"";s:3:"賠";s:2:"";s:3:"輩";s:2:"";s:3:"配";s:2:"";s:3:"陪";s:2:"";s:3:"伯";s:2:"";s:3:"佰";s:2:"";s:3:"帛";s:2:"";s:3:"柏";s:2:"";s:3:"栢";s:2:"";s:3:"白";s:2:"";s:3:"百";s:2:"";s:3:"魄";s:2:"";s:3:"幡";s:2:"";s:3:"樊";s:2:"";s:3:"煩";s:2:"";s:3:"燔";s:2:"";s:3:"番";s:2:"";s:3:"磻";s:2:"";s:3:"繁";s:2:"";s:3:"蕃";s:2:"";s:3:"藩";s:2:"";s:3:"飜";s:2:"";s:3:"伐";s:2:"";s:3:"筏";s:2:"";s:3:"罰";s:2:"";s:3:"閥";s:2:"";s:3:"凡";s:2:"";s:3:"帆";s:2:"";s:3:"梵";s:2:"";s:3:"氾";s:2:"";s:3:"汎";s:2:"";s:3:"泛";s:2:"";s:3:"犯";s:2:"";s:3:"範";s:2:"";s:3:"范";s:2:"";s:3:"法";s:2:"";s:3:"琺";s:2:"";s:3:"僻";s:2:"";s:3:"劈";s:2:"";s:3:"壁";s:2:"";s:3:"擘";s:2:"";s:3:"檗";s:2:"";s:3:"璧";s:2:"";s:3:"癖";s:2:"ܡ";s:3:"碧";s:2:"ܢ";s:3:"蘗";s:2:"ܣ";s:3:"闢";s:2:"ܤ";s:3:"霹";s:2:"ܥ";s:3:"便";s:2:"ܦ";s:3:"卞";s:2:"ܧ";s:3:"弁";s:2:"ܨ";s:3:"變";s:2:"ܩ";s:3:"辨";s:2:"ܪ";s:3:"辯";s:2:"ܫ";s:3:"邊";s:2:"ܬ";s:3:"別";s:2:"ܭ";s:3:"瞥";s:2:"ܮ";s:3:"鱉";s:2:"ܯ";s:3:"鼈";s:2:"ܰ";s:3:"丙";s:2:"ܱ";s:3:"倂";s:2:"ܲ";s:3:"兵";s:2:"ܳ";s:3:"屛";s:2:"ܴ";s:3:"幷";s:2:"ܵ";s:3:"昞";s:2:"ܶ";s:3:"昺";s:2:"ܷ";s:3:"柄";s:2:"ܸ";s:3:"棅";s:2:"ܹ";s:3:"炳";s:2:"ܺ";s:3:"甁";s:2:"ܻ";s:3:"病";s:2:"ܼ";s:3:"秉";s:2:"ܽ";s:3:"竝";s:2:"ܾ";s:3:"輧";s:2:"ܿ";s:3:"餠";s:2:"";s:3:"騈";s:2:"";s:3:"保";s:2:"";s:3:"堡";s:2:"";s:3:"報";s:2:"";s:3:"寶";s:2:"";s:3:"普";s:2:"";s:3:"步";s:2:"";s:3:"洑";s:2:"";s:3:"湺";s:2:"";s:3:"潽";s:2:"";s:3:"珤";s:2:"";s:3:"甫";s:2:"";s:3:"菩";s:2:"";s:3:"補";s:2:"";s:3:"褓";s:2:"";s:3:"譜";s:2:"";s:3:"輔";s:2:"";s:3:"伏";s:2:"";s:3:"僕";s:2:"";s:3:"匐";s:2:"";s:3:"卜";s:2:"";s:3:"宓";s:2:"";s:3:"復";s:2:"";s:3:"服";s:2:"";s:3:"福";s:2:"";s:3:"腹";s:2:"";s:3:"茯";s:2:"";s:3:"蔔";s:2:"";s:3:"複";s:2:"";s:3:"覆";s:2:"";s:3:"輹";s:2:"";s:3:"輻";s:2:"";s:3:"馥";s:2:"";s:3:"鰒";s:2:"";s:3:"本";s:2:"";s:3:"乶";s:2:"";s:3:"俸";s:2:"";s:3:"奉";s:2:"";s:3:"封";s:2:"";s:3:"峯";s:2:"";s:3:"峰";s:2:"";s:3:"捧";s:2:"";s:3:"棒";s:2:"";s:3:"烽";s:2:"";s:3:"熢";s:2:"";s:3:"琫";s:2:"";s:3:"縫";s:2:"";s:3:"蓬";s:2:"";s:3:"蜂";s:2:"";s:3:"逢";s:2:"";s:3:"鋒";s:2:"";s:3:"鳳";s:2:"";s:3:"不";s:2:"";s:3:"付";s:2:"";s:3:"俯";s:2:"";s:3:"傅";s:2:"";s:3:"剖";s:2:"";s:3:"副";s:2:"";s:3:"否";s:2:"";s:3:"咐";s:2:"";s:3:"埠";s:2:"";s:3:"夫";s:2:"";s:3:"婦";s:2:"ݡ";s:3:"孚";s:2:"ݢ";s:3:"孵";s:2:"ݣ";s:3:"富";s:2:"ݤ";s:3:"府";s:2:"ݥ";s:3:"復";s:2:"ݦ";s:3:"扶";s:2:"ݧ";s:3:"敷";s:2:"ݨ";s:3:"斧";s:2:"ݩ";s:3:"浮";s:2:"ݪ";s:3:"溥";s:2:"ݫ";s:3:"父";s:2:"ݬ";s:3:"符";s:2:"ݭ";s:3:"簿";s:2:"ݮ";s:3:"缶";s:2:"ݯ";s:3:"腐";s:2:"ݰ";s:3:"腑";s:2:"ݱ";s:3:"膚";s:2:"ݲ";s:3:"艀";s:2:"ݳ";s:3:"芙";s:2:"ݴ";s:3:"莩";s:2:"ݵ";s:3:"訃";s:2:"ݶ";s:3:"負";s:2:"ݷ";s:3:"賦";s:2:"ݸ";s:3:"賻";s:2:"ݹ";s:3:"赴";s:2:"ݺ";s:3:"趺";s:2:"ݻ";s:3:"部";s:2:"ݼ";s:3:"釜";s:2:"ݽ";s:3:"阜";s:2:"ݾ";s:3:"附";s:2:"ݿ";s:3:"駙";s:2:"";s:3:"鳧";s:2:"";s:3:"北";s:2:"";s:3:"分";s:2:"";s:3:"吩";s:2:"";s:3:"噴";s:2:"";s:3:"墳";s:2:"";s:3:"奔";s:2:"";s:3:"奮";s:2:"";s:3:"忿";s:2:"";s:3:"憤";s:2:"";s:3:"扮";s:2:"";s:3:"昐";s:2:"";s:3:"汾";s:2:"";s:3:"焚";s:2:"";s:3:"盆";s:2:"";s:3:"粉";s:2:"";s:3:"糞";s:2:"";s:3:"紛";s:2:"";s:3:"芬";s:2:"";s:3:"賁";s:2:"";s:3:"雰";s:2:"";s:3:"不";s:2:"";s:3:"佛";s:2:"";s:3:"弗";s:2:"";s:3:"彿";s:2:"";s:3:"拂";s:2:"";s:3:"崩";s:2:"";s:3:"朋";s:2:"";s:3:"棚";s:2:"";s:3:"硼";s:2:"";s:3:"繃";s:2:"";s:3:"鵬";s:2:"";s:3:"丕";s:2:"";s:3:"備";s:2:"";s:3:"匕";s:2:"";s:3:"匪";s:2:"";s:3:"卑";s:2:"";s:3:"妃";s:2:"";s:3:"婢";s:2:"";s:3:"庇";s:2:"";s:3:"悲";s:2:"";s:3:"憊";s:2:"";s:3:"扉";s:2:"";s:3:"批";s:2:"";s:3:"斐";s:2:"";s:3:"枇";s:2:"";s:3:"榧";s:2:"";s:3:"比";s:2:"";s:3:"毖";s:2:"";s:3:"毗";s:2:"";s:3:"毘";s:2:"";s:3:"沸";s:2:"";s:3:"泌";s:2:"";s:3:"琵";s:2:"";s:3:"痺";s:2:"";s:3:"砒";s:2:"";s:3:"碑";s:2:"";s:3:"秕";s:2:"";s:3:"秘";s:2:"";s:3:"粃";s:2:"";s:3:"緋";s:2:"";s:3:"翡";s:2:"";s:3:"肥";s:2:"ޡ";s:3:"脾";s:2:"ޢ";s:3:"臂";s:2:"ޣ";s:3:"菲";s:2:"ޤ";s:3:"蜚";s:2:"ޥ";s:3:"裨";s:2:"ަ";s:3:"誹";s:2:"ާ";s:3:"譬";s:2:"ި";s:3:"費";s:2:"ީ";s:3:"鄙";s:2:"ު";s:3:"非";s:2:"ޫ";s:3:"飛";s:2:"ެ";s:3:"鼻";s:2:"ޭ";s:3:"嚬";s:2:"ޮ";s:3:"嬪";s:2:"ޯ";s:3:"彬";s:2:"ް";s:3:"斌";s:2:"ޱ";s:3:"檳";s:2:"޲";s:3:"殯";s:2:"޳";s:3:"浜";s:2:"޴";s:3:"濱";s:2:"޵";s:3:"瀕";s:2:"޶";s:3:"牝";s:2:"޷";s:3:"玭";s:2:"޸";s:3:"貧";s:2:"޹";s:3:"賓";s:2:"޺";s:3:"頻";s:2:"޻";s:3:"憑";s:2:"޼";s:3:"氷";s:2:"޽";s:3:"聘";s:2:"޾";s:3:"騁";s:2:"޿";s:3:"乍";s:2:"";s:3:"事";s:2:"";s:3:"些";s:2:"";s:3:"仕";s:2:"";s:3:"伺";s:2:"";s:3:"似";s:2:"";s:3:"使";s:2:"";s:3:"俟";s:2:"";s:3:"僿";s:2:"";s:3:"史";s:2:"";s:3:"司";s:2:"";s:3:"唆";s:2:"";s:3:"嗣";s:2:"";s:3:"四";s:2:"";s:3:"士";s:2:"";s:3:"奢";s:2:"";s:3:"娑";s:2:"";s:3:"寫";s:2:"";s:3:"寺";s:2:"";s:3:"射";s:2:"";s:3:"巳";s:2:"";s:3:"師";s:2:"";s:3:"徙";s:2:"";s:3:"思";s:2:"";s:3:"捨";s:2:"";s:3:"斜";s:2:"";s:3:"斯";s:2:"";s:3:"柶";s:2:"";s:3:"査";s:2:"";s:3:"梭";s:2:"";s:3:"死";s:2:"";s:3:"沙";s:2:"";s:3:"泗";s:2:"";s:3:"渣";s:2:"";s:3:"瀉";s:2:"";s:3:"獅";s:2:"";s:3:"砂";s:2:"";s:3:"社";s:2:"";s:3:"祀";s:2:"";s:3:"祠";s:2:"";s:3:"私";s:2:"";s:3:"篩";s:2:"";s:3:"紗";s:2:"";s:3:"絲";s:2:"";s:3:"肆";s:2:"";s:3:"舍";s:2:"";s:3:"莎";s:2:"";s:3:"蓑";s:2:"";s:3:"蛇";s:2:"";s:3:"裟";s:2:"";s:3:"詐";s:2:"";s:3:"詞";s:2:"";s:3:"謝";s:2:"";s:3:"賜";s:2:"";s:3:"赦";s:2:"";s:3:"辭";s:2:"";s:3:"邪";s:2:"";s:3:"飼";s:2:"";s:3:"駟";s:2:"";s:3:"麝";s:2:"";s:3:"削";s:2:"";s:3:"數";s:2:"";s:3:"朔";s:2:"";s:3:"索";s:2:"ߡ";s:3:"傘";s:2:"ߢ";s:3:"刪";s:2:"ߣ";s:3:"山";s:2:"ߤ";s:3:"散";s:2:"ߥ";s:3:"汕";s:2:"ߦ";s:3:"珊";s:2:"ߧ";s:3:"産";s:2:"ߨ";s:3:"疝";s:2:"ߩ";s:3:"算";s:2:"ߪ";s:3:"蒜";s:2:"߫";s:3:"酸";s:2:"߬";s:3:"霰";s:2:"߭";s:3:"乷";s:2:"߮";s:3:"撒";s:2:"߯";s:3:"殺";s:2:"߰";s:3:"煞";s:2:"߱";s:3:"薩";s:2:"߲";s:3:"三";s:2:"߳";s:3:"參";s:2:"ߴ";s:3:"杉";s:2:"ߵ";s:3:"森";s:2:"߶";s:3:"渗";s:2:"߷";s:3:"芟";s:2:"߸";s:3:"蔘";s:2:"߹";s:3:"衫";s:2:"ߺ";s:3:"揷";s:2:"߻";s:3:"澁";s:2:"߼";s:3:"鈒";s:2:"߽";s:3:"颯";s:2:"߾";s:3:"上";s:2:"߿";s:3:"傷";s:2:"";s:3:"像";s:2:"";s:3:"償";s:2:"";s:3:"商";s:2:"";s:3:"喪";s:2:"";s:3:"嘗";s:2:"";s:3:"孀";s:2:"";s:3:"尙";s:2:"";s:3:"峠";s:2:"";s:3:"常";s:2:"";s:3:"床";s:2:"";s:3:"庠";s:2:"";s:3:"廂";s:2:"";s:3:"想";s:2:"";s:3:"桑";s:2:"";s:3:"橡";s:2:"";s:3:"湘";s:2:"";s:3:"爽";s:2:"";s:3:"牀";s:2:"";s:3:"狀";s:2:"";s:3:"相";s:2:"";s:3:"祥";s:2:"";s:3:"箱";s:2:"";s:3:"翔";s:2:"";s:3:"裳";s:2:"";s:3:"觴";s:2:"";s:3:"詳";s:2:"";s:3:"象";s:2:"";s:3:"賞";s:2:"";s:3:"霜";s:2:"";s:3:"塞";s:2:"";s:3:"璽";s:2:"";s:3:"賽";s:2:"";s:3:"嗇";s:2:"";s:3:"塞";s:2:"";s:3:"穡";s:2:"";s:3:"索";s:2:"";s:3:"色";s:2:"";s:3:"牲";s:2:"";s:3:"生";s:2:"";s:3:"甥";s:2:"";s:3:"省";s:2:"";s:3:"笙";s:2:"";s:3:"墅";s:2:"";s:3:"壻";s:2:"";s:3:"嶼";s:2:"";s:3:"序";s:2:"";s:3:"庶";s:2:"";s:3:"徐";s:2:"";s:3:"恕";s:2:"";s:3:"抒";s:2:"";s:3:"捿";s:2:"";s:3:"敍";s:2:"";s:3:"暑";s:2:"";s:3:"曙";s:2:"";s:3:"書";s:2:"";s:3:"栖";s:2:"";s:3:"棲";s:2:"";s:3:"犀";s:2:"";s:3:"瑞";s:2:"";s:3:"筮";s:2:"";s:3:"絮";s:2:"";s:3:"緖";s:2:"";s:3:"署";s:2:"";s:3:"胥";s:2:"";s:3:"舒";s:2:"";s:3:"薯";s:2:"";s:3:"西";s:2:"";s:3:"誓";s:2:"";s:3:"逝";s:2:"";s:3:"鋤";s:2:"";s:3:"黍";s:2:"";s:3:"鼠";s:2:"";s:3:"夕";s:2:"";s:3:"奭";s:2:"";s:3:"席";s:2:"";s:3:"惜";s:2:"";s:3:"昔";s:2:"";s:3:"晳";s:2:"";s:3:"析";s:2:"";s:3:"汐";s:2:"";s:3:"淅";s:2:"";s:3:"潟";s:2:"";s:3:"石";s:2:"";s:3:"碩";s:2:"";s:3:"蓆";s:2:"";s:3:"釋";s:2:"";s:3:"錫";s:2:"";s:3:"仙";s:2:"";s:3:"僊";s:2:"";s:3:"先";s:2:"";s:3:"善";s:2:"";s:3:"嬋";s:2:"";s:3:"宣";s:2:"";s:3:"扇";s:2:"";s:3:"敾";s:2:"";s:3:"旋";s:2:"";s:3:"渲";s:2:"";s:3:"煽";s:2:"";s:3:"琁";s:2:"";s:3:"瑄";s:2:"";s:3:"璇";s:2:"";s:3:"璿";s:2:"";s:3:"癬";s:2:"";s:3:"禪";s:2:"";s:3:"線";s:2:"";s:3:"繕";s:2:"";s:3:"羨";s:2:"";s:3:"腺";s:2:"";s:3:"膳";s:2:"";s:3:"船";s:2:"";s:3:"蘚";s:2:"";s:3:"蟬";s:2:"";s:3:"詵";s:2:"";s:3:"跣";s:2:"";s:3:"選";s:2:"";s:3:"銑";s:2:"";s:3:"鐥";s:2:"";s:3:"饍";s:2:"";s:3:"鮮";s:2:"";s:3:"卨";s:2:"";s:3:"屑";s:2:"";s:3:"楔";s:2:"";s:3:"泄";s:2:"";s:3:"洩";s:2:"";s:3:"渫";s:2:"";s:3:"舌";s:2:"";s:3:"薛";s:2:"";s:3:"褻";s:2:"";s:3:"設";s:2:"";s:3:"說";s:2:"";s:3:"雪";s:2:"";s:3:"齧";s:2:"";s:3:"剡";s:2:"";s:3:"暹";s:2:"";s:3:"殲";s:2:"";s:3:"纖";s:2:"";s:3:"蟾";s:2:"";s:3:"贍";s:2:"";s:3:"閃";s:2:"";s:3:"陝";s:2:"";s:3:"攝";s:2:"";s:3:"涉";s:2:"";s:3:"燮";s:2:"";s:3:"葉";s:2:"";s:3:"城";s:2:"";s:3:"姓";s:2:"";s:3:"宬";s:2:"";s:3:"性";s:2:"";s:3:"惺";s:2:"";s:3:"成";s:2:"";s:3:"星";s:2:"";s:3:"晟";s:2:"";s:3:"猩";s:2:"";s:3:"珹";s:2:"";s:3:"盛";s:2:"";s:3:"省";s:2:"";s:3:"筬";s:2:"";s:3:"聖";s:2:"";s:3:"聲";s:2:"";s:3:"腥";s:2:"";s:3:"誠";s:2:"";s:3:"醒";s:2:"";s:3:"世";s:2:"";s:3:"勢";s:2:"";s:3:"歲";s:2:"";s:3:"洗";s:2:"";s:3:"稅";s:2:"";s:3:"笹";s:2:"";s:3:"細";s:2:"";s:3:"說";s:2:"";s:3:"貰";s:2:"";s:3:"召";s:2:"";s:3:"嘯";s:2:"";s:3:"塑";s:2:"";s:3:"宵";s:2:"";s:3:"小";s:2:"";s:3:"少";s:2:"";s:3:"巢";s:2:"";s:3:"所";s:2:"";s:3:"掃";s:2:"";s:3:"搔";s:2:"";s:3:"昭";s:2:"";s:3:"梳";s:2:"";s:3:"沼";s:2:"";s:3:"消";s:2:"";s:3:"溯";s:2:"";s:3:"瀟";s:2:"";s:3:"炤";s:2:"";s:3:"燒";s:2:"";s:3:"甦";s:2:"";s:3:"疏";s:2:"";s:3:"疎";s:2:"";s:3:"瘙";s:2:"";s:3:"笑";s:2:"";s:3:"篠";s:2:"";s:3:"簫";s:2:"";s:3:"素";s:2:"";s:3:"紹";s:2:"";s:3:"蔬";s:2:"";s:3:"蕭";s:2:"";s:3:"蘇";s:2:"";s:3:"訴";s:2:"";s:3:"逍";s:2:"";s:3:"遡";s:2:"";s:3:"邵";s:2:"";s:3:"銷";s:2:"";s:3:"韶";s:2:"";s:3:"騷";s:2:"";s:3:"俗";s:2:"";s:3:"屬";s:2:"";s:3:"束";s:2:"";s:3:"涑";s:2:"";s:3:"粟";s:2:"";s:3:"續";s:2:"";s:3:"謖";s:2:"";s:3:"贖";s:2:"";s:3:"速";s:2:"";s:3:"孫";s:2:"";s:3:"巽";s:2:"";s:3:"損";s:2:"";s:3:"蓀";s:2:"";s:3:"遜";s:2:"";s:3:"飡";s:2:"";s:3:"率";s:2:"";s:3:"宋";s:2:"";s:3:"悚";s:2:"";s:3:"松";s:2:"";s:3:"淞";s:2:"";s:3:"訟";s:2:"";s:3:"誦";s:2:"";s:3:"送";s:2:"";s:3:"頌";s:2:"";s:3:"刷";s:2:"";s:3:"殺";s:2:"";s:3:"灑";s:2:"";s:3:"碎";s:2:"";s:3:"鎖";s:2:"";s:3:"衰";s:2:"";s:3:"釗";s:2:"";s:3:"修";s:2:"";s:3:"受";s:2:"";s:3:"嗽";s:2:"";s:3:"囚";s:2:"";s:3:"垂";s:2:"";s:3:"壽";s:2:"";s:3:"嫂";s:2:"";s:3:"守";s:2:"";s:3:"岫";s:2:"";s:3:"峀";s:2:"";s:3:"帥";s:2:"";s:3:"愁";s:2:"";s:3:"戍";s:2:"";s:3:"手";s:2:"";s:3:"授";s:2:"";s:3:"搜";s:2:"";s:3:"收";s:2:"";s:3:"數";s:2:"";s:3:"樹";s:2:"";s:3:"殊";s:2:"";s:3:"水";s:2:"";s:3:"洙";s:2:"";s:3:"漱";s:2:"";s:3:"燧";s:2:"";s:3:"狩";s:2:"";s:3:"獸";s:2:"";s:3:"琇";s:2:"";s:3:"璲";s:2:"";s:3:"瘦";s:2:"";s:3:"睡";s:2:"";s:3:"秀";s:2:"";s:3:"穗";s:2:"";s:3:"竪";s:2:"";s:3:"粹";s:2:"";s:3:"綏";s:2:"";s:3:"綬";s:2:"";s:3:"繡";s:2:"";s:3:"羞";s:2:"";s:3:"脩";s:2:"";s:3:"茱";s:2:"";s:3:"蒐";s:2:"";s:3:"蓚";s:2:"";s:3:"藪";s:2:"";s:3:"袖";s:2:"";s:3:"誰";s:2:"";s:3:"讐";s:2:"";s:3:"輸";s:2:"";s:3:"遂";s:2:"";s:3:"邃";s:2:"";s:3:"酬";s:2:"";s:3:"銖";s:2:"";s:3:"銹";s:2:"";s:3:"隋";s:2:"";s:3:"隧";s:2:"";s:3:"隨";s:2:"";s:3:"雖";s:2:"";s:3:"需";s:2:"";s:3:"須";s:2:"";s:3:"首";s:2:"";s:3:"髓";s:2:"";s:3:"鬚";s:2:"";s:3:"叔";s:2:"";s:3:"塾";s:2:"";s:3:"夙";s:2:"";s:3:"孰";s:2:"";s:3:"宿";s:2:"";s:3:"淑";s:2:"";s:3:"潚";s:2:"";s:3:"熟";s:2:"";s:3:"琡";s:2:"";s:3:"璹";s:2:"";s:3:"肅";s:2:"";s:3:"菽";s:2:"";s:3:"巡";s:2:"";s:3:"徇";s:2:"";s:3:"循";s:2:"";s:3:"恂";s:2:"";s:3:"旬";s:2:"";s:3:"栒";s:2:"";s:3:"楯";s:2:"";s:3:"橓";s:2:"";s:3:"殉";s:2:"";s:3:"洵";s:2:"";s:3:"淳";s:2:"";s:3:"珣";s:2:"";s:3:"盾";s:2:"";s:3:"瞬";s:2:"";s:3:"筍";s:2:"";s:3:"純";s:2:"";s:3:"脣";s:2:"";s:3:"舜";s:2:"";s:3:"荀";s:2:"";s:3:"蓴";s:2:"";s:3:"蕣";s:2:"";s:3:"詢";s:2:"";s:3:"諄";s:2:"";s:3:"醇";s:2:"";s:3:"錞";s:2:"";s:3:"順";s:2:"";s:3:"馴";s:2:"";s:3:"戌";s:2:"";s:3:"術";s:2:"";s:3:"述";s:2:"";s:3:"鉥";s:2:"";s:3:"崇";s:2:"";s:3:"崧";s:2:"";s:3:"嵩";s:2:"";s:3:"瑟";s:2:"";s:3:"膝";s:2:"";s:3:"蝨";s:2:"";s:3:"濕";s:2:"";s:3:"拾";s:2:"";s:3:"習";s:2:"";s:3:"褶";s:2:"";s:3:"襲";s:2:"";s:3:"丞";s:2:"";s:3:"乘";s:2:"";s:3:"僧";s:2:"";s:3:"勝";s:2:"";s:3:"升";s:2:"";s:3:"承";s:2:"";s:3:"昇";s:2:"";s:3:"繩";s:2:"";s:3:"蠅";s:2:"";s:3:"陞";s:2:"";s:3:"侍";s:2:"";s:3:"匙";s:2:"";s:3:"嘶";s:2:"";s:3:"始";s:2:"";s:3:"媤";s:2:"";s:3:"尸";s:2:"";s:3:"屎";s:2:"";s:3:"屍";s:2:"";s:3:"市";s:2:"";s:3:"弑";s:2:"";s:3:"恃";s:2:"";s:3:"施";s:2:"";s:3:"是";s:2:"";s:3:"時";s:2:"";s:3:"枾";s:2:"";s:3:"柴";s:2:"";s:3:"猜";s:2:"";s:3:"矢";s:2:"";s:3:"示";s:2:"";s:3:"翅";s:2:"";s:3:"蒔";s:2:"";s:3:"蓍";s:2:"";s:3:"視";s:2:"";s:3:"試";s:2:"";s:3:"詩";s:2:"";s:3:"諡";s:2:"";s:3:"豕";s:2:"";s:3:"豺";s:2:"";s:3:"埴";s:2:"";s:3:"寔";s:2:"";s:3:"式";s:2:"";s:3:"息";s:2:"";s:3:"拭";s:2:"";s:3:"植";s:2:"";s:3:"殖";s:2:"";s:3:"湜";s:2:"";s:3:"熄";s:2:"";s:3:"篒";s:2:"";s:3:"蝕";s:2:"";s:3:"識";s:2:"";s:3:"軾";s:2:"";s:3:"食";s:2:"";s:3:"飾";s:2:"";s:3:"伸";s:2:"";s:3:"侁";s:2:"";s:3:"信";s:2:"";s:3:"呻";s:2:"";s:3:"娠";s:2:"";s:3:"宸";s:2:"";s:3:"愼";s:2:"";s:3:"新";s:2:"";s:3:"晨";s:2:"";s:3:"燼";s:2:"";s:3:"申";s:2:"";s:3:"神";s:2:"";s:3:"紳";s:2:"";s:3:"腎";s:2:"";s:3:"臣";s:2:"";s:3:"莘";s:2:"";s:3:"薪";s:2:"";s:3:"藎";s:2:"";s:3:"蜃";s:2:"";s:3:"訊";s:2:"";s:3:"身";s:2:"";s:3:"辛";s:2:"";s:3:"辰";s:2:"";s:3:"迅";s:2:"";s:3:"失";s:2:"";s:3:"室";s:2:"";s:3:"實";s:2:"";s:3:"悉";s:2:"";s:3:"審";s:2:"";s:3:"尋";s:2:"";s:3:"心";s:2:"";s:3:"沁";s:2:"";s:3:"沈";s:2:"";s:3:"深";s:2:"";s:3:"瀋";s:2:"";s:3:"甚";s:2:"";s:3:"芯";s:2:"";s:3:"諶";s:2:"";s:3:"什";s:2:"";s:3:"十";s:2:"";s:3:"拾";s:2:"";s:3:"雙";s:2:"";s:3:"氏";s:2:"";s:3:"亞";s:2:"";s:3:"俄";s:2:"";s:3:"兒";s:2:"";s:3:"啞";s:2:"";s:3:"娥";s:2:"";s:3:"峨";s:2:"";s:3:"我";s:2:"";s:3:"牙";s:2:"";s:3:"芽";s:2:"";s:3:"莪";s:2:"";s:3:"蛾";s:2:"";s:3:"衙";s:2:"";s:3:"訝";s:2:"";s:3:"阿";s:2:"";s:3:"雅";s:2:"";s:3:"餓";s:2:"";s:3:"鴉";s:2:"";s:3:"鵝";s:2:"";s:3:"堊";s:2:"";s:3:"岳";s:2:"";s:3:"嶽";s:2:"";s:3:"幄";s:2:"";s:3:"惡";s:2:"";s:3:"愕";s:2:"";s:3:"握";s:2:"";s:3:"樂";s:2:"";s:3:"渥";s:2:"";s:3:"鄂";s:2:"";s:3:"鍔";s:2:"";s:3:"顎";s:2:"";s:3:"鰐";s:2:"";s:3:"齷";s:2:"";s:3:"安";s:2:"";s:3:"岸";s:2:"";s:3:"按";s:2:"";s:3:"晏";s:2:"";s:3:"案";s:2:"";s:3:"眼";s:2:"";s:3:"雁";s:2:"";s:3:"鞍";s:2:"";s:3:"顔";s:2:"";s:3:"鮟";s:2:"";s:3:"斡";s:2:"";s:3:"謁";s:2:"";s:3:"軋";s:2:"";s:3:"閼";s:2:"";s:3:"唵";s:2:"";s:3:"岩";s:2:"";s:3:"巖";s:2:"";s:3:"庵";s:2:"";s:3:"暗";s:2:"";s:3:"癌";s:2:"";s:3:"菴";s:2:"";s:3:"闇";s:2:"";s:3:"壓";s:2:"";s:3:"押";s:2:"";s:3:"狎";s:2:"";s:3:"鴨";s:2:"";s:3:"仰";s:2:"";s:3:"央";s:2:"";s:3:"怏";s:2:"";s:3:"昻";s:2:"";s:3:"殃";s:2:"";s:3:"秧";s:2:"";s:3:"鴦";s:2:"";s:3:"厓";s:2:"";s:3:"哀";s:2:"";s:3:"埃";s:2:"";s:3:"崖";s:2:"";s:3:"愛";s:2:"";s:3:"曖";s:2:"";s:3:"涯";s:2:"";s:3:"碍";s:2:"";s:3:"艾";s:2:"";s:3:"隘";s:2:"";s:3:"靄";s:2:"";s:3:"厄";s:2:"";s:3:"扼";s:2:"";s:3:"掖";s:2:"";s:3:"液";s:2:"";s:3:"縊";s:2:"";s:3:"腋";s:2:"";s:3:"額";s:2:"";s:3:"櫻";s:2:"";s:3:"罌";s:2:"";s:3:"鶯";s:2:"";s:3:"鸚";s:2:"";s:3:"也";s:2:"";s:3:"倻";s:2:"";s:3:"冶";s:2:"";s:3:"夜";s:2:"";s:3:"惹";s:2:"";s:3:"揶";s:2:"";s:3:"椰";s:2:"";s:3:"爺";s:2:"";s:3:"耶";s:2:"";s:3:"若";s:2:"";s:3:"野";s:2:"";s:3:"弱";s:2:"";s:3:"掠";s:2:"";s:3:"略";s:2:"";s:3:"約";s:2:"";s:3:"若";s:2:"";s:3:"葯";s:2:"";s:3:"蒻";s:2:"";s:3:"藥";s:2:"";s:3:"躍";s:2:"";s:3:"亮";s:2:"";s:3:"佯";s:2:"";s:3:"兩";s:2:"";s:3:"凉";s:2:"";s:3:"壤";s:2:"";s:3:"孃";s:2:"";s:3:"恙";s:2:"";s:3:"揚";s:2:"";s:3:"攘";s:2:"";s:3:"敭";s:2:"";s:3:"暘";s:2:"";s:3:"梁";s:2:"";s:3:"楊";s:2:"";s:3:"樣";s:2:"";s:3:"洋";s:2:"";s:3:"瀁";s:2:"";s:3:"煬";s:2:"";s:3:"痒";s:2:"";s:3:"瘍";s:2:"";s:3:"禳";s:2:"";s:3:"穰";s:2:"";s:3:"糧";s:2:"";s:3:"羊";s:2:"";s:3:"良";s:2:"";s:3:"襄";s:2:"";s:3:"諒";s:2:"";s:3:"讓";s:2:"";s:3:"釀";s:2:"";s:3:"陽";s:2:"";s:3:"量";s:2:"";s:3:"養";s:2:"";s:3:"圄";s:2:"";s:3:"御";s:2:"";s:3:"於";s:2:"";s:3:"漁";s:2:"";s:3:"瘀";s:2:"";s:3:"禦";s:2:"";s:3:"語";s:2:"";s:3:"馭";s:2:"";s:3:"魚";s:2:"";s:3:"齬";s:2:"";s:3:"億";s:2:"";s:3:"憶";s:2:"";s:3:"抑";s:2:"";s:3:"檍";s:2:"";s:3:"臆";s:2:"";s:3:"偃";s:2:"";s:3:"堰";s:2:"";s:3:"彦";s:2:"";s:3:"焉";s:2:"";s:3:"言";s:2:"";s:3:"諺";s:2:"";s:3:"孼";s:2:"";s:3:"蘖";s:2:"";s:3:"俺";s:2:"";s:3:"儼";s:2:"";s:3:"嚴";s:2:"";s:3:"奄";s:2:"";s:3:"掩";s:2:"";s:3:"淹";s:2:"";s:3:"嶪";s:2:"";s:3:"業";s:2:"";s:3:"円";s:2:"";s:3:"予";s:2:"";s:3:"余";s:2:"";s:3:"勵";s:2:"";s:3:"呂";s:2:"";s:3:"女";s:2:"";s:3:"如";s:2:"";s:3:"廬";s:2:"";s:3:"旅";s:2:"";s:3:"歟";s:2:"";s:3:"汝";s:2:"";s:3:"濾";s:2:"";s:3:"璵";s:2:"";s:3:"礖";s:2:"";s:3:"礪";s:2:"";s:3:"與";s:2:"";s:3:"艅";s:2:"";s:3:"茹";s:2:"";s:3:"輿";s:2:"";s:3:"轝";s:2:"";s:3:"閭";s:2:"";s:3:"餘";s:2:"";s:3:"驪";s:2:"";s:3:"麗";s:2:"";s:3:"黎";s:2:"";s:3:"亦";s:2:"";s:3:"力";s:2:"";s:3:"域";s:2:"";s:3:"役";s:2:"";s:3:"易";s:2:"";s:3:"曆";s:2:"";s:3:"歷";s:2:"";s:3:"疫";s:2:"";s:3:"繹";s:2:"";s:3:"譯";s:2:"";s:3:"轢";s:2:"";s:3:"逆";s:2:"";s:3:"驛";s:2:"";s:3:"嚥";s:2:"";s:3:"堧";s:2:"";s:3:"姸";s:2:"";s:3:"娟";s:2:"";s:3:"宴";s:2:"";s:3:"年";s:2:"";s:3:"延";s:2:"";s:3:"憐";s:2:"";s:3:"戀";s:2:"";s:3:"捐";s:2:"";s:3:"挻";s:2:"";s:3:"撚";s:2:"";s:3:"椽";s:2:"";s:3:"沇";s:2:"";s:3:"沿";s:2:"";s:3:"涎";s:2:"";s:3:"涓";s:2:"";s:3:"淵";s:2:"";s:3:"演";s:2:"";s:3:"漣";s:2:"";s:3:"烟";s:2:"";s:3:"然";s:2:"";s:3:"煙";s:2:"";s:3:"煉";s:2:"";s:3:"燃";s:2:"";s:3:"燕";s:2:"";s:3:"璉";s:2:"";s:3:"硏";s:2:"";s:3:"硯";s:2:"";s:3:"秊";s:2:"";s:3:"筵";s:2:"";s:3:"緣";s:2:"";s:3:"練";s:2:"";s:3:"縯";s:2:"";s:3:"聯";s:2:"";s:3:"衍";s:2:"";s:3:"軟";s:2:"";s:3:"輦";s:2:"";s:3:"蓮";s:2:"";s:3:"連";s:2:"";s:3:"鉛";s:2:"";s:3:"鍊";s:2:"";s:3:"鳶";s:2:"";s:3:"列";s:2:"";s:3:"劣";s:2:"";s:3:"咽";s:2:"";s:3:"悅";s:2:"";s:3:"涅";s:2:"";s:3:"烈";s:2:"";s:3:"熱";s:2:"";s:3:"裂";s:2:"";s:3:"說";s:2:"";s:3:"閱";s:2:"";s:3:"厭";s:2:"";s:3:"廉";s:2:"";s:3:"念";s:2:"";s:3:"捻";s:2:"";s:3:"染";s:2:"";s:3:"殮";s:2:"";s:3:"炎";s:2:"";s:3:"焰";s:2:"";s:3:"琰";s:2:"";s:3:"艶";s:2:"";s:3:"苒";s:2:"";s:3:"簾";s:2:"";s:3:"閻";s:2:"";s:3:"髥";s:2:"";s:3:"鹽";s:2:"";s:3:"曄";s:2:"";s:3:"獵";s:2:"";s:3:"燁";s:2:"";s:3:"葉";s:2:"";s:3:"令";s:2:"";s:3:"囹";s:2:"";s:3:"塋";s:2:"";s:3:"寧";s:2:"";s:3:"嶺";s:2:"";s:3:"嶸";s:2:"";s:3:"影";s:2:"";s:3:"怜";s:2:"";s:3:"映";s:2:"";s:3:"暎";s:2:"";s:3:"楹";s:2:"";s:3:"榮";s:2:"";s:3:"永";s:2:"";s:3:"泳";s:2:"";s:3:"渶";s:2:"";s:3:"潁";s:2:"";s:3:"濚";s:2:"";s:3:"瀛";s:2:"";s:3:"瀯";s:2:"";s:3:"煐";s:2:"";s:3:"營";s:2:"";s:3:"獰";s:2:"";s:3:"玲";s:2:"";s:3:"瑛";s:2:"";s:3:"瑩";s:2:"";s:3:"瓔";s:2:"";s:3:"盈";s:2:"";s:3:"穎";s:2:"";s:3:"纓";s:2:"";s:3:"羚";s:2:"";s:3:"聆";s:2:"";s:3:"英";s:2:"";s:3:"詠";s:2:"";s:3:"迎";s:2:"";s:3:"鈴";s:2:"";s:3:"鍈";s:2:"";s:3:"零";s:2:"";s:3:"霙";s:2:"";s:3:"靈";s:2:"";s:3:"領";s:2:"";s:3:"乂";s:2:"";s:3:"倪";s:2:"";s:3:"例";s:2:"";s:3:"刈";s:2:"";s:3:"叡";s:2:"";s:3:"曳";s:2:"";s:3:"汭";s:2:"";s:3:"濊";s:2:"";s:3:"猊";s:2:"";s:3:"睿";s:2:"";s:3:"穢";s:2:"";s:3:"芮";s:2:"";s:3:"藝";s:2:"";s:3:"蘂";s:2:"";s:3:"禮";s:2:"";s:3:"裔";s:2:"";s:3:"詣";s:2:"";s:3:"譽";s:2:"";s:3:"豫";s:2:"";s:3:"醴";s:2:"";s:3:"銳";s:2:"";s:3:"隸";s:2:"";s:3:"霓";s:2:"";s:3:"預";s:2:"";s:3:"五";s:2:"";s:3:"伍";s:2:"";s:3:"俉";s:2:"";s:3:"傲";s:2:"";s:3:"午";s:2:"";s:3:"吾";s:2:"";s:3:"吳";s:2:"";s:3:"嗚";s:2:"";s:3:"塢";s:2:"";s:3:"墺";s:2:"";s:3:"奧";s:2:"";s:3:"娛";s:2:"";s:3:"寤";s:2:"";s:3:"悟";s:2:"";s:3:"惡";s:2:"";s:3:"懊";s:2:"";s:3:"敖";s:2:"";s:3:"旿";s:2:"";s:3:"晤";s:2:"";s:3:"梧";s:2:"";s:3:"汚";s:2:"";s:3:"澳";s:2:"";s:3:"烏";s:2:"";s:3:"熬";s:2:"";s:3:"獒";s:2:"";s:3:"筽";s:2:"";s:3:"蜈";s:2:"";s:3:"誤";s:2:"";s:3:"鰲";s:2:"";s:3:"鼇";s:2:"";s:3:"屋";s:2:"";s:3:"沃";s:2:"";s:3:"獄";s:2:"";s:3:"玉";s:2:"";s:3:"鈺";s:2:"";s:3:"溫";s:2:"";s:3:"瑥";s:2:"";s:3:"瘟";s:2:"";s:3:"穩";s:2:"";s:3:"縕";s:2:"";s:3:"蘊";s:2:"";s:3:"兀";s:2:"";s:3:"壅";s:2:"";s:3:"擁";s:2:"";s:3:"瓮";s:2:"";s:3:"甕";s:2:"";s:3:"癰";s:2:"";s:3:"翁";s:2:"";s:3:"邕";s:2:"";s:3:"雍";s:2:"";s:3:"饔";s:2:"";s:3:"渦";s:2:"";s:3:"瓦";s:2:"";s:3:"窩";s:2:"";s:3:"窪";s:2:"";s:3:"臥";s:2:"";s:3:"蛙";s:2:"";s:3:"蝸";s:2:"";s:3:"訛";s:2:"";s:3:"婉";s:2:"";s:3:"完";s:2:"";s:3:"宛";s:2:"";s:3:"梡";s:2:"";s:3:"椀";s:2:"";s:3:"浣";s:2:"";s:3:"玩";s:2:"";s:3:"琓";s:2:"";s:3:"琬";s:2:"";s:3:"碗";s:2:"";s:3:"緩";s:2:"";s:3:"翫";s:2:"";s:3:"脘";s:2:"";s:3:"腕";s:2:"";s:3:"莞";s:2:"";s:3:"豌";s:2:"";s:3:"阮";s:2:"";s:3:"頑";s:2:"";s:3:"曰";s:2:"";s:3:"往";s:2:"";s:3:"旺";s:2:"";s:3:"枉";s:2:"";s:3:"汪";s:2:"";s:3:"王";s:2:"";s:3:"倭";s:2:"";s:3:"娃";s:2:"";s:3:"歪";s:2:"";s:3:"矮";s:2:"";s:3:"外";s:2:"";s:3:"嵬";s:2:"";s:3:"巍";s:2:"";s:3:"猥";s:2:"";s:3:"畏";s:2:"";s:3:"了";s:2:"";s:3:"僚";s:2:"";s:3:"僥";s:2:"";s:3:"凹";s:2:"";s:3:"堯";s:2:"";s:3:"夭";s:2:"";s:3:"妖";s:2:"";s:3:"姚";s:2:"";s:3:"寥";s:2:"";s:3:"寮";s:2:"";s:3:"尿";s:2:"";s:3:"嶢";s:2:"";s:3:"拗";s:2:"";s:3:"搖";s:2:"";s:3:"撓";s:2:"";s:3:"擾";s:2:"";s:3:"料";s:2:"";s:3:"曜";s:2:"";s:3:"樂";s:2:"";s:3:"橈";s:2:"";s:3:"燎";s:2:"";s:3:"燿";s:2:"";s:3:"瑤";s:2:"";s:3:"療";s:2:"";s:3:"窈";s:2:"";s:3:"窯";s:2:"";s:3:"繇";s:2:"";s:3:"繞";s:2:"";s:3:"耀";s:2:"";s:3:"腰";s:2:"";s:3:"蓼";s:2:"";s:3:"蟯";s:2:"";s:3:"要";s:2:"";s:3:"謠";s:2:"";s:3:"遙";s:2:"";s:3:"遼";s:2:"";s:3:"邀";s:2:"";s:3:"饒";s:2:"";s:3:"慾";s:2:"";s:3:"欲";s:2:"";s:3:"浴";s:2:"";s:3:"縟";s:2:"";s:3:"褥";s:2:"";s:3:"辱";s:2:"";s:3:"俑";s:2:"";s:3:"傭";s:2:"";s:3:"冗";s:2:"";s:3:"勇";s:2:"";s:3:"埇";s:2:"";s:3:"墉";s:2:"";s:3:"容";s:2:"";s:3:"庸";s:2:"";s:3:"慂";s:2:"";s:3:"榕";s:2:"";s:3:"涌";s:2:"";s:3:"湧";s:2:"";s:3:"溶";s:2:"";s:3:"熔";s:2:"";s:3:"瑢";s:2:"";s:3:"用";s:2:"";s:3:"甬";s:2:"";s:3:"聳";s:2:"";s:3:"茸";s:2:"";s:3:"蓉";s:2:"";s:3:"踊";s:2:"";s:3:"鎔";s:2:"";s:3:"鏞";s:2:"";s:3:"龍";s:2:"";s:3:"于";s:2:"";s:3:"佑";s:2:"";s:3:"偶";s:2:"";s:3:"優";s:2:"";s:3:"又";s:2:"";s:3:"友";s:2:"";s:3:"右";s:2:"";s:3:"宇";s:2:"";s:3:"寓";s:2:"";s:3:"尤";s:2:"";s:3:"愚";s:2:"";s:3:"憂";s:2:"";s:3:"旴";s:2:"";s:3:"牛";s:2:"";s:3:"玗";s:2:"";s:3:"瑀";s:2:"";s:3:"盂";s:2:"";s:3:"祐";s:2:"";s:3:"禑";s:2:"";s:3:"禹";s:2:"";s:3:"紆";s:2:"";s:3:"羽";s:2:"";s:3:"芋";s:2:"";s:3:"藕";s:2:"";s:3:"虞";s:2:"";s:3:"迂";s:2:"";s:3:"遇";s:2:"";s:3:"郵";s:2:"";s:3:"釪";s:2:"";s:3:"隅";s:2:"";s:3:"雨";s:2:"";s:3:"雩";s:2:"";s:3:"勖";s:2:"";s:3:"彧";s:2:"";s:3:"旭";s:2:"";s:3:"昱";s:2:"";s:3:"栯";s:2:"";s:3:"煜";s:2:"";s:3:"稶";s:2:"";s:3:"郁";s:2:"";s:3:"頊";s:2:"";s:3:"云";s:2:"";s:3:"暈";s:2:"";s:3:"橒";s:2:"";s:3:"殞";s:2:"";s:3:"澐";s:2:"";s:3:"熉";s:2:"";s:3:"耘";s:2:"";s:3:"芸";s:2:"";s:3:"蕓";s:2:"";s:3:"運";s:2:"";s:3:"隕";s:2:"";s:3:"雲";s:2:"";s:3:"韻";s:2:"";s:3:"蔚";s:2:"";s:3:"鬱";s:2:"";s:3:"亐";s:2:"";s:3:"熊";s:2:"";s:3:"雄";s:2:"";s:3:"元";s:2:"";s:3:"原";s:2:"";s:3:"員";s:2:"";s:3:"圓";s:2:"";s:3:"園";s:2:"";s:3:"垣";s:2:"";s:3:"媛";s:2:"";s:3:"嫄";s:2:"";s:3:"寃";s:2:"";s:3:"怨";s:2:"";s:3:"愿";s:2:"";s:3:"援";s:2:"";s:3:"沅";s:2:"";s:3:"洹";s:2:"";s:3:"湲";s:2:"";s:3:"源";s:2:"";s:3:"爰";s:2:"";s:3:"猿";s:2:"";s:3:"瑗";s:2:"";s:3:"苑";s:2:"";s:3:"袁";s:2:"";s:3:"轅";s:2:"";s:3:"遠";s:2:"";s:3:"阮";s:2:"";s:3:"院";s:2:"";s:3:"願";s:2:"";s:3:"鴛";s:2:"";s:3:"月";s:2:"";s:3:"越";s:2:"";s:3:"鉞";s:2:"";s:3:"位";s:2:"";s:3:"偉";s:2:"";s:3:"僞";s:2:"";s:3:"危";s:2:"";s:3:"圍";s:2:"";s:3:"委";s:2:"";s:3:"威";s:2:"";s:3:"尉";s:2:"";s:3:"慰";s:2:"";s:3:"暐";s:2:"";s:3:"渭";s:2:"";s:3:"爲";s:2:"";s:3:"瑋";s:2:"";s:3:"緯";s:2:"";s:3:"胃";s:2:"";s:3:"萎";s:2:"";s:3:"葦";s:2:"";s:3:"蔿";s:2:"";s:3:"蝟";s:2:"";s:3:"衛";s:2:"";s:3:"褘";s:2:"";s:3:"謂";s:2:"";s:3:"違";s:2:"";s:3:"韋";s:2:"";s:3:"魏";s:2:"";s:3:"乳";s:2:"";s:3:"侑";s:2:"";s:3:"儒";s:2:"";s:3:"兪";s:2:"";s:3:"劉";s:2:"";s:3:"唯";s:2:"";s:3:"喩";s:2:"";s:3:"孺";s:2:"";s:3:"宥";s:2:"";s:3:"幼";s:2:"";s:3:"幽";s:2:"";s:3:"庾";s:2:"";s:3:"悠";s:2:"";s:3:"惟";s:2:"";s:3:"愈";s:2:"";s:3:"愉";s:2:"";s:3:"揄";s:2:"";s:3:"攸";s:2:"";s:3:"有";s:2:"";s:3:"杻";s:2:"";s:3:"柔";s:2:"";s:3:"柚";s:2:"";s:3:"柳";s:2:"";s:3:"楡";s:2:"";s:3:"楢";s:2:"";s:3:"油";s:2:"";s:3:"洧";s:2:"";s:3:"流";s:2:"";s:3:"游";s:2:"";s:3:"溜";s:2:"";s:3:"濡";s:2:"";s:3:"猶";s:2:"";s:3:"猷";s:2:"";s:3:"琉";s:2:"";s:3:"瑜";s:2:"";s:3:"由";s:2:"";s:3:"留";s:2:"";s:3:"癒";s:2:"";s:3:"硫";s:2:"";s:3:"紐";s:2:"";s:3:"維";s:2:"";s:3:"臾";s:2:"";s:3:"萸";s:2:"";s:3:"裕";s:2:"";s:3:"誘";s:2:"";s:3:"諛";s:2:"";s:3:"諭";s:2:"";s:3:"踰";s:2:"";s:3:"蹂";s:2:"";s:3:"遊";s:2:"";s:3:"逾";s:2:"";s:3:"遺";s:2:"";s:3:"酉";s:2:"";s:3:"釉";s:2:"";s:3:"鍮";s:2:"";s:3:"類";s:2:"";s:3:"六";s:2:"";s:3:"堉";s:2:"";s:3:"戮";s:2:"";s:3:"毓";s:2:"";s:3:"肉";s:2:"";s:3:"育";s:2:"";s:3:"陸";s:2:"";s:3:"倫";s:2:"";s:3:"允";s:2:"";s:3:"奫";s:2:"";s:3:"尹";s:2:"";s:3:"崙";s:2:"";s:3:"淪";s:2:"";s:3:"潤";s:2:"";s:3:"玧";s:2:"";s:3:"胤";s:2:"";s:3:"贇";s:2:"";s:3:"輪";s:2:"";s:3:"鈗";s:2:"";s:3:"閏";s:2:"";s:3:"律";s:2:"";s:3:"慄";s:2:"";s:3:"栗";s:2:"";s:3:"率";s:2:"";s:3:"聿";s:2:"";s:3:"戎";s:2:"";s:3:"瀜";s:2:"";s:3:"絨";s:2:"";s:3:"融";s:2:"";s:3:"隆";s:2:"";s:3:"垠";s:2:"";s:3:"恩";s:2:"";s:3:"慇";s:2:"";s:3:"殷";s:2:"";s:3:"誾";s:2:"";s:3:"銀";s:2:"";s:3:"隱";s:2:"";s:3:"乙";s:2:"";s:3:"吟";s:2:"";s:3:"淫";s:2:"";s:3:"蔭";s:2:"";s:3:"陰";s:2:"";s:3:"音";s:2:"";s:3:"飮";s:2:"";s:3:"揖";s:2:"";s:3:"泣";s:2:"";s:3:"邑";s:2:"";s:3:"凝";s:2:"";s:3:"應";s:2:"";s:3:"膺";s:2:"";s:3:"鷹";s:2:"";s:3:"依";s:2:"";s:3:"倚";s:2:"";s:3:"儀";s:2:"";s:3:"宜";s:2:"";s:3:"意";s:2:"";s:3:"懿";s:2:"";s:3:"擬";s:2:"";s:3:"椅";s:2:"";s:3:"毅";s:2:"";s:3:"疑";s:2:"";s:3:"矣";s:2:"";s:3:"義";s:2:"";s:3:"艤";s:2:"";s:3:"薏";s:2:"";s:3:"蟻";s:2:"";s:3:"衣";s:2:"";s:3:"誼";s:2:"";s:3:"議";s:2:"";s:3:"醫";s:2:"";s:3:"二";s:2:"";s:3:"以";s:2:"";s:3:"伊";s:2:"";s:3:"利";s:2:"";s:3:"吏";s:2:"";s:3:"夷";s:2:"";s:3:"姨";s:2:"";s:3:"履";s:2:"";s:3:"已";s:2:"";s:3:"弛";s:2:"";s:3:"彛";s:2:"";s:3:"怡";s:2:"";s:3:"易";s:2:"";s:3:"李";s:2:"";s:3:"梨";s:2:"";s:3:"泥";s:2:"";s:3:"爾";s:2:"";s:3:"珥";s:2:"";s:3:"理";s:2:"";s:3:"異";s:2:"";s:3:"痍";s:2:"";s:3:"痢";s:2:"";s:3:"移";s:2:"";s:3:"罹";s:2:"";s:3:"而";s:2:"";s:3:"耳";s:2:"";s:3:"肄";s:2:"";s:3:"苡";s:2:"";s:3:"荑";s:2:"";s:3:"裏";s:2:"";s:3:"裡";s:2:"";s:3:"貽";s:2:"";s:3:"貳";s:2:"";s:3:"邇";s:2:"";s:3:"里";s:2:"";s:3:"離";s:2:"";s:3:"飴";s:2:"";s:3:"餌";s:2:"";s:3:"匿";s:2:"";s:3:"溺";s:2:"";s:3:"瀷";s:2:"";s:3:"益";s:2:"";s:3:"翊";s:2:"";s:3:"翌";s:2:"";s:3:"翼";s:2:"";s:3:"謚";s:2:"";s:3:"人";s:2:"";s:3:"仁";s:2:"";s:3:"刃";s:2:"";s:3:"印";s:2:"";s:3:"吝";s:2:"";s:3:"咽";s:2:"";s:3:"因";s:2:"";s:3:"姻";s:2:"";s:3:"寅";s:2:"";s:3:"引";s:2:"";s:3:"忍";s:2:"";s:3:"湮";s:2:"";s:3:"燐";s:2:"";s:3:"璘";s:2:"";s:3:"絪";s:2:"";s:3:"茵";s:2:"";s:3:"藺";s:2:"";s:3:"蚓";s:2:"";s:3:"認";s:2:"";s:3:"隣";s:2:"";s:3:"靭";s:2:"";s:3:"靷";s:2:"";s:3:"鱗";s:2:"";s:3:"麟";s:2:"";s:3:"一";s:2:"";s:3:"佚";s:2:"";s:3:"佾";s:2:"";s:3:"壹";s:2:"";s:3:"日";s:2:"";s:3:"溢";s:2:"";s:3:"逸";s:2:"";s:3:"鎰";s:2:"";s:3:"馹";s:2:"";s:3:"任";s:2:"";s:3:"壬";s:2:"";s:3:"妊";s:2:"";s:3:"姙";s:2:"";s:3:"恁";s:2:"";s:3:"林";s:2:"";s:3:"淋";s:2:"";s:3:"稔";s:2:"";s:3:"臨";s:2:"";s:3:"荏";s:2:"";s:3:"賃";s:2:"";s:3:"入";s:2:"";s:3:"卄";s:2:"";s:3:"立";s:2:"";s:3:"笠";s:2:"";s:3:"粒";s:2:"";s:3:"仍";s:2:"";s:3:"剩";s:2:"";s:3:"孕";s:2:"";s:3:"芿";s:2:"";s:3:"仔";s:2:"";s:3:"刺";s:2:"";s:3:"咨";s:2:"";s:3:"姉";s:2:"";s:3:"姿";s:2:"";s:3:"子";s:2:"";s:3:"字";s:2:"";s:3:"孜";s:2:"";s:3:"恣";s:2:"";s:3:"慈";s:2:"";s:3:"滋";s:2:"";s:3:"炙";s:2:"";s:3:"煮";s:2:"";s:3:"玆";s:2:"";s:3:"瓷";s:2:"";s:3:"疵";s:2:"";s:3:"磁";s:2:"";s:3:"紫";s:2:"";s:3:"者";s:2:"";s:3:"自";s:2:"";s:3:"茨";s:2:"";s:3:"蔗";s:2:"";s:3:"藉";s:2:"";s:3:"諮";s:2:"";s:3:"資";s:2:"";s:3:"雌";s:2:"";s:3:"作";s:2:"";s:3:"勺";s:2:"";s:3:"嚼";s:2:"";s:3:"斫";s:2:"";s:3:"昨";s:2:"";s:3:"灼";s:2:"";s:3:"炸";s:2:"";s:3:"爵";s:2:"";s:3:"綽";s:2:"";s:3:"芍";s:2:"";s:3:"酌";s:2:"";s:3:"雀";s:2:"";s:3:"鵲";s:2:"";s:3:"孱";s:2:"";s:3:"棧";s:2:"";s:3:"殘";s:2:"";s:3:"潺";s:2:"";s:3:"盞";s:2:"";s:3:"岑";s:2:"";s:3:"暫";s:2:"";s:3:"潛";s:2:"";s:3:"箴";s:2:"";s:3:"簪";s:2:"";s:3:"蠶";s:2:"";s:3:"雜";s:2:"";s:3:"丈";s:2:"";s:3:"仗";s:2:"";s:3:"匠";s:2:"";s:3:"場";s:2:"";s:3:"墻";s:2:"";s:3:"壯";s:2:"";s:3:"奬";s:2:"";s:3:"將";s:2:"";s:3:"帳";s:2:"";s:3:"庄";s:2:"";s:3:"張";s:2:"";s:3:"掌";s:2:"";s:3:"暲";s:2:"";s:3:"杖";s:2:"";s:3:"樟";s:2:"";s:3:"檣";s:2:"";s:3:"欌";s:2:"";s:3:"漿";s:2:"";s:3:"牆";s:2:"";s:3:"狀";s:2:"";s:3:"獐";s:2:"";s:3:"璋";s:2:"";s:3:"章";s:2:"";s:3:"粧";s:2:"";s:3:"腸";s:2:"";s:3:"臟";s:2:"";s:3:"臧";s:2:"";s:3:"莊";s:2:"";s:3:"葬";s:2:"";s:3:"蔣";s:2:"";s:3:"薔";s:2:"";s:3:"藏";s:2:"";s:3:"裝";s:2:"";s:3:"贓";s:2:"";s:3:"醬";s:2:"";s:3:"長";s:2:"";s:3:"障";s:2:"";s:3:"再";s:2:"";s:3:"哉";s:2:"";s:3:"在";s:2:"";s:3:"宰";s:2:"";s:3:"才";s:2:"";s:3:"材";s:2:"";s:3:"栽";s:2:"";s:3:"梓";s:2:"";s:3:"渽";s:2:"";s:3:"滓";s:2:"";s:3:"災";s:2:"";s:3:"縡";s:2:"";s:3:"裁";s:2:"";s:3:"財";s:2:"";s:3:"載";s:2:"";s:3:"齋";s:2:"";s:3:"齎";s:2:"";s:3:"爭";s:2:"";s:3:"箏";s:2:"";s:3:"諍";s:2:"";s:3:"錚";s:2:"";s:3:"佇";s:2:"";s:3:"低";s:2:"";s:3:"儲";s:2:"";s:3:"咀";s:2:"";s:3:"姐";s:2:"";s:3:"底";s:2:"";s:3:"抵";s:2:"";s:3:"杵";s:2:"";s:3:"楮";s:2:"";s:3:"樗";s:2:"";s:3:"沮";s:2:"";s:3:"渚";s:2:"";s:3:"狙";s:2:"";s:3:"猪";s:2:"";s:3:"疽";s:2:"";s:3:"箸";s:2:"";s:3:"紵";s:2:"";s:3:"苧";s:2:"";s:3:"菹";s:2:"";s:3:"著";s:2:"";s:3:"藷";s:2:"";s:3:"詛";s:2:"";s:3:"貯";s:2:"";s:3:"躇";s:2:"";s:3:"這";s:2:"";s:3:"邸";s:2:"";s:3:"雎";s:2:"";s:3:"齟";s:2:"";s:3:"勣";s:2:"";s:3:"吊";s:2:"";s:3:"嫡";s:2:"";s:3:"寂";s:2:"";s:3:"摘";s:2:"";s:3:"敵";s:2:"";s:3:"滴";s:2:"";s:3:"狄";s:2:"";s:3:"炙";s:2:"";s:3:"的";s:2:"";s:3:"積";s:2:"";s:3:"笛";s:2:"";s:3:"籍";s:2:"";s:3:"績";s:2:"";s:3:"翟";s:2:"";s:3:"荻";s:2:"";s:3:"謫";s:2:"";s:3:"賊";s:2:"";s:3:"赤";s:2:"";s:3:"跡";s:2:"";s:3:"蹟";s:2:"";s:3:"迪";s:2:"";s:3:"迹";s:2:"";s:3:"適";s:2:"";s:3:"鏑";s:2:"";s:3:"佃";s:2:"";s:3:"佺";s:2:"";s:3:"傳";s:2:"";s:3:"全";s:2:"";s:3:"典";s:2:"";s:3:"前";s:2:"";s:3:"剪";s:2:"";s:3:"塡";s:2:"";s:3:"塼";s:2:"";s:3:"奠";s:2:"";s:3:"專";s:2:"";s:3:"展";s:2:"";s:3:"廛";s:2:"";s:3:"悛";s:2:"";s:3:"戰";s:2:"";s:3:"栓";s:2:"";s:3:"殿";s:2:"";s:3:"氈";s:2:"";s:3:"澱";s:2:"";s:3:"煎";s:2:"";s:3:"琠";s:2:"";s:3:"田";s:2:"";s:3:"甸";s:2:"";s:3:"畑";s:2:"";s:3:"癲";s:2:"";s:3:"筌";s:2:"";s:3:"箋";s:2:"";s:3:"箭";s:2:"";s:3:"篆";s:2:"";s:3:"纏";s:2:"";s:3:"詮";s:2:"";s:3:"輾";s:2:"";s:3:"轉";s:2:"";s:3:"鈿";s:2:"";s:3:"銓";s:2:"";s:3:"錢";s:2:"";s:3:"鐫";s:2:"";s:3:"電";s:2:"";s:3:"顚";s:2:"";s:3:"顫";s:2:"";s:3:"餞";s:2:"";s:3:"切";s:2:"";s:3:"截";s:2:"";s:3:"折";s:2:"";s:3:"浙";s:2:"";s:3:"癤";s:2:"";s:3:"竊";s:2:"";s:3:"節";s:2:"";s:3:"絶";s:2:"";s:3:"占";s:2:"";s:3:"岾";s:2:"";s:3:"店";s:2:"";s:3:"漸";s:2:"";s:3:"点";s:2:"";s:3:"粘";s:2:"";s:3:"霑";s:2:"";s:3:"鮎";s:2:"";s:3:"點";s:2:"";s:3:"接";s:2:"";s:3:"摺";s:2:"";s:3:"蝶";s:2:"";s:3:"丁";s:2:"";s:3:"井";s:2:"";s:3:"亭";s:2:"";s:3:"停";s:2:"";s:3:"偵";s:2:"";s:3:"呈";s:2:"";s:3:"姃";s:2:"";s:3:"定";s:2:"";s:3:"幀";s:2:"";s:3:"庭";s:2:"";s:3:"廷";s:2:"";s:3:"征";s:2:"";s:3:"情";s:2:"";s:3:"挺";s:2:"";s:3:"政";s:2:"";s:3:"整";s:2:"";s:3:"旌";s:2:"";s:3:"晶";s:2:"";s:3:"晸";s:2:"";s:3:"柾";s:2:"";s:3:"楨";s:2:"";s:3:"檉";s:2:"";s:3:"正";s:2:"";s:3:"汀";s:2:"";s:3:"淀";s:2:"";s:3:"淨";s:2:"";s:3:"渟";s:2:"";s:3:"湞";s:2:"";s:3:"瀞";s:2:"";s:3:"炡";s:2:"";s:3:"玎";s:2:"";s:3:"珽";s:2:"";s:3:"町";s:2:"";s:3:"睛";s:2:"";s:3:"碇";s:2:"";s:3:"禎";s:2:"";s:3:"程";s:2:"";s:3:"穽";s:2:"";s:3:"精";s:2:"";s:3:"綎";s:2:"";s:3:"艇";s:2:"";s:3:"訂";s:2:"";s:3:"諪";s:2:"";s:3:"貞";s:2:"";s:3:"鄭";s:2:"";s:3:"酊";s:2:"";s:3:"釘";s:2:"";s:3:"鉦";s:2:"";s:3:"鋌";s:2:"";s:3:"錠";s:2:"";s:3:"霆";s:2:"";s:3:"靖";s:2:"";s:3:"靜";s:2:"";s:3:"頂";s:2:"";s:3:"鼎";s:2:"";s:3:"制";s:2:"";s:3:"劑";s:2:"";s:3:"啼";s:2:"";s:3:"堤";s:2:"";s:3:"帝";s:2:"";s:3:"弟";s:2:"";s:3:"悌";s:2:"";s:3:"提";s:2:"";s:3:"梯";s:2:"";s:3:"濟";s:2:"";s:3:"祭";s:2:"";s:3:"第";s:2:"";s:3:"臍";s:2:"";s:3:"薺";s:2:"";s:3:"製";s:2:"";s:3:"諸";s:2:"";s:3:"蹄";s:2:"";s:3:"醍";s:2:"";s:3:"除";s:2:"";s:3:"際";s:2:"";s:3:"霽";s:2:"";s:3:"題";s:2:"";s:3:"齊";s:2:"";s:3:"俎";s:2:"";s:3:"兆";s:2:"";s:3:"凋";s:2:"";s:3:"助";s:2:"";s:3:"嘲";s:2:"";s:3:"弔";s:2:"";s:3:"彫";s:2:"";s:3:"措";s:2:"";s:3:"操";s:2:"";s:3:"早";s:2:"";s:3:"晁";s:2:"";s:3:"曺";s:2:"";s:3:"曹";s:2:"";s:3:"朝";s:2:"";s:3:"條";s:2:"";s:3:"棗";s:2:"";s:3:"槽";s:2:"";s:3:"漕";s:2:"";s:3:"潮";s:2:"";s:3:"照";s:2:"";s:3:"燥";s:2:"";s:3:"爪";s:2:"";s:3:"璪";s:2:"";s:3:"眺";s:2:"";s:3:"祖";s:2:"";s:3:"祚";s:2:"";s:3:"租";s:2:"";s:3:"稠";s:2:"";s:3:"窕";s:2:"";s:3:"粗";s:2:"";s:3:"糟";s:2:"";s:3:"組";s:2:"";s:3:"繰";s:2:"";s:3:"肇";s:2:"";s:3:"藻";s:2:"";s:3:"蚤";s:2:"";s:3:"詔";s:2:"";s:3:"調";s:2:"";s:3:"趙";s:2:"";s:3:"躁";s:2:"";s:3:"造";s:2:"";s:3:"遭";s:2:"";s:3:"釣";s:2:"";s:3:"阻";s:2:"";s:3:"雕";s:2:"";s:3:"鳥";s:2:"";s:3:"族";s:2:"";s:3:"簇";s:2:"";s:3:"足";s:2:"";s:3:"鏃";s:2:"";s:3:"存";s:2:"";s:3:"尊";s:2:"";s:3:"卒";s:2:"";s:3:"拙";s:2:"";s:3:"猝";s:2:"";s:3:"倧";s:2:"";s:3:"宗";s:2:"";s:3:"從";s:2:"";s:3:"悰";s:2:"";s:3:"慫";s:2:"";s:3:"棕";s:2:"";s:3:"淙";s:2:"";s:3:"琮";s:2:"";s:3:"種";s:2:"";s:3:"終";s:2:"";s:3:"綜";s:2:"";s:3:"縱";s:2:"";s:3:"腫";s:2:"";s:3:"踪";s:2:"";s:3:"踵";s:2:"";s:3:"鍾";s:2:"";s:3:"鐘";s:2:"";s:3:"佐";s:2:"";s:3:"坐";s:2:"";s:3:"左";s:2:"";s:3:"座";s:2:"";s:3:"挫";s:2:"";s:3:"罪";s:2:"";s:3:"主";s:2:"";s:3:"住";s:2:"";s:3:"侏";s:2:"";s:3:"做";s:2:"";s:3:"姝";s:2:"";s:3:"胄";s:2:"";s:3:"呪";s:2:"";s:3:"周";s:2:"";s:3:"嗾";s:2:"";s:3:"奏";s:2:"";s:3:"宙";s:2:"";s:3:"州";s:2:"";s:3:"廚";s:2:"";s:3:"晝";s:2:"";s:3:"朱";s:2:"";s:3:"柱";s:2:"";s:3:"株";s:2:"";s:3:"注";s:2:"";s:3:"洲";s:2:"";s:3:"湊";s:2:"";s:3:"澍";s:2:"";s:3:"炷";s:2:"";s:3:"珠";s:2:"";s:3:"疇";s:2:"";s:3:"籌";s:2:"";s:3:"紂";s:2:"";s:3:"紬";s:2:"";s:3:"綢";s:2:"";s:3:"舟";s:2:"";s:3:"蛛";s:2:"";s:3:"註";s:2:"";s:3:"誅";s:2:"";s:3:"走";s:2:"";s:3:"躊";s:2:"";s:3:"輳";s:2:"";s:3:"週";s:2:"";s:3:"酎";s:2:"";s:3:"酒";s:2:"";s:3:"鑄";s:2:"";s:3:"駐";s:2:"";s:3:"竹";s:2:"";s:3:"粥";s:2:"";s:3:"俊";s:2:"";s:3:"儁";s:2:"";s:3:"准";s:2:"";s:3:"埈";s:2:"";s:3:"寯";s:2:"";s:3:"峻";s:2:"";s:3:"晙";s:2:"";s:3:"樽";s:2:"";s:3:"浚";s:2:"";s:3:"準";s:2:"";s:3:"濬";s:2:"";s:3:"焌";s:2:"";s:3:"畯";s:2:"";s:3:"竣";s:2:"";s:3:"蠢";s:2:"";s:3:"逡";s:2:"";s:3:"遵";s:2:"";s:3:"雋";s:2:"";s:3:"駿";s:2:"";s:3:"茁";s:2:"";s:3:"中";s:2:"";s:3:"仲";s:2:"";s:3:"衆";s:2:"";s:3:"重";s:2:"";s:3:"卽";s:2:"";s:3:"櫛";s:2:"";s:3:"楫";s:2:"";s:3:"汁";s:2:"";s:3:"葺";s:2:"";s:3:"增";s:2:"";s:3:"憎";s:2:"";s:3:"曾";s:2:"";s:3:"拯";s:2:"";s:3:"烝";s:2:"";s:3:"甑";s:2:"";s:3:"症";s:2:"";s:3:"繒";s:2:"";s:3:"蒸";s:2:"";s:3:"證";s:2:"";s:3:"贈";s:2:"";s:3:"之";s:2:"";s:3:"只";s:2:"";s:3:"咫";s:2:"";s:3:"地";s:2:"";s:3:"址";s:2:"";s:3:"志";s:2:"";s:3:"持";s:2:"";s:3:"指";s:2:"";s:3:"摯";s:2:"";s:3:"支";s:2:"";s:3:"旨";s:2:"";s:3:"智";s:2:"";s:3:"枝";s:2:"";s:3:"枳";s:2:"";s:3:"止";s:2:"";s:3:"池";s:2:"";s:3:"沚";s:2:"";s:3:"漬";s:2:"";s:3:"知";s:2:"";s:3:"砥";s:2:"";s:3:"祉";s:2:"";s:3:"祗";s:2:"";s:3:"紙";s:2:"";s:3:"肢";s:2:"";s:3:"脂";s:2:"";s:3:"至";s:2:"";s:3:"芝";s:2:"";s:3:"芷";s:2:"";s:3:"蜘";s:2:"";s:3:"誌";s:2:"";s:3:"識";s:2:"";s:3:"贄";s:2:"";s:3:"趾";s:2:"";s:3:"遲";s:2:"";s:3:"直";s:2:"";s:3:"稙";s:2:"";s:3:"稷";s:2:"";s:3:"織";s:2:"";s:3:"職";s:2:"";s:3:"唇";s:2:"";s:3:"嗔";s:2:"";s:3:"塵";s:2:"";s:3:"振";s:2:"";s:3:"搢";s:2:"";s:3:"晉";s:2:"";s:3:"晋";s:2:"";s:3:"桭";s:2:"";s:3:"榛";s:2:"";s:3:"殄";s:2:"";s:3:"津";s:2:"";s:3:"溱";s:2:"";s:3:"珍";s:2:"";s:3:"瑨";s:2:"";s:3:"璡";s:2:"";s:3:"畛";s:2:"";s:3:"疹";s:2:"";s:3:"盡";s:2:"";s:3:"眞";s:2:"";s:3:"瞋";s:2:"";s:3:"秦";s:2:"";s:3:"縉";s:2:"";s:3:"縝";s:2:"";s:3:"臻";s:2:"";s:3:"蔯";s:2:"";s:3:"袗";s:2:"";s:3:"診";s:2:"";s:3:"賑";s:2:"";s:3:"軫";s:2:"";s:3:"辰";s:2:"";s:3:"進";s:2:"";s:3:"鎭";s:2:"";s:3:"陣";s:2:"";s:3:"陳";s:2:"";s:3:"震";s:2:"";s:3:"侄";s:2:"";s:3:"叱";s:2:"";s:3:"姪";s:2:"";s:3:"嫉";s:2:"";s:3:"帙";s:2:"";s:3:"桎";s:2:"";s:3:"瓆";s:2:"";s:3:"疾";s:2:"";s:3:"秩";s:2:"";s:3:"窒";s:2:"";s:3:"膣";s:2:"";s:3:"蛭";s:2:"";s:3:"質";s:2:"";s:3:"跌";s:2:"";s:3:"迭";s:2:"";s:3:"斟";s:2:"";s:3:"朕";s:2:"";s:3:"什";s:2:"";s:3:"執";s:2:"";s:3:"潗";s:2:"";s:3:"緝";s:2:"";s:3:"輯";s:2:"";s:3:"鏶";s:2:"";s:3:"集";s:2:"";s:3:"徵";s:2:"";s:3:"懲";s:2:"";s:3:"澄";s:2:"";s:3:"且";s:2:"";s:3:"侘";s:2:"";s:3:"借";s:2:"";s:3:"叉";s:2:"";s:3:"嗟";s:2:"";s:3:"嵯";s:2:"";s:3:"差";s:2:"";s:3:"次";s:2:"";s:3:"此";s:2:"";s:3:"磋";s:2:"";s:3:"箚";s:2:"";s:3:"茶";s:2:"";s:3:"蹉";s:2:"";s:3:"車";s:2:"";s:3:"遮";s:2:"";s:3:"捉";s:2:"";s:3:"搾";s:2:"";s:3:"着";s:2:"";s:3:"窄";s:2:"";s:3:"錯";s:2:"";s:3:"鑿";s:2:"";s:3:"齪";s:2:"";s:3:"撰";s:2:"";s:3:"澯";s:2:"";s:3:"燦";s:2:"";s:3:"璨";s:2:"";s:3:"瓚";s:2:"";s:3:"竄";s:2:"";s:3:"簒";s:2:"";s:3:"纂";s:2:"";s:3:"粲";s:2:"";s:3:"纘";s:2:"";s:3:"讚";s:2:"";s:3:"贊";s:2:"";s:3:"鑽";s:2:"";s:3:"餐";s:2:"";s:3:"饌";s:2:"";s:3:"刹";s:2:"";s:3:"察";s:2:"";s:3:"擦";s:2:"";s:3:"札";s:2:"";s:3:"紮";s:2:"";s:3:"僭";s:2:"";s:3:"參";s:2:"";s:3:"塹";s:2:"";s:3:"慘";s:2:"";s:3:"慙";s:2:"";s:3:"懺";s:2:"";s:3:"斬";s:2:"";s:3:"站";s:2:"";s:3:"讒";s:2:"";s:3:"讖";s:2:"";s:3:"倉";s:2:"";s:3:"倡";s:2:"";s:3:"創";s:2:"";s:3:"唱";s:2:"";s:3:"娼";s:2:"";s:3:"廠";s:2:"";s:3:"彰";s:2:"";s:3:"愴";s:2:"";s:3:"敞";s:2:"";s:3:"昌";s:2:"";s:3:"昶";s:2:"";s:3:"暢";s:2:"";s:3:"槍";s:2:"";s:3:"滄";s:2:"";s:3:"漲";s:2:"";s:3:"猖";s:2:"";s:3:"瘡";s:2:"";s:3:"窓";s:2:"";s:3:"脹";s:2:"";s:3:"艙";s:2:"";s:3:"菖";s:2:"";s:3:"蒼";s:2:"";s:3:"債";s:2:"";s:3:"埰";s:2:"";s:3:"寀";s:2:"";s:3:"寨";s:2:"";s:3:"彩";s:2:"";s:3:"採";s:2:"";s:3:"砦";s:2:"";s:3:"綵";s:2:"";s:3:"菜";s:2:"";s:3:"蔡";s:2:"";s:3:"采";s:2:"";s:3:"釵";s:2:"";s:3:"冊";s:2:"";s:3:"柵";s:2:"";s:3:"策";s:2:"";s:3:"責";s:2:"";s:3:"凄";s:2:"";s:3:"妻";s:2:"";s:3:"悽";s:2:"";s:3:"處";s:2:"";s:3:"倜";s:2:"";s:3:"刺";s:2:"";s:3:"剔";s:2:"";s:3:"尺";s:2:"";s:3:"慽";s:2:"";s:3:"戚";s:2:"";s:3:"拓";s:2:"";s:3:"擲";s:2:"";s:3:"斥";s:2:"";s:3:"滌";s:2:"";s:3:"瘠";s:2:"";s:3:"脊";s:2:"";s:3:"蹠";s:2:"";s:3:"陟";s:2:"";s:3:"隻";s:2:"";s:3:"仟";s:2:"";s:3:"千";s:2:"";s:3:"喘";s:2:"";s:3:"天";s:2:"";s:3:"川";s:2:"";s:3:"擅";s:2:"";s:3:"泉";s:2:"";s:3:"淺";s:2:"";s:3:"玔";s:2:"";s:3:"穿";s:2:"";s:3:"舛";s:2:"";s:3:"薦";s:2:"";s:3:"賤";s:2:"";s:3:"踐";s:2:"";s:3:"遷";s:2:"";s:3:"釧";s:2:"";s:3:"闡";s:2:"";s:3:"阡";s:2:"";s:3:"韆";s:2:"";s:3:"凸";s:2:"";s:3:"哲";s:2:"";s:3:"喆";s:2:"";s:3:"徹";s:2:"";s:3:"撤";s:2:"";s:3:"澈";s:2:"";s:3:"綴";s:2:"";s:3:"輟";s:2:"";s:3:"轍";s:2:"";s:3:"鐵";s:2:"";s:3:"僉";s:2:"";s:3:"尖";s:2:"";s:3:"沾";s:2:"";s:3:"添";s:2:"";s:3:"甛";s:2:"";s:3:"瞻";s:2:"";s:3:"簽";s:2:"";s:3:"籤";s:2:"";s:3:"詹";s:2:"";s:3:"諂";s:2:"";s:3:"堞";s:2:"";s:3:"妾";s:2:"";s:3:"帖";s:2:"";s:3:"捷";s:2:"";s:3:"牒";s:2:"";s:3:"疊";s:2:"";s:3:"睫";s:2:"";s:3:"諜";s:2:"";s:3:"貼";s:2:"";s:3:"輒";s:2:"";s:3:"廳";s:2:"";s:3:"晴";s:2:"";s:3:"淸";s:2:"";s:3:"聽";s:2:"";s:3:"菁";s:2:"";s:3:"請";s:2:"";s:3:"靑";s:2:"";s:3:"鯖";s:2:"";s:3:"切";s:2:"";s:3:"剃";s:2:"";s:3:"替";s:2:"";s:3:"涕";s:2:"";s:3:"滯";s:2:"";s:3:"締";s:2:"";s:3:"諦";s:2:"";s:3:"逮";s:2:"";s:3:"遞";s:2:"";s:3:"體";s:2:"";s:3:"初";s:2:"";s:3:"剿";s:2:"";s:3:"哨";s:2:"";s:3:"憔";s:2:"";s:3:"抄";s:2:"";s:3:"招";s:2:"";s:3:"梢";s:2:"";s:3:"椒";s:2:"";s:3:"楚";s:2:"";s:3:"樵";s:2:"";s:3:"炒";s:2:"";s:3:"焦";s:2:"";s:3:"硝";s:2:"";s:3:"礁";s:2:"";s:3:"礎";s:2:"";s:3:"秒";s:2:"";s:3:"稍";s:2:"";s:3:"肖";s:2:"";s:3:"艸";s:2:"";s:3:"苕";s:2:"";s:3:"草";s:2:"";s:3:"蕉";s:2:"";s:3:"貂";s:2:"";s:3:"超";s:2:"";s:3:"酢";s:2:"";s:3:"醋";s:2:"";s:3:"醮";s:2:"";s:3:"促";s:2:"";s:3:"囑";s:2:"";s:3:"燭";s:2:"";s:3:"矗";s:2:"";s:3:"蜀";s:2:"";s:3:"觸";s:2:"";s:3:"寸";s:2:"";s:3:"忖";s:2:"";s:3:"村";s:2:"";s:3:"邨";s:2:"";s:3:"叢";s:2:"";s:3:"塚";s:2:"";s:3:"寵";s:2:"";s:3:"悤";s:2:"";s:3:"憁";s:2:"";s:3:"摠";s:2:"";s:3:"總";s:2:"";s:3:"聰";s:2:"";s:3:"蔥";s:2:"";s:3:"銃";s:2:"";s:3:"撮";s:2:"";s:3:"催";s:2:"";s:3:"崔";s:2:"";s:3:"最";s:2:"";s:3:"墜";s:2:"";s:3:"抽";s:2:"";s:3:"推";s:2:"";s:3:"椎";s:2:"";s:3:"楸";s:2:"";s:3:"樞";s:2:"";s:3:"湫";s:2:"";s:3:"皺";s:2:"";s:3:"秋";s:2:"";s:3:"芻";s:2:"";s:3:"萩";s:2:"";s:3:"諏";s:2:"";s:3:"趨";s:2:"";s:3:"追";s:2:"";s:3:"鄒";s:2:"";s:3:"酋";s:2:"";s:3:"醜";s:2:"";s:3:"錐";s:2:"";s:3:"錘";s:2:"";s:3:"鎚";s:2:"";s:3:"雛";s:2:"";s:3:"騶";s:2:"";s:3:"鰍";s:2:"";s:3:"丑";s:2:"";s:3:"畜";s:2:"";s:3:"祝";s:2:"";s:3:"竺";s:2:"";s:3:"筑";s:2:"";s:3:"築";s:2:"";s:3:"縮";s:2:"";s:3:"蓄";s:2:"";s:3:"蹙";s:2:"";s:3:"蹴";s:2:"";s:3:"軸";s:2:"";s:3:"逐";s:2:"";s:3:"春";s:2:"";s:3:"椿";s:2:"";s:3:"瑃";s:2:"";s:3:"出";s:2:"";s:3:"朮";s:2:"";s:3:"黜";s:2:"";s:3:"充";s:2:"";s:3:"忠";s:2:"";s:3:"沖";s:2:"";s:3:"蟲";s:2:"";s:3:"衝";s:2:"";s:3:"衷";s:2:"";s:3:"悴";s:2:"";s:3:"膵";s:2:"";s:3:"萃";s:2:"";s:3:"贅";s:2:"";s:3:"取";s:2:"";s:3:"吹";s:2:"";s:3:"嘴";s:2:"";s:3:"娶";s:2:"";s:3:"就";s:2:"";s:3:"炊";s:2:"";s:3:"翠";s:2:"";s:3:"聚";s:2:"";s:3:"脆";s:2:"";s:3:"臭";s:2:"";s:3:"趣";s:2:"";s:3:"醉";s:2:"";s:3:"驟";s:2:"";s:3:"鷲";s:2:"";s:3:"側";s:2:"";s:3:"仄";s:2:"";s:3:"厠";s:2:"";s:3:"惻";s:2:"";s:3:"測";s:2:"";s:3:"層";s:2:"";s:3:"侈";s:2:"";s:3:"値";s:2:"";s:3:"嗤";s:2:"";s:3:"峙";s:2:"";s:3:"幟";s:2:"";s:3:"恥";s:2:"";s:3:"梔";s:2:"";s:3:"治";s:2:"";s:3:"淄";s:2:"";s:3:"熾";s:2:"";s:3:"痔";s:2:"";s:3:"痴";s:2:"";s:3:"癡";s:2:"";s:3:"稚";s:2:"";s:3:"穉";s:2:"";s:3:"緇";s:2:"";s:3:"緻";s:2:"";s:3:"置";s:2:"";s:3:"致";s:2:"";s:3:"蚩";s:2:"";s:3:"輜";s:2:"";s:3:"雉";s:2:"";s:3:"馳";s:2:"";s:3:"齒";s:2:"";s:3:"則";s:2:"";s:3:"勅";s:2:"";s:3:"飭";s:2:"";s:3:"親";s:2:"";s:3:"七";s:2:"";s:3:"柒";s:2:"";s:3:"漆";s:2:"";s:3:"侵";s:2:"";s:3:"寢";s:2:"";s:3:"枕";s:2:"";s:3:"沈";s:2:"";s:3:"浸";s:2:"";s:3:"琛";s:2:"";s:3:"砧";s:2:"";s:3:"針";s:2:"";s:3:"鍼";s:2:"";s:3:"蟄";s:2:"";s:3:"秤";s:2:"";s:3:"稱";s:2:"";s:3:"快";s:2:"";s:3:"他";s:2:"";s:3:"咤";s:2:"";s:3:"唾";s:2:"";s:3:"墮";s:2:"";s:3:"妥";s:2:"";s:3:"惰";s:2:"";s:3:"打";s:2:"";s:3:"拖";s:2:"";s:3:"朶";s:2:"";s:3:"楕";s:2:"";s:3:"舵";s:2:"";s:3:"陀";s:2:"";s:3:"馱";s:2:"";s:3:"駝";s:2:"";s:3:"倬";s:2:"";s:3:"卓";s:2:"";s:3:"啄";s:2:"";s:3:"坼";s:2:"";s:3:"度";s:2:"";s:3:"托";s:2:"";s:3:"拓";s:2:"";s:3:"擢";s:2:"";s:3:"晫";s:2:"";s:3:"柝";s:2:"";s:3:"濁";s:2:"";s:3:"濯";s:2:"";s:3:"琢";s:2:"";s:3:"琸";s:2:"";s:3:"託";s:2:"";s:3:"鐸";s:2:"";s:3:"呑";s:2:"";s:3:"嘆";s:2:"";s:3:"坦";s:2:"";s:3:"彈";s:2:"";s:3:"憚";s:2:"";s:3:"歎";s:2:"";s:3:"灘";s:2:"";s:3:"炭";s:2:"";s:3:"綻";s:2:"";s:3:"誕";s:2:"";s:3:"奪";s:2:"";s:3:"脫";s:2:"";s:3:"探";s:2:"";s:3:"眈";s:2:"";s:3:"耽";s:2:"";s:3:"貪";s:2:"";s:3:"塔";s:2:"";s:3:"搭";s:2:"";s:3:"榻";s:2:"";s:3:"宕";s:2:"";s:3:"帑";s:2:"";s:3:"湯";s:2:"";s:3:"糖";s:2:"";s:3:"蕩";s:2:"";s:3:"兌";s:2:"";s:3:"台";s:2:"";s:3:"太";s:2:"";s:3:"怠";s:2:"";s:3:"態";s:2:"";s:3:"殆";s:2:"";s:3:"汰";s:2:"";s:3:"泰";s:2:"";s:3:"笞";s:2:"";s:3:"胎";s:2:"";s:3:"苔";s:2:"";s:3:"跆";s:2:"";s:3:"邰";s:2:"";s:3:"颱";s:2:"";s:3:"宅";s:2:"";s:3:"擇";s:2:"";s:3:"澤";s:2:"";s:3:"撑";s:2:"";s:3:"攄";s:2:"";s:3:"兎";s:2:"";s:3:"吐";s:2:"";s:3:"土";s:2:"";s:3:"討";s:2:"";s:3:"慟";s:2:"";s:3:"桶";s:2:"";s:3:"洞";s:2:"";s:3:"痛";s:2:"";s:3:"筒";s:2:"";s:3:"統";s:2:"";s:3:"通";s:2:"";s:3:"堆";s:2:"";s:3:"槌";s:2:"";s:3:"腿";s:2:"";s:3:"褪";s:2:"";s:3:"退";s:2:"";s:3:"頹";s:2:"";s:3:"偸";s:2:"";s:3:"套";s:2:"";s:3:"妬";s:2:"";s:3:"投";s:2:"";s:3:"透";s:2:"";s:3:"鬪";s:2:"";s:3:"慝";s:2:"";s:3:"特";s:2:"";s:3:"闖";s:2:"";s:3:"坡";s:2:"";s:3:"婆";s:2:"";s:3:"巴";s:2:"";s:3:"把";s:2:"";s:3:"播";s:2:"";s:3:"擺";s:2:"";s:3:"杷";s:2:"";s:3:"波";s:2:"";s:3:"派";s:2:"";s:3:"爬";s:2:"";s:3:"琶";s:2:"";s:3:"破";s:2:"";s:3:"罷";s:2:"";s:3:"芭";s:2:"";s:3:"跛";s:2:"";s:3:"頗";s:2:"";s:3:"判";s:2:"";s:3:"坂";s:2:"";s:3:"板";s:2:"";s:3:"版";s:2:"";s:3:"瓣";s:2:"";s:3:"販";s:2:"";s:3:"辦";s:2:"";s:3:"鈑";s:2:"";s:3:"阪";s:2:"";s:3:"八";s:2:"";s:3:"叭";s:2:"";s:3:"捌";s:2:"";s:3:"佩";s:2:"";s:3:"唄";s:2:"";s:3:"悖";s:2:"";s:3:"敗";s:2:"";s:3:"沛";s:2:"";s:3:"浿";s:2:"";s:3:"牌";s:2:"";s:3:"狽";s:2:"";s:3:"稗";s:2:"";s:3:"覇";s:2:"";s:3:"貝";s:2:"";s:3:"彭";s:2:"";s:3:"澎";s:2:"";s:3:"烹";s:2:"";s:3:"膨";s:2:"";s:3:"愎";s:2:"";s:3:"便";s:2:"";s:3:"偏";s:2:"";s:3:"扁";s:2:"";s:3:"片";s:2:"";s:3:"篇";s:2:"";s:3:"編";s:2:"";s:3:"翩";s:2:"";s:3:"遍";s:2:"";s:3:"鞭";s:2:"";s:3:"騙";s:2:"";s:3:"貶";s:2:"";s:3:"坪";s:2:"";s:3:"平";s:2:"";s:3:"枰";s:2:"";s:3:"萍";s:2:"";s:3:"評";s:2:"";s:3:"吠";s:2:"";s:3:"嬖";s:2:"";s:3:"幣";s:2:"";s:3:"廢";s:2:"";s:3:"弊";s:2:"";s:3:"斃";s:2:"";s:3:"肺";s:2:"";s:3:"蔽";s:2:"";s:3:"閉";s:2:"";s:3:"陛";s:2:"";s:3:"佈";s:2:"";s:3:"包";s:2:"";s:3:"匍";s:2:"";s:3:"匏";s:2:"";s:3:"咆";s:2:"";s:3:"哺";s:2:"";s:3:"圃";s:2:"";s:3:"布";s:2:"";s:3:"怖";s:2:"";s:3:"抛";s:2:"";s:3:"抱";s:2:"";s:3:"捕";s:2:"";s:3:"暴";s:2:"";s:3:"泡";s:2:"";s:3:"浦";s:2:"";s:3:"疱";s:2:"";s:3:"砲";s:2:"";s:3:"胞";s:2:"";s:3:"脯";s:2:"";s:3:"苞";s:2:"";s:3:"葡";s:2:"";s:3:"蒲";s:2:"";s:3:"袍";s:2:"";s:3:"褒";s:2:"";s:3:"逋";s:2:"";s:3:"鋪";s:2:"";s:3:"飽";s:2:"";s:3:"鮑";s:2:"";s:3:"幅";s:2:"";s:3:"暴";s:2:"";s:3:"曝";s:2:"";s:3:"瀑";s:2:"";s:3:"爆";s:2:"";s:3:"輻";s:2:"";s:3:"俵";s:2:"";s:3:"剽";s:2:"";s:3:"彪";s:2:"";s:3:"慓";s:2:"";s:3:"杓";s:2:"";s:3:"標";s:2:"";s:3:"漂";s:2:"";s:3:"瓢";s:2:"";s:3:"票";s:2:"";s:3:"表";s:2:"";s:3:"豹";s:2:"";s:3:"飇";s:2:"";s:3:"飄";s:2:"";s:3:"驃";s:2:"";s:3:"品";s:2:"";s:3:"稟";s:2:"";s:3:"楓";s:2:"";s:3:"諷";s:2:"";s:3:"豊";s:2:"";s:3:"風";s:2:"";s:3:"馮";s:2:"";s:3:"彼";s:2:"";s:3:"披";s:2:"";s:3:"疲";s:2:"";s:3:"皮";s:2:"";s:3:"被";s:2:"";s:3:"避";s:2:"";s:3:"陂";s:2:"";s:3:"匹";s:2:"";s:3:"弼";s:2:"";s:3:"必";s:2:"";s:3:"泌";s:2:"";s:3:"珌";s:2:"";s:3:"畢";s:2:"";s:3:"疋";s:2:"";s:3:"筆";s:2:"";s:3:"苾";s:2:"";s:3:"馝";s:2:"";s:3:"乏";s:2:"";s:3:"逼";s:2:"";s:3:"下";s:2:"";s:3:"何";s:2:"";s:3:"厦";s:2:"";s:3:"夏";s:2:"";s:3:"廈";s:2:"";s:3:"昰";s:2:"";s:3:"河";s:2:"";s:3:"瑕";s:2:"";s:3:"荷";s:2:"";s:3:"蝦";s:2:"";s:3:"賀";s:2:"";s:3:"遐";s:2:"";s:3:"霞";s:2:"";s:3:"鰕";s:2:"";s:3:"壑";s:2:"";s:3:"學";s:2:"";s:3:"虐";s:2:"";s:3:"謔";s:2:"";s:3:"鶴";s:2:"";s:3:"寒";s:2:"";s:3:"恨";s:2:"";s:3:"悍";s:2:"";s:3:"旱";s:2:"";s:3:"汗";s:2:"";s:3:"漢";s:2:"";s:3:"澣";s:2:"";s:3:"瀚";s:2:"";s:3:"罕";s:2:"";s:3:"翰";s:2:"";s:3:"閑";s:2:"";s:3:"閒";s:2:"";s:3:"限";s:2:"";s:3:"韓";s:2:"";s:3:"割";s:2:"";s:3:"轄";s:2:"";s:3:"函";s:2:"";s:3:"含";s:2:"";s:3:"咸";s:2:"";s:3:"啣";s:2:"";s:3:"喊";s:2:"";s:3:"檻";s:2:"";s:3:"涵";s:2:"";s:3:"緘";s:2:"";s:3:"艦";s:2:"";s:3:"銜";s:2:"";s:3:"陷";s:2:"";s:3:"鹹";s:2:"";s:3:"合";s:2:"";s:3:"哈";s:2:"";s:3:"盒";s:2:"";s:3:"蛤";s:2:"";s:3:"閤";s:2:"";s:3:"闔";s:2:"";s:3:"陜";s:2:"";s:3:"亢";s:2:"";s:3:"伉";s:2:"";s:3:"姮";s:2:"";s:3:"嫦";s:2:"";s:3:"巷";s:2:"";s:3:"恒";s:2:"";s:3:"抗";s:2:"";s:3:"杭";s:2:"";s:3:"桁";s:2:"";s:3:"沆";s:2:"";s:3:"港";s:2:"";s:3:"缸";s:2:"";s:3:"肛";s:2:"";s:3:"航";s:2:"";s:3:"行";s:2:"";s:3:"降";s:2:"";s:3:"項";s:2:"";s:3:"亥";s:2:"";s:3:"偕";s:2:"";s:3:"咳";s:2:"";s:3:"垓";s:2:"";s:3:"奚";s:2:"";s:3:"孩";s:2:"";s:3:"害";s:2:"";s:3:"懈";s:2:"";s:3:"楷";s:2:"";s:3:"海";s:2:"";s:3:"瀣";s:2:"";s:3:"蟹";s:2:"";s:3:"解";s:2:"";s:3:"該";s:2:"";s:3:"諧";s:2:"";s:3:"邂";s:2:"";s:3:"駭";s:2:"";s:3:"骸";s:2:"";s:3:"劾";s:2:"";s:3:"核";s:2:"";s:3:"倖";s:2:"";s:3:"幸";s:2:"";s:3:"杏";s:2:"";s:3:"荇";s:2:"";s:3:"行";s:2:"";s:3:"享";s:2:"";s:3:"向";s:2:"";s:3:"嚮";s:2:"";s:3:"珦";s:2:"";s:3:"鄕";s:2:"";s:3:"響";s:2:"";s:3:"餉";s:2:"";s:3:"饗";s:2:"";s:3:"香";s:2:"";s:3:"噓";s:2:"";s:3:"墟";s:2:"";s:3:"虛";s:2:"";s:3:"許";s:2:"";s:3:"憲";s:2:"";s:3:"櫶";s:2:"";s:3:"獻";s:2:"";s:3:"軒";s:2:"";s:3:"歇";s:2:"";s:3:"險";s:2:"";s:3:"驗";s:2:"";s:3:"奕";s:2:"";s:3:"爀";s:2:"";s:3:"赫";s:2:"";s:3:"革";s:2:"";s:3:"俔";s:2:"";s:3:"峴";s:2:"";s:3:"弦";s:2:"";s:3:"懸";s:2:"";s:3:"晛";s:2:"";s:3:"泫";s:2:"";s:3:"炫";s:2:"";s:3:"玄";s:2:"";s:3:"玹";s:2:"";s:3:"現";s:2:"";s:3:"眩";s:2:"";s:3:"睍";s:2:"";s:3:"絃";s:2:"";s:3:"絢";s:2:"";s:3:"縣";s:2:"";s:3:"舷";s:2:"";s:3:"衒";s:2:"";s:3:"見";s:2:"";s:3:"賢";s:2:"";s:3:"鉉";s:2:"";s:3:"顯";s:2:"";s:3:"孑";s:2:"";s:3:"穴";s:2:"";s:3:"血";s:2:"";s:3:"頁";s:2:"";s:3:"嫌";s:2:"";s:3:"俠";s:2:"";s:3:"協";s:2:"";s:3:"夾";s:2:"";s:3:"峽";s:2:"";s:3:"挾";s:2:"";s:3:"浹";s:2:"";s:3:"狹";s:2:"";s:3:"脅";s:2:"";s:3:"脇";s:2:"";s:3:"莢";s:2:"";s:3:"鋏";s:2:"";s:3:"頰";s:2:"";s:3:"亨";s:2:"";s:3:"兄";s:2:"";s:3:"刑";s:2:"";s:3:"型";s:2:"";s:3:"形";s:2:"";s:3:"泂";s:2:"";s:3:"滎";s:2:"";s:3:"瀅";s:2:"";s:3:"灐";s:2:"";s:3:"炯";s:2:"";s:3:"熒";s:2:"";s:3:"珩";s:2:"";s:3:"瑩";s:2:"";s:3:"荊";s:2:"";s:3:"螢";s:2:"";s:3:"衡";s:2:"";s:3:"逈";s:2:"";s:3:"邢";s:2:"";s:3:"鎣";s:2:"";s:3:"馨";s:2:"";s:3:"兮";s:2:"";s:3:"彗";s:2:"";s:3:"惠";s:2:"";s:3:"慧";s:2:"";s:3:"暳";s:2:"";s:3:"蕙";s:2:"";s:3:"蹊";s:2:"";s:3:"醯";s:2:"";s:3:"鞋";s:2:"";s:3:"乎";s:2:"";s:3:"互";s:2:"";s:3:"呼";s:2:"";s:3:"壕";s:2:"";s:3:"壺";s:2:"";s:3:"好";s:2:"";s:3:"岵";s:2:"";s:3:"弧";s:2:"";s:3:"戶";s:2:"";s:3:"扈";s:2:"";s:3:"昊";s:2:"";s:3:"晧";s:2:"";s:3:"毫";s:2:"";s:3:"浩";s:2:"";s:3:"淏";s:2:"";s:3:"湖";s:2:"";s:3:"滸";s:2:"";s:3:"澔";s:2:"";s:3:"濠";s:2:"";s:3:"濩";s:2:"";s:3:"灝";s:2:"";s:3:"狐";s:2:"";s:3:"琥";s:2:"";s:3:"瑚";s:2:"";s:3:"瓠";s:2:"";s:3:"皓";s:2:"";s:3:"祜";s:2:"";s:3:"糊";s:2:"";s:3:"縞";s:2:"";s:3:"胡";s:2:"";s:3:"芦";s:2:"";s:3:"葫";s:2:"";s:3:"蒿";s:2:"";s:3:"虎";s:2:"";s:3:"號";s:2:"";s:3:"蝴";s:2:"";s:3:"護";s:2:"";s:3:"豪";s:2:"";s:3:"鎬";s:2:"";s:3:"頀";s:2:"";s:3:"顥";s:2:"";s:3:"惑";s:2:"";s:3:"或";s:2:"";s:3:"酷";s:2:"";s:3:"婚";s:2:"";s:3:"昏";s:2:"";s:3:"混";s:2:"";s:3:"渾";s:2:"";s:3:"琿";s:2:"";s:3:"魂";s:2:"";s:3:"忽";s:2:"";s:3:"惚";s:2:"";s:3:"笏";s:2:"";s:3:"哄";s:2:"";s:3:"弘";s:2:"";s:3:"汞";s:2:"";s:3:"泓";s:2:"";s:3:"洪";s:2:"";s:3:"烘";s:2:"";s:3:"紅";s:2:"";s:3:"虹";s:2:"";s:3:"訌";s:2:"";s:3:"鴻";s:2:"";s:3:"化";s:2:"";s:3:"和";s:2:"";s:3:"嬅";s:2:"";s:3:"樺";s:2:"";s:3:"火";s:2:"";s:3:"畵";s:2:"";s:3:"禍";s:2:"";s:3:"禾";s:2:"";s:3:"花";s:2:"";s:3:"華";s:2:"";s:3:"話";s:2:"";s:3:"譁";s:2:"";s:3:"貨";s:2:"";s:3:"靴";s:2:"";s:3:"廓";s:2:"";s:3:"擴";s:2:"";s:3:"攫";s:2:"";s:3:"確";s:2:"";s:3:"碻";s:2:"";s:3:"穫";s:2:"";s:3:"丸";s:2:"";s:3:"喚";s:2:"";s:3:"奐";s:2:"";s:3:"宦";s:2:"";s:3:"幻";s:2:"";s:3:"患";s:2:"";s:3:"換";s:2:"";s:3:"歡";s:2:"";s:3:"晥";s:2:"";s:3:"桓";s:2:"";s:3:"渙";s:2:"";s:3:"煥";s:2:"";s:3:"環";s:2:"";s:3:"紈";s:2:"";s:3:"還";s:2:"";s:3:"驩";s:2:"";s:3:"鰥";s:2:"";s:3:"活";s:2:"";s:3:"滑";s:2:"";s:3:"猾";s:2:"";s:3:"豁";s:2:"";s:3:"闊";s:2:"";s:3:"凰";s:2:"";s:3:"幌";s:2:"";s:3:"徨";s:2:"";s:3:"恍";s:2:"";s:3:"惶";s:2:"";s:3:"愰";s:2:"";s:3:"慌";s:2:"";s:3:"晃";s:2:"";s:3:"晄";s:2:"";s:3:"榥";s:2:"";s:3:"況";s:2:"";s:3:"湟";s:2:"";s:3:"滉";s:2:"";s:3:"潢";s:2:"";s:3:"煌";s:2:"";s:3:"璜";s:2:"";s:3:"皇";s:2:"";s:3:"篁";s:2:"";s:3:"簧";s:2:"";s:3:"荒";s:2:"";s:3:"蝗";s:2:"";s:3:"遑";s:2:"";s:3:"隍";s:2:"";s:3:"黃";s:2:"";s:3:"匯";s:2:"";s:3:"回";s:2:"";s:3:"廻";s:2:"";s:3:"徊";s:2:"";s:3:"恢";s:2:"";s:3:"悔";s:2:"";s:3:"懷";s:2:"";s:3:"晦";s:2:"";s:3:"會";s:2:"";s:3:"檜";s:2:"";s:3:"淮";s:2:"";s:3:"澮";s:2:"";s:3:"灰";s:2:"";s:3:"獪";s:2:"";s:3:"繪";s:2:"";s:3:"膾";s:2:"";s:3:"茴";s:2:"";s:3:"蛔";s:2:"";s:3:"誨";s:2:"";s:3:"賄";s:2:"";s:3:"劃";s:2:"";s:3:"獲";s:2:"";s:3:"宖";s:2:"";s:3:"橫";s:2:"";s:3:"鐄";s:2:"";s:3:"哮";s:2:"";s:3:"嚆";s:2:"";s:3:"孝";s:2:"";s:3:"效";s:2:"";s:3:"斅";s:2:"";s:3:"曉";s:2:"";s:3:"梟";s:2:"";s:3:"涍";s:2:"";s:3:"淆";s:2:"";s:3:"爻";s:2:"";s:3:"肴";s:2:"";s:3:"酵";s:2:"";s:3:"驍";s:2:"";s:3:"侯";s:2:"";s:3:"候";s:2:"";s:3:"厚";s:2:"";s:3:"后";s:2:"";s:3:"吼";s:2:"";s:3:"喉";s:2:"";s:3:"嗅";s:2:"";s:3:"帿";s:2:"";s:3:"後";s:2:"";s:3:"朽";s:2:"";s:3:"煦";s:2:"";s:3:"珝";s:2:"";s:3:"逅";s:2:"";s:3:"勛";s:2:"";s:3:"勳";s:2:"";s:3:"塤";s:2:"";s:3:"壎";s:2:"";s:3:"焄";s:2:"";s:3:"熏";s:2:"";s:3:"燻";s:2:"";s:3:"薰";s:2:"";s:3:"訓";s:2:"";s:3:"暈";s:2:"";s:3:"薨";s:2:"";s:3:"喧";s:2:"";s:3:"暄";s:2:"";s:3:"煊";s:2:"";s:3:"萱";s:2:"";s:3:"卉";s:2:"";s:3:"喙";s:2:"";s:3:"毁";s:2:"";s:3:"彙";s:2:"";s:3:"徽";s:2:"";s:3:"揮";s:2:"";s:3:"暉";s:2:"";s:3:"煇";s:2:"";s:3:"諱";s:2:"";s:3:"輝";s:2:"";s:3:"麾";s:2:"";s:3:"休";s:2:"";s:3:"携";s:2:"";s:3:"烋";s:2:"";s:3:"畦";s:2:"";s:3:"虧";s:2:"";s:3:"恤";s:2:"";s:3:"譎";s:2:"";s:3:"鷸";s:2:"";s:3:"兇";s:2:"";s:3:"凶";s:2:"";s:3:"匈";s:2:"";s:3:"洶";s:2:"";s:3:"胸";s:2:"";s:3:"黑";s:2:"";s:3:"昕";s:2:"";s:3:"欣";s:2:"";s:3:"炘";s:2:"";s:3:"痕";s:2:"";s:3:"吃";s:2:"";s:3:"屹";s:2:"";s:3:"紇";s:2:"";s:3:"訖";s:2:"";s:3:"欠";s:2:"";s:3:"欽";s:2:"";s:3:"歆";s:2:"";s:3:"吸";s:2:"";s:3:"恰";s:2:"";s:3:"洽";s:2:"";s:3:"翕";s:2:"";s:3:"興";s:2:"";s:3:"僖";s:2:"";s:3:"凞";s:2:"";s:3:"喜";s:2:"";s:3:"噫";s:2:"";s:3:"囍";s:2:"";s:3:"姬";s:2:"";s:3:"嬉";s:2:"";s:3:"希";s:2:"";s:3:"憙";s:2:"";s:3:"憘";s:2:"";s:3:"戱";s:2:"";s:3:"晞";s:2:"";s:3:"曦";s:2:"";s:3:"熙";s:2:"";s:3:"熹";s:2:"";s:3:"熺";s:2:"";s:3:"犧";s:2:"";s:3:"禧";s:2:"";s:3:"稀";s:2:"";s:3:"羲";s:2:"";s:3:"詰";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.cp950.ser
@@ -0,0 +1,3 @@
+a:13631:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:"@";s:3:"　";s:2:"A";s:3:"，";s:2:"B";s:3:"、";s:2:"C";s:3:"。";s:2:"D";s:3:"．";s:2:"E";s:3:"‧";s:2:"F";s:3:"；";s:2:"G";s:3:"：";s:2:"H";s:3:"？";s:2:"I";s:3:"！";s:2:"J";s:3:"︰";s:2:"K";s:3:"…";s:2:"L";s:3:"‥";s:2:"M";s:3:"﹐";s:2:"N";s:3:"﹑";s:2:"O";s:3:"﹒";s:2:"P";s:2:"·";s:2:"Q";s:3:"﹔";s:2:"R";s:3:"﹕";s:2:"S";s:3:"﹖";s:2:"T";s:3:"﹗";s:2:"U";s:3:"｜";s:2:"V";s:3:"–";s:2:"W";s:3:"︱";s:2:"X";s:3:"—";s:2:"Y";s:3:"︳";s:2:"Z";s:3:"╴";s:2:"[";s:3:"︴";s:2:"\";s:3:"﹏";s:2:"]";s:3:"（";s:2:"^";s:3:"）";s:2:"_";s:3:"︵";s:2:"`";s:3:"︶";s:2:"a";s:3:"｛";s:2:"b";s:3:"｝";s:2:"c";s:3:"︷";s:2:"d";s:3:"︸";s:2:"e";s:3:"〔";s:2:"f";s:3:"〕";s:2:"g";s:3:"︹";s:2:"h";s:3:"︺";s:2:"i";s:3:"【";s:2:"j";s:3:"】";s:2:"k";s:3:"︻";s:2:"l";s:3:"︼";s:2:"m";s:3:"《";s:2:"n";s:3:"》";s:2:"o";s:3:"︽";s:2:"p";s:3:"︾";s:2:"q";s:3:"〈";s:2:"r";s:3:"〉";s:2:"s";s:3:"︿";s:2:"t";s:3:"﹀";s:2:"u";s:3:"「";s:2:"v";s:3:"」";s:2:"w";s:3:"﹁";s:2:"x";s:3:"﹂";s:2:"y";s:3:"『";s:2:"z";s:3:"』";s:2:"{";s:3:"﹃";s:2:"|";s:3:"﹄";s:2:"}";s:3:"﹙";s:2:"~";s:3:"﹚";s:2:"";s:3:"﹛";s:2:"";s:3:"﹜";s:2:"";s:3:"﹝";s:2:"";s:3:"﹞";s:2:"";s:3:"‘";s:2:"";s:3:"’";s:2:"";s:3:"“";s:2:"";s:3:"”";s:2:"";s:3:"〝";s:2:"";s:3:"〞";s:2:"";s:3:"‵";s:2:"";s:3:"′";s:2:"";s:3:"＃";s:2:"";s:3:"＆";s:2:"";s:3:"＊";s:2:"";s:3:"※";s:2:"";s:2:"§";s:2:"";s:3:"〃";s:2:"";s:3:"○";s:2:"";s:3:"●";s:2:"";s:3:"△";s:2:"";s:3:"▲";s:2:"";s:3:"◎";s:2:"";s:3:"☆";s:2:"";s:3:"★";s:2:"";s:3:"◇";s:2:"";s:3:"◆";s:2:"";s:3:"□";s:2:"";s:3:"■";s:2:"";s:3:"▽";s:2:"";s:3:"▼";s:2:"";s:3:"㊣";s:2:"";s:3:"℅";s:2:"";s:2:"¯";s:2:"";s:3:"￣";s:2:"";s:3:"＿";s:2:"";s:2:"ˍ";s:2:"";s:3:"﹉";s:2:"";s:3:"﹊";s:2:"";s:3:"﹍";s:2:"";s:3:"﹎";s:2:"";s:3:"﹋";s:2:"";s:3:"﹌";s:2:"";s:3:"﹟";s:2:"";s:3:"﹠";s:2:"";s:3:"﹡";s:2:"";s:3:"＋";s:2:"";s:3:"－";s:2:"";s:2:"×";s:2:"";s:2:"÷";s:2:"";s:2:"±";s:2:"";s:3:"√";s:2:"";s:3:"＜";s:2:"";s:3:"＞";s:2:"";s:3:"＝";s:2:"";s:3:"≦";s:2:"";s:3:"≧";s:2:"";s:3:"≠";s:2:"";s:3:"∞";s:2:"";s:3:"≒";s:2:"";s:3:"≡";s:2:"";s:3:"﹢";s:2:"";s:3:"﹣";s:2:"";s:3:"﹤";s:2:"";s:3:"﹥";s:2:"";s:3:"﹦";s:2:"";s:3:"～";s:2:"";s:3:"∩";s:2:"";s:3:"∪";s:2:"";s:3:"⊥";s:2:"";s:3:"∠";s:2:"";s:3:"∟";s:2:"";s:3:"⊿";s:2:"";s:3:"㏒";s:2:"";s:3:"㏑";s:2:"";s:3:"∫";s:2:"";s:3:"∮";s:2:"";s:3:"∵";s:2:"";s:3:"∴";s:2:"";s:3:"♀";s:2:"";s:3:"♂";s:2:"";s:3:"⊕";s:2:"";s:3:"⊙";s:2:"";s:3:"↑";s:2:"";s:3:"↓";s:2:"";s:3:"←";s:2:"";s:3:"→";s:2:"";s:3:"↖";s:2:"";s:3:"↗";s:2:"";s:3:"↙";s:2:"";s:3:"↘";s:2:"";s:3:"∥";s:2:"";s:3:"∣";s:2:"";s:3:"／";s:2:"@";s:3:"＼";s:2:"A";s:3:"∕";s:2:"B";s:3:"﹨";s:2:"C";s:3:"＄";s:2:"D";s:3:"￥";s:2:"E";s:3:"〒";s:2:"F";s:3:"￠";s:2:"G";s:3:"￡";s:2:"H";s:3:"％";s:2:"I";s:3:"＠";s:2:"J";s:3:"℃";s:2:"K";s:3:"℉";s:2:"L";s:3:"﹩";s:2:"M";s:3:"﹪";s:2:"N";s:3:"﹫";s:2:"O";s:3:"㏕";s:2:"P";s:3:"㎜";s:2:"Q";s:3:"㎝";s:2:"R";s:3:"㎞";s:2:"S";s:3:"㏎";s:2:"T";s:3:"㎡";s:2:"U";s:3:"㎎";s:2:"V";s:3:"㎏";s:2:"W";s:3:"㏄";s:2:"X";s:2:"°";s:2:"Y";s:3:"兙";s:2:"Z";s:3:"兛";s:2:"[";s:3:"兞";s:2:"\";s:3:"兝";s:2:"]";s:3:"兡";s:2:"^";s:3:"兣";s:2:"_";s:3:"嗧";s:2:"`";s:3:"瓩";s:2:"a";s:3:"糎";s:2:"b";s:3:"▁";s:2:"c";s:3:"▂";s:2:"d";s:3:"▃";s:2:"e";s:3:"▄";s:2:"f";s:3:"▅";s:2:"g";s:3:"▆";s:2:"h";s:3:"▇";s:2:"i";s:3:"█";s:2:"j";s:3:"▏";s:2:"k";s:3:"▎";s:2:"l";s:3:"▍";s:2:"m";s:3:"▌";s:2:"n";s:3:"▋";s:2:"o";s:3:"▊";s:2:"p";s:3:"▉";s:2:"q";s:3:"┼";s:2:"r";s:3:"┴";s:2:"s";s:3:"┬";s:2:"t";s:3:"┤";s:2:"u";s:3:"├";s:2:"v";s:3:"▔";s:2:"w";s:3:"─";s:2:"x";s:3:"│";s:2:"y";s:3:"▕";s:2:"z";s:3:"┌";s:2:"{";s:3:"┐";s:2:"|";s:3:"└";s:2:"}";s:3:"┘";s:2:"~";s:3:"╭";s:2:"";s:3:"╮";s:2:"";s:3:"╰";s:2:"";s:3:"╯";s:2:"";s:3:"═";s:2:"";s:3:"╞";s:2:"";s:3:"╪";s:2:"";s:3:"╡";s:2:"";s:3:"◢";s:2:"";s:3:"◣";s:2:"";s:3:"◥";s:2:"";s:3:"◤";s:2:"";s:3:"╱";s:2:"";s:3:"╲";s:2:"";s:3:"╳";s:2:"";s:3:"０";s:2:"";s:3:"１";s:2:"";s:3:"２";s:2:"";s:3:"３";s:2:"";s:3:"４";s:2:"";s:3:"５";s:2:"";s:3:"６";s:2:"";s:3:"７";s:2:"";s:3:"８";s:2:"";s:3:"９";s:2:"";s:3:"Ⅰ";s:2:"";s:3:"Ⅱ";s:2:"";s:3:"Ⅲ";s:2:"";s:3:"Ⅳ";s:2:"";s:3:"Ⅴ";s:2:"";s:3:"Ⅵ";s:2:"";s:3:"Ⅶ";s:2:"";s:3:"Ⅷ";s:2:"";s:3:"Ⅸ";s:2:"";s:3:"Ⅹ";s:2:"";s:3:"〡";s:2:"";s:3:"〢";s:2:"";s:3:"〣";s:2:"";s:3:"〤";s:2:"";s:3:"〥";s:2:"";s:3:"〦";s:2:"";s:3:"〧";s:2:"";s:3:"〨";s:2:"";s:3:"〩";s:2:"";s:3:"十";s:2:"";s:3:"卄";s:2:"";s:3:"卅";s:2:"";s:3:"Ａ";s:2:"";s:3:"Ｂ";s:2:"";s:3:"Ｃ";s:2:"";s:3:"Ｄ";s:2:"";s:3:"Ｅ";s:2:"";s:3:"Ｆ";s:2:"";s:3:"Ｇ";s:2:"";s:3:"Ｈ";s:2:"";s:3:"Ｉ";s:2:"";s:3:"Ｊ";s:2:"";s:3:"Ｋ";s:2:"";s:3:"Ｌ";s:2:"";s:3:"Ｍ";s:2:"";s:3:"Ｎ";s:2:"";s:3:"Ｏ";s:2:"";s:3:"Ｐ";s:2:"";s:3:"Ｑ";s:2:"";s:3:"Ｒ";s:2:"";s:3:"Ｓ";s:2:"";s:3:"Ｔ";s:2:"";s:3:"Ｕ";s:2:"";s:3:"Ｖ";s:2:"";s:3:"Ｗ";s:2:"";s:3:"Ｘ";s:2:"";s:3:"Ｙ";s:2:"";s:3:"Ｚ";s:2:"";s:3:"ａ";s:2:"";s:3:"ｂ";s:2:"";s:3:"ｃ";s:2:"";s:3:"ｄ";s:2:"";s:3:"ｅ";s:2:"";s:3:"ｆ";s:2:"";s:3:"ｇ";s:2:"";s:3:"ｈ";s:2:"";s:3:"ｉ";s:2:"";s:3:"ｊ";s:2:"";s:3:"ｋ";s:2:"";s:3:"ｌ";s:2:"";s:3:"ｍ";s:2:"";s:3:"ｎ";s:2:"";s:3:"ｏ";s:2:"";s:3:"ｐ";s:2:"";s:3:"ｑ";s:2:"";s:3:"ｒ";s:2:"";s:3:"ｓ";s:2:"";s:3:"ｔ";s:2:"";s:3:"ｕ";s:2:"";s:3:"ｖ";s:2:"@";s:3:"ｗ";s:2:"A";s:3:"ｘ";s:2:"B";s:3:"ｙ";s:2:"C";s:3:"ｚ";s:2:"D";s:2:"Α";s:2:"E";s:2:"Β";s:2:"F";s:2:"Γ";s:2:"G";s:2:"Δ";s:2:"H";s:2:"Ε";s:2:"I";s:2:"Ζ";s:2:"J";s:2:"Η";s:2:"K";s:2:"Θ";s:2:"L";s:2:"Ι";s:2:"M";s:2:"Κ";s:2:"N";s:2:"Λ";s:2:"O";s:2:"Μ";s:2:"P";s:2:"Ν";s:2:"Q";s:2:"Ξ";s:2:"R";s:2:"Ο";s:2:"S";s:2:"Π";s:2:"T";s:2:"Ρ";s:2:"U";s:2:"Σ";s:2:"V";s:2:"Τ";s:2:"W";s:2:"Υ";s:2:"X";s:2:"Φ";s:2:"Y";s:2:"Χ";s:2:"Z";s:2:"Ψ";s:2:"[";s:2:"Ω";s:2:"\";s:2:"α";s:2:"]";s:2:"β";s:2:"^";s:2:"γ";s:2:"_";s:2:"δ";s:2:"`";s:2:"ε";s:2:"a";s:2:"ζ";s:2:"b";s:2:"η";s:2:"c";s:2:"θ";s:2:"d";s:2:"ι";s:2:"e";s:2:"κ";s:2:"f";s:2:"λ";s:2:"g";s:2:"μ";s:2:"h";s:2:"ν";s:2:"i";s:2:"ξ";s:2:"j";s:2:"ο";s:2:"k";s:2:"π";s:2:"l";s:2:"ρ";s:2:"m";s:2:"σ";s:2:"n";s:2:"τ";s:2:"o";s:2:"υ";s:2:"p";s:2:"φ";s:2:"q";s:2:"χ";s:2:"r";s:2:"ψ";s:2:"s";s:2:"ω";s:2:"t";s:3:"ㄅ";s:2:"u";s:3:"ㄆ";s:2:"v";s:3:"ㄇ";s:2:"w";s:3:"ㄈ";s:2:"x";s:3:"ㄉ";s:2:"y";s:3:"ㄊ";s:2:"z";s:3:"ㄋ";s:2:"{";s:3:"ㄌ";s:2:"|";s:3:"ㄍ";s:2:"}";s:3:"ㄎ";s:2:"~";s:3:"ㄏ";s:2:"";s:3:"ㄐ";s:2:"";s:3:"ㄑ";s:2:"";s:3:"ㄒ";s:2:"";s:3:"ㄓ";s:2:"";s:3:"ㄔ";s:2:"";s:3:"ㄕ";s:2:"";s:3:"ㄖ";s:2:"";s:3:"ㄗ";s:2:"";s:3:"ㄘ";s:2:"";s:3:"ㄙ";s:2:"";s:3:"ㄚ";s:2:"";s:3:"ㄛ";s:2:"";s:3:"ㄜ";s:2:"";s:3:"ㄝ";s:2:"";s:3:"ㄞ";s:2:"";s:3:"ㄟ";s:2:"";s:3:"ㄠ";s:2:"";s:3:"ㄡ";s:2:"";s:3:"ㄢ";s:2:"";s:3:"ㄣ";s:2:"";s:3:"ㄤ";s:2:"";s:3:"ㄥ";s:2:"";s:3:"ㄦ";s:2:"";s:3:"ㄧ";s:2:"";s:3:"ㄨ";s:2:"";s:3:"ㄩ";s:2:"";s:2:"˙";s:2:"";s:2:"ˉ";s:2:"";s:2:"ˊ";s:2:"";s:2:"ˇ";s:2:"";s:2:"ˋ";s:2:"";s:3:"€";s:2:"@";s:3:"一";s:2:"A";s:3:"乙";s:2:"B";s:3:"丁";s:2:"C";s:3:"七";s:2:"D";s:3:"乃";s:2:"E";s:3:"九";s:2:"F";s:3:"了";s:2:"G";s:3:"二";s:2:"H";s:3:"人";s:2:"I";s:3:"儿";s:2:"J";s:3:"入";s:2:"K";s:3:"八";s:2:"L";s:3:"几";s:2:"M";s:3:"刀";s:2:"N";s:3:"刁";s:2:"O";s:3:"力";s:2:"P";s:3:"匕";s:2:"Q";s:3:"十";s:2:"R";s:3:"卜";s:2:"S";s:3:"又";s:2:"T";s:3:"三";s:2:"U";s:3:"下";s:2:"V";s:3:"丈";s:2:"W";s:3:"上";s:2:"X";s:3:"丫";s:2:"Y";s:3:"丸";s:2:"Z";s:3:"凡";s:2:"[";s:3:"久";s:2:"\";s:3:"么";s:2:"]";s:3:"也";s:2:"^";s:3:"乞";s:2:"_";s:3:"于";s:2:"`";s:3:"亡";s:2:"a";s:3:"兀";s:2:"b";s:3:"刃";s:2:"c";s:3:"勺";s:2:"d";s:3:"千";s:2:"e";s:3:"叉";s:2:"f";s:3:"口";s:2:"g";s:3:"土";s:2:"h";s:3:"士";s:2:"i";s:3:"夕";s:2:"j";s:3:"大";s:2:"k";s:3:"女";s:2:"l";s:3:"子";s:2:"m";s:3:"孑";s:2:"n";s:3:"孓";s:2:"o";s:3:"寸";s:2:"p";s:3:"小";s:2:"q";s:3:"尢";s:2:"r";s:3:"尸";s:2:"s";s:3:"山";s:2:"t";s:3:"川";s:2:"u";s:3:"工";s:2:"v";s:3:"己";s:2:"w";s:3:"已";s:2:"x";s:3:"巳";s:2:"y";s:3:"巾";s:2:"z";s:3:"干";s:2:"{";s:3:"廾";s:2:"|";s:3:"弋";s:2:"}";s:3:"弓";s:2:"~";s:3:"才";s:2:"";s:3:"丑";s:2:"";s:3:"丐";s:2:"";s:3:"不";s:2:"";s:3:"中";s:2:"";s:3:"丰";s:2:"";s:3:"丹";s:2:"";s:3:"之";s:2:"";s:3:"尹";s:2:"";s:3:"予";s:2:"";s:3:"云";s:2:"";s:3:"井";s:2:"";s:3:"互";s:2:"";s:3:"五";s:2:"";s:3:"亢";s:2:"";s:3:"仁";s:2:"";s:3:"什";s:2:"";s:3:"仃";s:2:"";s:3:"仆";s:2:"";s:3:"仇";s:2:"";s:3:"仍";s:2:"";s:3:"今";s:2:"";s:3:"介";s:2:"";s:3:"仄";s:2:"";s:3:"元";s:2:"";s:3:"允";s:2:"";s:3:"內";s:2:"";s:3:"六";s:2:"";s:3:"兮";s:2:"";s:3:"公";s:2:"";s:3:"冗";s:2:"";s:3:"凶";s:2:"";s:3:"分";s:2:"";s:3:"切";s:2:"";s:3:"刈";s:2:"";s:3:"勻";s:2:"";s:3:"勾";s:2:"";s:3:"勿";s:2:"";s:3:"化";s:2:"";s:3:"匹";s:2:"";s:3:"午";s:2:"";s:3:"升";s:2:"";s:3:"卅";s:2:"";s:3:"卞";s:2:"";s:3:"厄";s:2:"";s:3:"友";s:2:"";s:3:"及";s:2:"";s:3:"反";s:2:"";s:3:"壬";s:2:"";s:3:"天";s:2:"";s:3:"夫";s:2:"";s:3:"太";s:2:"";s:3:"夭";s:2:"";s:3:"孔";s:2:"";s:3:"少";s:2:"";s:3:"尤";s:2:"";s:3:"尺";s:2:"";s:3:"屯";s:2:"";s:3:"巴";s:2:"";s:3:"幻";s:2:"";s:3:"廿";s:2:"";s:3:"弔";s:2:"";s:3:"引";s:2:"";s:3:"心";s:2:"";s:3:"戈";s:2:"";s:3:"戶";s:2:"";s:3:"手";s:2:"";s:3:"扎";s:2:"";s:3:"支";s:2:"";s:3:"文";s:2:"";s:3:"斗";s:2:"";s:3:"斤";s:2:"";s:3:"方";s:2:"";s:3:"日";s:2:"";s:3:"曰";s:2:"";s:3:"月";s:2:"";s:3:"木";s:2:"";s:3:"欠";s:2:"";s:3:"止";s:2:"";s:3:"歹";s:2:"";s:3:"毋";s:2:"";s:3:"比";s:2:"";s:3:"毛";s:2:"";s:3:"氏";s:2:"";s:3:"水";s:2:"";s:3:"火";s:2:"";s:3:"爪";s:2:"";s:3:"父";s:2:"";s:3:"爻";s:2:"";s:3:"片";s:2:"";s:3:"牙";s:2:"";s:3:"牛";s:2:"";s:3:"犬";s:2:"";s:3:"王";s:2:"";s:3:"丙";s:2:"@";s:3:"世";s:2:"A";s:3:"丕";s:2:"B";s:3:"且";s:2:"C";s:3:"丘";s:2:"D";s:3:"主";s:2:"E";s:3:"乍";s:2:"F";s:3:"乏";s:2:"G";s:3:"乎";s:2:"H";s:3:"以";s:2:"I";s:3:"付";s:2:"J";s:3:"仔";s:2:"K";s:3:"仕";s:2:"L";s:3:"他";s:2:"M";s:3:"仗";s:2:"N";s:3:"代";s:2:"O";s:3:"令";s:2:"P";s:3:"仙";s:2:"Q";s:3:"仞";s:2:"R";s:3:"充";s:2:"S";s:3:"兄";s:2:"T";s:3:"冉";s:2:"U";s:3:"冊";s:2:"V";s:3:"冬";s:2:"W";s:3:"凹";s:2:"X";s:3:"出";s:2:"Y";s:3:"凸";s:2:"Z";s:3:"刊";s:2:"[";s:3:"加";s:2:"\";s:3:"功";s:2:"]";s:3:"包";s:2:"^";s:3:"匆";s:2:"_";s:3:"北";s:2:"`";s:3:"匝";s:2:"a";s:3:"仟";s:2:"b";s:3:"半";s:2:"c";s:3:"卉";s:2:"d";s:3:"卡";s:2:"e";s:3:"占";s:2:"f";s:3:"卯";s:2:"g";s:3:"卮";s:2:"h";s:3:"去";s:2:"i";s:3:"可";s:2:"j";s:3:"古";s:2:"k";s:3:"右";s:2:"l";s:3:"召";s:2:"m";s:3:"叮";s:2:"n";s:3:"叩";s:2:"o";s:3:"叨";s:2:"p";s:3:"叼";s:2:"q";s:3:"司";s:2:"r";s:3:"叵";s:2:"s";s:3:"叫";s:2:"t";s:3:"另";s:2:"u";s:3:"只";s:2:"v";s:3:"史";s:2:"w";s:3:"叱";s:2:"x";s:3:"台";s:2:"y";s:3:"句";s:2:"z";s:3:"叭";s:2:"{";s:3:"叻";s:2:"|";s:3:"四";s:2:"}";s:3:"囚";s:2:"~";s:3:"外";s:2:"";s:3:"央";s:2:"";s:3:"失";s:2:"";s:3:"奴";s:2:"";s:3:"奶";s:2:"";s:3:"孕";s:2:"";s:3:"它";s:2:"";s:3:"尼";s:2:"";s:3:"巨";s:2:"";s:3:"巧";s:2:"";s:3:"左";s:2:"";s:3:"市";s:2:"";s:3:"布";s:2:"";s:3:"平";s:2:"";s:3:"幼";s:2:"";s:3:"弁";s:2:"";s:3:"弘";s:2:"";s:3:"弗";s:2:"";s:3:"必";s:2:"";s:3:"戊";s:2:"";s:3:"打";s:2:"";s:3:"扔";s:2:"";s:3:"扒";s:2:"";s:3:"扑";s:2:"";s:3:"斥";s:2:"";s:3:"旦";s:2:"";s:3:"朮";s:2:"";s:3:"本";s:2:"";s:3:"未";s:2:"";s:3:"末";s:2:"";s:3:"札";s:2:"";s:3:"正";s:2:"";s:3:"母";s:2:"";s:3:"民";s:2:"";s:3:"氐";s:2:"";s:3:"永";s:2:"";s:3:"汁";s:2:"";s:3:"汀";s:2:"";s:3:"氾";s:2:"";s:3:"犯";s:2:"";s:3:"玄";s:2:"";s:3:"玉";s:2:"";s:3:"瓜";s:2:"";s:3:"瓦";s:2:"";s:3:"甘";s:2:"";s:3:"生";s:2:"";s:3:"用";s:2:"";s:3:"甩";s:2:"";s:3:"田";s:2:"";s:3:"由";s:2:"";s:3:"甲";s:2:"";s:3:"申";s:2:"";s:3:"疋";s:2:"";s:3:"白";s:2:"";s:3:"皮";s:2:"";s:3:"皿";s:2:"";s:3:"目";s:2:"";s:3:"矛";s:2:"";s:3:"矢";s:2:"";s:3:"石";s:2:"";s:3:"示";s:2:"";s:3:"禾";s:2:"";s:3:"穴";s:2:"";s:3:"立";s:2:"";s:3:"丞";s:2:"";s:3:"丟";s:2:"";s:3:"乒";s:2:"";s:3:"乓";s:2:"";s:3:"乩";s:2:"";s:3:"亙";s:2:"";s:3:"交";s:2:"";s:3:"亦";s:2:"";s:3:"亥";s:2:"";s:3:"仿";s:2:"";s:3:"伉";s:2:"";s:3:"伙";s:2:"";s:3:"伊";s:2:"";s:3:"伕";s:2:"";s:3:"伍";s:2:"";s:3:"伐";s:2:"";s:3:"休";s:2:"";s:3:"伏";s:2:"";s:3:"仲";s:2:"";s:3:"件";s:2:"";s:3:"任";s:2:"";s:3:"仰";s:2:"";s:3:"仳";s:2:"";s:3:"份";s:2:"";s:3:"企";s:2:"";s:3:"伋";s:2:"";s:3:"光";s:2:"";s:3:"兇";s:2:"";s:3:"兆";s:2:"";s:3:"先";s:2:"";s:3:"全";s:2:"@";s:3:"共";s:2:"A";s:3:"再";s:2:"B";s:3:"冰";s:2:"C";s:3:"列";s:2:"D";s:3:"刑";s:2:"E";s:3:"划";s:2:"F";s:3:"刎";s:2:"G";s:3:"刖";s:2:"H";s:3:"劣";s:2:"I";s:3:"匈";s:2:"J";s:3:"匡";s:2:"K";s:3:"匠";s:2:"L";s:3:"印";s:2:"M";s:3:"危";s:2:"N";s:3:"吉";s:2:"O";s:3:"吏";s:2:"P";s:3:"同";s:2:"Q";s:3:"吊";s:2:"R";s:3:"吐";s:2:"S";s:3:"吁";s:2:"T";s:3:"吋";s:2:"U";s:3:"各";s:2:"V";s:3:"向";s:2:"W";s:3:"名";s:2:"X";s:3:"合";s:2:"Y";s:3:"吃";s:2:"Z";s:3:"后";s:2:"[";s:3:"吆";s:2:"\";s:3:"吒";s:2:"]";s:3:"因";s:2:"^";s:3:"回";s:2:"_";s:3:"囝";s:2:"`";s:3:"圳";s:2:"a";s:3:"地";s:2:"b";s:3:"在";s:2:"c";s:3:"圭";s:2:"d";s:3:"圬";s:2:"e";s:3:"圯";s:2:"f";s:3:"圩";s:2:"g";s:3:"夙";s:2:"h";s:3:"多";s:2:"i";s:3:"夷";s:2:"j";s:3:"夸";s:2:"k";s:3:"妄";s:2:"l";s:3:"奸";s:2:"m";s:3:"妃";s:2:"n";s:3:"好";s:2:"o";s:3:"她";s:2:"p";s:3:"如";s:2:"q";s:3:"妁";s:2:"r";s:3:"字";s:2:"s";s:3:"存";s:2:"t";s:3:"宇";s:2:"u";s:3:"守";s:2:"v";s:3:"宅";s:2:"w";s:3:"安";s:2:"x";s:3:"寺";s:2:"y";s:3:"尖";s:2:"z";s:3:"屹";s:2:"{";s:3:"州";s:2:"|";s:3:"帆";s:2:"}";s:3:"并";s:2:"~";s:3:"年";s:2:"";s:3:"式";s:2:"";s:3:"弛";s:2:"";s:3:"忙";s:2:"";s:3:"忖";s:2:"";s:3:"戎";s:2:"";s:3:"戌";s:2:"";s:3:"戍";s:2:"";s:3:"成";s:2:"";s:3:"扣";s:2:"";s:3:"扛";s:2:"";s:3:"托";s:2:"";s:3:"收";s:2:"";s:3:"早";s:2:"";s:3:"旨";s:2:"";s:3:"旬";s:2:"";s:3:"旭";s:2:"";s:3:"曲";s:2:"";s:3:"曳";s:2:"";s:3:"有";s:2:"";s:3:"朽";s:2:"";s:3:"朴";s:2:"";s:3:"朱";s:2:"";s:3:"朵";s:2:"";s:3:"次";s:2:"";s:3:"此";s:2:"";s:3:"死";s:2:"";s:3:"氖";s:2:"";s:3:"汝";s:2:"";s:3:"汗";s:2:"";s:3:"汙";s:2:"";s:3:"江";s:2:"";s:3:"池";s:2:"";s:3:"汐";s:2:"";s:3:"汕";s:2:"";s:3:"污";s:2:"";s:3:"汛";s:2:"";s:3:"汍";s:2:"";s:3:"汎";s:2:"";s:3:"灰";s:2:"";s:3:"牟";s:2:"";s:3:"牝";s:2:"";s:3:"百";s:2:"";s:3:"竹";s:2:"";s:3:"米";s:2:"";s:3:"糸";s:2:"";s:3:"缶";s:2:"";s:3:"羊";s:2:"";s:3:"羽";s:2:"";s:3:"老";s:2:"";s:3:"考";s:2:"";s:3:"而";s:2:"";s:3:"耒";s:2:"";s:3:"耳";s:2:"";s:3:"聿";s:2:"";s:3:"肉";s:2:"";s:3:"肋";s:2:"";s:3:"肌";s:2:"";s:3:"臣";s:2:"";s:3:"自";s:2:"";s:3:"至";s:2:"";s:3:"臼";s:2:"";s:3:"舌";s:2:"";s:3:"舛";s:2:"";s:3:"舟";s:2:"";s:3:"艮";s:2:"";s:3:"色";s:2:"";s:3:"艾";s:2:"";s:3:"虫";s:2:"";s:3:"血";s:2:"";s:3:"行";s:2:"";s:3:"衣";s:2:"";s:3:"西";s:2:"";s:3:"阡";s:2:"";s:3:"串";s:2:"";s:3:"亨";s:2:"";s:3:"位";s:2:"";s:3:"住";s:2:"";s:3:"佇";s:2:"";s:3:"佗";s:2:"";s:3:"佞";s:2:"";s:3:"伴";s:2:"";s:3:"佛";s:2:"";s:3:"何";s:2:"";s:3:"估";s:2:"";s:3:"佐";s:2:"";s:3:"佑";s:2:"";s:3:"伽";s:2:"";s:3:"伺";s:2:"";s:3:"伸";s:2:"";s:3:"佃";s:2:"";s:3:"佔";s:2:"";s:3:"似";s:2:"";s:3:"但";s:2:"";s:3:"佣";s:2:"@";s:3:"作";s:2:"A";s:3:"你";s:2:"B";s:3:"伯";s:2:"C";s:3:"低";s:2:"D";s:3:"伶";s:2:"E";s:3:"余";s:2:"F";s:3:"佝";s:2:"G";s:3:"佈";s:2:"H";s:3:"佚";s:2:"I";s:3:"兌";s:2:"J";s:3:"克";s:2:"K";s:3:"免";s:2:"L";s:3:"兵";s:2:"M";s:3:"冶";s:2:"N";s:3:"冷";s:2:"O";s:3:"別";s:2:"P";s:3:"判";s:2:"Q";s:3:"利";s:2:"R";s:3:"刪";s:2:"S";s:3:"刨";s:2:"T";s:3:"劫";s:2:"U";s:3:"助";s:2:"V";s:3:"努";s:2:"W";s:3:"劬";s:2:"X";s:3:"匣";s:2:"Y";s:3:"即";s:2:"Z";s:3:"卵";s:2:"[";s:3:"吝";s:2:"\";s:3:"吭";s:2:"]";s:3:"吞";s:2:"^";s:3:"吾";s:2:"_";s:3:"否";s:2:"`";s:3:"呎";s:2:"a";s:3:"吧";s:2:"b";s:3:"呆";s:2:"c";s:3:"呃";s:2:"d";s:3:"吳";s:2:"e";s:3:"呈";s:2:"f";s:3:"呂";s:2:"g";s:3:"君";s:2:"h";s:3:"吩";s:2:"i";s:3:"告";s:2:"j";s:3:"吹";s:2:"k";s:3:"吻";s:2:"l";s:3:"吸";s:2:"m";s:3:"吮";s:2:"n";s:3:"吵";s:2:"o";s:3:"吶";s:2:"p";s:3:"吠";s:2:"q";s:3:"吼";s:2:"r";s:3:"呀";s:2:"s";s:3:"吱";s:2:"t";s:3:"含";s:2:"u";s:3:"吟";s:2:"v";s:3:"听";s:2:"w";s:3:"囪";s:2:"x";s:3:"困";s:2:"y";s:3:"囤";s:2:"z";s:3:"囫";s:2:"{";s:3:"坊";s:2:"|";s:3:"坑";s:2:"}";s:3:"址";s:2:"~";s:3:"坍";s:2:"";s:3:"均";s:2:"";s:3:"坎";s:2:"";s:3:"圾";s:2:"";s:3:"坐";s:2:"";s:3:"坏";s:2:"";s:3:"圻";s:2:"";s:3:"壯";s:2:"";s:3:"夾";s:2:"";s:3:"妝";s:2:"";s:3:"妒";s:2:"";s:3:"妨";s:2:"";s:3:"妞";s:2:"";s:3:"妣";s:2:"";s:3:"妙";s:2:"";s:3:"妖";s:2:"";s:3:"妍";s:2:"";s:3:"妤";s:2:"";s:3:"妓";s:2:"";s:3:"妊";s:2:"";s:3:"妥";s:2:"";s:3:"孝";s:2:"";s:3:"孜";s:2:"";s:3:"孚";s:2:"";s:3:"孛";s:2:"";s:3:"完";s:2:"";s:3:"宋";s:2:"";s:3:"宏";s:2:"";s:3:"尬";s:2:"";s:3:"局";s:2:"";s:3:"屁";s:2:"";s:3:"尿";s:2:"";s:3:"尾";s:2:"";s:3:"岐";s:2:"";s:3:"岑";s:2:"";s:3:"岔";s:2:"";s:3:"岌";s:2:"";s:3:"巫";s:2:"";s:3:"希";s:2:"";s:3:"序";s:2:"";s:3:"庇";s:2:"";s:3:"床";s:2:"";s:3:"廷";s:2:"";s:3:"弄";s:2:"";s:3:"弟";s:2:"";s:3:"彤";s:2:"";s:3:"形";s:2:"";s:3:"彷";s:2:"";s:3:"役";s:2:"";s:3:"忘";s:2:"";s:3:"忌";s:2:"";s:3:"志";s:2:"";s:3:"忍";s:2:"";s:3:"忱";s:2:"";s:3:"快";s:2:"";s:3:"忸";s:2:"";s:3:"忪";s:2:"";s:3:"戒";s:2:"";s:3:"我";s:2:"";s:3:"抄";s:2:"";s:3:"抗";s:2:"";s:3:"抖";s:2:"";s:3:"技";s:2:"";s:3:"扶";s:2:"";s:3:"抉";s:2:"";s:3:"扭";s:2:"";s:3:"把";s:2:"";s:3:"扼";s:2:"";s:3:"找";s:2:"";s:3:"批";s:2:"";s:3:"扳";s:2:"";s:3:"抒";s:2:"";s:3:"扯";s:2:"";s:3:"折";s:2:"";s:3:"扮";s:2:"";s:3:"投";s:2:"";s:3:"抓";s:2:"";s:3:"抑";s:2:"";s:3:"抆";s:2:"";s:3:"改";s:2:"";s:3:"攻";s:2:"";s:3:"攸";s:2:"";s:3:"旱";s:2:"";s:3:"更";s:2:"";s:3:"束";s:2:"";s:3:"李";s:2:"";s:3:"杏";s:2:"";s:3:"材";s:2:"";s:3:"村";s:2:"";s:3:"杜";s:2:"";s:3:"杖";s:2:"";s:3:"杞";s:2:"";s:3:"杉";s:2:"";s:3:"杆";s:2:"";s:3:"杠";s:2:"@";s:3:"杓";s:2:"A";s:3:"杗";s:2:"B";s:3:"步";s:2:"C";s:3:"每";s:2:"D";s:3:"求";s:2:"E";s:3:"汞";s:2:"F";s:3:"沙";s:2:"G";s:3:"沁";s:2:"H";s:3:"沈";s:2:"I";s:3:"沉";s:2:"J";s:3:"沅";s:2:"K";s:3:"沛";s:2:"L";s:3:"汪";s:2:"M";s:3:"決";s:2:"N";s:3:"沐";s:2:"O";s:3:"汰";s:2:"P";s:3:"沌";s:2:"Q";s:3:"汨";s:2:"R";s:3:"沖";s:2:"S";s:3:"沒";s:2:"T";s:3:"汽";s:2:"U";s:3:"沃";s:2:"V";s:3:"汲";s:2:"W";s:3:"汾";s:2:"X";s:3:"汴";s:2:"Y";s:3:"沆";s:2:"Z";s:3:"汶";s:2:"[";s:3:"沍";s:2:"\";s:3:"沔";s:2:"]";s:3:"沘";s:2:"^";s:3:"沂";s:2:"_";s:3:"灶";s:2:"`";s:3:"灼";s:2:"a";s:3:"災";s:2:"b";s:3:"灸";s:2:"c";s:3:"牢";s:2:"d";s:3:"牡";s:2:"e";s:3:"牠";s:2:"f";s:3:"狄";s:2:"g";s:3:"狂";s:2:"h";s:3:"玖";s:2:"i";s:3:"甬";s:2:"j";s:3:"甫";s:2:"k";s:3:"男";s:2:"l";s:3:"甸";s:2:"m";s:3:"皂";s:2:"n";s:3:"盯";s:2:"o";s:3:"矣";s:2:"p";s:3:"私";s:2:"q";s:3:"秀";s:2:"r";s:3:"禿";s:2:"s";s:3:"究";s:2:"t";s:3:"系";s:2:"u";s:3:"罕";s:2:"v";s:3:"肖";s:2:"w";s:3:"肓";s:2:"x";s:3:"肝";s:2:"y";s:3:"肘";s:2:"z";s:3:"肛";s:2:"{";s:3:"肚";s:2:"|";s:3:"育";s:2:"}";s:3:"良";s:2:"~";s:3:"芒";s:2:"";s:3:"芋";s:2:"";s:3:"芍";s:2:"";s:3:"見";s:2:"";s:3:"角";s:2:"";s:3:"言";s:2:"";s:3:"谷";s:2:"";s:3:"豆";s:2:"";s:3:"豕";s:2:"";s:3:"貝";s:2:"";s:3:"赤";s:2:"";s:3:"走";s:2:"";s:3:"足";s:2:"";s:3:"身";s:2:"";s:3:"車";s:2:"";s:3:"辛";s:2:"";s:3:"辰";s:2:"";s:3:"迂";s:2:"";s:3:"迆";s:2:"";s:3:"迅";s:2:"";s:3:"迄";s:2:"";s:3:"巡";s:2:"";s:3:"邑";s:2:"";s:3:"邢";s:2:"";s:3:"邪";s:2:"";s:3:"邦";s:2:"";s:3:"那";s:2:"";s:3:"酉";s:2:"";s:3:"釆";s:2:"";s:3:"里";s:2:"";s:3:"防";s:2:"";s:3:"阮";s:2:"";s:3:"阱";s:2:"";s:3:"阪";s:2:"";s:3:"阬";s:2:"";s:3:"並";s:2:"";s:3:"乖";s:2:"";s:3:"乳";s:2:"";s:3:"事";s:2:"";s:3:"些";s:2:"";s:3:"亞";s:2:"";s:3:"享";s:2:"";s:3:"京";s:2:"";s:3:"佯";s:2:"";s:3:"依";s:2:"";s:3:"侍";s:2:"";s:3:"佳";s:2:"";s:3:"使";s:2:"";s:3:"佬";s:2:"";s:3:"供";s:2:"";s:3:"例";s:2:"";s:3:"來";s:2:"";s:3:"侃";s:2:"";s:3:"佰";s:2:"";s:3:"併";s:2:"";s:3:"侈";s:2:"";s:3:"佩";s:2:"";s:3:"佻";s:2:"";s:3:"侖";s:2:"";s:3:"佾";s:2:"";s:3:"侏";s:2:"";s:3:"侑";s:2:"";s:3:"佺";s:2:"";s:3:"兔";s:2:"";s:3:"兒";s:2:"";s:3:"兕";s:2:"";s:3:"兩";s:2:"";s:3:"具";s:2:"";s:3:"其";s:2:"";s:3:"典";s:2:"";s:3:"冽";s:2:"";s:3:"函";s:2:"";s:3:"刻";s:2:"";s:3:"券";s:2:"";s:3:"刷";s:2:"";s:3:"刺";s:2:"";s:3:"到";s:2:"";s:3:"刮";s:2:"";s:3:"制";s:2:"";s:3:"剁";s:2:"";s:3:"劾";s:2:"";s:3:"劻";s:2:"";s:3:"卒";s:2:"";s:3:"協";s:2:"";s:3:"卓";s:2:"";s:3:"卑";s:2:"";s:3:"卦";s:2:"";s:3:"卷";s:2:"";s:3:"卸";s:2:"";s:3:"卹";s:2:"";s:3:"取";s:2:"";s:3:"叔";s:2:"";s:3:"受";s:2:"";s:3:"味";s:2:"";s:3:"呵";s:2:"@";s:3:"咖";s:2:"A";s:3:"呸";s:2:"B";s:3:"咕";s:2:"C";s:3:"咀";s:2:"D";s:3:"呻";s:2:"E";s:3:"呷";s:2:"F";s:3:"咄";s:2:"G";s:3:"咒";s:2:"H";s:3:"咆";s:2:"I";s:3:"呼";s:2:"J";s:3:"咐";s:2:"K";s:3:"呱";s:2:"L";s:3:"呶";s:2:"M";s:3:"和";s:2:"N";s:3:"咚";s:2:"O";s:3:"呢";s:2:"P";s:3:"周";s:2:"Q";s:3:"咋";s:2:"R";s:3:"命";s:2:"S";s:3:"咎";s:2:"T";s:3:"固";s:2:"U";s:3:"垃";s:2:"V";s:3:"坷";s:2:"W";s:3:"坪";s:2:"X";s:3:"坩";s:2:"Y";s:3:"坡";s:2:"Z";s:3:"坦";s:2:"[";s:3:"坤";s:2:"\";s:3:"坼";s:2:"]";s:3:"夜";s:2:"^";s:3:"奉";s:2:"_";s:3:"奇";s:2:"`";s:3:"奈";s:2:"a";s:3:"奄";s:2:"b";s:3:"奔";s:2:"c";s:3:"妾";s:2:"d";s:3:"妻";s:2:"e";s:3:"委";s:2:"f";s:3:"妹";s:2:"g";s:3:"妮";s:2:"h";s:3:"姑";s:2:"i";s:3:"姆";s:2:"j";s:3:"姐";s:2:"k";s:3:"姍";s:2:"l";s:3:"始";s:2:"m";s:3:"姓";s:2:"n";s:3:"姊";s:2:"o";s:3:"妯";s:2:"p";s:3:"妳";s:2:"q";s:3:"姒";s:2:"r";s:3:"姅";s:2:"s";s:3:"孟";s:2:"t";s:3:"孤";s:2:"u";s:3:"季";s:2:"v";s:3:"宗";s:2:"w";s:3:"定";s:2:"x";s:3:"官";s:2:"y";s:3:"宜";s:2:"z";s:3:"宙";s:2:"{";s:3:"宛";s:2:"|";s:3:"尚";s:2:"}";s:3:"屈";s:2:"~";s:3:"居";s:2:"";s:3:"屆";s:2:"";s:3:"岷";s:2:"";s:3:"岡";s:2:"";s:3:"岸";s:2:"";s:3:"岩";s:2:"";s:3:"岫";s:2:"";s:3:"岱";s:2:"";s:3:"岳";s:2:"";s:3:"帘";s:2:"";s:3:"帚";s:2:"";s:3:"帖";s:2:"";s:3:"帕";s:2:"";s:3:"帛";s:2:"";s:3:"帑";s:2:"";s:3:"幸";s:2:"";s:3:"庚";s:2:"";s:3:"店";s:2:"";s:3:"府";s:2:"";s:3:"底";s:2:"";s:3:"庖";s:2:"";s:3:"延";s:2:"";s:3:"弦";s:2:"";s:3:"弧";s:2:"";s:3:"弩";s:2:"";s:3:"往";s:2:"";s:3:"征";s:2:"";s:3:"彿";s:2:"";s:3:"彼";s:2:"";s:3:"忝";s:2:"";s:3:"忠";s:2:"";s:3:"忽";s:2:"";s:3:"念";s:2:"";s:3:"忿";s:2:"";s:3:"怏";s:2:"";s:3:"怔";s:2:"";s:3:"怯";s:2:"";s:3:"怵";s:2:"";s:3:"怖";s:2:"";s:3:"怪";s:2:"";s:3:"怕";s:2:"";s:3:"怡";s:2:"";s:3:"性";s:2:"";s:3:"怩";s:2:"";s:3:"怫";s:2:"";s:3:"怛";s:2:"";s:3:"或";s:2:"";s:3:"戕";s:2:"";s:3:"房";s:2:"";s:3:"戾";s:2:"";s:3:"所";s:2:"";s:3:"承";s:2:"";s:3:"拉";s:2:"";s:3:"拌";s:2:"";s:3:"拄";s:2:"";s:3:"抿";s:2:"";s:3:"拂";s:2:"";s:3:"抹";s:2:"";s:3:"拒";s:2:"";s:3:"招";s:2:"";s:3:"披";s:2:"";s:3:"拓";s:2:"";s:3:"拔";s:2:"";s:3:"拋";s:2:"";s:3:"拈";s:2:"";s:3:"抨";s:2:"";s:3:"抽";s:2:"";s:3:"押";s:2:"";s:3:"拐";s:2:"";s:3:"拙";s:2:"";s:3:"拇";s:2:"";s:3:"拍";s:2:"";s:3:"抵";s:2:"";s:3:"拚";s:2:"";s:3:"抱";s:2:"";s:3:"拘";s:2:"";s:3:"拖";s:2:"";s:3:"拗";s:2:"";s:3:"拆";s:2:"";s:3:"抬";s:2:"";s:3:"拎";s:2:"";s:3:"放";s:2:"";s:3:"斧";s:2:"";s:3:"於";s:2:"";s:3:"旺";s:2:"";s:3:"昔";s:2:"";s:3:"易";s:2:"";s:3:"昌";s:2:"";s:3:"昆";s:2:"";s:3:"昂";s:2:"";s:3:"明";s:2:"";s:3:"昀";s:2:"";s:3:"昏";s:2:"";s:3:"昕";s:2:"";s:3:"昊";s:2:"@";s:3:"昇";s:2:"A";s:3:"服";s:2:"B";s:3:"朋";s:2:"C";s:3:"杭";s:2:"D";s:3:"枋";s:2:"E";s:3:"枕";s:2:"F";s:3:"東";s:2:"G";s:3:"果";s:2:"H";s:3:"杳";s:2:"I";s:3:"杷";s:2:"J";s:3:"枇";s:2:"K";s:3:"枝";s:2:"L";s:3:"林";s:2:"M";s:3:"杯";s:2:"N";s:3:"杰";s:2:"O";s:3:"板";s:2:"P";s:3:"枉";s:2:"Q";s:3:"松";s:2:"R";s:3:"析";s:2:"S";s:3:"杵";s:2:"T";s:3:"枚";s:2:"U";s:3:"枓";s:2:"V";s:3:"杼";s:2:"W";s:3:"杪";s:2:"X";s:3:"杲";s:2:"Y";s:3:"欣";s:2:"Z";s:3:"武";s:2:"[";s:3:"歧";s:2:"\";s:3:"歿";s:2:"]";s:3:"氓";s:2:"^";s:3:"氛";s:2:"_";s:3:"泣";s:2:"`";s:3:"注";s:2:"a";s:3:"泳";s:2:"b";s:3:"沱";s:2:"c";s:3:"泌";s:2:"d";s:3:"泥";s:2:"e";s:3:"河";s:2:"f";s:3:"沽";s:2:"g";s:3:"沾";s:2:"h";s:3:"沼";s:2:"i";s:3:"波";s:2:"j";s:3:"沫";s:2:"k";s:3:"法";s:2:"l";s:3:"泓";s:2:"m";s:3:"沸";s:2:"n";s:3:"泄";s:2:"o";s:3:"油";s:2:"p";s:3:"況";s:2:"q";s:3:"沮";s:2:"r";s:3:"泗";s:2:"s";s:3:"泅";s:2:"t";s:3:"泱";s:2:"u";s:3:"沿";s:2:"v";s:3:"治";s:2:"w";s:3:"泡";s:2:"x";s:3:"泛";s:2:"y";s:3:"泊";s:2:"z";s:3:"沬";s:2:"{";s:3:"泯";s:2:"|";s:3:"泜";s:2:"}";s:3:"泖";s:2:"~";s:3:"泠";s:2:"";s:3:"炕";s:2:"";s:3:"炎";s:2:"";s:3:"炒";s:2:"";s:3:"炊";s:2:"";s:3:"炙";s:2:"";s:3:"爬";s:2:"";s:3:"爭";s:2:"";s:3:"爸";s:2:"";s:3:"版";s:2:"";s:3:"牧";s:2:"";s:3:"物";s:2:"";s:3:"狀";s:2:"";s:3:"狎";s:2:"";s:3:"狙";s:2:"";s:3:"狗";s:2:"";s:3:"狐";s:2:"";s:3:"玩";s:2:"";s:3:"玨";s:2:"";s:3:"玟";s:2:"";s:3:"玫";s:2:"";s:3:"玥";s:2:"";s:3:"甽";s:2:"";s:3:"疝";s:2:"";s:3:"疙";s:2:"";s:3:"疚";s:2:"";s:3:"的";s:2:"";s:3:"盂";s:2:"";s:3:"盲";s:2:"";s:3:"直";s:2:"";s:3:"知";s:2:"";s:3:"矽";s:2:"";s:3:"社";s:2:"";s:3:"祀";s:2:"";s:3:"祁";s:2:"";s:3:"秉";s:2:"";s:3:"秈";s:2:"";s:3:"空";s:2:"";s:3:"穹";s:2:"";s:3:"竺";s:2:"";s:3:"糾";s:2:"";s:3:"罔";s:2:"";s:3:"羌";s:2:"";s:3:"羋";s:2:"";s:3:"者";s:2:"";s:3:"肺";s:2:"";s:3:"肥";s:2:"";s:3:"肢";s:2:"";s:3:"肱";s:2:"";s:3:"股";s:2:"";s:3:"肫";s:2:"";s:3:"肩";s:2:"";s:3:"肴";s:2:"";s:3:"肪";s:2:"";s:3:"肯";s:2:"";s:3:"臥";s:2:"";s:3:"臾";s:2:"";s:3:"舍";s:2:"";s:3:"芳";s:2:"";s:3:"芝";s:2:"";s:3:"芙";s:2:"";s:3:"芭";s:2:"";s:3:"芽";s:2:"";s:3:"芟";s:2:"";s:3:"芹";s:2:"";s:3:"花";s:2:"";s:3:"芬";s:2:"";s:3:"芥";s:2:"";s:3:"芯";s:2:"";s:3:"芸";s:2:"";s:3:"芣";s:2:"";s:3:"芰";s:2:"";s:3:"芾";s:2:"";s:3:"芷";s:2:"";s:3:"虎";s:2:"";s:3:"虱";s:2:"";s:3:"初";s:2:"";s:3:"表";s:2:"";s:3:"軋";s:2:"";s:3:"迎";s:2:"";s:3:"返";s:2:"";s:3:"近";s:2:"";s:3:"邵";s:2:"";s:3:"邸";s:2:"";s:3:"邱";s:2:"";s:3:"邶";s:2:"";s:3:"采";s:2:"";s:3:"金";s:2:"";s:3:"長";s:2:"";s:3:"門";s:2:"";s:3:"阜";s:2:"";s:3:"陀";s:2:"";s:3:"阿";s:2:"";s:3:"阻";s:2:"";s:3:"附";s:2:"@";s:3:"陂";s:2:"A";s:3:"隹";s:2:"B";s:3:"雨";s:2:"C";s:3:"青";s:2:"D";s:3:"非";s:2:"E";s:3:"亟";s:2:"F";s:3:"亭";s:2:"G";s:3:"亮";s:2:"H";s:3:"信";s:2:"I";s:3:"侵";s:2:"J";s:3:"侯";s:2:"K";s:3:"便";s:2:"L";s:3:"俠";s:2:"M";s:3:"俑";s:2:"N";s:3:"俏";s:2:"O";s:3:"保";s:2:"P";s:3:"促";s:2:"Q";s:3:"侶";s:2:"R";s:3:"俘";s:2:"S";s:3:"俟";s:2:"T";s:3:"俊";s:2:"U";s:3:"俗";s:2:"V";s:3:"侮";s:2:"W";s:3:"俐";s:2:"X";s:3:"俄";s:2:"Y";s:3:"係";s:2:"Z";s:3:"俚";s:2:"[";s:3:"俎";s:2:"\";s:3:"俞";s:2:"]";s:3:"侷";s:2:"^";s:3:"兗";s:2:"_";s:3:"冒";s:2:"`";s:3:"冑";s:2:"a";s:3:"冠";s:2:"b";s:3:"剎";s:2:"c";s:3:"剃";s:2:"d";s:3:"削";s:2:"e";s:3:"前";s:2:"f";s:3:"剌";s:2:"g";s:3:"剋";s:2:"h";s:3:"則";s:2:"i";s:3:"勇";s:2:"j";s:3:"勉";s:2:"k";s:3:"勃";s:2:"l";s:3:"勁";s:2:"m";s:3:"匍";s:2:"n";s:3:"南";s:2:"o";s:3:"卻";s:2:"p";s:3:"厚";s:2:"q";s:3:"叛";s:2:"r";s:3:"咬";s:2:"s";s:3:"哀";s:2:"t";s:3:"咨";s:2:"u";s:3:"哎";s:2:"v";s:3:"哉";s:2:"w";s:3:"咸";s:2:"x";s:3:"咦";s:2:"y";s:3:"咳";s:2:"z";s:3:"哇";s:2:"{";s:3:"哂";s:2:"|";s:3:"咽";s:2:"}";s:3:"咪";s:2:"~";s:3:"品";s:2:"";s:3:"哄";s:2:"";s:3:"哈";s:2:"";s:3:"咯";s:2:"";s:3:"咫";s:2:"";s:3:"咱";s:2:"";s:3:"咻";s:2:"";s:3:"咩";s:2:"";s:3:"咧";s:2:"";s:3:"咿";s:2:"";s:3:"囿";s:2:"";s:3:"垂";s:2:"";s:3:"型";s:2:"";s:3:"垠";s:2:"";s:3:"垣";s:2:"";s:3:"垢";s:2:"";s:3:"城";s:2:"";s:3:"垮";s:2:"";s:3:"垓";s:2:"";s:3:"奕";s:2:"";s:3:"契";s:2:"";s:3:"奏";s:2:"";s:3:"奎";s:2:"";s:3:"奐";s:2:"";s:3:"姜";s:2:"";s:3:"姘";s:2:"";s:3:"姿";s:2:"";s:3:"姣";s:2:"";s:3:"姨";s:2:"";s:3:"娃";s:2:"";s:3:"姥";s:2:"";s:3:"姪";s:2:"";s:3:"姚";s:2:"";s:3:"姦";s:2:"";s:3:"威";s:2:"";s:3:"姻";s:2:"";s:3:"孩";s:2:"";s:3:"宣";s:2:"";s:3:"宦";s:2:"";s:3:"室";s:2:"";s:3:"客";s:2:"";s:3:"宥";s:2:"";s:3:"封";s:2:"";s:3:"屎";s:2:"";s:3:"屏";s:2:"";s:3:"屍";s:2:"";s:3:"屋";s:2:"";s:3:"峙";s:2:"";s:3:"峒";s:2:"";s:3:"巷";s:2:"";s:3:"帝";s:2:"";s:3:"帥";s:2:"";s:3:"帟";s:2:"";s:3:"幽";s:2:"";s:3:"庠";s:2:"";s:3:"度";s:2:"";s:3:"建";s:2:"";s:3:"弈";s:2:"";s:3:"弭";s:2:"";s:3:"彥";s:2:"";s:3:"很";s:2:"";s:3:"待";s:2:"";s:3:"徊";s:2:"";s:3:"律";s:2:"";s:3:"徇";s:2:"";s:3:"後";s:2:"";s:3:"徉";s:2:"";s:3:"怒";s:2:"";s:3:"思";s:2:"";s:3:"怠";s:2:"";s:3:"急";s:2:"";s:3:"怎";s:2:"";s:3:"怨";s:2:"";s:3:"恍";s:2:"";s:3:"恰";s:2:"";s:3:"恨";s:2:"";s:3:"恢";s:2:"";s:3:"恆";s:2:"";s:3:"恃";s:2:"";s:3:"恬";s:2:"";s:3:"恫";s:2:"";s:3:"恪";s:2:"";s:3:"恤";s:2:"";s:3:"扁";s:2:"";s:3:"拜";s:2:"";s:3:"挖";s:2:"";s:3:"按";s:2:"";s:3:"拼";s:2:"";s:3:"拭";s:2:"";s:3:"持";s:2:"";s:3:"拮";s:2:"";s:3:"拽";s:2:"";s:3:"指";s:2:"";s:3:"拱";s:2:"";s:3:"拷";s:2:"@";s:3:"拯";s:2:"A";s:3:"括";s:2:"B";s:3:"拾";s:2:"C";s:3:"拴";s:2:"D";s:3:"挑";s:2:"E";s:3:"挂";s:2:"F";s:3:"政";s:2:"G";s:3:"故";s:2:"H";s:3:"斫";s:2:"I";s:3:"施";s:2:"J";s:3:"既";s:2:"K";s:3:"春";s:2:"L";s:3:"昭";s:2:"M";s:3:"映";s:2:"N";s:3:"昧";s:2:"O";s:3:"是";s:2:"P";s:3:"星";s:2:"Q";s:3:"昨";s:2:"R";s:3:"昱";s:2:"S";s:3:"昤";s:2:"T";s:3:"曷";s:2:"U";s:3:"柿";s:2:"V";s:3:"染";s:2:"W";s:3:"柱";s:2:"X";s:3:"柔";s:2:"Y";s:3:"某";s:2:"Z";s:3:"柬";s:2:"[";s:3:"架";s:2:"\";s:3:"枯";s:2:"]";s:3:"柵";s:2:"^";s:3:"柩";s:2:"_";s:3:"柯";s:2:"`";s:3:"柄";s:2:"a";s:3:"柑";s:2:"b";s:3:"枴";s:2:"c";s:3:"柚";s:2:"d";s:3:"查";s:2:"e";s:3:"枸";s:2:"f";s:3:"柏";s:2:"g";s:3:"柞";s:2:"h";s:3:"柳";s:2:"i";s:3:"枰";s:2:"j";s:3:"柙";s:2:"k";s:3:"柢";s:2:"l";s:3:"柝";s:2:"m";s:3:"柒";s:2:"n";s:3:"歪";s:2:"o";s:3:"殃";s:2:"p";s:3:"殆";s:2:"q";s:3:"段";s:2:"r";s:3:"毒";s:2:"s";s:3:"毗";s:2:"t";s:3:"氟";s:2:"u";s:3:"泉";s:2:"v";s:3:"洋";s:2:"w";s:3:"洲";s:2:"x";s:3:"洪";s:2:"y";s:3:"流";s:2:"z";s:3:"津";s:2:"{";s:3:"洌";s:2:"|";s:3:"洱";s:2:"}";s:3:"洞";s:2:"~";s:3:"洗";s:2:"";s:3:"活";s:2:"";s:3:"洽";s:2:"";s:3:"派";s:2:"";s:3:"洶";s:2:"";s:3:"洛";s:2:"";s:3:"泵";s:2:"";s:3:"洹";s:2:"";s:3:"洧";s:2:"";s:3:"洸";s:2:"";s:3:"洩";s:2:"";s:3:"洮";s:2:"";s:3:"洵";s:2:"";s:3:"洎";s:2:"";s:3:"洫";s:2:"";s:3:"炫";s:2:"";s:3:"為";s:2:"";s:3:"炳";s:2:"";s:3:"炬";s:2:"";s:3:"炯";s:2:"";s:3:"炭";s:2:"";s:3:"炸";s:2:"";s:3:"炮";s:2:"";s:3:"炤";s:2:"";s:3:"爰";s:2:"";s:3:"牲";s:2:"";s:3:"牯";s:2:"";s:3:"牴";s:2:"";s:3:"狩";s:2:"";s:3:"狠";s:2:"";s:3:"狡";s:2:"";s:3:"玷";s:2:"";s:3:"珊";s:2:"";s:3:"玻";s:2:"";s:3:"玲";s:2:"";s:3:"珍";s:2:"";s:3:"珀";s:2:"";s:3:"玳";s:2:"";s:3:"甚";s:2:"";s:3:"甭";s:2:"";s:3:"畏";s:2:"";s:3:"界";s:2:"";s:3:"畎";s:2:"";s:3:"畋";s:2:"";s:3:"疫";s:2:"";s:3:"疤";s:2:"";s:3:"疥";s:2:"";s:3:"疢";s:2:"";s:3:"疣";s:2:"";s:3:"癸";s:2:"";s:3:"皆";s:2:"";s:3:"皇";s:2:"";s:3:"皈";s:2:"";s:3:"盈";s:2:"";s:3:"盆";s:2:"";s:3:"盃";s:2:"";s:3:"盅";s:2:"";s:3:"省";s:2:"";s:3:"盹";s:2:"";s:3:"相";s:2:"";s:3:"眉";s:2:"";s:3:"看";s:2:"";s:3:"盾";s:2:"";s:3:"盼";s:2:"";s:3:"眇";s:2:"";s:3:"矜";s:2:"";s:3:"砂";s:2:"";s:3:"研";s:2:"";s:3:"砌";s:2:"";s:3:"砍";s:2:"";s:3:"祆";s:2:"";s:3:"祉";s:2:"";s:3:"祈";s:2:"";s:3:"祇";s:2:"";s:3:"禹";s:2:"";s:3:"禺";s:2:"";s:3:"科";s:2:"";s:3:"秒";s:2:"";s:3:"秋";s:2:"";s:3:"穿";s:2:"";s:3:"突";s:2:"";s:3:"竿";s:2:"";s:3:"竽";s:2:"";s:3:"籽";s:2:"";s:3:"紂";s:2:"";s:3:"紅";s:2:"";s:3:"紀";s:2:"";s:3:"紉";s:2:"";s:3:"紇";s:2:"";s:3:"約";s:2:"";s:3:"紆";s:2:"";s:3:"缸";s:2:"";s:3:"美";s:2:"";s:3:"羿";s:2:"";s:3:"耄";s:2:"@";s:3:"耐";s:2:"A";s:3:"耍";s:2:"B";s:3:"耑";s:2:"C";s:3:"耶";s:2:"D";s:3:"胖";s:2:"E";s:3:"胥";s:2:"F";s:3:"胚";s:2:"G";s:3:"胃";s:2:"H";s:3:"胄";s:2:"I";s:3:"背";s:2:"J";s:3:"胡";s:2:"K";s:3:"胛";s:2:"L";s:3:"胎";s:2:"M";s:3:"胞";s:2:"N";s:3:"胤";s:2:"O";s:3:"胝";s:2:"P";s:3:"致";s:2:"Q";s:3:"舢";s:2:"R";s:3:"苧";s:2:"S";s:3:"范";s:2:"T";s:3:"茅";s:2:"U";s:3:"苣";s:2:"V";s:3:"苛";s:2:"W";s:3:"苦";s:2:"X";s:3:"茄";s:2:"Y";s:3:"若";s:2:"Z";s:3:"茂";s:2:"[";s:3:"茉";s:2:"\";s:3:"苒";s:2:"]";s:3:"苗";s:2:"^";s:3:"英";s:2:"_";s:3:"茁";s:2:"`";s:3:"苜";s:2:"a";s:3:"苔";s:2:"b";s:3:"苑";s:2:"c";s:3:"苞";s:2:"d";s:3:"苓";s:2:"e";s:3:"苟";s:2:"f";s:3:"苯";s:2:"g";s:3:"茆";s:2:"h";s:3:"虐";s:2:"i";s:3:"虹";s:2:"j";s:3:"虻";s:2:"k";s:3:"虺";s:2:"l";s:3:"衍";s:2:"m";s:3:"衫";s:2:"n";s:3:"要";s:2:"o";s:3:"觔";s:2:"p";s:3:"計";s:2:"q";s:3:"訂";s:2:"r";s:3:"訃";s:2:"s";s:3:"貞";s:2:"t";s:3:"負";s:2:"u";s:3:"赴";s:2:"v";s:3:"赳";s:2:"w";s:3:"趴";s:2:"x";s:3:"軍";s:2:"y";s:3:"軌";s:2:"z";s:3:"述";s:2:"{";s:3:"迦";s:2:"|";s:3:"迢";s:2:"}";s:3:"迪";s:2:"~";s:3:"迥";s:2:"";s:3:"迭";s:2:"";s:3:"迫";s:2:"";s:3:"迤";s:2:"";s:3:"迨";s:2:"";s:3:"郊";s:2:"";s:3:"郎";s:2:"";s:3:"郁";s:2:"";s:3:"郃";s:2:"";s:3:"酋";s:2:"";s:3:"酊";s:2:"";s:3:"重";s:2:"";s:3:"閂";s:2:"";s:3:"限";s:2:"";s:3:"陋";s:2:"";s:3:"陌";s:2:"";s:3:"降";s:2:"";s:3:"面";s:2:"";s:3:"革";s:2:"";s:3:"韋";s:2:"";s:3:"韭";s:2:"";s:3:"音";s:2:"";s:3:"頁";s:2:"";s:3:"風";s:2:"";s:3:"飛";s:2:"";s:3:"食";s:2:"";s:3:"首";s:2:"";s:3:"香";s:2:"";s:3:"乘";s:2:"";s:3:"亳";s:2:"";s:3:"倌";s:2:"";s:3:"倍";s:2:"";s:3:"倣";s:2:"";s:3:"俯";s:2:"";s:3:"倦";s:2:"";s:3:"倥";s:2:"";s:3:"俸";s:2:"";s:3:"倩";s:2:"";s:3:"倖";s:2:"";s:3:"倆";s:2:"";s:3:"值";s:2:"";s:3:"借";s:2:"";s:3:"倚";s:2:"";s:3:"倒";s:2:"";s:3:"們";s:2:"";s:3:"俺";s:2:"";s:3:"倀";s:2:"";s:3:"倔";s:2:"";s:3:"倨";s:2:"";s:3:"俱";s:2:"";s:3:"倡";s:2:"";s:3:"個";s:2:"";s:3:"候";s:2:"";s:3:"倘";s:2:"";s:3:"俳";s:2:"";s:3:"修";s:2:"";s:3:"倭";s:2:"";s:3:"倪";s:2:"";s:3:"俾";s:2:"";s:3:"倫";s:2:"";s:3:"倉";s:2:"";s:3:"兼";s:2:"";s:3:"冤";s:2:"";s:3:"冥";s:2:"";s:3:"冢";s:2:"";s:3:"凍";s:2:"";s:3:"凌";s:2:"";s:3:"准";s:2:"";s:3:"凋";s:2:"";s:3:"剖";s:2:"";s:3:"剜";s:2:"";s:3:"剔";s:2:"";s:3:"剛";s:2:"";s:3:"剝";s:2:"";s:3:"匪";s:2:"";s:3:"卿";s:2:"";s:3:"原";s:2:"";s:3:"厝";s:2:"";s:3:"叟";s:2:"";s:3:"哨";s:2:"";s:3:"唐";s:2:"";s:3:"唁";s:2:"";s:3:"唷";s:2:"";s:3:"哼";s:2:"";s:3:"哥";s:2:"";s:3:"哲";s:2:"";s:3:"唆";s:2:"";s:3:"哺";s:2:"";s:3:"唔";s:2:"";s:3:"哩";s:2:"";s:3:"哭";s:2:"";s:3:"員";s:2:"";s:3:"唉";s:2:"";s:3:"哮";s:2:"";s:3:"哪";s:2:"@";s:3:"哦";s:2:"A";s:3:"唧";s:2:"B";s:3:"唇";s:2:"C";s:3:"哽";s:2:"D";s:3:"唏";s:2:"E";s:3:"圃";s:2:"F";s:3:"圄";s:2:"G";s:3:"埂";s:2:"H";s:3:"埔";s:2:"I";s:3:"埋";s:2:"J";s:3:"埃";s:2:"K";s:3:"堉";s:2:"L";s:3:"夏";s:2:"M";s:3:"套";s:2:"N";s:3:"奘";s:2:"O";s:3:"奚";s:2:"P";s:3:"娑";s:2:"Q";s:3:"娘";s:2:"R";s:3:"娜";s:2:"S";s:3:"娟";s:2:"T";s:3:"娛";s:2:"U";s:3:"娓";s:2:"V";s:3:"姬";s:2:"W";s:3:"娠";s:2:"X";s:3:"娣";s:2:"Y";s:3:"娩";s:2:"Z";s:3:"娥";s:2:"[";s:3:"娌";s:2:"\";s:3:"娉";s:2:"]";s:3:"孫";s:2:"^";s:3:"屘";s:2:"_";s:3:"宰";s:2:"`";s:3:"害";s:2:"a";s:3:"家";s:2:"b";s:3:"宴";s:2:"c";s:3:"宮";s:2:"d";s:3:"宵";s:2:"e";s:3:"容";s:2:"f";s:3:"宸";s:2:"g";s:3:"射";s:2:"h";s:3:"屑";s:2:"i";s:3:"展";s:2:"j";s:3:"屐";s:2:"k";s:3:"峭";s:2:"l";s:3:"峽";s:2:"m";s:3:"峻";s:2:"n";s:3:"峪";s:2:"o";s:3:"峨";s:2:"p";s:3:"峰";s:2:"q";s:3:"島";s:2:"r";s:3:"崁";s:2:"s";s:3:"峴";s:2:"t";s:3:"差";s:2:"u";s:3:"席";s:2:"v";s:3:"師";s:2:"w";s:3:"庫";s:2:"x";s:3:"庭";s:2:"y";s:3:"座";s:2:"z";s:3:"弱";s:2:"{";s:3:"徒";s:2:"|";s:3:"徑";s:2:"}";s:3:"徐";s:2:"~";s:3:"恙";s:2:"";s:3:"恣";s:2:"";s:3:"恥";s:2:"";s:3:"恐";s:2:"";s:3:"恕";s:2:"";s:3:"恭";s:2:"";s:3:"恩";s:2:"";s:3:"息";s:2:"";s:3:"悄";s:2:"";s:3:"悟";s:2:"";s:3:"悚";s:2:"";s:3:"悍";s:2:"";s:3:"悔";s:2:"";s:3:"悌";s:2:"";s:3:"悅";s:2:"";s:3:"悖";s:2:"";s:3:"扇";s:2:"";s:3:"拳";s:2:"";s:3:"挈";s:2:"";s:3:"拿";s:2:"";s:3:"捎";s:2:"";s:3:"挾";s:2:"";s:3:"振";s:2:"";s:3:"捕";s:2:"";s:3:"捂";s:2:"";s:3:"捆";s:2:"";s:3:"捏";s:2:"";s:3:"捉";s:2:"";s:3:"挺";s:2:"";s:3:"捐";s:2:"";s:3:"挽";s:2:"";s:3:"挪";s:2:"";s:3:"挫";s:2:"";s:3:"挨";s:2:"";s:3:"捍";s:2:"";s:3:"捌";s:2:"";s:3:"效";s:2:"";s:3:"敉";s:2:"";s:3:"料";s:2:"";s:3:"旁";s:2:"";s:3:"旅";s:2:"";s:3:"時";s:2:"";s:3:"晉";s:2:"";s:3:"晏";s:2:"";s:3:"晃";s:2:"";s:3:"晒";s:2:"";s:3:"晌";s:2:"";s:3:"晅";s:2:"";s:3:"晁";s:2:"";s:3:"書";s:2:"";s:3:"朔";s:2:"";s:3:"朕";s:2:"";s:3:"朗";s:2:"";s:3:"校";s:2:"";s:3:"核";s:2:"";s:3:"案";s:2:"";s:3:"框";s:2:"";s:3:"桓";s:2:"";s:3:"根";s:2:"";s:3:"桂";s:2:"";s:3:"桔";s:2:"";s:3:"栩";s:2:"";s:3:"梳";s:2:"";s:3:"栗";s:2:"";s:3:"桌";s:2:"";s:3:"桑";s:2:"";s:3:"栽";s:2:"";s:3:"柴";s:2:"";s:3:"桐";s:2:"";s:3:"桀";s:2:"";s:3:"格";s:2:"";s:3:"桃";s:2:"";s:3:"株";s:2:"";s:3:"桅";s:2:"";s:3:"栓";s:2:"";s:3:"栘";s:2:"";s:3:"桁";s:2:"";s:3:"殊";s:2:"";s:3:"殉";s:2:"";s:3:"殷";s:2:"";s:3:"氣";s:2:"";s:3:"氧";s:2:"";s:3:"氨";s:2:"";s:3:"氦";s:2:"";s:3:"氤";s:2:"";s:3:"泰";s:2:"";s:3:"浪";s:2:"";s:3:"涕";s:2:"";s:3:"消";s:2:"";s:3:"涇";s:2:"";s:3:"浦";s:2:"";s:3:"浸";s:2:"";s:3:"海";s:2:"";s:3:"浙";s:2:"";s:3:"涓";s:2:"@";s:3:"浬";s:2:"A";s:3:"涉";s:2:"B";s:3:"浮";s:2:"C";s:3:"浚";s:2:"D";s:3:"浴";s:2:"E";s:3:"浩";s:2:"F";s:3:"涌";s:2:"G";s:3:"涊";s:2:"H";s:3:"浹";s:2:"I";s:3:"涅";s:2:"J";s:3:"浥";s:2:"K";s:3:"涔";s:2:"L";s:3:"烊";s:2:"M";s:3:"烘";s:2:"N";s:3:"烤";s:2:"O";s:3:"烙";s:2:"P";s:3:"烈";s:2:"Q";s:3:"烏";s:2:"R";s:3:"爹";s:2:"S";s:3:"特";s:2:"T";s:3:"狼";s:2:"U";s:3:"狹";s:2:"V";s:3:"狽";s:2:"W";s:3:"狸";s:2:"X";s:3:"狷";s:2:"Y";s:3:"玆";s:2:"Z";s:3:"班";s:2:"[";s:3:"琉";s:2:"\";s:3:"珮";s:2:"]";s:3:"珠";s:2:"^";s:3:"珪";s:2:"_";s:3:"珞";s:2:"`";s:3:"畔";s:2:"a";s:3:"畝";s:2:"b";s:3:"畜";s:2:"c";s:3:"畚";s:2:"d";s:3:"留";s:2:"e";s:3:"疾";s:2:"f";s:3:"病";s:2:"g";s:3:"症";s:2:"h";s:3:"疲";s:2:"i";s:3:"疳";s:2:"j";s:3:"疽";s:2:"k";s:3:"疼";s:2:"l";s:3:"疹";s:2:"m";s:3:"痂";s:2:"n";s:3:"疸";s:2:"o";s:3:"皋";s:2:"p";s:3:"皰";s:2:"q";s:3:"益";s:2:"r";s:3:"盍";s:2:"s";s:3:"盎";s:2:"t";s:3:"眩";s:2:"u";s:3:"真";s:2:"v";s:3:"眠";s:2:"w";s:3:"眨";s:2:"x";s:3:"矩";s:2:"y";s:3:"砰";s:2:"z";s:3:"砧";s:2:"{";s:3:"砸";s:2:"|";s:3:"砝";s:2:"}";s:3:"破";s:2:"~";s:3:"砷";s:2:"";s:3:"砥";s:2:"";s:3:"砭";s:2:"";s:3:"砠";s:2:"";s:3:"砟";s:2:"";s:3:"砲";s:2:"";s:3:"祕";s:2:"";s:3:"祐";s:2:"";s:3:"祠";s:2:"";s:3:"祟";s:2:"";s:3:"祖";s:2:"";s:3:"神";s:2:"";s:3:"祝";s:2:"";s:3:"祗";s:2:"";s:3:"祚";s:2:"";s:3:"秤";s:2:"";s:3:"秣";s:2:"";s:3:"秧";s:2:"";s:3:"租";s:2:"";s:3:"秦";s:2:"";s:3:"秩";s:2:"";s:3:"秘";s:2:"";s:3:"窄";s:2:"";s:3:"窈";s:2:"";s:3:"站";s:2:"";s:3:"笆";s:2:"";s:3:"笑";s:2:"";s:3:"粉";s:2:"";s:3:"紡";s:2:"";s:3:"紗";s:2:"";s:3:"紋";s:2:"";s:3:"紊";s:2:"";s:3:"素";s:2:"";s:3:"索";s:2:"";s:3:"純";s:2:"";s:3:"紐";s:2:"";s:3:"紕";s:2:"";s:3:"級";s:2:"";s:3:"紜";s:2:"";s:3:"納";s:2:"";s:3:"紙";s:2:"";s:3:"紛";s:2:"";s:3:"缺";s:2:"";s:3:"罟";s:2:"";s:3:"羔";s:2:"";s:3:"翅";s:2:"";s:3:"翁";s:2:"";s:3:"耆";s:2:"";s:3:"耘";s:2:"";s:3:"耕";s:2:"";s:3:"耙";s:2:"";s:3:"耗";s:2:"";s:3:"耽";s:2:"";s:3:"耿";s:2:"";s:3:"胱";s:2:"";s:3:"脂";s:2:"";s:3:"胰";s:2:"";s:3:"脅";s:2:"";s:3:"胭";s:2:"";s:3:"胴";s:2:"";s:3:"脆";s:2:"";s:3:"胸";s:2:"";s:3:"胳";s:2:"";s:3:"脈";s:2:"";s:3:"能";s:2:"";s:3:"脊";s:2:"";s:3:"胼";s:2:"";s:3:"胯";s:2:"";s:3:"臭";s:2:"";s:3:"臬";s:2:"";s:3:"舀";s:2:"";s:3:"舐";s:2:"";s:3:"航";s:2:"";s:3:"舫";s:2:"";s:3:"舨";s:2:"";s:3:"般";s:2:"";s:3:"芻";s:2:"";s:3:"茫";s:2:"";s:3:"荒";s:2:"";s:3:"荔";s:2:"";s:3:"荊";s:2:"";s:3:"茸";s:2:"";s:3:"荐";s:2:"";s:3:"草";s:2:"";s:3:"茵";s:2:"";s:3:"茴";s:2:"";s:3:"荏";s:2:"";s:3:"茲";s:2:"";s:3:"茹";s:2:"";s:3:"茶";s:2:"";s:3:"茗";s:2:"";s:3:"荀";s:2:"";s:3:"茱";s:2:"";s:3:"茨";s:2:"";s:3:"荃";s:2:"@";s:3:"虔";s:2:"A";s:3:"蚊";s:2:"B";s:3:"蚪";s:2:"C";s:3:"蚓";s:2:"D";s:3:"蚤";s:2:"E";s:3:"蚩";s:2:"F";s:3:"蚌";s:2:"G";s:3:"蚣";s:2:"H";s:3:"蚜";s:2:"I";s:3:"衰";s:2:"J";s:3:"衷";s:2:"K";s:3:"袁";s:2:"L";s:3:"袂";s:2:"M";s:3:"衽";s:2:"N";s:3:"衹";s:2:"O";s:3:"記";s:2:"P";s:3:"訐";s:2:"Q";s:3:"討";s:2:"R";s:3:"訌";s:2:"S";s:3:"訕";s:2:"T";s:3:"訊";s:2:"U";s:3:"託";s:2:"V";s:3:"訓";s:2:"W";s:3:"訖";s:2:"X";s:3:"訏";s:2:"Y";s:3:"訑";s:2:"Z";s:3:"豈";s:2:"[";s:3:"豺";s:2:"\";s:3:"豹";s:2:"]";s:3:"財";s:2:"^";s:3:"貢";s:2:"_";s:3:"起";s:2:"`";s:3:"躬";s:2:"a";s:3:"軒";s:2:"b";s:3:"軔";s:2:"c";s:3:"軏";s:2:"d";s:3:"辱";s:2:"e";s:3:"送";s:2:"f";s:3:"逆";s:2:"g";s:3:"迷";s:2:"h";s:3:"退";s:2:"i";s:3:"迺";s:2:"j";s:3:"迴";s:2:"k";s:3:"逃";s:2:"l";s:3:"追";s:2:"m";s:3:"逅";s:2:"n";s:3:"迸";s:2:"o";s:3:"邕";s:2:"p";s:3:"郡";s:2:"q";s:3:"郝";s:2:"r";s:3:"郢";s:2:"s";s:3:"酒";s:2:"t";s:3:"配";s:2:"u";s:3:"酌";s:2:"v";s:3:"釘";s:2:"w";s:3:"針";s:2:"x";s:3:"釗";s:2:"y";s:3:"釜";s:2:"z";s:3:"釙";s:2:"{";s:3:"閃";s:2:"|";s:3:"院";s:2:"}";s:3:"陣";s:2:"~";s:3:"陡";s:2:"";s:3:"陛";s:2:"";s:3:"陝";s:2:"";s:3:"除";s:2:"";s:3:"陘";s:2:"";s:3:"陞";s:2:"";s:3:"隻";s:2:"";s:3:"飢";s:2:"";s:3:"馬";s:2:"";s:3:"骨";s:2:"";s:3:"高";s:2:"";s:3:"鬥";s:2:"";s:3:"鬲";s:2:"";s:3:"鬼";s:2:"";s:3:"乾";s:2:"";s:3:"偺";s:2:"";s:3:"偽";s:2:"";s:3:"停";s:2:"";s:3:"假";s:2:"";s:3:"偃";s:2:"";s:3:"偌";s:2:"";s:3:"做";s:2:"";s:3:"偉";s:2:"";s:3:"健";s:2:"";s:3:"偶";s:2:"";s:3:"偎";s:2:"";s:3:"偕";s:2:"";s:3:"偵";s:2:"";s:3:"側";s:2:"";s:3:"偷";s:2:"";s:3:"偏";s:2:"";s:3:"倏";s:2:"";s:3:"偯";s:2:"";s:3:"偭";s:2:"";s:3:"兜";s:2:"";s:3:"冕";s:2:"";s:3:"凰";s:2:"";s:3:"剪";s:2:"";s:3:"副";s:2:"";s:3:"勒";s:2:"";s:3:"務";s:2:"";s:3:"勘";s:2:"";s:3:"動";s:2:"";s:3:"匐";s:2:"";s:3:"匏";s:2:"";s:3:"匙";s:2:"";s:3:"匿";s:2:"";s:3:"區";s:2:"";s:3:"匾";s:2:"";s:3:"參";s:2:"";s:3:"曼";s:2:"";s:3:"商";s:2:"";s:3:"啪";s:2:"";s:3:"啦";s:2:"";s:3:"啄";s:2:"";s:3:"啞";s:2:"";s:3:"啡";s:2:"";s:3:"啃";s:2:"";s:3:"啊";s:2:"";s:3:"唱";s:2:"";s:3:"啖";s:2:"";s:3:"問";s:2:"";s:3:"啕";s:2:"";s:3:"唯";s:2:"";s:3:"啤";s:2:"";s:3:"唸";s:2:"";s:3:"售";s:2:"";s:3:"啜";s:2:"";s:3:"唬";s:2:"";s:3:"啣";s:2:"";s:3:"唳";s:2:"";s:3:"啁";s:2:"";s:3:"啗";s:2:"";s:3:"圈";s:2:"";s:3:"國";s:2:"";s:3:"圉";s:2:"";s:3:"域";s:2:"";s:3:"堅";s:2:"";s:3:"堊";s:2:"";s:3:"堆";s:2:"";s:3:"埠";s:2:"";s:3:"埤";s:2:"";s:3:"基";s:2:"";s:3:"堂";s:2:"";s:3:"堵";s:2:"";s:3:"執";s:2:"";s:3:"培";s:2:"";s:3:"夠";s:2:"";s:3:"奢";s:2:"";s:3:"娶";s:2:"";s:3:"婁";s:2:"";s:3:"婉";s:2:"";s:3:"婦";s:2:"";s:3:"婪";s:2:"";s:3:"婀";s:2:"@";s:3:"娼";s:2:"A";s:3:"婢";s:2:"B";s:3:"婚";s:2:"C";s:3:"婆";s:2:"D";s:3:"婊";s:2:"E";s:3:"孰";s:2:"F";s:3:"寇";s:2:"G";s:3:"寅";s:2:"H";s:3:"寄";s:2:"I";s:3:"寂";s:2:"J";s:3:"宿";s:2:"K";s:3:"密";s:2:"L";s:3:"尉";s:2:"M";s:3:"專";s:2:"N";s:3:"將";s:2:"O";s:3:"屠";s:2:"P";s:3:"屜";s:2:"Q";s:3:"屝";s:2:"R";s:3:"崇";s:2:"S";s:3:"崆";s:2:"T";s:3:"崎";s:2:"U";s:3:"崛";s:2:"V";s:3:"崖";s:2:"W";s:3:"崢";s:2:"X";s:3:"崑";s:2:"Y";s:3:"崩";s:2:"Z";s:3:"崔";s:2:"[";s:3:"崙";s:2:"\";s:3:"崤";s:2:"]";s:3:"崧";s:2:"^";s:3:"崗";s:2:"_";s:3:"巢";s:2:"`";s:3:"常";s:2:"a";s:3:"帶";s:2:"b";s:3:"帳";s:2:"c";s:3:"帷";s:2:"d";s:3:"康";s:2:"e";s:3:"庸";s:2:"f";s:3:"庶";s:2:"g";s:3:"庵";s:2:"h";s:3:"庾";s:2:"i";s:3:"張";s:2:"j";s:3:"強";s:2:"k";s:3:"彗";s:2:"l";s:3:"彬";s:2:"m";s:3:"彩";s:2:"n";s:3:"彫";s:2:"o";s:3:"得";s:2:"p";s:3:"徙";s:2:"q";s:3:"從";s:2:"r";s:3:"徘";s:2:"s";s:3:"御";s:2:"t";s:3:"徠";s:2:"u";s:3:"徜";s:2:"v";s:3:"恿";s:2:"w";s:3:"患";s:2:"x";s:3:"悉";s:2:"y";s:3:"悠";s:2:"z";s:3:"您";s:2:"{";s:3:"惋";s:2:"|";s:3:"悴";s:2:"}";s:3:"惦";s:2:"~";s:3:"悽";s:2:"";s:3:"情";s:2:"";s:3:"悻";s:2:"";s:3:"悵";s:2:"";s:3:"惜";s:2:"";s:3:"悼";s:2:"";s:3:"惘";s:2:"";s:3:"惕";s:2:"";s:3:"惆";s:2:"";s:3:"惟";s:2:"";s:3:"悸";s:2:"";s:3:"惚";s:2:"";s:3:"惇";s:2:"";s:3:"戚";s:2:"";s:3:"戛";s:2:"";s:3:"扈";s:2:"";s:3:"掠";s:2:"";s:3:"控";s:2:"";s:3:"捲";s:2:"";s:3:"掖";s:2:"";s:3:"探";s:2:"";s:3:"接";s:2:"";s:3:"捷";s:2:"";s:3:"捧";s:2:"";s:3:"掘";s:2:"";s:3:"措";s:2:"";s:3:"捱";s:2:"";s:3:"掩";s:2:"";s:3:"掉";s:2:"";s:3:"掃";s:2:"";s:3:"掛";s:2:"";s:3:"捫";s:2:"";s:3:"推";s:2:"";s:3:"掄";s:2:"";s:3:"授";s:2:"";s:3:"掙";s:2:"";s:3:"採";s:2:"";s:3:"掬";s:2:"";s:3:"排";s:2:"";s:3:"掏";s:2:"";s:3:"掀";s:2:"";s:3:"捻";s:2:"";s:3:"捩";s:2:"";s:3:"捨";s:2:"";s:3:"捺";s:2:"";s:3:"敝";s:2:"";s:3:"敖";s:2:"";s:3:"救";s:2:"";s:3:"教";s:2:"";s:3:"敗";s:2:"";s:3:"啟";s:2:"";s:3:"敏";s:2:"";s:3:"敘";s:2:"";s:3:"敕";s:2:"";s:3:"敔";s:2:"";s:3:"斜";s:2:"";s:3:"斛";s:2:"";s:3:"斬";s:2:"";s:3:"族";s:2:"";s:3:"旋";s:2:"";s:3:"旌";s:2:"";s:3:"旎";s:2:"";s:3:"晝";s:2:"";s:3:"晚";s:2:"";s:3:"晤";s:2:"";s:3:"晨";s:2:"";s:3:"晦";s:2:"";s:3:"晞";s:2:"";s:3:"曹";s:2:"";s:3:"勗";s:2:"";s:3:"望";s:2:"";s:3:"梁";s:2:"";s:3:"梯";s:2:"";s:3:"梢";s:2:"";s:3:"梓";s:2:"";s:3:"梵";s:2:"";s:3:"桿";s:2:"";s:3:"桶";s:2:"";s:3:"梱";s:2:"";s:3:"梧";s:2:"";s:3:"梗";s:2:"";s:3:"械";s:2:"";s:3:"梃";s:2:"";s:3:"棄";s:2:"";s:3:"梭";s:2:"";s:3:"梆";s:2:"";s:3:"梅";s:2:"";s:3:"梔";s:2:"";s:3:"條";s:2:"";s:3:"梨";s:2:"";s:3:"梟";s:2:"";s:3:"梡";s:2:"";s:3:"梂";s:2:"";s:3:"欲";s:2:"";s:3:"殺";s:2:"@";s:3:"毫";s:2:"A";s:3:"毬";s:2:"B";s:3:"氫";s:2:"C";s:3:"涎";s:2:"D";s:3:"涼";s:2:"E";s:3:"淳";s:2:"F";s:3:"淙";s:2:"G";s:3:"液";s:2:"H";s:3:"淡";s:2:"I";s:3:"淌";s:2:"J";s:3:"淤";s:2:"K";s:3:"添";s:2:"L";s:3:"淺";s:2:"M";s:3:"清";s:2:"N";s:3:"淇";s:2:"O";s:3:"淋";s:2:"P";s:3:"涯";s:2:"Q";s:3:"淑";s:2:"R";s:3:"涮";s:2:"S";s:3:"淞";s:2:"T";s:3:"淹";s:2:"U";s:3:"涸";s:2:"V";s:3:"混";s:2:"W";s:3:"淵";s:2:"X";s:3:"淅";s:2:"Y";s:3:"淒";s:2:"Z";s:3:"渚";s:2:"[";s:3:"涵";s:2:"\";s:3:"淚";s:2:"]";s:3:"淫";s:2:"^";s:3:"淘";s:2:"_";s:3:"淪";s:2:"`";s:3:"深";s:2:"a";s:3:"淮";s:2:"b";s:3:"淨";s:2:"c";s:3:"淆";s:2:"d";s:3:"淄";s:2:"e";s:3:"涪";s:2:"f";s:3:"淬";s:2:"g";s:3:"涿";s:2:"h";s:3:"淦";s:2:"i";s:3:"烹";s:2:"j";s:3:"焉";s:2:"k";s:3:"焊";s:2:"l";s:3:"烽";s:2:"m";s:3:"烯";s:2:"n";s:3:"爽";s:2:"o";s:3:"牽";s:2:"p";s:3:"犁";s:2:"q";s:3:"猜";s:2:"r";s:3:"猛";s:2:"s";s:3:"猖";s:2:"t";s:3:"猓";s:2:"u";s:3:"猙";s:2:"v";s:3:"率";s:2:"w";s:3:"琅";s:2:"x";s:3:"琊";s:2:"y";s:3:"球";s:2:"z";s:3:"理";s:2:"{";s:3:"現";s:2:"|";s:3:"琍";s:2:"}";s:3:"瓠";s:2:"~";s:3:"瓶";s:2:"";s:3:"瓷";s:2:"";s:3:"甜";s:2:"";s:3:"產";s:2:"";s:3:"略";s:2:"";s:3:"畦";s:2:"";s:3:"畢";s:2:"";s:3:"異";s:2:"";s:3:"疏";s:2:"";s:3:"痔";s:2:"";s:3:"痕";s:2:"";s:3:"疵";s:2:"";s:3:"痊";s:2:"";s:3:"痍";s:2:"";s:3:"皎";s:2:"";s:3:"盔";s:2:"";s:3:"盒";s:2:"";s:3:"盛";s:2:"";s:3:"眷";s:2:"";s:3:"眾";s:2:"";s:3:"眼";s:2:"";s:3:"眶";s:2:"";s:3:"眸";s:2:"";s:3:"眺";s:2:"";s:3:"硫";s:2:"";s:3:"硃";s:2:"";s:3:"硎";s:2:"";s:3:"祥";s:2:"";s:3:"票";s:2:"";s:3:"祭";s:2:"";s:3:"移";s:2:"";s:3:"窒";s:2:"";s:3:"窕";s:2:"";s:3:"笠";s:2:"";s:3:"笨";s:2:"";s:3:"笛";s:2:"";s:3:"第";s:2:"";s:3:"符";s:2:"";s:3:"笙";s:2:"";s:3:"笞";s:2:"";s:3:"笮";s:2:"";s:3:"粒";s:2:"";s:3:"粗";s:2:"";s:3:"粕";s:2:"";s:3:"絆";s:2:"";s:3:"絃";s:2:"";s:3:"統";s:2:"";s:3:"紮";s:2:"";s:3:"紹";s:2:"";s:3:"紼";s:2:"";s:3:"絀";s:2:"";s:3:"細";s:2:"";s:3:"紳";s:2:"";s:3:"組";s:2:"";s:3:"累";s:2:"";s:3:"終";s:2:"";s:3:"紲";s:2:"";s:3:"紱";s:2:"";s:3:"缽";s:2:"";s:3:"羞";s:2:"";s:3:"羚";s:2:"";s:3:"翌";s:2:"";s:3:"翎";s:2:"";s:3:"習";s:2:"";s:3:"耜";s:2:"";s:3:"聊";s:2:"";s:3:"聆";s:2:"";s:3:"脯";s:2:"";s:3:"脖";s:2:"";s:3:"脣";s:2:"";s:3:"脫";s:2:"";s:3:"脩";s:2:"";s:3:"脰";s:2:"";s:3:"脤";s:2:"";s:3:"舂";s:2:"";s:3:"舵";s:2:"";s:3:"舷";s:2:"";s:3:"舶";s:2:"";s:3:"船";s:2:"";s:3:"莎";s:2:"";s:3:"莞";s:2:"";s:3:"莘";s:2:"";s:3:"荸";s:2:"";s:3:"莢";s:2:"";s:3:"莖";s:2:"";s:3:"莽";s:2:"";s:3:"莫";s:2:"";s:3:"莒";s:2:"";s:3:"莊";s:2:"";s:3:"莓";s:2:"";s:3:"莉";s:2:"";s:3:"莠";s:2:"";s:3:"荷";s:2:"";s:3:"荻";s:2:"";s:3:"荼";s:2:"@";s:3:"莆";s:2:"A";s:3:"莧";s:2:"B";s:3:"處";s:2:"C";s:3:"彪";s:2:"D";s:3:"蛇";s:2:"E";s:3:"蛀";s:2:"F";s:3:"蚶";s:2:"G";s:3:"蛄";s:2:"H";s:3:"蚵";s:2:"I";s:3:"蛆";s:2:"J";s:3:"蛋";s:2:"K";s:3:"蚱";s:2:"L";s:3:"蚯";s:2:"M";s:3:"蛉";s:2:"N";s:3:"術";s:2:"O";s:3:"袞";s:2:"P";s:3:"袈";s:2:"Q";s:3:"被";s:2:"R";s:3:"袒";s:2:"S";s:3:"袖";s:2:"T";s:3:"袍";s:2:"U";s:3:"袋";s:2:"V";s:3:"覓";s:2:"W";s:3:"規";s:2:"X";s:3:"訪";s:2:"Y";s:3:"訝";s:2:"Z";s:3:"訣";s:2:"[";s:3:"訥";s:2:"\";s:3:"許";s:2:"]";s:3:"設";s:2:"^";s:3:"訟";s:2:"_";s:3:"訛";s:2:"`";s:3:"訢";s:2:"a";s:3:"豉";s:2:"b";s:3:"豚";s:2:"c";s:3:"販";s:2:"d";s:3:"責";s:2:"e";s:3:"貫";s:2:"f";s:3:"貨";s:2:"g";s:3:"貪";s:2:"h";s:3:"貧";s:2:"i";s:3:"赧";s:2:"j";s:3:"赦";s:2:"k";s:3:"趾";s:2:"l";s:3:"趺";s:2:"m";s:3:"軛";s:2:"n";s:3:"軟";s:2:"o";s:3:"這";s:2:"p";s:3:"逍";s:2:"q";s:3:"通";s:2:"r";s:3:"逗";s:2:"s";s:3:"連";s:2:"t";s:3:"速";s:2:"u";s:3:"逝";s:2:"v";s:3:"逐";s:2:"w";s:3:"逕";s:2:"x";s:3:"逞";s:2:"y";s:3:"造";s:2:"z";s:3:"透";s:2:"{";s:3:"逢";s:2:"|";s:3:"逖";s:2:"}";s:3:"逛";s:2:"~";s:3:"途";s:2:"";s:3:"部";s:2:"";s:3:"郭";s:2:"";s:3:"都";s:2:"";s:3:"酗";s:2:"";s:3:"野";s:2:"";s:3:"釵";s:2:"";s:3:"釦";s:2:"";s:3:"釣";s:2:"";s:3:"釧";s:2:"";s:3:"釭";s:2:"";s:3:"釩";s:2:"";s:3:"閉";s:2:"";s:3:"陪";s:2:"";s:3:"陵";s:2:"";s:3:"陳";s:2:"";s:3:"陸";s:2:"";s:3:"陰";s:2:"";s:3:"陴";s:2:"";s:3:"陶";s:2:"";s:3:"陷";s:2:"";s:3:"陬";s:2:"";s:3:"雀";s:2:"";s:3:"雪";s:2:"";s:3:"雩";s:2:"";s:3:"章";s:2:"";s:3:"竟";s:2:"";s:3:"頂";s:2:"";s:3:"頃";s:2:"";s:3:"魚";s:2:"";s:3:"鳥";s:2:"";s:3:"鹵";s:2:"";s:3:"鹿";s:2:"";s:3:"麥";s:2:"";s:3:"麻";s:2:"";s:3:"傢";s:2:"";s:3:"傍";s:2:"";s:3:"傅";s:2:"";s:3:"備";s:2:"";s:3:"傑";s:2:"";s:3:"傀";s:2:"";s:3:"傖";s:2:"";s:3:"傘";s:2:"";s:3:"傚";s:2:"";s:3:"最";s:2:"";s:3:"凱";s:2:"";s:3:"割";s:2:"";s:3:"剴";s:2:"";s:3:"創";s:2:"";s:3:"剩";s:2:"";s:3:"勞";s:2:"";s:3:"勝";s:2:"";s:3:"勛";s:2:"";s:3:"博";s:2:"";s:3:"厥";s:2:"";s:3:"啻";s:2:"";s:3:"喀";s:2:"";s:3:"喧";s:2:"";s:3:"啼";s:2:"";s:3:"喊";s:2:"";s:3:"喝";s:2:"";s:3:"喘";s:2:"";s:3:"喂";s:2:"";s:3:"喜";s:2:"";s:3:"喪";s:2:"";s:3:"喔";s:2:"";s:3:"喇";s:2:"";s:3:"喋";s:2:"";s:3:"喃";s:2:"";s:3:"喳";s:2:"";s:3:"單";s:2:"";s:3:"喟";s:2:"";s:3:"唾";s:2:"";s:3:"喲";s:2:"";s:3:"喚";s:2:"";s:3:"喻";s:2:"";s:3:"喬";s:2:"";s:3:"喱";s:2:"";s:3:"啾";s:2:"";s:3:"喉";s:2:"";s:3:"喫";s:2:"";s:3:"喙";s:2:"";s:3:"圍";s:2:"";s:3:"堯";s:2:"";s:3:"堪";s:2:"";s:3:"場";s:2:"";s:3:"堤";s:2:"";s:3:"堰";s:2:"";s:3:"報";s:2:"";s:3:"堡";s:2:"";s:3:"堝";s:2:"";s:3:"堠";s:2:"";s:3:"壹";s:2:"";s:3:"壺";s:2:"";s:3:"奠";s:2:"@";s:3:"婷";s:2:"A";s:3:"媚";s:2:"B";s:3:"婿";s:2:"C";s:3:"媒";s:2:"D";s:3:"媛";s:2:"E";s:3:"媧";s:2:"F";s:3:"孳";s:2:"G";s:3:"孱";s:2:"H";s:3:"寒";s:2:"I";s:3:"富";s:2:"J";s:3:"寓";s:2:"K";s:3:"寐";s:2:"L";s:3:"尊";s:2:"M";s:3:"尋";s:2:"N";s:3:"就";s:2:"O";s:3:"嵌";s:2:"P";s:3:"嵐";s:2:"Q";s:3:"崴";s:2:"R";s:3:"嵇";s:2:"S";s:3:"巽";s:2:"T";s:3:"幅";s:2:"U";s:3:"帽";s:2:"V";s:3:"幀";s:2:"W";s:3:"幃";s:2:"X";s:3:"幾";s:2:"Y";s:3:"廊";s:2:"Z";s:3:"廁";s:2:"[";s:3:"廂";s:2:"\";s:3:"廄";s:2:"]";s:3:"弼";s:2:"^";s:3:"彭";s:2:"_";s:3:"復";s:2:"`";s:3:"循";s:2:"a";s:3:"徨";s:2:"b";s:3:"惑";s:2:"c";s:3:"惡";s:2:"d";s:3:"悲";s:2:"e";s:3:"悶";s:2:"f";s:3:"惠";s:2:"g";s:3:"愜";s:2:"h";s:3:"愣";s:2:"i";s:3:"惺";s:2:"j";s:3:"愕";s:2:"k";s:3:"惰";s:2:"l";s:3:"惻";s:2:"m";s:3:"惴";s:2:"n";s:3:"慨";s:2:"o";s:3:"惱";s:2:"p";s:3:"愎";s:2:"q";s:3:"惶";s:2:"r";s:3:"愉";s:2:"s";s:3:"愀";s:2:"t";s:3:"愒";s:2:"u";s:3:"戟";s:2:"v";s:3:"扉";s:2:"w";s:3:"掣";s:2:"x";s:3:"掌";s:2:"y";s:3:"描";s:2:"z";s:3:"揀";s:2:"{";s:3:"揩";s:2:"|";s:3:"揉";s:2:"}";s:3:"揆";s:2:"~";s:3:"揍";s:2:"";s:3:"插";s:2:"";s:3:"揣";s:2:"";s:3:"提";s:2:"";s:3:"握";s:2:"";s:3:"揖";s:2:"";s:3:"揭";s:2:"";s:3:"揮";s:2:"";s:3:"捶";s:2:"";s:3:"援";s:2:"";s:3:"揪";s:2:"";s:3:"換";s:2:"";s:3:"摒";s:2:"";s:3:"揚";s:2:"";s:3:"揹";s:2:"";s:3:"敞";s:2:"";s:3:"敦";s:2:"";s:3:"敢";s:2:"";s:3:"散";s:2:"";s:3:"斑";s:2:"";s:3:"斐";s:2:"";s:3:"斯";s:2:"";s:3:"普";s:2:"";s:3:"晰";s:2:"";s:3:"晴";s:2:"";s:3:"晶";s:2:"";s:3:"景";s:2:"";s:3:"暑";s:2:"";s:3:"智";s:2:"";s:3:"晾";s:2:"";s:3:"晷";s:2:"";s:3:"曾";s:2:"";s:3:"替";s:2:"";s:3:"期";s:2:"";s:3:"朝";s:2:"";s:3:"棺";s:2:"";s:3:"棕";s:2:"";s:3:"棠";s:2:"";s:3:"棘";s:2:"";s:3:"棗";s:2:"";s:3:"椅";s:2:"";s:3:"棟";s:2:"";s:3:"棵";s:2:"";s:3:"森";s:2:"";s:3:"棧";s:2:"";s:3:"棹";s:2:"";s:3:"棒";s:2:"";s:3:"棲";s:2:"";s:3:"棣";s:2:"";s:3:"棋";s:2:"";s:3:"棍";s:2:"";s:3:"植";s:2:"";s:3:"椒";s:2:"";s:3:"椎";s:2:"";s:3:"棉";s:2:"";s:3:"棚";s:2:"";s:3:"楮";s:2:"";s:3:"棻";s:2:"";s:3:"款";s:2:"";s:3:"欺";s:2:"";s:3:"欽";s:2:"";s:3:"殘";s:2:"";s:3:"殖";s:2:"";s:3:"殼";s:2:"";s:3:"毯";s:2:"";s:3:"氮";s:2:"";s:3:"氯";s:2:"";s:3:"氬";s:2:"";s:3:"港";s:2:"";s:3:"游";s:2:"";s:3:"湔";s:2:"";s:3:"渡";s:2:"";s:3:"渲";s:2:"";s:3:"湧";s:2:"";s:3:"湊";s:2:"";s:3:"渠";s:2:"";s:3:"渥";s:2:"";s:3:"渣";s:2:"";s:3:"減";s:2:"";s:3:"湛";s:2:"";s:3:"湘";s:2:"";s:3:"渤";s:2:"";s:3:"湖";s:2:"";s:3:"湮";s:2:"";s:3:"渭";s:2:"";s:3:"渦";s:2:"";s:3:"湯";s:2:"";s:3:"渴";s:2:"";s:3:"湍";s:2:"";s:3:"渺";s:2:"";s:3:"測";s:2:"";s:3:"湃";s:2:"";s:3:"渝";s:2:"";s:3:"渾";s:2:"";s:3:"滋";s:2:"@";s:3:"溉";s:2:"A";s:3:"渙";s:2:"B";s:3:"湎";s:2:"C";s:3:"湣";s:2:"D";s:3:"湄";s:2:"E";s:3:"湲";s:2:"F";s:3:"湩";s:2:"G";s:3:"湟";s:2:"H";s:3:"焙";s:2:"I";s:3:"焚";s:2:"J";s:3:"焦";s:2:"K";s:3:"焰";s:2:"L";s:3:"無";s:2:"M";s:3:"然";s:2:"N";s:3:"煮";s:2:"O";s:3:"焜";s:2:"P";s:3:"牌";s:2:"Q";s:3:"犄";s:2:"R";s:3:"犀";s:2:"S";s:3:"猶";s:2:"T";s:3:"猥";s:2:"U";s:3:"猴";s:2:"V";s:3:"猩";s:2:"W";s:3:"琺";s:2:"X";s:3:"琪";s:2:"Y";s:3:"琳";s:2:"Z";s:3:"琢";s:2:"[";s:3:"琥";s:2:"\";s:3:"琵";s:2:"]";s:3:"琶";s:2:"^";s:3:"琴";s:2:"_";s:3:"琯";s:2:"`";s:3:"琛";s:2:"a";s:3:"琦";s:2:"b";s:3:"琨";s:2:"c";s:3:"甥";s:2:"d";s:3:"甦";s:2:"e";s:3:"畫";s:2:"f";s:3:"番";s:2:"g";s:3:"痢";s:2:"h";s:3:"痛";s:2:"i";s:3:"痣";s:2:"j";s:3:"痙";s:2:"k";s:3:"痘";s:2:"l";s:3:"痞";s:2:"m";s:3:"痠";s:2:"n";s:3:"登";s:2:"o";s:3:"發";s:2:"p";s:3:"皖";s:2:"q";s:3:"皓";s:2:"r";s:3:"皴";s:2:"s";s:3:"盜";s:2:"t";s:3:"睏";s:2:"u";s:3:"短";s:2:"v";s:3:"硝";s:2:"w";s:3:"硬";s:2:"x";s:3:"硯";s:2:"y";s:3:"稍";s:2:"z";s:3:"稈";s:2:"{";s:3:"程";s:2:"|";s:3:"稅";s:2:"}";s:3:"稀";s:2:"~";s:3:"窘";s:2:"";s:3:"窗";s:2:"";s:3:"窖";s:2:"";s:3:"童";s:2:"";s:3:"竣";s:2:"";s:3:"等";s:2:"";s:3:"策";s:2:"";s:3:"筆";s:2:"";s:3:"筐";s:2:"";s:3:"筒";s:2:"";s:3:"答";s:2:"";s:3:"筍";s:2:"";s:3:"筋";s:2:"";s:3:"筏";s:2:"";s:3:"筑";s:2:"";s:3:"粟";s:2:"";s:3:"粥";s:2:"";s:3:"絞";s:2:"";s:3:"結";s:2:"";s:3:"絨";s:2:"";s:3:"絕";s:2:"";s:3:"紫";s:2:"";s:3:"絮";s:2:"";s:3:"絲";s:2:"";s:3:"絡";s:2:"";s:3:"給";s:2:"";s:3:"絢";s:2:"";s:3:"絰";s:2:"";s:3:"絳";s:2:"";s:3:"善";s:2:"";s:3:"翔";s:2:"";s:3:"翕";s:2:"";s:3:"耋";s:2:"";s:3:"聒";s:2:"";s:3:"肅";s:2:"";s:3:"腕";s:2:"";s:3:"腔";s:2:"";s:3:"腋";s:2:"";s:3:"腑";s:2:"";s:3:"腎";s:2:"";s:3:"脹";s:2:"";s:3:"腆";s:2:"";s:3:"脾";s:2:"";s:3:"腌";s:2:"";s:3:"腓";s:2:"";s:3:"腴";s:2:"";s:3:"舒";s:2:"";s:3:"舜";s:2:"";s:3:"菩";s:2:"";s:3:"萃";s:2:"";s:3:"菸";s:2:"";s:3:"萍";s:2:"";s:3:"菠";s:2:"";s:3:"菅";s:2:"";s:3:"萋";s:2:"";s:3:"菁";s:2:"";s:3:"華";s:2:"";s:3:"菱";s:2:"";s:3:"菴";s:2:"";s:3:"著";s:2:"";s:3:"萊";s:2:"";s:3:"菰";s:2:"";s:3:"萌";s:2:"";s:3:"菌";s:2:"";s:3:"菽";s:2:"";s:3:"菲";s:2:"";s:3:"菊";s:2:"";s:3:"萸";s:2:"";s:3:"萎";s:2:"";s:3:"萄";s:2:"";s:3:"菜";s:2:"";s:3:"萇";s:2:"";s:3:"菔";s:2:"";s:3:"菟";s:2:"";s:3:"虛";s:2:"";s:3:"蛟";s:2:"";s:3:"蛙";s:2:"";s:3:"蛭";s:2:"";s:3:"蛔";s:2:"";s:3:"蛛";s:2:"";s:3:"蛤";s:2:"";s:3:"蛐";s:2:"";s:3:"蛞";s:2:"";s:3:"街";s:2:"";s:3:"裁";s:2:"";s:3:"裂";s:2:"";s:3:"袱";s:2:"";s:3:"覃";s:2:"";s:3:"視";s:2:"";s:3:"註";s:2:"";s:3:"詠";s:2:"";s:3:"評";s:2:"";s:3:"詞";s:2:"";s:3:"証";s:2:"";s:3:"詁";s:2:"@";s:3:"詔";s:2:"A";s:3:"詛";s:2:"B";s:3:"詐";s:2:"C";s:3:"詆";s:2:"D";s:3:"訴";s:2:"E";s:3:"診";s:2:"F";s:3:"訶";s:2:"G";s:3:"詖";s:2:"H";s:3:"象";s:2:"I";s:3:"貂";s:2:"J";s:3:"貯";s:2:"K";s:3:"貼";s:2:"L";s:3:"貳";s:2:"M";s:3:"貽";s:2:"N";s:3:"賁";s:2:"O";s:3:"費";s:2:"P";s:3:"賀";s:2:"Q";s:3:"貴";s:2:"R";s:3:"買";s:2:"S";s:3:"貶";s:2:"T";s:3:"貿";s:2:"U";s:3:"貸";s:2:"V";s:3:"越";s:2:"W";s:3:"超";s:2:"X";s:3:"趁";s:2:"Y";s:3:"跎";s:2:"Z";s:3:"距";s:2:"[";s:3:"跋";s:2:"\";s:3:"跚";s:2:"]";s:3:"跑";s:2:"^";s:3:"跌";s:2:"_";s:3:"跛";s:2:"`";s:3:"跆";s:2:"a";s:3:"軻";s:2:"b";s:3:"軸";s:2:"c";s:3:"軼";s:2:"d";s:3:"辜";s:2:"e";s:3:"逮";s:2:"f";s:3:"逵";s:2:"g";s:3:"週";s:2:"h";s:3:"逸";s:2:"i";s:3:"進";s:2:"j";s:3:"逶";s:2:"k";s:3:"鄂";s:2:"l";s:3:"郵";s:2:"m";s:3:"鄉";s:2:"n";s:3:"郾";s:2:"o";s:3:"酣";s:2:"p";s:3:"酥";s:2:"q";s:3:"量";s:2:"r";s:3:"鈔";s:2:"s";s:3:"鈕";s:2:"t";s:3:"鈣";s:2:"u";s:3:"鈉";s:2:"v";s:3:"鈞";s:2:"w";s:3:"鈍";s:2:"x";s:3:"鈐";s:2:"y";s:3:"鈇";s:2:"z";s:3:"鈑";s:2:"{";s:3:"閔";s:2:"|";s:3:"閏";s:2:"}";s:3:"開";s:2:"~";s:3:"閑";s:2:"";s:3:"間";s:2:"";s:3:"閒";s:2:"";s:3:"閎";s:2:"";s:3:"隊";s:2:"";s:3:"階";s:2:"";s:3:"隋";s:2:"";s:3:"陽";s:2:"";s:3:"隅";s:2:"";s:3:"隆";s:2:"";s:3:"隍";s:2:"";s:3:"陲";s:2:"";s:3:"隄";s:2:"";s:3:"雁";s:2:"";s:3:"雅";s:2:"";s:3:"雄";s:2:"";s:3:"集";s:2:"";s:3:"雇";s:2:"";s:3:"雯";s:2:"";s:3:"雲";s:2:"";s:3:"韌";s:2:"";s:3:"項";s:2:"";s:3:"順";s:2:"";s:3:"須";s:2:"";s:3:"飧";s:2:"";s:3:"飪";s:2:"";s:3:"飯";s:2:"";s:3:"飩";s:2:"";s:3:"飲";s:2:"";s:3:"飭";s:2:"";s:3:"馮";s:2:"";s:3:"馭";s:2:"";s:3:"黃";s:2:"";s:3:"黍";s:2:"";s:3:"黑";s:2:"";s:3:"亂";s:2:"";s:3:"傭";s:2:"";s:3:"債";s:2:"";s:3:"傲";s:2:"";s:3:"傳";s:2:"";s:3:"僅";s:2:"";s:3:"傾";s:2:"";s:3:"催";s:2:"";s:3:"傷";s:2:"";s:3:"傻";s:2:"";s:3:"傯";s:2:"";s:3:"僇";s:2:"";s:3:"剿";s:2:"";s:3:"剷";s:2:"";s:3:"剽";s:2:"";s:3:"募";s:2:"";s:3:"勦";s:2:"";s:3:"勤";s:2:"";s:3:"勢";s:2:"";s:3:"勣";s:2:"";s:3:"匯";s:2:"";s:3:"嗟";s:2:"";s:3:"嗨";s:2:"";s:3:"嗓";s:2:"";s:3:"嗦";s:2:"";s:3:"嗎";s:2:"";s:3:"嗜";s:2:"";s:3:"嗇";s:2:"";s:3:"嗑";s:2:"";s:3:"嗣";s:2:"";s:3:"嗤";s:2:"";s:3:"嗯";s:2:"";s:3:"嗚";s:2:"";s:3:"嗡";s:2:"";s:3:"嗅";s:2:"";s:3:"嗆";s:2:"";s:3:"嗥";s:2:"";s:3:"嗉";s:2:"";s:3:"園";s:2:"";s:3:"圓";s:2:"";s:3:"塞";s:2:"";s:3:"塑";s:2:"";s:3:"塘";s:2:"";s:3:"塗";s:2:"";s:3:"塚";s:2:"";s:3:"塔";s:2:"";s:3:"填";s:2:"";s:3:"塌";s:2:"";s:3:"塭";s:2:"";s:3:"塊";s:2:"";s:3:"塢";s:2:"";s:3:"塒";s:2:"";s:3:"塋";s:2:"";s:3:"奧";s:2:"";s:3:"嫁";s:2:"";s:3:"嫉";s:2:"";s:3:"嫌";s:2:"";s:3:"媾";s:2:"";s:3:"媽";s:2:"";s:3:"媼";s:2:"@";s:3:"媳";s:2:"A";s:3:"嫂";s:2:"B";s:3:"媲";s:2:"C";s:3:"嵩";s:2:"D";s:3:"嵯";s:2:"E";s:3:"幌";s:2:"F";s:3:"幹";s:2:"G";s:3:"廉";s:2:"H";s:3:"廈";s:2:"I";s:3:"弒";s:2:"J";s:3:"彙";s:2:"K";s:3:"徬";s:2:"L";s:3:"微";s:2:"M";s:3:"愚";s:2:"N";s:3:"意";s:2:"O";s:3:"慈";s:2:"P";s:3:"感";s:2:"Q";s:3:"想";s:2:"R";s:3:"愛";s:2:"S";s:3:"惹";s:2:"T";s:3:"愁";s:2:"U";s:3:"愈";s:2:"V";s:3:"慎";s:2:"W";s:3:"慌";s:2:"X";s:3:"慄";s:2:"Y";s:3:"慍";s:2:"Z";s:3:"愾";s:2:"[";s:3:"愴";s:2:"\";s:3:"愧";s:2:"]";s:3:"愍";s:2:"^";s:3:"愆";s:2:"_";s:3:"愷";s:2:"`";s:3:"戡";s:2:"a";s:3:"戢";s:2:"b";s:3:"搓";s:2:"c";s:3:"搾";s:2:"d";s:3:"搞";s:2:"e";s:3:"搪";s:2:"f";s:3:"搭";s:2:"g";s:3:"搽";s:2:"h";s:3:"搬";s:2:"i";s:3:"搏";s:2:"j";s:3:"搜";s:2:"k";s:3:"搔";s:2:"l";s:3:"損";s:2:"m";s:3:"搶";s:2:"n";s:3:"搖";s:2:"o";s:3:"搗";s:2:"p";s:3:"搆";s:2:"q";s:3:"敬";s:2:"r";s:3:"斟";s:2:"s";s:3:"新";s:2:"t";s:3:"暗";s:2:"u";s:3:"暉";s:2:"v";s:3:"暇";s:2:"w";s:3:"暈";s:2:"x";s:3:"暖";s:2:"y";s:3:"暄";s:2:"z";s:3:"暘";s:2:"{";s:3:"暍";s:2:"|";s:3:"會";s:2:"}";s:3:"榔";s:2:"~";s:3:"業";s:2:"";s:3:"楚";s:2:"";s:3:"楷";s:2:"";s:3:"楠";s:2:"";s:3:"楔";s:2:"";s:3:"極";s:2:"";s:3:"椰";s:2:"";s:3:"概";s:2:"";s:3:"楊";s:2:"";s:3:"楨";s:2:"";s:3:"楫";s:2:"";s:3:"楞";s:2:"";s:3:"楓";s:2:"";s:3:"楹";s:2:"";s:3:"榆";s:2:"";s:3:"楝";s:2:"";s:3:"楣";s:2:"";s:3:"楛";s:2:"";s:3:"歇";s:2:"";s:3:"歲";s:2:"";s:3:"毀";s:2:"";s:3:"殿";s:2:"";s:3:"毓";s:2:"";s:3:"毽";s:2:"";s:3:"溢";s:2:"";s:3:"溯";s:2:"";s:3:"滓";s:2:"";s:3:"溶";s:2:"";s:3:"滂";s:2:"";s:3:"源";s:2:"";s:3:"溝";s:2:"";s:3:"滇";s:2:"";s:3:"滅";s:2:"";s:3:"溥";s:2:"";s:3:"溘";s:2:"";s:3:"溼";s:2:"";s:3:"溺";s:2:"";s:3:"溫";s:2:"";s:3:"滑";s:2:"";s:3:"準";s:2:"";s:3:"溜";s:2:"";s:3:"滄";s:2:"";s:3:"滔";s:2:"";s:3:"溪";s:2:"";s:3:"溧";s:2:"";s:3:"溴";s:2:"";s:3:"煎";s:2:"";s:3:"煙";s:2:"";s:3:"煩";s:2:"";s:3:"煤";s:2:"";s:3:"煉";s:2:"";s:3:"照";s:2:"";s:3:"煜";s:2:"";s:3:"煬";s:2:"";s:3:"煦";s:2:"";s:3:"煌";s:2:"";s:3:"煥";s:2:"";s:3:"煞";s:2:"";s:3:"煆";s:2:"";s:3:"煨";s:2:"";s:3:"煖";s:2:"";s:3:"爺";s:2:"";s:3:"牒";s:2:"";s:3:"猷";s:2:"";s:3:"獅";s:2:"";s:3:"猿";s:2:"";s:3:"猾";s:2:"";s:3:"瑯";s:2:"";s:3:"瑚";s:2:"";s:3:"瑕";s:2:"";s:3:"瑟";s:2:"";s:3:"瑞";s:2:"";s:3:"瑁";s:2:"";s:3:"琿";s:2:"";s:3:"瑙";s:2:"";s:3:"瑛";s:2:"";s:3:"瑜";s:2:"";s:3:"當";s:2:"";s:3:"畸";s:2:"";s:3:"瘀";s:2:"";s:3:"痰";s:2:"";s:3:"瘁";s:2:"";s:3:"痲";s:2:"";s:3:"痱";s:2:"";s:3:"痺";s:2:"";s:3:"痿";s:2:"";s:3:"痴";s:2:"";s:3:"痳";s:2:"";s:3:"盞";s:2:"";s:3:"盟";s:2:"";s:3:"睛";s:2:"";s:3:"睫";s:2:"";s:3:"睦";s:2:"";s:3:"睞";s:2:"";s:3:"督";s:2:"@";s:3:"睹";s:2:"A";s:3:"睪";s:2:"B";s:3:"睬";s:2:"C";s:3:"睜";s:2:"D";s:3:"睥";s:2:"E";s:3:"睨";s:2:"F";s:3:"睢";s:2:"G";s:3:"矮";s:2:"H";s:3:"碎";s:2:"I";s:3:"碰";s:2:"J";s:3:"碗";s:2:"K";s:3:"碘";s:2:"L";s:3:"碌";s:2:"M";s:3:"碉";s:2:"N";s:3:"硼";s:2:"O";s:3:"碑";s:2:"P";s:3:"碓";s:2:"Q";s:3:"硿";s:2:"R";s:3:"祺";s:2:"S";s:3:"祿";s:2:"T";s:3:"禁";s:2:"U";s:3:"萬";s:2:"V";s:3:"禽";s:2:"W";s:3:"稜";s:2:"X";s:3:"稚";s:2:"Y";s:3:"稠";s:2:"Z";s:3:"稔";s:2:"[";s:3:"稟";s:2:"\";s:3:"稞";s:2:"]";s:3:"窟";s:2:"^";s:3:"窠";s:2:"_";s:3:"筷";s:2:"`";s:3:"節";s:2:"a";s:3:"筠";s:2:"b";s:3:"筮";s:2:"c";s:3:"筧";s:2:"d";s:3:"粱";s:2:"e";s:3:"粳";s:2:"f";s:3:"粵";s:2:"g";s:3:"經";s:2:"h";s:3:"絹";s:2:"i";s:3:"綑";s:2:"j";s:3:"綁";s:2:"k";s:3:"綏";s:2:"l";s:3:"絛";s:2:"m";s:3:"置";s:2:"n";s:3:"罩";s:2:"o";s:3:"罪";s:2:"p";s:3:"署";s:2:"q";s:3:"義";s:2:"r";s:3:"羨";s:2:"s";s:3:"群";s:2:"t";s:3:"聖";s:2:"u";s:3:"聘";s:2:"v";s:3:"肆";s:2:"w";s:3:"肄";s:2:"x";s:3:"腱";s:2:"y";s:3:"腰";s:2:"z";s:3:"腸";s:2:"{";s:3:"腥";s:2:"|";s:3:"腮";s:2:"}";s:3:"腳";s:2:"~";s:3:"腫";s:2:"";s:3:"腹";s:2:"";s:3:"腺";s:2:"";s:3:"腦";s:2:"";s:3:"舅";s:2:"";s:3:"艇";s:2:"";s:3:"蒂";s:2:"";s:3:"葷";s:2:"";s:3:"落";s:2:"";s:3:"萱";s:2:"";s:3:"葵";s:2:"";s:3:"葦";s:2:"";s:3:"葫";s:2:"";s:3:"葉";s:2:"";s:3:"葬";s:2:"";s:3:"葛";s:2:"";s:3:"萼";s:2:"";s:3:"萵";s:2:"";s:3:"葡";s:2:"";s:3:"董";s:2:"";s:3:"葩";s:2:"";s:3:"葭";s:2:"";s:3:"葆";s:2:"";s:3:"虞";s:2:"";s:3:"虜";s:2:"";s:3:"號";s:2:"";s:3:"蛹";s:2:"";s:3:"蜓";s:2:"";s:3:"蜈";s:2:"";s:3:"蜇";s:2:"";s:3:"蜀";s:2:"";s:3:"蛾";s:2:"";s:3:"蛻";s:2:"";s:3:"蜂";s:2:"";s:3:"蜃";s:2:"";s:3:"蜆";s:2:"";s:3:"蜊";s:2:"";s:3:"衙";s:2:"";s:3:"裟";s:2:"";s:3:"裔";s:2:"";s:3:"裙";s:2:"";s:3:"補";s:2:"";s:3:"裘";s:2:"";s:3:"裝";s:2:"";s:3:"裡";s:2:"";s:3:"裊";s:2:"";s:3:"裕";s:2:"";s:3:"裒";s:2:"";s:3:"覜";s:2:"";s:3:"解";s:2:"";s:3:"詫";s:2:"";s:3:"該";s:2:"";s:3:"詳";s:2:"";s:3:"試";s:2:"";s:3:"詩";s:2:"";s:3:"詰";s:2:"";s:3:"誇";s:2:"";s:3:"詼";s:2:"";s:3:"詣";s:2:"";s:3:"誠";s:2:"";s:3:"話";s:2:"";s:3:"誅";s:2:"";s:3:"詭";s:2:"";s:3:"詢";s:2:"";s:3:"詮";s:2:"";s:3:"詬";s:2:"";s:3:"詹";s:2:"";s:3:"詻";s:2:"";s:3:"訾";s:2:"";s:3:"詨";s:2:"";s:3:"豢";s:2:"";s:3:"貊";s:2:"";s:3:"貉";s:2:"";s:3:"賊";s:2:"";s:3:"資";s:2:"";s:3:"賈";s:2:"";s:3:"賄";s:2:"";s:3:"貲";s:2:"";s:3:"賃";s:2:"";s:3:"賂";s:2:"";s:3:"賅";s:2:"";s:3:"跡";s:2:"";s:3:"跟";s:2:"";s:3:"跨";s:2:"";s:3:"路";s:2:"";s:3:"跳";s:2:"";s:3:"跺";s:2:"";s:3:"跪";s:2:"";s:3:"跤";s:2:"";s:3:"跦";s:2:"";s:3:"躲";s:2:"";s:3:"較";s:2:"";s:3:"載";s:2:"";s:3:"軾";s:2:"";s:3:"輊";s:2:"@";s:3:"辟";s:2:"A";s:3:"農";s:2:"B";s:3:"運";s:2:"C";s:3:"遊";s:2:"D";s:3:"道";s:2:"E";s:3:"遂";s:2:"F";s:3:"達";s:2:"G";s:3:"逼";s:2:"H";s:3:"違";s:2:"I";s:3:"遐";s:2:"J";s:3:"遇";s:2:"K";s:3:"遏";s:2:"L";s:3:"過";s:2:"M";s:3:"遍";s:2:"N";s:3:"遑";s:2:"O";s:3:"逾";s:2:"P";s:3:"遁";s:2:"Q";s:3:"鄒";s:2:"R";s:3:"鄗";s:2:"S";s:3:"酬";s:2:"T";s:3:"酪";s:2:"U";s:3:"酩";s:2:"V";s:3:"釉";s:2:"W";s:3:"鈷";s:2:"X";s:3:"鉗";s:2:"Y";s:3:"鈸";s:2:"Z";s:3:"鈽";s:2:"[";s:3:"鉀";s:2:"\";s:3:"鈾";s:2:"]";s:3:"鉛";s:2:"^";s:3:"鉋";s:2:"_";s:3:"鉤";s:2:"`";s:3:"鉑";s:2:"a";s:3:"鈴";s:2:"b";s:3:"鉉";s:2:"c";s:3:"鉍";s:2:"d";s:3:"鉅";s:2:"e";s:3:"鈹";s:2:"f";s:3:"鈿";s:2:"g";s:3:"鉚";s:2:"h";s:3:"閘";s:2:"i";s:3:"隘";s:2:"j";s:3:"隔";s:2:"k";s:3:"隕";s:2:"l";s:3:"雍";s:2:"m";s:3:"雋";s:2:"n";s:3:"雉";s:2:"o";s:3:"雊";s:2:"p";s:3:"雷";s:2:"q";s:3:"電";s:2:"r";s:3:"雹";s:2:"s";s:3:"零";s:2:"t";s:3:"靖";s:2:"u";s:3:"靴";s:2:"v";s:3:"靶";s:2:"w";s:3:"預";s:2:"x";s:3:"頑";s:2:"y";s:3:"頓";s:2:"z";s:3:"頊";s:2:"{";s:3:"頒";s:2:"|";s:3:"頌";s:2:"}";s:3:"飼";s:2:"~";s:3:"飴";s:2:"";s:3:"飽";s:2:"";s:3:"飾";s:2:"";s:3:"馳";s:2:"";s:3:"馱";s:2:"";s:3:"馴";s:2:"";s:3:"髡";s:2:"";s:3:"鳩";s:2:"";s:3:"麂";s:2:"";s:3:"鼎";s:2:"";s:3:"鼓";s:2:"";s:3:"鼠";s:2:"";s:3:"僧";s:2:"";s:3:"僮";s:2:"";s:3:"僥";s:2:"";s:3:"僖";s:2:"";s:3:"僭";s:2:"";s:3:"僚";s:2:"";s:3:"僕";s:2:"";s:3:"像";s:2:"";s:3:"僑";s:2:"";s:3:"僱";s:2:"";s:3:"僎";s:2:"";s:3:"僩";s:2:"";s:3:"兢";s:2:"";s:3:"凳";s:2:"";s:3:"劃";s:2:"";s:3:"劂";s:2:"";s:3:"匱";s:2:"";s:3:"厭";s:2:"";s:3:"嗾";s:2:"";s:3:"嘀";s:2:"";s:3:"嘛";s:2:"";s:3:"嘗";s:2:"";s:3:"嗽";s:2:"";s:3:"嘔";s:2:"";s:3:"嘆";s:2:"";s:3:"嘉";s:2:"";s:3:"嘍";s:2:"";s:3:"嘎";s:2:"";s:3:"嗷";s:2:"";s:3:"嘖";s:2:"";s:3:"嘟";s:2:"";s:3:"嘈";s:2:"";s:3:"嘐";s:2:"";s:3:"嗶";s:2:"";s:3:"團";s:2:"";s:3:"圖";s:2:"";s:3:"塵";s:2:"";s:3:"塾";s:2:"";s:3:"境";s:2:"";s:3:"墓";s:2:"";s:3:"墊";s:2:"";s:3:"塹";s:2:"";s:3:"墅";s:2:"";s:3:"塽";s:2:"";s:3:"壽";s:2:"";s:3:"夥";s:2:"";s:3:"夢";s:2:"";s:3:"夤";s:2:"";s:3:"奪";s:2:"";s:3:"奩";s:2:"";s:3:"嫡";s:2:"";s:3:"嫦";s:2:"";s:3:"嫩";s:2:"";s:3:"嫗";s:2:"";s:3:"嫖";s:2:"";s:3:"嫘";s:2:"";s:3:"嫣";s:2:"";s:3:"孵";s:2:"";s:3:"寞";s:2:"";s:3:"寧";s:2:"";s:3:"寡";s:2:"";s:3:"寥";s:2:"";s:3:"實";s:2:"";s:3:"寨";s:2:"";s:3:"寢";s:2:"";s:3:"寤";s:2:"";s:3:"察";s:2:"";s:3:"對";s:2:"";s:3:"屢";s:2:"";s:3:"嶄";s:2:"";s:3:"嶇";s:2:"";s:3:"幛";s:2:"";s:3:"幣";s:2:"";s:3:"幕";s:2:"";s:3:"幗";s:2:"";s:3:"幔";s:2:"";s:3:"廓";s:2:"";s:3:"廖";s:2:"";s:3:"弊";s:2:"";s:3:"彆";s:2:"";s:3:"彰";s:2:"";s:3:"徹";s:2:"";s:3:"慇";s:2:"@";s:3:"愿";s:2:"A";s:3:"態";s:2:"B";s:3:"慷";s:2:"C";s:3:"慢";s:2:"D";s:3:"慣";s:2:"E";s:3:"慟";s:2:"F";s:3:"慚";s:2:"G";s:3:"慘";s:2:"H";s:3:"慵";s:2:"I";s:3:"截";s:2:"J";s:3:"撇";s:2:"K";s:3:"摘";s:2:"L";s:3:"摔";s:2:"M";s:3:"撤";s:2:"N";s:3:"摸";s:2:"O";s:3:"摟";s:2:"P";s:3:"摺";s:2:"Q";s:3:"摑";s:2:"R";s:3:"摧";s:2:"S";s:3:"搴";s:2:"T";s:3:"摭";s:2:"U";s:3:"摻";s:2:"V";s:3:"敲";s:2:"W";s:3:"斡";s:2:"X";s:3:"旗";s:2:"Y";s:3:"旖";s:2:"Z";s:3:"暢";s:2:"[";s:3:"暨";s:2:"\";s:3:"暝";s:2:"]";s:3:"榜";s:2:"^";s:3:"榨";s:2:"_";s:3:"榕";s:2:"`";s:3:"槁";s:2:"a";s:3:"榮";s:2:"b";s:3:"槓";s:2:"c";s:3:"構";s:2:"d";s:3:"榛";s:2:"e";s:3:"榷";s:2:"f";s:3:"榻";s:2:"g";s:3:"榫";s:2:"h";s:3:"榴";s:2:"i";s:3:"槐";s:2:"j";s:3:"槍";s:2:"k";s:3:"榭";s:2:"l";s:3:"槌";s:2:"m";s:3:"榦";s:2:"n";s:3:"槃";s:2:"o";s:3:"榣";s:2:"p";s:3:"歉";s:2:"q";s:3:"歌";s:2:"r";s:3:"氳";s:2:"s";s:3:"漳";s:2:"t";s:3:"演";s:2:"u";s:3:"滾";s:2:"v";s:3:"漓";s:2:"w";s:3:"滴";s:2:"x";s:3:"漩";s:2:"y";s:3:"漾";s:2:"z";s:3:"漠";s:2:"{";s:3:"漬";s:2:"|";s:3:"漏";s:2:"}";s:3:"漂";s:2:"~";s:3:"漢";s:2:"";s:3:"滿";s:2:"";s:3:"滯";s:2:"";s:3:"漆";s:2:"";s:3:"漱";s:2:"";s:3:"漸";s:2:"";s:3:"漲";s:2:"";s:3:"漣";s:2:"";s:3:"漕";s:2:"";s:3:"漫";s:2:"";s:3:"漯";s:2:"";s:3:"澈";s:2:"";s:3:"漪";s:2:"";s:3:"滬";s:2:"";s:3:"漁";s:2:"";s:3:"滲";s:2:"";s:3:"滌";s:2:"";s:3:"滷";s:2:"";s:3:"熔";s:2:"";s:3:"熙";s:2:"";s:3:"煽";s:2:"";s:3:"熊";s:2:"";s:3:"熄";s:2:"";s:3:"熒";s:2:"";s:3:"爾";s:2:"";s:3:"犒";s:2:"";s:3:"犖";s:2:"";s:3:"獄";s:2:"";s:3:"獐";s:2:"";s:3:"瑤";s:2:"";s:3:"瑣";s:2:"";s:3:"瑪";s:2:"";s:3:"瑰";s:2:"";s:3:"瑭";s:2:"";s:3:"甄";s:2:"";s:3:"疑";s:2:"";s:3:"瘧";s:2:"";s:3:"瘍";s:2:"";s:3:"瘋";s:2:"";s:3:"瘉";s:2:"";s:3:"瘓";s:2:"";s:3:"盡";s:2:"";s:3:"監";s:2:"";s:3:"瞄";s:2:"";s:3:"睽";s:2:"";s:3:"睿";s:2:"";s:3:"睡";s:2:"";s:3:"磁";s:2:"";s:3:"碟";s:2:"";s:3:"碧";s:2:"";s:3:"碳";s:2:"";s:3:"碩";s:2:"";s:3:"碣";s:2:"";s:3:"禎";s:2:"";s:3:"福";s:2:"";s:3:"禍";s:2:"";s:3:"種";s:2:"";s:3:"稱";s:2:"";s:3:"窪";s:2:"";s:3:"窩";s:2:"";s:3:"竭";s:2:"";s:3:"端";s:2:"";s:3:"管";s:2:"";s:3:"箕";s:2:"";s:3:"箋";s:2:"";s:3:"筵";s:2:"";s:3:"算";s:2:"";s:3:"箝";s:2:"";s:3:"箔";s:2:"";s:3:"箏";s:2:"";s:3:"箸";s:2:"";s:3:"箇";s:2:"";s:3:"箄";s:2:"";s:3:"粹";s:2:"";s:3:"粽";s:2:"";s:3:"精";s:2:"";s:3:"綻";s:2:"";s:3:"綰";s:2:"";s:3:"綜";s:2:"";s:3:"綽";s:2:"";s:3:"綾";s:2:"";s:3:"綠";s:2:"";s:3:"緊";s:2:"";s:3:"綴";s:2:"";s:3:"網";s:2:"";s:3:"綱";s:2:"";s:3:"綺";s:2:"";s:3:"綢";s:2:"";s:3:"綿";s:2:"";s:3:"綵";s:2:"";s:3:"綸";s:2:"";s:3:"維";s:2:"";s:3:"緒";s:2:"";s:3:"緇";s:2:"";s:3:"綬";s:2:"@";s:3:"罰";s:2:"A";s:3:"翠";s:2:"B";s:3:"翡";s:2:"C";s:3:"翟";s:2:"D";s:3:"聞";s:2:"E";s:3:"聚";s:2:"F";s:3:"肇";s:2:"G";s:3:"腐";s:2:"H";s:3:"膀";s:2:"I";s:3:"膏";s:2:"J";s:3:"膈";s:2:"K";s:3:"膊";s:2:"L";s:3:"腿";s:2:"M";s:3:"膂";s:2:"N";s:3:"臧";s:2:"O";s:3:"臺";s:2:"P";s:3:"與";s:2:"Q";s:3:"舔";s:2:"R";s:3:"舞";s:2:"S";s:3:"艋";s:2:"T";s:3:"蓉";s:2:"U";s:3:"蒿";s:2:"V";s:3:"蓆";s:2:"W";s:3:"蓄";s:2:"X";s:3:"蒙";s:2:"Y";s:3:"蒞";s:2:"Z";s:3:"蒲";s:2:"[";s:3:"蒜";s:2:"\";s:3:"蓋";s:2:"]";s:3:"蒸";s:2:"^";s:3:"蓀";s:2:"_";s:3:"蓓";s:2:"`";s:3:"蒐";s:2:"a";s:3:"蒼";s:2:"b";s:3:"蓑";s:2:"c";s:3:"蓊";s:2:"d";s:3:"蜿";s:2:"e";s:3:"蜜";s:2:"f";s:3:"蜻";s:2:"g";s:3:"蜢";s:2:"h";s:3:"蜥";s:2:"i";s:3:"蜴";s:2:"j";s:3:"蜘";s:2:"k";s:3:"蝕";s:2:"l";s:3:"蜷";s:2:"m";s:3:"蜩";s:2:"n";s:3:"裳";s:2:"o";s:3:"褂";s:2:"p";s:3:"裴";s:2:"q";s:3:"裹";s:2:"r";s:3:"裸";s:2:"s";s:3:"製";s:2:"t";s:3:"裨";s:2:"u";s:3:"褚";s:2:"v";s:3:"裯";s:2:"w";s:3:"誦";s:2:"x";s:3:"誌";s:2:"y";s:3:"語";s:2:"z";s:3:"誣";s:2:"{";s:3:"認";s:2:"|";s:3:"誡";s:2:"}";s:3:"誓";s:2:"~";s:3:"誤";s:2:"";s:3:"說";s:2:"";s:3:"誥";s:2:"";s:3:"誨";s:2:"";s:3:"誘";s:2:"";s:3:"誑";s:2:"";s:3:"誚";s:2:"";s:3:"誧";s:2:"";s:3:"豪";s:2:"";s:3:"貍";s:2:"";s:3:"貌";s:2:"";s:3:"賓";s:2:"";s:3:"賑";s:2:"";s:3:"賒";s:2:"";s:3:"赫";s:2:"";s:3:"趙";s:2:"";s:3:"趕";s:2:"";s:3:"跼";s:2:"";s:3:"輔";s:2:"";s:3:"輒";s:2:"";s:3:"輕";s:2:"";s:3:"輓";s:2:"";s:3:"辣";s:2:"";s:3:"遠";s:2:"";s:3:"遘";s:2:"";s:3:"遜";s:2:"";s:3:"遣";s:2:"";s:3:"遙";s:2:"";s:3:"遞";s:2:"";s:3:"遢";s:2:"";s:3:"遝";s:2:"";s:3:"遛";s:2:"";s:3:"鄙";s:2:"";s:3:"鄘";s:2:"";s:3:"鄞";s:2:"";s:3:"酵";s:2:"";s:3:"酸";s:2:"";s:3:"酷";s:2:"";s:3:"酴";s:2:"";s:3:"鉸";s:2:"";s:3:"銀";s:2:"";s:3:"銅";s:2:"";s:3:"銘";s:2:"";s:3:"銖";s:2:"";s:3:"鉻";s:2:"";s:3:"銓";s:2:"";s:3:"銜";s:2:"";s:3:"銨";s:2:"";s:3:"鉼";s:2:"";s:3:"銑";s:2:"";s:3:"閡";s:2:"";s:3:"閨";s:2:"";s:3:"閩";s:2:"";s:3:"閣";s:2:"";s:3:"閥";s:2:"";s:3:"閤";s:2:"";s:3:"隙";s:2:"";s:3:"障";s:2:"";s:3:"際";s:2:"";s:3:"雌";s:2:"";s:3:"雒";s:2:"";s:3:"需";s:2:"";s:3:"靼";s:2:"";s:3:"鞅";s:2:"";s:3:"韶";s:2:"";s:3:"頗";s:2:"";s:3:"領";s:2:"";s:3:"颯";s:2:"";s:3:"颱";s:2:"";s:3:"餃";s:2:"";s:3:"餅";s:2:"";s:3:"餌";s:2:"";s:3:"餉";s:2:"";s:3:"駁";s:2:"";s:3:"骯";s:2:"";s:3:"骰";s:2:"";s:3:"髦";s:2:"";s:3:"魁";s:2:"";s:3:"魂";s:2:"";s:3:"鳴";s:2:"";s:3:"鳶";s:2:"";s:3:"鳳";s:2:"";s:3:"麼";s:2:"";s:3:"鼻";s:2:"";s:3:"齊";s:2:"";s:3:"億";s:2:"";s:3:"儀";s:2:"";s:3:"僻";s:2:"";s:3:"僵";s:2:"";s:3:"價";s:2:"";s:3:"儂";s:2:"";s:3:"儈";s:2:"";s:3:"儉";s:2:"";s:3:"儅";s:2:"";s:3:"凜";s:2:"@";s:3:"劇";s:2:"A";s:3:"劈";s:2:"B";s:3:"劉";s:2:"C";s:3:"劍";s:2:"D";s:3:"劊";s:2:"E";s:3:"勰";s:2:"F";s:3:"厲";s:2:"G";s:3:"嘮";s:2:"H";s:3:"嘻";s:2:"I";s:3:"嘹";s:2:"J";s:3:"嘲";s:2:"K";s:3:"嘿";s:2:"L";s:3:"嘴";s:2:"M";s:3:"嘩";s:2:"N";s:3:"噓";s:2:"O";s:3:"噎";s:2:"P";s:3:"噗";s:2:"Q";s:3:"噴";s:2:"R";s:3:"嘶";s:2:"S";s:3:"嘯";s:2:"T";s:3:"嘰";s:2:"U";s:3:"墀";s:2:"V";s:3:"墟";s:2:"W";s:3:"增";s:2:"X";s:3:"墳";s:2:"Y";s:3:"墜";s:2:"Z";s:3:"墮";s:2:"[";s:3:"墩";s:2:"\";s:3:"墦";s:2:"]";s:3:"奭";s:2:"^";s:3:"嬉";s:2:"_";s:3:"嫻";s:2:"`";s:3:"嬋";s:2:"a";s:3:"嫵";s:2:"b";s:3:"嬌";s:2:"c";s:3:"嬈";s:2:"d";s:3:"寮";s:2:"e";s:3:"寬";s:2:"f";s:3:"審";s:2:"g";s:3:"寫";s:2:"h";s:3:"層";s:2:"i";s:3:"履";s:2:"j";s:3:"嶝";s:2:"k";s:3:"嶔";s:2:"l";s:3:"幢";s:2:"m";s:3:"幟";s:2:"n";s:3:"幡";s:2:"o";s:3:"廢";s:2:"p";s:3:"廚";s:2:"q";s:3:"廟";s:2:"r";s:3:"廝";s:2:"s";s:3:"廣";s:2:"t";s:3:"廠";s:2:"u";s:3:"彈";s:2:"v";s:3:"影";s:2:"w";s:3:"德";s:2:"x";s:3:"徵";s:2:"y";s:3:"慶";s:2:"z";s:3:"慧";s:2:"{";s:3:"慮";s:2:"|";s:3:"慝";s:2:"}";s:3:"慕";s:2:"~";s:3:"憂";s:2:"";s:3:"慼";s:2:"";s:3:"慰";s:2:"";s:3:"慫";s:2:"";s:3:"慾";s:2:"";s:3:"憧";s:2:"";s:3:"憐";s:2:"";s:3:"憫";s:2:"";s:3:"憎";s:2:"";s:3:"憬";s:2:"";s:3:"憚";s:2:"";s:3:"憤";s:2:"";s:3:"憔";s:2:"";s:3:"憮";s:2:"";s:3:"戮";s:2:"";s:3:"摩";s:2:"";s:3:"摯";s:2:"";s:3:"摹";s:2:"";s:3:"撞";s:2:"";s:3:"撲";s:2:"";s:3:"撈";s:2:"";s:3:"撐";s:2:"";s:3:"撰";s:2:"";s:3:"撥";s:2:"";s:3:"撓";s:2:"";s:3:"撕";s:2:"";s:3:"撩";s:2:"";s:3:"撒";s:2:"";s:3:"撮";s:2:"";s:3:"播";s:2:"";s:3:"撫";s:2:"";s:3:"撚";s:2:"";s:3:"撬";s:2:"";s:3:"撙";s:2:"";s:3:"撢";s:2:"";s:3:"撳";s:2:"";s:3:"敵";s:2:"";s:3:"敷";s:2:"";s:3:"數";s:2:"";s:3:"暮";s:2:"";s:3:"暫";s:2:"";s:3:"暴";s:2:"";s:3:"暱";s:2:"";s:3:"樣";s:2:"";s:3:"樟";s:2:"";s:3:"槨";s:2:"";s:3:"樁";s:2:"";s:3:"樞";s:2:"";s:3:"標";s:2:"";s:3:"槽";s:2:"";s:3:"模";s:2:"";s:3:"樓";s:2:"";s:3:"樊";s:2:"";s:3:"槳";s:2:"";s:3:"樂";s:2:"";s:3:"樅";s:2:"";s:3:"槭";s:2:"";s:3:"樑";s:2:"";s:3:"歐";s:2:"";s:3:"歎";s:2:"";s:3:"殤";s:2:"";s:3:"毅";s:2:"";s:3:"毆";s:2:"";s:3:"漿";s:2:"";s:3:"潼";s:2:"";s:3:"澄";s:2:"";s:3:"潑";s:2:"";s:3:"潦";s:2:"";s:3:"潔";s:2:"";s:3:"澆";s:2:"";s:3:"潭";s:2:"";s:3:"潛";s:2:"";s:3:"潸";s:2:"";s:3:"潮";s:2:"";s:3:"澎";s:2:"";s:3:"潺";s:2:"";s:3:"潰";s:2:"";s:3:"潤";s:2:"";s:3:"澗";s:2:"";s:3:"潘";s:2:"";s:3:"滕";s:2:"";s:3:"潯";s:2:"";s:3:"潠";s:2:"";s:3:"潟";s:2:"";s:3:"熟";s:2:"";s:3:"熬";s:2:"";s:3:"熱";s:2:"";s:3:"熨";s:2:"";s:3:"牖";s:2:"";s:3:"犛";s:2:"";s:3:"獎";s:2:"";s:3:"獗";s:2:"";s:3:"瑩";s:2:"";s:3:"璋";s:2:"";s:3:"璃";s:2:"@";s:3:"瑾";s:2:"A";s:3:"璀";s:2:"B";s:3:"畿";s:2:"C";s:3:"瘠";s:2:"D";s:3:"瘩";s:2:"E";s:3:"瘟";s:2:"F";s:3:"瘤";s:2:"G";s:3:"瘦";s:2:"H";s:3:"瘡";s:2:"I";s:3:"瘢";s:2:"J";s:3:"皚";s:2:"K";s:3:"皺";s:2:"L";s:3:"盤";s:2:"M";s:3:"瞎";s:2:"N";s:3:"瞇";s:2:"O";s:3:"瞌";s:2:"P";s:3:"瞑";s:2:"Q";s:3:"瞋";s:2:"R";s:3:"磋";s:2:"S";s:3:"磅";s:2:"T";s:3:"確";s:2:"U";s:3:"磊";s:2:"V";s:3:"碾";s:2:"W";s:3:"磕";s:2:"X";s:3:"碼";s:2:"Y";s:3:"磐";s:2:"Z";s:3:"稿";s:2:"[";s:3:"稼";s:2:"\";s:3:"穀";s:2:"]";s:3:"稽";s:2:"^";s:3:"稷";s:2:"_";s:3:"稻";s:2:"`";s:3:"窯";s:2:"a";s:3:"窮";s:2:"b";s:3:"箭";s:2:"c";s:3:"箱";s:2:"d";s:3:"範";s:2:"e";s:3:"箴";s:2:"f";s:3:"篆";s:2:"g";s:3:"篇";s:2:"h";s:3:"篁";s:2:"i";s:3:"箠";s:2:"j";s:3:"篌";s:2:"k";s:3:"糊";s:2:"l";s:3:"締";s:2:"m";s:3:"練";s:2:"n";s:3:"緯";s:2:"o";s:3:"緻";s:2:"p";s:3:"緘";s:2:"q";s:3:"緬";s:2:"r";s:3:"緝";s:2:"s";s:3:"編";s:2:"t";s:3:"緣";s:2:"u";s:3:"線";s:2:"v";s:3:"緞";s:2:"w";s:3:"緩";s:2:"x";s:3:"綞";s:2:"y";s:3:"緙";s:2:"z";s:3:"緲";s:2:"{";s:3:"緹";s:2:"|";s:3:"罵";s:2:"}";s:3:"罷";s:2:"~";s:3:"羯";s:2:"";s:3:"翩";s:2:"";s:3:"耦";s:2:"";s:3:"膛";s:2:"";s:3:"膜";s:2:"";s:3:"膝";s:2:"";s:3:"膠";s:2:"";s:3:"膚";s:2:"";s:3:"膘";s:2:"";s:3:"蔗";s:2:"";s:3:"蔽";s:2:"";s:3:"蔚";s:2:"";s:3:"蓮";s:2:"";s:3:"蔬";s:2:"";s:3:"蔭";s:2:"";s:3:"蔓";s:2:"";s:3:"蔑";s:2:"";s:3:"蔣";s:2:"";s:3:"蔡";s:2:"";s:3:"蔔";s:2:"";s:3:"蓬";s:2:"";s:3:"蔥";s:2:"";s:3:"蓿";s:2:"";s:3:"蔆";s:2:"";s:3:"螂";s:2:"";s:3:"蝴";s:2:"";s:3:"蝶";s:2:"";s:3:"蝠";s:2:"";s:3:"蝦";s:2:"";s:3:"蝸";s:2:"";s:3:"蝨";s:2:"";s:3:"蝙";s:2:"";s:3:"蝗";s:2:"";s:3:"蝌";s:2:"";s:3:"蝓";s:2:"";s:3:"衛";s:2:"";s:3:"衝";s:2:"";s:3:"褐";s:2:"";s:3:"複";s:2:"";s:3:"褒";s:2:"";s:3:"褓";s:2:"";s:3:"褕";s:2:"";s:3:"褊";s:2:"";s:3:"誼";s:2:"";s:3:"諒";s:2:"";s:3:"談";s:2:"";s:3:"諄";s:2:"";s:3:"誕";s:2:"";s:3:"請";s:2:"";s:3:"諸";s:2:"";s:3:"課";s:2:"";s:3:"諉";s:2:"";s:3:"諂";s:2:"";s:3:"調";s:2:"";s:3:"誰";s:2:"";s:3:"論";s:2:"";s:3:"諍";s:2:"";s:3:"誶";s:2:"";s:3:"誹";s:2:"";s:3:"諛";s:2:"";s:3:"豌";s:2:"";s:3:"豎";s:2:"";s:3:"豬";s:2:"";s:3:"賠";s:2:"";s:3:"賞";s:2:"";s:3:"賦";s:2:"";s:3:"賤";s:2:"";s:3:"賬";s:2:"";s:3:"賭";s:2:"";s:3:"賢";s:2:"";s:3:"賣";s:2:"";s:3:"賜";s:2:"";s:3:"質";s:2:"";s:3:"賡";s:2:"";s:3:"赭";s:2:"";s:3:"趟";s:2:"";s:3:"趣";s:2:"";s:3:"踫";s:2:"";s:3:"踐";s:2:"";s:3:"踝";s:2:"";s:3:"踢";s:2:"";s:3:"踏";s:2:"";s:3:"踩";s:2:"";s:3:"踟";s:2:"";s:3:"踡";s:2:"";s:3:"踞";s:2:"";s:3:"躺";s:2:"";s:3:"輝";s:2:"";s:3:"輛";s:2:"";s:3:"輟";s:2:"";s:3:"輩";s:2:"";s:3:"輦";s:2:"";s:3:"輪";s:2:"";s:3:"輜";s:2:"";s:3:"輞";s:2:"@";s:3:"輥";s:2:"A";s:3:"適";s:2:"B";s:3:"遮";s:2:"C";s:3:"遨";s:2:"D";s:3:"遭";s:2:"E";s:3:"遷";s:2:"F";s:3:"鄰";s:2:"G";s:3:"鄭";s:2:"H";s:3:"鄧";s:2:"I";s:3:"鄱";s:2:"J";s:3:"醇";s:2:"K";s:3:"醉";s:2:"L";s:3:"醋";s:2:"M";s:3:"醃";s:2:"N";s:3:"鋅";s:2:"O";s:3:"銻";s:2:"P";s:3:"銷";s:2:"Q";s:3:"鋪";s:2:"R";s:3:"銬";s:2:"S";s:3:"鋤";s:2:"T";s:3:"鋁";s:2:"U";s:3:"銳";s:2:"V";s:3:"銼";s:2:"W";s:3:"鋒";s:2:"X";s:3:"鋇";s:2:"Y";s:3:"鋰";s:2:"Z";s:3:"銲";s:2:"[";s:3:"閭";s:2:"\";s:3:"閱";s:2:"]";s:3:"霄";s:2:"^";s:3:"霆";s:2:"_";s:3:"震";s:2:"`";s:3:"霉";s:2:"a";s:3:"靠";s:2:"b";s:3:"鞍";s:2:"c";s:3:"鞋";s:2:"d";s:3:"鞏";s:2:"e";s:3:"頡";s:2:"f";s:3:"頫";s:2:"g";s:3:"頜";s:2:"h";s:3:"颳";s:2:"i";s:3:"養";s:2:"j";s:3:"餓";s:2:"k";s:3:"餒";s:2:"l";s:3:"餘";s:2:"m";s:3:"駝";s:2:"n";s:3:"駐";s:2:"o";s:3:"駟";s:2:"p";s:3:"駛";s:2:"q";s:3:"駑";s:2:"r";s:3:"駕";s:2:"s";s:3:"駒";s:2:"t";s:3:"駙";s:2:"u";s:3:"骷";s:2:"v";s:3:"髮";s:2:"w";s:3:"髯";s:2:"x";s:3:"鬧";s:2:"y";s:3:"魅";s:2:"z";s:3:"魄";s:2:"{";s:3:"魷";s:2:"|";s:3:"魯";s:2:"}";s:3:"鴆";s:2:"~";s:3:"鴉";s:2:"";s:3:"鴃";s:2:"";s:3:"麩";s:2:"";s:3:"麾";s:2:"";s:3:"黎";s:2:"";s:3:"墨";s:2:"";s:3:"齒";s:2:"";s:3:"儒";s:2:"";s:3:"儘";s:2:"";s:3:"儔";s:2:"";s:3:"儐";s:2:"";s:3:"儕";s:2:"";s:3:"冀";s:2:"";s:3:"冪";s:2:"";s:3:"凝";s:2:"";s:3:"劑";s:2:"";s:3:"劓";s:2:"";s:3:"勳";s:2:"";s:3:"噙";s:2:"";s:3:"噫";s:2:"";s:3:"噹";s:2:"";s:3:"噩";s:2:"";s:3:"噤";s:2:"";s:3:"噸";s:2:"";s:3:"噪";s:2:"";s:3:"器";s:2:"";s:3:"噥";s:2:"";s:3:"噱";s:2:"";s:3:"噯";s:2:"";s:3:"噬";s:2:"";s:3:"噢";s:2:"";s:3:"噶";s:2:"";s:3:"壁";s:2:"";s:3:"墾";s:2:"";s:3:"壇";s:2:"";s:3:"壅";s:2:"";s:3:"奮";s:2:"";s:3:"嬝";s:2:"";s:3:"嬴";s:2:"";s:3:"學";s:2:"";s:3:"寰";s:2:"";s:3:"導";s:2:"";s:3:"彊";s:2:"";s:3:"憲";s:2:"";s:3:"憑";s:2:"";s:3:"憩";s:2:"";s:3:"憊";s:2:"";s:3:"懍";s:2:"";s:3:"憶";s:2:"";s:3:"憾";s:2:"";s:3:"懊";s:2:"";s:3:"懈";s:2:"";s:3:"戰";s:2:"";s:3:"擅";s:2:"";s:3:"擁";s:2:"";s:3:"擋";s:2:"";s:3:"撻";s:2:"";s:3:"撼";s:2:"";s:3:"據";s:2:"";s:3:"擄";s:2:"";s:3:"擇";s:2:"";s:3:"擂";s:2:"";s:3:"操";s:2:"";s:3:"撿";s:2:"";s:3:"擒";s:2:"";s:3:"擔";s:2:"";s:3:"撾";s:2:"";s:3:"整";s:2:"";s:3:"曆";s:2:"";s:3:"曉";s:2:"";s:3:"暹";s:2:"";s:3:"曄";s:2:"";s:3:"曇";s:2:"";s:3:"暸";s:2:"";s:3:"樽";s:2:"";s:3:"樸";s:2:"";s:3:"樺";s:2:"";s:3:"橙";s:2:"";s:3:"橫";s:2:"";s:3:"橘";s:2:"";s:3:"樹";s:2:"";s:3:"橄";s:2:"";s:3:"橢";s:2:"";s:3:"橡";s:2:"";s:3:"橋";s:2:"";s:3:"橇";s:2:"";s:3:"樵";s:2:"";s:3:"機";s:2:"";s:3:"橈";s:2:"";s:3:"歙";s:2:"";s:3:"歷";s:2:"";s:3:"氅";s:2:"";s:3:"濂";s:2:"";s:3:"澱";s:2:"";s:3:"澡";s:2:"@";s:3:"濃";s:2:"A";s:3:"澤";s:2:"B";s:3:"濁";s:2:"C";s:3:"澧";s:2:"D";s:3:"澳";s:2:"E";s:3:"激";s:2:"F";s:3:"澹";s:2:"G";s:3:"澶";s:2:"H";s:3:"澦";s:2:"I";s:3:"澠";s:2:"J";s:3:"澴";s:2:"K";s:3:"熾";s:2:"L";s:3:"燉";s:2:"M";s:3:"燐";s:2:"N";s:3:"燒";s:2:"O";s:3:"燈";s:2:"P";s:3:"燕";s:2:"Q";s:3:"熹";s:2:"R";s:3:"燎";s:2:"S";s:3:"燙";s:2:"T";s:3:"燜";s:2:"U";s:3:"燃";s:2:"V";s:3:"燄";s:2:"W";s:3:"獨";s:2:"X";s:3:"璜";s:2:"Y";s:3:"璣";s:2:"Z";s:3:"璘";s:2:"[";s:3:"璟";s:2:"\";s:3:"璞";s:2:"]";s:3:"瓢";s:2:"^";s:3:"甌";s:2:"_";s:3:"甍";s:2:"`";s:3:"瘴";s:2:"a";s:3:"瘸";s:2:"b";s:3:"瘺";s:2:"c";s:3:"盧";s:2:"d";s:3:"盥";s:2:"e";s:3:"瞠";s:2:"f";s:3:"瞞";s:2:"g";s:3:"瞟";s:2:"h";s:3:"瞥";s:2:"i";s:3:"磨";s:2:"j";s:3:"磚";s:2:"k";s:3:"磬";s:2:"l";s:3:"磧";s:2:"m";s:3:"禦";s:2:"n";s:3:"積";s:2:"o";s:3:"穎";s:2:"p";s:3:"穆";s:2:"q";s:3:"穌";s:2:"r";s:3:"穋";s:2:"s";s:3:"窺";s:2:"t";s:3:"篙";s:2:"u";s:3:"簑";s:2:"v";s:3:"築";s:2:"w";s:3:"篤";s:2:"x";s:3:"篛";s:2:"y";s:3:"篡";s:2:"z";s:3:"篩";s:2:"{";s:3:"篦";s:2:"|";s:3:"糕";s:2:"}";s:3:"糖";s:2:"~";s:3:"縊";s:2:"";s:3:"縑";s:2:"";s:3:"縈";s:2:"";s:3:"縛";s:2:"";s:3:"縣";s:2:"";s:3:"縞";s:2:"";s:3:"縝";s:2:"";s:3:"縉";s:2:"";s:3:"縐";s:2:"";s:3:"罹";s:2:"";s:3:"羲";s:2:"";s:3:"翰";s:2:"";s:3:"翱";s:2:"";s:3:"翮";s:2:"";s:3:"耨";s:2:"";s:3:"膳";s:2:"";s:3:"膩";s:2:"";s:3:"膨";s:2:"";s:3:"臻";s:2:"";s:3:"興";s:2:"";s:3:"艘";s:2:"";s:3:"艙";s:2:"";s:3:"蕊";s:2:"";s:3:"蕙";s:2:"";s:3:"蕈";s:2:"";s:3:"蕨";s:2:"";s:3:"蕩";s:2:"";s:3:"蕃";s:2:"";s:3:"蕉";s:2:"";s:3:"蕭";s:2:"";s:3:"蕪";s:2:"";s:3:"蕞";s:2:"";s:3:"螃";s:2:"";s:3:"螟";s:2:"";s:3:"螞";s:2:"";s:3:"螢";s:2:"";s:3:"融";s:2:"";s:3:"衡";s:2:"";s:3:"褪";s:2:"";s:3:"褲";s:2:"";s:3:"褥";s:2:"";s:3:"褫";s:2:"";s:3:"褡";s:2:"";s:3:"親";s:2:"";s:3:"覦";s:2:"";s:3:"諦";s:2:"";s:3:"諺";s:2:"";s:3:"諫";s:2:"";s:3:"諱";s:2:"";s:3:"謀";s:2:"";s:3:"諜";s:2:"";s:3:"諧";s:2:"";s:3:"諮";s:2:"";s:3:"諾";s:2:"";s:3:"謁";s:2:"";s:3:"謂";s:2:"";s:3:"諷";s:2:"";s:3:"諭";s:2:"";s:3:"諳";s:2:"";s:3:"諶";s:2:"";s:3:"諼";s:2:"";s:3:"豫";s:2:"";s:3:"豭";s:2:"";s:3:"貓";s:2:"";s:3:"賴";s:2:"";s:3:"蹄";s:2:"";s:3:"踱";s:2:"";s:3:"踴";s:2:"";s:3:"蹂";s:2:"";s:3:"踹";s:2:"";s:3:"踵";s:2:"";s:3:"輻";s:2:"";s:3:"輯";s:2:"";s:3:"輸";s:2:"";s:3:"輳";s:2:"";s:3:"辨";s:2:"";s:3:"辦";s:2:"";s:3:"遵";s:2:"";s:3:"遴";s:2:"";s:3:"選";s:2:"";s:3:"遲";s:2:"";s:3:"遼";s:2:"";s:3:"遺";s:2:"";s:3:"鄴";s:2:"";s:3:"醒";s:2:"";s:3:"錠";s:2:"";s:3:"錶";s:2:"";s:3:"鋸";s:2:"";s:3:"錳";s:2:"";s:3:"錯";s:2:"";s:3:"錢";s:2:"";s:3:"鋼";s:2:"";s:3:"錫";s:2:"";s:3:"錄";s:2:"";s:3:"錚";s:2:"@";s:3:"錐";s:2:"A";s:3:"錦";s:2:"B";s:3:"錡";s:2:"C";s:3:"錕";s:2:"D";s:3:"錮";s:2:"E";s:3:"錙";s:2:"F";s:3:"閻";s:2:"G";s:3:"隧";s:2:"H";s:3:"隨";s:2:"I";s:3:"險";s:2:"J";s:3:"雕";s:2:"K";s:3:"霎";s:2:"L";s:3:"霑";s:2:"M";s:3:"霖";s:2:"N";s:3:"霍";s:2:"O";s:3:"霓";s:2:"P";s:3:"霏";s:2:"Q";s:3:"靛";s:2:"R";s:3:"靜";s:2:"S";s:3:"靦";s:2:"T";s:3:"鞘";s:2:"U";s:3:"頰";s:2:"V";s:3:"頸";s:2:"W";s:3:"頻";s:2:"X";s:3:"頷";s:2:"Y";s:3:"頭";s:2:"Z";s:3:"頹";s:2:"[";s:3:"頤";s:2:"\";s:3:"餐";s:2:"]";s:3:"館";s:2:"^";s:3:"餞";s:2:"_";s:3:"餛";s:2:"`";s:3:"餡";s:2:"a";s:3:"餚";s:2:"b";s:3:"駭";s:2:"c";s:3:"駢";s:2:"d";s:3:"駱";s:2:"e";s:3:"骸";s:2:"f";s:3:"骼";s:2:"g";s:3:"髻";s:2:"h";s:3:"髭";s:2:"i";s:3:"鬨";s:2:"j";s:3:"鮑";s:2:"k";s:3:"鴕";s:2:"l";s:3:"鴣";s:2:"m";s:3:"鴦";s:2:"n";s:3:"鴨";s:2:"o";s:3:"鴒";s:2:"p";s:3:"鴛";s:2:"q";s:3:"默";s:2:"r";s:3:"黔";s:2:"s";s:3:"龍";s:2:"t";s:3:"龜";s:2:"u";s:3:"優";s:2:"v";s:3:"償";s:2:"w";s:3:"儡";s:2:"x";s:3:"儲";s:2:"y";s:3:"勵";s:2:"z";s:3:"嚎";s:2:"{";s:3:"嚀";s:2:"|";s:3:"嚐";s:2:"}";s:3:"嚅";s:2:"~";s:3:"嚇";s:2:"";s:3:"嚏";s:2:"";s:3:"壕";s:2:"";s:3:"壓";s:2:"";s:3:"壑";s:2:"";s:3:"壎";s:2:"";s:3:"嬰";s:2:"";s:3:"嬪";s:2:"";s:3:"嬤";s:2:"";s:3:"孺";s:2:"";s:3:"尷";s:2:"";s:3:"屨";s:2:"";s:3:"嶼";s:2:"";s:3:"嶺";s:2:"";s:3:"嶽";s:2:"";s:3:"嶸";s:2:"";s:3:"幫";s:2:"";s:3:"彌";s:2:"";s:3:"徽";s:2:"";s:3:"應";s:2:"";s:3:"懂";s:2:"";s:3:"懇";s:2:"";s:3:"懦";s:2:"";s:3:"懋";s:2:"";s:3:"戲";s:2:"";s:3:"戴";s:2:"";s:3:"擎";s:2:"";s:3:"擊";s:2:"";s:3:"擘";s:2:"";s:3:"擠";s:2:"";s:3:"擰";s:2:"";s:3:"擦";s:2:"";s:3:"擬";s:2:"";s:3:"擱";s:2:"";s:3:"擢";s:2:"";s:3:"擭";s:2:"";s:3:"斂";s:2:"";s:3:"斃";s:2:"";s:3:"曙";s:2:"";s:3:"曖";s:2:"";s:3:"檀";s:2:"";s:3:"檔";s:2:"";s:3:"檄";s:2:"";s:3:"檢";s:2:"";s:3:"檜";s:2:"";s:3:"櫛";s:2:"";s:3:"檣";s:2:"";s:3:"橾";s:2:"";s:3:"檗";s:2:"";s:3:"檐";s:2:"";s:3:"檠";s:2:"";s:3:"歜";s:2:"";s:3:"殮";s:2:"";s:3:"毚";s:2:"";s:3:"氈";s:2:"";s:3:"濘";s:2:"";s:3:"濱";s:2:"";s:3:"濟";s:2:"";s:3:"濠";s:2:"";s:3:"濛";s:2:"";s:3:"濤";s:2:"";s:3:"濫";s:2:"";s:3:"濯";s:2:"";s:3:"澀";s:2:"";s:3:"濬";s:2:"";s:3:"濡";s:2:"";s:3:"濩";s:2:"";s:3:"濕";s:2:"";s:3:"濮";s:2:"";s:3:"濰";s:2:"";s:3:"燧";s:2:"";s:3:"營";s:2:"";s:3:"燮";s:2:"";s:3:"燦";s:2:"";s:3:"燥";s:2:"";s:3:"燭";s:2:"";s:3:"燬";s:2:"";s:3:"燴";s:2:"";s:3:"燠";s:2:"";s:3:"爵";s:2:"";s:3:"牆";s:2:"";s:3:"獰";s:2:"";s:3:"獲";s:2:"";s:3:"璩";s:2:"";s:3:"環";s:2:"";s:3:"璦";s:2:"";s:3:"璨";s:2:"";s:3:"癆";s:2:"";s:3:"療";s:2:"";s:3:"癌";s:2:"";s:3:"盪";s:2:"";s:3:"瞳";s:2:"";s:3:"瞪";s:2:"";s:3:"瞰";s:2:"";s:3:"瞬";s:2:"@";s:3:"瞧";s:2:"A";s:3:"瞭";s:2:"B";s:3:"矯";s:2:"C";s:3:"磷";s:2:"D";s:3:"磺";s:2:"E";s:3:"磴";s:2:"F";s:3:"磯";s:2:"G";s:3:"礁";s:2:"H";s:3:"禧";s:2:"I";s:3:"禪";s:2:"J";s:3:"穗";s:2:"K";s:3:"窿";s:2:"L";s:3:"簇";s:2:"M";s:3:"簍";s:2:"N";s:3:"篾";s:2:"O";s:3:"篷";s:2:"P";s:3:"簌";s:2:"Q";s:3:"篠";s:2:"R";s:3:"糠";s:2:"S";s:3:"糜";s:2:"T";s:3:"糞";s:2:"U";s:3:"糢";s:2:"V";s:3:"糟";s:2:"W";s:3:"糙";s:2:"X";s:3:"糝";s:2:"Y";s:3:"縮";s:2:"Z";s:3:"績";s:2:"[";s:3:"繆";s:2:"\";s:3:"縷";s:2:"]";s:3:"縲";s:2:"^";s:3:"繃";s:2:"_";s:3:"縫";s:2:"`";s:3:"總";s:2:"a";s:3:"縱";s:2:"b";s:3:"繅";s:2:"c";s:3:"繁";s:2:"d";s:3:"縴";s:2:"e";s:3:"縹";s:2:"f";s:3:"繈";s:2:"g";s:3:"縵";s:2:"h";s:3:"縿";s:2:"i";s:3:"縯";s:2:"j";s:3:"罄";s:2:"k";s:3:"翳";s:2:"l";s:3:"翼";s:2:"m";s:3:"聱";s:2:"n";s:3:"聲";s:2:"o";s:3:"聰";s:2:"p";s:3:"聯";s:2:"q";s:3:"聳";s:2:"r";s:3:"臆";s:2:"s";s:3:"臃";s:2:"t";s:3:"膺";s:2:"u";s:3:"臂";s:2:"v";s:3:"臀";s:2:"w";s:3:"膿";s:2:"x";s:3:"膽";s:2:"y";s:3:"臉";s:2:"z";s:3:"膾";s:2:"{";s:3:"臨";s:2:"|";s:3:"舉";s:2:"}";s:3:"艱";s:2:"~";s:3:"薪";s:2:"";s:3:"薄";s:2:"";s:3:"蕾";s:2:"";s:3:"薜";s:2:"";s:3:"薑";s:2:"";s:3:"薔";s:2:"";s:3:"薯";s:2:"";s:3:"薛";s:2:"";s:3:"薇";s:2:"";s:3:"薨";s:2:"";s:3:"薊";s:2:"";s:3:"虧";s:2:"";s:3:"蟀";s:2:"";s:3:"蟑";s:2:"";s:3:"螳";s:2:"";s:3:"蟒";s:2:"";s:3:"蟆";s:2:"";s:3:"螫";s:2:"";s:3:"螻";s:2:"";s:3:"螺";s:2:"";s:3:"蟈";s:2:"";s:3:"蟋";s:2:"";s:3:"褻";s:2:"";s:3:"褶";s:2:"";s:3:"襄";s:2:"";s:3:"褸";s:2:"";s:3:"褽";s:2:"";s:3:"覬";s:2:"";s:3:"謎";s:2:"";s:3:"謗";s:2:"";s:3:"謙";s:2:"";s:3:"講";s:2:"";s:3:"謊";s:2:"";s:3:"謠";s:2:"";s:3:"謝";s:2:"";s:3:"謄";s:2:"";s:3:"謐";s:2:"";s:3:"豁";s:2:"";s:3:"谿";s:2:"";s:3:"豳";s:2:"";s:3:"賺";s:2:"";s:3:"賽";s:2:"";s:3:"購";s:2:"";s:3:"賸";s:2:"";s:3:"賻";s:2:"";s:3:"趨";s:2:"";s:3:"蹉";s:2:"";s:3:"蹋";s:2:"";s:3:"蹈";s:2:"";s:3:"蹊";s:2:"";s:3:"轄";s:2:"";s:3:"輾";s:2:"";s:3:"轂";s:2:"";s:3:"轅";s:2:"";s:3:"輿";s:2:"";s:3:"避";s:2:"";s:3:"遽";s:2:"";s:3:"還";s:2:"";s:3:"邁";s:2:"";s:3:"邂";s:2:"";s:3:"邀";s:2:"";s:3:"鄹";s:2:"";s:3:"醣";s:2:"";s:3:"醞";s:2:"";s:3:"醜";s:2:"";s:3:"鍍";s:2:"";s:3:"鎂";s:2:"";s:3:"錨";s:2:"";s:3:"鍵";s:2:"";s:3:"鍊";s:2:"";s:3:"鍥";s:2:"";s:3:"鍋";s:2:"";s:3:"錘";s:2:"";s:3:"鍾";s:2:"";s:3:"鍬";s:2:"";s:3:"鍛";s:2:"";s:3:"鍰";s:2:"";s:3:"鍚";s:2:"";s:3:"鍔";s:2:"";s:3:"闊";s:2:"";s:3:"闋";s:2:"";s:3:"闌";s:2:"";s:3:"闈";s:2:"";s:3:"闆";s:2:"";s:3:"隱";s:2:"";s:3:"隸";s:2:"";s:3:"雖";s:2:"";s:3:"霜";s:2:"";s:3:"霞";s:2:"";s:3:"鞠";s:2:"";s:3:"韓";s:2:"";s:3:"顆";s:2:"";s:3:"颶";s:2:"";s:3:"餵";s:2:"";s:3:"騁";s:2:"@";s:3:"駿";s:2:"A";s:3:"鮮";s:2:"B";s:3:"鮫";s:2:"C";s:3:"鮪";s:2:"D";s:3:"鮭";s:2:"E";s:3:"鴻";s:2:"F";s:3:"鴿";s:2:"G";s:3:"麋";s:2:"H";s:3:"黏";s:2:"I";s:3:"點";s:2:"J";s:3:"黜";s:2:"K";s:3:"黝";s:2:"L";s:3:"黛";s:2:"M";s:3:"鼾";s:2:"N";s:3:"齋";s:2:"O";s:3:"叢";s:2:"P";s:3:"嚕";s:2:"Q";s:3:"嚮";s:2:"R";s:3:"壙";s:2:"S";s:3:"壘";s:2:"T";s:3:"嬸";s:2:"U";s:3:"彝";s:2:"V";s:3:"懣";s:2:"W";s:3:"戳";s:2:"X";s:3:"擴";s:2:"Y";s:3:"擲";s:2:"Z";s:3:"擾";s:2:"[";s:3:"攆";s:2:"\";s:3:"擺";s:2:"]";s:3:"擻";s:2:"^";s:3:"擷";s:2:"_";s:3:"斷";s:2:"`";s:3:"曜";s:2:"a";s:3:"朦";s:2:"b";s:3:"檳";s:2:"c";s:3:"檬";s:2:"d";s:3:"櫃";s:2:"e";s:3:"檻";s:2:"f";s:3:"檸";s:2:"g";s:3:"櫂";s:2:"h";s:3:"檮";s:2:"i";s:3:"檯";s:2:"j";s:3:"歟";s:2:"k";s:3:"歸";s:2:"l";s:3:"殯";s:2:"m";s:3:"瀉";s:2:"n";s:3:"瀋";s:2:"o";s:3:"濾";s:2:"p";s:3:"瀆";s:2:"q";s:3:"濺";s:2:"r";s:3:"瀑";s:2:"s";s:3:"瀏";s:2:"t";s:3:"燻";s:2:"u";s:3:"燼";s:2:"v";s:3:"燾";s:2:"w";s:3:"燸";s:2:"x";s:3:"獷";s:2:"y";s:3:"獵";s:2:"z";s:3:"璧";s:2:"{";s:3:"璿";s:2:"|";s:3:"甕";s:2:"}";s:3:"癖";s:2:"~";s:3:"癘";s:2:"¡";s:3:"癒";s:2:"¢";s:3:"瞽";s:2:"£";s:3:"瞿";s:2:"¤";s:3:"瞻";s:2:"¥";s:3:"瞼";s:2:"¦";s:3:"礎";s:2:"§";s:3:"禮";s:2:"¨";s:3:"穡";s:2:"©";s:3:"穢";s:2:"ª";s:3:"穠";s:2:"«";s:3:"竄";s:2:"¬";s:3:"竅";s:2:"­";s:3:"簫";s:2:"®";s:3:"簧";s:2:"¯";s:3:"簪";s:2:"°";s:3:"簞";s:2:"±";s:3:"簣";s:2:"²";s:3:"簡";s:2:"³";s:3:"糧";s:2:"´";s:3:"織";s:2:"µ";s:3:"繕";s:2:"¶";s:3:"繞";s:2:"·";s:3:"繚";s:2:"¸";s:3:"繡";s:2:"¹";s:3:"繒";s:2:"º";s:3:"繙";s:2:"»";s:3:"罈";s:2:"¼";s:3:"翹";s:2:"½";s:3:"翻";s:2:"¾";s:3:"職";s:2:"¿";s:3:"聶";s:2:"";s:3:"臍";s:2:"";s:3:"臏";s:2:"";s:3:"舊";s:2:"";s:3:"藏";s:2:"";s:3:"薩";s:2:"";s:3:"藍";s:2:"";s:3:"藐";s:2:"";s:3:"藉";s:2:"";s:3:"薰";s:2:"";s:3:"薺";s:2:"";s:3:"薹";s:2:"";s:3:"薦";s:2:"";s:3:"蟯";s:2:"";s:3:"蟬";s:2:"";s:3:"蟲";s:2:"";s:3:"蟠";s:2:"";s:3:"覆";s:2:"";s:3:"覲";s:2:"";s:3:"觴";s:2:"";s:3:"謨";s:2:"";s:3:"謹";s:2:"";s:3:"謬";s:2:"";s:3:"謫";s:2:"";s:3:"豐";s:2:"";s:3:"贅";s:2:"";s:3:"蹙";s:2:"";s:3:"蹣";s:2:"";s:3:"蹦";s:2:"";s:3:"蹤";s:2:"";s:3:"蹟";s:2:"";s:3:"蹕";s:2:"";s:3:"軀";s:2:"";s:3:"轉";s:2:"";s:3:"轍";s:2:"";s:3:"邇";s:2:"";s:3:"邃";s:2:"";s:3:"邈";s:2:"";s:3:"醫";s:2:"";s:3:"醬";s:2:"";s:3:"釐";s:2:"";s:3:"鎔";s:2:"";s:3:"鎊";s:2:"";s:3:"鎖";s:2:"";s:3:"鎢";s:2:"";s:3:"鎳";s:2:"";s:3:"鎮";s:2:"";s:3:"鎬";s:2:"";s:3:"鎰";s:2:"";s:3:"鎘";s:2:"";s:3:"鎚";s:2:"";s:3:"鎗";s:2:"";s:3:"闔";s:2:"";s:3:"闖";s:2:"";s:3:"闐";s:2:"";s:3:"闕";s:2:"";s:3:"離";s:2:"";s:3:"雜";s:2:"";s:3:"雙";s:2:"";s:3:"雛";s:2:"";s:3:"雞";s:2:"";s:3:"霤";s:2:"";s:3:"鞣";s:2:"";s:3:"鞦";s:2:"@";s:3:"鞭";s:2:"A";s:3:"韹";s:2:"B";s:3:"額";s:2:"C";s:3:"顏";s:2:"D";s:3:"題";s:2:"E";s:3:"顎";s:2:"F";s:3:"顓";s:2:"G";s:3:"颺";s:2:"H";s:3:"餾";s:2:"I";s:3:"餿";s:2:"J";s:3:"餽";s:2:"K";s:3:"餮";s:2:"L";s:3:"馥";s:2:"M";s:3:"騎";s:2:"N";s:3:"髁";s:2:"O";s:3:"鬃";s:2:"P";s:3:"鬆";s:2:"Q";s:3:"魏";s:2:"R";s:3:"魎";s:2:"S";s:3:"魍";s:2:"T";s:3:"鯊";s:2:"U";s:3:"鯉";s:2:"V";s:3:"鯽";s:2:"W";s:3:"鯈";s:2:"X";s:3:"鯀";s:2:"Y";s:3:"鵑";s:2:"Z";s:3:"鵝";s:2:"[";s:3:"鵠";s:2:"\";s:3:"黠";s:2:"]";s:3:"鼕";s:2:"^";s:3:"鼬";s:2:"_";s:3:"儳";s:2:"`";s:3:"嚥";s:2:"a";s:3:"壞";s:2:"b";s:3:"壟";s:2:"c";s:3:"壢";s:2:"d";s:3:"寵";s:2:"e";s:3:"龐";s:2:"f";s:3:"廬";s:2:"g";s:3:"懲";s:2:"h";s:3:"懷";s:2:"i";s:3:"懶";s:2:"j";s:3:"懵";s:2:"k";s:3:"攀";s:2:"l";s:3:"攏";s:2:"m";s:3:"曠";s:2:"n";s:3:"曝";s:2:"o";s:3:"櫥";s:2:"p";s:3:"櫝";s:2:"q";s:3:"櫚";s:2:"r";s:3:"櫓";s:2:"s";s:3:"瀛";s:2:"t";s:3:"瀟";s:2:"u";s:3:"瀨";s:2:"v";s:3:"瀚";s:2:"w";s:3:"瀝";s:2:"x";s:3:"瀕";s:2:"y";s:3:"瀘";s:2:"z";s:3:"爆";s:2:"{";s:3:"爍";s:2:"|";s:3:"牘";s:2:"}";s:3:"犢";s:2:"~";s:3:"獸";s:2:"á";s:3:"獺";s:2:"â";s:3:"璽";s:2:"ã";s:3:"瓊";s:2:"ä";s:3:"瓣";s:2:"å";s:3:"疇";s:2:"æ";s:3:"疆";s:2:"ç";s:3:"癟";s:2:"è";s:3:"癡";s:2:"é";s:3:"矇";s:2:"ê";s:3:"礙";s:2:"ë";s:3:"禱";s:2:"ì";s:3:"穫";s:2:"í";s:3:"穩";s:2:"î";s:3:"簾";s:2:"ï";s:3:"簿";s:2:"ð";s:3:"簸";s:2:"ñ";s:3:"簽";s:2:"ò";s:3:"簷";s:2:"ó";s:3:"籀";s:2:"ô";s:3:"繫";s:2:"õ";s:3:"繭";s:2:"ö";s:3:"繹";s:2:"÷";s:3:"繩";s:2:"ø";s:3:"繪";s:2:"ù";s:3:"羅";s:2:"ú";s:3:"繳";s:2:"û";s:3:"羶";s:2:"ü";s:3:"羹";s:2:"ý";s:3:"羸";s:2:"þ";s:3:"臘";s:2:"ÿ";s:3:"藩";s:2:"";s:3:"藝";s:2:"";s:3:"藪";s:2:"";s:3:"藕";s:2:"";s:3:"藤";s:2:"";s:3:"藥";s:2:"";s:3:"藷";s:2:"";s:3:"蟻";s:2:"";s:3:"蠅";s:2:"";s:3:"蠍";s:2:"";s:3:"蟹";s:2:"";s:3:"蟾";s:2:"";s:3:"襠";s:2:"";s:3:"襟";s:2:"";s:3:"襖";s:2:"";s:3:"襞";s:2:"";s:3:"譁";s:2:"";s:3:"譜";s:2:"";s:3:"識";s:2:"";s:3:"證";s:2:"";s:3:"譚";s:2:"";s:3:"譎";s:2:"";s:3:"譏";s:2:"";s:3:"譆";s:2:"";s:3:"譙";s:2:"";s:3:"贈";s:2:"";s:3:"贊";s:2:"";s:3:"蹼";s:2:"";s:3:"蹲";s:2:"";s:3:"躇";s:2:"";s:3:"蹶";s:2:"";s:3:"蹬";s:2:"";s:3:"蹺";s:2:"";s:3:"蹴";s:2:"";s:3:"轔";s:2:"";s:3:"轎";s:2:"";s:3:"辭";s:2:"";s:3:"邊";s:2:"";s:3:"邋";s:2:"";s:3:"醱";s:2:"";s:3:"醮";s:2:"";s:3:"鏡";s:2:"";s:3:"鏑";s:2:"";s:3:"鏟";s:2:"";s:3:"鏃";s:2:"";s:3:"鏈";s:2:"";s:3:"鏜";s:2:"";s:3:"鏝";s:2:"";s:3:"鏖";s:2:"";s:3:"鏢";s:2:"";s:3:"鏍";s:2:"";s:3:"鏘";s:2:"";s:3:"鏤";s:2:"";s:3:"鏗";s:2:"";s:3:"鏨";s:2:"";s:3:"關";s:2:"";s:3:"隴";s:2:"";s:3:"難";s:2:"";s:3:"霪";s:2:"";s:3:"霧";s:2:"";s:3:"靡";s:2:"";s:3:"韜";s:2:"";s:3:"韻";s:2:"";s:3:"類";s:2:"@";s:3:"願";s:2:"A";s:3:"顛";s:2:"B";s:3:"颼";s:2:"C";s:3:"饅";s:2:"D";s:3:"饉";s:2:"E";s:3:"騖";s:2:"F";s:3:"騙";s:2:"G";s:3:"鬍";s:2:"H";s:3:"鯨";s:2:"I";s:3:"鯧";s:2:"J";s:3:"鯖";s:2:"K";s:3:"鯛";s:2:"L";s:3:"鶉";s:2:"M";s:3:"鵡";s:2:"N";s:3:"鵲";s:2:"O";s:3:"鵪";s:2:"P";s:3:"鵬";s:2:"Q";s:3:"麒";s:2:"R";s:3:"麗";s:2:"S";s:3:"麓";s:2:"T";s:3:"麴";s:2:"U";s:3:"勸";s:2:"V";s:3:"嚨";s:2:"W";s:3:"嚷";s:2:"X";s:3:"嚶";s:2:"Y";s:3:"嚴";s:2:"Z";s:3:"嚼";s:2:"[";s:3:"壤";s:2:"\";s:3:"孀";s:2:"]";s:3:"孃";s:2:"^";s:3:"孽";s:2:"_";s:3:"寶";s:2:"`";s:3:"巉";s:2:"a";s:3:"懸";s:2:"b";s:3:"懺";s:2:"c";s:3:"攘";s:2:"d";s:3:"攔";s:2:"e";s:3:"攙";s:2:"f";s:3:"曦";s:2:"g";s:3:"朧";s:2:"h";s:3:"櫬";s:2:"i";s:3:"瀾";s:2:"j";s:3:"瀰";s:2:"k";s:3:"瀲";s:2:"l";s:3:"爐";s:2:"m";s:3:"獻";s:2:"n";s:3:"瓏";s:2:"o";s:3:"癢";s:2:"p";s:3:"癥";s:2:"q";s:3:"礦";s:2:"r";s:3:"礪";s:2:"s";s:3:"礬";s:2:"t";s:3:"礫";s:2:"u";s:3:"竇";s:2:"v";s:3:"競";s:2:"w";s:3:"籌";s:2:"x";s:3:"籃";s:2:"y";s:3:"籍";s:2:"z";s:3:"糯";s:2:"{";s:3:"糰";s:2:"|";s:3:"辮";s:2:"}";s:3:"繽";s:2:"~";s:3:"繼";s:2:"ġ";s:3:"纂";s:2:"Ģ";s:3:"罌";s:2:"ģ";s:3:"耀";s:2:"Ĥ";s:3:"臚";s:2:"ĥ";s:3:"艦";s:2:"Ħ";s:3:"藻";s:2:"ħ";s:3:"藹";s:2:"Ĩ";s:3:"蘑";s:2:"ĩ";s:3:"藺";s:2:"Ī";s:3:"蘆";s:2:"ī";s:3:"蘋";s:2:"Ĭ";s:3:"蘇";s:2:"ĭ";s:3:"蘊";s:2:"Į";s:3:"蠔";s:2:"į";s:3:"蠕";s:2:"İ";s:3:"襤";s:2:"ı";s:3:"覺";s:2:"Ĳ";s:3:"觸";s:2:"ĳ";s:3:"議";s:2:"Ĵ";s:3:"譬";s:2:"ĵ";s:3:"警";s:2:"Ķ";s:3:"譯";s:2:"ķ";s:3:"譟";s:2:"ĸ";s:3:"譫";s:2:"Ĺ";s:3:"贏";s:2:"ĺ";s:3:"贍";s:2:"Ļ";s:3:"躉";s:2:"ļ";s:3:"躁";s:2:"Ľ";s:3:"躅";s:2:"ľ";s:3:"躂";s:2:"Ŀ";s:3:"醴";s:2:"";s:3:"釋";s:2:"";s:3:"鐘";s:2:"";s:3:"鐃";s:2:"";s:3:"鏽";s:2:"";s:3:"闡";s:2:"";s:3:"霰";s:2:"";s:3:"飄";s:2:"";s:3:"饒";s:2:"";s:3:"饑";s:2:"";s:3:"馨";s:2:"";s:3:"騫";s:2:"";s:3:"騰";s:2:"";s:3:"騷";s:2:"";s:3:"騵";s:2:"";s:3:"鰓";s:2:"";s:3:"鰍";s:2:"";s:3:"鹹";s:2:"";s:3:"麵";s:2:"";s:3:"黨";s:2:"";s:3:"鼯";s:2:"";s:3:"齟";s:2:"";s:3:"齣";s:2:"";s:3:"齡";s:2:"";s:3:"儷";s:2:"";s:3:"儸";s:2:"";s:3:"囁";s:2:"";s:3:"囀";s:2:"";s:3:"囂";s:2:"";s:3:"夔";s:2:"";s:3:"屬";s:2:"";s:3:"巍";s:2:"";s:3:"懼";s:2:"";s:3:"懾";s:2:"";s:3:"攝";s:2:"";s:3:"攜";s:2:"";s:3:"斕";s:2:"";s:3:"曩";s:2:"";s:3:"櫻";s:2:"";s:3:"欄";s:2:"";s:3:"櫺";s:2:"";s:3:"殲";s:2:"";s:3:"灌";s:2:"";s:3:"爛";s:2:"";s:3:"犧";s:2:"";s:3:"瓖";s:2:"";s:3:"瓔";s:2:"";s:3:"癩";s:2:"";s:3:"矓";s:2:"";s:3:"籐";s:2:"";s:3:"纏";s:2:"";s:3:"續";s:2:"";s:3:"羼";s:2:"";s:3:"蘗";s:2:"";s:3:"蘭";s:2:"";s:3:"蘚";s:2:"";s:3:"蠣";s:2:"";s:3:"蠢";s:2:"";s:3:"蠡";s:2:"";s:3:"蠟";s:2:"";s:3:"襪";s:2:"";s:3:"襬";s:2:"";s:3:"覽";s:2:"";s:3:"譴";s:2:"@";s:3:"護";s:2:"A";s:3:"譽";s:2:"B";s:3:"贓";s:2:"C";s:3:"躊";s:2:"D";s:3:"躍";s:2:"E";s:3:"躋";s:2:"F";s:3:"轟";s:2:"G";s:3:"辯";s:2:"H";s:3:"醺";s:2:"I";s:3:"鐮";s:2:"J";s:3:"鐳";s:2:"K";s:3:"鐵";s:2:"L";s:3:"鐺";s:2:"M";s:3:"鐸";s:2:"N";s:3:"鐲";s:2:"O";s:3:"鐫";s:2:"P";s:3:"闢";s:2:"Q";s:3:"霸";s:2:"R";s:3:"霹";s:2:"S";s:3:"露";s:2:"T";s:3:"響";s:2:"U";s:3:"顧";s:2:"V";s:3:"顥";s:2:"W";s:3:"饗";s:2:"X";s:3:"驅";s:2:"Y";s:3:"驃";s:2:"Z";s:3:"驀";s:2:"[";s:3:"騾";s:2:"\";s:3:"髏";s:2:"]";s:3:"魔";s:2:"^";s:3:"魑";s:2:"_";s:3:"鰭";s:2:"`";s:3:"鰥";s:2:"a";s:3:"鶯";s:2:"b";s:3:"鶴";s:2:"c";s:3:"鷂";s:2:"d";s:3:"鶸";s:2:"e";s:3:"麝";s:2:"f";s:3:"黯";s:2:"g";s:3:"鼙";s:2:"h";s:3:"齜";s:2:"i";s:3:"齦";s:2:"j";s:3:"齧";s:2:"k";s:3:"儼";s:2:"l";s:3:"儻";s:2:"m";s:3:"囈";s:2:"n";s:3:"囊";s:2:"o";s:3:"囉";s:2:"p";s:3:"孿";s:2:"q";s:3:"巔";s:2:"r";s:3:"巒";s:2:"s";s:3:"彎";s:2:"t";s:3:"懿";s:2:"u";s:3:"攤";s:2:"v";s:3:"權";s:2:"w";s:3:"歡";s:2:"x";s:3:"灑";s:2:"y";s:3:"灘";s:2:"z";s:3:"玀";s:2:"{";s:3:"瓤";s:2:"|";s:3:"疊";s:2:"}";s:3:"癮";s:2:"~";s:3:"癬";s:2:"š";s:3:"禳";s:2:"Ţ";s:3:"籠";s:2:"ţ";s:3:"籟";s:2:"Ť";s:3:"聾";s:2:"ť";s:3:"聽";s:2:"Ŧ";s:3:"臟";s:2:"ŧ";s:3:"襲";s:2:"Ũ";s:3:"襯";s:2:"ũ";s:3:"觼";s:2:"Ū";s:3:"讀";s:2:"ū";s:3:"贖";s:2:"Ŭ";s:3:"贗";s:2:"ŭ";s:3:"躑";s:2:"Ů";s:3:"躓";s:2:"ů";s:3:"轡";s:2:"Ű";s:3:"酈";s:2:"ű";s:3:"鑄";s:2:"Ų";s:3:"鑑";s:2:"ų";s:3:"鑒";s:2:"Ŵ";s:3:"霽";s:2:"ŵ";s:3:"霾";s:2:"Ŷ";s:3:"韃";s:2:"ŷ";s:3:"韁";s:2:"Ÿ";s:3:"顫";s:2:"Ź";s:3:"饕";s:2:"ź";s:3:"驕";s:2:"Ż";s:3:"驍";s:2:"ż";s:3:"髒";s:2:"Ž";s:3:"鬚";s:2:"ž";s:3:"鱉";s:2:"ſ";s:3:"鰱";s:2:"";s:3:"鰾";s:2:"";s:3:"鰻";s:2:"";s:3:"鷓";s:2:"";s:3:"鷗";s:2:"";s:3:"鼴";s:2:"";s:3:"齬";s:2:"";s:3:"齪";s:2:"";s:3:"龔";s:2:"";s:3:"囌";s:2:"";s:3:"巖";s:2:"";s:3:"戀";s:2:"";s:3:"攣";s:2:"";s:3:"攫";s:2:"";s:3:"攪";s:2:"";s:3:"曬";s:2:"";s:3:"欐";s:2:"";s:3:"瓚";s:2:"";s:3:"竊";s:2:"";s:3:"籤";s:2:"";s:3:"籣";s:2:"";s:3:"籥";s:2:"";s:3:"纓";s:2:"";s:3:"纖";s:2:"";s:3:"纔";s:2:"";s:3:"臢";s:2:"";s:3:"蘸";s:2:"";s:3:"蘿";s:2:"";s:3:"蠱";s:2:"";s:3:"變";s:2:"";s:3:"邐";s:2:"";s:3:"邏";s:2:"";s:3:"鑣";s:2:"";s:3:"鑠";s:2:"";s:3:"鑤";s:2:"";s:3:"靨";s:2:"";s:3:"顯";s:2:"";s:3:"饜";s:2:"";s:3:"驚";s:2:"";s:3:"驛";s:2:"";s:3:"驗";s:2:"";s:3:"髓";s:2:"";s:3:"體";s:2:"";s:3:"髑";s:2:"";s:3:"鱔";s:2:"";s:3:"鱗";s:2:"";s:3:"鱖";s:2:"";s:3:"鷥";s:2:"";s:3:"麟";s:2:"";s:3:"黴";s:2:"";s:3:"囑";s:2:"";s:3:"壩";s:2:"";s:3:"攬";s:2:"";s:3:"灞";s:2:"";s:3:"癱";s:2:"";s:3:"癲";s:2:"";s:3:"矗";s:2:"";s:3:"罐";s:2:"";s:3:"羈";s:2:"";s:3:"蠶";s:2:"";s:3:"蠹";s:2:"";s:3:"衢";s:2:"";s:3:"讓";s:2:"";s:3:"讒";s:2:"@";s:3:"讖";s:2:"A";s:3:"艷";s:2:"B";s:3:"贛";s:2:"C";s:3:"釀";s:2:"D";s:3:"鑪";s:2:"E";s:3:"靂";s:2:"F";s:3:"靈";s:2:"G";s:3:"靄";s:2:"H";s:3:"韆";s:2:"I";s:3:"顰";s:2:"J";s:3:"驟";s:2:"K";s:3:"鬢";s:2:"L";s:3:"魘";s:2:"M";s:3:"鱟";s:2:"N";s:3:"鷹";s:2:"O";s:3:"鷺";s:2:"P";s:3:"鹼";s:2:"Q";s:3:"鹽";s:2:"R";s:3:"鼇";s:2:"S";s:3:"齷";s:2:"T";s:3:"齲";s:2:"U";s:3:"廳";s:2:"V";s:3:"欖";s:2:"W";s:3:"灣";s:2:"X";s:3:"籬";s:2:"Y";s:3:"籮";s:2:"Z";s:3:"蠻";s:2:"[";s:3:"觀";s:2:"\";s:3:"躡";s:2:"]";s:3:"釁";s:2:"^";s:3:"鑲";s:2:"_";s:3:"鑰";s:2:"`";s:3:"顱";s:2:"a";s:3:"饞";s:2:"b";s:3:"髖";s:2:"c";s:3:"鬣";s:2:"d";s:3:"黌";s:2:"e";s:3:"灤";s:2:"f";s:3:"矚";s:2:"g";s:3:"讚";s:2:"h";s:3:"鑷";s:2:"i";s:3:"韉";s:2:"j";s:3:"驢";s:2:"k";s:3:"驥";s:2:"l";s:3:"纜";s:2:"m";s:3:"讜";s:2:"n";s:3:"躪";s:2:"o";s:3:"釅";s:2:"p";s:3:"鑽";s:2:"q";s:3:"鑾";s:2:"r";s:3:"鑼";s:2:"s";s:3:"鱷";s:2:"t";s:3:"鱸";s:2:"u";s:3:"黷";s:2:"v";s:3:"豔";s:2:"w";s:3:"鑿";s:2:"x";s:3:"鸚";s:2:"y";s:3:"爨";s:2:"z";s:3:"驪";s:2:"{";s:3:"鬱";s:2:"|";s:3:"鸛";s:2:"}";s:3:"鸞";s:2:"~";s:3:"籲";s:2:"@";s:3:"乂";s:2:"A";s:3:"乜";s:2:"B";s:3:"凵";s:2:"C";s:3:"匚";s:2:"D";s:3:"厂";s:2:"E";s:3:"万";s:2:"F";s:3:"丌";s:2:"G";s:3:"乇";s:2:"H";s:3:"亍";s:2:"I";s:3:"囗";s:2:"J";s:3:"兀";s:2:"K";s:3:"屮";s:2:"L";s:3:"彳";s:2:"M";s:3:"丏";s:2:"N";s:3:"冇";s:2:"O";s:3:"与";s:2:"P";s:3:"丮";s:2:"Q";s:3:"亓";s:2:"R";s:3:"仂";s:2:"S";s:3:"仉";s:2:"T";s:3:"仈";s:2:"U";s:3:"冘";s:2:"V";s:3:"勼";s:2:"W";s:3:"卬";s:2:"X";s:3:"厹";s:2:"Y";s:3:"圠";s:2:"Z";s:3:"夃";s:2:"[";s:3:"夬";s:2:"\";s:3:"尐";s:2:"]";s:3:"巿";s:2:"^";s:3:"旡";s:2:"_";s:3:"殳";s:2:"`";s:3:"毌";s:2:"a";s:3:"气";s:2:"b";s:3:"爿";s:2:"c";s:3:"丱";s:2:"d";s:3:"丼";s:2:"e";s:3:"仨";s:2:"f";s:3:"仜";s:2:"g";s:3:"仩";s:2:"h";s:3:"仡";s:2:"i";s:3:"仝";s:2:"j";s:3:"仚";s:2:"k";s:3:"刌";s:2:"l";s:3:"匜";s:2:"m";s:3:"卌";s:2:"n";s:3:"圢";s:2:"o";s:3:"圣";s:2:"p";s:3:"夗";s:2:"q";s:3:"夯";s:2:"r";s:3:"宁";s:2:"s";s:3:"宄";s:2:"t";s:3:"尒";s:2:"u";s:3:"尻";s:2:"v";s:3:"屴";s:2:"w";s:3:"屳";s:2:"x";s:3:"帄";s:2:"y";s:3:"庀";s:2:"z";s:3:"庂";s:2:"{";s:3:"忉";s:2:"|";s:3:"戉";s:2:"}";s:3:"扐";s:2:"~";s:3:"氕";s:2:"ɡ";s:3:"氶";s:2:"ɢ";s:3:"汃";s:2:"ɣ";s:3:"氿";s:2:"ɤ";s:3:"氻";s:2:"ɥ";s:3:"犮";s:2:"ɦ";s:3:"犰";s:2:"ɧ";s:3:"玊";s:2:"ɨ";s:3:"禸";s:2:"ɩ";s:3:"肊";s:2:"ɪ";s:3:"阞";s:2:"ɫ";s:3:"伎";s:2:"ɬ";s:3:"优";s:2:"ɭ";s:3:"伬";s:2:"ɮ";s:3:"仵";s:2:"ɯ";s:3:"伔";s:2:"ɰ";s:3:"仱";s:2:"ɱ";s:3:"伀";s:2:"ɲ";s:3:"价";s:2:"ɳ";s:3:"伈";s:2:"ɴ";s:3:"伝";s:2:"ɵ";s:3:"伂";s:2:"ɶ";s:3:"伅";s:2:"ɷ";s:3:"伢";s:2:"ɸ";s:3:"伓";s:2:"ɹ";s:3:"伄";s:2:"ɺ";s:3:"仴";s:2:"ɻ";s:3:"伒";s:2:"ɼ";s:3:"冱";s:2:"ɽ";s:3:"刓";s:2:"ɾ";s:3:"刉";s:2:"ɿ";s:3:"刐";s:2:"";s:3:"劦";s:2:"";s:3:"匢";s:2:"";s:3:"匟";s:2:"";s:3:"卍";s:2:"";s:3:"厊";s:2:"";s:3:"吇";s:2:"";s:3:"囡";s:2:"";s:3:"囟";s:2:"";s:3:"圮";s:2:"";s:3:"圪";s:2:"";s:3:"圴";s:2:"";s:3:"夼";s:2:"";s:3:"妀";s:2:"";s:3:"奼";s:2:"";s:3:"妅";s:2:"";s:3:"奻";s:2:"";s:3:"奾";s:2:"";s:3:"奷";s:2:"";s:3:"奿";s:2:"";s:3:"孖";s:2:"";s:3:"尕";s:2:"";s:3:"尥";s:2:"";s:3:"屼";s:2:"";s:3:"屺";s:2:"";s:3:"屻";s:2:"";s:3:"屾";s:2:"";s:3:"巟";s:2:"";s:3:"幵";s:2:"";s:3:"庄";s:2:"";s:3:"异";s:2:"";s:3:"弚";s:2:"";s:3:"彴";s:2:"";s:3:"忕";s:2:"";s:3:"忔";s:2:"";s:3:"忏";s:2:"";s:3:"扜";s:2:"";s:3:"扞";s:2:"";s:3:"扤";s:2:"";s:3:"扡";s:2:"";s:3:"扦";s:2:"";s:3:"扢";s:2:"";s:3:"扙";s:2:"";s:3:"扠";s:2:"";s:3:"扚";s:2:"";s:3:"扥";s:2:"";s:3:"旯";s:2:"";s:3:"旮";s:2:"";s:3:"朾";s:2:"";s:3:"朹";s:2:"";s:3:"朸";s:2:"";s:3:"朻";s:2:"";s:3:"机";s:2:"";s:3:"朿";s:2:"";s:3:"朼";s:2:"";s:3:"朳";s:2:"";s:3:"氘";s:2:"";s:3:"汆";s:2:"";s:3:"汒";s:2:"";s:3:"汜";s:2:"";s:3:"汏";s:2:"";s:3:"汊";s:2:"";s:3:"汔";s:2:"";s:3:"汋";s:2:"@";s:3:"汌";s:2:"A";s:3:"灱";s:2:"B";s:3:"牞";s:2:"C";s:3:"犴";s:2:"D";s:3:"犵";s:2:"E";s:3:"玎";s:2:"F";s:3:"甪";s:2:"G";s:3:"癿";s:2:"H";s:3:"穵";s:2:"I";s:3:"网";s:2:"J";s:3:"艸";s:2:"K";s:3:"艼";s:2:"L";s:3:"芀";s:2:"M";s:3:"艽";s:2:"N";s:3:"艿";s:2:"O";s:3:"虍";s:2:"P";s:3:"襾";s:2:"Q";s:3:"邙";s:2:"R";s:3:"邗";s:2:"S";s:3:"邘";s:2:"T";s:3:"邛";s:2:"U";s:3:"邔";s:2:"V";s:3:"阢";s:2:"W";s:3:"阤";s:2:"X";s:3:"阠";s:2:"Y";s:3:"阣";s:2:"Z";s:3:"佖";s:2:"[";s:3:"伻";s:2:"\";s:3:"佢";s:2:"]";s:3:"佉";s:2:"^";s:3:"体";s:2:"_";s:3:"佤";s:2:"`";s:3:"伾";s:2:"a";s:3:"佧";s:2:"b";s:3:"佒";s:2:"c";s:3:"佟";s:2:"d";s:3:"佁";s:2:"e";s:3:"佘";s:2:"f";s:3:"伭";s:2:"g";s:3:"伳";s:2:"h";s:3:"伿";s:2:"i";s:3:"佡";s:2:"j";s:3:"冏";s:2:"k";s:3:"冹";s:2:"l";s:3:"刜";s:2:"m";s:3:"刞";s:2:"n";s:3:"刡";s:2:"o";s:3:"劭";s:2:"p";s:3:"劮";s:2:"q";s:3:"匉";s:2:"r";s:3:"卣";s:2:"s";s:3:"卲";s:2:"t";s:3:"厎";s:2:"u";s:3:"厏";s:2:"v";s:3:"吰";s:2:"w";s:3:"吷";s:2:"x";s:3:"吪";s:2:"y";s:3:"呔";s:2:"z";s:3:"呅";s:2:"{";s:3:"吙";s:2:"|";s:3:"吜";s:2:"}";s:3:"吥";s:2:"~";s:3:"吘";s:2:"ʡ";s:3:"吽";s:2:"ʢ";s:3:"呏";s:2:"ʣ";s:3:"呁";s:2:"ʤ";s:3:"吨";s:2:"ʥ";s:3:"吤";s:2:"ʦ";s:3:"呇";s:2:"ʧ";s:3:"囮";s:2:"ʨ";s:3:"囧";s:2:"ʩ";s:3:"囥";s:2:"ʪ";s:3:"坁";s:2:"ʫ";s:3:"坅";s:2:"ʬ";s:3:"坌";s:2:"ʭ";s:3:"坉";s:2:"ʮ";s:3:"坋";s:2:"ʯ";s:3:"坒";s:2:"ʰ";s:3:"夆";s:2:"ʱ";s:3:"奀";s:2:"ʲ";s:3:"妦";s:2:"ʳ";s:3:"妘";s:2:"ʴ";s:3:"妠";s:2:"ʵ";s:3:"妗";s:2:"ʶ";s:3:"妎";s:2:"ʷ";s:3:"妢";s:2:"ʸ";s:3:"妐";s:2:"ʹ";s:3:"妏";s:2:"ʺ";s:3:"妧";s:2:"ʻ";s:3:"妡";s:2:"ʼ";s:3:"宎";s:2:"ʽ";s:3:"宒";s:2:"ʾ";s:3:"尨";s:2:"ʿ";s:3:"尪";s:2:"";s:3:"岍";s:2:"";s:3:"岏";s:2:"";s:3:"岈";s:2:"";s:3:"岋";s:2:"";s:3:"岉";s:2:"";s:3:"岒";s:2:"";s:3:"岊";s:2:"";s:3:"岆";s:2:"";s:3:"岓";s:2:"";s:3:"岕";s:2:"";s:3:"巠";s:2:"";s:3:"帊";s:2:"";s:3:"帎";s:2:"";s:3:"庋";s:2:"";s:3:"庉";s:2:"";s:3:"庌";s:2:"";s:3:"庈";s:2:"";s:3:"庍";s:2:"";s:3:"弅";s:2:"";s:3:"弝";s:2:"";s:3:"彸";s:2:"";s:3:"彶";s:2:"";s:3:"忒";s:2:"";s:3:"忑";s:2:"";s:3:"忐";s:2:"";s:3:"忭";s:2:"";s:3:"忨";s:2:"";s:3:"忮";s:2:"";s:3:"忳";s:2:"";s:3:"忡";s:2:"";s:3:"忤";s:2:"";s:3:"忣";s:2:"";s:3:"忺";s:2:"";s:3:"忯";s:2:"";s:3:"忷";s:2:"";s:3:"忻";s:2:"";s:3:"怀";s:2:"";s:3:"忴";s:2:"";s:3:"戺";s:2:"";s:3:"抃";s:2:"";s:3:"抌";s:2:"";s:3:"抎";s:2:"";s:3:"抏";s:2:"";s:3:"抔";s:2:"";s:3:"抇";s:2:"";s:3:"扱";s:2:"";s:3:"扻";s:2:"";s:3:"扺";s:2:"";s:3:"扰";s:2:"";s:3:"抁";s:2:"";s:3:"抈";s:2:"";s:3:"扷";s:2:"";s:3:"扽";s:2:"";s:3:"扲";s:2:"";s:3:"扴";s:2:"";s:3:"攷";s:2:"";s:3:"旰";s:2:"";s:3:"旴";s:2:"";s:3:"旳";s:2:"";s:3:"旲";s:2:"";s:3:"旵";s:2:"";s:3:"杅";s:2:"";s:3:"杇";s:2:"@";s:3:"杙";s:2:"A";s:3:"杕";s:2:"B";s:3:"杌";s:2:"C";s:3:"杈";s:2:"D";s:3:"杝";s:2:"E";s:3:"杍";s:2:"F";s:3:"杚";s:2:"G";s:3:"杋";s:2:"H";s:3:"毐";s:2:"I";s:3:"氙";s:2:"J";s:3:"氚";s:2:"K";s:3:"汸";s:2:"L";s:3:"汧";s:2:"M";s:3:"汫";s:2:"N";s:3:"沄";s:2:"O";s:3:"沋";s:2:"P";s:3:"沏";s:2:"Q";s:3:"汱";s:2:"R";s:3:"汯";s:2:"S";s:3:"汩";s:2:"T";s:3:"沚";s:2:"U";s:3:"汭";s:2:"V";s:3:"沇";s:2:"W";s:3:"沕";s:2:"X";s:3:"沜";s:2:"Y";s:3:"汦";s:2:"Z";s:3:"汳";s:2:"[";s:3:"汥";s:2:"\";s:3:"汻";s:2:"]";s:3:"沎";s:2:"^";s:3:"灴";s:2:"_";s:3:"灺";s:2:"`";s:3:"牣";s:2:"a";s:3:"犿";s:2:"b";s:3:"犽";s:2:"c";s:3:"狃";s:2:"d";s:3:"狆";s:2:"e";s:3:"狁";s:2:"f";s:3:"犺";s:2:"g";s:3:"狅";s:2:"h";s:3:"玕";s:2:"i";s:3:"玗";s:2:"j";s:3:"玓";s:2:"k";s:3:"玔";s:2:"l";s:3:"玒";s:2:"m";s:3:"町";s:2:"n";s:3:"甹";s:2:"o";s:3:"疔";s:2:"p";s:3:"疕";s:2:"q";s:3:"皁";s:2:"r";s:3:"礽";s:2:"s";s:3:"耴";s:2:"t";s:3:"肕";s:2:"u";s:3:"肙";s:2:"v";s:3:"肐";s:2:"w";s:3:"肒";s:2:"x";s:3:"肜";s:2:"y";s:3:"芐";s:2:"z";s:3:"芏";s:2:"{";s:3:"芅";s:2:"|";s:3:"芎";s:2:"}";s:3:"芑";s:2:"~";s:3:"芓";s:2:"ˡ";s:3:"芊";s:2:"ˢ";s:3:"芃";s:2:"ˣ";s:3:"芄";s:2:"ˤ";s:3:"豸";s:2:"˥";s:3:"迉";s:2:"˦";s:3:"辿";s:2:"˧";s:3:"邟";s:2:"˨";s:3:"邡";s:2:"˩";s:3:"邥";s:2:"˪";s:3:"邞";s:2:"˫";s:3:"邧";s:2:"ˬ";s:3:"邠";s:2:"˭";s:3:"阰";s:2:"ˮ";s:3:"阨";s:2:"˯";s:3:"阯";s:2:"˰";s:3:"阭";s:2:"˱";s:3:"丳";s:2:"˲";s:3:"侘";s:2:"˳";s:3:"佼";s:2:"˴";s:3:"侅";s:2:"˵";s:3:"佽";s:2:"˶";s:3:"侀";s:2:"˷";s:3:"侇";s:2:"˸";s:3:"佶";s:2:"˹";s:3:"佴";s:2:"˺";s:3:"侉";s:2:"˻";s:3:"侄";s:2:"˼";s:3:"佷";s:2:"˽";s:3:"佌";s:2:"˾";s:3:"侗";s:2:"˿";s:3:"佪";s:2:"";s:3:"侚";s:2:"";s:3:"佹";s:2:"";s:3:"侁";s:2:"";s:3:"佸";s:2:"";s:3:"侐";s:2:"";s:3:"侜";s:2:"";s:3:"侔";s:2:"";s:3:"侞";s:2:"";s:3:"侒";s:2:"";s:3:"侂";s:2:"";s:3:"侕";s:2:"";s:3:"佫";s:2:"";s:3:"佮";s:2:"";s:3:"冞";s:2:"";s:3:"冼";s:2:"";s:3:"冾";s:2:"";s:3:"刵";s:2:"";s:3:"刲";s:2:"";s:3:"刳";s:2:"";s:3:"剆";s:2:"";s:3:"刱";s:2:"";s:3:"劼";s:2:"";s:3:"匊";s:2:"";s:3:"匋";s:2:"";s:3:"匼";s:2:"";s:3:"厒";s:2:"";s:3:"厔";s:2:"";s:3:"咇";s:2:"";s:3:"呿";s:2:"";s:3:"咁";s:2:"";s:3:"咑";s:2:"";s:3:"咂";s:2:"";s:3:"咈";s:2:"";s:3:"呫";s:2:"";s:3:"呺";s:2:"";s:3:"呾";s:2:"";s:3:"呥";s:2:"";s:3:"呬";s:2:"";s:3:"呴";s:2:"";s:3:"呦";s:2:"";s:3:"咍";s:2:"";s:3:"呯";s:2:"";s:3:"呡";s:2:"";s:3:"呠";s:2:"";s:3:"咘";s:2:"";s:3:"呣";s:2:"";s:3:"呧";s:2:"";s:3:"呤";s:2:"";s:3:"囷";s:2:"";s:3:"囹";s:2:"";s:3:"坯";s:2:"";s:3:"坲";s:2:"";s:3:"坭";s:2:"";s:3:"坫";s:2:"";s:3:"坱";s:2:"";s:3:"坰";s:2:"";s:3:"坶";s:2:"";s:3:"垀";s:2:"";s:3:"坵";s:2:"";s:3:"坻";s:2:"";s:3:"坳";s:2:"";s:3:"坴";s:2:"";s:3:"坢";s:2:"@";s:3:"坨";s:2:"A";s:3:"坽";s:2:"B";s:3:"夌";s:2:"C";s:3:"奅";s:2:"D";s:3:"妵";s:2:"E";s:3:"妺";s:2:"F";s:3:"姏";s:2:"G";s:3:"姎";s:2:"H";s:3:"妲";s:2:"I";s:3:"姌";s:2:"J";s:3:"姁";s:2:"K";s:3:"妶";s:2:"L";s:3:"妼";s:2:"M";s:3:"姃";s:2:"N";s:3:"姖";s:2:"O";s:3:"妱";s:2:"P";s:3:"妽";s:2:"Q";s:3:"姀";s:2:"R";s:3:"姈";s:2:"S";s:3:"妴";s:2:"T";s:3:"姇";s:2:"U";s:3:"孢";s:2:"V";s:3:"孥";s:2:"W";s:3:"宓";s:2:"X";s:3:"宕";s:2:"Y";s:3:"屄";s:2:"Z";s:3:"屇";s:2:"[";s:3:"岮";s:2:"\";s:3:"岤";s:2:"]";s:3:"岠";s:2:"^";s:3:"岵";s:2:"_";s:3:"岯";s:2:"`";s:3:"岨";s:2:"a";s:3:"岬";s:2:"b";s:3:"岟";s:2:"c";s:3:"岣";s:2:"d";s:3:"岭";s:2:"e";s:3:"岢";s:2:"f";s:3:"岪";s:2:"g";s:3:"岧";s:2:"h";s:3:"岝";s:2:"i";s:3:"岥";s:2:"j";s:3:"岶";s:2:"k";s:3:"岰";s:2:"l";s:3:"岦";s:2:"m";s:3:"帗";s:2:"n";s:3:"帔";s:2:"o";s:3:"帙";s:2:"p";s:3:"弨";s:2:"q";s:3:"弢";s:2:"r";s:3:"弣";s:2:"s";s:3:"弤";s:2:"t";s:3:"彔";s:2:"u";s:3:"徂";s:2:"v";s:3:"彾";s:2:"w";s:3:"彽";s:2:"x";s:3:"忞";s:2:"y";s:3:"忥";s:2:"z";s:3:"怭";s:2:"{";s:3:"怦";s:2:"|";s:3:"怙";s:2:"}";s:3:"怲";s:2:"~";s:3:"怋";s:2:"̡";s:3:"怴";s:2:"̢";s:3:"怊";s:2:"̣";s:3:"怗";s:2:"̤";s:3:"怳";s:2:"̥";s:3:"怚";s:2:"̦";s:3:"怞";s:2:"̧";s:3:"怬";s:2:"̨";s:3:"怢";s:2:"̩";s:3:"怍";s:2:"̪";s:3:"怐";s:2:"̫";s:3:"怮";s:2:"̬";s:3:"怓";s:2:"̭";s:3:"怑";s:2:"̮";s:3:"怌";s:2:"̯";s:3:"怉";s:2:"̰";s:3:"怜";s:2:"̱";s:3:"戔";s:2:"̲";s:3:"戽";s:2:"̳";s:3:"抭";s:2:"̴";s:3:"抴";s:2:"̵";s:3:"拑";s:2:"̶";s:3:"抾";s:2:"̷";s:3:"抪";s:2:"̸";s:3:"抶";s:2:"̹";s:3:"拊";s:2:"̺";s:3:"抮";s:2:"̻";s:3:"抳";s:2:"̼";s:3:"抯";s:2:"̽";s:3:"抻";s:2:"̾";s:3:"抩";s:2:"̿";s:3:"抰";s:2:"";s:3:"抸";s:2:"";s:3:"攽";s:2:"";s:3:"斨";s:2:"";s:3:"斻";s:2:"";s:3:"昉";s:2:"";s:3:"旼";s:2:"";s:3:"昄";s:2:"";s:3:"昒";s:2:"";s:3:"昈";s:2:"";s:3:"旻";s:2:"";s:3:"昃";s:2:"";s:3:"昋";s:2:"";s:3:"昍";s:2:"";s:3:"昅";s:2:"";s:3:"旽";s:2:"";s:3:"昑";s:2:"";s:3:"昐";s:2:"";s:3:"曶";s:2:"";s:3:"朊";s:2:"";s:3:"枅";s:2:"";s:3:"杬";s:2:"";s:3:"枎";s:2:"";s:3:"枒";s:2:"";s:3:"杶";s:2:"";s:3:"杻";s:2:"";s:3:"枘";s:2:"";s:3:"枆";s:2:"";s:3:"构";s:2:"";s:3:"杴";s:2:"";s:3:"枍";s:2:"";s:3:"枌";s:2:"";s:3:"杺";s:2:"";s:3:"枟";s:2:"";s:3:"枑";s:2:"";s:3:"枙";s:2:"";s:3:"枃";s:2:"";s:3:"杽";s:2:"";s:3:"极";s:2:"";s:3:"杸";s:2:"";s:3:"杹";s:2:"";s:3:"枔";s:2:"";s:3:"欥";s:2:"";s:3:"殀";s:2:"";s:3:"歾";s:2:"";s:3:"毞";s:2:"";s:3:"氝";s:2:"";s:3:"沓";s:2:"";s:3:"泬";s:2:"";s:3:"泫";s:2:"";s:3:"泮";s:2:"";s:3:"泙";s:2:"";s:3:"沶";s:2:"";s:3:"泔";s:2:"";s:3:"沭";s:2:"";s:3:"泧";s:2:"";s:3:"沷";s:2:"";s:3:"泐";s:2:"";s:3:"泂";s:2:"";s:3:"沺";s:2:"";s:3:"泃";s:2:"";s:3:"泆";s:2:"";s:3:"泭";s:2:"";s:3:"泲";s:2:"@";s:3:"泒";s:2:"A";s:3:"泝";s:2:"B";s:3:"沴";s:2:"C";s:3:"沊";s:2:"D";s:3:"沝";s:2:"E";s:3:"沀";s:2:"F";s:3:"泞";s:2:"G";s:3:"泀";s:2:"H";s:3:"洰";s:2:"I";s:3:"泍";s:2:"J";s:3:"泇";s:2:"K";s:3:"沰";s:2:"L";s:3:"泹";s:2:"M";s:3:"泏";s:2:"N";s:3:"泩";s:2:"O";s:3:"泑";s:2:"P";s:3:"炔";s:2:"Q";s:3:"炘";s:2:"R";s:3:"炅";s:2:"S";s:3:"炓";s:2:"T";s:3:"炆";s:2:"U";s:3:"炄";s:2:"V";s:3:"炑";s:2:"W";s:3:"炖";s:2:"X";s:3:"炂";s:2:"Y";s:3:"炚";s:2:"Z";s:3:"炃";s:2:"[";s:3:"牪";s:2:"\";s:3:"狖";s:2:"]";s:3:"狋";s:2:"^";s:3:"狘";s:2:"_";s:3:"狉";s:2:"`";s:3:"狜";s:2:"a";s:3:"狒";s:2:"b";s:3:"狔";s:2:"c";s:3:"狚";s:2:"d";s:3:"狌";s:2:"e";s:3:"狑";s:2:"f";s:3:"玤";s:2:"g";s:3:"玡";s:2:"h";s:3:"玭";s:2:"i";s:3:"玦";s:2:"j";s:3:"玢";s:2:"k";s:3:"玠";s:2:"l";s:3:"玬";s:2:"m";s:3:"玝";s:2:"n";s:3:"瓝";s:2:"o";s:3:"瓨";s:2:"p";s:3:"甿";s:2:"q";s:3:"畀";s:2:"r";s:3:"甾";s:2:"s";s:3:"疌";s:2:"t";s:3:"疘";s:2:"u";s:3:"皯";s:2:"v";s:3:"盳";s:2:"w";s:3:"盱";s:2:"x";s:3:"盰";s:2:"y";s:3:"盵";s:2:"z";s:3:"矸";s:2:"{";s:3:"矼";s:2:"|";s:3:"矹";s:2:"}";s:3:"矻";s:2:"~";s:3:"矺";s:2:"͡";s:3:"矷";s:2:"͢";s:3:"祂";s:2:"ͣ";s:3:"礿";s:2:"ͤ";s:3:"秅";s:2:"ͥ";s:3:"穸";s:2:"ͦ";s:3:"穻";s:2:"ͧ";s:3:"竻";s:2:"ͨ";s:3:"籵";s:2:"ͩ";s:3:"糽";s:2:"ͪ";s:3:"耵";s:2:"ͫ";s:3:"肏";s:2:"ͬ";s:3:"肮";s:2:"ͭ";s:3:"肣";s:2:"ͮ";s:3:"肸";s:2:"ͯ";s:3:"肵";s:2:"Ͱ";s:3:"肭";s:2:"ͱ";s:3:"舠";s:2:"Ͳ";s:3:"芠";s:2:"ͳ";s:3:"苀";s:2:"ʹ";s:3:"芫";s:2:"͵";s:3:"芚";s:2:"Ͷ";s:3:"芘";s:2:"ͷ";s:3:"芛";s:2:"͸";s:3:"芵";s:2:"͹";s:3:"芧";s:2:"ͺ";s:3:"芮";s:2:"ͻ";s:3:"芼";s:2:"ͼ";s:3:"芞";s:2:"ͽ";s:3:"芺";s:2:";";s:3:"芴";s:2:"Ϳ";s:3:"芨";s:2:"";s:3:"芡";s:2:"";s:3:"芩";s:2:"";s:3:"苂";s:2:"";s:3:"芤";s:2:"";s:3:"苃";s:2:"";s:3:"芶";s:2:"";s:3:"芢";s:2:"";s:3:"虰";s:2:"";s:3:"虯";s:2:"";s:3:"虭";s:2:"";s:3:"虮";s:2:"";s:3:"豖";s:2:"";s:3:"迒";s:2:"";s:3:"迋";s:2:"";s:3:"迓";s:2:"";s:3:"迍";s:2:"";s:3:"迖";s:2:"";s:3:"迕";s:2:"";s:3:"迗";s:2:"";s:3:"邲";s:2:"";s:3:"邴";s:2:"";s:3:"邯";s:2:"";s:3:"邳";s:2:"";s:3:"邰";s:2:"";s:3:"阹";s:2:"";s:3:"阽";s:2:"";s:3:"阼";s:2:"";s:3:"阺";s:2:"";s:3:"陃";s:2:"";s:3:"俍";s:2:"";s:3:"俅";s:2:"";s:3:"俓";s:2:"";s:3:"侲";s:2:"";s:3:"俉";s:2:"";s:3:"俋";s:2:"";s:3:"俁";s:2:"";s:3:"俔";s:2:"";s:3:"俜";s:2:"";s:3:"俙";s:2:"";s:3:"侻";s:2:"";s:3:"侳";s:2:"";s:3:"俛";s:2:"";s:3:"俇";s:2:"";s:3:"俖";s:2:"";s:3:"侺";s:2:"";s:3:"俀";s:2:"";s:3:"侹";s:2:"";s:3:"俬";s:2:"";s:3:"剄";s:2:"";s:3:"剉";s:2:"";s:3:"勀";s:2:"";s:3:"勂";s:2:"";s:3:"匽";s:2:"";s:3:"卼";s:2:"";s:3:"厗";s:2:"";s:3:"厖";s:2:"";s:3:"厙";s:2:"";s:3:"厘";s:2:"";s:3:"咺";s:2:"";s:3:"咡";s:2:"";s:3:"咭";s:2:"";s:3:"咥";s:2:"";s:3:"哏";s:2:"@";s:3:"哃";s:2:"A";s:3:"茍";s:2:"B";s:3:"咷";s:2:"C";s:3:"咮";s:2:"D";s:3:"哖";s:2:"E";s:3:"咶";s:2:"F";s:3:"哅";s:2:"G";s:3:"哆";s:2:"H";s:3:"咠";s:2:"I";s:3:"呰";s:2:"J";s:3:"咼";s:2:"K";s:3:"咢";s:2:"L";s:3:"咾";s:2:"M";s:3:"呲";s:2:"N";s:3:"哞";s:2:"O";s:3:"咰";s:2:"P";s:3:"垵";s:2:"Q";s:3:"垞";s:2:"R";s:3:"垟";s:2:"S";s:3:"垤";s:2:"T";s:3:"垌";s:2:"U";s:3:"垗";s:2:"V";s:3:"垝";s:2:"W";s:3:"垛";s:2:"X";s:3:"垔";s:2:"Y";s:3:"垘";s:2:"Z";s:3:"垏";s:2:"[";s:3:"垙";s:2:"\";s:3:"垥";s:2:"]";s:3:"垚";s:2:"^";s:3:"垕";s:2:"_";s:3:"壴";s:2:"`";s:3:"复";s:2:"a";s:3:"奓";s:2:"b";s:3:"姡";s:2:"c";s:3:"姞";s:2:"d";s:3:"姮";s:2:"e";s:3:"娀";s:2:"f";s:3:"姱";s:2:"g";s:3:"姝";s:2:"h";s:3:"姺";s:2:"i";s:3:"姽";s:2:"j";s:3:"姼";s:2:"k";s:3:"姶";s:2:"l";s:3:"姤";s:2:"m";s:3:"姲";s:2:"n";s:3:"姷";s:2:"o";s:3:"姛";s:2:"p";s:3:"姩";s:2:"q";s:3:"姳";s:2:"r";s:3:"姵";s:2:"s";s:3:"姠";s:2:"t";s:3:"姾";s:2:"u";s:3:"姴";s:2:"v";s:3:"姭";s:2:"w";s:3:"宨";s:2:"x";s:3:"屌";s:2:"y";s:3:"峐";s:2:"z";s:3:"峘";s:2:"{";s:3:"峌";s:2:"|";s:3:"峗";s:2:"}";s:3:"峋";s:2:"~";s:3:"峛";s:2:"Ρ";s:3:"峞";s:2:"΢";s:3:"峚";s:2:"Σ";s:3:"峉";s:2:"Τ";s:3:"峇";s:2:"Υ";s:3:"峊";s:2:"Φ";s:3:"峖";s:2:"Χ";s:3:"峓";s:2:"Ψ";s:3:"峔";s:2:"Ω";s:3:"峏";s:2:"Ϊ";s:3:"峈";s:2:"Ϋ";s:3:"峆";s:2:"ά";s:3:"峎";s:2:"έ";s:3:"峟";s:2:"ή";s:3:"峸";s:2:"ί";s:3:"巹";s:2:"ΰ";s:3:"帡";s:2:"α";s:3:"帢";s:2:"β";s:3:"帣";s:2:"γ";s:3:"帠";s:2:"δ";s:3:"帤";s:2:"ε";s:3:"庰";s:2:"ζ";s:3:"庤";s:2:"η";s:3:"庢";s:2:"θ";s:3:"庛";s:2:"ι";s:3:"庣";s:2:"κ";s:3:"庥";s:2:"λ";s:3:"弇";s:2:"μ";s:3:"弮";s:2:"ν";s:3:"彖";s:2:"ξ";s:3:"徆";s:2:"ο";s:3:"怷";s:2:"";s:3:"怹";s:2:"";s:3:"恔";s:2:"";s:3:"恲";s:2:"";s:3:"恞";s:2:"";s:3:"恅";s:2:"";s:3:"恓";s:2:"";s:3:"恇";s:2:"";s:3:"恉";s:2:"";s:3:"恛";s:2:"";s:3:"恌";s:2:"";s:3:"恀";s:2:"";s:3:"恂";s:2:"";s:3:"恟";s:2:"";s:3:"怤";s:2:"";s:3:"恄";s:2:"";s:3:"恘";s:2:"";s:3:"恦";s:2:"";s:3:"恮";s:2:"";s:3:"扂";s:2:"";s:3:"扃";s:2:"";s:3:"拏";s:2:"";s:3:"挍";s:2:"";s:3:"挋";s:2:"";s:3:"拵";s:2:"";s:3:"挎";s:2:"";s:3:"挃";s:2:"";s:3:"拫";s:2:"";s:3:"拹";s:2:"";s:3:"挏";s:2:"";s:3:"挌";s:2:"";s:3:"拸";s:2:"";s:3:"拶";s:2:"";s:3:"挀";s:2:"";s:3:"挓";s:2:"";s:3:"挔";s:2:"";s:3:"拺";s:2:"";s:3:"挕";s:2:"";s:3:"拻";s:2:"";s:3:"拰";s:2:"";s:3:"敁";s:2:"";s:3:"敃";s:2:"";s:3:"斪";s:2:"";s:3:"斿";s:2:"";s:3:"昶";s:2:"";s:3:"昡";s:2:"";s:3:"昲";s:2:"";s:3:"昵";s:2:"";s:3:"昜";s:2:"";s:3:"昦";s:2:"";s:3:"昢";s:2:"";s:3:"昳";s:2:"";s:3:"昫";s:2:"";s:3:"昺";s:2:"";s:3:"昝";s:2:"";s:3:"昴";s:2:"";s:3:"昹";s:2:"";s:3:"昮";s:2:"";s:3:"朏";s:2:"";s:3:"朐";s:2:"";s:3:"柁";s:2:"";s:3:"柲";s:2:"";s:3:"柈";s:2:"";s:3:"枺";s:2:"@";s:3:"柜";s:2:"A";s:3:"枻";s:2:"B";s:3:"柸";s:2:"C";s:3:"柘";s:2:"D";s:3:"柀";s:2:"E";s:3:"枷";s:2:"F";s:3:"柅";s:2:"G";s:3:"柫";s:2:"H";s:3:"柤";s:2:"I";s:3:"柟";s:2:"J";s:3:"枵";s:2:"K";s:3:"柍";s:2:"L";s:3:"枳";s:2:"M";s:3:"柷";s:2:"N";s:3:"柶";s:2:"O";s:3:"柮";s:2:"P";s:3:"柣";s:2:"Q";s:3:"柂";s:2:"R";s:3:"枹";s:2:"S";s:3:"柎";s:2:"T";s:3:"柧";s:2:"U";s:3:"柰";s:2:"V";s:3:"枲";s:2:"W";s:3:"柼";s:2:"X";s:3:"柆";s:2:"Y";s:3:"柭";s:2:"Z";s:3:"柌";s:2:"[";s:3:"枮";s:2:"\";s:3:"柦";s:2:"]";s:3:"柛";s:2:"^";s:3:"柺";s:2:"_";s:3:"柉";s:2:"`";s:3:"柊";s:2:"a";s:3:"柃";s:2:"b";s:3:"柪";s:2:"c";s:3:"柋";s:2:"d";s:3:"欨";s:2:"e";s:3:"殂";s:2:"f";s:3:"殄";s:2:"g";s:3:"殶";s:2:"h";s:3:"毖";s:2:"i";s:3:"毘";s:2:"j";s:3:"毠";s:2:"k";s:3:"氠";s:2:"l";s:3:"氡";s:2:"m";s:3:"洨";s:2:"n";s:3:"洴";s:2:"o";s:3:"洭";s:2:"p";s:3:"洟";s:2:"q";s:3:"洼";s:2:"r";s:3:"洿";s:2:"s";s:3:"洒";s:2:"t";s:3:"洊";s:2:"u";s:3:"泚";s:2:"v";s:3:"洳";s:2:"w";s:3:"洄";s:2:"x";s:3:"洙";s:2:"y";s:3:"洺";s:2:"z";s:3:"洚";s:2:"{";s:3:"洑";s:2:"|";s:3:"洀";s:2:"}";s:3:"洝";s:2:"~";s:3:"浂";s:2:"ϡ";s:3:"洁";s:2:"Ϣ";s:3:"洘";s:2:"ϣ";s:3:"洷";s:2:"Ϥ";s:3:"洃";s:2:"ϥ";s:3:"洏";s:2:"Ϧ";s:3:"浀";s:2:"ϧ";s:3:"洇";s:2:"Ϩ";s:3:"洠";s:2:"ϩ";s:3:"洬";s:2:"Ϫ";s:3:"洈";s:2:"ϫ";s:3:"洢";s:2:"Ϭ";s:3:"洉";s:2:"ϭ";s:3:"洐";s:2:"Ϯ";s:3:"炷";s:2:"ϯ";s:3:"炟";s:2:"ϰ";s:3:"炾";s:2:"ϱ";s:3:"炱";s:2:"ϲ";s:3:"炰";s:2:"ϳ";s:3:"炡";s:2:"ϴ";s:3:"炴";s:2:"ϵ";s:3:"炵";s:2:"϶";s:3:"炩";s:2:"Ϸ";s:3:"牁";s:2:"ϸ";s:3:"牉";s:2:"Ϲ";s:3:"牊";s:2:"Ϻ";s:3:"牬";s:2:"ϻ";s:3:"牰";s:2:"ϼ";s:3:"牳";s:2:"Ͻ";s:3:"牮";s:2:"Ͼ";s:3:"狊";s:2:"Ͽ";s:3:"狤";s:2:"";s:3:"狨";s:2:"";s:3:"狫";s:2:"";s:3:"狟";s:2:"";s:3:"狪";s:2:"";s:3:"狦";s:2:"";s:3:"狣";s:2:"";s:3:"玅";s:2:"";s:3:"珌";s:2:"";s:3:"珂";s:2:"";s:3:"珈";s:2:"";s:3:"珅";s:2:"";s:3:"玹";s:2:"";s:3:"玶";s:2:"";s:3:"玵";s:2:"";s:3:"玴";s:2:"";s:3:"珫";s:2:"";s:3:"玿";s:2:"";s:3:"珇";s:2:"";s:3:"玾";s:2:"";s:3:"珃";s:2:"";s:3:"珆";s:2:"";s:3:"玸";s:2:"";s:3:"珋";s:2:"";s:3:"瓬";s:2:"";s:3:"瓮";s:2:"";s:3:"甮";s:2:"";s:3:"畇";s:2:"";s:3:"畈";s:2:"";s:3:"疧";s:2:"";s:3:"疪";s:2:"";s:3:"癹";s:2:"";s:3:"盄";s:2:"";s:3:"眈";s:2:"";s:3:"眃";s:2:"";s:3:"眄";s:2:"";s:3:"眅";s:2:"";s:3:"眊";s:2:"";s:3:"盷";s:2:"";s:3:"盻";s:2:"";s:3:"盺";s:2:"";s:3:"矧";s:2:"";s:3:"矨";s:2:"";s:3:"砆";s:2:"";s:3:"砑";s:2:"";s:3:"砒";s:2:"";s:3:"砅";s:2:"";s:3:"砐";s:2:"";s:3:"砏";s:2:"";s:3:"砎";s:2:"";s:3:"砉";s:2:"";s:3:"砃";s:2:"";s:3:"砓";s:2:"";s:3:"祊";s:2:"";s:3:"祌";s:2:"";s:3:"祋";s:2:"";s:3:"祅";s:2:"";s:3:"祄";s:2:"";s:3:"秕";s:2:"";s:3:"种";s:2:"";s:3:"秏";s:2:"";s:3:"秖";s:2:"";s:3:"秎";s:2:"";s:3:"窀";s:2:"@";s:3:"穾";s:2:"A";s:3:"竑";s:2:"B";s:3:"笀";s:2:"C";s:3:"笁";s:2:"D";s:3:"籺";s:2:"E";s:3:"籸";s:2:"F";s:3:"籹";s:2:"G";s:3:"籿";s:2:"H";s:3:"粀";s:2:"I";s:3:"粁";s:2:"J";s:3:"紃";s:2:"K";s:3:"紈";s:2:"L";s:3:"紁";s:2:"M";s:3:"罘";s:2:"N";s:3:"羑";s:2:"O";s:3:"羍";s:2:"P";s:3:"羾";s:2:"Q";s:3:"耇";s:2:"R";s:3:"耎";s:2:"S";s:3:"耏";s:2:"T";s:3:"耔";s:2:"U";s:3:"耷";s:2:"V";s:3:"胘";s:2:"W";s:3:"胇";s:2:"X";s:3:"胠";s:2:"Y";s:3:"胑";s:2:"Z";s:3:"胈";s:2:"[";s:3:"胂";s:2:"\";s:3:"胐";s:2:"]";s:3:"胅";s:2:"^";s:3:"胣";s:2:"_";s:3:"胙";s:2:"`";s:3:"胜";s:2:"a";s:3:"胊";s:2:"b";s:3:"胕";s:2:"c";s:3:"胉";s:2:"d";s:3:"胏";s:2:"e";s:3:"胗";s:2:"f";s:3:"胦";s:2:"g";s:3:"胍";s:2:"h";s:3:"臿";s:2:"i";s:3:"舡";s:2:"j";s:3:"芔";s:2:"k";s:3:"苙";s:2:"l";s:3:"苾";s:2:"m";s:3:"苹";s:2:"n";s:3:"茇";s:2:"o";s:3:"苨";s:2:"p";s:3:"茀";s:2:"q";s:3:"苕";s:2:"r";s:3:"茺";s:2:"s";s:3:"苫";s:2:"t";s:3:"苖";s:2:"u";s:3:"苴";s:2:"v";s:3:"苬";s:2:"w";s:3:"苡";s:2:"x";s:3:"苲";s:2:"y";s:3:"苵";s:2:"z";s:3:"茌";s:2:"{";s:3:"苻";s:2:"|";s:3:"苶";s:2:"}";s:3:"苰";s:2:"~";s:3:"苪";s:2:"С";s:3:"苤";s:2:"Т";s:3:"苠";s:2:"У";s:3:"苺";s:2:"Ф";s:3:"苳";s:2:"Х";s:3:"苭";s:2:"Ц";s:3:"虷";s:2:"Ч";s:3:"虴";s:2:"Ш";s:3:"虼";s:2:"Щ";s:3:"虳";s:2:"Ъ";s:3:"衁";s:2:"Ы";s:3:"衎";s:2:"Ь";s:3:"衧";s:2:"Э";s:3:"衪";s:2:"Ю";s:3:"衩";s:2:"Я";s:3:"觓";s:2:"а";s:3:"訄";s:2:"б";s:3:"訇";s:2:"в";s:3:"赲";s:2:"г";s:3:"迣";s:2:"д";s:3:"迡";s:2:"е";s:3:"迮";s:2:"ж";s:3:"迠";s:2:"з";s:3:"郱";s:2:"и";s:3:"邽";s:2:"й";s:3:"邿";s:2:"к";s:3:"郕";s:2:"л";s:3:"郅";s:2:"м";s:3:"邾";s:2:"н";s:3:"郇";s:2:"о";s:3:"郋";s:2:"п";s:3:"郈";s:2:"";s:3:"釔";s:2:"";s:3:"釓";s:2:"";s:3:"陔";s:2:"";s:3:"陏";s:2:"";s:3:"陑";s:2:"";s:3:"陓";s:2:"";s:3:"陊";s:2:"";s:3:"陎";s:2:"";s:3:"倞";s:2:"";s:3:"倅";s:2:"";s:3:"倇";s:2:"";s:3:"倓";s:2:"";s:3:"倢";s:2:"";s:3:"倰";s:2:"";s:3:"倛";s:2:"";s:3:"俵";s:2:"";s:3:"俴";s:2:"";s:3:"倳";s:2:"";s:3:"倷";s:2:"";s:3:"倬";s:2:"";s:3:"俶";s:2:"";s:3:"俷";s:2:"";s:3:"倗";s:2:"";s:3:"倜";s:2:"";s:3:"倠";s:2:"";s:3:"倧";s:2:"";s:3:"倵";s:2:"";s:3:"倯";s:2:"";s:3:"倱";s:2:"";s:3:"倎";s:2:"";s:3:"党";s:2:"";s:3:"冔";s:2:"";s:3:"冓";s:2:"";s:3:"凊";s:2:"";s:3:"凄";s:2:"";s:3:"凅";s:2:"";s:3:"凈";s:2:"";s:3:"凎";s:2:"";s:3:"剡";s:2:"";s:3:"剚";s:2:"";s:3:"剒";s:2:"";s:3:"剞";s:2:"";s:3:"剟";s:2:"";s:3:"剕";s:2:"";s:3:"剢";s:2:"";s:3:"勍";s:2:"";s:3:"匎";s:2:"";s:3:"厞";s:2:"";s:3:"唦";s:2:"";s:3:"哢";s:2:"";s:3:"唗";s:2:"";s:3:"唒";s:2:"";s:3:"哧";s:2:"";s:3:"哳";s:2:"";s:3:"哤";s:2:"";s:3:"唚";s:2:"";s:3:"哿";s:2:"";s:3:"唄";s:2:"";s:3:"唈";s:2:"";s:3:"哫";s:2:"";s:3:"唑";s:2:"";s:3:"唅";s:2:"";s:3:"哱";s:2:"@";s:3:"唊";s:2:"A";s:3:"哻";s:2:"B";s:3:"哷";s:2:"C";s:3:"哸";s:2:"D";s:3:"哠";s:2:"E";s:3:"唎";s:2:"F";s:3:"唃";s:2:"G";s:3:"唋";s:2:"H";s:3:"圁";s:2:"I";s:3:"圂";s:2:"J";s:3:"埌";s:2:"K";s:3:"堲";s:2:"L";s:3:"埕";s:2:"M";s:3:"埒";s:2:"N";s:3:"垺";s:2:"O";s:3:"埆";s:2:"P";s:3:"垽";s:2:"Q";s:3:"垼";s:2:"R";s:3:"垸";s:2:"S";s:3:"垶";s:2:"T";s:3:"垿";s:2:"U";s:3:"埇";s:2:"V";s:3:"埐";s:2:"W";s:3:"垹";s:2:"X";s:3:"埁";s:2:"Y";s:3:"夎";s:2:"Z";s:3:"奊";s:2:"[";s:3:"娙";s:2:"\";s:3:"娖";s:2:"]";s:3:"娭";s:2:"^";s:3:"娮";s:2:"_";s:3:"娕";s:2:"`";s:3:"娏";s:2:"a";s:3:"娗";s:2:"b";s:3:"娊";s:2:"c";s:3:"娞";s:2:"d";s:3:"娳";s:2:"e";s:3:"孬";s:2:"f";s:3:"宧";s:2:"g";s:3:"宭";s:2:"h";s:3:"宬";s:2:"i";s:3:"尃";s:2:"j";s:3:"屖";s:2:"k";s:3:"屔";s:2:"l";s:3:"峬";s:2:"m";s:3:"峿";s:2:"n";s:3:"峮";s:2:"o";s:3:"峱";s:2:"p";s:3:"峷";s:2:"q";s:3:"崀";s:2:"r";s:3:"峹";s:2:"s";s:3:"帩";s:2:"t";s:3:"帨";s:2:"u";s:3:"庨";s:2:"v";s:3:"庮";s:2:"w";s:3:"庪";s:2:"x";s:3:"庬";s:2:"y";s:3:"弳";s:2:"z";s:3:"弰";s:2:"{";s:3:"彧";s:2:"|";s:3:"恝";s:2:"}";s:3:"恚";s:2:"~";s:3:"恧";s:2:"ѡ";s:3:"恁";s:2:"Ѣ";s:3:"悢";s:2:"ѣ";s:3:"悈";s:2:"Ѥ";s:3:"悀";s:2:"ѥ";s:3:"悒";s:2:"Ѧ";s:3:"悁";s:2:"ѧ";s:3:"悝";s:2:"Ѩ";s:3:"悃";s:2:"ѩ";s:3:"悕";s:2:"Ѫ";s:3:"悛";s:2:"ѫ";s:3:"悗";s:2:"Ѭ";s:3:"悇";s:2:"ѭ";s:3:"悜";s:2:"Ѯ";s:3:"悎";s:2:"ѯ";s:3:"戙";s:2:"Ѱ";s:3:"扆";s:2:"ѱ";s:3:"拲";s:2:"Ѳ";s:3:"挐";s:2:"ѳ";s:3:"捖";s:2:"Ѵ";s:3:"挬";s:2:"ѵ";s:3:"捄";s:2:"Ѷ";s:3:"捅";s:2:"ѷ";s:3:"挶";s:2:"Ѹ";s:3:"捃";s:2:"ѹ";s:3:"揤";s:2:"Ѻ";s:3:"挹";s:2:"ѻ";s:3:"捋";s:2:"Ѽ";s:3:"捊";s:2:"ѽ";s:3:"挼";s:2:"Ѿ";s:3:"挩";s:2:"ѿ";s:3:"捁";s:2:"";s:3:"挴";s:2:"";s:3:"捘";s:2:"";s:3:"捔";s:2:"";s:3:"捙";s:2:"";s:3:"挭";s:2:"";s:3:"捇";s:2:"";s:3:"挳";s:2:"";s:3:"捚";s:2:"";s:3:"捑";s:2:"";s:3:"挸";s:2:"";s:3:"捗";s:2:"";s:3:"捀";s:2:"";s:3:"捈";s:2:"";s:3:"敊";s:2:"";s:3:"敆";s:2:"";s:3:"旆";s:2:"";s:3:"旃";s:2:"";s:3:"旄";s:2:"";s:3:"旂";s:2:"";s:3:"晊";s:2:"";s:3:"晟";s:2:"";s:3:"晇";s:2:"";s:3:"晑";s:2:"";s:3:"朒";s:2:"";s:3:"朓";s:2:"";s:3:"栟";s:2:"";s:3:"栚";s:2:"";s:3:"桉";s:2:"";s:3:"栲";s:2:"";s:3:"栳";s:2:"";s:3:"栻";s:2:"";s:3:"桋";s:2:"";s:3:"桏";s:2:"";s:3:"栖";s:2:"";s:3:"栱";s:2:"";s:3:"栜";s:2:"";s:3:"栵";s:2:"";s:3:"栫";s:2:"";s:3:"栭";s:2:"";s:3:"栯";s:2:"";s:3:"桎";s:2:"";s:3:"桄";s:2:"";s:3:"栴";s:2:"";s:3:"栝";s:2:"";s:3:"栒";s:2:"";s:3:"栔";s:2:"";s:3:"栦";s:2:"";s:3:"栨";s:2:"";s:3:"栮";s:2:"";s:3:"桍";s:2:"";s:3:"栺";s:2:"";s:3:"栥";s:2:"";s:3:"栠";s:2:"";s:3:"欬";s:2:"";s:3:"欯";s:2:"";s:3:"欭";s:2:"";s:3:"欱";s:2:"";s:3:"欴";s:2:"";s:3:"歭";s:2:"";s:3:"肂";s:2:"";s:3:"殈";s:2:"";s:3:"毦";s:2:"";s:3:"毤";s:2:"@";s:3:"毨";s:2:"A";s:3:"毣";s:2:"B";s:3:"毢";s:2:"C";s:3:"毧";s:2:"D";s:3:"氥";s:2:"E";s:3:"浺";s:2:"F";s:3:"浣";s:2:"G";s:3:"浤";s:2:"H";s:3:"浶";s:2:"I";s:3:"洍";s:2:"J";s:3:"浡";s:2:"K";s:3:"涒";s:2:"L";s:3:"浘";s:2:"M";s:3:"浢";s:2:"N";s:3:"浭";s:2:"O";s:3:"浯";s:2:"P";s:3:"涑";s:2:"Q";s:3:"涍";s:2:"R";s:3:"淯";s:2:"S";s:3:"浿";s:2:"T";s:3:"涆";s:2:"U";s:3:"浞";s:2:"V";s:3:"浧";s:2:"W";s:3:"浠";s:2:"X";s:3:"涗";s:2:"Y";s:3:"浰";s:2:"Z";s:3:"浼";s:2:"[";s:3:"浟";s:2:"\";s:3:"涂";s:2:"]";s:3:"涘";s:2:"^";s:3:"洯";s:2:"_";s:3:"浨";s:2:"`";s:3:"涋";s:2:"a";s:3:"浾";s:2:"b";s:3:"涀";s:2:"c";s:3:"涄";s:2:"d";s:3:"洖";s:2:"e";s:3:"涃";s:2:"f";s:3:"浻";s:2:"g";s:3:"浽";s:2:"h";s:3:"浵";s:2:"i";s:3:"涐";s:2:"j";s:3:"烜";s:2:"k";s:3:"烓";s:2:"l";s:3:"烑";s:2:"m";s:3:"烝";s:2:"n";s:3:"烋";s:2:"o";s:3:"缹";s:2:"p";s:3:"烢";s:2:"q";s:3:"烗";s:2:"r";s:3:"烒";s:2:"s";s:3:"烞";s:2:"t";s:3:"烠";s:2:"u";s:3:"烔";s:2:"v";s:3:"烍";s:2:"w";s:3:"烅";s:2:"x";s:3:"烆";s:2:"y";s:3:"烇";s:2:"z";s:3:"烚";s:2:"{";s:3:"烎";s:2:"|";s:3:"烡";s:2:"}";s:3:"牂";s:2:"~";s:3:"牸";s:2:"ҡ";s:3:"牷";s:2:"Ң";s:3:"牶";s:2:"ң";s:3:"猀";s:2:"Ҥ";s:3:"狺";s:2:"ҥ";s:3:"狴";s:2:"Ҧ";s:3:"狾";s:2:"ҧ";s:3:"狶";s:2:"Ҩ";s:3:"狳";s:2:"ҩ";s:3:"狻";s:2:"Ҫ";s:3:"猁";s:2:"ҫ";s:3:"珓";s:2:"Ҭ";s:3:"珙";s:2:"ҭ";s:3:"珥";s:2:"Ү";s:3:"珖";s:2:"ү";s:3:"玼";s:2:"Ұ";s:3:"珧";s:2:"ұ";s:3:"珣";s:2:"Ҳ";s:3:"珩";s:2:"ҳ";s:3:"珜";s:2:"Ҵ";s:3:"珒";s:2:"ҵ";s:3:"珛";s:2:"Ҷ";s:3:"珔";s:2:"ҷ";s:3:"珝";s:2:"Ҹ";s:3:"珚";s:2:"ҹ";s:3:"珗";s:2:"Һ";s:3:"珘";s:2:"һ";s:3:"珨";s:2:"Ҽ";s:3:"瓞";s:2:"ҽ";s:3:"瓟";s:2:"Ҿ";s:3:"瓴";s:2:"ҿ";s:3:"瓵";s:2:"";s:3:"甡";s:2:"";s:3:"畛";s:2:"";s:3:"畟";s:2:"";s:3:"疰";s:2:"";s:3:"痁";s:2:"";s:3:"疻";s:2:"";s:3:"痄";s:2:"";s:3:"痀";s:2:"";s:3:"疿";s:2:"";s:3:"疶";s:2:"";s:3:"疺";s:2:"";s:3:"皊";s:2:"";s:3:"盉";s:2:"";s:3:"眝";s:2:"";s:3:"眛";s:2:"";s:3:"眐";s:2:"";s:3:"眓";s:2:"";s:3:"眒";s:2:"";s:3:"眣";s:2:"";s:3:"眑";s:2:"";s:3:"眕";s:2:"";s:3:"眙";s:2:"";s:3:"眚";s:2:"";s:3:"眢";s:2:"";s:3:"眧";s:2:"";s:3:"砣";s:2:"";s:3:"砬";s:2:"";s:3:"砢";s:2:"";s:3:"砵";s:2:"";s:3:"砯";s:2:"";s:3:"砨";s:2:"";s:3:"砮";s:2:"";s:3:"砫";s:2:"";s:3:"砡";s:2:"";s:3:"砩";s:2:"";s:3:"砳";s:2:"";s:3:"砪";s:2:"";s:3:"砱";s:2:"";s:3:"祔";s:2:"";s:3:"祛";s:2:"";s:3:"祏";s:2:"";s:3:"祜";s:2:"";s:3:"祓";s:2:"";s:3:"祒";s:2:"";s:3:"祑";s:2:"";s:3:"秫";s:2:"";s:3:"秬";s:2:"";s:3:"秠";s:2:"";s:3:"秮";s:2:"";s:3:"秭";s:2:"";s:3:"秪";s:2:"";s:3:"秜";s:2:"";s:3:"秞";s:2:"";s:3:"秝";s:2:"";s:3:"窆";s:2:"";s:3:"窉";s:2:"";s:3:"窅";s:2:"";s:3:"窋";s:2:"";s:3:"窌";s:2:"";s:3:"窊";s:2:"";s:3:"窇";s:2:"";s:3:"竘";s:2:"";s:3:"笐";s:2:"@";s:3:"笄";s:2:"A";s:3:"笓";s:2:"B";s:3:"笅";s:2:"C";s:3:"笏";s:2:"D";s:3:"笈";s:2:"E";s:3:"笊";s:2:"F";s:3:"笎";s:2:"G";s:3:"笉";s:2:"H";s:3:"笒";s:2:"I";s:3:"粄";s:2:"J";s:3:"粑";s:2:"K";s:3:"粊";s:2:"L";s:3:"粌";s:2:"M";s:3:"粈";s:2:"N";s:3:"粍";s:2:"O";s:3:"粅";s:2:"P";s:3:"紞";s:2:"Q";s:3:"紝";s:2:"R";s:3:"紑";s:2:"S";s:3:"紎";s:2:"T";s:3:"紘";s:2:"U";s:3:"紖";s:2:"V";s:3:"紓";s:2:"W";s:3:"紟";s:2:"X";s:3:"紒";s:2:"Y";s:3:"紏";s:2:"Z";s:3:"紌";s:2:"[";s:3:"罜";s:2:"\";s:3:"罡";s:2:"]";s:3:"罞";s:2:"^";s:3:"罠";s:2:"_";s:3:"罝";s:2:"`";s:3:"罛";s:2:"a";s:3:"羖";s:2:"b";s:3:"羒";s:2:"c";s:3:"翃";s:2:"d";s:3:"翂";s:2:"e";s:3:"翀";s:2:"f";s:3:"耖";s:2:"g";s:3:"耾";s:2:"h";s:3:"耹";s:2:"i";s:3:"胺";s:2:"j";s:3:"胲";s:2:"k";s:3:"胹";s:2:"l";s:3:"胵";s:2:"m";s:3:"脁";s:2:"n";s:3:"胻";s:2:"o";s:3:"脀";s:2:"p";s:3:"舁";s:2:"q";s:3:"舯";s:2:"r";s:3:"舥";s:2:"s";s:3:"茳";s:2:"t";s:3:"茭";s:2:"u";s:3:"荄";s:2:"v";s:3:"茙";s:2:"w";s:3:"荑";s:2:"x";s:3:"茥";s:2:"y";s:3:"荖";s:2:"z";s:3:"茿";s:2:"{";s:3:"荁";s:2:"|";s:3:"茦";s:2:"}";s:3:"茜";s:2:"~";s:3:"茢";s:2:"ӡ";s:3:"荂";s:2:"Ӣ";s:3:"荎";s:2:"ӣ";s:3:"茛";s:2:"Ӥ";s:3:"茪";s:2:"ӥ";s:3:"茈";s:2:"Ӧ";s:3:"茼";s:2:"ӧ";s:3:"荍";s:2:"Ө";s:3:"茖";s:2:"ө";s:3:"茤";s:2:"Ӫ";s:3:"茠";s:2:"ӫ";s:3:"茷";s:2:"Ӭ";s:3:"茯";s:2:"ӭ";s:3:"茩";s:2:"Ӯ";s:3:"荇";s:2:"ӯ";s:3:"荅";s:2:"Ӱ";s:3:"荌";s:2:"ӱ";s:3:"荓";s:2:"Ӳ";s:3:"茞";s:2:"ӳ";s:3:"茬";s:2:"Ӵ";s:3:"荋";s:2:"ӵ";s:3:"茧";s:2:"Ӷ";s:3:"荈";s:2:"ӷ";s:3:"虓";s:2:"Ӹ";s:3:"虒";s:2:"ӹ";s:3:"蚢";s:2:"Ӻ";s:3:"蚨";s:2:"ӻ";s:3:"蚖";s:2:"Ӽ";s:3:"蚍";s:2:"ӽ";s:3:"蚑";s:2:"Ӿ";s:3:"蚞";s:2:"ӿ";s:3:"蚇";s:2:"";s:3:"蚗";s:2:"";s:3:"蚆";s:2:"";s:3:"蚋";s:2:"";s:3:"蚚";s:2:"";s:3:"蚅";s:2:"";s:3:"蚥";s:2:"";s:3:"蚙";s:2:"";s:3:"蚡";s:2:"";s:3:"蚧";s:2:"";s:3:"蚕";s:2:"";s:3:"蚘";s:2:"";s:3:"蚎";s:2:"";s:3:"蚝";s:2:"";s:3:"蚐";s:2:"";s:3:"蚔";s:2:"";s:3:"衃";s:2:"";s:3:"衄";s:2:"";s:3:"衭";s:2:"";s:3:"衵";s:2:"";s:3:"衶";s:2:"";s:3:"衲";s:2:"";s:3:"袀";s:2:"";s:3:"衱";s:2:"";s:3:"衿";s:2:"";s:3:"衯";s:2:"";s:3:"袃";s:2:"";s:3:"衾";s:2:"";s:3:"衴";s:2:"";s:3:"衼";s:2:"";s:3:"訒";s:2:"";s:3:"豇";s:2:"";s:3:"豗";s:2:"";s:3:"豻";s:2:"";s:3:"貤";s:2:"";s:3:"貣";s:2:"";s:3:"赶";s:2:"";s:3:"赸";s:2:"";s:3:"趵";s:2:"";s:3:"趷";s:2:"";s:3:"趶";s:2:"";s:3:"軑";s:2:"";s:3:"軓";s:2:"";s:3:"迾";s:2:"";s:3:"迵";s:2:"";s:3:"适";s:2:"";s:3:"迿";s:2:"";s:3:"迻";s:2:"";s:3:"逄";s:2:"";s:3:"迼";s:2:"";s:3:"迶";s:2:"";s:3:"郖";s:2:"";s:3:"郠";s:2:"";s:3:"郙";s:2:"";s:3:"郚";s:2:"";s:3:"郣";s:2:"";s:3:"郟";s:2:"";s:3:"郥";s:2:"";s:3:"郘";s:2:"";s:3:"郛";s:2:"";s:3:"郗";s:2:"";s:3:"郜";s:2:"";s:3:"郤";s:2:"";s:3:"酐";s:2:"@";s:3:"酎";s:2:"A";s:3:"酏";s:2:"B";s:3:"釕";s:2:"C";s:3:"釢";s:2:"D";s:3:"釚";s:2:"E";s:3:"陜";s:2:"F";s:3:"陟";s:2:"G";s:3:"隼";s:2:"H";s:3:"飣";s:2:"I";s:3:"髟";s:2:"J";s:3:"鬯";s:2:"K";s:3:"乿";s:2:"L";s:3:"偰";s:2:"M";s:3:"偪";s:2:"N";s:3:"偡";s:2:"O";s:3:"偞";s:2:"P";s:3:"偠";s:2:"Q";s:3:"偓";s:2:"R";s:3:"偋";s:2:"S";s:3:"偝";s:2:"T";s:3:"偲";s:2:"U";s:3:"偈";s:2:"V";s:3:"偍";s:2:"W";s:3:"偁";s:2:"X";s:3:"偛";s:2:"Y";s:3:"偊";s:2:"Z";s:3:"偢";s:2:"[";s:3:"倕";s:2:"\";s:3:"偅";s:2:"]";s:3:"偟";s:2:"^";s:3:"偩";s:2:"_";s:3:"偫";s:2:"`";s:3:"偣";s:2:"a";s:3:"偤";s:2:"b";s:3:"偆";s:2:"c";s:3:"偀";s:2:"d";s:3:"偮";s:2:"e";s:3:"偳";s:2:"f";s:3:"偗";s:2:"g";s:3:"偑";s:2:"h";s:3:"凐";s:2:"i";s:3:"剫";s:2:"j";s:3:"剭";s:2:"k";s:3:"剬";s:2:"l";s:3:"剮";s:2:"m";s:3:"勖";s:2:"n";s:3:"勓";s:2:"o";s:3:"匭";s:2:"p";s:3:"厜";s:2:"q";s:3:"啵";s:2:"r";s:3:"啶";s:2:"s";s:3:"唼";s:2:"t";s:3:"啍";s:2:"u";s:3:"啐";s:2:"v";s:3:"唴";s:2:"w";s:3:"唪";s:2:"x";s:3:"啑";s:2:"y";s:3:"啢";s:2:"z";s:3:"唶";s:2:"{";s:3:"唵";s:2:"|";s:3:"唰";s:2:"}";s:3:"啒";s:2:"~";s:3:"啅";s:2:"ԡ";s:3:"唌";s:2:"Ԣ";s:3:"唲";s:2:"ԣ";s:3:"啥";s:2:"Ԥ";s:3:"啎";s:2:"ԥ";s:3:"唹";s:2:"Ԧ";s:3:"啈";s:2:"ԧ";s:3:"唭";s:2:"Ԩ";s:3:"唻";s:2:"ԩ";s:3:"啀";s:2:"Ԫ";s:3:"啋";s:2:"ԫ";s:3:"圊";s:2:"Ԭ";s:3:"圇";s:2:"ԭ";s:3:"埻";s:2:"Ԯ";s:3:"堔";s:2:"ԯ";s:3:"埢";s:2:"԰";s:3:"埶";s:2:"Ա";s:3:"埜";s:2:"Բ";s:3:"埴";s:2:"Գ";s:3:"堀";s:2:"Դ";s:3:"埭";s:2:"Ե";s:3:"埽";s:2:"Զ";s:3:"堈";s:2:"Է";s:3:"埸";s:2:"Ը";s:3:"堋";s:2:"Թ";s:3:"埳";s:2:"Ժ";s:3:"埏";s:2:"Ի";s:3:"堇";s:2:"Լ";s:3:"埮";s:2:"Խ";s:3:"埣";s:2:"Ծ";s:3:"埲";s:2:"Կ";s:3:"埥";s:2:"";s:3:"埬";s:2:"";s:3:"埡";s:2:"";s:3:"堎";s:2:"";s:3:"埼";s:2:"";s:3:"堐";s:2:"";s:3:"埧";s:2:"";s:3:"堁";s:2:"";s:3:"堌";s:2:"";s:3:"埱";s:2:"";s:3:"埩";s:2:"";s:3:"埰";s:2:"";s:3:"堍";s:2:"";s:3:"堄";s:2:"";s:3:"奜";s:2:"";s:3:"婠";s:2:"";s:3:"婘";s:2:"";s:3:"婕";s:2:"";s:3:"婧";s:2:"";s:3:"婞";s:2:"";s:3:"娸";s:2:"";s:3:"娵";s:2:"";s:3:"婭";s:2:"";s:3:"婐";s:2:"";s:3:"婟";s:2:"";s:3:"婥";s:2:"";s:3:"婬";s:2:"";s:3:"婓";s:2:"";s:3:"婤";s:2:"";s:3:"婗";s:2:"";s:3:"婃";s:2:"";s:3:"婝";s:2:"";s:3:"婒";s:2:"";s:3:"婄";s:2:"";s:3:"婛";s:2:"";s:3:"婈";s:2:"";s:3:"媎";s:2:"";s:3:"娾";s:2:"";s:3:"婍";s:2:"";s:3:"娹";s:2:"";s:3:"婌";s:2:"";s:3:"婰";s:2:"";s:3:"婩";s:2:"";s:3:"婇";s:2:"";s:3:"婑";s:2:"";s:3:"婖";s:2:"";s:3:"婂";s:2:"";s:3:"婜";s:2:"";s:3:"孲";s:2:"";s:3:"孮";s:2:"";s:3:"寁";s:2:"";s:3:"寀";s:2:"";s:3:"屙";s:2:"";s:3:"崞";s:2:"";s:3:"崋";s:2:"";s:3:"崝";s:2:"";s:3:"崚";s:2:"";s:3:"崠";s:2:"";s:3:"崌";s:2:"";s:3:"崨";s:2:"";s:3:"崍";s:2:"";s:3:"崦";s:2:"";s:3:"崥";s:2:"";s:3:"崏";s:2:"@";s:3:"崰";s:2:"A";s:3:"崒";s:2:"B";s:3:"崣";s:2:"C";s:3:"崟";s:2:"D";s:3:"崮";s:2:"E";s:3:"帾";s:2:"F";s:3:"帴";s:2:"G";s:3:"庱";s:2:"H";s:3:"庴";s:2:"I";s:3:"庹";s:2:"J";s:3:"庲";s:2:"K";s:3:"庳";s:2:"L";s:3:"弶";s:2:"M";s:3:"弸";s:2:"N";s:3:"徛";s:2:"O";s:3:"徖";s:2:"P";s:3:"徟";s:2:"Q";s:3:"悊";s:2:"R";s:3:"悐";s:2:"S";s:3:"悆";s:2:"T";s:3:"悾";s:2:"U";s:3:"悰";s:2:"V";s:3:"悺";s:2:"W";s:3:"惓";s:2:"X";s:3:"惔";s:2:"Y";s:3:"惏";s:2:"Z";s:3:"惤";s:2:"[";s:3:"惙";s:2:"\";s:3:"惝";s:2:"]";s:3:"惈";s:2:"^";s:3:"悱";s:2:"_";s:3:"惛";s:2:"`";s:3:"悷";s:2:"a";s:3:"惊";s:2:"b";s:3:"悿";s:2:"c";s:3:"惃";s:2:"d";s:3:"惍";s:2:"e";s:3:"惀";s:2:"f";s:3:"挲";s:2:"g";s:3:"捥";s:2:"h";s:3:"掊";s:2:"i";s:3:"掂";s:2:"j";s:3:"捽";s:2:"k";s:3:"掽";s:2:"l";s:3:"掞";s:2:"m";s:3:"掭";s:2:"n";s:3:"掝";s:2:"o";s:3:"掗";s:2:"p";s:3:"掫";s:2:"q";s:3:"掎";s:2:"r";s:3:"捯";s:2:"s";s:3:"掇";s:2:"t";s:3:"掐";s:2:"u";s:3:"据";s:2:"v";s:3:"掯";s:2:"w";s:3:"捵";s:2:"x";s:3:"掜";s:2:"y";s:3:"捭";s:2:"z";s:3:"掮";s:2:"{";s:3:"捼";s:2:"|";s:3:"掤";s:2:"}";s:3:"挻";s:2:"~";s:3:"掟";s:2:"ա";s:3:"捸";s:2:"բ";s:3:"掅";s:2:"գ";s:3:"掁";s:2:"դ";s:3:"掑";s:2:"ե";s:3:"掍";s:2:"զ";s:3:"捰";s:2:"է";s:3:"敓";s:2:"ը";s:3:"旍";s:2:"թ";s:3:"晥";s:2:"ժ";s:3:"晡";s:2:"ի";s:3:"晛";s:2:"լ";s:3:"晙";s:2:"խ";s:3:"晜";s:2:"ծ";s:3:"晢";s:2:"կ";s:3:"朘";s:2:"հ";s:3:"桹";s:2:"ձ";s:3:"梇";s:2:"ղ";s:3:"梐";s:2:"ճ";s:3:"梜";s:2:"մ";s:3:"桭";s:2:"յ";s:3:"桮";s:2:"ն";s:3:"梮";s:2:"շ";s:3:"梫";s:2:"ո";s:3:"楖";s:2:"չ";s:3:"桯";s:2:"պ";s:3:"梣";s:2:"ջ";s:3:"梬";s:2:"ռ";s:3:"梩";s:2:"ս";s:3:"桵";s:2:"վ";s:3:"桴";s:2:"տ";s:3:"梲";s:2:"";s:3:"梏";s:2:"";s:3:"桷";s:2:"";s:3:"梒";s:2:"";s:3:"桼";s:2:"";s:3:"桫";s:2:"";s:3:"桲";s:2:"";s:3:"梪";s:2:"";s:3:"梀";s:2:"";s:3:"桱";s:2:"";s:3:"桾";s:2:"";s:3:"梛";s:2:"";s:3:"梖";s:2:"";s:3:"梋";s:2:"";s:3:"梠";s:2:"";s:3:"梉";s:2:"";s:3:"梤";s:2:"";s:3:"桸";s:2:"";s:3:"桻";s:2:"";s:3:"梑";s:2:"";s:3:"梌";s:2:"";s:3:"梊";s:2:"";s:3:"桽";s:2:"";s:3:"欶";s:2:"";s:3:"欳";s:2:"";s:3:"欷";s:2:"";s:3:"欸";s:2:"";s:3:"殑";s:2:"";s:3:"殏";s:2:"";s:3:"殍";s:2:"";s:3:"殎";s:2:"";s:3:"殌";s:2:"";s:3:"氪";s:2:"";s:3:"淀";s:2:"";s:3:"涫";s:2:"";s:3:"涴";s:2:"";s:3:"涳";s:2:"";s:3:"湴";s:2:"";s:3:"涬";s:2:"";s:3:"淩";s:2:"";s:3:"淢";s:2:"";s:3:"涷";s:2:"";s:3:"淶";s:2:"";s:3:"淔";s:2:"";s:3:"渀";s:2:"";s:3:"淈";s:2:"";s:3:"淠";s:2:"";s:3:"淟";s:2:"";s:3:"淖";s:2:"";s:3:"涾";s:2:"";s:3:"淥";s:2:"";s:3:"淜";s:2:"";s:3:"淝";s:2:"";s:3:"淛";s:2:"";s:3:"淴";s:2:"";s:3:"淊";s:2:"";s:3:"涽";s:2:"";s:3:"淭";s:2:"";s:3:"淰";s:2:"";s:3:"涺";s:2:"";s:3:"淕";s:2:"";s:3:"淂";s:2:"";s:3:"淏";s:2:"";s:3:"淉";s:2:"@";s:3:"淐";s:2:"A";s:3:"淲";s:2:"B";s:3:"淓";s:2:"C";s:3:"淽";s:2:"D";s:3:"淗";s:2:"E";s:3:"淍";s:2:"F";s:3:"淣";s:2:"G";s:3:"涻";s:2:"H";s:3:"烺";s:2:"I";s:3:"焍";s:2:"J";s:3:"烷";s:2:"K";s:3:"焗";s:2:"L";s:3:"烴";s:2:"M";s:3:"焌";s:2:"N";s:3:"烰";s:2:"O";s:3:"焄";s:2:"P";s:3:"烳";s:2:"Q";s:3:"焐";s:2:"R";s:3:"烼";s:2:"S";s:3:"烿";s:2:"T";s:3:"焆";s:2:"U";s:3:"焓";s:2:"V";s:3:"焀";s:2:"W";s:3:"烸";s:2:"X";s:3:"烶";s:2:"Y";s:3:"焋";s:2:"Z";s:3:"焂";s:2:"[";s:3:"焎";s:2:"\";s:3:"牾";s:2:"]";s:3:"牻";s:2:"^";s:3:"牼";s:2:"_";s:3:"牿";s:2:"`";s:3:"猝";s:2:"a";s:3:"猗";s:2:"b";s:3:"猇";s:2:"c";s:3:"猑";s:2:"d";s:3:"猘";s:2:"e";s:3:"猊";s:2:"f";s:3:"猈";s:2:"g";s:3:"狿";s:2:"h";s:3:"猏";s:2:"i";s:3:"猞";s:2:"j";s:3:"玈";s:2:"k";s:3:"珶";s:2:"l";s:3:"珸";s:2:"m";s:3:"珵";s:2:"n";s:3:"琄";s:2:"o";s:3:"琁";s:2:"p";s:3:"珽";s:2:"q";s:3:"琇";s:2:"r";s:3:"琀";s:2:"s";s:3:"珺";s:2:"t";s:3:"珼";s:2:"u";s:3:"珿";s:2:"v";s:3:"琌";s:2:"w";s:3:"琋";s:2:"x";s:3:"珴";s:2:"y";s:3:"琈";s:2:"z";s:3:"畤";s:2:"{";s:3:"畣";s:2:"|";s:3:"痎";s:2:"}";s:3:"痒";s:2:"~";s:3:"痏";s:2:"֡";s:3:"痋";s:2:"֢";s:3:"痌";s:2:"֣";s:3:"痑";s:2:"֤";s:3:"痐";s:2:"֥";s:3:"皏";s:2:"֦";s:3:"皉";s:2:"֧";s:3:"盓";s:2:"֨";s:3:"眹";s:2:"֩";s:3:"眯";s:2:"֪";s:3:"眭";s:2:"֫";s:3:"眱";s:2:"֬";s:3:"眲";s:2:"֭";s:3:"眴";s:2:"֮";s:3:"眳";s:2:"֯";s:3:"眽";s:2:"ְ";s:3:"眥";s:2:"ֱ";s:3:"眻";s:2:"ֲ";s:3:"眵";s:2:"ֳ";s:3:"硈";s:2:"ִ";s:3:"硒";s:2:"ֵ";s:3:"硉";s:2:"ֶ";s:3:"硍";s:2:"ַ";s:3:"硊";s:2:"ָ";s:3:"硌";s:2:"ֹ";s:3:"砦";s:2:"ֺ";s:3:"硅";s:2:"ֻ";s:3:"硐";s:2:"ּ";s:3:"祤";s:2:"ֽ";s:3:"祧";s:2:"־";s:3:"祩";s:2:"ֿ";s:3:"祪";s:2:"";s:3:"祣";s:2:"";s:3:"祫";s:2:"";s:3:"祡";s:2:"";s:3:"离";s:2:"";s:3:"秺";s:2:"";s:3:"秸";s:2:"";s:3:"秶";s:2:"";s:3:"秷";s:2:"";s:3:"窏";s:2:"";s:3:"窔";s:2:"";s:3:"窐";s:2:"";s:3:"笵";s:2:"";s:3:"筇";s:2:"";s:3:"笴";s:2:"";s:3:"笥";s:2:"";s:3:"笰";s:2:"";s:3:"笢";s:2:"";s:3:"笤";s:2:"";s:3:"笳";s:2:"";s:3:"笘";s:2:"";s:3:"笪";s:2:"";s:3:"笝";s:2:"";s:3:"笱";s:2:"";s:3:"笫";s:2:"";s:3:"笭";s:2:"";s:3:"笯";s:2:"";s:3:"笲";s:2:"";s:3:"笸";s:2:"";s:3:"笚";s:2:"";s:3:"笣";s:2:"";s:3:"粔";s:2:"";s:3:"粘";s:2:"";s:3:"粖";s:2:"";s:3:"粣";s:2:"";s:3:"紵";s:2:"";s:3:"紽";s:2:"";s:3:"紸";s:2:"";s:3:"紶";s:2:"";s:3:"紺";s:2:"";s:3:"絅";s:2:"";s:3:"紬";s:2:"";s:3:"紩";s:2:"";s:3:"絁";s:2:"";s:3:"絇";s:2:"";s:3:"紾";s:2:"";s:3:"紿";s:2:"";s:3:"絊";s:2:"";s:3:"紻";s:2:"";s:3:"紨";s:2:"";s:3:"罣";s:2:"";s:3:"羕";s:2:"";s:3:"羜";s:2:"";s:3:"羝";s:2:"";s:3:"羛";s:2:"";s:3:"翊";s:2:"";s:3:"翋";s:2:"";s:3:"翍";s:2:"";s:3:"翐";s:2:"";s:3:"翑";s:2:"";s:3:"翇";s:2:"";s:3:"翏";s:2:"";s:3:"翉";s:2:"";s:3:"耟";s:2:"@";s:3:"耞";s:2:"A";s:3:"耛";s:2:"B";s:3:"聇";s:2:"C";s:3:"聃";s:2:"D";s:3:"聈";s:2:"E";s:3:"脘";s:2:"F";s:3:"脥";s:2:"G";s:3:"脙";s:2:"H";s:3:"脛";s:2:"I";s:3:"脭";s:2:"J";s:3:"脟";s:2:"K";s:3:"脬";s:2:"L";s:3:"脞";s:2:"M";s:3:"脡";s:2:"N";s:3:"脕";s:2:"O";s:3:"脧";s:2:"P";s:3:"脝";s:2:"Q";s:3:"脢";s:2:"R";s:3:"舑";s:2:"S";s:3:"舸";s:2:"T";s:3:"舳";s:2:"U";s:3:"舺";s:2:"V";s:3:"舴";s:2:"W";s:3:"舲";s:2:"X";s:3:"艴";s:2:"Y";s:3:"莐";s:2:"Z";s:3:"莣";s:2:"[";s:3:"莨";s:2:"\";s:3:"莍";s:2:"]";s:3:"荺";s:2:"^";s:3:"荳";s:2:"_";s:3:"莤";s:2:"`";s:3:"荴";s:2:"a";s:3:"莏";s:2:"b";s:3:"莁";s:2:"c";s:3:"莕";s:2:"d";s:3:"莙";s:2:"e";s:3:"荵";s:2:"f";s:3:"莔";s:2:"g";s:3:"莩";s:2:"h";s:3:"荽";s:2:"i";s:3:"莃";s:2:"j";s:3:"莌";s:2:"k";s:3:"莝";s:2:"l";s:3:"莛";s:2:"m";s:3:"莪";s:2:"n";s:3:"莋";s:2:"o";s:3:"荾";s:2:"p";s:3:"莥";s:2:"q";s:3:"莯";s:2:"r";s:3:"莈";s:2:"s";s:3:"莗";s:2:"t";s:3:"莰";s:2:"u";s:3:"荿";s:2:"v";s:3:"莦";s:2:"w";s:3:"莇";s:2:"x";s:3:"莮";s:2:"y";s:3:"荶";s:2:"z";s:3:"莚";s:2:"{";s:3:"虙";s:2:"|";s:3:"虖";s:2:"}";s:3:"蚿";s:2:"~";s:3:"蚷";s:2:"ס";s:3:"蛂";s:2:"ע";s:3:"蛁";s:2:"ף";s:3:"蛅";s:2:"פ";s:3:"蚺";s:2:"ץ";s:3:"蚰";s:2:"צ";s:3:"蛈";s:2:"ק";s:3:"蚹";s:2:"ר";s:3:"蚳";s:2:"ש";s:3:"蚸";s:2:"ת";s:3:"蛌";s:2:"׫";s:3:"蚴";s:2:"׬";s:3:"蚻";s:2:"׭";s:3:"蚼";s:2:"׮";s:3:"蛃";s:2:"ׯ";s:3:"蚽";s:2:"װ";s:3:"蚾";s:2:"ױ";s:3:"衒";s:2:"ײ";s:3:"袉";s:2:"׳";s:3:"袕";s:2:"״";s:3:"袨";s:2:"׵";s:3:"袢";s:2:"׶";s:3:"袪";s:2:"׷";s:3:"袚";s:2:"׸";s:3:"袑";s:2:"׹";s:3:"袡";s:2:"׺";s:3:"袟";s:2:"׻";s:3:"袘";s:2:"׼";s:3:"袧";s:2:"׽";s:3:"袙";s:2:"׾";s:3:"袛";s:2:"׿";s:3:"袗";s:2:"";s:3:"袤";s:2:"";s:3:"袬";s:2:"";s:3:"袌";s:2:"";s:3:"袓";s:2:"";s:3:"袎";s:2:"";s:3:"覂";s:2:"";s:3:"觖";s:2:"";s:3:"觙";s:2:"";s:3:"觕";s:2:"";s:3:"訰";s:2:"";s:3:"訧";s:2:"";s:3:"訬";s:2:"";s:3:"訞";s:2:"";s:3:"谹";s:2:"";s:3:"谻";s:2:"";s:3:"豜";s:2:"";s:3:"豝";s:2:"";s:3:"豽";s:2:"";s:3:"貥";s:2:"";s:3:"赽";s:2:"";s:3:"赻";s:2:"";s:3:"赹";s:2:"";s:3:"趼";s:2:"";s:3:"跂";s:2:"";s:3:"趹";s:2:"";s:3:"趿";s:2:"";s:3:"跁";s:2:"";s:3:"軘";s:2:"";s:3:"軞";s:2:"";s:3:"軝";s:2:"";s:3:"軜";s:2:"";s:3:"軗";s:2:"";s:3:"軠";s:2:"";s:3:"軡";s:2:"";s:3:"逤";s:2:"";s:3:"逋";s:2:"";s:3:"逑";s:2:"";s:3:"逜";s:2:"";s:3:"逌";s:2:"";s:3:"逡";s:2:"";s:3:"郯";s:2:"";s:3:"郪";s:2:"";s:3:"郰";s:2:"";s:3:"郴";s:2:"";s:3:"郲";s:2:"";s:3:"郳";s:2:"";s:3:"郔";s:2:"";s:3:"郫";s:2:"";s:3:"郬";s:2:"";s:3:"郩";s:2:"";s:3:"酖";s:2:"";s:3:"酘";s:2:"";s:3:"酚";s:2:"";s:3:"酓";s:2:"";s:3:"酕";s:2:"";s:3:"釬";s:2:"";s:3:"釴";s:2:"";s:3:"釱";s:2:"";s:3:"釳";s:2:"";s:3:"釸";s:2:"";s:3:"釤";s:2:"";s:3:"釹";s:2:"";s:3:"釪";s:2:"@";s:3:"釫";s:2:"A";s:3:"釷";s:2:"B";s:3:"釨";s:2:"C";s:3:"釮";s:2:"D";s:3:"镺";s:2:"E";s:3:"閆";s:2:"F";s:3:"閈";s:2:"G";s:3:"陼";s:2:"H";s:3:"陭";s:2:"I";s:3:"陫";s:2:"J";s:3:"陱";s:2:"K";s:3:"陯";s:2:"L";s:3:"隿";s:2:"M";s:3:"靪";s:2:"N";s:3:"頄";s:2:"O";s:3:"飥";s:2:"P";s:3:"馗";s:2:"Q";s:3:"傛";s:2:"R";s:3:"傕";s:2:"S";s:3:"傔";s:2:"T";s:3:"傞";s:2:"U";s:3:"傋";s:2:"V";s:3:"傣";s:2:"W";s:3:"傃";s:2:"X";s:3:"傌";s:2:"Y";s:3:"傎";s:2:"Z";s:3:"傝";s:2:"[";s:3:"偨";s:2:"\";s:3:"傜";s:2:"]";s:3:"傒";s:2:"^";s:3:"傂";s:2:"_";s:3:"傇";s:2:"`";s:3:"兟";s:2:"a";s:3:"凔";s:2:"b";s:3:"匒";s:2:"c";s:3:"匑";s:2:"d";s:3:"厤";s:2:"e";s:3:"厧";s:2:"f";s:3:"喑";s:2:"g";s:3:"喨";s:2:"h";s:3:"喥";s:2:"i";s:3:"喭";s:2:"j";s:3:"啷";s:2:"k";s:3:"噅";s:2:"l";s:3:"喢";s:2:"m";s:3:"喓";s:2:"n";s:3:"喈";s:2:"o";s:3:"喏";s:2:"p";s:3:"喵";s:2:"q";s:3:"喁";s:2:"r";s:3:"喣";s:2:"s";s:3:"喒";s:2:"t";s:3:"喤";s:2:"u";s:3:"啽";s:2:"v";s:3:"喌";s:2:"w";s:3:"喦";s:2:"x";s:3:"啿";s:2:"y";s:3:"喕";s:2:"z";s:3:"喡";s:2:"{";s:3:"喎";s:2:"|";s:3:"圌";s:2:"}";s:3:"堩";s:2:"~";s:3:"堷";s:2:"ء";s:3:"堙";s:2:"آ";s:3:"堞";s:2:"أ";s:3:"堧";s:2:"ؤ";s:3:"堣";s:2:"إ";s:3:"堨";s:2:"ئ";s:3:"埵";s:2:"ا";s:3:"塈";s:2:"ب";s:3:"堥";s:2:"ة";s:3:"堜";s:2:"ت";s:3:"堛";s:2:"ث";s:3:"堳";s:2:"ج";s:3:"堿";s:2:"ح";s:3:"堶";s:2:"خ";s:3:"堮";s:2:"د";s:3:"堹";s:2:"ذ";s:3:"堸";s:2:"ر";s:3:"堭";s:2:"ز";s:3:"堬";s:2:"س";s:3:"堻";s:2:"ش";s:3:"奡";s:2:"ص";s:3:"媯";s:2:"ض";s:3:"媔";s:2:"ط";s:3:"媟";s:2:"ظ";s:3:"婺";s:2:"ع";s:3:"媢";s:2:"غ";s:3:"媞";s:2:"ػ";s:3:"婸";s:2:"ؼ";s:3:"媦";s:2:"ؽ";s:3:"婼";s:2:"ؾ";s:3:"媥";s:2:"ؿ";s:3:"媬";s:2:"";s:3:"媕";s:2:"";s:3:"媮";s:2:"";s:3:"娷";s:2:"";s:3:"媄";s:2:"";s:3:"媊";s:2:"";s:3:"媗";s:2:"";s:3:"媃";s:2:"";s:3:"媋";s:2:"";s:3:"媩";s:2:"";s:3:"婻";s:2:"";s:3:"婽";s:2:"";s:3:"媌";s:2:"";s:3:"媜";s:2:"";s:3:"媏";s:2:"";s:3:"媓";s:2:"";s:3:"媝";s:2:"";s:3:"寪";s:2:"";s:3:"寍";s:2:"";s:3:"寋";s:2:"";s:3:"寔";s:2:"";s:3:"寑";s:2:"";s:3:"寊";s:2:"";s:3:"寎";s:2:"";s:3:"尌";s:2:"";s:3:"尰";s:2:"";s:3:"崷";s:2:"";s:3:"嵃";s:2:"";s:3:"嵫";s:2:"";s:3:"嵁";s:2:"";s:3:"嵋";s:2:"";s:3:"崿";s:2:"";s:3:"崵";s:2:"";s:3:"嵑";s:2:"";s:3:"嵎";s:2:"";s:3:"嵕";s:2:"";s:3:"崳";s:2:"";s:3:"崺";s:2:"";s:3:"嵒";s:2:"";s:3:"崽";s:2:"";s:3:"崱";s:2:"";s:3:"嵙";s:2:"";s:3:"嵂";s:2:"";s:3:"崹";s:2:"";s:3:"嵉";s:2:"";s:3:"崸";s:2:"";s:3:"崼";s:2:"";s:3:"崲";s:2:"";s:3:"崶";s:2:"";s:3:"嵀";s:2:"";s:3:"嵅";s:2:"";s:3:"幄";s:2:"";s:3:"幁";s:2:"";s:3:"彘";s:2:"";s:3:"徦";s:2:"";s:3:"徥";s:2:"";s:3:"徫";s:2:"";s:3:"惉";s:2:"";s:3:"悹";s:2:"";s:3:"惌";s:2:"";s:3:"惢";s:2:"";s:3:"惎";s:2:"";s:3:"惄";s:2:"";s:3:"愔";s:2:"@";s:3:"惲";s:2:"A";s:3:"愊";s:2:"B";s:3:"愖";s:2:"C";s:3:"愅";s:2:"D";s:3:"惵";s:2:"E";s:3:"愓";s:2:"F";s:3:"惸";s:2:"G";s:3:"惼";s:2:"H";s:3:"惾";s:2:"I";s:3:"惁";s:2:"J";s:3:"愃";s:2:"K";s:3:"愘";s:2:"L";s:3:"愝";s:2:"M";s:3:"愐";s:2:"N";s:3:"惿";s:2:"O";s:3:"愄";s:2:"P";s:3:"愋";s:2:"Q";s:3:"扊";s:2:"R";s:3:"掔";s:2:"S";s:3:"掱";s:2:"T";s:3:"掰";s:2:"U";s:3:"揎";s:2:"V";s:3:"揥";s:2:"W";s:3:"揨";s:2:"X";s:3:"揯";s:2:"Y";s:3:"揃";s:2:"Z";s:3:"撝";s:2:"[";s:3:"揳";s:2:"\";s:3:"揊";s:2:"]";s:3:"揠";s:2:"^";s:3:"揶";s:2:"_";s:3:"揕";s:2:"`";s:3:"揲";s:2:"a";s:3:"揵";s:2:"b";s:3:"摡";s:2:"c";s:3:"揟";s:2:"d";s:3:"掾";s:2:"e";s:3:"揝";s:2:"f";s:3:"揜";s:2:"g";s:3:"揄";s:2:"h";s:3:"揘";s:2:"i";s:3:"揓";s:2:"j";s:3:"揂";s:2:"k";s:3:"揇";s:2:"l";s:3:"揌";s:2:"m";s:3:"揋";s:2:"n";s:3:"揈";s:2:"o";s:3:"揰";s:2:"p";s:3:"揗";s:2:"q";s:3:"揙";s:2:"r";s:3:"攲";s:2:"s";s:3:"敧";s:2:"t";s:3:"敪";s:2:"u";s:3:"敤";s:2:"v";s:3:"敜";s:2:"w";s:3:"敨";s:2:"x";s:3:"敥";s:2:"y";s:3:"斌";s:2:"z";s:3:"斝";s:2:"{";s:3:"斞";s:2:"|";s:3:"斮";s:2:"}";s:3:"旐";s:2:"~";s:3:"旒";s:2:"١";s:3:"晼";s:2:"٢";s:3:"晬";s:2:"٣";s:3:"晻";s:2:"٤";s:3:"暀";s:2:"٥";s:3:"晱";s:2:"٦";s:3:"晹";s:2:"٧";s:3:"晪";s:2:"٨";s:3:"晲";s:2:"٩";s:3:"朁";s:2:"٪";s:3:"椌";s:2:"٫";s:3:"棓";s:2:"٬";s:3:"椄";s:2:"٭";s:3:"棜";s:2:"ٮ";s:3:"椪";s:2:"ٯ";s:3:"棬";s:2:"ٰ";s:3:"棪";s:2:"ٱ";s:3:"棱";s:2:"ٲ";s:3:"椏";s:2:"ٳ";s:3:"棖";s:2:"ٴ";s:3:"棷";s:2:"ٵ";s:3:"棫";s:2:"ٶ";s:3:"棤";s:2:"ٷ";s:3:"棶";s:2:"ٸ";s:3:"椓";s:2:"ٹ";s:3:"椐";s:2:"ٺ";s:3:"棳";s:2:"ٻ";s:3:"棡";s:2:"ټ";s:3:"椇";s:2:"ٽ";s:3:"棌";s:2:"پ";s:3:"椈";s:2:"ٿ";s:3:"楰";s:2:"";s:3:"梴";s:2:"";s:3:"椑";s:2:"";s:3:"棯";s:2:"";s:3:"棆";s:2:"";s:3:"椔";s:2:"";s:3:"棸";s:2:"";s:3:"棐";s:2:"";s:3:"棽";s:2:"";s:3:"棼";s:2:"";s:3:"棨";s:2:"";s:3:"椋";s:2:"";s:3:"椊";s:2:"";s:3:"椗";s:2:"";s:3:"棎";s:2:"";s:3:"棈";s:2:"";s:3:"棝";s:2:"";s:3:"棞";s:2:"";s:3:"棦";s:2:"";s:3:"棴";s:2:"";s:3:"棑";s:2:"";s:3:"椆";s:2:"";s:3:"棔";s:2:"";s:3:"棩";s:2:"";s:3:"椕";s:2:"";s:3:"椥";s:2:"";s:3:"棇";s:2:"";s:3:"欹";s:2:"";s:3:"欻";s:2:"";s:3:"欿";s:2:"";s:3:"欼";s:2:"";s:3:"殔";s:2:"";s:3:"殗";s:2:"";s:3:"殙";s:2:"";s:3:"殕";s:2:"";s:3:"殽";s:2:"";s:3:"毰";s:2:"";s:3:"毲";s:2:"";s:3:"毳";s:2:"";s:3:"氰";s:2:"";s:3:"淼";s:2:"";s:3:"湆";s:2:"";s:3:"湇";s:2:"";s:3:"渟";s:2:"";s:3:"湉";s:2:"";s:3:"溈";s:2:"";s:3:"渼";s:2:"";s:3:"渽";s:2:"";s:3:"湅";s:2:"";s:3:"湢";s:2:"";s:3:"渫";s:2:"";s:3:"渿";s:2:"";s:3:"湁";s:2:"";s:3:"湝";s:2:"";s:3:"湳";s:2:"";s:3:"渜";s:2:"";s:3:"渳";s:2:"";s:3:"湋";s:2:"";s:3:"湀";s:2:"";s:3:"湑";s:2:"";s:3:"渻";s:2:"";s:3:"渃";s:2:"";s:3:"渮";s:2:"";s:3:"湞";s:2:"@";s:3:"湨";s:2:"A";s:3:"湜";s:2:"B";s:3:"湡";s:2:"C";s:3:"渱";s:2:"D";s:3:"渨";s:2:"E";s:3:"湠";s:2:"F";s:3:"湱";s:2:"G";s:3:"湫";s:2:"H";s:3:"渹";s:2:"I";s:3:"渢";s:2:"J";s:3:"渰";s:2:"K";s:3:"湓";s:2:"L";s:3:"湥";s:2:"M";s:3:"渧";s:2:"N";s:3:"湸";s:2:"O";s:3:"湤";s:2:"P";s:3:"湷";s:2:"Q";s:3:"湕";s:2:"R";s:3:"湹";s:2:"S";s:3:"湒";s:2:"T";s:3:"湦";s:2:"U";s:3:"渵";s:2:"V";s:3:"渶";s:2:"W";s:3:"湚";s:2:"X";s:3:"焠";s:2:"Y";s:3:"焞";s:2:"Z";s:3:"焯";s:2:"[";s:3:"烻";s:2:"\";s:3:"焮";s:2:"]";s:3:"焱";s:2:"^";s:3:"焣";s:2:"_";s:3:"焥";s:2:"`";s:3:"焢";s:2:"a";s:3:"焲";s:2:"b";s:3:"焟";s:2:"c";s:3:"焨";s:2:"d";s:3:"焺";s:2:"e";s:3:"焛";s:2:"f";s:3:"牋";s:2:"g";s:3:"牚";s:2:"h";s:3:"犈";s:2:"i";s:3:"犉";s:2:"j";s:3:"犆";s:2:"k";s:3:"犅";s:2:"l";s:3:"犋";s:2:"m";s:3:"猒";s:2:"n";s:3:"猋";s:2:"o";s:3:"猰";s:2:"p";s:3:"猢";s:2:"q";s:3:"猱";s:2:"r";s:3:"猳";s:2:"s";s:3:"猧";s:2:"t";s:3:"猲";s:2:"u";s:3:"猭";s:2:"v";s:3:"猦";s:2:"w";s:3:"猣";s:2:"x";s:3:"猵";s:2:"y";s:3:"猌";s:2:"z";s:3:"琮";s:2:"{";s:3:"琬";s:2:"|";s:3:"琰";s:2:"}";s:3:"琫";s:2:"~";s:3:"琖";s:2:"ڡ";s:3:"琚";s:2:"ڢ";s:3:"琡";s:2:"ڣ";s:3:"琭";s:2:"ڤ";s:3:"琱";s:2:"ڥ";s:3:"琤";s:2:"ڦ";s:3:"琣";s:2:"ڧ";s:3:"琝";s:2:"ڨ";s:3:"琩";s:2:"ک";s:3:"琠";s:2:"ڪ";s:3:"琲";s:2:"ګ";s:3:"瓻";s:2:"ڬ";s:3:"甯";s:2:"ڭ";s:3:"畯";s:2:"ڮ";s:3:"畬";s:2:"گ";s:3:"痧";s:2:"ڰ";s:3:"痚";s:2:"ڱ";s:3:"痡";s:2:"ڲ";s:3:"痦";s:2:"ڳ";s:3:"痝";s:2:"ڴ";s:3:"痟";s:2:"ڵ";s:3:"痤";s:2:"ڶ";s:3:"痗";s:2:"ڷ";s:3:"皕";s:2:"ڸ";s:3:"皒";s:2:"ڹ";s:3:"盚";s:2:"ں";s:3:"睆";s:2:"ڻ";s:3:"睇";s:2:"ڼ";s:3:"睄";s:2:"ڽ";s:3:"睍";s:2:"ھ";s:3:"睅";s:2:"ڿ";s:3:"睊";s:2:"";s:3:"睎";s:2:"";s:3:"睋";s:2:"";s:3:"睌";s:2:"";s:3:"矞";s:2:"";s:3:"矬";s:2:"";s:3:"硠";s:2:"";s:3:"硤";s:2:"";s:3:"硥";s:2:"";s:3:"硜";s:2:"";s:3:"硭";s:2:"";s:3:"硱";s:2:"";s:3:"硪";s:2:"";s:3:"确";s:2:"";s:3:"硰";s:2:"";s:3:"硩";s:2:"";s:3:"硨";s:2:"";s:3:"硞";s:2:"";s:3:"硢";s:2:"";s:3:"祴";s:2:"";s:3:"祳";s:2:"";s:3:"祲";s:2:"";s:3:"祰";s:2:"";s:3:"稂";s:2:"";s:3:"稊";s:2:"";s:3:"稃";s:2:"";s:3:"稌";s:2:"";s:3:"稄";s:2:"";s:3:"窙";s:2:"";s:3:"竦";s:2:"";s:3:"竤";s:2:"";s:3:"筊";s:2:"";s:3:"笻";s:2:"";s:3:"筄";s:2:"";s:3:"筈";s:2:"";s:3:"筌";s:2:"";s:3:"筎";s:2:"";s:3:"筀";s:2:"";s:3:"筘";s:2:"";s:3:"筅";s:2:"";s:3:"粢";s:2:"";s:3:"粞";s:2:"";s:3:"粨";s:2:"";s:3:"粡";s:2:"";s:3:"絘";s:2:"";s:3:"絯";s:2:"";s:3:"絣";s:2:"";s:3:"絓";s:2:"";s:3:"絖";s:2:"";s:3:"絧";s:2:"";s:3:"絪";s:2:"";s:3:"絏";s:2:"";s:3:"絭";s:2:"";s:3:"絜";s:2:"";s:3:"絫";s:2:"";s:3:"絒";s:2:"";s:3:"絔";s:2:"";s:3:"絩";s:2:"";s:3:"絑";s:2:"";s:3:"絟";s:2:"";s:3:"絎";s:2:"";s:3:"缾";s:2:"";s:3:"缿";s:2:"";s:3:"罥";s:2:"@";s:3:"罦";s:2:"A";s:3:"羢";s:2:"B";s:3:"羠";s:2:"C";s:3:"羡";s:2:"D";s:3:"翗";s:2:"E";s:3:"聑";s:2:"F";s:3:"聏";s:2:"G";s:3:"聐";s:2:"H";s:3:"胾";s:2:"I";s:3:"胔";s:2:"J";s:3:"腃";s:2:"K";s:3:"腊";s:2:"L";s:3:"腒";s:2:"M";s:3:"腏";s:2:"N";s:3:"腇";s:2:"O";s:3:"脽";s:2:"P";s:3:"腍";s:2:"Q";s:3:"脺";s:2:"R";s:3:"臦";s:2:"S";s:3:"臮";s:2:"T";s:3:"臷";s:2:"U";s:3:"臸";s:2:"V";s:3:"臹";s:2:"W";s:3:"舄";s:2:"X";s:3:"舼";s:2:"Y";s:3:"舽";s:2:"Z";s:3:"舿";s:2:"[";s:3:"艵";s:2:"\";s:3:"茻";s:2:"]";s:3:"菏";s:2:"^";s:3:"菹";s:2:"_";s:3:"萣";s:2:"`";s:3:"菀";s:2:"a";s:3:"菨";s:2:"b";s:3:"萒";s:2:"c";s:3:"菧";s:2:"d";s:3:"菤";s:2:"e";s:3:"菼";s:2:"f";s:3:"菶";s:2:"g";s:3:"萐";s:2:"h";s:3:"菆";s:2:"i";s:3:"菈";s:2:"j";s:3:"菫";s:2:"k";s:3:"菣";s:2:"l";s:3:"莿";s:2:"m";s:3:"萁";s:2:"n";s:3:"菝";s:2:"o";s:3:"菥";s:2:"p";s:3:"菘";s:2:"q";s:3:"菿";s:2:"r";s:3:"菡";s:2:"s";s:3:"菋";s:2:"t";s:3:"菎";s:2:"u";s:3:"菖";s:2:"v";s:3:"菵";s:2:"w";s:3:"菉";s:2:"x";s:3:"萉";s:2:"y";s:3:"萏";s:2:"z";s:3:"菞";s:2:"{";s:3:"萑";s:2:"|";s:3:"萆";s:2:"}";s:3:"菂";s:2:"~";s:3:"菳";s:2:"ۡ";s:3:"菕";s:2:"ۢ";s:3:"菺";s:2:"ۣ";s:3:"菇";s:2:"ۤ";s:3:"菑";s:2:"ۥ";s:3:"菪";s:2:"ۦ";s:3:"萓";s:2:"ۧ";s:3:"菃";s:2:"ۨ";s:3:"菬";s:2:"۩";s:3:"菮";s:2:"۪";s:3:"菄";s:2:"۫";s:3:"菻";s:2:"۬";s:3:"菗";s:2:"ۭ";s:3:"菢";s:2:"ۮ";s:3:"萛";s:2:"ۯ";s:3:"菛";s:2:"۰";s:3:"菾";s:2:"۱";s:3:"蛘";s:2:"۲";s:3:"蛢";s:2:"۳";s:3:"蛦";s:2:"۴";s:3:"蛓";s:2:"۵";s:3:"蛣";s:2:"۶";s:3:"蛚";s:2:"۷";s:3:"蛪";s:2:"۸";s:3:"蛝";s:2:"۹";s:3:"蛫";s:2:"ۺ";s:3:"蛜";s:2:"ۻ";s:3:"蛬";s:2:"ۼ";s:3:"蛩";s:2:"۽";s:3:"蛗";s:2:"۾";s:3:"蛨";s:2:"ۿ";s:3:"蛑";s:2:"";s:3:"衈";s:2:"";s:3:"衖";s:2:"";s:3:"衕";s:2:"";s:3:"袺";s:2:"";s:3:"裗";s:2:"";s:3:"袹";s:2:"";s:3:"袸";s:2:"";s:3:"裀";s:2:"";s:3:"袾";s:2:"";s:3:"袶";s:2:"";s:3:"袼";s:2:"";s:3:"袷";s:2:"";s:3:"袽";s:2:"";s:3:"袲";s:2:"";s:3:"褁";s:2:"";s:3:"裉";s:2:"";s:3:"覕";s:2:"";s:3:"覘";s:2:"";s:3:"覗";s:2:"";s:3:"觝";s:2:"";s:3:"觚";s:2:"";s:3:"觛";s:2:"";s:3:"詎";s:2:"";s:3:"詍";s:2:"";s:3:"訹";s:2:"";s:3:"詙";s:2:"";s:3:"詀";s:2:"";s:3:"詗";s:2:"";s:3:"詘";s:2:"";s:3:"詄";s:2:"";s:3:"詅";s:2:"";s:3:"詒";s:2:"";s:3:"詈";s:2:"";s:3:"詑";s:2:"";s:3:"詊";s:2:"";s:3:"詌";s:2:"";s:3:"詏";s:2:"";s:3:"豟";s:2:"";s:3:"貁";s:2:"";s:3:"貀";s:2:"";s:3:"貺";s:2:"";s:3:"貾";s:2:"";s:3:"貰";s:2:"";s:3:"貹";s:2:"";s:3:"貵";s:2:"";s:3:"趄";s:2:"";s:3:"趀";s:2:"";s:3:"趉";s:2:"";s:3:"跘";s:2:"";s:3:"跓";s:2:"";s:3:"跍";s:2:"";s:3:"跇";s:2:"";s:3:"跖";s:2:"";s:3:"跜";s:2:"";s:3:"跏";s:2:"";s:3:"跕";s:2:"";s:3:"跙";s:2:"";s:3:"跈";s:2:"";s:3:"跗";s:2:"";s:3:"跅";s:2:"";s:3:"軯";s:2:"";s:3:"軷";s:2:"";s:3:"軺";s:2:"@";s:3:"軹";s:2:"A";s:3:"軦";s:2:"B";s:3:"軮";s:2:"C";s:3:"軥";s:2:"D";s:3:"軵";s:2:"E";s:3:"軧";s:2:"F";s:3:"軨";s:2:"G";s:3:"軶";s:2:"H";s:3:"軫";s:2:"I";s:3:"軱";s:2:"J";s:3:"軬";s:2:"K";s:3:"軴";s:2:"L";s:3:"軩";s:2:"M";s:3:"逭";s:2:"N";s:3:"逴";s:2:"O";s:3:"逯";s:2:"P";s:3:"鄆";s:2:"Q";s:3:"鄬";s:2:"R";s:3:"鄄";s:2:"S";s:3:"郿";s:2:"T";s:3:"郼";s:2:"U";s:3:"鄈";s:2:"V";s:3:"郹";s:2:"W";s:3:"郻";s:2:"X";s:3:"鄁";s:2:"Y";s:3:"鄀";s:2:"Z";s:3:"鄇";s:2:"[";s:3:"鄅";s:2:"\";s:3:"鄃";s:2:"]";s:3:"酡";s:2:"^";s:3:"酤";s:2:"_";s:3:"酟";s:2:"`";s:3:"酢";s:2:"a";s:3:"酠";s:2:"b";s:3:"鈁";s:2:"c";s:3:"鈊";s:2:"d";s:3:"鈥";s:2:"e";s:3:"鈃";s:2:"f";s:3:"鈚";s:2:"g";s:3:"鈦";s:2:"h";s:3:"鈏";s:2:"i";s:3:"鈌";s:2:"j";s:3:"鈀";s:2:"k";s:3:"鈒";s:2:"l";s:3:"釿";s:2:"m";s:3:"釽";s:2:"n";s:3:"鈆";s:2:"o";s:3:"鈄";s:2:"p";s:3:"鈧";s:2:"q";s:3:"鈂";s:2:"r";s:3:"鈜";s:2:"s";s:3:"鈤";s:2:"t";s:3:"鈙";s:2:"u";s:3:"鈗";s:2:"v";s:3:"鈅";s:2:"w";s:3:"鈖";s:2:"x";s:3:"镻";s:2:"y";s:3:"閍";s:2:"z";s:3:"閌";s:2:"{";s:3:"閐";s:2:"|";s:3:"隇";s:2:"}";s:3:"陾";s:2:"~";s:3:"隈";s:2:"ܡ";s:3:"隉";s:2:"ܢ";s:3:"隃";s:2:"ܣ";s:3:"隀";s:2:"ܤ";s:3:"雂";s:2:"ܥ";s:3:"雈";s:2:"ܦ";s:3:"雃";s:2:"ܧ";s:3:"雱";s:2:"ܨ";s:3:"雰";s:2:"ܩ";s:3:"靬";s:2:"ܪ";s:3:"靰";s:2:"ܫ";s:3:"靮";s:2:"ܬ";s:3:"頇";s:2:"ܭ";s:3:"颩";s:2:"ܮ";s:3:"飫";s:2:"ܯ";s:3:"鳦";s:2:"ܰ";s:3:"黹";s:2:"ܱ";s:3:"亃";s:2:"ܲ";s:3:"亄";s:2:"ܳ";s:3:"亶";s:2:"ܴ";s:3:"傽";s:2:"ܵ";s:3:"傿";s:2:"ܶ";s:3:"僆";s:2:"ܷ";s:3:"傮";s:2:"ܸ";s:3:"僄";s:2:"ܹ";s:3:"僊";s:2:"ܺ";s:3:"傴";s:2:"ܻ";s:3:"僈";s:2:"ܼ";s:3:"僂";s:2:"ܽ";s:3:"傰";s:2:"ܾ";s:3:"僁";s:2:"ܿ";s:3:"傺";s:2:"";s:3:"傱";s:2:"";s:3:"僋";s:2:"";s:3:"僉";s:2:"";s:3:"傶";s:2:"";s:3:"傸";s:2:"";s:3:"凗";s:2:"";s:3:"剺";s:2:"";s:3:"剸";s:2:"";s:3:"剻";s:2:"";s:3:"剼";s:2:"";s:3:"嗃";s:2:"";s:3:"嗛";s:2:"";s:3:"嗌";s:2:"";s:3:"嗐";s:2:"";s:3:"嗋";s:2:"";s:3:"嗊";s:2:"";s:3:"嗝";s:2:"";s:3:"嗀";s:2:"";s:3:"嗔";s:2:"";s:3:"嗄";s:2:"";s:3:"嗩";s:2:"";s:3:"喿";s:2:"";s:3:"嗒";s:2:"";s:3:"喍";s:2:"";s:3:"嗏";s:2:"";s:3:"嗕";s:2:"";s:3:"嗢";s:2:"";s:3:"嗖";s:2:"";s:3:"嗈";s:2:"";s:3:"嗲";s:2:"";s:3:"嗍";s:2:"";s:3:"嗙";s:2:"";s:3:"嗂";s:2:"";s:3:"圔";s:2:"";s:3:"塓";s:2:"";s:3:"塨";s:2:"";s:3:"塤";s:2:"";s:3:"塏";s:2:"";s:3:"塍";s:2:"";s:3:"塉";s:2:"";s:3:"塯";s:2:"";s:3:"塕";s:2:"";s:3:"塎";s:2:"";s:3:"塝";s:2:"";s:3:"塙";s:2:"";s:3:"塥";s:2:"";s:3:"塛";s:2:"";s:3:"堽";s:2:"";s:3:"塣";s:2:"";s:3:"塱";s:2:"";s:3:"壼";s:2:"";s:3:"嫇";s:2:"";s:3:"嫄";s:2:"";s:3:"嫋";s:2:"";s:3:"媺";s:2:"";s:3:"媸";s:2:"";s:3:"媱";s:2:"";s:3:"媵";s:2:"";s:3:"媰";s:2:"";s:3:"媿";s:2:"";s:3:"嫈";s:2:"";s:3:"媻";s:2:"";s:3:"嫆";s:2:"@";s:3:"媷";s:2:"A";s:3:"嫀";s:2:"B";s:3:"嫊";s:2:"C";s:3:"媴";s:2:"D";s:3:"媶";s:2:"E";s:3:"嫍";s:2:"F";s:3:"媹";s:2:"G";s:3:"媐";s:2:"H";s:3:"寖";s:2:"I";s:3:"寘";s:2:"J";s:3:"寙";s:2:"K";s:3:"尟";s:2:"L";s:3:"尳";s:2:"M";s:3:"嵱";s:2:"N";s:3:"嵣";s:2:"O";s:3:"嵊";s:2:"P";s:3:"嵥";s:2:"Q";s:3:"嵲";s:2:"R";s:3:"嵬";s:2:"S";s:3:"嵞";s:2:"T";s:3:"嵨";s:2:"U";s:3:"嵧";s:2:"V";s:3:"嵢";s:2:"W";s:3:"巰";s:2:"X";s:3:"幏";s:2:"Y";s:3:"幎";s:2:"Z";s:3:"幊";s:2:"[";s:3:"幍";s:2:"\";s:3:"幋";s:2:"]";s:3:"廅";s:2:"^";s:3:"廌";s:2:"_";s:3:"廆";s:2:"`";s:3:"廋";s:2:"a";s:3:"廇";s:2:"b";s:3:"彀";s:2:"c";s:3:"徯";s:2:"d";s:3:"徭";s:2:"e";s:3:"惷";s:2:"f";s:3:"慉";s:2:"g";s:3:"慊";s:2:"h";s:3:"愫";s:2:"i";s:3:"慅";s:2:"j";s:3:"愶";s:2:"k";s:3:"愲";s:2:"l";s:3:"愮";s:2:"m";s:3:"慆";s:2:"n";s:3:"愯";s:2:"o";s:3:"慏";s:2:"p";s:3:"愩";s:2:"q";s:3:"慀";s:2:"r";s:3:"戠";s:2:"s";s:3:"酨";s:2:"t";s:3:"戣";s:2:"u";s:3:"戥";s:2:"v";s:3:"戤";s:2:"w";s:3:"揅";s:2:"x";s:3:"揱";s:2:"y";s:3:"揫";s:2:"z";s:3:"搐";s:2:"{";s:3:"搒";s:2:"|";s:3:"搉";s:2:"}";s:3:"搠";s:2:"~";s:3:"搤";s:2:"ݡ";s:3:"搳";s:2:"ݢ";s:3:"摃";s:2:"ݣ";s:3:"搟";s:2:"ݤ";s:3:"搕";s:2:"ݥ";s:3:"搘";s:2:"ݦ";s:3:"搹";s:2:"ݧ";s:3:"搷";s:2:"ݨ";s:3:"搢";s:2:"ݩ";s:3:"搣";s:2:"ݪ";s:3:"搌";s:2:"ݫ";s:3:"搦";s:2:"ݬ";s:3:"搰";s:2:"ݭ";s:3:"搨";s:2:"ݮ";s:3:"摁";s:2:"ݯ";s:3:"搵";s:2:"ݰ";s:3:"搯";s:2:"ݱ";s:3:"搊";s:2:"ݲ";s:3:"搚";s:2:"ݳ";s:3:"摀";s:2:"ݴ";s:3:"搥";s:2:"ݵ";s:3:"搧";s:2:"ݶ";s:3:"搋";s:2:"ݷ";s:3:"揧";s:2:"ݸ";s:3:"搛";s:2:"ݹ";s:3:"搮";s:2:"ݺ";s:3:"搡";s:2:"ݻ";s:3:"搎";s:2:"ݼ";s:3:"敯";s:2:"ݽ";s:3:"斒";s:2:"ݾ";s:3:"旓";s:2:"ݿ";s:3:"暆";s:2:"";s:3:"暌";s:2:"";s:3:"暕";s:2:"";s:3:"暐";s:2:"";s:3:"暋";s:2:"";s:3:"暊";s:2:"";s:3:"暙";s:2:"";s:3:"暔";s:2:"";s:3:"晸";s:2:"";s:3:"朠";s:2:"";s:3:"楦";s:2:"";s:3:"楟";s:2:"";s:3:"椸";s:2:"";s:3:"楎";s:2:"";s:3:"楢";s:2:"";s:3:"楱";s:2:"";s:3:"椿";s:2:"";s:3:"楅";s:2:"";s:3:"楪";s:2:"";s:3:"椹";s:2:"";s:3:"楂";s:2:"";s:3:"楗";s:2:"";s:3:"楙";s:2:"";s:3:"楺";s:2:"";s:3:"楈";s:2:"";s:3:"楉";s:2:"";s:3:"椵";s:2:"";s:3:"楬";s:2:"";s:3:"椳";s:2:"";s:3:"椽";s:2:"";s:3:"楥";s:2:"";s:3:"棰";s:2:"";s:3:"楸";s:2:"";s:3:"椴";s:2:"";s:3:"楩";s:2:"";s:3:"楀";s:2:"";s:3:"楯";s:2:"";s:3:"楄";s:2:"";s:3:"楶";s:2:"";s:3:"楘";s:2:"";s:3:"楁";s:2:"";s:3:"楴";s:2:"";s:3:"楌";s:2:"";s:3:"椻";s:2:"";s:3:"楋";s:2:"";s:3:"椷";s:2:"";s:3:"楜";s:2:"";s:3:"楏";s:2:"";s:3:"楑";s:2:"";s:3:"椲";s:2:"";s:3:"楒";s:2:"";s:3:"椯";s:2:"";s:3:"楻";s:2:"";s:3:"椼";s:2:"";s:3:"歆";s:2:"";s:3:"歅";s:2:"";s:3:"歃";s:2:"";s:3:"歂";s:2:"";s:3:"歈";s:2:"";s:3:"歁";s:2:"";s:3:"殛";s:2:"";s:3:"嗀";s:2:"";s:3:"毻";s:2:"";s:3:"毼";s:2:"@";s:3:"毹";s:2:"A";s:3:"毷";s:2:"B";s:3:"毸";s:2:"C";s:3:"溛";s:2:"D";s:3:"滖";s:2:"E";s:3:"滈";s:2:"F";s:3:"溏";s:2:"G";s:3:"滀";s:2:"H";s:3:"溟";s:2:"I";s:3:"溓";s:2:"J";s:3:"溔";s:2:"K";s:3:"溠";s:2:"L";s:3:"溱";s:2:"M";s:3:"溹";s:2:"N";s:3:"滆";s:2:"O";s:3:"滒";s:2:"P";s:3:"溽";s:2:"Q";s:3:"滁";s:2:"R";s:3:"溞";s:2:"S";s:3:"滉";s:2:"T";s:3:"溷";s:2:"U";s:3:"溰";s:2:"V";s:3:"滍";s:2:"W";s:3:"溦";s:2:"X";s:3:"滏";s:2:"Y";s:3:"溲";s:2:"Z";s:3:"溾";s:2:"[";s:3:"滃";s:2:"\";s:3:"滜";s:2:"]";s:3:"滘";s:2:"^";s:3:"溙";s:2:"_";s:3:"溒";s:2:"`";s:3:"溎";s:2:"a";s:3:"溍";s:2:"b";s:3:"溤";s:2:"c";s:3:"溡";s:2:"d";s:3:"溿";s:2:"e";s:3:"溳";s:2:"f";s:3:"滐";s:2:"g";s:3:"滊";s:2:"h";s:3:"溗";s:2:"i";s:3:"溮";s:2:"j";s:3:"溣";s:2:"k";s:3:"煇";s:2:"l";s:3:"煔";s:2:"m";s:3:"煒";s:2:"n";s:3:"煣";s:2:"o";s:3:"煠";s:2:"p";s:3:"煁";s:2:"q";s:3:"煝";s:2:"r";s:3:"煢";s:2:"s";s:3:"煲";s:2:"t";s:3:"煸";s:2:"u";s:3:"煪";s:2:"v";s:3:"煡";s:2:"w";s:3:"煂";s:2:"x";s:3:"煘";s:2:"y";s:3:"煃";s:2:"z";s:3:"煋";s:2:"{";s:3:"煰";s:2:"|";s:3:"煟";s:2:"}";s:3:"煐";s:2:"~";s:3:"煓";s:2:"ޡ";s:3:"煄";s:2:"ޢ";s:3:"煍";s:2:"ޣ";s:3:"煚";s:2:"ޤ";s:3:"牏";s:2:"ޥ";s:3:"犍";s:2:"ަ";s:3:"犌";s:2:"ާ";s:3:"犑";s:2:"ި";s:3:"犐";s:2:"ީ";s:3:"犎";s:2:"ު";s:3:"猼";s:2:"ޫ";s:3:"獂";s:2:"ެ";s:3:"猻";s:2:"ޭ";s:3:"猺";s:2:"ޮ";s:3:"獀";s:2:"ޯ";s:3:"獊";s:2:"ް";s:3:"獉";s:2:"ޱ";s:3:"瑄";s:2:"޲";s:3:"瑊";s:2:"޳";s:3:"瑋";s:2:"޴";s:3:"瑒";s:2:"޵";s:3:"瑑";s:2:"޶";s:3:"瑗";s:2:"޷";s:3:"瑀";s:2:"޸";s:3:"瑏";s:2:"޹";s:3:"瑐";s:2:"޺";s:3:"瑎";s:2:"޻";s:3:"瑂";s:2:"޼";s:3:"瑆";s:2:"޽";s:3:"瑍";s:2:"޾";s:3:"瑔";s:2:"޿";s:3:"瓡";s:2:"";s:3:"瓿";s:2:"";s:3:"瓾";s:2:"";s:3:"瓽";s:2:"";s:3:"甝";s:2:"";s:3:"畹";s:2:"";s:3:"畷";s:2:"";s:3:"榃";s:2:"";s:3:"痯";s:2:"";s:3:"瘏";s:2:"";s:3:"瘃";s:2:"";s:3:"痷";s:2:"";s:3:"痾";s:2:"";s:3:"痼";s:2:"";s:3:"痹";s:2:"";s:3:"痸";s:2:"";s:3:"瘐";s:2:"";s:3:"痻";s:2:"";s:3:"痶";s:2:"";s:3:"痭";s:2:"";s:3:"痵";s:2:"";s:3:"痽";s:2:"";s:3:"皙";s:2:"";s:3:"皵";s:2:"";s:3:"盝";s:2:"";s:3:"睕";s:2:"";s:3:"睟";s:2:"";s:3:"睠";s:2:"";s:3:"睒";s:2:"";s:3:"睖";s:2:"";s:3:"睚";s:2:"";s:3:"睩";s:2:"";s:3:"睧";s:2:"";s:3:"睔";s:2:"";s:3:"睙";s:2:"";s:3:"睭";s:2:"";s:3:"矠";s:2:"";s:3:"碇";s:2:"";s:3:"碚";s:2:"";s:3:"碔";s:2:"";s:3:"碏";s:2:"";s:3:"碄";s:2:"";s:3:"碕";s:2:"";s:3:"碅";s:2:"";s:3:"碆";s:2:"";s:3:"碡";s:2:"";s:3:"碃";s:2:"";s:3:"硹";s:2:"";s:3:"碙";s:2:"";s:3:"碀";s:2:"";s:3:"碖";s:2:"";s:3:"硻";s:2:"";s:3:"祼";s:2:"";s:3:"禂";s:2:"";s:3:"祽";s:2:"";s:3:"祹";s:2:"";s:3:"稑";s:2:"";s:3:"稘";s:2:"";s:3:"稙";s:2:"";s:3:"稒";s:2:"";s:3:"稗";s:2:"";s:3:"稕";s:2:"";s:3:"稢";s:2:"";s:3:"稓";s:2:"@";s:3:"稛";s:2:"A";s:3:"稐";s:2:"B";s:3:"窣";s:2:"C";s:3:"窢";s:2:"D";s:3:"窞";s:2:"E";s:3:"竫";s:2:"F";s:3:"筦";s:2:"G";s:3:"筤";s:2:"H";s:3:"筭";s:2:"I";s:3:"筴";s:2:"J";s:3:"筩";s:2:"K";s:3:"筲";s:2:"L";s:3:"筥";s:2:"M";s:3:"筳";s:2:"N";s:3:"筱";s:2:"O";s:3:"筰";s:2:"P";s:3:"筡";s:2:"Q";s:3:"筸";s:2:"R";s:3:"筶";s:2:"S";s:3:"筣";s:2:"T";s:3:"粲";s:2:"U";s:3:"粴";s:2:"V";s:3:"粯";s:2:"W";s:3:"綈";s:2:"X";s:3:"綆";s:2:"Y";s:3:"綀";s:2:"Z";s:3:"綍";s:2:"[";s:3:"絿";s:2:"\";s:3:"綅";s:2:"]";s:3:"絺";s:2:"^";s:3:"綎";s:2:"_";s:3:"絻";s:2:"`";s:3:"綃";s:2:"a";s:3:"絼";s:2:"b";s:3:"綌";s:2:"c";s:3:"綔";s:2:"d";s:3:"綄";s:2:"e";s:3:"絽";s:2:"f";s:3:"綒";s:2:"g";s:3:"罭";s:2:"h";s:3:"罫";s:2:"i";s:3:"罧";s:2:"j";s:3:"罨";s:2:"k";s:3:"罬";s:2:"l";s:3:"羦";s:2:"m";s:3:"羥";s:2:"n";s:3:"羧";s:2:"o";s:3:"翛";s:2:"p";s:3:"翜";s:2:"q";s:3:"耡";s:2:"r";s:3:"腤";s:2:"s";s:3:"腠";s:2:"t";s:3:"腷";s:2:"u";s:3:"腜";s:2:"v";s:3:"腩";s:2:"w";s:3:"腛";s:2:"x";s:3:"腢";s:2:"y";s:3:"腲";s:2:"z";s:3:"朡";s:2:"{";s:3:"腞";s:2:"|";s:3:"腶";s:2:"}";s:3:"腧";s:2:"~";s:3:"腯";s:2:"ߡ";s:3:"腄";s:2:"ߢ";s:3:"腡";s:2:"ߣ";s:3:"舝";s:2:"ߤ";s:3:"艉";s:2:"ߥ";s:3:"艄";s:2:"ߦ";s:3:"艀";s:2:"ߧ";s:3:"艂";s:2:"ߨ";s:3:"艅";s:2:"ߩ";s:3:"蓱";s:2:"ߪ";s:3:"萿";s:2:"߫";s:3:"葖";s:2:"߬";s:3:"葶";s:2:"߭";s:3:"葹";s:2:"߮";s:3:"蒏";s:2:"߯";s:3:"蒍";s:2:"߰";s:3:"葥";s:2:"߱";s:3:"葑";s:2:"߲";s:3:"葀";s:2:"߳";s:3:"蒆";s:2:"ߴ";s:3:"葧";s:2:"ߵ";s:3:"萰";s:2:"߶";s:3:"葍";s:2:"߷";s:3:"葽";s:2:"߸";s:3:"葚";s:2:"߹";s:3:"葙";s:2:"ߺ";s:3:"葴";s:2:"߻";s:3:"葳";s:2:"߼";s:3:"葝";s:2:"߽";s:3:"蔇";s:2:"߾";s:3:"葞";s:2:"߿";s:3:"萷";s:2:"";s:3:"萺";s:2:"";s:3:"萴";s:2:"";s:3:"葺";s:2:"";s:3:"葃";s:2:"";s:3:"葸";s:2:"";s:3:"萲";s:2:"";s:3:"葅";s:2:"";s:3:"萩";s:2:"";s:3:"菙";s:2:"";s:3:"葋";s:2:"";s:3:"萯";s:2:"";s:3:"葂";s:2:"";s:3:"萭";s:2:"";s:3:"葟";s:2:"";s:3:"葰";s:2:"";s:3:"萹";s:2:"";s:3:"葎";s:2:"";s:3:"葌";s:2:"";s:3:"葒";s:2:"";s:3:"葯";s:2:"";s:3:"蓅";s:2:"";s:3:"蒎";s:2:"";s:3:"萻";s:2:"";s:3:"葇";s:2:"";s:3:"萶";s:2:"";s:3:"萳";s:2:"";s:3:"葨";s:2:"";s:3:"葾";s:2:"";s:3:"葄";s:2:"";s:3:"萫";s:2:"";s:3:"葠";s:2:"";s:3:"葔";s:2:"";s:3:"葮";s:2:"";s:3:"葐";s:2:"";s:3:"蜋";s:2:"";s:3:"蜄";s:2:"";s:3:"蛷";s:2:"";s:3:"蜌";s:2:"";s:3:"蛺";s:2:"";s:3:"蛖";s:2:"";s:3:"蛵";s:2:"";s:3:"蝍";s:2:"";s:3:"蛸";s:2:"";s:3:"蜎";s:2:"";s:3:"蜉";s:2:"";s:3:"蜁";s:2:"";s:3:"蛶";s:2:"";s:3:"蜍";s:2:"";s:3:"蜅";s:2:"";s:3:"裖";s:2:"";s:3:"裋";s:2:"";s:3:"裍";s:2:"";s:3:"裎";s:2:"";s:3:"裞";s:2:"";s:3:"裛";s:2:"";s:3:"裚";s:2:"";s:3:"裌";s:2:"";s:3:"裐";s:2:"";s:3:"覅";s:2:"";s:3:"覛";s:2:"";s:3:"觟";s:2:"";s:3:"觥";s:2:"";s:3:"觤";s:2:"@";s:3:"觡";s:2:"A";s:3:"觠";s:2:"B";s:3:"觢";s:2:"C";s:3:"觜";s:2:"D";s:3:"触";s:2:"E";s:3:"詶";s:2:"F";s:3:"誆";s:2:"G";s:3:"詿";s:2:"H";s:3:"詡";s:2:"I";s:3:"訿";s:2:"J";s:3:"詷";s:2:"K";s:3:"誂";s:2:"L";s:3:"誄";s:2:"M";s:3:"詵";s:2:"N";s:3:"誃";s:2:"O";s:3:"誁";s:2:"P";s:3:"詴";s:2:"Q";s:3:"詺";s:2:"R";s:3:"谼";s:2:"S";s:3:"豋";s:2:"T";s:3:"豊";s:2:"U";s:3:"豥";s:2:"V";s:3:"豤";s:2:"W";s:3:"豦";s:2:"X";s:3:"貆";s:2:"Y";s:3:"貄";s:2:"Z";s:3:"貅";s:2:"[";s:3:"賌";s:2:"\";s:3:"赨";s:2:"]";s:3:"赩";s:2:"^";s:3:"趑";s:2:"_";s:3:"趌";s:2:"`";s:3:"趎";s:2:"a";s:3:"趏";s:2:"b";s:3:"趍";s:2:"c";s:3:"趓";s:2:"d";s:3:"趔";s:2:"e";s:3:"趐";s:2:"f";s:3:"趒";s:2:"g";s:3:"跰";s:2:"h";s:3:"跠";s:2:"i";s:3:"跬";s:2:"j";s:3:"跱";s:2:"k";s:3:"跮";s:2:"l";s:3:"跐";s:2:"m";s:3:"跩";s:2:"n";s:3:"跣";s:2:"o";s:3:"跢";s:2:"p";s:3:"跧";s:2:"q";s:3:"跲";s:2:"r";s:3:"跫";s:2:"s";s:3:"跴";s:2:"t";s:3:"輆";s:2:"u";s:3:"軿";s:2:"v";s:3:"輁";s:2:"w";s:3:"輀";s:2:"x";s:3:"輅";s:2:"y";s:3:"輇";s:2:"z";s:3:"輈";s:2:"{";s:3:"輂";s:2:"|";s:3:"輋";s:2:"}";s:3:"遒";s:2:"~";s:3:"逿";s:2:"";s:3:"遄";s:2:"";s:3:"遉";s:2:"";s:3:"逽";s:2:"";s:3:"鄐";s:2:"";s:3:"鄍";s:2:"";s:3:"鄏";s:2:"";s:3:"鄑";s:2:"";s:3:"鄖";s:2:"";s:3:"鄔";s:2:"";s:3:"鄋";s:2:"";s:3:"鄎";s:2:"";s:3:"酮";s:2:"";s:3:"酯";s:2:"";s:3:"鉈";s:2:"";s:3:"鉒";s:2:"";s:3:"鈰";s:2:"";s:3:"鈺";s:2:"";s:3:"鉦";s:2:"";s:3:"鈳";s:2:"";s:3:"鉥";s:2:"";s:3:"鉞";s:2:"";s:3:"銃";s:2:"";s:3:"鈮";s:2:"";s:3:"鉊";s:2:"";s:3:"鉆";s:2:"";s:3:"鉭";s:2:"";s:3:"鉬";s:2:"";s:3:"鉏";s:2:"";s:3:"鉠";s:2:"";s:3:"鉧";s:2:"";s:3:"鉯";s:2:"";s:3:"鈶";s:2:"";s:3:"鉡";s:2:"";s:3:"鉰";s:2:"";s:3:"鈱";s:2:"";s:3:"鉔";s:2:"";s:3:"鉣";s:2:"";s:3:"鉐";s:2:"";s:3:"鉲";s:2:"";s:3:"鉎";s:2:"";s:3:"鉓";s:2:"";s:3:"鉌";s:2:"";s:3:"鉖";s:2:"";s:3:"鈲";s:2:"";s:3:"閟";s:2:"";s:3:"閜";s:2:"";s:3:"閞";s:2:"";s:3:"閛";s:2:"";s:3:"隒";s:2:"";s:3:"隓";s:2:"";s:3:"隑";s:2:"";s:3:"隗";s:2:"";s:3:"雎";s:2:"";s:3:"雺";s:2:"";s:3:"雽";s:2:"";s:3:"雸";s:2:"";s:3:"雵";s:2:"";s:3:"靳";s:2:"";s:3:"靷";s:2:"";s:3:"靸";s:2:"";s:3:"靲";s:2:"";s:3:"頏";s:2:"";s:3:"頍";s:2:"";s:3:"頎";s:2:"";s:3:"颬";s:2:"";s:3:"飶";s:2:"";s:3:"飹";s:2:"";s:3:"馯";s:2:"";s:3:"馲";s:2:"";s:3:"馰";s:2:"";s:3:"馵";s:2:"";s:3:"骭";s:2:"";s:3:"骫";s:2:"";s:3:"魛";s:2:"";s:3:"鳪";s:2:"";s:3:"鳭";s:2:"";s:3:"鳧";s:2:"";s:3:"麀";s:2:"";s:3:"黽";s:2:"";s:3:"僦";s:2:"";s:3:"僔";s:2:"";s:3:"僗";s:2:"";s:3:"僨";s:2:"";s:3:"僳";s:2:"";s:3:"僛";s:2:"";s:3:"僪";s:2:"";s:3:"僝";s:2:"";s:3:"僤";s:2:"";s:3:"僓";s:2:"";s:3:"僬";s:2:"";s:3:"僰";s:2:"";s:3:"僯";s:2:"";s:3:"僣";s:2:"";s:3:"僠";s:2:"@";s:3:"凘";s:2:"A";s:3:"劀";s:2:"B";s:3:"劁";s:2:"C";s:3:"勩";s:2:"D";s:3:"勫";s:2:"E";s:3:"匰";s:2:"F";s:3:"厬";s:2:"G";s:3:"嘧";s:2:"H";s:3:"嘕";s:2:"I";s:3:"嘌";s:2:"J";s:3:"嘒";s:2:"K";s:3:"嗼";s:2:"L";s:3:"嘏";s:2:"M";s:3:"嘜";s:2:"N";s:3:"嘁";s:2:"O";s:3:"嘓";s:2:"P";s:3:"嘂";s:2:"Q";s:3:"嗺";s:2:"R";s:3:"嘝";s:2:"S";s:3:"嘄";s:2:"T";s:3:"嗿";s:2:"U";s:3:"嗹";s:2:"V";s:3:"墉";s:2:"W";s:3:"塼";s:2:"X";s:3:"墐";s:2:"Y";s:3:"墘";s:2:"Z";s:3:"墆";s:2:"[";s:3:"墁";s:2:"\";s:3:"塿";s:2:"]";s:3:"塴";s:2:"^";s:3:"墋";s:2:"_";s:3:"塺";s:2:"`";s:3:"墇";s:2:"a";s:3:"墑";s:2:"b";s:3:"墎";s:2:"c";s:3:"塶";s:2:"d";s:3:"墂";s:2:"e";s:3:"墈";s:2:"f";s:3:"塻";s:2:"g";s:3:"墔";s:2:"h";s:3:"墏";s:2:"i";s:3:"壾";s:2:"j";s:3:"奫";s:2:"k";s:3:"嫜";s:2:"l";s:3:"嫮";s:2:"m";s:3:"嫥";s:2:"n";s:3:"嫕";s:2:"o";s:3:"嫪";s:2:"p";s:3:"嫚";s:2:"q";s:3:"嫭";s:2:"r";s:3:"嫫";s:2:"s";s:3:"嫳";s:2:"t";s:3:"嫢";s:2:"u";s:3:"嫠";s:2:"v";s:3:"嫛";s:2:"w";s:3:"嫬";s:2:"x";s:3:"嫞";s:2:"y";s:3:"嫝";s:2:"z";s:3:"嫙";s:2:"{";s:3:"嫨";s:2:"|";s:3:"嫟";s:2:"}";s:3:"孷";s:2:"~";s:3:"寠";s:2:"";s:3:"寣";s:2:"";s:3:"屣";s:2:"";s:3:"嶂";s:2:"";s:3:"嶀";s:2:"";s:3:"嵽";s:2:"";s:3:"嶆";s:2:"";s:3:"嵺";s:2:"";s:3:"嶁";s:2:"";s:3:"嵷";s:2:"";s:3:"嶊";s:2:"";s:3:"嶉";s:2:"";s:3:"嶈";s:2:"";s:3:"嵾";s:2:"";s:3:"嵼";s:2:"";s:3:"嶍";s:2:"";s:3:"嵹";s:2:"";s:3:"嵿";s:2:"";s:3:"幘";s:2:"";s:3:"幙";s:2:"";s:3:"幓";s:2:"";s:3:"廘";s:2:"";s:3:"廑";s:2:"";s:3:"廗";s:2:"";s:3:"廎";s:2:"";s:3:"廜";s:2:"";s:3:"廕";s:2:"";s:3:"廙";s:2:"";s:3:"廒";s:2:"";s:3:"廔";s:2:"";s:3:"彄";s:2:"";s:3:"彃";s:2:"";s:3:"彯";s:2:"";s:3:"徶";s:2:"";s:3:"愬";s:2:"";s:3:"愨";s:2:"";s:3:"慁";s:2:"";s:3:"慞";s:2:"";s:3:"慱";s:2:"";s:3:"慳";s:2:"";s:3:"慒";s:2:"";s:3:"慓";s:2:"";s:3:"慲";s:2:"";s:3:"慬";s:2:"";s:3:"憀";s:2:"";s:3:"慴";s:2:"";s:3:"慔";s:2:"";s:3:"慺";s:2:"";s:3:"慛";s:2:"";s:3:"慥";s:2:"";s:3:"愻";s:2:"";s:3:"慪";s:2:"";s:3:"慡";s:2:"";s:3:"慖";s:2:"";s:3:"戩";s:2:"";s:3:"戧";s:2:"";s:3:"戫";s:2:"";s:3:"搫";s:2:"";s:3:"摍";s:2:"";s:3:"摛";s:2:"";s:3:"摝";s:2:"";s:3:"摴";s:2:"";s:3:"摶";s:2:"";s:3:"摲";s:2:"";s:3:"摳";s:2:"";s:3:"摽";s:2:"";s:3:"摵";s:2:"";s:3:"摦";s:2:"";s:3:"撦";s:2:"";s:3:"摎";s:2:"";s:3:"撂";s:2:"";s:3:"摞";s:2:"";s:3:"摜";s:2:"";s:3:"摋";s:2:"";s:3:"摓";s:2:"";s:3:"摠";s:2:"";s:3:"摐";s:2:"";s:3:"摿";s:2:"";s:3:"搿";s:2:"";s:3:"摬";s:2:"";s:3:"摫";s:2:"";s:3:"摙";s:2:"";s:3:"摥";s:2:"";s:3:"摷";s:2:"";s:3:"敳";s:2:"";s:3:"斠";s:2:"";s:3:"暡";s:2:"";s:3:"暠";s:2:"";s:3:"暟";s:2:"";s:3:"朅";s:2:"";s:3:"朄";s:2:"";s:3:"朢";s:2:"";s:3:"榱";s:2:"";s:3:"榶";s:2:"";s:3:"槉";s:2:"@";s:3:"榠";s:2:"A";s:3:"槎";s:2:"B";s:3:"榖";s:2:"C";s:3:"榰";s:2:"D";s:3:"榬";s:2:"E";s:3:"榼";s:2:"F";s:3:"榑";s:2:"G";s:3:"榙";s:2:"H";s:3:"榎";s:2:"I";s:3:"榧";s:2:"J";s:3:"榍";s:2:"K";s:3:"榩";s:2:"L";s:3:"榾";s:2:"M";s:3:"榯";s:2:"N";s:3:"榿";s:2:"O";s:3:"槄";s:2:"P";s:3:"榽";s:2:"Q";s:3:"榤";s:2:"R";s:3:"槔";s:2:"S";s:3:"榹";s:2:"T";s:3:"槊";s:2:"U";s:3:"榚";s:2:"V";s:3:"槏";s:2:"W";s:3:"榳";s:2:"X";s:3:"榓";s:2:"Y";s:3:"榪";s:2:"Z";s:3:"榡";s:2:"[";s:3:"榞";s:2:"\";s:3:"槙";s:2:"]";s:3:"榗";s:2:"^";s:3:"榐";s:2:"_";s:3:"槂";s:2:"`";s:3:"榵";s:2:"a";s:3:"榥";s:2:"b";s:3:"槆";s:2:"c";s:3:"歊";s:2:"d";s:3:"歍";s:2:"e";s:3:"歋";s:2:"f";s:3:"殞";s:2:"g";s:3:"殟";s:2:"h";s:3:"殠";s:2:"i";s:3:"毃";s:2:"j";s:3:"毄";s:2:"k";s:3:"毾";s:2:"l";s:3:"滎";s:2:"m";s:3:"滵";s:2:"n";s:3:"滱";s:2:"o";s:3:"漃";s:2:"p";s:3:"漥";s:2:"q";s:3:"滸";s:2:"r";s:3:"漷";s:2:"s";s:3:"滻";s:2:"t";s:3:"漮";s:2:"u";s:3:"漉";s:2:"v";s:3:"潎";s:2:"w";s:3:"漙";s:2:"x";s:3:"漚";s:2:"y";s:3:"漧";s:2:"z";s:3:"漘";s:2:"{";s:3:"漻";s:2:"|";s:3:"漒";s:2:"}";s:3:"滭";s:2:"~";s:3:"漊";s:2:"";s:3:"漶";s:2:"";s:3:"潳";s:2:"";s:3:"滹";s:2:"";s:3:"滮";s:2:"";s:3:"漭";s:2:"";s:3:"潀";s:2:"";s:3:"漰";s:2:"";s:3:"漼";s:2:"";s:3:"漵";s:2:"";s:3:"滫";s:2:"";s:3:"漇";s:2:"";s:3:"漎";s:2:"";s:3:"潃";s:2:"";s:3:"漅";s:2:"";s:3:"滽";s:2:"";s:3:"滶";s:2:"";s:3:"漹";s:2:"";s:3:"漜";s:2:"";s:3:"滼";s:2:"";s:3:"漺";s:2:"";s:3:"漟";s:2:"";s:3:"漍";s:2:"";s:3:"漞";s:2:"";s:3:"漈";s:2:"";s:3:"漡";s:2:"";s:3:"熇";s:2:"";s:3:"熐";s:2:"";s:3:"熉";s:2:"";s:3:"熀";s:2:"";s:3:"熅";s:2:"";s:3:"熂";s:2:"";s:3:"熏";s:2:"";s:3:"煻";s:2:"";s:3:"熆";s:2:"";s:3:"熁";s:2:"";s:3:"熗";s:2:"";s:3:"牄";s:2:"";s:3:"牓";s:2:"";s:3:"犗";s:2:"";s:3:"犕";s:2:"";s:3:"犓";s:2:"";s:3:"獃";s:2:"";s:3:"獍";s:2:"";s:3:"獑";s:2:"";s:3:"獌";s:2:"";s:3:"瑢";s:2:"";s:3:"瑳";s:2:"";s:3:"瑱";s:2:"";s:3:"瑵";s:2:"";s:3:"瑲";s:2:"";s:3:"瑧";s:2:"";s:3:"瑮";s:2:"";s:3:"甀";s:2:"";s:3:"甂";s:2:"";s:3:"甃";s:2:"";s:3:"畽";s:2:"";s:3:"疐";s:2:"";s:3:"瘖";s:2:"";s:3:"瘈";s:2:"";s:3:"瘌";s:2:"";s:3:"瘕";s:2:"";s:3:"瘑";s:2:"";s:3:"瘊";s:2:"";s:3:"瘔";s:2:"";s:3:"皸";s:2:"";s:3:"瞁";s:2:"";s:3:"睼";s:2:"";s:3:"瞅";s:2:"";s:3:"瞂";s:2:"";s:3:"睮";s:2:"";s:3:"瞀";s:2:"";s:3:"睯";s:2:"";s:3:"睾";s:2:"";s:3:"瞃";s:2:"";s:3:"碲";s:2:"";s:3:"碪";s:2:"";s:3:"碴";s:2:"";s:3:"碭";s:2:"";s:3:"碨";s:2:"";s:3:"硾";s:2:"";s:3:"碫";s:2:"";s:3:"碞";s:2:"";s:3:"碥";s:2:"";s:3:"碠";s:2:"";s:3:"碬";s:2:"";s:3:"碢";s:2:"";s:3:"碤";s:2:"";s:3:"禘";s:2:"";s:3:"禊";s:2:"";s:3:"禋";s:2:"";s:3:"禖";s:2:"";s:3:"禕";s:2:"";s:3:"禔";s:2:"";s:3:"禓";s:2:"@";s:3:"禗";s:2:"A";s:3:"禈";s:2:"B";s:3:"禒";s:2:"C";s:3:"禐";s:2:"D";s:3:"稫";s:2:"E";s:3:"穊";s:2:"F";s:3:"稰";s:2:"G";s:3:"稯";s:2:"H";s:3:"稨";s:2:"I";s:3:"稦";s:2:"J";s:3:"窨";s:2:"K";s:3:"窫";s:2:"L";s:3:"窬";s:2:"M";s:3:"竮";s:2:"N";s:3:"箈";s:2:"O";s:3:"箜";s:2:"P";s:3:"箊";s:2:"Q";s:3:"箑";s:2:"R";s:3:"箐";s:2:"S";s:3:"箖";s:2:"T";s:3:"箍";s:2:"U";s:3:"箌";s:2:"V";s:3:"箛";s:2:"W";s:3:"箎";s:2:"X";s:3:"箅";s:2:"Y";s:3:"箘";s:2:"Z";s:3:"劄";s:2:"[";s:3:"箙";s:2:"\";s:3:"箤";s:2:"]";s:3:"箂";s:2:"^";s:3:"粻";s:2:"_";s:3:"粿";s:2:"`";s:3:"粼";s:2:"a";s:3:"粺";s:2:"b";s:3:"綧";s:2:"c";s:3:"綷";s:2:"d";s:3:"緂";s:2:"e";s:3:"綣";s:2:"f";s:3:"綪";s:2:"g";s:3:"緁";s:2:"h";s:3:"緀";s:2:"i";s:3:"緅";s:2:"j";s:3:"綝";s:2:"k";s:3:"緎";s:2:"l";s:3:"緄";s:2:"m";s:3:"緆";s:2:"n";s:3:"緋";s:2:"o";s:3:"緌";s:2:"p";s:3:"綯";s:2:"q";s:3:"綹";s:2:"r";s:3:"綖";s:2:"s";s:3:"綼";s:2:"t";s:3:"綟";s:2:"u";s:3:"綦";s:2:"v";s:3:"綮";s:2:"w";s:3:"綩";s:2:"x";s:3:"綡";s:2:"y";s:3:"緉";s:2:"z";s:3:"罳";s:2:"{";s:3:"翢";s:2:"|";s:3:"翣";s:2:"}";s:3:"翥";s:2:"~";s:3:"翞";s:2:"";s:3:"耤";s:2:"";s:3:"聝";s:2:"";s:3:"聜";s:2:"";s:3:"膉";s:2:"";s:3:"膆";s:2:"";s:3:"膃";s:2:"";s:3:"膇";s:2:"";s:3:"膍";s:2:"";s:3:"膌";s:2:"";s:3:"膋";s:2:"";s:3:"舕";s:2:"";s:3:"蒗";s:2:"";s:3:"蒤";s:2:"";s:3:"蒡";s:2:"";s:3:"蒟";s:2:"";s:3:"蒺";s:2:"";s:3:"蓎";s:2:"";s:3:"蓂";s:2:"";s:3:"蒬";s:2:"";s:3:"蒮";s:2:"";s:3:"蒫";s:2:"";s:3:"蒹";s:2:"";s:3:"蒴";s:2:"";s:3:"蓁";s:2:"";s:3:"蓍";s:2:"";s:3:"蒪";s:2:"";s:3:"蒚";s:2:"";s:3:"蒱";s:2:"";s:3:"蓐";s:2:"";s:3:"蒝";s:2:"";s:3:"蒧";s:2:"";s:3:"蒻";s:2:"";s:3:"蒢";s:2:"";s:3:"蒔";s:2:"";s:3:"蓇";s:2:"";s:3:"蓌";s:2:"";s:3:"蒛";s:2:"";s:3:"蒩";s:2:"";s:3:"蒯";s:2:"";s:3:"蒨";s:2:"";s:3:"蓖";s:2:"";s:3:"蒘";s:2:"";s:3:"蒶";s:2:"";s:3:"蓏";s:2:"";s:3:"蒠";s:2:"";s:3:"蓗";s:2:"";s:3:"蓔";s:2:"";s:3:"蓒";s:2:"";s:3:"蓛";s:2:"";s:3:"蒰";s:2:"";s:3:"蒑";s:2:"";s:3:"虡";s:2:"";s:3:"蜳";s:2:"";s:3:"蜣";s:2:"";s:3:"蜨";s:2:"";s:3:"蝫";s:2:"";s:3:"蝀";s:2:"";s:3:"蜮";s:2:"";s:3:"蜞";s:2:"";s:3:"蜡";s:2:"";s:3:"蜙";s:2:"";s:3:"蜛";s:2:"";s:3:"蝃";s:2:"";s:3:"蜬";s:2:"";s:3:"蝁";s:2:"";s:3:"蜾";s:2:"";s:3:"蝆";s:2:"";s:3:"蜠";s:2:"";s:3:"蜲";s:2:"";s:3:"蜪";s:2:"";s:3:"蜭";s:2:"";s:3:"蜼";s:2:"";s:3:"蜒";s:2:"";s:3:"蜺";s:2:"";s:3:"蜱";s:2:"";s:3:"蜵";s:2:"";s:3:"蝂";s:2:"";s:3:"蜦";s:2:"";s:3:"蜧";s:2:"";s:3:"蜸";s:2:"";s:3:"蜤";s:2:"";s:3:"蜚";s:2:"";s:3:"蜰";s:2:"";s:3:"蜑";s:2:"";s:3:"裷";s:2:"";s:3:"裧";s:2:"";s:3:"裱";s:2:"";s:3:"裲";s:2:"";s:3:"裺";s:2:"";s:3:"裾";s:2:"";s:3:"裮";s:2:"";s:3:"裼";s:2:"";s:3:"裶";s:2:"";s:3:"裻";s:2:"@";s:3:"裰";s:2:"A";s:3:"裬";s:2:"B";s:3:"裫";s:2:"C";s:3:"覝";s:2:"D";s:3:"覡";s:2:"E";s:3:"覟";s:2:"F";s:3:"覞";s:2:"G";s:3:"觩";s:2:"H";s:3:"觫";s:2:"I";s:3:"觨";s:2:"J";s:3:"誫";s:2:"K";s:3:"誙";s:2:"L";s:3:"誋";s:2:"M";s:3:"誒";s:2:"N";s:3:"誏";s:2:"O";s:3:"誖";s:2:"P";s:3:"谽";s:2:"Q";s:3:"豨";s:2:"R";s:3:"豩";s:2:"S";s:3:"賕";s:2:"T";s:3:"賏";s:2:"U";s:3:"賗";s:2:"V";s:3:"趖";s:2:"W";s:3:"踉";s:2:"X";s:3:"踂";s:2:"Y";s:3:"跿";s:2:"Z";s:3:"踍";s:2:"[";s:3:"跽";s:2:"\";s:3:"踊";s:2:"]";s:3:"踃";s:2:"^";s:3:"踇";s:2:"_";s:3:"踆";s:2:"`";s:3:"踅";s:2:"a";s:3:"跾";s:2:"b";s:3:"踀";s:2:"c";s:3:"踄";s:2:"d";s:3:"輐";s:2:"e";s:3:"輑";s:2:"f";s:3:"輎";s:2:"g";s:3:"輍";s:2:"h";s:3:"鄣";s:2:"i";s:3:"鄜";s:2:"j";s:3:"鄠";s:2:"k";s:3:"鄢";s:2:"l";s:3:"鄟";s:2:"m";s:3:"鄝";s:2:"n";s:3:"鄚";s:2:"o";s:3:"鄤";s:2:"p";s:3:"鄡";s:2:"q";s:3:"鄛";s:2:"r";s:3:"酺";s:2:"s";s:3:"酲";s:2:"t";s:3:"酹";s:2:"u";s:3:"酳";s:2:"v";s:3:"銥";s:2:"w";s:3:"銤";s:2:"x";s:3:"鉶";s:2:"y";s:3:"銛";s:2:"z";s:3:"鉺";s:2:"{";s:3:"銠";s:2:"|";s:3:"銔";s:2:"}";s:3:"銪";s:2:"~";s:3:"銍";s:2:"";s:3:"銦";s:2:"";s:3:"銚";s:2:"";s:3:"銫";s:2:"";s:3:"鉹";s:2:"";s:3:"銗";s:2:"";s:3:"鉿";s:2:"";s:3:"銣";s:2:"";s:3:"鋮";s:2:"";s:3:"銎";s:2:"";s:3:"銂";s:2:"";s:3:"銕";s:2:"";s:3:"銢";s:2:"";s:3:"鉽";s:2:"";s:3:"銈";s:2:"";s:3:"銡";s:2:"";s:3:"銊";s:2:"";s:3:"銆";s:2:"";s:3:"銌";s:2:"";s:3:"銙";s:2:"";s:3:"銧";s:2:"";s:3:"鉾";s:2:"";s:3:"銇";s:2:"";s:3:"銩";s:2:"";s:3:"銝";s:2:"";s:3:"銋";s:2:"";s:3:"鈭";s:2:"";s:3:"隞";s:2:"";s:3:"隡";s:2:"";s:3:"雿";s:2:"";s:3:"靘";s:2:"";s:3:"靽";s:2:"";s:3:"靺";s:2:"";s:3:"靾";s:2:"";s:3:"鞃";s:2:"";s:3:"鞀";s:2:"";s:3:"鞂";s:2:"";s:3:"靻";s:2:"";s:3:"鞄";s:2:"";s:3:"鞁";s:2:"";s:3:"靿";s:2:"";s:3:"韎";s:2:"";s:3:"韍";s:2:"";s:3:"頖";s:2:"";s:3:"颭";s:2:"";s:3:"颮";s:2:"";s:3:"餂";s:2:"";s:3:"餀";s:2:"";s:3:"餇";s:2:"";s:3:"馝";s:2:"";s:3:"馜";s:2:"";s:3:"駃";s:2:"";s:3:"馹";s:2:"";s:3:"馻";s:2:"";s:3:"馺";s:2:"";s:3:"駂";s:2:"";s:3:"馽";s:2:"";s:3:"駇";s:2:"";s:3:"骱";s:2:"";s:3:"髣";s:2:"";s:3:"髧";s:2:"";s:3:"鬾";s:2:"";s:3:"鬿";s:2:"";s:3:"魠";s:2:"";s:3:"魡";s:2:"";s:3:"魟";s:2:"";s:3:"鳱";s:2:"";s:3:"鳲";s:2:"";s:3:"鳵";s:2:"";s:3:"麧";s:2:"";s:3:"僿";s:2:"";s:3:"儃";s:2:"";s:3:"儰";s:2:"";s:3:"僸";s:2:"";s:3:"儆";s:2:"";s:3:"儇";s:2:"";s:3:"僶";s:2:"";s:3:"僾";s:2:"";s:3:"儋";s:2:"";s:3:"儌";s:2:"";s:3:"僽";s:2:"";s:3:"儊";s:2:"";s:3:"劋";s:2:"";s:3:"劌";s:2:"";s:3:"勱";s:2:"";s:3:"勯";s:2:"";s:3:"噈";s:2:"";s:3:"噂";s:2:"";s:3:"噌";s:2:"";s:3:"嘵";s:2:"";s:3:"噁";s:2:"";s:3:"噊";s:2:"";s:3:"噉";s:2:"";s:3:"噆";s:2:"";s:3:"噘";s:2:"@";s:3:"噚";s:2:"A";s:3:"噀";s:2:"B";s:3:"嘳";s:2:"C";s:3:"嘽";s:2:"D";s:3:"嘬";s:2:"E";s:3:"嘾";s:2:"F";s:3:"嘸";s:2:"G";s:3:"嘪";s:2:"H";s:3:"嘺";s:2:"I";s:3:"圚";s:2:"J";s:3:"墫";s:2:"K";s:3:"墝";s:2:"L";s:3:"墱";s:2:"M";s:3:"墠";s:2:"N";s:3:"墣";s:2:"O";s:3:"墯";s:2:"P";s:3:"墬";s:2:"Q";s:3:"墥";s:2:"R";s:3:"墡";s:2:"S";s:3:"壿";s:2:"T";s:3:"嫿";s:2:"U";s:3:"嫴";s:2:"V";s:3:"嫽";s:2:"W";s:3:"嫷";s:2:"X";s:3:"嫶";s:2:"Y";s:3:"嬃";s:2:"Z";s:3:"嫸";s:2:"[";s:3:"嬂";s:2:"\";s:3:"嫹";s:2:"]";s:3:"嬁";s:2:"^";s:3:"嬇";s:2:"_";s:3:"嬅";s:2:"`";s:3:"嬏";s:2:"a";s:3:"屧";s:2:"b";s:3:"嶙";s:2:"c";s:3:"嶗";s:2:"d";s:3:"嶟";s:2:"e";s:3:"嶒";s:2:"f";s:3:"嶢";s:2:"g";s:3:"嶓";s:2:"h";s:3:"嶕";s:2:"i";s:3:"嶠";s:2:"j";s:3:"嶜";s:2:"k";s:3:"嶡";s:2:"l";s:3:"嶚";s:2:"m";s:3:"嶞";s:2:"n";s:3:"幩";s:2:"o";s:3:"幝";s:2:"p";s:3:"幠";s:2:"q";s:3:"幜";s:2:"r";s:3:"緳";s:2:"s";s:3:"廛";s:2:"t";s:3:"廞";s:2:"u";s:3:"廡";s:2:"v";s:3:"彉";s:2:"w";s:3:"徲";s:2:"x";s:3:"憋";s:2:"y";s:3:"憃";s:2:"z";s:3:"慹";s:2:"{";s:3:"憱";s:2:"|";s:3:"憰";s:2:"}";s:3:"憢";s:2:"~";s:3:"憉";s:2:"";s:3:"憛";s:2:"";s:3:"憓";s:2:"";s:3:"憯";s:2:"";s:3:"憭";s:2:"";s:3:"憟";s:2:"";s:3:"憒";s:2:"";s:3:"憪";s:2:"";s:3:"憡";s:2:"";s:3:"憍";s:2:"";s:3:"慦";s:2:"";s:3:"憳";s:2:"";s:3:"戭";s:2:"";s:3:"摮";s:2:"";s:3:"摰";s:2:"";s:3:"撖";s:2:"";s:3:"撠";s:2:"";s:3:"撅";s:2:"";s:3:"撗";s:2:"";s:3:"撜";s:2:"";s:3:"撏";s:2:"";s:3:"撋";s:2:"";s:3:"撊";s:2:"";s:3:"撌";s:2:"";s:3:"撣";s:2:"";s:3:"撟";s:2:"";s:3:"摨";s:2:"";s:3:"撱";s:2:"";s:3:"撘";s:2:"";s:3:"敶";s:2:"";s:3:"敺";s:2:"";s:3:"敹";s:2:"";s:3:"敻";s:2:"";s:3:"斲";s:2:"";s:3:"斳";s:2:"";s:3:"暵";s:2:"";s:3:"暰";s:2:"";s:3:"暩";s:2:"";s:3:"暲";s:2:"";s:3:"暷";s:2:"";s:3:"暪";s:2:"";s:3:"暯";s:2:"";s:3:"樀";s:2:"";s:3:"樆";s:2:"";s:3:"樗";s:2:"";s:3:"槥";s:2:"";s:3:"槸";s:2:"";s:3:"樕";s:2:"";s:3:"槱";s:2:"";s:3:"槤";s:2:"";s:3:"樠";s:2:"";s:3:"槿";s:2:"";s:3:"槬";s:2:"";s:3:"槢";s:2:"";s:3:"樛";s:2:"";s:3:"樝";s:2:"";s:3:"槾";s:2:"";s:3:"樧";s:2:"";s:3:"槲";s:2:"";s:3:"槮";s:2:"";s:3:"樔";s:2:"";s:3:"槷";s:2:"";s:3:"槧";s:2:"";s:3:"橀";s:2:"";s:3:"樈";s:2:"";s:3:"槦";s:2:"";s:3:"槻";s:2:"";s:3:"樍";s:2:"";s:3:"槼";s:2:"";s:3:"槫";s:2:"";s:3:"樉";s:2:"";s:3:"樄";s:2:"";s:3:"樘";s:2:"";s:3:"樥";s:2:"";s:3:"樏";s:2:"";s:3:"槶";s:2:"";s:3:"樦";s:2:"";s:3:"樇";s:2:"";s:3:"槴";s:2:"";s:3:"樖";s:2:"";s:3:"歑";s:2:"";s:3:"殥";s:2:"";s:3:"殣";s:2:"";s:3:"殢";s:2:"";s:3:"殦";s:2:"";s:3:"氁";s:2:"";s:3:"氀";s:2:"";s:3:"毿";s:2:"";s:3:"氂";s:2:"";s:3:"潁";s:2:"";s:3:"漦";s:2:"";s:3:"潾";s:2:"";s:3:"澇";s:2:"";s:3:"濆";s:2:"";s:3:"澒";s:2:"@";s:3:"澍";s:2:"A";s:3:"澉";s:2:"B";s:3:"澌";s:2:"C";s:3:"潢";s:2:"D";s:3:"潏";s:2:"E";s:3:"澅";s:2:"F";s:3:"潚";s:2:"G";s:3:"澖";s:2:"H";s:3:"潶";s:2:"I";s:3:"潬";s:2:"J";s:3:"澂";s:2:"K";s:3:"潕";s:2:"L";s:3:"潲";s:2:"M";s:3:"潒";s:2:"N";s:3:"潐";s:2:"O";s:3:"潗";s:2:"P";s:3:"澔";s:2:"Q";s:3:"澓";s:2:"R";s:3:"潝";s:2:"S";s:3:"漀";s:2:"T";s:3:"潡";s:2:"U";s:3:"潫";s:2:"V";s:3:"潽";s:2:"W";s:3:"潧";s:2:"X";s:3:"澐";s:2:"Y";s:3:"潓";s:2:"Z";s:3:"澋";s:2:"[";s:3:"潩";s:2:"\";s:3:"潿";s:2:"]";s:3:"澕";s:2:"^";s:3:"潣";s:2:"_";s:3:"潷";s:2:"`";s:3:"潪";s:2:"a";s:3:"潻";s:2:"b";s:3:"熲";s:2:"c";s:3:"熯";s:2:"d";s:3:"熛";s:2:"e";s:3:"熰";s:2:"f";s:3:"熠";s:2:"g";s:3:"熚";s:2:"h";s:3:"熩";s:2:"i";s:3:"熵";s:2:"j";s:3:"熝";s:2:"k";s:3:"熥";s:2:"l";s:3:"熞";s:2:"m";s:3:"熤";s:2:"n";s:3:"熡";s:2:"o";s:3:"熪";s:2:"p";s:3:"熜";s:2:"q";s:3:"熧";s:2:"r";s:3:"熳";s:2:"s";s:3:"犘";s:2:"t";s:3:"犚";s:2:"u";s:3:"獘";s:2:"v";s:3:"獒";s:2:"w";s:3:"獞";s:2:"x";s:3:"獟";s:2:"y";s:3:"獠";s:2:"z";s:3:"獝";s:2:"{";s:3:"獛";s:2:"|";s:3:"獡";s:2:"}";s:3:"獚";s:2:"~";s:3:"獙";s:2:"";s:3:"獢";s:2:"";s:3:"璇";s:2:"";s:3:"璉";s:2:"";s:3:"璊";s:2:"";s:3:"璆";s:2:"";s:3:"璁";s:2:"";s:3:"瑽";s:2:"";s:3:"璅";s:2:"";s:3:"璈";s:2:"";s:3:"瑼";s:2:"";s:3:"瑹";s:2:"";s:3:"甈";s:2:"";s:3:"甇";s:2:"";s:3:"畾";s:2:"";s:3:"瘥";s:2:"";s:3:"瘞";s:2:"";s:3:"瘙";s:2:"";s:3:"瘝";s:2:"";s:3:"瘜";s:2:"";s:3:"瘣";s:2:"";s:3:"瘚";s:2:"";s:3:"瘨";s:2:"";s:3:"瘛";s:2:"";s:3:"皜";s:2:"";s:3:"皝";s:2:"";s:3:"皞";s:2:"";s:3:"皛";s:2:"";s:3:"瞍";s:2:"";s:3:"瞏";s:2:"";s:3:"瞉";s:2:"";s:3:"瞈";s:2:"";s:3:"磍";s:2:"";s:3:"碻";s:2:"";s:3:"磏";s:2:"";s:3:"磌";s:2:"";s:3:"磑";s:2:"";s:3:"磎";s:2:"";s:3:"磔";s:2:"";s:3:"磈";s:2:"";s:3:"磃";s:2:"";s:3:"磄";s:2:"";s:3:"磉";s:2:"";s:3:"禚";s:2:"";s:3:"禡";s:2:"";s:3:"禠";s:2:"";s:3:"禜";s:2:"";s:3:"禢";s:2:"";s:3:"禛";s:2:"";s:3:"歶";s:2:"";s:3:"稹";s:2:"";s:3:"窲";s:2:"";s:3:"窴";s:2:"";s:3:"窳";s:2:"";s:3:"箷";s:2:"";s:3:"篋";s:2:"";s:3:"箾";s:2:"";s:3:"箬";s:2:"";s:3:"篎";s:2:"";s:3:"箯";s:2:"";s:3:"箹";s:2:"";s:3:"篊";s:2:"";s:3:"箵";s:2:"";s:3:"糅";s:2:"";s:3:"糈";s:2:"";s:3:"糌";s:2:"";s:3:"糋";s:2:"";s:3:"緷";s:2:"";s:3:"緛";s:2:"";s:3:"緪";s:2:"";s:3:"緧";s:2:"";s:3:"緗";s:2:"";s:3:"緡";s:2:"";s:3:"縃";s:2:"";s:3:"緺";s:2:"";s:3:"緦";s:2:"";s:3:"緶";s:2:"";s:3:"緱";s:2:"";s:3:"緰";s:2:"";s:3:"緮";s:2:"";s:3:"緟";s:2:"";s:3:"罶";s:2:"";s:3:"羬";s:2:"";s:3:"羰";s:2:"";s:3:"羭";s:2:"";s:3:"翭";s:2:"";s:3:"翫";s:2:"";s:3:"翪";s:2:"";s:3:"翬";s:2:"";s:3:"翦";s:2:"";s:3:"翨";s:2:"";s:3:"聤";s:2:"";s:3:"聧";s:2:"";s:3:"膣";s:2:"";s:3:"膟";s:2:"@";s:3:"膞";s:2:"A";s:3:"膕";s:2:"B";s:3:"膢";s:2:"C";s:3:"膙";s:2:"D";s:3:"膗";s:2:"E";s:3:"舖";s:2:"F";s:3:"艏";s:2:"G";s:3:"艓";s:2:"H";s:3:"艒";s:2:"I";s:3:"艐";s:2:"J";s:3:"艎";s:2:"K";s:3:"艑";s:2:"L";s:3:"蔤";s:2:"M";s:3:"蔻";s:2:"N";s:3:"蔏";s:2:"O";s:3:"蔀";s:2:"P";s:3:"蔩";s:2:"Q";s:3:"蔎";s:2:"R";s:3:"蔉";s:2:"S";s:3:"蔍";s:2:"T";s:3:"蔟";s:2:"U";s:3:"蔊";s:2:"V";s:3:"蔧";s:2:"W";s:3:"蔜";s:2:"X";s:3:"蓻";s:2:"Y";s:3:"蔫";s:2:"Z";s:3:"蓺";s:2:"[";s:3:"蔈";s:2:"\";s:3:"蔌";s:2:"]";s:3:"蓴";s:2:"^";s:3:"蔪";s:2:"_";s:3:"蓲";s:2:"`";s:3:"蔕";s:2:"a";s:3:"蓷";s:2:"b";s:3:"蓫";s:2:"c";s:3:"蓳";s:2:"d";s:3:"蓼";s:2:"e";s:3:"蔒";s:2:"f";s:3:"蓪";s:2:"g";s:3:"蓩";s:2:"h";s:3:"蔖";s:2:"i";s:3:"蓾";s:2:"j";s:3:"蔨";s:2:"k";s:3:"蔝";s:2:"l";s:3:"蔮";s:2:"m";s:3:"蔂";s:2:"n";s:3:"蓽";s:2:"o";s:3:"蔞";s:2:"p";s:3:"蓶";s:2:"q";s:3:"蔱";s:2:"r";s:3:"蔦";s:2:"s";s:3:"蓧";s:2:"t";s:3:"蓨";s:2:"u";s:3:"蓰";s:2:"v";s:3:"蓯";s:2:"w";s:3:"蓹";s:2:"x";s:3:"蔘";s:2:"y";s:3:"蔠";s:2:"z";s:3:"蔰";s:2:"{";s:3:"蔋";s:2:"|";s:3:"蔙";s:2:"}";s:3:"蔯";s:2:"~";s:3:"虢";s:2:"";s:3:"蝖";s:2:"";s:3:"蝣";s:2:"";s:3:"蝤";s:2:"";s:3:"蝷";s:2:"";s:3:"蟡";s:2:"";s:3:"蝳";s:2:"";s:3:"蝘";s:2:"";s:3:"蝔";s:2:"";s:3:"蝛";s:2:"";s:3:"蝒";s:2:"";s:3:"蝡";s:2:"";s:3:"蝚";s:2:"";s:3:"蝑";s:2:"";s:3:"蝞";s:2:"";s:3:"蝭";s:2:"";s:3:"蝪";s:2:"";s:3:"蝐";s:2:"";s:3:"蝎";s:2:"";s:3:"蝟";s:2:"";s:3:"蝝";s:2:"";s:3:"蝯";s:2:"";s:3:"蝬";s:2:"";s:3:"蝺";s:2:"";s:3:"蝮";s:2:"";s:3:"蝜";s:2:"";s:3:"蝥";s:2:"";s:3:"蝏";s:2:"";s:3:"蝻";s:2:"";s:3:"蝵";s:2:"";s:3:"蝢";s:2:"";s:3:"蝧";s:2:"";s:3:"蝩";s:2:"";s:3:"衚";s:2:"";s:3:"褅";s:2:"";s:3:"褌";s:2:"";s:3:"褔";s:2:"";s:3:"褋";s:2:"";s:3:"褗";s:2:"";s:3:"褘";s:2:"";s:3:"褙";s:2:"";s:3:"褆";s:2:"";s:3:"褖";s:2:"";s:3:"褑";s:2:"";s:3:"褎";s:2:"";s:3:"褉";s:2:"";s:3:"覢";s:2:"";s:3:"覤";s:2:"";s:3:"覣";s:2:"";s:3:"觭";s:2:"";s:3:"觰";s:2:"";s:3:"觬";s:2:"";s:3:"諏";s:2:"";s:3:"諆";s:2:"";s:3:"誸";s:2:"";s:3:"諓";s:2:"";s:3:"諑";s:2:"";s:3:"諔";s:2:"";s:3:"諕";s:2:"";s:3:"誻";s:2:"";s:3:"諗";s:2:"";s:3:"誾";s:2:"";s:3:"諀";s:2:"";s:3:"諅";s:2:"";s:3:"諘";s:2:"";s:3:"諃";s:2:"";s:3:"誺";s:2:"";s:3:"誽";s:2:"";s:3:"諙";s:2:"";s:3:"谾";s:2:"";s:3:"豍";s:2:"";s:3:"貏";s:2:"";s:3:"賥";s:2:"";s:3:"賟";s:2:"";s:3:"賙";s:2:"";s:3:"賨";s:2:"";s:3:"賚";s:2:"";s:3:"賝";s:2:"";s:3:"賧";s:2:"";s:3:"趠";s:2:"";s:3:"趜";s:2:"";s:3:"趡";s:2:"";s:3:"趛";s:2:"";s:3:"踠";s:2:"";s:3:"踣";s:2:"";s:3:"踥";s:2:"";s:3:"踤";s:2:"";s:3:"踮";s:2:"";s:3:"踕";s:2:"";s:3:"踛";s:2:"";s:3:"踖";s:2:"";s:3:"踑";s:2:"";s:3:"踙";s:2:"";s:3:"踦";s:2:"";s:3:"踧";s:2:"@";s:3:"踔";s:2:"A";s:3:"踒";s:2:"B";s:3:"踘";s:2:"C";s:3:"踓";s:2:"D";s:3:"踜";s:2:"E";s:3:"踗";s:2:"F";s:3:"踚";s:2:"G";s:3:"輬";s:2:"H";s:3:"輤";s:2:"I";s:3:"輘";s:2:"J";s:3:"輚";s:2:"K";s:3:"輠";s:2:"L";s:3:"輣";s:2:"M";s:3:"輖";s:2:"N";s:3:"輗";s:2:"O";s:3:"遳";s:2:"P";s:3:"遰";s:2:"Q";s:3:"遯";s:2:"R";s:3:"遧";s:2:"S";s:3:"遫";s:2:"T";s:3:"鄯";s:2:"U";s:3:"鄫";s:2:"V";s:3:"鄩";s:2:"W";s:3:"鄪";s:2:"X";s:3:"鄲";s:2:"Y";s:3:"鄦";s:2:"Z";s:3:"鄮";s:2:"[";s:3:"醅";s:2:"\";s:3:"醆";s:2:"]";s:3:"醊";s:2:"^";s:3:"醁";s:2:"_";s:3:"醂";s:2:"`";s:3:"醄";s:2:"a";s:3:"醀";s:2:"b";s:3:"鋐";s:2:"c";s:3:"鋃";s:2:"d";s:3:"鋄";s:2:"e";s:3:"鋀";s:2:"f";s:3:"鋙";s:2:"g";s:3:"銶";s:2:"h";s:3:"鋏";s:2:"i";s:3:"鋱";s:2:"j";s:3:"鋟";s:2:"k";s:3:"鋘";s:2:"l";s:3:"鋩";s:2:"m";s:3:"鋗";s:2:"n";s:3:"鋝";s:2:"o";s:3:"鋌";s:2:"p";s:3:"鋯";s:2:"q";s:3:"鋂";s:2:"r";s:3:"鋨";s:2:"s";s:3:"鋊";s:2:"t";s:3:"鋈";s:2:"u";s:3:"鋎";s:2:"v";s:3:"鋦";s:2:"w";s:3:"鋍";s:2:"x";s:3:"鋕";s:2:"y";s:3:"鋉";s:2:"z";s:3:"鋠";s:2:"{";s:3:"鋞";s:2:"|";s:3:"鋧";s:2:"}";s:3:"鋑";s:2:"~";s:3:"鋓";s:2:"";s:3:"銵";s:2:"";s:3:"鋡";s:2:"";s:3:"鋆";s:2:"";s:3:"銴";s:2:"";s:3:"镼";s:2:"";s:3:"閬";s:2:"";s:3:"閫";s:2:"";s:3:"閮";s:2:"";s:3:"閰";s:2:"";s:3:"隤";s:2:"";s:3:"隢";s:2:"";s:3:"雓";s:2:"";s:3:"霅";s:2:"";s:3:"霈";s:2:"";s:3:"霂";s:2:"";s:3:"靚";s:2:"";s:3:"鞊";s:2:"";s:3:"鞎";s:2:"";s:3:"鞈";s:2:"";s:3:"韐";s:2:"";s:3:"韏";s:2:"";s:3:"頞";s:2:"";s:3:"頝";s:2:"";s:3:"頦";s:2:"";s:3:"頩";s:2:"";s:3:"頨";s:2:"";s:3:"頠";s:2:"";s:3:"頛";s:2:"";s:3:"頧";s:2:"";s:3:"颲";s:2:"";s:3:"餈";s:2:"";s:3:"飺";s:2:"";s:3:"餑";s:2:"";s:3:"餔";s:2:"";s:3:"餖";s:2:"";s:3:"餗";s:2:"";s:3:"餕";s:2:"";s:3:"駜";s:2:"";s:3:"駍";s:2:"";s:3:"駏";s:2:"";s:3:"駓";s:2:"";s:3:"駔";s:2:"";s:3:"駎";s:2:"";s:3:"駉";s:2:"";s:3:"駖";s:2:"";s:3:"駘";s:2:"";s:3:"駋";s:2:"";s:3:"駗";s:2:"";s:3:"駌";s:2:"";s:3:"骳";s:2:"";s:3:"髬";s:2:"";s:3:"髫";s:2:"";s:3:"髳";s:2:"";s:3:"髲";s:2:"";s:3:"髱";s:2:"";s:3:"魆";s:2:"";s:3:"魃";s:2:"";s:3:"魧";s:2:"";s:3:"魴";s:2:"";s:3:"魱";s:2:"";s:3:"魦";s:2:"";s:3:"魶";s:2:"";s:3:"魵";s:2:"";s:3:"魰";s:2:"";s:3:"魨";s:2:"";s:3:"魤";s:2:"";s:3:"魬";s:2:"";s:3:"鳼";s:2:"";s:3:"鳺";s:2:"";s:3:"鳽";s:2:"";s:3:"鳿";s:2:"";s:3:"鳷";s:2:"";s:3:"鴇";s:2:"";s:3:"鴀";s:2:"";s:3:"鳹";s:2:"";s:3:"鳻";s:2:"";s:3:"鴈";s:2:"";s:3:"鴅";s:2:"";s:3:"鴄";s:2:"";s:3:"麃";s:2:"";s:3:"黓";s:2:"";s:3:"鼏";s:2:"";s:3:"鼐";s:2:"";s:3:"儜";s:2:"";s:3:"儓";s:2:"";s:3:"儗";s:2:"";s:3:"儚";s:2:"";s:3:"儑";s:2:"";s:3:"凞";s:2:"";s:3:"匴";s:2:"";s:3:"叡";s:2:"";s:3:"噰";s:2:"";s:3:"噠";s:2:"";s:3:"噮";s:2:"@";s:3:"噳";s:2:"A";s:3:"噦";s:2:"B";s:3:"噣";s:2:"C";s:3:"噭";s:2:"D";s:3:"噲";s:2:"E";s:3:"噞";s:2:"F";s:3:"噷";s:2:"G";s:3:"圜";s:2:"H";s:3:"圛";s:2:"I";s:3:"壈";s:2:"J";s:3:"墽";s:2:"K";s:3:"壉";s:2:"L";s:3:"墿";s:2:"M";s:3:"墺";s:2:"N";s:3:"壂";s:2:"O";s:3:"墼";s:2:"P";s:3:"壆";s:2:"Q";s:3:"嬗";s:2:"R";s:3:"嬙";s:2:"S";s:3:"嬛";s:2:"T";s:3:"嬡";s:2:"U";s:3:"嬔";s:2:"V";s:3:"嬓";s:2:"W";s:3:"嬐";s:2:"X";s:3:"嬖";s:2:"Y";s:3:"嬨";s:2:"Z";s:3:"嬚";s:2:"[";s:3:"嬠";s:2:"\";s:3:"嬞";s:2:"]";s:3:"寯";s:2:"^";s:3:"嶬";s:2:"_";s:3:"嶱";s:2:"`";s:3:"嶩";s:2:"a";s:3:"嶧";s:2:"b";s:3:"嶵";s:2:"c";s:3:"嶰";s:2:"d";s:3:"嶮";s:2:"e";s:3:"嶪";s:2:"f";s:3:"嶨";s:2:"g";s:3:"嶲";s:2:"h";s:3:"嶭";s:2:"i";s:3:"嶯";s:2:"j";s:3:"嶴";s:2:"k";s:3:"幧";s:2:"l";s:3:"幨";s:2:"m";s:3:"幦";s:2:"n";s:3:"幯";s:2:"o";s:3:"廩";s:2:"p";s:3:"廧";s:2:"q";s:3:"廦";s:2:"r";s:3:"廨";s:2:"s";s:3:"廥";s:2:"t";s:3:"彋";s:2:"u";s:3:"徼";s:2:"v";s:3:"憝";s:2:"w";s:3:"憨";s:2:"x";s:3:"憖";s:2:"y";s:3:"懅";s:2:"z";s:3:"憴";s:2:"{";s:3:"懆";s:2:"|";s:3:"懁";s:2:"}";s:3:"懌";s:2:"~";s:3:"憺";s:2:"";s:3:"憿";s:2:"";s:3:"憸";s:2:"";s:3:"憌";s:2:"";s:3:"擗";s:2:"";s:3:"擖";s:2:"";s:3:"擐";s:2:"";s:3:"擏";s:2:"";s:3:"擉";s:2:"";s:3:"撽";s:2:"";s:3:"撉";s:2:"";s:3:"擃";s:2:"";s:3:"擛";s:2:"";s:3:"擳";s:2:"";s:3:"擙";s:2:"";s:3:"攳";s:2:"";s:3:"敿";s:2:"";s:3:"敼";s:2:"";s:3:"斢";s:2:"";s:3:"曈";s:2:"";s:3:"暾";s:2:"";s:3:"曀";s:2:"";s:3:"曊";s:2:"";s:3:"曋";s:2:"";s:3:"曏";s:2:"";s:3:"暽";s:2:"";s:3:"暻";s:2:"";s:3:"暺";s:2:"";s:3:"曌";s:2:"";s:3:"朣";s:2:"";s:3:"樴";s:2:"";s:3:"橦";s:2:"";s:3:"橉";s:2:"";s:3:"橧";s:2:"";s:3:"樲";s:2:"";s:3:"橨";s:2:"";s:3:"樾";s:2:"";s:3:"橝";s:2:"";s:3:"橭";s:2:"";s:3:"橶";s:2:"";s:3:"橛";s:2:"";s:3:"橑";s:2:"";s:3:"樨";s:2:"";s:3:"橚";s:2:"";s:3:"樻";s:2:"";s:3:"樿";s:2:"";s:3:"橁";s:2:"";s:3:"橪";s:2:"";s:3:"橤";s:2:"";s:3:"橐";s:2:"";s:3:"橏";s:2:"";s:3:"橔";s:2:"";s:3:"橯";s:2:"";s:3:"橩";s:2:"";s:3:"橠";s:2:"";s:3:"樼";s:2:"";s:3:"橞";s:2:"";s:3:"橖";s:2:"";s:3:"橕";s:2:"";s:3:"橍";s:2:"";s:3:"橎";s:2:"";s:3:"橆";s:2:"";s:3:"歕";s:2:"";s:3:"歔";s:2:"";s:3:"歖";s:2:"";s:3:"殧";s:2:"";s:3:"殪";s:2:"";s:3:"殫";s:2:"";s:3:"毈";s:2:"";s:3:"毇";s:2:"";s:3:"氄";s:2:"";s:3:"氃";s:2:"";s:3:"氆";s:2:"";s:3:"澭";s:2:"";s:3:"濋";s:2:"";s:3:"澣";s:2:"";s:3:"濇";s:2:"";s:3:"澼";s:2:"";s:3:"濎";s:2:"";s:3:"濈";s:2:"";s:3:"潞";s:2:"";s:3:"濄";s:2:"";s:3:"澽";s:2:"";s:3:"澞";s:2:"";s:3:"濊";s:2:"";s:3:"澨";s:2:"";s:3:"瀄";s:2:"";s:3:"澥";s:2:"";s:3:"澮";s:2:"";s:3:"澺";s:2:"";s:3:"澬";s:2:"";s:3:"澪";s:2:"";s:3:"濏";s:2:"";s:3:"澿";s:2:"";s:3:"澸";s:2:"@";s:3:"澢";s:2:"A";s:3:"濉";s:2:"B";s:3:"澫";s:2:"C";s:3:"濍";s:2:"D";s:3:"澯";s:2:"E";s:3:"澲";s:2:"F";s:3:"澰";s:2:"G";s:3:"燅";s:2:"H";s:3:"燂";s:2:"I";s:3:"熿";s:2:"J";s:3:"熸";s:2:"K";s:3:"燖";s:2:"L";s:3:"燀";s:2:"M";s:3:"燁";s:2:"N";s:3:"燋";s:2:"O";s:3:"燔";s:2:"P";s:3:"燊";s:2:"Q";s:3:"燇";s:2:"R";s:3:"燏";s:2:"S";s:3:"熽";s:2:"T";s:3:"燘";s:2:"U";s:3:"熼";s:2:"V";s:3:"燆";s:2:"W";s:3:"燚";s:2:"X";s:3:"燛";s:2:"Y";s:3:"犝";s:2:"Z";s:3:"犞";s:2:"[";s:3:"獩";s:2:"\";s:3:"獦";s:2:"]";s:3:"獧";s:2:"^";s:3:"獬";s:2:"_";s:3:"獥";s:2:"`";s:3:"獫";s:2:"a";s:3:"獪";s:2:"b";s:3:"瑿";s:2:"c";s:3:"璚";s:2:"d";s:3:"璠";s:2:"e";s:3:"璔";s:2:"f";s:3:"璒";s:2:"g";s:3:"璕";s:2:"h";s:3:"璡";s:2:"i";s:3:"甋";s:2:"j";s:3:"疀";s:2:"k";s:3:"瘯";s:2:"l";s:3:"瘭";s:2:"m";s:3:"瘱";s:2:"n";s:3:"瘽";s:2:"o";s:3:"瘳";s:2:"p";s:3:"瘼";s:2:"q";s:3:"瘵";s:2:"r";s:3:"瘲";s:2:"s";s:3:"瘰";s:2:"t";s:3:"皻";s:2:"u";s:3:"盦";s:2:"v";s:3:"瞚";s:2:"w";s:3:"瞝";s:2:"x";s:3:"瞡";s:2:"y";s:3:"瞜";s:2:"z";s:3:"瞛";s:2:"{";s:3:"瞢";s:2:"|";s:3:"瞣";s:2:"}";s:3:"瞕";s:2:"~";s:3:"瞙";s:2:"";s:3:"瞗";s:2:"";s:3:"磝";s:2:"";s:3:"磩";s:2:"";s:3:"磥";s:2:"";s:3:"磪";s:2:"";s:3:"磞";s:2:"";s:3:"磣";s:2:"";s:3:"磛";s:2:"";s:3:"磡";s:2:"";s:3:"磢";s:2:"";s:3:"磭";s:2:"";s:3:"磟";s:2:"";s:3:"磠";s:2:"";s:3:"禤";s:2:"";s:3:"穄";s:2:"";s:3:"穈";s:2:"";s:3:"穇";s:2:"";s:3:"窶";s:2:"";s:3:"窸";s:2:"";s:3:"窵";s:2:"";s:3:"窱";s:2:"";s:3:"窷";s:2:"";s:3:"篞";s:2:"";s:3:"篣";s:2:"";s:3:"篧";s:2:"";s:3:"篝";s:2:"";s:3:"篕";s:2:"";s:3:"篥";s:2:"";s:3:"篚";s:2:"";s:3:"篨";s:2:"";s:3:"篹";s:2:"";s:3:"篔";s:2:"";s:3:"篪";s:2:"";s:3:"篢";s:2:"";s:3:"篜";s:2:"";s:3:"篫";s:2:"";s:3:"篘";s:2:"";s:3:"篟";s:2:"";s:3:"糒";s:2:"";s:3:"糔";s:2:"";s:3:"糗";s:2:"";s:3:"糐";s:2:"";s:3:"糑";s:2:"";s:3:"縒";s:2:"";s:3:"縡";s:2:"";s:3:"縗";s:2:"";s:3:"縌";s:2:"";s:3:"縟";s:2:"";s:3:"縠";s:2:"";s:3:"縓";s:2:"";s:3:"縎";s:2:"";s:3:"縜";s:2:"";s:3:"縕";s:2:"";s:3:"縚";s:2:"";s:3:"縢";s:2:"";s:3:"縋";s:2:"";s:3:"縏";s:2:"";s:3:"縖";s:2:"";s:3:"縍";s:2:"";s:3:"縔";s:2:"";s:3:"縥";s:2:"";s:3:"縤";s:2:"";s:3:"罃";s:2:"";s:3:"罻";s:2:"";s:3:"罼";s:2:"";s:3:"罺";s:2:"";s:3:"羱";s:2:"";s:3:"翯";s:2:"";s:3:"耪";s:2:"";s:3:"耩";s:2:"";s:3:"聬";s:2:"";s:3:"膱";s:2:"";s:3:"膦";s:2:"";s:3:"膮";s:2:"";s:3:"膹";s:2:"";s:3:"膵";s:2:"";s:3:"膫";s:2:"";s:3:"膰";s:2:"";s:3:"膬";s:2:"";s:3:"膴";s:2:"";s:3:"膲";s:2:"";s:3:"膷";s:2:"";s:3:"膧";s:2:"";s:3:"臲";s:2:"";s:3:"艕";s:2:"";s:3:"艖";s:2:"";s:3:"艗";s:2:"";s:3:"蕖";s:2:"";s:3:"蕅";s:2:"";s:3:"蕫";s:2:"";s:3:"蕍";s:2:"";s:3:"蕓";s:2:"";s:3:"蕡";s:2:"";s:3:"蕘";s:2:"@";s:3:"蕀";s:2:"A";s:3:"蕆";s:2:"B";s:3:"蕤";s:2:"C";s:3:"蕁";s:2:"D";s:3:"蕢";s:2:"E";s:3:"蕄";s:2:"F";s:3:"蕑";s:2:"G";s:3:"蕇";s:2:"H";s:3:"蕣";s:2:"I";s:3:"蔾";s:2:"J";s:3:"蕛";s:2:"K";s:3:"蕱";s:2:"L";s:3:"蕎";s:2:"M";s:3:"蕮";s:2:"N";s:3:"蕵";s:2:"O";s:3:"蕕";s:2:"P";s:3:"蕧";s:2:"Q";s:3:"蕠";s:2:"R";s:3:"薌";s:2:"S";s:3:"蕦";s:2:"T";s:3:"蕝";s:2:"U";s:3:"蕔";s:2:"V";s:3:"蕥";s:2:"W";s:3:"蕬";s:2:"X";s:3:"虣";s:2:"Y";s:3:"虥";s:2:"Z";s:3:"虤";s:2:"[";s:3:"螛";s:2:"\";s:3:"螏";s:2:"]";s:3:"螗";s:2:"^";s:3:"螓";s:2:"_";s:3:"螒";s:2:"`";s:3:"螈";s:2:"a";s:3:"螁";s:2:"b";s:3:"螖";s:2:"c";s:3:"螘";s:2:"d";s:3:"蝹";s:2:"e";s:3:"螇";s:2:"f";s:3:"螣";s:2:"g";s:3:"螅";s:2:"h";s:3:"螐";s:2:"i";s:3:"螑";s:2:"j";s:3:"螝";s:2:"k";s:3:"螄";s:2:"l";s:3:"螔";s:2:"m";s:3:"螜";s:2:"n";s:3:"螚";s:2:"o";s:3:"螉";s:2:"p";s:3:"褞";s:2:"q";s:3:"褦";s:2:"r";s:3:"褰";s:2:"s";s:3:"褭";s:2:"t";s:3:"褮";s:2:"u";s:3:"褧";s:2:"v";s:3:"褱";s:2:"w";s:3:"褢";s:2:"x";s:3:"褩";s:2:"y";s:3:"褣";s:2:"z";s:3:"褯";s:2:"{";s:3:"褬";s:2:"|";s:3:"褟";s:2:"}";s:3:"觱";s:2:"~";s:3:"諠";s:2:"";s:3:"諢";s:2:"";s:3:"諲";s:2:"";s:3:"諴";s:2:"";s:3:"諵";s:2:"";s:3:"諝";s:2:"";s:3:"謔";s:2:"";s:3:"諤";s:2:"";s:3:"諟";s:2:"";s:3:"諰";s:2:"";s:3:"諈";s:2:"";s:3:"諞";s:2:"";s:3:"諡";s:2:"";s:3:"諨";s:2:"";s:3:"諿";s:2:"";s:3:"諯";s:2:"";s:3:"諻";s:2:"";s:3:"貑";s:2:"";s:3:"貒";s:2:"";s:3:"貐";s:2:"";s:3:"賵";s:2:"";s:3:"賮";s:2:"";s:3:"賱";s:2:"";s:3:"賰";s:2:"";s:3:"賳";s:2:"";s:3:"赬";s:2:"";s:3:"赮";s:2:"";s:3:"趥";s:2:"";s:3:"趧";s:2:"";s:3:"踳";s:2:"";s:3:"踾";s:2:"";s:3:"踸";s:2:"";s:3:"蹀";s:2:"";s:3:"蹅";s:2:"";s:3:"踶";s:2:"";s:3:"踼";s:2:"";s:3:"踽";s:2:"";s:3:"蹁";s:2:"";s:3:"踰";s:2:"";s:3:"踿";s:2:"";s:3:"躽";s:2:"";s:3:"輶";s:2:"";s:3:"輮";s:2:"";s:3:"輵";s:2:"";s:3:"輲";s:2:"";s:3:"輹";s:2:"";s:3:"輷";s:2:"";s:3:"輴";s:2:"";s:3:"遶";s:2:"";s:3:"遹";s:2:"";s:3:"遻";s:2:"";s:3:"邆";s:2:"";s:3:"郺";s:2:"";s:3:"鄳";s:2:"";s:3:"鄵";s:2:"";s:3:"鄶";s:2:"";s:3:"醓";s:2:"";s:3:"醐";s:2:"";s:3:"醑";s:2:"";s:3:"醍";s:2:"";s:3:"醏";s:2:"";s:3:"錧";s:2:"";s:3:"錞";s:2:"";s:3:"錈";s:2:"";s:3:"錟";s:2:"";s:3:"錆";s:2:"";s:3:"錏";s:2:"";s:3:"鍺";s:2:"";s:3:"錸";s:2:"";s:3:"錼";s:2:"";s:3:"錛";s:2:"";s:3:"錣";s:2:"";s:3:"錒";s:2:"";s:3:"錁";s:2:"";s:3:"鍆";s:2:"";s:3:"錭";s:2:"";s:3:"錎";s:2:"";s:3:"錍";s:2:"";s:3:"鋋";s:2:"";s:3:"錝";s:2:"";s:3:"鋺";s:2:"";s:3:"錥";s:2:"";s:3:"錓";s:2:"";s:3:"鋹";s:2:"";s:3:"鋷";s:2:"";s:3:"錴";s:2:"";s:3:"錂";s:2:"";s:3:"錤";s:2:"";s:3:"鋿";s:2:"";s:3:"錩";s:2:"";s:3:"錹";s:2:"";s:3:"錵";s:2:"";s:3:"錪";s:2:"";s:3:"錔";s:2:"";s:3:"錌";s:2:"@";s:3:"錋";s:2:"A";s:3:"鋾";s:2:"B";s:3:"錉";s:2:"C";s:3:"錀";s:2:"D";s:3:"鋻";s:2:"E";s:3:"錖";s:2:"F";s:3:"閼";s:2:"G";s:3:"闍";s:2:"H";s:3:"閾";s:2:"I";s:3:"閹";s:2:"J";s:3:"閺";s:2:"K";s:3:"閶";s:2:"L";s:3:"閿";s:2:"M";s:3:"閵";s:2:"N";s:3:"閽";s:2:"O";s:3:"隩";s:2:"P";s:3:"雔";s:2:"Q";s:3:"霋";s:2:"R";s:3:"霒";s:2:"S";s:3:"霐";s:2:"T";s:3:"鞙";s:2:"U";s:3:"鞗";s:2:"V";s:3:"鞔";s:2:"W";s:3:"韰";s:2:"X";s:3:"韸";s:2:"Y";s:3:"頵";s:2:"Z";s:3:"頯";s:2:"[";s:3:"頲";s:2:"\";s:3:"餤";s:2:"]";s:3:"餟";s:2:"^";s:3:"餧";s:2:"_";s:3:"餩";s:2:"`";s:3:"馞";s:2:"a";s:3:"駮";s:2:"b";s:3:"駬";s:2:"c";s:3:"駥";s:2:"d";s:3:"駤";s:2:"e";s:3:"駰";s:2:"f";s:3:"駣";s:2:"g";s:3:"駪";s:2:"h";s:3:"駩";s:2:"i";s:3:"駧";s:2:"j";s:3:"骹";s:2:"k";s:3:"骿";s:2:"l";s:3:"骴";s:2:"m";s:3:"骻";s:2:"n";s:3:"髶";s:2:"o";s:3:"髺";s:2:"p";s:3:"髹";s:2:"q";s:3:"髷";s:2:"r";s:3:"鬳";s:2:"s";s:3:"鮀";s:2:"t";s:3:"鮅";s:2:"u";s:3:"鮇";s:2:"v";s:3:"魼";s:2:"w";s:3:"魾";s:2:"x";s:3:"魻";s:2:"y";s:3:"鮂";s:2:"z";s:3:"鮓";s:2:"{";s:3:"鮒";s:2:"|";s:3:"鮐";s:2:"}";s:3:"魺";s:2:"~";s:3:"鮕";s:2:"";s:3:"魽";s:2:"";s:3:"鮈";s:2:"";s:3:"鴥";s:2:"";s:3:"鴗";s:2:"";s:3:"鴠";s:2:"";s:3:"鴞";s:2:"";s:3:"鴔";s:2:"";s:3:"鴩";s:2:"";s:3:"鴝";s:2:"";s:3:"鴘";s:2:"";s:3:"鴢";s:2:"";s:3:"鴐";s:2:"";s:3:"鴙";s:2:"";s:3:"鴟";s:2:"";s:3:"麈";s:2:"";s:3:"麆";s:2:"";s:3:"麇";s:2:"";s:3:"麮";s:2:"";s:3:"麭";s:2:"";s:3:"黕";s:2:"";s:3:"黖";s:2:"";s:3:"黺";s:2:"";s:3:"鼒";s:2:"";s:3:"鼽";s:2:"";s:3:"儦";s:2:"";s:3:"儥";s:2:"";s:3:"儢";s:2:"";s:3:"儤";s:2:"";s:3:"儠";s:2:"";s:3:"儩";s:2:"";s:3:"勴";s:2:"";s:3:"嚓";s:2:"";s:3:"嚌";s:2:"";s:3:"嚍";s:2:"";s:3:"嚆";s:2:"";s:3:"嚄";s:2:"";s:3:"嚃";s:2:"";s:3:"噾";s:2:"";s:3:"嚂";s:2:"";s:3:"噿";s:2:"";s:3:"嚁";s:2:"";s:3:"壖";s:2:"";s:3:"壔";s:2:"";s:3:"壏";s:2:"";s:3:"壒";s:2:"";s:3:"嬭";s:2:"";s:3:"嬥";s:2:"";s:3:"嬲";s:2:"";s:3:"嬣";s:2:"";s:3:"嬬";s:2:"";s:3:"嬧";s:2:"";s:3:"嬦";s:2:"";s:3:"嬯";s:2:"";s:3:"嬮";s:2:"";s:3:"孻";s:2:"";s:3:"寱";s:2:"";s:3:"寲";s:2:"";s:3:"嶷";s:2:"";s:3:"幬";s:2:"";s:3:"幪";s:2:"";s:3:"徾";s:2:"";s:3:"徻";s:2:"";s:3:"懃";s:2:"";s:3:"憵";s:2:"";s:3:"憼";s:2:"";s:3:"懧";s:2:"";s:3:"懠";s:2:"";s:3:"懥";s:2:"";s:3:"懤";s:2:"";s:3:"懨";s:2:"";s:3:"懞";s:2:"";s:3:"擯";s:2:"";s:3:"擩";s:2:"";s:3:"擣";s:2:"";s:3:"擫";s:2:"";s:3:"擤";s:2:"";s:3:"擨";s:2:"";s:3:"斁";s:2:"";s:3:"斀";s:2:"";s:3:"斶";s:2:"";s:3:"旚";s:2:"";s:3:"曒";s:2:"";s:3:"檍";s:2:"";s:3:"檖";s:2:"";s:3:"檁";s:2:"";s:3:"檥";s:2:"";s:3:"檉";s:2:"";s:3:"檟";s:2:"";s:3:"檛";s:2:"";s:3:"檡";s:2:"";s:3:"檞";s:2:"";s:3:"檇";s:2:"";s:3:"檓";s:2:"";s:3:"檎";s:2:"@";s:3:"檕";s:2:"A";s:3:"檃";s:2:"B";s:3:"檨";s:2:"C";s:3:"檤";s:2:"D";s:3:"檑";s:2:"E";s:3:"橿";s:2:"F";s:3:"檦";s:2:"G";s:3:"檚";s:2:"H";s:3:"檅";s:2:"I";s:3:"檌";s:2:"J";s:3:"檒";s:2:"K";s:3:"歛";s:2:"L";s:3:"殭";s:2:"M";s:3:"氉";s:2:"N";s:3:"濌";s:2:"O";s:3:"澩";s:2:"P";s:3:"濴";s:2:"Q";s:3:"濔";s:2:"R";s:3:"濣";s:2:"S";s:3:"濜";s:2:"T";s:3:"濭";s:2:"U";s:3:"濧";s:2:"V";s:3:"濦";s:2:"W";s:3:"濞";s:2:"X";s:3:"濲";s:2:"Y";s:3:"濝";s:2:"Z";s:3:"濢";s:2:"[";s:3:"濨";s:2:"\";s:3:"燡";s:2:"]";s:3:"燱";s:2:"^";s:3:"燨";s:2:"_";s:3:"燲";s:2:"`";s:3:"燤";s:2:"a";s:3:"燰";s:2:"b";s:3:"燢";s:2:"c";s:3:"獳";s:2:"d";s:3:"獮";s:2:"e";s:3:"獯";s:2:"f";s:3:"璗";s:2:"g";s:3:"璲";s:2:"h";s:3:"璫";s:2:"i";s:3:"璐";s:2:"j";s:3:"璪";s:2:"k";s:3:"璭";s:2:"l";s:3:"璱";s:2:"m";s:3:"璥";s:2:"n";s:3:"璯";s:2:"o";s:3:"甐";s:2:"p";s:3:"甑";s:2:"q";s:3:"甒";s:2:"r";s:3:"甏";s:2:"s";s:3:"疄";s:2:"t";s:3:"癃";s:2:"u";s:3:"癈";s:2:"v";s:3:"癉";s:2:"w";s:3:"癇";s:2:"x";s:3:"皤";s:2:"y";s:3:"盩";s:2:"z";s:3:"瞵";s:2:"{";s:3:"瞫";s:2:"|";s:3:"瞲";s:2:"}";s:3:"瞷";s:2:"~";s:3:"瞶";s:2:"";s:3:"瞴";s:2:"";s:3:"瞱";s:2:"";s:3:"瞨";s:2:"";s:3:"矰";s:2:"";s:3:"磳";s:2:"";s:3:"磽";s:2:"";s:3:"礂";s:2:"";s:3:"磻";s:2:"";s:3:"磼";s:2:"";s:3:"磲";s:2:"";s:3:"礅";s:2:"";s:3:"磹";s:2:"";s:3:"磾";s:2:"";s:3:"礄";s:2:"";s:3:"禫";s:2:"";s:3:"禨";s:2:"";s:3:"穜";s:2:"";s:3:"穛";s:2:"";s:3:"穖";s:2:"";s:3:"穘";s:2:"";s:3:"穔";s:2:"";s:3:"穚";s:2:"";s:3:"窾";s:2:"";s:3:"竀";s:2:"";s:3:"竁";s:2:"";s:3:"簅";s:2:"";s:3:"簏";s:2:"";s:3:"篲";s:2:"";s:3:"簀";s:2:"";s:3:"篿";s:2:"";s:3:"篻";s:2:"";s:3:"簎";s:2:"";s:3:"篴";s:2:"";s:3:"簋";s:2:"";s:3:"篳";s:2:"";s:3:"簂";s:2:"";s:3:"簉";s:2:"";s:3:"簃";s:2:"";s:3:"簁";s:2:"";s:3:"篸";s:2:"";s:3:"篽";s:2:"";s:3:"簆";s:2:"";s:3:"篰";s:2:"";s:3:"篱";s:2:"";s:3:"簐";s:2:"";s:3:"簊";s:2:"";s:3:"糨";s:2:"";s:3:"縭";s:2:"";s:3:"縼";s:2:"";s:3:"繂";s:2:"";s:3:"縳";s:2:"";s:3:"顈";s:2:"";s:3:"縸";s:2:"";s:3:"縪";s:2:"";s:3:"繉";s:2:"";s:3:"繀";s:2:"";s:3:"繇";s:2:"";s:3:"縩";s:2:"";s:3:"繌";s:2:"";s:3:"縰";s:2:"";s:3:"縻";s:2:"";s:3:"縶";s:2:"";s:3:"繄";s:2:"";s:3:"縺";s:2:"";s:3:"罅";s:2:"";s:3:"罿";s:2:"";s:3:"罾";s:2:"";s:3:"罽";s:2:"";s:3:"翴";s:2:"";s:3:"翲";s:2:"";s:3:"耬";s:2:"";s:3:"膻";s:2:"";s:3:"臄";s:2:"";s:3:"臌";s:2:"";s:3:"臊";s:2:"";s:3:"臅";s:2:"";s:3:"臇";s:2:"";s:3:"膼";s:2:"";s:3:"臩";s:2:"";s:3:"艛";s:2:"";s:3:"艚";s:2:"";s:3:"艜";s:2:"";s:3:"薃";s:2:"";s:3:"薀";s:2:"";s:3:"薏";s:2:"";s:3:"薧";s:2:"";s:3:"薕";s:2:"";s:3:"薠";s:2:"";s:3:"薋";s:2:"";s:3:"薣";s:2:"";s:3:"蕻";s:2:"";s:3:"薤";s:2:"";s:3:"薚";s:2:"";s:3:"薞";s:2:"@";s:3:"蕷";s:2:"A";s:3:"蕼";s:2:"B";s:3:"薉";s:2:"C";s:3:"薡";s:2:"D";s:3:"蕺";s:2:"E";s:3:"蕸";s:2:"F";s:3:"蕗";s:2:"G";s:3:"薎";s:2:"H";s:3:"薖";s:2:"I";s:3:"薆";s:2:"J";s:3:"薍";s:2:"K";s:3:"薙";s:2:"L";s:3:"薝";s:2:"M";s:3:"薁";s:2:"N";s:3:"薢";s:2:"O";s:3:"薂";s:2:"P";s:3:"薈";s:2:"Q";s:3:"薅";s:2:"R";s:3:"蕹";s:2:"S";s:3:"蕶";s:2:"T";s:3:"薘";s:2:"U";s:3:"薐";s:2:"V";s:3:"薟";s:2:"W";s:3:"虨";s:2:"X";s:3:"螾";s:2:"Y";s:3:"螪";s:2:"Z";s:3:"螭";s:2:"[";s:3:"蟅";s:2:"\";s:3:"螰";s:2:"]";s:3:"螬";s:2:"^";s:3:"螹";s:2:"_";s:3:"螵";s:2:"`";s:3:"螼";s:2:"a";s:3:"螮";s:2:"b";s:3:"蟉";s:2:"c";s:3:"蟃";s:2:"d";s:3:"蟂";s:2:"e";s:3:"蟌";s:2:"f";s:3:"螷";s:2:"g";s:3:"螯";s:2:"h";s:3:"蟄";s:2:"i";s:3:"蟊";s:2:"j";s:3:"螴";s:2:"k";s:3:"螶";s:2:"l";s:3:"螿";s:2:"m";s:3:"螸";s:2:"n";s:3:"螽";s:2:"o";s:3:"蟞";s:2:"p";s:3:"螲";s:2:"q";s:3:"褵";s:2:"r";s:3:"褳";s:2:"s";s:3:"褼";s:2:"t";s:3:"褾";s:2:"u";s:3:"襁";s:2:"v";s:3:"襒";s:2:"w";s:3:"褷";s:2:"x";s:3:"襂";s:2:"y";s:3:"覭";s:2:"z";s:3:"覯";s:2:"{";s:3:"覮";s:2:"|";s:3:"觲";s:2:"}";s:3:"觳";s:2:"~";s:3:"謞";s:2:"";s:3:"謘";s:2:"";s:3:"謖";s:2:"";s:3:"謑";s:2:"";s:3:"謅";s:2:"";s:3:"謋";s:2:"";s:3:"謢";s:2:"";s:3:"謏";s:2:"";s:3:"謒";s:2:"";s:3:"謕";s:2:"";s:3:"謇";s:2:"";s:3:"謍";s:2:"";s:3:"謈";s:2:"";s:3:"謆";s:2:"";s:3:"謜";s:2:"";s:3:"謓";s:2:"";s:3:"謚";s:2:"";s:3:"豏";s:2:"";s:3:"豰";s:2:"";s:3:"豲";s:2:"";s:3:"豱";s:2:"";s:3:"豯";s:2:"";s:3:"貕";s:2:"";s:3:"貔";s:2:"";s:3:"賹";s:2:"";s:3:"赯";s:2:"";s:3:"蹎";s:2:"";s:3:"蹍";s:2:"";s:3:"蹓";s:2:"";s:3:"蹐";s:2:"";s:3:"蹌";s:2:"";s:3:"蹇";s:2:"";s:3:"轃";s:2:"";s:3:"轀";s:2:"";s:3:"邅";s:2:"";s:3:"遾";s:2:"";s:3:"鄸";s:2:"";s:3:"醚";s:2:"";s:3:"醢";s:2:"";s:3:"醛";s:2:"";s:3:"醙";s:2:"";s:3:"醟";s:2:"";s:3:"醡";s:2:"";s:3:"醝";s:2:"";s:3:"醠";s:2:"";s:3:"鎡";s:2:"";s:3:"鎃";s:2:"";s:3:"鎯";s:2:"";s:3:"鍤";s:2:"";s:3:"鍖";s:2:"";s:3:"鍇";s:2:"";s:3:"鍼";s:2:"";s:3:"鍘";s:2:"";s:3:"鍜";s:2:"";s:3:"鍶";s:2:"";s:3:"鍉";s:2:"";s:3:"鍐";s:2:"";s:3:"鍑";s:2:"";s:3:"鍠";s:2:"";s:3:"鍭";s:2:"";s:3:"鎏";s:2:"";s:3:"鍌";s:2:"";s:3:"鍪";s:2:"";s:3:"鍹";s:2:"";s:3:"鍗";s:2:"";s:3:"鍕";s:2:"";s:3:"鍒";s:2:"";s:3:"鍏";s:2:"";s:3:"鍱";s:2:"";s:3:"鍷";s:2:"";s:3:"鍻";s:2:"";s:3:"鍡";s:2:"";s:3:"鍞";s:2:"";s:3:"鍣";s:2:"";s:3:"鍧";s:2:"";s:3:"鎀";s:2:"";s:3:"鍎";s:2:"";s:3:"鍙";s:2:"";s:3:"闇";s:2:"";s:3:"闀";s:2:"";s:3:"闉";s:2:"";s:3:"闃";s:2:"";s:3:"闅";s:2:"";s:3:"閷";s:2:"";s:3:"隮";s:2:"";s:3:"隰";s:2:"";s:3:"隬";s:2:"";s:3:"霠";s:2:"";s:3:"霟";s:2:"";s:3:"霘";s:2:"";s:3:"霝";s:2:"";s:3:"霙";s:2:"";s:3:"鞚";s:2:"";s:3:"鞡";s:2:"";s:3:"鞜";s:2:"@";s:3:"鞞";s:2:"A";s:3:"鞝";s:2:"B";s:3:"韕";s:2:"C";s:3:"韔";s:2:"D";s:3:"韱";s:2:"E";s:3:"顁";s:2:"F";s:3:"顄";s:2:"G";s:3:"顊";s:2:"H";s:3:"顉";s:2:"I";s:3:"顅";s:2:"J";s:3:"顃";s:2:"K";s:3:"餥";s:2:"L";s:3:"餫";s:2:"M";s:3:"餬";s:2:"N";s:3:"餪";s:2:"O";s:3:"餳";s:2:"P";s:3:"餲";s:2:"Q";s:3:"餯";s:2:"R";s:3:"餭";s:2:"S";s:3:"餱";s:2:"T";s:3:"餰";s:2:"U";s:3:"馘";s:2:"V";s:3:"馣";s:2:"W";s:3:"馡";s:2:"X";s:3:"騂";s:2:"Y";s:3:"駺";s:2:"Z";s:3:"駴";s:2:"[";s:3:"駷";s:2:"\";s:3:"駹";s:2:"]";s:3:"駸";s:2:"^";s:3:"駶";s:2:"_";s:3:"駻";s:2:"`";s:3:"駽";s:2:"a";s:3:"駾";s:2:"b";s:3:"駼";s:2:"c";s:3:"騃";s:2:"d";s:3:"骾";s:2:"e";s:3:"髾";s:2:"f";s:3:"髽";s:2:"g";s:3:"鬁";s:2:"h";s:3:"髼";s:2:"i";s:3:"魈";s:2:"j";s:3:"鮚";s:2:"k";s:3:"鮨";s:2:"l";s:3:"鮞";s:2:"m";s:3:"鮛";s:2:"n";s:3:"鮦";s:2:"o";s:3:"鮡";s:2:"p";s:3:"鮥";s:2:"q";s:3:"鮤";s:2:"r";s:3:"鮆";s:2:"s";s:3:"鮢";s:2:"t";s:3:"鮠";s:2:"u";s:3:"鮯";s:2:"v";s:3:"鴳";s:2:"w";s:3:"鵁";s:2:"x";s:3:"鵧";s:2:"y";s:3:"鴶";s:2:"z";s:3:"鴮";s:2:"{";s:3:"鴯";s:2:"|";s:3:"鴱";s:2:"}";s:3:"鴸";s:2:"~";s:3:"鴰";s:2:"";s:3:"鵅";s:2:"";s:3:"鵂";s:2:"";s:3:"鵃";s:2:"";s:3:"鴾";s:2:"";s:3:"鴷";s:2:"";s:3:"鵀";s:2:"";s:3:"鴽";s:2:"";s:3:"翵";s:2:"";s:3:"鴭";s:2:"";s:3:"麊";s:2:"";s:3:"麉";s:2:"";s:3:"麍";s:2:"";s:3:"麰";s:2:"";s:3:"黈";s:2:"";s:3:"黚";s:2:"";s:3:"黻";s:2:"";s:3:"黿";s:2:"";s:3:"鼤";s:2:"";s:3:"鼣";s:2:"";s:3:"鼢";s:2:"";s:3:"齔";s:2:"";s:3:"龠";s:2:"";s:3:"儱";s:2:"";s:3:"儭";s:2:"";s:3:"儮";s:2:"";s:3:"嚘";s:2:"";s:3:"嚜";s:2:"";s:3:"嚗";s:2:"";s:3:"嚚";s:2:"";s:3:"嚝";s:2:"";s:3:"嚙";s:2:"";s:3:"奰";s:2:"";s:3:"嬼";s:2:"";s:3:"屩";s:2:"";s:3:"屪";s:2:"";s:3:"巀";s:2:"";s:3:"幭";s:2:"";s:3:"幮";s:2:"";s:3:"懘";s:2:"";s:3:"懟";s:2:"";s:3:"懭";s:2:"";s:3:"懮";s:2:"";s:3:"懱";s:2:"";s:3:"懪";s:2:"";s:3:"懰";s:2:"";s:3:"懫";s:2:"";s:3:"懖";s:2:"";s:3:"懩";s:2:"";s:3:"擿";s:2:"";s:3:"攄";s:2:"";s:3:"擽";s:2:"";s:3:"擸";s:2:"";s:3:"攁";s:2:"";s:3:"攃";s:2:"";s:3:"擼";s:2:"";s:3:"斔";s:2:"";s:3:"旛";s:2:"";s:3:"曚";s:2:"";s:3:"曛";s:2:"";s:3:"曘";s:2:"";s:3:"櫅";s:2:"";s:3:"檹";s:2:"";s:3:"檽";s:2:"";s:3:"櫡";s:2:"";s:3:"櫆";s:2:"";s:3:"檺";s:2:"";s:3:"檶";s:2:"";s:3:"檷";s:2:"";s:3:"櫇";s:2:"";s:3:"檴";s:2:"";s:3:"檭";s:2:"";s:3:"歞";s:2:"";s:3:"毉";s:2:"";s:3:"氋";s:2:"";s:3:"瀇";s:2:"";s:3:"瀌";s:2:"";s:3:"瀍";s:2:"";s:3:"瀁";s:2:"";s:3:"瀅";s:2:"";s:3:"瀔";s:2:"";s:3:"瀎";s:2:"";s:3:"濿";s:2:"";s:3:"瀀";s:2:"";s:3:"濻";s:2:"";s:3:"瀦";s:2:"";s:3:"濼";s:2:"";s:3:"濷";s:2:"";s:3:"瀊";s:2:"";s:3:"爁";s:2:"";s:3:"燿";s:2:"";s:3:"燹";s:2:"";s:3:"爃";s:2:"";s:3:"燽";s:2:"";s:3:"獶";s:2:"@";s:3:"璸";s:2:"A";s:3:"瓀";s:2:"B";s:3:"璵";s:2:"C";s:3:"瓁";s:2:"D";s:3:"璾";s:2:"E";s:3:"璶";s:2:"F";s:3:"璻";s:2:"G";s:3:"瓂";s:2:"H";s:3:"甔";s:2:"I";s:3:"甓";s:2:"J";s:3:"癜";s:2:"K";s:3:"癤";s:2:"L";s:3:"癙";s:2:"M";s:3:"癐";s:2:"N";s:3:"癓";s:2:"O";s:3:"癗";s:2:"P";s:3:"癚";s:2:"Q";s:3:"皦";s:2:"R";s:3:"皽";s:2:"S";s:3:"盬";s:2:"T";s:3:"矂";s:2:"U";s:3:"瞺";s:2:"V";s:3:"磿";s:2:"W";s:3:"礌";s:2:"X";s:3:"礓";s:2:"Y";s:3:"礔";s:2:"Z";s:3:"礉";s:2:"[";s:3:"礐";s:2:"\";s:3:"礒";s:2:"]";s:3:"礑";s:2:"^";s:3:"禭";s:2:"_";s:3:"禬";s:2:"`";s:3:"穟";s:2:"a";s:3:"簜";s:2:"b";s:3:"簩";s:2:"c";s:3:"簙";s:2:"d";s:3:"簠";s:2:"e";s:3:"簟";s:2:"f";s:3:"簭";s:2:"g";s:3:"簝";s:2:"h";s:3:"簦";s:2:"i";s:3:"簨";s:2:"j";s:3:"簢";s:2:"k";s:3:"簥";s:2:"l";s:3:"簰";s:2:"m";s:3:"繜";s:2:"n";s:3:"繐";s:2:"o";s:3:"繖";s:2:"p";s:3:"繣";s:2:"q";s:3:"繘";s:2:"r";s:3:"繢";s:2:"s";s:3:"繟";s:2:"t";s:3:"繑";s:2:"u";s:3:"繠";s:2:"v";s:3:"繗";s:2:"w";s:3:"繓";s:2:"x";s:3:"羵";s:2:"y";s:3:"羳";s:2:"z";s:3:"翷";s:2:"{";s:3:"翸";s:2:"|";s:3:"聵";s:2:"}";s:3:"臑";s:2:"~";s:3:"臒";s:2:"";s:3:"臐";s:2:"";s:3:"艟";s:2:"";s:3:"艞";s:2:"";s:3:"薴";s:2:"";s:3:"藆";s:2:"";s:3:"藀";s:2:"";s:3:"藃";s:2:"";s:3:"藂";s:2:"";s:3:"薳";s:2:"";s:3:"薵";s:2:"";s:3:"薽";s:2:"";s:3:"藇";s:2:"";s:3:"藄";s:2:"";s:3:"薿";s:2:"";s:3:"藋";s:2:"";s:3:"藎";s:2:"";s:3:"藈";s:2:"";s:3:"藅";s:2:"";s:3:"薱";s:2:"";s:3:"薶";s:2:"";s:3:"藒";s:2:"";s:3:"蘤";s:2:"";s:3:"薸";s:2:"";s:3:"薷";s:2:"";s:3:"薾";s:2:"";s:3:"虩";s:2:"";s:3:"蟧";s:2:"";s:3:"蟦";s:2:"";s:3:"蟢";s:2:"";s:3:"蟛";s:2:"";s:3:"蟫";s:2:"";s:3:"蟪";s:2:"";s:3:"蟥";s:2:"";s:3:"蟟";s:2:"";s:3:"蟳";s:2:"";s:3:"蟤";s:2:"";s:3:"蟔";s:2:"";s:3:"蟜";s:2:"";s:3:"蟓";s:2:"";s:3:"蟭";s:2:"";s:3:"蟘";s:2:"";s:3:"蟣";s:2:"";s:3:"螤";s:2:"";s:3:"蟗";s:2:"";s:3:"蟙";s:2:"";s:3:"蠁";s:2:"";s:3:"蟴";s:2:"";s:3:"蟨";s:2:"";s:3:"蟝";s:2:"";s:3:"襓";s:2:"";s:3:"襋";s:2:"";s:3:"襏";s:2:"";s:3:"襌";s:2:"";s:3:"襆";s:2:"";s:3:"襐";s:2:"";s:3:"襑";s:2:"";s:3:"襉";s:2:"";s:3:"謪";s:2:"";s:3:"謧";s:2:"";s:3:"謣";s:2:"";s:3:"謳";s:2:"";s:3:"謰";s:2:"";s:3:"謵";s:2:"";s:3:"譇";s:2:"";s:3:"謯";s:2:"";s:3:"謼";s:2:"";s:3:"謾";s:2:"";s:3:"謱";s:2:"";s:3:"謥";s:2:"";s:3:"謷";s:2:"";s:3:"謦";s:2:"";s:3:"謶";s:2:"";s:3:"謮";s:2:"";s:3:"謤";s:2:"";s:3:"謻";s:2:"";s:3:"謽";s:2:"";s:3:"謺";s:2:"";s:3:"豂";s:2:"";s:3:"豵";s:2:"";s:3:"貙";s:2:"";s:3:"貘";s:2:"";s:3:"貗";s:2:"";s:3:"賾";s:2:"";s:3:"贄";s:2:"";s:3:"贂";s:2:"";s:3:"贀";s:2:"";s:3:"蹜";s:2:"";s:3:"蹢";s:2:"";s:3:"蹠";s:2:"";s:3:"蹗";s:2:"";s:3:"蹖";s:2:"";s:3:"蹞";s:2:"";s:3:"蹥";s:2:"";s:3:"蹧";s:2:"@";s:3:"蹛";s:2:"A";s:3:"蹚";s:2:"B";s:3:"蹡";s:2:"C";s:3:"蹝";s:2:"D";s:3:"蹩";s:2:"E";s:3:"蹔";s:2:"F";s:3:"轆";s:2:"G";s:3:"轇";s:2:"H";s:3:"轈";s:2:"I";s:3:"轋";s:2:"J";s:3:"鄨";s:2:"K";s:3:"鄺";s:2:"L";s:3:"鄻";s:2:"M";s:3:"鄾";s:2:"N";s:3:"醨";s:2:"O";s:3:"醥";s:2:"P";s:3:"醧";s:2:"Q";s:3:"醯";s:2:"R";s:3:"醪";s:2:"S";s:3:"鎵";s:2:"T";s:3:"鎌";s:2:"U";s:3:"鎒";s:2:"V";s:3:"鎷";s:2:"W";s:3:"鎛";s:2:"X";s:3:"鎝";s:2:"Y";s:3:"鎉";s:2:"Z";s:3:"鎧";s:2:"[";s:3:"鎎";s:2:"\";s:3:"鎪";s:2:"]";s:3:"鎞";s:2:"^";s:3:"鎦";s:2:"_";s:3:"鎕";s:2:"`";s:3:"鎈";s:2:"a";s:3:"鎙";s:2:"b";s:3:"鎟";s:2:"c";s:3:"鎍";s:2:"d";s:3:"鎱";s:2:"e";s:3:"鎑";s:2:"f";s:3:"鎲";s:2:"g";s:3:"鎤";s:2:"h";s:3:"鎨";s:2:"i";s:3:"鎴";s:2:"j";s:3:"鎣";s:2:"k";s:3:"鎥";s:2:"l";s:3:"闒";s:2:"m";s:3:"闓";s:2:"n";s:3:"闑";s:2:"o";s:3:"隳";s:2:"p";s:3:"雗";s:2:"q";s:3:"雚";s:2:"r";s:3:"巂";s:2:"s";s:3:"雟";s:2:"t";s:3:"雘";s:2:"u";s:3:"雝";s:2:"v";s:3:"霣";s:2:"w";s:3:"霢";s:2:"x";s:3:"霥";s:2:"y";s:3:"鞬";s:2:"z";s:3:"鞮";s:2:"{";s:3:"鞨";s:2:"|";s:3:"鞫";s:2:"}";s:3:"鞤";s:2:"~";s:3:"鞪";s:2:"";s:3:"鞢";s:2:"";s:3:"鞥";s:2:"";s:3:"韗";s:2:"";s:3:"韙";s:2:"";s:3:"韖";s:2:"";s:3:"韘";s:2:"";s:3:"韺";s:2:"";s:3:"顐";s:2:"";s:3:"顑";s:2:"";s:3:"顒";s:2:"";s:3:"颸";s:2:"";s:3:"饁";s:2:"";s:3:"餼";s:2:"";s:3:"餺";s:2:"";s:3:"騏";s:2:"";s:3:"騋";s:2:"";s:3:"騉";s:2:"";s:3:"騍";s:2:"";s:3:"騄";s:2:"";s:3:"騑";s:2:"";s:3:"騊";s:2:"";s:3:"騅";s:2:"";s:3:"騇";s:2:"";s:3:"騆";s:2:"";s:3:"髀";s:2:"";s:3:"髜";s:2:"";s:3:"鬈";s:2:"";s:3:"鬄";s:2:"";s:3:"鬅";s:2:"";s:3:"鬩";s:2:"";s:3:"鬵";s:2:"";s:3:"魊";s:2:"";s:3:"魌";s:2:"";s:3:"魋";s:2:"";s:3:"鯇";s:2:"";s:3:"鯆";s:2:"";s:3:"鯃";s:2:"";s:3:"鮿";s:2:"";s:3:"鯁";s:2:"";s:3:"鮵";s:2:"";s:3:"鮸";s:2:"";s:3:"鯓";s:2:"";s:3:"鮶";s:2:"";s:3:"鯄";s:2:"";s:3:"鮹";s:2:"";s:3:"鮽";s:2:"";s:3:"鵜";s:2:"";s:3:"鵓";s:2:"";s:3:"鵏";s:2:"";s:3:"鵊";s:2:"";s:3:"鵛";s:2:"";s:3:"鵋";s:2:"";s:3:"鵙";s:2:"";s:3:"鵖";s:2:"";s:3:"鵌";s:2:"";s:3:"鵗";s:2:"";s:3:"鵒";s:2:"";s:3:"鵔";s:2:"";s:3:"鵟";s:2:"";s:3:"鵘";s:2:"";s:3:"鵚";s:2:"";s:3:"麎";s:2:"";s:3:"麌";s:2:"";s:3:"黟";s:2:"";s:3:"鼁";s:2:"";s:3:"鼀";s:2:"";s:3:"鼖";s:2:"";s:3:"鼥";s:2:"";s:3:"鼫";s:2:"";s:3:"鼪";s:2:"";s:3:"鼩";s:2:"";s:3:"鼨";s:2:"";s:3:"齌";s:2:"";s:3:"齕";s:2:"";s:3:"儴";s:2:"";s:3:"儵";s:2:"";s:3:"劖";s:2:"";s:3:"勷";s:2:"";s:3:"厴";s:2:"";s:3:"嚫";s:2:"";s:3:"嚭";s:2:"";s:3:"嚦";s:2:"";s:3:"嚧";s:2:"";s:3:"嚪";s:2:"";s:3:"嚬";s:2:"";s:3:"壚";s:2:"";s:3:"壝";s:2:"";s:3:"壛";s:2:"";s:3:"夒";s:2:"";s:3:"嬽";s:2:"";s:3:"嬾";s:2:"";s:3:"嬿";s:2:"";s:3:"巃";s:2:"";s:3:"幰";s:2:"@";s:3:"徿";s:2:"A";s:3:"懻";s:2:"B";s:3:"攇";s:2:"C";s:3:"攐";s:2:"D";s:3:"攍";s:2:"E";s:3:"攉";s:2:"F";s:3:"攌";s:2:"G";s:3:"攎";s:2:"H";s:3:"斄";s:2:"I";s:3:"旞";s:2:"J";s:3:"旝";s:2:"K";s:3:"曞";s:2:"L";s:3:"櫧";s:2:"M";s:3:"櫠";s:2:"N";s:3:"櫌";s:2:"O";s:3:"櫑";s:2:"P";s:3:"櫙";s:2:"Q";s:3:"櫋";s:2:"R";s:3:"櫟";s:2:"S";s:3:"櫜";s:2:"T";s:3:"櫐";s:2:"U";s:3:"櫫";s:2:"V";s:3:"櫏";s:2:"W";s:3:"櫍";s:2:"X";s:3:"櫞";s:2:"Y";s:3:"歠";s:2:"Z";s:3:"殰";s:2:"[";s:3:"氌";s:2:"\";s:3:"瀙";s:2:"]";s:3:"瀧";s:2:"^";s:3:"瀠";s:2:"_";s:3:"瀖";s:2:"`";s:3:"瀫";s:2:"a";s:3:"瀡";s:2:"b";s:3:"瀢";s:2:"c";s:3:"瀣";s:2:"d";s:3:"瀩";s:2:"e";s:3:"瀗";s:2:"f";s:3:"瀤";s:2:"g";s:3:"瀜";s:2:"h";s:3:"瀪";s:2:"i";s:3:"爌";s:2:"j";s:3:"爊";s:2:"k";s:3:"爇";s:2:"l";s:3:"爂";s:2:"m";s:3:"爅";s:2:"n";s:3:"犥";s:2:"o";s:3:"犦";s:2:"p";s:3:"犤";s:2:"q";s:3:"犣";s:2:"r";s:3:"犡";s:2:"s";s:3:"瓋";s:2:"t";s:3:"瓅";s:2:"u";s:3:"璷";s:2:"v";s:3:"瓃";s:2:"w";s:3:"甖";s:2:"x";s:3:"癠";s:2:"y";s:3:"矉";s:2:"z";s:3:"矊";s:2:"{";s:3:"矄";s:2:"|";s:3:"矱";s:2:"}";s:3:"礝";s:2:"~";s:3:"礛";s:2:"";s:3:"礡";s:2:"";s:3:"礜";s:2:"";s:3:"礗";s:2:"";s:3:"礞";s:2:"";s:3:"禰";s:2:"";s:3:"穧";s:2:"";s:3:"穨";s:2:"";s:3:"簳";s:2:"";s:3:"簼";s:2:"";s:3:"簹";s:2:"";s:3:"簬";s:2:"";s:3:"簻";s:2:"";s:3:"糬";s:2:"";s:3:"糪";s:2:"";s:3:"繶";s:2:"";s:3:"繵";s:2:"";s:3:"繸";s:2:"";s:3:"繰";s:2:"";s:3:"繷";s:2:"";s:3:"繯";s:2:"";s:3:"繺";s:2:"";s:3:"繲";s:2:"";s:3:"繴";s:2:"";s:3:"繨";s:2:"";s:3:"罋";s:2:"";s:3:"罊";s:2:"";s:3:"羃";s:2:"";s:3:"羆";s:2:"";s:3:"羷";s:2:"";s:3:"翽";s:2:"";s:3:"翾";s:2:"";s:3:"聸";s:2:"";s:3:"臗";s:2:"";s:3:"臕";s:2:"";s:3:"艤";s:2:"";s:3:"艡";s:2:"";s:3:"艣";s:2:"";s:3:"藫";s:2:"";s:3:"藱";s:2:"";s:3:"藭";s:2:"";s:3:"藙";s:2:"";s:3:"藡";s:2:"";s:3:"藨";s:2:"";s:3:"藚";s:2:"";s:3:"藗";s:2:"";s:3:"藬";s:2:"";s:3:"藲";s:2:"";s:3:"藸";s:2:"";s:3:"藘";s:2:"";s:3:"藟";s:2:"";s:3:"藣";s:2:"";s:3:"藜";s:2:"";s:3:"藑";s:2:"";s:3:"藰";s:2:"";s:3:"藦";s:2:"";s:3:"藯";s:2:"";s:3:"藞";s:2:"";s:3:"藢";s:2:"";s:3:"蠀";s:2:"";s:3:"蟺";s:2:"";s:3:"蠃";s:2:"";s:3:"蟶";s:2:"";s:3:"蟷";s:2:"";s:3:"蠉";s:2:"";s:3:"蠌";s:2:"";s:3:"蠋";s:2:"";s:3:"蠆";s:2:"";s:3:"蟼";s:2:"";s:3:"蠈";s:2:"";s:3:"蟿";s:2:"";s:3:"蠊";s:2:"";s:3:"蠂";s:2:"";s:3:"襢";s:2:"";s:3:"襚";s:2:"";s:3:"襛";s:2:"";s:3:"襗";s:2:"";s:3:"襡";s:2:"";s:3:"襜";s:2:"";s:3:"襘";s:2:"";s:3:"襝";s:2:"";s:3:"襙";s:2:"";s:3:"覈";s:2:"";s:3:"覷";s:2:"";s:3:"覶";s:2:"";s:3:"觶";s:2:"";s:3:"譐";s:2:"";s:3:"譈";s:2:"";s:3:"譊";s:2:"";s:3:"譀";s:2:"";s:3:"譓";s:2:"";s:3:"譖";s:2:"";s:3:"譔";s:2:"";s:3:"譋";s:2:"";s:3:"譕";s:2:"@";s:3:"譑";s:2:"A";s:3:"譂";s:2:"B";s:3:"譒";s:2:"C";s:3:"譗";s:2:"D";s:3:"豃";s:2:"E";s:3:"豷";s:2:"F";s:3:"豶";s:2:"G";s:3:"貚";s:2:"H";s:3:"贆";s:2:"I";s:3:"贇";s:2:"J";s:3:"贉";s:2:"K";s:3:"趬";s:2:"L";s:3:"趪";s:2:"M";s:3:"趭";s:2:"N";s:3:"趫";s:2:"O";s:3:"蹭";s:2:"P";s:3:"蹸";s:2:"Q";s:3:"蹳";s:2:"R";s:3:"蹪";s:2:"S";s:3:"蹯";s:2:"T";s:3:"蹻";s:2:"U";s:3:"軂";s:2:"V";s:3:"轒";s:2:"W";s:3:"轑";s:2:"X";s:3:"轏";s:2:"Y";s:3:"轐";s:2:"Z";s:3:"轓";s:2:"[";s:3:"辴";s:2:"\";s:3:"酀";s:2:"]";s:3:"鄿";s:2:"^";s:3:"醰";s:2:"_";s:3:"醭";s:2:"`";s:3:"鏞";s:2:"a";s:3:"鏇";s:2:"b";s:3:"鏏";s:2:"c";s:3:"鏂";s:2:"d";s:3:"鏚";s:2:"e";s:3:"鏐";s:2:"f";s:3:"鏹";s:2:"g";s:3:"鏬";s:2:"h";s:3:"鏌";s:2:"i";s:3:"鏙";s:2:"j";s:3:"鎩";s:2:"k";s:3:"鏦";s:2:"l";s:3:"鏊";s:2:"m";s:3:"鏔";s:2:"n";s:3:"鏮";s:2:"o";s:3:"鏣";s:2:"p";s:3:"鏕";s:2:"q";s:3:"鏄";s:2:"r";s:3:"鏎";s:2:"s";s:3:"鏀";s:2:"t";s:3:"鏒";s:2:"u";s:3:"鏧";s:2:"v";s:3:"镽";s:2:"w";s:3:"闚";s:2:"x";s:3:"闛";s:2:"y";s:3:"雡";s:2:"z";s:3:"霩";s:2:"{";s:3:"霫";s:2:"|";s:3:"霬";s:2:"}";s:3:"霨";s:2:"~";s:3:"霦";s:2:"";s:3:"鞳";s:2:"";s:3:"鞷";s:2:"";s:3:"鞶";s:2:"";s:3:"韝";s:2:"";s:3:"韞";s:2:"";s:3:"韟";s:2:"";s:3:"顜";s:2:"";s:3:"顙";s:2:"";s:3:"顝";s:2:"";s:3:"顗";s:2:"";s:3:"颿";s:2:"";s:3:"颽";s:2:"";s:3:"颻";s:2:"";s:3:"颾";s:2:"";s:3:"饈";s:2:"";s:3:"饇";s:2:"";s:3:"饃";s:2:"";s:3:"馦";s:2:"";s:3:"馧";s:2:"";s:3:"騚";s:2:"";s:3:"騕";s:2:"";s:3:"騥";s:2:"";s:3:"騝";s:2:"";s:3:"騤";s:2:"";s:3:"騛";s:2:"";s:3:"騢";s:2:"";s:3:"騠";s:2:"";s:3:"騧";s:2:"";s:3:"騣";s:2:"";s:3:"騞";s:2:"";s:3:"騜";s:2:"";s:3:"騔";s:2:"";s:3:"髂";s:2:"";s:3:"鬋";s:2:"";s:3:"鬊";s:2:"";s:3:"鬎";s:2:"";s:3:"鬌";s:2:"";s:3:"鬷";s:2:"";s:3:"鯪";s:2:"";s:3:"鯫";s:2:"";s:3:"鯠";s:2:"";s:3:"鯞";s:2:"";s:3:"鯤";s:2:"";s:3:"鯦";s:2:"";s:3:"鯢";s:2:"";s:3:"鯰";s:2:"";s:3:"鯔";s:2:"";s:3:"鯗";s:2:"";s:3:"鯬";s:2:"";s:3:"鯜";s:2:"";s:3:"鯙";s:2:"";s:3:"鯥";s:2:"";s:3:"鯕";s:2:"";s:3:"鯡";s:2:"";s:3:"鯚";s:2:"";s:3:"鵷";s:2:"";s:3:"鶁";s:2:"";s:3:"鶊";s:2:"";s:3:"鶄";s:2:"";s:3:"鶈";s:2:"";s:3:"鵱";s:2:"";s:3:"鶀";s:2:"";s:3:"鵸";s:2:"";s:3:"鶆";s:2:"";s:3:"鶋";s:2:"";s:3:"鶌";s:2:"";s:3:"鵽";s:2:"";s:3:"鵫";s:2:"";s:3:"鵴";s:2:"";s:3:"鵵";s:2:"";s:3:"鵰";s:2:"";s:3:"鵩";s:2:"";s:3:"鶅";s:2:"";s:3:"鵳";s:2:"";s:3:"鵻";s:2:"";s:3:"鶂";s:2:"";s:3:"鵯";s:2:"";s:3:"鵹";s:2:"";s:3:"鵿";s:2:"";s:3:"鶇";s:2:"";s:3:"鵨";s:2:"";s:3:"麔";s:2:"";s:3:"麑";s:2:"";s:3:"黀";s:2:"";s:3:"黼";s:2:"";s:3:"鼭";s:2:"";s:3:"齀";s:2:"";s:3:"齁";s:2:"";s:3:"齍";s:2:"";s:3:"齖";s:2:"";s:3:"齗";s:2:"";s:3:"齘";s:2:"";s:3:"匷";s:2:"";s:3:"嚲";s:2:"@";s:3:"嚵";s:2:"A";s:3:"嚳";s:2:"B";s:3:"壣";s:2:"C";s:3:"孅";s:2:"D";s:3:"巆";s:2:"E";s:3:"巇";s:2:"F";s:3:"廮";s:2:"G";s:3:"廯";s:2:"H";s:3:"忀";s:2:"I";s:3:"忁";s:2:"J";s:3:"懹";s:2:"K";s:3:"攗";s:2:"L";s:3:"攖";s:2:"M";s:3:"攕";s:2:"N";s:3:"攓";s:2:"O";s:3:"旟";s:2:"P";s:3:"曨";s:2:"Q";s:3:"曣";s:2:"R";s:3:"曤";s:2:"S";s:3:"櫳";s:2:"T";s:3:"櫰";s:2:"U";s:3:"櫪";s:2:"V";s:3:"櫨";s:2:"W";s:3:"櫹";s:2:"X";s:3:"櫱";s:2:"Y";s:3:"櫮";s:2:"Z";s:3:"櫯";s:2:"[";s:3:"瀼";s:2:"\";s:3:"瀵";s:2:"]";s:3:"瀯";s:2:"^";s:3:"瀷";s:2:"_";s:3:"瀴";s:2:"`";s:3:"瀱";s:2:"a";s:3:"灂";s:2:"b";s:3:"瀸";s:2:"c";s:3:"瀿";s:2:"d";s:3:"瀺";s:2:"e";s:3:"瀹";s:2:"f";s:3:"灀";s:2:"g";s:3:"瀻";s:2:"h";s:3:"瀳";s:2:"i";s:3:"灁";s:2:"j";s:3:"爓";s:2:"k";s:3:"爔";s:2:"l";s:3:"犨";s:2:"m";s:3:"獽";s:2:"n";s:3:"獼";s:2:"o";s:3:"璺";s:2:"p";s:3:"皫";s:2:"q";s:3:"皪";s:2:"r";s:3:"皾";s:2:"s";s:3:"盭";s:2:"t";s:3:"矌";s:2:"u";s:3:"矎";s:2:"v";s:3:"矏";s:2:"w";s:3:"矍";s:2:"x";s:3:"矲";s:2:"y";s:3:"礥";s:2:"z";s:3:"礣";s:2:"{";s:3:"礧";s:2:"|";s:3:"礨";s:2:"}";s:3:"礤";s:2:"~";s:3:"礩";s:2:"";s:3:"禲";s:2:"";s:3:"穮";s:2:"";s:3:"穬";s:2:"";s:3:"穭";s:2:"";s:3:"竷";s:2:"";s:3:"籉";s:2:"";s:3:"籈";s:2:"";s:3:"籊";s:2:"";s:3:"籇";s:2:"";s:3:"籅";s:2:"";s:3:"糮";s:2:"";s:3:"繻";s:2:"";s:3:"繾";s:2:"";s:3:"纁";s:2:"";s:3:"纀";s:2:"";s:3:"羺";s:2:"";s:3:"翿";s:2:"";s:3:"聹";s:2:"";s:3:"臛";s:2:"";s:3:"臙";s:2:"";s:3:"舋";s:2:"";s:3:"艨";s:2:"";s:3:"艩";s:2:"";s:3:"蘢";s:2:"";s:3:"藿";s:2:"";s:3:"蘁";s:2:"";s:3:"藾";s:2:"";s:3:"蘛";s:2:"";s:3:"蘀";s:2:"";s:3:"藶";s:2:"";s:3:"蘄";s:2:"";s:3:"蘉";s:2:"";s:3:"蘅";s:2:"";s:3:"蘌";s:2:"";s:3:"藽";s:2:"";s:3:"蠙";s:2:"";s:3:"蠐";s:2:"";s:3:"蠑";s:2:"";s:3:"蠗";s:2:"";s:3:"蠓";s:2:"";s:3:"蠖";s:2:"";s:3:"襣";s:2:"";s:3:"襦";s:2:"";s:3:"覹";s:2:"";s:3:"觷";s:2:"";s:3:"譠";s:2:"";s:3:"譪";s:2:"";s:3:"譝";s:2:"";s:3:"譨";s:2:"";s:3:"譣";s:2:"";s:3:"譥";s:2:"";s:3:"譧";s:2:"";s:3:"譭";s:2:"";s:3:"趮";s:2:"";s:3:"躆";s:2:"";s:3:"躈";s:2:"";s:3:"躄";s:2:"";s:3:"轙";s:2:"";s:3:"轖";s:2:"";s:3:"轗";s:2:"";s:3:"轕";s:2:"";s:3:"轘";s:2:"";s:3:"轚";s:2:"";s:3:"邍";s:2:"";s:3:"酃";s:2:"";s:3:"酁";s:2:"";s:3:"醷";s:2:"";s:3:"醵";s:2:"";s:3:"醲";s:2:"";s:3:"醳";s:2:"";s:3:"鐋";s:2:"";s:3:"鐓";s:2:"";s:3:"鏻";s:2:"";s:3:"鐠";s:2:"";s:3:"鐏";s:2:"";s:3:"鐔";s:2:"";s:3:"鏾";s:2:"";s:3:"鐕";s:2:"";s:3:"鐐";s:2:"";s:3:"鐨";s:2:"";s:3:"鐙";s:2:"";s:3:"鐍";s:2:"";s:3:"鏵";s:2:"";s:3:"鐀";s:2:"";s:3:"鏷";s:2:"";s:3:"鐇";s:2:"";s:3:"鐎";s:2:"";s:3:"鐖";s:2:"";s:3:"鐒";s:2:"";s:3:"鏺";s:2:"";s:3:"鐉";s:2:"";s:3:"鏸";s:2:"";s:3:"鐊";s:2:"";s:3:"鏿";s:2:"@";s:3:"鏼";s:2:"A";s:3:"鐌";s:2:"B";s:3:"鏶";s:2:"C";s:3:"鐑";s:2:"D";s:3:"鐆";s:2:"E";s:3:"闞";s:2:"F";s:3:"闠";s:2:"G";s:3:"闟";s:2:"H";s:3:"霮";s:2:"I";s:3:"霯";s:2:"J";s:3:"鞹";s:2:"K";s:3:"鞻";s:2:"L";s:3:"韽";s:2:"M";s:3:"韾";s:2:"N";s:3:"顠";s:2:"O";s:3:"顢";s:2:"P";s:3:"顣";s:2:"Q";s:3:"顟";s:2:"R";s:3:"飁";s:2:"S";s:3:"飂";s:2:"T";s:3:"饐";s:2:"U";s:3:"饎";s:2:"V";s:3:"饙";s:2:"W";s:3:"饌";s:2:"X";s:3:"饋";s:2:"Y";s:3:"饓";s:2:"Z";s:3:"騲";s:2:"[";s:3:"騴";s:2:"\";s:3:"騱";s:2:"]";s:3:"騬";s:2:"^";s:3:"騪";s:2:"_";s:3:"騶";s:2:"`";s:3:"騩";s:2:"a";s:3:"騮";s:2:"b";s:3:"騸";s:2:"c";s:3:"騭";s:2:"d";s:3:"髇";s:2:"e";s:3:"髊";s:2:"f";s:3:"髆";s:2:"g";s:3:"鬐";s:2:"h";s:3:"鬒";s:2:"i";s:3:"鬑";s:2:"j";s:3:"鰋";s:2:"k";s:3:"鰈";s:2:"l";s:3:"鯷";s:2:"m";s:3:"鰅";s:2:"n";s:3:"鰒";s:2:"o";s:3:"鯸";s:2:"p";s:3:"鱀";s:2:"q";s:3:"鰇";s:2:"r";s:3:"鰎";s:2:"s";s:3:"鰆";s:2:"t";s:3:"鰗";s:2:"u";s:3:"鰔";s:2:"v";s:3:"鰉";s:2:"w";s:3:"鶟";s:2:"x";s:3:"鶙";s:2:"y";s:3:"鶤";s:2:"z";s:3:"鶝";s:2:"{";s:3:"鶒";s:2:"|";s:3:"鶘";s:2:"}";s:3:"鶐";s:2:"~";s:3:"鶛";s:2:"";s:3:"鶠";s:2:"";s:3:"鶔";s:2:"";s:3:"鶜";s:2:"";s:3:"鶪";s:2:"";s:3:"鶗";s:2:"";s:3:"鶡";s:2:"";s:3:"鶚";s:2:"";s:3:"鶢";s:2:"";s:3:"鶨";s:2:"";s:3:"鶞";s:2:"";s:3:"鶣";s:2:"";s:3:"鶿";s:2:"";s:3:"鶩";s:2:"";s:3:"鶖";s:2:"";s:3:"鶦";s:2:"";s:3:"鶧";s:2:"";s:3:"麙";s:2:"";s:3:"麛";s:2:"";s:3:"麚";s:2:"";s:3:"黥";s:2:"";s:3:"黤";s:2:"";s:3:"黧";s:2:"";s:3:"黦";s:2:"";s:3:"鼰";s:2:"";s:3:"鼮";s:2:"";s:3:"齛";s:2:"";s:3:"齠";s:2:"";s:3:"齞";s:2:"";s:3:"齝";s:2:"";s:3:"齙";s:2:"";s:3:"龑";s:2:"";s:3:"儺";s:2:"";s:3:"儹";s:2:"";s:3:"劘";s:2:"";s:3:"劗";s:2:"";s:3:"囃";s:2:"";s:3:"嚽";s:2:"";s:3:"嚾";s:2:"";s:3:"孈";s:2:"";s:3:"孇";s:2:"";s:3:"巋";s:2:"";s:3:"巏";s:2:"";s:3:"廱";s:2:"";s:3:"懽";s:2:"";s:3:"攛";s:2:"";s:3:"欂";s:2:"";s:3:"櫼";s:2:"";s:3:"欃";s:2:"";s:3:"櫸";s:2:"";s:3:"欀";s:2:"";s:3:"灃";s:2:"";s:3:"灄";s:2:"";s:3:"灊";s:2:"";s:3:"灈";s:2:"";s:3:"灉";s:2:"";s:3:"灅";s:2:"";s:3:"灆";s:2:"";s:3:"爝";s:2:"";s:3:"爚";s:2:"";s:3:"爙";s:2:"";s:3:"獾";s:2:"";s:3:"甗";s:2:"";s:3:"癪";s:2:"";s:3:"矐";s:2:"";s:3:"礭";s:2:"";s:3:"礱";s:2:"";s:3:"礯";s:2:"";s:3:"籔";s:2:"";s:3:"籓";s:2:"";s:3:"糲";s:2:"";s:3:"纊";s:2:"";s:3:"纇";s:2:"";s:3:"纈";s:2:"";s:3:"纋";s:2:"";s:3:"纆";s:2:"";s:3:"纍";s:2:"";s:3:"罍";s:2:"";s:3:"羻";s:2:"";s:3:"耰";s:2:"";s:3:"臝";s:2:"";s:3:"蘘";s:2:"";s:3:"蘪";s:2:"";s:3:"蘦";s:2:"";s:3:"蘟";s:2:"";s:3:"蘣";s:2:"";s:3:"蘜";s:2:"";s:3:"蘙";s:2:"";s:3:"蘧";s:2:"";s:3:"蘮";s:2:"";s:3:"蘡";s:2:"";s:3:"蘠";s:2:"";s:3:"蘩";s:2:"";s:3:"蘞";s:2:"";s:3:"蘥";s:2:"@";s:3:"蠩";s:2:"A";s:3:"蠝";s:2:"B";s:3:"蠛";s:2:"C";s:3:"蠠";s:2:"D";s:3:"蠤";s:2:"E";s:3:"蠜";s:2:"F";s:3:"蠫";s:2:"G";s:3:"衊";s:2:"H";s:3:"襭";s:2:"I";s:3:"襩";s:2:"J";s:3:"襮";s:2:"K";s:3:"襫";s:2:"L";s:3:"觺";s:2:"M";s:3:"譹";s:2:"N";s:3:"譸";s:2:"O";s:3:"譅";s:2:"P";s:3:"譺";s:2:"Q";s:3:"譻";s:2:"R";s:3:"贐";s:2:"S";s:3:"贔";s:2:"T";s:3:"趯";s:2:"U";s:3:"躎";s:2:"V";s:3:"躌";s:2:"W";s:3:"轞";s:2:"X";s:3:"轛";s:2:"Y";s:3:"轝";s:2:"Z";s:3:"酆";s:2:"[";s:3:"酄";s:2:"\";s:3:"酅";s:2:"]";s:3:"醹";s:2:"^";s:3:"鐿";s:2:"_";s:3:"鐻";s:2:"`";s:3:"鐶";s:2:"a";s:3:"鐩";s:2:"b";s:3:"鐽";s:2:"c";s:3:"鐼";s:2:"d";s:3:"鐰";s:2:"e";s:3:"鐹";s:2:"f";s:3:"鐪";s:2:"g";s:3:"鐷";s:2:"h";s:3:"鐬";s:2:"i";s:3:"鑀";s:2:"j";s:3:"鐱";s:2:"k";s:3:"闥";s:2:"l";s:3:"闤";s:2:"m";s:3:"闣";s:2:"n";s:3:"霵";s:2:"o";s:3:"霺";s:2:"p";s:3:"鞿";s:2:"q";s:3:"韡";s:2:"r";s:3:"顤";s:2:"s";s:3:"飉";s:2:"t";s:3:"飆";s:2:"u";s:3:"飀";s:2:"v";s:3:"饘";s:2:"w";s:3:"饖";s:2:"x";s:3:"騹";s:2:"y";s:3:"騽";s:2:"z";s:3:"驆";s:2:"{";s:3:"驄";s:2:"|";s:3:"驂";s:2:"}";s:3:"驁";s:2:"~";s:3:"騺";s:2:"";s:3:"騿";s:2:"";s:3:"髍";s:2:"";s:3:"鬕";s:2:"";s:3:"鬗";s:2:"";s:3:"鬘";s:2:"";s:3:"鬖";s:2:"";s:3:"鬺";s:2:"";s:3:"魒";s:2:"";s:3:"鰫";s:2:"";s:3:"鰝";s:2:"";s:3:"鰜";s:2:"";s:3:"鰬";s:2:"";s:3:"鰣";s:2:"";s:3:"鰨";s:2:"";s:3:"鰩";s:2:"";s:3:"鰤";s:2:"";s:3:"鰡";s:2:"";s:3:"鶷";s:2:"";s:3:"鶶";s:2:"";s:3:"鶼";s:2:"";s:3:"鷁";s:2:"";s:3:"鷇";s:2:"";s:3:"鷊";s:2:"";s:3:"鷏";s:2:"";s:3:"鶾";s:2:"";s:3:"鷅";s:2:"";s:3:"鷃";s:2:"";s:3:"鶻";s:2:"";s:3:"鶵";s:2:"";s:3:"鷎";s:2:"";s:3:"鶹";s:2:"";s:3:"鶺";s:2:"";s:3:"鶬";s:2:"";s:3:"鷈";s:2:"";s:3:"鶱";s:2:"";s:3:"鶭";s:2:"";s:3:"鷌";s:2:"";s:3:"鶳";s:2:"";s:3:"鷍";s:2:"";s:3:"鶲";s:2:"";s:3:"鹺";s:2:"";s:3:"麜";s:2:"";s:3:"黫";s:2:"";s:3:"黮";s:2:"";s:3:"黭";s:2:"";s:3:"鼛";s:2:"";s:3:"鼘";s:2:"";s:3:"鼚";s:2:"";s:3:"鼱";s:2:"";s:3:"齎";s:2:"";s:3:"齥";s:2:"";s:3:"齤";s:2:"";s:3:"龒";s:2:"";s:3:"亹";s:2:"";s:3:"囆";s:2:"";s:3:"囅";s:2:"";s:3:"囋";s:2:"";s:3:"奱";s:2:"";s:3:"孋";s:2:"";s:3:"孌";s:2:"";s:3:"巕";s:2:"";s:3:"巑";s:2:"";s:3:"廲";s:2:"";s:3:"攡";s:2:"";s:3:"攠";s:2:"";s:3:"攦";s:2:"";s:3:"攢";s:2:"";s:3:"欋";s:2:"";s:3:"欈";s:2:"";s:3:"欉";s:2:"";s:3:"氍";s:2:"";s:3:"灕";s:2:"";s:3:"灖";s:2:"";s:3:"灗";s:2:"";s:3:"灒";s:2:"";s:3:"爞";s:2:"";s:3:"爟";s:2:"";s:3:"犩";s:2:"";s:3:"獿";s:2:"";s:3:"瓘";s:2:"";s:3:"瓕";s:2:"";s:3:"瓙";s:2:"";s:3:"瓗";s:2:"";s:3:"癭";s:2:"";s:3:"皭";s:2:"";s:3:"礵";s:2:"";s:3:"禴";s:2:"";s:3:"穰";s:2:"";s:3:"穱";s:2:"";s:3:"籗";s:2:"";s:3:"籜";s:2:"";s:3:"籙";s:2:"";s:3:"籛";s:2:"";s:3:"籚";s:2:"@";s:3:"糴";s:2:"A";s:3:"糱";s:2:"B";s:3:"纑";s:2:"C";s:3:"罏";s:2:"D";s:3:"羇";s:2:"E";s:3:"臞";s:2:"F";s:3:"艫";s:2:"G";s:3:"蘴";s:2:"H";s:3:"蘵";s:2:"I";s:3:"蘳";s:2:"J";s:3:"蘬";s:2:"K";s:3:"蘲";s:2:"L";s:3:"蘶";s:2:"M";s:3:"蠬";s:2:"N";s:3:"蠨";s:2:"O";s:3:"蠦";s:2:"P";s:3:"蠪";s:2:"Q";s:3:"蠥";s:2:"R";s:3:"襱";s:2:"S";s:3:"覿";s:2:"T";s:3:"覾";s:2:"U";s:3:"觻";s:2:"V";s:3:"譾";s:2:"W";s:3:"讄";s:2:"X";s:3:"讂";s:2:"Y";s:3:"讆";s:2:"Z";s:3:"讅";s:2:"[";s:3:"譿";s:2:"\";s:3:"贕";s:2:"]";s:3:"躕";s:2:"^";s:3:"躔";s:2:"_";s:3:"躚";s:2:"`";s:3:"躒";s:2:"a";s:3:"躐";s:2:"b";s:3:"躖";s:2:"c";s:3:"躗";s:2:"d";s:3:"轠";s:2:"e";s:3:"轢";s:2:"f";s:3:"酇";s:2:"g";s:3:"鑌";s:2:"h";s:3:"鑐";s:2:"i";s:3:"鑊";s:2:"j";s:3:"鑋";s:2:"k";s:3:"鑏";s:2:"l";s:3:"鑇";s:2:"m";s:3:"鑅";s:2:"n";s:3:"鑈";s:2:"o";s:3:"鑉";s:2:"p";s:3:"鑆";s:2:"q";s:3:"霿";s:2:"r";s:3:"韣";s:2:"s";s:3:"顪";s:2:"t";s:3:"顩";s:2:"u";s:3:"飋";s:2:"v";s:3:"饔";s:2:"w";s:3:"饛";s:2:"x";s:3:"驎";s:2:"y";s:3:"驓";s:2:"z";s:3:"驔";s:2:"{";s:3:"驌";s:2:"|";s:3:"驏";s:2:"}";s:3:"驈";s:2:"~";s:3:"驊";s:2:"";s:3:"驉";s:2:"";s:3:"驒";s:2:"";s:3:"驐";s:2:"";s:3:"髐";s:2:"";s:3:"鬙";s:2:"";s:3:"鬫";s:2:"";s:3:"鬻";s:2:"";s:3:"魖";s:2:"";s:3:"魕";s:2:"";s:3:"鱆";s:2:"";s:3:"鱈";s:2:"";s:3:"鰿";s:2:"";s:3:"鱄";s:2:"";s:3:"鰹";s:2:"";s:3:"鰳";s:2:"";s:3:"鱁";s:2:"";s:3:"鰼";s:2:"";s:3:"鰷";s:2:"";s:3:"鰴";s:2:"";s:3:"鰲";s:2:"";s:3:"鰽";s:2:"";s:3:"鰶";s:2:"";s:3:"鷛";s:2:"";s:3:"鷒";s:2:"";s:3:"鷞";s:2:"";s:3:"鷚";s:2:"";s:3:"鷋";s:2:"";s:3:"鷐";s:2:"";s:3:"鷜";s:2:"";s:3:"鷑";s:2:"";s:3:"鷟";s:2:"";s:3:"鷩";s:2:"";s:3:"鷙";s:2:"";s:3:"鷘";s:2:"";s:3:"鷖";s:2:"";s:3:"鷵";s:2:"";s:3:"鷕";s:2:"";s:3:"鷝";s:2:"";s:3:"麶";s:2:"";s:3:"黰";s:2:"";s:3:"鼵";s:2:"";s:3:"鼳";s:2:"";s:3:"鼲";s:2:"";s:3:"齂";s:2:"";s:3:"齫";s:2:"";s:3:"龕";s:2:"";s:3:"龢";s:2:"";s:3:"儽";s:2:"";s:3:"劙";s:2:"";s:3:"壨";s:2:"";s:3:"壧";s:2:"";s:3:"奲";s:2:"";s:3:"孍";s:2:"";s:3:"巘";s:2:"";s:3:"蠯";s:2:"";s:3:"彏";s:2:"";s:3:"戁";s:2:"";s:3:"戃";s:2:"";s:3:"戄";s:2:"";s:3:"攩";s:2:"";s:3:"攥";s:2:"";s:3:"斖";s:2:"";s:3:"曫";s:2:"";s:3:"欑";s:2:"";s:3:"欒";s:2:"";s:3:"欏";s:2:"";s:3:"毊";s:2:"";s:3:"灛";s:2:"";s:3:"灚";s:2:"";s:3:"爢";s:2:"";s:3:"玂";s:2:"";s:3:"玁";s:2:"";s:3:"玃";s:2:"";s:3:"癰";s:2:"";s:3:"矔";s:2:"";s:3:"籧";s:2:"";s:3:"籦";s:2:"";s:3:"纕";s:2:"";s:3:"艬";s:2:"";s:3:"蘺";s:2:"";s:3:"虀";s:2:"";s:3:"蘹";s:2:"";s:3:"蘼";s:2:"";s:3:"蘱";s:2:"";s:3:"蘻";s:2:"";s:3:"蘾";s:2:"";s:3:"蠰";s:2:"";s:3:"蠲";s:2:"";s:3:"蠮";s:2:"";s:3:"蠳";s:2:"";s:3:"襶";s:2:"";s:3:"襴";s:2:"";s:3:"襳";s:2:"";s:3:"觾";s:2:"@";s:3:"讌";s:2:"A";s:3:"讎";s:2:"B";s:3:"讋";s:2:"C";s:3:"讈";s:2:"D";s:3:"豅";s:2:"E";s:3:"贙";s:2:"F";s:3:"躘";s:2:"G";s:3:"轤";s:2:"H";s:3:"轣";s:2:"I";s:3:"醼";s:2:"J";s:3:"鑢";s:2:"K";s:3:"鑕";s:2:"L";s:3:"鑝";s:2:"M";s:3:"鑗";s:2:"N";s:3:"鑞";s:2:"O";s:3:"韄";s:2:"P";s:3:"韅";s:2:"Q";s:3:"頀";s:2:"R";s:3:"驖";s:2:"S";s:3:"驙";s:2:"T";s:3:"鬞";s:2:"U";s:3:"鬟";s:2:"V";s:3:"鬠";s:2:"W";s:3:"鱒";s:2:"X";s:3:"鱘";s:2:"Y";s:3:"鱐";s:2:"Z";s:3:"鱊";s:2:"[";s:3:"鱍";s:2:"\";s:3:"鱋";s:2:"]";s:3:"鱕";s:2:"^";s:3:"鱙";s:2:"_";s:3:"鱌";s:2:"`";s:3:"鱎";s:2:"a";s:3:"鷻";s:2:"b";s:3:"鷷";s:2:"c";s:3:"鷯";s:2:"d";s:3:"鷣";s:2:"e";s:3:"鷫";s:2:"f";s:3:"鷸";s:2:"g";s:3:"鷤";s:2:"h";s:3:"鷶";s:2:"i";s:3:"鷡";s:2:"j";s:3:"鷮";s:2:"k";s:3:"鷦";s:2:"l";s:3:"鷲";s:2:"m";s:3:"鷰";s:2:"n";s:3:"鷢";s:2:"o";s:3:"鷬";s:2:"p";s:3:"鷴";s:2:"q";s:3:"鷳";s:2:"r";s:3:"鷨";s:2:"s";s:3:"鷭";s:2:"t";s:3:"黂";s:2:"u";s:3:"黐";s:2:"v";s:3:"黲";s:2:"w";s:3:"黳";s:2:"x";s:3:"鼆";s:2:"y";s:3:"鼜";s:2:"z";s:3:"鼸";s:2:"{";s:3:"鼷";s:2:"|";s:3:"鼶";s:2:"}";s:3:"齃";s:2:"~";s:3:"齏";s:2:"";s:3:"齱";s:2:"";s:3:"齰";s:2:"";s:3:"齮";s:2:"";s:3:"齯";s:2:"";s:3:"囓";s:2:"";s:3:"囍";s:2:"";s:3:"孎";s:2:"";s:3:"屭";s:2:"";s:3:"攭";s:2:"";s:3:"曭";s:2:"";s:3:"曮";s:2:"";s:3:"欓";s:2:"";s:3:"灟";s:2:"";s:3:"灡";s:2:"";s:3:"灝";s:2:"";s:3:"灠";s:2:"";s:3:"爣";s:2:"";s:3:"瓛";s:2:"";s:3:"瓥";s:2:"";s:3:"矕";s:2:"";s:3:"礸";s:2:"";s:3:"禷";s:2:"";s:3:"禶";s:2:"";s:3:"籪";s:2:"";s:3:"纗";s:2:"";s:3:"羉";s:2:"";s:3:"艭";s:2:"";s:3:"虃";s:2:"";s:3:"蠸";s:2:"";s:3:"蠷";s:2:"";s:3:"蠵";s:2:"";s:3:"衋";s:2:"";s:3:"讔";s:2:"";s:3:"讕";s:2:"";s:3:"躞";s:2:"";s:3:"躟";s:2:"";s:3:"躠";s:2:"";s:3:"躝";s:2:"";s:3:"醾";s:2:"";s:3:"醽";s:2:"";s:3:"釂";s:2:"";s:3:"鑫";s:2:"";s:3:"鑨";s:2:"";s:3:"鑩";s:2:"";s:3:"雥";s:2:"";s:3:"靆";s:2:"";s:3:"靃";s:2:"";s:3:"靇";s:2:"";s:3:"韇";s:2:"";s:3:"韥";s:2:"";s:3:"驞";s:2:"";s:3:"髕";s:2:"";s:3:"魙";s:2:"";s:3:"鱣";s:2:"";s:3:"鱧";s:2:"";s:3:"鱦";s:2:"";s:3:"鱢";s:2:"";s:3:"鱞";s:2:"";s:3:"鱠";s:2:"";s:3:"鸂";s:2:"";s:3:"鷾";s:2:"";s:3:"鸇";s:2:"";s:3:"鸃";s:2:"";s:3:"鸆";s:2:"";s:3:"鸅";s:2:"";s:3:"鸀";s:2:"";s:3:"鸁";s:2:"";s:3:"鸉";s:2:"";s:3:"鷿";s:2:"";s:3:"鷽";s:2:"";s:3:"鸄";s:2:"";s:3:"麠";s:2:"";s:3:"鼞";s:2:"";s:3:"齆";s:2:"";s:3:"齴";s:2:"";s:3:"齵";s:2:"";s:3:"齶";s:2:"";s:3:"囔";s:2:"";s:3:"攮";s:2:"";s:3:"斸";s:2:"";s:3:"欘";s:2:"";s:3:"欙";s:2:"";s:3:"欗";s:2:"";s:3:"欚";s:2:"";s:3:"灢";s:2:"";s:3:"爦";s:2:"";s:3:"犪";s:2:"";s:3:"矘";s:2:"";s:3:"矙";s:2:"";s:3:"礹";s:2:"";s:3:"籩";s:2:"";s:3:"籫";s:2:"";s:3:"糶";s:2:"";s:3:"纚";s:2:"@";s:3:"纘";s:2:"A";s:3:"纛";s:2:"B";s:3:"纙";s:2:"C";s:3:"臠";s:2:"D";s:3:"臡";s:2:"E";s:3:"虆";s:2:"F";s:3:"虇";s:2:"G";s:3:"虈";s:2:"H";s:3:"襹";s:2:"I";s:3:"襺";s:2:"J";s:3:"襼";s:2:"K";s:3:"襻";s:2:"L";s:3:"觿";s:2:"M";s:3:"讘";s:2:"N";s:3:"讙";s:2:"O";s:3:"躥";s:2:"P";s:3:"躤";s:2:"Q";s:3:"躣";s:2:"R";s:3:"鑮";s:2:"S";s:3:"鑭";s:2:"T";s:3:"鑯";s:2:"U";s:3:"鑱";s:2:"V";s:3:"鑳";s:2:"W";s:3:"靉";s:2:"X";s:3:"顲";s:2:"Y";s:3:"饟";s:2:"Z";s:3:"鱨";s:2:"[";s:3:"鱮";s:2:"\";s:3:"鱭";s:2:"]";s:3:"鸋";s:2:"^";s:3:"鸍";s:2:"_";s:3:"鸐";s:2:"`";s:3:"鸏";s:2:"a";s:3:"鸒";s:2:"b";s:3:"鸑";s:2:"c";s:3:"麡";s:2:"d";s:3:"黵";s:2:"e";s:3:"鼉";s:2:"f";s:3:"齇";s:2:"g";s:3:"齸";s:2:"h";s:3:"齻";s:2:"i";s:3:"齺";s:2:"j";s:3:"齹";s:2:"k";s:3:"圞";s:2:"l";s:3:"灦";s:2:"m";s:3:"籯";s:2:"n";s:3:"蠼";s:2:"o";s:3:"趲";s:2:"p";s:3:"躦";s:2:"q";s:3:"釃";s:2:"r";s:3:"鑴";s:2:"s";s:3:"鑸";s:2:"t";s:3:"鑶";s:2:"u";s:3:"鑵";s:2:"v";s:3:"驠";s:2:"w";s:3:"鱴";s:2:"x";s:3:"鱳";s:2:"y";s:3:"鱱";s:2:"z";s:3:"鱵";s:2:"{";s:3:"鸔";s:2:"|";s:3:"鸓";s:2:"}";s:3:"黶";s:2:"~";s:3:"鼊";s:2:"";s:3:"龤";s:2:"";s:3:"灨";s:2:"";s:3:"灥";s:2:"";s:3:"糷";s:2:"";s:3:"虪";s:2:"";s:3:"蠾";s:2:"";s:3:"蠽";s:2:"";s:3:"蠿";s:2:"";s:3:"讞";s:2:"";s:3:"貜";s:2:"";s:3:"躩";s:2:"";s:3:"軉";s:2:"";s:3:"靋";s:2:"";s:3:"顳";s:2:"";s:3:"顴";s:2:"";s:3:"飌";s:2:"";s:3:"饡";s:2:"";s:3:"馫";s:2:"";s:3:"驤";s:2:"";s:3:"驦";s:2:"";s:3:"驧";s:2:"";s:3:"鬤";s:2:"";s:3:"鸕";s:2:"";s:3:"鸗";s:2:"";s:3:"齈";s:2:"";s:3:"戇";s:2:"";s:3:"欞";s:2:"";s:3:"爧";s:2:"";s:3:"虌";s:2:"";s:3:"躨";s:2:"";s:3:"钂";s:2:"";s:3:"钀";s:2:"";s:3:"钁";s:2:"";s:3:"驩";s:2:"";s:3:"驨";s:2:"";s:3:"鬮";s:2:"";s:3:"鸙";s:2:"";s:3:"爩";s:2:"";s:3:"虋";s:2:"";s:3:"讟";s:2:"";s:3:"钃";s:2:"";s:3:"鱹";s:2:"";s:3:"麷";s:2:"";s:3:"癵";s:2:"";s:3:"驫";s:2:"";s:3:"鱺";s:2:"";s:3:"鸝";s:2:"";s:3:"灩";s:2:"";s:3:"灪";s:2:"";s:3:"麤";s:2:"";s:3:"齾";s:2:"";s:3:"齉";s:2:"";s:3:"龘";s:2:"";s:3:"碁";s:2:"";s:3:"銹";s:2:"";s:3:"裏";s:2:"";s:3:"墻";s:2:"";s:3:"恒";s:2:"";s:3:"粧";s:2:"";s:3:"嫺";s:2:"";s:3:"╔";s:2:"";s:3:"╦";s:2:"";s:3:"╗";s:2:"";s:3:"╠";s:2:"";s:3:"╬";s:2:"";s:3:"╣";s:2:"";s:3:"╚";s:2:"";s:3:"╩";s:2:"";s:3:"╝";s:2:"";s:3:"╒";s:2:"";s:3:"╤";s:2:"";s:3:"╕";s:2:"";s:3:"╞";s:2:"";s:3:"╪";s:2:"";s:3:"╡";s:2:"";s:3:"╘";s:2:"";s:3:"╧";s:2:"";s:3:"╛";s:2:"";s:3:"╓";s:2:"";s:3:"╥";s:2:"";s:3:"╖";s:2:"";s:3:"╟";s:2:"";s:3:"╫";s:2:"";s:3:"╢";s:2:"";s:3:"╙";s:2:"";s:3:"╨";s:2:"";s:3:"╜";s:2:"";s:3:"║";s:2:"";s:3:"═";s:2:"";s:3:"╭";s:2:"";s:3:"╮";s:2:"";s:3:"╰";s:2:"";s:3:"╯";s:2:"";s:3:"▓";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.gsm0338.ser
@@ -0,0 +1,4 @@
+a:138:{s:1:" ";s:1:"@";s:1:"";s:2:"£";s:1:"";s:1:"$";s:1:"";s:2:"¥";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ù";s:1:"";s:2:"ì";s:1:"";s:2:"ò";s:1:"	";s:2:"ç";s:1:"
+";s:1:"
+";s:1:"";s:2:"Ø";s:1:"";s:2:"ø";s:1:"
";s:1:"
";s:1:"";s:2:"Å";s:1:"";s:2:"å";s:1:"";s:2:"Δ";s:1:"";s:1:"_";s:1:"";s:2:"Φ";s:1:"";s:2:"Γ";s:1:"";s:2:"Λ";s:1:"";s:2:"Ω";s:1:"";s:2:"Π";s:1:"";s:2:"Ψ";s:1:"";s:2:"Σ";s:1:"";s:2:"Θ";s:1:"";s:2:"Ξ";s:1:"";s:2:" ";s:2:"
+";s:1:"";s:2:"";s:1:"^";s:2:"(";s:1:"{";s:2:")";s:1:"}";s:2:"/";s:1:"\";s:2:"<";s:1:"[";s:2:"=";s:1:"~";s:2:">";s:1:"]";s:2:"@";s:1:"|";s:2:"e";s:3:"€";s:1:"";s:2:"Æ";s:1:"";s:2:"æ";s:1:"";s:2:"ß";s:1:"";s:2:"É";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:2:"¤";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:2:"¡";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:2:"Ä";s:1:"\";s:2:"Ö";s:1:"]";s:2:"Ñ";s:1:"^";s:2:"Ü";s:1:"_";s:2:"§";s:1:"`";s:2:"¿";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:2:"ä";s:1:"|";s:2:"ö";s:1:"}";s:2:"ñ";s:1:"~";s:2:"ü";s:1:"";s:2:"à";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.iso-8859-1.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"¡";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"¥";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"ª";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"¹";s:1:"";s:2:"º";s:1:"";s:2:"»";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"¿";s:1:"";s:2:"À";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ã";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Æ";s:1:"";s:2:"Ç";s:1:"";s:2:"È";s:1:"";s:2:"É";s:1:"";s:2:"Ê";s:1:"";s:2:"Ë";s:1:"";s:2:"Ì";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Ð";s:1:"";s:2:"Ñ";s:1:"";s:2:"Ò";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Õ";s:1:"";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ø";s:1:"";s:2:"Ù";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"Ý";s:1:"";s:2:"Þ";s:1:"";s:2:"ß";s:1:"";s:2:"à";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ã";s:1:"";s:2:"ä";s:1:"";s:2:"å";s:1:"";s:2:"æ";s:1:"";s:2:"ç";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"ì";s:1:"";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ð";s:1:"";s:2:"ñ";s:1:"";s:2:"ò";s:1:"";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"õ";s:1:"";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ø";s:1:"";s:2:"ù";s:1:"";s:2:"ú";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"ý";s:1:"";s:2:"þ";s:1:"";s:2:"ÿ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.iso-8859-10.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"Ą";s:1:"";s:2:"Ē";s:1:"";s:2:"Ģ";s:1:"";s:2:"Ī";s:1:"";s:2:"Ĩ";s:1:"";s:2:"Ķ";s:1:"";s:2:"§";s:1:"";s:2:"Ļ";s:1:"";s:2:"Đ";s:1:"";s:2:"Š";s:1:"";s:2:"Ŧ";s:1:"";s:2:"Ž";s:1:"";s:2:"­";s:1:"";s:2:"Ū";s:1:"";s:2:"Ŋ";s:1:"";s:2:"°";s:1:"";s:2:"ą";s:1:"";s:2:"ē";s:1:"";s:2:"ģ";s:1:"";s:2:"ī";s:1:"";s:2:"ĩ";s:1:"";s:2:"ķ";s:1:"";s:2:"·";s:1:"";s:2:"ļ";s:1:"";s:2:"đ";s:1:"";s:2:"š";s:1:"";s:2:"ŧ";s:1:"";s:2:"ž";s:1:"";s:3:"―";s:1:"";s:2:"ū";s:1:"";s:2:"ŋ";s:1:"";s:2:"Ā";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ã";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Æ";s:1:"";s:2:"Į";s:1:"";s:2:"Č";s:1:"";s:2:"É";s:1:"";s:2:"Ę";s:1:"";s:2:"Ë";s:1:"";s:2:"Ė";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Ð";s:1:"";s:2:"Ņ";s:1:"";s:2:"Ō";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Õ";s:1:"";s:2:"Ö";s:1:"";s:2:"Ũ";s:1:"";s:2:"Ø";s:1:"";s:2:"Ų";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"Ý";s:1:"";s:2:"Þ";s:1:"";s:2:"ß";s:1:"";s:2:"ā";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ã";s:1:"";s:2:"ä";s:1:"";s:2:"å";s:1:"";s:2:"æ";s:1:"";s:2:"į";s:1:"";s:2:"č";s:1:"";s:2:"é";s:1:"";s:2:"ę";s:1:"";s:2:"ë";s:1:"";s:2:"ė";s:1:"";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ð";s:1:"";s:2:"ņ";s:1:"";s:2:"ō";s:1:"";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"õ";s:1:"";s:2:"ö";s:1:"";s:2:"ũ";s:1:"";s:2:"ø";s:1:"";s:2:"ų";s:1:"";s:2:"ú";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"ý";s:1:"";s:2:"þ";s:1:"";s:2:"ĸ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.iso-8859-11.ser
@@ -0,0 +1,3 @@
+a:248:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:3:"ก";s:1:"";s:3:"ข";s:1:"";s:3:"ฃ";s:1:"";s:3:"ค";s:1:"";s:3:"ฅ";s:1:"";s:3:"ฆ";s:1:"";s:3:"ง";s:1:"";s:3:"จ";s:1:"";s:3:"ฉ";s:1:"";s:3:"ช";s:1:"";s:3:"ซ";s:1:"";s:3:"ฌ";s:1:"";s:3:"ญ";s:1:"";s:3:"ฎ";s:1:"";s:3:"ฏ";s:1:"";s:3:"ฐ";s:1:"";s:3:"ฑ";s:1:"";s:3:"ฒ";s:1:"";s:3:"ณ";s:1:"";s:3:"ด";s:1:"";s:3:"ต";s:1:"";s:3:"ถ";s:1:"";s:3:"ท";s:1:"";s:3:"ธ";s:1:"";s:3:"น";s:1:"";s:3:"บ";s:1:"";s:3:"ป";s:1:"";s:3:"ผ";s:1:"";s:3:"ฝ";s:1:"";s:3:"พ";s:1:"";s:3:"ฟ";s:1:"";s:3:"ภ";s:1:"";s:3:"ม";s:1:"";s:3:"ย";s:1:"";s:3:"ร";s:1:"";s:3:"ฤ";s:1:"";s:3:"ล";s:1:"";s:3:"ฦ";s:1:"";s:3:"ว";s:1:"";s:3:"ศ";s:1:"";s:3:"ษ";s:1:"";s:3:"ส";s:1:"";s:3:"ห";s:1:"";s:3:"ฬ";s:1:"";s:3:"อ";s:1:"";s:3:"ฮ";s:1:"";s:3:"ฯ";s:1:"";s:3:"ะ";s:1:"";s:3:"ั";s:1:"";s:3:"า";s:1:"";s:3:"ำ";s:1:"";s:3:"ิ";s:1:"";s:3:"ี";s:1:"";s:3:"ึ";s:1:"";s:3:"ื";s:1:"";s:3:"ุ";s:1:"";s:3:"ู";s:1:"";s:3:"ฺ";s:1:"";s:3:"฿";s:1:"";s:3:"เ";s:1:"";s:3:"แ";s:1:"";s:3:"โ";s:1:"";s:3:"ใ";s:1:"";s:3:"ไ";s:1:"";s:3:"ๅ";s:1:"";s:3:"ๆ";s:1:"";s:3:"็";s:1:"";s:3:"่";s:1:"";s:3:"้";s:1:"";s:3:"๊";s:1:"";s:3:"๋";s:1:"";s:3:"์";s:1:"";s:3:"ํ";s:1:"";s:3:"๎";s:1:"";s:3:"๏";s:1:"";s:3:"๐";s:1:"";s:3:"๑";s:1:"";s:3:"๒";s:1:"";s:3:"๓";s:1:"";s:3:"๔";s:1:"";s:3:"๕";s:1:"";s:3:"๖";s:1:"";s:3:"๗";s:1:"";s:3:"๘";s:1:"";s:3:"๙";s:1:"";s:3:"๚";s:1:"";s:3:"๛";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.iso-8859-13.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:3:"”";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:3:"„";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"Ø";s:1:"";s:2:"©";s:1:"";s:2:"Ŗ";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"Æ";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:3:"“";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"ø";s:1:"";s:2:"¹";s:1:"";s:2:"ŗ";s:1:"";s:2:"»";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"æ";s:1:"";s:2:"Ą";s:1:"";s:2:"Į";s:1:"";s:2:"Ā";s:1:"";s:2:"Ć";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Ę";s:1:"";s:2:"Ē";s:1:"";s:2:"Č";s:1:"";s:2:"É";s:1:"";s:2:"Ź";s:1:"";s:2:"Ė";s:1:"";s:2:"Ģ";s:1:"";s:2:"Ķ";s:1:"";s:2:"Ī";s:1:"";s:2:"Ļ";s:1:"";s:2:"Š";s:1:"";s:2:"Ń";s:1:"";s:2:"Ņ";s:1:"";s:2:"Ó";s:1:"";s:2:"Ō";s:1:"";s:2:"Õ";s:1:"";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ų";s:1:"";s:2:"Ł";s:1:"";s:2:"Ś";s:1:"";s:2:"Ū";s:1:"";s:2:"Ü";s:1:"";s:2:"Ż";s:1:"";s:2:"Ž";s:1:"";s:2:"ß";s:1:"";s:2:"ą";s:1:"";s:2:"į";s:1:"";s:2:"ā";s:1:"";s:2:"ć";s:1:"";s:2:"ä";s:1:"";s:2:"å";s:1:"";s:2:"ę";s:1:"";s:2:"ē";s:1:"";s:2:"č";s:1:"";s:2:"é";s:1:"";s:2:"ź";s:1:"";s:2:"ė";s:1:"";s:2:"ģ";s:1:"";s:2:"ķ";s:1:"";s:2:"ī";s:1:"";s:2:"ļ";s:1:"";s:2:"š";s:1:"";s:2:"ń";s:1:"";s:2:"ņ";s:1:"";s:2:"ó";s:1:"";s:2:"ō";s:1:"";s:2:"õ";s:1:"";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ų";s:1:"";s:2:"ł";s:1:"";s:2:"ś";s:1:"";s:2:"ū";s:1:"";s:2:"ü";s:1:"";s:2:"ż";s:1:"";s:2:"ž";s:1:"";s:3:"’";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.iso-8859-14.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:3:"Ḃ";s:1:"";s:3:"ḃ";s:1:"";s:2:"£";s:1:"";s:2:"Ċ";s:1:"";s:2:"ċ";s:1:"";s:3:"Ḋ";s:1:"";s:2:"§";s:1:"";s:3:"Ẁ";s:1:"";s:2:"©";s:1:"";s:3:"Ẃ";s:1:"";s:3:"ḋ";s:1:"";s:3:"Ỳ";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"Ÿ";s:1:"";s:3:"Ḟ";s:1:"";s:3:"ḟ";s:1:"";s:2:"Ġ";s:1:"";s:2:"ġ";s:1:"";s:3:"Ṁ";s:1:"";s:3:"ṁ";s:1:"";s:2:"¶";s:1:"";s:3:"Ṗ";s:1:"";s:3:"ẁ";s:1:"";s:3:"ṗ";s:1:"";s:3:"ẃ";s:1:"";s:3:"Ṡ";s:1:"";s:3:"ỳ";s:1:"";s:3:"Ẅ";s:1:"";s:3:"ẅ";s:1:"";s:3:"ṡ";s:1:"";s:2:"À";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ã";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Æ";s:1:"";s:2:"Ç";s:1:"";s:2:"È";s:1:"";s:2:"É";s:1:"";s:2:"Ê";s:1:"";s:2:"Ë";s:1:"";s:2:"Ì";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Ŵ";s:1:"";s:2:"Ñ";s:1:"";s:2:"Ò";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Õ";s:1:"";s:2:"Ö";s:1:"";s:3:"Ṫ";s:1:"";s:2:"Ø";s:1:"";s:2:"Ù";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"Ý";s:1:"";s:2:"Ŷ";s:1:"";s:2:"ß";s:1:"";s:2:"à";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ã";s:1:"";s:2:"ä";s:1:"";s:2:"å";s:1:"";s:2:"æ";s:1:"";s:2:"ç";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"ì";s:1:"";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ŵ";s:1:"";s:2:"ñ";s:1:"";s:2:"ò";s:1:"";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"õ";s:1:"";s:2:"ö";s:1:"";s:3:"ṫ";s:1:"";s:2:"ø";s:1:"";s:2:"ù";s:1:"";s:2:"ú";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"ý";s:1:"";s:2:"ŷ";s:1:"";s:2:"ÿ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.iso-8859-15.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"¡";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:3:"€";s:1:"";s:2:"¥";s:1:"";s:2:"Š";s:1:"";s:2:"§";s:1:"";s:2:"š";s:1:"";s:2:"©";s:1:"";s:2:"ª";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"Ž";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"ž";s:1:"";s:2:"¹";s:1:"";s:2:"º";s:1:"";s:2:"»";s:1:"";s:2:"Œ";s:1:"";s:2:"œ";s:1:"";s:2:"Ÿ";s:1:"";s:2:"¿";s:1:"";s:2:"À";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ã";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Æ";s:1:"";s:2:"Ç";s:1:"";s:2:"È";s:1:"";s:2:"É";s:1:"";s:2:"Ê";s:1:"";s:2:"Ë";s:1:"";s:2:"Ì";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Ð";s:1:"";s:2:"Ñ";s:1:"";s:2:"Ò";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Õ";s:1:"";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ø";s:1:"";s:2:"Ù";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"Ý";s:1:"";s:2:"Þ";s:1:"";s:2:"ß";s:1:"";s:2:"à";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ã";s:1:"";s:2:"ä";s:1:"";s:2:"å";s:1:"";s:2:"æ";s:1:"";s:2:"ç";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"ì";s:1:"";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ð";s:1:"";s:2:"ñ";s:1:"";s:2:"ò";s:1:"";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"õ";s:1:"";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ø";s:1:"";s:2:"ù";s:1:"";s:2:"ú";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"ý";s:1:"";s:2:"þ";s:1:"";s:2:"ÿ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.iso-8859-16.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"Ą";s:1:"";s:2:"ą";s:1:"";s:2:"Ł";s:1:"";s:3:"€";s:1:"";s:3:"„";s:1:"";s:2:"Š";s:1:"";s:2:"§";s:1:"";s:2:"š";s:1:"";s:2:"©";s:1:"";s:2:"Ș";s:1:"";s:2:"«";s:1:"";s:2:"Ź";s:1:"";s:2:"­";s:1:"";s:2:"ź";s:1:"";s:2:"Ż";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"Č";s:1:"";s:2:"ł";s:1:"";s:2:"Ž";s:1:"";s:3:"”";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"ž";s:1:"";s:2:"č";s:1:"";s:2:"ș";s:1:"";s:2:"»";s:1:"";s:2:"Œ";s:1:"";s:2:"œ";s:1:"";s:2:"Ÿ";s:1:"";s:2:"ż";s:1:"";s:2:"À";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ă";s:1:"";s:2:"Ä";s:1:"";s:2:"Ć";s:1:"";s:2:"Æ";s:1:"";s:2:"Ç";s:1:"";s:2:"È";s:1:"";s:2:"É";s:1:"";s:2:"Ê";s:1:"";s:2:"Ë";s:1:"";s:2:"Ì";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Đ";s:1:"";s:2:"Ń";s:1:"";s:2:"Ò";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Ő";s:1:"";s:2:"Ö";s:1:"";s:2:"Ś";s:1:"";s:2:"Ű";s:1:"";s:2:"Ù";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"Ę";s:1:"";s:2:"Ț";s:1:"";s:2:"ß";s:1:"";s:2:"à";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ă";s:1:"";s:2:"ä";s:1:"";s:2:"ć";s:1:"";s:2:"æ";s:1:"";s:2:"ç";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"ì";s:1:"";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"đ";s:1:"";s:2:"ń";s:1:"";s:2:"ò";s:1:"";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"ő";s:1:"";s:2:"ö";s:1:"";s:2:"ś";s:1:"";s:2:"ű";s:1:"";s:2:"ù";s:1:"";s:2:"ú";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"ę";s:1:"";s:2:"ț";s:1:"";s:2:"ÿ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.iso-8859-2.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"Ą";s:1:"";s:2:"˘";s:1:"";s:2:"Ł";s:1:"";s:2:"¤";s:1:"";s:2:"Ľ";s:1:"";s:2:"Ś";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"Š";s:1:"";s:2:"Ş";s:1:"";s:2:"Ť";s:1:"";s:2:"Ź";s:1:"";s:2:"­";s:1:"";s:2:"Ž";s:1:"";s:2:"Ż";s:1:"";s:2:"°";s:1:"";s:2:"ą";s:1:"";s:2:"˛";s:1:"";s:2:"ł";s:1:"";s:2:"´";s:1:"";s:2:"ľ";s:1:"";s:2:"ś";s:1:"";s:2:"ˇ";s:1:"";s:2:"¸";s:1:"";s:2:"š";s:1:"";s:2:"ş";s:1:"";s:2:"ť";s:1:"";s:2:"ź";s:1:"";s:2:"˝";s:1:"";s:2:"ž";s:1:"";s:2:"ż";s:1:"";s:2:"Ŕ";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ă";s:1:"";s:2:"Ä";s:1:"";s:2:"Ĺ";s:1:"";s:2:"Ć";s:1:"";s:2:"Ç";s:1:"";s:2:"Č";s:1:"";s:2:"É";s:1:"";s:2:"Ę";s:1:"";s:2:"Ë";s:1:"";s:2:"Ě";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ď";s:1:"";s:2:"Đ";s:1:"";s:2:"Ń";s:1:"";s:2:"Ň";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Ő";s:1:"";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ř";s:1:"";s:2:"Ů";s:1:"";s:2:"Ú";s:1:"";s:2:"Ű";s:1:"";s:2:"Ü";s:1:"";s:2:"Ý";s:1:"";s:2:"Ţ";s:1:"";s:2:"ß";s:1:"";s:2:"ŕ";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ă";s:1:"";s:2:"ä";s:1:"";s:2:"ĺ";s:1:"";s:2:"ć";s:1:"";s:2:"ç";s:1:"";s:2:"č";s:1:"";s:2:"é";s:1:"";s:2:"ę";s:1:"";s:2:"ë";s:1:"";s:2:"ě";s:1:"";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ď";s:1:"";s:2:"đ";s:1:"";s:2:"ń";s:1:"";s:2:"ň";s:1:"";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"ő";s:1:"";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ř";s:1:"";s:2:"ů";s:1:"";s:2:"ú";s:1:"";s:2:"ű";s:1:"";s:2:"ü";s:1:"";s:2:"ý";s:1:"";s:2:"ţ";s:1:"";s:2:"˙";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.iso-8859-3.ser
@@ -0,0 +1,3 @@
+a:249:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"Ħ";s:1:"";s:2:"˘";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"Ĥ";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"İ";s:1:"";s:2:"Ş";s:1:"";s:2:"Ğ";s:1:"";s:2:"Ĵ";s:1:"";s:2:"­";s:1:"";s:2:"Ż";s:1:"";s:2:"°";s:1:"";s:2:"ħ";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"ĥ";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"ı";s:1:"";s:2:"ş";s:1:"";s:2:"ğ";s:1:"";s:2:"ĵ";s:1:"";s:2:"½";s:1:"";s:2:"ż";s:1:"";s:2:"À";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ä";s:1:"";s:2:"Ċ";s:1:"";s:2:"Ĉ";s:1:"";s:2:"Ç";s:1:"";s:2:"È";s:1:"";s:2:"É";s:1:"";s:2:"Ê";s:1:"";s:2:"Ë";s:1:"";s:2:"Ì";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Ñ";s:1:"";s:2:"Ò";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Ġ";s:1:"";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ĝ";s:1:"";s:2:"Ù";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"Ŭ";s:1:"";s:2:"Ŝ";s:1:"";s:2:"ß";s:1:"";s:2:"à";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ä";s:1:"";s:2:"ċ";s:1:"";s:2:"ĉ";s:1:"";s:2:"ç";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"ì";s:1:"";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ñ";s:1:"";s:2:"ò";s:1:"";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"ġ";s:1:"";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ĝ";s:1:"";s:2:"ù";s:1:"";s:2:"ú";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"ŭ";s:1:"";s:2:"ŝ";s:1:"";s:2:"˙";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.iso-8859-4.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"Ą";s:1:"";s:2:"ĸ";s:1:"";s:2:"Ŗ";s:1:"";s:2:"¤";s:1:"";s:2:"Ĩ";s:1:"";s:2:"Ļ";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"Š";s:1:"";s:2:"Ē";s:1:"";s:2:"Ģ";s:1:"";s:2:"Ŧ";s:1:"";s:2:"­";s:1:"";s:2:"Ž";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"ą";s:1:"";s:2:"˛";s:1:"";s:2:"ŗ";s:1:"";s:2:"´";s:1:"";s:2:"ĩ";s:1:"";s:2:"ļ";s:1:"";s:2:"ˇ";s:1:"";s:2:"¸";s:1:"";s:2:"š";s:1:"";s:2:"ē";s:1:"";s:2:"ģ";s:1:"";s:2:"ŧ";s:1:"";s:2:"Ŋ";s:1:"";s:2:"ž";s:1:"";s:2:"ŋ";s:1:"";s:2:"Ā";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ã";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Æ";s:1:"";s:2:"Į";s:1:"";s:2:"Č";s:1:"";s:2:"É";s:1:"";s:2:"Ę";s:1:"";s:2:"Ë";s:1:"";s:2:"Ė";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ī";s:1:"";s:2:"Đ";s:1:"";s:2:"Ņ";s:1:"";s:2:"Ō";s:1:"";s:2:"Ķ";s:1:"";s:2:"Ô";s:1:"";s:2:"Õ";s:1:"";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ø";s:1:"";s:2:"Ų";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"Ũ";s:1:"";s:2:"Ū";s:1:"";s:2:"ß";s:1:"";s:2:"ā";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ã";s:1:"";s:2:"ä";s:1:"";s:2:"å";s:1:"";s:2:"æ";s:1:"";s:2:"į";s:1:"";s:2:"č";s:1:"";s:2:"é";s:1:"";s:2:"ę";s:1:"";s:2:"ë";s:1:"";s:2:"ė";s:1:"";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ī";s:1:"";s:2:"đ";s:1:"";s:2:"ņ";s:1:"";s:2:"ō";s:1:"";s:2:"ķ";s:1:"";s:2:"ô";s:1:"";s:2:"õ";s:1:"";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ø";s:1:"";s:2:"ų";s:1:"";s:2:"ú";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"ũ";s:1:"";s:2:"ū";s:1:"";s:2:"˙";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.iso-8859-5.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"Ё";s:1:"";s:2:"Ђ";s:1:"";s:2:"Ѓ";s:1:"";s:2:"Є";s:1:"";s:2:"Ѕ";s:1:"";s:2:"І";s:1:"";s:2:"Ї";s:1:"";s:2:"Ј";s:1:"";s:2:"Љ";s:1:"";s:2:"Њ";s:1:"";s:2:"Ћ";s:1:"";s:2:"Ќ";s:1:"";s:2:"­";s:1:"";s:2:"Ў";s:1:"";s:2:"Џ";s:1:"";s:2:"А";s:1:"";s:2:"Б";s:1:"";s:2:"В";s:1:"";s:2:"Г";s:1:"";s:2:"Д";s:1:"";s:2:"Е";s:1:"";s:2:"Ж";s:1:"";s:2:"З";s:1:"";s:2:"И";s:1:"";s:2:"Й";s:1:"";s:2:"К";s:1:"";s:2:"Л";s:1:"";s:2:"М";s:1:"";s:2:"Н";s:1:"";s:2:"О";s:1:"";s:2:"П";s:1:"";s:2:"Р";s:1:"";s:2:"С";s:1:"";s:2:"Т";s:1:"";s:2:"У";s:1:"";s:2:"Ф";s:1:"";s:2:"Х";s:1:"";s:2:"Ц";s:1:"";s:2:"Ч";s:1:"";s:2:"Ш";s:1:"";s:2:"Щ";s:1:"";s:2:"Ъ";s:1:"";s:2:"Ы";s:1:"";s:2:"Ь";s:1:"";s:2:"Э";s:1:"";s:2:"Ю";s:1:"";s:2:"Я";s:1:"";s:2:"а";s:1:"";s:2:"б";s:1:"";s:2:"в";s:1:"";s:2:"г";s:1:"";s:2:"д";s:1:"";s:2:"е";s:1:"";s:2:"ж";s:1:"";s:2:"з";s:1:"";s:2:"и";s:1:"";s:2:"й";s:1:"";s:2:"к";s:1:"";s:2:"л";s:1:"";s:2:"м";s:1:"";s:2:"н";s:1:"";s:2:"о";s:1:"";s:2:"п";s:1:"";s:2:"р";s:1:"";s:2:"с";s:1:"";s:2:"т";s:1:"";s:2:"у";s:1:"";s:2:"ф";s:1:"";s:2:"х";s:1:"";s:2:"ц";s:1:"";s:2:"ч";s:1:"";s:2:"ш";s:1:"";s:2:"щ";s:1:"";s:2:"ъ";s:1:"";s:2:"ы";s:1:"";s:2:"ь";s:1:"";s:2:"э";s:1:"";s:2:"ю";s:1:"";s:2:"я";s:1:"";s:3:"№";s:1:"";s:2:"ё";s:1:"";s:2:"ђ";s:1:"";s:2:"ѓ";s:1:"";s:2:"є";s:1:"";s:2:"ѕ";s:1:"";s:2:"і";s:1:"";s:2:"ї";s:1:"";s:2:"ј";s:1:"";s:2:"љ";s:1:"";s:2:"њ";s:1:"";s:2:"ћ";s:1:"";s:2:"ќ";s:1:"";s:2:"§";s:1:"";s:2:"ў";s:1:"";s:2:"џ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.iso-8859-6.ser
@@ -0,0 +1,3 @@
+a:211:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"¤";s:1:"";s:2:"،";s:1:"";s:2:"­";s:1:"";s:2:"؛";s:1:"";s:2:"؟";s:1:"";s:2:"ء";s:1:"";s:2:"آ";s:1:"";s:2:"أ";s:1:"";s:2:"ؤ";s:1:"";s:2:"إ";s:1:"";s:2:"ئ";s:1:"";s:2:"ا";s:1:"";s:2:"ب";s:1:"";s:2:"ة";s:1:"";s:2:"ت";s:1:"";s:2:"ث";s:1:"";s:2:"ج";s:1:"";s:2:"ح";s:1:"";s:2:"خ";s:1:"";s:2:"د";s:1:"";s:2:"ذ";s:1:"";s:2:"ر";s:1:"";s:2:"ز";s:1:"";s:2:"س";s:1:"";s:2:"ش";s:1:"";s:2:"ص";s:1:"";s:2:"ض";s:1:"";s:2:"ط";s:1:"";s:2:"ظ";s:1:"";s:2:"ع";s:1:"";s:2:"غ";s:1:"";s:2:"ـ";s:1:"";s:2:"ف";s:1:"";s:2:"ق";s:1:"";s:2:"ك";s:1:"";s:2:"ل";s:1:"";s:2:"م";s:1:"";s:2:"ن";s:1:"";s:2:"ه";s:1:"";s:2:"و";s:1:"";s:2:"ى";s:1:"";s:2:"ي";s:1:"";s:2:"ً";s:1:"";s:2:"ٌ";s:1:"";s:2:"ٍ";s:1:"";s:2:"َ";s:1:"";s:2:"ُ";s:1:"";s:2:"ِ";s:1:"";s:2:"ّ";s:1:"";s:2:"ْ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.iso-8859-7.ser
@@ -0,0 +1,3 @@
+a:250:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:2:"£";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:3:"―";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"΄";s:1:"";s:2:"΅";s:1:"";s:2:"Ά";s:1:"";s:2:"·";s:1:"";s:2:"Έ";s:1:"";s:2:"Ή";s:1:"";s:2:"Ί";s:1:"";s:2:"»";s:1:"";s:2:"Ό";s:1:"";s:2:"½";s:1:"";s:2:"Ύ";s:1:"";s:2:"Ώ";s:1:"";s:2:"ΐ";s:1:"";s:2:"Α";s:1:"";s:2:"Β";s:1:"";s:2:"Γ";s:1:"";s:2:"Δ";s:1:"";s:2:"Ε";s:1:"";s:2:"Ζ";s:1:"";s:2:"Η";s:1:"";s:2:"Θ";s:1:"";s:2:"Ι";s:1:"";s:2:"Κ";s:1:"";s:2:"Λ";s:1:"";s:2:"Μ";s:1:"";s:2:"Ν";s:1:"";s:2:"Ξ";s:1:"";s:2:"Ο";s:1:"";s:2:"Π";s:1:"";s:2:"Ρ";s:1:"";s:2:"Σ";s:1:"";s:2:"Τ";s:1:"";s:2:"Υ";s:1:"";s:2:"Φ";s:1:"";s:2:"Χ";s:1:"";s:2:"Ψ";s:1:"";s:2:"Ω";s:1:"";s:2:"Ϊ";s:1:"";s:2:"Ϋ";s:1:"";s:2:"ά";s:1:"";s:2:"έ";s:1:"";s:2:"ή";s:1:"";s:2:"ί";s:1:"";s:2:"ΰ";s:1:"";s:2:"α";s:1:"";s:2:"β";s:1:"";s:2:"γ";s:1:"";s:2:"δ";s:1:"";s:2:"ε";s:1:"";s:2:"ζ";s:1:"";s:2:"η";s:1:"";s:2:"θ";s:1:"";s:2:"ι";s:1:"";s:2:"κ";s:1:"";s:2:"λ";s:1:"";s:2:"μ";s:1:"";s:2:"ν";s:1:"";s:2:"ξ";s:1:"";s:2:"ο";s:1:"";s:2:"π";s:1:"";s:2:"ρ";s:1:"";s:2:"ς";s:1:"";s:2:"σ";s:1:"";s:2:"τ";s:1:"";s:2:"υ";s:1:"";s:2:"φ";s:1:"";s:2:"χ";s:1:"";s:2:"ψ";s:1:"";s:2:"ω";s:1:"";s:2:"ϊ";s:1:"";s:2:"ϋ";s:1:"";s:2:"ό";s:1:"";s:2:"ύ";s:1:"";s:2:"ώ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.iso-8859-8.ser
@@ -0,0 +1,3 @@
+a:220:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"¥";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"×";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"¹";s:1:"";s:2:"÷";s:1:"";s:2:"»";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:3:"‗";s:1:"";s:2:"א";s:1:"";s:2:"ב";s:1:"";s:2:"ג";s:1:"";s:2:"ד";s:1:"";s:2:"ה";s:1:"";s:2:"ו";s:1:"";s:2:"ז";s:1:"";s:2:"ח";s:1:"";s:2:"ט";s:1:"";s:2:"י";s:1:"";s:2:"ך";s:1:"";s:2:"כ";s:1:"";s:2:"ל";s:1:"";s:2:"ם";s:1:"";s:2:"מ";s:1:"";s:2:"ן";s:1:"";s:2:"נ";s:1:"";s:2:"ס";s:1:"";s:2:"ע";s:1:"";s:2:"ף";s:1:"";s:2:"פ";s:1:"";s:2:"ץ";s:1:"";s:2:"צ";s:1:"";s:2:"ק";s:1:"";s:2:"ר";s:1:"";s:2:"ש";s:1:"";s:2:"ת";s:1:"";s:3:"‎";s:1:"";s:3:"‏";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.iso-8859-9.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"¡";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"¥";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"ª";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"¹";s:1:"";s:2:"º";s:1:"";s:2:"»";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"¿";s:1:"";s:2:"À";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ã";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Æ";s:1:"";s:2:"Ç";s:1:"";s:2:"È";s:1:"";s:2:"É";s:1:"";s:2:"Ê";s:1:"";s:2:"Ë";s:1:"";s:2:"Ì";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Ğ";s:1:"";s:2:"Ñ";s:1:"";s:2:"Ò";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Õ";s:1:"";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ø";s:1:"";s:2:"Ù";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"İ";s:1:"";s:2:"Ş";s:1:"";s:2:"ß";s:1:"";s:2:"à";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ã";s:1:"";s:2:"ä";s:1:"";s:2:"å";s:1:"";s:2:"æ";s:1:"";s:2:"ç";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"ì";s:1:"";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ğ";s:1:"";s:2:"ñ";s:1:"";s:2:"ò";s:1:"";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"õ";s:1:"";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ø";s:1:"";s:2:"ù";s:1:"";s:2:"ú";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"ı";s:1:"";s:2:"ş";s:1:"";s:2:"ÿ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.koi8-r.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:3:"─";s:1:"";s:3:"│";s:1:"";s:3:"┌";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┘";s:1:"";s:3:"├";s:1:"";s:3:"┤";s:1:"";s:3:"┬";s:1:"";s:3:"┴";s:1:"";s:3:"┼";s:1:"";s:3:"▀";s:1:"";s:3:"▄";s:1:"";s:3:"█";s:1:"";s:3:"▌";s:1:"";s:3:"▐";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"⌠";s:1:"";s:3:"■";s:1:"";s:3:"∙";s:1:"";s:3:"√";s:1:"";s:3:"≈";s:1:"";s:3:"≤";s:1:"";s:3:"≥";s:1:"";s:2:" ";s:1:"";s:3:"⌡";s:1:"";s:2:"°";s:1:"";s:2:"²";s:1:"";s:2:"·";s:1:"";s:2:"÷";s:1:"";s:3:"═";s:1:"";s:3:"║";s:1:"";s:3:"╒";s:1:"";s:2:"ё";s:1:"";s:3:"╓";s:1:"";s:3:"╔";s:1:"";s:3:"╕";s:1:"";s:3:"╖";s:1:"";s:3:"╗";s:1:"";s:3:"╘";s:1:"";s:3:"╙";s:1:"";s:3:"╚";s:1:"";s:3:"╛";s:1:"";s:3:"╜";s:1:"";s:3:"╝";s:1:"";s:3:"╞";s:1:"";s:3:"╟";s:1:"";s:3:"╠";s:1:"";s:3:"╡";s:1:"";s:2:"Ё";s:1:"";s:3:"╢";s:1:"";s:3:"╣";s:1:"";s:3:"╤";s:1:"";s:3:"╥";s:1:"";s:3:"╦";s:1:"";s:3:"╧";s:1:"";s:3:"╨";s:1:"";s:3:"╩";s:1:"";s:3:"╪";s:1:"";s:3:"╫";s:1:"";s:3:"╬";s:1:"";s:2:"©";s:1:"";s:2:"ю";s:1:"";s:2:"а";s:1:"";s:2:"б";s:1:"";s:2:"ц";s:1:"";s:2:"д";s:1:"";s:2:"е";s:1:"";s:2:"ф";s:1:"";s:2:"г";s:1:"";s:2:"х";s:1:"";s:2:"и";s:1:"";s:2:"й";s:1:"";s:2:"к";s:1:"";s:2:"л";s:1:"";s:2:"м";s:1:"";s:2:"н";s:1:"";s:2:"о";s:1:"";s:2:"п";s:1:"";s:2:"я";s:1:"";s:2:"р";s:1:"";s:2:"с";s:1:"";s:2:"т";s:1:"";s:2:"у";s:1:"";s:2:"ж";s:1:"";s:2:"в";s:1:"";s:2:"ь";s:1:"";s:2:"ы";s:1:"";s:2:"з";s:1:"";s:2:"ш";s:1:"";s:2:"э";s:1:"";s:2:"щ";s:1:"";s:2:"ч";s:1:"";s:2:"ъ";s:1:"";s:2:"Ю";s:1:"";s:2:"А";s:1:"";s:2:"Б";s:1:"";s:2:"Ц";s:1:"";s:2:"Д";s:1:"";s:2:"Е";s:1:"";s:2:"Ф";s:1:"";s:2:"Г";s:1:"";s:2:"Х";s:1:"";s:2:"И";s:1:"";s:2:"Й";s:1:"";s:2:"К";s:1:"";s:2:"Л";s:1:"";s:2:"М";s:1:"";s:2:"Н";s:1:"";s:2:"О";s:1:"";s:2:"П";s:1:"";s:2:"Я";s:1:"";s:2:"Р";s:1:"";s:2:"С";s:1:"";s:2:"Т";s:1:"";s:2:"У";s:1:"";s:2:"Ж";s:1:"";s:2:"В";s:1:"";s:2:"Ь";s:1:"";s:2:"Ы";s:1:"";s:2:"З";s:1:"";s:2:"Ш";s:1:"";s:2:"Э";s:1:"";s:2:"Щ";s:1:"";s:2:"Ч";s:1:"";s:2:"Ъ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.koi8-u.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:3:"─";s:1:"";s:3:"│";s:1:"";s:3:"┌";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┘";s:1:"";s:3:"├";s:1:"";s:3:"┤";s:1:"";s:3:"┬";s:1:"";s:3:"┴";s:1:"";s:3:"┼";s:1:"";s:3:"▀";s:1:"";s:3:"▄";s:1:"";s:3:"█";s:1:"";s:3:"▌";s:1:"";s:3:"▐";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"⌠";s:1:"";s:3:"■";s:1:"";s:3:"•";s:1:"";s:3:"√";s:1:"";s:3:"≈";s:1:"";s:3:"≤";s:1:"";s:3:"≥";s:1:"";s:2:" ";s:1:"";s:3:"⌡";s:1:"";s:2:"°";s:1:"";s:2:"²";s:1:"";s:2:"·";s:1:"";s:2:"÷";s:1:"";s:3:"═";s:1:"";s:3:"║";s:1:"";s:3:"╒";s:1:"";s:2:"ё";s:1:"";s:2:"є";s:1:"";s:3:"╔";s:1:"";s:2:"і";s:1:"";s:2:"ї";s:1:"";s:3:"╗";s:1:"";s:3:"╘";s:1:"";s:3:"╙";s:1:"";s:3:"╚";s:1:"";s:3:"╛";s:1:"";s:2:"ґ";s:1:"";s:3:"╝";s:1:"";s:3:"╞";s:1:"";s:3:"╟";s:1:"";s:3:"╠";s:1:"";s:3:"╡";s:1:"";s:2:"Ё";s:1:"";s:2:"Ѓ";s:1:"";s:3:"╣";s:1:"";s:2:"І";s:1:"";s:2:"Ї";s:1:"";s:3:"╦";s:1:"";s:3:"╧";s:1:"";s:3:"╨";s:1:"";s:3:"╩";s:1:"";s:3:"╪";s:1:"";s:2:"Ґ";s:1:"";s:3:"╬";s:1:"";s:2:"©";s:1:"";s:2:"ю";s:1:"";s:2:"а";s:1:"";s:2:"б";s:1:"";s:2:"ц";s:1:"";s:2:"д";s:1:"";s:2:"е";s:1:"";s:2:"ф";s:1:"";s:2:"г";s:1:"";s:2:"х";s:1:"";s:2:"и";s:1:"";s:2:"й";s:1:"";s:2:"к";s:1:"";s:2:"л";s:1:"";s:2:"м";s:1:"";s:2:"н";s:1:"";s:2:"о";s:1:"";s:2:"п";s:1:"";s:2:"я";s:1:"";s:2:"р";s:1:"";s:2:"с";s:1:"";s:2:"т";s:1:"";s:2:"у";s:1:"";s:2:"ж";s:1:"";s:2:"в";s:1:"";s:2:"ь";s:1:"";s:2:"ы";s:1:"";s:2:"з";s:1:"";s:2:"ш";s:1:"";s:2:"э";s:1:"";s:2:"щ";s:1:"";s:2:"ч";s:1:"";s:2:"ъ";s:1:"";s:2:"Ю";s:1:"";s:2:"А";s:1:"";s:2:"Б";s:1:"";s:2:"Ц";s:1:"";s:2:"Д";s:1:"";s:2:"Е";s:1:"";s:2:"Ф";s:1:"";s:2:"Г";s:1:"";s:2:"Х";s:1:"";s:2:"И";s:1:"";s:2:"Й";s:1:"";s:2:"К";s:1:"";s:2:"Л";s:1:"";s:2:"М";s:1:"";s:2:"Н";s:1:"";s:2:"О";s:1:"";s:2:"П";s:1:"";s:2:"Я";s:1:"";s:2:"Р";s:1:"";s:2:"С";s:1:"";s:2:"Т";s:1:"";s:2:"У";s:1:"";s:2:"Ж";s:1:"";s:2:"В";s:1:"";s:2:"Ь";s:1:"";s:2:"Ы";s:1:"";s:2:"З";s:1:"";s:2:"Ш";s:1:"";s:2:"Э";s:1:"";s:2:"Щ";s:1:"";s:2:"Ч";s:1:"";s:2:"Ъ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.mazovia.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:"";s:3:"zł";s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ç";s:1:"";s:2:"ü";s:1:"";s:2:"é";s:1:"";s:2:"â";s:1:"";s:2:"ä";s:1:"";s:2:"à";s:1:"";s:2:"ą";s:1:"";s:2:"ç";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"è";s:1:"";s:2:"ï";s:1:"";s:2:"î";s:1:"";s:2:"ć";s:1:"";s:2:"Ä";s:1:"";s:2:"Ą";s:1:"";s:2:"Ę";s:1:"";s:2:"ę";s:1:"";s:2:"ł";s:1:"";s:2:"ô";s:1:"";s:2:"ö";s:1:"";s:2:"Ć";s:1:"";s:2:"û";s:1:"";s:2:"ù";s:1:"";s:2:"Ś";s:1:"";s:2:"Ö";s:1:"";s:2:"Ü";s:1:"";s:2:"Ł";s:1:"";s:2:"¥";s:1:"";s:2:"ś";s:1:"";s:2:"ƒ";s:1:"";s:2:"Ź";s:1:"";s:2:"Ż";s:1:"";s:2:"ó";s:1:"";s:2:"Ó";s:1:"";s:2:"ń";s:1:"";s:2:"Ń";s:1:"";s:2:"ź";s:1:"";s:2:"ż";s:1:"";s:2:"¿";s:1:"";s:3:"⌐";s:1:"";s:2:"¬";s:1:"";s:2:"½";s:1:"";s:2:"¼";s:1:"";s:2:"¡";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:3:"╡";s:1:"";s:3:"╢";s:1:"";s:3:"╖";s:1:"";s:3:"╕";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:3:"╜";s:1:"";s:3:"╛";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:3:"╞";s:1:"";s:3:"╟";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:3:"╧";s:1:"";s:3:"╨";s:1:"";s:3:"╤";s:1:"";s:3:"╥";s:1:"";s:3:"╙";s:1:"";s:3:"╘";s:1:"";s:3:"╒";s:1:"";s:3:"╓";s:1:"";s:3:"╫";s:1:"";s:3:"╪";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:3:"▌";s:1:"";s:3:"▐";s:1:"";s:3:"▀";s:1:"";s:2:"α";s:1:"";s:2:"ß";s:1:"";s:2:"Γ";s:1:"";s:2:"π";s:1:"";s:2:"Σ";s:1:"";s:2:"σ";s:1:"";s:2:"µ";s:1:"";s:2:"τ";s:1:"";s:2:"Φ";s:1:"";s:2:"Θ";s:1:"";s:2:"Ω";s:1:"";s:2:"δ";s:1:"";s:3:"∞";s:1:"";s:2:"φ";s:1:"";s:2:"ε";s:1:"";s:3:"∩";s:1:"";s:3:"≡";s:1:"";s:2:"±";s:1:"";s:3:"≥";s:1:"";s:3:"≤";s:1:"";s:3:"⌠";s:1:"";s:3:"⌡";s:1:"";s:2:"÷";s:1:"";s:3:"≈";s:1:"";s:2:"°";s:1:"";s:3:"∙";s:1:"";s:2:"·";s:1:"";s:3:"√";s:1:"";s:3:"ⁿ";s:1:"";s:2:"²";s:1:"";s:3:"■";s:1:"";s:2:" ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.nextstep.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:" ";s:1:"";s:2:"À";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ã";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Ç";s:1:"";s:2:"È";s:1:"";s:2:"É";s:1:"";s:2:"Ê";s:1:"";s:2:"Ë";s:1:"";s:2:"Ì";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Ð";s:1:"";s:2:"Ñ";s:1:"";s:2:"Ò";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Õ";s:1:"";s:2:"Ö";s:1:"";s:2:"Ù";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"Ý";s:1:"";s:2:"Þ";s:1:"";s:2:"µ";s:1:"";s:2:"×";s:1:"";s:2:"÷";s:1:"";s:2:"©";s:1:"";s:2:"¡";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:3:"⁄";s:1:"";s:2:"¥";s:1:"";s:2:"ƒ";s:1:"";s:2:"§";s:1:"";s:2:"¤";s:1:"";s:3:"’";s:1:"";s:3:"“";s:1:"";s:2:"«";s:1:"";s:3:"‹";s:1:"";s:3:"›";s:1:"";s:3:"ﬁ";s:1:"";s:3:"ﬂ";s:1:"";s:2:"®";s:1:"";s:3:"–";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:2:"·";s:1:"";s:2:"¦";s:1:"";s:2:"¶";s:1:"";s:3:"•";s:1:"";s:3:"‚";s:1:"";s:3:"„";s:1:"";s:3:"”";s:1:"";s:2:"»";s:1:"";s:3:"…";s:1:"";s:3:"‰";s:1:"";s:2:"¬";s:1:"";s:2:"¿";s:1:"";s:2:"¹";s:1:"";s:2:"ˋ";s:1:"";s:2:"´";s:1:"";s:2:"ˆ";s:1:"";s:2:"˜";s:1:"";s:2:"¯";s:1:"";s:2:"˘";s:1:"";s:2:"˙";s:1:"";s:2:"¨";s:1:"";s:2:"²";s:1:"";s:2:"˚";s:1:"";s:2:"¸";s:1:"";s:2:"³";s:1:"";s:2:"˝";s:1:"";s:2:"˛";s:1:"";s:2:"ˇ";s:1:"";s:3:"—";s:1:"";s:2:"±";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"à";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ã";s:1:"";s:2:"ä";s:1:"";s:2:"å";s:1:"";s:2:"ç";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"ì";s:1:"";s:2:"Æ";s:1:"";s:2:"í";s:1:"";s:2:"ª";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ð";s:1:"";s:2:"ñ";s:1:"";s:2:"Ł";s:1:"";s:2:"Ø";s:1:"";s:2:"Œ";s:1:"";s:2:"º";s:1:"";s:2:"ò";s:1:"";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"õ";s:1:"";s:2:"ö";s:1:"";s:2:"æ";s:1:"";s:2:"ù";s:1:"";s:2:"ú";s:1:"";s:2:"û";s:1:"";s:2:"ı";s:1:"";s:2:"ü";s:1:"";s:2:"ý";s:1:"";s:2:"ł";s:1:"";s:2:"ø";s:1:"";s:2:"œ";s:1:"";s:2:"ß";s:1:"";s:2:"þ";s:1:"";s:2:"ÿ";s:1:"";s:3:"�";s:1:"";s:3:"�";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.stdenc.ser
@@ -0,0 +1 @@
+a:149:{s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:3:"’";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:3:"‘";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:2:"¡";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:3:"⁄";s:1:"";s:2:"¥";s:1:"";s:2:"ƒ";s:1:"";s:2:"§";s:1:"";s:2:"¤";s:1:"";s:1:"'";s:1:"";s:3:"“";s:1:"";s:2:"«";s:1:"";s:3:"‹";s:1:"";s:3:"›";s:1:"";s:3:"ﬁ";s:1:"";s:3:"ﬂ";s:1:"";s:3:"–";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:2:"·";s:1:"";s:2:"¶";s:1:"";s:3:"•";s:1:"";s:3:"‚";s:1:"";s:3:"„";s:1:"";s:3:"”";s:1:"";s:2:"»";s:1:"";s:3:"…";s:1:"";s:3:"‰";s:1:"";s:2:"¿";s:1:"";s:1:"`";s:1:"";s:2:"´";s:1:"";s:2:"ˆ";s:1:"";s:2:"˜";s:1:"";s:2:"¯";s:1:"";s:2:"˘";s:1:"";s:2:"˙";s:1:"";s:2:"¨";s:1:"";s:2:"˚";s:1:"";s:2:"¸";s:1:"";s:2:"˝";s:1:"";s:2:"˛";s:1:"";s:2:"ˇ";s:1:"";s:3:"—";s:1:"";s:2:"Æ";s:1:"";s:2:"ª";s:1:"";s:2:"Ł";s:1:"";s:2:"Ø";s:1:"";s:2:"Œ";s:1:"";s:2:"º";s:1:"";s:2:"æ";s:1:"";s:2:"ı";s:1:"";s:2:"ł";s:1:"";s:2:"ø";s:1:"";s:2:"œ";s:1:"";s:2:"ß";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.symbol.ser
@@ -0,0 +1 @@
+a:189:{s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:3:"∀";s:1:"#";s:1:"#";s:1:"$";s:3:"∃";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:3:"∋";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:3:"∗";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:3:"−";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:3:"≅";s:1:"A";s:2:"Α";s:1:"B";s:2:"Β";s:1:"C";s:2:"Χ";s:1:"D";s:2:"Δ";s:1:"E";s:2:"Ε";s:1:"F";s:2:"Φ";s:1:"G";s:2:"Γ";s:1:"H";s:2:"Η";s:1:"I";s:2:"Ι";s:1:"J";s:2:"ϑ";s:1:"K";s:2:"Κ";s:1:"L";s:2:"Λ";s:1:"M";s:2:"Μ";s:1:"N";s:2:"Ν";s:1:"O";s:2:"Ο";s:1:"P";s:2:"Π";s:1:"Q";s:2:"Θ";s:1:"R";s:2:"Ρ";s:1:"S";s:2:"Σ";s:1:"T";s:2:"Τ";s:1:"U";s:2:"Υ";s:1:"V";s:2:"ς";s:1:"W";s:2:"Ω";s:1:"X";s:2:"Ξ";s:1:"Y";s:2:"Ψ";s:1:"Z";s:2:"Ζ";s:1:"[";s:1:"[";s:1:"\";s:3:"∴";s:1:"]";s:1:"]";s:1:"^";s:3:"⊥";s:1:"_";s:1:"_";s:1:"`";s:3:"";s:1:"a";s:2:"α";s:1:"b";s:2:"β";s:1:"c";s:2:"χ";s:1:"d";s:2:"δ";s:1:"e";s:2:"ε";s:1:"f";s:2:"φ";s:1:"g";s:2:"γ";s:1:"h";s:2:"η";s:1:"i";s:2:"ι";s:1:"j";s:2:"ϕ";s:1:"k";s:2:"κ";s:1:"l";s:2:"λ";s:1:"m";s:2:"µ";s:1:"n";s:2:"ν";s:1:"o";s:2:"ο";s:1:"p";s:2:"π";s:1:"q";s:2:"θ";s:1:"r";s:2:"ρ";s:1:"s";s:2:"σ";s:1:"t";s:2:"τ";s:1:"u";s:2:"υ";s:1:"v";s:2:"ϖ";s:1:"w";s:2:"ω";s:1:"x";s:2:"ξ";s:1:"y";s:2:"ψ";s:1:"z";s:2:"ζ";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:3:"∼";s:1:"";s:3:"€";s:1:"";s:2:"ϒ";s:1:"";s:3:"′";s:1:"";s:3:"≤";s:1:"";s:3:"⁄";s:1:"";s:3:"∞";s:1:"";s:2:"ƒ";s:1:"";s:3:"♣";s:1:"";s:3:"♦";s:1:"";s:3:"♥";s:1:"";s:3:"♠";s:1:"";s:3:"↔";s:1:"";s:3:"←";s:1:"";s:3:"↑";s:1:"";s:3:"→";s:1:"";s:3:"↓";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:3:"″";s:1:"";s:3:"≥";s:1:"";s:2:"×";s:1:"";s:3:"∝";s:1:"";s:3:"∂";s:1:"";s:3:"•";s:1:"";s:2:"÷";s:1:"";s:3:"≠";s:1:"";s:3:"≡";s:1:"";s:3:"≈";s:1:"";s:3:"…";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"↵";s:1:"";s:3:"ℵ";s:1:"";s:3:"ℑ";s:1:"";s:3:"ℜ";s:1:"";s:3:"℘";s:1:"";s:3:"⊗";s:1:"";s:3:"⊕";s:1:"";s:3:"∅";s:1:"";s:3:"∩";s:1:"";s:3:"∪";s:1:"";s:3:"⊃";s:1:"";s:3:"⊇";s:1:"";s:3:"⊄";s:1:"";s:3:"⊂";s:1:"";s:3:"⊆";s:1:"";s:3:"∈";s:1:"";s:3:"∉";s:1:"";s:3:"∠";s:1:"";s:3:"∇";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"∏";s:1:"";s:3:"√";s:1:"";s:3:"⋅";s:1:"";s:2:"¬";s:1:"";s:3:"∧";s:1:"";s:3:"∨";s:1:"";s:3:"⇔";s:1:"";s:3:"⇐";s:1:"";s:3:"⇑";s:1:"";s:3:"⇒";s:1:"";s:3:"⇓";s:1:"";s:3:"◊";s:1:"";s:3:"〈";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"∑";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"〉";s:1:"";s:3:"∫";s:1:"";s:3:"⌠";s:1:"";s:3:"";s:1:"";s:3:"⌡";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.turkish.ser
@@ -0,0 +1,3 @@
+a:254:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Ç";s:1:"";s:2:"É";s:1:"";s:2:"Ñ";s:1:"";s:2:"Ö";s:1:"";s:2:"Ü";s:1:"";s:2:"á";s:1:"";s:2:"à";s:1:"";s:2:"â";s:1:"";s:2:"ä";s:1:"";s:2:"ã";s:1:"";s:2:"å";s:1:"";s:2:"ç";s:1:"";s:2:"é";s:1:"";s:2:"è";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"í";s:1:"";s:2:"ì";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ñ";s:1:"";s:2:"ó";s:1:"";s:2:"ò";s:1:"";s:2:"ô";s:1:"";s:2:"ö";s:1:"";s:2:"õ";s:1:"";s:2:"ú";s:1:"";s:2:"ù";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:3:"†";s:1:"";s:2:"°";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"§";s:1:"";s:3:"•";s:1:"";s:2:"¶";s:1:"";s:2:"ß";s:1:"";s:2:"®";s:1:"";s:2:"©";s:1:"";s:3:"™";s:1:"";s:2:"´";s:1:"";s:2:"¨";s:1:"";s:3:"≠";s:1:"";s:2:"Æ";s:1:"";s:2:"Ø";s:1:"";s:3:"∞";s:1:"";s:2:"±";s:1:"";s:3:"≤";s:1:"";s:3:"≥";s:1:"";s:2:"¥";s:1:"";s:2:"µ";s:1:"";s:3:"∂";s:1:"";s:3:"∑";s:1:"";s:3:"∏";s:1:"";s:2:"π";s:1:"";s:3:"∫";s:1:"";s:2:"ª";s:1:"";s:2:"º";s:1:"";s:3:"Ω";s:1:"";s:2:"æ";s:1:"";s:2:"ø";s:1:"";s:2:"¿";s:1:"";s:2:"¡";s:1:"";s:2:"¬";s:1:"";s:3:"√";s:1:"";s:2:"ƒ";s:1:"";s:3:"≈";s:1:"";s:3:"∆";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"…";s:1:"";s:2:" ";s:1:"";s:2:"À";s:1:"";s:2:"Ã";s:1:"";s:2:"Õ";s:1:"";s:2:"Œ";s:1:"";s:2:"œ";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:2:"÷";s:1:"";s:3:"◊";s:1:"";s:2:"ÿ";s:1:"";s:2:"Ÿ";s:1:"";s:2:"Ğ";s:1:"";s:2:"ğ";s:1:"";s:2:"İ";s:1:"";s:2:"ı";s:1:"";s:2:"Ş";s:1:"";s:2:"ş";s:1:"";s:3:"‡";s:1:"";s:2:"·";s:1:"";s:3:"‚";s:1:"";s:3:"„";s:1:"";s:3:"‰";s:1:"";s:2:"Â";s:1:"";s:2:"Ê";s:1:"";s:2:"Á";s:1:"";s:2:"Ë";s:1:"";s:2:"È";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Ì";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Ò";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ù";s:1:"";s:2:"ˆ";s:1:"";s:2:"˜";s:1:"";s:2:"¯";s:1:"";s:2:"˘";s:1:"";s:2:"˙";s:1:"";s:2:"˚";s:1:"";s:2:"¸";s:1:"";s:2:"˝";s:1:"";s:2:"˛";s:1:"";s:2:"ˇ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.us-ascii-quotes.ser
@@ -0,0 +1,3 @@
+a:128:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:3:"’";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:3:"‘";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.us-ascii.ser
@@ -0,0 +1,3 @@
+a:128:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.windows-1250.ser
@@ -0,0 +1,3 @@
+a:251:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:3:"€";s:1:"";s:3:"‚";s:1:"";s:3:"„";s:1:"";s:3:"…";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:3:"‰";s:1:"";s:2:"Š";s:1:"";s:3:"‹";s:1:"";s:2:"Ś";s:1:"";s:2:"Ť";s:1:"";s:2:"Ž";s:1:"";s:2:"Ź";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"•";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"™";s:1:"";s:2:"š";s:1:"";s:3:"›";s:1:"";s:2:"ś";s:1:"";s:2:"ť";s:1:"";s:2:"ž";s:1:"";s:2:"ź";s:1:"";s:2:" ";s:1:"";s:2:"ˇ";s:1:"";s:2:"˘";s:1:"";s:2:"Ł";s:1:"";s:2:"¤";s:1:"";s:2:"Ą";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"Ş";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"Ż";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"˛";s:1:"";s:2:"ł";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"ą";s:1:"";s:2:"ş";s:1:"";s:2:"»";s:1:"";s:2:"Ľ";s:1:"";s:2:"˝";s:1:"";s:2:"ľ";s:1:"";s:2:"ż";s:1:"";s:2:"Ŕ";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ă";s:1:"";s:2:"Ä";s:1:"";s:2:"Ĺ";s:1:"";s:2:"Ć";s:1:"";s:2:"Ç";s:1:"";s:2:"Č";s:1:"";s:2:"É";s:1:"";s:2:"Ę";s:1:"";s:2:"Ë";s:1:"";s:2:"Ě";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ď";s:1:"";s:2:"Đ";s:1:"";s:2:"Ń";s:1:"";s:2:"Ň";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Ő";s:1:"";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ř";s:1:"";s:2:"Ů";s:1:"";s:2:"Ú";s:1:"";s:2:"Ű";s:1:"";s:2:"Ü";s:1:"";s:2:"Ý";s:1:"";s:2:"Ţ";s:1:"";s:2:"ß";s:1:"";s:2:"ŕ";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ă";s:1:"";s:2:"ä";s:1:"";s:2:"ĺ";s:1:"";s:2:"ć";s:1:"";s:2:"ç";s:1:"";s:2:"č";s:1:"";s:2:"é";s:1:"";s:2:"ę";s:1:"";s:2:"ë";s:1:"";s:2:"ě";s:1:"";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ď";s:1:"";s:2:"đ";s:1:"";s:2:"ń";s:1:"";s:2:"ň";s:1:"";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"ő";s:1:"";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ř";s:1:"";s:2:"ů";s:1:"";s:2:"ú";s:1:"";s:2:"ű";s:1:"";s:2:"ü";s:1:"";s:2:"ý";s:1:"";s:2:"ţ";s:1:"";s:2:"˙";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.windows-1251.ser
@@ -0,0 +1,3 @@
+a:255:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ђ";s:1:"";s:2:"Ѓ";s:1:"";s:3:"‚";s:1:"";s:2:"ѓ";s:1:"";s:3:"„";s:1:"";s:3:"…";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:3:"€";s:1:"";s:3:"‰";s:1:"";s:2:"Љ";s:1:"";s:3:"‹";s:1:"";s:2:"Њ";s:1:"";s:2:"Ќ";s:1:"";s:2:"Ћ";s:1:"";s:2:"Џ";s:1:"";s:2:"ђ";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"•";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"™";s:1:"";s:2:"љ";s:1:"";s:3:"›";s:1:"";s:2:"њ";s:1:"";s:2:"ќ";s:1:"";s:2:"ћ";s:1:"";s:2:"џ";s:1:"";s:2:" ";s:1:"";s:2:"Ў";s:1:"";s:2:"ў";s:1:"";s:2:"Ј";s:1:"";s:2:"¤";s:1:"";s:2:"Ґ";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"Ё";s:1:"";s:2:"©";s:1:"";s:2:"Є";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"Ї";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"І";s:1:"";s:2:"і";s:1:"";s:2:"ґ";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"ё";s:1:"";s:3:"№";s:1:"";s:2:"є";s:1:"";s:2:"»";s:1:"";s:2:"ј";s:1:"";s:2:"Ѕ";s:1:"";s:2:"ѕ";s:1:"";s:2:"ї";s:1:"";s:2:"А";s:1:"";s:2:"Б";s:1:"";s:2:"В";s:1:"";s:2:"Г";s:1:"";s:2:"Д";s:1:"";s:2:"Е";s:1:"";s:2:"Ж";s:1:"";s:2:"З";s:1:"";s:2:"И";s:1:"";s:2:"Й";s:1:"";s:2:"К";s:1:"";s:2:"Л";s:1:"";s:2:"М";s:1:"";s:2:"Н";s:1:"";s:2:"О";s:1:"";s:2:"П";s:1:"";s:2:"Р";s:1:"";s:2:"С";s:1:"";s:2:"Т";s:1:"";s:2:"У";s:1:"";s:2:"Ф";s:1:"";s:2:"Х";s:1:"";s:2:"Ц";s:1:"";s:2:"Ч";s:1:"";s:2:"Ш";s:1:"";s:2:"Щ";s:1:"";s:2:"Ъ";s:1:"";s:2:"Ы";s:1:"";s:2:"Ь";s:1:"";s:2:"Э";s:1:"";s:2:"Ю";s:1:"";s:2:"Я";s:1:"";s:2:"а";s:1:"";s:2:"б";s:1:"";s:2:"в";s:1:"";s:2:"г";s:1:"";s:2:"д";s:1:"";s:2:"е";s:1:"";s:2:"ж";s:1:"";s:2:"з";s:1:"";s:2:"и";s:1:"";s:2:"й";s:1:"";s:2:"к";s:1:"";s:2:"л";s:1:"";s:2:"м";s:1:"";s:2:"н";s:1:"";s:2:"о";s:1:"";s:2:"п";s:1:"";s:2:"р";s:1:"";s:2:"с";s:1:"";s:2:"т";s:1:"";s:2:"у";s:1:"";s:2:"ф";s:1:"";s:2:"х";s:1:"";s:2:"ц";s:1:"";s:2:"ч";s:1:"";s:2:"ш";s:1:"";s:2:"щ";s:1:"";s:2:"ъ";s:1:"";s:2:"ы";s:1:"";s:2:"ь";s:1:"";s:2:"э";s:1:"";s:2:"ю";s:1:"";s:2:"я";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.windows-1252.ser
@@ -0,0 +1,3 @@
+a:251:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:3:"€";s:1:"";s:3:"‚";s:1:"";s:2:"ƒ";s:1:"";s:3:"„";s:1:"";s:3:"…";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:2:"ˆ";s:1:"";s:3:"‰";s:1:"";s:2:"Š";s:1:"";s:3:"‹";s:1:"";s:2:"Œ";s:1:"";s:2:"Ž";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"•";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:2:"˜";s:1:"";s:3:"™";s:1:"";s:2:"š";s:1:"";s:3:"›";s:1:"";s:2:"œ";s:1:"";s:2:"ž";s:1:"";s:2:"Ÿ";s:1:"";s:2:" ";s:1:"";s:2:"¡";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"¥";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"ª";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"¹";s:1:"";s:2:"º";s:1:"";s:2:"»";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"¿";s:1:"";s:2:"À";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ã";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Æ";s:1:"";s:2:"Ç";s:1:"";s:2:"È";s:1:"";s:2:"É";s:1:"";s:2:"Ê";s:1:"";s:2:"Ë";s:1:"";s:2:"Ì";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Ð";s:1:"";s:2:"Ñ";s:1:"";s:2:"Ò";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Õ";s:1:"";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ø";s:1:"";s:2:"Ù";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"Ý";s:1:"";s:2:"Þ";s:1:"";s:2:"ß";s:1:"";s:2:"à";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ã";s:1:"";s:2:"ä";s:1:"";s:2:"å";s:1:"";s:2:"æ";s:1:"";s:2:"ç";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"ì";s:1:"";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ð";s:1:"";s:2:"ñ";s:1:"";s:2:"ò";s:1:"";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"õ";s:1:"";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ø";s:1:"";s:2:"ù";s:1:"";s:2:"ú";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"ý";s:1:"";s:2:"þ";s:1:"";s:2:"ÿ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.windows-1253.ser
@@ -0,0 +1,3 @@
+a:239:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:3:"€";s:1:"";s:3:"‚";s:1:"";s:2:"ƒ";s:1:"";s:3:"„";s:1:"";s:3:"…";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:3:"‰";s:1:"";s:3:"‹";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"•";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"™";s:1:"";s:3:"›";s:1:"";s:2:" ";s:1:"";s:2:"΅";s:1:"";s:2:"Ά";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"¥";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:3:"―";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"΄";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"Έ";s:1:"";s:2:"Ή";s:1:"";s:2:"Ί";s:1:"";s:2:"»";s:1:"";s:2:"Ό";s:1:"";s:2:"½";s:1:"";s:2:"Ύ";s:1:"";s:2:"Ώ";s:1:"";s:2:"ΐ";s:1:"";s:2:"Α";s:1:"";s:2:"Β";s:1:"";s:2:"Γ";s:1:"";s:2:"Δ";s:1:"";s:2:"Ε";s:1:"";s:2:"Ζ";s:1:"";s:2:"Η";s:1:"";s:2:"Θ";s:1:"";s:2:"Ι";s:1:"";s:2:"Κ";s:1:"";s:2:"Λ";s:1:"";s:2:"Μ";s:1:"";s:2:"Ν";s:1:"";s:2:"Ξ";s:1:"";s:2:"Ο";s:1:"";s:2:"Π";s:1:"";s:2:"Ρ";s:1:"";s:2:"Σ";s:1:"";s:2:"Τ";s:1:"";s:2:"Υ";s:1:"";s:2:"Φ";s:1:"";s:2:"Χ";s:1:"";s:2:"Ψ";s:1:"";s:2:"Ω";s:1:"";s:2:"Ϊ";s:1:"";s:2:"Ϋ";s:1:"";s:2:"ά";s:1:"";s:2:"έ";s:1:"";s:2:"ή";s:1:"";s:2:"ί";s:1:"";s:2:"ΰ";s:1:"";s:2:"α";s:1:"";s:2:"β";s:1:"";s:2:"γ";s:1:"";s:2:"δ";s:1:"";s:2:"ε";s:1:"";s:2:"ζ";s:1:"";s:2:"η";s:1:"";s:2:"θ";s:1:"";s:2:"ι";s:1:"";s:2:"κ";s:1:"";s:2:"λ";s:1:"";s:2:"μ";s:1:"";s:2:"ν";s:1:"";s:2:"ξ";s:1:"";s:2:"ο";s:1:"";s:2:"π";s:1:"";s:2:"ρ";s:1:"";s:2:"ς";s:1:"";s:2:"σ";s:1:"";s:2:"τ";s:1:"";s:2:"υ";s:1:"";s:2:"φ";s:1:"";s:2:"χ";s:1:"";s:2:"ψ";s:1:"";s:2:"ω";s:1:"";s:2:"ϊ";s:1:"";s:2:"ϋ";s:1:"";s:2:"ό";s:1:"";s:2:"ύ";s:1:"";s:2:"ώ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.windows-1254.ser
@@ -0,0 +1,3 @@
+a:249:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:3:"€";s:1:"";s:3:"‚";s:1:"";s:2:"ƒ";s:1:"";s:3:"„";s:1:"";s:3:"…";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:2:"ˆ";s:1:"";s:3:"‰";s:1:"";s:2:"Š";s:1:"";s:3:"‹";s:1:"";s:2:"Œ";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"•";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:2:"˜";s:1:"";s:3:"™";s:1:"";s:2:"š";s:1:"";s:3:"›";s:1:"";s:2:"œ";s:1:"";s:2:"Ÿ";s:1:"";s:2:" ";s:1:"";s:2:"¡";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"¥";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"ª";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"¹";s:1:"";s:2:"º";s:1:"";s:2:"»";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"¿";s:1:"";s:2:"À";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ã";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Æ";s:1:"";s:2:"Ç";s:1:"";s:2:"È";s:1:"";s:2:"É";s:1:"";s:2:"Ê";s:1:"";s:2:"Ë";s:1:"";s:2:"Ì";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Ğ";s:1:"";s:2:"Ñ";s:1:"";s:2:"Ò";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Õ";s:1:"";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ø";s:1:"";s:2:"Ù";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"İ";s:1:"";s:2:"Ş";s:1:"";s:2:"ß";s:1:"";s:2:"à";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ã";s:1:"";s:2:"ä";s:1:"";s:2:"å";s:1:"";s:2:"æ";s:1:"";s:2:"ç";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"ì";s:1:"";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ğ";s:1:"";s:2:"ñ";s:1:"";s:2:"ò";s:1:"";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"õ";s:1:"";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ø";s:1:"";s:2:"ù";s:1:"";s:2:"ú";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"ı";s:1:"";s:2:"ş";s:1:"";s:2:"ÿ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.windows-1255.ser
@@ -0,0 +1,3 @@
+a:233:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:3:"€";s:1:"";s:3:"‚";s:1:"";s:2:"ƒ";s:1:"";s:3:"„";s:1:"";s:3:"…";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:2:"ˆ";s:1:"";s:3:"‰";s:1:"";s:3:"‹";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"•";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:2:"˜";s:1:"";s:3:"™";s:1:"";s:3:"›";s:1:"";s:2:" ";s:1:"";s:2:"¡";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:3:"₪";s:1:"";s:2:"¥";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"×";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"¹";s:1:"";s:2:"÷";s:1:"";s:2:"»";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"¿";s:1:"";s:2:"ְ";s:1:"";s:2:"ֱ";s:1:"";s:2:"ֲ";s:1:"";s:2:"ֳ";s:1:"";s:2:"ִ";s:1:"";s:2:"ֵ";s:1:"";s:2:"ֶ";s:1:"";s:2:"ַ";s:1:"";s:2:"ָ";s:1:"";s:2:"ֹ";s:1:"";s:2:"ֻ";s:1:"";s:2:"ּ";s:1:"";s:2:"ֽ";s:1:"";s:2:"־";s:1:"";s:2:"ֿ";s:1:"";s:2:"׀";s:1:"";s:2:"ׁ";s:1:"";s:2:"ׂ";s:1:"";s:2:"׃";s:1:"";s:2:"װ";s:1:"";s:2:"ױ";s:1:"";s:2:"ײ";s:1:"";s:2:"׳";s:1:"";s:2:"״";s:1:"";s:2:"א";s:1:"";s:2:"ב";s:1:"";s:2:"ג";s:1:"";s:2:"ד";s:1:"";s:2:"ה";s:1:"";s:2:"ו";s:1:"";s:2:"ז";s:1:"";s:2:"ח";s:1:"";s:2:"ט";s:1:"";s:2:"י";s:1:"";s:2:"ך";s:1:"";s:2:"כ";s:1:"";s:2:"ל";s:1:"";s:2:"ם";s:1:"";s:2:"מ";s:1:"";s:2:"ן";s:1:"";s:2:"נ";s:1:"";s:2:"ס";s:1:"";s:2:"ע";s:1:"";s:2:"ף";s:1:"";s:2:"פ";s:1:"";s:2:"ץ";s:1:"";s:2:"צ";s:1:"";s:2:"ק";s:1:"";s:2:"ר";s:1:"";s:2:"ש";s:1:"";s:2:"ת";s:1:"";s:3:"‎";s:1:"";s:3:"‏";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.windows-1256.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:3:"€";s:1:"";s:2:"پ";s:1:"";s:3:"‚";s:1:"";s:2:"ƒ";s:1:"";s:3:"„";s:1:"";s:3:"…";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:2:"ˆ";s:1:"";s:3:"‰";s:1:"";s:2:"ٹ";s:1:"";s:3:"‹";s:1:"";s:2:"Œ";s:1:"";s:2:"چ";s:1:"";s:2:"ژ";s:1:"";s:2:"ڈ";s:1:"";s:2:"گ";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"•";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:2:"ک";s:1:"";s:3:"™";s:1:"";s:2:"ڑ";s:1:"";s:3:"›";s:1:"";s:2:"œ";s:1:"";s:3:"‌";s:1:"";s:3:"‍";s:1:"";s:2:"ں";s:1:"";s:2:" ";s:1:"";s:2:"،";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"¥";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"ھ";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"¹";s:1:"";s:2:"؛";s:1:"";s:2:"»";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"؟";s:1:"";s:2:"ہ";s:1:"";s:2:"ء";s:1:"";s:2:"آ";s:1:"";s:2:"أ";s:1:"";s:2:"ؤ";s:1:"";s:2:"إ";s:1:"";s:2:"ئ";s:1:"";s:2:"ا";s:1:"";s:2:"ب";s:1:"";s:2:"ة";s:1:"";s:2:"ت";s:1:"";s:2:"ث";s:1:"";s:2:"ج";s:1:"";s:2:"ح";s:1:"";s:2:"خ";s:1:"";s:2:"د";s:1:"";s:2:"ذ";s:1:"";s:2:"ر";s:1:"";s:2:"ز";s:1:"";s:2:"س";s:1:"";s:2:"ش";s:1:"";s:2:"ص";s:1:"";s:2:"ض";s:1:"";s:2:"×";s:1:"";s:2:"ط";s:1:"";s:2:"ظ";s:1:"";s:2:"ع";s:1:"";s:2:"غ";s:1:"";s:2:"ـ";s:1:"";s:2:"ف";s:1:"";s:2:"ق";s:1:"";s:2:"ك";s:1:"";s:2:"à";s:1:"";s:2:"ل";s:1:"";s:2:"â";s:1:"";s:2:"م";s:1:"";s:2:"ن";s:1:"";s:2:"ه";s:1:"";s:2:"و";s:1:"";s:2:"ç";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"ى";s:1:"";s:2:"ي";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ً";s:1:"";s:2:"ٌ";s:1:"";s:2:"ٍ";s:1:"";s:2:"َ";s:1:"";s:2:"ô";s:1:"";s:2:"ُ";s:1:"";s:2:"ِ";s:1:"";s:2:"÷";s:1:"";s:2:"ّ";s:1:"";s:2:"ù";s:1:"";s:2:"ْ";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:3:"‎";s:1:"";s:3:"‏";s:1:"";s:2:"ے";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.windows-1257.ser
@@ -0,0 +1,3 @@
+a:244:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:3:"€";s:1:"";s:3:"‚";s:1:"";s:3:"„";s:1:"";s:3:"…";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:3:"‰";s:1:"";s:3:"‹";s:1:"";s:2:"¨";s:1:"";s:2:"ˇ";s:1:"";s:2:"¸";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"•";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"™";s:1:"";s:3:"›";s:1:"";s:2:"¯";s:1:"";s:2:"˛";s:1:"";s:2:" ";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"Ø";s:1:"";s:2:"©";s:1:"";s:2:"Ŗ";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"Æ";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"ø";s:1:"";s:2:"¹";s:1:"";s:2:"ŗ";s:1:"";s:2:"»";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"æ";s:1:"";s:2:"Ą";s:1:"";s:2:"Į";s:1:"";s:2:"Ā";s:1:"";s:2:"Ć";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Ę";s:1:"";s:2:"Ē";s:1:"";s:2:"Č";s:1:"";s:2:"É";s:1:"";s:2:"Ź";s:1:"";s:2:"Ė";s:1:"";s:2:"Ģ";s:1:"";s:2:"Ķ";s:1:"";s:2:"Ī";s:1:"";s:2:"Ļ";s:1:"";s:2:"Š";s:1:"";s:2:"Ń";s:1:"";s:2:"Ņ";s:1:"";s:2:"Ó";s:1:"";s:2:"Ō";s:1:"";s:2:"Õ";s:1:"";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ų";s:1:"";s:2:"Ł";s:1:"";s:2:"Ś";s:1:"";s:2:"Ū";s:1:"";s:2:"Ü";s:1:"";s:2:"Ż";s:1:"";s:2:"Ž";s:1:"";s:2:"ß";s:1:"";s:2:"ą";s:1:"";s:2:"į";s:1:"";s:2:"ā";s:1:"";s:2:"ć";s:1:"";s:2:"ä";s:1:"";s:2:"å";s:1:"";s:2:"ę";s:1:"";s:2:"ē";s:1:"";s:2:"č";s:1:"";s:2:"é";s:1:"";s:2:"ź";s:1:"";s:2:"ė";s:1:"";s:2:"ģ";s:1:"";s:2:"ķ";s:1:"";s:2:"ī";s:1:"";s:2:"ļ";s:1:"";s:2:"š";s:1:"";s:2:"ń";s:1:"";s:2:"ņ";s:1:"";s:2:"ó";s:1:"";s:2:"ō";s:1:"";s:2:"õ";s:1:"";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ų";s:1:"";s:2:"ł";s:1:"";s:2:"ś";s:1:"";s:2:"ū";s:1:"";s:2:"ü";s:1:"";s:2:"ż";s:1:"";s:2:"ž";s:1:"";s:2:"˙";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.windows-1258.ser
@@ -0,0 +1,3 @@
+a:247:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:3:"€";s:1:"";s:3:"‚";s:1:"";s:2:"ƒ";s:1:"";s:3:"„";s:1:"";s:3:"…";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:2:"ˆ";s:1:"";s:3:"‰";s:1:"";s:3:"‹";s:1:"";s:2:"Œ";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"•";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:2:"˜";s:1:"";s:3:"™";s:1:"";s:3:"›";s:1:"";s:2:"œ";s:1:"";s:2:"Ÿ";s:1:"";s:2:" ";s:1:"";s:2:"¡";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"¥";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"ª";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"¹";s:1:"";s:2:"º";s:1:"";s:2:"»";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"¿";s:1:"";s:2:"À";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ă";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Æ";s:1:"";s:2:"Ç";s:1:"";s:2:"È";s:1:"";s:2:"É";s:1:"";s:2:"Ê";s:1:"";s:2:"Ë";s:1:"";s:2:"̀";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Đ";s:1:"";s:2:"Ñ";s:1:"";s:2:"̉";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Ơ";s:1:"";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ø";s:1:"";s:2:"Ù";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"Ư";s:1:"";s:2:"̃";s:1:"";s:2:"ß";s:1:"";s:2:"à";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ă";s:1:"";s:2:"ä";s:1:"";s:2:"å";s:1:"";s:2:"æ";s:1:"";s:2:"ç";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"́";s:1:"";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"đ";s:1:"";s:2:"ñ";s:1:"";s:2:"̣";s:1:"";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"ơ";s:1:"";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ø";s:1:"";s:2:"ù";s:1:"";s:2:"ú";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"ư";s:1:"";s:3:"₫";s:1:"";s:2:"ÿ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.x-mac-ce.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ä";s:1:"";s:2:"Ā";s:1:"";s:2:"ā";s:1:"";s:2:"É";s:1:"";s:2:"Ą";s:1:"";s:2:"Ö";s:1:"";s:2:"Ü";s:1:"";s:2:"á";s:1:"";s:2:"ą";s:1:"";s:2:"Č";s:1:"";s:2:"ä";s:1:"";s:2:"č";s:1:"";s:2:"Ć";s:1:"";s:2:"ć";s:1:"";s:2:"é";s:1:"";s:2:"Ź";s:1:"";s:2:"ź";s:1:"";s:2:"Ď";s:1:"";s:2:"í";s:1:"";s:2:"ď";s:1:"";s:2:"Ē";s:1:"";s:2:"ē";s:1:"";s:2:"Ė";s:1:"";s:2:"ó";s:1:"";s:2:"ė";s:1:"";s:2:"ô";s:1:"";s:2:"ö";s:1:"";s:2:"õ";s:1:"";s:2:"ú";s:1:"";s:2:"Ě";s:1:"";s:2:"ě";s:1:"";s:2:"ü";s:1:"";s:3:"†";s:1:"";s:2:"°";s:1:"";s:2:"Ę";s:1:"";s:2:"£";s:1:"";s:2:"§";s:1:"";s:3:"•";s:1:"";s:2:"¶";s:1:"";s:2:"ß";s:1:"";s:2:"®";s:1:"";s:2:"©";s:1:"";s:3:"™";s:1:"";s:2:"ę";s:1:"";s:2:"¨";s:1:"";s:3:"≠";s:1:"";s:2:"ģ";s:1:"";s:2:"Į";s:1:"";s:2:"į";s:1:"";s:2:"Ī";s:1:"";s:3:"≤";s:1:"";s:3:"≥";s:1:"";s:2:"ī";s:1:"";s:2:"Ķ";s:1:"";s:3:"∂";s:1:"";s:3:"∑";s:1:"";s:2:"ł";s:1:"";s:2:"Ļ";s:1:"";s:2:"ļ";s:1:"";s:2:"Ľ";s:1:"";s:2:"ľ";s:1:"";s:2:"Ĺ";s:1:"";s:2:"ĺ";s:1:"";s:2:"Ņ";s:1:"";s:2:"ņ";s:1:"";s:2:"Ń";s:1:"";s:2:"¬";s:1:"";s:3:"√";s:1:"";s:2:"ń";s:1:"";s:2:"Ň";s:1:"";s:3:"∆";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"…";s:1:"";s:2:" ";s:1:"";s:2:"ň";s:1:"";s:2:"Ő";s:1:"";s:2:"Õ";s:1:"";s:2:"ő";s:1:"";s:2:"Ō";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:2:"÷";s:1:"";s:3:"◊";s:1:"";s:2:"ō";s:1:"";s:2:"Ŕ";s:1:"";s:2:"ŕ";s:1:"";s:2:"Ř";s:1:"";s:3:"‹";s:1:"";s:3:"›";s:1:"";s:2:"ř";s:1:"";s:2:"Ŗ";s:1:"";s:2:"ŗ";s:1:"";s:2:"Š";s:1:"";s:3:"‚";s:1:"";s:3:"„";s:1:"";s:2:"š";s:1:"";s:2:"Ś";s:1:"";s:2:"ś";s:1:"";s:2:"Á";s:1:"";s:2:"Ť";s:1:"";s:2:"ť";s:1:"";s:2:"Í";s:1:"";s:2:"Ž";s:1:"";s:2:"ž";s:1:"";s:2:"Ū";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"ū";s:1:"";s:2:"Ů";s:1:"";s:2:"Ú";s:1:"";s:2:"ů";s:1:"";s:2:"Ű";s:1:"";s:2:"ű";s:1:"";s:2:"Ų";s:1:"";s:2:"ų";s:1:"";s:2:"Ý";s:1:"";s:2:"ý";s:1:"";s:2:"ķ";s:1:"";s:2:"Ż";s:1:"";s:2:"Ł";s:1:"";s:2:"ż";s:1:"";s:2:"Ģ";s:1:"";s:2:"ˇ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.x-mac-cyrillic.ser
@@ -0,0 +1,3 @@
+a:256:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"А";s:1:"";s:2:"Б";s:1:"";s:2:"В";s:1:"";s:2:"Г";s:1:"";s:2:"Д";s:1:"";s:2:"Е";s:1:"";s:2:"Ж";s:1:"";s:2:"З";s:1:"";s:2:"И";s:1:"";s:2:"Й";s:1:"";s:2:"К";s:1:"";s:2:"Л";s:1:"";s:2:"М";s:1:"";s:2:"Н";s:1:"";s:2:"О";s:1:"";s:2:"П";s:1:"";s:2:"Р";s:1:"";s:2:"С";s:1:"";s:2:"Т";s:1:"";s:2:"У";s:1:"";s:2:"Ф";s:1:"";s:2:"Х";s:1:"";s:2:"Ц";s:1:"";s:2:"Ч";s:1:"";s:2:"Ш";s:1:"";s:2:"Щ";s:1:"";s:2:"Ъ";s:1:"";s:2:"Ы";s:1:"";s:2:"Ь";s:1:"";s:2:"Э";s:1:"";s:2:"Ю";s:1:"";s:2:"Я";s:1:"";s:3:"†";s:1:"";s:2:"°";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"§";s:1:"";s:3:"•";s:1:"";s:2:"¶";s:1:"";s:2:"І";s:1:"";s:2:"®";s:1:"";s:2:"©";s:1:"";s:3:"™";s:1:"";s:2:"Ђ";s:1:"";s:2:"ђ";s:1:"";s:3:"≠";s:1:"";s:2:"Ѓ";s:1:"";s:2:"ѓ";s:1:"";s:3:"∞";s:1:"";s:2:"±";s:1:"";s:3:"≤";s:1:"";s:3:"≥";s:1:"";s:2:"і";s:1:"";s:2:"µ";s:1:"";s:3:"∂";s:1:"";s:2:"Ј";s:1:"";s:2:"Є";s:1:"";s:2:"є";s:1:"";s:2:"Ї";s:1:"";s:2:"ї";s:1:"";s:2:"Љ";s:1:"";s:2:"љ";s:1:"";s:2:"Њ";s:1:"";s:2:"њ";s:1:"";s:2:"ј";s:1:"";s:2:"Ѕ";s:1:"";s:2:"¬";s:1:"";s:3:"√";s:1:"";s:2:"ƒ";s:1:"";s:3:"≈";s:1:"";s:3:"∆";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"…";s:1:"";s:2:" ";s:1:"";s:2:"Ћ";s:1:"";s:2:"ћ";s:1:"";s:2:"Ќ";s:1:"";s:2:"ќ";s:1:"";s:2:"ѕ";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:2:"÷";s:1:"";s:3:"„";s:1:"";s:2:"Ў";s:1:"";s:2:"ў";s:1:"";s:2:"Џ";s:1:"";s:2:"џ";s:1:"";s:3:"№";s:1:"";s:2:"Ё";s:1:"";s:2:"ё";s:1:"";s:2:"я";s:1:"";s:2:"а";s:1:"";s:2:"б";s:1:"";s:2:"в";s:1:"";s:2:"г";s:1:"";s:2:"д";s:1:"";s:2:"е";s:1:"";s:2:"ж";s:1:"";s:2:"з";s:1:"";s:2:"и";s:1:"";s:2:"й";s:1:"";s:2:"к";s:1:"";s:2:"л";s:1:"";s:2:"м";s:1:"";s:2:"н";s:1:"";s:2:"о";s:1:"";s:2:"п";s:1:"";s:2:"р";s:1:"";s:2:"с";s:1:"";s:2:"т";s:1:"";s:2:"у";s:1:"";s:2:"ф";s:1:"";s:2:"х";s:1:"";s:2:"ц";s:1:"";s:2:"ч";s:1:"";s:2:"ш";s:1:"";s:2:"щ";s:1:"";s:2:"ъ";s:1:"";s:2:"ы";s:1:"";s:2:"ь";s:1:"";s:2:"э";s:1:"";s:2:"ю";s:1:"";s:2:"¤";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.x-mac-greek.ser
@@ -0,0 +1,3 @@
+a:255:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ä";s:1:"";s:2:"¹";s:1:"";s:2:"²";s:1:"";s:2:"É";s:1:"";s:2:"³";s:1:"";s:2:"Ö";s:1:"";s:2:"Ü";s:1:"";s:2:"΅";s:1:"";s:2:"à";s:1:"";s:2:"â";s:1:"";s:2:"ä";s:1:"";s:2:"΄";s:1:"";s:2:"¨";s:1:"";s:2:"ç";s:1:"";s:2:"é";s:1:"";s:2:"è";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"£";s:1:"";s:3:"™";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:3:"•";s:1:"";s:2:"½";s:1:"";s:3:"‰";s:1:"";s:2:"ô";s:1:"";s:2:"ö";s:1:"";s:2:"¦";s:1:"";s:2:"­";s:1:"";s:2:"ù";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:3:"†";s:1:"";s:2:"Γ";s:1:"";s:2:"Δ";s:1:"";s:2:"Θ";s:1:"";s:2:"Λ";s:1:"";s:2:"Ξ";s:1:"";s:2:"Π";s:1:"";s:2:"ß";s:1:"";s:2:"®";s:1:"";s:2:"©";s:1:"";s:2:"Σ";s:1:"";s:2:"Ϊ";s:1:"";s:2:"§";s:1:"";s:3:"≠";s:1:"";s:2:"°";s:1:"";s:2:"·";s:1:"";s:2:"Α";s:1:"";s:2:"±";s:1:"";s:3:"≤";s:1:"";s:3:"≥";s:1:"";s:2:"¥";s:1:"";s:2:"Β";s:1:"";s:2:"Ε";s:1:"";s:2:"Ζ";s:1:"";s:2:"Η";s:1:"";s:2:"Ι";s:1:"";s:2:"Κ";s:1:"";s:2:"Μ";s:1:"";s:2:"Φ";s:1:"";s:2:"Ϋ";s:1:"";s:2:"Ψ";s:1:"";s:2:"Ω";s:1:"";s:2:"ά";s:1:"";s:2:"Ν";s:1:"";s:2:"¬";s:1:"";s:2:"Ο";s:1:"";s:2:"Ρ";s:1:"";s:3:"≈";s:1:"";s:2:"Τ";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"…";s:1:"";s:2:" ";s:1:"";s:2:"Υ";s:1:"";s:2:"Χ";s:1:"";s:2:"Ά";s:1:"";s:2:"Έ";s:1:"";s:2:"œ";s:1:"";s:3:"–";s:1:"";s:3:"―";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:2:"÷";s:1:"";s:2:"Ή";s:1:"";s:2:"Ί";s:1:"";s:2:"Ό";s:1:"";s:2:"Ύ";s:1:"";s:2:"έ";s:1:"";s:2:"ή";s:1:"";s:2:"ί";s:1:"";s:2:"ό";s:1:"";s:2:"Ώ";s:1:"";s:2:"ύ";s:1:"";s:2:"α";s:1:"";s:2:"β";s:1:"";s:2:"ψ";s:1:"";s:2:"δ";s:1:"";s:2:"ε";s:1:"";s:2:"φ";s:1:"";s:2:"γ";s:1:"";s:2:"η";s:1:"";s:2:"ι";s:1:"";s:2:"ξ";s:1:"";s:2:"κ";s:1:"";s:2:"λ";s:1:"";s:2:"μ";s:1:"";s:2:"ν";s:1:"";s:2:"ο";s:1:"";s:2:"π";s:1:"";s:2:"ώ";s:1:"";s:2:"ρ";s:1:"";s:2:"σ";s:1:"";s:2:"τ";s:1:"";s:2:"θ";s:1:"";s:2:"ω";s:1:"";s:2:"ς";s:1:"";s:2:"χ";s:1:"";s:2:"υ";s:1:"";s:2:"ζ";s:1:"";s:2:"ϊ";s:1:"";s:2:"ϋ";s:1:"";s:2:"ΐ";s:1:"";s:2:"ΰ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.x-mac-icelandic.ser
@@ -0,0 +1,3 @@
+a:255:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Ç";s:1:"";s:2:"É";s:1:"";s:2:"Ñ";s:1:"";s:2:"Ö";s:1:"";s:2:"Ü";s:1:"";s:2:"á";s:1:"";s:2:"à";s:1:"";s:2:"â";s:1:"";s:2:"ä";s:1:"";s:2:"ã";s:1:"";s:2:"å";s:1:"";s:2:"ç";s:1:"";s:2:"é";s:1:"";s:2:"è";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"í";s:1:"";s:2:"ì";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ñ";s:1:"";s:2:"ó";s:1:"";s:2:"ò";s:1:"";s:2:"ô";s:1:"";s:2:"ö";s:1:"";s:2:"õ";s:1:"";s:2:"ú";s:1:"";s:2:"ù";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"Ý";s:1:"";s:2:"°";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"§";s:1:"";s:3:"•";s:1:"";s:2:"¶";s:1:"";s:2:"ß";s:1:"";s:2:"®";s:1:"";s:2:"©";s:1:"";s:3:"™";s:1:"";s:2:"´";s:1:"";s:2:"¨";s:1:"";s:3:"≠";s:1:"";s:2:"Æ";s:1:"";s:2:"Ø";s:1:"";s:3:"∞";s:1:"";s:2:"±";s:1:"";s:3:"≤";s:1:"";s:3:"≥";s:1:"";s:2:"¥";s:1:"";s:2:"µ";s:1:"";s:3:"∂";s:1:"";s:3:"∑";s:1:"";s:3:"∏";s:1:"";s:2:"π";s:1:"";s:3:"∫";s:1:"";s:2:"ª";s:1:"";s:2:"º";s:1:"";s:3:"Ω";s:1:"";s:2:"æ";s:1:"";s:2:"ø";s:1:"";s:2:"¿";s:1:"";s:2:"¡";s:1:"";s:2:"¬";s:1:"";s:3:"√";s:1:"";s:2:"ƒ";s:1:"";s:3:"≈";s:1:"";s:3:"∆";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"…";s:1:"";s:2:" ";s:1:"";s:2:"À";s:1:"";s:2:"Ã";s:1:"";s:2:"Õ";s:1:"";s:2:"Œ";s:1:"";s:2:"œ";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:2:"÷";s:1:"";s:3:"◊";s:1:"";s:2:"ÿ";s:1:"";s:2:"Ÿ";s:1:"";s:3:"⁄";s:1:"";s:2:"¤";s:1:"";s:2:"Ð";s:1:"";s:2:"ð";s:1:"";s:2:"Þ";s:1:"";s:2:"þ";s:1:"";s:2:"ý";s:1:"";s:2:"·";s:1:"";s:3:"‚";s:1:"";s:3:"„";s:1:"";s:3:"‰";s:1:"";s:2:"Â";s:1:"";s:2:"Ê";s:1:"";s:2:"Á";s:1:"";s:2:"Ë";s:1:"";s:2:"È";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Ì";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Ò";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ù";s:1:"";s:2:"ı";s:1:"";s:2:"ˆ";s:1:"";s:2:"˜";s:1:"";s:2:"¯";s:1:"";s:2:"˘";s:1:"";s:2:"˙";s:1:"";s:2:"˚";s:1:"";s:2:"¸";s:1:"";s:2:"˝";s:1:"";s:2:"˛";s:1:"";s:2:"ˇ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.x-mac-roman.ser
@@ -0,0 +1,3 @@
+a:255:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Ç";s:1:"";s:2:"É";s:1:"";s:2:"Ñ";s:1:"";s:2:"Ö";s:1:"";s:2:"Ü";s:1:"";s:2:"á";s:1:"";s:2:"à";s:1:"";s:2:"â";s:1:"";s:2:"ä";s:1:"";s:2:"ã";s:1:"";s:2:"å";s:1:"";s:2:"ç";s:1:"";s:2:"é";s:1:"";s:2:"è";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"í";s:1:"";s:2:"ì";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ñ";s:1:"";s:2:"ó";s:1:"";s:2:"ò";s:1:"";s:2:"ô";s:1:"";s:2:"ö";s:1:"";s:2:"õ";s:1:"";s:2:"ú";s:1:"";s:2:"ù";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:3:"†";s:1:"";s:2:"°";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"§";s:1:"";s:3:"•";s:1:"";s:2:"¶";s:1:"";s:2:"ß";s:1:"";s:2:"®";s:1:"";s:2:"©";s:1:"";s:3:"™";s:1:"";s:2:"´";s:1:"";s:2:"¨";s:1:"";s:3:"≠";s:1:"";s:2:"Æ";s:1:"";s:2:"Ø";s:1:"";s:3:"∞";s:1:"";s:2:"±";s:1:"";s:3:"≤";s:1:"";s:3:"≥";s:1:"";s:2:"¥";s:1:"";s:2:"µ";s:1:"";s:3:"∂";s:1:"";s:3:"∑";s:1:"";s:3:"∏";s:1:"";s:2:"π";s:1:"";s:3:"∫";s:1:"";s:2:"ª";s:1:"";s:2:"º";s:1:"";s:3:"Ω";s:1:"";s:2:"æ";s:1:"";s:2:"ø";s:1:"";s:2:"¿";s:1:"";s:2:"¡";s:1:"";s:2:"¬";s:1:"";s:3:"√";s:1:"";s:2:"ƒ";s:1:"";s:3:"≈";s:1:"";s:3:"∆";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"…";s:1:"";s:2:" ";s:1:"";s:2:"À";s:1:"";s:2:"Ã";s:1:"";s:2:"Õ";s:1:"";s:2:"Œ";s:1:"";s:2:"œ";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:2:"÷";s:1:"";s:3:"◊";s:1:"";s:2:"ÿ";s:1:"";s:2:"Ÿ";s:1:"";s:3:"⁄";s:1:"";s:2:"¤";s:1:"";s:3:"‹";s:1:"";s:3:"›";s:1:"";s:3:"ﬁ";s:1:"";s:3:"ﬂ";s:1:"";s:3:"‡";s:1:"";s:2:"·";s:1:"";s:3:"‚";s:1:"";s:3:"„";s:1:"";s:3:"‰";s:1:"";s:2:"Â";s:1:"";s:2:"Ê";s:1:"";s:2:"Á";s:1:"";s:2:"Ë";s:1:"";s:2:"È";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Ì";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Ò";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ù";s:1:"";s:2:"ı";s:1:"";s:2:"ˆ";s:1:"";s:2:"˜";s:1:"";s:2:"¯";s:1:"";s:2:"˘";s:1:"";s:2:"˙";s:1:"";s:2:"˚";s:1:"";s:2:"¸";s:1:"";s:2:"˝";s:1:"";s:2:"˛";s:1:"";s:2:"ˇ";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/from.zdingbat.ser
@@ -0,0 +1 @@
+a:202:{s:1:" ";s:1:" ";s:1:"!";s:3:"✁";s:1:""";s:3:"✂";s:1:"#";s:3:"✃";s:1:"$";s:3:"✄";s:1:"%";s:3:"☎";s:1:"&";s:3:"✆";s:1:"'";s:3:"✇";s:1:"(";s:3:"✈";s:1:")";s:3:"✉";s:1:"*";s:3:"☛";s:1:"+";s:3:"☞";s:1:",";s:3:"✌";s:1:"-";s:3:"✍";s:1:".";s:3:"✎";s:1:"/";s:3:"✏";i:0;s:3:"✐";i:1;s:3:"✑";i:2;s:3:"✒";i:3;s:3:"✓";i:4;s:3:"✔";i:5;s:3:"✕";i:6;s:3:"✖";i:7;s:3:"✗";i:8;s:3:"✘";i:9;s:3:"✙";s:1:":";s:3:"✚";s:1:";";s:3:"✛";s:1:"<";s:3:"✜";s:1:"=";s:3:"✝";s:1:">";s:3:"✞";s:1:"?";s:3:"✟";s:1:"@";s:3:"✠";s:1:"A";s:3:"✡";s:1:"B";s:3:"✢";s:1:"C";s:3:"✣";s:1:"D";s:3:"✤";s:1:"E";s:3:"✥";s:1:"F";s:3:"✦";s:1:"G";s:3:"✧";s:1:"H";s:3:"★";s:1:"I";s:3:"✩";s:1:"J";s:3:"✪";s:1:"K";s:3:"✫";s:1:"L";s:3:"✬";s:1:"M";s:3:"✭";s:1:"N";s:3:"✮";s:1:"O";s:3:"✯";s:1:"P";s:3:"✰";s:1:"Q";s:3:"✱";s:1:"R";s:3:"✲";s:1:"S";s:3:"✳";s:1:"T";s:3:"✴";s:1:"U";s:3:"✵";s:1:"V";s:3:"✶";s:1:"W";s:3:"✷";s:1:"X";s:3:"✸";s:1:"Y";s:3:"✹";s:1:"Z";s:3:"✺";s:1:"[";s:3:"✻";s:1:"\";s:3:"✼";s:1:"]";s:3:"✽";s:1:"^";s:3:"✾";s:1:"_";s:3:"✿";s:1:"`";s:3:"❀";s:1:"a";s:3:"❁";s:1:"b";s:3:"❂";s:1:"c";s:3:"❃";s:1:"d";s:3:"❄";s:1:"e";s:3:"❅";s:1:"f";s:3:"❆";s:1:"g";s:3:"❇";s:1:"h";s:3:"❈";s:1:"i";s:3:"❉";s:1:"j";s:3:"❊";s:1:"k";s:3:"❋";s:1:"l";s:3:"●";s:1:"m";s:3:"❍";s:1:"n";s:3:"■";s:1:"o";s:3:"❏";s:1:"p";s:3:"❐";s:1:"q";s:3:"❑";s:1:"r";s:3:"❒";s:1:"s";s:3:"▲";s:1:"t";s:3:"▼";s:1:"u";s:3:"◆";s:1:"v";s:3:"❖";s:1:"w";s:3:"◗";s:1:"x";s:3:"❘";s:1:"y";s:3:"❙";s:1:"z";s:3:"❚";s:1:"{";s:3:"❛";s:1:"|";s:3:"❜";s:1:"}";s:3:"❝";s:1:"~";s:3:"❞";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"❡";s:1:"";s:3:"❢";s:1:"";s:3:"❣";s:1:"";s:3:"❤";s:1:"";s:3:"❥";s:1:"";s:3:"❦";s:1:"";s:3:"❧";s:1:"";s:3:"♣";s:1:"";s:3:"♦";s:1:"";s:3:"♥";s:1:"";s:3:"♠";s:1:"";s:3:"①";s:1:"";s:3:"②";s:1:"";s:3:"③";s:1:"";s:3:"④";s:1:"";s:3:"⑤";s:1:"";s:3:"⑥";s:1:"";s:3:"⑦";s:1:"";s:3:"⑧";s:1:"";s:3:"⑨";s:1:"";s:3:"⑩";s:1:"";s:3:"❶";s:1:"";s:3:"❷";s:1:"";s:3:"❸";s:1:"";s:3:"❹";s:1:"";s:3:"❺";s:1:"";s:3:"❻";s:1:"";s:3:"❼";s:1:"";s:3:"❽";s:1:"";s:3:"❾";s:1:"";s:3:"❿";s:1:"";s:3:"➀";s:1:"";s:3:"➁";s:1:"";s:3:"➂";s:1:"";s:3:"➃";s:1:"";s:3:"➄";s:1:"";s:3:"➅";s:1:"";s:3:"➆";s:1:"";s:3:"➇";s:1:"";s:3:"➈";s:1:"";s:3:"➉";s:1:"";s:3:"➊";s:1:"";s:3:"➋";s:1:"";s:3:"➌";s:1:"";s:3:"➍";s:1:"";s:3:"➎";s:1:"";s:3:"➏";s:1:"";s:3:"➐";s:1:"";s:3:"➑";s:1:"";s:3:"➒";s:1:"";s:3:"➓";s:1:"";s:3:"➔";s:1:"";s:3:"→";s:1:"";s:3:"↔";s:1:"";s:3:"↕";s:1:"";s:3:"➘";s:1:"";s:3:"➙";s:1:"";s:3:"➚";s:1:"";s:3:"➛";s:1:"";s:3:"➜";s:1:"";s:3:"➝";s:1:"";s:3:"➞";s:1:"";s:3:"➟";s:1:"";s:3:"➠";s:1:"";s:3:"➡";s:1:"";s:3:"➢";s:1:"";s:3:"➣";s:1:"";s:3:"➤";s:1:"";s:3:"➥";s:1:"";s:3:"➦";s:1:"";s:3:"➧";s:1:"";s:3:"➨";s:1:"";s:3:"➩";s:1:"";s:3:"➪";s:1:"";s:3:"➫";s:1:"";s:3:"➬";s:1:"";s:3:"➭";s:1:"";s:3:"➮";s:1:"";s:3:"➯";s:1:"";s:3:"➱";s:1:"";s:3:"➲";s:1:"";s:3:"➳";s:1:"";s:3:"➴";s:1:"";s:3:"➵";s:1:"";s:3:"➶";s:1:"";s:3:"➷";s:1:"";s:3:"➸";s:1:"";s:3:"➹";s:1:"";s:3:"➺";s:1:"";s:3:"➻";s:1:"";s:3:"➼";s:1:"";s:3:"➽";s:1:"";s:3:"➾";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/to.gsm0338.ser
@@ -0,0 +1,4 @@
+a:154:{s:1:" ";s:1:" ";s:2:"Ç";s:1:"	";s:2:"Α";s:1:"A";s:2:"Β";s:1:"B";s:2:"Ε";s:1:"E";s:2:"Η";s:1:"H";s:2:"Ι";s:1:"I";s:2:"Κ";s:1:"K";s:2:"Μ";s:1:"M";s:2:"Ν";s:1:"N";s:2:"Ο";s:1:"O";s:2:"Ρ";s:1:"P";s:2:"Τ";s:1:"T";s:2:"Υ";s:1:"U";s:2:"Χ";s:1:"X";s:2:"Ζ";s:1:"Z";s:1:"@";s:1:" ";s:2:"£";s:1:"";s:1:"$";s:1:"";s:2:"¥";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ù";s:1:"";s:2:"ì";s:1:"";s:2:"ò";s:1:"";s:2:"ç";s:1:"	";s:1:"
+";s:1:"
+";s:2:"Ø";s:1:"";s:2:"ø";s:1:"";s:1:"
";s:1:"
";s:2:"Å";s:1:"";s:2:"å";s:1:"";s:2:"Δ";s:1:"";s:1:"_";s:1:"";s:2:"Φ";s:1:"";s:2:"Γ";s:1:"";s:2:"Λ";s:1:"";s:2:"Ω";s:1:"";s:2:"Π";s:1:"";s:2:"Ψ";s:1:"";s:2:"Σ";s:1:"";s:2:"Θ";s:1:"";s:2:"Ξ";s:1:"";s:2:" ";s:1:"";s:1:"";s:2:"
+";s:1:"^";s:2:"";s:1:"{";s:2:"(";s:1:"}";s:2:")";s:1:"\";s:2:"/";s:1:"[";s:2:"<";s:1:"~";s:2:"=";s:1:"]";s:2:">";s:1:"|";s:2:"@";s:3:"€";s:2:"e";s:2:"Æ";s:1:"";s:2:"æ";s:1:"";s:2:"ß";s:1:"";s:2:"É";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:2:"¤";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;i:7;i:8;i:8;i:9;i:9;s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:2:"¡";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:2:"Ä";s:1:"[";s:2:"Ö";s:1:"\";s:2:"Ñ";s:1:"]";s:2:"Ü";s:1:"^";s:2:"§";s:1:"_";s:2:"¿";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:2:"ä";s:1:"{";s:2:"ö";s:1:"|";s:2:"ñ";s:1:"}";s:2:"ü";s:1:"~";s:2:"à";s:1:"";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/to.mazovia.ser
@@ -0,0 +1,3 @@
+a:257:{s:3:"›";s:1:"";s:1:"z";s:1:"";s:3:"zł";s:1:"";s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;i:7;i:8;i:8;i:9;i:9;s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:"Ç";s:1:"";s:2:"ü";s:1:"";s:2:"é";s:1:"";s:2:"â";s:1:"";s:2:"ä";s:1:"";s:2:"à";s:1:"";s:2:"ą";s:1:"";s:2:"ç";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"è";s:1:"";s:2:"ï";s:1:"";s:2:"î";s:1:"";s:2:"ć";s:1:"";s:2:"Ä";s:1:"";s:2:"Ą";s:1:"";s:2:"Ę";s:1:"";s:2:"ę";s:1:"";s:2:"ł";s:1:"";s:2:"ô";s:1:"";s:2:"ö";s:1:"";s:2:"Ć";s:1:"";s:2:"û";s:1:"";s:2:"ù";s:1:"";s:2:"Ś";s:1:"";s:2:"Ö";s:1:"";s:2:"Ü";s:1:"";s:2:"Ł";s:1:"";s:2:"¥";s:1:"";s:2:"ś";s:1:"";s:2:"ƒ";s:1:"";s:2:"Ź";s:1:"";s:2:"Ż";s:1:"";s:2:"ó";s:1:"";s:2:"Ó";s:1:"";s:2:"ń";s:1:"";s:2:"Ń";s:1:"";s:2:"ź";s:1:"";s:2:"ż";s:1:"";s:2:"¿";s:1:"";s:3:"⌐";s:1:"";s:2:"¬";s:1:"";s:2:"½";s:1:"";s:2:"¼";s:1:"";s:2:"¡";s:1:"";s:2:"«";s:1:"";s:2:"»";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"│";s:1:"";s:3:"┤";s:1:"";s:3:"╡";s:1:"";s:3:"╢";s:1:"";s:3:"╖";s:1:"";s:3:"╕";s:1:"";s:3:"╣";s:1:"";s:3:"║";s:1:"";s:3:"╗";s:1:"";s:3:"╝";s:1:"";s:3:"╜";s:1:"";s:3:"╛";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┴";s:1:"";s:3:"┬";s:1:"";s:3:"├";s:1:"";s:3:"─";s:1:"";s:3:"┼";s:1:"";s:3:"╞";s:1:"";s:3:"╟";s:1:"";s:3:"╚";s:1:"";s:3:"╔";s:1:"";s:3:"╩";s:1:"";s:3:"╦";s:1:"";s:3:"╠";s:1:"";s:3:"═";s:1:"";s:3:"╬";s:1:"";s:3:"╧";s:1:"";s:3:"╨";s:1:"";s:3:"╤";s:1:"";s:3:"╥";s:1:"";s:3:"╙";s:1:"";s:3:"╘";s:1:"";s:3:"╒";s:1:"";s:3:"╓";s:1:"";s:3:"╫";s:1:"";s:3:"╪";s:1:"";s:3:"┘";s:1:"";s:3:"┌";s:1:"";s:3:"█";s:1:"";s:3:"▄";s:1:"";s:3:"▌";s:1:"";s:3:"▐";s:1:"";s:3:"▀";s:1:"";s:2:"α";s:1:"";s:2:"ß";s:1:"";s:2:"Γ";s:1:"";s:2:"π";s:1:"";s:2:"Σ";s:1:"";s:2:"σ";s:1:"";s:2:"µ";s:1:"";s:2:"τ";s:1:"";s:2:"Φ";s:1:"";s:2:"Θ";s:1:"";s:2:"Ω";s:1:"";s:2:"δ";s:1:"";s:3:"∞";s:1:"";s:2:"φ";s:1:"";s:2:"ε";s:1:"";s:3:"∩";s:1:"";s:3:"≡";s:1:"";s:2:"±";s:1:"";s:3:"≥";s:1:"";s:3:"≤";s:1:"";s:3:"⌠";s:1:"";s:3:"⌡";s:1:"";s:2:"÷";s:1:"";s:3:"≈";s:1:"";s:2:"°";s:1:"";s:3:"∙";s:1:"";s:2:"·";s:1:"";s:3:"√";s:1:"";s:3:"ⁿ";s:1:"";s:2:"²";s:1:"";s:3:"■";s:1:"";s:2:" ";s:1:"";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/to.stdenc.ser
@@ -0,0 +1 @@
+a:154:{s:2:" ";s:1:" ";s:2:"­";s:1:"-";s:3:"∕";s:1:"";s:3:"∙";s:1:"";s:2:"ˉ";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:3:"’";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;i:7;i:8;i:8;i:9;i:9;s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:3:"‘";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:2:"¡";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:3:"⁄";s:1:"";s:2:"¥";s:1:"";s:2:"ƒ";s:1:"";s:2:"§";s:1:"";s:2:"¤";s:1:"";s:1:"'";s:1:"";s:3:"“";s:1:"";s:2:"«";s:1:"";s:3:"‹";s:1:"";s:3:"›";s:1:"";s:3:"ﬁ";s:1:"";s:3:"ﬂ";s:1:"";s:3:"–";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:2:"·";s:1:"";s:2:"¶";s:1:"";s:3:"•";s:1:"";s:3:"‚";s:1:"";s:3:"„";s:1:"";s:3:"”";s:1:"";s:2:"»";s:1:"";s:3:"…";s:1:"";s:3:"‰";s:1:"";s:2:"¿";s:1:"";s:1:"`";s:1:"";s:2:"´";s:1:"";s:2:"ˆ";s:1:"";s:2:"˜";s:1:"";s:2:"¯";s:1:"";s:2:"˘";s:1:"";s:2:"˙";s:1:"";s:2:"¨";s:1:"";s:2:"˚";s:1:"";s:2:"¸";s:1:"";s:2:"˝";s:1:"";s:2:"˛";s:1:"";s:2:"ˇ";s:1:"";s:3:"—";s:1:"";s:2:"Æ";s:1:"";s:2:"ª";s:1:"";s:2:"Ł";s:1:"";s:2:"Ø";s:1:"";s:2:"Œ";s:1:"";s:2:"º";s:1:"";s:2:"æ";s:1:"";s:2:"ı";s:1:"";s:2:"ł";s:1:"";s:2:"ø";s:1:"";s:2:"œ";s:1:"";s:2:"ß";s:1:"";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/to.symbol.ser
@@ -0,0 +1 @@
+a:194:{s:2:" ";s:1:" ";s:3:"∆";s:1:"D";s:3:"Ω";s:1:"W";s:2:"μ";s:1:"m";s:3:"∕";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:3:"∀";s:1:""";s:1:"#";s:1:"#";s:3:"∃";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:3:"∋";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:3:"∗";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:3:"−";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;i:7;i:8;i:8;i:9;i:9;s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:3:"≅";s:1:"@";s:2:"Α";s:1:"A";s:2:"Β";s:1:"B";s:2:"Χ";s:1:"C";s:2:"Δ";s:1:"D";s:2:"Ε";s:1:"E";s:2:"Φ";s:1:"F";s:2:"Γ";s:1:"G";s:2:"Η";s:1:"H";s:2:"Ι";s:1:"I";s:2:"ϑ";s:1:"J";s:2:"Κ";s:1:"K";s:2:"Λ";s:1:"L";s:2:"Μ";s:1:"M";s:2:"Ν";s:1:"N";s:2:"Ο";s:1:"O";s:2:"Π";s:1:"P";s:2:"Θ";s:1:"Q";s:2:"Ρ";s:1:"R";s:2:"Σ";s:1:"S";s:2:"Τ";s:1:"T";s:2:"Υ";s:1:"U";s:2:"ς";s:1:"V";s:2:"Ω";s:1:"W";s:2:"Ξ";s:1:"X";s:2:"Ψ";s:1:"Y";s:2:"Ζ";s:1:"Z";s:1:"[";s:1:"[";s:3:"∴";s:1:"\";s:1:"]";s:1:"]";s:3:"⊥";s:1:"^";s:1:"_";s:1:"_";s:3:"";s:1:"`";s:2:"α";s:1:"a";s:2:"β";s:1:"b";s:2:"χ";s:1:"c";s:2:"δ";s:1:"d";s:2:"ε";s:1:"e";s:2:"φ";s:1:"f";s:2:"γ";s:1:"g";s:2:"η";s:1:"h";s:2:"ι";s:1:"i";s:2:"ϕ";s:1:"j";s:2:"κ";s:1:"k";s:2:"λ";s:1:"l";s:2:"µ";s:1:"m";s:2:"ν";s:1:"n";s:2:"ο";s:1:"o";s:2:"π";s:1:"p";s:2:"θ";s:1:"q";s:2:"ρ";s:1:"r";s:2:"σ";s:1:"s";s:2:"τ";s:1:"t";s:2:"υ";s:1:"u";s:2:"ϖ";s:1:"v";s:2:"ω";s:1:"w";s:2:"ξ";s:1:"x";s:2:"ψ";s:1:"y";s:2:"ζ";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:3:"∼";s:1:"~";s:3:"€";s:1:"";s:2:"ϒ";s:1:"";s:3:"′";s:1:"";s:3:"≤";s:1:"";s:3:"⁄";s:1:"";s:3:"∞";s:1:"";s:2:"ƒ";s:1:"";s:3:"♣";s:1:"";s:3:"♦";s:1:"";s:3:"♥";s:1:"";s:3:"♠";s:1:"";s:3:"↔";s:1:"";s:3:"←";s:1:"";s:3:"↑";s:1:"";s:3:"→";s:1:"";s:3:"↓";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:3:"″";s:1:"";s:3:"≥";s:1:"";s:2:"×";s:1:"";s:3:"∝";s:1:"";s:3:"∂";s:1:"";s:3:"•";s:1:"";s:2:"÷";s:1:"";s:3:"≠";s:1:"";s:3:"≡";s:1:"";s:3:"≈";s:1:"";s:3:"…";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"↵";s:1:"";s:3:"ℵ";s:1:"";s:3:"ℑ";s:1:"";s:3:"ℜ";s:1:"";s:3:"℘";s:1:"";s:3:"⊗";s:1:"";s:3:"⊕";s:1:"";s:3:"∅";s:1:"";s:3:"∩";s:1:"";s:3:"∪";s:1:"";s:3:"⊃";s:1:"";s:3:"⊇";s:1:"";s:3:"⊄";s:1:"";s:3:"⊂";s:1:"";s:3:"⊆";s:1:"";s:3:"∈";s:1:"";s:3:"∉";s:1:"";s:3:"∠";s:1:"";s:3:"∇";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"∏";s:1:"";s:3:"√";s:1:"";s:3:"⋅";s:1:"";s:2:"¬";s:1:"";s:3:"∧";s:1:"";s:3:"∨";s:1:"";s:3:"⇔";s:1:"";s:3:"⇐";s:1:"";s:3:"⇑";s:1:"";s:3:"⇒";s:1:"";s:3:"⇓";s:1:"";s:3:"◊";s:1:"";s:3:"〈";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"∑";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"〉";s:1:"";s:3:"∫";s:1:"";s:3:"⌠";s:1:"";s:3:"";s:1:"";s:3:"⌡";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/to.zdingbat.ser
@@ -0,0 +1 @@
+a:203:{s:2:" ";s:1:" ";s:1:" ";s:1:" ";s:3:"✁";s:1:"!";s:3:"✂";s:1:""";s:3:"✃";s:1:"#";s:3:"✄";s:1:"$";s:3:"☎";s:1:"%";s:3:"✆";s:1:"&";s:3:"✇";s:1:"'";s:3:"✈";s:1:"(";s:3:"✉";s:1:")";s:3:"☛";s:1:"*";s:3:"☞";s:1:"+";s:3:"✌";s:1:",";s:3:"✍";s:1:"-";s:3:"✎";s:1:".";s:3:"✏";s:1:"/";s:3:"✐";i:0;s:3:"✑";i:1;s:3:"✒";i:2;s:3:"✓";i:3;s:3:"✔";i:4;s:3:"✕";i:5;s:3:"✖";i:6;s:3:"✗";i:7;s:3:"✘";i:8;s:3:"✙";i:9;s:3:"✚";s:1:":";s:3:"✛";s:1:";";s:3:"✜";s:1:"<";s:3:"✝";s:1:"=";s:3:"✞";s:1:">";s:3:"✟";s:1:"?";s:3:"✠";s:1:"@";s:3:"✡";s:1:"A";s:3:"✢";s:1:"B";s:3:"✣";s:1:"C";s:3:"✤";s:1:"D";s:3:"✥";s:1:"E";s:3:"✦";s:1:"F";s:3:"✧";s:1:"G";s:3:"★";s:1:"H";s:3:"✩";s:1:"I";s:3:"✪";s:1:"J";s:3:"✫";s:1:"K";s:3:"✬";s:1:"L";s:3:"✭";s:1:"M";s:3:"✮";s:1:"N";s:3:"✯";s:1:"O";s:3:"✰";s:1:"P";s:3:"✱";s:1:"Q";s:3:"✲";s:1:"R";s:3:"✳";s:1:"S";s:3:"✴";s:1:"T";s:3:"✵";s:1:"U";s:3:"✶";s:1:"V";s:3:"✷";s:1:"W";s:3:"✸";s:1:"X";s:3:"✹";s:1:"Y";s:3:"✺";s:1:"Z";s:3:"✻";s:1:"[";s:3:"✼";s:1:"\";s:3:"✽";s:1:"]";s:3:"✾";s:1:"^";s:3:"✿";s:1:"_";s:3:"❀";s:1:"`";s:3:"❁";s:1:"a";s:3:"❂";s:1:"b";s:3:"❃";s:1:"c";s:3:"❄";s:1:"d";s:3:"❅";s:1:"e";s:3:"❆";s:1:"f";s:3:"❇";s:1:"g";s:3:"❈";s:1:"h";s:3:"❉";s:1:"i";s:3:"❊";s:1:"j";s:3:"❋";s:1:"k";s:3:"●";s:1:"l";s:3:"❍";s:1:"m";s:3:"■";s:1:"n";s:3:"❏";s:1:"o";s:3:"❐";s:1:"p";s:3:"❑";s:1:"q";s:3:"❒";s:1:"r";s:3:"▲";s:1:"s";s:3:"▼";s:1:"t";s:3:"◆";s:1:"u";s:3:"❖";s:1:"v";s:3:"◗";s:1:"w";s:3:"❘";s:1:"x";s:3:"❙";s:1:"y";s:3:"❚";s:1:"z";s:3:"❛";s:1:"{";s:3:"❜";s:1:"|";s:3:"❝";s:1:"}";s:3:"❞";s:1:"~";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"❡";s:1:"";s:3:"❢";s:1:"";s:3:"❣";s:1:"";s:3:"❤";s:1:"";s:3:"❥";s:1:"";s:3:"❦";s:1:"";s:3:"❧";s:1:"";s:3:"♣";s:1:"";s:3:"♦";s:1:"";s:3:"♥";s:1:"";s:3:"♠";s:1:"";s:3:"①";s:1:"";s:3:"②";s:1:"";s:3:"③";s:1:"";s:3:"④";s:1:"";s:3:"⑤";s:1:"";s:3:"⑥";s:1:"";s:3:"⑦";s:1:"";s:3:"⑧";s:1:"";s:3:"⑨";s:1:"";s:3:"⑩";s:1:"";s:3:"❶";s:1:"";s:3:"❷";s:1:"";s:3:"❸";s:1:"";s:3:"❹";s:1:"";s:3:"❺";s:1:"";s:3:"❻";s:1:"";s:3:"❼";s:1:"";s:3:"❽";s:1:"";s:3:"❾";s:1:"";s:3:"❿";s:1:"";s:3:"➀";s:1:"";s:3:"➁";s:1:"";s:3:"➂";s:1:"";s:3:"➃";s:1:"";s:3:"➄";s:1:"";s:3:"➅";s:1:"";s:3:"➆";s:1:"";s:3:"➇";s:1:"";s:3:"➈";s:1:"";s:3:"➉";s:1:"";s:3:"➊";s:1:"";s:3:"➋";s:1:"";s:3:"➌";s:1:"";s:3:"➍";s:1:"";s:3:"➎";s:1:"";s:3:"➏";s:1:"";s:3:"➐";s:1:"";s:3:"➑";s:1:"";s:3:"➒";s:1:"";s:3:"➓";s:1:"";s:3:"➔";s:1:"";s:3:"→";s:1:"";s:3:"↔";s:1:"";s:3:"↕";s:1:"";s:3:"➘";s:1:"";s:3:"➙";s:1:"";s:3:"➚";s:1:"";s:3:"➛";s:1:"";s:3:"➜";s:1:"";s:3:"➝";s:1:"";s:3:"➞";s:1:"";s:3:"➟";s:1:"";s:3:"➠";s:1:"";s:3:"➡";s:1:"";s:3:"➢";s:1:"";s:3:"➣";s:1:"";s:3:"➤";s:1:"";s:3:"➥";s:1:"";s:3:"➦";s:1:"";s:3:"➧";s:1:"";s:3:"➨";s:1:"";s:3:"➩";s:1:"";s:3:"➪";s:1:"";s:3:"➫";s:1:"";s:3:"➬";s:1:"";s:3:"➭";s:1:"";s:3:"➮";s:1:"";s:3:"➯";s:1:"";s:3:"➱";s:1:"";s:3:"➲";s:1:"";s:3:"➳";s:1:"";s:3:"➴";s:1:"";s:3:"➵";s:1:"";s:3:"➶";s:1:"";s:3:"➷";s:1:"";s:3:"➸";s:1:"";s:3:"➹";s:1:"";s:3:"➺";s:1:"";s:3:"➻";s:1:"";s:3:"➼";s:1:"";s:3:"➽";s:1:"";s:3:"➾";s:1:"";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/charset/translit.ser
@@ -0,0 +1 @@
+a:3960:{s:2:"µ";s:2:"μ";s:2:"¼";s:7:" 1⁄4 ";s:2:"½";s:7:" 1⁄2 ";s:2:"¾";s:7:" 3⁄4 ";s:2:"Ĳ";s:2:"IJ";s:2:"ĳ";s:2:"ij";s:2:"Ŀ";s:3:"L·";s:2:"ŀ";s:3:"l·";s:2:"ŉ";s:3:"ʼn";s:2:"ſ";s:1:"s";s:2:"Ǆ";s:3:"DŽ";s:2:"ǅ";s:3:"Dž";s:2:"ǆ";s:3:"dž";s:2:"Ǉ";s:2:"LJ";s:2:"ǈ";s:2:"Lj";s:2:"ǉ";s:2:"lj";s:2:"Ǌ";s:2:"NJ";s:2:"ǋ";s:2:"Nj";s:2:"ǌ";s:2:"nj";s:2:"Ǳ";s:2:"DZ";s:2:"ǲ";s:2:"Dz";s:2:"ǳ";s:2:"dz";s:2:"ϐ";s:2:"β";s:2:"ϑ";s:2:"θ";s:2:"ϒ";s:2:"Υ";s:2:"ϕ";s:2:"φ";s:2:"ϖ";s:2:"π";s:2:"ϰ";s:2:"κ";s:2:"ϱ";s:2:"ρ";s:2:"ϲ";s:2:"ς";s:2:"ϴ";s:2:"Θ";s:2:"ϵ";s:2:"ε";s:2:"Ϲ";s:2:"Σ";s:2:"և";s:4:"եւ";s:2:"ٵ";s:4:"اٴ";s:2:"ٶ";s:4:"وٴ";s:2:"ٷ";s:4:"ۇٴ";s:2:"ٸ";s:4:"يٴ";s:3:"ำ";s:6:"ํา";s:3:"ຳ";s:6:"ໍາ";s:3:"ໜ";s:6:"ຫນ";s:3:"ໝ";s:6:"ຫມ";s:3:"ཷ";s:6:"ྲཱྀ";s:3:"ཹ";s:6:"ླཱྀ";s:3:"ẚ";s:3:"aʾ";s:3:"․";s:1:".";s:3:"‥";s:2:"..";s:3:"…";s:3:"...";s:3:"″";s:6:"′′";s:3:"‴";s:9:"′′′";s:3:"‶";s:6:"‵‵";s:3:"‷";s:9:"‵‵‵";s:3:"‼";s:2:"!!";s:3:"⁇";s:2:"??";s:3:"⁈";s:2:"?!";s:3:"⁉";s:2:"!?";s:3:"⁗";s:12:"′′′′";s:3:"₨";s:2:"Rs";s:3:"℀";s:3:"a/c";s:3:"℁";s:3:"a/s";s:3:"ℂ";s:1:"C";s:3:"℃";s:3:"°C";s:3:"℅";s:3:"c/o";s:3:"℆";s:3:"c/u";s:3:"ℇ";s:2:"Ɛ";s:3:"℉";s:3:"°F";s:3:"ℊ";s:1:"g";s:3:"ℋ";s:1:"H";s:3:"ℌ";s:1:"H";s:3:"ℍ";s:1:"H";s:3:"ℎ";s:1:"h";s:3:"ℏ";s:2:"ħ";s:3:"ℐ";s:1:"I";s:3:"ℑ";s:1:"I";s:3:"ℒ";s:1:"L";s:3:"ℓ";s:1:"l";s:3:"ℕ";s:1:"N";s:3:"№";s:2:"No";s:3:"ℙ";s:1:"P";s:3:"ℚ";s:1:"Q";s:3:"ℛ";s:1:"R";s:3:"ℜ";s:1:"R";s:3:"ℝ";s:1:"R";s:3:"℡";s:3:"TEL";s:3:"ℤ";s:1:"Z";s:3:"ℨ";s:1:"Z";s:3:"ℬ";s:1:"B";s:3:"ℭ";s:1:"C";s:3:"ℯ";s:1:"e";s:3:"ℰ";s:1:"E";s:3:"ℱ";s:1:"F";s:3:"ℳ";s:1:"M";s:3:"ℴ";s:1:"o";s:3:"ℵ";s:2:"א";s:3:"ℶ";s:2:"ב";s:3:"ℷ";s:2:"ג";s:3:"ℸ";s:2:"ד";s:3:"ℹ";s:1:"i";s:3:"℻";s:3:"FAX";s:3:"ℼ";s:2:"π";s:3:"ℽ";s:2:"γ";s:3:"ℾ";s:2:"Γ";s:3:"ℿ";s:2:"Π";s:3:"⅀";s:3:"∑";s:3:"ⅅ";s:1:"D";s:3:"ⅆ";s:1:"d";s:3:"ⅇ";s:1:"e";s:3:"ⅈ";s:1:"i";s:3:"ⅉ";s:1:"j";s:3:"⅐";s:7:" 1⁄7 ";s:3:"⅑";s:7:" 1⁄9 ";s:3:"⅒";s:8:" 1⁄10 ";s:3:"⅓";s:7:" 1⁄3 ";s:3:"⅔";s:7:" 2⁄3 ";s:3:"⅕";s:7:" 1⁄5 ";s:3:"⅖";s:7:" 2⁄5 ";s:3:"⅗";s:7:" 3⁄5 ";s:3:"⅘";s:7:" 4⁄5 ";s:3:"⅙";s:7:" 1⁄6 ";s:3:"⅚";s:7:" 5⁄6 ";s:3:"⅛";s:7:" 1⁄8 ";s:3:"⅜";s:7:" 3⁄8 ";s:3:"⅝";s:7:" 5⁄8 ";s:3:"⅞";s:7:" 7⁄8 ";s:3:"⅟";s:6:" 1⁄ ";s:3:"Ⅰ";s:1:"I";s:3:"Ⅱ";s:2:"II";s:3:"Ⅲ";s:3:"III";s:3:"Ⅳ";s:2:"IV";s:3:"Ⅴ";s:1:"V";s:3:"Ⅵ";s:2:"VI";s:3:"Ⅶ";s:3:"VII";s:3:"Ⅷ";s:4:"VIII";s:3:"Ⅸ";s:2:"IX";s:3:"Ⅹ";s:1:"X";s:3:"Ⅺ";s:2:"XI";s:3:"Ⅻ";s:3:"XII";s:3:"Ⅼ";s:1:"L";s:3:"Ⅽ";s:1:"C";s:3:"Ⅾ";s:1:"D";s:3:"Ⅿ";s:1:"M";s:3:"ⅰ";s:1:"i";s:3:"ⅱ";s:2:"ii";s:3:"ⅲ";s:3:"iii";s:3:"ⅳ";s:2:"iv";s:3:"ⅴ";s:1:"v";s:3:"ⅵ";s:2:"vi";s:3:"ⅶ";s:3:"vii";s:3:"ⅷ";s:4:"viii";s:3:"ⅸ";s:2:"ix";s:3:"ⅹ";s:1:"x";s:3:"ⅺ";s:2:"xi";s:3:"ⅻ";s:3:"xii";s:3:"ⅼ";s:1:"l";s:3:"ⅽ";s:1:"c";s:3:"ⅾ";s:1:"d";s:3:"ⅿ";s:1:"m";s:3:"↉";s:7:" 0⁄3 ";s:3:"∬";s:6:"∫∫";s:3:"∭";s:9:"∫∫∫";s:3:"∯";s:6:"∮∮";s:3:"∰";s:9:"∮∮∮";s:3:"①";s:3:"(1)";s:3:"②";s:3:"(2)";s:3:"③";s:3:"(3)";s:3:"④";s:3:"(4)";s:3:"⑤";s:3:"(5)";s:3:"⑥";s:3:"(6)";s:3:"⑦";s:3:"(7)";s:3:"⑧";s:3:"(8)";s:3:"⑨";s:3:"(9)";s:3:"⑩";s:4:"(10)";s:3:"⑪";s:4:"(11)";s:3:"⑫";s:4:"(12)";s:3:"⑬";s:4:"(13)";s:3:"⑭";s:4:"(14)";s:3:"⑮";s:4:"(15)";s:3:"⑯";s:4:"(16)";s:3:"⑰";s:4:"(17)";s:3:"⑱";s:4:"(18)";s:3:"⑲";s:4:"(19)";s:3:"⑳";s:4:"(20)";s:3:"⑴";s:3:"(1)";s:3:"⑵";s:3:"(2)";s:3:"⑶";s:3:"(3)";s:3:"⑷";s:3:"(4)";s:3:"⑸";s:3:"(5)";s:3:"⑹";s:3:"(6)";s:3:"⑺";s:3:"(7)";s:3:"⑻";s:3:"(8)";s:3:"⑼";s:3:"(9)";s:3:"⑽";s:4:"(10)";s:3:"⑾";s:4:"(11)";s:3:"⑿";s:4:"(12)";s:3:"⒀";s:4:"(13)";s:3:"⒁";s:4:"(14)";s:3:"⒂";s:4:"(15)";s:3:"⒃";s:4:"(16)";s:3:"⒄";s:4:"(17)";s:3:"⒅";s:4:"(18)";s:3:"⒆";s:4:"(19)";s:3:"⒇";s:4:"(20)";s:3:"⒈";s:2:"1.";s:3:"⒉";s:2:"2.";s:3:"⒊";s:2:"3.";s:3:"⒋";s:2:"4.";s:3:"⒌";s:2:"5.";s:3:"⒍";s:2:"6.";s:3:"⒎";s:2:"7.";s:3:"⒏";s:2:"8.";s:3:"⒐";s:2:"9.";s:3:"⒑";s:3:"10.";s:3:"⒒";s:3:"11.";s:3:"⒓";s:3:"12.";s:3:"⒔";s:3:"13.";s:3:"⒕";s:3:"14.";s:3:"⒖";s:3:"15.";s:3:"⒗";s:3:"16.";s:3:"⒘";s:3:"17.";s:3:"⒙";s:3:"18.";s:3:"⒚";s:3:"19.";s:3:"⒛";s:3:"20.";s:3:"⒜";s:3:"(a)";s:3:"⒝";s:3:"(b)";s:3:"⒞";s:3:"(c)";s:3:"⒟";s:3:"(d)";s:3:"⒠";s:3:"(e)";s:3:"⒡";s:3:"(f)";s:3:"⒢";s:3:"(g)";s:3:"⒣";s:3:"(h)";s:3:"⒤";s:3:"(i)";s:3:"⒥";s:3:"(j)";s:3:"⒦";s:3:"(k)";s:3:"⒧";s:3:"(l)";s:3:"⒨";s:3:"(m)";s:3:"⒩";s:3:"(n)";s:3:"⒪";s:3:"(o)";s:3:"⒫";s:3:"(p)";s:3:"⒬";s:3:"(q)";s:3:"⒭";s:3:"(r)";s:3:"⒮";s:3:"(s)";s:3:"⒯";s:3:"(t)";s:3:"⒰";s:3:"(u)";s:3:"⒱";s:3:"(v)";s:3:"⒲";s:3:"(w)";s:3:"⒳";s:3:"(x)";s:3:"⒴";s:3:"(y)";s:3:"⒵";s:3:"(z)";s:3:"Ⓐ";s:3:"(A)";s:3:"Ⓑ";s:3:"(B)";s:3:"Ⓒ";s:3:"(C)";s:3:"Ⓓ";s:3:"(D)";s:3:"Ⓔ";s:3:"(E)";s:3:"Ⓕ";s:3:"(F)";s:3:"Ⓖ";s:3:"(G)";s:3:"Ⓗ";s:3:"(H)";s:3:"Ⓘ";s:3:"(I)";s:3:"Ⓙ";s:3:"(J)";s:3:"Ⓚ";s:3:"(K)";s:3:"Ⓛ";s:3:"(L)";s:3:"Ⓜ";s:3:"(M)";s:3:"Ⓝ";s:3:"(N)";s:3:"Ⓞ";s:3:"(O)";s:3:"Ⓟ";s:3:"(P)";s:3:"Ⓠ";s:3:"(Q)";s:3:"Ⓡ";s:3:"(R)";s:3:"Ⓢ";s:3:"(S)";s:3:"Ⓣ";s:3:"(T)";s:3:"Ⓤ";s:3:"(U)";s:3:"Ⓥ";s:3:"(V)";s:3:"Ⓦ";s:3:"(W)";s:3:"Ⓧ";s:3:"(X)";s:3:"Ⓨ";s:3:"(Y)";s:3:"Ⓩ";s:3:"(Z)";s:3:"ⓐ";s:3:"(a)";s:3:"ⓑ";s:3:"(b)";s:3:"ⓒ";s:3:"(c)";s:3:"ⓓ";s:3:"(d)";s:3:"ⓔ";s:3:"(e)";s:3:"ⓕ";s:3:"(f)";s:3:"ⓖ";s:3:"(g)";s:3:"ⓗ";s:3:"(h)";s:3:"ⓘ";s:3:"(i)";s:3:"ⓙ";s:3:"(j)";s:3:"ⓚ";s:3:"(k)";s:3:"ⓛ";s:3:"(l)";s:3:"ⓜ";s:3:"(m)";s:3:"ⓝ";s:3:"(n)";s:3:"ⓞ";s:3:"(o)";s:3:"ⓟ";s:3:"(p)";s:3:"ⓠ";s:3:"(q)";s:3:"ⓡ";s:3:"(r)";s:3:"ⓢ";s:3:"(s)";s:3:"ⓣ";s:3:"(t)";s:3:"ⓤ";s:3:"(u)";s:3:"ⓥ";s:3:"(v)";s:3:"ⓦ";s:3:"(w)";s:3:"ⓧ";s:3:"(x)";s:3:"ⓨ";s:3:"(y)";s:3:"ⓩ";s:3:"(z)";s:3:"⓪";s:3:"(0)";s:3:"⨌";s:12:"∫∫∫∫";s:3:"⩴";s:3:"::=";s:3:"⩵";s:2:"==";s:3:"⩶";s:3:"===";s:3:"⺟";s:3:"母";s:3:"⻳";s:3:"龟";s:3:"⼀";s:3:"一";s:3:"⼁";s:3:"丨";s:3:"⼂";s:3:"丶";s:3:"⼃";s:3:"丿";s:3:"⼄";s:3:"乙";s:3:"⼅";s:3:"亅";s:3:"⼆";s:3:"二";s:3:"⼇";s:3:"亠";s:3:"⼈";s:3:"人";s:3:"⼉";s:3:"儿";s:3:"⼊";s:3:"入";s:3:"⼋";s:3:"八";s:3:"⼌";s:3:"冂";s:3:"⼍";s:3:"冖";s:3:"⼎";s:3:"冫";s:3:"⼏";s:3:"几";s:3:"⼐";s:3:"凵";s:3:"⼑";s:3:"刀";s:3:"⼒";s:3:"力";s:3:"⼓";s:3:"勹";s:3:"⼔";s:3:"匕";s:3:"⼕";s:3:"匚";s:3:"⼖";s:3:"匸";s:3:"⼗";s:3:"十";s:3:"⼘";s:3:"卜";s:3:"⼙";s:3:"卩";s:3:"⼚";s:3:"厂";s:3:"⼛";s:3:"厶";s:3:"⼜";s:3:"又";s:3:"⼝";s:3:"口";s:3:"⼞";s:3:"囗";s:3:"⼟";s:3:"土";s:3:"⼠";s:3:"士";s:3:"⼡";s:3:"夂";s:3:"⼢";s:3:"夊";s:3:"⼣";s:3:"夕";s:3:"⼤";s:3:"大";s:3:"⼥";s:3:"女";s:3:"⼦";s:3:"子";s:3:"⼧";s:3:"宀";s:3:"⼨";s:3:"寸";s:3:"⼩";s:3:"小";s:3:"⼪";s:3:"尢";s:3:"⼫";s:3:"尸";s:3:"⼬";s:3:"屮";s:3:"⼭";s:3:"山";s:3:"⼮";s:3:"巛";s:3:"⼯";s:3:"工";s:3:"⼰";s:3:"己";s:3:"⼱";s:3:"巾";s:3:"⼲";s:3:"干";s:3:"⼳";s:3:"幺";s:3:"⼴";s:3:"广";s:3:"⼵";s:3:"廴";s:3:"⼶";s:3:"廾";s:3:"⼷";s:3:"弋";s:3:"⼸";s:3:"弓";s:3:"⼹";s:3:"彐";s:3:"⼺";s:3:"彡";s:3:"⼻";s:3:"彳";s:3:"⼼";s:3:"心";s:3:"⼽";s:3:"戈";s:3:"⼾";s:3:"戶";s:3:"⼿";s:3:"手";s:3:"⽀";s:3:"支";s:3:"⽁";s:3:"攴";s:3:"⽂";s:3:"文";s:3:"⽃";s:3:"斗";s:3:"⽄";s:3:"斤";s:3:"⽅";s:3:"方";s:3:"⽆";s:3:"无";s:3:"⽇";s:3:"日";s:3:"⽈";s:3:"曰";s:3:"⽉";s:3:"月";s:3:"⽊";s:3:"木";s:3:"⽋";s:3:"欠";s:3:"⽌";s:3:"止";s:3:"⽍";s:3:"歹";s:3:"⽎";s:3:"殳";s:3:"⽏";s:3:"毋";s:3:"⽐";s:3:"比";s:3:"⽑";s:3:"毛";s:3:"⽒";s:3:"氏";s:3:"⽓";s:3:"气";s:3:"⽔";s:3:"水";s:3:"⽕";s:3:"火";s:3:"⽖";s:3:"爪";s:3:"⽗";s:3:"父";s:3:"⽘";s:3:"爻";s:3:"⽙";s:3:"爿";s:3:"⽚";s:3:"片";s:3:"⽛";s:3:"牙";s:3:"⽜";s:3:"牛";s:3:"⽝";s:3:"犬";s:3:"⽞";s:3:"玄";s:3:"⽟";s:3:"玉";s:3:"⽠";s:3:"瓜";s:3:"⽡";s:3:"瓦";s:3:"⽢";s:3:"甘";s:3:"⽣";s:3:"生";s:3:"⽤";s:3:"用";s:3:"⽥";s:3:"田";s:3:"⽦";s:3:"疋";s:3:"⽧";s:3:"疒";s:3:"⽨";s:3:"癶";s:3:"⽩";s:3:"白";s:3:"⽪";s:3:"皮";s:3:"⽫";s:3:"皿";s:3:"⽬";s:3:"目";s:3:"⽭";s:3:"矛";s:3:"⽮";s:3:"矢";s:3:"⽯";s:3:"石";s:3:"⽰";s:3:"示";s:3:"⽱";s:3:"禸";s:3:"⽲";s:3:"禾";s:3:"⽳";s:3:"穴";s:3:"⽴";s:3:"立";s:3:"⽵";s:3:"竹";s:3:"⽶";s:3:"米";s:3:"⽷";s:3:"糸";s:3:"⽸";s:3:"缶";s:3:"⽹";s:3:"网";s:3:"⽺";s:3:"羊";s:3:"⽻";s:3:"羽";s:3:"⽼";s:3:"老";s:3:"⽽";s:3:"而";s:3:"⽾";s:3:"耒";s:3:"⽿";s:3:"耳";s:3:"⾀";s:3:"聿";s:3:"⾁";s:3:"肉";s:3:"⾂";s:3:"臣";s:3:"⾃";s:3:"自";s:3:"⾄";s:3:"至";s:3:"⾅";s:3:"臼";s:3:"⾆";s:3:"舌";s:3:"⾇";s:3:"舛";s:3:"⾈";s:3:"舟";s:3:"⾉";s:3:"艮";s:3:"⾊";s:3:"色";s:3:"⾋";s:3:"艸";s:3:"⾌";s:3:"虍";s:3:"⾍";s:3:"虫";s:3:"⾎";s:3:"血";s:3:"⾏";s:3:"行";s:3:"⾐";s:3:"衣";s:3:"⾑";s:3:"襾";s:3:"⾒";s:3:"見";s:3:"⾓";s:3:"角";s:3:"⾔";s:3:"言";s:3:"⾕";s:3:"谷";s:3:"⾖";s:3:"豆";s:3:"⾗";s:3:"豕";s:3:"⾘";s:3:"豸";s:3:"⾙";s:3:"貝";s:3:"⾚";s:3:"赤";s:3:"⾛";s:3:"走";s:3:"⾜";s:3:"足";s:3:"⾝";s:3:"身";s:3:"⾞";s:3:"車";s:3:"⾟";s:3:"辛";s:3:"⾠";s:3:"辰";s:3:"⾡";s:3:"辵";s:3:"⾢";s:3:"邑";s:3:"⾣";s:3:"酉";s:3:"⾤";s:3:"釆";s:3:"⾥";s:3:"里";s:3:"⾦";s:3:"金";s:3:"⾧";s:3:"長";s:3:"⾨";s:3:"門";s:3:"⾩";s:3:"阜";s:3:"⾪";s:3:"隶";s:3:"⾫";s:3:"隹";s:3:"⾬";s:3:"雨";s:3:"⾭";s:3:"靑";s:3:"⾮";s:3:"非";s:3:"⾯";s:3:"面";s:3:"⾰";s:3:"革";s:3:"⾱";s:3:"韋";s:3:"⾲";s:3:"韭";s:3:"⾳";s:3:"音";s:3:"⾴";s:3:"頁";s:3:"⾵";s:3:"風";s:3:"⾶";s:3:"飛";s:3:"⾷";s:3:"食";s:3:"⾸";s:3:"首";s:3:"⾹";s:3:"香";s:3:"⾺";s:3:"馬";s:3:"⾻";s:3:"骨";s:3:"⾼";s:3:"高";s:3:"⾽";s:3:"髟";s:3:"⾾";s:3:"鬥";s:3:"⾿";s:3:"鬯";s:3:"⿀";s:3:"鬲";s:3:"⿁";s:3:"鬼";s:3:"⿂";s:3:"魚";s:3:"⿃";s:3:"鳥";s:3:"⿄";s:3:"鹵";s:3:"⿅";s:3:"鹿";s:3:"⿆";s:3:"麥";s:3:"⿇";s:3:"麻";s:3:"⿈";s:3:"黃";s:3:"⿉";s:3:"黍";s:3:"⿊";s:3:"黑";s:3:"⿋";s:3:"黹";s:3:"⿌";s:3:"黽";s:3:"⿍";s:3:"鼎";s:3:"⿎";s:3:"鼓";s:3:"⿏";s:3:"鼠";s:3:"⿐";s:3:"鼻";s:3:"⿑";s:3:"齊";s:3:"⿒";s:3:"齒";s:3:"⿓";s:3:"龍";s:3:"⿔";s:3:"龜";s:3:"⿕";s:3:"龠";s:3:"　";s:1:" ";s:3:"〶";s:3:"〒";s:3:"〸";s:3:"十";s:3:"〹";s:3:"卄";s:3:"〺";s:3:"卅";s:3:"ㄱ";s:3:"ᄀ";s:3:"ㄲ";s:3:"ᄁ";s:3:"ㄳ";s:3:"ᆪ";s:3:"ㄴ";s:3:"ᄂ";s:3:"ㄵ";s:3:"ᆬ";s:3:"ㄶ";s:3:"ᆭ";s:3:"ㄷ";s:3:"ᄃ";s:3:"ㄸ";s:3:"ᄄ";s:3:"ㄹ";s:3:"ᄅ";s:3:"ㄺ";s:3:"ᆰ";s:3:"ㄻ";s:3:"ᆱ";s:3:"ㄼ";s:3:"ᆲ";s:3:"ㄽ";s:3:"ᆳ";s:3:"ㄾ";s:3:"ᆴ";s:3:"ㄿ";s:3:"ᆵ";s:3:"ㅀ";s:3:"ᄚ";s:3:"ㅁ";s:3:"ᄆ";s:3:"ㅂ";s:3:"ᄇ";s:3:"ㅃ";s:3:"ᄈ";s:3:"ㅄ";s:3:"ᄡ";s:3:"ㅅ";s:3:"ᄉ";s:3:"ㅆ";s:3:"ᄊ";s:3:"ㅇ";s:3:"ᄋ";s:3:"ㅈ";s:3:"ᄌ";s:3:"ㅉ";s:3:"ᄍ";s:3:"ㅊ";s:3:"ᄎ";s:3:"ㅋ";s:3:"ᄏ";s:3:"ㅌ";s:3:"ᄐ";s:3:"ㅍ";s:3:"ᄑ";s:3:"ㅎ";s:3:"ᄒ";s:3:"ㅏ";s:3:"ᅡ";s:3:"ㅐ";s:3:"ᅢ";s:3:"ㅑ";s:3:"ᅣ";s:3:"ㅒ";s:3:"ᅤ";s:3:"ㅓ";s:3:"ᅥ";s:3:"ㅔ";s:3:"ᅦ";s:3:"ㅕ";s:3:"ᅧ";s:3:"ㅖ";s:3:"ᅨ";s:3:"ㅗ";s:3:"ᅩ";s:3:"ㅘ";s:3:"ᅪ";s:3:"ㅙ";s:3:"ᅫ";s:3:"ㅚ";s:3:"ᅬ";s:3:"ㅛ";s:3:"ᅭ";s:3:"ㅜ";s:3:"ᅮ";s:3:"ㅝ";s:3:"ᅯ";s:3:"ㅞ";s:3:"ᅰ";s:3:"ㅟ";s:3:"ᅱ";s:3:"ㅠ";s:3:"ᅲ";s:3:"ㅡ";s:3:"ᅳ";s:3:"ㅢ";s:3:"ᅴ";s:3:"ㅣ";s:3:"ᅵ";s:3:"ㅤ";s:3:"ᅠ";s:3:"ㅥ";s:3:"ᄔ";s:3:"ㅦ";s:3:"ᄕ";s:3:"ㅧ";s:3:"ᇇ";s:3:"ㅨ";s:3:"ᇈ";s:3:"ㅩ";s:3:"ᇌ";s:3:"ㅪ";s:3:"ᇎ";s:3:"ㅫ";s:3:"ᇓ";s:3:"ㅬ";s:3:"ᇗ";s:3:"ㅭ";s:3:"ᇙ";s:3:"ㅮ";s:3:"ᄜ";s:3:"ㅯ";s:3:"ᇝ";s:3:"ㅰ";s:3:"ᇟ";s:3:"ㅱ";s:3:"ᄝ";s:3:"ㅲ";s:3:"ᄞ";s:3:"ㅳ";s:3:"ᄠ";s:3:"ㅴ";s:3:"ᄢ";s:3:"ㅵ";s:3:"ᄣ";s:3:"ㅶ";s:3:"ᄧ";s:3:"ㅷ";s:3:"ᄩ";s:3:"ㅸ";s:3:"ᄫ";s:3:"ㅹ";s:3:"ᄬ";s:3:"ㅺ";s:3:"ᄭ";s:3:"ㅻ";s:3:"ᄮ";s:3:"ㅼ";s:3:"ᄯ";s:3:"ㅽ";s:3:"ᄲ";s:3:"ㅾ";s:3:"ᄶ";s:3:"ㅿ";s:3:"ᅀ";s:3:"ㆀ";s:3:"ᅇ";s:3:"ㆁ";s:3:"ᅌ";s:3:"ㆂ";s:3:"ᇱ";s:3:"ㆃ";s:3:"ᇲ";s:3:"ㆄ";s:3:"ᅗ";s:3:"ㆅ";s:3:"ᅘ";s:3:"ㆆ";s:3:"ᅙ";s:3:"ㆇ";s:3:"ᆄ";s:3:"ㆈ";s:3:"ᆅ";s:3:"ㆉ";s:3:"ᆈ";s:3:"ㆊ";s:3:"ᆑ";s:3:"ㆋ";s:3:"ᆒ";s:3:"ㆌ";s:3:"ᆔ";s:3:"ㆍ";s:3:"ᆞ";s:3:"ㆎ";s:3:"ᆡ";s:3:"㈀";s:5:"(ᄀ)";s:3:"㈁";s:5:"(ᄂ)";s:3:"㈂";s:5:"(ᄃ)";s:3:"㈃";s:5:"(ᄅ)";s:3:"㈄";s:5:"(ᄆ)";s:3:"㈅";s:5:"(ᄇ)";s:3:"㈆";s:5:"(ᄉ)";s:3:"㈇";s:5:"(ᄋ)";s:3:"㈈";s:5:"(ᄌ)";s:3:"㈉";s:5:"(ᄎ)";s:3:"㈊";s:5:"(ᄏ)";s:3:"㈋";s:5:"(ᄐ)";s:3:"㈌";s:5:"(ᄑ)";s:3:"㈍";s:5:"(ᄒ)";s:3:"㈎";s:8:"(가)";s:3:"㈏";s:8:"(나)";s:3:"㈐";s:8:"(다)";s:3:"㈑";s:8:"(라)";s:3:"㈒";s:8:"(마)";s:3:"㈓";s:8:"(바)";s:3:"㈔";s:8:"(사)";s:3:"㈕";s:8:"(아)";s:3:"㈖";s:8:"(자)";s:3:"㈗";s:8:"(차)";s:3:"㈘";s:8:"(카)";s:3:"㈙";s:8:"(타)";s:3:"㈚";s:8:"(파)";s:3:"㈛";s:8:"(하)";s:3:"㈜";s:8:"(주)";s:3:"㈝";s:17:"(오전)";s:3:"㈞";s:14:"(오후)";s:3:"㈠";s:5:"(一)";s:3:"㈡";s:5:"(二)";s:3:"㈢";s:5:"(三)";s:3:"㈣";s:5:"(四)";s:3:"㈤";s:5:"(五)";s:3:"㈥";s:5:"(六)";s:3:"㈦";s:5:"(七)";s:3:"㈧";s:5:"(八)";s:3:"㈨";s:5:"(九)";s:3:"㈩";s:5:"(十)";s:3:"㈪";s:5:"(月)";s:3:"㈫";s:5:"(火)";s:3:"㈬";s:5:"(水)";s:3:"㈭";s:5:"(木)";s:3:"㈮";s:5:"(金)";s:3:"㈯";s:5:"(土)";s:3:"㈰";s:5:"(日)";s:3:"㈱";s:5:"(株)";s:3:"㈲";s:5:"(有)";s:3:"㈳";s:5:"(社)";s:3:"㈴";s:5:"(名)";s:3:"㈵";s:5:"(特)";s:3:"㈶";s:5:"(財)";s:3:"㈷";s:5:"(祝)";s:3:"㈸";s:5:"(労)";s:3:"㈹";s:5:"(代)";s:3:"㈺";s:5:"(呼)";s:3:"㈻";s:5:"(学)";s:3:"㈼";s:5:"(監)";s:3:"㈽";s:5:"(企)";s:3:"㈾";s:5:"(資)";s:3:"㈿";s:5:"(協)";s:3:"㉀";s:5:"(祭)";s:3:"㉁";s:5:"(休)";s:3:"㉂";s:5:"(自)";s:3:"㉃";s:5:"(至)";s:3:"㉄";s:5:"(問)";s:3:"㉅";s:5:"(幼)";s:3:"㉆";s:5:"(文)";s:3:"㉇";s:5:"(箏)";s:3:"㉐";s:3:"PTE";s:3:"㉑";s:4:"(21)";s:3:"㉒";s:4:"(22)";s:3:"㉓";s:4:"(23)";s:3:"㉔";s:4:"(24)";s:3:"㉕";s:4:"(25)";s:3:"㉖";s:4:"(26)";s:3:"㉗";s:4:"(27)";s:3:"㉘";s:4:"(28)";s:3:"㉙";s:4:"(29)";s:3:"㉚";s:4:"(30)";s:3:"㉛";s:4:"(31)";s:3:"㉜";s:4:"(32)";s:3:"㉝";s:4:"(33)";s:3:"㉞";s:4:"(34)";s:3:"㉟";s:4:"(35)";s:3:"㉠";s:5:"(ᄀ)";s:3:"㉡";s:5:"(ᄂ)";s:3:"㉢";s:5:"(ᄃ)";s:3:"㉣";s:5:"(ᄅ)";s:3:"㉤";s:5:"(ᄆ)";s:3:"㉥";s:5:"(ᄇ)";s:3:"㉦";s:5:"(ᄉ)";s:3:"㉧";s:5:"(ᄋ)";s:3:"㉨";s:5:"(ᄌ)";s:3:"㉩";s:5:"(ᄎ)";s:3:"㉪";s:5:"(ᄏ)";s:3:"㉫";s:5:"(ᄐ)";s:3:"㉬";s:5:"(ᄑ)";s:3:"㉭";s:5:"(ᄒ)";s:3:"㉮";s:8:"(가)";s:3:"㉯";s:8:"(나)";s:3:"㉰";s:8:"(다)";s:3:"㉱";s:8:"(라)";s:3:"㉲";s:8:"(마)";s:3:"㉳";s:8:"(바)";s:3:"㉴";s:8:"(사)";s:3:"㉵";s:8:"(아)";s:3:"㉶";s:8:"(자)";s:3:"㉷";s:8:"(차)";s:3:"㉸";s:8:"(카)";s:3:"㉹";s:8:"(타)";s:3:"㉺";s:8:"(파)";s:3:"㉻";s:8:"(하)";s:3:"㉼";s:17:"(참고)";s:3:"㉽";s:14:"(주의)";s:3:"㉾";s:8:"(우)";s:3:"㊀";s:5:"(一)";s:3:"㊁";s:5:"(二)";s:3:"㊂";s:5:"(三)";s:3:"㊃";s:5:"(四)";s:3:"㊄";s:5:"(五)";s:3:"㊅";s:5:"(六)";s:3:"㊆";s:5:"(七)";s:3:"㊇";s:5:"(八)";s:3:"㊈";s:5:"(九)";s:3:"㊉";s:5:"(十)";s:3:"㊊";s:5:"(月)";s:3:"㊋";s:5:"(火)";s:3:"㊌";s:5:"(水)";s:3:"㊍";s:5:"(木)";s:3:"㊎";s:5:"(金)";s:3:"㊏";s:5:"(土)";s:3:"㊐";s:5:"(日)";s:3:"㊑";s:5:"(株)";s:3:"㊒";s:5:"(有)";s:3:"㊓";s:5:"(社)";s:3:"㊔";s:5:"(名)";s:3:"㊕";s:5:"(特)";s:3:"㊖";s:5:"(財)";s:3:"㊗";s:5:"(祝)";s:3:"㊘";s:5:"(労)";s:3:"㊙";s:5:"(秘)";s:3:"㊚";s:5:"(男)";s:3:"㊛";s:5:"(女)";s:3:"㊜";s:5:"(適)";s:3:"㊝";s:5:"(優)";s:3:"㊞";s:5:"(印)";s:3:"㊟";s:5:"(注)";s:3:"㊠";s:5:"(項)";s:3:"㊡";s:5:"(休)";s:3:"㊢";s:5:"(写)";s:3:"㊣";s:5:"(正)";s:3:"㊤";s:5:"(上)";s:3:"㊥";s:5:"(中)";s:3:"㊦";s:5:"(下)";s:3:"㊧";s:5:"(左)";s:3:"㊨";s:5:"(右)";s:3:"㊩";s:5:"(医)";s:3:"㊪";s:5:"(宗)";s:3:"㊫";s:5:"(学)";s:3:"㊬";s:5:"(監)";s:3:"㊭";s:5:"(企)";s:3:"㊮";s:5:"(資)";s:3:"㊯";s:5:"(協)";s:3:"㊰";s:5:"(夜)";s:3:"㊱";s:4:"(36)";s:3:"㊲";s:4:"(37)";s:3:"㊳";s:4:"(38)";s:3:"㊴";s:4:"(39)";s:3:"㊵";s:4:"(40)";s:3:"㊶";s:4:"(41)";s:3:"㊷";s:4:"(42)";s:3:"㊸";s:4:"(43)";s:3:"㊹";s:4:"(44)";s:3:"㊺";s:4:"(45)";s:3:"㊻";s:4:"(46)";s:3:"㊼";s:4:"(47)";s:3:"㊽";s:4:"(48)";s:3:"㊾";s:4:"(49)";s:3:"㊿";s:4:"(50)";s:3:"㋀";s:4:"1月";s:3:"㋁";s:4:"2月";s:3:"㋂";s:4:"3月";s:3:"㋃";s:4:"4月";s:3:"㋄";s:4:"5月";s:3:"㋅";s:4:"6月";s:3:"㋆";s:4:"7月";s:3:"㋇";s:4:"8月";s:3:"㋈";s:4:"9月";s:3:"㋉";s:5:"10月";s:3:"㋊";s:5:"11月";s:3:"㋋";s:5:"12月";s:3:"㋌";s:2:"Hg";s:3:"㋍";s:3:"erg";s:3:"㋎";s:2:"eV";s:3:"㋏";s:3:"LTD";s:3:"㋐";s:5:"(ア)";s:3:"㋑";s:5:"(イ)";s:3:"㋒";s:5:"(ウ)";s:3:"㋓";s:5:"(エ)";s:3:"㋔";s:5:"(オ)";s:3:"㋕";s:5:"(カ)";s:3:"㋖";s:5:"(キ)";s:3:"㋗";s:5:"(ク)";s:3:"㋘";s:5:"(ケ)";s:3:"㋙";s:5:"(コ)";s:3:"㋚";s:5:"(サ)";s:3:"㋛";s:5:"(シ)";s:3:"㋜";s:5:"(ス)";s:3:"㋝";s:5:"(セ)";s:3:"㋞";s:5:"(ソ)";s:3:"㋟";s:5:"(タ)";s:3:"㋠";s:5:"(チ)";s:3:"㋡";s:5:"(ツ)";s:3:"㋢";s:5:"(テ)";s:3:"㋣";s:5:"(ト)";s:3:"㋤";s:5:"(ナ)";s:3:"㋥";s:5:"(ニ)";s:3:"㋦";s:5:"(ヌ)";s:3:"㋧";s:5:"(ネ)";s:3:"㋨";s:5:"(ノ)";s:3:"㋩";s:5:"(ハ)";s:3:"㋪";s:5:"(ヒ)";s:3:"㋫";s:5:"(フ)";s:3:"㋬";s:5:"(ヘ)";s:3:"㋭";s:5:"(ホ)";s:3:"㋮";s:5:"(マ)";s:3:"㋯";s:5:"(ミ)";s:3:"㋰";s:5:"(ム)";s:3:"㋱";s:5:"(メ)";s:3:"㋲";s:5:"(モ)";s:3:"㋳";s:5:"(ヤ)";s:3:"㋴";s:5:"(ユ)";s:3:"㋵";s:5:"(ヨ)";s:3:"㋶";s:5:"(ラ)";s:3:"㋷";s:5:"(リ)";s:3:"㋸";s:5:"(ル)";s:3:"㋹";s:5:"(レ)";s:3:"㋺";s:5:"(ロ)";s:3:"㋻";s:5:"(ワ)";s:3:"㋼";s:5:"(ヰ)";s:3:"㋽";s:5:"(ヱ)";s:3:"㋾";s:5:"(ヲ)";s:3:"㌀";s:12:"アパート";s:3:"㌁";s:12:"アルファ";s:3:"㌂";s:12:"アンペア";s:3:"㌃";s:9:"アール";s:3:"㌄";s:12:"イニング";s:3:"㌅";s:9:"インチ";s:3:"㌆";s:9:"ウォン";s:3:"㌇";s:15:"エスクード";s:3:"㌈";s:12:"エーカー";s:3:"㌉";s:9:"オンス";s:3:"㌊";s:9:"オーム";s:3:"㌋";s:9:"カイリ";s:3:"㌌";s:12:"カラット";s:3:"㌍";s:12:"カロリー";s:3:"㌎";s:9:"ガロン";s:3:"㌏";s:9:"ガンマ";s:3:"㌐";s:6:"ギガ";s:3:"㌑";s:9:"ギニー";s:3:"㌒";s:12:"キュリー";s:3:"㌓";s:12:"ギルダー";s:3:"㌔";s:6:"キロ";s:3:"㌕";s:15:"キログラム";s:3:"㌖";s:18:"キロメートル";s:3:"㌗";s:15:"キロワット";s:3:"㌘";s:9:"グラム";s:3:"㌙";s:15:"グラムトン";s:3:"㌚";s:15:"クルゼイロ";s:3:"㌛";s:12:"クローネ";s:3:"㌜";s:9:"ケース";s:3:"㌝";s:9:"コルナ";s:3:"㌞";s:9:"コーポ";s:3:"㌟";s:12:"サイクル";s:3:"㌠";s:15:"サンチーム";s:3:"㌡";s:12:"シリング";s:3:"㌢";s:9:"センチ";s:3:"㌣";s:9:"セント";s:3:"㌤";s:9:"ダース";s:3:"㌥";s:6:"デシ";s:3:"㌦";s:6:"ドル";s:3:"㌧";s:6:"トン";s:3:"㌨";s:6:"ナノ";s:3:"㌩";s:9:"ノット";s:3:"㌪";s:9:"ハイツ";s:3:"㌫";s:15:"パーセント";s:3:"㌬";s:9:"パーツ";s:3:"㌭";s:12:"バーレル";s:3:"㌮";s:15:"ピアストル";s:3:"㌯";s:9:"ピクル";s:3:"㌰";s:6:"ピコ";s:3:"㌱";s:6:"ビル";s:3:"㌲";s:15:"ファラッド";s:3:"㌳";s:12:"フィート";s:3:"㌴";s:15:"ブッシェル";s:3:"㌵";s:9:"フラン";s:3:"㌶";s:15:"ヘクタール";s:3:"㌷";s:6:"ペソ";s:3:"㌸";s:9:"ペニヒ";s:3:"㌹";s:9:"ヘルツ";s:3:"㌺";s:9:"ペンス";s:3:"㌻";s:9:"ページ";s:3:"㌼";s:9:"ベータ";s:3:"㌽";s:12:"ポイント";s:3:"㌾";s:9:"ボルト";s:3:"㌿";s:6:"ホン";s:3:"㍀";s:9:"ポンド";s:3:"㍁";s:9:"ホール";s:3:"㍂";s:9:"ホーン";s:3:"㍃";s:12:"マイクロ";s:3:"㍄";s:9:"マイル";s:3:"㍅";s:9:"マッハ";s:3:"㍆";s:9:"マルク";s:3:"㍇";s:15:"マンション";s:3:"㍈";s:12:"ミクロン";s:3:"㍉";s:6:"ミリ";s:3:"㍊";s:15:"ミリバール";s:3:"㍋";s:6:"メガ";s:3:"㍌";s:12:"メガトン";s:3:"㍍";s:12:"メートル";s:3:"㍎";s:9:"ヤード";s:3:"㍏";s:9:"ヤール";s:3:"㍐";s:9:"ユアン";s:3:"㍑";s:12:"リットル";s:3:"㍒";s:6:"リラ";s:3:"㍓";s:9:"ルピー";s:3:"㍔";s:12:"ルーブル";s:3:"㍕";s:6:"レム";s:3:"㍖";s:15:"レントゲン";s:3:"㍗";s:9:"ワット";s:3:"㍘";s:4:"0点";s:3:"㍙";s:4:"1点";s:3:"㍚";s:4:"2点";s:3:"㍛";s:4:"3点";s:3:"㍜";s:4:"4点";s:3:"㍝";s:4:"5点";s:3:"㍞";s:4:"6点";s:3:"㍟";s:4:"7点";s:3:"㍠";s:4:"8点";s:3:"㍡";s:4:"9点";s:3:"㍢";s:5:"10点";s:3:"㍣";s:5:"11点";s:3:"㍤";s:5:"12点";s:3:"㍥";s:5:"13点";s:3:"㍦";s:5:"14点";s:3:"㍧";s:5:"15点";s:3:"㍨";s:5:"16点";s:3:"㍩";s:5:"17点";s:3:"㍪";s:5:"18点";s:3:"㍫";s:5:"19点";s:3:"㍬";s:5:"20点";s:3:"㍭";s:5:"21点";s:3:"㍮";s:5:"22点";s:3:"㍯";s:5:"23点";s:3:"㍰";s:5:"24点";s:3:"㍱";s:3:"hPa";s:3:"㍲";s:2:"da";s:3:"㍳";s:2:"AU";s:3:"㍴";s:3:"bar";s:3:"㍵";s:2:"oV";s:3:"㍶";s:2:"pc";s:3:"㍷";s:2:"dm";s:3:"㍸";s:4:"dm²";s:3:"㍹";s:4:"dm³";s:3:"㍺";s:2:"IU";s:3:"㍻";s:6:"平成";s:3:"㍼";s:6:"昭和";s:3:"㍽";s:6:"大正";s:3:"㍾";s:6:"明治";s:3:"㍿";s:12:"株式会社";s:3:"㎀";s:2:"pA";s:3:"㎁";s:2:"nA";s:3:"㎂";s:3:"μA";s:3:"㎃";s:2:"mA";s:3:"㎄";s:2:"kA";s:3:"㎅";s:2:"KB";s:3:"㎆";s:2:"MB";s:3:"㎇";s:2:"GB";s:3:"㎈";s:3:"cal";s:3:"㎉";s:4:"kcal";s:3:"㎊";s:2:"pF";s:3:"㎋";s:2:"nF";s:3:"㎌";s:3:"μF";s:3:"㎍";s:3:"μg";s:3:"㎎";s:2:"mg";s:3:"㎏";s:2:"kg";s:3:"㎐";s:2:"Hz";s:3:"㎑";s:3:"kHz";s:3:"㎒";s:3:"MHz";s:3:"㎓";s:3:"GHz";s:3:"㎔";s:3:"THz";s:3:"㎕";s:5:"μℓ";s:3:"㎖";s:4:"mℓ";s:3:"㎗";s:4:"dℓ";s:3:"㎘";s:4:"kℓ";s:3:"㎙";s:2:"fm";s:3:"㎚";s:2:"nm";s:3:"㎛";s:3:"μm";s:3:"㎜";s:2:"mm";s:3:"㎝";s:2:"cm";s:3:"㎞";s:2:"km";s:3:"㎟";s:4:"mm²";s:3:"㎠";s:4:"cm²";s:3:"㎡";s:3:"m²";s:3:"㎢";s:4:"km²";s:3:"㎣";s:4:"mm³";s:3:"㎤";s:4:"cm³";s:3:"㎥";s:3:"m³";s:3:"㎦";s:4:"km³";s:3:"㎧";s:5:"m∕s";s:3:"㎨";s:7:"m∕s²";s:3:"㎩";s:2:"Pa";s:3:"㎪";s:3:"kPa";s:3:"㎫";s:3:"MPa";s:3:"㎬";s:3:"GPa";s:3:"㎭";s:3:"rad";s:3:"㎮";s:7:"rad∕s";s:3:"㎯";s:9:"rad∕s²";s:3:"㎰";s:2:"ps";s:3:"㎱";s:2:"ns";s:3:"㎲";s:3:"μs";s:3:"㎳";s:2:"ms";s:3:"㎴";s:2:"pV";s:3:"㎵";s:2:"nV";s:3:"㎶";s:3:"μV";s:3:"㎷";s:2:"mV";s:3:"㎸";s:2:"kV";s:3:"㎹";s:2:"MV";s:3:"㎺";s:2:"pW";s:3:"㎻";s:2:"nW";s:3:"㎼";s:3:"μW";s:3:"㎽";s:2:"mW";s:3:"㎾";s:2:"kW";s:3:"㎿";s:2:"MW";s:3:"㏀";s:3:"kΩ";s:3:"㏁";s:3:"MΩ";s:3:"㏂";s:4:"a.m.";s:3:"㏃";s:2:"Bq";s:3:"㏄";s:2:"cc";s:3:"㏅";s:2:"cd";s:3:"㏆";s:6:"C∕kg";s:3:"㏇";s:3:"Co.";s:3:"㏈";s:2:"dB";s:3:"㏉";s:2:"Gy";s:3:"㏊";s:2:"ha";s:3:"㏋";s:2:"HP";s:3:"㏌";s:2:"in";s:3:"㏍";s:2:"KK";s:3:"㏎";s:2:"KM";s:3:"㏏";s:2:"kt";s:3:"㏐";s:2:"lm";s:3:"㏑";s:2:"ln";s:3:"㏒";s:3:"log";s:3:"㏓";s:2:"lx";s:3:"㏔";s:2:"mb";s:3:"㏕";s:3:"mil";s:3:"㏖";s:3:"mol";s:3:"㏗";s:2:"PH";s:3:"㏘";s:4:"p.m.";s:3:"㏙";s:3:"PPM";s:3:"㏚";s:2:"PR";s:3:"㏛";s:2:"sr";s:3:"㏜";s:2:"Sv";s:3:"㏝";s:2:"Wb";s:3:"㏞";s:5:"V∕m";s:3:"㏟";s:5:"A∕m";s:3:"㏠";s:4:"1日";s:3:"㏡";s:4:"2日";s:3:"㏢";s:4:"3日";s:3:"㏣";s:4:"4日";s:3:"㏤";s:4:"5日";s:3:"㏥";s:4:"6日";s:3:"㏦";s:4:"7日";s:3:"㏧";s:4:"8日";s:3:"㏨";s:4:"9日";s:3:"㏩";s:5:"10日";s:3:"㏪";s:5:"11日";s:3:"㏫";s:5:"12日";s:3:"㏬";s:5:"13日";s:3:"㏭";s:5:"14日";s:3:"㏮";s:5:"15日";s:3:"㏯";s:5:"16日";s:3:"㏰";s:5:"17日";s:3:"㏱";s:5:"18日";s:3:"㏲";s:5:"19日";s:3:"㏳";s:5:"20日";s:3:"㏴";s:5:"21日";s:3:"㏵";s:5:"22日";s:3:"㏶";s:5:"23日";s:3:"㏷";s:5:"24日";s:3:"㏸";s:5:"25日";s:3:"㏹";s:5:"26日";s:3:"㏺";s:5:"27日";s:3:"㏻";s:5:"28日";s:3:"㏼";s:5:"29日";s:3:"㏽";s:5:"30日";s:3:"㏾";s:5:"31日";s:3:"㏿";s:3:"gal";s:3:"豈";s:3:"豈";s:3:"更";s:3:"更";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"句";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"喇";s:3:"奈";s:3:"奈";s:3:"懶";s:3:"懶";s:3:"癩";s:3:"癩";s:3:"羅";s:3:"羅";s:3:"蘿";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"邏";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"洛";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"珞";s:3:"落";s:3:"落";s:3:"酪";s:3:"酪";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"卵";s:3:"欄";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"嵐";s:3:"濫";s:3:"濫";s:3:"藍";s:3:"藍";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"蠟";s:3:"廊";s:3:"廊";s:3:"朗";s:3:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"勞";s:3:"擄";s:3:"擄";s:3:"櫓";s:3:"櫓";s:3:"爐";s:3:"爐";s:3:"盧";s:3:"盧";s:3:"老";s:3:"老";s:3:"蘆";s:3:"蘆";s:3:"虜";s:3:"虜";s:3:"路";s:3:"路";s:3:"露";s:3:"露";s:3:"魯";s:3:"魯";s:3:"鷺";s:3:"鷺";s:3:"碌";s:3:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"菉";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"論";s:3:"論";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"籠";s:3:"聾";s:3:"聾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"雷";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"屢";s:3:"樓";s:3:"樓";s:3:"淚";s:3:"淚";s:3:"漏";s:3:"漏";s:3:"累";s:3:"累";s:3:"縷";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"勒";s:3:"肋";s:3:"肋";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"菱";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"拏";s:3:"樂";s:3:"樂";s:3:"諾";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:3:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:3:"異";s:3:"北";s:3:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"不";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"索";s:3:"參";s:3:"參";s:3:"塞";s:3:"塞";s:3:"省";s:3:"省";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:3:"殺";s:3:"辰";s:3:"辰";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:3:"若";s:3:"掠";s:3:"掠";s:3:"略";s:3:"略";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"兩";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"梁";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"諒";s:3:"量";s:3:"量";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"呂";s:3:"女";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"旅";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"閭";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"歷";s:3:"轢";s:3:"轢";s:3:"年";s:3:"年";s:3:"憐";s:3:"憐";s:3:"戀";s:3:"戀";s:3:"撚";s:3:"撚";s:3:"漣";s:3:"漣";s:3:"煉";s:3:"煉";s:3:"璉";s:3:"璉";s:3:"秊";s:3:"秊";s:3:"練";s:3:"練";s:3:"聯";s:3:"聯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"蓮";s:3:"連";s:3:"連";s:3:"鍊";s:3:"鍊";s:3:"列";s:3:"列";s:3:"劣";s:3:"劣";s:3:"咽";s:3:"咽";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"說";s:3:"說";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"捻";s:3:"殮";s:3:"殮";s:3:"簾";s:3:"簾";s:3:"獵";s:3:"獵";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"寧";s:3:"寧";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"瑩";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"聆";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"靈";s:3:"領";s:3:"領";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"尿";s:3:"料";s:3:"料";s:3:"樂";s:3:"樂";s:3:"燎";s:3:"燎";s:3:"療";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"遼";s:3:"龍";s:3:"龍";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"杻";s:3:"柳";s:3:"柳";s:3:"流";s:3:"流";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"琉";s:3:"留";s:3:"留";s:3:"硫";s:3:"硫";s:3:"紐";s:3:"紐";s:3:"類";s:3:"類";s:3:"六";s:3:"六";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"崙";s:3:"淪";s:3:"淪";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"慄";s:3:"栗";s:3:"栗";s:3:"率";s:3:"率";s:3:"隆";s:3:"隆";s:3:"利";s:3:"利";s:3:"吏";s:3:"吏";s:3:"履";s:3:"履";s:3:"易";s:3:"易";s:3:"李";s:3:"李";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"泥";s:3:"理";s:3:"理";s:3:"痢";s:3:"痢";s:3:"罹";s:3:"罹";s:3:"裏";s:3:"裏";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"吝";s:3:"燐";s:3:"燐";s:3:"璘";s:3:"璘";s:3:"藺";s:3:"藺";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"鱗";s:3:"麟";s:3:"麟";s:3:"林";s:3:"林";s:3:"淋";s:3:"淋";s:3:"臨";s:3:"臨";s:3:"立";s:3:"立";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"粒";s:3:"狀";s:3:"狀";s:3:"炙";s:3:"炙";s:3:"識";s:3:"識";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:3:"切";s:3:"度";s:3:"度";s:3:"拓";s:3:"拓";s:3:"糖";s:3:"糖";s:3:"宅";s:3:"宅";s:3:"洞";s:3:"洞";s:3:"暴";s:3:"暴";s:3:"輻";s:3:"輻";s:3:"行";s:3:"行";s:3:"降";s:3:"降";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"兀";s:3:"嗀";s:3:"嗀";s:3:"﨎";s:1:" ";s:3:"﨏";s:1:" ";s:3:"塚";s:3:"塚";s:3:"﨑";s:1:" ";s:3:"晴";s:3:"晴";s:3:"﨓";s:1:" ";s:3:"﨔";s:1:" ";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:3:"福";s:3:"靖";s:3:"靖";s:3:"精";s:3:"精";s:3:"羽";s:3:"羽";s:3:"﨟";s:1:" ";s:3:"蘒";s:3:"蘒";s:3:"﨡";s:1:" ";s:3:"諸";s:3:"諸";s:3:"﨣";s:1:" ";s:3:"﨤";s:1:" ";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"﨧";s:1:" ";s:3:"﨨";s:1:" ";s:3:"﨩";s:1:" ";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"郞";s:3:"郞";s:3:"隷";s:3:"隷";s:3:"侮";s:3:"侮";s:3:"僧";s:3:"僧";s:3:"免";s:3:"免";s:3:"勉";s:3:"勉";s:3:"勤";s:3:"勤";s:3:"卑";s:3:"卑";s:3:"喝";s:3:"喝";s:3:"嘆";s:3:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"塀";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:3:"屮";s:3:"悔";s:3:"悔";s:3:"慨";s:3:"慨";s:3:"憎";s:3:"憎";s:3:"懲";s:3:"懲";s:3:"敏";s:3:"敏";s:3:"既";s:3:"既";s:3:"暑";s:3:"暑";s:3:"梅";s:3:"梅";s:3:"海";s:3:"海";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"漢";s:3:"煮";s:3:"煮";s:3:"爫";s:3:"爫";s:3:"琢";s:3:"琢";s:3:"碑";s:3:"碑";s:3:"社";s:3:"社";s:3:"祉";s:3:"祉";s:3:"祈";s:3:"祈";s:3:"祐";s:3:"祐";s:3:"祖";s:3:"祖";s:3:"祝";s:3:"祝";s:3:"禍";s:3:"禍";s:3:"禎";s:3:"禎";s:3:"穀";s:3:"穀";s:3:"突";s:3:"突";s:3:"節";s:3:"節";s:3:"練";s:3:"練";s:3:"縉";s:3:"縉";s:3:"繁";s:3:"繁";s:3:"署";s:3:"署";s:3:"者";s:3:"者";s:3:"臭";s:3:"臭";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"著";s:3:"著";s:3:"褐";s:3:"褐";s:3:"視";s:3:"視";s:3:"謁";s:3:"謁";s:3:"謹";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"贈";s:3:"贈";s:3:"辶";s:3:"辶";s:3:"逸";s:3:"逸";s:3:"難";s:3:"難";s:3:"響";s:3:"響";s:3:"頻";s:3:"頻";s:3:"恵";s:3:"恵";s:3:"𤋮";s:4:"𤋮";s:3:"舘";s:3:"舘";s:3:"並";s:3:"並";s:3:"况";s:3:"况";s:3:"全";s:3:"全";s:3:"侀";s:3:"侀";s:3:"充";s:3:"充";s:3:"冀";s:3:"冀";s:3:"勇";s:3:"勇";s:3:"勺";s:3:"勺";s:3:"喝";s:3:"喝";s:3:"啕";s:3:"啕";s:3:"喙";s:3:"喙";s:3:"嗢";s:3:"嗢";s:3:"塚";s:3:"塚";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"奔";s:3:"奔";s:3:"婢";s:3:"婢";s:3:"嬨";s:3:"嬨";s:3:"廒";s:3:"廒";s:3:"廙";s:3:"廙";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"徭";s:3:"惘";s:3:"惘";s:3:"慎";s:3:"慎";s:3:"愈";s:3:"愈";s:3:"憎";s:3:"憎";s:3:"慠";s:3:"慠";s:3:"懲";s:3:"懲";s:3:"戴";s:3:"戴";s:3:"揄";s:3:"揄";s:3:"搜";s:3:"搜";s:3:"摒";s:3:"摒";s:3:"敖";s:3:"敖";s:3:"晴";s:3:"晴";s:3:"朗";s:3:"朗";s:3:"望";s:3:"望";s:3:"杖";s:3:"杖";s:3:"歹";s:3:"歹";s:3:"殺";s:3:"殺";s:3:"流";s:3:"流";s:3:"滛";s:3:"滛";s:3:"滋";s:3:"滋";s:3:"漢";s:3:"漢";s:3:"瀞";s:3:"瀞";s:3:"煮";s:3:"煮";s:3:"瞧";s:3:"瞧";s:3:"爵";s:3:"爵";s:3:"犯";s:3:"犯";s:3:"猪";s:3:"猪";s:3:"瑱";s:3:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"画";s:3:"瘝";s:3:"瘝";s:3:"瘟";s:3:"瘟";s:3:"益";s:3:"益";s:3:"盛";s:3:"盛";s:3:"直";s:3:"直";s:3:"睊";s:3:"睊";s:3:"着";s:3:"着";s:3:"磌";s:3:"磌";s:3:"窱";s:3:"窱";s:3:"節";s:3:"節";s:3:"类";s:3:"类";s:3:"絛";s:3:"絛";s:3:"練";s:3:"練";s:3:"缾";s:3:"缾";s:3:"者";s:3:"者";s:3:"荒";s:3:"荒";s:3:"華";s:3:"華";s:3:"蝹";s:3:"蝹";s:3:"襁";s:3:"襁";s:3:"覆";s:3:"覆";s:3:"視";s:3:"視";s:3:"調";s:3:"調";s:3:"諸";s:3:"諸";s:3:"請";s:3:"請";s:3:"謁";s:3:"謁";s:3:"諾";s:3:"諾";s:3:"諭";s:3:"諭";s:3:"謹";s:3:"謹";s:3:"變";s:3:"變";s:3:"贈";s:3:"贈";s:3:"輸";s:3:"輸";s:3:"遲";s:3:"遲";s:3:"醙";s:3:"醙";s:3:"鉶";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"難";s:3:"難";s:3:"靖";s:3:"靖";s:3:"韛";s:3:"韛";s:3:"響";s:3:"響";s:3:"頋";s:3:"頋";s:3:"頻";s:3:"頻";s:3:"鬒";s:3:"鬒";s:3:"龜";s:3:"龜";s:3:"𢡊";s:4:"𢡊";s:3:"𢡄";s:4:"𢡄";s:3:"𣏕";s:4:"𣏕";s:3:"㮝";s:3:"㮝";s:3:"䀘";s:3:"䀘";s:3:"䀹";s:3:"䀹";s:3:"𥉉";s:4:"𥉉";s:3:"𥳐";s:4:"𥳐";s:3:"𧻓";s:4:"𧻓";s:3:"齃";s:3:"齃";s:3:"龎";s:3:"龎";s:3:"ﬀ";s:2:"ff";s:3:"ﬁ";s:2:"fi";s:3:"ﬂ";s:2:"fl";s:3:"ﬃ";s:3:"ffi";s:3:"ﬄ";s:3:"ffl";s:3:"ﬅ";s:3:"ſt";s:3:"ﬆ";s:2:"st";s:3:"ﬓ";s:4:"մն";s:3:"ﬔ";s:4:"մե";s:3:"ﬕ";s:4:"մի";s:3:"ﬖ";s:4:"վն";s:3:"ﬗ";s:4:"մխ";s:3:"ﬠ";s:2:"ע";s:3:"ﬡ";s:2:"א";s:3:"ﬢ";s:2:"ד";s:3:"ﬣ";s:2:"ה";s:3:"ﬤ";s:2:"כ";s:3:"ﬥ";s:2:"ל";s:3:"ﬦ";s:2:"ם";s:3:"ﬧ";s:2:"ר";s:3:"ﬨ";s:2:"ת";s:3:"﬩";s:1:"+";s:3:"ﭏ";s:4:"אל";s:3:"﹉";s:3:"‾";s:3:"﹊";s:3:"‾";s:3:"﹋";s:3:"‾";s:3:"﹌";s:3:"‾";s:3:"﹍";s:1:"_";s:3:"﹎";s:1:"_";s:3:"﹏";s:1:"_";s:3:"﹐";s:1:",";s:3:"﹑";s:3:"、";s:3:"﹒";s:1:".";s:3:"﹔";s:1:";";s:3:"﹕";s:1:":";s:3:"﹖";s:1:"?";s:3:"﹗";s:1:"!";s:3:"﹘";s:3:"—";s:3:"﹙";s:1:"(";s:3:"﹚";s:1:")";s:3:"﹛";s:1:"{";s:3:"﹜";s:1:"}";s:3:"﹝";s:3:"〔";s:3:"﹞";s:3:"〕";s:3:"﹟";s:1:"#";s:3:"﹠";s:1:"&";s:3:"﹡";s:1:"*";s:3:"﹢";s:1:"+";s:3:"﹣";s:1:"-";s:3:"﹤";s:1:"<";s:3:"﹥";s:1:">";s:3:"﹦";s:1:"=";s:3:"﹨";s:1:"\";s:3:"﹩";s:1:"$";s:3:"﹪";s:1:"%";s:3:"﹫";s:1:"@";s:3:"！";s:1:"!";s:3:"＂";s:1:""";s:3:"＃";s:1:"#";s:3:"＄";s:1:"$";s:3:"％";s:1:"%";s:3:"＆";s:1:"&";s:3:"＇";s:1:"'";s:3:"（";s:1:"(";s:3:"）";s:1:")";s:3:"＊";s:1:"*";s:3:"＋";s:1:"+";s:3:"，";s:1:",";s:3:"－";s:1:"-";s:3:"．";s:1:".";s:3:"／";s:1:"/";s:3:"０";s:1:"0";s:3:"１";s:1:"1";s:3:"２";s:1:"2";s:3:"３";s:1:"3";s:3:"４";s:1:"4";s:3:"５";s:1:"5";s:3:"６";s:1:"6";s:3:"７";s:1:"7";s:3:"８";s:1:"8";s:3:"９";s:1:"9";s:3:"：";s:1:":";s:3:"；";s:1:";";s:3:"＜";s:1:"<";s:3:"＝";s:1:"=";s:3:"＞";s:1:">";s:3:"？";s:1:"?";s:3:"＠";s:1:"@";s:3:"Ａ";s:1:"A";s:3:"Ｂ";s:1:"B";s:3:"Ｃ";s:1:"C";s:3:"Ｄ";s:1:"D";s:3:"Ｅ";s:1:"E";s:3:"Ｆ";s:1:"F";s:3:"Ｇ";s:1:"G";s:3:"Ｈ";s:1:"H";s:3:"Ｉ";s:1:"I";s:3:"Ｊ";s:1:"J";s:3:"Ｋ";s:1:"K";s:3:"Ｌ";s:1:"L";s:3:"Ｍ";s:1:"M";s:3:"Ｎ";s:1:"N";s:3:"Ｏ";s:1:"O";s:3:"Ｐ";s:1:"P";s:3:"Ｑ";s:1:"Q";s:3:"Ｒ";s:1:"R";s:3:"Ｓ";s:1:"S";s:3:"Ｔ";s:1:"T";s:3:"Ｕ";s:1:"U";s:3:"Ｖ";s:1:"V";s:3:"Ｗ";s:1:"W";s:3:"Ｘ";s:1:"X";s:3:"Ｙ";s:1:"Y";s:3:"Ｚ";s:1:"Z";s:3:"［";s:1:"[";s:3:"＼";s:1:"\";s:3:"］";s:1:"]";s:3:"＾";s:1:"^";s:3:"＿";s:1:"_";s:3:"｀";s:1:"`";s:3:"ａ";s:1:"a";s:3:"ｂ";s:1:"b";s:3:"ｃ";s:1:"c";s:3:"ｄ";s:1:"d";s:3:"ｅ";s:1:"e";s:3:"ｆ";s:1:"f";s:3:"ｇ";s:1:"g";s:3:"ｈ";s:1:"h";s:3:"ｉ";s:1:"i";s:3:"ｊ";s:1:"j";s:3:"ｋ";s:1:"k";s:3:"ｌ";s:1:"l";s:3:"ｍ";s:1:"m";s:3:"ｎ";s:1:"n";s:3:"ｏ";s:1:"o";s:3:"ｐ";s:1:"p";s:3:"ｑ";s:1:"q";s:3:"ｒ";s:1:"r";s:3:"ｓ";s:1:"s";s:3:"ｔ";s:1:"t";s:3:"ｕ";s:1:"u";s:3:"ｖ";s:1:"v";s:3:"ｗ";s:1:"w";s:3:"ｘ";s:1:"x";s:3:"ｙ";s:1:"y";s:3:"ｚ";s:1:"z";s:3:"｛";s:1:"{";s:3:"｜";s:1:"|";s:3:"｝";s:1:"}";s:3:"～";s:1:"~";s:3:"｟";s:3:"⦅";s:3:"｠";s:3:"⦆";s:3:"｡";s:3:"。";s:3:"｢";s:3:"「";s:3:"｣";s:3:"」";s:3:"､";s:3:"、";s:3:"･";s:3:"・";s:3:"ｦ";s:3:"ヲ";s:3:"ｧ";s:3:"ァ";s:3:"ｨ";s:3:"ィ";s:3:"ｩ";s:3:"ゥ";s:3:"ｪ";s:3:"ェ";s:3:"ｫ";s:3:"ォ";s:3:"ｬ";s:3:"ャ";s:3:"ｭ";s:3:"ュ";s:3:"ｮ";s:3:"ョ";s:3:"ｯ";s:3:"ッ";s:3:"ｰ";s:3:"ー";s:3:"ｱ";s:3:"ア";s:3:"ｲ";s:3:"イ";s:3:"ｳ";s:3:"ウ";s:3:"ｴ";s:3:"エ";s:3:"ｵ";s:3:"オ";s:3:"ｶ";s:3:"カ";s:3:"ｷ";s:3:"キ";s:3:"ｸ";s:3:"ク";s:3:"ｹ";s:3:"ケ";s:3:"ｺ";s:3:"コ";s:3:"ｻ";s:3:"サ";s:3:"ｼ";s:3:"シ";s:3:"ｽ";s:3:"ス";s:3:"ｾ";s:3:"セ";s:3:"ｿ";s:3:"ソ";s:3:"ﾀ";s:3:"タ";s:3:"ﾁ";s:3:"チ";s:3:"ﾂ";s:3:"ツ";s:3:"ﾃ";s:3:"テ";s:3:"ﾄ";s:3:"ト";s:3:"ﾅ";s:3:"ナ";s:3:"ﾆ";s:3:"ニ";s:3:"ﾇ";s:3:"ヌ";s:3:"ﾈ";s:3:"ネ";s:3:"ﾉ";s:3:"ノ";s:3:"ﾊ";s:3:"ハ";s:3:"ﾋ";s:3:"ヒ";s:3:"ﾌ";s:3:"フ";s:3:"ﾍ";s:3:"ヘ";s:3:"ﾎ";s:3:"ホ";s:3:"ﾏ";s:3:"マ";s:3:"ﾐ";s:3:"ミ";s:3:"ﾑ";s:3:"ム";s:3:"ﾒ";s:3:"メ";s:3:"ﾓ";s:3:"モ";s:3:"ﾔ";s:3:"ヤ";s:3:"ﾕ";s:3:"ユ";s:3:"ﾖ";s:3:"ヨ";s:3:"ﾗ";s:3:"ラ";s:3:"ﾘ";s:3:"リ";s:3:"ﾙ";s:3:"ル";s:3:"ﾚ";s:3:"レ";s:3:"ﾛ";s:3:"ロ";s:3:"ﾜ";s:3:"ワ";s:3:"ﾝ";s:3:"ン";s:3:"ﾞ";s:3:"゙";s:3:"ﾟ";s:3:"゚";s:3:"ﾠ";s:3:"ㅤ";s:3:"ﾡ";s:3:"ㄱ";s:3:"ﾢ";s:3:"ㄲ";s:3:"ﾣ";s:3:"ㄳ";s:3:"ﾤ";s:3:"ㄴ";s:3:"ﾥ";s:3:"ㄵ";s:3:"ﾦ";s:3:"ㄶ";s:3:"ﾧ";s:3:"ㄷ";s:3:"ﾨ";s:3:"ㄸ";s:3:"ﾩ";s:3:"ㄹ";s:3:"ﾪ";s:3:"ㄺ";s:3:"ﾫ";s:3:"ㄻ";s:3:"ﾬ";s:3:"ㄼ";s:3:"ﾭ";s:3:"ㄽ";s:3:"ﾮ";s:3:"ㄾ";s:3:"ﾯ";s:3:"ㄿ";s:3:"ﾰ";s:3:"ㅀ";s:3:"ﾱ";s:3:"ㅁ";s:3:"ﾲ";s:3:"ㅂ";s:3:"ﾳ";s:3:"ㅃ";s:3:"ﾴ";s:3:"ㅄ";s:3:"ﾵ";s:3:"ㅅ";s:3:"ﾶ";s:3:"ㅆ";s:3:"ﾷ";s:3:"ㅇ";s:3:"ﾸ";s:3:"ㅈ";s:3:"ﾹ";s:3:"ㅉ";s:3:"ﾺ";s:3:"ㅊ";s:3:"ﾻ";s:3:"ㅋ";s:3:"ﾼ";s:3:"ㅌ";s:3:"ﾽ";s:3:"ㅍ";s:3:"ﾾ";s:3:"ㅎ";s:3:"ￂ";s:3:"ㅏ";s:3:"ￃ";s:3:"ㅐ";s:3:"ￄ";s:3:"ㅑ";s:3:"ￅ";s:3:"ㅒ";s:3:"ￆ";s:3:"ㅓ";s:3:"ￇ";s:3:"ㅔ";s:3:"ￊ";s:3:"ㅕ";s:3:"ￋ";s:3:"ㅖ";s:3:"ￌ";s:3:"ㅗ";s:3:"ￍ";s:3:"ㅘ";s:3:"ￎ";s:3:"ㅙ";s:3:"ￏ";s:3:"ㅚ";s:3:"ￒ";s:3:"ㅛ";s:3:"ￓ";s:3:"ㅜ";s:3:"ￔ";s:3:"ㅝ";s:3:"ￕ";s:3:"ㅞ";s:3:"ￖ";s:3:"ㅟ";s:3:"ￗ";s:3:"ㅠ";s:3:"ￚ";s:3:"ㅡ";s:3:"ￛ";s:3:"ㅢ";s:3:"ￜ";s:3:"ㅣ";s:3:"￠";s:2:"¢";s:3:"￡";s:2:"£";s:3:"￢";s:2:"¬";s:3:"￣";s:2:"¯";s:3:"￤";s:2:"¦";s:3:"￥";s:2:"¥";s:3:"￦";s:3:"₩";s:3:"￨";s:3:"│";s:3:"￩";s:3:"←";s:3:"￪";s:3:"↑";s:3:"￫";s:3:"→";s:3:"￬";s:3:"↓";s:3:"￭";s:3:"■";s:3:"￮";s:3:"○";s:4:"𝐀";s:1:"A";s:4:"𝐁";s:1:"B";s:4:"𝐂";s:1:"C";s:4:"𝐃";s:1:"D";s:4:"𝐄";s:1:"E";s:4:"𝐅";s:1:"F";s:4:"𝐆";s:1:"G";s:4:"𝐇";s:1:"H";s:4:"𝐈";s:1:"I";s:4:"𝐉";s:1:"J";s:4:"𝐊";s:1:"K";s:4:"𝐋";s:1:"L";s:4:"𝐌";s:1:"M";s:4:"𝐍";s:1:"N";s:4:"𝐎";s:1:"O";s:4:"𝐏";s:1:"P";s:4:"𝐐";s:1:"Q";s:4:"𝐑";s:1:"R";s:4:"𝐒";s:1:"S";s:4:"𝐓";s:1:"T";s:4:"𝐔";s:1:"U";s:4:"𝐕";s:1:"V";s:4:"𝐖";s:1:"W";s:4:"𝐗";s:1:"X";s:4:"𝐘";s:1:"Y";s:4:"𝐙";s:1:"Z";s:4:"𝐚";s:1:"a";s:4:"𝐛";s:1:"b";s:4:"𝐜";s:1:"c";s:4:"𝐝";s:1:"d";s:4:"𝐞";s:1:"e";s:4:"𝐟";s:1:"f";s:4:"𝐠";s:1:"g";s:4:"𝐡";s:1:"h";s:4:"𝐢";s:1:"i";s:4:"𝐣";s:1:"j";s:4:"𝐤";s:1:"k";s:4:"𝐥";s:1:"l";s:4:"𝐦";s:1:"m";s:4:"𝐧";s:1:"n";s:4:"𝐨";s:1:"o";s:4:"𝐩";s:1:"p";s:4:"𝐪";s:1:"q";s:4:"𝐫";s:1:"r";s:4:"𝐬";s:1:"s";s:4:"𝐭";s:1:"t";s:4:"𝐮";s:1:"u";s:4:"𝐯";s:1:"v";s:4:"𝐰";s:1:"w";s:4:"𝐱";s:1:"x";s:4:"𝐲";s:1:"y";s:4:"𝐳";s:1:"z";s:4:"𝐴";s:1:"A";s:4:"𝐵";s:1:"B";s:4:"𝐶";s:1:"C";s:4:"𝐷";s:1:"D";s:4:"𝐸";s:1:"E";s:4:"𝐹";s:1:"F";s:4:"𝐺";s:1:"G";s:4:"𝐻";s:1:"H";s:4:"𝐼";s:1:"I";s:4:"𝐽";s:1:"J";s:4:"𝐾";s:1:"K";s:4:"𝐿";s:1:"L";s:4:"𝑀";s:1:"M";s:4:"𝑁";s:1:"N";s:4:"𝑂";s:1:"O";s:4:"𝑃";s:1:"P";s:4:"𝑄";s:1:"Q";s:4:"𝑅";s:1:"R";s:4:"𝑆";s:1:"S";s:4:"𝑇";s:1:"T";s:4:"𝑈";s:1:"U";s:4:"𝑉";s:1:"V";s:4:"𝑊";s:1:"W";s:4:"𝑋";s:1:"X";s:4:"𝑌";s:1:"Y";s:4:"𝑍";s:1:"Z";s:4:"𝑎";s:1:"a";s:4:"𝑏";s:1:"b";s:4:"𝑐";s:1:"c";s:4:"𝑑";s:1:"d";s:4:"𝑒";s:1:"e";s:4:"𝑓";s:1:"f";s:4:"𝑔";s:1:"g";s:4:"𝑖";s:1:"i";s:4:"𝑗";s:1:"j";s:4:"𝑘";s:1:"k";s:4:"𝑙";s:1:"l";s:4:"𝑚";s:1:"m";s:4:"𝑛";s:1:"n";s:4:"𝑜";s:1:"o";s:4:"𝑝";s:1:"p";s:4:"𝑞";s:1:"q";s:4:"𝑟";s:1:"r";s:4:"𝑠";s:1:"s";s:4:"𝑡";s:1:"t";s:4:"𝑢";s:1:"u";s:4:"𝑣";s:1:"v";s:4:"𝑤";s:1:"w";s:4:"𝑥";s:1:"x";s:4:"𝑦";s:1:"y";s:4:"𝑧";s:1:"z";s:4:"𝑨";s:1:"A";s:4:"𝑩";s:1:"B";s:4:"𝑪";s:1:"C";s:4:"𝑫";s:1:"D";s:4:"𝑬";s:1:"E";s:4:"𝑭";s:1:"F";s:4:"𝑮";s:1:"G";s:4:"𝑯";s:1:"H";s:4:"𝑰";s:1:"I";s:4:"𝑱";s:1:"J";s:4:"𝑲";s:1:"K";s:4:"𝑳";s:1:"L";s:4:"𝑴";s:1:"M";s:4:"𝑵";s:1:"N";s:4:"𝑶";s:1:"O";s:4:"𝑷";s:1:"P";s:4:"𝑸";s:1:"Q";s:4:"𝑹";s:1:"R";s:4:"𝑺";s:1:"S";s:4:"𝑻";s:1:"T";s:4:"𝑼";s:1:"U";s:4:"𝑽";s:1:"V";s:4:"𝑾";s:1:"W";s:4:"𝑿";s:1:"X";s:4:"𝒀";s:1:"Y";s:4:"𝒁";s:1:"Z";s:4:"𝒂";s:1:"a";s:4:"𝒃";s:1:"b";s:4:"𝒄";s:1:"c";s:4:"𝒅";s:1:"d";s:4:"𝒆";s:1:"e";s:4:"𝒇";s:1:"f";s:4:"𝒈";s:1:"g";s:4:"𝒉";s:1:"h";s:4:"𝒊";s:1:"i";s:4:"𝒋";s:1:"j";s:4:"𝒌";s:1:"k";s:4:"𝒍";s:1:"l";s:4:"𝒎";s:1:"m";s:4:"𝒏";s:1:"n";s:4:"𝒐";s:1:"o";s:4:"𝒑";s:1:"p";s:4:"𝒒";s:1:"q";s:4:"𝒓";s:1:"r";s:4:"𝒔";s:1:"s";s:4:"𝒕";s:1:"t";s:4:"𝒖";s:1:"u";s:4:"𝒗";s:1:"v";s:4:"𝒘";s:1:"w";s:4:"𝒙";s:1:"x";s:4:"𝒚";s:1:"y";s:4:"𝒛";s:1:"z";s:4:"𝒜";s:1:"A";s:4:"𝒞";s:1:"C";s:4:"𝒟";s:1:"D";s:4:"𝒢";s:1:"G";s:4:"𝒥";s:1:"J";s:4:"𝒦";s:1:"K";s:4:"𝒩";s:1:"N";s:4:"𝒪";s:1:"O";s:4:"𝒫";s:1:"P";s:4:"𝒬";s:1:"Q";s:4:"𝒮";s:1:"S";s:4:"𝒯";s:1:"T";s:4:"𝒰";s:1:"U";s:4:"𝒱";s:1:"V";s:4:"𝒲";s:1:"W";s:4:"𝒳";s:1:"X";s:4:"𝒴";s:1:"Y";s:4:"𝒵";s:1:"Z";s:4:"𝒶";s:1:"a";s:4:"𝒷";s:1:"b";s:4:"𝒸";s:1:"c";s:4:"𝒹";s:1:"d";s:4:"𝒻";s:1:"f";s:4:"𝒽";s:1:"h";s:4:"𝒾";s:1:"i";s:4:"𝒿";s:1:"j";s:4:"𝓀";s:1:"k";s:4:"𝓁";s:1:"l";s:4:"𝓂";s:1:"m";s:4:"𝓃";s:1:"n";s:4:"𝓅";s:1:"p";s:4:"𝓆";s:1:"q";s:4:"𝓇";s:1:"r";s:4:"𝓈";s:1:"s";s:4:"𝓉";s:1:"t";s:4:"𝓊";s:1:"u";s:4:"𝓋";s:1:"v";s:4:"𝓌";s:1:"w";s:4:"𝓍";s:1:"x";s:4:"𝓎";s:1:"y";s:4:"𝓏";s:1:"z";s:4:"𝓐";s:1:"A";s:4:"𝓑";s:1:"B";s:4:"𝓒";s:1:"C";s:4:"𝓓";s:1:"D";s:4:"𝓔";s:1:"E";s:4:"𝓕";s:1:"F";s:4:"𝓖";s:1:"G";s:4:"𝓗";s:1:"H";s:4:"𝓘";s:1:"I";s:4:"𝓙";s:1:"J";s:4:"𝓚";s:1:"K";s:4:"𝓛";s:1:"L";s:4:"𝓜";s:1:"M";s:4:"𝓝";s:1:"N";s:4:"𝓞";s:1:"O";s:4:"𝓟";s:1:"P";s:4:"𝓠";s:1:"Q";s:4:"𝓡";s:1:"R";s:4:"𝓢";s:1:"S";s:4:"𝓣";s:1:"T";s:4:"𝓤";s:1:"U";s:4:"𝓥";s:1:"V";s:4:"𝓦";s:1:"W";s:4:"𝓧";s:1:"X";s:4:"𝓨";s:1:"Y";s:4:"𝓩";s:1:"Z";s:4:"𝓪";s:1:"a";s:4:"𝓫";s:1:"b";s:4:"𝓬";s:1:"c";s:4:"𝓭";s:1:"d";s:4:"𝓮";s:1:"e";s:4:"𝓯";s:1:"f";s:4:"𝓰";s:1:"g";s:4:"𝓱";s:1:"h";s:4:"𝓲";s:1:"i";s:4:"𝓳";s:1:"j";s:4:"𝓴";s:1:"k";s:4:"𝓵";s:1:"l";s:4:"𝓶";s:1:"m";s:4:"𝓷";s:1:"n";s:4:"𝓸";s:1:"o";s:4:"𝓹";s:1:"p";s:4:"𝓺";s:1:"q";s:4:"𝓻";s:1:"r";s:4:"𝓼";s:1:"s";s:4:"𝓽";s:1:"t";s:4:"𝓾";s:1:"u";s:4:"𝓿";s:1:"v";s:4:"𝔀";s:1:"w";s:4:"𝔁";s:1:"x";s:4:"𝔂";s:1:"y";s:4:"𝔃";s:1:"z";s:4:"𝔄";s:1:"A";s:4:"𝔅";s:1:"B";s:4:"𝔇";s:1:"D";s:4:"𝔈";s:1:"E";s:4:"𝔉";s:1:"F";s:4:"𝔊";s:1:"G";s:4:"𝔍";s:1:"J";s:4:"𝔎";s:1:"K";s:4:"𝔏";s:1:"L";s:4:"𝔐";s:1:"M";s:4:"𝔑";s:1:"N";s:4:"𝔒";s:1:"O";s:4:"𝔓";s:1:"P";s:4:"𝔔";s:1:"Q";s:4:"𝔖";s:1:"S";s:4:"𝔗";s:1:"T";s:4:"𝔘";s:1:"U";s:4:"𝔙";s:1:"V";s:4:"𝔚";s:1:"W";s:4:"𝔛";s:1:"X";s:4:"𝔜";s:1:"Y";s:4:"𝔞";s:1:"a";s:4:"𝔟";s:1:"b";s:4:"𝔠";s:1:"c";s:4:"𝔡";s:1:"d";s:4:"𝔢";s:1:"e";s:4:"𝔣";s:1:"f";s:4:"𝔤";s:1:"g";s:4:"𝔥";s:1:"h";s:4:"𝔦";s:1:"i";s:4:"𝔧";s:1:"j";s:4:"𝔨";s:1:"k";s:4:"𝔩";s:1:"l";s:4:"𝔪";s:1:"m";s:4:"𝔫";s:1:"n";s:4:"𝔬";s:1:"o";s:4:"𝔭";s:1:"p";s:4:"𝔮";s:1:"q";s:4:"𝔯";s:1:"r";s:4:"𝔰";s:1:"s";s:4:"𝔱";s:1:"t";s:4:"𝔲";s:1:"u";s:4:"𝔳";s:1:"v";s:4:"𝔴";s:1:"w";s:4:"𝔵";s:1:"x";s:4:"𝔶";s:1:"y";s:4:"𝔷";s:1:"z";s:4:"𝔸";s:1:"A";s:4:"𝔹";s:1:"B";s:4:"𝔻";s:1:"D";s:4:"𝔼";s:1:"E";s:4:"𝔽";s:1:"F";s:4:"𝔾";s:1:"G";s:4:"𝕀";s:1:"I";s:4:"𝕁";s:1:"J";s:4:"𝕂";s:1:"K";s:4:"𝕃";s:1:"L";s:4:"𝕄";s:1:"M";s:4:"𝕆";s:1:"O";s:4:"𝕊";s:1:"S";s:4:"𝕋";s:1:"T";s:4:"𝕌";s:1:"U";s:4:"𝕍";s:1:"V";s:4:"𝕎";s:1:"W";s:4:"𝕏";s:1:"X";s:4:"𝕐";s:1:"Y";s:4:"𝕒";s:1:"a";s:4:"𝕓";s:1:"b";s:4:"𝕔";s:1:"c";s:4:"𝕕";s:1:"d";s:4:"𝕖";s:1:"e";s:4:"𝕗";s:1:"f";s:4:"𝕘";s:1:"g";s:4:"𝕙";s:1:"h";s:4:"𝕚";s:1:"i";s:4:"𝕛";s:1:"j";s:4:"𝕜";s:1:"k";s:4:"𝕝";s:1:"l";s:4:"𝕞";s:1:"m";s:4:"𝕟";s:1:"n";s:4:"𝕠";s:1:"o";s:4:"𝕡";s:1:"p";s:4:"𝕢";s:1:"q";s:4:"𝕣";s:1:"r";s:4:"𝕤";s:1:"s";s:4:"𝕥";s:1:"t";s:4:"𝕦";s:1:"u";s:4:"𝕧";s:1:"v";s:4:"𝕨";s:1:"w";s:4:"𝕩";s:1:"x";s:4:"𝕪";s:1:"y";s:4:"𝕫";s:1:"z";s:4:"𝕬";s:1:"A";s:4:"𝕭";s:1:"B";s:4:"𝕮";s:1:"C";s:4:"𝕯";s:1:"D";s:4:"𝕰";s:1:"E";s:4:"𝕱";s:1:"F";s:4:"𝕲";s:1:"G";s:4:"𝕳";s:1:"H";s:4:"𝕴";s:1:"I";s:4:"𝕵";s:1:"J";s:4:"𝕶";s:1:"K";s:4:"𝕷";s:1:"L";s:4:"𝕸";s:1:"M";s:4:"𝕹";s:1:"N";s:4:"𝕺";s:1:"O";s:4:"𝕻";s:1:"P";s:4:"𝕼";s:1:"Q";s:4:"𝕽";s:1:"R";s:4:"𝕾";s:1:"S";s:4:"𝕿";s:1:"T";s:4:"𝖀";s:1:"U";s:4:"𝖁";s:1:"V";s:4:"𝖂";s:1:"W";s:4:"𝖃";s:1:"X";s:4:"𝖄";s:1:"Y";s:4:"𝖅";s:1:"Z";s:4:"𝖆";s:1:"a";s:4:"𝖇";s:1:"b";s:4:"𝖈";s:1:"c";s:4:"𝖉";s:1:"d";s:4:"𝖊";s:1:"e";s:4:"𝖋";s:1:"f";s:4:"𝖌";s:1:"g";s:4:"𝖍";s:1:"h";s:4:"𝖎";s:1:"i";s:4:"𝖏";s:1:"j";s:4:"𝖐";s:1:"k";s:4:"𝖑";s:1:"l";s:4:"𝖒";s:1:"m";s:4:"𝖓";s:1:"n";s:4:"𝖔";s:1:"o";s:4:"𝖕";s:1:"p";s:4:"𝖖";s:1:"q";s:4:"𝖗";s:1:"r";s:4:"𝖘";s:1:"s";s:4:"𝖙";s:1:"t";s:4:"𝖚";s:1:"u";s:4:"𝖛";s:1:"v";s:4:"𝖜";s:1:"w";s:4:"𝖝";s:1:"x";s:4:"𝖞";s:1:"y";s:4:"𝖟";s:1:"z";s:4:"𝖠";s:1:"A";s:4:"𝖡";s:1:"B";s:4:"𝖢";s:1:"C";s:4:"𝖣";s:1:"D";s:4:"𝖤";s:1:"E";s:4:"𝖥";s:1:"F";s:4:"𝖦";s:1:"G";s:4:"𝖧";s:1:"H";s:4:"𝖨";s:1:"I";s:4:"𝖩";s:1:"J";s:4:"𝖪";s:1:"K";s:4:"𝖫";s:1:"L";s:4:"𝖬";s:1:"M";s:4:"𝖭";s:1:"N";s:4:"𝖮";s:1:"O";s:4:"𝖯";s:1:"P";s:4:"𝖰";s:1:"Q";s:4:"𝖱";s:1:"R";s:4:"𝖲";s:1:"S";s:4:"𝖳";s:1:"T";s:4:"𝖴";s:1:"U";s:4:"𝖵";s:1:"V";s:4:"𝖶";s:1:"W";s:4:"𝖷";s:1:"X";s:4:"𝖸";s:1:"Y";s:4:"𝖹";s:1:"Z";s:4:"𝖺";s:1:"a";s:4:"𝖻";s:1:"b";s:4:"𝖼";s:1:"c";s:4:"𝖽";s:1:"d";s:4:"𝖾";s:1:"e";s:4:"𝖿";s:1:"f";s:4:"𝗀";s:1:"g";s:4:"𝗁";s:1:"h";s:4:"𝗂";s:1:"i";s:4:"𝗃";s:1:"j";s:4:"𝗄";s:1:"k";s:4:"𝗅";s:1:"l";s:4:"𝗆";s:1:"m";s:4:"𝗇";s:1:"n";s:4:"𝗈";s:1:"o";s:4:"𝗉";s:1:"p";s:4:"𝗊";s:1:"q";s:4:"𝗋";s:1:"r";s:4:"𝗌";s:1:"s";s:4:"𝗍";s:1:"t";s:4:"𝗎";s:1:"u";s:4:"𝗏";s:1:"v";s:4:"𝗐";s:1:"w";s:4:"𝗑";s:1:"x";s:4:"𝗒";s:1:"y";s:4:"𝗓";s:1:"z";s:4:"𝗔";s:1:"A";s:4:"𝗕";s:1:"B";s:4:"𝗖";s:1:"C";s:4:"𝗗";s:1:"D";s:4:"𝗘";s:1:"E";s:4:"𝗙";s:1:"F";s:4:"𝗚";s:1:"G";s:4:"𝗛";s:1:"H";s:4:"𝗜";s:1:"I";s:4:"𝗝";s:1:"J";s:4:"𝗞";s:1:"K";s:4:"𝗟";s:1:"L";s:4:"𝗠";s:1:"M";s:4:"𝗡";s:1:"N";s:4:"𝗢";s:1:"O";s:4:"𝗣";s:1:"P";s:4:"𝗤";s:1:"Q";s:4:"𝗥";s:1:"R";s:4:"𝗦";s:1:"S";s:4:"𝗧";s:1:"T";s:4:"𝗨";s:1:"U";s:4:"𝗩";s:1:"V";s:4:"𝗪";s:1:"W";s:4:"𝗫";s:1:"X";s:4:"𝗬";s:1:"Y";s:4:"𝗭";s:1:"Z";s:4:"𝗮";s:1:"a";s:4:"𝗯";s:1:"b";s:4:"𝗰";s:1:"c";s:4:"𝗱";s:1:"d";s:4:"𝗲";s:1:"e";s:4:"𝗳";s:1:"f";s:4:"𝗴";s:1:"g";s:4:"𝗵";s:1:"h";s:4:"𝗶";s:1:"i";s:4:"𝗷";s:1:"j";s:4:"𝗸";s:1:"k";s:4:"𝗹";s:1:"l";s:4:"𝗺";s:1:"m";s:4:"𝗻";s:1:"n";s:4:"𝗼";s:1:"o";s:4:"𝗽";s:1:"p";s:4:"𝗾";s:1:"q";s:4:"𝗿";s:1:"r";s:4:"𝘀";s:1:"s";s:4:"𝘁";s:1:"t";s:4:"𝘂";s:1:"u";s:4:"𝘃";s:1:"v";s:4:"𝘄";s:1:"w";s:4:"𝘅";s:1:"x";s:4:"𝘆";s:1:"y";s:4:"𝘇";s:1:"z";s:4:"𝘈";s:1:"A";s:4:"𝘉";s:1:"B";s:4:"𝘊";s:1:"C";s:4:"𝘋";s:1:"D";s:4:"𝘌";s:1:"E";s:4:"𝘍";s:1:"F";s:4:"𝘎";s:1:"G";s:4:"𝘏";s:1:"H";s:4:"𝘐";s:1:"I";s:4:"𝘑";s:1:"J";s:4:"𝘒";s:1:"K";s:4:"𝘓";s:1:"L";s:4:"𝘔";s:1:"M";s:4:"𝘕";s:1:"N";s:4:"𝘖";s:1:"O";s:4:"𝘗";s:1:"P";s:4:"𝘘";s:1:"Q";s:4:"𝘙";s:1:"R";s:4:"𝘚";s:1:"S";s:4:"𝘛";s:1:"T";s:4:"𝘜";s:1:"U";s:4:"𝘝";s:1:"V";s:4:"𝘞";s:1:"W";s:4:"𝘟";s:1:"X";s:4:"𝘠";s:1:"Y";s:4:"𝘡";s:1:"Z";s:4:"𝘢";s:1:"a";s:4:"𝘣";s:1:"b";s:4:"𝘤";s:1:"c";s:4:"𝘥";s:1:"d";s:4:"𝘦";s:1:"e";s:4:"𝘧";s:1:"f";s:4:"𝘨";s:1:"g";s:4:"𝘩";s:1:"h";s:4:"𝘪";s:1:"i";s:4:"𝘫";s:1:"j";s:4:"𝘬";s:1:"k";s:4:"𝘭";s:1:"l";s:4:"𝘮";s:1:"m";s:4:"𝘯";s:1:"n";s:4:"𝘰";s:1:"o";s:4:"𝘱";s:1:"p";s:4:"𝘲";s:1:"q";s:4:"𝘳";s:1:"r";s:4:"𝘴";s:1:"s";s:4:"𝘵";s:1:"t";s:4:"𝘶";s:1:"u";s:4:"𝘷";s:1:"v";s:4:"𝘸";s:1:"w";s:4:"𝘹";s:1:"x";s:4:"𝘺";s:1:"y";s:4:"𝘻";s:1:"z";s:4:"𝘼";s:1:"A";s:4:"𝘽";s:1:"B";s:4:"𝘾";s:1:"C";s:4:"𝘿";s:1:"D";s:4:"𝙀";s:1:"E";s:4:"𝙁";s:1:"F";s:4:"𝙂";s:1:"G";s:4:"𝙃";s:1:"H";s:4:"𝙄";s:1:"I";s:4:"𝙅";s:1:"J";s:4:"𝙆";s:1:"K";s:4:"𝙇";s:1:"L";s:4:"𝙈";s:1:"M";s:4:"𝙉";s:1:"N";s:4:"𝙊";s:1:"O";s:4:"𝙋";s:1:"P";s:4:"𝙌";s:1:"Q";s:4:"𝙍";s:1:"R";s:4:"𝙎";s:1:"S";s:4:"𝙏";s:1:"T";s:4:"𝙐";s:1:"U";s:4:"𝙑";s:1:"V";s:4:"𝙒";s:1:"W";s:4:"𝙓";s:1:"X";s:4:"𝙔";s:1:"Y";s:4:"𝙕";s:1:"Z";s:4:"𝙖";s:1:"a";s:4:"𝙗";s:1:"b";s:4:"𝙘";s:1:"c";s:4:"𝙙";s:1:"d";s:4:"𝙚";s:1:"e";s:4:"𝙛";s:1:"f";s:4:"𝙜";s:1:"g";s:4:"𝙝";s:1:"h";s:4:"𝙞";s:1:"i";s:4:"𝙟";s:1:"j";s:4:"𝙠";s:1:"k";s:4:"𝙡";s:1:"l";s:4:"𝙢";s:1:"m";s:4:"𝙣";s:1:"n";s:4:"𝙤";s:1:"o";s:4:"𝙥";s:1:"p";s:4:"𝙦";s:1:"q";s:4:"𝙧";s:1:"r";s:4:"𝙨";s:1:"s";s:4:"𝙩";s:1:"t";s:4:"𝙪";s:1:"u";s:4:"𝙫";s:1:"v";s:4:"𝙬";s:1:"w";s:4:"𝙭";s:1:"x";s:4:"𝙮";s:1:"y";s:4:"𝙯";s:1:"z";s:4:"𝙰";s:1:"A";s:4:"𝙱";s:1:"B";s:4:"𝙲";s:1:"C";s:4:"𝙳";s:1:"D";s:4:"𝙴";s:1:"E";s:4:"𝙵";s:1:"F";s:4:"𝙶";s:1:"G";s:4:"𝙷";s:1:"H";s:4:"𝙸";s:1:"I";s:4:"𝙹";s:1:"J";s:4:"𝙺";s:1:"K";s:4:"𝙻";s:1:"L";s:4:"𝙼";s:1:"M";s:4:"𝙽";s:1:"N";s:4:"𝙾";s:1:"O";s:4:"𝙿";s:1:"P";s:4:"𝚀";s:1:"Q";s:4:"𝚁";s:1:"R";s:4:"𝚂";s:1:"S";s:4:"𝚃";s:1:"T";s:4:"𝚄";s:1:"U";s:4:"𝚅";s:1:"V";s:4:"𝚆";s:1:"W";s:4:"𝚇";s:1:"X";s:4:"𝚈";s:1:"Y";s:4:"𝚉";s:1:"Z";s:4:"𝚊";s:1:"a";s:4:"𝚋";s:1:"b";s:4:"𝚌";s:1:"c";s:4:"𝚍";s:1:"d";s:4:"𝚎";s:1:"e";s:4:"𝚏";s:1:"f";s:4:"𝚐";s:1:"g";s:4:"𝚑";s:1:"h";s:4:"𝚒";s:1:"i";s:4:"𝚓";s:1:"j";s:4:"𝚔";s:1:"k";s:4:"𝚕";s:1:"l";s:4:"𝚖";s:1:"m";s:4:"𝚗";s:1:"n";s:4:"𝚘";s:1:"o";s:4:"𝚙";s:1:"p";s:4:"𝚚";s:1:"q";s:4:"𝚛";s:1:"r";s:4:"𝚜";s:1:"s";s:4:"𝚝";s:1:"t";s:4:"𝚞";s:1:"u";s:4:"𝚟";s:1:"v";s:4:"𝚠";s:1:"w";s:4:"𝚡";s:1:"x";s:4:"𝚢";s:1:"y";s:4:"𝚣";s:1:"z";s:4:"𝚤";s:2:"ı";s:4:"𝚥";s:2:"ȷ";s:4:"𝚨";s:2:"Α";s:4:"𝚩";s:2:"Β";s:4:"𝚪";s:2:"Γ";s:4:"𝚫";s:2:"Δ";s:4:"𝚬";s:2:"Ε";s:4:"𝚭";s:2:"Ζ";s:4:"𝚮";s:2:"Η";s:4:"𝚯";s:2:"Θ";s:4:"𝚰";s:2:"Ι";s:4:"𝚱";s:2:"Κ";s:4:"𝚲";s:2:"Λ";s:4:"𝚳";s:2:"Μ";s:4:"𝚴";s:2:"Ν";s:4:"𝚵";s:2:"Ξ";s:4:"𝚶";s:2:"Ο";s:4:"𝚷";s:2:"Π";s:4:"𝚸";s:2:"Ρ";s:4:"𝚹";s:2:"ϴ";s:4:"𝚺";s:2:"Σ";s:4:"𝚻";s:2:"Τ";s:4:"𝚼";s:2:"Υ";s:4:"𝚽";s:2:"Φ";s:4:"𝚾";s:2:"Χ";s:4:"𝚿";s:2:"Ψ";s:4:"𝛀";s:2:"Ω";s:4:"𝛁";s:3:"∇";s:4:"𝛂";s:2:"α";s:4:"𝛃";s:2:"β";s:4:"𝛄";s:2:"γ";s:4:"𝛅";s:2:"δ";s:4:"𝛆";s:2:"ε";s:4:"𝛇";s:2:"ζ";s:4:"𝛈";s:2:"η";s:4:"𝛉";s:2:"θ";s:4:"𝛊";s:2:"ι";s:4:"𝛋";s:2:"κ";s:4:"𝛌";s:2:"λ";s:4:"𝛍";s:2:"μ";s:4:"𝛎";s:2:"ν";s:4:"𝛏";s:2:"ξ";s:4:"𝛐";s:2:"ο";s:4:"𝛑";s:2:"π";s:4:"𝛒";s:2:"ρ";s:4:"𝛓";s:2:"ς";s:4:"𝛔";s:2:"σ";s:4:"𝛕";s:2:"τ";s:4:"𝛖";s:2:"υ";s:4:"𝛗";s:2:"φ";s:4:"𝛘";s:2:"χ";s:4:"𝛙";s:2:"ψ";s:4:"𝛚";s:2:"ω";s:4:"𝛛";s:3:"∂";s:4:"𝛜";s:2:"ϵ";s:4:"𝛝";s:2:"ϑ";s:4:"𝛞";s:2:"ϰ";s:4:"𝛟";s:2:"ϕ";s:4:"𝛠";s:2:"ϱ";s:4:"𝛡";s:2:"ϖ";s:4:"𝛢";s:2:"Α";s:4:"𝛣";s:2:"Β";s:4:"𝛤";s:2:"Γ";s:4:"𝛥";s:2:"Δ";s:4:"𝛦";s:2:"Ε";s:4:"𝛧";s:2:"Ζ";s:4:"𝛨";s:2:"Η";s:4:"𝛩";s:2:"Θ";s:4:"𝛪";s:2:"Ι";s:4:"𝛫";s:2:"Κ";s:4:"𝛬";s:2:"Λ";s:4:"𝛭";s:2:"Μ";s:4:"𝛮";s:2:"Ν";s:4:"𝛯";s:2:"Ξ";s:4:"𝛰";s:2:"Ο";s:4:"𝛱";s:2:"Π";s:4:"𝛲";s:2:"Ρ";s:4:"𝛳";s:2:"ϴ";s:4:"𝛴";s:2:"Σ";s:4:"𝛵";s:2:"Τ";s:4:"𝛶";s:2:"Υ";s:4:"𝛷";s:2:"Φ";s:4:"𝛸";s:2:"Χ";s:4:"𝛹";s:2:"Ψ";s:4:"𝛺";s:2:"Ω";s:4:"𝛻";s:3:"∇";s:4:"𝛼";s:2:"α";s:4:"𝛽";s:2:"β";s:4:"𝛾";s:2:"γ";s:4:"𝛿";s:2:"δ";s:4:"𝜀";s:2:"ε";s:4:"𝜁";s:2:"ζ";s:4:"𝜂";s:2:"η";s:4:"𝜃";s:2:"θ";s:4:"𝜄";s:2:"ι";s:4:"𝜅";s:2:"κ";s:4:"𝜆";s:2:"λ";s:4:"𝜇";s:2:"μ";s:4:"𝜈";s:2:"ν";s:4:"𝜉";s:2:"ξ";s:4:"𝜊";s:2:"ο";s:4:"𝜋";s:2:"π";s:4:"𝜌";s:2:"ρ";s:4:"𝜍";s:2:"ς";s:4:"𝜎";s:2:"σ";s:4:"𝜏";s:2:"τ";s:4:"𝜐";s:2:"υ";s:4:"𝜑";s:2:"φ";s:4:"𝜒";s:2:"χ";s:4:"𝜓";s:2:"ψ";s:4:"𝜔";s:2:"ω";s:4:"𝜕";s:3:"∂";s:4:"𝜖";s:2:"ϵ";s:4:"𝜗";s:2:"ϑ";s:4:"𝜘";s:2:"ϰ";s:4:"𝜙";s:2:"ϕ";s:4:"𝜚";s:2:"ϱ";s:4:"𝜛";s:2:"ϖ";s:4:"𝜜";s:2:"Α";s:4:"𝜝";s:2:"Β";s:4:"𝜞";s:2:"Γ";s:4:"𝜟";s:2:"Δ";s:4:"𝜠";s:2:"Ε";s:4:"𝜡";s:2:"Ζ";s:4:"𝜢";s:2:"Η";s:4:"𝜣";s:2:"Θ";s:4:"𝜤";s:2:"Ι";s:4:"𝜥";s:2:"Κ";s:4:"𝜦";s:2:"Λ";s:4:"𝜧";s:2:"Μ";s:4:"𝜨";s:2:"Ν";s:4:"𝜩";s:2:"Ξ";s:4:"𝜪";s:2:"Ο";s:4:"𝜫";s:2:"Π";s:4:"𝜬";s:2:"Ρ";s:4:"𝜭";s:2:"ϴ";s:4:"𝜮";s:2:"Σ";s:4:"𝜯";s:2:"Τ";s:4:"𝜰";s:2:"Υ";s:4:"𝜱";s:2:"Φ";s:4:"𝜲";s:2:"Χ";s:4:"𝜳";s:2:"Ψ";s:4:"𝜴";s:2:"Ω";s:4:"𝜵";s:3:"∇";s:4:"𝜶";s:2:"α";s:4:"𝜷";s:2:"β";s:4:"𝜸";s:2:"γ";s:4:"𝜹";s:2:"δ";s:4:"𝜺";s:2:"ε";s:4:"𝜻";s:2:"ζ";s:4:"𝜼";s:2:"η";s:4:"𝜽";s:2:"θ";s:4:"𝜾";s:2:"ι";s:4:"𝜿";s:2:"κ";s:4:"𝝀";s:2:"λ";s:4:"𝝁";s:2:"μ";s:4:"𝝂";s:2:"ν";s:4:"𝝃";s:2:"ξ";s:4:"𝝄";s:2:"ο";s:4:"𝝅";s:2:"π";s:4:"𝝆";s:2:"ρ";s:4:"𝝇";s:2:"ς";s:4:"𝝈";s:2:"σ";s:4:"𝝉";s:2:"τ";s:4:"𝝊";s:2:"υ";s:4:"𝝋";s:2:"φ";s:4:"𝝌";s:2:"χ";s:4:"𝝍";s:2:"ψ";s:4:"𝝎";s:2:"ω";s:4:"𝝏";s:3:"∂";s:4:"𝝐";s:2:"ϵ";s:4:"𝝑";s:2:"ϑ";s:4:"𝝒";s:2:"ϰ";s:4:"𝝓";s:2:"ϕ";s:4:"𝝔";s:2:"ϱ";s:4:"𝝕";s:2:"ϖ";s:4:"𝝖";s:2:"Α";s:4:"𝝗";s:2:"Β";s:4:"𝝘";s:2:"Γ";s:4:"𝝙";s:2:"Δ";s:4:"𝝚";s:2:"Ε";s:4:"𝝛";s:2:"Ζ";s:4:"𝝜";s:2:"Η";s:4:"𝝝";s:2:"Θ";s:4:"𝝞";s:2:"Ι";s:4:"𝝟";s:2:"Κ";s:4:"𝝠";s:2:"Λ";s:4:"𝝡";s:2:"Μ";s:4:"𝝢";s:2:"Ν";s:4:"𝝣";s:2:"Ξ";s:4:"𝝤";s:2:"Ο";s:4:"𝝥";s:2:"Π";s:4:"𝝦";s:2:"Ρ";s:4:"𝝧";s:2:"ϴ";s:4:"𝝨";s:2:"Σ";s:4:"𝝩";s:2:"Τ";s:4:"𝝪";s:2:"Υ";s:4:"𝝫";s:2:"Φ";s:4:"𝝬";s:2:"Χ";s:4:"𝝭";s:2:"Ψ";s:4:"𝝮";s:2:"Ω";s:4:"𝝯";s:3:"∇";s:4:"𝝰";s:2:"α";s:4:"𝝱";s:2:"β";s:4:"𝝲";s:2:"γ";s:4:"𝝳";s:2:"δ";s:4:"𝝴";s:2:"ε";s:4:"𝝵";s:2:"ζ";s:4:"𝝶";s:2:"η";s:4:"𝝷";s:2:"θ";s:4:"𝝸";s:2:"ι";s:4:"𝝹";s:2:"κ";s:4:"𝝺";s:2:"λ";s:4:"𝝻";s:2:"μ";s:4:"𝝼";s:2:"ν";s:4:"𝝽";s:2:"ξ";s:4:"𝝾";s:2:"ο";s:4:"𝝿";s:2:"π";s:4:"𝞀";s:2:"ρ";s:4:"𝞁";s:2:"ς";s:4:"𝞂";s:2:"σ";s:4:"𝞃";s:2:"τ";s:4:"𝞄";s:2:"υ";s:4:"𝞅";s:2:"φ";s:4:"𝞆";s:2:"χ";s:4:"𝞇";s:2:"ψ";s:4:"𝞈";s:2:"ω";s:4:"𝞉";s:3:"∂";s:4:"𝞊";s:2:"ϵ";s:4:"𝞋";s:2:"ϑ";s:4:"𝞌";s:2:"ϰ";s:4:"𝞍";s:2:"ϕ";s:4:"𝞎";s:2:"ϱ";s:4:"𝞏";s:2:"ϖ";s:4:"𝞐";s:2:"Α";s:4:"𝞑";s:2:"Β";s:4:"𝞒";s:2:"Γ";s:4:"𝞓";s:2:"Δ";s:4:"𝞔";s:2:"Ε";s:4:"𝞕";s:2:"Ζ";s:4:"𝞖";s:2:"Η";s:4:"𝞗";s:2:"Θ";s:4:"𝞘";s:2:"Ι";s:4:"𝞙";s:2:"Κ";s:4:"𝞚";s:2:"Λ";s:4:"𝞛";s:2:"Μ";s:4:"𝞜";s:2:"Ν";s:4:"𝞝";s:2:"Ξ";s:4:"𝞞";s:2:"Ο";s:4:"𝞟";s:2:"Π";s:4:"𝞠";s:2:"Ρ";s:4:"𝞡";s:2:"ϴ";s:4:"𝞢";s:2:"Σ";s:4:"𝞣";s:2:"Τ";s:4:"𝞤";s:2:"Υ";s:4:"𝞥";s:2:"Φ";s:4:"𝞦";s:2:"Χ";s:4:"𝞧";s:2:"Ψ";s:4:"𝞨";s:2:"Ω";s:4:"𝞩";s:3:"∇";s:4:"𝞪";s:2:"α";s:4:"𝞫";s:2:"β";s:4:"𝞬";s:2:"γ";s:4:"𝞭";s:2:"δ";s:4:"𝞮";s:2:"ε";s:4:"𝞯";s:2:"ζ";s:4:"𝞰";s:2:"η";s:4:"𝞱";s:2:"θ";s:4:"𝞲";s:2:"ι";s:4:"𝞳";s:2:"κ";s:4:"𝞴";s:2:"λ";s:4:"𝞵";s:2:"μ";s:4:"𝞶";s:2:"ν";s:4:"𝞷";s:2:"ξ";s:4:"𝞸";s:2:"ο";s:4:"𝞹";s:2:"π";s:4:"𝞺";s:2:"ρ";s:4:"𝞻";s:2:"ς";s:4:"𝞼";s:2:"σ";s:4:"𝞽";s:2:"τ";s:4:"𝞾";s:2:"υ";s:4:"𝞿";s:2:"φ";s:4:"𝟀";s:2:"χ";s:4:"𝟁";s:2:"ψ";s:4:"𝟂";s:2:"ω";s:4:"𝟃";s:3:"∂";s:4:"𝟄";s:2:"ϵ";s:4:"𝟅";s:2:"ϑ";s:4:"𝟆";s:2:"ϰ";s:4:"𝟇";s:2:"ϕ";s:4:"𝟈";s:2:"ϱ";s:4:"𝟉";s:2:"ϖ";s:4:"𝟊";s:2:"Ϝ";s:4:"𝟋";s:2:"ϝ";s:4:"𝟎";s:1:"0";s:4:"𝟏";s:1:"1";s:4:"𝟐";s:1:"2";s:4:"𝟑";s:1:"3";s:4:"𝟒";s:1:"4";s:4:"𝟓";s:1:"5";s:4:"𝟔";s:1:"6";s:4:"𝟕";s:1:"7";s:4:"𝟖";s:1:"8";s:4:"𝟗";s:1:"9";s:4:"𝟘";s:1:"0";s:4:"𝟙";s:1:"1";s:4:"𝟚";s:1:"2";s:4:"𝟛";s:1:"3";s:4:"𝟜";s:1:"4";s:4:"𝟝";s:1:"5";s:4:"𝟞";s:1:"6";s:4:"𝟟";s:1:"7";s:4:"𝟠";s:1:"8";s:4:"𝟡";s:1:"9";s:4:"𝟢";s:1:"0";s:4:"𝟣";s:1:"1";s:4:"𝟤";s:1:"2";s:4:"𝟥";s:1:"3";s:4:"𝟦";s:1:"4";s:4:"𝟧";s:1:"5";s:4:"𝟨";s:1:"6";s:4:"𝟩";s:1:"7";s:4:"𝟪";s:1:"8";s:4:"𝟫";s:1:"9";s:4:"𝟬";s:1:"0";s:4:"𝟭";s:1:"1";s:4:"𝟮";s:1:"2";s:4:"𝟯";s:1:"3";s:4:"𝟰";s:1:"4";s:4:"𝟱";s:1:"5";s:4:"𝟲";s:1:"6";s:4:"𝟳";s:1:"7";s:4:"𝟴";s:1:"8";s:4:"𝟵";s:1:"9";s:4:"𝟶";s:1:"0";s:4:"𝟷";s:1:"1";s:4:"𝟸";s:1:"2";s:4:"𝟹";s:1:"3";s:4:"𝟺";s:1:"4";s:4:"𝟻";s:1:"5";s:4:"𝟼";s:1:"6";s:4:"𝟽";s:1:"7";s:4:"𝟾";s:1:"8";s:4:"𝟿";s:1:"9";s:4:"𞸀";s:2:"ا";s:4:"𞸁";s:2:"ب";s:4:"𞸂";s:2:"ج";s:4:"𞸃";s:2:"د";s:4:"𞸅";s:2:"و";s:4:"𞸆";s:2:"ز";s:4:"𞸇";s:2:"ح";s:4:"𞸈";s:2:"ط";s:4:"𞸉";s:2:"ي";s:4:"𞸊";s:2:"ك";s:4:"𞸋";s:2:"ل";s:4:"𞸌";s:2:"م";s:4:"𞸍";s:2:"ن";s:4:"𞸎";s:2:"س";s:4:"𞸏";s:2:"ع";s:4:"𞸐";s:2:"ف";s:4:"𞸑";s:2:"ص";s:4:"𞸒";s:2:"ق";s:4:"𞸓";s:2:"ر";s:4:"𞸔";s:2:"ش";s:4:"𞸕";s:2:"ت";s:4:"𞸖";s:2:"ث";s:4:"𞸗";s:2:"خ";s:4:"𞸘";s:2:"ذ";s:4:"𞸙";s:2:"ض";s:4:"𞸚";s:2:"ظ";s:4:"𞸛";s:2:"غ";s:4:"𞸜";s:2:"ٮ";s:4:"𞸝";s:2:"ں";s:4:"𞸞";s:2:"ڡ";s:4:"𞸟";s:2:"ٯ";s:4:"𞸡";s:2:"ب";s:4:"𞸢";s:2:"ج";s:4:"𞸤";s:2:"ه";s:4:"𞸧";s:2:"ح";s:4:"𞸩";s:2:"ي";s:4:"𞸪";s:2:"ك";s:4:"𞸫";s:2:"ل";s:4:"𞸬";s:2:"م";s:4:"𞸭";s:2:"ن";s:4:"𞸮";s:2:"س";s:4:"𞸯";s:2:"ع";s:4:"𞸰";s:2:"ف";s:4:"𞸱";s:2:"ص";s:4:"𞸲";s:2:"ق";s:4:"𞸴";s:2:"ش";s:4:"𞸵";s:2:"ت";s:4:"𞸶";s:2:"ث";s:4:"𞸷";s:2:"خ";s:4:"𞸹";s:2:"ض";s:4:"𞸻";s:2:"غ";s:4:"𞹂";s:2:"ج";s:4:"𞹇";s:2:"ح";s:4:"𞹉";s:2:"ي";s:4:"𞹋";s:2:"ل";s:4:"𞹍";s:2:"ن";s:4:"𞹎";s:2:"س";s:4:"𞹏";s:2:"ع";s:4:"𞹑";s:2:"ص";s:4:"𞹒";s:2:"ق";s:4:"𞹔";s:2:"ش";s:4:"𞹗";s:2:"خ";s:4:"𞹙";s:2:"ض";s:4:"𞹛";s:2:"غ";s:4:"𞹝";s:2:"ں";s:4:"𞹟";s:2:"ٯ";s:4:"𞹡";s:2:"ب";s:4:"𞹢";s:2:"ج";s:4:"𞹤";s:2:"ه";s:4:"𞹧";s:2:"ح";s:4:"𞹨";s:2:"ط";s:4:"𞹩";s:2:"ي";s:4:"𞹪";s:2:"ك";s:4:"𞹬";s:2:"م";s:4:"𞹭";s:2:"ن";s:4:"𞹮";s:2:"س";s:4:"𞹯";s:2:"ع";s:4:"𞹰";s:2:"ف";s:4:"𞹱";s:2:"ص";s:4:"𞹲";s:2:"ق";s:4:"𞹴";s:2:"ش";s:4:"𞹵";s:2:"ت";s:4:"𞹶";s:2:"ث";s:4:"𞹷";s:2:"خ";s:4:"𞹹";s:2:"ض";s:4:"𞹺";s:2:"ظ";s:4:"𞹻";s:2:"غ";s:4:"𞹼";s:2:"ٮ";s:4:"𞹾";s:2:"ڡ";s:4:"𞺀";s:2:"ا";s:4:"𞺁";s:2:"ب";s:4:"𞺂";s:2:"ج";s:4:"𞺃";s:2:"د";s:4:"𞺄";s:2:"ه";s:4:"𞺅";s:2:"و";s:4:"𞺆";s:2:"ز";s:4:"𞺇";s:2:"ح";s:4:"𞺈";s:2:"ط";s:4:"𞺉";s:2:"ي";s:4:"𞺋";s:2:"ل";s:4:"𞺌";s:2:"م";s:4:"𞺍";s:2:"ن";s:4:"𞺎";s:2:"س";s:4:"𞺏";s:2:"ع";s:4:"𞺐";s:2:"ف";s:4:"𞺑";s:2:"ص";s:4:"𞺒";s:2:"ق";s:4:"𞺓";s:2:"ر";s:4:"𞺔";s:2:"ش";s:4:"𞺕";s:2:"ت";s:4:"𞺖";s:2:"ث";s:4:"𞺗";s:2:"خ";s:4:"𞺘";s:2:"ذ";s:4:"𞺙";s:2:"ض";s:4:"𞺚";s:2:"ظ";s:4:"𞺛";s:2:"غ";s:4:"𞺡";s:2:"ب";s:4:"𞺢";s:2:"ج";s:4:"𞺣";s:2:"د";s:4:"𞺥";s:2:"و";s:4:"𞺦";s:2:"ز";s:4:"𞺧";s:2:"ح";s:4:"𞺨";s:2:"ط";s:4:"𞺩";s:2:"ي";s:4:"𞺫";s:2:"ل";s:4:"𞺬";s:2:"م";s:4:"𞺭";s:2:"ن";s:4:"𞺮";s:2:"س";s:4:"𞺯";s:2:"ع";s:4:"𞺰";s:2:"ف";s:4:"𞺱";s:2:"ص";s:4:"𞺲";s:2:"ق";s:4:"𞺳";s:2:"ر";s:4:"𞺴";s:2:"ش";s:4:"𞺵";s:2:"ت";s:4:"𞺶";s:2:"ث";s:4:"𞺷";s:2:"خ";s:4:"𞺸";s:2:"ذ";s:4:"𞺹";s:2:"ض";s:4:"𞺺";s:2:"ظ";s:4:"𞺻";s:2:"غ";s:4:"🄀";s:2:"0.";s:4:"🄁";s:2:"0,";s:4:"🄂";s:2:"1,";s:4:"🄃";s:2:"2,";s:4:"🄄";s:2:"3,";s:4:"🄅";s:2:"4,";s:4:"🄆";s:2:"5,";s:4:"🄇";s:2:"6,";s:4:"🄈";s:2:"7,";s:4:"🄉";s:2:"8,";s:4:"🄊";s:2:"9,";s:4:"🄐";s:3:"(A)";s:4:"🄑";s:3:"(B)";s:4:"🄒";s:3:"(C)";s:4:"🄓";s:3:"(D)";s:4:"🄔";s:3:"(E)";s:4:"🄕";s:3:"(F)";s:4:"🄖";s:3:"(G)";s:4:"🄗";s:3:"(H)";s:4:"🄘";s:3:"(I)";s:4:"🄙";s:3:"(J)";s:4:"🄚";s:3:"(K)";s:4:"🄛";s:3:"(L)";s:4:"🄜";s:3:"(M)";s:4:"🄝";s:3:"(N)";s:4:"🄞";s:3:"(O)";s:4:"🄟";s:3:"(P)";s:4:"🄠";s:3:"(Q)";s:4:"🄡";s:3:"(R)";s:4:"🄢";s:3:"(S)";s:4:"🄣";s:3:"(T)";s:4:"🄤";s:3:"(U)";s:4:"🄥";s:3:"(V)";s:4:"🄦";s:3:"(W)";s:4:"🄧";s:3:"(X)";s:4:"🄨";s:3:"(Y)";s:4:"🄩";s:3:"(Z)";s:4:"🄪";s:7:"〔S〕";s:4:"🄫";s:3:"(C)";s:4:"🄬";s:3:"(R)";s:4:"🄭";s:4:"(CD)";s:4:"🄮";s:4:"(WZ)";s:4:"🄰";s:1:"A";s:4:"🄱";s:1:"B";s:4:"🄲";s:1:"C";s:4:"🄳";s:1:"D";s:4:"🄴";s:1:"E";s:4:"🄵";s:1:"F";s:4:"🄶";s:1:"G";s:4:"🄷";s:1:"H";s:4:"🄸";s:1:"I";s:4:"🄹";s:1:"J";s:4:"🄺";s:1:"K";s:4:"🄻";s:1:"L";s:4:"🄼";s:1:"M";s:4:"🄽";s:1:"N";s:4:"🄾";s:1:"O";s:4:"🄿";s:1:"P";s:4:"🅀";s:1:"Q";s:4:"🅁";s:1:"R";s:4:"🅂";s:1:"S";s:4:"🅃";s:1:"T";s:4:"🅄";s:1:"U";s:4:"🅅";s:1:"V";s:4:"🅆";s:1:"W";s:4:"🅇";s:1:"X";s:4:"🅈";s:1:"Y";s:4:"🅉";s:1:"Z";s:4:"🅊";s:2:"HV";s:4:"🅋";s:2:"MV";s:4:"🅌";s:2:"SD";s:4:"🅍";s:2:"SS";s:4:"🅎";s:3:"PPV";s:4:"🅏";s:2:"WC";s:4:"🆐";s:2:"DJ";s:4:"🈀";s:6:"ほか";s:4:"🈁";s:6:"ココ";s:4:"🈂";s:3:"サ";s:4:"🈐";s:3:"手";s:4:"🈑";s:3:"字";s:4:"🈒";s:3:"双";s:4:"🈓";s:3:"デ";s:4:"🈔";s:3:"二";s:4:"🈕";s:3:"多";s:4:"🈖";s:3:"解";s:4:"🈗";s:3:"天";s:4:"🈘";s:3:"交";s:4:"🈙";s:3:"映";s:4:"🈚";s:3:"無";s:4:"🈛";s:3:"料";s:4:"🈜";s:3:"前";s:4:"🈝";s:3:"後";s:4:"🈞";s:3:"再";s:4:"🈟";s:3:"新";s:4:"🈠";s:3:"初";s:4:"🈡";s:3:"終";s:4:"🈢";s:3:"生";s:4:"🈣";s:3:"販";s:4:"🈤";s:3:"声";s:4:"🈥";s:3:"吹";s:4:"🈦";s:3:"演";s:4:"🈧";s:3:"投";s:4:"🈨";s:3:"捕";s:4:"🈩";s:3:"一";s:4:"🈪";s:3:"三";s:4:"🈫";s:3:"遊";s:4:"🈬";s:3:"左";s:4:"🈭";s:3:"中";s:4:"🈮";s:3:"右";s:4:"🈯";s:3:"指";s:4:"🈰";s:3:"走";s:4:"🈱";s:3:"打";s:4:"🈲";s:3:"禁";s:4:"🈳";s:3:"空";s:4:"🈴";s:3:"合";s:4:"🈵";s:3:"満";s:4:"🈶";s:3:"有";s:4:"🈷";s:3:"月";s:4:"🈸";s:3:"申";s:4:"🈹";s:3:"割";s:4:"🈺";s:3:"営";s:4:"🉀";s:9:"〔本〕";s:4:"🉁";s:9:"〔三〕";s:4:"🉂";s:9:"〔二〕";s:4:"🉃";s:9:"〔安〕";s:4:"🉄";s:9:"〔点〕";s:4:"🉅";s:9:"〔打〕";s:4:"🉆";s:9:"〔盗〕";s:4:"🉇";s:9:"〔勝〕";s:4:"🉈";s:9:"〔敗〕";s:4:"🉐";s:5:"(得)";s:4:"🉑";s:5:"(可)";s:4:"丽";s:3:"丽";s:4:"丸";s:3:"丸";s:4:"乁";s:3:"乁";s:4:"𠄢";s:4:"𠄢";s:4:"你";s:3:"你";s:4:"侮";s:3:"侮";s:4:"侻";s:3:"侻";s:4:"倂";s:3:"倂";s:4:"偺";s:3:"偺";s:4:"備";s:3:"備";s:4:"僧";s:3:"僧";s:4:"像";s:3:"像";s:4:"㒞";s:3:"㒞";s:4:"𠘺";s:4:"𠘺";s:4:"免";s:3:"免";s:4:"兔";s:3:"兔";s:4:"兤";s:3:"兤";s:4:"具";s:3:"具";s:4:"𠔜";s:4:"𠔜";s:4:"㒹";s:3:"㒹";s:4:"內";s:3:"內";s:4:"再";s:3:"再";s:4:"𠕋";s:4:"𠕋";s:4:"冗";s:3:"冗";s:4:"冤";s:3:"冤";s:4:"仌";s:3:"仌";s:4:"冬";s:3:"冬";s:4:"况";s:3:"况";s:4:"𩇟";s:4:"𩇟";s:4:"凵";s:3:"凵";s:4:"刃";s:3:"刃";s:4:"㓟";s:3:"㓟";s:4:"刻";s:3:"刻";s:4:"剆";s:3:"剆";s:4:"割";s:3:"割";s:4:"剷";s:3:"剷";s:4:"㔕";s:3:"㔕";s:4:"勇";s:3:"勇";s:4:"勉";s:3:"勉";s:4:"勤";s:3:"勤";s:4:"勺";s:3:"勺";s:4:"包";s:3:"包";s:4:"匆";s:3:"匆";s:4:"北";s:3:"北";s:4:"卉";s:3:"卉";s:4:"卑";s:3:"卑";s:4:"博";s:3:"博";s:4:"即";s:3:"即";s:4:"卽";s:3:"卽";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"𠨬";s:4:"𠨬";s:4:"灰";s:3:"灰";s:4:"及";s:3:"及";s:4:"叟";s:3:"叟";s:4:"𠭣";s:4:"𠭣";s:4:"叫";s:3:"叫";s:4:"叱";s:3:"叱";s:4:"吆";s:3:"吆";s:4:"咞";s:3:"咞";s:4:"吸";s:3:"吸";s:4:"呈";s:3:"呈";s:4:"周";s:3:"周";s:4:"咢";s:3:"咢";s:4:"哶";s:3:"哶";s:4:"唐";s:3:"唐";s:4:"啓";s:3:"啓";s:4:"啣";s:3:"啣";s:4:"善";s:3:"善";s:4:"善";s:3:"善";s:4:"喙";s:3:"喙";s:4:"喫";s:3:"喫";s:4:"喳";s:3:"喳";s:4:"嗂";s:3:"嗂";s:4:"圖";s:3:"圖";s:4:"嘆";s:3:"嘆";s:4:"圗";s:3:"圗";s:4:"噑";s:3:"噑";s:4:"噴";s:3:"噴";s:4:"切";s:3:"切";s:4:"壮";s:3:"壮";s:4:"城";s:3:"城";s:4:"埴";s:3:"埴";s:4:"堍";s:3:"堍";s:4:"型";s:3:"型";s:4:"堲";s:3:"堲";s:4:"報";s:3:"報";s:4:"墬";s:3:"墬";s:4:"𡓤";s:4:"𡓤";s:4:"売";s:3:"売";s:4:"壷";s:3:"壷";s:4:"夆";s:3:"夆";s:4:"多";s:3:"多";s:4:"夢";s:3:"夢";s:4:"奢";s:3:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:4:"姬";s:3:"姬";s:4:"娛";s:3:"娛";s:4:"娧";s:3:"娧";s:4:"姘";s:3:"姘";s:4:"婦";s:3:"婦";s:4:"㛮";s:3:"㛮";s:4:"㛼";s:3:"㛼";s:4:"嬈";s:3:"嬈";s:4:"嬾";s:3:"嬾";s:4:"嬾";s:3:"嬾";s:4:"𡧈";s:4:"𡧈";s:4:"寃";s:3:"寃";s:4:"寘";s:3:"寘";s:4:"寧";s:3:"寧";s:4:"寳";s:3:"寳";s:4:"𡬘";s:4:"𡬘";s:4:"寿";s:3:"寿";s:4:"将";s:3:"将";s:4:"当";s:3:"当";s:4:"尢";s:3:"尢";s:4:"㞁";s:3:"㞁";s:4:"屠";s:3:"屠";s:4:"屮";s:3:"屮";s:4:"峀";s:3:"峀";s:4:"岍";s:3:"岍";s:4:"𡷤";s:4:"𡷤";s:4:"嵃";s:3:"嵃";s:4:"𡷦";s:4:"𡷦";s:4:"嵮";s:3:"嵮";s:4:"嵫";s:3:"嵫";s:4:"嵼";s:3:"嵼";s:4:"巡";s:3:"巡";s:4:"巢";s:3:"巢";s:4:"㠯";s:3:"㠯";s:4:"巽";s:3:"巽";s:4:"帨";s:3:"帨";s:4:"帽";s:3:"帽";s:4:"幩";s:3:"幩";s:4:"㡢";s:3:"㡢";s:4:"𢆃";s:4:"𢆃";s:4:"㡼";s:3:"㡼";s:4:"庰";s:3:"庰";s:4:"庳";s:3:"庳";s:4:"庶";s:3:"庶";s:4:"廊";s:3:"廊";s:4:"𪎒";s:4:"𪎒";s:4:"廾";s:3:"廾";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"舁";s:3:"舁";s:4:"弢";s:3:"弢";s:4:"弢";s:3:"弢";s:4:"㣇";s:3:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:4:"形";s:3:"形";s:4:"彫";s:3:"彫";s:4:"㣣";s:3:"㣣";s:4:"徚";s:3:"徚";s:4:"忍";s:3:"忍";s:4:"志";s:3:"志";s:4:"忹";s:3:"忹";s:4:"悁";s:3:"悁";s:4:"㤺";s:3:"㤺";s:4:"㤜";s:3:"㤜";s:4:"悔";s:3:"悔";s:4:"𢛔";s:4:"𢛔";s:4:"惇";s:3:"惇";s:4:"慈";s:3:"慈";s:4:"慌";s:3:"慌";s:4:"慎";s:3:"慎";s:4:"慌";s:3:"慌";s:4:"慺";s:3:"慺";s:4:"憎";s:3:"憎";s:4:"憲";s:3:"憲";s:4:"憤";s:3:"憤";s:4:"憯";s:3:"憯";s:4:"懞";s:3:"懞";s:4:"懲";s:3:"懲";s:4:"懶";s:3:"懶";s:4:"成";s:3:"成";s:4:"戛";s:3:"戛";s:4:"扝";s:3:"扝";s:4:"抱";s:3:"抱";s:4:"拔";s:3:"拔";s:4:"捐";s:3:"捐";s:4:"𢬌";s:4:"𢬌";s:4:"挽";s:3:"挽";s:4:"拼";s:3:"拼";s:4:"捨";s:3:"捨";s:4:"掃";s:3:"掃";s:4:"揤";s:3:"揤";s:4:"𢯱";s:4:"𢯱";s:4:"搢";s:3:"搢";s:4:"揅";s:3:"揅";s:4:"掩";s:3:"掩";s:4:"㨮";s:3:"㨮";s:4:"摩";s:3:"摩";s:4:"摾";s:3:"摾";s:4:"撝";s:3:"撝";s:4:"摷";s:3:"摷";s:4:"㩬";s:3:"㩬";s:4:"敏";s:3:"敏";s:4:"敬";s:3:"敬";s:4:"𣀊";s:4:"𣀊";s:4:"旣";s:3:"旣";s:4:"書";s:3:"書";s:4:"晉";s:3:"晉";s:4:"㬙";s:3:"㬙";s:4:"暑";s:3:"暑";s:4:"㬈";s:3:"㬈";s:4:"㫤";s:3:"㫤";s:4:"冒";s:3:"冒";s:4:"冕";s:3:"冕";s:4:"最";s:3:"最";s:4:"暜";s:3:"暜";s:4:"肭";s:3:"肭";s:4:"䏙";s:3:"䏙";s:4:"朗";s:3:"朗";s:4:"望";s:3:"望";s:4:"朡";s:3:"朡";s:4:"杞";s:3:"杞";s:4:"杓";s:3:"杓";s:4:"𣏃";s:4:"𣏃";s:4:"㭉";s:3:"㭉";s:4:"柺";s:3:"柺";s:4:"枅";s:3:"枅";s:4:"桒";s:3:"桒";s:4:"梅";s:3:"梅";s:4:"𣑭";s:4:"𣑭";s:4:"梎";s:3:"梎";s:4:"栟";s:3:"栟";s:4:"椔";s:3:"椔";s:4:"㮝";s:3:"㮝";s:4:"楂";s:3:"楂";s:4:"榣";s:3:"榣";s:4:"槪";s:3:"槪";s:4:"檨";s:3:"檨";s:4:"𣚣";s:4:"𣚣";s:4:"櫛";s:3:"櫛";s:4:"㰘";s:3:"㰘";s:4:"次";s:3:"次";s:4:"𣢧";s:4:"𣢧";s:4:"歔";s:3:"歔";s:4:"㱎";s:3:"㱎";s:4:"歲";s:3:"歲";s:4:"殟";s:3:"殟";s:4:"殺";s:3:"殺";s:4:"殻";s:3:"殻";s:4:"𣪍";s:4:"𣪍";s:4:"𡴋";s:4:"𡴋";s:4:"𣫺";s:4:"𣫺";s:4:"汎";s:3:"汎";s:4:"𣲼";s:4:"𣲼";s:4:"沿";s:3:"沿";s:4:"泍";s:3:"泍";s:4:"汧";s:3:"汧";s:4:"洖";s:3:"洖";s:4:"派";s:3:"派";s:4:"海";s:3:"海";s:4:"流";s:3:"流";s:4:"浩";s:3:"浩";s:4:"浸";s:3:"浸";s:4:"涅";s:3:"涅";s:4:"𣴞";s:4:"𣴞";s:4:"洴";s:3:"洴";s:4:"港";s:3:"港";s:4:"湮";s:3:"湮";s:4:"㴳";s:3:"㴳";s:4:"滋";s:3:"滋";s:4:"滇";s:3:"滇";s:4:"𣻑";s:4:"𣻑";s:4:"淹";s:3:"淹";s:4:"潮";s:3:"潮";s:4:"𣽞";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:4:"濆";s:3:"濆";s:4:"瀹";s:3:"瀹";s:4:"瀞";s:3:"瀞";s:4:"瀛";s:3:"瀛";s:4:"㶖";s:3:"㶖";s:4:"灊";s:3:"灊";s:4:"災";s:3:"災";s:4:"灷";s:3:"灷";s:4:"炭";s:3:"炭";s:4:"𠔥";s:4:"𠔥";s:4:"煅";s:3:"煅";s:4:"𤉣";s:4:"𤉣";s:4:"熜";s:3:"熜";s:4:"𤎫";s:4:"𤎫";s:4:"爨";s:3:"爨";s:4:"爵";s:3:"爵";s:4:"牐";s:3:"牐";s:4:"𤘈";s:4:"𤘈";s:4:"犀";s:3:"犀";s:4:"犕";s:3:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:4:"獺";s:3:"獺";s:4:"王";s:3:"王";s:4:"㺬";s:3:"㺬";s:4:"玥";s:3:"玥";s:4:"㺸";s:3:"㺸";s:4:"㺸";s:3:"㺸";s:4:"瑇";s:3:"瑇";s:4:"瑜";s:3:"瑜";s:4:"瑱";s:3:"瑱";s:4:"璅";s:3:"璅";s:4:"瓊";s:3:"瓊";s:4:"㼛";s:3:"㼛";s:4:"甤";s:3:"甤";s:4:"𤰶";s:4:"𤰶";s:4:"甾";s:3:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"異";s:3:"異";s:4:"𢆟";s:4:"𢆟";s:4:"瘐";s:3:"瘐";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"𥁄";s:4:"㿼";s:3:"㿼";s:4:"䀈";s:3:"䀈";s:4:"直";s:3:"直";s:4:"𥃳";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:4:"眞";s:3:"眞";s:4:"真";s:3:"真";s:4:"真";s:3:"真";s:4:"睊";s:3:"睊";s:4:"䀹";s:3:"䀹";s:4:"瞋";s:3:"瞋";s:4:"䁆";s:3:"䁆";s:4:"䂖";s:3:"䂖";s:4:"𥐝";s:4:"𥐝";s:4:"硎";s:3:"硎";s:4:"碌";s:3:"碌";s:4:"磌";s:3:"磌";s:4:"䃣";s:3:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"祖";s:3:"祖";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:4:"福";s:3:"福";s:4:"秫";s:3:"秫";s:4:"䄯";s:3:"䄯";s:4:"穀";s:3:"穀";s:4:"穊";s:3:"穊";s:4:"穏";s:3:"穏";s:4:"𥥼";s:4:"𥥼";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"竮";s:3:"竮";s:4:"䈂";s:3:"䈂";s:4:"𥮫";s:4:"𥮫";s:4:"篆";s:3:"篆";s:4:"築";s:3:"築";s:4:"䈧";s:3:"䈧";s:4:"𥲀";s:4:"𥲀";s:4:"糒";s:3:"糒";s:4:"䊠";s:3:"䊠";s:4:"糨";s:3:"糨";s:4:"糣";s:3:"糣";s:4:"紀";s:3:"紀";s:4:"𥾆";s:4:"𥾆";s:4:"絣";s:3:"絣";s:4:"䌁";s:3:"䌁";s:4:"緇";s:3:"緇";s:4:"縂";s:3:"縂";s:4:"繅";s:3:"繅";s:4:"䌴";s:3:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:4:"䍙";s:3:"䍙";s:4:"𦋙";s:4:"𦋙";s:4:"罺";s:3:"罺";s:4:"𦌾";s:4:"𦌾";s:4:"羕";s:3:"羕";s:4:"翺";s:3:"翺";s:4:"者";s:3:"者";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:4:"聠";s:3:"聠";s:4:"𦖨";s:4:"𦖨";s:4:"聰";s:3:"聰";s:4:"𣍟";s:4:"𣍟";s:4:"䏕";s:3:"䏕";s:4:"育";s:3:"育";s:4:"脃";s:3:"脃";s:4:"䐋";s:3:"䐋";s:4:"脾";s:3:"脾";s:4:"媵";s:3:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:4:"舁";s:3:"舁";s:4:"舄";s:3:"舄";s:4:"辞";s:3:"辞";s:4:"䑫";s:3:"䑫";s:4:"芑";s:3:"芑";s:4:"芋";s:3:"芋";s:4:"芝";s:3:"芝";s:4:"劳";s:3:"劳";s:4:"花";s:3:"花";s:4:"芳";s:3:"芳";s:4:"芽";s:3:"芽";s:4:"苦";s:3:"苦";s:4:"𦬼";s:4:"𦬼";s:4:"若";s:3:"若";s:4:"茝";s:3:"茝";s:4:"荣";s:3:"荣";s:4:"莭";s:3:"莭";s:4:"茣";s:3:"茣";s:4:"莽";s:3:"莽";s:4:"菧";s:3:"菧";s:4:"著";s:3:"著";s:4:"荓";s:3:"荓";s:4:"菊";s:3:"菊";s:4:"菌";s:3:"菌";s:4:"菜";s:3:"菜";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:4:"䔫";s:3:"䔫";s:4:"蓱";s:3:"蓱";s:4:"蓳";s:3:"蓳";s:4:"蔖";s:3:"蔖";s:4:"𧏊";s:4:"𧏊";s:4:"蕤";s:3:"蕤";s:4:"𦼬";s:4:"𦼬";s:4:"䕝";s:3:"䕝";s:4:"䕡";s:3:"䕡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:4:"䕫";s:3:"䕫";s:4:"虐";s:3:"虐";s:4:"虜";s:3:"虜";s:4:"虧";s:3:"虧";s:4:"虩";s:3:"虩";s:4:"蚩";s:3:"蚩";s:4:"蚈";s:3:"蚈";s:4:"蜎";s:3:"蜎";s:4:"蛢";s:3:"蛢";s:4:"蝹";s:3:"蝹";s:4:"蜨";s:3:"蜨";s:4:"蝫";s:3:"蝫";s:4:"螆";s:3:"螆";s:4:"䗗";s:3:"䗗";s:4:"蟡";s:3:"蟡";s:4:"蠁";s:3:"蠁";s:4:"䗹";s:3:"䗹";s:4:"衠";s:3:"衠";s:4:"衣";s:3:"衣";s:4:"𧙧";s:4:"𧙧";s:4:"裗";s:3:"裗";s:4:"裞";s:3:"裞";s:4:"䘵";s:3:"䘵";s:4:"裺";s:3:"裺";s:4:"㒻";s:3:"㒻";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:4:"䚾";s:3:"䚾";s:4:"䛇";s:3:"䛇";s:4:"誠";s:3:"誠";s:4:"諭";s:3:"諭";s:4:"變";s:3:"變";s:4:"豕";s:3:"豕";s:4:"𧲨";s:4:"𧲨";s:4:"貫";s:3:"貫";s:4:"賁";s:3:"賁";s:4:"贛";s:3:"贛";s:4:"起";s:3:"起";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"𠠄";s:4:"跋";s:3:"跋";s:4:"趼";s:3:"趼";s:4:"跰";s:3:"跰";s:4:"𠣞";s:4:"𠣞";s:4:"軔";s:3:"軔";s:4:"輸";s:3:"輸";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:4:"邔";s:3:"邔";s:4:"郱";s:3:"郱";s:4:"鄑";s:3:"鄑";s:4:"𨜮";s:4:"𨜮";s:4:"鄛";s:3:"鄛";s:4:"鈸";s:3:"鈸";s:4:"鋗";s:3:"鋗";s:4:"鋘";s:3:"鋘";s:4:"鉼";s:3:"鉼";s:4:"鏹";s:3:"鏹";s:4:"鐕";s:3:"鐕";s:4:"𨯺";s:4:"𨯺";s:4:"開";s:3:"開";s:4:"䦕";s:3:"䦕";s:4:"閷";s:3:"閷";s:4:"𨵷";s:4:"𨵷";s:4:"䧦";s:3:"䧦";s:4:"雃";s:3:"雃";s:4:"嶲";s:3:"嶲";s:4:"霣";s:3:"霣";s:4:"𩅅";s:4:"𩅅";s:4:"𩈚";s:4:"𩈚";s:4:"䩮";s:3:"䩮";s:4:"䩶";s:3:"䩶";s:4:"韠";s:3:"韠";s:4:"𩐊";s:4:"𩐊";s:4:"䪲";s:3:"䪲";s:4:"𩒖";s:4:"𩒖";s:4:"頋";s:3:"頋";s:4:"頋";s:3:"頋";s:4:"頩";s:3:"頩";s:4:"𩖶";s:4:"𩖶";s:4:"飢";s:3:"飢";s:4:"䬳";s:3:"䬳";s:4:"餩";s:3:"餩";s:4:"馧";s:3:"馧";s:4:"駂";s:3:"駂";s:4:"駾";s:3:"駾";s:4:"䯎";s:3:"䯎";s:4:"𩬰";s:4:"𩬰";s:4:"鬒";s:3:"鬒";s:4:"鱀";s:3:"鱀";s:4:"鳽";s:3:"鳽";s:4:"䳎";s:3:"䳎";s:4:"䳭";s:3:"䳭";s:4:"鵧";s:3:"鵧";s:4:"𪃎";s:4:"𪃎";s:4:"䳸";s:3:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:4:"麻";s:3:"麻";s:4:"䵖";s:3:"䵖";s:4:"黹";s:3:"黹";s:4:"黾";s:3:"黾";s:4:"鼅";s:3:"鼅";s:4:"鼏";s:3:"鼏";s:4:"鼖";s:3:"鼖";s:4:"鼻";s:3:"鼻";s:4:"𪘀";s:4:"𪘀";s:2:"Æ";s:2:"AE";s:2:"Ð";s:1:"D";s:2:"Ø";s:1:"O";s:2:"Þ";s:2:"TH";s:2:"ß";s:2:"ss";s:2:"æ";s:2:"ae";s:2:"ð";s:1:"d";s:2:"ø";s:1:"o";s:2:"þ";s:2:"th";s:2:"Đ";s:1:"D";s:2:"đ";s:1:"d";s:2:"Ħ";s:1:"H";s:2:"ħ";s:1:"h";s:2:"ı";s:1:"i";s:2:"ĸ";s:1:"q";s:2:"Ł";s:1:"L";s:2:"ł";s:1:"l";s:2:"Ŋ";s:1:"N";s:2:"ŋ";s:1:"n";s:2:"Œ";s:2:"OE";s:2:"œ";s:2:"oe";s:2:"Ŧ";s:1:"T";s:2:"ŧ";s:1:"t";s:2:"ƀ";s:1:"b";s:2:"Ɓ";s:1:"B";s:2:"Ƃ";s:1:"B";s:2:"ƃ";s:1:"b";s:2:"Ƈ";s:1:"C";s:2:"ƈ";s:1:"c";s:2:"Ɖ";s:1:"D";s:2:"Ɗ";s:1:"D";s:2:"Ƌ";s:1:"D";s:2:"ƌ";s:1:"d";s:2:"Ɛ";s:1:"E";s:2:"Ƒ";s:1:"F";s:2:"ƒ";s:1:"f";s:2:"Ɠ";s:1:"G";s:2:"ƕ";s:2:"hv";s:2:"Ɩ";s:1:"I";s:2:"Ɨ";s:1:"I";s:2:"Ƙ";s:1:"K";s:2:"ƙ";s:1:"k";s:2:"ƚ";s:1:"l";s:2:"Ɲ";s:1:"N";s:2:"ƞ";s:1:"n";s:2:"Ƣ";s:2:"OI";s:2:"ƣ";s:2:"oi";s:2:"Ƥ";s:1:"P";s:2:"ƥ";s:1:"p";s:2:"ƫ";s:1:"t";s:2:"Ƭ";s:1:"T";s:2:"ƭ";s:1:"t";s:2:"Ʈ";s:1:"T";s:2:"Ʋ";s:1:"V";s:2:"Ƴ";s:1:"Y";s:2:"ƴ";s:1:"y";s:2:"Ƶ";s:1:"Z";s:2:"ƶ";s:1:"z";s:2:"Ǥ";s:1:"G";s:2:"ǥ";s:1:"g";s:2:"ȡ";s:1:"d";s:2:"Ȥ";s:1:"Z";s:2:"ȥ";s:1:"z";s:2:"ȴ";s:1:"l";s:2:"ȵ";s:1:"n";s:2:"ȶ";s:1:"t";s:2:"ȷ";s:1:"j";s:2:"ȸ";s:2:"db";s:2:"ȹ";s:2:"qp";s:2:"Ⱥ";s:1:"A";s:2:"Ȼ";s:1:"C";s:2:"ȼ";s:1:"c";s:2:"Ƚ";s:1:"L";s:2:"Ⱦ";s:1:"T";s:2:"ȿ";s:1:"s";s:2:"ɀ";s:1:"z";s:2:"Ƀ";s:1:"B";s:2:"Ʉ";s:1:"U";s:2:"Ɇ";s:1:"E";s:2:"ɇ";s:1:"e";s:2:"Ɉ";s:1:"J";s:2:"ɉ";s:1:"j";s:2:"Ɍ";s:1:"R";s:2:"ɍ";s:1:"r";s:2:"Ɏ";s:1:"Y";s:2:"ɏ";s:1:"y";s:2:"ɓ";s:1:"b";s:2:"ɕ";s:1:"c";s:2:"ɖ";s:1:"d";s:2:"ɗ";s:1:"d";s:2:"ɛ";s:1:"e";s:2:"ɟ";s:1:"j";s:2:"ɠ";s:1:"g";s:2:"ɡ";s:1:"g";s:2:"ɢ";s:1:"G";s:2:"ɦ";s:1:"h";s:2:"ɧ";s:1:"h";s:2:"ɨ";s:1:"i";s:2:"ɪ";s:1:"I";s:2:"ɫ";s:1:"l";s:2:"ɬ";s:1:"l";s:2:"ɭ";s:1:"l";s:2:"ɱ";s:1:"m";s:2:"ɲ";s:1:"n";s:2:"ɳ";s:1:"n";s:2:"ɴ";s:1:"N";s:2:"ɶ";s:2:"OE";s:2:"ɼ";s:1:"r";s:2:"ɽ";s:1:"r";s:2:"ɾ";s:1:"r";s:2:"ʀ";s:1:"R";s:2:"ʂ";s:1:"s";s:2:"ʈ";s:1:"t";s:2:"ʉ";s:1:"u";s:2:"ʋ";s:1:"v";s:2:"ʏ";s:1:"Y";s:2:"ʐ";s:1:"z";s:2:"ʑ";s:1:"z";s:2:"ʙ";s:1:"B";s:2:"ʛ";s:1:"G";s:2:"ʜ";s:1:"H";s:2:"ʝ";s:1:"j";s:2:"ʟ";s:1:"L";s:2:"ʠ";s:1:"q";s:2:"ʣ";s:2:"dz";s:2:"ʥ";s:2:"dz";s:2:"ʦ";s:2:"ts";s:2:"ʪ";s:2:"ls";s:2:"ʫ";s:2:"lz";s:3:"ᴀ";s:1:"A";s:3:"ᴁ";s:2:"AE";s:3:"ᴃ";s:1:"B";s:3:"ᴄ";s:1:"C";s:3:"ᴅ";s:1:"D";s:3:"ᴆ";s:1:"D";s:3:"ᴇ";s:1:"E";s:3:"ᴊ";s:1:"J";s:3:"ᴋ";s:1:"K";s:3:"ᴌ";s:1:"L";s:3:"ᴍ";s:1:"M";s:3:"ᴏ";s:1:"O";s:3:"ᴘ";s:1:"P";s:3:"ᴛ";s:1:"T";s:3:"ᴜ";s:1:"U";s:3:"ᴠ";s:1:"V";s:3:"ᴡ";s:1:"W";s:3:"ᴢ";s:1:"Z";s:3:"ᵫ";s:2:"ue";s:3:"ᵬ";s:1:"b";s:3:"ᵭ";s:1:"d";s:3:"ᵮ";s:1:"f";s:3:"ᵯ";s:1:"m";s:3:"ᵰ";s:1:"n";s:3:"ᵱ";s:1:"p";s:3:"ᵲ";s:1:"r";s:3:"ᵳ";s:1:"r";s:3:"ᵴ";s:1:"s";s:3:"ᵵ";s:1:"t";s:3:"ᵶ";s:1:"z";s:3:"ᵺ";s:2:"th";s:3:"ᵻ";s:1:"I";s:3:"ᵽ";s:1:"p";s:3:"ᵾ";s:1:"U";s:3:"ᶀ";s:1:"b";s:3:"ᶁ";s:1:"d";s:3:"ᶂ";s:1:"f";s:3:"ᶃ";s:1:"g";s:3:"ᶄ";s:1:"k";s:3:"ᶅ";s:1:"l";s:3:"ᶆ";s:1:"m";s:3:"ᶇ";s:1:"n";s:3:"ᶈ";s:1:"p";s:3:"ᶉ";s:1:"r";s:3:"ᶊ";s:1:"s";s:3:"ᶌ";s:1:"v";s:3:"ᶍ";s:1:"x";s:3:"ᶎ";s:1:"z";s:3:"ᶏ";s:1:"a";s:3:"ᶑ";s:1:"d";s:3:"ᶒ";s:1:"e";s:3:"ᶓ";s:1:"e";s:3:"ᶖ";s:1:"i";s:3:"ᶙ";s:1:"u";s:3:"ẜ";s:1:"s";s:3:"ẝ";s:1:"s";s:3:"ẞ";s:2:"SS";s:3:"Ỻ";s:2:"LL";s:3:"ỻ";s:2:"ll";s:3:"Ỽ";s:1:"V";s:3:"ỽ";s:1:"v";s:3:"Ỿ";s:1:"Y";s:3:"ỿ";s:1:"y";s:2:"©";s:3:"(C)";s:2:"®";s:3:"(R)";s:3:"₠";s:2:"CE";s:3:"₢";s:2:"Cr";s:3:"₣";s:3:"Fr.";s:3:"₤";s:2:"L.";s:3:"₧";s:3:"Pts";s:3:"₺";s:2:"TL";s:3:"₹";s:2:"Rs";s:3:"℞";s:2:"Rx";s:3:"〇";s:1:"0";s:3:"‘";s:1:"'";s:3:"’";s:1:"'";s:3:"‚";s:1:",";s:3:"‛";s:1:"'";s:3:"“";s:1:""";s:3:"”";s:1:""";s:3:"„";s:2:",,";s:3:"‟";s:1:""";s:3:"′";s:1:"'";s:3:"〝";s:1:""";s:3:"〞";s:1:""";s:2:"«";s:2:"<<";s:2:"»";s:2:">>";s:3:"‹";s:1:"<";s:3:"›";s:1:">";s:3:"‐";s:1:"-";s:3:"‑";s:1:"-";s:3:"‒";s:1:"-";s:3:"–";s:1:"-";s:3:"—";s:1:"-";s:3:"―";s:1:"-";s:3:"︱";s:1:"-";s:3:"︲";s:1:"-";s:3:"‖";s:2:"||";s:3:"⁄";s:1:"/";s:3:"⁅";s:1:"[";s:3:"⁆";s:1:"]";s:3:"⁎";s:1:"*";s:3:"、";s:1:",";s:3:"。";s:1:".";s:3:"〈";s:1:"<";s:3:"〉";s:1:">";s:3:"《";s:2:"<<";s:3:"》";s:2:">>";s:3:"〔";s:1:"[";s:3:"〕";s:1:"]";s:3:"〘";s:1:"[";s:3:"〙";s:1:"]";s:3:"〚";s:1:"[";s:3:"〛";s:1:"]";s:3:"︐";s:1:",";s:3:"︑";s:1:",";s:3:"︒";s:1:".";s:3:"︓";s:1:":";s:3:"︔";s:1:";";s:3:"︕";s:1:"!";s:3:"︖";s:1:"?";s:3:"︙";s:3:"...";s:3:"︰";s:2:"..";s:3:"︵";s:1:"(";s:3:"︶";s:1:")";s:3:"︷";s:1:"{";s:3:"︸";s:1:"}";s:3:"︹";s:1:"[";s:3:"︺";s:1:"]";s:3:"︽";s:2:"<<";s:3:"︾";s:2:">>";s:3:"︿";s:1:"<";s:3:"﹀";s:1:">";s:3:"﹇";s:1:"[";s:3:"﹈";s:1:"]";s:2:"×";s:1:"*";s:2:"÷";s:1:"/";s:3:"−";s:1:"-";s:3:"∕";s:1:"/";s:3:"∖";s:1:"\";s:3:"∣";s:1:"|";s:3:"∥";s:2:"||";s:3:"≪";s:2:"<<";s:3:"≫";s:2:">>";s:3:"⦅";s:2:"((";s:3:"⦆";s:2:"))";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/unidata/canonicalComposition.ser
@@ -0,0 +1 @@
+a:940:{s:3:"À";s:2:"À";s:3:"Á";s:2:"Á";s:3:"Â";s:2:"Â";s:3:"Ã";s:2:"Ã";s:3:"Ä";s:2:"Ä";s:3:"Å";s:2:"Å";s:3:"Ç";s:2:"Ç";s:3:"È";s:2:"È";s:3:"É";s:2:"É";s:3:"Ê";s:2:"Ê";s:3:"Ë";s:2:"Ë";s:3:"Ì";s:2:"Ì";s:3:"Í";s:2:"Í";s:3:"Î";s:2:"Î";s:3:"Ï";s:2:"Ï";s:3:"Ñ";s:2:"Ñ";s:3:"Ò";s:2:"Ò";s:3:"Ó";s:2:"Ó";s:3:"Ô";s:2:"Ô";s:3:"Õ";s:2:"Õ";s:3:"Ö";s:2:"Ö";s:3:"Ù";s:2:"Ù";s:3:"Ú";s:2:"Ú";s:3:"Û";s:2:"Û";s:3:"Ü";s:2:"Ü";s:3:"Ý";s:2:"Ý";s:3:"à";s:2:"à";s:3:"á";s:2:"á";s:3:"â";s:2:"â";s:3:"ã";s:2:"ã";s:3:"ä";s:2:"ä";s:3:"å";s:2:"å";s:3:"ç";s:2:"ç";s:3:"è";s:2:"è";s:3:"é";s:2:"é";s:3:"ê";s:2:"ê";s:3:"ë";s:2:"ë";s:3:"ì";s:2:"ì";s:3:"í";s:2:"í";s:3:"î";s:2:"î";s:3:"ï";s:2:"ï";s:3:"ñ";s:2:"ñ";s:3:"ò";s:2:"ò";s:3:"ó";s:2:"ó";s:3:"ô";s:2:"ô";s:3:"õ";s:2:"õ";s:3:"ö";s:2:"ö";s:3:"ù";s:2:"ù";s:3:"ú";s:2:"ú";s:3:"û";s:2:"û";s:3:"ü";s:2:"ü";s:3:"ý";s:2:"ý";s:3:"ÿ";s:2:"ÿ";s:3:"Ā";s:2:"Ā";s:3:"ā";s:2:"ā";s:3:"Ă";s:2:"Ă";s:3:"ă";s:2:"ă";s:3:"Ą";s:2:"Ą";s:3:"ą";s:2:"ą";s:3:"Ć";s:2:"Ć";s:3:"ć";s:2:"ć";s:3:"Ĉ";s:2:"Ĉ";s:3:"ĉ";s:2:"ĉ";s:3:"Ċ";s:2:"Ċ";s:3:"ċ";s:2:"ċ";s:3:"Č";s:2:"Č";s:3:"č";s:2:"č";s:3:"Ď";s:2:"Ď";s:3:"ď";s:2:"ď";s:3:"Ē";s:2:"Ē";s:3:"ē";s:2:"ē";s:3:"Ĕ";s:2:"Ĕ";s:3:"ĕ";s:2:"ĕ";s:3:"Ė";s:2:"Ė";s:3:"ė";s:2:"ė";s:3:"Ę";s:2:"Ę";s:3:"ę";s:2:"ę";s:3:"Ě";s:2:"Ě";s:3:"ě";s:2:"ě";s:3:"Ĝ";s:2:"Ĝ";s:3:"ĝ";s:2:"ĝ";s:3:"Ğ";s:2:"Ğ";s:3:"ğ";s:2:"ğ";s:3:"Ġ";s:2:"Ġ";s:3:"ġ";s:2:"ġ";s:3:"Ģ";s:2:"Ģ";s:3:"ģ";s:2:"ģ";s:3:"Ĥ";s:2:"Ĥ";s:3:"ĥ";s:2:"ĥ";s:3:"Ĩ";s:2:"Ĩ";s:3:"ĩ";s:2:"ĩ";s:3:"Ī";s:2:"Ī";s:3:"ī";s:2:"ī";s:3:"Ĭ";s:2:"Ĭ";s:3:"ĭ";s:2:"ĭ";s:3:"Į";s:2:"Į";s:3:"į";s:2:"į";s:3:"İ";s:2:"İ";s:3:"Ĵ";s:2:"Ĵ";s:3:"ĵ";s:2:"ĵ";s:3:"Ķ";s:2:"Ķ";s:3:"ķ";s:2:"ķ";s:3:"Ĺ";s:2:"Ĺ";s:3:"ĺ";s:2:"ĺ";s:3:"Ļ";s:2:"Ļ";s:3:"ļ";s:2:"ļ";s:3:"Ľ";s:2:"Ľ";s:3:"ľ";s:2:"ľ";s:3:"Ń";s:2:"Ń";s:3:"ń";s:2:"ń";s:3:"Ņ";s:2:"Ņ";s:3:"ņ";s:2:"ņ";s:3:"Ň";s:2:"Ň";s:3:"ň";s:2:"ň";s:3:"Ō";s:2:"Ō";s:3:"ō";s:2:"ō";s:3:"Ŏ";s:2:"Ŏ";s:3:"ŏ";s:2:"ŏ";s:3:"Ő";s:2:"Ő";s:3:"ő";s:2:"ő";s:3:"Ŕ";s:2:"Ŕ";s:3:"ŕ";s:2:"ŕ";s:3:"Ŗ";s:2:"Ŗ";s:3:"ŗ";s:2:"ŗ";s:3:"Ř";s:2:"Ř";s:3:"ř";s:2:"ř";s:3:"Ś";s:2:"Ś";s:3:"ś";s:2:"ś";s:3:"Ŝ";s:2:"Ŝ";s:3:"ŝ";s:2:"ŝ";s:3:"Ş";s:2:"Ş";s:3:"ş";s:2:"ş";s:3:"Š";s:2:"Š";s:3:"š";s:2:"š";s:3:"Ţ";s:2:"Ţ";s:3:"ţ";s:2:"ţ";s:3:"Ť";s:2:"Ť";s:3:"ť";s:2:"ť";s:3:"Ũ";s:2:"Ũ";s:3:"ũ";s:2:"ũ";s:3:"Ū";s:2:"Ū";s:3:"ū";s:2:"ū";s:3:"Ŭ";s:2:"Ŭ";s:3:"ŭ";s:2:"ŭ";s:3:"Ů";s:2:"Ů";s:3:"ů";s:2:"ů";s:3:"Ű";s:2:"Ű";s:3:"ű";s:2:"ű";s:3:"Ų";s:2:"Ų";s:3:"ų";s:2:"ų";s:3:"Ŵ";s:2:"Ŵ";s:3:"ŵ";s:2:"ŵ";s:3:"Ŷ";s:2:"Ŷ";s:3:"ŷ";s:2:"ŷ";s:3:"Ÿ";s:2:"Ÿ";s:3:"Ź";s:2:"Ź";s:3:"ź";s:2:"ź";s:3:"Ż";s:2:"Ż";s:3:"ż";s:2:"ż";s:3:"Ž";s:2:"Ž";s:3:"ž";s:2:"ž";s:3:"Ơ";s:2:"Ơ";s:3:"ơ";s:2:"ơ";s:3:"Ư";s:2:"Ư";s:3:"ư";s:2:"ư";s:3:"Ǎ";s:2:"Ǎ";s:3:"ǎ";s:2:"ǎ";s:3:"Ǐ";s:2:"Ǐ";s:3:"ǐ";s:2:"ǐ";s:3:"Ǒ";s:2:"Ǒ";s:3:"ǒ";s:2:"ǒ";s:3:"Ǔ";s:2:"Ǔ";s:3:"ǔ";s:2:"ǔ";s:4:"Ǖ";s:2:"Ǖ";s:4:"ǖ";s:2:"ǖ";s:4:"Ǘ";s:2:"Ǘ";s:4:"ǘ";s:2:"ǘ";s:4:"Ǚ";s:2:"Ǚ";s:4:"ǚ";s:2:"ǚ";s:4:"Ǜ";s:2:"Ǜ";s:4:"ǜ";s:2:"ǜ";s:4:"Ǟ";s:2:"Ǟ";s:4:"ǟ";s:2:"ǟ";s:4:"Ǡ";s:2:"Ǡ";s:4:"ǡ";s:2:"ǡ";s:4:"Ǣ";s:2:"Ǣ";s:4:"ǣ";s:2:"ǣ";s:3:"Ǧ";s:2:"Ǧ";s:3:"ǧ";s:2:"ǧ";s:3:"Ǩ";s:2:"Ǩ";s:3:"ǩ";s:2:"ǩ";s:3:"Ǫ";s:2:"Ǫ";s:3:"ǫ";s:2:"ǫ";s:4:"Ǭ";s:2:"Ǭ";s:4:"ǭ";s:2:"ǭ";s:4:"Ǯ";s:2:"Ǯ";s:4:"ǯ";s:2:"ǯ";s:3:"ǰ";s:2:"ǰ";s:3:"Ǵ";s:2:"Ǵ";s:3:"ǵ";s:2:"ǵ";s:3:"Ǹ";s:2:"Ǹ";s:3:"ǹ";s:2:"ǹ";s:4:"Ǻ";s:2:"Ǻ";s:4:"ǻ";s:2:"ǻ";s:4:"Ǽ";s:2:"Ǽ";s:4:"ǽ";s:2:"ǽ";s:4:"Ǿ";s:2:"Ǿ";s:4:"ǿ";s:2:"ǿ";s:3:"Ȁ";s:2:"Ȁ";s:3:"ȁ";s:2:"ȁ";s:3:"Ȃ";s:2:"Ȃ";s:3:"ȃ";s:2:"ȃ";s:3:"Ȅ";s:2:"Ȅ";s:3:"ȅ";s:2:"ȅ";s:3:"Ȇ";s:2:"Ȇ";s:3:"ȇ";s:2:"ȇ";s:3:"Ȉ";s:2:"Ȉ";s:3:"ȉ";s:2:"ȉ";s:3:"Ȋ";s:2:"Ȋ";s:3:"ȋ";s:2:"ȋ";s:3:"Ȍ";s:2:"Ȍ";s:3:"ȍ";s:2:"ȍ";s:3:"Ȏ";s:2:"Ȏ";s:3:"ȏ";s:2:"ȏ";s:3:"Ȑ";s:2:"Ȑ";s:3:"ȑ";s:2:"ȑ";s:3:"Ȓ";s:2:"Ȓ";s:3:"ȓ";s:2:"ȓ";s:3:"Ȕ";s:2:"Ȕ";s:3:"ȕ";s:2:"ȕ";s:3:"Ȗ";s:2:"Ȗ";s:3:"ȗ";s:2:"ȗ";s:3:"Ș";s:2:"Ș";s:3:"ș";s:2:"ș";s:3:"Ț";s:2:"Ț";s:3:"ț";s:2:"ț";s:3:"Ȟ";s:2:"Ȟ";s:3:"ȟ";s:2:"ȟ";s:3:"Ȧ";s:2:"Ȧ";s:3:"ȧ";s:2:"ȧ";s:3:"Ȩ";s:2:"Ȩ";s:3:"ȩ";s:2:"ȩ";s:4:"Ȫ";s:2:"Ȫ";s:4:"ȫ";s:2:"ȫ";s:4:"Ȭ";s:2:"Ȭ";s:4:"ȭ";s:2:"ȭ";s:3:"Ȯ";s:2:"Ȯ";s:3:"ȯ";s:2:"ȯ";s:4:"Ȱ";s:2:"Ȱ";s:4:"ȱ";s:2:"ȱ";s:3:"Ȳ";s:2:"Ȳ";s:3:"ȳ";s:2:"ȳ";s:4:"΅";s:2:"΅";s:4:"Ά";s:2:"Ά";s:4:"Έ";s:2:"Έ";s:4:"Ή";s:2:"Ή";s:4:"Ί";s:2:"Ί";s:4:"Ό";s:2:"Ό";s:4:"Ύ";s:2:"Ύ";s:4:"Ώ";s:2:"Ώ";s:4:"ΐ";s:2:"ΐ";s:4:"Ϊ";s:2:"Ϊ";s:4:"Ϋ";s:2:"Ϋ";s:4:"ά";s:2:"ά";s:4:"έ";s:2:"έ";s:4:"ή";s:2:"ή";s:4:"ί";s:2:"ί";s:4:"ΰ";s:2:"ΰ";s:4:"ϊ";s:2:"ϊ";s:4:"ϋ";s:2:"ϋ";s:4:"ό";s:2:"ό";s:4:"ύ";s:2:"ύ";s:4:"ώ";s:2:"ώ";s:4:"ϓ";s:2:"ϓ";s:4:"ϔ";s:2:"ϔ";s:4:"Ѐ";s:2:"Ѐ";s:4:"Ё";s:2:"Ё";s:4:"Ѓ";s:2:"Ѓ";s:4:"Ї";s:2:"Ї";s:4:"Ќ";s:2:"Ќ";s:4:"Ѝ";s:2:"Ѝ";s:4:"Ў";s:2:"Ў";s:4:"Й";s:2:"Й";s:4:"й";s:2:"й";s:4:"ѐ";s:2:"ѐ";s:4:"ё";s:2:"ё";s:4:"ѓ";s:2:"ѓ";s:4:"ї";s:2:"ї";s:4:"ќ";s:2:"ќ";s:4:"ѝ";s:2:"ѝ";s:4:"ў";s:2:"ў";s:4:"Ѷ";s:2:"Ѷ";s:4:"ѷ";s:2:"ѷ";s:4:"Ӂ";s:2:"Ӂ";s:4:"ӂ";s:2:"ӂ";s:4:"Ӑ";s:2:"Ӑ";s:4:"ӑ";s:2:"ӑ";s:4:"Ӓ";s:2:"Ӓ";s:4:"ӓ";s:2:"ӓ";s:4:"Ӗ";s:2:"Ӗ";s:4:"ӗ";s:2:"ӗ";s:4:"Ӛ";s:2:"Ӛ";s:4:"ӛ";s:2:"ӛ";s:4:"Ӝ";s:2:"Ӝ";s:4:"ӝ";s:2:"ӝ";s:4:"Ӟ";s:2:"Ӟ";s:4:"ӟ";s:2:"ӟ";s:4:"Ӣ";s:2:"Ӣ";s:4:"ӣ";s:2:"ӣ";s:4:"Ӥ";s:2:"Ӥ";s:4:"ӥ";s:2:"ӥ";s:4:"Ӧ";s:2:"Ӧ";s:4:"ӧ";s:2:"ӧ";s:4:"Ӫ";s:2:"Ӫ";s:4:"ӫ";s:2:"ӫ";s:4:"Ӭ";s:2:"Ӭ";s:4:"ӭ";s:2:"ӭ";s:4:"Ӯ";s:2:"Ӯ";s:4:"ӯ";s:2:"ӯ";s:4:"Ӱ";s:2:"Ӱ";s:4:"ӱ";s:2:"ӱ";s:4:"Ӳ";s:2:"Ӳ";s:4:"ӳ";s:2:"ӳ";s:4:"Ӵ";s:2:"Ӵ";s:4:"ӵ";s:2:"ӵ";s:4:"Ӹ";s:2:"Ӹ";s:4:"ӹ";s:2:"ӹ";s:4:"آ";s:2:"آ";s:4:"أ";s:2:"أ";s:4:"ؤ";s:2:"ؤ";s:4:"إ";s:2:"إ";s:4:"ئ";s:2:"ئ";s:4:"ۀ";s:2:"ۀ";s:4:"ۂ";s:2:"ۂ";s:4:"ۓ";s:2:"ۓ";s:6:"ऩ";s:3:"ऩ";s:6:"ऱ";s:3:"ऱ";s:6:"ऴ";s:3:"ऴ";s:6:"ো";s:3:"ো";s:6:"ৌ";s:3:"ৌ";s:6:"ୈ";s:3:"ୈ";s:6:"ୋ";s:3:"ୋ";s:6:"ୌ";s:3:"ୌ";s:6:"ஔ";s:3:"ஔ";s:6:"ொ";s:3:"ொ";s:6:"ோ";s:3:"ோ";s:6:"ௌ";s:3:"ௌ";s:6:"ై";s:3:"ై";s:6:"ೀ";s:3:"ೀ";s:6:"ೇ";s:3:"ೇ";s:6:"ೈ";s:3:"ೈ";s:6:"ೊ";s:3:"ೊ";s:6:"ೋ";s:3:"ೋ";s:6:"ൊ";s:3:"ൊ";s:6:"ോ";s:3:"ോ";s:6:"ൌ";s:3:"ൌ";s:6:"ේ";s:3:"ේ";s:6:"ො";s:3:"ො";s:6:"ෝ";s:3:"ෝ";s:6:"ෞ";s:3:"ෞ";s:6:"ဦ";s:3:"ဦ";s:6:"ᬆ";s:3:"ᬆ";s:6:"ᬈ";s:3:"ᬈ";s:6:"ᬊ";s:3:"ᬊ";s:6:"ᬌ";s:3:"ᬌ";s:6:"ᬎ";s:3:"ᬎ";s:6:"ᬒ";s:3:"ᬒ";s:6:"ᬻ";s:3:"ᬻ";s:6:"ᬽ";s:3:"ᬽ";s:6:"ᭀ";s:3:"ᭀ";s:6:"ᭁ";s:3:"ᭁ";s:6:"ᭃ";s:3:"ᭃ";s:3:"Ḁ";s:3:"Ḁ";s:3:"ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"Ḅ";s:3:"ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:4:"Ḉ";s:3:"Ḉ";s:4:"ḉ";s:3:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"Ḍ";s:3:"ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"Ḓ";s:3:"ḓ";s:3:"ḓ";s:4:"Ḕ";s:3:"Ḕ";s:4:"ḕ";s:3:"ḕ";s:4:"Ḗ";s:3:"Ḗ";s:4:"ḗ";s:3:"ḗ";s:3:"Ḙ";s:3:"Ḙ";s:3:"ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"Ḛ";s:3:"ḛ";s:3:"ḛ";s:4:"Ḝ";s:3:"Ḝ";s:4:"ḝ";s:3:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"Ḡ";s:3:"ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"Ḥ";s:3:"ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"Ḫ";s:3:"ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"Ḭ";s:3:"ḭ";s:3:"ḭ";s:4:"Ḯ";s:3:"Ḯ";s:4:"ḯ";s:3:"ḯ";s:3:"Ḱ";s:3:"Ḱ";s:3:"ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"Ḳ";s:3:"ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"Ḷ";s:3:"ḷ";s:3:"ḷ";s:5:"Ḹ";s:3:"Ḹ";s:5:"ḹ";s:3:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"Ḽ";s:3:"ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"Ḿ";s:3:"ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"Ṁ";s:3:"ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"Ṃ";s:3:"ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"Ṇ";s:3:"ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"Ṋ";s:3:"ṋ";s:3:"ṋ";s:4:"Ṍ";s:3:"Ṍ";s:4:"ṍ";s:3:"ṍ";s:4:"Ṏ";s:3:"Ṏ";s:4:"ṏ";s:3:"ṏ";s:4:"Ṑ";s:3:"Ṑ";s:4:"ṑ";s:3:"ṑ";s:4:"Ṓ";s:3:"Ṓ";s:4:"ṓ";s:3:"ṓ";s:3:"Ṕ";s:3:"Ṕ";s:3:"ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"Ṗ";s:3:"ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"Ṛ";s:3:"ṛ";s:3:"ṛ";s:5:"Ṝ";s:3:"Ṝ";s:5:"ṝ";s:3:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"Ṣ";s:3:"ṣ";s:3:"ṣ";s:4:"Ṥ";s:3:"Ṥ";s:4:"ṥ";s:3:"ṥ";s:4:"Ṧ";s:3:"Ṧ";s:4:"ṧ";s:3:"ṧ";s:5:"Ṩ";s:3:"Ṩ";s:5:"ṩ";s:3:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"Ṭ";s:3:"ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"Ṱ";s:3:"ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"Ṳ";s:3:"ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"Ṵ";s:3:"ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"Ṷ";s:3:"ṷ";s:3:"ṷ";s:4:"Ṹ";s:3:"Ṹ";s:4:"ṹ";s:3:"ṹ";s:4:"Ṻ";s:3:"Ṻ";s:4:"ṻ";s:3:"ṻ";s:3:"Ṽ";s:3:"Ṽ";s:3:"ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"Ṿ";s:3:"ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"Ẁ";s:3:"ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"Ẃ";s:3:"ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"Ẉ";s:3:"ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"Ẑ";s:3:"ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"Ẓ";s:3:"ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"ẘ";s:3:"ẙ";s:3:"ẙ";s:4:"ẛ";s:3:"ẛ";s:3:"Ạ";s:3:"Ạ";s:3:"ạ";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:4:"Ấ";s:3:"Ấ";s:4:"ấ";s:3:"ấ";s:4:"Ầ";s:3:"Ầ";s:4:"ầ";s:3:"ầ";s:4:"Ẩ";s:3:"Ẩ";s:4:"ẩ";s:3:"ẩ";s:4:"Ẫ";s:3:"Ẫ";s:4:"ẫ";s:3:"ẫ";s:5:"Ậ";s:3:"Ậ";s:5:"ậ";s:3:"ậ";s:4:"Ắ";s:3:"Ắ";s:4:"ắ";s:3:"ắ";s:4:"Ằ";s:3:"Ằ";s:4:"ằ";s:3:"ằ";s:4:"Ẳ";s:3:"Ẳ";s:4:"ẳ";s:3:"ẳ";s:4:"Ẵ";s:3:"Ẵ";s:4:"ẵ";s:3:"ẵ";s:5:"Ặ";s:3:"Ặ";s:5:"ặ";s:3:"ặ";s:3:"Ẹ";s:3:"Ẹ";s:3:"ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:4:"Ế";s:3:"Ế";s:4:"ế";s:3:"ế";s:4:"Ề";s:3:"Ề";s:4:"ề";s:3:"ề";s:4:"Ể";s:3:"Ể";s:4:"ể";s:3:"ể";s:4:"Ễ";s:3:"Ễ";s:4:"ễ";s:3:"ễ";s:5:"Ệ";s:3:"Ệ";s:5:"ệ";s:3:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"Ị";s:3:"ị";s:3:"ị";s:3:"Ọ";s:3:"Ọ";s:3:"ọ";s:3:"ọ";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"ỏ";s:4:"Ố";s:3:"Ố";s:4:"ố";s:3:"ố";s:4:"Ồ";s:3:"Ồ";s:4:"ồ";s:3:"ồ";s:4:"Ổ";s:3:"Ổ";s:4:"ổ";s:3:"ổ";s:4:"Ỗ";s:3:"Ỗ";s:4:"ỗ";s:3:"ỗ";s:5:"Ộ";s:3:"Ộ";s:5:"ộ";s:3:"ộ";s:4:"Ớ";s:3:"Ớ";s:4:"ớ";s:3:"ớ";s:4:"Ờ";s:3:"Ờ";s:4:"ờ";s:3:"ờ";s:4:"Ở";s:3:"Ở";s:4:"ở";s:3:"ở";s:4:"Ỡ";s:3:"Ỡ";s:4:"ỡ";s:3:"ỡ";s:4:"Ợ";s:3:"Ợ";s:4:"ợ";s:3:"ợ";s:3:"Ụ";s:3:"Ụ";s:3:"ụ";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:4:"Ứ";s:3:"Ứ";s:4:"ứ";s:3:"ứ";s:4:"Ừ";s:3:"Ừ";s:4:"ừ";s:3:"ừ";s:4:"Ử";s:3:"Ử";s:4:"ử";s:3:"ử";s:4:"Ữ";s:3:"Ữ";s:4:"ữ";s:3:"ữ";s:4:"Ự";s:3:"Ự";s:4:"ự";s:3:"ự";s:3:"Ỳ";s:3:"Ỳ";s:3:"ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"Ỵ";s:3:"ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"Ỷ";s:3:"ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:4:"ἀ";s:3:"ἀ";s:4:"ἁ";s:3:"ἁ";s:5:"ἂ";s:3:"ἂ";s:5:"ἃ";s:3:"ἃ";s:5:"ἄ";s:3:"ἄ";s:5:"ἅ";s:3:"ἅ";s:5:"ἆ";s:3:"ἆ";s:5:"ἇ";s:3:"ἇ";s:4:"Ἀ";s:3:"Ἀ";s:4:"Ἁ";s:3:"Ἁ";s:5:"Ἂ";s:3:"Ἂ";s:5:"Ἃ";s:3:"Ἃ";s:5:"Ἄ";s:3:"Ἄ";s:5:"Ἅ";s:3:"Ἅ";s:5:"Ἆ";s:3:"Ἆ";s:5:"Ἇ";s:3:"Ἇ";s:4:"ἐ";s:3:"ἐ";s:4:"ἑ";s:3:"ἑ";s:5:"ἒ";s:3:"ἒ";s:5:"ἓ";s:3:"ἓ";s:5:"ἔ";s:3:"ἔ";s:5:"ἕ";s:3:"ἕ";s:4:"Ἐ";s:3:"Ἐ";s:4:"Ἑ";s:3:"Ἑ";s:5:"Ἒ";s:3:"Ἒ";s:5:"Ἓ";s:3:"Ἓ";s:5:"Ἔ";s:3:"Ἔ";s:5:"Ἕ";s:3:"Ἕ";s:4:"ἠ";s:3:"ἠ";s:4:"ἡ";s:3:"ἡ";s:5:"ἢ";s:3:"ἢ";s:5:"ἣ";s:3:"ἣ";s:5:"ἤ";s:3:"ἤ";s:5:"ἥ";s:3:"ἥ";s:5:"ἦ";s:3:"ἦ";s:5:"ἧ";s:3:"ἧ";s:4:"Ἠ";s:3:"Ἠ";s:4:"Ἡ";s:3:"Ἡ";s:5:"Ἢ";s:3:"Ἢ";s:5:"Ἣ";s:3:"Ἣ";s:5:"Ἤ";s:3:"Ἤ";s:5:"Ἥ";s:3:"Ἥ";s:5:"Ἦ";s:3:"Ἦ";s:5:"Ἧ";s:3:"Ἧ";s:4:"ἰ";s:3:"ἰ";s:4:"ἱ";s:3:"ἱ";s:5:"ἲ";s:3:"ἲ";s:5:"ἳ";s:3:"ἳ";s:5:"ἴ";s:3:"ἴ";s:5:"ἵ";s:3:"ἵ";s:5:"ἶ";s:3:"ἶ";s:5:"ἷ";s:3:"ἷ";s:4:"Ἰ";s:3:"Ἰ";s:4:"Ἱ";s:3:"Ἱ";s:5:"Ἲ";s:3:"Ἲ";s:5:"Ἳ";s:3:"Ἳ";s:5:"Ἴ";s:3:"Ἴ";s:5:"Ἵ";s:3:"Ἵ";s:5:"Ἶ";s:3:"Ἶ";s:5:"Ἷ";s:3:"Ἷ";s:4:"ὀ";s:3:"ὀ";s:4:"ὁ";s:3:"ὁ";s:5:"ὂ";s:3:"ὂ";s:5:"ὃ";s:3:"ὃ";s:5:"ὄ";s:3:"ὄ";s:5:"ὅ";s:3:"ὅ";s:4:"Ὀ";s:3:"Ὀ";s:4:"Ὁ";s:3:"Ὁ";s:5:"Ὂ";s:3:"Ὂ";s:5:"Ὃ";s:3:"Ὃ";s:5:"Ὄ";s:3:"Ὄ";s:5:"Ὅ";s:3:"Ὅ";s:4:"ὐ";s:3:"ὐ";s:4:"ὑ";s:3:"ὑ";s:5:"ὒ";s:3:"ὒ";s:5:"ὓ";s:3:"ὓ";s:5:"ὔ";s:3:"ὔ";s:5:"ὕ";s:3:"ὕ";s:5:"ὖ";s:3:"ὖ";s:5:"ὗ";s:3:"ὗ";s:4:"Ὑ";s:3:"Ὑ";s:5:"Ὓ";s:3:"Ὓ";s:5:"Ὕ";s:3:"Ὕ";s:5:"Ὗ";s:3:"Ὗ";s:4:"ὠ";s:3:"ὠ";s:4:"ὡ";s:3:"ὡ";s:5:"ὢ";s:3:"ὢ";s:5:"ὣ";s:3:"ὣ";s:5:"ὤ";s:3:"ὤ";s:5:"ὥ";s:3:"ὥ";s:5:"ὦ";s:3:"ὦ";s:5:"ὧ";s:3:"ὧ";s:4:"Ὠ";s:3:"Ὠ";s:4:"Ὡ";s:3:"Ὡ";s:5:"Ὢ";s:3:"Ὢ";s:5:"Ὣ";s:3:"Ὣ";s:5:"Ὤ";s:3:"Ὤ";s:5:"Ὥ";s:3:"Ὥ";s:5:"Ὦ";s:3:"Ὦ";s:5:"Ὧ";s:3:"Ὧ";s:4:"ὰ";s:3:"ὰ";s:4:"ὲ";s:3:"ὲ";s:4:"ὴ";s:3:"ὴ";s:4:"ὶ";s:3:"ὶ";s:4:"ὸ";s:3:"ὸ";s:4:"ὺ";s:3:"ὺ";s:4:"ὼ";s:3:"ὼ";s:5:"ᾀ";s:3:"ᾀ";s:5:"ᾁ";s:3:"ᾁ";s:5:"ᾂ";s:3:"ᾂ";s:5:"ᾃ";s:3:"ᾃ";s:5:"ᾄ";s:3:"ᾄ";s:5:"ᾅ";s:3:"ᾅ";s:5:"ᾆ";s:3:"ᾆ";s:5:"ᾇ";s:3:"ᾇ";s:5:"ᾈ";s:3:"ᾈ";s:5:"ᾉ";s:3:"ᾉ";s:5:"ᾊ";s:3:"ᾊ";s:5:"ᾋ";s:3:"ᾋ";s:5:"ᾌ";s:3:"ᾌ";s:5:"ᾍ";s:3:"ᾍ";s:5:"ᾎ";s:3:"ᾎ";s:5:"ᾏ";s:3:"ᾏ";s:5:"ᾐ";s:3:"ᾐ";s:5:"ᾑ";s:3:"ᾑ";s:5:"ᾒ";s:3:"ᾒ";s:5:"ᾓ";s:3:"ᾓ";s:5:"ᾔ";s:3:"ᾔ";s:5:"ᾕ";s:3:"ᾕ";s:5:"ᾖ";s:3:"ᾖ";s:5:"ᾗ";s:3:"ᾗ";s:5:"ᾘ";s:3:"ᾘ";s:5:"ᾙ";s:3:"ᾙ";s:5:"ᾚ";s:3:"ᾚ";s:5:"ᾛ";s:3:"ᾛ";s:5:"ᾜ";s:3:"ᾜ";s:5:"ᾝ";s:3:"ᾝ";s:5:"ᾞ";s:3:"ᾞ";s:5:"ᾟ";s:3:"ᾟ";s:5:"ᾠ";s:3:"ᾠ";s:5:"ᾡ";s:3:"ᾡ";s:5:"ᾢ";s:3:"ᾢ";s:5:"ᾣ";s:3:"ᾣ";s:5:"ᾤ";s:3:"ᾤ";s:5:"ᾥ";s:3:"ᾥ";s:5:"ᾦ";s:3:"ᾦ";s:5:"ᾧ";s:3:"ᾧ";s:5:"ᾨ";s:3:"ᾨ";s:5:"ᾩ";s:3:"ᾩ";s:5:"ᾪ";s:3:"ᾪ";s:5:"ᾫ";s:3:"ᾫ";s:5:"ᾬ";s:3:"ᾬ";s:5:"ᾭ";s:3:"ᾭ";s:5:"ᾮ";s:3:"ᾮ";s:5:"ᾯ";s:3:"ᾯ";s:4:"ᾰ";s:3:"ᾰ";s:4:"ᾱ";s:3:"ᾱ";s:5:"ᾲ";s:3:"ᾲ";s:4:"ᾳ";s:3:"ᾳ";s:4:"ᾴ";s:3:"ᾴ";s:4:"ᾶ";s:3:"ᾶ";s:5:"ᾷ";s:3:"ᾷ";s:4:"Ᾰ";s:3:"Ᾰ";s:4:"Ᾱ";s:3:"Ᾱ";s:4:"Ὰ";s:3:"Ὰ";s:4:"ᾼ";s:3:"ᾼ";s:4:"῁";s:3:"῁";s:5:"ῂ";s:3:"ῂ";s:4:"ῃ";s:3:"ῃ";s:4:"ῄ";s:3:"ῄ";s:4:"ῆ";s:3:"ῆ";s:5:"ῇ";s:3:"ῇ";s:4:"Ὲ";s:3:"Ὲ";s:4:"Ὴ";s:3:"Ὴ";s:4:"ῌ";s:3:"ῌ";s:5:"῍";s:3:"῍";s:5:"῎";s:3:"῎";s:5:"῏";s:3:"῏";s:4:"ῐ";s:3:"ῐ";s:4:"ῑ";s:3:"ῑ";s:4:"ῒ";s:3:"ῒ";s:4:"ῖ";s:3:"ῖ";s:4:"ῗ";s:3:"ῗ";s:4:"Ῐ";s:3:"Ῐ";s:4:"Ῑ";s:3:"Ῑ";s:4:"Ὶ";s:3:"Ὶ";s:5:"῝";s:3:"῝";s:5:"῞";s:3:"῞";s:5:"῟";s:3:"῟";s:4:"ῠ";s:3:"ῠ";s:4:"ῡ";s:3:"ῡ";s:4:"ῢ";s:3:"ῢ";s:4:"ῤ";s:3:"ῤ";s:4:"ῥ";s:3:"ῥ";s:4:"ῦ";s:3:"ῦ";s:4:"ῧ";s:3:"ῧ";s:4:"Ῠ";s:3:"Ῠ";s:4:"Ῡ";s:3:"Ῡ";s:4:"Ὺ";s:3:"Ὺ";s:4:"Ῥ";s:3:"Ῥ";s:4:"῭";s:3:"῭";s:5:"ῲ";s:3:"ῲ";s:4:"ῳ";s:3:"ῳ";s:4:"ῴ";s:3:"ῴ";s:4:"ῶ";s:3:"ῶ";s:5:"ῷ";s:3:"ῷ";s:4:"Ὸ";s:3:"Ὸ";s:4:"Ὼ";s:3:"Ὼ";s:4:"ῼ";s:3:"ῼ";s:5:"↚";s:3:"↚";s:5:"↛";s:3:"↛";s:5:"↮";s:3:"↮";s:5:"⇍";s:3:"⇍";s:5:"⇎";s:3:"⇎";s:5:"⇏";s:3:"⇏";s:5:"∄";s:3:"∄";s:5:"∉";s:3:"∉";s:5:"∌";s:3:"∌";s:5:"∤";s:3:"∤";s:5:"∦";s:3:"∦";s:5:"≁";s:3:"≁";s:5:"≄";s:3:"≄";s:5:"≇";s:3:"≇";s:5:"≉";s:3:"≉";s:3:"≠";s:3:"≠";s:5:"≢";s:3:"≢";s:5:"≭";s:3:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:5:"≰";s:3:"≰";s:5:"≱";s:3:"≱";s:5:"≴";s:3:"≴";s:5:"≵";s:3:"≵";s:5:"≸";s:3:"≸";s:5:"≹";s:3:"≹";s:5:"⊀";s:3:"⊀";s:5:"⊁";s:3:"⊁";s:5:"⊄";s:3:"⊄";s:5:"⊅";s:3:"⊅";s:5:"⊈";s:3:"⊈";s:5:"⊉";s:3:"⊉";s:5:"⊬";s:3:"⊬";s:5:"⊭";s:3:"⊭";s:5:"⊮";s:3:"⊮";s:5:"⊯";s:3:"⊯";s:5:"⋠";s:3:"⋠";s:5:"⋡";s:3:"⋡";s:5:"⋢";s:3:"⋢";s:5:"⋣";s:3:"⋣";s:5:"⋪";s:3:"⋪";s:5:"⋫";s:3:"⋫";s:5:"⋬";s:3:"⋬";s:5:"⋭";s:3:"⋭";s:6:"が";s:3:"が";s:6:"ぎ";s:3:"ぎ";s:6:"ぐ";s:3:"ぐ";s:6:"げ";s:3:"げ";s:6:"ご";s:3:"ご";s:6:"ざ";s:3:"ざ";s:6:"じ";s:3:"じ";s:6:"ず";s:3:"ず";s:6:"ぜ";s:3:"ぜ";s:6:"ぞ";s:3:"ぞ";s:6:"だ";s:3:"だ";s:6:"ぢ";s:3:"ぢ";s:6:"づ";s:3:"づ";s:6:"で";s:3:"で";s:6:"ど";s:3:"ど";s:6:"ば";s:3:"ば";s:6:"ぱ";s:3:"ぱ";s:6:"び";s:3:"び";s:6:"ぴ";s:3:"ぴ";s:6:"ぶ";s:3:"ぶ";s:6:"ぷ";s:3:"ぷ";s:6:"べ";s:3:"べ";s:6:"ぺ";s:3:"ぺ";s:6:"ぼ";s:3:"ぼ";s:6:"ぽ";s:3:"ぽ";s:6:"ゔ";s:3:"ゔ";s:6:"ゞ";s:3:"ゞ";s:6:"ガ";s:3:"ガ";s:6:"ギ";s:3:"ギ";s:6:"グ";s:3:"グ";s:6:"ゲ";s:3:"ゲ";s:6:"ゴ";s:3:"ゴ";s:6:"ザ";s:3:"ザ";s:6:"ジ";s:3:"ジ";s:6:"ズ";s:3:"ズ";s:6:"ゼ";s:3:"ゼ";s:6:"ゾ";s:3:"ゾ";s:6:"ダ";s:3:"ダ";s:6:"ヂ";s:3:"ヂ";s:6:"ヅ";s:3:"ヅ";s:6:"デ";s:3:"デ";s:6:"ド";s:3:"ド";s:6:"バ";s:3:"バ";s:6:"パ";s:3:"パ";s:6:"ビ";s:3:"ビ";s:6:"ピ";s:3:"ピ";s:6:"ブ";s:3:"ブ";s:6:"プ";s:3:"プ";s:6:"ベ";s:3:"ベ";s:6:"ペ";s:3:"ペ";s:6:"ボ";s:3:"ボ";s:6:"ポ";s:3:"ポ";s:6:"ヴ";s:3:"ヴ";s:6:"ヷ";s:3:"ヷ";s:6:"ヸ";s:3:"ヸ";s:6:"ヹ";s:3:"ヹ";s:6:"ヺ";s:3:"ヺ";s:6:"ヾ";s:3:"ヾ";s:8:"𑂚";s:4:"𑂚";s:8:"𑂜";s:4:"𑂜";s:8:"𑂫";s:4:"𑂫";s:8:"𑄮";s:4:"𑄮";s:8:"𑄯";s:4:"𑄯";s:8:"𑍋";s:4:"𑍋";s:8:"𑍌";s:4:"𑍌";s:8:"𑒻";s:4:"𑒻";s:8:"𑒼";s:4:"𑒼";s:8:"𑒾";s:4:"𑒾";s:8:"𑖺";s:4:"𑖺";s:8:"𑖻";s:4:"𑖻";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/unidata/canonicalDecomposition.ser
@@ -0,0 +1 @@
+a:2060:{s:2:"À";s:3:"À";s:2:"Á";s:3:"Á";s:2:"Â";s:3:"Â";s:2:"Ã";s:3:"Ã";s:2:"Ä";s:3:"Ä";s:2:"Å";s:3:"Å";s:2:"Ç";s:3:"Ç";s:2:"È";s:3:"È";s:2:"É";s:3:"É";s:2:"Ê";s:3:"Ê";s:2:"Ë";s:3:"Ë";s:2:"Ì";s:3:"Ì";s:2:"Í";s:3:"Í";s:2:"Î";s:3:"Î";s:2:"Ï";s:3:"Ï";s:2:"Ñ";s:3:"Ñ";s:2:"Ò";s:3:"Ò";s:2:"Ó";s:3:"Ó";s:2:"Ô";s:3:"Ô";s:2:"Õ";s:3:"Õ";s:2:"Ö";s:3:"Ö";s:2:"Ù";s:3:"Ù";s:2:"Ú";s:3:"Ú";s:2:"Û";s:3:"Û";s:2:"Ü";s:3:"Ü";s:2:"Ý";s:3:"Ý";s:2:"à";s:3:"à";s:2:"á";s:3:"á";s:2:"â";s:3:"â";s:2:"ã";s:3:"ã";s:2:"ä";s:3:"ä";s:2:"å";s:3:"å";s:2:"ç";s:3:"ç";s:2:"è";s:3:"è";s:2:"é";s:3:"é";s:2:"ê";s:3:"ê";s:2:"ë";s:3:"ë";s:2:"ì";s:3:"ì";s:2:"í";s:3:"í";s:2:"î";s:3:"î";s:2:"ï";s:3:"ï";s:2:"ñ";s:3:"ñ";s:2:"ò";s:3:"ò";s:2:"ó";s:3:"ó";s:2:"ô";s:3:"ô";s:2:"õ";s:3:"õ";s:2:"ö";s:3:"ö";s:2:"ù";s:3:"ù";s:2:"ú";s:3:"ú";s:2:"û";s:3:"û";s:2:"ü";s:3:"ü";s:2:"ý";s:3:"ý";s:2:"ÿ";s:3:"ÿ";s:2:"Ā";s:3:"Ā";s:2:"ā";s:3:"ā";s:2:"Ă";s:3:"Ă";s:2:"ă";s:3:"ă";s:2:"Ą";s:3:"Ą";s:2:"ą";s:3:"ą";s:2:"Ć";s:3:"Ć";s:2:"ć";s:3:"ć";s:2:"Ĉ";s:3:"Ĉ";s:2:"ĉ";s:3:"ĉ";s:2:"Ċ";s:3:"Ċ";s:2:"ċ";s:3:"ċ";s:2:"Č";s:3:"Č";s:2:"č";s:3:"č";s:2:"Ď";s:3:"Ď";s:2:"ď";s:3:"ď";s:2:"Ē";s:3:"Ē";s:2:"ē";s:3:"ē";s:2:"Ĕ";s:3:"Ĕ";s:2:"ĕ";s:3:"ĕ";s:2:"Ė";s:3:"Ė";s:2:"ė";s:3:"ė";s:2:"Ę";s:3:"Ę";s:2:"ę";s:3:"ę";s:2:"Ě";s:3:"Ě";s:2:"ě";s:3:"ě";s:2:"Ĝ";s:3:"Ĝ";s:2:"ĝ";s:3:"ĝ";s:2:"Ğ";s:3:"Ğ";s:2:"ğ";s:3:"ğ";s:2:"Ġ";s:3:"Ġ";s:2:"ġ";s:3:"ġ";s:2:"Ģ";s:3:"Ģ";s:2:"ģ";s:3:"ģ";s:2:"Ĥ";s:3:"Ĥ";s:2:"ĥ";s:3:"ĥ";s:2:"Ĩ";s:3:"Ĩ";s:2:"ĩ";s:3:"ĩ";s:2:"Ī";s:3:"Ī";s:2:"ī";s:3:"ī";s:2:"Ĭ";s:3:"Ĭ";s:2:"ĭ";s:3:"ĭ";s:2:"Į";s:3:"Į";s:2:"į";s:3:"į";s:2:"İ";s:3:"İ";s:2:"Ĵ";s:3:"Ĵ";s:2:"ĵ";s:3:"ĵ";s:2:"Ķ";s:3:"Ķ";s:2:"ķ";s:3:"ķ";s:2:"Ĺ";s:3:"Ĺ";s:2:"ĺ";s:3:"ĺ";s:2:"Ļ";s:3:"Ļ";s:2:"ļ";s:3:"ļ";s:2:"Ľ";s:3:"Ľ";s:2:"ľ";s:3:"ľ";s:2:"Ń";s:3:"Ń";s:2:"ń";s:3:"ń";s:2:"Ņ";s:3:"Ņ";s:2:"ņ";s:3:"ņ";s:2:"Ň";s:3:"Ň";s:2:"ň";s:3:"ň";s:2:"Ō";s:3:"Ō";s:2:"ō";s:3:"ō";s:2:"Ŏ";s:3:"Ŏ";s:2:"ŏ";s:3:"ŏ";s:2:"Ő";s:3:"Ő";s:2:"ő";s:3:"ő";s:2:"Ŕ";s:3:"Ŕ";s:2:"ŕ";s:3:"ŕ";s:2:"Ŗ";s:3:"Ŗ";s:2:"ŗ";s:3:"ŗ";s:2:"Ř";s:3:"Ř";s:2:"ř";s:3:"ř";s:2:"Ś";s:3:"Ś";s:2:"ś";s:3:"ś";s:2:"Ŝ";s:3:"Ŝ";s:2:"ŝ";s:3:"ŝ";s:2:"Ş";s:3:"Ş";s:2:"ş";s:3:"ş";s:2:"Š";s:3:"Š";s:2:"š";s:3:"š";s:2:"Ţ";s:3:"Ţ";s:2:"ţ";s:3:"ţ";s:2:"Ť";s:3:"Ť";s:2:"ť";s:3:"ť";s:2:"Ũ";s:3:"Ũ";s:2:"ũ";s:3:"ũ";s:2:"Ū";s:3:"Ū";s:2:"ū";s:3:"ū";s:2:"Ŭ";s:3:"Ŭ";s:2:"ŭ";s:3:"ŭ";s:2:"Ů";s:3:"Ů";s:2:"ů";s:3:"ů";s:2:"Ű";s:3:"Ű";s:2:"ű";s:3:"ű";s:2:"Ų";s:3:"Ų";s:2:"ų";s:3:"ų";s:2:"Ŵ";s:3:"Ŵ";s:2:"ŵ";s:3:"ŵ";s:2:"Ŷ";s:3:"Ŷ";s:2:"ŷ";s:3:"ŷ";s:2:"Ÿ";s:3:"Ÿ";s:2:"Ź";s:3:"Ź";s:2:"ź";s:3:"ź";s:2:"Ż";s:3:"Ż";s:2:"ż";s:3:"ż";s:2:"Ž";s:3:"Ž";s:2:"ž";s:3:"ž";s:2:"Ơ";s:3:"Ơ";s:2:"ơ";s:3:"ơ";s:2:"Ư";s:3:"Ư";s:2:"ư";s:3:"ư";s:2:"Ǎ";s:3:"Ǎ";s:2:"ǎ";s:3:"ǎ";s:2:"Ǐ";s:3:"Ǐ";s:2:"ǐ";s:3:"ǐ";s:2:"Ǒ";s:3:"Ǒ";s:2:"ǒ";s:3:"ǒ";s:2:"Ǔ";s:3:"Ǔ";s:2:"ǔ";s:3:"ǔ";s:2:"Ǖ";s:5:"Ǖ";s:2:"ǖ";s:5:"ǖ";s:2:"Ǘ";s:5:"Ǘ";s:2:"ǘ";s:5:"ǘ";s:2:"Ǚ";s:5:"Ǚ";s:2:"ǚ";s:5:"ǚ";s:2:"Ǜ";s:5:"Ǜ";s:2:"ǜ";s:5:"ǜ";s:2:"Ǟ";s:5:"Ǟ";s:2:"ǟ";s:5:"ǟ";s:2:"Ǡ";s:5:"Ǡ";s:2:"ǡ";s:5:"ǡ";s:2:"Ǣ";s:4:"Ǣ";s:2:"ǣ";s:4:"ǣ";s:2:"Ǧ";s:3:"Ǧ";s:2:"ǧ";s:3:"ǧ";s:2:"Ǩ";s:3:"Ǩ";s:2:"ǩ";s:3:"ǩ";s:2:"Ǫ";s:3:"Ǫ";s:2:"ǫ";s:3:"ǫ";s:2:"Ǭ";s:5:"Ǭ";s:2:"ǭ";s:5:"ǭ";s:2:"Ǯ";s:4:"Ǯ";s:2:"ǯ";s:4:"ǯ";s:2:"ǰ";s:3:"ǰ";s:2:"Ǵ";s:3:"Ǵ";s:2:"ǵ";s:3:"ǵ";s:2:"Ǹ";s:3:"Ǹ";s:2:"ǹ";s:3:"ǹ";s:2:"Ǻ";s:5:"Ǻ";s:2:"ǻ";s:5:"ǻ";s:2:"Ǽ";s:4:"Ǽ";s:2:"ǽ";s:4:"ǽ";s:2:"Ǿ";s:4:"Ǿ";s:2:"ǿ";s:4:"ǿ";s:2:"Ȁ";s:3:"Ȁ";s:2:"ȁ";s:3:"ȁ";s:2:"Ȃ";s:3:"Ȃ";s:2:"ȃ";s:3:"ȃ";s:2:"Ȅ";s:3:"Ȅ";s:2:"ȅ";s:3:"ȅ";s:2:"Ȇ";s:3:"Ȇ";s:2:"ȇ";s:3:"ȇ";s:2:"Ȉ";s:3:"Ȉ";s:2:"ȉ";s:3:"ȉ";s:2:"Ȋ";s:3:"Ȋ";s:2:"ȋ";s:3:"ȋ";s:2:"Ȍ";s:3:"Ȍ";s:2:"ȍ";s:3:"ȍ";s:2:"Ȏ";s:3:"Ȏ";s:2:"ȏ";s:3:"ȏ";s:2:"Ȑ";s:3:"Ȑ";s:2:"ȑ";s:3:"ȑ";s:2:"Ȓ";s:3:"Ȓ";s:2:"ȓ";s:3:"ȓ";s:2:"Ȕ";s:3:"Ȕ";s:2:"ȕ";s:3:"ȕ";s:2:"Ȗ";s:3:"Ȗ";s:2:"ȗ";s:3:"ȗ";s:2:"Ș";s:3:"Ș";s:2:"ș";s:3:"ș";s:2:"Ț";s:3:"Ț";s:2:"ț";s:3:"ț";s:2:"Ȟ";s:3:"Ȟ";s:2:"ȟ";s:3:"ȟ";s:2:"Ȧ";s:3:"Ȧ";s:2:"ȧ";s:3:"ȧ";s:2:"Ȩ";s:3:"Ȩ";s:2:"ȩ";s:3:"ȩ";s:2:"Ȫ";s:5:"Ȫ";s:2:"ȫ";s:5:"ȫ";s:2:"Ȭ";s:5:"Ȭ";s:2:"ȭ";s:5:"ȭ";s:2:"Ȯ";s:3:"Ȯ";s:2:"ȯ";s:3:"ȯ";s:2:"Ȱ";s:5:"Ȱ";s:2:"ȱ";s:5:"ȱ";s:2:"Ȳ";s:3:"Ȳ";s:2:"ȳ";s:3:"ȳ";s:2:"̀";s:2:"̀";s:2:"́";s:2:"́";s:2:"̓";s:2:"̓";s:2:"̈́";s:4:"̈́";s:2:"ʹ";s:2:"ʹ";s:2:";";s:1:";";s:2:"΅";s:4:"΅";s:2:"Ά";s:4:"Ά";s:2:"·";s:2:"·";s:2:"Έ";s:4:"Έ";s:2:"Ή";s:4:"Ή";s:2:"Ί";s:4:"Ί";s:2:"Ό";s:4:"Ό";s:2:"Ύ";s:4:"Ύ";s:2:"Ώ";s:4:"Ώ";s:2:"ΐ";s:6:"ΐ";s:2:"Ϊ";s:4:"Ϊ";s:2:"Ϋ";s:4:"Ϋ";s:2:"ά";s:4:"ά";s:2:"έ";s:4:"έ";s:2:"ή";s:4:"ή";s:2:"ί";s:4:"ί";s:2:"ΰ";s:6:"ΰ";s:2:"ϊ";s:4:"ϊ";s:2:"ϋ";s:4:"ϋ";s:2:"ό";s:4:"ό";s:2:"ύ";s:4:"ύ";s:2:"ώ";s:4:"ώ";s:2:"ϓ";s:4:"ϓ";s:2:"ϔ";s:4:"ϔ";s:2:"Ѐ";s:4:"Ѐ";s:2:"Ё";s:4:"Ё";s:2:"Ѓ";s:4:"Ѓ";s:2:"Ї";s:4:"Ї";s:2:"Ќ";s:4:"Ќ";s:2:"Ѝ";s:4:"Ѝ";s:2:"Ў";s:4:"Ў";s:2:"Й";s:4:"Й";s:2:"й";s:4:"й";s:2:"ѐ";s:4:"ѐ";s:2:"ё";s:4:"ё";s:2:"ѓ";s:4:"ѓ";s:2:"ї";s:4:"ї";s:2:"ќ";s:4:"ќ";s:2:"ѝ";s:4:"ѝ";s:2:"ў";s:4:"ў";s:2:"Ѷ";s:4:"Ѷ";s:2:"ѷ";s:4:"ѷ";s:2:"Ӂ";s:4:"Ӂ";s:2:"ӂ";s:4:"ӂ";s:2:"Ӑ";s:4:"Ӑ";s:2:"ӑ";s:4:"ӑ";s:2:"Ӓ";s:4:"Ӓ";s:2:"ӓ";s:4:"ӓ";s:2:"Ӗ";s:4:"Ӗ";s:2:"ӗ";s:4:"ӗ";s:2:"Ӛ";s:4:"Ӛ";s:2:"ӛ";s:4:"ӛ";s:2:"Ӝ";s:4:"Ӝ";s:2:"ӝ";s:4:"ӝ";s:2:"Ӟ";s:4:"Ӟ";s:2:"ӟ";s:4:"ӟ";s:2:"Ӣ";s:4:"Ӣ";s:2:"ӣ";s:4:"ӣ";s:2:"Ӥ";s:4:"Ӥ";s:2:"ӥ";s:4:"ӥ";s:2:"Ӧ";s:4:"Ӧ";s:2:"ӧ";s:4:"ӧ";s:2:"Ӫ";s:4:"Ӫ";s:2:"ӫ";s:4:"ӫ";s:2:"Ӭ";s:4:"Ӭ";s:2:"ӭ";s:4:"ӭ";s:2:"Ӯ";s:4:"Ӯ";s:2:"ӯ";s:4:"ӯ";s:2:"Ӱ";s:4:"Ӱ";s:2:"ӱ";s:4:"ӱ";s:2:"Ӳ";s:4:"Ӳ";s:2:"ӳ";s:4:"ӳ";s:2:"Ӵ";s:4:"Ӵ";s:2:"ӵ";s:4:"ӵ";s:2:"Ӹ";s:4:"Ӹ";s:2:"ӹ";s:4:"ӹ";s:2:"آ";s:4:"آ";s:2:"أ";s:4:"أ";s:2:"ؤ";s:4:"ؤ";s:2:"إ";s:4:"إ";s:2:"ئ";s:4:"ئ";s:2:"ۀ";s:4:"ۀ";s:2:"ۂ";s:4:"ۂ";s:2:"ۓ";s:4:"ۓ";s:3:"ऩ";s:6:"ऩ";s:3:"ऱ";s:6:"ऱ";s:3:"ऴ";s:6:"ऴ";s:3:"क़";s:6:"क़";s:3:"ख़";s:6:"ख़";s:3:"ग़";s:6:"ग़";s:3:"ज़";s:6:"ज़";s:3:"ड़";s:6:"ड़";s:3:"ढ़";s:6:"ढ़";s:3:"फ़";s:6:"फ़";s:3:"य़";s:6:"य़";s:3:"ো";s:6:"ো";s:3:"ৌ";s:6:"ৌ";s:3:"ড়";s:6:"ড়";s:3:"ঢ়";s:6:"ঢ়";s:3:"য়";s:6:"য়";s:3:"ਲ਼";s:6:"ਲ਼";s:3:"ਸ਼";s:6:"ਸ਼";s:3:"ਖ਼";s:6:"ਖ਼";s:3:"ਗ਼";s:6:"ਗ਼";s:3:"ਜ਼";s:6:"ਜ਼";s:3:"ਫ਼";s:6:"ਫ਼";s:3:"ୈ";s:6:"ୈ";s:3:"ୋ";s:6:"ୋ";s:3:"ୌ";s:6:"ୌ";s:3:"ଡ଼";s:6:"ଡ଼";s:3:"ଢ଼";s:6:"ଢ଼";s:3:"ஔ";s:6:"ஔ";s:3:"ொ";s:6:"ொ";s:3:"ோ";s:6:"ோ";s:3:"ௌ";s:6:"ௌ";s:3:"ై";s:6:"ై";s:3:"ೀ";s:6:"ೀ";s:3:"ೇ";s:6:"ೇ";s:3:"ೈ";s:6:"ೈ";s:3:"ೊ";s:6:"ೊ";s:3:"ೋ";s:9:"ೋ";s:3:"ൊ";s:6:"ൊ";s:3:"ോ";s:6:"ോ";s:3:"ൌ";s:6:"ൌ";s:3:"ේ";s:6:"ේ";s:3:"ො";s:6:"ො";s:3:"ෝ";s:9:"ෝ";s:3:"ෞ";s:6:"ෞ";s:3:"གྷ";s:6:"གྷ";s:3:"ཌྷ";s:6:"ཌྷ";s:3:"དྷ";s:6:"དྷ";s:3:"བྷ";s:6:"བྷ";s:3:"ཛྷ";s:6:"ཛྷ";s:3:"ཀྵ";s:6:"ཀྵ";s:3:"ཱི";s:6:"ཱི";s:3:"ཱུ";s:6:"ཱུ";s:3:"ྲྀ";s:6:"ྲྀ";s:3:"ླྀ";s:6:"ླྀ";s:3:"ཱྀ";s:6:"ཱྀ";s:3:"ྒྷ";s:6:"ྒྷ";s:3:"ྜྷ";s:6:"ྜྷ";s:3:"ྡྷ";s:6:"ྡྷ";s:3:"ྦྷ";s:6:"ྦྷ";s:3:"ྫྷ";s:6:"ྫྷ";s:3:"ྐྵ";s:6:"ྐྵ";s:3:"ဦ";s:6:"ဦ";s:3:"ᬆ";s:6:"ᬆ";s:3:"ᬈ";s:6:"ᬈ";s:3:"ᬊ";s:6:"ᬊ";s:3:"ᬌ";s:6:"ᬌ";s:3:"ᬎ";s:6:"ᬎ";s:3:"ᬒ";s:6:"ᬒ";s:3:"ᬻ";s:6:"ᬻ";s:3:"ᬽ";s:6:"ᬽ";s:3:"ᭀ";s:6:"ᭀ";s:3:"ᭁ";s:6:"ᭁ";s:3:"ᭃ";s:6:"ᭃ";s:3:"Ḁ";s:3:"Ḁ";s:3:"ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"Ḅ";s:3:"ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:3:"Ḉ";s:5:"Ḉ";s:3:"ḉ";s:5:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"Ḍ";s:3:"ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"Ḓ";s:3:"ḓ";s:3:"ḓ";s:3:"Ḕ";s:5:"Ḕ";s:3:"ḕ";s:5:"ḕ";s:3:"Ḗ";s:5:"Ḗ";s:3:"ḗ";s:5:"ḗ";s:3:"Ḙ";s:3:"Ḙ";s:3:"ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"Ḛ";s:3:"ḛ";s:3:"ḛ";s:3:"Ḝ";s:5:"Ḝ";s:3:"ḝ";s:5:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"Ḡ";s:3:"ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"Ḥ";s:3:"ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"Ḫ";s:3:"ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"Ḭ";s:3:"ḭ";s:3:"ḭ";s:3:"Ḯ";s:5:"Ḯ";s:3:"ḯ";s:5:"ḯ";s:3:"Ḱ";s:3:"Ḱ";s:3:"ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"Ḳ";s:3:"ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"Ḷ";s:3:"ḷ";s:3:"ḷ";s:3:"Ḹ";s:5:"Ḹ";s:3:"ḹ";s:5:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"Ḽ";s:3:"ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"Ḿ";s:3:"ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"Ṁ";s:3:"ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"Ṃ";s:3:"ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"Ṇ";s:3:"ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"Ṋ";s:3:"ṋ";s:3:"ṋ";s:3:"Ṍ";s:5:"Ṍ";s:3:"ṍ";s:5:"ṍ";s:3:"Ṏ";s:5:"Ṏ";s:3:"ṏ";s:5:"ṏ";s:3:"Ṑ";s:5:"Ṑ";s:3:"ṑ";s:5:"ṑ";s:3:"Ṓ";s:5:"Ṓ";s:3:"ṓ";s:5:"ṓ";s:3:"Ṕ";s:3:"Ṕ";s:3:"ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"Ṗ";s:3:"ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"Ṛ";s:3:"ṛ";s:3:"ṛ";s:3:"Ṝ";s:5:"Ṝ";s:3:"ṝ";s:5:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"Ṣ";s:3:"ṣ";s:3:"ṣ";s:3:"Ṥ";s:5:"Ṥ";s:3:"ṥ";s:5:"ṥ";s:3:"Ṧ";s:5:"Ṧ";s:3:"ṧ";s:5:"ṧ";s:3:"Ṩ";s:5:"Ṩ";s:3:"ṩ";s:5:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"Ṭ";s:3:"ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"Ṱ";s:3:"ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"Ṳ";s:3:"ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"Ṵ";s:3:"ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"Ṷ";s:3:"ṷ";s:3:"ṷ";s:3:"Ṹ";s:5:"Ṹ";s:3:"ṹ";s:5:"ṹ";s:3:"Ṻ";s:5:"Ṻ";s:3:"ṻ";s:5:"ṻ";s:3:"Ṽ";s:3:"Ṽ";s:3:"ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"Ṿ";s:3:"ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"Ẁ";s:3:"ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"Ẃ";s:3:"ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"Ẉ";s:3:"ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"Ẑ";s:3:"ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"Ẓ";s:3:"ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"ẘ";s:3:"ẙ";s:3:"ẙ";s:3:"ẛ";s:4:"ẛ";s:3:"Ạ";s:3:"Ạ";s:3:"ạ";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:3:"Ấ";s:5:"Ấ";s:3:"ấ";s:5:"ấ";s:3:"Ầ";s:5:"Ầ";s:3:"ầ";s:5:"ầ";s:3:"Ẩ";s:5:"Ẩ";s:3:"ẩ";s:5:"ẩ";s:3:"Ẫ";s:5:"Ẫ";s:3:"ẫ";s:5:"ẫ";s:3:"Ậ";s:5:"Ậ";s:3:"ậ";s:5:"ậ";s:3:"Ắ";s:5:"Ắ";s:3:"ắ";s:5:"ắ";s:3:"Ằ";s:5:"Ằ";s:3:"ằ";s:5:"ằ";s:3:"Ẳ";s:5:"Ẳ";s:3:"ẳ";s:5:"ẳ";s:3:"Ẵ";s:5:"Ẵ";s:3:"ẵ";s:5:"ẵ";s:3:"Ặ";s:5:"Ặ";s:3:"ặ";s:5:"ặ";s:3:"Ẹ";s:3:"Ẹ";s:3:"ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:3:"Ế";s:5:"Ế";s:3:"ế";s:5:"ế";s:3:"Ề";s:5:"Ề";s:3:"ề";s:5:"ề";s:3:"Ể";s:5:"Ể";s:3:"ể";s:5:"ể";s:3:"Ễ";s:5:"Ễ";s:3:"ễ";s:5:"ễ";s:3:"Ệ";s:5:"Ệ";s:3:"ệ";s:5:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"Ị";s:3:"ị";s:3:"ị";s:3:"Ọ";s:3:"Ọ";s:3:"ọ";s:3:"ọ";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"ỏ";s:3:"Ố";s:5:"Ố";s:3:"ố";s:5:"ố";s:3:"Ồ";s:5:"Ồ";s:3:"ồ";s:5:"ồ";s:3:"Ổ";s:5:"Ổ";s:3:"ổ";s:5:"ổ";s:3:"Ỗ";s:5:"Ỗ";s:3:"ỗ";s:5:"ỗ";s:3:"Ộ";s:5:"Ộ";s:3:"ộ";s:5:"ộ";s:3:"Ớ";s:5:"Ớ";s:3:"ớ";s:5:"ớ";s:3:"Ờ";s:5:"Ờ";s:3:"ờ";s:5:"ờ";s:3:"Ở";s:5:"Ở";s:3:"ở";s:5:"ở";s:3:"Ỡ";s:5:"Ỡ";s:3:"ỡ";s:5:"ỡ";s:3:"Ợ";s:5:"Ợ";s:3:"ợ";s:5:"ợ";s:3:"Ụ";s:3:"Ụ";s:3:"ụ";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:3:"Ứ";s:5:"Ứ";s:3:"ứ";s:5:"ứ";s:3:"Ừ";s:5:"Ừ";s:3:"ừ";s:5:"ừ";s:3:"Ử";s:5:"Ử";s:3:"ử";s:5:"ử";s:3:"Ữ";s:5:"Ữ";s:3:"ữ";s:5:"ữ";s:3:"Ự";s:5:"Ự";s:3:"ự";s:5:"ự";s:3:"Ỳ";s:3:"Ỳ";s:3:"ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"Ỵ";s:3:"ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"Ỷ";s:3:"ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:3:"ἀ";s:4:"ἀ";s:3:"ἁ";s:4:"ἁ";s:3:"ἂ";s:6:"ἂ";s:3:"ἃ";s:6:"ἃ";s:3:"ἄ";s:6:"ἄ";s:3:"ἅ";s:6:"ἅ";s:3:"ἆ";s:6:"ἆ";s:3:"ἇ";s:6:"ἇ";s:3:"Ἀ";s:4:"Ἀ";s:3:"Ἁ";s:4:"Ἁ";s:3:"Ἂ";s:6:"Ἂ";s:3:"Ἃ";s:6:"Ἃ";s:3:"Ἄ";s:6:"Ἄ";s:3:"Ἅ";s:6:"Ἅ";s:3:"Ἆ";s:6:"Ἆ";s:3:"Ἇ";s:6:"Ἇ";s:3:"ἐ";s:4:"ἐ";s:3:"ἑ";s:4:"ἑ";s:3:"ἒ";s:6:"ἒ";s:3:"ἓ";s:6:"ἓ";s:3:"ἔ";s:6:"ἔ";s:3:"ἕ";s:6:"ἕ";s:3:"Ἐ";s:4:"Ἐ";s:3:"Ἑ";s:4:"Ἑ";s:3:"Ἒ";s:6:"Ἒ";s:3:"Ἓ";s:6:"Ἓ";s:3:"Ἔ";s:6:"Ἔ";s:3:"Ἕ";s:6:"Ἕ";s:3:"ἠ";s:4:"ἠ";s:3:"ἡ";s:4:"ἡ";s:3:"ἢ";s:6:"ἢ";s:3:"ἣ";s:6:"ἣ";s:3:"ἤ";s:6:"ἤ";s:3:"ἥ";s:6:"ἥ";s:3:"ἦ";s:6:"ἦ";s:3:"ἧ";s:6:"ἧ";s:3:"Ἠ";s:4:"Ἠ";s:3:"Ἡ";s:4:"Ἡ";s:3:"Ἢ";s:6:"Ἢ";s:3:"Ἣ";s:6:"Ἣ";s:3:"Ἤ";s:6:"Ἤ";s:3:"Ἥ";s:6:"Ἥ";s:3:"Ἦ";s:6:"Ἦ";s:3:"Ἧ";s:6:"Ἧ";s:3:"ἰ";s:4:"ἰ";s:3:"ἱ";s:4:"ἱ";s:3:"ἲ";s:6:"ἲ";s:3:"ἳ";s:6:"ἳ";s:3:"ἴ";s:6:"ἴ";s:3:"ἵ";s:6:"ἵ";s:3:"ἶ";s:6:"ἶ";s:3:"ἷ";s:6:"ἷ";s:3:"Ἰ";s:4:"Ἰ";s:3:"Ἱ";s:4:"Ἱ";s:3:"Ἲ";s:6:"Ἲ";s:3:"Ἳ";s:6:"Ἳ";s:3:"Ἴ";s:6:"Ἴ";s:3:"Ἵ";s:6:"Ἵ";s:3:"Ἶ";s:6:"Ἶ";s:3:"Ἷ";s:6:"Ἷ";s:3:"ὀ";s:4:"ὀ";s:3:"ὁ";s:4:"ὁ";s:3:"ὂ";s:6:"ὂ";s:3:"ὃ";s:6:"ὃ";s:3:"ὄ";s:6:"ὄ";s:3:"ὅ";s:6:"ὅ";s:3:"Ὀ";s:4:"Ὀ";s:3:"Ὁ";s:4:"Ὁ";s:3:"Ὂ";s:6:"Ὂ";s:3:"Ὃ";s:6:"Ὃ";s:3:"Ὄ";s:6:"Ὄ";s:3:"Ὅ";s:6:"Ὅ";s:3:"ὐ";s:4:"ὐ";s:3:"ὑ";s:4:"ὑ";s:3:"ὒ";s:6:"ὒ";s:3:"ὓ";s:6:"ὓ";s:3:"ὔ";s:6:"ὔ";s:3:"ὕ";s:6:"ὕ";s:3:"ὖ";s:6:"ὖ";s:3:"ὗ";s:6:"ὗ";s:3:"Ὑ";s:4:"Ὑ";s:3:"Ὓ";s:6:"Ὓ";s:3:"Ὕ";s:6:"Ὕ";s:3:"Ὗ";s:6:"Ὗ";s:3:"ὠ";s:4:"ὠ";s:3:"ὡ";s:4:"ὡ";s:3:"ὢ";s:6:"ὢ";s:3:"ὣ";s:6:"ὣ";s:3:"ὤ";s:6:"ὤ";s:3:"ὥ";s:6:"ὥ";s:3:"ὦ";s:6:"ὦ";s:3:"ὧ";s:6:"ὧ";s:3:"Ὠ";s:4:"Ὠ";s:3:"Ὡ";s:4:"Ὡ";s:3:"Ὢ";s:6:"Ὢ";s:3:"Ὣ";s:6:"Ὣ";s:3:"Ὤ";s:6:"Ὤ";s:3:"Ὥ";s:6:"Ὥ";s:3:"Ὦ";s:6:"Ὦ";s:3:"Ὧ";s:6:"Ὧ";s:3:"ὰ";s:4:"ὰ";s:3:"ά";s:4:"ά";s:3:"ὲ";s:4:"ὲ";s:3:"έ";s:4:"έ";s:3:"ὴ";s:4:"ὴ";s:3:"ή";s:4:"ή";s:3:"ὶ";s:4:"ὶ";s:3:"ί";s:4:"ί";s:3:"ὸ";s:4:"ὸ";s:3:"ό";s:4:"ό";s:3:"ὺ";s:4:"ὺ";s:3:"ύ";s:4:"ύ";s:3:"ὼ";s:4:"ὼ";s:3:"ώ";s:4:"ώ";s:3:"ᾀ";s:6:"ᾀ";s:3:"ᾁ";s:6:"ᾁ";s:3:"ᾂ";s:8:"ᾂ";s:3:"ᾃ";s:8:"ᾃ";s:3:"ᾄ";s:8:"ᾄ";s:3:"ᾅ";s:8:"ᾅ";s:3:"ᾆ";s:8:"ᾆ";s:3:"ᾇ";s:8:"ᾇ";s:3:"ᾈ";s:6:"ᾈ";s:3:"ᾉ";s:6:"ᾉ";s:3:"ᾊ";s:8:"ᾊ";s:3:"ᾋ";s:8:"ᾋ";s:3:"ᾌ";s:8:"ᾌ";s:3:"ᾍ";s:8:"ᾍ";s:3:"ᾎ";s:8:"ᾎ";s:3:"ᾏ";s:8:"ᾏ";s:3:"ᾐ";s:6:"ᾐ";s:3:"ᾑ";s:6:"ᾑ";s:3:"ᾒ";s:8:"ᾒ";s:3:"ᾓ";s:8:"ᾓ";s:3:"ᾔ";s:8:"ᾔ";s:3:"ᾕ";s:8:"ᾕ";s:3:"ᾖ";s:8:"ᾖ";s:3:"ᾗ";s:8:"ᾗ";s:3:"ᾘ";s:6:"ᾘ";s:3:"ᾙ";s:6:"ᾙ";s:3:"ᾚ";s:8:"ᾚ";s:3:"ᾛ";s:8:"ᾛ";s:3:"ᾜ";s:8:"ᾜ";s:3:"ᾝ";s:8:"ᾝ";s:3:"ᾞ";s:8:"ᾞ";s:3:"ᾟ";s:8:"ᾟ";s:3:"ᾠ";s:6:"ᾠ";s:3:"ᾡ";s:6:"ᾡ";s:3:"ᾢ";s:8:"ᾢ";s:3:"ᾣ";s:8:"ᾣ";s:3:"ᾤ";s:8:"ᾤ";s:3:"ᾥ";s:8:"ᾥ";s:3:"ᾦ";s:8:"ᾦ";s:3:"ᾧ";s:8:"ᾧ";s:3:"ᾨ";s:6:"ᾨ";s:3:"ᾩ";s:6:"ᾩ";s:3:"ᾪ";s:8:"ᾪ";s:3:"ᾫ";s:8:"ᾫ";s:3:"ᾬ";s:8:"ᾬ";s:3:"ᾭ";s:8:"ᾭ";s:3:"ᾮ";s:8:"ᾮ";s:3:"ᾯ";s:8:"ᾯ";s:3:"ᾰ";s:4:"ᾰ";s:3:"ᾱ";s:4:"ᾱ";s:3:"ᾲ";s:6:"ᾲ";s:3:"ᾳ";s:4:"ᾳ";s:3:"ᾴ";s:6:"ᾴ";s:3:"ᾶ";s:4:"ᾶ";s:3:"ᾷ";s:6:"ᾷ";s:3:"Ᾰ";s:4:"Ᾰ";s:3:"Ᾱ";s:4:"Ᾱ";s:3:"Ὰ";s:4:"Ὰ";s:3:"Ά";s:4:"Ά";s:3:"ᾼ";s:4:"ᾼ";s:3:"ι";s:2:"ι";s:3:"῁";s:4:"῁";s:3:"ῂ";s:6:"ῂ";s:3:"ῃ";s:4:"ῃ";s:3:"ῄ";s:6:"ῄ";s:3:"ῆ";s:4:"ῆ";s:3:"ῇ";s:6:"ῇ";s:3:"Ὲ";s:4:"Ὲ";s:3:"Έ";s:4:"Έ";s:3:"Ὴ";s:4:"Ὴ";s:3:"Ή";s:4:"Ή";s:3:"ῌ";s:4:"ῌ";s:3:"῍";s:5:"῍";s:3:"῎";s:5:"῎";s:3:"῏";s:5:"῏";s:3:"ῐ";s:4:"ῐ";s:3:"ῑ";s:4:"ῑ";s:3:"ῒ";s:6:"ῒ";s:3:"ΐ";s:6:"ΐ";s:3:"ῖ";s:4:"ῖ";s:3:"ῗ";s:6:"ῗ";s:3:"Ῐ";s:4:"Ῐ";s:3:"Ῑ";s:4:"Ῑ";s:3:"Ὶ";s:4:"Ὶ";s:3:"Ί";s:4:"Ί";s:3:"῝";s:5:"῝";s:3:"῞";s:5:"῞";s:3:"῟";s:5:"῟";s:3:"ῠ";s:4:"ῠ";s:3:"ῡ";s:4:"ῡ";s:3:"ῢ";s:6:"ῢ";s:3:"ΰ";s:6:"ΰ";s:3:"ῤ";s:4:"ῤ";s:3:"ῥ";s:4:"ῥ";s:3:"ῦ";s:4:"ῦ";s:3:"ῧ";s:6:"ῧ";s:3:"Ῠ";s:4:"Ῠ";s:3:"Ῡ";s:4:"Ῡ";s:3:"Ὺ";s:4:"Ὺ";s:3:"Ύ";s:4:"Ύ";s:3:"Ῥ";s:4:"Ῥ";s:3:"῭";s:4:"῭";s:3:"΅";s:4:"΅";s:3:"`";s:1:"`";s:3:"ῲ";s:6:"ῲ";s:3:"ῳ";s:4:"ῳ";s:3:"ῴ";s:6:"ῴ";s:3:"ῶ";s:4:"ῶ";s:3:"ῷ";s:6:"ῷ";s:3:"Ὸ";s:4:"Ὸ";s:3:"Ό";s:4:"Ό";s:3:"Ὼ";s:4:"Ὼ";s:3:"Ώ";s:4:"Ώ";s:3:"ῼ";s:4:"ῼ";s:3:"´";s:2:"´";s:3:" ";s:3:" ";s:3:" ";s:3:" ";s:3:"Ω";s:2:"Ω";s:3:"K";s:1:"K";s:3:"Å";s:3:"Å";s:3:"↚";s:5:"↚";s:3:"↛";s:5:"↛";s:3:"↮";s:5:"↮";s:3:"⇍";s:5:"⇍";s:3:"⇎";s:5:"⇎";s:3:"⇏";s:5:"⇏";s:3:"∄";s:5:"∄";s:3:"∉";s:5:"∉";s:3:"∌";s:5:"∌";s:3:"∤";s:5:"∤";s:3:"∦";s:5:"∦";s:3:"≁";s:5:"≁";s:3:"≄";s:5:"≄";s:3:"≇";s:5:"≇";s:3:"≉";s:5:"≉";s:3:"≠";s:3:"≠";s:3:"≢";s:5:"≢";s:3:"≭";s:5:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:3:"≰";s:5:"≰";s:3:"≱";s:5:"≱";s:3:"≴";s:5:"≴";s:3:"≵";s:5:"≵";s:3:"≸";s:5:"≸";s:3:"≹";s:5:"≹";s:3:"⊀";s:5:"⊀";s:3:"⊁";s:5:"⊁";s:3:"⊄";s:5:"⊄";s:3:"⊅";s:5:"⊅";s:3:"⊈";s:5:"⊈";s:3:"⊉";s:5:"⊉";s:3:"⊬";s:5:"⊬";s:3:"⊭";s:5:"⊭";s:3:"⊮";s:5:"⊮";s:3:"⊯";s:5:"⊯";s:3:"⋠";s:5:"⋠";s:3:"⋡";s:5:"⋡";s:3:"⋢";s:5:"⋢";s:3:"⋣";s:5:"⋣";s:3:"⋪";s:5:"⋪";s:3:"⋫";s:5:"⋫";s:3:"⋬";s:5:"⋬";s:3:"⋭";s:5:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:3:"⫝̸";s:5:"⫝̸";s:3:"が";s:6:"が";s:3:"ぎ";s:6:"ぎ";s:3:"ぐ";s:6:"ぐ";s:3:"げ";s:6:"げ";s:3:"ご";s:6:"ご";s:3:"ざ";s:6:"ざ";s:3:"じ";s:6:"じ";s:3:"ず";s:6:"ず";s:3:"ぜ";s:6:"ぜ";s:3:"ぞ";s:6:"ぞ";s:3:"だ";s:6:"だ";s:3:"ぢ";s:6:"ぢ";s:3:"づ";s:6:"づ";s:3:"で";s:6:"で";s:3:"ど";s:6:"ど";s:3:"ば";s:6:"ば";s:3:"ぱ";s:6:"ぱ";s:3:"び";s:6:"び";s:3:"ぴ";s:6:"ぴ";s:3:"ぶ";s:6:"ぶ";s:3:"ぷ";s:6:"ぷ";s:3:"べ";s:6:"べ";s:3:"ぺ";s:6:"ぺ";s:3:"ぼ";s:6:"ぼ";s:3:"ぽ";s:6:"ぽ";s:3:"ゔ";s:6:"ゔ";s:3:"ゞ";s:6:"ゞ";s:3:"ガ";s:6:"ガ";s:3:"ギ";s:6:"ギ";s:3:"グ";s:6:"グ";s:3:"ゲ";s:6:"ゲ";s:3:"ゴ";s:6:"ゴ";s:3:"ザ";s:6:"ザ";s:3:"ジ";s:6:"ジ";s:3:"ズ";s:6:"ズ";s:3:"ゼ";s:6:"ゼ";s:3:"ゾ";s:6:"ゾ";s:3:"ダ";s:6:"ダ";s:3:"ヂ";s:6:"ヂ";s:3:"ヅ";s:6:"ヅ";s:3:"デ";s:6:"デ";s:3:"ド";s:6:"ド";s:3:"バ";s:6:"バ";s:3:"パ";s:6:"パ";s:3:"ビ";s:6:"ビ";s:3:"ピ";s:6:"ピ";s:3:"ブ";s:6:"ブ";s:3:"プ";s:6:"プ";s:3:"ベ";s:6:"ベ";s:3:"ペ";s:6:"ペ";s:3:"ボ";s:6:"ボ";s:3:"ポ";s:6:"ポ";s:3:"ヴ";s:6:"ヴ";s:3:"ヷ";s:6:"ヷ";s:3:"ヸ";s:6:"ヸ";s:3:"ヹ";s:6:"ヹ";s:3:"ヺ";s:6:"ヺ";s:3:"ヾ";s:6:"ヾ";s:3:"豈";s:3:"豈";s:3:"更";s:3:"更";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"句";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"喇";s:3:"奈";s:3:"奈";s:3:"懶";s:3:"懶";s:3:"癩";s:3:"癩";s:3:"羅";s:3:"羅";s:3:"蘿";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"邏";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"洛";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"珞";s:3:"落";s:3:"落";s:3:"酪";s:3:"酪";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"卵";s:3:"欄";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"嵐";s:3:"濫";s:3:"濫";s:3:"藍";s:3:"藍";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"蠟";s:3:"廊";s:3:"廊";s:3:"朗";s:3:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"勞";s:3:"擄";s:3:"擄";s:3:"櫓";s:3:"櫓";s:3:"爐";s:3:"爐";s:3:"盧";s:3:"盧";s:3:"老";s:3:"老";s:3:"蘆";s:3:"蘆";s:3:"虜";s:3:"虜";s:3:"路";s:3:"路";s:3:"露";s:3:"露";s:3:"魯";s:3:"魯";s:3:"鷺";s:3:"鷺";s:3:"碌";s:3:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"菉";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"論";s:3:"論";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"籠";s:3:"聾";s:3:"聾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"雷";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"屢";s:3:"樓";s:3:"樓";s:3:"淚";s:3:"淚";s:3:"漏";s:3:"漏";s:3:"累";s:3:"累";s:3:"縷";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"勒";s:3:"肋";s:3:"肋";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"菱";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"拏";s:3:"樂";s:3:"樂";s:3:"諾";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:3:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:3:"異";s:3:"北";s:3:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"不";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"索";s:3:"參";s:3:"參";s:3:"塞";s:3:"塞";s:3:"省";s:3:"省";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:3:"殺";s:3:"辰";s:3:"辰";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:3:"若";s:3:"掠";s:3:"掠";s:3:"略";s:3:"略";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"兩";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"梁";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"諒";s:3:"量";s:3:"量";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"呂";s:3:"女";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"旅";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"閭";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"歷";s:3:"轢";s:3:"轢";s:3:"年";s:3:"年";s:3:"憐";s:3:"憐";s:3:"戀";s:3:"戀";s:3:"撚";s:3:"撚";s:3:"漣";s:3:"漣";s:3:"煉";s:3:"煉";s:3:"璉";s:3:"璉";s:3:"秊";s:3:"秊";s:3:"練";s:3:"練";s:3:"聯";s:3:"聯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"蓮";s:3:"連";s:3:"連";s:3:"鍊";s:3:"鍊";s:3:"列";s:3:"列";s:3:"劣";s:3:"劣";s:3:"咽";s:3:"咽";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"說";s:3:"說";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"捻";s:3:"殮";s:3:"殮";s:3:"簾";s:3:"簾";s:3:"獵";s:3:"獵";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"寧";s:3:"寧";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"瑩";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"聆";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"靈";s:3:"領";s:3:"領";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"尿";s:3:"料";s:3:"料";s:3:"樂";s:3:"樂";s:3:"燎";s:3:"燎";s:3:"療";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"遼";s:3:"龍";s:3:"龍";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"杻";s:3:"柳";s:3:"柳";s:3:"流";s:3:"流";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"琉";s:3:"留";s:3:"留";s:3:"硫";s:3:"硫";s:3:"紐";s:3:"紐";s:3:"類";s:3:"類";s:3:"六";s:3:"六";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"崙";s:3:"淪";s:3:"淪";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"慄";s:3:"栗";s:3:"栗";s:3:"率";s:3:"率";s:3:"隆";s:3:"隆";s:3:"利";s:3:"利";s:3:"吏";s:3:"吏";s:3:"履";s:3:"履";s:3:"易";s:3:"易";s:3:"李";s:3:"李";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"泥";s:3:"理";s:3:"理";s:3:"痢";s:3:"痢";s:3:"罹";s:3:"罹";s:3:"裏";s:3:"裏";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"吝";s:3:"燐";s:3:"燐";s:3:"璘";s:3:"璘";s:3:"藺";s:3:"藺";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"鱗";s:3:"麟";s:3:"麟";s:3:"林";s:3:"林";s:3:"淋";s:3:"淋";s:3:"臨";s:3:"臨";s:3:"立";s:3:"立";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"粒";s:3:"狀";s:3:"狀";s:3:"炙";s:3:"炙";s:3:"識";s:3:"識";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:3:"切";s:3:"度";s:3:"度";s:3:"拓";s:3:"拓";s:3:"糖";s:3:"糖";s:3:"宅";s:3:"宅";s:3:"洞";s:3:"洞";s:3:"暴";s:3:"暴";s:3:"輻";s:3:"輻";s:3:"行";s:3:"行";s:3:"降";s:3:"降";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"兀";s:3:"嗀";s:3:"嗀";s:3:"塚";s:3:"塚";s:3:"晴";s:3:"晴";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:3:"福";s:3:"靖";s:3:"靖";s:3:"精";s:3:"精";s:3:"羽";s:3:"羽";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"郞";s:3:"郞";s:3:"隷";s:3:"隷";s:3:"侮";s:3:"侮";s:3:"僧";s:3:"僧";s:3:"免";s:3:"免";s:3:"勉";s:3:"勉";s:3:"勤";s:3:"勤";s:3:"卑";s:3:"卑";s:3:"喝";s:3:"喝";s:3:"嘆";s:3:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"塀";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:3:"屮";s:3:"悔";s:3:"悔";s:3:"慨";s:3:"慨";s:3:"憎";s:3:"憎";s:3:"懲";s:3:"懲";s:3:"敏";s:3:"敏";s:3:"既";s:3:"既";s:3:"暑";s:3:"暑";s:3:"梅";s:3:"梅";s:3:"海";s:3:"海";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"漢";s:3:"煮";s:3:"煮";s:3:"爫";s:3:"爫";s:3:"琢";s:3:"琢";s:3:"碑";s:3:"碑";s:3:"社";s:3:"社";s:3:"祉";s:3:"祉";s:3:"祈";s:3:"祈";s:3:"祐";s:3:"祐";s:3:"祖";s:3:"祖";s:3:"祝";s:3:"祝";s:3:"禍";s:3:"禍";s:3:"禎";s:3:"禎";s:3:"穀";s:3:"穀";s:3:"突";s:3:"突";s:3:"節";s:3:"節";s:3:"練";s:3:"練";s:3:"縉";s:3:"縉";s:3:"繁";s:3:"繁";s:3:"署";s:3:"署";s:3:"者";s:3:"者";s:3:"臭";s:3:"臭";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"著";s:3:"著";s:3:"褐";s:3:"褐";s:3:"視";s:3:"視";s:3:"謁";s:3:"謁";s:3:"謹";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"贈";s:3:"贈";s:3:"辶";s:3:"辶";s:3:"逸";s:3:"逸";s:3:"難";s:3:"難";s:3:"響";s:3:"響";s:3:"頻";s:3:"頻";s:3:"恵";s:3:"恵";s:3:"𤋮";s:4:"𤋮";s:3:"舘";s:3:"舘";s:3:"並";s:3:"並";s:3:"况";s:3:"况";s:3:"全";s:3:"全";s:3:"侀";s:3:"侀";s:3:"充";s:3:"充";s:3:"冀";s:3:"冀";s:3:"勇";s:3:"勇";s:3:"勺";s:3:"勺";s:3:"喝";s:3:"喝";s:3:"啕";s:3:"啕";s:3:"喙";s:3:"喙";s:3:"嗢";s:3:"嗢";s:3:"塚";s:3:"塚";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"奔";s:3:"奔";s:3:"婢";s:3:"婢";s:3:"嬨";s:3:"嬨";s:3:"廒";s:3:"廒";s:3:"廙";s:3:"廙";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"徭";s:3:"惘";s:3:"惘";s:3:"慎";s:3:"慎";s:3:"愈";s:3:"愈";s:3:"憎";s:3:"憎";s:3:"慠";s:3:"慠";s:3:"懲";s:3:"懲";s:3:"戴";s:3:"戴";s:3:"揄";s:3:"揄";s:3:"搜";s:3:"搜";s:3:"摒";s:3:"摒";s:3:"敖";s:3:"敖";s:3:"晴";s:3:"晴";s:3:"朗";s:3:"朗";s:3:"望";s:3:"望";s:3:"杖";s:3:"杖";s:3:"歹";s:3:"歹";s:3:"殺";s:3:"殺";s:3:"流";s:3:"流";s:3:"滛";s:3:"滛";s:3:"滋";s:3:"滋";s:3:"漢";s:3:"漢";s:3:"瀞";s:3:"瀞";s:3:"煮";s:3:"煮";s:3:"瞧";s:3:"瞧";s:3:"爵";s:3:"爵";s:3:"犯";s:3:"犯";s:3:"猪";s:3:"猪";s:3:"瑱";s:3:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"画";s:3:"瘝";s:3:"瘝";s:3:"瘟";s:3:"瘟";s:3:"益";s:3:"益";s:3:"盛";s:3:"盛";s:3:"直";s:3:"直";s:3:"睊";s:3:"睊";s:3:"着";s:3:"着";s:3:"磌";s:3:"磌";s:3:"窱";s:3:"窱";s:3:"節";s:3:"節";s:3:"类";s:3:"类";s:3:"絛";s:3:"絛";s:3:"練";s:3:"練";s:3:"缾";s:3:"缾";s:3:"者";s:3:"者";s:3:"荒";s:3:"荒";s:3:"華";s:3:"華";s:3:"蝹";s:3:"蝹";s:3:"襁";s:3:"襁";s:3:"覆";s:3:"覆";s:3:"視";s:3:"視";s:3:"調";s:3:"調";s:3:"諸";s:3:"諸";s:3:"請";s:3:"請";s:3:"謁";s:3:"謁";s:3:"諾";s:3:"諾";s:3:"諭";s:3:"諭";s:3:"謹";s:3:"謹";s:3:"變";s:3:"變";s:3:"贈";s:3:"贈";s:3:"輸";s:3:"輸";s:3:"遲";s:3:"遲";s:3:"醙";s:3:"醙";s:3:"鉶";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"難";s:3:"難";s:3:"靖";s:3:"靖";s:3:"韛";s:3:"韛";s:3:"響";s:3:"響";s:3:"頋";s:3:"頋";s:3:"頻";s:3:"頻";s:3:"鬒";s:3:"鬒";s:3:"龜";s:3:"龜";s:3:"𢡊";s:4:"𢡊";s:3:"𢡄";s:4:"𢡄";s:3:"𣏕";s:4:"𣏕";s:3:"㮝";s:3:"㮝";s:3:"䀘";s:3:"䀘";s:3:"䀹";s:3:"䀹";s:3:"𥉉";s:4:"𥉉";s:3:"𥳐";s:4:"𥳐";s:3:"𧻓";s:4:"𧻓";s:3:"齃";s:3:"齃";s:3:"龎";s:3:"龎";s:3:"יִ";s:4:"יִ";s:3:"ײַ";s:4:"ײַ";s:3:"שׁ";s:4:"שׁ";s:3:"שׂ";s:4:"שׂ";s:3:"שּׁ";s:6:"שּׁ";s:3:"שּׂ";s:6:"שּׂ";s:3:"אַ";s:4:"אַ";s:3:"אָ";s:4:"אָ";s:3:"אּ";s:4:"אּ";s:3:"בּ";s:4:"בּ";s:3:"גּ";s:4:"גּ";s:3:"דּ";s:4:"דּ";s:3:"הּ";s:4:"הּ";s:3:"וּ";s:4:"וּ";s:3:"זּ";s:4:"זּ";s:3:"טּ";s:4:"טּ";s:3:"יּ";s:4:"יּ";s:3:"ךּ";s:4:"ךּ";s:3:"כּ";s:4:"כּ";s:3:"לּ";s:4:"לּ";s:3:"מּ";s:4:"מּ";s:3:"נּ";s:4:"נּ";s:3:"סּ";s:4:"סּ";s:3:"ףּ";s:4:"ףּ";s:3:"פּ";s:4:"פּ";s:3:"צּ";s:4:"צּ";s:3:"קּ";s:4:"קּ";s:3:"רּ";s:4:"רּ";s:3:"שּ";s:4:"שּ";s:3:"תּ";s:4:"תּ";s:3:"וֹ";s:4:"וֹ";s:3:"בֿ";s:4:"בֿ";s:3:"כֿ";s:4:"כֿ";s:3:"פֿ";s:4:"פֿ";s:4:"𑂚";s:8:"𑂚";s:4:"𑂜";s:8:"𑂜";s:4:"𑂫";s:8:"𑂫";s:4:"𑄮";s:8:"𑄮";s:4:"𑄯";s:8:"𑄯";s:4:"𑍋";s:8:"𑍋";s:4:"𑍌";s:8:"𑍌";s:4:"𑒻";s:8:"𑒻";s:4:"𑒼";s:8:"𑒼";s:4:"𑒾";s:8:"𑒾";s:4:"𑖺";s:8:"𑖺";s:4:"𑖻";s:8:"𑖻";s:4:"𝅗𝅥";s:8:"𝅗𝅥";s:4:"𝅘𝅥";s:8:"𝅘𝅥";s:4:"𝅘𝅥𝅮";s:12:"𝅘𝅥𝅮";s:4:"𝅘𝅥𝅯";s:12:"𝅘𝅥𝅯";s:4:"𝅘𝅥𝅰";s:12:"𝅘𝅥𝅰";s:4:"𝅘𝅥𝅱";s:12:"𝅘𝅥𝅱";s:4:"𝅘𝅥𝅲";s:12:"𝅘𝅥𝅲";s:4:"𝆹𝅥";s:8:"𝆹𝅥";s:4:"𝆺𝅥";s:8:"𝆺𝅥";s:4:"𝆹𝅥𝅮";s:12:"𝆹𝅥𝅮";s:4:"𝆺𝅥𝅮";s:12:"𝆺𝅥𝅮";s:4:"𝆹𝅥𝅯";s:12:"𝆹𝅥𝅯";s:4:"𝆺𝅥𝅯";s:12:"𝆺𝅥𝅯";s:4:"丽";s:3:"丽";s:4:"丸";s:3:"丸";s:4:"乁";s:3:"乁";s:4:"𠄢";s:4:"𠄢";s:4:"你";s:3:"你";s:4:"侮";s:3:"侮";s:4:"侻";s:3:"侻";s:4:"倂";s:3:"倂";s:4:"偺";s:3:"偺";s:4:"備";s:3:"備";s:4:"僧";s:3:"僧";s:4:"像";s:3:"像";s:4:"㒞";s:3:"㒞";s:4:"𠘺";s:4:"𠘺";s:4:"免";s:3:"免";s:4:"兔";s:3:"兔";s:4:"兤";s:3:"兤";s:4:"具";s:3:"具";s:4:"𠔜";s:4:"𠔜";s:4:"㒹";s:3:"㒹";s:4:"內";s:3:"內";s:4:"再";s:3:"再";s:4:"𠕋";s:4:"𠕋";s:4:"冗";s:3:"冗";s:4:"冤";s:3:"冤";s:4:"仌";s:3:"仌";s:4:"冬";s:3:"冬";s:4:"况";s:3:"况";s:4:"𩇟";s:4:"𩇟";s:4:"凵";s:3:"凵";s:4:"刃";s:3:"刃";s:4:"㓟";s:3:"㓟";s:4:"刻";s:3:"刻";s:4:"剆";s:3:"剆";s:4:"割";s:3:"割";s:4:"剷";s:3:"剷";s:4:"㔕";s:3:"㔕";s:4:"勇";s:3:"勇";s:4:"勉";s:3:"勉";s:4:"勤";s:3:"勤";s:4:"勺";s:3:"勺";s:4:"包";s:3:"包";s:4:"匆";s:3:"匆";s:4:"北";s:3:"北";s:4:"卉";s:3:"卉";s:4:"卑";s:3:"卑";s:4:"博";s:3:"博";s:4:"即";s:3:"即";s:4:"卽";s:3:"卽";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"𠨬";s:4:"𠨬";s:4:"灰";s:3:"灰";s:4:"及";s:3:"及";s:4:"叟";s:3:"叟";s:4:"𠭣";s:4:"𠭣";s:4:"叫";s:3:"叫";s:4:"叱";s:3:"叱";s:4:"吆";s:3:"吆";s:4:"咞";s:3:"咞";s:4:"吸";s:3:"吸";s:4:"呈";s:3:"呈";s:4:"周";s:3:"周";s:4:"咢";s:3:"咢";s:4:"哶";s:3:"哶";s:4:"唐";s:3:"唐";s:4:"啓";s:3:"啓";s:4:"啣";s:3:"啣";s:4:"善";s:3:"善";s:4:"善";s:3:"善";s:4:"喙";s:3:"喙";s:4:"喫";s:3:"喫";s:4:"喳";s:3:"喳";s:4:"嗂";s:3:"嗂";s:4:"圖";s:3:"圖";s:4:"嘆";s:3:"嘆";s:4:"圗";s:3:"圗";s:4:"噑";s:3:"噑";s:4:"噴";s:3:"噴";s:4:"切";s:3:"切";s:4:"壮";s:3:"壮";s:4:"城";s:3:"城";s:4:"埴";s:3:"埴";s:4:"堍";s:3:"堍";s:4:"型";s:3:"型";s:4:"堲";s:3:"堲";s:4:"報";s:3:"報";s:4:"墬";s:3:"墬";s:4:"𡓤";s:4:"𡓤";s:4:"売";s:3:"売";s:4:"壷";s:3:"壷";s:4:"夆";s:3:"夆";s:4:"多";s:3:"多";s:4:"夢";s:3:"夢";s:4:"奢";s:3:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:4:"姬";s:3:"姬";s:4:"娛";s:3:"娛";s:4:"娧";s:3:"娧";s:4:"姘";s:3:"姘";s:4:"婦";s:3:"婦";s:4:"㛮";s:3:"㛮";s:4:"㛼";s:3:"㛼";s:4:"嬈";s:3:"嬈";s:4:"嬾";s:3:"嬾";s:4:"嬾";s:3:"嬾";s:4:"𡧈";s:4:"𡧈";s:4:"寃";s:3:"寃";s:4:"寘";s:3:"寘";s:4:"寧";s:3:"寧";s:4:"寳";s:3:"寳";s:4:"𡬘";s:4:"𡬘";s:4:"寿";s:3:"寿";s:4:"将";s:3:"将";s:4:"当";s:3:"当";s:4:"尢";s:3:"尢";s:4:"㞁";s:3:"㞁";s:4:"屠";s:3:"屠";s:4:"屮";s:3:"屮";s:4:"峀";s:3:"峀";s:4:"岍";s:3:"岍";s:4:"𡷤";s:4:"𡷤";s:4:"嵃";s:3:"嵃";s:4:"𡷦";s:4:"𡷦";s:4:"嵮";s:3:"嵮";s:4:"嵫";s:3:"嵫";s:4:"嵼";s:3:"嵼";s:4:"巡";s:3:"巡";s:4:"巢";s:3:"巢";s:4:"㠯";s:3:"㠯";s:4:"巽";s:3:"巽";s:4:"帨";s:3:"帨";s:4:"帽";s:3:"帽";s:4:"幩";s:3:"幩";s:4:"㡢";s:3:"㡢";s:4:"𢆃";s:4:"𢆃";s:4:"㡼";s:3:"㡼";s:4:"庰";s:3:"庰";s:4:"庳";s:3:"庳";s:4:"庶";s:3:"庶";s:4:"廊";s:3:"廊";s:4:"𪎒";s:4:"𪎒";s:4:"廾";s:3:"廾";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"舁";s:3:"舁";s:4:"弢";s:3:"弢";s:4:"弢";s:3:"弢";s:4:"㣇";s:3:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:4:"形";s:3:"形";s:4:"彫";s:3:"彫";s:4:"㣣";s:3:"㣣";s:4:"徚";s:3:"徚";s:4:"忍";s:3:"忍";s:4:"志";s:3:"志";s:4:"忹";s:3:"忹";s:4:"悁";s:3:"悁";s:4:"㤺";s:3:"㤺";s:4:"㤜";s:3:"㤜";s:4:"悔";s:3:"悔";s:4:"𢛔";s:4:"𢛔";s:4:"惇";s:3:"惇";s:4:"慈";s:3:"慈";s:4:"慌";s:3:"慌";s:4:"慎";s:3:"慎";s:4:"慌";s:3:"慌";s:4:"慺";s:3:"慺";s:4:"憎";s:3:"憎";s:4:"憲";s:3:"憲";s:4:"憤";s:3:"憤";s:4:"憯";s:3:"憯";s:4:"懞";s:3:"懞";s:4:"懲";s:3:"懲";s:4:"懶";s:3:"懶";s:4:"成";s:3:"成";s:4:"戛";s:3:"戛";s:4:"扝";s:3:"扝";s:4:"抱";s:3:"抱";s:4:"拔";s:3:"拔";s:4:"捐";s:3:"捐";s:4:"𢬌";s:4:"𢬌";s:4:"挽";s:3:"挽";s:4:"拼";s:3:"拼";s:4:"捨";s:3:"捨";s:4:"掃";s:3:"掃";s:4:"揤";s:3:"揤";s:4:"𢯱";s:4:"𢯱";s:4:"搢";s:3:"搢";s:4:"揅";s:3:"揅";s:4:"掩";s:3:"掩";s:4:"㨮";s:3:"㨮";s:4:"摩";s:3:"摩";s:4:"摾";s:3:"摾";s:4:"撝";s:3:"撝";s:4:"摷";s:3:"摷";s:4:"㩬";s:3:"㩬";s:4:"敏";s:3:"敏";s:4:"敬";s:3:"敬";s:4:"𣀊";s:4:"𣀊";s:4:"旣";s:3:"旣";s:4:"書";s:3:"書";s:4:"晉";s:3:"晉";s:4:"㬙";s:3:"㬙";s:4:"暑";s:3:"暑";s:4:"㬈";s:3:"㬈";s:4:"㫤";s:3:"㫤";s:4:"冒";s:3:"冒";s:4:"冕";s:3:"冕";s:4:"最";s:3:"最";s:4:"暜";s:3:"暜";s:4:"肭";s:3:"肭";s:4:"䏙";s:3:"䏙";s:4:"朗";s:3:"朗";s:4:"望";s:3:"望";s:4:"朡";s:3:"朡";s:4:"杞";s:3:"杞";s:4:"杓";s:3:"杓";s:4:"𣏃";s:4:"𣏃";s:4:"㭉";s:3:"㭉";s:4:"柺";s:3:"柺";s:4:"枅";s:3:"枅";s:4:"桒";s:3:"桒";s:4:"梅";s:3:"梅";s:4:"𣑭";s:4:"𣑭";s:4:"梎";s:3:"梎";s:4:"栟";s:3:"栟";s:4:"椔";s:3:"椔";s:4:"㮝";s:3:"㮝";s:4:"楂";s:3:"楂";s:4:"榣";s:3:"榣";s:4:"槪";s:3:"槪";s:4:"檨";s:3:"檨";s:4:"𣚣";s:4:"𣚣";s:4:"櫛";s:3:"櫛";s:4:"㰘";s:3:"㰘";s:4:"次";s:3:"次";s:4:"𣢧";s:4:"𣢧";s:4:"歔";s:3:"歔";s:4:"㱎";s:3:"㱎";s:4:"歲";s:3:"歲";s:4:"殟";s:3:"殟";s:4:"殺";s:3:"殺";s:4:"殻";s:3:"殻";s:4:"𣪍";s:4:"𣪍";s:4:"𡴋";s:4:"𡴋";s:4:"𣫺";s:4:"𣫺";s:4:"汎";s:3:"汎";s:4:"𣲼";s:4:"𣲼";s:4:"沿";s:3:"沿";s:4:"泍";s:3:"泍";s:4:"汧";s:3:"汧";s:4:"洖";s:3:"洖";s:4:"派";s:3:"派";s:4:"海";s:3:"海";s:4:"流";s:3:"流";s:4:"浩";s:3:"浩";s:4:"浸";s:3:"浸";s:4:"涅";s:3:"涅";s:4:"𣴞";s:4:"𣴞";s:4:"洴";s:3:"洴";s:4:"港";s:3:"港";s:4:"湮";s:3:"湮";s:4:"㴳";s:3:"㴳";s:4:"滋";s:3:"滋";s:4:"滇";s:3:"滇";s:4:"𣻑";s:4:"𣻑";s:4:"淹";s:3:"淹";s:4:"潮";s:3:"潮";s:4:"𣽞";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:4:"濆";s:3:"濆";s:4:"瀹";s:3:"瀹";s:4:"瀞";s:3:"瀞";s:4:"瀛";s:3:"瀛";s:4:"㶖";s:3:"㶖";s:4:"灊";s:3:"灊";s:4:"災";s:3:"災";s:4:"灷";s:3:"灷";s:4:"炭";s:3:"炭";s:4:"𠔥";s:4:"𠔥";s:4:"煅";s:3:"煅";s:4:"𤉣";s:4:"𤉣";s:4:"熜";s:3:"熜";s:4:"𤎫";s:4:"𤎫";s:4:"爨";s:3:"爨";s:4:"爵";s:3:"爵";s:4:"牐";s:3:"牐";s:4:"𤘈";s:4:"𤘈";s:4:"犀";s:3:"犀";s:4:"犕";s:3:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:4:"獺";s:3:"獺";s:4:"王";s:3:"王";s:4:"㺬";s:3:"㺬";s:4:"玥";s:3:"玥";s:4:"㺸";s:3:"㺸";s:4:"㺸";s:3:"㺸";s:4:"瑇";s:3:"瑇";s:4:"瑜";s:3:"瑜";s:4:"瑱";s:3:"瑱";s:4:"璅";s:3:"璅";s:4:"瓊";s:3:"瓊";s:4:"㼛";s:3:"㼛";s:4:"甤";s:3:"甤";s:4:"𤰶";s:4:"𤰶";s:4:"甾";s:3:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"異";s:3:"異";s:4:"𢆟";s:4:"𢆟";s:4:"瘐";s:3:"瘐";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"𥁄";s:4:"㿼";s:3:"㿼";s:4:"䀈";s:3:"䀈";s:4:"直";s:3:"直";s:4:"𥃳";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:4:"眞";s:3:"眞";s:4:"真";s:3:"真";s:4:"真";s:3:"真";s:4:"睊";s:3:"睊";s:4:"䀹";s:3:"䀹";s:4:"瞋";s:3:"瞋";s:4:"䁆";s:3:"䁆";s:4:"䂖";s:3:"䂖";s:4:"𥐝";s:4:"𥐝";s:4:"硎";s:3:"硎";s:4:"碌";s:3:"碌";s:4:"磌";s:3:"磌";s:4:"䃣";s:3:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"祖";s:3:"祖";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:4:"福";s:3:"福";s:4:"秫";s:3:"秫";s:4:"䄯";s:3:"䄯";s:4:"穀";s:3:"穀";s:4:"穊";s:3:"穊";s:4:"穏";s:3:"穏";s:4:"𥥼";s:4:"𥥼";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"竮";s:3:"竮";s:4:"䈂";s:3:"䈂";s:4:"𥮫";s:4:"𥮫";s:4:"篆";s:3:"篆";s:4:"築";s:3:"築";s:4:"䈧";s:3:"䈧";s:4:"𥲀";s:4:"𥲀";s:4:"糒";s:3:"糒";s:4:"䊠";s:3:"䊠";s:4:"糨";s:3:"糨";s:4:"糣";s:3:"糣";s:4:"紀";s:3:"紀";s:4:"𥾆";s:4:"𥾆";s:4:"絣";s:3:"絣";s:4:"䌁";s:3:"䌁";s:4:"緇";s:3:"緇";s:4:"縂";s:3:"縂";s:4:"繅";s:3:"繅";s:4:"䌴";s:3:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:4:"䍙";s:3:"䍙";s:4:"𦋙";s:4:"𦋙";s:4:"罺";s:3:"罺";s:4:"𦌾";s:4:"𦌾";s:4:"羕";s:3:"羕";s:4:"翺";s:3:"翺";s:4:"者";s:3:"者";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:4:"聠";s:3:"聠";s:4:"𦖨";s:4:"𦖨";s:4:"聰";s:3:"聰";s:4:"𣍟";s:4:"𣍟";s:4:"䏕";s:3:"䏕";s:4:"育";s:3:"育";s:4:"脃";s:3:"脃";s:4:"䐋";s:3:"䐋";s:4:"脾";s:3:"脾";s:4:"媵";s:3:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:4:"舁";s:3:"舁";s:4:"舄";s:3:"舄";s:4:"辞";s:3:"辞";s:4:"䑫";s:3:"䑫";s:4:"芑";s:3:"芑";s:4:"芋";s:3:"芋";s:4:"芝";s:3:"芝";s:4:"劳";s:3:"劳";s:4:"花";s:3:"花";s:4:"芳";s:3:"芳";s:4:"芽";s:3:"芽";s:4:"苦";s:3:"苦";s:4:"𦬼";s:4:"𦬼";s:4:"若";s:3:"若";s:4:"茝";s:3:"茝";s:4:"荣";s:3:"荣";s:4:"莭";s:3:"莭";s:4:"茣";s:3:"茣";s:4:"莽";s:3:"莽";s:4:"菧";s:3:"菧";s:4:"著";s:3:"著";s:4:"荓";s:3:"荓";s:4:"菊";s:3:"菊";s:4:"菌";s:3:"菌";s:4:"菜";s:3:"菜";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:4:"䔫";s:3:"䔫";s:4:"蓱";s:3:"蓱";s:4:"蓳";s:3:"蓳";s:4:"蔖";s:3:"蔖";s:4:"𧏊";s:4:"𧏊";s:4:"蕤";s:3:"蕤";s:4:"𦼬";s:4:"𦼬";s:4:"䕝";s:3:"䕝";s:4:"䕡";s:3:"䕡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:4:"䕫";s:3:"䕫";s:4:"虐";s:3:"虐";s:4:"虜";s:3:"虜";s:4:"虧";s:3:"虧";s:4:"虩";s:3:"虩";s:4:"蚩";s:3:"蚩";s:4:"蚈";s:3:"蚈";s:4:"蜎";s:3:"蜎";s:4:"蛢";s:3:"蛢";s:4:"蝹";s:3:"蝹";s:4:"蜨";s:3:"蜨";s:4:"蝫";s:3:"蝫";s:4:"螆";s:3:"螆";s:4:"䗗";s:3:"䗗";s:4:"蟡";s:3:"蟡";s:4:"蠁";s:3:"蠁";s:4:"䗹";s:3:"䗹";s:4:"衠";s:3:"衠";s:4:"衣";s:3:"衣";s:4:"𧙧";s:4:"𧙧";s:4:"裗";s:3:"裗";s:4:"裞";s:3:"裞";s:4:"䘵";s:3:"䘵";s:4:"裺";s:3:"裺";s:4:"㒻";s:3:"㒻";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:4:"䚾";s:3:"䚾";s:4:"䛇";s:3:"䛇";s:4:"誠";s:3:"誠";s:4:"諭";s:3:"諭";s:4:"變";s:3:"變";s:4:"豕";s:3:"豕";s:4:"𧲨";s:4:"𧲨";s:4:"貫";s:3:"貫";s:4:"賁";s:3:"賁";s:4:"贛";s:3:"贛";s:4:"起";s:3:"起";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"𠠄";s:4:"跋";s:3:"跋";s:4:"趼";s:3:"趼";s:4:"跰";s:3:"跰";s:4:"𠣞";s:4:"𠣞";s:4:"軔";s:3:"軔";s:4:"輸";s:3:"輸";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:4:"邔";s:3:"邔";s:4:"郱";s:3:"郱";s:4:"鄑";s:3:"鄑";s:4:"𨜮";s:4:"𨜮";s:4:"鄛";s:3:"鄛";s:4:"鈸";s:3:"鈸";s:4:"鋗";s:3:"鋗";s:4:"鋘";s:3:"鋘";s:4:"鉼";s:3:"鉼";s:4:"鏹";s:3:"鏹";s:4:"鐕";s:3:"鐕";s:4:"𨯺";s:4:"𨯺";s:4:"開";s:3:"開";s:4:"䦕";s:3:"䦕";s:4:"閷";s:3:"閷";s:4:"𨵷";s:4:"𨵷";s:4:"䧦";s:3:"䧦";s:4:"雃";s:3:"雃";s:4:"嶲";s:3:"嶲";s:4:"霣";s:3:"霣";s:4:"𩅅";s:4:"𩅅";s:4:"𩈚";s:4:"𩈚";s:4:"䩮";s:3:"䩮";s:4:"䩶";s:3:"䩶";s:4:"韠";s:3:"韠";s:4:"𩐊";s:4:"𩐊";s:4:"䪲";s:3:"䪲";s:4:"𩒖";s:4:"𩒖";s:4:"頋";s:3:"頋";s:4:"頋";s:3:"頋";s:4:"頩";s:3:"頩";s:4:"𩖶";s:4:"𩖶";s:4:"飢";s:3:"飢";s:4:"䬳";s:3:"䬳";s:4:"餩";s:3:"餩";s:4:"馧";s:3:"馧";s:4:"駂";s:3:"駂";s:4:"駾";s:3:"駾";s:4:"䯎";s:3:"䯎";s:4:"𩬰";s:4:"𩬰";s:4:"鬒";s:3:"鬒";s:4:"鱀";s:3:"鱀";s:4:"鳽";s:3:"鳽";s:4:"䳎";s:3:"䳎";s:4:"䳭";s:3:"䳭";s:4:"鵧";s:3:"鵧";s:4:"𪃎";s:4:"𪃎";s:4:"䳸";s:3:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:4:"麻";s:3:"麻";s:4:"䵖";s:3:"䵖";s:4:"黹";s:3:"黹";s:4:"黾";s:3:"黾";s:4:"鼅";s:3:"鼅";s:4:"鼏";s:3:"鼏";s:4:"鼖";s:3:"鼖";s:4:"鼻";s:3:"鼻";s:4:"𪘀";s:4:"𪘀";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/unidata/combiningClass.ser
@@ -0,0 +1 @@
+a:745:{s:2:"̀";i:230;s:2:"́";i:230;s:2:"̂";i:230;s:2:"̃";i:230;s:2:"̄";i:230;s:2:"̅";i:230;s:2:"̆";i:230;s:2:"̇";i:230;s:2:"̈";i:230;s:2:"̉";i:230;s:2:"̊";i:230;s:2:"̋";i:230;s:2:"̌";i:230;s:2:"̍";i:230;s:2:"̎";i:230;s:2:"̏";i:230;s:2:"̐";i:230;s:2:"̑";i:230;s:2:"̒";i:230;s:2:"̓";i:230;s:2:"̔";i:230;s:2:"̕";i:232;s:2:"̖";i:220;s:2:"̗";i:220;s:2:"̘";i:220;s:2:"̙";i:220;s:2:"̚";i:232;s:2:"̛";i:216;s:2:"̜";i:220;s:2:"̝";i:220;s:2:"̞";i:220;s:2:"̟";i:220;s:2:"̠";i:220;s:2:"̡";i:202;s:2:"̢";i:202;s:2:"̣";i:220;s:2:"̤";i:220;s:2:"̥";i:220;s:2:"̦";i:220;s:2:"̧";i:202;s:2:"̨";i:202;s:2:"̩";i:220;s:2:"̪";i:220;s:2:"̫";i:220;s:2:"̬";i:220;s:2:"̭";i:220;s:2:"̮";i:220;s:2:"̯";i:220;s:2:"̰";i:220;s:2:"̱";i:220;s:2:"̲";i:220;s:2:"̳";i:220;s:2:"̴";i:1;s:2:"̵";i:1;s:2:"̶";i:1;s:2:"̷";i:1;s:2:"̸";i:1;s:2:"̹";i:220;s:2:"̺";i:220;s:2:"̻";i:220;s:2:"̼";i:220;s:2:"̽";i:230;s:2:"̾";i:230;s:2:"̿";i:230;s:2:"̀";i:230;s:2:"́";i:230;s:2:"͂";i:230;s:2:"̓";i:230;s:2:"̈́";i:230;s:2:"ͅ";i:240;s:2:"͆";i:230;s:2:"͇";i:220;s:2:"͈";i:220;s:2:"͉";i:220;s:2:"͊";i:230;s:2:"͋";i:230;s:2:"͌";i:230;s:2:"͍";i:220;s:2:"͎";i:220;s:2:"͐";i:230;s:2:"͑";i:230;s:2:"͒";i:230;s:2:"͓";i:220;s:2:"͔";i:220;s:2:"͕";i:220;s:2:"͖";i:220;s:2:"͗";i:230;s:2:"͘";i:232;s:2:"͙";i:220;s:2:"͚";i:220;s:2:"͛";i:230;s:2:"͜";i:233;s:2:"͝";i:234;s:2:"͞";i:234;s:2:"͟";i:233;s:2:"͠";i:234;s:2:"͡";i:234;s:2:"͢";i:233;s:2:"ͣ";i:230;s:2:"ͤ";i:230;s:2:"ͥ";i:230;s:2:"ͦ";i:230;s:2:"ͧ";i:230;s:2:"ͨ";i:230;s:2:"ͩ";i:230;s:2:"ͪ";i:230;s:2:"ͫ";i:230;s:2:"ͬ";i:230;s:2:"ͭ";i:230;s:2:"ͮ";i:230;s:2:"ͯ";i:230;s:2:"҃";i:230;s:2:"҄";i:230;s:2:"҅";i:230;s:2:"҆";i:230;s:2:"҇";i:230;s:2:"֑";i:220;s:2:"֒";i:230;s:2:"֓";i:230;s:2:"֔";i:230;s:2:"֕";i:230;s:2:"֖";i:220;s:2:"֗";i:230;s:2:"֘";i:230;s:2:"֙";i:230;s:2:"֚";i:222;s:2:"֛";i:220;s:2:"֜";i:230;s:2:"֝";i:230;s:2:"֞";i:230;s:2:"֟";i:230;s:2:"֠";i:230;s:2:"֡";i:230;s:2:"֢";i:220;s:2:"֣";i:220;s:2:"֤";i:220;s:2:"֥";i:220;s:2:"֦";i:220;s:2:"֧";i:220;s:2:"֨";i:230;s:2:"֩";i:230;s:2:"֪";i:220;s:2:"֫";i:230;s:2:"֬";i:230;s:2:"֭";i:222;s:2:"֮";i:228;s:2:"֯";i:230;s:2:"ְ";i:10;s:2:"ֱ";i:11;s:2:"ֲ";i:12;s:2:"ֳ";i:13;s:2:"ִ";i:14;s:2:"ֵ";i:15;s:2:"ֶ";i:16;s:2:"ַ";i:17;s:2:"ָ";i:18;s:2:"ֹ";i:19;s:2:"ֺ";i:19;s:2:"ֻ";i:20;s:2:"ּ";i:21;s:2:"ֽ";i:22;s:2:"ֿ";i:23;s:2:"ׁ";i:24;s:2:"ׂ";i:25;s:2:"ׄ";i:230;s:2:"ׅ";i:220;s:2:"ׇ";i:18;s:2:"ؐ";i:230;s:2:"ؑ";i:230;s:2:"ؒ";i:230;s:2:"ؓ";i:230;s:2:"ؔ";i:230;s:2:"ؕ";i:230;s:2:"ؖ";i:230;s:2:"ؗ";i:230;s:2:"ؘ";i:30;s:2:"ؙ";i:31;s:2:"ؚ";i:32;s:2:"ً";i:27;s:2:"ٌ";i:28;s:2:"ٍ";i:29;s:2:"َ";i:30;s:2:"ُ";i:31;s:2:"ِ";i:32;s:2:"ّ";i:33;s:2:"ْ";i:34;s:2:"ٓ";i:230;s:2:"ٔ";i:230;s:2:"ٕ";i:220;s:2:"ٖ";i:220;s:2:"ٗ";i:230;s:2:"٘";i:230;s:2:"ٙ";i:230;s:2:"ٚ";i:230;s:2:"ٛ";i:230;s:2:"ٜ";i:220;s:2:"ٝ";i:230;s:2:"ٞ";i:230;s:2:"ٟ";i:220;s:2:"ٰ";i:35;s:2:"ۖ";i:230;s:2:"ۗ";i:230;s:2:"ۘ";i:230;s:2:"ۙ";i:230;s:2:"ۚ";i:230;s:2:"ۛ";i:230;s:2:"ۜ";i:230;s:2:"۟";i:230;s:2:"۠";i:230;s:2:"ۡ";i:230;s:2:"ۢ";i:230;s:2:"ۣ";i:220;s:2:"ۤ";i:230;s:2:"ۧ";i:230;s:2:"ۨ";i:230;s:2:"۪";i:220;s:2:"۫";i:230;s:2:"۬";i:230;s:2:"ۭ";i:220;s:2:"ܑ";i:36;s:2:"ܰ";i:230;s:2:"ܱ";i:220;s:2:"ܲ";i:230;s:2:"ܳ";i:230;s:2:"ܴ";i:220;s:2:"ܵ";i:230;s:2:"ܶ";i:230;s:2:"ܷ";i:220;s:2:"ܸ";i:220;s:2:"ܹ";i:220;s:2:"ܺ";i:230;s:2:"ܻ";i:220;s:2:"ܼ";i:220;s:2:"ܽ";i:230;s:2:"ܾ";i:220;s:2:"ܿ";i:230;s:2:"݀";i:230;s:2:"݁";i:230;s:2:"݂";i:220;s:2:"݃";i:230;s:2:"݄";i:220;s:2:"݅";i:230;s:2:"݆";i:220;s:2:"݇";i:230;s:2:"݈";i:220;s:2:"݉";i:230;s:2:"݊";i:230;s:2:"߫";i:230;s:2:"߬";i:230;s:2:"߭";i:230;s:2:"߮";i:230;s:2:"߯";i:230;s:2:"߰";i:230;s:2:"߱";i:230;s:2:"߲";i:220;s:2:"߳";i:230;s:3:"ࠖ";i:230;s:3:"ࠗ";i:230;s:3:"࠘";i:230;s:3:"࠙";i:230;s:3:"ࠛ";i:230;s:3:"ࠜ";i:230;s:3:"ࠝ";i:230;s:3:"ࠞ";i:230;s:3:"ࠟ";i:230;s:3:"ࠠ";i:230;s:3:"ࠡ";i:230;s:3:"ࠢ";i:230;s:3:"ࠣ";i:230;s:3:"ࠥ";i:230;s:3:"ࠦ";i:230;s:3:"ࠧ";i:230;s:3:"ࠩ";i:230;s:3:"ࠪ";i:230;s:3:"ࠫ";i:230;s:3:"ࠬ";i:230;s:3:"࠭";i:230;s:3:"࡙";i:220;s:3:"࡚";i:220;s:3:"࡛";i:220;s:3:"ࣤ";i:230;s:3:"ࣥ";i:230;s:3:"ࣦ";i:220;s:3:"ࣧ";i:230;s:3:"ࣨ";i:230;s:3:"ࣩ";i:220;s:3:"࣪";i:230;s:3:"࣫";i:230;s:3:"࣬";i:230;s:3:"࣭";i:220;s:3:"࣮";i:220;s:3:"࣯";i:220;s:3:"ࣰ";i:27;s:3:"ࣱ";i:28;s:3:"ࣲ";i:29;s:3:"ࣳ";i:230;s:3:"ࣴ";i:230;s:3:"ࣵ";i:230;s:3:"ࣶ";i:220;s:3:"ࣷ";i:230;s:3:"ࣸ";i:230;s:3:"ࣹ";i:220;s:3:"ࣺ";i:220;s:3:"ࣻ";i:230;s:3:"ࣼ";i:230;s:3:"ࣽ";i:230;s:3:"ࣾ";i:230;s:3:"ࣿ";i:230;s:3:"़";i:7;s:3:"्";i:9;s:3:"॑";i:230;s:3:"॒";i:220;s:3:"॓";i:230;s:3:"॔";i:230;s:3:"়";i:7;s:3:"্";i:9;s:3:"਼";i:7;s:3:"੍";i:9;s:3:"઼";i:7;s:3:"્";i:9;s:3:"଼";i:7;s:3:"୍";i:9;s:3:"்";i:9;s:3:"్";i:9;s:3:"ౕ";i:84;s:3:"ౖ";i:91;s:3:"಼";i:7;s:3:"್";i:9;s:3:"്";i:9;s:3:"්";i:9;s:3:"ุ";i:103;s:3:"ู";i:103;s:3:"ฺ";i:9;s:3:"่";i:107;s:3:"้";i:107;s:3:"๊";i:107;s:3:"๋";i:107;s:3:"ຸ";i:118;s:3:"ູ";i:118;s:3:"່";i:122;s:3:"້";i:122;s:3:"໊";i:122;s:3:"໋";i:122;s:3:"༘";i:220;s:3:"༙";i:220;s:3:"༵";i:220;s:3:"༷";i:220;s:3:"༹";i:216;s:3:"ཱ";i:129;s:3:"ི";i:130;s:3:"ུ";i:132;s:3:"ེ";i:130;s:3:"ཻ";i:130;s:3:"ོ";i:130;s:3:"ཽ";i:130;s:3:"ྀ";i:130;s:3:"ྂ";i:230;s:3:"ྃ";i:230;s:3:"྄";i:9;s:3:"྆";i:230;s:3:"྇";i:230;s:3:"࿆";i:220;s:3:"့";i:7;s:3:"္";i:9;s:3:"်";i:9;s:3:"ႍ";i:220;s:3:"፝";i:230;s:3:"፞";i:230;s:3:"፟";i:230;s:3:"᜔";i:9;s:3:"᜴";i:9;s:3:"្";i:9;s:3:"៝";i:230;s:3:"ᢩ";i:228;s:3:"᤹";i:222;s:3:"᤺";i:230;s:3:"᤻";i:220;s:3:"ᨗ";i:230;s:3:"ᨘ";i:220;s:3:"᩠";i:9;s:3:"᩵";i:230;s:3:"᩶";i:230;s:3:"᩷";i:230;s:3:"᩸";i:230;s:3:"᩹";i:230;s:3:"᩺";i:230;s:3:"᩻";i:230;s:3:"᩼";i:230;s:3:"᩿";i:220;s:3:"᪰";i:230;s:3:"᪱";i:230;s:3:"᪲";i:230;s:3:"᪳";i:230;s:3:"᪴";i:230;s:3:"᪵";i:220;s:3:"᪶";i:220;s:3:"᪷";i:220;s:3:"᪸";i:220;s:3:"᪹";i:220;s:3:"᪺";i:220;s:3:"᪻";i:230;s:3:"᪼";i:230;s:3:"᪽";i:220;s:3:"᬴";i:7;s:3:"᭄";i:9;s:3:"᭫";i:230;s:3:"᭬";i:220;s:3:"᭭";i:230;s:3:"᭮";i:230;s:3:"᭯";i:230;s:3:"᭰";i:230;s:3:"᭱";i:230;s:3:"᭲";i:230;s:3:"᭳";i:230;s:3:"᮪";i:9;s:3:"᮫";i:9;s:3:"᯦";i:7;s:3:"᯲";i:9;s:3:"᯳";i:9;s:3:"᰷";i:7;s:3:"᳐";i:230;s:3:"᳑";i:230;s:3:"᳒";i:230;s:3:"᳔";i:1;s:3:"᳕";i:220;s:3:"᳖";i:220;s:3:"᳗";i:220;s:3:"᳘";i:220;s:3:"᳙";i:220;s:3:"᳚";i:230;s:3:"᳛";i:230;s:3:"᳜";i:220;s:3:"᳝";i:220;s:3:"᳞";i:220;s:3:"᳟";i:220;s:3:"᳠";i:230;s:3:"᳢";i:1;s:3:"᳣";i:1;s:3:"᳤";i:1;s:3:"᳥";i:1;s:3:"᳦";i:1;s:3:"᳧";i:1;s:3:"᳨";i:1;s:3:"᳭";i:220;s:3:"᳴";i:230;s:3:"᳸";i:230;s:3:"᳹";i:230;s:3:"᷀";i:230;s:3:"᷁";i:230;s:3:"᷂";i:220;s:3:"᷃";i:230;s:3:"᷄";i:230;s:3:"᷅";i:230;s:3:"᷆";i:230;s:3:"᷇";i:230;s:3:"᷈";i:230;s:3:"᷉";i:230;s:3:"᷊";i:220;s:3:"᷋";i:230;s:3:"᷌";i:230;s:3:"᷍";i:234;s:3:"᷎";i:214;s:3:"᷏";i:220;s:3:"᷐";i:202;s:3:"᷑";i:230;s:3:"᷒";i:230;s:3:"ᷓ";i:230;s:3:"ᷔ";i:230;s:3:"ᷕ";i:230;s:3:"ᷖ";i:230;s:3:"ᷗ";i:230;s:3:"ᷘ";i:230;s:3:"ᷙ";i:230;s:3:"ᷚ";i:230;s:3:"ᷛ";i:230;s:3:"ᷜ";i:230;s:3:"ᷝ";i:230;s:3:"ᷞ";i:230;s:3:"ᷟ";i:230;s:3:"ᷠ";i:230;s:3:"ᷡ";i:230;s:3:"ᷢ";i:230;s:3:"ᷣ";i:230;s:3:"ᷤ";i:230;s:3:"ᷥ";i:230;s:3:"ᷦ";i:230;s:3:"ᷧ";i:230;s:3:"ᷨ";i:230;s:3:"ᷩ";i:230;s:3:"ᷪ";i:230;s:3:"ᷫ";i:230;s:3:"ᷬ";i:230;s:3:"ᷭ";i:230;s:3:"ᷮ";i:230;s:3:"ᷯ";i:230;s:3:"ᷰ";i:230;s:3:"ᷱ";i:230;s:3:"ᷲ";i:230;s:3:"ᷳ";i:230;s:3:"ᷴ";i:230;s:3:"᷵";i:230;s:3:"᷼";i:233;s:3:"᷽";i:220;s:3:"᷾";i:230;s:3:"᷿";i:220;s:3:"⃐";i:230;s:3:"⃑";i:230;s:3:"⃒";i:1;s:3:"⃓";i:1;s:3:"⃔";i:230;s:3:"⃕";i:230;s:3:"⃖";i:230;s:3:"⃗";i:230;s:3:"⃘";i:1;s:3:"⃙";i:1;s:3:"⃚";i:1;s:3:"⃛";i:230;s:3:"⃜";i:230;s:3:"⃡";i:230;s:3:"⃥";i:1;s:3:"⃦";i:1;s:3:"⃧";i:230;s:3:"⃨";i:220;s:3:"⃩";i:230;s:3:"⃪";i:1;s:3:"⃫";i:1;s:3:"⃬";i:220;s:3:"⃭";i:220;s:3:"⃮";i:220;s:3:"⃯";i:220;s:3:"⃰";i:230;s:3:"⳯";i:230;s:3:"⳰";i:230;s:3:"⳱";i:230;s:3:"⵿";i:9;s:3:"ⷠ";i:230;s:3:"ⷡ";i:230;s:3:"ⷢ";i:230;s:3:"ⷣ";i:230;s:3:"ⷤ";i:230;s:3:"ⷥ";i:230;s:3:"ⷦ";i:230;s:3:"ⷧ";i:230;s:3:"ⷨ";i:230;s:3:"ⷩ";i:230;s:3:"ⷪ";i:230;s:3:"ⷫ";i:230;s:3:"ⷬ";i:230;s:3:"ⷭ";i:230;s:3:"ⷮ";i:230;s:3:"ⷯ";i:230;s:3:"ⷰ";i:230;s:3:"ⷱ";i:230;s:3:"ⷲ";i:230;s:3:"ⷳ";i:230;s:3:"ⷴ";i:230;s:3:"ⷵ";i:230;s:3:"ⷶ";i:230;s:3:"ⷷ";i:230;s:3:"ⷸ";i:230;s:3:"ⷹ";i:230;s:3:"ⷺ";i:230;s:3:"ⷻ";i:230;s:3:"ⷼ";i:230;s:3:"ⷽ";i:230;s:3:"ⷾ";i:230;s:3:"ⷿ";i:230;s:3:"〪";i:218;s:3:"〫";i:228;s:3:"〬";i:232;s:3:"〭";i:222;s:3:"〮";i:224;s:3:"〯";i:224;s:3:"゙";i:8;s:3:"゚";i:8;s:3:"꙯";i:230;s:3:"ꙴ";i:230;s:3:"ꙵ";i:230;s:3:"ꙶ";i:230;s:3:"ꙷ";i:230;s:3:"ꙸ";i:230;s:3:"ꙹ";i:230;s:3:"ꙺ";i:230;s:3:"ꙻ";i:230;s:3:"꙼";i:230;s:3:"꙽";i:230;s:3:"ꚟ";i:230;s:3:"꛰";i:230;s:3:"꛱";i:230;s:3:"꠆";i:9;s:3:"꣄";i:9;s:3:"꣠";i:230;s:3:"꣡";i:230;s:3:"꣢";i:230;s:3:"꣣";i:230;s:3:"꣤";i:230;s:3:"꣥";i:230;s:3:"꣦";i:230;s:3:"꣧";i:230;s:3:"꣨";i:230;s:3:"꣩";i:230;s:3:"꣪";i:230;s:3:"꣫";i:230;s:3:"꣬";i:230;s:3:"꣭";i:230;s:3:"꣮";i:230;s:3:"꣯";i:230;s:3:"꣰";i:230;s:3:"꣱";i:230;s:3:"꤫";i:220;s:3:"꤬";i:220;s:3:"꤭";i:220;s:3:"꥓";i:9;s:3:"꦳";i:7;s:3:"꧀";i:9;s:3:"ꪰ";i:230;s:3:"ꪲ";i:230;s:3:"ꪳ";i:230;s:3:"ꪴ";i:220;s:3:"ꪷ";i:230;s:3:"ꪸ";i:230;s:3:"ꪾ";i:230;s:3:"꪿";i:230;s:3:"꫁";i:230;s:3:"꫶";i:9;s:3:"꯭";i:9;s:3:"ﬞ";i:26;s:3:"︠";i:230;s:3:"︡";i:230;s:3:"︢";i:230;s:3:"︣";i:230;s:3:"︤";i:230;s:3:"︥";i:230;s:3:"︦";i:230;s:3:"︧";i:220;s:3:"︨";i:220;s:3:"︩";i:220;s:3:"︪";i:220;s:3:"︫";i:220;s:3:"︬";i:220;s:3:"︭";i:220;s:4:"𐇽";i:220;s:4:"𐋠";i:220;s:4:"𐍶";i:230;s:4:"𐍷";i:230;s:4:"𐍸";i:230;s:4:"𐍹";i:230;s:4:"𐍺";i:230;s:4:"𐨍";i:220;s:4:"𐨏";i:230;s:4:"𐨸";i:230;s:4:"𐨹";i:1;s:4:"𐨺";i:220;s:4:"𐨿";i:9;s:4:"𐫥";i:230;s:4:"𐫦";i:220;s:4:"𑁆";i:9;s:4:"𑁿";i:9;s:4:"𑂹";i:9;s:4:"𑂺";i:7;s:4:"𑄀";i:230;s:4:"𑄁";i:230;s:4:"𑄂";i:230;s:4:"𑄳";i:9;s:4:"𑄴";i:9;s:4:"𑅳";i:7;s:4:"𑇀";i:9;s:4:"𑈵";i:9;s:4:"𑈶";i:7;s:4:"𑋩";i:7;s:4:"𑋪";i:9;s:4:"𑌼";i:7;s:4:"𑍍";i:9;s:4:"𑍦";i:230;s:4:"𑍧";i:230;s:4:"𑍨";i:230;s:4:"𑍩";i:230;s:4:"𑍪";i:230;s:4:"𑍫";i:230;s:4:"𑍬";i:230;s:4:"𑍰";i:230;s:4:"𑍱";i:230;s:4:"𑍲";i:230;s:4:"𑍳";i:230;s:4:"𑍴";i:230;s:4:"𑓂";i:9;s:4:"𑓃";i:7;s:4:"𑖿";i:9;s:4:"𑗀";i:7;s:4:"𑘿";i:9;s:4:"𑚶";i:9;s:4:"𑚷";i:7;s:4:"𖫰";i:1;s:4:"𖫱";i:1;s:4:"𖫲";i:1;s:4:"𖫳";i:1;s:4:"𖫴";i:1;s:4:"𖬰";i:230;s:4:"𖬱";i:230;s:4:"𖬲";i:230;s:4:"𖬳";i:230;s:4:"𖬴";i:230;s:4:"𖬵";i:230;s:4:"𖬶";i:230;s:4:"𛲞";i:1;s:4:"𝅥";i:216;s:4:"𝅦";i:216;s:4:"𝅧";i:1;s:4:"𝅨";i:1;s:4:"𝅩";i:1;s:4:"𝅭";i:226;s:4:"𝅮";i:216;s:4:"𝅯";i:216;s:4:"𝅰";i:216;s:4:"𝅱";i:216;s:4:"𝅲";i:216;s:4:"𝅻";i:220;s:4:"𝅼";i:220;s:4:"𝅽";i:220;s:4:"𝅾";i:220;s:4:"𝅿";i:220;s:4:"𝆀";i:220;s:4:"𝆁";i:220;s:4:"𝆂";i:220;s:4:"𝆅";i:230;s:4:"𝆆";i:230;s:4:"𝆇";i:230;s:4:"𝆈";i:230;s:4:"𝆉";i:230;s:4:"𝆊";i:220;s:4:"𝆋";i:220;s:4:"𝆪";i:230;s:4:"𝆫";i:230;s:4:"𝆬";i:230;s:4:"𝆭";i:230;s:4:"𝉂";i:230;s:4:"𝉃";i:230;s:4:"𝉄";i:230;s:4:"𞣐";i:220;s:4:"𞣑";i:220;s:4:"𞣒";i:220;s:4:"𞣓";i:220;s:4:"𞣔";i:220;s:4:"𞣕";i:220;s:4:"𞣖";i:220;}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/unidata/compatibilityDecomposition.ser
@@ -0,0 +1 @@
+a:3677:{s:2:" ";s:1:" ";s:2:"¨";s:3:" ̈";s:2:"ª";s:1:"a";s:2:"¯";s:3:" ̄";s:2:"²";s:1:"2";s:2:"³";s:1:"3";s:2:"´";s:3:" ́";s:2:"µ";s:2:"μ";s:2:"¸";s:3:" ̧";s:2:"¹";s:1:"1";s:2:"º";s:1:"o";s:2:"¼";s:5:"1⁄4";s:2:"½";s:5:"1⁄2";s:2:"¾";s:5:"3⁄4";s:2:"Ĳ";s:2:"IJ";s:2:"ĳ";s:2:"ij";s:2:"Ŀ";s:3:"L·";s:2:"ŀ";s:3:"l·";s:2:"ŉ";s:3:"ʼn";s:2:"ſ";s:1:"s";s:2:"Ǆ";s:4:"DŽ";s:2:"ǅ";s:4:"Dž";s:2:"ǆ";s:4:"dž";s:2:"Ǉ";s:2:"LJ";s:2:"ǈ";s:2:"Lj";s:2:"ǉ";s:2:"lj";s:2:"Ǌ";s:2:"NJ";s:2:"ǋ";s:2:"Nj";s:2:"ǌ";s:2:"nj";s:2:"Ǳ";s:2:"DZ";s:2:"ǲ";s:2:"Dz";s:2:"ǳ";s:2:"dz";s:2:"ʰ";s:1:"h";s:2:"ʱ";s:2:"ɦ";s:2:"ʲ";s:1:"j";s:2:"ʳ";s:1:"r";s:2:"ʴ";s:2:"ɹ";s:2:"ʵ";s:2:"ɻ";s:2:"ʶ";s:2:"ʁ";s:2:"ʷ";s:1:"w";s:2:"ʸ";s:1:"y";s:2:"˘";s:3:" ̆";s:2:"˙";s:3:" ̇";s:2:"˚";s:3:" ̊";s:2:"˛";s:3:" ̨";s:2:"˜";s:3:" ̃";s:2:"˝";s:3:" ̋";s:2:"ˠ";s:2:"ɣ";s:2:"ˡ";s:1:"l";s:2:"ˢ";s:1:"s";s:2:"ˣ";s:1:"x";s:2:"ˤ";s:2:"ʕ";s:2:"ͺ";s:3:" ͅ";s:2:"΄";s:3:" ́";s:2:"΅";s:5:" ̈́";s:2:"ϐ";s:2:"β";s:2:"ϑ";s:2:"θ";s:2:"ϒ";s:2:"Υ";s:2:"ϓ";s:4:"Ύ";s:2:"ϔ";s:4:"Ϋ";s:2:"ϕ";s:2:"φ";s:2:"ϖ";s:2:"π";s:2:"ϰ";s:2:"κ";s:2:"ϱ";s:2:"ρ";s:2:"ϲ";s:2:"ς";s:2:"ϴ";s:2:"Θ";s:2:"ϵ";s:2:"ε";s:2:"Ϲ";s:2:"Σ";s:2:"և";s:4:"եւ";s:2:"ٵ";s:4:"اٴ";s:2:"ٶ";s:4:"وٴ";s:2:"ٷ";s:4:"ۇٴ";s:2:"ٸ";s:4:"يٴ";s:3:"ำ";s:6:"ํา";s:3:"ຳ";s:6:"ໍາ";s:3:"ໜ";s:6:"ຫນ";s:3:"ໝ";s:6:"ຫມ";s:3:"༌";s:3:"་";s:3:"ཷ";s:9:"ྲཱྀ";s:3:"ཹ";s:9:"ླཱྀ";s:3:"ჼ";s:3:"ნ";s:3:"ᴬ";s:1:"A";s:3:"ᴭ";s:2:"Æ";s:3:"ᴮ";s:1:"B";s:3:"ᴰ";s:1:"D";s:3:"ᴱ";s:1:"E";s:3:"ᴲ";s:2:"Ǝ";s:3:"ᴳ";s:1:"G";s:3:"ᴴ";s:1:"H";s:3:"ᴵ";s:1:"I";s:3:"ᴶ";s:1:"J";s:3:"ᴷ";s:1:"K";s:3:"ᴸ";s:1:"L";s:3:"ᴹ";s:1:"M";s:3:"ᴺ";s:1:"N";s:3:"ᴼ";s:1:"O";s:3:"ᴽ";s:2:"Ȣ";s:3:"ᴾ";s:1:"P";s:3:"ᴿ";s:1:"R";s:3:"ᵀ";s:1:"T";s:3:"ᵁ";s:1:"U";s:3:"ᵂ";s:1:"W";s:3:"ᵃ";s:1:"a";s:3:"ᵄ";s:2:"ɐ";s:3:"ᵅ";s:2:"ɑ";s:3:"ᵆ";s:3:"ᴂ";s:3:"ᵇ";s:1:"b";s:3:"ᵈ";s:1:"d";s:3:"ᵉ";s:1:"e";s:3:"ᵊ";s:2:"ə";s:3:"ᵋ";s:2:"ɛ";s:3:"ᵌ";s:2:"ɜ";s:3:"ᵍ";s:1:"g";s:3:"ᵏ";s:1:"k";s:3:"ᵐ";s:1:"m";s:3:"ᵑ";s:2:"ŋ";s:3:"ᵒ";s:1:"o";s:3:"ᵓ";s:2:"ɔ";s:3:"ᵔ";s:3:"ᴖ";s:3:"ᵕ";s:3:"ᴗ";s:3:"ᵖ";s:1:"p";s:3:"ᵗ";s:1:"t";s:3:"ᵘ";s:1:"u";s:3:"ᵙ";s:3:"ᴝ";s:3:"ᵚ";s:2:"ɯ";s:3:"ᵛ";s:1:"v";s:3:"ᵜ";s:3:"ᴥ";s:3:"ᵝ";s:2:"β";s:3:"ᵞ";s:2:"γ";s:3:"ᵟ";s:2:"δ";s:3:"ᵠ";s:2:"φ";s:3:"ᵡ";s:2:"χ";s:3:"ᵢ";s:1:"i";s:3:"ᵣ";s:1:"r";s:3:"ᵤ";s:1:"u";s:3:"ᵥ";s:1:"v";s:3:"ᵦ";s:2:"β";s:3:"ᵧ";s:2:"γ";s:3:"ᵨ";s:2:"ρ";s:3:"ᵩ";s:2:"φ";s:3:"ᵪ";s:2:"χ";s:3:"ᵸ";s:2:"н";s:3:"ᶛ";s:2:"ɒ";s:3:"ᶜ";s:1:"c";s:3:"ᶝ";s:2:"ɕ";s:3:"ᶞ";s:2:"ð";s:3:"ᶟ";s:2:"ɜ";s:3:"ᶠ";s:1:"f";s:3:"ᶡ";s:2:"ɟ";s:3:"ᶢ";s:2:"ɡ";s:3:"ᶣ";s:2:"ɥ";s:3:"ᶤ";s:2:"ɨ";s:3:"ᶥ";s:2:"ɩ";s:3:"ᶦ";s:2:"ɪ";s:3:"ᶧ";s:3:"ᵻ";s:3:"ᶨ";s:2:"ʝ";s:3:"ᶩ";s:2:"ɭ";s:3:"ᶪ";s:3:"ᶅ";s:3:"ᶫ";s:2:"ʟ";s:3:"ᶬ";s:2:"ɱ";s:3:"ᶭ";s:2:"ɰ";s:3:"ᶮ";s:2:"ɲ";s:3:"ᶯ";s:2:"ɳ";s:3:"ᶰ";s:2:"ɴ";s:3:"ᶱ";s:2:"ɵ";s:3:"ᶲ";s:2:"ɸ";s:3:"ᶳ";s:2:"ʂ";s:3:"ᶴ";s:2:"ʃ";s:3:"ᶵ";s:2:"ƫ";s:3:"ᶶ";s:2:"ʉ";s:3:"ᶷ";s:2:"ʊ";s:3:"ᶸ";s:3:"ᴜ";s:3:"ᶹ";s:2:"ʋ";s:3:"ᶺ";s:2:"ʌ";s:3:"ᶻ";s:1:"z";s:3:"ᶼ";s:2:"ʐ";s:3:"ᶽ";s:2:"ʑ";s:3:"ᶾ";s:2:"ʒ";s:3:"ᶿ";s:2:"θ";s:3:"ẚ";s:3:"aʾ";s:3:"ẛ";s:3:"ṡ";s:3:"᾽";s:3:" ̓";s:3:"᾿";s:3:" ̓";s:3:"῀";s:3:" ͂";s:3:"῁";s:5:" ̈͂";s:3:"῍";s:5:" ̓̀";s:3:"῎";s:5:" ̓́";s:3:"῏";s:5:" ̓͂";s:3:"῝";s:5:" ̔̀";s:3:"῞";s:5:" ̔́";s:3:"῟";s:5:" ̔͂";s:3:"῭";s:5:" ̈̀";s:3:"΅";s:5:" ̈́";s:3:"´";s:3:" ́";s:3:"῾";s:3:" ̔";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:"‑";s:3:"‐";s:3:"‗";s:3:" ̳";s:3:"․";s:1:".";s:3:"‥";s:2:"..";s:3:"…";s:3:"...";s:3:" ";s:1:" ";s:3:"″";s:6:"′′";s:3:"‴";s:9:"′′′";s:3:"‶";s:6:"‵‵";s:3:"‷";s:9:"‵‵‵";s:3:"‼";s:2:"!!";s:3:"‾";s:3:" ̅";s:3:"⁇";s:2:"??";s:3:"⁈";s:2:"?!";s:3:"⁉";s:2:"!?";s:3:"⁗";s:12:"′′′′";s:3:" ";s:1:" ";s:3:"⁰";s:1:"0";s:3:"ⁱ";s:1:"i";s:3:"⁴";s:1:"4";s:3:"⁵";s:1:"5";s:3:"⁶";s:1:"6";s:3:"⁷";s:1:"7";s:3:"⁸";s:1:"8";s:3:"⁹";s:1:"9";s:3:"⁺";s:1:"+";s:3:"⁻";s:3:"−";s:3:"⁼";s:1:"=";s:3:"⁽";s:1:"(";s:3:"⁾";s:1:")";s:3:"ⁿ";s:1:"n";s:3:"₀";s:1:"0";s:3:"₁";s:1:"1";s:3:"₂";s:1:"2";s:3:"₃";s:1:"3";s:3:"₄";s:1:"4";s:3:"₅";s:1:"5";s:3:"₆";s:1:"6";s:3:"₇";s:1:"7";s:3:"₈";s:1:"8";s:3:"₉";s:1:"9";s:3:"₊";s:1:"+";s:3:"₋";s:3:"−";s:3:"₌";s:1:"=";s:3:"₍";s:1:"(";s:3:"₎";s:1:")";s:3:"ₐ";s:1:"a";s:3:"ₑ";s:1:"e";s:3:"ₒ";s:1:"o";s:3:"ₓ";s:1:"x";s:3:"ₔ";s:2:"ə";s:3:"ₕ";s:1:"h";s:3:"ₖ";s:1:"k";s:3:"ₗ";s:1:"l";s:3:"ₘ";s:1:"m";s:3:"ₙ";s:1:"n";s:3:"ₚ";s:1:"p";s:3:"ₛ";s:1:"s";s:3:"ₜ";s:1:"t";s:3:"₨";s:2:"Rs";s:3:"℀";s:3:"a/c";s:3:"℁";s:3:"a/s";s:3:"ℂ";s:1:"C";s:3:"℃";s:3:"°C";s:3:"℅";s:3:"c/o";s:3:"℆";s:3:"c/u";s:3:"ℇ";s:2:"Ɛ";s:3:"℉";s:3:"°F";s:3:"ℊ";s:1:"g";s:3:"ℋ";s:1:"H";s:3:"ℌ";s:1:"H";s:3:"ℍ";s:1:"H";s:3:"ℎ";s:1:"h";s:3:"ℏ";s:2:"ħ";s:3:"ℐ";s:1:"I";s:3:"ℑ";s:1:"I";s:3:"ℒ";s:1:"L";s:3:"ℓ";s:1:"l";s:3:"ℕ";s:1:"N";s:3:"№";s:2:"No";s:3:"ℙ";s:1:"P";s:3:"ℚ";s:1:"Q";s:3:"ℛ";s:1:"R";s:3:"ℜ";s:1:"R";s:3:"ℝ";s:1:"R";s:3:"℠";s:2:"SM";s:3:"℡";s:3:"TEL";s:3:"™";s:2:"TM";s:3:"ℤ";s:1:"Z";s:3:"ℨ";s:1:"Z";s:3:"ℬ";s:1:"B";s:3:"ℭ";s:1:"C";s:3:"ℯ";s:1:"e";s:3:"ℰ";s:1:"E";s:3:"ℱ";s:1:"F";s:3:"ℳ";s:1:"M";s:3:"ℴ";s:1:"o";s:3:"ℵ";s:2:"א";s:3:"ℶ";s:2:"ב";s:3:"ℷ";s:2:"ג";s:3:"ℸ";s:2:"ד";s:3:"ℹ";s:1:"i";s:3:"℻";s:3:"FAX";s:3:"ℼ";s:2:"π";s:3:"ℽ";s:2:"γ";s:3:"ℾ";s:2:"Γ";s:3:"ℿ";s:2:"Π";s:3:"⅀";s:3:"∑";s:3:"ⅅ";s:1:"D";s:3:"ⅆ";s:1:"d";s:3:"ⅇ";s:1:"e";s:3:"ⅈ";s:1:"i";s:3:"ⅉ";s:1:"j";s:3:"⅐";s:5:"1⁄7";s:3:"⅑";s:5:"1⁄9";s:3:"⅒";s:6:"1⁄10";s:3:"⅓";s:5:"1⁄3";s:3:"⅔";s:5:"2⁄3";s:3:"⅕";s:5:"1⁄5";s:3:"⅖";s:5:"2⁄5";s:3:"⅗";s:5:"3⁄5";s:3:"⅘";s:5:"4⁄5";s:3:"⅙";s:5:"1⁄6";s:3:"⅚";s:5:"5⁄6";s:3:"⅛";s:5:"1⁄8";s:3:"⅜";s:5:"3⁄8";s:3:"⅝";s:5:"5⁄8";s:3:"⅞";s:5:"7⁄8";s:3:"⅟";s:4:"1⁄";s:3:"Ⅰ";s:1:"I";s:3:"Ⅱ";s:2:"II";s:3:"Ⅲ";s:3:"III";s:3:"Ⅳ";s:2:"IV";s:3:"Ⅴ";s:1:"V";s:3:"Ⅵ";s:2:"VI";s:3:"Ⅶ";s:3:"VII";s:3:"Ⅷ";s:4:"VIII";s:3:"Ⅸ";s:2:"IX";s:3:"Ⅹ";s:1:"X";s:3:"Ⅺ";s:2:"XI";s:3:"Ⅻ";s:3:"XII";s:3:"Ⅼ";s:1:"L";s:3:"Ⅽ";s:1:"C";s:3:"Ⅾ";s:1:"D";s:3:"Ⅿ";s:1:"M";s:3:"ⅰ";s:1:"i";s:3:"ⅱ";s:2:"ii";s:3:"ⅲ";s:3:"iii";s:3:"ⅳ";s:2:"iv";s:3:"ⅴ";s:1:"v";s:3:"ⅵ";s:2:"vi";s:3:"ⅶ";s:3:"vii";s:3:"ⅷ";s:4:"viii";s:3:"ⅸ";s:2:"ix";s:3:"ⅹ";s:1:"x";s:3:"ⅺ";s:2:"xi";s:3:"ⅻ";s:3:"xii";s:3:"ⅼ";s:1:"l";s:3:"ⅽ";s:1:"c";s:3:"ⅾ";s:1:"d";s:3:"ⅿ";s:1:"m";s:3:"↉";s:5:"0⁄3";s:3:"∬";s:6:"∫∫";s:3:"∭";s:9:"∫∫∫";s:3:"∯";s:6:"∮∮";s:3:"∰";s:9:"∮∮∮";s:3:"①";s:1:"1";s:3:"②";s:1:"2";s:3:"③";s:1:"3";s:3:"④";s:1:"4";s:3:"⑤";s:1:"5";s:3:"⑥";s:1:"6";s:3:"⑦";s:1:"7";s:3:"⑧";s:1:"8";s:3:"⑨";s:1:"9";s:3:"⑩";s:2:"10";s:3:"⑪";s:2:"11";s:3:"⑫";s:2:"12";s:3:"⑬";s:2:"13";s:3:"⑭";s:2:"14";s:3:"⑮";s:2:"15";s:3:"⑯";s:2:"16";s:3:"⑰";s:2:"17";s:3:"⑱";s:2:"18";s:3:"⑲";s:2:"19";s:3:"⑳";s:2:"20";s:3:"⑴";s:3:"(1)";s:3:"⑵";s:3:"(2)";s:3:"⑶";s:3:"(3)";s:3:"⑷";s:3:"(4)";s:3:"⑸";s:3:"(5)";s:3:"⑹";s:3:"(6)";s:3:"⑺";s:3:"(7)";s:3:"⑻";s:3:"(8)";s:3:"⑼";s:3:"(9)";s:3:"⑽";s:4:"(10)";s:3:"⑾";s:4:"(11)";s:3:"⑿";s:4:"(12)";s:3:"⒀";s:4:"(13)";s:3:"⒁";s:4:"(14)";s:3:"⒂";s:4:"(15)";s:3:"⒃";s:4:"(16)";s:3:"⒄";s:4:"(17)";s:3:"⒅";s:4:"(18)";s:3:"⒆";s:4:"(19)";s:3:"⒇";s:4:"(20)";s:3:"⒈";s:2:"1.";s:3:"⒉";s:2:"2.";s:3:"⒊";s:2:"3.";s:3:"⒋";s:2:"4.";s:3:"⒌";s:2:"5.";s:3:"⒍";s:2:"6.";s:3:"⒎";s:2:"7.";s:3:"⒏";s:2:"8.";s:3:"⒐";s:2:"9.";s:3:"⒑";s:3:"10.";s:3:"⒒";s:3:"11.";s:3:"⒓";s:3:"12.";s:3:"⒔";s:3:"13.";s:3:"⒕";s:3:"14.";s:3:"⒖";s:3:"15.";s:3:"⒗";s:3:"16.";s:3:"⒘";s:3:"17.";s:3:"⒙";s:3:"18.";s:3:"⒚";s:3:"19.";s:3:"⒛";s:3:"20.";s:3:"⒜";s:3:"(a)";s:3:"⒝";s:3:"(b)";s:3:"⒞";s:3:"(c)";s:3:"⒟";s:3:"(d)";s:3:"⒠";s:3:"(e)";s:3:"⒡";s:3:"(f)";s:3:"⒢";s:3:"(g)";s:3:"⒣";s:3:"(h)";s:3:"⒤";s:3:"(i)";s:3:"⒥";s:3:"(j)";s:3:"⒦";s:3:"(k)";s:3:"⒧";s:3:"(l)";s:3:"⒨";s:3:"(m)";s:3:"⒩";s:3:"(n)";s:3:"⒪";s:3:"(o)";s:3:"⒫";s:3:"(p)";s:3:"⒬";s:3:"(q)";s:3:"⒭";s:3:"(r)";s:3:"⒮";s:3:"(s)";s:3:"⒯";s:3:"(t)";s:3:"⒰";s:3:"(u)";s:3:"⒱";s:3:"(v)";s:3:"⒲";s:3:"(w)";s:3:"⒳";s:3:"(x)";s:3:"⒴";s:3:"(y)";s:3:"⒵";s:3:"(z)";s:3:"Ⓐ";s:1:"A";s:3:"Ⓑ";s:1:"B";s:3:"Ⓒ";s:1:"C";s:3:"Ⓓ";s:1:"D";s:3:"Ⓔ";s:1:"E";s:3:"Ⓕ";s:1:"F";s:3:"Ⓖ";s:1:"G";s:3:"Ⓗ";s:1:"H";s:3:"Ⓘ";s:1:"I";s:3:"Ⓙ";s:1:"J";s:3:"Ⓚ";s:1:"K";s:3:"Ⓛ";s:1:"L";s:3:"Ⓜ";s:1:"M";s:3:"Ⓝ";s:1:"N";s:3:"Ⓞ";s:1:"O";s:3:"Ⓟ";s:1:"P";s:3:"Ⓠ";s:1:"Q";s:3:"Ⓡ";s:1:"R";s:3:"Ⓢ";s:1:"S";s:3:"Ⓣ";s:1:"T";s:3:"Ⓤ";s:1:"U";s:3:"Ⓥ";s:1:"V";s:3:"Ⓦ";s:1:"W";s:3:"Ⓧ";s:1:"X";s:3:"Ⓨ";s:1:"Y";s:3:"Ⓩ";s:1:"Z";s:3:"ⓐ";s:1:"a";s:3:"ⓑ";s:1:"b";s:3:"ⓒ";s:1:"c";s:3:"ⓓ";s:1:"d";s:3:"ⓔ";s:1:"e";s:3:"ⓕ";s:1:"f";s:3:"ⓖ";s:1:"g";s:3:"ⓗ";s:1:"h";s:3:"ⓘ";s:1:"i";s:3:"ⓙ";s:1:"j";s:3:"ⓚ";s:1:"k";s:3:"ⓛ";s:1:"l";s:3:"ⓜ";s:1:"m";s:3:"ⓝ";s:1:"n";s:3:"ⓞ";s:1:"o";s:3:"ⓟ";s:1:"p";s:3:"ⓠ";s:1:"q";s:3:"ⓡ";s:1:"r";s:3:"ⓢ";s:1:"s";s:3:"ⓣ";s:1:"t";s:3:"ⓤ";s:1:"u";s:3:"ⓥ";s:1:"v";s:3:"ⓦ";s:1:"w";s:3:"ⓧ";s:1:"x";s:3:"ⓨ";s:1:"y";s:3:"ⓩ";s:1:"z";s:3:"⓪";s:1:"0";s:3:"⨌";s:12:"∫∫∫∫";s:3:"⩴";s:3:"::=";s:3:"⩵";s:2:"==";s:3:"⩶";s:3:"===";s:3:"ⱼ";s:1:"j";s:3:"ⱽ";s:1:"V";s:3:"ⵯ";s:3:"ⵡ";s:3:"⺟";s:3:"母";s:3:"⻳";s:3:"龟";s:3:"⼀";s:3:"一";s:3:"⼁";s:3:"丨";s:3:"⼂";s:3:"丶";s:3:"⼃";s:3:"丿";s:3:"⼄";s:3:"乙";s:3:"⼅";s:3:"亅";s:3:"⼆";s:3:"二";s:3:"⼇";s:3:"亠";s:3:"⼈";s:3:"人";s:3:"⼉";s:3:"儿";s:3:"⼊";s:3:"入";s:3:"⼋";s:3:"八";s:3:"⼌";s:3:"冂";s:3:"⼍";s:3:"冖";s:3:"⼎";s:3:"冫";s:3:"⼏";s:3:"几";s:3:"⼐";s:3:"凵";s:3:"⼑";s:3:"刀";s:3:"⼒";s:3:"力";s:3:"⼓";s:3:"勹";s:3:"⼔";s:3:"匕";s:3:"⼕";s:3:"匚";s:3:"⼖";s:3:"匸";s:3:"⼗";s:3:"十";s:3:"⼘";s:3:"卜";s:3:"⼙";s:3:"卩";s:3:"⼚";s:3:"厂";s:3:"⼛";s:3:"厶";s:3:"⼜";s:3:"又";s:3:"⼝";s:3:"口";s:3:"⼞";s:3:"囗";s:3:"⼟";s:3:"土";s:3:"⼠";s:3:"士";s:3:"⼡";s:3:"夂";s:3:"⼢";s:3:"夊";s:3:"⼣";s:3:"夕";s:3:"⼤";s:3:"大";s:3:"⼥";s:3:"女";s:3:"⼦";s:3:"子";s:3:"⼧";s:3:"宀";s:3:"⼨";s:3:"寸";s:3:"⼩";s:3:"小";s:3:"⼪";s:3:"尢";s:3:"⼫";s:3:"尸";s:3:"⼬";s:3:"屮";s:3:"⼭";s:3:"山";s:3:"⼮";s:3:"巛";s:3:"⼯";s:3:"工";s:3:"⼰";s:3:"己";s:3:"⼱";s:3:"巾";s:3:"⼲";s:3:"干";s:3:"⼳";s:3:"幺";s:3:"⼴";s:3:"广";s:3:"⼵";s:3:"廴";s:3:"⼶";s:3:"廾";s:3:"⼷";s:3:"弋";s:3:"⼸";s:3:"弓";s:3:"⼹";s:3:"彐";s:3:"⼺";s:3:"彡";s:3:"⼻";s:3:"彳";s:3:"⼼";s:3:"心";s:3:"⼽";s:3:"戈";s:3:"⼾";s:3:"戶";s:3:"⼿";s:3:"手";s:3:"⽀";s:3:"支";s:3:"⽁";s:3:"攴";s:3:"⽂";s:3:"文";s:3:"⽃";s:3:"斗";s:3:"⽄";s:3:"斤";s:3:"⽅";s:3:"方";s:3:"⽆";s:3:"无";s:3:"⽇";s:3:"日";s:3:"⽈";s:3:"曰";s:3:"⽉";s:3:"月";s:3:"⽊";s:3:"木";s:3:"⽋";s:3:"欠";s:3:"⽌";s:3:"止";s:3:"⽍";s:3:"歹";s:3:"⽎";s:3:"殳";s:3:"⽏";s:3:"毋";s:3:"⽐";s:3:"比";s:3:"⽑";s:3:"毛";s:3:"⽒";s:3:"氏";s:3:"⽓";s:3:"气";s:3:"⽔";s:3:"水";s:3:"⽕";s:3:"火";s:3:"⽖";s:3:"爪";s:3:"⽗";s:3:"父";s:3:"⽘";s:3:"爻";s:3:"⽙";s:3:"爿";s:3:"⽚";s:3:"片";s:3:"⽛";s:3:"牙";s:3:"⽜";s:3:"牛";s:3:"⽝";s:3:"犬";s:3:"⽞";s:3:"玄";s:3:"⽟";s:3:"玉";s:3:"⽠";s:3:"瓜";s:3:"⽡";s:3:"瓦";s:3:"⽢";s:3:"甘";s:3:"⽣";s:3:"生";s:3:"⽤";s:3:"用";s:3:"⽥";s:3:"田";s:3:"⽦";s:3:"疋";s:3:"⽧";s:3:"疒";s:3:"⽨";s:3:"癶";s:3:"⽩";s:3:"白";s:3:"⽪";s:3:"皮";s:3:"⽫";s:3:"皿";s:3:"⽬";s:3:"目";s:3:"⽭";s:3:"矛";s:3:"⽮";s:3:"矢";s:3:"⽯";s:3:"石";s:3:"⽰";s:3:"示";s:3:"⽱";s:3:"禸";s:3:"⽲";s:3:"禾";s:3:"⽳";s:3:"穴";s:3:"⽴";s:3:"立";s:3:"⽵";s:3:"竹";s:3:"⽶";s:3:"米";s:3:"⽷";s:3:"糸";s:3:"⽸";s:3:"缶";s:3:"⽹";s:3:"网";s:3:"⽺";s:3:"羊";s:3:"⽻";s:3:"羽";s:3:"⽼";s:3:"老";s:3:"⽽";s:3:"而";s:3:"⽾";s:3:"耒";s:3:"⽿";s:3:"耳";s:3:"⾀";s:3:"聿";s:3:"⾁";s:3:"肉";s:3:"⾂";s:3:"臣";s:3:"⾃";s:3:"自";s:3:"⾄";s:3:"至";s:3:"⾅";s:3:"臼";s:3:"⾆";s:3:"舌";s:3:"⾇";s:3:"舛";s:3:"⾈";s:3:"舟";s:3:"⾉";s:3:"艮";s:3:"⾊";s:3:"色";s:3:"⾋";s:3:"艸";s:3:"⾌";s:3:"虍";s:3:"⾍";s:3:"虫";s:3:"⾎";s:3:"血";s:3:"⾏";s:3:"行";s:3:"⾐";s:3:"衣";s:3:"⾑";s:3:"襾";s:3:"⾒";s:3:"見";s:3:"⾓";s:3:"角";s:3:"⾔";s:3:"言";s:3:"⾕";s:3:"谷";s:3:"⾖";s:3:"豆";s:3:"⾗";s:3:"豕";s:3:"⾘";s:3:"豸";s:3:"⾙";s:3:"貝";s:3:"⾚";s:3:"赤";s:3:"⾛";s:3:"走";s:3:"⾜";s:3:"足";s:3:"⾝";s:3:"身";s:3:"⾞";s:3:"車";s:3:"⾟";s:3:"辛";s:3:"⾠";s:3:"辰";s:3:"⾡";s:3:"辵";s:3:"⾢";s:3:"邑";s:3:"⾣";s:3:"酉";s:3:"⾤";s:3:"釆";s:3:"⾥";s:3:"里";s:3:"⾦";s:3:"金";s:3:"⾧";s:3:"長";s:3:"⾨";s:3:"門";s:3:"⾩";s:3:"阜";s:3:"⾪";s:3:"隶";s:3:"⾫";s:3:"隹";s:3:"⾬";s:3:"雨";s:3:"⾭";s:3:"靑";s:3:"⾮";s:3:"非";s:3:"⾯";s:3:"面";s:3:"⾰";s:3:"革";s:3:"⾱";s:3:"韋";s:3:"⾲";s:3:"韭";s:3:"⾳";s:3:"音";s:3:"⾴";s:3:"頁";s:3:"⾵";s:3:"風";s:3:"⾶";s:3:"飛";s:3:"⾷";s:3:"食";s:3:"⾸";s:3:"首";s:3:"⾹";s:3:"香";s:3:"⾺";s:3:"馬";s:3:"⾻";s:3:"骨";s:3:"⾼";s:3:"高";s:3:"⾽";s:3:"髟";s:3:"⾾";s:3:"鬥";s:3:"⾿";s:3:"鬯";s:3:"⿀";s:3:"鬲";s:3:"⿁";s:3:"鬼";s:3:"⿂";s:3:"魚";s:3:"⿃";s:3:"鳥";s:3:"⿄";s:3:"鹵";s:3:"⿅";s:3:"鹿";s:3:"⿆";s:3:"麥";s:3:"⿇";s:3:"麻";s:3:"⿈";s:3:"黃";s:3:"⿉";s:3:"黍";s:3:"⿊";s:3:"黑";s:3:"⿋";s:3:"黹";s:3:"⿌";s:3:"黽";s:3:"⿍";s:3:"鼎";s:3:"⿎";s:3:"鼓";s:3:"⿏";s:3:"鼠";s:3:"⿐";s:3:"鼻";s:3:"⿑";s:3:"齊";s:3:"⿒";s:3:"齒";s:3:"⿓";s:3:"龍";s:3:"⿔";s:3:"龜";s:3:"⿕";s:3:"龠";s:3:"　";s:1:" ";s:3:"〶";s:3:"〒";s:3:"〸";s:3:"十";s:3:"〹";s:3:"卄";s:3:"〺";s:3:"卅";s:3:"゛";s:4:" ゙";s:3:"゜";s:4:" ゚";s:3:"ゟ";s:6:"より";s:3:"ヿ";s:6:"コト";s:3:"ㄱ";s:3:"ᄀ";s:3:"ㄲ";s:3:"ᄁ";s:3:"ㄳ";s:3:"ᆪ";s:3:"ㄴ";s:3:"ᄂ";s:3:"ㄵ";s:3:"ᆬ";s:3:"ㄶ";s:3:"ᆭ";s:3:"ㄷ";s:3:"ᄃ";s:3:"ㄸ";s:3:"ᄄ";s:3:"ㄹ";s:3:"ᄅ";s:3:"ㄺ";s:3:"ᆰ";s:3:"ㄻ";s:3:"ᆱ";s:3:"ㄼ";s:3:"ᆲ";s:3:"ㄽ";s:3:"ᆳ";s:3:"ㄾ";s:3:"ᆴ";s:3:"ㄿ";s:3:"ᆵ";s:3:"ㅀ";s:3:"ᄚ";s:3:"ㅁ";s:3:"ᄆ";s:3:"ㅂ";s:3:"ᄇ";s:3:"ㅃ";s:3:"ᄈ";s:3:"ㅄ";s:3:"ᄡ";s:3:"ㅅ";s:3:"ᄉ";s:3:"ㅆ";s:3:"ᄊ";s:3:"ㅇ";s:3:"ᄋ";s:3:"ㅈ";s:3:"ᄌ";s:3:"ㅉ";s:3:"ᄍ";s:3:"ㅊ";s:3:"ᄎ";s:3:"ㅋ";s:3:"ᄏ";s:3:"ㅌ";s:3:"ᄐ";s:3:"ㅍ";s:3:"ᄑ";s:3:"ㅎ";s:3:"ᄒ";s:3:"ㅏ";s:3:"ᅡ";s:3:"ㅐ";s:3:"ᅢ";s:3:"ㅑ";s:3:"ᅣ";s:3:"ㅒ";s:3:"ᅤ";s:3:"ㅓ";s:3:"ᅥ";s:3:"ㅔ";s:3:"ᅦ";s:3:"ㅕ";s:3:"ᅧ";s:3:"ㅖ";s:3:"ᅨ";s:3:"ㅗ";s:3:"ᅩ";s:3:"ㅘ";s:3:"ᅪ";s:3:"ㅙ";s:3:"ᅫ";s:3:"ㅚ";s:3:"ᅬ";s:3:"ㅛ";s:3:"ᅭ";s:3:"ㅜ";s:3:"ᅮ";s:3:"ㅝ";s:3:"ᅯ";s:3:"ㅞ";s:3:"ᅰ";s:3:"ㅟ";s:3:"ᅱ";s:3:"ㅠ";s:3:"ᅲ";s:3:"ㅡ";s:3:"ᅳ";s:3:"ㅢ";s:3:"ᅴ";s:3:"ㅣ";s:3:"ᅵ";s:3:"ㅤ";s:3:"ᅠ";s:3:"ㅥ";s:3:"ᄔ";s:3:"ㅦ";s:3:"ᄕ";s:3:"ㅧ";s:3:"ᇇ";s:3:"ㅨ";s:3:"ᇈ";s:3:"ㅩ";s:3:"ᇌ";s:3:"ㅪ";s:3:"ᇎ";s:3:"ㅫ";s:3:"ᇓ";s:3:"ㅬ";s:3:"ᇗ";s:3:"ㅭ";s:3:"ᇙ";s:3:"ㅮ";s:3:"ᄜ";s:3:"ㅯ";s:3:"ᇝ";s:3:"ㅰ";s:3:"ᇟ";s:3:"ㅱ";s:3:"ᄝ";s:3:"ㅲ";s:3:"ᄞ";s:3:"ㅳ";s:3:"ᄠ";s:3:"ㅴ";s:3:"ᄢ";s:3:"ㅵ";s:3:"ᄣ";s:3:"ㅶ";s:3:"ᄧ";s:3:"ㅷ";s:3:"ᄩ";s:3:"ㅸ";s:3:"ᄫ";s:3:"ㅹ";s:3:"ᄬ";s:3:"ㅺ";s:3:"ᄭ";s:3:"ㅻ";s:3:"ᄮ";s:3:"ㅼ";s:3:"ᄯ";s:3:"ㅽ";s:3:"ᄲ";s:3:"ㅾ";s:3:"ᄶ";s:3:"ㅿ";s:3:"ᅀ";s:3:"ㆀ";s:3:"ᅇ";s:3:"ㆁ";s:3:"ᅌ";s:3:"ㆂ";s:3:"ᇱ";s:3:"ㆃ";s:3:"ᇲ";s:3:"ㆄ";s:3:"ᅗ";s:3:"ㆅ";s:3:"ᅘ";s:3:"ㆆ";s:3:"ᅙ";s:3:"ㆇ";s:3:"ᆄ";s:3:"ㆈ";s:3:"ᆅ";s:3:"ㆉ";s:3:"ᆈ";s:3:"ㆊ";s:3:"ᆑ";s:3:"ㆋ";s:3:"ᆒ";s:3:"ㆌ";s:3:"ᆔ";s:3:"ㆍ";s:3:"ᆞ";s:3:"ㆎ";s:3:"ᆡ";s:3:"㆒";s:3:"一";s:3:"㆓";s:3:"二";s:3:"㆔";s:3:"三";s:3:"㆕";s:3:"四";s:3:"㆖";s:3:"上";s:3:"㆗";s:3:"中";s:3:"㆘";s:3:"下";s:3:"㆙";s:3:"甲";s:3:"㆚";s:3:"乙";s:3:"㆛";s:3:"丙";s:3:"㆜";s:3:"丁";s:3:"㆝";s:3:"天";s:3:"㆞";s:3:"地";s:3:"㆟";s:3:"人";s:3:"㈀";s:5:"(ᄀ)";s:3:"㈁";s:5:"(ᄂ)";s:3:"㈂";s:5:"(ᄃ)";s:3:"㈃";s:5:"(ᄅ)";s:3:"㈄";s:5:"(ᄆ)";s:3:"㈅";s:5:"(ᄇ)";s:3:"㈆";s:5:"(ᄉ)";s:3:"㈇";s:5:"(ᄋ)";s:3:"㈈";s:5:"(ᄌ)";s:3:"㈉";s:5:"(ᄎ)";s:3:"㈊";s:5:"(ᄏ)";s:3:"㈋";s:5:"(ᄐ)";s:3:"㈌";s:5:"(ᄑ)";s:3:"㈍";s:5:"(ᄒ)";s:3:"㈎";s:8:"(가)";s:3:"㈏";s:8:"(나)";s:3:"㈐";s:8:"(다)";s:3:"㈑";s:8:"(라)";s:3:"㈒";s:8:"(마)";s:3:"㈓";s:8:"(바)";s:3:"㈔";s:8:"(사)";s:3:"㈕";s:8:"(아)";s:3:"㈖";s:8:"(자)";s:3:"㈗";s:8:"(차)";s:3:"㈘";s:8:"(카)";s:3:"㈙";s:8:"(타)";s:3:"㈚";s:8:"(파)";s:3:"㈛";s:8:"(하)";s:3:"㈜";s:8:"(주)";s:3:"㈝";s:17:"(오전)";s:3:"㈞";s:14:"(오후)";s:3:"㈠";s:5:"(一)";s:3:"㈡";s:5:"(二)";s:3:"㈢";s:5:"(三)";s:3:"㈣";s:5:"(四)";s:3:"㈤";s:5:"(五)";s:3:"㈥";s:5:"(六)";s:3:"㈦";s:5:"(七)";s:3:"㈧";s:5:"(八)";s:3:"㈨";s:5:"(九)";s:3:"㈩";s:5:"(十)";s:3:"㈪";s:5:"(月)";s:3:"㈫";s:5:"(火)";s:3:"㈬";s:5:"(水)";s:3:"㈭";s:5:"(木)";s:3:"㈮";s:5:"(金)";s:3:"㈯";s:5:"(土)";s:3:"㈰";s:5:"(日)";s:3:"㈱";s:5:"(株)";s:3:"㈲";s:5:"(有)";s:3:"㈳";s:5:"(社)";s:3:"㈴";s:5:"(名)";s:3:"㈵";s:5:"(特)";s:3:"㈶";s:5:"(財)";s:3:"㈷";s:5:"(祝)";s:3:"㈸";s:5:"(労)";s:3:"㈹";s:5:"(代)";s:3:"㈺";s:5:"(呼)";s:3:"㈻";s:5:"(学)";s:3:"㈼";s:5:"(監)";s:3:"㈽";s:5:"(企)";s:3:"㈾";s:5:"(資)";s:3:"㈿";s:5:"(協)";s:3:"㉀";s:5:"(祭)";s:3:"㉁";s:5:"(休)";s:3:"㉂";s:5:"(自)";s:3:"㉃";s:5:"(至)";s:3:"㉄";s:3:"問";s:3:"㉅";s:3:"幼";s:3:"㉆";s:3:"文";s:3:"㉇";s:3:"箏";s:3:"㉐";s:3:"PTE";s:3:"㉑";s:2:"21";s:3:"㉒";s:2:"22";s:3:"㉓";s:2:"23";s:3:"㉔";s:2:"24";s:3:"㉕";s:2:"25";s:3:"㉖";s:2:"26";s:3:"㉗";s:2:"27";s:3:"㉘";s:2:"28";s:3:"㉙";s:2:"29";s:3:"㉚";s:2:"30";s:3:"㉛";s:2:"31";s:3:"㉜";s:2:"32";s:3:"㉝";s:2:"33";s:3:"㉞";s:2:"34";s:3:"㉟";s:2:"35";s:3:"㉠";s:3:"ᄀ";s:3:"㉡";s:3:"ᄂ";s:3:"㉢";s:3:"ᄃ";s:3:"㉣";s:3:"ᄅ";s:3:"㉤";s:3:"ᄆ";s:3:"㉥";s:3:"ᄇ";s:3:"㉦";s:3:"ᄉ";s:3:"㉧";s:3:"ᄋ";s:3:"㉨";s:3:"ᄌ";s:3:"㉩";s:3:"ᄎ";s:3:"㉪";s:3:"ᄏ";s:3:"㉫";s:3:"ᄐ";s:3:"㉬";s:3:"ᄑ";s:3:"㉭";s:3:"ᄒ";s:3:"㉮";s:6:"가";s:3:"㉯";s:6:"나";s:3:"㉰";s:6:"다";s:3:"㉱";s:6:"라";s:3:"㉲";s:6:"마";s:3:"㉳";s:6:"바";s:3:"㉴";s:6:"사";s:3:"㉵";s:6:"아";s:3:"㉶";s:6:"자";s:3:"㉷";s:6:"차";s:3:"㉸";s:6:"카";s:3:"㉹";s:6:"타";s:3:"㉺";s:6:"파";s:3:"㉻";s:6:"하";s:3:"㉼";s:15:"참고";s:3:"㉽";s:12:"주의";s:3:"㉾";s:6:"우";s:3:"㊀";s:3:"一";s:3:"㊁";s:3:"二";s:3:"㊂";s:3:"三";s:3:"㊃";s:3:"四";s:3:"㊄";s:3:"五";s:3:"㊅";s:3:"六";s:3:"㊆";s:3:"七";s:3:"㊇";s:3:"八";s:3:"㊈";s:3:"九";s:3:"㊉";s:3:"十";s:3:"㊊";s:3:"月";s:3:"㊋";s:3:"火";s:3:"㊌";s:3:"水";s:3:"㊍";s:3:"木";s:3:"㊎";s:3:"金";s:3:"㊏";s:3:"土";s:3:"㊐";s:3:"日";s:3:"㊑";s:3:"株";s:3:"㊒";s:3:"有";s:3:"㊓";s:3:"社";s:3:"㊔";s:3:"名";s:3:"㊕";s:3:"特";s:3:"㊖";s:3:"財";s:3:"㊗";s:3:"祝";s:3:"㊘";s:3:"労";s:3:"㊙";s:3:"秘";s:3:"㊚";s:3:"男";s:3:"㊛";s:3:"女";s:3:"㊜";s:3:"適";s:3:"㊝";s:3:"優";s:3:"㊞";s:3:"印";s:3:"㊟";s:3:"注";s:3:"㊠";s:3:"項";s:3:"㊡";s:3:"休";s:3:"㊢";s:3:"写";s:3:"㊣";s:3:"正";s:3:"㊤";s:3:"上";s:3:"㊥";s:3:"中";s:3:"㊦";s:3:"下";s:3:"㊧";s:3:"左";s:3:"㊨";s:3:"右";s:3:"㊩";s:3:"医";s:3:"㊪";s:3:"宗";s:3:"㊫";s:3:"学";s:3:"㊬";s:3:"監";s:3:"㊭";s:3:"企";s:3:"㊮";s:3:"資";s:3:"㊯";s:3:"協";s:3:"㊰";s:3:"夜";s:3:"㊱";s:2:"36";s:3:"㊲";s:2:"37";s:3:"㊳";s:2:"38";s:3:"㊴";s:2:"39";s:3:"㊵";s:2:"40";s:3:"㊶";s:2:"41";s:3:"㊷";s:2:"42";s:3:"㊸";s:2:"43";s:3:"㊹";s:2:"44";s:3:"㊺";s:2:"45";s:3:"㊻";s:2:"46";s:3:"㊼";s:2:"47";s:3:"㊽";s:2:"48";s:3:"㊾";s:2:"49";s:3:"㊿";s:2:"50";s:3:"㋀";s:4:"1月";s:3:"㋁";s:4:"2月";s:3:"㋂";s:4:"3月";s:3:"㋃";s:4:"4月";s:3:"㋄";s:4:"5月";s:3:"㋅";s:4:"6月";s:3:"㋆";s:4:"7月";s:3:"㋇";s:4:"8月";s:3:"㋈";s:4:"9月";s:3:"㋉";s:5:"10月";s:3:"㋊";s:5:"11月";s:3:"㋋";s:5:"12月";s:3:"㋌";s:2:"Hg";s:3:"㋍";s:3:"erg";s:3:"㋎";s:2:"eV";s:3:"㋏";s:3:"LTD";s:3:"㋐";s:3:"ア";s:3:"㋑";s:3:"イ";s:3:"㋒";s:3:"ウ";s:3:"㋓";s:3:"エ";s:3:"㋔";s:3:"オ";s:3:"㋕";s:3:"カ";s:3:"㋖";s:3:"キ";s:3:"㋗";s:3:"ク";s:3:"㋘";s:3:"ケ";s:3:"㋙";s:3:"コ";s:3:"㋚";s:3:"サ";s:3:"㋛";s:3:"シ";s:3:"㋜";s:3:"ス";s:3:"㋝";s:3:"セ";s:3:"㋞";s:3:"ソ";s:3:"㋟";s:3:"タ";s:3:"㋠";s:3:"チ";s:3:"㋡";s:3:"ツ";s:3:"㋢";s:3:"テ";s:3:"㋣";s:3:"ト";s:3:"㋤";s:3:"ナ";s:3:"㋥";s:3:"ニ";s:3:"㋦";s:3:"ヌ";s:3:"㋧";s:3:"ネ";s:3:"㋨";s:3:"ノ";s:3:"㋩";s:3:"ハ";s:3:"㋪";s:3:"ヒ";s:3:"㋫";s:3:"フ";s:3:"㋬";s:3:"ヘ";s:3:"㋭";s:3:"ホ";s:3:"㋮";s:3:"マ";s:3:"㋯";s:3:"ミ";s:3:"㋰";s:3:"ム";s:3:"㋱";s:3:"メ";s:3:"㋲";s:3:"モ";s:3:"㋳";s:3:"ヤ";s:3:"㋴";s:3:"ユ";s:3:"㋵";s:3:"ヨ";s:3:"㋶";s:3:"ラ";s:3:"㋷";s:3:"リ";s:3:"㋸";s:3:"ル";s:3:"㋹";s:3:"レ";s:3:"㋺";s:3:"ロ";s:3:"㋻";s:3:"ワ";s:3:"㋼";s:3:"ヰ";s:3:"㋽";s:3:"ヱ";s:3:"㋾";s:3:"ヲ";s:3:"㌀";s:15:"アパート";s:3:"㌁";s:12:"アルファ";s:3:"㌂";s:15:"アンペア";s:3:"㌃";s:9:"アール";s:3:"㌄";s:15:"イニング";s:3:"㌅";s:9:"インチ";s:3:"㌆";s:9:"ウォン";s:3:"㌇";s:18:"エスクード";s:3:"㌈";s:12:"エーカー";s:3:"㌉";s:9:"オンス";s:3:"㌊";s:9:"オーム";s:3:"㌋";s:9:"カイリ";s:3:"㌌";s:12:"カラット";s:3:"㌍";s:12:"カロリー";s:3:"㌎";s:12:"ガロン";s:3:"㌏";s:12:"ガンマ";s:3:"㌐";s:12:"ギガ";s:3:"㌑";s:12:"ギニー";s:3:"㌒";s:12:"キュリー";s:3:"㌓";s:18:"ギルダー";s:3:"㌔";s:6:"キロ";s:3:"㌕";s:18:"キログラム";s:3:"㌖";s:18:"キロメートル";s:3:"㌗";s:15:"キロワット";s:3:"㌘";s:12:"グラム";s:3:"㌙";s:18:"グラムトン";s:3:"㌚";s:18:"クルゼイロ";s:3:"㌛";s:12:"クローネ";s:3:"㌜";s:9:"ケース";s:3:"㌝";s:9:"コルナ";s:3:"㌞";s:12:"コーポ";s:3:"㌟";s:12:"サイクル";s:3:"㌠";s:15:"サンチーム";s:3:"㌡";s:15:"シリング";s:3:"㌢";s:9:"センチ";s:3:"㌣";s:9:"セント";s:3:"㌤";s:12:"ダース";s:3:"㌥";s:9:"デシ";s:3:"㌦";s:9:"ドル";s:3:"㌧";s:6:"トン";s:3:"㌨";s:6:"ナノ";s:3:"㌩";s:9:"ノット";s:3:"㌪";s:9:"ハイツ";s:3:"㌫";s:18:"パーセント";s:3:"㌬";s:12:"パーツ";s:3:"㌭";s:15:"バーレル";s:3:"㌮";s:18:"ピアストル";s:3:"㌯";s:12:"ピクル";s:3:"㌰";s:9:"ピコ";s:3:"㌱";s:9:"ビル";s:3:"㌲";s:18:"ファラッド";s:3:"㌳";s:12:"フィート";s:3:"㌴";s:18:"ブッシェル";s:3:"㌵";s:9:"フラン";s:3:"㌶";s:15:"ヘクタール";s:3:"㌷";s:9:"ペソ";s:3:"㌸";s:12:"ペニヒ";s:3:"㌹";s:9:"ヘルツ";s:3:"㌺";s:12:"ペンス";s:3:"㌻";s:15:"ページ";s:3:"㌼";s:12:"ベータ";s:3:"㌽";s:15:"ポイント";s:3:"㌾";s:12:"ボルト";s:3:"㌿";s:6:"ホン";s:3:"㍀";s:15:"ポンド";s:3:"㍁";s:9:"ホール";s:3:"㍂";s:9:"ホーン";s:3:"㍃";s:12:"マイクロ";s:3:"㍄";s:9:"マイル";s:3:"㍅";s:9:"マッハ";s:3:"㍆";s:9:"マルク";s:3:"㍇";s:15:"マンション";s:3:"㍈";s:12:"ミクロン";s:3:"㍉";s:6:"ミリ";s:3:"㍊";s:18:"ミリバール";s:3:"㍋";s:9:"メガ";s:3:"㍌";s:15:"メガトン";s:3:"㍍";s:12:"メートル";s:3:"㍎";s:12:"ヤード";s:3:"㍏";s:9:"ヤール";s:3:"㍐";s:9:"ユアン";s:3:"㍑";s:12:"リットル";s:3:"㍒";s:6:"リラ";s:3:"㍓";s:12:"ルピー";s:3:"㍔";s:15:"ルーブル";s:3:"㍕";s:6:"レム";s:3:"㍖";s:18:"レントゲン";s:3:"㍗";s:9:"ワット";s:3:"㍘";s:4:"0点";s:3:"㍙";s:4:"1点";s:3:"㍚";s:4:"2点";s:3:"㍛";s:4:"3点";s:3:"㍜";s:4:"4点";s:3:"㍝";s:4:"5点";s:3:"㍞";s:4:"6点";s:3:"㍟";s:4:"7点";s:3:"㍠";s:4:"8点";s:3:"㍡";s:4:"9点";s:3:"㍢";s:5:"10点";s:3:"㍣";s:5:"11点";s:3:"㍤";s:5:"12点";s:3:"㍥";s:5:"13点";s:3:"㍦";s:5:"14点";s:3:"㍧";s:5:"15点";s:3:"㍨";s:5:"16点";s:3:"㍩";s:5:"17点";s:3:"㍪";s:5:"18点";s:3:"㍫";s:5:"19点";s:3:"㍬";s:5:"20点";s:3:"㍭";s:5:"21点";s:3:"㍮";s:5:"22点";s:3:"㍯";s:5:"23点";s:3:"㍰";s:5:"24点";s:3:"㍱";s:3:"hPa";s:3:"㍲";s:2:"da";s:3:"㍳";s:2:"AU";s:3:"㍴";s:3:"bar";s:3:"㍵";s:2:"oV";s:3:"㍶";s:2:"pc";s:3:"㍷";s:2:"dm";s:3:"㍸";s:3:"dm2";s:3:"㍹";s:3:"dm3";s:3:"㍺";s:2:"IU";s:3:"㍻";s:6:"平成";s:3:"㍼";s:6:"昭和";s:3:"㍽";s:6:"大正";s:3:"㍾";s:6:"明治";s:3:"㍿";s:12:"株式会社";s:3:"㎀";s:2:"pA";s:3:"㎁";s:2:"nA";s:3:"㎂";s:3:"μA";s:3:"㎃";s:2:"mA";s:3:"㎄";s:2:"kA";s:3:"㎅";s:2:"KB";s:3:"㎆";s:2:"MB";s:3:"㎇";s:2:"GB";s:3:"㎈";s:3:"cal";s:3:"㎉";s:4:"kcal";s:3:"㎊";s:2:"pF";s:3:"㎋";s:2:"nF";s:3:"㎌";s:3:"μF";s:3:"㎍";s:3:"μg";s:3:"㎎";s:2:"mg";s:3:"㎏";s:2:"kg";s:3:"㎐";s:2:"Hz";s:3:"㎑";s:3:"kHz";s:3:"㎒";s:3:"MHz";s:3:"㎓";s:3:"GHz";s:3:"㎔";s:3:"THz";s:3:"㎕";s:3:"μl";s:3:"㎖";s:2:"ml";s:3:"㎗";s:2:"dl";s:3:"㎘";s:2:"kl";s:3:"㎙";s:2:"fm";s:3:"㎚";s:2:"nm";s:3:"㎛";s:3:"μm";s:3:"㎜";s:2:"mm";s:3:"㎝";s:2:"cm";s:3:"㎞";s:2:"km";s:3:"㎟";s:3:"mm2";s:3:"㎠";s:3:"cm2";s:3:"㎡";s:2:"m2";s:3:"㎢";s:3:"km2";s:3:"㎣";s:3:"mm3";s:3:"㎤";s:3:"cm3";s:3:"㎥";s:2:"m3";s:3:"㎦";s:3:"km3";s:3:"㎧";s:5:"m∕s";s:3:"㎨";s:6:"m∕s2";s:3:"㎩";s:2:"Pa";s:3:"㎪";s:3:"kPa";s:3:"㎫";s:3:"MPa";s:3:"㎬";s:3:"GPa";s:3:"㎭";s:3:"rad";s:3:"㎮";s:7:"rad∕s";s:3:"㎯";s:8:"rad∕s2";s:3:"㎰";s:2:"ps";s:3:"㎱";s:2:"ns";s:3:"㎲";s:3:"μs";s:3:"㎳";s:2:"ms";s:3:"㎴";s:2:"pV";s:3:"㎵";s:2:"nV";s:3:"㎶";s:3:"μV";s:3:"㎷";s:2:"mV";s:3:"㎸";s:2:"kV";s:3:"㎹";s:2:"MV";s:3:"㎺";s:2:"pW";s:3:"㎻";s:2:"nW";s:3:"㎼";s:3:"μW";s:3:"㎽";s:2:"mW";s:3:"㎾";s:2:"kW";s:3:"㎿";s:2:"MW";s:3:"㏀";s:3:"kΩ";s:3:"㏁";s:3:"MΩ";s:3:"㏂";s:4:"a.m.";s:3:"㏃";s:2:"Bq";s:3:"㏄";s:2:"cc";s:3:"㏅";s:2:"cd";s:3:"㏆";s:6:"C∕kg";s:3:"㏇";s:3:"Co.";s:3:"㏈";s:2:"dB";s:3:"㏉";s:2:"Gy";s:3:"㏊";s:2:"ha";s:3:"㏋";s:2:"HP";s:3:"㏌";s:2:"in";s:3:"㏍";s:2:"KK";s:3:"㏎";s:2:"KM";s:3:"㏏";s:2:"kt";s:3:"㏐";s:2:"lm";s:3:"㏑";s:2:"ln";s:3:"㏒";s:3:"log";s:3:"㏓";s:2:"lx";s:3:"㏔";s:2:"mb";s:3:"㏕";s:3:"mil";s:3:"㏖";s:3:"mol";s:3:"㏗";s:2:"PH";s:3:"㏘";s:4:"p.m.";s:3:"㏙";s:3:"PPM";s:3:"㏚";s:2:"PR";s:3:"㏛";s:2:"sr";s:3:"㏜";s:2:"Sv";s:3:"㏝";s:2:"Wb";s:3:"㏞";s:5:"V∕m";s:3:"㏟";s:5:"A∕m";s:3:"㏠";s:4:"1日";s:3:"㏡";s:4:"2日";s:3:"㏢";s:4:"3日";s:3:"㏣";s:4:"4日";s:3:"㏤";s:4:"5日";s:3:"㏥";s:4:"6日";s:3:"㏦";s:4:"7日";s:3:"㏧";s:4:"8日";s:3:"㏨";s:4:"9日";s:3:"㏩";s:5:"10日";s:3:"㏪";s:5:"11日";s:3:"㏫";s:5:"12日";s:3:"㏬";s:5:"13日";s:3:"㏭";s:5:"14日";s:3:"㏮";s:5:"15日";s:3:"㏯";s:5:"16日";s:3:"㏰";s:5:"17日";s:3:"㏱";s:5:"18日";s:3:"㏲";s:5:"19日";s:3:"㏳";s:5:"20日";s:3:"㏴";s:5:"21日";s:3:"㏵";s:5:"22日";s:3:"㏶";s:5:"23日";s:3:"㏷";s:5:"24日";s:3:"㏸";s:5:"25日";s:3:"㏹";s:5:"26日";s:3:"㏺";s:5:"27日";s:3:"㏻";s:5:"28日";s:3:"㏼";s:5:"29日";s:3:"㏽";s:5:"30日";s:3:"㏾";s:5:"31日";s:3:"㏿";s:3:"gal";s:3:"ꚜ";s:2:"ъ";s:3:"ꚝ";s:2:"ь";s:3:"ꝰ";s:3:"ꝯ";s:3:"ꟸ";s:2:"Ħ";s:3:"ꟹ";s:2:"œ";s:3:"ꭜ";s:3:"ꜧ";s:3:"ꭝ";s:3:"ꬷ";s:3:"ꭞ";s:2:"ɫ";s:3:"ꭟ";s:3:"ꭒ";s:3:"ﬀ";s:2:"ff";s:3:"ﬁ";s:2:"fi";s:3:"ﬂ";s:2:"fl";s:3:"ﬃ";s:3:"ffi";s:3:"ﬄ";s:3:"ffl";s:3:"ﬅ";s:2:"st";s:3:"ﬆ";s:2:"st";s:3:"ﬓ";s:4:"մն";s:3:"ﬔ";s:4:"մե";s:3:"ﬕ";s:4:"մի";s:3:"ﬖ";s:4:"վն";s:3:"ﬗ";s:4:"մխ";s:3:"ﬠ";s:2:"ע";s:3:"ﬡ";s:2:"א";s:3:"ﬢ";s:2:"ד";s:3:"ﬣ";s:2:"ה";s:3:"ﬤ";s:2:"כ";s:3:"ﬥ";s:2:"ל";s:3:"ﬦ";s:2:"ם";s:3:"ﬧ";s:2:"ר";s:3:"ﬨ";s:2:"ת";s:3:"﬩";s:1:"+";s:3:"ﭏ";s:4:"אל";s:3:"ﭐ";s:2:"ٱ";s:3:"ﭑ";s:2:"ٱ";s:3:"ﭒ";s:2:"ٻ";s:3:"ﭓ";s:2:"ٻ";s:3:"ﭔ";s:2:"ٻ";s:3:"ﭕ";s:2:"ٻ";s:3:"ﭖ";s:2:"پ";s:3:"ﭗ";s:2:"پ";s:3:"ﭘ";s:2:"پ";s:3:"ﭙ";s:2:"پ";s:3:"ﭚ";s:2:"ڀ";s:3:"ﭛ";s:2:"ڀ";s:3:"ﭜ";s:2:"ڀ";s:3:"ﭝ";s:2:"ڀ";s:3:"ﭞ";s:2:"ٺ";s:3:"ﭟ";s:2:"ٺ";s:3:"ﭠ";s:2:"ٺ";s:3:"ﭡ";s:2:"ٺ";s:3:"ﭢ";s:2:"ٿ";s:3:"ﭣ";s:2:"ٿ";s:3:"ﭤ";s:2:"ٿ";s:3:"ﭥ";s:2:"ٿ";s:3:"ﭦ";s:2:"ٹ";s:3:"ﭧ";s:2:"ٹ";s:3:"ﭨ";s:2:"ٹ";s:3:"ﭩ";s:2:"ٹ";s:3:"ﭪ";s:2:"ڤ";s:3:"ﭫ";s:2:"ڤ";s:3:"ﭬ";s:2:"ڤ";s:3:"ﭭ";s:2:"ڤ";s:3:"ﭮ";s:2:"ڦ";s:3:"ﭯ";s:2:"ڦ";s:3:"ﭰ";s:2:"ڦ";s:3:"ﭱ";s:2:"ڦ";s:3:"ﭲ";s:2:"ڄ";s:3:"ﭳ";s:2:"ڄ";s:3:"ﭴ";s:2:"ڄ";s:3:"ﭵ";s:2:"ڄ";s:3:"ﭶ";s:2:"ڃ";s:3:"ﭷ";s:2:"ڃ";s:3:"ﭸ";s:2:"ڃ";s:3:"ﭹ";s:2:"ڃ";s:3:"ﭺ";s:2:"چ";s:3:"ﭻ";s:2:"چ";s:3:"ﭼ";s:2:"چ";s:3:"ﭽ";s:2:"چ";s:3:"ﭾ";s:2:"ڇ";s:3:"ﭿ";s:2:"ڇ";s:3:"ﮀ";s:2:"ڇ";s:3:"ﮁ";s:2:"ڇ";s:3:"ﮂ";s:2:"ڍ";s:3:"ﮃ";s:2:"ڍ";s:3:"ﮄ";s:2:"ڌ";s:3:"ﮅ";s:2:"ڌ";s:3:"ﮆ";s:2:"ڎ";s:3:"ﮇ";s:2:"ڎ";s:3:"ﮈ";s:2:"ڈ";s:3:"ﮉ";s:2:"ڈ";s:3:"ﮊ";s:2:"ژ";s:3:"ﮋ";s:2:"ژ";s:3:"ﮌ";s:2:"ڑ";s:3:"ﮍ";s:2:"ڑ";s:3:"ﮎ";s:2:"ک";s:3:"ﮏ";s:2:"ک";s:3:"ﮐ";s:2:"ک";s:3:"ﮑ";s:2:"ک";s:3:"ﮒ";s:2:"گ";s:3:"ﮓ";s:2:"گ";s:3:"ﮔ";s:2:"گ";s:3:"ﮕ";s:2:"گ";s:3:"ﮖ";s:2:"ڳ";s:3:"ﮗ";s:2:"ڳ";s:3:"ﮘ";s:2:"ڳ";s:3:"ﮙ";s:2:"ڳ";s:3:"ﮚ";s:2:"ڱ";s:3:"ﮛ";s:2:"ڱ";s:3:"ﮜ";s:2:"ڱ";s:3:"ﮝ";s:2:"ڱ";s:3:"ﮞ";s:2:"ں";s:3:"ﮟ";s:2:"ں";s:3:"ﮠ";s:2:"ڻ";s:3:"ﮡ";s:2:"ڻ";s:3:"ﮢ";s:2:"ڻ";s:3:"ﮣ";s:2:"ڻ";s:3:"ﮤ";s:4:"ۀ";s:3:"ﮥ";s:4:"ۀ";s:3:"ﮦ";s:2:"ہ";s:3:"ﮧ";s:2:"ہ";s:3:"ﮨ";s:2:"ہ";s:3:"ﮩ";s:2:"ہ";s:3:"ﮪ";s:2:"ھ";s:3:"ﮫ";s:2:"ھ";s:3:"ﮬ";s:2:"ھ";s:3:"ﮭ";s:2:"ھ";s:3:"ﮮ";s:2:"ے";s:3:"ﮯ";s:2:"ے";s:3:"ﮰ";s:4:"ۓ";s:3:"ﮱ";s:4:"ۓ";s:3:"ﯓ";s:2:"ڭ";s:3:"ﯔ";s:2:"ڭ";s:3:"ﯕ";s:2:"ڭ";s:3:"ﯖ";s:2:"ڭ";s:3:"ﯗ";s:2:"ۇ";s:3:"ﯘ";s:2:"ۇ";s:3:"ﯙ";s:2:"ۆ";s:3:"ﯚ";s:2:"ۆ";s:3:"ﯛ";s:2:"ۈ";s:3:"ﯜ";s:2:"ۈ";s:3:"ﯝ";s:4:"ۇٴ";s:3:"ﯞ";s:2:"ۋ";s:3:"ﯟ";s:2:"ۋ";s:3:"ﯠ";s:2:"ۅ";s:3:"ﯡ";s:2:"ۅ";s:3:"ﯢ";s:2:"ۉ";s:3:"ﯣ";s:2:"ۉ";s:3:"ﯤ";s:2:"ې";s:3:"ﯥ";s:2:"ې";s:3:"ﯦ";s:2:"ې";s:3:"ﯧ";s:2:"ې";s:3:"ﯨ";s:2:"ى";s:3:"ﯩ";s:2:"ى";s:3:"ﯪ";s:6:"ئا";s:3:"ﯫ";s:6:"ئا";s:3:"ﯬ";s:6:"ئە";s:3:"ﯭ";s:6:"ئە";s:3:"ﯮ";s:6:"ئو";s:3:"ﯯ";s:6:"ئو";s:3:"ﯰ";s:6:"ئۇ";s:3:"ﯱ";s:6:"ئۇ";s:3:"ﯲ";s:6:"ئۆ";s:3:"ﯳ";s:6:"ئۆ";s:3:"ﯴ";s:6:"ئۈ";s:3:"ﯵ";s:6:"ئۈ";s:3:"ﯶ";s:6:"ئې";s:3:"ﯷ";s:6:"ئې";s:3:"ﯸ";s:6:"ئې";s:3:"ﯹ";s:6:"ئى";s:3:"ﯺ";s:6:"ئى";s:3:"ﯻ";s:6:"ئى";s:3:"ﯼ";s:2:"ی";s:3:"ﯽ";s:2:"ی";s:3:"ﯾ";s:2:"ی";s:3:"ﯿ";s:2:"ی";s:3:"ﰀ";s:6:"ئج";s:3:"ﰁ";s:6:"ئح";s:3:"ﰂ";s:6:"ئم";s:3:"ﰃ";s:6:"ئى";s:3:"ﰄ";s:6:"ئي";s:3:"ﰅ";s:4:"بج";s:3:"ﰆ";s:4:"بح";s:3:"ﰇ";s:4:"بخ";s:3:"ﰈ";s:4:"بم";s:3:"ﰉ";s:4:"بى";s:3:"ﰊ";s:4:"بي";s:3:"ﰋ";s:4:"تج";s:3:"ﰌ";s:4:"تح";s:3:"ﰍ";s:4:"تخ";s:3:"ﰎ";s:4:"تم";s:3:"ﰏ";s:4:"تى";s:3:"ﰐ";s:4:"تي";s:3:"ﰑ";s:4:"ثج";s:3:"ﰒ";s:4:"ثم";s:3:"ﰓ";s:4:"ثى";s:3:"ﰔ";s:4:"ثي";s:3:"ﰕ";s:4:"جح";s:3:"ﰖ";s:4:"جم";s:3:"ﰗ";s:4:"حج";s:3:"ﰘ";s:4:"حم";s:3:"ﰙ";s:4:"خج";s:3:"ﰚ";s:4:"خح";s:3:"ﰛ";s:4:"خم";s:3:"ﰜ";s:4:"سج";s:3:"ﰝ";s:4:"سح";s:3:"ﰞ";s:4:"سخ";s:3:"ﰟ";s:4:"سم";s:3:"ﰠ";s:4:"صح";s:3:"ﰡ";s:4:"صم";s:3:"ﰢ";s:4:"ضج";s:3:"ﰣ";s:4:"ضح";s:3:"ﰤ";s:4:"ضخ";s:3:"ﰥ";s:4:"ضم";s:3:"ﰦ";s:4:"طح";s:3:"ﰧ";s:4:"طم";s:3:"ﰨ";s:4:"ظم";s:3:"ﰩ";s:4:"عج";s:3:"ﰪ";s:4:"عم";s:3:"ﰫ";s:4:"غج";s:3:"ﰬ";s:4:"غم";s:3:"ﰭ";s:4:"فج";s:3:"ﰮ";s:4:"فح";s:3:"ﰯ";s:4:"فخ";s:3:"ﰰ";s:4:"فم";s:3:"ﰱ";s:4:"فى";s:3:"ﰲ";s:4:"في";s:3:"ﰳ";s:4:"قح";s:3:"ﰴ";s:4:"قم";s:3:"ﰵ";s:4:"قى";s:3:"ﰶ";s:4:"قي";s:3:"ﰷ";s:4:"كا";s:3:"ﰸ";s:4:"كج";s:3:"ﰹ";s:4:"كح";s:3:"ﰺ";s:4:"كخ";s:3:"ﰻ";s:4:"كل";s:3:"ﰼ";s:4:"كم";s:3:"ﰽ";s:4:"كى";s:3:"ﰾ";s:4:"كي";s:3:"ﰿ";s:4:"لج";s:3:"ﱀ";s:4:"لح";s:3:"ﱁ";s:4:"لخ";s:3:"ﱂ";s:4:"لم";s:3:"ﱃ";s:4:"لى";s:3:"ﱄ";s:4:"لي";s:3:"ﱅ";s:4:"مج";s:3:"ﱆ";s:4:"مح";s:3:"ﱇ";s:4:"مخ";s:3:"ﱈ";s:4:"مم";s:3:"ﱉ";s:4:"مى";s:3:"ﱊ";s:4:"مي";s:3:"ﱋ";s:4:"نج";s:3:"ﱌ";s:4:"نح";s:3:"ﱍ";s:4:"نخ";s:3:"ﱎ";s:4:"نم";s:3:"ﱏ";s:4:"نى";s:3:"ﱐ";s:4:"ني";s:3:"ﱑ";s:4:"هج";s:3:"ﱒ";s:4:"هم";s:3:"ﱓ";s:4:"هى";s:3:"ﱔ";s:4:"هي";s:3:"ﱕ";s:4:"يج";s:3:"ﱖ";s:4:"يح";s:3:"ﱗ";s:4:"يخ";s:3:"ﱘ";s:4:"يم";s:3:"ﱙ";s:4:"يى";s:3:"ﱚ";s:4:"يي";s:3:"ﱛ";s:4:"ذٰ";s:3:"ﱜ";s:4:"رٰ";s:3:"ﱝ";s:4:"ىٰ";s:3:"ﱞ";s:5:" ٌّ";s:3:"ﱟ";s:5:" ٍّ";s:3:"ﱠ";s:5:" َّ";s:3:"ﱡ";s:5:" ُّ";s:3:"ﱢ";s:5:" ِّ";s:3:"ﱣ";s:5:" ّٰ";s:3:"ﱤ";s:6:"ئر";s:3:"ﱥ";s:6:"ئز";s:3:"ﱦ";s:6:"ئم";s:3:"ﱧ";s:6:"ئن";s:3:"ﱨ";s:6:"ئى";s:3:"ﱩ";s:6:"ئي";s:3:"ﱪ";s:4:"بر";s:3:"ﱫ";s:4:"بز";s:3:"ﱬ";s:4:"بم";s:3:"ﱭ";s:4:"بن";s:3:"ﱮ";s:4:"بى";s:3:"ﱯ";s:4:"بي";s:3:"ﱰ";s:4:"تر";s:3:"ﱱ";s:4:"تز";s:3:"ﱲ";s:4:"تم";s:3:"ﱳ";s:4:"تن";s:3:"ﱴ";s:4:"تى";s:3:"ﱵ";s:4:"تي";s:3:"ﱶ";s:4:"ثر";s:3:"ﱷ";s:4:"ثز";s:3:"ﱸ";s:4:"ثم";s:3:"ﱹ";s:4:"ثن";s:3:"ﱺ";s:4:"ثى";s:3:"ﱻ";s:4:"ثي";s:3:"ﱼ";s:4:"فى";s:3:"ﱽ";s:4:"في";s:3:"ﱾ";s:4:"قى";s:3:"ﱿ";s:4:"قي";s:3:"ﲀ";s:4:"كا";s:3:"ﲁ";s:4:"كل";s:3:"ﲂ";s:4:"كم";s:3:"ﲃ";s:4:"كى";s:3:"ﲄ";s:4:"كي";s:3:"ﲅ";s:4:"لم";s:3:"ﲆ";s:4:"لى";s:3:"ﲇ";s:4:"لي";s:3:"ﲈ";s:4:"ما";s:3:"ﲉ";s:4:"مم";s:3:"ﲊ";s:4:"نر";s:3:"ﲋ";s:4:"نز";s:3:"ﲌ";s:4:"نم";s:3:"ﲍ";s:4:"نن";s:3:"ﲎ";s:4:"نى";s:3:"ﲏ";s:4:"ني";s:3:"ﲐ";s:4:"ىٰ";s:3:"ﲑ";s:4:"ير";s:3:"ﲒ";s:4:"يز";s:3:"ﲓ";s:4:"يم";s:3:"ﲔ";s:4:"ين";s:3:"ﲕ";s:4:"يى";s:3:"ﲖ";s:4:"يي";s:3:"ﲗ";s:6:"ئج";s:3:"ﲘ";s:6:"ئح";s:3:"ﲙ";s:6:"ئخ";s:3:"ﲚ";s:6:"ئم";s:3:"ﲛ";s:6:"ئه";s:3:"ﲜ";s:4:"بج";s:3:"ﲝ";s:4:"بح";s:3:"ﲞ";s:4:"بخ";s:3:"ﲟ";s:4:"بم";s:3:"ﲠ";s:4:"به";s:3:"ﲡ";s:4:"تج";s:3:"ﲢ";s:4:"تح";s:3:"ﲣ";s:4:"تخ";s:3:"ﲤ";s:4:"تم";s:3:"ﲥ";s:4:"ته";s:3:"ﲦ";s:4:"ثم";s:3:"ﲧ";s:4:"جح";s:3:"ﲨ";s:4:"جم";s:3:"ﲩ";s:4:"حج";s:3:"ﲪ";s:4:"حم";s:3:"ﲫ";s:4:"خج";s:3:"ﲬ";s:4:"خم";s:3:"ﲭ";s:4:"سج";s:3:"ﲮ";s:4:"سح";s:3:"ﲯ";s:4:"سخ";s:3:"ﲰ";s:4:"سم";s:3:"ﲱ";s:4:"صح";s:3:"ﲲ";s:4:"صخ";s:3:"ﲳ";s:4:"صم";s:3:"ﲴ";s:4:"ضج";s:3:"ﲵ";s:4:"ضح";s:3:"ﲶ";s:4:"ضخ";s:3:"ﲷ";s:4:"ضم";s:3:"ﲸ";s:4:"طح";s:3:"ﲹ";s:4:"ظم";s:3:"ﲺ";s:4:"عج";s:3:"ﲻ";s:4:"عم";s:3:"ﲼ";s:4:"غج";s:3:"ﲽ";s:4:"غم";s:3:"ﲾ";s:4:"فج";s:3:"ﲿ";s:4:"فح";s:3:"ﳀ";s:4:"فخ";s:3:"ﳁ";s:4:"فم";s:3:"ﳂ";s:4:"قح";s:3:"ﳃ";s:4:"قم";s:3:"ﳄ";s:4:"كج";s:3:"ﳅ";s:4:"كح";s:3:"ﳆ";s:4:"كخ";s:3:"ﳇ";s:4:"كل";s:3:"ﳈ";s:4:"كم";s:3:"ﳉ";s:4:"لج";s:3:"ﳊ";s:4:"لح";s:3:"ﳋ";s:4:"لخ";s:3:"ﳌ";s:4:"لم";s:3:"ﳍ";s:4:"له";s:3:"ﳎ";s:4:"مج";s:3:"ﳏ";s:4:"مح";s:3:"ﳐ";s:4:"مخ";s:3:"ﳑ";s:4:"مم";s:3:"ﳒ";s:4:"نج";s:3:"ﳓ";s:4:"نح";s:3:"ﳔ";s:4:"نخ";s:3:"ﳕ";s:4:"نم";s:3:"ﳖ";s:4:"نه";s:3:"ﳗ";s:4:"هج";s:3:"ﳘ";s:4:"هم";s:3:"ﳙ";s:4:"هٰ";s:3:"ﳚ";s:4:"يج";s:3:"ﳛ";s:4:"يح";s:3:"ﳜ";s:4:"يخ";s:3:"ﳝ";s:4:"يم";s:3:"ﳞ";s:4:"يه";s:3:"ﳟ";s:6:"ئم";s:3:"ﳠ";s:6:"ئه";s:3:"ﳡ";s:4:"بم";s:3:"ﳢ";s:4:"به";s:3:"ﳣ";s:4:"تم";s:3:"ﳤ";s:4:"ته";s:3:"ﳥ";s:4:"ثم";s:3:"ﳦ";s:4:"ثه";s:3:"ﳧ";s:4:"سم";s:3:"ﳨ";s:4:"سه";s:3:"ﳩ";s:4:"شم";s:3:"ﳪ";s:4:"شه";s:3:"ﳫ";s:4:"كل";s:3:"ﳬ";s:4:"كم";s:3:"ﳭ";s:4:"لم";s:3:"ﳮ";s:4:"نم";s:3:"ﳯ";s:4:"نه";s:3:"ﳰ";s:4:"يم";s:3:"ﳱ";s:4:"يه";s:3:"ﳲ";s:6:"ـَّ";s:3:"ﳳ";s:6:"ـُّ";s:3:"ﳴ";s:6:"ـِّ";s:3:"ﳵ";s:4:"طى";s:3:"ﳶ";s:4:"طي";s:3:"ﳷ";s:4:"عى";s:3:"ﳸ";s:4:"عي";s:3:"ﳹ";s:4:"غى";s:3:"ﳺ";s:4:"غي";s:3:"ﳻ";s:4:"سى";s:3:"ﳼ";s:4:"سي";s:3:"ﳽ";s:4:"شى";s:3:"ﳾ";s:4:"شي";s:3:"ﳿ";s:4:"حى";s:3:"ﴀ";s:4:"حي";s:3:"ﴁ";s:4:"جى";s:3:"ﴂ";s:4:"جي";s:3:"ﴃ";s:4:"خى";s:3:"ﴄ";s:4:"خي";s:3:"ﴅ";s:4:"صى";s:3:"ﴆ";s:4:"صي";s:3:"ﴇ";s:4:"ضى";s:3:"ﴈ";s:4:"ضي";s:3:"ﴉ";s:4:"شج";s:3:"ﴊ";s:4:"شح";s:3:"ﴋ";s:4:"شخ";s:3:"ﴌ";s:4:"شم";s:3:"ﴍ";s:4:"شر";s:3:"ﴎ";s:4:"سر";s:3:"ﴏ";s:4:"صر";s:3:"ﴐ";s:4:"ضر";s:3:"ﴑ";s:4:"طى";s:3:"ﴒ";s:4:"طي";s:3:"ﴓ";s:4:"عى";s:3:"ﴔ";s:4:"عي";s:3:"ﴕ";s:4:"غى";s:3:"ﴖ";s:4:"غي";s:3:"ﴗ";s:4:"سى";s:3:"ﴘ";s:4:"سي";s:3:"ﴙ";s:4:"شى";s:3:"ﴚ";s:4:"شي";s:3:"ﴛ";s:4:"حى";s:3:"ﴜ";s:4:"حي";s:3:"ﴝ";s:4:"جى";s:3:"ﴞ";s:4:"جي";s:3:"ﴟ";s:4:"خى";s:3:"ﴠ";s:4:"خي";s:3:"ﴡ";s:4:"صى";s:3:"ﴢ";s:4:"صي";s:3:"ﴣ";s:4:"ضى";s:3:"ﴤ";s:4:"ضي";s:3:"ﴥ";s:4:"شج";s:3:"ﴦ";s:4:"شح";s:3:"ﴧ";s:4:"شخ";s:3:"ﴨ";s:4:"شم";s:3:"ﴩ";s:4:"شر";s:3:"ﴪ";s:4:"سر";s:3:"ﴫ";s:4:"صر";s:3:"ﴬ";s:4:"ضر";s:3:"ﴭ";s:4:"شج";s:3:"ﴮ";s:4:"شح";s:3:"ﴯ";s:4:"شخ";s:3:"ﴰ";s:4:"شم";s:3:"ﴱ";s:4:"سه";s:3:"ﴲ";s:4:"شه";s:3:"ﴳ";s:4:"طم";s:3:"ﴴ";s:4:"سج";s:3:"ﴵ";s:4:"سح";s:3:"ﴶ";s:4:"سخ";s:3:"ﴷ";s:4:"شج";s:3:"ﴸ";s:4:"شح";s:3:"ﴹ";s:4:"شخ";s:3:"ﴺ";s:4:"طم";s:3:"ﴻ";s:4:"ظم";s:3:"ﴼ";s:4:"اً";s:3:"ﴽ";s:4:"اً";s:3:"ﵐ";s:6:"تجم";s:3:"ﵑ";s:6:"تحج";s:3:"ﵒ";s:6:"تحج";s:3:"ﵓ";s:6:"تحم";s:3:"ﵔ";s:6:"تخم";s:3:"ﵕ";s:6:"تمج";s:3:"ﵖ";s:6:"تمح";s:3:"ﵗ";s:6:"تمخ";s:3:"ﵘ";s:6:"جمح";s:3:"ﵙ";s:6:"جمح";s:3:"ﵚ";s:6:"حمي";s:3:"ﵛ";s:6:"حمى";s:3:"ﵜ";s:6:"سحج";s:3:"ﵝ";s:6:"سجح";s:3:"ﵞ";s:6:"سجى";s:3:"ﵟ";s:6:"سمح";s:3:"ﵠ";s:6:"سمح";s:3:"ﵡ";s:6:"سمج";s:3:"ﵢ";s:6:"سمم";s:3:"ﵣ";s:6:"سمم";s:3:"ﵤ";s:6:"صحح";s:3:"ﵥ";s:6:"صحح";s:3:"ﵦ";s:6:"صمم";s:3:"ﵧ";s:6:"شحم";s:3:"ﵨ";s:6:"شحم";s:3:"ﵩ";s:6:"شجي";s:3:"ﵪ";s:6:"شمخ";s:3:"ﵫ";s:6:"شمخ";s:3:"ﵬ";s:6:"شمم";s:3:"ﵭ";s:6:"شمم";s:3:"ﵮ";s:6:"ضحى";s:3:"ﵯ";s:6:"ضخم";s:3:"ﵰ";s:6:"ضخم";s:3:"ﵱ";s:6:"طمح";s:3:"ﵲ";s:6:"طمح";s:3:"ﵳ";s:6:"طمم";s:3:"ﵴ";s:6:"طمي";s:3:"ﵵ";s:6:"عجم";s:3:"ﵶ";s:6:"عمم";s:3:"ﵷ";s:6:"عمم";s:3:"ﵸ";s:6:"عمى";s:3:"ﵹ";s:6:"غمم";s:3:"ﵺ";s:6:"غمي";s:3:"ﵻ";s:6:"غمى";s:3:"ﵼ";s:6:"فخم";s:3:"ﵽ";s:6:"فخم";s:3:"ﵾ";s:6:"قمح";s:3:"ﵿ";s:6:"قمم";s:3:"ﶀ";s:6:"لحم";s:3:"ﶁ";s:6:"لحي";s:3:"ﶂ";s:6:"لحى";s:3:"ﶃ";s:6:"لجج";s:3:"ﶄ";s:6:"لجج";s:3:"ﶅ";s:6:"لخم";s:3:"ﶆ";s:6:"لخم";s:3:"ﶇ";s:6:"لمح";s:3:"ﶈ";s:6:"لمح";s:3:"ﶉ";s:6:"محج";s:3:"ﶊ";s:6:"محم";s:3:"ﶋ";s:6:"محي";s:3:"ﶌ";s:6:"مجح";s:3:"ﶍ";s:6:"مجم";s:3:"ﶎ";s:6:"مخج";s:3:"ﶏ";s:6:"مخم";s:3:"ﶒ";s:6:"مجخ";s:3:"ﶓ";s:6:"همج";s:3:"ﶔ";s:6:"همم";s:3:"ﶕ";s:6:"نحم";s:3:"ﶖ";s:6:"نحى";s:3:"ﶗ";s:6:"نجم";s:3:"ﶘ";s:6:"نجم";s:3:"ﶙ";s:6:"نجى";s:3:"ﶚ";s:6:"نمي";s:3:"ﶛ";s:6:"نمى";s:3:"ﶜ";s:6:"يمم";s:3:"ﶝ";s:6:"يمم";s:3:"ﶞ";s:6:"بخي";s:3:"ﶟ";s:6:"تجي";s:3:"ﶠ";s:6:"تجى";s:3:"ﶡ";s:6:"تخي";s:3:"ﶢ";s:6:"تخى";s:3:"ﶣ";s:6:"تمي";s:3:"ﶤ";s:6:"تمى";s:3:"ﶥ";s:6:"جمي";s:3:"ﶦ";s:6:"جحى";s:3:"ﶧ";s:6:"جمى";s:3:"ﶨ";s:6:"سخى";s:3:"ﶩ";s:6:"صحي";s:3:"ﶪ";s:6:"شحي";s:3:"ﶫ";s:6:"ضحي";s:3:"ﶬ";s:6:"لجي";s:3:"ﶭ";s:6:"لمي";s:3:"ﶮ";s:6:"يحي";s:3:"ﶯ";s:6:"يجي";s:3:"ﶰ";s:6:"يمي";s:3:"ﶱ";s:6:"ممي";s:3:"ﶲ";s:6:"قمي";s:3:"ﶳ";s:6:"نحي";s:3:"ﶴ";s:6:"قمح";s:3:"ﶵ";s:6:"لحم";s:3:"ﶶ";s:6:"عمي";s:3:"ﶷ";s:6:"كمي";s:3:"ﶸ";s:6:"نجح";s:3:"ﶹ";s:6:"مخي";s:3:"ﶺ";s:6:"لجم";s:3:"ﶻ";s:6:"كمم";s:3:"ﶼ";s:6:"لجم";s:3:"ﶽ";s:6:"نجح";s:3:"ﶾ";s:6:"جحي";s:3:"ﶿ";s:6:"حجي";s:3:"ﷀ";s:6:"مجي";s:3:"ﷁ";s:6:"فمي";s:3:"ﷂ";s:6:"بحي";s:3:"ﷃ";s:6:"كمم";s:3:"ﷄ";s:6:"عجم";s:3:"ﷅ";s:6:"صمم";s:3:"ﷆ";s:6:"سخي";s:3:"ﷇ";s:6:"نجي";s:3:"ﷰ";s:6:"صلے";s:3:"ﷱ";s:6:"قلے";s:3:"ﷲ";s:8:"الله";s:3:"ﷳ";s:8:"اكبر";s:3:"ﷴ";s:8:"محمد";s:3:"ﷵ";s:8:"صلعم";s:3:"ﷶ";s:8:"رسول";s:3:"ﷷ";s:8:"عليه";s:3:"ﷸ";s:8:"وسلم";s:3:"ﷹ";s:6:"صلى";s:3:"ﷺ";s:33:"صلى الله عليه وسلم";s:3:"ﷻ";s:15:"جل جلاله";s:3:"﷼";s:8:"ریال";s:3:"︐";s:1:",";s:3:"︑";s:3:"、";s:3:"︒";s:3:"。";s:3:"︓";s:1:":";s:3:"︔";s:1:";";s:3:"︕";s:1:"!";s:3:"︖";s:1:"?";s:3:"︗";s:3:"〖";s:3:"︘";s:3:"〗";s:3:"︙";s:3:"...";s:3:"︰";s:2:"..";s:3:"︱";s:3:"—";s:3:"︲";s:3:"–";s:3:"︳";s:1:"_";s:3:"︴";s:1:"_";s:3:"︵";s:1:"(";s:3:"︶";s:1:")";s:3:"︷";s:1:"{";s:3:"︸";s:1:"}";s:3:"︹";s:3:"〔";s:3:"︺";s:3:"〕";s:3:"︻";s:3:"【";s:3:"︼";s:3:"】";s:3:"︽";s:3:"《";s:3:"︾";s:3:"》";s:3:"︿";s:3:"〈";s:3:"﹀";s:3:"〉";s:3:"﹁";s:3:"「";s:3:"﹂";s:3:"」";s:3:"﹃";s:3:"『";s:3:"﹄";s:3:"』";s:3:"﹇";s:1:"[";s:3:"﹈";s:1:"]";s:3:"﹉";s:3:" ̅";s:3:"﹊";s:3:" ̅";s:3:"﹋";s:3:" ̅";s:3:"﹌";s:3:" ̅";s:3:"﹍";s:1:"_";s:3:"﹎";s:1:"_";s:3:"﹏";s:1:"_";s:3:"﹐";s:1:",";s:3:"﹑";s:3:"、";s:3:"﹒";s:1:".";s:3:"﹔";s:1:";";s:3:"﹕";s:1:":";s:3:"﹖";s:1:"?";s:3:"﹗";s:1:"!";s:3:"﹘";s:3:"—";s:3:"﹙";s:1:"(";s:3:"﹚";s:1:")";s:3:"﹛";s:1:"{";s:3:"﹜";s:1:"}";s:3:"﹝";s:3:"〔";s:3:"﹞";s:3:"〕";s:3:"﹟";s:1:"#";s:3:"﹠";s:1:"&";s:3:"﹡";s:1:"*";s:3:"﹢";s:1:"+";s:3:"﹣";s:1:"-";s:3:"﹤";s:1:"<";s:3:"﹥";s:1:">";s:3:"﹦";s:1:"=";s:3:"﹨";s:1:"\";s:3:"﹩";s:1:"$";s:3:"﹪";s:1:"%";s:3:"﹫";s:1:"@";s:3:"ﹰ";s:3:" ً";s:3:"ﹱ";s:4:"ـً";s:3:"ﹲ";s:3:" ٌ";s:3:"ﹴ";s:3:" ٍ";s:3:"ﹶ";s:3:" َ";s:3:"ﹷ";s:4:"ـَ";s:3:"ﹸ";s:3:" ُ";s:3:"ﹹ";s:4:"ـُ";s:3:"ﹺ";s:3:" ِ";s:3:"ﹻ";s:4:"ـِ";s:3:"ﹼ";s:3:" ّ";s:3:"ﹽ";s:4:"ـّ";s:3:"ﹾ";s:3:" ْ";s:3:"ﹿ";s:4:"ـْ";s:3:"ﺀ";s:2:"ء";s:3:"ﺁ";s:4:"آ";s:3:"ﺂ";s:4:"آ";s:3:"ﺃ";s:4:"أ";s:3:"ﺄ";s:4:"أ";s:3:"ﺅ";s:4:"ؤ";s:3:"ﺆ";s:4:"ؤ";s:3:"ﺇ";s:4:"إ";s:3:"ﺈ";s:4:"إ";s:3:"ﺉ";s:4:"ئ";s:3:"ﺊ";s:4:"ئ";s:3:"ﺋ";s:4:"ئ";s:3:"ﺌ";s:4:"ئ";s:3:"ﺍ";s:2:"ا";s:3:"ﺎ";s:2:"ا";s:3:"ﺏ";s:2:"ب";s:3:"ﺐ";s:2:"ب";s:3:"ﺑ";s:2:"ب";s:3:"ﺒ";s:2:"ب";s:3:"ﺓ";s:2:"ة";s:3:"ﺔ";s:2:"ة";s:3:"ﺕ";s:2:"ت";s:3:"ﺖ";s:2:"ت";s:3:"ﺗ";s:2:"ت";s:3:"ﺘ";s:2:"ت";s:3:"ﺙ";s:2:"ث";s:3:"ﺚ";s:2:"ث";s:3:"ﺛ";s:2:"ث";s:3:"ﺜ";s:2:"ث";s:3:"ﺝ";s:2:"ج";s:3:"ﺞ";s:2:"ج";s:3:"ﺟ";s:2:"ج";s:3:"ﺠ";s:2:"ج";s:3:"ﺡ";s:2:"ح";s:3:"ﺢ";s:2:"ح";s:3:"ﺣ";s:2:"ح";s:3:"ﺤ";s:2:"ح";s:3:"ﺥ";s:2:"خ";s:3:"ﺦ";s:2:"خ";s:3:"ﺧ";s:2:"خ";s:3:"ﺨ";s:2:"خ";s:3:"ﺩ";s:2:"د";s:3:"ﺪ";s:2:"د";s:3:"ﺫ";s:2:"ذ";s:3:"ﺬ";s:2:"ذ";s:3:"ﺭ";s:2:"ر";s:3:"ﺮ";s:2:"ر";s:3:"ﺯ";s:2:"ز";s:3:"ﺰ";s:2:"ز";s:3:"ﺱ";s:2:"س";s:3:"ﺲ";s:2:"س";s:3:"ﺳ";s:2:"س";s:3:"ﺴ";s:2:"س";s:3:"ﺵ";s:2:"ش";s:3:"ﺶ";s:2:"ش";s:3:"ﺷ";s:2:"ش";s:3:"ﺸ";s:2:"ش";s:3:"ﺹ";s:2:"ص";s:3:"ﺺ";s:2:"ص";s:3:"ﺻ";s:2:"ص";s:3:"ﺼ";s:2:"ص";s:3:"ﺽ";s:2:"ض";s:3:"ﺾ";s:2:"ض";s:3:"ﺿ";s:2:"ض";s:3:"ﻀ";s:2:"ض";s:3:"ﻁ";s:2:"ط";s:3:"ﻂ";s:2:"ط";s:3:"ﻃ";s:2:"ط";s:3:"ﻄ";s:2:"ط";s:3:"ﻅ";s:2:"ظ";s:3:"ﻆ";s:2:"ظ";s:3:"ﻇ";s:2:"ظ";s:3:"ﻈ";s:2:"ظ";s:3:"ﻉ";s:2:"ع";s:3:"ﻊ";s:2:"ع";s:3:"ﻋ";s:2:"ع";s:3:"ﻌ";s:2:"ع";s:3:"ﻍ";s:2:"غ";s:3:"ﻎ";s:2:"غ";s:3:"ﻏ";s:2:"غ";s:3:"ﻐ";s:2:"غ";s:3:"ﻑ";s:2:"ف";s:3:"ﻒ";s:2:"ف";s:3:"ﻓ";s:2:"ف";s:3:"ﻔ";s:2:"ف";s:3:"ﻕ";s:2:"ق";s:3:"ﻖ";s:2:"ق";s:3:"ﻗ";s:2:"ق";s:3:"ﻘ";s:2:"ق";s:3:"ﻙ";s:2:"ك";s:3:"ﻚ";s:2:"ك";s:3:"ﻛ";s:2:"ك";s:3:"ﻜ";s:2:"ك";s:3:"ﻝ";s:2:"ل";s:3:"ﻞ";s:2:"ل";s:3:"ﻟ";s:2:"ل";s:3:"ﻠ";s:2:"ل";s:3:"ﻡ";s:2:"م";s:3:"ﻢ";s:2:"م";s:3:"ﻣ";s:2:"م";s:3:"ﻤ";s:2:"م";s:3:"ﻥ";s:2:"ن";s:3:"ﻦ";s:2:"ن";s:3:"ﻧ";s:2:"ن";s:3:"ﻨ";s:2:"ن";s:3:"ﻩ";s:2:"ه";s:3:"ﻪ";s:2:"ه";s:3:"ﻫ";s:2:"ه";s:3:"ﻬ";s:2:"ه";s:3:"ﻭ";s:2:"و";s:3:"ﻮ";s:2:"و";s:3:"ﻯ";s:2:"ى";s:3:"ﻰ";s:2:"ى";s:3:"ﻱ";s:2:"ي";s:3:"ﻲ";s:2:"ي";s:3:"ﻳ";s:2:"ي";s:3:"ﻴ";s:2:"ي";s:3:"ﻵ";s:6:"لآ";s:3:"ﻶ";s:6:"لآ";s:3:"ﻷ";s:6:"لأ";s:3:"ﻸ";s:6:"لأ";s:3:"ﻹ";s:6:"لإ";s:3:"ﻺ";s:6:"لإ";s:3:"ﻻ";s:4:"لا";s:3:"ﻼ";s:4:"لا";s:3:"！";s:1:"!";s:3:"＂";s:1:""";s:3:"＃";s:1:"#";s:3:"＄";s:1:"$";s:3:"％";s:1:"%";s:3:"＆";s:1:"&";s:3:"＇";s:1:"'";s:3:"（";s:1:"(";s:3:"）";s:1:")";s:3:"＊";s:1:"*";s:3:"＋";s:1:"+";s:3:"，";s:1:",";s:3:"－";s:1:"-";s:3:"．";s:1:".";s:3:"／";s:1:"/";s:3:"０";s:1:"0";s:3:"１";s:1:"1";s:3:"２";s:1:"2";s:3:"３";s:1:"3";s:3:"４";s:1:"4";s:3:"５";s:1:"5";s:3:"６";s:1:"6";s:3:"７";s:1:"7";s:3:"８";s:1:"8";s:3:"９";s:1:"9";s:3:"：";s:1:":";s:3:"；";s:1:";";s:3:"＜";s:1:"<";s:3:"＝";s:1:"=";s:3:"＞";s:1:">";s:3:"？";s:1:"?";s:3:"＠";s:1:"@";s:3:"Ａ";s:1:"A";s:3:"Ｂ";s:1:"B";s:3:"Ｃ";s:1:"C";s:3:"Ｄ";s:1:"D";s:3:"Ｅ";s:1:"E";s:3:"Ｆ";s:1:"F";s:3:"Ｇ";s:1:"G";s:3:"Ｈ";s:1:"H";s:3:"Ｉ";s:1:"I";s:3:"Ｊ";s:1:"J";s:3:"Ｋ";s:1:"K";s:3:"Ｌ";s:1:"L";s:3:"Ｍ";s:1:"M";s:3:"Ｎ";s:1:"N";s:3:"Ｏ";s:1:"O";s:3:"Ｐ";s:1:"P";s:3:"Ｑ";s:1:"Q";s:3:"Ｒ";s:1:"R";s:3:"Ｓ";s:1:"S";s:3:"Ｔ";s:1:"T";s:3:"Ｕ";s:1:"U";s:3:"Ｖ";s:1:"V";s:3:"Ｗ";s:1:"W";s:3:"Ｘ";s:1:"X";s:3:"Ｙ";s:1:"Y";s:3:"Ｚ";s:1:"Z";s:3:"［";s:1:"[";s:3:"＼";s:1:"\";s:3:"］";s:1:"]";s:3:"＾";s:1:"^";s:3:"＿";s:1:"_";s:3:"｀";s:1:"`";s:3:"ａ";s:1:"a";s:3:"ｂ";s:1:"b";s:3:"ｃ";s:1:"c";s:3:"ｄ";s:1:"d";s:3:"ｅ";s:1:"e";s:3:"ｆ";s:1:"f";s:3:"ｇ";s:1:"g";s:3:"ｈ";s:1:"h";s:3:"ｉ";s:1:"i";s:3:"ｊ";s:1:"j";s:3:"ｋ";s:1:"k";s:3:"ｌ";s:1:"l";s:3:"ｍ";s:1:"m";s:3:"ｎ";s:1:"n";s:3:"ｏ";s:1:"o";s:3:"ｐ";s:1:"p";s:3:"ｑ";s:1:"q";s:3:"ｒ";s:1:"r";s:3:"ｓ";s:1:"s";s:3:"ｔ";s:1:"t";s:3:"ｕ";s:1:"u";s:3:"ｖ";s:1:"v";s:3:"ｗ";s:1:"w";s:3:"ｘ";s:1:"x";s:3:"ｙ";s:1:"y";s:3:"ｚ";s:1:"z";s:3:"｛";s:1:"{";s:3:"｜";s:1:"|";s:3:"｝";s:1:"}";s:3:"～";s:1:"~";s:3:"｟";s:3:"⦅";s:3:"｠";s:3:"⦆";s:3:"｡";s:3:"。";s:3:"｢";s:3:"「";s:3:"｣";s:3:"」";s:3:"､";s:3:"、";s:3:"･";s:3:"・";s:3:"ｦ";s:3:"ヲ";s:3:"ｧ";s:3:"ァ";s:3:"ｨ";s:3:"ィ";s:3:"ｩ";s:3:"ゥ";s:3:"ｪ";s:3:"ェ";s:3:"ｫ";s:3:"ォ";s:3:"ｬ";s:3:"ャ";s:3:"ｭ";s:3:"ュ";s:3:"ｮ";s:3:"ョ";s:3:"ｯ";s:3:"ッ";s:3:"ｰ";s:3:"ー";s:3:"ｱ";s:3:"ア";s:3:"ｲ";s:3:"イ";s:3:"ｳ";s:3:"ウ";s:3:"ｴ";s:3:"エ";s:3:"ｵ";s:3:"オ";s:3:"ｶ";s:3:"カ";s:3:"ｷ";s:3:"キ";s:3:"ｸ";s:3:"ク";s:3:"ｹ";s:3:"ケ";s:3:"ｺ";s:3:"コ";s:3:"ｻ";s:3:"サ";s:3:"ｼ";s:3:"シ";s:3:"ｽ";s:3:"ス";s:3:"ｾ";s:3:"セ";s:3:"ｿ";s:3:"ソ";s:3:"ﾀ";s:3:"タ";s:3:"ﾁ";s:3:"チ";s:3:"ﾂ";s:3:"ツ";s:3:"ﾃ";s:3:"テ";s:3:"ﾄ";s:3:"ト";s:3:"ﾅ";s:3:"ナ";s:3:"ﾆ";s:3:"ニ";s:3:"ﾇ";s:3:"ヌ";s:3:"ﾈ";s:3:"ネ";s:3:"ﾉ";s:3:"ノ";s:3:"ﾊ";s:3:"ハ";s:3:"ﾋ";s:3:"ヒ";s:3:"ﾌ";s:3:"フ";s:3:"ﾍ";s:3:"ヘ";s:3:"ﾎ";s:3:"ホ";s:3:"ﾏ";s:3:"マ";s:3:"ﾐ";s:3:"ミ";s:3:"ﾑ";s:3:"ム";s:3:"ﾒ";s:3:"メ";s:3:"ﾓ";s:3:"モ";s:3:"ﾔ";s:3:"ヤ";s:3:"ﾕ";s:3:"ユ";s:3:"ﾖ";s:3:"ヨ";s:3:"ﾗ";s:3:"ラ";s:3:"ﾘ";s:3:"リ";s:3:"ﾙ";s:3:"ル";s:3:"ﾚ";s:3:"レ";s:3:"ﾛ";s:3:"ロ";s:3:"ﾜ";s:3:"ワ";s:3:"ﾝ";s:3:"ン";s:3:"ﾞ";s:3:"゙";s:3:"ﾟ";s:3:"゚";s:3:"ﾠ";s:3:"ᅠ";s:3:"ﾡ";s:3:"ᄀ";s:3:"ﾢ";s:3:"ᄁ";s:3:"ﾣ";s:3:"ᆪ";s:3:"ﾤ";s:3:"ᄂ";s:3:"ﾥ";s:3:"ᆬ";s:3:"ﾦ";s:3:"ᆭ";s:3:"ﾧ";s:3:"ᄃ";s:3:"ﾨ";s:3:"ᄄ";s:3:"ﾩ";s:3:"ᄅ";s:3:"ﾪ";s:3:"ᆰ";s:3:"ﾫ";s:3:"ᆱ";s:3:"ﾬ";s:3:"ᆲ";s:3:"ﾭ";s:3:"ᆳ";s:3:"ﾮ";s:3:"ᆴ";s:3:"ﾯ";s:3:"ᆵ";s:3:"ﾰ";s:3:"ᄚ";s:3:"ﾱ";s:3:"ᄆ";s:3:"ﾲ";s:3:"ᄇ";s:3:"ﾳ";s:3:"ᄈ";s:3:"ﾴ";s:3:"ᄡ";s:3:"ﾵ";s:3:"ᄉ";s:3:"ﾶ";s:3:"ᄊ";s:3:"ﾷ";s:3:"ᄋ";s:3:"ﾸ";s:3:"ᄌ";s:3:"ﾹ";s:3:"ᄍ";s:3:"ﾺ";s:3:"ᄎ";s:3:"ﾻ";s:3:"ᄏ";s:3:"ﾼ";s:3:"ᄐ";s:3:"ﾽ";s:3:"ᄑ";s:3:"ﾾ";s:3:"ᄒ";s:3:"ￂ";s:3:"ᅡ";s:3:"ￃ";s:3:"ᅢ";s:3:"ￄ";s:3:"ᅣ";s:3:"ￅ";s:3:"ᅤ";s:3:"ￆ";s:3:"ᅥ";s:3:"ￇ";s:3:"ᅦ";s:3:"ￊ";s:3:"ᅧ";s:3:"ￋ";s:3:"ᅨ";s:3:"ￌ";s:3:"ᅩ";s:3:"ￍ";s:3:"ᅪ";s:3:"ￎ";s:3:"ᅫ";s:3:"ￏ";s:3:"ᅬ";s:3:"ￒ";s:3:"ᅭ";s:3:"ￓ";s:3:"ᅮ";s:3:"ￔ";s:3:"ᅯ";s:3:"ￕ";s:3:"ᅰ";s:3:"ￖ";s:3:"ᅱ";s:3:"ￗ";s:3:"ᅲ";s:3:"ￚ";s:3:"ᅳ";s:3:"ￛ";s:3:"ᅴ";s:3:"ￜ";s:3:"ᅵ";s:3:"￠";s:2:"¢";s:3:"￡";s:2:"£";s:3:"￢";s:2:"¬";s:3:"￣";s:3:" ̄";s:3:"￤";s:2:"¦";s:3:"￥";s:2:"¥";s:3:"￦";s:3:"₩";s:3:"￨";s:3:"│";s:3:"￩";s:3:"←";s:3:"￪";s:3:"↑";s:3:"￫";s:3:"→";s:3:"￬";s:3:"↓";s:3:"￭";s:3:"■";s:3:"￮";s:3:"○";s:4:"𝐀";s:1:"A";s:4:"𝐁";s:1:"B";s:4:"𝐂";s:1:"C";s:4:"𝐃";s:1:"D";s:4:"𝐄";s:1:"E";s:4:"𝐅";s:1:"F";s:4:"𝐆";s:1:"G";s:4:"𝐇";s:1:"H";s:4:"𝐈";s:1:"I";s:4:"𝐉";s:1:"J";s:4:"𝐊";s:1:"K";s:4:"𝐋";s:1:"L";s:4:"𝐌";s:1:"M";s:4:"𝐍";s:1:"N";s:4:"𝐎";s:1:"O";s:4:"𝐏";s:1:"P";s:4:"𝐐";s:1:"Q";s:4:"𝐑";s:1:"R";s:4:"𝐒";s:1:"S";s:4:"𝐓";s:1:"T";s:4:"𝐔";s:1:"U";s:4:"𝐕";s:1:"V";s:4:"𝐖";s:1:"W";s:4:"𝐗";s:1:"X";s:4:"𝐘";s:1:"Y";s:4:"𝐙";s:1:"Z";s:4:"𝐚";s:1:"a";s:4:"𝐛";s:1:"b";s:4:"𝐜";s:1:"c";s:4:"𝐝";s:1:"d";s:4:"𝐞";s:1:"e";s:4:"𝐟";s:1:"f";s:4:"𝐠";s:1:"g";s:4:"𝐡";s:1:"h";s:4:"𝐢";s:1:"i";s:4:"𝐣";s:1:"j";s:4:"𝐤";s:1:"k";s:4:"𝐥";s:1:"l";s:4:"𝐦";s:1:"m";s:4:"𝐧";s:1:"n";s:4:"𝐨";s:1:"o";s:4:"𝐩";s:1:"p";s:4:"𝐪";s:1:"q";s:4:"𝐫";s:1:"r";s:4:"𝐬";s:1:"s";s:4:"𝐭";s:1:"t";s:4:"𝐮";s:1:"u";s:4:"𝐯";s:1:"v";s:4:"𝐰";s:1:"w";s:4:"𝐱";s:1:"x";s:4:"𝐲";s:1:"y";s:4:"𝐳";s:1:"z";s:4:"𝐴";s:1:"A";s:4:"𝐵";s:1:"B";s:4:"𝐶";s:1:"C";s:4:"𝐷";s:1:"D";s:4:"𝐸";s:1:"E";s:4:"𝐹";s:1:"F";s:4:"𝐺";s:1:"G";s:4:"𝐻";s:1:"H";s:4:"𝐼";s:1:"I";s:4:"𝐽";s:1:"J";s:4:"𝐾";s:1:"K";s:4:"𝐿";s:1:"L";s:4:"𝑀";s:1:"M";s:4:"𝑁";s:1:"N";s:4:"𝑂";s:1:"O";s:4:"𝑃";s:1:"P";s:4:"𝑄";s:1:"Q";s:4:"𝑅";s:1:"R";s:4:"𝑆";s:1:"S";s:4:"𝑇";s:1:"T";s:4:"𝑈";s:1:"U";s:4:"𝑉";s:1:"V";s:4:"𝑊";s:1:"W";s:4:"𝑋";s:1:"X";s:4:"𝑌";s:1:"Y";s:4:"𝑍";s:1:"Z";s:4:"𝑎";s:1:"a";s:4:"𝑏";s:1:"b";s:4:"𝑐";s:1:"c";s:4:"𝑑";s:1:"d";s:4:"𝑒";s:1:"e";s:4:"𝑓";s:1:"f";s:4:"𝑔";s:1:"g";s:4:"𝑖";s:1:"i";s:4:"𝑗";s:1:"j";s:4:"𝑘";s:1:"k";s:4:"𝑙";s:1:"l";s:4:"𝑚";s:1:"m";s:4:"𝑛";s:1:"n";s:4:"𝑜";s:1:"o";s:4:"𝑝";s:1:"p";s:4:"𝑞";s:1:"q";s:4:"𝑟";s:1:"r";s:4:"𝑠";s:1:"s";s:4:"𝑡";s:1:"t";s:4:"𝑢";s:1:"u";s:4:"𝑣";s:1:"v";s:4:"𝑤";s:1:"w";s:4:"𝑥";s:1:"x";s:4:"𝑦";s:1:"y";s:4:"𝑧";s:1:"z";s:4:"𝑨";s:1:"A";s:4:"𝑩";s:1:"B";s:4:"𝑪";s:1:"C";s:4:"𝑫";s:1:"D";s:4:"𝑬";s:1:"E";s:4:"𝑭";s:1:"F";s:4:"𝑮";s:1:"G";s:4:"𝑯";s:1:"H";s:4:"𝑰";s:1:"I";s:4:"𝑱";s:1:"J";s:4:"𝑲";s:1:"K";s:4:"𝑳";s:1:"L";s:4:"𝑴";s:1:"M";s:4:"𝑵";s:1:"N";s:4:"𝑶";s:1:"O";s:4:"𝑷";s:1:"P";s:4:"𝑸";s:1:"Q";s:4:"𝑹";s:1:"R";s:4:"𝑺";s:1:"S";s:4:"𝑻";s:1:"T";s:4:"𝑼";s:1:"U";s:4:"𝑽";s:1:"V";s:4:"𝑾";s:1:"W";s:4:"𝑿";s:1:"X";s:4:"𝒀";s:1:"Y";s:4:"𝒁";s:1:"Z";s:4:"𝒂";s:1:"a";s:4:"𝒃";s:1:"b";s:4:"𝒄";s:1:"c";s:4:"𝒅";s:1:"d";s:4:"𝒆";s:1:"e";s:4:"𝒇";s:1:"f";s:4:"𝒈";s:1:"g";s:4:"𝒉";s:1:"h";s:4:"𝒊";s:1:"i";s:4:"𝒋";s:1:"j";s:4:"𝒌";s:1:"k";s:4:"𝒍";s:1:"l";s:4:"𝒎";s:1:"m";s:4:"𝒏";s:1:"n";s:4:"𝒐";s:1:"o";s:4:"𝒑";s:1:"p";s:4:"𝒒";s:1:"q";s:4:"𝒓";s:1:"r";s:4:"𝒔";s:1:"s";s:4:"𝒕";s:1:"t";s:4:"𝒖";s:1:"u";s:4:"𝒗";s:1:"v";s:4:"𝒘";s:1:"w";s:4:"𝒙";s:1:"x";s:4:"𝒚";s:1:"y";s:4:"𝒛";s:1:"z";s:4:"𝒜";s:1:"A";s:4:"𝒞";s:1:"C";s:4:"𝒟";s:1:"D";s:4:"𝒢";s:1:"G";s:4:"𝒥";s:1:"J";s:4:"𝒦";s:1:"K";s:4:"𝒩";s:1:"N";s:4:"𝒪";s:1:"O";s:4:"𝒫";s:1:"P";s:4:"𝒬";s:1:"Q";s:4:"𝒮";s:1:"S";s:4:"𝒯";s:1:"T";s:4:"𝒰";s:1:"U";s:4:"𝒱";s:1:"V";s:4:"𝒲";s:1:"W";s:4:"𝒳";s:1:"X";s:4:"𝒴";s:1:"Y";s:4:"𝒵";s:1:"Z";s:4:"𝒶";s:1:"a";s:4:"𝒷";s:1:"b";s:4:"𝒸";s:1:"c";s:4:"𝒹";s:1:"d";s:4:"𝒻";s:1:"f";s:4:"𝒽";s:1:"h";s:4:"𝒾";s:1:"i";s:4:"𝒿";s:1:"j";s:4:"𝓀";s:1:"k";s:4:"𝓁";s:1:"l";s:4:"𝓂";s:1:"m";s:4:"𝓃";s:1:"n";s:4:"𝓅";s:1:"p";s:4:"𝓆";s:1:"q";s:4:"𝓇";s:1:"r";s:4:"𝓈";s:1:"s";s:4:"𝓉";s:1:"t";s:4:"𝓊";s:1:"u";s:4:"𝓋";s:1:"v";s:4:"𝓌";s:1:"w";s:4:"𝓍";s:1:"x";s:4:"𝓎";s:1:"y";s:4:"𝓏";s:1:"z";s:4:"𝓐";s:1:"A";s:4:"𝓑";s:1:"B";s:4:"𝓒";s:1:"C";s:4:"𝓓";s:1:"D";s:4:"𝓔";s:1:"E";s:4:"𝓕";s:1:"F";s:4:"𝓖";s:1:"G";s:4:"𝓗";s:1:"H";s:4:"𝓘";s:1:"I";s:4:"𝓙";s:1:"J";s:4:"𝓚";s:1:"K";s:4:"𝓛";s:1:"L";s:4:"𝓜";s:1:"M";s:4:"𝓝";s:1:"N";s:4:"𝓞";s:1:"O";s:4:"𝓟";s:1:"P";s:4:"𝓠";s:1:"Q";s:4:"𝓡";s:1:"R";s:4:"𝓢";s:1:"S";s:4:"𝓣";s:1:"T";s:4:"𝓤";s:1:"U";s:4:"𝓥";s:1:"V";s:4:"𝓦";s:1:"W";s:4:"𝓧";s:1:"X";s:4:"𝓨";s:1:"Y";s:4:"𝓩";s:1:"Z";s:4:"𝓪";s:1:"a";s:4:"𝓫";s:1:"b";s:4:"𝓬";s:1:"c";s:4:"𝓭";s:1:"d";s:4:"𝓮";s:1:"e";s:4:"𝓯";s:1:"f";s:4:"𝓰";s:1:"g";s:4:"𝓱";s:1:"h";s:4:"𝓲";s:1:"i";s:4:"𝓳";s:1:"j";s:4:"𝓴";s:1:"k";s:4:"𝓵";s:1:"l";s:4:"𝓶";s:1:"m";s:4:"𝓷";s:1:"n";s:4:"𝓸";s:1:"o";s:4:"𝓹";s:1:"p";s:4:"𝓺";s:1:"q";s:4:"𝓻";s:1:"r";s:4:"𝓼";s:1:"s";s:4:"𝓽";s:1:"t";s:4:"𝓾";s:1:"u";s:4:"𝓿";s:1:"v";s:4:"𝔀";s:1:"w";s:4:"𝔁";s:1:"x";s:4:"𝔂";s:1:"y";s:4:"𝔃";s:1:"z";s:4:"𝔄";s:1:"A";s:4:"𝔅";s:1:"B";s:4:"𝔇";s:1:"D";s:4:"𝔈";s:1:"E";s:4:"𝔉";s:1:"F";s:4:"𝔊";s:1:"G";s:4:"𝔍";s:1:"J";s:4:"𝔎";s:1:"K";s:4:"𝔏";s:1:"L";s:4:"𝔐";s:1:"M";s:4:"𝔑";s:1:"N";s:4:"𝔒";s:1:"O";s:4:"𝔓";s:1:"P";s:4:"𝔔";s:1:"Q";s:4:"𝔖";s:1:"S";s:4:"𝔗";s:1:"T";s:4:"𝔘";s:1:"U";s:4:"𝔙";s:1:"V";s:4:"𝔚";s:1:"W";s:4:"𝔛";s:1:"X";s:4:"𝔜";s:1:"Y";s:4:"𝔞";s:1:"a";s:4:"𝔟";s:1:"b";s:4:"𝔠";s:1:"c";s:4:"𝔡";s:1:"d";s:4:"𝔢";s:1:"e";s:4:"𝔣";s:1:"f";s:4:"𝔤";s:1:"g";s:4:"𝔥";s:1:"h";s:4:"𝔦";s:1:"i";s:4:"𝔧";s:1:"j";s:4:"𝔨";s:1:"k";s:4:"𝔩";s:1:"l";s:4:"𝔪";s:1:"m";s:4:"𝔫";s:1:"n";s:4:"𝔬";s:1:"o";s:4:"𝔭";s:1:"p";s:4:"𝔮";s:1:"q";s:4:"𝔯";s:1:"r";s:4:"𝔰";s:1:"s";s:4:"𝔱";s:1:"t";s:4:"𝔲";s:1:"u";s:4:"𝔳";s:1:"v";s:4:"𝔴";s:1:"w";s:4:"𝔵";s:1:"x";s:4:"𝔶";s:1:"y";s:4:"𝔷";s:1:"z";s:4:"𝔸";s:1:"A";s:4:"𝔹";s:1:"B";s:4:"𝔻";s:1:"D";s:4:"𝔼";s:1:"E";s:4:"𝔽";s:1:"F";s:4:"𝔾";s:1:"G";s:4:"𝕀";s:1:"I";s:4:"𝕁";s:1:"J";s:4:"𝕂";s:1:"K";s:4:"𝕃";s:1:"L";s:4:"𝕄";s:1:"M";s:4:"𝕆";s:1:"O";s:4:"𝕊";s:1:"S";s:4:"𝕋";s:1:"T";s:4:"𝕌";s:1:"U";s:4:"𝕍";s:1:"V";s:4:"𝕎";s:1:"W";s:4:"𝕏";s:1:"X";s:4:"𝕐";s:1:"Y";s:4:"𝕒";s:1:"a";s:4:"𝕓";s:1:"b";s:4:"𝕔";s:1:"c";s:4:"𝕕";s:1:"d";s:4:"𝕖";s:1:"e";s:4:"𝕗";s:1:"f";s:4:"𝕘";s:1:"g";s:4:"𝕙";s:1:"h";s:4:"𝕚";s:1:"i";s:4:"𝕛";s:1:"j";s:4:"𝕜";s:1:"k";s:4:"𝕝";s:1:"l";s:4:"𝕞";s:1:"m";s:4:"𝕟";s:1:"n";s:4:"𝕠";s:1:"o";s:4:"𝕡";s:1:"p";s:4:"𝕢";s:1:"q";s:4:"𝕣";s:1:"r";s:4:"𝕤";s:1:"s";s:4:"𝕥";s:1:"t";s:4:"𝕦";s:1:"u";s:4:"𝕧";s:1:"v";s:4:"𝕨";s:1:"w";s:4:"𝕩";s:1:"x";s:4:"𝕪";s:1:"y";s:4:"𝕫";s:1:"z";s:4:"𝕬";s:1:"A";s:4:"𝕭";s:1:"B";s:4:"𝕮";s:1:"C";s:4:"𝕯";s:1:"D";s:4:"𝕰";s:1:"E";s:4:"𝕱";s:1:"F";s:4:"𝕲";s:1:"G";s:4:"𝕳";s:1:"H";s:4:"𝕴";s:1:"I";s:4:"𝕵";s:1:"J";s:4:"𝕶";s:1:"K";s:4:"𝕷";s:1:"L";s:4:"𝕸";s:1:"M";s:4:"𝕹";s:1:"N";s:4:"𝕺";s:1:"O";s:4:"𝕻";s:1:"P";s:4:"𝕼";s:1:"Q";s:4:"𝕽";s:1:"R";s:4:"𝕾";s:1:"S";s:4:"𝕿";s:1:"T";s:4:"𝖀";s:1:"U";s:4:"𝖁";s:1:"V";s:4:"𝖂";s:1:"W";s:4:"𝖃";s:1:"X";s:4:"𝖄";s:1:"Y";s:4:"𝖅";s:1:"Z";s:4:"𝖆";s:1:"a";s:4:"𝖇";s:1:"b";s:4:"𝖈";s:1:"c";s:4:"𝖉";s:1:"d";s:4:"𝖊";s:1:"e";s:4:"𝖋";s:1:"f";s:4:"𝖌";s:1:"g";s:4:"𝖍";s:1:"h";s:4:"𝖎";s:1:"i";s:4:"𝖏";s:1:"j";s:4:"𝖐";s:1:"k";s:4:"𝖑";s:1:"l";s:4:"𝖒";s:1:"m";s:4:"𝖓";s:1:"n";s:4:"𝖔";s:1:"o";s:4:"𝖕";s:1:"p";s:4:"𝖖";s:1:"q";s:4:"𝖗";s:1:"r";s:4:"𝖘";s:1:"s";s:4:"𝖙";s:1:"t";s:4:"𝖚";s:1:"u";s:4:"𝖛";s:1:"v";s:4:"𝖜";s:1:"w";s:4:"𝖝";s:1:"x";s:4:"𝖞";s:1:"y";s:4:"𝖟";s:1:"z";s:4:"𝖠";s:1:"A";s:4:"𝖡";s:1:"B";s:4:"𝖢";s:1:"C";s:4:"𝖣";s:1:"D";s:4:"𝖤";s:1:"E";s:4:"𝖥";s:1:"F";s:4:"𝖦";s:1:"G";s:4:"𝖧";s:1:"H";s:4:"𝖨";s:1:"I";s:4:"𝖩";s:1:"J";s:4:"𝖪";s:1:"K";s:4:"𝖫";s:1:"L";s:4:"𝖬";s:1:"M";s:4:"𝖭";s:1:"N";s:4:"𝖮";s:1:"O";s:4:"𝖯";s:1:"P";s:4:"𝖰";s:1:"Q";s:4:"𝖱";s:1:"R";s:4:"𝖲";s:1:"S";s:4:"𝖳";s:1:"T";s:4:"𝖴";s:1:"U";s:4:"𝖵";s:1:"V";s:4:"𝖶";s:1:"W";s:4:"𝖷";s:1:"X";s:4:"𝖸";s:1:"Y";s:4:"𝖹";s:1:"Z";s:4:"𝖺";s:1:"a";s:4:"𝖻";s:1:"b";s:4:"𝖼";s:1:"c";s:4:"𝖽";s:1:"d";s:4:"𝖾";s:1:"e";s:4:"𝖿";s:1:"f";s:4:"𝗀";s:1:"g";s:4:"𝗁";s:1:"h";s:4:"𝗂";s:1:"i";s:4:"𝗃";s:1:"j";s:4:"𝗄";s:1:"k";s:4:"𝗅";s:1:"l";s:4:"𝗆";s:1:"m";s:4:"𝗇";s:1:"n";s:4:"𝗈";s:1:"o";s:4:"𝗉";s:1:"p";s:4:"𝗊";s:1:"q";s:4:"𝗋";s:1:"r";s:4:"𝗌";s:1:"s";s:4:"𝗍";s:1:"t";s:4:"𝗎";s:1:"u";s:4:"𝗏";s:1:"v";s:4:"𝗐";s:1:"w";s:4:"𝗑";s:1:"x";s:4:"𝗒";s:1:"y";s:4:"𝗓";s:1:"z";s:4:"𝗔";s:1:"A";s:4:"𝗕";s:1:"B";s:4:"𝗖";s:1:"C";s:4:"𝗗";s:1:"D";s:4:"𝗘";s:1:"E";s:4:"𝗙";s:1:"F";s:4:"𝗚";s:1:"G";s:4:"𝗛";s:1:"H";s:4:"𝗜";s:1:"I";s:4:"𝗝";s:1:"J";s:4:"𝗞";s:1:"K";s:4:"𝗟";s:1:"L";s:4:"𝗠";s:1:"M";s:4:"𝗡";s:1:"N";s:4:"𝗢";s:1:"O";s:4:"𝗣";s:1:"P";s:4:"𝗤";s:1:"Q";s:4:"𝗥";s:1:"R";s:4:"𝗦";s:1:"S";s:4:"𝗧";s:1:"T";s:4:"𝗨";s:1:"U";s:4:"𝗩";s:1:"V";s:4:"𝗪";s:1:"W";s:4:"𝗫";s:1:"X";s:4:"𝗬";s:1:"Y";s:4:"𝗭";s:1:"Z";s:4:"𝗮";s:1:"a";s:4:"𝗯";s:1:"b";s:4:"𝗰";s:1:"c";s:4:"𝗱";s:1:"d";s:4:"𝗲";s:1:"e";s:4:"𝗳";s:1:"f";s:4:"𝗴";s:1:"g";s:4:"𝗵";s:1:"h";s:4:"𝗶";s:1:"i";s:4:"𝗷";s:1:"j";s:4:"𝗸";s:1:"k";s:4:"𝗹";s:1:"l";s:4:"𝗺";s:1:"m";s:4:"𝗻";s:1:"n";s:4:"𝗼";s:1:"o";s:4:"𝗽";s:1:"p";s:4:"𝗾";s:1:"q";s:4:"𝗿";s:1:"r";s:4:"𝘀";s:1:"s";s:4:"𝘁";s:1:"t";s:4:"𝘂";s:1:"u";s:4:"𝘃";s:1:"v";s:4:"𝘄";s:1:"w";s:4:"𝘅";s:1:"x";s:4:"𝘆";s:1:"y";s:4:"𝘇";s:1:"z";s:4:"𝘈";s:1:"A";s:4:"𝘉";s:1:"B";s:4:"𝘊";s:1:"C";s:4:"𝘋";s:1:"D";s:4:"𝘌";s:1:"E";s:4:"𝘍";s:1:"F";s:4:"𝘎";s:1:"G";s:4:"𝘏";s:1:"H";s:4:"𝘐";s:1:"I";s:4:"𝘑";s:1:"J";s:4:"𝘒";s:1:"K";s:4:"𝘓";s:1:"L";s:4:"𝘔";s:1:"M";s:4:"𝘕";s:1:"N";s:4:"𝘖";s:1:"O";s:4:"𝘗";s:1:"P";s:4:"𝘘";s:1:"Q";s:4:"𝘙";s:1:"R";s:4:"𝘚";s:1:"S";s:4:"𝘛";s:1:"T";s:4:"𝘜";s:1:"U";s:4:"𝘝";s:1:"V";s:4:"𝘞";s:1:"W";s:4:"𝘟";s:1:"X";s:4:"𝘠";s:1:"Y";s:4:"𝘡";s:1:"Z";s:4:"𝘢";s:1:"a";s:4:"𝘣";s:1:"b";s:4:"𝘤";s:1:"c";s:4:"𝘥";s:1:"d";s:4:"𝘦";s:1:"e";s:4:"𝘧";s:1:"f";s:4:"𝘨";s:1:"g";s:4:"𝘩";s:1:"h";s:4:"𝘪";s:1:"i";s:4:"𝘫";s:1:"j";s:4:"𝘬";s:1:"k";s:4:"𝘭";s:1:"l";s:4:"𝘮";s:1:"m";s:4:"𝘯";s:1:"n";s:4:"𝘰";s:1:"o";s:4:"𝘱";s:1:"p";s:4:"𝘲";s:1:"q";s:4:"𝘳";s:1:"r";s:4:"𝘴";s:1:"s";s:4:"𝘵";s:1:"t";s:4:"𝘶";s:1:"u";s:4:"𝘷";s:1:"v";s:4:"𝘸";s:1:"w";s:4:"𝘹";s:1:"x";s:4:"𝘺";s:1:"y";s:4:"𝘻";s:1:"z";s:4:"𝘼";s:1:"A";s:4:"𝘽";s:1:"B";s:4:"𝘾";s:1:"C";s:4:"𝘿";s:1:"D";s:4:"𝙀";s:1:"E";s:4:"𝙁";s:1:"F";s:4:"𝙂";s:1:"G";s:4:"𝙃";s:1:"H";s:4:"𝙄";s:1:"I";s:4:"𝙅";s:1:"J";s:4:"𝙆";s:1:"K";s:4:"𝙇";s:1:"L";s:4:"𝙈";s:1:"M";s:4:"𝙉";s:1:"N";s:4:"𝙊";s:1:"O";s:4:"𝙋";s:1:"P";s:4:"𝙌";s:1:"Q";s:4:"𝙍";s:1:"R";s:4:"𝙎";s:1:"S";s:4:"𝙏";s:1:"T";s:4:"𝙐";s:1:"U";s:4:"𝙑";s:1:"V";s:4:"𝙒";s:1:"W";s:4:"𝙓";s:1:"X";s:4:"𝙔";s:1:"Y";s:4:"𝙕";s:1:"Z";s:4:"𝙖";s:1:"a";s:4:"𝙗";s:1:"b";s:4:"𝙘";s:1:"c";s:4:"𝙙";s:1:"d";s:4:"𝙚";s:1:"e";s:4:"𝙛";s:1:"f";s:4:"𝙜";s:1:"g";s:4:"𝙝";s:1:"h";s:4:"𝙞";s:1:"i";s:4:"𝙟";s:1:"j";s:4:"𝙠";s:1:"k";s:4:"𝙡";s:1:"l";s:4:"𝙢";s:1:"m";s:4:"𝙣";s:1:"n";s:4:"𝙤";s:1:"o";s:4:"𝙥";s:1:"p";s:4:"𝙦";s:1:"q";s:4:"𝙧";s:1:"r";s:4:"𝙨";s:1:"s";s:4:"𝙩";s:1:"t";s:4:"𝙪";s:1:"u";s:4:"𝙫";s:1:"v";s:4:"𝙬";s:1:"w";s:4:"𝙭";s:1:"x";s:4:"𝙮";s:1:"y";s:4:"𝙯";s:1:"z";s:4:"𝙰";s:1:"A";s:4:"𝙱";s:1:"B";s:4:"𝙲";s:1:"C";s:4:"𝙳";s:1:"D";s:4:"𝙴";s:1:"E";s:4:"𝙵";s:1:"F";s:4:"𝙶";s:1:"G";s:4:"𝙷";s:1:"H";s:4:"𝙸";s:1:"I";s:4:"𝙹";s:1:"J";s:4:"𝙺";s:1:"K";s:4:"𝙻";s:1:"L";s:4:"𝙼";s:1:"M";s:4:"𝙽";s:1:"N";s:4:"𝙾";s:1:"O";s:4:"𝙿";s:1:"P";s:4:"𝚀";s:1:"Q";s:4:"𝚁";s:1:"R";s:4:"𝚂";s:1:"S";s:4:"𝚃";s:1:"T";s:4:"𝚄";s:1:"U";s:4:"𝚅";s:1:"V";s:4:"𝚆";s:1:"W";s:4:"𝚇";s:1:"X";s:4:"𝚈";s:1:"Y";s:4:"𝚉";s:1:"Z";s:4:"𝚊";s:1:"a";s:4:"𝚋";s:1:"b";s:4:"𝚌";s:1:"c";s:4:"𝚍";s:1:"d";s:4:"𝚎";s:1:"e";s:4:"𝚏";s:1:"f";s:4:"𝚐";s:1:"g";s:4:"𝚑";s:1:"h";s:4:"𝚒";s:1:"i";s:4:"𝚓";s:1:"j";s:4:"𝚔";s:1:"k";s:4:"𝚕";s:1:"l";s:4:"𝚖";s:1:"m";s:4:"𝚗";s:1:"n";s:4:"𝚘";s:1:"o";s:4:"𝚙";s:1:"p";s:4:"𝚚";s:1:"q";s:4:"𝚛";s:1:"r";s:4:"𝚜";s:1:"s";s:4:"𝚝";s:1:"t";s:4:"𝚞";s:1:"u";s:4:"𝚟";s:1:"v";s:4:"𝚠";s:1:"w";s:4:"𝚡";s:1:"x";s:4:"𝚢";s:1:"y";s:4:"𝚣";s:1:"z";s:4:"𝚤";s:2:"ı";s:4:"𝚥";s:2:"ȷ";s:4:"𝚨";s:2:"Α";s:4:"𝚩";s:2:"Β";s:4:"𝚪";s:2:"Γ";s:4:"𝚫";s:2:"Δ";s:4:"𝚬";s:2:"Ε";s:4:"𝚭";s:2:"Ζ";s:4:"𝚮";s:2:"Η";s:4:"𝚯";s:2:"Θ";s:4:"𝚰";s:2:"Ι";s:4:"𝚱";s:2:"Κ";s:4:"𝚲";s:2:"Λ";s:4:"𝚳";s:2:"Μ";s:4:"𝚴";s:2:"Ν";s:4:"𝚵";s:2:"Ξ";s:4:"𝚶";s:2:"Ο";s:4:"𝚷";s:2:"Π";s:4:"𝚸";s:2:"Ρ";s:4:"𝚹";s:2:"Θ";s:4:"𝚺";s:2:"Σ";s:4:"𝚻";s:2:"Τ";s:4:"𝚼";s:2:"Υ";s:4:"𝚽";s:2:"Φ";s:4:"𝚾";s:2:"Χ";s:4:"𝚿";s:2:"Ψ";s:4:"𝛀";s:2:"Ω";s:4:"𝛁";s:3:"∇";s:4:"𝛂";s:2:"α";s:4:"𝛃";s:2:"β";s:4:"𝛄";s:2:"γ";s:4:"𝛅";s:2:"δ";s:4:"𝛆";s:2:"ε";s:4:"𝛇";s:2:"ζ";s:4:"𝛈";s:2:"η";s:4:"𝛉";s:2:"θ";s:4:"𝛊";s:2:"ι";s:4:"𝛋";s:2:"κ";s:4:"𝛌";s:2:"λ";s:4:"𝛍";s:2:"μ";s:4:"𝛎";s:2:"ν";s:4:"𝛏";s:2:"ξ";s:4:"𝛐";s:2:"ο";s:4:"𝛑";s:2:"π";s:4:"𝛒";s:2:"ρ";s:4:"𝛓";s:2:"ς";s:4:"𝛔";s:2:"σ";s:4:"𝛕";s:2:"τ";s:4:"𝛖";s:2:"υ";s:4:"𝛗";s:2:"φ";s:4:"𝛘";s:2:"χ";s:4:"𝛙";s:2:"ψ";s:4:"𝛚";s:2:"ω";s:4:"𝛛";s:3:"∂";s:4:"𝛜";s:2:"ε";s:4:"𝛝";s:2:"θ";s:4:"𝛞";s:2:"κ";s:4:"𝛟";s:2:"φ";s:4:"𝛠";s:2:"ρ";s:4:"𝛡";s:2:"π";s:4:"𝛢";s:2:"Α";s:4:"𝛣";s:2:"Β";s:4:"𝛤";s:2:"Γ";s:4:"𝛥";s:2:"Δ";s:4:"𝛦";s:2:"Ε";s:4:"𝛧";s:2:"Ζ";s:4:"𝛨";s:2:"Η";s:4:"𝛩";s:2:"Θ";s:4:"𝛪";s:2:"Ι";s:4:"𝛫";s:2:"Κ";s:4:"𝛬";s:2:"Λ";s:4:"𝛭";s:2:"Μ";s:4:"𝛮";s:2:"Ν";s:4:"𝛯";s:2:"Ξ";s:4:"𝛰";s:2:"Ο";s:4:"𝛱";s:2:"Π";s:4:"𝛲";s:2:"Ρ";s:4:"𝛳";s:2:"Θ";s:4:"𝛴";s:2:"Σ";s:4:"𝛵";s:2:"Τ";s:4:"𝛶";s:2:"Υ";s:4:"𝛷";s:2:"Φ";s:4:"𝛸";s:2:"Χ";s:4:"𝛹";s:2:"Ψ";s:4:"𝛺";s:2:"Ω";s:4:"𝛻";s:3:"∇";s:4:"𝛼";s:2:"α";s:4:"𝛽";s:2:"β";s:4:"𝛾";s:2:"γ";s:4:"𝛿";s:2:"δ";s:4:"𝜀";s:2:"ε";s:4:"𝜁";s:2:"ζ";s:4:"𝜂";s:2:"η";s:4:"𝜃";s:2:"θ";s:4:"𝜄";s:2:"ι";s:4:"𝜅";s:2:"κ";s:4:"𝜆";s:2:"λ";s:4:"𝜇";s:2:"μ";s:4:"𝜈";s:2:"ν";s:4:"𝜉";s:2:"ξ";s:4:"𝜊";s:2:"ο";s:4:"𝜋";s:2:"π";s:4:"𝜌";s:2:"ρ";s:4:"𝜍";s:2:"ς";s:4:"𝜎";s:2:"σ";s:4:"𝜏";s:2:"τ";s:4:"𝜐";s:2:"υ";s:4:"𝜑";s:2:"φ";s:4:"𝜒";s:2:"χ";s:4:"𝜓";s:2:"ψ";s:4:"𝜔";s:2:"ω";s:4:"𝜕";s:3:"∂";s:4:"𝜖";s:2:"ε";s:4:"𝜗";s:2:"θ";s:4:"𝜘";s:2:"κ";s:4:"𝜙";s:2:"φ";s:4:"𝜚";s:2:"ρ";s:4:"𝜛";s:2:"π";s:4:"𝜜";s:2:"Α";s:4:"𝜝";s:2:"Β";s:4:"𝜞";s:2:"Γ";s:4:"𝜟";s:2:"Δ";s:4:"𝜠";s:2:"Ε";s:4:"𝜡";s:2:"Ζ";s:4:"𝜢";s:2:"Η";s:4:"𝜣";s:2:"Θ";s:4:"𝜤";s:2:"Ι";s:4:"𝜥";s:2:"Κ";s:4:"𝜦";s:2:"Λ";s:4:"𝜧";s:2:"Μ";s:4:"𝜨";s:2:"Ν";s:4:"𝜩";s:2:"Ξ";s:4:"𝜪";s:2:"Ο";s:4:"𝜫";s:2:"Π";s:4:"𝜬";s:2:"Ρ";s:4:"𝜭";s:2:"Θ";s:4:"𝜮";s:2:"Σ";s:4:"𝜯";s:2:"Τ";s:4:"𝜰";s:2:"Υ";s:4:"𝜱";s:2:"Φ";s:4:"𝜲";s:2:"Χ";s:4:"𝜳";s:2:"Ψ";s:4:"𝜴";s:2:"Ω";s:4:"𝜵";s:3:"∇";s:4:"𝜶";s:2:"α";s:4:"𝜷";s:2:"β";s:4:"𝜸";s:2:"γ";s:4:"𝜹";s:2:"δ";s:4:"𝜺";s:2:"ε";s:4:"𝜻";s:2:"ζ";s:4:"𝜼";s:2:"η";s:4:"𝜽";s:2:"θ";s:4:"𝜾";s:2:"ι";s:4:"𝜿";s:2:"κ";s:4:"𝝀";s:2:"λ";s:4:"𝝁";s:2:"μ";s:4:"𝝂";s:2:"ν";s:4:"𝝃";s:2:"ξ";s:4:"𝝄";s:2:"ο";s:4:"𝝅";s:2:"π";s:4:"𝝆";s:2:"ρ";s:4:"𝝇";s:2:"ς";s:4:"𝝈";s:2:"σ";s:4:"𝝉";s:2:"τ";s:4:"𝝊";s:2:"υ";s:4:"𝝋";s:2:"φ";s:4:"𝝌";s:2:"χ";s:4:"𝝍";s:2:"ψ";s:4:"𝝎";s:2:"ω";s:4:"𝝏";s:3:"∂";s:4:"𝝐";s:2:"ε";s:4:"𝝑";s:2:"θ";s:4:"𝝒";s:2:"κ";s:4:"𝝓";s:2:"φ";s:4:"𝝔";s:2:"ρ";s:4:"𝝕";s:2:"π";s:4:"𝝖";s:2:"Α";s:4:"𝝗";s:2:"Β";s:4:"𝝘";s:2:"Γ";s:4:"𝝙";s:2:"Δ";s:4:"𝝚";s:2:"Ε";s:4:"𝝛";s:2:"Ζ";s:4:"𝝜";s:2:"Η";s:4:"𝝝";s:2:"Θ";s:4:"𝝞";s:2:"Ι";s:4:"𝝟";s:2:"Κ";s:4:"𝝠";s:2:"Λ";s:4:"𝝡";s:2:"Μ";s:4:"𝝢";s:2:"Ν";s:4:"𝝣";s:2:"Ξ";s:4:"𝝤";s:2:"Ο";s:4:"𝝥";s:2:"Π";s:4:"𝝦";s:2:"Ρ";s:4:"𝝧";s:2:"Θ";s:4:"𝝨";s:2:"Σ";s:4:"𝝩";s:2:"Τ";s:4:"𝝪";s:2:"Υ";s:4:"𝝫";s:2:"Φ";s:4:"𝝬";s:2:"Χ";s:4:"𝝭";s:2:"Ψ";s:4:"𝝮";s:2:"Ω";s:4:"𝝯";s:3:"∇";s:4:"𝝰";s:2:"α";s:4:"𝝱";s:2:"β";s:4:"𝝲";s:2:"γ";s:4:"𝝳";s:2:"δ";s:4:"𝝴";s:2:"ε";s:4:"𝝵";s:2:"ζ";s:4:"𝝶";s:2:"η";s:4:"𝝷";s:2:"θ";s:4:"𝝸";s:2:"ι";s:4:"𝝹";s:2:"κ";s:4:"𝝺";s:2:"λ";s:4:"𝝻";s:2:"μ";s:4:"𝝼";s:2:"ν";s:4:"𝝽";s:2:"ξ";s:4:"𝝾";s:2:"ο";s:4:"𝝿";s:2:"π";s:4:"𝞀";s:2:"ρ";s:4:"𝞁";s:2:"ς";s:4:"𝞂";s:2:"σ";s:4:"𝞃";s:2:"τ";s:4:"𝞄";s:2:"υ";s:4:"𝞅";s:2:"φ";s:4:"𝞆";s:2:"χ";s:4:"𝞇";s:2:"ψ";s:4:"𝞈";s:2:"ω";s:4:"𝞉";s:3:"∂";s:4:"𝞊";s:2:"ε";s:4:"𝞋";s:2:"θ";s:4:"𝞌";s:2:"κ";s:4:"𝞍";s:2:"φ";s:4:"𝞎";s:2:"ρ";s:4:"𝞏";s:2:"π";s:4:"𝞐";s:2:"Α";s:4:"𝞑";s:2:"Β";s:4:"𝞒";s:2:"Γ";s:4:"𝞓";s:2:"Δ";s:4:"𝞔";s:2:"Ε";s:4:"𝞕";s:2:"Ζ";s:4:"𝞖";s:2:"Η";s:4:"𝞗";s:2:"Θ";s:4:"𝞘";s:2:"Ι";s:4:"𝞙";s:2:"Κ";s:4:"𝞚";s:2:"Λ";s:4:"𝞛";s:2:"Μ";s:4:"𝞜";s:2:"Ν";s:4:"𝞝";s:2:"Ξ";s:4:"𝞞";s:2:"Ο";s:4:"𝞟";s:2:"Π";s:4:"𝞠";s:2:"Ρ";s:4:"𝞡";s:2:"Θ";s:4:"𝞢";s:2:"Σ";s:4:"𝞣";s:2:"Τ";s:4:"𝞤";s:2:"Υ";s:4:"𝞥";s:2:"Φ";s:4:"𝞦";s:2:"Χ";s:4:"𝞧";s:2:"Ψ";s:4:"𝞨";s:2:"Ω";s:4:"𝞩";s:3:"∇";s:4:"𝞪";s:2:"α";s:4:"𝞫";s:2:"β";s:4:"𝞬";s:2:"γ";s:4:"𝞭";s:2:"δ";s:4:"𝞮";s:2:"ε";s:4:"𝞯";s:2:"ζ";s:4:"𝞰";s:2:"η";s:4:"𝞱";s:2:"θ";s:4:"𝞲";s:2:"ι";s:4:"𝞳";s:2:"κ";s:4:"𝞴";s:2:"λ";s:4:"𝞵";s:2:"μ";s:4:"𝞶";s:2:"ν";s:4:"𝞷";s:2:"ξ";s:4:"𝞸";s:2:"ο";s:4:"𝞹";s:2:"π";s:4:"𝞺";s:2:"ρ";s:4:"𝞻";s:2:"ς";s:4:"𝞼";s:2:"σ";s:4:"𝞽";s:2:"τ";s:4:"𝞾";s:2:"υ";s:4:"𝞿";s:2:"φ";s:4:"𝟀";s:2:"χ";s:4:"𝟁";s:2:"ψ";s:4:"𝟂";s:2:"ω";s:4:"𝟃";s:3:"∂";s:4:"𝟄";s:2:"ε";s:4:"𝟅";s:2:"θ";s:4:"𝟆";s:2:"κ";s:4:"𝟇";s:2:"φ";s:4:"𝟈";s:2:"ρ";s:4:"𝟉";s:2:"π";s:4:"𝟊";s:2:"Ϝ";s:4:"𝟋";s:2:"ϝ";s:4:"𝟎";s:1:"0";s:4:"𝟏";s:1:"1";s:4:"𝟐";s:1:"2";s:4:"𝟑";s:1:"3";s:4:"𝟒";s:1:"4";s:4:"𝟓";s:1:"5";s:4:"𝟔";s:1:"6";s:4:"𝟕";s:1:"7";s:4:"𝟖";s:1:"8";s:4:"𝟗";s:1:"9";s:4:"𝟘";s:1:"0";s:4:"𝟙";s:1:"1";s:4:"𝟚";s:1:"2";s:4:"𝟛";s:1:"3";s:4:"𝟜";s:1:"4";s:4:"𝟝";s:1:"5";s:4:"𝟞";s:1:"6";s:4:"𝟟";s:1:"7";s:4:"𝟠";s:1:"8";s:4:"𝟡";s:1:"9";s:4:"𝟢";s:1:"0";s:4:"𝟣";s:1:"1";s:4:"𝟤";s:1:"2";s:4:"𝟥";s:1:"3";s:4:"𝟦";s:1:"4";s:4:"𝟧";s:1:"5";s:4:"𝟨";s:1:"6";s:4:"𝟩";s:1:"7";s:4:"𝟪";s:1:"8";s:4:"𝟫";s:1:"9";s:4:"𝟬";s:1:"0";s:4:"𝟭";s:1:"1";s:4:"𝟮";s:1:"2";s:4:"𝟯";s:1:"3";s:4:"𝟰";s:1:"4";s:4:"𝟱";s:1:"5";s:4:"𝟲";s:1:"6";s:4:"𝟳";s:1:"7";s:4:"𝟴";s:1:"8";s:4:"𝟵";s:1:"9";s:4:"𝟶";s:1:"0";s:4:"𝟷";s:1:"1";s:4:"𝟸";s:1:"2";s:4:"𝟹";s:1:"3";s:4:"𝟺";s:1:"4";s:4:"𝟻";s:1:"5";s:4:"𝟼";s:1:"6";s:4:"𝟽";s:1:"7";s:4:"𝟾";s:1:"8";s:4:"𝟿";s:1:"9";s:4:"𞸀";s:2:"ا";s:4:"𞸁";s:2:"ب";s:4:"𞸂";s:2:"ج";s:4:"𞸃";s:2:"د";s:4:"𞸅";s:2:"و";s:4:"𞸆";s:2:"ز";s:4:"𞸇";s:2:"ح";s:4:"𞸈";s:2:"ط";s:4:"𞸉";s:2:"ي";s:4:"𞸊";s:2:"ك";s:4:"𞸋";s:2:"ل";s:4:"𞸌";s:2:"م";s:4:"𞸍";s:2:"ن";s:4:"𞸎";s:2:"س";s:4:"𞸏";s:2:"ع";s:4:"𞸐";s:2:"ف";s:4:"𞸑";s:2:"ص";s:4:"𞸒";s:2:"ق";s:4:"𞸓";s:2:"ر";s:4:"𞸔";s:2:"ش";s:4:"𞸕";s:2:"ت";s:4:"𞸖";s:2:"ث";s:4:"𞸗";s:2:"خ";s:4:"𞸘";s:2:"ذ";s:4:"𞸙";s:2:"ض";s:4:"𞸚";s:2:"ظ";s:4:"𞸛";s:2:"غ";s:4:"𞸜";s:2:"ٮ";s:4:"𞸝";s:2:"ں";s:4:"𞸞";s:2:"ڡ";s:4:"𞸟";s:2:"ٯ";s:4:"𞸡";s:2:"ب";s:4:"𞸢";s:2:"ج";s:4:"𞸤";s:2:"ه";s:4:"𞸧";s:2:"ح";s:4:"𞸩";s:2:"ي";s:4:"𞸪";s:2:"ك";s:4:"𞸫";s:2:"ل";s:4:"𞸬";s:2:"م";s:4:"𞸭";s:2:"ن";s:4:"𞸮";s:2:"س";s:4:"𞸯";s:2:"ع";s:4:"𞸰";s:2:"ف";s:4:"𞸱";s:2:"ص";s:4:"𞸲";s:2:"ق";s:4:"𞸴";s:2:"ش";s:4:"𞸵";s:2:"ت";s:4:"𞸶";s:2:"ث";s:4:"𞸷";s:2:"خ";s:4:"𞸹";s:2:"ض";s:4:"𞸻";s:2:"غ";s:4:"𞹂";s:2:"ج";s:4:"𞹇";s:2:"ح";s:4:"𞹉";s:2:"ي";s:4:"𞹋";s:2:"ل";s:4:"𞹍";s:2:"ن";s:4:"𞹎";s:2:"س";s:4:"𞹏";s:2:"ع";s:4:"𞹑";s:2:"ص";s:4:"𞹒";s:2:"ق";s:4:"𞹔";s:2:"ش";s:4:"𞹗";s:2:"خ";s:4:"𞹙";s:2:"ض";s:4:"𞹛";s:2:"غ";s:4:"𞹝";s:2:"ں";s:4:"𞹟";s:2:"ٯ";s:4:"𞹡";s:2:"ب";s:4:"𞹢";s:2:"ج";s:4:"𞹤";s:2:"ه";s:4:"𞹧";s:2:"ح";s:4:"𞹨";s:2:"ط";s:4:"𞹩";s:2:"ي";s:4:"𞹪";s:2:"ك";s:4:"𞹬";s:2:"م";s:4:"𞹭";s:2:"ن";s:4:"𞹮";s:2:"س";s:4:"𞹯";s:2:"ع";s:4:"𞹰";s:2:"ف";s:4:"𞹱";s:2:"ص";s:4:"𞹲";s:2:"ق";s:4:"𞹴";s:2:"ش";s:4:"𞹵";s:2:"ت";s:4:"𞹶";s:2:"ث";s:4:"𞹷";s:2:"خ";s:4:"𞹹";s:2:"ض";s:4:"𞹺";s:2:"ظ";s:4:"𞹻";s:2:"غ";s:4:"𞹼";s:2:"ٮ";s:4:"𞹾";s:2:"ڡ";s:4:"𞺀";s:2:"ا";s:4:"𞺁";s:2:"ب";s:4:"𞺂";s:2:"ج";s:4:"𞺃";s:2:"د";s:4:"𞺄";s:2:"ه";s:4:"𞺅";s:2:"و";s:4:"𞺆";s:2:"ز";s:4:"𞺇";s:2:"ح";s:4:"𞺈";s:2:"ط";s:4:"𞺉";s:2:"ي";s:4:"𞺋";s:2:"ل";s:4:"𞺌";s:2:"م";s:4:"𞺍";s:2:"ن";s:4:"𞺎";s:2:"س";s:4:"𞺏";s:2:"ع";s:4:"𞺐";s:2:"ف";s:4:"𞺑";s:2:"ص";s:4:"𞺒";s:2:"ق";s:4:"𞺓";s:2:"ر";s:4:"𞺔";s:2:"ش";s:4:"𞺕";s:2:"ت";s:4:"𞺖";s:2:"ث";s:4:"𞺗";s:2:"خ";s:4:"𞺘";s:2:"ذ";s:4:"𞺙";s:2:"ض";s:4:"𞺚";s:2:"ظ";s:4:"𞺛";s:2:"غ";s:4:"𞺡";s:2:"ب";s:4:"𞺢";s:2:"ج";s:4:"𞺣";s:2:"د";s:4:"𞺥";s:2:"و";s:4:"𞺦";s:2:"ز";s:4:"𞺧";s:2:"ح";s:4:"𞺨";s:2:"ط";s:4:"𞺩";s:2:"ي";s:4:"𞺫";s:2:"ل";s:4:"𞺬";s:2:"م";s:4:"𞺭";s:2:"ن";s:4:"𞺮";s:2:"س";s:4:"𞺯";s:2:"ع";s:4:"𞺰";s:2:"ف";s:4:"𞺱";s:2:"ص";s:4:"𞺲";s:2:"ق";s:4:"𞺳";s:2:"ر";s:4:"𞺴";s:2:"ش";s:4:"𞺵";s:2:"ت";s:4:"𞺶";s:2:"ث";s:4:"𞺷";s:2:"خ";s:4:"𞺸";s:2:"ذ";s:4:"𞺹";s:2:"ض";s:4:"𞺺";s:2:"ظ";s:4:"𞺻";s:2:"غ";s:4:"🄀";s:2:"0.";s:4:"🄁";s:2:"0,";s:4:"🄂";s:2:"1,";s:4:"🄃";s:2:"2,";s:4:"🄄";s:2:"3,";s:4:"🄅";s:2:"4,";s:4:"🄆";s:2:"5,";s:4:"🄇";s:2:"6,";s:4:"🄈";s:2:"7,";s:4:"🄉";s:2:"8,";s:4:"🄊";s:2:"9,";s:4:"🄐";s:3:"(A)";s:4:"🄑";s:3:"(B)";s:4:"🄒";s:3:"(C)";s:4:"🄓";s:3:"(D)";s:4:"🄔";s:3:"(E)";s:4:"🄕";s:3:"(F)";s:4:"🄖";s:3:"(G)";s:4:"🄗";s:3:"(H)";s:4:"🄘";s:3:"(I)";s:4:"🄙";s:3:"(J)";s:4:"🄚";s:3:"(K)";s:4:"🄛";s:3:"(L)";s:4:"🄜";s:3:"(M)";s:4:"🄝";s:3:"(N)";s:4:"🄞";s:3:"(O)";s:4:"🄟";s:3:"(P)";s:4:"🄠";s:3:"(Q)";s:4:"🄡";s:3:"(R)";s:4:"🄢";s:3:"(S)";s:4:"🄣";s:3:"(T)";s:4:"🄤";s:3:"(U)";s:4:"🄥";s:3:"(V)";s:4:"🄦";s:3:"(W)";s:4:"🄧";s:3:"(X)";s:4:"🄨";s:3:"(Y)";s:4:"🄩";s:3:"(Z)";s:4:"🄪";s:7:"〔S〕";s:4:"🄫";s:1:"C";s:4:"🄬";s:1:"R";s:4:"🄭";s:2:"CD";s:4:"🄮";s:2:"WZ";s:4:"🄰";s:1:"A";s:4:"🄱";s:1:"B";s:4:"🄲";s:1:"C";s:4:"🄳";s:1:"D";s:4:"🄴";s:1:"E";s:4:"🄵";s:1:"F";s:4:"🄶";s:1:"G";s:4:"🄷";s:1:"H";s:4:"🄸";s:1:"I";s:4:"🄹";s:1:"J";s:4:"🄺";s:1:"K";s:4:"🄻";s:1:"L";s:4:"🄼";s:1:"M";s:4:"🄽";s:1:"N";s:4:"🄾";s:1:"O";s:4:"🄿";s:1:"P";s:4:"🅀";s:1:"Q";s:4:"🅁";s:1:"R";s:4:"🅂";s:1:"S";s:4:"🅃";s:1:"T";s:4:"🅄";s:1:"U";s:4:"🅅";s:1:"V";s:4:"🅆";s:1:"W";s:4:"🅇";s:1:"X";s:4:"🅈";s:1:"Y";s:4:"🅉";s:1:"Z";s:4:"🅊";s:2:"HV";s:4:"🅋";s:2:"MV";s:4:"🅌";s:2:"SD";s:4:"🅍";s:2:"SS";s:4:"🅎";s:3:"PPV";s:4:"🅏";s:2:"WC";s:4:"🅪";s:2:"MC";s:4:"🅫";s:2:"MD";s:4:"🆐";s:2:"DJ";s:4:"🈀";s:6:"ほか";s:4:"🈁";s:6:"ココ";s:4:"🈂";s:3:"サ";s:4:"🈐";s:3:"手";s:4:"🈑";s:3:"字";s:4:"🈒";s:3:"双";s:4:"🈓";s:6:"デ";s:4:"🈔";s:3:"二";s:4:"🈕";s:3:"多";s:4:"🈖";s:3:"解";s:4:"🈗";s:3:"天";s:4:"🈘";s:3:"交";s:4:"🈙";s:3:"映";s:4:"🈚";s:3:"無";s:4:"🈛";s:3:"料";s:4:"🈜";s:3:"前";s:4:"🈝";s:3:"後";s:4:"🈞";s:3:"再";s:4:"🈟";s:3:"新";s:4:"🈠";s:3:"初";s:4:"🈡";s:3:"終";s:4:"🈢";s:3:"生";s:4:"🈣";s:3:"販";s:4:"🈤";s:3:"声";s:4:"🈥";s:3:"吹";s:4:"🈦";s:3:"演";s:4:"🈧";s:3:"投";s:4:"🈨";s:3:"捕";s:4:"🈩";s:3:"一";s:4:"🈪";s:3:"三";s:4:"🈫";s:3:"遊";s:4:"🈬";s:3:"左";s:4:"🈭";s:3:"中";s:4:"🈮";s:3:"右";s:4:"🈯";s:3:"指";s:4:"🈰";s:3:"走";s:4:"🈱";s:3:"打";s:4:"🈲";s:3:"禁";s:4:"🈳";s:3:"空";s:4:"🈴";s:3:"合";s:4:"🈵";s:3:"満";s:4:"🈶";s:3:"有";s:4:"🈷";s:3:"月";s:4:"🈸";s:3:"申";s:4:"🈹";s:3:"割";s:4:"🈺";s:3:"営";s:4:"🉀";s:9:"〔本〕";s:4:"🉁";s:9:"〔三〕";s:4:"🉂";s:9:"〔二〕";s:4:"🉃";s:9:"〔安〕";s:4:"🉄";s:9:"〔点〕";s:4:"🉅";s:9:"〔打〕";s:4:"🉆";s:9:"〔盗〕";s:4:"🉇";s:9:"〔勝〕";s:4:"🉈";s:9:"〔敗〕";s:4:"🉐";s:3:"得";s:4:"🉑";s:3:"可";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/unidata/lowerCase.ser
@@ -0,0 +1 @@
+a:1092:{s:1:"A";s:1:"a";s:1:"B";s:1:"b";s:1:"C";s:1:"c";s:1:"D";s:1:"d";s:1:"E";s:1:"e";s:1:"F";s:1:"f";s:1:"G";s:1:"g";s:1:"H";s:1:"h";s:1:"I";s:1:"i";s:1:"J";s:1:"j";s:1:"K";s:1:"k";s:1:"L";s:1:"l";s:1:"M";s:1:"m";s:1:"N";s:1:"n";s:1:"O";s:1:"o";s:1:"P";s:1:"p";s:1:"Q";s:1:"q";s:1:"R";s:1:"r";s:1:"S";s:1:"s";s:1:"T";s:1:"t";s:1:"U";s:1:"u";s:1:"V";s:1:"v";s:1:"W";s:1:"w";s:1:"X";s:1:"x";s:1:"Y";s:1:"y";s:1:"Z";s:1:"z";s:2:"À";s:2:"à";s:2:"Á";s:2:"á";s:2:"Â";s:2:"â";s:2:"Ã";s:2:"ã";s:2:"Ä";s:2:"ä";s:2:"Å";s:2:"å";s:2:"Æ";s:2:"æ";s:2:"Ç";s:2:"ç";s:2:"È";s:2:"è";s:2:"É";s:2:"é";s:2:"Ê";s:2:"ê";s:2:"Ë";s:2:"ë";s:2:"Ì";s:2:"ì";s:2:"Í";s:2:"í";s:2:"Î";s:2:"î";s:2:"Ï";s:2:"ï";s:2:"Ð";s:2:"ð";s:2:"Ñ";s:2:"ñ";s:2:"Ò";s:2:"ò";s:2:"Ó";s:2:"ó";s:2:"Ô";s:2:"ô";s:2:"Õ";s:2:"õ";s:2:"Ö";s:2:"ö";s:2:"Ø";s:2:"ø";s:2:"Ù";s:2:"ù";s:2:"Ú";s:2:"ú";s:2:"Û";s:2:"û";s:2:"Ü";s:2:"ü";s:2:"Ý";s:2:"ý";s:2:"Þ";s:2:"þ";s:2:"Ā";s:2:"ā";s:2:"Ă";s:2:"ă";s:2:"Ą";s:2:"ą";s:2:"Ć";s:2:"ć";s:2:"Ĉ";s:2:"ĉ";s:2:"Ċ";s:2:"ċ";s:2:"Č";s:2:"č";s:2:"Ď";s:2:"ď";s:2:"Đ";s:2:"đ";s:2:"Ē";s:2:"ē";s:2:"Ĕ";s:2:"ĕ";s:2:"Ė";s:2:"ė";s:2:"Ę";s:2:"ę";s:2:"Ě";s:2:"ě";s:2:"Ĝ";s:2:"ĝ";s:2:"Ğ";s:2:"ğ";s:2:"Ġ";s:2:"ġ";s:2:"Ģ";s:2:"ģ";s:2:"Ĥ";s:2:"ĥ";s:2:"Ħ";s:2:"ħ";s:2:"Ĩ";s:2:"ĩ";s:2:"Ī";s:2:"ī";s:2:"Ĭ";s:2:"ĭ";s:2:"Į";s:2:"į";s:2:"İ";s:1:"i";s:2:"Ĳ";s:2:"ĳ";s:2:"Ĵ";s:2:"ĵ";s:2:"Ķ";s:2:"ķ";s:2:"Ĺ";s:2:"ĺ";s:2:"Ļ";s:2:"ļ";s:2:"Ľ";s:2:"ľ";s:2:"Ŀ";s:2:"ŀ";s:2:"Ł";s:2:"ł";s:2:"Ń";s:2:"ń";s:2:"Ņ";s:2:"ņ";s:2:"Ň";s:2:"ň";s:2:"Ŋ";s:2:"ŋ";s:2:"Ō";s:2:"ō";s:2:"Ŏ";s:2:"ŏ";s:2:"Ő";s:2:"ő";s:2:"Œ";s:2:"œ";s:2:"Ŕ";s:2:"ŕ";s:2:"Ŗ";s:2:"ŗ";s:2:"Ř";s:2:"ř";s:2:"Ś";s:2:"ś";s:2:"Ŝ";s:2:"ŝ";s:2:"Ş";s:2:"ş";s:2:"Š";s:2:"š";s:2:"Ţ";s:2:"ţ";s:2:"Ť";s:2:"ť";s:2:"Ŧ";s:2:"ŧ";s:2:"Ũ";s:2:"ũ";s:2:"Ū";s:2:"ū";s:2:"Ŭ";s:2:"ŭ";s:2:"Ů";s:2:"ů";s:2:"Ű";s:2:"ű";s:2:"Ų";s:2:"ų";s:2:"Ŵ";s:2:"ŵ";s:2:"Ŷ";s:2:"ŷ";s:2:"Ÿ";s:2:"ÿ";s:2:"Ź";s:2:"ź";s:2:"Ż";s:2:"ż";s:2:"Ž";s:2:"ž";s:2:"Ɓ";s:2:"ɓ";s:2:"Ƃ";s:2:"ƃ";s:2:"Ƅ";s:2:"ƅ";s:2:"Ɔ";s:2:"ɔ";s:2:"Ƈ";s:2:"ƈ";s:2:"Ɖ";s:2:"ɖ";s:2:"Ɗ";s:2:"ɗ";s:2:"Ƌ";s:2:"ƌ";s:2:"Ǝ";s:2:"ǝ";s:2:"Ə";s:2:"ə";s:2:"Ɛ";s:2:"ɛ";s:2:"Ƒ";s:2:"ƒ";s:2:"Ɠ";s:2:"ɠ";s:2:"Ɣ";s:2:"ɣ";s:2:"Ɩ";s:2:"ɩ";s:2:"Ɨ";s:2:"ɨ";s:2:"Ƙ";s:2:"ƙ";s:2:"Ɯ";s:2:"ɯ";s:2:"Ɲ";s:2:"ɲ";s:2:"Ɵ";s:2:"ɵ";s:2:"Ơ";s:2:"ơ";s:2:"Ƣ";s:2:"ƣ";s:2:"Ƥ";s:2:"ƥ";s:2:"Ʀ";s:2:"ʀ";s:2:"Ƨ";s:2:"ƨ";s:2:"Ʃ";s:2:"ʃ";s:2:"Ƭ";s:2:"ƭ";s:2:"Ʈ";s:2:"ʈ";s:2:"Ư";s:2:"ư";s:2:"Ʊ";s:2:"ʊ";s:2:"Ʋ";s:2:"ʋ";s:2:"Ƴ";s:2:"ƴ";s:2:"Ƶ";s:2:"ƶ";s:2:"Ʒ";s:2:"ʒ";s:2:"Ƹ";s:2:"ƹ";s:2:"Ƽ";s:2:"ƽ";s:2:"Ǆ";s:2:"ǆ";s:2:"ǅ";s:2:"ǆ";s:2:"Ǉ";s:2:"ǉ";s:2:"ǈ";s:2:"ǉ";s:2:"Ǌ";s:2:"ǌ";s:2:"ǋ";s:2:"ǌ";s:2:"Ǎ";s:2:"ǎ";s:2:"Ǐ";s:2:"ǐ";s:2:"Ǒ";s:2:"ǒ";s:2:"Ǔ";s:2:"ǔ";s:2:"Ǖ";s:2:"ǖ";s:2:"Ǘ";s:2:"ǘ";s:2:"Ǚ";s:2:"ǚ";s:2:"Ǜ";s:2:"ǜ";s:2:"Ǟ";s:2:"ǟ";s:2:"Ǡ";s:2:"ǡ";s:2:"Ǣ";s:2:"ǣ";s:2:"Ǥ";s:2:"ǥ";s:2:"Ǧ";s:2:"ǧ";s:2:"Ǩ";s:2:"ǩ";s:2:"Ǫ";s:2:"ǫ";s:2:"Ǭ";s:2:"ǭ";s:2:"Ǯ";s:2:"ǯ";s:2:"Ǳ";s:2:"ǳ";s:2:"ǲ";s:2:"ǳ";s:2:"Ǵ";s:2:"ǵ";s:2:"Ƕ";s:2:"ƕ";s:2:"Ƿ";s:2:"ƿ";s:2:"Ǹ";s:2:"ǹ";s:2:"Ǻ";s:2:"ǻ";s:2:"Ǽ";s:2:"ǽ";s:2:"Ǿ";s:2:"ǿ";s:2:"Ȁ";s:2:"ȁ";s:2:"Ȃ";s:2:"ȃ";s:2:"Ȅ";s:2:"ȅ";s:2:"Ȇ";s:2:"ȇ";s:2:"Ȉ";s:2:"ȉ";s:2:"Ȋ";s:2:"ȋ";s:2:"Ȍ";s:2:"ȍ";s:2:"Ȏ";s:2:"ȏ";s:2:"Ȑ";s:2:"ȑ";s:2:"Ȓ";s:2:"ȓ";s:2:"Ȕ";s:2:"ȕ";s:2:"Ȗ";s:2:"ȗ";s:2:"Ș";s:2:"ș";s:2:"Ț";s:2:"ț";s:2:"Ȝ";s:2:"ȝ";s:2:"Ȟ";s:2:"ȟ";s:2:"Ƞ";s:2:"ƞ";s:2:"Ȣ";s:2:"ȣ";s:2:"Ȥ";s:2:"ȥ";s:2:"Ȧ";s:2:"ȧ";s:2:"Ȩ";s:2:"ȩ";s:2:"Ȫ";s:2:"ȫ";s:2:"Ȭ";s:2:"ȭ";s:2:"Ȯ";s:2:"ȯ";s:2:"Ȱ";s:2:"ȱ";s:2:"Ȳ";s:2:"ȳ";s:2:"Ⱥ";s:3:"ⱥ";s:2:"Ȼ";s:2:"ȼ";s:2:"Ƚ";s:2:"ƚ";s:2:"Ⱦ";s:3:"ⱦ";s:2:"Ɂ";s:2:"ɂ";s:2:"Ƀ";s:2:"ƀ";s:2:"Ʉ";s:2:"ʉ";s:2:"Ʌ";s:2:"ʌ";s:2:"Ɇ";s:2:"ɇ";s:2:"Ɉ";s:2:"ɉ";s:2:"Ɋ";s:2:"ɋ";s:2:"Ɍ";s:2:"ɍ";s:2:"Ɏ";s:2:"ɏ";s:2:"Ͱ";s:2:"ͱ";s:2:"Ͳ";s:2:"ͳ";s:2:"Ͷ";s:2:"ͷ";s:2:"Ϳ";s:2:"ϳ";s:2:"Ά";s:2:"ά";s:2:"Έ";s:2:"έ";s:2:"Ή";s:2:"ή";s:2:"Ί";s:2:"ί";s:2:"Ό";s:2:"ό";s:2:"Ύ";s:2:"ύ";s:2:"Ώ";s:2:"ώ";s:2:"Α";s:2:"α";s:2:"Β";s:2:"β";s:2:"Γ";s:2:"γ";s:2:"Δ";s:2:"δ";s:2:"Ε";s:2:"ε";s:2:"Ζ";s:2:"ζ";s:2:"Η";s:2:"η";s:2:"Θ";s:2:"θ";s:2:"Ι";s:2:"ι";s:2:"Κ";s:2:"κ";s:2:"Λ";s:2:"λ";s:2:"Μ";s:2:"μ";s:2:"Ν";s:2:"ν";s:2:"Ξ";s:2:"ξ";s:2:"Ο";s:2:"ο";s:2:"Π";s:2:"π";s:2:"Ρ";s:2:"ρ";s:2:"Σ";s:2:"σ";s:2:"Τ";s:2:"τ";s:2:"Υ";s:2:"υ";s:2:"Φ";s:2:"φ";s:2:"Χ";s:2:"χ";s:2:"Ψ";s:2:"ψ";s:2:"Ω";s:2:"ω";s:2:"Ϊ";s:2:"ϊ";s:2:"Ϋ";s:2:"ϋ";s:2:"Ϗ";s:2:"ϗ";s:2:"Ϙ";s:2:"ϙ";s:2:"Ϛ";s:2:"ϛ";s:2:"Ϝ";s:2:"ϝ";s:2:"Ϟ";s:2:"ϟ";s:2:"Ϡ";s:2:"ϡ";s:2:"Ϣ";s:2:"ϣ";s:2:"Ϥ";s:2:"ϥ";s:2:"Ϧ";s:2:"ϧ";s:2:"Ϩ";s:2:"ϩ";s:2:"Ϫ";s:2:"ϫ";s:2:"Ϭ";s:2:"ϭ";s:2:"Ϯ";s:2:"ϯ";s:2:"ϴ";s:2:"θ";s:2:"Ϸ";s:2:"ϸ";s:2:"Ϲ";s:2:"ϲ";s:2:"Ϻ";s:2:"ϻ";s:2:"Ͻ";s:2:"ͻ";s:2:"Ͼ";s:2:"ͼ";s:2:"Ͽ";s:2:"ͽ";s:2:"Ѐ";s:2:"ѐ";s:2:"Ё";s:2:"ё";s:2:"Ђ";s:2:"ђ";s:2:"Ѓ";s:2:"ѓ";s:2:"Є";s:2:"є";s:2:"Ѕ";s:2:"ѕ";s:2:"І";s:2:"і";s:2:"Ї";s:2:"ї";s:2:"Ј";s:2:"ј";s:2:"Љ";s:2:"љ";s:2:"Њ";s:2:"њ";s:2:"Ћ";s:2:"ћ";s:2:"Ќ";s:2:"ќ";s:2:"Ѝ";s:2:"ѝ";s:2:"Ў";s:2:"ў";s:2:"Џ";s:2:"џ";s:2:"А";s:2:"а";s:2:"Б";s:2:"б";s:2:"В";s:2:"в";s:2:"Г";s:2:"г";s:2:"Д";s:2:"д";s:2:"Е";s:2:"е";s:2:"Ж";s:2:"ж";s:2:"З";s:2:"з";s:2:"И";s:2:"и";s:2:"Й";s:2:"й";s:2:"К";s:2:"к";s:2:"Л";s:2:"л";s:2:"М";s:2:"м";s:2:"Н";s:2:"н";s:2:"О";s:2:"о";s:2:"П";s:2:"п";s:2:"Р";s:2:"р";s:2:"С";s:2:"с";s:2:"Т";s:2:"т";s:2:"У";s:2:"у";s:2:"Ф";s:2:"ф";s:2:"Х";s:2:"х";s:2:"Ц";s:2:"ц";s:2:"Ч";s:2:"ч";s:2:"Ш";s:2:"ш";s:2:"Щ";s:2:"щ";s:2:"Ъ";s:2:"ъ";s:2:"Ы";s:2:"ы";s:2:"Ь";s:2:"ь";s:2:"Э";s:2:"э";s:2:"Ю";s:2:"ю";s:2:"Я";s:2:"я";s:2:"Ѡ";s:2:"ѡ";s:2:"Ѣ";s:2:"ѣ";s:2:"Ѥ";s:2:"ѥ";s:2:"Ѧ";s:2:"ѧ";s:2:"Ѩ";s:2:"ѩ";s:2:"Ѫ";s:2:"ѫ";s:2:"Ѭ";s:2:"ѭ";s:2:"Ѯ";s:2:"ѯ";s:2:"Ѱ";s:2:"ѱ";s:2:"Ѳ";s:2:"ѳ";s:2:"Ѵ";s:2:"ѵ";s:2:"Ѷ";s:2:"ѷ";s:2:"Ѹ";s:2:"ѹ";s:2:"Ѻ";s:2:"ѻ";s:2:"Ѽ";s:2:"ѽ";s:2:"Ѿ";s:2:"ѿ";s:2:"Ҁ";s:2:"ҁ";s:2:"Ҋ";s:2:"ҋ";s:2:"Ҍ";s:2:"ҍ";s:2:"Ҏ";s:2:"ҏ";s:2:"Ґ";s:2:"ґ";s:2:"Ғ";s:2:"ғ";s:2:"Ҕ";s:2:"ҕ";s:2:"Җ";s:2:"җ";s:2:"Ҙ";s:2:"ҙ";s:2:"Қ";s:2:"қ";s:2:"Ҝ";s:2:"ҝ";s:2:"Ҟ";s:2:"ҟ";s:2:"Ҡ";s:2:"ҡ";s:2:"Ң";s:2:"ң";s:2:"Ҥ";s:2:"ҥ";s:2:"Ҧ";s:2:"ҧ";s:2:"Ҩ";s:2:"ҩ";s:2:"Ҫ";s:2:"ҫ";s:2:"Ҭ";s:2:"ҭ";s:2:"Ү";s:2:"ү";s:2:"Ұ";s:2:"ұ";s:2:"Ҳ";s:2:"ҳ";s:2:"Ҵ";s:2:"ҵ";s:2:"Ҷ";s:2:"ҷ";s:2:"Ҹ";s:2:"ҹ";s:2:"Һ";s:2:"һ";s:2:"Ҽ";s:2:"ҽ";s:2:"Ҿ";s:2:"ҿ";s:2:"Ӏ";s:2:"ӏ";s:2:"Ӂ";s:2:"ӂ";s:2:"Ӄ";s:2:"ӄ";s:2:"Ӆ";s:2:"ӆ";s:2:"Ӈ";s:2:"ӈ";s:2:"Ӊ";s:2:"ӊ";s:2:"Ӌ";s:2:"ӌ";s:2:"Ӎ";s:2:"ӎ";s:2:"Ӑ";s:2:"ӑ";s:2:"Ӓ";s:2:"ӓ";s:2:"Ӕ";s:2:"ӕ";s:2:"Ӗ";s:2:"ӗ";s:2:"Ә";s:2:"ә";s:2:"Ӛ";s:2:"ӛ";s:2:"Ӝ";s:2:"ӝ";s:2:"Ӟ";s:2:"ӟ";s:2:"Ӡ";s:2:"ӡ";s:2:"Ӣ";s:2:"ӣ";s:2:"Ӥ";s:2:"ӥ";s:2:"Ӧ";s:2:"ӧ";s:2:"Ө";s:2:"ө";s:2:"Ӫ";s:2:"ӫ";s:2:"Ӭ";s:2:"ӭ";s:2:"Ӯ";s:2:"ӯ";s:2:"Ӱ";s:2:"ӱ";s:2:"Ӳ";s:2:"ӳ";s:2:"Ӵ";s:2:"ӵ";s:2:"Ӷ";s:2:"ӷ";s:2:"Ӹ";s:2:"ӹ";s:2:"Ӻ";s:2:"ӻ";s:2:"Ӽ";s:2:"ӽ";s:2:"Ӿ";s:2:"ӿ";s:2:"Ԁ";s:2:"ԁ";s:2:"Ԃ";s:2:"ԃ";s:2:"Ԅ";s:2:"ԅ";s:2:"Ԇ";s:2:"ԇ";s:2:"Ԉ";s:2:"ԉ";s:2:"Ԋ";s:2:"ԋ";s:2:"Ԍ";s:2:"ԍ";s:2:"Ԏ";s:2:"ԏ";s:2:"Ԑ";s:2:"ԑ";s:2:"Ԓ";s:2:"ԓ";s:2:"Ԕ";s:2:"ԕ";s:2:"Ԗ";s:2:"ԗ";s:2:"Ԙ";s:2:"ԙ";s:2:"Ԛ";s:2:"ԛ";s:2:"Ԝ";s:2:"ԝ";s:2:"Ԟ";s:2:"ԟ";s:2:"Ԡ";s:2:"ԡ";s:2:"Ԣ";s:2:"ԣ";s:2:"Ԥ";s:2:"ԥ";s:2:"Ԧ";s:2:"ԧ";s:2:"Ԩ";s:2:"ԩ";s:2:"Ԫ";s:2:"ԫ";s:2:"Ԭ";s:2:"ԭ";s:2:"Ԯ";s:2:"ԯ";s:2:"Ա";s:2:"ա";s:2:"Բ";s:2:"բ";s:2:"Գ";s:2:"գ";s:2:"Դ";s:2:"դ";s:2:"Ե";s:2:"ե";s:2:"Զ";s:2:"զ";s:2:"Է";s:2:"է";s:2:"Ը";s:2:"ը";s:2:"Թ";s:2:"թ";s:2:"Ժ";s:2:"ժ";s:2:"Ի";s:2:"ի";s:2:"Լ";s:2:"լ";s:2:"Խ";s:2:"խ";s:2:"Ծ";s:2:"ծ";s:2:"Կ";s:2:"կ";s:2:"Հ";s:2:"հ";s:2:"Ձ";s:2:"ձ";s:2:"Ղ";s:2:"ղ";s:2:"Ճ";s:2:"ճ";s:2:"Մ";s:2:"մ";s:2:"Յ";s:2:"յ";s:2:"Ն";s:2:"ն";s:2:"Շ";s:2:"շ";s:2:"Ո";s:2:"ո";s:2:"Չ";s:2:"չ";s:2:"Պ";s:2:"պ";s:2:"Ջ";s:2:"ջ";s:2:"Ռ";s:2:"ռ";s:2:"Ս";s:2:"ս";s:2:"Վ";s:2:"վ";s:2:"Տ";s:2:"տ";s:2:"Ր";s:2:"ր";s:2:"Ց";s:2:"ց";s:2:"Ւ";s:2:"ւ";s:2:"Փ";s:2:"փ";s:2:"Ք";s:2:"ք";s:2:"Օ";s:2:"օ";s:2:"Ֆ";s:2:"ֆ";s:3:"Ⴀ";s:3:"ⴀ";s:3:"Ⴁ";s:3:"ⴁ";s:3:"Ⴂ";s:3:"ⴂ";s:3:"Ⴃ";s:3:"ⴃ";s:3:"Ⴄ";s:3:"ⴄ";s:3:"Ⴅ";s:3:"ⴅ";s:3:"Ⴆ";s:3:"ⴆ";s:3:"Ⴇ";s:3:"ⴇ";s:3:"Ⴈ";s:3:"ⴈ";s:3:"Ⴉ";s:3:"ⴉ";s:3:"Ⴊ";s:3:"ⴊ";s:3:"Ⴋ";s:3:"ⴋ";s:3:"Ⴌ";s:3:"ⴌ";s:3:"Ⴍ";s:3:"ⴍ";s:3:"Ⴎ";s:3:"ⴎ";s:3:"Ⴏ";s:3:"ⴏ";s:3:"Ⴐ";s:3:"ⴐ";s:3:"Ⴑ";s:3:"ⴑ";s:3:"Ⴒ";s:3:"ⴒ";s:3:"Ⴓ";s:3:"ⴓ";s:3:"Ⴔ";s:3:"ⴔ";s:3:"Ⴕ";s:3:"ⴕ";s:3:"Ⴖ";s:3:"ⴖ";s:3:"Ⴗ";s:3:"ⴗ";s:3:"Ⴘ";s:3:"ⴘ";s:3:"Ⴙ";s:3:"ⴙ";s:3:"Ⴚ";s:3:"ⴚ";s:3:"Ⴛ";s:3:"ⴛ";s:3:"Ⴜ";s:3:"ⴜ";s:3:"Ⴝ";s:3:"ⴝ";s:3:"Ⴞ";s:3:"ⴞ";s:3:"Ⴟ";s:3:"ⴟ";s:3:"Ⴠ";s:3:"ⴠ";s:3:"Ⴡ";s:3:"ⴡ";s:3:"Ⴢ";s:3:"ⴢ";s:3:"Ⴣ";s:3:"ⴣ";s:3:"Ⴤ";s:3:"ⴤ";s:3:"Ⴥ";s:3:"ⴥ";s:3:"Ⴧ";s:3:"ⴧ";s:3:"Ⴭ";s:3:"ⴭ";s:3:"Ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"ḇ";s:3:"Ḉ";s:3:"ḉ";s:3:"Ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"ḓ";s:3:"Ḕ";s:3:"ḕ";s:3:"Ḗ";s:3:"ḗ";s:3:"Ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"ḛ";s:3:"Ḝ";s:3:"ḝ";s:3:"Ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"ḭ";s:3:"Ḯ";s:3:"ḯ";s:3:"Ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"ḷ";s:3:"Ḹ";s:3:"ḹ";s:3:"Ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"ṋ";s:3:"Ṍ";s:3:"ṍ";s:3:"Ṏ";s:3:"ṏ";s:3:"Ṑ";s:3:"ṑ";s:3:"Ṓ";s:3:"ṓ";s:3:"Ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"ṛ";s:3:"Ṝ";s:3:"ṝ";s:3:"Ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"ṣ";s:3:"Ṥ";s:3:"ṥ";s:3:"Ṧ";s:3:"ṧ";s:3:"Ṩ";s:3:"ṩ";s:3:"Ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"ṷ";s:3:"Ṹ";s:3:"ṹ";s:3:"Ṻ";s:3:"ṻ";s:3:"Ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẞ";s:2:"ß";s:3:"Ạ";s:3:"ạ";s:3:"Ả";s:3:"ả";s:3:"Ấ";s:3:"ấ";s:3:"Ầ";s:3:"ầ";s:3:"Ẩ";s:3:"ẩ";s:3:"Ẫ";s:3:"ẫ";s:3:"Ậ";s:3:"ậ";s:3:"Ắ";s:3:"ắ";s:3:"Ằ";s:3:"ằ";s:3:"Ẳ";s:3:"ẳ";s:3:"Ẵ";s:3:"ẵ";s:3:"Ặ";s:3:"ặ";s:3:"Ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"ẽ";s:3:"Ế";s:3:"ế";s:3:"Ề";s:3:"ề";s:3:"Ể";s:3:"ể";s:3:"Ễ";s:3:"ễ";s:3:"Ệ";s:3:"ệ";s:3:"Ỉ";s:3:"ỉ";s:3:"Ị";s:3:"ị";s:3:"Ọ";s:3:"ọ";s:3:"Ỏ";s:3:"ỏ";s:3:"Ố";s:3:"ố";s:3:"Ồ";s:3:"ồ";s:3:"Ổ";s:3:"ổ";s:3:"Ỗ";s:3:"ỗ";s:3:"Ộ";s:3:"ộ";s:3:"Ớ";s:3:"ớ";s:3:"Ờ";s:3:"ờ";s:3:"Ở";s:3:"ở";s:3:"Ỡ";s:3:"ỡ";s:3:"Ợ";s:3:"ợ";s:3:"Ụ";s:3:"ụ";s:3:"Ủ";s:3:"ủ";s:3:"Ứ";s:3:"ứ";s:3:"Ừ";s:3:"ừ";s:3:"Ử";s:3:"ử";s:3:"Ữ";s:3:"ữ";s:3:"Ự";s:3:"ự";s:3:"Ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"ỹ";s:3:"Ỻ";s:3:"ỻ";s:3:"Ỽ";s:3:"ỽ";s:3:"Ỿ";s:3:"ỿ";s:3:"Ἀ";s:3:"ἀ";s:3:"Ἁ";s:3:"ἁ";s:3:"Ἂ";s:3:"ἂ";s:3:"Ἃ";s:3:"ἃ";s:3:"Ἄ";s:3:"ἄ";s:3:"Ἅ";s:3:"ἅ";s:3:"Ἆ";s:3:"ἆ";s:3:"Ἇ";s:3:"ἇ";s:3:"Ἐ";s:3:"ἐ";s:3:"Ἑ";s:3:"ἑ";s:3:"Ἒ";s:3:"ἒ";s:3:"Ἓ";s:3:"ἓ";s:3:"Ἔ";s:3:"ἔ";s:3:"Ἕ";s:3:"ἕ";s:3:"Ἠ";s:3:"ἠ";s:3:"Ἡ";s:3:"ἡ";s:3:"Ἢ";s:3:"ἢ";s:3:"Ἣ";s:3:"ἣ";s:3:"Ἤ";s:3:"ἤ";s:3:"Ἥ";s:3:"ἥ";s:3:"Ἦ";s:3:"ἦ";s:3:"Ἧ";s:3:"ἧ";s:3:"Ἰ";s:3:"ἰ";s:3:"Ἱ";s:3:"ἱ";s:3:"Ἲ";s:3:"ἲ";s:3:"Ἳ";s:3:"ἳ";s:3:"Ἴ";s:3:"ἴ";s:3:"Ἵ";s:3:"ἵ";s:3:"Ἶ";s:3:"ἶ";s:3:"Ἷ";s:3:"ἷ";s:3:"Ὀ";s:3:"ὀ";s:3:"Ὁ";s:3:"ὁ";s:3:"Ὂ";s:3:"ὂ";s:3:"Ὃ";s:3:"ὃ";s:3:"Ὄ";s:3:"ὄ";s:3:"Ὅ";s:3:"ὅ";s:3:"Ὑ";s:3:"ὑ";s:3:"Ὓ";s:3:"ὓ";s:3:"Ὕ";s:3:"ὕ";s:3:"Ὗ";s:3:"ὗ";s:3:"Ὠ";s:3:"ὠ";s:3:"Ὡ";s:3:"ὡ";s:3:"Ὢ";s:3:"ὢ";s:3:"Ὣ";s:3:"ὣ";s:3:"Ὤ";s:3:"ὤ";s:3:"Ὥ";s:3:"ὥ";s:3:"Ὦ";s:3:"ὦ";s:3:"Ὧ";s:3:"ὧ";s:3:"ᾈ";s:3:"ᾀ";s:3:"ᾉ";s:3:"ᾁ";s:3:"ᾊ";s:3:"ᾂ";s:3:"ᾋ";s:3:"ᾃ";s:3:"ᾌ";s:3:"ᾄ";s:3:"ᾍ";s:3:"ᾅ";s:3:"ᾎ";s:3:"ᾆ";s:3:"ᾏ";s:3:"ᾇ";s:3:"ᾘ";s:3:"ᾐ";s:3:"ᾙ";s:3:"ᾑ";s:3:"ᾚ";s:3:"ᾒ";s:3:"ᾛ";s:3:"ᾓ";s:3:"ᾜ";s:3:"ᾔ";s:3:"ᾝ";s:3:"ᾕ";s:3:"ᾞ";s:3:"ᾖ";s:3:"ᾟ";s:3:"ᾗ";s:3:"ᾨ";s:3:"ᾠ";s:3:"ᾩ";s:3:"ᾡ";s:3:"ᾪ";s:3:"ᾢ";s:3:"ᾫ";s:3:"ᾣ";s:3:"ᾬ";s:3:"ᾤ";s:3:"ᾭ";s:3:"ᾥ";s:3:"ᾮ";s:3:"ᾦ";s:3:"ᾯ";s:3:"ᾧ";s:3:"Ᾰ";s:3:"ᾰ";s:3:"Ᾱ";s:3:"ᾱ";s:3:"Ὰ";s:3:"ὰ";s:3:"Ά";s:3:"ά";s:3:"ᾼ";s:3:"ᾳ";s:3:"Ὲ";s:3:"ὲ";s:3:"Έ";s:3:"έ";s:3:"Ὴ";s:3:"ὴ";s:3:"Ή";s:3:"ή";s:3:"ῌ";s:3:"ῃ";s:3:"Ῐ";s:3:"ῐ";s:3:"Ῑ";s:3:"ῑ";s:3:"Ὶ";s:3:"ὶ";s:3:"Ί";s:3:"ί";s:3:"Ῠ";s:3:"ῠ";s:3:"Ῡ";s:3:"ῡ";s:3:"Ὺ";s:3:"ὺ";s:3:"Ύ";s:3:"ύ";s:3:"Ῥ";s:3:"ῥ";s:3:"Ὸ";s:3:"ὸ";s:3:"Ό";s:3:"ό";s:3:"Ὼ";s:3:"ὼ";s:3:"Ώ";s:3:"ώ";s:3:"ῼ";s:3:"ῳ";s:3:"Ω";s:2:"ω";s:3:"K";s:1:"k";s:3:"Å";s:2:"å";s:3:"Ⅎ";s:3:"ⅎ";s:3:"Ⅰ";s:3:"ⅰ";s:3:"Ⅱ";s:3:"ⅱ";s:3:"Ⅲ";s:3:"ⅲ";s:3:"Ⅳ";s:3:"ⅳ";s:3:"Ⅴ";s:3:"ⅴ";s:3:"Ⅵ";s:3:"ⅵ";s:3:"Ⅶ";s:3:"ⅶ";s:3:"Ⅷ";s:3:"ⅷ";s:3:"Ⅸ";s:3:"ⅸ";s:3:"Ⅹ";s:3:"ⅹ";s:3:"Ⅺ";s:3:"ⅺ";s:3:"Ⅻ";s:3:"ⅻ";s:3:"Ⅼ";s:3:"ⅼ";s:3:"Ⅽ";s:3:"ⅽ";s:3:"Ⅾ";s:3:"ⅾ";s:3:"Ⅿ";s:3:"ⅿ";s:3:"Ↄ";s:3:"ↄ";s:3:"Ⓐ";s:3:"ⓐ";s:3:"Ⓑ";s:3:"ⓑ";s:3:"Ⓒ";s:3:"ⓒ";s:3:"Ⓓ";s:3:"ⓓ";s:3:"Ⓔ";s:3:"ⓔ";s:3:"Ⓕ";s:3:"ⓕ";s:3:"Ⓖ";s:3:"ⓖ";s:3:"Ⓗ";s:3:"ⓗ";s:3:"Ⓘ";s:3:"ⓘ";s:3:"Ⓙ";s:3:"ⓙ";s:3:"Ⓚ";s:3:"ⓚ";s:3:"Ⓛ";s:3:"ⓛ";s:3:"Ⓜ";s:3:"ⓜ";s:3:"Ⓝ";s:3:"ⓝ";s:3:"Ⓞ";s:3:"ⓞ";s:3:"Ⓟ";s:3:"ⓟ";s:3:"Ⓠ";s:3:"ⓠ";s:3:"Ⓡ";s:3:"ⓡ";s:3:"Ⓢ";s:3:"ⓢ";s:3:"Ⓣ";s:3:"ⓣ";s:3:"Ⓤ";s:3:"ⓤ";s:3:"Ⓥ";s:3:"ⓥ";s:3:"Ⓦ";s:3:"ⓦ";s:3:"Ⓧ";s:3:"ⓧ";s:3:"Ⓨ";s:3:"ⓨ";s:3:"Ⓩ";s:3:"ⓩ";s:3:"Ⰰ";s:3:"ⰰ";s:3:"Ⰱ";s:3:"ⰱ";s:3:"Ⰲ";s:3:"ⰲ";s:3:"Ⰳ";s:3:"ⰳ";s:3:"Ⰴ";s:3:"ⰴ";s:3:"Ⰵ";s:3:"ⰵ";s:3:"Ⰶ";s:3:"ⰶ";s:3:"Ⰷ";s:3:"ⰷ";s:3:"Ⰸ";s:3:"ⰸ";s:3:"Ⰹ";s:3:"ⰹ";s:3:"Ⰺ";s:3:"ⰺ";s:3:"Ⰻ";s:3:"ⰻ";s:3:"Ⰼ";s:3:"ⰼ";s:3:"Ⰽ";s:3:"ⰽ";s:3:"Ⰾ";s:3:"ⰾ";s:3:"Ⰿ";s:3:"ⰿ";s:3:"Ⱀ";s:3:"ⱀ";s:3:"Ⱁ";s:3:"ⱁ";s:3:"Ⱂ";s:3:"ⱂ";s:3:"Ⱃ";s:3:"ⱃ";s:3:"Ⱄ";s:3:"ⱄ";s:3:"Ⱅ";s:3:"ⱅ";s:3:"Ⱆ";s:3:"ⱆ";s:3:"Ⱇ";s:3:"ⱇ";s:3:"Ⱈ";s:3:"ⱈ";s:3:"Ⱉ";s:3:"ⱉ";s:3:"Ⱊ";s:3:"ⱊ";s:3:"Ⱋ";s:3:"ⱋ";s:3:"Ⱌ";s:3:"ⱌ";s:3:"Ⱍ";s:3:"ⱍ";s:3:"Ⱎ";s:3:"ⱎ";s:3:"Ⱏ";s:3:"ⱏ";s:3:"Ⱐ";s:3:"ⱐ";s:3:"Ⱑ";s:3:"ⱑ";s:3:"Ⱒ";s:3:"ⱒ";s:3:"Ⱓ";s:3:"ⱓ";s:3:"Ⱔ";s:3:"ⱔ";s:3:"Ⱕ";s:3:"ⱕ";s:3:"Ⱖ";s:3:"ⱖ";s:3:"Ⱗ";s:3:"ⱗ";s:3:"Ⱘ";s:3:"ⱘ";s:3:"Ⱙ";s:3:"ⱙ";s:3:"Ⱚ";s:3:"ⱚ";s:3:"Ⱛ";s:3:"ⱛ";s:3:"Ⱜ";s:3:"ⱜ";s:3:"Ⱝ";s:3:"ⱝ";s:3:"Ⱞ";s:3:"ⱞ";s:3:"Ⱡ";s:3:"ⱡ";s:3:"Ɫ";s:2:"ɫ";s:3:"Ᵽ";s:3:"ᵽ";s:3:"Ɽ";s:2:"ɽ";s:3:"Ⱨ";s:3:"ⱨ";s:3:"Ⱪ";s:3:"ⱪ";s:3:"Ⱬ";s:3:"ⱬ";s:3:"Ɑ";s:2:"ɑ";s:3:"Ɱ";s:2:"ɱ";s:3:"Ɐ";s:2:"ɐ";s:3:"Ɒ";s:2:"ɒ";s:3:"Ⱳ";s:3:"ⱳ";s:3:"Ⱶ";s:3:"ⱶ";s:3:"Ȿ";s:2:"ȿ";s:3:"Ɀ";s:2:"ɀ";s:3:"Ⲁ";s:3:"ⲁ";s:3:"Ⲃ";s:3:"ⲃ";s:3:"Ⲅ";s:3:"ⲅ";s:3:"Ⲇ";s:3:"ⲇ";s:3:"Ⲉ";s:3:"ⲉ";s:3:"Ⲋ";s:3:"ⲋ";s:3:"Ⲍ";s:3:"ⲍ";s:3:"Ⲏ";s:3:"ⲏ";s:3:"Ⲑ";s:3:"ⲑ";s:3:"Ⲓ";s:3:"ⲓ";s:3:"Ⲕ";s:3:"ⲕ";s:3:"Ⲗ";s:3:"ⲗ";s:3:"Ⲙ";s:3:"ⲙ";s:3:"Ⲛ";s:3:"ⲛ";s:3:"Ⲝ";s:3:"ⲝ";s:3:"Ⲟ";s:3:"ⲟ";s:3:"Ⲡ";s:3:"ⲡ";s:3:"Ⲣ";s:3:"ⲣ";s:3:"Ⲥ";s:3:"ⲥ";s:3:"Ⲧ";s:3:"ⲧ";s:3:"Ⲩ";s:3:"ⲩ";s:3:"Ⲫ";s:3:"ⲫ";s:3:"Ⲭ";s:3:"ⲭ";s:3:"Ⲯ";s:3:"ⲯ";s:3:"Ⲱ";s:3:"ⲱ";s:3:"Ⲳ";s:3:"ⲳ";s:3:"Ⲵ";s:3:"ⲵ";s:3:"Ⲷ";s:3:"ⲷ";s:3:"Ⲹ";s:3:"ⲹ";s:3:"Ⲻ";s:3:"ⲻ";s:3:"Ⲽ";s:3:"ⲽ";s:3:"Ⲿ";s:3:"ⲿ";s:3:"Ⳁ";s:3:"ⳁ";s:3:"Ⳃ";s:3:"ⳃ";s:3:"Ⳅ";s:3:"ⳅ";s:3:"Ⳇ";s:3:"ⳇ";s:3:"Ⳉ";s:3:"ⳉ";s:3:"Ⳋ";s:3:"ⳋ";s:3:"Ⳍ";s:3:"ⳍ";s:3:"Ⳏ";s:3:"ⳏ";s:3:"Ⳑ";s:3:"ⳑ";s:3:"Ⳓ";s:3:"ⳓ";s:3:"Ⳕ";s:3:"ⳕ";s:3:"Ⳗ";s:3:"ⳗ";s:3:"Ⳙ";s:3:"ⳙ";s:3:"Ⳛ";s:3:"ⳛ";s:3:"Ⳝ";s:3:"ⳝ";s:3:"Ⳟ";s:3:"ⳟ";s:3:"Ⳡ";s:3:"ⳡ";s:3:"Ⳣ";s:3:"ⳣ";s:3:"Ⳬ";s:3:"ⳬ";s:3:"Ⳮ";s:3:"ⳮ";s:3:"Ⳳ";s:3:"ⳳ";s:3:"Ꙁ";s:3:"ꙁ";s:3:"Ꙃ";s:3:"ꙃ";s:3:"Ꙅ";s:3:"ꙅ";s:3:"Ꙇ";s:3:"ꙇ";s:3:"Ꙉ";s:3:"ꙉ";s:3:"Ꙋ";s:3:"ꙋ";s:3:"Ꙍ";s:3:"ꙍ";s:3:"Ꙏ";s:3:"ꙏ";s:3:"Ꙑ";s:3:"ꙑ";s:3:"Ꙓ";s:3:"ꙓ";s:3:"Ꙕ";s:3:"ꙕ";s:3:"Ꙗ";s:3:"ꙗ";s:3:"Ꙙ";s:3:"ꙙ";s:3:"Ꙛ";s:3:"ꙛ";s:3:"Ꙝ";s:3:"ꙝ";s:3:"Ꙟ";s:3:"ꙟ";s:3:"Ꙡ";s:3:"ꙡ";s:3:"Ꙣ";s:3:"ꙣ";s:3:"Ꙥ";s:3:"ꙥ";s:3:"Ꙧ";s:3:"ꙧ";s:3:"Ꙩ";s:3:"ꙩ";s:3:"Ꙫ";s:3:"ꙫ";s:3:"Ꙭ";s:3:"ꙭ";s:3:"Ꚁ";s:3:"ꚁ";s:3:"Ꚃ";s:3:"ꚃ";s:3:"Ꚅ";s:3:"ꚅ";s:3:"Ꚇ";s:3:"ꚇ";s:3:"Ꚉ";s:3:"ꚉ";s:3:"Ꚋ";s:3:"ꚋ";s:3:"Ꚍ";s:3:"ꚍ";s:3:"Ꚏ";s:3:"ꚏ";s:3:"Ꚑ";s:3:"ꚑ";s:3:"Ꚓ";s:3:"ꚓ";s:3:"Ꚕ";s:3:"ꚕ";s:3:"Ꚗ";s:3:"ꚗ";s:3:"Ꚙ";s:3:"ꚙ";s:3:"Ꚛ";s:3:"ꚛ";s:3:"Ꜣ";s:3:"ꜣ";s:3:"Ꜥ";s:3:"ꜥ";s:3:"Ꜧ";s:3:"ꜧ";s:3:"Ꜩ";s:3:"ꜩ";s:3:"Ꜫ";s:3:"ꜫ";s:3:"Ꜭ";s:3:"ꜭ";s:3:"Ꜯ";s:3:"ꜯ";s:3:"Ꜳ";s:3:"ꜳ";s:3:"Ꜵ";s:3:"ꜵ";s:3:"Ꜷ";s:3:"ꜷ";s:3:"Ꜹ";s:3:"ꜹ";s:3:"Ꜻ";s:3:"ꜻ";s:3:"Ꜽ";s:3:"ꜽ";s:3:"Ꜿ";s:3:"ꜿ";s:3:"Ꝁ";s:3:"ꝁ";s:3:"Ꝃ";s:3:"ꝃ";s:3:"Ꝅ";s:3:"ꝅ";s:3:"Ꝇ";s:3:"ꝇ";s:3:"Ꝉ";s:3:"ꝉ";s:3:"Ꝋ";s:3:"ꝋ";s:3:"Ꝍ";s:3:"ꝍ";s:3:"Ꝏ";s:3:"ꝏ";s:3:"Ꝑ";s:3:"ꝑ";s:3:"Ꝓ";s:3:"ꝓ";s:3:"Ꝕ";s:3:"ꝕ";s:3:"Ꝗ";s:3:"ꝗ";s:3:"Ꝙ";s:3:"ꝙ";s:3:"Ꝛ";s:3:"ꝛ";s:3:"Ꝝ";s:3:"ꝝ";s:3:"Ꝟ";s:3:"ꝟ";s:3:"Ꝡ";s:3:"ꝡ";s:3:"Ꝣ";s:3:"ꝣ";s:3:"Ꝥ";s:3:"ꝥ";s:3:"Ꝧ";s:3:"ꝧ";s:3:"Ꝩ";s:3:"ꝩ";s:3:"Ꝫ";s:3:"ꝫ";s:3:"Ꝭ";s:3:"ꝭ";s:3:"Ꝯ";s:3:"ꝯ";s:3:"Ꝺ";s:3:"ꝺ";s:3:"Ꝼ";s:3:"ꝼ";s:3:"Ᵹ";s:3:"ᵹ";s:3:"Ꝿ";s:3:"ꝿ";s:3:"Ꞁ";s:3:"ꞁ";s:3:"Ꞃ";s:3:"ꞃ";s:3:"Ꞅ";s:3:"ꞅ";s:3:"Ꞇ";s:3:"ꞇ";s:3:"Ꞌ";s:3:"ꞌ";s:3:"Ɥ";s:2:"ɥ";s:3:"Ꞑ";s:3:"ꞑ";s:3:"Ꞓ";s:3:"ꞓ";s:3:"Ꞗ";s:3:"ꞗ";s:3:"Ꞙ";s:3:"ꞙ";s:3:"Ꞛ";s:3:"ꞛ";s:3:"Ꞝ";s:3:"ꞝ";s:3:"Ꞟ";s:3:"ꞟ";s:3:"Ꞡ";s:3:"ꞡ";s:3:"Ꞣ";s:3:"ꞣ";s:3:"Ꞥ";s:3:"ꞥ";s:3:"Ꞧ";s:3:"ꞧ";s:3:"Ꞩ";s:3:"ꞩ";s:3:"Ɦ";s:2:"ɦ";s:3:"Ɜ";s:2:"ɜ";s:3:"Ɡ";s:2:"ɡ";s:3:"Ɬ";s:2:"ɬ";s:3:"Ʞ";s:2:"ʞ";s:3:"Ʇ";s:2:"ʇ";s:3:"Ａ";s:3:"ａ";s:3:"Ｂ";s:3:"ｂ";s:3:"Ｃ";s:3:"ｃ";s:3:"Ｄ";s:3:"ｄ";s:3:"Ｅ";s:3:"ｅ";s:3:"Ｆ";s:3:"ｆ";s:3:"Ｇ";s:3:"ｇ";s:3:"Ｈ";s:3:"ｈ";s:3:"Ｉ";s:3:"ｉ";s:3:"Ｊ";s:3:"ｊ";s:3:"Ｋ";s:3:"ｋ";s:3:"Ｌ";s:3:"ｌ";s:3:"Ｍ";s:3:"ｍ";s:3:"Ｎ";s:3:"ｎ";s:3:"Ｏ";s:3:"ｏ";s:3:"Ｐ";s:3:"ｐ";s:3:"Ｑ";s:3:"ｑ";s:3:"Ｒ";s:3:"ｒ";s:3:"Ｓ";s:3:"ｓ";s:3:"Ｔ";s:3:"ｔ";s:3:"Ｕ";s:3:"ｕ";s:3:"Ｖ";s:3:"ｖ";s:3:"Ｗ";s:3:"ｗ";s:3:"Ｘ";s:3:"ｘ";s:3:"Ｙ";s:3:"ｙ";s:3:"Ｚ";s:3:"ｚ";s:4:"𐐀";s:4:"𐐨";s:4:"𐐁";s:4:"𐐩";s:4:"𐐂";s:4:"𐐪";s:4:"𐐃";s:4:"𐐫";s:4:"𐐄";s:4:"𐐬";s:4:"𐐅";s:4:"𐐭";s:4:"𐐆";s:4:"𐐮";s:4:"𐐇";s:4:"𐐯";s:4:"𐐈";s:4:"𐐰";s:4:"𐐉";s:4:"𐐱";s:4:"𐐊";s:4:"𐐲";s:4:"𐐋";s:4:"𐐳";s:4:"𐐌";s:4:"𐐴";s:4:"𐐍";s:4:"𐐵";s:4:"𐐎";s:4:"𐐶";s:4:"𐐏";s:4:"𐐷";s:4:"𐐐";s:4:"𐐸";s:4:"𐐑";s:4:"𐐹";s:4:"𐐒";s:4:"𐐺";s:4:"𐐓";s:4:"𐐻";s:4:"𐐔";s:4:"𐐼";s:4:"𐐕";s:4:"𐐽";s:4:"𐐖";s:4:"𐐾";s:4:"𐐗";s:4:"𐐿";s:4:"𐐘";s:4:"𐑀";s:4:"𐐙";s:4:"𐑁";s:4:"𐐚";s:4:"𐑂";s:4:"𐐛";s:4:"𐑃";s:4:"𐐜";s:4:"𐑄";s:4:"𐐝";s:4:"𐑅";s:4:"𐐞";s:4:"𐑆";s:4:"𐐟";s:4:"𐑇";s:4:"𐐠";s:4:"𐑈";s:4:"𐐡";s:4:"𐑉";s:4:"𐐢";s:4:"𐑊";s:4:"𐐣";s:4:"𐑋";s:4:"𐐤";s:4:"𐑌";s:4:"𐐥";s:4:"𐑍";s:4:"𐐦";s:4:"𐑎";s:4:"𐐧";s:4:"𐑏";s:4:"𑢠";s:4:"𑣀";s:4:"𑢡";s:4:"𑣁";s:4:"𑢢";s:4:"𑣂";s:4:"𑢣";s:4:"𑣃";s:4:"𑢤";s:4:"𑣄";s:4:"𑢥";s:4:"𑣅";s:4:"𑢦";s:4:"𑣆";s:4:"𑢧";s:4:"𑣇";s:4:"𑢨";s:4:"𑣈";s:4:"𑢩";s:4:"𑣉";s:4:"𑢪";s:4:"𑣊";s:4:"𑢫";s:4:"𑣋";s:4:"𑢬";s:4:"𑣌";s:4:"𑢭";s:4:"𑣍";s:4:"𑢮";s:4:"𑣎";s:4:"𑢯";s:4:"𑣏";s:4:"𑢰";s:4:"𑣐";s:4:"𑢱";s:4:"𑣑";s:4:"𑢲";s:4:"𑣒";s:4:"𑢳";s:4:"𑣓";s:4:"𑢴";s:4:"𑣔";s:4:"𑢵";s:4:"𑣕";s:4:"𑢶";s:4:"𑣖";s:4:"𑢷";s:4:"𑣗";s:4:"𑢸";s:4:"𑣘";s:4:"𑢹";s:4:"𑣙";s:4:"𑢺";s:4:"𑣚";s:4:"𑢻";s:4:"𑣛";s:4:"𑢼";s:4:"𑣜";s:4:"𑢽";s:4:"𑣝";s:4:"𑢾";s:4:"𑣞";s:4:"𑢿";s:4:"𑣟";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/PHP/Shim/unidata/upperCase.ser
@@ -0,0 +1 @@
+a:1100:{s:1:"a";s:1:"A";s:1:"b";s:1:"B";s:1:"c";s:1:"C";s:1:"d";s:1:"D";s:1:"e";s:1:"E";s:1:"f";s:1:"F";s:1:"g";s:1:"G";s:1:"h";s:1:"H";s:1:"i";s:1:"I";s:1:"j";s:1:"J";s:1:"k";s:1:"K";s:1:"l";s:1:"L";s:1:"m";s:1:"M";s:1:"n";s:1:"N";s:1:"o";s:1:"O";s:1:"p";s:1:"P";s:1:"q";s:1:"Q";s:1:"r";s:1:"R";s:1:"s";s:1:"S";s:1:"t";s:1:"T";s:1:"u";s:1:"U";s:1:"v";s:1:"V";s:1:"w";s:1:"W";s:1:"x";s:1:"X";s:1:"y";s:1:"Y";s:1:"z";s:1:"Z";s:2:"µ";s:2:"Μ";s:2:"à";s:2:"À";s:2:"á";s:2:"Á";s:2:"â";s:2:"Â";s:2:"ã";s:2:"Ã";s:2:"ä";s:2:"Ä";s:2:"å";s:2:"Å";s:2:"æ";s:2:"Æ";s:2:"ç";s:2:"Ç";s:2:"è";s:2:"È";s:2:"é";s:2:"É";s:2:"ê";s:2:"Ê";s:2:"ë";s:2:"Ë";s:2:"ì";s:2:"Ì";s:2:"í";s:2:"Í";s:2:"î";s:2:"Î";s:2:"ï";s:2:"Ï";s:2:"ð";s:2:"Ð";s:2:"ñ";s:2:"Ñ";s:2:"ò";s:2:"Ò";s:2:"ó";s:2:"Ó";s:2:"ô";s:2:"Ô";s:2:"õ";s:2:"Õ";s:2:"ö";s:2:"Ö";s:2:"ø";s:2:"Ø";s:2:"ù";s:2:"Ù";s:2:"ú";s:2:"Ú";s:2:"û";s:2:"Û";s:2:"ü";s:2:"Ü";s:2:"ý";s:2:"Ý";s:2:"þ";s:2:"Þ";s:2:"ÿ";s:2:"Ÿ";s:2:"ā";s:2:"Ā";s:2:"ă";s:2:"Ă";s:2:"ą";s:2:"Ą";s:2:"ć";s:2:"Ć";s:2:"ĉ";s:2:"Ĉ";s:2:"ċ";s:2:"Ċ";s:2:"č";s:2:"Č";s:2:"ď";s:2:"Ď";s:2:"đ";s:2:"Đ";s:2:"ē";s:2:"Ē";s:2:"ĕ";s:2:"Ĕ";s:2:"ė";s:2:"Ė";s:2:"ę";s:2:"Ę";s:2:"ě";s:2:"Ě";s:2:"ĝ";s:2:"Ĝ";s:2:"ğ";s:2:"Ğ";s:2:"ġ";s:2:"Ġ";s:2:"ģ";s:2:"Ģ";s:2:"ĥ";s:2:"Ĥ";s:2:"ħ";s:2:"Ħ";s:2:"ĩ";s:2:"Ĩ";s:2:"ī";s:2:"Ī";s:2:"ĭ";s:2:"Ĭ";s:2:"į";s:2:"Į";s:2:"ı";s:1:"I";s:2:"ĳ";s:2:"Ĳ";s:2:"ĵ";s:2:"Ĵ";s:2:"ķ";s:2:"Ķ";s:2:"ĺ";s:2:"Ĺ";s:2:"ļ";s:2:"Ļ";s:2:"ľ";s:2:"Ľ";s:2:"ŀ";s:2:"Ŀ";s:2:"ł";s:2:"Ł";s:2:"ń";s:2:"Ń";s:2:"ņ";s:2:"Ņ";s:2:"ň";s:2:"Ň";s:2:"ŋ";s:2:"Ŋ";s:2:"ō";s:2:"Ō";s:2:"ŏ";s:2:"Ŏ";s:2:"ő";s:2:"Ő";s:2:"œ";s:2:"Œ";s:2:"ŕ";s:2:"Ŕ";s:2:"ŗ";s:2:"Ŗ";s:2:"ř";s:2:"Ř";s:2:"ś";s:2:"Ś";s:2:"ŝ";s:2:"Ŝ";s:2:"ş";s:2:"Ş";s:2:"š";s:2:"Š";s:2:"ţ";s:2:"Ţ";s:2:"ť";s:2:"Ť";s:2:"ŧ";s:2:"Ŧ";s:2:"ũ";s:2:"Ũ";s:2:"ū";s:2:"Ū";s:2:"ŭ";s:2:"Ŭ";s:2:"ů";s:2:"Ů";s:2:"ű";s:2:"Ű";s:2:"ų";s:2:"Ų";s:2:"ŵ";s:2:"Ŵ";s:2:"ŷ";s:2:"Ŷ";s:2:"ź";s:2:"Ź";s:2:"ż";s:2:"Ż";s:2:"ž";s:2:"Ž";s:2:"ſ";s:1:"S";s:2:"ƀ";s:2:"Ƀ";s:2:"ƃ";s:2:"Ƃ";s:2:"ƅ";s:2:"Ƅ";s:2:"ƈ";s:2:"Ƈ";s:2:"ƌ";s:2:"Ƌ";s:2:"ƒ";s:2:"Ƒ";s:2:"ƕ";s:2:"Ƕ";s:2:"ƙ";s:2:"Ƙ";s:2:"ƚ";s:2:"Ƚ";s:2:"ƞ";s:2:"Ƞ";s:2:"ơ";s:2:"Ơ";s:2:"ƣ";s:2:"Ƣ";s:2:"ƥ";s:2:"Ƥ";s:2:"ƨ";s:2:"Ƨ";s:2:"ƭ";s:2:"Ƭ";s:2:"ư";s:2:"Ư";s:2:"ƴ";s:2:"Ƴ";s:2:"ƶ";s:2:"Ƶ";s:2:"ƹ";s:2:"Ƹ";s:2:"ƽ";s:2:"Ƽ";s:2:"ƿ";s:2:"Ƿ";s:2:"ǅ";s:2:"Ǆ";s:2:"ǆ";s:2:"Ǆ";s:2:"ǈ";s:2:"Ǉ";s:2:"ǉ";s:2:"Ǉ";s:2:"ǋ";s:2:"Ǌ";s:2:"ǌ";s:2:"Ǌ";s:2:"ǎ";s:2:"Ǎ";s:2:"ǐ";s:2:"Ǐ";s:2:"ǒ";s:2:"Ǒ";s:2:"ǔ";s:2:"Ǔ";s:2:"ǖ";s:2:"Ǖ";s:2:"ǘ";s:2:"Ǘ";s:2:"ǚ";s:2:"Ǚ";s:2:"ǜ";s:2:"Ǜ";s:2:"ǝ";s:2:"Ǝ";s:2:"ǟ";s:2:"Ǟ";s:2:"ǡ";s:2:"Ǡ";s:2:"ǣ";s:2:"Ǣ";s:2:"ǥ";s:2:"Ǥ";s:2:"ǧ";s:2:"Ǧ";s:2:"ǩ";s:2:"Ǩ";s:2:"ǫ";s:2:"Ǫ";s:2:"ǭ";s:2:"Ǭ";s:2:"ǯ";s:2:"Ǯ";s:2:"ǲ";s:2:"Ǳ";s:2:"ǳ";s:2:"Ǳ";s:2:"ǵ";s:2:"Ǵ";s:2:"ǹ";s:2:"Ǹ";s:2:"ǻ";s:2:"Ǻ";s:2:"ǽ";s:2:"Ǽ";s:2:"ǿ";s:2:"Ǿ";s:2:"ȁ";s:2:"Ȁ";s:2:"ȃ";s:2:"Ȃ";s:2:"ȅ";s:2:"Ȅ";s:2:"ȇ";s:2:"Ȇ";s:2:"ȉ";s:2:"Ȉ";s:2:"ȋ";s:2:"Ȋ";s:2:"ȍ";s:2:"Ȍ";s:2:"ȏ";s:2:"Ȏ";s:2:"ȑ";s:2:"Ȑ";s:2:"ȓ";s:2:"Ȓ";s:2:"ȕ";s:2:"Ȕ";s:2:"ȗ";s:2:"Ȗ";s:2:"ș";s:2:"Ș";s:2:"ț";s:2:"Ț";s:2:"ȝ";s:2:"Ȝ";s:2:"ȟ";s:2:"Ȟ";s:2:"ȣ";s:2:"Ȣ";s:2:"ȥ";s:2:"Ȥ";s:2:"ȧ";s:2:"Ȧ";s:2:"ȩ";s:2:"Ȩ";s:2:"ȫ";s:2:"Ȫ";s:2:"ȭ";s:2:"Ȭ";s:2:"ȯ";s:2:"Ȯ";s:2:"ȱ";s:2:"Ȱ";s:2:"ȳ";s:2:"Ȳ";s:2:"ȼ";s:2:"Ȼ";s:2:"ȿ";s:3:"Ȿ";s:2:"ɀ";s:3:"Ɀ";s:2:"ɂ";s:2:"Ɂ";s:2:"ɇ";s:2:"Ɇ";s:2:"ɉ";s:2:"Ɉ";s:2:"ɋ";s:2:"Ɋ";s:2:"ɍ";s:2:"Ɍ";s:2:"ɏ";s:2:"Ɏ";s:2:"ɐ";s:3:"Ɐ";s:2:"ɑ";s:3:"Ɑ";s:2:"ɒ";s:3:"Ɒ";s:2:"ɓ";s:2:"Ɓ";s:2:"ɔ";s:2:"Ɔ";s:2:"ɖ";s:2:"Ɖ";s:2:"ɗ";s:2:"Ɗ";s:2:"ə";s:2:"Ə";s:2:"ɛ";s:2:"Ɛ";s:2:"ɜ";s:3:"Ɜ";s:2:"ɠ";s:2:"Ɠ";s:2:"ɡ";s:3:"Ɡ";s:2:"ɣ";s:2:"Ɣ";s:2:"ɥ";s:3:"Ɥ";s:2:"ɦ";s:3:"Ɦ";s:2:"ɨ";s:2:"Ɨ";s:2:"ɩ";s:2:"Ɩ";s:2:"ɫ";s:3:"Ɫ";s:2:"ɬ";s:3:"Ɬ";s:2:"ɯ";s:2:"Ɯ";s:2:"ɱ";s:3:"Ɱ";s:2:"ɲ";s:2:"Ɲ";s:2:"ɵ";s:2:"Ɵ";s:2:"ɽ";s:3:"Ɽ";s:2:"ʀ";s:2:"Ʀ";s:2:"ʃ";s:2:"Ʃ";s:2:"ʇ";s:3:"Ʇ";s:2:"ʈ";s:2:"Ʈ";s:2:"ʉ";s:2:"Ʉ";s:2:"ʊ";s:2:"Ʊ";s:2:"ʋ";s:2:"Ʋ";s:2:"ʌ";s:2:"Ʌ";s:2:"ʒ";s:2:"Ʒ";s:2:"ʞ";s:3:"Ʞ";s:2:"ͅ";s:2:"Ι";s:2:"ͱ";s:2:"Ͱ";s:2:"ͳ";s:2:"Ͳ";s:2:"ͷ";s:2:"Ͷ";s:2:"ͻ";s:2:"Ͻ";s:2:"ͼ";s:2:"Ͼ";s:2:"ͽ";s:2:"Ͽ";s:2:"ά";s:2:"Ά";s:2:"έ";s:2:"Έ";s:2:"ή";s:2:"Ή";s:2:"ί";s:2:"Ί";s:2:"α";s:2:"Α";s:2:"β";s:2:"Β";s:2:"γ";s:2:"Γ";s:2:"δ";s:2:"Δ";s:2:"ε";s:2:"Ε";s:2:"ζ";s:2:"Ζ";s:2:"η";s:2:"Η";s:2:"θ";s:2:"Θ";s:2:"ι";s:2:"Ι";s:2:"κ";s:2:"Κ";s:2:"λ";s:2:"Λ";s:2:"μ";s:2:"Μ";s:2:"ν";s:2:"Ν";s:2:"ξ";s:2:"Ξ";s:2:"ο";s:2:"Ο";s:2:"π";s:2:"Π";s:2:"ρ";s:2:"Ρ";s:2:"ς";s:2:"Σ";s:2:"σ";s:2:"Σ";s:2:"τ";s:2:"Τ";s:2:"υ";s:2:"Υ";s:2:"φ";s:2:"Φ";s:2:"χ";s:2:"Χ";s:2:"ψ";s:2:"Ψ";s:2:"ω";s:2:"Ω";s:2:"ϊ";s:2:"Ϊ";s:2:"ϋ";s:2:"Ϋ";s:2:"ό";s:2:"Ό";s:2:"ύ";s:2:"Ύ";s:2:"ώ";s:2:"Ώ";s:2:"ϐ";s:2:"Β";s:2:"ϑ";s:2:"Θ";s:2:"ϕ";s:2:"Φ";s:2:"ϖ";s:2:"Π";s:2:"ϗ";s:2:"Ϗ";s:2:"ϙ";s:2:"Ϙ";s:2:"ϛ";s:2:"Ϛ";s:2:"ϝ";s:2:"Ϝ";s:2:"ϟ";s:2:"Ϟ";s:2:"ϡ";s:2:"Ϡ";s:2:"ϣ";s:2:"Ϣ";s:2:"ϥ";s:2:"Ϥ";s:2:"ϧ";s:2:"Ϧ";s:2:"ϩ";s:2:"Ϩ";s:2:"ϫ";s:2:"Ϫ";s:2:"ϭ";s:2:"Ϭ";s:2:"ϯ";s:2:"Ϯ";s:2:"ϰ";s:2:"Κ";s:2:"ϱ";s:2:"Ρ";s:2:"ϲ";s:2:"Ϲ";s:2:"ϳ";s:2:"Ϳ";s:2:"ϵ";s:2:"Ε";s:2:"ϸ";s:2:"Ϸ";s:2:"ϻ";s:2:"Ϻ";s:2:"а";s:2:"А";s:2:"б";s:2:"Б";s:2:"в";s:2:"В";s:2:"г";s:2:"Г";s:2:"д";s:2:"Д";s:2:"е";s:2:"Е";s:2:"ж";s:2:"Ж";s:2:"з";s:2:"З";s:2:"и";s:2:"И";s:2:"й";s:2:"Й";s:2:"к";s:2:"К";s:2:"л";s:2:"Л";s:2:"м";s:2:"М";s:2:"н";s:2:"Н";s:2:"о";s:2:"О";s:2:"п";s:2:"П";s:2:"р";s:2:"Р";s:2:"с";s:2:"С";s:2:"т";s:2:"Т";s:2:"у";s:2:"У";s:2:"ф";s:2:"Ф";s:2:"х";s:2:"Х";s:2:"ц";s:2:"Ц";s:2:"ч";s:2:"Ч";s:2:"ш";s:2:"Ш";s:2:"щ";s:2:"Щ";s:2:"ъ";s:2:"Ъ";s:2:"ы";s:2:"Ы";s:2:"ь";s:2:"Ь";s:2:"э";s:2:"Э";s:2:"ю";s:2:"Ю";s:2:"я";s:2:"Я";s:2:"ѐ";s:2:"Ѐ";s:2:"ё";s:2:"Ё";s:2:"ђ";s:2:"Ђ";s:2:"ѓ";s:2:"Ѓ";s:2:"є";s:2:"Є";s:2:"ѕ";s:2:"Ѕ";s:2:"і";s:2:"І";s:2:"ї";s:2:"Ї";s:2:"ј";s:2:"Ј";s:2:"љ";s:2:"Љ";s:2:"њ";s:2:"Њ";s:2:"ћ";s:2:"Ћ";s:2:"ќ";s:2:"Ќ";s:2:"ѝ";s:2:"Ѝ";s:2:"ў";s:2:"Ў";s:2:"џ";s:2:"Џ";s:2:"ѡ";s:2:"Ѡ";s:2:"ѣ";s:2:"Ѣ";s:2:"ѥ";s:2:"Ѥ";s:2:"ѧ";s:2:"Ѧ";s:2:"ѩ";s:2:"Ѩ";s:2:"ѫ";s:2:"Ѫ";s:2:"ѭ";s:2:"Ѭ";s:2:"ѯ";s:2:"Ѯ";s:2:"ѱ";s:2:"Ѱ";s:2:"ѳ";s:2:"Ѳ";s:2:"ѵ";s:2:"Ѵ";s:2:"ѷ";s:2:"Ѷ";s:2:"ѹ";s:2:"Ѹ";s:2:"ѻ";s:2:"Ѻ";s:2:"ѽ";s:2:"Ѽ";s:2:"ѿ";s:2:"Ѿ";s:2:"ҁ";s:2:"Ҁ";s:2:"ҋ";s:2:"Ҋ";s:2:"ҍ";s:2:"Ҍ";s:2:"ҏ";s:2:"Ҏ";s:2:"ґ";s:2:"Ґ";s:2:"ғ";s:2:"Ғ";s:2:"ҕ";s:2:"Ҕ";s:2:"җ";s:2:"Җ";s:2:"ҙ";s:2:"Ҙ";s:2:"қ";s:2:"Қ";s:2:"ҝ";s:2:"Ҝ";s:2:"ҟ";s:2:"Ҟ";s:2:"ҡ";s:2:"Ҡ";s:2:"ң";s:2:"Ң";s:2:"ҥ";s:2:"Ҥ";s:2:"ҧ";s:2:"Ҧ";s:2:"ҩ";s:2:"Ҩ";s:2:"ҫ";s:2:"Ҫ";s:2:"ҭ";s:2:"Ҭ";s:2:"ү";s:2:"Ү";s:2:"ұ";s:2:"Ұ";s:2:"ҳ";s:2:"Ҳ";s:2:"ҵ";s:2:"Ҵ";s:2:"ҷ";s:2:"Ҷ";s:2:"ҹ";s:2:"Ҹ";s:2:"һ";s:2:"Һ";s:2:"ҽ";s:2:"Ҽ";s:2:"ҿ";s:2:"Ҿ";s:2:"ӂ";s:2:"Ӂ";s:2:"ӄ";s:2:"Ӄ";s:2:"ӆ";s:2:"Ӆ";s:2:"ӈ";s:2:"Ӈ";s:2:"ӊ";s:2:"Ӊ";s:2:"ӌ";s:2:"Ӌ";s:2:"ӎ";s:2:"Ӎ";s:2:"ӏ";s:2:"Ӏ";s:2:"ӑ";s:2:"Ӑ";s:2:"ӓ";s:2:"Ӓ";s:2:"ӕ";s:2:"Ӕ";s:2:"ӗ";s:2:"Ӗ";s:2:"ә";s:2:"Ә";s:2:"ӛ";s:2:"Ӛ";s:2:"ӝ";s:2:"Ӝ";s:2:"ӟ";s:2:"Ӟ";s:2:"ӡ";s:2:"Ӡ";s:2:"ӣ";s:2:"Ӣ";s:2:"ӥ";s:2:"Ӥ";s:2:"ӧ";s:2:"Ӧ";s:2:"ө";s:2:"Ө";s:2:"ӫ";s:2:"Ӫ";s:2:"ӭ";s:2:"Ӭ";s:2:"ӯ";s:2:"Ӯ";s:2:"ӱ";s:2:"Ӱ";s:2:"ӳ";s:2:"Ӳ";s:2:"ӵ";s:2:"Ӵ";s:2:"ӷ";s:2:"Ӷ";s:2:"ӹ";s:2:"Ӹ";s:2:"ӻ";s:2:"Ӻ";s:2:"ӽ";s:2:"Ӽ";s:2:"ӿ";s:2:"Ӿ";s:2:"ԁ";s:2:"Ԁ";s:2:"ԃ";s:2:"Ԃ";s:2:"ԅ";s:2:"Ԅ";s:2:"ԇ";s:2:"Ԇ";s:2:"ԉ";s:2:"Ԉ";s:2:"ԋ";s:2:"Ԋ";s:2:"ԍ";s:2:"Ԍ";s:2:"ԏ";s:2:"Ԏ";s:2:"ԑ";s:2:"Ԑ";s:2:"ԓ";s:2:"Ԓ";s:2:"ԕ";s:2:"Ԕ";s:2:"ԗ";s:2:"Ԗ";s:2:"ԙ";s:2:"Ԙ";s:2:"ԛ";s:2:"Ԛ";s:2:"ԝ";s:2:"Ԝ";s:2:"ԟ";s:2:"Ԟ";s:2:"ԡ";s:2:"Ԡ";s:2:"ԣ";s:2:"Ԣ";s:2:"ԥ";s:2:"Ԥ";s:2:"ԧ";s:2:"Ԧ";s:2:"ԩ";s:2:"Ԩ";s:2:"ԫ";s:2:"Ԫ";s:2:"ԭ";s:2:"Ԭ";s:2:"ԯ";s:2:"Ԯ";s:2:"ա";s:2:"Ա";s:2:"բ";s:2:"Բ";s:2:"գ";s:2:"Գ";s:2:"դ";s:2:"Դ";s:2:"ե";s:2:"Ե";s:2:"զ";s:2:"Զ";s:2:"է";s:2:"Է";s:2:"ը";s:2:"Ը";s:2:"թ";s:2:"Թ";s:2:"ժ";s:2:"Ժ";s:2:"ի";s:2:"Ի";s:2:"լ";s:2:"Լ";s:2:"խ";s:2:"Խ";s:2:"ծ";s:2:"Ծ";s:2:"կ";s:2:"Կ";s:2:"հ";s:2:"Հ";s:2:"ձ";s:2:"Ձ";s:2:"ղ";s:2:"Ղ";s:2:"ճ";s:2:"Ճ";s:2:"մ";s:2:"Մ";s:2:"յ";s:2:"Յ";s:2:"ն";s:2:"Ն";s:2:"շ";s:2:"Շ";s:2:"ո";s:2:"Ո";s:2:"չ";s:2:"Չ";s:2:"պ";s:2:"Պ";s:2:"ջ";s:2:"Ջ";s:2:"ռ";s:2:"Ռ";s:2:"ս";s:2:"Ս";s:2:"վ";s:2:"Վ";s:2:"տ";s:2:"Տ";s:2:"ր";s:2:"Ր";s:2:"ց";s:2:"Ց";s:2:"ւ";s:2:"Ւ";s:2:"փ";s:2:"Փ";s:2:"ք";s:2:"Ք";s:2:"օ";s:2:"Օ";s:2:"ֆ";s:2:"Ֆ";s:3:"ᵹ";s:3:"Ᵹ";s:3:"ᵽ";s:3:"Ᵽ";s:3:"ḁ";s:3:"Ḁ";s:3:"ḃ";s:3:"Ḃ";s:3:"ḅ";s:3:"Ḅ";s:3:"ḇ";s:3:"Ḇ";s:3:"ḉ";s:3:"Ḉ";s:3:"ḋ";s:3:"Ḋ";s:3:"ḍ";s:3:"Ḍ";s:3:"ḏ";s:3:"Ḏ";s:3:"ḑ";s:3:"Ḑ";s:3:"ḓ";s:3:"Ḓ";s:3:"ḕ";s:3:"Ḕ";s:3:"ḗ";s:3:"Ḗ";s:3:"ḙ";s:3:"Ḙ";s:3:"ḛ";s:3:"Ḛ";s:3:"ḝ";s:3:"Ḝ";s:3:"ḟ";s:3:"Ḟ";s:3:"ḡ";s:3:"Ḡ";s:3:"ḣ";s:3:"Ḣ";s:3:"ḥ";s:3:"Ḥ";s:3:"ḧ";s:3:"Ḧ";s:3:"ḩ";s:3:"Ḩ";s:3:"ḫ";s:3:"Ḫ";s:3:"ḭ";s:3:"Ḭ";s:3:"ḯ";s:3:"Ḯ";s:3:"ḱ";s:3:"Ḱ";s:3:"ḳ";s:3:"Ḳ";s:3:"ḵ";s:3:"Ḵ";s:3:"ḷ";s:3:"Ḷ";s:3:"ḹ";s:3:"Ḹ";s:3:"ḻ";s:3:"Ḻ";s:3:"ḽ";s:3:"Ḽ";s:3:"ḿ";s:3:"Ḿ";s:3:"ṁ";s:3:"Ṁ";s:3:"ṃ";s:3:"Ṃ";s:3:"ṅ";s:3:"Ṅ";s:3:"ṇ";s:3:"Ṇ";s:3:"ṉ";s:3:"Ṉ";s:3:"ṋ";s:3:"Ṋ";s:3:"ṍ";s:3:"Ṍ";s:3:"ṏ";s:3:"Ṏ";s:3:"ṑ";s:3:"Ṑ";s:3:"ṓ";s:3:"Ṓ";s:3:"ṕ";s:3:"Ṕ";s:3:"ṗ";s:3:"Ṗ";s:3:"ṙ";s:3:"Ṙ";s:3:"ṛ";s:3:"Ṛ";s:3:"ṝ";s:3:"Ṝ";s:3:"ṟ";s:3:"Ṟ";s:3:"ṡ";s:3:"Ṡ";s:3:"ṣ";s:3:"Ṣ";s:3:"ṥ";s:3:"Ṥ";s:3:"ṧ";s:3:"Ṧ";s:3:"ṩ";s:3:"Ṩ";s:3:"ṫ";s:3:"Ṫ";s:3:"ṭ";s:3:"Ṭ";s:3:"ṯ";s:3:"Ṯ";s:3:"ṱ";s:3:"Ṱ";s:3:"ṳ";s:3:"Ṳ";s:3:"ṵ";s:3:"Ṵ";s:3:"ṷ";s:3:"Ṷ";s:3:"ṹ";s:3:"Ṹ";s:3:"ṻ";s:3:"Ṻ";s:3:"ṽ";s:3:"Ṽ";s:3:"ṿ";s:3:"Ṿ";s:3:"ẁ";s:3:"Ẁ";s:3:"ẃ";s:3:"Ẃ";s:3:"ẅ";s:3:"Ẅ";s:3:"ẇ";s:3:"Ẇ";s:3:"ẉ";s:3:"Ẉ";s:3:"ẋ";s:3:"Ẋ";s:3:"ẍ";s:3:"Ẍ";s:3:"ẏ";s:3:"Ẏ";s:3:"ẑ";s:3:"Ẑ";s:3:"ẓ";s:3:"Ẓ";s:3:"ẕ";s:3:"Ẕ";s:3:"ẛ";s:3:"Ṡ";s:3:"ạ";s:3:"Ạ";s:3:"ả";s:3:"Ả";s:3:"ấ";s:3:"Ấ";s:3:"ầ";s:3:"Ầ";s:3:"ẩ";s:3:"Ẩ";s:3:"ẫ";s:3:"Ẫ";s:3:"ậ";s:3:"Ậ";s:3:"ắ";s:3:"Ắ";s:3:"ằ";s:3:"Ằ";s:3:"ẳ";s:3:"Ẳ";s:3:"ẵ";s:3:"Ẵ";s:3:"ặ";s:3:"Ặ";s:3:"ẹ";s:3:"Ẹ";s:3:"ẻ";s:3:"Ẻ";s:3:"ẽ";s:3:"Ẽ";s:3:"ế";s:3:"Ế";s:3:"ề";s:3:"Ề";s:3:"ể";s:3:"Ể";s:3:"ễ";s:3:"Ễ";s:3:"ệ";s:3:"Ệ";s:3:"ỉ";s:3:"Ỉ";s:3:"ị";s:3:"Ị";s:3:"ọ";s:3:"Ọ";s:3:"ỏ";s:3:"Ỏ";s:3:"ố";s:3:"Ố";s:3:"ồ";s:3:"Ồ";s:3:"ổ";s:3:"Ổ";s:3:"ỗ";s:3:"Ỗ";s:3:"ộ";s:3:"Ộ";s:3:"ớ";s:3:"Ớ";s:3:"ờ";s:3:"Ờ";s:3:"ở";s:3:"Ở";s:3:"ỡ";s:3:"Ỡ";s:3:"ợ";s:3:"Ợ";s:3:"ụ";s:3:"Ụ";s:3:"ủ";s:3:"Ủ";s:3:"ứ";s:3:"Ứ";s:3:"ừ";s:3:"Ừ";s:3:"ử";s:3:"Ử";s:3:"ữ";s:3:"Ữ";s:3:"ự";s:3:"Ự";s:3:"ỳ";s:3:"Ỳ";s:3:"ỵ";s:3:"Ỵ";s:3:"ỷ";s:3:"Ỷ";s:3:"ỹ";s:3:"Ỹ";s:3:"ỻ";s:3:"Ỻ";s:3:"ỽ";s:3:"Ỽ";s:3:"ỿ";s:3:"Ỿ";s:3:"ἀ";s:3:"Ἀ";s:3:"ἁ";s:3:"Ἁ";s:3:"ἂ";s:3:"Ἂ";s:3:"ἃ";s:3:"Ἃ";s:3:"ἄ";s:3:"Ἄ";s:3:"ἅ";s:3:"Ἅ";s:3:"ἆ";s:3:"Ἆ";s:3:"ἇ";s:3:"Ἇ";s:3:"ἐ";s:3:"Ἐ";s:3:"ἑ";s:3:"Ἑ";s:3:"ἒ";s:3:"Ἒ";s:3:"ἓ";s:3:"Ἓ";s:3:"ἔ";s:3:"Ἔ";s:3:"ἕ";s:3:"Ἕ";s:3:"ἠ";s:3:"Ἠ";s:3:"ἡ";s:3:"Ἡ";s:3:"ἢ";s:3:"Ἢ";s:3:"ἣ";s:3:"Ἣ";s:3:"ἤ";s:3:"Ἤ";s:3:"ἥ";s:3:"Ἥ";s:3:"ἦ";s:3:"Ἦ";s:3:"ἧ";s:3:"Ἧ";s:3:"ἰ";s:3:"Ἰ";s:3:"ἱ";s:3:"Ἱ";s:3:"ἲ";s:3:"Ἲ";s:3:"ἳ";s:3:"Ἳ";s:3:"ἴ";s:3:"Ἴ";s:3:"ἵ";s:3:"Ἵ";s:3:"ἶ";s:3:"Ἶ";s:3:"ἷ";s:3:"Ἷ";s:3:"ὀ";s:3:"Ὀ";s:3:"ὁ";s:3:"Ὁ";s:3:"ὂ";s:3:"Ὂ";s:3:"ὃ";s:3:"Ὃ";s:3:"ὄ";s:3:"Ὄ";s:3:"ὅ";s:3:"Ὅ";s:3:"ὑ";s:3:"Ὑ";s:3:"ὓ";s:3:"Ὓ";s:3:"ὕ";s:3:"Ὕ";s:3:"ὗ";s:3:"Ὗ";s:3:"ὠ";s:3:"Ὠ";s:3:"ὡ";s:3:"Ὡ";s:3:"ὢ";s:3:"Ὢ";s:3:"ὣ";s:3:"Ὣ";s:3:"ὤ";s:3:"Ὤ";s:3:"ὥ";s:3:"Ὥ";s:3:"ὦ";s:3:"Ὦ";s:3:"ὧ";s:3:"Ὧ";s:3:"ὰ";s:3:"Ὰ";s:3:"ά";s:3:"Ά";s:3:"ὲ";s:3:"Ὲ";s:3:"έ";s:3:"Έ";s:3:"ὴ";s:3:"Ὴ";s:3:"ή";s:3:"Ή";s:3:"ὶ";s:3:"Ὶ";s:3:"ί";s:3:"Ί";s:3:"ὸ";s:3:"Ὸ";s:3:"ό";s:3:"Ό";s:3:"ὺ";s:3:"Ὺ";s:3:"ύ";s:3:"Ύ";s:3:"ὼ";s:3:"Ὼ";s:3:"ώ";s:3:"Ώ";s:3:"ᾀ";s:3:"ᾈ";s:3:"ᾁ";s:3:"ᾉ";s:3:"ᾂ";s:3:"ᾊ";s:3:"ᾃ";s:3:"ᾋ";s:3:"ᾄ";s:3:"ᾌ";s:3:"ᾅ";s:3:"ᾍ";s:3:"ᾆ";s:3:"ᾎ";s:3:"ᾇ";s:3:"ᾏ";s:3:"ᾐ";s:3:"ᾘ";s:3:"ᾑ";s:3:"ᾙ";s:3:"ᾒ";s:3:"ᾚ";s:3:"ᾓ";s:3:"ᾛ";s:3:"ᾔ";s:3:"ᾜ";s:3:"ᾕ";s:3:"ᾝ";s:3:"ᾖ";s:3:"ᾞ";s:3:"ᾗ";s:3:"ᾟ";s:3:"ᾠ";s:3:"ᾨ";s:3:"ᾡ";s:3:"ᾩ";s:3:"ᾢ";s:3:"ᾪ";s:3:"ᾣ";s:3:"ᾫ";s:3:"ᾤ";s:3:"ᾬ";s:3:"ᾥ";s:3:"ᾭ";s:3:"ᾦ";s:3:"ᾮ";s:3:"ᾧ";s:3:"ᾯ";s:3:"ᾰ";s:3:"Ᾰ";s:3:"ᾱ";s:3:"Ᾱ";s:3:"ᾳ";s:3:"ᾼ";s:3:"ι";s:2:"Ι";s:3:"ῃ";s:3:"ῌ";s:3:"ῐ";s:3:"Ῐ";s:3:"ῑ";s:3:"Ῑ";s:3:"ῠ";s:3:"Ῠ";s:3:"ῡ";s:3:"Ῡ";s:3:"ῥ";s:3:"Ῥ";s:3:"ῳ";s:3:"ῼ";s:3:"ⅎ";s:3:"Ⅎ";s:3:"ⅰ";s:3:"Ⅰ";s:3:"ⅱ";s:3:"Ⅱ";s:3:"ⅲ";s:3:"Ⅲ";s:3:"ⅳ";s:3:"Ⅳ";s:3:"ⅴ";s:3:"Ⅴ";s:3:"ⅵ";s:3:"Ⅵ";s:3:"ⅶ";s:3:"Ⅶ";s:3:"ⅷ";s:3:"Ⅷ";s:3:"ⅸ";s:3:"Ⅸ";s:3:"ⅹ";s:3:"Ⅹ";s:3:"ⅺ";s:3:"Ⅺ";s:3:"ⅻ";s:3:"Ⅻ";s:3:"ⅼ";s:3:"Ⅼ";s:3:"ⅽ";s:3:"Ⅽ";s:3:"ⅾ";s:3:"Ⅾ";s:3:"ⅿ";s:3:"Ⅿ";s:3:"ↄ";s:3:"Ↄ";s:3:"ⓐ";s:3:"Ⓐ";s:3:"ⓑ";s:3:"Ⓑ";s:3:"ⓒ";s:3:"Ⓒ";s:3:"ⓓ";s:3:"Ⓓ";s:3:"ⓔ";s:3:"Ⓔ";s:3:"ⓕ";s:3:"Ⓕ";s:3:"ⓖ";s:3:"Ⓖ";s:3:"ⓗ";s:3:"Ⓗ";s:3:"ⓘ";s:3:"Ⓘ";s:3:"ⓙ";s:3:"Ⓙ";s:3:"ⓚ";s:3:"Ⓚ";s:3:"ⓛ";s:3:"Ⓛ";s:3:"ⓜ";s:3:"Ⓜ";s:3:"ⓝ";s:3:"Ⓝ";s:3:"ⓞ";s:3:"Ⓞ";s:3:"ⓟ";s:3:"Ⓟ";s:3:"ⓠ";s:3:"Ⓠ";s:3:"ⓡ";s:3:"Ⓡ";s:3:"ⓢ";s:3:"Ⓢ";s:3:"ⓣ";s:3:"Ⓣ";s:3:"ⓤ";s:3:"Ⓤ";s:3:"ⓥ";s:3:"Ⓥ";s:3:"ⓦ";s:3:"Ⓦ";s:3:"ⓧ";s:3:"Ⓧ";s:3:"ⓨ";s:3:"Ⓨ";s:3:"ⓩ";s:3:"Ⓩ";s:3:"ⰰ";s:3:"Ⰰ";s:3:"ⰱ";s:3:"Ⰱ";s:3:"ⰲ";s:3:"Ⰲ";s:3:"ⰳ";s:3:"Ⰳ";s:3:"ⰴ";s:3:"Ⰴ";s:3:"ⰵ";s:3:"Ⰵ";s:3:"ⰶ";s:3:"Ⰶ";s:3:"ⰷ";s:3:"Ⰷ";s:3:"ⰸ";s:3:"Ⰸ";s:3:"ⰹ";s:3:"Ⰹ";s:3:"ⰺ";s:3:"Ⰺ";s:3:"ⰻ";s:3:"Ⰻ";s:3:"ⰼ";s:3:"Ⰼ";s:3:"ⰽ";s:3:"Ⰽ";s:3:"ⰾ";s:3:"Ⰾ";s:3:"ⰿ";s:3:"Ⰿ";s:3:"ⱀ";s:3:"Ⱀ";s:3:"ⱁ";s:3:"Ⱁ";s:3:"ⱂ";s:3:"Ⱂ";s:3:"ⱃ";s:3:"Ⱃ";s:3:"ⱄ";s:3:"Ⱄ";s:3:"ⱅ";s:3:"Ⱅ";s:3:"ⱆ";s:3:"Ⱆ";s:3:"ⱇ";s:3:"Ⱇ";s:3:"ⱈ";s:3:"Ⱈ";s:3:"ⱉ";s:3:"Ⱉ";s:3:"ⱊ";s:3:"Ⱊ";s:3:"ⱋ";s:3:"Ⱋ";s:3:"ⱌ";s:3:"Ⱌ";s:3:"ⱍ";s:3:"Ⱍ";s:3:"ⱎ";s:3:"Ⱎ";s:3:"ⱏ";s:3:"Ⱏ";s:3:"ⱐ";s:3:"Ⱐ";s:3:"ⱑ";s:3:"Ⱑ";s:3:"ⱒ";s:3:"Ⱒ";s:3:"ⱓ";s:3:"Ⱓ";s:3:"ⱔ";s:3:"Ⱔ";s:3:"ⱕ";s:3:"Ⱕ";s:3:"ⱖ";s:3:"Ⱖ";s:3:"ⱗ";s:3:"Ⱗ";s:3:"ⱘ";s:3:"Ⱘ";s:3:"ⱙ";s:3:"Ⱙ";s:3:"ⱚ";s:3:"Ⱚ";s:3:"ⱛ";s:3:"Ⱛ";s:3:"ⱜ";s:3:"Ⱜ";s:3:"ⱝ";s:3:"Ⱝ";s:3:"ⱞ";s:3:"Ⱞ";s:3:"ⱡ";s:3:"Ⱡ";s:3:"ⱥ";s:2:"Ⱥ";s:3:"ⱦ";s:2:"Ⱦ";s:3:"ⱨ";s:3:"Ⱨ";s:3:"ⱪ";s:3:"Ⱪ";s:3:"ⱬ";s:3:"Ⱬ";s:3:"ⱳ";s:3:"Ⱳ";s:3:"ⱶ";s:3:"Ⱶ";s:3:"ⲁ";s:3:"Ⲁ";s:3:"ⲃ";s:3:"Ⲃ";s:3:"ⲅ";s:3:"Ⲅ";s:3:"ⲇ";s:3:"Ⲇ";s:3:"ⲉ";s:3:"Ⲉ";s:3:"ⲋ";s:3:"Ⲋ";s:3:"ⲍ";s:3:"Ⲍ";s:3:"ⲏ";s:3:"Ⲏ";s:3:"ⲑ";s:3:"Ⲑ";s:3:"ⲓ";s:3:"Ⲓ";s:3:"ⲕ";s:3:"Ⲕ";s:3:"ⲗ";s:3:"Ⲗ";s:3:"ⲙ";s:3:"Ⲙ";s:3:"ⲛ";s:3:"Ⲛ";s:3:"ⲝ";s:3:"Ⲝ";s:3:"ⲟ";s:3:"Ⲟ";s:3:"ⲡ";s:3:"Ⲡ";s:3:"ⲣ";s:3:"Ⲣ";s:3:"ⲥ";s:3:"Ⲥ";s:3:"ⲧ";s:3:"Ⲧ";s:3:"ⲩ";s:3:"Ⲩ";s:3:"ⲫ";s:3:"Ⲫ";s:3:"ⲭ";s:3:"Ⲭ";s:3:"ⲯ";s:3:"Ⲯ";s:3:"ⲱ";s:3:"Ⲱ";s:3:"ⲳ";s:3:"Ⲳ";s:3:"ⲵ";s:3:"Ⲵ";s:3:"ⲷ";s:3:"Ⲷ";s:3:"ⲹ";s:3:"Ⲹ";s:3:"ⲻ";s:3:"Ⲻ";s:3:"ⲽ";s:3:"Ⲽ";s:3:"ⲿ";s:3:"Ⲿ";s:3:"ⳁ";s:3:"Ⳁ";s:3:"ⳃ";s:3:"Ⳃ";s:3:"ⳅ";s:3:"Ⳅ";s:3:"ⳇ";s:3:"Ⳇ";s:3:"ⳉ";s:3:"Ⳉ";s:3:"ⳋ";s:3:"Ⳋ";s:3:"ⳍ";s:3:"Ⳍ";s:3:"ⳏ";s:3:"Ⳏ";s:3:"ⳑ";s:3:"Ⳑ";s:3:"ⳓ";s:3:"Ⳓ";s:3:"ⳕ";s:3:"Ⳕ";s:3:"ⳗ";s:3:"Ⳗ";s:3:"ⳙ";s:3:"Ⳙ";s:3:"ⳛ";s:3:"Ⳛ";s:3:"ⳝ";s:3:"Ⳝ";s:3:"ⳟ";s:3:"Ⳟ";s:3:"ⳡ";s:3:"Ⳡ";s:3:"ⳣ";s:3:"Ⳣ";s:3:"ⳬ";s:3:"Ⳬ";s:3:"ⳮ";s:3:"Ⳮ";s:3:"ⳳ";s:3:"Ⳳ";s:3:"ⴀ";s:3:"Ⴀ";s:3:"ⴁ";s:3:"Ⴁ";s:3:"ⴂ";s:3:"Ⴂ";s:3:"ⴃ";s:3:"Ⴃ";s:3:"ⴄ";s:3:"Ⴄ";s:3:"ⴅ";s:3:"Ⴅ";s:3:"ⴆ";s:3:"Ⴆ";s:3:"ⴇ";s:3:"Ⴇ";s:3:"ⴈ";s:3:"Ⴈ";s:3:"ⴉ";s:3:"Ⴉ";s:3:"ⴊ";s:3:"Ⴊ";s:3:"ⴋ";s:3:"Ⴋ";s:3:"ⴌ";s:3:"Ⴌ";s:3:"ⴍ";s:3:"Ⴍ";s:3:"ⴎ";s:3:"Ⴎ";s:3:"ⴏ";s:3:"Ⴏ";s:3:"ⴐ";s:3:"Ⴐ";s:3:"ⴑ";s:3:"Ⴑ";s:3:"ⴒ";s:3:"Ⴒ";s:3:"ⴓ";s:3:"Ⴓ";s:3:"ⴔ";s:3:"Ⴔ";s:3:"ⴕ";s:3:"Ⴕ";s:3:"ⴖ";s:3:"Ⴖ";s:3:"ⴗ";s:3:"Ⴗ";s:3:"ⴘ";s:3:"Ⴘ";s:3:"ⴙ";s:3:"Ⴙ";s:3:"ⴚ";s:3:"Ⴚ";s:3:"ⴛ";s:3:"Ⴛ";s:3:"ⴜ";s:3:"Ⴜ";s:3:"ⴝ";s:3:"Ⴝ";s:3:"ⴞ";s:3:"Ⴞ";s:3:"ⴟ";s:3:"Ⴟ";s:3:"ⴠ";s:3:"Ⴠ";s:3:"ⴡ";s:3:"Ⴡ";s:3:"ⴢ";s:3:"Ⴢ";s:3:"ⴣ";s:3:"Ⴣ";s:3:"ⴤ";s:3:"Ⴤ";s:3:"ⴥ";s:3:"Ⴥ";s:3:"ⴧ";s:3:"Ⴧ";s:3:"ⴭ";s:3:"Ⴭ";s:3:"ꙁ";s:3:"Ꙁ";s:3:"ꙃ";s:3:"Ꙃ";s:3:"ꙅ";s:3:"Ꙅ";s:3:"ꙇ";s:3:"Ꙇ";s:3:"ꙉ";s:3:"Ꙉ";s:3:"ꙋ";s:3:"Ꙋ";s:3:"ꙍ";s:3:"Ꙍ";s:3:"ꙏ";s:3:"Ꙏ";s:3:"ꙑ";s:3:"Ꙑ";s:3:"ꙓ";s:3:"Ꙓ";s:3:"ꙕ";s:3:"Ꙕ";s:3:"ꙗ";s:3:"Ꙗ";s:3:"ꙙ";s:3:"Ꙙ";s:3:"ꙛ";s:3:"Ꙛ";s:3:"ꙝ";s:3:"Ꙝ";s:3:"ꙟ";s:3:"Ꙟ";s:3:"ꙡ";s:3:"Ꙡ";s:3:"ꙣ";s:3:"Ꙣ";s:3:"ꙥ";s:3:"Ꙥ";s:3:"ꙧ";s:3:"Ꙧ";s:3:"ꙩ";s:3:"Ꙩ";s:3:"ꙫ";s:3:"Ꙫ";s:3:"ꙭ";s:3:"Ꙭ";s:3:"ꚁ";s:3:"Ꚁ";s:3:"ꚃ";s:3:"Ꚃ";s:3:"ꚅ";s:3:"Ꚅ";s:3:"ꚇ";s:3:"Ꚇ";s:3:"ꚉ";s:3:"Ꚉ";s:3:"ꚋ";s:3:"Ꚋ";s:3:"ꚍ";s:3:"Ꚍ";s:3:"ꚏ";s:3:"Ꚏ";s:3:"ꚑ";s:3:"Ꚑ";s:3:"ꚓ";s:3:"Ꚓ";s:3:"ꚕ";s:3:"Ꚕ";s:3:"ꚗ";s:3:"Ꚗ";s:3:"ꚙ";s:3:"Ꚙ";s:3:"ꚛ";s:3:"Ꚛ";s:3:"ꜣ";s:3:"Ꜣ";s:3:"ꜥ";s:3:"Ꜥ";s:3:"ꜧ";s:3:"Ꜧ";s:3:"ꜩ";s:3:"Ꜩ";s:3:"ꜫ";s:3:"Ꜫ";s:3:"ꜭ";s:3:"Ꜭ";s:3:"ꜯ";s:3:"Ꜯ";s:3:"ꜳ";s:3:"Ꜳ";s:3:"ꜵ";s:3:"Ꜵ";s:3:"ꜷ";s:3:"Ꜷ";s:3:"ꜹ";s:3:"Ꜹ";s:3:"ꜻ";s:3:"Ꜻ";s:3:"ꜽ";s:3:"Ꜽ";s:3:"ꜿ";s:3:"Ꜿ";s:3:"ꝁ";s:3:"Ꝁ";s:3:"ꝃ";s:3:"Ꝃ";s:3:"ꝅ";s:3:"Ꝅ";s:3:"ꝇ";s:3:"Ꝇ";s:3:"ꝉ";s:3:"Ꝉ";s:3:"ꝋ";s:3:"Ꝋ";s:3:"ꝍ";s:3:"Ꝍ";s:3:"ꝏ";s:3:"Ꝏ";s:3:"ꝑ";s:3:"Ꝑ";s:3:"ꝓ";s:3:"Ꝓ";s:3:"ꝕ";s:3:"Ꝕ";s:3:"ꝗ";s:3:"Ꝗ";s:3:"ꝙ";s:3:"Ꝙ";s:3:"ꝛ";s:3:"Ꝛ";s:3:"ꝝ";s:3:"Ꝝ";s:3:"ꝟ";s:3:"Ꝟ";s:3:"ꝡ";s:3:"Ꝡ";s:3:"ꝣ";s:3:"Ꝣ";s:3:"ꝥ";s:3:"Ꝥ";s:3:"ꝧ";s:3:"Ꝧ";s:3:"ꝩ";s:3:"Ꝩ";s:3:"ꝫ";s:3:"Ꝫ";s:3:"ꝭ";s:3:"Ꝭ";s:3:"ꝯ";s:3:"Ꝯ";s:3:"ꝺ";s:3:"Ꝺ";s:3:"ꝼ";s:3:"Ꝼ";s:3:"ꝿ";s:3:"Ꝿ";s:3:"ꞁ";s:3:"Ꞁ";s:3:"ꞃ";s:3:"Ꞃ";s:3:"ꞅ";s:3:"Ꞅ";s:3:"ꞇ";s:3:"Ꞇ";s:3:"ꞌ";s:3:"Ꞌ";s:3:"ꞑ";s:3:"Ꞑ";s:3:"ꞓ";s:3:"Ꞓ";s:3:"ꞗ";s:3:"Ꞗ";s:3:"ꞙ";s:3:"Ꞙ";s:3:"ꞛ";s:3:"Ꞛ";s:3:"ꞝ";s:3:"Ꞝ";s:3:"ꞟ";s:3:"Ꞟ";s:3:"ꞡ";s:3:"Ꞡ";s:3:"ꞣ";s:3:"Ꞣ";s:3:"ꞥ";s:3:"Ꞥ";s:3:"ꞧ";s:3:"Ꞧ";s:3:"ꞩ";s:3:"Ꞩ";s:3:"ａ";s:3:"Ａ";s:3:"ｂ";s:3:"Ｂ";s:3:"ｃ";s:3:"Ｃ";s:3:"ｄ";s:3:"Ｄ";s:3:"ｅ";s:3:"Ｅ";s:3:"ｆ";s:3:"Ｆ";s:3:"ｇ";s:3:"Ｇ";s:3:"ｈ";s:3:"Ｈ";s:3:"ｉ";s:3:"Ｉ";s:3:"ｊ";s:3:"Ｊ";s:3:"ｋ";s:3:"Ｋ";s:3:"ｌ";s:3:"Ｌ";s:3:"ｍ";s:3:"Ｍ";s:3:"ｎ";s:3:"Ｎ";s:3:"ｏ";s:3:"Ｏ";s:3:"ｐ";s:3:"Ｐ";s:3:"ｑ";s:3:"Ｑ";s:3:"ｒ";s:3:"Ｒ";s:3:"ｓ";s:3:"Ｓ";s:3:"ｔ";s:3:"Ｔ";s:3:"ｕ";s:3:"Ｕ";s:3:"ｖ";s:3:"Ｖ";s:3:"ｗ";s:3:"Ｗ";s:3:"ｘ";s:3:"Ｘ";s:3:"ｙ";s:3:"Ｙ";s:3:"ｚ";s:3:"Ｚ";s:4:"𐐨";s:4:"𐐀";s:4:"𐐩";s:4:"𐐁";s:4:"𐐪";s:4:"𐐂";s:4:"𐐫";s:4:"𐐃";s:4:"𐐬";s:4:"𐐄";s:4:"𐐭";s:4:"𐐅";s:4:"𐐮";s:4:"𐐆";s:4:"𐐯";s:4:"𐐇";s:4:"𐐰";s:4:"𐐈";s:4:"𐐱";s:4:"𐐉";s:4:"𐐲";s:4:"𐐊";s:4:"𐐳";s:4:"𐐋";s:4:"𐐴";s:4:"𐐌";s:4:"𐐵";s:4:"𐐍";s:4:"𐐶";s:4:"𐐎";s:4:"𐐷";s:4:"𐐏";s:4:"𐐸";s:4:"𐐐";s:4:"𐐹";s:4:"𐐑";s:4:"𐐺";s:4:"𐐒";s:4:"𐐻";s:4:"𐐓";s:4:"𐐼";s:4:"𐐔";s:4:"𐐽";s:4:"𐐕";s:4:"𐐾";s:4:"𐐖";s:4:"𐐿";s:4:"𐐗";s:4:"𐑀";s:4:"𐐘";s:4:"𐑁";s:4:"𐐙";s:4:"𐑂";s:4:"𐐚";s:4:"𐑃";s:4:"𐐛";s:4:"𐑄";s:4:"𐐜";s:4:"𐑅";s:4:"𐐝";s:4:"𐑆";s:4:"𐐞";s:4:"𐑇";s:4:"𐐟";s:4:"𐑈";s:4:"𐐠";s:4:"𐑉";s:4:"𐐡";s:4:"𐑊";s:4:"𐐢";s:4:"𐑋";s:4:"𐐣";s:4:"𐑌";s:4:"𐐤";s:4:"𐑍";s:4:"𐐥";s:4:"𐑎";s:4:"𐐦";s:4:"𐑏";s:4:"𐐧";s:4:"𑣀";s:4:"𑢠";s:4:"𑣁";s:4:"𑢡";s:4:"𑣂";s:4:"𑢢";s:4:"𑣃";s:4:"𑢣";s:4:"𑣄";s:4:"𑢤";s:4:"𑣅";s:4:"𑢥";s:4:"𑣆";s:4:"𑢦";s:4:"𑣇";s:4:"𑢧";s:4:"𑣈";s:4:"𑢨";s:4:"𑣉";s:4:"𑢩";s:4:"𑣊";s:4:"𑢪";s:4:"𑣋";s:4:"𑢫";s:4:"𑣌";s:4:"𑢬";s:4:"𑣍";s:4:"𑢭";s:4:"𑣎";s:4:"𑢮";s:4:"𑣏";s:4:"𑢯";s:4:"𑣐";s:4:"𑢰";s:4:"𑣑";s:4:"𑢱";s:4:"𑣒";s:4:"𑢲";s:4:"𑣓";s:4:"𑢳";s:4:"𑣔";s:4:"𑢴";s:4:"𑣕";s:4:"𑢵";s:4:"𑣖";s:4:"𑢶";s:4:"𑣗";s:4:"𑢷";s:4:"𑣘";s:4:"𑢸";s:4:"𑣙";s:4:"𑢹";s:4:"𑣚";s:4:"𑢺";s:4:"𑣛";s:4:"𑢻";s:4:"𑣜";s:4:"𑢼";s:4:"𑣝";s:4:"𑢽";s:4:"𑣞";s:4:"𑢾";s:4:"𑣟";s:4:"𑢿";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/TurkishUtf8.php
@@ -0,0 +1,155 @@
+<?php
+
+/*
+ * Copyright (C) 2016 Nicolas Grekas - p@tchwork.com
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the (at your option):
+ * Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
+ * GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
+ */
+
+namespace Patchwork;
+
+/**
+ * Turkish locale specialized version of Patchwork\Utf8.
+ */
+class TurkishUtf8 extends Utf8
+{
+    public static function strtocasefold($s, $full = true)
+    {
+        if (false !== strpos($s, 'İ')) {
+            $s = str_replace('İ', 'i', $s);
+        }
+
+        return parent::strtocasefold($s, $full);
+    }
+
+    public static function stripos($s, $needle, $offset = 0)
+    {
+        if (false !== strpos($needle, 'I')) {
+            $needle = str_replace('I', 'ı', $needle);
+        }
+        if (false !== strpos($needle, 'İ')) {
+            $needle = str_replace('İ', 'i', $needle);
+        }
+        if (false !== strpos($s, 'I')) {
+            $s = str_replace('I', 'ı', $s);
+        }
+        if (false !== strpos($s, 'İ')) {
+            $s = str_replace('İ', 'i', $s);
+        }
+
+        return parent::stripos($s, $needle, $offset);
+    }
+
+    public static function strripos($s, $needle, $offset = 0)
+    {
+        if (false !== strpos($needle, 'I')) {
+            $needle = str_replace('I', 'ı', $needle);
+        }
+        if (false !== strpos($needle, 'İ')) {
+            $needle = str_replace('İ', 'i', $needle);
+        }
+        if (false !== strpos($s, 'I')) {
+            $s = str_replace('I', 'ı', $s);
+        }
+        if (false !== strpos($s, 'İ')) {
+            $s = str_replace('İ', 'i', $s);
+        }
+
+        return parent::strripos($s, $needle, $offset);
+    }
+
+    public static function stristr($s, $needle, $before_needle = false)
+    {
+        $needle = self::stripos($s, $needle);
+        if (false === $needle) {
+            return false;
+        }
+        if ($before_needle) {
+            return self::substr($s, 0, $needle);
+        }
+
+        return self::substr($s, $needle);
+    }
+
+    public static function strrichr($s, $needle, $before_needle = false)
+    {
+        $needle = self::strripos($s, $needle);
+        if (false === $needle) {
+            return false;
+        }
+        if ($before_needle) {
+            return self::substr($s, 0, $needle);
+        }
+
+        return self::substr($s, $needle);
+    }
+
+    public static function strtolower($s)
+    {
+        if (false !== strpos($s, 'İ')) {
+            $s = str_replace('İ', 'i', $s);
+        }
+        if (false !== strpos($s, 'I')) {
+            $s = str_replace('I', 'ı', $s);
+        }
+
+        return parent::strtolower($s);
+    }
+
+    public static function strtoupper($s)
+    {
+        if (false !== strpos($s, 'i')) {
+            $s = str_replace('i', 'İ', $s);
+        }
+
+        return parent::strtoupper($s);
+    }
+
+    public static function str_ireplace($search, $replace, $subject, &$count = null)
+    {
+        $search = (array) $search;
+
+        foreach ($search as $i => $s) {
+            if ('' === $s .= '') {
+                $s = '/^(?<=.)$/';
+            } else {
+                $s = preg_quote($s, '/');
+                $s = strtr($s, array(
+                    'i' => '(?-i:[iİ])',
+                    'İ' => '(?-i:[iİ])',
+                    'ı' => '(?-i:[ıI])',
+                    'I' => '(?-i:[ıI])',
+                ));
+                $s = "/{$s}/ui";
+            }
+
+            $search[$i] = $s;
+        }
+
+        $subject = preg_replace($search, $replace, $subject, -1, $replace);
+        $count = $replace;
+
+        return $subject;
+    }
+
+    public static function ucfirst($s)
+    {
+        if ('i' === substr($s, 0, 1)) {
+            return 'İ'.substr($s, 1);
+        } else {
+            return parent::ucfirst($s);
+        }
+    }
+
+    public static function ucwords($s)
+    {
+        if (false !== strpos($s, 'i')) {
+            $s = preg_replace('/\bi/u', 'İ', $s);
+        }
+
+        return parent::ucwords($s);
+    }
+}
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8.php
@@ -0,0 +1,775 @@
+<?php
+
+/*
+ * Copyright (C) 2016 Nicolas Grekas - p@tchwork.com
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the (at your option):
+ * Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
+ * GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
+ */
+
+namespace Patchwork;
+
+use Normalizer as n;
+
+/**
+ * UTF-8 Grapheme Cluster aware string manipulations implementing the quasi complete
+ * set of native PHP string functions that need UTF-8 awareness and more.
+ * Missing are printf-family functions.
+ */
+class Utf8
+{
+    protected static $pathPrefix;
+    protected static $commonCaseFold = array(
+        array('µ','ſ',"\xCD\x85",'ς',"\xCF\x90","\xCF\x91","\xCF\x95","\xCF\x96","\xCF\xB0","\xCF\xB1","\xCF\xB5","\xE1\xBA\x9B","\xE1\xBE\xBE"),
+        array('μ','s','ι',       'σ','β',       'θ',       'φ',       'π',       'κ',       'ρ',       'ε',       "\xE1\xB9\xA1",'ι'),
+    );
+    protected static $cp1252 = array('','','','','','','','','','','','','','','','','','','','','','','','','','','');
+    protected static $utf8   = array('€','‚','ƒ','„','…','†','‡','ˆ','‰','Š','‹','Œ','Ž','‘','’','“','”','•','–','—','˜','™','š','›','œ','ž','Ÿ');
+
+    public static function isUtf8($s)
+    {
+        return (bool) preg_match('//u', $s); // Since PHP 5.2.5, this also excludes invalid five and six bytes sequences
+    }
+
+    // Generic UTF-8 to ASCII transliteration
+
+    public static function toAscii($s, $subst_chr = '?')
+    {
+        if (preg_match("/[\x80-\xFF]/", $s)) {
+            static $translitExtra = array();
+            $translitExtra or $translitExtra = static::getData('translit_extra');
+
+            $s = n::normalize($s, n::NFKC);
+
+            $glibc = 'glibc' === ICONV_IMPL;
+
+            preg_match_all('/./u', $s, $s);
+
+            foreach ($s[0] as &$c) {
+                if (!isset($c[1])) {
+                    continue;
+                }
+
+                if ($glibc) {
+                    $t = iconv('UTF-8', 'ASCII//TRANSLIT', $c);
+                } else {
+                    $t = iconv('UTF-8', 'ASCII//IGNORE//TRANSLIT', $c);
+
+                    if (!isset($t[0])) {
+                        $t = '?';
+                    } elseif (isset($t[1])) {
+                        $t = ltrim($t, '\'`"^~');
+                    }
+                }
+
+                if ('?' === $t) {
+                    if (isset($translitExtra[$c])) {
+                        $t = $translitExtra[$c];
+                    } else {
+                        $t = n::normalize($c, n::NFD);
+
+                        if ($t[0] < "\x80") {
+                            $t = $t[0];
+                        } else {
+                            $t = $subst_chr;
+                        }
+                    }
+                }
+
+                $c = $t;
+            }
+
+            $s = implode('', $s[0]);
+        }
+
+        return $s;
+    }
+
+    public static function wrapPath($path = '')
+    {
+        if (null === static::$pathPrefix) {
+            static $hasWfio;
+            isset($hasWfio) or $hasWfio = extension_loaded('wfio');
+
+            if ($hasWfio) {
+                static::$pathPrefix = 'wfio://';
+            } elseif ('\\' === DIRECTORY_SEPARATOR && class_exists('COM', false)) {
+                static::$pathPrefix = 'utf8'.mt_rand();
+                stream_wrapper_register(static::$pathPrefix, 'Patchwork\Utf8\WindowsStreamWrapper');
+                static::$pathPrefix .= '://';
+            } else {
+                if ('\\' === DIRECTORY_SEPARATOR) {
+                    trigger_error('The `wfio` or `com_dotnet` extension is required to handle UTF-8 filesystem access on Windows');
+                }
+                static::$pathPrefix = 'file://';
+            }
+        }
+
+        return static::$pathPrefix.$path;
+    }
+
+    public static function filter($var, $normalization_form = 4 /* n::NFC */, $leading_combining = '◌')
+    {
+        switch (gettype($var)) {
+            case 'array':
+                foreach ($var as $k => $v) {
+                    $var[$k] = static::filter($v, $normalization_form, $leading_combining);
+                }
+                break;
+
+            case 'object':
+                foreach ($var as $k => $v) {
+                    $var->$k = static::filter($v, $normalization_form, $leading_combining);
+                }
+                break;
+
+            case 'string':
+                if (false !== strpos($var, "\r")) {
+                    // Workaround https://bugs.php.net/65732
+                    $var = str_replace("\r\n", "\n", $var);
+                    $var = strtr($var, "\r", "\n");
+                }
+
+                if (preg_match('/[\x80-\xFF]/', $var)) {
+                    if (n::isNormalized($var, $normalization_form)) {
+                        $n = '-';
+                    } else {
+                        $n = n::normalize($var, $normalization_form);
+                        if (isset($n[0])) {
+                            $var = $n;
+                        } else {
+                            $var = static::utf8_encode($var);
+                        }
+                    }
+
+                    if ($var[0] >= "\x80" && isset($n[0], $leading_combining[0]) && preg_match('/^\p{Mn}/u', $var)) {
+                        // Prevent leading combining chars
+                        // for NFC-safe concatenations.
+                        $var = $leading_combining.$var;
+                    }
+                }
+                break;
+        }
+
+        return $var;
+    }
+
+    // Unicode transformation for caseless matching
+    // see http://unicode.org/reports/tr21/tr21-5.html
+
+    public static function strtocasefold($s, $full = true)
+    {
+        $s = str_replace(self::$commonCaseFold[0], self::$commonCaseFold[1], $s);
+
+        if ($full) {
+            static $fullCaseFold = false;
+            $fullCaseFold or $fullCaseFold = static::getData('caseFolding_full');
+
+            $s = str_replace($fullCaseFold[0], $fullCaseFold[1], $s);
+        }
+
+        return static::strtolower($s);
+    }
+
+    // Generic case sensitive collation support for self::strnatcmp()
+
+    public static function strtonatfold($s)
+    {
+        $s = n::normalize($s, n::NFD);
+
+        return preg_replace('/\p{Mn}+/u', '', $s);
+    }
+
+    // PHP string functions that need UTF-8 awareness
+
+    public static function filter_input($type, $var, $filter = FILTER_DEFAULT, $option = null)
+    {
+        if (4 > func_num_args()) {
+            $var = filter_input($type, $var, $filter);
+        } else {
+            $var = filter_input($type, $var, $filter, $option);
+        }
+
+        return static::filter($var);
+    }
+
+    public static function filter_input_array($type, $def = null, $add_empty = true)
+    {
+        if (2 > func_num_args()) {
+            $a = filter_input_array($type);
+        } else {
+            $a = filter_input_array($type, $def, $add_empty);
+        }
+
+        return static::filter($a);
+    }
+
+    public static function json_decode($json, $assoc = false, $depth = 512, $options = 0)
+    {
+        if (PHP_VERSION_ID < 50400) {
+            $json = json_decode($json, $assoc, $depth);
+        } else {
+            $json = json_decode($json, $assoc, $depth, $options);
+        }
+
+        return static::filter($json);
+    }
+
+    public static function substr($s, $start, $len = 2147483647)
+    {
+        static $bug62759;
+        isset($bug62759) or $bug62759 = extension_loaded('intl') && 'à' === @grapheme_substr('éà', 1, -2);
+
+        if ($bug62759) {
+            return PHP\Shim\Intl::grapheme_substr_workaround62759($s, $start, $len);
+        } else {
+            return grapheme_substr($s, $start, $len);
+        }
+    }
+
+    public static function strlen($s)
+    {
+        return grapheme_strlen($s);
+    }
+    public static function strpos($s, $needle, $offset = 0)
+    {
+        // ignore invalid negative offset to keep compatility
+        // with php < 5.5.35, < 5.6.21, < 7.0.6
+        return grapheme_strpos($s, $needle, $offset > 0 ? $offset : 0);
+    }
+    public static function strrpos($s, $needle, $offset = 0)
+    {
+        return grapheme_strrpos($s, $needle, $offset);
+    }
+
+    public static function stripos($s, $needle, $offset = 0)
+    {
+        if (50418 > PHP_VERSION_ID || 50500 == PHP_VERSION_ID) {
+            // Don't use grapheme_stripos because of https://bugs.php.net/61860
+            if (!preg_match('//u', $s .= '')) {
+                return false;
+            }
+            if ($offset < 0) {
+                $offset = 0;
+            }
+            if (!$needle = mb_stripos($s, $needle .= '', $offset, 'UTF-8')) {
+                return $needle;
+            }
+
+            return grapheme_strlen(iconv_substr($s, 0, $needle, 'UTF-8'));
+        }
+
+        return grapheme_stripos($s, $needle, $offset);
+    }
+
+    public static function strripos($s, $needle, $offset = 0)
+    {
+        if (50418 > PHP_VERSION_ID || 50500 == PHP_VERSION_ID) {
+            // Don't use grapheme_strripos because of https://bugs.php.net/61860
+            if (!preg_match('//u', $s .= '')) {
+                return false;
+            }
+            if ($offset < 0) {
+                $offset = 0;
+            }
+            if (!$needle = mb_strripos($s, $needle .= '', $offset, 'UTF-8')) {
+                return $needle;
+            }
+
+            return grapheme_strlen(iconv_substr($s, 0, $needle, 'UTF-8'));
+        }
+
+        return grapheme_strripos($s, $needle, $offset);
+    }
+
+    public static function stristr($s, $needle, $before_needle = false)
+    {
+        if ('' === $needle .= '') {
+            return false;
+        }
+
+        return mb_stristr($s, $needle, $before_needle, 'UTF-8');
+    }
+
+    public static function strstr($s, $needle, $before_needle = false)
+    {
+        return grapheme_strstr($s, $needle, $before_needle);
+    }
+    public static function strrchr($s, $needle, $before_needle = false)
+    {
+        return mb_strrchr($s, $needle, $before_needle, 'UTF-8');
+    }
+    public static function strrichr($s, $needle, $before_needle = false)
+    {
+        return mb_strrichr($s, $needle, $before_needle, 'UTF-8');
+    }
+
+    public static function strtolower($s)
+    {
+        return mb_strtolower($s, 'UTF-8');
+    }
+    public static function strtoupper($s)
+    {
+        return mb_strtoupper($s, 'UTF-8');
+    }
+
+    public static function wordwrap($s, $width = 75, $break = "\n", $cut = false)
+    {
+        if (false === wordwrap('-', $width, $break, $cut)) {
+            return false;
+        }
+
+        is_string($break) or $break = (string) $break;
+
+        $w = '';
+        $s = explode($break, $s);
+        $iLen = count($s);
+        $chars = array();
+
+        if (1 === $iLen && '' === $s[0]) {
+            return '';
+        }
+
+        for ($i = 0; $i < $iLen; ++$i) {
+            if ($i) {
+                $chars[] = $break;
+                $w .= '#';
+            }
+
+            $c = $s[$i];
+            unset($s[$i]);
+
+            foreach (self::str_split($c) as $c) {
+                $chars[] = $c;
+                $w .= ' ' === $c ? ' ' : '?';
+            }
+        }
+
+        $s = '';
+        $j = 0;
+        $b = $i = -1;
+        $w = wordwrap($w, $width, '#', $cut);
+
+        while (false !== $b = strpos($w, '#', $b + 1)) {
+            for (++$i; $i < $b; ++$i) {
+                $s .= $chars[$j];
+                unset($chars[$j++]);
+            }
+
+            if ($break === $chars[$j] || ' ' === $chars[$j]) {
+                unset($chars[$j++]);
+            }
+            $s .= $break;
+        }
+
+        return $s.implode('', $chars);
+    }
+
+    public static function chr($c)
+    {
+        if (0x80 > $c %= 0x200000) {
+            return chr($c);
+        }
+        if (0x800 > $c) {
+            return chr(0xC0 | $c >> 6).chr(0x80 | $c & 0x3F);
+        }
+        if (0x10000 > $c) {
+            return chr(0xE0 | $c >> 12).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F);
+        }
+
+        return chr(0xF0 | $c >> 18).chr(0x80 | $c >> 12 & 0x3F).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F);
+    }
+
+    public static function count_chars($s, $mode = 0)
+    {
+        if (1 != $mode) {
+            user_error(__METHOD__.'(): the only allowed $mode is 1', E_USER_WARNING);
+        }
+        $s = self::str_split($s);
+
+        return array_count_values($s);
+    }
+
+    public static function ltrim($s, $charlist = null)
+    {
+        $charlist = null === $charlist ? '\s' : self::rxClass($charlist);
+
+        return preg_replace("/^{$charlist}+/u", '', $s);
+    }
+
+    public static function ord($s)
+    {
+        $a = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;
+        if (0xF0 <= $a) {
+            return (($a - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;
+        }
+        if (0xE0 <= $a) {
+            return (($a - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80;
+        }
+        if (0xC0 <= $a) {
+            return (($a - 0xC0) << 6) + $s[2] - 0x80;
+        }
+
+        return $a;
+    }
+
+    public static function rtrim($s, $charlist = null)
+    {
+        $charlist = null === $charlist ? '\s' : self::rxClass($charlist);
+
+        return preg_replace("/{$charlist}+$/u", '', $s);
+    }
+
+    public static function trim($s, $charlist = null)
+    {
+        return self::rtrim(self::ltrim($s, $charlist), $charlist);
+    }
+
+    public static function str_ireplace($search, $replace, $subject, &$count = null)
+    {
+        $search = (array) $search;
+
+        foreach ($search as $i => $s) {
+            if ('' === $s .= '') {
+                $s = '/^(?<=.)$/';
+            } else {
+                $s = '/'.preg_quote($s, '/').'/ui';
+            }
+
+            $search[$i] = $s;
+        }
+
+        $subject = preg_replace($search, $replace, $subject, -1, $replace);
+        $count = $replace;
+
+        return $subject;
+    }
+
+    public static function str_pad($s, $len, $pad = ' ', $type = STR_PAD_RIGHT)
+    {
+        $slen = grapheme_strlen($s);
+        if ($len <= $slen) {
+            return $s;
+        }
+
+        $padlen = grapheme_strlen($pad);
+        $freelen = $len - $slen;
+        $len = $freelen % $padlen;
+
+        if (STR_PAD_RIGHT == $type) {
+            return $s.str_repeat($pad, $freelen / $padlen).($len ? grapheme_substr($pad, 0, $len) : '');
+        }
+        if (STR_PAD_LEFT == $type) {
+            return str_repeat($pad, $freelen / $padlen).($len ? grapheme_substr($pad, 0, $len) : '').$s;
+        }
+        if (STR_PAD_BOTH == $type) {
+            $freelen /= 2;
+
+            $type = ceil($freelen);
+            $len = $type % $padlen;
+            $s .= str_repeat($pad, $type / $padlen).($len ? grapheme_substr($pad, 0, $len) : '');
+
+            $type = floor($freelen);
+            $len = $type % $padlen;
+
+            return str_repeat($pad, $type / $padlen).($len ? grapheme_substr($pad, 0, $len) : '').$s;
+        }
+
+        user_error(__METHOD__.'(): Padding type has to be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH', E_USER_WARNING);
+    }
+
+    public static function str_shuffle($s)
+    {
+        $s = self::str_split($s);
+        shuffle($s);
+
+        return implode('', $s);
+    }
+
+    public static function str_split($s, $len = 1)
+    {
+        if (1 > $len = (int) $len) {
+            $len = func_get_arg(1);
+
+            return str_split($s, $len);
+        }
+
+        static $hasIntl;
+        isset($hasIntl) or $hasIntl = extension_loaded('intl');
+
+        if ($hasIntl) {
+            $a = array();
+            $p = 0;
+            $l = strlen($s);
+
+            while ($p < $l) {
+                $a[] = grapheme_extract($s, 1, GRAPHEME_EXTR_COUNT, $p, $p);
+            }
+        } else {
+            preg_match_all('/'.GRAPHEME_CLUSTER_RX.'/u', $s, $a);
+            $a = $a[0];
+        }
+
+        if (1 == $len) {
+            return $a;
+        }
+
+        $s = array();
+        $p = -1;
+
+        foreach ($a as $l => $a) {
+            if ($l % $len) {
+                $s[$p] .= $a;
+            } else {
+                $s[++$p] = $a;
+            }
+        }
+
+        return $s;
+    }
+
+    public static function str_word_count($s, $format = 0, $charlist = '')
+    {
+        $charlist = self::rxClass($charlist, '\pL');
+        $s = preg_split("/({$charlist}+(?:[\p{Pd}’']{$charlist}+)*)/u", $s, -1, PREG_SPLIT_DELIM_CAPTURE);
+
+        $charlist = array();
+        $len = count($s);
+
+        if (1 == $format) {
+            for ($i = 1; $i < $len; $i += 2) {
+                $charlist[] = $s[$i];
+            }
+        } elseif (2 == $format) {
+            $offset = grapheme_strlen($s[0]);
+            for ($i = 1; $i < $len; $i += 2) {
+                $charlist[$offset] = $s[$i];
+                $offset += grapheme_strlen($s[$i]) + grapheme_strlen($s[$i + 1]);
+            }
+        } else {
+            $charlist = ($len - 1) / 2;
+        }
+
+        return $charlist;
+    }
+
+    public static function strcmp($a, $b)
+    {
+        return $a.'' === $b.'' ? 0 : strcmp(n::normalize($a, n::NFD), n::normalize($b, n::NFD));
+    }
+    public static function strnatcmp($a, $b)
+    {
+        return $a.'' === $b.'' ? 0 : strnatcmp(self::strtonatfold($a), self::strtonatfold($b));
+    }
+    public static function strcasecmp($a, $b)
+    {
+        return self::strcmp(static::strtocasefold($a), static::strtocasefold($b));
+    }
+    public static function strnatcasecmp($a, $b)
+    {
+        return self::strnatcmp(static::strtocasefold($a), static::strtocasefold($b));
+    }
+    public static function strncasecmp($a, $b, $len)
+    {
+        return self::strncmp(static::strtocasefold($a), static::strtocasefold($b), $len);
+    }
+    public static function strncmp($a, $b, $len)
+    {
+        return self::strcmp(self::substr($a, 0, $len), self::substr($b, 0, $len));
+    }
+
+    public static function strcspn($s, $charlist, $start = 0, $len = 2147483647)
+    {
+        if ('' === $charlist .= '') {
+            return;
+        }
+        if ($start || 2147483647 != $len) {
+            $s = self::substr($s, $start, $len);
+        }
+
+        return preg_match('/^(.*?)'.self::rxClass($charlist).'/us', $s, $len) ? grapheme_strlen($len[1]) : grapheme_strlen($s);
+    }
+
+    public static function strpbrk($s, $charlist)
+    {
+        if (preg_match('/'.self::rxClass($charlist).'/us', $s, $m)) {
+            return substr($s, strpos($s, $m[0]));
+        } else {
+            return false;
+        }
+    }
+
+    public static function strrev($s)
+    {
+        $s = self::str_split($s);
+
+        return implode('', array_reverse($s));
+    }
+
+    public static function strspn($s, $mask, $start = 0, $len = 2147483647)
+    {
+        if ($start || 2147483647 != $len) {
+            $s = self::substr($s, $start, $len);
+        }
+
+        return preg_match('/^'.self::rxClass($mask).'+/u', $s, $s) ? grapheme_strlen($s[0]) : 0;
+    }
+
+    public static function strtr($s, $from, $to = null)
+    {
+        if (null !== $to) {
+            $from = self::str_split($from);
+            $to   = self::str_split($to);
+
+            $a = count($from);
+            $b = count($to);
+
+            if ($a > $b) {
+                $from = array_slice($from, 0, $b);
+            } elseif ($a < $b) {
+                $to   = array_slice($to, 0, $a);
+            }
+
+            $from = array_combine($from, $to);
+        }
+
+        return strtr($s, $from);
+    }
+
+    public static function substr_compare($a, $b, $offset, $len = 2147483647, $i = 0)
+    {
+        $a = self::substr($a, $offset, $len);
+
+        return $i ? static::strcasecmp($a, $b) : self::strcmp($a, $b);
+    }
+
+    public static function substr_count($s, $needle, $offset = 0, $len = 2147483647)
+    {
+        return substr_count(self::substr($s, $offset, $len), $needle);
+    }
+
+    public static function substr_replace($s, $replace, $start, $len = 2147483647)
+    {
+        $s       = self::str_split($s);
+        $replace = self::str_split($replace);
+        array_splice($s, $start, $len, $replace);
+
+        return implode('', $s);
+    }
+
+    public static function ucfirst($s)
+    {
+        $c = iconv_substr($s, 0, 1, 'UTF-8');
+
+        return static::ucwords($c).substr($s, strlen($c));
+    }
+
+    public static function lcfirst($s)
+    {
+        $c = iconv_substr($s, 0, 1, 'UTF-8');
+
+        return static::strtolower($c).substr($s, strlen($c));
+    }
+
+    public static function ucwords($s)
+    {
+        return preg_replace_callback(
+            "/\b(.)/u",
+            function ($matches) {
+                return mb_convert_case($matches[1], MB_CASE_TITLE, 'UTF-8');
+            },
+            $s
+        );
+    }
+
+    public static function number_format($number, $decimals = 0, $dec_point = '.', $thousands_sep = ',')
+    {
+        if (PHP_VERSION_ID < 50400) {
+            if (isset($thousands_sep[1]) || isset($dec_point[1])) {
+                return str_replace(
+                    array('.', ','),
+                    array($dec_point, $thousands_sep),
+                    number_format($number, $decimals, '.', ',')
+                );
+            }
+        }
+
+        return number_format($number, $decimals, $dec_point, $thousands_sep);
+    }
+
+    public static function utf8_encode($s)
+    {
+        $s = utf8_encode($s);
+        if (false === strpos($s, "\xC2")) {
+            return $s;
+        } else {
+            return str_replace(self::$cp1252, self::$utf8, $s);
+        }
+    }
+
+    public static function utf8_decode($s)
+    {
+        $s = str_replace(self::$utf8, self::$cp1252, $s);
+
+        return utf8_decode($s);
+    }
+
+    public static function strwidth($s)
+    {
+        if (false !== strpos($s, "\r")) {
+            $s = str_replace("\r\n", "\n", $s);
+            $s = strtr($s, "\r", "\n");
+        }
+        $width = 0;
+
+        foreach (explode("\n", $s) as $s) {
+            $s = preg_replace('/\x1B\[[\d;]*m/', '', $s);
+            $c = substr_count($s, "\xAD") - substr_count($s, "\x08");
+            $s = preg_replace('/[\x00\x05\x07\p{Mn}\p{Me}\p{Cf}\x{1160}-\x{11FF}\x{200B}]+/u', '', $s);
+            preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide);
+
+            if ($width < $c = iconv_strlen($s, 'UTF-8') + $wide + $c) {
+                $width = $c;
+            }
+        }
+
+        return $width;
+    }
+
+    protected static function rxClass($s, $class = '')
+    {
+        $class = array($class);
+
+        foreach (self::str_split($s) as $s) {
+            if ('-' === $s) {
+                $class[0] = '-'.$class[0];
+            } elseif (!isset($s[2])) {
+                $class[0] .= preg_quote($s, '/');
+            } elseif (1 === iconv_strlen($s, 'UTF-8')) {
+                $class[0] .= $s;
+            } else {
+                $class[] = $s;
+            }
+        }
+
+        $class[0] = '['.$class[0].']';
+
+        if (1 === count($class)) {
+            return $class[0];
+        } else {
+            return '(?:'.implode('|', $class).')';
+        }
+    }
+
+    protected static function getData($file)
+    {
+        $file = __DIR__.'/Utf8/data/'.$file.'.ser';
+        if (file_exists($file)) {
+            return unserialize(file_get_contents($file));
+        } else {
+            return false;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/BestFit.php
@@ -0,0 +1,79 @@
+<?php
+
+/*
+ * Copyright (C) 2016 Nicolas Grekas - p@tchwork.com
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the (at your option):
+ * Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
+ * GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
+ */
+
+namespace Patchwork\Utf8;
+
+/**
+ * UTF-8 to Code Page conversion using best fit mappings
+ * See http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/.
+ */
+class BestFit
+{
+    public static function fit($cp, $s, $placeholder = '?')
+    {
+        if (!$len = strlen($s)) {
+            return 0 === $len ? '' : false;
+        }
+
+        static $map = array();
+        static $ulen_mask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
+
+        $s .= '';
+        $cp = (string) (int) $cp;
+        $result = '9' === $cp[0] ? $s.$s : $s;
+
+        if ('932' === $cp && 2 === func_num_args()) {
+            $placeholder = "\x81\x45"; // Katakana Middle Dot in CP932
+        }
+
+        if (!isset($map[$cp])) {
+            $i = static::getData('to.bestfit'.$cp);
+            if (false === $i) {
+                return false;
+            }
+            $map[$cp] = $i;
+        }
+
+        $i = $j = 0;
+        $cp = $map[$cp];
+
+        while ($i < $len) {
+            if ($s[$i] < "\x80") {
+                $uchr = $s[$i++];
+            } else {
+                $ulen = $ulen_mask[$s[$i] & "\xF0"];
+                $uchr = substr($s, $i, $ulen);
+                $i += $ulen;
+            }
+
+            if (isset($cp[$uchr])) {
+                $uchr = $cp[$uchr];
+            } else {
+                $uchr = $placeholder;
+            }
+
+            isset($uchr[0]) and $result[$j++] = $uchr[0];
+            isset($uchr[1]) and $result[$j++] = $uchr[1];
+        }
+
+        return substr($result, 0, $j);
+    }
+
+    protected static function getData($file)
+    {
+        $file = __DIR__.'/data/'.$file.'.ser';
+        if (file_exists($file)) {
+            return unserialize(file_get_contents($file));
+        } else {
+            return false;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/Bootup.php
@@ -0,0 +1,230 @@
+<?php
+
+/*
+ * Copyright (C) 2016 Nicolas Grekas - p@tchwork.com
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the (at your option):
+ * Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
+ * GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
+ */
+
+namespace Patchwork\Utf8;
+
+use Normalizer as n;
+use Patchwork\Utf8 as u;
+use Patchwork\PHP\Shim as s;
+
+class Bootup
+{
+    public static function initAll()
+    {
+        ini_set('default_charset', 'UTF-8');
+
+        self::initUtf8Encode();
+        self::initIconv();
+        self::initMbstring();
+        self::initExif();
+        self::initIntl();
+        self::initLocale();
+    }
+
+    public static function initUtf8Encode()
+    {
+        function_exists('utf8_encode') or require __DIR__.'/Bootup/utf8_encode.php';
+    }
+
+    public static function initMbstring()
+    {
+        if (extension_loaded('mbstring')) {
+            if (((int) ini_get('mbstring.encoding_translation') || in_array(strtolower(ini_get('mbstring.encoding_translation')), array('on', 'yes', 'true')))
+                && !in_array(strtolower(ini_get('mbstring.http_input')), array('pass', '8bit', 'utf-8'))) {
+                user_error('php.ini settings: Please disable mbstring.encoding_translation or set mbstring.http_input to "pass"',  E_USER_WARNING);
+            }
+
+            if (MB_OVERLOAD_STRING & (int) ini_get('mbstring.func_overload')) {
+                user_error('php.ini settings: Please disable mbstring.func_overload', E_USER_WARNING);
+            }
+
+            if (function_exists('mb_regex_encoding')) {
+                mb_regex_encoding('UTF-8');
+            }
+            ini_set('mbstring.script_encoding', 'pass');
+
+            if ('utf-8' !== strtolower(mb_internal_encoding())) {
+                mb_internal_encoding('UTF-8');
+            }
+
+            if ('none' !== strtolower(mb_substitute_character())) {
+                mb_substitute_character('none');
+            }
+
+            if (!in_array(strtolower(mb_http_output()), array('pass', '8bit'))) {
+                mb_http_output('pass');
+            }
+
+            if (!in_array(strtolower(mb_language()), array('uni', 'neutral'))) {
+                mb_language('uni');
+            }
+        } elseif (!function_exists('mb_strlen')) {
+            extension_loaded('iconv') or static::initIconv();
+
+            require __DIR__.'/Bootup/mbstring.php';
+        }
+    }
+
+    public static function initIconv()
+    {
+        if (extension_loaded('iconv')) {
+            if ('UTF-8' !== strtoupper(iconv_get_encoding('input_encoding'))) {
+                iconv_set_encoding('input_encoding', 'UTF-8');
+            }
+
+            if ('UTF-8' !== strtoupper(iconv_get_encoding('internal_encoding'))) {
+                iconv_set_encoding('internal_encoding', 'UTF-8');
+            }
+
+            if ('UTF-8' !== strtoupper(iconv_get_encoding('output_encoding'))) {
+                iconv_set_encoding('output_encoding', 'UTF-8');
+            }
+        } elseif (!function_exists('iconv')) {
+            require __DIR__.'/Bootup/iconv.php';
+        }
+    }
+
+    public static function initExif()
+    {
+        if (extension_loaded('exif')) {
+            if (ini_get('exif.encode_unicode') && 'UTF-8' !== strtoupper(ini_get('exif.encode_unicode'))) {
+                ini_set('exif.encode_unicode', 'UTF-8');
+            }
+
+            if (ini_get('exif.encode_jis') && 'UTF-8' !== strtoupper(ini_get('exif.encode_jis'))) {
+                ini_set('exif.encode_jis', 'UTF-8');
+            }
+        }
+    }
+
+    public static function initIntl()
+    {
+        if (defined('GRAPHEME_CLUSTER_RX')) {
+            return;
+        }
+
+        define('GRAPHEME_CLUSTER_RX', PCRE_VERSION >= '8.32' ? '\X' : s\Intl::GRAPHEME_CLUSTER_RX);
+
+        if (!function_exists('grapheme_strlen')) {
+            extension_loaded('iconv') or static::initIconv();
+            extension_loaded('mbstring') or static::initMbstring();
+
+            require __DIR__.'/Bootup/intl.php';
+        }
+    }
+
+    public static function initLocale()
+    {
+        // With non-UTF-8 locale, basename() bugs.
+        // Be aware that setlocale() can be slow.
+        // You'd better properly configure your LANG environment variable to an UTF-8 locale.
+
+        if ('' === basename('§')) {
+            setlocale(LC_ALL, 'C.UTF-8', 'C');
+            setlocale(LC_CTYPE, 'en_US.UTF-8', 'fr_FR.UTF-8', 'es_ES.UTF-8', 'de_DE.UTF-8', 'ru_RU.UTF-8', 'pt_BR.UTF-8', 'it_IT.UTF-8', 'ja_JP.UTF-8', 'zh_CN.UTF-8', '0');
+        }
+    }
+
+    public static function filterRequestUri($uri = null, $exit = true)
+    {
+        if (!isset($uri)) {
+            if (!isset($_SERVER['REQUEST_URI'])) {
+                return;
+            } else {
+                $uri = $_SERVER['REQUEST_URI'];
+            }
+        }
+
+        // Ensures the URL is well formed UTF-8
+        // When not, assumes Windows-1252 and redirects to the corresponding UTF-8 encoded URL
+
+        if (!preg_match('//u', urldecode($uri))) {
+            $uri = preg_replace_callback(
+                '/[\x80-\xFF]+/',
+                function ($m) {return urlencode($m[0]);},
+                $uri
+            );
+
+            $uri = preg_replace_callback(
+                '/(?:%[89A-F][0-9A-F])+/i',
+                function ($m) {return urlencode(u::utf8_encode(urldecode($m[0])));},
+                $uri
+            );
+
+            if ($exit) {
+                header('HTTP/1.1 301 Moved Permanently');
+                header('Location: '.$uri);
+
+                exit; // TODO: remove this in 1.2 (BC)
+            }
+        }
+
+        return $uri;
+    }
+
+    public static function filterRequestInputs($normalization_form = 4 /* n::NFC */, $leading_combining = '◌')
+    {
+        // Ensures inputs are well formed UTF-8
+        // When not, assumes Windows-1252 and converts to UTF-8
+        // Tests only values, not keys
+
+        $a = array(&$_FILES, &$_ENV, &$_GET, &$_POST, &$_COOKIE, &$_SERVER, &$_REQUEST);
+
+        foreach ($a[0] as &$r) {
+            $a[] = array(&$r['name'], &$r['type']);
+        }
+        unset($a[0]);
+
+        $len = count($a) + 1;
+        for ($i = 1; $i < $len; ++$i) {
+            foreach ($a[$i] as &$r) {
+                $s = $r; // $r is a ref, $s a copy
+                if (is_array($s)) {
+                    $a[$len++] = &$r;
+                } else {
+                    $r = static::filterString($s, $normalization_form, $leading_combining);
+                }
+            }
+
+            unset($a[$i]);
+        }
+    }
+
+    public static function filterString($s, $normalization_form = 4 /* n::NFC */, $leading_combining = '◌')
+    {
+        if (false !== strpos($s, "\r")) {
+            // Workaround https://bugs.php.net/65732
+            $s = str_replace("\r\n", "\n", $s);
+            $s = strtr($s, "\r", "\n");
+        }
+
+        if (preg_match('/[\x80-\xFF]/', $s)) {
+            if (n::isNormalized($s, $normalization_form)) {
+                $n = '-';
+            } else {
+                $n = n::normalize($s, $normalization_form);
+                if (isset($n[0])) {
+                    $s = $n;
+                } else {
+                    $s = u::utf8_encode($s);
+                }
+            }
+
+            if ($s[0] >= "\x80" && isset($n[0], $leading_combining[0]) && preg_match('/^\p{Mn}/u', $s)) {
+                // Prevent leading combining chars
+                // for NFC-safe concatenations.
+                $s = $leading_combining.$s;
+            }
+        }
+
+        return $s;
+    }
+}
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/Bootup/iconv.php
@@ -0,0 +1,51 @@
+<?php
+
+/*
+ * Copyright (C) 2016 Nicolas Grekas - p@tchwork.com
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the (at your option):
+ * Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
+ * GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
+ */
+
+use Patchwork\PHP\Shim as s;
+
+const ICONV_IMPL = 'Patchwork';
+const ICONV_VERSION = '1.0';
+const ICONV_MIME_DECODE_STRICT = 1;
+const ICONV_MIME_DECODE_CONTINUE_ON_ERROR = 2;
+
+@trigger_error('You are using a fallback implementation of the iconv extension. Installing the native one is highly recommended instead.', E_USER_DEPRECATED);
+
+function iconv($from, $to, $s) {return s\Iconv::iconv($from, $to, $s);}
+function iconv_get_encoding($type = 'all') {return s\Iconv::iconv_get_encoding($type);}
+function iconv_set_encoding($type, $charset) {return s\Iconv::iconv_set_encoding($type, $charset);}
+function iconv_mime_encode($name, $value, $pref = null) {return s\Iconv::iconv_mime_encode($name, $value, $pref);}
+function ob_iconv_handler($buffer, $mode) {return s\Iconv::ob_iconv_handler($buffer, $mode);}
+function iconv_mime_decode_headers($encoded_headers, $mode = 0, $enc = null) {return s\Iconv::iconv_mime_decode_headers($encoded_headers, $mode, $enc);}
+
+if (extension_loaded('mbstring'))
+{
+    function iconv_strlen($s, $enc = null)                               {null === $enc and $enc = s\Iconv::$internal_encoding; return mb_strlen($s, $enc);}
+    function iconv_strpos($s, $needle, $offset = 0, $enc = null)         {null === $enc and $enc = s\Iconv::$internal_encoding; return mb_strpos($s, $needle, $offset, $enc);}
+    function iconv_strrpos($s, $needle, $enc = null)                     {null === $enc and $enc = s\Iconv::$internal_encoding; return mb_strrpos($s, $needle, 0, $enc);}
+    function iconv_substr($s, $start, $length = 2147483647, $enc = null) {null === $enc and $enc = s\Iconv::$internal_encoding; return mb_substr($s, $start, $length, $enc);}
+    function iconv_mime_decode($encoded_headers, $mode = 0, $enc = null) {null === $enc and $enc = s\Iconv::$internal_encoding; return mb_decode_mimeheader($encoded_headers, $mode, $enc);}
+}
+else
+{
+    if (extension_loaded('xml'))
+    {
+        function iconv_strlen($s, $enc = null) {return s\Iconv::strlen1($s, $enc);}
+    }
+    else
+    {
+        function iconv_strlen($s, $enc = null) {return s\Iconv::strlen2($s, $enc);}
+    }
+
+    function iconv_strpos($s, $needle, $offset = 0, $enc = null)         {return s\Iconv::iconv_strpos($s, $needle, $offset, $enc);}
+    function iconv_strrpos($s, $needle, $enc = null)                     {return s\Iconv::iconv_strrpos($s, $needle, $enc);}
+    function iconv_substr($s, $start, $length = 2147483647, $enc = null) {return s\Iconv::iconv_substr($s, $start, $length, $enc);}
+    function iconv_mime_decode($encoded_headers, $mode = 0, $enc = null) {return s\Iconv::iconv_mime_decode($encoded_headers, $mode, $enc);}
+}
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/Bootup/intl.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * Copyright (C) 2016 Nicolas Grekas - p@tchwork.com
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the (at your option):
+ * Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
+ * GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
+ */
+
+use Patchwork\PHP\Shim as s;
+
+const GRAPHEME_EXTR_COUNT = 0;
+const GRAPHEME_EXTR_MAXBYTES = 1;
+const GRAPHEME_EXTR_MAXCHARS = 2;
+
+@trigger_error('You are using a fallback implementation of the intl extension. Installing the native one is highly recommended instead.', E_USER_DEPRECATED);
+
+function normalizer_is_normalized($s, $form = s\Normalizer::NFC) {return s\Normalizer::isNormalized($s, $form);}
+function normalizer_normalize($s, $form = s\Normalizer::NFC) {return s\Normalizer::normalize($s, $form);}
+
+function grapheme_extract($s, $size, $type = 0, $start = 0, &$next = 0) {return s\Intl::grapheme_extract($s, $size, $type, $start, $next);}
+function grapheme_stripos($s, $needle, $offset = 0) {return s\Intl::grapheme_stripos($s, $needle, $offset);}
+function grapheme_stristr($s, $needle, $before_needle = false) {return s\Intl::grapheme_stristr($s, $needle, $before_needle);}
+function grapheme_strlen($s) {return s\Intl::grapheme_strlen($s);}
+function grapheme_strpos($s, $needle, $offset = 0) {return s\Intl::grapheme_strpos($s, $needle, $offset);}
+function grapheme_strripos($s, $needle, $offset = 0) {return s\Intl::grapheme_strripos($s, $needle, $offset);}
+function grapheme_strrpos($s, $needle, $offset = 0) {return s\Intl::grapheme_strrpos($s, $needle, $offset);}
+function grapheme_strstr($s, $needle, $before_needle = false) {return s\Intl::grapheme_strstr($s, $needle, $before_needle);}
+function grapheme_substr($s, $start, $len = 2147483647) {return s\Intl::grapheme_substr($s, $start, $len);}
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/Bootup/mbstring.php
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * Copyright (C) 2016 Nicolas Grekas - p@tchwork.com
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the (at your option):
+ * Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
+ * GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
+ */
+
+use Patchwork\PHP\Shim as s;
+
+const MB_OVERLOAD_MAIL = 1;
+const MB_OVERLOAD_STRING = 2;
+const MB_OVERLOAD_REGEX = 4;
+const MB_CASE_UPPER = 0;
+const MB_CASE_LOWER = 1;
+const MB_CASE_TITLE = 2;
+
+@trigger_error('You are using a fallback implementation of the mbstring extension. Installing the native one is highly recommended instead.', E_USER_DEPRECATED);
+
+function mb_convert_encoding($s, $to, $from = null) {return s\Mbstring::mb_convert_encoding($s, $to, $from);}
+function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) {return mb_convert_variables($toEncoding, $fromEncoding, $a, $b, $c, $d, $e, $f);}
+function mb_decode_mimeheader($s) {return s\Mbstring::mb_decode_mimeheader($s);}
+function mb_encode_mimeheader($s, $charset = null, $transfer_enc = null, $lf = null, $indent = null) {return s\Mbstring::mb_encode_mimeheader($s, $charset, $transfer_enc, $lf, $indent);}
+function mb_convert_case($s, $mode, $enc = null) {return s\Mbstring::mb_convert_case($s, $mode, $enc);}
+function mb_internal_encoding($enc = null) {return s\Mbstring::mb_internal_encoding($enc);}
+function mb_language($lang = null) {return s\Mbstring::mb_language($lang);}
+function mb_list_encodings() {return s\Mbstring::mb_list_encodings();}
+function mb_encoding_aliases($encoding) {return s\Mbstring::mb_encoding_aliases($encoding);}
+function mb_check_encoding($var = null, $encoding = null) {return s\Mbstring::mb_check_encoding($var, $encoding);}
+function mb_detect_encoding($str, $encoding_list = null, $strict = false) {return s\Mbstring::mb_detect_encoding($str, $encoding_list, $strict);}
+function mb_detect_order($encoding_list = null) {return s\Mbstring::mb_detect_order($encoding_list);}
+function mb_parse_str($s, &$result = array()) {parse_str($s, $result);}
+function mb_strlen($s, $enc = null) {return s\Mbstring::mb_strlen($s, $enc);}
+function mb_strpos($s, $needle, $offset = 0, $enc = null) {return s\Mbstring::mb_strpos($s, $needle, $offset, $enc);}
+function mb_strtolower($s, $enc = null) {return s\Mbstring::mb_strtolower($s, $enc);}
+function mb_strtoupper($s, $enc = null) {return s\Mbstring::mb_strtoupper($s, $enc);}
+function mb_substitute_character($char = null) {return s\Mbstring::mb_substitute_character($char);}
+function mb_substr($s, $start, $length = 2147483647, $enc = null) {return s\Mbstring::mb_substr($s, $start, $length, $enc);}
+function mb_stripos($s, $needle, $offset = 0, $enc = null) {return s\Mbstring::mb_stripos($s, $needle, $offset, $enc);}
+function mb_stristr($s, $needle, $part = false, $enc = null) {return s\Mbstring::mb_stristr($s, $needle, $part, $enc);}
+function mb_strrchr($s, $needle, $part = false, $enc = null) {return s\Mbstring::mb_strrchr($s, $needle, $part, $enc);}
+function mb_strrichr($s, $needle, $part = false, $enc = null) {return s\Mbstring::mb_strrichr($s, $needle, $part, $enc);}
+function mb_strripos($s, $needle, $offset = 0, $enc = null) {return s\Mbstring::mb_strripos($s, $needle, $offset, $enc);}
+function mb_strrpos($s, $needle, $offset = 0, $enc = null) {return s\Mbstring::mb_strrpos($s, $needle, $offset, $enc);}
+function mb_strstr($s, $needle, $part = false, $enc = null) {return s\Mbstring::mb_strstr($s, $needle, $part, $enc);}
+function mb_get_info($type = 'all') {return s\Mbstring::mb_get_info($type);}
+function mb_http_output($enc = null) {return s\Mbstring::mb_http_output($enc);}
+function mb_strwidth($s, $enc = null) {return s\Mbstring::mb_strwidth($s, $enc);}
+function mb_substr_count($haystack, $needle, $enc = null) {return s\Mbstring::mb_substr_count($haystack, $needle, $enc);}
+function mb_output_handler($contents, $status) {return s\Mbstring::mb_output_handler($contents, $status);}
+function mb_http_input($type = '') {return s\Mbstring::mb_http_input($type);}
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/Bootup/utf8_encode.php
@@ -0,0 +1,17 @@
+<?php
+
+/*
+ * Copyright (C) 2016 Nicolas Grekas - p@tchwork.com
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the (at your option):
+ * Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
+ * GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
+ */
+
+use Patchwork\PHP\Shim as s;
+
+@trigger_error('You are using a fallback implementation of the xml extension. Installing the native one is highly recommended instead.', E_USER_DEPRECATED);
+
+function utf8_encode($s) {return s\Xml::utf8_encode($s);}
+function utf8_decode($s) {return s\Xml::utf8_decode($s);}
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/WindowsStreamWrapper.php
@@ -0,0 +1,404 @@
+<?php
+
+/*
+ * Copyright (C) 2014 Nicolas Grekas - p@tchwork.com
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the (at your option):
+ * Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
+ * GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
+ */
+
+namespace Patchwork\Utf8;
+
+/**
+ * Unicode UTF-8 aware stream based filesystem access on MS-Windows.
+ *
+ * Based on COM Scripting.FileSystemObject object and short paths.
+ * See Patchwork\Utf8::wrapPath()
+ *
+ * See also https://code.google.com/p/php-wfio/ for a PHP extension
+ * and comments on http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
+ */
+class WindowsStreamWrapper
+{
+    public $context;
+
+    protected $handle;
+
+    public static function hide($path)
+    {
+        list($fs, $path) = self::fs($path);
+        if ($fs->FileExists($path)) {
+            $fs->GetFile($path)->Attributes |= 2;
+        } elseif ($fs->FolderExists($path)) {
+            $fs->GetFolder($path)->Attributes |= 2;
+        } else {
+            return false;
+        }
+
+        return true;
+    }
+
+    public static function fs($path, $is_utf8 = true)
+    {
+        static $fs;
+
+        if (!class_exists('COM', false)) {
+            throw new \RuntimeException('The `wfio` or `com_dotnet` extension is required to handle UTF-8 filesystem access on Windows');
+        }
+
+        isset($fs) or $fs = new \COM('Scripting.FileSystemObject', null, CP_UTF8);
+
+        $path = explode('://', $path, 2);
+        $path = $path[(int) isset($path[1])];
+        $path = strtr($path, '/', '\\');
+        $pre = '';
+
+        if (!isset($path[0]) || ('/' !== $path[0] && '\\' !== $path[0] && false === strpos($path, ':'))) {
+            $pre = getcwd().'\\';
+        }
+
+        $pre = new \VARIANT($pre);
+
+        if ($is_utf8) {
+            $path = new \VARIANT($path, VT_BSTR, CP_UTF8);
+        } else {
+            $path = new \VARIANT($path);
+        }
+
+        return array($fs, $fs->getAbsolutePathName(variant_cat($pre, $path)));
+    }
+
+    public function dir_closedir()
+    {
+        $this->handle = null;
+
+        return true;
+    }
+
+    public function dir_opendir($path, $options)
+    {
+        list($fs, $path) = self::fs($path);
+        if (!$fs->FolderExists($path)) {
+            return false;
+        }
+
+        $dir = $fs->GetFolder($path);
+
+        try {
+            $f = array('.', '..');
+
+            foreach ($dir->SubFolders() as $v) {
+                $f[] = $v->Name;
+            }
+            foreach ($dir->Files as $v) {
+                $f[] = $v->Name;
+            }
+        } catch (\Exception $f) {
+            $f = array();
+        }
+
+        $this->handle = $f;
+
+        return true;
+    }
+
+    public function dir_readdir()
+    {
+        if (list(, $c) = each($this->handle)) {
+            return $c;
+        }
+
+        return false;
+    }
+
+    public function dir_rewinddir()
+    {
+        reset($this->handle);
+
+        return true;
+    }
+
+    public function mkdir($path, $mode, $options)
+    {
+        list($fs, $path) = self::fs($path);
+
+        try {
+            if ($options & STREAM_MKDIR_RECURSIVE) {
+                $path = $fs->GetAbsolutePathName($path);
+
+                $path = explode('\\', $path);
+
+                if (isset($path[3]) && '' === $path[0].$path[1]) {
+                    $pre = '\\\\'.$path[2].'\\'.$path[3].'\\';
+                    $i = 4;
+                } elseif (isset($path[1])) {
+                    $pre = $path[0].'\\';
+                    $i = 1;
+                } else {
+                    $pre = '';
+                    $i = 0;
+                }
+
+                while (isset($path[$i]) && $fs->FolderExists($pre.$path[$i])) {
+                    $pre .= $path[$i++].'\\';
+                }
+
+                if (!isset($path[$i])) {
+                    return false;
+                }
+
+                while (isset($path[$i])) {
+                    $fs->CreateFolder($pre .= $path[$i++].'\\');
+                }
+
+                return true;
+            } else {
+                $fs->CreateFolder($path);
+            }
+
+            return true;
+        } catch (\Exception $e) {
+            return false;
+        }
+    }
+
+    public function rename($from, $to)
+    {
+        list($fs, $to) = self::fs($to);
+
+        if ($fs->FileExists($to) || $fs->FolderExists($to)) {
+            return false;
+        }
+
+        list(, $from) = self::fs($from);
+
+        try {
+            if ($fs->FileExists($from)) {
+                $fs->MoveFile($from, $to);
+
+                return true;
+            }
+
+            if ($fs->FolderExists($from)) {
+                $fs->MoveFolder($from, $to);
+
+                return true;
+            }
+        } catch (\Exception $e) {
+        }
+
+        return false;
+    }
+
+    public function rmdir($path, $options)
+    {
+        list($fs, $path) = self::fs($path);
+
+        if ($fs->FolderExists($path)) {
+            return rmdir($fs->GetFolder($path)->ShortPath);
+        }
+
+        return false;
+    }
+
+    public function stream_close()
+    {
+        fclose($this->handle);
+        $this->handle = null;
+    }
+
+    public function stream_eof()
+    {
+        return feof($this->handle);
+    }
+
+    public function stream_flush()
+    {
+        return fflush($this->handle);
+    }
+
+    public function stream_lock($operation)
+    {
+        return flock($this->handle, $operation);
+    }
+
+    public function stream_metadata($path, $option, $value)
+    {
+        list($fs, $path) = self::fs($path);
+
+        if ($fs->FileExists($path)) {
+            $f = $fs->GetFile($path);
+        } elseif ($fs->FileExists($path)) {
+            $f = $fs->GetFolder($path);
+        } else {
+            $f = false;
+        }
+
+        if (STREAM_META_TOUCH === $option) {
+            if ($f) {
+                return touch($f->ShortPath);
+            }
+
+            try {
+                $fs->OpenTextFile($path, 8, true, 0)->Close();
+
+                return true;
+            } catch (\Exception $e) {
+            }
+        }
+
+        if (!$f) {
+            return false;
+        }
+
+        switch ($option) {
+            case STREAM_META_ACCESS:     return chmod($f->ShortPath, $value);
+            case STREAM_META_OWNER:
+            case STREAM_META_OWNER_NAME: return chown($f->ShortPath, $value);
+            case STREAM_META_GROUP:
+            case STREAM_META_GROUP_NAME: return chgrp($f->ShortPath, $value);
+            default: return false;
+        }
+    }
+
+    public function stream_open($path, $mode, $options, &$opened_path)
+    {
+        $mode .= '';
+        list($fs, $path) = self::fs($path);
+
+        if ($fs->FolderExists($path)) {
+            return false;
+        }
+
+        try {
+            if ('x' === $m = substr($mode, 0, 1)) {
+                $fs->CreateTextFile($path, false)->Close();
+                $f = $fs->GetFile($path);
+                $mode[0] = 'w';
+            } else {
+                $f = $fs->GetFile($path);
+            }
+        } catch (\Exception $f) {
+            try {
+                switch ($m) {
+                    case 'w':
+                    case 'c':
+                    case 'a':
+                        $h = $fs->CreateTextFile($path, true);
+                        $f = $fs->GetFile($path);
+                        $h->Close();
+                        break;
+
+                    default: return false;
+                }
+            } catch (\Exception $e) {
+                return false;
+            }
+        }
+
+        if (!(STREAM_REPORT_ERRORS & $options)) {
+            set_error_handler('var_dump', 0);
+            $e = error_reporting(0);
+        }
+
+        $this->handle = fopen($f->ShortPath, $mode);
+
+        if (!(STREAM_REPORT_ERRORS & $options)) {
+            error_reporting($e);
+            restore_error_handler();
+        }
+
+        if ($this->handle) {
+            return true;
+        }
+        if (isset($h)) {
+            $f->Delete(true);
+        }
+
+        return false;
+    }
+
+    public function stream_read($count)
+    {
+        return fread($this->handle, $count);
+    }
+
+    public function stream_seek($offset, $whence = SEEK_SET)
+    {
+        return fseek($this->handle, $offset, $whence);
+    }
+
+    public function stream_set_option($option, $arg1, $arg2)
+    {
+        switch ($option) {
+            case STREAM_OPTION_BLOCKING:     return stream_set_blocking($this->handle, $arg1);
+            case STREAM_OPTION_READ_TIMEOUT: return stream_set_timeout($this->handle, $arg1, $arg2);
+            case STREAM_OPTION_WRITE_BUFFER: return stream_set_write_buffer($this->handle, $arg1, $arg2);
+            default: return false;
+        }
+    }
+
+    public function stream_stat()
+    {
+        return fstat($this->handle);
+    }
+
+    public function stream_tell()
+    {
+        return ftell($this->handle);
+    }
+
+    public function stream_truncate($new_size)
+    {
+        return ftruncate($this->handle, $new_size);
+    }
+
+    public function stream_write($data)
+    {
+        return fwrite($this->handle, $data, strlen($data));
+    }
+
+    public function unlink($path)
+    {
+        list($fs, $path) = self::fs($path);
+
+        if ($fs->FileExists($path)) {
+            return unlink($fs->GetFile($path)->ShortPath);
+        }
+
+        return false;
+    }
+
+    public function url_stat($path, $flags)
+    {
+        list($fs, $path) = self::fs($path);
+
+        if ($fs->FileExists($path)) {
+            $f = $fs->GetFile($path);
+        } elseif ($fs->FolderExists($path)) {
+            $f = $fs->GetFolder($path);
+        } else {
+            return false;
+        }
+
+        if (STREAM_URL_STAT_QUIET & $flags) {
+            set_error_handler('var_dump', 0);
+            $e = error_reporting(0);
+        }
+
+        if (STREAM_URL_STAT_LINK & $flags) {
+            $f = @lstat($f->ShortPath) ?: stat($f->ShortPath);
+        } else {
+            $f = stat($f->ShortPath);
+        }
+
+        if (STREAM_URL_STAT_QUIET & $flags) {
+            error_reporting($e);
+            restore_error_handler();
+        }
+
+        return $f;
+    }
+}
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/data/caseFolding_full.ser
@@ -0,0 +1 @@
+a:2:{i:0;a:104:{i:0;s:2:"ß";i:1;s:2:"İ";i:2;s:2:"ŉ";i:3;s:2:"ǰ";i:4;s:2:"ΐ";i:5;s:2:"ΰ";i:6;s:2:"և";i:7;s:3:"ẖ";i:8;s:3:"ẗ";i:9;s:3:"ẘ";i:10;s:3:"ẙ";i:11;s:3:"ẚ";i:12;s:3:"ẞ";i:13;s:3:"ὐ";i:14;s:3:"ὒ";i:15;s:3:"ὔ";i:16;s:3:"ὖ";i:17;s:3:"ᾀ";i:18;s:3:"ᾁ";i:19;s:3:"ᾂ";i:20;s:3:"ᾃ";i:21;s:3:"ᾄ";i:22;s:3:"ᾅ";i:23;s:3:"ᾆ";i:24;s:3:"ᾇ";i:25;s:3:"ᾈ";i:26;s:3:"ᾉ";i:27;s:3:"ᾊ";i:28;s:3:"ᾋ";i:29;s:3:"ᾌ";i:30;s:3:"ᾍ";i:31;s:3:"ᾎ";i:32;s:3:"ᾏ";i:33;s:3:"ᾐ";i:34;s:3:"ᾑ";i:35;s:3:"ᾒ";i:36;s:3:"ᾓ";i:37;s:3:"ᾔ";i:38;s:3:"ᾕ";i:39;s:3:"ᾖ";i:40;s:3:"ᾗ";i:41;s:3:"ᾘ";i:42;s:3:"ᾙ";i:43;s:3:"ᾚ";i:44;s:3:"ᾛ";i:45;s:3:"ᾜ";i:46;s:3:"ᾝ";i:47;s:3:"ᾞ";i:48;s:3:"ᾟ";i:49;s:3:"ᾠ";i:50;s:3:"ᾡ";i:51;s:3:"ᾢ";i:52;s:3:"ᾣ";i:53;s:3:"ᾤ";i:54;s:3:"ᾥ";i:55;s:3:"ᾦ";i:56;s:3:"ᾧ";i:57;s:3:"ᾨ";i:58;s:3:"ᾩ";i:59;s:3:"ᾪ";i:60;s:3:"ᾫ";i:61;s:3:"ᾬ";i:62;s:3:"ᾭ";i:63;s:3:"ᾮ";i:64;s:3:"ᾯ";i:65;s:3:"ᾲ";i:66;s:3:"ᾳ";i:67;s:3:"ᾴ";i:68;s:3:"ᾶ";i:69;s:3:"ᾷ";i:70;s:3:"ᾼ";i:71;s:3:"ῂ";i:72;s:3:"ῃ";i:73;s:3:"ῄ";i:74;s:3:"ῆ";i:75;s:3:"ῇ";i:76;s:3:"ῌ";i:77;s:3:"ῒ";i:78;s:3:"ΐ";i:79;s:3:"ῖ";i:80;s:3:"ῗ";i:81;s:3:"ῢ";i:82;s:3:"ΰ";i:83;s:3:"ῤ";i:84;s:3:"ῦ";i:85;s:3:"ῧ";i:86;s:3:"ῲ";i:87;s:3:"ῳ";i:88;s:3:"ῴ";i:89;s:3:"ῶ";i:90;s:3:"ῷ";i:91;s:3:"ῼ";i:92;s:3:"ﬀ";i:93;s:3:"ﬁ";i:94;s:3:"ﬂ";i:95;s:3:"ﬃ";i:96;s:3:"ﬄ";i:97;s:3:"ﬅ";i:98;s:3:"ﬆ";i:99;s:3:"ﬓ";i:100;s:3:"ﬔ";i:101;s:3:"ﬕ";i:102;s:3:"ﬖ";i:103;s:3:"ﬗ";}i:1;a:104:{i:0;s:2:"ss";i:1;s:3:"i̇";i:2;s:3:"ʼn";i:3;s:3:"ǰ";i:4;s:6:"ΐ";i:5;s:6:"ΰ";i:6;s:4:"եւ";i:7;s:3:"ẖ";i:8;s:3:"ẗ";i:9;s:3:"ẘ";i:10;s:3:"ẙ";i:11;s:3:"aʾ";i:12;s:2:"ss";i:13;s:4:"ὐ";i:14;s:6:"ὒ";i:15;s:6:"ὔ";i:16;s:6:"ὖ";i:17;s:5:"ἀι";i:18;s:5:"ἁι";i:19;s:5:"ἂι";i:20;s:5:"ἃι";i:21;s:5:"ἄι";i:22;s:5:"ἅι";i:23;s:5:"ἆι";i:24;s:5:"ἇι";i:25;s:5:"ἀι";i:26;s:5:"ἁι";i:27;s:5:"ἂι";i:28;s:5:"ἃι";i:29;s:5:"ἄι";i:30;s:5:"ἅι";i:31;s:5:"ἆι";i:32;s:5:"ἇι";i:33;s:5:"ἠι";i:34;s:5:"ἡι";i:35;s:5:"ἢι";i:36;s:5:"ἣι";i:37;s:5:"ἤι";i:38;s:5:"ἥι";i:39;s:5:"ἦι";i:40;s:5:"ἧι";i:41;s:5:"ἠι";i:42;s:5:"ἡι";i:43;s:5:"ἢι";i:44;s:5:"ἣι";i:45;s:5:"ἤι";i:46;s:5:"ἥι";i:47;s:5:"ἦι";i:48;s:5:"ἧι";i:49;s:5:"ὠι";i:50;s:5:"ὡι";i:51;s:5:"ὢι";i:52;s:5:"ὣι";i:53;s:5:"ὤι";i:54;s:5:"ὥι";i:55;s:5:"ὦι";i:56;s:5:"ὧι";i:57;s:5:"ὠι";i:58;s:5:"ὡι";i:59;s:5:"ὢι";i:60;s:5:"ὣι";i:61;s:5:"ὤι";i:62;s:5:"ὥι";i:63;s:5:"ὦι";i:64;s:5:"ὧι";i:65;s:5:"ὰι";i:66;s:4:"αι";i:67;s:4:"άι";i:68;s:4:"ᾶ";i:69;s:6:"ᾶι";i:70;s:4:"αι";i:71;s:5:"ὴι";i:72;s:4:"ηι";i:73;s:4:"ήι";i:74;s:4:"ῆ";i:75;s:6:"ῆι";i:76;s:4:"ηι";i:77;s:6:"ῒ";i:78;s:6:"ΐ";i:79;s:4:"ῖ";i:80;s:6:"ῗ";i:81;s:6:"ῢ";i:82;s:6:"ΰ";i:83;s:4:"ῤ";i:84;s:4:"ῦ";i:85;s:6:"ῧ";i:86;s:5:"ὼι";i:87;s:4:"ωι";i:88;s:4:"ώι";i:89;s:4:"ῶ";i:90;s:6:"ῶι";i:91;s:4:"ωι";i:92;s:2:"ff";i:93;s:2:"fi";i:94;s:2:"fl";i:95;s:3:"ffi";i:96;s:3:"ffl";i:97;s:2:"st";i:98;s:2:"st";i:99;s:4:"մն";i:100;s:4:"մե";i:101;s:4:"մի";i:102;s:4:"վն";i:103;s:4:"մխ";}}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/data/to.bestfit1250.ser
@@ -0,0 +1,3 @@
+a:693:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"¡";s:1:"!";s:2:"¢";s:1:"c";s:2:"£";s:1:"L";s:2:"¤";s:1:"";s:2:"¥";s:1:"Y";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"ª";s:1:"a";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"2";s:2:"³";s:1:"3";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"¹";s:1:"1";s:2:"º";s:1:"o";s:2:"»";s:1:"";s:2:"¼";s:1:"1";s:2:"½";s:1:"1";s:2:"¾";s:1:"3";s:2:"¿";s:1:"?";s:2:"À";s:1:"A";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ã";s:1:"A";s:2:"Ä";s:1:"";s:2:"Å";s:1:"A";s:2:"Æ";s:1:"A";s:2:"Ç";s:1:"";s:2:"È";s:1:"E";s:2:"É";s:1:"";s:2:"Ê";s:1:"E";s:2:"Ë";s:1:"";s:2:"Ì";s:1:"I";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"I";s:2:"Ñ";s:1:"N";s:2:"Ò";s:1:"O";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Õ";s:1:"O";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ø";s:1:"O";s:2:"Ù";s:1:"U";s:2:"Ú";s:1:"";s:2:"Û";s:1:"U";s:2:"Ü";s:1:"";s:2:"Ý";s:1:"";s:2:"ß";s:1:"";s:2:"à";s:1:"a";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ã";s:1:"a";s:2:"ä";s:1:"";s:2:"å";s:1:"a";s:2:"æ";s:1:"a";s:2:"ç";s:1:"";s:2:"è";s:1:"e";s:2:"é";s:1:"";s:2:"ê";s:1:"e";s:2:"ë";s:1:"";s:2:"ì";s:1:"i";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"i";s:2:"ñ";s:1:"n";s:2:"ò";s:1:"o";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"õ";s:1:"o";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ø";s:1:"o";s:2:"ù";s:1:"u";s:2:"ú";s:1:"";s:2:"û";s:1:"u";s:2:"ü";s:1:"";s:2:"ý";s:1:"";s:2:"ÿ";s:1:"y";s:2:"Ā";s:1:"A";s:2:"ā";s:1:"a";s:2:"Ă";s:1:"";s:2:"ă";s:1:"";s:2:"Ą";s:1:"";s:2:"ą";s:1:"";s:2:"Ć";s:1:"";s:2:"ć";s:1:"";s:2:"Ĉ";s:1:"C";s:2:"ĉ";s:1:"c";s:2:"Ċ";s:1:"C";s:2:"ċ";s:1:"c";s:2:"Č";s:1:"";s:2:"č";s:1:"";s:2:"Ď";s:1:"";s:2:"ď";s:1:"";s:2:"Đ";s:1:"";s:2:"đ";s:1:"";s:2:"Ē";s:1:"E";s:2:"ē";s:1:"e";s:2:"Ĕ";s:1:"E";s:2:"ĕ";s:1:"e";s:2:"Ė";s:1:"E";s:2:"ė";s:1:"e";s:2:"Ę";s:1:"";s:2:"ę";s:1:"";s:2:"Ě";s:1:"";s:2:"ě";s:1:"";s:2:"Ĝ";s:1:"G";s:2:"ĝ";s:1:"g";s:2:"Ğ";s:1:"G";s:2:"ğ";s:1:"g";s:2:"Ġ";s:1:"G";s:2:"ġ";s:1:"g";s:2:"Ģ";s:1:"G";s:2:"ģ";s:1:"g";s:2:"Ĥ";s:1:"H";s:2:"ĥ";s:1:"h";s:2:"Ħ";s:1:"H";s:2:"ħ";s:1:"h";s:2:"Ĩ";s:1:"I";s:2:"ĩ";s:1:"i";s:2:"Ī";s:1:"I";s:2:"ī";s:1:"i";s:2:"Ĭ";s:1:"I";s:2:"ĭ";s:1:"i";s:2:"Į";s:1:"I";s:2:"į";s:1:"i";s:2:"İ";s:1:"I";s:2:"ı";s:1:"i";s:2:"Ĵ";s:1:"J";s:2:"ĵ";s:1:"j";s:2:"Ķ";s:1:"K";s:2:"ķ";s:1:"k";s:2:"Ĺ";s:1:"";s:2:"ĺ";s:1:"";s:2:"Ļ";s:1:"L";s:2:"ļ";s:1:"l";s:2:"Ľ";s:1:"";s:2:"ľ";s:1:"";s:2:"Ł";s:1:"";s:2:"ł";s:1:"";s:2:"Ń";s:1:"";s:2:"ń";s:1:"";s:2:"Ņ";s:1:"N";s:2:"ņ";s:1:"n";s:2:"Ň";s:1:"";s:2:"ň";s:1:"";s:2:"Ō";s:1:"O";s:2:"ō";s:1:"o";s:2:"Ŏ";s:1:"O";s:2:"ŏ";s:1:"o";s:2:"Ő";s:1:"";s:2:"ő";s:1:"";s:2:"Œ";s:1:"O";s:2:"œ";s:1:"o";s:2:"Ŕ";s:1:"";s:2:"ŕ";s:1:"";s:2:"Ŗ";s:1:"R";s:2:"ŗ";s:1:"r";s:2:"Ř";s:1:"";s:2:"ř";s:1:"";s:2:"Ś";s:1:"";s:2:"ś";s:1:"";s:2:"Ŝ";s:1:"S";s:2:"ŝ";s:1:"s";s:2:"Ş";s:1:"";s:2:"ş";s:1:"";s:2:"Š";s:1:"";s:2:"š";s:1:"";s:2:"Ţ";s:1:"";s:2:"ţ";s:1:"";s:2:"Ť";s:1:"";s:2:"ť";s:1:"";s:2:"Ŧ";s:1:"T";s:2:"ŧ";s:1:"t";s:2:"Ũ";s:1:"U";s:2:"ũ";s:1:"u";s:2:"Ū";s:1:"U";s:2:"ū";s:1:"u";s:2:"Ŭ";s:1:"U";s:2:"ŭ";s:1:"u";s:2:"Ů";s:1:"";s:2:"ů";s:1:"";s:2:"Ű";s:1:"";s:2:"ű";s:1:"";s:2:"Ų";s:1:"U";s:2:"ų";s:1:"u";s:2:"Ŵ";s:1:"W";s:2:"ŵ";s:1:"w";s:2:"Ŷ";s:1:"Y";s:2:"ŷ";s:1:"y";s:2:"Ÿ";s:1:"Y";s:2:"Ź";s:1:"";s:2:"ź";s:1:"";s:2:"Ż";s:1:"";s:2:"ż";s:1:"";s:2:"Ž";s:1:"";s:2:"ž";s:1:"";s:2:"ƀ";s:1:"b";s:2:"Ɖ";s:1:"";s:2:"Ƒ";s:1:"F";s:2:"ƒ";s:1:"f";s:2:"Ɨ";s:1:"I";s:2:"ƚ";s:1:"l";s:2:"Ɵ";s:1:"O";s:2:"Ơ";s:1:"O";s:2:"ơ";s:1:"o";s:2:"ƫ";s:1:"t";s:2:"Ʈ";s:1:"T";s:2:"Ư";s:1:"U";s:2:"ư";s:1:"u";s:2:"ƶ";s:1:"z";s:2:"ǀ";s:1:"|";s:2:"ǃ";s:1:"!";s:2:"Ǎ";s:1:"A";s:2:"ǎ";s:1:"a";s:2:"Ǐ";s:1:"I";s:2:"ǐ";s:1:"i";s:2:"Ǒ";s:1:"O";s:2:"ǒ";s:1:"o";s:2:"Ǔ";s:1:"U";s:2:"ǔ";s:1:"u";s:2:"Ǖ";s:1:"U";s:2:"ǖ";s:1:"u";s:2:"Ǘ";s:1:"U";s:2:"ǘ";s:1:"u";s:2:"Ǚ";s:1:"U";s:2:"ǚ";s:1:"u";s:2:"Ǜ";s:1:"U";s:2:"ǜ";s:1:"u";s:2:"Ǟ";s:1:"A";s:2:"ǟ";s:1:"a";s:2:"Ǥ";s:1:"G";s:2:"ǥ";s:1:"g";s:2:"Ǧ";s:1:"G";s:2:"ǧ";s:1:"g";s:2:"Ǩ";s:1:"K";s:2:"ǩ";s:1:"k";s:2:"Ǫ";s:1:"O";s:2:"ǫ";s:1:"o";s:2:"Ǭ";s:1:"O";s:2:"ǭ";s:1:"o";s:2:"ǰ";s:1:"j";s:2:"ɡ";s:1:"g";s:2:"ʹ";s:1:"'";s:2:"ʺ";s:1:""";s:2:"ʻ";s:1:"";s:2:"ʼ";s:1:"'";s:2:"˄";s:1:"^";s:2:"ˆ";s:1:"^";s:2:"ˇ";s:1:"";s:2:"ˈ";s:1:"'";s:2:"ˉ";s:1:"";s:2:"ˊ";s:1:"";s:2:"ˋ";s:1:"`";s:2:"ˍ";s:1:"_";s:2:"˘";s:1:"";s:2:"˙";s:1:"";s:2:"˚";s:1:"";s:2:"˛";s:1:"";s:2:"˜";s:1:"~";s:2:"˝";s:1:"";s:2:"̀";s:1:"`";s:2:"́";s:1:"";s:2:"̂";s:1:"^";s:2:"̃";s:1:"~";s:2:"̄";s:1:"";s:2:"̅";s:1:"";s:2:"̆";s:1:"";s:2:"̇";s:1:"";s:2:"̈";s:1:"";s:2:"̊";s:1:"";s:2:"̌";s:1:"";s:2:"̎";s:1:""";s:2:"̧";s:1:"";s:2:"̱";s:1:"_";s:2:"̲";s:1:"_";s:2:";";s:1:";";s:2:"β";s:1:"";s:2:"μ";s:1:"";s:2:"һ";s:1:"h";s:2:"։";s:1:":";s:2:"٪";s:1:"%";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:"‐";s:1:"-";s:3:"‑";s:1:"-";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"‚";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"„";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:3:"•";s:1:"";s:3:"․";s:1:"";s:3:"…";s:1:"";s:3:"‰";s:1:"";s:3:"′";s:1:"'";s:3:"″";s:1:"";s:3:"‵";s:1:"`";s:3:"‹";s:1:"";s:3:"›";s:1:"";s:3:"‼";s:1:"!";s:3:"⁄";s:1:"/";s:3:"⁰";s:1:"";s:3:"⁴";s:1:"4";s:3:"⁵";s:1:"5";s:3:"⁶";s:1:"6";s:3:"⁷";s:1:"7";s:3:"⁸";s:1:"8";s:3:"₀";s:1:"0";s:3:"₁";s:1:"1";s:3:"₂";s:1:"2";s:3:"₃";s:1:"3";s:3:"₄";s:1:"4";s:3:"₅";s:1:"5";s:3:"₆";s:1:"6";s:3:"₇";s:1:"7";s:3:"₈";s:1:"8";s:3:"₉";s:1:"9";s:3:"€";s:1:"";s:3:"₤";s:1:"";s:3:"ℂ";s:1:"C";s:3:"ℇ";s:1:"E";s:3:"ℊ";s:1:"g";s:3:"ℋ";s:1:"H";s:3:"ℌ";s:1:"H";s:3:"ℍ";s:1:"H";s:3:"ℎ";s:1:"h";s:3:"ℐ";s:1:"I";s:3:"ℑ";s:1:"I";s:3:"ℒ";s:1:"L";s:3:"ℓ";s:1:"l";s:3:"ℕ";s:1:"N";s:3:"℘";s:1:"P";s:3:"ℙ";s:1:"P";s:3:"ℚ";s:1:"Q";s:3:"ℛ";s:1:"R";s:3:"ℜ";s:1:"R";s:3:"ℝ";s:1:"R";s:3:"™";s:1:"";s:3:"ℤ";s:1:"Z";s:3:"ℨ";s:1:"Z";s:3:"K";s:1:"K";s:3:"Å";s:1:"";s:3:"ℬ";s:1:"B";s:3:"ℭ";s:1:"C";s:3:"℮";s:1:"e";s:3:"ℯ";s:1:"e";s:3:"ℰ";s:1:"E";s:3:"ℱ";s:1:"F";s:3:"ℳ";s:1:"M";s:3:"ℴ";s:1:"o";s:3:"←";s:1:"";s:3:"↑";s:1:"^";s:3:"→";s:1:"";s:3:"↓";s:1:"";s:3:"↔";s:1:"-";s:3:"↕";s:1:"|";s:3:"↨";s:1:"|";s:3:"∅";s:1:"";s:3:"−";s:1:"-";s:3:"∓";s:1:"";s:3:"∕";s:1:"/";s:3:"∖";s:1:"\";s:3:"∗";s:1:"*";s:3:"∘";s:1:"";s:3:"∙";s:1:"";s:3:"∟";s:1:"L";s:3:"∣";s:1:"|";s:3:"∶";s:1:":";s:3:"∼";s:1:"~";s:3:"≪";s:1:"";s:3:"≫";s:1:"";s:3:"⋅";s:1:"";s:3:"⌂";s:1:"";s:3:"⌃";s:1:"^";s:3:"〈";s:1:"<";s:3:"〉";s:1:">";s:3:"─";s:1:"";s:3:"│";s:1:"-";s:3:"┌";s:1:"-";s:3:"┐";s:1:"";s:3:"└";s:1:"L";s:3:"┘";s:1:"-";s:3:"├";s:1:"+";s:3:"┤";s:1:"+";s:3:"┬";s:1:"T";s:3:"┴";s:1:"+";s:3:"┼";s:1:"+";s:3:"═";s:1:"=";s:3:"║";s:1:"";s:3:"╔";s:1:"-";s:3:"╗";s:1:"";s:3:"╚";s:1:"L";s:3:"╝";s:1:"-";s:3:"╠";s:1:"";s:3:"╣";s:1:"";s:3:"╦";s:1:"T";s:3:"╩";s:1:"";s:3:"╬";s:1:"+";s:3:"▀";s:1:"-";s:3:"▄";s:1:"-";s:3:"█";s:1:"-";s:3:"░";s:1:"-";s:3:"▒";s:1:"-";s:3:"▓";s:1:"-";s:3:"■";s:1:"";s:3:"▬";s:1:"-";s:3:"▲";s:1:"^";s:3:"►";s:1:">";s:3:"▼";s:1:"";s:3:"◄";s:1:"<";s:3:"○";s:1:"0";s:3:"◘";s:1:"";s:3:"◙";s:1:"0";s:3:"☺";s:1:"";s:3:"☻";s:1:"";s:3:"☼";s:1:"0";s:3:"♀";s:1:"+";s:3:"♂";s:1:">";s:3:"♠";s:1:"";s:3:"♣";s:1:"";s:3:"♥";s:1:"";s:3:"♦";s:1:"";s:3:"♪";s:1:"d";s:3:"♫";s:1:"d";s:3:"❘";s:1:"|";s:3:"❛";s:1:"";s:3:"❜";s:1:"";s:3:"❝";s:1:"";s:3:"❞";s:1:"";s:3:"　";s:1:" ";s:3:"〈";s:1:"<";s:3:"〉";s:1:">";s:3:"《";s:1:"";s:3:"》";s:1:"";s:3:"〚";s:1:"[";s:3:"〛";s:1:"]";s:3:"〝";s:1:"";s:3:"〞";s:1:"";s:3:"〟";s:1:"";s:3:"・";s:1:"";s:3:"ー";s:1:"";s:3:"！";s:1:"!";s:3:"＂";s:1:""";s:3:"＃";s:1:"#";s:3:"＄";s:1:"$";s:3:"％";s:1:"%";s:3:"＆";s:1:"&";s:3:"＇";s:1:"'";s:3:"（";s:1:"(";s:3:"）";s:1:")";s:3:"＊";s:1:"*";s:3:"＋";s:1:"+";s:3:"，";s:1:",";s:3:"－";s:1:"-";s:3:"．";s:1:".";s:3:"／";s:1:"/";s:3:"０";s:1:"0";s:3:"１";s:1:"1";s:3:"２";s:1:"2";s:3:"３";s:1:"3";s:3:"４";s:1:"4";s:3:"５";s:1:"5";s:3:"６";s:1:"6";s:3:"７";s:1:"7";s:3:"８";s:1:"8";s:3:"９";s:1:"9";s:3:"：";s:1:":";s:3:"；";s:1:";";s:3:"＜";s:1:"<";s:3:"＝";s:1:"=";s:3:"＞";s:1:">";s:3:"？";s:1:"?";s:3:"＠";s:1:"@";s:3:"Ａ";s:1:"A";s:3:"Ｂ";s:1:"B";s:3:"Ｃ";s:1:"C";s:3:"Ｄ";s:1:"D";s:3:"Ｅ";s:1:"E";s:3:"Ｆ";s:1:"F";s:3:"Ｇ";s:1:"G";s:3:"Ｈ";s:1:"H";s:3:"Ｉ";s:1:"I";s:3:"Ｊ";s:1:"J";s:3:"Ｋ";s:1:"K";s:3:"Ｌ";s:1:"L";s:3:"Ｍ";s:1:"M";s:3:"Ｎ";s:1:"N";s:3:"Ｏ";s:1:"O";s:3:"Ｐ";s:1:"P";s:3:"Ｑ";s:1:"Q";s:3:"Ｒ";s:1:"R";s:3:"Ｓ";s:1:"S";s:3:"Ｔ";s:1:"T";s:3:"Ｕ";s:1:"U";s:3:"Ｖ";s:1:"V";s:3:"Ｗ";s:1:"W";s:3:"Ｘ";s:1:"X";s:3:"Ｙ";s:1:"Y";s:3:"Ｚ";s:1:"Z";s:3:"［";s:1:"[";s:3:"＼";s:1:"\";s:3:"］";s:1:"]";s:3:"＾";s:1:"^";s:3:"＿";s:1:"_";s:3:"｀";s:1:"`";s:3:"ａ";s:1:"a";s:3:"ｂ";s:1:"b";s:3:"ｃ";s:1:"c";s:3:"ｄ";s:1:"d";s:3:"ｅ";s:1:"e";s:3:"ｆ";s:1:"f";s:3:"ｇ";s:1:"g";s:3:"ｈ";s:1:"h";s:3:"ｉ";s:1:"i";s:3:"ｊ";s:1:"j";s:3:"ｋ";s:1:"k";s:3:"ｌ";s:1:"l";s:3:"ｍ";s:1:"m";s:3:"ｎ";s:1:"n";s:3:"ｏ";s:1:"o";s:3:"ｐ";s:1:"p";s:3:"ｑ";s:1:"q";s:3:"ｒ";s:1:"r";s:3:"ｓ";s:1:"s";s:3:"ｔ";s:1:"t";s:3:"ｕ";s:1:"u";s:3:"ｖ";s:1:"v";s:3:"ｗ";s:1:"w";s:3:"ｘ";s:1:"x";s:3:"ｙ";s:1:"y";s:3:"ｚ";s:1:"z";s:3:"｛";s:1:"{";s:3:"｜";s:1:"|";s:3:"｝";s:1:"}";s:3:"～";s:1:"~";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/data/to.bestfit1251.ser
@@ -0,0 +1,3 @@
+a:640:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"¤";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"©";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"»";s:1:"";s:2:"À";s:1:"A";s:2:"Á";s:1:"A";s:2:"Â";s:1:"A";s:2:"Ã";s:1:"A";s:2:"Ä";s:1:"A";s:2:"Å";s:1:"A";s:2:"Ç";s:1:"C";s:2:"È";s:1:"E";s:2:"É";s:1:"E";s:2:"Ê";s:1:"E";s:2:"Ë";s:1:"E";s:2:"Ì";s:1:"I";s:2:"Í";s:1:"I";s:2:"Î";s:1:"I";s:2:"Ï";s:1:"I";s:2:"Ñ";s:1:"N";s:2:"Ò";s:1:"O";s:2:"Ó";s:1:"O";s:2:"Ô";s:1:"O";s:2:"Õ";s:1:"O";s:2:"Ö";s:1:"O";s:2:"Ø";s:1:"O";s:2:"Ù";s:1:"U";s:2:"Ú";s:1:"U";s:2:"Û";s:1:"U";s:2:"Ü";s:1:"U";s:2:"Ý";s:1:"Y";s:2:"à";s:1:"a";s:2:"á";s:1:"a";s:2:"â";s:1:"a";s:2:"ã";s:1:"a";s:2:"ä";s:1:"a";s:2:"å";s:1:"a";s:2:"ç";s:1:"c";s:2:"è";s:1:"e";s:2:"é";s:1:"e";s:2:"ê";s:1:"e";s:2:"ë";s:1:"e";s:2:"ì";s:1:"i";s:2:"í";s:1:"i";s:2:"î";s:1:"i";s:2:"ï";s:1:"i";s:2:"ñ";s:1:"n";s:2:"ò";s:1:"o";s:2:"ó";s:1:"o";s:2:"ô";s:1:"o";s:2:"õ";s:1:"o";s:2:"ö";s:1:"o";s:2:"ø";s:1:"o";s:2:"ù";s:1:"u";s:2:"ú";s:1:"u";s:2:"û";s:1:"u";s:2:"ü";s:1:"u";s:2:"ý";s:1:"y";s:2:"ÿ";s:1:"y";s:2:"Ā";s:1:"A";s:2:"ā";s:1:"a";s:2:"Ă";s:1:"A";s:2:"ă";s:1:"a";s:2:"Ą";s:1:"A";s:2:"ą";s:1:"a";s:2:"Ć";s:1:"C";s:2:"ć";s:1:"c";s:2:"Ĉ";s:1:"C";s:2:"ĉ";s:1:"c";s:2:"Ċ";s:1:"C";s:2:"ċ";s:1:"c";s:2:"Č";s:1:"C";s:2:"č";s:1:"c";s:2:"Ď";s:1:"D";s:2:"ď";s:1:"d";s:2:"Đ";s:1:"D";s:2:"đ";s:1:"d";s:2:"Ē";s:1:"E";s:2:"ē";s:1:"e";s:2:"Ĕ";s:1:"E";s:2:"ĕ";s:1:"e";s:2:"Ė";s:1:"E";s:2:"ė";s:1:"e";s:2:"Ę";s:1:"E";s:2:"ę";s:1:"e";s:2:"Ě";s:1:"E";s:2:"ě";s:1:"e";s:2:"Ĝ";s:1:"G";s:2:"ĝ";s:1:"g";s:2:"Ğ";s:1:"G";s:2:"ğ";s:1:"g";s:2:"Ġ";s:1:"G";s:2:"ġ";s:1:"g";s:2:"Ģ";s:1:"G";s:2:"ģ";s:1:"g";s:2:"Ĥ";s:1:"H";s:2:"ĥ";s:1:"h";s:2:"Ħ";s:1:"H";s:2:"ħ";s:1:"h";s:2:"Ĩ";s:1:"I";s:2:"ĩ";s:1:"i";s:2:"Ī";s:1:"I";s:2:"ī";s:1:"i";s:2:"Ĭ";s:1:"I";s:2:"ĭ";s:1:"i";s:2:"Į";s:1:"I";s:2:"į";s:1:"i";s:2:"İ";s:1:"I";s:2:"Ĵ";s:1:"J";s:2:"ĵ";s:1:"j";s:2:"Ķ";s:1:"K";s:2:"ķ";s:1:"k";s:2:"Ĺ";s:1:"L";s:2:"ĺ";s:1:"l";s:2:"Ļ";s:1:"L";s:2:"ļ";s:1:"l";s:2:"Ľ";s:1:"L";s:2:"ľ";s:1:"l";s:2:"Ł";s:1:"L";s:2:"ł";s:1:"l";s:2:"Ń";s:1:"N";s:2:"ń";s:1:"n";s:2:"Ņ";s:1:"N";s:2:"ņ";s:1:"n";s:2:"Ň";s:1:"N";s:2:"ň";s:1:"n";s:2:"Ō";s:1:"O";s:2:"ō";s:1:"o";s:2:"Ŏ";s:1:"O";s:2:"ŏ";s:1:"o";s:2:"Ő";s:1:"O";s:2:"ő";s:1:"o";s:2:"Ŕ";s:1:"R";s:2:"ŕ";s:1:"r";s:2:"Ŗ";s:1:"R";s:2:"ŗ";s:1:"r";s:2:"Ř";s:1:"R";s:2:"ř";s:1:"r";s:2:"Ś";s:1:"S";s:2:"ś";s:1:"s";s:2:"Ŝ";s:1:"S";s:2:"ŝ";s:1:"s";s:2:"Ş";s:1:"S";s:2:"ş";s:1:"s";s:2:"Š";s:1:"S";s:2:"š";s:1:"s";s:2:"Ţ";s:1:"T";s:2:"ţ";s:1:"t";s:2:"Ť";s:1:"T";s:2:"ť";s:1:"t";s:2:"Ŧ";s:1:"T";s:2:"ŧ";s:1:"t";s:2:"Ũ";s:1:"U";s:2:"ũ";s:1:"u";s:2:"Ū";s:1:"U";s:2:"ū";s:1:"u";s:2:"Ŭ";s:1:"U";s:2:"ŭ";s:1:"u";s:2:"Ů";s:1:"U";s:2:"ů";s:1:"u";s:2:"Ű";s:1:"U";s:2:"ű";s:1:"u";s:2:"Ų";s:1:"U";s:2:"ų";s:1:"u";s:2:"Ŵ";s:1:"W";s:2:"ŵ";s:1:"w";s:2:"Ŷ";s:1:"Y";s:2:"ŷ";s:1:"y";s:2:"Ÿ";s:1:"Y";s:2:"Ź";s:1:"Z";s:2:"ź";s:1:"z";s:2:"Ż";s:1:"Z";s:2:"ż";s:1:"z";s:2:"Ž";s:1:"Z";s:2:"ž";s:1:"z";s:2:"ƀ";s:1:"b";s:2:"Ɨ";s:1:"I";s:2:"ƚ";s:1:"l";s:2:"Ɵ";s:1:"O";s:2:"Ơ";s:1:"O";s:2:"ơ";s:1:"o";s:2:"ƫ";s:1:"t";s:2:"Ʈ";s:1:"T";s:2:"Ư";s:1:"U";s:2:"ư";s:1:"u";s:2:"Ǎ";s:1:"A";s:2:"ǎ";s:1:"a";s:2:"Ǐ";s:1:"I";s:2:"ǐ";s:1:"i";s:2:"Ǒ";s:1:"O";s:2:"ǒ";s:1:"o";s:2:"Ǔ";s:1:"U";s:2:"ǔ";s:1:"u";s:2:"Ǖ";s:1:"U";s:2:"ǖ";s:1:"u";s:2:"Ǘ";s:1:"U";s:2:"ǘ";s:1:"u";s:2:"Ǚ";s:1:"U";s:2:"ǚ";s:1:"u";s:2:"Ǜ";s:1:"U";s:2:"ǜ";s:1:"u";s:2:"Ǟ";s:1:"A";s:2:"ǟ";s:1:"a";s:2:"Ǥ";s:1:"G";s:2:"ǥ";s:1:"g";s:2:"Ǧ";s:1:"G";s:2:"ǧ";s:1:"g";s:2:"Ǩ";s:1:"K";s:2:"ǩ";s:1:"k";s:2:"Ǫ";s:1:"O";s:2:"ǫ";s:1:"o";s:2:"Ǭ";s:1:"O";s:2:"ǭ";s:1:"o";s:2:"ǰ";s:1:"j";s:2:"Ё";s:1:"";s:2:"Ђ";s:1:"";s:2:"Ѓ";s:1:"";s:2:"Є";s:1:"";s:2:"Ѕ";s:1:"";s:2:"І";s:1:"";s:2:"Ї";s:1:"";s:2:"Ј";s:1:"";s:2:"Љ";s:1:"";s:2:"Њ";s:1:"";s:2:"Ћ";s:1:"";s:2:"Ќ";s:1:"";s:2:"Ў";s:1:"";s:2:"Џ";s:1:"";s:2:"А";s:1:"";s:2:"Б";s:1:"";s:2:"В";s:1:"";s:2:"Г";s:1:"";s:2:"Д";s:1:"";s:2:"Е";s:1:"";s:2:"Ж";s:1:"";s:2:"З";s:1:"";s:2:"И";s:1:"";s:2:"Й";s:1:"";s:2:"К";s:1:"";s:2:"Л";s:1:"";s:2:"М";s:1:"";s:2:"Н";s:1:"";s:2:"О";s:1:"";s:2:"П";s:1:"";s:2:"Р";s:1:"";s:2:"С";s:1:"";s:2:"Т";s:1:"";s:2:"У";s:1:"";s:2:"Ф";s:1:"";s:2:"Х";s:1:"";s:2:"Ц";s:1:"";s:2:"Ч";s:1:"";s:2:"Ш";s:1:"";s:2:"Щ";s:1:"";s:2:"Ъ";s:1:"";s:2:"Ы";s:1:"";s:2:"Ь";s:1:"";s:2:"Э";s:1:"";s:2:"Ю";s:1:"";s:2:"Я";s:1:"";s:2:"а";s:1:"";s:2:"б";s:1:"";s:2:"в";s:1:"";s:2:"г";s:1:"";s:2:"д";s:1:"";s:2:"е";s:1:"";s:2:"ж";s:1:"";s:2:"з";s:1:"";s:2:"и";s:1:"";s:2:"й";s:1:"";s:2:"к";s:1:"";s:2:"л";s:1:"";s:2:"м";s:1:"";s:2:"н";s:1:"";s:2:"о";s:1:"";s:2:"п";s:1:"";s:2:"р";s:1:"";s:2:"с";s:1:"";s:2:"т";s:1:"";s:2:"у";s:1:"";s:2:"ф";s:1:"";s:2:"х";s:1:"";s:2:"ц";s:1:"";s:2:"ч";s:1:"";s:2:"ш";s:1:"";s:2:"щ";s:1:"";s:2:"ъ";s:1:"";s:2:"ы";s:1:"";s:2:"ь";s:1:"";s:2:"э";s:1:"";s:2:"ю";s:1:"";s:2:"я";s:1:"";s:2:"ё";s:1:"";s:2:"ђ";s:1:"";s:2:"ѓ";s:1:"";s:2:"є";s:1:"";s:2:"ѕ";s:1:"";s:2:"і";s:1:"";s:2:"ї";s:1:"";s:2:"ј";s:1:"";s:2:"љ";s:1:"";s:2:"њ";s:1:"";s:2:"ћ";s:1:"";s:2:"ќ";s:1:"";s:2:"ў";s:1:"";s:2:"џ";s:1:"";s:2:"Ґ";s:1:"";s:2:"ґ";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"‚";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"„";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:3:"•";s:1:"";s:3:"…";s:1:"";s:3:"‰";s:1:"";s:3:"‹";s:1:"";s:3:"›";s:1:"";s:3:"‼";s:1:"!";s:3:"€";s:1:"";s:3:"№";s:1:"";s:3:"™";s:1:"";s:3:"←";s:1:"<";s:3:"↑";s:1:"^";s:3:"→";s:1:">";s:3:"↓";s:1:"v";s:3:"↔";s:1:"-";s:3:"↕";s:1:"";s:3:"↨";s:1:"";s:3:"∙";s:1:"";s:3:"√";s:1:"v";s:3:"∟";s:1:"L";s:3:"⌂";s:1:"";s:3:"─";s:1:"-";s:3:"│";s:1:"";s:3:"┌";s:1:"-";s:3:"┐";s:1:"";s:3:"└";s:1:"L";s:3:"┘";s:1:"-";s:3:"├";s:1:"+";s:3:"┤";s:1:"+";s:3:"┬";s:1:"T";s:3:"┴";s:1:"+";s:3:"┼";s:1:"+";s:3:"═";s:1:"=";s:3:"║";s:1:"";s:3:"╒";s:1:"-";s:3:"╓";s:1:"";s:3:"╔";s:1:"";s:3:"╕";s:1:"";s:3:"╖";s:1:"";s:3:"╗";s:1:"";s:3:"╘";s:1:"L";s:3:"╙";s:1:"L";s:3:"╚";s:1:"L";s:3:"╛";s:1:"-";s:3:"╜";s:1:"-";s:3:"╝";s:1:"-";s:3:"╞";s:1:"";s:3:"╟";s:1:"";s:3:"╠";s:1:"";s:3:"╡";s:1:"";s:3:"╢";s:1:"";s:3:"╣";s:1:"";s:3:"╤";s:1:"T";s:3:"╥";s:1:"T";s:3:"╦";s:1:"T";s:3:"╧";s:1:"";s:3:"╨";s:1:"";s:3:"╩";s:1:"";s:3:"╪";s:1:"+";s:3:"╫";s:1:"+";s:3:"╬";s:1:"+";s:3:"▀";s:1:"-";s:3:"▄";s:1:"-";s:3:"█";s:1:"-";s:3:"▌";s:1:"";s:3:"▐";s:1:"";s:3:"░";s:1:"-";s:3:"▒";s:1:"-";s:3:"▓";s:1:"-";s:3:"■";s:1:"";s:3:"▬";s:1:"-";s:3:"▲";s:1:"^";s:3:"►";s:1:">";s:3:"▼";s:1:"";s:3:"◄";s:1:"<";s:3:"○";s:1:"0";s:3:"◘";s:1:"";s:3:"◙";s:1:"0";s:3:"☺";s:1:"O";s:3:"☻";s:1:"O";s:3:"☼";s:1:"0";s:3:"♀";s:1:"+";s:3:"♂";s:1:">";s:3:"♠";s:1:"";s:3:"♣";s:1:"";s:3:"♥";s:1:"";s:3:"♦";s:1:"";s:3:"♪";s:1:"d";s:3:"♫";s:1:"d";s:3:"！";s:1:"!";s:3:"＂";s:1:""";s:3:"＃";s:1:"#";s:3:"＄";s:1:"$";s:3:"％";s:1:"%";s:3:"＆";s:1:"&";s:3:"＇";s:1:"'";s:3:"（";s:1:"(";s:3:"）";s:1:")";s:3:"＊";s:1:"*";s:3:"＋";s:1:"+";s:3:"，";s:1:",";s:3:"－";s:1:"-";s:3:"．";s:1:".";s:3:"／";s:1:"/";s:3:"０";s:1:"0";s:3:"１";s:1:"1";s:3:"２";s:1:"2";s:3:"３";s:1:"3";s:3:"４";s:1:"4";s:3:"５";s:1:"5";s:3:"６";s:1:"6";s:3:"７";s:1:"7";s:3:"８";s:1:"8";s:3:"９";s:1:"9";s:3:"：";s:1:":";s:3:"；";s:1:";";s:3:"＜";s:1:"<";s:3:"＝";s:1:"=";s:3:"＞";s:1:">";s:3:"？";s:1:"?";s:3:"＠";s:1:"@";s:3:"Ａ";s:1:"A";s:3:"Ｂ";s:1:"B";s:3:"Ｃ";s:1:"C";s:3:"Ｄ";s:1:"D";s:3:"Ｅ";s:1:"E";s:3:"Ｆ";s:1:"F";s:3:"Ｇ";s:1:"G";s:3:"Ｈ";s:1:"H";s:3:"Ｉ";s:1:"I";s:3:"Ｊ";s:1:"J";s:3:"Ｋ";s:1:"K";s:3:"Ｌ";s:1:"L";s:3:"Ｍ";s:1:"M";s:3:"Ｎ";s:1:"N";s:3:"Ｏ";s:1:"O";s:3:"Ｐ";s:1:"P";s:3:"Ｑ";s:1:"Q";s:3:"Ｒ";s:1:"R";s:3:"Ｓ";s:1:"S";s:3:"Ｔ";s:1:"T";s:3:"Ｕ";s:1:"U";s:3:"Ｖ";s:1:"V";s:3:"Ｗ";s:1:"W";s:3:"Ｘ";s:1:"X";s:3:"Ｙ";s:1:"Y";s:3:"Ｚ";s:1:"Z";s:3:"［";s:1:"[";s:3:"＼";s:1:"\";s:3:"］";s:1:"]";s:3:"＾";s:1:"^";s:3:"＿";s:1:"_";s:3:"｀";s:1:"`";s:3:"ａ";s:1:"a";s:3:"ｂ";s:1:"b";s:3:"ｃ";s:1:"c";s:3:"ｄ";s:1:"d";s:3:"ｅ";s:1:"e";s:3:"ｆ";s:1:"f";s:3:"ｇ";s:1:"g";s:3:"ｈ";s:1:"h";s:3:"ｉ";s:1:"i";s:3:"ｊ";s:1:"j";s:3:"ｋ";s:1:"k";s:3:"ｌ";s:1:"l";s:3:"ｍ";s:1:"m";s:3:"ｎ";s:1:"n";s:3:"ｏ";s:1:"o";s:3:"ｐ";s:1:"p";s:3:"ｑ";s:1:"q";s:3:"ｒ";s:1:"r";s:3:"ｓ";s:1:"s";s:3:"ｔ";s:1:"t";s:3:"ｕ";s:1:"u";s:3:"ｖ";s:1:"v";s:3:"ｗ";s:1:"w";s:3:"ｘ";s:1:"x";s:3:"ｙ";s:1:"y";s:3:"ｚ";s:1:"z";s:3:"｛";s:1:"{";s:3:"｜";s:1:"|";s:3:"｝";s:1:"}";s:3:"～";s:1:"~";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/data/to.bestfit1252.ser
@@ -0,0 +1,3 @@
+a:698:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"¡";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"¥";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"ª";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"¹";s:1:"";s:2:"º";s:1:"";s:2:"»";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"¿";s:1:"";s:2:"À";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ã";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Æ";s:1:"";s:2:"Ç";s:1:"";s:2:"È";s:1:"";s:2:"É";s:1:"";s:2:"Ê";s:1:"";s:2:"Ë";s:1:"";s:2:"Ì";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Ð";s:1:"";s:2:"Ñ";s:1:"";s:2:"Ò";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Õ";s:1:"";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ø";s:1:"";s:2:"Ù";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"Ý";s:1:"";s:2:"Þ";s:1:"";s:2:"ß";s:1:"";s:2:"à";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ã";s:1:"";s:2:"ä";s:1:"";s:2:"å";s:1:"";s:2:"æ";s:1:"";s:2:"ç";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"ì";s:1:"";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ð";s:1:"";s:2:"ñ";s:1:"";s:2:"ò";s:1:"";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"õ";s:1:"";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ø";s:1:"";s:2:"ù";s:1:"";s:2:"ú";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"ý";s:1:"";s:2:"þ";s:1:"";s:2:"ÿ";s:1:"";s:2:"Ā";s:1:"A";s:2:"ā";s:1:"a";s:2:"Ă";s:1:"A";s:2:"ă";s:1:"a";s:2:"Ą";s:1:"A";s:2:"ą";s:1:"a";s:2:"Ć";s:1:"C";s:2:"ć";s:1:"c";s:2:"Ĉ";s:1:"C";s:2:"ĉ";s:1:"c";s:2:"Ċ";s:1:"C";s:2:"ċ";s:1:"c";s:2:"Č";s:1:"C";s:2:"č";s:1:"c";s:2:"Ď";s:1:"D";s:2:"ď";s:1:"d";s:2:"Đ";s:1:"";s:2:"đ";s:1:"d";s:2:"Ē";s:1:"E";s:2:"ē";s:1:"e";s:2:"Ĕ";s:1:"E";s:2:"ĕ";s:1:"e";s:2:"Ė";s:1:"E";s:2:"ė";s:1:"e";s:2:"Ę";s:1:"E";s:2:"ę";s:1:"e";s:2:"Ě";s:1:"E";s:2:"ě";s:1:"e";s:2:"Ĝ";s:1:"G";s:2:"ĝ";s:1:"g";s:2:"Ğ";s:1:"G";s:2:"ğ";s:1:"g";s:2:"Ġ";s:1:"G";s:2:"ġ";s:1:"g";s:2:"Ģ";s:1:"G";s:2:"ģ";s:1:"g";s:2:"Ĥ";s:1:"H";s:2:"ĥ";s:1:"h";s:2:"Ħ";s:1:"H";s:2:"ħ";s:1:"h";s:2:"Ĩ";s:1:"I";s:2:"ĩ";s:1:"i";s:2:"Ī";s:1:"I";s:2:"ī";s:1:"i";s:2:"Ĭ";s:1:"I";s:2:"ĭ";s:1:"i";s:2:"Į";s:1:"I";s:2:"į";s:1:"i";s:2:"İ";s:1:"I";s:2:"ı";s:1:"i";s:2:"Ĵ";s:1:"J";s:2:"ĵ";s:1:"j";s:2:"Ķ";s:1:"K";s:2:"ķ";s:1:"k";s:2:"Ĺ";s:1:"L";s:2:"ĺ";s:1:"l";s:2:"Ļ";s:1:"L";s:2:"ļ";s:1:"l";s:2:"Ľ";s:1:"L";s:2:"ľ";s:1:"l";s:2:"Ł";s:1:"L";s:2:"ł";s:1:"l";s:2:"Ń";s:1:"N";s:2:"ń";s:1:"n";s:2:"Ņ";s:1:"N";s:2:"ņ";s:1:"n";s:2:"Ň";s:1:"N";s:2:"ň";s:1:"n";s:2:"Ō";s:1:"O";s:2:"ō";s:1:"o";s:2:"Ŏ";s:1:"O";s:2:"ŏ";s:1:"o";s:2:"Ő";s:1:"O";s:2:"ő";s:1:"o";s:2:"Œ";s:1:"";s:2:"œ";s:1:"";s:2:"Ŕ";s:1:"R";s:2:"ŕ";s:1:"r";s:2:"Ŗ";s:1:"R";s:2:"ŗ";s:1:"r";s:2:"Ř";s:1:"R";s:2:"ř";s:1:"r";s:2:"Ś";s:1:"S";s:2:"ś";s:1:"s";s:2:"Ŝ";s:1:"S";s:2:"ŝ";s:1:"s";s:2:"Ş";s:1:"S";s:2:"ş";s:1:"s";s:2:"Š";s:1:"";s:2:"š";s:1:"";s:2:"Ţ";s:1:"T";s:2:"ţ";s:1:"t";s:2:"Ť";s:1:"T";s:2:"ť";s:1:"t";s:2:"Ŧ";s:1:"T";s:2:"ŧ";s:1:"t";s:2:"Ũ";s:1:"U";s:2:"ũ";s:1:"u";s:2:"Ū";s:1:"U";s:2:"ū";s:1:"u";s:2:"Ŭ";s:1:"U";s:2:"ŭ";s:1:"u";s:2:"Ů";s:1:"U";s:2:"ů";s:1:"u";s:2:"Ű";s:1:"U";s:2:"ű";s:1:"u";s:2:"Ų";s:1:"U";s:2:"ų";s:1:"u";s:2:"Ŵ";s:1:"W";s:2:"ŵ";s:1:"w";s:2:"Ŷ";s:1:"Y";s:2:"ŷ";s:1:"y";s:2:"Ÿ";s:1:"";s:2:"Ź";s:1:"Z";s:2:"ź";s:1:"z";s:2:"Ż";s:1:"Z";s:2:"ż";s:1:"z";s:2:"Ž";s:1:"";s:2:"ž";s:1:"";s:2:"ƀ";s:1:"b";s:2:"Ɖ";s:1:"";s:2:"Ƒ";s:1:"";s:2:"ƒ";s:1:"";s:2:"Ɨ";s:1:"I";s:2:"ƚ";s:1:"l";s:2:"Ɵ";s:1:"O";s:2:"Ơ";s:1:"O";s:2:"ơ";s:1:"o";s:2:"ƫ";s:1:"t";s:2:"Ʈ";s:1:"T";s:2:"Ư";s:1:"U";s:2:"ư";s:1:"u";s:2:"ƶ";s:1:"z";s:2:"ǀ";s:1:"|";s:2:"ǃ";s:1:"!";s:2:"Ǎ";s:1:"A";s:2:"ǎ";s:1:"a";s:2:"Ǐ";s:1:"I";s:2:"ǐ";s:1:"i";s:2:"Ǒ";s:1:"O";s:2:"ǒ";s:1:"o";s:2:"Ǔ";s:1:"U";s:2:"ǔ";s:1:"u";s:2:"Ǖ";s:1:"U";s:2:"ǖ";s:1:"u";s:2:"Ǘ";s:1:"U";s:2:"ǘ";s:1:"u";s:2:"Ǚ";s:1:"U";s:2:"ǚ";s:1:"u";s:2:"Ǜ";s:1:"U";s:2:"ǜ";s:1:"u";s:2:"Ǟ";s:1:"A";s:2:"ǟ";s:1:"a";s:2:"Ǥ";s:1:"G";s:2:"ǥ";s:1:"g";s:2:"Ǧ";s:1:"G";s:2:"ǧ";s:1:"g";s:2:"Ǩ";s:1:"K";s:2:"ǩ";s:1:"k";s:2:"Ǫ";s:1:"O";s:2:"ǫ";s:1:"o";s:2:"Ǭ";s:1:"O";s:2:"ǭ";s:1:"o";s:2:"ǰ";s:1:"j";s:2:"ɡ";s:1:"g";s:2:"ʹ";s:1:"'";s:2:"ʺ";s:1:""";s:2:"ʼ";s:1:"'";s:2:"˄";s:1:"^";s:2:"ˆ";s:1:"";s:2:"ˈ";s:1:"'";s:2:"ˉ";s:1:"";s:2:"ˊ";s:1:"";s:2:"ˋ";s:1:"`";s:2:"ˍ";s:1:"_";s:2:"˚";s:1:"";s:2:"˜";s:1:"";s:2:"̀";s:1:"`";s:2:"́";s:1:"";s:2:"̂";s:1:"^";s:2:"̃";s:1:"~";s:2:"̄";s:1:"";s:2:"̅";s:1:"";s:2:"̈";s:1:"";s:2:"̊";s:1:"";s:2:"̎";s:1:""";s:2:"̧";s:1:"";s:2:"̱";s:1:"_";s:2:"̲";s:1:"_";s:2:";";s:1:";";s:2:"Γ";s:1:"G";s:2:"Θ";s:1:"T";s:2:"Σ";s:1:"S";s:2:"Φ";s:1:"F";s:2:"Ω";s:1:"O";s:2:"α";s:1:"a";s:2:"β";s:1:"";s:2:"δ";s:1:"d";s:2:"ε";s:1:"e";s:2:"μ";s:1:"";s:2:"π";s:1:"p";s:2:"σ";s:1:"s";s:2:"τ";s:1:"t";s:2:"φ";s:1:"f";s:2:"һ";s:1:"h";s:2:"։";s:1:":";s:2:"٪";s:1:"%";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:"‐";s:1:"-";s:3:"‑";s:1:"-";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"‗";s:1:"=";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"‚";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"„";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:3:"•";s:1:"";s:3:"․";s:1:"";s:3:"…";s:1:"";s:3:"‰";s:1:"";s:3:"′";s:1:"'";s:3:"‵";s:1:"`";s:3:"‹";s:1:"";s:3:"›";s:1:"";s:3:"⁄";s:1:"/";s:3:"⁰";s:1:"";s:3:"⁴";s:1:"4";s:3:"⁵";s:1:"5";s:3:"⁶";s:1:"6";s:3:"⁷";s:1:"7";s:3:"⁸";s:1:"8";s:3:"ⁿ";s:1:"n";s:3:"₀";s:1:"0";s:3:"₁";s:1:"1";s:3:"₂";s:1:"2";s:3:"₃";s:1:"3";s:3:"₄";s:1:"4";s:3:"₅";s:1:"5";s:3:"₆";s:1:"6";s:3:"₇";s:1:"7";s:3:"₈";s:1:"8";s:3:"₉";s:1:"9";s:3:"€";s:1:"";s:3:"₡";s:1:"";s:3:"₤";s:1:"";s:3:"₧";s:1:"P";s:3:"ℂ";s:1:"C";s:3:"ℇ";s:1:"E";s:3:"ℊ";s:1:"g";s:3:"ℋ";s:1:"H";s:3:"ℌ";s:1:"H";s:3:"ℍ";s:1:"H";s:3:"ℎ";s:1:"h";s:3:"ℐ";s:1:"I";s:3:"ℑ";s:1:"I";s:3:"ℒ";s:1:"L";s:3:"ℓ";s:1:"l";s:3:"ℕ";s:1:"N";s:3:"℘";s:1:"P";s:3:"ℙ";s:1:"P";s:3:"ℚ";s:1:"Q";s:3:"ℛ";s:1:"R";s:3:"ℜ";s:1:"R";s:3:"ℝ";s:1:"R";s:3:"™";s:1:"";s:3:"ℤ";s:1:"Z";s:3:"ℨ";s:1:"Z";s:3:"K";s:1:"K";s:3:"Å";s:1:"";s:3:"ℬ";s:1:"B";s:3:"ℭ";s:1:"C";s:3:"℮";s:1:"e";s:3:"ℯ";s:1:"e";s:3:"ℰ";s:1:"E";s:3:"ℱ";s:1:"F";s:3:"ℳ";s:1:"M";s:3:"ℴ";s:1:"o";s:3:"∅";s:1:"";s:3:"−";s:1:"-";s:3:"∓";s:1:"";s:3:"∕";s:1:"/";s:3:"∖";s:1:"\";s:3:"∗";s:1:"*";s:3:"∘";s:1:"";s:3:"∙";s:1:"";s:3:"√";s:1:"v";s:3:"∞";s:1:"8";s:3:"∣";s:1:"|";s:3:"∩";s:1:"n";s:3:"∶";s:1:":";s:3:"∼";s:1:"~";s:3:"≈";s:1:"";s:3:"≡";s:1:"=";s:3:"≤";s:1:"=";s:3:"≥";s:1:"=";s:3:"≪";s:1:"";s:3:"≫";s:1:"";s:3:"⋅";s:1:"";s:3:"⌂";s:1:"";s:3:"⌃";s:1:"^";s:3:"⌐";s:1:"";s:3:"⌠";s:1:"(";s:3:"⌡";s:1:")";s:3:"〈";s:1:"<";s:3:"〉";s:1:">";s:3:"─";s:1:"-";s:3:"│";s:1:"";s:3:"┌";s:1:"+";s:3:"┐";s:1:"+";s:3:"└";s:1:"+";s:3:"┘";s:1:"+";s:3:"├";s:1:"+";s:3:"┤";s:1:"";s:3:"┬";s:1:"-";s:3:"┴";s:1:"-";s:3:"┼";s:1:"+";s:3:"═";s:1:"-";s:3:"║";s:1:"";s:3:"╒";s:1:"+";s:3:"╓";s:1:"+";s:3:"╔";s:1:"+";s:3:"╕";s:1:"+";s:3:"╖";s:1:"+";s:3:"╗";s:1:"+";s:3:"╘";s:1:"+";s:3:"╙";s:1:"+";s:3:"╚";s:1:"+";s:3:"╛";s:1:"+";s:3:"╜";s:1:"+";s:3:"╝";s:1:"+";s:3:"╞";s:1:"";s:3:"╟";s:1:"";s:3:"╠";s:1:"";s:3:"╡";s:1:"";s:3:"╢";s:1:"";s:3:"╣";s:1:"";s:3:"╤";s:1:"-";s:3:"╥";s:1:"-";s:3:"╦";s:1:"-";s:3:"╧";s:1:"-";s:3:"╨";s:1:"-";s:3:"╩";s:1:"-";s:3:"╪";s:1:"+";s:3:"╫";s:1:"+";s:3:"╬";s:1:"+";s:3:"▀";s:1:"";s:3:"▄";s:1:"_";s:3:"█";s:1:"";s:3:"▌";s:1:"";s:3:"▐";s:1:"";s:3:"░";s:1:"";s:3:"▒";s:1:"";s:3:"▓";s:1:"";s:3:"■";s:1:"";s:3:"☼";s:1:"";s:3:"❘";s:1:"|";s:3:"　";s:1:" ";s:3:"〈";s:1:"<";s:3:"〉";s:1:">";s:3:"《";s:1:"";s:3:"》";s:1:"";s:3:"〚";s:1:"[";s:3:"〛";s:1:"]";s:3:"・";s:1:"";s:3:"！";s:1:"!";s:3:"＂";s:1:""";s:3:"＃";s:1:"#";s:3:"＄";s:1:"$";s:3:"％";s:1:"%";s:3:"＆";s:1:"&";s:3:"＇";s:1:"'";s:3:"（";s:1:"(";s:3:"）";s:1:")";s:3:"＊";s:1:"*";s:3:"＋";s:1:"+";s:3:"，";s:1:",";s:3:"－";s:1:"-";s:3:"．";s:1:".";s:3:"／";s:1:"/";s:3:"０";s:1:"0";s:3:"１";s:1:"1";s:3:"２";s:1:"2";s:3:"３";s:1:"3";s:3:"４";s:1:"4";s:3:"５";s:1:"5";s:3:"６";s:1:"6";s:3:"７";s:1:"7";s:3:"８";s:1:"8";s:3:"９";s:1:"9";s:3:"：";s:1:":";s:3:"；";s:1:";";s:3:"＜";s:1:"<";s:3:"＝";s:1:"=";s:3:"＞";s:1:">";s:3:"？";s:1:"?";s:3:"＠";s:1:"@";s:3:"Ａ";s:1:"A";s:3:"Ｂ";s:1:"B";s:3:"Ｃ";s:1:"C";s:3:"Ｄ";s:1:"D";s:3:"Ｅ";s:1:"E";s:3:"Ｆ";s:1:"F";s:3:"Ｇ";s:1:"G";s:3:"Ｈ";s:1:"H";s:3:"Ｉ";s:1:"I";s:3:"Ｊ";s:1:"J";s:3:"Ｋ";s:1:"K";s:3:"Ｌ";s:1:"L";s:3:"Ｍ";s:1:"M";s:3:"Ｎ";s:1:"N";s:3:"Ｏ";s:1:"O";s:3:"Ｐ";s:1:"P";s:3:"Ｑ";s:1:"Q";s:3:"Ｒ";s:1:"R";s:3:"Ｓ";s:1:"S";s:3:"Ｔ";s:1:"T";s:3:"Ｕ";s:1:"U";s:3:"Ｖ";s:1:"V";s:3:"Ｗ";s:1:"W";s:3:"Ｘ";s:1:"X";s:3:"Ｙ";s:1:"Y";s:3:"Ｚ";s:1:"Z";s:3:"［";s:1:"[";s:3:"＼";s:1:"\";s:3:"］";s:1:"]";s:3:"＾";s:1:"^";s:3:"＿";s:1:"_";s:3:"｀";s:1:"`";s:3:"ａ";s:1:"a";s:3:"ｂ";s:1:"b";s:3:"ｃ";s:1:"c";s:3:"ｄ";s:1:"d";s:3:"ｅ";s:1:"e";s:3:"ｆ";s:1:"f";s:3:"ｇ";s:1:"g";s:3:"ｈ";s:1:"h";s:3:"ｉ";s:1:"i";s:3:"ｊ";s:1:"j";s:3:"ｋ";s:1:"k";s:3:"ｌ";s:1:"l";s:3:"ｍ";s:1:"m";s:3:"ｎ";s:1:"n";s:3:"ｏ";s:1:"o";s:3:"ｐ";s:1:"p";s:3:"ｑ";s:1:"q";s:3:"ｒ";s:1:"r";s:3:"ｓ";s:1:"s";s:3:"ｔ";s:1:"t";s:3:"ｕ";s:1:"u";s:3:"ｖ";s:1:"v";s:3:"ｗ";s:1:"w";s:3:"ｘ";s:1:"x";s:3:"ｙ";s:1:"y";s:3:"ｚ";s:1:"z";s:3:"｛";s:1:"{";s:3:"｜";s:1:"|";s:3:"｝";s:1:"}";s:3:"～";s:1:"~";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/data/to.bestfit1253.ser
@@ -0,0 +1,3 @@
+a:622:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"¥";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"/";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"»";s:1:"";s:2:"½";s:1:"";s:2:"À";s:1:"A";s:2:"Á";s:1:"A";s:2:"Â";s:1:"A";s:2:"Ã";s:1:"A";s:2:"Ä";s:1:"A";s:2:"Å";s:1:"A";s:2:"Ç";s:1:"C";s:2:"È";s:1:"E";s:2:"É";s:1:"E";s:2:"Ê";s:1:"E";s:2:"Ë";s:1:"E";s:2:"Ì";s:1:"I";s:2:"Í";s:1:"I";s:2:"Î";s:1:"I";s:2:"Ï";s:1:"I";s:2:"Ñ";s:1:"N";s:2:"Ò";s:1:"O";s:2:"Ó";s:1:"O";s:2:"Ô";s:1:"O";s:2:"Õ";s:1:"O";s:2:"Ö";s:1:"O";s:2:"Ø";s:1:"O";s:2:"Ù";s:1:"U";s:2:"Ú";s:1:"U";s:2:"Û";s:1:"U";s:2:"Ü";s:1:"U";s:2:"Ý";s:1:"Y";s:2:"à";s:1:"a";s:2:"á";s:1:"a";s:2:"â";s:1:"a";s:2:"ã";s:1:"a";s:2:"ä";s:1:"a";s:2:"å";s:1:"a";s:2:"ç";s:1:"c";s:2:"è";s:1:"e";s:2:"é";s:1:"e";s:2:"ê";s:1:"e";s:2:"ë";s:1:"e";s:2:"ì";s:1:"i";s:2:"í";s:1:"i";s:2:"î";s:1:"i";s:2:"ï";s:1:"i";s:2:"ñ";s:1:"n";s:2:"ò";s:1:"o";s:2:"ó";s:1:"o";s:2:"ô";s:1:"o";s:2:"õ";s:1:"o";s:2:"ö";s:1:"o";s:2:"ø";s:1:"o";s:2:"ù";s:1:"u";s:2:"ú";s:1:"u";s:2:"û";s:1:"u";s:2:"ü";s:1:"u";s:2:"ý";s:1:"y";s:2:"ÿ";s:1:"y";s:2:"Ā";s:1:"A";s:2:"ā";s:1:"a";s:2:"Ă";s:1:"A";s:2:"ă";s:1:"a";s:2:"Ą";s:1:"A";s:2:"ą";s:1:"a";s:2:"Ć";s:1:"C";s:2:"ć";s:1:"c";s:2:"Ĉ";s:1:"C";s:2:"ĉ";s:1:"c";s:2:"Ċ";s:1:"C";s:2:"ċ";s:1:"c";s:2:"Č";s:1:"C";s:2:"č";s:1:"c";s:2:"Ď";s:1:"D";s:2:"ď";s:1:"d";s:2:"Đ";s:1:"D";s:2:"đ";s:1:"d";s:2:"Ē";s:1:"E";s:2:"ē";s:1:"e";s:2:"Ĕ";s:1:"E";s:2:"ĕ";s:1:"e";s:2:"Ė";s:1:"E";s:2:"ė";s:1:"e";s:2:"Ę";s:1:"E";s:2:"ę";s:1:"e";s:2:"Ě";s:1:"E";s:2:"ě";s:1:"e";s:2:"Ĝ";s:1:"G";s:2:"ĝ";s:1:"g";s:2:"Ğ";s:1:"G";s:2:"ğ";s:1:"g";s:2:"Ġ";s:1:"G";s:2:"ġ";s:1:"g";s:2:"Ģ";s:1:"G";s:2:"ģ";s:1:"g";s:2:"Ĥ";s:1:"H";s:2:"ĥ";s:1:"h";s:2:"Ħ";s:1:"H";s:2:"ħ";s:1:"h";s:2:"Ĩ";s:1:"I";s:2:"ĩ";s:1:"i";s:2:"Ī";s:1:"I";s:2:"ī";s:1:"i";s:2:"Ĭ";s:1:"I";s:2:"ĭ";s:1:"i";s:2:"Į";s:1:"I";s:2:"į";s:1:"i";s:2:"İ";s:1:"I";s:2:"Ĵ";s:1:"J";s:2:"ĵ";s:1:"j";s:2:"Ķ";s:1:"K";s:2:"ķ";s:1:"k";s:2:"Ĺ";s:1:"L";s:2:"ĺ";s:1:"l";s:2:"Ļ";s:1:"L";s:2:"ļ";s:1:"l";s:2:"Ľ";s:1:"L";s:2:"ľ";s:1:"l";s:2:"Ł";s:1:"L";s:2:"ł";s:1:"l";s:2:"Ń";s:1:"N";s:2:"ń";s:1:"n";s:2:"Ņ";s:1:"N";s:2:"ņ";s:1:"n";s:2:"Ň";s:1:"N";s:2:"ň";s:1:"n";s:2:"Ō";s:1:"O";s:2:"ō";s:1:"o";s:2:"Ŏ";s:1:"O";s:2:"ŏ";s:1:"o";s:2:"Ő";s:1:"O";s:2:"ő";s:1:"o";s:2:"Ŕ";s:1:"R";s:2:"ŕ";s:1:"r";s:2:"Ŗ";s:1:"R";s:2:"ŗ";s:1:"r";s:2:"Ř";s:1:"R";s:2:"ř";s:1:"r";s:2:"Ś";s:1:"S";s:2:"ś";s:1:"s";s:2:"Ŝ";s:1:"S";s:2:"ŝ";s:1:"s";s:2:"Ş";s:1:"S";s:2:"ş";s:1:"s";s:2:"Š";s:1:"S";s:2:"š";s:1:"s";s:2:"Ţ";s:1:"T";s:2:"ţ";s:1:"t";s:2:"Ť";s:1:"T";s:2:"ť";s:1:"t";s:2:"Ŧ";s:1:"T";s:2:"ŧ";s:1:"t";s:2:"Ũ";s:1:"U";s:2:"ũ";s:1:"u";s:2:"Ū";s:1:"U";s:2:"ū";s:1:"u";s:2:"Ŭ";s:1:"U";s:2:"ŭ";s:1:"u";s:2:"Ů";s:1:"U";s:2:"ů";s:1:"u";s:2:"Ű";s:1:"U";s:2:"ű";s:1:"u";s:2:"Ų";s:1:"U";s:2:"ų";s:1:"u";s:2:"Ŵ";s:1:"W";s:2:"ŵ";s:1:"w";s:2:"Ŷ";s:1:"Y";s:2:"ŷ";s:1:"y";s:2:"Ÿ";s:1:"Y";s:2:"Ź";s:1:"Z";s:2:"ź";s:1:"z";s:2:"Ż";s:1:"Z";s:2:"ż";s:1:"z";s:2:"Ž";s:1:"Z";s:2:"ž";s:1:"z";s:2:"ƀ";s:1:"b";s:2:"Ƒ";s:1:"";s:2:"ƒ";s:1:"";s:2:"Ɨ";s:1:"I";s:2:"ƚ";s:1:"l";s:2:"Ɵ";s:1:"O";s:2:"Ơ";s:1:"O";s:2:"ơ";s:1:"o";s:2:"ƫ";s:1:"t";s:2:"Ʈ";s:1:"T";s:2:"Ư";s:1:"U";s:2:"ư";s:1:"u";s:2:"Ǎ";s:1:"A";s:2:"ǎ";s:1:"a";s:2:"Ǐ";s:1:"I";s:2:"ǐ";s:1:"i";s:2:"Ǒ";s:1:"O";s:2:"ǒ";s:1:"o";s:2:"Ǔ";s:1:"U";s:2:"ǔ";s:1:"u";s:2:"Ǖ";s:1:"U";s:2:"ǖ";s:1:"u";s:2:"Ǘ";s:1:"U";s:2:"ǘ";s:1:"u";s:2:"Ǚ";s:1:"U";s:2:"ǚ";s:1:"u";s:2:"Ǜ";s:1:"U";s:2:"ǜ";s:1:"u";s:2:"Ǟ";s:1:"A";s:2:"ǟ";s:1:"a";s:2:"Ǥ";s:1:"G";s:2:"ǥ";s:1:"g";s:2:"Ǧ";s:1:"G";s:2:"ǧ";s:1:"g";s:2:"Ǩ";s:1:"K";s:2:"ǩ";s:1:"k";s:2:"Ǫ";s:1:"O";s:2:"ǫ";s:1:"o";s:2:"Ǭ";s:1:"O";s:2:"ǭ";s:1:"o";s:2:"ǰ";s:1:"j";s:2:"̍";s:1:"";s:2:";";s:1:";";s:2:"΄";s:1:"";s:2:"΅";s:1:"";s:2:"Ά";s:1:"";s:2:"Έ";s:1:"";s:2:"Ή";s:1:"";s:2:"Ί";s:1:"";s:2:"Ό";s:1:"";s:2:"Ύ";s:1:"";s:2:"Ώ";s:1:"";s:2:"ΐ";s:1:"";s:2:"Α";s:1:"";s:2:"Β";s:1:"";s:2:"Γ";s:1:"";s:2:"Δ";s:1:"";s:2:"Ε";s:1:"";s:2:"Ζ";s:1:"";s:2:"Η";s:1:"";s:2:"Θ";s:1:"";s:2:"Ι";s:1:"";s:2:"Κ";s:1:"";s:2:"Λ";s:1:"";s:2:"Μ";s:1:"";s:2:"Ν";s:1:"";s:2:"Ξ";s:1:"";s:2:"Ο";s:1:"";s:2:"Π";s:1:"";s:2:"Ρ";s:1:"";s:2:"Σ";s:1:"";s:2:"Τ";s:1:"";s:2:"Υ";s:1:"";s:2:"Φ";s:1:"";s:2:"Χ";s:1:"";s:2:"Ψ";s:1:"";s:2:"Ω";s:1:"";s:2:"Ϊ";s:1:"";s:2:"Ϋ";s:1:"";s:2:"ά";s:1:"";s:2:"έ";s:1:"";s:2:"ή";s:1:"";s:2:"ί";s:1:"";s:2:"ΰ";s:1:"";s:2:"α";s:1:"";s:2:"β";s:1:"";s:2:"γ";s:1:"";s:2:"δ";s:1:"";s:2:"ε";s:1:"";s:2:"ζ";s:1:"";s:2:"η";s:1:"";s:2:"θ";s:1:"";s:2:"ι";s:1:"";s:2:"κ";s:1:"";s:2:"λ";s:1:"";s:2:"μ";s:1:"";s:2:"ν";s:1:"";s:2:"ξ";s:1:"";s:2:"ο";s:1:"";s:2:"π";s:1:"";s:2:"ρ";s:1:"";s:2:"ς";s:1:"";s:2:"σ";s:1:"";s:2:"τ";s:1:"";s:2:"υ";s:1:"";s:2:"φ";s:1:"";s:2:"χ";s:1:"";s:2:"ψ";s:1:"";s:2:"ω";s:1:"";s:2:"ϊ";s:1:"";s:2:"ϋ";s:1:"";s:2:"ό";s:1:"";s:2:"ύ";s:1:"";s:2:"ώ";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"―";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"‚";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"„";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:3:"•";s:1:"";s:3:"…";s:1:"";s:3:"‰";s:1:"";s:3:"‹";s:1:"";s:3:"›";s:1:"";s:3:"‼";s:1:"!";s:3:"€";s:1:"";s:3:"™";s:1:"";s:3:"←";s:1:"<";s:3:"↑";s:1:"^";s:3:"→";s:1:">";s:3:"↓";s:1:"v";s:3:"↔";s:1:"-";s:3:"↕";s:1:"";s:3:"↨";s:1:"";s:3:"∟";s:1:"L";s:3:"⌂";s:1:"";s:3:"─";s:1:"-";s:3:"│";s:1:"";s:3:"┌";s:1:"-";s:3:"┐";s:1:"";s:3:"└";s:1:"L";s:3:"┘";s:1:"-";s:3:"├";s:1:"+";s:3:"┤";s:1:"+";s:3:"┬";s:1:"T";s:3:"┴";s:1:"+";s:3:"┼";s:1:"+";s:3:"═";s:1:"=";s:3:"║";s:1:"";s:3:"╔";s:1:"-";s:3:"╗";s:1:"";s:3:"╚";s:1:"L";s:3:"╝";s:1:"-";s:3:"╠";s:1:"";s:3:"╣";s:1:"";s:3:"╦";s:1:"T";s:3:"╩";s:1:"";s:3:"╬";s:1:"+";s:3:"▀";s:1:"-";s:3:"▄";s:1:"-";s:3:"█";s:1:"-";s:3:"░";s:1:"-";s:3:"▒";s:1:"-";s:3:"▓";s:1:"-";s:3:"■";s:1:"";s:3:"▬";s:1:"-";s:3:"▲";s:1:"^";s:3:"►";s:1:">";s:3:"▼";s:1:"";s:3:"◄";s:1:"<";s:3:"○";s:1:"0";s:3:"◘";s:1:"";s:3:"◙";s:1:"0";s:3:"☺";s:1:"O";s:3:"☻";s:1:"O";s:3:"☼";s:1:"0";s:3:"♀";s:1:"+";s:3:"♂";s:1:">";s:3:"♠";s:1:"";s:3:"♣";s:1:"";s:3:"♥";s:1:"";s:3:"♦";s:1:"";s:3:"♪";s:1:"d";s:3:"♫";s:1:"d";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"！";s:1:"!";s:3:"＂";s:1:""";s:3:"＃";s:1:"#";s:3:"＄";s:1:"$";s:3:"％";s:1:"%";s:3:"＆";s:1:"&";s:3:"＇";s:1:"'";s:3:"（";s:1:"(";s:3:"）";s:1:")";s:3:"＊";s:1:"*";s:3:"＋";s:1:"+";s:3:"，";s:1:",";s:3:"－";s:1:"-";s:3:"．";s:1:".";s:3:"／";s:1:"/";s:3:"０";s:1:"0";s:3:"１";s:1:"1";s:3:"２";s:1:"2";s:3:"３";s:1:"3";s:3:"４";s:1:"4";s:3:"５";s:1:"5";s:3:"６";s:1:"6";s:3:"７";s:1:"7";s:3:"８";s:1:"8";s:3:"９";s:1:"9";s:3:"：";s:1:":";s:3:"；";s:1:";";s:3:"＜";s:1:"<";s:3:"＝";s:1:"=";s:3:"＞";s:1:">";s:3:"？";s:1:"?";s:3:"＠";s:1:"@";s:3:"Ａ";s:1:"A";s:3:"Ｂ";s:1:"B";s:3:"Ｃ";s:1:"C";s:3:"Ｄ";s:1:"D";s:3:"Ｅ";s:1:"E";s:3:"Ｆ";s:1:"F";s:3:"Ｇ";s:1:"G";s:3:"Ｈ";s:1:"H";s:3:"Ｉ";s:1:"I";s:3:"Ｊ";s:1:"J";s:3:"Ｋ";s:1:"K";s:3:"Ｌ";s:1:"L";s:3:"Ｍ";s:1:"M";s:3:"Ｎ";s:1:"N";s:3:"Ｏ";s:1:"O";s:3:"Ｐ";s:1:"P";s:3:"Ｑ";s:1:"Q";s:3:"Ｒ";s:1:"R";s:3:"Ｓ";s:1:"S";s:3:"Ｔ";s:1:"T";s:3:"Ｕ";s:1:"U";s:3:"Ｖ";s:1:"V";s:3:"Ｗ";s:1:"W";s:3:"Ｘ";s:1:"X";s:3:"Ｙ";s:1:"Y";s:3:"Ｚ";s:1:"Z";s:3:"［";s:1:"[";s:3:"＼";s:1:"\";s:3:"］";s:1:"]";s:3:"＾";s:1:"^";s:3:"＿";s:1:"_";s:3:"｀";s:1:"`";s:3:"ａ";s:1:"a";s:3:"ｂ";s:1:"b";s:3:"ｃ";s:1:"c";s:3:"ｄ";s:1:"d";s:3:"ｅ";s:1:"e";s:3:"ｆ";s:1:"f";s:3:"ｇ";s:1:"g";s:3:"ｈ";s:1:"h";s:3:"ｉ";s:1:"i";s:3:"ｊ";s:1:"j";s:3:"ｋ";s:1:"k";s:3:"ｌ";s:1:"l";s:3:"ｍ";s:1:"m";s:3:"ｎ";s:1:"n";s:3:"ｏ";s:1:"o";s:3:"ｐ";s:1:"p";s:3:"ｑ";s:1:"q";s:3:"ｒ";s:1:"r";s:3:"ｓ";s:1:"s";s:3:"ｔ";s:1:"t";s:3:"ｕ";s:1:"u";s:3:"ｖ";s:1:"v";s:3:"ｗ";s:1:"w";s:3:"ｘ";s:1:"x";s:3:"ｙ";s:1:"y";s:3:"ｚ";s:1:"z";s:3:"｛";s:1:"{";s:3:"｜";s:1:"|";s:3:"｝";s:1:"}";s:3:"～";s:1:"~";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/data/to.bestfit1254.ser
@@ -0,0 +1,3 @@
+a:694:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"¡";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"¥";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"ª";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"¹";s:1:"";s:2:"º";s:1:"";s:2:"»";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"¿";s:1:"";s:2:"À";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ã";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Æ";s:1:"";s:2:"Ç";s:1:"";s:2:"È";s:1:"";s:2:"É";s:1:"";s:2:"Ê";s:1:"";s:2:"Ë";s:1:"";s:2:"Ì";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Ñ";s:1:"";s:2:"Ò";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Õ";s:1:"";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ø";s:1:"";s:2:"Ù";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"Ý";s:1:"Y";s:2:"ß";s:1:"";s:2:"à";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ã";s:1:"";s:2:"ä";s:1:"";s:2:"å";s:1:"";s:2:"æ";s:1:"";s:2:"ç";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"ì";s:1:"";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ñ";s:1:"";s:2:"ò";s:1:"";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"õ";s:1:"";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ø";s:1:"";s:2:"ù";s:1:"";s:2:"ú";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"ý";s:1:"y";s:2:"ÿ";s:1:"";s:2:"Ā";s:1:"A";s:2:"ā";s:1:"a";s:2:"Ă";s:1:"A";s:2:"ă";s:1:"a";s:2:"Ą";s:1:"A";s:2:"ą";s:1:"a";s:2:"Ć";s:1:"C";s:2:"ć";s:1:"c";s:2:"Ĉ";s:1:"C";s:2:"ĉ";s:1:"c";s:2:"Ċ";s:1:"C";s:2:"ċ";s:1:"c";s:2:"Č";s:1:"C";s:2:"č";s:1:"c";s:2:"Ď";s:1:"D";s:2:"ď";s:1:"d";s:2:"Đ";s:1:"D";s:2:"đ";s:1:"d";s:2:"Ē";s:1:"E";s:2:"ē";s:1:"e";s:2:"Ĕ";s:1:"E";s:2:"ĕ";s:1:"e";s:2:"Ė";s:1:"E";s:2:"ė";s:1:"e";s:2:"Ę";s:1:"E";s:2:"ę";s:1:"e";s:2:"Ě";s:1:"E";s:2:"ě";s:1:"e";s:2:"Ĝ";s:1:"G";s:2:"ĝ";s:1:"g";s:2:"Ğ";s:1:"";s:2:"ğ";s:1:"";s:2:"Ġ";s:1:"G";s:2:"ġ";s:1:"g";s:2:"Ģ";s:1:"G";s:2:"ģ";s:1:"g";s:2:"Ĥ";s:1:"H";s:2:"ĥ";s:1:"h";s:2:"Ħ";s:1:"H";s:2:"ħ";s:1:"h";s:2:"Ĩ";s:1:"I";s:2:"ĩ";s:1:"i";s:2:"Ī";s:1:"I";s:2:"ī";s:1:"i";s:2:"Ĭ";s:1:"I";s:2:"ĭ";s:1:"i";s:2:"Į";s:1:"I";s:2:"į";s:1:"i";s:2:"İ";s:1:"";s:2:"ı";s:1:"";s:2:"Ĵ";s:1:"J";s:2:"ĵ";s:1:"j";s:2:"Ķ";s:1:"K";s:2:"ķ";s:1:"k";s:2:"Ĺ";s:1:"L";s:2:"ĺ";s:1:"l";s:2:"Ļ";s:1:"L";s:2:"ļ";s:1:"l";s:2:"Ľ";s:1:"L";s:2:"ľ";s:1:"l";s:2:"Ł";s:1:"L";s:2:"ł";s:1:"l";s:2:"Ń";s:1:"N";s:2:"ń";s:1:"n";s:2:"Ņ";s:1:"N";s:2:"ņ";s:1:"n";s:2:"Ň";s:1:"N";s:2:"ň";s:1:"n";s:2:"Ō";s:1:"O";s:2:"ō";s:1:"o";s:2:"Ŏ";s:1:"O";s:2:"ŏ";s:1:"o";s:2:"Ő";s:1:"O";s:2:"ő";s:1:"o";s:2:"Œ";s:1:"";s:2:"œ";s:1:"";s:2:"Ŕ";s:1:"R";s:2:"ŕ";s:1:"r";s:2:"Ŗ";s:1:"R";s:2:"ŗ";s:1:"r";s:2:"Ř";s:1:"R";s:2:"ř";s:1:"r";s:2:"Ś";s:1:"S";s:2:"ś";s:1:"s";s:2:"Ŝ";s:1:"S";s:2:"ŝ";s:1:"s";s:2:"Ş";s:1:"";s:2:"ş";s:1:"";s:2:"Š";s:1:"";s:2:"š";s:1:"";s:2:"Ţ";s:1:"T";s:2:"ţ";s:1:"t";s:2:"Ť";s:1:"T";s:2:"ť";s:1:"t";s:2:"Ŧ";s:1:"T";s:2:"ŧ";s:1:"t";s:2:"Ũ";s:1:"U";s:2:"ũ";s:1:"u";s:2:"Ū";s:1:"U";s:2:"ū";s:1:"u";s:2:"Ŭ";s:1:"U";s:2:"ŭ";s:1:"u";s:2:"Ů";s:1:"U";s:2:"ů";s:1:"u";s:2:"Ű";s:1:"U";s:2:"ű";s:1:"u";s:2:"Ų";s:1:"U";s:2:"ų";s:1:"u";s:2:"Ŵ";s:1:"W";s:2:"ŵ";s:1:"w";s:2:"Ŷ";s:1:"Y";s:2:"ŷ";s:1:"y";s:2:"Ÿ";s:1:"";s:2:"Ź";s:1:"Z";s:2:"ź";s:1:"z";s:2:"Ż";s:1:"Z";s:2:"ż";s:1:"z";s:2:"Ž";s:1:"Z";s:2:"ž";s:1:"z";s:2:"ƀ";s:1:"b";s:2:"Ɖ";s:1:"D";s:2:"Ƒ";s:1:"";s:2:"ƒ";s:1:"";s:2:"Ɨ";s:1:"I";s:2:"ƚ";s:1:"l";s:2:"Ɵ";s:1:"O";s:2:"Ơ";s:1:"O";s:2:"ơ";s:1:"o";s:2:"ƫ";s:1:"t";s:2:"Ʈ";s:1:"T";s:2:"Ư";s:1:"U";s:2:"ư";s:1:"u";s:2:"ƶ";s:1:"z";s:2:"ǀ";s:1:"|";s:2:"ǃ";s:1:"!";s:2:"Ǎ";s:1:"A";s:2:"ǎ";s:1:"a";s:2:"Ǐ";s:1:"I";s:2:"ǐ";s:1:"i";s:2:"Ǒ";s:1:"O";s:2:"ǒ";s:1:"o";s:2:"Ǔ";s:1:"U";s:2:"ǔ";s:1:"u";s:2:"Ǖ";s:1:"U";s:2:"ǖ";s:1:"u";s:2:"Ǘ";s:1:"U";s:2:"ǘ";s:1:"u";s:2:"Ǚ";s:1:"U";s:2:"ǚ";s:1:"u";s:2:"Ǜ";s:1:"U";s:2:"ǜ";s:1:"u";s:2:"Ǟ";s:1:"A";s:2:"ǟ";s:1:"a";s:2:"Ǥ";s:1:"G";s:2:"ǥ";s:1:"g";s:2:"Ǧ";s:1:"G";s:2:"ǧ";s:1:"g";s:2:"Ǩ";s:1:"K";s:2:"ǩ";s:1:"k";s:2:"Ǫ";s:1:"O";s:2:"ǫ";s:1:"o";s:2:"Ǭ";s:1:"O";s:2:"ǭ";s:1:"o";s:2:"ǰ";s:1:"j";s:2:"ɡ";s:1:"g";s:2:"ʹ";s:1:"'";s:2:"ʺ";s:1:""";s:2:"ʻ";s:1:"";s:2:"ʼ";s:1:"'";s:2:"˄";s:1:"^";s:2:"ˆ";s:1:"";s:2:"ˇ";s:1:"^";s:2:"ˈ";s:1:"'";s:2:"ˉ";s:1:"";s:2:"ˊ";s:1:"";s:2:"ˋ";s:1:"`";s:2:"ˍ";s:1:"_";s:2:"˘";s:1:"^";s:2:"˙";s:1:"'";s:2:"˚";s:1:"";s:2:"˛";s:1:"";s:2:"˜";s:1:"";s:2:"˝";s:1:"";s:2:"̀";s:1:"`";s:2:"́";s:1:"";s:2:"̂";s:1:"^";s:2:"̃";s:1:"";s:2:"̄";s:1:"";s:2:"̅";s:1:"";s:2:"̆";s:1:"";s:2:"̇";s:1:"";s:2:"̈";s:1:"";s:2:"̊";s:1:"";s:2:"̌";s:1:"";s:2:"̎";s:1:"";s:2:"̧";s:1:"";s:2:"̱";s:1:"_";s:2:"̲";s:1:"_";s:2:"β";s:1:"";s:2:"μ";s:1:"";s:2:"һ";s:1:"h";s:2:"։";s:1:":";s:2:"٪";s:1:"%";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:"‐";s:1:"-";s:3:"‑";s:1:"-";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"‚";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"„";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:3:"•";s:1:"";s:3:"․";s:1:"";s:3:"…";s:1:"";s:3:"‰";s:1:"";s:3:"′";s:1:"'";s:3:"″";s:1:"";s:3:"‵";s:1:"`";s:3:"‹";s:1:"";s:3:"›";s:1:"";s:3:"‼";s:1:"!";s:3:"⁄";s:1:"/";s:3:"⁰";s:1:"";s:3:"⁴";s:1:"4";s:3:"⁵";s:1:"5";s:3:"⁶";s:1:"6";s:3:"⁷";s:1:"7";s:3:"⁸";s:1:"8";s:3:"₀";s:1:"";s:3:"₁";s:1:"0";s:3:"₂";s:1:"";s:3:"₃";s:1:"";s:3:"₄";s:1:"4";s:3:"₅";s:1:"5";s:3:"₆";s:1:"6";s:3:"₇";s:1:"7";s:3:"₈";s:1:"8";s:3:"₉";s:1:"9";s:3:"€";s:1:"";s:3:"₤";s:1:"";s:3:"ℂ";s:1:"C";s:3:"ℇ";s:1:"E";s:3:"ℊ";s:1:"g";s:3:"ℋ";s:1:"H";s:3:"ℌ";s:1:"H";s:3:"ℍ";s:1:"H";s:3:"ℎ";s:1:"h";s:3:"ℐ";s:1:"I";s:3:"ℑ";s:1:"I";s:3:"ℒ";s:1:"L";s:3:"ℓ";s:1:"l";s:3:"ℕ";s:1:"N";s:3:"℘";s:1:"P";s:3:"ℙ";s:1:"P";s:3:"ℚ";s:1:"Q";s:3:"ℛ";s:1:"R";s:3:"ℜ";s:1:"R";s:3:"ℝ";s:1:"R";s:3:"™";s:1:"";s:3:"ℤ";s:1:"Z";s:3:"ℨ";s:1:"Z";s:3:"K";s:1:"K";s:3:"Å";s:1:"";s:3:"ℬ";s:1:"B";s:3:"ℭ";s:1:"C";s:3:"℮";s:1:"e";s:3:"ℯ";s:1:"e";s:3:"ℰ";s:1:"E";s:3:"ℱ";s:1:"F";s:3:"ℳ";s:1:"M";s:3:"ℴ";s:1:"o";s:3:"←";s:1:"";s:3:"↑";s:1:"^";s:3:"→";s:1:"";s:3:"↓";s:1:"v";s:3:"↔";s:1:"-";s:3:"↕";s:1:"|";s:3:"↨";s:1:"|";s:3:"∅";s:1:"";s:3:"−";s:1:"-";s:3:"∓";s:1:"";s:3:"∕";s:1:"/";s:3:"∖";s:1:"\";s:3:"∗";s:1:"*";s:3:"∘";s:1:"";s:3:"∙";s:1:"";s:3:"∟";s:1:"L";s:3:"∣";s:1:"|";s:3:"∶";s:1:":";s:3:"∼";s:1:"~";s:3:"≪";s:1:"";s:3:"≫";s:1:"";s:3:"⋅";s:1:"";s:3:"⌂";s:1:"";s:3:"⌃";s:1:"^";s:3:"〈";s:1:"<";s:3:"〉";s:1:">";s:3:"─";s:1:"";s:3:"│";s:1:"-";s:3:"┌";s:1:"-";s:3:"┐";s:1:"";s:3:"└";s:1:"L";s:3:"┘";s:1:"-";s:3:"├";s:1:"+";s:3:"┤";s:1:"+";s:3:"┬";s:1:"T";s:3:"┴";s:1:"+";s:3:"┼";s:1:"+";s:3:"═";s:1:"=";s:3:"║";s:1:"";s:3:"╔";s:1:"-";s:3:"╗";s:1:"";s:3:"╚";s:1:"L";s:3:"╝";s:1:"-";s:3:"╠";s:1:"";s:3:"╣";s:1:"";s:3:"╦";s:1:"T";s:3:"╩";s:1:"";s:3:"╬";s:1:"+";s:3:"▀";s:1:"-";s:3:"▄";s:1:"-";s:3:"█";s:1:"-";s:3:"░";s:1:"-";s:3:"▒";s:1:"-";s:3:"▓";s:1:"-";s:3:"■";s:1:"";s:3:"▬";s:1:"-";s:3:"▲";s:1:"^";s:3:"►";s:1:">";s:3:"▼";s:1:"";s:3:"◄";s:1:"<";s:3:"○";s:1:"0";s:3:"◘";s:1:"";s:3:"◙";s:1:"0";s:3:"☺";s:1:"O";s:3:"☻";s:1:"O";s:3:"☼";s:1:"0";s:3:"♀";s:1:"+";s:3:"♂";s:1:">";s:3:"♠";s:1:"";s:3:"♣";s:1:"";s:3:"♥";s:1:"";s:3:"♦";s:1:"";s:3:"♪";s:1:"d";s:3:"♫";s:1:"d";s:3:"❘";s:1:"|";s:3:"❛";s:1:"";s:3:"❜";s:1:"";s:3:"❝";s:1:"";s:3:"❞";s:1:"";s:3:"　";s:1:" ";s:3:"〈";s:1:"<";s:3:"〉";s:1:">";s:3:"《";s:1:"";s:3:"》";s:1:"";s:3:"〚";s:1:"[";s:3:"〛";s:1:"=";s:3:"〝";s:1:""";s:3:"〞";s:1:""";s:3:"〟";s:1:"";s:3:"・";s:1:"";s:3:"ー";s:1:"";s:3:"！";s:1:"!";s:3:"＂";s:1:""";s:3:"＃";s:1:"#";s:3:"＄";s:1:"$";s:3:"％";s:1:"%";s:3:"＆";s:1:"&";s:3:"＇";s:1:"'";s:3:"（";s:1:"(";s:3:"）";s:1:")";s:3:"＊";s:1:"*";s:3:"＋";s:1:"+";s:3:"，";s:1:",";s:3:"－";s:1:"-";s:3:"．";s:1:".";s:3:"／";s:1:"/";s:3:"０";s:1:"0";s:3:"１";s:1:"1";s:3:"２";s:1:"2";s:3:"３";s:1:"3";s:3:"４";s:1:"4";s:3:"５";s:1:"5";s:3:"６";s:1:"6";s:3:"７";s:1:"7";s:3:"８";s:1:"8";s:3:"９";s:1:"9";s:3:"：";s:1:":";s:3:"；";s:1:";";s:3:"＜";s:1:"<";s:3:"＝";s:1:"=";s:3:"＞";s:1:">";s:3:"？";s:1:"?";s:3:"＠";s:1:"@";s:3:"Ａ";s:1:"A";s:3:"Ｂ";s:1:"B";s:3:"Ｃ";s:1:"C";s:3:"Ｄ";s:1:"D";s:3:"Ｅ";s:1:"E";s:3:"Ｆ";s:1:"F";s:3:"Ｇ";s:1:"G";s:3:"Ｈ";s:1:"H";s:3:"Ｉ";s:1:"I";s:3:"Ｊ";s:1:"J";s:3:"Ｋ";s:1:"K";s:3:"Ｌ";s:1:"L";s:3:"Ｍ";s:1:"M";s:3:"Ｎ";s:1:"N";s:3:"Ｏ";s:1:"O";s:3:"Ｐ";s:1:"P";s:3:"Ｑ";s:1:"Q";s:3:"Ｒ";s:1:"R";s:3:"Ｓ";s:1:"S";s:3:"Ｔ";s:1:"T";s:3:"Ｕ";s:1:"U";s:3:"Ｖ";s:1:"V";s:3:"Ｗ";s:1:"W";s:3:"Ｘ";s:1:"X";s:3:"Ｙ";s:1:"Y";s:3:"Ｚ";s:1:"Z";s:3:"［";s:1:"[";s:3:"＼";s:1:"\";s:3:"］";s:1:"]";s:3:"＾";s:1:"^";s:3:"＿";s:1:"_";s:3:"｀";s:1:"`";s:3:"ａ";s:1:"a";s:3:"ｂ";s:1:"b";s:3:"ｃ";s:1:"c";s:3:"ｄ";s:1:"d";s:3:"ｅ";s:1:"e";s:3:"ｆ";s:1:"f";s:3:"ｇ";s:1:"g";s:3:"ｈ";s:1:"h";s:3:"ｉ";s:1:"i";s:3:"ｊ";s:1:"j";s:3:"ｋ";s:1:"k";s:3:"ｌ";s:1:"l";s:3:"ｍ";s:1:"m";s:3:"ｎ";s:1:"n";s:3:"ｏ";s:1:"o";s:3:"ｐ";s:1:"p";s:3:"ｑ";s:1:"q";s:3:"ｒ";s:1:"r";s:3:"ｓ";s:1:"s";s:3:"ｔ";s:1:"t";s:3:"ｕ";s:1:"u";s:3:"ｖ";s:1:"v";s:3:"ｗ";s:1:"w";s:3:"ｘ";s:1:"x";s:3:"ｙ";s:1:"y";s:3:"ｚ";s:1:"z";s:3:"｛";s:1:"{";s:3:"｜";s:1:"|";s:3:"｝";s:1:"}";s:3:"～";s:1:"~";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/data/to.bestfit1255.ser
@@ -0,0 +1,3 @@
+a:352:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"¡";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"¥";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"¹";s:1:"";s:2:"»";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"¿";s:1:"";s:2:"×";s:1:"";s:2:"÷";s:1:"";s:2:"Ƒ";s:1:"F";s:2:"ƒ";s:1:"";s:2:"ˆ";s:1:"";s:2:"˜";s:1:"";s:2:"ְ";s:1:"";s:2:"ֱ";s:1:"";s:2:"ֲ";s:1:"";s:2:"ֳ";s:1:"";s:2:"ִ";s:1:"";s:2:"ֵ";s:1:"";s:2:"ֶ";s:1:"";s:2:"ַ";s:1:"";s:2:"ָ";s:1:"";s:2:"ֹ";s:1:"";s:2:"ֺ";s:1:"";s:2:"ֻ";s:1:"";s:2:"ּ";s:1:"";s:2:"ֽ";s:1:"";s:2:"־";s:1:"";s:2:"ֿ";s:1:"";s:2:"׀";s:1:"";s:2:"ׁ";s:1:"";s:2:"ׂ";s:1:"";s:2:"׃";s:1:"";s:2:"א";s:1:"";s:2:"ב";s:1:"";s:2:"ג";s:1:"";s:2:"ד";s:1:"";s:2:"ה";s:1:"";s:2:"ו";s:1:"";s:2:"ז";s:1:"";s:2:"ח";s:1:"";s:2:"ט";s:1:"";s:2:"י";s:1:"";s:2:"ך";s:1:"";s:2:"כ";s:1:"";s:2:"ל";s:1:"";s:2:"ם";s:1:"";s:2:"מ";s:1:"";s:2:"ן";s:1:"";s:2:"נ";s:1:"";s:2:"ס";s:1:"";s:2:"ע";s:1:"";s:2:"ף";s:1:"";s:2:"פ";s:1:"";s:2:"ץ";s:1:"";s:2:"צ";s:1:"";s:2:"ק";s:1:"";s:2:"ר";s:1:"";s:2:"ש";s:1:"";s:2:"ת";s:1:"";s:2:"װ";s:1:"";s:2:"ױ";s:1:"";s:2:"ײ";s:1:"";s:2:"׳";s:1:"";s:2:"״";s:1:"";s:3:"‎";s:1:"";s:3:"‏";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"‚";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"„";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:3:"•";s:1:"";s:3:"…";s:1:"";s:3:"‰";s:1:"";s:3:"‹";s:1:"";s:3:"›";s:1:"";s:3:"™";s:1:"";s:3:"€";s:1:"";s:3:"₪";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"！";s:1:"!";s:3:"＂";s:1:""";s:3:"＃";s:1:"#";s:3:"＄";s:1:"$";s:3:"％";s:1:"%";s:3:"＆";s:1:"&";s:3:"＇";s:1:"'";s:3:"（";s:1:"(";s:3:"）";s:1:")";s:3:"＊";s:1:"*";s:3:"＋";s:1:"+";s:3:"，";s:1:",";s:3:"－";s:1:"-";s:3:"．";s:1:".";s:3:"／";s:1:"/";s:3:"０";s:1:"0";s:3:"１";s:1:"1";s:3:"２";s:1:"2";s:3:"３";s:1:"3";s:3:"４";s:1:"4";s:3:"５";s:1:"5";s:3:"６";s:1:"6";s:3:"７";s:1:"7";s:3:"８";s:1:"8";s:3:"９";s:1:"9";s:3:"：";s:1:":";s:3:"；";s:1:";";s:3:"＜";s:1:"<";s:3:"＝";s:1:"=";s:3:"＞";s:1:">";s:3:"？";s:1:"?";s:3:"＠";s:1:"@";s:3:"Ａ";s:1:"A";s:3:"Ｂ";s:1:"B";s:3:"Ｃ";s:1:"C";s:3:"Ｄ";s:1:"D";s:3:"Ｅ";s:1:"E";s:3:"Ｆ";s:1:"F";s:3:"Ｇ";s:1:"G";s:3:"Ｈ";s:1:"H";s:3:"Ｉ";s:1:"I";s:3:"Ｊ";s:1:"J";s:3:"Ｋ";s:1:"K";s:3:"Ｌ";s:1:"L";s:3:"Ｍ";s:1:"M";s:3:"Ｎ";s:1:"N";s:3:"Ｏ";s:1:"O";s:3:"Ｐ";s:1:"P";s:3:"Ｑ";s:1:"Q";s:3:"Ｒ";s:1:"R";s:3:"Ｓ";s:1:"S";s:3:"Ｔ";s:1:"T";s:3:"Ｕ";s:1:"U";s:3:"Ｖ";s:1:"V";s:3:"Ｗ";s:1:"W";s:3:"Ｘ";s:1:"X";s:3:"Ｙ";s:1:"Y";s:3:"Ｚ";s:1:"Z";s:3:"［";s:1:"[";s:3:"＼";s:1:"\";s:3:"］";s:1:"]";s:3:"＾";s:1:"^";s:3:"＿";s:1:"_";s:3:"｀";s:1:"`";s:3:"ａ";s:1:"a";s:3:"ｂ";s:1:"b";s:3:"ｃ";s:1:"c";s:3:"ｄ";s:1:"d";s:3:"ｅ";s:1:"e";s:3:"ｆ";s:1:"f";s:3:"ｇ";s:1:"g";s:3:"ｈ";s:1:"h";s:3:"ｉ";s:1:"i";s:3:"ｊ";s:1:"j";s:3:"ｋ";s:1:"k";s:3:"ｌ";s:1:"l";s:3:"ｍ";s:1:"m";s:3:"ｎ";s:1:"n";s:3:"ｏ";s:1:"o";s:3:"ｐ";s:1:"p";s:3:"ｑ";s:1:"q";s:3:"ｒ";s:1:"r";s:3:"ｓ";s:1:"s";s:3:"ｔ";s:1:"t";s:3:"ｕ";s:1:"u";s:3:"ｖ";s:1:"v";s:3:"ｗ";s:1:"w";s:3:"ｘ";s:1:"x";s:3:"ｙ";s:1:"y";s:3:"ｚ";s:1:"z";s:3:"｛";s:1:"{";s:3:"｜";s:1:"|";s:3:"｝";s:1:"}";s:3:"～";s:1:"~";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/data/to.bestfit1256.ser
@@ -0,0 +1,3 @@
+a:534:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:" ";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"¥";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"¹";s:1:"";s:2:"»";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"À";s:1:"A";s:2:"Â";s:1:"A";s:2:"Ç";s:1:"C";s:2:"È";s:1:"E";s:2:"É";s:1:"E";s:2:"Ê";s:1:"E";s:2:"Ë";s:1:"E";s:2:"Î";s:1:"I";s:2:"Ï";s:1:"I";s:2:"Ô";s:1:"O";s:2:"×";s:1:"";s:2:"Ù";s:1:"U";s:2:"Û";s:1:"U";s:2:"Ü";s:1:"U";s:2:"à";s:1:"";s:2:"â";s:1:"";s:2:"ç";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ô";s:1:"";s:2:"÷";s:1:"";s:2:"ù";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"Œ";s:1:"";s:2:"œ";s:1:"";s:2:"Ƒ";s:1:"F";s:2:"ƒ";s:1:"";s:2:"ˆ";s:1:"";s:2:"،";s:1:"";s:2:"؛";s:1:"";s:2:"؟";s:1:"";s:2:"ء";s:1:"";s:2:"آ";s:1:"";s:2:"أ";s:1:"";s:2:"ؤ";s:1:"";s:2:"إ";s:1:"";s:2:"ئ";s:1:"";s:2:"ا";s:1:"";s:2:"ب";s:1:"";s:2:"ة";s:1:"";s:2:"ت";s:1:"";s:2:"ث";s:1:"";s:2:"ج";s:1:"";s:2:"ح";s:1:"";s:2:"خ";s:1:"";s:2:"د";s:1:"";s:2:"ذ";s:1:"";s:2:"ر";s:1:"";s:2:"ز";s:1:"";s:2:"س";s:1:"";s:2:"ش";s:1:"";s:2:"ص";s:1:"";s:2:"ض";s:1:"";s:2:"ط";s:1:"";s:2:"ظ";s:1:"";s:2:"ع";s:1:"";s:2:"غ";s:1:"";s:2:"ـ";s:1:"";s:2:"ف";s:1:"";s:2:"ق";s:1:"";s:2:"ك";s:1:"";s:2:"ل";s:1:"";s:2:"م";s:1:"";s:2:"ن";s:1:"";s:2:"ه";s:1:"";s:2:"و";s:1:"";s:2:"ى";s:1:"";s:2:"ي";s:1:"";s:2:"ً";s:1:"";s:2:"ٌ";s:1:"";s:2:"ٍ";s:1:"";s:2:"َ";s:1:"";s:2:"ُ";s:1:"";s:2:"ِ";s:1:"";s:2:"ّ";s:1:"";s:2:"ْ";s:1:"";s:2:"ٹ";s:1:"";s:2:"پ";s:1:"";s:2:"چ";s:1:"";s:2:"ڈ";s:1:"";s:2:"ڑ";s:1:"";s:2:"ژ";s:1:"";s:2:"ک";s:1:"";s:2:"گ";s:1:"";s:2:"ں";s:1:"";s:2:"ھ";s:1:"";s:2:"ہ";s:1:"";s:2:"ی";s:1:"";s:2:"ے";s:1:"";s:3:"‌";s:1:"";s:3:"‍";s:1:"";s:3:"‎";s:1:"";s:3:"‏";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"‚";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"„";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:3:"•";s:1:"";s:3:"…";s:1:"";s:3:"‰";s:1:"";s:3:"‹";s:1:"";s:3:"›";s:1:"";s:3:"€";s:1:"";s:3:"™";s:1:"";s:3:"ﭖ";s:1:"";s:3:"ﭗ";s:1:"";s:3:"ﭘ";s:1:"";s:3:"ﭙ";s:1:"";s:3:"ﭦ";s:1:"";s:3:"ﭧ";s:1:"";s:3:"ﭨ";s:1:"";s:3:"ﭩ";s:1:"";s:3:"ﭺ";s:1:"";s:3:"ﭻ";s:1:"";s:3:"ﭼ";s:1:"";s:3:"ﭽ";s:1:"";s:3:"ﮈ";s:1:"";s:3:"ﮉ";s:1:"";s:3:"ﮊ";s:1:"";s:3:"ﮋ";s:1:"";s:3:"ﮌ";s:1:"";s:3:"ﮍ";s:1:"";s:3:"ﮎ";s:1:"";s:3:"ﮏ";s:1:"";s:3:"ﮐ";s:1:"";s:3:"ﮑ";s:1:"";s:3:"ﮒ";s:1:"";s:3:"ﮓ";s:1:"";s:3:"ﮔ";s:1:"";s:3:"ﮕ";s:1:"";s:3:"ﮞ";s:1:"";s:3:"ﮟ";s:1:"";s:3:"ﮦ";s:1:"";s:3:"ﮧ";s:1:"";s:3:"ﮨ";s:1:"";s:3:"ﮩ";s:1:"";s:3:"ﮪ";s:1:"";s:3:"ﮫ";s:1:"";s:3:"ﮬ";s:1:"";s:3:"ﮭ";s:1:"";s:3:"ﮮ";s:1:"";s:3:"ﮯ";s:1:"";s:3:"ﹰ";s:1:"";s:3:"ﹱ";s:1:"";s:3:"ﹲ";s:1:"";s:3:"ﹴ";s:1:"";s:3:"ﹶ";s:1:"";s:3:"ﹷ";s:1:"";s:3:"ﹸ";s:1:"";s:3:"ﹹ";s:1:"";s:3:"ﹺ";s:1:"";s:3:"ﹻ";s:1:"";s:3:"ﹼ";s:1:"";s:3:"ﹽ";s:1:"";s:3:"ﹾ";s:1:"";s:3:"ﹿ";s:1:"";s:3:"ﺀ";s:1:"";s:3:"ﺁ";s:1:"";s:3:"ﺂ";s:1:"";s:3:"ﺃ";s:1:"";s:3:"ﺄ";s:1:"";s:3:"ﺅ";s:1:"";s:3:"ﺆ";s:1:"";s:3:"ﺇ";s:1:"";s:3:"ﺈ";s:1:"";s:3:"ﺉ";s:1:"";s:3:"ﺊ";s:1:"";s:3:"ﺋ";s:1:"";s:3:"ﺌ";s:1:"";s:3:"ﺍ";s:1:"";s:3:"ﺎ";s:1:"";s:3:"ﺏ";s:1:"";s:3:"ﺐ";s:1:"";s:3:"ﺑ";s:1:"";s:3:"ﺒ";s:1:"";s:3:"ﺓ";s:1:"";s:3:"ﺔ";s:1:"";s:3:"ﺕ";s:1:"";s:3:"ﺖ";s:1:"";s:3:"ﺗ";s:1:"";s:3:"ﺘ";s:1:"";s:3:"ﺙ";s:1:"";s:3:"ﺚ";s:1:"";s:3:"ﺛ";s:1:"";s:3:"ﺜ";s:1:"";s:3:"ﺝ";s:1:"";s:3:"ﺞ";s:1:"";s:3:"ﺟ";s:1:"";s:3:"ﺠ";s:1:"";s:3:"ﺡ";s:1:"";s:3:"ﺢ";s:1:"";s:3:"ﺣ";s:1:"";s:3:"ﺤ";s:1:"";s:3:"ﺥ";s:1:"";s:3:"ﺦ";s:1:"";s:3:"ﺧ";s:1:"";s:3:"ﺨ";s:1:"";s:3:"ﺩ";s:1:"";s:3:"ﺪ";s:1:"";s:3:"ﺫ";s:1:"";s:3:"ﺬ";s:1:"";s:3:"ﺭ";s:1:"";s:3:"ﺮ";s:1:"";s:3:"ﺯ";s:1:"";s:3:"ﺰ";s:1:"";s:3:"ﺱ";s:1:"";s:3:"ﺲ";s:1:"";s:3:"ﺳ";s:1:"";s:3:"ﺴ";s:1:"";s:3:"ﺵ";s:1:"";s:3:"ﺶ";s:1:"";s:3:"ﺷ";s:1:"";s:3:"ﺸ";s:1:"";s:3:"ﺹ";s:1:"";s:3:"ﺺ";s:1:"";s:3:"ﺻ";s:1:"";s:3:"ﺼ";s:1:"";s:3:"ﺽ";s:1:"";s:3:"ﺾ";s:1:"";s:3:"ﺿ";s:1:"";s:3:"ﻀ";s:1:"";s:3:"ﻁ";s:1:"";s:3:"ﻂ";s:1:"";s:3:"ﻃ";s:1:"";s:3:"ﻄ";s:1:"";s:3:"ﻅ";s:1:"";s:3:"ﻆ";s:1:"";s:3:"ﻇ";s:1:"";s:3:"ﻈ";s:1:"";s:3:"ﻉ";s:1:"";s:3:"ﻊ";s:1:"";s:3:"ﻋ";s:1:"";s:3:"ﻌ";s:1:"";s:3:"ﻍ";s:1:"";s:3:"ﻎ";s:1:"";s:3:"ﻏ";s:1:"";s:3:"ﻐ";s:1:"";s:3:"ﻑ";s:1:"";s:3:"ﻒ";s:1:"";s:3:"ﻓ";s:1:"";s:3:"ﻔ";s:1:"";s:3:"ﻕ";s:1:"";s:3:"ﻖ";s:1:"";s:3:"ﻗ";s:1:"";s:3:"ﻘ";s:1:"";s:3:"ﻙ";s:1:"";s:3:"ﻚ";s:1:"";s:3:"ﻛ";s:1:"";s:3:"ﻜ";s:1:"";s:3:"ﻝ";s:1:"";s:3:"ﻞ";s:1:"";s:3:"ﻟ";s:1:"";s:3:"ﻠ";s:1:"";s:3:"ﻡ";s:1:"";s:3:"ﻢ";s:1:"";s:3:"ﻣ";s:1:"";s:3:"ﻤ";s:1:"";s:3:"ﻥ";s:1:"";s:3:"ﻦ";s:1:"";s:3:"ﻧ";s:1:"";s:3:"ﻨ";s:1:"";s:3:"ﻩ";s:1:"";s:3:"ﻪ";s:1:"";s:3:"ﻫ";s:1:"";s:3:"ﻬ";s:1:"";s:3:"ﻭ";s:1:"";s:3:"ﻮ";s:1:"";s:3:"ﻯ";s:1:"";s:3:"ﻰ";s:1:"";s:3:"ﻱ";s:1:"";s:3:"ﻲ";s:1:"";s:3:"ﻳ";s:1:"";s:3:"ﻴ";s:1:"";s:3:"！";s:1:"!";s:3:"＂";s:1:""";s:3:"＃";s:1:"#";s:3:"＄";s:1:"$";s:3:"％";s:1:"%";s:3:"＆";s:1:"&";s:3:"＇";s:1:"'";s:3:"（";s:1:"(";s:3:"）";s:1:")";s:3:"＊";s:1:"*";s:3:"＋";s:1:"+";s:3:"，";s:1:",";s:3:"－";s:1:"-";s:3:"．";s:1:".";s:3:"／";s:1:"/";s:3:"０";s:1:"0";s:3:"１";s:1:"1";s:3:"２";s:1:"2";s:3:"３";s:1:"3";s:3:"４";s:1:"4";s:3:"５";s:1:"5";s:3:"６";s:1:"6";s:3:"７";s:1:"7";s:3:"８";s:1:"8";s:3:"９";s:1:"9";s:3:"：";s:1:":";s:3:"；";s:1:";";s:3:"＜";s:1:"<";s:3:"＝";s:1:"=";s:3:"＞";s:1:">";s:3:"？";s:1:"?";s:3:"＠";s:1:"@";s:3:"Ａ";s:1:"A";s:3:"Ｂ";s:1:"B";s:3:"Ｃ";s:1:"C";s:3:"Ｄ";s:1:"D";s:3:"Ｅ";s:1:"E";s:3:"Ｆ";s:1:"F";s:3:"Ｇ";s:1:"G";s:3:"Ｈ";s:1:"H";s:3:"Ｉ";s:1:"I";s:3:"Ｊ";s:1:"J";s:3:"Ｋ";s:1:"K";s:3:"Ｌ";s:1:"L";s:3:"Ｍ";s:1:"M";s:3:"Ｎ";s:1:"N";s:3:"Ｏ";s:1:"O";s:3:"Ｐ";s:1:"P";s:3:"Ｑ";s:1:"Q";s:3:"Ｒ";s:1:"R";s:3:"Ｓ";s:1:"S";s:3:"Ｔ";s:1:"T";s:3:"Ｕ";s:1:"U";s:3:"Ｖ";s:1:"V";s:3:"Ｗ";s:1:"W";s:3:"Ｘ";s:1:"X";s:3:"Ｙ";s:1:"Y";s:3:"Ｚ";s:1:"Z";s:3:"［";s:1:"[";s:3:"＼";s:1:"\";s:3:"］";s:1:"]";s:3:"＾";s:1:"^";s:3:"＿";s:1:"_";s:3:"｀";s:1:"`";s:3:"ａ";s:1:"a";s:3:"ｂ";s:1:"b";s:3:"ｃ";s:1:"c";s:3:"ｄ";s:1:"d";s:3:"ｅ";s:1:"e";s:3:"ｆ";s:1:"f";s:3:"ｇ";s:1:"g";s:3:"ｈ";s:1:"h";s:3:"ｉ";s:1:"i";s:3:"ｊ";s:1:"j";s:3:"ｋ";s:1:"k";s:3:"ｌ";s:1:"l";s:3:"ｍ";s:1:"m";s:3:"ｎ";s:1:"n";s:3:"ｏ";s:1:"o";s:3:"ｐ";s:1:"p";s:3:"ｑ";s:1:"q";s:3:"ｒ";s:1:"r";s:3:"ｓ";s:1:"s";s:3:"ｔ";s:1:"t";s:3:"ｕ";s:1:"u";s:3:"ｖ";s:1:"v";s:3:"ｗ";s:1:"w";s:3:"ｘ";s:1:"x";s:3:"ｙ";s:1:"y";s:3:"ｚ";s:1:"z";s:3:"｛";s:1:"{";s:3:"｜";s:1:"|";s:3:"｝";s:1:"}";s:3:"～";s:1:"~";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/data/to.bestfit1257.ser
@@ -0,0 +1,3 @@
+a:350:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"¹";s:1:"";s:2:"»";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Æ";s:1:"";s:2:"É";s:1:"";s:2:"Ó";s:1:"";s:2:"Õ";s:1:"";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ø";s:1:"";s:2:"Ü";s:1:"";s:2:"ß";s:1:"";s:2:"ä";s:1:"";s:2:"å";s:1:"";s:2:"æ";s:1:"";s:2:"é";s:1:"";s:2:"ó";s:1:"";s:2:"õ";s:1:"";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ø";s:1:"";s:2:"ü";s:1:"";s:2:"Ā";s:1:"";s:2:"ā";s:1:"";s:2:"Ą";s:1:"";s:2:"ą";s:1:"";s:2:"Ć";s:1:"";s:2:"ć";s:1:"";s:2:"Č";s:1:"";s:2:"č";s:1:"";s:2:"Ē";s:1:"";s:2:"ē";s:1:"";s:2:"Ė";s:1:"";s:2:"ė";s:1:"";s:2:"Ę";s:1:"";s:2:"ę";s:1:"";s:2:"Ģ";s:1:"";s:2:"ģ";s:1:"";s:2:"Ī";s:1:"";s:2:"ī";s:1:"";s:2:"Į";s:1:"";s:2:"į";s:1:"";s:2:"Ķ";s:1:"";s:2:"ķ";s:1:"";s:2:"Ļ";s:1:"";s:2:"ļ";s:1:"";s:2:"Ł";s:1:"";s:2:"ł";s:1:"";s:2:"Ń";s:1:"";s:2:"ń";s:1:"";s:2:"Ņ";s:1:"";s:2:"ņ";s:1:"";s:2:"Ō";s:1:"";s:2:"ō";s:1:"";s:2:"Ŗ";s:1:"";s:2:"ŗ";s:1:"";s:2:"Ś";s:1:"";s:2:"ś";s:1:"";s:2:"Š";s:1:"";s:2:"š";s:1:"";s:2:"Ū";s:1:"";s:2:"ū";s:1:"";s:2:"Ų";s:1:"";s:2:"ų";s:1:"";s:2:"Ź";s:1:"";s:2:"ź";s:1:"";s:2:"Ż";s:1:"";s:2:"ż";s:1:"";s:2:"Ž";s:1:"";s:2:"ž";s:1:"";s:2:"ˇ";s:1:"";s:2:"˙";s:1:"";s:2:"˛";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"‚";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"„";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:3:"•";s:1:"";s:3:"…";s:1:"";s:3:"‰";s:1:"";s:3:"‹";s:1:"";s:3:"›";s:1:"";s:3:"€";s:1:"";s:3:"™";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"！";s:1:"!";s:3:"＂";s:1:""";s:3:"＃";s:1:"#";s:3:"＄";s:1:"$";s:3:"％";s:1:"%";s:3:"＆";s:1:"&";s:3:"＇";s:1:"'";s:3:"（";s:1:"(";s:3:"）";s:1:")";s:3:"＊";s:1:"*";s:3:"＋";s:1:"+";s:3:"，";s:1:",";s:3:"－";s:1:"-";s:3:"．";s:1:".";s:3:"／";s:1:"/";s:3:"０";s:1:"0";s:3:"１";s:1:"1";s:3:"２";s:1:"2";s:3:"３";s:1:"3";s:3:"４";s:1:"4";s:3:"５";s:1:"5";s:3:"６";s:1:"6";s:3:"７";s:1:"7";s:3:"８";s:1:"8";s:3:"９";s:1:"9";s:3:"：";s:1:":";s:3:"；";s:1:";";s:3:"＜";s:1:"<";s:3:"＝";s:1:"=";s:3:"＞";s:1:">";s:3:"？";s:1:"?";s:3:"＠";s:1:"@";s:3:"Ａ";s:1:"A";s:3:"Ｂ";s:1:"B";s:3:"Ｃ";s:1:"C";s:3:"Ｄ";s:1:"D";s:3:"Ｅ";s:1:"E";s:3:"Ｆ";s:1:"F";s:3:"Ｇ";s:1:"G";s:3:"Ｈ";s:1:"H";s:3:"Ｉ";s:1:"I";s:3:"Ｊ";s:1:"J";s:3:"Ｋ";s:1:"K";s:3:"Ｌ";s:1:"L";s:3:"Ｍ";s:1:"M";s:3:"Ｎ";s:1:"N";s:3:"Ｏ";s:1:"O";s:3:"Ｐ";s:1:"P";s:3:"Ｑ";s:1:"Q";s:3:"Ｒ";s:1:"R";s:3:"Ｓ";s:1:"S";s:3:"Ｔ";s:1:"T";s:3:"Ｕ";s:1:"U";s:3:"Ｖ";s:1:"V";s:3:"Ｗ";s:1:"W";s:3:"Ｘ";s:1:"X";s:3:"Ｙ";s:1:"Y";s:3:"Ｚ";s:1:"Z";s:3:"［";s:1:"[";s:3:"＼";s:1:"\";s:3:"］";s:1:"]";s:3:"＾";s:1:"^";s:3:"＿";s:1:"_";s:3:"｀";s:1:"`";s:3:"ａ";s:1:"a";s:3:"ｂ";s:1:"b";s:3:"ｃ";s:1:"c";s:3:"ｄ";s:1:"d";s:3:"ｅ";s:1:"e";s:3:"ｆ";s:1:"f";s:3:"ｇ";s:1:"g";s:3:"ｈ";s:1:"h";s:3:"ｉ";s:1:"i";s:3:"ｊ";s:1:"j";s:3:"ｋ";s:1:"k";s:3:"ｌ";s:1:"l";s:3:"ｍ";s:1:"m";s:3:"ｎ";s:1:"n";s:3:"ｏ";s:1:"o";s:3:"ｐ";s:1:"p";s:3:"ｑ";s:1:"q";s:3:"ｒ";s:1:"r";s:3:"ｓ";s:1:"s";s:3:"ｔ";s:1:"t";s:3:"ｕ";s:1:"u";s:3:"ｖ";s:1:"v";s:3:"ｗ";s:1:"w";s:3:"ｘ";s:1:"x";s:3:"ｙ";s:1:"y";s:3:"ｚ";s:1:"z";s:3:"｛";s:1:"{";s:3:"｜";s:1:"|";s:3:"｝";s:1:"}";s:3:"～";s:1:"~";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/data/to.bestfit1258.ser
@@ -0,0 +1,3 @@
+a:350:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"¡";s:1:"";s:2:"¢";s:1:"";s:2:"£";s:1:"";s:2:"¤";s:1:"";s:2:"¥";s:1:"";s:2:"¦";s:1:"";s:2:"§";s:1:"";s:2:"¨";s:1:"";s:2:"©";s:1:"";s:2:"ª";s:1:"";s:2:"«";s:1:"";s:2:"¬";s:1:"";s:2:"­";s:1:"";s:2:"®";s:1:"";s:2:"¯";s:1:"";s:2:"°";s:1:"";s:2:"±";s:1:"";s:2:"²";s:1:"";s:2:"³";s:1:"";s:2:"´";s:1:"";s:2:"µ";s:1:"";s:2:"¶";s:1:"";s:2:"·";s:1:"";s:2:"¸";s:1:"";s:2:"¹";s:1:"";s:2:"º";s:1:"";s:2:"»";s:1:"";s:2:"¼";s:1:"";s:2:"½";s:1:"";s:2:"¾";s:1:"";s:2:"¿";s:1:"";s:2:"À";s:1:"";s:2:"Á";s:1:"";s:2:"Â";s:1:"";s:2:"Ä";s:1:"";s:2:"Å";s:1:"";s:2:"Æ";s:1:"";s:2:"Ç";s:1:"";s:2:"È";s:1:"";s:2:"É";s:1:"";s:2:"Ê";s:1:"";s:2:"Ë";s:1:"";s:2:"Í";s:1:"";s:2:"Î";s:1:"";s:2:"Ï";s:1:"";s:2:"Ñ";s:1:"";s:2:"Ó";s:1:"";s:2:"Ô";s:1:"";s:2:"Ö";s:1:"";s:2:"×";s:1:"";s:2:"Ø";s:1:"";s:2:"Ù";s:1:"";s:2:"Ú";s:1:"";s:2:"Û";s:1:"";s:2:"Ü";s:1:"";s:2:"ß";s:1:"";s:2:"à";s:1:"";s:2:"á";s:1:"";s:2:"â";s:1:"";s:2:"ä";s:1:"";s:2:"å";s:1:"";s:2:"æ";s:1:"";s:2:"ç";s:1:"";s:2:"è";s:1:"";s:2:"é";s:1:"";s:2:"ê";s:1:"";s:2:"ë";s:1:"";s:2:"í";s:1:"";s:2:"î";s:1:"";s:2:"ï";s:1:"";s:2:"ñ";s:1:"";s:2:"ó";s:1:"";s:2:"ô";s:1:"";s:2:"ö";s:1:"";s:2:"÷";s:1:"";s:2:"ø";s:1:"";s:2:"ù";s:1:"";s:2:"ú";s:1:"";s:2:"û";s:1:"";s:2:"ü";s:1:"";s:2:"ÿ";s:1:"";s:2:"Ă";s:1:"";s:2:"ă";s:1:"";s:2:"Đ";s:1:"";s:2:"đ";s:1:"";s:2:"Œ";s:1:"";s:2:"œ";s:1:"";s:2:"Ÿ";s:1:"";s:2:"ƒ";s:1:"";s:2:"Ơ";s:1:"";s:2:"ơ";s:1:"";s:2:"Ư";s:1:"";s:2:"ư";s:1:"";s:2:"ˆ";s:1:"";s:2:"˜";s:1:"";s:2:"̀";s:1:"";s:2:"́";s:1:"";s:2:"̃";s:1:"";s:2:"̉";s:1:"";s:2:"̣";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"‚";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"„";s:1:"";s:3:"†";s:1:"";s:3:"‡";s:1:"";s:3:"•";s:1:"";s:3:"…";s:1:"";s:3:"‰";s:1:"";s:3:"‹";s:1:"";s:3:"›";s:1:"";s:3:"€";s:1:"";s:3:"₫";s:1:"";s:3:"™";s:1:"";s:3:"！";s:1:"!";s:3:"＂";s:1:""";s:3:"＃";s:1:"#";s:3:"＄";s:1:"$";s:3:"％";s:1:"%";s:3:"＆";s:1:"&";s:3:"＇";s:1:"'";s:3:"（";s:1:"(";s:3:"）";s:1:")";s:3:"＊";s:1:"*";s:3:"＋";s:1:"+";s:3:"，";s:1:",";s:3:"－";s:1:"-";s:3:"．";s:1:".";s:3:"／";s:1:"/";s:3:"０";s:1:"0";s:3:"１";s:1:"1";s:3:"２";s:1:"2";s:3:"３";s:1:"3";s:3:"４";s:1:"4";s:3:"５";s:1:"5";s:3:"６";s:1:"6";s:3:"７";s:1:"7";s:3:"８";s:1:"8";s:3:"９";s:1:"9";s:3:"：";s:1:":";s:3:"；";s:1:";";s:3:"＜";s:1:"<";s:3:"＝";s:1:"=";s:3:"＞";s:1:">";s:3:"？";s:1:"?";s:3:"＠";s:1:"@";s:3:"Ａ";s:1:"A";s:3:"Ｂ";s:1:"B";s:3:"Ｃ";s:1:"C";s:3:"Ｄ";s:1:"D";s:3:"Ｅ";s:1:"E";s:3:"Ｆ";s:1:"F";s:3:"Ｇ";s:1:"G";s:3:"Ｈ";s:1:"H";s:3:"Ｉ";s:1:"I";s:3:"Ｊ";s:1:"J";s:3:"Ｋ";s:1:"K";s:3:"Ｌ";s:1:"L";s:3:"Ｍ";s:1:"M";s:3:"Ｎ";s:1:"N";s:3:"Ｏ";s:1:"O";s:3:"Ｐ";s:1:"P";s:3:"Ｑ";s:1:"Q";s:3:"Ｒ";s:1:"R";s:3:"Ｓ";s:1:"S";s:3:"Ｔ";s:1:"T";s:3:"Ｕ";s:1:"U";s:3:"Ｖ";s:1:"V";s:3:"Ｗ";s:1:"W";s:3:"Ｘ";s:1:"X";s:3:"Ｙ";s:1:"Y";s:3:"Ｚ";s:1:"Z";s:3:"［";s:1:"[";s:3:"＼";s:1:"\";s:3:"］";s:1:"]";s:3:"＾";s:1:"^";s:3:"＿";s:1:"_";s:3:"｀";s:1:"`";s:3:"ａ";s:1:"a";s:3:"ｂ";s:1:"b";s:3:"ｃ";s:1:"c";s:3:"ｄ";s:1:"d";s:3:"ｅ";s:1:"e";s:3:"ｆ";s:1:"f";s:3:"ｇ";s:1:"g";s:3:"ｈ";s:1:"h";s:3:"ｉ";s:1:"i";s:3:"ｊ";s:1:"j";s:3:"ｋ";s:1:"k";s:3:"ｌ";s:1:"l";s:3:"ｍ";s:1:"m";s:3:"ｎ";s:1:"n";s:3:"ｏ";s:1:"o";s:3:"ｐ";s:1:"p";s:3:"ｑ";s:1:"q";s:3:"ｒ";s:1:"r";s:3:"ｓ";s:1:"s";s:3:"ｔ";s:1:"t";s:3:"ｕ";s:1:"u";s:3:"ｖ";s:1:"v";s:3:"ｗ";s:1:"w";s:3:"ｘ";s:1:"x";s:3:"ｙ";s:1:"y";s:3:"ｚ";s:1:"z";s:3:"｛";s:1:"{";s:3:"｜";s:1:"|";s:3:"｝";s:1:"}";s:3:"～";s:1:"~";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/data/to.bestfit874.ser
@@ -0,0 +1,4 @@
+a:393:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:"";s:1:"";s:2:" ";s:1:"";s:2:"§";s:1:"";s:2:"¶";s:1:"";s:3:"ก";s:1:"";s:3:"ข";s:1:"";s:3:"ฃ";s:1:"";s:3:"ค";s:1:"";s:3:"ฅ";s:1:"";s:3:"ฆ";s:1:"";s:3:"ง";s:1:"";s:3:"จ";s:1:"";s:3:"ฉ";s:1:"";s:3:"ช";s:1:"";s:3:"ซ";s:1:"";s:3:"ฌ";s:1:"";s:3:"ญ";s:1:"";s:3:"ฎ";s:1:"";s:3:"ฏ";s:1:"";s:3:"ฐ";s:1:"";s:3:"ฑ";s:1:"";s:3:"ฒ";s:1:"";s:3:"ณ";s:1:"";s:3:"ด";s:1:"";s:3:"ต";s:1:"";s:3:"ถ";s:1:"";s:3:"ท";s:1:"";s:3:"ธ";s:1:"";s:3:"น";s:1:"";s:3:"บ";s:1:"";s:3:"ป";s:1:"";s:3:"ผ";s:1:"";s:3:"ฝ";s:1:"";s:3:"พ";s:1:"";s:3:"ฟ";s:1:"";s:3:"ภ";s:1:"";s:3:"ม";s:1:"";s:3:"ย";s:1:"";s:3:"ร";s:1:"";s:3:"ฤ";s:1:"";s:3:"ล";s:1:"";s:3:"ฦ";s:1:"";s:3:"ว";s:1:"";s:3:"ศ";s:1:"";s:3:"ษ";s:1:"";s:3:"ส";s:1:"";s:3:"ห";s:1:"";s:3:"ฬ";s:1:"";s:3:"อ";s:1:"";s:3:"ฮ";s:1:"";s:3:"ฯ";s:1:"";s:3:"ะ";s:1:"";s:3:"ั";s:1:"";s:3:"า";s:1:"";s:3:"ำ";s:1:"";s:3:"ิ";s:1:"";s:3:"ี";s:1:"";s:3:"ึ";s:1:"";s:3:"ื";s:1:"";s:3:"ุ";s:1:"";s:3:"ู";s:1:"";s:3:"ฺ";s:1:"";s:3:"฿";s:1:"";s:3:"เ";s:1:"";s:3:"แ";s:1:"";s:3:"โ";s:1:"";s:3:"ใ";s:1:"";s:3:"ไ";s:1:"";s:3:"ๅ";s:1:"";s:3:"ๆ";s:1:"";s:3:"็";s:1:"";s:3:"่";s:1:"";s:3:"้";s:1:"";s:3:"๊";s:1:"";s:3:"๋";s:1:"";s:3:"์";s:1:"";s:3:"ํ";s:1:"";s:3:"๎";s:1:"";s:3:"๏";s:1:"";s:3:"๐";s:1:"";s:3:"๑";s:1:"";s:3:"๒";s:1:"";s:3:"๓";s:1:"";s:3:"๔";s:1:"";s:3:"๕";s:1:"";s:3:"๖";s:1:"";s:3:"๗";s:1:"";s:3:"๘";s:1:"";s:3:"๙";s:1:"";s:3:"๚";s:1:"";s:3:"๛";s:1:"";s:3:"–";s:1:"";s:3:"—";s:1:"";s:3:"‘";s:1:"";s:3:"’";s:1:"";s:3:"“";s:1:"";s:3:"”";s:1:"";s:3:"•";s:1:"";s:3:"…";s:1:"";s:3:"‼";s:1:"";s:3:"€";s:1:"";s:3:"←";s:1:"";s:3:"↑";s:1:"";s:3:"→";s:1:"";s:3:"↓";s:1:"";s:3:"↔";s:1:"";s:3:"↕";s:1:"";s:3:"↨";s:1:"";s:3:"∟";s:1:"";s:3:"⌂";s:1:"";s:3:"─";s:1:"";s:3:"│";s:1:"";s:3:"┌";s:1:"";s:3:"┐";s:1:"";s:3:"└";s:1:"";s:3:"┘";s:1:"";s:3:"═";s:1:"";s:3:"║";s:1:"";s:3:"╔";s:1:"";s:3:"╗";s:1:"";s:3:"╚";s:1:"";s:3:"╝";s:1:"";s:3:"▬";s:1:"";s:3:"▲";s:1:"";s:3:"►";s:1:"";s:3:"▼";s:1:"";s:3:"◄";s:1:"";s:3:"○";s:1:"	";s:3:"◘";s:1:"";s:3:"◙";s:1:"
+";s:3:"☺";s:1:"";s:3:"☻";s:1:"";s:3:"☼";s:1:"";s:3:"♀";s:1:"";s:3:"♂";s:1:"";s:3:"♠";s:1:"";s:3:"♣";s:1:"";s:3:"♥";s:1:"";s:3:"♦";s:1:"";s:3:"♪";s:1:"
";s:3:"♫";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"！";s:1:"!";s:3:"＂";s:1:""";s:3:"＃";s:1:"#";s:3:"＄";s:1:"$";s:3:"％";s:1:"%";s:3:"＆";s:1:"&";s:3:"＇";s:1:"'";s:3:"（";s:1:"(";s:3:"）";s:1:")";s:3:"＊";s:1:"*";s:3:"＋";s:1:"+";s:3:"，";s:1:",";s:3:"－";s:1:"-";s:3:"．";s:1:".";s:3:"／";s:1:"/";s:3:"０";s:1:"0";s:3:"１";s:1:"1";s:3:"２";s:1:"2";s:3:"３";s:1:"3";s:3:"４";s:1:"4";s:3:"５";s:1:"5";s:3:"６";s:1:"6";s:3:"７";s:1:"7";s:3:"８";s:1:"8";s:3:"９";s:1:"9";s:3:"：";s:1:":";s:3:"；";s:1:";";s:3:"＜";s:1:"<";s:3:"＝";s:1:"=";s:3:"＞";s:1:">";s:3:"？";s:1:"?";s:3:"＠";s:1:"@";s:3:"Ａ";s:1:"A";s:3:"Ｂ";s:1:"B";s:3:"Ｃ";s:1:"C";s:3:"Ｄ";s:1:"D";s:3:"Ｅ";s:1:"E";s:3:"Ｆ";s:1:"F";s:3:"Ｇ";s:1:"G";s:3:"Ｈ";s:1:"H";s:3:"Ｉ";s:1:"I";s:3:"Ｊ";s:1:"J";s:3:"Ｋ";s:1:"K";s:3:"Ｌ";s:1:"L";s:3:"Ｍ";s:1:"M";s:3:"Ｎ";s:1:"N";s:3:"Ｏ";s:1:"O";s:3:"Ｐ";s:1:"P";s:3:"Ｑ";s:1:"Q";s:3:"Ｒ";s:1:"R";s:3:"Ｓ";s:1:"S";s:3:"Ｔ";s:1:"T";s:3:"Ｕ";s:1:"U";s:3:"Ｖ";s:1:"V";s:3:"Ｗ";s:1:"W";s:3:"Ｘ";s:1:"X";s:3:"Ｙ";s:1:"Y";s:3:"Ｚ";s:1:"Z";s:3:"［";s:1:"[";s:3:"＼";s:1:"\";s:3:"］";s:1:"]";s:3:"＾";s:1:"^";s:3:"＿";s:1:"_";s:3:"｀";s:1:"`";s:3:"ａ";s:1:"a";s:3:"ｂ";s:1:"b";s:3:"ｃ";s:1:"c";s:3:"ｄ";s:1:"d";s:3:"ｅ";s:1:"e";s:3:"ｆ";s:1:"f";s:3:"ｇ";s:1:"g";s:3:"ｈ";s:1:"h";s:3:"ｉ";s:1:"i";s:3:"ｊ";s:1:"j";s:3:"ｋ";s:1:"k";s:3:"ｌ";s:1:"l";s:3:"ｍ";s:1:"m";s:3:"ｎ";s:1:"n";s:3:"ｏ";s:1:"o";s:3:"ｐ";s:1:"p";s:3:"ｑ";s:1:"q";s:3:"ｒ";s:1:"r";s:3:"ｓ";s:1:"s";s:3:"ｔ";s:1:"t";s:3:"ｕ";s:1:"u";s:3:"ｖ";s:1:"v";s:3:"ｗ";s:1:"w";s:3:"ｘ";s:1:"x";s:3:"ｙ";s:1:"y";s:3:"ｚ";s:1:"z";s:3:"｛";s:1:"{";s:3:"｜";s:1:"|";s:3:"｝";s:1:"}";s:3:"～";s:1:"~";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/data/to.bestfit932.ser
@@ -0,0 +1,3 @@
+a:9486:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"¡";s:1:"!";s:2:"¢";s:2:"";s:2:"£";s:2:"";s:2:"¥";s:1:"\";s:2:"¦";s:1:"|";s:2:"§";s:2:"";s:2:"¨";s:2:"N";s:2:"©";s:1:"c";s:2:"ª";s:1:"a";s:2:"«";s:2:"";s:2:"¬";s:2:"";s:2:"­";s:1:"-";s:2:"®";s:1:"R";s:2:"¯";s:2:"P";s:2:"°";s:2:"";s:2:"±";s:2:"}";s:2:"²";s:1:"2";s:2:"³";s:1:"3";s:2:"´";s:2:"L";s:2:"µ";s:2:"";s:2:"¶";s:2:"";s:2:"·";s:2:"E";s:2:"¸";s:2:"C";s:2:"¹";s:1:"1";s:2:"º";s:1:"o";s:2:"»";s:2:"";s:2:"¿";s:1:"?";s:2:"À";s:1:"A";s:2:"Á";s:1:"A";s:2:"Â";s:1:"A";s:2:"Ã";s:1:"A";s:2:"Ä";s:1:"A";s:2:"Å";s:1:"A";s:2:"Æ";s:1:"A";s:2:"Ç";s:1:"C";s:2:"È";s:1:"E";s:2:"É";s:1:"E";s:2:"Ê";s:1:"E";s:2:"Ë";s:1:"E";s:2:"Ì";s:1:"I";s:2:"Í";s:1:"I";s:2:"Î";s:1:"I";s:2:"Ï";s:1:"I";s:2:"Ð";s:1:"D";s:2:"Ñ";s:1:"N";s:2:"Ò";s:1:"O";s:2:"Ó";s:1:"O";s:2:"Ô";s:1:"O";s:2:"Õ";s:1:"O";s:2:"Ö";s:1:"O";s:2:"×";s:2:"~";s:2:"Ø";s:1:"O";s:2:"Ù";s:1:"U";s:2:"Ú";s:1:"U";s:2:"Û";s:1:"U";s:2:"Ü";s:1:"U";s:2:"Ý";s:1:"Y";s:2:"Þ";s:1:"T";s:2:"ß";s:1:"s";s:2:"à";s:1:"a";s:2:"á";s:1:"a";s:2:"â";s:1:"a";s:2:"ã";s:1:"a";s:2:"ä";s:1:"a";s:2:"å";s:1:"a";s:2:"æ";s:1:"a";s:2:"ç";s:1:"c";s:2:"è";s:1:"e";s:2:"é";s:1:"e";s:2:"ê";s:1:"e";s:2:"ë";s:1:"e";s:2:"ì";s:1:"i";s:2:"í";s:1:"i";s:2:"î";s:1:"i";s:2:"ï";s:1:"i";s:2:"ð";s:1:"d";s:2:"ñ";s:1:"n";s:2:"ò";s:1:"o";s:2:"ó";s:1:"o";s:2:"ô";s:1:"o";s:2:"õ";s:1:"o";s:2:"ö";s:1:"o";s:2:"÷";s:2:"";s:2:"ø";s:1:"o";s:2:"ù";s:1:"u";s:2:"ú";s:1:"u";s:2:"û";s:1:"u";s:2:"ü";s:1:"u";s:2:"ý";s:1:"y";s:2:"þ";s:1:"t";s:2:"ÿ";s:1:"y";s:2:"Α";s:2:"";s:2:"Β";s:2:"";s:2:"Γ";s:2:"";s:2:"Δ";s:2:"";s:2:"Ε";s:2:"";s:2:"Ζ";s:2:"";s:2:"Η";s:2:"";s:2:"Θ";s:2:"";s:2:"Ι";s:2:"";s:2:"Κ";s:2:"";s:2:"Λ";s:2:"";s:2:"Μ";s:2:"";s:2:"Ν";s:2:"";s:2:"Ξ";s:2:"";s:2:"Ο";s:2:"";s:2:"Π";s:2:"";s:2:"Ρ";s:2:"";s:2:"Σ";s:2:"";s:2:"Τ";s:2:"";s:2:"Υ";s:2:"";s:2:"Φ";s:2:"";s:2:"Χ";s:2:"";s:2:"Ψ";s:2:"";s:2:"Ω";s:2:"";s:2:"α";s:2:"";s:2:"β";s:2:"";s:2:"γ";s:2:"";s:2:"δ";s:2:"";s:2:"ε";s:2:"";s:2:"ζ";s:2:"";s:2:"η";s:2:"";s:2:"θ";s:2:"";s:2:"ι";s:2:"";s:2:"κ";s:2:"";s:2:"λ";s:2:"";s:2:"μ";s:2:"";s:2:"ν";s:2:"";s:2:"ξ";s:2:"";s:2:"ο";s:2:"";s:2:"π";s:2:"";s:2:"ρ";s:2:"";s:2:"σ";s:2:"";s:2:"τ";s:2:"";s:2:"υ";s:2:"";s:2:"φ";s:2:"";s:2:"χ";s:2:"";s:2:"ψ";s:2:"";s:2:"ω";s:2:"";s:2:"Ё";s:2:"F";s:2:"А";s:2:"@";s:2:"Б";s:2:"A";s:2:"В";s:2:"B";s:2:"Г";s:2:"C";s:2:"Д";s:2:"D";s:2:"Е";s:2:"E";s:2:"Ж";s:2:"G";s:2:"З";s:2:"H";s:2:"И";s:2:"I";s:2:"Й";s:2:"J";s:2:"К";s:2:"K";s:2:"Л";s:2:"L";s:2:"М";s:2:"M";s:2:"Н";s:2:"N";s:2:"О";s:2:"O";s:2:"П";s:2:"P";s:2:"Р";s:2:"Q";s:2:"С";s:2:"R";s:2:"Т";s:2:"S";s:2:"У";s:2:"T";s:2:"Ф";s:2:"U";s:2:"Х";s:2:"V";s:2:"Ц";s:2:"W";s:2:"Ч";s:2:"X";s:2:"Ш";s:2:"Y";s:2:"Щ";s:2:"Z";s:2:"Ъ";s:2:"[";s:2:"Ы";s:2:"\";s:2:"Ь";s:2:"]";s:2:"Э";s:2:"^";s:2:"Ю";s:2:"_";s:2:"Я";s:2:"`";s:2:"а";s:2:"p";s:2:"б";s:2:"q";s:2:"в";s:2:"r";s:2:"г";s:2:"s";s:2:"д";s:2:"t";s:2:"е";s:2:"u";s:2:"ж";s:2:"w";s:2:"з";s:2:"x";s:2:"и";s:2:"y";s:2:"й";s:2:"z";s:2:"к";s:2:"{";s:2:"л";s:2:"|";s:2:"м";s:2:"}";s:2:"н";s:2:"~";s:2:"о";s:2:"";s:2:"п";s:2:"";s:2:"р";s:2:"";s:2:"с";s:2:"";s:2:"т";s:2:"";s:2:"у";s:2:"";s:2:"ф";s:2:"";s:2:"х";s:2:"";s:2:"ц";s:2:"";s:2:"ч";s:2:"";s:2:"ш";s:2:"";s:2:"щ";s:2:"";s:2:"ъ";s:2:"";s:2:"ы";s:2:"";s:2:"ь";s:2:"";s:2:"э";s:2:"";s:2:"ю";s:2:"";s:2:"я";s:2:"";s:2:"ё";s:2:"v";s:3:"‐";s:2:"]";s:3:"―";s:2:"\";s:3:"‘";s:2:"e";s:3:"’";s:2:"f";s:3:"“";s:2:"g";s:3:"”";s:2:"h";s:3:"†";s:2:"";s:3:"‡";s:2:"";s:3:"‥";s:2:"d";s:3:"…";s:2:"c";s:3:"‰";s:2:"";s:3:"′";s:2:"";s:3:"″";s:2:"";s:3:"※";s:2:"";s:3:"℃";s:2:"";s:3:"№";s:2:"";s:3:"℡";s:2:"";s:3:"Å";s:2:"";s:3:"Ⅰ";s:2:"T";s:3:"Ⅱ";s:2:"U";s:3:"Ⅲ";s:2:"V";s:3:"Ⅳ";s:2:"W";s:3:"Ⅴ";s:2:"X";s:3:"Ⅵ";s:2:"Y";s:3:"Ⅶ";s:2:"Z";s:3:"Ⅷ";s:2:"[";s:3:"Ⅸ";s:2:"\";s:3:"Ⅹ";s:2:"]";s:3:"ⅰ";s:2:"@";s:3:"ⅱ";s:2:"A";s:3:"ⅲ";s:2:"B";s:3:"ⅳ";s:2:"C";s:3:"ⅴ";s:2:"D";s:3:"ⅵ";s:2:"E";s:3:"ⅶ";s:2:"F";s:3:"ⅷ";s:2:"G";s:3:"ⅸ";s:2:"H";s:3:"ⅹ";s:2:"I";s:3:"←";s:2:"";s:3:"↑";s:2:"";s:3:"→";s:2:"";s:3:"↓";s:2:"";s:3:"⇒";s:2:"";s:3:"⇔";s:2:"";s:3:"∀";s:2:"";s:3:"∂";s:2:"";s:3:"∃";s:2:"";s:3:"∇";s:2:"";s:3:"∈";s:2:"";s:3:"∋";s:2:"";s:3:"∑";s:2:"";s:3:"√";s:2:"";s:3:"∝";s:2:"";s:3:"∞";s:2:"";s:3:"∟";s:2:"";s:3:"∠";s:2:"";s:3:"∥";s:2:"a";s:3:"∧";s:2:"";s:3:"∨";s:2:"";s:3:"∩";s:2:"";s:3:"∪";s:2:"";s:3:"∫";s:2:"";s:3:"∬";s:2:"";s:3:"∮";s:2:"";s:3:"∴";s:2:"";s:3:"∵";s:2:"";s:3:"∽";s:2:"";s:3:"≒";s:2:"";s:3:"≠";s:2:"";s:3:"≡";s:2:"";s:3:"≦";s:2:"";s:3:"≧";s:2:"";s:3:"≪";s:2:"";s:3:"≫";s:2:"";s:3:"⊂";s:2:"";s:3:"⊃";s:2:"";s:3:"⊆";s:2:"";s:3:"⊇";s:2:"";s:3:"⊥";s:2:"";s:3:"⊿";s:2:"";s:3:"⌒";s:2:"";s:3:"①";s:2:"@";s:3:"②";s:2:"A";s:3:"③";s:2:"B";s:3:"④";s:2:"C";s:3:"⑤";s:2:"D";s:3:"⑥";s:2:"E";s:3:"⑦";s:2:"F";s:3:"⑧";s:2:"G";s:3:"⑨";s:2:"H";s:3:"⑩";s:2:"I";s:3:"⑪";s:2:"J";s:3:"⑫";s:2:"K";s:3:"⑬";s:2:"L";s:3:"⑭";s:2:"M";s:3:"⑮";s:2:"N";s:3:"⑯";s:2:"O";s:3:"⑰";s:2:"P";s:3:"⑱";s:2:"Q";s:3:"⑲";s:2:"R";s:3:"⑳";s:2:"S";s:3:"─";s:2:"";s:3:"━";s:2:"";s:3:"│";s:2:"";s:3:"┃";s:2:"";s:3:"┌";s:2:"";s:3:"┏";s:2:"";s:3:"┐";s:2:"";s:3:"┓";s:2:"";s:3:"└";s:2:"";s:3:"┗";s:2:"";s:3:"┘";s:2:"";s:3:"┛";s:2:"";s:3:"├";s:2:"";s:3:"┝";s:2:"";s:3:"┠";s:2:"";s:3:"┣";s:2:"";s:3:"┤";s:2:"";s:3:"┥";s:2:"";s:3:"┨";s:2:"";s:3:"┫";s:2:"";s:3:"┬";s:2:"";s:3:"┯";s:2:"";s:3:"┰";s:2:"";s:3:"┳";s:2:"";s:3:"┴";s:2:"";s:3:"┷";s:2:"";s:3:"┸";s:2:"";s:3:"┻";s:2:"";s:3:"┼";s:2:"";s:3:"┿";s:2:"";s:3:"╂";s:2:"";s:3:"╋";s:2:"";s:3:"■";s:2:"";s:3:"□";s:2:"";s:3:"▲";s:2:"";s:3:"△";s:2:"";s:3:"▼";s:2:"";s:3:"▽";s:2:"";s:3:"◆";s:2:"";s:3:"◇";s:2:"";s:3:"○";s:2:"";s:3:"◎";s:2:"";s:3:"●";s:2:"";s:3:"◯";s:2:"";s:3:"★";s:2:"";s:3:"☆";s:2:"";s:3:"♀";s:2:"";s:3:"♂";s:2:"";s:3:"♪";s:2:"";s:3:"♭";s:2:"";s:3:"♯";s:2:"";s:3:"　";s:2:"@";s:3:"、";s:2:"A";s:3:"。";s:2:"B";s:3:"〃";s:2:"V";s:3:"々";s:2:"X";s:3:"〆";s:2:"Y";s:3:"〇";s:2:"Z";s:3:"〈";s:2:"q";s:3:"〉";s:2:"r";s:3:"《";s:2:"s";s:3:"》";s:2:"t";s:3:"「";s:2:"u";s:3:"」";s:2:"v";s:3:"『";s:2:"w";s:3:"』";s:2:"x";s:3:"【";s:2:"y";s:3:"】";s:2:"z";s:3:"〒";s:2:"";s:3:"〓";s:2:"";s:3:"〔";s:2:"k";s:3:"〕";s:2:"l";s:3:"〝";s:2:"";s:3:"〟";s:2:"";s:3:"ぁ";s:2:"";s:3:"あ";s:2:"";s:3:"ぃ";s:2:"";s:3:"い";s:2:"";s:3:"ぅ";s:2:"";s:3:"う";s:2:"";s:3:"ぇ";s:2:"";s:3:"え";s:2:"";s:3:"ぉ";s:2:"";s:3:"お";s:2:"";s:3:"か";s:2:"";s:3:"が";s:2:"";s:3:"き";s:2:"";s:3:"ぎ";s:2:"";s:3:"く";s:2:"";s:3:"ぐ";s:2:"";s:3:"け";s:2:"";s:3:"げ";s:2:"";s:3:"こ";s:2:"";s:3:"ご";s:2:"";s:3:"さ";s:2:"";s:3:"ざ";s:2:"";s:3:"し";s:2:"";s:3:"じ";s:2:"";s:3:"す";s:2:"";s:3:"ず";s:2:"";s:3:"せ";s:2:"";s:3:"ぜ";s:2:"";s:3:"そ";s:2:"";s:3:"ぞ";s:2:"";s:3:"た";s:2:"";s:3:"だ";s:2:"";s:3:"ち";s:2:"";s:3:"ぢ";s:2:"";s:3:"っ";s:2:"";s:3:"つ";s:2:"";s:3:"づ";s:2:"";s:3:"て";s:2:"";s:3:"で";s:2:"";s:3:"と";s:2:"";s:3:"ど";s:2:"";s:3:"な";s:2:"";s:3:"に";s:2:"";s:3:"ぬ";s:2:"";s:3:"ね";s:2:"";s:3:"の";s:2:"";s:3:"は";s:2:"";s:3:"ば";s:2:"";s:3:"ぱ";s:2:"";s:3:"ひ";s:2:"";s:3:"び";s:2:"";s:3:"ぴ";s:2:"";s:3:"ふ";s:2:"";s:3:"ぶ";s:2:"";s:3:"ぷ";s:2:"";s:3:"へ";s:2:"";s:3:"べ";s:2:"";s:3:"ぺ";s:2:"";s:3:"ほ";s:2:"";s:3:"ぼ";s:2:"";s:3:"ぽ";s:2:"";s:3:"ま";s:2:"";s:3:"み";s:2:"";s:3:"む";s:2:"";s:3:"め";s:2:"";s:3:"も";s:2:"";s:3:"ゃ";s:2:"";s:3:"や";s:2:"";s:3:"ゅ";s:2:"";s:3:"ゆ";s:2:"";s:3:"ょ";s:2:"";s:3:"よ";s:2:"";s:3:"ら";s:2:"";s:3:"り";s:2:"";s:3:"る";s:2:"";s:3:"れ";s:2:"";s:3:"ろ";s:2:"";s:3:"ゎ";s:2:"";s:3:"わ";s:2:"";s:3:"ゐ";s:2:"";s:3:"ゑ";s:2:"";s:3:"を";s:2:"";s:3:"ん";s:2:"";s:3:"ゔ";s:2:"";s:3:"゛";s:2:"J";s:3:"゜";s:2:"K";s:3:"ゝ";s:2:"T";s:3:"ゞ";s:2:"U";s:3:"ァ";s:2:"@";s:3:"ア";s:2:"A";s:3:"ィ";s:2:"B";s:3:"イ";s:2:"C";s:3:"ゥ";s:2:"D";s:3:"ウ";s:2:"E";s:3:"ェ";s:2:"F";s:3:"エ";s:2:"G";s:3:"ォ";s:2:"H";s:3:"オ";s:2:"I";s:3:"カ";s:2:"J";s:3:"ガ";s:2:"K";s:3:"キ";s:2:"L";s:3:"ギ";s:2:"M";s:3:"ク";s:2:"N";s:3:"グ";s:2:"O";s:3:"ケ";s:2:"P";s:3:"ゲ";s:2:"Q";s:3:"コ";s:2:"R";s:3:"ゴ";s:2:"S";s:3:"サ";s:2:"T";s:3:"ザ";s:2:"U";s:3:"シ";s:2:"V";s:3:"ジ";s:2:"W";s:3:"ス";s:2:"X";s:3:"ズ";s:2:"Y";s:3:"セ";s:2:"Z";s:3:"ゼ";s:2:"[";s:3:"ソ";s:2:"\";s:3:"ゾ";s:2:"]";s:3:"タ";s:2:"^";s:3:"ダ";s:2:"_";s:3:"チ";s:2:"`";s:3:"ヂ";s:2:"a";s:3:"ッ";s:2:"b";s:3:"ツ";s:2:"c";s:3:"ヅ";s:2:"d";s:3:"テ";s:2:"e";s:3:"デ";s:2:"f";s:3:"ト";s:2:"g";s:3:"ド";s:2:"h";s:3:"ナ";s:2:"i";s:3:"ニ";s:2:"j";s:3:"ヌ";s:2:"k";s:3:"ネ";s:2:"l";s:3:"ノ";s:2:"m";s:3:"ハ";s:2:"n";s:3:"バ";s:2:"o";s:3:"パ";s:2:"p";s:3:"ヒ";s:2:"q";s:3:"ビ";s:2:"r";s:3:"ピ";s:2:"s";s:3:"フ";s:2:"t";s:3:"ブ";s:2:"u";s:3:"プ";s:2:"v";s:3:"ヘ";s:2:"w";s:3:"ベ";s:2:"x";s:3:"ペ";s:2:"y";s:3:"ホ";s:2:"z";s:3:"ボ";s:2:"{";s:3:"ポ";s:2:"|";s:3:"マ";s:2:"}";s:3:"ミ";s:2:"~";s:3:"ム";s:2:"";s:3:"メ";s:2:"";s:3:"モ";s:2:"";s:3:"ャ";s:2:"";s:3:"ヤ";s:2:"";s:3:"ュ";s:2:"";s:3:"ユ";s:2:"";s:3:"ョ";s:2:"";s:3:"ヨ";s:2:"";s:3:"ラ";s:2:"";s:3:"リ";s:2:"";s:3:"ル";s:2:"";s:3:"レ";s:2:"";s:3:"ロ";s:2:"";s:3:"ヮ";s:2:"";s:3:"ワ";s:2:"";s:3:"ヰ";s:2:"";s:3:"ヱ";s:2:"";s:3:"ヲ";s:2:"";s:3:"ン";s:2:"";s:3:"ヴ";s:2:"";s:3:"ヵ";s:2:"";s:3:"ヶ";s:2:"";s:3:"・";s:2:"E";s:3:"ー";s:2:"[";s:3:"ヽ";s:2:"R";s:3:"ヾ";s:2:"S";s:3:"㈱";s:2:"";s:3:"㈲";s:2:"";s:3:"㈹";s:2:"";s:3:"㊤";s:2:"";s:3:"㊥";s:2:"";s:3:"㊦";s:2:"";s:3:"㊧";s:2:"";s:3:"㊨";s:2:"";s:3:"㌃";s:2:"e";s:3:"㌍";s:2:"i";s:3:"㌔";s:2:"`";s:3:"㌘";s:2:"c";s:3:"㌢";s:2:"a";s:3:"㌣";s:2:"k";s:3:"㌦";s:2:"j";s:3:"㌧";s:2:"d";s:3:"㌫";s:2:"l";s:3:"㌶";s:2:"f";s:3:"㌻";s:2:"n";s:3:"㍉";s:2:"_";s:3:"㍊";s:2:"m";s:3:"㍍";s:2:"b";s:3:"㍑";s:2:"g";s:3:"㍗";s:2:"h";s:3:"㍻";s:2:"~";s:3:"㍼";s:2:"";s:3:"㍽";s:2:"";s:3:"㍾";s:2:"";s:3:"㎎";s:2:"r";s:3:"㎏";s:2:"s";s:3:"㎜";s:2:"o";s:3:"㎝";s:2:"p";s:3:"㎞";s:2:"q";s:3:"㎡";s:2:"u";s:3:"㏄";s:2:"t";s:3:"㏍";s:2:"";s:3:"一";s:2:"";s:3:"丁";s:2:"";s:3:"七";s:2:"";s:3:"万";s:2:"";s:3:"丈";s:2:"";s:3:"三";s:2:"O";s:3:"上";s:2:"";s:3:"下";s:2:"";s:3:"不";s:2:"s";s:3:"与";s:2:"^";s:3:"丐";s:2:"";s:3:"丑";s:2:"N";s:3:"且";s:2:"";s:3:"丕";s:2:"";s:3:"世";s:2:"";s:3:"丗";s:2:"";s:3:"丘";s:2:"u";s:3:"丙";s:2:"";s:3:"丞";s:2:"";s:3:"両";s:2:"";s:3:"並";s:2:"";s:3:"丨";s:2:"h";s:3:"个";s:2:"";s:3:"中";s:2:"";s:3:"丱";s:2:"";s:3:"串";s:2:"";s:3:"丶";s:2:"";s:3:"丸";s:2:"";s:3:"丹";s:2:"O";s:3:"主";s:2:"";s:3:"丼";s:2:"";s:3:"丿";s:2:"";s:3:"乂";s:2:"";s:3:"乃";s:2:"T";s:3:"久";s:2:"v";s:3:"之";s:2:"V";s:3:"乍";s:2:"";s:3:"乎";s:2:"";s:3:"乏";s:2:"R";s:3:"乕";s:2:"h";s:3:"乖";s:2:"";s:3:"乗";s:2:"";s:3:"乘";s:2:"";s:3:"乙";s:2:"";s:3:"九";s:2:"";s:3:"乞";s:2:"";s:3:"也";s:2:"";s:3:"乢";s:2:"";s:3:"乱";s:2:"";s:3:"乳";s:2:"";s:3:"乾";s:2:"";s:3:"亀";s:2:"T";s:3:"亂";s:2:"";s:3:"亅";s:2:"";s:3:"了";s:2:"";s:3:"予";s:2:"\";s:3:"争";s:2:"";s:3:"亊";s:2:"";s:3:"事";s:2:"";s:3:"二";s:2:"";s:3:"于";s:2:"";s:3:"云";s:2:"]";s:3:"互";s:2:"";s:3:"五";s:2:"";s:3:"井";s:2:"";s:3:"亘";s:2:"j";s:3:"亙";s:2:"i";s:3:"些";s:2:"";s:3:"亜";s:2:"";s:3:"亞";s:2:"";s:3:"亟";s:2:"";s:3:"亠";s:2:"";s:3:"亡";s:2:"S";s:3:"亢";s:2:"";s:3:"交";s:2:"";s:3:"亥";s:2:"";s:3:"亦";s:2:"";s:3:"亨";s:2:"";s:3:"享";s:2:"";s:3:"京";s:2:"";s:3:"亭";s:2:"";s:3:"亮";s:2:"";s:3:"亰";s:2:"";s:3:"亳";s:2:"";s:3:"亶";s:2:"";s:3:"人";s:2:"l";s:3:"什";s:2:"Y";s:3:"仁";s:2:"m";s:3:"仂";s:2:"";s:3:"仄";s:2:"";s:3:"仆";s:2:"";s:3:"仇";s:2:"w";s:3:"今";s:2:"";s:3:"介";s:2:"";s:3:"仍";s:2:"";s:3:"从";s:2:"";s:3:"仏";s:2:"";s:3:"仔";s:2:"e";s:3:"仕";s:2:"d";s:3:"他";s:2:"";s:3:"仗";s:2:"";s:3:"付";s:2:"t";s:3:"仙";s:2:"";s:3:"仝";s:2:"W";s:3:"仞";s:2:"";s:3:"仟";s:2:"";s:3:"仡";s:2:"i";s:3:"代";s:2:"";s:3:"令";s:2:"";s:3:"以";s:2:"";s:3:"仭";s:2:"";s:3:"仮";s:2:"";s:3:"仰";s:2:"";s:3:"仲";s:2:"";s:3:"件";s:2:"";s:3:"价";s:2:"";s:3:"任";s:2:"C";s:3:"仼";s:2:"j";s:3:"伀";s:2:"k";s:3:"企";s:2:"";s:3:"伃";s:2:"l";s:3:"伉";s:2:"";s:3:"伊";s:2:"";s:3:"伍";s:2:"";s:3:"伎";s:2:"";s:3:"伏";s:2:"";s:3:"伐";s:2:"";s:3:"休";s:2:"x";s:3:"会";s:2:"";s:3:"伜";s:2:"";s:3:"伝";s:2:"`";s:3:"伯";s:2:"";s:3:"估";s:2:"";s:3:"伴";s:2:"";s:3:"伶";s:2:"";s:3:"伸";s:2:"L";s:3:"伹";s:2:"m";s:3:"伺";s:2:"f";s:3:"似";s:2:"";s:3:"伽";s:2:"";s:3:"佃";s:2:"";s:3:"但";s:2:"A";s:3:"佇";s:2:"";s:3:"位";s:2:"";s:3:"低";s:2:"";s:3:"住";s:2:"Z";s:3:"佐";s:2:"";s:3:"佑";s:2:"C";s:3:"体";s:2:"";s:3:"何";s:2:"";s:3:"佖";s:2:"n";s:3:"佗";s:2:"";s:3:"余";s:2:"]";s:3:"佚";s:2:"";s:3:"佛";s:2:"";s:3:"作";s:2:"";s:3:"佝";s:2:"";s:3:"佞";s:2:"C";s:3:"佩";s:2:"";s:3:"佯";s:2:"";s:3:"佰";s:2:"";s:3:"佳";s:2:"";s:3:"併";s:2:"";s:3:"佶";s:2:"";s:3:"佻";s:2:"";s:3:"佼";s:2:"";s:3:"使";s:2:"g";s:3:"侃";s:2:"";s:3:"來";s:2:"";s:3:"侈";s:2:"";s:3:"侊";s:2:"p";s:3:"例";s:2:"";s:3:"侍";s:2:"";s:3:"侏";s:2:"";s:3:"侑";s:2:"";s:3:"侒";s:2:"o";s:3:"侔";s:2:"r";s:3:"侖";s:2:"";s:3:"侘";s:2:"";s:3:"侚";s:2:"q";s:3:"供";s:2:"";s:3:"依";s:2:"";s:3:"侠";s:2:"";s:3:"価";s:2:"";s:3:"侫";s:2:"D";s:3:"侭";s:2:"";s:3:"侮";s:2:"";s:3:"侯";s:2:"";s:3:"侵";s:2:"N";s:3:"侶";s:2:"";s:3:"便";s:2:"";s:3:"係";s:2:"W";s:3:"促";s:2:"";s:3:"俄";s:2:"";s:3:"俉";s:2:"a";s:3:"俊";s:2:"r";s:3:"俍";s:2:"s";s:3:"俎";s:2:"";s:3:"俐";s:2:"";s:3:"俑";s:2:"";s:3:"俔";s:2:"";s:3:"俗";s:2:"";s:3:"俘";s:2:"";s:3:"俚";s:2:"";s:3:"俛";s:2:"";s:3:"保";s:2:"";s:3:"俟";s:2:"";s:3:"信";s:2:"M";s:3:"俣";s:2:"";s:3:"俤";s:2:"";s:3:"俥";s:2:"";s:3:"修";s:2:"C";s:3:"俯";s:2:"";s:3:"俳";s:2:"o";s:3:"俵";s:2:"U";s:3:"俶";s:2:"";s:3:"俸";s:2:"";s:3:"俺";s:2:"";s:3:"俾";s:2:"";s:3:"俿";s:2:"v";s:3:"倅";s:2:"";s:3:"倆";s:2:"";s:3:"倉";s:2:"q";s:3:"個";s:2:"";s:3:"倍";s:2:"{";s:3:"倏";s:2:"";s:3:"們";s:2:"";s:3:"倒";s:2:"|";s:3:"倔";s:2:"";s:3:"倖";s:2:"";s:3:"候";s:2:"";s:3:"倚";s:2:"";s:3:"倞";s:2:"w";s:3:"借";s:2:"";s:3:"倡";s:2:"";s:3:"倢";s:2:"u";s:3:"倣";s:2:"";s:3:"値";s:2:"l";s:3:"倥";s:2:"";s:3:"倦";s:2:"";s:3:"倨";s:2:"";s:3:"倩";s:2:"";s:3:"倪";s:2:"";s:3:"倫";s:2:"";s:3:"倬";s:2:"";s:3:"倭";s:2:"`";s:3:"倶";s:2:"";s:3:"倹";s:2:"";s:3:"偀";s:2:"t";s:3:"偂";s:2:"z";s:3:"偃";s:2:"";s:3:"偆";s:2:"x";s:3:"假";s:2:"";s:3:"偈";s:2:"";s:3:"偉";s:2:"";s:3:"偏";s:2:"";s:3:"偐";s:2:"";s:3:"偕";s:2:"";s:3:"偖";s:2:"";s:3:"做";s:2:"";s:3:"停";s:2:"";s:3:"健";s:2:"";s:3:"偬";s:2:"";s:3:"偰";s:2:"y";s:3:"偲";s:2:"";s:3:"側";s:2:"";s:3:"偵";s:2:"";s:3:"偶";s:2:"";s:3:"偸";s:2:"";s:3:"偽";s:2:"U";s:3:"傀";s:2:"";s:3:"傅";s:2:"";s:3:"傍";s:2:"T";s:3:"傑";s:2:"";s:3:"傔";s:2:"{";s:3:"傘";s:2:"P";s:3:"備";s:2:"";s:3:"傚";s:2:"";s:3:"催";s:2:"";s:3:"傭";s:2:"b";s:3:"傲";s:2:"";s:3:"傳";s:2:"B";s:3:"傴";s:2:"";s:3:"債";s:2:"";s:3:"傷";s:2:"";s:3:"傾";s:2:"X";s:3:"僂";s:2:"C";s:3:"僅";s:2:"";s:3:"僉";s:2:"@";s:3:"僊";s:2:"A";s:3:"働";s:2:"";s:3:"像";s:2:"";s:3:"僑";s:2:"";s:3:"僕";s:2:"l";s:3:"僖";s:2:"D";s:3:"僘";s:2:"}";s:3:"僚";s:2:"";s:3:"僞";s:2:"E";s:3:"僣";s:2:"H";s:3:"僥";s:2:"F";s:3:"僧";s:2:"m";s:3:"僭";s:2:"G";s:3:"僮";s:2:"I";s:3:"僴";s:2:"|";s:3:"僵";s:2:"K";s:3:"價";s:2:"J";s:3:"僻";s:2:"";s:3:"儀";s:2:"V";s:3:"儁";s:2:"M";s:3:"儂";s:2:"N";s:3:"億";s:2:"";s:3:"儉";s:2:"L";s:3:"儒";s:2:"";s:3:"儔";s:2:"Q";s:3:"儕";s:2:"P";s:3:"儖";s:2:"O";s:3:"儘";s:2:"";s:3:"儚";s:2:"R";s:3:"償";s:2:"";s:3:"儡";s:2:"S";s:3:"優";s:2:"D";s:3:"儲";s:2:"";s:3:"儷";s:2:"U";s:3:"儺";s:2:"T";s:3:"儻";s:2:"W";s:3:"儼";s:2:"V";s:3:"儿";s:2:"X";s:3:"兀";s:2:"Y";s:3:"允";s:2:"";s:3:"元";s:2:"";s:3:"兄";s:2:"Z";s:3:"充";s:2:"[";s:3:"兆";s:2:"";s:3:"兇";s:2:"";s:3:"先";s:2:"";s:3:"光";s:2:"";s:3:"兊";s:2:"~";s:3:"克";s:2:"";s:3:"兌";s:2:"[";s:3:"免";s:2:"";s:3:"兎";s:2:"e";s:3:"児";s:2:"";s:3:"兒";s:2:"Z";s:3:"兔";s:2:"\";s:3:"党";s:2:"}";s:3:"兜";s:2:"";s:3:"兢";s:2:"]";s:3:"兤";s:2:"";s:3:"入";s:2:"";s:3:"全";s:2:"S";s:3:"兩";s:2:"_";s:3:"兪";s:2:"`";s:3:"八";s:2:"";s:3:"公";s:2:"";s:3:"六";s:2:"Z";s:3:"兮";s:2:"a";s:3:"共";s:2:"";s:3:"兵";s:2:"";s:3:"其";s:2:"";s:3:"具";s:2:"";s:3:"典";s:2:"T";s:3:"兼";s:2:"";s:3:"冀";s:2:"b";s:3:"冂";s:2:"c";s:3:"内";s:2:"";s:3:"円";s:2:"~";s:3:"冉";s:2:"f";s:3:"冊";s:2:"";s:3:"册";s:2:"e";s:3:"再";s:2:"";s:3:"冏";s:2:"g";s:3:"冐";s:2:"";s:3:"冑";s:2:"h";s:3:"冒";s:2:"`";s:3:"冓";s:2:"i";s:3:"冕";s:2:"j";s:3:"冖";s:2:"k";s:3:"冗";s:2:"";s:3:"写";s:2:"";s:3:"冝";s:2:"";s:3:"冠";s:2:"";s:3:"冢";s:2:"n";s:3:"冤";s:2:"l";s:3:"冥";s:2:"";s:3:"冦";s:2:"m";s:3:"冨";s:2:"y";s:3:"冩";s:2:"o";s:3:"冪";s:2:"p";s:3:"冫";s:2:"q";s:3:"冬";s:2:"~";s:3:"冰";s:2:"u";s:3:"冱";s:2:"s";s:3:"冲";s:2:"t";s:3:"决";s:2:"r";s:3:"冴";s:2:"";s:3:"况";s:2:"v";s:3:"冶";s:2:"";s:3:"冷";s:2:"";s:3:"冽";s:2:"w";s:3:"冾";s:2:"";s:3:"凄";s:2:"";s:3:"凅";s:2:"x";s:3:"准";s:2:"y";s:3:"凉";s:2:"y";s:3:"凋";s:2:"";s:3:"凌";s:2:"";s:3:"凍";s:2:"";s:3:"凖";s:2:"";s:3:"凛";s:2:"z";s:3:"凜";s:2:"";s:3:"凝";s:2:"";s:3:"几";s:2:"{";s:3:"凡";s:2:"}";s:3:"処";s:2:"";s:3:"凧";s:2:"";s:3:"凩";s:2:"}";s:3:"凪";s:2:"";s:3:"凬";s:2:"";s:3:"凭";s:2:"~";s:3:"凰";s:2:"";s:3:"凱";s:2:"M";s:3:"凵";s:2:"";s:3:"凶";s:2:"";s:3:"凸";s:2:"";s:3:"凹";s:2:"";s:3:"出";s:2:"o";s:3:"函";s:2:"";s:3:"凾";s:2:"";s:3:"刀";s:2:"";s:3:"刃";s:2:"n";s:3:"刄";s:2:"";s:3:"分";s:2:"";s:3:"切";s:2:"";s:3:"刈";s:2:"";s:3:"刊";s:2:"";s:3:"刋";s:2:"";s:3:"刎";s:2:"";s:3:"刑";s:2:"Y";s:3:"刔";s:2:"";s:3:"刕";s:2:"";s:3:"列";s:2:"";s:3:"初";s:2:"";s:3:"判";s:2:"";s:3:"別";s:2:"";s:3:"刧";s:2:"";s:3:"利";s:2:"";s:3:"刪";s:2:"";s:3:"刮";s:2:"";s:3:"到";s:2:"";s:3:"刳";s:2:"";s:3:"制";s:2:"";s:3:"刷";s:2:"";s:3:"券";s:2:"";s:3:"刹";s:2:"";s:3:"刺";s:2:"h";s:3:"刻";s:2:"";s:3:"剃";s:2:"";s:3:"剄";s:2:"";s:3:"則";s:2:"";s:3:"削";s:2:"";s:3:"剋";s:2:"";s:3:"剌";s:2:"";s:3:"前";s:2:"O";s:3:"剏";s:2:"";s:3:"剔";s:2:"";s:3:"剖";s:2:"U";s:3:"剛";s:2:"";s:3:"剞";s:2:"";s:3:"剣";s:2:"";s:3:"剤";s:2:"";s:3:"剥";s:2:"";s:3:"剩";s:2:"";s:3:"剪";s:2:"";s:3:"副";s:2:"";s:3:"剰";s:2:"";s:3:"剱";s:2:"";s:3:"割";s:2:"";s:3:"剳";s:2:"";s:3:"剴";s:2:"";s:3:"創";s:2:"n";s:3:"剽";s:2:"";s:3:"剿";s:2:"";s:3:"劃";s:2:"c";s:3:"劇";s:2:"";s:3:"劈";s:2:"";s:3:"劉";s:2:"";s:3:"劍";s:2:"";s:3:"劑";s:2:"";s:3:"劒";s:2:"";s:3:"劔";s:2:"";s:3:"力";s:2:"";s:3:"劜";s:2:"";s:3:"功";s:2:"";s:3:"加";s:2:"";s:3:"劣";s:2:"";s:3:"劦";s:2:"";s:3:"助";s:2:"";s:3:"努";s:2:"w";s:3:"劫";s:2:"";s:3:"劬";s:2:"";s:3:"劭";s:2:"";s:3:"劯";s:2:"w";s:3:"励";s:2:"";s:3:"労";s:2:"J";s:3:"劵";s:2:"";s:3:"効";s:2:"";s:3:"劼";s:2:"";s:3:"劾";s:2:"N";s:3:"勀";s:2:"";s:3:"勁";s:2:"";s:3:"勃";s:2:"u";s:3:"勅";s:2:"";s:3:"勇";s:2:"E";s:3:"勉";s:2:"";s:3:"勍";s:2:"";s:3:"勒";s:2:"";s:3:"動";s:2:"";s:3:"勗";s:2:"";s:3:"勘";s:2:"";s:3:"務";s:2:"";s:3:"勛";s:2:"";s:3:"勝";s:2:"";s:3:"勞";s:2:"";s:3:"募";s:2:"";s:3:"勠";s:2:"";s:3:"勢";s:2:"";s:3:"勣";s:2:"";s:3:"勤";s:2:"";s:3:"勦";s:2:"";s:3:"勧";s:2:"";s:3:"勲";s:2:"M";s:3:"勳";s:2:"";s:3:"勵";s:2:"";s:3:"勸";s:2:"";s:3:"勹";s:2:"";s:3:"勺";s:2:"";s:3:"勾";s:2:"";s:3:"勿";s:2:"";s:3:"匀";s:2:"";s:3:"匁";s:2:"";s:3:"匂";s:2:"";s:3:"包";s:2:"";s:3:"匆";s:2:"";s:3:"匇";s:2:"";s:3:"匈";s:2:"";s:3:"匍";s:2:"";s:3:"匏";s:2:"";s:3:"匐";s:2:"";s:3:"匕";s:2:"";s:3:"化";s:2:"";s:3:"北";s:2:"k";s:3:"匙";s:2:"";s:3:"匚";s:2:"";s:3:"匝";s:2:"x";s:3:"匠";s:2:"";s:3:"匡";s:2:"";s:3:"匣";s:2:"";s:3:"匤";s:2:"";s:3:"匪";s:2:"";s:3:"匯";s:2:"";s:3:"匱";s:2:"";s:3:"匳";s:2:"";s:3:"匸";s:2:"";s:3:"匹";s:2:"C";s:3:"区";s:2:"";s:3:"医";s:2:"";s:3:"匿";s:2:"";s:3:"區";s:2:"";s:3:"十";s:2:"\";s:3:"千";s:2:"";s:3:"卅";s:2:"";s:3:"卆";s:2:"";s:3:"升";s:2:"";s:3:"午";s:2:"";s:3:"卉";s:2:"";s:3:"半";s:2:"";s:3:"卍";s:2:"";s:3:"卑";s:2:"";s:3:"卒";s:2:"";s:3:"卓";s:2:"";s:3:"協";s:2:"";s:3:"南";s:2:"";s:3:"単";s:2:"P";s:3:"博";s:2:"";s:3:"卜";s:2:"m";s:3:"卞";s:2:"";s:3:"占";s:2:"";s:3:"卦";s:2:"T";s:3:"卩";s:2:"";s:3:"卮";s:2:"";s:3:"卯";s:2:"K";s:3:"印";s:2:"";s:3:"危";s:2:"";s:3:"卲";s:2:"";s:3:"即";s:2:"";s:3:"却";s:2:"p";s:3:"卵";s:2:"";s:3:"卷";s:2:"";s:3:"卸";s:2:"";s:3:"卻";s:2:"";s:3:"卿";s:2:"";s:3:"厂";s:2:"";s:3:"厄";s:2:"";s:3:"厓";s:2:"";s:3:"厖";s:2:"";s:3:"厘";s:2:"";s:3:"厚";s:2:"";s:3:"原";s:2:"";s:3:"厠";s:2:"";s:3:"厥";s:2:"";s:3:"厦";s:2:"";s:3:"厨";s:2:"~";s:3:"厩";s:2:"X";s:3:"厭";s:2:"}";s:3:"厮";s:2:"";s:3:"厰";s:2:"";s:3:"厲";s:2:"";s:3:"厳";s:2:"";s:3:"厶";s:2:"";s:3:"去";s:2:"";s:3:"参";s:2:"Q";s:3:"參";s:2:"";s:3:"又";s:2:"";s:3:"叉";s:2:"";s:3:"及";s:2:"y";s:3:"友";s:2:"F";s:3:"双";s:2:"o";s:3:"反";s:2:"";s:3:"収";s:2:"";s:3:"叔";s:2:"f";s:3:"取";s:2:"";s:3:"受";s:2:"";s:3:"叙";s:2:"";s:3:"叛";s:2:"";s:3:"叝";s:2:"";s:3:"叟";s:2:"";s:3:"叡";s:2:"b";s:3:"叢";s:2:"p";s:3:"口";s:2:"";s:3:"古";s:2:"";s:3:"句";s:2:"";s:3:"叨";s:2:"";s:3:"叩";s:2:"@";s:3:"只";s:2:"";s:3:"叫";s:2:"";s:3:"召";s:2:"";s:3:"叭";s:2:"";s:3:"叮";s:2:"";s:3:"可";s:2:"";s:3:"台";s:2:"";s:3:"叱";s:2:"";s:3:"史";s:2:"j";s:3:"右";s:2:"E";s:3:"叶";s:2:"";s:3:"号";s:2:"";s:3:"司";s:2:"i";s:3:"叺";s:2:"";s:3:"吁";s:2:"";s:3:"吃";s:2:"h";s:3:"各";s:2:"e";s:3:"合";s:2:"";s:3:"吉";s:2:"g";s:3:"吊";s:2:"";s:3:"吋";s:2:"D";s:3:"同";s:2:"";s:3:"名";s:2:"";s:3:"后";s:2:"@";s:3:"吏";s:2:"";s:3:"吐";s:2:"f";s:3:"向";s:2:"";s:3:"君";s:2:"N";s:3:"吝";s:2:"";s:3:"吟";s:2:"";s:3:"吠";s:2:"i";s:3:"否";s:2:"";s:3:"吩";s:2:"";s:3:"含";s:2:"";s:3:"听";s:2:"";s:3:"吭";s:2:"";s:3:"吮";s:2:"";s:3:"吶";s:2:"";s:3:"吸";s:2:"z";s:3:"吹";s:2:"";s:3:"吻";s:2:"";s:3:"吼";s:2:"";s:3:"吽";s:2:"";s:3:"吾";s:2:"";s:3:"呀";s:2:"";s:3:"呂";s:2:"C";s:3:"呆";s:2:"";s:3:"呈";s:2:"";s:3:"呉";s:2:"";s:3:"告";s:2:"";s:3:"呎";s:2:"";s:3:"呑";s:2:"";s:3:"呟";s:2:"";s:3:"周";s:2:"";s:3:"呪";s:2:"";s:3:"呰";s:2:"";s:3:"呱";s:2:"";s:3:"味";s:2:"";s:3:"呵";s:2:"";s:3:"呶";s:2:"";s:3:"呷";s:2:"";s:3:"呻";s:2:"";s:3:"呼";s:2:"";s:3:"命";s:2:"";s:3:"咀";s:2:"";s:3:"咄";s:2:"";s:3:"咆";s:2:"";s:3:"咊";s:2:"";s:3:"咋";s:2:"";s:3:"和";s:2:"a";s:3:"咎";s:2:"";s:3:"咏";s:2:"";s:3:"咐";s:2:"";s:3:"咒";s:2:"";s:3:"咜";s:2:"";s:3:"咢";s:2:"";s:3:"咤";s:2:"B";s:3:"咥";s:2:"";s:3:"咨";s:2:"";s:3:"咩";s:2:"";s:3:"咫";s:2:"@";s:3:"咬";s:2:"";s:3:"咯";s:2:"]";s:3:"咲";s:2:"";s:3:"咳";s:2:"P";s:3:"咸";s:2:"";s:3:"咼";s:2:"D";s:3:"咽";s:2:"";s:3:"咾";s:2:"C";s:3:"哀";s:2:"";s:3:"品";s:2:"i";s:3:"哂";s:2:"A";s:3:"哄";s:2:"";s:3:"哇";s:2:"";s:3:"哈";s:2:"";s:3:"哉";s:2:"";s:3:"哘";s:2:"E";s:3:"員";s:2:"";s:3:"哢";s:2:"N";s:3:"哥";s:2:"F";s:3:"哦";s:2:"G";s:3:"哨";s:2:"";s:3:"哩";s:2:"";s:3:"哭";s:2:"L";s:3:"哮";s:2:"K";s:3:"哲";s:2:"N";s:3:"哺";s:2:"M";s:3:"哽";s:2:"J";s:3:"哿";s:2:"";s:3:"唄";s:2:"S";s:3:"唆";s:2:"";s:3:"唇";s:2:"O";s:3:"唏";s:2:"H";s:3:"唐";s:2:"";s:3:"唔";s:2:"I";s:3:"唖";s:2:"";s:3:"售";s:2:"S";s:3:"唯";s:2:"B";s:3:"唱";s:2:"";s:3:"唳";s:2:"Y";s:3:"唸";s:2:"X";s:3:"唹";s:2:"O";s:3:"唾";s:2:"";s:3:"啀";s:2:"P";s:3:"啄";s:2:"";s:3:"啅";s:2:"U";s:3:"商";s:2:"";s:3:"啌";s:2:"R";s:3:"問";s:2:"";s:3:"啓";s:2:"[";s:3:"啖";s:2:"V";s:3:"啗";s:2:"W";s:3:"啜";s:2:"T";s:3:"啝";s:2:"Z";s:3:"啣";s:2:"Q";s:3:"啻";s:2:"`";s:3:"啼";s:2:"e";s:3:"啾";s:2:"a";s:3:"喀";s:2:"\";s:3:"喃";s:2:"f";s:3:"善";s:2:"P";s:3:"喆";s:2:"";s:3:"喇";s:2:"h";s:3:"喉";s:2:"A";s:3:"喊";s:2:"^";s:3:"喋";s:2:"";s:3:"喘";s:2:"b";s:3:"喙";s:2:"[";s:3:"喚";s:2:"";s:3:"喜";s:2:"";s:3:"喝";s:2:"";s:3:"喞";s:2:"c";s:3:"喟";s:2:"_";s:3:"喧";s:2:"";s:3:"喨";s:2:"i";s:3:"喩";s:2:"g";s:3:"喪";s:2:"r";s:3:"喫";s:2:"i";s:3:"喬";s:2:"";s:3:"單";s:2:"d";s:3:"喰";s:2:"";s:3:"営";s:2:"c";s:3:"嗄";s:2:"m";s:3:"嗅";s:2:"k";s:3:"嗇";s:2:"";s:3:"嗔";s:2:"p";s:3:"嗚";s:2:"j";s:3:"嗜";s:2:"n";s:3:"嗟";s:2:"l";s:3:"嗣";s:2:"k";s:3:"嗤";s:2:"o";s:3:"嗷";s:2:"r";s:3:"嗹";s:2:"w";s:3:"嗽";s:2:"u";s:3:"嗾";s:2:"t";s:3:"嘆";s:2:"Q";s:3:"嘉";s:2:"";s:3:"嘔";s:2:"q";s:3:"嘖";s:2:"s";s:3:"嘗";s:2:"";s:3:"嘘";s:2:"R";s:3:"嘛";s:2:"v";s:3:"嘩";s:2:"";s:3:"嘯";s:2:"";s:3:"嘱";s:2:"";s:3:"嘲";s:2:"}";s:3:"嘴";s:2:"{";s:3:"嘶";s:2:"|";s:3:"嘸";s:2:"~";s:3:"噂";s:2:"\";s:3:"噌";s:2:"X";s:3:"噎";s:2:"x";s:3:"噐";s:2:"y";s:3:"噛";s:2:"";s:3:"噤";s:2:"";s:3:"器";s:2:"";s:3:"噪";s:2:"";s:3:"噫";s:2:"";s:3:"噬";s:2:"";s:3:"噴";s:2:"";s:3:"噸";s:2:"";s:3:"噺";s:2:"";s:3:"嚀";s:2:"";s:3:"嚆";s:2:"";s:3:"嚇";s:2:"d";s:3:"嚊";s:2:"";s:3:"嚏";s:2:"";s:3:"嚔";s:2:"";s:3:"嚠";s:2:"";s:3:"嚢";s:2:"X";s:3:"嚥";s:2:"";s:3:"嚮";s:2:"";s:3:"嚴";s:2:"";s:3:"嚶";s:2:"";s:3:"嚼";s:2:"";s:3:"囀";s:2:"";s:3:"囁";s:2:"";s:3:"囂";s:2:"";s:3:"囃";s:2:"";s:3:"囈";s:2:"";s:3:"囎";s:2:"";s:3:"囑";s:2:"";s:3:"囓";s:2:"";s:3:"囗";s:2:"";s:3:"囘";s:2:"d";s:3:"囚";s:2:"";s:3:"四";s:2:"l";s:3:"回";s:2:"";s:3:"因";s:2:"";s:3:"団";s:2:"c";s:3:"囮";s:2:"";s:3:"困";s:2:"";s:3:"囲";s:2:"";s:3:"図";s:2:"}";s:3:"囹";s:2:"";s:3:"固";s:2:"";s:3:"国";s:2:"";s:3:"囿";s:2:"";s:3:"圀";s:2:"";s:3:"圃";s:2:"";s:3:"圄";s:2:"";s:3:"圈";s:2:"";s:3:"圉";s:2:"";s:3:"國";s:2:"";s:3:"圍";s:2:"";s:3:"圏";s:2:"";s:3:"園";s:2:"";s:3:"圓";s:2:"";s:3:"圖";s:2:"";s:3:"團";s:2:"";s:3:"圜";s:2:"";s:3:"土";s:2:"y";s:3:"圦";s:2:"";s:3:"圧";s:2:"";s:3:"在";s:2:"";s:3:"圭";s:2:"\";s:3:"地";s:2:"n";s:3:"圷";s:2:"";s:3:"圸";s:2:"";s:3:"圻";s:2:"";s:3:"址";s:2:"";s:3:"坂";s:2:"";s:3:"均";s:2:"";s:3:"坊";s:2:"V";s:3:"坎";s:2:"";s:3:"坏";s:2:"";s:3:"坐";s:2:"";s:3:"坑";s:2:"B";s:3:"坙";s:2:"";s:3:"坡";s:2:"";s:3:"坤";s:2:"";s:3:"坥";s:2:"";s:3:"坦";s:2:"R";s:3:"坩";s:2:"";s:3:"坪";s:2:"";s:3:"坿";s:2:"";s:3:"垂";s:2:"";s:3:"垈";s:2:"";s:3:"垉";s:2:"";s:3:"型";s:2:"^";s:3:"垓";s:2:"";s:3:"垠";s:2:"";s:3:"垢";s:2:"C";s:3:"垣";s:2:"_";s:3:"垤";s:2:"";s:3:"垪";s:2:"";s:3:"垬";s:2:"";s:3:"垰";s:2:"";s:3:"垳";s:2:"";s:3:"埀";s:2:"";s:3:"埃";s:2:"";s:3:"埆";s:2:"";s:3:"埇";s:2:"";s:3:"埈";s:2:"";s:3:"埋";s:2:"";s:3:"城";s:2:"";s:3:"埒";s:2:"";s:3:"埓";s:2:"";s:3:"埔";s:2:"";s:3:"埖";s:2:"";s:3:"埜";s:2:"W";s:3:"域";s:2:"";s:3:"埠";s:2:"u";s:3:"埣";s:2:"";s:3:"埴";s:2:"";s:3:"執";s:2:"";s:3:"培";s:2:"|";s:3:"基";s:2:"";s:3:"埼";s:2:"";s:3:"堀";s:2:"x";s:3:"堂";s:2:"";s:3:"堅";s:2:"";s:3:"堆";s:2:"";s:3:"堊";s:2:"";s:3:"堋";s:2:"";s:3:"堕";s:2:"";s:3:"堙";s:2:"";s:3:"堝";s:2:"";s:3:"堡";s:2:"";s:3:"堤";s:2:"";s:3:"堪";s:2:"";s:3:"堯";s:2:"";s:3:"堰";s:2:"";s:3:"報";s:2:"";s:3:"場";s:2:"";s:3:"堵";s:2:"g";s:3:"堺";s:2:"";s:3:"堽";s:2:"";s:3:"塀";s:2:"";s:3:"塁";s:2:"";s:3:"塊";s:2:"";s:3:"塋";s:2:"";s:3:"塑";s:2:"Y";s:3:"塒";s:2:"";s:3:"塔";s:2:"";s:3:"塗";s:2:"h";s:3:"塘";s:2:"";s:3:"塙";s:2:"";s:3:"塚";s:2:"";s:3:"塞";s:2:"";s:3:"塢";s:2:"";s:3:"塩";s:2:"";s:3:"填";s:2:"U";s:3:"塰";s:2:"";s:3:"塲";s:2:"";s:3:"塵";s:2:"o";s:3:"塹";s:2:"";s:3:"塾";s:2:"m";s:3:"境";s:2:"";s:3:"墅";s:2:"";s:3:"墓";s:2:"";s:3:"増";s:2:"";s:3:"墜";s:2:"";s:3:"增";s:2:"";s:3:"墟";s:2:"";s:3:"墨";s:2:"n";s:3:"墫";s:2:"";s:3:"墮";s:2:"";s:3:"墲";s:2:"";s:3:"墳";s:2:"";s:3:"墸";s:2:"";s:3:"墹";s:2:"";s:3:"墺";s:2:"";s:3:"墻";s:2:"";s:3:"墾";s:2:"";s:3:"壁";s:2:"";s:3:"壅";s:2:"";s:3:"壇";s:2:"d";s:3:"壊";s:2:"";s:3:"壌";s:2:"";s:3:"壑";s:2:"";s:3:"壓";s:2:"";s:3:"壕";s:2:"";s:3:"壗";s:2:"";s:3:"壘";s:2:"";s:3:"壙";s:2:"";s:3:"壜";s:2:"";s:3:"壞";s:2:"";s:3:"壟";s:2:"";s:3:"壤";s:2:"";s:3:"壥";s:2:"";s:3:"士";s:2:"m";s:3:"壬";s:2:"p";s:3:"壮";s:2:"s";s:3:"壯";s:2:"";s:3:"声";s:2:"";s:3:"壱";s:2:"";s:3:"売";s:2:"";s:3:"壷";s:2:"";s:3:"壹";s:2:"";s:3:"壺";s:2:"";s:3:"壻";s:2:"";s:3:"壼";s:2:"";s:3:"壽";s:2:"";s:3:"夂";s:2:"";s:3:"変";s:2:"";s:3:"夊";s:2:"";s:3:"夋";s:2:"";s:3:"夏";s:2:"";s:3:"夐";s:2:"";s:3:"夕";s:2:"[";s:3:"外";s:2:"O";s:3:"夘";s:2:"";s:3:"夙";s:2:"g";s:3:"多";s:2:"";s:3:"夛";s:2:"";s:3:"夜";s:2:"";s:3:"夢";s:2:"";s:3:"夥";s:2:"";s:3:"大";s:2:"";s:3:"天";s:2:"V";s:3:"太";s:2:"";s:3:"夫";s:2:"v";s:3:"夬";s:2:"";s:3:"夭";s:2:"";s:3:"央";s:2:"";s:3:"失";s:2:"";s:3:"夲";s:2:"";s:3:"夷";s:2:"";s:3:"夸";s:2:"";s:3:"夾";s:2:"";s:3:"奄";s:2:"";s:3:"奇";s:2:"";s:3:"奈";s:2:"";s:3:"奉";s:2:"";s:3:"奎";s:2:"";s:3:"奏";s:2:"t";s:3:"奐";s:2:"";s:3:"契";s:2:"_";s:3:"奓";s:2:"";s:3:"奔";s:2:"z";s:3:"奕";s:2:"";s:3:"套";s:2:"";s:3:"奘";s:2:"";s:3:"奚";s:2:"";s:3:"奛";s:2:"";s:3:"奝";s:2:"";s:3:"奠";s:2:"";s:3:"奢";s:2:"";s:3:"奣";s:2:"";s:3:"奥";s:2:"";s:3:"奧";s:2:"";s:3:"奨";s:2:"";s:3:"奩";s:2:"";s:3:"奪";s:2:"D";s:3:"奬";s:2:"";s:3:"奮";s:2:"";s:3:"女";s:2:"";s:3:"奴";s:2:"z";s:3:"奸";s:2:"@";s:3:"好";s:2:"D";s:3:"妁";s:2:"A";s:3:"如";s:2:"@";s:3:"妃";s:2:"";s:3:"妄";s:2:"";s:3:"妊";s:2:"D";s:3:"妍";s:2:"J";s:3:"妓";s:2:"W";s:3:"妖";s:2:"d";s:3:"妙";s:2:"";s:3:"妛";s:2:"";s:3:"妝";s:2:"B";s:3:"妣";s:2:"E";s:3:"妤";s:2:"";s:3:"妥";s:2:"";s:3:"妨";s:2:"W";s:3:"妬";s:2:"i";s:3:"妲";s:2:"F";s:3:"妹";s:2:"";s:3:"妺";s:2:"";s:3:"妻";s:2:"";s:3:"妾";s:2:"";s:3:"姆";s:2:"G";s:3:"姉";s:2:"o";s:3:"始";s:2:"n";s:3:"姐";s:2:"";s:3:"姑";s:2:"";s:3:"姓";s:2:"";s:3:"委";s:2:"";s:3:"姙";s:2:"K";s:3:"姚";s:2:"L";s:3:"姜";s:2:"I";s:3:"姥";s:2:"W";s:3:"姦";s:2:"";s:3:"姨";s:2:"H";s:3:"姪";s:2:"";s:3:"姫";s:2:"P";s:3:"姶";s:2:"";s:3:"姻";s:2:"";s:3:"姿";s:2:"p";s:3:"威";s:2:"";s:3:"娃";s:2:"";s:3:"娉";s:2:"Q";s:3:"娑";s:2:"O";s:3:"娘";s:2:"";s:3:"娚";s:2:"R";s:3:"娜";s:2:"P";s:3:"娟";s:2:"N";s:3:"娠";s:2:"P";s:3:"娥";s:2:"M";s:3:"娩";s:2:"";s:3:"娯";s:2:"";s:3:"娵";s:2:"V";s:3:"娶";s:2:"W";s:3:"娼";s:2:"";s:3:"婀";s:2:"S";s:3:"婁";s:2:"K";s:3:"婆";s:2:"k";s:3:"婉";s:2:"U";s:3:"婚";s:2:"";s:3:"婢";s:2:"X";s:3:"婦";s:2:"w";s:3:"婪";s:2:"Y";s:3:"婬";s:2:"T";s:3:"婿";s:2:"";s:3:"媒";s:2:"}";s:3:"媚";s:2:"Z";s:3:"媛";s:2:"Q";s:3:"媼";s:2:"[";s:3:"媽";s:2:"_";s:3:"媾";s:2:"\";s:3:"嫁";s:2:"";s:3:"嫂";s:2:"^";s:3:"嫉";s:2:"";s:3:"嫋";s:2:"]";s:3:"嫌";s:2:"";s:3:"嫐";s:2:"k";s:3:"嫖";s:2:"d";s:3:"嫗";s:2:"a";s:3:"嫡";s:2:"";s:3:"嫣";s:2:"`";s:3:"嫦";s:2:"b";s:3:"嫩";s:2:"c";s:3:"嫺";s:2:"e";s:3:"嫻";s:2:"f";s:3:"嬉";s:2:"";s:3:"嬋";s:2:"h";s:3:"嬌";s:2:"g";s:3:"嬖";s:2:"i";s:3:"嬢";s:2:"";s:3:"嬪";s:2:"l";s:3:"嬬";s:2:"";s:3:"嬰";s:2:"d";s:3:"嬲";s:2:"j";s:3:"嬶";s:2:"m";s:3:"嬾";s:2:"n";s:3:"孀";s:2:"q";s:3:"孃";s:2:"o";s:3:"孅";s:2:"p";s:3:"子";s:2:"q";s:3:"孑";s:2:"r";s:3:"孔";s:2:"E";s:3:"孕";s:2:"s";s:3:"孖";s:2:"";s:3:"字";s:2:"";s:3:"存";s:2:"";s:3:"孚";s:2:"t";s:3:"孛";s:2:"u";s:3:"孜";s:2:"y";s:3:"孝";s:2:"F";s:3:"孟";s:2:"";s:3:"季";s:2:"G";s:3:"孤";s:2:"";s:3:"孥";s:2:"v";s:3:"学";s:2:"w";s:3:"孩";s:2:"w";s:3:"孫";s:2:"";s:3:"孰";s:2:"x";s:3:"孱";s:2:"";s:3:"孳";s:2:"y";s:3:"孵";s:2:"z";s:3:"學";s:2:"{";s:3:"孺";s:2:"}";s:3:"宀";s:2:"~";s:3:"它";s:2:"";s:3:"宅";s:2:"";s:3:"宇";s:2:"F";s:3:"守";s:2:"";s:3:"安";s:2:"";s:3:"宋";s:2:"v";s:3:"完";s:2:"";s:3:"宍";s:2:"";s:3:"宏";s:2:"G";s:3:"宕";s:2:"";s:3:"宗";s:2:"@";s:3:"官";s:2:"";s:3:"宙";s:2:"";s:3:"定";s:2:"";s:3:"宛";s:2:"";s:3:"宜";s:2:"X";s:3:"宝";s:2:"";s:3:"実";s:2:"";s:3:"客";s:2:"q";s:3:"宣";s:2:"";s:3:"室";s:2:"";s:3:"宥";s:2:"G";s:3:"宦";s:2:"";s:3:"宮";s:2:"{";s:3:"宰";s:2:"";s:3:"害";s:2:"Q";s:3:"宴";s:2:"";s:3:"宵";s:2:"";s:3:"家";s:2:"";s:3:"宸";s:2:"";s:3:"容";s:2:"e";s:3:"宿";s:2:"h";s:3:"寀";s:2:"";s:3:"寂";s:2:"";s:3:"寃";s:2:"";s:3:"寄";s:2:"";s:3:"寅";s:2:"";s:3:"密";s:2:"";s:3:"寇";s:2:"";s:3:"寉";s:2:"";s:3:"富";s:2:"x";s:3:"寐";s:2:"";s:3:"寒";s:2:"";s:3:"寓";s:2:"";s:3:"寔";s:2:"";s:3:"寘";s:2:"";s:3:"寛";s:2:"";s:3:"寝";s:2:"Q";s:3:"寞";s:2:"";s:3:"察";s:2:"@";s:3:"寡";s:2:"";s:3:"寢";s:2:"";s:3:"寤";s:2:"";s:3:"寥";s:2:"";s:3:"實";s:2:"";s:3:"寧";s:2:"J";s:3:"寨";s:2:"";s:3:"審";s:2:"R";s:3:"寫";s:2:"";s:3:"寬";s:2:"";s:3:"寮";s:2:"";s:3:"寰";s:2:"";s:3:"寳";s:2:"";s:3:"寵";s:2:"";s:3:"寶";s:2:"";s:3:"寸";s:2:"";s:3:"寺";s:2:"";s:3:"対";s:2:"";s:3:"寿";s:2:"";s:3:"封";s:2:"";s:3:"専";s:2:"";s:3:"射";s:2:"";s:3:"尅";s:2:"";s:3:"将";s:2:"";s:3:"將";s:2:"";s:3:"專";s:2:"";s:3:"尉";s:2:"";s:3:"尊";s:2:"";s:3:"尋";s:2:"q";s:3:"對";s:2:"";s:3:"導";s:2:"";s:3:"小";s:2:"";s:3:"少";s:2:"";s:3:"尓";s:2:"";s:3:"尖";s:2:"";s:3:"尚";s:2:"";s:3:"尞";s:2:"";s:3:"尠";s:2:"";s:3:"尢";s:2:"";s:3:"尤";s:2:"";s:3:"尨";s:2:"";s:3:"尭";s:2:"";s:3:"就";s:2:"A";s:3:"尸";s:2:"";s:3:"尹";s:2:"";s:3:"尺";s:2:"";s:3:"尻";s:2:"K";s:3:"尼";s:2:"";s:3:"尽";s:2:"s";s:3:"尾";s:2:"";s:3:"尿";s:2:"A";s:3:"局";s:2:"";s:3:"屁";s:2:"";s:3:"居";s:2:"";s:3:"屆";s:2:"";s:3:"屈";s:2:"";s:3:"届";s:2:"";s:3:"屋";s:2:"";s:3:"屍";s:2:"r";s:3:"屎";s:2:"";s:3:"屏";s:2:"";s:3:"屐";s:2:"";s:3:"屑";s:2:"";s:3:"屓";s:2:"";s:3:"展";s:2:"W";s:3:"属";s:2:"";s:3:"屠";s:2:"j";s:3:"屡";s:2:"";s:3:"層";s:2:"w";s:3:"履";s:2:"";s:3:"屬";s:2:"";s:3:"屮";s:2:"";s:3:"屯";s:2:"";s:3:"山";s:2:"R";s:3:"屶";s:2:"";s:3:"屹";s:2:"";s:3:"岌";s:2:"";s:3:"岐";s:2:"";s:3:"岑";s:2:"";s:3:"岔";s:2:"";s:3:"岡";s:2:"";s:3:"岦";s:2:"";s:3:"岨";s:2:"Z";s:3:"岩";s:2:"";s:3:"岫";s:2:"";s:3:"岬";s:2:"";s:3:"岱";s:2:"";s:3:"岳";s:2:"x";s:3:"岶";s:2:"";s:3:"岷";s:2:"";s:3:"岸";s:2:"";s:3:"岺";s:2:"";s:3:"岻";s:2:"";s:3:"岼";s:2:"";s:3:"岾";s:2:"";s:3:"峅";s:2:"";s:3:"峇";s:2:"";s:3:"峙";s:2:"";s:3:"峠";s:2:"";s:3:"峡";s:2:"";s:3:"峨";s:2:"";s:3:"峩";s:2:"";s:3:"峪";s:2:"";s:3:"峭";s:2:"";s:3:"峯";s:2:"";s:3:"峰";s:2:"";s:3:"峵";s:2:"";s:3:"島";s:2:"";s:3:"峺";s:2:"";s:3:"峻";s:2:"s";s:3:"峽";s:2:"";s:3:"崇";s:2:"";s:3:"崋";s:2:"";s:3:"崎";s:2:"";s:3:"崑";s:2:"";s:3:"崔";s:2:"";s:3:"崕";s:2:"";s:3:"崖";s:2:"R";s:3:"崗";s:2:"";s:3:"崘";s:2:"";s:3:"崙";s:2:"";s:3:"崚";s:2:"";s:3:"崛";s:2:"";s:3:"崟";s:2:"";s:3:"崢";s:2:"";s:3:"崧";s:2:"";s:3:"崩";s:2:"";s:3:"嵂";s:2:"";s:3:"嵋";s:2:"";s:3:"嵌";s:2:"";s:3:"嵎";s:2:"";s:3:"嵐";s:2:"";s:3:"嵒";s:2:"";s:3:"嵓";s:2:"";s:3:"嵜";s:2:"";s:3:"嵩";s:2:"";s:3:"嵬";s:2:"";s:3:"嵭";s:2:"";s:3:"嵯";s:2:"";s:3:"嵳";s:2:"";s:3:"嵶";s:2:"";s:3:"嶂";s:2:"";s:3:"嶄";s:2:"";s:3:"嶇";s:2:"";s:3:"嶋";s:2:"";s:3:"嶌";s:2:"";s:3:"嶐";s:2:"";s:3:"嶝";s:2:"";s:3:"嶢";s:2:"";s:3:"嶬";s:2:"";s:3:"嶮";s:2:"";s:3:"嶷";s:2:"";s:3:"嶸";s:2:"";s:3:"嶹";s:2:"";s:3:"嶺";s:2:"";s:3:"嶼";s:2:"";s:3:"嶽";s:2:"";s:3:"巉";s:2:"";s:3:"巌";s:2:"";s:3:"巍";s:2:"";s:3:"巐";s:2:"";s:3:"巒";s:2:"";s:3:"巓";s:2:"";s:3:"巖";s:2:"";s:3:"巛";s:2:"";s:3:"川";s:2:"";s:3:"州";s:2:"B";s:3:"巡";s:2:"";s:3:"巣";s:2:"";s:3:"工";s:2:"H";s:3:"左";s:2:"";s:3:"巧";s:2:"I";s:3:"巨";s:2:"";s:3:"巫";s:2:"";s:3:"差";s:2:"";s:3:"己";s:2:"";s:3:"已";s:2:"";s:3:"巳";s:2:"";s:3:"巴";s:2:"b";s:3:"巵";s:2:"";s:3:"巷";s:2:"J";s:3:"巻";s:2:"";s:3:"巽";s:2:"F";s:3:"巾";s:2:"";s:3:"市";s:2:"s";s:3:"布";s:2:"z";s:3:"帆";s:2:"";s:3:"帋";s:2:"";s:3:"希";s:2:"";s:3:"帑";s:2:"";s:3:"帖";s:2:"";s:3:"帙";s:2:"";s:3:"帚";s:2:"";s:3:"帛";s:2:"";s:3:"帝";s:2:"";s:3:"帥";s:2:"";s:3:"師";s:2:"t";s:3:"席";s:2:"";s:3:"帯";s:2:"";s:3:"帰";s:2:"A";s:3:"帳";s:2:"";s:3:"帶";s:2:"";s:3:"帷";s:2:"";s:3:"常";s:2:"";s:3:"帽";s:2:"X";s:3:"幀";s:2:"";s:3:"幃";s:2:"";s:3:"幄";s:2:"";s:3:"幅";s:2:"";s:3:"幇";s:2:"";s:3:"幌";s:2:"y";s:3:"幎";s:2:"";s:3:"幔";s:2:"";s:3:"幕";s:2:"";s:3:"幗";s:2:"";s:3:"幟";s:2:"";s:3:"幡";s:2:"";s:3:"幢";s:2:"";s:3:"幣";s:2:"";s:3:"幤";s:2:"";s:3:"干";s:2:"";s:3:"平";s:2:"";s:3:"年";s:2:"N";s:3:"幵";s:2:"";s:3:"并";s:2:"";s:3:"幸";s:2:"K";s:3:"幹";s:2:"";s:3:"幺";s:2:"";s:3:"幻";s:2:"";s:3:"幼";s:2:"c";s:3:"幽";s:2:"H";s:3:"幾";s:2:"";s:3:"广";s:2:"";s:3:"庁";s:2:"";s:3:"広";s:2:"L";s:3:"庄";s:2:"";s:3:"庇";s:2:"";s:3:"床";s:2:"";s:3:"序";s:2:"";s:3:"底";s:2:"";s:3:"庖";s:2:"";s:3:"店";s:2:"X";s:3:"庚";s:2:"M";s:3:"府";s:2:"{";s:3:"庠";s:2:"";s:3:"度";s:2:"x";s:3:"座";s:2:"";s:3:"庫";s:2:"";s:3:"庭";s:2:"";s:3:"庵";s:2:"";s:3:"庶";s:2:"";s:3:"康";s:2:"N";s:3:"庸";s:2:"f";s:3:"廁";s:2:"";s:3:"廂";s:2:"";s:3:"廃";s:2:"p";s:3:"廈";s:2:"";s:3:"廉";s:2:"";s:3:"廊";s:2:"L";s:3:"廏";s:2:"";s:3:"廐";s:2:"";s:3:"廓";s:2:"f";s:3:"廖";s:2:"@";s:3:"廚";s:2:"C";s:3:"廛";s:2:"D";s:3:"廝";s:2:"B";s:3:"廟";s:2:"_";s:3:"廠";s:2:"";s:3:"廡";s:2:"F";s:3:"廢";s:2:"E";s:3:"廣";s:2:"A";s:3:"廨";s:2:"G";s:3:"廩";s:2:"H";s:3:"廬";s:2:"I";s:3:"廰";s:2:"L";s:3:"廱";s:2:"J";s:3:"廳";s:2:"K";s:3:"廴";s:2:"M";s:3:"延";s:2:"";s:3:"廷";s:2:"";s:3:"廸";s:2:"N";s:3:"建";s:2:"";s:3:"廻";s:2:"";s:3:"廼";s:2:"U";s:3:"廾";s:2:"O";s:3:"廿";s:2:"";s:3:"弁";s:2:"";s:3:"弃";s:2:"P";s:3:"弄";s:2:"M";s:3:"弉";s:2:"Q";s:3:"弊";s:2:"";s:3:"弋";s:2:"T";s:3:"弌";s:2:"";s:3:"弍";s:2:"";s:3:"式";s:2:"";s:3:"弐";s:2:"";s:3:"弑";s:2:"U";s:3:"弓";s:2:"|";s:3:"弔";s:2:"";s:3:"引";s:2:"";s:3:"弖";s:2:"V";s:3:"弗";s:2:"";s:3:"弘";s:2:"O";s:3:"弛";s:2:"o";s:3:"弟";s:2:"";s:3:"弡";s:2:"";s:3:"弥";s:2:"";s:3:"弦";s:2:"";s:3:"弧";s:2:"";s:3:"弩";s:2:"W";s:3:"弭";s:2:"X";s:3:"弯";s:2:"^";s:3:"弱";s:2:"";s:3:"弴";s:2:"";s:3:"張";s:2:"";s:3:"強";s:2:"";s:3:"弸";s:2:"Y";s:3:"弼";s:2:"J";s:3:"弾";s:2:"e";s:3:"彁";s:2:"Z";s:3:"彅";s:2:"g";s:3:"彈";s:2:"[";s:3:"彊";s:2:"";s:3:"彌";s:2:"\";s:3:"彎";s:2:"]";s:3:"彑";s:2:"_";s:3:"当";s:2:"";s:3:"彖";s:2:"`";s:3:"彗";s:2:"a";s:3:"彙";s:2:"b";s:3:"彜";s:2:"S";s:3:"彝";s:2:"R";s:3:"彡";s:2:"c";s:3:"形";s:2:"`";s:3:"彦";s:2:"F";s:3:"彧";s:2:"";s:3:"彩";s:2:"";s:3:"彪";s:2:"V";s:3:"彫";s:2:"";s:3:"彬";s:2:"j";s:3:"彭";s:2:"d";s:3:"彰";s:2:"";s:3:"影";s:2:"e";s:3:"彳";s:2:"e";s:3:"彷";s:2:"f";s:3:"役";s:2:"";s:3:"彼";s:2:"";s:3:"彿";s:2:"i";s:3:"往";s:2:"";s:3:"征";s:2:"";s:3:"徂";s:2:"h";s:3:"徃";s:2:"g";s:3:"径";s:2:"a";s:3:"待";s:2:"";s:3:"徇";s:2:"m";s:3:"很";s:2:"k";s:3:"徊";s:2:"j";s:3:"律";s:2:"";s:3:"後";s:2:"";s:3:"徐";s:2:"";s:3:"徑";s:2:"l";s:3:"徒";s:2:"k";s:3:"従";s:2:"]";s:3:"得";s:2:"";s:3:"徘";s:2:"p";s:3:"徙";s:2:"o";s:3:"從";s:2:"n";s:3:"徠";s:2:"q";s:3:"御";s:2:"";s:3:"徨";s:2:"r";s:3:"復";s:2:"";s:3:"循";s:2:"z";s:3:"徭";s:2:"s";s:3:"微";s:2:"";s:3:"徳";s:2:"";s:3:"徴";s:2:"";s:3:"德";s:2:"";s:3:"徹";s:2:"O";s:3:"徼";s:2:"t";s:3:"徽";s:2:"J";s:3:"心";s:2:"S";s:3:"必";s:2:"K";s:3:"忌";s:2:"";s:3:"忍";s:2:"E";s:3:"忖";s:2:"u";s:3:"志";s:2:"u";s:3:"忘";s:2:"Y";s:3:"忙";s:2:"Z";s:3:"応";s:2:"";s:3:"忝";s:2:"z";s:3:"忞";s:2:"";s:3:"忠";s:2:"";s:3:"忤";s:2:"w";s:3:"快";s:2:"";s:3:"忰";s:2:"";s:3:"忱";s:2:"y";s:3:"念";s:2:"O";s:3:"忸";s:2:"x";s:3:"忻";s:2:"v";s:3:"忽";s:2:"";s:3:"忿";s:2:"|";s:3:"怎";s:2:"";s:3:"怏";s:2:"";s:3:"怐";s:2:"";s:3:"怒";s:2:"{";s:3:"怕";s:2:"";s:3:"怖";s:2:"|";s:3:"怙";s:2:"";s:3:"怛";s:2:"";s:3:"怜";s:2:"";s:3:"思";s:2:"v";s:3:"怠";s:2:"";s:3:"怡";s:2:"}";s:3:"急";s:2:"}";s:3:"怦";s:2:"";s:3:"性";s:2:"";s:3:"怨";s:2:"";s:3:"怩";s:2:"";s:3:"怪";s:2:"";s:3:"怫";s:2:"";s:3:"怯";s:2:"";s:3:"怱";s:2:"";s:3:"怺";s:2:"";s:3:"恁";s:2:"";s:3:"恂";s:2:"";s:3:"恃";s:2:"";s:3:"恆";s:2:"";s:3:"恊";s:2:"";s:3:"恋";s:2:"";s:3:"恍";s:2:"";s:3:"恐";s:2:"";s:3:"恒";s:2:"P";s:3:"恕";s:2:"";s:3:"恙";s:2:"";s:3:"恚";s:2:"";s:3:"恝";s:2:"";s:3:"恟";s:2:"";s:3:"恠";s:2:"~";s:3:"恢";s:2:"";s:3:"恣";s:2:"";s:3:"恤";s:2:"";s:3:"恥";s:2:"p";s:3:"恨";s:2:"";s:3:"恩";s:2:"";s:3:"恪";s:2:"";s:3:"恫";s:2:"";s:3:"恬";s:2:"";s:3:"恭";s:2:"";s:3:"息";s:2:"";s:3:"恰";s:2:"";s:3:"恵";s:2:"b";s:3:"恷";s:2:"";s:3:"悁";s:2:"";s:3:"悃";s:2:"";s:3:"悄";s:2:"";s:3:"悅";s:2:"";s:3:"悉";s:2:"";s:3:"悊";s:2:"";s:3:"悋";s:2:"";s:3:"悌";s:2:"";s:3:"悍";s:2:"";s:3:"悒";s:2:"";s:3:"悔";s:2:"";s:3:"悖";s:2:"";s:3:"悗";s:2:"";s:3:"悚";s:2:"";s:3:"悛";s:2:"";s:3:"悟";s:2:"";s:3:"悠";s:2:"I";s:3:"患";s:2:"";s:3:"悦";s:2:"x";s:3:"悧";s:2:"";s:3:"悩";s:2:"Y";s:3:"悪";s:2:"";s:3:"悲";s:2:"";s:3:"悳";s:2:"{";s:3:"悴";s:2:"";s:3:"悵";s:2:"";s:3:"悶";s:2:"";s:3:"悸";s:2:"";s:3:"悼";s:2:"";s:3:"悽";s:2:"";s:3:"情";s:2:"";s:3:"惆";s:2:"";s:3:"惇";s:2:"";s:3:"惑";s:2:"f";s:3:"惓";s:2:"";s:3:"惕";s:2:"";s:3:"惘";s:2:"";s:3:"惚";s:2:"";s:3:"惜";s:2:"";s:3:"惞";s:2:"";s:3:"惟";s:2:"";s:3:"惠";s:2:"";s:3:"惡";s:2:"";s:3:"惣";s:2:"y";s:3:"惧";s:2:"";s:3:"惨";s:2:"S";s:3:"惰";s:2:"";s:3:"惱";s:2:"";s:3:"惲";s:2:"";s:3:"想";s:2:"z";s:3:"惴";s:2:"";s:3:"惶";s:2:"";s:3:"惷";s:2:"";s:3:"惹";s:2:"";s:3:"惺";s:2:"";s:3:"惻";s:2:"";s:3:"愀";s:2:"";s:3:"愁";s:2:"D";s:3:"愃";s:2:"";s:3:"愆";s:2:"";s:3:"愈";s:2:"";s:3:"愉";s:2:"";s:3:"愍";s:2:"";s:3:"愎";s:2:"";s:3:"意";s:2:"";s:3:"愑";s:2:"";s:3:"愕";s:2:"";s:3:"愚";s:2:"";s:3:"愛";s:2:"";s:3:"感";s:2:"";s:3:"愠";s:2:"";s:3:"愡";s:2:"";s:3:"愧";s:2:"";s:3:"愨";s:2:"";s:3:"愬";s:2:"";s:3:"愰";s:2:"";s:3:"愴";s:2:"";s:3:"愷";s:2:"";s:3:"愼";s:2:"";s:3:"愽";s:2:"";s:3:"愾";s:2:"";s:3:"愿";s:2:"";s:3:"慂";s:2:"";s:3:"慄";s:2:"";s:3:"慇";s:2:"";s:3:"慈";s:2:"";s:3:"慊";s:2:"";s:3:"態";s:2:"";s:3:"慌";s:2:"Q";s:3:"慍";s:2:"";s:3:"慎";s:2:"T";s:3:"慓";s:2:"";s:3:"慕";s:2:"";s:3:"慘";s:2:"";s:3:"慙";s:2:"";s:3:"慚";s:2:"";s:3:"慝";s:2:"";s:3:"慟";s:2:"";s:3:"慢";s:2:"";s:3:"慣";s:2:"";s:3:"慥";s:2:"";s:3:"慧";s:2:"d";s:3:"慨";s:2:"S";s:3:"慫";s:2:"";s:3:"慮";s:2:"";s:3:"慯";s:2:"";s:3:"慰";s:2:"";s:3:"慱";s:2:"";s:3:"慳";s:2:"";s:3:"慴";s:2:"";s:3:"慵";s:2:"";s:3:"慶";s:2:"c";s:3:"慷";s:2:"";s:3:"慾";s:2:"|";s:3:"憂";s:2:"J";s:3:"憇";s:2:"";s:3:"憊";s:2:"";s:3:"憎";s:2:"";s:3:"憐";s:2:"";s:3:"憑";s:2:"";s:3:"憔";s:2:"";s:3:"憖";s:2:"";s:3:"憘";s:2:"";s:3:"憙";s:2:"";s:3:"憚";s:2:"";s:3:"憤";s:2:"";s:3:"憧";s:2:"";s:3:"憩";s:2:"e";s:3:"憫";s:2:"";s:3:"憬";s:2:"";s:3:"憮";s:2:"";s:3:"憲";s:2:"";s:3:"憶";s:2:"";s:3:"憺";s:2:"";s:3:"憾";s:2:"";s:3:"懃";s:2:"";s:3:"懆";s:2:"";s:3:"懇";s:2:"";s:3:"懈";s:2:"";s:3:"應";s:2:"";s:3:"懊";s:2:"";s:3:"懋";s:2:"";s:3:"懌";s:2:"";s:3:"懍";s:2:"";s:3:"懐";s:2:"";s:3:"懣";s:2:"";s:3:"懦";s:2:"";s:3:"懲";s:2:"";s:3:"懴";s:2:"";s:3:"懶";s:2:"";s:3:"懷";s:2:"";s:3:"懸";s:2:"";s:3:"懺";s:2:"";s:3:"懼";s:2:"";s:3:"懽";s:2:"";s:3:"懾";s:2:"";s:3:"懿";s:2:"";s:3:"戀";s:2:"";s:3:"戈";s:2:"";s:3:"戉";s:2:"";s:3:"戊";s:2:"";s:3:"戌";s:2:"";s:3:"戍";s:2:"";s:3:"戎";s:2:"^";s:3:"成";s:2:"";s:3:"我";s:2:"";s:3:"戒";s:2:"";s:3:"戓";s:2:"";s:3:"戔";s:2:"";s:3:"或";s:2:"";s:3:"戚";s:2:"";s:3:"戛";s:2:"";s:3:"戝";s:2:"";s:3:"戞";s:2:"@";s:3:"戟";s:2:"";s:3:"戡";s:2:"A";s:3:"戦";s:2:"";s:3:"截";s:2:"B";s:3:"戮";s:2:"C";s:3:"戯";s:2:"Y";s:3:"戰";s:2:"D";s:3:"戲";s:2:"E";s:3:"戳";s:2:"F";s:3:"戴";s:2:"";s:3:"戸";s:2:"";s:3:"戻";s:2:"";s:3:"房";s:2:"[";s:3:"所";s:2:"";s:3:"扁";s:2:"G";s:3:"扇";s:2:"";s:3:"扈";s:2:"";s:3:"扉";s:2:"";s:3:"手";s:2:"";s:3:"才";s:2:"";s:3:"扎";s:2:"H";s:3:"打";s:2:"";s:3:"払";s:2:"";s:3:"托";s:2:"";s:3:"扛";s:2:"K";s:3:"扞";s:2:"I";s:3:"扠";s:2:"L";s:3:"扣";s:2:"J";s:3:"扨";s:2:"M";s:3:"扮";s:2:"";s:3:"扱";s:2:"";s:3:"扶";s:2:"}";s:3:"批";s:2:"";s:3:"扼";s:2:"N";s:3:"找";s:2:"Q";s:3:"承";s:2:"";s:3:"技";s:2:"Z";s:3:"抂";s:2:"O";s:3:"抃";s:2:"V";s:3:"抄";s:2:"";s:3:"抉";s:2:"P";s:3:"把";s:2:"c";s:3:"抑";s:2:"}";s:3:"抒";s:2:"R";s:3:"抓";s:2:"S";s:3:"抔";s:2:"W";s:3:"投";s:2:"";s:3:"抖";s:2:"T";s:3:"抗";s:2:"R";s:3:"折";s:2:"";s:3:"抛";s:2:"e";s:3:"抜";s:2:"";s:3:"択";s:2:"";s:3:"抦";s:2:"";s:3:"披";s:2:"";s:3:"抬";s:2:"";s:3:"抱";s:2:"";s:3:"抵";s:2:"";s:3:"抹";s:2:"";s:3:"抻";s:2:"Z";s:3:"押";s:2:"";s:3:"抽";s:2:"";s:3:"拂";s:2:"c";s:3:"担";s:2:"S";s:3:"拆";s:2:"]";s:3:"拇";s:2:"d";s:3:"拈";s:2:"_";s:3:"拉";s:2:"f";s:3:"拊";s:2:"b";s:3:"拌";s:2:"a";s:3:"拍";s:2:"";s:3:"拏";s:2:"[";s:3:"拐";s:2:"";s:3:"拑";s:2:"Y";s:3:"拒";s:2:"";s:3:"拓";s:2:"";s:3:"拔";s:2:"U";s:3:"拗";s:2:"X";s:3:"拘";s:2:"S";s:3:"拙";s:2:"";s:3:"招";s:2:"";s:3:"拜";s:2:"`";s:3:"拝";s:2:"q";s:3:"拠";s:2:"";s:3:"拡";s:2:"g";s:3:"括";s:2:"";s:3:"拭";s:2:"@";s:3:"拮";s:2:"h";s:3:"拯";s:2:"m";s:3:"拱";s:2:"i";s:3:"拳";s:2:"";s:3:"拵";s:2:"n";s:3:"拶";s:2:"A";s:3:"拷";s:2:"";s:3:"拾";s:2:"E";s:3:"拿";s:2:"\";s:3:"持";s:2:"";s:3:"挂";s:2:"k";s:3:"指";s:2:"w";s:3:"挈";s:2:"l";s:3:"按";s:2:"";s:3:"挌";s:2:"g";s:3:"挑";s:2:"";s:3:"挙";s:2:"";s:3:"挟";s:2:"";s:3:"挧";s:2:"j";s:3:"挨";s:2:"";s:3:"挫";s:2:"";s:3:"振";s:2:"U";s:3:"挺";s:2:"";s:3:"挽";s:2:"";s:3:"挾";s:2:"p";s:3:"挿";s:2:"}";s:3:"捉";s:2:"";s:3:"捌";s:2:"J";s:3:"捍";s:2:"q";s:3:"捏";s:2:"s";s:3:"捐";s:2:"o";s:3:"捕";s:2:"";s:3:"捗";s:2:"";s:3:"捜";s:2:"{";s:3:"捧";s:2:"";s:3:"捨";s:2:"";s:3:"捩";s:2:"";s:3:"捫";s:2:"~";s:3:"据";s:2:"";s:3:"捲";s:2:"";s:3:"捶";s:2:"x";s:3:"捷";s:2:"";s:3:"捺";s:2:"";s:3:"捻";s:2:"P";s:3:"掀";s:2:"v";s:3:"掃";s:2:"|";s:3:"授";s:2:"";s:3:"掉";s:2:"{";s:3:"掌";s:2:"";s:3:"掎";s:2:"u";s:3:"掏";s:2:"z";s:3:"排";s:2:"r";s:3:"掖";s:2:"t";s:3:"掘";s:2:"@";s:3:"掛";s:2:"|";s:3:"掟";s:2:"|";s:3:"掠";s:2:"";s:3:"採";s:2:"";s:3:"探";s:2:"T";s:3:"掣";s:2:"y";s:3:"接";s:2:"";s:3:"控";s:2:"T";s:3:"推";s:2:"";s:3:"掩";s:2:"";s:3:"措";s:2:"[";s:3:"掫";s:2:"w";s:3:"掬";s:2:"d";s:3:"掲";s:2:"f";s:3:"掴";s:2:"";s:3:"掵";s:2:"}";s:3:"掻";s:2:"~";s:3:"掾";s:2:"";s:3:"揀";s:2:"";s:3:"揃";s:2:"";s:3:"揄";s:2:"";s:3:"揆";s:2:"";s:3:"揉";s:2:"";s:3:"描";s:2:"`";s:3:"提";s:2:"";s:3:"插";s:2:"";s:3:"揖";s:2:"K";s:3:"揚";s:2:"g";s:3:"換";s:2:"";s:3:"握";s:2:"";s:3:"揣";s:2:"";s:3:"揩";s:2:"";s:3:"揮";s:2:"";s:3:"援";s:2:"";s:3:"揵";s:2:"";s:3:"揶";s:2:"";s:3:"揺";s:2:"h";s:3:"搆";s:2:"";s:3:"損";s:2:"";s:3:"搏";s:2:"";s:3:"搓";s:2:"";s:3:"搖";s:2:"";s:3:"搗";s:2:"";s:3:"搜";s:2:"r";s:3:"搦";s:2:"";s:3:"搨";s:2:"";s:3:"搬";s:2:"";s:3:"搭";s:2:"";s:3:"搴";s:2:"";s:3:"搶";s:2:"";s:3:"携";s:2:"g";s:3:"搾";s:2:"";s:3:"摂";s:2:"";s:3:"摎";s:2:"";s:3:"摘";s:2:"E";s:3:"摠";s:2:"";s:3:"摧";s:2:"";s:3:"摩";s:2:"";s:3:"摯";s:2:"";s:3:"摶";s:2:"";s:3:"摸";s:2:"";s:3:"摺";s:2:"";s:3:"撃";s:2:"";s:3:"撈";s:2:"";s:3:"撒";s:2:"T";s:3:"撓";s:2:"";s:3:"撕";s:2:"";s:3:"撚";s:2:"Q";s:3:"撝";s:2:"";s:3:"撞";s:2:"";s:3:"撤";s:2:"P";s:3:"撥";s:2:"";s:3:"撩";s:2:"";s:3:"撫";s:2:"";s:3:"播";s:2:"d";s:3:"撮";s:2:"B";s:3:"撰";s:2:"";s:3:"撲";s:2:"o";s:3:"撹";s:2:"h";s:3:"撻";s:2:"";s:3:"撼";s:2:"";s:3:"擁";s:2:"i";s:3:"擂";s:2:"";s:3:"擅";s:2:"";s:3:"擇";s:2:"";s:3:"操";s:2:"";s:3:"擎";s:2:"";s:3:"擒";s:2:"";s:3:"擔";s:2:"^";s:3:"擘";s:2:"";s:3:"據";s:2:"";s:3:"擠";s:2:"";s:3:"擡";s:2:"";s:3:"擢";s:2:"F";s:3:"擣";s:2:"";s:3:"擦";s:2:"C";s:3:"擧";s:2:"";s:3:"擬";s:2:"[";s:3:"擯";s:2:"";s:3:"擱";s:2:"";s:3:"擲";s:2:"";s:3:"擴";s:2:"";s:3:"擶";s:2:"";s:3:"擺";s:2:"";s:3:"擽";s:2:"";s:3:"擾";s:2:"";s:3:"攀";s:2:"";s:3:"攅";s:2:"";s:3:"攘";s:2:"";s:3:"攜";s:2:"";s:3:"攝";s:2:"";s:3:"攣";s:2:"";s:3:"攤";s:2:"";s:3:"攪";s:2:"";s:3:"攫";s:2:"";s:3:"攬";s:2:"";s:3:"支";s:2:"x";s:3:"攴";s:2:"";s:3:"攵";s:2:"";s:3:"收";s:2:"";s:3:"攷";s:2:"";s:3:"攸";s:2:"";s:3:"改";s:2:"";s:3:"攻";s:2:"U";s:3:"放";s:2:"";s:3:"政";s:2:"";s:3:"故";s:2:"";s:3:"效";s:2:"";s:3:"敍";s:2:"";s:3:"敎";s:2:"";s:3:"敏";s:2:"q";s:3:"救";s:2:"~";s:3:"敕";s:2:"";s:3:"敖";s:2:"";s:3:"敗";s:2:"s";s:3:"敘";s:2:"";s:3:"教";s:2:"";s:3:"敝";s:2:"";s:3:"敞";s:2:"";s:3:"敢";s:2:"";s:3:"散";s:2:"U";s:3:"敦";s:2:"";s:3:"敬";s:2:"h";s:3:"数";s:2:"";s:3:"敲";s:2:"";s:3:"整";s:2:"";s:3:"敵";s:2:"G";s:3:"敷";s:2:"~";s:3:"數";s:2:"";s:3:"斂";s:2:"";s:3:"斃";s:2:"";s:3:"文";s:2:"";s:3:"斈";s:2:"|";s:3:"斉";s:2:"";s:3:"斌";s:2:"k";s:3:"斎";s:2:"";s:3:"斐";s:2:"";s:3:"斑";s:2:"";s:3:"斗";s:2:"l";s:3:"料";s:2:"";s:3:"斛";s:2:"";s:3:"斜";s:2:"";s:3:"斟";s:2:"";s:3:"斡";s:2:"";s:3:"斤";s:2:"";s:3:"斥";s:2:"";s:3:"斧";s:2:"";s:3:"斫";s:2:"";s:3:"斬";s:2:"a";s:3:"断";s:2:"f";s:3:"斯";s:2:"z";s:3:"新";s:2:"V";s:3:"斷";s:2:"";s:3:"方";s:2:"";s:3:"於";s:2:"";s:3:"施";s:2:"{";s:3:"旁";s:2:"";s:3:"旃";s:2:"";s:3:"旄";s:2:"";s:3:"旅";s:2:"";s:3:"旆";s:2:"";s:3:"旋";s:2:"";s:3:"旌";s:2:"";s:3:"族";s:2:"";s:3:"旒";s:2:"";s:3:"旗";s:2:"";s:3:"旙";s:2:"";s:3:"旛";s:2:"";s:3:"无";s:2:"";s:3:"旡";s:2:"";s:3:"既";s:2:"";s:3:"日";s:2:"";s:3:"旦";s:2:"U";s:3:"旧";s:2:"";s:3:"旨";s:2:"|";s:3:"早";s:2:"";s:3:"旬";s:2:"{";s:3:"旭";s:2:"";s:3:"旱";s:2:"";s:3:"旺";s:2:"";s:3:"旻";s:2:"";s:3:"昀";s:2:"";s:3:"昂";s:2:"V";s:3:"昃";s:2:"";s:3:"昆";s:2:"";s:3:"昇";s:2:"";s:3:"昉";s:2:"";s:3:"昊";s:2:"";s:3:"昌";s:2:"";s:3:"明";s:2:"";s:3:"昏";s:2:"";s:3:"易";s:2:"";s:3:"昔";s:2:"";s:3:"昕";s:2:"";s:3:"昜";s:2:"";s:3:"昞";s:2:"";s:3:"星";s:2:"";s:3:"映";s:2:"f";s:3:"昤";s:2:"";s:3:"春";s:2:"t";s:3:"昧";s:2:"";s:3:"昨";s:2:"";s:3:"昭";s:2:"";s:3:"昮";s:2:"";s:3:"是";s:2:"";s:3:"昱";s:2:"c";s:3:"昴";s:2:"";s:3:"昵";s:2:"";s:3:"昶";s:2:"";s:3:"昻";s:2:"";s:3:"昼";s:2:"";s:3:"昿";s:2:"E";s:3:"晁";s:2:"";s:3:"時";s:2:"";s:3:"晃";s:2:"W";s:3:"晄";s:2:"";s:3:"晉";s:2:"";s:3:"晋";s:2:"W";s:3:"晏";s:2:"";s:3:"晒";s:2:"N";s:3:"晗";s:2:"";s:3:"晙";s:2:"";s:3:"晝";s:2:"";s:3:"晞";s:2:"";s:3:"晟";s:2:"";s:3:"晢";s:2:"";s:3:"晤";s:2:"";s:3:"晥";s:2:"";s:3:"晦";s:2:"A";s:3:"晧";s:2:"";s:3:"晨";s:2:"";s:3:"晩";s:2:"";s:3:"普";s:2:"";s:3:"景";s:2:"i";s:3:"晰";s:2:"";s:3:"晳";s:2:"";s:3:"晴";s:2:"";s:3:"晶";s:2:"";s:3:"智";s:2:"q";s:3:"暁";s:2:"";s:3:"暃";s:2:"";s:3:"暄";s:2:"";s:3:"暇";s:2:"";s:3:"暈";s:2:"";s:3:"暉";s:2:"";s:3:"暎";s:2:"";s:3:"暑";s:2:"";s:3:"暖";s:2:"g";s:3:"暗";s:2:"";s:3:"暘";s:2:"";s:3:"暙";s:2:"";s:3:"暝";s:2:"";s:3:"暠";s:2:"";s:3:"暢";s:2:"";s:3:"暦";s:2:"";s:3:"暫";s:2:"b";s:3:"暮";s:2:"";s:3:"暲";s:2:"";s:3:"暴";s:2:"\";s:3:"暸";s:2:"A";s:3:"暹";s:2:"";s:3:"暼";s:2:"";s:3:"暾";s:2:"";s:3:"暿";s:2:"";s:3:"曁";s:2:"";s:3:"曄";s:2:"@";s:3:"曇";s:2:"";s:3:"曉";s:2:"";s:3:"曖";s:2:"B";s:3:"曙";s:2:"";s:3:"曚";s:2:"C";s:3:"曜";s:2:"j";s:3:"曝";s:2:"";s:3:"曠";s:2:"D";s:3:"曦";s:2:"F";s:3:"曩";s:2:"G";s:3:"曰";s:2:"H";s:3:"曲";s:2:"";s:3:"曳";s:2:"g";s:3:"更";s:2:"X";s:3:"曵";s:2:"I";s:3:"曷";s:2:"J";s:3:"書";s:2:"";s:3:"曹";s:2:"";s:3:"曺";s:2:"";s:3:"曻";s:2:"f";s:3:"曼";s:2:"";s:3:"曽";s:2:"]";s:3:"曾";s:2:"\";s:3:"替";s:2:"";s:3:"最";s:2:"";s:3:"會";s:2:"";s:3:"月";s:2:"";s:3:"有";s:2:"L";s:3:"朋";s:2:"";s:3:"服";s:2:"";s:3:"朎";s:2:"";s:3:"朏";s:2:"K";s:3:"朔";s:2:"";s:3:"朕";s:2:"";s:3:"朖";s:2:"L";s:3:"朗";s:2:"N";s:3:"望";s:2:"]";s:3:"朝";s:2:"";s:3:"朞";s:2:"M";s:3:"期";s:2:"";s:3:"朦";s:2:"N";s:3:"朧";s:2:"O";s:3:"木";s:2:"";s:3:"未";s:2:"";s:3:"末";s:2:"";s:3:"本";s:2:"{";s:3:"札";s:2:"D";s:3:"朮";s:2:"Q";s:3:"朱";s:2:"";s:3:"朴";s:2:"p";s:3:"朶";s:2:"S";s:3:"朷";s:2:"V";s:3:"朸";s:2:"U";s:3:"机";s:2:"";s:3:"朽";s:2:"";s:3:"朿";s:2:"R";s:3:"杁";s:2:"T";s:3:"杆";s:2:"W";s:3:"杉";s:2:"";s:3:"李";s:2:"";s:3:"杏";s:2:"";s:3:"材";s:2:"";s:3:"村";s:2:"";s:3:"杓";s:2:"";s:3:"杖";s:2:"";s:3:"杙";s:2:"Z";s:3:"杜";s:2:"m";s:3:"杞";s:2:"X";s:3:"束";s:2:"";s:3:"杠";s:2:"Y";s:3:"条";s:2:"";s:3:"杢";s:2:"";s:3:"杣";s:2:"[";s:3:"杤";s:2:"\";s:3:"来";s:2:"";s:3:"杦";s:2:"";s:3:"杪";s:2:"a";s:3:"杭";s:2:"Y";s:3:"杯";s:2:"t";s:3:"杰";s:2:"^";s:3:"東";s:2:"";s:3:"杲";s:2:"";s:3:"杳";s:2:"";s:3:"杵";s:2:"n";s:3:"杷";s:2:"f";s:3:"杼";s:2:"`";s:3:"松";s:2:"";s:3:"板";s:2:"";s:3:"枅";s:2:"f";s:3:"枇";s:2:"";s:3:"枉";s:2:"]";s:3:"枋";s:2:"c";s:3:"枌";s:2:"b";s:3:"析";s:2:"";s:3:"枕";s:2:"";s:3:"林";s:2:"";s:3:"枚";s:2:"";s:3:"果";s:2:"";s:3:"枝";s:2:"}";s:3:"枠";s:2:"g";s:3:"枡";s:2:"e";s:3:"枢";s:2:"";s:3:"枦";s:2:"d";s:3:"枩";s:2:"_";s:3:"枯";s:2:"";s:3:"枳";s:2:"k";s:3:"枴";s:2:"i";s:3:"架";s:2:"";s:3:"枷";s:2:"g";s:3:"枸";s:2:"m";s:3:"枹";s:2:"s";s:3:"枻";s:2:"";s:3:"柀";s:2:"";s:3:"柁";s:2:"";s:3:"柄";s:2:"";s:3:"柆";s:2:"u";s:3:"柊";s:2:"A";s:3:"柎";s:2:"t";s:3:"柏";s:2:"";s:3:"某";s:2:"^";s:3:"柑";s:2:"";s:3:"染";s:2:"";s:3:"柔";s:2:"_";s:3:"柘";s:2:"";s:3:"柚";s:2:"M";s:3:"柝";s:2:"p";s:3:"柞";s:2:"o";s:3:"柢";s:2:"q";s:3:"柤";s:2:"n";s:3:"柧";s:2:"v";s:3:"柩";s:2:"l";s:3:"柬";s:2:"j";s:3:"柮";s:2:"r";s:3:"柯";s:2:"h";s:3:"柱";s:2:"";s:3:"柳";s:2:"";s:3:"柴";s:2:"";s:3:"柵";s:2:"";s:3:"査";s:2:"";s:3:"柾";s:2:"";s:3:"柿";s:2:"`";s:3:"栁";s:2:"";s:3:"栂";s:2:"";s:3:"栃";s:2:"";s:3:"栄";s:2:"h";s:3:"栓";s:2:"";s:3:"栖";s:2:"";s:3:"栗";s:2:"I";s:3:"栞";s:2:"x";s:3:"校";s:2:"Z";s:3:"栢";s:2:"";s:3:"栩";s:2:"z";s:3:"株";s:2:"";s:3:"栫";s:2:"";s:3:"栲";s:2:"}";s:3:"栴";s:2:"";s:3:"核";s:2:"j";s:3:"根";s:2:"";s:3:"格";s:2:"i";s:3:"栽";s:2:"";s:3:"桀";s:2:"{";s:3:"桁";s:2:"";s:3:"桂";s:2:"j";s:3:"桃";s:2:"";s:3:"桄";s:2:"";s:3:"框";s:2:"y";s:3:"案";s:2:"";s:3:"桍";s:2:"|";s:3:"桎";s:2:"~";s:3:"桐";s:2:"";s:3:"桑";s:2:"K";s:3:"桒";s:2:"";s:3:"桓";s:2:"";s:3:"桔";s:2:"j";s:3:"桙";s:2:"";s:3:"桜";s:2:"";s:3:"桝";s:2:"";s:3:"桟";s:2:"V";s:3:"档";s:2:"";s:3:"桧";s:2:"O";s:3:"桴";s:2:"";s:3:"桶";s:2:"";s:3:"桷";s:2:"";s:3:"桾";s:2:"";s:3:"桿";s:2:"";s:3:"梁";s:2:"";s:3:"梃";s:2:"";s:3:"梅";s:2:"~";s:3:"梍";s:2:"";s:3:"梏";s:2:"";s:3:"梓";s:2:"";s:3:"梔";s:2:"";s:3:"梗";s:2:"[";s:3:"梛";s:2:"";s:3:"條";s:2:"";s:3:"梟";s:2:"";s:3:"梠";s:2:"";s:3:"梢";s:2:"";s:3:"梦";s:2:"";s:3:"梧";s:2:"";s:3:"梨";s:2:"";s:3:"梭";s:2:"";s:3:"梯";s:2:"";s:3:"械";s:2:"B";s:3:"梱";s:2:"";s:3:"梳";s:2:"";s:3:"梵";s:2:"";s:3:"梶";s:2:"";s:3:"梹";s:2:"";s:3:"梺";s:2:"";s:3:"梼";s:2:"";s:3:"棄";s:2:"";s:3:"棆";s:2:"";s:3:"棈";s:2:"d";s:3:"棉";s:2:"";s:3:"棊";s:2:"";s:3:"棋";s:2:"";s:3:"棍";s:2:"";s:3:"棏";s:2:"";s:3:"棒";s:2:"_";s:3:"棔";s:2:"";s:3:"棕";s:2:"";s:3:"棗";s:2:"";s:3:"棘";s:2:"";s:3:"棚";s:2:"I";s:3:"棟";s:2:"";s:3:"棠";s:2:"";s:3:"棡";s:2:"";s:3:"棣";s:2:"";s:3:"棧";s:2:"";s:3:"森";s:2:"X";s:3:"棯";s:2:"";s:3:"棲";s:2:"";s:3:"棹";s:2:"";s:3:"棺";s:2:"";s:3:"椀";s:2:"o";s:3:"椁";s:2:"";s:3:"椄";s:2:"";s:3:"椅";s:2:"";s:3:"椈";s:2:"";s:3:"椋";s:2:"";s:3:"椌";s:2:"";s:3:"植";s:2:"A";s:3:"椎";s:2:"";s:3:"椏";s:2:"";s:3:"椒";s:2:"";s:3:"椙";s:2:"";s:3:"椚";s:2:"";s:3:"椛";s:2:"";s:3:"検";s:2:"";s:3:"椡";s:2:"";s:3:"椢";s:2:"";s:3:"椣";s:2:"";s:3:"椥";s:2:"";s:3:"椦";s:2:"";s:3:"椨";s:2:"";s:3:"椪";s:2:"";s:3:"椰";s:2:"";s:3:"椴";s:2:"";s:3:"椶";s:2:"";s:3:"椹";s:2:"";s:3:"椽";s:2:"";s:3:"椿";s:2:"";s:3:"楊";s:2:"k";s:3:"楓";s:2:"";s:3:"楔";s:2:"";s:3:"楕";s:2:"";s:3:"楙";s:2:"";s:3:"楚";s:2:"^";s:3:"楜";s:2:"";s:3:"楝";s:2:"";s:3:"楞";s:2:"";s:3:"楠";s:2:"";s:3:"楡";s:2:"";s:3:"楢";s:2:"";s:3:"楨";s:2:"";s:3:"楪";s:2:"";s:3:"楫";s:2:"";s:3:"業";s:2:"";s:3:"楮";s:2:"";s:3:"楯";s:2:"|";s:3:"楳";s:2:"";s:3:"楴";s:2:"";s:3:"極";s:2:"";s:3:"楷";s:2:"";s:3:"楸";s:2:"";s:3:"楹";s:2:"";s:3:"楼";s:2:"O";s:3:"楽";s:2:"y";s:3:"楾";s:2:"";s:3:"榁";s:2:"";s:3:"概";s:2:"T";s:3:"榊";s:2:"";s:3:"榎";s:2:"|";s:3:"榑";s:2:"";s:3:"榔";s:2:"P";s:3:"榕";s:2:"";s:3:"榘";s:2:"";s:3:"榛";s:2:"Y";s:3:"榜";s:2:"";s:3:"榠";s:2:"";s:3:"榧";s:2:"";s:3:"榮";s:2:"";s:3:"榱";s:2:"";s:3:"榲";s:2:"";s:3:"榴";s:2:"";s:3:"榻";s:2:"";s:3:"榾";s:2:"";s:3:"榿";s:2:"";s:3:"槁";s:2:"";s:3:"槃";s:2:"";s:3:"槇";s:2:"";s:3:"槊";s:2:"";s:3:"構";s:2:"\";s:3:"槌";s:2:"";s:3:"槍";s:2:"";s:3:"槎";s:2:"";s:3:"槐";s:2:"";s:3:"槓";s:2:"";s:3:"様";s:2:"l";s:3:"槙";s:2:"";s:3:"槝";s:2:"";s:3:"槞";s:2:"";s:3:"槢";s:2:"";s:3:"槧";s:2:"";s:3:"槨";s:2:"";s:3:"槫";s:2:"";s:3:"槭";s:2:"";s:3:"槲";s:2:"";s:3:"槹";s:2:"";s:3:"槻";s:2:"";s:3:"槽";s:2:"";s:3:"槿";s:2:"";s:3:"樂";s:2:"";s:3:"樅";s:2:"";s:3:"樊";s:2:"";s:3:"樋";s:2:"";s:3:"樌";s:2:"";s:3:"樒";s:2:"";s:3:"樓";s:2:"";s:3:"樔";s:2:"";s:3:"樗";s:2:"";s:3:"標";s:2:"W";s:3:"樛";s:2:"";s:3:"樞";s:2:"";s:3:"樟";s:2:"";s:3:"模";s:2:"";s:3:"樢";s:2:"";s:3:"樣";s:2:"";s:3:"権";s:2:"";s:3:"横";s:2:"";s:3:"樫";s:2:"~";s:3:"樮";s:2:"";s:3:"樰";s:2:"";s:3:"樵";s:2:"";s:3:"樶";s:2:"";s:3:"樸";s:2:"";s:3:"樹";s:2:"";s:3:"樺";s:2:"";s:3:"樽";s:2:"M";s:3:"橄";s:2:"";s:3:"橆";s:2:"";s:3:"橇";s:2:"";s:3:"橈";s:2:"";s:3:"橋";s:2:"";s:3:"橘";s:2:"k";s:3:"橙";s:2:"";s:3:"機";s:2:"@";s:3:"橡";s:2:"";s:3:"橢";s:2:"";s:3:"橦";s:2:"";s:3:"橫";s:2:"";s:3:"橲";s:2:"";s:3:"橳";s:2:"";s:3:"橸";s:2:"";s:3:"橾";s:2:"";s:3:"橿";s:2:"";s:3:"檀";s:2:"h";s:3:"檄";s:2:"";s:3:"檍";s:2:"";s:3:"檎";s:2:"";s:3:"檐";s:2:"";s:3:"檗";s:2:"@";s:3:"檜";s:2:"w";s:3:"檠";s:2:"";s:3:"檢";s:2:"";s:3:"檣";s:2:"";s:3:"檪";s:2:"K";s:3:"檬";s:2:"G";s:3:"檮";s:2:"";s:3:"檳";s:2:"F";s:3:"檸";s:2:"E";s:3:"檻";s:2:"B";s:3:"櫁";s:2:"";s:3:"櫂";s:2:"D";s:3:"櫃";s:2:"C";s:3:"櫑";s:2:"I";s:3:"櫓";s:2:"E";s:3:"櫚";s:2:"L";s:3:"櫛";s:2:"";s:3:"櫞";s:2:"H";s:3:"櫟";s:2:"J";s:3:"櫢";s:2:"";s:3:"櫤";s:2:"";s:3:"櫨";s:2:"";s:3:"櫪";s:2:"M";s:3:"櫺";s:2:"Q";s:3:"櫻";s:2:"N";s:3:"欄";s:2:"";s:3:"欅";s:2:"O";s:3:"權";s:2:"";s:3:"欒";s:2:"R";s:3:"欖";s:2:"S";s:3:"欝";s:2:"T";s:3:"欟";s:2:"U";s:3:"欠";s:2:"";s:3:"次";s:2:"";s:3:"欣";s:2:"";s:3:"欧";s:2:"";s:3:"欲";s:2:"~";s:3:"欷";s:2:"W";s:3:"欸";s:2:"V";s:3:"欹";s:2:"Y";s:3:"欺";s:2:"\";s:3:"欽";s:2:"";s:3:"款";s:2:"";s:3:"歃";s:2:"\";s:3:"歇";s:2:"[";s:3:"歉";s:2:"]";s:3:"歌";s:2:"";s:3:"歎";s:2:"V";s:3:"歐";s:2:"^";s:3:"歓";s:2:"";s:3:"歔";s:2:"`";s:3:"歙";s:2:"_";s:3:"歛";s:2:"a";s:3:"歟";s:2:"b";s:3:"歡";s:2:"c";s:3:"止";s:2:"~";s:3:"正";s:2:"";s:3:"此";s:2:"";s:3:"武";s:2:"";s:3:"歩";s:2:"";s:3:"歪";s:2:"c";s:3:"歯";s:2:"";s:3:"歳";s:2:"";s:3:"歴";s:2:"";s:3:"歸";s:2:"d";s:3:"歹";s:2:"e";s:3:"死";s:2:"";s:3:"歿";s:2:"f";s:3:"殀";s:2:"g";s:3:"殃";s:2:"i";s:3:"殄";s:2:"h";s:3:"殆";s:2:"w";s:3:"殉";s:2:"}";s:3:"殊";s:2:"";s:3:"残";s:2:"c";s:3:"殍";s:2:"j";s:3:"殕";s:2:"l";s:3:"殖";s:2:"B";s:3:"殘";s:2:"k";s:3:"殞";s:2:"m";s:3:"殤";s:2:"n";s:3:"殪";s:2:"o";s:3:"殫";s:2:"p";s:3:"殯";s:2:"q";s:3:"殱";s:2:"s";s:3:"殲";s:2:"r";s:3:"殳";s:2:"t";s:3:"殴";s:2:"";s:3:"段";s:2:"i";s:3:"殷";s:2:"u";s:3:"殺";s:2:"E";s:3:"殻";s:2:"k";s:3:"殼";s:2:"v";s:3:"殿";s:2:"a";s:3:"毀";s:2:"";s:3:"毅";s:2:"B";s:3:"毆";s:2:"w";s:3:"毋";s:2:"x";s:3:"母";s:2:"";s:3:"毎";s:2:"";s:3:"毒";s:2:"";s:3:"毓";s:2:"y";s:3:"比";s:2:"";s:3:"毖";s:2:"";s:3:"毘";s:2:"";s:3:"毛";s:2:"";s:3:"毟";s:2:"z";s:3:"毫";s:2:"|";s:3:"毬";s:2:"{";s:3:"毯";s:2:"~";s:3:"毳";s:2:"}";s:3:"氈";s:2:"";s:3:"氏";s:2:"";s:3:"民";s:2:"";s:3:"氓";s:2:"";s:3:"气";s:2:"";s:3:"気";s:2:"C";s:3:"氛";s:2:"";s:3:"氣";s:2:"";s:3:"氤";s:2:"";s:3:"水";s:2:"";s:3:"氷";s:2:"X";s:3:"永";s:2:"i";s:3:"氾";s:2:"";s:3:"氿";s:2:"";s:3:"汀";s:2:"";s:3:"汁";s:2:"`";s:3:"求";s:2:"";s:3:"汎";s:2:"";s:3:"汐";s:2:"";s:3:"汕";s:2:"";s:3:"汗";s:2:"";s:3:"汚";s:2:"";s:3:"汜";s:2:"";s:3:"汝";s:2:"";s:3:"汞";s:2:"";s:3:"江";s:2:"]";s:3:"池";s:2:"r";s:3:"汢";s:2:"";s:3:"汨";s:2:"";s:3:"汪";s:2:"";s:3:"汯";s:2:"";s:3:"汰";s:2:"";s:3:"汲";s:2:"";s:3:"汳";s:2:"";s:3:"決";s:2:"";s:3:"汽";s:2:"D";s:3:"汾";s:2:"";s:3:"沁";s:2:"";s:3:"沂";s:2:"";s:3:"沃";s:2:"";s:3:"沆";s:2:"";s:3:"沈";s:2:"";s:3:"沌";s:2:"";s:3:"沍";s:2:"";s:3:"沐";s:2:"";s:3:"沒";s:2:"";s:3:"沓";s:2:"B";s:3:"沖";s:2:"";s:3:"沙";s:2:"";s:3:"沚";s:2:"";s:3:"沛";s:2:"";s:3:"没";s:2:"v";s:3:"沢";s:2:"";s:3:"沫";s:2:"";s:3:"沮";s:2:"";s:3:"沱";s:2:"";s:3:"河";s:2:"";s:3:"沸";s:2:"";s:3:"油";s:2:"";s:3:"沺";s:2:"";s:3:"治";s:2:"";s:3:"沼";s:2:"";s:3:"沽";s:2:"";s:3:"沾";s:2:"";s:3:"沿";s:2:"";s:3:"況";s:2:"";s:3:"泄";s:2:"";s:3:"泅";s:2:"";s:3:"泉";s:2:"";s:3:"泊";s:2:"";s:3:"泌";s:2:"";s:3:"泓";s:2:"";s:3:"法";s:2:"@";s:3:"泗";s:2:"";s:3:"泙";s:2:"";s:3:"泚";s:2:"";s:3:"泛";s:2:"";s:3:"泝";s:2:"";s:3:"泡";s:2:"A";s:3:"波";s:2:"g";s:3:"泣";s:2:"";s:3:"泥";s:2:"D";s:3:"注";s:2:"";s:3:"泪";s:2:"";s:3:"泯";s:2:"";s:3:"泰";s:2:"";s:3:"泱";s:2:"";s:3:"泳";s:2:"j";s:3:"洄";s:2:"";s:3:"洋";s:2:"m";s:3:"洌";s:2:"";s:3:"洒";s:2:"";s:3:"洗";s:2:"";s:3:"洙";s:2:"";s:3:"洛";s:2:"";s:3:"洞";s:2:"";s:3:"洟";s:2:"";s:3:"津";s:2:"";s:3:"洩";s:2:"k";s:3:"洪";s:2:"^";s:3:"洫";s:2:"";s:3:"洲";s:2:"F";s:3:"洳";s:2:"";s:3:"洵";s:2:"";s:3:"洶";s:2:"";s:3:"洸";s:2:"";s:3:"活";s:2:"";s:3:"洽";s:2:"";s:3:"派";s:2:"h";s:3:"流";s:2:"";s:3:"浄";s:2:"";s:3:"浅";s:2:"";s:3:"浙";s:2:"";s:3:"浚";s:2:"";s:3:"浜";s:2:"l";s:3:"浣";s:2:"";s:3:"浤";s:2:"";s:3:"浦";s:2:"Y";s:3:"浩";s:2:"_";s:3:"浪";s:2:"Q";s:3:"浬";s:2:"\";s:3:"浮";s:2:"";s:3:"浯";s:2:"";s:3:"浴";s:2:"";s:3:"海";s:2:"C";s:3:"浸";s:2:"Z";s:3:"浹";s:2:"";s:3:"涅";s:2:"";s:3:"涇";s:2:"";s:3:"消";s:2:"";s:3:"涌";s:2:"O";s:3:"涎";s:2:"";s:3:"涓";s:2:"";s:3:"涕";s:2:"";s:3:"涖";s:2:"@";s:3:"涙";s:2:"";s:3:"涛";s:2:"";s:3:"涜";s:2:"";s:3:"涬";s:2:"A";s:3:"涯";s:2:"U";s:3:"液";s:2:"t";s:3:"涵";s:2:"";s:3:"涸";s:2:"";s:3:"涼";s:2:"";s:3:"淀";s:2:"";s:3:"淅";s:2:"";s:3:"淆";s:2:"";s:3:"淇";s:2:"";s:3:"淋";s:2:"";s:3:"淌";s:2:"";s:3:"淏";s:2:"B";s:3:"淑";s:2:"i";s:3:"淒";s:2:"";s:3:"淕";s:2:"";s:3:"淘";s:2:"";s:3:"淙";s:2:"";s:3:"淞";s:2:"";s:3:"淡";s:2:"W";s:3:"淤";s:2:"";s:3:"淦";s:2:"";s:3:"淨";s:2:"";s:3:"淪";s:2:"";s:3:"淫";s:2:"";s:3:"淬";s:2:"";s:3:"淮";s:2:"";s:3:"深";s:2:"[";s:3:"淲";s:2:"D";s:3:"淳";s:2:"~";s:3:"淵";s:2:"";s:3:"混";s:2:"";s:3:"淸";s:2:"C";s:3:"淹";s:2:"";s:3:"淺";s:2:"";s:3:"添";s:2:"Y";s:3:"淼";s:2:"E";s:3:"清";s:2:"";s:3:"渇";s:2:"";s:3:"済";s:2:"";s:3:"渉";s:2:"";s:3:"渊";s:2:"";s:3:"渋";s:2:"a";s:3:"渓";s:2:"k";s:3:"渕";s:2:"";s:3:"渙";s:2:"";s:3:"渚";s:2:"";s:3:"減";s:2:"";s:3:"渝";s:2:"";s:3:"渟";s:2:"";s:3:"渠";s:2:"";s:3:"渡";s:2:"n";s:3:"渣";s:2:"";s:3:"渤";s:2:"";s:3:"渥";s:2:"";s:3:"渦";s:2:"Q";s:3:"渧";s:2:"H";s:3:"温";s:2:"";s:3:"渫";s:2:"";s:3:"測";s:2:"";s:3:"渭";s:2:"";s:3:"渮";s:2:"";s:3:"港";s:2:"`";s:3:"游";s:2:"";s:3:"渹";s:2:"F";s:3:"渺";s:2:"";s:3:"渼";s:2:"I";s:3:"渾";s:2:"";s:3:"湃";s:2:"";s:3:"湊";s:2:"";s:3:"湍";s:2:"";s:3:"湎";s:2:"";s:3:"湖";s:2:"";s:3:"湘";s:2:"";s:3:"湛";s:2:"X";s:3:"湜";s:2:"G";s:3:"湟";s:2:"";s:3:"湧";s:2:"N";s:3:"湫";s:2:"";s:3:"湮";s:2:"";s:3:"湯";s:2:"";s:3:"湲";s:2:"";s:3:"湶";s:2:"";s:3:"湾";s:2:"p";s:3:"湿";s:2:"";s:3:"満";s:2:"";s:3:"溂";s:2:"";s:3:"溌";s:2:"";s:3:"溏";s:2:"";s:3:"源";s:2:"";s:3:"準";s:2:"";s:3:"溘";s:2:"";s:3:"溜";s:2:"";s:3:"溝";s:2:"a";s:3:"溟";s:2:"";s:3:"溢";s:2:"";s:3:"溥";s:2:"";s:3:"溪";s:2:"";s:3:"溯";s:2:"";s:3:"溲";s:2:"";s:3:"溶";s:2:"n";s:3:"溷";s:2:"";s:3:"溺";s:2:"M";s:3:"溽";s:2:"";s:3:"溿";s:2:"J";s:3:"滂";s:2:"";s:3:"滄";s:2:"";s:3:"滅";s:2:"";s:3:"滉";s:2:"";s:3:"滋";s:2:"";s:3:"滌";s:2:"";s:3:"滑";s:2:"";s:3:"滓";s:2:"";s:3:"滔";s:2:"";s:3:"滕";s:2:"";s:3:"滝";s:2:"";s:3:"滞";s:2:"";s:3:"滬";s:2:"";s:3:"滯";s:2:"";s:3:"滲";s:2:"";s:3:"滴";s:2:"H";s:3:"滷";s:2:"B";s:3:"滸";s:2:"";s:3:"滾";s:2:"";s:3:"滿";s:2:"";s:3:"漁";s:2:"";s:3:"漂";s:2:"Y";s:3:"漆";s:2:"";s:3:"漉";s:2:"";s:3:"漏";s:2:"R";s:3:"漑";s:2:"";s:3:"漓";s:2:"A";s:3:"演";s:2:"";s:3:"漕";s:2:"";s:3:"漠";s:2:"";s:3:"漢";s:2:"";s:3:"漣";s:2:"";s:3:"漫";s:2:"";s:3:"漬";s:2:"";s:3:"漱";s:2:"";s:3:"漲";s:2:"";s:3:"漸";s:2:"Q";s:3:"漾";s:2:"@";s:3:"漿";s:2:"";s:3:"潁";s:2:"";s:3:"潅";s:2:"";s:3:"潔";s:2:"";s:3:"潘";s:2:"N";s:3:"潛";s:2:"I";s:3:"潜";s:2:"";s:3:"潟";s:2:"";s:3:"潤";s:2:"";s:3:"潦";s:2:"R";s:3:"潭";s:2:"K";s:3:"潮";s:2:"";s:3:"潯";s:2:"H";s:3:"潰";s:2:"";s:3:"潴";s:2:"k";s:3:"潸";s:2:"E";s:3:"潺";s:2:"D";s:3:"潼";s:2:"M";s:3:"澀";s:2:"G";s:3:"澁";s:2:"F";s:3:"澂";s:2:"L";s:3:"澄";s:2:"";s:3:"澆";s:2:"C";s:3:"澈";s:2:"K";s:3:"澎";s:2:"O";s:3:"澑";s:2:"P";s:3:"澗";s:2:"";s:3:"澡";s:2:"U";s:3:"澣";s:2:"T";s:3:"澤";s:2:"V";s:3:"澪";s:2:"Y";s:3:"澱";s:2:"b";s:3:"澳";s:2:"S";s:3:"澵";s:2:"L";s:3:"澹";s:2:"W";s:3:"激";s:2:"";s:3:"濁";s:2:"";s:3:"濂";s:2:"Q";s:3:"濃";s:2:"Z";s:3:"濆";s:2:"X";s:3:"濔";s:2:"]";s:3:"濕";s:2:"[";s:3:"濘";s:2:"^";s:3:"濛";s:2:"a";s:3:"濟";s:2:"Z";s:3:"濠";s:2:"";s:3:"濡";s:2:"G";s:3:"濤";s:2:"";s:3:"濫";s:2:"";s:3:"濬";s:2:"\";s:3:"濮";s:2:"`";s:3:"濯";s:2:"";s:3:"濱";s:2:"_";s:3:"濳";s:2:"J";s:3:"濵";s:2:"M";s:3:"濶";s:2:"";s:3:"濺";s:2:"d";s:3:"濾";s:2:"h";s:3:"瀁";s:2:"f";s:3:"瀅";s:2:"N";s:3:"瀇";s:2:"O";s:3:"瀉";s:2:"b";s:3:"瀋";s:2:"c";s:3:"瀏";s:2:"g";s:3:"瀑";s:2:"e";s:3:"瀕";s:2:"m";s:3:"瀘";s:2:"m";s:3:"瀚";s:2:"j";s:3:"瀛";s:2:"i";s:3:"瀝";s:2:"l";s:3:"瀞";s:2:"";s:3:"瀟";s:2:"n";s:3:"瀦";s:2:"";s:3:"瀧";s:2:"";s:3:"瀨";s:2:"P";s:3:"瀬";s:2:"";s:3:"瀰";s:2:"o";s:3:"瀲";s:2:"q";s:3:"瀾";s:2:"p";s:3:"灌";s:2:"";s:3:"灑";s:2:"r";s:3:"灘";s:2:"";s:3:"灣";s:2:"s";s:3:"火";s:2:"";s:3:"灯";s:2:"";s:3:"灰";s:2:"D";s:3:"灸";s:2:"";s:3:"灼";s:2:"";s:3:"災";s:2:"";s:3:"炅";s:2:"Q";s:3:"炉";s:2:"F";s:3:"炊";s:2:"";s:3:"炎";s:2:"";s:3:"炒";s:2:"u";s:3:"炙";s:2:"t";s:3:"炫";s:2:"R";s:3:"炬";s:2:"x";s:3:"炭";s:2:"Y";s:3:"炮";s:2:"{";s:3:"炯";s:2:"v";s:3:"炳";s:2:"z";s:3:"炸";s:2:"y";s:3:"点";s:2:"_";s:3:"為";s:2:"";s:3:"炻";s:2:"b";s:3:"烈";s:2:"";s:3:"烋";s:2:"}";s:3:"烏";s:2:"G";s:3:"烙";s:2:"";s:3:"烝";s:2:"~";s:3:"烟";s:2:"|";s:3:"烱";s:2:"w";s:3:"烹";s:2:"B";s:3:"烽";s:2:"";s:3:"焄";s:2:"T";s:3:"焉";s:2:"";s:3:"焏";s:2:"S";s:3:"焔";s:2:"";s:3:"焙";s:2:"";s:3:"焚";s:2:"";s:3:"焜";s:2:"";s:3:"無";s:2:"";s:3:"焦";s:2:"";s:3:"然";s:2:"R";s:3:"焼";s:2:"";s:3:"煆";s:2:"V";s:3:"煇";s:2:"W";s:3:"煉";s:2:"";s:3:"煌";s:2:"";s:3:"煎";s:2:"";s:3:"煕";s:2:"";s:3:"煖";s:2:"";s:3:"煙";s:2:"";s:3:"煜";s:2:"U";s:3:"煢";s:2:"";s:3:"煤";s:2:"";s:3:"煥";s:2:"";s:3:"煦";s:2:"";s:3:"照";s:2:"";s:3:"煩";s:2:"";s:3:"煬";s:2:"";s:3:"煮";s:2:"";s:3:"煽";s:2:"";s:3:"熄";s:2:"";s:3:"熈";s:2:"";s:3:"熊";s:2:"F";s:3:"熏";s:2:"";s:3:"熔";s:2:"o";s:3:"熕";s:2:"";s:3:"熙";s:2:"";s:3:"熟";s:2:"n";s:3:"熨";s:2:"";s:3:"熬";s:2:"";s:3:"熱";s:2:"M";s:3:"熹";s:2:"";s:3:"熾";s:2:"";s:3:"燁";s:2:"Y";s:3:"燃";s:2:"R";s:3:"燈";s:2:"";s:3:"燉";s:2:"";s:3:"燎";s:2:"";s:3:"燐";s:2:"";s:3:"燒";s:2:"";s:3:"燔";s:2:"";s:3:"燕";s:2:"";s:3:"燗";s:2:"";s:3:"營";s:2:"z";s:3:"燠";s:2:"";s:3:"燥";s:2:"";s:3:"燦";s:2:"W";s:3:"燧";s:2:"";s:3:"燬";s:2:"";s:3:"燭";s:2:"C";s:3:"燮";s:2:"";s:3:"燵";s:2:"";s:3:"燹";s:2:"";s:3:"燻";s:2:"";s:3:"燼";s:2:"";s:3:"燾";s:2:"Z";s:3:"燿";s:2:"";s:3:"爆";s:2:"";s:3:"爍";s:2:"";s:3:"爐";s:2:"";s:3:"爛";s:2:"";s:3:"爨";s:2:"";s:3:"爪";s:2:"";s:3:"爬";s:2:"";s:3:"爭";s:2:"";s:3:"爰";s:2:"";s:3:"爲";s:2:"";s:3:"爵";s:2:"";s:3:"父";s:2:"";s:3:"爺";s:2:"";s:3:"爻";s:2:"";s:3:"爼";s:2:"";s:3:"爽";s:2:"u";s:3:"爾";s:2:"";s:3:"爿";s:2:"";s:3:"牀";s:2:"";s:3:"牆";s:2:"";s:3:"片";s:2:"";s:3:"版";s:2:"";s:3:"牋";s:2:"";s:3:"牌";s:2:"v";s:3:"牒";s:2:"";s:3:"牘";s:2:"";s:3:"牙";s:2:"";s:3:"牛";s:2:"";s:3:"牝";s:2:"";s:3:"牟";s:2:"";s:3:"牡";s:2:"";s:3:"牢";s:2:"S";s:3:"牧";s:2:"q";s:3:"物";s:2:"";s:3:"牲";s:2:"";s:3:"牴";s:2:"";s:3:"特";s:2:"";s:3:"牽";s:2:"";s:3:"牾";s:2:"";s:3:"犀";s:2:"";s:3:"犁";s:2:"";s:3:"犂";s:2:"";s:3:"犇";s:2:"";s:3:"犒";s:2:"";s:3:"犖";s:2:"";s:3:"犠";s:2:"]";s:3:"犢";s:2:"";s:3:"犧";s:2:"";s:3:"犬";s:2:"";s:3:"犯";s:2:"";s:3:"犱";s:2:"[";s:3:"犲";s:2:"";s:3:"状";s:2:"";s:3:"犹";s:2:"";s:3:"犾";s:2:"\";s:3:"狂";s:2:"";s:3:"狃";s:2:"";s:3:"狄";s:2:"";s:3:"狆";s:2:"";s:3:"狎";s:2:"";s:3:"狐";s:2:"";s:3:"狒";s:2:"";s:3:"狗";s:2:"";s:3:"狙";s:2:"_";s:3:"狛";s:2:"";s:3:"狠";s:2:"";s:3:"狡";s:2:"";s:3:"狢";s:2:"";s:3:"狩";s:2:"";s:3:"独";s:2:"";s:3:"狭";s:2:"";s:3:"狷";s:2:"";s:3:"狸";s:2:"K";s:3:"狹";s:2:"";s:3:"狼";s:2:"T";s:3:"狽";s:2:"";s:3:"猊";s:2:"";s:3:"猖";s:2:"";s:3:"猗";s:2:"";s:3:"猛";s:2:"";s:3:"猜";s:2:"";s:3:"猝";s:2:"";s:3:"猟";s:2:"";s:3:"猤";s:2:"]";s:3:"猥";s:2:"";s:3:"猩";s:2:"";s:3:"猪";s:2:"";s:3:"猫";s:2:"L";s:3:"献";s:2:"";s:3:"猯";s:2:"";s:3:"猴";s:2:"";s:3:"猶";s:2:"P";s:3:"猷";s:2:"Q";s:3:"猾";s:2:"";s:3:"猿";s:2:"";s:3:"獄";s:2:"";s:3:"獅";s:2:"";s:3:"獎";s:2:"";s:3:"獏";s:2:"";s:3:"獗";s:2:"";s:3:"獣";s:2:"b";s:3:"獨";s:2:"";s:3:"獪";s:2:"";s:3:"獰";s:2:"";s:3:"獲";s:2:"l";s:3:"獵";s:2:"";s:3:"獷";s:2:"_";s:3:"獸";s:2:"";s:3:"獺";s:2:"";s:3:"獻";s:2:"";s:3:"玄";s:2:"";s:3:"率";s:2:"";s:3:"玉";s:2:"";s:3:"王";s:2:"";s:3:"玖";s:2:"";s:3:"玩";s:2:"";s:3:"玲";s:2:"";s:3:"玳";s:2:"";s:3:"玻";s:2:"";s:3:"玽";s:2:"`";s:3:"珀";s:2:"";s:3:"珂";s:2:"";s:3:"珈";s:2:"";s:3:"珉";s:2:"a";s:3:"珊";s:2:"X";s:3:"珍";s:2:"";s:3:"珎";s:2:"";s:3:"珒";s:2:"d";s:3:"珖";s:2:"b";s:3:"珞";s:2:"";s:3:"珠";s:2:"";s:3:"珣";s:2:"c";s:3:"珥";s:2:"";s:3:"珪";s:2:"]";s:3:"班";s:2:"";s:3:"珮";s:2:"";s:3:"珱";s:2:"";s:3:"珵";s:2:"f";s:3:"珸";s:2:"";s:3:"現";s:2:"";s:3:"球";s:2:"";s:3:"琅";s:2:"";s:3:"理";s:2:"";s:3:"琇";s:2:"e";s:3:"琉";s:2:"";s:3:"琢";s:2:"";s:3:"琥";s:2:"";s:3:"琦";s:2:"g";s:3:"琩";s:2:"i";s:3:"琪";s:2:"h";s:3:"琮";s:2:"j";s:3:"琲";s:2:"";s:3:"琳";s:2:"";s:3:"琴";s:2:"";s:3:"琵";s:2:"";s:3:"琶";s:2:"i";s:3:"琺";s:2:"";s:3:"琿";s:2:"";s:3:"瑁";s:2:"";s:3:"瑕";s:2:"";s:3:"瑙";s:2:"";s:3:"瑚";s:2:"";s:3:"瑛";s:2:"l";s:3:"瑜";s:2:"";s:3:"瑞";s:2:"";s:3:"瑟";s:2:"";s:3:"瑠";s:2:"";s:3:"瑢";s:2:"k";s:3:"瑣";s:2:"";s:3:"瑤";s:2:"";s:3:"瑩";s:2:"";s:3:"瑪";s:2:"";s:3:"瑯";s:2:"";s:3:"瑰";s:2:"";s:3:"瑳";s:2:"";s:3:"瑶";s:2:"";s:3:"瑾";s:2:"";s:3:"璃";s:2:"";s:3:"璉";s:2:"l";s:3:"璋";s:2:"";s:3:"璞";s:2:"";s:3:"璟";s:2:"m";s:3:"璢";s:2:"";s:3:"璧";s:2:"";s:3:"環";s:2:"";s:3:"璽";s:2:"";s:3:"瓊";s:2:"";s:3:"瓏";s:2:"";s:3:"瓔";s:2:"";s:3:"瓜";s:2:"Z";s:3:"瓠";s:2:"@";s:3:"瓢";s:2:"Z";s:3:"瓣";s:2:"A";s:3:"瓦";s:2:"";s:3:"瓧";s:2:"B";s:3:"瓩";s:2:"C";s:3:"瓮";s:2:"D";s:3:"瓰";s:2:"F";s:3:"瓱";s:2:"G";s:3:"瓲";s:2:"E";s:3:"瓶";s:2:"r";s:3:"瓷";s:2:"I";s:3:"瓸";s:2:"H";s:3:"甁";s:2:"n";s:3:"甃";s:2:"K";s:3:"甄";s:2:"J";s:3:"甅";s:2:"L";s:3:"甌";s:2:"M";s:3:"甍";s:2:"O";s:3:"甎";s:2:"N";s:3:"甑";s:2:"";s:3:"甓";s:2:"Q";s:3:"甕";s:2:"P";s:3:"甘";s:2:"";s:3:"甚";s:2:"r";s:3:"甜";s:2:"[";s:3:"甞";s:2:"R";s:3:"生";s:2:"";s:3:"産";s:2:"Y";s:3:"甥";s:2:"";s:3:"甦";s:2:"S";s:3:"用";s:2:"p";s:3:"甫";s:2:"";s:3:"甬";s:2:"T";s:3:"甯";s:2:"";s:3:"田";s:2:"c";s:3:"由";s:2:"R";s:3:"甲";s:2:"b";s:3:"申";s:2:"\";s:3:"男";s:2:"j";s:3:"甸";s:2:"";s:3:"町";s:2:"";s:3:"画";s:2:"";s:3:"甼";s:2:"U";s:3:"畄";s:2:"V";s:3:"畆";s:2:"[";s:3:"畉";s:2:"Y";s:3:"畊";s:2:"X";s:3:"畋";s:2:"";s:3:"界";s:2:"E";s:3:"畍";s:2:"W";s:3:"畏";s:2:"";s:3:"畑";s:2:"";s:3:"畔";s:2:"";s:3:"留";s:2:"";s:3:"畚";s:2:"\";s:3:"畛";s:2:"Z";s:3:"畜";s:2:"{";s:3:"畝";s:2:"";s:3:"畠";s:2:"";s:3:"畢";s:2:"L";s:3:"畤";s:2:"^";s:3:"略";s:2:"";s:3:"畦";s:2:"l";s:3:"畧";s:2:"_";s:3:"畩";s:2:"]";s:3:"番";s:2:"";s:3:"畫";s:2:"`";s:3:"畭";s:2:"a";s:3:"畯";s:2:"o";s:3:"異";s:2:"";s:3:"畳";s:2:"";s:3:"畴";s:2:"f";s:3:"當";s:2:"c";s:3:"畷";s:2:"";s:3:"畸";s:2:"b";s:3:"畿";s:2:"E";s:3:"疂";s:2:"i";s:3:"疆";s:2:"d";s:3:"疇";s:2:"e";s:3:"疉";s:2:"h";s:3:"疊";s:2:"g";s:3:"疋";s:2:"D";s:3:"疎";s:2:"a";s:3:"疏";s:2:"`";s:3:"疑";s:2:"^";s:3:"疔";s:2:"j";s:3:"疚";s:2:"k";s:3:"疝";s:2:"l";s:3:"疣";s:2:"n";s:3:"疥";s:2:"m";s:3:"疫";s:2:"u";s:3:"疱";s:2:"v";s:3:"疲";s:2:"";s:3:"疳";s:2:"p";s:3:"疵";s:2:"r";s:3:"疸";s:2:"t";s:3:"疹";s:2:"]";s:3:"疼";s:2:"u";s:3:"疽";s:2:"s";s:3:"疾";s:2:"";s:3:"痂";s:2:"o";s:3:"痃";s:2:"q";s:3:"病";s:2:"a";s:3:"症";s:2:"";s:3:"痊";s:2:"x";s:3:"痍";s:2:"w";s:3:"痒";s:2:"y";s:3:"痔";s:2:"";s:3:"痕";s:2:"";s:3:"痘";s:2:"";s:3:"痙";s:2:"z";s:3:"痛";s:2:"";s:3:"痞";s:2:"|";s:3:"痢";s:2:"";s:3:"痣";s:2:"{";s:3:"痩";s:2:"";s:3:"痰";s:2:"";s:3:"痲";s:2:"";s:3:"痳";s:2:"";s:3:"痴";s:2:"s";s:3:"痺";s:2:"";s:3:"痼";s:2:"";s:3:"痾";s:2:"}";s:3:"痿";s:2:"~";s:3:"瘁";s:2:"";s:3:"瘉";s:2:"";s:3:"瘋";s:2:"";s:3:"瘍";s:2:"";s:3:"瘟";s:2:"";s:3:"瘠";s:2:"";s:3:"瘡";s:2:"";s:3:"瘢";s:2:"";s:3:"瘤";s:2:"";s:3:"瘧";s:2:"";s:3:"瘰";s:2:"";s:3:"瘴";s:2:"";s:3:"瘻";s:2:"";s:3:"療";s:2:"";s:3:"癆";s:2:"";s:3:"癇";s:2:"";s:3:"癈";s:2:"";s:3:"癌";s:2:"";s:3:"癒";s:2:"";s:3:"癖";s:2:"";s:3:"癘";s:2:"";s:3:"癜";s:2:"";s:3:"癡";s:2:"";s:3:"癢";s:2:"";s:3:"癧";s:2:"";s:3:"癨";s:2:"";s:3:"癩";s:2:"";s:3:"癪";s:2:"";s:3:"癬";s:2:"";s:3:"癰";s:2:"";s:3:"癲";s:2:"";s:3:"癶";s:2:"";s:3:"癸";s:2:"";s:3:"発";s:2:"";s:3:"登";s:2:"o";s:3:"發";s:2:"";s:3:"白";s:2:"";s:3:"百";s:2:"S";s:3:"皀";s:2:"";s:3:"皂";s:2:"p";s:3:"皃";s:2:"";s:3:"的";s:2:"I";s:3:"皆";s:2:"F";s:3:"皇";s:2:"c";s:3:"皈";s:2:"";s:3:"皋";s:2:"";s:3:"皎";s:2:"";s:3:"皐";s:2:"H";s:3:"皓";s:2:"";s:3:"皖";s:2:"";s:3:"皙";s:2:"";s:3:"皚";s:2:"";s:3:"皛";s:2:"s";s:3:"皜";s:2:"q";s:3:"皞";s:2:"r";s:3:"皦";s:2:"t";s:3:"皮";s:2:"";s:3:"皰";s:2:"";s:3:"皴";s:2:"";s:3:"皷";s:2:"";s:3:"皸";s:2:"";s:3:"皹";s:2:"";s:3:"皺";s:2:"";s:3:"皿";s:2:"M";s:3:"盂";s:2:"";s:3:"盃";s:2:"u";s:3:"盆";s:2:"~";s:3:"盈";s:2:"m";s:3:"益";s:2:"v";s:3:"盍";s:2:"";s:3:"盒";s:2:"";s:3:"盖";s:2:"";s:3:"盗";s:2:"";s:3:"盛";s:2:"";s:3:"盜";s:2:"X";s:3:"盞";s:2:"";s:3:"盟";s:2:"";s:3:"盡";s:2:"";s:3:"監";s:2:"";s:3:"盤";s:2:"";s:3:"盥";s:2:"";s:3:"盧";s:2:"";s:3:"盪";s:2:"";s:3:"目";s:2:"";s:3:"盲";s:2:"";s:3:"直";s:2:"";s:3:"相";s:2:"";s:3:"盻";s:2:"";s:3:"盾";s:2:"";s:3:"省";s:2:"";s:3:"眄";s:2:"";s:3:"眇";s:2:"";s:3:"眈";s:2:"";s:3:"眉";s:2:"";s:3:"看";s:2:"";s:3:"県";s:2:"";s:3:"眛";s:2:"";s:3:"眞";s:2:"";s:3:"真";s:2:"^";s:3:"眠";s:2:"";s:3:"眤";s:2:"";s:3:"眥";s:2:"";s:3:"眦";s:2:"";s:3:"眩";s:2:"";s:3:"眷";s:2:"";s:3:"眸";s:2:"";s:3:"眺";s:2:"";s:3:"眼";s:2:"";s:3:"着";s:2:"";s:3:"睆";s:2:"v";s:3:"睇";s:2:"";s:3:"睚";s:2:"";s:3:"睛";s:2:"";s:3:"睡";s:2:"";s:3:"督";s:2:"";s:3:"睥";s:2:"";s:3:"睦";s:2:"r";s:3:"睨";s:2:"";s:3:"睫";s:2:"";s:3:"睹";s:2:"";s:3:"睾";s:2:"";s:3:"睿";s:2:"";s:3:"瞋";s:2:"";s:3:"瞎";s:2:"";s:3:"瞑";s:2:"";s:3:"瞞";s:2:"";s:3:"瞠";s:2:"";s:3:"瞥";s:2:"";s:3:"瞬";s:2:"u";s:3:"瞭";s:2:"";s:3:"瞰";s:2:"";s:3:"瞳";s:2:"";s:3:"瞶";s:2:"";s:3:"瞹";s:2:"";s:3:"瞻";s:2:"";s:3:"瞼";s:2:"";s:3:"瞽";s:2:"";s:3:"瞿";s:2:"";s:3:"矇";s:2:"";s:3:"矍";s:2:"";s:3:"矗";s:2:"";s:3:"矚";s:2:"";s:3:"矛";s:2:"";s:3:"矜";s:2:"";s:3:"矢";s:2:"";s:3:"矣";s:2:"";s:3:"知";s:2:"m";s:3:"矧";s:2:"";s:3:"矩";s:2:"";s:3:"短";s:2:"Z";s:3:"矮";s:2:"";s:3:"矯";s:2:"";s:3:"石";s:2:"";s:3:"矼";s:2:"";s:3:"砂";s:2:"";s:3:"砌";s:2:"";s:3:"砒";s:2:"";s:3:"研";s:2:"";s:3:"砕";s:2:"";s:3:"砠";s:2:"";s:3:"砡";s:2:"x";s:3:"砥";s:2:"u";s:3:"砦";s:2:"";s:3:"砧";s:2:"m";s:3:"砲";s:2:"C";s:3:"破";s:2:"j";s:3:"砺";s:2:"v";s:3:"砿";s:2:"{";s:3:"硅";s:2:"";s:3:"硎";s:2:"y";s:3:"硝";s:2:"";s:3:"硤";s:2:"z";s:3:"硫";s:2:"";s:3:"硬";s:2:"d";s:3:"硯";s:2:"";s:3:"硲";s:2:"";s:3:"硴";s:2:"";s:3:"硺";s:2:"{";s:3:"硼";s:2:"";s:3:"碁";s:2:"";s:3:"碆";s:2:"";s:3:"碇";s:2:"";s:3:"碌";s:2:"";s:3:"碍";s:2:"V";s:3:"碎";s:2:"";s:3:"碑";s:2:"";s:3:"碓";s:2:"O";s:3:"碕";s:2:"";s:3:"碗";s:2:"q";s:3:"碚";s:2:"";s:3:"碣";s:2:"";s:3:"碧";s:2:"";s:3:"碩";s:2:"";s:3:"碪";s:2:"";s:3:"碯";s:2:"";s:3:"碵";s:2:"";s:3:"確";s:2:"m";s:3:"碼";s:2:"";s:3:"碾";s:2:"";s:3:"磁";s:2:"";s:3:"磅";s:2:"";s:3:"磆";s:2:"";s:3:"磊";s:2:"";s:3:"磋";s:2:"";s:3:"磐";s:2:"";s:3:"磑";s:2:"";s:3:"磔";s:2:"";s:3:"磚";s:2:"A";s:3:"磧";s:2:"@";s:3:"磨";s:2:"";s:3:"磬";s:2:"";s:3:"磯";s:2:"";s:3:"磴";s:2:"C";s:3:"磽";s:2:"B";s:3:"礁";s:2:"";s:3:"礇";s:2:"D";s:3:"礎";s:2:"b";s:3:"礑";s:2:"F";s:3:"礒";s:2:"E";s:3:"礙";s:2:"G";s:3:"礦";s:2:"";s:3:"礪";s:2:"";s:3:"礫";s:2:"I";s:3:"礬";s:2:"H";s:3:"礰";s:2:"|";s:3:"示";s:2:"";s:3:"礼";s:2:"";s:3:"社";s:2:"";s:3:"祀";s:2:"J";s:3:"祁";s:2:"V";s:3:"祇";s:2:"_";s:3:"祈";s:2:"F";s:3:"祉";s:2:"";s:3:"祐";s:2:"S";s:3:"祓";s:2:"P";s:3:"祕";s:2:"O";s:3:"祖";s:2:"c";s:3:"祗";s:2:"L";s:3:"祚";s:2:"N";s:3:"祝";s:2:"j";s:3:"神";s:2:"_";s:3:"祟";s:2:"M";s:3:"祠";s:2:"K";s:3:"祢";s:2:"I";s:3:"祥";s:2:"";s:3:"票";s:2:"[";s:3:"祭";s:2:"";s:3:"祷";s:2:"";s:3:"祺";s:2:"Q";s:3:"祿";s:2:"R";s:3:"禀";s:2:"h";s:3:"禁";s:2:"";s:3:"禄";s:2:"\";s:3:"禅";s:2:"T";s:3:"禊";s:2:"S";s:3:"禍";s:2:"";s:3:"禎";s:2:"";s:3:"福";s:2:"";s:3:"禔";s:2:"";s:3:"禛";s:2:"";s:3:"禝";s:2:"T";s:3:"禦";s:2:"";s:3:"禧";s:2:"U";s:3:"禪";s:2:"W";s:3:"禮";s:2:"X";s:3:"禰";s:2:"H";s:3:"禳";s:2:"Y";s:3:"禹";s:2:"Z";s:3:"禺";s:2:"[";s:3:"禽";s:2:"";s:3:"禾";s:2:"";s:3:"禿";s:2:"";s:3:"秀";s:2:"G";s:3:"私";s:2:"";s:3:"秉";s:2:"\";s:3:"秋";s:2:"H";s:3:"科";s:2:"";s:3:"秒";s:2:"b";s:3:"秕";s:2:"]";s:3:"秘";s:2:"";s:3:"租";s:2:"d";s:3:"秡";s:2:"`";s:3:"秣";s:2:"a";s:3:"秤";s:2:"";s:3:"秦";s:2:"`";s:3:"秧";s:2:"^";s:3:"秩";s:2:"";s:3:"秬";s:2:"_";s:3:"称";s:2:"";s:3:"移";s:2:"";s:3:"稀";s:2:"H";s:3:"稈";s:2:"b";s:3:"程";s:2:"";s:3:"稍";s:2:"c";s:3:"税";s:2:"";s:3:"稔";s:2:"";s:3:"稗";s:2:"B";s:3:"稘";s:2:"d";s:3:"稙";s:2:"e";s:3:"稚";s:2:"t";s:3:"稜";s:2:"";s:3:"稟";s:2:"g";s:3:"稠";s:2:"f";s:3:"種";s:2:"";s:3:"稱";s:2:"i";s:3:"稲";s:2:"";s:3:"稷";s:2:"l";s:3:"稻";s:2:"j";s:3:"稼";s:2:"";s:3:"稽";s:2:"m";s:3:"稾";s:2:"k";s:3:"稿";s:2:"e";s:3:"穀";s:2:"";s:3:"穂";s:2:"";s:3:"穃";s:2:"m";s:3:"穆";s:2:"s";s:3:"穉";s:2:"o";s:3:"積";s:2:"";s:3:"穎";s:2:"n";s:3:"穏";s:2:"";s:3:"穐";s:2:"";s:3:"穗";s:2:"n";s:3:"穡";s:2:"p";s:3:"穢";s:2:"q";s:3:"穣";s:2:"";s:3:"穩";s:2:"r";s:3:"穫";s:2:"n";s:3:"穰";s:2:"t";s:3:"穴";s:2:"";s:3:"究";s:2:"";s:3:"穹";s:2:"u";s:3:"空";s:2:"";s:3:"穽";s:2:"v";s:3:"穿";s:2:"";s:3:"突";s:2:"";s:3:"窃";s:2:"";s:3:"窄";s:2:"";s:3:"窈";s:2:"w";s:3:"窒";s:2:"";s:3:"窓";s:2:"";s:3:"窕";s:2:"y";s:3:"窖";s:2:"{";s:3:"窗";s:2:"x";s:3:"窘";s:2:"z";s:3:"窟";s:2:"A";s:3:"窩";s:2:"|";s:3:"窪";s:2:"E";s:3:"窮";s:2:"";s:3:"窯";s:2:"q";s:3:"窰";s:2:"~";s:3:"窶";s:2:"";s:3:"窺";s:2:"M";s:3:"窿";s:2:"";s:3:"竃";s:2:"";s:3:"竄";s:2:"";s:3:"竅";s:2:"";s:3:"竇";s:2:"";s:3:"竈";s:2:"}";s:3:"竊";s:2:"";s:3:"立";s:2:"";s:3:"竍";s:2:"";s:3:"竏";s:2:"";s:3:"竑";s:2:"";s:3:"竒";s:2:"";s:3:"竓";s:2:"";s:3:"竕";s:2:"";s:3:"站";s:2:"";s:3:"竚";s:2:"";s:3:"竜";s:2:"";s:3:"竝";s:2:"";s:3:"竟";s:2:"";s:3:"章";s:2:"";s:3:"竡";s:2:"";s:3:"竢";s:2:"";s:3:"竣";s:2:"v";s:3:"童";s:2:"";s:3:"竦";s:2:"";s:3:"竧";s:2:"";s:3:"竪";s:2:"G";s:3:"竫";s:2:"";s:3:"竭";s:2:"";s:3:"端";s:2:"[";s:3:"竰";s:2:"";s:3:"競";s:2:"";s:3:"竸";s:2:"^";s:3:"竹";s:2:"|";s:3:"竺";s:2:"";s:3:"竿";s:2:"";s:3:"笂";s:2:"";s:3:"笄";s:2:"";s:3:"笆";s:2:"";s:3:"笈";s:2:"";s:3:"笊";s:2:"";s:3:"笋";s:2:"";s:3:"笏";s:2:"";s:3:"笑";s:2:"";s:3:"笘";s:2:"";s:3:"笙";s:2:"";s:3:"笛";s:2:"J";s:3:"笞";s:2:"";s:3:"笠";s:2:"}";s:3:"笥";s:2:"y";s:3:"符";s:2:"";s:3:"笨";s:2:"";s:3:"第";s:2:"";s:3:"笳";s:2:"";s:3:"笵";s:2:"";s:3:"笶";s:2:"";s:3:"笹";s:2:"";s:3:"筅";s:2:"";s:3:"筆";s:2:"M";s:3:"筈";s:2:"";s:3:"等";s:2:"";s:3:"筋";s:2:"";s:3:"筌";s:2:"";s:3:"筍";s:2:"";s:3:"筏";s:2:"";s:3:"筐";s:2:"";s:3:"筑";s:2:"}";s:3:"筒";s:2:"";s:3:"答";s:2:"";s:3:"策";s:2:"";s:3:"筝";s:2:"";s:3:"筥";s:2:"";s:3:"筧";s:2:"";s:3:"筬";s:2:"";s:3:"筮";s:2:"";s:3:"筰";s:2:"";s:3:"筱";s:2:"";s:3:"筴";s:2:"";s:3:"筵";s:2:"";s:3:"筺";s:2:"";s:3:"箆";s:2:"";s:3:"箇";s:2:"";s:3:"箋";s:2:"";s:3:"箍";s:2:"";s:3:"箏";s:2:"";s:3:"箒";s:2:"";s:3:"箔";s:2:"";s:3:"箕";s:2:"";s:3:"算";s:2:"Z";s:3:"箘";s:2:"";s:3:"箙";s:2:"";s:3:"箚";s:2:"";s:3:"箜";s:2:"";s:3:"箝";s:2:"";s:3:"箞";s:2:"";s:3:"箟";s:2:"";s:3:"管";s:2:"";s:3:"箪";s:2:"\";s:3:"箭";s:2:"";s:3:"箱";s:2:"";s:3:"箴";s:2:"";s:3:"箸";s:2:"";s:3:"節";s:2:"";s:3:"篁";s:2:"";s:3:"範";s:2:"";s:3:"篆";s:2:"";s:3:"篇";s:2:"";s:3:"築";s:2:"z";s:3:"篋";s:2:"";s:3:"篌";s:2:"";s:3:"篏";s:2:"";s:3:"篝";s:2:"";s:3:"篠";s:2:"";s:3:"篤";s:2:"";s:3:"篥";s:2:"";s:3:"篦";s:2:"";s:3:"篩";s:2:"";s:3:"篭";s:2:"U";s:3:"篳";s:2:"";s:3:"篶";s:2:"";s:3:"篷";s:2:"";s:3:"簀";s:2:"";s:3:"簇";s:2:"";s:3:"簍";s:2:"";s:3:"簑";s:2:"";s:3:"簒";s:2:"";s:3:"簓";s:2:"";s:3:"簔";s:2:"";s:3:"簗";s:2:"";s:3:"簟";s:2:"";s:3:"簡";s:2:"";s:3:"簣";s:2:"";s:3:"簧";s:2:"";s:3:"簪";s:2:"";s:3:"簫";s:2:"";s:3:"簷";s:2:"";s:3:"簸";s:2:"";s:3:"簽";s:2:"";s:3:"簾";s:2:"";s:3:"簿";s:2:"";s:3:"籀";s:2:"";s:3:"籃";s:2:"";s:3:"籌";s:2:"";s:3:"籍";s:2:"";s:3:"籏";s:2:"";s:3:"籐";s:2:"";s:3:"籔";s:2:"";s:3:"籖";s:2:"";s:3:"籘";s:2:"";s:3:"籟";s:2:"";s:3:"籠";s:2:"";s:3:"籤";s:2:"";s:3:"籥";s:2:"";s:3:"籬";s:2:"";s:3:"米";s:2:"";s:3:"籵";s:2:"";s:3:"籾";s:2:"";s:3:"粁";s:2:"";s:3:"粂";s:2:"H";s:3:"粃";s:2:"";s:3:"粉";s:2:"";s:3:"粋";s:2:"";s:3:"粍";s:2:"";s:3:"粐";s:2:"";s:3:"粒";s:2:"";s:3:"粕";s:2:"";s:3:"粗";s:2:"e";s:3:"粘";s:2:"S";s:3:"粛";s:2:"l";s:3:"粟";s:2:"";s:3:"粡";s:2:"";s:3:"粢";s:2:"";s:3:"粤";s:2:"";s:3:"粥";s:2:"";s:3:"粧";s:2:"";s:3:"粨";s:2:"";s:3:"粫";s:2:"";s:3:"粭";s:2:"";s:3:"粮";s:2:"";s:3:"粱";s:2:"";s:3:"粲";s:2:"";s:3:"粳";s:2:"";s:3:"粹";s:2:"";s:3:"粽";s:2:"";s:3:"精";s:2:"";s:3:"糀";s:2:"";s:3:"糂";s:2:"";s:3:"糅";s:2:"";s:3:"糊";s:2:"";s:3:"糎";s:2:"W";s:3:"糒";s:2:"";s:3:"糖";s:2:"";s:3:"糘";s:2:"";s:3:"糜";s:2:"";s:3:"糞";s:2:"";s:3:"糟";s:2:"";s:3:"糠";s:2:"f";s:3:"糢";s:2:"";s:3:"糧";s:2:"";s:3:"糯";s:2:"";s:3:"糲";s:2:"";s:3:"糴";s:2:"";s:3:"糶";s:2:"";s:3:"糸";s:2:"";s:3:"糺";s:2:"";s:3:"系";s:2:"n";s:3:"糾";s:2:"";s:3:"紀";s:2:"I";s:3:"紂";s:2:"@";s:3:"約";s:2:"";s:3:"紅";s:2:"g";s:3:"紆";s:2:"";s:3:"紊";s:2:"C";s:3:"紋";s:2:"";s:3:"納";s:2:"[";s:3:"紐";s:2:"R";s:3:"純";s:2:"";s:3:"紕";s:2:"B";s:3:"紗";s:2:"";s:3:"紘";s:2:"h";s:3:"紙";s:2:"";s:3:"級";s:2:"";s:3:"紛";s:2:"";s:3:"紜";s:2:"A";s:3:"素";s:2:"f";s:3:"紡";s:2:"a";s:3:"索";s:2:"";s:3:"紫";s:2:"";s:3:"紬";s:2:"";s:3:"紮";s:2:"F";s:3:"累";s:2:"";s:3:"細";s:2:"";s:3:"紲";s:2:"G";s:3:"紳";s:2:"a";s:3:"紵";s:2:"I";s:3:"紹";s:2:"";s:3:"紺";s:2:"";s:3:"紿";s:2:"H";s:3:"終";s:2:"I";s:3:"絃";s:2:"";s:3:"組";s:2:"g";s:3:"絅";s:2:"D";s:3:"絆";s:2:"J";s:3:"絈";s:2:"";s:3:"絋";s:2:"E";s:3:"経";s:2:"o";s:3:"絎";s:2:"M";s:3:"絏";s:2:"Q";s:3:"結";s:2:"";s:3:"絖";s:2:"L";s:3:"絛";s:2:"U";s:3:"絜";s:2:"";s:3:"絞";s:2:"i";s:3:"絡";s:2:"";s:3:"絢";s:2:"";s:3:"絣";s:2:"R";s:3:"給";s:2:"";s:3:"絨";s:2:"O";s:3:"絮";s:2:"P";s:3:"統";s:2:"";s:3:"絲";s:2:"N";s:3:"絳";s:2:"K";s:3:"絵";s:2:"G";s:3:"絶";s:2:"";s:3:"絹";s:2:"";s:3:"絽";s:2:"W";s:3:"綉";s:2:"T";s:3:"綏";s:2:"V";s:3:"經";s:2:"S";s:3:"継";s:2:"p";s:3:"続";s:2:"";s:3:"綛";s:2:"X";s:3:"綜";s:2:"";s:3:"綟";s:2:"e";s:3:"綠";s:2:"";s:3:"綢";s:2:"a";s:3:"綣";s:2:"[";s:3:"綫";s:2:"_";s:3:"綬";s:2:"";s:3:"維";s:2:"";s:3:"綮";s:2:"Z";s:3:"綯";s:2:"b";s:3:"綰";s:2:"f";s:3:"綱";s:2:"j";s:3:"網";s:2:"";s:3:"綴";s:2:"";s:3:"綵";s:2:"\";s:3:"綷";s:2:"";s:3:"綸";s:2:"d";s:3:"綺";s:2:"Y";s:3:"綻";s:2:"]";s:3:"綽";s:2:"^";s:3:"綾";s:2:"";s:3:"綿";s:2:"";s:3:"緇";s:2:"]";s:3:"緊";s:2:"";s:3:"緋";s:2:"";s:3:"総";s:2:"";s:3:"緑";s:2:"";s:3:"緒";s:2:"";s:3:"緕";s:2:"";s:3:"緖";s:2:"";s:3:"緘";s:2:"g";s:3:"線";s:2:"";s:3:"緜";s:2:"c";s:3:"緝";s:2:"h";s:3:"緞";s:2:"j";s:3:"締";s:2:"";s:3:"緡";s:2:"m";s:3:"緤";s:2:"i";s:3:"編";s:2:"";s:3:"緩";s:2:"";s:3:"緬";s:2:"";s:3:"緯";s:2:"";s:3:"緲";s:2:"l";s:3:"練";s:2:"";s:3:"緻";s:2:"k";s:3:"縁";s:2:"";s:3:"縄";s:2:"";s:3:"縅";s:2:"n";s:3:"縉";s:2:"u";s:3:"縊";s:2:"o";s:3:"縋";s:2:"v";s:3:"縒";s:2:"r";s:3:"縛";s:2:"";s:3:"縞";s:2:"";s:3:"縟";s:2:"t";s:3:"縡";s:2:"q";s:3:"縢";s:2:"w";s:3:"縣";s:2:"p";s:3:"縦";s:2:"c";s:3:"縫";s:2:"D";s:3:"縮";s:2:"k";s:3:"縱";s:2:"s";s:3:"縲";s:2:"";s:3:"縵";s:2:"{";s:3:"縷";s:2:"~";s:3:"縹";s:2:"|";s:3:"縺";s:2:"";s:3:"縻";s:2:"z";s:3:"總";s:2:"`";s:3:"績";s:2:"";s:3:"繁";s:2:"";s:3:"繃";s:2:"}";s:3:"繆";s:2:"x";s:3:"繊";s:2:"@";s:3:"繋";s:2:"q";s:3:"繍";s:2:"J";s:3:"繒";s:2:"";s:3:"織";s:2:"D";s:3:"繕";s:2:"U";s:3:"繖";s:2:"";s:3:"繙";s:2:"";s:3:"繚";s:2:"";s:3:"繝";s:2:"";s:3:"繞";s:2:"";s:3:"繦";s:2:"y";s:3:"繧";s:2:"";s:3:"繩";s:2:"";s:3:"繪";s:2:"";s:3:"繭";s:2:"";s:3:"繰";s:2:"J";s:3:"繹";s:2:"";s:3:"繻";s:2:"";s:3:"繼";s:2:"";s:3:"繽";s:2:"";s:3:"繿";s:2:"";s:3:"纂";s:2:"[";s:3:"纃";s:2:"";s:3:"纈";s:2:"";s:3:"纉";s:2:"";s:3:"纊";s:2:"\";s:3:"續";s:2:"";s:3:"纎";s:2:"";s:3:"纏";s:2:"Z";s:3:"纐";s:2:"";s:3:"纒";s:2:"";s:3:"纓";s:2:"";s:3:"纔";s:2:"";s:3:"纖";s:2:"";s:3:"纛";s:2:"";s:3:"纜";s:2:"";s:3:"缶";s:2:"";s:3:"缸";s:2:"";s:3:"缺";s:2:"";s:3:"罅";s:2:"";s:3:"罇";s:2:"";s:3:"罌";s:2:"";s:3:"罍";s:2:"";s:3:"罎";s:2:"";s:3:"罐";s:2:"";s:3:"网";s:2:"";s:3:"罔";s:2:"";s:3:"罕";s:2:"";s:3:"罘";s:2:"";s:3:"罟";s:2:"";s:3:"罠";s:2:"";s:3:"罧";s:2:"";s:3:"罨";s:2:"";s:3:"罩";s:2:"";s:3:"罪";s:2:"";s:3:"罫";s:2:"r";s:3:"置";s:2:"u";s:3:"罰";s:2:"";s:3:"署";s:2:"";s:3:"罵";s:2:"l";s:3:"罷";s:2:"";s:3:"罸";s:2:"";s:3:"罹";s:2:"";s:3:"羂";s:2:"";s:3:"羃";s:2:"";s:3:"羅";s:2:"";s:3:"羆";s:2:"";s:3:"羇";s:2:"";s:3:"羈";s:2:"";s:3:"羊";s:2:"r";s:3:"羌";s:2:"";s:3:"美";s:2:"";s:3:"羔";s:2:"";s:3:"羚";s:2:"";s:3:"羝";s:2:"";s:3:"羞";s:2:"";s:3:"羡";s:2:"";s:3:"羣";s:2:"";s:3:"群";s:2:"Q";s:3:"羨";s:2:"A";s:3:"義";s:2:"`";s:3:"羮";s:2:"";s:3:"羯";s:2:"";s:3:"羲";s:2:"";s:3:"羶";s:2:"";s:3:"羸";s:2:"";s:3:"羹";s:2:"";s:3:"羽";s:2:"H";s:3:"翁";s:2:"";s:3:"翅";s:2:"";s:3:"翆";s:2:"";s:3:"翊";s:2:"";s:3:"翌";s:2:"";s:3:"習";s:2:"K";s:3:"翔";s:2:"";s:3:"翕";s:2:"";s:3:"翠";s:2:"";s:3:"翡";s:2:"";s:3:"翦";s:2:"";s:3:"翩";s:2:"";s:3:"翫";s:2:"";s:3:"翰";s:2:"";s:3:"翳";s:2:"";s:3:"翹";s:2:"";s:3:"翻";s:2:"|";s:3:"翼";s:2:"";s:3:"耀";s:2:"s";s:3:"老";s:2:"V";s:3:"考";s:2:"l";s:3:"耄";s:2:"";s:3:"者";s:2:"";s:3:"耆";s:2:"";s:3:"耋";s:2:"";s:3:"而";s:2:"";s:3:"耐";s:2:"";s:3:"耒";s:2:"";s:3:"耕";s:2:"k";s:3:"耗";s:2:"";s:3:"耘";s:2:"";s:3:"耙";s:2:"";s:3:"耜";s:2:"";s:3:"耡";s:2:"";s:3:"耨";s:2:"";s:3:"耳";s:2:"";s:3:"耶";s:2:"";s:3:"耻";s:2:"";s:3:"耽";s:2:"^";s:3:"耿";s:2:"";s:3:"聆";s:2:"";s:3:"聊";s:2:"";s:3:"聒";s:2:"";s:3:"聖";s:2:"";s:3:"聘";s:2:"";s:3:"聚";s:2:"";s:3:"聞";s:2:"";s:3:"聟";s:2:"";s:3:"聡";s:2:"";s:3:"聢";s:2:"";s:3:"聨";s:2:"";s:3:"聯";s:2:"";s:3:"聰";s:2:"";s:3:"聲";s:2:"";s:3:"聳";s:2:"";s:3:"聴";s:2:"";s:3:"聶";s:2:"";s:3:"職";s:2:"E";s:3:"聹";s:2:"";s:3:"聽";s:2:"";s:3:"聾";s:2:"W";s:3:"聿";s:2:"";s:3:"肄";s:2:"";s:3:"肅";s:2:"";s:3:"肆";s:2:"";s:3:"肇";s:2:"";s:3:"肉";s:2:"";s:3:"肋";s:2:"]";s:3:"肌";s:2:"";s:3:"肓";s:2:"";s:3:"肖";s:2:"";s:3:"肘";s:2:"I";s:3:"肚";s:2:"";s:3:"肛";s:2:"";s:3:"肝";s:2:"";s:3:"股";s:2:"";s:3:"肢";s:2:"";s:3:"肥";s:2:"";s:3:"肩";s:2:"";s:3:"肪";s:2:"b";s:3:"肬";s:2:"";s:3:"肭";s:2:"";s:3:"肯";s:2:"m";s:3:"肱";s:2:"n";s:3:"育";s:2:"";s:3:"肴";s:2:"";s:3:"肺";s:2:"x";s:3:"胃";s:2:"";s:3:"胄";s:2:"";s:3:"胆";s:2:"_";s:3:"背";s:2:"w";s:3:"胎";s:2:"";s:3:"胖";s:2:"";s:3:"胙";s:2:"";s:3:"胚";s:2:"";s:3:"胛";s:2:"";s:3:"胝";s:2:"";s:3:"胞";s:2:"E";s:3:"胡";s:2:"";s:3:"胤";s:2:"";s:3:"胥";s:2:"";s:3:"胯";s:2:"";s:3:"胱";s:2:"";s:3:"胴";s:2:"";s:3:"胸";s:2:"";s:3:"胼";s:2:"E";s:3:"能";s:2:"\";s:3:"脂";s:2:"";s:3:"脅";s:2:"";s:3:"脆";s:2:"";s:3:"脇";s:2:"e";s:3:"脈";s:2:"";s:3:"脉";s:2:"";s:3:"脊";s:2:"";s:3:"脚";s:2:"r";s:3:"脛";s:2:"";s:3:"脣";s:2:"";s:3:"脩";s:2:"";s:3:"脯";s:2:"";s:3:"脱";s:2:"E";s:3:"脳";s:2:"]";s:3:"脹";s:2:"";s:3:"脾";s:2:"B";s:3:"腆";s:2:"A";s:3:"腋";s:2:"";s:3:"腎";s:2:"t";s:3:"腐";s:2:"";s:3:"腑";s:2:"D";s:3:"腓";s:2:"C";s:3:"腔";s:2:"o";s:3:"腕";s:2:"r";s:3:"腟";s:2:"T";s:3:"腥";s:2:"H";s:3:"腦";s:2:"I";s:3:"腫";s:2:"";s:3:"腮";s:2:"G";s:3:"腰";s:2:"";s:3:"腱";s:2:"F";s:3:"腴";s:2:"J";s:3:"腸";s:2:"";s:3:"腹";s:2:"";s:3:"腺";s:2:"B";s:3:"腿";s:2:"";s:3:"膀";s:2:"N";s:3:"膂";s:2:"O";s:3:"膃";s:2:"K";s:3:"膈";s:2:"L";s:3:"膊";s:2:"M";s:3:"膏";s:2:"p";s:3:"膓";s:2:"U";s:3:"膕";s:2:"Q";s:3:"膚";s:2:"";s:3:"膜";s:2:"";s:3:"膝";s:2:"G";s:3:"膠";s:2:"P";s:3:"膣";s:2:"S";s:3:"膤";s:2:"R";s:3:"膨";s:2:"c";s:3:"膩";s:2:"V";s:3:"膰";s:2:"W";s:3:"膳";s:2:"V";s:3:"膵";s:2:"X";s:3:"膸";s:2:"Z";s:3:"膺";s:2:"^";s:3:"膽";s:2:"[";s:3:"膾";s:2:"Y";s:3:"膿";s:2:"^";s:3:"臀";s:2:"\";s:3:"臂";s:2:"]";s:3:"臆";s:2:"";s:3:"臈";s:2:"d";s:3:"臉";s:2:"_";s:3:"臍";s:2:"`";s:3:"臑";s:2:"a";s:3:"臓";s:2:"";s:3:"臘";s:2:"c";s:3:"臙";s:2:"b";s:3:"臚";s:2:"e";s:3:"臟";s:2:"f";s:3:"臠";s:2:"g";s:3:"臣";s:2:"b";s:3:"臥";s:2:"";s:3:"臧";s:2:"h";s:3:"臨";s:2:"";s:3:"自";s:2:"";s:3:"臭";s:2:"L";s:3:"至";s:2:"";s:3:"致";s:2:"v";s:3:"臺";s:2:"i";s:3:"臻";s:2:"j";s:3:"臼";s:2:"P";s:3:"臾";s:2:"k";s:3:"舁";s:2:"l";s:3:"舂";s:2:"m";s:3:"舅";s:2:"n";s:3:"與";s:2:"o";s:3:"興";s:2:"";s:3:"舉";s:2:"";s:3:"舊";s:2:"p";s:3:"舌";s:2:"";s:3:"舍";s:2:"q";s:3:"舎";s:2:"";s:3:"舐";s:2:"r";s:3:"舒";s:2:"";s:3:"舖";s:2:"s";s:3:"舗";s:2:"";s:3:"舘";s:2:"";s:3:"舛";s:2:"C";s:3:"舜";s:2:"w";s:3:"舞";s:2:"";s:3:"舟";s:2:"M";s:3:"舩";s:2:"t";s:3:"航";s:2:"q";s:3:"舫";s:2:"u";s:3:"般";s:2:"";s:3:"舮";s:2:"";s:3:"舳";s:2:"w";s:3:"舵";s:2:"";s:3:"舶";s:2:"";s:3:"舷";s:2:"";s:3:"舸";s:2:"v";s:3:"船";s:2:"D";s:3:"艀";s:2:"x";s:3:"艇";s:2:"";s:3:"艘";s:2:"z";s:3:"艙";s:2:"y";s:3:"艚";s:2:"|";s:3:"艝";s:2:"{";s:3:"艟";s:2:"}";s:3:"艢";s:2:"";s:3:"艤";s:2:"~";s:3:"艦";s:2:"";s:3:"艨";s:2:"";s:3:"艪";s:2:"";s:3:"艫";s:2:"";s:3:"艮";s:2:"";s:3:"良";s:2:"";s:3:"艱";s:2:"";s:3:"色";s:2:"F";s:3:"艶";s:2:"";s:3:"艷";s:2:"";s:3:"艸";s:2:"";s:3:"艾";s:2:"";s:3:"芋";s:2:"";s:3:"芍";s:2:"";s:3:"芒";s:2:"";s:3:"芙";s:2:"";s:3:"芝";s:2:"";s:3:"芟";s:2:"";s:3:"芥";s:2:"H";s:3:"芦";s:2:"";s:3:"芫";s:2:"";s:3:"芬";s:2:"";s:3:"芭";s:2:"m";s:3:"芯";s:2:"c";s:3:"花";s:2:"";s:3:"芳";s:2:"F";s:3:"芸";s:2:"|";s:3:"芹";s:2:"";s:3:"芻";s:2:"";s:3:"芽";s:2:"";s:3:"苅";s:2:"";s:3:"苑";s:2:"";s:3:"苒";s:2:"";s:3:"苓";s:2:"";s:3:"苔";s:2:"";s:3:"苗";s:2:"c";s:3:"苙";s:2:"";s:3:"苛";s:2:"";s:3:"苜";s:2:"";s:3:"苞";s:2:"";s:3:"苟";s:2:"";s:3:"苡";s:2:"";s:3:"苣";s:2:"";s:3:"若";s:2:"";s:3:"苦";s:2:"";s:3:"苧";s:2:"";s:3:"苫";s:2:"";s:3:"英";s:2:"p";s:3:"苳";s:2:"";s:3:"苴";s:2:"";s:3:"苹";s:2:"";s:3:"苺";s:2:"";s:3:"苻";s:2:"";s:3:"茁";s:2:"";s:3:"茂";s:2:"";s:3:"范";s:2:"";s:3:"茄";s:2:"";s:3:"茅";s:2:"";s:3:"茆";s:2:"";s:3:"茉";s:2:"";s:3:"茎";s:2:"s";s:3:"茖";s:2:"";s:3:"茗";s:2:"";s:3:"茘";s:2:"";s:3:"茜";s:2:"";s:3:"茣";s:2:"";s:3:"茨";s:2:"";s:3:"茫";s:2:"";s:3:"茯";s:2:"";s:3:"茱";s:2:"";s:3:"茲";s:2:"";s:3:"茴";s:2:"";s:3:"茵";s:2:"";s:3:"茶";s:2:"";s:3:"茸";s:2:"";s:3:"茹";s:2:"";s:3:"荀";s:2:"";s:3:"荅";s:2:"";s:3:"草";s:2:"";s:3:"荊";s:2:"t";s:3:"荏";s:2:"`";s:3:"荐";s:2:"";s:3:"荒";s:2:"r";s:3:"荘";s:2:"";s:3:"荢";s:2:"";s:3:"荳";s:2:"";s:3:"荵";s:2:"";s:3:"荷";s:2:"";s:3:"荻";s:2:"";s:3:"荼";s:2:"";s:3:"荿";s:2:"";s:3:"莅";s:2:"";s:3:"莇";s:2:"";s:3:"莉";s:2:"";s:3:"莊";s:2:"";s:3:"莎";s:2:"";s:3:"莓";s:2:"";s:3:"莖";s:2:"";s:3:"莚";s:2:"";s:3:"莞";s:2:"";s:3:"莟";s:2:"";s:3:"莠";s:2:"";s:3:"莢";s:2:"";s:3:"莨";s:2:"";s:3:"莪";s:2:"";s:3:"莫";s:2:"";s:3:"莱";s:2:"";s:3:"莵";s:2:"";s:3:"莽";s:2:"";s:3:"菁";s:2:"";s:3:"菅";s:2:"";s:3:"菇";s:2:"";s:3:"菊";s:2:"e";s:3:"菌";s:2:"";s:3:"菎";s:2:"";s:3:"菓";s:2:"";s:3:"菖";s:2:"";s:3:"菘";s:2:"";s:3:"菜";s:2:"";s:3:"菟";s:2:"p";s:3:"菠";s:2:"";s:3:"菩";s:2:"";s:3:"菫";s:2:"";s:3:"華";s:2:"";s:3:"菰";s:2:"";s:3:"菱";s:2:"H";s:3:"菲";s:2:"";s:3:"菴";s:2:"";s:3:"菶";s:2:"";s:3:"菷";s:2:"";s:3:"菻";s:2:"";s:3:"菽";s:2:"";s:3:"萃";s:2:"";s:3:"萄";s:2:"";s:3:"萇";s:2:"";s:3:"萋";s:2:"";s:3:"萌";s:2:"G";s:3:"萍";s:2:"";s:3:"萎";s:2:"";s:3:"萓";s:2:"";s:3:"萠";s:2:"";s:3:"萢";s:2:"";s:3:"萩";s:2:"";s:3:"萪";s:2:"";s:3:"萬";s:2:"";s:3:"萱";s:2:"";s:3:"萵";s:2:"";s:3:"萸";s:2:"";s:3:"萼";s:2:"";s:3:"落";s:2:"";s:3:"葆";s:2:"";s:3:"葈";s:2:"";s:3:"葉";s:2:"t";s:3:"葎";s:2:"";s:3:"著";s:2:"";s:3:"葛";s:2:"";s:3:"葡";s:2:"";s:3:"葢";s:2:"";s:3:"董";s:2:"";s:3:"葦";s:2:"";s:3:"葩";s:2:"";s:3:"葫";s:2:"";s:3:"葬";s:2:"";s:3:"葭";s:2:"";s:3:"葮";s:2:"";s:3:"葯";s:2:"";s:3:"葱";s:2:"K";s:3:"葵";s:2:"";s:3:"葷";s:2:"";s:3:"葹";s:2:"";s:3:"葺";s:2:"";s:3:"蒂";s:2:"";s:3:"蒄";s:2:"";s:3:"蒋";s:2:"";s:3:"蒐";s:2:"N";s:3:"蒔";s:2:"";s:3:"蒙";s:2:"";s:3:"蒜";s:2:"f";s:3:"蒟";s:2:"";s:3:"蒡";s:2:"";s:3:"蒭";s:2:"";s:3:"蒲";s:2:"";s:3:"蒴";s:2:"";s:3:"蒸";s:2:"";s:3:"蒹";s:2:"";s:3:"蒻";s:2:"";s:3:"蒼";s:2:"";s:3:"蒿";s:2:"";s:3:"蓁";s:2:"";s:3:"蓄";s:2:"~";s:3:"蓆";s:2:"";s:3:"蓉";s:2:"u";s:3:"蓊";s:2:"";s:3:"蓋";s:2:"W";s:3:"蓍";s:2:"";s:3:"蓐";s:2:"";s:3:"蓑";s:2:"";s:3:"蓖";s:2:"";s:3:"蓙";s:2:"";s:3:"蓚";s:2:"";s:3:"蓜";s:2:"`";s:3:"蓬";s:2:"H";s:3:"蓮";s:2:"@";s:3:"蓴";s:2:"";s:3:"蓼";s:2:"";s:3:"蓿";s:2:"";s:3:"蔀";s:2:"";s:3:"蔆";s:2:"";s:3:"蔑";s:2:"";s:3:"蔓";s:2:"";s:3:"蔔";s:2:"";s:3:"蔕";s:2:"";s:3:"蔗";s:2:"";s:3:"蔘";s:2:"";s:3:"蔚";s:2:"U";s:3:"蔟";s:2:"";s:3:"蔡";s:2:"";s:3:"蔦";s:2:"";s:3:"蔬";s:2:"";s:3:"蔭";s:2:"";s:3:"蔵";s:2:"";s:3:"蔽";s:2:"";s:3:"蕀";s:2:"";s:3:"蕁";s:2:"@";s:3:"蕃";s:2:"";s:3:"蕈";s:2:"";s:3:"蕉";s:2:"";s:3:"蕊";s:2:"";s:3:"蕋";s:2:"B";s:3:"蕎";s:2:"";s:3:"蕓";s:2:"";s:3:"蕕";s:2:"C";s:3:"蕗";s:2:"";s:3:"蕘";s:2:"";s:3:"蕙";s:2:"";s:3:"蕚";s:2:"";s:3:"蕣";s:2:"";s:3:"蕨";s:2:"n";s:3:"蕩";s:2:"";s:3:"蕪";s:2:"";s:3:"蕫";s:2:"";s:3:"蕭";s:2:"J";s:3:"蕷";s:2:"P";s:3:"蕾";s:2:"Q";s:3:"薀";s:2:"D";s:3:"薄";s:2:"";s:3:"薇";s:2:"N";s:3:"薈";s:2:"F";s:3:"薊";s:2:"H";s:3:"薐";s:2:"R";s:3:"薑";s:2:"G";s:3:"薔";s:2:"K";s:3:"薗";s:2:"";s:3:"薙";s:2:"";s:3:"薛";s:2:"L";s:3:"薜";s:2:"O";s:3:"薤";s:2:"E";s:3:"薦";s:2:"E";s:3:"薨";s:2:"I";s:3:"薩";s:2:"F";s:3:"薪";s:2:"d";s:3:"薫";s:2:"O";s:3:"薬";s:2:"";s:3:"薮";s:2:"";s:3:"薯";s:2:"";s:3:"薰";s:2:"";s:3:"薹";s:2:"V";s:3:"薺";s:2:"T";s:3:"藁";s:2:"m";s:3:"藉";s:2:"S";s:3:"藍";s:2:"";s:3:"藏";s:2:"U";s:3:"藐";s:2:"W";s:3:"藕";s:2:"X";s:3:"藜";s:2:"[";s:3:"藝";s:2:"Y";s:3:"藤";s:2:"";s:3:"藥";s:2:"Z";s:3:"藩";s:2:"";s:3:"藪";s:2:"M";s:3:"藷";s:2:"";s:3:"藹";s:2:"\";s:3:"藺";s:2:"a";s:3:"藻";s:2:"";s:3:"藾";s:2:"`";s:3:"蘂";s:2:"A";s:3:"蘆";s:2:"b";s:3:"蘇";s:2:"h";s:3:"蘊";s:2:"]";s:3:"蘋";s:2:"_";s:3:"蘓";s:2:"^";s:3:"蘖";s:2:"P";s:3:"蘗";s:2:"A";s:3:"蘚";s:2:"d";s:3:"蘢";s:2:"c";s:3:"蘭";s:2:"";s:3:"蘯";s:2:"";s:3:"蘰";s:2:"e";s:3:"蘿";s:2:"f";s:3:"虍";s:2:"g";s:3:"虎";s:2:"";s:3:"虐";s:2:"s";s:3:"虔";s:2:"i";s:3:"處";s:2:"|";s:3:"虚";s:2:"";s:3:"虜";s:2:"";s:3:"虞";s:2:"";s:3:"號";s:2:"j";s:3:"虧";s:2:"k";s:3:"虫";s:2:"";s:3:"虱";s:2:"l";s:3:"虹";s:2:"";s:3:"虻";s:2:"";s:3:"蚊";s:2:"";s:3:"蚋";s:2:"q";s:3:"蚌";s:2:"r";s:3:"蚓";s:2:"m";s:3:"蚕";s:2:"\";s:3:"蚣";s:2:"n";s:3:"蚤";s:2:"a";s:3:"蚩";s:2:"o";s:3:"蚪";s:2:"p";s:3:"蚫";s:2:"z";s:3:"蚯";s:2:"t";s:3:"蚰";s:2:"w";s:3:"蚶";s:2:"s";s:3:"蛄";s:2:"u";s:3:"蛆";s:2:"v";s:3:"蛇";s:2:"";s:3:"蛉";s:2:"x";s:3:"蛋";s:2:"`";s:3:"蛍";s:2:"u";s:3:"蛎";s:2:"a";s:3:"蛔";s:2:"{";s:3:"蛙";s:2:"^";s:3:"蛛";s:2:"";s:3:"蛞";s:2:"|";s:3:"蛟";s:2:"";s:3:"蛤";s:2:"";s:3:"蛩";s:2:"}";s:3:"蛬";s:2:"~";s:3:"蛭";s:2:"g";s:3:"蛮";s:2:"";s:3:"蛯";s:2:"";s:3:"蛸";s:2:"";s:3:"蛹";s:2:"";s:3:"蛻";s:2:"";s:3:"蛾";s:2:"";s:3:"蜀";s:2:"";s:3:"蜂";s:2:"I";s:3:"蜃";s:2:"";s:3:"蜆";s:2:"";s:3:"蜈";s:2:"";s:3:"蜉";s:2:"";s:3:"蜊";s:2:"";s:3:"蜍";s:2:"";s:3:"蜑";s:2:"";s:3:"蜒";s:2:"";s:3:"蜘";s:2:"w";s:3:"蜚";s:2:"";s:3:"蜜";s:2:"";s:3:"蜥";s:2:"";s:3:"蜩";s:2:"";s:3:"蜴";s:2:"";s:3:"蜷";s:2:"";s:3:"蜻";s:2:"";s:3:"蜿";s:2:"";s:3:"蝉";s:2:"";s:3:"蝋";s:2:"X";s:3:"蝌";s:2:"";s:3:"蝎";s:2:"";s:3:"蝓";s:2:"";s:3:"蝕";s:2:"I";s:3:"蝗";s:2:"";s:3:"蝙";s:2:"";s:3:"蝟";s:2:"";s:3:"蝠";s:2:"";s:3:"蝣";s:2:"";s:3:"蝦";s:2:"";s:3:"蝨";s:2:"";s:3:"蝪";s:2:"";s:3:"蝮";s:2:"";s:3:"蝴";s:2:"";s:3:"蝶";s:2:"";s:3:"蝸";s:2:"";s:3:"蝿";s:2:"";s:3:"螂";s:2:"";s:3:"融";s:2:"Z";s:3:"螟";s:2:"";s:3:"螢";s:2:"";s:3:"螫";s:2:"";s:3:"螯";s:2:"";s:3:"螳";s:2:"";s:3:"螺";s:2:"";s:3:"螻";s:2:"";s:3:"螽";s:2:"";s:3:"蟀";s:2:"";s:3:"蟄";s:2:"";s:3:"蟆";s:2:"";s:3:"蟇";s:2:"";s:3:"蟋";s:2:"";s:3:"蟐";s:2:"";s:3:"蟒";s:2:"";s:3:"蟠";s:2:"";s:3:"蟯";s:2:"";s:3:"蟲";s:2:"";s:3:"蟶";s:2:"";s:3:"蟷";s:2:"";s:3:"蟹";s:2:"I";s:3:"蟻";s:2:"a";s:3:"蟾";s:2:"";s:3:"蠅";s:2:"";s:3:"蠇";s:2:"";s:3:"蠍";s:2:"";s:3:"蠎";s:2:"";s:3:"蠏";s:2:"";s:3:"蠑";s:2:"";s:3:"蠕";s:2:"";s:3:"蠖";s:2:"";s:3:"蠡";s:2:"";s:3:"蠢";s:2:"";s:3:"蠣";s:2:"y";s:3:"蠧";s:2:"";s:3:"蠱";s:2:"";s:3:"蠶";s:2:"";s:3:"蠹";s:2:"";s:3:"蠻";s:2:"";s:3:"血";s:2:"";s:3:"衂";s:2:"";s:3:"衄";s:2:"";s:3:"衆";s:2:"O";s:3:"行";s:2:"s";s:3:"衍";s:2:"";s:3:"衒";s:2:"";s:3:"術";s:2:"p";s:3:"街";s:2:"X";s:3:"衙";s:2:"";s:3:"衛";s:2:"q";s:3:"衝";s:2:"";s:3:"衞";s:2:"";s:3:"衡";s:2:"t";s:3:"衢";s:2:"";s:3:"衣";s:2:"";s:3:"表";s:2:"\";s:3:"衫";s:2:"";s:3:"衰";s:2:"";s:3:"衲";s:2:"";s:3:"衵";s:2:"";s:3:"衷";s:2:"";s:3:"衽";s:2:"";s:3:"衾";s:2:"";s:3:"衿";s:2:"";s:3:"袁";s:2:"";s:3:"袂";s:2:"";s:3:"袈";s:2:"U";s:3:"袋";s:2:"";s:3:"袍";s:2:"";s:3:"袒";s:2:"";s:3:"袖";s:2:"";s:3:"袗";s:2:"";s:3:"袙";s:2:"";s:3:"袞";s:2:"";s:3:"袢";s:2:"";s:3:"袤";s:2:"";s:3:"被";s:2:"";s:3:"袮";s:2:"";s:3:"袰";s:2:"";s:3:"袱";s:2:"";s:3:"袴";s:2:"";s:3:"袵";s:2:"";s:3:"袷";s:2:"";s:3:"袿";s:2:"";s:3:"裁";s:2:"";s:3:"裂";s:2:"";s:3:"裃";s:2:"";s:3:"裄";s:2:"";s:3:"装";s:2:"";s:3:"裏";s:2:"";s:3:"裔";s:2:"";s:3:"裕";s:2:"T";s:3:"裘";s:2:"";s:3:"裙";s:2:"";s:3:"補";s:2:"";s:3:"裝";s:2:"";s:3:"裟";s:2:"";s:3:"裡";s:2:"";s:3:"裨";s:2:"";s:3:"裲";s:2:"";s:3:"裳";s:2:"";s:3:"裴";s:2:"";s:3:"裵";s:2:"";s:3:"裸";s:2:"";s:3:"裹";s:2:"";s:3:"裼";s:2:"";s:3:"製";s:2:"";s:3:"裾";s:2:"";s:3:"褂";s:2:"";s:3:"褄";s:2:"";s:3:"複";s:2:"";s:3:"褊";s:2:"";s:3:"褌";s:2:"";s:3:"褐";s:2:"";s:3:"褒";s:2:"J";s:3:"褓";s:2:"";s:3:"褜";s:2:"]";s:3:"褝";s:2:"";s:3:"褞";s:2:"";s:3:"褥";s:2:"";s:3:"褪";s:2:"";s:3:"褫";s:2:"";s:3:"褶";s:2:"";s:3:"褸";s:2:"";s:3:"褻";s:2:"";s:3:"襁";s:2:"";s:3:"襃";s:2:"";s:3:"襄";s:2:"";s:3:"襌";s:2:"";s:3:"襍";s:2:"";s:3:"襖";s:2:"";s:3:"襞";s:2:"";s:3:"襟";s:2:"";s:3:"襠";s:2:"";s:3:"襤";s:2:"A";s:3:"襦";s:2:"@";s:3:"襪";s:2:"C";s:3:"襭";s:2:"B";s:3:"襯";s:2:"D";s:3:"襲";s:2:"P";s:3:"襴";s:2:"E";s:3:"襷";s:2:"F";s:3:"襾";s:2:"G";s:3:"西";s:2:"";s:3:"要";s:2:"v";s:3:"覃";s:2:"H";s:3:"覆";s:2:"";s:3:"覇";s:2:"e";s:3:"覈";s:2:"I";s:3:"覊";s:2:"J";s:3:"見";s:2:"";s:3:"規";s:2:"K";s:3:"覓";s:2:"K";s:3:"視";s:2:"";s:3:"覗";s:2:"`";s:3:"覘";s:2:"L";s:3:"覚";s:2:"o";s:3:"覡";s:2:"M";s:3:"覦";s:2:"O";s:3:"覧";s:2:"";s:3:"覩";s:2:"N";s:3:"親";s:2:"e";s:3:"覬";s:2:"P";s:3:"覯";s:2:"Q";s:3:"覲";s:2:"R";s:3:"観";s:2:"";s:3:"覺";s:2:"S";s:3:"覽";s:2:"T";s:3:"覿";s:2:"U";s:3:"觀";s:2:"V";s:3:"角";s:2:"p";s:3:"觚";s:2:"W";s:3:"觜";s:2:"X";s:3:"觝";s:2:"Y";s:3:"解";s:2:"";s:3:"触";s:2:"G";s:3:"觧";s:2:"Z";s:3:"觴";s:2:"[";s:3:"觸";s:2:"\";s:3:"言";s:2:"";s:3:"訂";s:2:"";s:3:"訃";s:2:"]";s:3:"計";s:2:"v";s:3:"訊";s:2:"u";s:3:"訌";s:2:"`";s:3:"討";s:2:"";s:3:"訐";s:2:"_";s:3:"訒";s:2:"";s:3:"訓";s:2:"P";s:3:"訖";s:2:"^";s:3:"託";s:2:"";s:3:"記";s:2:"L";s:3:"訛";s:2:"a";s:3:"訝";s:2:"b";s:3:"訟";s:2:"";s:3:"訣";s:2:"";s:3:"訥";s:2:"c";s:3:"訪";s:2:"K";s:3:"設";s:2:"";s:3:"許";s:2:"";s:3:"訳";s:2:"";s:3:"訴";s:2:"i";s:3:"訶";s:2:"d";s:3:"訷";s:2:"";s:3:"診";s:2:"f";s:3:"註";s:2:"";s:3:"証";s:2:"";s:3:"詁";s:2:"e";s:3:"詆";s:2:"h";s:3:"詈";s:2:"i";s:3:"詐";s:2:"";s:3:"詑";s:2:"";s:3:"詒";s:2:"g";s:3:"詔";s:2:"";s:3:"評";s:2:"]";s:3:"詛";s:2:"f";s:3:"詞";s:2:"";s:3:"詠";s:2:"r";s:3:"詢";s:2:"m";s:3:"詣";s:2:"w";s:3:"試";s:2:"";s:3:"詩";s:2:"";s:3:"詫";s:2:"l";s:3:"詬";s:2:"l";s:3:"詭";s:2:"k";s:3:"詮";s:2:"F";s:3:"詰";s:2:"l";s:3:"話";s:2:"b";s:3:"該";s:2:"Y";s:3:"詳";s:2:"";s:3:"詹";s:2:"";s:3:"詼";s:2:"j";s:3:"誂";s:2:"o";s:3:"誄";s:2:"p";s:3:"誅";s:2:"n";s:3:"誇";s:2:"";s:3:"誉";s:2:"_";s:3:"誌";s:2:"";s:3:"認";s:2:"F";s:3:"誑";s:2:"s";s:3:"誓";s:2:"";s:3:"誕";s:2:"a";s:3:"誘";s:2:"U";s:3:"誚";s:2:"v";s:3:"語";s:2:"";s:3:"誠";s:2:"";s:3:"誡";s:2:"r";s:3:"誣";s:2:"w";s:3:"誤";s:2:"";s:3:"誥";s:2:"t";s:3:"誦";s:2:"u";s:3:"誧";s:2:"";s:3:"誨";s:2:"q";s:3:"説";s:2:"";s:3:"読";s:2:"";s:3:"誰";s:2:"N";s:3:"課";s:2:"";s:3:"誹";s:2:"";s:3:"誼";s:2:"b";s:3:"誾";s:2:"";s:3:"調";s:2:"";s:3:"諂";s:2:"z";s:3:"諄";s:2:"x";s:3:"談";s:2:"k";s:3:"請";s:2:"";s:3:"諌";s:2:"";s:3:"諍";s:2:"y";s:3:"諏";s:2:"z";s:3:"諒";s:2:"";s:3:"論";s:2:"_";s:3:"諚";s:2:"{";s:3:"諛";s:2:"";s:3:"諜";s:2:"";s:3:"諞";s:2:"";s:3:"諟";s:2:"";s:3:"諠";s:2:"";s:3:"諡";s:2:"";s:3:"諢";s:2:"";s:3:"諤";s:2:"";s:3:"諦";s:2:"";s:3:"諧";s:2:"~";s:3:"諫";s:2:"|";s:3:"諭";s:2:"@";s:3:"諮";s:2:"";s:3:"諱";s:2:"";s:3:"諳";s:2:"}";s:3:"諶";s:2:"";s:3:"諷";s:2:"";s:3:"諸";s:2:"";s:3:"諺";s:2:"";s:3:"諾";s:2:"";s:3:"謀";s:2:"d";s:3:"謁";s:2:"y";s:3:"謂";s:2:"";s:3:"謄";s:2:"";s:3:"謇";s:2:"";s:3:"謌";s:2:"";s:3:"謎";s:2:"";s:3:"謐";s:2:"";s:3:"謔";s:2:"";s:3:"謖";s:2:"";s:3:"謗";s:2:"";s:3:"謙";s:2:"";s:3:"謚";s:2:"";s:3:"講";s:2:"u";s:3:"謝";s:2:"";s:3:"謠";s:2:"";s:3:"謡";s:2:"w";s:3:"謦";s:2:"";s:3:"謨";s:2:"";s:3:"謫";s:2:"";s:3:"謬";s:2:"T";s:3:"謳";s:2:"";s:3:"謹";s:2:"";s:3:"謾";s:2:"";s:3:"譁";s:2:"";s:3:"證";s:2:"";s:3:"譌";s:2:"";s:3:"譎";s:2:"";s:3:"譏";s:2:"";s:3:"譓";s:2:"";s:3:"譖";s:2:"";s:3:"識";s:2:"";s:3:"譚";s:2:"";s:3:"譛";s:2:"";s:3:"譜";s:2:"";s:3:"譟";s:2:"";s:3:"警";s:2:"x";s:3:"譫";s:2:"";s:3:"譬";s:2:"";s:3:"譯";s:2:"";s:3:"議";s:2:"c";s:3:"譱";s:2:"";s:3:"譲";s:2:"";s:3:"譴";s:2:"";s:3:"護";s:2:"";s:3:"譽";s:2:"";s:3:"譿";s:2:"";s:3:"讀";s:2:"";s:3:"讃";s:2:"]";s:3:"變";s:2:"";s:3:"讌";s:2:"";s:3:"讎";s:2:"";s:3:"讐";s:2:"Q";s:3:"讒";s:2:"";s:3:"讓";s:2:"";s:3:"讖";s:2:"";s:3:"讙";s:2:"";s:3:"讚";s:2:"";s:3:"谷";s:2:"J";s:3:"谺";s:2:"";s:3:"谿";s:2:"";s:3:"豁";s:2:"";s:3:"豆";s:2:"";s:3:"豈";s:2:"";s:3:"豊";s:2:"L";s:3:"豌";s:2:"";s:3:"豎";s:2:"";s:3:"豐";s:2:"";s:3:"豕";s:2:"";s:3:"豚";s:2:"";s:3:"象";s:2:"";s:3:"豢";s:2:"";s:3:"豪";s:2:"";s:3:"豫";s:2:"";s:3:"豬";s:2:"";s:3:"豸";s:2:"";s:3:"豹";s:2:"^";s:3:"豺";s:2:"";s:3:"豼";s:2:"";s:3:"貂";s:2:"";s:3:"貅";s:2:"";s:3:"貉";s:2:"";s:3:"貊";s:2:"";s:3:"貌";s:2:"e";s:3:"貍";s:2:"";s:3:"貎";s:2:"";s:3:"貔";s:2:"";s:3:"貘";s:2:"";s:3:"貝";s:2:"L";s:3:"貞";s:2:"";s:3:"負";s:2:"";s:3:"財";s:2:"";s:3:"貢";s:2:"v";s:3:"貧";s:2:"n";s:3:"貨";s:2:"";s:3:"販";s:2:"";s:3:"貪";s:2:"";s:3:"貫";s:2:"";s:3:"責";s:2:"";s:3:"貭";s:2:"";s:3:"貮";s:2:"";s:3:"貯";s:2:"";s:3:"貰";s:2:"";s:3:"貲";s:2:"";s:3:"貳";s:2:"";s:3:"貴";s:2:"M";s:3:"貶";s:2:"";s:3:"買";s:2:"";s:3:"貸";s:2:"";s:3:"費";s:2:"";s:3:"貼";s:2:"\";s:3:"貽";s:2:"";s:3:"貿";s:2:"f";s:3:"賀";s:2:"";s:3:"賁";s:2:"";s:3:"賂";s:2:"G";s:3:"賃";s:2:"";s:3:"賄";s:2:"d";s:3:"資";s:2:"";s:3:"賈";s:2:"";s:3:"賊";s:2:"";s:3:"賍";s:2:"";s:3:"賎";s:2:"G";s:3:"賑";s:2:"";s:3:"賓";s:2:"o";s:3:"賚";s:2:"";s:3:"賛";s:2:"^";s:3:"賜";s:2:"";s:3:"賞";s:2:"";s:3:"賠";s:2:"";s:3:"賢";s:2:"";s:3:"賣";s:2:"";s:3:"賤";s:2:"";s:3:"賦";s:2:"";s:3:"質";s:2:"";s:3:"賭";s:2:"q";s:3:"賰";s:2:"";s:3:"賴";s:2:"";s:3:"賺";s:2:"";s:3:"賻";s:2:"";s:3:"購";s:2:"w";s:3:"賽";s:2:"";s:3:"贄";s:2:"";s:3:"贅";s:2:"";s:3:"贇";s:2:"";s:3:"贈";s:2:"";s:3:"贊";s:2:"";s:3:"贋";s:2:"";s:3:"贍";s:2:"";s:3:"贏";s:2:"";s:3:"贐";s:2:"";s:3:"贒";s:2:"";s:3:"贓";s:2:"";s:3:"贔";s:2:"";s:3:"贖";s:2:"";s:3:"赤";s:2:"";s:3:"赦";s:2:"";s:3:"赧";s:2:"";s:3:"赫";s:2:"q";s:3:"赭";s:2:"";s:3:"走";s:2:"";s:3:"赱";s:2:"";s:3:"赳";s:2:"";s:3:"赴";s:2:"";s:3:"赶";s:2:"";s:3:"起";s:2:"N";s:3:"趁";s:2:"";s:3:"超";s:2:"";s:3:"越";s:2:"z";s:3:"趙";s:2:"";s:3:"趣";s:2:"";s:3:"趨";s:2:"";s:3:"足";s:2:"";s:3:"趺";s:2:"";s:3:"趾";s:2:"";s:3:"跂";s:2:"";s:3:"跋";s:2:"";s:3:"跌";s:2:"";s:3:"跏";s:2:"";s:3:"跖";s:2:"";s:3:"跚";s:2:"";s:3:"跛";s:2:"";s:3:"距";s:2:"";s:3:"跟";s:2:"";s:3:"跡";s:2:"";s:3:"跣";s:2:"";s:3:"跨";s:2:"";s:3:"跪";s:2:"";s:3:"跫";s:2:"";s:3:"路";s:2:"H";s:3:"跳";s:2:"";s:3:"践";s:2:"H";s:3:"跼";s:2:"";s:3:"跿";s:2:"";s:3:"踈";s:2:"";s:3:"踉";s:2:"";s:3:"踊";s:2:"x";s:3:"踏";s:2:"";s:3:"踐";s:2:"";s:3:"踝";s:2:"";s:3:"踞";s:2:"";s:3:"踟";s:2:"";s:3:"踪";s:2:"H";s:3:"踰";s:2:"";s:3:"踴";s:2:"";s:3:"踵";s:2:"";s:3:"蹂";s:2:"";s:3:"蹄";s:2:"";s:3:"蹇";s:2:"@";s:3:"蹈";s:2:"D";s:3:"蹉";s:2:"A";s:3:"蹊";s:2:"";s:3:"蹌";s:2:"B";s:3:"蹐";s:2:"C";s:3:"蹕";s:2:"J";s:3:"蹙";s:2:"E";s:3:"蹟";s:2:"";s:3:"蹠";s:2:"G";s:3:"蹣";s:2:"I";s:3:"蹤";s:2:"F";s:3:"蹲";s:2:"L";s:3:"蹴";s:2:"R";s:3:"蹶";s:2:"K";s:3:"蹼";s:2:"M";s:3:"躁";s:2:"N";s:3:"躄";s:2:"Q";s:3:"躅";s:2:"P";s:3:"躇";s:2:"O";s:3:"躊";s:2:"S";s:3:"躋";s:2:"R";s:3:"躍";s:2:"";s:3:"躑";s:2:"U";s:3:"躓";s:2:"T";s:3:"躔";s:2:"V";s:3:"躙";s:2:"W";s:3:"躡";s:2:"Y";s:3:"躪";s:2:"X";s:3:"身";s:2:"g";s:3:"躬";s:2:"Z";s:3:"躯";s:2:"";s:3:"躰";s:2:"[";s:3:"躱";s:2:"]";s:3:"躾";s:2:"^";s:3:"軅";s:2:"_";s:3:"軆";s:2:"\";s:3:"軈";s:2:"`";s:3:"車";s:2:"";s:3:"軋";s:2:"a";s:3:"軌";s:2:"O";s:3:"軍";s:2:"R";s:3:"軏";s:2:"";s:3:"軒";s:2:"";s:3:"軛";s:2:"b";s:3:"軟";s:2:"";s:3:"転";s:2:"]";s:3:"軣";s:2:"c";s:3:"軫";s:2:"f";s:3:"軸";s:2:"";s:3:"軻";s:2:"e";s:3:"軼";s:2:"d";s:3:"軽";s:2:"y";s:3:"軾";s:2:"g";s:3:"較";s:2:"r";s:3:"輅";s:2:"i";s:3:"載";s:2:"";s:3:"輊";s:2:"h";s:3:"輌";s:2:"q";s:3:"輒";s:2:"k";s:3:"輓";s:2:"m";s:3:"輔";s:2:"";s:3:"輕";s:2:"j";s:3:"輙";s:2:"l";s:3:"輛";s:2:"p";s:3:"輜";s:2:"n";s:3:"輝";s:2:"P";s:3:"輟";s:2:"o";s:3:"輦";s:2:"r";s:3:"輩";s:2:"y";s:3:"輪";s:2:"";s:3:"輯";s:2:"S";s:3:"輳";s:2:"s";s:3:"輸";s:2:"A";s:3:"輹";s:2:"u";s:3:"輻";s:2:"t";s:3:"輾";s:2:"x";s:3:"輿";s:2:"`";s:3:"轂";s:2:"w";s:3:"轄";s:2:"";s:3:"轅";s:2:"v";s:3:"轆";s:2:"{";s:3:"轉";s:2:"z";s:3:"轌";s:2:"y";s:3:"轍";s:2:"Q";s:3:"轎";s:2:"|";s:3:"轗";s:2:"}";s:3:"轜";s:2:"~";s:3:"轟";s:2:"";s:3:"轡";s:2:"D";s:3:"轢";s:2:"";s:3:"轣";s:2:"";s:3:"轤";s:2:"";s:3:"辛";s:2:"h";s:3:"辜";s:2:"";s:3:"辞";s:2:"";s:3:"辟";s:2:"";s:3:"辣";s:2:"";s:3:"辧";s:2:"";s:3:"辨";s:2:"";s:3:"辭";s:2:"";s:3:"辮";s:2:"";s:3:"辯";s:2:"";s:3:"辰";s:2:"C";s:3:"辱";s:2:"J";s:3:"農";s:2:"_";s:3:"辷";s:2:"";s:3:"辺";s:2:"";s:3:"辻";s:2:"";s:3:"込";s:2:"";s:3:"辿";s:2:"H";s:3:"迂";s:2:"I";s:3:"迄";s:2:"";s:3:"迅";s:2:"v";s:3:"迎";s:2:"}";s:3:"近";s:2:"";s:3:"返";s:2:"";s:3:"迚";s:2:"";s:3:"迢";s:2:"";s:3:"迥";s:2:"";s:3:"迦";s:2:"";s:3:"迩";s:2:"";s:3:"迪";s:2:"";s:3:"迫";s:2:"";s:3:"迭";s:2:"R";s:3:"迯";s:2:"";s:3:"述";s:2:"q";s:3:"迴";s:2:"";s:3:"迷";s:2:"";s:3:"迸";s:2:"";s:3:"迹";s:2:"";s:3:"迺";s:2:"";s:3:"追";s:2:"";s:3:"退";s:2:"";s:3:"送";s:2:"";s:3:"逃";s:2:"";s:3:"逅";s:2:"";s:3:"逆";s:2:"t";s:3:"逋";s:2:"";s:3:"逍";s:2:"";s:3:"逎";s:2:"";s:3:"透";s:2:"";s:3:"逐";s:2:"";s:3:"逑";s:2:"";s:3:"逓";s:2:"";s:3:"途";s:2:"r";s:3:"逕";s:2:"";s:3:"逖";s:2:"";s:3:"逗";s:2:"";s:3:"這";s:2:"";s:3:"通";s:2:"";s:3:"逝";s:2:"";s:3:"逞";s:2:"";s:3:"速";s:2:"";s:3:"造";s:2:"";s:3:"逡";s:2:"";s:3:"逢";s:2:"";s:3:"連";s:2:"A";s:3:"逧";s:2:"";s:3:"逮";s:2:"";s:3:"週";s:2:"T";s:3:"進";s:2:"i";s:3:"逵";s:2:"";s:3:"逶";s:2:"";s:3:"逸";s:2:"";s:3:"逹";s:2:"";s:3:"逼";s:2:"N";s:3:"逾";s:2:"";s:3:"遁";s:2:"";s:3:"遂";s:2:"";s:3:"遅";s:2:"x";s:3:"遇";s:2:"";s:3:"遉";s:2:"";s:3:"遊";s:2:"V";s:3:"運";s:2:"^";s:3:"遍";s:2:"";s:3:"過";s:2:"";s:3:"遏";s:2:"";s:3:"遐";s:2:"";s:3:"遑";s:2:"";s:3:"遒";s:2:"";s:3:"道";s:2:"";s:3:"達";s:2:"B";s:3:"違";s:2:"";s:3:"遖";s:2:"";s:3:"遘";s:2:"";s:3:"遙";s:2:"";s:3:"遜";s:2:"";s:3:"遞";s:2:"";s:3:"遠";s:2:"";s:3:"遡";s:2:"k";s:3:"遣";s:2:"";s:3:"遥";s:2:"y";s:3:"遧";s:2:"";s:3:"遨";s:2:"";s:3:"適";s:2:"K";s:3:"遭";s:2:"";s:3:"遮";s:2:"";s:3:"遯";s:2:"";s:3:"遲";s:2:"";s:3:"遵";s:2:"";s:3:"遶";s:2:"";s:3:"遷";s:2:"J";s:3:"選";s:2:"I";s:3:"遺";s:2:"";s:3:"遼";s:2:"";s:3:"遽";s:2:"";s:3:"避";s:2:"";s:3:"邀";s:2:"";s:3:"邁";s:2:"";s:3:"邂";s:2:"";s:3:"邃";s:2:"";s:3:"還";s:2:"";s:3:"邇";s:2:"";s:3:"邉";s:2:"";s:3:"邊";s:2:"";s:3:"邏";s:2:"";s:3:"邑";s:2:"W";s:3:"那";s:2:"";s:3:"邦";s:2:"M";s:3:"邨";s:2:"";s:3:"邪";s:2:"";s:3:"邯";s:2:"";s:3:"邱";s:2:"";s:3:"邵";s:2:"";s:3:"邸";s:2:"@";s:3:"郁";s:2:"";s:3:"郊";s:2:"x";s:3:"郎";s:2:"Y";s:3:"郛";s:2:"";s:3:"郞";s:2:"";s:3:"郡";s:2:"S";s:3:"郢";s:2:"";s:3:"郤";s:2:"";s:3:"部";s:2:"";s:3:"郭";s:2:"s";s:3:"郵";s:2:"X";s:3:"郷";s:2:"";s:3:"都";s:2:"s";s:3:"鄂";s:2:"";s:3:"鄒";s:2:"";s:3:"鄕";s:2:"";s:3:"鄙";s:2:"";s:3:"鄧";s:2:"";s:3:"鄭";s:2:"A";s:3:"鄰";s:2:"";s:3:"鄲";s:2:"";s:3:"酉";s:2:"";s:3:"酊";s:2:"";s:3:"酋";s:2:"U";s:3:"酌";s:2:"";s:3:"配";s:2:"z";s:3:"酎";s:2:"";s:3:"酒";s:2:"";s:3:"酔";s:2:"";s:3:"酖";s:2:"";s:3:"酘";s:2:"";s:3:"酢";s:2:"|";s:3:"酣";s:2:"";s:3:"酥";s:2:"";s:3:"酩";s:2:"";s:3:"酪";s:2:"";s:3:"酬";s:2:"V";s:3:"酲";s:2:"";s:3:"酳";s:2:"";s:3:"酵";s:2:"y";s:3:"酷";s:2:"";s:3:"酸";s:2:"_";s:3:"醂";s:2:"";s:3:"醇";s:2:"";s:3:"醉";s:2:"";s:3:"醋";s:2:"";s:3:"醍";s:2:"";s:3:"醐";s:2:"";s:3:"醒";s:2:"";s:3:"醗";s:2:"";s:3:"醜";s:2:"X";s:3:"醢";s:2:"";s:3:"醤";s:2:"";s:3:"醪";s:2:"";s:3:"醫";s:2:"";s:3:"醯";s:2:"";s:3:"醴";s:2:"";s:3:"醵";s:2:"";s:3:"醸";s:2:"";s:3:"醺";s:2:"";s:3:"釀";s:2:"";s:3:"釁";s:2:"";s:3:"釆";s:2:"";s:3:"采";s:2:"";s:3:"釈";s:2:"";s:3:"釉";s:2:"";s:3:"釋";s:2:"";s:3:"里";s:2:"";s:3:"重";s:2:"d";s:3:"野";s:2:"";s:3:"量";s:2:"";s:3:"釐";s:2:"";s:3:"金";s:2:"";s:3:"釖";s:2:"";s:3:"釗";s:2:"";s:3:"釘";s:2:"B";s:3:"釚";s:2:"";s:3:"釛";s:2:"";s:3:"釜";s:2:"";s:3:"針";s:2:"j";s:3:"釞";s:2:"";s:3:"釟";s:2:"";s:3:"釡";s:2:"";s:3:"釣";s:2:"";s:3:"釤";s:2:"";s:3:"釥";s:2:"";s:3:"釦";s:2:"t";s:3:"釧";s:2:"";s:3:"釭";s:2:"";s:3:"釮";s:2:"";s:3:"釵";s:2:"";s:3:"釶";s:2:"";s:3:"釼";s:2:"";s:3:"釿";s:2:"";s:3:"鈆";s:2:"";s:3:"鈊";s:2:"";s:3:"鈍";s:2:"";s:3:"鈎";s:2:"b";s:3:"鈐";s:2:"";s:3:"鈑";s:2:"";s:3:"鈔";s:2:"";s:3:"鈕";s:2:"";s:3:"鈞";s:2:"";s:3:"鈩";s:2:"n";s:3:"鈬";s:2:"";s:3:"鈴";s:2:"";s:3:"鈷";s:2:"";s:3:"鈹";s:2:"";s:3:"鈺";s:2:"";s:3:"鈼";s:2:"";s:3:"鈿";s:2:"";s:3:"鉀";s:2:"";s:3:"鉄";s:2:"S";s:3:"鉅";s:2:"";s:3:"鉈";s:2:"";s:3:"鉉";s:2:"";s:3:"鉋";s:2:"";s:3:"鉎";s:2:"";s:3:"鉐";s:2:"";s:3:"鉑";s:2:"";s:3:"鉗";s:2:"";s:3:"鉙";s:2:"";s:3:"鉚";s:2:"";s:3:"鉛";s:2:"";s:3:"鉞";s:2:"";s:3:"鉢";s:2:"";s:3:"鉤";s:2:"";s:3:"鉦";s:2:"";s:3:"鉧";s:2:"";s:3:"鉱";s:2:"z";s:3:"鉷";s:2:"";s:3:"鉸";s:2:"";s:3:"鉾";s:2:"g";s:3:"銀";s:2:"";s:3:"銃";s:2:"e";s:3:"銅";s:2:"";s:3:"銈";s:2:"_";s:3:"銑";s:2:"L";s:3:"銓";s:2:"";s:3:"銕";s:2:"";s:3:"銖";s:2:"";s:3:"銘";s:2:"";s:3:"銚";s:2:"";s:3:"銛";s:2:"";s:3:"銜";s:2:"";s:3:"銧";s:2:"";s:3:"銭";s:2:"K";s:3:"銷";s:2:"";s:3:"銹";s:2:"";s:3:"鋏";s:2:"";s:3:"鋐";s:2:"";s:3:"鋒";s:2:"N";s:3:"鋓";s:2:"";s:3:"鋕";s:2:"";s:3:"鋗";s:2:"";s:3:"鋙";s:2:"";s:3:"鋠";s:2:"";s:3:"鋤";s:2:"";s:3:"鋧";s:2:"";s:3:"鋩";s:2:"";s:3:"鋪";s:2:"";s:3:"鋭";s:2:"s";s:3:"鋲";s:2:"e";s:3:"鋳";s:2:"";s:3:"鋸";s:2:"";s:3:"鋹";s:2:"e";s:3:"鋺";s:2:"";s:3:"鋻";s:2:"";s:3:"鋼";s:2:"|";s:3:"鋿";s:2:"";s:3:"錂";s:2:"";s:3:"錆";s:2:"K";s:3:"錏";s:2:"";s:3:"錐";s:2:"";s:3:"錘";s:2:"";s:3:"錙";s:2:"@";s:3:"錚";s:2:"B";s:3:"錝";s:2:"";s:3:"錞";s:2:"";s:3:"錠";s:2:"";s:3:"錡";s:2:"";s:3:"錢";s:2:"A";s:3:"錣";s:2:"C";s:3:"錥";s:2:"";s:3:"錦";s:2:"";s:3:"錨";s:2:"d";s:3:"錫";s:2:"";s:3:"錬";s:2:"B";s:3:"錮";s:2:"";s:3:"錯";s:2:"";s:3:"録";s:2:"^";s:3:"錵";s:2:"E";s:3:"錺";s:2:"D";s:3:"錻";s:2:"F";s:3:"鍄";s:2:"";s:3:"鍈";s:2:"^";s:3:"鍋";s:2:"";s:3:"鍍";s:2:"t";s:3:"鍔";s:2:"";s:3:"鍖";s:2:"K";s:3:"鍗";s:2:"";s:3:"鍛";s:2:"b";s:3:"鍜";s:2:"G";s:3:"鍠";s:2:"H";s:3:"鍬";s:2:"L";s:3:"鍮";s:2:"J";s:3:"鍰";s:2:"";s:3:"鍵";s:2:"";s:3:"鍼";s:2:"I";s:3:"鍾";s:2:"";s:3:"鎌";s:2:"";s:3:"鎔";s:2:"O";s:3:"鎖";s:2:"";s:3:"鎗";s:2:"";s:3:"鎚";s:2:"";s:3:"鎤";s:2:"";s:3:"鎧";s:2:"Z";s:3:"鎬";s:2:"M";s:3:"鎭";s:2:"N";s:3:"鎮";s:2:"";s:3:"鎰";s:2:"L";s:3:"鎹";s:2:"P";s:3:"鏃";s:2:"V";s:3:"鏆";s:2:"";s:3:"鏈";s:2:"Y";s:3:"鏐";s:2:"X";s:3:"鏑";s:2:"L";s:3:"鏖";s:2:"Q";s:3:"鏗";s:2:"R";s:3:"鏘";s:2:"U";s:3:"鏝";s:2:"W";s:3:"鏞";s:2:"";s:3:"鏡";s:2:"";s:3:"鏤";s:2:"Z";s:3:"鏥";s:2:"T";s:3:"鏨";s:2:"S";s:3:"鏸";s:2:"";s:3:"鐃";s:2:"^";s:3:"鐇";s:2:"_";s:3:"鐐";s:2:"`";s:3:"鐓";s:2:"]";s:3:"鐔";s:2:"\";s:3:"鐘";s:2:"";s:3:"鐙";s:2:"";s:3:"鐚";s:2:"[";s:3:"鐡";s:2:"d";s:3:"鐫";s:2:"b";s:3:"鐱";s:2:"";s:3:"鐵";s:2:"c";s:3:"鐶";s:2:"a";s:3:"鐸";s:2:"";s:3:"鐺";s:2:"e";s:3:"鑁";s:2:"f";s:3:"鑄";s:2:"h";s:3:"鑅";s:2:"";s:3:"鑈";s:2:"";s:3:"鑑";s:2:"";s:3:"鑒";s:2:"g";s:3:"鑓";s:2:"";s:3:"鑚";s:2:"s";s:3:"鑛";s:2:"i";s:3:"鑞";s:2:"l";s:3:"鑠";s:2:"j";s:3:"鑢";s:2:"k";s:3:"鑪";s:2:"m";s:3:"鑰";s:2:"o";s:3:"鑵";s:2:"p";s:3:"鑷";s:2:"q";s:3:"鑼";s:2:"t";s:3:"鑽";s:2:"r";s:3:"鑾";s:2:"u";s:3:"鑿";s:2:"w";s:3:"钁";s:2:"v";s:3:"長";s:2:"";s:3:"門";s:2:"";s:3:"閂";s:2:"x";s:3:"閃";s:2:"M";s:3:"閇";s:2:"y";s:3:"閉";s:2:"";s:3:"閊";s:2:"z";s:3:"開";s:2:"J";s:3:"閏";s:2:"[";s:3:"閑";s:2:"";s:3:"閒";s:2:"";s:3:"間";s:2:"";s:3:"閔";s:2:"{";s:3:"閖";s:2:"|";s:3:"閘";s:2:"}";s:3:"閙";s:2:"~";s:3:"閠";s:2:"";s:3:"関";s:2:"";s:3:"閣";s:2:"t";s:3:"閤";s:2:"}";s:3:"閥";s:2:"";s:3:"閧";s:2:"";s:3:"閨";s:2:"";s:3:"閭";s:2:"";s:3:"閲";s:2:"{";s:3:"閹";s:2:"";s:3:"閻";s:2:"";s:3:"閼";s:2:"";s:3:"閾";s:2:"";s:3:"闃";s:2:"";s:3:"闇";s:2:"";s:3:"闊";s:2:"";s:3:"闌";s:2:"";s:3:"闍";s:2:"";s:3:"闔";s:2:"";s:3:"闕";s:2:"";s:3:"闖";s:2:"";s:3:"闘";s:2:"";s:3:"關";s:2:"";s:3:"闡";s:2:"";s:3:"闢";s:2:"";s:3:"闥";s:2:"";s:3:"阜";s:2:"";s:3:"阡";s:2:"";s:3:"阨";s:2:"";s:3:"阪";s:2:"";s:3:"阮";s:2:"";s:3:"阯";s:2:"";s:3:"防";s:2:"h";s:3:"阻";s:2:"j";s:3:"阿";s:2:"";s:3:"陀";s:2:"";s:3:"陂";s:2:"";s:3:"附";s:2:"";s:3:"陋";s:2:"";s:3:"陌";s:2:"";s:3:"降";s:2:"~";s:3:"陏";s:2:"";s:3:"限";s:2:"";s:3:"陛";s:2:"";s:3:"陜";s:2:"";s:3:"陝";s:2:"";s:3:"陞";s:2:"";s:3:"陟";s:2:"";s:3:"院";s:2:"@";s:3:"陣";s:2:"w";s:3:"除";s:2:"";s:3:"陥";s:2:"";s:3:"陦";s:2:"";s:3:"陪";s:2:"";s:3:"陬";s:2:"";s:3:"陰";s:2:"A";s:3:"陲";s:2:"";s:3:"陳";s:2:"";s:3:"陵";s:2:"";s:3:"陶";s:2:"";s:3:"陷";s:2:"";s:3:"陸";s:2:"";s:3:"険";s:2:"";s:3:"陽";s:2:"z";s:3:"隅";s:2:"";s:3:"隆";s:2:"";s:3:"隈";s:2:"G";s:3:"隊";s:2:"";s:3:"隋";s:2:"@";s:3:"隍";s:2:"";s:3:"階";s:2:"K";s:3:"随";s:2:"";s:3:"隔";s:2:"u";s:3:"隕";s:2:"";s:3:"隗";s:2:"";s:3:"隘";s:2:"";s:3:"隙";s:2:"";s:3:"際";s:2:"";s:3:"障";s:2:"";s:3:"隝";s:2:"";s:3:"隠";s:2:"B";s:3:"隣";s:2:"";s:3:"隧";s:2:"";s:3:"隨";s:2:"";s:3:"險";s:2:"";s:3:"隯";s:2:"";s:3:"隰";s:2:"";s:3:"隱";s:2:"";s:3:"隲";s:2:"";s:3:"隴";s:2:"";s:3:"隶";s:2:"";s:3:"隷";s:2:"";s:3:"隸";s:2:"";s:3:"隹";s:2:"";s:3:"隻";s:2:"";s:3:"隼";s:2:"";s:3:"雀";s:2:"";s:3:"雁";s:2:"";s:3:"雄";s:2:"Y";s:3:"雅";s:2:"";s:3:"集";s:2:"W";s:3:"雇";s:2:"";s:3:"雉";s:2:"";s:3:"雋";s:2:"";s:3:"雌";s:2:"";s:3:"雍";s:2:"";s:3:"雎";s:2:"";s:3:"雑";s:2:"G";s:3:"雕";s:2:"";s:3:"雖";s:2:"";s:3:"雙";s:2:"";s:3:"雛";s:2:"";s:3:"雜";s:2:"";s:3:"離";s:2:"";s:3:"難";s:2:"";s:3:"雨";s:2:"J";s:3:"雪";s:2:"";s:3:"雫";s:2:"";s:3:"雰";s:2:"";s:3:"雲";s:2:"_";s:3:"零";s:2:"";s:3:"雷";s:2:"";s:3:"雹";s:2:"";s:3:"電";s:2:"d";s:3:"需";s:2:"";s:3:"霄";s:2:"";s:3:"霆";s:2:"";s:3:"震";s:2:"k";s:3:"霈";s:2:"";s:3:"霊";s:2:"";s:3:"霍";s:2:"";s:3:"霎";s:2:"";s:3:"霏";s:2:"";s:3:"霑";s:2:"";s:3:"霓";s:2:"";s:3:"霖";s:2:"";s:3:"霙";s:2:"";s:3:"霜";s:2:"";s:3:"霞";s:2:"";s:3:"霤";s:2:"";s:3:"霧";s:2:"";s:3:"霪";s:2:"";s:3:"霰";s:2:"";s:3:"露";s:2:"I";s:3:"霳";s:2:"";s:3:"霸";s:2:"P";s:3:"霹";s:2:"";s:3:"霻";s:2:"";s:3:"霽";s:2:"";s:3:"霾";s:2:"";s:3:"靂";s:2:"";s:3:"靃";s:2:"";s:3:"靄";s:2:"";s:3:"靆";s:2:"";s:3:"靈";s:2:"";s:3:"靉";s:2:"";s:3:"靍";s:2:"";s:3:"靏";s:2:"";s:3:"靑";s:2:"";s:3:"青";s:2:"";s:3:"靕";s:2:"";s:3:"靖";s:2:"";s:3:"静";s:2:"";s:3:"靜";s:2:"";s:3:"非";s:2:"";s:3:"靠";s:2:"";s:3:"靡";s:2:"r";s:3:"面";s:2:"";s:3:"靤";s:2:"";s:3:"靦";s:2:"";s:3:"靨";s:2:"";s:3:"革";s:2:"v";s:3:"靫";s:2:"";s:3:"靭";s:2:"x";s:3:"靱";s:2:"";s:3:"靴";s:2:"C";s:3:"靹";s:2:"";s:3:"靺";s:2:"";s:3:"靼";s:2:"";s:3:"鞁";s:2:"";s:3:"鞄";s:2:"";s:3:"鞅";s:2:"";s:3:"鞆";s:2:"";s:3:"鞋";s:2:"";s:3:"鞍";s:2:"";s:3:"鞏";s:2:"";s:3:"鞐";s:2:"";s:3:"鞘";s:2:"";s:3:"鞜";s:2:"";s:3:"鞠";s:2:"f";s:3:"鞣";s:2:"";s:3:"鞦";s:2:"";s:3:"鞨";s:2:"";s:3:"鞫";s:2:"";s:3:"鞭";s:2:"";s:3:"鞳";s:2:"";s:3:"鞴";s:2:"";s:3:"韃";s:2:"";s:3:"韆";s:2:"";s:3:"韈";s:2:"";s:3:"韋";s:2:"";s:3:"韓";s:2:"";s:3:"韜";s:2:"";s:3:"韭";s:2:"";s:3:"韮";s:2:"B";s:3:"韲";s:2:"";s:3:"音";s:2:"";s:3:"韵";s:2:"";s:3:"韶";s:2:"";s:3:"韻";s:2:"C";s:3:"響";s:2:"";s:3:"頁";s:2:"";s:3:"頂";s:2:"";s:3:"頃";s:2:"";s:3:"項";s:2:"";s:3:"順";s:2:"";s:3:"須";s:2:"{";s:3:"頌";s:2:"";s:3:"頏";s:2:"";s:3:"預";s:2:"a";s:3:"頑";s:2:"";s:3:"頒";s:2:"";s:3:"頓";s:2:"";s:3:"頗";s:2:"";s:3:"領";s:2:"";s:3:"頚";s:2:"z";s:3:"頡";s:2:"";s:3:"頤";s:2:"";s:3:"頬";s:2:"j";s:3:"頭";s:2:"";s:3:"頴";s:2:"o";s:3:"頷";s:2:"";s:3:"頸";s:2:"";s:3:"頻";s:2:"p";s:3:"頼";s:2:"";s:3:"頽";s:2:"";s:3:"顆";s:2:"";s:3:"顋";s:2:"";s:3:"題";s:2:"";s:3:"額";s:2:"z";s:3:"顎";s:2:"{";s:3:"顏";s:2:"";s:3:"顔";s:2:"";s:3:"顕";s:2:"";s:3:"顗";s:2:"";s:3:"願";s:2:"";s:3:"顛";s:2:"^";s:3:"類";s:2:"";s:3:"顥";s:2:"";s:3:"顧";s:2:"";s:3:"顫";s:2:"";s:3:"顯";s:2:"";s:3:"顰";s:2:"";s:3:"顱";s:2:"@";s:3:"顳";s:2:"B";s:3:"顴";s:2:"A";s:3:"風";s:2:"";s:3:"颪";s:2:"C";s:3:"颯";s:2:"D";s:3:"颱";s:2:"E";s:3:"颶";s:2:"F";s:3:"飃";s:2:"H";s:3:"飄";s:2:"G";s:3:"飆";s:2:"I";s:3:"飛";s:2:"";s:3:"飜";s:2:"";s:3:"食";s:2:"H";s:3:"飢";s:2:"Q";s:3:"飩";s:2:"J";s:3:"飫";s:2:"K";s:3:"飭";s:2:"";s:3:"飮";s:2:"Z";s:3:"飯";s:2:"";s:3:"飲";s:2:"";s:3:"飴";s:2:"";s:3:"飼";s:2:"";s:3:"飽";s:2:"O";s:3:"飾";s:2:"";s:3:"餃";s:2:"L";s:3:"餅";s:2:"";s:3:"餉";s:2:"M";s:3:"養";s:2:"{";s:3:"餌";s:2:"a";s:3:"餐";s:2:"`";s:3:"餒";s:2:"N";s:3:"餓";s:2:"";s:3:"餔";s:2:"O";s:3:"餘";s:2:"P";s:3:"餝";s:2:"R";s:3:"餞";s:2:"S";s:3:"餠";s:2:"U";s:3:"餡";s:2:"Q";s:3:"餤";s:2:"T";s:3:"餧";s:2:"";s:3:"館";s:2:"";s:3:"餬";s:2:"V";s:3:"餮";s:2:"W";s:3:"餽";s:2:"X";s:3:"餾";s:2:"Y";s:3:"饂";s:2:"Z";s:3:"饅";s:2:"\";s:3:"饉";s:2:"[";s:3:"饋";s:2:"^";s:3:"饌";s:2:"a";s:3:"饐";s:2:"]";s:3:"饑";s:2:"_";s:3:"饒";s:2:"`";s:3:"饕";s:2:"b";s:3:"饗";s:2:"";s:3:"首";s:2:"";s:3:"馗";s:2:"c";s:3:"馘";s:2:"d";s:3:"香";s:2:"";s:3:"馞";s:2:"";s:3:"馥";s:2:"e";s:3:"馨";s:2:"]";s:3:"馬";s:2:"n";s:3:"馭";s:2:"f";s:3:"馮";s:2:"g";s:3:"馳";s:2:"y";s:3:"馴";s:2:"";s:3:"馼";s:2:"h";s:3:"駁";s:2:"";s:3:"駄";s:2:"";s:3:"駅";s:2:"w";s:3:"駆";s:2:"";s:3:"駈";s:2:"";s:3:"駐";s:2:"";s:3:"駑";s:2:"m";s:3:"駒";s:2:"";s:3:"駕";s:2:"";s:3:"駘";s:2:"l";s:3:"駛";s:2:"j";s:3:"駝";s:2:"k";s:3:"駟";s:2:"i";s:3:"駢";s:2:"w";s:3:"駭";s:2:"n";s:3:"駮";s:2:"o";s:3:"駱";s:2:"p";s:3:"駲";s:2:"q";s:3:"駸";s:2:"s";s:3:"駻";s:2:"r";s:3:"駿";s:2:"x";s:3:"騁";s:2:"t";s:3:"騅";s:2:"v";s:3:"騎";s:2:"R";s:3:"騏";s:2:"u";s:3:"騒";s:2:"";s:3:"験";s:2:"";s:3:"騙";s:2:"x";s:3:"騨";s:2:"";s:3:"騫";s:2:"y";s:3:"騰";s:2:"";s:3:"騷";s:2:"z";s:3:"騾";s:2:"";s:3:"驀";s:2:"}";s:3:"驂";s:2:"|";s:3:"驃";s:2:"~";s:3:"驅";s:2:"{";s:3:"驍";s:2:"";s:3:"驎";s:2:"";s:3:"驕";s:2:"";s:3:"驗";s:2:"";s:3:"驚";s:2:"";s:3:"驛";s:2:"";s:3:"驟";s:2:"";s:3:"驢";s:2:"";s:3:"驤";s:2:"";s:3:"驥";s:2:"";s:3:"驩";s:2:"";s:3:"驪";s:2:"";s:3:"驫";s:2:"";s:3:"骨";s:2:"";s:3:"骭";s:2:"";s:3:"骰";s:2:"";s:3:"骸";s:2:"[";s:3:"骼";s:2:"";s:3:"髀";s:2:"";s:3:"髄";s:2:"";s:3:"髏";s:2:"";s:3:"髑";s:2:"";s:3:"髓";s:2:"";s:3:"體";s:2:"";s:3:"高";s:2:"";s:3:"髙";s:2:"";s:3:"髜";s:2:"@";s:3:"髞";s:2:"";s:3:"髟";s:2:"";s:3:"髢";s:2:"";s:3:"髣";s:2:"";s:3:"髦";s:2:"";s:3:"髪";s:2:"";s:3:"髫";s:2:"";s:3:"髭";s:2:"E";s:3:"髮";s:2:"";s:3:"髯";s:2:"";s:3:"髱";s:2:"";s:3:"髴";s:2:"";s:3:"髷";s:2:"";s:3:"髻";s:2:"";s:3:"鬆";s:2:"";s:3:"鬘";s:2:"";s:3:"鬚";s:2:"";s:3:"鬟";s:2:"";s:3:"鬢";s:2:"";s:3:"鬣";s:2:"";s:3:"鬥";s:2:"";s:3:"鬧";s:2:"";s:3:"鬨";s:2:"";s:3:"鬩";s:2:"";s:3:"鬪";s:2:"";s:3:"鬮";s:2:"";s:3:"鬯";s:2:"";s:3:"鬱";s:2:"T";s:3:"鬲";s:2:"";s:3:"鬻";s:2:"";s:3:"鬼";s:2:"S";s:3:"魁";s:2:"@";s:3:"魂";s:2:"";s:3:"魃";s:2:"";s:3:"魄";s:2:"";s:3:"魅";s:2:"";s:3:"魍";s:2:"";s:3:"魎";s:2:"";s:3:"魏";s:2:"";s:3:"魑";s:2:"";s:3:"魔";s:2:"";s:3:"魘";s:2:"";s:3:"魚";s:2:"";s:3:"魯";s:2:"D";s:3:"魲";s:2:"B";s:3:"魴";s:2:"";s:3:"魵";s:2:"A";s:3:"鮃";s:2:"";s:3:"鮎";s:2:"";s:3:"鮏";s:2:"C";s:3:"鮑";s:2:"";s:3:"鮒";s:2:"";s:3:"鮓";s:2:"";s:3:"鮖";s:2:"";s:3:"鮗";s:2:"";s:3:"鮟";s:2:"";s:3:"鮠";s:2:"";s:3:"鮨";s:2:"";s:3:"鮪";s:2:"";s:3:"鮫";s:2:"L";s:3:"鮭";s:2:"";s:3:"鮮";s:2:"N";s:3:"鮱";s:2:"D";s:3:"鮴";s:2:"";s:3:"鮹";s:2:"";s:3:"鮻";s:2:"E";s:3:"鯀";s:2:"";s:3:"鯆";s:2:"";s:3:"鯉";s:2:"";s:3:"鯊";s:2:"";s:3:"鯏";s:2:"";s:3:"鯑";s:2:"";s:3:"鯒";s:2:"";s:3:"鯔";s:2:"";s:3:"鯖";s:2:"I";s:3:"鯛";s:2:"";s:3:"鯡";s:2:"";s:3:"鯢";s:2:"";s:3:"鯣";s:2:"";s:3:"鯤";s:2:"";s:3:"鯨";s:2:"~";s:3:"鯰";s:2:"";s:3:"鯱";s:2:"";s:3:"鯲";s:2:"";s:3:"鯵";s:2:"";s:3:"鰀";s:2:"F";s:3:"鰄";s:2:"";s:3:"鰆";s:2:"";s:3:"鰈";s:2:"";s:3:"鰉";s:2:"";s:3:"鰊";s:2:"";s:3:"鰌";s:2:"";s:3:"鰍";s:2:"";s:3:"鰐";s:2:"k";s:3:"鰒";s:2:"";s:3:"鰓";s:2:"";s:3:"鰔";s:2:"";s:3:"鰕";s:2:"";s:3:"鰛";s:2:"";s:3:"鰡";s:2:"";s:3:"鰤";s:2:"";s:3:"鰥";s:2:"";s:3:"鰭";s:2:"h";s:3:"鰮";s:2:"";s:3:"鰯";s:2:"";s:3:"鰰";s:2:"";s:3:"鰲";s:2:"";s:3:"鰹";s:2:"";s:3:"鰺";s:2:"";s:3:"鰻";s:2:"V";s:3:"鰾";s:2:"";s:3:"鱆";s:2:"";s:3:"鱇";s:2:"";s:3:"鱈";s:2:"L";s:3:"鱒";s:2:"";s:3:"鱗";s:2:"";s:3:"鱚";s:2:"";s:3:"鱠";s:2:"";s:3:"鱧";s:2:"";s:3:"鱶";s:2:"";s:3:"鱸";s:2:"";s:3:"鳥";s:2:"";s:3:"鳧";s:2:"";s:3:"鳩";s:2:"";s:3:"鳫";s:2:"";s:3:"鳬";s:2:"";s:3:"鳰";s:2:"";s:3:"鳳";s:2:"P";s:3:"鳴";s:2:"";s:3:"鳶";s:2:"";s:3:"鴃";s:2:"";s:3:"鴆";s:2:"";s:3:"鴇";s:2:"";s:3:"鴈";s:2:"";s:3:"鴉";s:2:"";s:3:"鴎";s:2:"";s:3:"鴒";s:2:"";s:3:"鴕";s:2:"";s:3:"鴛";s:2:"";s:3:"鴟";s:2:"";s:3:"鴣";s:2:"";s:3:"鴦";s:2:"";s:3:"鴨";s:2:"";s:3:"鴪";s:2:"";s:3:"鴫";s:2:"";s:3:"鴬";s:2:"";s:3:"鴻";s:2:"";s:3:"鴾";s:2:"";s:3:"鴿";s:2:"";s:3:"鵁";s:2:"";s:3:"鵄";s:2:"";s:3:"鵆";s:2:"";s:3:"鵈";s:2:"";s:3:"鵐";s:2:"D";s:3:"鵑";s:2:"C";s:3:"鵙";s:2:"E";s:3:"鵜";s:2:"L";s:3:"鵝";s:2:"@";s:3:"鵞";s:2:"A";s:3:"鵠";s:2:"";s:3:"鵡";s:2:"";s:3:"鵤";s:2:"B";s:3:"鵫";s:2:"H";s:3:"鵬";s:2:"Q";s:3:"鵯";s:2:"J";s:3:"鵰";s:2:"G";s:3:"鵲";s:2:"F";s:3:"鵺";s:2:"K";s:3:"鶇";s:2:"H";s:3:"鶉";s:2:"G";s:3:"鶏";s:2:"{";s:3:"鶚";s:2:"L";s:3:"鶤";s:2:"M";s:3:"鶩";s:2:"N";s:3:"鶫";s:2:"I";s:3:"鶯";s:2:"";s:3:"鶲";s:2:"O";s:3:"鶴";s:2:"";s:3:"鶸";s:2:"S";s:3:"鶺";s:2:"T";s:3:"鶻";s:2:"R";s:3:"鷁";s:2:"Q";s:3:"鷂";s:2:"W";s:3:"鷄";s:2:"P";s:3:"鷆";s:2:"U";s:3:"鷏";s:2:"V";s:3:"鷓";s:2:"Y";s:3:"鷙";s:2:"X";s:3:"鷦";s:2:"[";s:3:"鷭";s:2:"\";s:3:"鷯";s:2:"]";s:3:"鷲";s:2:"h";s:3:"鷸";s:2:"Z";s:3:"鷹";s:2:"";s:3:"鷺";s:2:"";s:3:"鷽";s:2:"^";s:3:"鸙";s:2:"J";s:3:"鸚";s:2:"_";s:3:"鸛";s:2:"`";s:3:"鸞";s:2:"a";s:3:"鹵";s:2:"b";s:3:"鹸";s:2:"";s:3:"鹹";s:2:"c";s:3:"鹽";s:2:"d";s:3:"鹿";s:2:"";s:3:"麁";s:2:"e";s:3:"麈";s:2:"f";s:3:"麋";s:2:"g";s:3:"麌";s:2:"h";s:3:"麑";s:2:"k";s:3:"麒";s:2:"i";s:3:"麓";s:2:"[";s:3:"麕";s:2:"j";s:3:"麗";s:2:"";s:3:"麝";s:2:"l";s:3:"麟";s:2:"";s:3:"麥";s:2:"m";s:3:"麦";s:2:"";s:3:"麩";s:2:"n";s:3:"麪";s:2:"p";s:3:"麭";s:2:"q";s:3:"麸";s:2:"o";s:3:"麹";s:2:"";s:3:"麺";s:2:"";s:3:"麻";s:2:"";s:3:"麼";s:2:"";s:3:"麾";s:2:"";s:3:"麿";s:2:"";s:3:"黄";s:2:"";s:3:"黌";s:2:"s";s:3:"黍";s:2:"o";s:3:"黎";s:2:"t";s:3:"黏";s:2:"u";s:3:"黐";s:2:"v";s:3:"黑";s:2:"K";s:3:"黒";s:2:"";s:3:"黔";s:2:"w";s:3:"默";s:2:"";s:3:"黙";s:2:"";s:3:"黛";s:2:"";s:3:"黜";s:2:"x";s:3:"黝";s:2:"z";s:3:"點";s:2:"y";s:3:"黠";s:2:"{";s:3:"黥";s:2:"|";s:3:"黨";s:2:"}";s:3:"黯";s:2:"~";s:3:"黴";s:2:"";s:3:"黶";s:2:"";s:3:"黷";s:2:"";s:3:"黹";s:2:"";s:3:"黻";s:2:"";s:3:"黼";s:2:"";s:3:"黽";s:2:"";s:3:"鼇";s:2:"";s:3:"鼈";s:2:"";s:3:"鼎";s:2:"C";s:3:"鼓";s:2:"";s:3:"鼕";s:2:"";s:3:"鼠";s:2:"l";s:3:"鼡";s:2:"";s:3:"鼬";s:2:"";s:3:"鼻";s:2:"@";s:3:"鼾";s:2:"";s:3:"齊";s:2:"";s:3:"齋";s:2:"V";s:3:"齎";s:2:"";s:3:"齏";s:2:"";s:3:"齒";s:2:"";s:3:"齔";s:2:"";s:3:"齟";s:2:"";s:3:"齠";s:2:"";s:3:"齡";s:2:"";s:3:"齢";s:2:"";s:3:"齣";s:2:"";s:3:"齦";s:2:"";s:3:"齧";s:2:"";s:3:"齪";s:2:"";s:3:"齬";s:2:"";s:3:"齲";s:2:"";s:3:"齶";s:2:"";s:3:"齷";s:2:"";s:3:"龍";s:2:"";s:3:"龕";s:2:"";s:3:"龜";s:2:"";s:3:"龝";s:2:"s";s:3:"龠";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"";s:1:"";s:3:"朗";s:2:"";s:3:"隆";s:2:"";s:3:"﨎";s:2:"";s:3:"﨏";s:2:"";s:3:"塚";s:2:"";s:3:"﨑";s:2:"";s:3:"晴";s:2:"";s:3:"﨓";s:2:"";s:3:"﨔";s:2:"";s:3:"凞";s:2:"X";s:3:"猪";s:2:"^";s:3:"益";s:2:"u";s:3:"礼";s:2:"}";s:3:"神";s:2:"~";s:3:"祥";s:2:"";s:3:"福";s:2:"";s:3:"靖";s:2:"";s:3:"精";s:2:"";s:3:"羽";s:2:"";s:3:"﨟";s:2:"";s:3:"蘒";s:2:"";s:3:"﨡";s:2:"";s:3:"諸";s:2:"";s:3:"﨣";s:2:"";s:3:"﨤";s:2:"";s:3:"逸";s:2:"";s:3:"都";s:2:"";s:3:"﨧";s:2:"";s:3:"﨨";s:2:"";s:3:"﨩";s:2:"";s:3:"飯";s:2:"";s:3:"飼";s:2:"";s:3:"館";s:2:"";s:3:"鶴";s:2:"I";s:3:"！";s:2:"I";s:3:"＂";s:2:"W";s:3:"＃";s:2:"";s:3:"＄";s:2:"";s:3:"％";s:2:"";s:3:"＆";s:2:"";s:3:"＇";s:2:"V";s:3:"（";s:2:"i";s:3:"）";s:2:"j";s:3:"＊";s:2:"";s:3:"＋";s:2:"{";s:3:"，";s:2:"C";s:3:"－";s:2:"|";s:3:"．";s:2:"D";s:3:"／";s:2:"^";s:3:"０";s:2:"O";s:3:"１";s:2:"P";s:3:"２";s:2:"Q";s:3:"３";s:2:"R";s:3:"４";s:2:"S";s:3:"５";s:2:"T";s:3:"６";s:2:"U";s:3:"７";s:2:"V";s:3:"８";s:2:"W";s:3:"９";s:2:"X";s:3:"：";s:2:"F";s:3:"；";s:2:"G";s:3:"＜";s:2:"";s:3:"＝";s:2:"";s:3:"＞";s:2:"";s:3:"？";s:2:"H";s:3:"＠";s:2:"";s:3:"Ａ";s:2:"`";s:3:"Ｂ";s:2:"a";s:3:"Ｃ";s:2:"b";s:3:"Ｄ";s:2:"c";s:3:"Ｅ";s:2:"d";s:3:"Ｆ";s:2:"e";s:3:"Ｇ";s:2:"f";s:3:"Ｈ";s:2:"g";s:3:"Ｉ";s:2:"h";s:3:"Ｊ";s:2:"i";s:3:"Ｋ";s:2:"j";s:3:"Ｌ";s:2:"k";s:3:"Ｍ";s:2:"l";s:3:"Ｎ";s:2:"m";s:3:"Ｏ";s:2:"n";s:3:"Ｐ";s:2:"o";s:3:"Ｑ";s:2:"p";s:3:"Ｒ";s:2:"q";s:3:"Ｓ";s:2:"r";s:3:"Ｔ";s:2:"s";s:3:"Ｕ";s:2:"t";s:3:"Ｖ";s:2:"u";s:3:"Ｗ";s:2:"v";s:3:"Ｘ";s:2:"w";s:3:"Ｙ";s:2:"x";s:3:"Ｚ";s:2:"y";s:3:"［";s:2:"m";s:3:"＼";s:2:"_";s:3:"］";s:2:"n";s:3:"＾";s:2:"O";s:3:"＿";s:2:"Q";s:3:"｀";s:2:"M";s:3:"ａ";s:2:"";s:3:"ｂ";s:2:"";s:3:"ｃ";s:2:"";s:3:"ｄ";s:2:"";s:3:"ｅ";s:2:"";s:3:"ｆ";s:2:"";s:3:"ｇ";s:2:"";s:3:"ｈ";s:2:"";s:3:"ｉ";s:2:"";s:3:"ｊ";s:2:"";s:3:"ｋ";s:2:"";s:3:"ｌ";s:2:"";s:3:"ｍ";s:2:"";s:3:"ｎ";s:2:"";s:3:"ｏ";s:2:"";s:3:"ｐ";s:2:"";s:3:"ｑ";s:2:"";s:3:"ｒ";s:2:"";s:3:"ｓ";s:2:"";s:3:"ｔ";s:2:"";s:3:"ｕ";s:2:"";s:3:"ｖ";s:2:"";s:3:"ｗ";s:2:"";s:3:"ｘ";s:2:"";s:3:"ｙ";s:2:"";s:3:"ｚ";s:2:"";s:3:"｛";s:2:"o";s:3:"｜";s:2:"b";s:3:"｝";s:2:"p";s:3:"～";s:2:"`";s:3:"｡";s:1:"";s:3:"｢";s:1:"";s:3:"｣";s:1:"";s:3:"､";s:1:"";s:3:"･";s:1:"";s:3:"ｦ";s:1:"";s:3:"ｧ";s:1:"";s:3:"ｨ";s:1:"";s:3:"ｩ";s:1:"";s:3:"ｪ";s:1:"";s:3:"ｫ";s:1:"";s:3:"ｬ";s:1:"";s:3:"ｭ";s:1:"";s:3:"ｮ";s:1:"";s:3:"ｯ";s:1:"";s:3:"ｰ";s:1:"";s:3:"ｱ";s:1:"";s:3:"ｲ";s:1:"";s:3:"ｳ";s:1:"";s:3:"ｴ";s:1:"";s:3:"ｵ";s:1:"";s:3:"ｶ";s:1:"";s:3:"ｷ";s:1:"";s:3:"ｸ";s:1:"";s:3:"ｹ";s:1:"";s:3:"ｺ";s:1:"";s:3:"ｻ";s:1:"";s:3:"ｼ";s:1:"";s:3:"ｽ";s:1:"";s:3:"ｾ";s:1:"";s:3:"ｿ";s:1:"";s:3:"ﾀ";s:1:"";s:3:"ﾁ";s:1:"";s:3:"ﾂ";s:1:"";s:3:"ﾃ";s:1:"";s:3:"ﾄ";s:1:"";s:3:"ﾅ";s:1:"";s:3:"ﾆ";s:1:"";s:3:"ﾇ";s:1:"";s:3:"ﾈ";s:1:"";s:3:"ﾉ";s:1:"";s:3:"ﾊ";s:1:"";s:3:"ﾋ";s:1:"";s:3:"ﾌ";s:1:"";s:3:"ﾍ";s:1:"";s:3:"ﾎ";s:1:"";s:3:"ﾏ";s:1:"";s:3:"ﾐ";s:1:"";s:3:"ﾑ";s:1:"";s:3:"ﾒ";s:1:"";s:3:"ﾓ";s:1:"";s:3:"ﾔ";s:1:"";s:3:"ﾕ";s:1:"";s:3:"ﾖ";s:1:"";s:3:"ﾗ";s:1:"";s:3:"ﾘ";s:1:"";s:3:"ﾙ";s:1:"";s:3:"ﾚ";s:1:"";s:3:"ﾛ";s:1:"";s:3:"ﾜ";s:1:"";s:3:"ﾝ";s:1:"";s:3:"ﾞ";s:1:"";s:3:"ﾟ";s:1:"";s:3:"￠";s:2:"";s:3:"￡";s:2:"";s:3:"￢";s:2:"";s:3:"￣";s:2:"P";s:3:"￤";s:2:"U";s:3:"￥";s:2:"";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/data/to.bestfit936.ser
@@ -0,0 +1,3 @@
+a:24482:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:"¢";s:2:"";s:2:"£";s:2:"";s:2:"¤";s:2:"";s:2:"¥";s:2:"";s:2:"¦";s:1:"|";s:2:"§";s:2:"";s:2:"¨";s:2:"";s:2:"ª";s:1:"a";s:2:"­";s:1:"-";s:2:"¯";s:2:"";s:2:"°";s:2:"";s:2:"±";s:2:"";s:2:"²";s:1:"2";s:2:"³";s:1:"3";s:2:"´";s:2:"";s:2:"µ";s:2:"";s:2:"·";s:2:"";s:2:"¹";s:1:"1";s:2:"º";s:1:"o";s:2:"À";s:2:"";s:2:"Á";s:2:"";s:2:"È";s:2:"";s:2:"É";s:2:"";s:2:"Ê";s:2:"";s:2:"Ì";s:2:"";s:2:"Í";s:2:"";s:2:"Ð";s:1:"D";s:2:"Ò";s:2:"";s:2:"Ó";s:2:"";s:2:"×";s:2:"";s:2:"Ù";s:2:"";s:2:"Ú";s:2:"";s:2:"Ü";s:2:"";s:2:"Ý";s:1:"Y";s:2:"Þ";s:1:"T";s:2:"à";s:2:"";s:2:"á";s:2:"";s:2:"â";s:1:"a";s:2:"è";s:2:"";s:2:"é";s:2:"";s:2:"ê";s:2:"";s:2:"ì";s:2:"";s:2:"í";s:2:"";s:2:"ð";s:1:"e";s:2:"ò";s:2:"";s:2:"ó";s:2:"";s:2:"÷";s:2:"";s:2:"ù";s:2:"";s:2:"ú";s:2:"";s:2:"ü";s:2:"";s:2:"ý";s:1:"y";s:2:"þ";s:1:"t";s:2:"Ā";s:2:"";s:2:"ā";s:2:"";s:2:"Ē";s:2:"";s:2:"ē";s:2:"";s:2:"Ě";s:2:"";s:2:"ě";s:2:"";s:2:"Ī";s:2:"";s:2:"ī";s:2:"";s:2:"ń";s:2:"";s:2:"ň";s:2:"";s:2:"Ō";s:2:"";s:2:"ō";s:2:"";s:2:"Ū";s:2:"";s:2:"ū";s:2:"";s:2:"ǁ";s:2:"";s:2:"Ǎ";s:2:"";s:2:"ǎ";s:2:"";s:2:"Ǐ";s:2:"";s:2:"ǐ";s:2:"";s:2:"Ǒ";s:2:"";s:2:"ǒ";s:2:"";s:2:"Ǔ";s:2:"";s:2:"ǔ";s:2:"";s:2:"Ǖ";s:2:"";s:2:"ǖ";s:2:"";s:2:"Ǘ";s:2:"";s:2:"ǘ";s:2:"";s:2:"Ǚ";s:2:"";s:2:"ǚ";s:2:"";s:2:"Ǜ";s:2:"";s:2:"ǜ";s:2:"";s:2:"ɑ";s:2:"";s:2:"ɡ";s:2:"";s:2:"ˇ";s:2:"";s:2:"ˉ";s:2:"";s:2:"ˊ";s:2:"@";s:2:"ˋ";s:2:"A";s:2:"˙";s:2:"B";s:2:"Α";s:2:"";s:2:"Β";s:2:"";s:2:"Γ";s:2:"";s:2:"Δ";s:2:"";s:2:"Ε";s:2:"";s:2:"Ζ";s:2:"";s:2:"Η";s:2:"";s:2:"Θ";s:2:"";s:2:"Ι";s:2:"";s:2:"Κ";s:2:"";s:2:"Λ";s:2:"";s:2:"Μ";s:2:"";s:2:"Ν";s:2:"";s:2:"Ξ";s:2:"";s:2:"Ο";s:2:"";s:2:"Π";s:2:"";s:2:"Ρ";s:2:"";s:2:"Σ";s:2:"";s:2:"Τ";s:2:"";s:2:"Υ";s:2:"";s:2:"Φ";s:2:"";s:2:"Χ";s:2:"";s:2:"Ψ";s:2:"";s:2:"Ω";s:2:"";s:2:"α";s:2:"";s:2:"β";s:2:"";s:2:"γ";s:2:"";s:2:"δ";s:2:"";s:2:"ε";s:2:"";s:2:"ζ";s:2:"";s:2:"η";s:2:"";s:2:"θ";s:2:"";s:2:"ι";s:2:"";s:2:"κ";s:2:"";s:2:"λ";s:2:"";s:2:"μ";s:2:"";s:2:"ν";s:2:"";s:2:"ξ";s:2:"";s:2:"ο";s:2:"";s:2:"π";s:2:"";s:2:"ρ";s:2:"";s:2:"σ";s:2:"";s:2:"τ";s:2:"";s:2:"υ";s:2:"";s:2:"φ";s:2:"";s:2:"χ";s:2:"";s:2:"ψ";s:2:"";s:2:"ω";s:2:"";s:2:"Ё";s:2:"";s:2:"А";s:2:"";s:2:"Б";s:2:"";s:2:"В";s:2:"";s:2:"Г";s:2:"";s:2:"Д";s:2:"";s:2:"Е";s:2:"";s:2:"Ж";s:2:"";s:2:"З";s:2:"";s:2:"И";s:2:"";s:2:"Й";s:2:"";s:2:"К";s:2:"";s:2:"Л";s:2:"";s:2:"М";s:2:"";s:2:"Н";s:2:"";s:2:"О";s:2:"";s:2:"П";s:2:"";s:2:"Р";s:2:"";s:2:"С";s:2:"";s:2:"Т";s:2:"";s:2:"У";s:2:"";s:2:"Ф";s:2:"";s:2:"Х";s:2:"";s:2:"Ц";s:2:"";s:2:"Ч";s:2:"";s:2:"Ш";s:2:"";s:2:"Щ";s:2:"";s:2:"Ъ";s:2:"";s:2:"Ы";s:2:"";s:2:"Ь";s:2:"";s:2:"Э";s:2:"";s:2:"Ю";s:2:"";s:2:"Я";s:2:"";s:2:"а";s:2:"";s:2:"б";s:2:"";s:2:"в";s:2:"";s:2:"г";s:2:"";s:2:"д";s:2:"";s:2:"е";s:2:"";s:2:"ж";s:2:"";s:2:"з";s:2:"";s:2:"и";s:2:"";s:2:"й";s:2:"";s:2:"к";s:2:"";s:2:"л";s:2:"";s:2:"м";s:2:"";s:2:"н";s:2:"";s:2:"о";s:2:"";s:2:"п";s:2:"";s:2:"р";s:2:"";s:2:"с";s:2:"";s:2:"т";s:2:"";s:2:"у";s:2:"";s:2:"ф";s:2:"";s:2:"х";s:2:"";s:2:"ц";s:2:"";s:2:"ч";s:2:"";s:2:"ш";s:2:"";s:2:"щ";s:2:"";s:2:"ъ";s:2:"";s:2:"ы";s:2:"";s:2:"ь";s:2:"";s:2:"э";s:2:"";s:2:"ю";s:2:"";s:2:"я";s:2:"";s:2:"ё";s:2:"";s:3:"‐";s:2:"\";s:3:"–";s:2:"C";s:3:"—";s:2:"";s:3:"―";s:2:"D";s:3:"‖";s:2:"";s:3:"‘";s:2:"";s:3:"’";s:2:"";s:3:"“";s:2:"";s:3:"”";s:2:"";s:3:"‥";s:2:"E";s:3:"…";s:2:"";s:3:"‰";s:2:"";s:3:"′";s:2:"";s:3:"″";s:2:"";s:3:"‵";s:2:"F";s:3:"※";s:2:"";s:3:"‾";s:2:"";s:3:"€";s:1:"";s:3:"℃";s:2:"";s:3:"℅";s:2:"G";s:3:"℉";s:2:"H";s:3:"№";s:2:"";s:3:"℡";s:2:"Y";s:3:"Ⅰ";s:2:"";s:3:"Ⅱ";s:2:"";s:3:"Ⅲ";s:2:"";s:3:"Ⅳ";s:2:"";s:3:"Ⅴ";s:2:"";s:3:"Ⅵ";s:2:"";s:3:"Ⅶ";s:2:"";s:3:"Ⅷ";s:2:"";s:3:"Ⅸ";s:2:"";s:3:"Ⅹ";s:2:"";s:3:"Ⅺ";s:2:"";s:3:"Ⅻ";s:2:"";s:3:"ⅰ";s:2:"";s:3:"ⅱ";s:2:"";s:3:"ⅲ";s:2:"";s:3:"ⅳ";s:2:"";s:3:"ⅴ";s:2:"";s:3:"ⅵ";s:2:"";s:3:"ⅶ";s:2:"";s:3:"ⅷ";s:2:"";s:3:"ⅸ";s:2:"";s:3:"ⅹ";s:2:"";s:3:"←";s:2:"";s:3:"↑";s:2:"";s:3:"→";s:2:"";s:3:"↓";s:2:"";s:3:"↖";s:2:"I";s:3:"↗";s:2:"J";s:3:"↘";s:2:"K";s:3:"↙";s:2:"L";s:3:"∈";s:2:"";s:3:"∏";s:2:"";s:3:"∑";s:2:"";s:3:"∕";s:2:"M";s:3:"∘";s:2:"";s:3:"√";s:2:"";s:3:"∝";s:2:"";s:3:"∞";s:2:"";s:3:"∟";s:2:"N";s:3:"∠";s:2:"";s:3:"∣";s:2:"O";s:3:"∥";s:2:"";s:3:"∧";s:2:"";s:3:"∨";s:2:"";s:3:"∩";s:2:"";s:3:"∪";s:2:"";s:3:"∫";s:2:"";s:3:"∮";s:2:"";s:3:"∴";s:2:"";s:3:"∵";s:2:"";s:3:"∶";s:2:"";s:3:"∷";s:2:"";s:3:"∼";s:2:"";s:3:"∽";s:2:"";s:3:"≈";s:2:"";s:3:"≌";s:2:"";s:3:"≒";s:2:"P";s:3:"≠";s:2:"";s:3:"≡";s:2:"";s:3:"≤";s:2:"";s:3:"≥";s:2:"";s:3:"≦";s:2:"Q";s:3:"≧";s:2:"R";s:3:"≮";s:2:"";s:3:"≯";s:2:"";s:3:"⊕";s:2:"";s:3:"⊙";s:2:"";s:3:"⊥";s:2:"";s:3:"⊿";s:2:"S";s:3:"⌒";s:2:"";s:3:"①";s:2:"";s:3:"②";s:2:"";s:3:"③";s:2:"";s:3:"④";s:2:"";s:3:"⑤";s:2:"";s:3:"⑥";s:2:"";s:3:"⑦";s:2:"";s:3:"⑧";s:2:"";s:3:"⑨";s:2:"";s:3:"⑩";s:2:"";s:3:"⑴";s:2:"";s:3:"⑵";s:2:"";s:3:"⑶";s:2:"";s:3:"⑷";s:2:"";s:3:"⑸";s:2:"";s:3:"⑹";s:2:"";s:3:"⑺";s:2:"";s:3:"⑻";s:2:"";s:3:"⑼";s:2:"";s:3:"⑽";s:2:"";s:3:"⑾";s:2:"";s:3:"⑿";s:2:"";s:3:"⒀";s:2:"";s:3:"⒁";s:2:"";s:3:"⒂";s:2:"";s:3:"⒃";s:2:"";s:3:"⒄";s:2:"";s:3:"⒅";s:2:"";s:3:"⒆";s:2:"";s:3:"⒇";s:2:"";s:3:"⒈";s:2:"";s:3:"⒉";s:2:"";s:3:"⒊";s:2:"";s:3:"⒋";s:2:"";s:3:"⒌";s:2:"";s:3:"⒍";s:2:"";s:3:"⒎";s:2:"";s:3:"⒏";s:2:"";s:3:"⒐";s:2:"";s:3:"⒑";s:2:"";s:3:"⒒";s:2:"";s:3:"⒓";s:2:"";s:3:"⒔";s:2:"";s:3:"⒕";s:2:"";s:3:"⒖";s:2:"";s:3:"⒗";s:2:"";s:3:"⒘";s:2:"";s:3:"⒙";s:2:"";s:3:"⒚";s:2:"";s:3:"⒛";s:2:"";s:3:"─";s:2:"";s:3:"━";s:2:"";s:3:"│";s:2:"";s:3:"┃";s:2:"";s:3:"┄";s:2:"";s:3:"┅";s:2:"";s:3:"┆";s:2:"";s:3:"┇";s:2:"";s:3:"┈";s:2:"";s:3:"┉";s:2:"";s:3:"┊";s:2:"";s:3:"┋";s:2:"";s:3:"┌";s:2:"";s:3:"┍";s:2:"";s:3:"┎";s:2:"";s:3:"┏";s:2:"";s:3:"┐";s:2:"";s:3:"┑";s:2:"";s:3:"┒";s:2:"";s:3:"┓";s:2:"";s:3:"└";s:2:"";s:3:"┕";s:2:"";s:3:"┖";s:2:"";s:3:"┗";s:2:"";s:3:"┘";s:2:"";s:3:"┙";s:2:"";s:3:"┚";s:2:"";s:3:"┛";s:2:"";s:3:"├";s:2:"";s:3:"┝";s:2:"";s:3:"┞";s:2:"";s:3:"┟";s:2:"";s:3:"┠";s:2:"";s:3:"┡";s:2:"";s:3:"┢";s:2:"";s:3:"┣";s:2:"";s:3:"┤";s:2:"";s:3:"┥";s:2:"";s:3:"┦";s:2:"";s:3:"┧";s:2:"";s:3:"┨";s:2:"";s:3:"┩";s:2:"";s:3:"┪";s:2:"";s:3:"┫";s:2:"";s:3:"┬";s:2:"";s:3:"┭";s:2:"";s:3:"┮";s:2:"";s:3:"┯";s:2:"";s:3:"┰";s:2:"";s:3:"┱";s:2:"";s:3:"┲";s:2:"";s:3:"┳";s:2:"";s:3:"┴";s:2:"";s:3:"┵";s:2:"";s:3:"┶";s:2:"";s:3:"┷";s:2:"";s:3:"┸";s:2:"";s:3:"┹";s:2:"";s:3:"┺";s:2:"";s:3:"┻";s:2:"";s:3:"┼";s:2:"";s:3:"┽";s:2:"";s:3:"┾";s:2:"";s:3:"┿";s:2:"";s:3:"╀";s:2:"";s:3:"╁";s:2:"";s:3:"╂";s:2:"";s:3:"╃";s:2:"";s:3:"╄";s:2:"";s:3:"╅";s:2:"";s:3:"╆";s:2:"";s:3:"╇";s:2:"";s:3:"╈";s:2:"";s:3:"╉";s:2:"";s:3:"╊";s:2:"";s:3:"╋";s:2:"";s:3:"═";s:2:"T";s:3:"║";s:2:"U";s:3:"╒";s:2:"V";s:3:"╓";s:2:"W";s:3:"╔";s:2:"X";s:3:"╕";s:2:"Y";s:3:"╖";s:2:"Z";s:3:"╗";s:2:"[";s:3:"╘";s:2:"\";s:3:"╙";s:2:"]";s:3:"╚";s:2:"^";s:3:"╛";s:2:"_";s:3:"╜";s:2:"`";s:3:"╝";s:2:"a";s:3:"╞";s:2:"b";s:3:"╟";s:2:"c";s:3:"╠";s:2:"d";s:3:"╡";s:2:"e";s:3:"╢";s:2:"f";s:3:"╣";s:2:"g";s:3:"╤";s:2:"h";s:3:"╥";s:2:"i";s:3:"╦";s:2:"j";s:3:"╧";s:2:"k";s:3:"╨";s:2:"l";s:3:"╩";s:2:"m";s:3:"╪";s:2:"n";s:3:"╫";s:2:"o";s:3:"╬";s:2:"p";s:3:"╭";s:2:"q";s:3:"╮";s:2:"r";s:3:"╯";s:2:"s";s:3:"╰";s:2:"t";s:3:"╱";s:2:"u";s:3:"╲";s:2:"v";s:3:"╳";s:2:"w";s:3:"▁";s:2:"x";s:3:"▂";s:2:"y";s:3:"▃";s:2:"z";s:3:"▄";s:2:"{";s:3:"▅";s:2:"|";s:3:"▆";s:2:"}";s:3:"▇";s:2:"~";s:3:"█";s:2:"";s:3:"▉";s:2:"";s:3:"▊";s:2:"";s:3:"▋";s:2:"";s:3:"▌";s:2:"";s:3:"▍";s:2:"";s:3:"▎";s:2:"";s:3:"▏";s:2:"";s:3:"▓";s:2:"";s:3:"▔";s:2:"";s:3:"▕";s:2:"";s:3:"■";s:2:"";s:3:"□";s:2:"";s:3:"▲";s:2:"";s:3:"△";s:2:"";s:3:"▼";s:2:"";s:3:"▽";s:2:"";s:3:"◆";s:2:"";s:3:"◇";s:2:"";s:3:"○";s:2:"";s:3:"◎";s:2:"";s:3:"●";s:2:"";s:3:"◢";s:2:"";s:3:"◣";s:2:"";s:3:"◤";s:2:"";s:3:"◥";s:2:"";s:3:"★";s:2:"";s:3:"☆";s:2:"";s:3:"☉";s:2:"";s:3:"♀";s:2:"";s:3:"♂";s:2:"";s:3:"　";s:2:"";s:3:"、";s:2:"";s:3:"。";s:2:"";s:3:"〃";s:2:"";s:3:"々";s:2:"";s:3:"〆";s:2:"e";s:3:"〇";s:2:"";s:3:"〈";s:2:"";s:3:"〉";s:2:"";s:3:"《";s:2:"";s:3:"》";s:2:"";s:3:"「";s:2:"";s:3:"」";s:2:"";s:3:"『";s:2:"";s:3:"』";s:2:"";s:3:"【";s:2:"";s:3:"】";s:2:"";s:3:"〒";s:2:"";s:3:"〓";s:2:"";s:3:"〔";s:2:"";s:3:"〕";s:2:"";s:3:"〖";s:2:"";s:3:"〗";s:2:"";s:3:"〝";s:2:"";s:3:"〞";s:2:"";s:3:"〡";s:2:"@";s:3:"〢";s:2:"A";s:3:"〣";s:2:"B";s:3:"〤";s:2:"C";s:3:"〥";s:2:"D";s:3:"〦";s:2:"E";s:3:"〧";s:2:"F";s:3:"〨";s:2:"G";s:3:"〩";s:2:"H";s:3:"ぁ";s:2:"";s:3:"あ";s:2:"";s:3:"ぃ";s:2:"";s:3:"い";s:2:"";s:3:"ぅ";s:2:"";s:3:"う";s:2:"";s:3:"ぇ";s:2:"";s:3:"え";s:2:"";s:3:"ぉ";s:2:"";s:3:"お";s:2:"";s:3:"か";s:2:"";s:3:"が";s:2:"";s:3:"き";s:2:"";s:3:"ぎ";s:2:"";s:3:"く";s:2:"";s:3:"ぐ";s:2:"";s:3:"け";s:2:"";s:3:"げ";s:2:"";s:3:"こ";s:2:"";s:3:"ご";s:2:"";s:3:"さ";s:2:"";s:3:"ざ";s:2:"";s:3:"し";s:2:"";s:3:"じ";s:2:"";s:3:"す";s:2:"";s:3:"ず";s:2:"";s:3:"せ";s:2:"";s:3:"ぜ";s:2:"";s:3:"そ";s:2:"";s:3:"ぞ";s:2:"";s:3:"た";s:2:"";s:3:"だ";s:2:"";s:3:"ち";s:2:"";s:3:"ぢ";s:2:"";s:3:"っ";s:2:"";s:3:"つ";s:2:"";s:3:"づ";s:2:"";s:3:"て";s:2:"";s:3:"で";s:2:"";s:3:"と";s:2:"";s:3:"ど";s:2:"";s:3:"な";s:2:"";s:3:"に";s:2:"";s:3:"ぬ";s:2:"";s:3:"ね";s:2:"";s:3:"の";s:2:"";s:3:"は";s:2:"";s:3:"ば";s:2:"";s:3:"ぱ";s:2:"";s:3:"ひ";s:2:"";s:3:"び";s:2:"";s:3:"ぴ";s:2:"";s:3:"ふ";s:2:"";s:3:"ぶ";s:2:"";s:3:"ぷ";s:2:"";s:3:"へ";s:2:"";s:3:"べ";s:2:"";s:3:"ぺ";s:2:"";s:3:"ほ";s:2:"";s:3:"ぼ";s:2:"";s:3:"ぽ";s:2:"";s:3:"ま";s:2:"";s:3:"み";s:2:"";s:3:"む";s:2:"";s:3:"め";s:2:"";s:3:"も";s:2:"";s:3:"ゃ";s:2:"";s:3:"や";s:2:"";s:3:"ゅ";s:2:"";s:3:"ゆ";s:2:"";s:3:"ょ";s:2:"";s:3:"よ";s:2:"";s:3:"ら";s:2:"";s:3:"り";s:2:"";s:3:"る";s:2:"";s:3:"れ";s:2:"";s:3:"ろ";s:2:"";s:3:"ゎ";s:2:"";s:3:"わ";s:2:"";s:3:"ゐ";s:2:"";s:3:"ゑ";s:2:"";s:3:"を";s:2:"";s:3:"ん";s:2:"";s:3:"゛";s:2:"a";s:3:"゜";s:2:"b";s:3:"ゝ";s:2:"f";s:3:"ゞ";s:2:"g";s:3:"ァ";s:2:"";s:3:"ア";s:2:"";s:3:"ィ";s:2:"";s:3:"イ";s:2:"";s:3:"ゥ";s:2:"";s:3:"ウ";s:2:"";s:3:"ェ";s:2:"";s:3:"エ";s:2:"";s:3:"ォ";s:2:"";s:3:"オ";s:2:"";s:3:"カ";s:2:"";s:3:"ガ";s:2:"";s:3:"キ";s:2:"";s:3:"ギ";s:2:"";s:3:"ク";s:2:"";s:3:"グ";s:2:"";s:3:"ケ";s:2:"";s:3:"ゲ";s:2:"";s:3:"コ";s:2:"";s:3:"ゴ";s:2:"";s:3:"サ";s:2:"";s:3:"ザ";s:2:"";s:3:"シ";s:2:"";s:3:"ジ";s:2:"";s:3:"ス";s:2:"";s:3:"ズ";s:2:"";s:3:"セ";s:2:"";s:3:"ゼ";s:2:"";s:3:"ソ";s:2:"";s:3:"ゾ";s:2:"";s:3:"タ";s:2:"";s:3:"ダ";s:2:"";s:3:"チ";s:2:"";s:3:"ヂ";s:2:"";s:3:"ッ";s:2:"";s:3:"ツ";s:2:"";s:3:"ヅ";s:2:"";s:3:"テ";s:2:"";s:3:"デ";s:2:"";s:3:"ト";s:2:"";s:3:"ド";s:2:"";s:3:"ナ";s:2:"";s:3:"ニ";s:2:"";s:3:"ヌ";s:2:"";s:3:"ネ";s:2:"";s:3:"ノ";s:2:"";s:3:"ハ";s:2:"";s:3:"バ";s:2:"";s:3:"パ";s:2:"";s:3:"ヒ";s:2:"";s:3:"ビ";s:2:"";s:3:"ピ";s:2:"";s:3:"フ";s:2:"";s:3:"ブ";s:2:"";s:3:"プ";s:2:"";s:3:"ヘ";s:2:"";s:3:"ベ";s:2:"";s:3:"ペ";s:2:"";s:3:"ホ";s:2:"";s:3:"ボ";s:2:"";s:3:"ポ";s:2:"";s:3:"マ";s:2:"";s:3:"ミ";s:2:"";s:3:"ム";s:2:"";s:3:"メ";s:2:"";s:3:"モ";s:2:"";s:3:"ャ";s:2:"";s:3:"ヤ";s:2:"";s:3:"ュ";s:2:"";s:3:"ユ";s:2:"";s:3:"ョ";s:2:"";s:3:"ヨ";s:2:"";s:3:"ラ";s:2:"";s:3:"リ";s:2:"";s:3:"ル";s:2:"";s:3:"レ";s:2:"";s:3:"ロ";s:2:"";s:3:"ヮ";s:2:"";s:3:"ワ";s:2:"";s:3:"ヰ";s:2:"";s:3:"ヱ";s:2:"";s:3:"ヲ";s:2:"";s:3:"ン";s:2:"";s:3:"ヴ";s:2:"";s:3:"ヵ";s:2:"";s:3:"ヶ";s:2:"";s:3:"ー";s:2:"`";s:3:"ヽ";s:2:"c";s:3:"ヾ";s:2:"d";s:3:"ㄅ";s:2:"";s:3:"ㄆ";s:2:"";s:3:"ㄇ";s:2:"";s:3:"ㄈ";s:2:"";s:3:"ㄉ";s:2:"";s:3:"ㄊ";s:2:"";s:3:"ㄋ";s:2:"";s:3:"ㄌ";s:2:"";s:3:"ㄍ";s:2:"";s:3:"ㄎ";s:2:"";s:3:"ㄏ";s:2:"";s:3:"ㄐ";s:2:"";s:3:"ㄑ";s:2:"";s:3:"ㄒ";s:2:"";s:3:"ㄓ";s:2:"";s:3:"ㄔ";s:2:"";s:3:"ㄕ";s:2:"";s:3:"ㄖ";s:2:"";s:3:"ㄗ";s:2:"";s:3:"ㄘ";s:2:"";s:3:"ㄙ";s:2:"";s:3:"ㄚ";s:2:"";s:3:"ㄛ";s:2:"";s:3:"ㄜ";s:2:"";s:3:"ㄝ";s:2:"";s:3:"ㄞ";s:2:"";s:3:"ㄟ";s:2:"";s:3:"ㄠ";s:2:"";s:3:"ㄡ";s:2:"";s:3:"ㄢ";s:2:"";s:3:"ㄣ";s:2:"";s:3:"ㄤ";s:2:"";s:3:"ㄥ";s:2:"";s:3:"ㄦ";s:2:"";s:3:"ㄧ";s:2:"";s:3:"ㄨ";s:2:"";s:3:"ㄩ";s:2:"";s:3:"㆒";s:2:"һ";s:3:"㆓";s:2:"";s:3:"㆔";s:2:"";s:3:"㆕";s:2:"";s:3:"㆖";s:2:"";s:3:"㆗";s:2:"";s:3:"㆘";s:2:"";s:3:"㆙";s:2:"";s:3:"㆚";s:2:"";s:3:"㆛";s:2:"";s:3:"㆜";s:2:"";s:3:"㆝";s:2:"";s:3:"㆞";s:2:"";s:3:"㆟";s:2:"";s:3:"㈠";s:2:"";s:3:"㈡";s:2:"";s:3:"㈢";s:2:"";s:3:"㈣";s:2:"";s:3:"㈤";s:2:"";s:3:"㈥";s:2:"";s:3:"㈦";s:2:"";s:3:"㈧";s:2:"";s:3:"㈨";s:2:"";s:3:"㈩";s:2:"";s:3:"㈪";s:2:"";s:3:"㈫";s:2:"";s:3:"㈬";s:2:"ˮ";s:3:"㈭";s:2:"ľ";s:3:"㈮";s:2:"";s:3:"㈯";s:2:"";s:3:"㈰";s:2:"";s:3:"㈱";s:2:"Z";s:3:"㈲";s:2:"";s:3:"㈳";s:2:"";s:3:"㈴";s:2:"";s:3:"㈵";s:2:"";s:3:"㈶";s:2:"";s:3:"㈷";s:2:"ף";s:3:"㈸";s:2:"";s:3:"㈹";s:2:"";s:3:"㈺";s:2:"";s:3:"㈻";s:2:"ѧ";s:3:"㈼";s:2:"";s:3:"㈽";s:2:"";s:3:"㈾";s:2:"";s:3:"㈿";s:2:"Э";s:3:"㉀";s:2:"";s:3:"㉁";s:2:"";s:3:"㉂";s:2:"";s:3:"㉃";s:2:"";s:3:"㊀";s:2:"һ";s:3:"㊁";s:2:"";s:3:"㊂";s:2:"";s:3:"㊃";s:2:"";s:3:"㊄";s:2:"";s:3:"㊅";s:2:"";s:3:"㊆";s:2:"";s:3:"㊇";s:2:"";s:3:"㊈";s:2:"";s:3:"㊉";s:2:"ʮ";s:3:"㊊";s:2:"";s:3:"㊋";s:2:"";s:3:"㊌";s:2:"ˮ";s:3:"㊍";s:2:"ľ";s:3:"㊎";s:2:"";s:3:"㊏";s:2:"";s:3:"㊐";s:2:"";s:3:"㊑";s:2:"";s:3:"㊒";s:2:"";s:3:"㊓";s:2:"";s:3:"㊔";s:2:"";s:3:"㊕";s:2:"";s:3:"㊖";s:2:"";s:3:"㊗";s:2:"ף";s:3:"㊘";s:2:"";s:3:"㊙";s:2:"";s:3:"㊚";s:2:"";s:3:"㊛";s:2:"Ů";s:3:"㊜";s:2:"";s:3:"㊝";s:2:"";s:3:"㊟";s:2:"ע";s:3:"㊠";s:2:"";s:3:"㊡";s:2:"";s:3:"㊢";s:2:"д";s:3:"㊣";s:2:"I";s:3:"㊩";s:2:"ҽ";s:3:"㊪";s:2:"";s:3:"㊫";s:2:"ѧ";s:3:"㊬";s:2:"";s:3:"㊭";s:2:"";s:3:"㊮";s:2:"";s:3:"㊯";s:2:"Э";s:3:"㊰";s:2:"ҹ";s:3:"㎎";s:2:"J";s:3:"㎏";s:2:"K";s:3:"㎜";s:2:"L";s:3:"㎝";s:2:"M";s:3:"㎞";s:2:"N";s:3:"㎡";s:2:"O";s:3:"㏄";s:2:"P";s:3:"㏎";s:2:"Q";s:3:"㏑";s:2:"R";s:3:"㏒";s:2:"S";s:3:"㏕";s:2:"T";s:3:"一";s:2:"һ";s:3:"丁";s:2:"";s:3:"丂";s:2:"@";s:3:"七";s:2:"";s:3:"丄";s:2:"A";s:3:"丅";s:2:"B";s:3:"丆";s:2:"C";s:3:"万";s:2:"";s:3:"丈";s:2:"";s:3:"三";s:2:"";s:3:"上";s:2:"";s:3:"下";s:2:"";s:3:"丌";s:2:"آ";s:3:"不";s:2:"";s:3:"与";s:2:"";s:3:"丏";s:2:"D";s:3:"丐";s:2:"ؤ";s:3:"丑";s:2:"";s:3:"丒";s:2:"E";s:3:"专";s:2:"ר";s:3:"且";s:2:"";s:3:"丕";s:2:"ا";s:3:"世";s:2:"";s:3:"丗";s:2:"F";s:3:"丘";s:2:"";s:3:"丙";s:2:"";s:3:"业";s:2:"ҵ";s:3:"丛";s:2:"";s:3:"东";s:2:"";s:3:"丝";s:2:"˿";s:3:"丞";s:2:"ة";s:3:"丟";s:2:"G";s:3:"丠";s:2:"H";s:3:"両";s:2:"I";s:3:"丢";s:2:"";s:3:"丣";s:2:"J";s:3:"两";s:2:"";s:3:"严";s:2:"";s:3:"並";s:2:"K";s:3:"丧";s:2:"ɥ";s:3:"丨";s:2:"ح";s:3:"丩";s:2:"L";s:3:"个";s:2:"";s:3:"丫";s:2:"Ѿ";s:3:"丬";s:2:"";s:3:"中";s:2:"";s:3:"丮";s:2:"M";s:3:"丯";s:2:"N";s:3:"丰";s:2:"";s:3:"丱";s:2:"O";s:3:"串";s:2:"";s:3:"丳";s:2:"P";s:3:"临";s:2:"";s:3:"丵";s:2:"Q";s:3:"丶";s:2:"ؼ";s:3:"丷";s:2:"R";s:3:"丸";s:2:"";s:3:"丹";s:2:"";s:3:"为";s:2:"Ϊ";s:3:"主";s:2:"";s:3:"丼";s:2:"S";s:3:"丽";s:2:"";s:3:"举";s:2:"";s:3:"丿";s:2:"د";s:3:"乀";s:2:"T";s:3:"乁";s:2:"U";s:3:"乂";s:2:"V";s:3:"乃";s:2:"";s:3:"乄";s:2:"W";s:3:"久";s:2:"";s:3:"乆";s:2:"X";s:3:"乇";s:2:"ر";s:3:"么";s:2:"ô";s:3:"义";s:2:"";s:3:"乊";s:2:"Y";s:3:"之";s:2:"֮";s:3:"乌";s:2:"";s:3:"乍";s:2:"է";s:3:"乎";s:2:"";s:3:"乏";s:2:"";s:3:"乐";s:2:"";s:3:"乑";s:2:"Z";s:3:"乒";s:2:"ƹ";s:3:"乓";s:2:"";s:3:"乔";s:2:"";s:3:"乕";s:2:"[";s:3:"乖";s:2:"";s:3:"乗";s:2:"\";s:3:"乘";s:2:"";s:3:"乙";s:2:"";s:3:"乚";s:2:"]";s:3:"乛";s:2:"^";s:3:"乜";s:2:"ؿ";s:3:"九";s:2:"";s:3:"乞";s:2:"";s:3:"也";s:2:"Ҳ";s:3:"习";s:2:"ϰ";s:3:"乡";s:2:"";s:3:"乢";s:2:"_";s:3:"乣";s:2:"`";s:3:"乤";s:2:"a";s:3:"乥";s:2:"b";s:3:"书";s:2:"";s:3:"乧";s:2:"c";s:3:"乨";s:2:"d";s:3:"乩";s:2:"";s:3:"乪";s:2:"e";s:3:"乫";s:2:"f";s:3:"乬";s:2:"g";s:3:"乭";s:2:"h";s:3:"乮";s:2:"i";s:3:"乯";s:2:"j";s:3:"买";s:2:"";s:3:"乱";s:2:"";s:3:"乲";s:2:"k";s:3:"乳";s:2:"";s:3:"乴";s:2:"l";s:3:"乵";s:2:"m";s:3:"乶";s:2:"n";s:3:"乷";s:2:"o";s:3:"乸";s:2:"p";s:3:"乹";s:2:"q";s:3:"乺";s:2:"r";s:3:"乻";s:2:"s";s:3:"乼";s:2:"t";s:3:"乽";s:2:"u";s:3:"乾";s:2:"Ǭ";s:3:"乿";s:2:"v";s:3:"亀";s:2:"w";s:3:"亁";s:2:"x";s:3:"亂";s:2:"y";s:3:"亃";s:2:"z";s:3:"亄";s:2:"{";s:3:"亅";s:2:"|";s:3:"了";s:2:"";s:3:"亇";s:2:"}";s:3:"予";s:2:"";s:3:"争";s:2:"";s:3:"亊";s:2:"~";s:3:"事";s:2:"";s:3:"二";s:2:"";s:3:"亍";s:2:"ء";s:3:"于";s:2:"";s:3:"亏";s:2:"";s:3:"亐";s:2:"";s:3:"云";s:2:"";s:3:"互";s:2:"";s:3:"亓";s:2:"";s:3:"五";s:2:"";s:3:"井";s:2:"";s:3:"亖";s:2:"";s:3:"亗";s:2:"";s:3:"亘";s:2:"ب";s:3:"亙";s:2:"";s:3:"亚";s:2:"";s:3:"些";s:2:"Щ";s:3:"亜";s:2:"";s:3:"亝";s:2:"";s:3:"亞";s:2:"";s:3:"亟";s:2:"ؽ";s:3:"亠";s:2:"";s:3:"亡";s:2:"";s:3:"亢";s:2:"";s:3:"亣";s:2:"";s:3:"交";s:2:"";s:3:"亥";s:2:"";s:3:"亦";s:2:"";s:3:"产";s:2:"";s:3:"亨";s:2:"";s:3:"亩";s:2:"Ķ";s:3:"亪";s:2:"";s:3:"享";s:2:"";s:3:"京";s:2:"";s:3:"亭";s:2:"ͤ";s:3:"亮";s:2:"";s:3:"亯";s:2:"";s:3:"亰";s:2:"";s:3:"亱";s:2:"";s:3:"亲";s:2:"";s:3:"亳";s:2:"";s:3:"亴";s:2:"";s:3:"亵";s:2:"";s:3:"亶";s:2:"";s:3:"亷";s:2:"";s:3:"亸";s:2:"";s:3:"亹";s:2:"";s:3:"人";s:2:"";s:3:"亻";s:2:"";s:3:"亼";s:2:"";s:3:"亽";s:2:"";s:3:"亾";s:2:"";s:3:"亿";s:2:"";s:3:"什";s:2:"ʲ";s:3:"仁";s:2:"";s:3:"仂";s:2:"";s:3:"仃";s:2:"";s:3:"仄";s:2:"";s:3:"仅";s:2:"";s:3:"仆";s:2:"";s:3:"仇";s:2:"";s:3:"仈";s:2:"";s:3:"仉";s:2:"";s:3:"今";s:2:"";s:3:"介";s:2:"";s:3:"仌";s:2:"";s:3:"仍";s:2:"";s:3:"从";s:2:"";s:3:"仏";s:2:"";s:3:"仐";s:2:"";s:3:"仑";s:2:"";s:3:"仒";s:2:"";s:3:"仓";s:2:"";s:3:"仔";s:2:"";s:3:"仕";s:2:"";s:3:"他";s:2:"";s:3:"仗";s:2:"";s:3:"付";s:2:"";s:3:"仙";s:2:"";s:3:"仚";s:2:"";s:3:"仛";s:2:"";s:3:"仜";s:2:"";s:3:"仝";s:2:"";s:3:"仞";s:2:"";s:3:"仟";s:2:"Ǫ";s:3:"仠";s:2:"";s:3:"仡";s:2:"";s:3:"仢";s:2:"";s:3:"代";s:2:"";s:3:"令";s:2:"";s:3:"以";s:2:"";s:3:"仦";s:2:"";s:3:"仧";s:2:"";s:3:"仨";s:2:"";s:3:"仩";s:2:"";s:3:"仪";s:2:"";s:3:"仫";s:2:"";s:3:"们";s:2:"";s:3:"仭";s:2:"";s:3:"仮";s:2:"";s:3:"仯";s:2:"";s:3:"仰";s:2:"";s:3:"仱";s:2:"";s:3:"仲";s:2:"";s:3:"仳";s:2:"";s:3:"仴";s:2:"";s:3:"仵";s:2:"";s:3:"件";s:2:"";s:3:"价";s:2:"";s:3:"仸";s:2:"";s:3:"仹";s:2:"";s:3:"仺";s:2:"";s:3:"任";s:2:"";s:3:"仼";s:2:"";s:3:"份";s:2:"";s:3:"仾";s:2:"";s:3:"仿";s:2:"";s:3:"伀";s:2:"";s:3:"企";s:2:"";s:3:"伂";s:2:"";s:3:"伃";s:2:"";s:3:"伄";s:2:"";s:3:"伅";s:2:"";s:3:"伆";s:2:"";s:3:"伇";s:2:"";s:3:"伈";s:2:"";s:3:"伉";s:2:"";s:3:"伊";s:2:"";s:3:"伋";s:2:"";s:3:"伌";s:2:"";s:3:"伍";s:2:"";s:3:"伎";s:2:"";s:3:"伏";s:2:"";s:3:"伐";s:2:"";s:3:"休";s:2:"";s:3:"伒";s:2:"";s:3:"伓";s:2:"";s:3:"伔";s:2:"";s:3:"伕";s:2:"";s:3:"伖";s:2:"";s:3:"众";s:2:"";s:3:"优";s:2:"";s:3:"伙";s:2:"";s:3:"会";s:2:"";s:3:"伛";s:2:"";s:3:"伜";s:2:"";s:3:"伝";s:2:"";s:3:"伞";s:2:"ɡ";s:3:"伟";s:2:"ΰ";s:3:"传";s:2:"";s:3:"伡";s:2:"";s:3:"伢";s:2:"";s:3:"伣";s:2:"";s:3:"伤";s:2:"";s:3:"伥";s:2:"";s:3:"伦";s:2:"";s:3:"伧";s:2:"";s:3:"伨";s:2:"";s:3:"伩";s:2:"";s:3:"伪";s:2:"α";s:3:"伫";s:2:"";s:3:"伬";s:2:"";s:3:"伭";s:2:"";s:3:"伮";s:2:"";s:3:"伯";s:2:"";s:3:"估";s:2:"";s:3:"伱";s:2:"";s:3:"伲";s:2:"٣";s:3:"伳";s:2:"";s:3:"伴";s:2:"";s:3:"伵";s:2:"";s:3:"伶";s:2:"";s:3:"伷";s:2:"";s:3:"伸";s:2:"";s:3:"伹";s:2:"";s:3:"伺";s:2:"";s:3:"伻";s:2:"";s:3:"似";s:2:"";s:3:"伽";s:2:"٤";s:3:"伾";s:2:"";s:3:"伿";s:2:"";s:3:"佀";s:2:"";s:3:"佁";s:2:"";s:3:"佂";s:2:"";s:3:"佃";s:2:"";s:3:"佄";s:2:"";s:3:"佅";s:2:"";s:3:"但";s:2:"";s:3:"佇";s:2:"";s:3:"佈";s:2:"";s:3:"佉";s:2:"";s:3:"佊";s:2:"";s:3:"佋";s:2:"";s:3:"佌";s:2:"";s:3:"位";s:2:"λ";s:3:"低";s:2:"";s:3:"住";s:2:"ס";s:3:"佐";s:2:"";s:3:"佑";s:2:"";s:3:"佒";s:2:"";s:3:"体";s:2:"";s:3:"佔";s:2:"";s:3:"何";s:2:"";s:3:"佖";s:2:"";s:3:"佗";s:2:"٢";s:3:"佘";s:2:"";s:3:"余";s:2:"";s:3:"佚";s:2:"";s:3:"佛";s:2:"";s:3:"作";s:2:"";s:3:"佝";s:2:"";s:3:"佞";s:2:"";s:3:"佟";s:2:"١";s:3:"你";s:2:"";s:3:"佡";s:2:"";s:3:"佢";s:2:"";s:3:"佣";s:2:"Ӷ";s:3:"佤";s:2:"";s:3:"佥";s:2:"";s:3:"佦";s:2:"";s:3:"佧";s:2:"";s:3:"佨";s:2:"";s:3:"佩";s:2:"";s:3:"佪";s:2:"";s:3:"佫";s:2:"";s:3:"佬";s:2:"";s:3:"佭";s:2:"";s:3:"佮";s:2:"";s:3:"佯";s:2:"";s:3:"佰";s:2:"";s:3:"佱";s:2:"";s:3:"佲";s:2:"";s:3:"佳";s:2:"";s:3:"佴";s:2:"٦";s:3:"併";s:2:"";s:3:"佶";s:2:"٥";s:3:"佷";s:2:"";s:3:"佸";s:2:"";s:3:"佹";s:2:"";s:3:"佺";s:2:"";s:3:"佻";s:2:"٬";s:3:"佼";s:2:"ٮ";s:3:"佽";s:2:"";s:3:"佾";s:2:"٫";s:3:"使";s:2:"ʹ";s:3:"侀";s:2:"";s:3:"侁";s:2:"";s:3:"侂";s:2:"";s:3:"侃";s:2:"٩";s:3:"侄";s:2:"ֶ";s:3:"侅";s:2:"";s:3:"來";s:2:"";s:3:"侇";s:2:"";s:3:"侈";s:2:"";s:3:"侉";s:2:"٨";s:3:"侊";s:2:"";s:3:"例";s:2:"";s:3:"侌";s:2:"";s:3:"侍";s:2:"";s:3:"侎";s:2:"";s:3:"侏";s:2:"٪";s:3:"侐";s:2:"";s:3:"侑";s:2:"٧";s:3:"侒";s:2:"";s:3:"侓";s:2:"";s:3:"侔";s:2:"ٰ";s:3:"侕";s:2:"";s:3:"侖";s:2:"";s:3:"侗";s:2:"";s:3:"侘";s:2:"";s:3:"侙";s:2:"";s:3:"侚";s:2:"";s:3:"供";s:2:"";s:3:"侜";s:2:"";s:3:"依";s:2:"";s:3:"侞";s:2:"";s:3:"侟";s:2:"";s:3:"侠";s:2:"";s:3:"価";s:2:"";s:3:"侢";s:2:"";s:3:"侣";s:2:"";s:3:"侤";s:2:"@";s:3:"侥";s:2:"";s:3:"侦";s:2:"";s:3:"侧";s:2:"";s:3:"侨";s:2:"";s:3:"侩";s:2:"";s:3:"侪";s:2:"٭";s:3:"侫";s:2:"A";s:3:"侬";s:2:"ٯ";s:3:"侭";s:2:"B";s:3:"侮";s:2:"";s:3:"侯";s:2:"";s:3:"侰";s:2:"C";s:3:"侱";s:2:"D";s:3:"侲";s:2:"E";s:3:"侳";s:2:"F";s:3:"侴";s:2:"G";s:3:"侵";s:2:"";s:3:"侶";s:2:"H";s:3:"侷";s:2:"I";s:3:"侸";s:2:"J";s:3:"侹";s:2:"K";s:3:"侺";s:2:"L";s:3:"侻";s:2:"M";s:3:"侼";s:2:"N";s:3:"侽";s:2:"O";s:3:"侾";s:2:"P";s:3:"便";s:2:"";s:3:"俀";s:2:"Q";s:3:"俁";s:2:"R";s:3:"係";s:2:"S";s:3:"促";s:2:"";s:3:"俄";s:2:"";s:3:"俅";s:2:"ٴ";s:3:"俆";s:2:"T";s:3:"俇";s:2:"U";s:3:"俈";s:2:"V";s:3:"俉";s:2:"W";s:3:"俊";s:2:"";s:3:"俋";s:2:"X";s:3:"俌";s:2:"Y";s:3:"俍";s:2:"Z";s:3:"俎";s:2:"";s:3:"俏";s:2:"";s:3:"俐";s:2:"";s:3:"俑";s:2:"ٸ";s:3:"俒";s:2:"[";s:3:"俓";s:2:"\";s:3:"俔";s:2:"]";s:3:"俕";s:2:"^";s:3:"俖";s:2:"_";s:3:"俗";s:2:"";s:3:"俘";s:2:"";s:3:"俙";s:2:"`";s:3:"俚";s:2:"ٵ";s:3:"俛";s:2:"a";s:3:"俜";s:2:"ٷ";s:3:"保";s:2:"";s:3:"俞";s:2:"";s:3:"俟";s:2:"ٹ";s:3:"俠";s:2:"b";s:3:"信";s:2:"";s:3:"俢";s:2:"c";s:3:"俣";s:2:"ٶ";s:3:"俤";s:2:"d";s:3:"俥";s:2:"e";s:3:"俦";s:2:"ٱ";s:3:"俧";s:2:"f";s:3:"俨";s:2:"ٲ";s:3:"俩";s:2:"";s:3:"俪";s:2:"ٳ";s:3:"俫";s:2:"g";s:3:"俬";s:2:"h";s:3:"俭";s:2:"";s:3:"修";s:2:"";s:3:"俯";s:2:"";s:3:"俰";s:2:"i";s:3:"俱";s:2:"";s:3:"俲";s:2:"j";s:3:"俳";s:2:"ٽ";s:3:"俴";s:2:"k";s:3:"俵";s:2:"l";s:3:"俶";s:2:"m";s:3:"俷";s:2:"n";s:3:"俸";s:2:"ٺ";s:3:"俹";s:2:"o";s:3:"俺";s:2:"";s:3:"俻";s:2:"p";s:3:"俼";s:2:"q";s:3:"俽";s:2:"r";s:3:"俾";s:2:"";s:3:"俿";s:2:"s";s:3:"倀";s:2:"t";s:3:"倁";s:2:"u";s:3:"倂";s:2:"v";s:3:"倃";s:2:"w";s:3:"倄";s:2:"x";s:3:"倅";s:2:"y";s:3:"倆";s:2:"z";s:3:"倇";s:2:"{";s:3:"倈";s:2:"|";s:3:"倉";s:2:"}";s:3:"倊";s:2:"~";s:3:"個";s:2:"";s:3:"倌";s:2:"";s:3:"倍";s:2:"";s:3:"倎";s:2:"";s:3:"倏";s:2:"ٿ";s:3:"倐";s:2:"";s:3:"們";s:2:"";s:3:"倒";s:2:"";s:3:"倓";s:2:"";s:3:"倔";s:2:"";s:3:"倕";s:2:"";s:3:"倖";s:2:"";s:3:"倗";s:2:"";s:3:"倘";s:2:"";s:3:"候";s:2:"";s:3:"倚";s:2:"";s:3:"倛";s:2:"";s:3:"倜";s:2:"";s:3:"倝";s:2:"";s:3:"倞";s:2:"";s:3:"借";s:2:"";s:3:"倠";s:2:"";s:3:"倡";s:2:"";s:3:"倢";s:2:"";s:3:"倣";s:2:"";s:3:"値";s:2:"";s:3:"倥";s:2:"";s:3:"倦";s:2:"";s:3:"倧";s:2:"";s:3:"倨";s:2:"";s:3:"倩";s:2:"ٻ";s:3:"倪";s:2:"";s:3:"倫";s:2:"";s:3:"倬";s:2:"پ";s:3:"倭";s:2:"";s:3:"倮";s:2:"";s:3:"倯";s:2:"";s:3:"倰";s:2:"";s:3:"倱";s:2:"";s:3:"倲";s:2:"";s:3:"倳";s:2:"";s:3:"倴";s:2:"";s:3:"倵";s:2:"";s:3:"倶";s:2:"";s:3:"倷";s:2:"";s:3:"倸";s:2:"";s:3:"倹";s:2:"";s:3:"债";s:2:"ծ";s:3:"倻";s:2:"";s:3:"值";s:2:"ֵ";s:3:"倽";s:2:"";s:3:"倾";s:2:"";s:3:"倿";s:2:"";s:3:"偀";s:2:"";s:3:"偁";s:2:"";s:3:"偂";s:2:"";s:3:"偃";s:2:"";s:3:"偄";s:2:"";s:3:"偅";s:2:"";s:3:"偆";s:2:"";s:3:"假";s:2:"";s:3:"偈";s:2:"";s:3:"偉";s:2:"";s:3:"偊";s:2:"";s:3:"偋";s:2:"";s:3:"偌";s:2:"ټ";s:3:"偍";s:2:"";s:3:"偎";s:2:"";s:3:"偏";s:2:"ƫ";s:3:"偐";s:2:"";s:3:"偑";s:2:"";s:3:"偒";s:2:"";s:3:"偓";s:2:"";s:3:"偔";s:2:"";s:3:"偕";s:2:"";s:3:"偖";s:2:"";s:3:"偗";s:2:"";s:3:"偘";s:2:"";s:3:"偙";s:2:"";s:3:"做";s:2:"";s:3:"偛";s:2:"";s:3:"停";s:2:"ͣ";s:3:"偝";s:2:"";s:3:"偞";s:2:"";s:3:"偟";s:2:"";s:3:"偠";s:2:"";s:3:"偡";s:2:"";s:3:"偢";s:2:"";s:3:"偣";s:2:"";s:3:"偤";s:2:"";s:3:"健";s:2:"";s:3:"偦";s:2:"";s:3:"偧";s:2:"";s:3:"偨";s:2:"";s:3:"偩";s:2:"";s:3:"偪";s:2:"";s:3:"偫";s:2:"";s:3:"偬";s:2:"";s:3:"偭";s:2:"";s:3:"偮";s:2:"";s:3:"偯";s:2:"";s:3:"偰";s:2:"";s:3:"偱";s:2:"";s:3:"偲";s:2:"";s:3:"偳";s:2:"";s:3:"側";s:2:"";s:3:"偵";s:2:"";s:3:"偶";s:2:"ż";s:3:"偷";s:2:"͵";s:3:"偸";s:2:"";s:3:"偹";s:2:"";s:3:"偺";s:2:"";s:3:"偻";s:2:"";s:3:"偼";s:2:"";s:3:"偽";s:2:"";s:3:"偾";s:2:"";s:3:"偿";s:2:"";s:3:"傀";s:2:"";s:3:"傁";s:2:"";s:3:"傂";s:2:"";s:3:"傃";s:2:"";s:3:"傄";s:2:"";s:3:"傅";s:2:"";s:3:"傆";s:2:"";s:3:"傇";s:2:"";s:3:"傈";s:2:"";s:3:"傉";s:2:"";s:3:"傊";s:2:"";s:3:"傋";s:2:"";s:3:"傌";s:2:"";s:3:"傍";s:2:"";s:3:"傎";s:2:"";s:3:"傏";s:2:"";s:3:"傐";s:2:"";s:3:"傑";s:2:"";s:3:"傒";s:2:"";s:3:"傓";s:2:"";s:3:"傔";s:2:"";s:3:"傕";s:2:"";s:3:"傖";s:2:"";s:3:"傗";s:2:"";s:3:"傘";s:2:"";s:3:"備";s:2:"";s:3:"傚";s:2:"";s:3:"傛";s:2:"";s:3:"傜";s:2:"";s:3:"傝";s:2:"";s:3:"傞";s:2:"";s:3:"傟";s:2:"";s:3:"傠";s:2:"";s:3:"傡";s:2:"";s:3:"傢";s:2:"";s:3:"傣";s:2:"";s:3:"傤";s:2:"";s:3:"傥";s:2:"";s:3:"傦";s:2:"";s:3:"傧";s:2:"";s:3:"储";s:2:"";s:3:"傩";s:2:"";s:3:"傪";s:2:"";s:3:"傫";s:2:"";s:3:"催";s:2:"";s:3:"傭";s:2:"";s:3:"傮";s:2:"";s:3:"傯";s:2:"";s:3:"傰";s:2:"";s:3:"傱";s:2:"";s:3:"傲";s:2:"";s:3:"傳";s:2:"";s:3:"傴";s:2:"";s:3:"債";s:2:"";s:3:"傶";s:2:"";s:3:"傷";s:2:"";s:3:"傸";s:2:"";s:3:"傹";s:2:"";s:3:"傺";s:2:"";s:3:"傻";s:2:"ɵ";s:3:"傼";s:2:"";s:3:"傽";s:2:"@";s:3:"傾";s:2:"A";s:3:"傿";s:2:"B";s:3:"僀";s:2:"C";s:3:"僁";s:2:"D";s:3:"僂";s:2:"E";s:3:"僃";s:2:"F";s:3:"僄";s:2:"G";s:3:"僅";s:2:"H";s:3:"僆";s:2:"I";s:3:"僇";s:2:"J";s:3:"僈";s:2:"K";s:3:"僉";s:2:"L";s:3:"僊";s:2:"M";s:3:"僋";s:2:"N";s:3:"僌";s:2:"O";s:3:"働";s:2:"P";s:3:"僎";s:2:"Q";s:3:"像";s:2:"";s:3:"僐";s:2:"R";s:3:"僑";s:2:"S";s:3:"僒";s:2:"T";s:3:"僓";s:2:"U";s:3:"僔";s:2:"V";s:3:"僕";s:2:"W";s:3:"僖";s:2:"";s:3:"僗";s:2:"X";s:3:"僘";s:2:"Y";s:3:"僙";s:2:"Z";s:3:"僚";s:2:"";s:3:"僛";s:2:"[";s:3:"僜";s:2:"\";s:3:"僝";s:2:"]";s:3:"僞";s:2:"^";s:3:"僟";s:2:"_";s:3:"僠";s:2:"`";s:3:"僡";s:2:"a";s:3:"僢";s:2:"b";s:3:"僣";s:2:"c";s:3:"僤";s:2:"d";s:3:"僥";s:2:"e";s:3:"僦";s:2:"";s:3:"僧";s:2:"ɮ";s:3:"僨";s:2:"f";s:3:"僩";s:2:"g";s:3:"僪";s:2:"h";s:3:"僫";s:2:"i";s:3:"僬";s:2:"";s:3:"僭";s:2:"";s:3:"僮";s:2:"";s:3:"僯";s:2:"j";s:3:"僰";s:2:"k";s:3:"僱";s:2:"l";s:3:"僲";s:2:"m";s:3:"僳";s:2:"";s:3:"僴";s:2:"n";s:3:"僵";s:2:"";s:3:"僶";s:2:"o";s:3:"僷";s:2:"p";s:3:"僸";s:2:"q";s:3:"價";s:2:"r";s:3:"僺";s:2:"s";s:3:"僻";s:2:"Ƨ";s:3:"僼";s:2:"t";s:3:"僽";s:2:"u";s:3:"僾";s:2:"v";s:3:"僿";s:2:"w";s:3:"儀";s:2:"x";s:3:"儁";s:2:"y";s:3:"儂";s:2:"z";s:3:"儃";s:2:"{";s:3:"億";s:2:"|";s:3:"儅";s:2:"}";s:3:"儆";s:2:"";s:3:"儇";s:2:"";s:3:"儈";s:2:"~";s:3:"儉";s:2:"";s:3:"儊";s:2:"";s:3:"儋";s:2:"";s:3:"儌";s:2:"";s:3:"儍";s:2:"";s:3:"儎";s:2:"";s:3:"儏";s:2:"";s:3:"儐";s:2:"";s:3:"儑";s:2:"";s:3:"儒";s:2:"";s:3:"儓";s:2:"";s:3:"儔";s:2:"";s:3:"儕";s:2:"";s:3:"儖";s:2:"";s:3:"儗";s:2:"";s:3:"儘";s:2:"";s:3:"儙";s:2:"";s:3:"儚";s:2:"";s:3:"儛";s:2:"";s:3:"儜";s:2:"";s:3:"儝";s:2:"";s:3:"儞";s:2:"";s:3:"償";s:2:"";s:3:"儠";s:2:"";s:3:"儡";s:2:"";s:3:"儢";s:2:"";s:3:"儣";s:2:"";s:3:"儤";s:2:"";s:3:"儥";s:2:"";s:3:"儦";s:2:"";s:3:"儧";s:2:"";s:3:"儨";s:2:"";s:3:"儩";s:2:"";s:3:"優";s:2:"";s:3:"儫";s:2:"";s:3:"儬";s:2:"";s:3:"儭";s:2:"";s:3:"儮";s:2:"";s:3:"儯";s:2:"";s:3:"儰";s:2:"";s:3:"儱";s:2:"";s:3:"儲";s:2:"";s:3:"儳";s:2:"";s:3:"儴";s:2:"";s:3:"儵";s:2:"";s:3:"儶";s:2:"";s:3:"儷";s:2:"";s:3:"儸";s:2:"";s:3:"儹";s:2:"";s:3:"儺";s:2:"";s:3:"儻";s:2:"";s:3:"儼";s:2:"";s:3:"儽";s:2:"";s:3:"儾";s:2:"";s:3:"儿";s:2:"";s:3:"兀";s:2:"أ";s:3:"允";s:2:"";s:3:"兂";s:2:"";s:3:"元";s:2:"Ԫ";s:3:"兄";s:2:"";s:3:"充";s:2:"";s:3:"兆";s:2:"";s:3:"兇";s:2:"";s:3:"先";s:2:"";s:3:"光";s:2:"";s:3:"兊";s:2:"";s:3:"克";s:2:"";s:3:"兌";s:2:"";s:3:"免";s:2:"";s:3:"兎";s:2:"";s:3:"兏";s:2:"";s:3:"児";s:2:"";s:3:"兑";s:2:"";s:3:"兒";s:2:"";s:3:"兓";s:2:"";s:3:"兔";s:2:"";s:3:"兕";s:2:"";s:3:"兖";s:2:"";s:3:"兗";s:2:"";s:3:"兘";s:2:"";s:3:"兙";s:2:"";s:3:"党";s:2:"";s:3:"兛";s:2:"";s:3:"兜";s:2:"";s:3:"兝";s:2:"";s:3:"兞";s:2:"";s:3:"兟";s:2:"";s:3:"兠";s:2:"";s:3:"兡";s:2:"";s:3:"兢";s:2:"";s:3:"兣";s:2:"";s:3:"兤";s:2:"";s:3:"入";s:2:"";s:3:"兦";s:2:"";s:3:"內";s:2:"";s:3:"全";s:2:"ȫ";s:3:"兩";s:2:"";s:3:"兪";s:2:"";s:3:"八";s:2:"";s:3:"公";s:2:"";s:3:"六";s:2:"";s:3:"兮";s:2:"";s:3:"兯";s:2:"";s:3:"兰";s:2:"";s:3:"共";s:2:"";s:3:"兲";s:2:"";s:3:"关";s:2:"";s:3:"兴";s:2:"";s:3:"兵";s:2:"";s:3:"其";s:2:"";s:3:"具";s:2:"";s:3:"典";s:2:"";s:3:"兹";s:2:"";s:3:"兺";s:2:"";s:3:"养";s:2:"";s:3:"兼";s:2:"";s:3:"兽";s:2:"";s:3:"兾";s:2:"";s:3:"兿";s:2:"";s:3:"冀";s:2:"";s:3:"冁";s:2:"";s:3:"冂";s:2:"";s:3:"冃";s:2:"";s:3:"冄";s:2:"";s:3:"内";s:2:"";s:3:"円";s:2:"";s:3:"冇";s:2:"";s:3:"冈";s:2:"";s:3:"冉";s:2:"Ƚ";s:3:"冊";s:2:"";s:3:"冋";s:2:"";s:3:"册";s:2:"";s:3:"再";s:2:"";s:3:"冎";s:2:"";s:3:"冏";s:2:"";s:3:"冐";s:2:"";s:3:"冑";s:2:"";s:3:"冒";s:2:"ð";s:3:"冓";s:2:"";s:3:"冔";s:2:"";s:3:"冕";s:2:"";s:3:"冖";s:2:"ڢ";s:3:"冗";s:2:"";s:3:"冘";s:2:"";s:3:"写";s:2:"д";s:3:"冚";s:2:"";s:3:"军";s:2:"";s:3:"农";s:2:"ũ";s:3:"冝";s:2:"";s:3:"冞";s:2:"";s:3:"冟";s:2:"";s:3:"冠";s:2:"";s:3:"冡";s:2:"";s:3:"冢";s:2:"ڣ";s:3:"冣";s:2:"";s:3:"冤";s:2:"ԩ";s:3:"冥";s:2:"ڤ";s:3:"冦";s:2:"";s:3:"冧";s:2:"";s:3:"冨";s:2:"";s:3:"冩";s:2:"";s:3:"冪";s:2:"";s:3:"冫";s:2:"";s:3:"冬";s:2:"";s:3:"冭";s:2:"";s:3:"冮";s:2:"";s:3:"冯";s:2:"";s:3:"冰";s:2:"";s:3:"冱";s:2:"";s:3:"冲";s:2:"";s:3:"决";s:2:"";s:3:"冴";s:2:"";s:3:"况";s:2:"";s:3:"冶";s:2:"ұ";s:3:"冷";s:2:"";s:3:"冸";s:2:"";s:3:"冹";s:2:"";s:3:"冺";s:2:"";s:3:"冻";s:2:"";s:3:"冼";s:2:"";s:3:"冽";s:2:"";s:3:"冾";s:2:"";s:3:"冿";s:2:"";s:3:"净";s:2:"";s:3:"凁";s:2:"";s:3:"凂";s:2:"";s:3:"凃";s:2:"";s:3:"凄";s:2:"";s:3:"凅";s:2:"";s:3:"准";s:2:"׼";s:3:"凇";s:2:"ڡ";s:3:"凈";s:2:"";s:3:"凉";s:2:"";s:3:"凊";s:2:"";s:3:"凋";s:2:"";s:3:"凌";s:2:"";s:3:"凍";s:2:"";s:3:"凎";s:2:"";s:3:"减";s:2:"";s:3:"凐";s:2:"";s:3:"凑";s:2:"";s:3:"凒";s:2:"";s:3:"凓";s:2:"";s:3:"凔";s:2:"";s:3:"凕";s:2:"";s:3:"凖";s:2:"";s:3:"凗";s:2:"";s:3:"凘";s:2:"@";s:3:"凙";s:2:"A";s:3:"凚";s:2:"B";s:3:"凛";s:2:"";s:3:"凜";s:2:"C";s:3:"凝";s:2:"";s:3:"凞";s:2:"D";s:3:"凟";s:2:"E";s:3:"几";s:2:"";s:3:"凡";s:2:"";s:3:"凢";s:2:"F";s:3:"凣";s:2:"G";s:3:"凤";s:2:"";s:3:"凥";s:2:"H";s:3:"処";s:2:"I";s:3:"凧";s:2:"J";s:3:"凨";s:2:"K";s:3:"凩";s:2:"L";s:3:"凪";s:2:"M";s:3:"凫";s:2:"";s:3:"凬";s:2:"N";s:3:"凭";s:2:"ƾ";s:3:"凮";s:2:"O";s:3:"凯";s:2:"";s:3:"凰";s:2:"";s:3:"凱";s:2:"P";s:3:"凲";s:2:"Q";s:3:"凳";s:2:"";s:3:"凴";s:2:"R";s:3:"凵";s:2:"";s:3:"凶";s:2:"";s:3:"凷";s:2:"S";s:3:"凸";s:2:"͹";s:3:"凹";s:2:"";s:3:"出";s:2:"";s:3:"击";s:2:"";s:3:"凼";s:2:"";s:3:"函";s:2:"";s:3:"凾";s:2:"T";s:3:"凿";s:2:"";s:3:"刀";s:2:"";s:3:"刁";s:2:"";s:3:"刂";s:2:"";s:3:"刃";s:2:"";s:3:"刄";s:2:"U";s:3:"刅";s:2:"V";s:3:"分";s:2:"";s:3:"切";s:2:"";s:3:"刈";s:2:"";s:3:"刉";s:2:"W";s:3:"刊";s:2:"";s:3:"刋";s:2:"X";s:3:"刌";s:2:"Y";s:3:"刍";s:2:"ۻ";s:3:"刎";s:2:"";s:3:"刏";s:2:"Z";s:3:"刐";s:2:"[";s:3:"刑";s:2:"";s:3:"划";s:2:"";s:3:"刓";s:2:"\";s:3:"刔";s:2:"]";s:3:"刕";s:2:"^";s:3:"刖";s:2:"";s:3:"列";s:2:"";s:3:"刘";s:2:"";s:3:"则";s:2:"";s:3:"刚";s:2:"";s:3:"创";s:2:"";s:3:"刜";s:2:"_";s:3:"初";s:2:"";s:3:"刞";s:2:"`";s:3:"刟";s:2:"a";s:3:"删";s:2:"ɾ";s:3:"刡";s:2:"b";s:3:"刢";s:2:"c";s:3:"刣";s:2:"d";s:3:"判";s:2:"";s:3:"別";s:2:"e";s:3:"刦";s:2:"f";s:3:"刧";s:2:"g";s:3:"刨";s:2:"";s:3:"利";s:2:"";s:3:"刪";s:2:"h";s:3:"别";s:2:"";s:3:"刬";s:2:"i";s:3:"刭";s:2:"";s:3:"刮";s:2:"";s:3:"刯";s:2:"j";s:3:"到";s:2:"";s:3:"刱";s:2:"k";s:3:"刲";s:2:"l";s:3:"刳";s:2:"";s:3:"刴";s:2:"m";s:3:"刵";s:2:"n";s:3:"制";s:2:"";s:3:"刷";s:2:"ˢ";s:3:"券";s:2:"ȯ";s:3:"刹";s:2:"ɲ";s:3:"刺";s:2:"";s:3:"刻";s:2:"";s:3:"刼";s:2:"o";s:3:"刽";s:2:"";s:3:"刾";s:2:"p";s:3:"刿";s:2:"";s:3:"剀";s:2:"";s:3:"剁";s:2:"";s:3:"剂";s:2:"";s:3:"剃";s:2:"";s:3:"剄";s:2:"q";s:3:"剅";s:2:"r";s:3:"剆";s:2:"s";s:3:"則";s:2:"t";s:3:"剈";s:2:"u";s:3:"剉";s:2:"v";s:3:"削";s:2:"";s:3:"剋";s:2:"w";s:3:"剌";s:2:"";s:3:"前";s:2:"ǰ";s:3:"剎";s:2:"x";s:3:"剏";s:2:"y";s:3:"剐";s:2:"";s:3:"剑";s:2:"";s:3:"剒";s:2:"z";s:3:"剓";s:2:"{";s:3:"剔";s:2:"";s:3:"剕";s:2:"|";s:3:"剖";s:2:"";s:3:"剗";s:2:"}";s:3:"剘";s:2:"~";s:3:"剙";s:2:"";s:3:"剚";s:2:"";s:3:"剛";s:2:"";s:3:"剜";s:2:"";s:3:"剝";s:2:"";s:3:"剞";s:2:"";s:3:"剟";s:2:"";s:3:"剠";s:2:"";s:3:"剡";s:2:"";s:3:"剢";s:2:"";s:3:"剣";s:2:"";s:3:"剤";s:2:"";s:3:"剥";s:2:"";s:3:"剦";s:2:"";s:3:"剧";s:2:"";s:3:"剨";s:2:"";s:3:"剩";s:2:"ʣ";s:3:"剪";s:2:"";s:3:"剫";s:2:"";s:3:"剬";s:2:"";s:3:"剭";s:2:"";s:3:"剮";s:2:"";s:3:"副";s:2:"";s:3:"剰";s:2:"";s:3:"剱";s:2:"";s:3:"割";s:2:"";s:3:"剳";s:2:"";s:3:"剴";s:2:"";s:3:"創";s:2:"";s:3:"剶";s:2:"";s:3:"剷";s:2:"";s:3:"剸";s:2:"";s:3:"剹";s:2:"";s:3:"剺";s:2:"";s:3:"剻";s:2:"";s:3:"剼";s:2:"";s:3:"剽";s:2:"";s:3:"剾";s:2:"";s:3:"剿";s:2:"";s:3:"劀";s:2:"";s:3:"劁";s:2:"";s:3:"劂";s:2:"";s:3:"劃";s:2:"";s:3:"劄";s:2:"";s:3:"劅";s:2:"";s:3:"劆";s:2:"";s:3:"劇";s:2:"";s:3:"劈";s:2:"";s:3:"劉";s:2:"";s:3:"劊";s:2:"";s:3:"劋";s:2:"";s:3:"劌";s:2:"";s:3:"劍";s:2:"";s:3:"劎";s:2:"";s:3:"劏";s:2:"";s:3:"劐";s:2:"";s:3:"劑";s:2:"";s:3:"劒";s:2:"";s:3:"劓";s:2:"";s:3:"劔";s:2:"";s:3:"劕";s:2:"";s:3:"劖";s:2:"";s:3:"劗";s:2:"";s:3:"劘";s:2:"";s:3:"劙";s:2:"";s:3:"劚";s:2:"";s:3:"力";s:2:"";s:3:"劜";s:2:"";s:3:"劝";s:2:"Ȱ";s:3:"办";s:2:"";s:3:"功";s:2:"";s:3:"加";s:2:"";s:3:"务";s:2:"";s:3:"劢";s:2:"۽";s:3:"劣";s:2:"";s:3:"劤";s:2:"";s:3:"劥";s:2:"";s:3:"劦";s:2:"";s:3:"劧";s:2:"";s:3:"动";s:2:"";s:3:"助";s:2:"";s:3:"努";s:2:"Ŭ";s:3:"劫";s:2:"";s:3:"劬";s:2:"۾";s:3:"劭";s:2:"ۿ";s:3:"劮";s:2:"";s:3:"劯";s:2:"";s:3:"劰";s:2:"";s:3:"励";s:2:"";s:3:"劲";s:2:"";s:3:"劳";s:2:"";s:3:"労";s:2:"";s:3:"劵";s:2:"";s:3:"劶";s:2:"";s:3:"劷";s:2:"";s:3:"劸";s:2:"";s:3:"効";s:2:"";s:3:"劺";s:2:"";s:3:"劻";s:2:"";s:3:"劼";s:2:"";s:3:"劽";s:2:"";s:3:"劾";s:2:"";s:3:"势";s:2:"";s:3:"勀";s:2:"";s:3:"勁";s:2:"";s:3:"勂";s:2:"";s:3:"勃";s:2:"";s:3:"勄";s:2:"";s:3:"勅";s:2:"";s:3:"勆";s:2:"";s:3:"勇";s:2:"";s:3:"勈";s:2:"";s:3:"勉";s:2:"";s:3:"勊";s:2:"";s:3:"勋";s:2:"ѫ";s:3:"勌";s:2:"";s:3:"勍";s:2:"";s:3:"勎";s:2:"";s:3:"勏";s:2:"";s:3:"勐";s:2:"";s:3:"勑";s:2:"";s:3:"勒";s:2:"";s:3:"勓";s:2:"";s:3:"勔";s:2:"";s:3:"動";s:2:"";s:3:"勖";s:2:"";s:3:"勗";s:2:"";s:3:"勘";s:2:"";s:3:"務";s:2:"";s:3:"勚";s:2:"";s:3:"勛";s:2:"";s:3:"勜";s:2:"";s:3:"勝";s:2:"";s:3:"勞";s:2:"";s:3:"募";s:2:"ļ";s:3:"勠";s:2:"";s:3:"勡";s:2:"";s:3:"勢";s:2:"";s:3:"勣";s:2:"";s:3:"勤";s:2:"";s:3:"勥";s:2:"";s:3:"勦";s:2:"";s:3:"勧";s:2:"";s:3:"勨";s:2:"";s:3:"勩";s:2:"";s:3:"勪";s:2:"";s:3:"勫";s:2:"";s:3:"勬";s:2:"";s:3:"勭";s:2:"";s:3:"勮";s:2:"";s:3:"勯";s:2:"";s:3:"勰";s:2:"";s:3:"勱";s:2:"";s:3:"勲";s:2:"";s:3:"勳";s:2:"";s:3:"勴";s:2:"";s:3:"勵";s:2:"";s:3:"勶";s:2:"";s:3:"勷";s:2:"";s:3:"勸";s:2:"";s:3:"勹";s:2:"";s:3:"勺";s:2:"";s:3:"勻";s:2:"";s:3:"勼";s:2:"";s:3:"勽";s:2:"";s:3:"勾";s:2:"";s:3:"勿";s:2:"";s:3:"匀";s:2:"";s:3:"匁";s:2:"";s:3:"匂";s:2:"";s:3:"匃";s:2:"";s:3:"匄";s:2:"";s:3:"包";s:2:"";s:3:"匆";s:2:"";s:3:"匇";s:2:"";s:3:"匈";s:2:"";s:3:"匉";s:2:"";s:3:"匊";s:2:"";s:3:"匋";s:2:"";s:3:"匌";s:2:"";s:3:"匍";s:2:"";s:3:"匎";s:2:"";s:3:"匏";s:2:"";s:3:"匐";s:2:"";s:3:"匑";s:2:"@";s:3:"匒";s:2:"A";s:3:"匓";s:2:"B";s:3:"匔";s:2:"C";s:3:"匕";s:2:"ذ";s:3:"化";s:2:"";s:3:"北";s:2:"";s:3:"匘";s:2:"D";s:3:"匙";s:2:"";s:3:"匚";s:2:"";s:3:"匛";s:2:"E";s:3:"匜";s:2:"F";s:3:"匝";s:2:"";s:3:"匞";s:2:"G";s:3:"匟";s:2:"H";s:3:"匠";s:2:"";s:3:"匡";s:2:"";s:3:"匢";s:2:"I";s:3:"匣";s:2:"ϻ";s:3:"匤";s:2:"J";s:3:"匥";s:2:"K";s:3:"匦";s:2:"";s:3:"匧";s:2:"L";s:3:"匨";s:2:"M";s:3:"匩";s:2:"N";s:3:"匪";s:2:"";s:3:"匫";s:2:"O";s:3:"匬";s:2:"P";s:3:"匭";s:2:"Q";s:3:"匮";s:2:"";s:3:"匯";s:2:"R";s:3:"匰";s:2:"S";s:3:"匱";s:2:"T";s:3:"匲";s:2:"U";s:3:"匳";s:2:"V";s:3:"匴";s:2:"W";s:3:"匵";s:2:"X";s:3:"匶";s:2:"Y";s:3:"匷";s:2:"Z";s:3:"匸";s:2:"[";s:3:"匹";s:2:"ƥ";s:3:"区";s:2:"";s:3:"医";s:2:"ҽ";s:3:"匼";s:2:"\";s:3:"匽";s:2:"]";s:3:"匾";s:2:"";s:3:"匿";s:2:"";s:3:"區";s:2:"^";s:3:"十";s:2:"ʮ";s:3:"卂";s:2:"_";s:3:"千";s:2:"ǧ";s:3:"卄";s:2:"`";s:3:"卅";s:2:"ئ";s:3:"卆";s:2:"a";s:3:"升";s:2:"";s:3:"午";s:2:"";s:3:"卉";s:2:"";s:3:"半";s:2:"";s:3:"卋";s:2:"b";s:3:"卌";s:2:"c";s:3:"卍";s:2:"d";s:3:"华";s:2:"";s:3:"协";s:2:"Э";s:3:"卐";s:2:"e";s:3:"卑";s:2:"";s:3:"卒";s:2:"";s:3:"卓";s:2:"׿";s:3:"協";s:2:"f";s:3:"单";s:2:"";s:3:"卖";s:2:"";s:3:"南";s:2:"";s:3:"単";s:2:"g";s:3:"卙";s:2:"h";s:3:"博";s:2:"";s:3:"卛";s:2:"i";s:3:"卜";s:2:"";s:3:"卝";s:2:"j";s:3:"卞";s:2:"";s:3:"卟";s:2:"߲";s:3:"占";s:2:"ռ";s:3:"卡";s:2:"";s:3:"卢";s:2:"¬";s:3:"卣";s:2:"";s:3:"卤";s:2:"±";s:3:"卥";s:2:"k";s:3:"卦";s:2:"";s:3:"卧";s:2:"";s:3:"卨";s:2:"l";s:3:"卩";s:2:"";s:3:"卪";s:2:"m";s:3:"卫";s:2:"";s:3:"卬";s:2:"n";s:3:"卭";s:2:"o";s:3:"卮";s:2:"ش";s:3:"卯";s:2:"î";s:3:"印";s:2:"ӡ";s:3:"危";s:2:"Σ";s:3:"卲";s:2:"p";s:3:"即";s:2:"";s:3:"却";s:2:"ȴ";s:3:"卵";s:2:"";s:3:"卶";s:2:"q";s:3:"卷";s:2:"";s:3:"卸";s:2:"ж";s:3:"卹";s:2:"r";s:3:"卺";s:2:"";s:3:"卻";s:2:"s";s:3:"卼";s:2:"t";s:3:"卽";s:2:"u";s:3:"卾";s:2:"v";s:3:"卿";s:2:"";s:3:"厀";s:2:"w";s:3:"厁";s:2:"x";s:3:"厂";s:2:"";s:3:"厃";s:2:"y";s:3:"厄";s:2:"";s:3:"厅";s:2:"";s:3:"历";s:2:"";s:3:"厇";s:2:"z";s:3:"厈";s:2:"{";s:3:"厉";s:2:"";s:3:"厊";s:2:"|";s:3:"压";s:2:"ѹ";s:3:"厌";s:2:"";s:3:"厍";s:2:"";s:3:"厎";s:2:"}";s:3:"厏";s:2:"~";s:3:"厐";s:2:"";s:3:"厑";s:2:"";s:3:"厒";s:2:"";s:3:"厓";s:2:"";s:3:"厔";s:2:"";s:3:"厕";s:2:"";s:3:"厖";s:2:"";s:3:"厗";s:2:"";s:3:"厘";s:2:"";s:3:"厙";s:2:"";s:3:"厚";s:2:"";s:3:"厛";s:2:"";s:3:"厜";s:2:"";s:3:"厝";s:2:"";s:3:"厞";s:2:"";s:3:"原";s:2:"ԭ";s:3:"厠";s:2:"";s:3:"厡";s:2:"";s:3:"厢";s:2:"";s:3:"厣";s:2:"";s:3:"厤";s:2:"";s:3:"厥";s:2:"";s:3:"厦";s:2:"";s:3:"厧";s:2:"";s:3:"厨";s:2:"";s:3:"厩";s:2:"";s:3:"厪";s:2:"";s:3:"厫";s:2:"";s:3:"厬";s:2:"";s:3:"厭";s:2:"";s:3:"厮";s:2:"";s:3:"厯";s:2:"";s:3:"厰";s:2:"";s:3:"厱";s:2:"";s:3:"厲";s:2:"";s:3:"厳";s:2:"";s:3:"厴";s:2:"";s:3:"厵";s:2:"";s:3:"厶";s:2:"";s:3:"厷";s:2:"";s:3:"厸";s:2:"";s:3:"厹";s:2:"";s:3:"厺";s:2:"";s:3:"去";s:2:"ȥ";s:3:"厼";s:2:"";s:3:"厽";s:2:"";s:3:"厾";s:2:"";s:3:"县";s:2:"";s:3:"叀";s:2:"";s:3:"叁";s:2:"";s:3:"参";s:2:"";s:3:"參";s:2:"";s:3:"叄";s:2:"";s:3:"叅";s:2:"";s:3:"叆";s:2:"";s:3:"叇";s:2:"";s:3:"又";s:2:"";s:3:"叉";s:2:"";s:3:"及";s:2:"";s:3:"友";s:2:"";s:3:"双";s:2:"˫";s:3:"反";s:2:"";s:3:"収";s:2:"";s:3:"叏";s:2:"";s:3:"叐";s:2:"";s:3:"发";s:2:"";s:3:"叒";s:2:"";s:3:"叓";s:2:"";s:3:"叔";s:2:"";s:3:"叕";s:2:"";s:3:"取";s:2:"ȡ";s:3:"受";s:2:"";s:3:"变";s:2:"";s:3:"叙";s:2:"";s:3:"叚";s:2:"";s:3:"叛";s:2:"";s:3:"叜";s:2:"";s:3:"叝";s:2:"";s:3:"叞";s:2:"";s:3:"叟";s:2:"";s:3:"叠";s:2:"";s:3:"叡";s:2:"";s:3:"叢";s:2:"";s:3:"口";s:2:"";s:3:"古";s:2:"";s:3:"句";s:2:"";s:3:"另";s:2:"";s:3:"叧";s:2:"";s:3:"叨";s:2:"߶";s:3:"叩";s:2:"ߵ";s:3:"只";s:2:"ֻ";s:3:"叫";s:2:"";s:3:"召";s:2:"";s:3:"叭";s:2:"";s:3:"叮";s:2:"";s:3:"可";s:2:"";s:3:"台";s:2:"̨";s:3:"叱";s:2:"߳";s:3:"史";s:2:"ʷ";s:3:"右";s:2:"";s:3:"叴";s:2:"";s:3:"叵";s:2:"";s:3:"叶";s:2:"Ҷ";s:3:"号";s:2:"";s:3:"司";s:2:"˾";s:3:"叹";s:2:"̾";s:3:"叺";s:2:"";s:3:"叻";s:2:"߷";s:3:"叼";s:2:"";s:3:"叽";s:2:"ߴ";s:3:"叾";s:2:"";s:3:"叿";s:2:"";s:3:"吀";s:2:"";s:3:"吁";s:2:"";s:3:"吂";s:2:"";s:3:"吃";s:2:"";s:3:"各";s:2:"";s:3:"吅";s:2:"";s:3:"吆";s:2:"ߺ";s:3:"吇";s:2:"";s:3:"合";s:2:"";s:3:"吉";s:2:"";s:3:"吊";s:2:"";s:3:"吋";s:2:"";s:3:"同";s:2:"ͬ";s:3:"名";s:2:"";s:3:"后";s:2:"";s:3:"吏";s:2:"";s:3:"吐";s:2:"";s:3:"向";s:2:"";s:3:"吒";s:2:"߸";s:3:"吓";s:2:"";s:3:"吔";s:2:"";s:3:"吕";s:2:"";s:3:"吖";s:2:"߹";s:3:"吗";s:2:"";s:3:"吘";s:2:"";s:3:"吙";s:2:"";s:3:"吚";s:2:"";s:3:"君";s:2:"";s:3:"吜";s:2:"";s:3:"吝";s:2:"";s:3:"吞";s:2:"";s:3:"吟";s:2:"";s:3:"吠";s:2:"";s:3:"吡";s:2:"";s:3:"吢";s:2:"";s:3:"吣";s:2:"";s:3:"吤";s:2:"";s:3:"吥";s:2:"";s:3:"否";s:2:"";s:3:"吧";s:2:"";s:3:"吨";s:2:"";s:3:"吩";s:2:"";s:3:"吪";s:2:"";s:3:"含";s:2:"";s:3:"听";s:2:"";s:3:"吭";s:2:"";s:3:"吮";s:2:"˱";s:3:"启";s:2:"";s:3:"吰";s:2:"";s:3:"吱";s:2:"֨";s:3:"吲";s:2:"";s:3:"吳";s:2:"";s:3:"吴";s:2:"";s:3:"吵";s:2:"";s:3:"吶";s:2:"";s:3:"吷";s:2:"";s:3:"吸";s:2:"";s:3:"吹";s:2:"";s:3:"吺";s:2:"";s:3:"吻";s:2:"";s:3:"吼";s:2:"";s:3:"吽";s:2:"";s:3:"吾";s:2:"";s:3:"吿";s:2:"";s:3:"呀";s:2:"ѽ";s:3:"呁";s:2:"";s:3:"呂";s:2:"";s:3:"呃";s:2:"";s:3:"呄";s:2:"";s:3:"呅";s:2:"";s:3:"呆";s:2:"";s:3:"呇";s:2:"";s:3:"呈";s:2:"";s:3:"呉";s:2:"";s:3:"告";s:2:"";s:3:"呋";s:2:"߻";s:3:"呌";s:2:"";s:3:"呍";s:2:"";s:3:"呎";s:2:"";s:3:"呏";s:2:"";s:3:"呐";s:2:"";s:3:"呑";s:2:"";s:3:"呒";s:2:"߼";s:3:"呓";s:2:"߽";s:3:"呔";s:2:"߾";s:3:"呕";s:2:"Ż";s:3:"呖";s:2:"߿";s:3:"呗";s:2:"";s:3:"员";s:2:"Ա";s:3:"呙";s:2:"";s:3:"呚";s:2:"";s:3:"呛";s:2:"Ǻ";s:3:"呜";s:2:"";s:3:"呝";s:2:"";s:3:"呞";s:2:"";s:3:"呟";s:2:"";s:3:"呠";s:2:"";s:3:"呡";s:2:"";s:3:"呢";s:2:"";s:3:"呣";s:2:"";s:3:"呤";s:2:"";s:3:"呥";s:2:"";s:3:"呦";s:2:"";s:3:"呧";s:2:"";s:3:"周";s:2:"";s:3:"呩";s:2:"";s:3:"呪";s:2:"";s:3:"呫";s:2:"";s:3:"呬";s:2:"";s:3:"呭";s:2:"";s:3:"呮";s:2:"";s:3:"呯";s:2:"";s:3:"呰";s:2:"";s:3:"呱";s:2:"";s:3:"呲";s:2:"";s:3:"味";s:2:"ζ";s:3:"呴";s:2:"";s:3:"呵";s:2:"";s:3:"呶";s:2:"";s:3:"呷";s:2:"";s:3:"呸";s:2:"";s:3:"呹";s:2:"";s:3:"呺";s:2:"";s:3:"呻";s:2:"";s:3:"呼";s:2:"";s:3:"命";s:2:"";s:3:"呾";s:2:"";s:3:"呿";s:2:"";s:3:"咀";s:2:"";s:3:"咁";s:2:"";s:3:"咂";s:2:"";s:3:"咃";s:2:"";s:3:"咄";s:2:"";s:3:"咅";s:2:"";s:3:"咆";s:2:"";s:3:"咇";s:2:"";s:3:"咈";s:2:"";s:3:"咉";s:2:"";s:3:"咊";s:2:"";s:3:"咋";s:2:"զ";s:3:"和";s:2:"";s:3:"咍";s:2:"";s:3:"咎";s:2:"";s:3:"咏";s:2:"ӽ";s:3:"咐";s:2:"";s:3:"咑";s:2:"";s:3:"咒";s:2:"";s:3:"咓";s:2:"";s:3:"咔";s:2:"";s:3:"咕";s:2:"";s:3:"咖";s:2:"";s:3:"咗";s:2:"";s:3:"咘";s:2:"";s:3:"咙";s:2:"";s:3:"咚";s:2:"";s:3:"咛";s:2:"";s:3:"咜";s:2:"";s:3:"咝";s:2:"";s:3:"咞";s:2:"";s:3:"咟";s:2:"";s:3:"咠";s:2:"";s:3:"咡";s:2:"";s:3:"咢";s:2:"@";s:3:"咣";s:2:"";s:3:"咤";s:2:"";s:3:"咥";s:2:"A";s:3:"咦";s:2:"";s:3:"咧";s:2:"";s:3:"咨";s:2:"";s:3:"咩";s:2:"";s:3:"咪";s:2:"";s:3:"咫";s:2:"";s:3:"咬";s:2:"ҧ";s:3:"咭";s:2:"";s:3:"咮";s:2:"B";s:3:"咯";s:2:"";s:3:"咰";s:2:"C";s:3:"咱";s:2:"";s:3:"咲";s:2:"D";s:3:"咳";s:2:"";s:3:"咴";s:2:"";s:3:"咵";s:2:"E";s:3:"咶";s:2:"F";s:3:"咷";s:2:"G";s:3:"咸";s:2:"";s:3:"咹";s:2:"H";s:3:"咺";s:2:"I";s:3:"咻";s:2:"";s:3:"咼";s:2:"J";s:3:"咽";s:2:"";s:3:"咾";s:2:"K";s:3:"咿";s:2:"";s:3:"哀";s:2:"";s:3:"品";s:2:"Ʒ";s:3:"哂";s:2:"";s:3:"哃";s:2:"L";s:3:"哄";s:2:"";s:3:"哅";s:2:"M";s:3:"哆";s:2:"";s:3:"哇";s:2:"";s:3:"哈";s:2:"";s:3:"哉";s:2:"";s:3:"哊";s:2:"N";s:3:"哋";s:2:"O";s:3:"哌";s:2:"";s:3:"响";s:2:"";s:3:"哎";s:2:"";s:3:"哏";s:2:"";s:3:"哐";s:2:"";s:3:"哑";s:2:"";s:3:"哒";s:2:"";s:3:"哓";s:2:"";s:3:"哔";s:2:"";s:3:"哕";s:2:"";s:3:"哖";s:2:"P";s:3:"哗";s:2:"";s:3:"哘";s:2:"Q";s:3:"哙";s:2:"";s:3:"哚";s:2:"";s:3:"哛";s:2:"R";s:3:"哜";s:2:"";s:3:"哝";s:2:"";s:3:"哞";s:2:"";s:3:"哟";s:2:"Ӵ";s:3:"哠";s:2:"S";s:3:"員";s:2:"T";s:3:"哢";s:2:"U";s:3:"哣";s:2:"V";s:3:"哤";s:2:"W";s:3:"哥";s:2:"";s:3:"哦";s:2:"Ŷ";s:3:"哧";s:2:"";s:3:"哨";s:2:"";s:3:"哩";s:2:"";s:3:"哪";s:2:"";s:3:"哫";s:2:"X";s:3:"哬";s:2:"Y";s:3:"哭";s:2:"";s:3:"哮";s:2:"";s:3:"哯";s:2:"Z";s:3:"哰";s:2:"[";s:3:"哱";s:2:"\";s:3:"哲";s:2:"";s:3:"哳";s:2:"";s:3:"哴";s:2:"]";s:3:"哵";s:2:"^";s:3:"哶";s:2:"_";s:3:"哷";s:2:"`";s:3:"哸";s:2:"a";s:3:"哹";s:2:"b";s:3:"哺";s:2:"";s:3:"哻";s:2:"c";s:3:"哼";s:2:"";s:3:"哽";s:2:"";s:3:"哾";s:2:"d";s:3:"哿";s:2:"";s:3:"唀";s:2:"e";s:3:"唁";s:2:"";s:3:"唂";s:2:"f";s:3:"唃";s:2:"g";s:3:"唄";s:2:"h";s:3:"唅";s:2:"i";s:3:"唆";s:2:"";s:3:"唇";s:2:"";s:3:"唈";s:2:"j";s:3:"唉";s:2:"";s:3:"唊";s:2:"k";s:3:"唋";s:2:"l";s:3:"唌";s:2:"m";s:3:"唍";s:2:"n";s:3:"唎";s:2:"o";s:3:"唏";s:2:"";s:3:"唐";s:2:"";s:3:"唑";s:2:"";s:3:"唒";s:2:"p";s:3:"唓";s:2:"q";s:3:"唔";s:2:"";s:3:"唕";s:2:"r";s:3:"唖";s:2:"s";s:3:"唗";s:2:"t";s:3:"唘";s:2:"u";s:3:"唙";s:2:"v";s:3:"唚";s:2:"w";s:3:"唛";s:2:"";s:3:"唜";s:2:"x";s:3:"唝";s:2:"y";s:3:"唞";s:2:"z";s:3:"唟";s:2:"{";s:3:"唠";s:2:"";s:3:"唡";s:2:"|";s:3:"唢";s:2:"";s:3:"唣";s:2:"";s:3:"唤";s:2:"";s:3:"唥";s:2:"}";s:3:"唦";s:2:"~";s:3:"唧";s:2:"";s:3:"唨";s:2:"";s:3:"唩";s:2:"";s:3:"唪";s:2:"";s:3:"唫";s:2:"";s:3:"唬";s:2:"";s:3:"唭";s:2:"";s:3:"售";s:2:"";s:3:"唯";s:2:"Ψ";s:3:"唰";s:2:"";s:3:"唱";s:2:"";s:3:"唲";s:2:"";s:3:"唳";s:2:"";s:3:"唴";s:2:"";s:3:"唵";s:2:"";s:3:"唶";s:2:"";s:3:"唷";s:2:"";s:3:"唸";s:2:"";s:3:"唹";s:2:"";s:3:"唺";s:2:"";s:3:"唻";s:2:"";s:3:"唼";s:2:"";s:3:"唽";s:2:"";s:3:"唾";s:2:"";s:3:"唿";s:2:"";s:3:"啀";s:2:"";s:3:"啁";s:2:"";s:3:"啂";s:2:"";s:3:"啃";s:2:"";s:3:"啄";s:2:"";s:3:"啅";s:2:"";s:3:"商";s:2:"";s:3:"啇";s:2:"";s:3:"啈";s:2:"";s:3:"啉";s:2:"";s:3:"啊";s:2:"";s:3:"啋";s:2:"";s:3:"啌";s:2:"";s:3:"啍";s:2:"";s:3:"啎";s:2:"";s:3:"問";s:2:"";s:3:"啐";s:2:"";s:3:"啑";s:2:"";s:3:"啒";s:2:"";s:3:"啓";s:2:"";s:3:"啔";s:2:"";s:3:"啕";s:2:"";s:3:"啖";s:2:"";s:3:"啗";s:2:"";s:3:"啘";s:2:"";s:3:"啙";s:2:"";s:3:"啚";s:2:"";s:3:"啛";s:2:"";s:3:"啜";s:2:"";s:3:"啝";s:2:"";s:3:"啞";s:2:"";s:3:"啟";s:2:"";s:3:"啠";s:2:"";s:3:"啡";s:2:"";s:3:"啢";s:2:"";s:3:"啣";s:2:"";s:3:"啤";s:2:"ơ";s:3:"啥";s:2:"ɶ";s:3:"啦";s:2:"";s:3:"啧";s:2:"";s:3:"啨";s:2:"";s:3:"啩";s:2:"";s:3:"啪";s:2:"ž";s:3:"啫";s:2:"";s:3:"啬";s:2:"";s:3:"啭";s:2:"";s:3:"啮";s:2:"";s:3:"啯";s:2:"";s:3:"啰";s:2:"";s:3:"啱";s:2:"";s:3:"啲";s:2:"";s:3:"啳";s:2:"";s:3:"啴";s:2:"";s:3:"啵";s:2:"";s:3:"啶";s:2:"";s:3:"啷";s:2:"";s:3:"啸";s:2:"Х";s:3:"啹";s:2:"";s:3:"啺";s:2:"";s:3:"啻";s:2:"";s:3:"啼";s:2:"";s:3:"啽";s:2:"";s:3:"啾";s:2:"";s:3:"啿";s:2:"";s:3:"喀";s:2:"";s:3:"喁";s:2:"";s:3:"喂";s:2:"ι";s:3:"喃";s:2:"";s:3:"善";s:2:"";s:3:"喅";s:2:"";s:3:"喆";s:2:"";s:3:"喇";s:2:"";s:3:"喈";s:2:"";s:3:"喉";s:2:"";s:3:"喊";s:2:"";s:3:"喋";s:2:"";s:3:"喌";s:2:"";s:3:"喍";s:2:"";s:3:"喎";s:2:"";s:3:"喏";s:2:"";s:3:"喐";s:2:"";s:3:"喑";s:2:"";s:3:"喒";s:2:"";s:3:"喓";s:2:"";s:3:"喔";s:2:"";s:3:"喕";s:2:"";s:3:"喖";s:2:"";s:3:"喗";s:2:"";s:3:"喘";s:2:"";s:3:"喙";s:2:"";s:3:"喚";s:2:"";s:3:"喛";s:2:"";s:3:"喜";s:2:"ϲ";s:3:"喝";s:2:"";s:3:"喞";s:2:"";s:3:"喟";s:2:"";s:3:"喠";s:2:"";s:3:"喡";s:2:"";s:3:"喢";s:2:"";s:3:"喣";s:2:"";s:3:"喤";s:2:"";s:3:"喥";s:2:"";s:3:"喦";s:2:"";s:3:"喧";s:2:"";s:3:"喨";s:2:"";s:3:"喩";s:2:"";s:3:"喪";s:2:"";s:3:"喫";s:2:"";s:3:"喬";s:2:"";s:3:"喭";s:2:"";s:3:"單";s:2:"";s:3:"喯";s:2:"";s:3:"喰";s:2:"";s:3:"喱";s:2:"";s:3:"喲";s:2:"";s:3:"喳";s:2:"";s:3:"喴";s:2:"";s:3:"喵";s:2:"";s:3:"営";s:2:"";s:3:"喷";s:2:"";s:3:"喸";s:2:"";s:3:"喹";s:2:"";s:3:"喺";s:2:"";s:3:"喻";s:2:"";s:3:"喼";s:2:"";s:3:"喽";s:2:"";s:3:"喾";s:2:"";s:3:"喿";s:2:"";s:3:"嗀";s:2:"";s:3:"嗁";s:2:"";s:3:"嗂";s:2:"";s:3:"嗃";s:2:"";s:3:"嗄";s:2:"";s:3:"嗅";s:2:"";s:3:"嗆";s:2:"";s:3:"嗇";s:2:"";s:3:"嗈";s:2:"";s:3:"嗉";s:2:"";s:3:"嗊";s:2:"";s:3:"嗋";s:2:"";s:3:"嗌";s:2:"";s:3:"嗍";s:2:"";s:3:"嗎";s:2:"";s:3:"嗏";s:2:"";s:3:"嗐";s:2:"";s:3:"嗑";s:2:"";s:3:"嗒";s:2:"";s:3:"嗓";s:2:"ɤ";s:3:"嗔";s:2:"";s:3:"嗕";s:2:"";s:3:"嗖";s:2:"";s:3:"嗗";s:2:"";s:3:"嗘";s:2:"";s:3:"嗙";s:2:"";s:3:"嗚";s:2:"";s:3:"嗛";s:2:"";s:3:"嗜";s:2:"";s:3:"嗝";s:2:"";s:3:"嗞";s:2:"";s:3:"嗟";s:2:"";s:3:"嗠";s:2:"";s:3:"嗡";s:2:"";s:3:"嗢";s:2:"";s:3:"嗣";s:2:"";s:3:"嗤";s:2:"";s:3:"嗥";s:2:"";s:3:"嗦";s:2:"";s:3:"嗧";s:2:"";s:3:"嗨";s:2:"";s:3:"嗩";s:2:"";s:3:"嗪";s:2:"";s:3:"嗫";s:2:"";s:3:"嗬";s:2:"";s:3:"嗭";s:2:"";s:3:"嗮";s:2:"";s:3:"嗯";s:2:"";s:3:"嗰";s:2:"";s:3:"嗱";s:2:"";s:3:"嗲";s:2:"";s:3:"嗳";s:2:"";s:3:"嗴";s:2:"";s:3:"嗵";s:2:"";s:3:"嗶";s:2:"";s:3:"嗷";s:2:"";s:3:"嗸";s:2:"";s:3:"嗹";s:2:"";s:3:"嗺";s:2:"";s:3:"嗻";s:2:"";s:3:"嗼";s:2:"";s:3:"嗽";s:2:"";s:3:"嗾";s:2:"";s:3:"嗿";s:2:"";s:3:"嘀";s:2:"";s:3:"嘁";s:2:"";s:3:"嘂";s:2:"";s:3:"嘃";s:2:"";s:3:"嘄";s:2:"";s:3:"嘅";s:2:"";s:3:"嘆";s:2:"@";s:3:"嘇";s:2:"A";s:3:"嘈";s:2:"";s:3:"嘉";s:2:"";s:3:"嘊";s:2:"B";s:3:"嘋";s:2:"C";s:3:"嘌";s:2:"";s:3:"嘍";s:2:"D";s:3:"嘎";s:2:"";s:3:"嘏";s:2:"";s:3:"嘐";s:2:"E";s:3:"嘑";s:2:"F";s:3:"嘒";s:2:"G";s:3:"嘓";s:2:"H";s:3:"嘔";s:2:"I";s:3:"嘕";s:2:"J";s:3:"嘖";s:2:"K";s:3:"嘗";s:2:"L";s:3:"嘘";s:2:"";s:3:"嘙";s:2:"M";s:3:"嘚";s:2:"N";s:3:"嘛";s:2:"";s:3:"嘜";s:2:"O";s:3:"嘝";s:2:"P";s:3:"嘞";s:2:"";s:3:"嘟";s:2:"";s:3:"嘠";s:2:"Q";s:3:"嘡";s:2:"R";s:3:"嘢";s:2:"S";s:3:"嘣";s:2:"";s:3:"嘤";s:2:"";s:3:"嘥";s:2:"T";s:3:"嘦";s:2:"U";s:3:"嘧";s:2:"";s:3:"嘨";s:2:"V";s:3:"嘩";s:2:"W";s:3:"嘪";s:2:"X";s:3:"嘫";s:2:"Y";s:3:"嘬";s:2:"";s:3:"嘭";s:2:"";s:3:"嘮";s:2:"Z";s:3:"嘯";s:2:"[";s:3:"嘰";s:2:"\";s:3:"嘱";s:2:"";s:3:"嘲";s:2:"";s:3:"嘳";s:2:"]";s:3:"嘴";s:2:"";s:3:"嘵";s:2:"^";s:3:"嘶";s:2:"˻";s:3:"嘷";s:2:"_";s:3:"嘸";s:2:"`";s:3:"嘹";s:2:"";s:3:"嘺";s:2:"a";s:3:"嘻";s:2:"";s:3:"嘼";s:2:"b";s:3:"嘽";s:2:"c";s:3:"嘾";s:2:"d";s:3:"嘿";s:2:"";s:3:"噀";s:2:"e";s:3:"噁";s:2:"f";s:3:"噂";s:2:"g";s:3:"噃";s:2:"h";s:3:"噄";s:2:"i";s:3:"噅";s:2:"j";s:3:"噆";s:2:"k";s:3:"噇";s:2:"l";s:3:"噈";s:2:"m";s:3:"噉";s:2:"n";s:3:"噊";s:2:"o";s:3:"噋";s:2:"p";s:3:"噌";s:2:"";s:3:"噍";s:2:"";s:3:"噎";s:2:"ҭ";s:3:"噏";s:2:"q";s:3:"噐";s:2:"r";s:3:"噑";s:2:"s";s:3:"噒";s:2:"t";s:3:"噓";s:2:"u";s:3:"噔";s:2:"";s:3:"噕";s:2:"v";s:3:"噖";s:2:"w";s:3:"噗";s:2:"";s:3:"噘";s:2:"";s:3:"噙";s:2:"";s:3:"噚";s:2:"x";s:3:"噛";s:2:"y";s:3:"噜";s:2:"";s:3:"噝";s:2:"z";s:3:"噞";s:2:"{";s:3:"噟";s:2:"|";s:3:"噠";s:2:"}";s:3:"噡";s:2:"~";s:3:"噢";s:2:"";s:3:"噣";s:2:"";s:3:"噤";s:2:"";s:3:"噥";s:2:"";s:3:"噦";s:2:"";s:3:"噧";s:2:"";s:3:"器";s:2:"";s:3:"噩";s:2:"ج";s:3:"噪";s:2:"";s:3:"噫";s:2:"";s:3:"噬";s:2:"";s:3:"噭";s:2:"";s:3:"噮";s:2:"";s:3:"噯";s:2:"";s:3:"噰";s:2:"";s:3:"噱";s:2:"";s:3:"噲";s:2:"";s:3:"噳";s:2:"";s:3:"噴";s:2:"";s:3:"噵";s:2:"";s:3:"噶";s:2:"";s:3:"噷";s:2:"";s:3:"噸";s:2:"";s:3:"噹";s:2:"";s:3:"噺";s:2:"";s:3:"噻";s:2:"";s:3:"噼";s:2:"";s:3:"噽";s:2:"";s:3:"噾";s:2:"";s:3:"噿";s:2:"";s:3:"嚀";s:2:"";s:3:"嚁";s:2:"";s:3:"嚂";s:2:"";s:3:"嚃";s:2:"";s:3:"嚄";s:2:"";s:3:"嚅";s:2:"";s:3:"嚆";s:2:"";s:3:"嚇";s:2:"";s:3:"嚈";s:2:"";s:3:"嚉";s:2:"";s:3:"嚊";s:2:"";s:3:"嚋";s:2:"";s:3:"嚌";s:2:"";s:3:"嚍";s:2:"";s:3:"嚎";s:2:"";s:3:"嚏";s:2:"";s:3:"嚐";s:2:"";s:3:"嚑";s:2:"";s:3:"嚒";s:2:"";s:3:"嚓";s:2:"";s:3:"嚔";s:2:"";s:3:"嚕";s:2:"";s:3:"嚖";s:2:"";s:3:"嚗";s:2:"";s:3:"嚘";s:2:"";s:3:"嚙";s:2:"";s:3:"嚚";s:2:"";s:3:"嚛";s:2:"";s:3:"嚜";s:2:"";s:3:"嚝";s:2:"";s:3:"嚞";s:2:"";s:3:"嚟";s:2:"";s:3:"嚠";s:2:"";s:3:"嚡";s:2:"";s:3:"嚢";s:2:"";s:3:"嚣";s:2:"";s:3:"嚤";s:2:"";s:3:"嚥";s:2:"";s:3:"嚦";s:2:"";s:3:"嚧";s:2:"";s:3:"嚨";s:2:"";s:3:"嚩";s:2:"";s:3:"嚪";s:2:"";s:3:"嚫";s:2:"";s:3:"嚬";s:2:"";s:3:"嚭";s:2:"";s:3:"嚮";s:2:"";s:3:"嚯";s:2:"";s:3:"嚰";s:2:"";s:3:"嚱";s:2:"";s:3:"嚲";s:2:"";s:3:"嚳";s:2:"";s:3:"嚴";s:2:"";s:3:"嚵";s:2:"";s:3:"嚶";s:2:"";s:3:"嚷";s:2:"";s:3:"嚸";s:2:"";s:3:"嚹";s:2:"";s:3:"嚺";s:2:"";s:3:"嚻";s:2:"";s:3:"嚼";s:2:"";s:3:"嚽";s:2:"";s:3:"嚾";s:2:"";s:3:"嚿";s:2:"";s:3:"囀";s:2:"";s:3:"囁";s:2:"";s:3:"囂";s:2:"";s:3:"囃";s:2:"";s:3:"囄";s:2:"";s:3:"囅";s:2:"";s:3:"囆";s:2:"";s:3:"囇";s:2:"";s:3:"囈";s:2:"";s:3:"囉";s:2:"";s:3:"囊";s:2:"";s:3:"囋";s:2:"";s:3:"囌";s:2:"";s:3:"囍";s:2:"";s:3:"囎";s:2:"";s:3:"囏";s:2:"";s:3:"囐";s:2:"";s:3:"囑";s:2:"";s:3:"囒";s:2:"";s:3:"囓";s:2:"";s:3:"囔";s:2:"";s:3:"囕";s:2:"";s:3:"囖";s:2:"";s:3:"囗";s:2:"";s:3:"囘";s:2:"";s:3:"囙";s:2:"";s:3:"囚";s:2:"";s:3:"四";s:2:"";s:3:"囜";s:2:"";s:3:"囝";s:2:"";s:3:"回";s:2:"";s:3:"囟";s:2:"ض";s:3:"因";s:2:"";s:3:"囡";s:2:"";s:3:"团";s:2:"";s:3:"団";s:2:"";s:3:"囤";s:2:"";s:3:"囥";s:2:"";s:3:"囦";s:2:"";s:3:"囧";s:2:"";s:3:"囨";s:2:"";s:3:"囩";s:2:"";s:3:"囪";s:2:"";s:3:"囫";s:2:"";s:3:"囬";s:2:"";s:3:"园";s:2:"԰";s:3:"囮";s:2:"";s:3:"囯";s:2:"";s:3:"困";s:2:"";s:3:"囱";s:2:"";s:3:"囲";s:2:"";s:3:"図";s:2:"";s:3:"围";s:2:"Χ";s:3:"囵";s:2:"";s:3:"囶";s:2:"";s:3:"囷";s:2:"";s:3:"囸";s:2:"";s:3:"囹";s:2:"";s:3:"固";s:2:"";s:3:"囻";s:2:"";s:3:"囼";s:2:"";s:3:"国";s:2:"";s:3:"图";s:2:"ͼ";s:3:"囿";s:2:"";s:3:"圀";s:2:"";s:3:"圁";s:2:"";s:3:"圂";s:2:"";s:3:"圃";s:2:"";s:3:"圄";s:2:"";s:3:"圅";s:2:"";s:3:"圆";s:2:"Բ";s:3:"圇";s:2:"";s:3:"圈";s:2:"Ȧ";s:3:"圉";s:2:"";s:3:"圊";s:2:"";s:3:"國";s:2:"";s:3:"圌";s:2:"";s:3:"圍";s:2:"";s:3:"圎";s:2:"";s:3:"圏";s:2:"";s:3:"圐";s:2:"";s:3:"圑";s:2:"";s:3:"園";s:2:"@";s:3:"圓";s:2:"A";s:3:"圔";s:2:"B";s:3:"圕";s:2:"C";s:3:"圖";s:2:"D";s:3:"圗";s:2:"E";s:3:"團";s:2:"F";s:3:"圙";s:2:"G";s:3:"圚";s:2:"H";s:3:"圛";s:2:"I";s:3:"圜";s:2:"";s:3:"圝";s:2:"J";s:3:"圞";s:2:"K";s:3:"土";s:2:"";s:3:"圠";s:2:"L";s:3:"圡";s:2:"M";s:3:"圢";s:2:"N";s:3:"圣";s:2:"ʥ";s:3:"圤";s:2:"O";s:3:"圥";s:2:"P";s:3:"圦";s:2:"Q";s:3:"圧";s:2:"R";s:3:"在";s:2:"";s:3:"圩";s:2:"";s:3:"圪";s:2:"";s:3:"圫";s:2:"S";s:3:"圬";s:2:"";s:3:"圭";s:2:"";s:3:"圮";s:2:"";s:3:"圯";s:2:"";s:3:"地";s:2:"";s:3:"圱";s:2:"T";s:3:"圲";s:2:"U";s:3:"圳";s:2:"";s:3:"圴";s:2:"V";s:3:"圵";s:2:"W";s:3:"圶";s:2:"X";s:3:"圷";s:2:"Y";s:3:"圸";s:2:"Z";s:3:"圹";s:2:"";s:3:"场";s:2:"";s:3:"圻";s:2:"";s:3:"圼";s:2:"[";s:3:"圽";s:2:"\";s:3:"圾";s:2:"";s:3:"圿";s:2:"]";s:3:"址";s:2:"ַ";s:3:"坁";s:2:"^";s:3:"坂";s:2:"";s:3:"坃";s:2:"_";s:3:"坄";s:2:"`";s:3:"坅";s:2:"a";s:3:"坆";s:2:"b";s:3:"均";s:2:"";s:3:"坈";s:2:"c";s:3:"坉";s:2:"d";s:3:"坊";s:2:"";s:3:"坋";s:2:"e";s:3:"坌";s:2:"";s:3:"坍";s:2:"̮";s:3:"坎";s:2:"";s:3:"坏";s:2:"";s:3:"坐";s:2:"";s:3:"坑";s:2:"";s:3:"坒";s:2:"f";s:3:"坓";s:2:"g";s:3:"坔";s:2:"h";s:3:"坕";s:2:"i";s:3:"坖";s:2:"j";s:3:"块";s:2:"";s:3:"坘";s:2:"k";s:3:"坙";s:2:"l";s:3:"坚";s:2:"";s:3:"坛";s:2:"̳";s:3:"坜";s:2:"";s:3:"坝";s:2:"";s:3:"坞";s:2:"";s:3:"坟";s:2:"";s:3:"坠";s:2:"׹";s:3:"坡";s:2:"";s:3:"坢";s:2:"m";s:3:"坣";s:2:"n";s:3:"坤";s:2:"";s:3:"坥";s:2:"o";s:3:"坦";s:2:"̹";s:3:"坧";s:2:"p";s:3:"坨";s:2:"";s:3:"坩";s:2:"";s:3:"坪";s:2:"ƺ";s:3:"坫";s:2:"";s:3:"坬";s:2:"q";s:3:"坭";s:2:"";s:3:"坮";s:2:"r";s:3:"坯";s:2:"";s:3:"坰";s:2:"s";s:3:"坱";s:2:"t";s:3:"坲";s:2:"u";s:3:"坳";s:2:"";s:3:"坴";s:2:"v";s:3:"坵";s:2:"w";s:3:"坶";s:2:"";s:3:"坷";s:2:"";s:3:"坸";s:2:"x";s:3:"坹";s:2:"y";s:3:"坺";s:2:"z";s:3:"坻";s:2:"";s:3:"坼";s:2:"";s:3:"坽";s:2:"{";s:3:"坾";s:2:"|";s:3:"坿";s:2:"}";s:3:"垀";s:2:"~";s:3:"垁";s:2:"";s:3:"垂";s:2:"";s:3:"垃";s:2:"";s:3:"垄";s:2:"¢";s:3:"垅";s:2:"";s:3:"垆";s:2:"";s:3:"垇";s:2:"";s:3:"垈";s:2:"";s:3:"垉";s:2:"";s:3:"垊";s:2:"";s:3:"型";s:2:"";s:3:"垌";s:2:"";s:3:"垍";s:2:"";s:3:"垎";s:2:"";s:3:"垏";s:2:"";s:3:"垐";s:2:"";s:3:"垑";s:2:"";s:3:"垒";s:2:"";s:3:"垓";s:2:"";s:3:"垔";s:2:"";s:3:"垕";s:2:"";s:3:"垖";s:2:"";s:3:"垗";s:2:"";s:3:"垘";s:2:"";s:3:"垙";s:2:"";s:3:"垚";s:2:"";s:3:"垛";s:2:"";s:3:"垜";s:2:"";s:3:"垝";s:2:"";s:3:"垞";s:2:"";s:3:"垟";s:2:"";s:3:"垠";s:2:"";s:3:"垡";s:2:"";s:3:"垢";s:2:"";s:3:"垣";s:2:"ԫ";s:3:"垤";s:2:"";s:3:"垥";s:2:"";s:3:"垦";s:2:"";s:3:"垧";s:2:"";s:3:"垨";s:2:"";s:3:"垩";s:2:"";s:3:"垪";s:2:"";s:3:"垫";s:2:"";s:3:"垬";s:2:"";s:3:"垭";s:2:"";s:3:"垮";s:2:"";s:3:"垯";s:2:"";s:3:"垰";s:2:"";s:3:"垱";s:2:"";s:3:"垲";s:2:"";s:3:"垳";s:2:"";s:3:"垴";s:2:"";s:3:"垵";s:2:"";s:3:"垶";s:2:"";s:3:"垷";s:2:"";s:3:"垸";s:2:"";s:3:"垹";s:2:"";s:3:"垺";s:2:"";s:3:"垻";s:2:"";s:3:"垼";s:2:"";s:3:"垽";s:2:"";s:3:"垾";s:2:"";s:3:"垿";s:2:"";s:3:"埀";s:2:"";s:3:"埁";s:2:"";s:3:"埂";s:2:"";s:3:"埃";s:2:"";s:3:"埄";s:2:"";s:3:"埅";s:2:"";s:3:"埆";s:2:"";s:3:"埇";s:2:"";s:3:"埈";s:2:"";s:3:"埉";s:2:"";s:3:"埊";s:2:"";s:3:"埋";s:2:"";s:3:"埌";s:2:"";s:3:"埍";s:2:"";s:3:"城";s:2:"";s:3:"埏";s:2:"";s:3:"埐";s:2:"";s:3:"埑";s:2:"";s:3:"埒";s:2:"";s:3:"埓";s:2:"";s:3:"埔";s:2:"";s:3:"埕";s:2:"";s:3:"埖";s:2:"";s:3:"埗";s:2:"";s:3:"埘";s:2:"";s:3:"埙";s:2:"";s:3:"埚";s:2:"";s:3:"埛";s:2:"";s:3:"埜";s:2:"";s:3:"埝";s:2:"";s:3:"埞";s:2:"";s:3:"域";s:2:"";s:3:"埠";s:2:"";s:3:"埡";s:2:"";s:3:"埢";s:2:"";s:3:"埣";s:2:"";s:3:"埤";s:2:"";s:3:"埥";s:2:"";s:3:"埦";s:2:"";s:3:"埧";s:2:"";s:3:"埨";s:2:"";s:3:"埩";s:2:"";s:3:"埪";s:2:"";s:3:"埫";s:2:"";s:3:"埬";s:2:"";s:3:"埭";s:2:"ܤ";s:3:"埮";s:2:"";s:3:"埯";s:2:"";s:3:"埰";s:2:"";s:3:"埱";s:2:"";s:3:"埲";s:2:"";s:3:"埳";s:2:"";s:3:"埴";s:2:"";s:3:"埵";s:2:"";s:3:"埶";s:2:"";s:3:"執";s:2:"";s:3:"埸";s:2:"";s:3:"培";s:2:"";s:3:"基";s:2:"";s:3:"埻";s:2:"";s:3:"埼";s:2:"";s:3:"埽";s:2:"ܣ";s:3:"埾";s:2:"";s:3:"埿";s:2:"";s:3:"堀";s:2:"ܥ";s:3:"堁";s:2:"";s:3:"堂";s:2:"";s:3:"堃";s:2:"";s:3:"堄";s:2:"";s:3:"堅";s:2:"";s:3:"堆";s:2:"";s:3:"堇";s:2:"";s:3:"堈";s:2:"";s:3:"堉";s:2:"";s:3:"堊";s:2:"";s:3:"堋";s:2:"ܡ";s:3:"堌";s:2:"";s:3:"堍";s:2:"ܢ";s:3:"堎";s:2:"";s:3:"堏";s:2:"";s:3:"堐";s:2:"";s:3:"堑";s:2:"ǵ";s:3:"堒";s:2:"";s:3:"堓";s:2:"";s:3:"堔";s:2:"";s:3:"堕";s:2:"";s:3:"堖";s:2:"";s:3:"堗";s:2:"";s:3:"堘";s:2:"";s:3:"堙";s:2:"ܧ";s:3:"堚";s:2:"";s:3:"堛";s:2:"";s:3:"堜";s:2:"";s:3:"堝";s:2:"";s:3:"堞";s:2:"ܦ";s:3:"堟";s:2:"";s:3:"堠";s:2:"ܩ";s:3:"堡";s:2:"";s:3:"堢";s:2:"";s:3:"堣";s:2:"";s:3:"堤";s:2:"";s:3:"堥";s:2:"";s:3:"堦";s:2:"";s:3:"堧";s:2:"";s:3:"堨";s:2:"";s:3:"堩";s:2:"";s:3:"堪";s:2:"";s:3:"堫";s:2:"";s:3:"堬";s:2:"";s:3:"堭";s:2:"";s:3:"堮";s:2:"";s:3:"堯";s:2:"";s:3:"堰";s:2:"";s:3:"報";s:2:"";s:3:"堲";s:2:"";s:3:"堳";s:2:"";s:3:"場";s:2:"";s:3:"堵";s:2:"";s:3:"堶";s:2:"";s:3:"堷";s:2:"";s:3:"堸";s:2:"";s:3:"堹";s:2:"";s:3:"堺";s:2:"";s:3:"堻";s:2:"";s:3:"堼";s:2:"";s:3:"堽";s:2:"";s:3:"堾";s:2:"@";s:3:"堿";s:2:"A";s:3:"塀";s:2:"B";s:3:"塁";s:2:"C";s:3:"塂";s:2:"D";s:3:"塃";s:2:"E";s:3:"塄";s:2:"ܨ";s:3:"塅";s:2:"F";s:3:"塆";s:2:"G";s:3:"塇";s:2:"H";s:3:"塈";s:2:"I";s:3:"塉";s:2:"J";s:3:"塊";s:2:"K";s:3:"塋";s:2:"L";s:3:"塌";s:2:"";s:3:"塍";s:2:"";s:3:"塎";s:2:"M";s:3:"塏";s:2:"N";s:3:"塐";s:2:"O";s:3:"塑";s:2:"";s:3:"塒";s:2:"P";s:3:"塓";s:2:"Q";s:3:"塔";s:2:"";s:3:"塕";s:2:"R";s:3:"塖";s:2:"S";s:3:"塗";s:2:"T";s:3:"塘";s:2:"";s:3:"塙";s:2:"U";s:3:"塚";s:2:"V";s:3:"塛";s:2:"W";s:3:"塜";s:2:"X";s:3:"塝";s:2:"Y";s:3:"塞";s:2:"";s:3:"塟";s:2:"Z";s:3:"塠";s:2:"[";s:3:"塡";s:2:"\";s:3:"塢";s:2:"]";s:3:"塣";s:2:"^";s:3:"塤";s:2:"_";s:3:"塥";s:2:"ܪ";s:3:"塦";s:2:"`";s:3:"塧";s:2:"a";s:3:"塨";s:2:"b";s:3:"塩";s:2:"c";s:3:"塪";s:2:"d";s:3:"填";s:2:"";s:3:"塬";s:2:"ܫ";s:3:"塭";s:2:"e";s:3:"塮";s:2:"f";s:3:"塯";s:2:"g";s:3:"塰";s:2:"h";s:3:"塱";s:2:"i";s:3:"塲";s:2:"j";s:3:"塳";s:2:"k";s:3:"塴";s:2:"l";s:3:"塵";s:2:"m";s:3:"塶";s:2:"n";s:3:"塷";s:2:"o";s:3:"塸";s:2:"p";s:3:"塹";s:2:"q";s:3:"塺";s:2:"r";s:3:"塻";s:2:"s";s:3:"塼";s:2:"t";s:3:"塽";s:2:"u";s:3:"塾";s:2:"";s:3:"塿";s:2:"v";s:3:"墀";s:2:"ܯ";s:3:"墁";s:2:"ܬ";s:3:"墂";s:2:"w";s:3:"境";s:2:"";s:3:"墄";s:2:"x";s:3:"墅";s:2:"";s:3:"墆";s:2:"y";s:3:"墇";s:2:"z";s:3:"墈";s:2:"{";s:3:"墉";s:2:"ܭ";s:3:"墊";s:2:"|";s:3:"墋";s:2:"}";s:3:"墌";s:2:"~";s:3:"墍";s:2:"";s:3:"墎";s:2:"";s:3:"墏";s:2:"";s:3:"墐";s:2:"";s:3:"墑";s:2:"";s:3:"墒";s:2:"";s:3:"墓";s:2:"Ĺ";s:3:"墔";s:2:"";s:3:"墕";s:2:"";s:3:"墖";s:2:"";s:3:"増";s:2:"";s:3:"墘";s:2:"";s:3:"墙";s:2:"ǽ";s:3:"墚";s:2:"ܮ";s:3:"墛";s:2:"";s:3:"墜";s:2:"";s:3:"墝";s:2:"";s:3:"增";s:2:"";s:3:"墟";s:2:"";s:3:"墠";s:2:"";s:3:"墡";s:2:"";s:3:"墢";s:2:"";s:3:"墣";s:2:"";s:3:"墤";s:2:"";s:3:"墥";s:2:"";s:3:"墦";s:2:"";s:3:"墧";s:2:"";s:3:"墨";s:2:"ī";s:3:"墩";s:2:"";s:3:"墪";s:2:"";s:3:"墫";s:2:"";s:3:"墬";s:2:"";s:3:"墭";s:2:"";s:3:"墮";s:2:"";s:3:"墯";s:2:"";s:3:"墰";s:2:"";s:3:"墱";s:2:"";s:3:"墲";s:2:"";s:3:"墳";s:2:"";s:3:"墴";s:2:"";s:3:"墵";s:2:"";s:3:"墶";s:2:"";s:3:"墷";s:2:"";s:3:"墸";s:2:"";s:3:"墹";s:2:"";s:3:"墺";s:2:"";s:3:"墻";s:2:"";s:3:"墼";s:2:"";s:3:"墽";s:2:"";s:3:"墾";s:2:"";s:3:"墿";s:2:"";s:3:"壀";s:2:"";s:3:"壁";s:2:"";s:3:"壂";s:2:"";s:3:"壃";s:2:"";s:3:"壄";s:2:"";s:3:"壅";s:2:"";s:3:"壆";s:2:"";s:3:"壇";s:2:"";s:3:"壈";s:2:"";s:3:"壉";s:2:"";s:3:"壊";s:2:"";s:3:"壋";s:2:"";s:3:"壌";s:2:"";s:3:"壍";s:2:"";s:3:"壎";s:2:"";s:3:"壏";s:2:"";s:3:"壐";s:2:"";s:3:"壑";s:2:"";s:3:"壒";s:2:"";s:3:"壓";s:2:"";s:3:"壔";s:2:"";s:3:"壕";s:2:"";s:3:"壖";s:2:"";s:3:"壗";s:2:"";s:3:"壘";s:2:"";s:3:"壙";s:2:"";s:3:"壚";s:2:"";s:3:"壛";s:2:"";s:3:"壜";s:2:"";s:3:"壝";s:2:"";s:3:"壞";s:2:"";s:3:"壟";s:2:"";s:3:"壠";s:2:"";s:3:"壡";s:2:"";s:3:"壢";s:2:"";s:3:"壣";s:2:"";s:3:"壤";s:2:"";s:3:"壥";s:2:"";s:3:"壦";s:2:"";s:3:"壧";s:2:"";s:3:"壨";s:2:"";s:3:"壩";s:2:"";s:3:"壪";s:2:"";s:3:"士";s:2:"ʿ";s:3:"壬";s:2:"";s:3:"壭";s:2:"";s:3:"壮";s:2:"׳";s:3:"壯";s:2:"";s:3:"声";s:2:"";s:3:"壱";s:2:"";s:3:"売";s:2:"";s:3:"壳";s:2:"";s:3:"壴";s:2:"";s:3:"壵";s:2:"";s:3:"壶";s:2:"";s:3:"壷";s:2:"";s:3:"壸";s:2:"";s:3:"壹";s:2:"Ҽ";s:3:"壺";s:2:"";s:3:"壻";s:2:"";s:3:"壼";s:2:"";s:3:"壽";s:2:"";s:3:"壾";s:2:"";s:3:"壿";s:2:"";s:3:"夀";s:2:"";s:3:"夁";s:2:"";s:3:"夂";s:2:"";s:3:"夃";s:2:"";s:3:"处";s:2:"";s:3:"夅";s:2:"";s:3:"夆";s:2:"";s:3:"备";s:2:"";s:3:"夈";s:2:"";s:3:"変";s:2:"";s:3:"夊";s:2:"";s:3:"夋";s:2:"";s:3:"夌";s:2:"";s:3:"复";s:2:"";s:3:"夎";s:2:"";s:3:"夏";s:2:"";s:3:"夐";s:2:"";s:3:"夑";s:2:"";s:3:"夒";s:2:"";s:3:"夓";s:2:"";s:3:"夔";s:2:"";s:3:"夕";s:2:"Ϧ";s:3:"外";s:2:"";s:3:"夗";s:2:"";s:3:"夘";s:2:"";s:3:"夙";s:2:"";s:3:"多";s:2:"";s:3:"夛";s:2:"";s:3:"夜";s:2:"ҹ";s:3:"夝";s:2:"";s:3:"夞";s:2:"";s:3:"够";s:2:"";s:3:"夠";s:2:"";s:3:"夡";s:2:"";s:3:"夢";s:2:"";s:3:"夣";s:2:"";s:3:"夤";s:2:"";s:3:"夥";s:2:"";s:3:"夦";s:2:"";s:3:"大";s:2:"";s:3:"夨";s:2:"";s:3:"天";s:2:"";s:3:"太";s:2:"̫";s:3:"夫";s:2:"";s:3:"夬";s:2:"";s:3:"夭";s:2:"ز";s:3:"央";s:2:"";s:3:"夯";s:2:"";s:3:"夰";s:2:"";s:3:"失";s:2:"ʧ";s:3:"夲";s:2:"";s:3:"夳";s:2:"";s:3:"头";s:2:"ͷ";s:3:"夵";s:2:"";s:3:"夶";s:2:"";s:3:"夷";s:2:"";s:3:"夸";s:2:"";s:3:"夹";s:2:"";s:3:"夺";s:2:"";s:3:"夻";s:2:"";s:3:"夼";s:2:"";s:3:"夽";s:2:"@";s:3:"夾";s:2:"A";s:3:"夿";s:2:"B";s:3:"奀";s:2:"C";s:3:"奁";s:2:"";s:3:"奂";s:2:"ۼ";s:3:"奃";s:2:"D";s:3:"奄";s:2:"";s:3:"奅";s:2:"E";s:3:"奆";s:2:"F";s:3:"奇";s:2:"";s:3:"奈";s:2:"";s:3:"奉";s:2:"";s:3:"奊";s:2:"G";s:3:"奋";s:2:"";s:3:"奌";s:2:"H";s:3:"奍";s:2:"I";s:3:"奎";s:2:"";s:3:"奏";s:2:"";s:3:"奐";s:2:"J";s:3:"契";s:2:"";s:3:"奒";s:2:"K";s:3:"奓";s:2:"L";s:3:"奔";s:2:"";s:3:"奕";s:2:"";s:3:"奖";s:2:"";s:3:"套";s:2:"";s:3:"奘";s:2:"";s:3:"奙";s:2:"M";s:3:"奚";s:2:"";s:3:"奛";s:2:"N";s:3:"奜";s:2:"O";s:3:"奝";s:2:"P";s:3:"奞";s:2:"Q";s:3:"奟";s:2:"R";s:3:"奠";s:2:"";s:3:"奡";s:2:"S";s:3:"奢";s:2:"";s:3:"奣";s:2:"T";s:3:"奤";s:2:"U";s:3:"奥";s:2:"";s:3:"奦";s:2:"V";s:3:"奧";s:2:"W";s:3:"奨";s:2:"X";s:3:"奩";s:2:"Y";s:3:"奪";s:2:"Z";s:3:"奫";s:2:"[";s:3:"奬";s:2:"\";s:3:"奭";s:2:"]";s:3:"奮";s:2:"^";s:3:"奯";s:2:"_";s:3:"奰";s:2:"`";s:3:"奱";s:2:"a";s:3:"奲";s:2:"b";s:3:"女";s:2:"Ů";s:3:"奴";s:2:"ū";s:3:"奵";s:2:"c";s:3:"奶";s:2:"";s:3:"奷";s:2:"d";s:3:"奸";s:2:"";s:3:"她";s:2:"";s:3:"奺";s:2:"e";s:3:"奻";s:2:"f";s:3:"奼";s:2:"g";s:3:"好";s:2:"";s:3:"奾";s:2:"h";s:3:"奿";s:2:"i";s:3:"妀";s:2:"j";s:3:"妁";s:2:"";s:3:"如";s:2:"";s:3:"妃";s:2:"";s:3:"妄";s:2:"";s:3:"妅";s:2:"k";s:3:"妆";s:2:"ױ";s:3:"妇";s:2:"";s:3:"妈";s:2:"";s:3:"妉";s:2:"l";s:3:"妊";s:2:"";s:3:"妋";s:2:"m";s:3:"妌";s:2:"n";s:3:"妍";s:2:"";s:3:"妎";s:2:"o";s:3:"妏";s:2:"p";s:3:"妐";s:2:"q";s:3:"妑";s:2:"r";s:3:"妒";s:2:"";s:3:"妓";s:2:"";s:3:"妔";s:2:"s";s:3:"妕";s:2:"t";s:3:"妖";s:2:"";s:3:"妗";s:2:"";s:3:"妘";s:2:"u";s:3:"妙";s:2:"";s:3:"妚";s:2:"v";s:3:"妛";s:2:"w";s:3:"妜";s:2:"x";s:3:"妝";s:2:"y";s:3:"妞";s:2:"";s:3:"妟";s:2:"z";s:3:"妠";s:2:"{";s:3:"妡";s:2:"|";s:3:"妢";s:2:"}";s:3:"妣";s:2:"";s:3:"妤";s:2:"";s:3:"妥";s:2:"";s:3:"妦";s:2:"~";s:3:"妧";s:2:"";s:3:"妨";s:2:"";s:3:"妩";s:2:"";s:3:"妪";s:2:"";s:3:"妫";s:2:"";s:3:"妬";s:2:"";s:3:"妭";s:2:"";s:3:"妮";s:2:"";s:3:"妯";s:2:"";s:3:"妰";s:2:"";s:3:"妱";s:2:"";s:3:"妲";s:2:"";s:3:"妳";s:2:"";s:3:"妴";s:2:"";s:3:"妵";s:2:"";s:3:"妶";s:2:"";s:3:"妷";s:2:"";s:3:"妸";s:2:"";s:3:"妹";s:2:"";s:3:"妺";s:2:"";s:3:"妻";s:2:"";s:3:"妼";s:2:"";s:3:"妽";s:2:"";s:3:"妾";s:2:"";s:3:"妿";s:2:"";s:3:"姀";s:2:"";s:3:"姁";s:2:"";s:3:"姂";s:2:"";s:3:"姃";s:2:"";s:3:"姄";s:2:"";s:3:"姅";s:2:"";s:3:"姆";s:2:"ķ";s:3:"姇";s:2:"";s:3:"姈";s:2:"";s:3:"姉";s:2:"";s:3:"姊";s:2:"";s:3:"始";s:2:"ʼ";s:3:"姌";s:2:"";s:3:"姍";s:2:"";s:3:"姎";s:2:"";s:3:"姏";s:2:"";s:3:"姐";s:2:"";s:3:"姑";s:2:"";s:3:"姒";s:2:"";s:3:"姓";s:2:"";s:3:"委";s:2:"ί";s:3:"姕";s:2:"";s:3:"姖";s:2:"";s:3:"姗";s:2:"";s:3:"姘";s:2:"";s:3:"姙";s:2:"";s:3:"姚";s:2:"Ҧ";s:3:"姛";s:2:"";s:3:"姜";s:2:"";s:3:"姝";s:2:"";s:3:"姞";s:2:"";s:3:"姟";s:2:"";s:3:"姠";s:2:"";s:3:"姡";s:2:"";s:3:"姢";s:2:"";s:3:"姣";s:2:"";s:3:"姤";s:2:"";s:3:"姥";s:2:"";s:3:"姦";s:2:"";s:3:"姧";s:2:"";s:3:"姨";s:2:"";s:3:"姩";s:2:"";s:3:"姪";s:2:"";s:3:"姫";s:2:"";s:3:"姬";s:2:"";s:3:"姭";s:2:"";s:3:"姮";s:2:"";s:3:"姯";s:2:"";s:3:"姰";s:2:"";s:3:"姱";s:2:"";s:3:"姲";s:2:"";s:3:"姳";s:2:"";s:3:"姴";s:2:"";s:3:"姵";s:2:"";s:3:"姶";s:2:"";s:3:"姷";s:2:"";s:3:"姸";s:2:"";s:3:"姹";s:2:"";s:3:"姺";s:2:"";s:3:"姻";s:2:"";s:3:"姼";s:2:"";s:3:"姽";s:2:"";s:3:"姾";s:2:"";s:3:"姿";s:2:"";s:3:"娀";s:2:"";s:3:"威";s:2:"";s:3:"娂";s:2:"";s:3:"娃";s:2:"";s:3:"娄";s:2:"¦";s:3:"娅";s:2:"";s:3:"娆";s:2:"";s:3:"娇";s:2:"";s:3:"娈";s:2:"";s:3:"娉";s:2:"";s:3:"娊";s:2:"";s:3:"娋";s:2:"";s:3:"娌";s:2:"";s:3:"娍";s:2:"";s:3:"娎";s:2:"";s:3:"娏";s:2:"";s:3:"娐";s:2:"";s:3:"娑";s:2:"";s:3:"娒";s:2:"";s:3:"娓";s:2:"";s:3:"娔";s:2:"";s:3:"娕";s:2:"";s:3:"娖";s:2:"";s:3:"娗";s:2:"";s:3:"娘";s:2:"";s:3:"娙";s:2:"";s:3:"娚";s:2:"";s:3:"娛";s:2:"";s:3:"娜";s:2:"";s:3:"娝";s:2:"";s:3:"娞";s:2:"";s:3:"娟";s:2:"";s:3:"娠";s:2:"";s:3:"娡";s:2:"";s:3:"娢";s:2:"";s:3:"娣";s:2:"";s:3:"娤";s:2:"";s:3:"娥";s:2:"";s:3:"娦";s:2:"";s:3:"娧";s:2:"";s:3:"娨";s:2:"";s:3:"娩";s:2:"";s:3:"娪";s:2:"";s:3:"娫";s:2:"";s:3:"娬";s:2:"";s:3:"娭";s:2:"";s:3:"娮";s:2:"";s:3:"娯";s:2:"";s:3:"娰";s:2:"";s:3:"娱";s:2:"";s:3:"娲";s:2:"";s:3:"娳";s:2:"";s:3:"娴";s:2:"";s:3:"娵";s:2:"";s:3:"娶";s:2:"Ȣ";s:3:"娷";s:2:"";s:3:"娸";s:2:"";s:3:"娹";s:2:"";s:3:"娺";s:2:"";s:3:"娻";s:2:"";s:3:"娼";s:2:"";s:3:"娽";s:2:"";s:3:"娾";s:2:"";s:3:"娿";s:2:"";s:3:"婀";s:2:"";s:3:"婁";s:2:"";s:3:"婂";s:2:"";s:3:"婃";s:2:"";s:3:"婄";s:2:"";s:3:"婅";s:2:"";s:3:"婆";s:2:"";s:3:"婇";s:2:"";s:3:"婈";s:2:"";s:3:"婉";s:2:"";s:3:"婊";s:2:"";s:3:"婋";s:2:"";s:3:"婌";s:2:"";s:3:"婍";s:2:"";s:3:"婎";s:2:"";s:3:"婏";s:2:"";s:3:"婐";s:2:"";s:3:"婑";s:2:"";s:3:"婒";s:2:"";s:3:"婓";s:2:"";s:3:"婔";s:2:"";s:3:"婕";s:2:"";s:3:"婖";s:2:"";s:3:"婗";s:2:"";s:3:"婘";s:2:"";s:3:"婙";s:2:"";s:3:"婚";s:2:"";s:3:"婛";s:2:"";s:3:"婜";s:2:"";s:3:"婝";s:2:"";s:3:"婞";s:2:"";s:3:"婟";s:2:"";s:3:"婠";s:2:"";s:3:"婡";s:2:"@";s:3:"婢";s:2:"";s:3:"婣";s:2:"A";s:3:"婤";s:2:"B";s:3:"婥";s:2:"C";s:3:"婦";s:2:"D";s:3:"婧";s:2:"";s:3:"婨";s:2:"E";s:3:"婩";s:2:"F";s:3:"婪";s:2:"";s:3:"婫";s:2:"G";s:3:"婬";s:2:"H";s:3:"婭";s:2:"I";s:3:"婮";s:2:"J";s:3:"婯";s:2:"K";s:3:"婰";s:2:"L";s:3:"婱";s:2:"M";s:3:"婲";s:2:"N";s:3:"婳";s:2:"O";s:3:"婴";s:2:"Ӥ";s:3:"婵";s:2:"";s:3:"婶";s:2:"";s:3:"婷";s:2:"";s:3:"婸";s:2:"P";s:3:"婹";s:2:"Q";s:3:"婺";s:2:"";s:3:"婻";s:2:"R";s:3:"婼";s:2:"S";s:3:"婽";s:2:"T";s:3:"婾";s:2:"U";s:3:"婿";s:2:"";s:3:"媀";s:2:"V";s:3:"媁";s:2:"W";s:3:"媂";s:2:"X";s:3:"媃";s:2:"Y";s:3:"媄";s:2:"Z";s:3:"媅";s:2:"[";s:3:"媆";s:2:"\";s:3:"媇";s:2:"]";s:3:"媈";s:2:"^";s:3:"媉";s:2:"_";s:3:"媊";s:2:"`";s:3:"媋";s:2:"a";s:3:"媌";s:2:"b";s:3:"媍";s:2:"c";s:3:"媎";s:2:"d";s:3:"媏";s:2:"e";s:3:"媐";s:2:"f";s:3:"媑";s:2:"g";s:3:"媒";s:2:"ý";s:3:"媓";s:2:"h";s:3:"媔";s:2:"i";s:3:"媕";s:2:"j";s:3:"媖";s:2:"k";s:3:"媗";s:2:"l";s:3:"媘";s:2:"m";s:3:"媙";s:2:"n";s:3:"媚";s:2:"";s:3:"媛";s:2:"";s:3:"媜";s:2:"o";s:3:"媝";s:2:"p";s:3:"媞";s:2:"q";s:3:"媟";s:2:"r";s:3:"媠";s:2:"s";s:3:"媡";s:2:"t";s:3:"媢";s:2:"u";s:3:"媣";s:2:"v";s:3:"媤";s:2:"w";s:3:"媥";s:2:"x";s:3:"媦";s:2:"y";s:3:"媧";s:2:"z";s:3:"媨";s:2:"{";s:3:"媩";s:2:"|";s:3:"媪";s:2:"";s:3:"媫";s:2:"}";s:3:"媬";s:2:"~";s:3:"媭";s:2:"";s:3:"媮";s:2:"";s:3:"媯";s:2:"";s:3:"媰";s:2:"";s:3:"媱";s:2:"";s:3:"媲";s:2:"";s:3:"媳";s:2:"ϱ";s:3:"媴";s:2:"";s:3:"媵";s:2:"";s:3:"媶";s:2:"";s:3:"媷";s:2:"";s:3:"媸";s:2:"";s:3:"媹";s:2:"";s:3:"媺";s:2:"";s:3:"媻";s:2:"";s:3:"媼";s:2:"";s:3:"媽";s:2:"";s:3:"媾";s:2:"";s:3:"媿";s:2:"";s:3:"嫀";s:2:"";s:3:"嫁";s:2:"";s:3:"嫂";s:2:"ɩ";s:3:"嫃";s:2:"";s:3:"嫄";s:2:"";s:3:"嫅";s:2:"";s:3:"嫆";s:2:"";s:3:"嫇";s:2:"";s:3:"嫈";s:2:"";s:3:"嫉";s:2:"";s:3:"嫊";s:2:"";s:3:"嫋";s:2:"";s:3:"嫌";s:2:"";s:3:"嫍";s:2:"";s:3:"嫎";s:2:"";s:3:"嫏";s:2:"";s:3:"嫐";s:2:"";s:3:"嫑";s:2:"";s:3:"嫒";s:2:"";s:3:"嫓";s:2:"";s:3:"嫔";s:2:"";s:3:"嫕";s:2:"";s:3:"嫖";s:2:"";s:3:"嫗";s:2:"";s:3:"嫘";s:2:"";s:3:"嫙";s:2:"";s:3:"嫚";s:2:"";s:3:"嫛";s:2:"";s:3:"嫜";s:2:"";s:3:"嫝";s:2:"";s:3:"嫞";s:2:"";s:3:"嫟";s:2:"";s:3:"嫠";s:2:"";s:3:"嫡";s:2:"";s:3:"嫢";s:2:"";s:3:"嫣";s:2:"";s:3:"嫤";s:2:"";s:3:"嫥";s:2:"";s:3:"嫦";s:2:"";s:3:"嫧";s:2:"";s:3:"嫨";s:2:"";s:3:"嫩";s:2:"";s:3:"嫪";s:2:"";s:3:"嫫";s:2:"";s:3:"嫬";s:2:"";s:3:"嫭";s:2:"";s:3:"嫮";s:2:"";s:3:"嫯";s:2:"";s:3:"嫰";s:2:"";s:3:"嫱";s:2:"";s:3:"嫲";s:2:"";s:3:"嫳";s:2:"";s:3:"嫴";s:2:"";s:3:"嫵";s:2:"";s:3:"嫶";s:2:"";s:3:"嫷";s:2:"";s:3:"嫸";s:2:"";s:3:"嫹";s:2:"";s:3:"嫺";s:2:"";s:3:"嫻";s:2:"";s:3:"嫼";s:2:"";s:3:"嫽";s:2:"";s:3:"嫾";s:2:"";s:3:"嫿";s:2:"";s:3:"嬀";s:2:"";s:3:"嬁";s:2:"";s:3:"嬂";s:2:"";s:3:"嬃";s:2:"";s:3:"嬄";s:2:"";s:3:"嬅";s:2:"";s:3:"嬆";s:2:"";s:3:"嬇";s:2:"";s:3:"嬈";s:2:"";s:3:"嬉";s:2:"";s:3:"嬊";s:2:"";s:3:"嬋";s:2:"";s:3:"嬌";s:2:"";s:3:"嬍";s:2:"";s:3:"嬎";s:2:"";s:3:"嬏";s:2:"";s:3:"嬐";s:2:"";s:3:"嬑";s:2:"";s:3:"嬒";s:2:"";s:3:"嬓";s:2:"";s:3:"嬔";s:2:"";s:3:"嬕";s:2:"";s:3:"嬖";s:2:"";s:3:"嬗";s:2:"";s:3:"嬘";s:2:"";s:3:"嬙";s:2:"";s:3:"嬚";s:2:"";s:3:"嬛";s:2:"";s:3:"嬜";s:2:"";s:3:"嬝";s:2:"";s:3:"嬞";s:2:"";s:3:"嬟";s:2:"";s:3:"嬠";s:2:"";s:3:"嬡";s:2:"";s:3:"嬢";s:2:"";s:3:"嬣";s:2:"";s:3:"嬤";s:2:"";s:3:"嬥";s:2:"";s:3:"嬦";s:2:"";s:3:"嬧";s:2:"";s:3:"嬨";s:2:"";s:3:"嬩";s:2:"";s:3:"嬪";s:2:"";s:3:"嬫";s:2:"";s:3:"嬬";s:2:"";s:3:"嬭";s:2:"";s:3:"嬮";s:2:"";s:3:"嬯";s:2:"";s:3:"嬰";s:2:"";s:3:"嬱";s:2:"";s:3:"嬲";s:2:"";s:3:"嬳";s:2:"";s:3:"嬴";s:2:"";s:3:"嬵";s:2:"";s:3:"嬶";s:2:"";s:3:"嬷";s:2:"";s:3:"嬸";s:2:"";s:3:"嬹";s:2:"";s:3:"嬺";s:2:"";s:3:"嬻";s:2:"";s:3:"嬼";s:2:"";s:3:"嬽";s:2:"";s:3:"嬾";s:2:"";s:3:"嬿";s:2:"";s:3:"孀";s:2:"";s:3:"孁";s:2:"";s:3:"孂";s:2:"";s:3:"孃";s:2:"";s:3:"孄";s:2:"";s:3:"孅";s:2:"";s:3:"孆";s:2:"";s:3:"孇";s:2:"";s:3:"孈";s:2:"@";s:3:"孉";s:2:"A";s:3:"孊";s:2:"B";s:3:"孋";s:2:"C";s:3:"孌";s:2:"D";s:3:"孍";s:2:"E";s:3:"孎";s:2:"F";s:3:"孏";s:2:"G";s:3:"子";s:2:"";s:3:"孑";s:2:"";s:3:"孒";s:2:"H";s:3:"孓";s:2:"";s:3:"孔";s:2:"";s:3:"孕";s:2:"";s:3:"孖";s:2:"I";s:3:"字";s:2:"";s:3:"存";s:2:"";s:3:"孙";s:2:"";s:3:"孚";s:2:"";s:3:"孛";s:2:"";s:3:"孜";s:2:"";s:3:"孝";s:2:"Т";s:3:"孞";s:2:"J";s:3:"孟";s:2:"";s:3:"孠";s:2:"K";s:3:"孡";s:2:"L";s:3:"孢";s:2:"";s:3:"季";s:2:"";s:3:"孤";s:2:"";s:3:"孥";s:2:"";s:3:"学";s:2:"ѧ";s:3:"孧";s:2:"M";s:3:"孨";s:2:"N";s:3:"孩";s:2:"";s:3:"孪";s:2:"";s:3:"孫";s:2:"O";s:3:"孬";s:2:"ث";s:3:"孭";s:2:"P";s:3:"孮";s:2:"Q";s:3:"孯";s:2:"R";s:3:"孰";s:2:"";s:3:"孱";s:2:"";s:3:"孲";s:2:"S";s:3:"孳";s:2:"";s:3:"孴";s:2:"T";s:3:"孵";s:2:"";s:3:"孶";s:2:"U";s:3:"孷";s:2:"V";s:3:"學";s:2:"W";s:3:"孹";s:2:"X";s:3:"孺";s:2:"";s:3:"孻";s:2:"Y";s:3:"孼";s:2:"Z";s:3:"孽";s:2:"";s:3:"孾";s:2:"[";s:3:"孿";s:2:"\";s:3:"宀";s:2:"";s:3:"宁";s:2:"";s:3:"宂";s:2:"]";s:3:"它";s:2:"";s:3:"宄";s:2:"";s:3:"宅";s:2:"լ";s:3:"宆";s:2:"^";s:3:"宇";s:2:"";s:3:"守";s:2:"";s:3:"安";s:2:"";s:3:"宊";s:2:"_";s:3:"宋";s:2:"";s:3:"完";s:2:"";s:3:"宍";s:2:"`";s:3:"宎";s:2:"a";s:3:"宏";s:2:"";s:3:"宐";s:2:"b";s:3:"宑";s:2:"c";s:3:"宒";s:2:"d";s:3:"宓";s:2:"";s:3:"宔";s:2:"e";s:3:"宕";s:2:"";s:3:"宖";s:2:"f";s:3:"宗";s:2:"";s:3:"官";s:2:"";s:3:"宙";s:2:"";s:3:"定";s:2:"";s:3:"宛";s:2:"";s:3:"宜";s:2:"";s:3:"宝";s:2:"";s:3:"实";s:2:"ʵ";s:3:"実";s:2:"g";s:3:"宠";s:2:"";s:3:"审";s:2:"";s:3:"客";s:2:"";s:3:"宣";s:2:"";s:3:"室";s:2:"";s:3:"宥";s:2:"";s:3:"宦";s:2:"";s:3:"宧";s:2:"h";s:3:"宨";s:2:"i";s:3:"宩";s:2:"j";s:3:"宪";s:2:"";s:3:"宫";s:2:"";s:3:"宬";s:2:"k";s:3:"宭";s:2:"l";s:3:"宮";s:2:"m";s:3:"宯";s:2:"n";s:3:"宰";s:2:"";s:3:"宱";s:2:"o";s:3:"宲";s:2:"p";s:3:"害";s:2:"";s:3:"宴";s:2:"";s:3:"宵";s:2:"";s:3:"家";s:2:"";s:3:"宷";s:2:"q";s:3:"宸";s:2:"";s:3:"容";s:2:"";s:3:"宺";s:2:"r";s:3:"宻";s:2:"s";s:3:"宼";s:2:"t";s:3:"宽";s:2:"";s:3:"宾";s:2:"";s:3:"宿";s:2:"";s:3:"寀";s:2:"u";s:3:"寁";s:2:"v";s:3:"寂";s:2:"";s:3:"寃";s:2:"w";s:3:"寄";s:2:"";s:3:"寅";s:2:"";s:3:"密";s:2:"";s:3:"寇";s:2:"";s:3:"寈";s:2:"x";s:3:"寉";s:2:"y";s:3:"寊";s:2:"z";s:3:"寋";s:2:"{";s:3:"富";s:2:"";s:3:"寍";s:2:"|";s:3:"寎";s:2:"}";s:3:"寏";s:2:"~";s:3:"寐";s:2:"";s:3:"寑";s:2:"";s:3:"寒";s:2:"";s:3:"寓";s:2:"Ԣ";s:3:"寔";s:2:"";s:3:"寕";s:2:"";s:3:"寖";s:2:"";s:3:"寗";s:2:"";s:3:"寘";s:2:"";s:3:"寙";s:2:"";s:3:"寚";s:2:"";s:3:"寛";s:2:"";s:3:"寜";s:2:"";s:3:"寝";s:2:"";s:3:"寞";s:2:"į";s:3:"察";s:2:"";s:3:"寠";s:2:"";s:3:"寡";s:2:"";s:3:"寢";s:2:"";s:3:"寣";s:2:"";s:3:"寤";s:2:"";s:3:"寥";s:2:"";s:3:"實";s:2:"";s:3:"寧";s:2:"";s:3:"寨";s:2:"կ";s:3:"審";s:2:"";s:3:"寪";s:2:"";s:3:"寫";s:2:"";s:3:"寬";s:2:"";s:3:"寭";s:2:"";s:3:"寮";s:2:"";s:3:"寯";s:2:"";s:3:"寰";s:2:"";s:3:"寱";s:2:"";s:3:"寲";s:2:"";s:3:"寳";s:2:"";s:3:"寴";s:2:"";s:3:"寵";s:2:"";s:3:"寶";s:2:"";s:3:"寷";s:2:"";s:3:"寸";s:2:"";s:3:"对";s:2:"";s:3:"寺";s:2:"";s:3:"寻";s:2:"Ѱ";s:3:"导";s:2:"";s:3:"寽";s:2:"";s:3:"対";s:2:"";s:3:"寿";s:2:"";s:3:"尀";s:2:"";s:3:"封";s:2:"";s:3:"専";s:2:"";s:3:"尃";s:2:"";s:3:"射";s:2:"";s:3:"尅";s:2:"";s:3:"将";s:2:"";s:3:"將";s:2:"";s:3:"專";s:2:"";s:3:"尉";s:2:"ξ";s:3:"尊";s:2:"";s:3:"尋";s:2:"";s:3:"尌";s:2:"";s:3:"對";s:2:"";s:3:"導";s:2:"";s:3:"小";s:2:"С";s:3:"尐";s:2:"";s:3:"少";s:2:"";s:3:"尒";s:2:"";s:3:"尓";s:2:"";s:3:"尔";s:2:"";s:3:"尕";s:2:"";s:3:"尖";s:2:"";s:3:"尗";s:2:"";s:3:"尘";s:2:"";s:3:"尙";s:2:"";s:3:"尚";s:2:"";s:3:"尛";s:2:"";s:3:"尜";s:2:"";s:3:"尝";s:2:"";s:3:"尞";s:2:"";s:3:"尟";s:2:"";s:3:"尠";s:2:"";s:3:"尡";s:2:"";s:3:"尢";s:2:"";s:3:"尣";s:2:"";s:3:"尤";s:2:"";s:3:"尥";s:2:"";s:3:"尦";s:2:"";s:3:"尧";s:2:"Ң";s:3:"尨";s:2:"";s:3:"尩";s:2:"";s:3:"尪";s:2:"";s:3:"尫";s:2:"";s:3:"尬";s:2:"";s:3:"尭";s:2:"";s:3:"尮";s:2:"";s:3:"尯";s:2:"";s:3:"尰";s:2:"";s:3:"就";s:2:"";s:3:"尲";s:2:"";s:3:"尳";s:2:"";s:3:"尴";s:2:"";s:3:"尵";s:2:"";s:3:"尶";s:2:"";s:3:"尷";s:2:"";s:3:"尸";s:2:"ʬ";s:3:"尹";s:2:"";s:3:"尺";s:2:"";s:3:"尻";s:2:"";s:3:"尼";s:2:"";s:3:"尽";s:2:"";s:3:"尾";s:2:"β";s:3:"尿";s:2:"";s:3:"局";s:2:"";s:3:"屁";s:2:"ƨ";s:3:"层";s:2:"";s:3:"屃";s:2:"";s:3:"屄";s:2:"";s:3:"居";s:2:"";s:3:"屆";s:2:"";s:3:"屇";s:2:"";s:3:"屈";s:2:"";s:3:"屉";s:2:"";s:3:"届";s:2:"";s:3:"屋";s:2:"";s:3:"屌";s:2:"";s:3:"屍";s:2:"";s:3:"屎";s:2:"ʺ";s:3:"屏";s:2:"";s:3:"屐";s:2:"";s:3:"屑";s:2:"м";s:3:"屒";s:2:"";s:3:"屓";s:2:"";s:3:"屔";s:2:"";s:3:"展";s:2:"չ";s:3:"屖";s:2:"";s:3:"屗";s:2:"";s:3:"屘";s:2:"";s:3:"屙";s:2:"";s:3:"屚";s:2:"";s:3:"屛";s:2:"";s:3:"屜";s:2:"";s:3:"屝";s:2:"";s:3:"属";s:2:"";s:3:"屟";s:2:"";s:3:"屠";s:2:"";s:3:"屡";s:2:"";s:3:"屢";s:2:"";s:3:"屣";s:2:"";s:3:"層";s:2:"";s:3:"履";s:2:"";s:3:"屦";s:2:"";s:3:"屧";s:2:"";s:3:"屨";s:2:"";s:3:"屩";s:2:"";s:3:"屪";s:2:"";s:3:"屫";s:2:"";s:3:"屬";s:2:"";s:3:"屭";s:2:"";s:3:"屮";s:2:"";s:3:"屯";s:2:"";s:3:"屰";s:2:"";s:3:"山";s:2:"ɽ";s:3:"屲";s:2:"";s:3:"屳";s:2:"";s:3:"屴";s:2:"";s:3:"屵";s:2:"";s:3:"屶";s:2:"";s:3:"屷";s:2:"";s:3:"屸";s:2:"";s:3:"屹";s:2:"";s:3:"屺";s:2:"";s:3:"屻";s:2:"";s:3:"屼";s:2:"";s:3:"屽";s:2:"";s:3:"屾";s:2:"";s:3:"屿";s:2:"";s:3:"岀";s:2:"";s:3:"岁";s:2:"";s:3:"岂";s:2:"";s:3:"岃";s:2:"";s:3:"岄";s:2:"";s:3:"岅";s:2:"";s:3:"岆";s:2:"";s:3:"岇";s:2:"";s:3:"岈";s:2:"";s:3:"岉";s:2:"";s:3:"岊";s:2:"";s:3:"岋";s:2:"";s:3:"岌";s:2:"";s:3:"岍";s:2:"";s:3:"岎";s:2:"";s:3:"岏";s:2:"";s:3:"岐";s:2:"";s:3:"岑";s:2:"";s:3:"岒";s:2:"";s:3:"岓";s:2:"";s:3:"岔";s:2:"";s:3:"岕";s:2:"";s:3:"岖";s:2:"";s:3:"岗";s:2:"";s:3:"岘";s:2:"";s:3:"岙";s:2:"";s:3:"岚";s:2:"";s:3:"岛";s:2:"";s:3:"岜";s:2:"";s:3:"岝";s:2:"";s:3:"岞";s:2:"";s:3:"岟";s:2:"";s:3:"岠";s:2:"";s:3:"岡";s:2:"";s:3:"岢";s:2:"";s:3:"岣";s:2:"";s:3:"岤";s:2:"";s:3:"岥";s:2:"";s:3:"岦";s:2:"";s:3:"岧";s:2:"";s:3:"岨";s:2:"";s:3:"岩";s:2:"";s:3:"岪";s:2:"@";s:3:"岫";s:2:"";s:3:"岬";s:2:"";s:3:"岭";s:2:"";s:3:"岮";s:2:"A";s:3:"岯";s:2:"B";s:3:"岰";s:2:"C";s:3:"岱";s:2:"";s:3:"岲";s:2:"D";s:3:"岳";s:2:"";s:3:"岴";s:2:"E";s:3:"岵";s:2:"";s:3:"岶";s:2:"F";s:3:"岷";s:2:"";s:3:"岸";s:2:"";s:3:"岹";s:2:"G";s:3:"岺";s:2:"H";s:3:"岻";s:2:"I";s:3:"岼";s:2:"J";s:3:"岽";s:2:"";s:3:"岾";s:2:"K";s:3:"岿";s:2:"";s:3:"峀";s:2:"L";s:3:"峁";s:2:"";s:3:"峂";s:2:"M";s:3:"峃";s:2:"N";s:3:"峄";s:2:"";s:3:"峅";s:2:"O";s:3:"峆";s:2:"P";s:3:"峇";s:2:"Q";s:3:"峈";s:2:"R";s:3:"峉";s:2:"S";s:3:"峊";s:2:"T";s:3:"峋";s:2:"";s:3:"峌";s:2:"U";s:3:"峍";s:2:"V";s:3:"峎";s:2:"W";s:3:"峏";s:2:"X";s:3:"峐";s:2:"Y";s:3:"峑";s:2:"Z";s:3:"峒";s:2:"";s:3:"峓";s:2:"[";s:3:"峔";s:2:"\";s:3:"峕";s:2:"]";s:3:"峖";s:2:"^";s:3:"峗";s:2:"_";s:3:"峘";s:2:"`";s:3:"峙";s:2:"";s:3:"峚";s:2:"a";s:3:"峛";s:2:"b";s:3:"峜";s:2:"c";s:3:"峝";s:2:"d";s:3:"峞";s:2:"e";s:3:"峟";s:2:"f";s:3:"峠";s:2:"g";s:3:"峡";s:2:"Ͽ";s:3:"峢";s:2:"h";s:3:"峣";s:2:"i";s:3:"峤";s:2:"";s:3:"峥";s:2:"";s:3:"峦";s:2:"";s:3:"峧";s:2:"j";s:3:"峨";s:2:"";s:3:"峩";s:2:"k";s:3:"峪";s:2:"";s:3:"峫";s:2:"l";s:3:"峬";s:2:"m";s:3:"峭";s:2:"";s:3:"峮";s:2:"n";s:3:"峯";s:2:"o";s:3:"峰";s:2:"";s:3:"峱";s:2:"p";s:3:"峲";s:2:"q";s:3:"峳";s:2:"r";s:3:"峴";s:2:"s";s:3:"峵";s:2:"t";s:3:"島";s:2:"u";s:3:"峷";s:2:"v";s:3:"峸";s:2:"w";s:3:"峹";s:2:"x";s:3:"峺";s:2:"y";s:3:"峻";s:2:"";s:3:"峼";s:2:"z";s:3:"峽";s:2:"{";s:3:"峾";s:2:"|";s:3:"峿";s:2:"}";s:3:"崀";s:2:"~";s:3:"崁";s:2:"";s:3:"崂";s:2:"";s:3:"崃";s:2:"";s:3:"崄";s:2:"";s:3:"崅";s:2:"";s:3:"崆";s:2:"";s:3:"崇";s:2:"";s:3:"崈";s:2:"";s:3:"崉";s:2:"";s:3:"崊";s:2:"";s:3:"崋";s:2:"";s:3:"崌";s:2:"";s:3:"崍";s:2:"";s:3:"崎";s:2:"";s:3:"崏";s:2:"";s:3:"崐";s:2:"";s:3:"崑";s:2:"";s:3:"崒";s:2:"";s:3:"崓";s:2:"";s:3:"崔";s:2:"";s:3:"崕";s:2:"";s:3:"崖";s:2:"";s:3:"崗";s:2:"";s:3:"崘";s:2:"";s:3:"崙";s:2:"";s:3:"崚";s:2:"";s:3:"崛";s:2:"";s:3:"崜";s:2:"";s:3:"崝";s:2:"";s:3:"崞";s:2:"";s:3:"崟";s:2:"";s:3:"崠";s:2:"";s:3:"崡";s:2:"";s:3:"崢";s:2:"";s:3:"崣";s:2:"";s:3:"崤";s:2:"";s:3:"崥";s:2:"";s:3:"崦";s:2:"";s:3:"崧";s:2:"";s:3:"崨";s:2:"";s:3:"崩";s:2:"";s:3:"崪";s:2:"";s:3:"崫";s:2:"";s:3:"崬";s:2:"";s:3:"崭";s:2:"ո";s:3:"崮";s:2:"";s:3:"崯";s:2:"";s:3:"崰";s:2:"";s:3:"崱";s:2:"";s:3:"崲";s:2:"";s:3:"崳";s:2:"";s:3:"崴";s:2:"";s:3:"崵";s:2:"";s:3:"崶";s:2:"";s:3:"崷";s:2:"";s:3:"崸";s:2:"";s:3:"崹";s:2:"";s:3:"崺";s:2:"";s:3:"崻";s:2:"";s:3:"崼";s:2:"";s:3:"崽";s:2:"";s:3:"崾";s:2:"";s:3:"崿";s:2:"";s:3:"嵀";s:2:"";s:3:"嵁";s:2:"";s:3:"嵂";s:2:"";s:3:"嵃";s:2:"";s:3:"嵄";s:2:"";s:3:"嵅";s:2:"";s:3:"嵆";s:2:"";s:3:"嵇";s:2:"";s:3:"嵈";s:2:"";s:3:"嵉";s:2:"";s:3:"嵊";s:2:"";s:3:"嵋";s:2:"";s:3:"嵌";s:2:"Ƕ";s:3:"嵍";s:2:"";s:3:"嵎";s:2:"";s:3:"嵏";s:2:"";s:3:"嵐";s:2:"";s:3:"嵑";s:2:"";s:3:"嵒";s:2:"";s:3:"嵓";s:2:"";s:3:"嵔";s:2:"";s:3:"嵕";s:2:"";s:3:"嵖";s:2:"";s:3:"嵗";s:2:"";s:3:"嵘";s:2:"";s:3:"嵙";s:2:"";s:3:"嵚";s:2:"";s:3:"嵛";s:2:"";s:3:"嵜";s:2:"";s:3:"嵝";s:2:"";s:3:"嵞";s:2:"";s:3:"嵟";s:2:"";s:3:"嵠";s:2:"";s:3:"嵡";s:2:"";s:3:"嵢";s:2:"";s:3:"嵣";s:2:"";s:3:"嵤";s:2:"";s:3:"嵥";s:2:"";s:3:"嵦";s:2:"";s:3:"嵧";s:2:"";s:3:"嵨";s:2:"";s:3:"嵩";s:2:"";s:3:"嵪";s:2:"";s:3:"嵫";s:2:"";s:3:"嵬";s:2:"";s:3:"嵭";s:2:"";s:3:"嵮";s:2:"";s:3:"嵯";s:2:"";s:3:"嵰";s:2:"";s:3:"嵱";s:2:"";s:3:"嵲";s:2:"";s:3:"嵳";s:2:"";s:3:"嵴";s:2:"";s:3:"嵵";s:2:"";s:3:"嵶";s:2:"";s:3:"嵷";s:2:"";s:3:"嵸";s:2:"";s:3:"嵹";s:2:"";s:3:"嵺";s:2:"";s:3:"嵻";s:2:"";s:3:"嵼";s:2:"";s:3:"嵽";s:2:"";s:3:"嵾";s:2:"";s:3:"嵿";s:2:"";s:3:"嶀";s:2:"";s:3:"嶁";s:2:"";s:3:"嶂";s:2:"";s:3:"嶃";s:2:"";s:3:"嶄";s:2:"";s:3:"嶅";s:2:"";s:3:"嶆";s:2:"";s:3:"嶇";s:2:"";s:3:"嶈";s:2:"";s:3:"嶉";s:2:"";s:3:"嶊";s:2:"";s:3:"嶋";s:2:"";s:3:"嶌";s:2:"";s:3:"嶍";s:2:"";s:3:"嶎";s:2:"";s:3:"嶏";s:2:"";s:3:"嶐";s:2:"";s:3:"嶑";s:2:"";s:3:"嶒";s:2:"";s:3:"嶓";s:2:"";s:3:"嶔";s:2:"";s:3:"嶕";s:2:"";s:3:"嶖";s:2:"";s:3:"嶗";s:2:"";s:3:"嶘";s:2:"";s:3:"嶙";s:2:"";s:3:"嶚";s:2:"";s:3:"嶛";s:2:"";s:3:"嶜";s:2:"";s:3:"嶝";s:2:"";s:3:"嶞";s:2:"";s:3:"嶟";s:2:"";s:3:"嶠";s:2:"";s:3:"嶡";s:2:"@";s:3:"嶢";s:2:"A";s:3:"嶣";s:2:"B";s:3:"嶤";s:2:"C";s:3:"嶥";s:2:"D";s:3:"嶦";s:2:"E";s:3:"嶧";s:2:"F";s:3:"嶨";s:2:"G";s:3:"嶩";s:2:"H";s:3:"嶪";s:2:"I";s:3:"嶫";s:2:"J";s:3:"嶬";s:2:"K";s:3:"嶭";s:2:"L";s:3:"嶮";s:2:"M";s:3:"嶯";s:2:"N";s:3:"嶰";s:2:"O";s:3:"嶱";s:2:"P";s:3:"嶲";s:2:"Q";s:3:"嶳";s:2:"R";s:3:"嶴";s:2:"S";s:3:"嶵";s:2:"T";s:3:"嶶";s:2:"U";s:3:"嶷";s:2:"";s:3:"嶸";s:2:"V";s:3:"嶹";s:2:"W";s:3:"嶺";s:2:"X";s:3:"嶻";s:2:"Y";s:3:"嶼";s:2:"Z";s:3:"嶽";s:2:"[";s:3:"嶾";s:2:"\";s:3:"嶿";s:2:"]";s:3:"巀";s:2:"^";s:3:"巁";s:2:"_";s:3:"巂";s:2:"`";s:3:"巃";s:2:"a";s:3:"巄";s:2:"b";s:3:"巅";s:2:"";s:3:"巆";s:2:"c";s:3:"巇";s:2:"d";s:3:"巈";s:2:"e";s:3:"巉";s:2:"f";s:3:"巊";s:2:"g";s:3:"巋";s:2:"h";s:3:"巌";s:2:"i";s:3:"巍";s:2:"Ρ";s:3:"巎";s:2:"j";s:3:"巏";s:2:"k";s:3:"巐";s:2:"l";s:3:"巑";s:2:"m";s:3:"巒";s:2:"n";s:3:"巓";s:2:"o";s:3:"巔";s:2:"p";s:3:"巕";s:2:"q";s:3:"巖";s:2:"r";s:3:"巗";s:2:"s";s:3:"巘";s:2:"t";s:3:"巙";s:2:"u";s:3:"巚";s:2:"v";s:3:"巛";s:2:"";s:3:"巜";s:2:"w";s:3:"川";s:2:"";s:3:"州";s:2:"";s:3:"巟";s:2:"x";s:3:"巠";s:2:"y";s:3:"巡";s:2:"Ѳ";s:3:"巢";s:2:"";s:3:"巣";s:2:"z";s:3:"巤";s:2:"{";s:3:"工";s:2:"";s:3:"左";s:2:"";s:3:"巧";s:2:"";s:3:"巨";s:2:"";s:3:"巩";s:2:"";s:3:"巪";s:2:"|";s:3:"巫";s:2:"";s:3:"巬";s:2:"}";s:3:"巭";s:2:"~";s:3:"差";s:2:"";s:3:"巯";s:2:"";s:3:"巰";s:2:"";s:3:"己";s:2:"";s:3:"已";s:2:"";s:3:"巳";s:2:"";s:3:"巴";s:2:"";s:3:"巵";s:2:"";s:3:"巶";s:2:"";s:3:"巷";s:2:"";s:3:"巸";s:2:"";s:3:"巹";s:2:"";s:3:"巺";s:2:"";s:3:"巻";s:2:"";s:3:"巼";s:2:"";s:3:"巽";s:2:"";s:3:"巾";s:2:"";s:3:"巿";s:2:"";s:3:"帀";s:2:"";s:3:"币";s:2:"";s:3:"市";s:2:"";s:3:"布";s:2:"";s:3:"帄";s:2:"";s:3:"帅";s:2:"˧";s:3:"帆";s:2:"";s:3:"帇";s:2:"";s:3:"师";s:2:"ʦ";s:3:"帉";s:2:"";s:3:"帊";s:2:"";s:3:"帋";s:2:"";s:3:"希";s:2:"ϣ";s:3:"帍";s:2:"";s:3:"帎";s:2:"";s:3:"帏";s:2:"";s:3:"帐";s:2:"";s:3:"帑";s:2:"";s:3:"帒";s:2:"";s:3:"帓";s:2:"";s:3:"帔";s:2:"";s:3:"帕";s:2:"";s:3:"帖";s:2:"";s:3:"帗";s:2:"";s:3:"帘";s:2:"";s:3:"帙";s:2:"";s:3:"帚";s:2:"";s:3:"帛";s:2:"";s:3:"帜";s:2:"";s:3:"帝";s:2:"";s:3:"帞";s:2:"";s:3:"帟";s:2:"";s:3:"帠";s:2:"";s:3:"帡";s:2:"";s:3:"帢";s:2:"";s:3:"帣";s:2:"";s:3:"帤";s:2:"";s:3:"帥";s:2:"";s:3:"带";s:2:"";s:3:"帧";s:2:"֡";s:3:"帨";s:2:"";s:3:"帩";s:2:"";s:3:"帪";s:2:"";s:3:"師";s:2:"";s:3:"帬";s:2:"";s:3:"席";s:2:"ϯ";s:3:"帮";s:2:"";s:3:"帯";s:2:"";s:3:"帰";s:2:"";s:3:"帱";s:2:"";s:3:"帲";s:2:"";s:3:"帳";s:2:"";s:3:"帴";s:2:"";s:3:"帵";s:2:"";s:3:"帶";s:2:"";s:3:"帷";s:2:"";s:3:"常";s:2:"";s:3:"帹";s:2:"";s:3:"帺";s:2:"";s:3:"帻";s:2:"";s:3:"帼";s:2:"";s:3:"帽";s:2:"ñ";s:3:"帾";s:2:"";s:3:"帿";s:2:"";s:3:"幀";s:2:"";s:3:"幁";s:2:"";s:3:"幂";s:2:"";s:3:"幃";s:2:"";s:3:"幄";s:2:"";s:3:"幅";s:2:"";s:3:"幆";s:2:"";s:3:"幇";s:2:"";s:3:"幈";s:2:"";s:3:"幉";s:2:"";s:3:"幊";s:2:"";s:3:"幋";s:2:"";s:3:"幌";s:2:"";s:3:"幍";s:2:"";s:3:"幎";s:2:"";s:3:"幏";s:2:"";s:3:"幐";s:2:"";s:3:"幑";s:2:"";s:3:"幒";s:2:"";s:3:"幓";s:2:"";s:3:"幔";s:2:"";s:3:"幕";s:2:"Ļ";s:3:"幖";s:2:"";s:3:"幗";s:2:"";s:3:"幘";s:2:"";s:3:"幙";s:2:"";s:3:"幚";s:2:"";s:3:"幛";s:2:"";s:3:"幜";s:2:"";s:3:"幝";s:2:"";s:3:"幞";s:2:"";s:3:"幟";s:2:"";s:3:"幠";s:2:"";s:3:"幡";s:2:"";s:3:"幢";s:2:"";s:3:"幣";s:2:"";s:3:"幤";s:2:"";s:3:"幥";s:2:"";s:3:"幦";s:2:"";s:3:"幧";s:2:"";s:3:"幨";s:2:"";s:3:"幩";s:2:"";s:3:"幪";s:2:"";s:3:"幫";s:2:"";s:3:"幬";s:2:"";s:3:"幭";s:2:"";s:3:"幮";s:2:"";s:3:"幯";s:2:"";s:3:"幰";s:2:"";s:3:"幱";s:2:"";s:3:"干";s:2:"";s:3:"平";s:2:"ƽ";s:3:"年";s:2:"";s:3:"幵";s:2:"";s:3:"并";s:2:"";s:3:"幷";s:2:"";s:3:"幸";s:2:"";s:3:"幹";s:2:"";s:3:"幺";s:2:"";s:3:"幻";s:2:"";s:3:"幼";s:2:"";s:3:"幽";s:2:"";s:3:"幾";s:2:"";s:3:"广";s:2:"";s:3:"庀";s:2:"";s:3:"庁";s:2:"";s:3:"庂";s:2:"";s:3:"広";s:2:"";s:3:"庄";s:2:"ׯ";s:3:"庅";s:2:"";s:3:"庆";s:2:"";s:3:"庇";s:2:"";s:3:"庈";s:2:"";s:3:"庉";s:2:"";s:3:"床";s:2:"";s:3:"庋";s:2:"";s:3:"庌";s:2:"";s:3:"庍";s:2:"";s:3:"庎";s:2:"";s:3:"序";s:2:"";s:3:"庐";s:2:"®";s:3:"庑";s:2:"";s:3:"庒";s:2:"";s:3:"库";s:2:"";s:3:"应";s:2:"Ӧ";s:3:"底";s:2:"";s:3:"庖";s:2:"";s:3:"店";s:2:"";s:3:"庘";s:2:"";s:3:"庙";s:2:"";s:3:"庚";s:2:"";s:3:"庛";s:2:"";s:3:"府";s:2:"";s:3:"庝";s:2:"";s:3:"庞";s:2:"";s:3:"废";s:2:"";s:3:"庠";s:2:"";s:3:"庡";s:2:"";s:3:"庢";s:2:"";s:3:"庣";s:2:"";s:3:"庤";s:2:"";s:3:"庥";s:2:"";s:3:"度";s:2:"";s:3:"座";s:2:"";s:3:"庨";s:2:"";s:3:"庩";s:2:"";s:3:"庪";s:2:"";s:3:"庫";s:2:"";s:3:"庬";s:2:"";s:3:"庭";s:2:"ͥ";s:3:"庮";s:2:"";s:3:"庯";s:2:"";s:3:"庰";s:2:"";s:3:"庱";s:2:"";s:3:"庲";s:2:"";s:3:"庳";s:2:"";s:3:"庴";s:2:"";s:3:"庵";s:2:"";s:3:"庶";s:2:"";s:3:"康";s:2:"";s:3:"庸";s:2:"ӹ";s:3:"庹";s:2:"";s:3:"庺";s:2:"";s:3:"庻";s:2:"";s:3:"庼";s:2:"";s:3:"庽";s:2:"";s:3:"庾";s:2:"";s:3:"庿";s:2:"";s:3:"廀";s:2:"";s:3:"廁";s:2:"";s:3:"廂";s:2:"";s:3:"廃";s:2:"";s:3:"廄";s:2:"";s:3:"廅";s:2:"";s:3:"廆";s:2:"@";s:3:"廇";s:2:"A";s:3:"廈";s:2:"B";s:3:"廉";s:2:"";s:3:"廊";s:2:"";s:3:"廋";s:2:"C";s:3:"廌";s:2:"D";s:3:"廍";s:2:"E";s:3:"廎";s:2:"F";s:3:"廏";s:2:"G";s:3:"廐";s:2:"H";s:3:"廑";s:2:"";s:3:"廒";s:2:"";s:3:"廓";s:2:"";s:3:"廔";s:2:"I";s:3:"廕";s:2:"J";s:3:"廖";s:2:"";s:3:"廗";s:2:"K";s:3:"廘";s:2:"L";s:3:"廙";s:2:"M";s:3:"廚";s:2:"N";s:3:"廛";s:2:"";s:3:"廜";s:2:"O";s:3:"廝";s:2:"P";s:3:"廞";s:2:"Q";s:3:"廟";s:2:"R";s:3:"廠";s:2:"S";s:3:"廡";s:2:"T";s:3:"廢";s:2:"U";s:3:"廣";s:2:"V";s:3:"廤";s:2:"W";s:3:"廥";s:2:"X";s:3:"廦";s:2:"Y";s:3:"廧";s:2:"Z";s:3:"廨";s:2:"";s:3:"廩";s:2:"[";s:3:"廪";s:2:"";s:3:"廫";s:2:"\";s:3:"廬";s:2:"]";s:3:"廭";s:2:"^";s:3:"廮";s:2:"_";s:3:"廯";s:2:"`";s:3:"廰";s:2:"a";s:3:"廱";s:2:"b";s:3:"廲";s:2:"c";s:3:"廳";s:2:"d";s:3:"廴";s:2:"";s:3:"廵";s:2:"e";s:3:"延";s:2:"";s:3:"廷";s:2:"͢";s:3:"廸";s:2:"f";s:3:"廹";s:2:"g";s:3:"建";s:2:"";s:3:"廻";s:2:"h";s:3:"廼";s:2:"i";s:3:"廽";s:2:"j";s:3:"廾";s:2:"";s:3:"廿";s:2:"إ";s:3:"开";s:2:"";s:3:"弁";s:2:"";s:3:"异";s:2:"";s:3:"弃";s:2:"";s:3:"弄";s:2:"Ū";s:3:"弅";s:2:"k";s:3:"弆";s:2:"l";s:3:"弇";s:2:"m";s:3:"弈";s:2:"";s:3:"弉";s:2:"n";s:3:"弊";s:2:"";s:3:"弋";s:2:"߮";s:3:"弌";s:2:"o";s:3:"弍";s:2:"p";s:3:"弎";s:2:"q";s:3:"式";s:2:"ʽ";s:3:"弐";s:2:"r";s:3:"弑";s:2:"߱";s:3:"弒";s:2:"s";s:3:"弓";s:2:"";s:3:"弔";s:2:"t";s:3:"引";s:2:"";s:3:"弖";s:2:"u";s:3:"弗";s:2:"";s:3:"弘";s:2:"";s:3:"弙";s:2:"v";s:3:"弚";s:2:"w";s:3:"弛";s:2:"";s:3:"弜";s:2:"x";s:3:"弝";s:2:"y";s:3:"弞";s:2:"z";s:3:"弟";s:2:"";s:3:"张";s:2:"";s:3:"弡";s:2:"{";s:3:"弢";s:2:"|";s:3:"弣";s:2:"}";s:3:"弤";s:2:"~";s:3:"弥";s:2:"";s:3:"弦";s:2:"";s:3:"弧";s:2:"";s:3:"弨";s:2:"";s:3:"弩";s:2:"";s:3:"弪";s:2:"";s:3:"弫";s:2:"";s:3:"弬";s:2:"";s:3:"弭";s:2:"";s:3:"弮";s:2:"";s:3:"弯";s:2:"";s:3:"弰";s:2:"";s:3:"弱";s:2:"";s:3:"弲";s:2:"";s:3:"弳";s:2:"";s:3:"弴";s:2:"";s:3:"張";s:2:"";s:3:"弶";s:2:"";s:3:"強";s:2:"";s:3:"弸";s:2:"";s:3:"弹";s:2:"";s:3:"强";s:2:"ǿ";s:3:"弻";s:2:"";s:3:"弼";s:2:"";s:3:"弽";s:2:"";s:3:"弾";s:2:"";s:3:"弿";s:2:"";s:3:"彀";s:2:"";s:3:"彁";s:2:"";s:3:"彂";s:2:"";s:3:"彃";s:2:"";s:3:"彄";s:2:"";s:3:"彅";s:2:"";s:3:"彆";s:2:"";s:3:"彇";s:2:"";s:3:"彈";s:2:"";s:3:"彉";s:2:"";s:3:"彊";s:2:"";s:3:"彋";s:2:"";s:3:"彌";s:2:"";s:3:"彍";s:2:"";s:3:"彎";s:2:"";s:3:"彏";s:2:"";s:3:"彐";s:2:"";s:3:"彑";s:2:"";s:3:"归";s:2:"";s:3:"当";s:2:"";s:3:"彔";s:2:"";s:3:"录";s:2:"¼";s:3:"彖";s:2:"";s:3:"彗";s:2:"";s:3:"彘";s:2:"";s:3:"彙";s:2:"";s:3:"彚";s:2:"";s:3:"彛";s:2:"";s:3:"彜";s:2:"";s:3:"彝";s:2:"";s:3:"彞";s:2:"";s:3:"彟";s:2:"";s:3:"彠";s:2:"";s:3:"彡";s:2:"";s:3:"形";s:2:"";s:3:"彣";s:2:"";s:3:"彤";s:2:"ͮ";s:3:"彥";s:2:"";s:3:"彦";s:2:"";s:3:"彧";s:2:"";s:3:"彨";s:2:"";s:3:"彩";s:2:"";s:3:"彪";s:2:"";s:3:"彫";s:2:"";s:3:"彬";s:2:"";s:3:"彭";s:2:"";s:3:"彮";s:2:"";s:3:"彯";s:2:"";s:3:"彰";s:2:"";s:3:"影";s:2:"Ӱ";s:3:"彲";s:2:"";s:3:"彳";s:2:"";s:3:"彴";s:2:"";s:3:"彵";s:2:"";s:3:"彶";s:2:"";s:3:"彷";s:2:"";s:3:"彸";s:2:"";s:3:"役";s:2:"";s:3:"彺";s:2:"";s:3:"彻";s:2:"";s:3:"彼";s:2:"";s:3:"彽";s:2:"";s:3:"彾";s:2:"";s:3:"彿";s:2:"";s:3:"往";s:2:"";s:3:"征";s:2:"";s:3:"徂";s:2:"";s:3:"徃";s:2:"";s:3:"径";s:2:"";s:3:"待";s:2:"";s:3:"徆";s:2:"";s:3:"徇";s:2:"";s:3:"很";s:2:"";s:3:"徉";s:2:"";s:3:"徊";s:2:"";s:3:"律";s:2:"";s:3:"後";s:2:"";s:3:"徍";s:2:"";s:3:"徎";s:2:"";s:3:"徏";s:2:"";s:3:"徐";s:2:"";s:3:"徑";s:2:"";s:3:"徒";s:2:"ͽ";s:3:"従";s:2:"";s:3:"徔";s:2:"";s:3:"徕";s:2:"";s:3:"徖";s:2:"";s:3:"得";s:2:"";s:3:"徘";s:2:"";s:3:"徙";s:2:"";s:3:"徚";s:2:"";s:3:"徛";s:2:"";s:3:"徜";s:2:"";s:3:"徝";s:2:"";s:3:"從";s:2:"";s:3:"徟";s:2:"";s:3:"徠";s:2:"";s:3:"御";s:2:"";s:3:"徢";s:2:"";s:3:"徣";s:2:"";s:3:"徤";s:2:"";s:3:"徥";s:2:"";s:3:"徦";s:2:"";s:3:"徧";s:2:"";s:3:"徨";s:2:"";s:3:"復";s:2:"";s:3:"循";s:2:"ѭ";s:3:"徫";s:2:"";s:3:"徬";s:2:"";s:3:"徭";s:2:"";s:3:"微";s:2:"΢";s:3:"徯";s:2:"";s:3:"徰";s:2:"";s:3:"徱";s:2:"";s:3:"徲";s:2:"";s:3:"徳";s:2:"";s:3:"徴";s:2:"";s:3:"徵";s:2:"";s:3:"徶";s:2:"";s:3:"德";s:2:"";s:3:"徸";s:2:"";s:3:"徹";s:2:"";s:3:"徺";s:2:"";s:3:"徻";s:2:"";s:3:"徼";s:2:"";s:3:"徽";s:2:"";s:3:"徾";s:2:"";s:3:"徿";s:2:"";s:3:"忀";s:2:"";s:3:"忁";s:2:"";s:3:"忂";s:2:"";s:3:"心";s:2:"";s:3:"忄";s:2:"";s:3:"必";s:2:"";s:3:"忆";s:2:"";s:3:"忇";s:2:"";s:3:"忈";s:2:"";s:3:"忉";s:2:"";s:3:"忊";s:2:"";s:3:"忋";s:2:"";s:3:"忌";s:2:"";s:3:"忍";s:2:"";s:3:"忎";s:2:"";s:3:"忏";s:2:"";s:3:"忐";s:2:"";s:3:"忑";s:2:"";s:3:"忒";s:2:"߯";s:3:"忓";s:2:"";s:3:"忔";s:2:"";s:3:"忕";s:2:"";s:3:"忖";s:2:"";s:3:"志";s:2:"־";s:3:"忘";s:2:"";s:3:"忙";s:2:"æ";s:3:"忚";s:2:"";s:3:"忛";s:2:"";s:3:"応";s:2:"";s:3:"忝";s:2:"";s:3:"忞";s:2:"";s:3:"忟";s:2:"";s:3:"忠";s:2:"";s:3:"忡";s:2:"";s:3:"忢";s:2:"";s:3:"忣";s:2:"";s:3:"忤";s:2:"";s:3:"忥";s:2:"";s:3:"忦";s:2:"";s:3:"忧";s:2:"";s:3:"忨";s:2:"";s:3:"忩";s:2:"";s:3:"忪";s:2:"";s:3:"快";s:2:"";s:3:"忬";s:2:"";s:3:"忭";s:2:"";s:3:"忮";s:2:"";s:3:"忯";s:2:"";s:3:"忰";s:2:"";s:3:"忱";s:2:"";s:3:"忲";s:2:"";s:3:"忳";s:2:"";s:3:"忴";s:2:"";s:3:"念";s:2:"";s:3:"忶";s:2:"";s:3:"忷";s:2:"";s:3:"忸";s:2:"";s:3:"忹";s:2:"";s:3:"忺";s:2:"";s:3:"忻";s:2:"";s:3:"忼";s:2:"";s:3:"忽";s:2:"";s:3:"忾";s:2:"";s:3:"忿";s:2:"";s:3:"怀";s:2:"";s:3:"态";s:2:"̬";s:3:"怂";s:2:"";s:3:"怃";s:2:"";s:3:"怄";s:2:"";s:3:"怅";s:2:"";s:3:"怆";s:2:"";s:3:"怇";s:2:"";s:3:"怈";s:2:"@";s:3:"怉";s:2:"A";s:3:"怊";s:2:"";s:3:"怋";s:2:"B";s:3:"怌";s:2:"C";s:3:"怍";s:2:"";s:3:"怎";s:2:"";s:3:"怏";s:2:"";s:3:"怐";s:2:"D";s:3:"怑";s:2:"E";s:3:"怒";s:2:"ŭ";s:3:"怓";s:2:"F";s:3:"怔";s:2:"";s:3:"怕";s:2:"";s:3:"怖";s:2:"";s:3:"怗";s:2:"G";s:3:"怘";s:2:"H";s:3:"怙";s:2:"";s:3:"怚";s:2:"I";s:3:"怛";s:2:"";s:3:"怜";s:2:"";s:3:"思";s:2:"˼";s:3:"怞";s:2:"J";s:3:"怟";s:2:"K";s:3:"怠";s:2:"";s:3:"怡";s:2:"";s:3:"怢";s:2:"L";s:3:"怣";s:2:"M";s:3:"怤";s:2:"N";s:3:"急";s:2:"";s:3:"怦";s:2:"";s:3:"性";s:2:"";s:3:"怨";s:2:"Թ";s:3:"怩";s:2:"";s:3:"怪";s:2:"";s:3:"怫";s:2:"";s:3:"怬";s:2:"O";s:3:"怭";s:2:"P";s:3:"怮";s:2:"Q";s:3:"怯";s:2:"";s:3:"怰";s:2:"R";s:3:"怱";s:2:"S";s:3:"怲";s:2:"T";s:3:"怳";s:2:"U";s:3:"怴";s:2:"V";s:3:"怵";s:2:"";s:3:"怶";s:2:"W";s:3:"怷";s:2:"X";s:3:"怸";s:2:"Y";s:3:"怹";s:2:"Z";s:3:"怺";s:2:"[";s:3:"总";s:2:"";s:3:"怼";s:2:"";s:3:"怽";s:2:"\";s:3:"怾";s:2:"]";s:3:"怿";s:2:"";s:3:"恀";s:2:"^";s:3:"恁";s:2:"";s:3:"恂";s:2:"";s:3:"恃";s:2:"";s:3:"恄";s:2:"_";s:3:"恅";s:2:"`";s:3:"恆";s:2:"a";s:3:"恇";s:2:"b";s:3:"恈";s:2:"c";s:3:"恉";s:2:"d";s:3:"恊";s:2:"e";s:3:"恋";s:2:"";s:3:"恌";s:2:"f";s:3:"恍";s:2:"";s:3:"恎";s:2:"g";s:3:"恏";s:2:"h";s:3:"恐";s:2:"";s:3:"恑";s:2:"i";s:3:"恒";s:2:"";s:3:"恓";s:2:"j";s:3:"恔";s:2:"k";s:3:"恕";s:2:"ˡ";s:3:"恖";s:2:"l";s:3:"恗";s:2:"m";s:3:"恘";s:2:"n";s:3:"恙";s:2:"";s:3:"恚";s:2:"";s:3:"恛";s:2:"o";s:3:"恜";s:2:"p";s:3:"恝";s:2:"";s:3:"恞";s:2:"q";s:3:"恟";s:2:"r";s:3:"恠";s:2:"s";s:3:"恡";s:2:"t";s:3:"恢";s:2:"";s:3:"恣";s:2:"";s:3:"恤";s:2:"";s:3:"恥";s:2:"u";s:3:"恦";s:2:"v";s:3:"恧";s:2:"";s:3:"恨";s:2:"";s:3:"恩";s:2:"";s:3:"恪";s:2:"";s:3:"恫";s:2:"";s:3:"恬";s:2:"";s:3:"恭";s:2:"";s:3:"恮";s:2:"w";s:3:"息";s:2:"Ϣ";s:3:"恰";s:2:"ǡ";s:3:"恱";s:2:"x";s:3:"恲";s:2:"y";s:3:"恳";s:2:"";s:3:"恴";s:2:"z";s:3:"恵";s:2:"{";s:3:"恶";s:2:"";s:3:"恷";s:2:"|";s:3:"恸";s:2:"";s:3:"恹";s:2:"";s:3:"恺";s:2:"";s:3:"恻";s:2:"";s:3:"恼";s:2:"";s:3:"恽";s:2:"";s:3:"恾";s:2:"}";s:3:"恿";s:2:"";s:3:"悀";s:2:"~";s:3:"悁";s:2:"";s:3:"悂";s:2:"";s:3:"悃";s:2:"";s:3:"悄";s:2:"";s:3:"悅";s:2:"";s:3:"悆";s:2:"";s:3:"悇";s:2:"";s:3:"悈";s:2:"";s:3:"悉";s:2:"Ϥ";s:3:"悊";s:2:"";s:3:"悋";s:2:"";s:3:"悌";s:2:"";s:3:"悍";s:2:"";s:3:"悎";s:2:"";s:3:"悏";s:2:"";s:3:"悐";s:2:"";s:3:"悑";s:2:"";s:3:"悒";s:2:"";s:3:"悓";s:2:"";s:3:"悔";s:2:"";s:3:"悕";s:2:"";s:3:"悖";s:2:"";s:3:"悗";s:2:"";s:3:"悘";s:2:"";s:3:"悙";s:2:"";s:3:"悚";s:2:"";s:3:"悛";s:2:"";s:3:"悜";s:2:"";s:3:"悝";s:2:"";s:3:"悞";s:2:"";s:3:"悟";s:2:"";s:3:"悠";s:2:"";s:3:"悡";s:2:"";s:3:"悢";s:2:"";s:3:"患";s:2:"";s:3:"悤";s:2:"";s:3:"悥";s:2:"";s:3:"悦";s:2:"";s:3:"悧";s:2:"";s:3:"您";s:2:"";s:3:"悩";s:2:"";s:3:"悪";s:2:"";s:3:"悫";s:2:"";s:3:"悬";s:2:"";s:3:"悭";s:2:"";s:3:"悮";s:2:"";s:3:"悯";s:2:"";s:3:"悰";s:2:"";s:3:"悱";s:2:"";s:3:"悲";s:2:"";s:3:"悳";s:2:"";s:3:"悴";s:2:"";s:3:"悵";s:2:"";s:3:"悶";s:2:"";s:3:"悷";s:2:"";s:3:"悸";s:2:"";s:3:"悹";s:2:"";s:3:"悺";s:2:"";s:3:"悻";s:2:"";s:3:"悼";s:2:"";s:3:"悽";s:2:"";s:3:"悾";s:2:"";s:3:"悿";s:2:"";s:3:"惀";s:2:"";s:3:"惁";s:2:"";s:3:"惂";s:2:"";s:3:"惃";s:2:"";s:3:"惄";s:2:"";s:3:"情";s:2:"";s:3:"惆";s:2:"";s:3:"惇";s:2:"";s:3:"惈";s:2:"";s:3:"惉";s:2:"";s:3:"惊";s:2:"";s:3:"惋";s:2:"";s:3:"惌";s:2:"";s:3:"惍";s:2:"";s:3:"惎";s:2:"";s:3:"惏";s:2:"";s:3:"惐";s:2:"";s:3:"惑";s:2:"";s:3:"惒";s:2:"";s:3:"惓";s:2:"";s:3:"惔";s:2:"";s:3:"惕";s:2:"";s:3:"惖";s:2:"";s:3:"惗";s:2:"";s:3:"惘";s:2:"";s:3:"惙";s:2:"";s:3:"惚";s:2:"";s:3:"惛";s:2:"";s:3:"惜";s:2:"ϧ";s:3:"惝";s:2:"";s:3:"惞";s:2:"";s:3:"惟";s:2:"Ω";s:3:"惠";s:2:"";s:3:"惡";s:2:"";s:3:"惢";s:2:"";s:3:"惣";s:2:"";s:3:"惤";s:2:"";s:3:"惥";s:2:"";s:3:"惦";s:2:"";s:3:"惧";s:2:"";s:3:"惨";s:2:"";s:3:"惩";s:2:"";s:3:"惪";s:2:"";s:3:"惫";s:2:"";s:3:"惬";s:2:"";s:3:"惭";s:2:"";s:3:"惮";s:2:"";s:3:"惯";s:2:"";s:3:"惰";s:2:"";s:3:"惱";s:2:"";s:3:"惲";s:2:"";s:3:"想";s:2:"";s:3:"惴";s:2:"";s:3:"惵";s:2:"";s:3:"惶";s:2:"";s:3:"惷";s:2:"";s:3:"惸";s:2:"";s:3:"惹";s:2:"";s:3:"惺";s:2:"";s:3:"惻";s:2:"";s:3:"惼";s:2:"";s:3:"惽";s:2:"";s:3:"惾";s:2:"";s:3:"惿";s:2:"";s:3:"愀";s:2:"";s:3:"愁";s:2:"";s:3:"愂";s:2:"";s:3:"愃";s:2:"";s:3:"愄";s:2:"";s:3:"愅";s:2:"";s:3:"愆";s:2:"";s:3:"愇";s:2:"";s:3:"愈";s:2:"";s:3:"愉";s:2:"";s:3:"愊";s:2:"";s:3:"愋";s:2:"";s:3:"愌";s:2:"";s:3:"愍";s:2:"";s:3:"愎";s:2:"";s:3:"意";s:2:"";s:3:"愐";s:2:"";s:3:"愑";s:2:"";s:3:"愒";s:2:"";s:3:"愓";s:2:"";s:3:"愔";s:2:"";s:3:"愕";s:2:"";s:3:"愖";s:2:"";s:3:"愗";s:2:"";s:3:"愘";s:2:"";s:3:"愙";s:2:"";s:3:"愚";s:2:"";s:3:"愛";s:2:"";s:3:"愜";s:2:"";s:3:"愝";s:2:"";s:3:"愞";s:2:"";s:3:"感";s:2:"";s:3:"愠";s:2:"";s:3:"愡";s:2:"";s:3:"愢";s:2:"";s:3:"愣";s:2:"";s:3:"愤";s:2:"";s:3:"愥";s:2:"";s:3:"愦";s:2:"";s:3:"愧";s:2:"";s:3:"愨";s:2:"";s:3:"愩";s:2:"";s:3:"愪";s:2:"";s:3:"愫";s:2:"";s:3:"愬";s:2:"";s:3:"愭";s:2:"";s:3:"愮";s:2:"";s:3:"愯";s:2:"";s:3:"愰";s:2:"";s:3:"愱";s:2:"";s:3:"愲";s:2:"";s:3:"愳";s:2:"";s:3:"愴";s:2:"";s:3:"愵";s:2:"";s:3:"愶";s:2:"";s:3:"愷";s:2:"";s:3:"愸";s:2:"";s:3:"愹";s:2:"";s:3:"愺";s:2:"";s:3:"愻";s:2:"";s:3:"愼";s:2:"";s:3:"愽";s:2:"";s:3:"愾";s:2:"";s:3:"愿";s:2:"Ը";s:3:"慀";s:2:"";s:3:"慁";s:2:"";s:3:"慂";s:2:"";s:3:"慃";s:2:"";s:3:"慄";s:2:"";s:3:"慅";s:2:"";s:3:"慆";s:2:"";s:3:"慇";s:2:"@";s:3:"慈";s:2:"";s:3:"慉";s:2:"A";s:3:"慊";s:2:"";s:3:"態";s:2:"B";s:3:"慌";s:2:"";s:3:"慍";s:2:"C";s:3:"慎";s:2:"";s:3:"慏";s:2:"D";s:3:"慐";s:2:"E";s:3:"慑";s:2:"";s:3:"慒";s:2:"F";s:3:"慓";s:2:"G";s:3:"慔";s:2:"H";s:3:"慕";s:2:"Ľ";s:3:"慖";s:2:"I";s:3:"慗";s:2:"J";s:3:"慘";s:2:"K";s:3:"慙";s:2:"L";s:3:"慚";s:2:"M";s:3:"慛";s:2:"N";s:3:"慜";s:2:"O";s:3:"慝";s:2:"";s:3:"慞";s:2:"P";s:3:"慟";s:2:"Q";s:3:"慠";s:2:"R";s:3:"慡";s:2:"S";s:3:"慢";s:2:"";s:3:"慣";s:2:"T";s:3:"慤";s:2:"U";s:3:"慥";s:2:"V";s:3:"慦";s:2:"W";s:3:"慧";s:2:"";s:3:"慨";s:2:"";s:3:"慩";s:2:"X";s:3:"慪";s:2:"Y";s:3:"慫";s:2:"Z";s:3:"慬";s:2:"[";s:3:"慭";s:2:"\";s:3:"慮";s:2:"]";s:3:"慯";s:2:"^";s:3:"慰";s:2:"ο";s:3:"慱";s:2:"_";s:3:"慲";s:2:"`";s:3:"慳";s:2:"a";s:3:"慴";s:2:"b";s:3:"慵";s:2:"";s:3:"慶";s:2:"c";s:3:"慷";s:2:"";s:3:"慸";s:2:"d";s:3:"慹";s:2:"e";s:3:"慺";s:2:"f";s:3:"慻";s:2:"g";s:3:"慼";s:2:"h";s:3:"慽";s:2:"i";s:3:"慾";s:2:"j";s:3:"慿";s:2:"k";s:3:"憀";s:2:"l";s:3:"憁";s:2:"m";s:3:"憂";s:2:"n";s:3:"憃";s:2:"o";s:3:"憄";s:2:"p";s:3:"憅";s:2:"q";s:3:"憆";s:2:"r";s:3:"憇";s:2:"s";s:3:"憈";s:2:"t";s:3:"憉";s:2:"u";s:3:"憊";s:2:"v";s:3:"憋";s:2:"";s:3:"憌";s:2:"w";s:3:"憍";s:2:"x";s:3:"憎";s:2:"";s:3:"憏";s:2:"y";s:3:"憐";s:2:"z";s:3:"憑";s:2:"{";s:3:"憒";s:2:"|";s:3:"憓";s:2:"}";s:3:"憔";s:2:"";s:3:"憕";s:2:"~";s:3:"憖";s:2:"";s:3:"憗";s:2:"";s:3:"憘";s:2:"";s:3:"憙";s:2:"";s:3:"憚";s:2:"";s:3:"憛";s:2:"";s:3:"憜";s:2:"";s:3:"憝";s:2:"";s:3:"憞";s:2:"";s:3:"憟";s:2:"";s:3:"憠";s:2:"";s:3:"憡";s:2:"";s:3:"憢";s:2:"";s:3:"憣";s:2:"";s:3:"憤";s:2:"";s:3:"憥";s:2:"";s:3:"憦";s:2:"";s:3:"憧";s:2:"";s:3:"憨";s:2:"";s:3:"憩";s:2:"";s:3:"憪";s:2:"";s:3:"憫";s:2:"";s:3:"憬";s:2:"";s:3:"憭";s:2:"";s:3:"憮";s:2:"";s:3:"憯";s:2:"";s:3:"憰";s:2:"";s:3:"憱";s:2:"";s:3:"憲";s:2:"";s:3:"憳";s:2:"";s:3:"憴";s:2:"";s:3:"憵";s:2:"";s:3:"憶";s:2:"";s:3:"憷";s:2:"";s:3:"憸";s:2:"";s:3:"憹";s:2:"";s:3:"憺";s:2:"";s:3:"憻";s:2:"";s:3:"憼";s:2:"";s:3:"憽";s:2:"";s:3:"憾";s:2:"";s:3:"憿";s:2:"";s:3:"懀";s:2:"";s:3:"懁";s:2:"";s:3:"懂";s:2:"";s:3:"懃";s:2:"";s:3:"懄";s:2:"";s:3:"懅";s:2:"";s:3:"懆";s:2:"";s:3:"懇";s:2:"";s:3:"懈";s:2:"и";s:3:"應";s:2:"";s:3:"懊";s:2:"";s:3:"懋";s:2:"";s:3:"懌";s:2:"";s:3:"懍";s:2:"";s:3:"懎";s:2:"";s:3:"懏";s:2:"";s:3:"懐";s:2:"";s:3:"懑";s:2:"";s:3:"懒";s:2:"";s:3:"懓";s:2:"";s:3:"懔";s:2:"";s:3:"懕";s:2:"";s:3:"懖";s:2:"";s:3:"懗";s:2:"";s:3:"懘";s:2:"";s:3:"懙";s:2:"";s:3:"懚";s:2:"";s:3:"懛";s:2:"";s:3:"懜";s:2:"";s:3:"懝";s:2:"";s:3:"懞";s:2:"";s:3:"懟";s:2:"";s:3:"懠";s:2:"";s:3:"懡";s:2:"";s:3:"懢";s:2:"";s:3:"懣";s:2:"";s:3:"懤";s:2:"";s:3:"懥";s:2:"";s:3:"懦";s:2:"ų";s:3:"懧";s:2:"";s:3:"懨";s:2:"";s:3:"懩";s:2:"";s:3:"懪";s:2:"";s:3:"懫";s:2:"";s:3:"懬";s:2:"";s:3:"懭";s:2:"";s:3:"懮";s:2:"";s:3:"懯";s:2:"";s:3:"懰";s:2:"";s:3:"懱";s:2:"";s:3:"懲";s:2:"";s:3:"懳";s:2:"";s:3:"懴";s:2:"";s:3:"懵";s:2:"";s:3:"懶";s:2:"";s:3:"懷";s:2:"";s:3:"懸";s:2:"";s:3:"懹";s:2:"";s:3:"懺";s:2:"";s:3:"懻";s:2:"";s:3:"懼";s:2:"";s:3:"懽";s:2:"";s:3:"懾";s:2:"";s:3:"懿";s:2:"ܲ";s:3:"戀";s:2:"";s:3:"戁";s:2:"";s:3:"戂";s:2:"";s:3:"戃";s:2:"";s:3:"戄";s:2:"";s:3:"戅";s:2:"";s:3:"戆";s:2:"";s:3:"戇";s:2:"";s:3:"戈";s:2:"";s:3:"戉";s:2:"";s:3:"戊";s:2:"";s:3:"戋";s:2:"";s:3:"戌";s:2:"";s:3:"戍";s:2:"";s:3:"戎";s:2:"";s:3:"戏";s:2:"Ϸ";s:3:"成";s:2:"";s:3:"我";s:2:"";s:3:"戒";s:2:"";s:3:"戓";s:2:"";s:3:"戔";s:2:"";s:3:"戕";s:2:"";s:3:"或";s:2:"";s:3:"戗";s:2:"";s:3:"战";s:2:"ս";s:3:"戙";s:2:"";s:3:"戚";s:2:"";s:3:"戛";s:2:"";s:3:"戜";s:2:"";s:3:"戝";s:2:"";s:3:"戞";s:2:"";s:3:"戟";s:2:"";s:3:"戠";s:2:"";s:3:"戡";s:2:"";s:3:"戢";s:2:"";s:3:"戣";s:2:"";s:3:"戤";s:2:"";s:3:"戥";s:2:"";s:3:"戦";s:2:"";s:3:"戧";s:2:"";s:3:"戨";s:2:"";s:3:"戩";s:2:"";s:3:"截";s:2:"";s:3:"戫";s:2:"";s:3:"戬";s:2:"";s:3:"戭";s:2:"";s:3:"戮";s:2:"¾";s:3:"戯";s:2:"";s:3:"戰";s:2:"";s:3:"戱";s:2:"";s:3:"戲";s:2:"";s:3:"戳";s:2:"";s:3:"戴";s:2:"";s:3:"戵";s:2:"";s:3:"戶";s:2:"";s:3:"户";s:2:"";s:3:"戸";s:2:"";s:3:"戹";s:2:"";s:3:"戺";s:2:"";s:3:"戻";s:2:"";s:3:"戼";s:2:"";s:3:"戽";s:2:"";s:3:"戾";s:2:"";s:3:"房";s:2:"";s:3:"所";s:2:"";s:3:"扁";s:2:"";s:3:"扂";s:2:"";s:3:"扃";s:2:"";s:3:"扄";s:2:"";s:3:"扅";s:2:"";s:3:"扆";s:2:"";s:3:"扇";s:2:"";s:3:"扈";s:2:"";s:3:"扉";s:2:"";s:3:"扊";s:2:"";s:3:"手";s:2:"";s:3:"扌";s:2:"";s:3:"才";s:2:"";s:3:"扎";s:2:"";s:3:"扏";s:2:"@";s:3:"扐";s:2:"A";s:3:"扑";s:2:"";s:3:"扒";s:2:"";s:3:"打";s:2:"";s:3:"扔";s:2:"";s:3:"払";s:2:"B";s:3:"扖";s:2:"C";s:3:"扗";s:2:"D";s:3:"托";s:2:"";s:3:"扙";s:2:"E";s:3:"扚";s:2:"F";s:3:"扛";s:2:"";s:3:"扜";s:2:"G";s:3:"扝";s:2:"H";s:3:"扞";s:2:"I";s:3:"扟";s:2:"J";s:3:"扠";s:2:"K";s:3:"扡";s:2:"L";s:3:"扢";s:2:"M";s:3:"扣";s:2:"";s:3:"扤";s:2:"N";s:3:"扥";s:2:"O";s:3:"扦";s:2:"Ǥ";s:3:"执";s:2:"ִ";s:3:"扨";s:2:"P";s:3:"扩";s:2:"";s:3:"扪";s:2:"";s:3:"扫";s:2:"ɨ";s:3:"扬";s:2:"";s:3:"扭";s:2:"Ť";s:3:"扮";s:2:"";s:3:"扯";s:2:"";s:3:"扰";s:2:"";s:3:"扱";s:2:"Q";s:3:"扲";s:2:"R";s:3:"扳";s:2:"";s:3:"扴";s:2:"S";s:3:"扵";s:2:"T";s:3:"扶";s:2:"";s:3:"扷";s:2:"U";s:3:"扸";s:2:"V";s:3:"批";s:2:"";s:3:"扺";s:2:"W";s:3:"扻";s:2:"X";s:3:"扼";s:2:"";s:3:"扽";s:2:"Y";s:3:"找";s:2:"";s:3:"承";s:2:"";s:3:"技";s:2:"";s:3:"抁";s:2:"Z";s:3:"抂";s:2:"[";s:3:"抃";s:2:"\";s:3:"抄";s:2:"";s:3:"抅";s:2:"]";s:3:"抆";s:2:"^";s:3:"抇";s:2:"_";s:3:"抈";s:2:"`";s:3:"抉";s:2:"";s:3:"把";s:2:"";s:3:"抋";s:2:"a";s:3:"抌";s:2:"b";s:3:"抍";s:2:"c";s:3:"抎";s:2:"d";s:3:"抏";s:2:"e";s:3:"抐";s:2:"f";s:3:"抑";s:2:"";s:3:"抒";s:2:"";s:3:"抓";s:2:"ץ";s:3:"抔";s:2:"g";s:3:"投";s:2:"Ͷ";s:3:"抖";s:2:"";s:3:"抗";s:2:"";s:3:"折";s:2:"";s:3:"抙";s:2:"h";s:3:"抚";s:2:"";s:3:"抛";s:2:"";s:3:"抜";s:2:"i";s:3:"抝";s:2:"j";s:3:"択";s:2:"k";s:3:"抟";s:2:"";s:3:"抠";s:2:"";s:3:"抡";s:2:"";s:3:"抢";s:2:"";s:3:"抣";s:2:"l";s:3:"护";s:2:"";s:3:"报";s:2:"";s:3:"抦";s:2:"m";s:3:"抧";s:2:"n";s:3:"抨";s:2:"";s:3:"抩";s:2:"o";s:3:"抪";s:2:"p";s:3:"披";s:2:"";s:3:"抬";s:2:"̧";s:3:"抭";s:2:"q";s:3:"抮";s:2:"r";s:3:"抯";s:2:"s";s:3:"抰";s:2:"t";s:3:"抱";s:2:"";s:3:"抲";s:2:"u";s:3:"抳";s:2:"v";s:3:"抴";s:2:"w";s:3:"抵";s:2:"";s:3:"抶";s:2:"x";s:3:"抷";s:2:"y";s:3:"抸";s:2:"z";s:3:"抹";s:2:"Ĩ";s:3:"抺";s:2:"{";s:3:"抻";s:2:"";s:3:"押";s:2:"Ѻ";s:3:"抽";s:2:"";s:3:"抾";s:2:"|";s:3:"抿";s:2:"";s:3:"拀";s:2:"}";s:3:"拁";s:2:"~";s:3:"拂";s:2:"";s:3:"拃";s:2:"";s:3:"拄";s:2:"";s:3:"担";s:2:"";s:3:"拆";s:2:"";s:3:"拇";s:2:"Ĵ";s:3:"拈";s:2:"";s:3:"拉";s:2:"";s:3:"拊";s:2:"";s:3:"拋";s:2:"";s:3:"拌";s:2:"";s:3:"拍";s:2:"";s:3:"拎";s:2:"";s:3:"拏";s:2:"";s:3:"拐";s:2:"";s:3:"拑";s:2:"";s:3:"拒";s:2:"";s:3:"拓";s:2:"";s:3:"拔";s:2:"";s:3:"拕";s:2:"";s:3:"拖";s:2:"";s:3:"拗";s:2:"";s:3:"拘";s:2:"";s:3:"拙";s:2:"׾";s:3:"拚";s:2:"";s:3:"招";s:2:"";s:3:"拜";s:2:"";s:3:"拝";s:2:"";s:3:"拞";s:2:"";s:3:"拟";s:2:"";s:3:"拠";s:2:"";s:3:"拡";s:2:"";s:3:"拢";s:2:"£";s:3:"拣";s:2:"";s:3:"拤";s:2:"";s:3:"拥";s:2:"ӵ";s:3:"拦";s:2:"";s:3:"拧";s:2:"š";s:3:"拨";s:2:"";s:3:"择";s:2:"";s:3:"拪";s:2:"";s:3:"拫";s:2:"";s:3:"括";s:2:"";s:3:"拭";s:2:"";s:3:"拮";s:2:"";s:3:"拯";s:2:"";s:3:"拰";s:2:"";s:3:"拱";s:2:"";s:3:"拲";s:2:"";s:3:"拳";s:2:"ȭ";s:3:"拴";s:2:"˩";s:3:"拵";s:2:"";s:3:"拶";s:2:"";s:3:"拷";s:2:"";s:3:"拸";s:2:"";s:3:"拹";s:2:"";s:3:"拺";s:2:"";s:3:"拻";s:2:"";s:3:"拼";s:2:"ƴ";s:3:"拽";s:2:"ק";s:3:"拾";s:2:"ʰ";s:3:"拿";s:2:"";s:3:"挀";s:2:"";s:3:"持";s:2:"";s:3:"挂";s:2:"";s:3:"挃";s:2:"";s:3:"挄";s:2:"";s:3:"挅";s:2:"";s:3:"挆";s:2:"";s:3:"指";s:2:"ָ";s:3:"挈";s:2:"";s:3:"按";s:2:"";s:3:"挊";s:2:"";s:3:"挋";s:2:"";s:3:"挌";s:2:"";s:3:"挍";s:2:"";s:3:"挎";s:2:"";s:3:"挏";s:2:"";s:3:"挐";s:2:"";s:3:"挑";s:2:"";s:3:"挒";s:2:"";s:3:"挓";s:2:"";s:3:"挔";s:2:"";s:3:"挕";s:2:"";s:3:"挖";s:2:"";s:3:"挗";s:2:"";s:3:"挘";s:2:"";s:3:"挙";s:2:"";s:3:"挚";s:2:"ֿ";s:3:"挛";s:2:"";s:3:"挜";s:2:"";s:3:"挝";s:2:"";s:3:"挞";s:2:"̢";s:3:"挟";s:2:"Ю";s:3:"挠";s:2:"";s:3:"挡";s:2:"";s:3:"挢";s:2:"";s:3:"挣";s:2:"";s:3:"挤";s:2:"";s:3:"挥";s:2:"";s:3:"挦";s:2:"";s:3:"挧";s:2:"";s:3:"挨";s:2:"";s:3:"挩";s:2:"";s:3:"挪";s:2:"Ų";s:3:"挫";s:2:"";s:3:"挬";s:2:"";s:3:"挭";s:2:"";s:3:"挮";s:2:"";s:3:"振";s:2:"";s:3:"挰";s:2:"";s:3:"挱";s:2:"";s:3:"挲";s:2:"";s:3:"挳";s:2:"";s:3:"挴";s:2:"";s:3:"挵";s:2:"";s:3:"挶";s:2:"";s:3:"挷";s:2:"";s:3:"挸";s:2:"";s:3:"挹";s:2:"";s:3:"挺";s:2:"ͦ";s:3:"挻";s:2:"";s:3:"挼";s:2:"";s:3:"挽";s:2:"";s:3:"挾";s:2:"";s:3:"挿";s:2:"";s:3:"捀";s:2:"";s:3:"捁";s:2:"";s:3:"捂";s:2:"";s:3:"捃";s:2:"";s:3:"捄";s:2:"";s:3:"捅";s:2:"ͱ";s:3:"捆";s:2:"";s:3:"捇";s:2:"";s:3:"捈";s:2:"";s:3:"捉";s:2:"׽";s:3:"捊";s:2:"";s:3:"捋";s:2:"";s:3:"捌";s:2:"";s:3:"捍";s:2:"";s:3:"捎";s:2:"";s:3:"捏";s:2:"";s:3:"捐";s:2:"";s:3:"捑";s:2:"";s:3:"捒";s:2:"";s:3:"捓";s:2:"";s:3:"捔";s:2:"";s:3:"捕";s:2:"";s:3:"捖";s:2:"";s:3:"捗";s:2:"";s:3:"捘";s:2:"";s:3:"捙";s:2:"";s:3:"捚";s:2:"";s:3:"捛";s:2:"";s:3:"捜";s:2:"";s:3:"捝";s:2:"";s:3:"捞";s:2:"";s:3:"损";s:2:"";s:3:"捠";s:2:"";s:3:"捡";s:2:"";s:3:"换";s:2:"";s:3:"捣";s:2:"";s:3:"捤";s:2:"";s:3:"捥";s:2:"";s:3:"捦";s:2:"";s:3:"捧";s:2:"";s:3:"捨";s:2:"";s:3:"捩";s:2:"";s:3:"捪";s:2:"";s:3:"捫";s:2:"";s:3:"捬";s:2:"";s:3:"捭";s:2:"";s:3:"据";s:2:"";s:3:"捯";s:2:"";s:3:"捰";s:2:"";s:3:"捱";s:2:"";s:3:"捲";s:2:"";s:3:"捳";s:2:"";s:3:"捴";s:2:"";s:3:"捵";s:2:"";s:3:"捶";s:2:"";s:3:"捷";s:2:"";s:3:"捸";s:2:"";s:3:"捹";s:2:"";s:3:"捺";s:2:"";s:3:"捻";s:2:"";s:3:"捼";s:2:"";s:3:"捽";s:2:"";s:3:"捾";s:2:"";s:3:"捿";s:2:"";s:3:"掀";s:2:"";s:3:"掁";s:2:"";s:3:"掂";s:2:"";s:3:"掃";s:2:"";s:3:"掄";s:2:"";s:3:"掅";s:2:"";s:3:"掆";s:2:"";s:3:"掇";s:2:"";s:3:"授";s:2:"";s:3:"掉";s:2:"";s:3:"掊";s:2:"";s:3:"掋";s:2:"";s:3:"掌";s:2:"";s:3:"掍";s:2:"";s:3:"掎";s:2:"";s:3:"掏";s:2:"";s:3:"掐";s:2:"";s:3:"掑";s:2:"";s:3:"排";s:2:"";s:3:"掓";s:2:"";s:3:"掔";s:2:"";s:3:"掕";s:2:"";s:3:"掖";s:2:"Ҵ";s:3:"掗";s:2:"";s:3:"掘";s:2:"";s:3:"掙";s:2:"";s:3:"掚";s:2:"";s:3:"掛";s:2:"";s:3:"掜";s:2:"";s:3:"掝";s:2:"";s:3:"掞";s:2:"";s:3:"掟";s:2:"";s:3:"掠";s:2:"";s:3:"採";s:2:"";s:3:"探";s:2:"̽";s:3:"掣";s:2:"";s:3:"掤";s:2:"";s:3:"接";s:2:"";s:3:"掦";s:2:"";s:3:"控";s:2:"";s:3:"推";s:2:"";s:3:"掩";s:2:"";s:3:"措";s:2:"";s:3:"掫";s:2:"";s:3:"掬";s:2:"";s:3:"掭";s:2:"";s:3:"掮";s:2:"";s:3:"掯";s:2:"";s:3:"掰";s:2:"";s:3:"掱";s:2:"";s:3:"掲";s:2:"";s:3:"掳";s:2:"°";s:3:"掴";s:2:"";s:3:"掵";s:2:"";s:3:"掶";s:2:"";s:3:"掷";s:2:"";s:3:"掸";s:2:"";s:3:"掹";s:2:"";s:3:"掺";s:2:"";s:3:"掻";s:2:"";s:3:"掼";s:2:"";s:3:"掽";s:2:"";s:3:"掾";s:2:"";s:3:"掿";s:2:"";s:3:"揀";s:2:"";s:3:"揁";s:2:"@";s:3:"揂";s:2:"A";s:3:"揃";s:2:"B";s:3:"揄";s:2:"";s:3:"揅";s:2:"C";s:3:"揆";s:2:"";s:3:"揇";s:2:"D";s:3:"揈";s:2:"E";s:3:"揉";s:2:"";s:3:"揊";s:2:"F";s:3:"揋";s:2:"G";s:3:"揌";s:2:"H";s:3:"揍";s:2:"";s:3:"揎";s:2:"";s:3:"描";s:2:"";s:3:"提";s:2:"";s:3:"揑";s:2:"I";s:3:"插";s:2:"";s:3:"揓";s:2:"J";s:3:"揔";s:2:"K";s:3:"揕";s:2:"L";s:3:"揖";s:2:"Ҿ";s:3:"揗";s:2:"M";s:3:"揘";s:2:"N";s:3:"揙";s:2:"O";s:3:"揚";s:2:"P";s:3:"換";s:2:"Q";s:3:"揜";s:2:"R";s:3:"揝";s:2:"S";s:3:"揞";s:2:"";s:3:"揟";s:2:"T";s:3:"揠";s:2:"";s:3:"握";s:2:"";s:3:"揢";s:2:"U";s:3:"揣";s:2:"";s:3:"揤";s:2:"V";s:3:"揥";s:2:"W";s:3:"揦";s:2:"X";s:3:"揧";s:2:"Y";s:3:"揨";s:2:"Z";s:3:"揩";s:2:"";s:3:"揪";s:2:"";s:3:"揫";s:2:"[";s:3:"揬";s:2:"\";s:3:"揭";s:2:"";s:3:"揮";s:2:"]";s:3:"揯";s:2:"^";s:3:"揰";s:2:"_";s:3:"揱";s:2:"`";s:3:"揲";s:2:"";s:3:"揳";s:2:"a";s:3:"援";s:2:"Ԯ";s:3:"揵";s:2:"b";s:3:"揶";s:2:"";s:3:"揷";s:2:"c";s:3:"揸";s:2:"";s:3:"揹";s:2:"d";s:3:"揺";s:2:"e";s:3:"揻";s:2:"f";s:3:"揼";s:2:"g";s:3:"揽";s:2:"";s:3:"揾";s:2:"h";s:3:"揿";s:2:"";s:3:"搀";s:2:"";s:3:"搁";s:2:"";s:3:"搂";s:2:"§";s:3:"搃";s:2:"i";s:3:"搄";s:2:"j";s:3:"搅";s:2:"";s:3:"搆";s:2:"k";s:3:"搇";s:2:"l";s:3:"搈";s:2:"m";s:3:"搉";s:2:"n";s:3:"搊";s:2:"o";s:3:"搋";s:2:"";s:3:"搌";s:2:"";s:3:"損";s:2:"p";s:3:"搎";s:2:"q";s:3:"搏";s:2:"";s:3:"搐";s:2:"";s:3:"搑";s:2:"r";s:3:"搒";s:2:"s";s:3:"搓";s:2:"";s:3:"搔";s:2:"ɦ";s:3:"搕";s:2:"t";s:3:"搖";s:2:"u";s:3:"搗";s:2:"v";s:3:"搘";s:2:"w";s:3:"搙";s:2:"x";s:3:"搚";s:2:"y";s:3:"搛";s:2:"";s:3:"搜";s:2:"";s:3:"搝";s:2:"z";s:3:"搞";s:2:"";s:3:"搟";s:2:"{";s:3:"搠";s:2:"";s:3:"搡";s:2:"";s:3:"搢";s:2:"|";s:3:"搣";s:2:"}";s:3:"搤";s:2:"~";s:3:"搥";s:2:"";s:3:"搦";s:2:"";s:3:"搧";s:2:"";s:3:"搨";s:2:"";s:3:"搩";s:2:"";s:3:"搪";s:2:"";s:3:"搫";s:2:"";s:3:"搬";s:2:"";s:3:"搭";s:2:"";s:3:"搮";s:2:"";s:3:"搯";s:2:"";s:3:"搰";s:2:"";s:3:"搱";s:2:"";s:3:"搲";s:2:"";s:3:"搳";s:2:"";s:3:"搴";s:2:"";s:3:"搵";s:2:"";s:3:"搶";s:2:"";s:3:"搷";s:2:"";s:3:"搸";s:2:"";s:3:"搹";s:2:"";s:3:"携";s:2:"Я";s:3:"搻";s:2:"";s:3:"搼";s:2:"";s:3:"搽";s:2:"";s:3:"搾";s:2:"";s:3:"搿";s:2:"";s:3:"摀";s:2:"";s:3:"摁";s:2:"";s:3:"摂";s:2:"";s:3:"摃";s:2:"";s:3:"摄";s:2:"";s:3:"摅";s:2:"";s:3:"摆";s:2:"";s:3:"摇";s:2:"ҡ";s:3:"摈";s:2:"";s:3:"摉";s:2:"";s:3:"摊";s:2:"̯";s:3:"摋";s:2:"";s:3:"摌";s:2:"";s:3:"摍";s:2:"";s:3:"摎";s:2:"";s:3:"摏";s:2:"";s:3:"摐";s:2:"";s:3:"摑";s:2:"";s:3:"摒";s:2:"";s:3:"摓";s:2:"";s:3:"摔";s:2:"ˤ";s:3:"摕";s:2:"";s:3:"摖";s:2:"";s:3:"摗";s:2:"";s:3:"摘";s:2:"ժ";s:3:"摙";s:2:"";s:3:"摚";s:2:"";s:3:"摛";s:2:"";s:3:"摜";s:2:"";s:3:"摝";s:2:"";s:3:"摞";s:2:"";s:3:"摟";s:2:"";s:3:"摠";s:2:"";s:3:"摡";s:2:"";s:3:"摢";s:2:"";s:3:"摣";s:2:"";s:3:"摤";s:2:"";s:3:"摥";s:2:"";s:3:"摦";s:2:"";s:3:"摧";s:2:"";s:3:"摨";s:2:"";s:3:"摩";s:2:"Ħ";s:3:"摪";s:2:"";s:3:"摫";s:2:"";s:3:"摬";s:2:"";s:3:"摭";s:2:"";s:3:"摮";s:2:"";s:3:"摯";s:2:"";s:3:"摰";s:2:"";s:3:"摱";s:2:"";s:3:"摲";s:2:"";s:3:"摳";s:2:"";s:3:"摴";s:2:"";s:3:"摵";s:2:"";s:3:"摶";s:2:"";s:3:"摷";s:2:"";s:3:"摸";s:2:"";s:3:"摹";s:2:"ġ";s:3:"摺";s:2:"ߡ";s:3:"摻";s:2:"";s:3:"摼";s:2:"";s:3:"摽";s:2:"";s:3:"摾";s:2:"";s:3:"摿";s:2:"";s:3:"撀";s:2:"";s:3:"撁";s:2:"";s:3:"撂";s:2:"";s:3:"撃";s:2:"";s:3:"撄";s:2:"";s:3:"撅";s:2:"";s:3:"撆";s:2:"";s:3:"撇";s:2:"Ʋ";s:3:"撈";s:2:"";s:3:"撉";s:2:"";s:3:"撊";s:2:"";s:3:"撋";s:2:"";s:3:"撌";s:2:"";s:3:"撍";s:2:"";s:3:"撎";s:2:"";s:3:"撏";s:2:"";s:3:"撐";s:2:"";s:3:"撑";s:2:"";s:3:"撒";s:2:"";s:3:"撓";s:2:"";s:3:"撔";s:2:"";s:3:"撕";s:2:"˺";s:3:"撖";s:2:"";s:3:"撗";s:2:"";s:3:"撘";s:2:"";s:3:"撙";s:2:"ߤ";s:3:"撚";s:2:"";s:3:"撛";s:2:"";s:3:"撜";s:2:"";s:3:"撝";s:2:"";s:3:"撞";s:2:"ײ";s:3:"撟";s:2:"";s:3:"撠";s:2:"";s:3:"撡";s:2:"";s:3:"撢";s:2:"";s:3:"撣";s:2:"";s:3:"撤";s:2:"";s:3:"撥";s:2:"";s:3:"撦";s:2:"";s:3:"撧";s:2:"";s:3:"撨";s:2:"";s:3:"撩";s:2:"";s:3:"撪";s:2:"";s:3:"撫";s:2:"";s:3:"撬";s:2:"";s:3:"播";s:2:"";s:3:"撮";s:2:"";s:3:"撯";s:2:"";s:3:"撰";s:2:"׫";s:3:"撱";s:2:"";s:3:"撲";s:2:"";s:3:"撳";s:2:"";s:3:"撴";s:2:"";s:3:"撵";s:2:"";s:3:"撶";s:2:"";s:3:"撷";s:2:"ߢ";s:3:"撸";s:2:"ߣ";s:3:"撹";s:2:"";s:3:"撺";s:2:"ߥ";s:3:"撻";s:2:"";s:3:"撼";s:2:"";s:3:"撽";s:2:"";s:3:"撾";s:2:"";s:3:"撿";s:2:"";s:3:"擀";s:2:"ߦ";s:3:"擁";s:2:"";s:3:"擂";s:2:"";s:3:"擃";s:2:"";s:3:"擄";s:2:"";s:3:"擅";s:2:"";s:3:"擆";s:2:"";s:3:"擇";s:2:"";s:3:"擈";s:2:"";s:3:"擉";s:2:"";s:3:"擊";s:2:"";s:3:"擋";s:2:"";s:3:"擌";s:2:"";s:3:"操";s:2:"";s:3:"擎";s:2:"";s:3:"擏";s:2:"";s:3:"擐";s:2:"ߧ";s:3:"擑";s:2:"";s:3:"擒";s:2:"";s:3:"擓";s:2:"";s:3:"擔";s:2:"";s:3:"擕";s:2:"";s:3:"擖";s:2:"";s:3:"擗";s:2:"ߨ";s:3:"擘";s:2:"";s:3:"擙";s:2:"";s:3:"據";s:2:"";s:3:"擛";s:2:"@";s:3:"擜";s:2:"A";s:3:"擝";s:2:"B";s:3:"擞";s:2:"";s:3:"擟";s:2:"C";s:3:"擠";s:2:"D";s:3:"擡";s:2:"E";s:3:"擢";s:2:"ߪ";s:3:"擣";s:2:"F";s:3:"擤";s:2:"ߩ";s:3:"擥";s:2:"G";s:3:"擦";s:2:"";s:3:"擧";s:2:"H";s:3:"擨";s:2:"I";s:3:"擩";s:2:"J";s:3:"擪";s:2:"K";s:3:"擫";s:2:"L";s:3:"擬";s:2:"M";s:3:"擭";s:2:"N";s:3:"擮";s:2:"O";s:3:"擯";s:2:"P";s:3:"擰";s:2:"Q";s:3:"擱";s:2:"R";s:3:"擲";s:2:"S";s:3:"擳";s:2:"T";s:3:"擴";s:2:"U";s:3:"擵";s:2:"V";s:3:"擶";s:2:"W";s:3:"擷";s:2:"X";s:3:"擸";s:2:"Y";s:3:"擹";s:2:"Z";s:3:"擺";s:2:"[";s:3:"擻";s:2:"\";s:3:"擼";s:2:"]";s:3:"擽";s:2:"^";s:3:"擾";s:2:"_";s:3:"擿";s:2:"`";s:3:"攀";s:2:"";s:3:"攁";s:2:"a";s:3:"攂";s:2:"b";s:3:"攃";s:2:"c";s:3:"攄";s:2:"d";s:3:"攅";s:2:"e";s:3:"攆";s:2:"f";s:3:"攇";s:2:"g";s:3:"攈";s:2:"h";s:3:"攉";s:2:"߫";s:3:"攊";s:2:"i";s:3:"攋";s:2:"j";s:3:"攌";s:2:"k";s:3:"攍";s:2:"l";s:3:"攎";s:2:"m";s:3:"攏";s:2:"n";s:3:"攐";s:2:"o";s:3:"攑";s:2:"p";s:3:"攒";s:2:"";s:3:"攓";s:2:"q";s:3:"攔";s:2:"r";s:3:"攕";s:2:"s";s:3:"攖";s:2:"t";s:3:"攗";s:2:"u";s:3:"攘";s:2:"";s:3:"攙";s:2:"v";s:3:"攚";s:2:"w";s:3:"攛";s:2:"x";s:3:"攜";s:2:"y";s:3:"攝";s:2:"z";s:3:"攞";s:2:"{";s:3:"攟";s:2:"|";s:3:"攠";s:2:"}";s:3:"攡";s:2:"~";s:3:"攢";s:2:"";s:3:"攣";s:2:"";s:3:"攤";s:2:"";s:3:"攥";s:2:"߬";s:3:"攦";s:2:"";s:3:"攧";s:2:"";s:3:"攨";s:2:"";s:3:"攩";s:2:"";s:3:"攪";s:2:"";s:3:"攫";s:2:"";s:3:"攬";s:2:"";s:3:"攭";s:2:"";s:3:"攮";s:2:"߭";s:3:"支";s:2:"֧";s:3:"攰";s:2:"";s:3:"攱";s:2:"";s:3:"攲";s:2:"";s:3:"攳";s:2:"";s:3:"攴";s:2:"";s:3:"攵";s:2:"";s:3:"收";s:2:"";s:3:"攷";s:2:"";s:3:"攸";s:2:"";s:3:"改";s:2:"";s:3:"攺";s:2:"";s:3:"攻";s:2:"";s:3:"攼";s:2:"";s:3:"攽";s:2:"";s:3:"放";s:2:"";s:3:"政";s:2:"";s:3:"敀";s:2:"";s:3:"敁";s:2:"";s:3:"敂";s:2:"";s:3:"敃";s:2:"";s:3:"敄";s:2:"";s:3:"故";s:2:"";s:3:"敆";s:2:"";s:3:"敇";s:2:"";s:3:"效";s:2:"Ч";s:3:"敉";s:2:"";s:3:"敊";s:2:"";s:3:"敋";s:2:"";s:3:"敌";s:2:"";s:3:"敍";s:2:"";s:3:"敎";s:2:"";s:3:"敏";s:2:"";s:3:"敐";s:2:"";s:3:"救";s:2:"";s:3:"敒";s:2:"";s:3:"敓";s:2:"";s:3:"敔";s:2:"";s:3:"敕";s:2:"";s:3:"敖";s:2:"";s:3:"敗";s:2:"";s:3:"敘";s:2:"";s:3:"教";s:2:"";s:3:"敚";s:2:"";s:3:"敛";s:2:"";s:3:"敜";s:2:"";s:3:"敝";s:2:"";s:3:"敞";s:2:"";s:3:"敟";s:2:"";s:3:"敠";s:2:"";s:3:"敡";s:2:"";s:3:"敢";s:2:"";s:3:"散";s:2:"ɢ";s:3:"敤";s:2:"";s:3:"敥";s:2:"";s:3:"敦";s:2:"";s:3:"敧";s:2:"";s:3:"敨";s:2:"";s:3:"敩";s:2:"";s:3:"敪";s:2:"";s:3:"敫";s:2:"";s:3:"敬";s:2:"";s:3:"敭";s:2:"";s:3:"敮";s:2:"";s:3:"敯";s:2:"";s:3:"数";s:2:"";s:3:"敱";s:2:"";s:3:"敲";s:2:"";s:3:"敳";s:2:"";s:3:"整";s:2:"";s:3:"敵";s:2:"";s:3:"敶";s:2:"";s:3:"敷";s:2:"";s:3:"數";s:2:"";s:3:"敹";s:2:"";s:3:"敺";s:2:"";s:3:"敻";s:2:"";s:3:"敼";s:2:"";s:3:"敽";s:2:"";s:3:"敾";s:2:"";s:3:"敿";s:2:"";s:3:"斀";s:2:"";s:3:"斁";s:2:"";s:3:"斂";s:2:"";s:3:"斃";s:2:"";s:3:"斄";s:2:"";s:3:"斅";s:2:"";s:3:"斆";s:2:"";s:3:"文";s:2:"";s:3:"斈";s:2:"";s:3:"斉";s:2:"";s:3:"斊";s:2:"";s:3:"斋";s:2:"ի";s:3:"斌";s:2:"";s:3:"斍";s:2:"";s:3:"斎";s:2:"";s:3:"斏";s:2:"";s:3:"斐";s:2:"";s:3:"斑";s:2:"";s:3:"斒";s:2:"";s:3:"斓";s:2:"";s:3:"斔";s:2:"";s:3:"斕";s:2:"";s:3:"斖";s:2:"";s:3:"斗";s:2:"";s:3:"斘";s:2:"";s:3:"料";s:2:"";s:3:"斚";s:2:"";s:3:"斛";s:2:"";s:3:"斜";s:2:"б";s:3:"斝";s:2:"";s:3:"斞";s:2:"";s:3:"斟";s:2:"";s:3:"斠";s:2:"";s:3:"斡";s:2:"";s:3:"斢";s:2:"";s:3:"斣";s:2:"";s:3:"斤";s:2:"";s:3:"斥";s:2:"";s:3:"斦";s:2:"";s:3:"斧";s:2:"";s:3:"斨";s:2:"";s:3:"斩";s:2:"ն";s:3:"斪";s:2:"";s:3:"斫";s:2:"";s:3:"斬";s:2:"";s:3:"断";s:2:"";s:3:"斮";s:2:"";s:3:"斯";s:2:"˹";s:3:"新";s:2:"";s:3:"斱";s:2:"";s:3:"斲";s:2:"";s:3:"斳";s:2:"";s:3:"斴";s:2:"";s:3:"斵";s:2:"";s:3:"斶";s:2:"";s:3:"斷";s:2:"";s:3:"斸";s:2:"";s:3:"方";s:2:"";s:3:"斺";s:2:"";s:3:"斻";s:2:"";s:3:"於";s:2:"";s:3:"施";s:2:"ʩ";s:3:"斾";s:2:"";s:3:"斿";s:2:"";s:3:"旀";s:2:"";s:3:"旁";s:2:"";s:3:"旂";s:2:"";s:3:"旃";s:2:"";s:3:"旄";s:2:"";s:3:"旅";s:2:"";s:3:"旆";s:2:"";s:3:"旇";s:2:"";s:3:"旈";s:2:"";s:3:"旉";s:2:"";s:3:"旊";s:2:"";s:3:"旋";s:2:"";s:3:"旌";s:2:"";s:3:"旍";s:2:"";s:3:"旎";s:2:"";s:3:"族";s:2:"";s:3:"旐";s:2:"";s:3:"旑";s:2:"";s:3:"旒";s:2:"";s:3:"旓";s:2:"";s:3:"旔";s:2:"";s:3:"旕";s:2:"";s:3:"旖";s:2:"";s:3:"旗";s:2:"";s:3:"旘";s:2:"";s:3:"旙";s:2:"";s:3:"旚";s:2:"";s:3:"旛";s:2:"";s:3:"旜";s:2:"";s:3:"旝";s:2:"";s:3:"旞";s:2:"";s:3:"旟";s:2:"";s:3:"无";s:2:"";s:3:"旡";s:2:"";s:3:"既";s:2:"";s:3:"旣";s:2:"";s:3:"旤";s:2:"";s:3:"日";s:2:"";s:3:"旦";s:2:"";s:3:"旧";s:2:"";s:3:"旨";s:2:"ּ";s:3:"早";s:2:"";s:3:"旪";s:2:"";s:3:"旫";s:2:"";s:3:"旬";s:2:"Ѯ";s:3:"旭";s:2:"";s:3:"旮";s:2:"";s:3:"旯";s:2:"";s:3:"旰";s:2:"";s:3:"旱";s:2:"";s:3:"旲";s:2:"@";s:3:"旳";s:2:"A";s:3:"旴";s:2:"B";s:3:"旵";s:2:"C";s:3:"时";s:2:"ʱ";s:3:"旷";s:2:"";s:3:"旸";s:2:"D";s:3:"旹";s:2:"E";s:3:"旺";s:2:"";s:3:"旻";s:2:"F";s:3:"旼";s:2:"G";s:3:"旽";s:2:"H";s:3:"旾";s:2:"I";s:3:"旿";s:2:"J";s:3:"昀";s:2:"";s:3:"昁";s:2:"K";s:3:"昂";s:2:"";s:3:"昃";s:2:"";s:3:"昄";s:2:"L";s:3:"昅";s:2:"M";s:3:"昆";s:2:"";s:3:"昇";s:2:"N";s:3:"昈";s:2:"O";s:3:"昉";s:2:"P";s:3:"昊";s:2:"";s:3:"昋";s:2:"Q";s:3:"昌";s:2:"";s:3:"昍";s:2:"R";s:3:"明";s:2:"";s:3:"昏";s:2:"";s:3:"昐";s:2:"S";s:3:"昑";s:2:"T";s:3:"昒";s:2:"U";s:3:"易";s:2:"";s:3:"昔";s:2:"";s:3:"昕";s:2:"";s:3:"昖";s:2:"V";s:3:"昗";s:2:"W";s:3:"昘";s:2:"X";s:3:"昙";s:2:"";s:3:"昚";s:2:"Y";s:3:"昛";s:2:"Z";s:3:"昜";s:2:"[";s:3:"昝";s:2:"";s:3:"昞";s:2:"\";s:3:"星";s:2:"";s:3:"映";s:2:"ӳ";s:3:"昡";s:2:"]";s:3:"昢";s:2:"^";s:3:"昣";s:2:"_";s:3:"昤";s:2:"`";s:3:"春";s:2:"";s:3:"昦";s:2:"a";s:3:"昧";s:2:"";s:3:"昨";s:2:"";s:3:"昩";s:2:"b";s:3:"昪";s:2:"c";s:3:"昫";s:2:"d";s:3:"昬";s:2:"e";s:3:"昭";s:2:"";s:3:"昮";s:2:"f";s:3:"是";s:2:"";s:3:"昰";s:2:"g";s:3:"昱";s:2:"";s:3:"昲";s:2:"h";s:3:"昳";s:2:"i";s:3:"昴";s:2:"";s:3:"昵";s:2:"";s:3:"昶";s:2:"";s:3:"昷";s:2:"j";s:3:"昸";s:2:"k";s:3:"昹";s:2:"l";s:3:"昺";s:2:"m";s:3:"昻";s:2:"n";s:3:"昼";s:2:"";s:3:"昽";s:2:"o";s:3:"显";s:2:"";s:3:"昿";s:2:"p";s:3:"晀";s:2:"q";s:3:"晁";s:2:"";s:3:"時";s:2:"r";s:3:"晃";s:2:"";s:3:"晄";s:2:"s";s:3:"晅";s:2:"t";s:3:"晆";s:2:"u";s:3:"晇";s:2:"v";s:3:"晈";s:2:"w";s:3:"晉";s:2:"x";s:3:"晊";s:2:"y";s:3:"晋";s:2:"";s:3:"晌";s:2:"";s:3:"晍";s:2:"z";s:3:"晎";s:2:"{";s:3:"晏";s:2:"";s:3:"晐";s:2:"|";s:3:"晑";s:2:"}";s:3:"晒";s:2:"ɹ";s:3:"晓";s:2:"";s:3:"晔";s:2:"";s:3:"晕";s:2:"";s:3:"晖";s:2:"";s:3:"晗";s:2:"";s:3:"晘";s:2:"~";s:3:"晙";s:2:"";s:3:"晚";s:2:"";s:3:"晛";s:2:"";s:3:"晜";s:2:"";s:3:"晝";s:2:"";s:3:"晞";s:2:"";s:3:"晟";s:2:"";s:3:"晠";s:2:"";s:3:"晡";s:2:"";s:3:"晢";s:2:"";s:3:"晣";s:2:"";s:3:"晤";s:2:"";s:3:"晥";s:2:"";s:3:"晦";s:2:"";s:3:"晧";s:2:"";s:3:"晨";s:2:"";s:3:"晩";s:2:"";s:3:"晪";s:2:"";s:3:"晫";s:2:"";s:3:"晬";s:2:"";s:3:"晭";s:2:"";s:3:"普";s:2:"";s:3:"景";s:2:"";s:3:"晰";s:2:"";s:3:"晱";s:2:"";s:3:"晲";s:2:"";s:3:"晳";s:2:"";s:3:"晴";s:2:"";s:3:"晵";s:2:"";s:3:"晶";s:2:"";s:3:"晷";s:2:"";s:3:"晸";s:2:"";s:3:"晹";s:2:"";s:3:"智";s:2:"";s:3:"晻";s:2:"";s:3:"晼";s:2:"";s:3:"晽";s:2:"";s:3:"晾";s:2:"";s:3:"晿";s:2:"";s:3:"暀";s:2:"";s:3:"暁";s:2:"";s:3:"暂";s:2:"";s:3:"暃";s:2:"";s:3:"暄";s:2:"";s:3:"暅";s:2:"";s:3:"暆";s:2:"";s:3:"暇";s:2:"Ͼ";s:3:"暈";s:2:"";s:3:"暉";s:2:"";s:3:"暊";s:2:"";s:3:"暋";s:2:"";s:3:"暌";s:2:"";s:3:"暍";s:2:"";s:3:"暎";s:2:"";s:3:"暏";s:2:"";s:3:"暐";s:2:"";s:3:"暑";s:2:"";s:3:"暒";s:2:"";s:3:"暓";s:2:"";s:3:"暔";s:2:"";s:3:"暕";s:2:"";s:3:"暖";s:2:"ů";s:3:"暗";s:2:"";s:3:"暘";s:2:"";s:3:"暙";s:2:"";s:3:"暚";s:2:"";s:3:"暛";s:2:"";s:3:"暜";s:2:"";s:3:"暝";s:2:"";s:3:"暞";s:2:"";s:3:"暟";s:2:"";s:3:"暠";s:2:"";s:3:"暡";s:2:"";s:3:"暢";s:2:"";s:3:"暣";s:2:"";s:3:"暤";s:2:"";s:3:"暥";s:2:"";s:3:"暦";s:2:"";s:3:"暧";s:2:"";s:3:"暨";s:2:"";s:3:"暩";s:2:"";s:3:"暪";s:2:"";s:3:"暫";s:2:"";s:3:"暬";s:2:"";s:3:"暭";s:2:"";s:3:"暮";s:2:"ĺ";s:3:"暯";s:2:"";s:3:"暰";s:2:"";s:3:"暱";s:2:"";s:3:"暲";s:2:"";s:3:"暳";s:2:"";s:3:"暴";s:2:"";s:3:"暵";s:2:"";s:3:"暶";s:2:"";s:3:"暷";s:2:"";s:3:"暸";s:2:"";s:3:"暹";s:2:"";s:3:"暺";s:2:"";s:3:"暻";s:2:"";s:3:"暼";s:2:"";s:3:"暽";s:2:"";s:3:"暾";s:2:"";s:3:"暿";s:2:"";s:3:"曀";s:2:"";s:3:"曁";s:2:"";s:3:"曂";s:2:"";s:3:"曃";s:2:"";s:3:"曄";s:2:"";s:3:"曅";s:2:"";s:3:"曆";s:2:"";s:3:"曇";s:2:"";s:3:"曈";s:2:"";s:3:"曉";s:2:"";s:3:"曊";s:2:"";s:3:"曋";s:2:"";s:3:"曌";s:2:"";s:3:"曍";s:2:"";s:3:"曎";s:2:"";s:3:"曏";s:2:"";s:3:"曐";s:2:"";s:3:"曑";s:2:"";s:3:"曒";s:2:"";s:3:"曓";s:2:"";s:3:"曔";s:2:"";s:3:"曕";s:2:"";s:3:"曖";s:2:"";s:3:"曗";s:2:"";s:3:"曘";s:2:"";s:3:"曙";s:2:"";s:3:"曚";s:2:"";s:3:"曛";s:2:"";s:3:"曜";s:2:"";s:3:"曝";s:2:"";s:3:"曞";s:2:"";s:3:"曟";s:2:"";s:3:"曠";s:2:"";s:3:"曡";s:2:"";s:3:"曢";s:2:"";s:3:"曣";s:2:"";s:3:"曤";s:2:"";s:3:"曥";s:2:"";s:3:"曦";s:2:"";s:3:"曧";s:2:"";s:3:"曨";s:2:"";s:3:"曩";s:2:"";s:3:"曪";s:2:"";s:3:"曫";s:2:"";s:3:"曬";s:2:"";s:3:"曭";s:2:"";s:3:"曮";s:2:"";s:3:"曯";s:2:"";s:3:"曰";s:2:"Ի";s:3:"曱";s:2:"";s:3:"曲";s:2:"";s:3:"曳";s:2:"ҷ";s:3:"更";s:2:"";s:3:"曵";s:2:"";s:3:"曶";s:2:"";s:3:"曷";s:2:"";s:3:"書";s:2:"";s:3:"曹";s:2:"";s:3:"曺";s:2:"";s:3:"曻";s:2:"";s:3:"曼";s:2:"";s:3:"曽";s:2:"";s:3:"曾";s:2:"";s:3:"替";s:2:"";s:3:"最";s:2:"";s:3:"朁";s:2:"";s:3:"朂";s:2:"";s:3:"會";s:2:"";s:3:"朄";s:2:"@";s:3:"朅";s:2:"A";s:3:"朆";s:2:"B";s:3:"朇";s:2:"C";s:3:"月";s:2:"";s:3:"有";s:2:"";s:3:"朊";s:2:"";s:3:"朋";s:2:"";s:3:"朌";s:2:"D";s:3:"服";s:2:"";s:3:"朎";s:2:"E";s:3:"朏";s:2:"F";s:3:"朐";s:2:"";s:3:"朑";s:2:"G";s:3:"朒";s:2:"H";s:3:"朓";s:2:"I";s:3:"朔";s:2:"˷";s:3:"朕";s:2:"";s:3:"朖";s:2:"J";s:3:"朗";s:2:"";s:3:"朘";s:2:"K";s:3:"朙";s:2:"L";s:3:"朚";s:2:"M";s:3:"望";s:2:"";s:3:"朜";s:2:"N";s:3:"朝";s:2:"";s:3:"朞";s:2:"O";s:3:"期";s:2:"";s:3:"朠";s:2:"P";s:3:"朡";s:2:"Q";s:3:"朢";s:2:"R";s:3:"朣";s:2:"S";s:3:"朤";s:2:"T";s:3:"朥";s:2:"U";s:3:"朦";s:2:"";s:3:"朧";s:2:"V";s:3:"木";s:2:"ľ";s:3:"朩";s:2:"W";s:3:"未";s:2:"δ";s:3:"末";s:2:"ĩ";s:3:"本";s:2:"";s:3:"札";s:2:"";s:3:"朮";s:2:"X";s:3:"术";s:2:"";s:3:"朰";s:2:"Y";s:3:"朱";s:2:"";s:3:"朲";s:2:"Z";s:3:"朳";s:2:"[";s:3:"朴";s:2:"";s:3:"朵";s:2:"";s:3:"朶";s:2:"\";s:3:"朷";s:2:"]";s:3:"朸";s:2:"^";s:3:"朹";s:2:"_";s:3:"机";s:2:"";s:3:"朻";s:2:"`";s:3:"朼";s:2:"a";s:3:"朽";s:2:"";s:3:"朾";s:2:"b";s:3:"朿";s:2:"c";s:3:"杀";s:2:"ɱ";s:3:"杁";s:2:"d";s:3:"杂";s:2:"";s:3:"权";s:2:"Ȩ";s:3:"杄";s:2:"e";s:3:"杅";s:2:"f";s:3:"杆";s:2:"";s:3:"杇";s:2:"g";s:3:"杈";s:2:"";s:3:"杉";s:2:"ɼ";s:3:"杊";s:2:"h";s:3:"杋";s:2:"i";s:3:"杌";s:2:"";s:3:"杍";s:2:"j";s:3:"李";s:2:"";s:3:"杏";s:2:"";s:3:"材";s:2:"";s:3:"村";s:2:"";s:3:"杒";s:2:"k";s:3:"杓";s:2:"";s:3:"杔";s:2:"l";s:3:"杕";s:2:"m";s:3:"杖";s:2:"";s:3:"杗";s:2:"n";s:3:"杘";s:2:"o";s:3:"杙";s:2:"p";s:3:"杚";s:2:"q";s:3:"杛";s:2:"r";s:3:"杜";s:2:"";s:3:"杝";s:2:"s";s:3:"杞";s:2:"";s:3:"束";s:2:"";s:3:"杠";s:2:"";s:3:"条";s:2:"";s:3:"杢";s:2:"t";s:3:"杣";s:2:"u";s:3:"杤";s:2:"v";s:3:"来";s:2:"";s:3:"杦";s:2:"w";s:3:"杧";s:2:"x";s:3:"杨";s:2:"";s:3:"杩";s:2:"";s:3:"杪";s:2:"";s:3:"杫";s:2:"y";s:3:"杬";s:2:"z";s:3:"杭";s:2:"";s:3:"杮";s:2:"{";s:3:"杯";s:2:"";s:3:"杰";s:2:"";s:3:"東";s:2:"|";s:3:"杲";s:2:"";s:3:"杳";s:2:"";s:3:"杴";s:2:"}";s:3:"杵";s:2:"";s:3:"杶";s:2:"~";s:3:"杷";s:2:"";s:3:"杸";s:2:"";s:3:"杹";s:2:"";s:3:"杺";s:2:"";s:3:"杻";s:2:"";s:3:"杼";s:2:"";s:3:"杽";s:2:"";s:3:"松";s:2:"";s:3:"板";s:2:"";s:3:"枀";s:2:"";s:3:"极";s:2:"";s:3:"枂";s:2:"";s:3:"枃";s:2:"";s:3:"构";s:2:"";s:3:"枅";s:2:"";s:3:"枆";s:2:"";s:3:"枇";s:2:"";s:3:"枈";s:2:"";s:3:"枉";s:2:"";s:3:"枊";s:2:"";s:3:"枋";s:2:"";s:3:"枌";s:2:"";s:3:"枍";s:2:"";s:3:"枎";s:2:"";s:3:"枏";s:2:"";s:3:"析";s:2:"";s:3:"枑";s:2:"";s:3:"枒";s:2:"";s:3:"枓";s:2:"";s:3:"枔";s:2:"";s:3:"枕";s:2:"";s:3:"枖";s:2:"";s:3:"林";s:2:"";s:3:"枘";s:2:"";s:3:"枙";s:2:"";s:3:"枚";s:2:"ö";s:3:"枛";s:2:"";s:3:"果";s:2:"";s:3:"枝";s:2:"֦";s:3:"枞";s:2:"";s:3:"枟";s:2:"";s:3:"枠";s:2:"";s:3:"枡";s:2:"";s:3:"枢";s:2:"";s:3:"枣";s:2:"";s:3:"枤";s:2:"";s:3:"枥";s:2:"";s:3:"枦";s:2:"";s:3:"枧";s:2:"";s:3:"枨";s:2:"";s:3:"枩";s:2:"";s:3:"枪";s:2:"ǹ";s:3:"枫";s:2:"";s:3:"枬";s:2:"";s:3:"枭";s:2:"";s:3:"枮";s:2:"";s:3:"枯";s:2:"";s:3:"枰";s:2:"";s:3:"枱";s:2:"";s:3:"枲";s:2:"";s:3:"枳";s:2:"";s:3:"枴";s:2:"";s:3:"枵";s:2:"";s:3:"架";s:2:"";s:3:"枷";s:2:"";s:3:"枸";s:2:"";s:3:"枹";s:2:"";s:3:"枺";s:2:"";s:3:"枻";s:2:"";s:3:"枼";s:2:"";s:3:"枽";s:2:"";s:3:"枾";s:2:"";s:3:"枿";s:2:"";s:3:"柀";s:2:"";s:3:"柁";s:2:"";s:3:"柂";s:2:"";s:3:"柃";s:2:"";s:3:"柄";s:2:"";s:3:"柅";s:2:"";s:3:"柆";s:2:"";s:3:"柇";s:2:"";s:3:"柈";s:2:"";s:3:"柉";s:2:"";s:3:"柊";s:2:"";s:3:"柋";s:2:"";s:3:"柌";s:2:"";s:3:"柍";s:2:"";s:3:"柎";s:2:"";s:3:"柏";s:2:"";s:3:"某";s:2:"ĳ";s:3:"柑";s:2:"";s:3:"柒";s:2:"";s:3:"染";s:2:"Ⱦ";s:3:"柔";s:2:"";s:3:"柕";s:2:"";s:3:"柖";s:2:"";s:3:"柗";s:2:"";s:3:"柘";s:2:"";s:3:"柙";s:2:"";s:3:"柚";s:2:"";s:3:"柛";s:2:"";s:3:"柜";s:2:"";s:3:"柝";s:2:"";s:3:"柞";s:2:"";s:3:"柟";s:2:"";s:3:"柠";s:2:"";s:3:"柡";s:2:"";s:3:"柢";s:2:"";s:3:"柣";s:2:"";s:3:"柤";s:2:"";s:3:"查";s:2:"";s:3:"柦";s:2:"";s:3:"柧";s:2:"";s:3:"柨";s:2:"";s:3:"柩";s:2:"";s:3:"柪";s:2:"";s:3:"柫";s:2:"";s:3:"柬";s:2:"";s:3:"柭";s:2:"";s:3:"柮";s:2:"";s:3:"柯";s:2:"";s:3:"柰";s:2:"";s:3:"柱";s:2:"";s:3:"柲";s:2:"";s:3:"柳";s:2:"";s:3:"柴";s:2:"";s:3:"柵";s:2:"";s:3:"柶";s:2:"";s:3:"柷";s:2:"";s:3:"柸";s:2:"";s:3:"柹";s:2:"";s:3:"柺";s:2:"";s:3:"査";s:2:"";s:3:"柼";s:2:"";s:3:"柽";s:2:"";s:3:"柾";s:2:"";s:3:"柿";s:2:"";s:3:"栀";s:2:"";s:3:"栁";s:2:"";s:3:"栂";s:2:"";s:3:"栃";s:2:"";s:3:"栄";s:2:"";s:3:"栅";s:2:"դ";s:3:"栆";s:2:"";s:3:"标";s:2:"";s:3:"栈";s:2:"ջ";s:3:"栉";s:2:"";s:3:"栊";s:2:"";s:3:"栋";s:2:"";s:3:"栌";s:2:"";s:3:"栍";s:2:"";s:3:"栎";s:2:"";s:3:"栏";s:2:"";s:3:"栐";s:2:"";s:3:"树";s:2:"";s:3:"栒";s:2:"";s:3:"栓";s:2:"˨";s:3:"栔";s:2:"";s:3:"栕";s:2:"";s:3:"栖";s:2:"";s:3:"栗";s:2:"";s:3:"栘";s:2:"";s:3:"栙";s:2:"";s:3:"栚";s:2:"";s:3:"栛";s:2:"";s:3:"栜";s:2:"";s:3:"栝";s:2:"";s:3:"栞";s:2:"";s:3:"栟";s:2:"";s:3:"栠";s:2:"";s:3:"校";s:2:"У";s:3:"栢";s:2:"";s:3:"栣";s:2:"";s:3:"栤";s:2:"";s:3:"栥";s:2:"";s:3:"栦";s:2:"";s:3:"栧";s:2:"";s:3:"栨";s:2:"";s:3:"栩";s:2:"";s:3:"株";s:2:"";s:3:"栫";s:2:"";s:3:"栬";s:2:"";s:3:"栭";s:2:"";s:3:"栮";s:2:"";s:3:"栯";s:2:"";s:3:"栰";s:2:"";s:3:"栱";s:2:"";s:3:"栲";s:2:"";s:3:"栳";s:2:"";s:3:"栴";s:2:"";s:3:"栵";s:2:"";s:3:"栶";s:2:"";s:3:"样";s:2:"";s:3:"核";s:2:"";s:3:"根";s:2:"";s:3:"栺";s:2:"";s:3:"栻";s:2:"";s:3:"格";s:2:"";s:3:"栽";s:2:"";s:3:"栾";s:2:"";s:3:"栿";s:2:"";s:3:"桀";s:2:"";s:3:"桁";s:2:"";s:3:"桂";s:2:"";s:3:"桃";s:2:"";s:3:"桄";s:2:"";s:3:"桅";s:2:"Φ";s:3:"框";s:2:"";s:3:"桇";s:2:"";s:3:"案";s:2:"";s:3:"桉";s:2:"";s:3:"桊";s:2:"";s:3:"桋";s:2:"";s:3:"桌";s:2:"";s:3:"桍";s:2:"";s:3:"桎";s:2:"";s:3:"桏";s:2:"";s:3:"桐";s:2:"ͩ";s:3:"桑";s:2:"ɣ";s:3:"桒";s:2:"";s:3:"桓";s:2:"";s:3:"桔";s:2:"";s:3:"桕";s:2:"";s:3:"桖";s:2:"";s:3:"桗";s:2:"";s:3:"桘";s:2:"";s:3:"桙";s:2:"";s:3:"桚";s:2:"";s:3:"桛";s:2:"";s:3:"桜";s:2:"@";s:3:"桝";s:2:"A";s:3:"桞";s:2:"B";s:3:"桟";s:2:"C";s:3:"桠";s:2:"";s:3:"桡";s:2:"";s:3:"桢";s:2:"";s:3:"档";s:2:"";s:3:"桤";s:2:"";s:3:"桥";s:2:"";s:3:"桦";s:2:"";s:3:"桧";s:2:"";s:3:"桨";s:2:"";s:3:"桩";s:2:"׮";s:3:"桪";s:2:"D";s:3:"桫";s:2:"";s:3:"桬";s:2:"E";s:3:"桭";s:2:"F";s:3:"桮";s:2:"G";s:3:"桯";s:2:"H";s:3:"桰";s:2:"I";s:3:"桱";s:2:"J";s:3:"桲";s:2:"K";s:3:"桳";s:2:"L";s:3:"桴";s:2:"";s:3:"桵";s:2:"M";s:3:"桶";s:2:"Ͱ";s:3:"桷";s:2:"";s:3:"桸";s:2:"N";s:3:"桹";s:2:"O";s:3:"桺";s:2:"P";s:3:"桻";s:2:"Q";s:3:"桼";s:2:"R";s:3:"桽";s:2:"S";s:3:"桾";s:2:"T";s:3:"桿";s:2:"U";s:3:"梀";s:2:"V";s:3:"梁";s:2:"";s:3:"梂";s:2:"W";s:3:"梃";s:2:"";s:3:"梄";s:2:"X";s:3:"梅";s:2:"÷";s:3:"梆";s:2:"";s:3:"梇";s:2:"Y";s:3:"梈";s:2:"Z";s:3:"梉";s:2:"[";s:3:"梊";s:2:"\";s:3:"梋";s:2:"]";s:3:"梌";s:2:"^";s:3:"梍";s:2:"_";s:3:"梎";s:2:"`";s:3:"梏";s:2:"";s:3:"梐";s:2:"a";s:3:"梑";s:2:"b";s:3:"梒";s:2:"c";s:3:"梓";s:2:"";s:3:"梔";s:2:"d";s:3:"梕";s:2:"e";s:3:"梖";s:2:"f";s:3:"梗";s:2:"";s:3:"梘";s:2:"g";s:3:"梙";s:2:"h";s:3:"梚";s:2:"i";s:3:"梛";s:2:"j";s:3:"梜";s:2:"k";s:3:"條";s:2:"l";s:3:"梞";s:2:"m";s:3:"梟";s:2:"n";s:3:"梠";s:2:"o";s:3:"梡";s:2:"p";s:3:"梢";s:2:"";s:3:"梣";s:2:"q";s:3:"梤";s:2:"r";s:3:"梥";s:2:"s";s:3:"梦";s:2:"";s:3:"梧";s:2:"";s:3:"梨";s:2:"";s:3:"梩";s:2:"t";s:3:"梪";s:2:"u";s:3:"梫";s:2:"v";s:3:"梬";s:2:"w";s:3:"梭";s:2:"";s:3:"梮";s:2:"x";s:3:"梯";s:2:"";s:3:"械";s:2:"е";s:3:"梱";s:2:"y";s:3:"梲";s:2:"z";s:3:"梳";s:2:"";s:3:"梴";s:2:"{";s:3:"梵";s:2:"";s:3:"梶";s:2:"|";s:3:"梷";s:2:"}";s:3:"梸";s:2:"~";s:3:"梹";s:2:"";s:3:"梺";s:2:"";s:3:"梻";s:2:"";s:3:"梼";s:2:"";s:3:"梽";s:2:"";s:3:"梾";s:2:"";s:3:"梿";s:2:"";s:3:"检";s:2:"";s:3:"棁";s:2:"";s:3:"棂";s:2:"";s:3:"棃";s:2:"";s:3:"棄";s:2:"";s:3:"棅";s:2:"";s:3:"棆";s:2:"";s:3:"棇";s:2:"";s:3:"棈";s:2:"";s:3:"棉";s:2:"";s:3:"棊";s:2:"";s:3:"棋";s:2:"";s:3:"棌";s:2:"";s:3:"棍";s:2:"";s:3:"棎";s:2:"";s:3:"棏";s:2:"";s:3:"棐";s:2:"";s:3:"棑";s:2:"";s:3:"棒";s:2:"";s:3:"棓";s:2:"";s:3:"棔";s:2:"";s:3:"棕";s:2:"";s:3:"棖";s:2:"";s:3:"棗";s:2:"";s:3:"棘";s:2:"";s:3:"棙";s:2:"";s:3:"棚";s:2:"";s:3:"棛";s:2:"";s:3:"棜";s:2:"";s:3:"棝";s:2:"";s:3:"棞";s:2:"";s:3:"棟";s:2:"";s:3:"棠";s:2:"";s:3:"棡";s:2:"";s:3:"棢";s:2:"";s:3:"棣";s:2:"";s:3:"棤";s:2:"";s:3:"棥";s:2:"";s:3:"棦";s:2:"";s:3:"棧";s:2:"";s:3:"棨";s:2:"";s:3:"棩";s:2:"";s:3:"棪";s:2:"";s:3:"棫";s:2:"";s:3:"棬";s:2:"";s:3:"棭";s:2:"";s:3:"森";s:2:"ɭ";s:3:"棯";s:2:"";s:3:"棰";s:2:"";s:3:"棱";s:2:"";s:3:"棲";s:2:"";s:3:"棳";s:2:"";s:3:"棴";s:2:"";s:3:"棵";s:2:"";s:3:"棶";s:2:"";s:3:"棷";s:2:"";s:3:"棸";s:2:"";s:3:"棹";s:2:"";s:3:"棺";s:2:"";s:3:"棻";s:2:"";s:3:"棼";s:2:"";s:3:"棽";s:2:"";s:3:"棾";s:2:"";s:3:"棿";s:2:"";s:3:"椀";s:2:"";s:3:"椁";s:2:"";s:3:"椂";s:2:"";s:3:"椃";s:2:"";s:3:"椄";s:2:"";s:3:"椅";s:2:"";s:3:"椆";s:2:"";s:3:"椇";s:2:"";s:3:"椈";s:2:"";s:3:"椉";s:2:"";s:3:"椊";s:2:"";s:3:"椋";s:2:"";s:3:"椌";s:2:"";s:3:"植";s:2:"ֲ";s:3:"椎";s:2:"׵";s:3:"椏";s:2:"";s:3:"椐";s:2:"";s:3:"椑";s:2:"";s:3:"椒";s:2:"";s:3:"椓";s:2:"";s:3:"椔";s:2:"";s:3:"椕";s:2:"";s:3:"椖";s:2:"";s:3:"椗";s:2:"";s:3:"椘";s:2:"";s:3:"椙";s:2:"";s:3:"椚";s:2:"";s:3:"椛";s:2:"";s:3:"検";s:2:"";s:3:"椝";s:2:"";s:3:"椞";s:2:"";s:3:"椟";s:2:"";s:3:"椠";s:2:"";s:3:"椡";s:2:"";s:3:"椢";s:2:"";s:3:"椣";s:2:"";s:3:"椤";s:2:"";s:3:"椥";s:2:"";s:3:"椦";s:2:"";s:3:"椧";s:2:"";s:3:"椨";s:2:"";s:3:"椩";s:2:"";s:3:"椪";s:2:"";s:3:"椫";s:2:"";s:3:"椬";s:2:"";s:3:"椭";s:2:"";s:3:"椮";s:2:"";s:3:"椯";s:2:"";s:3:"椰";s:2:"Ҭ";s:3:"椱";s:2:"";s:3:"椲";s:2:"";s:3:"椳";s:2:"";s:3:"椴";s:2:"";s:3:"椵";s:2:"";s:3:"椶";s:2:"";s:3:"椷";s:2:"";s:3:"椸";s:2:"";s:3:"椹";s:2:"";s:3:"椺";s:2:"";s:3:"椻";s:2:"";s:3:"椼";s:2:"";s:3:"椽";s:2:"";s:3:"椾";s:2:"";s:3:"椿";s:2:"";s:3:"楀";s:2:"";s:3:"楁";s:2:"";s:3:"楂";s:2:"";s:3:"楃";s:2:"";s:3:"楄";s:2:"";s:3:"楅";s:2:"";s:3:"楆";s:2:"";s:3:"楇";s:2:"";s:3:"楈";s:2:"";s:3:"楉";s:2:"";s:3:"楊";s:2:"";s:3:"楋";s:2:"";s:3:"楌";s:2:"";s:3:"楍";s:2:"";s:3:"楎";s:2:"";s:3:"楏";s:2:"";s:3:"楐";s:2:"";s:3:"楑";s:2:"";s:3:"楒";s:2:"";s:3:"楓";s:2:"";s:3:"楔";s:2:"Ш";s:3:"楕";s:2:"";s:3:"楖";s:2:"";s:3:"楗";s:2:"";s:3:"楘";s:2:"";s:3:"楙";s:2:"";s:3:"楚";s:2:"";s:3:"楛";s:2:"";s:3:"楜";s:2:"";s:3:"楝";s:2:"";s:3:"楞";s:2:"";s:3:"楟";s:2:"";s:3:"楠";s:2:"";s:3:"楡";s:2:"@";s:3:"楢";s:2:"A";s:3:"楣";s:2:"";s:3:"楤";s:2:"B";s:3:"楥";s:2:"C";s:3:"楦";s:2:"";s:3:"楧";s:2:"D";s:3:"楨";s:2:"E";s:3:"楩";s:2:"F";s:3:"楪";s:2:"G";s:3:"楫";s:2:"";s:3:"楬";s:2:"H";s:3:"業";s:2:"I";s:3:"楮";s:2:"";s:3:"楯";s:2:"J";s:3:"楰";s:2:"K";s:3:"楱";s:2:"";s:3:"楲";s:2:"L";s:3:"楳";s:2:"M";s:3:"楴";s:2:"N";s:3:"極";s:2:"O";s:3:"楶";s:2:"P";s:3:"楷";s:2:"";s:3:"楸";s:2:"";s:3:"楹";s:2:"";s:3:"楺";s:2:"Q";s:3:"楻";s:2:"R";s:3:"楼";s:2:"¥";s:3:"楽";s:2:"S";s:3:"楾";s:2:"T";s:3:"楿";s:2:"U";s:3:"榀";s:2:"";s:3:"榁";s:2:"V";s:3:"概";s:2:"";s:3:"榃";s:2:"W";s:3:"榄";s:2:"";s:3:"榅";s:2:"X";s:3:"榆";s:2:"";s:3:"榇";s:2:"";s:3:"榈";s:2:"";s:3:"榉";s:2:"";s:3:"榊";s:2:"Y";s:3:"榋";s:2:"Z";s:3:"榌";s:2:"[";s:3:"榍";s:2:"";s:3:"榎";s:2:"\";s:3:"榏";s:2:"]";s:3:"榐";s:2:"^";s:3:"榑";s:2:"_";s:3:"榒";s:2:"`";s:3:"榓";s:2:"a";s:3:"榔";s:2:"";s:3:"榕";s:2:"";s:3:"榖";s:2:"b";s:3:"榗";s:2:"c";s:3:"榘";s:2:"";s:3:"榙";s:2:"d";s:3:"榚";s:2:"e";s:3:"榛";s:2:"";s:3:"榜";s:2:"";s:3:"榝";s:2:"f";s:3:"榞";s:2:"g";s:3:"榟";s:2:"h";s:3:"榠";s:2:"i";s:3:"榡";s:2:"j";s:3:"榢";s:2:"k";s:3:"榣";s:2:"l";s:3:"榤";s:2:"m";s:3:"榥";s:2:"n";s:3:"榦";s:2:"o";s:3:"榧";s:2:"";s:3:"榨";s:2:"ե";s:3:"榩";s:2:"p";s:3:"榪";s:2:"q";s:3:"榫";s:2:"";s:3:"榬";s:2:"r";s:3:"榭";s:2:"";s:3:"榮";s:2:"s";s:3:"榯";s:2:"t";s:3:"榰";s:2:"u";s:3:"榱";s:2:"";s:3:"榲";s:2:"v";s:3:"榳";s:2:"w";s:3:"榴";s:2:"";s:3:"榵";s:2:"x";s:3:"榶";s:2:"y";s:3:"榷";s:2:"ȶ";s:3:"榸";s:2:"z";s:3:"榹";s:2:"{";s:3:"榺";s:2:"|";s:3:"榻";s:2:"";s:3:"榼";s:2:"}";s:3:"榽";s:2:"~";s:3:"榾";s:2:"";s:3:"榿";s:2:"";s:3:"槀";s:2:"";s:3:"槁";s:2:"";s:3:"槂";s:2:"";s:3:"槃";s:2:"";s:3:"槄";s:2:"";s:3:"槅";s:2:"";s:3:"槆";s:2:"";s:3:"槇";s:2:"";s:3:"槈";s:2:"";s:3:"槉";s:2:"";s:3:"槊";s:2:"";s:3:"構";s:2:"";s:3:"槌";s:2:"";s:3:"槍";s:2:"";s:3:"槎";s:2:"";s:3:"槏";s:2:"";s:3:"槐";s:2:"";s:3:"槑";s:2:"";s:3:"槒";s:2:"";s:3:"槓";s:2:"";s:3:"槔";s:2:"";s:3:"槕";s:2:"";s:3:"槖";s:2:"";s:3:"槗";s:2:"";s:3:"様";s:2:"";s:3:"槙";s:2:"";s:3:"槚";s:2:"";s:3:"槛";s:2:"";s:3:"槜";s:2:"";s:3:"槝";s:2:"";s:3:"槞";s:2:"";s:3:"槟";s:2:"";s:3:"槠";s:2:"";s:3:"槡";s:2:"";s:3:"槢";s:2:"";s:3:"槣";s:2:"";s:3:"槤";s:2:"";s:3:"槥";s:2:"";s:3:"槦";s:2:"";s:3:"槧";s:2:"";s:3:"槨";s:2:"";s:3:"槩";s:2:"";s:3:"槪";s:2:"";s:3:"槫";s:2:"";s:3:"槬";s:2:"";s:3:"槭";s:2:"";s:3:"槮";s:2:"";s:3:"槯";s:2:"";s:3:"槰";s:2:"";s:3:"槱";s:2:"";s:3:"槲";s:2:"";s:3:"槳";s:2:"";s:3:"槴";s:2:"";s:3:"槵";s:2:"";s:3:"槶";s:2:"";s:3:"槷";s:2:"";s:3:"槸";s:2:"";s:3:"槹";s:2:"";s:3:"槺";s:2:"";s:3:"槻";s:2:"";s:3:"槼";s:2:"";s:3:"槽";s:2:"";s:3:"槾";s:2:"";s:3:"槿";s:2:"";s:3:"樀";s:2:"";s:3:"樁";s:2:"";s:3:"樂";s:2:"";s:3:"樃";s:2:"";s:3:"樄";s:2:"";s:3:"樅";s:2:"";s:3:"樆";s:2:"";s:3:"樇";s:2:"";s:3:"樈";s:2:"";s:3:"樉";s:2:"";s:3:"樊";s:2:"";s:3:"樋";s:2:"";s:3:"樌";s:2:"";s:3:"樍";s:2:"";s:3:"樎";s:2:"";s:3:"樏";s:2:"";s:3:"樐";s:2:"";s:3:"樑";s:2:"";s:3:"樒";s:2:"";s:3:"樓";s:2:"";s:3:"樔";s:2:"";s:3:"樕";s:2:"";s:3:"樖";s:2:"";s:3:"樗";s:2:"";s:3:"樘";s:2:"";s:3:"標";s:2:"";s:3:"樚";s:2:"";s:3:"樛";s:2:"";s:3:"樜";s:2:"";s:3:"樝";s:2:"";s:3:"樞";s:2:"";s:3:"樟";s:2:"";s:3:"樠";s:2:"";s:3:"模";s:2:"ģ";s:3:"樢";s:2:"";s:3:"樣";s:2:"";s:3:"樤";s:2:"";s:3:"樥";s:2:"";s:3:"樦";s:2:"";s:3:"樧";s:2:"";s:3:"樨";s:2:"";s:3:"権";s:2:"";s:3:"横";s:2:"";s:3:"樫";s:2:"";s:3:"樬";s:2:"";s:3:"樭";s:2:"";s:3:"樮";s:2:"";s:3:"樯";s:2:"";s:3:"樰";s:2:"";s:3:"樱";s:2:"ӣ";s:3:"樲";s:2:"";s:3:"樳";s:2:"";s:3:"樴";s:2:"";s:3:"樵";s:2:"";s:3:"樶";s:2:"";s:3:"樷";s:2:"";s:3:"樸";s:2:"";s:3:"樹";s:2:"";s:3:"樺";s:2:"";s:3:"樻";s:2:"";s:3:"樼";s:2:"";s:3:"樽";s:2:"";s:3:"樾";s:2:"";s:3:"樿";s:2:"";s:3:"橀";s:2:"";s:3:"橁";s:2:"";s:3:"橂";s:2:"";s:3:"橃";s:2:"";s:3:"橄";s:2:"";s:3:"橅";s:2:"";s:3:"橆";s:2:"";s:3:"橇";s:2:"";s:3:"橈";s:2:"";s:3:"橉";s:2:"";s:3:"橊";s:2:"";s:3:"橋";s:2:"";s:3:"橌";s:2:"";s:3:"橍";s:2:"";s:3:"橎";s:2:"";s:3:"橏";s:2:"";s:3:"橐";s:2:"";s:3:"橑";s:2:"";s:3:"橒";s:2:"";s:3:"橓";s:2:"";s:3:"橔";s:2:"";s:3:"橕";s:2:"";s:3:"橖";s:2:"";s:3:"橗";s:2:"";s:3:"橘";s:2:"";s:3:"橙";s:2:"";s:3:"橚";s:2:"";s:3:"橛";s:2:"";s:3:"橜";s:2:"@";s:3:"橝";s:2:"A";s:3:"橞";s:2:"B";s:3:"機";s:2:"C";s:3:"橠";s:2:"D";s:3:"橡";s:2:"";s:3:"橢";s:2:"E";s:3:"橣";s:2:"F";s:3:"橤";s:2:"G";s:3:"橥";s:2:"";s:3:"橦";s:2:"H";s:3:"橧";s:2:"I";s:3:"橨";s:2:"J";s:3:"橩";s:2:"K";s:3:"橪";s:2:"L";s:3:"橫";s:2:"M";s:3:"橬";s:2:"N";s:3:"橭";s:2:"O";s:3:"橮";s:2:"P";s:3:"橯";s:2:"Q";s:3:"橰";s:2:"R";s:3:"橱";s:2:"";s:3:"橲";s:2:"S";s:3:"橳";s:2:"T";s:3:"橴";s:2:"U";s:3:"橵";s:2:"V";s:3:"橶";s:2:"W";s:3:"橷";s:2:"X";s:3:"橸";s:2:"Y";s:3:"橹";s:2:"";s:3:"橺";s:2:"Z";s:3:"橻";s:2:"[";s:3:"橼";s:2:"";s:3:"橽";s:2:"\";s:3:"橾";s:2:"]";s:3:"橿";s:2:"^";s:3:"檀";s:2:"̴";s:3:"檁";s:2:"_";s:3:"檂";s:2:"`";s:3:"檃";s:2:"a";s:3:"檄";s:2:"ϭ";s:3:"檅";s:2:"b";s:3:"檆";s:2:"c";s:3:"檇";s:2:"d";s:3:"檈";s:2:"e";s:3:"檉";s:2:"f";s:3:"檊";s:2:"g";s:3:"檋";s:2:"h";s:3:"檌";s:2:"i";s:3:"檍";s:2:"j";s:3:"檎";s:2:"";s:3:"檏";s:2:"k";s:3:"檐";s:2:"";s:3:"檑";s:2:"";s:3:"檒";s:2:"l";s:3:"檓";s:2:"m";s:3:"檔";s:2:"n";s:3:"檕";s:2:"o";s:3:"檖";s:2:"p";s:3:"檗";s:2:"";s:3:"檘";s:2:"q";s:3:"檙";s:2:"r";s:3:"檚";s:2:"s";s:3:"檛";s:2:"t";s:3:"檜";s:2:"u";s:3:"檝";s:2:"v";s:3:"檞";s:2:"w";s:3:"檟";s:2:"x";s:3:"檠";s:2:"";s:3:"檡";s:2:"y";s:3:"檢";s:2:"z";s:3:"檣";s:2:"{";s:3:"檤";s:2:"|";s:3:"檥";s:2:"}";s:3:"檦";s:2:"~";s:3:"檧";s:2:"";s:3:"檨";s:2:"";s:3:"檩";s:2:"";s:3:"檪";s:2:"";s:3:"檫";s:2:"";s:3:"檬";s:2:"";s:3:"檭";s:2:"";s:3:"檮";s:2:"";s:3:"檯";s:2:"";s:3:"檰";s:2:"";s:3:"檱";s:2:"";s:3:"檲";s:2:"";s:3:"檳";s:2:"";s:3:"檴";s:2:"";s:3:"檵";s:2:"";s:3:"檶";s:2:"";s:3:"檷";s:2:"";s:3:"檸";s:2:"";s:3:"檹";s:2:"";s:3:"檺";s:2:"";s:3:"檻";s:2:"";s:3:"檼";s:2:"";s:3:"檽";s:2:"";s:3:"檾";s:2:"";s:3:"檿";s:2:"";s:3:"櫀";s:2:"";s:3:"櫁";s:2:"";s:3:"櫂";s:2:"";s:3:"櫃";s:2:"";s:3:"櫄";s:2:"";s:3:"櫅";s:2:"";s:3:"櫆";s:2:"";s:3:"櫇";s:2:"";s:3:"櫈";s:2:"";s:3:"櫉";s:2:"";s:3:"櫊";s:2:"";s:3:"櫋";s:2:"";s:3:"櫌";s:2:"";s:3:"櫍";s:2:"";s:3:"櫎";s:2:"";s:3:"櫏";s:2:"";s:3:"櫐";s:2:"";s:3:"櫑";s:2:"";s:3:"櫒";s:2:"";s:3:"櫓";s:2:"";s:3:"櫔";s:2:"";s:3:"櫕";s:2:"";s:3:"櫖";s:2:"";s:3:"櫗";s:2:"";s:3:"櫘";s:2:"";s:3:"櫙";s:2:"";s:3:"櫚";s:2:"";s:3:"櫛";s:2:"";s:3:"櫜";s:2:"";s:3:"櫝";s:2:"";s:3:"櫞";s:2:"";s:3:"櫟";s:2:"";s:3:"櫠";s:2:"";s:3:"櫡";s:2:"";s:3:"櫢";s:2:"";s:3:"櫣";s:2:"";s:3:"櫤";s:2:"";s:3:"櫥";s:2:"";s:3:"櫦";s:2:"";s:3:"櫧";s:2:"";s:3:"櫨";s:2:"";s:3:"櫩";s:2:"";s:3:"櫪";s:2:"";s:3:"櫫";s:2:"";s:3:"櫬";s:2:"";s:3:"櫭";s:2:"";s:3:"櫮";s:2:"";s:3:"櫯";s:2:"";s:3:"櫰";s:2:"";s:3:"櫱";s:2:"";s:3:"櫲";s:2:"";s:3:"櫳";s:2:"";s:3:"櫴";s:2:"";s:3:"櫵";s:2:"";s:3:"櫶";s:2:"";s:3:"櫷";s:2:"";s:3:"櫸";s:2:"";s:3:"櫹";s:2:"";s:3:"櫺";s:2:"";s:3:"櫻";s:2:"";s:3:"櫼";s:2:"";s:3:"櫽";s:2:"";s:3:"櫾";s:2:"";s:3:"櫿";s:2:"";s:3:"欀";s:2:"";s:3:"欁";s:2:"";s:3:"欂";s:2:"";s:3:"欃";s:2:"";s:3:"欄";s:2:"";s:3:"欅";s:2:"";s:3:"欆";s:2:"";s:3:"欇";s:2:"";s:3:"欈";s:2:"";s:3:"欉";s:2:"";s:3:"權";s:2:"";s:3:"欋";s:2:"";s:3:"欌";s:2:"";s:3:"欍";s:2:"";s:3:"欎";s:2:"";s:3:"欏";s:2:"";s:3:"欐";s:2:"";s:3:"欑";s:2:"";s:3:"欒";s:2:"";s:3:"欓";s:2:"";s:3:"欔";s:2:"";s:3:"欕";s:2:"";s:3:"欖";s:2:"";s:3:"欗";s:2:"";s:3:"欘";s:2:"";s:3:"欙";s:2:"";s:3:"欚";s:2:"";s:3:"欛";s:2:"";s:3:"欜";s:2:"";s:3:"欝";s:2:"";s:3:"欞";s:2:"";s:3:"欟";s:2:"";s:3:"欠";s:2:"Ƿ";s:3:"次";s:2:"";s:3:"欢";s:2:"";s:3:"欣";s:2:"";s:3:"欤";s:2:"";s:3:"欥";s:2:"";s:3:"欦";s:2:"";s:3:"欧";s:2:"ŷ";s:3:"欨";s:2:"";s:3:"欩";s:2:"";s:3:"欪";s:2:"";s:3:"欫";s:2:"";s:3:"欬";s:2:"";s:3:"欭";s:2:"";s:3:"欮";s:2:"";s:3:"欯";s:2:"@";s:3:"欰";s:2:"A";s:3:"欱";s:2:"B";s:3:"欲";s:2:"";s:3:"欳";s:2:"C";s:3:"欴";s:2:"D";s:3:"欵";s:2:"E";s:3:"欶";s:2:"F";s:3:"欷";s:2:"";s:3:"欸";s:2:"G";s:3:"欹";s:2:"";s:3:"欺";s:2:"";s:3:"欻";s:2:"H";s:3:"欼";s:2:"I";s:3:"欽";s:2:"J";s:3:"款";s:2:"";s:3:"欿";s:2:"K";s:3:"歀";s:2:"L";s:3:"歁";s:2:"M";s:3:"歂";s:2:"N";s:3:"歃";s:2:"";s:3:"歄";s:2:"O";s:3:"歅";s:2:"P";s:3:"歆";s:2:"";s:3:"歇";s:2:"Ъ";s:3:"歈";s:2:"Q";s:3:"歉";s:2:"Ǹ";s:3:"歊";s:2:"R";s:3:"歋";s:2:"S";s:3:"歌";s:2:"";s:3:"歍";s:2:"T";s:3:"歎";s:2:"U";s:3:"歏";s:2:"V";s:3:"歐";s:2:"W";s:3:"歑";s:2:"X";s:3:"歒";s:2:"Y";s:3:"歓";s:2:"Z";s:3:"歔";s:2:"[";s:3:"歕";s:2:"\";s:3:"歖";s:2:"]";s:3:"歗";s:2:"^";s:3:"歘";s:2:"_";s:3:"歙";s:2:"";s:3:"歚";s:2:"`";s:3:"歛";s:2:"a";s:3:"歜";s:2:"b";s:3:"歝";s:2:"c";s:3:"歞";s:2:"d";s:3:"歟";s:2:"e";s:3:"歠";s:2:"f";s:3:"歡";s:2:"g";s:3:"止";s:2:"ֹ";s:3:"正";s:2:"";s:3:"此";s:2:"";s:3:"步";s:2:"";s:3:"武";s:2:"";s:3:"歧";s:2:"";s:3:"歨";s:2:"h";s:3:"歩";s:2:"i";s:3:"歪";s:2:"";s:3:"歫";s:2:"j";s:3:"歬";s:2:"k";s:3:"歭";s:2:"l";s:3:"歮";s:2:"m";s:3:"歯";s:2:"n";s:3:"歰";s:2:"o";s:3:"歱";s:2:"p";s:3:"歲";s:2:"q";s:3:"歳";s:2:"r";s:3:"歴";s:2:"s";s:3:"歵";s:2:"t";s:3:"歶";s:2:"u";s:3:"歷";s:2:"v";s:3:"歸";s:2:"w";s:3:"歹";s:2:"";s:3:"歺";s:2:"x";s:3:"死";s:2:"";s:3:"歼";s:2:"";s:3:"歽";s:2:"y";s:3:"歾";s:2:"z";s:3:"歿";s:2:"{";s:3:"殀";s:2:"|";s:3:"殁";s:2:"";s:3:"殂";s:2:"";s:3:"殃";s:2:"";s:3:"殄";s:2:"";s:3:"殅";s:2:"}";s:3:"殆";s:2:"";s:3:"殇";s:2:"";s:3:"殈";s:2:"~";s:3:"殉";s:2:"ѳ";s:3:"殊";s:2:"";s:3:"残";s:2:"";s:3:"殌";s:2:"";s:3:"殍";s:2:"";s:3:"殎";s:2:"";s:3:"殏";s:2:"";s:3:"殐";s:2:"";s:3:"殑";s:2:"";s:3:"殒";s:2:"";s:3:"殓";s:2:"";s:3:"殔";s:2:"";s:3:"殕";s:2:"";s:3:"殖";s:2:"ֳ";s:3:"殗";s:2:"";s:3:"殘";s:2:"";s:3:"殙";s:2:"";s:3:"殚";s:2:"";s:3:"殛";s:2:"";s:3:"殜";s:2:"";s:3:"殝";s:2:"";s:3:"殞";s:2:"";s:3:"殟";s:2:"";s:3:"殠";s:2:"";s:3:"殡";s:2:"";s:3:"殢";s:2:"";s:3:"殣";s:2:"";s:3:"殤";s:2:"";s:3:"殥";s:2:"";s:3:"殦";s:2:"";s:3:"殧";s:2:"";s:3:"殨";s:2:"";s:3:"殩";s:2:"";s:3:"殪";s:2:"";s:3:"殫";s:2:"";s:3:"殬";s:2:"";s:3:"殭";s:2:"";s:3:"殮";s:2:"";s:3:"殯";s:2:"";s:3:"殰";s:2:"";s:3:"殱";s:2:"";s:3:"殲";s:2:"";s:3:"殳";s:2:"";s:3:"殴";s:2:"Ź";s:3:"段";s:2:"";s:3:"殶";s:2:"";s:3:"殷";s:2:"";s:3:"殸";s:2:"";s:3:"殹";s:2:"";s:3:"殺";s:2:"";s:3:"殻";s:2:"";s:3:"殼";s:2:"";s:3:"殽";s:2:"";s:3:"殾";s:2:"";s:3:"殿";s:2:"";s:3:"毀";s:2:"";s:3:"毁";s:2:"";s:3:"毂";s:2:"";s:3:"毃";s:2:"";s:3:"毄";s:2:"";s:3:"毅";s:2:"";s:3:"毆";s:2:"";s:3:"毇";s:2:"";s:3:"毈";s:2:"";s:3:"毉";s:2:"";s:3:"毊";s:2:"";s:3:"毋";s:2:"";s:3:"毌";s:2:"";s:3:"母";s:2:"ĸ";s:3:"毎";s:2:"";s:3:"每";s:2:"ÿ";s:3:"毐";s:2:"";s:3:"毑";s:2:"";s:3:"毒";s:2:"";s:3:"毓";s:2:"ع";s:3:"比";s:2:"";s:3:"毕";s:2:"";s:3:"毖";s:2:"";s:3:"毗";s:2:"";s:3:"毘";s:2:"";s:3:"毙";s:2:"";s:3:"毚";s:2:"";s:3:"毛";s:2:"ë";s:3:"毜";s:2:"";s:3:"毝";s:2:"";s:3:"毞";s:2:"";s:3:"毟";s:2:"";s:3:"毠";s:2:"";s:3:"毡";s:2:"ձ";s:3:"毢";s:2:"";s:3:"毣";s:2:"";s:3:"毤";s:2:"";s:3:"毥";s:2:"";s:3:"毦";s:2:"";s:3:"毧";s:2:"";s:3:"毨";s:2:"";s:3:"毩";s:2:"";s:3:"毪";s:2:"";s:3:"毫";s:2:"";s:3:"毬";s:2:"";s:3:"毭";s:2:"";s:3:"毮";s:2:"";s:3:"毯";s:2:"̺";s:3:"毰";s:2:"";s:3:"毱";s:2:"";s:3:"毲";s:2:"";s:3:"毳";s:2:"";s:3:"毴";s:2:"";s:3:"毵";s:2:"";s:3:"毶";s:2:"";s:3:"毷";s:2:"";s:3:"毸";s:2:"";s:3:"毹";s:2:"";s:3:"毺";s:2:"";s:3:"毻";s:2:"";s:3:"毼";s:2:"";s:3:"毽";s:2:"";s:3:"毾";s:2:"";s:3:"毿";s:2:"";s:3:"氀";s:2:"";s:3:"氁";s:2:"";s:3:"氂";s:2:"";s:3:"氃";s:2:"";s:3:"氄";s:2:"";s:3:"氅";s:2:"";s:3:"氆";s:2:"";s:3:"氇";s:2:"";s:3:"氈";s:2:"";s:3:"氉";s:2:"";s:3:"氊";s:2:"";s:3:"氋";s:2:"";s:3:"氌";s:2:"";s:3:"氍";s:2:"";s:3:"氎";s:2:"";s:3:"氏";s:2:"";s:3:"氐";s:2:"ص";s:3:"民";s:2:"";s:3:"氒";s:2:"";s:3:"氓";s:2:"å";s:3:"气";s:2:"";s:3:"氕";s:2:"";s:3:"氖";s:2:"";s:3:"気";s:2:"";s:3:"氘";s:2:"";s:3:"氙";s:2:"";s:3:"氚";s:2:"";s:3:"氛";s:2:"";s:3:"氜";s:2:"";s:3:"氝";s:2:"";s:3:"氞";s:2:"";s:3:"氟";s:2:"";s:3:"氠";s:2:"";s:3:"氡";s:2:"";s:3:"氢";s:2:"";s:3:"氣";s:2:"";s:3:"氤";s:2:"";s:3:"氥";s:2:"";s:3:"氦";s:2:"";s:3:"氧";s:2:"";s:3:"氨";s:2:"";s:3:"氩";s:2:"";s:3:"氪";s:2:"";s:3:"氫";s:2:"";s:3:"氬";s:2:"";s:3:"氭";s:2:"";s:3:"氮";s:2:"";s:3:"氯";s:2:"";s:3:"氰";s:2:"";s:3:"氱";s:2:"";s:3:"氲";s:2:"";s:3:"氳";s:2:"";s:3:"水";s:2:"ˮ";s:3:"氵";s:2:"";s:3:"氶";s:2:"";s:3:"氷";s:2:"";s:3:"永";s:2:"";s:3:"氹";s:2:"";s:3:"氺";s:2:"";s:3:"氻";s:2:"";s:3:"氼";s:2:"";s:3:"氽";s:2:"";s:3:"氾";s:2:"";s:3:"氿";s:2:"";s:3:"汀";s:2:"͡";s:3:"汁";s:2:"֭";s:3:"求";s:2:"";s:3:"汃";s:2:"";s:3:"汄";s:2:"";s:3:"汅";s:2:"";s:3:"汆";s:2:"";s:3:"汇";s:2:"";s:3:"汈";s:2:"";s:3:"汉";s:2:"";s:3:"汊";s:2:"";s:3:"汋";s:2:"";s:3:"汌";s:2:"";s:3:"汍";s:2:"";s:3:"汎";s:2:"";s:3:"汏";s:2:"";s:3:"汐";s:2:"ϫ";s:3:"汑";s:2:"";s:3:"汒";s:2:"";s:3:"汓";s:2:"";s:3:"汔";s:2:"";s:3:"汕";s:2:"";s:3:"汖";s:2:"";s:3:"汗";s:2:"";s:3:"汘";s:2:"";s:3:"汙";s:2:"@";s:3:"汚";s:2:"A";s:3:"汛";s:2:"Ѵ";s:3:"汜";s:2:"";s:3:"汝";s:2:"";s:3:"汞";s:2:"";s:3:"江";s:2:"";s:3:"池";s:2:"";s:3:"污";s:2:"";s:3:"汢";s:2:"B";s:3:"汣";s:2:"C";s:3:"汤";s:2:"";s:3:"汥";s:2:"D";s:3:"汦";s:2:"E";s:3:"汧";s:2:"F";s:3:"汨";s:2:"";s:3:"汩";s:2:"";s:3:"汪";s:2:"";s:3:"汫";s:2:"G";s:3:"汬";s:2:"H";s:3:"汭";s:2:"I";s:3:"汮";s:2:"J";s:3:"汯";s:2:"K";s:3:"汰";s:2:"̭";s:3:"汱";s:2:"L";s:3:"汲";s:2:"";s:3:"汳";s:2:"M";s:3:"汴";s:2:"";s:3:"汵";s:2:"N";s:3:"汶";s:2:"";s:3:"汷";s:2:"O";s:3:"汸";s:2:"P";s:3:"汹";s:2:"";s:3:"決";s:2:"Q";s:3:"汻";s:2:"R";s:3:"汼";s:2:"S";s:3:"汽";s:2:"";s:3:"汾";s:2:"";s:3:"汿";s:2:"T";s:3:"沀";s:2:"U";s:3:"沁";s:2:"";s:3:"沂";s:2:"";s:3:"沃";s:2:"";s:3:"沄";s:2:"V";s:3:"沅";s:2:"";s:3:"沆";s:2:"";s:3:"沇";s:2:"W";s:3:"沈";s:2:"";s:3:"沉";s:2:"";s:3:"沊";s:2:"X";s:3:"沋";s:2:"Y";s:3:"沌";s:2:"";s:3:"沍";s:2:"Z";s:3:"沎";s:2:"[";s:3:"沏";s:2:"";s:3:"沐";s:2:"";s:3:"沑";s:2:"\";s:3:"沒";s:2:"]";s:3:"沓";s:2:"";s:3:"沔";s:2:"";s:3:"沕";s:2:"^";s:3:"沖";s:2:"_";s:3:"沗";s:2:"`";s:3:"沘";s:2:"a";s:3:"沙";s:2:"ɳ";s:3:"沚";s:2:"b";s:3:"沛";s:2:"";s:3:"沜";s:2:"c";s:3:"沝";s:2:"d";s:3:"沞";s:2:"e";s:3:"沟";s:2:"";s:3:"沠";s:2:"f";s:3:"没";s:2:"û";s:3:"沢";s:2:"g";s:3:"沣";s:2:"";s:3:"沤";s:2:"Ž";s:3:"沥";s:2:"";s:3:"沦";s:2:"";s:3:"沧";s:2:"";s:3:"沨";s:2:"h";s:3:"沩";s:2:"";s:3:"沪";s:2:"";s:3:"沫";s:2:"ĭ";s:3:"沬";s:2:"i";s:3:"沭";s:2:"";s:3:"沮";s:2:"";s:3:"沯";s:2:"j";s:3:"沰";s:2:"k";s:3:"沱";s:2:"";s:3:"沲";s:2:"";s:3:"河";s:2:"";s:3:"沴";s:2:"l";s:3:"沵";s:2:"m";s:3:"沶";s:2:"n";s:3:"沷";s:2:"o";s:3:"沸";s:2:"";s:3:"油";s:2:"";s:3:"沺";s:2:"p";s:3:"治";s:2:"";s:3:"沼";s:2:"";s:3:"沽";s:2:"";s:3:"沾";s:2:"մ";s:3:"沿";s:2:"";s:3:"泀";s:2:"q";s:3:"況";s:2:"r";s:3:"泂";s:2:"s";s:3:"泃";s:2:"t";s:3:"泄";s:2:"й";s:3:"泅";s:2:"";s:3:"泆";s:2:"u";s:3:"泇";s:2:"v";s:3:"泈";s:2:"w";s:3:"泉";s:2:"Ȫ";s:3:"泊";s:2:"";s:3:"泋";s:2:"x";s:3:"泌";s:2:"";s:3:"泍";s:2:"y";s:3:"泎";s:2:"z";s:3:"泏";s:2:"{";s:3:"泐";s:2:"";s:3:"泑";s:2:"|";s:3:"泒";s:2:"}";s:3:"泓";s:2:"";s:3:"泔";s:2:"";s:3:"法";s:2:"";s:3:"泖";s:2:"";s:3:"泗";s:2:"";s:3:"泘";s:2:"~";s:3:"泙";s:2:"";s:3:"泚";s:2:"";s:3:"泛";s:2:"";s:3:"泜";s:2:"";s:3:"泝";s:2:"";s:3:"泞";s:2:"Ţ";s:3:"泟";s:2:"";s:3:"泠";s:2:"";s:3:"泡";s:2:"";s:3:"波";s:2:"";s:3:"泣";s:2:"";s:3:"泤";s:2:"";s:3:"泥";s:2:"";s:3:"泦";s:2:"";s:3:"泧";s:2:"";s:3:"注";s:2:"ע";s:3:"泩";s:2:"";s:3:"泪";s:2:"";s:3:"泫";s:2:"";s:3:"泬";s:2:"";s:3:"泭";s:2:"";s:3:"泮";s:2:"";s:3:"泯";s:2:"";s:3:"泰";s:2:"̩";s:3:"泱";s:2:"";s:3:"泲";s:2:"";s:3:"泳";s:2:"Ӿ";s:3:"泴";s:2:"";s:3:"泵";s:2:"";s:3:"泶";s:2:"";s:3:"泷";s:2:"";s:3:"泸";s:2:"";s:3:"泹";s:2:"";s:3:"泺";s:2:"";s:3:"泻";s:2:"к";s:3:"泼";s:2:"";s:3:"泽";s:2:"";s:3:"泾";s:2:"";s:3:"泿";s:2:"";s:3:"洀";s:2:"";s:3:"洁";s:2:"";s:3:"洂";s:2:"";s:3:"洃";s:2:"";s:3:"洄";s:2:"";s:3:"洅";s:2:"";s:3:"洆";s:2:"";s:3:"洇";s:2:"";s:3:"洈";s:2:"";s:3:"洉";s:2:"";s:3:"洊";s:2:"";s:3:"洋";s:2:"";s:3:"洌";s:2:"";s:3:"洍";s:2:"";s:3:"洎";s:2:"";s:3:"洏";s:2:"";s:3:"洐";s:2:"";s:3:"洑";s:2:"";s:3:"洒";s:2:"";s:3:"洓";s:2:"";s:3:"洔";s:2:"";s:3:"洕";s:2:"";s:3:"洖";s:2:"";s:3:"洗";s:2:"ϴ";s:3:"洘";s:2:"";s:3:"洙";s:2:"";s:3:"洚";s:2:"";s:3:"洛";s:2:"";s:3:"洜";s:2:"";s:3:"洝";s:2:"";s:3:"洞";s:2:"";s:3:"洟";s:2:"";s:3:"洠";s:2:"";s:3:"洡";s:2:"";s:3:"洢";s:2:"";s:3:"洣";s:2:"";s:3:"洤";s:2:"";s:3:"津";s:2:"";s:3:"洦";s:2:"";s:3:"洧";s:2:"";s:3:"洨";s:2:"";s:3:"洩";s:2:"";s:3:"洪";s:2:"";s:3:"洫";s:2:"";s:3:"洬";s:2:"";s:3:"洭";s:2:"";s:3:"洮";s:2:"";s:3:"洯";s:2:"";s:3:"洰";s:2:"";s:3:"洱";s:2:"";s:3:"洲";s:2:"";s:3:"洳";s:2:"";s:3:"洴";s:2:"";s:3:"洵";s:2:"";s:3:"洶";s:2:"";s:3:"洷";s:2:"";s:3:"洸";s:2:"";s:3:"洹";s:2:"";s:3:"洺";s:2:"";s:3:"活";s:2:"";s:3:"洼";s:2:"";s:3:"洽";s:2:"Ǣ";s:3:"派";s:2:"";s:3:"洿";s:2:"";s:3:"浀";s:2:"";s:3:"流";s:2:"";s:3:"浂";s:2:"";s:3:"浃";s:2:"";s:3:"浄";s:2:"";s:3:"浅";s:2:"ǳ";s:3:"浆";s:2:"";s:3:"浇";s:2:"";s:3:"浈";s:2:"";s:3:"浉";s:2:"";s:3:"浊";s:2:"";s:3:"测";s:2:"";s:3:"浌";s:2:"";s:3:"浍";s:2:"";s:3:"济";s:2:"";s:3:"浏";s:2:"";s:3:"浐";s:2:"";s:3:"浑";s:2:"";s:3:"浒";s:2:"";s:3:"浓";s:2:"Ũ";s:3:"浔";s:2:"";s:3:"浕";s:2:"";s:3:"浖";s:2:"";s:3:"浗";s:2:"";s:3:"浘";s:2:"";s:3:"浙";s:2:"";s:3:"浚";s:2:"";s:3:"浛";s:2:"";s:3:"浜";s:2:"";s:3:"浝";s:2:"";s:3:"浞";s:2:"";s:3:"浟";s:2:"";s:3:"浠";s:2:"";s:3:"浡";s:2:"";s:3:"浢";s:2:"";s:3:"浣";s:2:"";s:3:"浤";s:2:"";s:3:"浥";s:2:"";s:3:"浦";s:2:"";s:3:"浧";s:2:"";s:3:"浨";s:2:"";s:3:"浩";s:2:"";s:3:"浪";s:2:"";s:3:"浫";s:2:"";s:3:"浬";s:2:"";s:3:"浭";s:2:"";s:3:"浮";s:2:"";s:3:"浯";s:2:"";s:3:"浰";s:2:"";s:3:"浱";s:2:"";s:3:"浲";s:2:"";s:3:"浳";s:2:"";s:3:"浴";s:2:"ԡ";s:3:"浵";s:2:"";s:3:"浶";s:2:"";s:3:"海";s:2:"";s:3:"浸";s:2:"";s:3:"浹";s:2:"";s:3:"浺";s:2:"";s:3:"浻";s:2:"";s:3:"浼";s:2:"";s:3:"浽";s:2:"";s:3:"浾";s:2:"";s:3:"浿";s:2:"";s:3:"涀";s:2:"";s:3:"涁";s:2:"";s:3:"涂";s:2:"Ϳ";s:3:"涃";s:2:"";s:3:"涄";s:2:"";s:3:"涅";s:2:"";s:3:"涆";s:2:"";s:3:"涇";s:2:"";s:3:"消";s:2:"";s:3:"涉";s:2:"";s:3:"涊";s:2:"";s:3:"涋";s:2:"";s:3:"涌";s:2:"ӿ";s:3:"涍";s:2:"";s:3:"涎";s:2:"";s:3:"涏";s:2:"";s:3:"涐";s:2:"";s:3:"涑";s:2:"";s:3:"涒";s:2:"";s:3:"涓";s:2:"";s:3:"涔";s:2:"";s:3:"涕";s:2:"";s:3:"涖";s:2:"";s:3:"涗";s:2:"";s:3:"涘";s:2:"";s:3:"涙";s:2:"";s:3:"涚";s:2:"";s:3:"涛";s:2:"";s:3:"涜";s:2:"";s:3:"涝";s:2:"";s:3:"涞";s:2:"";s:3:"涟";s:2:"";s:3:"涠";s:2:"";s:3:"涡";s:2:"";s:3:"涢";s:2:"";s:3:"涣";s:2:"";s:3:"涤";s:2:"";s:3:"涥";s:2:"";s:3:"润";s:2:"";s:3:"涧";s:2:"";s:3:"涨";s:2:"";s:3:"涩";s:2:"ɬ";s:3:"涪";s:2:"";s:3:"涫";s:2:"";s:3:"涬";s:2:"";s:3:"涭";s:2:"";s:3:"涮";s:2:"";s:3:"涯";s:2:"";s:3:"涰";s:2:"";s:3:"涱";s:2:"";s:3:"液";s:2:"Һ";s:3:"涳";s:2:"";s:3:"涴";s:2:"";s:3:"涵";s:2:"";s:3:"涶";s:2:"";s:3:"涷";s:2:"";s:3:"涸";s:2:"";s:3:"涹";s:2:"";s:3:"涺";s:2:"";s:3:"涻";s:2:"";s:3:"涼";s:2:"";s:3:"涽";s:2:"";s:3:"涾";s:2:"";s:3:"涿";s:2:"";s:3:"淀";s:2:"";s:3:"淁";s:2:"";s:3:"淂";s:2:"";s:3:"淃";s:2:"";s:3:"淄";s:2:"";s:3:"淅";s:2:"";s:3:"淆";s:2:"";s:3:"淇";s:2:"";s:3:"淈";s:2:"";s:3:"淉";s:2:"";s:3:"淊";s:2:"";s:3:"淋";s:2:"";s:3:"淌";s:2:"";s:3:"淍";s:2:"@";s:3:"淎";s:2:"A";s:3:"淏";s:2:"B";s:3:"淐";s:2:"C";s:3:"淑";s:2:"";s:3:"淒";s:2:"D";s:3:"淓";s:2:"E";s:3:"淔";s:2:"F";s:3:"淕";s:2:"G";s:3:"淖";s:2:"";s:3:"淗";s:2:"H";s:3:"淘";s:2:"";s:3:"淙";s:2:"";s:3:"淚";s:2:"I";s:3:"淛";s:2:"J";s:3:"淜";s:2:"K";s:3:"淝";s:2:"";s:3:"淞";s:2:"";s:3:"淟";s:2:"L";s:3:"淠";s:2:"";s:3:"淡";s:2:"";s:3:"淢";s:2:"M";s:3:"淣";s:2:"N";s:3:"淤";s:2:"";s:3:"淥";s:2:"O";s:3:"淦";s:2:"";s:3:"淧";s:2:"P";s:3:"淨";s:2:"Q";s:3:"淩";s:2:"R";s:3:"淪";s:2:"S";s:3:"淫";s:2:"";s:3:"淬";s:2:"";s:3:"淭";s:2:"T";s:3:"淮";s:2:"";s:3:"淯";s:2:"U";s:3:"淰";s:2:"V";s:3:"深";s:2:"";s:3:"淲";s:2:"W";s:3:"淳";s:2:"";s:3:"淴";s:2:"X";s:3:"淵";s:2:"Y";s:3:"淶";s:2:"Z";s:3:"混";s:2:"";s:3:"淸";s:2:"[";s:3:"淹";s:2:"";s:3:"淺";s:2:"\";s:3:"添";s:2:"";s:3:"淼";s:2:"";s:3:"淽";s:2:"]";s:3:"淾";s:2:"^";s:3:"淿";s:2:"_";s:3:"渀";s:2:"`";s:3:"渁";s:2:"a";s:3:"渂";s:2:"b";s:3:"渃";s:2:"c";s:3:"渄";s:2:"d";s:3:"清";s:2:"";s:3:"渆";s:2:"e";s:3:"渇";s:2:"f";s:3:"済";s:2:"g";s:3:"渉";s:2:"h";s:3:"渊";s:2:"Ԩ";s:3:"渋";s:2:"i";s:3:"渌";s:2:"";s:3:"渍";s:2:"";s:3:"渎";s:2:"";s:3:"渏";s:2:"j";s:3:"渐";s:2:"";s:3:"渑";s:2:"";s:3:"渒";s:2:"k";s:3:"渓";s:2:"l";s:3:"渔";s:2:"";s:3:"渕";s:2:"m";s:3:"渖";s:2:"";s:3:"渗";s:2:"";s:3:"渘";s:2:"n";s:3:"渙";s:2:"o";s:3:"渚";s:2:"";s:3:"減";s:2:"p";s:3:"渜";s:2:"q";s:3:"渝";s:2:"";s:3:"渞";s:2:"r";s:3:"渟";s:2:"s";s:3:"渠";s:2:"";s:3:"渡";s:2:"";s:3:"渢";s:2:"t";s:3:"渣";s:2:"";s:3:"渤";s:2:"";s:3:"渥";s:2:"";s:3:"渦";s:2:"u";s:3:"渧";s:2:"v";s:3:"渨";s:2:"w";s:3:"温";s:2:"";s:3:"渪";s:2:"x";s:3:"渫";s:2:"";s:3:"測";s:2:"y";s:3:"渭";s:2:"μ";s:3:"渮";s:2:"z";s:3:"港";s:2:"";s:3:"渰";s:2:"{";s:3:"渱";s:2:"|";s:3:"渲";s:2:"";s:3:"渳";s:2:"}";s:3:"渴";s:2:"";s:3:"渵";s:2:"~";s:3:"渶";s:2:"";s:3:"渷";s:2:"";s:3:"游";s:2:"";s:3:"渹";s:2:"";s:3:"渺";s:2:"";s:3:"渻";s:2:"";s:3:"渼";s:2:"";s:3:"渽";s:2:"";s:3:"渾";s:2:"";s:3:"渿";s:2:"";s:3:"湀";s:2:"";s:3:"湁";s:2:"";s:3:"湂";s:2:"";s:3:"湃";s:2:"";s:3:"湄";s:2:"";s:3:"湅";s:2:"";s:3:"湆";s:2:"";s:3:"湇";s:2:"";s:3:"湈";s:2:"";s:3:"湉";s:2:"";s:3:"湊";s:2:"";s:3:"湋";s:2:"";s:3:"湌";s:2:"";s:3:"湍";s:2:"";s:3:"湎";s:2:"";s:3:"湏";s:2:"";s:3:"湐";s:2:"";s:3:"湑";s:2:"";s:3:"湒";s:2:"";s:3:"湓";s:2:"";s:3:"湔";s:2:"";s:3:"湕";s:2:"";s:3:"湖";s:2:"";s:3:"湗";s:2:"";s:3:"湘";s:2:"";s:3:"湙";s:2:"";s:3:"湚";s:2:"";s:3:"湛";s:2:"տ";s:3:"湜";s:2:"";s:3:"湝";s:2:"";s:3:"湞";s:2:"";s:3:"湟";s:2:"";s:3:"湠";s:2:"";s:3:"湡";s:2:"";s:3:"湢";s:2:"";s:3:"湣";s:2:"";s:3:"湤";s:2:"";s:3:"湥";s:2:"";s:3:"湦";s:2:"";s:3:"湧";s:2:"";s:3:"湨";s:2:"";s:3:"湩";s:2:"";s:3:"湪";s:2:"";s:3:"湫";s:2:"";s:3:"湬";s:2:"";s:3:"湭";s:2:"";s:3:"湮";s:2:"";s:3:"湯";s:2:"";s:3:"湰";s:2:"";s:3:"湱";s:2:"";s:3:"湲";s:2:"";s:3:"湳";s:2:"";s:3:"湴";s:2:"";s:3:"湵";s:2:"";s:3:"湶";s:2:"";s:3:"湷";s:2:"";s:3:"湸";s:2:"";s:3:"湹";s:2:"";s:3:"湺";s:2:"";s:3:"湻";s:2:"";s:3:"湼";s:2:"";s:3:"湽";s:2:"";s:3:"湾";s:2:"";s:3:"湿";s:2:"ʪ";s:3:"満";s:2:"";s:3:"溁";s:2:"";s:3:"溂";s:2:"";s:3:"溃";s:2:"";s:3:"溄";s:2:"";s:3:"溅";s:2:"";s:3:"溆";s:2:"";s:3:"溇";s:2:"";s:3:"溈";s:2:"";s:3:"溉";s:2:"";s:3:"溊";s:2:"";s:3:"溋";s:2:"";s:3:"溌";s:2:"";s:3:"溍";s:2:"";s:3:"溎";s:2:"";s:3:"溏";s:2:"";s:3:"源";s:2:"Դ";s:3:"溑";s:2:"";s:3:"溒";s:2:"";s:3:"溓";s:2:"";s:3:"溔";s:2:"";s:3:"溕";s:2:"";s:3:"準";s:2:"";s:3:"溗";s:2:"";s:3:"溘";s:2:"";s:3:"溙";s:2:"";s:3:"溚";s:2:"";s:3:"溛";s:2:"";s:3:"溜";s:2:"";s:3:"溝";s:2:"";s:3:"溞";s:2:"";s:3:"溟";s:2:"";s:3:"溠";s:2:"";s:3:"溡";s:2:"";s:3:"溢";s:2:"";s:3:"溣";s:2:"";s:3:"溤";s:2:"";s:3:"溥";s:2:"";s:3:"溦";s:2:"";s:3:"溧";s:2:"";s:3:"溨";s:2:"";s:3:"溩";s:2:"";s:3:"溪";s:2:"Ϫ";s:3:"溫";s:2:"";s:3:"溬";s:2:"";s:3:"溭";s:2:"";s:3:"溮";s:2:"";s:3:"溯";s:2:"";s:3:"溰";s:2:"";s:3:"溱";s:2:"";s:3:"溲";s:2:"";s:3:"溳";s:2:"";s:3:"溴";s:2:"";s:3:"溵";s:2:"";s:3:"溶";s:2:"";s:3:"溷";s:2:"";s:3:"溸";s:2:"";s:3:"溹";s:2:"";s:3:"溺";s:2:"";s:3:"溻";s:2:"";s:3:"溼";s:2:"";s:3:"溽";s:2:"";s:3:"溾";s:2:"";s:3:"溿";s:2:"";s:3:"滀";s:2:"";s:3:"滁";s:2:"";s:3:"滂";s:2:"";s:3:"滃";s:2:"";s:3:"滄";s:2:"";s:3:"滅";s:2:"";s:3:"滆";s:2:"";s:3:"滇";s:2:"";s:3:"滈";s:2:"";s:3:"滉";s:2:"";s:3:"滊";s:2:"";s:3:"滋";s:2:"";s:3:"滌";s:2:"";s:3:"滍";s:2:"";s:3:"滎";s:2:"";s:3:"滏";s:2:"";s:3:"滐";s:2:"";s:3:"滑";s:2:"";s:3:"滒";s:2:"";s:3:"滓";s:2:"";s:3:"滔";s:2:"";s:3:"滕";s:2:"";s:3:"滖";s:2:"";s:3:"滗";s:2:"";s:3:"滘";s:2:"";s:3:"滙";s:2:"";s:3:"滚";s:2:"";s:3:"滛";s:2:"";s:3:"滜";s:2:"";s:3:"滝";s:2:"";s:3:"滞";s:2:"";s:3:"滟";s:2:"";s:3:"滠";s:2:"";s:3:"满";s:2:"";s:3:"滢";s:2:"";s:3:"滣";s:2:"";s:3:"滤";s:2:"";s:3:"滥";s:2:"";s:3:"滦";s:2:"";s:3:"滧";s:2:"";s:3:"滨";s:2:"";s:3:"滩";s:2:"̲";s:3:"滪";s:2:"";s:3:"滫";s:2:"";s:3:"滬";s:2:"";s:3:"滭";s:2:"";s:3:"滮";s:2:"";s:3:"滯";s:2:"";s:3:"滰";s:2:"@";s:3:"滱";s:2:"A";s:3:"滲";s:2:"B";s:3:"滳";s:2:"C";s:3:"滴";s:2:"";s:3:"滵";s:2:"D";s:3:"滶";s:2:"E";s:3:"滷";s:2:"F";s:3:"滸";s:2:"G";s:3:"滹";s:2:"";s:3:"滺";s:2:"H";s:3:"滻";s:2:"I";s:3:"滼";s:2:"J";s:3:"滽";s:2:"K";s:3:"滾";s:2:"L";s:3:"滿";s:2:"M";s:3:"漀";s:2:"N";s:3:"漁";s:2:"O";s:3:"漂";s:2:"Ư";s:3:"漃";s:2:"P";s:3:"漄";s:2:"Q";s:3:"漅";s:2:"R";s:3:"漆";s:2:"";s:3:"漇";s:2:"S";s:3:"漈";s:2:"T";s:3:"漉";s:2:"";s:3:"漊";s:2:"U";s:3:"漋";s:2:"V";s:3:"漌";s:2:"W";s:3:"漍";s:2:"X";s:3:"漎";s:2:"Y";s:3:"漏";s:2:"©";s:3:"漐";s:2:"Z";s:3:"漑";s:2:"[";s:3:"漒";s:2:"\";s:3:"漓";s:2:"";s:3:"演";s:2:"";s:3:"漕";s:2:"";s:3:"漖";s:2:"]";s:3:"漗";s:2:"^";s:3:"漘";s:2:"_";s:3:"漙";s:2:"`";s:3:"漚";s:2:"a";s:3:"漛";s:2:"b";s:3:"漜";s:2:"c";s:3:"漝";s:2:"d";s:3:"漞";s:2:"e";s:3:"漟";s:2:"f";s:3:"漠";s:2:"Į";s:3:"漡";s:2:"g";s:3:"漢";s:2:"h";s:3:"漣";s:2:"i";s:3:"漤";s:2:"";s:3:"漥";s:2:"j";s:3:"漦";s:2:"k";s:3:"漧";s:2:"l";s:3:"漨";s:2:"m";s:3:"漩";s:2:"";s:3:"漪";s:2:"";s:3:"漫";s:2:"";s:3:"漬";s:2:"n";s:3:"漭";s:2:"";s:3:"漮";s:2:"o";s:3:"漯";s:2:"";s:3:"漰";s:2:"p";s:3:"漱";s:2:"";s:3:"漲";s:2:"q";s:3:"漳";s:2:"";s:3:"漴";s:2:"r";s:3:"漵";s:2:"s";s:3:"漶";s:2:"";s:3:"漷";s:2:"t";s:3:"漸";s:2:"u";s:3:"漹";s:2:"v";s:3:"漺";s:2:"w";s:3:"漻";s:2:"x";s:3:"漼";s:2:"y";s:3:"漽";s:2:"z";s:3:"漾";s:2:"";s:3:"漿";s:2:"{";s:3:"潀";s:2:"|";s:3:"潁";s:2:"}";s:3:"潂";s:2:"~";s:3:"潃";s:2:"";s:3:"潄";s:2:"";s:3:"潅";s:2:"";s:3:"潆";s:2:"";s:3:"潇";s:2:"";s:3:"潈";s:2:"";s:3:"潉";s:2:"";s:3:"潊";s:2:"";s:3:"潋";s:2:"";s:3:"潌";s:2:"";s:3:"潍";s:2:"Ϋ";s:3:"潎";s:2:"";s:3:"潏";s:2:"";s:3:"潐";s:2:"";s:3:"潑";s:2:"";s:3:"潒";s:2:"";s:3:"潓";s:2:"";s:3:"潔";s:2:"";s:3:"潕";s:2:"";s:3:"潖";s:2:"";s:3:"潗";s:2:"";s:3:"潘";s:2:"";s:3:"潙";s:2:"";s:3:"潚";s:2:"";s:3:"潛";s:2:"";s:3:"潜";s:2:"Ǳ";s:3:"潝";s:2:"";s:3:"潞";s:2:"º";s:3:"潟";s:2:"";s:3:"潠";s:2:"";s:3:"潡";s:2:"";s:3:"潢";s:2:"";s:3:"潣";s:2:"";s:3:"潤";s:2:"";s:3:"潥";s:2:"";s:3:"潦";s:2:"";s:3:"潧";s:2:"";s:3:"潨";s:2:"";s:3:"潩";s:2:"";s:3:"潪";s:2:"";s:3:"潫";s:2:"";s:3:"潬";s:2:"";s:3:"潭";s:2:"̶";s:3:"潮";s:2:"";s:3:"潯";s:2:"";s:3:"潰";s:2:"";s:3:"潱";s:2:"";s:3:"潲";s:2:"";s:3:"潳";s:2:"";s:3:"潴";s:2:"";s:3:"潵";s:2:"";s:3:"潶";s:2:"";s:3:"潷";s:2:"";s:3:"潸";s:2:"";s:3:"潹";s:2:"";s:3:"潺";s:2:"";s:3:"潻";s:2:"";s:3:"潼";s:2:"";s:3:"潽";s:2:"";s:3:"潾";s:2:"";s:3:"潿";s:2:"";s:3:"澀";s:2:"";s:3:"澁";s:2:"";s:3:"澂";s:2:"";s:3:"澃";s:2:"";s:3:"澄";s:2:"";s:3:"澅";s:2:"";s:3:"澆";s:2:"";s:3:"澇";s:2:"";s:3:"澈";s:2:"";s:3:"澉";s:2:"";s:3:"澊";s:2:"";s:3:"澋";s:2:"";s:3:"澌";s:2:"";s:3:"澍";s:2:"";s:3:"澎";s:2:"";s:3:"澏";s:2:"";s:3:"澐";s:2:"";s:3:"澑";s:2:"";s:3:"澒";s:2:"";s:3:"澓";s:2:"";s:3:"澔";s:2:"";s:3:"澕";s:2:"";s:3:"澖";s:2:"";s:3:"澗";s:2:"";s:3:"澘";s:2:"";s:3:"澙";s:2:"";s:3:"澚";s:2:"";s:3:"澛";s:2:"";s:3:"澜";s:2:"";s:3:"澝";s:2:"";s:3:"澞";s:2:"";s:3:"澟";s:2:"";s:3:"澠";s:2:"";s:3:"澡";s:2:"";s:3:"澢";s:2:"";s:3:"澣";s:2:"";s:3:"澤";s:2:"";s:3:"澥";s:2:"";s:3:"澦";s:2:"";s:3:"澧";s:2:"";s:3:"澨";s:2:"";s:3:"澩";s:2:"";s:3:"澪";s:2:"";s:3:"澫";s:2:"";s:3:"澬";s:2:"";s:3:"澭";s:2:"";s:3:"澮";s:2:"";s:3:"澯";s:2:"";s:3:"澰";s:2:"";s:3:"澱";s:2:"";s:3:"澲";s:2:"";s:3:"澳";s:2:"";s:3:"澴";s:2:"";s:3:"澵";s:2:"";s:3:"澶";s:2:"";s:3:"澷";s:2:"";s:3:"澸";s:2:"";s:3:"澹";s:2:"";s:3:"澺";s:2:"";s:3:"澻";s:2:"";s:3:"澼";s:2:"";s:3:"澽";s:2:"";s:3:"澾";s:2:"";s:3:"澿";s:2:"";s:3:"激";s:2:"";s:3:"濁";s:2:"";s:3:"濂";s:2:"";s:3:"濃";s:2:"";s:3:"濄";s:2:"";s:3:"濅";s:2:"";s:3:"濆";s:2:"";s:3:"濇";s:2:"";s:3:"濈";s:2:"";s:3:"濉";s:2:"";s:3:"濊";s:2:"";s:3:"濋";s:2:"";s:3:"濌";s:2:"";s:3:"濍";s:2:"";s:3:"濎";s:2:"";s:3:"濏";s:2:"";s:3:"濐";s:2:"";s:3:"濑";s:2:"";s:3:"濒";s:2:"";s:3:"濓";s:2:"";s:3:"濔";s:2:"";s:3:"濕";s:2:"";s:3:"濖";s:2:"";s:3:"濗";s:2:"";s:3:"濘";s:2:"";s:3:"濙";s:2:"";s:3:"濚";s:2:"";s:3:"濛";s:2:"";s:3:"濜";s:2:"";s:3:"濝";s:2:"";s:3:"濞";s:2:"";s:3:"濟";s:2:"";s:3:"濠";s:2:"";s:3:"濡";s:2:"";s:3:"濢";s:2:"";s:3:"濣";s:2:"";s:3:"濤";s:2:"";s:3:"濥";s:2:"";s:3:"濦";s:2:"@";s:3:"濧";s:2:"A";s:3:"濨";s:2:"B";s:3:"濩";s:2:"C";s:3:"濪";s:2:"D";s:3:"濫";s:2:"E";s:3:"濬";s:2:"F";s:3:"濭";s:2:"G";s:3:"濮";s:2:"";s:3:"濯";s:2:"";s:3:"濰";s:2:"H";s:3:"濱";s:2:"I";s:3:"濲";s:2:"J";s:3:"濳";s:2:"K";s:3:"濴";s:2:"L";s:3:"濵";s:2:"M";s:3:"濶";s:2:"N";s:3:"濷";s:2:"O";s:3:"濸";s:2:"P";s:3:"濹";s:2:"Q";s:3:"濺";s:2:"R";s:3:"濻";s:2:"S";s:3:"濼";s:2:"T";s:3:"濽";s:2:"U";s:3:"濾";s:2:"V";s:3:"濿";s:2:"W";s:3:"瀀";s:2:"X";s:3:"瀁";s:2:"Y";s:3:"瀂";s:2:"Z";s:3:"瀃";s:2:"[";s:3:"瀄";s:2:"\";s:3:"瀅";s:2:"]";s:3:"瀆";s:2:"^";s:3:"瀇";s:2:"_";s:3:"瀈";s:2:"`";s:3:"瀉";s:2:"a";s:3:"瀊";s:2:"b";s:3:"瀋";s:2:"c";s:3:"瀌";s:2:"d";s:3:"瀍";s:2:"e";s:3:"瀎";s:2:"f";s:3:"瀏";s:2:"g";s:3:"瀐";s:2:"h";s:3:"瀑";s:2:"";s:3:"瀒";s:2:"i";s:3:"瀓";s:2:"j";s:3:"瀔";s:2:"k";s:3:"瀕";s:2:"l";s:3:"瀖";s:2:"m";s:3:"瀗";s:2:"n";s:3:"瀘";s:2:"o";s:3:"瀙";s:2:"p";s:3:"瀚";s:2:"";s:3:"瀛";s:2:"";s:3:"瀜";s:2:"q";s:3:"瀝";s:2:"r";s:3:"瀞";s:2:"s";s:3:"瀟";s:2:"t";s:3:"瀠";s:2:"u";s:3:"瀡";s:2:"v";s:3:"瀢";s:2:"w";s:3:"瀣";s:2:"";s:3:"瀤";s:2:"x";s:3:"瀥";s:2:"y";s:3:"瀦";s:2:"z";s:3:"瀧";s:2:"{";s:3:"瀨";s:2:"|";s:3:"瀩";s:2:"}";s:3:"瀪";s:2:"~";s:3:"瀫";s:2:"";s:3:"瀬";s:2:"";s:3:"瀭";s:2:"";s:3:"瀮";s:2:"";s:3:"瀯";s:2:"";s:3:"瀰";s:2:"";s:3:"瀱";s:2:"";s:3:"瀲";s:2:"";s:3:"瀳";s:2:"";s:3:"瀴";s:2:"";s:3:"瀵";s:2:"";s:3:"瀶";s:2:"";s:3:"瀷";s:2:"";s:3:"瀸";s:2:"";s:3:"瀹";s:2:"";s:3:"瀺";s:2:"";s:3:"瀻";s:2:"";s:3:"瀼";s:2:"";s:3:"瀽";s:2:"";s:3:"瀾";s:2:"";s:3:"瀿";s:2:"";s:3:"灀";s:2:"";s:3:"灁";s:2:"";s:3:"灂";s:2:"";s:3:"灃";s:2:"";s:3:"灄";s:2:"";s:3:"灅";s:2:"";s:3:"灆";s:2:"";s:3:"灇";s:2:"";s:3:"灈";s:2:"";s:3:"灉";s:2:"";s:3:"灊";s:2:"";s:3:"灋";s:2:"";s:3:"灌";s:2:"";s:3:"灍";s:2:"";s:3:"灎";s:2:"";s:3:"灏";s:2:"";s:3:"灐";s:2:"";s:3:"灑";s:2:"";s:3:"灒";s:2:"";s:3:"灓";s:2:"";s:3:"灔";s:2:"";s:3:"灕";s:2:"";s:3:"灖";s:2:"";s:3:"灗";s:2:"";s:3:"灘";s:2:"";s:3:"灙";s:2:"";s:3:"灚";s:2:"";s:3:"灛";s:2:"";s:3:"灜";s:2:"";s:3:"灝";s:2:"";s:3:"灞";s:2:"";s:3:"灟";s:2:"";s:3:"灠";s:2:"";s:3:"灡";s:2:"";s:3:"灢";s:2:"";s:3:"灣";s:2:"";s:3:"灤";s:2:"";s:3:"灥";s:2:"";s:3:"灦";s:2:"";s:3:"灧";s:2:"";s:3:"灨";s:2:"";s:3:"灩";s:2:"";s:3:"灪";s:2:"";s:3:"火";s:2:"";s:3:"灬";s:2:"";s:3:"灭";s:2:"";s:3:"灮";s:2:"";s:3:"灯";s:2:"";s:3:"灰";s:2:"";s:3:"灱";s:2:"";s:3:"灲";s:2:"";s:3:"灳";s:2:"";s:3:"灴";s:2:"";s:3:"灵";s:2:"";s:3:"灶";s:2:"";s:3:"灷";s:2:"";s:3:"灸";s:2:"";s:3:"灹";s:2:"";s:3:"灺";s:2:"";s:3:"灻";s:2:"";s:3:"灼";s:2:"";s:3:"災";s:2:"";s:3:"灾";s:2:"";s:3:"灿";s:2:"";s:3:"炀";s:2:"";s:3:"炁";s:2:"";s:3:"炂";s:2:"";s:3:"炃";s:2:"";s:3:"炄";s:2:"";s:3:"炅";s:2:"";s:3:"炆";s:2:"";s:3:"炇";s:2:"";s:3:"炈";s:2:"";s:3:"炉";s:2:"¯";s:3:"炊";s:2:"";s:3:"炋";s:2:"";s:3:"炌";s:2:"";s:3:"炍";s:2:"";s:3:"炎";s:2:"";s:3:"炏";s:2:"";s:3:"炐";s:2:"";s:3:"炑";s:2:"";s:3:"炒";s:2:"";s:3:"炓";s:2:"";s:3:"炔";s:2:"Ȳ";s:3:"炕";s:2:"";s:3:"炖";s:2:"";s:3:"炗";s:2:"";s:3:"炘";s:2:"";s:3:"炙";s:2:"";s:3:"炚";s:2:"";s:3:"炛";s:2:"";s:3:"炜";s:2:"";s:3:"炝";s:2:"";s:3:"炞";s:2:"";s:3:"炟";s:2:"";s:3:"炠";s:2:"";s:3:"炡";s:2:"";s:3:"炢";s:2:"";s:3:"炣";s:2:"";s:3:"炤";s:2:"";s:3:"炥";s:2:"";s:3:"炦";s:2:"";s:3:"炧";s:2:"";s:3:"炨";s:2:"";s:3:"炩";s:2:"";s:3:"炪";s:2:"";s:3:"炫";s:2:"";s:3:"炬";s:2:"";s:3:"炭";s:2:"̿";s:3:"炮";s:2:"";s:3:"炯";s:2:"";s:3:"炰";s:2:"";s:3:"炱";s:2:"";s:3:"炲";s:2:"";s:3:"炳";s:2:"";s:3:"炴";s:2:"";s:3:"炵";s:2:"";s:3:"炶";s:2:"";s:3:"炷";s:2:"";s:3:"炸";s:2:"ը";s:3:"点";s:2:"";s:3:"為";s:2:"";s:3:"炻";s:2:"";s:3:"炼";s:2:"";s:3:"炽";s:2:"";s:3:"炾";s:2:"";s:3:"炿";s:2:"";s:3:"烀";s:2:"";s:3:"烁";s:2:"˸";s:3:"烂";s:2:"";s:3:"烃";s:2:"";s:3:"烄";s:2:"";s:3:"烅";s:2:"";s:3:"烆";s:2:"";s:3:"烇";s:2:"";s:3:"烈";s:2:"";s:3:"烉";s:2:"";s:3:"烊";s:2:"";s:3:"烋";s:2:"";s:3:"烌";s:2:"";s:3:"烍";s:2:"";s:3:"烎";s:2:"";s:3:"烏";s:2:"";s:3:"烐";s:2:"";s:3:"烑";s:2:"";s:3:"烒";s:2:"";s:3:"烓";s:2:"";s:3:"烔";s:2:"";s:3:"烕";s:2:"";s:3:"烖";s:2:"";s:3:"烗";s:2:"";s:3:"烘";s:2:"";s:3:"烙";s:2:"";s:3:"烚";s:2:"";s:3:"烛";s:2:"";s:3:"烜";s:2:"@";s:3:"烝";s:2:"A";s:3:"烞";s:2:"B";s:3:"烟";s:2:"";s:3:"烠";s:2:"C";s:3:"烡";s:2:"D";s:3:"烢";s:2:"E";s:3:"烣";s:2:"F";s:3:"烤";s:2:"";s:3:"烥";s:2:"G";s:3:"烦";s:2:"";s:3:"烧";s:2:"";s:3:"烨";s:2:"";s:3:"烩";s:2:"";s:3:"烪";s:2:"H";s:3:"烫";s:2:"";s:3:"烬";s:2:"";s:3:"热";s:2:"";s:3:"烮";s:2:"I";s:3:"烯";s:2:"ϩ";s:3:"烰";s:2:"J";s:3:"烱";s:2:"K";s:3:"烲";s:2:"L";s:3:"烳";s:2:"M";s:3:"烴";s:2:"N";s:3:"烵";s:2:"O";s:3:"烶";s:2:"P";s:3:"烷";s:2:"";s:3:"烸";s:2:"Q";s:3:"烹";s:2:"";s:3:"烺";s:2:"R";s:3:"烻";s:2:"S";s:3:"烼";s:2:"T";s:3:"烽";s:2:"";s:3:"烾";s:2:"U";s:3:"烿";s:2:"V";s:3:"焀";s:2:"W";s:3:"焁";s:2:"X";s:3:"焂";s:2:"Y";s:3:"焃";s:2:"Z";s:3:"焄";s:2:"[";s:3:"焅";s:2:"\";s:3:"焆";s:2:"]";s:3:"焇";s:2:"^";s:3:"焈";s:2:"_";s:3:"焉";s:2:"";s:3:"焊";s:2:"";s:3:"焋";s:2:"`";s:3:"焌";s:2:"a";s:3:"焍";s:2:"b";s:3:"焎";s:2:"c";s:3:"焏";s:2:"d";s:3:"焐";s:2:"";s:3:"焑";s:2:"e";s:3:"焒";s:2:"f";s:3:"焓";s:2:"";s:3:"焔";s:2:"g";s:3:"焕";s:2:"";s:3:"焖";s:2:"";s:3:"焗";s:2:"h";s:3:"焘";s:2:"";s:3:"焙";s:2:"";s:3:"焚";s:2:"";s:3:"焛";s:2:"i";s:3:"焜";s:2:"j";s:3:"焝";s:2:"k";s:3:"焞";s:2:"l";s:3:"焟";s:2:"m";s:3:"焠";s:2:"n";s:3:"無";s:2:"o";s:3:"焢";s:2:"p";s:3:"焣";s:2:"q";s:3:"焤";s:2:"r";s:3:"焥";s:2:"s";s:3:"焦";s:2:"";s:3:"焧";s:2:"t";s:3:"焨";s:2:"u";s:3:"焩";s:2:"v";s:3:"焪";s:2:"w";s:3:"焫";s:2:"x";s:3:"焬";s:2:"y";s:3:"焭";s:2:"z";s:3:"焮";s:2:"{";s:3:"焯";s:2:"";s:3:"焰";s:2:"";s:3:"焱";s:2:"";s:3:"焲";s:2:"|";s:3:"焳";s:2:"}";s:3:"焴";s:2:"~";s:3:"焵";s:2:"";s:3:"然";s:2:"Ȼ";s:3:"焷";s:2:"";s:3:"焸";s:2:"";s:3:"焹";s:2:"";s:3:"焺";s:2:"";s:3:"焻";s:2:"";s:3:"焼";s:2:"";s:3:"焽";s:2:"";s:3:"焾";s:2:"";s:3:"焿";s:2:"";s:3:"煀";s:2:"";s:3:"煁";s:2:"";s:3:"煂";s:2:"";s:3:"煃";s:2:"";s:3:"煄";s:2:"";s:3:"煅";s:2:"";s:3:"煆";s:2:"";s:3:"煇";s:2:"";s:3:"煈";s:2:"";s:3:"煉";s:2:"";s:3:"煊";s:2:"";s:3:"煋";s:2:"";s:3:"煌";s:2:"";s:3:"煍";s:2:"";s:3:"煎";s:2:"";s:3:"煏";s:2:"";s:3:"煐";s:2:"";s:3:"煑";s:2:"";s:3:"煒";s:2:"";s:3:"煓";s:2:"";s:3:"煔";s:2:"";s:3:"煕";s:2:"";s:3:"煖";s:2:"";s:3:"煗";s:2:"";s:3:"煘";s:2:"";s:3:"煙";s:2:"";s:3:"煚";s:2:"";s:3:"煛";s:2:"";s:3:"煜";s:2:"";s:3:"煝";s:2:"";s:3:"煞";s:2:"ɷ";s:3:"煟";s:2:"";s:3:"煠";s:2:"";s:3:"煡";s:2:"";s:3:"煢";s:2:"";s:3:"煣";s:2:"";s:3:"煤";s:2:"ú";s:3:"煥";s:2:"";s:3:"煦";s:2:"";s:3:"照";s:2:"";s:3:"煨";s:2:"";s:3:"煩";s:2:"";s:3:"煪";s:2:"";s:3:"煫";s:2:"";s:3:"煬";s:2:"";s:3:"煭";s:2:"";s:3:"煮";s:2:"";s:3:"煯";s:2:"";s:3:"煰";s:2:"";s:3:"煱";s:2:"";s:3:"煲";s:2:"";s:3:"煳";s:2:"";s:3:"煴";s:2:"";s:3:"煵";s:2:"";s:3:"煶";s:2:"";s:3:"煷";s:2:"";s:3:"煸";s:2:"";s:3:"煹";s:2:"";s:3:"煺";s:2:"";s:3:"煻";s:2:"";s:3:"煼";s:2:"";s:3:"煽";s:2:"ɿ";s:3:"煾";s:2:"";s:3:"煿";s:2:"";s:3:"熀";s:2:"";s:3:"熁";s:2:"";s:3:"熂";s:2:"";s:3:"熃";s:2:"";s:3:"熄";s:2:"Ϩ";s:3:"熅";s:2:"";s:3:"熆";s:2:"";s:3:"熇";s:2:"";s:3:"熈";s:2:"";s:3:"熉";s:2:"";s:3:"熊";s:2:"";s:3:"熋";s:2:"";s:3:"熌";s:2:"";s:3:"熍";s:2:"";s:3:"熎";s:2:"";s:3:"熏";s:2:"Ѭ";s:3:"熐";s:2:"";s:3:"熑";s:2:"";s:3:"熒";s:2:"";s:3:"熓";s:2:"";s:3:"熔";s:2:"";s:3:"熕";s:2:"";s:3:"熖";s:2:"";s:3:"熗";s:2:"";s:3:"熘";s:2:"";s:3:"熙";s:2:"";s:3:"熚";s:2:"";s:3:"熛";s:2:"";s:3:"熜";s:2:"";s:3:"熝";s:2:"";s:3:"熞";s:2:"";s:3:"熟";s:2:"";s:3:"熠";s:2:"";s:3:"熡";s:2:"";s:3:"熢";s:2:"";s:3:"熣";s:2:"";s:3:"熤";s:2:"";s:3:"熥";s:2:"";s:3:"熦";s:2:"";s:3:"熧";s:2:"";s:3:"熨";s:2:"";s:3:"熩";s:2:"";s:3:"熪";s:2:"";s:3:"熫";s:2:"";s:3:"熬";s:2:"";s:3:"熭";s:2:"";s:3:"熮";s:2:"";s:3:"熯";s:2:"";s:3:"熰";s:2:"";s:3:"熱";s:2:"";s:3:"熲";s:2:"";s:3:"熳";s:2:"";s:3:"熴";s:2:"";s:3:"熵";s:2:"";s:3:"熶";s:2:"";s:3:"熷";s:2:"";s:3:"熸";s:2:"";s:3:"熹";s:2:"";s:3:"熺";s:2:"";s:3:"熻";s:2:"";s:3:"熼";s:2:"";s:3:"熽";s:2:"";s:3:"熾";s:2:"";s:3:"熿";s:2:"";s:3:"燀";s:2:"";s:3:"燁";s:2:"";s:3:"燂";s:2:"";s:3:"燃";s:2:"ȼ";s:3:"燄";s:2:"";s:3:"燅";s:2:"";s:3:"燆";s:2:"";s:3:"燇";s:2:"";s:3:"燈";s:2:"";s:3:"燉";s:2:"";s:3:"燊";s:2:"";s:3:"燋";s:2:"";s:3:"燌";s:2:"";s:3:"燍";s:2:"";s:3:"燎";s:2:"";s:3:"燏";s:2:"";s:3:"燐";s:2:"";s:3:"燑";s:2:"";s:3:"燒";s:2:"";s:3:"燓";s:2:"";s:3:"燔";s:2:"";s:3:"燕";s:2:"";s:3:"燖";s:2:"@";s:3:"燗";s:2:"A";s:3:"燘";s:2:"B";s:3:"燙";s:2:"C";s:3:"燚";s:2:"D";s:3:"燛";s:2:"E";s:3:"燜";s:2:"F";s:3:"燝";s:2:"G";s:3:"燞";s:2:"H";s:3:"營";s:2:"I";s:3:"燠";s:2:"";s:3:"燡";s:2:"J";s:3:"燢";s:2:"K";s:3:"燣";s:2:"L";s:3:"燤";s:2:"M";s:3:"燥";s:2:"";s:3:"燦";s:2:"N";s:3:"燧";s:2:"";s:3:"燨";s:2:"O";s:3:"燩";s:2:"P";s:3:"燪";s:2:"Q";s:3:"燫";s:2:"R";s:3:"燬";s:2:"S";s:3:"燭";s:2:"T";s:3:"燮";s:2:"";s:3:"燯";s:2:"U";s:3:"燰";s:2:"V";s:3:"燱";s:2:"W";s:3:"燲";s:2:"X";s:3:"燳";s:2:"Y";s:3:"燴";s:2:"Z";s:3:"燵";s:2:"[";s:3:"燶";s:2:"\";s:3:"燷";s:2:"]";s:3:"燸";s:2:"^";s:3:"燹";s:2:"";s:3:"燺";s:2:"_";s:3:"燻";s:2:"`";s:3:"燼";s:2:"a";s:3:"燽";s:2:"b";s:3:"燾";s:2:"c";s:3:"燿";s:2:"d";s:3:"爀";s:2:"e";s:3:"爁";s:2:"f";s:3:"爂";s:2:"g";s:3:"爃";s:2:"h";s:3:"爄";s:2:"i";s:3:"爅";s:2:"j";s:3:"爆";s:2:"";s:3:"爇";s:2:"k";s:3:"爈";s:2:"l";s:3:"爉";s:2:"m";s:3:"爊";s:2:"n";s:3:"爋";s:2:"o";s:3:"爌";s:2:"p";s:3:"爍";s:2:"q";s:3:"爎";s:2:"r";s:3:"爏";s:2:"s";s:3:"爐";s:2:"t";s:3:"爑";s:2:"u";s:3:"爒";s:2:"v";s:3:"爓";s:2:"w";s:3:"爔";s:2:"x";s:3:"爕";s:2:"y";s:3:"爖";s:2:"z";s:3:"爗";s:2:"{";s:3:"爘";s:2:"|";s:3:"爙";s:2:"}";s:3:"爚";s:2:"~";s:3:"爛";s:2:"";s:3:"爜";s:2:"";s:3:"爝";s:2:"";s:3:"爞";s:2:"";s:3:"爟";s:2:"";s:3:"爠";s:2:"";s:3:"爡";s:2:"";s:3:"爢";s:2:"";s:3:"爣";s:2:"";s:3:"爤";s:2:"";s:3:"爥";s:2:"";s:3:"爦";s:2:"";s:3:"爧";s:2:"";s:3:"爨";s:2:"";s:3:"爩";s:2:"";s:3:"爪";s:2:"צ";s:3:"爫";s:2:"";s:3:"爬";s:2:"";s:3:"爭";s:2:"";s:3:"爮";s:2:"";s:3:"爯";s:2:"";s:3:"爰";s:2:"";s:3:"爱";s:2:"";s:3:"爲";s:2:"";s:3:"爳";s:2:"";s:3:"爴";s:2:"";s:3:"爵";s:2:"";s:3:"父";s:2:"";s:3:"爷";s:2:"ү";s:3:"爸";s:2:"";s:3:"爹";s:2:"";s:3:"爺";s:2:"";s:3:"爻";s:2:"س";s:3:"爼";s:2:"";s:3:"爽";s:2:"ˬ";s:3:"爾";s:2:"";s:3:"爿";s:2:"";s:3:"牀";s:2:"";s:3:"牁";s:2:"";s:3:"牂";s:2:"";s:3:"牃";s:2:"";s:3:"牄";s:2:"";s:3:"牅";s:2:"";s:3:"牆";s:2:"";s:3:"片";s:2:"Ƭ";s:3:"版";s:2:"";s:3:"牉";s:2:"";s:3:"牊";s:2:"";s:3:"牋";s:2:"";s:3:"牌";s:2:"";s:3:"牍";s:2:"";s:3:"牎";s:2:"";s:3:"牏";s:2:"";s:3:"牐";s:2:"";s:3:"牑";s:2:"";s:3:"牒";s:2:"";s:3:"牓";s:2:"";s:3:"牔";s:2:"";s:3:"牕";s:2:"";s:3:"牖";s:2:"";s:3:"牗";s:2:"";s:3:"牘";s:2:"";s:3:"牙";s:2:"";s:3:"牚";s:2:"";s:3:"牛";s:2:"ţ";s:3:"牜";s:2:"";s:3:"牝";s:2:"";s:3:"牞";s:2:"";s:3:"牟";s:2:"Ĳ";s:3:"牠";s:2:"";s:3:"牡";s:2:"ĵ";s:3:"牢";s:2:"";s:3:"牣";s:2:"";s:3:"牤";s:2:"";s:3:"牥";s:2:"";s:3:"牦";s:2:"";s:3:"牧";s:2:"";s:3:"牨";s:2:"";s:3:"物";s:2:"";s:3:"牪";s:2:"";s:3:"牫";s:2:"";s:3:"牬";s:2:"";s:3:"牭";s:2:"";s:3:"牮";s:2:"";s:3:"牯";s:2:"";s:3:"牰";s:2:"";s:3:"牱";s:2:"";s:3:"牲";s:2:"";s:3:"牳";s:2:"";s:3:"牴";s:2:"";s:3:"牵";s:2:"ǣ";s:3:"牶";s:2:"";s:3:"牷";s:2:"";s:3:"牸";s:2:"";s:3:"特";s:2:"";s:3:"牺";s:2:"";s:3:"牻";s:2:"";s:3:"牼";s:2:"";s:3:"牽";s:2:"";s:3:"牾";s:2:"";s:3:"牿";s:2:"";s:3:"犀";s:2:"Ϭ";s:3:"犁";s:2:"";s:3:"犂";s:2:"";s:3:"犃";s:2:"";s:3:"犄";s:2:"";s:3:"犅";s:2:"";s:3:"犆";s:2:"";s:3:"犇";s:2:"";s:3:"犈";s:2:"";s:3:"犉";s:2:"";s:3:"犊";s:2:"";s:3:"犋";s:2:"";s:3:"犌";s:2:"";s:3:"犍";s:2:"";s:3:"犎";s:2:"";s:3:"犏";s:2:"";s:3:"犐";s:2:"";s:3:"犑";s:2:"";s:3:"犒";s:2:"";s:3:"犓";s:2:"";s:3:"犔";s:2:"";s:3:"犕";s:2:"";s:3:"犖";s:2:"";s:3:"犗";s:2:"";s:3:"犘";s:2:"";s:3:"犙";s:2:"";s:3:"犚";s:2:"";s:3:"犛";s:2:"";s:3:"犜";s:2:"";s:3:"犝";s:2:"";s:3:"犞";s:2:"";s:3:"犟";s:2:"";s:3:"犠";s:2:"";s:3:"犡";s:2:"";s:3:"犢";s:2:"";s:3:"犣";s:2:"";s:3:"犤";s:2:"";s:3:"犥";s:2:"";s:3:"犦";s:2:"";s:3:"犧";s:2:"";s:3:"犨";s:2:"";s:3:"犩";s:2:"";s:3:"犪";s:2:"";s:3:"犫";s:2:"";s:3:"犬";s:2:"Ȯ";s:3:"犭";s:2:"";s:3:"犮";s:2:"";s:3:"犯";s:2:"";s:3:"犰";s:2:"";s:3:"犱";s:2:"";s:3:"犲";s:2:"";s:3:"犳";s:2:"";s:3:"犴";s:2:"";s:3:"犵";s:2:"";s:3:"状";s:2:"״";s:3:"犷";s:2:"";s:3:"犸";s:2:"";s:3:"犹";s:2:"";s:3:"犺";s:2:"";s:3:"犻";s:2:"";s:3:"犼";s:2:"";s:3:"犽";s:2:"";s:3:"犾";s:2:"";s:3:"犿";s:2:"";s:3:"狀";s:2:"";s:3:"狁";s:2:"";s:3:"狂";s:2:"";s:3:"狃";s:2:"";s:3:"狄";s:2:"";s:3:"狅";s:2:"";s:3:"狆";s:2:"";s:3:"狇";s:2:"";s:3:"狈";s:2:"";s:3:"狉";s:2:"";s:3:"狊";s:2:"";s:3:"狋";s:2:"";s:3:"狌";s:2:"";s:3:"狍";s:2:"";s:3:"狎";s:2:"";s:3:"狏";s:2:"";s:3:"狐";s:2:"";s:3:"狑";s:2:"";s:3:"狒";s:2:"";s:3:"狓";s:2:"";s:3:"狔";s:2:"";s:3:"狕";s:2:"";s:3:"狖";s:2:"";s:3:"狗";s:2:"";s:3:"狘";s:2:"";s:3:"狙";s:2:"";s:3:"狚";s:2:"";s:3:"狛";s:2:"";s:3:"狜";s:2:"@";s:3:"狝";s:2:"A";s:3:"狞";s:2:"";s:3:"狟";s:2:"B";s:3:"狠";s:2:"";s:3:"狡";s:2:"";s:3:"狢";s:2:"C";s:3:"狣";s:2:"D";s:3:"狤";s:2:"E";s:3:"狥";s:2:"F";s:3:"狦";s:2:"G";s:3:"狧";s:2:"H";s:3:"狨";s:2:"";s:3:"狩";s:2:"";s:3:"狪";s:2:"I";s:3:"狫";s:2:"J";s:3:"独";s:2:"";s:3:"狭";s:2:"";s:3:"狮";s:2:"ʨ";s:3:"狯";s:2:"";s:3:"狰";s:2:"";s:3:"狱";s:2:"";s:3:"狲";s:2:"";s:3:"狳";s:2:"";s:3:"狴";s:2:"";s:3:"狵";s:2:"K";s:3:"狶";s:2:"L";s:3:"狷";s:2:"";s:3:"狸";s:2:"";s:3:"狹";s:2:"M";s:3:"狺";s:2:"";s:3:"狻";s:2:"";s:3:"狼";s:2:"";s:3:"狽";s:2:"N";s:3:"狾";s:2:"O";s:3:"狿";s:2:"P";s:3:"猀";s:2:"Q";s:3:"猁";s:2:"";s:3:"猂";s:2:"R";s:3:"猃";s:2:"";s:3:"猄";s:2:"S";s:3:"猅";s:2:"T";s:3:"猆";s:2:"U";s:3:"猇";s:2:"V";s:3:"猈";s:2:"W";s:3:"猉";s:2:"X";s:3:"猊";s:2:"";s:3:"猋";s:2:"Y";s:3:"猌";s:2:"Z";s:3:"猍";s:2:"[";s:3:"猎";s:2:"";s:3:"猏";s:2:"\";s:3:"猐";s:2:"]";s:3:"猑";s:2:"^";s:3:"猒";s:2:"_";s:3:"猓";s:2:"";s:3:"猔";s:2:"`";s:3:"猕";s:2:"";s:3:"猖";s:2:"";s:3:"猗";s:2:"";s:3:"猘";s:2:"a";s:3:"猙";s:2:"b";s:3:"猚";s:2:"c";s:3:"猛";s:2:"";s:3:"猜";s:2:"";s:3:"猝";s:2:"";s:3:"猞";s:2:"";s:3:"猟";s:2:"d";s:3:"猠";s:2:"e";s:3:"猡";s:2:"";s:3:"猢";s:2:"";s:3:"猣";s:2:"f";s:3:"猤";s:2:"g";s:3:"猥";s:2:"";s:3:"猦";s:2:"h";s:3:"猧";s:2:"i";s:3:"猨";s:2:"j";s:3:"猩";s:2:"";s:3:"猪";s:2:"";s:3:"猫";s:2:"è";s:3:"猬";s:2:"";s:3:"猭";s:2:"k";s:3:"献";s:2:"";s:3:"猯";s:2:"l";s:3:"猰";s:2:"m";s:3:"猱";s:2:"";s:3:"猲";s:2:"n";s:3:"猳";s:2:"o";s:3:"猴";s:2:"";s:3:"猵";s:2:"p";s:3:"猶";s:2:"q";s:3:"猷";s:2:"";s:3:"猸";s:2:"";s:3:"猹";s:2:"";s:3:"猺";s:2:"r";s:3:"猻";s:2:"s";s:3:"猼";s:2:"t";s:3:"猽";s:2:"u";s:3:"猾";s:2:"";s:3:"猿";s:2:"Գ";s:3:"獀";s:2:"v";s:3:"獁";s:2:"w";s:3:"獂";s:2:"x";s:3:"獃";s:2:"y";s:3:"獄";s:2:"z";s:3:"獅";s:2:"{";s:3:"獆";s:2:"|";s:3:"獇";s:2:"}";s:3:"獈";s:2:"~";s:3:"獉";s:2:"";s:3:"獊";s:2:"";s:3:"獋";s:2:"";s:3:"獌";s:2:"";s:3:"獍";s:2:"";s:3:"獎";s:2:"";s:3:"獏";s:2:"";s:3:"獐";s:2:"";s:3:"獑";s:2:"";s:3:"獒";s:2:"";s:3:"獓";s:2:"";s:3:"獔";s:2:"";s:3:"獕";s:2:"";s:3:"獖";s:2:"";s:3:"獗";s:2:"";s:3:"獘";s:2:"";s:3:"獙";s:2:"";s:3:"獚";s:2:"";s:3:"獛";s:2:"";s:3:"獜";s:2:"";s:3:"獝";s:2:"";s:3:"獞";s:2:"";s:3:"獟";s:2:"";s:3:"獠";s:2:"";s:3:"獡";s:2:"";s:3:"獢";s:2:"";s:3:"獣";s:2:"";s:3:"獤";s:2:"";s:3:"獥";s:2:"";s:3:"獦";s:2:"";s:3:"獧";s:2:"";s:3:"獨";s:2:"";s:3:"獩";s:2:"";s:3:"獪";s:2:"";s:3:"獫";s:2:"";s:3:"獬";s:2:"";s:3:"獭";s:2:"̡";s:3:"獮";s:2:"";s:3:"獯";s:2:"";s:3:"獰";s:2:"";s:3:"獱";s:2:"";s:3:"獲";s:2:"@";s:3:"獳";s:2:"A";s:3:"獴";s:2:"B";s:3:"獵";s:2:"C";s:3:"獶";s:2:"D";s:3:"獷";s:2:"E";s:3:"獸";s:2:"F";s:3:"獹";s:2:"G";s:3:"獺";s:2:"H";s:3:"獻";s:2:"I";s:3:"獼";s:2:"J";s:3:"獽";s:2:"K";s:3:"獾";s:2:"";s:3:"獿";s:2:"L";s:3:"玀";s:2:"M";s:3:"玁";s:2:"N";s:3:"玂";s:2:"O";s:3:"玃";s:2:"P";s:3:"玄";s:2:"";s:3:"玅";s:2:"Q";s:3:"玆";s:2:"R";s:3:"率";s:2:"";s:3:"玈";s:2:"S";s:3:"玉";s:2:"";s:3:"玊";s:2:"T";s:3:"王";s:2:"";s:3:"玌";s:2:"U";s:3:"玍";s:2:"V";s:3:"玎";s:2:"";s:3:"玏";s:2:"W";s:3:"玐";s:2:"X";s:3:"玑";s:2:"";s:3:"玒";s:2:"Y";s:3:"玓";s:2:"Z";s:3:"玔";s:2:"[";s:3:"玕";s:2:"\";s:3:"玖";s:2:"";s:3:"玗";s:2:"]";s:3:"玘";s:2:"^";s:3:"玙";s:2:"_";s:3:"玚";s:2:"`";s:3:"玛";s:2:"";s:3:"玜";s:2:"a";s:3:"玝";s:2:"b";s:3:"玞";s:2:"c";s:3:"玟";s:2:"";s:3:"玠";s:2:"d";s:3:"玡";s:2:"e";s:3:"玢";s:2:"";s:3:"玣";s:2:"f";s:3:"玤";s:2:"g";s:3:"玥";s:2:"h";s:3:"玦";s:2:"i";s:3:"玧";s:2:"j";s:3:"玨";s:2:"k";s:3:"玩";s:2:"";s:3:"玪";s:2:"l";s:3:"玫";s:2:"õ";s:3:"玬";s:2:"m";s:3:"玭";s:2:"n";s:3:"玮";s:2:"";s:3:"环";s:2:"";s:3:"现";s:2:"";s:3:"玱";s:2:"o";s:3:"玲";s:2:"";s:3:"玳";s:2:"";s:3:"玴";s:2:"p";s:3:"玵";s:2:"q";s:3:"玶";s:2:"r";s:3:"玷";s:2:"";s:3:"玸";s:2:"s";s:3:"玹";s:2:"t";s:3:"玺";s:2:"";s:3:"玻";s:2:"";s:3:"玼";s:2:"u";s:3:"玽";s:2:"v";s:3:"玾";s:2:"w";s:3:"玿";s:2:"x";s:3:"珀";s:2:"";s:3:"珁";s:2:"y";s:3:"珂";s:2:"";s:3:"珃";s:2:"z";s:3:"珄";s:2:"{";s:3:"珅";s:2:"|";s:3:"珆";s:2:"}";s:3:"珇";s:2:"~";s:3:"珈";s:2:"";s:3:"珉";s:2:"";s:3:"珊";s:2:"ɺ";s:3:"珋";s:2:"";s:3:"珌";s:2:"";s:3:"珍";s:2:"";s:3:"珎";s:2:"";s:3:"珏";s:2:"";s:3:"珐";s:2:"";s:3:"珑";s:2:"";s:3:"珒";s:2:"";s:3:"珓";s:2:"";s:3:"珔";s:2:"";s:3:"珕";s:2:"";s:3:"珖";s:2:"";s:3:"珗";s:2:"";s:3:"珘";s:2:"";s:3:"珙";s:2:"";s:3:"珚";s:2:"";s:3:"珛";s:2:"";s:3:"珜";s:2:"";s:3:"珝";s:2:"";s:3:"珞";s:2:"";s:3:"珟";s:2:"";s:3:"珠";s:2:"";s:3:"珡";s:2:"";s:3:"珢";s:2:"";s:3:"珣";s:2:"";s:3:"珤";s:2:"";s:3:"珥";s:2:"";s:3:"珦";s:2:"";s:3:"珧";s:2:"";s:3:"珨";s:2:"";s:3:"珩";s:2:"";s:3:"珪";s:2:"";s:3:"珫";s:2:"";s:3:"珬";s:2:"";s:3:"班";s:2:"";s:3:"珮";s:2:"";s:3:"珯";s:2:"";s:3:"珰";s:2:"";s:3:"珱";s:2:"";s:3:"珲";s:2:"";s:3:"珳";s:2:"";s:3:"珴";s:2:"";s:3:"珵";s:2:"";s:3:"珶";s:2:"";s:3:"珷";s:2:"";s:3:"珸";s:2:"@";s:3:"珹";s:2:"A";s:3:"珺";s:2:"B";s:3:"珻";s:2:"C";s:3:"珼";s:2:"D";s:3:"珽";s:2:"E";s:3:"現";s:2:"F";s:3:"珿";s:2:"G";s:3:"琀";s:2:"H";s:3:"琁";s:2:"I";s:3:"琂";s:2:"J";s:3:"球";s:2:"";s:3:"琄";s:2:"K";s:3:"琅";s:2:"";s:3:"理";s:2:"";s:3:"琇";s:2:"L";s:3:"琈";s:2:"M";s:3:"琉";s:2:"";s:3:"琊";s:2:"";s:3:"琋";s:2:"N";s:3:"琌";s:2:"O";s:3:"琍";s:2:"P";s:3:"琎";s:2:"Q";s:3:"琏";s:2:"";s:3:"琐";s:2:"";s:3:"琑";s:2:"R";s:3:"琒";s:2:"S";s:3:"琓";s:2:"T";s:3:"琔";s:2:"U";s:3:"琕";s:2:"V";s:3:"琖";s:2:"W";s:3:"琗";s:2:"X";s:3:"琘";s:2:"Y";s:3:"琙";s:2:"Z";s:3:"琚";s:2:"";s:3:"琛";s:2:"";s:3:"琜";s:2:"[";s:3:"琝";s:2:"\";s:3:"琞";s:2:"]";s:3:"琟";s:2:"^";s:3:"琠";s:2:"_";s:3:"琡";s:2:"`";s:3:"琢";s:2:"";s:3:"琣";s:2:"a";s:3:"琤";s:2:"b";s:3:"琥";s:2:"";s:3:"琦";s:2:"";s:3:"琧";s:2:"c";s:3:"琨";s:2:"";s:3:"琩";s:2:"d";s:3:"琪";s:2:"";s:3:"琫";s:2:"e";s:3:"琬";s:2:"";s:3:"琭";s:2:"f";s:3:"琮";s:2:"";s:3:"琯";s:2:"g";s:3:"琰";s:2:"";s:3:"琱";s:2:"h";s:3:"琲";s:2:"i";s:3:"琳";s:2:"";s:3:"琴";s:2:"";s:3:"琵";s:2:"";s:3:"琶";s:2:"";s:3:"琷";s:2:"j";s:3:"琸";s:2:"k";s:3:"琹";s:2:"l";s:3:"琺";s:2:"m";s:3:"琻";s:2:"n";s:3:"琼";s:2:"";s:3:"琽";s:2:"o";s:3:"琾";s:2:"p";s:3:"琿";s:2:"q";s:3:"瑀";s:2:"r";s:3:"瑁";s:2:"";s:3:"瑂";s:2:"s";s:3:"瑃";s:2:"t";s:3:"瑄";s:2:"u";s:3:"瑅";s:2:"v";s:3:"瑆";s:2:"w";s:3:"瑇";s:2:"x";s:3:"瑈";s:2:"y";s:3:"瑉";s:2:"z";s:3:"瑊";s:2:"{";s:3:"瑋";s:2:"|";s:3:"瑌";s:2:"}";s:3:"瑍";s:2:"~";s:3:"瑎";s:2:"";s:3:"瑏";s:2:"";s:3:"瑐";s:2:"";s:3:"瑑";s:2:"";s:3:"瑒";s:2:"";s:3:"瑓";s:2:"";s:3:"瑔";s:2:"";s:3:"瑕";s:2:"";s:3:"瑖";s:2:"";s:3:"瑗";s:2:"";s:3:"瑘";s:2:"";s:3:"瑙";s:2:"";s:3:"瑚";s:2:"";s:3:"瑛";s:2:"";s:3:"瑜";s:2:"";s:3:"瑝";s:2:"";s:3:"瑞";s:2:"";s:3:"瑟";s:2:"ɪ";s:3:"瑠";s:2:"";s:3:"瑡";s:2:"";s:3:"瑢";s:2:"";s:3:"瑣";s:2:"";s:3:"瑤";s:2:"";s:3:"瑥";s:2:"";s:3:"瑦";s:2:"";s:3:"瑧";s:2:"";s:3:"瑨";s:2:"";s:3:"瑩";s:2:"";s:3:"瑪";s:2:"";s:3:"瑫";s:2:"";s:3:"瑬";s:2:"";s:3:"瑭";s:2:"";s:3:"瑮";s:2:"";s:3:"瑯";s:2:"";s:3:"瑰";s:2:"";s:3:"瑱";s:2:"";s:3:"瑲";s:2:"";s:3:"瑳";s:2:"";s:3:"瑴";s:2:"";s:3:"瑵";s:2:"";s:3:"瑶";s:2:"";s:3:"瑷";s:2:"";s:3:"瑸";s:2:"";s:3:"瑹";s:2:"";s:3:"瑺";s:2:"";s:3:"瑻";s:2:"@";s:3:"瑼";s:2:"A";s:3:"瑽";s:2:"B";s:3:"瑾";s:2:"";s:3:"瑿";s:2:"C";s:3:"璀";s:2:"";s:3:"璁";s:2:"";s:3:"璂";s:2:"D";s:3:"璃";s:2:"";s:3:"璄";s:2:"E";s:3:"璅";s:2:"F";s:3:"璆";s:2:"G";s:3:"璇";s:2:"";s:3:"璈";s:2:"H";s:3:"璉";s:2:"I";s:3:"璊";s:2:"J";s:3:"璋";s:2:"";s:3:"璌";s:2:"K";s:3:"璍";s:2:"L";s:3:"璎";s:2:"";s:3:"璏";s:2:"M";s:3:"璐";s:2:"";s:3:"璑";s:2:"N";s:3:"璒";s:2:"O";s:3:"璓";s:2:"P";s:3:"璔";s:2:"Q";s:3:"璕";s:2:"R";s:3:"璖";s:2:"S";s:3:"璗";s:2:"T";s:3:"璘";s:2:"U";s:3:"璙";s:2:"V";s:3:"璚";s:2:"W";s:3:"璛";s:2:"X";s:3:"璜";s:2:"";s:3:"璝";s:2:"Y";s:3:"璞";s:2:"";s:3:"璟";s:2:"Z";s:3:"璠";s:2:"[";s:3:"璡";s:2:"\";s:3:"璢";s:2:"]";s:3:"璣";s:2:"^";s:3:"璤";s:2:"_";s:3:"璥";s:2:"`";s:3:"璦";s:2:"a";s:3:"璧";s:2:"";s:3:"璨";s:2:"";s:3:"璩";s:2:"";s:3:"璪";s:2:"b";s:3:"璫";s:2:"c";s:3:"璬";s:2:"d";s:3:"璭";s:2:"e";s:3:"璮";s:2:"f";s:3:"璯";s:2:"g";s:3:"環";s:2:"h";s:3:"璱";s:2:"i";s:3:"璲";s:2:"j";s:3:"璳";s:2:"k";s:3:"璴";s:2:"l";s:3:"璵";s:2:"m";s:3:"璶";s:2:"n";s:3:"璷";s:2:"o";s:3:"璸";s:2:"p";s:3:"璹";s:2:"q";s:3:"璺";s:2:"";s:3:"璻";s:2:"r";s:3:"璼";s:2:"s";s:3:"璽";s:2:"t";s:3:"璾";s:2:"u";s:3:"璿";s:2:"v";s:3:"瓀";s:2:"w";s:3:"瓁";s:2:"x";s:3:"瓂";s:2:"y";s:3:"瓃";s:2:"z";s:3:"瓄";s:2:"{";s:3:"瓅";s:2:"|";s:3:"瓆";s:2:"}";s:3:"瓇";s:2:"~";s:3:"瓈";s:2:"";s:3:"瓉";s:2:"";s:3:"瓊";s:2:"";s:3:"瓋";s:2:"";s:3:"瓌";s:2:"";s:3:"瓍";s:2:"";s:3:"瓎";s:2:"";s:3:"瓏";s:2:"";s:3:"瓐";s:2:"";s:3:"瓑";s:2:"";s:3:"瓒";s:2:"";s:3:"瓓";s:2:"";s:3:"瓔";s:2:"";s:3:"瓕";s:2:"";s:3:"瓖";s:2:"";s:3:"瓗";s:2:"";s:3:"瓘";s:2:"";s:3:"瓙";s:2:"";s:3:"瓚";s:2:"";s:3:"瓛";s:2:"";s:3:"瓜";s:2:"";s:3:"瓝";s:2:"";s:3:"瓞";s:2:"";s:3:"瓟";s:2:"";s:3:"瓠";s:2:"";s:3:"瓡";s:2:"";s:3:"瓢";s:2:"ư";s:3:"瓣";s:2:"";s:3:"瓤";s:2:"ȿ";s:3:"瓥";s:2:"";s:3:"瓦";s:2:"";s:3:"瓧";s:2:"";s:3:"瓨";s:2:"";s:3:"瓩";s:2:"";s:3:"瓪";s:2:"";s:3:"瓫";s:2:"";s:3:"瓬";s:2:"";s:3:"瓭";s:2:"";s:3:"瓮";s:2:"";s:3:"瓯";s:2:"";s:3:"瓰";s:2:"";s:3:"瓱";s:2:"";s:3:"瓲";s:2:"";s:3:"瓳";s:2:"@";s:3:"瓴";s:2:"";s:3:"瓵";s:2:"A";s:3:"瓶";s:2:"ƿ";s:3:"瓷";s:2:"";s:3:"瓸";s:2:"B";s:3:"瓹";s:2:"C";s:3:"瓺";s:2:"D";s:3:"瓻";s:2:"E";s:3:"瓼";s:2:"F";s:3:"瓽";s:2:"G";s:3:"瓾";s:2:"H";s:3:"瓿";s:2:"";s:3:"甀";s:2:"I";s:3:"甁";s:2:"J";s:3:"甂";s:2:"K";s:3:"甃";s:2:"L";s:3:"甄";s:2:"";s:3:"甅";s:2:"M";s:3:"甆";s:2:"N";s:3:"甇";s:2:"O";s:3:"甈";s:2:"P";s:3:"甉";s:2:"Q";s:3:"甊";s:2:"R";s:3:"甋";s:2:"S";s:3:"甌";s:2:"T";s:3:"甍";s:2:"";s:3:"甎";s:2:"U";s:3:"甏";s:2:"";s:3:"甐";s:2:"V";s:3:"甑";s:2:"";s:3:"甒";s:2:"W";s:3:"甓";s:2:"";s:3:"甔";s:2:"X";s:3:"甕";s:2:"Y";s:3:"甖";s:2:"Z";s:3:"甗";s:2:"[";s:3:"甘";s:2:"";s:3:"甙";s:2:"߰";s:3:"甚";s:2:"";s:3:"甛";s:2:"\";s:3:"甜";s:2:"";s:3:"甝";s:2:"]";s:3:"甞";s:2:"^";s:3:"生";s:2:"";s:3:"甠";s:2:"_";s:3:"甡";s:2:"`";s:3:"產";s:2:"a";s:3:"産";s:2:"b";s:3:"甤";s:2:"c";s:3:"甥";s:2:"";s:3:"甦";s:2:"d";s:3:"甧";s:2:"e";s:3:"用";s:2:"";s:3:"甩";s:2:"˦";s:3:"甪";s:2:"f";s:3:"甫";s:2:"";s:3:"甬";s:2:"";s:3:"甭";s:2:"";s:3:"甮";s:2:"g";s:3:"甯";s:2:"";s:3:"田";s:2:"";s:3:"由";s:2:"";s:3:"甲";s:2:"";s:3:"申";s:2:"";s:3:"甴";s:2:"h";s:3:"电";s:2:"";s:3:"甶";s:2:"i";s:3:"男";s:2:"";s:3:"甸";s:2:"";s:3:"甹";s:2:"j";s:3:"町";s:2:"";s:3:"画";s:2:"";s:3:"甼";s:2:"k";s:3:"甽";s:2:"l";s:3:"甾";s:2:"";s:3:"甿";s:2:"m";s:3:"畀";s:2:"";s:3:"畁";s:2:"n";s:3:"畂";s:2:"o";s:3:"畃";s:2:"p";s:3:"畄";s:2:"q";s:3:"畅";s:2:"";s:3:"畆";s:2:"r";s:3:"畇";s:2:"s";s:3:"畈";s:2:"";s:3:"畉";s:2:"t";s:3:"畊";s:2:"u";s:3:"畋";s:2:"";s:3:"界";s:2:"";s:3:"畍";s:2:"v";s:3:"畎";s:2:"";s:3:"畏";s:2:"η";s:3:"畐";s:2:"w";s:3:"畑";s:2:"x";s:3:"畒";s:2:"y";s:3:"畓";s:2:"z";s:3:"畔";s:2:"";s:3:"畕";s:2:"{";s:3:"畖";s:2:"|";s:3:"畗";s:2:"}";s:3:"畘";s:2:"~";s:3:"留";s:2:"";s:3:"畚";s:2:"";s:3:"畛";s:2:"";s:3:"畜";s:2:"";s:3:"畝";s:2:"";s:3:"畞";s:2:"";s:3:"畟";s:2:"";s:3:"畠";s:2:"";s:3:"畡";s:2:"";s:3:"畢";s:2:"";s:3:"畣";s:2:"";s:3:"畤";s:2:"";s:3:"略";s:2:"";s:3:"畦";s:2:"";s:3:"畧";s:2:"";s:3:"畨";s:2:"";s:3:"畩";s:2:"";s:3:"番";s:2:"";s:3:"畫";s:2:"";s:3:"畬";s:2:"";s:3:"畭";s:2:"";s:3:"畮";s:2:"";s:3:"畯";s:2:"";s:3:"異";s:2:"";s:3:"畱";s:2:"";s:3:"畲";s:2:"";s:3:"畳";s:2:"";s:3:"畴";s:2:"";s:3:"畵";s:2:"";s:3:"當";s:2:"";s:3:"畷";s:2:"";s:3:"畸";s:2:"";s:3:"畹";s:2:"";s:3:"畺";s:2:"";s:3:"畻";s:2:"";s:3:"畼";s:2:"";s:3:"畽";s:2:"";s:3:"畾";s:2:"";s:3:"畿";s:2:"";s:3:"疀";s:2:"";s:3:"疁";s:2:"";s:3:"疂";s:2:"";s:3:"疃";s:2:"";s:3:"疄";s:2:"";s:3:"疅";s:2:"";s:3:"疆";s:2:"";s:3:"疇";s:2:"";s:3:"疈";s:2:"@";s:3:"疉";s:2:"A";s:3:"疊";s:2:"B";s:3:"疋";s:2:"";s:3:"疌";s:2:"C";s:3:"疍";s:2:"D";s:3:"疎";s:2:"E";s:3:"疏";s:2:"";s:3:"疐";s:2:"F";s:3:"疑";s:2:"";s:3:"疒";s:2:"";s:3:"疓";s:2:"G";s:3:"疔";s:2:"";s:3:"疕";s:2:"H";s:3:"疖";s:2:"";s:3:"疗";s:2:"";s:3:"疘";s:2:"I";s:3:"疙";s:2:"";s:3:"疚";s:2:"";s:3:"疛";s:2:"J";s:3:"疜";s:2:"K";s:3:"疝";s:2:"";s:3:"疞";s:2:"L";s:3:"疟";s:2:"ű";s:3:"疠";s:2:"";s:3:"疡";s:2:"";s:3:"疢";s:2:"M";s:3:"疣";s:2:"";s:3:"疤";s:2:"";s:3:"疥";s:2:"";s:3:"疦";s:2:"N";s:3:"疧";s:2:"O";s:3:"疨";s:2:"P";s:3:"疩";s:2:"Q";s:3:"疪";s:2:"R";s:3:"疫";s:2:"";s:3:"疬";s:2:"";s:3:"疭";s:2:"S";s:3:"疮";s:2:"";s:3:"疯";s:2:"";s:3:"疰";s:2:"";s:3:"疱";s:2:"";s:3:"疲";s:2:"ƣ";s:3:"疳";s:2:"";s:3:"疴";s:2:"";s:3:"疵";s:2:"";s:3:"疶";s:2:"T";s:3:"疷";s:2:"U";s:3:"疸";s:2:"";s:3:"疹";s:2:"";s:3:"疺";s:2:"V";s:3:"疻";s:2:"W";s:3:"疼";s:2:"";s:3:"疽";s:2:"";s:3:"疾";s:2:"";s:3:"疿";s:2:"X";s:3:"痀";s:2:"Y";s:3:"痁";s:2:"Z";s:3:"痂";s:2:"";s:3:"痃";s:2:"";s:3:"痄";s:2:"";s:3:"病";s:2:"";s:3:"痆";s:2:"[";s:3:"症";s:2:"֢";s:3:"痈";s:2:"Ӹ";s:3:"痉";s:2:"";s:3:"痊";s:2:"Ȭ";s:3:"痋";s:2:"\";s:3:"痌";s:2:"]";s:3:"痍";s:2:"";s:3:"痎";s:2:"^";s:3:"痏";s:2:"_";s:3:"痐";s:2:"`";s:3:"痑";s:2:"a";s:3:"痒";s:2:"";s:3:"痓";s:2:"b";s:3:"痔";s:2:"";s:3:"痕";s:2:"";s:3:"痖";s:2:"";s:3:"痗";s:2:"c";s:3:"痘";s:2:"";s:3:"痙";s:2:"d";s:3:"痚";s:2:"e";s:3:"痛";s:2:"ʹ";s:3:"痜";s:2:"f";s:3:"痝";s:2:"g";s:3:"痞";s:2:"Ʀ";s:3:"痟";s:2:"h";s:3:"痠";s:2:"i";s:3:"痡";s:2:"j";s:3:"痢";s:2:"";s:3:"痣";s:2:"";s:3:"痤";s:2:"";s:3:"痥";s:2:"k";s:3:"痦";s:2:"";s:3:"痧";s:2:"";s:3:"痨";s:2:"";s:3:"痩";s:2:"l";s:3:"痪";s:2:"";s:3:"痫";s:2:"";s:3:"痬";s:2:"m";s:3:"痭";s:2:"n";s:3:"痮";s:2:"o";s:3:"痯";s:2:"p";s:3:"痰";s:2:"̵";s:3:"痱";s:2:"";s:3:"痲";s:2:"q";s:3:"痳";s:2:"r";s:3:"痴";s:2:"";s:3:"痵";s:2:"s";s:3:"痶";s:2:"t";s:3:"痷";s:2:"u";s:3:"痸";s:2:"v";s:3:"痹";s:2:"";s:3:"痺";s:2:"w";s:3:"痻";s:2:"x";s:3:"痼";s:2:"";s:3:"痽";s:2:"y";s:3:"痾";s:2:"z";s:3:"痿";s:2:"";s:3:"瘀";s:2:"";s:3:"瘁";s:2:"";s:3:"瘂";s:2:"{";s:3:"瘃";s:2:"";s:3:"瘄";s:2:"|";s:3:"瘅";s:2:"";s:3:"瘆";s:2:"}";s:3:"瘇";s:2:"~";s:3:"瘈";s:2:"";s:3:"瘉";s:2:"";s:3:"瘊";s:2:"";s:3:"瘋";s:2:"";s:3:"瘌";s:2:"";s:3:"瘍";s:2:"";s:3:"瘎";s:2:"";s:3:"瘏";s:2:"";s:3:"瘐";s:2:"";s:3:"瘑";s:2:"";s:3:"瘒";s:2:"";s:3:"瘓";s:2:"";s:3:"瘔";s:2:"";s:3:"瘕";s:2:"";s:3:"瘖";s:2:"";s:3:"瘗";s:2:"";s:3:"瘘";s:2:"";s:3:"瘙";s:2:"";s:3:"瘚";s:2:"";s:3:"瘛";s:2:"";s:3:"瘜";s:2:"";s:3:"瘝";s:2:"";s:3:"瘞";s:2:"";s:3:"瘟";s:2:"";s:3:"瘠";s:2:"";s:3:"瘡";s:2:"";s:3:"瘢";s:2:"";s:3:"瘣";s:2:"";s:3:"瘤";s:2:"";s:3:"瘥";s:2:"";s:3:"瘦";s:2:"";s:3:"瘧";s:2:"";s:3:"瘨";s:2:"";s:3:"瘩";s:2:"";s:3:"瘪";s:2:"";s:3:"瘫";s:2:"̱";s:3:"瘬";s:2:"";s:3:"瘭";s:2:"";s:3:"瘮";s:2:"";s:3:"瘯";s:2:"";s:3:"瘰";s:2:"";s:3:"瘱";s:2:"";s:3:"瘲";s:2:"";s:3:"瘳";s:2:"";s:3:"瘴";s:2:"";s:3:"瘵";s:2:"";s:3:"瘶";s:2:"";s:3:"瘷";s:2:"";s:3:"瘸";s:2:"ȳ";s:3:"瘹";s:2:"";s:3:"瘺";s:2:"";s:3:"瘻";s:2:"";s:3:"瘼";s:2:"";s:3:"瘽";s:2:"";s:3:"瘾";s:2:"";s:3:"瘿";s:2:"";s:3:"癀";s:2:"";s:3:"癁";s:2:"";s:3:"療";s:2:"";s:3:"癃";s:2:"";s:3:"癄";s:2:"";s:3:"癅";s:2:"@";s:3:"癆";s:2:"A";s:3:"癇";s:2:"B";s:3:"癈";s:2:"C";s:3:"癉";s:2:"D";s:3:"癊";s:2:"E";s:3:"癋";s:2:"F";s:3:"癌";s:2:"";s:3:"癍";s:2:"";s:3:"癎";s:2:"G";s:3:"癏";s:2:"H";s:3:"癐";s:2:"I";s:3:"癑";s:2:"J";s:3:"癒";s:2:"K";s:3:"癓";s:2:"L";s:3:"癔";s:2:"";s:3:"癕";s:2:"M";s:3:"癖";s:2:"";s:3:"癗";s:2:"N";s:3:"癘";s:2:"O";s:3:"癙";s:2:"P";s:3:"癚";s:2:"Q";s:3:"癛";s:2:"R";s:3:"癜";s:2:"";s:3:"癝";s:2:"S";s:3:"癞";s:2:"";s:3:"癟";s:2:"T";s:3:"癠";s:2:"U";s:3:"癡";s:2:"V";s:3:"癢";s:2:"W";s:3:"癣";s:2:"Ѣ";s:3:"癤";s:2:"X";s:3:"癥";s:2:"Y";s:3:"癦";s:2:"Z";s:3:"癧";s:2:"[";s:3:"癨";s:2:"\";s:3:"癩";s:2:"]";s:3:"癪";s:2:"^";s:3:"癫";s:2:"";s:3:"癬";s:2:"_";s:3:"癭";s:2:"`";s:3:"癮";s:2:"a";s:3:"癯";s:2:"";s:3:"癰";s:2:"b";s:3:"癱";s:2:"c";s:3:"癲";s:2:"d";s:3:"癳";s:2:"e";s:3:"癴";s:2:"f";s:3:"癵";s:2:"g";s:3:"癶";s:2:"h";s:3:"癷";s:2:"i";s:3:"癸";s:2:"";s:3:"癹";s:2:"j";s:3:"発";s:2:"k";s:3:"登";s:2:"";s:3:"發";s:2:"l";s:3:"白";s:2:"";s:3:"百";s:2:"";s:3:"癿";s:2:"m";s:3:"皀";s:2:"n";s:3:"皁";s:2:"o";s:3:"皂";s:2:"";s:3:"皃";s:2:"p";s:3:"的";s:2:"";s:3:"皅";s:2:"q";s:3:"皆";s:2:"";s:3:"皇";s:2:"";s:3:"皈";s:2:"";s:3:"皉";s:2:"r";s:3:"皊";s:2:"s";s:3:"皋";s:2:"";s:3:"皌";s:2:"t";s:3:"皍";s:2:"u";s:3:"皎";s:2:"";s:3:"皏";s:2:"v";s:3:"皐";s:2:"w";s:3:"皑";s:2:"";s:3:"皒";s:2:"x";s:3:"皓";s:2:"";s:3:"皔";s:2:"y";s:3:"皕";s:2:"z";s:3:"皖";s:2:"";s:3:"皗";s:2:"{";s:3:"皘";s:2:"|";s:3:"皙";s:2:"";s:3:"皚";s:2:"}";s:3:"皛";s:2:"~";s:3:"皜";s:2:"";s:3:"皝";s:2:"";s:3:"皞";s:2:"";s:3:"皟";s:2:"";s:3:"皠";s:2:"";s:3:"皡";s:2:"";s:3:"皢";s:2:"";s:3:"皣";s:2:"";s:3:"皤";s:2:"";s:3:"皥";s:2:"";s:3:"皦";s:2:"";s:3:"皧";s:2:"";s:3:"皨";s:2:"";s:3:"皩";s:2:"";s:3:"皪";s:2:"";s:3:"皫";s:2:"";s:3:"皬";s:2:"";s:3:"皭";s:2:"";s:3:"皮";s:2:"Ƥ";s:3:"皯";s:2:"";s:3:"皰";s:2:"";s:3:"皱";s:2:"";s:3:"皲";s:2:"";s:3:"皳";s:2:"";s:3:"皴";s:2:"";s:3:"皵";s:2:"";s:3:"皶";s:2:"";s:3:"皷";s:2:"";s:3:"皸";s:2:"";s:3:"皹";s:2:"";s:3:"皺";s:2:"";s:3:"皻";s:2:"";s:3:"皼";s:2:"";s:3:"皽";s:2:"";s:3:"皾";s:2:"";s:3:"皿";s:2:"";s:3:"盀";s:2:"";s:3:"盁";s:2:"";s:3:"盂";s:2:"";s:3:"盃";s:2:"";s:3:"盄";s:2:"@";s:3:"盅";s:2:"";s:3:"盆";s:2:"";s:3:"盇";s:2:"A";s:3:"盈";s:2:"ӯ";s:3:"盉";s:2:"B";s:3:"益";s:2:"";s:3:"盋";s:2:"C";s:3:"盌";s:2:"D";s:3:"盍";s:2:"";s:3:"盎";s:2:"";s:3:"盏";s:2:"յ";s:3:"盐";s:2:"";s:3:"监";s:2:"";s:3:"盒";s:2:"";s:3:"盓";s:2:"E";s:3:"盔";s:2:"";s:3:"盕";s:2:"F";s:3:"盖";s:2:"";s:3:"盗";s:2:"";s:3:"盘";s:2:"";s:3:"盙";s:2:"G";s:3:"盚";s:2:"H";s:3:"盛";s:2:"ʢ";s:3:"盜";s:2:"I";s:3:"盝";s:2:"J";s:3:"盞";s:2:"K";s:3:"盟";s:2:"";s:3:"盠";s:2:"L";s:3:"盡";s:2:"M";s:3:"盢";s:2:"N";s:3:"監";s:2:"O";s:3:"盤";s:2:"P";s:3:"盥";s:2:"";s:3:"盦";s:2:"Q";s:3:"盧";s:2:"R";s:3:"盨";s:2:"S";s:3:"盩";s:2:"T";s:3:"盪";s:2:"U";s:3:"盫";s:2:"V";s:3:"盬";s:2:"W";s:3:"盭";s:2:"X";s:3:"目";s:2:"Ŀ";s:3:"盯";s:2:"";s:3:"盰";s:2:"Y";s:3:"盱";s:2:"";s:3:"盲";s:2:"ä";s:3:"盳";s:2:"Z";s:3:"直";s:2:"ֱ";s:3:"盵";s:2:"[";s:3:"盶";s:2:"\";s:3:"盷";s:2:"]";s:3:"相";s:2:"";s:3:"盹";s:2:"";s:3:"盺";s:2:"^";s:3:"盻";s:2:"_";s:3:"盼";s:2:"";s:3:"盽";s:2:"`";s:3:"盾";s:2:"";s:3:"盿";s:2:"a";s:3:"眀";s:2:"b";s:3:"省";s:2:"ʡ";s:3:"眂";s:2:"c";s:3:"眃";s:2:"d";s:3:"眄";s:2:"";s:3:"眅";s:2:"e";s:3:"眆";s:2:"f";s:3:"眇";s:2:"";s:3:"眈";s:2:"";s:3:"眉";s:2:"ü";s:3:"眊";s:2:"g";s:3:"看";s:2:"";s:3:"県";s:2:"h";s:3:"眍";s:2:"";s:3:"眎";s:2:"i";s:3:"眏";s:2:"j";s:3:"眐";s:2:"k";s:3:"眑";s:2:"l";s:3:"眒";s:2:"m";s:3:"眓";s:2:"n";s:3:"眔";s:2:"o";s:3:"眕";s:2:"p";s:3:"眖";s:2:"q";s:3:"眗";s:2:"r";s:3:"眘";s:2:"s";s:3:"眙";s:2:"";s:3:"眚";s:2:"";s:3:"眛";s:2:"t";s:3:"眜";s:2:"u";s:3:"眝";s:2:"v";s:3:"眞";s:2:"w";s:3:"真";s:2:"";s:3:"眠";s:2:"";s:3:"眡";s:2:"x";s:3:"眢";s:2:"";s:3:"眣";s:2:"y";s:3:"眤";s:2:"z";s:3:"眥";s:2:"{";s:3:"眦";s:2:"";s:3:"眧";s:2:"|";s:3:"眨";s:2:"գ";s:3:"眩";s:2:"ѣ";s:3:"眪";s:2:"}";s:3:"眫";s:2:"~";s:3:"眬";s:2:"";s:3:"眭";s:2:"";s:3:"眮";s:2:"";s:3:"眯";s:2:"";s:3:"眰";s:2:"";s:3:"眱";s:2:"";s:3:"眲";s:2:"";s:3:"眳";s:2:"";s:3:"眴";s:2:"";s:3:"眵";s:2:"";s:3:"眶";s:2:"";s:3:"眷";s:2:"";s:3:"眸";s:2:"";s:3:"眹";s:2:"";s:3:"眺";s:2:"";s:3:"眻";s:2:"";s:3:"眼";s:2:"";s:3:"眽";s:2:"";s:3:"眾";s:2:"";s:3:"眿";s:2:"";s:3:"着";s:2:"";s:3:"睁";s:2:"";s:3:"睂";s:2:"";s:3:"睃";s:2:"";s:3:"睄";s:2:"";s:3:"睅";s:2:"";s:3:"睆";s:2:"";s:3:"睇";s:2:"";s:3:"睈";s:2:"";s:3:"睉";s:2:"";s:3:"睊";s:2:"";s:3:"睋";s:2:"";s:3:"睌";s:2:"";s:3:"睍";s:2:"";s:3:"睎";s:2:"";s:3:"睏";s:2:"";s:3:"睐";s:2:"";s:3:"睑";s:2:"";s:3:"睒";s:2:"";s:3:"睓";s:2:"";s:3:"睔";s:2:"";s:3:"睕";s:2:"";s:3:"睖";s:2:"";s:3:"睗";s:2:"";s:3:"睘";s:2:"";s:3:"睙";s:2:"";s:3:"睚";s:2:"";s:3:"睛";s:2:"";s:3:"睜";s:2:"";s:3:"睝";s:2:"@";s:3:"睞";s:2:"A";s:3:"睟";s:2:"B";s:3:"睠";s:2:"C";s:3:"睡";s:2:"˯";s:3:"睢";s:2:"";s:3:"督";s:2:"";s:3:"睤";s:2:"D";s:3:"睥";s:2:"";s:3:"睦";s:2:"";s:3:"睧";s:2:"E";s:3:"睨";s:2:"";s:3:"睩";s:2:"F";s:3:"睪";s:2:"G";s:3:"睫";s:2:"";s:3:"睬";s:2:"";s:3:"睭";s:2:"H";s:3:"睮";s:2:"I";s:3:"睯";s:2:"J";s:3:"睰";s:2:"K";s:3:"睱";s:2:"L";s:3:"睲";s:2:"M";s:3:"睳";s:2:"N";s:3:"睴";s:2:"O";s:3:"睵";s:2:"P";s:3:"睶";s:2:"Q";s:3:"睷";s:2:"R";s:3:"睸";s:2:"S";s:3:"睹";s:2:"";s:3:"睺";s:2:"T";s:3:"睻";s:2:"U";s:3:"睼";s:2:"V";s:3:"睽";s:2:"";s:3:"睾";s:2:"غ";s:3:"睿";s:2:"";s:3:"瞀";s:2:"";s:3:"瞁";s:2:"W";s:3:"瞂";s:2:"X";s:3:"瞃";s:2:"Y";s:3:"瞄";s:2:"";s:3:"瞅";s:2:"";s:3:"瞆";s:2:"Z";s:3:"瞇";s:2:"[";s:3:"瞈";s:2:"\";s:3:"瞉";s:2:"]";s:3:"瞊";s:2:"^";s:3:"瞋";s:2:"_";s:3:"瞌";s:2:"";s:3:"瞍";s:2:"";s:3:"瞎";s:2:"Ϲ";s:3:"瞏";s:2:"`";s:3:"瞐";s:2:"a";s:3:"瞑";s:2:"";s:3:"瞒";s:2:"";s:3:"瞓";s:2:"b";s:3:"瞔";s:2:"c";s:3:"瞕";s:2:"d";s:3:"瞖";s:2:"e";s:3:"瞗";s:2:"f";s:3:"瞘";s:2:"g";s:3:"瞙";s:2:"h";s:3:"瞚";s:2:"i";s:3:"瞛";s:2:"j";s:3:"瞜";s:2:"k";s:3:"瞝";s:2:"l";s:3:"瞞";s:2:"m";s:3:"瞟";s:2:"";s:3:"瞠";s:2:"";s:3:"瞡";s:2:"n";s:3:"瞢";s:2:"ޫ";s:3:"瞣";s:2:"o";s:3:"瞤";s:2:"p";s:3:"瞥";s:2:"Ƴ";s:3:"瞦";s:2:"q";s:3:"瞧";s:2:"";s:3:"瞨";s:2:"r";s:3:"瞩";s:2:"";s:3:"瞪";s:2:"";s:3:"瞫";s:2:"s";s:3:"瞬";s:2:"˲";s:3:"瞭";s:2:"t";s:3:"瞮";s:2:"u";s:3:"瞯";s:2:"v";s:3:"瞰";s:2:"";s:3:"瞱";s:2:"w";s:3:"瞲";s:2:"x";s:3:"瞳";s:2:"ͫ";s:3:"瞴";s:2:"y";s:3:"瞵";s:2:"";s:3:"瞶";s:2:"z";s:3:"瞷";s:2:"{";s:3:"瞸";s:2:"|";s:3:"瞹";s:2:"}";s:3:"瞺";s:2:"~";s:3:"瞻";s:2:"հ";s:3:"瞼";s:2:"";s:3:"瞽";s:2:"";s:3:"瞾";s:2:"";s:3:"瞿";s:2:"";s:3:"矀";s:2:"";s:3:"矁";s:2:"";s:3:"矂";s:2:"";s:3:"矃";s:2:"";s:3:"矄";s:2:"";s:3:"矅";s:2:"";s:3:"矆";s:2:"";s:3:"矇";s:2:"";s:3:"矈";s:2:"";s:3:"矉";s:2:"";s:3:"矊";s:2:"";s:3:"矋";s:2:"";s:3:"矌";s:2:"";s:3:"矍";s:2:"";s:3:"矎";s:2:"";s:3:"矏";s:2:"";s:3:"矐";s:2:"";s:3:"矑";s:2:"";s:3:"矒";s:2:"";s:3:"矓";s:2:"";s:3:"矔";s:2:"";s:3:"矕";s:2:"";s:3:"矖";s:2:"";s:3:"矗";s:2:"";s:3:"矘";s:2:"";s:3:"矙";s:2:"";s:3:"矚";s:2:"";s:3:"矛";s:2:"ì";s:3:"矜";s:2:"";s:3:"矝";s:2:"";s:3:"矞";s:2:"";s:3:"矟";s:2:"";s:3:"矠";s:2:"";s:3:"矡";s:2:"";s:3:"矢";s:2:"ʸ";s:3:"矣";s:2:"";s:3:"矤";s:2:"";s:3:"知";s:2:"֪";s:3:"矦";s:2:"@";s:3:"矧";s:2:"";s:3:"矨";s:2:"A";s:3:"矩";s:2:"";s:3:"矪";s:2:"B";s:3:"矫";s:2:"";s:3:"矬";s:2:"";s:3:"短";s:2:"";s:3:"矮";s:2:"";s:3:"矯";s:2:"C";s:3:"矰";s:2:"D";s:3:"矱";s:2:"E";s:3:"矲";s:2:"F";s:3:"石";s:2:"ʯ";s:3:"矴";s:2:"G";s:3:"矵";s:2:"H";s:3:"矶";s:2:"";s:3:"矷";s:2:"I";s:3:"矸";s:2:"";s:3:"矹";s:2:"J";s:3:"矺";s:2:"K";s:3:"矻";s:2:"L";s:3:"矼";s:2:"M";s:3:"矽";s:2:"";s:3:"矾";s:2:"";s:3:"矿";s:2:"";s:3:"砀";s:2:"";s:3:"码";s:2:"";s:3:"砂";s:2:"ɰ";s:3:"砃";s:2:"N";s:3:"砄";s:2:"O";s:3:"砅";s:2:"P";s:3:"砆";s:2:"Q";s:3:"砇";s:2:"R";s:3:"砈";s:2:"S";s:3:"砉";s:2:"";s:3:"砊";s:2:"T";s:3:"砋";s:2:"U";s:3:"砌";s:2:"";s:3:"砍";s:2:"";s:3:"砎";s:2:"V";s:3:"砏";s:2:"W";s:3:"砐";s:2:"X";s:3:"砑";s:2:"";s:3:"砒";s:2:"";s:3:"砓";s:2:"Y";s:3:"研";s:2:"";s:3:"砕";s:2:"Z";s:3:"砖";s:2:"ש";s:3:"砗";s:2:"";s:3:"砘";s:2:"";s:3:"砙";s:2:"[";s:3:"砚";s:2:"";s:3:"砛";s:2:"\";s:3:"砜";s:2:"";s:3:"砝";s:2:"";s:3:"砞";s:2:"]";s:3:"砟";s:2:"";s:3:"砠";s:2:"^";s:3:"砡";s:2:"_";s:3:"砢";s:2:"`";s:3:"砣";s:2:"";s:3:"砤";s:2:"a";s:3:"砥";s:2:"";s:3:"砦";s:2:"";s:3:"砧";s:2:"";s:3:"砨";s:2:"b";s:3:"砩";s:2:"";s:3:"砪";s:2:"c";s:3:"砫";s:2:"d";s:3:"砬";s:2:"";s:3:"砭";s:2:"";s:3:"砮";s:2:"e";s:3:"砯";s:2:"f";s:3:"砰";s:2:"";s:3:"砱";s:2:"g";s:3:"砲";s:2:"h";s:3:"砳";s:2:"i";s:3:"破";s:2:"";s:3:"砵";s:2:"j";s:3:"砶";s:2:"k";s:3:"砷";s:2:"";s:3:"砸";s:2:"";s:3:"砹";s:2:"";s:3:"砺";s:2:"";s:3:"砻";s:2:"";s:3:"砼";s:2:"";s:3:"砽";s:2:"l";s:3:"砾";s:2:"";s:3:"砿";s:2:"m";s:3:"础";s:2:"";s:3:"硁";s:2:"n";s:3:"硂";s:2:"o";s:3:"硃";s:2:"p";s:3:"硄";s:2:"q";s:3:"硅";s:2:"";s:3:"硆";s:2:"r";s:3:"硇";s:2:"";s:3:"硈";s:2:"s";s:3:"硉";s:2:"t";s:3:"硊";s:2:"u";s:3:"硋";s:2:"v";s:3:"硌";s:2:"";s:3:"硍";s:2:"w";s:3:"硎";s:2:"";s:3:"硏";s:2:"x";s:3:"硐";s:2:"";s:3:"硑";s:2:"y";s:3:"硒";s:2:"";s:3:"硓";s:2:"z";s:3:"硔";s:2:"{";s:3:"硕";s:2:"˶";s:3:"硖";s:2:"";s:3:"硗";s:2:"";s:3:"硘";s:2:"|";s:3:"硙";s:2:"}";s:3:"硚";s:2:"~";s:3:"硛";s:2:"";s:3:"硜";s:2:"";s:3:"硝";s:2:"";s:3:"硞";s:2:"";s:3:"硟";s:2:"";s:3:"硠";s:2:"";s:3:"硡";s:2:"";s:3:"硢";s:2:"";s:3:"硣";s:2:"";s:3:"硤";s:2:"";s:3:"硥";s:2:"";s:3:"硦";s:2:"";s:3:"硧";s:2:"";s:3:"硨";s:2:"";s:3:"硩";s:2:"";s:3:"硪";s:2:"";s:3:"硫";s:2:"";s:3:"硬";s:2:"Ӳ";s:3:"硭";s:2:"";s:3:"确";s:2:"ȷ";s:3:"硯";s:2:"";s:3:"硰";s:2:"";s:3:"硱";s:2:"";s:3:"硲";s:2:"";s:3:"硳";s:2:"";s:3:"硴";s:2:"";s:3:"硵";s:2:"";s:3:"硶";s:2:"";s:3:"硷";s:2:"";s:3:"硸";s:2:"";s:3:"硹";s:2:"";s:3:"硺";s:2:"";s:3:"硻";s:2:"";s:3:"硼";s:2:"";s:3:"硽";s:2:"";s:3:"硾";s:2:"";s:3:"硿";s:2:"";s:3:"碀";s:2:"";s:3:"碁";s:2:"";s:3:"碂";s:2:"";s:3:"碃";s:2:"";s:3:"碄";s:2:"@";s:3:"碅";s:2:"A";s:3:"碆";s:2:"B";s:3:"碇";s:2:"";s:3:"碈";s:2:"C";s:3:"碉";s:2:"";s:3:"碊";s:2:"D";s:3:"碋";s:2:"E";s:3:"碌";s:2:"µ";s:3:"碍";s:2:"";s:3:"碎";s:2:"";s:3:"碏";s:2:"F";s:3:"碐";s:2:"G";s:3:"碑";s:2:"";s:3:"碒";s:2:"H";s:3:"碓";s:2:"";s:3:"碔";s:2:"I";s:3:"碕";s:2:"J";s:3:"碖";s:2:"K";s:3:"碗";s:2:"";s:3:"碘";s:2:"";s:3:"碙";s:2:"L";s:3:"碚";s:2:"";s:3:"碛";s:2:"";s:3:"碜";s:2:"";s:3:"碝";s:2:"M";s:3:"碞";s:2:"N";s:3:"碟";s:2:"";s:3:"碠";s:2:"O";s:3:"碡";s:2:"";s:3:"碢";s:2:"P";s:3:"碣";s:2:"";s:3:"碤";s:2:"Q";s:3:"碥";s:2:"";s:3:"碦";s:2:"R";s:3:"碧";s:2:"";s:3:"碨";s:2:"S";s:3:"碩";s:2:"T";s:3:"碪";s:2:"U";s:3:"碫";s:2:"V";s:3:"碬";s:2:"W";s:3:"碭";s:2:"X";s:3:"碮";s:2:"Y";s:3:"碯";s:2:"Z";s:3:"碰";s:2:"";s:3:"碱";s:2:"";s:3:"碲";s:2:"";s:3:"碳";s:2:"̼";s:3:"碴";s:2:"";s:3:"碵";s:2:"[";s:3:"碶";s:2:"\";s:3:"碷";s:2:"]";s:3:"碸";s:2:"^";s:3:"碹";s:2:"";s:3:"確";s:2:"_";s:3:"碻";s:2:"`";s:3:"碼";s:2:"a";s:3:"碽";s:2:"b";s:3:"碾";s:2:"";s:3:"碿";s:2:"c";s:3:"磀";s:2:"d";s:3:"磁";s:2:"";s:3:"磂";s:2:"e";s:3:"磃";s:2:"f";s:3:"磄";s:2:"g";s:3:"磅";s:2:"";s:3:"磆";s:2:"h";s:3:"磇";s:2:"i";s:3:"磈";s:2:"j";s:3:"磉";s:2:"";s:3:"磊";s:2:"";s:3:"磋";s:2:"";s:3:"磌";s:2:"k";s:3:"磍";s:2:"l";s:3:"磎";s:2:"m";s:3:"磏";s:2:"n";s:3:"磐";s:2:"";s:3:"磑";s:2:"o";s:3:"磒";s:2:"p";s:3:"磓";s:2:"q";s:3:"磔";s:2:"";s:3:"磕";s:2:"";s:3:"磖";s:2:"r";s:3:"磗";s:2:"s";s:3:"磘";s:2:"t";s:3:"磙";s:2:"";s:3:"磚";s:2:"u";s:3:"磛";s:2:"v";s:3:"磜";s:2:"w";s:3:"磝";s:2:"x";s:3:"磞";s:2:"y";s:3:"磟";s:2:"z";s:3:"磠";s:2:"{";s:3:"磡";s:2:"|";s:3:"磢";s:2:"}";s:3:"磣";s:2:"~";s:3:"磤";s:2:"";s:3:"磥";s:2:"";s:3:"磦";s:2:"";s:3:"磧";s:2:"";s:3:"磨";s:2:"ĥ";s:3:"磩";s:2:"";s:3:"磪";s:2:"";s:3:"磫";s:2:"";s:3:"磬";s:2:"";s:3:"磭";s:2:"";s:3:"磮";s:2:"";s:3:"磯";s:2:"";s:3:"磰";s:2:"";s:3:"磱";s:2:"";s:3:"磲";s:2:"";s:3:"磳";s:2:"";s:3:"磴";s:2:"";s:3:"磵";s:2:"";s:3:"磶";s:2:"";s:3:"磷";s:2:"";s:3:"磸";s:2:"";s:3:"磹";s:2:"";s:3:"磺";s:2:"";s:3:"磻";s:2:"";s:3:"磼";s:2:"";s:3:"磽";s:2:"";s:3:"磾";s:2:"";s:3:"磿";s:2:"";s:3:"礀";s:2:"";s:3:"礁";s:2:"";s:3:"礂";s:2:"";s:3:"礃";s:2:"";s:3:"礄";s:2:"";s:3:"礅";s:2:"";s:3:"礆";s:2:"";s:3:"礇";s:2:"";s:3:"礈";s:2:"";s:3:"礉";s:2:"";s:3:"礊";s:2:"";s:3:"礋";s:2:"";s:3:"礌";s:2:"";s:3:"礍";s:2:"@";s:3:"礎";s:2:"A";s:3:"礏";s:2:"B";s:3:"礐";s:2:"C";s:3:"礑";s:2:"D";s:3:"礒";s:2:"E";s:3:"礓";s:2:"";s:3:"礔";s:2:"F";s:3:"礕";s:2:"G";s:3:"礖";s:2:"H";s:3:"礗";s:2:"I";s:3:"礘";s:2:"J";s:3:"礙";s:2:"K";s:3:"礚";s:2:"L";s:3:"礛";s:2:"M";s:3:"礜";s:2:"N";s:3:"礝";s:2:"O";s:3:"礞";s:2:"";s:3:"礟";s:2:"P";s:3:"礠";s:2:"Q";s:3:"礡";s:2:"R";s:3:"礢";s:2:"S";s:3:"礣";s:2:"T";s:3:"礤";s:2:"";s:3:"礥";s:2:"U";s:3:"礦";s:2:"V";s:3:"礧";s:2:"W";s:3:"礨";s:2:"X";s:3:"礩";s:2:"Y";s:3:"礪";s:2:"Z";s:3:"礫";s:2:"[";s:3:"礬";s:2:"\";s:3:"礭";s:2:"]";s:3:"礮";s:2:"^";s:3:"礯";s:2:"_";s:3:"礰";s:2:"`";s:3:"礱";s:2:"a";s:3:"礲";s:2:"b";s:3:"礳";s:2:"c";s:3:"礴";s:2:"";s:3:"礵";s:2:"d";s:3:"礶";s:2:"e";s:3:"礷";s:2:"f";s:3:"礸";s:2:"g";s:3:"礹";s:2:"h";s:3:"示";s:2:"ʾ";s:3:"礻";s:2:"";s:3:"礼";s:2:"";s:3:"礽";s:2:"i";s:3:"社";s:2:"";s:3:"礿";s:2:"j";s:3:"祀";s:2:"";s:3:"祁";s:2:"";s:3:"祂";s:2:"k";s:3:"祃";s:2:"l";s:3:"祄";s:2:"m";s:3:"祅";s:2:"n";s:3:"祆";s:2:"";s:3:"祇";s:2:"o";s:3:"祈";s:2:"";s:3:"祉";s:2:"";s:3:"祊";s:2:"p";s:3:"祋";s:2:"q";s:3:"祌";s:2:"r";s:3:"祍";s:2:"s";s:3:"祎";s:2:"t";s:3:"祏";s:2:"u";s:3:"祐";s:2:"v";s:3:"祑";s:2:"w";s:3:"祒";s:2:"x";s:3:"祓";s:2:"";s:3:"祔";s:2:"y";s:3:"祕";s:2:"z";s:3:"祖";s:2:"";s:3:"祗";s:2:"";s:3:"祘";s:2:"{";s:3:"祙";s:2:"|";s:3:"祚";s:2:"";s:3:"祛";s:2:"";s:3:"祜";s:2:"";s:3:"祝";s:2:"ף";s:3:"神";s:2:"";s:3:"祟";s:2:"";s:3:"祠";s:2:"";s:3:"祡";s:2:"}";s:3:"祢";s:2:"";s:3:"祣";s:2:"~";s:3:"祤";s:2:"";s:3:"祥";s:2:"";s:3:"祦";s:2:"";s:3:"祧";s:2:"";s:3:"票";s:2:"Ʊ";s:3:"祩";s:2:"";s:3:"祪";s:2:"";s:3:"祫";s:2:"";s:3:"祬";s:2:"";s:3:"祭";s:2:"";s:3:"祮";s:2:"";s:3:"祯";s:2:"";s:3:"祰";s:2:"";s:3:"祱";s:2:"";s:3:"祲";s:2:"";s:3:"祳";s:2:"";s:3:"祴";s:2:"";s:3:"祵";s:2:"";s:3:"祶";s:2:"";s:3:"祷";s:2:"";s:3:"祸";s:2:"";s:3:"祹";s:2:"";s:3:"祺";s:2:"";s:3:"祻";s:2:"";s:3:"祼";s:2:"";s:3:"祽";s:2:"";s:3:"祾";s:2:"";s:3:"祿";s:2:"";s:3:"禀";s:2:"";s:3:"禁";s:2:"";s:3:"禂";s:2:"";s:3:"禃";s:2:"";s:3:"禄";s:2:"»";s:3:"禅";s:2:"";s:3:"禆";s:2:"";s:3:"禇";s:2:"";s:3:"禈";s:2:"";s:3:"禉";s:2:"";s:3:"禊";s:2:"";s:3:"禋";s:2:"";s:3:"禌";s:2:"";s:3:"禍";s:2:"";s:3:"禎";s:2:"";s:3:"福";s:2:"";s:3:"禐";s:2:"";s:3:"禑";s:2:"";s:3:"禒";s:2:"";s:3:"禓";s:2:"@";s:3:"禔";s:2:"A";s:3:"禕";s:2:"B";s:3:"禖";s:2:"C";s:3:"禗";s:2:"D";s:3:"禘";s:2:"E";s:3:"禙";s:2:"F";s:3:"禚";s:2:"";s:3:"禛";s:2:"G";s:3:"禜";s:2:"H";s:3:"禝";s:2:"I";s:3:"禞";s:2:"J";s:3:"禟";s:2:"K";s:3:"禠";s:2:"L";s:3:"禡";s:2:"M";s:3:"禢";s:2:"N";s:3:"禣";s:2:"O";s:3:"禤";s:2:"P";s:3:"禥";s:2:"Q";s:3:"禦";s:2:"R";s:3:"禧";s:2:"";s:3:"禨";s:2:"S";s:3:"禩";s:2:"T";s:3:"禪";s:2:"U";s:3:"禫";s:2:"V";s:3:"禬";s:2:"W";s:3:"禭";s:2:"X";s:3:"禮";s:2:"Y";s:3:"禯";s:2:"Z";s:3:"禰";s:2:"[";s:3:"禱";s:2:"\";s:3:"禲";s:2:"]";s:3:"禳";s:2:"";s:3:"禴";s:2:"^";s:3:"禵";s:2:"_";s:3:"禶";s:2:"`";s:3:"禷";s:2:"a";s:3:"禸";s:2:"b";s:3:"禹";s:2:"";s:3:"禺";s:2:"خ";s:3:"离";s:2:"";s:3:"禼";s:2:"c";s:3:"禽";s:2:"";s:3:"禾";s:2:"";s:3:"禿";s:2:"d";s:3:"秀";s:2:"";s:3:"私";s:2:"˽";s:3:"秂";s:2:"e";s:3:"秃";s:2:"ͺ";s:3:"秄";s:2:"f";s:3:"秅";s:2:"g";s:3:"秆";s:2:"";s:3:"秇";s:2:"h";s:3:"秈";s:2:"i";s:3:"秉";s:2:"";s:3:"秊";s:2:"j";s:3:"秋";s:2:"";s:3:"秌";s:2:"k";s:3:"种";s:2:"";s:3:"秎";s:2:"l";s:3:"秏";s:2:"m";s:3:"秐";s:2:"n";s:3:"科";s:2:"";s:3:"秒";s:2:"";s:3:"秓";s:2:"o";s:3:"秔";s:2:"p";s:3:"秕";s:2:"";s:3:"秖";s:2:"q";s:3:"秗";s:2:"r";s:3:"秘";s:2:"";s:3:"秙";s:2:"s";s:3:"秚";s:2:"t";s:3:"秛";s:2:"u";s:3:"秜";s:2:"v";s:3:"秝";s:2:"w";s:3:"秞";s:2:"x";s:3:"租";s:2:"";s:3:"秠";s:2:"y";s:3:"秡";s:2:"z";s:3:"秢";s:2:"{";s:3:"秣";s:2:"";s:3:"秤";s:2:"";s:3:"秥";s:2:"|";s:3:"秦";s:2:"";s:3:"秧";s:2:"";s:3:"秨";s:2:"}";s:3:"秩";s:2:"";s:3:"秪";s:2:"~";s:3:"秫";s:2:"";s:3:"秬";s:2:"";s:3:"秭";s:2:"";s:3:"秮";s:2:"";s:3:"积";s:2:"";s:3:"称";s:2:"";s:3:"秱";s:2:"";s:3:"秲";s:2:"";s:3:"秳";s:2:"";s:3:"秴";s:2:"";s:3:"秵";s:2:"";s:3:"秶";s:2:"";s:3:"秷";s:2:"";s:3:"秸";s:2:"";s:3:"秹";s:2:"";s:3:"秺";s:2:"";s:3:"移";s:2:"";s:3:"秼";s:2:"";s:3:"秽";s:2:"";s:3:"秾";s:2:"";s:3:"秿";s:2:"";s:3:"稀";s:2:"ϡ";s:3:"稁";s:2:"";s:3:"稂";s:2:"";s:3:"稃";s:2:"";s:3:"稄";s:2:"";s:3:"稅";s:2:"";s:3:"稆";s:2:"";s:3:"稇";s:2:"";s:3:"稈";s:2:"";s:3:"稉";s:2:"";s:3:"稊";s:2:"";s:3:"程";s:2:"";s:3:"稌";s:2:"";s:3:"稍";s:2:"";s:3:"税";s:2:"˰";s:3:"稏";s:2:"";s:3:"稐";s:2:"";s:3:"稑";s:2:"";s:3:"稒";s:2:"";s:3:"稓";s:2:"";s:3:"稔";s:2:"";s:3:"稕";s:2:"";s:3:"稖";s:2:"";s:3:"稗";s:2:"";s:3:"稘";s:2:"";s:3:"稙";s:2:"";s:3:"稚";s:2:"";s:3:"稛";s:2:"";s:3:"稜";s:2:"";s:3:"稝";s:2:"@";s:3:"稞";s:2:"";s:3:"稟";s:2:"A";s:3:"稠";s:2:"";s:3:"稡";s:2:"B";s:3:"稢";s:2:"C";s:3:"稣";s:2:"";s:3:"稤";s:2:"D";s:3:"稥";s:2:"E";s:3:"稦";s:2:"F";s:3:"稧";s:2:"G";s:3:"稨";s:2:"H";s:3:"稩";s:2:"I";s:3:"稪";s:2:"J";s:3:"稫";s:2:"K";s:3:"稬";s:2:"L";s:3:"稭";s:2:"M";s:3:"種";s:2:"N";s:3:"稯";s:2:"O";s:3:"稰";s:2:"P";s:3:"稱";s:2:"Q";s:3:"稲";s:2:"R";s:3:"稳";s:2:"";s:3:"稴";s:2:"S";s:3:"稵";s:2:"T";s:3:"稶";s:2:"U";s:3:"稷";s:2:"";s:3:"稸";s:2:"V";s:3:"稹";s:2:"";s:3:"稺";s:2:"W";s:3:"稻";s:2:"";s:3:"稼";s:2:"";s:3:"稽";s:2:"";s:3:"稾";s:2:"X";s:3:"稿";s:2:"";s:3:"穀";s:2:"Y";s:3:"穁";s:2:"Z";s:3:"穂";s:2:"[";s:3:"穃";s:2:"\";s:3:"穄";s:2:"]";s:3:"穅";s:2:"^";s:3:"穆";s:2:"";s:3:"穇";s:2:"_";s:3:"穈";s:2:"`";s:3:"穉";s:2:"a";s:3:"穊";s:2:"b";s:3:"穋";s:2:"c";s:3:"穌";s:2:"d";s:3:"積";s:2:"e";s:3:"穎";s:2:"f";s:3:"穏";s:2:"g";s:3:"穐";s:2:"h";s:3:"穑";s:2:"";s:3:"穒";s:2:"i";s:3:"穓";s:2:"j";s:3:"穔";s:2:"k";s:3:"穕";s:2:"l";s:3:"穖";s:2:"m";s:3:"穗";s:2:"";s:3:"穘";s:2:"n";s:3:"穙";s:2:"o";s:3:"穚";s:2:"p";s:3:"穛";s:2:"q";s:3:"穜";s:2:"r";s:3:"穝";s:2:"s";s:3:"穞";s:2:"t";s:3:"穟";s:2:"u";s:3:"穠";s:2:"v";s:3:"穡";s:2:"w";s:3:"穢";s:2:"x";s:3:"穣";s:2:"y";s:3:"穤";s:2:"z";s:3:"穥";s:2:"{";s:3:"穦";s:2:"|";s:3:"穧";s:2:"}";s:3:"穨";s:2:"~";s:3:"穩";s:2:"";s:3:"穪";s:2:"";s:3:"穫";s:2:"";s:3:"穬";s:2:"";s:3:"穭";s:2:"";s:3:"穮";s:2:"";s:3:"穯";s:2:"";s:3:"穰";s:2:"";s:3:"穱";s:2:"";s:3:"穲";s:2:"";s:3:"穳";s:2:"";s:3:"穴";s:2:"Ѩ";s:3:"穵";s:2:"";s:3:"究";s:2:"";s:3:"穷";s:2:"";s:3:"穸";s:2:"";s:3:"穹";s:2:"";s:3:"空";s:2:"";s:3:"穻";s:2:"";s:3:"穼";s:2:"";s:3:"穽";s:2:"";s:3:"穾";s:2:"";s:3:"穿";s:2:"";s:3:"窀";s:2:"";s:3:"突";s:2:"ͻ";s:3:"窂";s:2:"";s:3:"窃";s:2:"";s:3:"窄";s:2:"խ";s:3:"窅";s:2:"";s:3:"窆";s:2:"";s:3:"窇";s:2:"";s:3:"窈";s:2:"";s:3:"窉";s:2:"";s:3:"窊";s:2:"";s:3:"窋";s:2:"";s:3:"窌";s:2:"";s:3:"窍";s:2:"";s:3:"窎";s:2:"";s:3:"窏";s:2:"";s:3:"窐";s:2:"";s:3:"窑";s:2:"Ҥ";s:3:"窒";s:2:"";s:3:"窓";s:2:"";s:3:"窔";s:2:"";s:3:"窕";s:2:"";s:3:"窖";s:2:"";s:3:"窗";s:2:"";s:3:"窘";s:2:"";s:3:"窙";s:2:"";s:3:"窚";s:2:"";s:3:"窛";s:2:"";s:3:"窜";s:2:"";s:3:"窝";s:2:"";s:3:"窞";s:2:"";s:3:"窟";s:2:"";s:3:"窠";s:2:"";s:3:"窡";s:2:"";s:3:"窢";s:2:"";s:3:"窣";s:2:"@";s:3:"窤";s:2:"A";s:3:"窥";s:2:"";s:3:"窦";s:2:"";s:3:"窧";s:2:"B";s:3:"窨";s:2:"";s:3:"窩";s:2:"C";s:3:"窪";s:2:"D";s:3:"窫";s:2:"E";s:3:"窬";s:2:"";s:3:"窭";s:2:"";s:3:"窮";s:2:"F";s:3:"窯";s:2:"G";s:3:"窰";s:2:"H";s:3:"窱";s:2:"I";s:3:"窲";s:2:"J";s:3:"窳";s:2:"";s:3:"窴";s:2:"K";s:3:"窵";s:2:"L";s:3:"窶";s:2:"M";s:3:"窷";s:2:"N";s:3:"窸";s:2:"O";s:3:"窹";s:2:"P";s:3:"窺";s:2:"Q";s:3:"窻";s:2:"R";s:3:"窼";s:2:"S";s:3:"窽";s:2:"T";s:3:"窾";s:2:"U";s:3:"窿";s:2:"";s:3:"竀";s:2:"V";s:3:"竁";s:2:"W";s:3:"竂";s:2:"X";s:3:"竃";s:2:"Y";s:3:"竄";s:2:"Z";s:3:"竅";s:2:"[";s:3:"竆";s:2:"\";s:3:"竇";s:2:"]";s:3:"竈";s:2:"^";s:3:"竉";s:2:"_";s:3:"竊";s:2:"`";s:3:"立";s:2:"";s:3:"竌";s:2:"a";s:3:"竍";s:2:"b";s:3:"竎";s:2:"c";s:3:"竏";s:2:"d";s:3:"竐";s:2:"e";s:3:"竑";s:2:"f";s:3:"竒";s:2:"g";s:3:"竓";s:2:"h";s:3:"竔";s:2:"i";s:3:"竕";s:2:"j";s:3:"竖";s:2:"";s:3:"竗";s:2:"k";s:3:"竘";s:2:"l";s:3:"站";s:2:"վ";s:3:"竚";s:2:"m";s:3:"竛";s:2:"n";s:3:"竜";s:2:"o";s:3:"竝";s:2:"p";s:3:"竞";s:2:"";s:3:"竟";s:2:"";s:3:"章";s:2:"";s:3:"竡";s:2:"q";s:3:"竢";s:2:"r";s:3:"竣";s:2:"";s:3:"竤";s:2:"s";s:3:"童";s:2:"ͯ";s:3:"竦";s:2:"";s:3:"竧";s:2:"t";s:3:"竨";s:2:"u";s:3:"竩";s:2:"v";s:3:"竪";s:2:"w";s:3:"竫";s:2:"x";s:3:"竬";s:2:"y";s:3:"竭";s:2:"";s:3:"竮";s:2:"z";s:3:"端";s:2:"";s:3:"竰";s:2:"{";s:3:"竱";s:2:"|";s:3:"竲";s:2:"}";s:3:"竳";s:2:"~";s:3:"竴";s:2:"";s:3:"竵";s:2:"";s:3:"競";s:2:"";s:3:"竷";s:2:"";s:3:"竸";s:2:"";s:3:"竹";s:2:"";s:3:"竺";s:2:"";s:3:"竻";s:2:"";s:3:"竼";s:2:"";s:3:"竽";s:2:"";s:3:"竾";s:2:"";s:3:"竿";s:2:"";s:3:"笀";s:2:"";s:3:"笁";s:2:"";s:3:"笂";s:2:"";s:3:"笃";s:2:"";s:3:"笄";s:2:"";s:3:"笅";s:2:"";s:3:"笆";s:2:"";s:3:"笇";s:2:"";s:3:"笈";s:2:"";s:3:"笉";s:2:"";s:3:"笊";s:2:"";s:3:"笋";s:2:"";s:3:"笌";s:2:"";s:3:"笍";s:2:"";s:3:"笎";s:2:"";s:3:"笏";s:2:"";s:3:"笐";s:2:"";s:3:"笑";s:2:"Ц";s:3:"笒";s:2:"";s:3:"笓";s:2:"";s:3:"笔";s:2:"";s:3:"笕";s:2:"";s:3:"笖";s:2:"";s:3:"笗";s:2:"";s:3:"笘";s:2:"";s:3:"笙";s:2:"";s:3:"笚";s:2:"";s:3:"笛";s:2:"";s:3:"笜";s:2:"";s:3:"笝";s:2:"";s:3:"笞";s:2:"";s:3:"笟";s:2:"";s:3:"笠";s:2:"";s:3:"笡";s:2:"";s:3:"笢";s:2:"";s:3:"笣";s:2:"";s:3:"笤";s:2:"";s:3:"笥";s:2:"";s:3:"符";s:2:"";s:3:"笧";s:2:"";s:3:"笨";s:2:"";s:3:"笩";s:2:"";s:3:"笪";s:2:"";s:3:"笫";s:2:"";s:3:"第";s:2:"";s:3:"笭";s:2:"";s:3:"笮";s:2:"";s:3:"笯";s:2:"@";s:3:"笰";s:2:"A";s:3:"笱";s:2:"";s:3:"笲";s:2:"B";s:3:"笳";s:2:"";s:3:"笴";s:2:"C";s:3:"笵";s:2:"D";s:3:"笶";s:2:"E";s:3:"笷";s:2:"F";s:3:"笸";s:2:"";s:3:"笹";s:2:"G";s:3:"笺";s:2:"";s:3:"笻";s:2:"H";s:3:"笼";s:2:"";s:3:"笽";s:2:"I";s:3:"笾";s:2:"";s:3:"笿";s:2:"J";s:3:"筀";s:2:"K";s:3:"筁";s:2:"L";s:3:"筂";s:2:"M";s:3:"筃";s:2:"N";s:3:"筄";s:2:"O";s:3:"筅";s:2:"";s:3:"筆";s:2:"P";s:3:"筇";s:2:"";s:3:"筈";s:2:"Q";s:3:"等";s:2:"";s:3:"筊";s:2:"R";s:3:"筋";s:2:"";s:3:"筌";s:2:"";s:3:"筍";s:2:"S";s:3:"筎";s:2:"T";s:3:"筏";s:2:"";s:3:"筐";s:2:"";s:3:"筑";s:2:"";s:3:"筒";s:2:"Ͳ";s:3:"筓";s:2:"U";s:3:"答";s:2:"";s:3:"筕";s:2:"V";s:3:"策";s:2:"";s:3:"筗";s:2:"W";s:3:"筘";s:2:"";s:3:"筙";s:2:"X";s:3:"筚";s:2:"";s:3:"筛";s:2:"ɸ";s:3:"筜";s:2:"Y";s:3:"筝";s:2:"";s:3:"筞";s:2:"Z";s:3:"筟";s:2:"[";s:3:"筠";s:2:"";s:3:"筡";s:2:"\";s:3:"筢";s:2:"";s:3:"筣";s:2:"]";s:3:"筤";s:2:"^";s:3:"筥";s:2:"_";s:3:"筦";s:2:"`";s:3:"筧";s:2:"a";s:3:"筨";s:2:"b";s:3:"筩";s:2:"c";s:3:"筪";s:2:"d";s:3:"筫";s:2:"e";s:3:"筬";s:2:"f";s:3:"筭";s:2:"g";s:3:"筮";s:2:"";s:3:"筯";s:2:"h";s:3:"筰";s:2:"i";s:3:"筱";s:2:"";s:3:"筲";s:2:"";s:3:"筳";s:2:"j";s:3:"筴";s:2:"k";s:3:"筵";s:2:"";s:3:"筶";s:2:"l";s:3:"筷";s:2:"";s:3:"筸";s:2:"m";s:3:"筹";s:2:"";s:3:"筺";s:2:"n";s:3:"筻";s:2:"";s:3:"筼";s:2:"o";s:3:"筽";s:2:"p";s:3:"签";s:2:"ǩ";s:3:"筿";s:2:"q";s:3:"简";s:2:"";s:3:"箁";s:2:"r";s:3:"箂";s:2:"s";s:3:"箃";s:2:"t";s:3:"箄";s:2:"u";s:3:"箅";s:2:"";s:3:"箆";s:2:"v";s:3:"箇";s:2:"w";s:3:"箈";s:2:"x";s:3:"箉";s:2:"y";s:3:"箊";s:2:"z";s:3:"箋";s:2:"{";s:3:"箌";s:2:"|";s:3:"箍";s:2:"";s:3:"箎";s:2:"}";s:3:"箏";s:2:"~";s:3:"箐";s:2:"";s:3:"箑";s:2:"";s:3:"箒";s:2:"";s:3:"箓";s:2:"";s:3:"箔";s:2:"";s:3:"箕";s:2:"";s:3:"箖";s:2:"";s:3:"算";s:2:"";s:3:"箘";s:2:"";s:3:"箙";s:2:"";s:3:"箚";s:2:"";s:3:"箛";s:2:"";s:3:"箜";s:2:"";s:3:"箝";s:2:"";s:3:"箞";s:2:"";s:3:"箟";s:2:"";s:3:"箠";s:2:"";s:3:"管";s:2:"";s:3:"箢";s:2:"";s:3:"箣";s:2:"";s:3:"箤";s:2:"";s:3:"箥";s:2:"";s:3:"箦";s:2:"";s:3:"箧";s:2:"";s:3:"箨";s:2:"";s:3:"箩";s:2:"";s:3:"箪";s:2:"";s:3:"箫";s:2:"";s:3:"箬";s:2:"";s:3:"箭";s:2:"";s:3:"箮";s:2:"";s:3:"箯";s:2:"";s:3:"箰";s:2:"";s:3:"箱";s:2:"";s:3:"箲";s:2:"";s:3:"箳";s:2:"";s:3:"箴";s:2:"";s:3:"箵";s:2:"";s:3:"箶";s:2:"";s:3:"箷";s:2:"";s:3:"箸";s:2:"";s:3:"箹";s:2:"";s:3:"箺";s:2:"";s:3:"箻";s:2:"";s:3:"箼";s:2:"";s:3:"箽";s:2:"";s:3:"箾";s:2:"";s:3:"箿";s:2:"";s:3:"節";s:2:"";s:3:"篁";s:2:"";s:3:"篂";s:2:"";s:3:"篃";s:2:"";s:3:"範";s:2:"";s:3:"篅";s:2:"@";s:3:"篆";s:2:"׭";s:3:"篇";s:2:"ƪ";s:3:"篈";s:2:"A";s:3:"築";s:2:"B";s:3:"篊";s:2:"C";s:3:"篋";s:2:"D";s:3:"篌";s:2:"";s:3:"篍";s:2:"E";s:3:"篎";s:2:"F";s:3:"篏";s:2:"G";s:3:"篐";s:2:"H";s:3:"篑";s:2:"";s:3:"篒";s:2:"I";s:3:"篓";s:2:"¨";s:3:"篔";s:2:"J";s:3:"篕";s:2:"K";s:3:"篖";s:2:"L";s:3:"篗";s:2:"M";s:3:"篘";s:2:"N";s:3:"篙";s:2:"";s:3:"篚";s:2:"";s:3:"篛";s:2:"O";s:3:"篜";s:2:"P";s:3:"篝";s:2:"";s:3:"篞";s:2:"Q";s:3:"篟";s:2:"R";s:3:"篠";s:2:"S";s:3:"篡";s:2:"";s:3:"篢";s:2:"T";s:3:"篣";s:2:"U";s:3:"篤";s:2:"V";s:3:"篥";s:2:"";s:3:"篦";s:2:"";s:3:"篧";s:2:"W";s:3:"篨";s:2:"X";s:3:"篩";s:2:"Y";s:3:"篪";s:2:"";s:3:"篫";s:2:"Z";s:3:"篬";s:2:"[";s:3:"篭";s:2:"\";s:3:"篮";s:2:"";s:3:"篯";s:2:"]";s:3:"篰";s:2:"^";s:3:"篱";s:2:"";s:3:"篲";s:2:"_";s:3:"篳";s:2:"`";s:3:"篴";s:2:"a";s:3:"篵";s:2:"b";s:3:"篶";s:2:"c";s:3:"篷";s:2:"";s:3:"篸";s:2:"d";s:3:"篹";s:2:"e";s:3:"篺";s:2:"f";s:3:"篻";s:2:"g";s:3:"篼";s:2:"";s:3:"篽";s:2:"h";s:3:"篾";s:2:"";s:3:"篿";s:2:"i";s:3:"簀";s:2:"j";s:3:"簁";s:2:"k";s:3:"簂";s:2:"l";s:3:"簃";s:2:"m";s:3:"簄";s:2:"n";s:3:"簅";s:2:"o";s:3:"簆";s:2:"p";s:3:"簇";s:2:"";s:3:"簈";s:2:"q";s:3:"簉";s:2:"r";s:3:"簊";s:2:"s";s:3:"簋";s:2:"";s:3:"簌";s:2:"";s:3:"簍";s:2:"t";s:3:"簎";s:2:"u";s:3:"簏";s:2:"";s:3:"簐";s:2:"v";s:3:"簑";s:2:"w";s:3:"簒";s:2:"x";s:3:"簓";s:2:"y";s:3:"簔";s:2:"z";s:3:"簕";s:2:"{";s:3:"簖";s:2:"";s:3:"簗";s:2:"|";s:3:"簘";s:2:"}";s:3:"簙";s:2:"~";s:3:"簚";s:2:"";s:3:"簛";s:2:"";s:3:"簜";s:2:"";s:3:"簝";s:2:"";s:3:"簞";s:2:"";s:3:"簟";s:2:"";s:3:"簠";s:2:"";s:3:"簡";s:2:"";s:3:"簢";s:2:"";s:3:"簣";s:2:"";s:3:"簤";s:2:"";s:3:"簥";s:2:"";s:3:"簦";s:2:"";s:3:"簧";s:2:"";s:3:"簨";s:2:"";s:3:"簩";s:2:"";s:3:"簪";s:2:"";s:3:"簫";s:2:"";s:3:"簬";s:2:"";s:3:"簭";s:2:"";s:3:"簮";s:2:"";s:3:"簯";s:2:"";s:3:"簰";s:2:"";s:3:"簱";s:2:"";s:3:"簲";s:2:"";s:3:"簳";s:2:"";s:3:"簴";s:2:"";s:3:"簵";s:2:"";s:3:"簶";s:2:"";s:3:"簷";s:2:"";s:3:"簸";s:2:"";s:3:"簹";s:2:"";s:3:"簺";s:2:"";s:3:"簻";s:2:"";s:3:"簼";s:2:"";s:3:"簽";s:2:"";s:3:"簾";s:2:"";s:3:"簿";s:2:"";s:3:"籀";s:2:"";s:3:"籁";s:2:"";s:3:"籂";s:2:"";s:3:"籃";s:2:"@";s:3:"籄";s:2:"A";s:3:"籅";s:2:"B";s:3:"籆";s:2:"C";s:3:"籇";s:2:"D";s:3:"籈";s:2:"E";s:3:"籉";s:2:"F";s:3:"籊";s:2:"G";s:3:"籋";s:2:"H";s:3:"籌";s:2:"I";s:3:"籍";s:2:"";s:3:"籎";s:2:"J";s:3:"籏";s:2:"K";s:3:"籐";s:2:"L";s:3:"籑";s:2:"M";s:3:"籒";s:2:"N";s:3:"籓";s:2:"O";s:3:"籔";s:2:"P";s:3:"籕";s:2:"Q";s:3:"籖";s:2:"R";s:3:"籗";s:2:"S";s:3:"籘";s:2:"T";s:3:"籙";s:2:"U";s:3:"籚";s:2:"V";s:3:"籛";s:2:"W";s:3:"籜";s:2:"X";s:3:"籝";s:2:"Y";s:3:"籞";s:2:"Z";s:3:"籟";s:2:"[";s:3:"籠";s:2:"\";s:3:"籡";s:2:"]";s:3:"籢";s:2:"^";s:3:"籣";s:2:"_";s:3:"籤";s:2:"`";s:3:"籥";s:2:"a";s:3:"籦";s:2:"b";s:3:"籧";s:2:"c";s:3:"籨";s:2:"d";s:3:"籩";s:2:"e";s:3:"籪";s:2:"f";s:3:"籫";s:2:"g";s:3:"籬";s:2:"h";s:3:"籭";s:2:"i";s:3:"籮";s:2:"j";s:3:"籯";s:2:"k";s:3:"籰";s:2:"l";s:3:"籱";s:2:"m";s:3:"籲";s:2:"n";s:3:"米";s:2:"";s:3:"籴";s:2:"";s:3:"籵";s:2:"o";s:3:"籶";s:2:"p";s:3:"籷";s:2:"q";s:3:"籸";s:2:"r";s:3:"籹";s:2:"s";s:3:"籺";s:2:"t";s:3:"类";s:2:"";s:3:"籼";s:2:"";s:3:"籽";s:2:"";s:3:"籾";s:2:"u";s:3:"籿";s:2:"v";s:3:"粀";s:2:"w";s:3:"粁";s:2:"x";s:3:"粂";s:2:"y";s:3:"粃";s:2:"z";s:3:"粄";s:2:"{";s:3:"粅";s:2:"|";s:3:"粆";s:2:"}";s:3:"粇";s:2:"~";s:3:"粈";s:2:"";s:3:"粉";s:2:"";s:3:"粊";s:2:"";s:3:"粋";s:2:"";s:3:"粌";s:2:"";s:3:"粍";s:2:"";s:3:"粎";s:2:"";s:3:"粏";s:2:"";s:3:"粐";s:2:"";s:3:"粑";s:2:"";s:3:"粒";s:2:"";s:3:"粓";s:2:"";s:3:"粔";s:2:"";s:3:"粕";s:2:"";s:3:"粖";s:2:"";s:3:"粗";s:2:"";s:3:"粘";s:2:"ճ";s:3:"粙";s:2:"";s:3:"粚";s:2:"";s:3:"粛";s:2:"";s:3:"粜";s:2:"";s:3:"粝";s:2:"";s:3:"粞";s:2:"";s:3:"粟";s:2:"";s:3:"粠";s:2:"";s:3:"粡";s:2:"";s:3:"粢";s:2:"";s:3:"粣";s:2:"";s:3:"粤";s:2:"";s:3:"粥";s:2:"";s:3:"粦";s:2:"";s:3:"粧";s:2:"";s:3:"粨";s:2:"";s:3:"粩";s:2:"";s:3:"粪";s:2:"";s:3:"粫";s:2:"";s:3:"粬";s:2:"";s:3:"粭";s:2:"";s:3:"粮";s:2:"";s:3:"粯";s:2:"";s:3:"粰";s:2:"";s:3:"粱";s:2:"";s:3:"粲";s:2:"";s:3:"粳";s:2:"";s:3:"粴";s:2:"";s:3:"粵";s:2:"";s:3:"粶";s:2:"";s:3:"粷";s:2:"";s:3:"粸";s:2:"";s:3:"粹";s:2:"";s:3:"粺";s:2:"";s:3:"粻";s:2:"";s:3:"粼";s:2:"";s:3:"粽";s:2:"";s:3:"精";s:2:"";s:3:"粿";s:2:"@";s:3:"糀";s:2:"A";s:3:"糁";s:2:"";s:3:"糂";s:2:"B";s:3:"糃";s:2:"C";s:3:"糄";s:2:"D";s:3:"糅";s:2:"";s:3:"糆";s:2:"E";s:3:"糇";s:2:"";s:3:"糈";s:2:"";s:3:"糉";s:2:"F";s:3:"糊";s:2:"";s:3:"糋";s:2:"G";s:3:"糌";s:2:"";s:3:"糍";s:2:"";s:3:"糎";s:2:"H";s:3:"糏";s:2:"I";s:3:"糐";s:2:"J";s:3:"糑";s:2:"K";s:3:"糒";s:2:"L";s:3:"糓";s:2:"M";s:3:"糔";s:2:"N";s:3:"糕";s:2:"";s:3:"糖";s:2:"";s:3:"糗";s:2:"";s:3:"糘";s:2:"O";s:3:"糙";s:2:"";s:3:"糚";s:2:"P";s:3:"糛";s:2:"Q";s:3:"糜";s:2:"";s:3:"糝";s:2:"R";s:3:"糞";s:2:"S";s:3:"糟";s:2:"";s:3:"糠";s:2:"";s:3:"糡";s:2:"T";s:3:"糢";s:2:"U";s:3:"糣";s:2:"V";s:3:"糤";s:2:"W";s:3:"糥";s:2:"X";s:3:"糦";s:2:"Y";s:3:"糧";s:2:"Z";s:3:"糨";s:2:"";s:3:"糩";s:2:"[";s:3:"糪";s:2:"\";s:3:"糫";s:2:"]";s:3:"糬";s:2:"^";s:3:"糭";s:2:"_";s:3:"糮";s:2:"`";s:3:"糯";s:2:"Ŵ";s:3:"糰";s:2:"a";s:3:"糱";s:2:"b";s:3:"糲";s:2:"c";s:3:"糳";s:2:"d";s:3:"糴";s:2:"e";s:3:"糵";s:2:"f";s:3:"糶";s:2:"g";s:3:"糷";s:2:"h";s:3:"糸";s:2:"";s:3:"糹";s:2:"i";s:3:"糺";s:2:"j";s:3:"系";s:2:"ϵ";s:3:"糼";s:2:"k";s:3:"糽";s:2:"l";s:3:"糾";s:2:"m";s:3:"糿";s:2:"n";s:3:"紀";s:2:"o";s:3:"紁";s:2:"p";s:3:"紂";s:2:"q";s:3:"紃";s:2:"r";s:3:"約";s:2:"s";s:3:"紅";s:2:"t";s:3:"紆";s:2:"u";s:3:"紇";s:2:"v";s:3:"紈";s:2:"w";s:3:"紉";s:2:"x";s:3:"紊";s:2:"";s:3:"紋";s:2:"y";s:3:"紌";s:2:"z";s:3:"納";s:2:"{";s:3:"紎";s:2:"|";s:3:"紏";s:2:"}";s:3:"紐";s:2:"~";s:3:"紑";s:2:"";s:3:"紒";s:2:"";s:3:"紓";s:2:"";s:3:"純";s:2:"";s:3:"紕";s:2:"";s:3:"紖";s:2:"";s:3:"紗";s:2:"";s:3:"紘";s:2:"";s:3:"紙";s:2:"";s:3:"級";s:2:"";s:3:"紛";s:2:"";s:3:"紜";s:2:"";s:3:"紝";s:2:"";s:3:"紞";s:2:"";s:3:"紟";s:2:"";s:3:"素";s:2:"";s:3:"紡";s:2:"";s:3:"索";s:2:"";s:3:"紣";s:2:"";s:3:"紤";s:2:"";s:3:"紥";s:2:"";s:3:"紦";s:2:"";s:3:"紧";s:2:"";s:3:"紨";s:2:"";s:3:"紩";s:2:"";s:3:"紪";s:2:"";s:3:"紫";s:2:"";s:3:"紬";s:2:"";s:3:"紭";s:2:"";s:3:"紮";s:2:"";s:3:"累";s:2:"";s:3:"細";s:2:"";s:3:"紱";s:2:"";s:3:"紲";s:2:"";s:3:"紳";s:2:"";s:3:"紴";s:2:"";s:3:"紵";s:2:"";s:3:"紶";s:2:"";s:3:"紷";s:2:"@";s:3:"紸";s:2:"A";s:3:"紹";s:2:"B";s:3:"紺";s:2:"C";s:3:"紻";s:2:"D";s:3:"紼";s:2:"E";s:3:"紽";s:2:"F";s:3:"紾";s:2:"G";s:3:"紿";s:2:"H";s:3:"絀";s:2:"I";s:3:"絁";s:2:"J";s:3:"終";s:2:"K";s:3:"絃";s:2:"L";s:3:"組";s:2:"M";s:3:"絅";s:2:"N";s:3:"絆";s:2:"O";s:3:"絇";s:2:"P";s:3:"絈";s:2:"Q";s:3:"絉";s:2:"R";s:3:"絊";s:2:"S";s:3:"絋";s:2:"T";s:3:"経";s:2:"U";s:3:"絍";s:2:"V";s:3:"絎";s:2:"W";s:3:"絏";s:2:"X";s:3:"結";s:2:"Y";s:3:"絑";s:2:"Z";s:3:"絒";s:2:"[";s:3:"絓";s:2:"\";s:3:"絔";s:2:"]";s:3:"絕";s:2:"^";s:3:"絖";s:2:"_";s:3:"絗";s:2:"`";s:3:"絘";s:2:"a";s:3:"絙";s:2:"b";s:3:"絚";s:2:"c";s:3:"絛";s:2:"d";s:3:"絜";s:2:"e";s:3:"絝";s:2:"f";s:3:"絞";s:2:"g";s:3:"絟";s:2:"h";s:3:"絠";s:2:"i";s:3:"絡";s:2:"j";s:3:"絢";s:2:"k";s:3:"絣";s:2:"l";s:3:"絤";s:2:"m";s:3:"絥";s:2:"n";s:3:"給";s:2:"o";s:3:"絧";s:2:"p";s:3:"絨";s:2:"q";s:3:"絩";s:2:"r";s:3:"絪";s:2:"s";s:3:"絫";s:2:"t";s:3:"絬";s:2:"u";s:3:"絭";s:2:"v";s:3:"絮";s:2:"";s:3:"絯";s:2:"w";s:3:"絰";s:2:"x";s:3:"統";s:2:"y";s:3:"絲";s:2:"z";s:3:"絳";s:2:"{";s:3:"絴";s:2:"|";s:3:"絵";s:2:"}";s:3:"絶";s:2:"~";s:3:"絷";s:2:"";s:3:"絸";s:2:"";s:3:"絹";s:2:"";s:3:"絺";s:2:"";s:3:"絻";s:2:"";s:3:"絼";s:2:"";s:3:"絽";s:2:"";s:3:"絾";s:2:"";s:3:"絿";s:2:"";s:3:"綀";s:2:"";s:3:"綁";s:2:"";s:3:"綂";s:2:"";s:3:"綃";s:2:"";s:3:"綄";s:2:"";s:3:"綅";s:2:"";s:3:"綆";s:2:"";s:3:"綇";s:2:"";s:3:"綈";s:2:"";s:3:"綉";s:2:"";s:3:"綊";s:2:"";s:3:"綋";s:2:"";s:3:"綌";s:2:"";s:3:"綍";s:2:"";s:3:"綎";s:2:"";s:3:"綏";s:2:"";s:3:"綐";s:2:"";s:3:"綑";s:2:"";s:3:"綒";s:2:"";s:3:"經";s:2:"";s:3:"綔";s:2:"";s:3:"綕";s:2:"";s:3:"綖";s:2:"";s:3:"綗";s:2:"";s:3:"綘";s:2:"";s:3:"継";s:2:"@";s:3:"続";s:2:"A";s:3:"綛";s:2:"B";s:3:"綜";s:2:"C";s:3:"綝";s:2:"D";s:3:"綞";s:2:"E";s:3:"綟";s:2:"F";s:3:"綠";s:2:"G";s:3:"綡";s:2:"H";s:3:"綢";s:2:"I";s:3:"綣";s:2:"J";s:3:"綤";s:2:"K";s:3:"綥";s:2:"L";s:3:"綦";s:2:"";s:3:"綧";s:2:"M";s:3:"綨";s:2:"N";s:3:"綩";s:2:"O";s:3:"綪";s:2:"P";s:3:"綫";s:2:"Q";s:3:"綬";s:2:"R";s:3:"維";s:2:"S";s:3:"綮";s:2:"";s:3:"綯";s:2:"T";s:3:"綰";s:2:"U";s:3:"綱";s:2:"V";s:3:"網";s:2:"W";s:3:"綳";s:2:"X";s:3:"綴";s:2:"Y";s:3:"綵";s:2:"Z";s:3:"綶";s:2:"[";s:3:"綷";s:2:"\";s:3:"綸";s:2:"]";s:3:"綹";s:2:"^";s:3:"綺";s:2:"_";s:3:"綻";s:2:"`";s:3:"綼";s:2:"a";s:3:"綽";s:2:"b";s:3:"綾";s:2:"c";s:3:"綿";s:2:"d";s:3:"緀";s:2:"e";s:3:"緁";s:2:"f";s:3:"緂";s:2:"g";s:3:"緃";s:2:"h";s:3:"緄";s:2:"i";s:3:"緅";s:2:"j";s:3:"緆";s:2:"k";s:3:"緇";s:2:"l";s:3:"緈";s:2:"m";s:3:"緉";s:2:"n";s:3:"緊";s:2:"o";s:3:"緋";s:2:"p";s:3:"緌";s:2:"q";s:3:"緍";s:2:"r";s:3:"緎";s:2:"s";s:3:"総";s:2:"t";s:3:"緐";s:2:"u";s:3:"緑";s:2:"v";s:3:"緒";s:2:"w";s:3:"緓";s:2:"x";s:3:"緔";s:2:"y";s:3:"緕";s:2:"z";s:3:"緖";s:2:"{";s:3:"緗";s:2:"|";s:3:"緘";s:2:"}";s:3:"緙";s:2:"~";s:3:"線";s:2:"";s:3:"緛";s:2:"";s:3:"緜";s:2:"";s:3:"緝";s:2:"";s:3:"緞";s:2:"";s:3:"緟";s:2:"";s:3:"締";s:2:"";s:3:"緡";s:2:"";s:3:"緢";s:2:"";s:3:"緣";s:2:"";s:3:"緤";s:2:"";s:3:"緥";s:2:"";s:3:"緦";s:2:"";s:3:"緧";s:2:"";s:3:"編";s:2:"";s:3:"緩";s:2:"";s:3:"緪";s:2:"";s:3:"緫";s:2:"";s:3:"緬";s:2:"";s:3:"緭";s:2:"";s:3:"緮";s:2:"";s:3:"緯";s:2:"";s:3:"緰";s:2:"";s:3:"緱";s:2:"";s:3:"緲";s:2:"";s:3:"緳";s:2:"";s:3:"練";s:2:"";s:3:"緵";s:2:"";s:3:"緶";s:2:"";s:3:"緷";s:2:"";s:3:"緸";s:2:"";s:3:"緹";s:2:"";s:3:"緺";s:2:"";s:3:"緻";s:2:"@";s:3:"緼";s:2:"A";s:3:"緽";s:2:"B";s:3:"緾";s:2:"C";s:3:"緿";s:2:"D";s:3:"縀";s:2:"E";s:3:"縁";s:2:"F";s:3:"縂";s:2:"G";s:3:"縃";s:2:"H";s:3:"縄";s:2:"I";s:3:"縅";s:2:"J";s:3:"縆";s:2:"K";s:3:"縇";s:2:"L";s:3:"縈";s:2:"M";s:3:"縉";s:2:"N";s:3:"縊";s:2:"O";s:3:"縋";s:2:"P";s:3:"縌";s:2:"Q";s:3:"縍";s:2:"R";s:3:"縎";s:2:"S";s:3:"縏";s:2:"T";s:3:"縐";s:2:"U";s:3:"縑";s:2:"V";s:3:"縒";s:2:"W";s:3:"縓";s:2:"X";s:3:"縔";s:2:"Y";s:3:"縕";s:2:"Z";s:3:"縖";s:2:"[";s:3:"縗";s:2:"\";s:3:"縘";s:2:"]";s:3:"縙";s:2:"^";s:3:"縚";s:2:"_";s:3:"縛";s:2:"`";s:3:"縜";s:2:"a";s:3:"縝";s:2:"b";s:3:"縞";s:2:"c";s:3:"縟";s:2:"d";s:3:"縠";s:2:"e";s:3:"縡";s:2:"f";s:3:"縢";s:2:"g";s:3:"縣";s:2:"h";s:3:"縤";s:2:"i";s:3:"縥";s:2:"j";s:3:"縦";s:2:"k";s:3:"縧";s:2:"l";s:3:"縨";s:2:"m";s:3:"縩";s:2:"n";s:3:"縪";s:2:"o";s:3:"縫";s:2:"p";s:3:"縬";s:2:"q";s:3:"縭";s:2:"r";s:3:"縮";s:2:"s";s:3:"縯";s:2:"t";s:3:"縰";s:2:"u";s:3:"縱";s:2:"v";s:3:"縲";s:2:"w";s:3:"縳";s:2:"x";s:3:"縴";s:2:"y";s:3:"縵";s:2:"z";s:3:"縶";s:2:"{";s:3:"縷";s:2:"|";s:3:"縸";s:2:"}";s:3:"縹";s:2:"~";s:3:"縺";s:2:"";s:3:"縻";s:2:"";s:3:"縼";s:2:"";s:3:"總";s:2:"";s:3:"績";s:2:"";s:3:"縿";s:2:"";s:3:"繀";s:2:"";s:3:"繁";s:2:"";s:3:"繂";s:2:"";s:3:"繃";s:2:"";s:3:"繄";s:2:"";s:3:"繅";s:2:"";s:3:"繆";s:2:"";s:3:"繇";s:2:"";s:3:"繈";s:2:"";s:3:"繉";s:2:"";s:3:"繊";s:2:"";s:3:"繋";s:2:"";s:3:"繌";s:2:"";s:3:"繍";s:2:"";s:3:"繎";s:2:"";s:3:"繏";s:2:"";s:3:"繐";s:2:"";s:3:"繑";s:2:"";s:3:"繒";s:2:"";s:3:"繓";s:2:"";s:3:"織";s:2:"";s:3:"繕";s:2:"";s:3:"繖";s:2:"";s:3:"繗";s:2:"";s:3:"繘";s:2:"";s:3:"繙";s:2:"";s:3:"繚";s:2:"";s:3:"繛";s:2:"";s:3:"繜";s:2:"";s:3:"繝";s:2:"";s:3:"繞";s:2:"@";s:3:"繟";s:2:"A";s:3:"繠";s:2:"B";s:3:"繡";s:2:"C";s:3:"繢";s:2:"D";s:3:"繣";s:2:"E";s:3:"繤";s:2:"F";s:3:"繥";s:2:"G";s:3:"繦";s:2:"H";s:3:"繧";s:2:"I";s:3:"繨";s:2:"J";s:3:"繩";s:2:"K";s:3:"繪";s:2:"L";s:3:"繫";s:2:"M";s:3:"繬";s:2:"N";s:3:"繭";s:2:"O";s:3:"繮";s:2:"P";s:3:"繯";s:2:"Q";s:3:"繰";s:2:"R";s:3:"繱";s:2:"S";s:3:"繲";s:2:"T";s:3:"繳";s:2:"U";s:3:"繴";s:2:"V";s:3:"繵";s:2:"W";s:3:"繶";s:2:"X";s:3:"繷";s:2:"Y";s:3:"繸";s:2:"Z";s:3:"繹";s:2:"[";s:3:"繺";s:2:"\";s:3:"繻";s:2:"]";s:3:"繼";s:2:"^";s:3:"繽";s:2:"_";s:3:"繾";s:2:"`";s:3:"繿";s:2:"a";s:3:"纀";s:2:"b";s:3:"纁";s:2:"c";s:3:"纂";s:2:"";s:3:"纃";s:2:"d";s:3:"纄";s:2:"e";s:3:"纅";s:2:"f";s:3:"纆";s:2:"g";s:3:"纇";s:2:"h";s:3:"纈";s:2:"i";s:3:"纉";s:2:"j";s:3:"纊";s:2:"k";s:3:"纋";s:2:"l";s:3:"續";s:2:"m";s:3:"纍";s:2:"n";s:3:"纎";s:2:"o";s:3:"纏";s:2:"p";s:3:"纐";s:2:"q";s:3:"纑";s:2:"r";s:3:"纒";s:2:"s";s:3:"纓";s:2:"t";s:3:"纔";s:2:"u";s:3:"纕";s:2:"v";s:3:"纖";s:2:"w";s:3:"纗";s:2:"x";s:3:"纘";s:2:"y";s:3:"纙";s:2:"z";s:3:"纚";s:2:"{";s:3:"纛";s:2:"";s:3:"纜";s:2:"|";s:3:"纝";s:2:"}";s:3:"纞";s:2:"~";s:3:"纟";s:2:"";s:3:"纠";s:2:"";s:3:"纡";s:2:"";s:3:"红";s:2:"";s:3:"纣";s:2:"";s:3:"纤";s:2:"";s:3:"纥";s:2:"";s:3:"约";s:2:"Լ";s:3:"级";s:2:"";s:3:"纨";s:2:"";s:3:"纩";s:2:"";s:3:"纪";s:2:"";s:3:"纫";s:2:"";s:3:"纬";s:2:"γ";s:3:"纭";s:2:"";s:3:"纮";s:2:"";s:3:"纯";s:2:"";s:3:"纰";s:2:"";s:3:"纱";s:2:"ɴ";s:3:"纲";s:2:"";s:3:"纳";s:2:"";s:3:"纴";s:2:"";s:3:"纵";s:2:"";s:3:"纶";s:2:"";s:3:"纷";s:2:"";s:3:"纸";s:2:"ֽ";s:3:"纹";s:2:"";s:3:"纺";s:2:"";s:3:"纻";s:2:"";s:3:"纼";s:2:"";s:3:"纽";s:2:"Ŧ";s:3:"纾";s:2:"";s:3:"线";s:2:"";s:3:"绀";s:2:"";s:3:"绁";s:2:"";s:3:"绂";s:2:"";s:3:"练";s:2:"";s:3:"组";s:2:"";s:3:"绅";s:2:"";s:3:"细";s:2:"ϸ";s:3:"织";s:2:"֯";s:3:"终";s:2:"";s:3:"绉";s:2:"";s:3:"绊";s:2:"";s:3:"绋";s:2:"";s:3:"绌";s:2:"";s:3:"绍";s:2:"";s:3:"绎";s:2:"";s:3:"经";s:2:"";s:3:"绐";s:2:"";s:3:"绑";s:2:"";s:3:"绒";s:2:"";s:3:"结";s:2:"";s:3:"绔";s:2:"";s:3:"绕";s:2:"";s:3:"绖";s:2:"";s:3:"绗";s:2:"";s:3:"绘";s:2:"";s:3:"给";s:2:"";s:3:"绚";s:2:"Ѥ";s:3:"绛";s:2:"";s:3:"络";s:2:"";s:3:"绝";s:2:"";s:3:"绞";s:2:"";s:3:"统";s:2:"ͳ";s:3:"绠";s:2:"";s:3:"绡";s:2:"";s:3:"绢";s:2:"";s:3:"绣";s:2:"";s:3:"绤";s:2:"";s:3:"绥";s:2:"";s:3:"绦";s:2:"";s:3:"继";s:2:"";s:3:"绨";s:2:"";s:3:"绩";s:2:"";s:3:"绪";s:2:"";s:3:"绫";s:2:"";s:3:"绬";s:2:"";s:3:"续";s:2:"";s:3:"绮";s:2:"";s:3:"绯";s:2:"";s:3:"绰";s:2:"";s:3:"绱";s:2:"";s:3:"绲";s:2:"";s:3:"绳";s:2:"";s:3:"维";s:2:"ά";s:3:"绵";s:2:"";s:3:"绶";s:2:"";s:3:"绷";s:2:"";s:3:"绸";s:2:"";s:3:"绹";s:2:"";s:3:"绺";s:2:"";s:3:"绻";s:2:"";s:3:"综";s:2:"";s:3:"绽";s:2:"";s:3:"绾";s:2:"";s:3:"绿";s:2:"";s:3:"缀";s:2:"׺";s:3:"缁";s:2:"";s:3:"缂";s:2:"";s:3:"缃";s:2:"";s:3:"缄";s:2:"";s:3:"缅";s:2:"";s:3:"缆";s:2:"";s:3:"缇";s:2:"";s:3:"缈";s:2:"";s:3:"缉";s:2:"";s:3:"缊";s:2:"";s:3:"缋";s:2:"";s:3:"缌";s:2:"";s:3:"缍";s:2:"";s:3:"缎";s:2:"";s:3:"缏";s:2:"";s:3:"缐";s:2:"";s:3:"缑";s:2:"";s:3:"缒";s:2:"";s:3:"缓";s:2:"";s:3:"缔";s:2:"";s:3:"缕";s:2:"";s:3:"编";s:2:"";s:3:"缗";s:2:"";s:3:"缘";s:2:"Ե";s:3:"缙";s:2:"";s:3:"缚";s:2:"";s:3:"缛";s:2:"";s:3:"缜";s:2:"";s:3:"缝";s:2:"";s:3:"缞";s:2:"";s:3:"缟";s:2:"";s:3:"缠";s:2:"";s:3:"缡";s:2:"";s:3:"缢";s:2:"";s:3:"缣";s:2:"";s:3:"缤";s:2:"";s:3:"缥";s:2:"";s:3:"缦";s:2:"";s:3:"缧";s:2:"";s:3:"缨";s:2:"ӧ";s:3:"缩";s:2:"";s:3:"缪";s:2:"";s:3:"缫";s:2:"";s:3:"缬";s:2:"";s:3:"缭";s:2:"";s:3:"缮";s:2:"";s:3:"缯";s:2:"";s:3:"缰";s:2:"";s:3:"缱";s:2:"";s:3:"缲";s:2:"";s:3:"缳";s:2:"";s:3:"缴";s:2:"";s:3:"缵";s:2:"";s:3:"缶";s:2:"";s:3:"缷";s:2:"";s:3:"缸";s:2:"";s:3:"缹";s:2:"";s:3:"缺";s:2:"ȱ";s:3:"缻";s:2:"";s:3:"缼";s:2:"";s:3:"缽";s:2:"";s:3:"缾";s:2:"";s:3:"缿";s:2:"";s:3:"罀";s:2:"";s:3:"罁";s:2:"";s:3:"罂";s:2:"";s:3:"罃";s:2:"";s:3:"罄";s:2:"";s:3:"罅";s:2:"";s:3:"罆";s:2:"";s:3:"罇";s:2:"";s:3:"罈";s:2:"";s:3:"罉";s:2:"";s:3:"罊";s:2:"";s:3:"罋";s:2:"";s:3:"罌";s:2:"";s:3:"罍";s:2:"";s:3:"罎";s:2:"";s:3:"罏";s:2:"";s:3:"罐";s:2:"";s:3:"网";s:2:"";s:3:"罒";s:2:"";s:3:"罓";s:2:"";s:3:"罔";s:2:"";s:3:"罕";s:2:"";s:3:"罖";s:2:"@";s:3:"罗";s:2:"";s:3:"罘";s:2:"";s:3:"罙";s:2:"A";s:3:"罚";s:2:"";s:3:"罛";s:2:"B";s:3:"罜";s:2:"C";s:3:"罝";s:2:"D";s:3:"罞";s:2:"E";s:3:"罟";s:2:"";s:3:"罠";s:2:"F";s:3:"罡";s:2:"";s:3:"罢";s:2:"";s:3:"罣";s:2:"G";s:3:"罤";s:2:"H";s:3:"罥";s:2:"I";s:3:"罦";s:2:"J";s:3:"罧";s:2:"K";s:3:"罨";s:2:"";s:3:"罩";s:2:"";s:3:"罪";s:2:"";s:3:"罫";s:2:"L";s:3:"罬";s:2:"M";s:3:"罭";s:2:"N";s:3:"置";s:2:"";s:3:"罯";s:2:"O";s:3:"罰";s:2:"P";s:3:"罱";s:2:"";s:3:"署";s:2:"";s:3:"罳";s:2:"Q";s:3:"罴";s:2:"";s:3:"罵";s:2:"R";s:3:"罶";s:2:"S";s:3:"罷";s:2:"T";s:3:"罸";s:2:"U";s:3:"罹";s:2:"";s:3:"罺";s:2:"V";s:3:"罻";s:2:"W";s:3:"罼";s:2:"X";s:3:"罽";s:2:"Y";s:3:"罾";s:2:"";s:3:"罿";s:2:"Z";s:3:"羀";s:2:"[";s:3:"羁";s:2:"";s:3:"羂";s:2:"\";s:3:"羃";s:2:"]";s:3:"羄";s:2:"^";s:3:"羅";s:2:"_";s:3:"羆";s:2:"`";s:3:"羇";s:2:"a";s:3:"羈";s:2:"b";s:3:"羉";s:2:"c";s:3:"羊";s:2:"";s:3:"羋";s:2:"d";s:3:"羌";s:2:"Ǽ";s:3:"羍";s:2:"e";s:3:"美";s:2:"";s:3:"羏";s:2:"f";s:3:"羐";s:2:"g";s:3:"羑";s:2:"h";s:3:"羒";s:2:"i";s:3:"羓";s:2:"j";s:3:"羔";s:2:"";s:3:"羕";s:2:"k";s:3:"羖";s:2:"l";s:3:"羗";s:2:"m";s:3:"羘";s:2:"n";s:3:"羙";s:2:"o";s:3:"羚";s:2:"";s:3:"羛";s:2:"p";s:3:"羜";s:2:"q";s:3:"羝";s:2:"";s:3:"羞";s:2:"";s:3:"羟";s:2:"";s:3:"羠";s:2:"r";s:3:"羡";s:2:"";s:3:"羢";s:2:"s";s:3:"羣";s:2:"t";s:3:"群";s:2:"Ⱥ";s:3:"羥";s:2:"u";s:3:"羦";s:2:"v";s:3:"羧";s:2:"";s:3:"羨";s:2:"w";s:3:"義";s:2:"x";s:3:"羪";s:2:"y";s:3:"羫";s:2:"z";s:3:"羬";s:2:"{";s:3:"羭";s:2:"|";s:3:"羮";s:2:"}";s:3:"羯";s:2:"";s:3:"羰";s:2:"";s:3:"羱";s:2:"~";s:3:"羲";s:2:"";s:3:"羳";s:2:"";s:3:"羴";s:2:"";s:3:"羵";s:2:"";s:3:"羶";s:2:"";s:3:"羷";s:2:"";s:3:"羸";s:2:"";s:3:"羹";s:2:"";s:3:"羺";s:2:"";s:3:"羻";s:2:"";s:3:"羼";s:2:"";s:3:"羽";s:2:"";s:3:"羾";s:2:"";s:3:"羿";s:2:"";s:3:"翀";s:2:"";s:3:"翁";s:2:"";s:3:"翂";s:2:"";s:3:"翃";s:2:"";s:3:"翄";s:2:"";s:3:"翅";s:2:"";s:3:"翆";s:2:"";s:3:"翇";s:2:"";s:3:"翈";s:2:"";s:3:"翉";s:2:"";s:3:"翊";s:2:"";s:3:"翋";s:2:"";s:3:"翌";s:2:"";s:3:"翍";s:2:"";s:3:"翎";s:2:"";s:3:"翏";s:2:"";s:3:"翐";s:2:"";s:3:"翑";s:2:"";s:3:"習";s:2:"";s:3:"翓";s:2:"";s:3:"翔";s:2:"";s:3:"翕";s:2:"";s:3:"翖";s:2:"";s:3:"翗";s:2:"";s:3:"翘";s:2:"";s:3:"翙";s:2:"";s:3:"翚";s:2:"";s:3:"翛";s:2:"";s:3:"翜";s:2:"";s:3:"翝";s:2:"";s:3:"翞";s:2:"";s:3:"翟";s:2:"";s:3:"翠";s:2:"";s:3:"翡";s:2:"";s:3:"翢";s:2:"";s:3:"翣";s:2:"";s:3:"翤";s:2:"@";s:3:"翥";s:2:"";s:3:"翦";s:2:"";s:3:"翧";s:2:"A";s:3:"翨";s:2:"B";s:3:"翩";s:2:"";s:3:"翪";s:2:"C";s:3:"翫";s:2:"D";s:3:"翬";s:2:"E";s:3:"翭";s:2:"F";s:3:"翮";s:2:"";s:3:"翯";s:2:"G";s:3:"翰";s:2:"";s:3:"翱";s:2:"";s:3:"翲";s:2:"H";s:3:"翳";s:2:"";s:3:"翴";s:2:"I";s:3:"翵";s:2:"J";s:3:"翶";s:2:"K";s:3:"翷";s:2:"L";s:3:"翸";s:2:"M";s:3:"翹";s:2:"N";s:3:"翺";s:2:"O";s:3:"翻";s:2:"";s:3:"翼";s:2:"";s:3:"翽";s:2:"P";s:3:"翾";s:2:"Q";s:3:"翿";s:2:"R";s:3:"耀";s:2:"ҫ";s:3:"老";s:2:"";s:3:"耂";s:2:"S";s:3:"考";s:2:"";s:3:"耄";s:2:"";s:3:"者";s:2:"";s:3:"耆";s:2:"";s:3:"耇";s:2:"T";s:3:"耈";s:2:"U";s:3:"耉";s:2:"V";s:3:"耊";s:2:"W";s:3:"耋";s:2:"";s:3:"而";s:2:"";s:3:"耍";s:2:"ˣ";s:3:"耎";s:2:"X";s:3:"耏";s:2:"Y";s:3:"耐";s:2:"";s:3:"耑";s:2:"Z";s:3:"耒";s:2:"";s:3:"耓";s:2:"[";s:3:"耔";s:2:"";s:3:"耕";s:2:"";s:3:"耖";s:2:"";s:3:"耗";s:2:"";s:3:"耘";s:2:"";s:3:"耙";s:2:"";s:3:"耚";s:2:"\";s:3:"耛";s:2:"]";s:3:"耜";s:2:"";s:3:"耝";s:2:"^";s:3:"耞";s:2:"_";s:3:"耟";s:2:"`";s:3:"耠";s:2:"";s:3:"耡";s:2:"a";s:3:"耢";s:2:"";s:3:"耣";s:2:"b";s:3:"耤";s:2:"c";s:3:"耥";s:2:"";s:3:"耦";s:2:"";s:3:"耧";s:2:"";s:3:"耨";s:2:"";s:3:"耩";s:2:"";s:3:"耪";s:2:"";s:3:"耫";s:2:"d";s:3:"耬";s:2:"e";s:3:"耭";s:2:"f";s:3:"耮";s:2:"g";s:3:"耯";s:2:"h";s:3:"耰";s:2:"i";s:3:"耱";s:2:"";s:3:"耲";s:2:"j";s:3:"耳";s:2:"";s:3:"耴";s:2:"k";s:3:"耵";s:2:"";s:3:"耶";s:2:"Ү";s:3:"耷";s:2:"";s:3:"耸";s:2:"";s:3:"耹";s:2:"l";s:3:"耺";s:2:"m";s:3:"耻";s:2:"";s:3:"耼";s:2:"n";s:3:"耽";s:2:"";s:3:"耾";s:2:"o";s:3:"耿";s:2:"";s:3:"聀";s:2:"p";s:3:"聁";s:2:"q";s:3:"聂";s:2:"";s:3:"聃";s:2:"";s:3:"聄";s:2:"r";s:3:"聅";s:2:"s";s:3:"聆";s:2:"";s:3:"聇";s:2:"t";s:3:"聈";s:2:"u";s:3:"聉";s:2:"v";s:3:"聊";s:2:"";s:3:"聋";s:2:"";s:3:"职";s:2:"ְ";s:3:"聍";s:2:"";s:3:"聎";s:2:"w";s:3:"聏";s:2:"x";s:3:"聐";s:2:"y";s:3:"聑";s:2:"z";s:3:"聒";s:2:"";s:3:"聓";s:2:"{";s:3:"联";s:2:"";s:3:"聕";s:2:"|";s:3:"聖";s:2:"}";s:3:"聗";s:2:"~";s:3:"聘";s:2:"Ƹ";s:3:"聙";s:2:"";s:3:"聚";s:2:"";s:3:"聛";s:2:"";s:3:"聜";s:2:"";s:3:"聝";s:2:"";s:3:"聞";s:2:"";s:3:"聟";s:2:"";s:3:"聠";s:2:"";s:3:"聡";s:2:"";s:3:"聢";s:2:"";s:3:"聣";s:2:"";s:3:"聤";s:2:"";s:3:"聥";s:2:"";s:3:"聦";s:2:"";s:3:"聧";s:2:"";s:3:"聨";s:2:"";s:3:"聩";s:2:"";s:3:"聪";s:2:"";s:3:"聫";s:2:"";s:3:"聬";s:2:"";s:3:"聭";s:2:"";s:3:"聮";s:2:"";s:3:"聯";s:2:"";s:3:"聰";s:2:"";s:3:"聱";s:2:"";s:3:"聲";s:2:"";s:3:"聳";s:2:"";s:3:"聴";s:2:"";s:3:"聵";s:2:"";s:3:"聶";s:2:"";s:3:"職";s:2:"";s:3:"聸";s:2:"";s:3:"聹";s:2:"";s:3:"聺";s:2:"";s:3:"聻";s:2:"";s:3:"聼";s:2:"";s:3:"聽";s:2:" ";s:3:"聾";s:2:"@";s:3:"聿";s:2:"";s:3:"肀";s:2:"";s:3:"肁";s:2:"A";s:3:"肂";s:2:"B";s:3:"肃";s:2:"";s:3:"肄";s:2:"";s:3:"肅";s:2:"C";s:3:"肆";s:2:"";s:3:"肇";s:2:"";s:3:"肈";s:2:"D";s:3:"肉";s:2:"";s:3:"肊";s:2:"E";s:3:"肋";s:2:"";s:3:"肌";s:2:"";s:3:"肍";s:2:"F";s:3:"肎";s:2:"G";s:3:"肏";s:2:"H";s:3:"肐";s:2:"I";s:3:"肑";s:2:"J";s:3:"肒";s:2:"K";s:3:"肓";s:2:"";s:3:"肔";s:2:"L";s:3:"肕";s:2:"M";s:3:"肖";s:2:"Ф";s:3:"肗";s:2:"N";s:3:"肘";s:2:"";s:3:"肙";s:2:"O";s:3:"肚";s:2:"";s:3:"肛";s:2:"";s:3:"肜";s:2:"";s:3:"肝";s:2:"";s:3:"肞";s:2:"P";s:3:"肟";s:2:"";s:3:"肠";s:2:"";s:3:"股";s:2:"";s:3:"肢";s:2:"֫";s:3:"肣";s:2:"Q";s:3:"肤";s:2:"";s:3:"肥";s:2:"";s:3:"肦";s:2:"R";s:3:"肧";s:2:"S";s:3:"肨";s:2:"T";s:3:"肩";s:2:"";s:3:"肪";s:2:"";s:3:"肫";s:2:"";s:3:"肬";s:2:"U";s:3:"肭";s:2:"";s:3:"肮";s:2:"";s:3:"肯";s:2:"";s:3:"肰";s:2:"V";s:3:"肱";s:2:"";s:3:"育";s:2:"";s:3:"肳";s:2:"W";s:3:"肴";s:2:"";s:3:"肵";s:2:"X";s:3:"肶";s:2:"Y";s:3:"肷";s:2:"";s:3:"肸";s:2:"Z";s:3:"肹";s:2:"[";s:3:"肺";s:2:"";s:3:"肻";s:2:"\";s:3:"肼";s:2:"";s:3:"肽";s:2:"";s:3:"肾";s:2:"";s:3:"肿";s:2:"";s:3:"胀";s:2:"";s:3:"胁";s:2:"в";s:3:"胂";s:2:"";s:3:"胃";s:2:"θ";s:3:"胄";s:2:"";s:3:"胅";s:2:"]";s:3:"胆";s:2:"";s:3:"胇";s:2:"^";s:3:"胈";s:2:"_";s:3:"胉";s:2:"`";s:3:"胊";s:2:"a";s:3:"胋";s:2:"b";s:3:"背";s:2:"";s:3:"胍";s:2:"";s:3:"胎";s:2:"̥";s:3:"胏";s:2:"c";s:3:"胐";s:2:"d";s:3:"胑";s:2:"e";s:3:"胒";s:2:"f";s:3:"胓";s:2:"g";s:3:"胔";s:2:"h";s:3:"胕";s:2:"i";s:3:"胖";s:2:"";s:3:"胗";s:2:"";s:3:"胘";s:2:"j";s:3:"胙";s:2:"";s:3:"胚";s:2:"";s:3:"胛";s:2:"";s:3:"胜";s:2:"ʤ";s:3:"胝";s:2:"";s:3:"胞";s:2:"";s:3:"胟";s:2:"k";s:3:"胠";s:2:"l";s:3:"胡";s:2:"";s:3:"胢";s:2:"m";s:3:"胣";s:2:"n";s:3:"胤";s:2:"ط";s:3:"胥";s:2:"";s:3:"胦";s:2:"o";s:3:"胧";s:2:"";s:3:"胨";s:2:"";s:3:"胩";s:2:"";s:3:"胪";s:2:"";s:3:"胫";s:2:"";s:3:"胬";s:2:"";s:3:"胭";s:2:"";s:3:"胮";s:2:"p";s:3:"胯";s:2:"";s:3:"胰";s:2:"";s:3:"胱";s:2:"";s:3:"胲";s:2:"";s:3:"胳";s:2:"";s:3:"胴";s:2:"";s:3:"胵";s:2:"q";s:3:"胶";s:2:"";s:3:"胷";s:2:"r";s:3:"胸";s:2:"";s:3:"胹";s:2:"s";s:3:"胺";s:2:"";s:3:"胻";s:2:"t";s:3:"胼";s:2:"";s:3:"能";s:2:"";s:3:"胾";s:2:"u";s:3:"胿";s:2:"v";s:3:"脀";s:2:"w";s:3:"脁";s:2:"x";s:3:"脂";s:2:"֬";s:3:"脃";s:2:"y";s:3:"脄";s:2:"z";s:3:"脅";s:2:"{";s:3:"脆";s:2:"";s:3:"脇";s:2:"|";s:3:"脈";s:2:"}";s:3:"脉";s:2:"";s:3:"脊";s:2:"";s:3:"脋";s:2:"~";s:3:"脌";s:2:"À";s:3:"脍";s:2:"";s:3:"脎";s:2:"";s:3:"脏";s:2:"";s:3:"脐";s:2:"";s:3:"脑";s:2:"";s:3:"脒";s:2:"";s:3:"脓";s:2:"ŧ";s:3:"脔";s:2:"";s:3:"脕";s:2:"Á";s:3:"脖";s:2:"";s:3:"脗";s:2:"Â";s:3:"脘";s:2:"";s:3:"脙";s:2:"Ã";s:3:"脚";s:2:"";s:3:"脛";s:2:"Ä";s:3:"脜";s:2:"Å";s:3:"脝";s:2:"Æ";s:3:"脞";s:2:"";s:3:"脟";s:2:"Ç";s:3:"脠";s:2:"È";s:3:"脡";s:2:"É";s:3:"脢";s:2:"Ê";s:3:"脣";s:2:"Ë";s:3:"脤";s:2:"Ì";s:3:"脥";s:2:"Í";s:3:"脦";s:2:"Î";s:3:"脧";s:2:"Ï";s:3:"脨";s:2:"Ð";s:3:"脩";s:2:"Ñ";s:3:"脪";s:2:"Ò";s:3:"脫";s:2:"Ó";s:3:"脬";s:2:"";s:3:"脭";s:2:"Ô";s:3:"脮";s:2:"Õ";s:3:"脯";s:2:"";s:3:"脰";s:2:"Ö";s:3:"脱";s:2:"";s:3:"脲";s:2:"";s:3:"脳";s:2:"×";s:3:"脴";s:2:"Ø";s:3:"脵";s:2:"Ù";s:3:"脶";s:2:"";s:3:"脷";s:2:"Ú";s:3:"脸";s:2:"";s:3:"脹";s:2:"Û";s:3:"脺";s:2:"Ü";s:3:"脻";s:2:"Ý";s:3:"脼";s:2:"Þ";s:3:"脽";s:2:"ß";s:3:"脾";s:2:"Ƣ";s:3:"脿";s:2:"à";s:3:"腀";s:2:"@";s:3:"腁";s:2:"A";s:3:"腂";s:2:"B";s:3:"腃";s:2:"C";s:3:"腄";s:2:"D";s:3:"腅";s:2:"E";s:3:"腆";s:2:"";s:3:"腇";s:2:"F";s:3:"腈";s:2:"";s:3:"腉";s:2:"G";s:3:"腊";s:2:"";s:3:"腋";s:2:"Ҹ";s:3:"腌";s:2:"";s:3:"腍";s:2:"H";s:3:"腎";s:2:"I";s:3:"腏";s:2:"J";s:3:"腐";s:2:"";s:3:"腑";s:2:"";s:3:"腒";s:2:"K";s:3:"腓";s:2:"";s:3:"腔";s:2:"ǻ";s:3:"腕";s:2:"";s:3:"腖";s:2:"L";s:3:"腗";s:2:"M";s:3:"腘";s:2:"N";s:3:"腙";s:2:"";s:3:"腚";s:2:"";s:3:"腛";s:2:"O";s:3:"腜";s:2:"P";s:3:"腝";s:2:"Q";s:3:"腞";s:2:"R";s:3:"腟";s:2:"S";s:3:"腠";s:2:"";s:3:"腡";s:2:"T";s:3:"腢";s:2:"U";s:3:"腣";s:2:"V";s:3:"腤";s:2:"W";s:3:"腥";s:2:"";s:3:"腦";s:2:"X";s:3:"腧";s:2:"";s:3:"腨";s:2:"Y";s:3:"腩";s:2:"";s:3:"腪";s:2:"Z";s:3:"腫";s:2:"[";s:3:"腬";s:2:"\";s:3:"腭";s:2:"";s:3:"腮";s:2:"";s:3:"腯";s:2:"]";s:3:"腰";s:2:"";s:3:"腱";s:2:"";s:3:"腲";s:2:"^";s:3:"腳";s:2:"_";s:3:"腴";s:2:"";s:3:"腵";s:2:"`";s:3:"腶";s:2:"a";s:3:"腷";s:2:"b";s:3:"腸";s:2:"c";s:3:"腹";s:2:"";s:3:"腺";s:2:"";s:3:"腻";s:2:"";s:3:"腼";s:2:"";s:3:"腽";s:2:"";s:3:"腾";s:2:"";s:3:"腿";s:2:"";s:3:"膀";s:2:"";s:3:"膁";s:2:"d";s:3:"膂";s:2:"";s:3:"膃";s:2:"e";s:3:"膄";s:2:"f";s:3:"膅";s:2:"g";s:3:"膆";s:2:"h";s:3:"膇";s:2:"i";s:3:"膈";s:2:"";s:3:"膉";s:2:"j";s:3:"膊";s:2:"";s:3:"膋";s:2:"k";s:3:"膌";s:2:"l";s:3:"膍";s:2:"m";s:3:"膎";s:2:"n";s:3:"膏";s:2:"";s:3:"膐";s:2:"o";s:3:"膑";s:2:"";s:3:"膒";s:2:"p";s:3:"膓";s:2:"q";s:3:"膔";s:2:"r";s:3:"膕";s:2:"s";s:3:"膖";s:2:"t";s:3:"膗";s:2:"u";s:3:"膘";s:2:"";s:3:"膙";s:2:"v";s:3:"膚";s:2:"w";s:3:"膛";s:2:"";s:3:"膜";s:2:"Ĥ";s:3:"膝";s:2:"ϥ";s:3:"膞";s:2:"x";s:3:"膟";s:2:"y";s:3:"膠";s:2:"z";s:3:"膡";s:2:"{";s:3:"膢";s:2:"|";s:3:"膣";s:2:"";s:3:"膤";s:2:"}";s:3:"膥";s:2:"~";s:3:"膦";s:2:"";s:3:"膧";s:2:"Ā";s:3:"膨";s:2:"";s:3:"膩";s:2:"ā";s:3:"膪";s:2:"";s:3:"膫";s:2:"Ă";s:3:"膬";s:2:"ă";s:3:"膭";s:2:"Ą";s:3:"膮";s:2:"ą";s:3:"膯";s:2:"Ć";s:3:"膰";s:2:"ć";s:3:"膱";s:2:"Ĉ";s:3:"膲";s:2:"ĉ";s:3:"膳";s:2:"";s:3:"膴";s:2:"Ċ";s:3:"膵";s:2:"ċ";s:3:"膶";s:2:"Č";s:3:"膷";s:2:"č";s:3:"膸";s:2:"Ď";s:3:"膹";s:2:"ď";s:3:"膺";s:2:"";s:3:"膻";s:2:"";s:3:"膼";s:2:"Đ";s:3:"膽";s:2:"đ";s:3:"膾";s:2:"Ē";s:3:"膿";s:2:"ē";s:3:"臀";s:2:"";s:3:"臁";s:2:"";s:3:"臂";s:2:"";s:3:"臃";s:2:"ӷ";s:3:"臄";s:2:"Ĕ";s:3:"臅";s:2:"ĕ";s:3:"臆";s:2:"";s:3:"臇";s:2:"Ė";s:3:"臈";s:2:"ė";s:3:"臉";s:2:"Ę";s:3:"臊";s:2:"";s:3:"臋";s:2:"ę";s:3:"臌";s:2:"";s:3:"臍";s:2:"Ě";s:3:"臎";s:2:"ě";s:3:"臏";s:2:"Ĝ";s:3:"臐";s:2:"ĝ";s:3:"臑";s:2:"Ğ";s:3:"臒";s:2:"ğ";s:3:"臓";s:2:"Ġ";s:3:"臔";s:2:"@";s:3:"臕";s:2:"A";s:3:"臖";s:2:"B";s:3:"臗";s:2:"C";s:3:"臘";s:2:"D";s:3:"臙";s:2:"E";s:3:"臚";s:2:"F";s:3:"臛";s:2:"G";s:3:"臜";s:2:"H";s:3:"臝";s:2:"I";s:3:"臞";s:2:"J";s:3:"臟";s:2:"K";s:3:"臠";s:2:"L";s:3:"臡";s:2:"M";s:3:"臢";s:2:"N";s:3:"臣";s:2:"";s:3:"臤";s:2:"O";s:3:"臥";s:2:"P";s:3:"臦";s:2:"Q";s:3:"臧";s:2:"";s:3:"臨";s:2:"R";s:3:"臩";s:2:"S";s:3:"自";s:2:"";s:3:"臫";s:2:"T";s:3:"臬";s:2:"";s:3:"臭";s:2:"";s:3:"臮";s:2:"U";s:3:"臯";s:2:"V";s:3:"臰";s:2:"W";s:3:"臱";s:2:"X";s:3:"臲";s:2:"Y";s:3:"至";s:2:"";s:3:"致";s:2:"";s:3:"臵";s:2:"Z";s:3:"臶";s:2:"[";s:3:"臷";s:2:"\";s:3:"臸";s:2:"]";s:3:"臹";s:2:"^";s:3:"臺";s:2:"_";s:3:"臻";s:2:"";s:3:"臼";s:2:"";s:3:"臽";s:2:"`";s:3:"臾";s:2:"";s:3:"臿";s:2:"a";s:3:"舀";s:2:"Ҩ";s:3:"舁";s:2:"";s:3:"舂";s:2:"";s:3:"舃";s:2:"b";s:3:"舄";s:2:"";s:3:"舅";s:2:"";s:3:"舆";s:2:"";s:3:"與";s:2:"c";s:3:"興";s:2:"d";s:3:"舉";s:2:"e";s:3:"舊";s:2:"f";s:3:"舋";s:2:"g";s:3:"舌";s:2:"";s:3:"舍";s:2:"";s:3:"舎";s:2:"h";s:3:"舏";s:2:"i";s:3:"舐";s:2:"";s:3:"舑";s:2:"j";s:3:"舒";s:2:"";s:3:"舓";s:2:"k";s:3:"舔";s:2:"";s:3:"舕";s:2:"l";s:3:"舖";s:2:"m";s:3:"舗";s:2:"n";s:3:"舘";s:2:"o";s:3:"舙";s:2:"p";s:3:"舚";s:2:"q";s:3:"舛";s:2:"";s:3:"舜";s:2:"˴";s:3:"舝";s:2:"r";s:3:"舞";s:2:"";s:3:"舟";s:2:"";s:3:"舠";s:2:"s";s:3:"舡";s:2:"";s:3:"舢";s:2:"";s:3:"舣";s:2:"";s:3:"舤";s:2:"t";s:3:"舥";s:2:"u";s:3:"舦";s:2:"v";s:3:"舧";s:2:"w";s:3:"舨";s:2:"";s:3:"舩";s:2:"x";s:3:"航";s:2:"";s:3:"舫";s:2:"";s:3:"般";s:2:"";s:3:"舭";s:2:"";s:3:"舮";s:2:"y";s:3:"舯";s:2:"";s:3:"舰";s:2:"";s:3:"舱";s:2:"";s:3:"舲";s:2:"z";s:3:"舳";s:2:"";s:3:"舴";s:2:"";s:3:"舵";s:2:"";s:3:"舶";s:2:"";s:3:"舷";s:2:"";s:3:"舸";s:2:"";s:3:"船";s:2:"";s:3:"舺";s:2:"{";s:3:"舻";s:2:"";s:3:"舼";s:2:"|";s:3:"舽";s:2:"}";s:3:"舾";s:2:"";s:3:"舿";s:2:"~";s:3:"艀";s:2:"ŀ";s:3:"艁";s:2:"Ł";s:3:"艂";s:2:"ł";s:3:"艃";s:2:"Ń";s:3:"艄";s:2:"";s:3:"艅";s:2:"ń";s:3:"艆";s:2:"Ņ";s:3:"艇";s:2:"ͧ";s:3:"艈";s:2:"ņ";s:3:"艉";s:2:"";s:3:"艊";s:2:"Ň";s:3:"艋";s:2:"";s:3:"艌";s:2:"ň";s:3:"艍";s:2:"ŉ";s:3:"艎";s:2:"Ŋ";s:3:"艏";s:2:"";s:3:"艐";s:2:"ŋ";s:3:"艑";s:2:"Ō";s:3:"艒";s:2:"ō";s:3:"艓";s:2:"Ŏ";s:3:"艔";s:2:"ŏ";s:3:"艕";s:2:"Ő";s:3:"艖";s:2:"ő";s:3:"艗";s:2:"Œ";s:3:"艘";s:2:"";s:3:"艙";s:2:"œ";s:3:"艚";s:2:"";s:3:"艛";s:2:"Ŕ";s:3:"艜";s:2:"ŕ";s:3:"艝";s:2:"Ŗ";s:3:"艞";s:2:"ŗ";s:3:"艟";s:2:"";s:3:"艠";s:2:"Ř";s:3:"艡";s:2:"ř";s:3:"艢";s:2:"Ś";s:3:"艣";s:2:"ś";s:3:"艤";s:2:"Ŝ";s:3:"艥";s:2:"ŝ";s:3:"艦";s:2:"Ş";s:3:"艧";s:2:"ş";s:3:"艨";s:2:"";s:3:"艩";s:2:"Š";s:3:"艪";s:2:"@";s:3:"艫";s:2:"A";s:3:"艬";s:2:"B";s:3:"艭";s:2:"C";s:3:"艮";s:2:"";s:3:"良";s:2:"";s:3:"艰";s:2:"";s:3:"艱";s:2:"D";s:3:"色";s:2:"ɫ";s:3:"艳";s:2:"";s:3:"艴";s:2:"";s:3:"艵";s:2:"E";s:3:"艶";s:2:"F";s:3:"艷";s:2:"G";s:3:"艸";s:2:"H";s:3:"艹";s:2:"ܳ";s:3:"艺";s:2:"";s:3:"艻";s:2:"I";s:3:"艼";s:2:"J";s:3:"艽";s:2:"ܴ";s:3:"艾";s:2:"";s:3:"艿";s:2:"ܵ";s:3:"芀";s:2:"K";s:3:"芁";s:2:"L";s:3:"节";s:2:"";s:3:"芃";s:2:"M";s:3:"芄";s:2:"ܹ";s:3:"芅";s:2:"N";s:3:"芆";s:2:"O";s:3:"芇";s:2:"P";s:3:"芈";s:2:"";s:3:"芉";s:2:"Q";s:3:"芊";s:2:"ܷ";s:3:"芋";s:2:"";s:3:"芌";s:2:"R";s:3:"芍";s:2:"";s:3:"芎";s:2:"ܺ";s:3:"芏";s:2:"ܶ";s:3:"芐";s:2:"S";s:3:"芑";s:2:"ܻ";s:3:"芒";s:2:"â";s:3:"芓";s:2:"T";s:3:"芔";s:2:"U";s:3:"芕";s:2:"V";s:3:"芖";s:2:"W";s:3:"芗";s:2:"ܼ";s:3:"芘";s:2:"";s:3:"芙";s:2:"ܽ";s:3:"芚";s:2:"X";s:3:"芛";s:2:"Y";s:3:"芜";s:2:"";s:3:"芝";s:2:"֥";s:3:"芞";s:2:"Z";s:3:"芟";s:2:"";s:3:"芠";s:2:"[";s:3:"芡";s:2:"";s:3:"芢";s:2:"\";s:3:"芣";s:2:"]";s:3:"芤";s:2:"";s:3:"芥";s:2:"";s:3:"芦";s:2:"«";s:3:"芧";s:2:"^";s:3:"芨";s:2:"ܸ";s:3:"芩";s:2:"";s:3:"芪";s:2:"";s:3:"芫";s:2:"ܾ";s:3:"芬";s:2:"";s:3:"芭";s:2:"";s:3:"芮";s:2:"";s:3:"芯";s:2:"о";s:3:"芰";s:2:"";s:3:"花";s:2:"";s:3:"芲";s:2:"_";s:3:"芳";s:2:"";s:3:"芴";s:2:"";s:3:"芵";s:2:"`";s:3:"芶";s:2:"a";s:3:"芷";s:2:"";s:3:"芸";s:2:"ܿ";s:3:"芹";s:2:"";s:3:"芺";s:2:"b";s:3:"芻";s:2:"c";s:3:"芼";s:2:"d";s:3:"芽";s:2:"ѿ";s:3:"芾";s:2:"";s:3:"芿";s:2:"e";s:3:"苀";s:2:"f";s:3:"苁";s:2:"";s:3:"苂";s:2:"g";s:3:"苃";s:2:"h";s:3:"苄";s:2:"";s:3:"苅";s:2:"i";s:3:"苆";s:2:"j";s:3:"苇";s:2:"έ";s:3:"苈";s:2:"";s:3:"苉";s:2:"k";s:3:"苊";s:2:"";s:3:"苋";s:2:"";s:3:"苌";s:2:"";s:3:"苍";s:2:"";s:3:"苎";s:2:"";s:3:"苏";s:2:"";s:3:"苐";s:2:"l";s:3:"苑";s:2:"Է";s:3:"苒";s:2:"";s:3:"苓";s:2:"";s:3:"苔";s:2:"̦";s:3:"苕";s:2:"";s:3:"苖";s:2:"m";s:3:"苗";s:2:"";s:3:"苘";s:2:"";s:3:"苙";s:2:"n";s:3:"苚";s:2:"o";s:3:"苛";s:2:"";s:3:"苜";s:2:"";s:3:"苝";s:2:"p";s:3:"苞";s:2:"";s:3:"苟";s:2:"";s:3:"苠";s:2:"";s:3:"苡";s:2:"";s:3:"苢";s:2:"q";s:3:"苣";s:2:"";s:3:"苤";s:2:"";s:3:"若";s:2:"";s:3:"苦";s:2:"";s:3:"苧";s:2:"r";s:3:"苨";s:2:"s";s:3:"苩";s:2:"t";s:3:"苪";s:2:"u";s:3:"苫";s:2:"ɻ";s:3:"苬";s:2:"v";s:3:"苭";s:2:"w";s:3:"苮";s:2:"x";s:3:"苯";s:2:"";s:3:"苰";s:2:"y";s:3:"英";s:2:"Ӣ";s:3:"苲";s:2:"z";s:3:"苳";s:2:"{";s:3:"苴";s:2:"";s:3:"苵";s:2:"|";s:3:"苶";s:2:"}";s:3:"苷";s:2:"";s:3:"苸";s:2:"~";s:3:"苹";s:2:"ƻ";s:3:"苺";s:2:"ƀ";s:3:"苻";s:2:"";s:3:"苼";s:2:"Ɓ";s:3:"苽";s:2:"Ƃ";s:3:"苾";s:2:"ƃ";s:3:"苿";s:2:"Ƅ";s:3:"茀";s:2:"ƅ";s:3:"茁";s:2:"";s:3:"茂";s:2:"ï";s:3:"范";s:2:"";s:3:"茄";s:2:"";s:3:"茅";s:2:"é";s:3:"茆";s:2:"";s:3:"茇";s:2:"";s:3:"茈";s:2:"";s:3:"茉";s:2:"";s:3:"茊";s:2:"Ɔ";s:3:"茋";s:2:"Ƈ";s:3:"茌";s:2:"";s:3:"茍";s:2:"ƈ";s:3:"茎";s:2:"";s:3:"茏";s:2:"";s:3:"茐";s:2:"Ɖ";s:3:"茑";s:2:"";s:3:"茒";s:2:"Ɗ";s:3:"茓";s:2:"Ƌ";s:3:"茔";s:2:"";s:3:"茕";s:2:"";s:3:"茖";s:2:"ƌ";s:3:"茗";s:2:"";s:3:"茘";s:2:"ƍ";s:3:"茙";s:2:"Ǝ";s:3:"茚";s:2:"";s:3:"茛";s:2:"ݢ";s:3:"茜";s:2:"";s:3:"茝";s:2:"Ə";s:3:"茞";s:2:"Ɛ";s:3:"茟";s:2:"Ƒ";s:3:"茠";s:2:"ƒ";s:3:"茡";s:2:"Ɠ";s:3:"茢";s:2:"Ɣ";s:3:"茣";s:2:"ƕ";s:3:"茤";s:2:"Ɩ";s:3:"茥";s:2:"Ɨ";s:3:"茦";s:2:"Ƙ";s:3:"茧";s:2:"";s:3:"茨";s:2:"";s:3:"茩";s:2:"ƙ";s:3:"茪";s:2:"ƚ";s:3:"茫";s:2:"ã";s:3:"茬";s:2:"";s:3:"茭";s:2:"";s:3:"茮";s:2:"ƛ";s:3:"茯";s:2:"";s:3:"茰";s:2:"Ɯ";s:3:"茱";s:2:"";s:3:"茲";s:2:"Ɲ";s:3:"茳";s:2:"";s:3:"茴";s:2:"";s:3:"茵";s:2:"";s:3:"茶";s:2:"";s:3:"茷";s:2:"ƞ";s:3:"茸";s:2:"";s:3:"茹";s:2:"";s:3:"茺";s:2:"";s:3:"茻";s:2:"Ɵ";s:3:"茼";s:2:"";s:3:"茽";s:2:"Ơ";s:3:"茾";s:2:"@";s:3:"茿";s:2:"A";s:3:"荀";s:2:"";s:3:"荁";s:2:"B";s:3:"荂";s:2:"C";s:3:"荃";s:2:"";s:3:"荄";s:2:"D";s:3:"荅";s:2:"E";s:3:"荆";s:2:"";s:3:"荇";s:2:"";s:3:"荈";s:2:"F";s:3:"草";s:2:"";s:3:"荊";s:2:"G";s:3:"荋";s:2:"H";s:3:"荌";s:2:"I";s:3:"荍";s:2:"J";s:3:"荎";s:2:"K";s:3:"荏";s:2:"";s:3:"荐";s:2:"";s:3:"荑";s:2:"";s:3:"荒";s:2:"";s:3:"荓";s:2:"L";s:3:"荔";s:2:"";s:3:"荕";s:2:"M";s:3:"荖";s:2:"N";s:3:"荗";s:2:"O";s:3:"荘";s:2:"P";s:3:"荙";s:2:"Q";s:3:"荚";s:2:"";s:3:"荛";s:2:"";s:3:"荜";s:2:"";s:3:"荝";s:2:"R";s:3:"荞";s:2:"";s:3:"荟";s:2:"";s:3:"荠";s:2:"";s:3:"荡";s:2:"";s:3:"荢";s:2:"S";s:3:"荣";s:2:"";s:3:"荤";s:2:"";s:3:"荥";s:2:"";s:3:"荦";s:2:"";s:3:"荧";s:2:"ӫ";s:3:"荨";s:2:"ݡ";s:3:"荩";s:2:"ݣ";s:3:"荪";s:2:"ݥ";s:3:"荫";s:2:"";s:3:"荬";s:2:"ݤ";s:3:"荭";s:2:"ݦ";s:3:"荮";s:2:"ݧ";s:3:"药";s:2:"ҩ";s:3:"荰";s:2:"T";s:3:"荱";s:2:"U";s:3:"荲";s:2:"V";s:3:"荳";s:2:"W";s:3:"荴";s:2:"X";s:3:"荵";s:2:"Y";s:3:"荶";s:2:"Z";s:3:"荷";s:2:"";s:3:"荸";s:2:"ݩ";s:3:"荹";s:2:"[";s:3:"荺";s:2:"\";s:3:"荻";s:2:"ݶ";s:3:"荼";s:2:"ݱ";s:3:"荽";s:2:"ݴ";s:3:"荾";s:2:"]";s:3:"荿";s:2:"^";s:3:"莀";s:2:"_";s:3:"莁";s:2:"`";s:3:"莂";s:2:"a";s:3:"莃";s:2:"b";s:3:"莄";s:2:"c";s:3:"莅";s:2:"ݰ";s:3:"莆";s:2:"";s:3:"莇";s:2:"d";s:3:"莈";s:2:"e";s:3:"莉";s:2:"";s:3:"莊";s:2:"f";s:3:"莋";s:2:"g";s:3:"莌";s:2:"h";s:3:"莍";s:2:"i";s:3:"莎";s:2:"ɯ";s:3:"莏";s:2:"j";s:3:"莐";s:2:"k";s:3:"莑";s:2:"l";s:3:"莒";s:2:"";s:3:"莓";s:2:"ݮ";s:3:"莔";s:2:"m";s:3:"莕";s:2:"n";s:3:"莖";s:2:"o";s:3:"莗";s:2:"p";s:3:"莘";s:2:"ݷ";s:3:"莙";s:2:"q";s:3:"莚";s:2:"r";s:3:"莛";s:2:"";s:3:"莜";s:2:"ݯ";s:3:"莝";s:2:"s";s:3:"莞";s:2:"ݸ";s:3:"莟";s:2:"t";s:3:"莠";s:2:"ݬ";s:3:"莡";s:2:"u";s:3:"莢";s:2:"v";s:3:"莣";s:2:"w";s:3:"莤";s:2:"x";s:3:"莥";s:2:"y";s:3:"莦";s:2:"z";s:3:"莧";s:2:"{";s:3:"莨";s:2:"ݹ";s:3:"莩";s:2:"ݳ";s:3:"莪";s:2:"ݭ";s:3:"莫";s:2:"Ī";s:3:"莬";s:2:"|";s:3:"莭";s:2:"}";s:3:"莮";s:2:"~";s:3:"莯";s:2:"ǀ";s:3:"莰";s:2:"ݨ";s:3:"莱";s:2:"";s:3:"莲";s:2:"";s:3:"莳";s:2:"ݪ";s:3:"莴";s:2:"ݫ";s:3:"莵";s:2:"ǁ";s:3:"莶";s:2:"ݲ";s:3:"获";s:2:"";s:3:"莸";s:2:"ݵ";s:3:"莹";s:2:"Ө";s:3:"莺";s:2:"ݺ";s:3:"莻";s:2:"ǂ";s:3:"莼";s:2:"ݻ";s:3:"莽";s:2:"ç";s:3:"莾";s:2:"ǃ";s:3:"莿";s:2:"Ǆ";s:3:"菀";s:2:"";s:3:"菁";s:2:"ݼ";s:3:"菂";s:2:"ǅ";s:3:"菃";s:2:"ǆ";s:3:"菄";s:2:"Ǉ";s:3:"菅";s:2:"";s:3:"菆";s:2:"ǈ";s:3:"菇";s:2:"";s:3:"菈";s:2:"ǉ";s:3:"菉";s:2:"Ǌ";s:3:"菊";s:2:"";s:3:"菋";s:2:"ǋ";s:3:"菌";s:2:"";s:3:"菍";s:2:"ǌ";s:3:"菎";s:2:"Ǎ";s:3:"菏";s:2:"";s:3:"菐";s:2:"ǎ";s:3:"菑";s:2:"Ǐ";s:3:"菒";s:2:"ǐ";s:3:"菓";s:2:"Ǒ";s:3:"菔";s:2:"";s:3:"菕";s:2:"ǒ";s:3:"菖";s:2:"";s:3:"菗";s:2:"Ǔ";s:3:"菘";s:2:"ݿ";s:3:"菙";s:2:"ǔ";s:3:"菚";s:2:"Ǖ";s:3:"菛";s:2:"ǖ";s:3:"菜";s:2:"";s:3:"菝";s:2:"";s:3:"菞";s:2:"Ǘ";s:3:"菟";s:2:"";s:3:"菠";s:2:"";s:3:"菡";s:2:"";s:3:"菢";s:2:"ǘ";s:3:"菣";s:2:"Ǚ";s:3:"菤";s:2:"ǚ";s:3:"菥";s:2:"ݾ";s:3:"菦";s:2:"Ǜ";s:3:"菧";s:2:"ǜ";s:3:"菨";s:2:"ǝ";s:3:"菩";s:2:"";s:3:"菪";s:2:"";s:3:"菫";s:2:"Ǟ";s:3:"菬";s:2:"ǟ";s:3:"菭";s:2:"Ǡ";s:3:"菮";s:2:"@";s:3:"華";s:2:"A";s:3:"菰";s:2:"";s:3:"菱";s:2:"";s:3:"菲";s:2:"";s:3:"菳";s:2:"B";s:3:"菴";s:2:"C";s:3:"菵";s:2:"D";s:3:"菶";s:2:"E";s:3:"菷";s:2:"F";s:3:"菸";s:2:"";s:3:"菹";s:2:"";s:3:"菺";s:2:"G";s:3:"菻";s:2:"H";s:3:"菼";s:2:"I";s:3:"菽";s:2:"";s:3:"菾";s:2:"J";s:3:"菿";s:2:"K";s:3:"萀";s:2:"L";s:3:"萁";s:2:"ݽ";s:3:"萂";s:2:"M";s:3:"萃";s:2:"";s:3:"萄";s:2:"";s:3:"萅";s:2:"N";s:3:"萆";s:2:"";s:3:"萇";s:2:"O";s:3:"萈";s:2:"P";s:3:"萉";s:2:"Q";s:3:"萊";s:2:"R";s:3:"萋";s:2:"";s:3:"萌";s:2:"";s:3:"萍";s:2:"Ƽ";s:3:"萎";s:2:"ή";s:3:"萏";s:2:"";s:3:"萐";s:2:"S";s:3:"萑";s:2:"";s:3:"萒";s:2:"T";s:3:"萓";s:2:"U";s:3:"萔";s:2:"V";s:3:"萕";s:2:"W";s:3:"萖";s:2:"X";s:3:"萗";s:2:"Y";s:3:"萘";s:2:"";s:3:"萙";s:2:"Z";s:3:"萚";s:2:"[";s:3:"萛";s:2:"\";s:3:"萜";s:2:"";s:3:"萝";s:2:"";s:3:"萞";s:2:"]";s:3:"萟";s:2:"^";s:3:"萠";s:2:"_";s:3:"萡";s:2:"`";s:3:"萢";s:2:"a";s:3:"萣";s:2:"b";s:3:"萤";s:2:"ө";s:3:"营";s:2:"Ӫ";s:3:"萦";s:2:"";s:3:"萧";s:2:"";s:3:"萨";s:2:"";s:3:"萩";s:2:"c";s:3:"萪";s:2:"d";s:3:"萫";s:2:"e";s:3:"萬";s:2:"f";s:3:"萭";s:2:"g";s:3:"萮";s:2:"h";s:3:"萯";s:2:"i";s:3:"萰";s:2:"j";s:3:"萱";s:2:"";s:3:"萲";s:2:"k";s:3:"萳";s:2:"l";s:3:"萴";s:2:"m";s:3:"萵";s:2:"n";s:3:"萶";s:2:"o";s:3:"萷";s:2:"p";s:3:"萸";s:2:"";s:3:"萹";s:2:"q";s:3:"萺";s:2:"r";s:3:"萻";s:2:"s";s:3:"萼";s:2:"";s:3:"落";s:2:"";s:3:"萾";s:2:"t";s:3:"萿";s:2:"u";s:3:"葀";s:2:"v";s:3:"葁";s:2:"w";s:3:"葂";s:2:"x";s:3:"葃";s:2:"y";s:3:"葄";s:2:"z";s:3:"葅";s:2:"{";s:3:"葆";s:2:"";s:3:"葇";s:2:"|";s:3:"葈";s:2:"}";s:3:"葉";s:2:"~";s:3:"葊";s:2:"Ȁ";s:3:"葋";s:2:"ȁ";s:3:"葌";s:2:"Ȃ";s:3:"葍";s:2:"ȃ";s:3:"葎";s:2:"Ȅ";s:3:"葏";s:2:"ȅ";s:3:"葐";s:2:"Ȇ";s:3:"葑";s:2:"";s:3:"葒";s:2:"ȇ";s:3:"葓";s:2:"Ȉ";s:3:"葔";s:2:"ȉ";s:3:"葕";s:2:"Ȋ";s:3:"葖";s:2:"ȋ";s:3:"著";s:2:"";s:3:"葘";s:2:"Ȍ";s:3:"葙";s:2:"";s:3:"葚";s:2:"";s:3:"葛";s:2:"";s:3:"葜";s:2:"";s:3:"葝";s:2:"ȍ";s:3:"葞";s:2:"Ȏ";s:3:"葟";s:2:"ȏ";s:3:"葠";s:2:"Ȑ";s:3:"葡";s:2:"";s:3:"葢";s:2:"ȑ";s:3:"董";s:2:"";s:3:"葤";s:2:"Ȓ";s:3:"葥";s:2:"ȓ";s:3:"葦";s:2:"Ȕ";s:3:"葧";s:2:"ȕ";s:3:"葨";s:2:"Ȗ";s:3:"葩";s:2:"";s:3:"葪";s:2:"ȗ";s:3:"葫";s:2:"";s:3:"葬";s:2:"";s:3:"葭";s:2:"";s:3:"葮";s:2:"Ș";s:3:"葯";s:2:"ș";s:3:"葰";s:2:"Ț";s:3:"葱";s:2:"";s:3:"葲";s:2:"ț";s:3:"葳";s:2:"";s:3:"葴";s:2:"Ȝ";s:3:"葵";s:2:"";s:3:"葶";s:2:"";s:3:"葷";s:2:"ȝ";s:3:"葸";s:2:"";s:3:"葹";s:2:"Ȟ";s:3:"葺";s:2:"";s:3:"葻";s:2:"ȟ";s:3:"葼";s:2:"Ƞ";s:3:"葽";s:2:"@";s:3:"葾";s:2:"A";s:3:"葿";s:2:"B";s:3:"蒀";s:2:"C";s:3:"蒁";s:2:"D";s:3:"蒂";s:2:"";s:3:"蒃";s:2:"E";s:3:"蒄";s:2:"F";s:3:"蒅";s:2:"G";s:3:"蒆";s:2:"H";s:3:"蒇";s:2:"";s:3:"蒈";s:2:"";s:3:"蒉";s:2:"";s:3:"蒊";s:2:"I";s:3:"蒋";s:2:"";s:3:"蒌";s:2:"";s:3:"蒍";s:2:"J";s:3:"蒎";s:2:"";s:3:"蒏";s:2:"K";s:3:"蒐";s:2:"L";s:3:"蒑";s:2:"M";s:3:"蒒";s:2:"N";s:3:"蒓";s:2:"O";s:3:"蒔";s:2:"P";s:3:"蒕";s:2:"Q";s:3:"蒖";s:2:"R";s:3:"蒗";s:2:"";s:3:"蒘";s:2:"S";s:3:"蒙";s:2:"";s:3:"蒚";s:2:"T";s:3:"蒛";s:2:"U";s:3:"蒜";s:2:"";s:3:"蒝";s:2:"V";s:3:"蒞";s:2:"W";s:3:"蒟";s:2:"X";s:3:"蒠";s:2:"Y";s:3:"蒡";s:2:"";s:3:"蒢";s:2:"Z";s:3:"蒣";s:2:"[";s:3:"蒤";s:2:"\";s:3:"蒥";s:2:"]";s:3:"蒦";s:2:"^";s:3:"蒧";s:2:"_";s:3:"蒨";s:2:"`";s:3:"蒩";s:2:"a";s:3:"蒪";s:2:"b";s:3:"蒫";s:2:"c";s:3:"蒬";s:2:"d";s:3:"蒭";s:2:"e";s:3:"蒮";s:2:"f";s:3:"蒯";s:2:"";s:3:"蒰";s:2:"g";s:3:"蒱";s:2:"h";s:3:"蒲";s:2:"";s:3:"蒳";s:2:"i";s:3:"蒴";s:2:"";s:3:"蒵";s:2:"j";s:3:"蒶";s:2:"k";s:3:"蒷";s:2:"l";s:3:"蒸";s:2:"";s:3:"蒹";s:2:"";s:3:"蒺";s:2:"";s:3:"蒻";s:2:"m";s:3:"蒼";s:2:"n";s:3:"蒽";s:2:"";s:3:"蒾";s:2:"o";s:3:"蒿";s:2:"";s:3:"蓀";s:2:"p";s:3:"蓁";s:2:"";s:3:"蓂";s:2:"q";s:3:"蓃";s:2:"r";s:3:"蓄";s:2:"";s:3:"蓅";s:2:"s";s:3:"蓆";s:2:"t";s:3:"蓇";s:2:"u";s:3:"蓈";s:2:"v";s:3:"蓉";s:2:"";s:3:"蓊";s:2:"";s:3:"蓋";s:2:"w";s:3:"蓌";s:2:"x";s:3:"蓍";s:2:"";s:3:"蓎";s:2:"y";s:3:"蓏";s:2:"z";s:3:"蓐";s:2:"";s:3:"蓑";s:2:"";s:3:"蓒";s:2:"{";s:3:"蓓";s:2:"";s:3:"蓔";s:2:"|";s:3:"蓕";s:2:"}";s:3:"蓖";s:2:"";s:3:"蓗";s:2:"~";s:3:"蓘";s:2:"ɀ";s:3:"蓙";s:2:"Ɂ";s:3:"蓚";s:2:"ɂ";s:3:"蓛";s:2:"Ƀ";s:3:"蓜";s:2:"Ʉ";s:3:"蓝";s:2:"";s:3:"蓞";s:2:"Ʌ";s:3:"蓟";s:2:"";s:3:"蓠";s:2:"";s:3:"蓡";s:2:"Ɇ";s:3:"蓢";s:2:"ɇ";s:3:"蓣";s:2:"";s:3:"蓤";s:2:"Ɉ";s:3:"蓥";s:2:"";s:3:"蓦";s:2:"";s:3:"蓧";s:2:"ɉ";s:3:"蓨";s:2:"Ɋ";s:3:"蓩";s:2:"ɋ";s:3:"蓪";s:2:"Ɍ";s:3:"蓫";s:2:"ɍ";s:3:"蓬";s:2:"";s:3:"蓭";s:2:"Ɏ";s:3:"蓮";s:2:"ɏ";s:3:"蓯";s:2:"ɐ";s:3:"蓰";s:2:"";s:3:"蓱";s:2:"ɑ";s:3:"蓲";s:2:"ɒ";s:3:"蓳";s:2:"ɓ";s:3:"蓴";s:2:"ɔ";s:3:"蓵";s:2:"ɕ";s:3:"蓶";s:2:"ɖ";s:3:"蓷";s:2:"ɗ";s:3:"蓸";s:2:"ɘ";s:3:"蓹";s:2:"ə";s:3:"蓺";s:2:"ɚ";s:3:"蓻";s:2:"ɛ";s:3:"蓼";s:2:"ޤ";s:3:"蓽";s:2:"ɜ";s:3:"蓾";s:2:"ɝ";s:3:"蓿";s:2:"ޣ";s:3:"蔀";s:2:"ɞ";s:3:"蔁";s:2:"ɟ";s:3:"蔂";s:2:"ɠ";s:3:"蔃";s:2:"@";s:3:"蔄";s:2:"A";s:3:"蔅";s:2:"B";s:3:"蔆";s:2:"C";s:3:"蔇";s:2:"D";s:3:"蔈";s:2:"E";s:3:"蔉";s:2:"F";s:3:"蔊";s:2:"G";s:3:"蔋";s:2:"H";s:3:"蔌";s:2:"";s:3:"蔍";s:2:"I";s:3:"蔎";s:2:"J";s:3:"蔏";s:2:"K";s:3:"蔐";s:2:"L";s:3:"蔑";s:2:"";s:3:"蔒";s:2:"M";s:3:"蔓";s:2:"";s:3:"蔔";s:2:"N";s:3:"蔕";s:2:"O";s:3:"蔖";s:2:"P";s:3:"蔗";s:2:"";s:3:"蔘";s:2:"Q";s:3:"蔙";s:2:"R";s:3:"蔚";s:2:"ε";s:3:"蔛";s:2:"S";s:3:"蔜";s:2:"T";s:3:"蔝";s:2:"U";s:3:"蔞";s:2:"V";s:3:"蔟";s:2:"";s:3:"蔠";s:2:"W";s:3:"蔡";s:2:"";s:3:"蔢";s:2:"X";s:3:"蔣";s:2:"Y";s:3:"蔤";s:2:"Z";s:3:"蔥";s:2:"[";s:3:"蔦";s:2:"\";s:3:"蔧";s:2:"]";s:3:"蔨";s:2:"^";s:3:"蔩";s:2:"_";s:3:"蔪";s:2:"`";s:3:"蔫";s:2:"";s:3:"蔬";s:2:"";s:3:"蔭";s:2:"a";s:3:"蔮";s:2:"b";s:3:"蔯";s:2:"c";s:3:"蔰";s:2:"d";s:3:"蔱";s:2:"e";s:3:"蔲";s:2:"f";s:3:"蔳";s:2:"g";s:3:"蔴";s:2:"h";s:3:"蔵";s:2:"i";s:3:"蔶";s:2:"j";s:3:"蔷";s:2:"Ǿ";s:3:"蔸";s:2:"";s:3:"蔹";s:2:"";s:3:"蔺";s:2:"";s:3:"蔻";s:2:"ޢ";s:3:"蔼";s:2:"";s:3:"蔽";s:2:"";s:3:"蔾";s:2:"k";s:3:"蔿";s:2:"l";s:3:"蕀";s:2:"m";s:3:"蕁";s:2:"n";s:3:"蕂";s:2:"o";s:3:"蕃";s:2:"ެ";s:3:"蕄";s:2:"p";s:3:"蕅";s:2:"q";s:3:"蕆";s:2:"r";s:3:"蕇";s:2:"s";s:3:"蕈";s:2:"ަ";s:3:"蕉";s:2:"";s:3:"蕊";s:2:"";s:3:"蕋";s:2:"t";s:3:"蕌";s:2:"u";s:3:"蕍";s:2:"v";s:3:"蕎";s:2:"w";s:3:"蕏";s:2:"x";s:3:"蕐";s:2:"y";s:3:"蕑";s:2:"z";s:3:"蕒";s:2:"{";s:3:"蕓";s:2:"|";s:3:"蕔";s:2:"}";s:3:"蕕";s:2:"~";s:3:"蕖";s:2:"ޡ";s:3:"蕗";s:2:"ʀ";s:3:"蕘";s:2:"ʁ";s:3:"蕙";s:2:"ޥ";s:3:"蕚";s:2:"ʂ";s:3:"蕛";s:2:"ʃ";s:3:"蕜";s:2:"ʄ";s:3:"蕝";s:2:"ʅ";s:3:"蕞";s:2:"ީ";s:3:"蕟";s:2:"ʆ";s:3:"蕠";s:2:"ʇ";s:3:"蕡";s:2:"ʈ";s:3:"蕢";s:2:"ʉ";s:3:"蕣";s:2:"ʊ";s:3:"蕤";s:2:"ި";s:3:"蕥";s:2:"ʋ";s:3:"蕦";s:2:"ʌ";s:3:"蕧";s:2:"ʍ";s:3:"蕨";s:2:"ާ";s:3:"蕩";s:2:"ʎ";s:3:"蕪";s:2:"ʏ";s:3:"蕫";s:2:"ʐ";s:3:"蕬";s:2:"ʑ";s:3:"蕭";s:2:"ʒ";s:3:"蕮";s:2:"ʓ";s:3:"蕯";s:2:"ʔ";s:3:"蕰";s:2:"ʕ";s:3:"蕱";s:2:"ʖ";s:3:"蕲";s:2:"ޭ";s:3:"蕳";s:2:"ʗ";s:3:"蕴";s:2:"";s:3:"蕵";s:2:"ʘ";s:3:"蕶";s:2:"ʙ";s:3:"蕷";s:2:"ʚ";s:3:"蕸";s:2:"ʛ";s:3:"蕹";s:2:"޳";s:3:"蕺";s:2:"ު";s:3:"蕻";s:2:"ޮ";s:3:"蕼";s:2:"ʜ";s:3:"蕽";s:2:"ʝ";s:3:"蕾";s:2:"";s:3:"蕿";s:2:"ʞ";s:3:"薀";s:2:"ʟ";s:3:"薁";s:2:"ʠ";s:3:"薂";s:2:"@";s:3:"薃";s:2:"A";s:3:"薄";s:2:"";s:3:"薅";s:2:"޶";s:3:"薆";s:2:"B";s:3:"薇";s:2:"ޱ";s:3:"薈";s:2:"C";s:3:"薉";s:2:"D";s:3:"薊";s:2:"E";s:3:"薋";s:2:"F";s:3:"薌";s:2:"G";s:3:"薍";s:2:"H";s:3:"薎";s:2:"I";s:3:"薏";s:2:"޲";s:3:"薐";s:2:"J";s:3:"薑";s:2:"K";s:3:"薒";s:2:"L";s:3:"薓";s:2:"M";s:3:"薔";s:2:"N";s:3:"薕";s:2:"O";s:3:"薖";s:2:"P";s:3:"薗";s:2:"Q";s:3:"薘";s:2:"R";s:3:"薙";s:2:"S";s:3:"薚";s:2:"T";s:3:"薛";s:2:"Ѧ";s:3:"薜";s:2:"޵";s:3:"薝";s:2:"U";s:3:"薞";s:2:"V";s:3:"薟";s:2:"W";s:3:"薠";s:2:"X";s:3:"薡";s:2:"Y";s:3:"薢";s:2:"Z";s:3:"薣";s:2:"[";s:3:"薤";s:2:"ޯ";s:3:"薥";s:2:"\";s:3:"薦";s:2:"]";s:3:"薧";s:2:"^";s:3:"薨";s:2:"ް";s:3:"薩";s:2:"_";s:3:"薪";s:2:"н";s:3:"薫";s:2:"`";s:3:"薬";s:2:"a";s:3:"薭";s:2:"b";s:3:"薮";s:2:"޴";s:3:"薯";s:2:"";s:3:"薰";s:2:"޹";s:3:"薱";s:2:"c";s:3:"薲";s:2:"d";s:3:"薳";s:2:"e";s:3:"薴";s:2:"f";s:3:"薵";s:2:"g";s:3:"薶";s:2:"h";s:3:"薷";s:2:"޸";s:3:"薸";s:2:"i";s:3:"薹";s:2:"޷";s:3:"薺";s:2:"j";s:3:"薻";s:2:"k";s:3:"薼";s:2:"l";s:3:"薽";s:2:"m";s:3:"薾";s:2:"n";s:3:"薿";s:2:"o";s:3:"藀";s:2:"p";s:3:"藁";s:2:"޻";s:3:"藂";s:2:"q";s:3:"藃";s:2:"r";s:3:"藄";s:2:"s";s:3:"藅";s:2:"t";s:3:"藆";s:2:"u";s:3:"藇";s:2:"v";s:3:"藈";s:2:"w";s:3:"藉";s:2:"";s:3:"藊";s:2:"x";s:3:"藋";s:2:"y";s:3:"藌";s:2:"z";s:3:"藍";s:2:"{";s:3:"藎";s:2:"|";s:3:"藏";s:2:"";s:3:"藐";s:2:"";s:3:"藑";s:2:"}";s:3:"藒";s:2:"~";s:3:"藓";s:2:"޺";s:3:"藔";s:2:"ˀ";s:3:"藕";s:2:"ź";s:3:"藖";s:2:"ˁ";s:3:"藗";s:2:"˂";s:3:"藘";s:2:"˃";s:3:"藙";s:2:"˄";s:3:"藚";s:2:"˅";s:3:"藛";s:2:"ˆ";s:3:"藜";s:2:"޼";s:3:"藝";s:2:"ˇ";s:3:"藞";s:2:"ˈ";s:3:"藟";s:2:"ˉ";s:3:"藠";s:2:"ˊ";s:3:"藡";s:2:"ˋ";s:3:"藢";s:2:"ˌ";s:3:"藣";s:2:"ˍ";s:3:"藤";s:2:"";s:3:"藥";s:2:"ˎ";s:3:"藦";s:2:"ˏ";s:3:"藧";s:2:"ː";s:3:"藨";s:2:"ˑ";s:3:"藩";s:2:"";s:3:"藪";s:2:"˒";s:3:"藫";s:2:"˓";s:3:"藬";s:2:"˔";s:3:"藭";s:2:"˕";s:3:"藮";s:2:"˖";s:3:"藯";s:2:"˗";s:3:"藰";s:2:"˘";s:3:"藱";s:2:"˙";s:3:"藲";s:2:"˚";s:3:"藳";s:2:"˛";s:3:"藴";s:2:"˜";s:3:"藵";s:2:"˝";s:3:"藶";s:2:"˞";s:3:"藷";s:2:"˟";s:3:"藸";s:2:"ˠ";s:3:"藹";s:2:"@";s:3:"藺";s:2:"A";s:3:"藻";s:2:"";s:3:"藼";s:2:"B";s:3:"藽";s:2:"C";s:3:"藾";s:2:"D";s:3:"藿";s:2:"޽";s:3:"蘀";s:2:"E";s:3:"蘁";s:2:"F";s:3:"蘂";s:2:"G";s:3:"蘃";s:2:"H";s:3:"蘄";s:2:"I";s:3:"蘅";s:2:"޿";s:3:"蘆";s:2:"J";s:3:"蘇";s:2:"K";s:3:"蘈";s:2:"L";s:3:"蘉";s:2:"M";s:3:"蘊";s:2:"N";s:3:"蘋";s:2:"O";s:3:"蘌";s:2:"P";s:3:"蘍";s:2:"Q";s:3:"蘎";s:2:"R";s:3:"蘏";s:2:"S";s:3:"蘐";s:2:"T";s:3:"蘑";s:2:"Ģ";s:3:"蘒";s:2:"U";s:3:"蘓";s:2:"V";s:3:"蘔";s:2:"W";s:3:"蘕";s:2:"X";s:3:"蘖";s:2:"";s:3:"蘗";s:2:"Y";s:3:"蘘";s:2:"Z";s:3:"蘙";s:2:"[";s:3:"蘚";s:2:"\";s:3:"蘛";s:2:"]";s:3:"蘜";s:2:"^";s:3:"蘝";s:2:"_";s:3:"蘞";s:2:"`";s:3:"蘟";s:2:"a";s:3:"蘠";s:2:"b";s:3:"蘡";s:2:"c";s:3:"蘢";s:2:"d";s:3:"蘣";s:2:"e";s:3:"蘤";s:2:"f";s:3:"蘥";s:2:"g";s:3:"蘦";s:2:"h";s:3:"蘧";s:2:"޾";s:3:"蘨";s:2:"i";s:3:"蘩";s:2:"";s:3:"蘪";s:2:"j";s:3:"蘫";s:2:"k";s:3:"蘬";s:2:"l";s:3:"蘭";s:2:"m";s:3:"蘮";s:2:"n";s:3:"蘯";s:2:"o";s:3:"蘰";s:2:"p";s:3:"蘱";s:2:"q";s:3:"蘲";s:2:"r";s:3:"蘳";s:2:"s";s:3:"蘴";s:2:"t";s:3:"蘵";s:2:"u";s:3:"蘶";s:2:"v";s:3:"蘷";s:2:"w";s:3:"蘸";s:2:"պ";s:3:"蘹";s:2:"x";s:3:"蘺";s:2:"y";s:3:"蘻";s:2:"z";s:3:"蘼";s:2:"";s:3:"蘽";s:2:"{";s:3:"蘾";s:2:"|";s:3:"蘿";s:2:"}";s:3:"虀";s:2:"~";s:3:"虁";s:2:"̀";s:3:"虂";s:2:"́";s:3:"虃";s:2:"̂";s:3:"虄";s:2:"̃";s:3:"虅";s:2:"̄";s:3:"虆";s:2:"̅";s:3:"虇";s:2:"̆";s:3:"虈";s:2:"̇";s:3:"虉";s:2:"̈";s:3:"虊";s:2:"̉";s:3:"虋";s:2:"̊";s:3:"虌";s:2:"̋";s:3:"虍";s:2:"";s:3:"虎";s:2:"";s:3:"虏";s:2:"²";s:3:"虐";s:2:"Ű";s:3:"虑";s:2:"";s:3:"虒";s:2:"̌";s:3:"虓";s:2:"̍";s:3:"虔";s:2:"";s:3:"處";s:2:"̎";s:3:"虖";s:2:"̏";s:3:"虗";s:2:"̐";s:3:"虘";s:2:"̑";s:3:"虙";s:2:"̒";s:3:"虚";s:2:"";s:3:"虛";s:2:"̓";s:3:"虜";s:2:"̔";s:3:"虝";s:2:"̕";s:3:"虞";s:2:"";s:3:"號";s:2:"̖";s:3:"虠";s:2:"̗";s:3:"虡";s:2:"̘";s:3:"虢";s:2:"";s:3:"虣";s:2:"̙";s:3:"虤";s:2:"̚";s:3:"虥";s:2:"̛";s:3:"虦";s:2:"̜";s:3:"虧";s:2:"̝";s:3:"虨";s:2:"̞";s:3:"虩";s:2:"̟";s:3:"虪";s:2:"̠";s:3:"虫";s:2:"";s:3:"虬";s:2:"";s:3:"虭";s:2:"@";s:3:"虮";s:2:"";s:3:"虯";s:2:"A";s:3:"虰";s:2:"B";s:3:"虱";s:2:"ʭ";s:3:"虲";s:2:"C";s:3:"虳";s:2:"D";s:3:"虴";s:2:"E";s:3:"虵";s:2:"F";s:3:"虶";s:2:"G";s:3:"虷";s:2:"H";s:3:"虸";s:2:"I";s:3:"虹";s:2:"";s:3:"虺";s:2:"";s:3:"虻";s:2:"";s:3:"虼";s:2:"";s:3:"虽";s:2:"";s:3:"虾";s:2:"Ϻ";s:3:"虿";s:2:"";s:3:"蚀";s:2:"ʴ";s:3:"蚁";s:2:"";s:3:"蚂";s:2:"";s:3:"蚃";s:2:"J";s:3:"蚄";s:2:"K";s:3:"蚅";s:2:"L";s:3:"蚆";s:2:"M";s:3:"蚇";s:2:"N";s:3:"蚈";s:2:"O";s:3:"蚉";s:2:"P";s:3:"蚊";s:2:"";s:3:"蚋";s:2:"";s:3:"蚌";s:2:"";s:3:"蚍";s:2:"";s:3:"蚎";s:2:"Q";s:3:"蚏";s:2:"R";s:3:"蚐";s:2:"S";s:3:"蚑";s:2:"T";s:3:"蚒";s:2:"U";s:3:"蚓";s:2:"";s:3:"蚔";s:2:"V";s:3:"蚕";s:2:"";s:3:"蚖";s:2:"W";s:3:"蚗";s:2:"X";s:3:"蚘";s:2:"Y";s:3:"蚙";s:2:"Z";s:3:"蚚";s:2:"[";s:3:"蚛";s:2:"\";s:3:"蚜";s:2:"";s:3:"蚝";s:2:"";s:3:"蚞";s:2:"]";s:3:"蚟";s:2:"^";s:3:"蚠";s:2:"_";s:3:"蚡";s:2:"`";s:3:"蚢";s:2:"a";s:3:"蚣";s:2:"";s:3:"蚤";s:2:"";s:3:"蚥";s:2:"b";s:3:"蚦";s:2:"c";s:3:"蚧";s:2:"";s:3:"蚨";s:2:"";s:3:"蚩";s:2:"";s:3:"蚪";s:2:"";s:3:"蚫";s:2:"d";s:3:"蚬";s:2:"";s:3:"蚭";s:2:"e";s:3:"蚮";s:2:"f";s:3:"蚯";s:2:"";s:3:"蚰";s:2:"";s:3:"蚱";s:2:"";s:3:"蚲";s:2:"g";s:3:"蚳";s:2:"h";s:3:"蚴";s:2:"";s:3:"蚵";s:2:"";s:3:"蚶";s:2:"";s:3:"蚷";s:2:"i";s:3:"蚸";s:2:"j";s:3:"蚹";s:2:"k";s:3:"蚺";s:2:"";s:3:"蚻";s:2:"l";s:3:"蚼";s:2:"m";s:3:"蚽";s:2:"n";s:3:"蚾";s:2:"o";s:3:"蚿";s:2:"p";s:3:"蛀";s:2:"";s:3:"蛁";s:2:"q";s:3:"蛂";s:2:"r";s:3:"蛃";s:2:"s";s:3:"蛄";s:2:"";s:3:"蛅";s:2:"t";s:3:"蛆";s:2:"";s:3:"蛇";s:2:"";s:3:"蛈";s:2:"u";s:3:"蛉";s:2:"";s:3:"蛊";s:2:"";s:3:"蛋";s:2:"";s:3:"蛌";s:2:"v";s:3:"蛍";s:2:"w";s:3:"蛎";s:2:"";s:3:"蛏";s:2:"";s:3:"蛐";s:2:"";s:3:"蛑";s:2:"";s:3:"蛒";s:2:"x";s:3:"蛓";s:2:"y";s:3:"蛔";s:2:"";s:3:"蛕";s:2:"z";s:3:"蛖";s:2:"{";s:3:"蛗";s:2:"|";s:3:"蛘";s:2:"";s:3:"蛙";s:2:"";s:3:"蛚";s:2:"}";s:3:"蛛";s:2:"";s:3:"蛜";s:2:"~";s:3:"蛝";s:2:"̀";s:3:"蛞";s:2:"";s:3:"蛟";s:2:"";s:3:"蛠";s:2:"́";s:3:"蛡";s:2:"͂";s:3:"蛢";s:2:"̓";s:3:"蛣";s:2:"̈́";s:3:"蛤";s:2:"";s:3:"蛥";s:2:"ͅ";s:3:"蛦";s:2:"͆";s:3:"蛧";s:2:"͇";s:3:"蛨";s:2:"͈";s:3:"蛩";s:2:"";s:3:"蛪";s:2:"͉";s:3:"蛫";s:2:"͊";s:3:"蛬";s:2:"͋";s:3:"蛭";s:2:"";s:3:"蛮";s:2:"";s:3:"蛯";s:2:"͌";s:3:"蛰";s:2:"";s:3:"蛱";s:2:"";s:3:"蛲";s:2:"";s:3:"蛳";s:2:"";s:3:"蛴";s:2:"";s:3:"蛵";s:2:"͍";s:3:"蛶";s:2:"͎";s:3:"蛷";s:2:"͏";s:3:"蛸";s:2:"";s:3:"蛹";s:2:"Ӽ";s:3:"蛺";s:2:"͐";s:3:"蛻";s:2:"͑";s:3:"蛼";s:2:"͒";s:3:"蛽";s:2:"͓";s:3:"蛾";s:2:"";s:3:"蛿";s:2:"͔";s:3:"蜀";s:2:"";s:3:"蜁";s:2:"͕";s:3:"蜂";s:2:"";s:3:"蜃";s:2:"";s:3:"蜄";s:2:"͖";s:3:"蜅";s:2:"͗";s:3:"蜆";s:2:"͘";s:3:"蜇";s:2:"";s:3:"蜈";s:2:"";s:3:"蜉";s:2:"";s:3:"蜊";s:2:"";s:3:"蜋";s:2:"͙";s:3:"蜌";s:2:"͚";s:3:"蜍";s:2:"";s:3:"蜎";s:2:"͛";s:3:"蜏";s:2:"͜";s:3:"蜐";s:2:"͝";s:3:"蜑";s:2:"͞";s:3:"蜒";s:2:"";s:3:"蜓";s:2:"";s:3:"蜔";s:2:"͟";s:3:"蜕";s:2:"";s:3:"蜖";s:2:"͠";s:3:"蜗";s:2:"";s:3:"蜘";s:2:"֩";s:3:"蜙";s:2:"@";s:3:"蜚";s:2:"";s:3:"蜛";s:2:"A";s:3:"蜜";s:2:"";s:3:"蜝";s:2:"B";s:3:"蜞";s:2:"";s:3:"蜟";s:2:"C";s:3:"蜠";s:2:"D";s:3:"蜡";s:2:"";s:3:"蜢";s:2:"";s:3:"蜣";s:2:"";s:3:"蜤";s:2:"E";s:3:"蜥";s:2:"";s:3:"蜦";s:2:"F";s:3:"蜧";s:2:"G";s:3:"蜨";s:2:"H";s:3:"蜩";s:2:"";s:3:"蜪";s:2:"I";s:3:"蜫";s:2:"J";s:3:"蜬";s:2:"K";s:3:"蜭";s:2:"L";s:3:"蜮";s:2:"";s:3:"蜯";s:2:"M";s:3:"蜰";s:2:"N";s:3:"蜱";s:2:"";s:3:"蜲";s:2:"O";s:3:"蜳";s:2:"P";s:3:"蜴";s:2:"";s:3:"蜵";s:2:"Q";s:3:"蜶";s:2:"R";s:3:"蜷";s:2:"";s:3:"蜸";s:2:"S";s:3:"蜹";s:2:"T";s:3:"蜺";s:2:"U";s:3:"蜻";s:2:"";s:3:"蜼";s:2:"V";s:3:"蜽";s:2:"W";s:3:"蜾";s:2:"";s:3:"蜿";s:2:"";s:3:"蝀";s:2:"X";s:3:"蝁";s:2:"Y";s:3:"蝂";s:2:"Z";s:3:"蝃";s:2:"[";s:3:"蝄";s:2:"\";s:3:"蝅";s:2:"]";s:3:"蝆";s:2:"^";s:3:"蝇";s:2:"Ӭ";s:3:"蝈";s:2:"";s:3:"蝉";s:2:"";s:3:"蝊";s:2:"_";s:3:"蝋";s:2:"`";s:3:"蝌";s:2:"";s:3:"蝍";s:2:"a";s:3:"蝎";s:2:"Ы";s:3:"蝏";s:2:"b";s:3:"蝐";s:2:"c";s:3:"蝑";s:2:"d";s:3:"蝒";s:2:"e";s:3:"蝓";s:2:"";s:3:"蝔";s:2:"f";s:3:"蝕";s:2:"g";s:3:"蝖";s:2:"h";s:3:"蝗";s:2:"";s:3:"蝘";s:2:"i";s:3:"蝙";s:2:"";s:3:"蝚";s:2:"j";s:3:"蝛";s:2:"k";s:3:"蝜";s:2:"l";s:3:"蝝";s:2:"m";s:3:"蝞";s:2:"n";s:3:"蝟";s:2:"o";s:3:"蝠";s:2:"";s:3:"蝡";s:2:"p";s:3:"蝢";s:2:"q";s:3:"蝣";s:2:"";s:3:"蝤";s:2:"";s:3:"蝥";s:2:"";s:3:"蝦";s:2:"r";s:3:"蝧";s:2:"s";s:3:"蝨";s:2:"t";s:3:"蝩";s:2:"u";s:3:"蝪";s:2:"v";s:3:"蝫";s:2:"w";s:3:"蝬";s:2:"x";s:3:"蝭";s:2:"y";s:3:"蝮";s:2:"";s:3:"蝯";s:2:"z";s:3:"蝰";s:2:"";s:3:"蝱";s:2:"{";s:3:"蝲";s:2:"|";s:3:"蝳";s:2:"}";s:3:"蝴";s:2:"";s:3:"蝵";s:2:"~";s:3:"蝶";s:2:"";s:3:"蝷";s:2:"΀";s:3:"蝸";s:2:"΁";s:3:"蝹";s:2:"΂";s:3:"蝺";s:2:"΃";s:3:"蝻";s:2:"";s:3:"蝼";s:2:"";s:3:"蝽";s:2:"";s:3:"蝾";s:2:"";s:3:"蝿";s:2:"΄";s:3:"螀";s:2:"΅";s:3:"螁";s:2:"Ά";s:3:"螂";s:2:"";s:3:"螃";s:2:"";s:3:"螄";s:2:"·";s:3:"螅";s:2:"";s:3:"螆";s:2:"Έ";s:3:"螇";s:2:"Ή";s:3:"螈";s:2:"";s:3:"螉";s:2:"Ί";s:3:"螊";s:2:"΋";s:3:"螋";s:2:"";s:3:"螌";s:2:"Ό";s:3:"融";s:2:"";s:3:"螎";s:2:"΍";s:3:"螏";s:2:"Ύ";s:3:"螐";s:2:"Ώ";s:3:"螑";s:2:"ΐ";s:3:"螒";s:2:"Α";s:3:"螓";s:2:"";s:3:"螔";s:2:"Β";s:3:"螕";s:2:"Γ";s:3:"螖";s:2:"Δ";s:3:"螗";s:2:"";s:3:"螘";s:2:"Ε";s:3:"螙";s:2:"Ζ";s:3:"螚";s:2:"Η";s:3:"螛";s:2:"Θ";s:3:"螜";s:2:"Ι";s:3:"螝";s:2:"Κ";s:3:"螞";s:2:"Λ";s:3:"螟";s:2:"";s:3:"螠";s:2:"Μ";s:3:"螡";s:2:"Ν";s:3:"螢";s:2:"Ξ";s:3:"螣";s:2:"Ο";s:3:"螤";s:2:"Π";s:3:"螥";s:2:"@";s:3:"螦";s:2:"A";s:3:"螧";s:2:"B";s:3:"螨";s:2:"";s:3:"螩";s:2:"C";s:3:"螪";s:2:"D";s:3:"螫";s:2:"";s:3:"螬";s:2:"";s:3:"螭";s:2:"";s:3:"螮";s:2:"E";s:3:"螯";s:2:"";s:3:"螰";s:2:"F";s:3:"螱";s:2:"G";s:3:"螲";s:2:"H";s:3:"螳";s:2:"";s:3:"螴";s:2:"I";s:3:"螵";s:2:"";s:3:"螶";s:2:"J";s:3:"螷";s:2:"K";s:3:"螸";s:2:"L";s:3:"螹";s:2:"M";s:3:"螺";s:2:"";s:3:"螻";s:2:"N";s:3:"螼";s:2:"O";s:3:"螽";s:2:"";s:3:"螾";s:2:"P";s:3:"螿";s:2:"Q";s:3:"蟀";s:2:"";s:3:"蟁";s:2:"R";s:3:"蟂";s:2:"S";s:3:"蟃";s:2:"T";s:3:"蟄";s:2:"U";s:3:"蟅";s:2:"V";s:3:"蟆";s:2:"";s:3:"蟇";s:2:"W";s:3:"蟈";s:2:"X";s:3:"蟉";s:2:"Y";s:3:"蟊";s:2:"";s:3:"蟋";s:2:"";s:3:"蟌";s:2:"Z";s:3:"蟍";s:2:"[";s:3:"蟎";s:2:"\";s:3:"蟏";s:2:"]";s:3:"蟐";s:2:"^";s:3:"蟑";s:2:"";s:3:"蟒";s:2:"";s:3:"蟓";s:2:"";s:3:"蟔";s:2:"_";s:3:"蟕";s:2:"`";s:3:"蟖";s:2:"a";s:3:"蟗";s:2:"b";s:3:"蟘";s:2:"c";s:3:"蟙";s:2:"d";s:3:"蟚";s:2:"e";s:3:"蟛";s:2:"";s:3:"蟜";s:2:"f";s:3:"蟝";s:2:"g";s:3:"蟞";s:2:"h";s:3:"蟟";s:2:"i";s:3:"蟠";s:2:"";s:3:"蟡";s:2:"j";s:3:"蟢";s:2:"k";s:3:"蟣";s:2:"l";s:3:"蟤";s:2:"m";s:3:"蟥";s:2:"";s:3:"蟦";s:2:"n";s:3:"蟧";s:2:"o";s:3:"蟨";s:2:"p";s:3:"蟩";s:2:"q";s:3:"蟪";s:2:"";s:3:"蟫";s:2:"r";s:3:"蟬";s:2:"s";s:3:"蟭";s:2:"t";s:3:"蟮";s:2:"";s:3:"蟯";s:2:"u";s:3:"蟰";s:2:"v";s:3:"蟱";s:2:"w";s:3:"蟲";s:2:"x";s:3:"蟳";s:2:"y";s:3:"蟴";s:2:"z";s:3:"蟵";s:2:"{";s:3:"蟶";s:2:"|";s:3:"蟷";s:2:"}";s:3:"蟸";s:2:"~";s:3:"蟹";s:2:"з";s:3:"蟺";s:2:"π";s:3:"蟻";s:2:"ρ";s:3:"蟼";s:2:"ς";s:3:"蟽";s:2:"σ";s:3:"蟾";s:2:"";s:3:"蟿";s:2:"τ";s:3:"蠀";s:2:"υ";s:3:"蠁";s:2:"φ";s:3:"蠂";s:2:"χ";s:3:"蠃";s:2:"";s:3:"蠄";s:2:"ψ";s:3:"蠅";s:2:"ω";s:3:"蠆";s:2:"ϊ";s:3:"蠇";s:2:"ϋ";s:3:"蠈";s:2:"ό";s:3:"蠉";s:2:"ύ";s:3:"蠊";s:2:"";s:3:"蠋";s:2:"ώ";s:3:"蠌";s:2:"Ϗ";s:3:"蠍";s:2:"ϐ";s:3:"蠎";s:2:"ϑ";s:3:"蠏";s:2:"ϒ";s:3:"蠐";s:2:"ϓ";s:3:"蠑";s:2:"ϔ";s:3:"蠒";s:2:"ϕ";s:3:"蠓";s:2:"";s:3:"蠔";s:2:"ϖ";s:3:"蠕";s:2:"";s:3:"蠖";s:2:"";s:3:"蠗";s:2:"ϗ";s:3:"蠘";s:2:"Ϙ";s:3:"蠙";s:2:"ϙ";s:3:"蠚";s:2:"Ϛ";s:3:"蠛";s:2:"";s:3:"蠜";s:2:"ϛ";s:3:"蠝";s:2:"Ϝ";s:3:"蠞";s:2:"ϝ";s:3:"蠟";s:2:"Ϟ";s:3:"蠠";s:2:"ϟ";s:3:"蠡";s:2:"";s:3:"蠢";s:2:"";s:3:"蠣";s:2:"Ϡ";s:3:"蠤";s:2:"@";s:3:"蠥";s:2:"A";s:3:"蠦";s:2:"B";s:3:"蠧";s:2:"C";s:3:"蠨";s:2:"D";s:3:"蠩";s:2:"E";s:3:"蠪";s:2:"F";s:3:"蠫";s:2:"G";s:3:"蠬";s:2:"H";s:3:"蠭";s:2:"I";s:3:"蠮";s:2:"J";s:3:"蠯";s:2:"K";s:3:"蠰";s:2:"L";s:3:"蠱";s:2:"M";s:3:"蠲";s:2:"";s:3:"蠳";s:2:"N";s:3:"蠴";s:2:"O";s:3:"蠵";s:2:"P";s:3:"蠶";s:2:"Q";s:3:"蠷";s:2:"R";s:3:"蠸";s:2:"S";s:3:"蠹";s:2:"";s:3:"蠺";s:2:"T";s:3:"蠻";s:2:"U";s:3:"蠼";s:2:"";s:3:"蠽";s:2:"V";s:3:"蠾";s:2:"W";s:3:"蠿";s:2:"X";s:3:"血";s:2:"Ѫ";s:3:"衁";s:2:"Y";s:3:"衂";s:2:"Z";s:3:"衃";s:2:"[";s:3:"衄";s:2:"";s:3:"衅";s:2:"";s:3:"衆";s:2:"\";s:3:"衇";s:2:"]";s:3:"衈";s:2:"^";s:3:"衉";s:2:"_";s:3:"衊";s:2:"`";s:3:"衋";s:2:"a";s:3:"行";s:2:"";s:3:"衍";s:2:"";s:3:"衎";s:2:"b";s:3:"衏";s:2:"c";s:3:"衐";s:2:"d";s:3:"衑";s:2:"e";s:3:"衒";s:2:"f";s:3:"術";s:2:"g";s:3:"衔";s:2:"";s:3:"衕";s:2:"h";s:3:"衖";s:2:"i";s:3:"街";s:2:"";s:3:"衘";s:2:"j";s:3:"衙";s:2:"";s:3:"衚";s:2:"k";s:3:"衛";s:2:"l";s:3:"衜";s:2:"m";s:3:"衝";s:2:"n";s:3:"衞";s:2:"o";s:3:"衟";s:2:"p";s:3:"衠";s:2:"q";s:3:"衡";s:2:"";s:3:"衢";s:2:"";s:3:"衣";s:2:"";s:3:"衤";s:2:"";s:3:"补";s:2:"";s:3:"衦";s:2:"r";s:3:"衧";s:2:"s";s:3:"表";s:2:"";s:3:"衩";s:2:"";s:3:"衪";s:2:"t";s:3:"衫";s:2:"";s:3:"衬";s:2:"";s:3:"衭";s:2:"u";s:3:"衮";s:2:"";s:3:"衯";s:2:"v";s:3:"衰";s:2:"˥";s:3:"衱";s:2:"w";s:3:"衲";s:2:"";s:3:"衳";s:2:"x";s:3:"衴";s:2:"y";s:3:"衵";s:2:"z";s:3:"衶";s:2:"{";s:3:"衷";s:2:"";s:3:"衸";s:2:"|";s:3:"衹";s:2:"}";s:3:"衺";s:2:"~";s:3:"衻";s:2:"Ѐ";s:3:"衼";s:2:"Ё";s:3:"衽";s:2:"";s:3:"衾";s:2:"";s:3:"衿";s:2:"";s:3:"袀";s:2:"Ђ";s:3:"袁";s:2:"Ԭ";s:3:"袂";s:2:"";s:3:"袃";s:2:"Ѓ";s:3:"袄";s:2:"";s:3:"袅";s:2:"";s:3:"袆";s:2:"Є";s:3:"袇";s:2:"Ѕ";s:3:"袈";s:2:"";s:3:"袉";s:2:"І";s:3:"袊";s:2:"Ї";s:3:"袋";s:2:"";s:3:"袌";s:2:"Ј";s:3:"袍";s:2:"";s:3:"袎";s:2:"Љ";s:3:"袏";s:2:"Њ";s:3:"袐";s:2:"Ћ";s:3:"袑";s:2:"Ќ";s:3:"袒";s:2:"̻";s:3:"袓";s:2:"Ѝ";s:3:"袔";s:2:"Ў";s:3:"袕";s:2:"Џ";s:3:"袖";s:2:"";s:3:"袗";s:2:"А";s:3:"袘";s:2:"Б";s:3:"袙";s:2:"В";s:3:"袚";s:2:"Г";s:3:"袛";s:2:"Д";s:3:"袜";s:2:"";s:3:"袝";s:2:"Е";s:3:"袞";s:2:"Ж";s:3:"袟";s:2:"З";s:3:"袠";s:2:"И";s:3:"袡";s:2:"Й";s:3:"袢";s:2:"";s:3:"袣";s:2:"К";s:3:"袤";s:2:"";s:3:"袥";s:2:"Л";s:3:"袦";s:2:"М";s:3:"袧";s:2:"Н";s:3:"袨";s:2:"О";s:3:"袩";s:2:"П";s:3:"袪";s:2:"Р";s:3:"被";s:2:"";s:3:"袬";s:2:"@";s:3:"袭";s:2:"Ϯ";s:3:"袮";s:2:"A";s:3:"袯";s:2:"B";s:3:"袰";s:2:"C";s:3:"袱";s:2:"";s:3:"袲";s:2:"D";s:3:"袳";s:2:"E";s:3:"袴";s:2:"F";s:3:"袵";s:2:"G";s:3:"袶";s:2:"H";s:3:"袷";s:2:"";s:3:"袸";s:2:"I";s:3:"袹";s:2:"J";s:3:"袺";s:2:"K";s:3:"袻";s:2:"L";s:3:"袼";s:2:"";s:3:"袽";s:2:"M";s:3:"袾";s:2:"N";s:3:"袿";s:2:"O";s:3:"裀";s:2:"P";s:3:"裁";s:2:"";s:3:"裂";s:2:"";s:3:"裃";s:2:"Q";s:3:"裄";s:2:"R";s:3:"装";s:2:"װ";s:3:"裆";s:2:"";s:3:"裇";s:2:"S";s:3:"裈";s:2:"T";s:3:"裉";s:2:"";s:3:"裊";s:2:"U";s:3:"裋";s:2:"V";s:3:"裌";s:2:"W";s:3:"裍";s:2:"X";s:3:"裎";s:2:"";s:3:"裏";s:2:"Y";s:3:"裐";s:2:"Z";s:3:"裑";s:2:"[";s:3:"裒";s:2:"";s:3:"裓";s:2:"\";s:3:"裔";s:2:"";s:3:"裕";s:2:"ԣ";s:3:"裖";s:2:"]";s:3:"裗";s:2:"^";s:3:"裘";s:2:"";s:3:"裙";s:2:"ȹ";s:3:"裚";s:2:"_";s:3:"裛";s:2:"`";s:3:"補";s:2:"a";s:3:"裝";s:2:"b";s:3:"裞";s:2:"c";s:3:"裟";s:2:"";s:3:"裠";s:2:"d";s:3:"裡";s:2:"e";s:3:"裢";s:2:"";s:3:"裣";s:2:"";s:3:"裤";s:2:"";s:3:"裥";s:2:"";s:3:"裦";s:2:"f";s:3:"裧";s:2:"g";s:3:"裨";s:2:"";s:3:"裩";s:2:"h";s:3:"裪";s:2:"i";s:3:"裫";s:2:"j";s:3:"裬";s:2:"k";s:3:"裭";s:2:"l";s:3:"裮";s:2:"m";s:3:"裯";s:2:"n";s:3:"裰";s:2:"";s:3:"裱";s:2:"";s:3:"裲";s:2:"o";s:3:"裳";s:2:"";s:3:"裴";s:2:"";s:3:"裵";s:2:"p";s:3:"裶";s:2:"q";s:3:"裷";s:2:"r";s:3:"裸";s:2:"";s:3:"裹";s:2:"";s:3:"裺";s:2:"s";s:3:"裻";s:2:"t";s:3:"裼";s:2:"";s:3:"製";s:2:"u";s:3:"裾";s:2:"";s:3:"裿";s:2:"v";s:3:"褀";s:2:"w";s:3:"褁";s:2:"x";s:3:"褂";s:2:"";s:3:"褃";s:2:"y";s:3:"褄";s:2:"z";s:3:"褅";s:2:"{";s:3:"褆";s:2:"|";s:3:"複";s:2:"}";s:3:"褈";s:2:"~";s:3:"褉";s:2:"р";s:3:"褊";s:2:"";s:3:"褋";s:2:"с";s:3:"褌";s:2:"т";s:3:"褍";s:2:"у";s:3:"褎";s:2:"ф";s:3:"褏";s:2:"х";s:3:"褐";s:2:"";s:3:"褑";s:2:"ц";s:3:"褒";s:2:"";s:3:"褓";s:2:"";s:3:"褔";s:2:"ч";s:3:"褕";s:2:"ш";s:3:"褖";s:2:"щ";s:3:"褗";s:2:"ъ";s:3:"褘";s:2:"ы";s:3:"褙";s:2:"";s:3:"褚";s:2:"";s:3:"褛";s:2:"";s:3:"褜";s:2:"ь";s:3:"褝";s:2:"э";s:3:"褞";s:2:"ю";s:3:"褟";s:2:"я";s:3:"褠";s:2:"ѐ";s:3:"褡";s:2:"";s:3:"褢";s:2:"ё";s:3:"褣";s:2:"ђ";s:3:"褤";s:2:"ѓ";s:3:"褥";s:2:"";s:3:"褦";s:2:"є";s:3:"褧";s:2:"ѕ";s:3:"褨";s:2:"і";s:3:"褩";s:2:"ї";s:3:"褪";s:2:"";s:3:"褫";s:2:"";s:3:"褬";s:2:"ј";s:3:"褭";s:2:"љ";s:3:"褮";s:2:"њ";s:3:"褯";s:2:"ћ";s:3:"褰";s:2:"";s:3:"褱";s:2:"ќ";s:3:"褲";s:2:"ѝ";s:3:"褳";s:2:"ў";s:3:"褴";s:2:"";s:3:"褵";s:2:"џ";s:3:"褶";s:2:"";s:3:"褷";s:2:"Ѡ";s:3:"褸";s:2:"@";s:3:"褹";s:2:"A";s:3:"褺";s:2:"B";s:3:"褻";s:2:"C";s:3:"褼";s:2:"D";s:3:"褽";s:2:"E";s:3:"褾";s:2:"F";s:3:"褿";s:2:"G";s:3:"襀";s:2:"H";s:3:"襁";s:2:"";s:3:"襂";s:2:"I";s:3:"襃";s:2:"J";s:3:"襄";s:2:"";s:3:"襅";s:2:"K";s:3:"襆";s:2:"L";s:3:"襇";s:2:"M";s:3:"襈";s:2:"N";s:3:"襉";s:2:"O";s:3:"襊";s:2:"P";s:3:"襋";s:2:"Q";s:3:"襌";s:2:"R";s:3:"襍";s:2:"S";s:3:"襎";s:2:"T";s:3:"襏";s:2:"U";s:3:"襐";s:2:"V";s:3:"襑";s:2:"W";s:3:"襒";s:2:"X";s:3:"襓";s:2:"Y";s:3:"襔";s:2:"Z";s:3:"襕";s:2:"[";s:3:"襖";s:2:"\";s:3:"襗";s:2:"]";s:3:"襘";s:2:"^";s:3:"襙";s:2:"_";s:3:"襚";s:2:"`";s:3:"襛";s:2:"a";s:3:"襜";s:2:"b";s:3:"襝";s:2:"c";s:3:"襞";s:2:"";s:3:"襟";s:2:"";s:3:"襠";s:2:"d";s:3:"襡";s:2:"e";s:3:"襢";s:2:"f";s:3:"襣";s:2:"g";s:3:"襤";s:2:"h";s:3:"襥";s:2:"i";s:3:"襦";s:2:"";s:3:"襧";s:2:"j";s:3:"襨";s:2:"k";s:3:"襩";s:2:"l";s:3:"襪";s:2:"m";s:3:"襫";s:2:"n";s:3:"襬";s:2:"o";s:3:"襭";s:2:"p";s:3:"襮";s:2:"q";s:3:"襯";s:2:"r";s:3:"襰";s:2:"s";s:3:"襱";s:2:"t";s:3:"襲";s:2:"u";s:3:"襳";s:2:"v";s:3:"襴";s:2:"w";s:3:"襵";s:2:"x";s:3:"襶";s:2:"y";s:3:"襷";s:2:"z";s:3:"襸";s:2:"{";s:3:"襹";s:2:"|";s:3:"襺";s:2:"}";s:3:"襻";s:2:"";s:3:"襼";s:2:"~";s:3:"襽";s:2:"Ҁ";s:3:"襾";s:2:"ҁ";s:3:"西";s:2:"";s:3:"覀";s:2:"҂";s:3:"要";s:2:"Ҫ";s:3:"覂";s:2:"҃";s:3:"覃";s:2:"";s:3:"覄";s:2:"҄";s:3:"覅";s:2:"҅";s:3:"覆";s:2:"";s:3:"覇";s:2:"҆";s:3:"覈";s:2:"҇";s:3:"覉";s:2:"҈";s:3:"覊";s:2:"҉";s:3:"見";s:2:"Ҋ";s:3:"覌";s:2:"ҋ";s:3:"覍";s:2:"Ҍ";s:3:"覎";s:2:"ҍ";s:3:"規";s:2:"Ҏ";s:3:"覐";s:2:"ҏ";s:3:"覑";s:2:"Ґ";s:3:"覒";s:2:"ґ";s:3:"覓";s:2:"Ғ";s:3:"覔";s:2:"ғ";s:3:"覕";s:2:"Ҕ";s:3:"視";s:2:"ҕ";s:3:"覗";s:2:"Җ";s:3:"覘";s:2:"җ";s:3:"覙";s:2:"Ҙ";s:3:"覚";s:2:"ҙ";s:3:"覛";s:2:"Қ";s:3:"覜";s:2:"қ";s:3:"覝";s:2:"Ҝ";s:3:"覞";s:2:"ҝ";s:3:"覟";s:2:"Ҟ";s:3:"覠";s:2:"ҟ";s:3:"覡";s:2:"Ҡ";s:3:"覢";s:2:"@";s:3:"覣";s:2:"A";s:3:"覤";s:2:"B";s:3:"覥";s:2:"C";s:3:"覦";s:2:"D";s:3:"覧";s:2:"E";s:3:"覨";s:2:"F";s:3:"覩";s:2:"G";s:3:"親";s:2:"H";s:3:"覫";s:2:"I";s:3:"覬";s:2:"J";s:3:"覭";s:2:"K";s:3:"覮";s:2:"L";s:3:"覯";s:2:"M";s:3:"覰";s:2:"N";s:3:"覱";s:2:"O";s:3:"覲";s:2:"P";s:3:"観";s:2:"Q";s:3:"覴";s:2:"R";s:3:"覵";s:2:"S";s:3:"覶";s:2:"T";s:3:"覷";s:2:"U";s:3:"覸";s:2:"V";s:3:"覹";s:2:"W";s:3:"覺";s:2:"X";s:3:"覻";s:2:"Y";s:3:"覼";s:2:"Z";s:3:"覽";s:2:"[";s:3:"覾";s:2:"\";s:3:"覿";s:2:"]";s:3:"觀";s:2:"^";s:3:"见";s:2:"";s:3:"观";s:2:"";s:3:"觃";s:2:"_";s:3:"规";s:2:"";s:3:"觅";s:2:"";s:3:"视";s:2:"";s:3:"觇";s:2:"";s:3:"览";s:2:"";s:3:"觉";s:2:"";s:3:"觊";s:2:"";s:3:"觋";s:2:"";s:3:"觌";s:2:"";s:3:"觍";s:2:"`";s:3:"觎";s:2:"";s:3:"觏";s:2:"";s:3:"觐";s:2:"";s:3:"觑";s:2:"";s:3:"角";s:2:"";s:3:"觓";s:2:"a";s:3:"觔";s:2:"b";s:3:"觕";s:2:"c";s:3:"觖";s:2:"";s:3:"觗";s:2:"d";s:3:"觘";s:2:"e";s:3:"觙";s:2:"f";s:3:"觚";s:2:"";s:3:"觛";s:2:"g";s:3:"觜";s:2:"";s:3:"觝";s:2:"h";s:3:"觞";s:2:"";s:3:"觟";s:2:"i";s:3:"觠";s:2:"j";s:3:"觡";s:2:"k";s:3:"觢";s:2:"l";s:3:"解";s:2:"";s:3:"觤";s:2:"m";s:3:"觥";s:2:"";s:3:"触";s:2:"";s:3:"觧";s:2:"n";s:3:"觨";s:2:"o";s:3:"觩";s:2:"p";s:3:"觪";s:2:"q";s:3:"觫";s:2:"";s:3:"觬";s:2:"r";s:3:"觭";s:2:"s";s:3:"觮";s:2:"t";s:3:"觯";s:2:"";s:3:"觰";s:2:"u";s:3:"觱";s:2:"v";s:3:"觲";s:2:"w";s:3:"觳";s:2:"";s:3:"觴";s:2:"x";s:3:"觵";s:2:"y";s:3:"觶";s:2:"z";s:3:"觷";s:2:"{";s:3:"觸";s:2:"|";s:3:"觹";s:2:"}";s:3:"觺";s:2:"~";s:3:"觻";s:2:"Ӏ";s:3:"觼";s:2:"Ӂ";s:3:"觽";s:2:"ӂ";s:3:"觾";s:2:"Ӄ";s:3:"觿";s:2:"ӄ";s:3:"言";s:2:"";s:3:"訁";s:2:"Ӆ";s:3:"訂";s:2:"ӆ";s:3:"訃";s:2:"Ӈ";s:3:"訄";s:2:"ӈ";s:3:"訅";s:2:"Ӊ";s:3:"訆";s:2:"ӊ";s:3:"訇";s:2:"";s:3:"計";s:2:"Ӌ";s:3:"訉";s:2:"ӌ";s:3:"訊";s:2:"Ӎ";s:3:"訋";s:2:"ӎ";s:3:"訌";s:2:"ӏ";s:3:"訍";s:2:"Ӑ";s:3:"討";s:2:"ӑ";s:3:"訏";s:2:"Ӓ";s:3:"訐";s:2:"ӓ";s:3:"訑";s:2:"Ӕ";s:3:"訒";s:2:"ӕ";s:3:"訓";s:2:"Ӗ";s:3:"訔";s:2:"ӗ";s:3:"訕";s:2:"Ә";s:3:"訖";s:2:"ә";s:3:"託";s:2:"Ӛ";s:3:"記";s:2:"ӛ";s:3:"訙";s:2:"Ӝ";s:3:"訚";s:2:"ӝ";s:3:"訛";s:2:"Ӟ";s:3:"訜";s:2:"ӟ";s:3:"訝";s:2:"Ӡ";s:3:"訞";s:2:"@";s:3:"訟";s:2:"A";s:3:"訠";s:2:"B";s:3:"訡";s:2:"C";s:3:"訢";s:2:"D";s:3:"訣";s:2:"E";s:3:"訤";s:2:"F";s:3:"訥";s:2:"G";s:3:"訦";s:2:"H";s:3:"訧";s:2:"I";s:3:"訨";s:2:"J";s:3:"訩";s:2:"K";s:3:"訪";s:2:"L";s:3:"訫";s:2:"M";s:3:"訬";s:2:"N";s:3:"設";s:2:"O";s:3:"訮";s:2:"P";s:3:"訯";s:2:"Q";s:3:"訰";s:2:"R";s:3:"許";s:2:"S";s:3:"訲";s:2:"T";s:3:"訳";s:2:"U";s:3:"訴";s:2:"V";s:3:"訵";s:2:"W";s:3:"訶";s:2:"X";s:3:"訷";s:2:"Y";s:3:"訸";s:2:"Z";s:3:"訹";s:2:"[";s:3:"診";s:2:"\";s:3:"註";s:2:"]";s:3:"証";s:2:"^";s:3:"訽";s:2:"_";s:3:"訾";s:2:"";s:3:"訿";s:2:"`";s:3:"詀";s:2:"a";s:3:"詁";s:2:"b";s:3:"詂";s:2:"c";s:3:"詃";s:2:"d";s:3:"詄";s:2:"e";s:3:"詅";s:2:"f";s:3:"詆";s:2:"g";s:3:"詇";s:2:"h";s:3:"詈";s:2:"";s:3:"詉";s:2:"i";s:3:"詊";s:2:"j";s:3:"詋";s:2:"k";s:3:"詌";s:2:"l";s:3:"詍";s:2:"m";s:3:"詎";s:2:"n";s:3:"詏";s:2:"o";s:3:"詐";s:2:"p";s:3:"詑";s:2:"q";s:3:"詒";s:2:"r";s:3:"詓";s:2:"s";s:3:"詔";s:2:"t";s:3:"評";s:2:"u";s:3:"詖";s:2:"v";s:3:"詗";s:2:"w";s:3:"詘";s:2:"x";s:3:"詙";s:2:"y";s:3:"詚";s:2:"z";s:3:"詛";s:2:"{";s:3:"詜";s:2:"|";s:3:"詝";s:2:"}";s:3:"詞";s:2:"~";s:3:"詟";s:2:"Ԁ";s:3:"詠";s:2:"ԁ";s:3:"詡";s:2:"Ԃ";s:3:"詢";s:2:"ԃ";s:3:"詣";s:2:"Ԅ";s:3:"詤";s:2:"ԅ";s:3:"詥";s:2:"Ԇ";s:3:"試";s:2:"ԇ";s:3:"詧";s:2:"Ԉ";s:3:"詨";s:2:"ԉ";s:3:"詩";s:2:"Ԋ";s:3:"詪";s:2:"ԋ";s:3:"詫";s:2:"Ԍ";s:3:"詬";s:2:"ԍ";s:3:"詭";s:2:"Ԏ";s:3:"詮";s:2:"ԏ";s:3:"詯";s:2:"Ԑ";s:3:"詰";s:2:"ԑ";s:3:"話";s:2:"Ԓ";s:3:"該";s:2:"ԓ";s:3:"詳";s:2:"Ԕ";s:3:"詴";s:2:"ԕ";s:3:"詵";s:2:"Ԗ";s:3:"詶";s:2:"ԗ";s:3:"詷";s:2:"Ԙ";s:3:"詸";s:2:"ԙ";s:3:"詹";s:2:"ղ";s:3:"詺";s:2:"Ԛ";s:3:"詻";s:2:"ԛ";s:3:"詼";s:2:"Ԝ";s:3:"詽";s:2:"ԝ";s:3:"詾";s:2:"Ԟ";s:3:"詿";s:2:"ԟ";s:3:"誀";s:2:"Ԡ";s:3:"誁";s:2:"@";s:3:"誂";s:2:"A";s:3:"誃";s:2:"B";s:3:"誄";s:2:"C";s:3:"誅";s:2:"D";s:3:"誆";s:2:"E";s:3:"誇";s:2:"F";s:3:"誈";s:2:"G";s:3:"誉";s:2:"";s:3:"誊";s:2:"";s:3:"誋";s:2:"H";s:3:"誌";s:2:"I";s:3:"認";s:2:"J";s:3:"誎";s:2:"K";s:3:"誏";s:2:"L";s:3:"誐";s:2:"M";s:3:"誑";s:2:"N";s:3:"誒";s:2:"O";s:3:"誓";s:2:"";s:3:"誔";s:2:"P";s:3:"誕";s:2:"Q";s:3:"誖";s:2:"R";s:3:"誗";s:2:"S";s:3:"誘";s:2:"T";s:3:"誙";s:2:"U";s:3:"誚";s:2:"V";s:3:"誛";s:2:"W";s:3:"誜";s:2:"X";s:3:"誝";s:2:"Y";s:3:"語";s:2:"Z";s:3:"誟";s:2:"[";s:3:"誠";s:2:"\";s:3:"誡";s:2:"]";s:3:"誢";s:2:"^";s:3:"誣";s:2:"_";s:3:"誤";s:2:"`";s:3:"誥";s:2:"a";s:3:"誦";s:2:"b";s:3:"誧";s:2:"c";s:3:"誨";s:2:"d";s:3:"誩";s:2:"e";s:3:"說";s:2:"f";s:3:"誫";s:2:"g";s:3:"説";s:2:"h";s:3:"読";s:2:"i";s:3:"誮";s:2:"j";s:3:"誯";s:2:"k";s:3:"誰";s:2:"l";s:3:"誱";s:2:"m";s:3:"課";s:2:"n";s:3:"誳";s:2:"o";s:3:"誴";s:2:"p";s:3:"誵";s:2:"q";s:3:"誶";s:2:"r";s:3:"誷";s:2:"s";s:3:"誸";s:2:"t";s:3:"誹";s:2:"u";s:3:"誺";s:2:"v";s:3:"誻";s:2:"w";s:3:"誼";s:2:"x";s:3:"誽";s:2:"y";s:3:"誾";s:2:"z";s:3:"調";s:2:"{";s:3:"諀";s:2:"|";s:3:"諁";s:2:"}";s:3:"諂";s:2:"~";s:3:"諃";s:2:"Հ";s:3:"諄";s:2:"Ձ";s:3:"諅";s:2:"Ղ";s:3:"諆";s:2:"Ճ";s:3:"談";s:2:"Մ";s:3:"諈";s:2:"Յ";s:3:"諉";s:2:"Ն";s:3:"諊";s:2:"Շ";s:3:"請";s:2:"Ո";s:3:"諌";s:2:"Չ";s:3:"諍";s:2:"Պ";s:3:"諎";s:2:"Ջ";s:3:"諏";s:2:"Ռ";s:3:"諐";s:2:"Ս";s:3:"諑";s:2:"Վ";s:3:"諒";s:2:"Տ";s:3:"諓";s:2:"Ր";s:3:"諔";s:2:"Ց";s:3:"諕";s:2:"Ւ";s:3:"論";s:2:"Փ";s:3:"諗";s:2:"Ք";s:3:"諘";s:2:"Օ";s:3:"諙";s:2:"Ֆ";s:3:"諚";s:2:"՗";s:3:"諛";s:2:"՘";s:3:"諜";s:2:"ՙ";s:3:"諝";s:2:"՚";s:3:"諞";s:2:"՛";s:3:"諟";s:2:"՜";s:3:"諠";s:2:"՝";s:3:"諡";s:2:"՞";s:3:"諢";s:2:"՟";s:3:"諣";s:2:"ՠ";s:3:"諤";s:2:"@";s:3:"諥";s:2:"A";s:3:"諦";s:2:"B";s:3:"諧";s:2:"C";s:3:"諨";s:2:"D";s:3:"諩";s:2:"E";s:3:"諪";s:2:"F";s:3:"諫";s:2:"G";s:3:"諬";s:2:"H";s:3:"諭";s:2:"I";s:3:"諮";s:2:"J";s:3:"諯";s:2:"K";s:3:"諰";s:2:"L";s:3:"諱";s:2:"M";s:3:"諲";s:2:"N";s:3:"諳";s:2:"O";s:3:"諴";s:2:"P";s:3:"諵";s:2:"Q";s:3:"諶";s:2:"R";s:3:"諷";s:2:"S";s:3:"諸";s:2:"T";s:3:"諹";s:2:"U";s:3:"諺";s:2:"V";s:3:"諻";s:2:"W";s:3:"諼";s:2:"X";s:3:"諽";s:2:"Y";s:3:"諾";s:2:"Z";s:3:"諿";s:2:"[";s:3:"謀";s:2:"\";s:3:"謁";s:2:"]";s:3:"謂";s:2:"^";s:3:"謃";s:2:"_";s:3:"謄";s:2:"`";s:3:"謅";s:2:"a";s:3:"謆";s:2:"b";s:3:"謇";s:2:"";s:3:"謈";s:2:"c";s:3:"謉";s:2:"d";s:3:"謊";s:2:"e";s:3:"謋";s:2:"f";s:3:"謌";s:2:"g";s:3:"謍";s:2:"h";s:3:"謎";s:2:"i";s:3:"謏";s:2:"j";s:3:"謐";s:2:"k";s:3:"謑";s:2:"l";s:3:"謒";s:2:"m";s:3:"謓";s:2:"n";s:3:"謔";s:2:"o";s:3:"謕";s:2:"p";s:3:"謖";s:2:"q";s:3:"謗";s:2:"r";s:3:"謘";s:2:"s";s:3:"謙";s:2:"t";s:3:"謚";s:2:"u";s:3:"講";s:2:"v";s:3:"謜";s:2:"w";s:3:"謝";s:2:"x";s:3:"謞";s:2:"y";s:3:"謟";s:2:"z";s:3:"謠";s:2:"{";s:3:"謡";s:2:"|";s:3:"謢";s:2:"}";s:3:"謣";s:2:"~";s:3:"謤";s:2:"ր";s:3:"謥";s:2:"ց";s:3:"謦";s:2:"";s:3:"謧";s:2:"ւ";s:3:"謨";s:2:"փ";s:3:"謩";s:2:"ք";s:3:"謪";s:2:"օ";s:3:"謫";s:2:"ֆ";s:3:"謬";s:2:"և";s:3:"謭";s:2:"ֈ";s:3:"謮";s:2:"։";s:3:"謯";s:2:"֊";s:3:"謰";s:2:"֋";s:3:"謱";s:2:"֌";s:3:"謲";s:2:"֍";s:3:"謳";s:2:"֎";s:3:"謴";s:2:"֏";s:3:"謵";s:2:"֐";s:3:"謶";s:2:"֑";s:3:"謷";s:2:"֒";s:3:"謸";s:2:"֓";s:3:"謹";s:2:"֔";s:3:"謺";s:2:"֕";s:3:"謻";s:2:"֖";s:3:"謼";s:2:"֗";s:3:"謽";s:2:"֘";s:3:"謾";s:2:"֙";s:3:"謿";s:2:"֚";s:3:"譀";s:2:"֛";s:3:"譁";s:2:"֜";s:3:"譂";s:2:"֝";s:3:"譃";s:2:"֞";s:3:"譄";s:2:"֟";s:3:"譅";s:2:"֠";s:3:"譆";s:2:"@";s:3:"譇";s:2:"A";s:3:"譈";s:2:"B";s:3:"證";s:2:"C";s:3:"譊";s:2:"D";s:3:"譋";s:2:"E";s:3:"譌";s:2:"F";s:3:"譍";s:2:"G";s:3:"譎";s:2:"H";s:3:"譏";s:2:"I";s:3:"譐";s:2:"J";s:3:"譑";s:2:"K";s:3:"譒";s:2:"L";s:3:"譓";s:2:"M";s:3:"譔";s:2:"N";s:3:"譕";s:2:"O";s:3:"譖";s:2:"P";s:3:"譗";s:2:"Q";s:3:"識";s:2:"R";s:3:"譙";s:2:"S";s:3:"譚";s:2:"T";s:3:"譛";s:2:"U";s:3:"譜";s:2:"V";s:3:"譝";s:2:"W";s:3:"譞";s:2:"X";s:3:"譟";s:2:"Y";s:3:"譠";s:2:"Z";s:3:"譡";s:2:"[";s:3:"譢";s:2:"\";s:3:"譣";s:2:"]";s:3:"譤";s:2:"^";s:3:"譥";s:2:"_";s:3:"警";s:2:"";s:3:"譧";s:2:"`";s:3:"譨";s:2:"a";s:3:"譩";s:2:"b";s:3:"譪";s:2:"c";s:3:"譫";s:2:"d";s:3:"譬";s:2:"Ʃ";s:3:"譭";s:2:"e";s:3:"譮";s:2:"f";s:3:"譯";s:2:"g";s:3:"議";s:2:"h";s:3:"譱";s:2:"i";s:3:"譲";s:2:"j";s:3:"譳";s:2:"k";s:3:"譴";s:2:"l";s:3:"譵";s:2:"m";s:3:"譶";s:2:"n";s:3:"護";s:2:"o";s:3:"譸";s:2:"p";s:3:"譹";s:2:"q";s:3:"譺";s:2:"r";s:3:"譻";s:2:"s";s:3:"譼";s:2:"t";s:3:"譽";s:2:"u";s:3:"譾";s:2:"v";s:3:"譿";s:2:"w";s:3:"讀";s:2:"x";s:3:"讁";s:2:"y";s:3:"讂";s:2:"z";s:3:"讃";s:2:"{";s:3:"讄";s:2:"|";s:3:"讅";s:2:"}";s:3:"讆";s:2:"~";s:3:"讇";s:2:"׀";s:3:"讈";s:2:"ׁ";s:3:"讉";s:2:"ׂ";s:3:"變";s:2:"׃";s:3:"讋";s:2:"ׄ";s:3:"讌";s:2:"ׅ";s:3:"讍";s:2:"׆";s:3:"讎";s:2:"ׇ";s:3:"讏";s:2:"׈";s:3:"讐";s:2:"׉";s:3:"讑";s:2:"׊";s:3:"讒";s:2:"׋";s:3:"讓";s:2:"׌";s:3:"讔";s:2:"׍";s:3:"讕";s:2:"׎";s:3:"讖";s:2:"׏";s:3:"讗";s:2:"א";s:3:"讘";s:2:"ב";s:3:"讙";s:2:"ג";s:3:"讚";s:2:"ד";s:3:"讛";s:2:"ה";s:3:"讜";s:2:"ו";s:3:"讝";s:2:"ז";s:3:"讞";s:2:"ח";s:3:"讟";s:2:"ט";s:3:"讠";s:2:"ڥ";s:3:"计";s:2:"";s:3:"订";s:2:"";s:3:"讣";s:2:"";s:3:"认";s:2:"";s:3:"讥";s:2:"";s:3:"讦";s:2:"ڦ";s:3:"讧";s:2:"ڧ";s:3:"讨";s:2:"";s:3:"让";s:2:"";s:3:"讪";s:2:"ڨ";s:3:"讫";s:2:"";s:3:"讬";s:2:"י";s:3:"训";s:2:"ѵ";s:3:"议";s:2:"";s:3:"讯";s:2:"Ѷ";s:3:"记";s:2:"";s:3:"讱";s:2:"ך";s:3:"讲";s:2:"";s:3:"讳";s:2:"";s:3:"讴";s:2:"ک";s:3:"讵";s:2:"ڪ";s:3:"讶";s:2:"";s:3:"讷";s:2:"ګ";s:3:"许";s:2:"";s:3:"讹";s:2:"";s:3:"论";s:2:"";s:3:"讻";s:2:"כ";s:3:"讼";s:2:"";s:3:"讽";s:2:"";s:3:"设";s:2:"";s:3:"访";s:2:"";s:3:"诀";s:2:"";s:3:"证";s:2:"֤";s:3:"诂";s:2:"ڬ";s:3:"诃";s:2:"ڭ";s:3:"评";s:2:"";s:3:"诅";s:2:"";s:3:"识";s:2:"ʶ";s:3:"诇";s:2:"ל";s:3:"诈";s:2:"թ";s:3:"诉";s:2:"";s:3:"诊";s:2:"";s:3:"诋";s:2:"ڮ";s:3:"诌";s:2:"";s:3:"词";s:2:"";s:3:"诎";s:2:"ڰ";s:3:"诏";s:2:"گ";s:3:"诐";s:2:"ם";s:3:"译";s:2:"";s:3:"诒";s:2:"ڱ";s:3:"诓";s:2:"ڲ";s:3:"诔";s:2:"ڳ";s:3:"试";s:2:"";s:3:"诖";s:2:"ڴ";s:3:"诗";s:2:"ʫ";s:3:"诘";s:2:"ڵ";s:3:"诙";s:2:"ڶ";s:3:"诚";s:2:"";s:3:"诛";s:2:"";s:3:"诜";s:2:"ڷ";s:3:"话";s:2:"";s:3:"诞";s:2:"";s:3:"诟";s:2:"ڸ";s:3:"诠";s:2:"ڹ";s:3:"诡";s:2:"";s:3:"询";s:2:"ѯ";s:3:"诣";s:2:"";s:3:"诤";s:2:"ں";s:3:"该";s:2:"";s:3:"详";s:2:"";s:3:"诧";s:2:"";s:3:"诨";s:2:"ڻ";s:3:"诩";s:2:"ڼ";s:3:"诪";s:2:"מ";s:3:"诫";s:2:"";s:3:"诬";s:2:"";s:3:"语";s:2:"";s:3:"诮";s:2:"ڽ";s:3:"误";s:2:"";s:3:"诰";s:2:"ھ";s:3:"诱";s:2:"";s:3:"诲";s:2:"";s:3:"诳";s:2:"ڿ";s:3:"说";s:2:"˵";s:3:"诵";s:2:"";s:3:"诶";s:2:"";s:3:"请";s:2:"";s:3:"诸";s:2:"";s:3:"诹";s:2:"";s:3:"诺";s:2:"ŵ";s:3:"读";s:2:"";s:3:"诼";s:2:"";s:3:"诽";s:2:"";s:3:"课";s:2:"";s:3:"诿";s:2:"";s:3:"谀";s:2:"";s:3:"谁";s:2:"˭";s:3:"谂";s:2:"";s:3:"调";s:2:"";s:3:"谄";s:2:"";s:3:"谅";s:2:"";s:3:"谆";s:2:"׻";s:3:"谇";s:2:"";s:3:"谈";s:2:"̸";s:3:"谉";s:2:"ן";s:3:"谊";s:2:"";s:3:"谋";s:2:"ı";s:3:"谌";s:2:"";s:3:"谍";s:2:"";s:3:"谎";s:2:"";s:3:"谏";s:2:"";s:3:"谐";s:2:"г";s:3:"谑";s:2:"";s:3:"谒";s:2:"";s:3:"谓";s:2:"ν";s:3:"谔";s:2:"";s:3:"谕";s:2:"";s:3:"谖";s:2:"";s:3:"谗";s:2:"";s:3:"谘";s:2:"";s:3:"谙";s:2:"";s:3:"谚";s:2:"";s:3:"谛";s:2:"";s:3:"谜";s:2:"";s:3:"谝";s:2:"";s:3:"谞";s:2:"נ";s:3:"谟";s:2:"";s:3:"谠";s:2:"";s:3:"谡";s:2:"";s:3:"谢";s:2:"л";s:3:"谣";s:2:"ҥ";s:3:"谤";s:2:"";s:3:"谥";s:2:"";s:3:"谦";s:2:"ǫ";s:3:"谧";s:2:"";s:3:"谨";s:2:"";s:3:"谩";s:2:"á";s:3:"谪";s:2:"";s:3:"谫";s:2:"";s:3:"谬";s:2:"";s:3:"谭";s:2:"̷";s:3:"谮";s:2:"";s:3:"谯";s:2:"";s:3:"谰";s:2:"";s:3:"谱";s:2:"";s:3:"谲";s:2:"";s:3:"谳";s:2:"";s:3:"谴";s:2:"Ǵ";s:3:"谵";s:2:"";s:3:"谶";s:2:"";s:3:"谷";s:2:"";s:3:"谸";s:2:"@";s:3:"谹";s:2:"A";s:3:"谺";s:2:"B";s:3:"谻";s:2:"C";s:3:"谼";s:2:"D";s:3:"谽";s:2:"E";s:3:"谾";s:2:"F";s:3:"谿";s:2:"G";s:3:"豀";s:2:"H";s:3:"豁";s:2:"";s:3:"豂";s:2:"I";s:3:"豃";s:2:"J";s:3:"豄";s:2:"K";s:3:"豅";s:2:"L";s:3:"豆";s:2:"";s:3:"豇";s:2:"";s:3:"豈";s:2:"M";s:3:"豉";s:2:"";s:3:"豊";s:2:"N";s:3:"豋";s:2:"O";s:3:"豌";s:2:"";s:3:"豍";s:2:"P";s:3:"豎";s:2:"Q";s:3:"豏";s:2:"R";s:3:"豐";s:2:"S";s:3:"豑";s:2:"T";s:3:"豒";s:2:"U";s:3:"豓";s:2:"V";s:3:"豔";s:2:"W";s:3:"豕";s:2:"";s:3:"豖";s:2:"X";s:3:"豗";s:2:"Y";s:3:"豘";s:2:"Z";s:3:"豙";s:2:"[";s:3:"豚";s:2:"";s:3:"豛";s:2:"\";s:3:"豜";s:2:"]";s:3:"豝";s:2:"^";s:3:"豞";s:2:"_";s:3:"豟";s:2:"`";s:3:"豠";s:2:"a";s:3:"象";s:2:"";s:3:"豢";s:2:"";s:3:"豣";s:2:"b";s:3:"豤";s:2:"c";s:3:"豥";s:2:"d";s:3:"豦";s:2:"e";s:3:"豧";s:2:"f";s:3:"豨";s:2:"g";s:3:"豩";s:2:"h";s:3:"豪";s:2:"";s:3:"豫";s:2:"ԥ";s:3:"豬";s:2:"i";s:3:"豭";s:2:"j";s:3:"豮";s:2:"k";s:3:"豯";s:2:"l";s:3:"豰";s:2:"m";s:3:"豱";s:2:"n";s:3:"豲";s:2:"o";s:3:"豳";s:2:"";s:3:"豴";s:2:"p";s:3:"豵";s:2:"q";s:3:"豶";s:2:"r";s:3:"豷";s:2:"s";s:3:"豸";s:2:"";s:3:"豹";s:2:"";s:3:"豺";s:2:"";s:3:"豻";s:2:"t";s:3:"豼";s:2:"u";s:3:"豽";s:2:"v";s:3:"豾";s:2:"w";s:3:"豿";s:2:"x";s:3:"貀";s:2:"y";s:3:"貁";s:2:"z";s:3:"貂";s:2:"";s:3:"貃";s:2:"{";s:3:"貄";s:2:"|";s:3:"貅";s:2:"";s:3:"貆";s:2:"}";s:3:"貇";s:2:"~";s:3:"貈";s:2:"؀";s:3:"貉";s:2:"";s:3:"貊";s:2:"";s:3:"貋";s:2:"؁";s:3:"貌";s:2:"ò";s:3:"貍";s:2:"؂";s:3:"貎";s:2:"؃";s:3:"貏";s:2:"؄";s:3:"貐";s:2:"؅";s:3:"貑";s:2:"؆";s:3:"貒";s:2:"؇";s:3:"貓";s:2:"؈";s:3:"貔";s:2:"";s:3:"貕";s:2:"؉";s:3:"貖";s:2:"؊";s:3:"貗";s:2:"؋";s:3:"貘";s:2:"";s:3:"貙";s:2:"،";s:3:"貚";s:2:"؍";s:3:"貛";s:2:"؎";s:3:"貜";s:2:"؏";s:3:"貝";s:2:"ؐ";s:3:"貞";s:2:"ؑ";s:3:"貟";s:2:"ؒ";s:3:"負";s:2:"ؓ";s:3:"財";s:2:"ؔ";s:3:"貢";s:2:"ؕ";s:3:"貣";s:2:"ؖ";s:3:"貤";s:2:"ؗ";s:3:"貥";s:2:"ؘ";s:3:"貦";s:2:"ؙ";s:3:"貧";s:2:"ؚ";s:3:"貨";s:2:"؛";s:3:"販";s:2:"؜";s:3:"貪";s:2:"؝";s:3:"貫";s:2:"؞";s:3:"責";s:2:"؟";s:3:"貭";s:2:"ؠ";s:3:"貮";s:2:"@";s:3:"貯";s:2:"A";s:3:"貰";s:2:"B";s:3:"貱";s:2:"C";s:3:"貲";s:2:"D";s:3:"貳";s:2:"E";s:3:"貴";s:2:"F";s:3:"貵";s:2:"G";s:3:"貶";s:2:"H";s:3:"買";s:2:"I";s:3:"貸";s:2:"J";s:3:"貹";s:2:"K";s:3:"貺";s:2:"L";s:3:"費";s:2:"M";s:3:"貼";s:2:"N";s:3:"貽";s:2:"O";s:3:"貾";s:2:"P";s:3:"貿";s:2:"Q";s:3:"賀";s:2:"R";s:3:"賁";s:2:"S";s:3:"賂";s:2:"T";s:3:"賃";s:2:"U";s:3:"賄";s:2:"V";s:3:"賅";s:2:"W";s:3:"賆";s:2:"X";s:3:"資";s:2:"Y";s:3:"賈";s:2:"Z";s:3:"賉";s:2:"[";s:3:"賊";s:2:"\";s:3:"賋";s:2:"]";s:3:"賌";s:2:"^";s:3:"賍";s:2:"_";s:3:"賎";s:2:"`";s:3:"賏";s:2:"a";s:3:"賐";s:2:"b";s:3:"賑";s:2:"c";s:3:"賒";s:2:"d";s:3:"賓";s:2:"e";s:3:"賔";s:2:"f";s:3:"賕";s:2:"g";s:3:"賖";s:2:"h";s:3:"賗";s:2:"i";s:3:"賘";s:2:"j";s:3:"賙";s:2:"k";s:3:"賚";s:2:"l";s:3:"賛";s:2:"m";s:3:"賜";s:2:"n";s:3:"賝";s:2:"o";s:3:"賞";s:2:"p";s:3:"賟";s:2:"q";s:3:"賠";s:2:"r";s:3:"賡";s:2:"s";s:3:"賢";s:2:"t";s:3:"賣";s:2:"u";s:3:"賤";s:2:"v";s:3:"賥";s:2:"w";s:3:"賦";s:2:"x";s:3:"賧";s:2:"y";s:3:"賨";s:2:"z";s:3:"賩";s:2:"{";s:3:"質";s:2:"|";s:3:"賫";s:2:"}";s:3:"賬";s:2:"~";s:3:"賭";s:2:"ـ";s:3:"賮";s:2:"ف";s:3:"賯";s:2:"ق";s:3:"賰";s:2:"ك";s:3:"賱";s:2:"ل";s:3:"賲";s:2:"م";s:3:"賳";s:2:"ن";s:3:"賴";s:2:"ه";s:3:"賵";s:2:"و";s:3:"賶";s:2:"ى";s:3:"賷";s:2:"ي";s:3:"賸";s:2:"ً";s:3:"賹";s:2:"ٌ";s:3:"賺";s:2:"ٍ";s:3:"賻";s:2:"َ";s:3:"購";s:2:"ُ";s:3:"賽";s:2:"ِ";s:3:"賾";s:2:"ّ";s:3:"賿";s:2:"ْ";s:3:"贀";s:2:"ٓ";s:3:"贁";s:2:"ٔ";s:3:"贂";s:2:"ٕ";s:3:"贃";s:2:"ٖ";s:3:"贄";s:2:"ٗ";s:3:"贅";s:2:"٘";s:3:"贆";s:2:"ٙ";s:3:"贇";s:2:"ٚ";s:3:"贈";s:2:"ٛ";s:3:"贉";s:2:"ٜ";s:3:"贊";s:2:"ٝ";s:3:"贋";s:2:"ٞ";s:3:"贌";s:2:"ٟ";s:3:"贍";s:2:"٠";s:3:"贎";s:2:"@";s:3:"贏";s:2:"A";s:3:"贐";s:2:"B";s:3:"贑";s:2:"C";s:3:"贒";s:2:"D";s:3:"贓";s:2:"E";s:3:"贔";s:2:"F";s:3:"贕";s:2:"G";s:3:"贖";s:2:"H";s:3:"贗";s:2:"I";s:3:"贘";s:2:"J";s:3:"贙";s:2:"K";s:3:"贚";s:2:"L";s:3:"贛";s:2:"M";s:3:"贜";s:2:"N";s:3:"贝";s:2:"";s:3:"贞";s:2:"";s:3:"负";s:2:"";s:3:"贠";s:2:"O";s:3:"贡";s:2:"";s:3:"财";s:2:"";s:3:"责";s:2:"";s:3:"贤";s:2:"";s:3:"败";s:2:"";s:3:"账";s:2:"";s:3:"货";s:2:"";s:3:"质";s:2:"";s:3:"贩";s:2:"";s:3:"贪";s:2:"̰";s:3:"贫";s:2:"ƶ";s:3:"贬";s:2:"";s:3:"购";s:2:"";s:3:"贮";s:2:"";s:3:"贯";s:2:"";s:3:"贰";s:2:"";s:3:"贱";s:2:"";s:3:"贲";s:2:"";s:3:"贳";s:2:"";s:3:"贴";s:2:"";s:3:"贵";s:2:"";s:3:"贶";s:2:"";s:3:"贷";s:2:"";s:3:"贸";s:2:"ó";s:3:"费";s:2:"";s:3:"贺";s:2:"";s:3:"贻";s:2:"";s:3:"贼";s:2:"";s:3:"贽";s:2:"";s:3:"贾";s:2:"";s:3:"贿";s:2:"";s:3:"赀";s:2:"";s:3:"赁";s:2:"";s:3:"赂";s:2:"¸";s:3:"赃";s:2:"";s:3:"资";s:2:"";s:3:"赅";s:2:"";s:3:"赆";s:2:"";s:3:"赇";s:2:"";s:3:"赈";s:2:"";s:3:"赉";s:2:"";s:3:"赊";s:2:"";s:3:"赋";s:2:"";s:3:"赌";s:2:"";s:3:"赍";s:2:"";s:3:"赎";s:2:"";s:3:"赏";s:2:"";s:3:"赐";s:2:"";s:3:"赑";s:2:"P";s:3:"赒";s:2:"Q";s:3:"赓";s:2:"";s:3:"赔";s:2:"";s:3:"赕";s:2:"";s:3:"赖";s:2:"";s:3:"赗";s:2:"R";s:3:"赘";s:2:"׸";s:3:"赙";s:2:"";s:3:"赚";s:2:"׬";s:3:"赛";s:2:"";s:3:"赜";s:2:"";s:3:"赝";s:2:"";s:3:"赞";s:2:"";s:3:"赟";s:2:"S";s:3:"赠";s:2:"";s:3:"赡";s:2:"";s:3:"赢";s:2:"Ӯ";s:3:"赣";s:2:"";s:3:"赤";s:2:"";s:3:"赥";s:2:"T";s:3:"赦";s:2:"";s:3:"赧";s:2:"";s:3:"赨";s:2:"U";s:3:"赩";s:2:"V";s:3:"赪";s:2:"W";s:3:"赫";s:2:"";s:3:"赬";s:2:"X";s:3:"赭";s:2:"";s:3:"赮";s:2:"Y";s:3:"赯";s:2:"Z";s:3:"走";s:2:"";s:3:"赱";s:2:"[";s:3:"赲";s:2:"\";s:3:"赳";s:2:"";s:3:"赴";s:2:"";s:3:"赵";s:2:"";s:3:"赶";s:2:"";s:3:"起";s:2:"";s:3:"赸";s:2:"]";s:3:"赹";s:2:"^";s:3:"赺";s:2:"_";s:3:"赻";s:2:"`";s:3:"赼";s:2:"a";s:3:"赽";s:2:"b";s:3:"赾";s:2:"c";s:3:"赿";s:2:"d";s:3:"趀";s:2:"e";s:3:"趁";s:2:"";s:3:"趂";s:2:"f";s:3:"趃";s:2:"g";s:3:"趄";s:2:"";s:3:"超";s:2:"";s:3:"趆";s:2:"h";s:3:"趇";s:2:"i";s:3:"趈";s:2:"j";s:3:"趉";s:2:"k";s:3:"越";s:2:"Խ";s:3:"趋";s:2:"";s:3:"趌";s:2:"l";s:3:"趍";s:2:"m";s:3:"趎";s:2:"n";s:3:"趏";s:2:"o";s:3:"趐";s:2:"p";s:3:"趑";s:2:"";s:3:"趒";s:2:"q";s:3:"趓";s:2:"r";s:3:"趔";s:2:"";s:3:"趕";s:2:"s";s:3:"趖";s:2:"t";s:3:"趗";s:2:"u";s:3:"趘";s:2:"v";s:3:"趙";s:2:"w";s:3:"趚";s:2:"x";s:3:"趛";s:2:"y";s:3:"趜";s:2:"z";s:3:"趝";s:2:"{";s:3:"趞";s:2:"|";s:3:"趟";s:2:"";s:3:"趠";s:2:"}";s:3:"趡";s:2:"~";s:3:"趢";s:2:"ڀ";s:3:"趣";s:2:"Ȥ";s:3:"趤";s:2:"ځ";s:3:"趥";s:2:"ڂ";s:3:"趦";s:2:"ڃ";s:3:"趧";s:2:"ڄ";s:3:"趨";s:2:"څ";s:3:"趩";s:2:"چ";s:3:"趪";s:2:"ڇ";s:3:"趫";s:2:"ڈ";s:3:"趬";s:2:"ډ";s:3:"趭";s:2:"ڊ";s:3:"趮";s:2:"ڋ";s:3:"趯";s:2:"ڌ";s:3:"趰";s:2:"ڍ";s:3:"趱";s:2:"";s:3:"趲";s:2:"ڎ";s:3:"足";s:2:"";s:3:"趴";s:2:"ſ";s:3:"趵";s:2:"";s:3:"趶";s:2:"ڏ";s:3:"趷";s:2:"ڐ";s:3:"趸";s:2:"";s:3:"趹";s:2:"ڑ";s:3:"趺";s:2:"";s:3:"趻";s:2:"ڒ";s:3:"趼";s:2:"";s:3:"趽";s:2:"ړ";s:3:"趾";s:2:"ֺ";s:3:"趿";s:2:"";s:3:"跀";s:2:"ڔ";s:3:"跁";s:2:"ڕ";s:3:"跂";s:2:"ږ";s:3:"跃";s:2:"Ծ";s:3:"跄";s:2:"";s:3:"跅";s:2:"ڗ";s:3:"跆";s:2:"";s:3:"跇";s:2:"ژ";s:3:"跈";s:2:"ڙ";s:3:"跉";s:2:"ښ";s:3:"跊";s:2:"ڛ";s:3:"跋";s:2:"";s:3:"跌";s:2:"";s:3:"跍";s:2:"ڜ";s:3:"跎";s:2:"";s:3:"跏";s:2:"";s:3:"跐";s:2:"ڝ";s:3:"跑";s:2:"";s:3:"跒";s:2:"ڞ";s:3:"跓";s:2:"ڟ";s:3:"跔";s:2:"ڠ";s:3:"跕";s:2:"@";s:3:"跖";s:2:"";s:3:"跗";s:2:"";s:3:"跘";s:2:"A";s:3:"跙";s:2:"B";s:3:"跚";s:2:"";s:3:"跛";s:2:"";s:3:"跜";s:2:"C";s:3:"距";s:2:"";s:3:"跞";s:2:"";s:3:"跟";s:2:"";s:3:"跠";s:2:"D";s:3:"跡";s:2:"E";s:3:"跢";s:2:"F";s:3:"跣";s:2:"";s:3:"跤";s:2:"";s:3:"跥";s:2:"G";s:3:"跦";s:2:"H";s:3:"跧";s:2:"I";s:3:"跨";s:2:"";s:3:"跩";s:2:"J";s:3:"跪";s:2:"";s:3:"跫";s:2:"";s:3:"跬";s:2:"";s:3:"跭";s:2:"K";s:3:"跮";s:2:"L";s:3:"路";s:2:"·";s:3:"跰";s:2:"M";s:3:"跱";s:2:"N";s:3:"跲";s:2:"O";s:3:"跳";s:2:"";s:3:"跴";s:2:"P";s:3:"践";s:2:"";s:3:"跶";s:2:"Q";s:3:"跷";s:2:"";s:3:"跸";s:2:"";s:3:"跹";s:2:"";s:3:"跺";s:2:"";s:3:"跻";s:2:"";s:3:"跼";s:2:"R";s:3:"跽";s:2:"";s:3:"跾";s:2:"S";s:3:"跿";s:2:"T";s:3:"踀";s:2:"U";s:3:"踁";s:2:"V";s:3:"踂";s:2:"W";s:3:"踃";s:2:"X";s:3:"踄";s:2:"Y";s:3:"踅";s:2:"";s:3:"踆";s:2:"Z";s:3:"踇";s:2:"[";s:3:"踈";s:2:"\";s:3:"踉";s:2:"";s:3:"踊";s:2:"ӻ";s:3:"踋";s:2:"]";s:3:"踌";s:2:"";s:3:"踍";s:2:"^";s:3:"踎";s:2:"_";s:3:"踏";s:2:"̤";s:3:"踐";s:2:"`";s:3:"踑";s:2:"a";s:3:"踒";s:2:"b";s:3:"踓";s:2:"c";s:3:"踔";s:2:"";s:3:"踕";s:2:"d";s:3:"踖";s:2:"e";s:3:"踗";s:2:"f";s:3:"踘";s:2:"g";s:3:"踙";s:2:"h";s:3:"踚";s:2:"i";s:3:"踛";s:2:"j";s:3:"踜";s:2:"k";s:3:"踝";s:2:"";s:3:"踞";s:2:"";s:3:"踟";s:2:"";s:3:"踠";s:2:"l";s:3:"踡";s:2:"m";s:3:"踢";s:2:"";s:3:"踣";s:2:"";s:3:"踤";s:2:"n";s:3:"踥";s:2:"o";s:3:"踦";s:2:"p";s:3:"踧";s:2:"q";s:3:"踨";s:2:"r";s:3:"踩";s:2:"";s:3:"踪";s:2:"";s:3:"踫";s:2:"s";s:3:"踬";s:2:"";s:3:"踭";s:2:"t";s:3:"踮";s:2:"";s:3:"踯";s:2:"";s:3:"踰";s:2:"u";s:3:"踱";s:2:"";s:3:"踲";s:2:"v";s:3:"踳";s:2:"w";s:3:"踴";s:2:"x";s:3:"踵";s:2:"";s:3:"踶";s:2:"y";s:3:"踷";s:2:"z";s:3:"踸";s:2:"{";s:3:"踹";s:2:"";s:3:"踺";s:2:"";s:3:"踻";s:2:"|";s:3:"踼";s:2:"}";s:3:"踽";s:2:"";s:3:"踾";s:2:"~";s:3:"踿";s:2:"ۀ";s:3:"蹀";s:2:"";s:3:"蹁";s:2:"";s:3:"蹂";s:2:"";s:3:"蹃";s:2:"ہ";s:3:"蹄";s:2:"";s:3:"蹅";s:2:"ۂ";s:3:"蹆";s:2:"ۃ";s:3:"蹇";s:2:"";s:3:"蹈";s:2:"";s:3:"蹉";s:2:"";s:3:"蹊";s:2:"";s:3:"蹋";s:2:"̣";s:3:"蹌";s:2:"ۄ";s:3:"蹍";s:2:"ۅ";s:3:"蹎";s:2:"ۆ";s:3:"蹏";s:2:"ۇ";s:3:"蹐";s:2:"ۈ";s:3:"蹑";s:2:"";s:3:"蹒";s:2:"";s:3:"蹓";s:2:"ۉ";s:3:"蹔";s:2:"ۊ";s:3:"蹕";s:2:"ۋ";s:3:"蹖";s:2:"ی";s:3:"蹗";s:2:"ۍ";s:3:"蹘";s:2:"ێ";s:3:"蹙";s:2:"";s:3:"蹚";s:2:"ۏ";s:3:"蹛";s:2:"ې";s:3:"蹜";s:2:"ۑ";s:3:"蹝";s:2:"ے";s:3:"蹞";s:2:"ۓ";s:3:"蹟";s:2:"۔";s:3:"蹠";s:2:"ە";s:3:"蹡";s:2:"ۖ";s:3:"蹢";s:2:"ۗ";s:3:"蹣";s:2:"ۘ";s:3:"蹤";s:2:"ۙ";s:3:"蹥";s:2:"ۚ";s:3:"蹦";s:2:"";s:3:"蹧";s:2:"ۛ";s:3:"蹨";s:2:"ۜ";s:3:"蹩";s:2:"";s:3:"蹪";s:2:"۝";s:3:"蹫";s:2:"۞";s:3:"蹬";s:2:"";s:3:"蹭";s:2:"";s:3:"蹮";s:2:"۟";s:3:"蹯";s:2:"";s:3:"蹰";s:2:"";s:3:"蹱";s:2:"۠";s:3:"蹲";s:2:"";s:3:"蹳";s:2:"@";s:3:"蹴";s:2:"";s:3:"蹵";s:2:"A";s:3:"蹶";s:2:"";s:3:"蹷";s:2:"B";s:3:"蹸";s:2:"C";s:3:"蹹";s:2:"D";s:3:"蹺";s:2:"E";s:3:"蹻";s:2:"F";s:3:"蹼";s:2:"";s:3:"蹽";s:2:"G";s:3:"蹾";s:2:"H";s:3:"蹿";s:2:"";s:3:"躀";s:2:"I";s:3:"躁";s:2:"";s:3:"躂";s:2:"J";s:3:"躃";s:2:"K";s:3:"躄";s:2:"L";s:3:"躅";s:2:"";s:3:"躆";s:2:"M";s:3:"躇";s:2:"";s:3:"躈";s:2:"N";s:3:"躉";s:2:"O";s:3:"躊";s:2:"P";s:3:"躋";s:2:"Q";s:3:"躌";s:2:"R";s:3:"躍";s:2:"S";s:3:"躎";s:2:"T";s:3:"躏";s:2:"";s:3:"躐";s:2:"";s:3:"躑";s:2:"U";s:3:"躒";s:2:"V";s:3:"躓";s:2:"W";s:3:"躔";s:2:"";s:3:"躕";s:2:"X";s:3:"躖";s:2:"Y";s:3:"躗";s:2:"Z";s:3:"躘";s:2:"[";s:3:"躙";s:2:"\";s:3:"躚";s:2:"]";s:3:"躛";s:2:"^";s:3:"躜";s:2:"";s:3:"躝";s:2:"_";s:3:"躞";s:2:"";s:3:"躟";s:2:"`";s:3:"躠";s:2:"a";s:3:"躡";s:2:"b";s:3:"躢";s:2:"c";s:3:"躣";s:2:"d";s:3:"躤";s:2:"e";s:3:"躥";s:2:"f";s:3:"躦";s:2:"g";s:3:"躧";s:2:"h";s:3:"躨";s:2:"i";s:3:"躩";s:2:"j";s:3:"躪";s:2:"k";s:3:"身";s:2:"";s:3:"躬";s:2:"";s:3:"躭";s:2:"l";s:3:"躮";s:2:"m";s:3:"躯";s:2:"";s:3:"躰";s:2:"n";s:3:"躱";s:2:"o";s:3:"躲";s:2:"";s:3:"躳";s:2:"p";s:3:"躴";s:2:"q";s:3:"躵";s:2:"r";s:3:"躶";s:2:"s";s:3:"躷";s:2:"t";s:3:"躸";s:2:"u";s:3:"躹";s:2:"v";s:3:"躺";s:2:"";s:3:"躻";s:2:"w";s:3:"躼";s:2:"x";s:3:"躽";s:2:"y";s:3:"躾";s:2:"z";s:3:"躿";s:2:"{";s:3:"軀";s:2:"|";s:3:"軁";s:2:"}";s:3:"軂";s:2:"~";s:3:"軃";s:2:"܀";s:3:"軄";s:2:"܁";s:3:"軅";s:2:"܂";s:3:"軆";s:2:"܃";s:3:"軇";s:2:"܄";s:3:"軈";s:2:"܅";s:3:"軉";s:2:"܆";s:3:"車";s:2:"܇";s:3:"軋";s:2:"܈";s:3:"軌";s:2:"܉";s:3:"軍";s:2:"܊";s:3:"軎";s:2:"";s:3:"軏";s:2:"܋";s:3:"軐";s:2:"܌";s:3:"軑";s:2:"܍";s:3:"軒";s:2:"܎";s:3:"軓";s:2:"܏";s:3:"軔";s:2:"ܐ";s:3:"軕";s:2:"ܑ";s:3:"軖";s:2:"ܒ";s:3:"軗";s:2:"ܓ";s:3:"軘";s:2:"ܔ";s:3:"軙";s:2:"ܕ";s:3:"軚";s:2:"ܖ";s:3:"軛";s:2:"ܗ";s:3:"軜";s:2:"ܘ";s:3:"軝";s:2:"ܙ";s:3:"軞";s:2:"ܚ";s:3:"軟";s:2:"ܛ";s:3:"軠";s:2:"ܜ";s:3:"軡";s:2:"ܝ";s:3:"転";s:2:"ܞ";s:3:"軣";s:2:"ܟ";s:3:"軤";s:2:"ܠ";s:3:"軥";s:2:"@";s:3:"軦";s:2:"A";s:3:"軧";s:2:"B";s:3:"軨";s:2:"C";s:3:"軩";s:2:"D";s:3:"軪";s:2:"E";s:3:"軫";s:2:"F";s:3:"軬";s:2:"G";s:3:"軭";s:2:"H";s:3:"軮";s:2:"I";s:3:"軯";s:2:"J";s:3:"軰";s:2:"K";s:3:"軱";s:2:"L";s:3:"軲";s:2:"M";s:3:"軳";s:2:"N";s:3:"軴";s:2:"O";s:3:"軵";s:2:"P";s:3:"軶";s:2:"Q";s:3:"軷";s:2:"R";s:3:"軸";s:2:"S";s:3:"軹";s:2:"T";s:3:"軺";s:2:"U";s:3:"軻";s:2:"V";s:3:"軼";s:2:"W";s:3:"軽";s:2:"X";s:3:"軾";s:2:"Y";s:3:"軿";s:2:"Z";s:3:"輀";s:2:"[";s:3:"輁";s:2:"\";s:3:"輂";s:2:"]";s:3:"較";s:2:"^";s:3:"輄";s:2:"_";s:3:"輅";s:2:"`";s:3:"輆";s:2:"a";s:3:"輇";s:2:"b";s:3:"輈";s:2:"c";s:3:"載";s:2:"d";s:3:"輊";s:2:"e";s:3:"輋";s:2:"f";s:3:"輌";s:2:"g";s:3:"輍";s:2:"h";s:3:"輎";s:2:"i";s:3:"輏";s:2:"j";s:3:"輐";s:2:"k";s:3:"輑";s:2:"l";s:3:"輒";s:2:"m";s:3:"輓";s:2:"n";s:3:"輔";s:2:"o";s:3:"輕";s:2:"p";s:3:"輖";s:2:"q";s:3:"輗";s:2:"r";s:3:"輘";s:2:"s";s:3:"輙";s:2:"t";s:3:"輚";s:2:"u";s:3:"輛";s:2:"v";s:3:"輜";s:2:"w";s:3:"輝";s:2:"x";s:3:"輞";s:2:"y";s:3:"輟";s:2:"z";s:3:"輠";s:2:"{";s:3:"輡";s:2:"|";s:3:"輢";s:2:"}";s:3:"輣";s:2:"~";s:3:"輤";s:2:"݀";s:3:"輥";s:2:"݁";s:3:"輦";s:2:"݂";s:3:"輧";s:2:"݃";s:3:"輨";s:2:"݄";s:3:"輩";s:2:"݅";s:3:"輪";s:2:"݆";s:3:"輫";s:2:"݇";s:3:"輬";s:2:"݈";s:3:"輭";s:2:"݉";s:3:"輮";s:2:"݊";s:3:"輯";s:2:"݋";s:3:"輰";s:2:"݌";s:3:"輱";s:2:"ݍ";s:3:"輲";s:2:"ݎ";s:3:"輳";s:2:"ݏ";s:3:"輴";s:2:"ݐ";s:3:"輵";s:2:"ݑ";s:3:"輶";s:2:"ݒ";s:3:"輷";s:2:"ݓ";s:3:"輸";s:2:"ݔ";s:3:"輹";s:2:"ݕ";s:3:"輺";s:2:"ݖ";s:3:"輻";s:2:"ݗ";s:3:"輼";s:2:"ݘ";s:3:"輽";s:2:"ݙ";s:3:"輾";s:2:"ݚ";s:3:"輿";s:2:"ݛ";s:3:"轀";s:2:"ݜ";s:3:"轁";s:2:"ݝ";s:3:"轂";s:2:"ݞ";s:3:"轃";s:2:"ݟ";s:3:"轄";s:2:"ݠ";s:3:"轅";s:2:"@";s:3:"轆";s:2:"A";s:3:"轇";s:2:"B";s:3:"轈";s:2:"C";s:3:"轉";s:2:"D";s:3:"轊";s:2:"E";s:3:"轋";s:2:"F";s:3:"轌";s:2:"G";s:3:"轍";s:2:"H";s:3:"轎";s:2:"I";s:3:"轏";s:2:"J";s:3:"轐";s:2:"K";s:3:"轑";s:2:"L";s:3:"轒";s:2:"M";s:3:"轓";s:2:"N";s:3:"轔";s:2:"O";s:3:"轕";s:2:"P";s:3:"轖";s:2:"Q";s:3:"轗";s:2:"R";s:3:"轘";s:2:"S";s:3:"轙";s:2:"T";s:3:"轚";s:2:"U";s:3:"轛";s:2:"V";s:3:"轜";s:2:"W";s:3:"轝";s:2:"X";s:3:"轞";s:2:"Y";s:3:"轟";s:2:"Z";s:3:"轠";s:2:"[";s:3:"轡";s:2:"\";s:3:"轢";s:2:"]";s:3:"轣";s:2:"^";s:3:"轤";s:2:"_";s:3:"轥";s:2:"`";s:3:"车";s:2:"";s:3:"轧";s:2:"";s:3:"轨";s:2:"";s:3:"轩";s:2:"";s:3:"轪";s:2:"a";s:3:"轫";s:2:"";s:3:"转";s:2:"ת";s:3:"轭";s:2:"";s:3:"轮";s:2:"";s:3:"软";s:2:"";s:3:"轰";s:2:"";s:3:"轱";s:2:"";s:3:"轲";s:2:"";s:3:"轳";s:2:"";s:3:"轴";s:2:"";s:3:"轵";s:2:"";s:3:"轶";s:2:"";s:3:"轷";s:2:"";s:3:"轸";s:2:"";s:3:"轹";s:2:"";s:3:"轺";s:2:"";s:3:"轻";s:2:"";s:3:"轼";s:2:"";s:3:"载";s:2:"";s:3:"轾";s:2:"";s:3:"轿";s:2:"";s:3:"辀";s:2:"b";s:3:"辁";s:2:"";s:3:"辂";s:2:"";s:3:"较";s:2:"";s:3:"辄";s:2:"";s:3:"辅";s:2:"";s:3:"辆";s:2:"";s:3:"辇";s:2:"";s:3:"辈";s:2:"";s:3:"辉";s:2:"";s:3:"辊";s:2:"";s:3:"辋";s:2:"";s:3:"辌";s:2:"c";s:3:"辍";s:2:"";s:3:"辎";s:2:"";s:3:"辏";s:2:"";s:3:"辐";s:2:"";s:3:"辑";s:2:"";s:3:"辒";s:2:"d";s:3:"输";s:2:"";s:3:"辔";s:2:"";s:3:"辕";s:2:"ԯ";s:3:"辖";s:2:"Ͻ";s:3:"辗";s:2:"շ";s:3:"辘";s:2:"";s:3:"辙";s:2:"";s:3:"辚";s:2:"";s:3:"辛";s:2:"";s:3:"辜";s:2:"";s:3:"辝";s:2:"e";s:3:"辞";s:2:"";s:3:"辟";s:2:"";s:3:"辠";s:2:"f";s:3:"辡";s:2:"g";s:3:"辢";s:2:"h";s:3:"辣";s:2:"";s:3:"辤";s:2:"i";s:3:"辥";s:2:"j";s:3:"辦";s:2:"k";s:3:"辧";s:2:"l";s:3:"辨";s:2:"";s:3:"辩";s:2:"";s:3:"辪";s:2:"m";s:3:"辫";s:2:"";s:3:"辬";s:2:"n";s:3:"辭";s:2:"o";s:3:"辮";s:2:"p";s:3:"辯";s:2:"q";s:3:"辰";s:2:"";s:3:"辱";s:2:"";s:3:"農";s:2:"r";s:3:"辳";s:2:"s";s:3:"辴";s:2:"t";s:3:"辵";s:2:"u";s:3:"辶";s:2:"";s:3:"辷";s:2:"v";s:3:"辸";s:2:"w";s:3:"边";s:2:"";s:3:"辺";s:2:"x";s:3:"辻";s:2:"y";s:3:"込";s:2:"z";s:3:"辽";s:2:"";s:3:"达";s:2:"";s:3:"辿";s:2:"{";s:3:"迀";s:2:"|";s:3:"迁";s:2:"Ǩ";s:3:"迂";s:2:"";s:3:"迃";s:2:"}";s:3:"迄";s:2:"";s:3:"迅";s:2:"Ѹ";s:3:"迆";s:2:"~";s:3:"过";s:2:"";s:3:"迈";s:2:"";s:3:"迉";s:2:"ހ";s:3:"迊";s:2:"ށ";s:3:"迋";s:2:"ނ";s:3:"迌";s:2:"ރ";s:3:"迍";s:2:"ބ";s:3:"迎";s:2:"ӭ";s:3:"迏";s:2:"ޅ";s:3:"运";s:2:"";s:3:"近";s:2:"";s:3:"迒";s:2:"ކ";s:3:"迓";s:2:"";s:3:"返";s:2:"";s:3:"迕";s:2:"";s:3:"迖";s:2:"އ";s:3:"迗";s:2:"ވ";s:3:"还";s:2:"";s:3:"这";s:2:"";s:3:"迚";s:2:"މ";s:3:"进";s:2:"";s:3:"远";s:2:"Զ";s:3:"违";s:2:"Υ";s:3:"连";s:2:"";s:3:"迟";s:2:"";s:3:"迠";s:2:"ފ";s:3:"迡";s:2:"ދ";s:3:"迢";s:2:"";s:3:"迣";s:2:"ތ";s:3:"迤";s:2:"";s:3:"迥";s:2:"";s:3:"迦";s:2:"";s:3:"迧";s:2:"ލ";s:3:"迨";s:2:"";s:3:"迩";s:2:"";s:3:"迪";s:2:"";s:3:"迫";s:2:"";s:3:"迬";s:2:"ގ";s:3:"迭";s:2:"";s:3:"迮";s:2:"";s:3:"迯";s:2:"ޏ";s:3:"述";s:2:"";s:3:"迱";s:2:"ސ";s:3:"迲";s:2:"ޑ";s:3:"迳";s:2:"";s:3:"迴";s:2:"ޒ";s:3:"迵";s:2:"ޓ";s:3:"迶";s:2:"ޔ";s:3:"迷";s:2:"";s:3:"迸";s:2:"";s:3:"迹";s:2:"";s:3:"迺";s:2:"ޕ";s:3:"迻";s:2:"ޖ";s:3:"迼";s:2:"ޗ";s:3:"追";s:2:"׷";s:3:"迾";s:2:"ޘ";s:3:"迿";s:2:"ޙ";s:3:"退";s:2:"";s:3:"送";s:2:"";s:3:"适";s:2:"";s:3:"逃";s:2:"";s:3:"逄";s:2:"";s:3:"逅";s:2:"";s:3:"逆";s:2:"";s:3:"逇";s:2:"ޚ";s:3:"逈";s:2:"ޛ";s:3:"选";s:2:"ѡ";s:3:"逊";s:2:"ѷ";s:3:"逋";s:2:"";s:3:"逌";s:2:"ޜ";s:3:"逍";s:2:"";s:3:"逎";s:2:"ޝ";s:3:"透";s:2:"͸";s:3:"逐";s:2:"";s:3:"逑";s:2:"";s:3:"递";s:2:"";s:3:"逓";s:2:"ޞ";s:3:"途";s:2:";";s:3:"逕";s:2:"ޟ";s:3:"逖";s:2:"";s:3:"逗";s:2:"";s:3:"逘";s:2:"ޠ";s:3:"這";s:2:"@";s:3:"通";s:2:"ͨ";s:3:"逛";s:2:"";s:3:"逜";s:2:"A";s:3:"逝";s:2:"";s:3:"逞";s:2:"";s:3:"速";s:2:"";s:3:"造";s:2:"";s:3:"逡";s:2:"";s:3:"逢";s:2:"";s:3:"連";s:2:"B";s:3:"逤";s:2:"C";s:3:"逥";s:2:"D";s:3:"逦";s:2:"";s:3:"逧";s:2:"E";s:3:"逨";s:2:"F";s:3:"逩";s:2:"G";s:3:"逪";s:2:"H";s:3:"逫";s:2:"I";s:3:"逬";s:2:"J";s:3:"逭";s:2:"";s:3:"逮";s:2:"";s:3:"逯";s:2:"";s:3:"逰";s:2:"K";s:3:"週";s:2:"L";s:3:"進";s:2:"M";s:3:"逳";s:2:"N";s:3:"逴";s:2:"O";s:3:"逵";s:2:"";s:3:"逶";s:2:"";s:3:"逷";s:2:"P";s:3:"逸";s:2:"";s:3:"逹";s:2:"Q";s:3:"逺";s:2:"R";s:3:"逻";s:2:"";s:3:"逼";s:2:"";s:3:"逽";s:2:"S";s:3:"逾";s:2:"";s:3:"逿";s:2:"T";s:3:"遀";s:2:"U";s:3:"遁";s:2:"";s:3:"遂";s:2:"";s:3:"遃";s:2:"V";s:3:"遄";s:2:"";s:3:"遅";s:2:"W";s:3:"遆";s:2:"X";s:3:"遇";s:2:"";s:3:"遈";s:2:"Y";s:3:"遉";s:2:"Z";s:3:"遊";s:2:"[";s:3:"運";s:2:"\";s:3:"遌";s:2:"]";s:3:"遍";s:2:"";s:3:"過";s:2:"^";s:3:"遏";s:2:"";s:3:"遐";s:2:"";s:3:"遑";s:2:"";s:3:"遒";s:2:"";s:3:"道";s:2:"";s:3:"達";s:2:"_";s:3:"違";s:2:"`";s:3:"遖";s:2:"a";s:3:"遗";s:2:"";s:3:"遘";s:2:"";s:3:"遙";s:2:"b";s:3:"遚";s:2:"c";s:3:"遛";s:2:"";s:3:"遜";s:2:"d";s:3:"遝";s:2:"e";s:3:"遞";s:2:"f";s:3:"遟";s:2:"g";s:3:"遠";s:2:"h";s:3:"遡";s:2:"i";s:3:"遢";s:2:"";s:3:"遣";s:2:"ǲ";s:3:"遤";s:2:"j";s:3:"遥";s:2:"ң";s:3:"遦";s:2:"k";s:3:"遧";s:2:"l";s:3:"遨";s:2:"";s:3:"適";s:2:"m";s:3:"遪";s:2:"n";s:3:"遫";s:2:"o";s:3:"遬";s:2:"p";s:3:"遭";s:2:"";s:3:"遮";s:2:"";s:3:"遯";s:2:"q";s:3:"遰";s:2:"r";s:3:"遱";s:2:"s";s:3:"遲";s:2:"t";s:3:"遳";s:2:"u";s:3:"遴";s:2:"";s:3:"遵";s:2:"";s:3:"遶";s:2:"v";s:3:"遷";s:2:"w";s:3:"選";s:2:"x";s:3:"遹";s:2:"y";s:3:"遺";s:2:"z";s:3:"遻";s:2:"{";s:3:"遼";s:2:"|";s:3:"遽";s:2:"";s:3:"遾";s:2:"}";s:3:"避";s:2:"";s:3:"邀";s:2:"";s:3:"邁";s:2:"~";s:3:"邂";s:2:"";s:3:"邃";s:2:"";s:3:"還";s:2:"߀";s:3:"邅";s:2:"߁";s:3:"邆";s:2:"߂";s:3:"邇";s:2:"߃";s:3:"邈";s:2:"";s:3:"邉";s:2:"߄";s:3:"邊";s:2:"߅";s:3:"邋";s:2:"";s:3:"邌";s:2:"߆";s:3:"邍";s:2:"߇";s:3:"邎";s:2:"߈";s:3:"邏";s:2:"߉";s:3:"邐";s:2:"ߊ";s:3:"邑";s:2:"";s:3:"邒";s:2:"ߋ";s:3:"邓";s:2:"";s:3:"邔";s:2:"ߌ";s:3:"邕";s:2:"";s:3:"邖";s:2:"ߍ";s:3:"邗";s:2:"";s:3:"邘";s:2:"ߎ";s:3:"邙";s:2:"";s:3:"邚";s:2:"ߏ";s:3:"邛";s:2:"";s:3:"邜";s:2:"ߐ";s:3:"邝";s:2:"";s:3:"邞";s:2:"ߑ";s:3:"邟";s:2:"ߒ";s:3:"邠";s:2:"ߓ";s:3:"邡";s:2:"";s:3:"邢";s:2:"";s:3:"那";s:2:"";s:3:"邤";s:2:"ߔ";s:3:"邥";s:2:"ߕ";s:3:"邦";s:2:"";s:3:"邧";s:2:"ߖ";s:3:"邨";s:2:"ߗ";s:3:"邩";s:2:"ߘ";s:3:"邪";s:2:"а";s:3:"邫";s:2:"ߙ";s:3:"邬";s:2:"";s:3:"邭";s:2:"ߚ";s:3:"邮";s:2:"";s:3:"邯";s:2:"";s:3:"邰";s:2:"ۢ";s:3:"邱";s:2:"";s:3:"邲";s:2:"ߛ";s:3:"邳";s:2:"";s:3:"邴";s:2:"";s:3:"邵";s:2:"";s:3:"邶";s:2:"";s:3:"邷";s:2:"ߜ";s:3:"邸";s:2:"ۡ";s:3:"邹";s:2:"";s:3:"邺";s:2:"";s:3:"邻";s:2:"";s:3:"邼";s:2:"ߝ";s:3:"邽";s:2:"ߞ";s:3:"邾";s:2:"ۥ";s:3:"邿";s:2:"ߟ";s:3:"郀";s:2:"ߠ";s:3:"郁";s:2:"";s:3:"郂";s:2:"@";s:3:"郃";s:2:"A";s:3:"郄";s:2:"ۧ";s:3:"郅";s:2:"ۤ";s:3:"郆";s:2:"B";s:3:"郇";s:2:"ۨ";s:3:"郈";s:2:"C";s:3:"郉";s:2:"D";s:3:"郊";s:2:"";s:3:"郋";s:2:"E";s:3:"郌";s:2:"F";s:3:"郍";s:2:"G";s:3:"郎";s:2:"";s:3:"郏";s:2:"ۣ";s:3:"郐";s:2:"ۦ";s:3:"郑";s:2:"֣";s:3:"郒";s:2:"H";s:3:"郓";s:2:"۩";s:3:"郔";s:2:"I";s:3:"郕";s:2:"J";s:3:"郖";s:2:"K";s:3:"郗";s:2:"ۭ";s:3:"郘";s:2:"L";s:3:"郙";s:2:"M";s:3:"郚";s:2:"N";s:3:"郛";s:2:"ۮ";s:3:"郜";s:2:"۬";s:3:"郝";s:2:"";s:3:"郞";s:2:"O";s:3:"郟";s:2:"P";s:3:"郠";s:2:"Q";s:3:"郡";s:2:"";s:3:"郢";s:2:"۫";s:3:"郣";s:2:"R";s:3:"郤";s:2:"S";s:3:"郥";s:2:"T";s:3:"郦";s:2:"۪";s:3:"郧";s:2:"";s:3:"部";s:2:"";s:3:"郩";s:2:"U";s:3:"郪";s:2:"V";s:3:"郫";s:2:"ۯ";s:3:"郬";s:2:"W";s:3:"郭";s:2:"";s:3:"郮";s:2:"X";s:3:"郯";s:2:"۰";s:3:"郰";s:2:"Y";s:3:"郱";s:2:"Z";s:3:"郲";s:2:"[";s:3:"郳";s:2:"\";s:3:"郴";s:2:"";s:3:"郵";s:2:"]";s:3:"郶";s:2:"^";s:3:"郷";s:2:"_";s:3:"郸";s:2:"";s:3:"郹";s:2:"`";s:3:"郺";s:2:"a";s:3:"郻";s:2:"b";s:3:"郼";s:2:"c";s:3:"都";s:2:"";s:3:"郾";s:2:"۱";s:3:"郿";s:2:"d";s:3:"鄀";s:2:"e";s:3:"鄁";s:2:"f";s:3:"鄂";s:2:"";s:3:"鄃";s:2:"g";s:3:"鄄";s:2:"۲";s:3:"鄅";s:2:"h";s:3:"鄆";s:2:"i";s:3:"鄇";s:2:"j";s:3:"鄈";s:2:"k";s:3:"鄉";s:2:"l";s:3:"鄊";s:2:"m";s:3:"鄋";s:2:"n";s:3:"鄌";s:2:"o";s:3:"鄍";s:2:"p";s:3:"鄎";s:2:"q";s:3:"鄏";s:2:"r";s:3:"鄐";s:2:"s";s:3:"鄑";s:2:"t";s:3:"鄒";s:2:"u";s:3:"鄓";s:2:"v";s:3:"鄔";s:2:"w";s:3:"鄕";s:2:"x";s:3:"鄖";s:2:"y";s:3:"鄗";s:2:"z";s:3:"鄘";s:2:"{";s:3:"鄙";s:2:"";s:3:"鄚";s:2:"|";s:3:"鄛";s:2:"}";s:3:"鄜";s:2:"~";s:3:"鄝";s:2:"";s:3:"鄞";s:2:"۴";s:3:"鄟";s:2:"";s:3:"鄠";s:2:"";s:3:"鄡";s:2:"";s:3:"鄢";s:2:"۳";s:3:"鄣";s:2:"۵";s:3:"鄤";s:2:"";s:3:"鄥";s:2:"";s:3:"鄦";s:2:"";s:3:"鄧";s:2:"";s:3:"鄨";s:2:"";s:3:"鄩";s:2:"";s:3:"鄪";s:2:"";s:3:"鄫";s:2:"";s:3:"鄬";s:2:"";s:3:"鄭";s:2:"";s:3:"鄮";s:2:"";s:3:"鄯";s:2:"۷";s:3:"鄰";s:2:"";s:3:"鄱";s:2:"۶";s:3:"鄲";s:2:"";s:3:"鄳";s:2:"";s:3:"鄴";s:2:"";s:3:"鄵";s:2:"";s:3:"鄶";s:2:"";s:3:"鄷";s:2:"";s:3:"鄸";s:2:"";s:3:"鄹";s:2:"۸";s:3:"鄺";s:2:"";s:3:"鄻";s:2:"";s:3:"鄼";s:2:"";s:3:"鄽";s:2:"";s:3:"鄾";s:2:"";s:3:"鄿";s:2:"";s:3:"酀";s:2:"";s:3:"酁";s:2:"";s:3:"酂";s:2:"";s:3:"酃";s:2:"۹";s:3:"酄";s:2:"";s:3:"酅";s:2:"@";s:3:"酆";s:2:"ۺ";s:3:"酇";s:2:"A";s:3:"酈";s:2:"B";s:3:"酉";s:2:"";s:3:"酊";s:2:"";s:3:"酋";s:2:"";s:3:"酌";s:2:"";s:3:"配";s:2:"";s:3:"酎";s:2:"";s:3:"酏";s:2:"";s:3:"酐";s:2:"";s:3:"酑";s:2:"C";s:3:"酒";s:2:"";s:3:"酓";s:2:"D";s:3:"酔";s:2:"E";s:3:"酕";s:2:"F";s:3:"酖";s:2:"G";s:3:"酗";s:2:"";s:3:"酘";s:2:"H";s:3:"酙";s:2:"I";s:3:"酚";s:2:"";s:3:"酛";s:2:"J";s:3:"酜";s:2:"K";s:3:"酝";s:2:"";s:3:"酞";s:2:"̪";s:3:"酟";s:2:"L";s:3:"酠";s:2:"M";s:3:"酡";s:2:"";s:3:"酢";s:2:"";s:3:"酣";s:2:"";s:3:"酤";s:2:"";s:3:"酥";s:2:"";s:3:"酦";s:2:"N";s:3:"酧";s:2:"O";s:3:"酨";s:2:"P";s:3:"酩";s:2:"";s:3:"酪";s:2:"";s:3:"酫";s:2:"Q";s:3:"酬";s:2:"";s:3:"酭";s:2:"R";s:3:"酮";s:2:"ͪ";s:3:"酯";s:2:"";s:3:"酰";s:2:"";s:3:"酱";s:2:"";s:3:"酲";s:2:"";s:3:"酳";s:2:"S";s:3:"酴";s:2:"";s:3:"酵";s:2:"";s:3:"酶";s:2:"ø";s:3:"酷";s:2:"";s:3:"酸";s:2:"";s:3:"酹";s:2:"";s:3:"酺";s:2:"T";s:3:"酻";s:2:"U";s:3:"酼";s:2:"V";s:3:"酽";s:2:"";s:3:"酾";s:2:"";s:3:"酿";s:2:"";s:3:"醀";s:2:"W";s:3:"醁";s:2:"X";s:3:"醂";s:2:"Y";s:3:"醃";s:2:"Z";s:3:"醄";s:2:"[";s:3:"醅";s:2:"";s:3:"醆";s:2:"\";s:3:"醇";s:2:"";s:3:"醈";s:2:"]";s:3:"醉";s:2:"";s:3:"醊";s:2:"^";s:3:"醋";s:2:"";s:3:"醌";s:2:"";s:3:"醍";s:2:"";s:3:"醎";s:2:"_";s:3:"醏";s:2:"`";s:3:"醐";s:2:"";s:3:"醑";s:2:"";s:3:"醒";s:2:"";s:3:"醓";s:2:"a";s:3:"醔";s:2:"b";s:3:"醕";s:2:"c";s:3:"醖";s:2:"d";s:3:"醗";s:2:"e";s:3:"醘";s:2:"f";s:3:"醙";s:2:"g";s:3:"醚";s:2:"";s:3:"醛";s:2:"ȩ";s:3:"醜";s:2:"h";s:3:"醝";s:2:"i";s:3:"醞";s:2:"j";s:3:"醟";s:2:"k";s:3:"醠";s:2:"l";s:3:"醡";s:2:"m";s:3:"醢";s:2:"";s:3:"醣";s:2:"";s:3:"醤";s:2:"n";s:3:"醥";s:2:"o";s:3:"醦";s:2:"p";s:3:"醧";s:2:"q";s:3:"醨";s:2:"r";s:3:"醩";s:2:"s";s:3:"醪";s:2:"";s:3:"醫";s:2:"t";s:3:"醬";s:2:"u";s:3:"醭";s:2:"";s:3:"醮";s:2:"";s:3:"醯";s:2:"";s:3:"醰";s:2:"v";s:3:"醱";s:2:"w";s:3:"醲";s:2:"x";s:3:"醳";s:2:"y";s:3:"醴";s:2:"";s:3:"醵";s:2:"";s:3:"醶";s:2:"z";s:3:"醷";s:2:"{";s:3:"醸";s:2:"|";s:3:"醹";s:2:"}";s:3:"醺";s:2:"";s:3:"醻";s:2:"~";s:3:"醼";s:2:"";s:3:"醽";s:2:"";s:3:"醾";s:2:"";s:3:"醿";s:2:"";s:3:"釀";s:2:"";s:3:"釁";s:2:"";s:3:"釂";s:2:"";s:3:"釃";s:2:"";s:3:"釄";s:2:"";s:3:"釅";s:2:"";s:3:"釆";s:2:"";s:3:"采";s:2:"";s:3:"釈";s:2:"";s:3:"釉";s:2:"";s:3:"释";s:2:"";s:3:"釋";s:2:"";s:3:"里";s:2:"";s:3:"重";s:2:"";s:3:"野";s:2:"Ұ";s:3:"量";s:2:"";s:3:"釐";s:2:"";s:3:"金";s:2:"";s:3:"釒";s:2:"";s:3:"釓";s:2:"";s:3:"釔";s:2:"";s:3:"釕";s:2:"";s:3:"釖";s:2:"";s:3:"釗";s:2:"";s:3:"釘";s:2:"";s:3:"釙";s:2:"";s:3:"釚";s:2:"";s:3:"釛";s:2:"";s:3:"釜";s:2:"";s:3:"針";s:2:"";s:3:"釞";s:2:"";s:3:"釟";s:2:"";s:3:"釠";s:2:"";s:3:"釡";s:2:"";s:3:"釢";s:2:"";s:3:"釣";s:2:"";s:3:"釤";s:2:"";s:3:"釥";s:2:"";s:3:"釦";s:2:"@";s:3:"釧";s:2:"A";s:3:"釨";s:2:"B";s:3:"釩";s:2:"C";s:3:"釪";s:2:"D";s:3:"釫";s:2:"E";s:3:"釬";s:2:"F";s:3:"釭";s:2:"G";s:3:"釮";s:2:"H";s:3:"釯";s:2:"I";s:3:"釰";s:2:"J";s:3:"釱";s:2:"K";s:3:"釲";s:2:"L";s:3:"釳";s:2:"M";s:3:"釴";s:2:"N";s:3:"釵";s:2:"O";s:3:"釶";s:2:"P";s:3:"釷";s:2:"Q";s:3:"釸";s:2:"R";s:3:"釹";s:2:"S";s:3:"釺";s:2:"T";s:3:"釻";s:2:"U";s:3:"釼";s:2:"V";s:3:"釽";s:2:"W";s:3:"釾";s:2:"X";s:3:"釿";s:2:"Y";s:3:"鈀";s:2:"Z";s:3:"鈁";s:2:"[";s:3:"鈂";s:2:"\";s:3:"鈃";s:2:"]";s:3:"鈄";s:2:"^";s:3:"鈅";s:2:"_";s:3:"鈆";s:2:"`";s:3:"鈇";s:2:"a";s:3:"鈈";s:2:"b";s:3:"鈉";s:2:"c";s:3:"鈊";s:2:"d";s:3:"鈋";s:2:"e";s:3:"鈌";s:2:"f";s:3:"鈍";s:2:"g";s:3:"鈎";s:2:"h";s:3:"鈏";s:2:"i";s:3:"鈐";s:2:"j";s:3:"鈑";s:2:"k";s:3:"鈒";s:2:"l";s:3:"鈓";s:2:"m";s:3:"鈔";s:2:"n";s:3:"鈕";s:2:"o";s:3:"鈖";s:2:"p";s:3:"鈗";s:2:"q";s:3:"鈘";s:2:"r";s:3:"鈙";s:2:"s";s:3:"鈚";s:2:"t";s:3:"鈛";s:2:"u";s:3:"鈜";s:2:"v";s:3:"鈝";s:2:"w";s:3:"鈞";s:2:"x";s:3:"鈟";s:2:"y";s:3:"鈠";s:2:"z";s:3:"鈡";s:2:"{";s:3:"鈢";s:2:"|";s:3:"鈣";s:2:"}";s:3:"鈤";s:2:"~";s:3:"鈥";s:2:"";s:3:"鈦";s:2:"";s:3:"鈧";s:2:"";s:3:"鈨";s:2:"";s:3:"鈩";s:2:"";s:3:"鈪";s:2:"";s:3:"鈫";s:2:"";s:3:"鈬";s:2:"";s:3:"鈭";s:2:"";s:3:"鈮";s:2:"";s:3:"鈯";s:2:"";s:3:"鈰";s:2:"";s:3:"鈱";s:2:"";s:3:"鈲";s:2:"";s:3:"鈳";s:2:"";s:3:"鈴";s:2:"";s:3:"鈵";s:2:"";s:3:"鈶";s:2:"";s:3:"鈷";s:2:"";s:3:"鈸";s:2:"";s:3:"鈹";s:2:"";s:3:"鈺";s:2:"";s:3:"鈻";s:2:"";s:3:"鈼";s:2:"";s:3:"鈽";s:2:"";s:3:"鈾";s:2:"";s:3:"鈿";s:2:"";s:3:"鉀";s:2:"";s:3:"鉁";s:2:"";s:3:"鉂";s:2:"";s:3:"鉃";s:2:"";s:3:"鉄";s:2:"";s:3:"鉅";s:2:"";s:3:"鉆";s:2:"@";s:3:"鉇";s:2:"A";s:3:"鉈";s:2:"B";s:3:"鉉";s:2:"C";s:3:"鉊";s:2:"D";s:3:"鉋";s:2:"E";s:3:"鉌";s:2:"F";s:3:"鉍";s:2:"G";s:3:"鉎";s:2:"H";s:3:"鉏";s:2:"I";s:3:"鉐";s:2:"J";s:3:"鉑";s:2:"K";s:3:"鉒";s:2:"L";s:3:"鉓";s:2:"M";s:3:"鉔";s:2:"N";s:3:"鉕";s:2:"O";s:3:"鉖";s:2:"P";s:3:"鉗";s:2:"Q";s:3:"鉘";s:2:"R";s:3:"鉙";s:2:"S";s:3:"鉚";s:2:"T";s:3:"鉛";s:2:"U";s:3:"鉜";s:2:"V";s:3:"鉝";s:2:"W";s:3:"鉞";s:2:"X";s:3:"鉟";s:2:"Y";s:3:"鉠";s:2:"Z";s:3:"鉡";s:2:"[";s:3:"鉢";s:2:"\";s:3:"鉣";s:2:"]";s:3:"鉤";s:2:"^";s:3:"鉥";s:2:"_";s:3:"鉦";s:2:"`";s:3:"鉧";s:2:"a";s:3:"鉨";s:2:"b";s:3:"鉩";s:2:"c";s:3:"鉪";s:2:"d";s:3:"鉫";s:2:"e";s:3:"鉬";s:2:"f";s:3:"鉭";s:2:"g";s:3:"鉮";s:2:"h";s:3:"鉯";s:2:"i";s:3:"鉰";s:2:"j";s:3:"鉱";s:2:"k";s:3:"鉲";s:2:"l";s:3:"鉳";s:2:"m";s:3:"鉴";s:2:"";s:3:"鉵";s:2:"n";s:3:"鉶";s:2:"o";s:3:"鉷";s:2:"p";s:3:"鉸";s:2:"q";s:3:"鉹";s:2:"r";s:3:"鉺";s:2:"s";s:3:"鉻";s:2:"t";s:3:"鉼";s:2:"u";s:3:"鉽";s:2:"v";s:3:"鉾";s:2:"w";s:3:"鉿";s:2:"x";s:3:"銀";s:2:"y";s:3:"銁";s:2:"z";s:3:"銂";s:2:"{";s:3:"銃";s:2:"|";s:3:"銄";s:2:"}";s:3:"銅";s:2:"~";s:3:"銆";s:2:"";s:3:"銇";s:2:"";s:3:"銈";s:2:"";s:3:"銉";s:2:"";s:3:"銊";s:2:"";s:3:"銋";s:2:"";s:3:"銌";s:2:"";s:3:"銍";s:2:"";s:3:"銎";s:2:"";s:3:"銏";s:2:"";s:3:"銐";s:2:"";s:3:"銑";s:2:"";s:3:"銒";s:2:"";s:3:"銓";s:2:"";s:3:"銔";s:2:"";s:3:"銕";s:2:"";s:3:"銖";s:2:"";s:3:"銗";s:2:"";s:3:"銘";s:2:"";s:3:"銙";s:2:"";s:3:"銚";s:2:"";s:3:"銛";s:2:"";s:3:"銜";s:2:"";s:3:"銝";s:2:"";s:3:"銞";s:2:"";s:3:"銟";s:2:"";s:3:"銠";s:2:"";s:3:"銡";s:2:"";s:3:"銢";s:2:"";s:3:"銣";s:2:"";s:3:"銤";s:2:"";s:3:"銥";s:2:"";s:3:"銦";s:2:"";s:3:"銧";s:2:"";s:3:"銨";s:2:"@";s:3:"銩";s:2:"A";s:3:"銪";s:2:"B";s:3:"銫";s:2:"C";s:3:"銬";s:2:"D";s:3:"銭";s:2:"E";s:3:"銮";s:2:"";s:3:"銯";s:2:"F";s:3:"銰";s:2:"G";s:3:"銱";s:2:"H";s:3:"銲";s:2:"I";s:3:"銳";s:2:"J";s:3:"銴";s:2:"K";s:3:"銵";s:2:"L";s:3:"銶";s:2:"M";s:3:"銷";s:2:"N";s:3:"銸";s:2:"O";s:3:"銹";s:2:"P";s:3:"銺";s:2:"Q";s:3:"銻";s:2:"R";s:3:"銼";s:2:"S";s:3:"銽";s:2:"T";s:3:"銾";s:2:"U";s:3:"銿";s:2:"V";s:3:"鋀";s:2:"W";s:3:"鋁";s:2:"X";s:3:"鋂";s:2:"Y";s:3:"鋃";s:2:"Z";s:3:"鋄";s:2:"[";s:3:"鋅";s:2:"\";s:3:"鋆";s:2:"]";s:3:"鋇";s:2:"^";s:3:"鋈";s:2:"";s:3:"鋉";s:2:"_";s:3:"鋊";s:2:"`";s:3:"鋋";s:2:"a";s:3:"鋌";s:2:"b";s:3:"鋍";s:2:"c";s:3:"鋎";s:2:"d";s:3:"鋏";s:2:"e";s:3:"鋐";s:2:"f";s:3:"鋑";s:2:"g";s:3:"鋒";s:2:"h";s:3:"鋓";s:2:"i";s:3:"鋔";s:2:"j";s:3:"鋕";s:2:"k";s:3:"鋖";s:2:"l";s:3:"鋗";s:2:"m";s:3:"鋘";s:2:"n";s:3:"鋙";s:2:"o";s:3:"鋚";s:2:"p";s:3:"鋛";s:2:"q";s:3:"鋜";s:2:"r";s:3:"鋝";s:2:"s";s:3:"鋞";s:2:"t";s:3:"鋟";s:2:"u";s:3:"鋠";s:2:"v";s:3:"鋡";s:2:"w";s:3:"鋢";s:2:"x";s:3:"鋣";s:2:"y";s:3:"鋤";s:2:"z";s:3:"鋥";s:2:"{";s:3:"鋦";s:2:"|";s:3:"鋧";s:2:"}";s:3:"鋨";s:2:"~";s:3:"鋩";s:2:"";s:3:"鋪";s:2:"";s:3:"鋫";s:2:"";s:3:"鋬";s:2:"";s:3:"鋭";s:2:"";s:3:"鋮";s:2:"";s:3:"鋯";s:2:"";s:3:"鋰";s:2:"";s:3:"鋱";s:2:"";s:3:"鋲";s:2:"";s:3:"鋳";s:2:"";s:3:"鋴";s:2:"";s:3:"鋵";s:2:"";s:3:"鋶";s:2:"";s:3:"鋷";s:2:"";s:3:"鋸";s:2:"";s:3:"鋹";s:2:"";s:3:"鋺";s:2:"";s:3:"鋻";s:2:"";s:3:"鋼";s:2:"";s:3:"鋽";s:2:"";s:3:"鋾";s:2:"";s:3:"鋿";s:2:"";s:3:"錀";s:2:"";s:3:"錁";s:2:"";s:3:"錂";s:2:"";s:3:"錃";s:2:"";s:3:"錄";s:2:"";s:3:"錅";s:2:"";s:3:"錆";s:2:"";s:3:"錇";s:2:"";s:3:"錈";s:2:"";s:3:"錉";s:2:"";s:3:"錊";s:2:"@";s:3:"錋";s:2:"A";s:3:"錌";s:2:"B";s:3:"錍";s:2:"C";s:3:"錎";s:2:"D";s:3:"錏";s:2:"E";s:3:"錐";s:2:"F";s:3:"錑";s:2:"G";s:3:"錒";s:2:"H";s:3:"錓";s:2:"I";s:3:"錔";s:2:"J";s:3:"錕";s:2:"K";s:3:"錖";s:2:"L";s:3:"錗";s:2:"M";s:3:"錘";s:2:"N";s:3:"錙";s:2:"O";s:3:"錚";s:2:"P";s:3:"錛";s:2:"Q";s:3:"錜";s:2:"R";s:3:"錝";s:2:"S";s:3:"錞";s:2:"T";s:3:"錟";s:2:"U";s:3:"錠";s:2:"V";s:3:"錡";s:2:"W";s:3:"錢";s:2:"X";s:3:"錣";s:2:"Y";s:3:"錤";s:2:"Z";s:3:"錥";s:2:"[";s:3:"錦";s:2:"\";s:3:"錧";s:2:"]";s:3:"錨";s:2:"^";s:3:"錩";s:2:"_";s:3:"錪";s:2:"`";s:3:"錫";s:2:"a";s:3:"錬";s:2:"b";s:3:"錭";s:2:"c";s:3:"錮";s:2:"d";s:3:"錯";s:2:"e";s:3:"錰";s:2:"f";s:3:"錱";s:2:"g";s:3:"録";s:2:"h";s:3:"錳";s:2:"i";s:3:"錴";s:2:"j";s:3:"錵";s:2:"k";s:3:"錶";s:2:"l";s:3:"錷";s:2:"m";s:3:"錸";s:2:"n";s:3:"錹";s:2:"o";s:3:"錺";s:2:"p";s:3:"錻";s:2:"q";s:3:"錼";s:2:"r";s:3:"錽";s:2:"s";s:3:"錾";s:2:"";s:3:"錿";s:2:"t";s:3:"鍀";s:2:"u";s:3:"鍁";s:2:"v";s:3:"鍂";s:2:"w";s:3:"鍃";s:2:"x";s:3:"鍄";s:2:"y";s:3:"鍅";s:2:"z";s:3:"鍆";s:2:"{";s:3:"鍇";s:2:"|";s:3:"鍈";s:2:"}";s:3:"鍉";s:2:"~";s:3:"鍊";s:2:"";s:3:"鍋";s:2:"";s:3:"鍌";s:2:"";s:3:"鍍";s:2:"";s:3:"鍎";s:2:"";s:3:"鍏";s:2:"";s:3:"鍐";s:2:"";s:3:"鍑";s:2:"";s:3:"鍒";s:2:"";s:3:"鍓";s:2:"";s:3:"鍔";s:2:"";s:3:"鍕";s:2:"";s:3:"鍖";s:2:"";s:3:"鍗";s:2:"";s:3:"鍘";s:2:"";s:3:"鍙";s:2:"";s:3:"鍚";s:2:"";s:3:"鍛";s:2:"";s:3:"鍜";s:2:"";s:3:"鍝";s:2:"";s:3:"鍞";s:2:"";s:3:"鍟";s:2:"";s:3:"鍠";s:2:"";s:3:"鍡";s:2:"";s:3:"鍢";s:2:"";s:3:"鍣";s:2:"";s:3:"鍤";s:2:"";s:3:"鍥";s:2:"";s:3:"鍦";s:2:"";s:3:"鍧";s:2:"";s:3:"鍨";s:2:"";s:3:"鍩";s:2:"";s:3:"鍪";s:2:"";s:3:"鍫";s:2:"";s:3:"鍬";s:2:"@";s:3:"鍭";s:2:"A";s:3:"鍮";s:2:"B";s:3:"鍯";s:2:"C";s:3:"鍰";s:2:"D";s:3:"鍱";s:2:"E";s:3:"鍲";s:2:"F";s:3:"鍳";s:2:"G";s:3:"鍴";s:2:"H";s:3:"鍵";s:2:"I";s:3:"鍶";s:2:"J";s:3:"鍷";s:2:"K";s:3:"鍸";s:2:"L";s:3:"鍹";s:2:"M";s:3:"鍺";s:2:"N";s:3:"鍻";s:2:"O";s:3:"鍼";s:2:"P";s:3:"鍽";s:2:"Q";s:3:"鍾";s:2:"R";s:3:"鍿";s:2:"S";s:3:"鎀";s:2:"T";s:3:"鎁";s:2:"U";s:3:"鎂";s:2:"V";s:3:"鎃";s:2:"W";s:3:"鎄";s:2:"X";s:3:"鎅";s:2:"Y";s:3:"鎆";s:2:"Z";s:3:"鎇";s:2:"[";s:3:"鎈";s:2:"\";s:3:"鎉";s:2:"]";s:3:"鎊";s:2:"^";s:3:"鎋";s:2:"_";s:3:"鎌";s:2:"`";s:3:"鎍";s:2:"a";s:3:"鎎";s:2:"b";s:3:"鎏";s:2:"";s:3:"鎐";s:2:"c";s:3:"鎑";s:2:"d";s:3:"鎒";s:2:"e";s:3:"鎓";s:2:"f";s:3:"鎔";s:2:"g";s:3:"鎕";s:2:"h";s:3:"鎖";s:2:"i";s:3:"鎗";s:2:"j";s:3:"鎘";s:2:"k";s:3:"鎙";s:2:"l";s:3:"鎚";s:2:"m";s:3:"鎛";s:2:"n";s:3:"鎜";s:2:"o";s:3:"鎝";s:2:"p";s:3:"鎞";s:2:"q";s:3:"鎟";s:2:"r";s:3:"鎠";s:2:"s";s:3:"鎡";s:2:"t";s:3:"鎢";s:2:"u";s:3:"鎣";s:2:"v";s:3:"鎤";s:2:"w";s:3:"鎥";s:2:"x";s:3:"鎦";s:2:"y";s:3:"鎧";s:2:"z";s:3:"鎨";s:2:"{";s:3:"鎩";s:2:"|";s:3:"鎪";s:2:"}";s:3:"鎫";s:2:"~";s:3:"鎬";s:2:"";s:3:"鎭";s:2:"";s:3:"鎮";s:2:"";s:3:"鎯";s:2:"";s:3:"鎰";s:2:"";s:3:"鎱";s:2:"";s:3:"鎲";s:2:"";s:3:"鎳";s:2:"";s:3:"鎴";s:2:"";s:3:"鎵";s:2:"";s:3:"鎶";s:2:"";s:3:"鎷";s:2:"";s:3:"鎸";s:2:"";s:3:"鎹";s:2:"";s:3:"鎺";s:2:"";s:3:"鎻";s:2:"";s:3:"鎼";s:2:"";s:3:"鎽";s:2:"";s:3:"鎾";s:2:"";s:3:"鎿";s:2:"";s:3:"鏀";s:2:"";s:3:"鏁";s:2:"";s:3:"鏂";s:2:"";s:3:"鏃";s:2:"";s:3:"鏄";s:2:"";s:3:"鏅";s:2:"";s:3:"鏆";s:2:"";s:3:"鏇";s:2:"";s:3:"鏈";s:2:"";s:3:"鏉";s:2:"";s:3:"鏊";s:2:"";s:3:"鏋";s:2:"";s:3:"鏌";s:2:"";s:3:"鏍";s:2:"";s:3:"鏎";s:2:"@";s:3:"鏏";s:2:"A";s:3:"鏐";s:2:"B";s:3:"鏑";s:2:"C";s:3:"鏒";s:2:"D";s:3:"鏓";s:2:"E";s:3:"鏔";s:2:"F";s:3:"鏕";s:2:"G";s:3:"鏖";s:2:"";s:3:"鏗";s:2:"H";s:3:"鏘";s:2:"I";s:3:"鏙";s:2:"J";s:3:"鏚";s:2:"K";s:3:"鏛";s:2:"L";s:3:"鏜";s:2:"M";s:3:"鏝";s:2:"N";s:3:"鏞";s:2:"O";s:3:"鏟";s:2:"P";s:3:"鏠";s:2:"Q";s:3:"鏡";s:2:"R";s:3:"鏢";s:2:"S";s:3:"鏣";s:2:"T";s:3:"鏤";s:2:"U";s:3:"鏥";s:2:"V";s:3:"鏦";s:2:"W";s:3:"鏧";s:2:"X";s:3:"鏨";s:2:"Y";s:3:"鏩";s:2:"Z";s:3:"鏪";s:2:"[";s:3:"鏫";s:2:"\";s:3:"鏬";s:2:"]";s:3:"鏭";s:2:"^";s:3:"鏮";s:2:"_";s:3:"鏯";s:2:"`";s:3:"鏰";s:2:"a";s:3:"鏱";s:2:"b";s:3:"鏲";s:2:"c";s:3:"鏳";s:2:"d";s:3:"鏴";s:2:"e";s:3:"鏵";s:2:"f";s:3:"鏶";s:2:"g";s:3:"鏷";s:2:"h";s:3:"鏸";s:2:"i";s:3:"鏹";s:2:"j";s:3:"鏺";s:2:"k";s:3:"鏻";s:2:"l";s:3:"鏼";s:2:"m";s:3:"鏽";s:2:"n";s:3:"鏾";s:2:"o";s:3:"鏿";s:2:"p";s:3:"鐀";s:2:"q";s:3:"鐁";s:2:"r";s:3:"鐂";s:2:"s";s:3:"鐃";s:2:"t";s:3:"鐄";s:2:"u";s:3:"鐅";s:2:"v";s:3:"鐆";s:2:"w";s:3:"鐇";s:2:"x";s:3:"鐈";s:2:"y";s:3:"鐉";s:2:"z";s:3:"鐊";s:2:"{";s:3:"鐋";s:2:"|";s:3:"鐌";s:2:"}";s:3:"鐍";s:2:"~";s:3:"鐎";s:2:"";s:3:"鐏";s:2:"";s:3:"鐐";s:2:"";s:3:"鐑";s:2:"";s:3:"鐒";s:2:"";s:3:"鐓";s:2:"";s:3:"鐔";s:2:"";s:3:"鐕";s:2:"";s:3:"鐖";s:2:"";s:3:"鐗";s:2:"";s:3:"鐘";s:2:"";s:3:"鐙";s:2:"";s:3:"鐚";s:2:"";s:3:"鐛";s:2:"";s:3:"鐜";s:2:"";s:3:"鐝";s:2:"";s:3:"鐞";s:2:"";s:3:"鐟";s:2:"";s:3:"鐠";s:2:"";s:3:"鐡";s:2:"";s:3:"鐢";s:2:"";s:3:"鐣";s:2:"";s:3:"鐤";s:2:"";s:3:"鐥";s:2:"";s:3:"鐦";s:2:"";s:3:"鐧";s:2:"";s:3:"鐨";s:2:"";s:3:"鐩";s:2:"";s:3:"鐪";s:2:"";s:3:"鐫";s:2:"";s:3:"鐬";s:2:"";s:3:"鐭";s:2:"";s:3:"鐮";s:2:"";s:3:"鐯";s:2:"@";s:3:"鐰";s:2:"A";s:3:"鐱";s:2:"B";s:3:"鐲";s:2:"C";s:3:"鐳";s:2:"D";s:3:"鐴";s:2:"E";s:3:"鐵";s:2:"F";s:3:"鐶";s:2:"G";s:3:"鐷";s:2:"H";s:3:"鐸";s:2:"I";s:3:"鐹";s:2:"J";s:3:"鐺";s:2:"K";s:3:"鐻";s:2:"L";s:3:"鐼";s:2:"M";s:3:"鐽";s:2:"N";s:3:"鐾";s:2:"";s:3:"鐿";s:2:"O";s:3:"鑀";s:2:"P";s:3:"鑁";s:2:"Q";s:3:"鑂";s:2:"R";s:3:"鑃";s:2:"S";s:3:"鑄";s:2:"T";s:3:"鑅";s:2:"U";s:3:"鑆";s:2:"V";s:3:"鑇";s:2:"W";s:3:"鑈";s:2:"X";s:3:"鑉";s:2:"Y";s:3:"鑊";s:2:"Z";s:3:"鑋";s:2:"[";s:3:"鑌";s:2:"\";s:3:"鑍";s:2:"]";s:3:"鑎";s:2:"^";s:3:"鑏";s:2:"_";s:3:"鑐";s:2:"`";s:3:"鑑";s:2:"a";s:3:"鑒";s:2:"b";s:3:"鑓";s:2:"c";s:3:"鑔";s:2:"d";s:3:"鑕";s:2:"e";s:3:"鑖";s:2:"f";s:3:"鑗";s:2:"g";s:3:"鑘";s:2:"h";s:3:"鑙";s:2:"i";s:3:"鑚";s:2:"j";s:3:"鑛";s:2:"k";s:3:"鑜";s:2:"l";s:3:"鑝";s:2:"m";s:3:"鑞";s:2:"n";s:3:"鑟";s:2:"o";s:3:"鑠";s:2:"p";s:3:"鑡";s:2:"q";s:3:"鑢";s:2:"r";s:3:"鑣";s:2:"s";s:3:"鑤";s:2:"t";s:3:"鑥";s:2:"u";s:3:"鑦";s:2:"v";s:3:"鑧";s:2:"w";s:3:"鑨";s:2:"x";s:3:"鑩";s:2:"y";s:3:"鑪";s:2:"z";s:3:"鑫";s:2:"";s:3:"鑬";s:2:"{";s:3:"鑭";s:2:"|";s:3:"鑮";s:2:"}";s:3:"鑯";s:2:"~";s:3:"鑰";s:2:"";s:3:"鑱";s:2:"";s:3:"鑲";s:2:"";s:3:"鑳";s:2:"";s:3:"鑴";s:2:"";s:3:"鑵";s:2:"";s:3:"鑶";s:2:"";s:3:"鑷";s:2:"";s:3:"鑸";s:2:"";s:3:"鑹";s:2:"";s:3:"鑺";s:2:"";s:3:"鑻";s:2:"";s:3:"鑼";s:2:"";s:3:"鑽";s:2:"";s:3:"鑾";s:2:"";s:3:"鑿";s:2:"";s:3:"钀";s:2:"";s:3:"钁";s:2:"";s:3:"钂";s:2:"";s:3:"钃";s:2:"";s:3:"钄";s:2:"";s:3:"钅";s:2:"";s:3:"钆";s:2:"";s:3:"钇";s:2:"";s:3:"针";s:2:"";s:3:"钉";s:2:"";s:3:"钊";s:2:"";s:3:"钋";s:2:"";s:3:"钌";s:2:"";s:3:"钍";s:2:"";s:3:"钎";s:2:"ǥ";s:3:"钏";s:2:"";s:3:"钐";s:2:"";s:3:"钑";s:2:"";s:3:"钒";s:2:"";s:3:"钓";s:2:"";s:3:"钔";s:2:"";s:3:"钕";s:2:"";s:3:"钖";s:2:"";s:3:"钗";s:2:"";s:3:"钘";s:2:"";s:3:"钙";s:2:"";s:3:"钚";s:2:"";s:3:"钛";s:2:"";s:3:"钜";s:2:"";s:3:"钝";s:2:"";s:3:"钞";s:2:"";s:3:"钟";s:2:"";s:3:"钠";s:2:"";s:3:"钡";s:2:"";s:3:"钢";s:2:"";s:3:"钣";s:2:"";s:3:"钤";s:2:"";s:3:"钥";s:2:"Կ";s:3:"钦";s:2:"";s:3:"钧";s:2:"";s:3:"钨";s:2:"";s:3:"钩";s:2:"";s:3:"钪";s:2:"";s:3:"钫";s:2:"";s:3:"钬";s:2:"";s:3:"钭";s:2:"";s:3:"钮";s:2:"ť";s:3:"钯";s:2:"";s:3:"钰";s:2:"";s:3:"钱";s:2:"Ǯ";s:3:"钲";s:2:"";s:3:"钳";s:2:"ǯ";s:3:"钴";s:2:"";s:3:"钵";s:2:"";s:3:"钶";s:2:"";s:3:"钷";s:2:"";s:3:"钸";s:2:"";s:3:"钹";s:2:"";s:3:"钺";s:2:"";s:3:"钻";s:2:"";s:3:"钼";s:2:"";s:3:"钽";s:2:"";s:3:"钾";s:2:"";s:3:"钿";s:2:"";s:3:"铀";s:2:"";s:3:"铁";s:2:"";s:3:"铂";s:2:"";s:3:"铃";s:2:"";s:3:"铄";s:2:"";s:3:"铅";s:2:"Ǧ";s:3:"铆";s:2:"í";s:3:"铇";s:2:"";s:3:"铈";s:2:"";s:3:"铉";s:2:"";s:3:"铊";s:2:"";s:3:"铋";s:2:"";s:3:"铌";s:2:"";s:3:"铍";s:2:"";s:3:"铎";s:2:"";s:3:"铏";s:2:"";s:3:"铐";s:2:"";s:3:"铑";s:2:"";s:3:"铒";s:2:"";s:3:"铓";s:2:"";s:3:"铔";s:2:"";s:3:"铕";s:2:"";s:3:"铖";s:2:"";s:3:"铗";s:2:"";s:3:"铘";s:2:"";s:3:"铙";s:2:"";s:3:"铚";s:2:"";s:3:"铛";s:2:"";s:3:"铜";s:2:"ͭ";s:3:"铝";s:2:"";s:3:"铞";s:2:"";s:3:"铟";s:2:"";s:3:"铠";s:2:"";s:3:"铡";s:2:"ա";s:3:"铢";s:2:"";s:3:"铣";s:2:"ϳ";s:3:"铤";s:2:"";s:3:"铥";s:2:"";s:3:"铦";s:2:"";s:3:"铧";s:2:"";s:3:"铨";s:2:"";s:3:"铩";s:2:"";s:3:"铪";s:2:"";s:3:"铫";s:2:"";s:3:"铬";s:2:"";s:3:"铭";s:2:"";s:3:"铮";s:2:"";s:3:"铯";s:2:"";s:3:"铰";s:2:"";s:3:"铱";s:2:"ҿ";s:3:"铲";s:2:"";s:3:"铳";s:2:"";s:3:"铴";s:2:"";s:3:"铵";s:2:"";s:3:"银";s:2:"";s:3:"铷";s:2:"";s:3:"铸";s:2:"";s:3:"铹";s:2:"";s:3:"铺";s:2:"";s:3:"铻";s:2:"";s:3:"铼";s:2:"";s:3:"铽";s:2:"";s:3:"链";s:2:"";s:3:"铿";s:2:"";s:3:"销";s:2:"";s:3:"锁";s:2:"";s:3:"锂";s:2:"";s:3:"锃";s:2:"";s:3:"锄";s:2:"";s:3:"锅";s:2:"";s:3:"锆";s:2:"";s:3:"锇";s:2:"";s:3:"锈";s:2:"";s:3:"锉";s:2:"";s:3:"锊";s:2:"";s:3:"锋";s:2:"";s:3:"锌";s:2:"п";s:3:"锍";s:2:"";s:3:"锎";s:2:"";s:3:"锏";s:2:"";s:3:"锐";s:2:"";s:3:"锑";s:2:"";s:3:"锒";s:2:"";s:3:"锓";s:2:"";s:3:"锔";s:2:"";s:3:"锕";s:2:"";s:3:"锖";s:2:"";s:3:"锗";s:2:"";s:3:"锘";s:2:"";s:3:"错";s:2:"";s:3:"锚";s:2:"ê";s:3:"锛";s:2:"";s:3:"锜";s:2:"";s:3:"锝";s:2:"";s:3:"锞";s:2:"";s:3:"锟";s:2:"";s:3:"锠";s:2:"";s:3:"锡";s:2:"";s:3:"锢";s:2:"";s:3:"锣";s:2:"";s:3:"锤";s:2:"";s:3:"锥";s:2:"׶";s:3:"锦";s:2:"";s:3:"锧";s:2:"@";s:3:"锨";s:2:"";s:3:"锩";s:2:"";s:3:"锪";s:2:"";s:3:"锫";s:2:"";s:3:"锬";s:2:"";s:3:"锭";s:2:"";s:3:"键";s:2:"";s:3:"锯";s:2:"";s:3:"锰";s:2:"";s:3:"锱";s:2:"";s:3:"锲";s:2:"";s:3:"锳";s:2:"A";s:3:"锴";s:2:"";s:3:"锵";s:2:"";s:3:"锶";s:2:"";s:3:"锷";s:2:"";s:3:"锸";s:2:"";s:3:"锹";s:2:"";s:3:"锺";s:2:"";s:3:"锻";s:2:"";s:3:"锼";s:2:"";s:3:"锽";s:2:"B";s:3:"锾";s:2:"";s:3:"锿";s:2:"";s:3:"镀";s:2:"";s:3:"镁";s:2:"þ";s:3:"镂";s:2:"";s:3:"镃";s:2:"C";s:3:"镄";s:2:"";s:3:"镅";s:2:"";s:3:"镆";s:2:"";s:3:"镇";s:2:"";s:3:"镈";s:2:"D";s:3:"镉";s:2:"";s:3:"镊";s:2:"";s:3:"镋";s:2:"E";s:3:"镌";s:2:"";s:3:"镍";s:2:"";s:3:"镎";s:2:"";s:3:"镏";s:2:"";s:3:"镐";s:2:"";s:3:"镑";s:2:"";s:3:"镒";s:2:"";s:3:"镓";s:2:"";s:3:"镔";s:2:"";s:3:"镕";s:2:"F";s:3:"镖";s:2:"";s:3:"镗";s:2:"";s:3:"镘";s:2:"";s:3:"镙";s:2:"";s:3:"镚";s:2:"G";s:3:"镛";s:2:"";s:3:"镜";s:2:"";s:3:"镝";s:2:"";s:3:"镞";s:2:"";s:3:"镟";s:2:"";s:3:"镠";s:2:"H";s:3:"镡";s:2:"";s:3:"镢";s:2:"";s:3:"镣";s:2:"";s:3:"镤";s:2:"";s:3:"镥";s:2:"";s:3:"镦";s:2:"";s:3:"镧";s:2:"";s:3:"镨";s:2:"";s:3:"镩";s:2:"";s:3:"镪";s:2:"";s:3:"镫";s:2:"";s:3:"镬";s:2:"";s:3:"镭";s:2:"";s:3:"镮";s:2:"I";s:3:"镯";s:2:"";s:3:"镰";s:2:"";s:3:"镱";s:2:"";s:3:"镲";s:2:"";s:3:"镳";s:2:"";s:3:"镴";s:2:"J";s:3:"镵";s:2:"K";s:3:"镶";s:2:"";s:3:"長";s:2:"L";s:3:"镸";s:2:"M";s:3:"镹";s:2:"N";s:3:"镺";s:2:"O";s:3:"镻";s:2:"P";s:3:"镼";s:2:"Q";s:3:"镽";s:2:"R";s:3:"镾";s:2:"S";s:3:"长";s:2:"";s:3:"門";s:2:"T";s:3:"閁";s:2:"U";s:3:"閂";s:2:"V";s:3:"閃";s:2:"W";s:3:"閄";s:2:"X";s:3:"閅";s:2:"Y";s:3:"閆";s:2:"Z";s:3:"閇";s:2:"[";s:3:"閈";s:2:"\";s:3:"閉";s:2:"]";s:3:"閊";s:2:"^";s:3:"開";s:2:"_";s:3:"閌";s:2:"`";s:3:"閍";s:2:"a";s:3:"閎";s:2:"b";s:3:"閏";s:2:"c";s:3:"閐";s:2:"d";s:3:"閑";s:2:"e";s:3:"閒";s:2:"f";s:3:"間";s:2:"g";s:3:"閔";s:2:"h";s:3:"閕";s:2:"i";s:3:"閖";s:2:"j";s:3:"閗";s:2:"k";s:3:"閘";s:2:"l";s:3:"閙";s:2:"m";s:3:"閚";s:2:"n";s:3:"閛";s:2:"o";s:3:"閜";s:2:"p";s:3:"閝";s:2:"q";s:3:"閞";s:2:"r";s:3:"閟";s:2:"s";s:3:"閠";s:2:"t";s:3:"閡";s:2:"u";s:3:"関";s:2:"v";s:3:"閣";s:2:"w";s:3:"閤";s:2:"x";s:3:"閥";s:2:"y";s:3:"閦";s:2:"z";s:3:"閧";s:2:"{";s:3:"閨";s:2:"|";s:3:"閩";s:2:"}";s:3:"閪";s:2:"~";s:3:"閫";s:2:"";s:3:"閬";s:2:"";s:3:"閭";s:2:"";s:3:"閮";s:2:"";s:3:"閯";s:2:"";s:3:"閰";s:2:"";s:3:"閱";s:2:"";s:3:"閲";s:2:"";s:3:"閳";s:2:"";s:3:"閴";s:2:"";s:3:"閵";s:2:"";s:3:"閶";s:2:"";s:3:"閷";s:2:"";s:3:"閸";s:2:"";s:3:"閹";s:2:"";s:3:"閺";s:2:"";s:3:"閻";s:2:"";s:3:"閼";s:2:"";s:3:"閽";s:2:"";s:3:"閾";s:2:"";s:3:"閿";s:2:"";s:3:"闀";s:2:"";s:3:"闁";s:2:"";s:3:"闂";s:2:"";s:3:"闃";s:2:"";s:3:"闄";s:2:"";s:3:"闅";s:2:"";s:3:"闆";s:2:"";s:3:"闇";s:2:"";s:3:"闈";s:2:"";s:3:"闉";s:2:"";s:3:"闊";s:2:"";s:3:"闋";s:2:"";s:3:"闌";s:2:"@";s:3:"闍";s:2:"A";s:3:"闎";s:2:"B";s:3:"闏";s:2:"C";s:3:"闐";s:2:"D";s:3:"闑";s:2:"E";s:3:"闒";s:2:"F";s:3:"闓";s:2:"G";s:3:"闔";s:2:"H";s:3:"闕";s:2:"I";s:3:"闖";s:2:"J";s:3:"闗";s:2:"K";s:3:"闘";s:2:"L";s:3:"闙";s:2:"M";s:3:"闚";s:2:"N";s:3:"闛";s:2:"O";s:3:"關";s:2:"P";s:3:"闝";s:2:"Q";s:3:"闞";s:2:"R";s:3:"闟";s:2:"S";s:3:"闠";s:2:"T";s:3:"闡";s:2:"U";s:3:"闢";s:2:"V";s:3:"闣";s:2:"W";s:3:"闤";s:2:"X";s:3:"闥";s:2:"Y";s:3:"闦";s:2:"Z";s:3:"闧";s:2:"[";s:3:"门";s:2:"";s:3:"闩";s:2:"";s:3:"闪";s:2:"";s:3:"闫";s:2:"";s:3:"闬";s:2:"\";s:3:"闭";s:2:"";s:3:"问";s:2:"";s:3:"闯";s:2:"";s:3:"闰";s:2:"";s:3:"闱";s:2:"";s:3:"闲";s:2:"";s:3:"闳";s:2:"";s:3:"间";s:2:"";s:3:"闵";s:2:"";s:3:"闶";s:2:"";s:3:"闷";s:2:"";s:3:"闸";s:2:"բ";s:3:"闹";s:2:"";s:3:"闺";s:2:"";s:3:"闻";s:2:"";s:3:"闼";s:2:"";s:3:"闽";s:2:"";s:3:"闾";s:2:"";s:3:"闿";s:2:"]";s:3:"阀";s:2:"";s:3:"阁";s:2:"";s:3:"阂";s:2:"";s:3:"阃";s:2:"";s:3:"阄";s:2:"";s:3:"阅";s:2:"";s:3:"阆";s:2:"";s:3:"阇";s:2:"^";s:3:"阈";s:2:"";s:3:"阉";s:2:"";s:3:"阊";s:2:"";s:3:"阋";s:2:"";s:3:"阌";s:2:"";s:3:"阍";s:2:"";s:3:"阎";s:2:"";s:3:"阏";s:2:"";s:3:"阐";s:2:"";s:3:"阑";s:2:"";s:3:"阒";s:2:"";s:3:"阓";s:2:"_";s:3:"阔";s:2:"";s:3:"阕";s:2:"";s:3:"阖";s:2:"";s:3:"阗";s:2:"";s:3:"阘";s:2:"`";s:3:"阙";s:2:"";s:3:"阚";s:2:"";s:3:"阛";s:2:"a";s:3:"阜";s:2:"";s:3:"阝";s:2:"";s:3:"阞";s:2:"b";s:3:"队";s:2:"";s:3:"阠";s:2:"c";s:3:"阡";s:2:"";s:3:"阢";s:2:"";s:3:"阣";s:2:"d";s:3:"阤";s:2:"e";s:3:"阥";s:2:"f";s:3:"阦";s:2:"g";s:3:"阧";s:2:"h";s:3:"阨";s:2:"i";s:3:"阩";s:2:"j";s:3:"阪";s:2:"";s:3:"阫";s:2:"k";s:3:"阬";s:2:"l";s:3:"阭";s:2:"m";s:3:"阮";s:2:"";s:3:"阯";s:2:"n";s:3:"阰";s:2:"o";s:3:"阱";s:2:"";s:3:"防";s:2:"";s:3:"阳";s:2:"";s:3:"阴";s:2:"";s:3:"阵";s:2:"";s:3:"阶";s:2:"";s:3:"阷";s:2:"p";s:3:"阸";s:2:"q";s:3:"阹";s:2:"r";s:3:"阺";s:2:"s";s:3:"阻";s:2:"";s:3:"阼";s:2:"";s:3:"阽";s:2:"";s:3:"阾";s:2:"t";s:3:"阿";s:2:"";s:3:"陀";s:2:"";s:3:"陁";s:2:"u";s:3:"陂";s:2:"";s:3:"陃";s:2:"v";s:3:"附";s:2:"";s:3:"际";s:2:"";s:3:"陆";s:2:"½";s:3:"陇";s:2:"¤";s:3:"陈";s:2:"";s:3:"陉";s:2:"";s:3:"陊";s:2:"w";s:3:"陋";s:2:"ª";s:3:"陌";s:2:"İ";s:3:"降";s:2:"";s:3:"陎";s:2:"x";s:3:"陏";s:2:"y";s:3:"限";s:2:"";s:3:"陑";s:2:"z";s:3:"陒";s:2:"{";s:3:"陓";s:2:"|";s:3:"陔";s:2:"";s:3:"陕";s:2:"";s:3:"陖";s:2:"}";s:3:"陗";s:2:"~";s:3:"陘";s:2:"";s:3:"陙";s:2:"";s:3:"陚";s:2:"";s:3:"陛";s:2:"";s:3:"陜";s:2:"";s:3:"陝";s:2:"";s:3:"陞";s:2:"";s:3:"陟";s:2:"";s:3:"陠";s:2:"";s:3:"陡";s:2:"";s:3:"院";s:2:"Ժ";s:3:"陣";s:2:"";s:3:"除";s:2:"";s:3:"陥";s:2:"";s:3:"陦";s:2:"";s:3:"陧";s:2:"";s:3:"陨";s:2:"";s:3:"险";s:2:"";s:3:"陪";s:2:"";s:3:"陫";s:2:"";s:3:"陬";s:2:"";s:3:"陭";s:2:"";s:3:"陮";s:2:"";s:3:"陯";s:2:"";s:3:"陰";s:2:"";s:3:"陱";s:2:"";s:3:"陲";s:2:"";s:3:"陳";s:2:"";s:3:"陴";s:2:"";s:3:"陵";s:2:"";s:3:"陶";s:2:"";s:3:"陷";s:2:"";s:3:"陸";s:2:"";s:3:"陹";s:2:"";s:3:"険";s:2:"";s:3:"陻";s:2:"";s:3:"陼";s:2:"";s:3:"陽";s:2:"";s:3:"陾";s:2:"";s:3:"陿";s:2:"";s:3:"隀";s:2:"";s:3:"隁";s:2:"";s:3:"隂";s:2:"";s:3:"隃";s:2:"";s:3:"隄";s:2:"";s:3:"隅";s:2:"";s:3:"隆";s:2:"¡";s:3:"隇";s:2:"";s:3:"隈";s:2:"";s:3:"隉";s:2:"";s:3:"隊";s:2:"";s:3:"隋";s:2:"";s:3:"隌";s:2:"@";s:3:"隍";s:2:"";s:3:"階";s:2:"A";s:3:"随";s:2:"";s:3:"隐";s:2:"";s:3:"隑";s:2:"B";s:3:"隒";s:2:"C";s:3:"隓";s:2:"D";s:3:"隔";s:2:"";s:3:"隕";s:2:"E";s:3:"隖";s:2:"F";s:3:"隗";s:2:"";s:3:"隘";s:2:"";s:3:"隙";s:2:"϶";s:3:"隚";s:2:"G";s:3:"際";s:2:"H";s:3:"障";s:2:"";s:3:"隝";s:2:"I";s:3:"隞";s:2:"J";s:3:"隟";s:2:"K";s:3:"隠";s:2:"L";s:3:"隡";s:2:"M";s:3:"隢";s:2:"N";s:3:"隣";s:2:"O";s:3:"隤";s:2:"P";s:3:"隥";s:2:"Q";s:3:"隦";s:2:"R";s:3:"隧";s:2:"";s:3:"隨";s:2:"S";s:3:"隩";s:2:"T";s:3:"險";s:2:"U";s:3:"隫";s:2:"V";s:3:"隬";s:2:"W";s:3:"隭";s:2:"X";s:3:"隮";s:2:"Y";s:3:"隯";s:2:"Z";s:3:"隰";s:2:"";s:3:"隱";s:2:"[";s:3:"隲";s:2:"\";s:3:"隳";s:2:"";s:3:"隴";s:2:"]";s:3:"隵";s:2:"^";s:3:"隶";s:2:"";s:3:"隷";s:2:"_";s:3:"隸";s:2:"`";s:3:"隹";s:2:"";s:3:"隺";s:2:"a";s:3:"隻";s:2:"b";s:3:"隼";s:2:"";s:3:"隽";s:2:"";s:3:"难";s:2:"";s:3:"隿";s:2:"c";s:3:"雀";s:2:"ȸ";s:3:"雁";s:2:"";s:3:"雂";s:2:"d";s:3:"雃";s:2:"e";s:3:"雄";s:2:"";s:3:"雅";s:2:"";s:3:"集";s:2:"";s:3:"雇";s:2:"";s:3:"雈";s:2:"f";s:3:"雉";s:2:"";s:3:"雊";s:2:"g";s:3:"雋";s:2:"h";s:3:"雌";s:2:"";s:3:"雍";s:2:"Ӻ";s:3:"雎";s:2:"";s:3:"雏";s:2:"";s:3:"雐";s:2:"i";s:3:"雑";s:2:"j";s:3:"雒";s:2:"";s:3:"雓";s:2:"k";s:3:"雔";s:2:"l";s:3:"雕";s:2:"";s:3:"雖";s:2:"m";s:3:"雗";s:2:"n";s:3:"雘";s:2:"o";s:3:"雙";s:2:"p";s:3:"雚";s:2:"q";s:3:"雛";s:2:"r";s:3:"雜";s:2:"s";s:3:"雝";s:2:"t";s:3:"雞";s:2:"u";s:3:"雟";s:2:"v";s:3:"雠";s:2:"";s:3:"雡";s:2:"w";s:3:"離";s:2:"x";s:3:"難";s:2:"y";s:3:"雤";s:2:"z";s:3:"雥";s:2:"{";s:3:"雦";s:2:"|";s:3:"雧";s:2:"}";s:3:"雨";s:2:"";s:3:"雩";s:2:"";s:3:"雪";s:2:"ѩ";s:3:"雫";s:2:"~";s:3:"雬";s:2:"";s:3:"雭";s:2:"";s:3:"雮";s:2:"";s:3:"雯";s:2:"";s:3:"雰";s:2:"";s:3:"雱";s:2:"";s:3:"雲";s:2:"";s:3:"雳";s:2:"";s:3:"雴";s:2:"";s:3:"雵";s:2:"";s:3:"零";s:2:"";s:3:"雷";s:2:"";s:3:"雸";s:2:"";s:3:"雹";s:2:"";s:3:"雺";s:2:"";s:3:"電";s:2:"";s:3:"雼";s:2:"";s:3:"雽";s:2:"";s:3:"雾";s:2:"";s:3:"雿";s:2:"";s:3:"需";s:2:"";s:3:"霁";s:2:"";s:3:"霂";s:2:"";s:3:"霃";s:2:"";s:3:"霄";s:2:"";s:3:"霅";s:2:"";s:3:"霆";s:2:"";s:3:"震";s:2:"";s:3:"霈";s:2:"";s:3:"霉";s:2:"ù";s:3:"霊";s:2:"";s:3:"霋";s:2:"";s:3:"霌";s:2:"";s:3:"霍";s:2:"";s:3:"霎";s:2:"";s:3:"霏";s:2:"";s:3:"霐";s:2:"";s:3:"霑";s:2:"";s:3:"霒";s:2:"";s:3:"霓";s:2:"";s:3:"霔";s:2:"";s:3:"霕";s:2:"";s:3:"霖";s:2:"";s:3:"霗";s:2:"";s:3:"霘";s:2:"";s:3:"霙";s:2:"";s:3:"霚";s:2:"";s:3:"霛";s:2:"";s:3:"霜";s:2:"˪";s:3:"霝";s:2:"";s:3:"霞";s:2:"ϼ";s:3:"霟";s:2:"";s:3:"霠";s:2:"";s:3:"霡";s:2:"@";s:3:"霢";s:2:"A";s:3:"霣";s:2:"B";s:3:"霤";s:2:"C";s:3:"霥";s:2:"D";s:3:"霦";s:2:"E";s:3:"霧";s:2:"F";s:3:"霨";s:2:"G";s:3:"霩";s:2:"H";s:3:"霪";s:2:"";s:3:"霫";s:2:"I";s:3:"霬";s:2:"J";s:3:"霭";s:2:"";s:3:"霮";s:2:"K";s:3:"霯";s:2:"L";s:3:"霰";s:2:"";s:3:"霱";s:2:"M";s:3:"露";s:2:"¶";s:3:"霳";s:2:"N";s:3:"霴";s:2:"O";s:3:"霵";s:2:"P";s:3:"霶";s:2:"Q";s:3:"霷";s:2:"R";s:3:"霸";s:2:"";s:3:"霹";s:2:"";s:3:"霺";s:2:"S";s:3:"霻";s:2:"T";s:3:"霼";s:2:"U";s:3:"霽";s:2:"V";s:3:"霾";s:2:"";s:3:"霿";s:2:"W";s:3:"靀";s:2:"X";s:3:"靁";s:2:"Y";s:3:"靂";s:2:"Z";s:3:"靃";s:2:"[";s:3:"靄";s:2:"\";s:3:"靅";s:2:"]";s:3:"靆";s:2:"^";s:3:"靇";s:2:"_";s:3:"靈";s:2:"`";s:3:"靉";s:2:"a";s:3:"靊";s:2:"b";s:3:"靋";s:2:"c";s:3:"靌";s:2:"d";s:3:"靍";s:2:"e";s:3:"靎";s:2:"f";s:3:"靏";s:2:"g";s:3:"靐";s:2:"h";s:3:"靑";s:2:"i";s:3:"青";s:2:"";s:3:"靓";s:2:"";s:3:"靔";s:2:"j";s:3:"靕";s:2:"k";s:3:"靖";s:2:"";s:3:"靗";s:2:"l";s:3:"靘";s:2:"m";s:3:"静";s:2:"";s:3:"靚";s:2:"n";s:3:"靛";s:2:"";s:3:"靜";s:2:"o";s:3:"靝";s:2:"p";s:3:"非";s:2:"";s:3:"靟";s:2:"q";s:3:"靠";s:2:"";s:3:"靡";s:2:"";s:3:"面";s:2:"";s:3:"靣";s:2:"r";s:3:"靤";s:2:"s";s:3:"靥";s:2:"";s:3:"靦";s:2:"t";s:3:"靧";s:2:"u";s:3:"靨";s:2:"v";s:3:"革";s:2:"";s:3:"靪";s:2:"w";s:3:"靫";s:2:"x";s:3:"靬";s:2:"y";s:3:"靭";s:2:"z";s:3:"靮";s:2:"{";s:3:"靯";s:2:"|";s:3:"靰";s:2:"}";s:3:"靱";s:2:"~";s:3:"靲";s:2:"";s:3:"靳";s:2:"";s:3:"靴";s:2:"ѥ";s:3:"靵";s:2:"";s:3:"靶";s:2:"";s:3:"靷";s:2:"";s:3:"靸";s:2:"";s:3:"靹";s:2:"";s:3:"靺";s:2:"";s:3:"靻";s:2:"";s:3:"靼";s:2:"";s:3:"靽";s:2:"";s:3:"靾";s:2:"";s:3:"靿";s:2:"";s:3:"鞀";s:2:"";s:3:"鞁";s:2:"";s:3:"鞂";s:2:"";s:3:"鞃";s:2:"";s:3:"鞄";s:2:"";s:3:"鞅";s:2:"";s:3:"鞆";s:2:"";s:3:"鞇";s:2:"";s:3:"鞈";s:2:"";s:3:"鞉";s:2:"";s:3:"鞊";s:2:"";s:3:"鞋";s:2:"Ь";s:3:"鞌";s:2:"";s:3:"鞍";s:2:"";s:3:"鞎";s:2:"";s:3:"鞏";s:2:"";s:3:"鞐";s:2:"";s:3:"鞑";s:2:"";s:3:"鞒";s:2:"";s:3:"鞓";s:2:"";s:3:"鞔";s:2:"";s:3:"鞕";s:2:"";s:3:"鞖";s:2:"";s:3:"鞗";s:2:"";s:3:"鞘";s:2:"";s:3:"鞙";s:2:"";s:3:"鞚";s:2:"";s:3:"鞛";s:2:"";s:3:"鞜";s:2:"";s:3:"鞝";s:2:"";s:3:"鞞";s:2:"@";s:3:"鞟";s:2:"A";s:3:"鞠";s:2:"";s:3:"鞡";s:2:"B";s:3:"鞢";s:2:"C";s:3:"鞣";s:2:"";s:3:"鞤";s:2:"D";s:3:"鞥";s:2:"E";s:3:"鞦";s:2:"F";s:3:"鞧";s:2:"G";s:3:"鞨";s:2:"H";s:3:"鞩";s:2:"I";s:3:"鞪";s:2:"J";s:3:"鞫";s:2:"";s:3:"鞬";s:2:"K";s:3:"鞭";s:2:"";s:3:"鞮";s:2:"L";s:3:"鞯";s:2:"";s:3:"鞰";s:2:"M";s:3:"鞱";s:2:"N";s:3:"鞲";s:2:"";s:3:"鞳";s:2:"O";s:3:"鞴";s:2:"";s:3:"鞵";s:2:"P";s:3:"鞶";s:2:"Q";s:3:"鞷";s:2:"R";s:3:"鞸";s:2:"S";s:3:"鞹";s:2:"T";s:3:"鞺";s:2:"U";s:3:"鞻";s:2:"V";s:3:"鞼";s:2:"W";s:3:"鞽";s:2:"X";s:3:"鞾";s:2:"Y";s:3:"鞿";s:2:"Z";s:3:"韀";s:2:"[";s:3:"韁";s:2:"\";s:3:"韂";s:2:"]";s:3:"韃";s:2:"^";s:3:"韄";s:2:"_";s:3:"韅";s:2:"`";s:3:"韆";s:2:"a";s:3:"韇";s:2:"b";s:3:"韈";s:2:"c";s:3:"韉";s:2:"d";s:3:"韊";s:2:"e";s:3:"韋";s:2:"f";s:3:"韌";s:2:"g";s:3:"韍";s:2:"h";s:3:"韎";s:2:"i";s:3:"韏";s:2:"j";s:3:"韐";s:2:"k";s:3:"韑";s:2:"l";s:3:"韒";s:2:"m";s:3:"韓";s:2:"n";s:3:"韔";s:2:"o";s:3:"韕";s:2:"p";s:3:"韖";s:2:"q";s:3:"韗";s:2:"r";s:3:"韘";s:2:"s";s:3:"韙";s:2:"t";s:3:"韚";s:2:"u";s:3:"韛";s:2:"v";s:3:"韜";s:2:"w";s:3:"韝";s:2:"x";s:3:"韞";s:2:"y";s:3:"韟";s:2:"z";s:3:"韠";s:2:"{";s:3:"韡";s:2:"|";s:3:"韢";s:2:"}";s:3:"韣";s:2:"~";s:3:"韤";s:2:"";s:3:"韥";s:2:"";s:3:"韦";s:2:"Τ";s:3:"韧";s:2:"";s:3:"韨";s:2:"";s:3:"韩";s:2:"";s:3:"韪";s:2:"";s:3:"韫";s:2:"";s:3:"韬";s:2:"";s:3:"韭";s:2:"";s:3:"韮";s:2:"";s:3:"韯";s:2:"";s:3:"韰";s:2:"";s:3:"韱";s:2:"";s:3:"韲";s:2:"";s:3:"音";s:2:"";s:3:"韴";s:2:"";s:3:"韵";s:2:"";s:3:"韶";s:2:"";s:3:"韷";s:2:"";s:3:"韸";s:2:"";s:3:"韹";s:2:"";s:3:"韺";s:2:"";s:3:"韻";s:2:"";s:3:"韼";s:2:"";s:3:"韽";s:2:"";s:3:"韾";s:2:"";s:3:"響";s:2:"";s:3:"頀";s:2:"";s:3:"頁";s:2:"";s:3:"頂";s:2:"";s:3:"頃";s:2:"";s:3:"頄";s:2:"";s:3:"項";s:2:"";s:3:"順";s:2:"";s:3:"頇";s:2:"";s:3:"須";s:2:"";s:3:"頉";s:2:"";s:3:"頊";s:2:"";s:3:"頋";s:2:"";s:3:"頌";s:2:"";s:3:"頍";s:2:"";s:3:"頎";s:2:"";s:3:"頏";s:2:"@";s:3:"預";s:2:"A";s:3:"頑";s:2:"B";s:3:"頒";s:2:"C";s:3:"頓";s:2:"D";s:3:"頔";s:2:"E";s:3:"頕";s:2:"F";s:3:"頖";s:2:"G";s:3:"頗";s:2:"H";s:3:"領";s:2:"I";s:3:"頙";s:2:"J";s:3:"頚";s:2:"K";s:3:"頛";s:2:"L";s:3:"頜";s:2:"M";s:3:"頝";s:2:"N";s:3:"頞";s:2:"O";s:3:"頟";s:2:"P";s:3:"頠";s:2:"Q";s:3:"頡";s:2:"R";s:3:"頢";s:2:"S";s:3:"頣";s:2:"T";s:3:"頤";s:2:"U";s:3:"頥";s:2:"V";s:3:"頦";s:2:"W";s:3:"頧";s:2:"X";s:3:"頨";s:2:"Y";s:3:"頩";s:2:"Z";s:3:"頪";s:2:"[";s:3:"頫";s:2:"\";s:3:"頬";s:2:"]";s:3:"頭";s:2:"^";s:3:"頮";s:2:"_";s:3:"頯";s:2:"`";s:3:"頰";s:2:"a";s:3:"頱";s:2:"b";s:3:"頲";s:2:"c";s:3:"頳";s:2:"d";s:3:"頴";s:2:"e";s:3:"頵";s:2:"f";s:3:"頶";s:2:"g";s:3:"頷";s:2:"h";s:3:"頸";s:2:"i";s:3:"頹";s:2:"j";s:3:"頺";s:2:"k";s:3:"頻";s:2:"l";s:3:"頼";s:2:"m";s:3:"頽";s:2:"n";s:3:"頾";s:2:"o";s:3:"頿";s:2:"p";s:3:"顀";s:2:"q";s:3:"顁";s:2:"r";s:3:"顂";s:2:"s";s:3:"顃";s:2:"t";s:3:"顄";s:2:"u";s:3:"顅";s:2:"v";s:3:"顆";s:2:"w";s:3:"顇";s:2:"x";s:3:"顈";s:2:"y";s:3:"顉";s:2:"z";s:3:"顊";s:2:"{";s:3:"顋";s:2:"|";s:3:"題";s:2:"}";s:3:"額";s:2:"~";s:3:"顎";s:2:"";s:3:"顏";s:2:"";s:3:"顐";s:2:"";s:3:"顑";s:2:"";s:3:"顒";s:2:"";s:3:"顓";s:2:"";s:3:"顔";s:2:"";s:3:"顕";s:2:"";s:3:"顖";s:2:"";s:3:"顗";s:2:"";s:3:"願";s:2:"";s:3:"顙";s:2:"";s:3:"顚";s:2:"";s:3:"顛";s:2:"";s:3:"顜";s:2:"";s:3:"顝";s:2:"";s:3:"類";s:2:"";s:3:"顟";s:2:"";s:3:"顠";s:2:"";s:3:"顡";s:2:"";s:3:"顢";s:2:"";s:3:"顣";s:2:"";s:3:"顤";s:2:"";s:3:"顥";s:2:"";s:3:"顦";s:2:"";s:3:"顧";s:2:"";s:3:"顨";s:2:"";s:3:"顩";s:2:"";s:3:"顪";s:2:"";s:3:"顫";s:2:"";s:3:"顬";s:2:"";s:3:"顭";s:2:"";s:3:"顮";s:2:"";s:3:"顯";s:2:"@";s:3:"顰";s:2:"A";s:3:"顱";s:2:"B";s:3:"顲";s:2:"C";s:3:"顳";s:2:"D";s:3:"顴";s:2:"E";s:3:"页";s:2:"ҳ";s:3:"顶";s:2:"";s:3:"顷";s:2:"";s:3:"顸";s:2:"";s:3:"项";s:2:"";s:3:"顺";s:2:"˳";s:3:"须";s:2:"";s:3:"顼";s:2:"";s:3:"顽";s:2:"";s:3:"顾";s:2:"";s:3:"顿";s:2:"";s:3:"颀";s:2:"";s:3:"颁";s:2:"";s:3:"颂";s:2:"";s:3:"颃";s:2:"";s:3:"预";s:2:"Ԥ";s:3:"颅";s:2:"­";s:3:"领";s:2:"";s:3:"颇";s:2:"";s:3:"颈";s:2:"";s:3:"颉";s:2:"";s:3:"颊";s:2:"";s:3:"颋";s:2:"F";s:3:"颌";s:2:"";s:3:"颍";s:2:"";s:3:"颎";s:2:"G";s:3:"颏";s:2:"";s:3:"颐";s:2:"";s:3:"频";s:2:"Ƶ";s:3:"颒";s:2:"H";s:3:"颓";s:2:"";s:3:"颔";s:2:"";s:3:"颕";s:2:"I";s:3:"颖";s:2:"ӱ";s:3:"颗";s:2:"";s:3:"题";s:2:"";s:3:"颙";s:2:"J";s:3:"颚";s:2:"";s:3:"颛";s:2:"";s:3:"颜";s:2:"";s:3:"额";s:2:"";s:3:"颞";s:2:"";s:3:"颟";s:2:"";s:3:"颠";s:2:"";s:3:"颡";s:2:"";s:3:"颢";s:2:"";s:3:"颣";s:2:"K";s:3:"颤";s:2:"";s:3:"颥";s:2:"";s:3:"颦";s:2:"";s:3:"颧";s:2:"ȧ";s:3:"風";s:2:"L";s:3:"颩";s:2:"M";s:3:"颪";s:2:"N";s:3:"颫";s:2:"O";s:3:"颬";s:2:"P";s:3:"颭";s:2:"Q";s:3:"颮";s:2:"R";s:3:"颯";s:2:"S";s:3:"颰";s:2:"T";s:3:"颱";s:2:"U";s:3:"颲";s:2:"V";s:3:"颳";s:2:"W";s:3:"颴";s:2:"X";s:3:"颵";s:2:"Y";s:3:"颶";s:2:"Z";s:3:"颷";s:2:"[";s:3:"颸";s:2:"\";s:3:"颹";s:2:"]";s:3:"颺";s:2:"^";s:3:"颻";s:2:"_";s:3:"颼";s:2:"`";s:3:"颽";s:2:"a";s:3:"颾";s:2:"b";s:3:"颿";s:2:"c";s:3:"飀";s:2:"d";s:3:"飁";s:2:"e";s:3:"飂";s:2:"f";s:3:"飃";s:2:"g";s:3:"飄";s:2:"h";s:3:"飅";s:2:"i";s:3:"飆";s:2:"j";s:3:"飇";s:2:"k";s:3:"飈";s:2:"l";s:3:"飉";s:2:"m";s:3:"飊";s:2:"n";s:3:"飋";s:2:"o";s:3:"飌";s:2:"p";s:3:"飍";s:2:"q";s:3:"风";s:2:"";s:3:"飏";s:2:"r";s:3:"飐";s:2:"s";s:3:"飑";s:2:"";s:3:"飒";s:2:"";s:3:"飓";s:2:"";s:3:"飔";s:2:"t";s:3:"飕";s:2:"";s:3:"飖";s:2:"u";s:3:"飗";s:2:"v";s:3:"飘";s:2:"Ʈ";s:3:"飙";s:2:"";s:3:"飚";s:2:"";s:3:"飛";s:2:"w";s:3:"飜";s:2:"x";s:3:"飝";s:2:"y";s:3:"飞";s:2:"";s:3:"食";s:2:"ʳ";s:3:"飠";s:2:"z";s:3:"飡";s:2:"{";s:3:"飢";s:2:"|";s:3:"飣";s:2:"}";s:3:"飤";s:2:"~";s:3:"飥";s:2:"";s:3:"飦";s:2:"";s:3:"飧";s:2:"";s:3:"飨";s:2:"";s:3:"飩";s:2:"";s:3:"飪";s:2:"";s:3:"飫";s:2:"";s:3:"飬";s:2:"";s:3:"飭";s:2:"";s:3:"飮";s:2:"";s:3:"飯";s:2:"";s:3:"飰";s:2:"";s:3:"飱";s:2:"";s:3:"飲";s:2:"";s:3:"飳";s:2:"";s:3:"飴";s:2:"";s:3:"飵";s:2:"";s:3:"飶";s:2:"";s:3:"飷";s:2:"";s:3:"飸";s:2:"";s:3:"飹";s:2:"";s:3:"飺";s:2:"";s:3:"飻";s:2:"";s:3:"飼";s:2:"";s:3:"飽";s:2:"";s:3:"飾";s:2:"";s:3:"飿";s:2:"";s:3:"餀";s:2:"";s:3:"餁";s:2:"";s:3:"餂";s:2:"";s:3:"餃";s:2:"";s:3:"餄";s:2:"";s:3:"餅";s:2:"";s:3:"餆";s:2:"";s:3:"餇";s:2:"";s:3:"餈";s:2:"@";s:3:"餉";s:2:"A";s:3:"養";s:2:"B";s:3:"餋";s:2:"C";s:3:"餌";s:2:"D";s:3:"餍";s:2:"";s:3:"餎";s:2:"E";s:3:"餏";s:2:"F";s:3:"餐";s:2:"";s:3:"餑";s:2:"G";s:3:"餒";s:2:"H";s:3:"餓";s:2:"I";s:3:"餔";s:2:"J";s:3:"餕";s:2:"K";s:3:"餖";s:2:"L";s:3:"餗";s:2:"M";s:3:"餘";s:2:"N";s:3:"餙";s:2:"O";s:3:"餚";s:2:"P";s:3:"餛";s:2:"Q";s:3:"餜";s:2:"R";s:3:"餝";s:2:"S";s:3:"餞";s:2:"T";s:3:"餟";s:2:"U";s:3:"餠";s:2:"V";s:3:"餡";s:2:"W";s:3:"餢";s:2:"X";s:3:"餣";s:2:"Y";s:3:"餤";s:2:"Z";s:3:"餥";s:2:"[";s:3:"餦";s:2:"\";s:3:"餧";s:2:"]";s:3:"館";s:2:"^";s:3:"餩";s:2:"_";s:3:"餪";s:2:"`";s:3:"餫";s:2:"a";s:3:"餬";s:2:"b";s:3:"餭";s:2:"c";s:3:"餮";s:2:"";s:3:"餯";s:2:"d";s:3:"餰";s:2:"e";s:3:"餱";s:2:"f";s:3:"餲";s:2:"g";s:3:"餳";s:2:"h";s:3:"餴";s:2:"i";s:3:"餵";s:2:"j";s:3:"餶";s:2:"k";s:3:"餷";s:2:"l";s:3:"餸";s:2:"m";s:3:"餹";s:2:"n";s:3:"餺";s:2:"o";s:3:"餻";s:2:"p";s:3:"餼";s:2:"q";s:3:"餽";s:2:"r";s:3:"餾";s:2:"s";s:3:"餿";s:2:"t";s:3:"饀";s:2:"u";s:3:"饁";s:2:"v";s:3:"饂";s:2:"w";s:3:"饃";s:2:"x";s:3:"饄";s:2:"y";s:3:"饅";s:2:"z";s:3:"饆";s:2:"{";s:3:"饇";s:2:"|";s:3:"饈";s:2:"}";s:3:"饉";s:2:"~";s:3:"饊";s:2:"";s:3:"饋";s:2:"";s:3:"饌";s:2:"";s:3:"饍";s:2:"";s:3:"饎";s:2:"";s:3:"饏";s:2:"";s:3:"饐";s:2:"";s:3:"饑";s:2:"";s:3:"饒";s:2:"";s:3:"饓";s:2:"";s:3:"饔";s:2:"";s:3:"饕";s:2:"";s:3:"饖";s:2:"";s:3:"饗";s:2:"";s:3:"饘";s:2:"";s:3:"饙";s:2:"";s:3:"饚";s:2:"";s:3:"饛";s:2:"";s:3:"饜";s:2:"";s:3:"饝";s:2:"";s:3:"饞";s:2:"";s:3:"饟";s:2:"";s:3:"饠";s:2:"";s:3:"饡";s:2:"";s:3:"饢";s:2:"";s:3:"饣";s:2:"";s:3:"饤";s:2:"";s:3:"饥";s:2:"";s:3:"饦";s:2:"";s:3:"饧";s:2:"";s:3:"饨";s:2:"";s:3:"饩";s:2:"";s:3:"饪";s:2:"";s:3:"饫";s:2:"";s:3:"饬";s:2:"";s:3:"饭";s:2:"";s:3:"饮";s:2:"";s:3:"饯";s:2:"";s:3:"饰";s:2:"";s:3:"饱";s:2:"";s:3:"饲";s:2:"";s:3:"饳";s:2:"";s:3:"饴";s:2:"";s:3:"饵";s:2:"";s:3:"饶";s:2:"";s:3:"饷";s:2:"";s:3:"饸";s:2:"";s:3:"饹";s:2:"";s:3:"饺";s:2:"";s:3:"饻";s:2:"";s:3:"饼";s:2:"";s:3:"饽";s:2:"";s:3:"饾";s:2:"";s:3:"饿";s:2:"";s:3:"馀";s:2:"";s:3:"馁";s:2:"";s:3:"馂";s:2:"";s:3:"馃";s:2:"";s:3:"馄";s:2:"";s:3:"馅";s:2:"";s:3:"馆";s:2:"";s:3:"馇";s:2:"";s:3:"馈";s:2:"";s:3:"馉";s:2:"";s:3:"馊";s:2:"";s:3:"馋";s:2:"";s:3:"馌";s:2:"@";s:3:"馍";s:2:"";s:3:"馎";s:2:"A";s:3:"馏";s:2:"";s:3:"馐";s:2:"";s:3:"馑";s:2:"";s:3:"馒";s:2:"";s:3:"馓";s:2:"";s:3:"馔";s:2:"";s:3:"馕";s:2:"";s:3:"首";s:2:"";s:3:"馗";s:2:"ظ";s:3:"馘";s:2:"";s:3:"香";s:2:"";s:3:"馚";s:2:"B";s:3:"馛";s:2:"C";s:3:"馜";s:2:"D";s:3:"馝";s:2:"E";s:3:"馞";s:2:"F";s:3:"馟";s:2:"G";s:3:"馠";s:2:"H";s:3:"馡";s:2:"I";s:3:"馢";s:2:"J";s:3:"馣";s:2:"K";s:3:"馤";s:2:"L";s:3:"馥";s:2:"";s:3:"馦";s:2:"M";s:3:"馧";s:2:"N";s:3:"馨";s:2:"ܰ";s:3:"馩";s:2:"O";s:3:"馪";s:2:"P";s:3:"馫";s:2:"Q";s:3:"馬";s:2:"R";s:3:"馭";s:2:"S";s:3:"馮";s:2:"T";s:3:"馯";s:2:"U";s:3:"馰";s:2:"V";s:3:"馱";s:2:"W";s:3:"馲";s:2:"X";s:3:"馳";s:2:"Y";s:3:"馴";s:2:"Z";s:3:"馵";s:2:"[";s:3:"馶";s:2:"\";s:3:"馷";s:2:"]";s:3:"馸";s:2:"^";s:3:"馹";s:2:"_";s:3:"馺";s:2:"`";s:3:"馻";s:2:"a";s:3:"馼";s:2:"b";s:3:"馽";s:2:"c";s:3:"馾";s:2:"d";s:3:"馿";s:2:"e";s:3:"駀";s:2:"f";s:3:"駁";s:2:"g";s:3:"駂";s:2:"h";s:3:"駃";s:2:"i";s:3:"駄";s:2:"j";s:3:"駅";s:2:"k";s:3:"駆";s:2:"l";s:3:"駇";s:2:"m";s:3:"駈";s:2:"n";s:3:"駉";s:2:"o";s:3:"駊";s:2:"p";s:3:"駋";s:2:"q";s:3:"駌";s:2:"r";s:3:"駍";s:2:"s";s:3:"駎";s:2:"t";s:3:"駏";s:2:"u";s:3:"駐";s:2:"v";s:3:"駑";s:2:"w";s:3:"駒";s:2:"x";s:3:"駓";s:2:"y";s:3:"駔";s:2:"z";s:3:"駕";s:2:"{";s:3:"駖";s:2:"|";s:3:"駗";s:2:"}";s:3:"駘";s:2:"~";s:3:"駙";s:2:"";s:3:"駚";s:2:"";s:3:"駛";s:2:"";s:3:"駜";s:2:"";s:3:"駝";s:2:"";s:3:"駞";s:2:"";s:3:"駟";s:2:"";s:3:"駠";s:2:"";s:3:"駡";s:2:"";s:3:"駢";s:2:"";s:3:"駣";s:2:"";s:3:"駤";s:2:"";s:3:"駥";s:2:"";s:3:"駦";s:2:"";s:3:"駧";s:2:"";s:3:"駨";s:2:"";s:3:"駩";s:2:"";s:3:"駪";s:2:"";s:3:"駫";s:2:"";s:3:"駬";s:2:"";s:3:"駭";s:2:"";s:3:"駮";s:2:"";s:3:"駯";s:2:"";s:3:"駰";s:2:"";s:3:"駱";s:2:"";s:3:"駲";s:2:"";s:3:"駳";s:2:"";s:3:"駴";s:2:"";s:3:"駵";s:2:"";s:3:"駶";s:2:"";s:3:"駷";s:2:"";s:3:"駸";s:2:"";s:3:"駹";s:2:"";s:3:"駺";s:2:"@";s:3:"駻";s:2:"A";s:3:"駼";s:2:"B";s:3:"駽";s:2:"C";s:3:"駾";s:2:"D";s:3:"駿";s:2:"E";s:3:"騀";s:2:"F";s:3:"騁";s:2:"G";s:3:"騂";s:2:"H";s:3:"騃";s:2:"I";s:3:"騄";s:2:"J";s:3:"騅";s:2:"K";s:3:"騆";s:2:"L";s:3:"騇";s:2:"M";s:3:"騈";s:2:"N";s:3:"騉";s:2:"O";s:3:"騊";s:2:"P";s:3:"騋";s:2:"Q";s:3:"騌";s:2:"R";s:3:"騍";s:2:"S";s:3:"騎";s:2:"T";s:3:"騏";s:2:"U";s:3:"騐";s:2:"V";s:3:"騑";s:2:"W";s:3:"騒";s:2:"X";s:3:"験";s:2:"Y";s:3:"騔";s:2:"Z";s:3:"騕";s:2:"[";s:3:"騖";s:2:"\";s:3:"騗";s:2:"]";s:3:"騘";s:2:"^";s:3:"騙";s:2:"_";s:3:"騚";s:2:"`";s:3:"騛";s:2:"a";s:3:"騜";s:2:"b";s:3:"騝";s:2:"c";s:3:"騞";s:2:"d";s:3:"騟";s:2:"e";s:3:"騠";s:2:"f";s:3:"騡";s:2:"g";s:3:"騢";s:2:"h";s:3:"騣";s:2:"i";s:3:"騤";s:2:"j";s:3:"騥";s:2:"k";s:3:"騦";s:2:"l";s:3:"騧";s:2:"m";s:3:"騨";s:2:"n";s:3:"騩";s:2:"o";s:3:"騪";s:2:"p";s:3:"騫";s:2:"q";s:3:"騬";s:2:"r";s:3:"騭";s:2:"s";s:3:"騮";s:2:"t";s:3:"騯";s:2:"u";s:3:"騰";s:2:"v";s:3:"騱";s:2:"w";s:3:"騲";s:2:"x";s:3:"騳";s:2:"y";s:3:"騴";s:2:"z";s:3:"騵";s:2:"{";s:3:"騶";s:2:"|";s:3:"騷";s:2:"}";s:3:"騸";s:2:"~";s:3:"騹";s:2:"";s:3:"騺";s:2:"";s:3:"騻";s:2:"";s:3:"騼";s:2:"";s:3:"騽";s:2:"";s:3:"騾";s:2:"";s:3:"騿";s:2:"";s:3:"驀";s:2:"";s:3:"驁";s:2:"";s:3:"驂";s:2:"";s:3:"驃";s:2:"";s:3:"驄";s:2:"";s:3:"驅";s:2:"";s:3:"驆";s:2:"";s:3:"驇";s:2:"";s:3:"驈";s:2:"";s:3:"驉";s:2:"";s:3:"驊";s:2:"";s:3:"驋";s:2:"";s:3:"驌";s:2:"";s:3:"驍";s:2:"";s:3:"驎";s:2:"";s:3:"驏";s:2:"";s:3:"驐";s:2:"";s:3:"驑";s:2:"";s:3:"驒";s:2:"";s:3:"驓";s:2:"";s:3:"驔";s:2:"";s:3:"驕";s:2:"";s:3:"驖";s:2:"";s:3:"驗";s:2:"";s:3:"驘";s:2:"";s:3:"驙";s:2:"";s:3:"驚";s:2:"@";s:3:"驛";s:2:"A";s:3:"驜";s:2:"B";s:3:"驝";s:2:"C";s:3:"驞";s:2:"D";s:3:"驟";s:2:"E";s:3:"驠";s:2:"F";s:3:"驡";s:2:"G";s:3:"驢";s:2:"H";s:3:"驣";s:2:"I";s:3:"驤";s:2:"J";s:3:"驥";s:2:"K";s:3:"驦";s:2:"L";s:3:"驧";s:2:"M";s:3:"驨";s:2:"N";s:3:"驩";s:2:"O";s:3:"驪";s:2:"P";s:3:"驫";s:2:"Q";s:3:"马";s:2:"";s:3:"驭";s:2:"Ԧ";s:3:"驮";s:2:"";s:3:"驯";s:2:"ѱ";s:3:"驰";s:2:"";s:3:"驱";s:2:"";s:3:"驲";s:2:"R";s:3:"驳";s:2:"";s:3:"驴";s:2:"¿";s:3:"驵";s:2:"";s:3:"驶";s:2:"ʻ";s:3:"驷";s:2:"";s:3:"驸";s:2:"";s:3:"驹";s:2:"";s:3:"驺";s:2:"";s:3:"驻";s:2:"פ";s:3:"驼";s:2:"";s:3:"驽";s:2:"";s:3:"驾";s:2:"";s:3:"驿";s:2:"";s:3:"骀";s:2:"";s:3:"骁";s:2:"";s:3:"骂";s:2:"";s:3:"骃";s:2:"S";s:3:"骄";s:2:"";s:3:"骅";s:2:"";s:3:"骆";s:2:"";s:3:"骇";s:2:"";s:3:"骈";s:2:"";s:3:"骉";s:2:"T";s:3:"骊";s:2:"";s:3:"骋";s:2:"";s:3:"验";s:2:"";s:3:"骍";s:2:"U";s:3:"骎";s:2:"V";s:3:"骏";s:2:"";s:3:"骐";s:2:"";s:3:"骑";s:2:"";s:3:"骒";s:2:"";s:3:"骓";s:2:"";s:3:"骔";s:2:"W";s:3:"骕";s:2:"X";s:3:"骖";s:2:"";s:3:"骗";s:2:"ƭ";s:3:"骘";s:2:"";s:3:"骙";s:2:"Y";s:3:"骚";s:2:"ɧ";s:3:"骛";s:2:"";s:3:"骜";s:2:"";s:3:"骝";s:2:"";s:3:"骞";s:2:"";s:3:"骟";s:2:"";s:3:"骠";s:2:"";s:3:"骡";s:2:"";s:3:"骢";s:2:"";s:3:"骣";s:2:"";s:3:"骤";s:2:"";s:3:"骥";s:2:"";s:3:"骦";s:2:"Z";s:3:"骧";s:2:"";s:3:"骨";s:2:"";s:3:"骩";s:2:"[";s:3:"骪";s:2:"\";s:3:"骫";s:2:"]";s:3:"骬";s:2:"^";s:3:"骭";s:2:"_";s:3:"骮";s:2:"`";s:3:"骯";s:2:"a";s:3:"骰";s:2:"";s:3:"骱";s:2:"";s:3:"骲";s:2:"b";s:3:"骳";s:2:"c";s:3:"骴";s:2:"d";s:3:"骵";s:2:"e";s:3:"骶";s:2:"";s:3:"骷";s:2:"";s:3:"骸";s:2:"";s:3:"骹";s:2:"f";s:3:"骺";s:2:"";s:3:"骻";s:2:"g";s:3:"骼";s:2:"";s:3:"骽";s:2:"h";s:3:"骾";s:2:"i";s:3:"骿";s:2:"j";s:3:"髀";s:2:"";s:3:"髁";s:2:"";s:3:"髂";s:2:"";s:3:"髃";s:2:"k";s:3:"髄";s:2:"l";s:3:"髅";s:2:"";s:3:"髆";s:2:"m";s:3:"髇";s:2:"n";s:3:"髈";s:2:"o";s:3:"髉";s:2:"p";s:3:"髊";s:2:"q";s:3:"髋";s:2:"";s:3:"髌";s:2:"";s:3:"髍";s:2:"r";s:3:"髎";s:2:"s";s:3:"髏";s:2:"t";s:3:"髐";s:2:"u";s:3:"髑";s:2:"";s:3:"髒";s:2:"v";s:3:"髓";s:2:"";s:3:"體";s:2:"w";s:3:"髕";s:2:"x";s:3:"髖";s:2:"y";s:3:"髗";s:2:"z";s:3:"高";s:2:"";s:3:"髙";s:2:"{";s:3:"髚";s:2:"|";s:3:"髛";s:2:"}";s:3:"髜";s:2:"~";s:3:"髝";s:2:"";s:3:"髞";s:2:"";s:3:"髟";s:2:"";s:3:"髠";s:2:"";s:3:"髡";s:2:"";s:3:"髢";s:2:"";s:3:"髣";s:2:"";s:3:"髤";s:2:"";s:3:"髥";s:2:"";s:3:"髦";s:2:"";s:3:"髧";s:2:"";s:3:"髨";s:2:"";s:3:"髩";s:2:"";s:3:"髪";s:2:"";s:3:"髫";s:2:"";s:3:"髬";s:2:"";s:3:"髭";s:2:"";s:3:"髮";s:2:"";s:3:"髯";s:2:"";s:3:"髰";s:2:"";s:3:"髱";s:2:"";s:3:"髲";s:2:"";s:3:"髳";s:2:"";s:3:"髴";s:2:"";s:3:"髵";s:2:"";s:3:"髶";s:2:"";s:3:"髷";s:2:"";s:3:"髸";s:2:"";s:3:"髹";s:2:"";s:3:"髺";s:2:"";s:3:"髻";s:2:"";s:3:"髼";s:2:"";s:3:"髽";s:2:"";s:3:"髾";s:2:"";s:3:"髿";s:2:"";s:3:"鬀";s:2:"";s:3:"鬁";s:2:"";s:3:"鬂";s:2:"";s:3:"鬃";s:2:"";s:3:"鬄";s:2:"";s:3:"鬅";s:2:"";s:3:"鬆";s:2:"";s:3:"鬇";s:2:"@";s:3:"鬈";s:2:"";s:3:"鬉";s:2:"A";s:3:"鬊";s:2:"B";s:3:"鬋";s:2:"C";s:3:"鬌";s:2:"D";s:3:"鬍";s:2:"E";s:3:"鬎";s:2:"F";s:3:"鬏";s:2:"";s:3:"鬐";s:2:"G";s:3:"鬑";s:2:"H";s:3:"鬒";s:2:"I";s:3:"鬓";s:2:"";s:3:"鬔";s:2:"J";s:3:"鬕";s:2:"K";s:3:"鬖";s:2:"L";s:3:"鬗";s:2:"M";s:3:"鬘";s:2:"N";s:3:"鬙";s:2:"O";s:3:"鬚";s:2:"P";s:3:"鬛";s:2:"Q";s:3:"鬜";s:2:"R";s:3:"鬝";s:2:"S";s:3:"鬞";s:2:"T";s:3:"鬟";s:2:"";s:3:"鬠";s:2:"U";s:3:"鬡";s:2:"V";s:3:"鬢";s:2:"W";s:3:"鬣";s:2:"";s:3:"鬤";s:2:"X";s:3:"鬥";s:2:"Y";s:3:"鬦";s:2:"Z";s:3:"鬧";s:2:"[";s:3:"鬨";s:2:"\";s:3:"鬩";s:2:"]";s:3:"鬪";s:2:"^";s:3:"鬫";s:2:"_";s:3:"鬬";s:2:"`";s:3:"鬭";s:2:"a";s:3:"鬮";s:2:"b";s:3:"鬯";s:2:"";s:3:"鬰";s:2:"c";s:3:"鬱";s:2:"d";s:3:"鬲";s:2:"ت";s:3:"鬳";s:2:"e";s:3:"鬴";s:2:"f";s:3:"鬵";s:2:"g";s:3:"鬶";s:2:"h";s:3:"鬷";s:2:"i";s:3:"鬸";s:2:"j";s:3:"鬹";s:2:"k";s:3:"鬺";s:2:"l";s:3:"鬻";s:2:"";s:3:"鬼";s:2:"";s:3:"鬽";s:2:"m";s:3:"鬾";s:2:"n";s:3:"鬿";s:2:"o";s:3:"魀";s:2:"p";s:3:"魁";s:2:"";s:3:"魂";s:2:"";s:3:"魃";s:2:"";s:3:"魄";s:2:"";s:3:"魅";s:2:"";s:3:"魆";s:2:"q";s:3:"魇";s:2:"";s:3:"魈";s:2:"";s:3:"魉";s:2:"";s:3:"魊";s:2:"r";s:3:"魋";s:2:"s";s:3:"魌";s:2:"t";s:3:"魍";s:2:"";s:3:"魎";s:2:"u";s:3:"魏";s:2:"κ";s:3:"魐";s:2:"v";s:3:"魑";s:2:"";s:3:"魒";s:2:"w";s:3:"魓";s:2:"x";s:3:"魔";s:2:"ħ";s:3:"魕";s:2:"y";s:3:"魖";s:2:"z";s:3:"魗";s:2:"{";s:3:"魘";s:2:"|";s:3:"魙";s:2:"}";s:3:"魚";s:2:"~";s:3:"魛";s:2:"";s:3:"魜";s:2:"";s:3:"魝";s:2:"";s:3:"魞";s:2:"";s:3:"魟";s:2:"";s:3:"魠";s:2:"";s:3:"魡";s:2:"";s:3:"魢";s:2:"";s:3:"魣";s:2:"";s:3:"魤";s:2:"";s:3:"魥";s:2:"";s:3:"魦";s:2:"";s:3:"魧";s:2:"";s:3:"魨";s:2:"";s:3:"魩";s:2:"";s:3:"魪";s:2:"";s:3:"魫";s:2:"";s:3:"魬";s:2:"";s:3:"魭";s:2:"";s:3:"魮";s:2:"";s:3:"魯";s:2:"";s:3:"魰";s:2:"";s:3:"魱";s:2:"";s:3:"魲";s:2:"";s:3:"魳";s:2:"";s:3:"魴";s:2:"";s:3:"魵";s:2:"";s:3:"魶";s:2:"";s:3:"魷";s:2:"";s:3:"魸";s:2:"";s:3:"魹";s:2:"";s:3:"魺";s:2:"";s:3:"魻";s:2:"";s:3:"魼";s:2:"@";s:3:"魽";s:2:"A";s:3:"魾";s:2:"B";s:3:"魿";s:2:"C";s:3:"鮀";s:2:"D";s:3:"鮁";s:2:"E";s:3:"鮂";s:2:"F";s:3:"鮃";s:2:"G";s:3:"鮄";s:2:"H";s:3:"鮅";s:2:"I";s:3:"鮆";s:2:"J";s:3:"鮇";s:2:"K";s:3:"鮈";s:2:"L";s:3:"鮉";s:2:"M";s:3:"鮊";s:2:"N";s:3:"鮋";s:2:"O";s:3:"鮌";s:2:"P";s:3:"鮍";s:2:"Q";s:3:"鮎";s:2:"R";s:3:"鮏";s:2:"S";s:3:"鮐";s:2:"T";s:3:"鮑";s:2:"U";s:3:"鮒";s:2:"V";s:3:"鮓";s:2:"W";s:3:"鮔";s:2:"X";s:3:"鮕";s:2:"Y";s:3:"鮖";s:2:"Z";s:3:"鮗";s:2:"[";s:3:"鮘";s:2:"\";s:3:"鮙";s:2:"]";s:3:"鮚";s:2:"^";s:3:"鮛";s:2:"_";s:3:"鮜";s:2:"`";s:3:"鮝";s:2:"a";s:3:"鮞";s:2:"b";s:3:"鮟";s:2:"c";s:3:"鮠";s:2:"d";s:3:"鮡";s:2:"e";s:3:"鮢";s:2:"f";s:3:"鮣";s:2:"g";s:3:"鮤";s:2:"h";s:3:"鮥";s:2:"i";s:3:"鮦";s:2:"j";s:3:"鮧";s:2:"k";s:3:"鮨";s:2:"l";s:3:"鮩";s:2:"m";s:3:"鮪";s:2:"n";s:3:"鮫";s:2:"o";s:3:"鮬";s:2:"p";s:3:"鮭";s:2:"q";s:3:"鮮";s:2:"r";s:3:"鮯";s:2:"s";s:3:"鮰";s:2:"t";s:3:"鮱";s:2:"u";s:3:"鮲";s:2:"v";s:3:"鮳";s:2:"w";s:3:"鮴";s:2:"x";s:3:"鮵";s:2:"y";s:3:"鮶";s:2:"z";s:3:"鮷";s:2:"{";s:3:"鮸";s:2:"|";s:3:"鮹";s:2:"}";s:3:"鮺";s:2:"~";s:3:"鮻";s:2:"";s:3:"鮼";s:2:"";s:3:"鮽";s:2:"";s:3:"鮾";s:2:"";s:3:"鮿";s:2:"";s:3:"鯀";s:2:"";s:3:"鯁";s:2:"";s:3:"鯂";s:2:"";s:3:"鯃";s:2:"";s:3:"鯄";s:2:"";s:3:"鯅";s:2:"";s:3:"鯆";s:2:"";s:3:"鯇";s:2:"";s:3:"鯈";s:2:"";s:3:"鯉";s:2:"";s:3:"鯊";s:2:"";s:3:"鯋";s:2:"";s:3:"鯌";s:2:"";s:3:"鯍";s:2:"";s:3:"鯎";s:2:"";s:3:"鯏";s:2:"";s:3:"鯐";s:2:"";s:3:"鯑";s:2:"";s:3:"鯒";s:2:"";s:3:"鯓";s:2:"";s:3:"鯔";s:2:"";s:3:"鯕";s:2:"";s:3:"鯖";s:2:"";s:3:"鯗";s:2:"";s:3:"鯘";s:2:"";s:3:"鯙";s:2:"";s:3:"鯚";s:2:"";s:3:"鯛";s:2:"";s:3:"鯜";s:2:"@";s:3:"鯝";s:2:"A";s:3:"鯞";s:2:"B";s:3:"鯟";s:2:"C";s:3:"鯠";s:2:"D";s:3:"鯡";s:2:"E";s:3:"鯢";s:2:"F";s:3:"鯣";s:2:"G";s:3:"鯤";s:2:"H";s:3:"鯥";s:2:"I";s:3:"鯦";s:2:"J";s:3:"鯧";s:2:"K";s:3:"鯨";s:2:"L";s:3:"鯩";s:2:"M";s:3:"鯪";s:2:"N";s:3:"鯫";s:2:"O";s:3:"鯬";s:2:"P";s:3:"鯭";s:2:"Q";s:3:"鯮";s:2:"R";s:3:"鯯";s:2:"S";s:3:"鯰";s:2:"T";s:3:"鯱";s:2:"U";s:3:"鯲";s:2:"V";s:3:"鯳";s:2:"W";s:3:"鯴";s:2:"X";s:3:"鯵";s:2:"Y";s:3:"鯶";s:2:"Z";s:3:"鯷";s:2:"[";s:3:"鯸";s:2:"\";s:3:"鯹";s:2:"]";s:3:"鯺";s:2:"^";s:3:"鯻";s:2:"_";s:3:"鯼";s:2:"`";s:3:"鯽";s:2:"a";s:3:"鯾";s:2:"b";s:3:"鯿";s:2:"c";s:3:"鰀";s:2:"d";s:3:"鰁";s:2:"e";s:3:"鰂";s:2:"f";s:3:"鰃";s:2:"g";s:3:"鰄";s:2:"h";s:3:"鰅";s:2:"i";s:3:"鰆";s:2:"j";s:3:"鰇";s:2:"k";s:3:"鰈";s:2:"l";s:3:"鰉";s:2:"m";s:3:"鰊";s:2:"n";s:3:"鰋";s:2:"o";s:3:"鰌";s:2:"p";s:3:"鰍";s:2:"q";s:3:"鰎";s:2:"r";s:3:"鰏";s:2:"s";s:3:"鰐";s:2:"t";s:3:"鰑";s:2:"u";s:3:"鰒";s:2:"v";s:3:"鰓";s:2:"w";s:3:"鰔";s:2:"x";s:3:"鰕";s:2:"y";s:3:"鰖";s:2:"z";s:3:"鰗";s:2:"{";s:3:"鰘";s:2:"|";s:3:"鰙";s:2:"}";s:3:"鰚";s:2:"~";s:3:"鰛";s:2:"";s:3:"鰜";s:2:"";s:3:"鰝";s:2:"";s:3:"鰞";s:2:"";s:3:"鰟";s:2:"";s:3:"鰠";s:2:"";s:3:"鰡";s:2:"";s:3:"鰢";s:2:"";s:3:"鰣";s:2:"";s:3:"鰤";s:2:"";s:3:"鰥";s:2:"";s:3:"鰦";s:2:"";s:3:"鰧";s:2:"";s:3:"鰨";s:2:"";s:3:"鰩";s:2:"";s:3:"鰪";s:2:"";s:3:"鰫";s:2:"";s:3:"鰬";s:2:"";s:3:"鰭";s:2:"";s:3:"鰮";s:2:"";s:3:"鰯";s:2:"";s:3:"鰰";s:2:"";s:3:"鰱";s:2:"";s:3:"鰲";s:2:"";s:3:"鰳";s:2:"";s:3:"鰴";s:2:"";s:3:"鰵";s:2:"";s:3:"鰶";s:2:"";s:3:"鰷";s:2:"";s:3:"鰸";s:2:"";s:3:"鰹";s:2:"";s:3:"鰺";s:2:"";s:3:"鰻";s:2:"";s:3:"鰼";s:2:"@";s:3:"鰽";s:2:"A";s:3:"鰾";s:2:"B";s:3:"鰿";s:2:"C";s:3:"鱀";s:2:"D";s:3:"鱁";s:2:"E";s:3:"鱂";s:2:"F";s:3:"鱃";s:2:"G";s:3:"鱄";s:2:"H";s:3:"鱅";s:2:"I";s:3:"鱆";s:2:"J";s:3:"鱇";s:2:"K";s:3:"鱈";s:2:"L";s:3:"鱉";s:2:"M";s:3:"鱊";s:2:"N";s:3:"鱋";s:2:"O";s:3:"鱌";s:2:"P";s:3:"鱍";s:2:"Q";s:3:"鱎";s:2:"R";s:3:"鱏";s:2:"S";s:3:"鱐";s:2:"T";s:3:"鱑";s:2:"U";s:3:"鱒";s:2:"V";s:3:"鱓";s:2:"W";s:3:"鱔";s:2:"X";s:3:"鱕";s:2:"Y";s:3:"鱖";s:2:"Z";s:3:"鱗";s:2:"[";s:3:"鱘";s:2:"\";s:3:"鱙";s:2:"]";s:3:"鱚";s:2:"^";s:3:"鱛";s:2:"_";s:3:"鱜";s:2:"`";s:3:"鱝";s:2:"a";s:3:"鱞";s:2:"b";s:3:"鱟";s:2:"c";s:3:"鱠";s:2:"d";s:3:"鱡";s:2:"e";s:3:"鱢";s:2:"f";s:3:"鱣";s:2:"g";s:3:"鱤";s:2:"h";s:3:"鱥";s:2:"i";s:3:"鱦";s:2:"j";s:3:"鱧";s:2:"k";s:3:"鱨";s:2:"l";s:3:"鱩";s:2:"m";s:3:"鱪";s:2:"n";s:3:"鱫";s:2:"o";s:3:"鱬";s:2:"p";s:3:"鱭";s:2:"q";s:3:"鱮";s:2:"r";s:3:"鱯";s:2:"s";s:3:"鱰";s:2:"t";s:3:"鱱";s:2:"u";s:3:"鱲";s:2:"v";s:3:"鱳";s:2:"w";s:3:"鱴";s:2:"x";s:3:"鱵";s:2:"y";s:3:"鱶";s:2:"z";s:3:"鱷";s:2:"{";s:3:"鱸";s:2:"|";s:3:"鱹";s:2:"}";s:3:"鱺";s:2:"~";s:3:"鱻";s:2:"";s:3:"鱼";s:2:"";s:3:"鱽";s:2:"";s:3:"鱾";s:2:"";s:3:"鱿";s:2:"";s:3:"鲀";s:2:"";s:3:"鲁";s:2:"³";s:3:"鲂";s:2:"";s:3:"鲃";s:2:"";s:3:"鲄";s:2:"";s:3:"鲅";s:2:"";s:3:"鲆";s:2:"";s:3:"鲇";s:2:"";s:3:"鲈";s:2:"";s:3:"鲉";s:2:"";s:3:"鲊";s:2:"";s:3:"鲋";s:2:"";s:3:"鲌";s:2:"";s:3:"鲍";s:2:"";s:3:"鲎";s:2:"";s:3:"鲏";s:2:"";s:3:"鲐";s:2:"";s:3:"鲑";s:2:"";s:3:"鲒";s:2:"";s:3:"鲓";s:2:"";s:3:"鲔";s:2:"";s:3:"鲕";s:2:"";s:3:"鲖";s:2:"";s:3:"鲗";s:2:"";s:3:"鲘";s:2:"";s:3:"鲙";s:2:"";s:3:"鲚";s:2:"";s:3:"鲛";s:2:"";s:3:"鲜";s:2:"";s:3:"鲝";s:2:"";s:3:"鲞";s:2:"";s:3:"鲟";s:2:"";s:3:"鲠";s:2:"";s:3:"鲡";s:2:"";s:3:"鲢";s:2:"";s:3:"鲣";s:2:"";s:3:"鲤";s:2:"";s:3:"鲥";s:2:"";s:3:"鲦";s:2:"";s:3:"鲧";s:2:"";s:3:"鲨";s:2:"";s:3:"鲩";s:2:"";s:3:"鲪";s:2:"";s:3:"鲫";s:2:"";s:3:"鲬";s:2:"";s:3:"鲭";s:2:"";s:3:"鲮";s:2:"";s:3:"鲯";s:2:"";s:3:"鲰";s:2:"";s:3:"鲱";s:2:"";s:3:"鲲";s:2:"";s:3:"鲳";s:2:"";s:3:"鲴";s:2:"";s:3:"鲵";s:2:"";s:3:"鲶";s:2:"";s:3:"鲷";s:2:"";s:3:"鲸";s:2:"";s:3:"鲹";s:2:"";s:3:"鲺";s:2:"";s:3:"鲻";s:2:"";s:3:"鲼";s:2:"";s:3:"鲽";s:2:"";s:3:"鲾";s:2:"";s:3:"鲿";s:2:"";s:3:"鳀";s:2:"";s:3:"鳁";s:2:"";s:3:"鳂";s:2:"";s:3:"鳃";s:2:"";s:3:"鳄";s:2:"";s:3:"鳅";s:2:"";s:3:"鳆";s:2:"";s:3:"鳇";s:2:"";s:3:"鳈";s:2:"";s:3:"鳉";s:2:"";s:3:"鳊";s:2:"";s:3:"鳋";s:2:"";s:3:"鳌";s:2:"";s:3:"鳍";s:2:"";s:3:"鳎";s:2:"";s:3:"鳏";s:2:"";s:3:"鳐";s:2:"";s:3:"鳑";s:2:"";s:3:"鳒";s:2:"";s:3:"鳓";s:2:"";s:3:"鳔";s:2:"";s:3:"鳕";s:2:"";s:3:"鳖";s:2:"";s:3:"鳗";s:2:"";s:3:"鳘";s:2:"";s:3:"鳙";s:2:"";s:3:"鳚";s:2:"";s:3:"鳛";s:2:"";s:3:"鳜";s:2:"";s:3:"鳝";s:2:"";s:3:"鳞";s:2:"";s:3:"鳟";s:2:"";s:3:"鳠";s:2:"";s:3:"鳡";s:2:"";s:3:"鳢";s:2:"";s:3:"鳣";s:2:"@";s:3:"鳤";s:2:"A";s:3:"鳥";s:2:"B";s:3:"鳦";s:2:"C";s:3:"鳧";s:2:"D";s:3:"鳨";s:2:"E";s:3:"鳩";s:2:"F";s:3:"鳪";s:2:"G";s:3:"鳫";s:2:"H";s:3:"鳬";s:2:"I";s:3:"鳭";s:2:"J";s:3:"鳮";s:2:"K";s:3:"鳯";s:2:"L";s:3:"鳰";s:2:"M";s:3:"鳱";s:2:"N";s:3:"鳲";s:2:"O";s:3:"鳳";s:2:"P";s:3:"鳴";s:2:"Q";s:3:"鳵";s:2:"R";s:3:"鳶";s:2:"S";s:3:"鳷";s:2:"T";s:3:"鳸";s:2:"U";s:3:"鳹";s:2:"V";s:3:"鳺";s:2:"W";s:3:"鳻";s:2:"X";s:3:"鳼";s:2:"Y";s:3:"鳽";s:2:"Z";s:3:"鳾";s:2:"[";s:3:"鳿";s:2:"\";s:3:"鴀";s:2:"]";s:3:"鴁";s:2:"^";s:3:"鴂";s:2:"_";s:3:"鴃";s:2:"`";s:3:"鴄";s:2:"a";s:3:"鴅";s:2:"b";s:3:"鴆";s:2:"c";s:3:"鴇";s:2:"d";s:3:"鴈";s:2:"e";s:3:"鴉";s:2:"f";s:3:"鴊";s:2:"g";s:3:"鴋";s:2:"h";s:3:"鴌";s:2:"i";s:3:"鴍";s:2:"j";s:3:"鴎";s:2:"k";s:3:"鴏";s:2:"l";s:3:"鴐";s:2:"m";s:3:"鴑";s:2:"n";s:3:"鴒";s:2:"o";s:3:"鴓";s:2:"p";s:3:"鴔";s:2:"q";s:3:"鴕";s:2:"r";s:3:"鴖";s:2:"s";s:3:"鴗";s:2:"t";s:3:"鴘";s:2:"u";s:3:"鴙";s:2:"v";s:3:"鴚";s:2:"w";s:3:"鴛";s:2:"x";s:3:"鴜";s:2:"y";s:3:"鴝";s:2:"z";s:3:"鴞";s:2:"{";s:3:"鴟";s:2:"|";s:3:"鴠";s:2:"}";s:3:"鴡";s:2:"~";s:3:"鴢";s:2:"";s:3:"鴣";s:2:"";s:3:"鴤";s:2:"";s:3:"鴥";s:2:"";s:3:"鴦";s:2:"";s:3:"鴧";s:2:"";s:3:"鴨";s:2:"";s:3:"鴩";s:2:"";s:3:"鴪";s:2:"";s:3:"鴫";s:2:"";s:3:"鴬";s:2:"";s:3:"鴭";s:2:"";s:3:"鴮";s:2:"";s:3:"鴯";s:2:"";s:3:"鴰";s:2:"";s:3:"鴱";s:2:"";s:3:"鴲";s:2:"";s:3:"鴳";s:2:"";s:3:"鴴";s:2:"";s:3:"鴵";s:2:"";s:3:"鴶";s:2:"";s:3:"鴷";s:2:"";s:3:"鴸";s:2:"";s:3:"鴹";s:2:"";s:3:"鴺";s:2:"";s:3:"鴻";s:2:"";s:3:"鴼";s:2:"";s:3:"鴽";s:2:"";s:3:"鴾";s:2:"";s:3:"鴿";s:2:"";s:3:"鵀";s:2:"";s:3:"鵁";s:2:"";s:3:"鵂";s:2:"";s:3:"鵃";s:2:"@";s:3:"鵄";s:2:"A";s:3:"鵅";s:2:"B";s:3:"鵆";s:2:"C";s:3:"鵇";s:2:"D";s:3:"鵈";s:2:"E";s:3:"鵉";s:2:"F";s:3:"鵊";s:2:"G";s:3:"鵋";s:2:"H";s:3:"鵌";s:2:"I";s:3:"鵍";s:2:"J";s:3:"鵎";s:2:"K";s:3:"鵏";s:2:"L";s:3:"鵐";s:2:"M";s:3:"鵑";s:2:"N";s:3:"鵒";s:2:"O";s:3:"鵓";s:2:"P";s:3:"鵔";s:2:"Q";s:3:"鵕";s:2:"R";s:3:"鵖";s:2:"S";s:3:"鵗";s:2:"T";s:3:"鵘";s:2:"U";s:3:"鵙";s:2:"V";s:3:"鵚";s:2:"W";s:3:"鵛";s:2:"X";s:3:"鵜";s:2:"Y";s:3:"鵝";s:2:"Z";s:3:"鵞";s:2:"[";s:3:"鵟";s:2:"\";s:3:"鵠";s:2:"]";s:3:"鵡";s:2:"^";s:3:"鵢";s:2:"_";s:3:"鵣";s:2:"`";s:3:"鵤";s:2:"a";s:3:"鵥";s:2:"b";s:3:"鵦";s:2:"c";s:3:"鵧";s:2:"d";s:3:"鵨";s:2:"e";s:3:"鵩";s:2:"f";s:3:"鵪";s:2:"g";s:3:"鵫";s:2:"h";s:3:"鵬";s:2:"i";s:3:"鵭";s:2:"j";s:3:"鵮";s:2:"k";s:3:"鵯";s:2:"l";s:3:"鵰";s:2:"m";s:3:"鵱";s:2:"n";s:3:"鵲";s:2:"o";s:3:"鵳";s:2:"p";s:3:"鵴";s:2:"q";s:3:"鵵";s:2:"r";s:3:"鵶";s:2:"s";s:3:"鵷";s:2:"t";s:3:"鵸";s:2:"u";s:3:"鵹";s:2:"v";s:3:"鵺";s:2:"w";s:3:"鵻";s:2:"x";s:3:"鵼";s:2:"y";s:3:"鵽";s:2:"z";s:3:"鵾";s:2:"{";s:3:"鵿";s:2:"|";s:3:"鶀";s:2:"}";s:3:"鶁";s:2:"~";s:3:"鶂";s:2:"";s:3:"鶃";s:2:"";s:3:"鶄";s:2:"";s:3:"鶅";s:2:"";s:3:"鶆";s:2:"";s:3:"鶇";s:2:"";s:3:"鶈";s:2:"";s:3:"鶉";s:2:"";s:3:"鶊";s:2:"";s:3:"鶋";s:2:"";s:3:"鶌";s:2:"";s:3:"鶍";s:2:"";s:3:"鶎";s:2:"";s:3:"鶏";s:2:"";s:3:"鶐";s:2:"";s:3:"鶑";s:2:"";s:3:"鶒";s:2:"";s:3:"鶓";s:2:"";s:3:"鶔";s:2:"";s:3:"鶕";s:2:"";s:3:"鶖";s:2:"";s:3:"鶗";s:2:"";s:3:"鶘";s:2:"";s:3:"鶙";s:2:"";s:3:"鶚";s:2:"";s:3:"鶛";s:2:"";s:3:"鶜";s:2:"";s:3:"鶝";s:2:"";s:3:"鶞";s:2:"";s:3:"鶟";s:2:"";s:3:"鶠";s:2:"";s:3:"鶡";s:2:"";s:3:"鶢";s:2:"";s:3:"鶣";s:2:"@";s:3:"鶤";s:2:"A";s:3:"鶥";s:2:"B";s:3:"鶦";s:2:"C";s:3:"鶧";s:2:"D";s:3:"鶨";s:2:"E";s:3:"鶩";s:2:"F";s:3:"鶪";s:2:"G";s:3:"鶫";s:2:"H";s:3:"鶬";s:2:"I";s:3:"鶭";s:2:"J";s:3:"鶮";s:2:"K";s:3:"鶯";s:2:"L";s:3:"鶰";s:2:"M";s:3:"鶱";s:2:"N";s:3:"鶲";s:2:"O";s:3:"鶳";s:2:"P";s:3:"鶴";s:2:"Q";s:3:"鶵";s:2:"R";s:3:"鶶";s:2:"S";s:3:"鶷";s:2:"T";s:3:"鶸";s:2:"U";s:3:"鶹";s:2:"V";s:3:"鶺";s:2:"W";s:3:"鶻";s:2:"X";s:3:"鶼";s:2:"Y";s:3:"鶽";s:2:"Z";s:3:"鶾";s:2:"[";s:3:"鶿";s:2:"\";s:3:"鷀";s:2:"]";s:3:"鷁";s:2:"^";s:3:"鷂";s:2:"_";s:3:"鷃";s:2:"`";s:3:"鷄";s:2:"a";s:3:"鷅";s:2:"b";s:3:"鷆";s:2:"c";s:3:"鷇";s:2:"d";s:3:"鷈";s:2:"e";s:3:"鷉";s:2:"f";s:3:"鷊";s:2:"g";s:3:"鷋";s:2:"h";s:3:"鷌";s:2:"i";s:3:"鷍";s:2:"j";s:3:"鷎";s:2:"k";s:3:"鷏";s:2:"l";s:3:"鷐";s:2:"m";s:3:"鷑";s:2:"n";s:3:"鷒";s:2:"o";s:3:"鷓";s:2:"p";s:3:"鷔";s:2:"q";s:3:"鷕";s:2:"r";s:3:"鷖";s:2:"s";s:3:"鷗";s:2:"t";s:3:"鷘";s:2:"u";s:3:"鷙";s:2:"v";s:3:"鷚";s:2:"w";s:3:"鷛";s:2:"x";s:3:"鷜";s:2:"y";s:3:"鷝";s:2:"z";s:3:"鷞";s:2:"{";s:3:"鷟";s:2:"|";s:3:"鷠";s:2:"}";s:3:"鷡";s:2:"~";s:3:"鷢";s:2:"";s:3:"鷣";s:2:"";s:3:"鷤";s:2:"";s:3:"鷥";s:2:"";s:3:"鷦";s:2:"";s:3:"鷧";s:2:"";s:3:"鷨";s:2:"";s:3:"鷩";s:2:"";s:3:"鷪";s:2:"";s:3:"鷫";s:2:"";s:3:"鷬";s:2:"";s:3:"鷭";s:2:"";s:3:"鷮";s:2:"";s:3:"鷯";s:2:"";s:3:"鷰";s:2:"";s:3:"鷱";s:2:"";s:3:"鷲";s:2:"";s:3:"鷳";s:2:"";s:3:"鷴";s:2:"";s:3:"鷵";s:2:"";s:3:"鷶";s:2:"";s:3:"鷷";s:2:"";s:3:"鷸";s:2:"";s:3:"鷹";s:2:"";s:3:"鷺";s:2:"";s:3:"鷻";s:2:"";s:3:"鷼";s:2:"";s:3:"鷽";s:2:"";s:3:"鷾";s:2:"";s:3:"鷿";s:2:"";s:3:"鸀";s:2:"";s:3:"鸁";s:2:"";s:3:"鸂";s:2:"";s:3:"鸃";s:2:"@";s:3:"鸄";s:2:"A";s:3:"鸅";s:2:"B";s:3:"鸆";s:2:"C";s:3:"鸇";s:2:"D";s:3:"鸈";s:2:"E";s:3:"鸉";s:2:"F";s:3:"鸊";s:2:"G";s:3:"鸋";s:2:"H";s:3:"鸌";s:2:"I";s:3:"鸍";s:2:"J";s:3:"鸎";s:2:"K";s:3:"鸏";s:2:"L";s:3:"鸐";s:2:"M";s:3:"鸑";s:2:"N";s:3:"鸒";s:2:"O";s:3:"鸓";s:2:"P";s:3:"鸔";s:2:"Q";s:3:"鸕";s:2:"R";s:3:"鸖";s:2:"S";s:3:"鸗";s:2:"T";s:3:"鸘";s:2:"U";s:3:"鸙";s:2:"V";s:3:"鸚";s:2:"W";s:3:"鸛";s:2:"X";s:3:"鸜";s:2:"Y";s:3:"鸝";s:2:"Z";s:3:"鸞";s:2:"[";s:3:"鸟";s:2:"";s:3:"鸠";s:2:"";s:3:"鸡";s:2:"";s:3:"鸢";s:2:"";s:3:"鸣";s:2:"";s:3:"鸤";s:2:"\";s:3:"鸥";s:2:"Ÿ";s:3:"鸦";s:2:"ѻ";s:3:"鸧";s:2:"]";s:3:"鸨";s:2:"";s:3:"鸩";s:2:"";s:3:"鸪";s:2:"";s:3:"鸫";s:2:"";s:3:"鸬";s:2:"";s:3:"鸭";s:2:"Ѽ";s:3:"鸮";s:2:"^";s:3:"鸯";s:2:"";s:3:"鸰";s:2:"_";s:3:"鸱";s:2:"";s:3:"鸲";s:2:"";s:3:"鸳";s:2:"ԧ";s:3:"鸴";s:2:"`";s:3:"鸵";s:2:"";s:3:"鸶";s:2:"";s:3:"鸷";s:2:"";s:3:"鸸";s:2:"";s:3:"鸹";s:2:"";s:3:"鸺";s:2:"";s:3:"鸻";s:2:"a";s:3:"鸼";s:2:"b";s:3:"鸽";s:2:"";s:3:"鸾";s:2:"";s:3:"鸿";s:2:"";s:3:"鹀";s:2:"c";s:3:"鹁";s:2:"";s:3:"鹂";s:2:"";s:3:"鹃";s:2:"";s:3:"鹄";s:2:"";s:3:"鹅";s:2:"";s:3:"鹆";s:2:"";s:3:"鹇";s:2:"";s:3:"鹈";s:2:"";s:3:"鹉";s:2:"";s:3:"鹊";s:2:"ȵ";s:3:"鹋";s:2:"";s:3:"鹌";s:2:"";s:3:"鹍";s:2:"d";s:3:"鹎";s:2:"";s:3:"鹏";s:2:"";s:3:"鹐";s:2:"e";s:3:"鹑";s:2:"";s:3:"鹒";s:2:"f";s:3:"鹓";s:2:"g";s:3:"鹔";s:2:"h";s:3:"鹕";s:2:"";s:3:"鹖";s:2:"i";s:3:"鹗";s:2:"";s:3:"鹘";s:2:"";s:3:"鹙";s:2:"j";s:3:"鹚";s:2:"";s:3:"鹛";s:2:"";s:3:"鹜";s:2:"";s:3:"鹝";s:2:"k";s:3:"鹞";s:2:"";s:3:"鹟";s:2:"l";s:3:"鹠";s:2:"m";s:3:"鹡";s:2:"n";s:3:"鹢";s:2:"o";s:3:"鹣";s:2:"";s:3:"鹤";s:2:"";s:3:"鹥";s:2:"p";s:3:"鹦";s:2:"";s:3:"鹧";s:2:"";s:3:"鹨";s:2:"";s:3:"鹩";s:2:"";s:3:"鹪";s:2:"";s:3:"鹫";s:2:"";s:3:"鹬";s:2:"";s:3:"鹭";s:2:"";s:3:"鹮";s:2:"q";s:3:"鹯";s:2:"r";s:3:"鹰";s:2:"ӥ";s:3:"鹱";s:2:"";s:3:"鹲";s:2:"s";s:3:"鹳";s:2:"";s:3:"鹴";s:2:"t";s:3:"鹵";s:2:"u";s:3:"鹶";s:2:"v";s:3:"鹷";s:2:"w";s:3:"鹸";s:2:"x";s:3:"鹹";s:2:"y";s:3:"鹺";s:2:"z";s:3:"鹻";s:2:"{";s:3:"鹼";s:2:"|";s:3:"鹽";s:2:"}";s:3:"鹾";s:2:"";s:3:"鹿";s:2:"¹";s:3:"麀";s:2:"~";s:3:"麁";s:2:"";s:3:"麂";s:2:"";s:3:"麃";s:2:"";s:3:"麄";s:2:"";s:3:"麅";s:2:"";s:3:"麆";s:2:"";s:3:"麇";s:2:"";s:3:"麈";s:2:"";s:3:"麉";s:2:"";s:3:"麊";s:2:"";s:3:"麋";s:2:"";s:3:"麌";s:2:"";s:3:"麍";s:2:"";s:3:"麎";s:2:"";s:3:"麏";s:2:"";s:3:"麐";s:2:"";s:3:"麑";s:2:"";s:3:"麒";s:2:"";s:3:"麓";s:2:"´";s:3:"麔";s:2:"";s:3:"麕";s:2:"";s:3:"麖";s:2:"";s:3:"麗";s:2:"";s:3:"麘";s:2:"";s:3:"麙";s:2:"";s:3:"麚";s:2:"";s:3:"麛";s:2:"";s:3:"麜";s:2:"";s:3:"麝";s:2:"";s:3:"麞";s:2:"";s:3:"麟";s:2:"";s:3:"麠";s:2:"";s:3:"麡";s:2:"";s:3:"麢";s:2:"";s:3:"麣";s:2:"";s:3:"麤";s:2:"";s:3:"麥";s:2:"";s:3:"麦";s:2:"";s:3:"麧";s:2:"";s:3:"麨";s:2:"";s:3:"麩";s:2:"";s:3:"麪";s:2:"";s:3:"麫";s:2:"@";s:3:"麬";s:2:"A";s:3:"麭";s:2:"B";s:3:"麮";s:2:"C";s:3:"麯";s:2:"D";s:3:"麰";s:2:"E";s:3:"麱";s:2:"F";s:3:"麲";s:2:"G";s:3:"麳";s:2:"H";s:3:"麴";s:2:"";s:3:"麵";s:2:"I";s:3:"麶";s:2:"J";s:3:"麷";s:2:"K";s:3:"麸";s:2:"";s:3:"麹";s:2:"L";s:3:"麺";s:2:"M";s:3:"麻";s:2:"";s:3:"麼";s:2:"N";s:3:"麽";s:2:"";s:3:"麾";s:2:"";s:3:"麿";s:2:"O";s:3:"黀";s:2:"P";s:3:"黁";s:2:"Q";s:3:"黂";s:2:"R";s:3:"黃";s:2:"S";s:3:"黄";s:2:"";s:3:"黅";s:2:"T";s:3:"黆";s:2:"U";s:3:"黇";s:2:"V";s:3:"黈";s:2:"W";s:3:"黉";s:2:"";s:3:"黊";s:2:"X";s:3:"黋";s:2:"Y";s:3:"黌";s:2:"Z";s:3:"黍";s:2:"";s:3:"黎";s:2:"";s:3:"黏";s:2:"";s:3:"黐";s:2:"[";s:3:"黑";s:2:"";s:3:"黒";s:2:"\";s:3:"黓";s:2:"]";s:3:"黔";s:2:"ǭ";s:3:"黕";s:2:"^";s:3:"黖";s:2:"_";s:3:"黗";s:2:"`";s:3:"默";s:2:"Ĭ";s:3:"黙";s:2:"a";s:3:"黚";s:2:"b";s:3:"黛";s:2:"";s:3:"黜";s:2:"";s:3:"黝";s:2:"";s:3:"點";s:2:"c";s:3:"黟";s:2:"";s:3:"黠";s:2:"";s:3:"黡";s:2:"d";s:3:"黢";s:2:"";s:3:"黣";s:2:"e";s:3:"黤";s:2:"f";s:3:"黥";s:2:"";s:3:"黦";s:2:"g";s:3:"黧";s:2:"";s:3:"黨";s:2:"h";s:3:"黩";s:2:"";s:3:"黪";s:2:"";s:3:"黫";s:2:"i";s:3:"黬";s:2:"j";s:3:"黭";s:2:"k";s:3:"黮";s:2:"l";s:3:"黯";s:2:"";s:3:"黰";s:2:"m";s:3:"黱";s:2:"n";s:3:"黲";s:2:"o";s:3:"黳";s:2:"p";s:3:"黴";s:2:"q";s:3:"黵";s:2:"r";s:3:"黶";s:2:"s";s:3:"黷";s:2:"t";s:3:"黸";s:2:"u";s:3:"黹";s:2:"";s:3:"黺";s:2:"v";s:3:"黻";s:2:"";s:3:"黼";s:2:"";s:3:"黽";s:2:"w";s:3:"黾";s:2:"";s:3:"黿";s:2:"x";s:3:"鼀";s:2:"y";s:3:"鼁";s:2:"z";s:3:"鼂";s:2:"{";s:3:"鼃";s:2:"|";s:3:"鼄";s:2:"}";s:3:"鼅";s:2:"~";s:3:"鼆";s:2:"";s:3:"鼇";s:2:"";s:3:"鼈";s:2:"";s:3:"鼉";s:2:"";s:3:"鼊";s:2:"";s:3:"鼋";s:2:"";s:3:"鼌";s:2:"";s:3:"鼍";s:2:"";s:3:"鼎";s:2:"";s:3:"鼏";s:2:"";s:3:"鼐";s:2:"ؾ";s:3:"鼑";s:2:"";s:3:"鼒";s:2:"";s:3:"鼓";s:2:"";s:3:"鼔";s:2:"";s:3:"鼕";s:2:"";s:3:"鼖";s:2:"";s:3:"鼗";s:2:"ػ";s:3:"鼘";s:2:"";s:3:"鼙";s:2:"ܱ";s:3:"鼚";s:2:"";s:3:"鼛";s:2:"";s:3:"鼜";s:2:"";s:3:"鼝";s:2:"";s:3:"鼞";s:2:"";s:3:"鼟";s:2:"";s:3:"鼠";s:2:"";s:3:"鼡";s:2:"";s:3:"鼢";s:2:"";s:3:"鼣";s:2:"";s:3:"鼤";s:2:"";s:3:"鼥";s:2:"";s:3:"鼦";s:2:"";s:3:"鼧";s:2:"";s:3:"鼨";s:2:"";s:3:"鼩";s:2:"";s:3:"鼪";s:2:"";s:3:"鼫";s:2:"";s:3:"鼬";s:2:"";s:3:"鼭";s:2:"";s:3:"鼮";s:2:"";s:3:"鼯";s:2:"";s:3:"鼰";s:2:"";s:3:"鼱";s:2:"";s:3:"鼲";s:2:"@";s:3:"鼳";s:2:"A";s:3:"鼴";s:2:"B";s:3:"鼵";s:2:"C";s:3:"鼶";s:2:"D";s:3:"鼷";s:2:"";s:3:"鼸";s:2:"E";s:3:"鼹";s:2:"";s:3:"鼺";s:2:"F";s:3:"鼻";s:2:"";s:3:"鼼";s:2:"G";s:3:"鼽";s:2:"";s:3:"鼾";s:2:"";s:3:"鼿";s:2:"H";s:3:"齀";s:2:"I";s:3:"齁";s:2:"J";s:3:"齂";s:2:"K";s:3:"齃";s:2:"L";s:3:"齄";s:2:"";s:3:"齅";s:2:"M";s:3:"齆";s:2:"N";s:3:"齇";s:2:"O";s:3:"齈";s:2:"P";s:3:"齉";s:2:"Q";s:3:"齊";s:2:"R";s:3:"齋";s:2:"S";s:3:"齌";s:2:"T";s:3:"齍";s:2:"U";s:3:"齎";s:2:"V";s:3:"齏";s:2:"W";s:3:"齐";s:2:"";s:3:"齑";s:2:"";s:3:"齒";s:2:"X";s:3:"齓";s:2:"Y";s:3:"齔";s:2:"Z";s:3:"齕";s:2:"[";s:3:"齖";s:2:"\";s:3:"齗";s:2:"]";s:3:"齘";s:2:"^";s:3:"齙";s:2:"_";s:3:"齚";s:2:"`";s:3:"齛";s:2:"a";s:3:"齜";s:2:"b";s:3:"齝";s:2:"c";s:3:"齞";s:2:"d";s:3:"齟";s:2:"e";s:3:"齠";s:2:"f";s:3:"齡";s:2:"g";s:3:"齢";s:2:"h";s:3:"齣";s:2:"i";s:3:"齤";s:2:"j";s:3:"齥";s:2:"k";s:3:"齦";s:2:"l";s:3:"齧";s:2:"m";s:3:"齨";s:2:"n";s:3:"齩";s:2:"o";s:3:"齪";s:2:"p";s:3:"齫";s:2:"q";s:3:"齬";s:2:"r";s:3:"齭";s:2:"s";s:3:"齮";s:2:"t";s:3:"齯";s:2:"u";s:3:"齰";s:2:"v";s:3:"齱";s:2:"w";s:3:"齲";s:2:"x";s:3:"齳";s:2:"y";s:3:"齴";s:2:"z";s:3:"齵";s:2:"{";s:3:"齶";s:2:"|";s:3:"齷";s:2:"}";s:3:"齸";s:2:"~";s:3:"齹";s:2:"";s:3:"齺";s:2:"";s:3:"齻";s:2:"";s:3:"齼";s:2:"";s:3:"齽";s:2:"";s:3:"齾";s:2:"";s:3:"齿";s:2:"";s:3:"龀";s:2:"";s:3:"龁";s:2:"";s:3:"龂";s:2:"";s:3:"龃";s:2:"";s:3:"龄";s:2:"";s:3:"龅";s:2:"";s:3:"龆";s:2:"";s:3:"龇";s:2:"";s:3:"龈";s:2:"";s:3:"龉";s:2:"";s:3:"龊";s:2:"";s:3:"龋";s:2:"ȣ";s:3:"龌";s:2:"";s:3:"龍";s:2:"";s:3:"龎";s:2:"";s:3:"龏";s:2:"";s:3:"龐";s:2:"";s:3:"龑";s:2:"";s:3:"龒";s:2:"";s:3:"龓";s:2:"";s:3:"龔";s:2:"";s:3:"龕";s:2:"";s:3:"龖";s:2:"";s:3:"龗";s:2:"";s:3:"龘";s:2:"";s:3:"龙";s:2:"";s:3:"龚";s:2:"";s:3:"龛";s:2:"";s:3:"龜";s:2:"";s:3:"龝";s:2:"";s:3:"龞";s:2:"";s:3:"龟";s:2:"";s:3:"龠";s:2:"";s:3:"龡";s:2:"";s:3:"龢";s:2:"";s:3:"龣";s:2:"";s:3:"龤";s:2:"";s:3:"龥";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"X";s:3:"";s:2:"[";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:1:"";s:3:"豈";s:2:"M";s:3:"更";s:2:"";s:3:"車";s:2:"܇";s:3:"賈";s:2:"Z";s:3:"滑";s:2:"";s:3:"串";s:2:"";s:3:"句";s:2:"";s:3:"龜";s:2:"";s:3:"龜";s:2:"";s:3:"契";s:2:"";s:3:"金";s:2:"";s:3:"喇";s:2:"";s:3:"奈";s:2:"";s:3:"懶";s:2:"";s:3:"癩";s:2:"]";s:3:"羅";s:2:"_";s:3:"蘿";s:2:"}";s:3:"螺";s:2:"";s:3:"裸";s:2:"";s:3:"邏";s:2:"߉";s:3:"樂";s:2:"";s:3:"洛";s:2:"";s:3:"烙";s:2:"";s:3:"珞";s:2:"";s:3:"落";s:2:"";s:3:"酪";s:2:"";s:3:"駱";s:2:"";s:3:"亂";s:2:"y";s:3:"卵";s:2:"";s:3:"欄";s:2:"";s:3:"爛";s:2:"";s:3:"蘭";s:2:"m";s:3:"鸞";s:2:"[";s:3:"嵐";s:2:"";s:3:"濫";s:2:"E";s:3:"藍";s:2:"{";s:3:"襤";s:2:"h";s:3:"拉";s:2:"";s:3:"臘";s:2:"D";s:3:"蠟";s:2:"Ϟ";s:3:"廊";s:2:"";s:3:"朗";s:2:"";s:3:"浪";s:2:"";s:3:"狼";s:2:"";s:3:"郎";s:2:"";s:3:"來";s:2:"";s:3:"冷";s:2:"";s:3:"勞";s:2:"";s:3:"擄";s:2:"";s:3:"櫓";s:2:"";s:3:"爐";s:2:"t";s:3:"盧";s:2:"R";s:3:"老";s:2:"";s:3:"蘆";s:2:"J";s:3:"虜";s:2:"̔";s:3:"路";s:2:"·";s:3:"露";s:2:"¶";s:3:"魯";s:2:"";s:3:"鷺";s:2:"";s:3:"碌";s:2:"µ";s:3:"祿";s:2:"";s:3:"綠";s:2:"G";s:3:"菉";s:2:"Ǌ";s:3:"錄";s:2:"";s:3:"鹿";s:2:"¹";s:3:"論";s:2:"Փ";s:3:"壟";s:2:"";s:3:"弄";s:2:"Ū";s:3:"籠";s:2:"\";s:3:"聾";s:2:"@";s:3:"牢";s:2:"";s:3:"磊";s:2:"";s:3:"賂";s:2:"T";s:3:"雷";s:2:"";s:3:"壘";s:2:"";s:3:"屢";s:2:"";s:3:"樓";s:2:"";s:3:"淚";s:2:"I";s:3:"漏";s:2:"©";s:3:"累";s:2:"";s:3:"縷";s:2:"|";s:3:"陋";s:2:"ª";s:3:"勒";s:2:"";s:3:"肋";s:2:"";s:3:"凜";s:2:"C";s:3:"凌";s:2:"";s:3:"稜";s:2:"";s:3:"綾";s:2:"c";s:3:"菱";s:2:"";s:3:"陵";s:2:"";s:3:"讀";s:2:"x";s:3:"拏";s:2:"";s:3:"樂";s:2:"";s:3:"諾";s:2:"Z";s:3:"丹";s:2:"";s:3:"寧";s:2:"";s:3:"怒";s:2:"ŭ";s:3:"率";s:2:"";s:3:"異";s:2:"";s:3:"北";s:2:"";s:3:"磻";s:2:"";s:3:"便";s:2:"";s:3:"復";s:2:"";s:3:"不";s:2:"";s:3:"泌";s:2:"";s:3:"數";s:2:"";s:3:"索";s:2:"";s:3:"參";s:2:"";s:3:"塞";s:2:"";s:3:"省";s:2:"ʡ";s:3:"葉";s:2:"~";s:3:"說";s:2:"f";s:3:"殺";s:2:"";s:3:"辰";s:2:"";s:3:"沈";s:2:"";s:3:"拾";s:2:"ʰ";s:3:"若";s:2:"";s:3:"掠";s:2:"";s:3:"略";s:2:"";s:3:"亮";s:2:"";s:3:"兩";s:2:"";s:3:"凉";s:2:"";s:3:"梁";s:2:"";s:3:"糧";s:2:"Z";s:3:"良";s:2:"";s:3:"諒";s:2:"Տ";s:3:"量";s:2:"";s:3:"勵";s:2:"";s:3:"呂";s:2:"";s:3:"女";s:2:"Ů";s:3:"廬";s:2:"]";s:3:"旅";s:2:"";s:3:"濾";s:2:"V";s:3:"礪";s:2:"Z";s:3:"閭";s:2:"";s:3:"驪";s:2:"P";s:3:"麗";s:2:"";s:3:"黎";s:2:"";s:3:"力";s:2:"";s:3:"曆";s:2:"";s:3:"歷";s:2:"v";s:3:"轢";s:2:"]";s:3:"年";s:2:"";s:3:"憐";s:2:"z";s:3:"戀";s:2:"";s:3:"撚";s:2:"";s:3:"漣";s:2:"i";s:3:"煉";s:2:"";s:3:"璉";s:2:"I";s:3:"秊";s:2:"";s:3:"練";s:2:"";s:3:"聯";s:2:"";s:3:"輦";s:2:"݂";s:3:"蓮";s:2:"ɏ";s:3:"連";s:2:"B";s:3:"鍊";s:2:"";s:3:"列";s:2:"";s:3:"劣";s:2:"";s:3:"咽";s:2:"";s:3:"烈";s:2:"";s:3:"裂";s:2:"";s:3:"說";s:2:"f";s:3:"廉";s:2:"";s:3:"念";s:2:"";s:3:"捻";s:2:"";s:3:"殮";s:2:"";s:3:"簾";s:2:"";s:3:"獵";s:2:"C";s:3:"令";s:2:"";s:3:"囹";s:2:"";s:3:"寧";s:2:"";s:3:"嶺";s:2:"X";s:3:"怜";s:2:"";s:3:"玲";s:2:"";s:3:"瑩";s:2:"";s:3:"羚";s:2:"";s:3:"聆";s:2:"";s:3:"鈴";s:2:"";s:3:"零";s:2:"";s:3:"靈";s:2:"`";s:3:"領";s:2:"I";s:3:"例";s:2:"";s:3:"禮";s:2:"Y";s:3:"醴";s:2:"";s:3:"隸";s:2:"`";s:3:"惡";s:2:"";s:3:"了";s:2:"";s:3:"僚";s:2:"";s:3:"寮";s:2:"";s:3:"尿";s:2:"";s:3:"料";s:2:"";s:3:"樂";s:2:"";s:3:"燎";s:2:"";s:3:"療";s:2:"";s:3:"蓼";s:2:"ޤ";s:3:"遼";s:2:"|";s:3:"龍";s:2:"";s:3:"暈";s:2:"";s:3:"阮";s:2:"";s:3:"劉";s:2:"";s:3:"杻";s:2:"";s:3:"柳";s:2:"";s:3:"流";s:2:"";s:3:"溜";s:2:"";s:3:"琉";s:2:"";s:3:"留";s:2:"";s:3:"硫";s:2:"";s:3:"紐";s:2:"~";s:3:"類";s:2:"";s:3:"六";s:2:"";s:3:"戮";s:2:"¾";s:3:"陸";s:2:"";s:3:"倫";s:2:"";s:3:"崙";s:2:"";s:3:"淪";s:2:"S";s:3:"輪";s:2:"݆";s:3:"律";s:2:"";s:3:"慄";s:2:"";s:3:"栗";s:2:"";s:3:"率";s:2:"";s:3:"隆";s:2:"¡";s:3:"利";s:2:"";s:3:"吏";s:2:"";s:3:"履";s:2:"";s:3:"易";s:2:"";s:3:"李";s:2:"";s:3:"梨";s:2:"";s:3:"泥";s:2:"";s:3:"理";s:2:"";s:3:"痢";s:2:"";s:3:"罹";s:2:"";s:3:"裏";s:2:"";s:3:"裡";s:2:"e";s:3:"里";s:2:"";s:3:"離";s:2:"x";s:3:"匿";s:2:"";s:3:"溺";s:2:"";s:3:"吝";s:2:"";s:3:"燐";s:2:"";s:3:"璘";s:2:"U";s:3:"藺";s:2:"A";s:3:"隣";s:2:"";s:3:"鱗";s:2:"[";s:3:"麟";s:2:"";s:3:"林";s:2:"";s:3:"淋";s:2:"";s:3:"臨";s:2:"R";s:3:"立";s:2:"";s:3:"笠";s:2:"";s:3:"粒";s:2:"";s:3:"狀";s:2:"";s:3:"炙";s:2:"";s:3:"識";s:2:"R";s:3:"什";s:2:"ʲ";s:3:"茶";s:2:"";s:3:"刺";s:2:"";s:3:"切";s:2:"";s:3:"度";s:2:"";s:3:"拓";s:2:"";s:3:"糖";s:2:"";s:3:"宅";s:2:"լ";s:3:"洞";s:2:"";s:3:"暴";s:2:"";s:3:"輻";s:2:"ݗ";s:3:"行";s:2:"";s:3:"降";s:2:"";s:3:"見";s:2:"Ҋ";s:3:"廓";s:2:"";s:3:"兀";s:2:"@";s:3:"嗀";s:2:"A";s:3:"﨎";s:2:"B";s:3:"﨏";s:2:"C";s:3:"塚";s:2:"V";s:3:"﨑";s:2:"D";s:3:"晴";s:2:"";s:3:"﨓";s:2:"E";s:3:"﨔";s:2:"F";s:3:"凞";s:2:"D";s:3:"猪";s:2:"i";s:3:"益";s:2:"";s:3:"礼";s:2:"G";s:3:"神";s:2:"";s:3:"祥";s:2:"";s:3:"福";s:2:"";s:3:"靖";s:2:"";s:3:"精";s:2:"";s:3:"羽";s:2:"";s:3:"﨟";s:2:"H";s:3:"蘒";s:2:"I";s:3:"﨡";s:2:"J";s:3:"諸";s:2:"T";s:3:"﨣";s:2:"K";s:3:"﨤";s:2:"L";s:3:"逸";s:2:"";s:3:"都";s:2:"";s:3:"﨧";s:2:"M";s:3:"﨨";s:2:"N";s:3:"﨩";s:2:"O";s:3:"飯";s:2:"";s:3:"飼";s:2:"";s:3:"館";s:2:"^";s:3:"鶴";s:2:"Q";s:3:"︰";s:2:"U";s:3:"︱";s:2:"";s:3:"︳";s:2:"";s:3:"︴";s:2:"";s:3:"︵";s:2:"";s:3:"︶";s:2:"";s:3:"︷";s:2:"";s:3:"︸";s:2:"";s:3:"︹";s:2:"";s:3:"︺";s:2:"";s:3:"︻";s:2:"";s:3:"︼";s:2:"";s:3:"︽";s:2:"";s:3:"︾";s:2:"";s:3:"︿";s:2:"";s:3:"﹀";s:2:"";s:3:"﹁";s:2:"";s:3:"﹂";s:2:"";s:3:"﹃";s:2:"";s:3:"﹄";s:2:"";s:3:"﹉";s:2:"h";s:3:"﹊";s:2:"i";s:3:"﹋";s:2:"j";s:3:"﹌";s:2:"k";s:3:"﹍";s:2:"l";s:3:"﹎";s:2:"m";s:3:"﹏";s:2:"n";s:3:"﹐";s:2:"o";s:3:"﹑";s:2:"p";s:3:"﹒";s:2:"q";s:3:"﹔";s:2:"r";s:3:"﹕";s:2:"s";s:3:"﹖";s:2:"t";s:3:"﹗";s:2:"u";s:3:"﹙";s:2:"v";s:3:"﹚";s:2:"w";s:3:"﹛";s:2:"x";s:3:"﹜";s:2:"y";s:3:"﹝";s:2:"z";s:3:"﹞";s:2:"{";s:3:"﹟";s:2:"|";s:3:"﹠";s:2:"}";s:3:"﹡";s:2:"~";s:3:"﹢";s:2:"";s:3:"﹣";s:2:"";s:3:"﹤";s:2:"";s:3:"﹥";s:2:"";s:3:"﹦";s:2:"";s:3:"﹨";s:2:"";s:3:"﹩";s:2:"";s:3:"﹪";s:2:"";s:3:"﹫";s:2:"";s:3:"！";s:2:"";s:3:"＂";s:2:"";s:3:"＃";s:2:"";s:3:"＄";s:2:"";s:3:"％";s:2:"";s:3:"＆";s:2:"";s:3:"＇";s:2:"";s:3:"（";s:2:"";s:3:"）";s:2:"";s:3:"＊";s:2:"";s:3:"＋";s:2:"";s:3:"，";s:2:"";s:3:"－";s:2:"";s:3:"．";s:2:"";s:3:"／";s:2:"";s:3:"０";s:2:"";s:3:"１";s:2:"";s:3:"２";s:2:"";s:3:"３";s:2:"";s:3:"４";s:2:"";s:3:"５";s:2:"";s:3:"６";s:2:"";s:3:"７";s:2:"";s:3:"８";s:2:"";s:3:"９";s:2:"";s:3:"：";s:2:"";s:3:"；";s:2:"";s:3:"＜";s:2:"";s:3:"＝";s:2:"";s:3:"＞";s:2:"";s:3:"？";s:2:"";s:3:"＠";s:2:"";s:3:"Ａ";s:2:"";s:3:"Ｂ";s:2:"";s:3:"Ｃ";s:2:"";s:3:"Ｄ";s:2:"";s:3:"Ｅ";s:2:"";s:3:"Ｆ";s:2:"";s:3:"Ｇ";s:2:"";s:3:"Ｈ";s:2:"";s:3:"Ｉ";s:2:"";s:3:"Ｊ";s:2:"";s:3:"Ｋ";s:2:"";s:3:"Ｌ";s:2:"";s:3:"Ｍ";s:2:"";s:3:"Ｎ";s:2:"";s:3:"Ｏ";s:2:"";s:3:"Ｐ";s:2:"";s:3:"Ｑ";s:2:"";s:3:"Ｒ";s:2:"";s:3:"Ｓ";s:2:"";s:3:"Ｔ";s:2:"";s:3:"Ｕ";s:2:"";s:3:"Ｖ";s:2:"";s:3:"Ｗ";s:2:"";s:3:"Ｘ";s:2:"";s:3:"Ｙ";s:2:"";s:3:"Ｚ";s:2:"";s:3:"［";s:2:"";s:3:"＼";s:2:"";s:3:"］";s:2:"";s:3:"＾";s:2:"";s:3:"＿";s:2:"";s:3:"｀";s:2:"";s:3:"ａ";s:2:"";s:3:"ｂ";s:2:"";s:3:"ｃ";s:2:"";s:3:"ｄ";s:2:"";s:3:"ｅ";s:2:"";s:3:"ｆ";s:2:"";s:3:"ｇ";s:2:"";s:3:"ｈ";s:2:"";s:3:"ｉ";s:2:"";s:3:"ｊ";s:2:"";s:3:"ｋ";s:2:"";s:3:"ｌ";s:2:"";s:3:"ｍ";s:2:"";s:3:"ｎ";s:2:"";s:3:"ｏ";s:2:"";s:3:"ｐ";s:2:"";s:3:"ｑ";s:2:"";s:3:"ｒ";s:2:"";s:3:"ｓ";s:2:"";s:3:"ｔ";s:2:"";s:3:"ｕ";s:2:"";s:3:"ｖ";s:2:"";s:3:"ｗ";s:2:"";s:3:"ｘ";s:2:"";s:3:"ｙ";s:2:"";s:3:"ｚ";s:2:"";s:3:"｛";s:2:"";s:3:"｜";s:2:"";s:3:"｝";s:2:"";s:3:"～";s:2:"";s:3:"￠";s:2:"";s:3:"￡";s:2:"";s:3:"￢";s:2:"V";s:3:"￣";s:2:"";s:3:"￤";s:2:"W";s:3:"￥";s:2:"";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/data/to.bestfit949.ser
@@ -0,0 +1,3 @@
+a:17760:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"¡";s:2:"";s:2:"¢";s:2:"";s:2:"£";s:2:"";s:2:"¤";s:2:"";s:2:"¥";s:2:"";s:2:"¦";s:1:"|";s:2:"§";s:2:"";s:2:"¨";s:2:"";s:2:"©";s:2:"";s:2:"ª";s:2:"";s:2:"«";s:2:"";s:2:"¬";s:2:"";s:2:"­";s:2:"";s:2:"®";s:2:"";s:2:"°";s:2:"";s:2:"±";s:2:"";s:2:"²";s:2:"";s:2:"³";s:2:"";s:2:"´";s:2:"";s:2:"µ";s:2:"";s:2:"¶";s:2:"";s:2:"·";s:2:"";s:2:"¸";s:2:"";s:2:"¹";s:2:"";s:2:"º";s:2:"";s:2:"»";s:2:"";s:2:"¼";s:2:"";s:2:"½";s:2:"";s:2:"¾";s:2:"";s:2:"¿";s:2:"";s:2:"À";s:1:"A";s:2:"Á";s:1:"A";s:2:"Â";s:1:"A";s:2:"Ã";s:1:"A";s:2:"Ä";s:1:"A";s:2:"Å";s:1:"A";s:2:"Æ";s:2:"";s:2:"Ç";s:1:"C";s:2:"È";s:1:"E";s:2:"É";s:1:"E";s:2:"Ê";s:1:"E";s:2:"Ë";s:1:"E";s:2:"Ì";s:1:"I";s:2:"Í";s:1:"I";s:2:"Î";s:1:"I";s:2:"Ï";s:1:"I";s:2:"Ð";s:2:"";s:2:"Ñ";s:1:"N";s:2:"Ò";s:1:"O";s:2:"Ó";s:1:"O";s:2:"Ô";s:1:"O";s:2:"Õ";s:1:"O";s:2:"Ö";s:1:"O";s:2:"×";s:2:"";s:2:"Ø";s:2:"";s:2:"Ù";s:1:"U";s:2:"Ú";s:1:"U";s:2:"Û";s:1:"U";s:2:"Ü";s:1:"U";s:2:"Ý";s:1:"Y";s:2:"Þ";s:2:"";s:2:"ß";s:2:"";s:2:"à";s:1:"a";s:2:"á";s:1:"a";s:2:"â";s:1:"a";s:2:"ã";s:1:"a";s:2:"ä";s:1:"a";s:2:"å";s:1:"a";s:2:"æ";s:2:"";s:2:"ç";s:1:"c";s:2:"è";s:1:"e";s:2:"é";s:1:"e";s:2:"ê";s:1:"e";s:2:"ë";s:1:"e";s:2:"ì";s:1:"i";s:2:"í";s:1:"i";s:2:"î";s:1:"i";s:2:"ï";s:1:"i";s:2:"ð";s:2:"";s:2:"ñ";s:1:"n";s:2:"ò";s:1:"o";s:2:"ó";s:1:"o";s:2:"ô";s:1:"o";s:2:"õ";s:1:"o";s:2:"ö";s:1:"o";s:2:"÷";s:2:"";s:2:"ø";s:2:"";s:2:"ù";s:1:"u";s:2:"ú";s:1:"u";s:2:"û";s:1:"u";s:2:"ü";s:1:"u";s:2:"ý";s:1:"y";s:2:"þ";s:2:"";s:2:"ÿ";s:1:"y";s:2:"Đ";s:2:"";s:2:"đ";s:2:"";s:2:"Ħ";s:2:"";s:2:"ħ";s:2:"";s:2:"ı";s:2:"";s:2:"Ĳ";s:2:"";s:2:"ĳ";s:2:"";s:2:"ĸ";s:2:"";s:2:"Ŀ";s:2:"";s:2:"ŀ";s:2:"";s:2:"Ł";s:2:"";s:2:"ł";s:2:"";s:2:"ŉ";s:2:"";s:2:"Ŋ";s:2:"";s:2:"ŋ";s:2:"";s:2:"Œ";s:2:"";s:2:"œ";s:2:"";s:2:"Ŧ";s:2:"";s:2:"ŧ";s:2:"";s:2:"ˇ";s:2:"";s:2:"ː";s:2:"";s:2:"˘";s:2:"";s:2:"˙";s:2:"";s:2:"˚";s:2:"";s:2:"˛";s:2:"";s:2:"˝";s:2:"";s:2:"Α";s:2:"";s:2:"Β";s:2:"";s:2:"Γ";s:2:"";s:2:"Δ";s:2:"";s:2:"Ε";s:2:"";s:2:"Ζ";s:2:"";s:2:"Η";s:2:"";s:2:"Θ";s:2:"";s:2:"Ι";s:2:"";s:2:"Κ";s:2:"";s:2:"Λ";s:2:"";s:2:"Μ";s:2:"";s:2:"Ν";s:2:"";s:2:"Ξ";s:2:"";s:2:"Ο";s:2:"";s:2:"Π";s:2:"";s:2:"Ρ";s:2:"";s:2:"Σ";s:2:"";s:2:"Τ";s:2:"";s:2:"Υ";s:2:"";s:2:"Φ";s:2:"";s:2:"Χ";s:2:"";s:2:"Ψ";s:2:"";s:2:"Ω";s:2:"";s:2:"α";s:2:"";s:2:"β";s:2:"";s:2:"γ";s:2:"";s:2:"δ";s:2:"";s:2:"ε";s:2:"";s:2:"ζ";s:2:"";s:2:"η";s:2:"";s:2:"θ";s:2:"";s:2:"ι";s:2:"";s:2:"κ";s:2:"";s:2:"λ";s:2:"";s:2:"μ";s:2:"";s:2:"ν";s:2:"";s:2:"ξ";s:2:"";s:2:"ο";s:2:"";s:2:"π";s:2:"";s:2:"ρ";s:2:"";s:2:"σ";s:2:"";s:2:"τ";s:2:"";s:2:"υ";s:2:"";s:2:"φ";s:2:"";s:2:"χ";s:2:"";s:2:"ψ";s:2:"";s:2:"ω";s:2:"";s:2:"Ё";s:2:"";s:2:"А";s:2:"";s:2:"Б";s:2:"";s:2:"В";s:2:"";s:2:"Г";s:2:"";s:2:"Д";s:2:"";s:2:"Е";s:2:"";s:2:"Ж";s:2:"";s:2:"З";s:2:"";s:2:"И";s:2:"";s:2:"Й";s:2:"";s:2:"К";s:2:"";s:2:"Л";s:2:"";s:2:"М";s:2:"";s:2:"Н";s:2:"";s:2:"О";s:2:"";s:2:"П";s:2:"";s:2:"Р";s:2:"";s:2:"С";s:2:"";s:2:"Т";s:2:"";s:2:"У";s:2:"";s:2:"Ф";s:2:"";s:2:"Х";s:2:"";s:2:"Ц";s:2:"";s:2:"Ч";s:2:"";s:2:"Ш";s:2:"";s:2:"Щ";s:2:"";s:2:"Ъ";s:2:"";s:2:"Ы";s:2:"";s:2:"Ь";s:2:"";s:2:"Э";s:2:"";s:2:"Ю";s:2:"";s:2:"Я";s:2:"";s:2:"а";s:2:"";s:2:"б";s:2:"";s:2:"в";s:2:"";s:2:"г";s:2:"";s:2:"д";s:2:"";s:2:"е";s:2:"";s:2:"ж";s:2:"";s:2:"з";s:2:"";s:2:"и";s:2:"";s:2:"й";s:2:"";s:2:"к";s:2:"";s:2:"л";s:2:"";s:2:"м";s:2:"";s:2:"н";s:2:"";s:2:"о";s:2:"";s:2:"п";s:2:"";s:2:"р";s:2:"";s:2:"с";s:2:"";s:2:"т";s:2:"";s:2:"у";s:2:"";s:2:"ф";s:2:"";s:2:"х";s:2:"";s:2:"ц";s:2:"";s:2:"ч";s:2:"";s:2:"ш";s:2:"";s:2:"щ";s:2:"";s:2:"ъ";s:2:"";s:2:"ы";s:2:"";s:2:"ь";s:2:"";s:2:"э";s:2:"";s:2:"ю";s:2:"";s:2:"я";s:2:"";s:2:"ё";s:2:"";s:3:"ᄀ";s:2:"";s:3:"ᄁ";s:2:"";s:3:"ᄂ";s:2:"";s:3:"ᄃ";s:2:"";s:3:"ᄄ";s:2:"";s:3:"ᄅ";s:2:"";s:3:"ᄆ";s:2:"";s:3:"ᄇ";s:2:"";s:3:"ᄈ";s:2:"";s:3:"ᄉ";s:2:"";s:3:"ᄊ";s:2:"";s:3:"ᄋ";s:2:"";s:3:"ᄌ";s:2:"";s:3:"ᄍ";s:2:"";s:3:"ᄎ";s:2:"";s:3:"ᄏ";s:2:"";s:3:"ᄐ";s:2:"";s:3:"ᄑ";s:2:"";s:3:"ᄒ";s:2:"";s:3:"ᄔ";s:2:"";s:3:"ᄕ";s:2:"";s:3:"ᄚ";s:2:"";s:3:"ᄜ";s:2:"";s:3:"ᄝ";s:2:"";s:3:"ᄞ";s:2:"";s:3:"ᄠ";s:2:"";s:3:"ᄡ";s:2:"";s:3:"ᄢ";s:2:"";s:3:"ᄣ";s:2:"";s:3:"ᄧ";s:2:"";s:3:"ᄩ";s:2:"";s:3:"ᄫ";s:2:"";s:3:"ᄬ";s:2:"";s:3:"ᄭ";s:2:"";s:3:"ᄮ";s:2:"";s:3:"ᄯ";s:2:"";s:3:"ᄲ";s:2:"";s:3:"ᄶ";s:2:"";s:3:"ᄼ";s:2:"";s:3:"ᄽ";s:2:"";s:3:"ᄾ";s:2:"";s:3:"ᄿ";s:2:"";s:3:"ᅀ";s:2:"";s:3:"ᅅ";s:2:"";s:3:"ᅆ";s:2:"";s:3:"ᅇ";s:2:"";s:3:"ᅌ";s:2:"";s:3:"ᅎ";s:2:"";s:3:"ᅏ";s:2:"";s:3:"ᅐ";s:2:"";s:3:"ᅑ";s:2:"";s:3:"ᅔ";s:2:"";s:3:"ᅕ";s:2:"";s:3:"ᅗ";s:2:"";s:3:"ᅘ";s:2:"";s:3:"ᅙ";s:2:"";s:3:"ᅟ";s:2:"";s:3:"ᅡ";s:2:"";s:3:"ᅢ";s:2:"";s:3:"ᅣ";s:2:"";s:3:"ᅤ";s:2:"";s:3:"ᅥ";s:2:"";s:3:"ᅦ";s:2:"";s:3:"ᅧ";s:2:"";s:3:"ᅨ";s:2:"";s:3:"ᅩ";s:2:"";s:3:"ᅪ";s:2:"";s:3:"ᅫ";s:2:"";s:3:"ᅬ";s:2:"";s:3:"ᅭ";s:2:"";s:3:"ᅮ";s:2:"";s:3:"ᅯ";s:2:"";s:3:"ᅰ";s:2:"";s:3:"ᅱ";s:2:"";s:3:"ᅲ";s:2:"";s:3:"ᅳ";s:2:"";s:3:"ᅴ";s:2:"";s:3:"ᅵ";s:2:"";s:3:"ᆄ";s:2:"";s:3:"ᆅ";s:2:"";s:3:"ᆈ";s:2:"";s:3:"ᆑ";s:2:"";s:3:"ᆒ";s:2:"";s:3:"ᆔ";s:2:"";s:3:"ᆞ";s:2:"";s:3:"ᆡ";s:2:"";s:3:"ᆨ";s:2:"";s:3:"ᆩ";s:2:"";s:3:"ᆪ";s:2:"";s:3:"ᆫ";s:2:"";s:3:"ᆬ";s:2:"";s:3:"ᆭ";s:2:"";s:3:"ᆮ";s:2:"";s:3:"ᆯ";s:2:"";s:3:"ᆰ";s:2:"";s:3:"ᆱ";s:2:"";s:3:"ᆲ";s:2:"";s:3:"ᆳ";s:2:"";s:3:"ᆴ";s:2:"";s:3:"ᆵ";s:2:"";s:3:"ᆶ";s:2:"";s:3:"ᆷ";s:2:"";s:3:"ᆸ";s:2:"";s:3:"ᆹ";s:2:"";s:3:"ᆺ";s:2:"";s:3:"ᆻ";s:2:"";s:3:"ᆼ";s:2:"";s:3:"ᆽ";s:2:"";s:3:"ᆾ";s:2:"";s:3:"ᆿ";s:2:"";s:3:"ᇀ";s:2:"";s:3:"ᇁ";s:2:"";s:3:"ᇂ";s:2:"";s:3:"ᇆ";s:2:"";s:3:"ᇇ";s:2:"";s:3:"ᇈ";s:2:"";s:3:"ᇌ";s:2:"";s:3:"ᇎ";s:2:"";s:3:"ᇓ";s:2:"";s:3:"ᇗ";s:2:"";s:3:"ᇙ";s:2:"";s:3:"ᇜ";s:2:"";s:3:"ᇝ";s:2:"";s:3:"ᇟ";s:2:"";s:3:"ᇦ";s:2:"";s:3:"ᇧ";s:2:"";s:3:"ᇨ";s:2:"";s:3:"ᇪ";s:2:"";s:3:"ᇫ";s:2:"";s:3:"ᇮ";s:2:"";s:3:"ᇰ";s:2:"";s:3:"ᇱ";s:2:"";s:3:"ᇲ";s:2:"";s:3:"ᇴ";s:2:"";s:3:"ᇹ";s:2:"";s:3:"―";s:2:"";s:3:"‘";s:2:"";s:3:"’";s:2:"";s:3:"“";s:2:"";s:3:"”";s:2:"";s:3:"†";s:2:"";s:3:"‡";s:2:"";s:3:"‥";s:2:"";s:3:"…";s:2:"";s:3:"‰";s:2:"";s:3:"′";s:2:"";s:3:"″";s:2:"";s:3:"※";s:2:"";s:3:"⁴";s:2:"";s:3:"ⁿ";s:2:"";s:3:"₁";s:2:"";s:3:"₂";s:2:"";s:3:"₃";s:2:"";s:3:"₄";s:2:"";s:3:"₩";s:1:"\";s:3:"€";s:2:"";s:3:"℃";s:2:"";s:3:"℉";s:2:"";s:3:"ℓ";s:2:"";s:3:"№";s:2:"";s:3:"℡";s:2:"";s:3:"™";s:2:"";s:3:"Ω";s:2:"";s:3:"Å";s:2:"";s:3:"⅓";s:2:"";s:3:"⅔";s:2:"";s:3:"⅛";s:2:"";s:3:"⅜";s:2:"";s:3:"⅝";s:2:"";s:3:"⅞";s:2:"";s:3:"Ⅰ";s:2:"";s:3:"Ⅱ";s:2:"";s:3:"Ⅲ";s:2:"";s:3:"Ⅳ";s:2:"";s:3:"Ⅴ";s:2:"";s:3:"Ⅵ";s:2:"";s:3:"Ⅶ";s:2:"";s:3:"Ⅷ";s:2:"";s:3:"Ⅸ";s:2:"";s:3:"Ⅹ";s:2:"";s:3:"ⅰ";s:2:"";s:3:"ⅱ";s:2:"";s:3:"ⅲ";s:2:"";s:3:"ⅳ";s:2:"";s:3:"ⅴ";s:2:"";s:3:"ⅵ";s:2:"";s:3:"ⅶ";s:2:"";s:3:"ⅷ";s:2:"";s:3:"ⅸ";s:2:"";s:3:"ⅹ";s:2:"";s:3:"←";s:2:"";s:3:"↑";s:2:"";s:3:"→";s:2:"";s:3:"↓";s:2:"";s:3:"↔";s:2:"";s:3:"↕";s:2:"";s:3:"↖";s:2:"";s:3:"↗";s:2:"";s:3:"↘";s:2:"";s:3:"↙";s:2:"";s:3:"⇒";s:2:"";s:3:"⇔";s:2:"";s:3:"∀";s:2:"";s:3:"∂";s:2:"";s:3:"∃";s:2:"";s:3:"∇";s:2:"";s:3:"∈";s:2:"";s:3:"∋";s:2:"";s:3:"∏";s:2:"";s:3:"∑";s:2:"";s:3:"√";s:2:"";s:3:"∝";s:2:"";s:3:"∞";s:2:"";s:3:"∠";s:2:"";s:3:"∥";s:2:"";s:3:"∧";s:2:"";s:3:"∨";s:2:"";s:3:"∩";s:2:"";s:3:"∪";s:2:"";s:3:"∫";s:2:"";s:3:"∬";s:2:"";s:3:"∮";s:2:"";s:3:"∴";s:2:"";s:3:"∵";s:2:"";s:3:"∼";s:2:"";s:3:"∽";s:2:"";s:3:"≒";s:2:"";s:3:"≠";s:2:"";s:3:"≡";s:2:"";s:3:"≤";s:2:"";s:3:"≥";s:2:"";s:3:"≪";s:2:"";s:3:"≫";s:2:"";s:3:"⊂";s:2:"";s:3:"⊃";s:2:"";s:3:"⊆";s:2:"";s:3:"⊇";s:2:"";s:3:"⊙";s:2:"";s:3:"⊥";s:2:"";s:3:"⌒";s:2:"";s:3:"①";s:2:"";s:3:"②";s:2:"";s:3:"③";s:2:"";s:3:"④";s:2:"";s:3:"⑤";s:2:"";s:3:"⑥";s:2:"";s:3:"⑦";s:2:"";s:3:"⑧";s:2:"";s:3:"⑨";s:2:"";s:3:"⑩";s:2:"";s:3:"⑪";s:2:"";s:3:"⑫";s:2:"";s:3:"⑬";s:2:"";s:3:"⑭";s:2:"";s:3:"⑮";s:2:"";s:3:"⑴";s:2:"";s:3:"⑵";s:2:"";s:3:"⑶";s:2:"";s:3:"⑷";s:2:"";s:3:"⑸";s:2:"";s:3:"⑹";s:2:"";s:3:"⑺";s:2:"";s:3:"⑻";s:2:"";s:3:"⑼";s:2:"";s:3:"⑽";s:2:"";s:3:"⑾";s:2:"";s:3:"⑿";s:2:"";s:3:"⒀";s:2:"";s:3:"⒁";s:2:"";s:3:"⒂";s:2:"";s:3:"⒜";s:2:"";s:3:"⒝";s:2:"";s:3:"⒞";s:2:"";s:3:"⒟";s:2:"";s:3:"⒠";s:2:"";s:3:"⒡";s:2:"";s:3:"⒢";s:2:"";s:3:"⒣";s:2:"";s:3:"⒤";s:2:"";s:3:"⒥";s:2:"";s:3:"⒦";s:2:"";s:3:"⒧";s:2:"";s:3:"⒨";s:2:"";s:3:"⒩";s:2:"";s:3:"⒪";s:2:"";s:3:"⒫";s:2:"";s:3:"⒬";s:2:"";s:3:"⒭";s:2:"";s:3:"⒮";s:2:"";s:3:"⒯";s:2:"";s:3:"⒰";s:2:"";s:3:"⒱";s:2:"";s:3:"⒲";s:2:"";s:3:"⒳";s:2:"";s:3:"⒴";s:2:"";s:3:"⒵";s:2:"";s:3:"Ⓐ";s:2:"";s:3:"Ⓑ";s:2:"";s:3:"Ⓒ";s:2:"";s:3:"Ⓓ";s:2:"";s:3:"Ⓔ";s:2:"";s:3:"Ⓕ";s:2:"";s:3:"Ⓖ";s:2:"";s:3:"Ⓗ";s:2:"";s:3:"Ⓘ";s:2:"";s:3:"Ⓙ";s:2:"";s:3:"Ⓚ";s:2:"";s:3:"Ⓛ";s:2:"";s:3:"Ⓜ";s:2:"";s:3:"Ⓝ";s:2:"";s:3:"Ⓞ";s:2:"";s:3:"Ⓟ";s:2:"";s:3:"Ⓠ";s:2:"";s:3:"Ⓡ";s:2:"";s:3:"Ⓢ";s:2:"";s:3:"Ⓣ";s:2:"";s:3:"Ⓤ";s:2:"";s:3:"Ⓥ";s:2:"";s:3:"Ⓦ";s:2:"";s:3:"Ⓧ";s:2:"";s:3:"Ⓨ";s:2:"";s:3:"Ⓩ";s:2:"";s:3:"ⓐ";s:2:"";s:3:"ⓑ";s:2:"";s:3:"ⓒ";s:2:"";s:3:"ⓓ";s:2:"";s:3:"ⓔ";s:2:"";s:3:"ⓕ";s:2:"";s:3:"ⓖ";s:2:"";s:3:"ⓗ";s:2:"";s:3:"ⓘ";s:2:"";s:3:"ⓙ";s:2:"";s:3:"ⓚ";s:2:"";s:3:"ⓛ";s:2:"";s:3:"ⓜ";s:2:"";s:3:"ⓝ";s:2:"";s:3:"ⓞ";s:2:"";s:3:"ⓟ";s:2:"";s:3:"ⓠ";s:2:"";s:3:"ⓡ";s:2:"";s:3:"ⓢ";s:2:"";s:3:"ⓣ";s:2:"";s:3:"ⓤ";s:2:"";s:3:"ⓥ";s:2:"";s:3:"ⓦ";s:2:"";s:3:"ⓧ";s:2:"";s:3:"ⓨ";s:2:"";s:3:"ⓩ";s:2:"";s:3:"─";s:2:"";s:3:"━";s:2:"";s:3:"│";s:2:"";s:3:"┃";s:2:"";s:3:"┌";s:2:"";s:3:"┍";s:2:"";s:3:"┎";s:2:"";s:3:"┏";s:2:"";s:3:"┐";s:2:"";s:3:"┑";s:2:"";s:3:"┒";s:2:"";s:3:"┓";s:2:"";s:3:"└";s:2:"";s:3:"┕";s:2:"";s:3:"┖";s:2:"";s:3:"┗";s:2:"";s:3:"┘";s:2:"";s:3:"┙";s:2:"";s:3:"┚";s:2:"";s:3:"┛";s:2:"";s:3:"├";s:2:"";s:3:"┝";s:2:"";s:3:"┞";s:2:"";s:3:"┟";s:2:"";s:3:"┠";s:2:"";s:3:"┡";s:2:"";s:3:"┢";s:2:"";s:3:"┣";s:2:"";s:3:"┤";s:2:"";s:3:"┥";s:2:"";s:3:"┦";s:2:"";s:3:"┧";s:2:"";s:3:"┨";s:2:"";s:3:"┩";s:2:"";s:3:"┪";s:2:"";s:3:"┫";s:2:"";s:3:"┬";s:2:"";s:3:"┭";s:2:"";s:3:"┮";s:2:"";s:3:"┯";s:2:"";s:3:"┰";s:2:"";s:3:"┱";s:2:"";s:3:"┲";s:2:"";s:3:"┳";s:2:"";s:3:"┴";s:2:"";s:3:"┵";s:2:"";s:3:"┶";s:2:"";s:3:"┷";s:2:"";s:3:"┸";s:2:"";s:3:"┹";s:2:"";s:3:"┺";s:2:"";s:3:"┻";s:2:"";s:3:"┼";s:2:"";s:3:"┽";s:2:"";s:3:"┾";s:2:"";s:3:"┿";s:2:"";s:3:"╀";s:2:"";s:3:"╁";s:2:"";s:3:"╂";s:2:"";s:3:"╃";s:2:"";s:3:"╄";s:2:"";s:3:"╅";s:2:"";s:3:"╆";s:2:"";s:3:"╇";s:2:"";s:3:"╈";s:2:"";s:3:"╉";s:2:"";s:3:"╊";s:2:"";s:3:"╋";s:2:"";s:3:"▒";s:2:"";s:3:"■";s:2:"";s:3:"□";s:2:"";s:3:"▣";s:2:"";s:3:"▤";s:2:"";s:3:"▥";s:2:"";s:3:"▦";s:2:"";s:3:"▧";s:2:"";s:3:"▨";s:2:"";s:3:"▩";s:2:"";s:3:"▲";s:2:"";s:3:"△";s:2:"";s:3:"▶";s:2:"";s:3:"▷";s:2:"";s:3:"▼";s:2:"";s:3:"▽";s:2:"";s:3:"◀";s:2:"";s:3:"◁";s:2:"";s:3:"◆";s:2:"";s:3:"◇";s:2:"";s:3:"◈";s:2:"";s:3:"○";s:2:"";s:3:"◎";s:2:"";s:3:"●";s:2:"";s:3:"◐";s:2:"";s:3:"◑";s:2:"";s:3:"★";s:2:"";s:3:"☆";s:2:"";s:3:"☎";s:2:"";s:3:"☏";s:2:"";s:3:"☜";s:2:"";s:3:"☞";s:2:"";s:3:"♀";s:2:"";s:3:"♂";s:2:"";s:3:"♠";s:2:"";s:3:"♡";s:2:"";s:3:"♣";s:2:"";s:3:"♤";s:2:"";s:3:"♥";s:2:"";s:3:"♧";s:2:"";s:3:"♨";s:2:"";s:3:"♩";s:2:"";s:3:"♪";s:2:"";s:3:"♬";s:2:"";s:3:"♭";s:2:"";s:3:"　";s:2:"";s:3:"、";s:2:"";s:3:"。";s:2:"";s:3:"〃";s:2:"";s:3:"〈";s:2:"";s:3:"〉";s:2:"";s:3:"《";s:2:"";s:3:"》";s:2:"";s:3:"「";s:2:"";s:3:"」";s:2:"";s:3:"『";s:2:"";s:3:"』";s:2:"";s:3:"【";s:2:"";s:3:"】";s:2:"";s:3:"〓";s:2:"";s:3:"〔";s:2:"";s:3:"〕";s:2:"";s:3:"ぁ";s:2:"";s:3:"あ";s:2:"";s:3:"ぃ";s:2:"";s:3:"い";s:2:"";s:3:"ぅ";s:2:"";s:3:"う";s:2:"";s:3:"ぇ";s:2:"";s:3:"え";s:2:"";s:3:"ぉ";s:2:"";s:3:"お";s:2:"";s:3:"か";s:2:"";s:3:"が";s:2:"";s:3:"き";s:2:"";s:3:"ぎ";s:2:"";s:3:"く";s:2:"";s:3:"ぐ";s:2:"";s:3:"け";s:2:"";s:3:"げ";s:2:"";s:3:"こ";s:2:"";s:3:"ご";s:2:"";s:3:"さ";s:2:"";s:3:"ざ";s:2:"";s:3:"し";s:2:"";s:3:"じ";s:2:"";s:3:"す";s:2:"";s:3:"ず";s:2:"";s:3:"せ";s:2:"";s:3:"ぜ";s:2:"";s:3:"そ";s:2:"";s:3:"ぞ";s:2:"";s:3:"た";s:2:"";s:3:"だ";s:2:"";s:3:"ち";s:2:"";s:3:"ぢ";s:2:"";s:3:"っ";s:2:"";s:3:"つ";s:2:"";s:3:"づ";s:2:"";s:3:"て";s:2:"";s:3:"で";s:2:"";s:3:"と";s:2:"";s:3:"ど";s:2:"";s:3:"な";s:2:"";s:3:"に";s:2:"";s:3:"ぬ";s:2:"";s:3:"ね";s:2:"";s:3:"の";s:2:"";s:3:"は";s:2:"";s:3:"ば";s:2:"";s:3:"ぱ";s:2:"";s:3:"ひ";s:2:"";s:3:"び";s:2:"";s:3:"ぴ";s:2:"";s:3:"ふ";s:2:"";s:3:"ぶ";s:2:"";s:3:"ぷ";s:2:"";s:3:"へ";s:2:"";s:3:"べ";s:2:"";s:3:"ぺ";s:2:"";s:3:"ほ";s:2:"";s:3:"ぼ";s:2:"";s:3:"ぽ";s:2:"";s:3:"ま";s:2:"";s:3:"み";s:2:"";s:3:"む";s:2:"";s:3:"め";s:2:"";s:3:"も";s:2:"";s:3:"ゃ";s:2:"";s:3:"や";s:2:"";s:3:"ゅ";s:2:"";s:3:"ゆ";s:2:"";s:3:"ょ";s:2:"";s:3:"よ";s:2:"";s:3:"ら";s:2:"";s:3:"り";s:2:"";s:3:"る";s:2:"";s:3:"れ";s:2:"";s:3:"ろ";s:2:"";s:3:"ゎ";s:2:"";s:3:"わ";s:2:"";s:3:"ゐ";s:2:"";s:3:"ゑ";s:2:"";s:3:"を";s:2:"";s:3:"ん";s:2:"";s:3:"ァ";s:2:"";s:3:"ア";s:2:"";s:3:"ィ";s:2:"";s:3:"イ";s:2:"";s:3:"ゥ";s:2:"";s:3:"ウ";s:2:"";s:3:"ェ";s:2:"";s:3:"エ";s:2:"";s:3:"ォ";s:2:"";s:3:"オ";s:2:"";s:3:"カ";s:2:"";s:3:"ガ";s:2:"";s:3:"キ";s:2:"";s:3:"ギ";s:2:"";s:3:"ク";s:2:"";s:3:"グ";s:2:"";s:3:"ケ";s:2:"";s:3:"ゲ";s:2:"";s:3:"コ";s:2:"";s:3:"ゴ";s:2:"";s:3:"サ";s:2:"";s:3:"ザ";s:2:"";s:3:"シ";s:2:"";s:3:"ジ";s:2:"";s:3:"ス";s:2:"";s:3:"ズ";s:2:"";s:3:"セ";s:2:"";s:3:"ゼ";s:2:"";s:3:"ソ";s:2:"";s:3:"ゾ";s:2:"";s:3:"タ";s:2:"";s:3:"ダ";s:2:"";s:3:"チ";s:2:"";s:3:"ヂ";s:2:"";s:3:"ッ";s:2:"";s:3:"ツ";s:2:"";s:3:"ヅ";s:2:"";s:3:"テ";s:2:"";s:3:"デ";s:2:"";s:3:"ト";s:2:"";s:3:"ド";s:2:"";s:3:"ナ";s:2:"";s:3:"ニ";s:2:"";s:3:"ヌ";s:2:"";s:3:"ネ";s:2:"";s:3:"ノ";s:2:"";s:3:"ハ";s:2:"";s:3:"バ";s:2:"";s:3:"パ";s:2:"";s:3:"ヒ";s:2:"";s:3:"ビ";s:2:"";s:3:"ピ";s:2:"";s:3:"フ";s:2:"";s:3:"ブ";s:2:"";s:3:"プ";s:2:"";s:3:"ヘ";s:2:"";s:3:"ベ";s:2:"";s:3:"ペ";s:2:"";s:3:"ホ";s:2:"";s:3:"ボ";s:2:"";s:3:"ポ";s:2:"";s:3:"マ";s:2:"";s:3:"ミ";s:2:"";s:3:"ム";s:2:"";s:3:"メ";s:2:"";s:3:"モ";s:2:"";s:3:"ャ";s:2:"";s:3:"ヤ";s:2:"";s:3:"ュ";s:2:"";s:3:"ユ";s:2:"";s:3:"ョ";s:2:"";s:3:"ヨ";s:2:"";s:3:"ラ";s:2:"";s:3:"リ";s:2:"";s:3:"ル";s:2:"";s:3:"レ";s:2:"";s:3:"ロ";s:2:"";s:3:"ヮ";s:2:"";s:3:"ワ";s:2:"";s:3:"ヰ";s:2:"";s:3:"ヱ";s:2:"";s:3:"ヲ";s:2:"";s:3:"ン";s:2:"";s:3:"ヴ";s:2:"";s:3:"ヵ";s:2:"";s:3:"ヶ";s:2:"";s:3:"ㄱ";s:2:"";s:3:"ㄲ";s:2:"";s:3:"ㄳ";s:2:"";s:3:"ㄴ";s:2:"";s:3:"ㄵ";s:2:"";s:3:"ㄶ";s:2:"";s:3:"ㄷ";s:2:"";s:3:"ㄸ";s:2:"";s:3:"ㄹ";s:2:"";s:3:"ㄺ";s:2:"";s:3:"ㄻ";s:2:"";s:3:"ㄼ";s:2:"";s:3:"ㄽ";s:2:"";s:3:"ㄾ";s:2:"";s:3:"ㄿ";s:2:"";s:3:"ㅀ";s:2:"";s:3:"ㅁ";s:2:"";s:3:"ㅂ";s:2:"";s:3:"ㅃ";s:2:"";s:3:"ㅄ";s:2:"";s:3:"ㅅ";s:2:"";s:3:"ㅆ";s:2:"";s:3:"ㅇ";s:2:"";s:3:"ㅈ";s:2:"";s:3:"ㅉ";s:2:"";s:3:"ㅊ";s:2:"";s:3:"ㅋ";s:2:"";s:3:"ㅌ";s:2:"";s:3:"ㅍ";s:2:"";s:3:"ㅎ";s:2:"";s:3:"ㅏ";s:2:"";s:3:"ㅐ";s:2:"";s:3:"ㅑ";s:2:"";s:3:"ㅒ";s:2:"";s:3:"ㅓ";s:2:"";s:3:"ㅔ";s:2:"";s:3:"ㅕ";s:2:"";s:3:"ㅖ";s:2:"";s:3:"ㅗ";s:2:"";s:3:"ㅘ";s:2:"";s:3:"ㅙ";s:2:"";s:3:"ㅚ";s:2:"";s:3:"ㅛ";s:2:"";s:3:"ㅜ";s:2:"";s:3:"ㅝ";s:2:"";s:3:"ㅞ";s:2:"";s:3:"ㅟ";s:2:"";s:3:"ㅠ";s:2:"";s:3:"ㅡ";s:2:"";s:3:"ㅢ";s:2:"";s:3:"ㅣ";s:2:"";s:3:"ㅤ";s:2:"";s:3:"ㅥ";s:2:"";s:3:"ㅦ";s:2:"";s:3:"ㅧ";s:2:"";s:3:"ㅨ";s:2:"";s:3:"ㅩ";s:2:"";s:3:"ㅪ";s:2:"";s:3:"ㅫ";s:2:"";s:3:"ㅬ";s:2:"";s:3:"ㅭ";s:2:"";s:3:"ㅮ";s:2:"";s:3:"ㅯ";s:2:"";s:3:"ㅰ";s:2:"";s:3:"ㅱ";s:2:"";s:3:"ㅲ";s:2:"";s:3:"ㅳ";s:2:"";s:3:"ㅴ";s:2:"";s:3:"ㅵ";s:2:"";s:3:"ㅶ";s:2:"";s:3:"ㅷ";s:2:"";s:3:"ㅸ";s:2:"";s:3:"ㅹ";s:2:"";s:3:"ㅺ";s:2:"";s:3:"ㅻ";s:2:"";s:3:"ㅼ";s:2:"";s:3:"ㅽ";s:2:"";s:3:"ㅾ";s:2:"";s:3:"ㅿ";s:2:"";s:3:"ㆀ";s:2:"";s:3:"ㆁ";s:2:"";s:3:"ㆂ";s:2:"";s:3:"ㆃ";s:2:"";s:3:"ㆄ";s:2:"";s:3:"ㆅ";s:2:"";s:3:"ㆆ";s:2:"";s:3:"ㆇ";s:2:"";s:3:"ㆈ";s:2:"";s:3:"ㆉ";s:2:"";s:3:"ㆊ";s:2:"";s:3:"ㆋ";s:2:"";s:3:"ㆌ";s:2:"";s:3:"ㆍ";s:2:"";s:3:"ㆎ";s:2:"";s:3:"㆒";s:2:"";s:3:"㆓";s:2:"";s:3:"㆔";s:2:"߲";s:3:"㆕";s:2:"";s:3:"㆖";s:2:"߾";s:3:"㆗";s:2:"";s:3:"㆘";s:2:"";s:3:"㆙";s:2:"ˣ";s:3:"㆚";s:2:"";s:3:"㆛";s:2:"ܰ";s:3:"㆜";s:2:"";s:3:"㆝";s:2:"";s:3:"㆞";s:2:"";s:3:"㆟";s:2:"";s:3:"㈀";s:2:"";s:3:"㈁";s:2:"";s:3:"㈂";s:2:"";s:3:"㈃";s:2:"";s:3:"㈄";s:2:"";s:3:"㈅";s:2:"";s:3:"㈆";s:2:"";s:3:"㈇";s:2:"";s:3:"㈈";s:2:"";s:3:"㈉";s:2:"";s:3:"㈊";s:2:"";s:3:"㈋";s:2:"";s:3:"㈌";s:2:"";s:3:"㈍";s:2:"";s:3:"㈎";s:2:"";s:3:"㈏";s:2:"";s:3:"㈐";s:2:"";s:3:"㈑";s:2:"";s:3:"㈒";s:2:"";s:3:"㈓";s:2:"";s:3:"㈔";s:2:"";s:3:"㈕";s:2:"";s:3:"㈖";s:2:"";s:3:"㈗";s:2:"";s:3:"㈘";s:2:"";s:3:"㈙";s:2:"";s:3:"㈚";s:2:"";s:3:"㈛";s:2:"";s:3:"㈜";s:2:"";s:3:"㈠";s:2:"";s:3:"㈡";s:2:"";s:3:"㈢";s:2:"߲";s:3:"㈣";s:2:"";s:3:"㈤";s:2:"";s:3:"㈥";s:2:"׿";s:3:"㈦";s:2:"";s:3:"㈧";s:2:"";s:3:"㈨";s:2:"";s:3:"㈩";s:2:"";s:3:"㈪";s:2:"";s:3:"㈫";s:2:"";s:3:"㈬";s:2:"";s:3:"㈭";s:2:"";s:3:"㈮";s:2:"";s:3:"㈯";s:2:"";s:3:"㈰";s:2:"";s:3:"㈱";s:2:"";s:3:"㈲";s:2:"";s:3:"㈳";s:2:"";s:3:"㈴";s:2:"٣";s:3:"㈵";s:2:"";s:3:"㈶";s:2:"";s:3:"㈷";s:2:"";s:3:"㈸";s:2:"";s:3:"㈹";s:2:"";s:3:"㈺";s:2:"";s:3:"㈻";s:2:"";s:3:"㈼";s:2:"";s:3:"㈽";s:2:"";s:3:"㈾";s:2:"";s:3:"㈿";s:2:"";s:3:"㉀";s:2:"";s:3:"㉁";s:2:"";s:3:"㉂";s:2:"";s:3:"㉃";s:2:"";s:3:"㉠";s:2:"";s:3:"㉡";s:2:"";s:3:"㉢";s:2:"";s:3:"㉣";s:2:"";s:3:"㉤";s:2:"";s:3:"㉥";s:2:"";s:3:"㉦";s:2:"";s:3:"㉧";s:2:"";s:3:"㉨";s:2:"";s:3:"㉩";s:2:"";s:3:"㉪";s:2:"";s:3:"㉫";s:2:"";s:3:"㉬";s:2:"";s:3:"㉭";s:2:"";s:3:"㉮";s:2:"";s:3:"㉯";s:2:"";s:3:"㉰";s:2:"";s:3:"㉱";s:2:"";s:3:"㉲";s:2:"";s:3:"㉳";s:2:"";s:3:"㉴";s:2:"";s:3:"㉵";s:2:"";s:3:"㉶";s:2:"";s:3:"㉷";s:2:"";s:3:"㉸";s:2:"";s:3:"㉹";s:2:"";s:3:"㉺";s:2:"";s:3:"㉻";s:2:"";s:3:"㉿";s:2:"";s:3:"㊀";s:2:"";s:3:"㊁";s:2:"";s:3:"㊂";s:2:"߲";s:3:"㊃";s:2:"";s:3:"㊄";s:2:"";s:3:"㊅";s:2:"׿";s:3:"㊆";s:2:"";s:3:"㊇";s:2:"";s:3:"㊈";s:2:"";s:3:"㊉";s:2:"";s:3:"㊊";s:2:"";s:3:"㊋";s:2:"";s:3:"㊌";s:2:"";s:3:"㊍";s:2:"";s:3:"㊎";s:2:"";s:3:"㊏";s:2:"";s:3:"㊐";s:2:"";s:3:"㊑";s:2:"";s:3:"㊒";s:2:"";s:3:"㊓";s:2:"";s:3:"㊔";s:2:"٣";s:3:"㊕";s:2:"";s:3:"㊖";s:2:"";s:3:"㊗";s:2:"";s:3:"㊘";s:2:"";s:3:"㊙";s:2:"";s:3:"㊚";s:2:"";s:3:"㊛";s:2:"ҳ";s:3:"㊜";s:2:"";s:3:"㊝";s:2:"";s:3:"㊞";s:2:"";s:3:"㊟";s:2:"";s:3:"㊠";s:2:"";s:3:"㊡";s:2:"";s:3:"㊢";s:2:"";s:3:"㊣";s:2:"";s:3:"㊤";s:2:"߾";s:3:"㊥";s:2:"";s:3:"㊦";s:2:"";s:3:"㊧";s:2:"";s:3:"㊨";s:2:"";s:3:"㊩";s:2:"";s:3:"㊪";s:2:"";s:3:"㊫";s:2:"";s:3:"㊬";s:2:"";s:3:"㊭";s:2:"";s:3:"㊮";s:2:"";s:3:"㊯";s:2:"";s:3:"㊰";s:2:"";s:3:"㎀";s:2:"";s:3:"㎁";s:2:"";s:3:"㎂";s:2:"";s:3:"㎃";s:2:"";s:3:"㎄";s:2:"";s:3:"㎈";s:2:"";s:3:"㎉";s:2:"";s:3:"㎊";s:2:"";s:3:"㎋";s:2:"";s:3:"㎌";s:2:"";s:3:"㎍";s:2:"";s:3:"㎎";s:2:"";s:3:"㎏";s:2:"";s:3:"㎐";s:2:"";s:3:"㎑";s:2:"";s:3:"㎒";s:2:"";s:3:"㎓";s:2:"";s:3:"㎔";s:2:"";s:3:"㎕";s:2:"";s:3:"㎖";s:2:"";s:3:"㎗";s:2:"";s:3:"㎘";s:2:"";s:3:"㎙";s:2:"";s:3:"㎚";s:2:"";s:3:"㎛";s:2:"";s:3:"㎜";s:2:"";s:3:"㎝";s:2:"";s:3:"㎞";s:2:"";s:3:"㎟";s:2:"";s:3:"㎠";s:2:"";s:3:"㎡";s:2:"";s:3:"㎢";s:2:"";s:3:"㎣";s:2:"";s:3:"㎤";s:2:"";s:3:"㎥";s:2:"";s:3:"㎦";s:2:"";s:3:"㎧";s:2:"";s:3:"㎨";s:2:"";s:3:"㎩";s:2:"";s:3:"㎪";s:2:"";s:3:"㎫";s:2:"";s:3:"㎬";s:2:"";s:3:"㎭";s:2:"";s:3:"㎮";s:2:"";s:3:"㎯";s:2:"";s:3:"㎰";s:2:"";s:3:"㎱";s:2:"";s:3:"㎲";s:2:"";s:3:"㎳";s:2:"";s:3:"㎴";s:2:"";s:3:"㎵";s:2:"";s:3:"㎶";s:2:"";s:3:"㎷";s:2:"";s:3:"㎸";s:2:"";s:3:"㎹";s:2:"";s:3:"㎺";s:2:"";s:3:"㎻";s:2:"";s:3:"㎼";s:2:"";s:3:"㎽";s:2:"";s:3:"㎾";s:2:"";s:3:"㎿";s:2:"";s:3:"㏀";s:2:"";s:3:"㏁";s:2:"";s:3:"㏂";s:2:"";s:3:"㏃";s:2:"";s:3:"㏄";s:2:"";s:3:"㏅";s:2:"";s:3:"㏆";s:2:"";s:3:"㏇";s:2:"";s:3:"㏈";s:2:"";s:3:"㏉";s:2:"";s:3:"㏊";s:2:"";s:3:"㏏";s:2:"";s:3:"㏐";s:2:"";s:3:"㏓";s:2:"";s:3:"㏖";s:2:"";s:3:"㏘";s:2:"";s:3:"㏛";s:2:"";s:3:"㏜";s:2:"";s:3:"㏝";s:2:"";s:3:"一";s:2:"";s:3:"丁";s:2:"";s:3:"七";s:2:"";s:3:"万";s:2:"ز";s:3:"丈";s:2:"";s:3:"三";s:2:"߲";s:3:"上";s:2:"߾";s:3:"下";s:2:"";s:3:"不";s:2:"";s:3:"丑";s:2:"";s:3:"且";s:2:"";s:3:"丕";s:2:"";s:3:"世";s:2:"";s:3:"丘";s:2:"";s:3:"丙";s:2:"ܰ";s:3:"丞";s:2:"";s:3:"中";s:2:"";s:3:"串";s:2:"";s:3:"丸";s:2:"";s:3:"丹";s:2:"ӡ";s:3:"主";s:2:"";s:3:"乂";s:2:"";s:3:"乃";s:2:"Ҭ";s:3:"久";s:2:"";s:3:"之";s:2:"";s:3:"乍";s:2:"޿";s:3:"乎";s:2:"";s:3:"乏";s:2:"";s:3:"乖";s:2:"";s:3:"乘";s:2:"";s:3:"乙";s:2:"";s:3:"九";s:2:"";s:3:"乞";s:2:"";s:3:"也";s:2:"";s:3:"乫";s:2:"";s:3:"乭";s:2:"";s:3:"乳";s:2:"";s:3:"乶";s:2:"";s:3:"乷";s:2:"߭";s:3:"乾";s:2:"";s:3:"亂";s:2:"կ";s:3:"了";s:2:"";s:3:"予";s:2:"";s:3:"事";s:2:"";s:3:"二";s:2:"";s:3:"于";s:2:"";s:3:"亐";s:2:"";s:3:"云";s:2:"";s:3:"互";s:2:"";s:3:"五";s:2:"";s:3:"井";s:2:"";s:3:"亘";s:2:"";s:3:"些";s:2:"";s:3:"亞";s:2:"";s:3:"亡";s:2:"";s:3:"亢";s:2:"";s:3:"交";s:2:"";s:3:"亥";s:2:"";s:3:"亦";s:2:"";s:3:"亨";s:2:"";s:3:"享";s:2:"";s:3:"京";s:2:"";s:3:"亭";s:2:"";s:3:"亮";s:2:"";s:3:"亶";s:2:"Ӣ";s:3:"人";s:2:"";s:3:"什";s:2:"";s:3:"仁";s:2:"";s:3:"仄";s:2:"";s:3:"仇";s:2:"";s:3:"今";s:2:"";s:3:"介";s:2:"˿";s:3:"仍";s:2:"";s:3:"仔";s:2:"";s:3:"仕";s:2:"";s:3:"他";s:2:"";s:3:"仗";s:2:"";s:3:"付";s:2:"";s:3:"仙";s:2:"";s:3:"仝";s:2:"";s:3:"仟";s:2:"";s:3:"代";s:2:"";s:3:"令";s:2:"ֵ";s:3:"以";s:2:"";s:3:"仰";s:2:"";s:3:"仲";s:2:"";s:3:"件";s:2:"";s:3:"价";s:2:"";s:3:"任";s:2:"";s:3:"企";s:2:"";s:3:"伉";s:2:"";s:3:"伊";s:2:"";s:3:"伋";s:2:"";s:3:"伍";s:2:"";s:3:"伎";s:2:"";s:3:"伏";s:2:"";s:3:"伐";s:2:"";s:3:"休";s:2:"";s:3:"伯";s:2:"";s:3:"伴";s:2:"";s:3:"伶";s:2:"ֶ";s:3:"伸";s:2:"";s:3:"伺";s:2:"";s:3:"似";s:2:"";s:3:"伽";s:2:"ʡ";s:3:"佃";s:2:"";s:3:"但";s:2:"ӣ";s:3:"佇";s:2:"";s:3:"佈";s:2:"";s:3:"位";s:2:"";s:3:"低";s:2:"";s:3:"住";s:2:"";s:3:"佐";s:2:"";s:3:"佑";s:2:"";s:3:"何";s:2:"";s:3:"余";s:2:"";s:3:"佚";s:2:"";s:3:"佛";s:2:"";s:3:"作";s:2:"";s:3:"佩";s:2:"";s:3:"佯";s:2:"";s:3:"佰";s:2:"";s:3:"佳";s:2:"ʢ";s:3:"佶";s:2:"";s:3:"佺";s:2:"";s:3:"佾";s:2:"";s:3:"使";s:2:"";s:3:"侁";s:2:"";s:3:"侃";s:2:"";s:3:"侄";s:2:"";s:3:"來";s:2:"";s:3:"侈";s:2:"";s:3:"侊";s:2:"";s:3:"例";s:2:"";s:3:"侍";s:2:"";s:3:"侏";s:2:"";s:3:"侑";s:2:"";s:3:"侖";s:2:"";s:3:"侘";s:2:"";s:3:"供";s:2:"";s:3:"依";s:2:"";s:3:"侮";s:2:"ٲ";s:3:"侯";s:2:"";s:3:"侵";s:2:"";s:3:"侶";s:2:"";s:3:"便";s:2:"";s:3:"係";s:2:"";s:3:"促";s:2:"";s:3:"俄";s:2:"";s:3:"俉";s:2:"";s:3:"俊";s:2:"";s:3:"俎";s:2:"";s:3:"俑";s:2:"";s:3:"俓";s:2:"";s:3:"俔";s:2:"";s:3:"俗";s:2:"";s:3:"俚";s:2:"";s:3:"保";s:2:"";s:3:"俟";s:2:"";s:3:"俠";s:2:"";s:3:"信";s:2:"";s:3:"修";s:2:"";s:3:"俯";s:2:"";s:3:"俱";s:2:"";s:3:"俳";s:2:"";s:3:"俵";s:2:"";s:3:"俸";s:2:"";s:3:"俺";s:2:"";s:3:"倂";s:2:"ܱ";s:3:"倆";s:2:"";s:3:"倉";s:2:"";s:3:"個";s:2:"";s:3:"倍";s:2:"";s:3:"們";s:2:"";s:3:"倒";s:2:"";s:3:"倖";s:2:"";s:3:"候";s:2:"";s:3:"倚";s:2:"";s:3:"倜";s:2:"";s:3:"倞";s:2:"";s:3:"借";s:2:"";s:3:"倡";s:2:"";s:3:"倣";s:2:"ۧ";s:3:"値";s:2:"";s:3:"倦";s:2:"";s:3:"倧";s:2:"";s:3:"倨";s:2:"";s:3:"倪";s:2:"";s:3:"倫";s:2:"";s:3:"倬";s:2:"";s:3:"倭";s:2:"";s:3:"倻";s:2:"";s:3:"偃";s:2:"";s:3:"假";s:2:"ʣ";s:3:"偈";s:2:"̧";s:3:"偉";s:2:"";s:3:"偏";s:2:"";s:3:"偕";s:2:"";s:3:"做";s:2:"";s:3:"停";s:2:"";s:3:"健";s:2:"";s:3:"側";s:2:"";s:3:"偵";s:2:"";s:3:"偶";s:2:"";s:3:"偸";s:2:"";s:3:"傀";s:2:"";s:3:"傅";s:2:"";s:3:"傍";s:2:"ۨ";s:3:"傑";s:2:"";s:3:"傘";s:2:"ߡ";s:3:"備";s:2:"";s:3:"催";s:2:"";s:3:"傭";s:2:"";s:3:"傲";s:2:"";s:3:"傳";s:2:"";s:3:"債";s:2:"";s:3:"傷";s:2:"߿";s:3:"傾";s:2:"";s:3:"僅";s:2:"";s:3:"僉";s:2:"";s:3:"僊";s:2:"";s:3:"像";s:2:"";s:3:"僑";s:2:"";s:3:"僕";s:2:"";s:3:"僖";s:2:"";s:3:"僚";s:2:"";s:3:"僞";s:2:"";s:3:"僥";s:2:"";s:3:"僧";s:2:"";s:3:"僭";s:2:"";s:3:"價";s:2:"ʤ";s:3:"僻";s:2:"";s:3:"僿";s:2:"";s:3:"儀";s:2:"";s:3:"儁";s:2:"";s:3:"億";s:2:"";s:3:"儆";s:2:"";s:3:"儉";s:2:"";s:3:"儒";s:2:"";s:3:"償";s:2:"";s:3:"儡";s:2:"";s:3:"優";s:2:"";s:3:"儲";s:2:"";s:3:"儷";s:2:"";s:3:"儺";s:2:"";s:3:"儼";s:2:"";s:3:"兀";s:2:"";s:3:"允";s:2:"";s:3:"元";s:2:"";s:3:"兄";s:2:"";s:3:"充";s:2:"";s:3:"兆";s:2:"";s:3:"兇";s:2:"";s:3:"先";s:2:"";s:3:"光";s:2:"";s:3:"克";s:2:"к";s:3:"兌";s:2:"";s:3:"免";s:2:"";s:3:"兎";s:2:"";s:3:"兒";s:2:"";s:3:"兜";s:2:"";s:3:"兢";s:2:"";s:3:"入";s:2:"";s:3:"內";s:2:"Ү";s:3:"全";s:2:"";s:3:"兩";s:2:"";s:3:"兪";s:2:"";s:3:"八";s:2:"";s:3:"公";s:2:"";s:3:"六";s:2:"׿";s:3:"兮";s:2:"";s:3:"共";s:2:"";s:3:"兵";s:2:"ܲ";s:3:"其";s:2:"";s:3:"具";s:2:"";s:3:"典";s:2:"";s:3:"兼";s:2:"";s:3:"冀";s:2:"";s:3:"円";s:2:"";s:3:"冊";s:2:"";s:3:"再";s:2:"";s:3:"冒";s:2:"ٳ";s:3:"冕";s:2:"";s:3:"冗";s:2:"";s:3:"冠";s:2:"ή";s:3:"冥";s:2:"٢";s:3:"冪";s:2:"";s:3:"冬";s:2:"";s:3:"冶";s:2:"";s:3:"冷";s:2:"";s:3:"冽";s:2:"֩";s:3:"凄";s:2:"";s:3:"准";s:2:"";s:3:"凉";s:2:"";s:3:"凋";s:2:"";s:3:"凌";s:2:"";s:3:"凍";s:2:"";s:3:"凜";s:2:"";s:3:"凝";s:2:"";s:3:"凞";s:2:"";s:3:"凡";s:2:"";s:3:"凰";s:2:"";s:3:"凱";s:2:"";s:3:"凶";s:2:"";s:3:"凸";s:2:"";s:3:"凹";s:2:"";s:3:"出";s:2:"";s:3:"函";s:2:"";s:3:"刀";s:2:"";s:3:"刃";s:2:"";s:3:"分";s:2:"";s:3:"切";s:2:"";s:3:"刈";s:2:"";s:3:"刊";s:2:"";s:3:"刎";s:2:"";s:3:"刑";s:2:"";s:3:"列";s:2:"֪";s:3:"初";s:2:"";s:3:"判";s:2:"";s:3:"別";s:2:"ܬ";s:3:"利";s:2:"";s:3:"刪";s:2:"ߢ";s:3:"刮";s:2:"ξ";s:3:"到";s:2:"";s:3:"制";s:2:"";s:3:"刷";s:2:"";s:3:"券";s:2:"";s:3:"刹";s:2:"";s:3:"刺";s:2:"";s:3:"刻";s:2:"ʾ";s:3:"剃";s:2:"";s:3:"則";s:2:"";s:3:"削";s:2:"";s:3:"剋";s:2:"л";s:3:"剌";s:2:"շ";s:3:"前";s:2:"";s:3:"剔";s:2:"";s:3:"剖";s:2:"";s:3:"剛";s:2:"˧";s:3:"剝";s:2:"";s:3:"剡";s:2:"";s:3:"剩";s:2:"";s:3:"剪";s:2:"";s:3:"副";s:2:"";s:3:"割";s:2:"";s:3:"創";s:2:"";s:3:"剽";s:2:"";s:3:"剿";s:2:"";s:3:"劃";s:2:"";s:3:"劇";s:2:"м";s:3:"劈";s:2:"";s:3:"劉";s:2:"ױ";s:3:"劍";s:2:"";s:3:"劑";s:2:"";s:3:"劒";s:2:"";s:3:"力";s:2:"";s:3:"功";s:2:"";s:3:"加";s:2:"ʥ";s:3:"劣";s:2:"֫";s:3:"劤";s:2:"";s:3:"助";s:2:"";s:3:"努";s:2:"ҽ";s:3:"劫";s:2:"̤";s:3:"劾";s:2:"";s:3:"勁";s:2:"";s:3:"勃";s:2:"";s:3:"勅";s:2:"";s:3:"勇";s:2:"";s:3:"勉";s:2:"";s:3:"勍";s:2:"";s:3:"勒";s:2:"";s:3:"動";s:2:"";s:3:"勖";s:2:"";s:3:"勘";s:2:"";s:3:"務";s:2:"";s:3:"勛";s:2:"";s:3:"勝";s:2:"";s:3:"勞";s:2:"";s:3:"募";s:2:"ٴ";s:3:"勢";s:2:"";s:3:"勣";s:2:"";s:3:"勤";s:2:"";s:3:"勳";s:2:"";s:3:"勵";s:2:"";s:3:"勸";s:2:"";s:3:"勺";s:2:"";s:3:"勻";s:2:"в";s:3:"勾";s:2:"";s:3:"勿";s:2:"ڨ";s:3:"包";s:2:"";s:3:"匈";s:2:"";s:3:"匍";s:2:"";s:3:"匏";s:2:"";s:3:"匐";s:2:"";s:3:"匕";s:2:"";s:3:"化";s:2:"";s:3:"北";s:2:"";s:3:"匙";s:2:"";s:3:"匠";s:2:"";s:3:"匡";s:2:"";s:3:"匣";s:2:"ˡ";s:3:"匪";s:2:"";s:3:"匯";s:2:"";s:3:"匹";s:2:"";s:3:"匿";s:2:"";s:3:"區";s:2:"ϡ";s:3:"十";s:2:"";s:3:"千";s:2:"";s:3:"卄";s:2:"";s:3:"升";s:2:"";s:3:"午";s:2:"";s:3:"卉";s:2:"";s:3:"半";s:2:"";s:3:"卍";s:2:"س";s:3:"卑";s:2:"";s:3:"卒";s:2:"";s:3:"卓";s:2:"";s:3:"協";s:2:"";s:3:"南";s:2:"";s:3:"博";s:2:"";s:3:"卜";s:2:"";s:3:"卞";s:2:"ܦ";s:3:"占";s:2:"";s:3:"卦";s:2:"";s:3:"卨";s:2:"";s:3:"卯";s:2:"";s:3:"印";s:2:"";s:3:"危";s:2:"";s:3:"却";s:2:"ʿ";s:3:"卵";s:2:"հ";s:3:"卷";s:2:"";s:3:"卽";s:2:"";s:3:"卿";s:2:"";s:3:"厄";s:2:"";s:3:"厓";s:2:"";s:3:"厘";s:2:"";s:3:"厚";s:2:"";s:3:"原";s:2:"";s:3:"厠";s:2:"";s:3:"厥";s:2:"";s:3:"厦";s:2:"";s:3:"厭";s:2:"";s:3:"去";s:2:"";s:3:"參";s:2:"";s:3:"又";s:2:"";s:3:"叉";s:2:"";s:3:"及";s:2:"";s:3:"友";s:2:"";s:3:"反";s:2:"";s:3:"叔";s:2:"";s:3:"取";s:2:"";s:3:"受";s:2:"";s:3:"叛";s:2:"";s:3:"叡";s:2:"";s:3:"叢";s:2:"";s:3:"口";s:2:"Ϣ";s:3:"古";s:2:"ͯ";s:3:"句";s:2:"ϣ";s:3:"叩";s:2:"Ͱ";s:3:"只";s:2:"";s:3:"叫";s:2:"У";s:3:"召";s:2:"";s:3:"叭";s:2:"";s:3:"可";s:2:"ʦ";s:3:"台";s:2:"";s:3:"叱";s:2:"";s:3:"史";s:2:"";s:3:"右";s:2:"";s:3:"司";s:2:"";s:3:"吃";s:2:"";s:3:"各";s:2:"";s:3:"合";s:2:"";s:3:"吉";s:2:"";s:3:"吊";s:2:"";s:3:"同";s:2:"";s:3:"名";s:2:"٣";s:3:"后";s:2:"";s:3:"吏";s:2:"";s:3:"吐";s:2:"";s:3:"向";s:2:"";s:3:"君";s:2:"";s:3:"吝";s:2:"";s:3:"吟";s:2:"";s:3:"吠";s:2:"";s:3:"否";s:2:"";s:3:"吩";s:2:"";s:3:"含";s:2:"";s:3:"吳";s:2:"";s:3:"吸";s:2:"";s:3:"吹";s:2:"";s:3:"吻";s:2:"";s:3:"吼";s:2:"";s:3:"吾";s:2:"";s:3:"呂";s:2:"";s:3:"呈";s:2:"";s:3:"告";s:2:"ͱ";s:3:"呑";s:2:"";s:3:"周";s:2:"";s:3:"呪";s:2:"";s:3:"呱";s:2:"Ͳ";s:3:"味";s:2:"ګ";s:3:"呵";s:2:"ʧ";s:3:"呻";s:2:"";s:3:"呼";s:2:"";s:3:"命";s:2:"٤";s:3:"咀";s:2:"";s:3:"咆";s:2:"";s:3:"和";s:2:"";s:3:"咎";s:2:"Ϥ";s:3:"咐";s:2:"";s:3:"咤";s:2:"";s:3:"咨";s:2:"";s:3:"咫";s:2:"";s:3:"咬";s:2:"";s:3:"咳";s:2:"";s:3:"咸";s:2:"";s:3:"咽";s:2:"";s:3:"哀";s:2:"";s:3:"品";s:2:"";s:3:"哄";s:2:"";s:3:"哈";s:2:"";s:3:"哉";s:2:"";s:3:"員";s:2:"";s:3:"哥";s:2:"ʨ";s:3:"哨";s:2:"";s:3:"哭";s:2:"";s:3:"哮";s:2:"";s:3:"哲";s:2:"";s:3:"哺";s:2:"";s:3:"唄";s:2:"";s:3:"唆";s:2:"";s:3:"唇";s:2:"";s:3:"唎";s:2:"";s:3:"唐";s:2:"";s:3:"唜";s:2:"";s:3:"唯";s:2:"";s:3:"唱";s:2:"";s:3:"唵";s:2:"";s:3:"唾";s:2:"";s:3:"啄";s:2:"";s:3:"商";s:2:"";s:3:"問";s:2:"";s:3:"啓";s:2:"";s:3:"啖";s:2:"Ӻ";s:3:"啞";s:2:"";s:3:"啣";s:2:"";s:3:"啼";s:2:"";s:3:"喀";s:2:"";s:3:"善";s:2:"";s:3:"喆";s:2:"";s:3:"喇";s:2:"";s:3:"喉";s:2:"";s:3:"喊";s:2:"";s:3:"喘";s:2:"";s:3:"喙";s:2:"";s:3:"喚";s:2:"";s:3:"喜";s:2:"";s:3:"喝";s:2:"";s:3:"喧";s:2:"";s:3:"喩";s:2:"";s:3:"喪";s:2:"";s:3:"喫";s:2:"";s:3:"喬";s:2:"";s:3:"單";s:2:"Ӥ";s:3:"嗅";s:2:"";s:3:"嗇";s:2:"";s:3:"嗔";s:2:"";s:3:"嗚";s:2:"";s:3:"嗜";s:2:"";s:3:"嗟";s:2:"";s:3:"嗣";s:2:"";s:3:"嗤";s:2:"";s:3:"嗽";s:2:"";s:3:"嗾";s:2:"";s:3:"嘆";s:2:"";s:3:"嘉";s:2:"ʩ";s:3:"嘔";s:2:"ϥ";s:3:"嘗";s:2:"";s:3:"嘯";s:2:"";s:3:"嘲";s:2:"";s:3:"嘴";s:2:"";s:3:"嘶";s:2:"";s:3:"噓";s:2:"";s:3:"器";s:2:"";s:3:"噫";s:2:"";s:3:"噴";s:2:"";s:3:"嚆";s:2:"";s:3:"嚥";s:2:"";s:3:"嚬";s:2:"ޭ";s:3:"嚮";s:2:"";s:3:"嚴";s:2:"";s:3:"嚼";s:2:"";s:3:"囊";s:2:"ҥ";s:3:"囍";s:2:"";s:3:"囑";s:2:"";s:3:"囚";s:2:"";s:3:"四";s:2:"";s:3:"回";s:2:"";s:3:"因";s:2:"";s:3:"困";s:2:"";s:3:"囹";s:2:"ַ";s:3:"固";s:2:"ͳ";s:3:"圃";s:2:"";s:3:"圄";s:2:"";s:3:"圈";s:2:"";s:3:"國";s:2:"";s:3:"圍";s:2:"";s:3:"園";s:2:"";s:3:"圓";s:2:"";s:3:"圖";s:2:"";s:3:"團";s:2:"ӥ";s:3:"土";s:2:"";s:3:"在";s:2:"";s:3:"圭";s:2:"Ф";s:3:"地";s:2:"";s:3:"圻";s:2:"";s:3:"址";s:2:"";s:3:"坂";s:2:"";s:3:"均";s:2:"г";s:3:"坊";s:2:"۩";s:3:"坍";s:2:"ӻ";s:3:"坎";s:2:"";s:3:"坐";s:2:"";s:3:"坑";s:2:"";s:3:"坡";s:2:"";s:3:"坤";s:2:"";s:3:"坦";s:2:"";s:3:"坪";s:2:"";s:3:"坮";s:2:"";s:3:"坰";s:2:"";s:3:"坵";s:2:"Ϧ";s:3:"坼";s:2:"";s:3:"垂";s:2:"";s:3:"垈";s:2:"";s:3:"型";s:2:"";s:3:"垓";s:2:"";s:3:"垠";s:2:"";s:3:"垢";s:2:"ϧ";s:3:"垣";s:2:"";s:3:"埃";s:2:"";s:3:"埇";s:2:"";s:3:"埈";s:2:"";s:3:"埋";s:2:"";s:3:"城";s:2:"";s:3:"域";s:2:"";s:3:"埠";s:2:"";s:3:"埰";s:2:"";s:3:"埴";s:2:"";s:3:"執";s:2:"";s:3:"培";s:2:"";s:3:"基";s:2:"";s:3:"埼";s:2:"";s:3:"堀";s:2:"";s:3:"堂";s:2:"";s:3:"堅";s:2:"̱";s:3:"堆";s:2:"";s:3:"堈";s:2:"˨";s:3:"堉";s:2:"";s:3:"堊";s:2:"";s:3:"堞";s:2:"";s:3:"堡";s:2:"";s:3:"堤";s:2:"";s:3:"堧";s:2:"";s:3:"堪";s:2:"";s:3:"堯";s:2:"";s:3:"堰";s:2:"";s:3:"報";s:2:"";s:3:"場";s:2:"";s:3:"堵";s:2:"";s:3:"堺";s:2:"";s:3:"塊";s:2:"";s:3:"塋";s:2:"";s:3:"塏";s:2:"";s:3:"塑";s:2:"";s:3:"塔";s:2:"";s:3:"塗";s:2:"";s:3:"塘";s:2:"";s:3:"塚";s:2:"";s:3:"塞";s:2:"";s:3:"塡";s:2:"";s:3:"塢";s:2:"";s:3:"塤";s:2:"";s:3:"塵";s:2:"";s:3:"塹";s:2:"";s:3:"塼";s:2:"";s:3:"塾";s:2:"";s:3:"境";s:2:"";s:3:"墅";s:2:"";s:3:"墉";s:2:"";s:3:"墓";s:2:"";s:3:"墜";s:2:"";s:3:"增";s:2:"";s:3:"墟";s:2:"";s:3:"墨";s:2:"";s:3:"墩";s:2:"";s:3:"墮";s:2:"";s:3:"墳";s:2:"";s:3:"墺";s:2:"";s:3:"墻";s:2:"";s:3:"墾";s:2:"";s:3:"壁";s:2:"";s:3:"壅";s:2:"";s:3:"壇";s:2:"Ӧ";s:3:"壎";s:2:"";s:3:"壑";s:2:"";s:3:"壓";s:2:"";s:3:"壕";s:2:"";s:3:"壘";s:2:"פ";s:3:"壙";s:2:"";s:3:"壞";s:2:"";s:3:"壟";s:2:"";s:3:"壤";s:2:"";s:3:"士";s:2:"";s:3:"壬";s:2:"";s:3:"壯";s:2:"";s:3:"壹";s:2:"";s:3:"壺";s:2:"";s:3:"壻";s:2:"";s:3:"壽";s:2:"";s:3:"夏";s:2:"";s:3:"夔";s:2:"";s:3:"夕";s:2:"";s:3:"外";s:2:"";s:3:"夙";s:2:"";s:3:"多";s:2:"";s:3:"夜";s:2:"";s:3:"夢";s:2:"";s:3:"大";s:2:"";s:3:"天";s:2:"";s:3:"太";s:2:"";s:3:"夫";s:2:"";s:3:"夭";s:2:"";s:3:"央";s:2:"";s:3:"失";s:2:"";s:3:"夷";s:2:"";s:3:"夾";s:2:"";s:3:"奄";s:2:"";s:3:"奇";s:2:"";s:3:"奈";s:2:"ү";s:3:"奉";s:2:"";s:3:"奎";s:2:"Х";s:3:"奏";s:2:"";s:3:"奐";s:2:"";s:3:"契";s:2:"";s:3:"奔";s:2:"";s:3:"奕";s:2:"";s:3:"套";s:2:"";s:3:"奚";s:2:"";s:3:"奠";s:2:"";s:3:"奢";s:2:"";s:3:"奧";s:2:"";s:3:"奪";s:2:"";s:3:"奫";s:2:"";s:3:"奬";s:2:"";s:3:"奭";s:2:"";s:3:"奮";s:2:"";s:3:"女";s:2:"ҳ";s:3:"奴";s:2:"ҿ";s:3:"奸";s:2:"";s:3:"好";s:2:"";s:3:"如";s:2:"";s:3:"妃";s:2:"";s:3:"妄";s:2:"";s:3:"妊";s:2:"";s:3:"妓";s:2:"";s:3:"妖";s:2:"";s:3:"妗";s:2:"";s:3:"妙";s:2:"";s:3:"妥";s:2:"";s:3:"妨";s:2:"۪";s:3:"妬";s:2:"";s:3:"妹";s:2:"";s:3:"妻";s:2:"";s:3:"妾";s:2:"";s:3:"姃";s:2:"";s:3:"姆";s:2:"ٵ";s:3:"姉";s:2:"";s:3:"始";s:2:"";s:3:"姐";s:2:"";s:3:"姑";s:2:"ʹ";s:3:"姓";s:2:"";s:3:"委";s:2:"";s:3:"姙";s:2:"";s:3:"姚";s:2:"";s:3:"姜";s:2:"˩";s:3:"姝";s:2:"";s:3:"姦";s:2:"";s:3:"姨";s:2:"";s:3:"姪";s:2:"";s:3:"姬";s:2:"";s:3:"姮";s:2:"";s:3:"姸";s:2:"";s:3:"姻";s:2:"";s:3:"姿";s:2:"";s:3:"威";s:2:"";s:3:"娃";s:2:"";s:3:"娑";s:2:"";s:3:"娘";s:2:"Ҧ";s:3:"娛";s:2:"";s:3:"娜";s:2:"";s:3:"娟";s:2:"";s:3:"娠";s:2:"";s:3:"娥";s:2:"";s:3:"娩";s:2:"ش";s:3:"娶";s:2:"";s:3:"娼";s:2:"";s:3:"婁";s:2:"ץ";s:3:"婆";s:2:"";s:3:"婉";s:2:"";s:3:"婚";s:2:"";s:3:"婢";s:2:"";s:3:"婦";s:2:"";s:3:"媒";s:2:"";s:3:"媚";s:2:"ڬ";s:3:"媛";s:2:"";s:3:"媤";s:2:"";s:3:"嫁";s:2:"ʪ";s:3:"嫂";s:2:"";s:3:"嫄";s:2:"";s:3:"嫉";s:2:"";s:3:"嫌";s:2:"";s:3:"嫡";s:2:"";s:3:"嫦";s:2:"";s:3:"嫩";s:2:"";s:3:"嬅";s:2:"";s:3:"嬉";s:2:"";s:3:"嬋";s:2:"";s:3:"嬌";s:2:"";s:3:"嬖";s:2:"";s:3:"嬪";s:2:"ޮ";s:3:"孀";s:2:"";s:3:"孃";s:2:"";s:3:"子";s:2:"";s:3:"孑";s:2:"";s:3:"孔";s:2:"";s:3:"孕";s:2:"";s:3:"字";s:2:"";s:3:"存";s:2:"";s:3:"孚";s:2:"ݡ";s:3:"孜";s:2:"";s:3:"孝";s:2:"";s:3:"孟";s:2:"";s:3:"季";s:2:"";s:3:"孤";s:2:"͵";s:3:"孩";s:2:"";s:3:"孫";s:2:"";s:3:"孰";s:2:"";s:3:"孱";s:2:"";s:3:"孵";s:2:"ݢ";s:3:"學";s:2:"";s:3:"孺";s:2:"";s:3:"孼";s:2:"";s:3:"宅";s:2:"";s:3:"宇";s:2:"";s:3:"守";s:2:"";s:3:"安";s:2:"";s:3:"宋";s:2:"";s:3:"完";s:2:"";s:3:"宏";s:2:"";s:3:"宓";s:2:"";s:3:"宕";s:2:"";s:3:"宖";s:2:"";s:3:"宗";s:2:"";s:3:"官";s:2:"ί";s:3:"宙";s:2:"";s:3:"定";s:2:"";s:3:"宛";s:2:"";s:3:"宜";s:2:"";s:3:"客";s:2:"";s:3:"宣";s:2:"";s:3:"室";s:2:"";s:3:"宥";s:2:"";s:3:"宦";s:2:"";s:3:"宬";s:2:"";s:3:"宮";s:2:"";s:3:"宰";s:2:"";s:3:"害";s:2:"";s:3:"宴";s:2:"";s:3:"宵";s:2:"";s:3:"家";s:2:"ʫ";s:3:"宸";s:2:"";s:3:"容";s:2:"";s:3:"宿";s:2:"";s:3:"寀";s:2:"";s:3:"寂";s:2:"";s:3:"寃";s:2:"";s:3:"寄";s:2:"";s:3:"寅";s:2:"";s:3:"密";s:2:"";s:3:"寇";s:2:"Ϩ";s:3:"富";s:2:"ݣ";s:3:"寐";s:2:"";s:3:"寒";s:2:"";s:3:"寓";s:2:"";s:3:"寔";s:2:"";s:3:"寗";s:2:"Ҽ";s:3:"寞";s:2:"ج";s:3:"察";s:2:"";s:3:"寡";s:2:"";s:3:"寢";s:2:"";s:3:"寤";s:2:"";s:3:"寥";s:2:"";s:3:"實";s:2:"";s:3:"寧";s:2:"һ";s:3:"寨";s:2:"";s:3:"審";s:2:"";s:3:"寫";s:2:"";s:3:"寬";s:2:"ΰ";s:3:"寮";s:2:"";s:3:"寯";s:2:"";s:3:"寵";s:2:"";s:3:"寶";s:2:"";s:3:"寸";s:2:"";s:3:"寺";s:2:"";s:3:"封";s:2:"";s:3:"射";s:2:"";s:3:"將";s:2:"";s:3:"專";s:2:"";s:3:"尉";s:2:"";s:3:"尊";s:2:"";s:3:"尋";s:2:"";s:3:"對";s:2:"";s:3:"導";s:2:"";s:3:"小";s:2:"";s:3:"少";s:2:"";s:3:"尖";s:2:"";s:3:"尙";s:2:"";s:3:"尤";s:2:"";s:3:"尨";s:2:"۫";s:3:"就";s:2:"";s:3:"尸";s:2:"";s:3:"尹";s:2:"";s:3:"尺";s:2:"";s:3:"尻";s:2:"Ͷ";s:3:"尼";s:2:"";s:3:"尾";s:2:"ڭ";s:3:"尿";s:2:"";s:3:"局";s:2:"";s:3:"居";s:2:"";s:3:"屆";s:2:"";s:3:"屈";s:2:"";s:3:"屋";s:2:"";s:3:"屍";s:2:"";s:3:"屎";s:2:"";s:3:"屑";s:2:"";s:3:"展";s:2:"";s:3:"屛";s:2:"ܳ";s:3:"屠";s:2:"";s:3:"屢";s:2:"צ";s:3:"層";s:2:"";s:3:"履";s:2:"";s:3:"屬";s:2:"";s:3:"屯";s:2:"";s:3:"山";s:2:"ߣ";s:3:"屹";s:2:"";s:3:"岐";s:2:"";s:3:"岑";s:2:"";s:3:"岡";s:2:"˪";s:3:"岩";s:2:"";s:3:"岫";s:2:"";s:3:"岬";s:2:"ˢ";s:3:"岱";s:2:"";s:3:"岳";s:2:"";s:3:"岵";s:2:"";s:3:"岷";s:2:"ھ";s:3:"岸";s:2:"";s:3:"岺";s:2:"ֹ";s:3:"岾";s:2:"";s:3:"峀";s:2:"";s:3:"峙";s:2:"";s:3:"峠";s:2:"";s:3:"峨";s:2:"";s:3:"峯";s:2:"";s:3:"峰";s:2:"";s:3:"峴";s:2:"";s:3:"島";s:2:"";s:3:"峻";s:2:"";s:3:"峽";s:2:"";s:3:"崇";s:2:"";s:3:"崍";s:2:"";s:3:"崎";s:2:"";s:3:"崑";s:2:"";s:3:"崔";s:2:"";s:3:"崖";s:2:"";s:3:"崗";s:2:"˫";s:3:"崙";s:2:"";s:3:"崧";s:2:"";s:3:"崩";s:2:"";s:3:"嵋";s:2:"ڮ";s:3:"嵌";s:2:"";s:3:"嵐";s:2:"չ";s:3:"嵩";s:2:"";s:3:"嵬";s:2:"";s:3:"嵯";s:2:"";s:3:"嶇";s:2:"ϩ";s:3:"嶋";s:2:"";s:3:"嶝";s:2:"";s:3:"嶠";s:2:"";s:3:"嶢";s:2:"";s:3:"嶪";s:2:"";s:3:"嶸";s:2:"";s:3:"嶺";s:2:"ֺ";s:3:"嶼";s:2:"";s:3:"嶽";s:2:"";s:3:"巍";s:2:"";s:3:"巒";s:2:"ص";s:3:"巖";s:2:"";s:3:"川";s:2:"";s:3:"州";s:2:"";s:3:"巡";s:2:"";s:3:"巢";s:2:"";s:3:"工";s:2:"";s:3:"左";s:2:"";s:3:"巧";s:2:"";s:3:"巨";s:2:"";s:3:"巫";s:2:"";s:3:"差";s:2:"";s:3:"己";s:2:"";s:3:"已";s:2:"";s:3:"巳";s:2:"";s:3:"巴";s:2:"";s:3:"巷";s:2:"";s:3:"巽";s:2:"";s:3:"巾";s:2:"";s:3:"市";s:2:"";s:3:"布";s:2:"";s:3:"帆";s:2:"";s:3:"希";s:2:"";s:3:"帑";s:2:"";s:3:"帖";s:2:"";s:3:"帙";s:2:"";s:3:"帛";s:2:"";s:3:"帝";s:2:"";s:3:"帥";s:2:"";s:3:"師";s:2:"";s:3:"席";s:2:"";s:3:"帳";s:2:"";s:3:"帶";s:2:"";s:3:"常";s:2:"";s:3:"帽";s:2:"ٶ";s:3:"帿";s:2:"";s:3:"幀";s:2:"";s:3:"幄";s:2:"";s:3:"幅";s:2:"";s:3:"幇";s:2:"۬";s:3:"幌";s:2:"";s:3:"幕";s:2:"ح";s:3:"幟";s:2:"";s:3:"幡";s:2:"";s:3:"幢";s:2:"";s:3:"幣";s:2:"";s:3:"干";s:2:"";s:3:"平";s:2:"";s:3:"年";s:2:"Ҵ";s:3:"幷";s:2:"ܴ";s:3:"幸";s:2:"";s:3:"幹";s:2:"";s:3:"幻";s:2:"";s:3:"幼";s:2:"";s:3:"幽";s:2:"";s:3:"幾";s:2:"";s:3:"庄";s:2:"";s:3:"庇";s:2:"";s:3:"床";s:2:"";s:3:"序";s:2:"";s:3:"底";s:2:"";s:3:"店";s:2:"";s:3:"庚";s:2:"";s:3:"府";s:2:"ݤ";s:3:"庠";s:2:"";s:3:"度";s:2:"";s:3:"座";s:2:"";s:3:"庫";s:2:"ͷ";s:3:"庭";s:2:"";s:3:"庵";s:2:"";s:3:"庶";s:2:"";s:3:"康";s:2:"ˬ";s:3:"庸";s:2:"";s:3:"庾";s:2:"";s:3:"廂";s:2:"";s:3:"廈";s:2:"";s:3:"廉";s:2:"֯";s:3:"廊";s:2:"";s:3:"廐";s:2:"Ϫ";s:3:"廓";s:2:"Ω";s:3:"廖";s:2:"";s:3:"廚";s:2:"";s:3:"廛";s:2:"";s:3:"廟";s:2:"";s:3:"廠";s:2:"";s:3:"廢";s:2:"";s:3:"廣";s:2:"";s:3:"廬";s:2:"";s:3:"廳";s:2:"";s:3:"延";s:2:"";s:3:"廷";s:2:"";s:3:"建";s:2:"";s:3:"廻";s:2:"";s:3:"弁";s:2:"ܧ";s:3:"弄";s:2:"";s:3:"弊";s:2:"";s:3:"式";s:2:"";s:3:"弑";s:2:"";s:3:"弓";s:2:"";s:3:"弔";s:2:"";s:3:"引";s:2:"";s:3:"弗";s:2:"";s:3:"弘";s:2:"";s:3:"弛";s:2:"";s:3:"弟";s:2:"";s:3:"弦";s:2:"";s:3:"弧";s:2:"";s:3:"弩";s:2:"";s:3:"弱";s:2:"";s:3:"張";s:2:"";s:3:"强";s:2:"˭";s:3:"弼";s:2:"";s:3:"彈";s:2:"";s:3:"彊";s:2:"ˮ";s:3:"彌";s:2:"گ";s:3:"彎";s:2:"ض";s:3:"彖";s:2:"ӧ";s:3:"彗";s:2:"";s:3:"彙";s:2:"";s:3:"彛";s:2:"";s:3:"形";s:2:"";s:3:"彦";s:2:"";s:3:"彧";s:2:"";s:3:"彩";s:2:"";s:3:"彪";s:2:"";s:3:"彫";s:2:"";s:3:"彬";s:2:"ޯ";s:3:"彭";s:2:"";s:3:"彰";s:2:"";s:3:"影";s:2:"";s:3:"彷";s:2:"ۭ";s:3:"役";s:2:"";s:3:"彼";s:2:"";s:3:"彿";s:2:"";s:3:"往";s:2:"";s:3:"征";s:2:"";s:3:"待";s:2:"";s:3:"徇";s:2:"";s:3:"徊";s:2:"";s:3:"律";s:2:"";s:3:"後";s:2:"";s:3:"徐";s:2:"";s:3:"徑";s:2:"";s:3:"徒";s:2:"";s:3:"得";s:2:"";s:3:"徘";s:2:"";s:3:"徙";s:2:"";s:3:"從";s:2:"";s:3:"徠";s:2:"";s:3:"御";s:2:"";s:3:"徨";s:2:"";s:3:"復";s:2:"";s:3:"循";s:2:"";s:3:"微";s:2:"ڰ";s:3:"徵";s:2:"";s:3:"德";s:2:"";s:3:"徹";s:2:"";s:3:"徽";s:2:"";s:3:"心";s:2:"";s:3:"必";s:2:"";s:3:"忌";s:2:"";s:3:"忍";s:2:"";s:3:"忖";s:2:"";s:3:"志";s:2:"";s:3:"忘";s:2:"";s:3:"忙";s:2:"";s:3:"忠";s:2:"";s:3:"快";s:2:"";s:3:"念";s:2:"ҷ";s:3:"忽";s:2:"";s:3:"忿";s:2:"";s:3:"怏";s:2:"";s:3:"怒";s:2:"";s:3:"怖";s:2:"";s:3:"怜";s:2:"ֻ";s:3:"思";s:2:"";s:3:"怠";s:2:"";s:3:"怡";s:2:"";s:3:"急";s:2:"";s:3:"性";s:2:"";s:3:"怨";s:2:"";s:3:"怪";s:2:"";s:3:"怯";s:2:"̥";s:3:"恁";s:2:"";s:3:"恂";s:2:"";s:3:"恃";s:2:"";s:3:"恍";s:2:"";s:3:"恐";s:2:"";s:3:"恒";s:2:"";s:3:"恕";s:2:"";s:3:"恙";s:2:"";s:3:"恝";s:2:"ο";s:3:"恢";s:2:"";s:3:"恣";s:2:"";s:3:"恤";s:2:"";s:3:"恥";s:2:"";s:3:"恨";s:2:"";s:3:"恩";s:2:"";s:3:"恪";s:2:"";s:3:"恬";s:2:"Ҹ";s:3:"恭";s:2:"";s:3:"息";s:2:"";s:3:"恰";s:2:"";s:3:"悅";s:2:"";s:3:"悉";s:2:"";s:3:"悌";s:2:"";s:3:"悍";s:2:"";s:3:"悔";s:2:"";s:3:"悖";s:2:"";s:3:"悚";s:2:"";s:3:"悛";s:2:"";s:3:"悟";s:2:"";s:3:"悠";s:2:"";s:3:"患";s:2:"";s:3:"悤";s:2:"";s:3:"悧";s:2:"";s:3:"悰";s:2:"";s:3:"悲";s:2:"";s:3:"悳";s:2:"";s:3:"悴";s:2:"";s:3:"悶";s:2:"ڿ";s:3:"悸";s:2:"";s:3:"悼";s:2:"";s:3:"悽";s:2:"";s:3:"情";s:2:"";s:3:"惇";s:2:"";s:3:"惑";s:2:"";s:3:"惚";s:2:"";s:3:"惜";s:2:"";s:3:"惟";s:2:"";s:3:"惠";s:2:"";s:3:"惡";s:2:"";s:3:"惰";s:2:"";s:3:"惱";s:2:"";s:3:"想";s:2:"";s:3:"惶";s:2:"";s:3:"惹";s:2:"";s:3:"惺";s:2:"";s:3:"惻";s:2:"";s:3:"愁";s:2:"";s:3:"愆";s:2:"";s:3:"愈";s:2:"";s:3:"愉";s:2:"";s:3:"愍";s:2:"";s:3:"愎";s:2:"";s:3:"意";s:2:"";s:3:"愕";s:2:"";s:3:"愚";s:2:"";s:3:"愛";s:2:"";s:3:"感";s:2:"";s:3:"愧";s:2:"";s:3:"愰";s:2:"";s:3:"愴";s:2:"";s:3:"愷";s:2:"";s:3:"愼";s:2:"";s:3:"愾";s:2:"";s:3:"愿";s:2:"";s:3:"慂";s:2:"";s:3:"慄";s:2:"";s:3:"慇";s:2:"";s:3:"慈";s:2:"";s:3:"慊";s:2:"";s:3:"態";s:2:"";s:3:"慌";s:2:"";s:3:"慓";s:2:"";s:3:"慕";s:2:"ٷ";s:3:"慘";s:2:"";s:3:"慙";s:2:"";s:3:"慝";s:2:"";s:3:"慟";s:2:"";s:3:"慢";s:2:"ط";s:3:"慣";s:2:"α";s:3:"慤";s:2:"";s:3:"慧";s:2:"";s:3:"慨";s:2:"";s:3:"慫";s:2:"";s:3:"慮";s:2:"";s:3:"慰";s:2:"";s:3:"慶";s:2:"";s:3:"慷";s:2:"˯";s:3:"慽";s:2:"";s:3:"慾";s:2:"";s:3:"憁";s:2:"";s:3:"憂";s:2:"";s:3:"憊";s:2:"";s:3:"憎";s:2:"";s:3:"憐";s:2:"";s:3:"憑";s:2:"޻";s:3:"憔";s:2:"";s:3:"憘";s:2:"";s:3:"憙";s:2:"";s:3:"憚";s:2:"";s:3:"憤";s:2:"";s:3:"憧";s:2:"";s:3:"憩";s:2:"̨";s:3:"憫";s:2:"";s:3:"憬";s:2:"";s:3:"憮";s:2:"";s:3:"憲";s:2:"";s:3:"憶";s:2:"";s:3:"憺";s:2:"Ӽ";s:3:"憾";s:2:"";s:3:"懃";s:2:"";s:3:"懇";s:2:"";s:3:"懈";s:2:"";s:3:"應";s:2:"";s:3:"懊";s:2:"";s:3:"懋";s:2:"";s:3:"懦";s:2:"";s:3:"懲";s:2:"";s:3:"懶";s:2:"";s:3:"懷";s:2:"";s:3:"懸";s:2:"";s:3:"懺";s:2:"";s:3:"懼";s:2:"ϫ";s:3:"懿";s:2:"";s:3:"戀";s:2:"";s:3:"戇";s:2:"";s:3:"戈";s:2:"";s:3:"戊";s:2:"";s:3:"戌";s:2:"";s:3:"戍";s:2:"";s:3:"戎";s:2:"";s:3:"成";s:2:"";s:3:"我";s:2:"";s:3:"戒";s:2:"";s:3:"或";s:2:"";s:3:"戚";s:2:"";s:3:"戟";s:2:"н";s:3:"戡";s:2:"";s:3:"截";s:2:"";s:3:"戮";s:2:"";s:3:"戰";s:2:"";s:3:"戱";s:2:"";s:3:"戴";s:2:"";s:3:"戶";s:2:"";s:3:"戾";s:2:"";s:3:"房";s:2:"ۮ";s:3:"所";s:2:"";s:3:"扁";s:2:"";s:3:"扇";s:2:"";s:3:"扈";s:2:"";s:3:"扉";s:2:"";s:3:"手";s:2:"";s:3:"才";s:2:"";s:3:"打";s:2:"";s:3:"托";s:2:"";s:3:"扮";s:2:"";s:3:"扱";s:2:"";s:3:"扶";s:2:"ݦ";s:3:"批";s:2:"";s:3:"扼";s:2:"";s:3:"承";s:2:"";s:3:"技";s:2:"";s:3:"抄";s:2:"";s:3:"抉";s:2:"̼";s:3:"把";s:2:"";s:3:"抑";s:2:"";s:3:"抒";s:2:"";s:3:"投";s:2:"";s:3:"抗";s:2:"";s:3:"折";s:2:"";s:3:"抛";s:2:"";s:3:"披";s:2:"";s:3:"抱";s:2:"";s:3:"抵";s:2:"";s:3:"抹";s:2:"";s:3:"押";s:2:"";s:3:"抽";s:2:"";s:3:"拂";s:2:"";s:3:"拇";s:2:"";s:3:"拈";s:2:"ҹ";s:3:"拉";s:2:"";s:3:"拌";s:2:"";s:3:"拍";s:2:"";s:3:"拏";s:2:"";s:3:"拐";s:2:"";s:3:"拒";s:2:"";s:3:"拓";s:2:"";s:3:"拔";s:2:"";s:3:"拖";s:2:"";s:3:"拗";s:2:"";s:3:"拘";s:2:"Ϭ";s:3:"拙";s:2:"";s:3:"招";s:2:"";s:3:"拜";s:2:"";s:3:"括";s:2:"";s:3:"拭";s:2:"";s:3:"拮";s:2:"";s:3:"拯";s:2:"";s:3:"拱";s:2:"";s:3:"拳";s:2:"";s:3:"拷";s:2:"͸";s:3:"拾";s:2:"";s:3:"拿";s:2:"";s:3:"持";s:2:"";s:3:"指";s:2:"";s:3:"按";s:2:"";s:3:"挑";s:2:"";s:3:"挫";s:2:"";s:3:"振";s:2:"";s:3:"挺";s:2:"";s:3:"挻";s:2:"";s:3:"挽";s:2:"ظ";s:3:"挾";s:2:"";s:3:"捉";s:2:"";s:3:"捌";s:2:"";s:3:"捏";s:2:"";s:3:"捐";s:2:"";s:3:"捕";s:2:"";s:3:"捧";s:2:"";s:3:"捨";s:2:"";s:3:"据";s:2:"";s:3:"捲";s:2:"";s:3:"捷";s:2:"";s:3:"捺";s:2:"";s:3:"捻";s:2:"Һ";s:3:"捿";s:2:"";s:3:"掃";s:2:"";s:3:"授";s:2:"";s:3:"掉";s:2:"";s:3:"掌";s:2:"";s:3:"排";s:2:"";s:3:"掖";s:2:"";s:3:"掘";s:2:"";s:3:"掛";s:2:"";s:3:"掠";s:2:"";s:3:"採";s:2:"";s:3:"探";s:2:"";s:3:"接";s:2:"";s:3:"控";s:2:"";s:3:"推";s:2:"";s:3:"掩";s:2:"";s:3:"措";s:2:"";s:3:"揀";s:2:"";s:3:"揄";s:2:"";s:3:"揆";s:2:"Ц";s:3:"描";s:2:"";s:3:"提";s:2:"";s:3:"揖";s:2:"";s:3:"揚";s:2:"";s:3:"換";s:2:"";s:3:"握";s:2:"";s:3:"揭";s:2:"̩";s:3:"揮";s:2:"";s:3:"援";s:2:"";s:3:"揶";s:2:"";s:3:"揷";s:2:"ߺ";s:3:"損";s:2:"";s:3:"搏";s:2:"";s:3:"搔";s:2:"";s:3:"搖";s:2:"";s:3:"搗";s:2:"";s:3:"搜";s:2:"";s:3:"搢";s:2:"";s:3:"搬";s:2:"";s:3:"搭";s:2:"";s:3:"携";s:2:"";s:3:"搾";s:2:"";s:3:"摘";s:2:"";s:3:"摠";s:2:"";s:3:"摩";s:2:"ؤ";s:3:"摯";s:2:"";s:3:"摸";s:2:"ٸ";s:3:"摹";s:2:"ٹ";s:3:"摺";s:2:"";s:3:"撈";s:2:"";s:3:"撑";s:2:"";s:3:"撒";s:2:"߮";s:3:"撓";s:2:"";s:3:"撚";s:2:"ҵ";s:3:"撞";s:2:"";s:3:"撤";s:2:"";s:3:"撥";s:2:"";s:3:"撫";s:2:"";s:3:"播";s:2:"";s:3:"撮";s:2:"";s:3:"撰";s:2:"";s:3:"撲";s:2:"";s:3:"撻";s:2:"ӵ";s:3:"擁";s:2:"";s:3:"擄";s:2:"";s:3:"擅";s:2:"";s:3:"擇";s:2:"";s:3:"擊";s:2:"̪";s:3:"操";s:2:"";s:3:"擎";s:2:"";s:3:"擒";s:2:"";s:3:"擔";s:2:"ӽ";s:3:"擘";s:2:"";s:3:"據";s:2:"";s:3:"擡";s:2:"";s:3:"擢";s:2:"";s:3:"擥";s:2:"պ";s:3:"擦";s:2:"";s:3:"擧";s:2:"";s:3:"擬";s:2:"";s:3:"擲";s:2:"";s:3:"擴";s:2:"";s:3:"擺";s:2:"";s:3:"擾";s:2:"";s:3:"攀";s:2:"";s:3:"攄";s:2:"";s:3:"攘";s:2:"";s:3:"攝";s:2:"";s:3:"攣";s:2:"";s:3:"攪";s:2:"";s:3:"攫";s:2:"";s:3:"攬";s:2:"ջ";s:3:"支";s:2:"";s:3:"收";s:2:"";s:3:"攷";s:2:"͹";s:3:"攸";s:2:"";s:3:"改";s:2:"";s:3:"攻";s:2:"";s:3:"放";s:2:"ۯ";s:3:"政";s:2:"";s:3:"故";s:2:"ͺ";s:3:"效";s:2:"";s:3:"敍";s:2:"";s:3:"敎";s:2:"";s:3:"敏";s:2:"";s:3:"救";s:2:"ϭ";s:3:"敖";s:2:"";s:3:"敗";s:2:"";s:3:"敞";s:2:"";s:3:"敢";s:2:"";s:3:"散";s:2:"ߤ";s:3:"敦";s:2:"";s:3:"敬";s:2:"";s:3:"敭";s:2:"";s:3:"敲";s:2:"ͻ";s:3:"整";s:2:"";s:3:"敵";s:2:"";s:3:"敷";s:2:"ݧ";s:3:"數";s:2:"";s:3:"敾";s:2:"";s:3:"斂";s:2:"ְ";s:3:"斃";s:2:"";s:3:"斅";s:2:"";s:3:"文";s:2:"";s:3:"斌";s:2:"ް";s:3:"斐";s:2:"";s:3:"斑";s:2:"";s:3:"斗";s:2:"";s:3:"料";s:2:"";s:3:"斛";s:2:"";s:3:"斜";s:2:"";s:3:"斟";s:2:"";s:3:"斡";s:2:"";s:3:"斤";s:2:"";s:3:"斥";s:2:"";s:3:"斧";s:2:"ݨ";s:3:"斫";s:2:"";s:3:"斬";s:2:"";s:3:"斯";s:2:"";s:3:"新";s:2:"";s:3:"斷";s:2:"Ө";s:3:"方";s:2:"۰";s:3:"於";s:2:"";s:3:"施";s:2:"";s:3:"旁";s:2:"۱";s:3:"旅";s:2:"";s:3:"旋";s:2:"";s:3:"旌";s:2:"";s:3:"族";s:2:"";s:3:"旒";s:2:"ײ";s:3:"旗";s:2:"";s:3:"无";s:2:"";s:3:"旣";s:2:"";s:3:"日";s:2:"";s:3:"旦";s:2:"ө";s:3:"旨";s:2:"";s:3:"早";s:2:"";s:3:"旬";s:2:"";s:3:"旭";s:2:"";s:3:"旱";s:2:"";s:3:"旴";s:2:"";s:3:"旺";s:2:"";s:3:"旻";s:2:"";s:3:"旼";s:2:"";s:3:"旽";s:2:"";s:3:"旿";s:2:"";s:3:"昆";s:2:"";s:3:"昇";s:2:"";s:3:"昉";s:2:"۲";s:3:"昊";s:2:"";s:3:"昌";s:2:"";s:3:"明";s:2:"٥";s:3:"昏";s:2:"";s:3:"昐";s:2:"";s:3:"昑";s:2:"";s:3:"易";s:2:"";s:3:"昔";s:2:"";s:3:"昕";s:2:"";s:3:"昞";s:2:"ܵ";s:3:"星";s:2:"";s:3:"映";s:2:"";s:3:"春";s:2:"";s:3:"昧";s:2:"";s:3:"昨";s:2:"";s:3:"昭";s:2:"";s:3:"是";s:2:"";s:3:"昰";s:2:"";s:3:"昱";s:2:"";s:3:"昴";s:2:"";s:3:"昶";s:2:"";s:3:"昺";s:2:"ܶ";s:3:"昻";s:2:"";s:3:"晁";s:2:"";s:3:"時";s:2:"";s:3:"晃";s:2:"";s:3:"晄";s:2:"";s:3:"晉";s:2:"";s:3:"晋";s:2:"";s:3:"晏";s:2:"";s:3:"晙";s:2:"";s:3:"晛";s:2:"";s:3:"晝";s:2:"";s:3:"晞";s:2:"";s:3:"晟";s:2:"";s:3:"晤";s:2:"";s:3:"晥";s:2:"";s:3:"晦";s:2:"";s:3:"晧";s:2:"";s:3:"晨";s:2:"";s:3:"晩";s:2:"ع";s:3:"晫";s:2:"";s:3:"普";s:2:"";s:3:"景";s:2:"";s:3:"晳";s:2:"";s:3:"晴";s:2:"";s:3:"晶";s:2:"";s:3:"晷";s:2:"";s:3:"晸";s:2:"";s:3:"智";s:2:"";s:3:"暄";s:2:"";s:3:"暇";s:2:"ʬ";s:3:"暈";s:2:"";s:3:"暉";s:2:"";s:3:"暎";s:2:"";s:3:"暐";s:2:"";s:3:"暑";s:2:"";s:3:"暖";s:2:"";s:3:"暗";s:2:"";s:3:"暘";s:2:"";s:3:"暝";s:2:"٦";s:3:"暠";s:2:"ͼ";s:3:"暢";s:2:"";s:3:"暫";s:2:"";s:3:"暮";s:2:"ٺ";s:3:"暲";s:2:"";s:3:"暳";s:2:"";s:3:"暴";s:2:"";s:3:"暹";s:2:"";s:3:"暻";s:2:"";s:3:"暾";s:2:"";s:3:"曄";s:2:"";s:3:"曆";s:2:"";s:3:"曇";s:2:"Ӿ";s:3:"曉";s:2:"";s:3:"曖";s:2:"";s:3:"曙";s:2:"";s:3:"曜";s:2:"";s:3:"曝";s:2:"";s:3:"曠";s:2:"";s:3:"曦";s:2:"";s:3:"曰";s:2:"";s:3:"曲";s:2:"";s:3:"曳";s:2:"";s:3:"更";s:2:"";s:3:"曷";s:2:"";s:3:"書";s:2:"";s:3:"曹";s:2:"";s:3:"曺";s:2:"";s:3:"曼";s:2:"غ";s:3:"曾";s:2:"";s:3:"替";s:2:"";s:3:"最";s:2:"";s:3:"會";s:2:"";s:3:"月";s:2:"";s:3:"有";s:2:"";s:3:"朋";s:2:"";s:3:"服";s:2:"";s:3:"朔";s:2:"";s:3:"朕";s:2:"";s:3:"朗";s:2:"";s:3:"望";s:2:"";s:3:"朝";s:2:"";s:3:"朞";s:2:"ѡ";s:3:"期";s:2:"Ѣ";s:3:"朦";s:2:"";s:3:"朧";s:2:"";s:3:"木";s:2:"";s:3:"未";s:2:"ڱ";s:3:"末";s:2:"";s:3:"本";s:2:"";s:3:"札";s:2:"";s:3:"朮";s:2:"";s:3:"朱";s:2:"";s:3:"朴";s:2:"";s:3:"朶";s:2:"";s:3:"机";s:2:"";s:3:"朽";s:2:"";s:3:"杆";s:2:"";s:3:"杉";s:2:"ߴ";s:3:"李";s:2:"";s:3:"杏";s:2:"";s:3:"材";s:2:"";s:3:"村";s:2:"";s:3:"杓";s:2:"";s:3:"杖";s:2:"";s:3:"杜";s:2:"";s:3:"杞";s:2:"ѣ";s:3:"束";s:2:"";s:3:"杭";s:2:"";s:3:"杯";s:2:"";s:3:"杰";s:2:"";s:3:"東";s:2:"";s:3:"杳";s:2:"";s:3:"杵";s:2:"";s:3:"杷";s:2:"";s:3:"杻";s:2:"";s:3:"松";s:2:"";s:3:"板";s:2:"";s:3:"枇";s:2:"";s:3:"枉";s:2:"";s:3:"枋";s:2:"۳";s:3:"枏";s:2:"";s:3:"析";s:2:"";s:3:"枓";s:2:"";s:3:"枕";s:2:"";s:3:"林";s:2:"";s:3:"枚";s:2:"";s:3:"果";s:2:"";s:3:"枝";s:2:"";s:3:"枯";s:2:"ͽ";s:3:"枰";s:2:"";s:3:"枳";s:2:"";s:3:"架";s:2:"ʭ";s:3:"枷";s:2:"ʮ";s:3:"枸";s:2:"Ϯ";s:3:"枾";s:2:"";s:3:"柄";s:2:"ܷ";s:3:"柏";s:2:"";s:3:"某";s:2:"ٻ";s:3:"柑";s:2:"";s:3:"柒";s:2:"";s:3:"染";s:2:"";s:3:"柔";s:2:"";s:3:"柚";s:2:"";s:3:"柝";s:2:"";s:3:"柩";s:2:"ϯ";s:3:"柬";s:2:"";s:3:"柯";s:2:"ʯ";s:3:"柰";s:2:"Ұ";s:3:"柱";s:2:"";s:3:"柳";s:2:"׳";s:3:"柴";s:2:"";s:3:"柵";s:2:"";s:3:"柶";s:2:"";s:3:"査";s:2:"";s:3:"柾";s:2:"";s:3:"栒";s:2:"";s:3:"栓";s:2:"";s:3:"栖";s:2:"";s:3:"栗";s:2:"";s:3:"校";s:2:"";s:3:"栢";s:2:"";s:3:"株";s:2:"";s:3:"栯";s:2:"";s:3:"核";s:2:"";s:3:"根";s:2:"";s:3:"格";s:2:"̫";s:3:"栽";s:2:"";s:3:"桀";s:2:"";s:3:"桁";s:2:"";s:3:"桂";s:2:"";s:3:"桃";s:2:"";s:3:"案";s:2:"";s:3:"桎";s:2:"";s:3:"桐";s:2:"";s:3:"桑";s:2:"";s:3:"桓";s:2:"";s:3:"桔";s:2:"";s:3:"桭";s:2:"";s:3:"桶";s:2:"";s:3:"桿";s:2:"";s:3:"梁";s:2:"";s:3:"梅";s:2:"";s:3:"梏";s:2:"";s:3:"梓";s:2:"";s:3:"梔";s:2:"";s:3:"梗";s:2:"";s:3:"條";s:2:"";s:3:"梟";s:2:"";s:3:"梡";s:2:"";s:3:"梢";s:2:"";s:3:"梧";s:2:"";s:3:"梨";s:2:"";s:3:"梭";s:2:"";s:3:"梯";s:2:"";s:3:"械";s:2:"";s:3:"梱";s:2:"";s:3:"梳";s:2:"";s:3:"梵";s:2:"";s:3:"梶";s:2:"ڲ";s:3:"棄";s:2:"ѥ";s:3:"棅";s:2:"ܸ";s:3:"棉";s:2:"";s:3:"棋";s:2:"Ѥ";s:3:"棍";s:2:"";s:3:"棒";s:2:"";s:3:"棕";s:2:"";s:3:"棗";s:2:"";s:3:"棘";s:2:"о";s:3:"棚";s:2:"";s:3:"棟";s:2:"";s:3:"棠";s:2:"";s:3:"棧";s:2:"";s:3:"棨";s:2:"͡";s:3:"森";s:2:"ߵ";s:3:"棲";s:2:"";s:3:"棹";s:2:"ԡ";s:3:"棺";s:2:"β";s:3:"椀";s:2:"";s:3:"椅";s:2:"";s:3:"植";s:2:"";s:3:"椎";s:2:"";s:3:"椒";s:2:"";s:3:"椧";s:2:"٧";s:3:"椰";s:2:"";s:3:"椽";s:2:"";s:3:"椿";s:2:"";s:3:"楊";s:2:"";s:3:"楓";s:2:"";s:3:"楔";s:2:"";s:3:"楕";s:2:"";s:3:"楗";s:2:"";s:3:"楙";s:2:"";s:3:"楚";s:2:"";s:3:"楞";s:2:"";s:3:"楠";s:2:"";s:3:"楡";s:2:"";s:3:"楢";s:2:"";s:3:"楣";s:2:"ڳ";s:3:"楨";s:2:"";s:3:"楫";s:2:"";s:3:"業";s:2:"";s:3:"楮";s:2:"";s:3:"楯";s:2:"";s:3:"極";s:2:"п";s:3:"楷";s:2:"";s:3:"楸";s:2:"";s:3:"楹";s:2:"";s:3:"榕";s:2:"";s:3:"榛";s:2:"";s:3:"榜";s:2:"۴";s:3:"榥";s:2:"";s:3:"榧";s:2:"";s:3:"榮";s:2:"";s:3:"榴";s:2:"״";s:3:"榻";s:2:"";s:3:"槁";s:2:";";s:3:"槃";s:2:"";s:3:"構";s:2:"ϰ";s:3:"槌";s:2:"";s:3:"槍";s:2:"";s:3:"槐";s:2:"";s:3:"槨";s:2:"Ϊ";s:3:"槪";s:2:"";s:3:"槻";s:2:"Ч";s:3:"槽";s:2:"";s:3:"槿";s:2:"";s:3:"樂";s:2:"";s:3:"樊";s:2:"";s:3:"樑";s:2:"";s:3:"樓";s:2:"ק";s:3:"樗";s:2:"";s:3:"標";s:2:"";s:3:"樞";s:2:"";s:3:"樟";s:2:"";s:3:"模";s:2:"ټ";s:3:"樣";s:2:"";s:3:"樵";s:2:"";s:3:"樸";s:2:"";s:3:"樹";s:2:"";s:3:"樺";s:2:"";s:3:"樽";s:2:"";s:3:"橄";s:2:"";s:3:"橈";s:2:"";s:3:"橋";s:2:"";s:3:"橒";s:2:"";s:3:"橓";s:2:"";s:3:"橘";s:2:"й";s:3:"橙";s:2:"";s:3:"機";s:2:"Ѧ";s:3:"橡";s:2:"";s:3:"橫";s:2:"";s:3:"檀";s:2:"Ӫ";s:3:"檄";s:2:"̬";s:3:"檉";s:2:"";s:3:"檍";s:2:"";s:3:"檎";s:2:"";s:3:"檗";s:2:"";s:3:"檜";s:2:"";s:3:"檢";s:2:"";s:3:"檣";s:2:"";s:3:"檳";s:2:"ޱ";s:3:"檻";s:2:"";s:3:"櫂";s:2:"Ԣ";s:3:"櫃";s:2:"";s:3:"櫓";s:2:"";s:3:"櫚";s:2:"";s:3:"櫛";s:2:"";s:3:"櫶";s:2:"";s:3:"櫻";s:2:"";s:3:"欄";s:2:"ձ";s:3:"權";s:2:"";s:3:"欌";s:2:"";s:3:"欒";s:2:"ղ";s:3:"欖";s:2:"ռ";s:3:"欠";s:2:"";s:3:"次";s:2:"";s:3:"欣";s:2:"";s:3:"欲";s:2:"";s:3:"欺";s:2:"ѧ";s:3:"欽";s:2:"";s:3:"款";s:2:"γ";s:3:"歆";s:2:"";s:3:"歇";s:2:"";s:3:"歌";s:2:"ʰ";s:3:"歎";s:2:"";s:3:"歐";s:2:"ϱ";s:3:"歟";s:2:"";s:3:"歡";s:2:"";s:3:"止";s:2:"";s:3:"正";s:2:"";s:3:"此";s:2:"";s:3:"步";s:2:"";s:3:"武";s:2:"";s:3:"歪";s:2:"";s:3:"歲";s:2:"";s:3:"歷";s:2:"";s:3:"歸";s:2:"";s:3:"死";s:2:"";s:3:"歿";s:2:"";s:3:"殃";s:2:"";s:3:"殄";s:2:"";s:3:"殆";s:2:"";s:3:"殉";s:2:"";s:3:"殊";s:2:"";s:3:"殖";s:2:"";s:3:"殘";s:2:"";s:3:"殞";s:2:"";s:3:"殮";s:2:"ֱ";s:3:"殯";s:2:"޲";s:3:"殲";s:2:"";s:3:"段";s:2:"ӫ";s:3:"殷";s:2:"";s:3:"殺";s:2:"߯";s:3:"殼";s:2:"";s:3:"殿";s:2:"";s:3:"毁";s:2:"";s:3:"毅";s:2:"";s:3:"毆";s:2:"ϲ";s:3:"毋";s:2:"";s:3:"母";s:2:"ٽ";s:3:"每";s:2:"";s:3:"毒";s:2:"Ը";s:3:"毓";s:2:"";s:3:"比";s:2:"";s:3:"毖";s:2:"";s:3:"毗";s:2:"";s:3:"毘";s:2:"";s:3:"毛";s:2:"پ";s:3:"毫";s:2:"";s:3:"毬";s:2:"ϳ";s:3:"氈";s:2:"";s:3:"氏";s:2:"";s:3:"民";s:2:"";s:3:"氓";s:2:"";s:3:"氣";s:2:"Ѩ";s:3:"水";s:2:"";s:3:"氷";s:2:"޼";s:3:"永";s:2:"";s:3:"氾";s:2:"";s:3:"汀";s:2:"";s:3:"汁";s:2:"";s:3:"求";s:2:"ϴ";s:3:"汎";s:2:"";s:3:"汐";s:2:"";s:3:"汕";s:2:"ߥ";s:3:"汗";s:2:"";s:3:"汚";s:2:"";s:3:"汝";s:2:"";s:3:"汞";s:2:"";s:3:"江";s:2:"˰";s:3:"池";s:2:"";s:3:"汨";s:2:"";s:3:"汪";s:2:"";s:3:"汭";s:2:"";s:3:"汰";s:2:"";s:3:"汲";s:2:"";s:3:"汶";s:2:"ڡ";s:3:"決";s:2:"̽";s:3:"汽";s:2:"ѩ";s:3:"汾";s:2:"";s:3:"沁";s:2:"";s:3:"沂";s:2:"Ѫ";s:3:"沃";s:2:"";s:3:"沅";s:2:"";s:3:"沆";s:2:"";s:3:"沇";s:2:"";s:3:"沈";s:2:"";s:3:"沌";s:2:"";s:3:"沐";s:2:"";s:3:"沒";s:2:"";s:3:"沓";s:2:"";s:3:"沔";s:2:"";s:3:"沕";s:2:"ک";s:3:"沖";s:2:"";s:3:"沙";s:2:"";s:3:"沚";s:2:"";s:3:"沛";s:2:"";s:3:"沫";s:2:"";s:3:"沮";s:2:"";s:3:"河";s:2:"";s:3:"沸";s:2:"";s:3:"油";s:2:"";s:3:"治";s:2:"";s:3:"沼";s:2:"";s:3:"沽";s:2:"Ϳ";s:3:"沾";s:2:"";s:3:"沿";s:2:"";s:3:"況";s:2:"";s:3:"泂";s:2:"";s:3:"泄";s:2:"";s:3:"泉";s:2:"";s:3:"泊";s:2:"";s:3:"泌";s:2:"";s:3:"泓";s:2:"";s:3:"法";s:2:"";s:3:"泗";s:2:"";s:3:"泛";s:2:"";s:3:"泡";s:2:"";s:3:"波";s:2:"";s:3:"泣";s:2:"";s:3:"泥";s:2:"";s:3:"注";s:2:"";s:3:"泫";s:2:"";s:3:"泮";s:2:"";s:3:"泯";s:2:"";s:3:"泰";s:2:"";s:3:"泳";s:2:"";s:3:"洋";s:2:"";s:3:"洌";s:2:"֬";s:3:"洑";s:2:"";s:3:"洗";s:2:"";s:3:"洙";s:2:"";s:3:"洛";s:2:"զ";s:3:"洞";s:2:"";s:3:"津";s:2:"";s:3:"洧";s:2:"";s:3:"洩";s:2:"";s:3:"洪";s:2:"";s:3:"洲";s:2:"";s:3:"洵";s:2:"";s:3:"洶";s:2:"";s:3:"洸";s:2:"";s:3:"洹";s:2:"";s:3:"活";s:2:"";s:3:"洽";s:2:"";s:3:"派";s:2:"";s:3:"流";s:2:"׵";s:3:"浙";s:2:"";s:3:"浚";s:2:"";s:3:"浜";s:2:"޳";s:3:"浣";s:2:"";s:3:"浦";s:2:"";s:3:"浩";s:2:"";s:3:"浪";s:2:"";s:3:"浬";s:2:"";s:3:"浮";s:2:"ݩ";s:3:"浴";s:2:"";s:3:"海";s:2:"";s:3:"浸";s:2:"";s:3:"浹";s:2:"";s:3:"浿";s:2:"";s:3:"涅";s:2:"";s:3:"涇";s:2:"";s:3:"消";s:2:"";s:3:"涉";s:2:"";s:3:"涌";s:2:"";s:3:"涍";s:2:"";s:3:"涎";s:2:"";s:3:"涑";s:2:"";s:3:"涓";s:2:"";s:3:"涕";s:2:"";s:3:"涯";s:2:"";s:3:"液";s:2:"";s:3:"涵";s:2:"";s:3:"淀";s:2:"";s:3:"淃";s:2:"";s:3:"淄";s:2:"";s:3:"淅";s:2:"";s:3:"淆";s:2:"";s:3:"淇";s:2:"ѫ";s:3:"淋";s:2:"";s:3:"淏";s:2:"";s:3:"淑";s:2:"";s:3:"淘";s:2:"ԣ";s:3:"淙";s:2:"";s:3:"淚";s:2:"ר";s:3:"淞";s:2:"";s:3:"淡";s:2:"ӿ";s:3:"淨";s:2:"";s:3:"淪";s:2:"";s:3:"淫";s:2:"";s:3:"淮";s:2:"";s:3:"深";s:2:"";s:3:"淳";s:2:"";s:3:"淵";s:2:"";s:3:"混";s:2:"";s:3:"淸";s:2:"";s:3:"淹";s:2:"";s:3:"淺";s:2:"";s:3:"添";s:2:"";s:3:"渗";s:2:"߶";s:3:"渙";s:2:"";s:3:"渚";s:2:"";s:3:"減";s:2:"";s:3:"渟";s:2:"";s:3:"渠";s:2:"";s:3:"渡";s:2:"Ԥ";s:3:"渣";s:2:"";s:3:"渤";s:2:"";s:3:"渥";s:2:"";s:3:"渦";s:2:"";s:3:"渫";s:2:"";s:3:"測";s:2:"";s:3:"渭";s:2:"";s:3:"港";s:2:"";s:3:"渲";s:2:"";s:3:"渴";s:2:"";s:3:"渶";s:2:"";s:3:"游";s:2:"";s:3:"渺";s:2:"";s:3:"渼";s:2:"ڴ";s:3:"渽";s:2:"";s:3:"渾";s:2:"";s:3:"湃";s:2:"";s:3:"湄";s:2:"ڵ";s:3:"湊";s:2:"";s:3:"湍";s:2:"Ӭ";s:3:"湖";s:2:"";s:3:"湘";s:2:"";s:3:"湛";s:2:"";s:3:"湜";s:2:"";s:3:"湞";s:2:"";s:3:"湟";s:2:"";s:3:"湧";s:2:"";s:3:"湫";s:2:"";s:3:"湮";s:2:"";s:3:"湯";s:2:"";s:3:"湲";s:2:"";s:3:"湳";s:2:"";s:3:"湺";s:2:"";s:3:"源";s:2:"";s:3:"準";s:2:"";s:3:"溜";s:2:"׶";s:3:"溝";s:2:"ϵ";s:3:"溟";s:2:"٨";s:3:"溢";s:2:"";s:3:"溥";s:2:"ݪ";s:3:"溪";s:2:"͢";s:3:"溫";s:2:"";s:3:"溯";s:2:"";s:3:"溱";s:2:"";s:3:"溶";s:2:"";s:3:"溺";s:2:"";s:3:"滂";s:2:"۵";s:3:"滄";s:2:"";s:3:"滅";s:2:"";s:3:"滉";s:2:"";s:3:"滋";s:2:"";s:3:"滌";s:2:"";s:3:"滎";s:2:"";s:3:"滑";s:2:"";s:3:"滓";s:2:"";s:3:"滔";s:2:"ԥ";s:3:"滯";s:2:"";s:3:"滴";s:2:"";s:3:"滸";s:2:"";s:3:"滾";s:2:"";s:3:"滿";s:2:"ػ";s:3:"漁";s:2:"";s:3:"漂";s:2:"";s:3:"漆";s:2:"";s:3:"漏";s:2:"ש";s:3:"漑";s:2:"";s:3:"演";s:2:"";s:3:"漕";s:2:"";s:3:"漠";s:2:"خ";s:3:"漢";s:2:"";s:3:"漣";s:2:"";s:3:"漫";s:2:"ؼ";s:3:"漬";s:2:"";s:3:"漱";s:2:"";s:3:"漲";s:2:"";s:3:"漸";s:2:"";s:3:"漿";s:2:"";s:3:"潁";s:2:"";s:3:"潑";s:2:"";s:3:"潔";s:2:"̾";s:3:"潗";s:2:"";s:3:"潘";s:2:"";s:3:"潚";s:2:"";s:3:"潛";s:2:"";s:3:"潞";s:2:"";s:3:"潟";s:2:"";s:3:"潢";s:2:"";s:3:"潤";s:2:"";s:3:"潭";s:2:"";s:3:"潮";s:2:"";s:3:"潰";s:2:"";s:3:"潺";s:2:"";s:3:"潼";s:2:"";s:3:"潽";s:2:"";s:3:"潾";s:2:"";s:3:"澁";s:2:"߻";s:3:"澄";s:2:"";s:3:"澈";s:2:"";s:3:"澍";s:2:"";s:3:"澎";s:2:"";s:3:"澐";s:2:"";s:3:"澔";s:2:"";s:3:"澗";s:2:"";s:3:"澣";s:2:"";s:3:"澤";s:2:"";s:3:"澧";s:2:"";s:3:"澮";s:2:"";s:3:"澯";s:2:"";s:3:"澱";s:2:"";s:3:"澳";s:2:"";s:3:"澹";s:2:"";s:3:"澾";s:2:"Ӷ";s:3:"激";s:2:"̭";s:3:"濁";s:2:"";s:3:"濂";s:2:"ֲ";s:3:"濃";s:2:"";s:3:"濊";s:2:"";s:3:"濕";s:2:"";s:3:"濚";s:2:"";s:3:"濟";s:2:"";s:3:"濠";s:2:"";s:3:"濡";s:2:"";s:3:"濤";s:2:"Ԧ";s:3:"濩";s:2:"";s:3:"濫";s:2:"ս";s:3:"濬";s:2:"";s:3:"濯";s:2:"";s:3:"濱";s:2:"޴";s:3:"濾";s:2:"";s:3:"瀁";s:2:"";s:3:"瀅";s:2:"";s:3:"瀆";s:2:"Թ";s:3:"瀉";s:2:"";s:3:"瀋";s:2:"";s:3:"瀏";s:2:"׷";s:3:"瀑";s:2:"";s:3:"瀕";s:2:"޵";s:3:"瀘";s:2:"";s:3:"瀚";s:2:"";s:3:"瀛";s:2:"";s:3:"瀜";s:2:"";s:3:"瀝";s:2:"";s:3:"瀞";s:2:"";s:3:"瀟";s:2:"";s:3:"瀣";s:2:"";s:3:"瀧";s:2:"";s:3:"瀨";s:2:"";s:3:"瀯";s:2:"";s:3:"瀷";s:2:"";s:3:"瀾";s:2:"ճ";s:3:"灌";s:2:"δ";s:3:"灐";s:2:"";s:3:"灑";s:2:"";s:3:"灘";s:2:"";s:3:"灝";s:2:"";s:3:"灣";s:2:"ؽ";s:3:"火";s:2:"";s:3:"灰";s:2:"";s:3:"灸";s:2:"϶";s:3:"灼";s:2:"";s:3:"災";s:2:"";s:3:"炅";s:2:"";s:3:"炊";s:2:"";s:3:"炎";s:2:"";s:3:"炒";s:2:"";s:3:"炘";s:2:"";s:3:"炙";s:2:"";s:3:"炚";s:2:"";s:3:"炡";s:2:"";s:3:"炤";s:2:"";s:3:"炫";s:2:"";s:3:"炬";s:2:"";s:3:"炭";s:2:"";s:3:"炯";s:2:"";s:3:"炳";s:2:"ܹ";s:3:"炷";s:2:"";s:3:"炸";s:2:"";s:3:"点";s:2:"";s:3:"烈";s:2:"֭";s:3:"烋";s:2:"";s:3:"烏";s:2:"";s:3:"烘";s:2:"";s:3:"烙";s:2:"է";s:3:"烝";s:2:"";s:3:"烟";s:2:"";s:3:"烱";s:2:"";s:3:"烹";s:2:"";s:3:"烽";s:2:"";s:3:"焄";s:2:"";s:3:"焉";s:2:"";s:3:"焌";s:2:"";s:3:"焙";s:2:"";s:3:"焚";s:2:"";s:3:"焞";s:2:"";s:3:"無";s:2:"";s:3:"焦";s:2:"";s:3:"焰";s:2:"";s:3:"然";s:2:"";s:3:"煇";s:2:"";s:3:"煉";s:2:"֡";s:3:"煊";s:2:"";s:3:"煌";s:2:"";s:3:"煎";s:2:"";s:3:"煐";s:2:"";s:3:"煖";s:2:"";s:3:"煙";s:2:"";s:3:"煜";s:2:"";s:3:"煞";s:2:"߰";s:3:"煤";s:2:"";s:3:"煥";s:2:"";s:3:"煦";s:2:"";s:3:"照";s:2:"";s:3:"煩";s:2:"";s:3:"煬";s:2:"";s:3:"煮";s:2:"";s:3:"煽";s:2:"";s:3:"熄";s:2:"";s:3:"熉";s:2:"";s:3:"熊";s:2:"";s:3:"熏";s:2:"";s:3:"熒";s:2:"";s:3:"熔";s:2:"";s:3:"熙";s:2:"";s:3:"熟";s:2:"";s:3:"熢";s:2:"";s:3:"熬";s:2:"";s:3:"熱";s:2:"";s:3:"熹";s:2:"";s:3:"熺";s:2:"";s:3:"熾";s:2:"";s:3:"燁";s:2:"";s:3:"燃";s:2:"";s:3:"燈";s:2:"";s:3:"燉";s:2:"";s:3:"燎";s:2:"";s:3:"燐";s:2:"";s:3:"燒";s:2:"";s:3:"燔";s:2:"";s:3:"燕";s:2:"";s:3:"營";s:2:"";s:3:"燥";s:2:"";s:3:"燦";s:2:"";s:3:"燧";s:2:"";s:3:"燭";s:2:"";s:3:"燮";s:2:"";s:3:"燻";s:2:"";s:3:"燼";s:2:"";s:3:"燾";s:2:"ԧ";s:3:"燿";s:2:"";s:3:"爀";s:2:"";s:3:"爆";s:2:"";s:3:"爐";s:2:"";s:3:"爛";s:2:"մ";s:3:"爪";s:2:"";s:3:"爬";s:2:"";s:3:"爭";s:2:"";s:3:"爰";s:2:"";s:3:"爲";s:2:"";s:3:"爵";s:2:"";s:3:"父";s:2:"ݫ";s:3:"爺";s:2:"";s:3:"爻";s:2:"";s:3:"爽";s:2:"";s:3:"爾";s:2:"";s:3:"牀";s:2:"";s:3:"牆";s:2:"";s:3:"片";s:2:"";s:3:"版";s:2:"";s:3:"牌";s:2:"";s:3:"牒";s:2:"";s:3:"牘";s:2:"Ժ";s:3:"牙";s:2:"";s:3:"牛";s:2:"";s:3:"牝";s:2:"޶";s:3:"牟";s:2:"ٿ";s:3:"牡";s:2:"";s:3:"牢";s:2:"";s:3:"牧";s:2:"";s:3:"物";s:2:"ڪ";s:3:"牲";s:2:"";s:3:"特";s:2:"";s:3:"牽";s:2:"̲";s:3:"犀";s:2:"";s:3:"犁";s:2:"";s:3:"犢";s:2:"Ի";s:3:"犧";s:2:"";s:3:"犬";s:2:"̳";s:3:"犯";s:2:"";s:3:"狀";s:2:"";s:3:"狂";s:2:"";s:3:"狄";s:2:"";s:3:"狎";s:2:"";s:3:"狐";s:2:"";s:3:"狗";s:2:"Ϸ";s:3:"狙";s:2:"";s:3:"狡";s:2:"";s:3:"狩";s:2:"";s:3:"狸";s:2:"";s:3:"狹";s:2:"";s:3:"狼";s:2:"";s:3:"狽";s:2:"";s:3:"猊";s:2:"";s:3:"猖";s:2:"";s:3:"猛";s:2:"";s:3:"猜";s:2:"";s:3:"猝";s:2:"";s:3:"猥";s:2:"";s:3:"猩";s:2:"";s:3:"猪";s:2:"";s:3:"猫";s:2:"";s:3:"猶";s:2:"";s:3:"猷";s:2:"";s:3:"猾";s:2:"";s:3:"猿";s:2:"";s:3:"獄";s:2:"";s:3:"獅";s:2:"";s:3:"獐";s:2:"";s:3:"獒";s:2:"";s:3:"獗";s:2:"";s:3:"獨";s:2:"Լ";s:3:"獪";s:2:"";s:3:"獰";s:2:"";s:3:"獲";s:2:"";s:3:"獵";s:2:"ִ";s:3:"獸";s:2:"";s:3:"獺";s:2:"ӷ";s:3:"獻";s:2:"";s:3:"玄";s:2:"";s:3:"玆";s:2:"";s:3:"率";s:2:"";s:3:"玉";s:2:"";s:3:"王";s:2:"";s:3:"玎";s:2:"";s:3:"玔";s:2:"";s:3:"玖";s:2:"ϸ";s:3:"玗";s:2:"";s:3:"玘";s:2:"Ѭ";s:3:"玟";s:2:"";s:3:"玧";s:2:"";s:3:"玩";s:2:"";s:3:"玭";s:2:"޷";s:3:"玲";s:2:"ּ";s:3:"玳";s:2:"";s:3:"玹";s:2:"";s:3:"珀";s:2:"";s:3:"珂";s:2:"ʱ";s:3:"珉";s:2:"";s:3:"珊";s:2:"ߦ";s:3:"珌";s:2:"";s:3:"珍";s:2:"";s:3:"珏";s:2:"";s:3:"珖";s:2:"";s:3:"珙";s:2:"";s:3:"珝";s:2:"";s:3:"珞";s:2:"ը";s:3:"珠";s:2:"";s:3:"珣";s:2:"";s:3:"珤";s:2:"";s:3:"珥";s:2:"";s:3:"珦";s:2:"";s:3:"珩";s:2:"";s:3:"珪";s:2:"Ш";s:3:"班";s:2:"";s:3:"珷";s:2:"";s:3:"珹";s:2:"";s:3:"珽";s:2:"";s:3:"現";s:2:"";s:3:"琁";s:2:"";s:3:"球";s:2:"Ϲ";s:3:"琅";s:2:"";s:3:"理";s:2:"";s:3:"琇";s:2:"";s:3:"琉";s:2:"׸";s:3:"琓";s:2:"";s:3:"琛";s:2:"";s:3:"琠";s:2:"";s:3:"琡";s:2:"";s:3:"琢";s:2:"";s:3:"琥";s:2:"";s:3:"琦";s:2:"ѭ";s:3:"琨";s:2:"";s:3:"琪";s:2:"Ѯ";s:3:"琫";s:2:"";s:3:"琬";s:2:"";s:3:"琮";s:2:"";s:3:"琯";s:2:"ε";s:3:"琰";s:2:"";s:3:"琳";s:2:"";s:3:"琴";s:2:"";s:3:"琵";s:2:"";s:3:"琶";s:2:"";s:3:"琸";s:2:"";s:3:"琺";s:2:"";s:3:"琿";s:2:"";s:3:"瑀";s:2:"";s:3:"瑁";s:2:"";s:3:"瑃";s:2:"";s:3:"瑄";s:2:"";s:3:"瑋";s:2:"";s:3:"瑕";s:2:"";s:3:"瑗";s:2:"";s:3:"瑙";s:2:"";s:3:"瑚";s:2:"";s:3:"瑛";s:2:"";s:3:"瑜";s:2:"";s:3:"瑞";s:2:"";s:3:"瑟";s:2:"";s:3:"瑠";s:2:"׹";s:3:"瑢";s:2:"";s:3:"瑤";s:2:"";s:3:"瑥";s:2:"";s:3:"瑨";s:2:"";s:3:"瑩";s:2:"";s:3:"瑪";s:2:"إ";s:3:"瑯";s:2:"";s:3:"瑾";s:2:"";s:3:"璂";s:2:"ѯ";s:3:"璃";s:2:"";s:3:"璇";s:2:"";s:3:"璉";s:2:"֢";s:3:"璋";s:2:"";s:3:"璘";s:2:"";s:3:"璜";s:2:"";s:3:"璞";s:2:"";s:3:"璟";s:2:"";s:3:"璡";s:2:"";s:3:"璣";s:2:"Ѱ";s:3:"璥";s:2:"";s:3:"璧";s:2:"";s:3:"璨";s:2:"";s:3:"璪";s:2:"";s:3:"環";s:2:"";s:3:"璲";s:2:"";s:3:"璵";s:2:"";s:3:"璹";s:2:"";s:3:"璽";s:2:"";s:3:"璿";s:2:"";s:3:"瓆";s:2:"";s:3:"瓊";s:2:"";s:3:"瓏";s:2:"";s:3:"瓔";s:2:"";s:3:"瓘";s:2:"ζ";s:3:"瓚";s:2:"";s:3:"瓜";s:2:"";s:3:"瓠";s:2:"";s:3:"瓢";s:2:"";s:3:"瓣";s:2:"";s:3:"瓦";s:2:"";s:3:"瓮";s:2:"";s:3:"瓷";s:2:"";s:3:"甁";s:2:"ܺ";s:3:"甄";s:2:"̴";s:3:"甑";s:2:"";s:3:"甕";s:2:"";s:3:"甘";s:2:"";s:3:"甚";s:2:"";s:3:"甛";s:2:"";s:3:"生";s:2:"";s:3:"産";s:2:"ߧ";s:3:"甥";s:2:"";s:3:"甦";s:2:"";s:3:"用";s:2:"";s:3:"甫";s:2:"";s:3:"甬";s:2:"";s:3:"田";s:2:"";s:3:"由";s:2:"";s:3:"甲";s:2:"ˣ";s:3:"申";s:2:"";s:3:"男";s:2:"";s:3:"甸";s:2:"";s:3:"町";s:2:"";s:3:"畇";s:2:"д";s:3:"界";s:2:"ͣ";s:3:"畏";s:2:"";s:3:"畑";s:2:"";s:3:"畓";s:2:"";s:3:"畔";s:2:"";s:3:"留";s:2:"׺";s:3:"畛";s:2:"";s:3:"畜";s:2:"";s:3:"畝";s:2:"";s:3:"畢";s:2:"";s:3:"略";s:2:"";s:3:"畦";s:2:"";s:3:"番";s:2:"";s:3:"畯";s:2:"";s:3:"異";s:2:"";s:3:"畵";s:2:"";s:3:"當";s:2:"";s:3:"畸";s:2:"ѱ";s:3:"畺";s:2:"˱";s:3:"畿";s:2:"Ѳ";s:3:"疆";s:2:"˲";s:3:"疇";s:2:"";s:3:"疊";s:2:"";s:3:"疋";s:2:"";s:3:"疎";s:2:"";s:3:"疏";s:2:"";s:3:"疑";s:2:"";s:3:"疝";s:2:"ߨ";s:3:"疥";s:2:"";s:3:"疫";s:2:"";s:3:"疱";s:2:"";s:3:"疲";s:2:"";s:3:"疳";s:2:"";s:3:"疵";s:2:"";s:3:"疸";s:2:"Ӹ";s:3:"疹";s:2:"";s:3:"疼";s:2:"";s:3:"疽";s:2:"";s:3:"疾";s:2:"";s:3:"痂";s:2:"ʲ";s:3:"病";s:2:"ܻ";s:3:"症";s:2:"";s:3:"痍";s:2:"";s:3:"痒";s:2:"";s:3:"痔";s:2:"";s:3:"痕";s:2:"";s:3:"痘";s:2:"";s:3:"痙";s:2:"";s:3:"痛";s:2:"";s:3:"痢";s:2:"";s:3:"痰";s:2:"";s:3:"痲";s:2:"ئ";s:3:"痴";s:2:"";s:3:"痺";s:2:"";s:3:"痼";s:2:"";s:3:"瘀";s:2:"";s:3:"瘍";s:2:"";s:3:"瘙";s:2:"";s:3:"瘟";s:2:"";s:3:"瘠";s:2:"";s:3:"瘡";s:2:"";s:3:"瘢";s:2:"";s:3:"瘤";s:2:"׻";s:3:"瘦";s:2:"";s:3:"瘻";s:2:"ת";s:3:"療";s:2:"";s:3:"癌";s:2:"";s:3:"癎";s:2:"";s:3:"癒";s:2:"";s:3:"癖";s:2:"";s:3:"癡";s:2:"";s:3:"癤";s:2:"";s:3:"癩";s:2:"";s:3:"癬";s:2:"";s:3:"癰";s:2:"";s:3:"癲";s:2:"";s:3:"癸";s:2:"ͤ";s:3:"登";s:2:"";s:3:"發";s:2:"ۡ";s:3:"白";s:2:"";s:3:"百";s:2:"";s:3:"的";s:2:"";s:3:"皆";s:2:"";s:3:"皇";s:2:"";s:3:"皎";s:2:"";s:3:"皐";s:2:"";s:3:"皓";s:2:"";s:3:"皮";s:2:"";s:3:"皺";s:2:"";s:3:"皿";s:2:"٩";s:3:"盂";s:2:"";s:3:"盃";s:2:"";s:3:"盆";s:2:"";s:3:"盈";s:2:"";s:3:"益";s:2:"";s:3:"盒";s:2:"";s:3:"盖";s:2:"";s:3:"盛";s:2:"";s:3:"盜";s:2:"Ԩ";s:3:"盞";s:2:"";s:3:"盟";s:2:"";s:3:"盡";s:2:"";s:3:"監";s:2:"";s:3:"盤";s:2:"";s:3:"盧";s:2:"";s:3:"目";s:2:"";s:3:"盲";s:2:"";s:3:"直";s:2:"";s:3:"相";s:2:"";s:3:"盼";s:2:"";s:3:"盾";s:2:"";s:3:"省";s:2:"";s:3:"眄";s:2:"";s:3:"眈";s:2:"";s:3:"眉";s:2:"ڶ";s:3:"看";s:2:"";s:3:"眞";s:2:"";s:3:"眠";s:2:"";s:3:"眩";s:2:"";s:3:"眷";s:2:"";s:3:"眸";s:2:"";s:3:"眺";s:2:"";s:3:"眼";s:2:"";s:3:"着";s:2:"";s:3:"睍";s:2:"";s:3:"睛";s:2:"";s:3:"睡";s:2:"";s:3:"督";s:2:"Խ";s:3:"睦";s:2:"";s:3:"睫";s:2:"";s:3:"睹";s:2:"ԩ";s:3:"睾";s:2:"";s:3:"睿";s:2:"";s:3:"瞋";s:2:"";s:3:"瞑";s:2:"٪";s:3:"瞞";s:2:"ؾ";s:3:"瞥";s:2:"ܭ";s:3:"瞬";s:2:"";s:3:"瞭";s:2:"";s:3:"瞰";s:2:"";s:3:"瞳";s:2:"";s:3:"瞻";s:2:"";s:3:"瞼";s:2:"̡";s:3:"瞿";s:2:"Ϻ";s:3:"矗";s:2:"";s:3:"矛";s:2:"";s:3:"矜";s:2:"";s:3:"矢";s:2:"";s:3:"矣";s:2:"";s:3:"知";s:2:"";s:3:"矩";s:2:"ϻ";s:3:"短";s:2:"ӭ";s:3:"矮";s:2:"";s:3:"矯";s:2:"";s:3:"石";s:2:"";s:3:"砂";s:2:"";s:3:"砒";s:2:"";s:3:"砥";s:2:"";s:3:"砦";s:2:"";s:3:"砧";s:2:"";s:3:"砬";s:2:"";s:3:"砲";s:2:"";s:3:"破";s:2:"";s:3:"硅";s:2:"Щ";s:3:"硏";s:2:"";s:3:"硝";s:2:"";s:3:"硫";s:2:"׼";s:3:"硬";s:2:"";s:3:"硯";s:2:"";s:3:"硼";s:2:"";s:3:"碁";s:2:"ѳ";s:3:"碇";s:2:"";s:3:"碌";s:2:"";s:3:"碍";s:2:"";s:3:"碎";s:2:"";s:3:"碑";s:2:"";s:3:"碗";s:2:"";s:3:"碣";s:2:"";s:3:"碧";s:2:"ܡ";s:3:"碩";s:2:"";s:3:"確";s:2:"";s:3:"碻";s:2:"";s:3:"碼";s:2:"ا";s:3:"磁";s:2:"";s:3:"磅";s:2:"۶";s:3:"磊";s:2:"";s:3:"磋";s:2:"";s:3:"磎";s:2:"ͥ";s:3:"磐";s:2:"";s:3:"磨";s:2:"ب";s:3:"磬";s:2:"";s:3:"磯";s:2:"Ѵ";s:3:"磵";s:2:"";s:3:"磻";s:2:"";s:3:"礁";s:2:"";s:3:"礎";s:2:"";s:3:"礖";s:2:"";s:3:"礪";s:2:"";s:3:"礫";s:2:"";s:3:"礬";s:2:"";s:3:"示";s:2:"";s:3:"社";s:2:"";s:3:"祀";s:2:"";s:3:"祁";s:2:"ѵ";s:3:"祇";s:2:"Ѷ";s:3:"祈";s:2:"ѷ";s:3:"祉";s:2:"";s:3:"祐";s:2:"";s:3:"祖";s:2:"";s:3:"祗";s:2:"";s:3:"祚";s:2:"";s:3:"祛";s:2:"";s:3:"祜";s:2:"";s:3:"祝";s:2:"";s:3:"神";s:2:"";s:3:"祠";s:2:"";s:3:"祥";s:2:"";s:3:"票";s:2:"";s:3:"祭";s:2:"";s:3:"祺";s:2:"Ѹ";s:3:"祿";s:2:"";s:3:"禁";s:2:"";s:3:"禍";s:2:"";s:3:"禎";s:2:"";s:3:"福";s:2:"";s:3:"禑";s:2:"";s:3:"禦";s:2:"";s:3:"禧";s:2:"";s:3:"禪";s:2:"";s:3:"禮";s:2:"";s:3:"禱";s:2:"Ԫ";s:3:"禳";s:2:"";s:3:"禹";s:2:"";s:3:"禽";s:2:"";s:3:"禾";s:2:"";s:3:"禿";s:2:"Ծ";s:3:"秀";s:2:"";s:3:"私";s:2:"";s:3:"秉";s:2:"ܼ";s:3:"秊";s:2:"Ҷ";s:3:"秋";s:2:"";s:3:"科";s:2:"Ρ";s:3:"秒";s:2:"";s:3:"秕";s:2:"";s:3:"秘";s:2:"";s:3:"租";s:2:"";s:3:"秤";s:2:"";s:3:"秦";s:2:"";s:3:"秧";s:2:"";s:3:"秩";s:2:"";s:3:"移";s:2:"";s:3:"稀";s:2:"";s:3:"稅";s:2:"";s:3:"稈";s:2:"";s:3:"程";s:2:"";s:3:"稍";s:2:"";s:3:"稔";s:2:"";s:3:"稗";s:2:"";s:3:"稙";s:2:"";s:3:"稚";s:2:"";s:3:"稜";s:2:"";s:3:"稟";s:2:"";s:3:"稠";s:2:"";s:3:"種";s:2:"";s:3:"稱";s:2:"";s:3:"稶";s:2:"";s:3:"稷";s:2:"";s:3:"稻";s:2:"ԫ";s:3:"稼";s:2:"ʳ";s:3:"稽";s:2:"ͦ";s:3:"稿";s:2:"";s:3:"穀";s:2:"";s:3:"穆";s:2:"";s:3:"穉";s:2:"";s:3:"積";s:2:"";s:3:"穎";s:2:"";s:3:"穗";s:2:"";s:3:"穡";s:2:"";s:3:"穢";s:2:"";s:3:"穩";s:2:"";s:3:"穫";s:2:"";s:3:"穰";s:2:"";s:3:"穴";s:2:"";s:3:"究";s:2:"ϼ";s:3:"穹";s:2:"";s:3:"空";s:2:"";s:3:"穽";s:2:"";s:3:"穿";s:2:"";s:3:"突";s:2:"";s:3:"窄";s:2:"";s:3:"窈";s:2:"";s:3:"窒";s:2:"";s:3:"窓";s:2:"";s:3:"窕";s:2:"";s:3:"窘";s:2:"";s:3:"窟";s:2:"";s:3:"窩";s:2:"";s:3:"窪";s:2:"";s:3:"窮";s:2:"";s:3:"窯";s:2:"";s:3:"窺";s:2:"Ъ";s:3:"竄";s:2:"";s:3:"竅";s:2:"Ы";s:3:"竇";s:2:"";s:3:"竊";s:2:"";s:3:"立";s:2:"ء";s:3:"竗";s:2:"";s:3:"站";s:2:"";s:3:"竝";s:2:"ܽ";s:3:"竟";s:2:"";s:3:"章";s:2:"";s:3:"竣";s:2:"";s:3:"童";s:2:"";s:3:"竪";s:2:"";s:3:"竭";s:2:"";s:3:"端";s:2:"Ӯ";s:3:"競";s:2:"";s:3:"竹";s:2:"";s:3:"竺";s:2:"";s:3:"竿";s:2:"";s:3:"笏";s:2:"";s:3:"笑";s:2:"";s:3:"笙";s:2:"";s:3:"笛";s:2:"";s:3:"笞";s:2:"";s:3:"笠";s:2:"آ";s:3:"符";s:2:"ݬ";s:3:"第";s:2:"";s:3:"笭";s:2:"ֽ";s:3:"笹";s:2:"";s:3:"筆";s:2:"";s:3:"等";s:2:"";s:3:"筋";s:2:"";s:3:"筌";s:2:"";s:3:"筍";s:2:"";s:3:"筏";s:2:"";s:3:"筐";s:2:"";s:3:"筑";s:2:"";s:3:"筒";s:2:"";s:3:"答";s:2:"";s:3:"策";s:2:"";s:3:"筠";s:2:"е";s:3:"筬";s:2:"";s:3:"筮";s:2:"";s:3:"筵";s:2:"";s:3:"筽";s:2:"";s:3:"箇";s:2:"";s:3:"箋";s:2:"";s:3:"箏";s:2:"";s:3:"箔";s:2:"";s:3:"箕";s:2:"ѹ";s:3:"算";s:2:"ߩ";s:3:"箚";s:2:"";s:3:"箝";s:2:"";s:3:"管";s:2:"η";s:3:"箭";s:2:"";s:3:"箱";s:2:"";s:3:"箴";s:2:"";s:3:"箸";s:2:"";s:3:"節";s:2:"";s:3:"篁";s:2:"";s:3:"範";s:2:"";s:3:"篆";s:2:"";s:3:"篇";s:2:"";s:3:"築";s:2:"";s:3:"篒";s:2:"";s:3:"篠";s:2:"";s:3:"篤";s:2:"Կ";s:3:"篩";s:2:"";s:3:"簇";s:2:"";s:3:"簒";s:2:"";s:3:"簞";s:2:"ӯ";s:3:"簡";s:2:"";s:3:"簧";s:2:"";s:3:"簪";s:2:"";s:3:"簫";s:2:"";s:3:"簽";s:2:"";s:3:"簾";s:2:"ֳ";s:3:"簿";s:2:"ݭ";s:3:"籃";s:2:"վ";s:3:"籌";s:2:"";s:3:"籍";s:2:"";s:3:"籠";s:2:"";s:3:"籤";s:2:"";s:3:"籬";s:2:"";s:3:"米";s:2:"ڷ";s:3:"粃";s:2:"";s:3:"粉";s:2:"";s:3:"粒";s:2:"أ";s:3:"粕";s:2:"";s:3:"粗";s:2:"";s:3:"粘";s:2:"";s:3:"粟";s:2:"";s:3:"粥";s:2:"";s:3:"粧";s:2:"";s:3:"粮";s:2:"";s:3:"粱";s:2:"";s:3:"粲";s:2:"";s:3:"粳";s:2:"";s:3:"粹";s:2:"";s:3:"精";s:2:"";s:3:"糊";s:2:"";s:3:"糖";s:2:"";s:3:"糞";s:2:"";s:3:"糟";s:2:"";s:3:"糠";s:2:"˳";s:3:"糧";s:2:"";s:3:"系";s:2:"ͧ";s:3:"糾";s:2:"Ь";s:3:"紀";s:2:"Ѻ";s:3:"紂";s:2:"";s:3:"約";s:2:"";s:3:"紅";s:2:"";s:3:"紆";s:2:"";s:3:"紇";s:2:"";s:3:"紈";s:2:"";s:3:"紊";s:2:"ڢ";s:3:"紋";s:2:"ڣ";s:3:"納";s:2:"ҡ";s:3:"紐";s:2:"";s:3:"純";s:2:"";s:3:"紗";s:2:"";s:3:"紘";s:2:"";s:3:"紙";s:2:"";s:3:"級";s:2:"";s:3:"紛";s:2:"";s:3:"素";s:2:"";s:3:"紡";s:2:"۷";s:3:"索";s:2:"";s:3:"紫";s:2:"";s:3:"紬";s:2:"";s:3:"紮";s:2:"";s:3:"累";s:2:"׫";s:3:"細";s:2:"";s:3:"紳";s:2:"";s:3:"紵";s:2:"";s:3:"紹";s:2:"";s:3:"紺";s:2:"";s:3:"終";s:2:"";s:3:"絃";s:2:"";s:3:"組";s:2:"";s:3:"絅";s:2:"";s:3:"絆";s:2:"";s:3:"結";s:2:"̿";s:3:"絞";s:2:"";s:3:"絡";s:2:"թ";s:3:"絢";s:2:"";s:3:"給";s:2:"";s:3:"絨";s:2:"";s:3:"絪";s:2:"";s:3:"絮";s:2:"";s:3:"統";s:2:"";s:3:"絲";s:2:"";s:3:"絳";s:2:"˴";s:3:"絶";s:2:"";s:3:"絹";s:2:"̵";s:3:"絿";s:2:"Ͻ";s:3:"綎";s:2:"";s:3:"綏";s:2:"";s:3:"經";s:2:"";s:3:"綜";s:2:"";s:3:"綠";s:2:"";s:3:"綢";s:2:"";s:3:"綬";s:2:"";s:3:"維";s:2:"";s:3:"綱";s:2:"˵";s:3:"網";s:2:"";s:3:"綴";s:2:"";s:3:"綵";s:2:"";s:3:"綸";s:2:"";s:3:"綺";s:2:"ѻ";s:3:"綻";s:2:"";s:3:"綽";s:2:"";s:3:"綾";s:2:"";s:3:"綿";s:2:"";s:3:"緇";s:2:"";s:3:"緊";s:2:"";s:3:"緋";s:2:"";s:3:"緖";s:2:"";s:3:"緘";s:2:"";s:3:"線";s:2:"";s:3:"緝";s:2:"";s:3:"緞";s:2:"Ӱ";s:3:"締";s:2:"";s:3:"緡";s:2:"";s:3:"緣";s:2:"";s:3:"編";s:2:"";s:3:"緩";s:2:"";s:3:"緬";s:2:"";s:3:"緯";s:2:"";s:3:"練";s:2:"֣";s:3:"緻";s:2:"";s:3:"縉";s:2:"";s:3:"縊";s:2:"";s:3:"縕";s:2:"";s:3:"縛";s:2:"";s:3:"縝";s:2:"";s:3:"縞";s:2:"";s:3:"縟";s:2:"";s:3:"縡";s:2:"";s:3:"縣";s:2:"";s:3:"縫";s:2:"";s:3:"縮";s:2:"";s:3:"縯";s:2:"";s:3:"縱";s:2:"";s:3:"縷";s:2:"׬";s:3:"總";s:2:"";s:3:"績";s:2:"";s:3:"繁";s:2:"";s:3:"繃";s:2:"";s:3:"繆";s:2:"";s:3:"繇";s:2:"";s:3:"繒";s:2:"";s:3:"織";s:2:"";s:3:"繕";s:2:"";s:3:"繞";s:2:"";s:3:"繡";s:2:"";s:3:"繩";s:2:"";s:3:"繪";s:2:"";s:3:"繫";s:2:"ͨ";s:3:"繭";s:2:"̶";s:3:"繰";s:2:"";s:3:"繹";s:2:"";s:3:"繼";s:2:"ͩ";s:3:"纂";s:2:"";s:3:"續";s:2:"";s:3:"纏";s:2:"";s:3:"纓";s:2:"";s:3:"纖";s:2:"";s:3:"纘";s:2:"";s:3:"纛";s:2:"";s:3:"纜";s:2:"տ";s:3:"缶";s:2:"ݮ";s:3:"缸";s:2:"";s:3:"缺";s:2:"";s:3:"罌";s:2:"";s:3:"罐";s:2:"θ";s:3:"罔";s:2:"";s:3:"罕";s:2:"";s:3:"罪";s:2:"";s:3:"罫";s:2:"";s:3:"置";s:2:"";s:3:"罰";s:2:"";s:3:"署";s:2:"";s:3:"罵";s:2:"";s:3:"罷";s:2:"";s:3:"罹";s:2:"";s:3:"羅";s:2:"";s:3:"羈";s:2:"Ѽ";s:3:"羊";s:2:"";s:3:"羌";s:2:"˶";s:3:"美";s:2:"ڸ";s:3:"羔";s:2:"";s:3:"羚";s:2:"־";s:3:"羞";s:2:"";s:3:"群";s:2:"";s:3:"羨";s:2:"";s:3:"義";s:2:"";s:3:"羲";s:2:"";s:3:"羸";s:2:"";s:3:"羹";s:2:"";s:3:"羽";s:2:"";s:3:"翁";s:2:"";s:3:"翅";s:2:"";s:3:"翊";s:2:"";s:3:"翌";s:2:"";s:3:"翎";s:2:"ֿ";s:3:"習";s:2:"";s:3:"翔";s:2:"";s:3:"翕";s:2:"";s:3:"翟";s:2:"";s:3:"翠";s:2:"";s:3:"翡";s:2:"";s:3:"翩";s:2:"";s:3:"翫";s:2:"";s:3:"翰";s:2:"";s:3:"翹";s:2:"";s:3:"翼";s:2:"";s:3:"耀";s:2:"";s:3:"老";s:2:"";s:3:"考";s:2:"";s:3:"者";s:2:"";s:3:"耆";s:2:"ѽ";s:3:"耉";s:2:"Ͼ";s:3:"而";s:2:"";s:3:"耐";s:2:"ұ";s:3:"耕";s:2:"";s:3:"耗";s:2:"";s:3:"耘";s:2:"";s:3:"耭";s:2:"Ѿ";s:3:"耳";s:2:"";s:3:"耶";s:2:"";s:3:"耽";s:2:"";s:3:"耿";s:2:"";s:3:"聃";s:2:"";s:3:"聆";s:2:"";s:3:"聊";s:2:"";s:3:"聖";s:2:"";s:3:"聘";s:2:"޽";s:3:"聚";s:2:"";s:3:"聞";s:2:"ڤ";s:3:"聯";s:2:"֤";s:3:"聰";s:2:"";s:3:"聲";s:2:"";s:3:"聳";s:2:"";s:3:"職";s:2:"";s:3:"聽";s:2:"";s:3:"聾";s:2:"";s:3:"聿";s:2:"";s:3:"肄";s:2:"";s:3:"肅";s:2:"";s:3:"肆";s:2:"";s:3:"肇";s:2:"";s:3:"肉";s:2:"";s:3:"肋";s:2:"";s:3:"肌";s:2:"ѿ";s:3:"肖";s:2:"";s:3:"肛";s:2:"";s:3:"肝";s:2:"";s:3:"股";s:2:"";s:3:"肢";s:2:"";s:3:"肥";s:2:"";s:3:"肩";s:2:"̷";s:3:"肪";s:2:"۸";s:3:"肯";s:2:"";s:3:"肱";s:2:"";s:3:"育";s:2:"";s:3:"肴";s:2:"";s:3:"肺";s:2:"";s:3:"胃";s:2:"";s:3:"胄";s:2:"";s:3:"背";s:2:"";s:3:"胎";s:2:"";s:3:"胚";s:2:"";s:3:"胛";s:2:"ˤ";s:3:"胞";s:2:"";s:3:"胡";s:2:"";s:3:"胤";s:2:"";s:3:"胥";s:2:"";s:3:"胱";s:2:"";s:3:"胴";s:2:"";s:3:"胸";s:2:"";s:3:"能";s:2:"";s:3:"脂";s:2:"";s:3:"脅";s:2:"";s:3:"脆";s:2:"";s:3:"脇";s:2:"";s:3:"脈";s:2:"";s:3:"脊";s:2:"";s:3:"脘";s:2:"";s:3:"脚";s:2:"";s:3:"脛";s:2:"";s:3:"脣";s:2:"";s:3:"脩";s:2:"";s:3:"脫";s:2:"";s:3:"脯";s:2:"";s:3:"脹";s:2:"";s:3:"脾";s:2:"ޡ";s:3:"腋";s:2:"";s:3:"腎";s:2:"";s:3:"腐";s:2:"ݯ";s:3:"腑";s:2:"ݰ";s:3:"腔";s:2:"˷";s:3:"腕";s:2:"";s:3:"腥";s:2:"";s:3:"腦";s:2:"";s:3:"腫";s:2:"";s:3:"腰";s:2:"";s:3:"腱";s:2:"";s:3:"腸";s:2:"";s:3:"腹";s:2:"";s:3:"腺";s:2:"";s:3:"腿";s:2:"";s:3:"膀";s:2:"۹";s:3:"膈";s:2:"̮";s:3:"膊";s:2:"";s:3:"膏";s:2:"";s:3:"膚";s:2:"ݱ";s:3:"膜";s:2:"د";s:3:"膝";s:2:"";s:3:"膠";s:2:"";s:3:"膣";s:2:"";s:3:"膨";s:2:"";s:3:"膳";s:2:"";s:3:"膵";s:2:"";s:3:"膺";s:2:"";s:3:"膽";s:2:"";s:3:"膾";s:2:"";s:3:"膿";s:2:"";s:3:"臀";s:2:"";s:3:"臂";s:2:"ޢ";s:3:"臆";s:2:"";s:3:"臍";s:2:"";s:3:"臘";s:2:"";s:3:"臟";s:2:"";s:3:"臣";s:2:"";s:3:"臥";s:2:"";s:3:"臧";s:2:"";s:3:"臨";s:2:"";s:3:"自";s:2:"";s:3:"臭";s:2:"";s:3:"至";s:2:"";s:3:"致";s:2:"";s:3:"臺";s:2:"";s:3:"臻";s:2:"";s:3:"臼";s:2:"Ͽ";s:3:"臾";s:2:"";s:3:"舅";s:2:"";s:3:"與";s:2:"";s:3:"興";s:2:"";s:3:"舊";s:2:"";s:3:"舌";s:2:"";s:3:"舍";s:2:"";s:3:"舒";s:2:"";s:3:"舛";s:2:"";s:3:"舜";s:2:"";s:3:"舞";s:2:"";s:3:"舟";s:2:"";s:3:"舡";s:2:"˸";s:3:"航";s:2:"";s:3:"舫";s:2:"ۺ";s:3:"般";s:2:"";s:3:"舵";s:2:"";s:3:"舶";s:2:"";s:3:"舷";s:2:"";s:3:"船";s:2:"";s:3:"艀";s:2:"ݲ";s:3:"艅";s:2:"";s:3:"艇";s:2:"";s:3:"艙";s:2:"";s:3:"艤";s:2:"";s:3:"艦";s:2:"";s:3:"艮";s:2:"";s:3:"良";s:2:"";s:3:"艱";s:2:"";s:3:"色";s:2:"";s:3:"艶";s:2:"";s:3:"艸";s:2:"";s:3:"艾";s:2:"";s:3:"芋";s:2:"";s:3:"芍";s:2:"";s:3:"芎";s:2:"";s:3:"芒";s:2:"";s:3:"芙";s:2:"ݳ";s:3:"芚";s:2:"";s:3:"芝";s:2:"";s:3:"芟";s:2:"߷";s:3:"芥";s:2:"";s:3:"芦";s:2:"";s:3:"芩";s:2:"";s:3:"芬";s:2:"";s:3:"芭";s:2:"";s:3:"芮";s:2:"";s:3:"芯";s:2:"";s:3:"花";s:2:"";s:3:"芳";s:2:"ۻ";s:3:"芷";s:2:"";s:3:"芸";s:2:"";s:3:"芹";s:2:"";s:3:"芻";s:2:"";s:3:"芼";s:2:"";s:3:"芽";s:2:"";s:3:"芿";s:2:"";s:3:"苑";s:2:"";s:3:"苒";s:2:"";s:3:"苔";s:2:"";s:3:"苕";s:2:"";s:3:"苗";s:2:"";s:3:"苛";s:2:"ʴ";s:3:"苞";s:2:"";s:3:"苟";s:2:"";s:3:"苡";s:2:"";s:3:"若";s:2:"";s:3:"苦";s:2:"";s:3:"苧";s:2:"";s:3:"英";s:2:"";s:3:"苽";s:2:"";s:3:"苾";s:2:"";s:3:"茁";s:2:"";s:3:"茂";s:2:"";s:3:"范";s:2:"";s:3:"茄";s:2:"ʵ";s:3:"茅";s:2:"";s:3:"茉";s:2:"";s:3:"茗";s:2:"٫";s:3:"茨";s:2:"";s:3:"茫";s:2:"";s:3:"茯";s:2:"";s:3:"茱";s:2:"";s:3:"茴";s:2:"";s:3:"茵";s:2:"";s:3:"茶";s:2:"";s:3:"茸";s:2:"";s:3:"茹";s:2:"";s:3:"荀";s:2:"";s:3:"荇";s:2:"";s:3:"草";s:2:"";s:3:"荊";s:2:"";s:3:"荏";s:2:"";s:3:"荑";s:2:"";s:3:"荒";s:2:"";s:3:"荳";s:2:"";s:3:"荷";s:2:"";s:3:"荻";s:2:"";s:3:"莉";s:2:"";s:3:"莊";s:2:"";s:3:"莎";s:2:"";s:3:"莖";s:2:"";s:3:"莘";s:2:"";s:3:"莞";s:2:"";s:3:"莢";s:2:"";s:3:"莩";s:2:"ݴ";s:3:"莪";s:2:"";s:3:"莫";s:2:"ذ";s:3:"莽";s:2:"";s:3:"菁";s:2:"";s:3:"菅";s:2:"ι";s:3:"菉";s:2:"";s:3:"菊";s:2:"";s:3:"菌";s:2:"ж";s:3:"菓";s:2:"΢";s:3:"菖";s:2:"";s:3:"菜";s:2:"";s:3:"菩";s:2:"";s:3:"菫";s:2:"";s:3:"華";s:2:"";s:3:"菰";s:2:"";s:3:"菱";s:2:"";s:3:"菲";s:2:"ޣ";s:3:"菴";s:2:"";s:3:"菹";s:2:"";s:3:"菽";s:2:"";s:3:"萃";s:2:"";s:3:"萄";s:2:"Ԭ";s:3:"萊";s:2:"";s:3:"萌";s:2:"";s:3:"萍";s:2:"";s:3:"萎";s:2:"";s:3:"萩";s:2:"";s:3:"萬";s:2:"ؿ";s:3:"萱";s:2:"";s:3:"萸";s:2:"";s:3:"落";s:2:"ժ";s:3:"葉";s:2:"";s:3:"著";s:2:"";s:3:"葛";s:2:"";s:3:"葡";s:2:"";s:3:"董";s:2:"";s:3:"葦";s:2:"";s:3:"葫";s:2:"";s:3:"葬";s:2:"";s:3:"葯";s:2:"";s:3:"葵";s:2:"Э";s:3:"葺";s:2:"";s:3:"蒐";s:2:"";s:3:"蒔";s:2:"";s:3:"蒙";s:2:"";s:3:"蒜";s:2:"ߪ";s:3:"蒡";s:2:"ۼ";s:3:"蒲";s:2:"";s:3:"蒸";s:2:"";s:3:"蒻";s:2:"";s:3:"蒼";s:2:"";s:3:"蒿";s:2:"";s:3:"蓀";s:2:"";s:3:"蓂";s:2:"٬";s:3:"蓄";s:2:"";s:3:"蓆";s:2:"";s:3:"蓉";s:2:"";s:3:"蓋";s:2:"";s:3:"蓍";s:2:"";s:3:"蓑";s:2:"";s:3:"蓚";s:2:"";s:3:"蓬";s:2:"";s:3:"蓮";s:2:"֥";s:3:"蓴";s:2:"";s:3:"蓼";s:2:"";s:3:"蔑";s:2:"١";s:3:"蔓";s:2:"";s:3:"蔔";s:2:"";s:3:"蔗";s:2:"";s:3:"蔘";s:2:"߸";s:3:"蔚";s:2:"";s:3:"蔞";s:2:"׭";s:3:"蔡";s:2:"";s:3:"蔣";s:2:"";s:3:"蔥";s:2:"";s:3:"蔬";s:2:"";s:3:"蔭";s:2:"";s:3:"蔯";s:2:"";s:3:"蔽";s:2:"";s:3:"蔿";s:2:"";s:3:"蕁";s:2:"";s:3:"蕃";s:2:"";s:3:"蕉";s:2:"";s:3:"蕎";s:2:"";s:3:"蕓";s:2:"";s:3:"蕙";s:2:"";s:3:"蕣";s:2:"";s:3:"蕨";s:2:"";s:3:"蕩";s:2:"";s:3:"蕪";s:2:"";s:3:"蕭";s:2:"";s:3:"薄";s:2:"";s:3:"薇";s:2:"ڹ";s:3:"薏";s:2:"";s:3:"薑";s:2:"˹";s:3:"薔";s:2:"";s:3:"薛";s:2:"";s:3:"薦";s:2:"";s:3:"薨";s:2:"";s:3:"薩";s:2:"߱";s:3:"薪";s:2:"";s:3:"薯";s:2:"";s:3:"薰";s:2:"";s:3:"薺";s:2:"";s:3:"藁";s:2:"";s:3:"藉";s:2:"";s:3:"藍";s:2:"";s:3:"藎";s:2:"";s:3:"藏";s:2:"";s:3:"藕";s:2:"";s:3:"藜";s:2:"";s:3:"藝";s:2:"";s:3:"藤";s:2:"";s:3:"藥";s:2:"";s:3:"藩";s:2:"";s:3:"藪";s:2:"";s:3:"藷";s:2:"";s:3:"藺";s:2:"";s:3:"藻";s:2:"";s:3:"藿";s:2:"Ϋ";s:3:"蘂";s:2:"";s:3:"蘆";s:2:"";s:3:"蘇";s:2:"";s:3:"蘊";s:2:"";s:3:"蘖";s:2:"";s:3:"蘗";s:2:"ܢ";s:3:"蘚";s:2:"";s:3:"蘭";s:2:"յ";s:3:"蘿";s:2:"ա";s:3:"虎";s:2:"";s:3:"虐";s:2:"";s:3:"虔";s:2:"";s:3:"處";s:2:"";s:3:"虛";s:2:"";s:3:"虜";s:2:"";s:3:"虞";s:2:"";s:3:"號";s:2:"";s:3:"虧";s:2:"";s:3:"虹";s:2:"";s:3:"蚊";s:2:"ڥ";s:3:"蚌";s:2:"۽";s:3:"蚓";s:2:"";s:3:"蚣";s:2:"";s:3:"蚤";s:2:"";s:3:"蚩";s:2:"";s:3:"蛇";s:2:"";s:3:"蛋";s:2:"ӱ";s:3:"蛔";s:2:"";s:3:"蛙";s:2:"";s:3:"蛛";s:2:"";s:3:"蛟";s:2:"";s:3:"蛤";s:2:"";s:3:"蛭";s:2:"";s:3:"蛾";s:2:"";s:3:"蜀";s:2:"";s:3:"蜂";s:2:"";s:3:"蜃";s:2:"";s:3:"蜈";s:2:"";s:3:"蜘";s:2:"";s:3:"蜚";s:2:"ޤ";s:3:"蜜";s:2:"";s:3:"蝎";s:2:"";s:3:"蝕";s:2:"";s:3:"蝗";s:2:"";s:3:"蝟";s:2:"";s:3:"蝦";s:2:"";s:3:"蝨";s:2:"";s:3:"蝴";s:2:"";s:3:"蝶";s:2:"";s:3:"蝸";s:2:"";s:3:"螂";s:2:"";s:3:"融";s:2:"";s:3:"螟";s:2:"٭";s:3:"螢";s:2:"";s:3:"螳";s:2:"";s:3:"螺";s:2:"բ";s:3:"蟄";s:2:"";s:3:"蟠";s:2:"";s:3:"蟬";s:2:"";s:3:"蟯";s:2:"";s:3:"蟲";s:2:"";s:3:"蟹";s:2:"";s:3:"蟻";s:2:"";s:3:"蟾";s:2:"";s:3:"蠅";s:2:"";s:3:"蠟";s:2:"";s:3:"蠢";s:2:"";s:3:"蠣";s:2:"";s:3:"蠱";s:2:"";s:3:"蠶";s:2:"";s:3:"蠻";s:2:"";s:3:"血";s:2:"";s:3:"衆";s:2:"";s:3:"行";s:2:"";s:3:"衍";s:2:"";s:3:"衒";s:2:"";s:3:"術";s:2:"";s:3:"街";s:2:"ʶ";s:3:"衙";s:2:"";s:3:"衛";s:2:"";s:3:"衝";s:2:"";s:3:"衡";s:2:"";s:3:"衢";s:2:"";s:3:"衣";s:2:"";s:3:"表";s:2:"";s:3:"衫";s:2:"߹";s:3:"衰";s:2:"";s:3:"衲";s:2:"Ҥ";s:3:"衷";s:2:"";s:3:"衾";s:2:"";s:3:"衿";s:2:"";s:3:"袁";s:2:"";s:3:"袂";s:2:"ٱ";s:3:"袈";s:2:"ʷ";s:3:"袋";s:2:"";s:3:"袍";s:2:"";s:3:"袒";s:2:"Ӳ";s:3:"袖";s:2:"";s:3:"袗";s:2:"";s:3:"袞";s:2:"";s:3:"被";s:2:"";s:3:"袴";s:2:"";s:3:"裁";s:2:"";s:3:"裂";s:2:"֮";s:3:"裏";s:2:"";s:3:"裔";s:2:"";s:3:"裕";s:2:"";s:3:"裙";s:2:"";s:3:"補";s:2:"";s:3:"裝";s:2:"";s:3:"裟";s:2:"";s:3:"裡";s:2:"";s:3:"裨";s:2:"ޥ";s:3:"裳";s:2:"";s:3:"裴";s:2:"";s:3:"裵";s:2:"";s:3:"裸";s:2:"գ";s:3:"製";s:2:"";s:3:"複";s:2:"";s:3:"褐";s:2:"";s:3:"褒";s:2:"";s:3:"褓";s:2:"";s:3:"褘";s:2:"";s:3:"褙";s:2:"";s:3:"褥";s:2:"";s:3:"褪";s:2:"";s:3:"褶";s:2:"";s:3:"褸";s:2:"׮";s:3:"褻";s:2:"";s:3:"襁";s:2:"˺";s:3:"襄";s:2:"";s:3:"襟";s:2:"";s:3:"襤";s:2:"";s:3:"襪";s:2:"";s:3:"襲";s:2:"";s:3:"西";s:2:"";s:3:"要";s:2:"";s:3:"覃";s:2:"";s:3:"覆";s:2:"";s:3:"覇";s:2:"";s:3:"見";s:2:"̸";s:3:"規";s:2:"Ю";s:3:"覓";s:2:"";s:3:"視";s:2:"";s:3:"覡";s:2:"̯";s:3:"覩";s:2:"ԭ";s:3:"親";s:2:"";s:3:"覲";s:2:"";s:3:"覺";s:2:"";s:3:"覽";s:2:"";s:3:"觀";s:2:"κ";s:3:"角";s:2:"";s:3:"解";s:2:"";s:3:"觴";s:2:"";s:3:"觸";s:2:"";s:3:"言";s:2:"";s:3:"訂";s:2:"";s:3:"訃";s:2:"ݵ";s:3:"計";s:2:"ͪ";s:3:"訊";s:2:"";s:3:"訌";s:2:"";s:3:"討";s:2:"";s:3:"訓";s:2:"";s:3:"訖";s:2:"";s:3:"託";s:2:"";s:3:"記";s:2:"";s:3:"訛";s:2:"";s:3:"訝";s:2:"";s:3:"訟";s:2:"";s:3:"訣";s:2:"";s:3:"訥";s:2:"";s:3:"訪";s:2:"۾";s:3:"設";s:2:"";s:3:"許";s:2:"";s:3:"訴";s:2:"";s:3:"訶";s:2:"ʸ";s:3:"診";s:2:"";s:3:"註";s:2:"";s:3:"詐";s:2:"";s:3:"詔";s:2:"";s:3:"評";s:2:"";s:3:"詛";s:2:"";s:3:"詞";s:2:"";s:3:"詠";s:2:"";s:3:"詢";s:2:"";s:3:"詣";s:2:"";s:3:"試";s:2:"";s:3:"詩";s:2:"";s:3:"詭";s:2:"";s:3:"詮";s:2:"";s:3:"詰";s:2:"";s:3:"話";s:2:"";s:3:"該";s:2:"";s:3:"詳";s:2:"";s:3:"詵";s:2:"";s:3:"詹";s:2:"";s:3:"誅";s:2:"";s:3:"誇";s:2:"Σ";s:3:"誌";s:2:"";s:3:"認";s:2:"";s:3:"誓";s:2:"";s:3:"誕";s:2:"";s:3:"誘";s:2:"";s:3:"語";s:2:"";s:3:"誠";s:2:"";s:3:"誡";s:2:"ͫ";s:3:"誣";s:2:"";s:3:"誤";s:2:"";s:3:"誥";s:2:"";s:3:"誦";s:2:"";s:3:"誨";s:2:"";s:3:"說";s:2:"";s:3:"誰";s:2:"";s:3:"課";s:2:"Τ";s:3:"誹";s:2:"ަ";s:3:"誼";s:2:"";s:3:"誾";s:2:"";s:3:"調";s:2:"";s:3:"諂";s:2:"";s:3:"諄";s:2:"";s:3:"談";s:2:"";s:3:"請";s:2:"";s:3:"諍";s:2:"";s:3:"諏";s:2:"";s:3:"諒";s:2:"";s:3:"論";s:2:"";s:3:"諛";s:2:"";s:3:"諜";s:2:"";s:3:"諡";s:2:"";s:3:"諦";s:2:"";s:3:"諧";s:2:"";s:3:"諪";s:2:"";s:3:"諫";s:2:"";s:3:"諭";s:2:"";s:3:"諮";s:2:"";s:3:"諱";s:2:"";s:3:"諶";s:2:"";s:3:"諷";s:2:"";s:3:"諸";s:2:"";s:3:"諺";s:2:"";s:3:"諾";s:2:"";s:3:"謀";s:2:"";s:3:"謁";s:2:"";s:3:"謂";s:2:"";s:3:"謄";s:2:"";s:3:"謎";s:2:"ں";s:3:"謐";s:2:"";s:3:"謔";s:2:"";s:3:"謖";s:2:"";s:3:"謗";s:2:"ۿ";s:3:"謙";s:2:"";s:3:"謚";s:2:"";s:3:"講";s:2:"˻";s:3:"謝";s:2:"";s:3:"謠";s:2:"";s:3:"謨";s:2:"";s:3:"謫";s:2:"";s:3:"謬";s:2:"׽";s:3:"謳";s:2:"";s:3:"謹";s:2:"";s:3:"譁";s:2:"";s:3:"證";s:2:"";s:3:"譎";s:2:"";s:3:"譏";s:2:"";s:3:"識";s:2:"";s:3:"譚";s:2:"";s:3:"譜";s:2:"";s:3:"警";s:2:"";s:3:"譬";s:2:"ާ";s:3:"譯";s:2:"";s:3:"議";s:2:"";s:3:"譴";s:2:"̹";s:3:"護";s:2:"";s:3:"譽";s:2:"";s:3:"讀";s:2:"";s:3:"變";s:2:"ܨ";s:3:"讐";s:2:"";s:3:"讒";s:2:"";s:3:"讓";s:2:"";s:3:"讖";s:2:"";s:3:"讚";s:2:"";s:3:"谷";s:2:"";s:3:"谿";s:2:"ͬ";s:3:"豁";s:2:"";s:3:"豆";s:2:"";s:3:"豈";s:2:"";s:3:"豊";s:2:"";s:3:"豌";s:2:"";s:3:"豕";s:2:"";s:3:"豚";s:2:"";s:3:"象";s:2:"";s:3:"豪";s:2:"";s:3:"豫";s:2:"";s:3:"豹";s:2:"";s:3:"豺";s:2:"";s:3:"貂";s:2:"";s:3:"貊";s:2:"";s:3:"貌";s:2:"";s:3:"貝";s:2:"";s:3:"貞";s:2:"";s:3:"負";s:2:"ݶ";s:3:"財";s:2:"";s:3:"貢";s:2:"";s:3:"貧";s:2:"޸";s:3:"貨";s:2:"";s:3:"販";s:2:"";s:3:"貪";s:2:"";s:3:"貫";s:2:"λ";s:3:"責";s:2:"";s:3:"貯";s:2:"";s:3:"貰";s:2:"";s:3:"貳";s:2:"";s:3:"貴";s:2:"";s:3:"貶";s:2:"";s:3:"買";s:2:"";s:3:"貸";s:2:"";s:3:"費";s:2:"ި";s:3:"貼";s:2:"";s:3:"貽";s:2:"";s:3:"貿";s:2:"";s:3:"賀";s:2:"";s:3:"賁";s:2:"";s:3:"賂";s:2:"";s:3:"賃";s:2:"";s:3:"賄";s:2:"";s:3:"資";s:2:"";s:3:"賈";s:2:"ʹ";s:3:"賊";s:2:"";s:3:"賑";s:2:"";s:3:"賓";s:2:"޹";s:3:"賚";s:2:"";s:3:"賜";s:2:"";s:3:"賞";s:2:"";s:3:"賠";s:2:"";s:3:"賢";s:2:"";s:3:"賣";s:2:"";s:3:"賤";s:2:"";s:3:"賦";s:2:"ݷ";s:3:"質";s:2:"";s:3:"賭";s:2:"Ԯ";s:3:"賴";s:2:"";s:3:"賻";s:2:"ݸ";s:3:"購";s:2:"";s:3:"賽";s:2:"";s:3:"贄";s:2:"";s:3:"贅";s:2:"";s:3:"贇";s:2:"";s:3:"贈";s:2:"";s:3:"贊";s:2:"";s:3:"贍";s:2:"";s:3:"贓";s:2:"";s:3:"贖";s:2:"";s:3:"赤";s:2:"";s:3:"赦";s:2:"";s:3:"赫";s:2:"";s:3:"走";s:2:"";s:3:"赳";s:2:"Я";s:3:"赴";s:2:"ݹ";s:3:"起";s:2:"";s:3:"超";s:2:"";s:3:"越";s:2:"";s:3:"趙";s:2:"";s:3:"趣";s:2:"";s:3:"趨";s:2:"";s:3:"足";s:2:"";s:3:"趺";s:2:"ݺ";s:3:"趾";s:2:"";s:3:"跆";s:2:"";s:3:"跋";s:2:"ۢ";s:3:"跌";s:2:"";s:3:"跏";s:2:"ʺ";s:3:"跛";s:2:"";s:3:"距";s:2:"";s:3:"跡";s:2:"";s:3:"跣";s:2:"";s:3:"跨";s:2:"Υ";s:3:"路";s:2:"";s:3:"跳";s:2:"ԯ";s:3:"踊";s:2:"";s:3:"踏";s:2:"";s:3:"踐";s:2:"";s:3:"踞";s:2:"";s:3:"踪";s:2:"";s:3:"踰";s:2:"";s:3:"踵";s:2:"";s:3:"蹂";s:2:"";s:3:"蹄";s:2:"";s:3:"蹇";s:2:"";s:3:"蹈";s:2:"԰";s:3:"蹉";s:2:"";s:3:"蹊";s:2:"";s:3:"蹙";s:2:"";s:3:"蹟";s:2:"";s:3:"蹠";s:2:"";s:3:"蹴";s:2:"";s:3:"蹶";s:2:"";s:3:"躁";s:2:"";s:3:"躇";s:2:"";s:3:"躊";s:2:"";s:3:"躍";s:2:"";s:3:"躪";s:2:"";s:3:"身";s:2:"";s:3:"躬";s:2:"";s:3:"軀";s:2:"";s:3:"車";s:2:"";s:3:"軋";s:2:"";s:3:"軌";s:2:"";s:3:"軍";s:2:"";s:3:"軒";s:2:"";s:3:"軟";s:2:"";s:3:"軫";s:2:"";s:3:"軸";s:2:"";s:3:"軻";s:2:"ʻ";s:3:"軾";s:2:"";s:3:"較";s:2:"";s:3:"輅";s:2:"";s:3:"載";s:2:"";s:3:"輒";s:2:"";s:3:"輓";s:2:"";s:3:"輔";s:2:"";s:3:"輕";s:2:"";s:3:"輛";s:2:"";s:3:"輜";s:2:"";s:3:"輝";s:2:"";s:3:"輞";s:2:"";s:3:"輟";s:2:"";s:3:"輦";s:2:"֦";s:3:"輧";s:2:"ܾ";s:3:"輩";s:2:"";s:3:"輪";s:2:"";s:3:"輯";s:2:"";s:3:"輳";s:2:"";s:3:"輸";s:2:"";s:3:"輹";s:2:"";s:3:"輻";s:2:"";s:3:"輾";s:2:"";s:3:"輿";s:2:"";s:3:"轄";s:2:"";s:3:"轅";s:2:"";s:3:"轉";s:2:"";s:3:"轍";s:2:"";s:3:"轎";s:2:"";s:3:"轝";s:2:"";s:3:"轟";s:2:"";s:3:"轢";s:2:"";s:3:"辛";s:2:"";s:3:"辜";s:2:"";s:3:"辣";s:2:"ո";s:3:"辦";s:2:"";s:3:"辨";s:2:"ܩ";s:3:"辭";s:2:"";s:3:"辯";s:2:"ܪ";s:3:"辰";s:2:"";s:3:"辱";s:2:"";s:3:"農";s:2:"";s:3:"迂";s:2:"";s:3:"迅";s:2:"";s:3:"迎";s:2:"";s:3:"近";s:2:"";s:3:"返";s:2:"";s:3:"迦";s:2:"ʼ";s:3:"迪";s:2:"";s:3:"迫";s:2:"";s:3:"迭";s:2:"";s:3:"述";s:2:"";s:3:"迲";s:2:"̦";s:3:"迷";s:2:"ڻ";s:3:"迹";s:2:"";s:3:"追";s:2:"";s:3:"退";s:2:"";s:3:"送";s:2:"";s:3:"适";s:2:"";s:3:"逃";s:2:"Ա";s:3:"逅";s:2:"";s:3:"逆";s:2:"";s:3:"逈";s:2:"";s:3:"逋";s:2:"";s:3:"逍";s:2:"";s:3:"透";s:2:"";s:3:"逐";s:2:"";s:3:"逑";s:2:"";s:3:"途";s:2:"Բ";s:3:"逕";s:2:"";s:3:"逗";s:2:"";s:3:"這";s:2:"";s:3:"通";s:2:"";s:3:"逝";s:2:"";s:3:"逞";s:2:"";s:3:"速";s:2:"";s:3:"造";s:2:"";s:3:"逡";s:2:"";s:3:"逢";s:2:"";s:3:"連";s:2:"֧";s:3:"逮";s:2:"";s:3:"週";s:2:"";s:3:"進";s:2:"";s:3:"逵";s:2:"а";s:3:"逸";s:2:"";s:3:"逼";s:2:"";s:3:"逾";s:2:"";s:3:"遁";s:2:"";s:3:"遂";s:2:"";s:3:"遇";s:2:"";s:3:"遊";s:2:"";s:3:"運";s:2:"";s:3:"遍";s:2:"";s:3:"過";s:2:"Φ";s:3:"遐";s:2:"";s:3:"遑";s:2:"";s:3:"道";s:2:"Գ";s:3:"達";s:2:"ӹ";s:3:"違";s:2:"";s:3:"遙";s:2:"";s:3:"遜";s:2:"";s:3:"遝";s:2:"";s:3:"遞";s:2:"";s:3:"遠";s:2:"";s:3:"遡";s:2:"";s:3:"遣";s:2:"̺";s:3:"適";s:2:"";s:3:"遭";s:2:"";s:3:"遮";s:2:"";s:3:"遯";s:2:"";s:3:"遲";s:2:"";s:3:"遵";s:2:"";s:3:"遷";s:2:"";s:3:"選";s:2:"";s:3:"遺";s:2:"";s:3:"遼";s:2:"ס";s:3:"遽";s:2:"";s:3:"避";s:2:"";s:3:"邀";s:2:"";s:3:"邁";s:2:"";s:3:"邂";s:2:"";s:3:"邃";s:2:"";s:3:"還";s:2:"";s:3:"邇";s:2:"";s:3:"邈";s:2:"ر";s:3:"邊";s:2:"ܫ";s:3:"邏";s:2:"դ";s:3:"邑";s:2:"";s:3:"邕";s:2:"";s:3:"邙";s:2:"";s:3:"邢";s:2:"";s:3:"那";s:2:"";s:3:"邦";s:2:"";s:3:"邨";s:2:"";s:3:"邪";s:2:"";s:3:"邯";s:2:"";s:3:"邰";s:2:"";s:3:"邱";s:2:"";s:3:"邵";s:2:"";s:3:"邸";s:2:"";s:3:"郁";s:2:"";s:3:"郊";s:2:"";s:3:"郞";s:2:"";s:3:"郡";s:2:"";s:3:"部";s:2:"ݻ";s:3:"郭";s:2:"ά";s:3:"郵";s:2:"";s:3:"都";s:2:"Դ";s:3:"鄂";s:2:"";s:3:"鄒";s:2:"";s:3:"鄕";s:2:"";s:3:"鄙";s:2:"ީ";s:3:"鄧";s:2:"";s:3:"鄭";s:2:"";s:3:"鄲";s:2:"ӳ";s:3:"酉";s:2:"";s:3:"酊";s:2:"";s:3:"酋";s:2:"";s:3:"酌";s:2:"";s:3:"配";s:2:"";s:3:"酎";s:2:"";s:3:"酒";s:2:"";s:3:"酢";s:2:"";s:3:"酩";s:2:"ٮ";s:3:"酪";s:2:"լ";s:3:"酬";s:2:"";s:3:"酵";s:2:"";s:3:"酷";s:2:"";s:3:"酸";s:2:"߫";s:3:"醇";s:2:"";s:3:"醉";s:2:"";s:3:"醋";s:2:"";s:3:"醍";s:2:"";s:3:"醒";s:2:"";s:3:"醜";s:2:"";s:3:"醫";s:2:"";s:3:"醬";s:2:"";s:3:"醮";s:2:"";s:3:"醯";s:2:"";s:3:"醱";s:2:"ۣ";s:3:"醴";s:2:"";s:3:"醵";s:2:"";s:3:"釀";s:2:"";s:3:"采";s:2:"";s:3:"釉";s:2:"";s:3:"釋";s:2:"";s:3:"里";s:2:"";s:3:"重";s:2:"";s:3:"野";s:2:"";s:3:"量";s:2:"";s:3:"釐";s:2:"";s:3:"金";s:2:"";s:3:"釗";s:2:"";s:3:"釘";s:2:"";s:3:"釜";s:2:"ݼ";s:3:"針";s:2:"";s:3:"釣";s:2:"";s:3:"釧";s:2:"";s:3:"釪";s:2:"";s:3:"釵";s:2:"";s:3:"鈍";s:2:"";s:3:"鈐";s:2:"̢";s:3:"鈑";s:2:"";s:3:"鈒";s:2:"߼";s:3:"鈗";s:2:"";s:3:"鈞";s:2:"з";s:3:"鈴";s:2:"";s:3:"鈺";s:2:"";s:3:"鈿";s:2:"";s:3:"鉀";s:2:"˥";s:3:"鉅";s:2:"";s:3:"鉉";s:2:"";s:3:"鉗";s:2:"";s:3:"鉛";s:2:"";s:3:"鉞";s:2:"";s:3:"鉢";s:2:"ۤ";s:3:"鉤";s:2:"";s:3:"鉥";s:2:"";s:3:"鉦";s:2:"";s:3:"銀";s:2:"";s:3:"銃";s:2:"";s:3:"銅";s:2:"";s:3:"銑";s:2:"";s:3:"銓";s:2:"";s:3:"銖";s:2:"";s:3:"銘";s:2:"ٯ";s:3:"銜";s:2:"";s:3:"銳";s:2:"";s:3:"銶";s:2:"";s:3:"銷";s:2:"";s:3:"銹";s:2:"";s:3:"鋌";s:2:"";s:3:"鋏";s:2:"";s:3:"鋒";s:2:"";s:3:"鋤";s:2:"";s:3:"鋪";s:2:"";s:3:"鋸";s:2:"";s:3:"鋼";s:2:"˼";s:3:"錄";s:2:"";s:3:"錐";s:2:"";s:3:"錘";s:2:"";s:3:"錚";s:2:"";s:3:"錞";s:2:"";s:3:"錟";s:2:"";s:3:"錠";s:2:"";s:3:"錡";s:2:"";s:3:"錢";s:2:"";s:3:"錤";s:2:"";s:3:"錦";s:2:"";s:3:"錨";s:2:"";s:3:"錫";s:2:"";s:3:"錮";s:2:"";s:3:"錯";s:2:"";s:3:"鍈";s:2:"";s:3:"鍊";s:2:"֨";s:3:"鍋";s:2:"Χ";s:3:"鍍";s:2:"Ե";s:3:"鍔";s:2:"";s:3:"鍛";s:2:"Ӵ";s:3:"鍮";s:2:"";s:3:"鍵";s:2:"";s:3:"鍼";s:2:"";s:3:"鍾";s:2:"";s:3:"鎌";s:2:"";s:3:"鎔";s:2:"";s:3:"鎖";s:2:"";s:3:"鎚";s:2:"";s:3:"鎣";s:2:"";s:3:"鎧";s:2:"";s:3:"鎬";s:2:"";s:3:"鎭";s:2:"";s:3:"鎰";s:2:"";s:3:"鏃";s:2:"";s:3:"鏑";s:2:"";s:3:"鏞";s:2:"";s:3:"鏡";s:2:"";s:3:"鏤";s:2:"ׯ";s:3:"鏶";s:2:"";s:3:"鐄";s:2:"";s:3:"鐘";s:2:"";s:3:"鐥";s:2:"";s:3:"鐫";s:2:"";s:3:"鐵";s:2:"";s:3:"鐸";s:2:"";s:3:"鑄";s:2:"";s:3:"鑑";s:2:"";s:3:"鑒";s:2:"";s:3:"鑛";s:2:"";s:3:"鑽";s:2:"";s:3:"鑿";s:2:"";s:3:"長";s:2:"";s:3:"門";s:2:"ڦ";s:3:"閃";s:2:"";s:3:"閉";s:2:"";s:3:"開";s:2:"";s:3:"閏";s:2:"";s:3:"閑";s:2:"";s:3:"閒";s:2:"";s:3:"間";s:2:"";s:3:"閔";s:2:"";s:3:"閘";s:2:"˦";s:3:"閣";s:2:"";s:3:"閤";s:2:"";s:3:"閥";s:2:"";s:3:"閨";s:2:"б";s:3:"閭";s:2:"";s:3:"閱";s:2:"";s:3:"閻";s:2:"";s:3:"閼";s:2:"";s:3:"闇";s:2:"";s:3:"闊";s:2:"";s:3:"闔";s:2:"";s:3:"闕";s:2:"";s:3:"闖";s:2:"";s:3:"關";s:2:"μ";s:3:"闡";s:2:"";s:3:"闢";s:2:"ܣ";s:3:"阜";s:2:"ݽ";s:3:"阡";s:2:"";s:3:"阪";s:2:"";s:3:"阮";s:2:"";s:3:"防";s:2:"";s:3:"阻";s:2:"";s:3:"阿";s:2:"";s:3:"陀";s:2:"";s:3:"陂";s:2:"";s:3:"附";s:2:"ݾ";s:3:"陋";s:2:"װ";s:3:"陌";s:2:"";s:3:"降";s:2:"˽";s:3:"限";s:2:"";s:3:"陛";s:2:"";s:3:"陜";s:2:"";s:3:"陝";s:2:"";s:3:"陞";s:2:"";s:3:"陟";s:2:"";s:3:"院";s:2:"";s:3:"陣";s:2:"";s:3:"除";s:2:"";s:3:"陪";s:2:"";s:3:"陰";s:2:"";s:3:"陳";s:2:"";s:3:"陵";s:2:"";s:3:"陶";s:2:"Զ";s:3:"陷";s:2:"";s:3:"陸";s:2:"";s:3:"陽";s:2:"";s:3:"隅";s:2:"";s:3:"隆";s:2:"";s:3:"隊";s:2:"";s:3:"隋";s:2:"";s:3:"隍";s:2:"";s:3:"階";s:2:"ͭ";s:3:"隔";s:2:"̰";s:3:"隕";s:2:"";s:3:"隘";s:2:"";s:3:"隙";s:2:"";s:3:"際";s:2:"";s:3:"障";s:2:"";s:3:"隣";s:2:"";s:3:"隧";s:2:"";s:3:"隨";s:2:"";s:3:"險";s:2:"";s:3:"隱";s:2:"";s:3:"隷";s:2:"";s:3:"隻";s:2:"";s:3:"雀";s:2:"";s:3:"雁";s:2:"";s:3:"雄";s:2:"";s:3:"雅";s:2:"";s:3:"集";s:2:"";s:3:"雇";s:2:"";s:3:"雉";s:2:"";s:3:"雋";s:2:"";s:3:"雌";s:2:"";s:3:"雍";s:2:"";s:3:"雎";s:2:"";s:3:"雕";s:2:"";s:3:"雖";s:2:"";s:3:"雙";s:2:"";s:3:"雛";s:2:"";s:3:"雜";s:2:"";s:3:"離";s:2:"";s:3:"難";s:2:"";s:3:"雨";s:2:"";s:3:"雩";s:2:"";s:3:"雪";s:2:"";s:3:"雯";s:2:"ڧ";s:3:"雰";s:2:"";s:3:"雲";s:2:"";s:3:"零";s:2:"";s:3:"雷";s:2:"";s:3:"雹";s:2:"";s:3:"電";s:2:"";s:3:"需";s:2:"";s:3:"霆";s:2:"";s:3:"震";s:2:"";s:3:"霑";s:2:"";s:3:"霓";s:2:"";s:3:"霖";s:2:"";s:3:"霙";s:2:"";s:3:"霜";s:2:"";s:3:"霞";s:2:"";s:3:"霧";s:2:"";s:3:"霰";s:2:"߬";s:3:"露";s:2:"";s:3:"霹";s:2:"ܤ";s:3:"霽";s:2:"";s:3:"靂";s:2:"";s:3:"靄";s:2:"";s:3:"靈";s:2:"";s:3:"靑";s:2:"";s:3:"靖";s:2:"";s:3:"靜";s:2:"";s:3:"非";s:2:"ު";s:3:"靡";s:2:"ڼ";s:3:"面";s:2:"";s:3:"革";s:2:"";s:3:"靭";s:2:"";s:3:"靴";s:2:"";s:3:"靷";s:2:"";s:3:"靺";s:2:"";s:3:"鞋";s:2:"";s:3:"鞍";s:2:"";s:3:"鞏";s:2:"";s:3:"鞠";s:2:"";s:3:"鞨";s:2:"";s:3:"鞫";s:2:"";s:3:"鞭";s:2:"";s:3:"韆";s:2:"";s:3:"韋";s:2:"";s:3:"韓";s:2:"";s:3:"韜";s:2:"Է";s:3:"音";s:2:"";s:3:"韶";s:2:"";s:3:"韻";s:2:"";s:3:"響";s:2:"";s:3:"頀";s:2:"";s:3:"頁";s:2:"";s:3:"頂";s:2:"";s:3:"頃";s:2:"";s:3:"項";s:2:"";s:3:"順";s:2:"";s:3:"須";s:2:"";s:3:"頊";s:2:"";s:3:"頌";s:2:"";s:3:"預";s:2:"";s:3:"頑";s:2:"";s:3:"頒";s:2:"";s:3:"頓";s:2:"";s:3:"頗";s:2:"";s:3:"領";s:2:"";s:3:"頭";s:2:"";s:3:"頰";s:2:"";s:3:"頸";s:2:"";s:3:"頹";s:2:"";s:3:"頻";s:2:"޺";s:3:"顆";s:2:"Ψ";s:3:"題";s:2:"";s:3:"額";s:2:"";s:3:"顎";s:2:"";s:3:"顔";s:2:"";s:3:"願";s:2:"";s:3:"顚";s:2:"";s:3:"類";s:2:"׾";s:3:"顥";s:2:"";s:3:"顧";s:2:"";s:3:"顫";s:2:"";s:3:"顯";s:2:"";s:3:"風";s:2:"";s:3:"颯";s:2:"߽";s:3:"颱";s:2:"";s:3:"飄";s:2:"";s:3:"飇";s:2:"";s:3:"飛";s:2:"ޫ";s:3:"飜";s:2:"";s:3:"食";s:2:"";s:3:"飡";s:2:"";s:3:"飢";s:2:"";s:3:"飭";s:2:"";s:3:"飮";s:2:"";s:3:"飯";s:2:"";s:3:"飴";s:2:"";s:3:"飼";s:2:"";s:3:"飽";s:2:"";s:3:"飾";s:2:"";s:3:"餃";s:2:"";s:3:"餉";s:2:"";s:3:"養";s:2:"";s:3:"餌";s:2:"";s:3:"餐";s:2:"";s:3:"餓";s:2:"";s:3:"餘";s:2:"";s:3:"餞";s:2:"";s:3:"餠";s:2:"ܿ";s:3:"館";s:2:"ν";s:3:"饅";s:2:"";s:3:"饉";s:2:"";s:3:"饋";s:2:"";s:3:"饌";s:2:"";s:3:"饍";s:2:"";s:3:"饑";s:2:"";s:3:"饒";s:2:"";s:3:"饔";s:2:"";s:3:"饗";s:2:"";s:3:"首";s:2:"";s:3:"香";s:2:"";s:3:"馝";s:2:"";s:3:"馥";s:2:"";s:3:"馨";s:2:"";s:3:"馬";s:2:"ة";s:3:"馭";s:2:"";s:3:"馮";s:2:"";s:3:"馱";s:2:"";s:3:"馳";s:2:"";s:3:"馴";s:2:"";s:3:"馹";s:2:"";s:3:"駁";s:2:"";s:3:"駐";s:2:"";s:3:"駑";s:2:"";s:3:"駒";s:2:"";s:3:"駕";s:2:"ʽ";s:3:"駙";s:2:"ݿ";s:3:"駝";s:2:"";s:3:"駟";s:2:"";s:3:"駭";s:2:"";s:3:"駱";s:2:"խ";s:3:"駿";s:2:"";s:3:"騁";s:2:"޾";s:3:"騈";s:2:"";s:3:"騎";s:2:"";s:3:"騏";s:2:"";s:3:"騙";s:2:"";s:3:"騫";s:2:"";s:3:"騰";s:2:"";s:3:"騶";s:2:"";s:3:"騷";s:2:"";s:3:"驀";s:2:"";s:3:"驃";s:2:"";s:3:"驅";s:2:"";s:3:"驍";s:2:"";s:3:"驕";s:2:"";s:3:"驗";s:2:"";s:3:"驚";s:2:"";s:3:"驛";s:2:"";s:3:"驟";s:2:"";s:3:"驢";s:2:"";s:3:"驥";s:2:"";s:3:"驩";s:2:"";s:3:"驪";s:2:"";s:3:"骨";s:2:"";s:3:"骸";s:2:"";s:3:"髓";s:2:"";s:3:"體";s:2:"";s:3:"高";s:2:"";s:3:"髥";s:2:"";s:3:"髮";s:2:"ۥ";s:3:"鬚";s:2:"";s:3:"鬧";s:2:"ע";s:3:"鬪";s:2:"";s:3:"鬱";s:2:"";s:3:"鬼";s:2:"С";s:3:"魁";s:2:"";s:3:"魂";s:2:"";s:3:"魃";s:2:"ۦ";s:3:"魄";s:2:"";s:3:"魅";s:2:"";s:3:"魏";s:2:"";s:3:"魔";s:2:"ت";s:3:"魚";s:2:"";s:3:"魯";s:2:"";s:3:"鮎";s:2:"";s:3:"鮑";s:2:"";s:3:"鮟";s:2:"";s:3:"鮫";s:2:"";s:3:"鮮";s:2:"";s:3:"鯉";s:2:"";s:3:"鯖";s:2:"";s:3:"鯤";s:2:"";s:3:"鯨";s:2:"";s:3:"鰍";s:2:"";s:3:"鰐";s:2:"";s:3:"鰒";s:2:"";s:3:"鰕";s:2:"";s:3:"鰥";s:2:"";s:3:"鰲";s:2:"";s:3:"鰻";s:2:"";s:3:"鱇";s:2:"˾";s:3:"鱉";s:2:"ܮ";s:3:"鱗";s:2:"";s:3:"鳥";s:2:"";s:3:"鳧";s:2:"";s:3:"鳩";s:2:"";s:3:"鳳";s:2:"";s:3:"鳴";s:2:"ٰ";s:3:"鳶";s:2:"";s:3:"鴉";s:2:"";s:3:"鴛";s:2:"";s:3:"鴦";s:2:"";s:3:"鴨";s:2:"";s:3:"鴻";s:2:"";s:3:"鵑";s:2:"̻";s:3:"鵝";s:2:"";s:3:"鵠";s:2:"";s:3:"鵡";s:2:"";s:3:"鵬";s:2:"";s:3:"鵲";s:2:"";s:3:"鶩";s:2:"";s:3:"鶯";s:2:"";s:3:"鶴";s:2:"";s:3:"鷄";s:2:"ͮ";s:3:"鷗";s:2:"";s:3:"鷲";s:2:"";s:3:"鷸";s:2:"";s:3:"鷹";s:2:"";s:3:"鷺";s:2:"";s:3:"鸚";s:2:"";s:3:"鸞";s:2:"ն";s:3:"鹵";s:2:"";s:3:"鹹";s:2:"";s:3:"鹽";s:2:"";s:3:"鹿";s:2:"";s:3:"麒";s:2:"";s:3:"麓";s:2:"";s:3:"麗";s:2:"";s:3:"麝";s:2:"";s:3:"麟";s:2:"";s:3:"麥";s:2:"";s:3:"麴";s:2:"";s:3:"麵";s:2:"";s:3:"麻";s:2:"ث";s:3:"麾";s:2:"";s:3:"黃";s:2:"";s:3:"黍";s:2:"";s:3:"黎";s:2:"";s:3:"黑";s:2:"";s:3:"黔";s:2:"̣";s:3:"默";s:2:"";s:3:"黛";s:2:"";s:3:"黜";s:2:"";s:3:"點";s:2:"";s:3:"黨";s:2:"";s:3:"黴";s:2:"ڽ";s:3:"鼇";s:2:"";s:3:"鼈";s:2:"ܯ";s:3:"鼎";s:2:"";s:3:"鼓";s:2:"";s:3:"鼠";s:2:"";s:3:"鼻";s:2:"ެ";s:3:"齊";s:2:"";s:3:"齋";s:2:"";s:3:"齎";s:2:"";s:3:"齒";s:2:"";s:3:"齟";s:2:"";s:3:"齡";s:2:"";s:3:"齧";s:2:"";s:3:"齪";s:2:"";s:3:"齬";s:2:"";s:3:"齷";s:2:"";s:3:"龍";s:2:"ף";s:3:"龐";s:2:"";s:3:"龕";s:2:"";s:3:"龜";s:2:"";s:3:"가";s:2:"";s:3:"각";s:2:"";s:3:"갂";s:2:"A";s:3:"갃";s:2:"B";s:3:"간";s:2:"";s:3:"갅";s:2:"C";s:3:"갆";s:2:"D";s:3:"갇";s:2:"";s:3:"갈";s:2:"";s:3:"갉";s:2:"";s:3:"갊";s:2:"";s:3:"갋";s:2:"E";s:3:"갌";s:2:"F";s:3:"갍";s:2:"G";s:3:"갎";s:2:"H";s:3:"갏";s:2:"I";s:3:"감";s:2:"";s:3:"갑";s:2:"";s:3:"값";s:2:"";s:3:"갓";s:2:"";s:3:"갔";s:2:"";s:3:"강";s:2:"";s:3:"갖";s:2:"";s:3:"갗";s:2:"";s:3:"갘";s:2:"J";s:3:"같";s:2:"";s:3:"갚";s:2:"";s:3:"갛";s:2:"";s:3:"개";s:2:"";s:3:"객";s:2:"";s:3:"갞";s:2:"K";s:3:"갟";s:2:"L";s:3:"갠";s:2:"";s:3:"갡";s:2:"M";s:3:"갢";s:2:"N";s:3:"갣";s:2:"O";s:3:"갤";s:2:"";s:3:"갥";s:2:"P";s:3:"갦";s:2:"Q";s:3:"갧";s:2:"R";s:3:"갨";s:2:"S";s:3:"갩";s:2:"T";s:3:"갪";s:2:"U";s:3:"갫";s:2:"V";s:3:"갬";s:2:"";s:3:"갭";s:2:"";s:3:"갮";s:2:"W";s:3:"갯";s:2:"";s:3:"갰";s:2:"";s:3:"갱";s:2:"";s:3:"갲";s:2:"X";s:3:"갳";s:2:"Y";s:3:"갴";s:2:"Z";s:3:"갵";s:2:"a";s:3:"갶";s:2:"b";s:3:"갷";s:2:"c";s:3:"갸";s:2:"";s:3:"갹";s:2:"";s:3:"갺";s:2:"d";s:3:"갻";s:2:"e";s:3:"갼";s:2:"";s:3:"갽";s:2:"f";s:3:"갾";s:2:"g";s:3:"갿";s:2:"h";s:3:"걀";s:2:"";s:3:"걁";s:2:"i";s:3:"걂";s:2:"j";s:3:"걃";s:2:"k";s:3:"걄";s:2:"l";s:3:"걅";s:2:"m";s:3:"걆";s:2:"n";s:3:"걇";s:2:"o";s:3:"걈";s:2:"p";s:3:"걉";s:2:"q";s:3:"걊";s:2:"r";s:3:"걋";s:2:"";s:3:"걌";s:2:"s";s:3:"걍";s:2:"";s:3:"걎";s:2:"t";s:3:"걏";s:2:"u";s:3:"걐";s:2:"v";s:3:"걑";s:2:"w";s:3:"걒";s:2:"x";s:3:"걓";s:2:"y";s:3:"걔";s:2:"";s:3:"걕";s:2:"z";s:3:"걖";s:2:"";s:3:"걗";s:2:"";s:3:"걘";s:2:"";s:3:"걙";s:2:"";s:3:"걚";s:2:"";s:3:"걛";s:2:"";s:3:"걜";s:2:"";s:3:"걝";s:2:"";s:3:"걞";s:2:"";s:3:"걟";s:2:"";s:3:"걠";s:2:"";s:3:"걡";s:2:"";s:3:"걢";s:2:"";s:3:"걣";s:2:"";s:3:"걤";s:2:"";s:3:"걥";s:2:"";s:3:"걦";s:2:"";s:3:"걧";s:2:"";s:3:"걨";s:2:"";s:3:"걩";s:2:"";s:3:"걪";s:2:"";s:3:"걫";s:2:"";s:3:"걬";s:2:"";s:3:"걭";s:2:"";s:3:"걮";s:2:"";s:3:"걯";s:2:"";s:3:"거";s:2:"";s:3:"걱";s:2:"";s:3:"걲";s:2:"";s:3:"걳";s:2:"";s:3:"건";s:2:"";s:3:"걵";s:2:"";s:3:"걶";s:2:"";s:3:"걷";s:2:"";s:3:"걸";s:2:"";s:3:"걹";s:2:"";s:3:"걺";s:2:"";s:3:"걻";s:2:"";s:3:"걼";s:2:"";s:3:"걽";s:2:"";s:3:"걾";s:2:"";s:3:"걿";s:2:"";s:3:"검";s:2:"";s:3:"겁";s:2:"";s:3:"겂";s:2:"";s:3:"것";s:2:"";s:3:"겄";s:2:"";s:3:"겅";s:2:"";s:3:"겆";s:2:"";s:3:"겇";s:2:"";s:3:"겈";s:2:"";s:3:"겉";s:2:"";s:3:"겊";s:2:"";s:3:"겋";s:2:"";s:3:"게";s:2:"";s:3:"겍";s:2:"";s:3:"겎";s:2:"";s:3:"겏";s:2:"";s:3:"겐";s:2:"";s:3:"겑";s:2:"";s:3:"겒";s:2:"";s:3:"겓";s:2:"";s:3:"겔";s:2:"";s:3:"겕";s:2:"";s:3:"겖";s:2:"";s:3:"겗";s:2:"";s:3:"겘";s:2:"";s:3:"겙";s:2:"";s:3:"겚";s:2:"";s:3:"겛";s:2:"";s:3:"겜";s:2:"";s:3:"겝";s:2:"";s:3:"겞";s:2:"";s:3:"겟";s:2:"";s:3:"겠";s:2:"";s:3:"겡";s:2:"";s:3:"겢";s:2:"";s:3:"겣";s:2:"";s:3:"겤";s:2:"";s:3:"겥";s:2:"";s:3:"겦";s:2:"";s:3:"겧";s:2:"";s:3:"겨";s:2:"";s:3:"격";s:2:"";s:3:"겪";s:2:"";s:3:"겫";s:2:"";s:3:"견";s:2:"";s:3:"겭";s:2:"";s:3:"겮";s:2:"";s:3:"겯";s:2:"";s:3:"결";s:2:"";s:3:"겱";s:2:"";s:3:"겲";s:2:"";s:3:"겳";s:2:"";s:3:"겴";s:2:"";s:3:"겵";s:2:"";s:3:"겶";s:2:"";s:3:"겷";s:2:"";s:3:"겸";s:2:"";s:3:"겹";s:2:"";s:3:"겺";s:2:"";s:3:"겻";s:2:"";s:3:"겼";s:2:"";s:3:"경";s:2:"";s:3:"겾";s:2:"";s:3:"겿";s:2:"";s:3:"곀";s:2:"";s:3:"곁";s:2:"";s:3:"곂";s:2:"";s:3:"곃";s:2:"";s:3:"계";s:2:"";s:3:"곅";s:2:"";s:3:"곆";s:2:"";s:3:"곇";s:2:"";s:3:"곈";s:2:"";s:3:"곉";s:2:"";s:3:"곊";s:2:"";s:3:"곋";s:2:"";s:3:"곌";s:2:"";s:3:"곍";s:2:"";s:3:"곎";s:2:"";s:3:"곏";s:2:"";s:3:"곐";s:2:"";s:3:"곑";s:2:"";s:3:"곒";s:2:"";s:3:"곓";s:2:"";s:3:"곔";s:2:"";s:3:"곕";s:2:"";s:3:"곖";s:2:"";s:3:"곗";s:2:"";s:3:"곘";s:2:"";s:3:"곙";s:2:"";s:3:"곚";s:2:"";s:3:"곛";s:2:"";s:3:"곜";s:2:"";s:3:"곝";s:2:"";s:3:"곞";s:2:"";s:3:"곟";s:2:"";s:3:"고";s:2:"";s:3:"곡";s:2:"";s:3:"곢";s:2:"";s:3:"곣";s:2:"";s:3:"곤";s:2:"";s:3:"곥";s:2:"";s:3:"곦";s:2:"";s:3:"곧";s:2:"";s:3:"골";s:2:"";s:3:"곩";s:2:"";s:3:"곪";s:2:"";s:3:"곫";s:2:"";s:3:"곬";s:2:"";s:3:"곭";s:2:"";s:3:"곮";s:2:"";s:3:"곯";s:2:"";s:3:"곰";s:2:"";s:3:"곱";s:2:"";s:3:"곲";s:2:"";s:3:"곳";s:2:"";s:3:"곴";s:2:"";s:3:"공";s:2:"";s:3:"곶";s:2:"";s:3:"곷";s:2:"";s:3:"곸";s:2:"";s:3:"곹";s:2:"";s:3:"곺";s:2:"";s:3:"곻";s:2:"";s:3:"과";s:2:"";s:3:"곽";s:2:"";s:3:"곾";s:2:"";s:3:"곿";s:2:"";s:3:"관";s:2:"";s:3:"괁";s:2:"";s:3:"괂";s:2:"";s:3:"괃";s:2:"";s:3:"괄";s:2:"";s:3:"괅";s:2:"";s:3:"괆";s:2:"";s:3:"괇";s:2:"";s:3:"괈";s:2:"";s:3:"괉";s:2:"";s:3:"괊";s:2:"";s:3:"괋";s:2:"";s:3:"괌";s:2:"";s:3:"괍";s:2:"";s:3:"괎";s:2:"";s:3:"괏";s:2:"";s:3:"괐";s:2:"";s:3:"광";s:2:"";s:3:"괒";s:2:"";s:3:"괓";s:2:"";s:3:"괔";s:2:"A";s:3:"괕";s:2:"B";s:3:"괖";s:2:"C";s:3:"괗";s:2:"D";s:3:"괘";s:2:"";s:3:"괙";s:2:"E";s:3:"괚";s:2:"F";s:3:"괛";s:2:"G";s:3:"괜";s:2:"";s:3:"괝";s:2:"H";s:3:"괞";s:2:"I";s:3:"괟";s:2:"J";s:3:"괠";s:2:"";s:3:"괡";s:2:"K";s:3:"괢";s:2:"L";s:3:"괣";s:2:"M";s:3:"괤";s:2:"N";s:3:"괥";s:2:"O";s:3:"괦";s:2:"P";s:3:"괧";s:2:"Q";s:3:"괨";s:2:"R";s:3:"괩";s:2:"";s:3:"괪";s:2:"S";s:3:"괫";s:2:"T";s:3:"괬";s:2:"";s:3:"괭";s:2:"";s:3:"괮";s:2:"U";s:3:"괯";s:2:"V";s:3:"괰";s:2:"W";s:3:"괱";s:2:"X";s:3:"괲";s:2:"Y";s:3:"괳";s:2:"Z";s:3:"괴";s:2:"";s:3:"괵";s:2:"";s:3:"괶";s:2:"a";s:3:"괷";s:2:"b";s:3:"괸";s:2:"";s:3:"괹";s:2:"c";s:3:"괺";s:2:"d";s:3:"괻";s:2:"e";s:3:"괼";s:2:"";s:3:"괽";s:2:"f";s:3:"괾";s:2:"g";s:3:"괿";s:2:"h";s:3:"굀";s:2:"i";s:3:"굁";s:2:"j";s:3:"굂";s:2:"k";s:3:"굃";s:2:"l";s:3:"굄";s:2:"";s:3:"굅";s:2:"";s:3:"굆";s:2:"m";s:3:"굇";s:2:"";s:3:"굈";s:2:"n";s:3:"굉";s:2:"";s:3:"굊";s:2:"o";s:3:"굋";s:2:"p";s:3:"굌";s:2:"q";s:3:"굍";s:2:"r";s:3:"굎";s:2:"s";s:3:"굏";s:2:"t";s:3:"교";s:2:"";s:3:"굑";s:2:"u";s:3:"굒";s:2:"v";s:3:"굓";s:2:"w";s:3:"굔";s:2:"";s:3:"굕";s:2:"x";s:3:"굖";s:2:"y";s:3:"굗";s:2:"z";s:3:"굘";s:2:"";s:3:"굙";s:2:"";s:3:"굚";s:2:"";s:3:"굛";s:2:"";s:3:"굜";s:2:"";s:3:"굝";s:2:"";s:3:"굞";s:2:"";s:3:"굟";s:2:"";s:3:"굠";s:2:"";s:3:"굡";s:2:"";s:3:"굢";s:2:"";s:3:"굣";s:2:"";s:3:"굤";s:2:"";s:3:"굥";s:2:"";s:3:"굦";s:2:"";s:3:"굧";s:2:"";s:3:"굨";s:2:"";s:3:"굩";s:2:"";s:3:"굪";s:2:"";s:3:"굫";s:2:"";s:3:"구";s:2:"";s:3:"국";s:2:"";s:3:"굮";s:2:"";s:3:"굯";s:2:"";s:3:"군";s:2:"";s:3:"굱";s:2:"";s:3:"굲";s:2:"";s:3:"굳";s:2:"";s:3:"굴";s:2:"";s:3:"굵";s:2:"";s:3:"굶";s:2:"";s:3:"굷";s:2:"";s:3:"굸";s:2:"";s:3:"굹";s:2:"";s:3:"굺";s:2:"";s:3:"굻";s:2:"";s:3:"굼";s:2:"";s:3:"굽";s:2:"";s:3:"굾";s:2:"";s:3:"굿";s:2:"";s:3:"궀";s:2:"";s:3:"궁";s:2:"";s:3:"궂";s:2:"";s:3:"궃";s:2:"";s:3:"궄";s:2:"";s:3:"궅";s:2:"";s:3:"궆";s:2:"";s:3:"궇";s:2:"";s:3:"궈";s:2:"";s:3:"궉";s:2:"";s:3:"궊";s:2:"";s:3:"궋";s:2:"";s:3:"권";s:2:"";s:3:"궍";s:2:"";s:3:"궎";s:2:"";s:3:"궏";s:2:"";s:3:"궐";s:2:"";s:3:"궑";s:2:"";s:3:"궒";s:2:"";s:3:"궓";s:2:"";s:3:"궔";s:2:"";s:3:"궕";s:2:"";s:3:"궖";s:2:"";s:3:"궗";s:2:"";s:3:"궘";s:2:"";s:3:"궙";s:2:"";s:3:"궚";s:2:"";s:3:"궛";s:2:"";s:3:"궜";s:2:"";s:3:"궝";s:2:"";s:3:"궞";s:2:"";s:3:"궟";s:2:"";s:3:"궠";s:2:"";s:3:"궡";s:2:"";s:3:"궢";s:2:"";s:3:"궣";s:2:"";s:3:"궤";s:2:"";s:3:"궥";s:2:"";s:3:"궦";s:2:"";s:3:"궧";s:2:"";s:3:"궨";s:2:"";s:3:"궩";s:2:"";s:3:"궪";s:2:"";s:3:"궫";s:2:"";s:3:"궬";s:2:"";s:3:"궭";s:2:"";s:3:"궮";s:2:"";s:3:"궯";s:2:"";s:3:"궰";s:2:"";s:3:"궱";s:2:"";s:3:"궲";s:2:"";s:3:"궳";s:2:"";s:3:"궴";s:2:"";s:3:"궵";s:2:"";s:3:"궶";s:2:"";s:3:"궷";s:2:"";s:3:"궸";s:2:"";s:3:"궹";s:2:"";s:3:"궺";s:2:"";s:3:"궻";s:2:"";s:3:"궼";s:2:"";s:3:"궽";s:2:"";s:3:"궾";s:2:"";s:3:"궿";s:2:"";s:3:"귀";s:2:"";s:3:"귁";s:2:"";s:3:"귂";s:2:"";s:3:"귃";s:2:"";s:3:"귄";s:2:"";s:3:"귅";s:2:"";s:3:"귆";s:2:"";s:3:"귇";s:2:"";s:3:"귈";s:2:"";s:3:"귉";s:2:"";s:3:"귊";s:2:"";s:3:"귋";s:2:"";s:3:"귌";s:2:"";s:3:"귍";s:2:"";s:3:"귎";s:2:"";s:3:"귏";s:2:"";s:3:"귐";s:2:"";s:3:"귑";s:2:"";s:3:"귒";s:2:"";s:3:"귓";s:2:"";s:3:"귔";s:2:"";s:3:"귕";s:2:"";s:3:"귖";s:2:"";s:3:"귗";s:2:"";s:3:"귘";s:2:"";s:3:"귙";s:2:"";s:3:"귚";s:2:"";s:3:"귛";s:2:"";s:3:"규";s:2:"";s:3:"귝";s:2:"";s:3:"귞";s:2:"";s:3:"귟";s:2:"";s:3:"균";s:2:"";s:3:"귡";s:2:"";s:3:"귢";s:2:"";s:3:"귣";s:2:"";s:3:"귤";s:2:"";s:3:"귥";s:2:"";s:3:"귦";s:2:"";s:3:"귧";s:2:"";s:3:"귨";s:2:"";s:3:"귩";s:2:"";s:3:"귪";s:2:"";s:3:"귫";s:2:"";s:3:"귬";s:2:"";s:3:"귭";s:2:"";s:3:"귮";s:2:"";s:3:"귯";s:2:"";s:3:"귰";s:2:"";s:3:"귱";s:2:"";s:3:"귲";s:2:"";s:3:"귳";s:2:"";s:3:"귴";s:2:"";s:3:"귵";s:2:"";s:3:"귶";s:2:"";s:3:"귷";s:2:"";s:3:"그";s:2:"";s:3:"극";s:2:"";s:3:"귺";s:2:"A";s:3:"귻";s:2:"B";s:3:"근";s:2:"";s:3:"귽";s:2:"C";s:3:"귾";s:2:"D";s:3:"귿";s:2:"";s:3:"글";s:2:"";s:3:"긁";s:2:"";s:3:"긂";s:2:"E";s:3:"긃";s:2:"F";s:3:"긄";s:2:"G";s:3:"긅";s:2:"H";s:3:"긆";s:2:"I";s:3:"긇";s:2:"J";s:3:"금";s:2:"";s:3:"급";s:2:"";s:3:"긊";s:2:"K";s:3:"긋";s:2:"";s:3:"긌";s:2:"L";s:3:"긍";s:2:"";s:3:"긎";s:2:"M";s:3:"긏";s:2:"N";s:3:"긐";s:2:"O";s:3:"긑";s:2:"P";s:3:"긒";s:2:"Q";s:3:"긓";s:2:"R";s:3:"긔";s:2:"";s:3:"긕";s:2:"S";s:3:"긖";s:2:"T";s:3:"긗";s:2:"U";s:3:"긘";s:2:"V";s:3:"긙";s:2:"W";s:3:"긚";s:2:"X";s:3:"긛";s:2:"Y";s:3:"긜";s:2:"Z";s:3:"긝";s:2:"a";s:3:"긞";s:2:"b";s:3:"긟";s:2:"c";s:3:"긠";s:2:"d";s:3:"긡";s:2:"e";s:3:"긢";s:2:"f";s:3:"긣";s:2:"g";s:3:"긤";s:2:"h";s:3:"긥";s:2:"i";s:3:"긦";s:2:"j";s:3:"긧";s:2:"k";s:3:"긨";s:2:"l";s:3:"긩";s:2:"m";s:3:"긪";s:2:"n";s:3:"긫";s:2:"o";s:3:"긬";s:2:"p";s:3:"긭";s:2:"q";s:3:"긮";s:2:"r";s:3:"긯";s:2:"s";s:3:"기";s:2:"";s:3:"긱";s:2:"";s:3:"긲";s:2:"t";s:3:"긳";s:2:"u";s:3:"긴";s:2:"";s:3:"긵";s:2:"v";s:3:"긶";s:2:"w";s:3:"긷";s:2:"";s:3:"길";s:2:"";s:3:"긹";s:2:"x";s:3:"긺";s:2:"";s:3:"긻";s:2:"y";s:3:"긼";s:2:"z";s:3:"긽";s:2:"";s:3:"긾";s:2:"";s:3:"긿";s:2:"";s:3:"김";s:2:"";s:3:"깁";s:2:"";s:3:"깂";s:2:"";s:3:"깃";s:2:"";s:3:"깄";s:2:"";s:3:"깅";s:2:"";s:3:"깆";s:2:"";s:3:"깇";s:2:"";s:3:"깈";s:2:"";s:3:"깉";s:2:"";s:3:"깊";s:2:"";s:3:"깋";s:2:"";s:3:"까";s:2:"";s:3:"깍";s:2:"";s:3:"깎";s:2:"";s:3:"깏";s:2:"";s:3:"깐";s:2:"";s:3:"깑";s:2:"";s:3:"깒";s:2:"";s:3:"깓";s:2:"";s:3:"깔";s:2:"";s:3:"깕";s:2:"";s:3:"깖";s:2:"";s:3:"깗";s:2:"";s:3:"깘";s:2:"";s:3:"깙";s:2:"";s:3:"깚";s:2:"";s:3:"깛";s:2:"";s:3:"깜";s:2:"";s:3:"깝";s:2:"";s:3:"깞";s:2:"";s:3:"깟";s:2:"";s:3:"깠";s:2:"";s:3:"깡";s:2:"";s:3:"깢";s:2:"";s:3:"깣";s:2:"";s:3:"깤";s:2:"";s:3:"깥";s:2:"";s:3:"깦";s:2:"";s:3:"깧";s:2:"";s:3:"깨";s:2:"";s:3:"깩";s:2:"";s:3:"깪";s:2:"";s:3:"깫";s:2:"";s:3:"깬";s:2:"";s:3:"깭";s:2:"";s:3:"깮";s:2:"";s:3:"깯";s:2:"";s:3:"깰";s:2:"";s:3:"깱";s:2:"";s:3:"깲";s:2:"";s:3:"깳";s:2:"";s:3:"깴";s:2:"";s:3:"깵";s:2:"";s:3:"깶";s:2:"";s:3:"깷";s:2:"";s:3:"깸";s:2:"";s:3:"깹";s:2:"";s:3:"깺";s:2:"";s:3:"깻";s:2:"";s:3:"깼";s:2:"";s:3:"깽";s:2:"";s:3:"깾";s:2:"";s:3:"깿";s:2:"";s:3:"꺀";s:2:"";s:3:"꺁";s:2:"";s:3:"꺂";s:2:"";s:3:"꺃";s:2:"";s:3:"꺄";s:2:"";s:3:"꺅";s:2:"";s:3:"꺆";s:2:"";s:3:"꺇";s:2:"";s:3:"꺈";s:2:"";s:3:"꺉";s:2:"";s:3:"꺊";s:2:"";s:3:"꺋";s:2:"";s:3:"꺌";s:2:"";s:3:"꺍";s:2:"";s:3:"꺎";s:2:"";s:3:"꺏";s:2:"";s:3:"꺐";s:2:"";s:3:"꺑";s:2:"";s:3:"꺒";s:2:"";s:3:"꺓";s:2:"";s:3:"꺔";s:2:"";s:3:"꺕";s:2:"";s:3:"꺖";s:2:"";s:3:"꺗";s:2:"";s:3:"꺘";s:2:"";s:3:"꺙";s:2:"";s:3:"꺚";s:2:"";s:3:"꺛";s:2:"";s:3:"꺜";s:2:"";s:3:"꺝";s:2:"";s:3:"꺞";s:2:"";s:3:"꺟";s:2:"";s:3:"꺠";s:2:"";s:3:"꺡";s:2:"";s:3:"꺢";s:2:"";s:3:"꺣";s:2:"";s:3:"꺤";s:2:"";s:3:"꺥";s:2:"";s:3:"꺦";s:2:"";s:3:"꺧";s:2:"";s:3:"꺨";s:2:"";s:3:"꺩";s:2:"";s:3:"꺪";s:2:"";s:3:"꺫";s:2:"";s:3:"꺬";s:2:"";s:3:"꺭";s:2:"";s:3:"꺮";s:2:"";s:3:"꺯";s:2:"";s:3:"꺰";s:2:"";s:3:"꺱";s:2:"";s:3:"꺲";s:2:"";s:3:"꺳";s:2:"";s:3:"꺴";s:2:"";s:3:"꺵";s:2:"";s:3:"꺶";s:2:"";s:3:"꺷";s:2:"";s:3:"꺸";s:2:"";s:3:"꺹";s:2:"";s:3:"꺺";s:2:"";s:3:"꺻";s:2:"";s:3:"꺼";s:2:"";s:3:"꺽";s:2:"";s:3:"꺾";s:2:"";s:3:"꺿";s:2:"";s:3:"껀";s:2:"";s:3:"껁";s:2:"";s:3:"껂";s:2:"";s:3:"껃";s:2:"";s:3:"껄";s:2:"";s:3:"껅";s:2:"";s:3:"껆";s:2:"";s:3:"껇";s:2:"";s:3:"껈";s:2:"";s:3:"껉";s:2:"";s:3:"껊";s:2:"";s:3:"껋";s:2:"";s:3:"껌";s:2:"";s:3:"껍";s:2:"";s:3:"껎";s:2:"";s:3:"껏";s:2:"";s:3:"껐";s:2:"";s:3:"껑";s:2:"";s:3:"껒";s:2:"";s:3:"껓";s:2:"";s:3:"껔";s:2:"";s:3:"껕";s:2:"";s:3:"껖";s:2:"";s:3:"껗";s:2:"";s:3:"께";s:2:"";s:3:"껙";s:2:"";s:3:"껚";s:2:"";s:3:"껛";s:2:"";s:3:"껜";s:2:"";s:3:"껝";s:2:"";s:3:"껞";s:2:"";s:3:"껟";s:2:"";s:3:"껠";s:2:"";s:3:"껡";s:2:"";s:3:"껢";s:2:"";s:3:"껣";s:2:"";s:3:"껤";s:2:"";s:3:"껥";s:2:"";s:3:"껦";s:2:"A";s:3:"껧";s:2:"B";s:3:"껨";s:2:"";s:3:"껩";s:2:"C";s:3:"껪";s:2:"D";s:3:"껫";s:2:"";s:3:"껬";s:2:"E";s:3:"껭";s:2:"";s:3:"껮";s:2:"F";s:3:"껯";s:2:"G";s:3:"껰";s:2:"H";s:3:"껱";s:2:"I";s:3:"껲";s:2:"J";s:3:"껳";s:2:"K";s:3:"껴";s:2:"";s:3:"껵";s:2:"L";s:3:"껶";s:2:"M";s:3:"껷";s:2:"N";s:3:"껸";s:2:"";s:3:"껹";s:2:"O";s:3:"껺";s:2:"P";s:3:"껻";s:2:"Q";s:3:"껼";s:2:"";s:3:"껽";s:2:"R";s:3:"껾";s:2:"S";s:3:"껿";s:2:"T";s:3:"꼀";s:2:"U";s:3:"꼁";s:2:"V";s:3:"꼂";s:2:"W";s:3:"꼃";s:2:"X";s:3:"꼄";s:2:"Y";s:3:"꼅";s:2:"Z";s:3:"꼆";s:2:"a";s:3:"꼇";s:2:"";s:3:"꼈";s:2:"";s:3:"꼉";s:2:"b";s:3:"꼊";s:2:"c";s:3:"꼋";s:2:"d";s:3:"꼌";s:2:"e";s:3:"꼍";s:2:"";s:3:"꼎";s:2:"f";s:3:"꼏";s:2:"g";s:3:"꼐";s:2:"";s:3:"꼑";s:2:"h";s:3:"꼒";s:2:"i";s:3:"꼓";s:2:"j";s:3:"꼔";s:2:"k";s:3:"꼕";s:2:"l";s:3:"꼖";s:2:"m";s:3:"꼗";s:2:"n";s:3:"꼘";s:2:"o";s:3:"꼙";s:2:"p";s:3:"꼚";s:2:"q";s:3:"꼛";s:2:"r";s:3:"꼜";s:2:"s";s:3:"꼝";s:2:"t";s:3:"꼞";s:2:"u";s:3:"꼟";s:2:"v";s:3:"꼠";s:2:"w";s:3:"꼡";s:2:"x";s:3:"꼢";s:2:"y";s:3:"꼣";s:2:"z";s:3:"꼤";s:2:"";s:3:"꼥";s:2:"";s:3:"꼦";s:2:"";s:3:"꼧";s:2:"";s:3:"꼨";s:2:"";s:3:"꼩";s:2:"";s:3:"꼪";s:2:"";s:3:"꼫";s:2:"";s:3:"꼬";s:2:"";s:3:"꼭";s:2:"";s:3:"꼮";s:2:"";s:3:"꼯";s:2:"";s:3:"꼰";s:2:"";s:3:"꼱";s:2:"";s:3:"꼲";s:2:"";s:3:"꼳";s:2:"";s:3:"꼴";s:2:"";s:3:"꼵";s:2:"";s:3:"꼶";s:2:"";s:3:"꼷";s:2:"";s:3:"꼸";s:2:"";s:3:"꼹";s:2:"";s:3:"꼺";s:2:"";s:3:"꼻";s:2:"";s:3:"꼼";s:2:"";s:3:"꼽";s:2:"";s:3:"꼾";s:2:"";s:3:"꼿";s:2:"";s:3:"꽀";s:2:"";s:3:"꽁";s:2:"";s:3:"꽂";s:2:"";s:3:"꽃";s:2:"";s:3:"꽄";s:2:"";s:3:"꽅";s:2:"";s:3:"꽆";s:2:"";s:3:"꽇";s:2:"";s:3:"꽈";s:2:"";s:3:"꽉";s:2:"";s:3:"꽊";s:2:"";s:3:"꽋";s:2:"";s:3:"꽌";s:2:"";s:3:"꽍";s:2:"";s:3:"꽎";s:2:"";s:3:"꽏";s:2:"";s:3:"꽐";s:2:"";s:3:"꽑";s:2:"";s:3:"꽒";s:2:"";s:3:"꽓";s:2:"";s:3:"꽔";s:2:"";s:3:"꽕";s:2:"";s:3:"꽖";s:2:"";s:3:"꽗";s:2:"";s:3:"꽘";s:2:"";s:3:"꽙";s:2:"";s:3:"꽚";s:2:"";s:3:"꽛";s:2:"";s:3:"꽜";s:2:"";s:3:"꽝";s:2:"";s:3:"꽞";s:2:"";s:3:"꽟";s:2:"";s:3:"꽠";s:2:"";s:3:"꽡";s:2:"";s:3:"꽢";s:2:"";s:3:"꽣";s:2:"";s:3:"꽤";s:2:"";s:3:"꽥";s:2:"";s:3:"꽦";s:2:"";s:3:"꽧";s:2:"";s:3:"꽨";s:2:"";s:3:"꽩";s:2:"";s:3:"꽪";s:2:"";s:3:"꽫";s:2:"";s:3:"꽬";s:2:"";s:3:"꽭";s:2:"";s:3:"꽮";s:2:"";s:3:"꽯";s:2:"";s:3:"꽰";s:2:"";s:3:"꽱";s:2:"";s:3:"꽲";s:2:"";s:3:"꽳";s:2:"";s:3:"꽴";s:2:"";s:3:"꽵";s:2:"";s:3:"꽶";s:2:"";s:3:"꽷";s:2:"";s:3:"꽸";s:2:"";s:3:"꽹";s:2:"";s:3:"꽺";s:2:"";s:3:"꽻";s:2:"";s:3:"꽼";s:2:"";s:3:"꽽";s:2:"";s:3:"꽾";s:2:"";s:3:"꽿";s:2:"";s:3:"꾀";s:2:"";s:3:"꾁";s:2:"";s:3:"꾂";s:2:"";s:3:"꾃";s:2:"";s:3:"꾄";s:2:"";s:3:"꾅";s:2:"";s:3:"꾆";s:2:"";s:3:"꾇";s:2:"";s:3:"꾈";s:2:"";s:3:"꾉";s:2:"";s:3:"꾊";s:2:"";s:3:"꾋";s:2:"";s:3:"꾌";s:2:"";s:3:"꾍";s:2:"";s:3:"꾎";s:2:"";s:3:"꾏";s:2:"";s:3:"꾐";s:2:"";s:3:"꾑";s:2:"";s:3:"꾒";s:2:"";s:3:"꾓";s:2:"";s:3:"꾔";s:2:"";s:3:"꾕";s:2:"";s:3:"꾖";s:2:"";s:3:"꾗";s:2:"";s:3:"꾘";s:2:"";s:3:"꾙";s:2:"";s:3:"꾚";s:2:"";s:3:"꾛";s:2:"";s:3:"꾜";s:2:"";s:3:"꾝";s:2:"";s:3:"꾞";s:2:"";s:3:"꾟";s:2:"";s:3:"꾠";s:2:"";s:3:"꾡";s:2:"";s:3:"꾢";s:2:"";s:3:"꾣";s:2:"";s:3:"꾤";s:2:"";s:3:"꾥";s:2:"";s:3:"꾦";s:2:"";s:3:"꾧";s:2:"";s:3:"꾨";s:2:"";s:3:"꾩";s:2:"";s:3:"꾪";s:2:"";s:3:"꾫";s:2:"";s:3:"꾬";s:2:"";s:3:"꾭";s:2:"";s:3:"꾮";s:2:"";s:3:"꾯";s:2:"";s:3:"꾰";s:2:"";s:3:"꾱";s:2:"";s:3:"꾲";s:2:"";s:3:"꾳";s:2:"";s:3:"꾴";s:2:"";s:3:"꾵";s:2:"";s:3:"꾶";s:2:"";s:3:"꾷";s:2:"";s:3:"꾸";s:2:"";s:3:"꾹";s:2:"";s:3:"꾺";s:2:"";s:3:"꾻";s:2:"";s:3:"꾼";s:2:"";s:3:"꾽";s:2:"";s:3:"꾾";s:2:"";s:3:"꾿";s:2:"A";s:3:"꿀";s:2:"";s:3:"꿁";s:2:"B";s:3:"꿂";s:2:"C";s:3:"꿃";s:2:"D";s:3:"꿄";s:2:"E";s:3:"꿅";s:2:"F";s:3:"꿆";s:2:"G";s:3:"꿇";s:2:"";s:3:"꿈";s:2:"";s:3:"꿉";s:2:"";s:3:"꿊";s:2:"H";s:3:"꿋";s:2:"";s:3:"꿌";s:2:"I";s:3:"꿍";s:2:"";s:3:"꿎";s:2:"";s:3:"꿏";s:2:"J";s:3:"꿐";s:2:"K";s:3:"꿑";s:2:"L";s:3:"꿒";s:2:"M";s:3:"꿓";s:2:"N";s:3:"꿔";s:2:"";s:3:"꿕";s:2:"O";s:3:"꿖";s:2:"P";s:3:"꿗";s:2:"Q";s:3:"꿘";s:2:"R";s:3:"꿙";s:2:"S";s:3:"꿚";s:2:"T";s:3:"꿛";s:2:"U";s:3:"꿜";s:2:"";s:3:"꿝";s:2:"V";s:3:"꿞";s:2:"W";s:3:"꿟";s:2:"X";s:3:"꿠";s:2:"Y";s:3:"꿡";s:2:"Z";s:3:"꿢";s:2:"a";s:3:"꿣";s:2:"b";s:3:"꿤";s:2:"c";s:3:"꿥";s:2:"d";s:3:"꿦";s:2:"e";s:3:"꿧";s:2:"f";s:3:"꿨";s:2:"";s:3:"꿩";s:2:"";s:3:"꿪";s:2:"g";s:3:"꿫";s:2:"h";s:3:"꿬";s:2:"i";s:3:"꿭";s:2:"j";s:3:"꿮";s:2:"k";s:3:"꿯";s:2:"l";s:3:"꿰";s:2:"";s:3:"꿱";s:2:"";s:3:"꿲";s:2:"m";s:3:"꿳";s:2:"n";s:3:"꿴";s:2:"";s:3:"꿵";s:2:"o";s:3:"꿶";s:2:"p";s:3:"꿷";s:2:"q";s:3:"꿸";s:2:"";s:3:"꿹";s:2:"r";s:3:"꿺";s:2:"s";s:3:"꿻";s:2:"t";s:3:"꿼";s:2:"u";s:3:"꿽";s:2:"v";s:3:"꿾";s:2:"w";s:3:"꿿";s:2:"x";s:3:"뀀";s:2:"";s:3:"뀁";s:2:"";s:3:"뀂";s:2:"y";s:3:"뀃";s:2:"z";s:3:"뀄";s:2:"";s:3:"뀅";s:2:"";s:3:"뀆";s:2:"";s:3:"뀇";s:2:"";s:3:"뀈";s:2:"";s:3:"뀉";s:2:"";s:3:"뀊";s:2:"";s:3:"뀋";s:2:"";s:3:"뀌";s:2:"";s:3:"뀍";s:2:"";s:3:"뀎";s:2:"";s:3:"뀏";s:2:"";s:3:"뀐";s:2:"";s:3:"뀑";s:2:"";s:3:"뀒";s:2:"";s:3:"뀓";s:2:"";s:3:"뀔";s:2:"";s:3:"뀕";s:2:"";s:3:"뀖";s:2:"";s:3:"뀗";s:2:"";s:3:"뀘";s:2:"";s:3:"뀙";s:2:"";s:3:"뀚";s:2:"";s:3:"뀛";s:2:"";s:3:"뀜";s:2:"";s:3:"뀝";s:2:"";s:3:"뀞";s:2:"";s:3:"뀟";s:2:"";s:3:"뀠";s:2:"";s:3:"뀡";s:2:"";s:3:"뀢";s:2:"";s:3:"뀣";s:2:"";s:3:"뀤";s:2:"";s:3:"뀥";s:2:"";s:3:"뀦";s:2:"";s:3:"뀧";s:2:"";s:3:"뀨";s:2:"";s:3:"뀩";s:2:"";s:3:"뀪";s:2:"";s:3:"뀫";s:2:"";s:3:"뀬";s:2:"";s:3:"뀭";s:2:"";s:3:"뀮";s:2:"";s:3:"뀯";s:2:"";s:3:"뀰";s:2:"";s:3:"뀱";s:2:"";s:3:"뀲";s:2:"";s:3:"뀳";s:2:"";s:3:"뀴";s:2:"";s:3:"뀵";s:2:"";s:3:"뀶";s:2:"";s:3:"뀷";s:2:"";s:3:"뀸";s:2:"";s:3:"뀹";s:2:"";s:3:"뀺";s:2:"";s:3:"뀻";s:2:"";s:3:"뀼";s:2:"";s:3:"뀽";s:2:"";s:3:"뀾";s:2:"";s:3:"뀿";s:2:"";s:3:"끀";s:2:"";s:3:"끁";s:2:"";s:3:"끂";s:2:"";s:3:"끃";s:2:"";s:3:"끄";s:2:"";s:3:"끅";s:2:"";s:3:"끆";s:2:"";s:3:"끇";s:2:"";s:3:"끈";s:2:"";s:3:"끉";s:2:"";s:3:"끊";s:2:"";s:3:"끋";s:2:"";s:3:"끌";s:2:"";s:3:"끍";s:2:"";s:3:"끎";s:2:"";s:3:"끏";s:2:"";s:3:"끐";s:2:"";s:3:"끑";s:2:"";s:3:"끒";s:2:"";s:3:"끓";s:2:"";s:3:"끔";s:2:"";s:3:"끕";s:2:"";s:3:"끖";s:2:"";s:3:"끗";s:2:"";s:3:"끘";s:2:"";s:3:"끙";s:2:"";s:3:"끚";s:2:"";s:3:"끛";s:2:"";s:3:"끜";s:2:"";s:3:"끝";s:2:"";s:3:"끞";s:2:"";s:3:"끟";s:2:"";s:3:"끠";s:2:"";s:3:"끡";s:2:"";s:3:"끢";s:2:"";s:3:"끣";s:2:"";s:3:"끤";s:2:"";s:3:"끥";s:2:"";s:3:"끦";s:2:"";s:3:"끧";s:2:"";s:3:"끨";s:2:"";s:3:"끩";s:2:"";s:3:"끪";s:2:"";s:3:"끫";s:2:"";s:3:"끬";s:2:"";s:3:"끭";s:2:"";s:3:"끮";s:2:"";s:3:"끯";s:2:"";s:3:"끰";s:2:"";s:3:"끱";s:2:"";s:3:"끲";s:2:"";s:3:"끳";s:2:"";s:3:"끴";s:2:"";s:3:"끵";s:2:"";s:3:"끶";s:2:"";s:3:"끷";s:2:"";s:3:"끸";s:2:"";s:3:"끹";s:2:"";s:3:"끺";s:2:"";s:3:"끻";s:2:"";s:3:"끼";s:2:"";s:3:"끽";s:2:"";s:3:"끾";s:2:"";s:3:"끿";s:2:"";s:3:"낀";s:2:"";s:3:"낁";s:2:"";s:3:"낂";s:2:"";s:3:"낃";s:2:"";s:3:"낄";s:2:"";s:3:"낅";s:2:"";s:3:"낆";s:2:"";s:3:"낇";s:2:"";s:3:"낈";s:2:"";s:3:"낉";s:2:"";s:3:"낊";s:2:"";s:3:"낋";s:2:"";s:3:"낌";s:2:"";s:3:"낍";s:2:"";s:3:"낎";s:2:"";s:3:"낏";s:2:"";s:3:"낐";s:2:"";s:3:"낑";s:2:"";s:3:"낒";s:2:"";s:3:"낓";s:2:"";s:3:"낔";s:2:"";s:3:"낕";s:2:"";s:3:"낖";s:2:"";s:3:"낗";s:2:"";s:3:"나";s:2:"";s:3:"낙";s:2:"";s:3:"낚";s:2:"";s:3:"낛";s:2:"";s:3:"난";s:2:"";s:3:"낝";s:2:"";s:3:"낞";s:2:"";s:3:"낟";s:2:"";s:3:"날";s:2:"";s:3:"낡";s:2:"";s:3:"낢";s:2:"";s:3:"낣";s:2:"";s:3:"낤";s:2:"";s:3:"낥";s:2:"A";s:3:"낦";s:2:"B";s:3:"낧";s:2:"C";s:3:"남";s:2:"";s:3:"납";s:2:"";s:3:"낪";s:2:"D";s:3:"낫";s:2:"";s:3:"났";s:2:"";s:3:"낭";s:2:"";s:3:"낮";s:2:"";s:3:"낯";s:2:"";s:3:"낰";s:2:"E";s:3:"낱";s:2:"";s:3:"낲";s:2:"F";s:3:"낳";s:2:"";s:3:"내";s:2:"";s:3:"낵";s:2:"";s:3:"낶";s:2:"G";s:3:"낷";s:2:"H";s:3:"낸";s:2:"";s:3:"낹";s:2:"I";s:3:"낺";s:2:"J";s:3:"낻";s:2:"K";s:3:"낼";s:2:"";s:3:"낽";s:2:"L";s:3:"낾";s:2:"M";s:3:"낿";s:2:"N";s:3:"냀";s:2:"O";s:3:"냁";s:2:"P";s:3:"냂";s:2:"Q";s:3:"냃";s:2:"R";s:3:"냄";s:2:"";s:3:"냅";s:2:"";s:3:"냆";s:2:"S";s:3:"냇";s:2:"";s:3:"냈";s:2:"";s:3:"냉";s:2:"";s:3:"냊";s:2:"T";s:3:"냋";s:2:"U";s:3:"냌";s:2:"V";s:3:"냍";s:2:"W";s:3:"냎";s:2:"X";s:3:"냏";s:2:"Y";s:3:"냐";s:2:"";s:3:"냑";s:2:"";s:3:"냒";s:2:"Z";s:3:"냓";s:2:"a";s:3:"냔";s:2:"";s:3:"냕";s:2:"b";s:3:"냖";s:2:"c";s:3:"냗";s:2:"d";s:3:"냘";s:2:"";s:3:"냙";s:2:"e";s:3:"냚";s:2:"f";s:3:"냛";s:2:"g";s:3:"냜";s:2:"h";s:3:"냝";s:2:"i";s:3:"냞";s:2:"j";s:3:"냟";s:2:"k";s:3:"냠";s:2:"";s:3:"냡";s:2:"l";s:3:"냢";s:2:"m";s:3:"냣";s:2:"n";s:3:"냤";s:2:"o";s:3:"냥";s:2:"";s:3:"냦";s:2:"p";s:3:"냧";s:2:"q";s:3:"냨";s:2:"r";s:3:"냩";s:2:"s";s:3:"냪";s:2:"t";s:3:"냫";s:2:"u";s:3:"냬";s:2:"v";s:3:"냭";s:2:"w";s:3:"냮";s:2:"x";s:3:"냯";s:2:"y";s:3:"냰";s:2:"z";s:3:"냱";s:2:"";s:3:"냲";s:2:"";s:3:"냳";s:2:"";s:3:"냴";s:2:"";s:3:"냵";s:2:"";s:3:"냶";s:2:"";s:3:"냷";s:2:"";s:3:"냸";s:2:"";s:3:"냹";s:2:"";s:3:"냺";s:2:"";s:3:"냻";s:2:"";s:3:"냼";s:2:"";s:3:"냽";s:2:"";s:3:"냾";s:2:"";s:3:"냿";s:2:"";s:3:"넀";s:2:"";s:3:"넁";s:2:"";s:3:"넂";s:2:"";s:3:"넃";s:2:"";s:3:"넄";s:2:"";s:3:"넅";s:2:"";s:3:"넆";s:2:"";s:3:"넇";s:2:"";s:3:"너";s:2:"";s:3:"넉";s:2:"";s:3:"넊";s:2:"";s:3:"넋";s:2:"";s:3:"넌";s:2:"";s:3:"넍";s:2:"";s:3:"넎";s:2:"";s:3:"넏";s:2:"";s:3:"널";s:2:"";s:3:"넑";s:2:"";s:3:"넒";s:2:"";s:3:"넓";s:2:"";s:3:"넔";s:2:"";s:3:"넕";s:2:"";s:3:"넖";s:2:"";s:3:"넗";s:2:"";s:3:"넘";s:2:"";s:3:"넙";s:2:"";s:3:"넚";s:2:"";s:3:"넛";s:2:"";s:3:"넜";s:2:"";s:3:"넝";s:2:"";s:3:"넞";s:2:"";s:3:"넟";s:2:"";s:3:"넠";s:2:"";s:3:"넡";s:2:"";s:3:"넢";s:2:"";s:3:"넣";s:2:"";s:3:"네";s:2:"";s:3:"넥";s:2:"";s:3:"넦";s:2:"";s:3:"넧";s:2:"";s:3:"넨";s:2:"";s:3:"넩";s:2:"";s:3:"넪";s:2:"";s:3:"넫";s:2:"";s:3:"넬";s:2:"";s:3:"넭";s:2:"";s:3:"넮";s:2:"";s:3:"넯";s:2:"";s:3:"넰";s:2:"";s:3:"넱";s:2:"";s:3:"넲";s:2:"";s:3:"넳";s:2:"";s:3:"넴";s:2:"";s:3:"넵";s:2:"";s:3:"넶";s:2:"";s:3:"넷";s:2:"";s:3:"넸";s:2:"";s:3:"넹";s:2:"";s:3:"넺";s:2:"";s:3:"넻";s:2:"";s:3:"넼";s:2:"";s:3:"넽";s:2:"";s:3:"넾";s:2:"";s:3:"넿";s:2:"";s:3:"녀";s:2:"";s:3:"녁";s:2:"";s:3:"녂";s:2:"";s:3:"녃";s:2:"";s:3:"년";s:2:"";s:3:"녅";s:2:"";s:3:"녆";s:2:"";s:3:"녇";s:2:"";s:3:"녈";s:2:"";s:3:"녉";s:2:"";s:3:"녊";s:2:"";s:3:"녋";s:2:"";s:3:"녌";s:2:"";s:3:"녍";s:2:"";s:3:"녎";s:2:"";s:3:"녏";s:2:"";s:3:"념";s:2:"";s:3:"녑";s:2:"";s:3:"녒";s:2:"";s:3:"녓";s:2:"";s:3:"녔";s:2:"";s:3:"녕";s:2:"";s:3:"녖";s:2:"";s:3:"녗";s:2:"";s:3:"녘";s:2:"";s:3:"녙";s:2:"";s:3:"녚";s:2:"";s:3:"녛";s:2:"";s:3:"녜";s:2:"";s:3:"녝";s:2:"";s:3:"녞";s:2:"";s:3:"녟";s:2:"";s:3:"녠";s:2:"";s:3:"녡";s:2:"";s:3:"녢";s:2:"";s:3:"녣";s:2:"";s:3:"녤";s:2:"";s:3:"녥";s:2:"";s:3:"녦";s:2:"";s:3:"녧";s:2:"";s:3:"녨";s:2:"";s:3:"녩";s:2:"";s:3:"녪";s:2:"";s:3:"녫";s:2:"";s:3:"녬";s:2:"";s:3:"녭";s:2:"";s:3:"녮";s:2:"";s:3:"녯";s:2:"";s:3:"녰";s:2:"";s:3:"녱";s:2:"";s:3:"녲";s:2:"";s:3:"녳";s:2:"";s:3:"녴";s:2:"";s:3:"녵";s:2:"";s:3:"녶";s:2:"";s:3:"녷";s:2:"";s:3:"노";s:2:"";s:3:"녹";s:2:"";s:3:"녺";s:2:"";s:3:"녻";s:2:"";s:3:"논";s:2:"";s:3:"녽";s:2:"";s:3:"녾";s:2:"";s:3:"녿";s:2:"";s:3:"놀";s:2:"";s:3:"놁";s:2:"";s:3:"놂";s:2:"";s:3:"놃";s:2:"";s:3:"놄";s:2:"";s:3:"놅";s:2:"";s:3:"놆";s:2:"";s:3:"놇";s:2:"";s:3:"놈";s:2:"";s:3:"놉";s:2:"";s:3:"놊";s:2:"";s:3:"놋";s:2:"";s:3:"놌";s:2:"";s:3:"농";s:2:"";s:3:"놎";s:2:"";s:3:"놏";s:2:"";s:3:"놐";s:2:"";s:3:"놑";s:2:"";s:3:"높";s:2:"";s:3:"놓";s:2:"";s:3:"놔";s:2:"";s:3:"놕";s:2:"";s:3:"놖";s:2:"";s:3:"놗";s:2:"";s:3:"놘";s:2:"";s:3:"놙";s:2:"";s:3:"놚";s:2:"";s:3:"놛";s:2:"";s:3:"놜";s:2:"";s:3:"놝";s:2:"";s:3:"놞";s:2:"A";s:3:"놟";s:2:"B";s:3:"놠";s:2:"C";s:3:"놡";s:2:"D";s:3:"놢";s:2:"E";s:3:"놣";s:2:"F";s:3:"놤";s:2:"G";s:3:"놥";s:2:"H";s:3:"놦";s:2:"I";s:3:"놧";s:2:"J";s:3:"놨";s:2:"";s:3:"놩";s:2:"K";s:3:"놪";s:2:"L";s:3:"놫";s:2:"M";s:3:"놬";s:2:"N";s:3:"놭";s:2:"O";s:3:"놮";s:2:"P";s:3:"놯";s:2:"Q";s:3:"놰";s:2:"R";s:3:"놱";s:2:"S";s:3:"놲";s:2:"T";s:3:"놳";s:2:"U";s:3:"놴";s:2:"V";s:3:"놵";s:2:"W";s:3:"놶";s:2:"X";s:3:"놷";s:2:"Y";s:3:"놸";s:2:"Z";s:3:"놹";s:2:"a";s:3:"놺";s:2:"b";s:3:"놻";s:2:"c";s:3:"놼";s:2:"d";s:3:"놽";s:2:"e";s:3:"놾";s:2:"f";s:3:"놿";s:2:"g";s:3:"뇀";s:2:"h";s:3:"뇁";s:2:"i";s:3:"뇂";s:2:"j";s:3:"뇃";s:2:"k";s:3:"뇄";s:2:"l";s:3:"뇅";s:2:"m";s:3:"뇆";s:2:"n";s:3:"뇇";s:2:"o";s:3:"뇈";s:2:"p";s:3:"뇉";s:2:"q";s:3:"뇊";s:2:"r";s:3:"뇋";s:2:"s";s:3:"뇌";s:2:"";s:3:"뇍";s:2:"t";s:3:"뇎";s:2:"u";s:3:"뇏";s:2:"v";s:3:"뇐";s:2:"";s:3:"뇑";s:2:"w";s:3:"뇒";s:2:"x";s:3:"뇓";s:2:"y";s:3:"뇔";s:2:"";s:3:"뇕";s:2:"z";s:3:"뇖";s:2:"";s:3:"뇗";s:2:"";s:3:"뇘";s:2:"";s:3:"뇙";s:2:"";s:3:"뇚";s:2:"";s:3:"뇛";s:2:"";s:3:"뇜";s:2:"";s:3:"뇝";s:2:"";s:3:"뇞";s:2:"";s:3:"뇟";s:2:"";s:3:"뇠";s:2:"";s:3:"뇡";s:2:"";s:3:"뇢";s:2:"";s:3:"뇣";s:2:"";s:3:"뇤";s:2:"";s:3:"뇥";s:2:"";s:3:"뇦";s:2:"";s:3:"뇧";s:2:"";s:3:"뇨";s:2:"";s:3:"뇩";s:2:"";s:3:"뇪";s:2:"";s:3:"뇫";s:2:"";s:3:"뇬";s:2:"";s:3:"뇭";s:2:"";s:3:"뇮";s:2:"";s:3:"뇯";s:2:"";s:3:"뇰";s:2:"";s:3:"뇱";s:2:"";s:3:"뇲";s:2:"";s:3:"뇳";s:2:"";s:3:"뇴";s:2:"";s:3:"뇵";s:2:"";s:3:"뇶";s:2:"";s:3:"뇷";s:2:"";s:3:"뇸";s:2:"";s:3:"뇹";s:2:"";s:3:"뇺";s:2:"";s:3:"뇻";s:2:"";s:3:"뇼";s:2:"";s:3:"뇽";s:2:"";s:3:"뇾";s:2:"";s:3:"뇿";s:2:"";s:3:"눀";s:2:"";s:3:"눁";s:2:"";s:3:"눂";s:2:"";s:3:"눃";s:2:"";s:3:"누";s:2:"";s:3:"눅";s:2:"";s:3:"눆";s:2:"";s:3:"눇";s:2:"";s:3:"눈";s:2:"";s:3:"눉";s:2:"";s:3:"눊";s:2:"";s:3:"눋";s:2:"";s:3:"눌";s:2:"";s:3:"눍";s:2:"";s:3:"눎";s:2:"";s:3:"눏";s:2:"";s:3:"눐";s:2:"";s:3:"눑";s:2:"";s:3:"눒";s:2:"";s:3:"눓";s:2:"";s:3:"눔";s:2:"";s:3:"눕";s:2:"";s:3:"눖";s:2:"";s:3:"눗";s:2:"";s:3:"눘";s:2:"";s:3:"눙";s:2:"";s:3:"눚";s:2:"";s:3:"눛";s:2:"";s:3:"눜";s:2:"";s:3:"눝";s:2:"";s:3:"눞";s:2:"";s:3:"눟";s:2:"";s:3:"눠";s:2:"";s:3:"눡";s:2:"";s:3:"눢";s:2:"";s:3:"눣";s:2:"";s:3:"눤";s:2:"";s:3:"눥";s:2:"";s:3:"눦";s:2:"";s:3:"눧";s:2:"";s:3:"눨";s:2:"";s:3:"눩";s:2:"";s:3:"눪";s:2:"";s:3:"눫";s:2:"";s:3:"눬";s:2:"";s:3:"눭";s:2:"";s:3:"눮";s:2:"";s:3:"눯";s:2:"";s:3:"눰";s:2:"";s:3:"눱";s:2:"";s:3:"눲";s:2:"";s:3:"눳";s:2:"";s:3:"눴";s:2:"";s:3:"눵";s:2:"";s:3:"눶";s:2:"";s:3:"눷";s:2:"";s:3:"눸";s:2:"";s:3:"눹";s:2:"";s:3:"눺";s:2:"";s:3:"눻";s:2:"";s:3:"눼";s:2:"";s:3:"눽";s:2:"";s:3:"눾";s:2:"";s:3:"눿";s:2:"";s:3:"뉀";s:2:"";s:3:"뉁";s:2:"";s:3:"뉂";s:2:"";s:3:"뉃";s:2:"";s:3:"뉄";s:2:"";s:3:"뉅";s:2:"";s:3:"뉆";s:2:"";s:3:"뉇";s:2:"";s:3:"뉈";s:2:"";s:3:"뉉";s:2:"";s:3:"뉊";s:2:"";s:3:"뉋";s:2:"";s:3:"뉌";s:2:"";s:3:"뉍";s:2:"";s:3:"뉎";s:2:"";s:3:"뉏";s:2:"";s:3:"뉐";s:2:"";s:3:"뉑";s:2:"";s:3:"뉒";s:2:"";s:3:"뉓";s:2:"";s:3:"뉔";s:2:"";s:3:"뉕";s:2:"";s:3:"뉖";s:2:"";s:3:"뉗";s:2:"";s:3:"뉘";s:2:"";s:3:"뉙";s:2:"";s:3:"뉚";s:2:"";s:3:"뉛";s:2:"";s:3:"뉜";s:2:"";s:3:"뉝";s:2:"";s:3:"뉞";s:2:"";s:3:"뉟";s:2:"";s:3:"뉠";s:2:"";s:3:"뉡";s:2:"";s:3:"뉢";s:2:"";s:3:"뉣";s:2:"";s:3:"뉤";s:2:"";s:3:"뉥";s:2:"";s:3:"뉦";s:2:"";s:3:"뉧";s:2:"";s:3:"뉨";s:2:"";s:3:"뉩";s:2:"";s:3:"뉪";s:2:"";s:3:"뉫";s:2:"";s:3:"뉬";s:2:"";s:3:"뉭";s:2:"";s:3:"뉮";s:2:"";s:3:"뉯";s:2:"A";s:3:"뉰";s:2:"B";s:3:"뉱";s:2:"C";s:3:"뉲";s:2:"D";s:3:"뉳";s:2:"E";s:3:"뉴";s:2:"";s:3:"뉵";s:2:"";s:3:"뉶";s:2:"F";s:3:"뉷";s:2:"G";s:3:"뉸";s:2:"H";s:3:"뉹";s:2:"I";s:3:"뉺";s:2:"J";s:3:"뉻";s:2:"K";s:3:"뉼";s:2:"";s:3:"뉽";s:2:"L";s:3:"뉾";s:2:"M";s:3:"뉿";s:2:"N";s:3:"늀";s:2:"O";s:3:"늁";s:2:"P";s:3:"늂";s:2:"Q";s:3:"늃";s:2:"R";s:3:"늄";s:2:"";s:3:"늅";s:2:"";s:3:"늆";s:2:"S";s:3:"늇";s:2:"T";s:3:"늈";s:2:"U";s:3:"늉";s:2:"";s:3:"늊";s:2:"V";s:3:"늋";s:2:"W";s:3:"늌";s:2:"X";s:3:"늍";s:2:"Y";s:3:"늎";s:2:"Z";s:3:"늏";s:2:"a";s:3:"느";s:2:"";s:3:"늑";s:2:"";s:3:"늒";s:2:"b";s:3:"늓";s:2:"c";s:3:"는";s:2:"";s:3:"늕";s:2:"d";s:3:"늖";s:2:"e";s:3:"늗";s:2:"f";s:3:"늘";s:2:"";s:3:"늙";s:2:"";s:3:"늚";s:2:"";s:3:"늛";s:2:"g";s:3:"늜";s:2:"h";s:3:"늝";s:2:"i";s:3:"늞";s:2:"j";s:3:"늟";s:2:"k";s:3:"늠";s:2:"";s:3:"늡";s:2:"";s:3:"늢";s:2:"l";s:3:"늣";s:2:"";s:3:"늤";s:2:"m";s:3:"능";s:2:"";s:3:"늦";s:2:"";s:3:"늧";s:2:"n";s:3:"늨";s:2:"o";s:3:"늩";s:2:"p";s:3:"늪";s:2:"";s:3:"늫";s:2:"q";s:3:"늬";s:2:"";s:3:"늭";s:2:"r";s:3:"늮";s:2:"s";s:3:"늯";s:2:"t";s:3:"늰";s:2:"";s:3:"늱";s:2:"u";s:3:"늲";s:2:"v";s:3:"늳";s:2:"w";s:3:"늴";s:2:"";s:3:"늵";s:2:"x";s:3:"늶";s:2:"y";s:3:"늷";s:2:"z";s:3:"늸";s:2:"";s:3:"늹";s:2:"";s:3:"늺";s:2:"";s:3:"늻";s:2:"";s:3:"늼";s:2:"";s:3:"늽";s:2:"";s:3:"늾";s:2:"";s:3:"늿";s:2:"";s:3:"닀";s:2:"";s:3:"닁";s:2:"";s:3:"닂";s:2:"";s:3:"닃";s:2:"";s:3:"닄";s:2:"";s:3:"닅";s:2:"";s:3:"닆";s:2:"";s:3:"닇";s:2:"";s:3:"니";s:2:"";s:3:"닉";s:2:"";s:3:"닊";s:2:"";s:3:"닋";s:2:"";s:3:"닌";s:2:"";s:3:"닍";s:2:"";s:3:"닎";s:2:"";s:3:"닏";s:2:"";s:3:"닐";s:2:"";s:3:"닑";s:2:"";s:3:"닒";s:2:"";s:3:"닓";s:2:"";s:3:"닔";s:2:"";s:3:"닕";s:2:"";s:3:"닖";s:2:"";s:3:"닗";s:2:"";s:3:"님";s:2:"";s:3:"닙";s:2:"";s:3:"닚";s:2:"";s:3:"닛";s:2:"";s:3:"닜";s:2:"";s:3:"닝";s:2:"";s:3:"닞";s:2:"";s:3:"닟";s:2:"";s:3:"닠";s:2:"";s:3:"닡";s:2:"";s:3:"닢";s:2:"";s:3:"닣";s:2:"";s:3:"다";s:2:"";s:3:"닥";s:2:"";s:3:"닦";s:2:"";s:3:"닧";s:2:"";s:3:"단";s:2:"";s:3:"닩";s:2:"";s:3:"닪";s:2:"";s:3:"닫";s:2:"";s:3:"달";s:2:"";s:3:"닭";s:2:"";s:3:"닮";s:2:"";s:3:"닯";s:2:"";s:3:"닰";s:2:"";s:3:"닱";s:2:"";s:3:"닲";s:2:"";s:3:"닳";s:2:"";s:3:"담";s:2:"";s:3:"답";s:2:"";s:3:"닶";s:2:"";s:3:"닷";s:2:"";s:3:"닸";s:2:"";s:3:"당";s:2:"";s:3:"닺";s:2:"";s:3:"닻";s:2:"";s:3:"닼";s:2:"";s:3:"닽";s:2:"";s:3:"닾";s:2:"";s:3:"닿";s:2:"";s:3:"대";s:2:"";s:3:"댁";s:2:"";s:3:"댂";s:2:"";s:3:"댃";s:2:"";s:3:"댄";s:2:"";s:3:"댅";s:2:"";s:3:"댆";s:2:"";s:3:"댇";s:2:"";s:3:"댈";s:2:"";s:3:"댉";s:2:"";s:3:"댊";s:2:"";s:3:"댋";s:2:"";s:3:"댌";s:2:"";s:3:"댍";s:2:"";s:3:"댎";s:2:"";s:3:"댏";s:2:"";s:3:"댐";s:2:"";s:3:"댑";s:2:"";s:3:"댒";s:2:"";s:3:"댓";s:2:"";s:3:"댔";s:2:"";s:3:"댕";s:2:"";s:3:"댖";s:2:"";s:3:"댗";s:2:"";s:3:"댘";s:2:"";s:3:"댙";s:2:"";s:3:"댚";s:2:"";s:3:"댛";s:2:"";s:3:"댜";s:2:"";s:3:"댝";s:2:"";s:3:"댞";s:2:"";s:3:"댟";s:2:"";s:3:"댠";s:2:"";s:3:"댡";s:2:"";s:3:"댢";s:2:"";s:3:"댣";s:2:"";s:3:"댤";s:2:"";s:3:"댥";s:2:"";s:3:"댦";s:2:"";s:3:"댧";s:2:"";s:3:"댨";s:2:"";s:3:"댩";s:2:"";s:3:"댪";s:2:"";s:3:"댫";s:2:"";s:3:"댬";s:2:"";s:3:"댭";s:2:"";s:3:"댮";s:2:"";s:3:"댯";s:2:"";s:3:"댰";s:2:"";s:3:"댱";s:2:"";s:3:"댲";s:2:"";s:3:"댳";s:2:"";s:3:"댴";s:2:"";s:3:"댵";s:2:"";s:3:"댶";s:2:"";s:3:"댷";s:2:"";s:3:"댸";s:2:"";s:3:"댹";s:2:"";s:3:"댺";s:2:"";s:3:"댻";s:2:"";s:3:"댼";s:2:"";s:3:"댽";s:2:"";s:3:"댾";s:2:"";s:3:"댿";s:2:"";s:3:"덀";s:2:"";s:3:"덁";s:2:"";s:3:"덂";s:2:"";s:3:"덃";s:2:"";s:3:"덄";s:2:"";s:3:"덅";s:2:"";s:3:"덆";s:2:"";s:3:"덇";s:2:"";s:3:"덈";s:2:"";s:3:"덉";s:2:"";s:3:"덊";s:2:"";s:3:"덋";s:2:"";s:3:"덌";s:2:"";s:3:"덍";s:2:"";s:3:"덎";s:2:"";s:3:"덏";s:2:"";s:3:"덐";s:2:"";s:3:"덑";s:2:"";s:3:"덒";s:2:"";s:3:"덓";s:2:"";s:3:"더";s:2:"";s:3:"덕";s:2:"";s:3:"덖";s:2:"";s:3:"덗";s:2:"";s:3:"던";s:2:"";s:3:"덙";s:2:"";s:3:"덚";s:2:"";s:3:"덛";s:2:"";s:3:"덜";s:2:"";s:3:"덝";s:2:"";s:3:"덞";s:2:"";s:3:"덟";s:2:"";s:3:"덠";s:2:"";s:3:"덡";s:2:"";s:3:"덢";s:2:"";s:3:"덣";s:2:"";s:3:"덤";s:2:"";s:3:"덥";s:2:"";s:3:"덦";s:2:"A";s:3:"덧";s:2:"";s:3:"덨";s:2:"B";s:3:"덩";s:2:"";s:3:"덪";s:2:"C";s:3:"덫";s:2:"";s:3:"덬";s:2:"D";s:3:"덭";s:2:"E";s:3:"덮";s:2:"";s:3:"덯";s:2:"F";s:3:"데";s:2:"";s:3:"덱";s:2:"";s:3:"덲";s:2:"G";s:3:"덳";s:2:"H";s:3:"덴";s:2:"";s:3:"덵";s:2:"I";s:3:"덶";s:2:"J";s:3:"덷";s:2:"K";s:3:"델";s:2:"";s:3:"덹";s:2:"L";s:3:"덺";s:2:"M";s:3:"덻";s:2:"N";s:3:"덼";s:2:"O";s:3:"덽";s:2:"P";s:3:"덾";s:2:"Q";s:3:"덿";s:2:"R";s:3:"뎀";s:2:"";s:3:"뎁";s:2:"";s:3:"뎂";s:2:"S";s:3:"뎃";s:2:"";s:3:"뎄";s:2:"";s:3:"뎅";s:2:"";s:3:"뎆";s:2:"T";s:3:"뎇";s:2:"U";s:3:"뎈";s:2:"V";s:3:"뎉";s:2:"W";s:3:"뎊";s:2:"X";s:3:"뎋";s:2:"Y";s:3:"뎌";s:2:"";s:3:"뎍";s:2:"Z";s:3:"뎎";s:2:"a";s:3:"뎏";s:2:"b";s:3:"뎐";s:2:"";s:3:"뎑";s:2:"c";s:3:"뎒";s:2:"d";s:3:"뎓";s:2:"e";s:3:"뎔";s:2:"";s:3:"뎕";s:2:"f";s:3:"뎖";s:2:"g";s:3:"뎗";s:2:"h";s:3:"뎘";s:2:"i";s:3:"뎙";s:2:"j";s:3:"뎚";s:2:"k";s:3:"뎛";s:2:"l";s:3:"뎜";s:2:"m";s:3:"뎝";s:2:"n";s:3:"뎞";s:2:"o";s:3:"뎟";s:2:"p";s:3:"뎠";s:2:"";s:3:"뎡";s:2:"";s:3:"뎢";s:2:"q";s:3:"뎣";s:2:"r";s:3:"뎤";s:2:"s";s:3:"뎥";s:2:"t";s:3:"뎦";s:2:"u";s:3:"뎧";s:2:"v";s:3:"뎨";s:2:"";s:3:"뎩";s:2:"w";s:3:"뎪";s:2:"x";s:3:"뎫";s:2:"y";s:3:"뎬";s:2:"";s:3:"뎭";s:2:"z";s:3:"뎮";s:2:"";s:3:"뎯";s:2:"";s:3:"뎰";s:2:"";s:3:"뎱";s:2:"";s:3:"뎲";s:2:"";s:3:"뎳";s:2:"";s:3:"뎴";s:2:"";s:3:"뎵";s:2:"";s:3:"뎶";s:2:"";s:3:"뎷";s:2:"";s:3:"뎸";s:2:"";s:3:"뎹";s:2:"";s:3:"뎺";s:2:"";s:3:"뎻";s:2:"";s:3:"뎼";s:2:"";s:3:"뎽";s:2:"";s:3:"뎾";s:2:"";s:3:"뎿";s:2:"";s:3:"돀";s:2:"";s:3:"돁";s:2:"";s:3:"돂";s:2:"";s:3:"돃";s:2:"";s:3:"도";s:2:"";s:3:"독";s:2:"";s:3:"돆";s:2:"";s:3:"돇";s:2:"";s:3:"돈";s:2:"";s:3:"돉";s:2:"";s:3:"돊";s:2:"";s:3:"돋";s:2:"";s:3:"돌";s:2:"";s:3:"돍";s:2:"";s:3:"돎";s:2:"";s:3:"돏";s:2:"";s:3:"돐";s:2:"";s:3:"돑";s:2:"";s:3:"돒";s:2:"";s:3:"돓";s:2:"";s:3:"돔";s:2:"";s:3:"돕";s:2:"";s:3:"돖";s:2:"";s:3:"돗";s:2:"";s:3:"돘";s:2:"";s:3:"동";s:2:"";s:3:"돚";s:2:"";s:3:"돛";s:2:"";s:3:"돜";s:2:"";s:3:"돝";s:2:"";s:3:"돞";s:2:"";s:3:"돟";s:2:"";s:3:"돠";s:2:"";s:3:"돡";s:2:"";s:3:"돢";s:2:"";s:3:"돣";s:2:"";s:3:"돤";s:2:"";s:3:"돥";s:2:"";s:3:"돦";s:2:"";s:3:"돧";s:2:"";s:3:"돨";s:2:"";s:3:"돩";s:2:"";s:3:"돪";s:2:"";s:3:"돫";s:2:"";s:3:"돬";s:2:"";s:3:"돭";s:2:"";s:3:"돮";s:2:"";s:3:"돯";s:2:"";s:3:"돰";s:2:"";s:3:"돱";s:2:"";s:3:"돲";s:2:"";s:3:"돳";s:2:"";s:3:"돴";s:2:"";s:3:"돵";s:2:"";s:3:"돶";s:2:"";s:3:"돷";s:2:"";s:3:"돸";s:2:"";s:3:"돹";s:2:"";s:3:"돺";s:2:"";s:3:"돻";s:2:"";s:3:"돼";s:2:"";s:3:"돽";s:2:"";s:3:"돾";s:2:"";s:3:"돿";s:2:"";s:3:"됀";s:2:"";s:3:"됁";s:2:"";s:3:"됂";s:2:"";s:3:"됃";s:2:"";s:3:"됄";s:2:"";s:3:"됅";s:2:"";s:3:"됆";s:2:"";s:3:"됇";s:2:"";s:3:"됈";s:2:"";s:3:"됉";s:2:"";s:3:"됊";s:2:"";s:3:"됋";s:2:"";s:3:"됌";s:2:"";s:3:"됍";s:2:"";s:3:"됎";s:2:"";s:3:"됏";s:2:"";s:3:"됐";s:2:"";s:3:"됑";s:2:"";s:3:"됒";s:2:"";s:3:"됓";s:2:"";s:3:"됔";s:2:"";s:3:"됕";s:2:"";s:3:"됖";s:2:"";s:3:"됗";s:2:"";s:3:"되";s:2:"";s:3:"됙";s:2:"";s:3:"됚";s:2:"";s:3:"됛";s:2:"";s:3:"된";s:2:"";s:3:"됝";s:2:"";s:3:"됞";s:2:"";s:3:"됟";s:2:"";s:3:"될";s:2:"";s:3:"됡";s:2:"";s:3:"됢";s:2:"";s:3:"됣";s:2:"";s:3:"됤";s:2:"";s:3:"됥";s:2:"";s:3:"됦";s:2:"";s:3:"됧";s:2:"";s:3:"됨";s:2:"";s:3:"됩";s:2:"";s:3:"됪";s:2:"";s:3:"됫";s:2:"";s:3:"됬";s:2:"";s:3:"됭";s:2:"";s:3:"됮";s:2:"";s:3:"됯";s:2:"";s:3:"됰";s:2:"";s:3:"됱";s:2:"";s:3:"됲";s:2:"";s:3:"됳";s:2:"";s:3:"됴";s:2:"";s:3:"됵";s:2:"";s:3:"됶";s:2:"";s:3:"됷";s:2:"";s:3:"됸";s:2:"";s:3:"됹";s:2:"";s:3:"됺";s:2:"";s:3:"됻";s:2:"";s:3:"됼";s:2:"";s:3:"됽";s:2:"";s:3:"됾";s:2:"";s:3:"됿";s:2:"";s:3:"둀";s:2:"";s:3:"둁";s:2:"";s:3:"둂";s:2:"";s:3:"둃";s:2:"";s:3:"둄";s:2:"";s:3:"둅";s:2:"A";s:3:"둆";s:2:"B";s:3:"둇";s:2:"C";s:3:"둈";s:2:"D";s:3:"둉";s:2:"E";s:3:"둊";s:2:"F";s:3:"둋";s:2:"G";s:3:"둌";s:2:"H";s:3:"둍";s:2:"I";s:3:"둎";s:2:"J";s:3:"둏";s:2:"K";s:3:"두";s:2:"";s:3:"둑";s:2:"";s:3:"둒";s:2:"L";s:3:"둓";s:2:"M";s:3:"둔";s:2:"";s:3:"둕";s:2:"N";s:3:"둖";s:2:"O";s:3:"둗";s:2:"P";s:3:"둘";s:2:"";s:3:"둙";s:2:"Q";s:3:"둚";s:2:"R";s:3:"둛";s:2:"S";s:3:"둜";s:2:"T";s:3:"둝";s:2:"U";s:3:"둞";s:2:"V";s:3:"둟";s:2:"W";s:3:"둠";s:2:"";s:3:"둡";s:2:"";s:3:"둢";s:2:"X";s:3:"둣";s:2:"";s:3:"둤";s:2:"Y";s:3:"둥";s:2:"";s:3:"둦";s:2:"Z";s:3:"둧";s:2:"a";s:3:"둨";s:2:"b";s:3:"둩";s:2:"c";s:3:"둪";s:2:"d";s:3:"둫";s:2:"e";s:3:"둬";s:2:"";s:3:"둭";s:2:"f";s:3:"둮";s:2:"g";s:3:"둯";s:2:"h";s:3:"둰";s:2:"i";s:3:"둱";s:2:"j";s:3:"둲";s:2:"k";s:3:"둳";s:2:"l";s:3:"둴";s:2:"m";s:3:"둵";s:2:"n";s:3:"둶";s:2:"o";s:3:"둷";s:2:"p";s:3:"둸";s:2:"q";s:3:"둹";s:2:"r";s:3:"둺";s:2:"s";s:3:"둻";s:2:"t";s:3:"둼";s:2:"u";s:3:"둽";s:2:"v";s:3:"둾";s:2:"w";s:3:"둿";s:2:"x";s:3:"뒀";s:2:"";s:3:"뒁";s:2:"y";s:3:"뒂";s:2:"z";s:3:"뒃";s:2:"";s:3:"뒄";s:2:"";s:3:"뒅";s:2:"";s:3:"뒆";s:2:"";s:3:"뒇";s:2:"";s:3:"뒈";s:2:"";s:3:"뒉";s:2:"";s:3:"뒊";s:2:"";s:3:"뒋";s:2:"";s:3:"뒌";s:2:"";s:3:"뒍";s:2:"";s:3:"뒎";s:2:"";s:3:"뒏";s:2:"";s:3:"뒐";s:2:"";s:3:"뒑";s:2:"";s:3:"뒒";s:2:"";s:3:"뒓";s:2:"";s:3:"뒔";s:2:"";s:3:"뒕";s:2:"";s:3:"뒖";s:2:"";s:3:"뒗";s:2:"";s:3:"뒘";s:2:"";s:3:"뒙";s:2:"";s:3:"뒚";s:2:"";s:3:"뒛";s:2:"";s:3:"뒜";s:2:"";s:3:"뒝";s:2:"";s:3:"뒞";s:2:"";s:3:"뒟";s:2:"";s:3:"뒠";s:2:"";s:3:"뒡";s:2:"";s:3:"뒢";s:2:"";s:3:"뒣";s:2:"";s:3:"뒤";s:2:"";s:3:"뒥";s:2:"";s:3:"뒦";s:2:"";s:3:"뒧";s:2:"";s:3:"뒨";s:2:"";s:3:"뒩";s:2:"";s:3:"뒪";s:2:"";s:3:"뒫";s:2:"";s:3:"뒬";s:2:"";s:3:"뒭";s:2:"";s:3:"뒮";s:2:"";s:3:"뒯";s:2:"";s:3:"뒰";s:2:"";s:3:"뒱";s:2:"";s:3:"뒲";s:2:"";s:3:"뒳";s:2:"";s:3:"뒴";s:2:"";s:3:"뒵";s:2:"";s:3:"뒶";s:2:"";s:3:"뒷";s:2:"";s:3:"뒸";s:2:"";s:3:"뒹";s:2:"";s:3:"뒺";s:2:"";s:3:"뒻";s:2:"";s:3:"뒼";s:2:"";s:3:"뒽";s:2:"";s:3:"뒾";s:2:"";s:3:"뒿";s:2:"";s:3:"듀";s:2:"";s:3:"듁";s:2:"";s:3:"듂";s:2:"";s:3:"듃";s:2:"";s:3:"듄";s:2:"";s:3:"듅";s:2:"";s:3:"듆";s:2:"";s:3:"듇";s:2:"";s:3:"듈";s:2:"";s:3:"듉";s:2:"";s:3:"듊";s:2:"";s:3:"듋";s:2:"";s:3:"듌";s:2:"";s:3:"듍";s:2:"";s:3:"듎";s:2:"";s:3:"듏";s:2:"";s:3:"듐";s:2:"";s:3:"듑";s:2:"";s:3:"듒";s:2:"";s:3:"듓";s:2:"";s:3:"듔";s:2:"";s:3:"듕";s:2:"";s:3:"듖";s:2:"";s:3:"듗";s:2:"";s:3:"듘";s:2:"";s:3:"듙";s:2:"";s:3:"듚";s:2:"";s:3:"듛";s:2:"";s:3:"드";s:2:"";s:3:"득";s:2:"";s:3:"듞";s:2:"";s:3:"듟";s:2:"";s:3:"든";s:2:"";s:3:"듡";s:2:"";s:3:"듢";s:2:"";s:3:"듣";s:2:"";s:3:"들";s:2:"";s:3:"듥";s:2:"";s:3:"듦";s:2:"";s:3:"듧";s:2:"";s:3:"듨";s:2:"";s:3:"듩";s:2:"";s:3:"듪";s:2:"";s:3:"듫";s:2:"";s:3:"듬";s:2:"";s:3:"듭";s:2:"";s:3:"듮";s:2:"";s:3:"듯";s:2:"";s:3:"듰";s:2:"";s:3:"등";s:2:"";s:3:"듲";s:2:"";s:3:"듳";s:2:"";s:3:"듴";s:2:"";s:3:"듵";s:2:"";s:3:"듶";s:2:"";s:3:"듷";s:2:"";s:3:"듸";s:2:"";s:3:"듹";s:2:"";s:3:"듺";s:2:"";s:3:"듻";s:2:"";s:3:"듼";s:2:"";s:3:"듽";s:2:"";s:3:"듾";s:2:"";s:3:"듿";s:2:"";s:3:"딀";s:2:"";s:3:"딁";s:2:"";s:3:"딂";s:2:"";s:3:"딃";s:2:"";s:3:"딄";s:2:"";s:3:"딅";s:2:"";s:3:"딆";s:2:"";s:3:"딇";s:2:"";s:3:"딈";s:2:"";s:3:"딉";s:2:"";s:3:"딊";s:2:"";s:3:"딋";s:2:"";s:3:"딌";s:2:"";s:3:"딍";s:2:"";s:3:"딎";s:2:"";s:3:"딏";s:2:"";s:3:"딐";s:2:"";s:3:"딑";s:2:"";s:3:"딒";s:2:"";s:3:"딓";s:2:"";s:3:"디";s:2:"";s:3:"딕";s:2:"";s:3:"딖";s:2:"";s:3:"딗";s:2:"";s:3:"딘";s:2:"";s:3:"딙";s:2:"";s:3:"딚";s:2:"";s:3:"딛";s:2:"";s:3:"딜";s:2:"";s:3:"딝";s:2:"";s:3:"딞";s:2:"A";s:3:"딟";s:2:"B";s:3:"딠";s:2:"C";s:3:"딡";s:2:"D";s:3:"딢";s:2:"E";s:3:"딣";s:2:"F";s:3:"딤";s:2:"";s:3:"딥";s:2:"";s:3:"딦";s:2:"G";s:3:"딧";s:2:"";s:3:"딨";s:2:"";s:3:"딩";s:2:"";s:3:"딪";s:2:"";s:3:"딫";s:2:"H";s:3:"딬";s:2:"I";s:3:"딭";s:2:"J";s:3:"딮";s:2:"K";s:3:"딯";s:2:"L";s:3:"따";s:2:"";s:3:"딱";s:2:"";s:3:"딲";s:2:"M";s:3:"딳";s:2:"N";s:3:"딴";s:2:"";s:3:"딵";s:2:"O";s:3:"딶";s:2:"P";s:3:"딷";s:2:"Q";s:3:"딸";s:2:"";s:3:"딹";s:2:"R";s:3:"딺";s:2:"S";s:3:"딻";s:2:"T";s:3:"딼";s:2:"U";s:3:"딽";s:2:"V";s:3:"딾";s:2:"W";s:3:"딿";s:2:"X";s:3:"땀";s:2:"";s:3:"땁";s:2:"";s:3:"땂";s:2:"Y";s:3:"땃";s:2:"";s:3:"땄";s:2:"";s:3:"땅";s:2:"";s:3:"땆";s:2:"Z";s:3:"땇";s:2:"a";s:3:"땈";s:2:"b";s:3:"땉";s:2:"c";s:3:"땊";s:2:"d";s:3:"땋";s:2:"";s:3:"때";s:2:"";s:3:"땍";s:2:"";s:3:"땎";s:2:"e";s:3:"땏";s:2:"f";s:3:"땐";s:2:"";s:3:"땑";s:2:"g";s:3:"땒";s:2:"h";s:3:"땓";s:2:"i";s:3:"땔";s:2:"";s:3:"땕";s:2:"j";s:3:"땖";s:2:"k";s:3:"땗";s:2:"l";s:3:"땘";s:2:"m";s:3:"땙";s:2:"n";s:3:"땚";s:2:"o";s:3:"땛";s:2:"p";s:3:"땜";s:2:"";s:3:"땝";s:2:"";s:3:"땞";s:2:"q";s:3:"땟";s:2:"";s:3:"땠";s:2:"";s:3:"땡";s:2:"";s:3:"땢";s:2:"r";s:3:"땣";s:2:"s";s:3:"땤";s:2:"t";s:3:"땥";s:2:"u";s:3:"땦";s:2:"v";s:3:"땧";s:2:"w";s:3:"땨";s:2:"x";s:3:"땩";s:2:"y";s:3:"땪";s:2:"z";s:3:"땫";s:2:"";s:3:"땬";s:2:"";s:3:"땭";s:2:"";s:3:"땮";s:2:"";s:3:"땯";s:2:"";s:3:"땰";s:2:"";s:3:"땱";s:2:"";s:3:"땲";s:2:"";s:3:"땳";s:2:"";s:3:"땴";s:2:"";s:3:"땵";s:2:"";s:3:"땶";s:2:"";s:3:"땷";s:2:"";s:3:"땸";s:2:"";s:3:"땹";s:2:"";s:3:"땺";s:2:"";s:3:"땻";s:2:"";s:3:"땼";s:2:"";s:3:"땽";s:2:"";s:3:"땾";s:2:"";s:3:"땿";s:2:"";s:3:"떀";s:2:"";s:3:"떁";s:2:"";s:3:"떂";s:2:"";s:3:"떃";s:2:"";s:3:"떄";s:2:"";s:3:"떅";s:2:"";s:3:"떆";s:2:"";s:3:"떇";s:2:"";s:3:"떈";s:2:"";s:3:"떉";s:2:"";s:3:"떊";s:2:"";s:3:"떋";s:2:"";s:3:"떌";s:2:"";s:3:"떍";s:2:"";s:3:"떎";s:2:"";s:3:"떏";s:2:"";s:3:"떐";s:2:"";s:3:"떑";s:2:"";s:3:"떒";s:2:"";s:3:"떓";s:2:"";s:3:"떔";s:2:"";s:3:"떕";s:2:"";s:3:"떖";s:2:"";s:3:"떗";s:2:"";s:3:"떘";s:2:"";s:3:"떙";s:2:"";s:3:"떚";s:2:"";s:3:"떛";s:2:"";s:3:"떜";s:2:"";s:3:"떝";s:2:"";s:3:"떞";s:2:"";s:3:"떟";s:2:"";s:3:"떠";s:2:"";s:3:"떡";s:2:"";s:3:"떢";s:2:"";s:3:"떣";s:2:"";s:3:"떤";s:2:"";s:3:"떥";s:2:"";s:3:"떦";s:2:"";s:3:"떧";s:2:"";s:3:"떨";s:2:"";s:3:"떩";s:2:"";s:3:"떪";s:2:"";s:3:"떫";s:2:"";s:3:"떬";s:2:"";s:3:"떭";s:2:"";s:3:"떮";s:2:"";s:3:"떯";s:2:"";s:3:"떰";s:2:"";s:3:"떱";s:2:"";s:3:"떲";s:2:"";s:3:"떳";s:2:"";s:3:"떴";s:2:"";s:3:"떵";s:2:"";s:3:"떶";s:2:"";s:3:"떷";s:2:"";s:3:"떸";s:2:"";s:3:"떹";s:2:"";s:3:"떺";s:2:"";s:3:"떻";s:2:"";s:3:"떼";s:2:"";s:3:"떽";s:2:"";s:3:"떾";s:2:"";s:3:"떿";s:2:"";s:3:"뗀";s:2:"";s:3:"뗁";s:2:"";s:3:"뗂";s:2:"";s:3:"뗃";s:2:"";s:3:"뗄";s:2:"";s:3:"뗅";s:2:"";s:3:"뗆";s:2:"";s:3:"뗇";s:2:"";s:3:"뗈";s:2:"";s:3:"뗉";s:2:"";s:3:"뗊";s:2:"";s:3:"뗋";s:2:"";s:3:"뗌";s:2:"";s:3:"뗍";s:2:"";s:3:"뗎";s:2:"";s:3:"뗏";s:2:"";s:3:"뗐";s:2:"";s:3:"뗑";s:2:"";s:3:"뗒";s:2:"";s:3:"뗓";s:2:"";s:3:"뗔";s:2:"";s:3:"뗕";s:2:"";s:3:"뗖";s:2:"";s:3:"뗗";s:2:"";s:3:"뗘";s:2:"";s:3:"뗙";s:2:"";s:3:"뗚";s:2:"";s:3:"뗛";s:2:"";s:3:"뗜";s:2:"";s:3:"뗝";s:2:"";s:3:"뗞";s:2:"";s:3:"뗟";s:2:"";s:3:"뗠";s:2:"";s:3:"뗡";s:2:"";s:3:"뗢";s:2:"";s:3:"뗣";s:2:"";s:3:"뗤";s:2:"";s:3:"뗥";s:2:"";s:3:"뗦";s:2:"";s:3:"뗧";s:2:"";s:3:"뗨";s:2:"";s:3:"뗩";s:2:"";s:3:"뗪";s:2:"";s:3:"뗫";s:2:"";s:3:"뗬";s:2:"";s:3:"뗭";s:2:"";s:3:"뗮";s:2:"";s:3:"뗯";s:2:"";s:3:"뗰";s:2:"";s:3:"뗱";s:2:"";s:3:"뗲";s:2:"";s:3:"뗳";s:2:"";s:3:"뗴";s:2:"";s:3:"뗵";s:2:"";s:3:"뗶";s:2:"";s:3:"뗷";s:2:"";s:3:"뗸";s:2:"";s:3:"뗹";s:2:"";s:3:"뗺";s:2:"";s:3:"뗻";s:2:"";s:3:"뗼";s:2:"";s:3:"뗽";s:2:"";s:3:"뗾";s:2:"";s:3:"뗿";s:2:"";s:3:"똀";s:2:"A";s:3:"똁";s:2:"B";s:3:"똂";s:2:"C";s:3:"똃";s:2:"D";s:3:"똄";s:2:"E";s:3:"똅";s:2:"F";s:3:"똆";s:2:"G";s:3:"똇";s:2:"H";s:3:"똈";s:2:"I";s:3:"똉";s:2:"J";s:3:"똊";s:2:"K";s:3:"똋";s:2:"L";s:3:"똌";s:2:"M";s:3:"똍";s:2:"N";s:3:"똎";s:2:"O";s:3:"똏";s:2:"P";s:3:"또";s:2:"";s:3:"똑";s:2:"";s:3:"똒";s:2:"Q";s:3:"똓";s:2:"R";s:3:"똔";s:2:"";s:3:"똕";s:2:"S";s:3:"똖";s:2:"T";s:3:"똗";s:2:"U";s:3:"똘";s:2:"";s:3:"똙";s:2:"V";s:3:"똚";s:2:"W";s:3:"똛";s:2:"X";s:3:"똜";s:2:"Y";s:3:"똝";s:2:"Z";s:3:"똞";s:2:"a";s:3:"똟";s:2:"b";s:3:"똠";s:2:"c";s:3:"똡";s:2:"d";s:3:"똢";s:2:"e";s:3:"똣";s:2:"f";s:3:"똤";s:2:"g";s:3:"똥";s:2:"";s:3:"똦";s:2:"h";s:3:"똧";s:2:"i";s:3:"똨";s:2:"j";s:3:"똩";s:2:"k";s:3:"똪";s:2:"l";s:3:"똫";s:2:"m";s:3:"똬";s:2:"";s:3:"똭";s:2:"n";s:3:"똮";s:2:"o";s:3:"똯";s:2:"p";s:3:"똰";s:2:"q";s:3:"똱";s:2:"r";s:3:"똲";s:2:"s";s:3:"똳";s:2:"t";s:3:"똴";s:2:"";s:3:"똵";s:2:"u";s:3:"똶";s:2:"v";s:3:"똷";s:2:"w";s:3:"똸";s:2:"x";s:3:"똹";s:2:"y";s:3:"똺";s:2:"z";s:3:"똻";s:2:"";s:3:"똼";s:2:"";s:3:"똽";s:2:"";s:3:"똾";s:2:"";s:3:"똿";s:2:"";s:3:"뙀";s:2:"";s:3:"뙁";s:2:"";s:3:"뙂";s:2:"";s:3:"뙃";s:2:"";s:3:"뙄";s:2:"";s:3:"뙅";s:2:"";s:3:"뙆";s:2:"";s:3:"뙇";s:2:"";s:3:"뙈";s:2:"";s:3:"뙉";s:2:"";s:3:"뙊";s:2:"";s:3:"뙋";s:2:"";s:3:"뙌";s:2:"";s:3:"뙍";s:2:"";s:3:"뙎";s:2:"";s:3:"뙏";s:2:"";s:3:"뙐";s:2:"";s:3:"뙑";s:2:"";s:3:"뙒";s:2:"";s:3:"뙓";s:2:"";s:3:"뙔";s:2:"";s:3:"뙕";s:2:"";s:3:"뙖";s:2:"";s:3:"뙗";s:2:"";s:3:"뙘";s:2:"";s:3:"뙙";s:2:"";s:3:"뙚";s:2:"";s:3:"뙛";s:2:"";s:3:"뙜";s:2:"";s:3:"뙝";s:2:"";s:3:"뙞";s:2:"";s:3:"뙟";s:2:"";s:3:"뙠";s:2:"";s:3:"뙡";s:2:"";s:3:"뙢";s:2:"";s:3:"뙣";s:2:"";s:3:"뙤";s:2:"";s:3:"뙥";s:2:"";s:3:"뙦";s:2:"";s:3:"뙧";s:2:"";s:3:"뙨";s:2:"";s:3:"뙩";s:2:"";s:3:"뙪";s:2:"";s:3:"뙫";s:2:"";s:3:"뙬";s:2:"";s:3:"뙭";s:2:"";s:3:"뙮";s:2:"";s:3:"뙯";s:2:"";s:3:"뙰";s:2:"";s:3:"뙱";s:2:"";s:3:"뙲";s:2:"";s:3:"뙳";s:2:"";s:3:"뙴";s:2:"";s:3:"뙵";s:2:"";s:3:"뙶";s:2:"";s:3:"뙷";s:2:"";s:3:"뙸";s:2:"";s:3:"뙹";s:2:"";s:3:"뙺";s:2:"";s:3:"뙻";s:2:"";s:3:"뙼";s:2:"";s:3:"뙽";s:2:"";s:3:"뙾";s:2:"";s:3:"뙿";s:2:"";s:3:"뚀";s:2:"";s:3:"뚁";s:2:"";s:3:"뚂";s:2:"";s:3:"뚃";s:2:"";s:3:"뚄";s:2:"";s:3:"뚅";s:2:"";s:3:"뚆";s:2:"";s:3:"뚇";s:2:"";s:3:"뚈";s:2:"";s:3:"뚉";s:2:"";s:3:"뚊";s:2:"";s:3:"뚋";s:2:"";s:3:"뚌";s:2:"";s:3:"뚍";s:2:"";s:3:"뚎";s:2:"";s:3:"뚏";s:2:"";s:3:"뚐";s:2:"";s:3:"뚑";s:2:"";s:3:"뚒";s:2:"";s:3:"뚓";s:2:"";s:3:"뚔";s:2:"";s:3:"뚕";s:2:"";s:3:"뚖";s:2:"";s:3:"뚗";s:2:"";s:3:"뚘";s:2:"";s:3:"뚙";s:2:"";s:3:"뚚";s:2:"";s:3:"뚛";s:2:"";s:3:"뚜";s:2:"";s:3:"뚝";s:2:"";s:3:"뚞";s:2:"";s:3:"뚟";s:2:"";s:3:"뚠";s:2:"";s:3:"뚡";s:2:"";s:3:"뚢";s:2:"";s:3:"뚣";s:2:"";s:3:"뚤";s:2:"";s:3:"뚥";s:2:"";s:3:"뚦";s:2:"";s:3:"뚧";s:2:"";s:3:"뚨";s:2:"";s:3:"뚩";s:2:"";s:3:"뚪";s:2:"";s:3:"뚫";s:2:"";s:3:"뚬";s:2:"";s:3:"뚭";s:2:"";s:3:"뚮";s:2:"";s:3:"뚯";s:2:"";s:3:"뚰";s:2:"";s:3:"뚱";s:2:"";s:3:"뚲";s:2:"";s:3:"뚳";s:2:"";s:3:"뚴";s:2:"";s:3:"뚵";s:2:"";s:3:"뚶";s:2:"";s:3:"뚷";s:2:"";s:3:"뚸";s:2:"";s:3:"뚹";s:2:"";s:3:"뚺";s:2:"";s:3:"뚻";s:2:"";s:3:"뚼";s:2:"";s:3:"뚽";s:2:"";s:3:"뚾";s:2:"";s:3:"뚿";s:2:"";s:3:"뛀";s:2:"";s:3:"뛁";s:2:"";s:3:"뛂";s:2:"";s:3:"뛃";s:2:"A";s:3:"뛄";s:2:"B";s:3:"뛅";s:2:"C";s:3:"뛆";s:2:"D";s:3:"뛇";s:2:"E";s:3:"뛈";s:2:"F";s:3:"뛉";s:2:"G";s:3:"뛊";s:2:"H";s:3:"뛋";s:2:"I";s:3:"뛌";s:2:"J";s:3:"뛍";s:2:"K";s:3:"뛎";s:2:"L";s:3:"뛏";s:2:"M";s:3:"뛐";s:2:"N";s:3:"뛑";s:2:"O";s:3:"뛒";s:2:"P";s:3:"뛓";s:2:"Q";s:3:"뛔";s:2:"";s:3:"뛕";s:2:"R";s:3:"뛖";s:2:"S";s:3:"뛗";s:2:"T";s:3:"뛘";s:2:"U";s:3:"뛙";s:2:"V";s:3:"뛚";s:2:"W";s:3:"뛛";s:2:"X";s:3:"뛜";s:2:"Y";s:3:"뛝";s:2:"Z";s:3:"뛞";s:2:"a";s:3:"뛟";s:2:"b";s:3:"뛠";s:2:"c";s:3:"뛡";s:2:"d";s:3:"뛢";s:2:"e";s:3:"뛣";s:2:"f";s:3:"뛤";s:2:"g";s:3:"뛥";s:2:"h";s:3:"뛦";s:2:"i";s:3:"뛧";s:2:"j";s:3:"뛨";s:2:"k";s:3:"뛩";s:2:"l";s:3:"뛪";s:2:"m";s:3:"뛫";s:2:"n";s:3:"뛬";s:2:"o";s:3:"뛭";s:2:"p";s:3:"뛮";s:2:"q";s:3:"뛯";s:2:"r";s:3:"뛰";s:2:"";s:3:"뛱";s:2:"s";s:3:"뛲";s:2:"t";s:3:"뛳";s:2:"u";s:3:"뛴";s:2:"";s:3:"뛵";s:2:"v";s:3:"뛶";s:2:"w";s:3:"뛷";s:2:"x";s:3:"뛸";s:2:"";s:3:"뛹";s:2:"y";s:3:"뛺";s:2:"z";s:3:"뛻";s:2:"";s:3:"뛼";s:2:"";s:3:"뛽";s:2:"";s:3:"뛾";s:2:"";s:3:"뛿";s:2:"";s:3:"뜀";s:2:"";s:3:"뜁";s:2:"";s:3:"뜂";s:2:"";s:3:"뜃";s:2:"";s:3:"뜄";s:2:"";s:3:"뜅";s:2:"";s:3:"뜆";s:2:"";s:3:"뜇";s:2:"";s:3:"뜈";s:2:"";s:3:"뜉";s:2:"";s:3:"뜊";s:2:"";s:3:"뜋";s:2:"";s:3:"뜌";s:2:"";s:3:"뜍";s:2:"";s:3:"뜎";s:2:"";s:3:"뜏";s:2:"";s:3:"뜐";s:2:"";s:3:"뜑";s:2:"";s:3:"뜒";s:2:"";s:3:"뜓";s:2:"";s:3:"뜔";s:2:"";s:3:"뜕";s:2:"";s:3:"뜖";s:2:"";s:3:"뜗";s:2:"";s:3:"뜘";s:2:"";s:3:"뜙";s:2:"";s:3:"뜚";s:2:"";s:3:"뜛";s:2:"";s:3:"뜜";s:2:"";s:3:"뜝";s:2:"";s:3:"뜞";s:2:"";s:3:"뜟";s:2:"";s:3:"뜠";s:2:"";s:3:"뜡";s:2:"";s:3:"뜢";s:2:"";s:3:"뜣";s:2:"";s:3:"뜤";s:2:"";s:3:"뜥";s:2:"";s:3:"뜦";s:2:"";s:3:"뜧";s:2:"";s:3:"뜨";s:2:"";s:3:"뜩";s:2:"";s:3:"뜪";s:2:"";s:3:"뜫";s:2:"";s:3:"뜬";s:2:"";s:3:"뜭";s:2:"";s:3:"뜮";s:2:"";s:3:"뜯";s:2:"";s:3:"뜰";s:2:"";s:3:"뜱";s:2:"";s:3:"뜲";s:2:"";s:3:"뜳";s:2:"";s:3:"뜴";s:2:"";s:3:"뜵";s:2:"";s:3:"뜶";s:2:"";s:3:"뜷";s:2:"";s:3:"뜸";s:2:"";s:3:"뜹";s:2:"";s:3:"뜺";s:2:"";s:3:"뜻";s:2:"";s:3:"뜼";s:2:"";s:3:"뜽";s:2:"";s:3:"뜾";s:2:"";s:3:"뜿";s:2:"";s:3:"띀";s:2:"";s:3:"띁";s:2:"";s:3:"띂";s:2:"";s:3:"띃";s:2:"";s:3:"띄";s:2:"";s:3:"띅";s:2:"";s:3:"띆";s:2:"";s:3:"띇";s:2:"";s:3:"띈";s:2:"";s:3:"띉";s:2:"";s:3:"띊";s:2:"";s:3:"띋";s:2:"";s:3:"띌";s:2:"";s:3:"띍";s:2:"";s:3:"띎";s:2:"";s:3:"띏";s:2:"";s:3:"띐";s:2:"";s:3:"띑";s:2:"";s:3:"띒";s:2:"";s:3:"띓";s:2:"";s:3:"띔";s:2:"";s:3:"띕";s:2:"";s:3:"띖";s:2:"";s:3:"띗";s:2:"";s:3:"띘";s:2:"";s:3:"띙";s:2:"";s:3:"띚";s:2:"";s:3:"띛";s:2:"";s:3:"띜";s:2:"";s:3:"띝";s:2:"";s:3:"띞";s:2:"";s:3:"띟";s:2:"";s:3:"띠";s:2:"";s:3:"띡";s:2:"";s:3:"띢";s:2:"";s:3:"띣";s:2:"";s:3:"띤";s:2:"";s:3:"띥";s:2:"";s:3:"띦";s:2:"";s:3:"띧";s:2:"";s:3:"띨";s:2:"";s:3:"띩";s:2:"";s:3:"띪";s:2:"";s:3:"띫";s:2:"";s:3:"띬";s:2:"";s:3:"띭";s:2:"";s:3:"띮";s:2:"";s:3:"띯";s:2:"";s:3:"띰";s:2:"";s:3:"띱";s:2:"";s:3:"띲";s:2:"";s:3:"띳";s:2:"";s:3:"띴";s:2:"";s:3:"띵";s:2:"";s:3:"띶";s:2:"";s:3:"띷";s:2:"";s:3:"띸";s:2:"";s:3:"띹";s:2:"";s:3:"띺";s:2:"";s:3:"띻";s:2:"";s:3:"라";s:2:"";s:3:"락";s:2:"";s:3:"띾";s:2:"";s:3:"띿";s:2:"";s:3:"란";s:2:"";s:3:"랁";s:2:"";s:3:"랂";s:2:"";s:3:"랃";s:2:"";s:3:"랄";s:2:"";s:3:"랅";s:2:"";s:3:"랆";s:2:"";s:3:"랇";s:2:"";s:3:"랈";s:2:"";s:3:"랉";s:2:"";s:3:"랊";s:2:"";s:3:"랋";s:2:"";s:3:"람";s:2:"";s:3:"랍";s:2:"";s:3:"랎";s:2:"";s:3:"랏";s:2:"";s:3:"랐";s:2:"";s:3:"랑";s:2:"";s:3:"랒";s:2:"";s:3:"랓";s:2:"";s:3:"랔";s:2:"";s:3:"랕";s:2:"";s:3:"랖";s:2:"";s:3:"랗";s:2:"";s:3:"래";s:2:"";s:3:"랙";s:2:"";s:3:"랚";s:2:"";s:3:"랛";s:2:"";s:3:"랜";s:2:"";s:3:"랝";s:2:"";s:3:"랞";s:2:"";s:3:"랟";s:2:"A";s:3:"랠";s:2:"";s:3:"랡";s:2:"B";s:3:"랢";s:2:"C";s:3:"랣";s:2:"D";s:3:"랤";s:2:"E";s:3:"랥";s:2:"F";s:3:"랦";s:2:"G";s:3:"랧";s:2:"H";s:3:"램";s:2:"";s:3:"랩";s:2:"";s:3:"랪";s:2:"I";s:3:"랫";s:2:"";s:3:"랬";s:2:"";s:3:"랭";s:2:"";s:3:"랮";s:2:"J";s:3:"랯";s:2:"K";s:3:"랰";s:2:"L";s:3:"랱";s:2:"M";s:3:"랲";s:2:"N";s:3:"랳";s:2:"O";s:3:"랴";s:2:"";s:3:"략";s:2:"";s:3:"랶";s:2:"P";s:3:"랷";s:2:"Q";s:3:"랸";s:2:"";s:3:"랹";s:2:"R";s:3:"랺";s:2:"S";s:3:"랻";s:2:"T";s:3:"랼";s:2:"U";s:3:"랽";s:2:"V";s:3:"랾";s:2:"W";s:3:"랿";s:2:"X";s:3:"럀";s:2:"Y";s:3:"럁";s:2:"Z";s:3:"럂";s:2:"a";s:3:"럃";s:2:"b";s:3:"럄";s:2:"c";s:3:"럅";s:2:"d";s:3:"럆";s:2:"e";s:3:"럇";s:2:"";s:3:"럈";s:2:"f";s:3:"량";s:2:"";s:3:"럊";s:2:"g";s:3:"럋";s:2:"h";s:3:"럌";s:2:"i";s:3:"럍";s:2:"j";s:3:"럎";s:2:"k";s:3:"럏";s:2:"l";s:3:"럐";s:2:"m";s:3:"럑";s:2:"n";s:3:"럒";s:2:"o";s:3:"럓";s:2:"p";s:3:"럔";s:2:"q";s:3:"럕";s:2:"r";s:3:"럖";s:2:"s";s:3:"럗";s:2:"t";s:3:"럘";s:2:"u";s:3:"럙";s:2:"v";s:3:"럚";s:2:"w";s:3:"럛";s:2:"x";s:3:"럜";s:2:"y";s:3:"럝";s:2:"z";s:3:"럞";s:2:"";s:3:"럟";s:2:"";s:3:"럠";s:2:"";s:3:"럡";s:2:"";s:3:"럢";s:2:"";s:3:"럣";s:2:"";s:3:"럤";s:2:"";s:3:"럥";s:2:"";s:3:"럦";s:2:"";s:3:"럧";s:2:"";s:3:"럨";s:2:"";s:3:"럩";s:2:"";s:3:"럪";s:2:"";s:3:"럫";s:2:"";s:3:"러";s:2:"";s:3:"럭";s:2:"";s:3:"럮";s:2:"";s:3:"럯";s:2:"";s:3:"런";s:2:"";s:3:"럱";s:2:"";s:3:"럲";s:2:"";s:3:"럳";s:2:"";s:3:"럴";s:2:"";s:3:"럵";s:2:"";s:3:"럶";s:2:"";s:3:"럷";s:2:"";s:3:"럸";s:2:"";s:3:"럹";s:2:"";s:3:"럺";s:2:"";s:3:"럻";s:2:"";s:3:"럼";s:2:"";s:3:"럽";s:2:"";s:3:"럾";s:2:"";s:3:"럿";s:2:"";s:3:"렀";s:2:"";s:3:"렁";s:2:"";s:3:"렂";s:2:"";s:3:"렃";s:2:"";s:3:"렄";s:2:"";s:3:"렅";s:2:"";s:3:"렆";s:2:"";s:3:"렇";s:2:"";s:3:"레";s:2:"";s:3:"렉";s:2:"";s:3:"렊";s:2:"";s:3:"렋";s:2:"";s:3:"렌";s:2:"";s:3:"렍";s:2:"";s:3:"렎";s:2:"";s:3:"렏";s:2:"";s:3:"렐";s:2:"";s:3:"렑";s:2:"";s:3:"렒";s:2:"";s:3:"렓";s:2:"";s:3:"렔";s:2:"";s:3:"렕";s:2:"";s:3:"렖";s:2:"";s:3:"렗";s:2:"";s:3:"렘";s:2:"";s:3:"렙";s:2:"";s:3:"렚";s:2:"";s:3:"렛";s:2:"";s:3:"렜";s:2:"";s:3:"렝";s:2:"";s:3:"렞";s:2:"";s:3:"렟";s:2:"";s:3:"렠";s:2:"";s:3:"렡";s:2:"";s:3:"렢";s:2:"";s:3:"렣";s:2:"";s:3:"려";s:2:"";s:3:"력";s:2:"";s:3:"렦";s:2:"";s:3:"렧";s:2:"";s:3:"련";s:2:"";s:3:"렩";s:2:"";s:3:"렪";s:2:"";s:3:"렫";s:2:"";s:3:"렬";s:2:"";s:3:"렭";s:2:"";s:3:"렮";s:2:"";s:3:"렯";s:2:"";s:3:"렰";s:2:"";s:3:"렱";s:2:"";s:3:"렲";s:2:"";s:3:"렳";s:2:"";s:3:"렴";s:2:"";s:3:"렵";s:2:"";s:3:"렶";s:2:"";s:3:"렷";s:2:"";s:3:"렸";s:2:"";s:3:"령";s:2:"";s:3:"렺";s:2:"";s:3:"렻";s:2:"";s:3:"렼";s:2:"";s:3:"렽";s:2:"";s:3:"렾";s:2:"";s:3:"렿";s:2:"";s:3:"례";s:2:"";s:3:"롁";s:2:"";s:3:"롂";s:2:"";s:3:"롃";s:2:"";s:3:"롄";s:2:"";s:3:"롅";s:2:"";s:3:"롆";s:2:"";s:3:"롇";s:2:"";s:3:"롈";s:2:"";s:3:"롉";s:2:"";s:3:"롊";s:2:"";s:3:"롋";s:2:"";s:3:"롌";s:2:"";s:3:"롍";s:2:"";s:3:"롎";s:2:"";s:3:"롏";s:2:"";s:3:"롐";s:2:"";s:3:"롑";s:2:"";s:3:"롒";s:2:"";s:3:"롓";s:2:"";s:3:"롔";s:2:"";s:3:"롕";s:2:"";s:3:"롖";s:2:"";s:3:"롗";s:2:"";s:3:"롘";s:2:"";s:3:"롙";s:2:"";s:3:"롚";s:2:"";s:3:"롛";s:2:"";s:3:"로";s:2:"";s:3:"록";s:2:"";s:3:"롞";s:2:"";s:3:"롟";s:2:"";s:3:"론";s:2:"";s:3:"롡";s:2:"";s:3:"롢";s:2:"";s:3:"롣";s:2:"";s:3:"롤";s:2:"";s:3:"롥";s:2:"";s:3:"롦";s:2:"";s:3:"롧";s:2:"";s:3:"롨";s:2:"";s:3:"롩";s:2:"";s:3:"롪";s:2:"";s:3:"롫";s:2:"";s:3:"롬";s:2:"";s:3:"롭";s:2:"";s:3:"롮";s:2:"";s:3:"롯";s:2:"";s:3:"롰";s:2:"";s:3:"롱";s:2:"";s:3:"롲";s:2:"";s:3:"롳";s:2:"";s:3:"롴";s:2:"";s:3:"롵";s:2:"";s:3:"롶";s:2:"";s:3:"롷";s:2:"";s:3:"롸";s:2:"";s:3:"롹";s:2:"";s:3:"롺";s:2:"";s:3:"롻";s:2:"";s:3:"롼";s:2:"";s:3:"롽";s:2:"";s:3:"롾";s:2:"";s:3:"롿";s:2:"";s:3:"뢀";s:2:"";s:3:"뢁";s:2:"";s:3:"뢂";s:2:"";s:3:"뢃";s:2:"";s:3:"뢄";s:2:"";s:3:"뢅";s:2:"A";s:3:"뢆";s:2:"B";s:3:"뢇";s:2:"C";s:3:"뢈";s:2:"D";s:3:"뢉";s:2:"E";s:3:"뢊";s:2:"F";s:3:"뢋";s:2:"G";s:3:"뢌";s:2:"H";s:3:"뢍";s:2:"";s:3:"뢎";s:2:"I";s:3:"뢏";s:2:"J";s:3:"뢐";s:2:"K";s:3:"뢑";s:2:"L";s:3:"뢒";s:2:"M";s:3:"뢓";s:2:"N";s:3:"뢔";s:2:"O";s:3:"뢕";s:2:"P";s:3:"뢖";s:2:"Q";s:3:"뢗";s:2:"R";s:3:"뢘";s:2:"S";s:3:"뢙";s:2:"T";s:3:"뢚";s:2:"U";s:3:"뢛";s:2:"V";s:3:"뢜";s:2:"W";s:3:"뢝";s:2:"X";s:3:"뢞";s:2:"Y";s:3:"뢟";s:2:"Z";s:3:"뢠";s:2:"a";s:3:"뢡";s:2:"b";s:3:"뢢";s:2:"c";s:3:"뢣";s:2:"d";s:3:"뢤";s:2:"e";s:3:"뢥";s:2:"f";s:3:"뢦";s:2:"g";s:3:"뢧";s:2:"h";s:3:"뢨";s:2:"";s:3:"뢩";s:2:"i";s:3:"뢪";s:2:"j";s:3:"뢫";s:2:"k";s:3:"뢬";s:2:"l";s:3:"뢭";s:2:"m";s:3:"뢮";s:2:"n";s:3:"뢯";s:2:"o";s:3:"뢰";s:2:"";s:3:"뢱";s:2:"p";s:3:"뢲";s:2:"q";s:3:"뢳";s:2:"r";s:3:"뢴";s:2:"";s:3:"뢵";s:2:"s";s:3:"뢶";s:2:"t";s:3:"뢷";s:2:"u";s:3:"뢸";s:2:"";s:3:"뢹";s:2:"v";s:3:"뢺";s:2:"w";s:3:"뢻";s:2:"x";s:3:"뢼";s:2:"y";s:3:"뢽";s:2:"z";s:3:"뢾";s:2:"";s:3:"뢿";s:2:"";s:3:"룀";s:2:"";s:3:"룁";s:2:"";s:3:"룂";s:2:"";s:3:"룃";s:2:"";s:3:"룄";s:2:"";s:3:"룅";s:2:"";s:3:"룆";s:2:"";s:3:"룇";s:2:"";s:3:"룈";s:2:"";s:3:"룉";s:2:"";s:3:"룊";s:2:"";s:3:"룋";s:2:"";s:3:"료";s:2:"";s:3:"룍";s:2:"";s:3:"룎";s:2:"";s:3:"룏";s:2:"";s:3:"룐";s:2:"";s:3:"룑";s:2:"";s:3:"룒";s:2:"";s:3:"룓";s:2:"";s:3:"룔";s:2:"";s:3:"룕";s:2:"";s:3:"룖";s:2:"";s:3:"룗";s:2:"";s:3:"룘";s:2:"";s:3:"룙";s:2:"";s:3:"룚";s:2:"";s:3:"룛";s:2:"";s:3:"룜";s:2:"";s:3:"룝";s:2:"";s:3:"룞";s:2:"";s:3:"룟";s:2:"";s:3:"룠";s:2:"";s:3:"룡";s:2:"";s:3:"룢";s:2:"";s:3:"룣";s:2:"";s:3:"룤";s:2:"";s:3:"룥";s:2:"";s:3:"룦";s:2:"";s:3:"룧";s:2:"";s:3:"루";s:2:"";s:3:"룩";s:2:"";s:3:"룪";s:2:"";s:3:"룫";s:2:"";s:3:"룬";s:2:"";s:3:"룭";s:2:"";s:3:"룮";s:2:"";s:3:"룯";s:2:"";s:3:"룰";s:2:"";s:3:"룱";s:2:"";s:3:"룲";s:2:"";s:3:"룳";s:2:"";s:3:"룴";s:2:"";s:3:"룵";s:2:"";s:3:"룶";s:2:"";s:3:"룷";s:2:"";s:3:"룸";s:2:"";s:3:"룹";s:2:"";s:3:"룺";s:2:"";s:3:"룻";s:2:"";s:3:"룼";s:2:"";s:3:"룽";s:2:"";s:3:"룾";s:2:"";s:3:"룿";s:2:"";s:3:"뤀";s:2:"";s:3:"뤁";s:2:"";s:3:"뤂";s:2:"";s:3:"뤃";s:2:"";s:3:"뤄";s:2:"";s:3:"뤅";s:2:"";s:3:"뤆";s:2:"";s:3:"뤇";s:2:"";s:3:"뤈";s:2:"";s:3:"뤉";s:2:"";s:3:"뤊";s:2:"";s:3:"뤋";s:2:"";s:3:"뤌";s:2:"";s:3:"뤍";s:2:"";s:3:"뤎";s:2:"";s:3:"뤏";s:2:"";s:3:"뤐";s:2:"";s:3:"뤑";s:2:"";s:3:"뤒";s:2:"";s:3:"뤓";s:2:"";s:3:"뤔";s:2:"";s:3:"뤕";s:2:"";s:3:"뤖";s:2:"";s:3:"뤗";s:2:"";s:3:"뤘";s:2:"";s:3:"뤙";s:2:"";s:3:"뤚";s:2:"";s:3:"뤛";s:2:"";s:3:"뤜";s:2:"";s:3:"뤝";s:2:"";s:3:"뤞";s:2:"";s:3:"뤟";s:2:"";s:3:"뤠";s:2:"";s:3:"뤡";s:2:"";s:3:"뤢";s:2:"";s:3:"뤣";s:2:"";s:3:"뤤";s:2:"";s:3:"뤥";s:2:"";s:3:"뤦";s:2:"";s:3:"뤧";s:2:"";s:3:"뤨";s:2:"";s:3:"뤩";s:2:"";s:3:"뤪";s:2:"";s:3:"뤫";s:2:"";s:3:"뤬";s:2:"";s:3:"뤭";s:2:"";s:3:"뤮";s:2:"";s:3:"뤯";s:2:"";s:3:"뤰";s:2:"";s:3:"뤱";s:2:"";s:3:"뤲";s:2:"";s:3:"뤳";s:2:"";s:3:"뤴";s:2:"";s:3:"뤵";s:2:"";s:3:"뤶";s:2:"";s:3:"뤷";s:2:"";s:3:"뤸";s:2:"";s:3:"뤹";s:2:"";s:3:"뤺";s:2:"";s:3:"뤻";s:2:"";s:3:"뤼";s:2:"";s:3:"뤽";s:2:"";s:3:"뤾";s:2:"";s:3:"뤿";s:2:"";s:3:"륀";s:2:"";s:3:"륁";s:2:"";s:3:"륂";s:2:"";s:3:"륃";s:2:"";s:3:"륄";s:2:"";s:3:"륅";s:2:"";s:3:"륆";s:2:"";s:3:"륇";s:2:"";s:3:"륈";s:2:"";s:3:"륉";s:2:"";s:3:"륊";s:2:"";s:3:"륋";s:2:"";s:3:"륌";s:2:"";s:3:"륍";s:2:"";s:3:"륎";s:2:"";s:3:"륏";s:2:"";s:3:"륐";s:2:"";s:3:"륑";s:2:"";s:3:"륒";s:2:"";s:3:"륓";s:2:"";s:3:"륔";s:2:"";s:3:"륕";s:2:"";s:3:"륖";s:2:"";s:3:"륗";s:2:"";s:3:"류";s:2:"";s:3:"륙";s:2:"";s:3:"륚";s:2:"A";s:3:"륛";s:2:"B";s:3:"륜";s:2:"";s:3:"륝";s:2:"C";s:3:"륞";s:2:"D";s:3:"륟";s:2:"E";s:3:"률";s:2:"";s:3:"륡";s:2:"F";s:3:"륢";s:2:"G";s:3:"륣";s:2:"H";s:3:"륤";s:2:"I";s:3:"륥";s:2:"J";s:3:"륦";s:2:"K";s:3:"륧";s:2:"L";s:3:"륨";s:2:"";s:3:"륩";s:2:"";s:3:"륪";s:2:"M";s:3:"륫";s:2:"";s:3:"륬";s:2:"N";s:3:"륭";s:2:"";s:3:"륮";s:2:"O";s:3:"륯";s:2:"P";s:3:"륰";s:2:"Q";s:3:"륱";s:2:"R";s:3:"륲";s:2:"S";s:3:"륳";s:2:"T";s:3:"르";s:2:"";s:3:"륵";s:2:"";s:3:"륶";s:2:"U";s:3:"륷";s:2:"V";s:3:"른";s:2:"";s:3:"륹";s:2:"W";s:3:"륺";s:2:"X";s:3:"륻";s:2:"Y";s:3:"를";s:2:"";s:3:"륽";s:2:"Z";s:3:"륾";s:2:"a";s:3:"륿";s:2:"b";s:3:"릀";s:2:"c";s:3:"릁";s:2:"d";s:3:"릂";s:2:"e";s:3:"릃";s:2:"f";s:3:"름";s:2:"";s:3:"릅";s:2:"";s:3:"릆";s:2:"g";s:3:"릇";s:2:"";s:3:"릈";s:2:"h";s:3:"릉";s:2:"";s:3:"릊";s:2:"";s:3:"릋";s:2:"i";s:3:"릌";s:2:"j";s:3:"릍";s:2:"";s:3:"릎";s:2:"";s:3:"릏";s:2:"k";s:3:"릐";s:2:"l";s:3:"릑";s:2:"m";s:3:"릒";s:2:"n";s:3:"릓";s:2:"o";s:3:"릔";s:2:"p";s:3:"릕";s:2:"q";s:3:"릖";s:2:"r";s:3:"릗";s:2:"s";s:3:"릘";s:2:"t";s:3:"릙";s:2:"u";s:3:"릚";s:2:"v";s:3:"릛";s:2:"w";s:3:"릜";s:2:"x";s:3:"릝";s:2:"y";s:3:"릞";s:2:"z";s:3:"릟";s:2:"";s:3:"릠";s:2:"";s:3:"릡";s:2:"";s:3:"릢";s:2:"";s:3:"릣";s:2:"";s:3:"릤";s:2:"";s:3:"릥";s:2:"";s:3:"릦";s:2:"";s:3:"릧";s:2:"";s:3:"릨";s:2:"";s:3:"릩";s:2:"";s:3:"릪";s:2:"";s:3:"릫";s:2:"";s:3:"리";s:2:"";s:3:"릭";s:2:"";s:3:"릮";s:2:"";s:3:"릯";s:2:"";s:3:"린";s:2:"";s:3:"릱";s:2:"";s:3:"릲";s:2:"";s:3:"릳";s:2:"";s:3:"릴";s:2:"";s:3:"릵";s:2:"";s:3:"릶";s:2:"";s:3:"릷";s:2:"";s:3:"릸";s:2:"";s:3:"릹";s:2:"";s:3:"릺";s:2:"";s:3:"릻";s:2:"";s:3:"림";s:2:"";s:3:"립";s:2:"";s:3:"릾";s:2:"";s:3:"릿";s:2:"";s:3:"맀";s:2:"";s:3:"링";s:2:"";s:3:"맂";s:2:"";s:3:"맃";s:2:"";s:3:"맄";s:2:"";s:3:"맅";s:2:"";s:3:"맆";s:2:"";s:3:"맇";s:2:"";s:3:"마";s:2:"";s:3:"막";s:2:"";s:3:"맊";s:2:"";s:3:"맋";s:2:"";s:3:"만";s:2:"";s:3:"맍";s:2:"";s:3:"많";s:2:"";s:3:"맏";s:2:"";s:3:"말";s:2:"";s:3:"맑";s:2:"";s:3:"맒";s:2:"";s:3:"맓";s:2:"";s:3:"맔";s:2:"";s:3:"맕";s:2:"";s:3:"맖";s:2:"";s:3:"맗";s:2:"";s:3:"맘";s:2:"";s:3:"맙";s:2:"";s:3:"맚";s:2:"";s:3:"맛";s:2:"";s:3:"맜";s:2:"";s:3:"망";s:2:"";s:3:"맞";s:2:"";s:3:"맟";s:2:"";s:3:"맠";s:2:"";s:3:"맡";s:2:"";s:3:"맢";s:2:"";s:3:"맣";s:2:"";s:3:"매";s:2:"";s:3:"맥";s:2:"";s:3:"맦";s:2:"";s:3:"맧";s:2:"";s:3:"맨";s:2:"";s:3:"맩";s:2:"";s:3:"맪";s:2:"";s:3:"맫";s:2:"";s:3:"맬";s:2:"";s:3:"맭";s:2:"";s:3:"맮";s:2:"";s:3:"맯";s:2:"";s:3:"맰";s:2:"";s:3:"맱";s:2:"";s:3:"맲";s:2:"";s:3:"맳";s:2:"";s:3:"맴";s:2:"";s:3:"맵";s:2:"";s:3:"맶";s:2:"";s:3:"맷";s:2:"";s:3:"맸";s:2:"";s:3:"맹";s:2:"";s:3:"맺";s:2:"";s:3:"맻";s:2:"";s:3:"맼";s:2:"";s:3:"맽";s:2:"";s:3:"맾";s:2:"";s:3:"맿";s:2:"";s:3:"먀";s:2:"";s:3:"먁";s:2:"";s:3:"먂";s:2:"";s:3:"먃";s:2:"";s:3:"먄";s:2:"";s:3:"먅";s:2:"";s:3:"먆";s:2:"";s:3:"먇";s:2:"";s:3:"먈";s:2:"";s:3:"먉";s:2:"";s:3:"먊";s:2:"";s:3:"먋";s:2:"";s:3:"먌";s:2:"";s:3:"먍";s:2:"";s:3:"먎";s:2:"";s:3:"먏";s:2:"";s:3:"먐";s:2:"";s:3:"먑";s:2:"";s:3:"먒";s:2:"";s:3:"먓";s:2:"";s:3:"먔";s:2:"";s:3:"먕";s:2:"";s:3:"먖";s:2:"";s:3:"먗";s:2:"";s:3:"먘";s:2:"";s:3:"먙";s:2:"";s:3:"먚";s:2:"";s:3:"먛";s:2:"";s:3:"먜";s:2:"";s:3:"먝";s:2:"";s:3:"먞";s:2:"";s:3:"먟";s:2:"";s:3:"먠";s:2:"";s:3:"먡";s:2:"";s:3:"먢";s:2:"";s:3:"먣";s:2:"";s:3:"먤";s:2:"";s:3:"먥";s:2:"";s:3:"먦";s:2:"";s:3:"먧";s:2:"";s:3:"먨";s:2:"";s:3:"먩";s:2:"";s:3:"먪";s:2:"";s:3:"먫";s:2:"";s:3:"먬";s:2:"";s:3:"먭";s:2:"";s:3:"먮";s:2:"";s:3:"먯";s:2:"";s:3:"먰";s:2:"";s:3:"먱";s:2:"";s:3:"먲";s:2:"";s:3:"먳";s:2:"";s:3:"먴";s:2:"";s:3:"먵";s:2:"";s:3:"먶";s:2:"";s:3:"먷";s:2:"";s:3:"머";s:2:"";s:3:"먹";s:2:"";s:3:"먺";s:2:"";s:3:"먻";s:2:"";s:3:"먼";s:2:"";s:3:"먽";s:2:"";s:3:"먾";s:2:"";s:3:"먿";s:2:"";s:3:"멀";s:2:"";s:3:"멁";s:2:"";s:3:"멂";s:2:"";s:3:"멃";s:2:"";s:3:"멄";s:2:"";s:3:"멅";s:2:"";s:3:"멆";s:2:"";s:3:"멇";s:2:"A";s:3:"멈";s:2:"";s:3:"멉";s:2:"";s:3:"멊";s:2:"B";s:3:"멋";s:2:"";s:3:"멌";s:2:"C";s:3:"멍";s:2:"";s:3:"멎";s:2:"";s:3:"멏";s:2:"D";s:3:"멐";s:2:"E";s:3:"멑";s:2:"F";s:3:"멒";s:2:"G";s:3:"멓";s:2:"";s:3:"메";s:2:"";s:3:"멕";s:2:"";s:3:"멖";s:2:"H";s:3:"멗";s:2:"I";s:3:"멘";s:2:"";s:3:"멙";s:2:"J";s:3:"멚";s:2:"K";s:3:"멛";s:2:"L";s:3:"멜";s:2:"";s:3:"멝";s:2:"M";s:3:"멞";s:2:"N";s:3:"멟";s:2:"O";s:3:"멠";s:2:"P";s:3:"멡";s:2:"Q";s:3:"멢";s:2:"R";s:3:"멣";s:2:"S";s:3:"멤";s:2:"";s:3:"멥";s:2:"";s:3:"멦";s:2:"T";s:3:"멧";s:2:"";s:3:"멨";s:2:"";s:3:"멩";s:2:"";s:3:"멪";s:2:"U";s:3:"멫";s:2:"V";s:3:"멬";s:2:"W";s:3:"멭";s:2:"X";s:3:"멮";s:2:"Y";s:3:"멯";s:2:"Z";s:3:"며";s:2:"";s:3:"멱";s:2:"";s:3:"멲";s:2:"a";s:3:"멳";s:2:"b";s:3:"면";s:2:"";s:3:"멵";s:2:"c";s:3:"멶";s:2:"d";s:3:"멷";s:2:"e";s:3:"멸";s:2:"";s:3:"멹";s:2:"f";s:3:"멺";s:2:"g";s:3:"멻";s:2:"h";s:3:"멼";s:2:"i";s:3:"멽";s:2:"j";s:3:"멾";s:2:"k";s:3:"멿";s:2:"l";s:3:"몀";s:2:"m";s:3:"몁";s:2:"n";s:3:"몂";s:2:"o";s:3:"몃";s:2:"";s:3:"몄";s:2:"";s:3:"명";s:2:"";s:3:"몆";s:2:"p";s:3:"몇";s:2:"";s:3:"몈";s:2:"q";s:3:"몉";s:2:"r";s:3:"몊";s:2:"s";s:3:"몋";s:2:"t";s:3:"몌";s:2:"";s:3:"몍";s:2:"u";s:3:"몎";s:2:"v";s:3:"몏";s:2:"w";s:3:"몐";s:2:"x";s:3:"몑";s:2:"y";s:3:"몒";s:2:"z";s:3:"몓";s:2:"";s:3:"몔";s:2:"";s:3:"몕";s:2:"";s:3:"몖";s:2:"";s:3:"몗";s:2:"";s:3:"몘";s:2:"";s:3:"몙";s:2:"";s:3:"몚";s:2:"";s:3:"몛";s:2:"";s:3:"몜";s:2:"";s:3:"몝";s:2:"";s:3:"몞";s:2:"";s:3:"몟";s:2:"";s:3:"몠";s:2:"";s:3:"몡";s:2:"";s:3:"몢";s:2:"";s:3:"몣";s:2:"";s:3:"몤";s:2:"";s:3:"몥";s:2:"";s:3:"몦";s:2:"";s:3:"몧";s:2:"";s:3:"모";s:2:"";s:3:"목";s:2:"";s:3:"몪";s:2:"";s:3:"몫";s:2:"";s:3:"몬";s:2:"";s:3:"몭";s:2:"";s:3:"몮";s:2:"";s:3:"몯";s:2:"";s:3:"몰";s:2:"";s:3:"몱";s:2:"";s:3:"몲";s:2:"";s:3:"몳";s:2:"";s:3:"몴";s:2:"";s:3:"몵";s:2:"";s:3:"몶";s:2:"";s:3:"몷";s:2:"";s:3:"몸";s:2:"";s:3:"몹";s:2:"";s:3:"몺";s:2:"";s:3:"못";s:2:"";s:3:"몼";s:2:"";s:3:"몽";s:2:"";s:3:"몾";s:2:"";s:3:"몿";s:2:"";s:3:"뫀";s:2:"";s:3:"뫁";s:2:"";s:3:"뫂";s:2:"";s:3:"뫃";s:2:"";s:3:"뫄";s:2:"";s:3:"뫅";s:2:"";s:3:"뫆";s:2:"";s:3:"뫇";s:2:"";s:3:"뫈";s:2:"";s:3:"뫉";s:2:"";s:3:"뫊";s:2:"";s:3:"뫋";s:2:"";s:3:"뫌";s:2:"";s:3:"뫍";s:2:"";s:3:"뫎";s:2:"";s:3:"뫏";s:2:"";s:3:"뫐";s:2:"";s:3:"뫑";s:2:"";s:3:"뫒";s:2:"";s:3:"뫓";s:2:"";s:3:"뫔";s:2:"";s:3:"뫕";s:2:"";s:3:"뫖";s:2:"";s:3:"뫗";s:2:"";s:3:"뫘";s:2:"";s:3:"뫙";s:2:"";s:3:"뫚";s:2:"";s:3:"뫛";s:2:"";s:3:"뫜";s:2:"";s:3:"뫝";s:2:"";s:3:"뫞";s:2:"";s:3:"뫟";s:2:"";s:3:"뫠";s:2:"";s:3:"뫡";s:2:"";s:3:"뫢";s:2:"";s:3:"뫣";s:2:"";s:3:"뫤";s:2:"";s:3:"뫥";s:2:"";s:3:"뫦";s:2:"";s:3:"뫧";s:2:"";s:3:"뫨";s:2:"";s:3:"뫩";s:2:"";s:3:"뫪";s:2:"";s:3:"뫫";s:2:"";s:3:"뫬";s:2:"";s:3:"뫭";s:2:"";s:3:"뫮";s:2:"";s:3:"뫯";s:2:"";s:3:"뫰";s:2:"";s:3:"뫱";s:2:"";s:3:"뫲";s:2:"";s:3:"뫳";s:2:"";s:3:"뫴";s:2:"";s:3:"뫵";s:2:"";s:3:"뫶";s:2:"";s:3:"뫷";s:2:"";s:3:"뫸";s:2:"";s:3:"뫹";s:2:"";s:3:"뫺";s:2:"";s:3:"뫻";s:2:"";s:3:"뫼";s:2:"";s:3:"뫽";s:2:"";s:3:"뫾";s:2:"";s:3:"뫿";s:2:"";s:3:"묀";s:2:"";s:3:"묁";s:2:"";s:3:"묂";s:2:"";s:3:"묃";s:2:"";s:3:"묄";s:2:"";s:3:"묅";s:2:"";s:3:"묆";s:2:"";s:3:"묇";s:2:"";s:3:"묈";s:2:"";s:3:"묉";s:2:"";s:3:"묊";s:2:"";s:3:"묋";s:2:"";s:3:"묌";s:2:"";s:3:"묍";s:2:"";s:3:"묎";s:2:"";s:3:"묏";s:2:"";s:3:"묐";s:2:"";s:3:"묑";s:2:"";s:3:"묒";s:2:"";s:3:"묓";s:2:"";s:3:"묔";s:2:"";s:3:"묕";s:2:"";s:3:"묖";s:2:"";s:3:"묗";s:2:"";s:3:"묘";s:2:"";s:3:"묙";s:2:"";s:3:"묚";s:2:"";s:3:"묛";s:2:"";s:3:"묜";s:2:"";s:3:"묝";s:2:"";s:3:"묞";s:2:"";s:3:"묟";s:2:"";s:3:"묠";s:2:"";s:3:"묡";s:2:"";s:3:"묢";s:2:"";s:3:"묣";s:2:"";s:3:"묤";s:2:"";s:3:"묥";s:2:"";s:3:"묦";s:2:"";s:3:"묧";s:2:"";s:3:"묨";s:2:"A";s:3:"묩";s:2:"";s:3:"묪";s:2:"B";s:3:"묫";s:2:"";s:3:"묬";s:2:"C";s:3:"묭";s:2:"D";s:3:"묮";s:2:"E";s:3:"묯";s:2:"F";s:3:"묰";s:2:"G";s:3:"묱";s:2:"H";s:3:"묲";s:2:"I";s:3:"묳";s:2:"J";s:3:"무";s:2:"";s:3:"묵";s:2:"";s:3:"묶";s:2:"";s:3:"묷";s:2:"K";s:3:"문";s:2:"";s:3:"묹";s:2:"L";s:3:"묺";s:2:"M";s:3:"묻";s:2:"";s:3:"물";s:2:"";s:3:"묽";s:2:"";s:3:"묾";s:2:"";s:3:"묿";s:2:"N";s:3:"뭀";s:2:"O";s:3:"뭁";s:2:"P";s:3:"뭂";s:2:"Q";s:3:"뭃";s:2:"R";s:3:"뭄";s:2:"";s:3:"뭅";s:2:"";s:3:"뭆";s:2:"S";s:3:"뭇";s:2:"";s:3:"뭈";s:2:"T";s:3:"뭉";s:2:"";s:3:"뭊";s:2:"U";s:3:"뭋";s:2:"V";s:3:"뭌";s:2:"W";s:3:"뭍";s:2:"";s:3:"뭎";s:2:"X";s:3:"뭏";s:2:"";s:3:"뭐";s:2:"";s:3:"뭑";s:2:"Y";s:3:"뭒";s:2:"Z";s:3:"뭓";s:2:"a";s:3:"뭔";s:2:"";s:3:"뭕";s:2:"b";s:3:"뭖";s:2:"c";s:3:"뭗";s:2:"d";s:3:"뭘";s:2:"";s:3:"뭙";s:2:"e";s:3:"뭚";s:2:"f";s:3:"뭛";s:2:"g";s:3:"뭜";s:2:"h";s:3:"뭝";s:2:"i";s:3:"뭞";s:2:"j";s:3:"뭟";s:2:"k";s:3:"뭠";s:2:"l";s:3:"뭡";s:2:"";s:3:"뭢";s:2:"m";s:3:"뭣";s:2:"";s:3:"뭤";s:2:"n";s:3:"뭥";s:2:"o";s:3:"뭦";s:2:"p";s:3:"뭧";s:2:"q";s:3:"뭨";s:2:"r";s:3:"뭩";s:2:"s";s:3:"뭪";s:2:"t";s:3:"뭫";s:2:"u";s:3:"뭬";s:2:"";s:3:"뭭";s:2:"v";s:3:"뭮";s:2:"w";s:3:"뭯";s:2:"x";s:3:"뭰";s:2:"y";s:3:"뭱";s:2:"z";s:3:"뭲";s:2:"";s:3:"뭳";s:2:"";s:3:"뭴";s:2:"";s:3:"뭵";s:2:"";s:3:"뭶";s:2:"";s:3:"뭷";s:2:"";s:3:"뭸";s:2:"";s:3:"뭹";s:2:"";s:3:"뭺";s:2:"";s:3:"뭻";s:2:"";s:3:"뭼";s:2:"";s:3:"뭽";s:2:"";s:3:"뭾";s:2:"";s:3:"뭿";s:2:"";s:3:"뮀";s:2:"";s:3:"뮁";s:2:"";s:3:"뮂";s:2:"";s:3:"뮃";s:2:"";s:3:"뮄";s:2:"";s:3:"뮅";s:2:"";s:3:"뮆";s:2:"";s:3:"뮇";s:2:"";s:3:"뮈";s:2:"";s:3:"뮉";s:2:"";s:3:"뮊";s:2:"";s:3:"뮋";s:2:"";s:3:"뮌";s:2:"";s:3:"뮍";s:2:"";s:3:"뮎";s:2:"";s:3:"뮏";s:2:"";s:3:"뮐";s:2:"";s:3:"뮑";s:2:"";s:3:"뮒";s:2:"";s:3:"뮓";s:2:"";s:3:"뮔";s:2:"";s:3:"뮕";s:2:"";s:3:"뮖";s:2:"";s:3:"뮗";s:2:"";s:3:"뮘";s:2:"";s:3:"뮙";s:2:"";s:3:"뮚";s:2:"";s:3:"뮛";s:2:"";s:3:"뮜";s:2:"";s:3:"뮝";s:2:"";s:3:"뮞";s:2:"";s:3:"뮟";s:2:"";s:3:"뮠";s:2:"";s:3:"뮡";s:2:"";s:3:"뮢";s:2:"";s:3:"뮣";s:2:"";s:3:"뮤";s:2:"";s:3:"뮥";s:2:"";s:3:"뮦";s:2:"";s:3:"뮧";s:2:"";s:3:"뮨";s:2:"";s:3:"뮩";s:2:"";s:3:"뮪";s:2:"";s:3:"뮫";s:2:"";s:3:"뮬";s:2:"";s:3:"뮭";s:2:"";s:3:"뮮";s:2:"";s:3:"뮯";s:2:"";s:3:"뮰";s:2:"";s:3:"뮱";s:2:"";s:3:"뮲";s:2:"";s:3:"뮳";s:2:"";s:3:"뮴";s:2:"";s:3:"뮵";s:2:"";s:3:"뮶";s:2:"";s:3:"뮷";s:2:"";s:3:"뮸";s:2:"";s:3:"뮹";s:2:"";s:3:"뮺";s:2:"";s:3:"뮻";s:2:"";s:3:"뮼";s:2:"";s:3:"뮽";s:2:"";s:3:"뮾";s:2:"";s:3:"뮿";s:2:"";s:3:"므";s:2:"";s:3:"믁";s:2:"";s:3:"믂";s:2:"";s:3:"믃";s:2:"";s:3:"믄";s:2:"";s:3:"믅";s:2:"";s:3:"믆";s:2:"";s:3:"믇";s:2:"";s:3:"믈";s:2:"";s:3:"믉";s:2:"";s:3:"믊";s:2:"";s:3:"믋";s:2:"";s:3:"믌";s:2:"";s:3:"믍";s:2:"";s:3:"믎";s:2:"";s:3:"믏";s:2:"";s:3:"믐";s:2:"";s:3:"믑";s:2:"";s:3:"믒";s:2:"";s:3:"믓";s:2:"";s:3:"믔";s:2:"";s:3:"믕";s:2:"";s:3:"믖";s:2:"";s:3:"믗";s:2:"";s:3:"믘";s:2:"";s:3:"믙";s:2:"";s:3:"믚";s:2:"";s:3:"믛";s:2:"";s:3:"믜";s:2:"";s:3:"믝";s:2:"";s:3:"믞";s:2:"";s:3:"믟";s:2:"";s:3:"믠";s:2:"";s:3:"믡";s:2:"";s:3:"믢";s:2:"";s:3:"믣";s:2:"";s:3:"믤";s:2:"";s:3:"믥";s:2:"";s:3:"믦";s:2:"";s:3:"믧";s:2:"";s:3:"믨";s:2:"";s:3:"믩";s:2:"";s:3:"믪";s:2:"";s:3:"믫";s:2:"";s:3:"믬";s:2:"";s:3:"믭";s:2:"";s:3:"믮";s:2:"";s:3:"믯";s:2:"";s:3:"믰";s:2:"";s:3:"믱";s:2:"";s:3:"믲";s:2:"";s:3:"믳";s:2:"";s:3:"믴";s:2:"";s:3:"믵";s:2:"";s:3:"믶";s:2:"";s:3:"믷";s:2:"";s:3:"미";s:2:"";s:3:"믹";s:2:"";s:3:"믺";s:2:"";s:3:"믻";s:2:"";s:3:"민";s:2:"";s:3:"믽";s:2:"";s:3:"믾";s:2:"";s:3:"믿";s:2:"";s:3:"밀";s:2:"";s:3:"밁";s:2:"";s:3:"밂";s:2:"";s:3:"밃";s:2:"A";s:3:"밄";s:2:"B";s:3:"밅";s:2:"C";s:3:"밆";s:2:"D";s:3:"밇";s:2:"E";s:3:"밈";s:2:"";s:3:"밉";s:2:"";s:3:"밊";s:2:"F";s:3:"밋";s:2:"";s:3:"밌";s:2:"";s:3:"밍";s:2:"";s:3:"밎";s:2:"G";s:3:"및";s:2:"";s:3:"밐";s:2:"H";s:3:"밑";s:2:"";s:3:"밒";s:2:"I";s:3:"밓";s:2:"J";s:3:"바";s:2:"";s:3:"박";s:2:"";s:3:"밖";s:2:"";s:3:"밗";s:2:"";s:3:"반";s:2:"";s:3:"밙";s:2:"K";s:3:"밚";s:2:"L";s:3:"받";s:2:"";s:3:"발";s:2:"";s:3:"밝";s:2:"";s:3:"밞";s:2:"";s:3:"밟";s:2:"";s:3:"밠";s:2:"M";s:3:"밡";s:2:"N";s:3:"밢";s:2:"O";s:3:"밣";s:2:"P";s:3:"밤";s:2:"";s:3:"밥";s:2:"";s:3:"밦";s:2:"Q";s:3:"밧";s:2:"";s:3:"밨";s:2:"R";s:3:"방";s:2:"";s:3:"밪";s:2:"S";s:3:"밫";s:2:"T";s:3:"밬";s:2:"U";s:3:"밭";s:2:"";s:3:"밮";s:2:"V";s:3:"밯";s:2:"W";s:3:"배";s:2:"";s:3:"백";s:2:"";s:3:"밲";s:2:"X";s:3:"밳";s:2:"Y";s:3:"밴";s:2:"";s:3:"밵";s:2:"Z";s:3:"밶";s:2:"a";s:3:"밷";s:2:"b";s:3:"밸";s:2:"";s:3:"밹";s:2:"c";s:3:"밺";s:2:"d";s:3:"밻";s:2:"e";s:3:"밼";s:2:"f";s:3:"밽";s:2:"g";s:3:"밾";s:2:"h";s:3:"밿";s:2:"i";s:3:"뱀";s:2:"";s:3:"뱁";s:2:"";s:3:"뱂";s:2:"j";s:3:"뱃";s:2:"";s:3:"뱄";s:2:"";s:3:"뱅";s:2:"";s:3:"뱆";s:2:"k";s:3:"뱇";s:2:"l";s:3:"뱈";s:2:"m";s:3:"뱉";s:2:"";s:3:"뱊";s:2:"n";s:3:"뱋";s:2:"o";s:3:"뱌";s:2:"";s:3:"뱍";s:2:"";s:3:"뱎";s:2:"p";s:3:"뱏";s:2:"q";s:3:"뱐";s:2:"";s:3:"뱑";s:2:"r";s:3:"뱒";s:2:"s";s:3:"뱓";s:2:"t";s:3:"뱔";s:2:"u";s:3:"뱕";s:2:"v";s:3:"뱖";s:2:"w";s:3:"뱗";s:2:"x";s:3:"뱘";s:2:"y";s:3:"뱙";s:2:"z";s:3:"뱚";s:2:"";s:3:"뱛";s:2:"";s:3:"뱜";s:2:"";s:3:"뱝";s:2:"";s:3:"뱞";s:2:"";s:3:"뱟";s:2:"";s:3:"뱠";s:2:"";s:3:"뱡";s:2:"";s:3:"뱢";s:2:"";s:3:"뱣";s:2:"";s:3:"뱤";s:2:"";s:3:"뱥";s:2:"";s:3:"뱦";s:2:"";s:3:"뱧";s:2:"";s:3:"뱨";s:2:"";s:3:"뱩";s:2:"";s:3:"뱪";s:2:"";s:3:"뱫";s:2:"";s:3:"뱬";s:2:"";s:3:"뱭";s:2:"";s:3:"뱮";s:2:"";s:3:"뱯";s:2:"";s:3:"뱰";s:2:"";s:3:"뱱";s:2:"";s:3:"뱲";s:2:"";s:3:"뱳";s:2:"";s:3:"뱴";s:2:"";s:3:"뱵";s:2:"";s:3:"뱶";s:2:"";s:3:"뱷";s:2:"";s:3:"뱸";s:2:"";s:3:"뱹";s:2:"";s:3:"뱺";s:2:"";s:3:"뱻";s:2:"";s:3:"뱼";s:2:"";s:3:"뱽";s:2:"";s:3:"뱾";s:2:"";s:3:"뱿";s:2:"";s:3:"벀";s:2:"";s:3:"벁";s:2:"";s:3:"벂";s:2:"";s:3:"벃";s:2:"";s:3:"버";s:2:"";s:3:"벅";s:2:"";s:3:"벆";s:2:"";s:3:"벇";s:2:"";s:3:"번";s:2:"";s:3:"벉";s:2:"";s:3:"벊";s:2:"";s:3:"벋";s:2:"";s:3:"벌";s:2:"";s:3:"벍";s:2:"";s:3:"벎";s:2:"";s:3:"벏";s:2:"";s:3:"벐";s:2:"";s:3:"벑";s:2:"";s:3:"벒";s:2:"";s:3:"벓";s:2:"";s:3:"범";s:2:"";s:3:"법";s:2:"";s:3:"벖";s:2:"";s:3:"벗";s:2:"";s:3:"벘";s:2:"";s:3:"벙";s:2:"";s:3:"벚";s:2:"";s:3:"벛";s:2:"";s:3:"벜";s:2:"";s:3:"벝";s:2:"";s:3:"벞";s:2:"";s:3:"벟";s:2:"";s:3:"베";s:2:"";s:3:"벡";s:2:"";s:3:"벢";s:2:"";s:3:"벣";s:2:"";s:3:"벤";s:2:"";s:3:"벥";s:2:"";s:3:"벦";s:2:"";s:3:"벧";s:2:"";s:3:"벨";s:2:"";s:3:"벩";s:2:"";s:3:"벪";s:2:"";s:3:"벫";s:2:"";s:3:"벬";s:2:"";s:3:"벭";s:2:"";s:3:"벮";s:2:"";s:3:"벯";s:2:"";s:3:"벰";s:2:"";s:3:"벱";s:2:"";s:3:"벲";s:2:"";s:3:"벳";s:2:"";s:3:"벴";s:2:"";s:3:"벵";s:2:"";s:3:"벶";s:2:"";s:3:"벷";s:2:"";s:3:"벸";s:2:"";s:3:"벹";s:2:"";s:3:"벺";s:2:"";s:3:"벻";s:2:"";s:3:"벼";s:2:"";s:3:"벽";s:2:"";s:3:"벾";s:2:"";s:3:"벿";s:2:"";s:3:"변";s:2:"";s:3:"볁";s:2:"";s:3:"볂";s:2:"";s:3:"볃";s:2:"";s:3:"별";s:2:"";s:3:"볅";s:2:"";s:3:"볆";s:2:"";s:3:"볇";s:2:"";s:3:"볈";s:2:"";s:3:"볉";s:2:"";s:3:"볊";s:2:"";s:3:"볋";s:2:"";s:3:"볌";s:2:"";s:3:"볍";s:2:"";s:3:"볎";s:2:"";s:3:"볏";s:2:"";s:3:"볐";s:2:"";s:3:"병";s:2:"";s:3:"볒";s:2:"";s:3:"볓";s:2:"";s:3:"볔";s:2:"";s:3:"볕";s:2:"";s:3:"볖";s:2:"";s:3:"볗";s:2:"";s:3:"볘";s:2:"";s:3:"볙";s:2:"";s:3:"볚";s:2:"";s:3:"볛";s:2:"";s:3:"볜";s:2:"";s:3:"볝";s:2:"";s:3:"볞";s:2:"";s:3:"볟";s:2:"";s:3:"볠";s:2:"";s:3:"볡";s:2:"";s:3:"볢";s:2:"";s:3:"볣";s:2:"";s:3:"볤";s:2:"";s:3:"볥";s:2:"";s:3:"볦";s:2:"";s:3:"볧";s:2:"";s:3:"볨";s:2:"";s:3:"볩";s:2:"";s:3:"볪";s:2:"";s:3:"볫";s:2:"";s:3:"볬";s:2:"";s:3:"볭";s:2:"";s:3:"볮";s:2:"";s:3:"볯";s:2:"";s:3:"볰";s:2:"";s:3:"볱";s:2:"";s:3:"볲";s:2:"";s:3:"볳";s:2:"";s:3:"보";s:2:"";s:3:"복";s:2:"";s:3:"볶";s:2:"";s:3:"볷";s:2:"";s:3:"본";s:2:"";s:3:"볹";s:2:"";s:3:"볺";s:2:"";s:3:"볻";s:2:"";s:3:"볼";s:2:"";s:3:"볽";s:2:"";s:3:"볾";s:2:"A";s:3:"볿";s:2:"B";s:3:"봀";s:2:"C";s:3:"봁";s:2:"D";s:3:"봂";s:2:"E";s:3:"봃";s:2:"F";s:3:"봄";s:2:"";s:3:"봅";s:2:"";s:3:"봆";s:2:"G";s:3:"봇";s:2:"";s:3:"봈";s:2:"H";s:3:"봉";s:2:"";s:3:"봊";s:2:"I";s:3:"봋";s:2:"J";s:3:"봌";s:2:"K";s:3:"봍";s:2:"L";s:3:"봎";s:2:"M";s:3:"봏";s:2:"N";s:3:"봐";s:2:"";s:3:"봑";s:2:"O";s:3:"봒";s:2:"P";s:3:"봓";s:2:"Q";s:3:"봔";s:2:"";s:3:"봕";s:2:"R";s:3:"봖";s:2:"S";s:3:"봗";s:2:"T";s:3:"봘";s:2:"U";s:3:"봙";s:2:"V";s:3:"봚";s:2:"W";s:3:"봛";s:2:"X";s:3:"봜";s:2:"Y";s:3:"봝";s:2:"Z";s:3:"봞";s:2:"a";s:3:"봟";s:2:"b";s:3:"봠";s:2:"c";s:3:"봡";s:2:"d";s:3:"봢";s:2:"e";s:3:"봣";s:2:"f";s:3:"봤";s:2:"";s:3:"봥";s:2:"g";s:3:"봦";s:2:"h";s:3:"봧";s:2:"i";s:3:"봨";s:2:"j";s:3:"봩";s:2:"k";s:3:"봪";s:2:"l";s:3:"봫";s:2:"m";s:3:"봬";s:2:"";s:3:"봭";s:2:"n";s:3:"봮";s:2:"o";s:3:"봯";s:2:"p";s:3:"봰";s:2:"q";s:3:"봱";s:2:"r";s:3:"봲";s:2:"s";s:3:"봳";s:2:"t";s:3:"봴";s:2:"u";s:3:"봵";s:2:"v";s:3:"봶";s:2:"w";s:3:"봷";s:2:"x";s:3:"봸";s:2:"y";s:3:"봹";s:2:"z";s:3:"봺";s:2:"";s:3:"봻";s:2:"";s:3:"봼";s:2:"";s:3:"봽";s:2:"";s:3:"봾";s:2:"";s:3:"봿";s:2:"";s:3:"뵀";s:2:"";s:3:"뵁";s:2:"";s:3:"뵂";s:2:"";s:3:"뵃";s:2:"";s:3:"뵄";s:2:"";s:3:"뵅";s:2:"";s:3:"뵆";s:2:"";s:3:"뵇";s:2:"";s:3:"뵈";s:2:"";s:3:"뵉";s:2:"";s:3:"뵊";s:2:"";s:3:"뵋";s:2:"";s:3:"뵌";s:2:"";s:3:"뵍";s:2:"";s:3:"뵎";s:2:"";s:3:"뵏";s:2:"";s:3:"뵐";s:2:"";s:3:"뵑";s:2:"";s:3:"뵒";s:2:"";s:3:"뵓";s:2:"";s:3:"뵔";s:2:"";s:3:"뵕";s:2:"";s:3:"뵖";s:2:"";s:3:"뵗";s:2:"";s:3:"뵘";s:2:"";s:3:"뵙";s:2:"";s:3:"뵚";s:2:"";s:3:"뵛";s:2:"";s:3:"뵜";s:2:"";s:3:"뵝";s:2:"";s:3:"뵞";s:2:"";s:3:"뵟";s:2:"";s:3:"뵠";s:2:"";s:3:"뵡";s:2:"";s:3:"뵢";s:2:"";s:3:"뵣";s:2:"";s:3:"뵤";s:2:"";s:3:"뵥";s:2:"";s:3:"뵦";s:2:"";s:3:"뵧";s:2:"";s:3:"뵨";s:2:"";s:3:"뵩";s:2:"";s:3:"뵪";s:2:"";s:3:"뵫";s:2:"";s:3:"뵬";s:2:"";s:3:"뵭";s:2:"";s:3:"뵮";s:2:"";s:3:"뵯";s:2:"";s:3:"뵰";s:2:"";s:3:"뵱";s:2:"";s:3:"뵲";s:2:"";s:3:"뵳";s:2:"";s:3:"뵴";s:2:"";s:3:"뵵";s:2:"";s:3:"뵶";s:2:"";s:3:"뵷";s:2:"";s:3:"뵸";s:2:"";s:3:"뵹";s:2:"";s:3:"뵺";s:2:"";s:3:"뵻";s:2:"";s:3:"뵼";s:2:"";s:3:"뵽";s:2:"";s:3:"뵾";s:2:"";s:3:"뵿";s:2:"";s:3:"부";s:2:"";s:3:"북";s:2:"";s:3:"붂";s:2:"";s:3:"붃";s:2:"";s:3:"분";s:2:"";s:3:"붅";s:2:"";s:3:"붆";s:2:"";s:3:"붇";s:2:"";s:3:"불";s:2:"";s:3:"붉";s:2:"";s:3:"붊";s:2:"";s:3:"붋";s:2:"";s:3:"붌";s:2:"";s:3:"붍";s:2:"";s:3:"붎";s:2:"";s:3:"붏";s:2:"";s:3:"붐";s:2:"";s:3:"붑";s:2:"";s:3:"붒";s:2:"";s:3:"붓";s:2:"";s:3:"붔";s:2:"";s:3:"붕";s:2:"";s:3:"붖";s:2:"";s:3:"붗";s:2:"";s:3:"붘";s:2:"";s:3:"붙";s:2:"";s:3:"붚";s:2:"";s:3:"붛";s:2:"";s:3:"붜";s:2:"";s:3:"붝";s:2:"";s:3:"붞";s:2:"";s:3:"붟";s:2:"";s:3:"붠";s:2:"";s:3:"붡";s:2:"";s:3:"붢";s:2:"";s:3:"붣";s:2:"";s:3:"붤";s:2:"";s:3:"붥";s:2:"";s:3:"붦";s:2:"";s:3:"붧";s:2:"";s:3:"붨";s:2:"";s:3:"붩";s:2:"";s:3:"붪";s:2:"";s:3:"붫";s:2:"";s:3:"붬";s:2:"";s:3:"붭";s:2:"";s:3:"붮";s:2:"";s:3:"붯";s:2:"";s:3:"붰";s:2:"";s:3:"붱";s:2:"";s:3:"붲";s:2:"";s:3:"붳";s:2:"";s:3:"붴";s:2:"";s:3:"붵";s:2:"";s:3:"붶";s:2:"";s:3:"붷";s:2:"";s:3:"붸";s:2:"";s:3:"붹";s:2:"";s:3:"붺";s:2:"";s:3:"붻";s:2:"";s:3:"붼";s:2:"";s:3:"붽";s:2:"";s:3:"붾";s:2:"";s:3:"붿";s:2:"";s:3:"뷀";s:2:"";s:3:"뷁";s:2:"";s:3:"뷂";s:2:"";s:3:"뷃";s:2:"";s:3:"뷄";s:2:"";s:3:"뷅";s:2:"";s:3:"뷆";s:2:"";s:3:"뷇";s:2:"";s:3:"뷈";s:2:"";s:3:"뷉";s:2:"";s:3:"뷊";s:2:"";s:3:"뷋";s:2:"";s:3:"뷌";s:2:"";s:3:"뷍";s:2:"";s:3:"뷎";s:2:"";s:3:"뷏";s:2:"";s:3:"뷐";s:2:"";s:3:"뷑";s:2:"";s:3:"뷒";s:2:"A";s:3:"뷓";s:2:"B";s:3:"뷔";s:2:"";s:3:"뷕";s:2:"";s:3:"뷖";s:2:"C";s:3:"뷗";s:2:"D";s:3:"뷘";s:2:"";s:3:"뷙";s:2:"E";s:3:"뷚";s:2:"F";s:3:"뷛";s:2:"G";s:3:"뷜";s:2:"";s:3:"뷝";s:2:"H";s:3:"뷞";s:2:"I";s:3:"뷟";s:2:"J";s:3:"뷠";s:2:"K";s:3:"뷡";s:2:"L";s:3:"뷢";s:2:"M";s:3:"뷣";s:2:"N";s:3:"뷤";s:2:"O";s:3:"뷥";s:2:"P";s:3:"뷦";s:2:"Q";s:3:"뷧";s:2:"R";s:3:"뷨";s:2:"S";s:3:"뷩";s:2:"";s:3:"뷪";s:2:"T";s:3:"뷫";s:2:"U";s:3:"뷬";s:2:"V";s:3:"뷭";s:2:"W";s:3:"뷮";s:2:"X";s:3:"뷯";s:2:"Y";s:3:"뷰";s:2:"";s:3:"뷱";s:2:"Z";s:3:"뷲";s:2:"a";s:3:"뷳";s:2:"b";s:3:"뷴";s:2:"";s:3:"뷵";s:2:"c";s:3:"뷶";s:2:"d";s:3:"뷷";s:2:"e";s:3:"뷸";s:2:"";s:3:"뷹";s:2:"f";s:3:"뷺";s:2:"g";s:3:"뷻";s:2:"h";s:3:"뷼";s:2:"i";s:3:"뷽";s:2:"j";s:3:"뷾";s:2:"k";s:3:"뷿";s:2:"l";s:3:"븀";s:2:"";s:3:"븁";s:2:"m";s:3:"븂";s:2:"n";s:3:"븃";s:2:"";s:3:"븄";s:2:"o";s:3:"븅";s:2:"";s:3:"븆";s:2:"p";s:3:"븇";s:2:"q";s:3:"븈";s:2:"r";s:3:"븉";s:2:"s";s:3:"븊";s:2:"t";s:3:"븋";s:2:"u";s:3:"브";s:2:"";s:3:"븍";s:2:"";s:3:"븎";s:2:"v";s:3:"븏";s:2:"w";s:3:"븐";s:2:"";s:3:"븑";s:2:"x";s:3:"븒";s:2:"y";s:3:"븓";s:2:"z";s:3:"블";s:2:"";s:3:"븕";s:2:"";s:3:"븖";s:2:"";s:3:"븗";s:2:"";s:3:"븘";s:2:"";s:3:"븙";s:2:"";s:3:"븚";s:2:"";s:3:"븛";s:2:"";s:3:"븜";s:2:"";s:3:"븝";s:2:"";s:3:"븞";s:2:"";s:3:"븟";s:2:"";s:3:"븠";s:2:"";s:3:"븡";s:2:"";s:3:"븢";s:2:"";s:3:"븣";s:2:"";s:3:"븤";s:2:"";s:3:"븥";s:2:"";s:3:"븦";s:2:"";s:3:"븧";s:2:"";s:3:"븨";s:2:"";s:3:"븩";s:2:"";s:3:"븪";s:2:"";s:3:"븫";s:2:"";s:3:"븬";s:2:"";s:3:"븭";s:2:"";s:3:"븮";s:2:"";s:3:"븯";s:2:"";s:3:"븰";s:2:"";s:3:"븱";s:2:"";s:3:"븲";s:2:"";s:3:"븳";s:2:"";s:3:"븴";s:2:"";s:3:"븵";s:2:"";s:3:"븶";s:2:"";s:3:"븷";s:2:"";s:3:"븸";s:2:"";s:3:"븹";s:2:"";s:3:"븺";s:2:"";s:3:"븻";s:2:"";s:3:"븼";s:2:"";s:3:"븽";s:2:"";s:3:"븾";s:2:"";s:3:"븿";s:2:"";s:3:"빀";s:2:"";s:3:"빁";s:2:"";s:3:"빂";s:2:"";s:3:"빃";s:2:"";s:3:"비";s:2:"";s:3:"빅";s:2:"";s:3:"빆";s:2:"";s:3:"빇";s:2:"";s:3:"빈";s:2:"";s:3:"빉";s:2:"";s:3:"빊";s:2:"";s:3:"빋";s:2:"";s:3:"빌";s:2:"";s:3:"빍";s:2:"";s:3:"빎";s:2:"";s:3:"빏";s:2:"";s:3:"빐";s:2:"";s:3:"빑";s:2:"";s:3:"빒";s:2:"";s:3:"빓";s:2:"";s:3:"빔";s:2:"";s:3:"빕";s:2:"";s:3:"빖";s:2:"";s:3:"빗";s:2:"";s:3:"빘";s:2:"";s:3:"빙";s:2:"";s:3:"빚";s:2:"";s:3:"빛";s:2:"";s:3:"빜";s:2:"";s:3:"빝";s:2:"";s:3:"빞";s:2:"";s:3:"빟";s:2:"";s:3:"빠";s:2:"";s:3:"빡";s:2:"";s:3:"빢";s:2:"";s:3:"빣";s:2:"";s:3:"빤";s:2:"";s:3:"빥";s:2:"";s:3:"빦";s:2:"";s:3:"빧";s:2:"";s:3:"빨";s:2:"";s:3:"빩";s:2:"";s:3:"빪";s:2:"";s:3:"빫";s:2:"";s:3:"빬";s:2:"";s:3:"빭";s:2:"";s:3:"빮";s:2:"";s:3:"빯";s:2:"";s:3:"빰";s:2:"";s:3:"빱";s:2:"";s:3:"빲";s:2:"";s:3:"빳";s:2:"";s:3:"빴";s:2:"";s:3:"빵";s:2:"";s:3:"빶";s:2:"";s:3:"빷";s:2:"";s:3:"빸";s:2:"";s:3:"빹";s:2:"";s:3:"빺";s:2:"";s:3:"빻";s:2:"";s:3:"빼";s:2:"";s:3:"빽";s:2:"";s:3:"빾";s:2:"";s:3:"빿";s:2:"";s:3:"뺀";s:2:"";s:3:"뺁";s:2:"";s:3:"뺂";s:2:"";s:3:"뺃";s:2:"";s:3:"뺄";s:2:"";s:3:"뺅";s:2:"";s:3:"뺆";s:2:"";s:3:"뺇";s:2:"";s:3:"뺈";s:2:"";s:3:"뺉";s:2:"";s:3:"뺊";s:2:"";s:3:"뺋";s:2:"";s:3:"뺌";s:2:"";s:3:"뺍";s:2:"";s:3:"뺎";s:2:"";s:3:"뺏";s:2:"";s:3:"뺐";s:2:"";s:3:"뺑";s:2:"";s:3:"뺒";s:2:"";s:3:"뺓";s:2:"";s:3:"뺔";s:2:"";s:3:"뺕";s:2:"";s:3:"뺖";s:2:"";s:3:"뺗";s:2:"";s:3:"뺘";s:2:"";s:3:"뺙";s:2:"";s:3:"뺚";s:2:"";s:3:"뺛";s:2:"";s:3:"뺜";s:2:"";s:3:"뺝";s:2:"";s:3:"뺞";s:2:"";s:3:"뺟";s:2:"";s:3:"뺠";s:2:"";s:3:"뺡";s:2:"";s:3:"뺢";s:2:"";s:3:"뺣";s:2:"";s:3:"뺤";s:2:"";s:3:"뺥";s:2:"";s:3:"뺦";s:2:"";s:3:"뺧";s:2:"";s:3:"뺨";s:2:"";s:3:"뺩";s:2:"";s:3:"뺪";s:2:"";s:3:"뺫";s:2:"";s:3:"뺬";s:2:"";s:3:"뺭";s:2:"";s:3:"뺮";s:2:"";s:3:"뺯";s:2:"";s:3:"뺰";s:2:"";s:3:"뺱";s:2:"";s:3:"뺲";s:2:"";s:3:"뺳";s:2:"";s:3:"뺴";s:2:"";s:3:"뺵";s:2:"";s:3:"뺶";s:2:"";s:3:"뺷";s:2:"";s:3:"뺸";s:2:"A";s:3:"뺹";s:2:"B";s:3:"뺺";s:2:"C";s:3:"뺻";s:2:"D";s:3:"뺼";s:2:"E";s:3:"뺽";s:2:"F";s:3:"뺾";s:2:"G";s:3:"뺿";s:2:"H";s:3:"뻀";s:2:"I";s:3:"뻁";s:2:"J";s:3:"뻂";s:2:"K";s:3:"뻃";s:2:"L";s:3:"뻄";s:2:"M";s:3:"뻅";s:2:"N";s:3:"뻆";s:2:"O";s:3:"뻇";s:2:"P";s:3:"뻈";s:2:"Q";s:3:"뻉";s:2:"R";s:3:"뻊";s:2:"S";s:3:"뻋";s:2:"T";s:3:"뻌";s:2:"U";s:3:"뻍";s:2:"V";s:3:"뻎";s:2:"W";s:3:"뻏";s:2:"X";s:3:"뻐";s:2:"";s:3:"뻑";s:2:"";s:3:"뻒";s:2:"Y";s:3:"뻓";s:2:"Z";s:3:"뻔";s:2:"";s:3:"뻕";s:2:"a";s:3:"뻖";s:2:"b";s:3:"뻗";s:2:"";s:3:"뻘";s:2:"";s:3:"뻙";s:2:"c";s:3:"뻚";s:2:"d";s:3:"뻛";s:2:"e";s:3:"뻜";s:2:"f";s:3:"뻝";s:2:"g";s:3:"뻞";s:2:"h";s:3:"뻟";s:2:"i";s:3:"뻠";s:2:"";s:3:"뻡";s:2:"j";s:3:"뻢";s:2:"k";s:3:"뻣";s:2:"";s:3:"뻤";s:2:"";s:3:"뻥";s:2:"";s:3:"뻦";s:2:"l";s:3:"뻧";s:2:"m";s:3:"뻨";s:2:"n";s:3:"뻩";s:2:"o";s:3:"뻪";s:2:"p";s:3:"뻫";s:2:"q";s:3:"뻬";s:2:"";s:3:"뻭";s:2:"r";s:3:"뻮";s:2:"s";s:3:"뻯";s:2:"t";s:3:"뻰";s:2:"u";s:3:"뻱";s:2:"v";s:3:"뻲";s:2:"w";s:3:"뻳";s:2:"x";s:3:"뻴";s:2:"y";s:3:"뻵";s:2:"z";s:3:"뻶";s:2:"";s:3:"뻷";s:2:"";s:3:"뻸";s:2:"";s:3:"뻹";s:2:"";s:3:"뻺";s:2:"";s:3:"뻻";s:2:"";s:3:"뻼";s:2:"";s:3:"뻽";s:2:"";s:3:"뻾";s:2:"";s:3:"뻿";s:2:"";s:3:"뼀";s:2:"";s:3:"뼁";s:2:"";s:3:"뼂";s:2:"";s:3:"뼃";s:2:"";s:3:"뼄";s:2:"";s:3:"뼅";s:2:"";s:3:"뼆";s:2:"";s:3:"뼇";s:2:"";s:3:"뼈";s:2:"";s:3:"뼉";s:2:"";s:3:"뼊";s:2:"";s:3:"뼋";s:2:"";s:3:"뼌";s:2:"";s:3:"뼍";s:2:"";s:3:"뼎";s:2:"";s:3:"뼏";s:2:"";s:3:"뼐";s:2:"";s:3:"뼑";s:2:"";s:3:"뼒";s:2:"";s:3:"뼓";s:2:"";s:3:"뼔";s:2:"";s:3:"뼕";s:2:"";s:3:"뼖";s:2:"";s:3:"뼗";s:2:"";s:3:"뼘";s:2:"";s:3:"뼙";s:2:"";s:3:"뼚";s:2:"";s:3:"뼛";s:2:"";s:3:"뼜";s:2:"";s:3:"뼝";s:2:"";s:3:"뼞";s:2:"";s:3:"뼟";s:2:"";s:3:"뼠";s:2:"";s:3:"뼡";s:2:"";s:3:"뼢";s:2:"";s:3:"뼣";s:2:"";s:3:"뼤";s:2:"";s:3:"뼥";s:2:"";s:3:"뼦";s:2:"";s:3:"뼧";s:2:"";s:3:"뼨";s:2:"";s:3:"뼩";s:2:"";s:3:"뼪";s:2:"";s:3:"뼫";s:2:"";s:3:"뼬";s:2:"";s:3:"뼭";s:2:"";s:3:"뼮";s:2:"";s:3:"뼯";s:2:"";s:3:"뼰";s:2:"";s:3:"뼱";s:2:"";s:3:"뼲";s:2:"";s:3:"뼳";s:2:"";s:3:"뼴";s:2:"";s:3:"뼵";s:2:"";s:3:"뼶";s:2:"";s:3:"뼷";s:2:"";s:3:"뼸";s:2:"";s:3:"뼹";s:2:"";s:3:"뼺";s:2:"";s:3:"뼻";s:2:"";s:3:"뼼";s:2:"";s:3:"뼽";s:2:"";s:3:"뼾";s:2:"";s:3:"뼿";s:2:"";s:3:"뽀";s:2:"";s:3:"뽁";s:2:"";s:3:"뽂";s:2:"";s:3:"뽃";s:2:"";s:3:"뽄";s:2:"";s:3:"뽅";s:2:"";s:3:"뽆";s:2:"";s:3:"뽇";s:2:"";s:3:"뽈";s:2:"";s:3:"뽉";s:2:"";s:3:"뽊";s:2:"";s:3:"뽋";s:2:"";s:3:"뽌";s:2:"";s:3:"뽍";s:2:"";s:3:"뽎";s:2:"";s:3:"뽏";s:2:"";s:3:"뽐";s:2:"";s:3:"뽑";s:2:"";s:3:"뽒";s:2:"";s:3:"뽓";s:2:"";s:3:"뽔";s:2:"";s:3:"뽕";s:2:"";s:3:"뽖";s:2:"";s:3:"뽗";s:2:"";s:3:"뽘";s:2:"";s:3:"뽙";s:2:"";s:3:"뽚";s:2:"";s:3:"뽛";s:2:"";s:3:"뽜";s:2:"";s:3:"뽝";s:2:"";s:3:"뽞";s:2:"";s:3:"뽟";s:2:"";s:3:"뽠";s:2:"";s:3:"뽡";s:2:"";s:3:"뽢";s:2:"";s:3:"뽣";s:2:"";s:3:"뽤";s:2:"";s:3:"뽥";s:2:"";s:3:"뽦";s:2:"";s:3:"뽧";s:2:"";s:3:"뽨";s:2:"";s:3:"뽩";s:2:"";s:3:"뽪";s:2:"";s:3:"뽫";s:2:"";s:3:"뽬";s:2:"";s:3:"뽭";s:2:"";s:3:"뽮";s:2:"";s:3:"뽯";s:2:"";s:3:"뽰";s:2:"";s:3:"뽱";s:2:"";s:3:"뽲";s:2:"";s:3:"뽳";s:2:"";s:3:"뽴";s:2:"";s:3:"뽵";s:2:"";s:3:"뽶";s:2:"";s:3:"뽷";s:2:"";s:3:"뽸";s:2:"";s:3:"뽹";s:2:"";s:3:"뽺";s:2:"";s:3:"뽻";s:2:"";s:3:"뽼";s:2:"";s:3:"뽽";s:2:"";s:3:"뽾";s:2:"";s:3:"뽿";s:2:"";s:3:"뾀";s:2:"";s:3:"뾁";s:2:"";s:3:"뾂";s:2:"";s:3:"뾃";s:2:"A";s:3:"뾄";s:2:"B";s:3:"뾅";s:2:"C";s:3:"뾆";s:2:"D";s:3:"뾇";s:2:"E";s:3:"뾈";s:2:"F";s:3:"뾉";s:2:"G";s:3:"뾊";s:2:"H";s:3:"뾋";s:2:"I";s:3:"뾌";s:2:"J";s:3:"뾍";s:2:"K";s:3:"뾎";s:2:"L";s:3:"뾏";s:2:"M";s:3:"뾐";s:2:"N";s:3:"뾑";s:2:"O";s:3:"뾒";s:2:"P";s:3:"뾓";s:2:"Q";s:3:"뾔";s:2:"";s:3:"뾕";s:2:"R";s:3:"뾖";s:2:"S";s:3:"뾗";s:2:"T";s:3:"뾘";s:2:"U";s:3:"뾙";s:2:"V";s:3:"뾚";s:2:"W";s:3:"뾛";s:2:"X";s:3:"뾜";s:2:"Y";s:3:"뾝";s:2:"Z";s:3:"뾞";s:2:"a";s:3:"뾟";s:2:"b";s:3:"뾠";s:2:"c";s:3:"뾡";s:2:"d";s:3:"뾢";s:2:"e";s:3:"뾣";s:2:"f";s:3:"뾤";s:2:"g";s:3:"뾥";s:2:"h";s:3:"뾦";s:2:"i";s:3:"뾧";s:2:"j";s:3:"뾨";s:2:"k";s:3:"뾩";s:2:"l";s:3:"뾪";s:2:"m";s:3:"뾫";s:2:"n";s:3:"뾬";s:2:"o";s:3:"뾭";s:2:"p";s:3:"뾮";s:2:"q";s:3:"뾯";s:2:"r";s:3:"뾰";s:2:"";s:3:"뾱";s:2:"s";s:3:"뾲";s:2:"t";s:3:"뾳";s:2:"u";s:3:"뾴";s:2:"v";s:3:"뾵";s:2:"w";s:3:"뾶";s:2:"x";s:3:"뾷";s:2:"y";s:3:"뾸";s:2:"z";s:3:"뾹";s:2:"";s:3:"뾺";s:2:"";s:3:"뾻";s:2:"";s:3:"뾼";s:2:"";s:3:"뾽";s:2:"";s:3:"뾾";s:2:"";s:3:"뾿";s:2:"";s:3:"뿀";s:2:"";s:3:"뿁";s:2:"";s:3:"뿂";s:2:"";s:3:"뿃";s:2:"";s:3:"뿄";s:2:"";s:3:"뿅";s:2:"";s:3:"뿆";s:2:"";s:3:"뿇";s:2:"";s:3:"뿈";s:2:"";s:3:"뿉";s:2:"";s:3:"뿊";s:2:"";s:3:"뿋";s:2:"";s:3:"뿌";s:2:"";s:3:"뿍";s:2:"";s:3:"뿎";s:2:"";s:3:"뿏";s:2:"";s:3:"뿐";s:2:"";s:3:"뿑";s:2:"";s:3:"뿒";s:2:"";s:3:"뿓";s:2:"";s:3:"뿔";s:2:"";s:3:"뿕";s:2:"";s:3:"뿖";s:2:"";s:3:"뿗";s:2:"";s:3:"뿘";s:2:"";s:3:"뿙";s:2:"";s:3:"뿚";s:2:"";s:3:"뿛";s:2:"";s:3:"뿜";s:2:"";s:3:"뿝";s:2:"";s:3:"뿞";s:2:"";s:3:"뿟";s:2:"";s:3:"뿠";s:2:"";s:3:"뿡";s:2:"";s:3:"뿢";s:2:"";s:3:"뿣";s:2:"";s:3:"뿤";s:2:"";s:3:"뿥";s:2:"";s:3:"뿦";s:2:"";s:3:"뿧";s:2:"";s:3:"뿨";s:2:"";s:3:"뿩";s:2:"";s:3:"뿪";s:2:"";s:3:"뿫";s:2:"";s:3:"뿬";s:2:"";s:3:"뿭";s:2:"";s:3:"뿮";s:2:"";s:3:"뿯";s:2:"";s:3:"뿰";s:2:"";s:3:"뿱";s:2:"";s:3:"뿲";s:2:"";s:3:"뿳";s:2:"";s:3:"뿴";s:2:"";s:3:"뿵";s:2:"";s:3:"뿶";s:2:"";s:3:"뿷";s:2:"";s:3:"뿸";s:2:"";s:3:"뿹";s:2:"";s:3:"뿺";s:2:"";s:3:"뿻";s:2:"";s:3:"뿼";s:2:"";s:3:"뿽";s:2:"";s:3:"뿾";s:2:"";s:3:"뿿";s:2:"";s:3:"쀀";s:2:"";s:3:"쀁";s:2:"";s:3:"쀂";s:2:"";s:3:"쀃";s:2:"";s:3:"쀄";s:2:"";s:3:"쀅";s:2:"";s:3:"쀆";s:2:"";s:3:"쀇";s:2:"";s:3:"쀈";s:2:"";s:3:"쀉";s:2:"";s:3:"쀊";s:2:"";s:3:"쀋";s:2:"";s:3:"쀌";s:2:"";s:3:"쀍";s:2:"";s:3:"쀎";s:2:"";s:3:"쀏";s:2:"";s:3:"쀐";s:2:"";s:3:"쀑";s:2:"";s:3:"쀒";s:2:"";s:3:"쀓";s:2:"";s:3:"쀔";s:2:"";s:3:"쀕";s:2:"";s:3:"쀖";s:2:"";s:3:"쀗";s:2:"";s:3:"쀘";s:2:"";s:3:"쀙";s:2:"";s:3:"쀚";s:2:"";s:3:"쀛";s:2:"";s:3:"쀜";s:2:"";s:3:"쀝";s:2:"";s:3:"쀞";s:2:"";s:3:"쀟";s:2:"";s:3:"쀠";s:2:"";s:3:"쀡";s:2:"";s:3:"쀢";s:2:"";s:3:"쀣";s:2:"";s:3:"쀤";s:2:"";s:3:"쀥";s:2:"";s:3:"쀦";s:2:"";s:3:"쀧";s:2:"";s:3:"쀨";s:2:"";s:3:"쀩";s:2:"";s:3:"쀪";s:2:"";s:3:"쀫";s:2:"";s:3:"쀬";s:2:"";s:3:"쀭";s:2:"";s:3:"쀮";s:2:"";s:3:"쀯";s:2:"";s:3:"쀰";s:2:"";s:3:"쀱";s:2:"";s:3:"쀲";s:2:"";s:3:"쀳";s:2:"";s:3:"쀴";s:2:"";s:3:"쀵";s:2:"";s:3:"쀶";s:2:"";s:3:"쀷";s:2:"";s:3:"쀸";s:2:"";s:3:"쀹";s:2:"";s:3:"쀺";s:2:"";s:3:"쀻";s:2:"";s:3:"쀼";s:2:"";s:3:"쀽";s:2:"";s:3:"쀾";s:2:"";s:3:"쀿";s:2:"";s:3:"쁀";s:2:"A";s:3:"쁁";s:2:"B";s:3:"쁂";s:2:"C";s:3:"쁃";s:2:"D";s:3:"쁄";s:2:"E";s:3:"쁅";s:2:"F";s:3:"쁆";s:2:"G";s:3:"쁇";s:2:"H";s:3:"쁈";s:2:"I";s:3:"쁉";s:2:"J";s:3:"쁊";s:2:"K";s:3:"쁋";s:2:"L";s:3:"쁌";s:2:"M";s:3:"쁍";s:2:"N";s:3:"쁎";s:2:"O";s:3:"쁏";s:2:"P";s:3:"쁐";s:2:"Q";s:3:"쁑";s:2:"";s:3:"쁒";s:2:"R";s:3:"쁓";s:2:"S";s:3:"쁔";s:2:"T";s:3:"쁕";s:2:"U";s:3:"쁖";s:2:"V";s:3:"쁗";s:2:"W";s:3:"쁘";s:2:"";s:3:"쁙";s:2:"X";s:3:"쁚";s:2:"Y";s:3:"쁛";s:2:"Z";s:3:"쁜";s:2:"";s:3:"쁝";s:2:"a";s:3:"쁞";s:2:"b";s:3:"쁟";s:2:"c";s:3:"쁠";s:2:"";s:3:"쁡";s:2:"d";s:3:"쁢";s:2:"e";s:3:"쁣";s:2:"f";s:3:"쁤";s:2:"g";s:3:"쁥";s:2:"h";s:3:"쁦";s:2:"i";s:3:"쁧";s:2:"j";s:3:"쁨";s:2:"";s:3:"쁩";s:2:"";s:3:"쁪";s:2:"k";s:3:"쁫";s:2:"l";s:3:"쁬";s:2:"m";s:3:"쁭";s:2:"n";s:3:"쁮";s:2:"o";s:3:"쁯";s:2:"p";s:3:"쁰";s:2:"q";s:3:"쁱";s:2:"r";s:3:"쁲";s:2:"s";s:3:"쁳";s:2:"t";s:3:"쁴";s:2:"u";s:3:"쁵";s:2:"v";s:3:"쁶";s:2:"w";s:3:"쁷";s:2:"x";s:3:"쁸";s:2:"y";s:3:"쁹";s:2:"z";s:3:"쁺";s:2:"";s:3:"쁻";s:2:"";s:3:"쁼";s:2:"";s:3:"쁽";s:2:"";s:3:"쁾";s:2:"";s:3:"쁿";s:2:"";s:3:"삀";s:2:"";s:3:"삁";s:2:"";s:3:"삂";s:2:"";s:3:"삃";s:2:"";s:3:"삄";s:2:"";s:3:"삅";s:2:"";s:3:"삆";s:2:"";s:3:"삇";s:2:"";s:3:"삈";s:2:"";s:3:"삉";s:2:"";s:3:"삊";s:2:"";s:3:"삋";s:2:"";s:3:"삌";s:2:"";s:3:"삍";s:2:"";s:3:"삎";s:2:"";s:3:"삏";s:2:"";s:3:"삐";s:2:"";s:3:"삑";s:2:"";s:3:"삒";s:2:"";s:3:"삓";s:2:"";s:3:"삔";s:2:"";s:3:"삕";s:2:"";s:3:"삖";s:2:"";s:3:"삗";s:2:"";s:3:"삘";s:2:"";s:3:"삙";s:2:"";s:3:"삚";s:2:"";s:3:"삛";s:2:"";s:3:"삜";s:2:"";s:3:"삝";s:2:"";s:3:"삞";s:2:"";s:3:"삟";s:2:"";s:3:"삠";s:2:"";s:3:"삡";s:2:"";s:3:"삢";s:2:"";s:3:"삣";s:2:"";s:3:"삤";s:2:"";s:3:"삥";s:2:"";s:3:"삦";s:2:"";s:3:"삧";s:2:"";s:3:"삨";s:2:"";s:3:"삩";s:2:"";s:3:"삪";s:2:"";s:3:"삫";s:2:"";s:3:"사";s:2:"";s:3:"삭";s:2:"";s:3:"삮";s:2:"";s:3:"삯";s:2:"";s:3:"산";s:2:"";s:3:"삱";s:2:"";s:3:"삲";s:2:"";s:3:"삳";s:2:"";s:3:"살";s:2:"";s:3:"삵";s:2:"";s:3:"삶";s:2:"";s:3:"삷";s:2:"";s:3:"삸";s:2:"";s:3:"삹";s:2:"";s:3:"삺";s:2:"";s:3:"삻";s:2:"";s:3:"삼";s:2:"";s:3:"삽";s:2:"";s:3:"삾";s:2:"";s:3:"삿";s:2:"";s:3:"샀";s:2:"";s:3:"상";s:2:"";s:3:"샂";s:2:"";s:3:"샃";s:2:"";s:3:"샄";s:2:"";s:3:"샅";s:2:"";s:3:"샆";s:2:"";s:3:"샇";s:2:"";s:3:"새";s:2:"";s:3:"색";s:2:"";s:3:"샊";s:2:"";s:3:"샋";s:2:"";s:3:"샌";s:2:"";s:3:"샍";s:2:"";s:3:"샎";s:2:"";s:3:"샏";s:2:"";s:3:"샐";s:2:"";s:3:"샑";s:2:"";s:3:"샒";s:2:"";s:3:"샓";s:2:"";s:3:"샔";s:2:"";s:3:"샕";s:2:"";s:3:"샖";s:2:"";s:3:"샗";s:2:"";s:3:"샘";s:2:"";s:3:"샙";s:2:"";s:3:"샚";s:2:"";s:3:"샛";s:2:"";s:3:"샜";s:2:"";s:3:"생";s:2:"";s:3:"샞";s:2:"";s:3:"샟";s:2:"";s:3:"샠";s:2:"";s:3:"샡";s:2:"";s:3:"샢";s:2:"";s:3:"샣";s:2:"";s:3:"샤";s:2:"";s:3:"샥";s:2:"";s:3:"샦";s:2:"";s:3:"샧";s:2:"";s:3:"샨";s:2:"";s:3:"샩";s:2:"";s:3:"샪";s:2:"";s:3:"샫";s:2:"";s:3:"샬";s:2:"";s:3:"샭";s:2:"";s:3:"샮";s:2:"";s:3:"샯";s:2:"";s:3:"샰";s:2:"";s:3:"샱";s:2:"";s:3:"샲";s:2:"";s:3:"샳";s:2:"";s:3:"샴";s:2:"";s:3:"샵";s:2:"";s:3:"샶";s:2:"";s:3:"샷";s:2:"";s:3:"샸";s:2:"";s:3:"샹";s:2:"";s:3:"샺";s:2:"";s:3:"샻";s:2:"";s:3:"샼";s:2:"";s:3:"샽";s:2:"";s:3:"샾";s:2:"";s:3:"샿";s:2:"";s:3:"섀";s:2:"";s:3:"섁";s:2:"";s:3:"섂";s:2:"";s:3:"섃";s:2:"";s:3:"섄";s:2:"";s:3:"섅";s:2:"";s:3:"섆";s:2:"";s:3:"섇";s:2:"";s:3:"섈";s:2:"";s:3:"섉";s:2:"";s:3:"섊";s:2:"";s:3:"섋";s:2:"";s:3:"섌";s:2:"";s:3:"섍";s:2:"";s:3:"섎";s:2:"";s:3:"섏";s:2:"";s:3:"섐";s:2:"";s:3:"섑";s:2:"";s:3:"섒";s:2:"";s:3:"섓";s:2:"";s:3:"섔";s:2:"";s:3:"섕";s:2:"";s:3:"섖";s:2:"";s:3:"섗";s:2:"";s:3:"섘";s:2:"";s:3:"섙";s:2:"";s:3:"섚";s:2:"";s:3:"섛";s:2:"";s:3:"서";s:2:"";s:3:"석";s:2:"";s:3:"섞";s:2:"";s:3:"섟";s:2:"";s:3:"선";s:2:"";s:3:"섡";s:2:"";s:3:"섢";s:2:"";s:3:"섣";s:2:"";s:3:"설";s:2:"";s:3:"섥";s:2:"";s:3:"섦";s:2:"";s:3:"섧";s:2:"";s:3:"섨";s:2:"";s:3:"섩";s:2:"";s:3:"섪";s:2:"";s:3:"섫";s:2:"";s:3:"섬";s:2:"";s:3:"섭";s:2:"";s:3:"섮";s:2:"";s:3:"섯";s:2:"";s:3:"섰";s:2:"";s:3:"성";s:2:"";s:3:"섲";s:2:"A";s:3:"섳";s:2:"B";s:3:"섴";s:2:"C";s:3:"섵";s:2:"D";s:3:"섶";s:2:"";s:3:"섷";s:2:"E";s:3:"세";s:2:"";s:3:"섹";s:2:"";s:3:"섺";s:2:"F";s:3:"섻";s:2:"G";s:3:"센";s:2:"";s:3:"섽";s:2:"H";s:3:"섾";s:2:"I";s:3:"섿";s:2:"J";s:3:"셀";s:2:"";s:3:"셁";s:2:"K";s:3:"셂";s:2:"L";s:3:"셃";s:2:"M";s:3:"셄";s:2:"N";s:3:"셅";s:2:"O";s:3:"셆";s:2:"P";s:3:"셇";s:2:"Q";s:3:"셈";s:2:"";s:3:"셉";s:2:"";s:3:"셊";s:2:"R";s:3:"셋";s:2:"";s:3:"셌";s:2:"";s:3:"셍";s:2:"";s:3:"셎";s:2:"S";s:3:"셏";s:2:"T";s:3:"셐";s:2:"U";s:3:"셑";s:2:"V";s:3:"셒";s:2:"W";s:3:"셓";s:2:"X";s:3:"셔";s:2:"";s:3:"셕";s:2:"";s:3:"셖";s:2:"Y";s:3:"셗";s:2:"Z";s:3:"션";s:2:"";s:3:"셙";s:2:"a";s:3:"셚";s:2:"b";s:3:"셛";s:2:"c";s:3:"셜";s:2:"";s:3:"셝";s:2:"d";s:3:"셞";s:2:"e";s:3:"셟";s:2:"f";s:3:"셠";s:2:"g";s:3:"셡";s:2:"h";s:3:"셢";s:2:"i";s:3:"셣";s:2:"j";s:3:"셤";s:2:"";s:3:"셥";s:2:"";s:3:"셦";s:2:"k";s:3:"셧";s:2:"";s:3:"셨";s:2:"";s:3:"셩";s:2:"";s:3:"셪";s:2:"l";s:3:"셫";s:2:"m";s:3:"셬";s:2:"n";s:3:"셭";s:2:"o";s:3:"셮";s:2:"p";s:3:"셯";s:2:"q";s:3:"셰";s:2:"";s:3:"셱";s:2:"r";s:3:"셲";s:2:"s";s:3:"셳";s:2:"t";s:3:"셴";s:2:"";s:3:"셵";s:2:"u";s:3:"셶";s:2:"v";s:3:"셷";s:2:"w";s:3:"셸";s:2:"";s:3:"셹";s:2:"x";s:3:"셺";s:2:"y";s:3:"셻";s:2:"z";s:3:"셼";s:2:"";s:3:"셽";s:2:"";s:3:"셾";s:2:"";s:3:"셿";s:2:"";s:3:"솀";s:2:"";s:3:"솁";s:2:"";s:3:"솂";s:2:"";s:3:"솃";s:2:"";s:3:"솄";s:2:"";s:3:"솅";s:2:"";s:3:"솆";s:2:"";s:3:"솇";s:2:"";s:3:"솈";s:2:"";s:3:"솉";s:2:"";s:3:"솊";s:2:"";s:3:"솋";s:2:"";s:3:"소";s:2:"";s:3:"속";s:2:"";s:3:"솎";s:2:"";s:3:"솏";s:2:"";s:3:"손";s:2:"";s:3:"솑";s:2:"";s:3:"솒";s:2:"";s:3:"솓";s:2:"";s:3:"솔";s:2:"";s:3:"솕";s:2:"";s:3:"솖";s:2:"";s:3:"솗";s:2:"";s:3:"솘";s:2:"";s:3:"솙";s:2:"";s:3:"솚";s:2:"";s:3:"솛";s:2:"";s:3:"솜";s:2:"";s:3:"솝";s:2:"";s:3:"솞";s:2:"";s:3:"솟";s:2:"";s:3:"솠";s:2:"";s:3:"송";s:2:"";s:3:"솢";s:2:"";s:3:"솣";s:2:"";s:3:"솤";s:2:"";s:3:"솥";s:2:"";s:3:"솦";s:2:"";s:3:"솧";s:2:"";s:3:"솨";s:2:"";s:3:"솩";s:2:"";s:3:"솪";s:2:"";s:3:"솫";s:2:"";s:3:"솬";s:2:"";s:3:"솭";s:2:"";s:3:"솮";s:2:"";s:3:"솯";s:2:"";s:3:"솰";s:2:"";s:3:"솱";s:2:"";s:3:"솲";s:2:"";s:3:"솳";s:2:"";s:3:"솴";s:2:"";s:3:"솵";s:2:"";s:3:"솶";s:2:"";s:3:"솷";s:2:"";s:3:"솸";s:2:"";s:3:"솹";s:2:"";s:3:"솺";s:2:"";s:3:"솻";s:2:"";s:3:"솼";s:2:"";s:3:"솽";s:2:"";s:3:"솾";s:2:"";s:3:"솿";s:2:"";s:3:"쇀";s:2:"";s:3:"쇁";s:2:"";s:3:"쇂";s:2:"";s:3:"쇃";s:2:"";s:3:"쇄";s:2:"";s:3:"쇅";s:2:"";s:3:"쇆";s:2:"";s:3:"쇇";s:2:"";s:3:"쇈";s:2:"";s:3:"쇉";s:2:"";s:3:"쇊";s:2:"";s:3:"쇋";s:2:"";s:3:"쇌";s:2:"";s:3:"쇍";s:2:"";s:3:"쇎";s:2:"";s:3:"쇏";s:2:"";s:3:"쇐";s:2:"";s:3:"쇑";s:2:"";s:3:"쇒";s:2:"";s:3:"쇓";s:2:"";s:3:"쇔";s:2:"";s:3:"쇕";s:2:"";s:3:"쇖";s:2:"";s:3:"쇗";s:2:"";s:3:"쇘";s:2:"";s:3:"쇙";s:2:"";s:3:"쇚";s:2:"";s:3:"쇛";s:2:"";s:3:"쇜";s:2:"";s:3:"쇝";s:2:"";s:3:"쇞";s:2:"";s:3:"쇟";s:2:"";s:3:"쇠";s:2:"";s:3:"쇡";s:2:"";s:3:"쇢";s:2:"";s:3:"쇣";s:2:"";s:3:"쇤";s:2:"";s:3:"쇥";s:2:"";s:3:"쇦";s:2:"";s:3:"쇧";s:2:"";s:3:"쇨";s:2:"";s:3:"쇩";s:2:"";s:3:"쇪";s:2:"";s:3:"쇫";s:2:"";s:3:"쇬";s:2:"";s:3:"쇭";s:2:"";s:3:"쇮";s:2:"";s:3:"쇯";s:2:"";s:3:"쇰";s:2:"";s:3:"쇱";s:2:"";s:3:"쇲";s:2:"";s:3:"쇳";s:2:"";s:3:"쇴";s:2:"";s:3:"쇵";s:2:"";s:3:"쇶";s:2:"";s:3:"쇷";s:2:"";s:3:"쇸";s:2:"";s:3:"쇹";s:2:"";s:3:"쇺";s:2:"";s:3:"쇻";s:2:"";s:3:"쇼";s:2:"";s:3:"쇽";s:2:"";s:3:"쇾";s:2:"";s:3:"쇿";s:2:"";s:3:"숀";s:2:"";s:3:"숁";s:2:"";s:3:"숂";s:2:"";s:3:"숃";s:2:"";s:3:"숄";s:2:"";s:3:"숅";s:2:"";s:3:"숆";s:2:"";s:3:"숇";s:2:"";s:3:"숈";s:2:"";s:3:"숉";s:2:"";s:3:"숊";s:2:"";s:3:"숋";s:2:"";s:3:"숌";s:2:"";s:3:"숍";s:2:"";s:3:"숎";s:2:"";s:3:"숏";s:2:"";s:3:"숐";s:2:"";s:3:"숑";s:2:"";s:3:"숒";s:2:"";s:3:"숓";s:2:"";s:3:"숔";s:2:"";s:3:"숕";s:2:"";s:3:"숖";s:2:"";s:3:"숗";s:2:"";s:3:"수";s:2:"";s:3:"숙";s:2:"";s:3:"숚";s:2:"";s:3:"숛";s:2:"";s:3:"순";s:2:"";s:3:"숝";s:2:"";s:3:"숞";s:2:"";s:3:"숟";s:2:"";s:3:"술";s:2:"";s:3:"숡";s:2:"";s:3:"숢";s:2:"";s:3:"숣";s:2:"";s:3:"숤";s:2:"A";s:3:"숥";s:2:"B";s:3:"숦";s:2:"C";s:3:"숧";s:2:"D";s:3:"숨";s:2:"";s:3:"숩";s:2:"";s:3:"숪";s:2:"E";s:3:"숫";s:2:"";s:3:"숬";s:2:"F";s:3:"숭";s:2:"";s:3:"숮";s:2:"G";s:3:"숯";s:2:"";s:3:"숰";s:2:"H";s:3:"숱";s:2:"";s:3:"숲";s:2:"";s:3:"숳";s:2:"I";s:3:"숴";s:2:"";s:3:"숵";s:2:"J";s:3:"숶";s:2:"K";s:3:"숷";s:2:"L";s:3:"숸";s:2:"M";s:3:"숹";s:2:"N";s:3:"숺";s:2:"O";s:3:"숻";s:2:"P";s:3:"숼";s:2:"Q";s:3:"숽";s:2:"R";s:3:"숾";s:2:"S";s:3:"숿";s:2:"T";s:3:"쉀";s:2:"U";s:3:"쉁";s:2:"V";s:3:"쉂";s:2:"W";s:3:"쉃";s:2:"X";s:3:"쉄";s:2:"Y";s:3:"쉅";s:2:"Z";s:3:"쉆";s:2:"a";s:3:"쉇";s:2:"b";s:3:"쉈";s:2:"";s:3:"쉉";s:2:"c";s:3:"쉊";s:2:"d";s:3:"쉋";s:2:"e";s:3:"쉌";s:2:"f";s:3:"쉍";s:2:"g";s:3:"쉎";s:2:"h";s:3:"쉏";s:2:"i";s:3:"쉐";s:2:"";s:3:"쉑";s:2:"";s:3:"쉒";s:2:"j";s:3:"쉓";s:2:"k";s:3:"쉔";s:2:"";s:3:"쉕";s:2:"l";s:3:"쉖";s:2:"m";s:3:"쉗";s:2:"n";s:3:"쉘";s:2:"";s:3:"쉙";s:2:"o";s:3:"쉚";s:2:"p";s:3:"쉛";s:2:"q";s:3:"쉜";s:2:"r";s:3:"쉝";s:2:"s";s:3:"쉞";s:2:"t";s:3:"쉟";s:2:"u";s:3:"쉠";s:2:"";s:3:"쉡";s:2:"v";s:3:"쉢";s:2:"w";s:3:"쉣";s:2:"x";s:3:"쉤";s:2:"y";s:3:"쉥";s:2:"";s:3:"쉦";s:2:"z";s:3:"쉧";s:2:"";s:3:"쉨";s:2:"";s:3:"쉩";s:2:"";s:3:"쉪";s:2:"";s:3:"쉫";s:2:"";s:3:"쉬";s:2:"";s:3:"쉭";s:2:"";s:3:"쉮";s:2:"";s:3:"쉯";s:2:"";s:3:"쉰";s:2:"";s:3:"쉱";s:2:"";s:3:"쉲";s:2:"";s:3:"쉳";s:2:"";s:3:"쉴";s:2:"";s:3:"쉵";s:2:"";s:3:"쉶";s:2:"";s:3:"쉷";s:2:"";s:3:"쉸";s:2:"";s:3:"쉹";s:2:"";s:3:"쉺";s:2:"";s:3:"쉻";s:2:"";s:3:"쉼";s:2:"";s:3:"쉽";s:2:"";s:3:"쉾";s:2:"";s:3:"쉿";s:2:"";s:3:"슀";s:2:"";s:3:"슁";s:2:"";s:3:"슂";s:2:"";s:3:"슃";s:2:"";s:3:"슄";s:2:"";s:3:"슅";s:2:"";s:3:"슆";s:2:"";s:3:"슇";s:2:"";s:3:"슈";s:2:"";s:3:"슉";s:2:"";s:3:"슊";s:2:"";s:3:"슋";s:2:"";s:3:"슌";s:2:"";s:3:"슍";s:2:"";s:3:"슎";s:2:"";s:3:"슏";s:2:"";s:3:"슐";s:2:"";s:3:"슑";s:2:"";s:3:"슒";s:2:"";s:3:"슓";s:2:"";s:3:"슔";s:2:"";s:3:"슕";s:2:"";s:3:"슖";s:2:"";s:3:"슗";s:2:"";s:3:"슘";s:2:"";s:3:"슙";s:2:"";s:3:"슚";s:2:"";s:3:"슛";s:2:"";s:3:"슜";s:2:"";s:3:"슝";s:2:"";s:3:"슞";s:2:"";s:3:"슟";s:2:"";s:3:"슠";s:2:"";s:3:"슡";s:2:"";s:3:"슢";s:2:"";s:3:"슣";s:2:"";s:3:"스";s:2:"";s:3:"슥";s:2:"";s:3:"슦";s:2:"";s:3:"슧";s:2:"";s:3:"슨";s:2:"";s:3:"슩";s:2:"";s:3:"슪";s:2:"";s:3:"슫";s:2:"";s:3:"슬";s:2:"";s:3:"슭";s:2:"";s:3:"슮";s:2:"";s:3:"슯";s:2:"";s:3:"슰";s:2:"";s:3:"슱";s:2:"";s:3:"슲";s:2:"";s:3:"슳";s:2:"";s:3:"슴";s:2:"";s:3:"습";s:2:"";s:3:"슶";s:2:"";s:3:"슷";s:2:"";s:3:"슸";s:2:"";s:3:"승";s:2:"";s:3:"슺";s:2:"";s:3:"슻";s:2:"";s:3:"슼";s:2:"";s:3:"슽";s:2:"";s:3:"슾";s:2:"";s:3:"슿";s:2:"";s:3:"싀";s:2:"";s:3:"싁";s:2:"";s:3:"싂";s:2:"";s:3:"싃";s:2:"";s:3:"싄";s:2:"";s:3:"싅";s:2:"";s:3:"싆";s:2:"";s:3:"싇";s:2:"";s:3:"싈";s:2:"";s:3:"싉";s:2:"";s:3:"싊";s:2:"";s:3:"싋";s:2:"";s:3:"싌";s:2:"";s:3:"싍";s:2:"";s:3:"싎";s:2:"";s:3:"싏";s:2:"";s:3:"싐";s:2:"";s:3:"싑";s:2:"";s:3:"싒";s:2:"";s:3:"싓";s:2:"";s:3:"싔";s:2:"";s:3:"싕";s:2:"";s:3:"싖";s:2:"";s:3:"싗";s:2:"";s:3:"싘";s:2:"";s:3:"싙";s:2:"";s:3:"싚";s:2:"";s:3:"싛";s:2:"";s:3:"시";s:2:"";s:3:"식";s:2:"";s:3:"싞";s:2:"";s:3:"싟";s:2:"";s:3:"신";s:2:"";s:3:"싡";s:2:"";s:3:"싢";s:2:"";s:3:"싣";s:2:"";s:3:"실";s:2:"";s:3:"싥";s:2:"";s:3:"싦";s:2:"";s:3:"싧";s:2:"";s:3:"싨";s:2:"";s:3:"싩";s:2:"";s:3:"싪";s:2:"";s:3:"싫";s:2:"";s:3:"심";s:2:"";s:3:"십";s:2:"";s:3:"싮";s:2:"";s:3:"싯";s:2:"";s:3:"싰";s:2:"";s:3:"싱";s:2:"";s:3:"싲";s:2:"";s:3:"싳";s:2:"";s:3:"싴";s:2:"";s:3:"싵";s:2:"";s:3:"싶";s:2:"";s:3:"싷";s:2:"";s:3:"싸";s:2:"";s:3:"싹";s:2:"";s:3:"싺";s:2:"";s:3:"싻";s:2:"";s:3:"싼";s:2:"";s:3:"싽";s:2:"";s:3:"싾";s:2:"";s:3:"싿";s:2:"";s:3:"쌀";s:2:"";s:3:"쌁";s:2:"";s:3:"쌂";s:2:"";s:3:"쌃";s:2:"";s:3:"쌄";s:2:"";s:3:"쌅";s:2:"";s:3:"쌆";s:2:"";s:3:"쌇";s:2:"";s:3:"쌈";s:2:"";s:3:"쌉";s:2:"";s:3:"쌊";s:2:"";s:3:"쌋";s:2:"";s:3:"쌌";s:2:"";s:3:"쌍";s:2:"";s:3:"쌎";s:2:"";s:3:"쌏";s:2:"";s:3:"쌐";s:2:"A";s:3:"쌑";s:2:"B";s:3:"쌒";s:2:"C";s:3:"쌓";s:2:"";s:3:"쌔";s:2:"";s:3:"쌕";s:2:"";s:3:"쌖";s:2:"D";s:3:"쌗";s:2:"E";s:3:"쌘";s:2:"";s:3:"쌙";s:2:"F";s:3:"쌚";s:2:"G";s:3:"쌛";s:2:"H";s:3:"쌜";s:2:"";s:3:"쌝";s:2:"I";s:3:"쌞";s:2:"J";s:3:"쌟";s:2:"K";s:3:"쌠";s:2:"L";s:3:"쌡";s:2:"M";s:3:"쌢";s:2:"N";s:3:"쌣";s:2:"O";s:3:"쌤";s:2:"";s:3:"쌥";s:2:"";s:3:"쌦";s:2:"P";s:3:"쌧";s:2:"Q";s:3:"쌨";s:2:"";s:3:"쌩";s:2:"";s:3:"쌪";s:2:"R";s:3:"쌫";s:2:"S";s:3:"쌬";s:2:"T";s:3:"쌭";s:2:"U";s:3:"쌮";s:2:"V";s:3:"쌯";s:2:"W";s:3:"쌰";s:2:"X";s:3:"쌱";s:2:"Y";s:3:"쌲";s:2:"Z";s:3:"쌳";s:2:"a";s:3:"쌴";s:2:"b";s:3:"쌵";s:2:"c";s:3:"쌶";s:2:"d";s:3:"쌷";s:2:"e";s:3:"쌸";s:2:"f";s:3:"쌹";s:2:"g";s:3:"쌺";s:2:"h";s:3:"쌻";s:2:"i";s:3:"쌼";s:2:"j";s:3:"쌽";s:2:"k";s:3:"쌾";s:2:"l";s:3:"쌿";s:2:"m";s:3:"썀";s:2:"n";s:3:"썁";s:2:"o";s:3:"썂";s:2:"p";s:3:"썃";s:2:"q";s:3:"썄";s:2:"r";s:3:"썅";s:2:"";s:3:"썆";s:2:"s";s:3:"썇";s:2:"t";s:3:"썈";s:2:"u";s:3:"썉";s:2:"v";s:3:"썊";s:2:"w";s:3:"썋";s:2:"x";s:3:"썌";s:2:"y";s:3:"썍";s:2:"z";s:3:"썎";s:2:"";s:3:"썏";s:2:"";s:3:"썐";s:2:"";s:3:"썑";s:2:"";s:3:"썒";s:2:"";s:3:"썓";s:2:"";s:3:"썔";s:2:"";s:3:"썕";s:2:"";s:3:"썖";s:2:"";s:3:"썗";s:2:"";s:3:"썘";s:2:"";s:3:"썙";s:2:"";s:3:"썚";s:2:"";s:3:"썛";s:2:"";s:3:"썜";s:2:"";s:3:"썝";s:2:"";s:3:"썞";s:2:"";s:3:"썟";s:2:"";s:3:"썠";s:2:"";s:3:"썡";s:2:"";s:3:"썢";s:2:"";s:3:"썣";s:2:"";s:3:"썤";s:2:"";s:3:"썥";s:2:"";s:3:"썦";s:2:"";s:3:"썧";s:2:"";s:3:"써";s:2:"";s:3:"썩";s:2:"";s:3:"썪";s:2:"";s:3:"썫";s:2:"";s:3:"썬";s:2:"";s:3:"썭";s:2:"";s:3:"썮";s:2:"";s:3:"썯";s:2:"";s:3:"썰";s:2:"";s:3:"썱";s:2:"";s:3:"썲";s:2:"";s:3:"썳";s:2:"";s:3:"썴";s:2:"";s:3:"썵";s:2:"";s:3:"썶";s:2:"";s:3:"썷";s:2:"";s:3:"썸";s:2:"";s:3:"썹";s:2:"";s:3:"썺";s:2:"";s:3:"썻";s:2:"";s:3:"썼";s:2:"";s:3:"썽";s:2:"";s:3:"썾";s:2:"";s:3:"썿";s:2:"";s:3:"쎀";s:2:"";s:3:"쎁";s:2:"";s:3:"쎂";s:2:"";s:3:"쎃";s:2:"";s:3:"쎄";s:2:"";s:3:"쎅";s:2:"";s:3:"쎆";s:2:"";s:3:"쎇";s:2:"";s:3:"쎈";s:2:"";s:3:"쎉";s:2:"";s:3:"쎊";s:2:"";s:3:"쎋";s:2:"";s:3:"쎌";s:2:"";s:3:"쎍";s:2:"";s:3:"쎎";s:2:"";s:3:"쎏";s:2:"";s:3:"쎐";s:2:"";s:3:"쎑";s:2:"";s:3:"쎒";s:2:"";s:3:"쎓";s:2:"";s:3:"쎔";s:2:"";s:3:"쎕";s:2:"";s:3:"쎖";s:2:"";s:3:"쎗";s:2:"";s:3:"쎘";s:2:"";s:3:"쎙";s:2:"";s:3:"쎚";s:2:"";s:3:"쎛";s:2:"";s:3:"쎜";s:2:"";s:3:"쎝";s:2:"";s:3:"쎞";s:2:"";s:3:"쎟";s:2:"";s:3:"쎠";s:2:"";s:3:"쎡";s:2:"";s:3:"쎢";s:2:"";s:3:"쎣";s:2:"";s:3:"쎤";s:2:"";s:3:"쎥";s:2:"";s:3:"쎦";s:2:"";s:3:"쎧";s:2:"";s:3:"쎨";s:2:"";s:3:"쎩";s:2:"";s:3:"쎪";s:2:"";s:3:"쎫";s:2:"";s:3:"쎬";s:2:"";s:3:"쎭";s:2:"";s:3:"쎮";s:2:"";s:3:"쎯";s:2:"";s:3:"쎰";s:2:"";s:3:"쎱";s:2:"";s:3:"쎲";s:2:"";s:3:"쎳";s:2:"";s:3:"쎴";s:2:"";s:3:"쎵";s:2:"";s:3:"쎶";s:2:"";s:3:"쎷";s:2:"";s:3:"쎸";s:2:"";s:3:"쎹";s:2:"";s:3:"쎺";s:2:"";s:3:"쎻";s:2:"";s:3:"쎼";s:2:"";s:3:"쎽";s:2:"";s:3:"쎾";s:2:"";s:3:"쎿";s:2:"";s:3:"쏀";s:2:"";s:3:"쏁";s:2:"";s:3:"쏂";s:2:"";s:3:"쏃";s:2:"";s:3:"쏄";s:2:"";s:3:"쏅";s:2:"";s:3:"쏆";s:2:"";s:3:"쏇";s:2:"";s:3:"쏈";s:2:"";s:3:"쏉";s:2:"";s:3:"쏊";s:2:"";s:3:"쏋";s:2:"";s:3:"쏌";s:2:"";s:3:"쏍";s:2:"";s:3:"쏎";s:2:"";s:3:"쏏";s:2:"";s:3:"쏐";s:2:"";s:3:"쏑";s:2:"";s:3:"쏒";s:2:"";s:3:"쏓";s:2:"";s:3:"쏔";s:2:"";s:3:"쏕";s:2:"";s:3:"쏖";s:2:"";s:3:"쏗";s:2:"";s:3:"쏘";s:2:"";s:3:"쏙";s:2:"";s:3:"쏚";s:2:"";s:3:"쏛";s:2:"A";s:3:"쏜";s:2:"";s:3:"쏝";s:2:"B";s:3:"쏞";s:2:"C";s:3:"쏟";s:2:"";s:3:"쏠";s:2:"";s:3:"쏡";s:2:"D";s:3:"쏢";s:2:"";s:3:"쏣";s:2:"E";s:3:"쏤";s:2:"F";s:3:"쏥";s:2:"G";s:3:"쏦";s:2:"H";s:3:"쏧";s:2:"I";s:3:"쏨";s:2:"";s:3:"쏩";s:2:"";s:3:"쏪";s:2:"J";s:3:"쏫";s:2:"K";s:3:"쏬";s:2:"L";s:3:"쏭";s:2:"";s:3:"쏮";s:2:"M";s:3:"쏯";s:2:"N";s:3:"쏰";s:2:"O";s:3:"쏱";s:2:"P";s:3:"쏲";s:2:"Q";s:3:"쏳";s:2:"R";s:3:"쏴";s:2:"";s:3:"쏵";s:2:"";s:3:"쏶";s:2:"S";s:3:"쏷";s:2:"T";s:3:"쏸";s:2:"";s:3:"쏹";s:2:"U";s:3:"쏺";s:2:"V";s:3:"쏻";s:2:"W";s:3:"쏼";s:2:"X";s:3:"쏽";s:2:"Y";s:3:"쏾";s:2:"Z";s:3:"쏿";s:2:"a";s:3:"쐀";s:2:"b";s:3:"쐁";s:2:"c";s:3:"쐂";s:2:"d";s:3:"쐃";s:2:"e";s:3:"쐄";s:2:"f";s:3:"쐅";s:2:"g";s:3:"쐆";s:2:"h";s:3:"쐇";s:2:"i";s:3:"쐈";s:2:"";s:3:"쐉";s:2:"j";s:3:"쐊";s:2:"k";s:3:"쐋";s:2:"l";s:3:"쐌";s:2:"m";s:3:"쐍";s:2:"n";s:3:"쐎";s:2:"o";s:3:"쐏";s:2:"p";s:3:"쐐";s:2:"";s:3:"쐑";s:2:"q";s:3:"쐒";s:2:"r";s:3:"쐓";s:2:"s";s:3:"쐔";s:2:"t";s:3:"쐕";s:2:"u";s:3:"쐖";s:2:"v";s:3:"쐗";s:2:"w";s:3:"쐘";s:2:"x";s:3:"쐙";s:2:"y";s:3:"쐚";s:2:"z";s:3:"쐛";s:2:"";s:3:"쐜";s:2:"";s:3:"쐝";s:2:"";s:3:"쐞";s:2:"";s:3:"쐟";s:2:"";s:3:"쐠";s:2:"";s:3:"쐡";s:2:"";s:3:"쐢";s:2:"";s:3:"쐣";s:2:"";s:3:"쐤";s:2:"";s:3:"쐥";s:2:"";s:3:"쐦";s:2:"";s:3:"쐧";s:2:"";s:3:"쐨";s:2:"";s:3:"쐩";s:2:"";s:3:"쐪";s:2:"";s:3:"쐫";s:2:"";s:3:"쐬";s:2:"";s:3:"쐭";s:2:"";s:3:"쐮";s:2:"";s:3:"쐯";s:2:"";s:3:"쐰";s:2:"";s:3:"쐱";s:2:"";s:3:"쐲";s:2:"";s:3:"쐳";s:2:"";s:3:"쐴";s:2:"";s:3:"쐵";s:2:"";s:3:"쐶";s:2:"";s:3:"쐷";s:2:"";s:3:"쐸";s:2:"";s:3:"쐹";s:2:"";s:3:"쐺";s:2:"";s:3:"쐻";s:2:"";s:3:"쐼";s:2:"";s:3:"쐽";s:2:"";s:3:"쐾";s:2:"";s:3:"쐿";s:2:"";s:3:"쑀";s:2:"";s:3:"쑁";s:2:"";s:3:"쑂";s:2:"";s:3:"쑃";s:2:"";s:3:"쑄";s:2:"";s:3:"쑅";s:2:"";s:3:"쑆";s:2:"";s:3:"쑇";s:2:"";s:3:"쑈";s:2:"";s:3:"쑉";s:2:"";s:3:"쑊";s:2:"";s:3:"쑋";s:2:"";s:3:"쑌";s:2:"";s:3:"쑍";s:2:"";s:3:"쑎";s:2:"";s:3:"쑏";s:2:"";s:3:"쑐";s:2:"";s:3:"쑑";s:2:"";s:3:"쑒";s:2:"";s:3:"쑓";s:2:"";s:3:"쑔";s:2:"";s:3:"쑕";s:2:"";s:3:"쑖";s:2:"";s:3:"쑗";s:2:"";s:3:"쑘";s:2:"";s:3:"쑙";s:2:"";s:3:"쑚";s:2:"";s:3:"쑛";s:2:"";s:3:"쑜";s:2:"";s:3:"쑝";s:2:"";s:3:"쑞";s:2:"";s:3:"쑟";s:2:"";s:3:"쑠";s:2:"";s:3:"쑡";s:2:"";s:3:"쑢";s:2:"";s:3:"쑣";s:2:"";s:3:"쑤";s:2:"";s:3:"쑥";s:2:"";s:3:"쑦";s:2:"";s:3:"쑧";s:2:"";s:3:"쑨";s:2:"";s:3:"쑩";s:2:"";s:3:"쑪";s:2:"";s:3:"쑫";s:2:"";s:3:"쑬";s:2:"";s:3:"쑭";s:2:"";s:3:"쑮";s:2:"";s:3:"쑯";s:2:"";s:3:"쑰";s:2:"";s:3:"쑱";s:2:"";s:3:"쑲";s:2:"";s:3:"쑳";s:2:"";s:3:"쑴";s:2:"";s:3:"쑵";s:2:"";s:3:"쑶";s:2:"";s:3:"쑷";s:2:"";s:3:"쑸";s:2:"";s:3:"쑹";s:2:"";s:3:"쑺";s:2:"";s:3:"쑻";s:2:"";s:3:"쑼";s:2:"";s:3:"쑽";s:2:"";s:3:"쑾";s:2:"";s:3:"쑿";s:2:"";s:3:"쒀";s:2:"";s:3:"쒁";s:2:"";s:3:"쒂";s:2:"";s:3:"쒃";s:2:"";s:3:"쒄";s:2:"";s:3:"쒅";s:2:"";s:3:"쒆";s:2:"";s:3:"쒇";s:2:"";s:3:"쒈";s:2:"";s:3:"쒉";s:2:"";s:3:"쒊";s:2:"";s:3:"쒋";s:2:"";s:3:"쒌";s:2:"";s:3:"쒍";s:2:"";s:3:"쒎";s:2:"";s:3:"쒏";s:2:"";s:3:"쒐";s:2:"";s:3:"쒑";s:2:"";s:3:"쒒";s:2:"";s:3:"쒓";s:2:"";s:3:"쒔";s:2:"";s:3:"쒕";s:2:"";s:3:"쒖";s:2:"";s:3:"쒗";s:2:"";s:3:"쒘";s:2:"";s:3:"쒙";s:2:"";s:3:"쒚";s:2:"";s:3:"쒛";s:2:"";s:3:"쒜";s:2:"";s:3:"쒝";s:2:"";s:3:"쒞";s:2:"";s:3:"쒟";s:2:"";s:3:"쒠";s:2:"";s:3:"쒡";s:2:"";s:3:"쒢";s:2:"";s:3:"쒣";s:2:"";s:3:"쒤";s:2:"";s:3:"쒥";s:2:"";s:3:"쒦";s:2:"";s:3:"쒧";s:2:"";s:3:"쒨";s:2:"";s:3:"쒩";s:2:"";s:3:"쒪";s:2:"A";s:3:"쒫";s:2:"B";s:3:"쒬";s:2:"C";s:3:"쒭";s:2:"D";s:3:"쒮";s:2:"E";s:3:"쒯";s:2:"F";s:3:"쒰";s:2:"G";s:3:"쒱";s:2:"H";s:3:"쒲";s:2:"I";s:3:"쒳";s:2:"J";s:3:"쒴";s:2:"K";s:3:"쒵";s:2:"L";s:3:"쒶";s:2:"M";s:3:"쒷";s:2:"N";s:3:"쒸";s:2:"";s:3:"쒹";s:2:"O";s:3:"쒺";s:2:"P";s:3:"쒻";s:2:"Q";s:3:"쒼";s:2:"";s:3:"쒽";s:2:"R";s:3:"쒾";s:2:"S";s:3:"쒿";s:2:"T";s:3:"쓀";s:2:"U";s:3:"쓁";s:2:"V";s:3:"쓂";s:2:"W";s:3:"쓃";s:2:"X";s:3:"쓄";s:2:"Y";s:3:"쓅";s:2:"Z";s:3:"쓆";s:2:"a";s:3:"쓇";s:2:"b";s:3:"쓈";s:2:"c";s:3:"쓉";s:2:"d";s:3:"쓊";s:2:"e";s:3:"쓋";s:2:"f";s:3:"쓌";s:2:"g";s:3:"쓍";s:2:"h";s:3:"쓎";s:2:"i";s:3:"쓏";s:2:"j";s:3:"쓐";s:2:"k";s:3:"쓑";s:2:"l";s:3:"쓒";s:2:"m";s:3:"쓓";s:2:"n";s:3:"쓔";s:2:"o";s:3:"쓕";s:2:"p";s:3:"쓖";s:2:"q";s:3:"쓗";s:2:"r";s:3:"쓘";s:2:"s";s:3:"쓙";s:2:"t";s:3:"쓚";s:2:"u";s:3:"쓛";s:2:"v";s:3:"쓜";s:2:"w";s:3:"쓝";s:2:"x";s:3:"쓞";s:2:"y";s:3:"쓟";s:2:"z";s:3:"쓠";s:2:"";s:3:"쓡";s:2:"";s:3:"쓢";s:2:"";s:3:"쓣";s:2:"";s:3:"쓤";s:2:"";s:3:"쓥";s:2:"";s:3:"쓦";s:2:"";s:3:"쓧";s:2:"";s:3:"쓨";s:2:"";s:3:"쓩";s:2:"";s:3:"쓪";s:2:"";s:3:"쓫";s:2:"";s:3:"쓬";s:2:"";s:3:"쓭";s:2:"";s:3:"쓮";s:2:"";s:3:"쓯";s:2:"";s:3:"쓰";s:2:"";s:3:"쓱";s:2:"";s:3:"쓲";s:2:"";s:3:"쓳";s:2:"";s:3:"쓴";s:2:"";s:3:"쓵";s:2:"";s:3:"쓶";s:2:"";s:3:"쓷";s:2:"";s:3:"쓸";s:2:"";s:3:"쓹";s:2:"";s:3:"쓺";s:2:"";s:3:"쓻";s:2:"";s:3:"쓼";s:2:"";s:3:"쓽";s:2:"";s:3:"쓾";s:2:"";s:3:"쓿";s:2:"";s:3:"씀";s:2:"";s:3:"씁";s:2:"";s:3:"씂";s:2:"";s:3:"씃";s:2:"";s:3:"씄";s:2:"";s:3:"씅";s:2:"";s:3:"씆";s:2:"";s:3:"씇";s:2:"";s:3:"씈";s:2:"";s:3:"씉";s:2:"";s:3:"씊";s:2:"";s:3:"씋";s:2:"";s:3:"씌";s:2:"";s:3:"씍";s:2:"";s:3:"씎";s:2:"";s:3:"씏";s:2:"";s:3:"씐";s:2:"";s:3:"씑";s:2:"";s:3:"씒";s:2:"";s:3:"씓";s:2:"";s:3:"씔";s:2:"";s:3:"씕";s:2:"";s:3:"씖";s:2:"";s:3:"씗";s:2:"";s:3:"씘";s:2:"";s:3:"씙";s:2:"";s:3:"씚";s:2:"";s:3:"씛";s:2:"";s:3:"씜";s:2:"";s:3:"씝";s:2:"";s:3:"씞";s:2:"";s:3:"씟";s:2:"";s:3:"씠";s:2:"";s:3:"씡";s:2:"";s:3:"씢";s:2:"";s:3:"씣";s:2:"";s:3:"씤";s:2:"";s:3:"씥";s:2:"";s:3:"씦";s:2:"";s:3:"씧";s:2:"";s:3:"씨";s:2:"";s:3:"씩";s:2:"";s:3:"씪";s:2:"";s:3:"씫";s:2:"";s:3:"씬";s:2:"";s:3:"씭";s:2:"";s:3:"씮";s:2:"";s:3:"씯";s:2:"";s:3:"씰";s:2:"";s:3:"씱";s:2:"";s:3:"씲";s:2:"";s:3:"씳";s:2:"";s:3:"씴";s:2:"";s:3:"씵";s:2:"";s:3:"씶";s:2:"";s:3:"씷";s:2:"";s:3:"씸";s:2:"";s:3:"씹";s:2:"";s:3:"씺";s:2:"";s:3:"씻";s:2:"";s:3:"씼";s:2:"";s:3:"씽";s:2:"";s:3:"씾";s:2:"";s:3:"씿";s:2:"";s:3:"앀";s:2:"";s:3:"앁";s:2:"";s:3:"앂";s:2:"";s:3:"앃";s:2:"";s:3:"아";s:2:"";s:3:"악";s:2:"";s:3:"앆";s:2:"";s:3:"앇";s:2:"";s:3:"안";s:2:"";s:3:"앉";s:2:"";s:3:"않";s:2:"";s:3:"앋";s:2:"";s:3:"알";s:2:"";s:3:"앍";s:2:"";s:3:"앎";s:2:"";s:3:"앏";s:2:"";s:3:"앐";s:2:"";s:3:"앑";s:2:"";s:3:"앒";s:2:"";s:3:"앓";s:2:"";s:3:"암";s:2:"";s:3:"압";s:2:"";s:3:"앖";s:2:"";s:3:"앗";s:2:"";s:3:"았";s:2:"";s:3:"앙";s:2:"";s:3:"앚";s:2:"";s:3:"앛";s:2:"";s:3:"앜";s:2:"";s:3:"앝";s:2:"";s:3:"앞";s:2:"";s:3:"앟";s:2:"";s:3:"애";s:2:"";s:3:"액";s:2:"";s:3:"앢";s:2:"";s:3:"앣";s:2:"";s:3:"앤";s:2:"";s:3:"앥";s:2:"";s:3:"앦";s:2:"";s:3:"앧";s:2:"";s:3:"앨";s:2:"";s:3:"앩";s:2:"";s:3:"앪";s:2:"";s:3:"앫";s:2:"";s:3:"앬";s:2:"";s:3:"앭";s:2:"";s:3:"앮";s:2:"";s:3:"앯";s:2:"";s:3:"앰";s:2:"";s:3:"앱";s:2:"";s:3:"앲";s:2:"";s:3:"앳";s:2:"";s:3:"앴";s:2:"";s:3:"앵";s:2:"";s:3:"앶";s:2:"";s:3:"앷";s:2:"";s:3:"앸";s:2:"";s:3:"앹";s:2:"";s:3:"앺";s:2:"";s:3:"앻";s:2:"";s:3:"야";s:2:"";s:3:"약";s:2:"";s:3:"앾";s:2:"";s:3:"앿";s:2:"";s:3:"얀";s:2:"";s:3:"얁";s:2:"";s:3:"얂";s:2:"";s:3:"얃";s:2:"";s:3:"얄";s:2:"";s:3:"얅";s:2:"";s:3:"얆";s:2:"";s:3:"얇";s:2:"";s:3:"얈";s:2:"";s:3:"얉";s:2:"";s:3:"얊";s:2:"";s:3:"얋";s:2:"";s:3:"얌";s:2:"";s:3:"얍";s:2:"";s:3:"얎";s:2:"";s:3:"얏";s:2:"";s:3:"얐";s:2:"";s:3:"양";s:2:"";s:3:"얒";s:2:"";s:3:"얓";s:2:"";s:3:"얔";s:2:"";s:3:"얕";s:2:"";s:3:"얖";s:2:"A";s:3:"얗";s:2:"";s:3:"얘";s:2:"";s:3:"얙";s:2:"B";s:3:"얚";s:2:"C";s:3:"얛";s:2:"D";s:3:"얜";s:2:"";s:3:"얝";s:2:"E";s:3:"얞";s:2:"F";s:3:"얟";s:2:"G";s:3:"얠";s:2:"";s:3:"얡";s:2:"H";s:3:"얢";s:2:"I";s:3:"얣";s:2:"J";s:3:"얤";s:2:"K";s:3:"얥";s:2:"L";s:3:"얦";s:2:"M";s:3:"얧";s:2:"N";s:3:"얨";s:2:"O";s:3:"얩";s:2:"";s:3:"얪";s:2:"P";s:3:"얫";s:2:"Q";s:3:"얬";s:2:"R";s:3:"얭";s:2:"S";s:3:"얮";s:2:"T";s:3:"얯";s:2:"U";s:3:"얰";s:2:"V";s:3:"얱";s:2:"W";s:3:"얲";s:2:"X";s:3:"얳";s:2:"Y";s:3:"어";s:2:"";s:3:"억";s:2:"";s:3:"얶";s:2:"Z";s:3:"얷";s:2:"a";s:3:"언";s:2:"";s:3:"얹";s:2:"";s:3:"얺";s:2:"b";s:3:"얻";s:2:"";s:3:"얼";s:2:"";s:3:"얽";s:2:"";s:3:"얾";s:2:"";s:3:"얿";s:2:"c";s:3:"엀";s:2:"d";s:3:"엁";s:2:"e";s:3:"엂";s:2:"f";s:3:"엃";s:2:"g";s:3:"엄";s:2:"";s:3:"업";s:2:"";s:3:"없";s:2:"";s:3:"엇";s:2:"";s:3:"었";s:2:"";s:3:"엉";s:2:"";s:3:"엊";s:2:"";s:3:"엋";s:2:"h";s:3:"엌";s:2:"";s:3:"엍";s:2:"i";s:3:"엎";s:2:"";s:3:"엏";s:2:"j";s:3:"에";s:2:"";s:3:"엑";s:2:"";s:3:"엒";s:2:"k";s:3:"엓";s:2:"l";s:3:"엔";s:2:"";s:3:"엕";s:2:"m";s:3:"엖";s:2:"n";s:3:"엗";s:2:"o";s:3:"엘";s:2:"";s:3:"엙";s:2:"p";s:3:"엚";s:2:"q";s:3:"엛";s:2:"r";s:3:"엜";s:2:"s";s:3:"엝";s:2:"t";s:3:"엞";s:2:"u";s:3:"엟";s:2:"v";s:3:"엠";s:2:"";s:3:"엡";s:2:"";s:3:"엢";s:2:"w";s:3:"엣";s:2:"";s:3:"엤";s:2:"x";s:3:"엥";s:2:"";s:3:"엦";s:2:"y";s:3:"엧";s:2:"z";s:3:"엨";s:2:"";s:3:"엩";s:2:"";s:3:"엪";s:2:"";s:3:"엫";s:2:"";s:3:"여";s:2:"";s:3:"역";s:2:"";s:3:"엮";s:2:"";s:3:"엯";s:2:"";s:3:"연";s:2:"";s:3:"엱";s:2:"";s:3:"엲";s:2:"";s:3:"엳";s:2:"";s:3:"열";s:2:"";s:3:"엵";s:2:"";s:3:"엶";s:2:"";s:3:"엷";s:2:"";s:3:"엸";s:2:"";s:3:"엹";s:2:"";s:3:"엺";s:2:"";s:3:"엻";s:2:"";s:3:"염";s:2:"";s:3:"엽";s:2:"";s:3:"엾";s:2:"";s:3:"엿";s:2:"";s:3:"였";s:2:"";s:3:"영";s:2:"";s:3:"옂";s:2:"";s:3:"옃";s:2:"";s:3:"옄";s:2:"";s:3:"옅";s:2:"";s:3:"옆";s:2:"";s:3:"옇";s:2:"";s:3:"예";s:2:"";s:3:"옉";s:2:"";s:3:"옊";s:2:"";s:3:"옋";s:2:"";s:3:"옌";s:2:"";s:3:"옍";s:2:"";s:3:"옎";s:2:"";s:3:"옏";s:2:"";s:3:"옐";s:2:"";s:3:"옑";s:2:"";s:3:"옒";s:2:"";s:3:"옓";s:2:"";s:3:"옔";s:2:"";s:3:"옕";s:2:"";s:3:"옖";s:2:"";s:3:"옗";s:2:"";s:3:"옘";s:2:"";s:3:"옙";s:2:"";s:3:"옚";s:2:"";s:3:"옛";s:2:"";s:3:"옜";s:2:"";s:3:"옝";s:2:"";s:3:"옞";s:2:"";s:3:"옟";s:2:"";s:3:"옠";s:2:"";s:3:"옡";s:2:"";s:3:"옢";s:2:"";s:3:"옣";s:2:"";s:3:"오";s:2:"";s:3:"옥";s:2:"";s:3:"옦";s:2:"";s:3:"옧";s:2:"";s:3:"온";s:2:"";s:3:"옩";s:2:"";s:3:"옪";s:2:"";s:3:"옫";s:2:"";s:3:"올";s:2:"";s:3:"옭";s:2:"";s:3:"옮";s:2:"";s:3:"옯";s:2:"";s:3:"옰";s:2:"";s:3:"옱";s:2:"";s:3:"옲";s:2:"";s:3:"옳";s:2:"";s:3:"옴";s:2:"";s:3:"옵";s:2:"";s:3:"옶";s:2:"";s:3:"옷";s:2:"";s:3:"옸";s:2:"";s:3:"옹";s:2:"";s:3:"옺";s:2:"";s:3:"옻";s:2:"";s:3:"옼";s:2:"";s:3:"옽";s:2:"";s:3:"옾";s:2:"";s:3:"옿";s:2:"";s:3:"와";s:2:"";s:3:"왁";s:2:"";s:3:"왂";s:2:"";s:3:"왃";s:2:"";s:3:"완";s:2:"";s:3:"왅";s:2:"";s:3:"왆";s:2:"";s:3:"왇";s:2:"";s:3:"왈";s:2:"";s:3:"왉";s:2:"";s:3:"왊";s:2:"";s:3:"왋";s:2:"";s:3:"왌";s:2:"";s:3:"왍";s:2:"";s:3:"왎";s:2:"";s:3:"왏";s:2:"";s:3:"왐";s:2:"";s:3:"왑";s:2:"";s:3:"왒";s:2:"";s:3:"왓";s:2:"";s:3:"왔";s:2:"";s:3:"왕";s:2:"";s:3:"왖";s:2:"";s:3:"왗";s:2:"";s:3:"왘";s:2:"";s:3:"왙";s:2:"";s:3:"왚";s:2:"";s:3:"왛";s:2:"";s:3:"왜";s:2:"";s:3:"왝";s:2:"";s:3:"왞";s:2:"";s:3:"왟";s:2:"";s:3:"왠";s:2:"";s:3:"왡";s:2:"";s:3:"왢";s:2:"";s:3:"왣";s:2:"";s:3:"왤";s:2:"";s:3:"왥";s:2:"";s:3:"왦";s:2:"";s:3:"왧";s:2:"";s:3:"왨";s:2:"";s:3:"왩";s:2:"";s:3:"왪";s:2:"";s:3:"왫";s:2:"";s:3:"왬";s:2:"";s:3:"왭";s:2:"";s:3:"왮";s:2:"";s:3:"왯";s:2:"";s:3:"왰";s:2:"";s:3:"왱";s:2:"";s:3:"왲";s:2:"";s:3:"왳";s:2:"";s:3:"왴";s:2:"";s:3:"왵";s:2:"";s:3:"왶";s:2:"";s:3:"왷";s:2:"";s:3:"외";s:2:"";s:3:"왹";s:2:"";s:3:"왺";s:2:"";s:3:"왻";s:2:"";s:3:"왼";s:2:"";s:3:"왽";s:2:"";s:3:"왾";s:2:"";s:3:"왿";s:2:"";s:3:"욀";s:2:"";s:3:"욁";s:2:"";s:3:"욂";s:2:"";s:3:"욃";s:2:"";s:3:"욄";s:2:"";s:3:"욅";s:2:"";s:3:"욆";s:2:"";s:3:"욇";s:2:"";s:3:"욈";s:2:"";s:3:"욉";s:2:"";s:3:"욊";s:2:"";s:3:"욋";s:2:"";s:3:"욌";s:2:"";s:3:"욍";s:2:"";s:3:"욎";s:2:"";s:3:"욏";s:2:"";s:3:"욐";s:2:"";s:3:"욑";s:2:"";s:3:"욒";s:2:"";s:3:"욓";s:2:"";s:3:"요";s:2:"";s:3:"욕";s:2:"";s:3:"욖";s:2:"";s:3:"욗";s:2:"";s:3:"욘";s:2:"";s:3:"욙";s:2:"";s:3:"욚";s:2:"";s:3:"욛";s:2:"";s:3:"욜";s:2:"";s:3:"욝";s:2:"";s:3:"욞";s:2:"";s:3:"욟";s:2:"";s:3:"욠";s:2:"";s:3:"욡";s:2:"";s:3:"욢";s:2:"";s:3:"욣";s:2:"";s:3:"욤";s:2:"";s:3:"욥";s:2:"";s:3:"욦";s:2:"";s:3:"욧";s:2:"";s:3:"욨";s:2:"A";s:3:"용";s:2:"";s:3:"욪";s:2:"B";s:3:"욫";s:2:"C";s:3:"욬";s:2:"D";s:3:"욭";s:2:"E";s:3:"욮";s:2:"F";s:3:"욯";s:2:"G";s:3:"우";s:2:"";s:3:"욱";s:2:"";s:3:"욲";s:2:"H";s:3:"욳";s:2:"I";s:3:"운";s:2:"";s:3:"욵";s:2:"J";s:3:"욶";s:2:"K";s:3:"욷";s:2:"L";s:3:"울";s:2:"";s:3:"욹";s:2:"";s:3:"욺";s:2:"";s:3:"욻";s:2:"M";s:3:"욼";s:2:"N";s:3:"욽";s:2:"O";s:3:"욾";s:2:"P";s:3:"욿";s:2:"Q";s:3:"움";s:2:"";s:3:"웁";s:2:"";s:3:"웂";s:2:"R";s:3:"웃";s:2:"";s:3:"웄";s:2:"S";s:3:"웅";s:2:"";s:3:"웆";s:2:"T";s:3:"웇";s:2:"U";s:3:"웈";s:2:"V";s:3:"웉";s:2:"W";s:3:"웊";s:2:"X";s:3:"웋";s:2:"Y";s:3:"워";s:2:"";s:3:"웍";s:2:"";s:3:"웎";s:2:"Z";s:3:"웏";s:2:"a";s:3:"원";s:2:"";s:3:"웑";s:2:"b";s:3:"웒";s:2:"c";s:3:"웓";s:2:"d";s:3:"월";s:2:"";s:3:"웕";s:2:"e";s:3:"웖";s:2:"f";s:3:"웗";s:2:"g";s:3:"웘";s:2:"h";s:3:"웙";s:2:"i";s:3:"웚";s:2:"j";s:3:"웛";s:2:"k";s:3:"웜";s:2:"";s:3:"웝";s:2:"";s:3:"웞";s:2:"l";s:3:"웟";s:2:"m";s:3:"웠";s:2:"";s:3:"웡";s:2:"";s:3:"웢";s:2:"n";s:3:"웣";s:2:"o";s:3:"웤";s:2:"p";s:3:"웥";s:2:"q";s:3:"웦";s:2:"r";s:3:"웧";s:2:"s";s:3:"웨";s:2:"";s:3:"웩";s:2:"";s:3:"웪";s:2:"t";s:3:"웫";s:2:"u";s:3:"웬";s:2:"";s:3:"웭";s:2:"v";s:3:"웮";s:2:"w";s:3:"웯";s:2:"x";s:3:"웰";s:2:"";s:3:"웱";s:2:"y";s:3:"웲";s:2:"z";s:3:"웳";s:2:"";s:3:"웴";s:2:"";s:3:"웵";s:2:"";s:3:"웶";s:2:"";s:3:"웷";s:2:"";s:3:"웸";s:2:"";s:3:"웹";s:2:"";s:3:"웺";s:2:"";s:3:"웻";s:2:"";s:3:"웼";s:2:"";s:3:"웽";s:2:"";s:3:"웾";s:2:"";s:3:"웿";s:2:"";s:3:"윀";s:2:"";s:3:"윁";s:2:"";s:3:"윂";s:2:"";s:3:"윃";s:2:"";s:3:"위";s:2:"";s:3:"윅";s:2:"";s:3:"윆";s:2:"";s:3:"윇";s:2:"";s:3:"윈";s:2:"";s:3:"윉";s:2:"";s:3:"윊";s:2:"";s:3:"윋";s:2:"";s:3:"윌";s:2:"";s:3:"윍";s:2:"";s:3:"윎";s:2:"";s:3:"윏";s:2:"";s:3:"윐";s:2:"";s:3:"윑";s:2:"";s:3:"윒";s:2:"";s:3:"윓";s:2:"";s:3:"윔";s:2:"";s:3:"윕";s:2:"";s:3:"윖";s:2:"";s:3:"윗";s:2:"";s:3:"윘";s:2:"";s:3:"윙";s:2:"";s:3:"윚";s:2:"";s:3:"윛";s:2:"";s:3:"윜";s:2:"";s:3:"윝";s:2:"";s:3:"윞";s:2:"";s:3:"윟";s:2:"";s:3:"유";s:2:"";s:3:"육";s:2:"";s:3:"윢";s:2:"";s:3:"윣";s:2:"";s:3:"윤";s:2:"";s:3:"윥";s:2:"";s:3:"윦";s:2:"";s:3:"윧";s:2:"";s:3:"율";s:2:"";s:3:"윩";s:2:"";s:3:"윪";s:2:"";s:3:"윫";s:2:"";s:3:"윬";s:2:"";s:3:"윭";s:2:"";s:3:"윮";s:2:"";s:3:"윯";s:2:"";s:3:"윰";s:2:"";s:3:"윱";s:2:"";s:3:"윲";s:2:"";s:3:"윳";s:2:"";s:3:"윴";s:2:"";s:3:"융";s:2:"";s:3:"윶";s:2:"";s:3:"윷";s:2:"";s:3:"윸";s:2:"";s:3:"윹";s:2:"";s:3:"윺";s:2:"";s:3:"윻";s:2:"";s:3:"으";s:2:"";s:3:"윽";s:2:"";s:3:"윾";s:2:"";s:3:"윿";s:2:"";s:3:"은";s:2:"";s:3:"읁";s:2:"";s:3:"읂";s:2:"";s:3:"읃";s:2:"";s:3:"을";s:2:"";s:3:"읅";s:2:"";s:3:"읆";s:2:"";s:3:"읇";s:2:"";s:3:"읈";s:2:"";s:3:"읉";s:2:"";s:3:"읊";s:2:"";s:3:"읋";s:2:"";s:3:"음";s:2:"";s:3:"읍";s:2:"";s:3:"읎";s:2:"";s:3:"읏";s:2:"";s:3:"읐";s:2:"";s:3:"응";s:2:"";s:3:"읒";s:2:"";s:3:"읓";s:2:"";s:3:"읔";s:2:"";s:3:"읕";s:2:"";s:3:"읖";s:2:"";s:3:"읗";s:2:"";s:3:"의";s:2:"";s:3:"읙";s:2:"";s:3:"읚";s:2:"";s:3:"읛";s:2:"";s:3:"읜";s:2:"";s:3:"읝";s:2:"";s:3:"읞";s:2:"";s:3:"읟";s:2:"";s:3:"읠";s:2:"";s:3:"읡";s:2:"";s:3:"읢";s:2:"";s:3:"읣";s:2:"";s:3:"읤";s:2:"";s:3:"읥";s:2:"";s:3:"읦";s:2:"";s:3:"읧";s:2:"";s:3:"읨";s:2:"";s:3:"읩";s:2:"";s:3:"읪";s:2:"";s:3:"읫";s:2:"";s:3:"읬";s:2:"";s:3:"읭";s:2:"";s:3:"읮";s:2:"";s:3:"읯";s:2:"";s:3:"읰";s:2:"";s:3:"읱";s:2:"";s:3:"읲";s:2:"";s:3:"읳";s:2:"";s:3:"이";s:2:"";s:3:"익";s:2:"";s:3:"읶";s:2:"";s:3:"읷";s:2:"";s:3:"인";s:2:"";s:3:"읹";s:2:"";s:3:"읺";s:2:"";s:3:"읻";s:2:"";s:3:"일";s:2:"";s:3:"읽";s:2:"";s:3:"읾";s:2:"";s:3:"읿";s:2:"";s:3:"잀";s:2:"";s:3:"잁";s:2:"";s:3:"잂";s:2:"";s:3:"잃";s:2:"";s:3:"임";s:2:"";s:3:"입";s:2:"";s:3:"잆";s:2:"";s:3:"잇";s:2:"";s:3:"있";s:2:"";s:3:"잉";s:2:"";s:3:"잊";s:2:"";s:3:"잋";s:2:"";s:3:"잌";s:2:"";s:3:"잍";s:2:"";s:3:"잎";s:2:"";s:3:"잏";s:2:"";s:3:"자";s:2:"";s:3:"작";s:2:"";s:3:"잒";s:2:"";s:3:"잓";s:2:"";s:3:"잔";s:2:"";s:3:"잕";s:2:"";s:3:"잖";s:2:"";s:3:"잗";s:2:"";s:3:"잘";s:2:"";s:3:"잙";s:2:"";s:3:"잚";s:2:"";s:3:"잛";s:2:"";s:3:"잜";s:2:"";s:3:"잝";s:2:"";s:3:"잞";s:2:"";s:3:"잟";s:2:"";s:3:"잠";s:2:"";s:3:"잡";s:2:"";s:3:"잢";s:2:"";s:3:"잣";s:2:"";s:3:"잤";s:2:"";s:3:"장";s:2:"";s:3:"잦";s:2:"";s:3:"잧";s:2:"";s:3:"잨";s:2:"";s:3:"잩";s:2:"";s:3:"잪";s:2:"";s:3:"잫";s:2:"";s:3:"재";s:2:"";s:3:"잭";s:2:"";s:3:"잮";s:2:"";s:3:"잯";s:2:"";s:3:"잰";s:2:"";s:3:"잱";s:2:"";s:3:"잲";s:2:"";s:3:"잳";s:2:"";s:3:"잴";s:2:"";s:3:"잵";s:2:"";s:3:"잶";s:2:"";s:3:"잷";s:2:"";s:3:"잸";s:2:"A";s:3:"잹";s:2:"B";s:3:"잺";s:2:"C";s:3:"잻";s:2:"D";s:3:"잼";s:2:"";s:3:"잽";s:2:"";s:3:"잾";s:2:"E";s:3:"잿";s:2:"";s:3:"쟀";s:2:"";s:3:"쟁";s:2:"";s:3:"쟂";s:2:"F";s:3:"쟃";s:2:"G";s:3:"쟄";s:2:"H";s:3:"쟅";s:2:"I";s:3:"쟆";s:2:"J";s:3:"쟇";s:2:"K";s:3:"쟈";s:2:"";s:3:"쟉";s:2:"";s:3:"쟊";s:2:"L";s:3:"쟋";s:2:"M";s:3:"쟌";s:2:"";s:3:"쟍";s:2:"N";s:3:"쟎";s:2:"";s:3:"쟏";s:2:"O";s:3:"쟐";s:2:"";s:3:"쟑";s:2:"P";s:3:"쟒";s:2:"Q";s:3:"쟓";s:2:"R";s:3:"쟔";s:2:"S";s:3:"쟕";s:2:"T";s:3:"쟖";s:2:"U";s:3:"쟗";s:2:"V";s:3:"쟘";s:2:"";s:3:"쟙";s:2:"W";s:3:"쟚";s:2:"X";s:3:"쟛";s:2:"Y";s:3:"쟜";s:2:"Z";s:3:"쟝";s:2:"";s:3:"쟞";s:2:"a";s:3:"쟟";s:2:"b";s:3:"쟠";s:2:"c";s:3:"쟡";s:2:"d";s:3:"쟢";s:2:"e";s:3:"쟣";s:2:"f";s:3:"쟤";s:2:"";s:3:"쟥";s:2:"g";s:3:"쟦";s:2:"h";s:3:"쟧";s:2:"i";s:3:"쟨";s:2:"";s:3:"쟩";s:2:"j";s:3:"쟪";s:2:"k";s:3:"쟫";s:2:"l";s:3:"쟬";s:2:"";s:3:"쟭";s:2:"m";s:3:"쟮";s:2:"n";s:3:"쟯";s:2:"o";s:3:"쟰";s:2:"p";s:3:"쟱";s:2:"q";s:3:"쟲";s:2:"r";s:3:"쟳";s:2:"s";s:3:"쟴";s:2:"t";s:3:"쟵";s:2:"u";s:3:"쟶";s:2:"v";s:3:"쟷";s:2:"w";s:3:"쟸";s:2:"x";s:3:"쟹";s:2:"y";s:3:"쟺";s:2:"z";s:3:"쟻";s:2:"";s:3:"쟼";s:2:"";s:3:"쟽";s:2:"";s:3:"쟾";s:2:"";s:3:"쟿";s:2:"";s:3:"저";s:2:"";s:3:"적";s:2:"";s:3:"젂";s:2:"";s:3:"젃";s:2:"";s:3:"전";s:2:"";s:3:"젅";s:2:"";s:3:"젆";s:2:"";s:3:"젇";s:2:"";s:3:"절";s:2:"";s:3:"젉";s:2:"";s:3:"젊";s:2:"";s:3:"젋";s:2:"";s:3:"젌";s:2:"";s:3:"젍";s:2:"";s:3:"젎";s:2:"";s:3:"젏";s:2:"";s:3:"점";s:2:"";s:3:"접";s:2:"";s:3:"젒";s:2:"";s:3:"젓";s:2:"";s:3:"젔";s:2:"";s:3:"정";s:2:"";s:3:"젖";s:2:"";s:3:"젗";s:2:"";s:3:"젘";s:2:"";s:3:"젙";s:2:"";s:3:"젚";s:2:"";s:3:"젛";s:2:"";s:3:"제";s:2:"";s:3:"젝";s:2:"";s:3:"젞";s:2:"";s:3:"젟";s:2:"";s:3:"젠";s:2:"";s:3:"젡";s:2:"";s:3:"젢";s:2:"";s:3:"젣";s:2:"";s:3:"젤";s:2:"";s:3:"젥";s:2:"";s:3:"젦";s:2:"";s:3:"젧";s:2:"";s:3:"젨";s:2:"";s:3:"젩";s:2:"";s:3:"젪";s:2:"";s:3:"젫";s:2:"";s:3:"젬";s:2:"";s:3:"젭";s:2:"";s:3:"젮";s:2:"";s:3:"젯";s:2:"";s:3:"젰";s:2:"";s:3:"젱";s:2:"";s:3:"젲";s:2:"";s:3:"젳";s:2:"";s:3:"젴";s:2:"";s:3:"젵";s:2:"";s:3:"젶";s:2:"";s:3:"젷";s:2:"";s:3:"져";s:2:"";s:3:"젹";s:2:"";s:3:"젺";s:2:"";s:3:"젻";s:2:"";s:3:"젼";s:2:"";s:3:"젽";s:2:"";s:3:"젾";s:2:"";s:3:"젿";s:2:"";s:3:"졀";s:2:"";s:3:"졁";s:2:"";s:3:"졂";s:2:"";s:3:"졃";s:2:"";s:3:"졄";s:2:"";s:3:"졅";s:2:"";s:3:"졆";s:2:"";s:3:"졇";s:2:"";s:3:"졈";s:2:"";s:3:"졉";s:2:"";s:3:"졊";s:2:"";s:3:"졋";s:2:"";s:3:"졌";s:2:"";s:3:"졍";s:2:"";s:3:"졎";s:2:"";s:3:"졏";s:2:"";s:3:"졐";s:2:"";s:3:"졑";s:2:"";s:3:"졒";s:2:"";s:3:"졓";s:2:"";s:3:"졔";s:2:"";s:3:"졕";s:2:"";s:3:"졖";s:2:"";s:3:"졗";s:2:"";s:3:"졘";s:2:"";s:3:"졙";s:2:"";s:3:"졚";s:2:"";s:3:"졛";s:2:"";s:3:"졜";s:2:"";s:3:"졝";s:2:"";s:3:"졞";s:2:"";s:3:"졟";s:2:"";s:3:"졠";s:2:"";s:3:"졡";s:2:"";s:3:"졢";s:2:"";s:3:"졣";s:2:"";s:3:"졤";s:2:"";s:3:"졥";s:2:"";s:3:"졦";s:2:"";s:3:"졧";s:2:"";s:3:"졨";s:2:"";s:3:"졩";s:2:"";s:3:"졪";s:2:"";s:3:"졫";s:2:"";s:3:"졬";s:2:"";s:3:"졭";s:2:"";s:3:"졮";s:2:"";s:3:"졯";s:2:"";s:3:"조";s:2:"";s:3:"족";s:2:"";s:3:"졲";s:2:"";s:3:"졳";s:2:"";s:3:"존";s:2:"";s:3:"졵";s:2:"";s:3:"졶";s:2:"";s:3:"졷";s:2:"";s:3:"졸";s:2:"";s:3:"졹";s:2:"";s:3:"졺";s:2:"";s:3:"졻";s:2:"";s:3:"졼";s:2:"";s:3:"졽";s:2:"";s:3:"졾";s:2:"";s:3:"졿";s:2:"";s:3:"좀";s:2:"";s:3:"좁";s:2:"";s:3:"좂";s:2:"";s:3:"좃";s:2:"";s:3:"좄";s:2:"";s:3:"종";s:2:"";s:3:"좆";s:2:"";s:3:"좇";s:2:"";s:3:"좈";s:2:"";s:3:"좉";s:2:"";s:3:"좊";s:2:"";s:3:"좋";s:2:"";s:3:"좌";s:2:"";s:3:"좍";s:2:"";s:3:"좎";s:2:"";s:3:"좏";s:2:"";s:3:"좐";s:2:"";s:3:"좑";s:2:"";s:3:"좒";s:2:"";s:3:"좓";s:2:"";s:3:"좔";s:2:"";s:3:"좕";s:2:"";s:3:"좖";s:2:"";s:3:"좗";s:2:"";s:3:"좘";s:2:"";s:3:"좙";s:2:"";s:3:"좚";s:2:"";s:3:"좛";s:2:"";s:3:"좜";s:2:"";s:3:"좝";s:2:"";s:3:"좞";s:2:"";s:3:"좟";s:2:"";s:3:"좠";s:2:"";s:3:"좡";s:2:"";s:3:"좢";s:2:"";s:3:"좣";s:2:"";s:3:"좤";s:2:"";s:3:"좥";s:2:"A";s:3:"좦";s:2:"B";s:3:"좧";s:2:"C";s:3:"좨";s:2:"";s:3:"좩";s:2:"D";s:3:"좪";s:2:"E";s:3:"좫";s:2:"F";s:3:"좬";s:2:"G";s:3:"좭";s:2:"H";s:3:"좮";s:2:"I";s:3:"좯";s:2:"J";s:3:"좰";s:2:"K";s:3:"좱";s:2:"L";s:3:"좲";s:2:"M";s:3:"좳";s:2:"N";s:3:"좴";s:2:"O";s:3:"좵";s:2:"P";s:3:"좶";s:2:"Q";s:3:"좷";s:2:"R";s:3:"좸";s:2:"S";s:3:"좹";s:2:"T";s:3:"좺";s:2:"U";s:3:"좻";s:2:"V";s:3:"좼";s:2:"";s:3:"좽";s:2:"";s:3:"좾";s:2:"W";s:3:"좿";s:2:"X";s:3:"죀";s:2:"Y";s:3:"죁";s:2:"Z";s:3:"죂";s:2:"a";s:3:"죃";s:2:"b";s:3:"죄";s:2:"";s:3:"죅";s:2:"c";s:3:"죆";s:2:"d";s:3:"죇";s:2:"e";s:3:"죈";s:2:"";s:3:"죉";s:2:"f";s:3:"죊";s:2:"g";s:3:"죋";s:2:"h";s:3:"죌";s:2:"";s:3:"죍";s:2:"i";s:3:"죎";s:2:"j";s:3:"죏";s:2:"k";s:3:"죐";s:2:"l";s:3:"죑";s:2:"m";s:3:"죒";s:2:"n";s:3:"죓";s:2:"o";s:3:"죔";s:2:"";s:3:"죕";s:2:"";s:3:"죖";s:2:"p";s:3:"죗";s:2:"";s:3:"죘";s:2:"q";s:3:"죙";s:2:"";s:3:"죚";s:2:"r";s:3:"죛";s:2:"s";s:3:"죜";s:2:"t";s:3:"죝";s:2:"u";s:3:"죞";s:2:"v";s:3:"죟";s:2:"w";s:3:"죠";s:2:"";s:3:"죡";s:2:"";s:3:"죢";s:2:"x";s:3:"죣";s:2:"y";s:3:"죤";s:2:"";s:3:"죥";s:2:"z";s:3:"죦";s:2:"";s:3:"죧";s:2:"";s:3:"죨";s:2:"";s:3:"죩";s:2:"";s:3:"죪";s:2:"";s:3:"죫";s:2:"";s:3:"죬";s:2:"";s:3:"죭";s:2:"";s:3:"죮";s:2:"";s:3:"죯";s:2:"";s:3:"죰";s:2:"";s:3:"죱";s:2:"";s:3:"죲";s:2:"";s:3:"죳";s:2:"";s:3:"죴";s:2:"";s:3:"죵";s:2:"";s:3:"죶";s:2:"";s:3:"죷";s:2:"";s:3:"죸";s:2:"";s:3:"죹";s:2:"";s:3:"죺";s:2:"";s:3:"죻";s:2:"";s:3:"주";s:2:"";s:3:"죽";s:2:"";s:3:"죾";s:2:"";s:3:"죿";s:2:"";s:3:"준";s:2:"";s:3:"줁";s:2:"";s:3:"줂";s:2:"";s:3:"줃";s:2:"";s:3:"줄";s:2:"";s:3:"줅";s:2:"";s:3:"줆";s:2:"";s:3:"줇";s:2:"";s:3:"줈";s:2:"";s:3:"줉";s:2:"";s:3:"줊";s:2:"";s:3:"줋";s:2:"";s:3:"줌";s:2:"";s:3:"줍";s:2:"";s:3:"줎";s:2:"";s:3:"줏";s:2:"";s:3:"줐";s:2:"A";s:3:"중";s:2:"";s:3:"줒";s:2:"B";s:3:"줓";s:2:"C";s:3:"줔";s:2:"D";s:3:"줕";s:2:"E";s:3:"줖";s:2:"F";s:3:"줗";s:2:"G";s:3:"줘";s:2:"";s:3:"줙";s:2:"H";s:3:"줚";s:2:"I";s:3:"줛";s:2:"J";s:3:"줜";s:2:"K";s:3:"줝";s:2:"L";s:3:"줞";s:2:"M";s:3:"줟";s:2:"N";s:3:"줠";s:2:"O";s:3:"줡";s:2:"P";s:3:"줢";s:2:"Q";s:3:"줣";s:2:"R";s:3:"줤";s:2:"S";s:3:"줥";s:2:"T";s:3:"줦";s:2:"U";s:3:"줧";s:2:"V";s:3:"줨";s:2:"W";s:3:"줩";s:2:"X";s:3:"줪";s:2:"Y";s:3:"줫";s:2:"Z";s:3:"줬";s:2:"";s:3:"줭";s:2:"a";s:3:"줮";s:2:"b";s:3:"줯";s:2:"c";s:3:"줰";s:2:"d";s:3:"줱";s:2:"e";s:3:"줲";s:2:"f";s:3:"줳";s:2:"g";s:3:"줴";s:2:"";s:3:"줵";s:2:"h";s:3:"줶";s:2:"i";s:3:"줷";s:2:"j";s:3:"줸";s:2:"k";s:3:"줹";s:2:"l";s:3:"줺";s:2:"m";s:3:"줻";s:2:"n";s:3:"줼";s:2:"o";s:3:"줽";s:2:"p";s:3:"줾";s:2:"q";s:3:"줿";s:2:"r";s:3:"쥀";s:2:"s";s:3:"쥁";s:2:"t";s:3:"쥂";s:2:"u";s:3:"쥃";s:2:"v";s:3:"쥄";s:2:"w";s:3:"쥅";s:2:"x";s:3:"쥆";s:2:"y";s:3:"쥇";s:2:"z";s:3:"쥈";s:2:"";s:3:"쥉";s:2:"";s:3:"쥊";s:2:"";s:3:"쥋";s:2:"";s:3:"쥌";s:2:"";s:3:"쥍";s:2:"";s:3:"쥎";s:2:"";s:3:"쥏";s:2:"";s:3:"쥐";s:2:"";s:3:"쥑";s:2:"";s:3:"쥒";s:2:"";s:3:"쥓";s:2:"";s:3:"쥔";s:2:"";s:3:"쥕";s:2:"";s:3:"쥖";s:2:"";s:3:"쥗";s:2:"";s:3:"쥘";s:2:"";s:3:"쥙";s:2:"";s:3:"쥚";s:2:"";s:3:"쥛";s:2:"";s:3:"쥜";s:2:"";s:3:"쥝";s:2:"";s:3:"쥞";s:2:"";s:3:"쥟";s:2:"";s:3:"쥠";s:2:"";s:3:"쥡";s:2:"";s:3:"쥢";s:2:"";s:3:"쥣";s:2:"";s:3:"쥤";s:2:"";s:3:"쥥";s:2:"";s:3:"쥦";s:2:"";s:3:"쥧";s:2:"";s:3:"쥨";s:2:"";s:3:"쥩";s:2:"";s:3:"쥪";s:2:"";s:3:"쥫";s:2:"";s:3:"쥬";s:2:"";s:3:"쥭";s:2:"";s:3:"쥮";s:2:"";s:3:"쥯";s:2:"";s:3:"쥰";s:2:"";s:3:"쥱";s:2:"A";s:3:"쥲";s:2:"B";s:3:"쥳";s:2:"C";s:3:"쥴";s:2:"";s:3:"쥵";s:2:"D";s:3:"쥶";s:2:"E";s:3:"쥷";s:2:"F";s:3:"쥸";s:2:"G";s:3:"쥹";s:2:"H";s:3:"쥺";s:2:"I";s:3:"쥻";s:2:"J";s:3:"쥼";s:2:"";s:3:"쥽";s:2:"K";s:3:"쥾";s:2:"L";s:3:"쥿";s:2:"M";s:3:"즀";s:2:"N";s:3:"즁";s:2:"O";s:3:"즂";s:2:"P";s:3:"즃";s:2:"Q";s:3:"즄";s:2:"R";s:3:"즅";s:2:"S";s:3:"즆";s:2:"T";s:3:"즇";s:2:"U";s:3:"즈";s:2:"";s:3:"즉";s:2:"";s:3:"즊";s:2:"V";s:3:"즋";s:2:"W";s:3:"즌";s:2:"";s:3:"즍";s:2:"X";s:3:"즎";s:2:"Y";s:3:"즏";s:2:"Z";s:3:"즐";s:2:"";s:3:"즑";s:2:"a";s:3:"즒";s:2:"b";s:3:"즓";s:2:"c";s:3:"즔";s:2:"d";s:3:"즕";s:2:"e";s:3:"즖";s:2:"f";s:3:"즗";s:2:"g";s:3:"즘";s:2:"";s:3:"즙";s:2:"";s:3:"즚";s:2:"h";s:3:"즛";s:2:"";s:3:"즜";s:2:"i";s:3:"증";s:2:"";s:3:"즞";s:2:"j";s:3:"즟";s:2:"k";s:3:"즠";s:2:"l";s:3:"즡";s:2:"m";s:3:"즢";s:2:"n";s:3:"즣";s:2:"o";s:3:"즤";s:2:"p";s:3:"즥";s:2:"q";s:3:"즦";s:2:"r";s:3:"즧";s:2:"s";s:3:"즨";s:2:"t";s:3:"즩";s:2:"u";s:3:"즪";s:2:"v";s:3:"즫";s:2:"w";s:3:"즬";s:2:"x";s:3:"즭";s:2:"y";s:3:"즮";s:2:"z";s:3:"즯";s:2:"";s:3:"즰";s:2:"";s:3:"즱";s:2:"";s:3:"즲";s:2:"";s:3:"즳";s:2:"";s:3:"즴";s:2:"";s:3:"즵";s:2:"";s:3:"즶";s:2:"";s:3:"즷";s:2:"";s:3:"즸";s:2:"";s:3:"즹";s:2:"";s:3:"즺";s:2:"";s:3:"즻";s:2:"";s:3:"즼";s:2:"";s:3:"즽";s:2:"";s:3:"즾";s:2:"";s:3:"즿";s:2:"";s:3:"지";s:2:"";s:3:"직";s:2:"";s:3:"짂";s:2:"";s:3:"짃";s:2:"";s:3:"진";s:2:"";s:3:"짅";s:2:"";s:3:"짆";s:2:"";s:3:"짇";s:2:"";s:3:"질";s:2:"";s:3:"짉";s:2:"";s:3:"짊";s:2:"";s:3:"짋";s:2:"";s:3:"짌";s:2:"";s:3:"짍";s:2:"";s:3:"짎";s:2:"";s:3:"짏";s:2:"";s:3:"짐";s:2:"";s:3:"집";s:2:"";s:3:"짒";s:2:"";s:3:"짓";s:2:"";s:3:"짔";s:2:"";s:3:"징";s:2:"¡";s:3:"짖";s:2:"¢";s:3:"짗";s:2:"";s:3:"짘";s:2:"";s:3:"짙";s:2:"£";s:3:"짚";s:2:"¤";s:3:"짛";s:2:"";s:3:"짜";s:2:"¥";s:3:"짝";s:2:"¦";s:3:"짞";s:2:"A";s:3:"짟";s:2:"B";s:3:"짠";s:2:"§";s:3:"짡";s:2:"C";s:3:"짢";s:2:"¨";s:3:"짣";s:2:"D";s:3:"짤";s:2:"©";s:3:"짥";s:2:"E";s:3:"짦";s:2:"F";s:3:"짧";s:2:"ª";s:3:"짨";s:2:"G";s:3:"짩";s:2:"H";s:3:"짪";s:2:"I";s:3:"짫";s:2:"J";s:3:"짬";s:2:"«";s:3:"짭";s:2:"¬";s:3:"짮";s:2:"K";s:3:"짯";s:2:"­";s:3:"짰";s:2:"®";s:3:"짱";s:2:"¯";s:3:"짲";s:2:"L";s:3:"짳";s:2:"M";s:3:"짴";s:2:"N";s:3:"짵";s:2:"O";s:3:"짶";s:2:"P";s:3:"짷";s:2:"Q";s:3:"째";s:2:"°";s:3:"짹";s:2:"±";s:3:"짺";s:2:"R";s:3:"짻";s:2:"S";s:3:"짼";s:2:"²";s:3:"짽";s:2:"T";s:3:"짾";s:2:"U";s:3:"짿";s:2:"V";s:3:"쨀";s:2:"³";s:3:"쨁";s:2:"W";s:3:"쨂";s:2:"X";s:3:"쨃";s:2:"Y";s:3:"쨄";s:2:"Z";s:3:"쨅";s:2:"a";s:3:"쨆";s:2:"b";s:3:"쨇";s:2:"c";s:3:"쨈";s:2:"´";s:3:"쨉";s:2:"µ";s:3:"쨊";s:2:"d";s:3:"쨋";s:2:"¶";s:3:"쨌";s:2:"·";s:3:"쨍";s:2:"¸";s:3:"쨎";s:2:"e";s:3:"쨏";s:2:"f";s:3:"쨐";s:2:"g";s:3:"쨑";s:2:"h";s:3:"쨒";s:2:"i";s:3:"쨓";s:2:"j";s:3:"쨔";s:2:"¹";s:3:"쨕";s:2:"k";s:3:"쨖";s:2:"l";s:3:"쨗";s:2:"m";s:3:"쨘";s:2:"º";s:3:"쨙";s:2:"n";s:3:"쨚";s:2:"o";s:3:"쨛";s:2:"p";s:3:"쨜";s:2:"q";s:3:"쨝";s:2:"r";s:3:"쨞";s:2:"s";s:3:"쨟";s:2:"t";s:3:"쨠";s:2:"u";s:3:"쨡";s:2:"v";s:3:"쨢";s:2:"w";s:3:"쨣";s:2:"x";s:3:"쨤";s:2:"y";s:3:"쨥";s:2:"z";s:3:"쨦";s:2:"";s:3:"쨧";s:2:"";s:3:"쨨";s:2:"";s:3:"쨩";s:2:"»";s:3:"쨪";s:2:"";s:3:"쨫";s:2:"";s:3:"쨬";s:2:"";s:3:"쨭";s:2:"";s:3:"쨮";s:2:"";s:3:"쨯";s:2:"";s:3:"쨰";s:2:"";s:3:"쨱";s:2:"";s:3:"쨲";s:2:"";s:3:"쨳";s:2:"";s:3:"쨴";s:2:"";s:3:"쨵";s:2:"";s:3:"쨶";s:2:"";s:3:"쨷";s:2:"";s:3:"쨸";s:2:"";s:3:"쨹";s:2:"";s:3:"쨺";s:2:"";s:3:"쨻";s:2:"";s:3:"쨼";s:2:"";s:3:"쨽";s:2:"";s:3:"쨾";s:2:"";s:3:"쨿";s:2:"";s:3:"쩀";s:2:"";s:3:"쩁";s:2:"";s:3:"쩂";s:2:"";s:3:"쩃";s:2:"";s:3:"쩄";s:2:"";s:3:"쩅";s:2:"";s:3:"쩆";s:2:"";s:3:"쩇";s:2:"A";s:3:"쩈";s:2:"B";s:3:"쩉";s:2:"C";s:3:"쩊";s:2:"D";s:3:"쩋";s:2:"E";s:3:"쩌";s:2:"¼";s:3:"쩍";s:2:"½";s:3:"쩎";s:2:"F";s:3:"쩏";s:2:"G";s:3:"쩐";s:2:"¾";s:3:"쩑";s:2:"H";s:3:"쩒";s:2:"I";s:3:"쩓";s:2:"J";s:3:"쩔";s:2:"¿";s:3:"쩕";s:2:"K";s:3:"쩖";s:2:"L";s:3:"쩗";s:2:"M";s:3:"쩘";s:2:"N";s:3:"쩙";s:2:"O";s:3:"쩚";s:2:"P";s:3:"쩛";s:2:"Q";s:3:"쩜";s:2:"";s:3:"쩝";s:2:"";s:3:"쩞";s:2:"R";s:3:"쩟";s:2:"";s:3:"쩠";s:2:"";s:3:"쩡";s:2:"";s:3:"쩢";s:2:"S";s:3:"쩣";s:2:"T";s:3:"쩤";s:2:"U";s:3:"쩥";s:2:"V";s:3:"쩦";s:2:"W";s:3:"쩧";s:2:"X";s:3:"쩨";s:2:"";s:3:"쩩";s:2:"Y";s:3:"쩪";s:2:"Z";s:3:"쩫";s:2:"a";s:3:"쩬";s:2:"b";s:3:"쩭";s:2:"c";s:3:"쩮";s:2:"d";s:3:"쩯";s:2:"e";s:3:"쩰";s:2:"f";s:3:"쩱";s:2:"g";s:3:"쩲";s:2:"h";s:3:"쩳";s:2:"i";s:3:"쩴";s:2:"j";s:3:"쩵";s:2:"k";s:3:"쩶";s:2:"l";s:3:"쩷";s:2:"m";s:3:"쩸";s:2:"n";s:3:"쩹";s:2:"o";s:3:"쩺";s:2:"p";s:3:"쩻";s:2:"q";s:3:"쩼";s:2:"r";s:3:"쩽";s:2:"";s:3:"쩾";s:2:"s";s:3:"쩿";s:2:"t";s:3:"쪀";s:2:"u";s:3:"쪁";s:2:"v";s:3:"쪂";s:2:"w";s:3:"쪃";s:2:"x";s:3:"쪄";s:2:"";s:3:"쪅";s:2:"y";s:3:"쪆";s:2:"z";s:3:"쪇";s:2:"";s:3:"쪈";s:2:"";s:3:"쪉";s:2:"";s:3:"쪊";s:2:"";s:3:"쪋";s:2:"";s:3:"쪌";s:2:"";s:3:"쪍";s:2:"";s:3:"쪎";s:2:"";s:3:"쪏";s:2:"";s:3:"쪐";s:2:"";s:3:"쪑";s:2:"";s:3:"쪒";s:2:"";s:3:"쪓";s:2:"";s:3:"쪔";s:2:"";s:3:"쪕";s:2:"";s:3:"쪖";s:2:"";s:3:"쪗";s:2:"";s:3:"쪘";s:2:"";s:3:"쪙";s:2:"";s:3:"쪚";s:2:"";s:3:"쪛";s:2:"";s:3:"쪜";s:2:"";s:3:"쪝";s:2:"";s:3:"쪞";s:2:"";s:3:"쪟";s:2:"";s:3:"쪠";s:2:"";s:3:"쪡";s:2:"";s:3:"쪢";s:2:"";s:3:"쪣";s:2:"";s:3:"쪤";s:2:"";s:3:"쪥";s:2:"";s:3:"쪦";s:2:"";s:3:"쪧";s:2:"";s:3:"쪨";s:2:"A";s:3:"쪩";s:2:"B";s:3:"쪪";s:2:"C";s:3:"쪫";s:2:"D";s:3:"쪬";s:2:"E";s:3:"쪭";s:2:"F";s:3:"쪮";s:2:"G";s:3:"쪯";s:2:"H";s:3:"쪰";s:2:"I";s:3:"쪱";s:2:"J";s:3:"쪲";s:2:"K";s:3:"쪳";s:2:"L";s:3:"쪴";s:2:"M";s:3:"쪵";s:2:"N";s:3:"쪶";s:2:"O";s:3:"쪷";s:2:"P";s:3:"쪸";s:2:"Q";s:3:"쪹";s:2:"R";s:3:"쪺";s:2:"S";s:3:"쪻";s:2:"T";s:3:"쪼";s:2:"";s:3:"쪽";s:2:"";s:3:"쪾";s:2:"U";s:3:"쪿";s:2:"V";s:3:"쫀";s:2:"";s:3:"쫁";s:2:"W";s:3:"쫂";s:2:"X";s:3:"쫃";s:2:"Y";s:3:"쫄";s:2:"";s:3:"쫅";s:2:"Z";s:3:"쫆";s:2:"a";s:3:"쫇";s:2:"b";s:3:"쫈";s:2:"c";s:3:"쫉";s:2:"d";s:3:"쫊";s:2:"e";s:3:"쫋";s:2:"f";s:3:"쫌";s:2:"";s:3:"쫍";s:2:"";s:3:"쫎";s:2:"g";s:3:"쫏";s:2:"";s:3:"쫐";s:2:"h";s:3:"쫑";s:2:"";s:3:"쫒";s:2:"i";s:3:"쫓";s:2:"";s:3:"쫔";s:2:"j";s:3:"쫕";s:2:"k";s:3:"쫖";s:2:"l";s:3:"쫗";s:2:"m";s:3:"쫘";s:2:"";s:3:"쫙";s:2:"";s:3:"쫚";s:2:"n";s:3:"쫛";s:2:"o";s:3:"쫜";s:2:"p";s:3:"쫝";s:2:"q";s:3:"쫞";s:2:"r";s:3:"쫟";s:2:"s";s:3:"쫠";s:2:"";s:3:"쫡";s:2:"t";s:3:"쫢";s:2:"u";s:3:"쫣";s:2:"v";s:3:"쫤";s:2:"w";s:3:"쫥";s:2:"x";s:3:"쫦";s:2:"y";s:3:"쫧";s:2:"z";s:3:"쫨";s:2:"";s:3:"쫩";s:2:"";s:3:"쫪";s:2:"";s:3:"쫫";s:2:"";s:3:"쫬";s:2:"";s:3:"쫭";s:2:"";s:3:"쫮";s:2:"";s:3:"쫯";s:2:"";s:3:"쫰";s:2:"";s:3:"쫱";s:2:"";s:3:"쫲";s:2:"";s:3:"쫳";s:2:"";s:3:"쫴";s:2:"";s:3:"쫵";s:2:"";s:3:"쫶";s:2:"";s:3:"쫷";s:2:"";s:3:"쫸";s:2:"";s:3:"쫹";s:2:"";s:3:"쫺";s:2:"";s:3:"쫻";s:2:"";s:3:"쫼";s:2:"";s:3:"쫽";s:2:"";s:3:"쫾";s:2:"";s:3:"쫿";s:2:"";s:3:"쬀";s:2:"";s:3:"쬁";s:2:"";s:3:"쬂";s:2:"";s:3:"쬃";s:2:"";s:3:"쬄";s:2:"";s:3:"쬅";s:2:"";s:3:"쬆";s:2:"";s:3:"쬇";s:2:"";s:3:"쬈";s:2:"";s:3:"쬉";s:2:"";s:3:"쬊";s:2:"";s:3:"쬋";s:2:"A";s:3:"쬌";s:2:"B";s:3:"쬍";s:2:"C";s:3:"쬎";s:2:"D";s:3:"쬏";s:2:"E";s:3:"쬐";s:2:"";s:3:"쬑";s:2:"F";s:3:"쬒";s:2:"G";s:3:"쬓";s:2:"H";s:3:"쬔";s:2:"";s:3:"쬕";s:2:"I";s:3:"쬖";s:2:"J";s:3:"쬗";s:2:"K";s:3:"쬘";s:2:"";s:3:"쬙";s:2:"L";s:3:"쬚";s:2:"M";s:3:"쬛";s:2:"N";s:3:"쬜";s:2:"O";s:3:"쬝";s:2:"P";s:3:"쬞";s:2:"Q";s:3:"쬟";s:2:"R";s:3:"쬠";s:2:"";s:3:"쬡";s:2:"";s:3:"쬢";s:2:"S";s:3:"쬣";s:2:"T";s:3:"쬤";s:2:"U";s:3:"쬥";s:2:"V";s:3:"쬦";s:2:"W";s:3:"쬧";s:2:"X";s:3:"쬨";s:2:"Y";s:3:"쬩";s:2:"Z";s:3:"쬪";s:2:"a";s:3:"쬫";s:2:"b";s:3:"쬬";s:2:"c";s:3:"쬭";s:2:"d";s:3:"쬮";s:2:"e";s:3:"쬯";s:2:"f";s:3:"쬰";s:2:"g";s:3:"쬱";s:2:"h";s:3:"쬲";s:2:"i";s:3:"쬳";s:2:"j";s:3:"쬴";s:2:"k";s:3:"쬵";s:2:"l";s:3:"쬶";s:2:"m";s:3:"쬷";s:2:"n";s:3:"쬸";s:2:"o";s:3:"쬹";s:2:"p";s:3:"쬺";s:2:"q";s:3:"쬻";s:2:"r";s:3:"쬼";s:2:"s";s:3:"쬽";s:2:"t";s:3:"쬾";s:2:"u";s:3:"쬿";s:2:"v";s:3:"쭀";s:2:"w";s:3:"쭁";s:2:"";s:3:"쭂";s:2:"x";s:3:"쭃";s:2:"y";s:3:"쭄";s:2:"z";s:3:"쭅";s:2:"";s:3:"쭆";s:2:"";s:3:"쭇";s:2:"";s:3:"쭈";s:2:"";s:3:"쭉";s:2:"";s:3:"쭊";s:2:"";s:3:"쭋";s:2:"";s:3:"쭌";s:2:"";s:3:"쭍";s:2:"";s:3:"쭎";s:2:"";s:3:"쭏";s:2:"";s:3:"쭐";s:2:"";s:3:"쭑";s:2:"";s:3:"쭒";s:2:"";s:3:"쭓";s:2:"";s:3:"쭔";s:2:"";s:3:"쭕";s:2:"";s:3:"쭖";s:2:"";s:3:"쭗";s:2:"";s:3:"쭘";s:2:"";s:3:"쭙";s:2:"";s:3:"쭚";s:2:"";s:3:"쭛";s:2:"";s:3:"쭜";s:2:"";s:3:"쭝";s:2:"";s:3:"쭞";s:2:"";s:3:"쭟";s:2:"";s:3:"쭠";s:2:"";s:3:"쭡";s:2:"";s:3:"쭢";s:2:"";s:3:"쭣";s:2:"";s:3:"쭤";s:2:"";s:3:"쭥";s:2:"";s:3:"쭦";s:2:"";s:3:"쭧";s:2:"";s:3:"쭨";s:2:"";s:3:"쭩";s:2:"";s:3:"쭪";s:2:"";s:3:"쭫";s:2:"";s:3:"쭬";s:2:"";s:3:"쭭";s:2:"A";s:3:"쭮";s:2:"B";s:3:"쭯";s:2:"C";s:3:"쭰";s:2:"D";s:3:"쭱";s:2:"E";s:3:"쭲";s:2:"F";s:3:"쭳";s:2:"G";s:3:"쭴";s:2:"H";s:3:"쭵";s:2:"I";s:3:"쭶";s:2:"J";s:3:"쭷";s:2:"K";s:3:"쭸";s:2:"";s:3:"쭹";s:2:"";s:3:"쭺";s:2:"L";s:3:"쭻";s:2:"M";s:3:"쭼";s:2:"N";s:3:"쭽";s:2:"O";s:3:"쭾";s:2:"P";s:3:"쭿";s:2:"Q";s:3:"쮀";s:2:"R";s:3:"쮁";s:2:"S";s:3:"쮂";s:2:"T";s:3:"쮃";s:2:"U";s:3:"쮄";s:2:"V";s:3:"쮅";s:2:"W";s:3:"쮆";s:2:"X";s:3:"쮇";s:2:"Y";s:3:"쮈";s:2:"Z";s:3:"쮉";s:2:"a";s:3:"쮊";s:2:"b";s:3:"쮋";s:2:"c";s:3:"쮌";s:2:"d";s:3:"쮍";s:2:"e";s:3:"쮎";s:2:"f";s:3:"쮏";s:2:"g";s:3:"쮐";s:2:"h";s:3:"쮑";s:2:"i";s:3:"쮒";s:2:"j";s:3:"쮓";s:2:"k";s:3:"쮔";s:2:"l";s:3:"쮕";s:2:"m";s:3:"쮖";s:2:"n";s:3:"쮗";s:2:"o";s:3:"쮘";s:2:"p";s:3:"쮙";s:2:"q";s:3:"쮚";s:2:"r";s:3:"쮛";s:2:"s";s:3:"쮜";s:2:"";s:3:"쮝";s:2:"t";s:3:"쮞";s:2:"u";s:3:"쮟";s:2:"v";s:3:"쮠";s:2:"w";s:3:"쮡";s:2:"x";s:3:"쮢";s:2:"y";s:3:"쮣";s:2:"z";s:3:"쮤";s:2:"";s:3:"쮥";s:2:"";s:3:"쮦";s:2:"";s:3:"쮧";s:2:"";s:3:"쮨";s:2:"";s:3:"쮩";s:2:"";s:3:"쮪";s:2:"";s:3:"쮫";s:2:"";s:3:"쮬";s:2:"";s:3:"쮭";s:2:"";s:3:"쮮";s:2:"";s:3:"쮯";s:2:"";s:3:"쮰";s:2:"";s:3:"쮱";s:2:"";s:3:"쮲";s:2:"";s:3:"쮳";s:2:"";s:3:"쮴";s:2:"";s:3:"쮵";s:2:"";s:3:"쮶";s:2:"";s:3:"쮷";s:2:"";s:3:"쮸";s:2:"";s:3:"쮹";s:2:"";s:3:"쮺";s:2:"";s:3:"쮻";s:2:"";s:3:"쮼";s:2:"";s:3:"쮽";s:2:"";s:3:"쮾";s:2:"";s:3:"쮿";s:2:"";s:3:"쯀";s:2:"";s:3:"쯁";s:2:"";s:3:"쯂";s:2:"";s:3:"쯃";s:2:"";s:3:"쯄";s:2:"";s:3:"쯅";s:2:"A";s:3:"쯆";s:2:"B";s:3:"쯇";s:2:"C";s:3:"쯈";s:2:"D";s:3:"쯉";s:2:"E";s:3:"쯊";s:2:"F";s:3:"쯋";s:2:"G";s:3:"쯌";s:2:"H";s:3:"쯍";s:2:"I";s:3:"쯎";s:2:"J";s:3:"쯏";s:2:"K";s:3:"쯐";s:2:"L";s:3:"쯑";s:2:"M";s:3:"쯒";s:2:"N";s:3:"쯓";s:2:"O";s:3:"쯔";s:2:"";s:3:"쯕";s:2:"P";s:3:"쯖";s:2:"Q";s:3:"쯗";s:2:"R";s:3:"쯘";s:2:"S";s:3:"쯙";s:2:"T";s:3:"쯚";s:2:"U";s:3:"쯛";s:2:"V";s:3:"쯜";s:2:"W";s:3:"쯝";s:2:"X";s:3:"쯞";s:2:"Y";s:3:"쯟";s:2:"Z";s:3:"쯠";s:2:"a";s:3:"쯡";s:2:"b";s:3:"쯢";s:2:"c";s:3:"쯣";s:2:"d";s:3:"쯤";s:2:"";s:3:"쯥";s:2:"e";s:3:"쯦";s:2:"f";s:3:"쯧";s:2:"";s:3:"쯨";s:2:"g";s:3:"쯩";s:2:"";s:3:"쯪";s:2:"h";s:3:"쯫";s:2:"i";s:3:"쯬";s:2:"j";s:3:"쯭";s:2:"k";s:3:"쯮";s:2:"l";s:3:"쯯";s:2:"m";s:3:"쯰";s:2:"n";s:3:"쯱";s:2:"o";s:3:"쯲";s:2:"p";s:3:"쯳";s:2:"q";s:3:"쯴";s:2:"r";s:3:"쯵";s:2:"s";s:3:"쯶";s:2:"t";s:3:"쯷";s:2:"u";s:3:"쯸";s:2:"v";s:3:"쯹";s:2:"w";s:3:"쯺";s:2:"x";s:3:"쯻";s:2:"y";s:3:"쯼";s:2:"z";s:3:"쯽";s:2:"";s:3:"쯾";s:2:"";s:3:"쯿";s:2:"";s:3:"찀";s:2:"";s:3:"찁";s:2:"";s:3:"찂";s:2:"";s:3:"찃";s:2:"";s:3:"찄";s:2:"";s:3:"찅";s:2:"";s:3:"찆";s:2:"";s:3:"찇";s:2:"";s:3:"찈";s:2:"";s:3:"찉";s:2:"";s:3:"찊";s:2:"";s:3:"찋";s:2:"";s:3:"찌";s:2:"";s:3:"찍";s:2:"";s:3:"찎";s:2:"";s:3:"찏";s:2:"";s:3:"찐";s:2:"";s:3:"찑";s:2:"";s:3:"찒";s:2:"";s:3:"찓";s:2:"";s:3:"찔";s:2:"";s:3:"찕";s:2:"";s:3:"찖";s:2:"";s:3:"찗";s:2:"";s:3:"찘";s:2:"";s:3:"찙";s:2:"";s:3:"찚";s:2:"";s:3:"찛";s:2:"";s:3:"찜";s:2:"";s:3:"찝";s:2:"";s:3:"찞";s:2:"";s:3:"찟";s:2:"";s:3:"찠";s:2:"";s:3:"찡";s:2:"";s:3:"찢";s:2:"";s:3:"찣";s:2:"";s:3:"찤";s:2:"";s:3:"찥";s:2:"A";s:3:"찦";s:2:"B";s:3:"찧";s:2:"";s:3:"차";s:2:"";s:3:"착";s:2:"";s:3:"찪";s:2:"C";s:3:"찫";s:2:"D";s:3:"찬";s:2:"";s:3:"찭";s:2:"E";s:3:"찮";s:2:"";s:3:"찯";s:2:"F";s:3:"찰";s:2:"";s:3:"찱";s:2:"G";s:3:"찲";s:2:"H";s:3:"찳";s:2:"I";s:3:"찴";s:2:"J";s:3:"찵";s:2:"K";s:3:"찶";s:2:"L";s:3:"찷";s:2:"M";s:3:"참";s:2:"";s:3:"찹";s:2:"";s:3:"찺";s:2:"N";s:3:"찻";s:2:"";s:3:"찼";s:2:"á";s:3:"창";s:2:"â";s:3:"찾";s:2:"ã";s:3:"찿";s:2:"O";s:3:"챀";s:2:"P";s:3:"챁";s:2:"Q";s:3:"챂";s:2:"R";s:3:"챃";s:2:"S";s:3:"채";s:2:"ä";s:3:"책";s:2:"å";s:3:"챆";s:2:"T";s:3:"챇";s:2:"U";s:3:"챈";s:2:"æ";s:3:"챉";s:2:"V";s:3:"챊";s:2:"W";s:3:"챋";s:2:"X";s:3:"챌";s:2:"ç";s:3:"챍";s:2:"Y";s:3:"챎";s:2:"Z";s:3:"챏";s:2:"a";s:3:"챐";s:2:"b";s:3:"챑";s:2:"c";s:3:"챒";s:2:"d";s:3:"챓";s:2:"e";s:3:"챔";s:2:"è";s:3:"챕";s:2:"é";s:3:"챖";s:2:"f";s:3:"챗";s:2:"ê";s:3:"챘";s:2:"ë";s:3:"챙";s:2:"ì";s:3:"챚";s:2:"g";s:3:"챛";s:2:"h";s:3:"챜";s:2:"i";s:3:"챝";s:2:"j";s:3:"챞";s:2:"k";s:3:"챟";s:2:"l";s:3:"챠";s:2:"í";s:3:"챡";s:2:"m";s:3:"챢";s:2:"n";s:3:"챣";s:2:"o";s:3:"챤";s:2:"î";s:3:"챥";s:2:"p";s:3:"챦";s:2:"ï";s:3:"챧";s:2:"q";s:3:"챨";s:2:"ð";s:3:"챩";s:2:"r";s:3:"챪";s:2:"s";s:3:"챫";s:2:"t";s:3:"챬";s:2:"u";s:3:"챭";s:2:"v";s:3:"챮";s:2:"w";s:3:"챯";s:2:"x";s:3:"챰";s:2:"ñ";s:3:"챱";s:2:"y";s:3:"챲";s:2:"z";s:3:"챳";s:2:"";s:3:"챴";s:2:"";s:3:"챵";s:2:"ò";s:3:"챶";s:2:"";s:3:"챷";s:2:"";s:3:"챸";s:2:"";s:3:"챹";s:2:"";s:3:"챺";s:2:"";s:3:"챻";s:2:"";s:3:"챼";s:2:"";s:3:"챽";s:2:"";s:3:"챾";s:2:"";s:3:"챿";s:2:"";s:3:"첀";s:2:"";s:3:"첁";s:2:"";s:3:"첂";s:2:"";s:3:"첃";s:2:"";s:3:"첄";s:2:"";s:3:"첅";s:2:"";s:3:"첆";s:2:"";s:3:"첇";s:2:"";s:3:"첈";s:2:"";s:3:"첉";s:2:"";s:3:"첊";s:2:"";s:3:"첋";s:2:"";s:3:"첌";s:2:"";s:3:"첍";s:2:"";s:3:"첎";s:2:"";s:3:"첏";s:2:"";s:3:"첐";s:2:"";s:3:"첑";s:2:"";s:3:"첒";s:2:"";s:3:"첓";s:2:"";s:3:"첔";s:2:"A";s:3:"첕";s:2:"B";s:3:"첖";s:2:"C";s:3:"첗";s:2:"D";s:3:"처";s:2:"ó";s:3:"척";s:2:"ô";s:3:"첚";s:2:"E";s:3:"첛";s:2:"F";s:3:"천";s:2:"õ";s:3:"첝";s:2:"G";s:3:"첞";s:2:"H";s:3:"첟";s:2:"I";s:3:"철";s:2:"ö";s:3:"첡";s:2:"J";s:3:"첢";s:2:"K";s:3:"첣";s:2:"L";s:3:"첤";s:2:"M";s:3:"첥";s:2:"N";s:3:"첦";s:2:"O";s:3:"첧";s:2:"P";s:3:"첨";s:2:"÷";s:3:"첩";s:2:"ø";s:3:"첪";s:2:"Q";s:3:"첫";s:2:"ù";s:3:"첬";s:2:"ú";s:3:"청";s:2:"û";s:3:"첮";s:2:"R";s:3:"첯";s:2:"S";s:3:"첰";s:2:"T";s:3:"첱";s:2:"U";s:3:"첲";s:2:"V";s:3:"첳";s:2:"W";s:3:"체";s:2:"ü";s:3:"첵";s:2:"ý";s:3:"첶";s:2:"X";s:3:"첷";s:2:"Y";s:3:"첸";s:2:"þ";s:3:"첹";s:2:"Z";s:3:"첺";s:2:"a";s:3:"첻";s:2:"b";s:3:"첼";s:2:"ÿ";s:3:"첽";s:2:"c";s:3:"첾";s:2:"d";s:3:"첿";s:2:"e";s:3:"쳀";s:2:"f";s:3:"쳁";s:2:"g";s:3:"쳂";s:2:"h";s:3:"쳃";s:2:"i";s:3:"쳄";s:2:"";s:3:"쳅";s:2:"";s:3:"쳆";s:2:"j";s:3:"쳇";s:2:"";s:3:"쳈";s:2:"k";s:3:"쳉";s:2:"";s:3:"쳊";s:2:"l";s:3:"쳋";s:2:"m";s:3:"쳌";s:2:"n";s:3:"쳍";s:2:"o";s:3:"쳎";s:2:"p";s:3:"쳏";s:2:"q";s:3:"쳐";s:2:"";s:3:"쳑";s:2:"r";s:3:"쳒";s:2:"s";s:3:"쳓";s:2:"t";s:3:"쳔";s:2:"";s:3:"쳕";s:2:"u";s:3:"쳖";s:2:"v";s:3:"쳗";s:2:"w";s:3:"쳘";s:2:"x";s:3:"쳙";s:2:"y";s:3:"쳚";s:2:"z";s:3:"쳛";s:2:"";s:3:"쳜";s:2:"";s:3:"쳝";s:2:"";s:3:"쳞";s:2:"";s:3:"쳟";s:2:"";s:3:"쳠";s:2:"";s:3:"쳡";s:2:"";s:3:"쳢";s:2:"";s:3:"쳣";s:2:"";s:3:"쳤";s:2:"";s:3:"쳥";s:2:"";s:3:"쳦";s:2:"";s:3:"쳧";s:2:"";s:3:"쳨";s:2:"";s:3:"쳩";s:2:"";s:3:"쳪";s:2:"";s:3:"쳫";s:2:"";s:3:"쳬";s:2:"";s:3:"쳭";s:2:"";s:3:"쳮";s:2:"";s:3:"쳯";s:2:"";s:3:"쳰";s:2:"";s:3:"쳱";s:2:"";s:3:"쳲";s:2:"";s:3:"쳳";s:2:"";s:3:"쳴";s:2:"";s:3:"쳵";s:2:"";s:3:"쳶";s:2:"";s:3:"쳷";s:2:"";s:3:"쳸";s:2:"";s:3:"쳹";s:2:"";s:3:"쳺";s:2:"";s:3:"쳻";s:2:"";s:3:"쳼";s:2:"";s:3:"쳽";s:2:"";s:3:"쳾";s:2:"A";s:3:"쳿";s:2:"B";s:3:"촀";s:2:"C";s:3:"촁";s:2:"";s:3:"촂";s:2:"D";s:3:"촃";s:2:"E";s:3:"촄";s:2:"F";s:3:"촅";s:2:"G";s:3:"촆";s:2:"H";s:3:"촇";s:2:"I";s:3:"초";s:2:"";s:3:"촉";s:2:"";s:3:"촊";s:2:"J";s:3:"촋";s:2:"K";s:3:"촌";s:2:"";s:3:"촍";s:2:"L";s:3:"촎";s:2:"M";s:3:"촏";s:2:"N";s:3:"촐";s:2:"";s:3:"촑";s:2:"O";s:3:"촒";s:2:"P";s:3:"촓";s:2:"Q";s:3:"촔";s:2:"R";s:3:"촕";s:2:"S";s:3:"촖";s:2:"T";s:3:"촗";s:2:"U";s:3:"촘";s:2:"";s:3:"촙";s:2:"";s:3:"촚";s:2:"V";s:3:"촛";s:2:"";s:3:"촜";s:2:"W";s:3:"총";s:2:"";s:3:"촞";s:2:"X";s:3:"촟";s:2:"Y";s:3:"촠";s:2:"Z";s:3:"촡";s:2:"a";s:3:"촢";s:2:"b";s:3:"촣";s:2:"c";s:3:"촤";s:2:"";s:3:"촥";s:2:"d";s:3:"촦";s:2:"e";s:3:"촧";s:2:"f";s:3:"촨";s:2:"";s:3:"촩";s:2:"g";s:3:"촪";s:2:"h";s:3:"촫";s:2:"i";s:3:"촬";s:2:"";s:3:"촭";s:2:"j";s:3:"촮";s:2:"k";s:3:"촯";s:2:"l";s:3:"촰";s:2:"m";s:3:"촱";s:2:"n";s:3:"촲";s:2:"o";s:3:"촳";s:2:"p";s:3:"촴";s:2:"q";s:3:"촵";s:2:"r";s:3:"촶";s:2:"s";s:3:"촷";s:2:"t";s:3:"촸";s:2:"u";s:3:"촹";s:2:"";s:3:"촺";s:2:"v";s:3:"촻";s:2:"w";s:3:"촼";s:2:"x";s:3:"촽";s:2:"y";s:3:"촾";s:2:"z";s:3:"촿";s:2:"";s:3:"쵀";s:2:"";s:3:"쵁";s:2:"";s:3:"쵂";s:2:"";s:3:"쵃";s:2:"";s:3:"쵄";s:2:"";s:3:"쵅";s:2:"";s:3:"쵆";s:2:"";s:3:"쵇";s:2:"";s:3:"쵈";s:2:"";s:3:"쵉";s:2:"";s:3:"쵊";s:2:"";s:3:"쵋";s:2:"";s:3:"쵌";s:2:"";s:3:"쵍";s:2:"";s:3:"쵎";s:2:"";s:3:"쵏";s:2:"";s:3:"쵐";s:2:"";s:3:"쵑";s:2:"";s:3:"쵒";s:2:"";s:3:"쵓";s:2:"";s:3:"쵔";s:2:"";s:3:"쵕";s:2:"";s:3:"쵖";s:2:"";s:3:"쵗";s:2:"";s:3:"쵘";s:2:"";s:3:"쵙";s:2:"";s:3:"쵚";s:2:"";s:3:"쵛";s:2:"";s:3:"최";s:2:"";s:3:"쵝";s:2:"";s:3:"쵞";s:2:"";s:3:"쵟";s:2:"";s:3:"쵠";s:2:"";s:3:"쵡";s:2:"A";s:3:"쵢";s:2:"B";s:3:"쵣";s:2:"C";s:3:"쵤";s:2:"";s:3:"쵥";s:2:"D";s:3:"쵦";s:2:"E";s:3:"쵧";s:2:"F";s:3:"쵨";s:2:"G";s:3:"쵩";s:2:"H";s:3:"쵪";s:2:"I";s:3:"쵫";s:2:"J";s:3:"쵬";s:2:"";s:3:"쵭";s:2:"";s:3:"쵮";s:2:"K";s:3:"쵯";s:2:"";s:3:"쵰";s:2:"L";s:3:"쵱";s:2:"";s:3:"쵲";s:2:"M";s:3:"쵳";s:2:"N";s:3:"쵴";s:2:"O";s:3:"쵵";s:2:"P";s:3:"쵶";s:2:"Q";s:3:"쵷";s:2:"R";s:3:"쵸";s:2:"";s:3:"쵹";s:2:"S";s:3:"쵺";s:2:"T";s:3:"쵻";s:2:"U";s:3:"쵼";s:2:"V";s:3:"쵽";s:2:"W";s:3:"쵾";s:2:"X";s:3:"쵿";s:2:"Y";s:3:"춀";s:2:"Z";s:3:"춁";s:2:"a";s:3:"춂";s:2:"b";s:3:"춃";s:2:"c";s:3:"춄";s:2:"d";s:3:"춅";s:2:"e";s:3:"춆";s:2:"f";s:3:"춇";s:2:"g";s:3:"춈";s:2:"";s:3:"춉";s:2:"h";s:3:"춊";s:2:"i";s:3:"춋";s:2:"j";s:3:"춌";s:2:"k";s:3:"춍";s:2:"l";s:3:"춎";s:2:"m";s:3:"춏";s:2:"n";s:3:"춐";s:2:"o";s:3:"춑";s:2:"p";s:3:"춒";s:2:"q";s:3:"춓";s:2:"r";s:3:"추";s:2:"";s:3:"축";s:2:"";s:3:"춖";s:2:"s";s:3:"춗";s:2:"t";s:3:"춘";s:2:"";s:3:"춙";s:2:"u";s:3:"춚";s:2:"v";s:3:"춛";s:2:"w";s:3:"출";s:2:"";s:3:"춝";s:2:"x";s:3:"춞";s:2:"y";s:3:"춟";s:2:"z";s:3:"춠";s:2:"";s:3:"춡";s:2:"";s:3:"춢";s:2:"";s:3:"춣";s:2:"";s:3:"춤";s:2:"";s:3:"춥";s:2:"";s:3:"춦";s:2:"";s:3:"춧";s:2:"";s:3:"춨";s:2:"";s:3:"충";s:2:"";s:3:"춪";s:2:"";s:3:"춫";s:2:"";s:3:"춬";s:2:"";s:3:"춭";s:2:"";s:3:"춮";s:2:"";s:3:"춯";s:2:"";s:3:"춰";s:2:"";s:3:"춱";s:2:"";s:3:"춲";s:2:"";s:3:"춳";s:2:"";s:3:"춴";s:2:"";s:3:"춵";s:2:"";s:3:"춶";s:2:"";s:3:"춷";s:2:"";s:3:"춸";s:2:"";s:3:"춹";s:2:"";s:3:"춺";s:2:"";s:3:"춻";s:2:"";s:3:"춼";s:2:"";s:3:"춽";s:2:"";s:3:"춾";s:2:"";s:3:"춿";s:2:"";s:3:"췀";s:2:"";s:3:"췁";s:2:"";s:3:"췂";s:2:"";s:3:"췃";s:2:"";s:3:"췄";s:2:"";s:3:"췅";s:2:"";s:3:"췆";s:2:"A";s:3:"췇";s:2:"B";s:3:"췈";s:2:"C";s:3:"췉";s:2:"D";s:3:"췊";s:2:"E";s:3:"췋";s:2:"F";s:3:"췌";s:2:"";s:3:"췍";s:2:"G";s:3:"췎";s:2:"H";s:3:"췏";s:2:"I";s:3:"췐";s:2:"";s:3:"췑";s:2:"J";s:3:"췒";s:2:"K";s:3:"췓";s:2:"L";s:3:"췔";s:2:"M";s:3:"췕";s:2:"N";s:3:"췖";s:2:"O";s:3:"췗";s:2:"P";s:3:"췘";s:2:"Q";s:3:"췙";s:2:"R";s:3:"췚";s:2:"S";s:3:"췛";s:2:"T";s:3:"췜";s:2:"U";s:3:"췝";s:2:"V";s:3:"췞";s:2:"W";s:3:"췟";s:2:"X";s:3:"췠";s:2:"Y";s:3:"췡";s:2:"Z";s:3:"췢";s:2:"a";s:3:"췣";s:2:"b";s:3:"췤";s:2:"c";s:3:"췥";s:2:"d";s:3:"췦";s:2:"e";s:3:"췧";s:2:"f";s:3:"취";s:2:"";s:3:"췩";s:2:"g";s:3:"췪";s:2:"h";s:3:"췫";s:2:"i";s:3:"췬";s:2:"";s:3:"췭";s:2:"j";s:3:"췮";s:2:"k";s:3:"췯";s:2:"l";s:3:"췰";s:2:"";s:3:"췱";s:2:"m";s:3:"췲";s:2:"n";s:3:"췳";s:2:"o";s:3:"췴";s:2:"p";s:3:"췵";s:2:"q";s:3:"췶";s:2:"r";s:3:"췷";s:2:"s";s:3:"췸";s:2:"";s:3:"췹";s:2:"";s:3:"췺";s:2:"t";s:3:"췻";s:2:"";s:3:"췼";s:2:"u";s:3:"췽";s:2:"";s:3:"췾";s:2:"v";s:3:"췿";s:2:"w";s:3:"츀";s:2:"x";s:3:"츁";s:2:"y";s:3:"츂";s:2:"z";s:3:"츃";s:2:"";s:3:"츄";s:2:"";s:3:"츅";s:2:"";s:3:"츆";s:2:"";s:3:"츇";s:2:"";s:3:"츈";s:2:"";s:3:"츉";s:2:"";s:3:"츊";s:2:"";s:3:"츋";s:2:"";s:3:"츌";s:2:"";s:3:"츍";s:2:"";s:3:"츎";s:2:"";s:3:"츏";s:2:"";s:3:"츐";s:2:"";s:3:"츑";s:2:"";s:3:"츒";s:2:"";s:3:"츓";s:2:"";s:3:"츔";s:2:"";s:3:"츕";s:2:"";s:3:"츖";s:2:"";s:3:"츗";s:2:"";s:3:"츘";s:2:"";s:3:"츙";s:2:"";s:3:"츚";s:2:"";s:3:"츛";s:2:"";s:3:"츜";s:2:"";s:3:"츝";s:2:"";s:3:"츞";s:2:"";s:3:"츟";s:2:"";s:3:"츠";s:2:"";s:3:"측";s:2:"";s:3:"츢";s:2:"";s:3:"츣";s:2:"";s:3:"츤";s:2:"";s:3:"츥";s:2:"";s:3:"츦";s:2:"";s:3:"츧";s:2:"";s:3:"츨";s:2:"";s:3:"츩";s:2:"";s:3:"츪";s:2:"";s:3:"츫";s:2:"";s:3:"츬";s:2:"A";s:3:"츭";s:2:"B";s:3:"츮";s:2:"C";s:3:"츯";s:2:"D";s:3:"츰";s:2:"";s:3:"츱";s:2:"";s:3:"츲";s:2:"E";s:3:"츳";s:2:"";s:3:"츴";s:2:"F";s:3:"층";s:2:"";s:3:"츶";s:2:"G";s:3:"츷";s:2:"H";s:3:"츸";s:2:"I";s:3:"츹";s:2:"J";s:3:"츺";s:2:"K";s:3:"츻";s:2:"L";s:3:"츼";s:2:"M";s:3:"츽";s:2:"N";s:3:"츾";s:2:"O";s:3:"츿";s:2:"P";s:3:"칀";s:2:"Q";s:3:"칁";s:2:"R";s:3:"칂";s:2:"S";s:3:"칃";s:2:"T";s:3:"칄";s:2:"U";s:3:"칅";s:2:"V";s:3:"칆";s:2:"W";s:3:"칇";s:2:"X";s:3:"칈";s:2:"Y";s:3:"칉";s:2:"Z";s:3:"칊";s:2:"a";s:3:"칋";s:2:"b";s:3:"칌";s:2:"c";s:3:"칍";s:2:"d";s:3:"칎";s:2:"e";s:3:"칏";s:2:"f";s:3:"칐";s:2:"g";s:3:"칑";s:2:"h";s:3:"칒";s:2:"i";s:3:"칓";s:2:"j";s:3:"칔";s:2:"k";s:3:"칕";s:2:"l";s:3:"칖";s:2:"m";s:3:"칗";s:2:"n";s:3:"치";s:2:"ġ";s:3:"칙";s:2:"Ģ";s:3:"칚";s:2:"o";s:3:"칛";s:2:"p";s:3:"친";s:2:"ģ";s:3:"칝";s:2:"q";s:3:"칞";s:2:"r";s:3:"칟";s:2:"Ĥ";s:3:"칠";s:2:"ĥ";s:3:"칡";s:2:"Ħ";s:3:"칢";s:2:"s";s:3:"칣";s:2:"t";s:3:"칤";s:2:"u";s:3:"칥";s:2:"v";s:3:"칦";s:2:"w";s:3:"칧";s:2:"x";s:3:"침";s:2:"ħ";s:3:"칩";s:2:"Ĩ";s:3:"칪";s:2:"y";s:3:"칫";s:2:"ĩ";s:3:"칬";s:2:"z";s:3:"칭";s:2:"Ī";s:3:"칮";s:2:"";s:3:"칯";s:2:"";s:3:"칰";s:2:"";s:3:"칱";s:2:"";s:3:"칲";s:2:"";s:3:"칳";s:2:"";s:3:"카";s:2:"ī";s:3:"칵";s:2:"Ĭ";s:3:"칶";s:2:"";s:3:"칷";s:2:"";s:3:"칸";s:2:"ĭ";s:3:"칹";s:2:"";s:3:"칺";s:2:"";s:3:"칻";s:2:"";s:3:"칼";s:2:"Į";s:3:"칽";s:2:"";s:3:"칾";s:2:"";s:3:"칿";s:2:"";s:3:"캀";s:2:"";s:3:"캁";s:2:"";s:3:"캂";s:2:"";s:3:"캃";s:2:"";s:3:"캄";s:2:"į";s:3:"캅";s:2:"İ";s:3:"캆";s:2:"";s:3:"캇";s:2:"ı";s:3:"캈";s:2:"";s:3:"캉";s:2:"Ĳ";s:3:"캊";s:2:"";s:3:"캋";s:2:"";s:3:"캌";s:2:"";s:3:"캍";s:2:"";s:3:"캎";s:2:"";s:3:"캏";s:2:"";s:3:"캐";s:2:"ĳ";s:3:"캑";s:2:"Ĵ";s:3:"캒";s:2:"";s:3:"캓";s:2:"";s:3:"캔";s:2:"ĵ";s:3:"캕";s:2:"";s:3:"캖";s:2:"";s:3:"캗";s:2:"";s:3:"캘";s:2:"Ķ";s:3:"캙";s:2:"";s:3:"캚";s:2:"A";s:3:"캛";s:2:"B";s:3:"캜";s:2:"C";s:3:"캝";s:2:"D";s:3:"캞";s:2:"E";s:3:"캟";s:2:"F";s:3:"캠";s:2:"ķ";s:3:"캡";s:2:"ĸ";s:3:"캢";s:2:"G";s:3:"캣";s:2:"Ĺ";s:3:"캤";s:2:"ĺ";s:3:"캥";s:2:"Ļ";s:3:"캦";s:2:"H";s:3:"캧";s:2:"I";s:3:"캨";s:2:"J";s:3:"캩";s:2:"K";s:3:"캪";s:2:"L";s:3:"캫";s:2:"M";s:3:"캬";s:2:"ļ";s:3:"캭";s:2:"Ľ";s:3:"캮";s:2:"N";s:3:"캯";s:2:"O";s:3:"캰";s:2:"P";s:3:"캱";s:2:"Q";s:3:"캲";s:2:"R";s:3:"캳";s:2:"S";s:3:"캴";s:2:"T";s:3:"캵";s:2:"U";s:3:"캶";s:2:"V";s:3:"캷";s:2:"W";s:3:"캸";s:2:"X";s:3:"캹";s:2:"Y";s:3:"캺";s:2:"Z";s:3:"캻";s:2:"a";s:3:"캼";s:2:"b";s:3:"캽";s:2:"c";s:3:"캾";s:2:"d";s:3:"캿";s:2:"e";s:3:"컀";s:2:"f";s:3:"컁";s:2:"ľ";s:3:"컂";s:2:"g";s:3:"컃";s:2:"h";s:3:"컄";s:2:"i";s:3:"컅";s:2:"j";s:3:"컆";s:2:"k";s:3:"컇";s:2:"l";s:3:"컈";s:2:"m";s:3:"컉";s:2:"n";s:3:"컊";s:2:"o";s:3:"컋";s:2:"p";s:3:"컌";s:2:"q";s:3:"컍";s:2:"r";s:3:"컎";s:2:"s";s:3:"컏";s:2:"t";s:3:"컐";s:2:"u";s:3:"컑";s:2:"v";s:3:"컒";s:2:"w";s:3:"컓";s:2:"x";s:3:"컔";s:2:"y";s:3:"컕";s:2:"z";s:3:"컖";s:2:"";s:3:"컗";s:2:"";s:3:"컘";s:2:"";s:3:"컙";s:2:"";s:3:"컚";s:2:"";s:3:"컛";s:2:"";s:3:"컜";s:2:"";s:3:"컝";s:2:"";s:3:"컞";s:2:"";s:3:"컟";s:2:"";s:3:"컠";s:2:"";s:3:"컡";s:2:"";s:3:"컢";s:2:"";s:3:"컣";s:2:"";s:3:"커";s:2:"Ŀ";s:3:"컥";s:2:"";s:3:"컦";s:2:"";s:3:"컧";s:2:"";s:3:"컨";s:2:"";s:3:"컩";s:2:"";s:3:"컪";s:2:"";s:3:"컫";s:2:"";s:3:"컬";s:2:"";s:3:"컭";s:2:"";s:3:"컮";s:2:"";s:3:"컯";s:2:"";s:3:"컰";s:2:"";s:3:"컱";s:2:"";s:3:"컲";s:2:"";s:3:"컳";s:2:"";s:3:"컴";s:2:"";s:3:"컵";s:2:"";s:3:"컶";s:2:"";s:3:"컷";s:2:"";s:3:"컸";s:2:"";s:3:"컹";s:2:"";s:3:"컺";s:2:"";s:3:"컻";s:2:"";s:3:"컼";s:2:"";s:3:"컽";s:2:"";s:3:"컾";s:2:"";s:3:"컿";s:2:"";s:3:"케";s:2:"";s:3:"켁";s:2:"";s:3:"켂";s:2:"A";s:3:"켃";s:2:"B";s:3:"켄";s:2:"";s:3:"켅";s:2:"C";s:3:"켆";s:2:"D";s:3:"켇";s:2:"E";s:3:"켈";s:2:"";s:3:"켉";s:2:"F";s:3:"켊";s:2:"G";s:3:"켋";s:2:"H";s:3:"켌";s:2:"I";s:3:"켍";s:2:"J";s:3:"켎";s:2:"K";s:3:"켏";s:2:"L";s:3:"켐";s:2:"";s:3:"켑";s:2:"";s:3:"켒";s:2:"M";s:3:"켓";s:2:"";s:3:"켔";s:2:"N";s:3:"켕";s:2:"";s:3:"켖";s:2:"O";s:3:"켗";s:2:"P";s:3:"켘";s:2:"Q";s:3:"켙";s:2:"R";s:3:"켚";s:2:"S";s:3:"켛";s:2:"T";s:3:"켜";s:2:"";s:3:"켝";s:2:"U";s:3:"켞";s:2:"V";s:3:"켟";s:2:"W";s:3:"켠";s:2:"";s:3:"켡";s:2:"X";s:3:"켢";s:2:"Y";s:3:"켣";s:2:"Z";s:3:"켤";s:2:"";s:3:"켥";s:2:"a";s:3:"켦";s:2:"b";s:3:"켧";s:2:"c";s:3:"켨";s:2:"d";s:3:"켩";s:2:"e";s:3:"켪";s:2:"f";s:3:"켫";s:2:"g";s:3:"켬";s:2:"";s:3:"켭";s:2:"";s:3:"켮";s:2:"h";s:3:"켯";s:2:"";s:3:"켰";s:2:"";s:3:"켱";s:2:"";s:3:"켲";s:2:"i";s:3:"켳";s:2:"j";s:3:"켴";s:2:"k";s:3:"켵";s:2:"l";s:3:"켶";s:2:"m";s:3:"켷";s:2:"n";s:3:"켸";s:2:"";s:3:"켹";s:2:"o";s:3:"켺";s:2:"p";s:3:"켻";s:2:"q";s:3:"켼";s:2:"r";s:3:"켽";s:2:"s";s:3:"켾";s:2:"t";s:3:"켿";s:2:"u";s:3:"콀";s:2:"v";s:3:"콁";s:2:"w";s:3:"콂";s:2:"x";s:3:"콃";s:2:"y";s:3:"콄";s:2:"z";s:3:"콅";s:2:"";s:3:"콆";s:2:"";s:3:"콇";s:2:"";s:3:"콈";s:2:"";s:3:"콉";s:2:"";s:3:"콊";s:2:"";s:3:"콋";s:2:"";s:3:"콌";s:2:"";s:3:"콍";s:2:"";s:3:"콎";s:2:"";s:3:"콏";s:2:"";s:3:"콐";s:2:"";s:3:"콑";s:2:"";s:3:"콒";s:2:"";s:3:"콓";s:2:"";s:3:"코";s:2:"";s:3:"콕";s:2:"";s:3:"콖";s:2:"";s:3:"콗";s:2:"";s:3:"콘";s:2:"";s:3:"콙";s:2:"";s:3:"콚";s:2:"";s:3:"콛";s:2:"";s:3:"콜";s:2:"";s:3:"콝";s:2:"";s:3:"콞";s:2:"";s:3:"콟";s:2:"";s:3:"콠";s:2:"";s:3:"콡";s:2:"";s:3:"콢";s:2:"";s:3:"콣";s:2:"";s:3:"콤";s:2:"";s:3:"콥";s:2:"";s:3:"콦";s:2:"";s:3:"콧";s:2:"";s:3:"콨";s:2:"";s:3:"콩";s:2:"";s:3:"콪";s:2:"";s:3:"콫";s:2:"";s:3:"콬";s:2:"";s:3:"콭";s:2:"A";s:3:"콮";s:2:"B";s:3:"콯";s:2:"C";s:3:"콰";s:2:"";s:3:"콱";s:2:"";s:3:"콲";s:2:"D";s:3:"콳";s:2:"E";s:3:"콴";s:2:"";s:3:"콵";s:2:"F";s:3:"콶";s:2:"G";s:3:"콷";s:2:"H";s:3:"콸";s:2:"";s:3:"콹";s:2:"I";s:3:"콺";s:2:"J";s:3:"콻";s:2:"K";s:3:"콼";s:2:"L";s:3:"콽";s:2:"M";s:3:"콾";s:2:"N";s:3:"콿";s:2:"O";s:3:"쾀";s:2:"";s:3:"쾁";s:2:"P";s:3:"쾂";s:2:"Q";s:3:"쾃";s:2:"R";s:3:"쾄";s:2:"S";s:3:"쾅";s:2:"";s:3:"쾆";s:2:"T";s:3:"쾇";s:2:"U";s:3:"쾈";s:2:"V";s:3:"쾉";s:2:"W";s:3:"쾊";s:2:"X";s:3:"쾋";s:2:"Y";s:3:"쾌";s:2:"";s:3:"쾍";s:2:"Z";s:3:"쾎";s:2:"a";s:3:"쾏";s:2:"b";s:3:"쾐";s:2:"c";s:3:"쾑";s:2:"d";s:3:"쾒";s:2:"e";s:3:"쾓";s:2:"f";s:3:"쾔";s:2:"g";s:3:"쾕";s:2:"h";s:3:"쾖";s:2:"i";s:3:"쾗";s:2:"j";s:3:"쾘";s:2:"k";s:3:"쾙";s:2:"l";s:3:"쾚";s:2:"m";s:3:"쾛";s:2:"n";s:3:"쾜";s:2:"o";s:3:"쾝";s:2:"p";s:3:"쾞";s:2:"q";s:3:"쾟";s:2:"r";s:3:"쾠";s:2:"s";s:3:"쾡";s:2:"";s:3:"쾢";s:2:"t";s:3:"쾣";s:2:"u";s:3:"쾤";s:2:"v";s:3:"쾥";s:2:"w";s:3:"쾦";s:2:"x";s:3:"쾧";s:2:"y";s:3:"쾨";s:2:"";s:3:"쾩";s:2:"z";s:3:"쾪";s:2:"";s:3:"쾫";s:2:"";s:3:"쾬";s:2:"";s:3:"쾭";s:2:"";s:3:"쾮";s:2:"";s:3:"쾯";s:2:"";s:3:"쾰";s:2:"";s:3:"쾱";s:2:"";s:3:"쾲";s:2:"";s:3:"쾳";s:2:"";s:3:"쾴";s:2:"";s:3:"쾵";s:2:"";s:3:"쾶";s:2:"";s:3:"쾷";s:2:"";s:3:"쾸";s:2:"";s:3:"쾹";s:2:"";s:3:"쾺";s:2:"";s:3:"쾻";s:2:"";s:3:"쾼";s:2:"";s:3:"쾽";s:2:"";s:3:"쾾";s:2:"";s:3:"쾿";s:2:"";s:3:"쿀";s:2:"";s:3:"쿁";s:2:"";s:3:"쿂";s:2:"";s:3:"쿃";s:2:"";s:3:"쿄";s:2:"";s:3:"쿅";s:2:"";s:3:"쿆";s:2:"";s:3:"쿇";s:2:"";s:3:"쿈";s:2:"";s:3:"쿉";s:2:"";s:3:"쿊";s:2:"";s:3:"쿋";s:2:"";s:3:"쿌";s:2:"A";s:3:"쿍";s:2:"B";s:3:"쿎";s:2:"C";s:3:"쿏";s:2:"D";s:3:"쿐";s:2:"E";s:3:"쿑";s:2:"F";s:3:"쿒";s:2:"G";s:3:"쿓";s:2:"H";s:3:"쿔";s:2:"I";s:3:"쿕";s:2:"J";s:3:"쿖";s:2:"K";s:3:"쿗";s:2:"L";s:3:"쿘";s:2:"M";s:3:"쿙";s:2:"N";s:3:"쿚";s:2:"O";s:3:"쿛";s:2:"P";s:3:"쿜";s:2:"Q";s:3:"쿝";s:2:"R";s:3:"쿞";s:2:"S";s:3:"쿟";s:2:"T";s:3:"쿠";s:2:"";s:3:"쿡";s:2:"";s:3:"쿢";s:2:"U";s:3:"쿣";s:2:"V";s:3:"쿤";s:2:"";s:3:"쿥";s:2:"W";s:3:"쿦";s:2:"X";s:3:"쿧";s:2:"Y";s:3:"쿨";s:2:"";s:3:"쿩";s:2:"Z";s:3:"쿪";s:2:"a";s:3:"쿫";s:2:"b";s:3:"쿬";s:2:"c";s:3:"쿭";s:2:"d";s:3:"쿮";s:2:"e";s:3:"쿯";s:2:"f";s:3:"쿰";s:2:"";s:3:"쿱";s:2:"";s:3:"쿲";s:2:"g";s:3:"쿳";s:2:"";s:3:"쿴";s:2:"h";s:3:"쿵";s:2:"";s:3:"쿶";s:2:"i";s:3:"쿷";s:2:"j";s:3:"쿸";s:2:"k";s:3:"쿹";s:2:"l";s:3:"쿺";s:2:"m";s:3:"쿻";s:2:"n";s:3:"쿼";s:2:"";s:3:"쿽";s:2:"o";s:3:"쿾";s:2:"p";s:3:"쿿";s:2:"q";s:3:"퀀";s:2:"";s:3:"퀁";s:2:"r";s:3:"퀂";s:2:"s";s:3:"퀃";s:2:"t";s:3:"퀄";s:2:"";s:3:"퀅";s:2:"u";s:3:"퀆";s:2:"v";s:3:"퀇";s:2:"w";s:3:"퀈";s:2:"x";s:3:"퀉";s:2:"y";s:3:"퀊";s:2:"z";s:3:"퀋";s:2:"";s:3:"퀌";s:2:"";s:3:"퀍";s:2:"";s:3:"퀎";s:2:"";s:3:"퀏";s:2:"";s:3:"퀐";s:2:"";s:3:"퀑";s:2:"";s:3:"퀒";s:2:"";s:3:"퀓";s:2:"";s:3:"퀔";s:2:"";s:3:"퀕";s:2:"";s:3:"퀖";s:2:"";s:3:"퀗";s:2:"";s:3:"퀘";s:2:"";s:3:"퀙";s:2:"";s:3:"퀚";s:2:"";s:3:"퀛";s:2:"";s:3:"퀜";s:2:"";s:3:"퀝";s:2:"";s:3:"퀞";s:2:"";s:3:"퀟";s:2:"";s:3:"퀠";s:2:"";s:3:"퀡";s:2:"";s:3:"퀢";s:2:"";s:3:"퀣";s:2:"";s:3:"퀤";s:2:"";s:3:"퀥";s:2:"";s:3:"퀦";s:2:"";s:3:"퀧";s:2:"";s:3:"퀨";s:2:"";s:3:"퀩";s:2:"";s:3:"퀪";s:2:"";s:3:"퀫";s:2:"";s:3:"퀬";s:2:"";s:3:"퀭";s:2:"";s:3:"퀮";s:2:"A";s:3:"퀯";s:2:"B";s:3:"퀰";s:2:"C";s:3:"퀱";s:2:"D";s:3:"퀲";s:2:"E";s:3:"퀳";s:2:"F";s:3:"퀴";s:2:"";s:3:"퀵";s:2:"";s:3:"퀶";s:2:"G";s:3:"퀷";s:2:"H";s:3:"퀸";s:2:"";s:3:"퀹";s:2:"I";s:3:"퀺";s:2:"J";s:3:"퀻";s:2:"K";s:3:"퀼";s:2:"";s:3:"퀽";s:2:"L";s:3:"퀾";s:2:"M";s:3:"퀿";s:2:"N";s:3:"큀";s:2:"O";s:3:"큁";s:2:"P";s:3:"큂";s:2:"Q";s:3:"큃";s:2:"R";s:3:"큄";s:2:"š";s:3:"큅";s:2:"Ţ";s:3:"큆";s:2:"S";s:3:"큇";s:2:"ţ";s:3:"큈";s:2:"T";s:3:"큉";s:2:"Ť";s:3:"큊";s:2:"U";s:3:"큋";s:2:"V";s:3:"큌";s:2:"W";s:3:"큍";s:2:"X";s:3:"큎";s:2:"Y";s:3:"큏";s:2:"Z";s:3:"큐";s:2:"ť";s:3:"큑";s:2:"a";s:3:"큒";s:2:"b";s:3:"큓";s:2:"c";s:3:"큔";s:2:"Ŧ";s:3:"큕";s:2:"d";s:3:"큖";s:2:"e";s:3:"큗";s:2:"f";s:3:"큘";s:2:"ŧ";s:3:"큙";s:2:"g";s:3:"큚";s:2:"h";s:3:"큛";s:2:"i";s:3:"큜";s:2:"j";s:3:"큝";s:2:"k";s:3:"큞";s:2:"l";s:3:"큟";s:2:"m";s:3:"큠";s:2:"Ũ";s:3:"큡";s:2:"n";s:3:"큢";s:2:"o";s:3:"큣";s:2:"p";s:3:"큤";s:2:"q";s:3:"큥";s:2:"r";s:3:"큦";s:2:"s";s:3:"큧";s:2:"t";s:3:"큨";s:2:"u";s:3:"큩";s:2:"v";s:3:"큪";s:2:"w";s:3:"큫";s:2:"x";s:3:"크";s:2:"ũ";s:3:"큭";s:2:"Ū";s:3:"큮";s:2:"y";s:3:"큯";s:2:"z";s:3:"큰";s:2:"ū";s:3:"큱";s:2:"";s:3:"큲";s:2:"";s:3:"큳";s:2:"";s:3:"클";s:2:"Ŭ";s:3:"큵";s:2:"";s:3:"큶";s:2:"";s:3:"큷";s:2:"";s:3:"큸";s:2:"";s:3:"큹";s:2:"";s:3:"큺";s:2:"";s:3:"큻";s:2:"";s:3:"큼";s:2:"ŭ";s:3:"큽";s:2:"Ů";s:3:"큾";s:2:"";s:3:"큿";s:2:"";s:3:"킀";s:2:"";s:3:"킁";s:2:"ů";s:3:"킂";s:2:"";s:3:"킃";s:2:"";s:3:"킄";s:2:"";s:3:"킅";s:2:"";s:3:"킆";s:2:"";s:3:"킇";s:2:"";s:3:"킈";s:2:"";s:3:"킉";s:2:"";s:3:"킊";s:2:"";s:3:"킋";s:2:"";s:3:"킌";s:2:"";s:3:"킍";s:2:"";s:3:"킎";s:2:"";s:3:"킏";s:2:"";s:3:"킐";s:2:"";s:3:"킑";s:2:"";s:3:"킒";s:2:"";s:3:"킓";s:2:"";s:3:"킔";s:2:"";s:3:"킕";s:2:"A";s:3:"킖";s:2:"B";s:3:"킗";s:2:"C";s:3:"킘";s:2:"D";s:3:"킙";s:2:"E";s:3:"킚";s:2:"F";s:3:"킛";s:2:"G";s:3:"킜";s:2:"H";s:3:"킝";s:2:"I";s:3:"킞";s:2:"J";s:3:"킟";s:2:"K";s:3:"킠";s:2:"L";s:3:"킡";s:2:"M";s:3:"킢";s:2:"N";s:3:"킣";s:2:"O";s:3:"키";s:2:"Ű";s:3:"킥";s:2:"ű";s:3:"킦";s:2:"P";s:3:"킧";s:2:"Q";s:3:"킨";s:2:"Ų";s:3:"킩";s:2:"R";s:3:"킪";s:2:"S";s:3:"킫";s:2:"T";s:3:"킬";s:2:"ų";s:3:"킭";s:2:"U";s:3:"킮";s:2:"V";s:3:"킯";s:2:"W";s:3:"킰";s:2:"X";s:3:"킱";s:2:"Y";s:3:"킲";s:2:"Z";s:3:"킳";s:2:"a";s:3:"킴";s:2:"Ŵ";s:3:"킵";s:2:"ŵ";s:3:"킶";s:2:"b";s:3:"킷";s:2:"Ŷ";s:3:"킸";s:2:"c";s:3:"킹";s:2:"ŷ";s:3:"킺";s:2:"d";s:3:"킻";s:2:"e";s:3:"킼";s:2:"f";s:3:"킽";s:2:"g";s:3:"킾";s:2:"h";s:3:"킿";s:2:"i";s:3:"타";s:2:"Ÿ";s:3:"탁";s:2:"Ź";s:3:"탂";s:2:"j";s:3:"탃";s:2:"k";s:3:"탄";s:2:"ź";s:3:"탅";s:2:"l";s:3:"탆";s:2:"m";s:3:"탇";s:2:"n";s:3:"탈";s:2:"Ż";s:3:"탉";s:2:"ż";s:3:"탊";s:2:"o";s:3:"탋";s:2:"p";s:3:"탌";s:2:"q";s:3:"탍";s:2:"r";s:3:"탎";s:2:"s";s:3:"탏";s:2:"t";s:3:"탐";s:2:"Ž";s:3:"탑";s:2:"ž";s:3:"탒";s:2:"u";s:3:"탓";s:2:"ſ";s:3:"탔";s:2:"";s:3:"탕";s:2:"";s:3:"탖";s:2:"v";s:3:"탗";s:2:"w";s:3:"탘";s:2:"x";s:3:"탙";s:2:"y";s:3:"탚";s:2:"z";s:3:"탛";s:2:"";s:3:"태";s:2:"";s:3:"택";s:2:"";s:3:"탞";s:2:"";s:3:"탟";s:2:"";s:3:"탠";s:2:"";s:3:"탡";s:2:"";s:3:"탢";s:2:"";s:3:"탣";s:2:"";s:3:"탤";s:2:"";s:3:"탥";s:2:"";s:3:"탦";s:2:"";s:3:"탧";s:2:"";s:3:"탨";s:2:"";s:3:"탩";s:2:"";s:3:"탪";s:2:"";s:3:"탫";s:2:"";s:3:"탬";s:2:"";s:3:"탭";s:2:"";s:3:"탮";s:2:"";s:3:"탯";s:2:"";s:3:"탰";s:2:"";s:3:"탱";s:2:"";s:3:"탲";s:2:"";s:3:"탳";s:2:"";s:3:"탴";s:2:"";s:3:"탵";s:2:"";s:3:"탶";s:2:"";s:3:"탷";s:2:"";s:3:"탸";s:2:"";s:3:"탹";s:2:"";s:3:"탺";s:2:"";s:3:"탻";s:2:"";s:3:"탼";s:2:"";s:3:"탽";s:2:"";s:3:"탾";s:2:"";s:3:"탿";s:2:"";s:3:"턀";s:2:"";s:3:"턁";s:2:"";s:3:"턂";s:2:"";s:3:"턃";s:2:"";s:3:"턄";s:2:"";s:3:"턅";s:2:"A";s:3:"턆";s:2:"B";s:3:"턇";s:2:"C";s:3:"턈";s:2:"D";s:3:"턉";s:2:"E";s:3:"턊";s:2:"F";s:3:"턋";s:2:"G";s:3:"턌";s:2:"H";s:3:"턍";s:2:"";s:3:"턎";s:2:"I";s:3:"턏";s:2:"J";s:3:"턐";s:2:"K";s:3:"턑";s:2:"L";s:3:"턒";s:2:"M";s:3:"턓";s:2:"N";s:3:"턔";s:2:"O";s:3:"턕";s:2:"P";s:3:"턖";s:2:"Q";s:3:"턗";s:2:"R";s:3:"턘";s:2:"S";s:3:"턙";s:2:"T";s:3:"턚";s:2:"U";s:3:"턛";s:2:"V";s:3:"턜";s:2:"W";s:3:"턝";s:2:"X";s:3:"턞";s:2:"Y";s:3:"턟";s:2:"Z";s:3:"턠";s:2:"a";s:3:"턡";s:2:"b";s:3:"턢";s:2:"c";s:3:"턣";s:2:"d";s:3:"턤";s:2:"e";s:3:"턥";s:2:"f";s:3:"턦";s:2:"g";s:3:"턧";s:2:"h";s:3:"턨";s:2:"i";s:3:"턩";s:2:"j";s:3:"턪";s:2:"k";s:3:"턫";s:2:"l";s:3:"턬";s:2:"m";s:3:"턭";s:2:"n";s:3:"턮";s:2:"o";s:3:"턯";s:2:"p";s:3:"터";s:2:"";s:3:"턱";s:2:"";s:3:"턲";s:2:"q";s:3:"턳";s:2:"r";s:3:"턴";s:2:"";s:3:"턵";s:2:"s";s:3:"턶";s:2:"t";s:3:"턷";s:2:"u";s:3:"털";s:2:"";s:3:"턹";s:2:"v";s:3:"턺";s:2:"";s:3:"턻";s:2:"w";s:3:"턼";s:2:"x";s:3:"턽";s:2:"y";s:3:"턾";s:2:"z";s:3:"턿";s:2:"";s:3:"텀";s:2:"";s:3:"텁";s:2:"";s:3:"텂";s:2:"";s:3:"텃";s:2:"";s:3:"텄";s:2:"";s:3:"텅";s:2:"";s:3:"텆";s:2:"";s:3:"텇";s:2:"";s:3:"텈";s:2:"";s:3:"텉";s:2:"";s:3:"텊";s:2:"";s:3:"텋";s:2:"";s:3:"테";s:2:"";s:3:"텍";s:2:"";s:3:"텎";s:2:"";s:3:"텏";s:2:"";s:3:"텐";s:2:"";s:3:"텑";s:2:"";s:3:"텒";s:2:"";s:3:"텓";s:2:"";s:3:"텔";s:2:"";s:3:"텕";s:2:"";s:3:"텖";s:2:"";s:3:"텗";s:2:"";s:3:"텘";s:2:"";s:3:"텙";s:2:"";s:3:"텚";s:2:"";s:3:"텛";s:2:"";s:3:"템";s:2:"";s:3:"텝";s:2:"";s:3:"텞";s:2:"";s:3:"텟";s:2:"";s:3:"텠";s:2:"";s:3:"텡";s:2:"";s:3:"텢";s:2:"";s:3:"텣";s:2:"";s:3:"텤";s:2:"";s:3:"텥";s:2:"";s:3:"텦";s:2:"";s:3:"텧";s:2:"";s:3:"텨";s:2:"";s:3:"텩";s:2:"";s:3:"텪";s:2:"";s:3:"텫";s:2:"";s:3:"텬";s:2:"";s:3:"텭";s:2:"";s:3:"텮";s:2:"A";s:3:"텯";s:2:"B";s:3:"텰";s:2:"C";s:3:"텱";s:2:"D";s:3:"텲";s:2:"E";s:3:"텳";s:2:"F";s:3:"텴";s:2:"G";s:3:"텵";s:2:"H";s:3:"텶";s:2:"I";s:3:"텷";s:2:"J";s:3:"텸";s:2:"K";s:3:"텹";s:2:"L";s:3:"텺";s:2:"M";s:3:"텻";s:2:"N";s:3:"텼";s:2:"";s:3:"텽";s:2:"O";s:3:"텾";s:2:"P";s:3:"텿";s:2:"Q";s:3:"톀";s:2:"R";s:3:"톁";s:2:"S";s:3:"톂";s:2:"T";s:3:"톃";s:2:"U";s:3:"톄";s:2:"";s:3:"톅";s:2:"V";s:3:"톆";s:2:"W";s:3:"톇";s:2:"X";s:3:"톈";s:2:"";s:3:"톉";s:2:"Y";s:3:"톊";s:2:"Z";s:3:"톋";s:2:"a";s:3:"톌";s:2:"b";s:3:"톍";s:2:"c";s:3:"톎";s:2:"d";s:3:"톏";s:2:"e";s:3:"톐";s:2:"f";s:3:"톑";s:2:"g";s:3:"톒";s:2:"h";s:3:"톓";s:2:"i";s:3:"톔";s:2:"j";s:3:"톕";s:2:"k";s:3:"톖";s:2:"l";s:3:"톗";s:2:"m";s:3:"톘";s:2:"n";s:3:"톙";s:2:"o";s:3:"톚";s:2:"p";s:3:"톛";s:2:"q";s:3:"톜";s:2:"r";s:3:"톝";s:2:"s";s:3:"톞";s:2:"t";s:3:"톟";s:2:"u";s:3:"토";s:2:"";s:3:"톡";s:2:"";s:3:"톢";s:2:"v";s:3:"톣";s:2:"w";s:3:"톤";s:2:"";s:3:"톥";s:2:"x";s:3:"톦";s:2:"y";s:3:"톧";s:2:"z";s:3:"톨";s:2:"";s:3:"톩";s:2:"";s:3:"톪";s:2:"";s:3:"톫";s:2:"";s:3:"톬";s:2:"";s:3:"톭";s:2:"";s:3:"톮";s:2:"";s:3:"톯";s:2:"";s:3:"톰";s:2:"";s:3:"톱";s:2:"";s:3:"톲";s:2:"";s:3:"톳";s:2:"";s:3:"톴";s:2:"";s:3:"통";s:2:"";s:3:"톶";s:2:"";s:3:"톷";s:2:"";s:3:"톸";s:2:"";s:3:"톹";s:2:"";s:3:"톺";s:2:"";s:3:"톻";s:2:"";s:3:"톼";s:2:"";s:3:"톽";s:2:"";s:3:"톾";s:2:"";s:3:"톿";s:2:"";s:3:"퇀";s:2:"";s:3:"퇁";s:2:"";s:3:"퇂";s:2:"";s:3:"퇃";s:2:"";s:3:"퇄";s:2:"";s:3:"퇅";s:2:"";s:3:"퇆";s:2:"";s:3:"퇇";s:2:"";s:3:"퇈";s:2:"";s:3:"퇉";s:2:"";s:3:"퇊";s:2:"";s:3:"퇋";s:2:"";s:3:"퇌";s:2:"";s:3:"퇍";s:2:"";s:3:"퇎";s:2:"";s:3:"퇏";s:2:"";s:3:"퇐";s:2:"A";s:3:"퇑";s:2:"B";s:3:"퇒";s:2:"C";s:3:"퇓";s:2:"D";s:3:"퇔";s:2:"E";s:3:"퇕";s:2:"F";s:3:"퇖";s:2:"G";s:3:"퇗";s:2:"H";s:3:"퇘";s:2:"";s:3:"퇙";s:2:"I";s:3:"퇚";s:2:"J";s:3:"퇛";s:2:"K";s:3:"퇜";s:2:"L";s:3:"퇝";s:2:"M";s:3:"퇞";s:2:"N";s:3:"퇟";s:2:"O";s:3:"퇠";s:2:"P";s:3:"퇡";s:2:"Q";s:3:"퇢";s:2:"R";s:3:"퇣";s:2:"S";s:3:"퇤";s:2:"T";s:3:"퇥";s:2:"U";s:3:"퇦";s:2:"V";s:3:"퇧";s:2:"W";s:3:"퇨";s:2:"X";s:3:"퇩";s:2:"Y";s:3:"퇪";s:2:"Z";s:3:"퇫";s:2:"a";s:3:"퇬";s:2:"b";s:3:"퇭";s:2:"c";s:3:"퇮";s:2:"d";s:3:"퇯";s:2:"e";s:3:"퇰";s:2:"f";s:3:"퇱";s:2:"g";s:3:"퇲";s:2:"h";s:3:"퇳";s:2:"i";s:3:"퇴";s:2:"";s:3:"퇵";s:2:"j";s:3:"퇶";s:2:"k";s:3:"퇷";s:2:"l";s:3:"퇸";s:2:"";s:3:"퇹";s:2:"m";s:3:"퇺";s:2:"n";s:3:"퇻";s:2:"o";s:3:"퇼";s:2:"p";s:3:"퇽";s:2:"q";s:3:"퇾";s:2:"r";s:3:"퇿";s:2:"s";s:3:"툀";s:2:"t";s:3:"툁";s:2:"u";s:3:"툂";s:2:"v";s:3:"툃";s:2:"w";s:3:"툄";s:2:"x";s:3:"툅";s:2:"y";s:3:"툆";s:2:"z";s:3:"툇";s:2:"";s:3:"툈";s:2:"";s:3:"툉";s:2:"";s:3:"툊";s:2:"";s:3:"툋";s:2:"";s:3:"툌";s:2:"";s:3:"툍";s:2:"";s:3:"툎";s:2:"";s:3:"툏";s:2:"";s:3:"툐";s:2:"";s:3:"툑";s:2:"";s:3:"툒";s:2:"";s:3:"툓";s:2:"";s:3:"툔";s:2:"";s:3:"툕";s:2:"";s:3:"툖";s:2:"";s:3:"툗";s:2:"";s:3:"툘";s:2:"";s:3:"툙";s:2:"";s:3:"툚";s:2:"";s:3:"툛";s:2:"";s:3:"툜";s:2:"";s:3:"툝";s:2:"";s:3:"툞";s:2:"";s:3:"툟";s:2:"";s:3:"툠";s:2:"";s:3:"툡";s:2:"";s:3:"툢";s:2:"";s:3:"툣";s:2:"";s:3:"툤";s:2:"";s:3:"툥";s:2:"";s:3:"툦";s:2:"";s:3:"툧";s:2:"";s:3:"툨";s:2:"";s:3:"툩";s:2:"";s:3:"툪";s:2:"A";s:3:"툫";s:2:"B";s:3:"투";s:2:"";s:3:"툭";s:2:"";s:3:"툮";s:2:"C";s:3:"툯";s:2:"D";s:3:"툰";s:2:"";s:3:"툱";s:2:"E";s:3:"툲";s:2:"F";s:3:"툳";s:2:"G";s:3:"툴";s:2:"";s:3:"툵";s:2:"H";s:3:"툶";s:2:"I";s:3:"툷";s:2:"J";s:3:"툸";s:2:"K";s:3:"툹";s:2:"L";s:3:"툺";s:2:"M";s:3:"툻";s:2:"N";s:3:"툼";s:2:"";s:3:"툽";s:2:"";s:3:"툾";s:2:"O";s:3:"툿";s:2:"";s:3:"퉀";s:2:"P";s:3:"퉁";s:2:"";s:3:"퉂";s:2:"Q";s:3:"퉃";s:2:"R";s:3:"퉄";s:2:"S";s:3:"퉅";s:2:"T";s:3:"퉆";s:2:"U";s:3:"퉇";s:2:"V";s:3:"퉈";s:2:"";s:3:"퉉";s:2:"W";s:3:"퉊";s:2:"X";s:3:"퉋";s:2:"Y";s:3:"퉌";s:2:"Z";s:3:"퉍";s:2:"a";s:3:"퉎";s:2:"b";s:3:"퉏";s:2:"c";s:3:"퉐";s:2:"d";s:3:"퉑";s:2:"e";s:3:"퉒";s:2:"f";s:3:"퉓";s:2:"g";s:3:"퉔";s:2:"h";s:3:"퉕";s:2:"i";s:3:"퉖";s:2:"j";s:3:"퉗";s:2:"k";s:3:"퉘";s:2:"l";s:3:"퉙";s:2:"m";s:3:"퉚";s:2:"n";s:3:"퉛";s:2:"o";s:3:"퉜";s:2:"";s:3:"퉝";s:2:"p";s:3:"퉞";s:2:"q";s:3:"퉟";s:2:"r";s:3:"퉠";s:2:"s";s:3:"퉡";s:2:"t";s:3:"퉢";s:2:"u";s:3:"퉣";s:2:"v";s:3:"퉤";s:2:"ơ";s:3:"퉥";s:2:"w";s:3:"퉦";s:2:"x";s:3:"퉧";s:2:"y";s:3:"퉨";s:2:"z";s:3:"퉩";s:2:"";s:3:"퉪";s:2:"";s:3:"퉫";s:2:"";s:3:"퉬";s:2:"";s:3:"퉭";s:2:"";s:3:"퉮";s:2:"";s:3:"퉯";s:2:"";s:3:"퉰";s:2:"";s:3:"퉱";s:2:"";s:3:"퉲";s:2:"";s:3:"퉳";s:2:"";s:3:"퉴";s:2:"";s:3:"퉵";s:2:"";s:3:"퉶";s:2:"";s:3:"퉷";s:2:"";s:3:"퉸";s:2:"";s:3:"퉹";s:2:"";s:3:"퉺";s:2:"";s:3:"퉻";s:2:"";s:3:"퉼";s:2:"";s:3:"퉽";s:2:"";s:3:"퉾";s:2:"";s:3:"퉿";s:2:"";s:3:"튀";s:2:"Ƣ";s:3:"튁";s:2:"ƣ";s:3:"튂";s:2:"";s:3:"튃";s:2:"";s:3:"튄";s:2:"Ƥ";s:3:"튅";s:2:"";s:3:"튆";s:2:"";s:3:"튇";s:2:"";s:3:"튈";s:2:"ƥ";s:3:"튉";s:2:"";s:3:"튊";s:2:"";s:3:"튋";s:2:"";s:3:"튌";s:2:"";s:3:"튍";s:2:"A";s:3:"튎";s:2:"B";s:3:"튏";s:2:"C";s:3:"튐";s:2:"Ʀ";s:3:"튑";s:2:"Ƨ";s:3:"튒";s:2:"D";s:3:"튓";s:2:"E";s:3:"튔";s:2:"F";s:3:"튕";s:2:"ƨ";s:3:"튖";s:2:"G";s:3:"튗";s:2:"H";s:3:"튘";s:2:"I";s:3:"튙";s:2:"J";s:3:"튚";s:2:"K";s:3:"튛";s:2:"L";s:3:"튜";s:2:"Ʃ";s:3:"튝";s:2:"M";s:3:"튞";s:2:"N";s:3:"튟";s:2:"O";s:3:"튠";s:2:"ƪ";s:3:"튡";s:2:"P";s:3:"튢";s:2:"Q";s:3:"튣";s:2:"R";s:3:"튤";s:2:"ƫ";s:3:"튥";s:2:"S";s:3:"튦";s:2:"T";s:3:"튧";s:2:"U";s:3:"튨";s:2:"V";s:3:"튩";s:2:"W";s:3:"튪";s:2:"X";s:3:"튫";s:2:"Y";s:3:"튬";s:2:"Ƭ";s:3:"튭";s:2:"Z";s:3:"튮";s:2:"a";s:3:"튯";s:2:"b";s:3:"튰";s:2:"c";s:3:"튱";s:2:"ƭ";s:3:"튲";s:2:"d";s:3:"튳";s:2:"e";s:3:"튴";s:2:"f";s:3:"튵";s:2:"g";s:3:"튶";s:2:"h";s:3:"튷";s:2:"i";s:3:"트";s:2:"Ʈ";s:3:"특";s:2:"Ư";s:3:"튺";s:2:"j";s:3:"튻";s:2:"k";s:3:"튼";s:2:"ư";s:3:"튽";s:2:"l";s:3:"튾";s:2:"m";s:3:"튿";s:2:"Ʊ";s:3:"틀";s:2:"Ʋ";s:3:"틁";s:2:"n";s:3:"틂";s:2:"Ƴ";s:3:"틃";s:2:"o";s:3:"틄";s:2:"p";s:3:"틅";s:2:"q";s:3:"틆";s:2:"r";s:3:"틇";s:2:"s";s:3:"틈";s:2:"ƴ";s:3:"틉";s:2:"Ƶ";s:3:"틊";s:2:"t";s:3:"틋";s:2:"ƶ";s:3:"틌";s:2:"u";s:3:"틍";s:2:"v";s:3:"틎";s:2:"w";s:3:"틏";s:2:"x";s:3:"틐";s:2:"y";s:3:"틑";s:2:"z";s:3:"틒";s:2:"";s:3:"틓";s:2:"";s:3:"틔";s:2:"Ʒ";s:3:"틕";s:2:"";s:3:"틖";s:2:"";s:3:"틗";s:2:"";s:3:"틘";s:2:"Ƹ";s:3:"틙";s:2:"";s:3:"틚";s:2:"";s:3:"틛";s:2:"";s:3:"틜";s:2:"ƹ";s:3:"틝";s:2:"";s:3:"틞";s:2:"";s:3:"틟";s:2:"";s:3:"틠";s:2:"";s:3:"틡";s:2:"";s:3:"틢";s:2:"";s:3:"틣";s:2:"";s:3:"틤";s:2:"ƺ";s:3:"틥";s:2:"ƻ";s:3:"틦";s:2:"";s:3:"틧";s:2:"";s:3:"틨";s:2:"";s:3:"틩";s:2:"";s:3:"틪";s:2:"";s:3:"틫";s:2:"";s:3:"틬";s:2:"";s:3:"틭";s:2:"";s:3:"틮";s:2:"";s:3:"틯";s:2:"";s:3:"티";s:2:"Ƽ";s:3:"틱";s:2:"ƽ";s:3:"틲";s:2:"";s:3:"틳";s:2:"";s:3:"틴";s:2:"ƾ";s:3:"틵";s:2:"";s:3:"틶";s:2:"";s:3:"틷";s:2:"";s:3:"틸";s:2:"ƿ";s:3:"틹";s:2:"";s:3:"틺";s:2:"";s:3:"틻";s:2:"A";s:3:"틼";s:2:"B";s:3:"틽";s:2:"C";s:3:"틾";s:2:"D";s:3:"틿";s:2:"E";s:3:"팀";s:2:"";s:3:"팁";s:2:"";s:3:"팂";s:2:"F";s:3:"팃";s:2:"";s:3:"팄";s:2:"G";s:3:"팅";s:2:"";s:3:"팆";s:2:"H";s:3:"팇";s:2:"I";s:3:"팈";s:2:"J";s:3:"팉";s:2:"K";s:3:"팊";s:2:"L";s:3:"팋";s:2:"M";s:3:"파";s:2:"";s:3:"팍";s:2:"";s:3:"팎";s:2:"";s:3:"팏";s:2:"N";s:3:"판";s:2:"";s:3:"팑";s:2:"O";s:3:"팒";s:2:"P";s:3:"팓";s:2:"Q";s:3:"팔";s:2:"";s:3:"팕";s:2:"R";s:3:"팖";s:2:"";s:3:"팗";s:2:"S";s:3:"팘";s:2:"T";s:3:"팙";s:2:"U";s:3:"팚";s:2:"V";s:3:"팛";s:2:"W";s:3:"팜";s:2:"";s:3:"팝";s:2:"";s:3:"팞";s:2:"X";s:3:"팟";s:2:"";s:3:"팠";s:2:"";s:3:"팡";s:2:"";s:3:"팢";s:2:"Y";s:3:"팣";s:2:"Z";s:3:"팤";s:2:"a";s:3:"팥";s:2:"";s:3:"팦";s:2:"b";s:3:"팧";s:2:"c";s:3:"패";s:2:"";s:3:"팩";s:2:"";s:3:"팪";s:2:"d";s:3:"팫";s:2:"e";s:3:"팬";s:2:"";s:3:"팭";s:2:"f";s:3:"팮";s:2:"g";s:3:"팯";s:2:"h";s:3:"팰";s:2:"";s:3:"팱";s:2:"i";s:3:"팲";s:2:"j";s:3:"팳";s:2:"k";s:3:"팴";s:2:"l";s:3:"팵";s:2:"m";s:3:"팶";s:2:"n";s:3:"팷";s:2:"o";s:3:"팸";s:2:"";s:3:"팹";s:2:"";s:3:"팺";s:2:"p";s:3:"팻";s:2:"";s:3:"팼";s:2:"";s:3:"팽";s:2:"";s:3:"팾";s:2:"q";s:3:"팿";s:2:"r";s:3:"퍀";s:2:"s";s:3:"퍁";s:2:"t";s:3:"퍂";s:2:"u";s:3:"퍃";s:2:"v";s:3:"퍄";s:2:"";s:3:"퍅";s:2:"";s:3:"퍆";s:2:"w";s:3:"퍇";s:2:"x";s:3:"퍈";s:2:"y";s:3:"퍉";s:2:"z";s:3:"퍊";s:2:"";s:3:"퍋";s:2:"";s:3:"퍌";s:2:"";s:3:"퍍";s:2:"";s:3:"퍎";s:2:"";s:3:"퍏";s:2:"";s:3:"퍐";s:2:"";s:3:"퍑";s:2:"";s:3:"퍒";s:2:"";s:3:"퍓";s:2:"";s:3:"퍔";s:2:"";s:3:"퍕";s:2:"";s:3:"퍖";s:2:"";s:3:"퍗";s:2:"";s:3:"퍘";s:2:"";s:3:"퍙";s:2:"";s:3:"퍚";s:2:"";s:3:"퍛";s:2:"";s:3:"퍜";s:2:"";s:3:"퍝";s:2:"";s:3:"퍞";s:2:"";s:3:"퍟";s:2:"";s:3:"퍠";s:2:"";s:3:"퍡";s:2:"";s:3:"퍢";s:2:"";s:3:"퍣";s:2:"";s:3:"퍤";s:2:"";s:3:"퍥";s:2:"";s:3:"퍦";s:2:"";s:3:"퍧";s:2:"";s:3:"퍨";s:2:"";s:3:"퍩";s:2:"";s:3:"퍪";s:2:"A";s:3:"퍫";s:2:"B";s:3:"퍬";s:2:"C";s:3:"퍭";s:2:"D";s:3:"퍮";s:2:"E";s:3:"퍯";s:2:"F";s:3:"퍰";s:2:"G";s:3:"퍱";s:2:"H";s:3:"퍲";s:2:"I";s:3:"퍳";s:2:"J";s:3:"퍴";s:2:"K";s:3:"퍵";s:2:"L";s:3:"퍶";s:2:"M";s:3:"퍷";s:2:"N";s:3:"퍸";s:2:"O";s:3:"퍹";s:2:"P";s:3:"퍺";s:2:"Q";s:3:"퍻";s:2:"R";s:3:"퍼";s:2:"";s:3:"퍽";s:2:"";s:3:"퍾";s:2:"S";s:3:"퍿";s:2:"T";s:3:"펀";s:2:"";s:3:"펁";s:2:"U";s:3:"펂";s:2:"V";s:3:"펃";s:2:"W";s:3:"펄";s:2:"";s:3:"펅";s:2:"X";s:3:"펆";s:2:"Y";s:3:"펇";s:2:"Z";s:3:"펈";s:2:"a";s:3:"펉";s:2:"b";s:3:"펊";s:2:"c";s:3:"펋";s:2:"d";s:3:"펌";s:2:"";s:3:"펍";s:2:"";s:3:"펎";s:2:"e";s:3:"펏";s:2:"";s:3:"펐";s:2:"";s:3:"펑";s:2:"";s:3:"펒";s:2:"f";s:3:"펓";s:2:"g";s:3:"펔";s:2:"h";s:3:"펕";s:2:"i";s:3:"펖";s:2:"j";s:3:"펗";s:2:"k";s:3:"페";s:2:"";s:3:"펙";s:2:"";s:3:"펚";s:2:"l";s:3:"펛";s:2:"m";s:3:"펜";s:2:"";s:3:"펝";s:2:"n";s:3:"펞";s:2:"o";s:3:"펟";s:2:"p";s:3:"펠";s:2:"";s:3:"펡";s:2:"q";s:3:"펢";s:2:"r";s:3:"펣";s:2:"s";s:3:"펤";s:2:"t";s:3:"펥";s:2:"u";s:3:"펦";s:2:"v";s:3:"펧";s:2:"w";s:3:"펨";s:2:"";s:3:"펩";s:2:"";s:3:"펪";s:2:"x";s:3:"펫";s:2:"";s:3:"펬";s:2:"y";s:3:"펭";s:2:"";s:3:"펮";s:2:"z";s:3:"펯";s:2:"";s:3:"펰";s:2:"";s:3:"펱";s:2:"";s:3:"펲";s:2:"";s:3:"펳";s:2:"";s:3:"펴";s:2:"";s:3:"펵";s:2:"";s:3:"펶";s:2:"";s:3:"펷";s:2:"";s:3:"편";s:2:"";s:3:"펹";s:2:"";s:3:"펺";s:2:"";s:3:"펻";s:2:"";s:3:"펼";s:2:"";s:3:"펽";s:2:"";s:3:"펾";s:2:"";s:3:"펿";s:2:"";s:3:"폀";s:2:"";s:3:"폁";s:2:"";s:3:"폂";s:2:"";s:3:"폃";s:2:"";s:3:"폄";s:2:"";s:3:"폅";s:2:"";s:3:"폆";s:2:"";s:3:"폇";s:2:"";s:3:"폈";s:2:"";s:3:"평";s:2:"";s:3:"폊";s:2:"";s:3:"폋";s:2:"";s:3:"폌";s:2:"";s:3:"폍";s:2:"";s:3:"폎";s:2:"";s:3:"폏";s:2:"";s:3:"폐";s:2:"";s:3:"폑";s:2:"";s:3:"폒";s:2:"";s:3:"폓";s:2:"";s:3:"폔";s:2:"";s:3:"폕";s:2:"";s:3:"폖";s:2:"";s:3:"폗";s:2:"A";s:3:"폘";s:2:"";s:3:"폙";s:2:"B";s:3:"폚";s:2:"C";s:3:"폛";s:2:"D";s:3:"폜";s:2:"E";s:3:"폝";s:2:"F";s:3:"폞";s:2:"G";s:3:"폟";s:2:"H";s:3:"폠";s:2:"I";s:3:"폡";s:2:"";s:3:"폢";s:2:"J";s:3:"폣";s:2:"";s:3:"폤";s:2:"K";s:3:"폥";s:2:"L";s:3:"폦";s:2:"M";s:3:"폧";s:2:"N";s:3:"폨";s:2:"O";s:3:"폩";s:2:"P";s:3:"폪";s:2:"Q";s:3:"폫";s:2:"R";s:3:"포";s:2:"";s:3:"폭";s:2:"";s:3:"폮";s:2:"S";s:3:"폯";s:2:"T";s:3:"폰";s:2:"";s:3:"폱";s:2:"U";s:3:"폲";s:2:"V";s:3:"폳";s:2:"W";s:3:"폴";s:2:"";s:3:"폵";s:2:"X";s:3:"폶";s:2:"Y";s:3:"폷";s:2:"Z";s:3:"폸";s:2:"a";s:3:"폹";s:2:"b";s:3:"폺";s:2:"c";s:3:"폻";s:2:"d";s:3:"폼";s:2:"";s:3:"폽";s:2:"";s:3:"폾";s:2:"e";s:3:"폿";s:2:"";s:3:"퐀";s:2:"f";s:3:"퐁";s:2:"";s:3:"퐂";s:2:"g";s:3:"퐃";s:2:"h";s:3:"퐄";s:2:"i";s:3:"퐅";s:2:"j";s:3:"퐆";s:2:"k";s:3:"퐇";s:2:"l";s:3:"퐈";s:2:"ǡ";s:3:"퐉";s:2:"m";s:3:"퐊";s:2:"n";s:3:"퐋";s:2:"o";s:3:"퐌";s:2:"p";s:3:"퐍";s:2:"q";s:3:"퐎";s:2:"r";s:3:"퐏";s:2:"s";s:3:"퐐";s:2:"t";s:3:"퐑";s:2:"u";s:3:"퐒";s:2:"v";s:3:"퐓";s:2:"w";s:3:"퐔";s:2:"x";s:3:"퐕";s:2:"y";s:3:"퐖";s:2:"z";s:3:"퐗";s:2:"";s:3:"퐘";s:2:"";s:3:"퐙";s:2:"";s:3:"퐚";s:2:"";s:3:"퐛";s:2:"";s:3:"퐜";s:2:"";s:3:"퐝";s:2:"Ǣ";s:3:"퐞";s:2:"";s:3:"퐟";s:2:"";s:3:"퐠";s:2:"";s:3:"퐡";s:2:"";s:3:"퐢";s:2:"";s:3:"퐣";s:2:"";s:3:"퐤";s:2:"";s:3:"퐥";s:2:"";s:3:"퐦";s:2:"";s:3:"퐧";s:2:"";s:3:"퐨";s:2:"";s:3:"퐩";s:2:"";s:3:"퐪";s:2:"";s:3:"퐫";s:2:"";s:3:"퐬";s:2:"";s:3:"퐭";s:2:"";s:3:"퐮";s:2:"";s:3:"퐯";s:2:"";s:3:"퐰";s:2:"";s:3:"퐱";s:2:"";s:3:"퐲";s:2:"";s:3:"퐳";s:2:"";s:3:"퐴";s:2:"";s:3:"퐵";s:2:"";s:3:"퐶";s:2:"";s:3:"퐷";s:2:"";s:3:"퐸";s:2:"A";s:3:"퐹";s:2:"B";s:3:"퐺";s:2:"C";s:3:"퐻";s:2:"D";s:3:"퐼";s:2:"E";s:3:"퐽";s:2:"F";s:3:"퐾";s:2:"G";s:3:"퐿";s:2:"H";s:3:"푀";s:2:"ǣ";s:3:"푁";s:2:"I";s:3:"푂";s:2:"J";s:3:"푃";s:2:"K";s:3:"푄";s:2:"Ǥ";s:3:"푅";s:2:"L";s:3:"푆";s:2:"M";s:3:"푇";s:2:"N";s:3:"푈";s:2:"O";s:3:"푉";s:2:"P";s:3:"푊";s:2:"Q";s:3:"푋";s:2:"R";s:3:"푌";s:2:"S";s:3:"푍";s:2:"T";s:3:"푎";s:2:"U";s:3:"푏";s:2:"V";s:3:"푐";s:2:"W";s:3:"푑";s:2:"X";s:3:"푒";s:2:"Y";s:3:"푓";s:2:"Z";s:3:"푔";s:2:"a";s:3:"푕";s:2:"b";s:3:"푖";s:2:"c";s:3:"푗";s:2:"d";s:3:"푘";s:2:"e";s:3:"푙";s:2:"f";s:3:"푚";s:2:"g";s:3:"푛";s:2:"h";s:3:"표";s:2:"ǥ";s:3:"푝";s:2:"i";s:3:"푞";s:2:"j";s:3:"푟";s:2:"k";s:3:"푠";s:2:"Ǧ";s:3:"푡";s:2:"l";s:3:"푢";s:2:"m";s:3:"푣";s:2:"n";s:3:"푤";s:2:"ǧ";s:3:"푥";s:2:"o";s:3:"푦";s:2:"p";s:3:"푧";s:2:"q";s:3:"푨";s:2:"r";s:3:"푩";s:2:"s";s:3:"푪";s:2:"t";s:3:"푫";s:2:"u";s:3:"푬";s:2:"v";s:3:"푭";s:2:"Ǩ";s:3:"푮";s:2:"w";s:3:"푯";s:2:"ǩ";s:3:"푰";s:2:"x";s:3:"푱";s:2:"y";s:3:"푲";s:2:"z";s:3:"푳";s:2:"";s:3:"푴";s:2:"";s:3:"푵";s:2:"";s:3:"푶";s:2:"";s:3:"푷";s:2:"";s:3:"푸";s:2:"Ǫ";s:3:"푹";s:2:"ǫ";s:3:"푺";s:2:"";s:3:"푻";s:2:"";s:3:"푼";s:2:"Ǭ";s:3:"푽";s:2:"";s:3:"푾";s:2:"";s:3:"푿";s:2:"ǭ";s:3:"풀";s:2:"Ǯ";s:3:"풁";s:2:"";s:3:"풂";s:2:"ǯ";s:3:"풃";s:2:"";s:3:"풄";s:2:"";s:3:"풅";s:2:"";s:3:"풆";s:2:"";s:3:"풇";s:2:"";s:3:"품";s:2:"ǰ";s:3:"풉";s:2:"Ǳ";s:3:"풊";s:2:"";s:3:"풋";s:2:"ǲ";s:3:"풌";s:2:"";s:3:"풍";s:2:"ǳ";s:3:"풎";s:2:"";s:3:"풏";s:2:"";s:3:"풐";s:2:"";s:3:"풑";s:2:"";s:3:"풒";s:2:"";s:3:"풓";s:2:"";s:3:"풔";s:2:"Ǵ";s:3:"풕";s:2:"";s:3:"풖";s:2:"";s:3:"풗";s:2:"";s:3:"풘";s:2:"";s:3:"풙";s:2:"";s:3:"풚";s:2:"";s:3:"풛";s:2:"";s:3:"풜";s:2:"";s:3:"풝";s:2:"";s:3:"풞";s:2:"A";s:3:"풟";s:2:"B";s:3:"풠";s:2:"C";s:3:"풡";s:2:"D";s:3:"풢";s:2:"E";s:3:"풣";s:2:"F";s:3:"풤";s:2:"G";s:3:"풥";s:2:"H";s:3:"풦";s:2:"I";s:3:"풧";s:2:"J";s:3:"풨";s:2:"K";s:3:"풩";s:2:"ǵ";s:3:"풪";s:2:"L";s:3:"풫";s:2:"M";s:3:"풬";s:2:"N";s:3:"풭";s:2:"O";s:3:"풮";s:2:"P";s:3:"풯";s:2:"Q";s:3:"풰";s:2:"R";s:3:"풱";s:2:"S";s:3:"풲";s:2:"T";s:3:"풳";s:2:"U";s:3:"풴";s:2:"V";s:3:"풵";s:2:"W";s:3:"풶";s:2:"X";s:3:"풷";s:2:"Y";s:3:"풸";s:2:"Z";s:3:"풹";s:2:"a";s:3:"풺";s:2:"b";s:3:"풻";s:2:"c";s:3:"풼";s:2:"d";s:3:"풽";s:2:"e";s:3:"풾";s:2:"f";s:3:"풿";s:2:"g";s:3:"퓀";s:2:"h";s:3:"퓁";s:2:"i";s:3:"퓂";s:2:"j";s:3:"퓃";s:2:"k";s:3:"퓄";s:2:"l";s:3:"퓅";s:2:"m";s:3:"퓆";s:2:"n";s:3:"퓇";s:2:"o";s:3:"퓈";s:2:"p";s:3:"퓉";s:2:"q";s:3:"퓊";s:2:"r";s:3:"퓋";s:2:"s";s:3:"퓌";s:2:"Ƕ";s:3:"퓍";s:2:"t";s:3:"퓎";s:2:"u";s:3:"퓏";s:2:"v";s:3:"퓐";s:2:"Ƿ";s:3:"퓑";s:2:"w";s:3:"퓒";s:2:"x";s:3:"퓓";s:2:"y";s:3:"퓔";s:2:"Ǹ";s:3:"퓕";s:2:"z";s:3:"퓖";s:2:"";s:3:"퓗";s:2:"";s:3:"퓘";s:2:"";s:3:"퓙";s:2:"";s:3:"퓚";s:2:"";s:3:"퓛";s:2:"";s:3:"퓜";s:2:"ǹ";s:3:"퓝";s:2:"";s:3:"퓞";s:2:"";s:3:"퓟";s:2:"Ǻ";s:3:"퓠";s:2:"";s:3:"퓡";s:2:"";s:3:"퓢";s:2:"";s:3:"퓣";s:2:"";s:3:"퓤";s:2:"";s:3:"퓥";s:2:"";s:3:"퓦";s:2:"";s:3:"퓧";s:2:"";s:3:"퓨";s:2:"ǻ";s:3:"퓩";s:2:"";s:3:"퓪";s:2:"";s:3:"퓫";s:2:"";s:3:"퓬";s:2:"Ǽ";s:3:"퓭";s:2:"";s:3:"퓮";s:2:"";s:3:"퓯";s:2:"";s:3:"퓰";s:2:"ǽ";s:3:"퓱";s:2:"";s:3:"퓲";s:2:"";s:3:"퓳";s:2:"";s:3:"퓴";s:2:"";s:3:"퓵";s:2:"";s:3:"퓶";s:2:"";s:3:"퓷";s:2:"";s:3:"퓸";s:2:"Ǿ";s:3:"퓹";s:2:"";s:3:"퓺";s:2:"";s:3:"퓻";s:2:"ǿ";s:3:"퓼";s:2:"";s:3:"퓽";s:2:"";s:3:"퓾";s:2:"A";s:3:"퓿";s:2:"B";s:3:"픀";s:2:"C";s:3:"픁";s:2:"D";s:3:"픂";s:2:"E";s:3:"픃";s:2:"F";s:3:"프";s:2:"";s:3:"픅";s:2:"G";s:3:"픆";s:2:"H";s:3:"픇";s:2:"I";s:3:"픈";s:2:"";s:3:"픉";s:2:"J";s:3:"픊";s:2:"K";s:3:"픋";s:2:"L";s:3:"플";s:2:"";s:3:"픍";s:2:"M";s:3:"픎";s:2:"N";s:3:"픏";s:2:"O";s:3:"픐";s:2:"P";s:3:"픑";s:2:"Q";s:3:"픒";s:2:"R";s:3:"픓";s:2:"S";s:3:"픔";s:2:"";s:3:"픕";s:2:"";s:3:"픖";s:2:"T";s:3:"픗";s:2:"";s:3:"픘";s:2:"U";s:3:"픙";s:2:"V";s:3:"픚";s:2:"W";s:3:"픛";s:2:"X";s:3:"픜";s:2:"Y";s:3:"픝";s:2:"Z";s:3:"픞";s:2:"a";s:3:"픟";s:2:"b";s:3:"픠";s:2:"c";s:3:"픡";s:2:"d";s:3:"픢";s:2:"e";s:3:"픣";s:2:"f";s:3:"픤";s:2:"g";s:3:"픥";s:2:"h";s:3:"픦";s:2:"i";s:3:"픧";s:2:"j";s:3:"픨";s:2:"k";s:3:"픩";s:2:"l";s:3:"픪";s:2:"m";s:3:"픫";s:2:"n";s:3:"픬";s:2:"o";s:3:"픭";s:2:"p";s:3:"픮";s:2:"q";s:3:"픯";s:2:"r";s:3:"픰";s:2:"s";s:3:"픱";s:2:"t";s:3:"픲";s:2:"u";s:3:"픳";s:2:"v";s:3:"픴";s:2:"w";s:3:"픵";s:2:"x";s:3:"픶";s:2:"y";s:3:"픷";s:2:"z";s:3:"픸";s:2:"";s:3:"픹";s:2:"";s:3:"픺";s:2:"";s:3:"픻";s:2:"";s:3:"피";s:2:"";s:3:"픽";s:2:"";s:3:"픾";s:2:"";s:3:"픿";s:2:"";s:3:"핀";s:2:"";s:3:"핁";s:2:"";s:3:"핂";s:2:"";s:3:"핃";s:2:"";s:3:"필";s:2:"";s:3:"핅";s:2:"";s:3:"핆";s:2:"";s:3:"핇";s:2:"";s:3:"핈";s:2:"";s:3:"핉";s:2:"";s:3:"핊";s:2:"";s:3:"핋";s:2:"";s:3:"핌";s:2:"";s:3:"핍";s:2:"";s:3:"핎";s:2:"";s:3:"핏";s:2:"";s:3:"핐";s:2:"";s:3:"핑";s:2:"";s:3:"핒";s:2:"";s:3:"핓";s:2:"";s:3:"핔";s:2:"";s:3:"핕";s:2:"";s:3:"핖";s:2:"";s:3:"핗";s:2:"";s:3:"하";s:2:"";s:3:"학";s:2:"";s:3:"핚";s:2:"";s:3:"핛";s:2:"";s:3:"한";s:2:"";s:3:"핝";s:2:"";s:3:"핞";s:2:"";s:3:"핟";s:2:"";s:3:"할";s:2:"";s:3:"핡";s:2:"";s:3:"핢";s:2:"";s:3:"핣";s:2:"";s:3:"핤";s:2:"A";s:3:"핥";s:2:"";s:3:"핦";s:2:"B";s:3:"핧";s:2:"C";s:3:"함";s:2:"";s:3:"합";s:2:"";s:3:"핪";s:2:"D";s:3:"핫";s:2:"";s:3:"핬";s:2:"E";s:3:"항";s:2:"";s:3:"핮";s:2:"F";s:3:"핯";s:2:"G";s:3:"핰";s:2:"H";s:3:"핱";s:2:"I";s:3:"핲";s:2:"J";s:3:"핳";s:2:"K";s:3:"해";s:2:"";s:3:"핵";s:2:"";s:3:"핶";s:2:"L";s:3:"핷";s:2:"M";s:3:"핸";s:2:"";s:3:"핹";s:2:"N";s:3:"핺";s:2:"O";s:3:"핻";s:2:"P";s:3:"핼";s:2:"";s:3:"핽";s:2:"Q";s:3:"핾";s:2:"R";s:3:"핿";s:2:"S";s:3:"햀";s:2:"T";s:3:"햁";s:2:"U";s:3:"햂";s:2:"V";s:3:"햃";s:2:"W";s:3:"햄";s:2:"";s:3:"햅";s:2:"";s:3:"햆";s:2:"X";s:3:"햇";s:2:"";s:3:"했";s:2:"";s:3:"행";s:2:"";s:3:"햊";s:2:"Y";s:3:"햋";s:2:"Z";s:3:"햌";s:2:"a";s:3:"햍";s:2:"b";s:3:"햎";s:2:"c";s:3:"햏";s:2:"d";s:3:"햐";s:2:"";s:3:"햑";s:2:"e";s:3:"햒";s:2:"f";s:3:"햓";s:2:"g";s:3:"햔";s:2:"h";s:3:"햕";s:2:"i";s:3:"햖";s:2:"j";s:3:"햗";s:2:"k";s:3:"햘";s:2:"l";s:3:"햙";s:2:"m";s:3:"햚";s:2:"n";s:3:"햛";s:2:"o";s:3:"햜";s:2:"p";s:3:"햝";s:2:"q";s:3:"햞";s:2:"r";s:3:"햟";s:2:"s";s:3:"햠";s:2:"t";s:3:"햡";s:2:"u";s:3:"햢";s:2:"v";s:3:"햣";s:2:"w";s:3:"햤";s:2:"x";s:3:"향";s:2:"";s:3:"햦";s:2:"y";s:3:"햧";s:2:"z";s:3:"햨";s:2:"";s:3:"햩";s:2:"";s:3:"햪";s:2:"";s:3:"햫";s:2:"";s:3:"햬";s:2:"";s:3:"햭";s:2:"";s:3:"햮";s:2:"";s:3:"햯";s:2:"";s:3:"햰";s:2:"";s:3:"햱";s:2:"";s:3:"햲";s:2:"";s:3:"햳";s:2:"";s:3:"햴";s:2:"";s:3:"햵";s:2:"";s:3:"햶";s:2:"";s:3:"햷";s:2:"";s:3:"햸";s:2:"";s:3:"햹";s:2:"";s:3:"햺";s:2:"";s:3:"햻";s:2:"";s:3:"햼";s:2:"";s:3:"햽";s:2:"";s:3:"햾";s:2:"";s:3:"햿";s:2:"";s:3:"헀";s:2:"";s:3:"헁";s:2:"";s:3:"헂";s:2:"";s:3:"헃";s:2:"";s:3:"헄";s:2:"";s:3:"헅";s:2:"";s:3:"헆";s:2:"";s:3:"헇";s:2:"";s:3:"허";s:2:"";s:3:"헉";s:2:"";s:3:"헊";s:2:"A";s:3:"헋";s:2:"B";s:3:"헌";s:2:"";s:3:"헍";s:2:"C";s:3:"헎";s:2:"D";s:3:"헏";s:2:"E";s:3:"헐";s:2:"";s:3:"헑";s:2:"F";s:3:"헒";s:2:"";s:3:"헓";s:2:"G";s:3:"헔";s:2:"H";s:3:"헕";s:2:"I";s:3:"헖";s:2:"J";s:3:"헗";s:2:"K";s:3:"험";s:2:"";s:3:"헙";s:2:"";s:3:"헚";s:2:"L";s:3:"헛";s:2:"";s:3:"헜";s:2:"M";s:3:"헝";s:2:"";s:3:"헞";s:2:"N";s:3:"헟";s:2:"O";s:3:"헠";s:2:"P";s:3:"헡";s:2:"Q";s:3:"헢";s:2:"R";s:3:"헣";s:2:"S";s:3:"헤";s:2:"";s:3:"헥";s:2:"";s:3:"헦";s:2:"T";s:3:"헧";s:2:"U";s:3:"헨";s:2:"";s:3:"헩";s:2:"V";s:3:"헪";s:2:"W";s:3:"헫";s:2:"X";s:3:"헬";s:2:"";s:3:"헭";s:2:"Y";s:3:"헮";s:2:"Z";s:3:"헯";s:2:"a";s:3:"헰";s:2:"b";s:3:"헱";s:2:"c";s:3:"헲";s:2:"d";s:3:"헳";s:2:"e";s:3:"헴";s:2:"";s:3:"헵";s:2:"";s:3:"헶";s:2:"f";s:3:"헷";s:2:"";s:3:"헸";s:2:"g";s:3:"헹";s:2:"";s:3:"헺";s:2:"h";s:3:"헻";s:2:"i";s:3:"헼";s:2:"j";s:3:"헽";s:2:"k";s:3:"헾";s:2:"l";s:3:"헿";s:2:"m";s:3:"혀";s:2:"";s:3:"혁";s:2:"";s:3:"혂";s:2:"n";s:3:"혃";s:2:"o";s:3:"현";s:2:"";s:3:"혅";s:2:"p";s:3:"혆";s:2:"q";s:3:"혇";s:2:"r";s:3:"혈";s:2:"";s:3:"혉";s:2:"s";s:3:"혊";s:2:"t";s:3:"혋";s:2:"u";s:3:"혌";s:2:"v";s:3:"혍";s:2:"w";s:3:"혎";s:2:"x";s:3:"혏";s:2:"y";s:3:"혐";s:2:"";s:3:"협";s:2:"";s:3:"혒";s:2:"z";s:3:"혓";s:2:"";s:3:"혔";s:2:"";s:3:"형";s:2:"";s:3:"혖";s:2:"";s:3:"혗";s:2:"";s:3:"혘";s:2:"";s:3:"혙";s:2:"";s:3:"혚";s:2:"";s:3:"혛";s:2:"";s:3:"혜";s:2:"";s:3:"혝";s:2:"";s:3:"혞";s:2:"";s:3:"혟";s:2:"";s:3:"혠";s:2:"";s:3:"혡";s:2:"";s:3:"혢";s:2:"";s:3:"혣";s:2:"";s:3:"혤";s:2:"ȡ";s:3:"혥";s:2:"";s:3:"혦";s:2:"";s:3:"혧";s:2:"";s:3:"혨";s:2:"";s:3:"혩";s:2:"";s:3:"혪";s:2:"";s:3:"혫";s:2:"";s:3:"혬";s:2:"";s:3:"혭";s:2:"Ȣ";s:3:"혮";s:2:"";s:3:"혯";s:2:"";s:3:"혰";s:2:"";s:3:"혱";s:2:"";s:3:"혲";s:2:"";s:3:"혳";s:2:"";s:3:"혴";s:2:"";s:3:"혵";s:2:"";s:3:"혶";s:2:"";s:3:"혷";s:2:"";s:3:"호";s:2:"ȣ";s:3:"혹";s:2:"Ȥ";s:3:"혺";s:2:"";s:3:"혻";s:2:" ";s:3:"혼";s:2:"ȥ";s:3:"혽";s:2:"A";s:3:"혾";s:2:"B";s:3:"혿";s:2:"C";s:3:"홀";s:2:"Ȧ";s:3:"홁";s:2:"D";s:3:"홂";s:2:"E";s:3:"홃";s:2:"F";s:3:"홄";s:2:"G";s:3:"홅";s:2:"ȧ";s:3:"홆";s:2:"H";s:3:"홇";s:2:"I";s:3:"홈";s:2:"Ȩ";s:3:"홉";s:2:"ȩ";s:3:"홊";s:2:"J";s:3:"홋";s:2:"Ȫ";s:3:"홌";s:2:"K";s:3:"홍";s:2:"ȫ";s:3:"홎";s:2:"L";s:3:"홏";s:2:"M";s:3:"홐";s:2:"N";s:3:"홑";s:2:"Ȭ";s:3:"홒";s:2:"O";s:3:"홓";s:2:"P";s:3:"화";s:2:"ȭ";s:3:"확";s:2:"Ȯ";s:3:"홖";s:2:"Q";s:3:"홗";s:2:"R";s:3:"환";s:2:"ȯ";s:3:"홙";s:2:"S";s:3:"홚";s:2:"T";s:3:"홛";s:2:"U";s:3:"활";s:2:"Ȱ";s:3:"홝";s:2:"V";s:3:"홞";s:2:"W";s:3:"홟";s:2:"X";s:3:"홠";s:2:"Y";s:3:"홡";s:2:"Z";s:3:"홢";s:2:"a";s:3:"홣";s:2:"b";s:3:"홤";s:2:"c";s:3:"홥";s:2:"d";s:3:"홦";s:2:"e";s:3:"홧";s:2:"ȱ";s:3:"홨";s:2:"f";s:3:"황";s:2:"Ȳ";s:3:"홪";s:2:"g";s:3:"홫";s:2:"h";s:3:"홬";s:2:"i";s:3:"홭";s:2:"j";s:3:"홮";s:2:"k";s:3:"홯";s:2:"l";s:3:"홰";s:2:"ȳ";s:3:"홱";s:2:"ȴ";s:3:"홲";s:2:"m";s:3:"홳";s:2:"n";s:3:"홴";s:2:"ȵ";s:3:"홵";s:2:"o";s:3:"홶";s:2:"p";s:3:"홷";s:2:"q";s:3:"홸";s:2:"r";s:3:"홹";s:2:"s";s:3:"홺";s:2:"t";s:3:"홻";s:2:"u";s:3:"홼";s:2:"v";s:3:"홽";s:2:"w";s:3:"홾";s:2:"x";s:3:"홿";s:2:"y";s:3:"횀";s:2:"z";s:3:"횁";s:2:"Á";s:3:"횂";s:2:"Â";s:3:"횃";s:2:"ȶ";s:3:"횄";s:2:"Ã";s:3:"횅";s:2:"ȷ";s:3:"횆";s:2:"Ä";s:3:"횇";s:2:"Å";s:3:"횈";s:2:"Æ";s:3:"횉";s:2:"Ç";s:3:"횊";s:2:"È";s:3:"횋";s:2:"É";s:3:"회";s:2:"ȸ";s:3:"획";s:2:"ȹ";s:3:"횎";s:2:"Ê";s:3:"횏";s:2:"Ë";s:3:"횐";s:2:"Ⱥ";s:3:"횑";s:2:"Ì";s:3:"횒";s:2:"Í";s:3:"횓";s:2:"Î";s:3:"횔";s:2:"Ȼ";s:3:"횕";s:2:"Ï";s:3:"횖";s:2:"Ð";s:3:"횗";s:2:"Ñ";s:3:"횘";s:2:"Ò";s:3:"횙";s:2:"Ó";s:3:"횚";s:2:"Ô";s:3:"횛";s:2:"Õ";s:3:"횜";s:2:"Ö";s:3:"횝";s:2:"ȼ";s:3:"횞";s:2:"×";s:3:"횟";s:2:"Ƚ";s:3:"횠";s:2:"Ø";s:3:"횡";s:2:"Ⱦ";s:3:"횢";s:2:"Ù";s:3:"횣";s:2:"Ú";s:3:"횤";s:2:"Û";s:3:"횥";s:2:"Ü";s:3:"횦";s:2:"Ý";s:3:"횧";s:2:"Þ";s:3:"효";s:2:"ȿ";s:3:"횩";s:2:"ß";s:3:"횪";s:2:"à";s:3:"횫";s:2:"A";s:3:"횬";s:2:"";s:3:"횭";s:2:"B";s:3:"횮";s:2:"C";s:3:"횯";s:2:"D";s:3:"횰";s:2:"";s:3:"횱";s:2:"E";s:3:"횲";s:2:"F";s:3:"횳";s:2:"G";s:3:"횴";s:2:"H";s:3:"횵";s:2:"I";s:3:"횶";s:2:"J";s:3:"횷";s:2:"K";s:3:"횸";s:2:"L";s:3:"횹";s:2:"";s:3:"횺";s:2:"M";s:3:"횻";s:2:"";s:3:"횼";s:2:"N";s:3:"횽";s:2:"O";s:3:"횾";s:2:"P";s:3:"횿";s:2:"Q";s:3:"훀";s:2:"R";s:3:"훁";s:2:"S";s:3:"훂";s:2:"T";s:3:"훃";s:2:"U";s:3:"후";s:2:"";s:3:"훅";s:2:"";s:3:"훆";s:2:"V";s:3:"훇";s:2:"W";s:3:"훈";s:2:"";s:3:"훉";s:2:"X";s:3:"훊";s:2:"Y";s:3:"훋";s:2:"Z";s:3:"훌";s:2:"";s:3:"훍";s:2:"a";s:3:"훎";s:2:"b";s:3:"훏";s:2:"c";s:3:"훐";s:2:"d";s:3:"훑";s:2:"";s:3:"훒";s:2:"e";s:3:"훓";s:2:"f";s:3:"훔";s:2:"";s:3:"훕";s:2:"g";s:3:"훖";s:2:"h";s:3:"훗";s:2:"";s:3:"훘";s:2:"i";s:3:"훙";s:2:"";s:3:"훚";s:2:"j";s:3:"훛";s:2:"k";s:3:"훜";s:2:"l";s:3:"훝";s:2:"m";s:3:"훞";s:2:"n";s:3:"훟";s:2:"o";s:3:"훠";s:2:"";s:3:"훡";s:2:"p";s:3:"훢";s:2:"q";s:3:"훣";s:2:"r";s:3:"훤";s:2:"";s:3:"훥";s:2:"s";s:3:"훦";s:2:"t";s:3:"훧";s:2:"u";s:3:"훨";s:2:"";s:3:"훩";s:2:"v";s:3:"훪";s:2:"w";s:3:"훫";s:2:"x";s:3:"훬";s:2:"y";s:3:"훭";s:2:"z";s:3:"훮";s:2:"ā";s:3:"훯";s:2:"Ă";s:3:"훰";s:2:"";s:3:"훱";s:2:"ă";s:3:"훲";s:2:"Ą";s:3:"훳";s:2:"ą";s:3:"훴";s:2:"Ć";s:3:"훵";s:2:"";s:3:"훶";s:2:"ć";s:3:"훷";s:2:"Ĉ";s:3:"훸";s:2:"ĉ";s:3:"훹";s:2:"Ċ";s:3:"훺";s:2:"ċ";s:3:"훻";s:2:"Č";s:3:"훼";s:2:"";s:3:"훽";s:2:"";s:3:"훾";s:2:"č";s:3:"훿";s:2:"Ď";s:3:"휀";s:2:"";s:3:"휁";s:2:"ď";s:3:"휂";s:2:"Đ";s:3:"휃";s:2:"đ";s:3:"휄";s:2:"";s:3:"휅";s:2:"Ē";s:3:"휆";s:2:"ē";s:3:"휇";s:2:"Ĕ";s:3:"휈";s:2:"ĕ";s:3:"휉";s:2:"Ė";s:3:"휊";s:2:"ė";s:3:"휋";s:2:"Ę";s:3:"휌";s:2:"ę";s:3:"휍";s:2:"Ě";s:3:"휎";s:2:"ě";s:3:"휏";s:2:"Ĝ";s:3:"휐";s:2:"ĝ";s:3:"휑";s:2:"";s:3:"휒";s:2:"Ğ";s:3:"휓";s:2:"ğ";s:3:"휔";s:2:"Ġ";s:3:"휕";s:2:"A";s:3:"휖";s:2:"B";s:3:"휗";s:2:"C";s:3:"휘";s:2:"";s:3:"휙";s:2:"";s:3:"휚";s:2:"D";s:3:"휛";s:2:"E";s:3:"휜";s:2:"";s:3:"휝";s:2:"F";s:3:"휞";s:2:"G";s:3:"휟";s:2:"H";s:3:"휠";s:2:"";s:3:"휡";s:2:"I";s:3:"휢";s:2:"J";s:3:"휣";s:2:"K";s:3:"휤";s:2:"L";s:3:"휥";s:2:"M";s:3:"휦";s:2:"N";s:3:"휧";s:2:"O";s:3:"휨";s:2:"";s:3:"휩";s:2:"";s:3:"휪";s:2:"P";s:3:"휫";s:2:"";s:3:"휬";s:2:"Q";s:3:"휭";s:2:"";s:3:"휮";s:2:"R";s:3:"휯";s:2:"S";s:3:"휰";s:2:"T";s:3:"휱";s:2:"U";s:3:"휲";s:2:"V";s:3:"휳";s:2:"W";s:3:"휴";s:2:"";s:3:"휵";s:2:"";s:3:"휶";s:2:"X";s:3:"휷";s:2:"Y";s:3:"휸";s:2:"";s:3:"휹";s:2:"Z";s:3:"휺";s:2:"a";s:3:"휻";s:2:"b";s:3:"휼";s:2:"";s:3:"휽";s:2:"c";s:3:"휾";s:2:"d";s:3:"휿";s:2:"e";s:3:"흀";s:2:"f";s:3:"흁";s:2:"g";s:3:"흂";s:2:"h";s:3:"흃";s:2:"i";s:3:"흄";s:2:"";s:3:"흅";s:2:"j";s:3:"흆";s:2:"k";s:3:"흇";s:2:"";s:3:"흈";s:2:"l";s:3:"흉";s:2:"";s:3:"흊";s:2:"m";s:3:"흋";s:2:"n";s:3:"흌";s:2:"o";s:3:"흍";s:2:"p";s:3:"흎";s:2:"q";s:3:"흏";s:2:"r";s:3:"흐";s:2:"";s:3:"흑";s:2:"";s:3:"흒";s:2:"s";s:3:"흓";s:2:"t";s:3:"흔";s:2:"";s:3:"흕";s:2:"u";s:3:"흖";s:2:"";s:3:"흗";s:2:"";s:3:"흘";s:2:"";s:3:"흙";s:2:"";s:3:"흚";s:2:"v";s:3:"흛";s:2:"w";s:3:"흜";s:2:"x";s:3:"흝";s:2:"y";s:3:"흞";s:2:"z";s:3:"흟";s:2:"Ł";s:3:"흠";s:2:"";s:3:"흡";s:2:"";s:3:"흢";s:2:"ł";s:3:"흣";s:2:"";s:3:"흤";s:2:"Ń";s:3:"흥";s:2:"";s:3:"흦";s:2:"ń";s:3:"흧";s:2:"Ņ";s:3:"흨";s:2:"ņ";s:3:"흩";s:2:"";s:3:"흪";s:2:"Ň";s:3:"흫";s:2:"ň";s:3:"희";s:2:"";s:3:"흭";s:2:"ŉ";s:3:"흮";s:2:"Ŋ";s:3:"흯";s:2:"ŋ";s:3:"흰";s:2:"";s:3:"흱";s:2:"Ō";s:3:"흲";s:2:"ō";s:3:"흳";s:2:"Ŏ";s:3:"흴";s:2:"";s:3:"흵";s:2:"ŏ";s:3:"흶";s:2:"Ő";s:3:"흷";s:2:"ő";s:3:"흸";s:2:"Œ";s:3:"흹";s:2:"œ";s:3:"흺";s:2:"Ŕ";s:3:"흻";s:2:"ŕ";s:3:"흼";s:2:"";s:3:"흽";s:2:"";s:3:"흾";s:2:"Ŗ";s:3:"흿";s:2:"ŗ";s:3:"힀";s:2:"Ř";s:3:"힁";s:2:"";s:3:"힂";s:2:"ř";s:3:"힃";s:2:"Ś";s:3:"힄";s:2:"ś";s:3:"힅";s:2:"Ŝ";s:3:"힆";s:2:"ŝ";s:3:"힇";s:2:"Ş";s:3:"히";s:2:"";s:3:"힉";s:2:"";s:3:"힊";s:2:"ş";s:3:"힋";s:2:"Š";s:3:"힌";s:2:"";s:3:"힍";s:2:"A";s:3:"힎";s:2:"B";s:3:"힏";s:2:"C";s:3:"힐";s:2:"";s:3:"힑";s:2:"D";s:3:"힒";s:2:"E";s:3:"힓";s:2:"F";s:3:"힔";s:2:"G";s:3:"힕";s:2:"H";s:3:"힖";s:2:"I";s:3:"힗";s:2:"J";s:3:"힘";s:2:"";s:3:"힙";s:2:"";s:3:"힚";s:2:"K";s:3:"힛";s:2:"";s:3:"힜";s:2:"L";s:3:"힝";s:2:"";s:3:"힞";s:2:"M";s:3:"힟";s:2:"N";s:3:"힠";s:2:"O";s:3:"힡";s:2:"P";s:3:"힢";s:2:"Q";s:3:"힣";s:2:"R";s:3:"";s:2:"ɡ";s:3:"";s:2:"ɢ";s:3:"";s:2:"ɣ";s:3:"";s:2:"ɤ";s:3:"";s:2:"ɥ";s:3:"";s:2:"ɦ";s:3:"";s:2:"ɧ";s:3:"";s:2:"ɨ";s:3:"";s:2:"ɩ";s:3:"";s:2:"ɪ";s:3:"";s:2:"ɫ";s:3:"";s:2:"ɬ";s:3:"";s:2:"ɭ";s:3:"";s:2:"ɮ";s:3:"";s:2:"ɯ";s:3:"";s:2:"ɰ";s:3:"";s:2:"ɱ";s:3:"";s:2:"ɲ";s:3:"";s:2:"ɳ";s:3:"";s:2:"ɴ";s:3:"";s:2:"ɵ";s:3:"";s:2:"ɶ";s:3:"";s:2:"ɷ";s:3:"";s:2:"ɸ";s:3:"";s:2:"ɹ";s:3:"";s:2:"ɺ";s:3:"";s:2:"ɻ";s:3:"";s:2:"ɼ";s:3:"";s:2:"ɽ";s:3:"";s:2:"ɾ";s:3:"";s:2:"ɿ";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:1:"";s:3:"豈";s:2:"";s:3:"更";s:2:"";s:3:"車";s:2:"";s:3:"賈";s:2:"";s:3:"滑";s:2:"";s:3:"串";s:2:"έ";s:3:"句";s:2:"";s:3:"龜";s:2:"Т";s:3:"龜";s:2:"и";s:3:"契";s:2:"";s:3:"金";s:2:"";s:3:"喇";s:2:"";s:3:"奈";s:2:"";s:3:"懶";s:2:"";s:3:"癩";s:2:"";s:3:"羅";s:2:"";s:3:"蘿";s:2:"";s:3:"螺";s:2:"";s:3:"裸";s:2:"";s:3:"邏";s:2:"";s:3:"樂";s:2:"";s:3:"洛";s:2:"";s:3:"烙";s:2:"";s:3:"珞";s:2:"";s:3:"落";s:2:"";s:3:"酪";s:2:"";s:3:"駱";s:2:"";s:3:"亂";s:2:"";s:3:"卵";s:2:"";s:3:"欄";s:2:"";s:3:"爛";s:2:"";s:3:"蘭";s:2:"";s:3:"鸞";s:2:"";s:3:"嵐";s:2:"";s:3:"濫";s:2:"";s:3:"藍";s:2:"";s:3:"襤";s:2:"";s:3:"拉";s:2:"";s:3:"臘";s:2:"Ң";s:3:"蠟";s:2:"ң";s:3:"廊";s:2:"ҧ";s:3:"朗";s:2:"Ҩ";s:3:"浪";s:2:"ҩ";s:3:"狼";s:2:"Ҫ";s:3:"郎";s:2:"ҫ";s:3:"來";s:2:"ҭ";s:3:"冷";s:2:"Ҳ";s:3:"勞";s:2:"Ҿ";s:3:"擄";s:2:"";s:3:"櫓";s:2:"";s:3:"爐";s:2:"";s:3:"盧";s:2:"";s:3:"老";s:2:"";s:3:"蘆";s:2:"";s:3:"虜";s:2:"";s:3:"路";s:2:"";s:3:"露";s:2:"";s:3:"魯";s:2:"";s:3:"鷺";s:2:"";s:3:"碌";s:2:"";s:3:"祿";s:2:"";s:3:"綠";s:2:"";s:3:"菉";s:2:"";s:3:"錄";s:2:"";s:3:"鹿";s:2:"";s:3:"論";s:2:"";s:3:"壟";s:2:"";s:3:"弄";s:2:"";s:3:"籠";s:2:"";s:3:"聾";s:2:"";s:3:"牢";s:2:"";s:3:"磊";s:2:"";s:3:"賂";s:2:"";s:3:"雷";s:2:"";s:3:"壘";s:2:"";s:3:"屢";s:2:"";s:3:"樓";s:2:"";s:3:"淚";s:2:"";s:3:"漏";s:2:"";s:3:"累";s:2:"";s:3:"縷";s:2:"";s:3:"陋";s:2:"";s:3:"勒";s:2:"";s:3:"肋";s:2:"";s:3:"凜";s:2:"";s:3:"凌";s:2:"";s:3:"稜";s:2:"";s:3:"綾";s:2:"";s:3:"菱";s:2:"";s:3:"陵";s:2:"";s:3:"讀";s:2:"";s:3:"拏";s:2:"";s:3:"樂";s:2:"ե";s:3:"諾";s:2:"ի";s:3:"丹";s:2:"ծ";s:3:"寧";s:2:"ָ";s:3:"怒";s:2:"";s:3:"率";s:2:"";s:3:"異";s:2:"";s:3:"北";s:2:"";s:3:"磻";s:2:"";s:3:"便";s:2:"ܥ";s:3:"復";s:2:"ݥ";s:3:"不";s:2:"";s:3:"泌";s:2:"";s:3:"數";s:2:"";s:3:"索";s:2:"";s:3:"參";s:2:"߳";s:3:"塞";s:2:"";s:3:"省";s:2:"";s:3:"葉";s:2:"";s:3:"說";s:2:"";s:3:"殺";s:2:"";s:3:"辰";s:2:"";s:3:"沈";s:2:"";s:3:"拾";s:2:"";s:3:"若";s:2:"";s:3:"掠";s:2:"";s:3:"略";s:2:"";s:3:"亮";s:2:"";s:3:"兩";s:2:"";s:3:"凉";s:2:"";s:3:"梁";s:2:"";s:3:"糧";s:2:"";s:3:"良";s:2:"";s:3:"諒";s:2:"";s:3:"量";s:2:"";s:3:"勵";s:2:"";s:3:"呂";s:2:"";s:3:"女";s:2:"";s:3:"廬";s:2:"";s:3:"旅";s:2:"";s:3:"濾";s:2:"";s:3:"礪";s:2:"";s:3:"閭";s:2:"";s:3:"驪";s:2:"";s:3:"麗";s:2:"";s:3:"黎";s:2:"";s:3:"力";s:2:"";s:3:"曆";s:2:"";s:3:"歷";s:2:"";s:3:"轢";s:2:"";s:3:"年";s:2:"";s:3:"憐";s:2:"";s:3:"戀";s:2:"";s:3:"撚";s:2:"";s:3:"漣";s:2:"";s:3:"煉";s:2:"";s:3:"璉";s:2:"";s:3:"秊";s:2:"";s:3:"練";s:2:"";s:3:"聯";s:2:"";s:3:"輦";s:2:"";s:3:"蓮";s:2:"";s:3:"連";s:2:"";s:3:"鍊";s:2:"";s:3:"列";s:2:"";s:3:"劣";s:2:"";s:3:"咽";s:2:"";s:3:"烈";s:2:"";s:3:"裂";s:2:"";s:3:"說";s:2:"";s:3:"廉";s:2:"";s:3:"念";s:2:"";s:3:"捻";s:2:"";s:3:"殮";s:2:"";s:3:"簾";s:2:"";s:3:"獵";s:2:"";s:3:"令";s:2:"";s:3:"囹";s:2:"";s:3:"寧";s:2:"";s:3:"嶺";s:2:"";s:3:"怜";s:2:"";s:3:"玲";s:2:"";s:3:"瑩";s:2:"";s:3:"羚";s:2:"";s:3:"聆";s:2:"";s:3:"鈴";s:2:"";s:3:"零";s:2:"";s:3:"靈";s:2:"";s:3:"領";s:2:"";s:3:"例";s:2:"";s:3:"禮";s:2:"";s:3:"醴";s:2:"";s:3:"隸";s:2:"";s:3:"惡";s:2:"";s:3:"了";s:2:"";s:3:"僚";s:2:"";s:3:"寮";s:2:"";s:3:"尿";s:2:"";s:3:"料";s:2:"";s:3:"樂";s:2:"";s:3:"燎";s:2:"";s:3:"療";s:2:"";s:3:"蓼";s:2:"";s:3:"遼";s:2:"";s:3:"龍";s:2:"";s:3:"暈";s:2:"";s:3:"阮";s:2:"";s:3:"劉";s:2:"";s:3:"杻";s:2:"";s:3:"柳";s:2:"";s:3:"流";s:2:"";s:3:"溜";s:2:"";s:3:"琉";s:2:"";s:3:"留";s:2:"";s:3:"硫";s:2:"";s:3:"紐";s:2:"";s:3:"類";s:2:"";s:3:"六";s:2:"";s:3:"戮";s:2:"";s:3:"陸";s:2:"";s:3:"倫";s:2:"";s:3:"崙";s:2:"";s:3:"淪";s:2:"";s:3:"輪";s:2:"";s:3:"律";s:2:"";s:3:"慄";s:2:"";s:3:"栗";s:2:"";s:3:"率";s:2:"";s:3:"隆";s:2:"";s:3:"利";s:2:"";s:3:"吏";s:2:"";s:3:"履";s:2:"";s:3:"易";s:2:"";s:3:"李";s:2:"";s:3:"梨";s:2:"";s:3:"泥";s:2:"";s:3:"理";s:2:"";s:3:"痢";s:2:"";s:3:"罹";s:2:"";s:3:"裏";s:2:"";s:3:"裡";s:2:"";s:3:"里";s:2:"";s:3:"離";s:2:"";s:3:"匿";s:2:"";s:3:"溺";s:2:"";s:3:"吝";s:2:"";s:3:"燐";s:2:"";s:3:"璘";s:2:"";s:3:"藺";s:2:"";s:3:"隣";s:2:"";s:3:"鱗";s:2:"";s:3:"麟";s:2:"";s:3:"林";s:2:"";s:3:"淋";s:2:"";s:3:"臨";s:2:"";s:3:"立";s:2:"";s:3:"笠";s:2:"";s:3:"粒";s:2:"";s:3:"狀";s:2:"";s:3:"炙";s:2:"";s:3:"識";s:2:"";s:3:"什";s:2:"";s:3:"茶";s:2:"";s:3:"刺";s:2:"";s:3:"切";s:2:"";s:3:"度";s:2:"";s:3:"拓";s:2:"";s:3:"糖";s:2:"";s:3:"宅";s:2:"";s:3:"洞";s:2:"";s:3:"暴";s:2:"";s:3:"輻";s:2:"";s:3:"行";s:2:"";s:3:"降";s:2:"";s:3:"見";s:2:"";s:3:"廓";s:2:"";s:3:"兀";s:2:"";s:3:"塚";s:2:"";s:3:"晴";s:2:"";s:3:"凞";s:2:"";s:3:"益";s:2:"";s:3:"神";s:2:"";s:3:"祥";s:2:"";s:3:"福";s:2:"";s:3:"靖";s:2:"";s:3:"精";s:2:"";s:3:"羽";s:2:"";s:3:"諸";s:2:"";s:3:"逸";s:2:"";s:3:"都";s:2:"Դ";s:3:"飯";s:2:"";s:3:"飼";s:2:"";s:3:"館";s:2:"ν";s:3:"鶴";s:2:"";s:3:"！";s:2:"";s:3:"＂";s:2:"";s:3:"＃";s:2:"";s:3:"＄";s:2:"";s:3:"％";s:2:"";s:3:"＆";s:2:"";s:3:"＇";s:2:"";s:3:"（";s:2:"";s:3:"）";s:2:"";s:3:"＊";s:2:"";s:3:"＋";s:2:"";s:3:"，";s:2:"";s:3:"－";s:2:"";s:3:"．";s:2:"";s:3:"／";s:2:"";s:3:"０";s:2:"";s:3:"１";s:2:"";s:3:"２";s:2:"";s:3:"３";s:2:"";s:3:"４";s:2:"";s:3:"５";s:2:"";s:3:"６";s:2:"";s:3:"７";s:2:"";s:3:"８";s:2:"";s:3:"９";s:2:"";s:3:"：";s:2:"";s:3:"；";s:2:"";s:3:"＜";s:2:"";s:3:"＝";s:2:"";s:3:"＞";s:2:"";s:3:"？";s:2:"";s:3:"＠";s:2:"";s:3:"Ａ";s:2:"";s:3:"Ｂ";s:2:"";s:3:"Ｃ";s:2:"";s:3:"Ｄ";s:2:"";s:3:"Ｅ";s:2:"";s:3:"Ｆ";s:2:"";s:3:"Ｇ";s:2:"";s:3:"Ｈ";s:2:"";s:3:"Ｉ";s:2:"";s:3:"Ｊ";s:2:"";s:3:"Ｋ";s:2:"";s:3:"Ｌ";s:2:"";s:3:"Ｍ";s:2:"";s:3:"Ｎ";s:2:"";s:3:"Ｏ";s:2:"";s:3:"Ｐ";s:2:"";s:3:"Ｑ";s:2:"";s:3:"Ｒ";s:2:"";s:3:"Ｓ";s:2:"";s:3:"Ｔ";s:2:"";s:3:"Ｕ";s:2:"";s:3:"Ｖ";s:2:"";s:3:"Ｗ";s:2:"";s:3:"Ｘ";s:2:"";s:3:"Ｙ";s:2:"";s:3:"Ｚ";s:2:"";s:3:"［";s:2:"";s:3:"＼";s:2:"";s:3:"］";s:2:"";s:3:"＾";s:2:"";s:3:"＿";s:2:"";s:3:"｀";s:2:"";s:3:"ａ";s:2:"";s:3:"ｂ";s:2:"";s:3:"ｃ";s:2:"";s:3:"ｄ";s:2:"";s:3:"ｅ";s:2:"";s:3:"ｆ";s:2:"";s:3:"ｇ";s:2:"";s:3:"ｈ";s:2:"";s:3:"ｉ";s:2:"";s:3:"ｊ";s:2:"";s:3:"ｋ";s:2:"";s:3:"ｌ";s:2:"";s:3:"ｍ";s:2:"";s:3:"ｎ";s:2:"";s:3:"ｏ";s:2:"";s:3:"ｐ";s:2:"";s:3:"ｑ";s:2:"";s:3:"ｒ";s:2:"";s:3:"ｓ";s:2:"";s:3:"ｔ";s:2:"";s:3:"ｕ";s:2:"";s:3:"ｖ";s:2:"";s:3:"ｗ";s:2:"";s:3:"ｘ";s:2:"";s:3:"ｙ";s:2:"";s:3:"ｚ";s:2:"";s:3:"｛";s:2:"";s:3:"｜";s:2:"";s:3:"｝";s:2:"";s:3:"～";s:2:"";s:3:"ﾠ";s:2:"";s:3:"ﾡ";s:2:"";s:3:"ﾢ";s:2:"";s:3:"ﾣ";s:2:"";s:3:"ﾤ";s:2:"";s:3:"ﾥ";s:2:"";s:3:"ﾦ";s:2:"";s:3:"ﾧ";s:2:"";s:3:"ﾨ";s:2:"";s:3:"ﾩ";s:2:"";s:3:"ﾪ";s:2:"";s:3:"ﾫ";s:2:"";s:3:"ﾬ";s:2:"";s:3:"ﾭ";s:2:"";s:3:"ﾮ";s:2:"";s:3:"ﾯ";s:2:"";s:3:"ﾰ";s:2:"";s:3:"ﾱ";s:2:"";s:3:"ﾲ";s:2:"";s:3:"ﾳ";s:2:"";s:3:"ﾴ";s:2:"";s:3:"ﾵ";s:2:"";s:3:"ﾶ";s:2:"";s:3:"ﾷ";s:2:"";s:3:"ﾸ";s:2:"";s:3:"ﾹ";s:2:"";s:3:"ﾺ";s:2:"";s:3:"ﾻ";s:2:"";s:3:"ﾼ";s:2:"";s:3:"ﾽ";s:2:"";s:3:"ﾾ";s:2:"";s:3:"ￂ";s:2:"";s:3:"ￃ";s:2:"";s:3:"ￄ";s:2:"";s:3:"ￅ";s:2:"";s:3:"ￆ";s:2:"";s:3:"ￇ";s:2:"";s:3:"ￊ";s:2:"";s:3:"ￋ";s:2:"";s:3:"ￌ";s:2:"";s:3:"ￍ";s:2:"";s:3:"ￎ";s:2:"";s:3:"ￏ";s:2:"";s:3:"ￒ";s:2:"";s:3:"ￓ";s:2:"";s:3:"ￔ";s:2:"";s:3:"ￕ";s:2:"";s:3:"ￖ";s:2:"";s:3:"ￗ";s:2:"";s:3:"ￚ";s:2:"";s:3:"ￛ";s:2:"";s:3:"ￜ";s:2:"";s:3:"￠";s:2:"";s:3:"￡";s:2:"";s:3:"￢";s:2:"";s:3:"￣";s:2:"";s:3:"￥";s:2:"";s:3:"￦";s:2:"";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/data/to.bestfit950.ser
@@ -0,0 +1,3 @@
+a:20321:{s:1:" ";s:1:" ";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"	";s:1:"	";s:1:"
+";s:1:"
+";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"
";s:1:"
";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:"";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"";s:1:"";s:2:"";s:1:"";s:2:"¡";s:1:"!";s:2:"¢";s:2:"F";s:2:"£";s:2:"G";s:2:"¥";s:2:"D";s:2:"¦";s:1:"|";s:2:"§";s:2:"";s:2:"¨";s:2:"L";s:2:"©";s:1:"c";s:2:"ª";s:1:"a";s:2:"­";s:1:"-";s:2:"®";s:1:"R";s:2:"¯";s:2:"";s:2:"°";s:2:"X";s:2:"±";s:2:"";s:2:"²";s:1:"2";s:2:"³";s:1:"3";s:2:"´";s:2:"";s:2:"µ";s:2:"g";s:2:"·";s:2:"P";s:2:"¸";s:2:"M";s:2:"¹";s:1:"1";s:2:"º";s:1:"o";s:2:"¿";s:1:"?";s:2:"À";s:1:"A";s:2:"Á";s:1:"A";s:2:"Â";s:1:"A";s:2:"Ã";s:1:"A";s:2:"Ä";s:1:"A";s:2:"Å";s:1:"A";s:2:"Æ";s:1:"A";s:2:"Ç";s:1:"C";s:2:"È";s:1:"E";s:2:"É";s:1:"E";s:2:"Ê";s:1:"E";s:2:"Ë";s:1:"E";s:2:"Ì";s:1:"I";s:2:"Í";s:1:"I";s:2:"Î";s:1:"I";s:2:"Ï";s:1:"I";s:2:"Ð";s:1:"D";s:2:"Ñ";s:1:"N";s:2:"Ò";s:1:"O";s:2:"Ó";s:1:"O";s:2:"Ô";s:1:"O";s:2:"Õ";s:1:"O";s:2:"Ö";s:1:"O";s:2:"×";s:2:"";s:2:"Ø";s:1:"O";s:2:"Ù";s:1:"U";s:2:"Ú";s:1:"U";s:2:"Û";s:1:"U";s:2:"Ü";s:1:"U";s:2:"Ý";s:1:"Y";s:2:"Þ";s:1:"T";s:2:"ß";s:1:"s";s:2:"à";s:1:"a";s:2:"á";s:1:"a";s:2:"â";s:1:"a";s:2:"ã";s:1:"a";s:2:"ä";s:1:"a";s:2:"å";s:1:"a";s:2:"æ";s:1:"a";s:2:"ç";s:1:"c";s:2:"è";s:1:"e";s:2:"é";s:1:"e";s:2:"ê";s:1:"e";s:2:"ë";s:1:"e";s:2:"ì";s:1:"i";s:2:"í";s:1:"i";s:2:"î";s:1:"i";s:2:"ï";s:1:"i";s:2:"ð";s:1:"e";s:2:"ñ";s:1:"n";s:2:"ò";s:1:"o";s:2:"ó";s:1:"o";s:2:"ô";s:1:"o";s:2:"õ";s:1:"o";s:2:"ö";s:1:"o";s:2:"÷";s:2:"";s:2:"ø";s:1:"o";s:2:"ù";s:1:"u";s:2:"ú";s:1:"u";s:2:"û";s:1:"u";s:2:"ü";s:1:"u";s:2:"ý";s:1:"y";s:2:"þ";s:1:"t";s:2:"ÿ";s:1:"y";s:2:"ˇ";s:2:"";s:2:"ˉ";s:2:"";s:2:"ˊ";s:2:"";s:2:"ˋ";s:2:"";s:2:"ˍ";s:2:"";s:2:"˙";s:2:"";s:2:"̅";s:2:"";s:2:"Α";s:2:"D";s:2:"Β";s:2:"E";s:2:"Γ";s:2:"F";s:2:"Δ";s:2:"G";s:2:"Ε";s:2:"H";s:2:"Ζ";s:2:"I";s:2:"Η";s:2:"J";s:2:"Θ";s:2:"K";s:2:"Ι";s:2:"L";s:2:"Κ";s:2:"M";s:2:"Λ";s:2:"N";s:2:"Μ";s:2:"O";s:2:"Ν";s:2:"P";s:2:"Ξ";s:2:"Q";s:2:"Ο";s:2:"R";s:2:"Π";s:2:"S";s:2:"Ρ";s:2:"T";s:2:"Σ";s:2:"U";s:2:"Τ";s:2:"V";s:2:"Υ";s:2:"W";s:2:"Φ";s:2:"X";s:2:"Χ";s:2:"Y";s:2:"Ψ";s:2:"Z";s:2:"Ω";s:2:"[";s:2:"α";s:2:"\";s:2:"β";s:2:"]";s:2:"γ";s:2:"^";s:2:"δ";s:2:"_";s:2:"ε";s:2:"`";s:2:"ζ";s:2:"a";s:2:"η";s:2:"b";s:2:"θ";s:2:"c";s:2:"ι";s:2:"d";s:2:"κ";s:2:"e";s:2:"λ";s:2:"f";s:2:"μ";s:2:"g";s:2:"ν";s:2:"h";s:2:"ξ";s:2:"i";s:2:"ο";s:2:"j";s:2:"π";s:2:"k";s:2:"ρ";s:2:"l";s:2:"σ";s:2:"m";s:2:"τ";s:2:"n";s:2:"υ";s:2:"o";s:2:"φ";s:2:"p";s:2:"χ";s:2:"q";s:2:"ψ";s:2:"r";s:2:"ω";s:2:"s";s:3:"€";s:2:"";s:3:"–";s:2:"V";s:3:"—";s:2:"X";s:3:"―";s:2:"w";s:3:"‖";s:2:"";s:3:"‘";s:2:"";s:3:"’";s:2:"";s:3:"“";s:2:"";s:3:"”";s:2:"";s:3:"•";s:2:"E";s:3:"․";s:2:"";s:3:"‥";s:2:"L";s:3:"…";s:2:"K";s:3:"‧";s:2:"E";s:3:"′";s:2:"";s:3:"″";s:2:"";s:3:"‵";s:2:"";s:3:"※";s:2:"";s:3:"‾";s:2:"";s:3:"℃";s:2:"J";s:3:"℅";s:2:"";s:3:"℉";s:2:"K";s:3:"Ⅰ";s:2:"";s:3:"Ⅱ";s:2:"";s:3:"Ⅲ";s:2:"";s:3:"Ⅳ";s:2:"";s:3:"Ⅴ";s:2:"";s:3:"Ⅵ";s:2:"";s:3:"Ⅶ";s:2:"";s:3:"Ⅷ";s:2:"";s:3:"Ⅸ";s:2:"";s:3:"Ⅹ";s:2:"";s:3:"←";s:2:"";s:3:"↑";s:2:"";s:3:"→";s:2:"";s:3:"↓";s:2:"";s:3:"↖";s:2:"";s:3:"↗";s:2:"";s:3:"↘";s:2:"";s:3:"↙";s:2:"";s:3:"∕";s:2:"A";s:3:"∖";s:2:"B";s:3:"∘";s:2:"X";s:3:"√";s:2:"";s:3:"∞";s:2:"";s:3:"∟";s:2:"";s:3:"∠";s:2:"";s:3:"∣";s:2:"";s:3:"∥";s:2:"";s:3:"∩";s:2:"";s:3:"∪";s:2:"";s:3:"∫";s:2:"";s:3:"∮";s:2:"";s:3:"∴";s:2:"";s:3:"∵";s:2:"";s:3:"≒";s:2:"";s:3:"≠";s:2:"";s:3:"≡";s:2:"";s:3:"≣";s:2:"";s:3:"≦";s:2:"";s:3:"≧";s:2:"";s:3:"⊕";s:2:"";s:3:"⊙";s:2:"";s:3:"⊥";s:2:"";s:3:"⊿";s:2:"";s:3:"⌇";s:2:"[";s:3:"─";s:2:"w";s:3:"│";s:2:"x";s:3:"┌";s:2:"z";s:3:"┐";s:2:"{";s:3:"└";s:2:"|";s:3:"┘";s:2:"}";s:3:"├";s:2:"u";s:3:"┤";s:2:"t";s:3:"┬";s:2:"s";s:3:"┴";s:2:"r";s:3:"┼";s:2:"q";s:3:"═";s:2:"";s:3:"║";s:2:"";s:3:"╒";s:2:"";s:3:"╓";s:2:"";s:3:"╔";s:2:"";s:3:"╕";s:2:"";s:3:"╖";s:2:"";s:3:"╗";s:2:"";s:3:"╘";s:2:"";s:3:"╙";s:2:"";s:3:"╚";s:2:"";s:3:"╛";s:2:"";s:3:"╜";s:2:"";s:3:"╝";s:2:"";s:3:"╞";s:2:"";s:3:"╟";s:2:"";s:3:"╠";s:2:"";s:3:"╡";s:2:"";s:3:"╢";s:2:"";s:3:"╣";s:2:"";s:3:"╤";s:2:"";s:3:"╥";s:2:"";s:3:"╦";s:2:"";s:3:"╧";s:2:"";s:3:"╨";s:2:"";s:3:"╩";s:2:"";s:3:"╪";s:2:"";s:3:"╫";s:2:"";s:3:"╬";s:2:"";s:3:"╭";s:2:"~";s:3:"╮";s:2:"";s:3:"╯";s:2:"";s:3:"╰";s:2:"";s:3:"╱";s:2:"";s:3:"╲";s:2:"";s:3:"╳";s:2:"";s:3:"╴";s:2:"Z";s:3:"▁";s:2:"b";s:3:"▂";s:2:"c";s:3:"▃";s:2:"d";s:3:"▄";s:2:"e";s:3:"▅";s:2:"f";s:3:"▆";s:2:"g";s:3:"▇";s:2:"h";s:3:"█";s:2:"i";s:3:"▉";s:2:"p";s:3:"▊";s:2:"o";s:3:"▋";s:2:"n";s:3:"▌";s:2:"m";s:3:"▍";s:2:"l";s:3:"▎";s:2:"k";s:3:"▏";s:2:"j";s:3:"▓";s:2:"";s:3:"▔";s:2:"v";s:3:"▕";s:2:"y";s:3:"■";s:2:"";s:3:"□";s:2:"";s:3:"▲";s:2:"";s:3:"△";s:2:"";s:3:"▼";s:2:"";s:3:"▽";s:2:"";s:3:"◆";s:2:"";s:3:"◇";s:2:"";s:3:"○";s:2:"";s:3:"◎";s:2:"";s:3:"●";s:2:"";s:3:"◢";s:2:"";s:3:"◣";s:2:"";s:3:"◤";s:2:"";s:3:"◥";s:2:"";s:3:"★";s:2:"";s:3:"☆";s:2:"";s:3:"☉";s:2:"";s:3:"♀";s:2:"";s:3:"♁";s:2:"";s:3:"♂";s:2:"";s:3:"　";s:2:"@";s:3:"、";s:2:"B";s:3:"。";s:2:"C";s:3:"〃";s:2:"";s:3:"〈";s:2:"q";s:3:"〉";s:2:"r";s:3:"《";s:2:"m";s:3:"》";s:2:"n";s:3:"「";s:2:"u";s:3:"」";s:2:"v";s:3:"『";s:2:"y";s:3:"』";s:2:"z";s:3:"【";s:2:"i";s:3:"】";s:2:"j";s:3:"〒";s:2:"E";s:3:"〔";s:2:"e";s:3:"〕";s:2:"f";s:3:"〜";s:2:"";s:3:"〝";s:2:"";s:3:"〞";s:2:"";s:3:"〡";s:2:"";s:3:"〢";s:2:"";s:3:"〣";s:2:"";s:3:"〤";s:2:"";s:3:"〥";s:2:"";s:3:"〦";s:2:"";s:3:"〧";s:2:"";s:3:"〨";s:2:"";s:3:"〩";s:2:"";s:3:"〰";s:2:"";s:3:"ㄅ";s:2:"t";s:3:"ㄆ";s:2:"u";s:3:"ㄇ";s:2:"v";s:3:"ㄈ";s:2:"w";s:3:"ㄉ";s:2:"x";s:3:"ㄊ";s:2:"y";s:3:"ㄋ";s:2:"z";s:3:"ㄌ";s:2:"{";s:3:"ㄍ";s:2:"|";s:3:"ㄎ";s:2:"}";s:3:"ㄏ";s:2:"~";s:3:"ㄐ";s:2:"";s:3:"ㄑ";s:2:"";s:3:"ㄒ";s:2:"";s:3:"ㄓ";s:2:"";s:3:"ㄔ";s:2:"";s:3:"ㄕ";s:2:"";s:3:"ㄖ";s:2:"";s:3:"ㄗ";s:2:"";s:3:"ㄘ";s:2:"";s:3:"ㄙ";s:2:"";s:3:"ㄚ";s:2:"";s:3:"ㄛ";s:2:"";s:3:"ㄜ";s:2:"";s:3:"ㄝ";s:2:"";s:3:"ㄞ";s:2:"";s:3:"ㄟ";s:2:"";s:3:"ㄠ";s:2:"";s:3:"ㄡ";s:2:"";s:3:"ㄢ";s:2:"";s:3:"ㄣ";s:2:"";s:3:"ㄤ";s:2:"";s:3:"ㄥ";s:2:"";s:3:"ㄦ";s:2:"";s:3:"ㄧ";s:2:"";s:3:"ㄨ";s:2:"";s:3:"ㄩ";s:2:"";s:3:"㆒";s:2:"@";s:3:"㆓";s:2:"G";s:3:"㆔";s:2:"T";s:3:"㆕";s:2:"|";s:3:"㆖";s:2:"W";s:3:"㆗";s:2:"";s:3:"㆘";s:2:"U";s:3:"㆙";s:2:"";s:3:"㆚";s:2:"A";s:3:"㆛";s:2:"";s:3:"㆜";s:2:"B";s:3:"㆝";s:2:"";s:3:"㆞";s:2:"a";s:3:"㆟";s:2:"H";s:3:"㈠";s:2:"@";s:3:"㈡";s:2:"G";s:3:"㈢";s:2:"T";s:3:"㈣";s:2:"|";s:3:"㈤";s:2:"";s:3:"㈥";s:2:"";s:3:"㈦";s:2:"C";s:3:"㈧";s:2:"K";s:3:"㈨";s:2:"E";s:3:"㈩";s:2:"Q";s:3:"㈪";s:2:"";s:3:"㈫";s:2:"";s:3:"㈬";s:2:"";s:3:"㈭";s:2:"";s:3:"㈮";s:2:"";s:3:"㈯";s:2:"g";s:3:"㈰";s:2:"";s:3:"㈱";s:2:"";s:3:"㈲";s:2:"";s:3:"㈳";s:2:"";s:3:"㈴";s:2:"W";s:3:"㈵";s:2:"S";s:3:"㈶";s:2:"]";s:3:"㈷";s:2:"";s:3:"㈸";s:2:"";s:3:"㈹";s:2:"N";s:3:"㈺";s:2:"I";s:3:"㈻";s:2:"";s:3:"㈼";s:2:"";s:3:"㈽";s:2:"";s:3:"㈾";s:2:"";s:3:"㈿";s:2:"";s:3:"㉀";s:2:"";s:3:"㉁";s:2:"";s:3:"㉂";s:2:"";s:3:"㉃";s:2:"";s:3:"㊀";s:2:"@";s:3:"㊁";s:2:"G";s:3:"㊂";s:2:"T";s:3:"㊃";s:2:"|";s:3:"㊄";s:2:"";s:3:"㊅";s:2:"";s:3:"㊆";s:2:"C";s:3:"㊇";s:2:"K";s:3:"㊈";s:2:"E";s:3:"㊉";s:2:"Q";s:3:"㊊";s:2:"";s:3:"㊋";s:2:"";s:3:"㊌";s:2:"";s:3:"㊍";s:2:"";s:3:"㊎";s:2:"";s:3:"㊏";s:2:"g";s:3:"㊐";s:2:"";s:3:"㊑";s:2:"";s:3:"㊒";s:2:"";s:3:"㊓";s:2:"";s:3:"㊔";s:2:"W";s:3:"㊕";s:2:"S";s:3:"㊖";s:2:"]";s:3:"㊗";s:2:"";s:3:"㊘";s:2:"";s:3:"㊙";s:2:"";s:3:"㊚";s:2:"k";s:3:"㊛";s:2:"k";s:3:"㊜";s:2:"A";s:3:"㊝";s:2:"u";s:3:"㊞";s:2:"L";s:3:"㊟";s:2:"`";s:3:"㊠";s:2:"";s:3:"㊡";s:2:"";s:3:"㊢";s:2:"g";s:3:"㊣";s:2:"";s:3:"㊤";s:2:"W";s:3:"㊥";s:2:"";s:3:"㊦";s:2:"U";s:3:"㊧";s:2:"";s:3:"㊨";s:2:"k";s:3:"㊩";s:2:"";s:3:"㊪";s:2:"v";s:3:"㊫";s:2:"";s:3:"㊬";s:2:"";s:3:"㊭";s:2:"";s:3:"㊮";s:2:"";s:3:"㊯";s:2:"";s:3:"㊰";s:2:"]";s:3:"㎎";s:2:"U";s:3:"㎏";s:2:"V";s:3:"㎜";s:2:"P";s:3:"㎝";s:2:"Q";s:3:"㎞";s:2:"R";s:3:"㎡";s:2:"T";s:3:"㏄";s:2:"W";s:3:"㏎";s:2:"S";s:3:"㏑";s:2:"";s:3:"㏒";s:2:"";s:3:"㏕";s:2:"O";s:3:"一";s:2:"@";s:3:"丁";s:2:"B";s:3:"七";s:2:"C";s:3:"万";s:2:"E";s:3:"丈";s:2:"V";s:3:"三";s:2:"T";s:3:"上";s:2:"W";s:3:"下";s:2:"U";s:3:"丌";s:2:"F";s:3:"不";s:2:"";s:3:"与";s:2:"O";s:3:"丏";s:2:"M";s:3:"丐";s:2:"";s:3:"丑";s:2:"";s:3:"且";s:2:"B";s:3:"丕";s:2:"A";s:3:"世";s:2:"@";s:3:"丘";s:2:"C";s:3:"丙";s:2:"";s:3:"丞";s:2:"";s:3:"丟";s:2:"";s:3:"並";s:2:"";s:3:"丫";s:2:"X";s:3:"中";s:2:"";s:3:"丮";s:2:"P";s:3:"丰";s:2:"";s:3:"丱";s:2:"c";s:3:"串";s:2:"";s:3:"丳";s:2:"˱";s:3:"丸";s:2:"Y";s:3:"丹";s:2:"";s:3:"主";s:2:"D";s:3:"丼";s:2:"d";s:3:"乂";s:2:"@";s:3:"乃";s:2:"D";s:3:"久";s:2:"[";s:3:"乇";s:2:"G";s:3:"么";s:2:"\";s:3:"之";s:2:"";s:3:"乍";s:2:"E";s:3:"乎";s:2:"G";s:3:"乏";s:2:"F";s:3:"乒";s:2:"";s:3:"乓";s:2:"";s:3:"乖";s:2:"";s:3:"乘";s:2:"";s:3:"乙";s:2:"A";s:3:"乜";s:2:"A";s:3:"九";s:2:"E";s:3:"乞";s:2:"^";s:3:"也";s:2:"]";s:3:"乩";s:2:"";s:3:"乳";s:2:"";s:3:"乾";s:2:"";s:3:"乿";s:2:"K";s:3:"亂";s:2:"";s:3:"亃";s:2:"ܱ";s:3:"亄";s:2:"ܲ";s:3:"了";s:2:"F";s:3:"予";s:2:"";s:3:"事";s:2:"";s:3:"二";s:2:"G";s:3:"亍";s:2:"H";s:3:"于";s:2:"_";s:3:"云";s:2:"";s:3:"互";s:2:"";s:3:"亓";s:2:"Q";s:3:"五";s:2:"";s:3:"井";s:2:"";s:3:"亙";s:2:"";s:3:"些";s:2:"";s:3:"亞";s:2:"";s:3:"亟";s:2:"E";s:3:"亡";s:2:"`";s:3:"亢";s:2:"";s:3:"交";s:2:"";s:3:"亥";s:2:"";s:3:"亦";s:2:"";s:3:"亨";s:2:"";s:3:"享";s:2:"";s:3:"京";s:2:"";s:3:"亭";s:2:"F";s:3:"亮";s:2:"G";s:3:"亳";s:2:"";s:3:"亶";s:2:"ܳ";s:3:"亹";s:2:"";s:3:"人";s:2:"H";s:3:"什";s:2:"";s:3:"仁";s:2:"";s:3:"仂";s:2:"R";s:3:"仃";s:2:"";s:3:"仄";s:2:"";s:3:"仆";s:2:"";s:3:"仇";s:2:"";s:3:"仈";s:2:"T";s:3:"仉";s:2:"S";s:3:"今";s:2:"";s:3:"介";s:2:"";s:3:"仍";s:2:"";s:3:"仔";s:2:"J";s:3:"仕";s:2:"K";s:3:"他";s:2:"L";s:3:"仗";s:2:"M";s:3:"付";s:2:"I";s:3:"仙";s:2:"P";s:3:"仚";s:2:"j";s:3:"仜";s:2:"f";s:3:"仝";s:2:"i";s:3:"仞";s:2:"Q";s:3:"仟";s:2:"a";s:3:"仡";s:2:"h";s:3:"代";s:2:"N";s:3:"令";s:2:"O";s:3:"以";s:2:"H";s:3:"仨";s:2:"e";s:3:"仩";s:2:"g";s:3:"仰";s:2:"";s:3:"仱";s:2:"ɰ";s:3:"仲";s:2:"";s:3:"仳";s:2:"";s:3:"仴";s:2:"ɺ";s:3:"仵";s:2:"ɮ";s:3:"件";s:2:"";s:3:"价";s:2:"ɲ";s:3:"任";s:2:"";s:3:"份";s:2:"";s:3:"仿";s:2:"";s:3:"伀";s:2:"ɱ";s:3:"企";s:2:"";s:3:"伂";s:2:"ɵ";s:3:"伄";s:2:"ɹ";s:3:"伅";s:2:"ɶ";s:3:"伈";s:2:"ɳ";s:3:"伉";s:2:"";s:3:"伊";s:2:"";s:3:"伋";s:2:"";s:3:"伍";s:2:"";s:3:"伎";s:2:"ɫ";s:3:"伏";s:2:"";s:3:"伐";s:2:"";s:3:"休";s:2:"";s:3:"伒";s:2:"ɻ";s:3:"伓";s:2:"ɸ";s:3:"伔";s:2:"ɯ";s:3:"伕";s:2:"";s:3:"优";s:2:"ɬ";s:3:"伙";s:2:"";s:3:"伝";s:2:"ɴ";s:3:"伢";s:2:"ɷ";s:3:"伬";s:2:"ɭ";s:3:"伭";s:2:"f";s:3:"伯";s:2:"B";s:3:"估";s:2:"";s:3:"伳";s:2:"g";s:3:"伴";s:2:"";s:3:"伶";s:2:"D";s:3:"伸";s:2:"";s:3:"伺";s:2:"";s:3:"伻";s:2:"[";s:3:"似";s:2:"";s:3:"伽";s:2:"";s:3:"伾";s:2:"`";s:3:"伿";s:2:"h";s:3:"佁";s:2:"d";s:3:"佃";s:2:"";s:3:"但";s:2:"";s:3:"佇";s:2:"";s:3:"佈";s:2:"G";s:3:"佉";s:2:"]";s:3:"佌";s:2:"˽";s:3:"位";s:2:"";s:3:"低";s:2:"C";s:3:"住";s:2:"";s:3:"佐";s:2:"";s:3:"佑";s:2:"";s:3:"佒";s:2:"b";s:3:"体";s:2:"^";s:3:"佔";s:2:"";s:3:"何";s:2:"";s:3:"佖";s:2:"Z";s:3:"佗";s:2:"";s:3:"佘";s:2:"e";s:3:"余";s:2:"E";s:3:"佚";s:2:"H";s:3:"佛";s:2:"";s:3:"作";s:2:"@";s:3:"佝";s:2:"F";s:3:"佞";s:2:"";s:3:"佟";s:2:"c";s:3:"你";s:2:"A";s:3:"佡";s:2:"i";s:3:"佢";s:2:"\";s:3:"佣";s:2:"";s:3:"佤";s:2:"_";s:3:"佧";s:2:"a";s:3:"佩";s:2:"";s:3:"佪";s:2:"˿";s:3:"佫";s:2:"";s:3:"佬";s:2:"";s:3:"佮";s:2:"";s:3:"佯";s:2:"";s:3:"佰";s:2:"";s:3:"佳";s:2:"";s:3:"佴";s:2:"˹";s:3:"併";s:2:"";s:3:"佶";s:2:"˸";s:3:"佷";s:2:"˼";s:3:"佸";s:2:"";s:3:"佹";s:2:"";s:3:"佺";s:2:"";s:3:"佻";s:2:"";s:3:"佼";s:2:"˳";s:3:"佽";s:2:"˵";s:3:"佾";s:2:"";s:3:"使";s:2:"";s:3:"侀";s:2:"˶";s:3:"侁";s:2:"";s:3:"侂";s:2:"";s:3:"侃";s:2:"";s:3:"侄";s:2:"˻";s:3:"侅";s:2:"˴";s:3:"來";s:2:"";s:3:"侇";s:2:"˷";s:3:"侈";s:2:"";s:3:"侉";s:2:"˺";s:3:"例";s:2:"";s:3:"侍";s:2:"";s:3:"侏";s:2:"";s:3:"侐";s:2:"";s:3:"侑";s:2:"";s:3:"侒";s:2:"";s:3:"侔";s:2:"";s:3:"侕";s:2:"";s:3:"侖";s:2:"";s:3:"侗";s:2:"˾";s:3:"侘";s:2:"˲";s:3:"侚";s:2:"";s:3:"供";s:2:"";s:3:"侜";s:2:"";s:3:"依";s:2:"";s:3:"侞";s:2:"";s:3:"侮";s:2:"V";s:3:"侯";s:2:"J";s:3:"侲";s:2:"";s:3:"侳";s:2:"";s:3:"侵";s:2:"I";s:3:"侶";s:2:"Q";s:3:"侷";s:2:"]";s:3:"侹";s:2:"";s:3:"侺";s:2:"";s:3:"侻";s:2:"";s:3:"便";s:2:"K";s:3:"俀";s:2:"";s:3:"俁";s:2:"";s:3:"係";s:2:"Y";s:3:"促";s:2:"P";s:3:"俄";s:2:"X";s:3:"俅";s:2:"";s:3:"俇";s:2:"";s:3:"俉";s:2:"";s:3:"俊";s:2:"T";s:3:"俋";s:2:"";s:3:"俍";s:2:"";s:3:"俎";s:2:"[";s:3:"俏";s:2:"N";s:3:"俐";s:2:"W";s:3:"俑";s:2:"M";s:3:"俓";s:2:"";s:3:"俔";s:2:"";s:3:"俖";s:2:"";s:3:"俗";s:2:"U";s:3:"俘";s:2:"R";s:3:"俙";s:2:"";s:3:"俚";s:2:"Z";s:3:"俛";s:2:"";s:3:"俜";s:2:"";s:3:"保";s:2:"O";s:3:"俞";s:2:"\";s:3:"俟";s:2:"S";s:3:"俠";s:2:"L";s:3:"信";s:2:"H";s:3:"俬";s:2:"";s:3:"修";s:2:"";s:3:"俯";s:2:"";s:3:"俱";s:2:"";s:3:"俳";s:2:"";s:3:"俴";s:2:"";s:3:"俵";s:2:"";s:3:"俶";s:2:"";s:3:"俷";s:2:"";s:3:"俸";s:2:"";s:3:"俺";s:2:"";s:3:"俾";s:2:"";s:3:"倀";s:2:"";s:3:"倅";s:2:"";s:3:"倆";s:2:"";s:3:"倇";s:2:"";s:3:"倉";s:2:"";s:3:"個";s:2:"";s:3:"倌";s:2:"";s:3:"倍";s:2:"";s:3:"倎";s:2:"";s:3:"倏";s:2:"";s:3:"們";s:2:"";s:3:"倒";s:2:"";s:3:"倓";s:2:"";s:3:"倔";s:2:"";s:3:"倕";s:2:"[";s:3:"倖";s:2:"";s:3:"倗";s:2:"";s:3:"倘";s:2:"";s:3:"候";s:2:"";s:3:"倚";s:2:"";s:3:"倛";s:2:"";s:3:"倜";s:2:"";s:3:"倞";s:2:"";s:3:"借";s:2:"";s:3:"倠";s:2:"";s:3:"倡";s:2:"";s:3:"倢";s:2:"";s:3:"倣";s:2:"";s:3:"倥";s:2:"";s:3:"倦";s:2:"";s:3:"倧";s:2:"";s:3:"倨";s:2:"";s:3:"倩";s:2:"";s:3:"倪";s:2:"";s:3:"倫";s:2:"";s:3:"倬";s:2:"";s:3:"倭";s:2:"";s:3:"倯";s:2:"";s:3:"倰";s:2:"";s:3:"倱";s:2:"";s:3:"倳";s:2:"";s:3:"倵";s:2:"";s:3:"倷";s:2:"";s:3:"值";s:2:"";s:3:"偀";s:2:"c";s:3:"偁";s:2:"W";s:3:"偃";s:2:"";s:3:"偅";s:2:"\";s:3:"偆";s:2:"b";s:3:"假";s:2:"";s:3:"偈";s:2:"U";s:3:"偉";s:2:"";s:3:"偊";s:2:"Y";s:3:"偋";s:2:"R";s:3:"偌";s:2:"";s:3:"偍";s:2:"V";s:3:"偎";s:2:"";s:3:"偏";s:2:"";s:3:"偑";s:2:"g";s:3:"偓";s:2:"Q";s:3:"偕";s:2:"";s:3:"偗";s:2:"f";s:3:"做";s:2:"";s:3:"偛";s:2:"X";s:3:"停";s:2:"";s:3:"偝";s:2:"S";s:3:"偞";s:2:"O";s:3:"偟";s:2:"]";s:3:"偠";s:2:"P";s:3:"偡";s:2:"N";s:3:"偢";s:2:"Z";s:3:"偣";s:2:"`";s:3:"偤";s:2:"a";s:3:"健";s:2:"";s:3:"偨";s:2:"[";s:3:"偩";s:2:"^";s:3:"偪";s:2:"M";s:3:"偫";s:2:"_";s:3:"偭";s:2:"";s:3:"偮";s:2:"d";s:3:"偯";s:2:"";s:3:"偰";s:2:"L";s:3:"偲";s:2:"T";s:3:"偳";s:2:"e";s:3:"側";s:2:"";s:3:"偵";s:2:"";s:3:"偶";s:2:"";s:3:"偷";s:2:"";s:3:"偺";s:2:"";s:3:"偽";s:2:"";s:3:"傀";s:2:"";s:3:"傂";s:2:"^";s:3:"傃";s:2:"W";s:3:"傅";s:2:"";s:3:"傇";s:2:"_";s:3:"傋";s:2:"U";s:3:"傌";s:2:"X";s:3:"傍";s:2:"";s:3:"傎";s:2:"Y";s:3:"傑";s:2:"";s:3:"傒";s:2:"]";s:3:"傔";s:2:"S";s:3:"傕";s:2:"R";s:3:"傖";s:2:"";s:3:"傘";s:2:"";s:3:"備";s:2:"";s:3:"傚";s:2:"";s:3:"傛";s:2:"Q";s:3:"傜";s:2:"\";s:3:"傝";s:2:"Z";s:3:"傞";s:2:"T";s:3:"傢";s:2:"";s:3:"傣";s:2:"V";s:3:"催";s:2:"";s:3:"傭";s:2:"";s:3:"傮";s:2:"ܷ";s:3:"傯";s:2:"";s:3:"傰";s:2:"ܽ";s:3:"傱";s:2:"";s:3:"傲";s:2:"";s:3:"傳";s:2:"";s:3:"傴";s:2:"ܺ";s:3:"債";s:2:"";s:3:"傶";s:2:"";s:3:"傷";s:2:"";s:3:"傸";s:2:"";s:3:"傺";s:2:"ܿ";s:3:"傻";s:2:"";s:3:"傽";s:2:"ܴ";s:3:"傾";s:2:"";s:3:"傿";s:2:"ܵ";s:3:"僁";s:2:"ܾ";s:3:"僂";s:2:"ܼ";s:3:"僄";s:2:"ܸ";s:3:"僅";s:2:"";s:3:"僆";s:2:"ܶ";s:3:"僇";s:2:"";s:3:"僈";s:2:"ܻ";s:3:"僉";s:2:"";s:3:"僊";s:2:"ܹ";s:3:"僋";s:2:"";s:3:"僎";s:2:"";s:3:"像";s:2:"";s:3:"僑";s:2:"";s:3:"僓";s:2:"";s:3:"僔";s:2:"";s:3:"僕";s:2:"";s:3:"僖";s:2:"";s:3:"僗";s:2:"";s:3:"僚";s:2:"";s:3:"僛";s:2:"";s:3:"僝";s:2:"";s:3:"僠";s:2:"";s:3:"僣";s:2:"";s:3:"僤";s:2:"";s:3:"僥";s:2:"";s:3:"僦";s:2:"";s:3:"僧";s:2:"";s:3:"僨";s:2:"";s:3:"僩";s:2:"";s:3:"僪";s:2:"";s:3:"僬";s:2:"";s:3:"僭";s:2:"";s:3:"僮";s:2:"";s:3:"僯";s:2:"";s:3:"僰";s:2:"";s:3:"僱";s:2:"";s:3:"僳";s:2:"";s:3:"僵";s:2:"";s:3:"僶";s:2:"";s:3:"僸";s:2:"";s:3:"價";s:2:"";s:3:"僻";s:2:"";s:3:"僽";s:2:"";s:3:"僾";s:2:"";s:3:"僿";s:2:"";s:3:"儀";s:2:"";s:3:"儂";s:2:"";s:3:"儃";s:2:"";s:3:"億";s:2:"";s:3:"儅";s:2:"";s:3:"儆";s:2:"";s:3:"儇";s:2:"";s:3:"儈";s:2:"";s:3:"儉";s:2:"";s:3:"儊";s:2:"";s:3:"儋";s:2:"";s:3:"儌";s:2:"";s:3:"儐";s:2:"";s:3:"儑";s:2:"";s:3:"儒";s:2:"";s:3:"儓";s:2:"";s:3:"儔";s:2:"";s:3:"儕";s:2:"";s:3:"儗";s:2:"";s:3:"儘";s:2:"";s:3:"儚";s:2:"";s:3:"儜";s:2:"";s:3:"償";s:2:"v";s:3:"儠";s:2:"";s:3:"儡";s:2:"w";s:3:"儢";s:2:"";s:3:"儤";s:2:"";s:3:"儥";s:2:"";s:3:"儦";s:2:"";s:3:"儩";s:2:"";s:3:"優";s:2:"u";s:3:"儭";s:2:"";s:3:"儮";s:2:"";s:3:"儰";s:2:"";s:3:"儱";s:2:"";s:3:"儲";s:2:"x";s:3:"儳";s:2:"_";s:3:"儴";s:2:"";s:3:"儵";s:2:"";s:3:"儷";s:2:"";s:3:"儸";s:2:"";s:3:"儹";s:2:"";s:3:"儺";s:2:"";s:3:"儻";s:2:"l";s:3:"儼";s:2:"k";s:3:"儽";s:2:"";s:3:"儿";s:2:"I";s:3:"兀";s:2:"a";s:3:"允";s:2:"";s:3:"元";s:2:"";s:3:"兄";s:2:"S";s:3:"充";s:2:"R";s:3:"兆";s:2:"";s:3:"兇";s:2:"";s:3:"先";s:2:"";s:3:"光";s:2:"";s:3:"克";s:2:"J";s:3:"兌";s:2:"I";s:3:"免";s:2:"K";s:3:"兒";s:2:"";s:3:"兔";s:2:"";s:3:"兕";s:2:"";s:3:"兗";s:2:"^";s:3:"兙";s:2:"Y";s:3:"党";s:2:"";s:3:"兛";s:2:"Z";s:3:"兜";s:2:"";s:3:"兝";s:2:"\";s:3:"兞";s:2:"[";s:3:"兟";s:2:"`";s:3:"兡";s:2:"]";s:3:"兢";s:2:"";s:3:"兣";s:2:"^";s:3:"入";s:2:"J";s:3:"內";s:2:"";s:3:"全";s:2:"";s:3:"兩";s:2:"";s:3:"八";s:2:"K";s:3:"公";s:2:"";s:3:"六";s:2:"";s:3:"兮";s:2:"";s:3:"共";s:2:"@";s:3:"兵";s:2:"L";s:3:"其";s:2:"";s:3:"具";s:2:"";s:3:"典";s:2:"";s:3:"兼";s:2:"";s:3:"冀";s:2:"";s:3:"冇";s:2:"N";s:3:"冉";s:2:"T";s:3:"冊";s:2:"U";s:3:"再";s:2:"A";s:3:"冏";s:2:"j";s:3:"冑";s:2:"`";s:3:"冒";s:2:"_";s:3:"冓";s:2:"";s:3:"冔";s:2:"";s:3:"冕";s:2:"";s:3:"冗";s:2:"";s:3:"冘";s:2:"U";s:3:"冞";s:2:"";s:3:"冠";s:2:"a";s:3:"冢";s:2:"";s:3:"冤";s:2:"";s:3:"冥";s:2:"";s:3:"冪";s:2:"";s:3:"冬";s:2:"V";s:3:"冰";s:2:"B";s:3:"冱";s:2:"ɼ";s:3:"冶";s:2:"M";s:3:"冷";s:2:"N";s:3:"冹";s:2:"k";s:3:"冼";s:2:"";s:3:"冽";s:2:"";s:3:"冾";s:2:"";s:3:"凄";s:2:"";s:3:"凅";s:2:"";s:3:"准";s:2:"";s:3:"凈";s:2:"";s:3:"凊";s:2:"";s:3:"凋";s:2:"";s:3:"凌";s:2:"";s:3:"凍";s:2:"";s:3:"凎";s:2:"";s:3:"凐";s:2:"h";s:3:"凔";s:2:"a";s:3:"凗";s:2:"";s:3:"凘";s:2:"@";s:3:"凜";s:2:"";s:3:"凝";s:2:"";s:3:"凞";s:2:"";s:3:"几";s:2:"L";s:3:"凡";s:2:"Z";s:3:"凰";s:2:"";s:3:"凱";s:2:"";s:3:"凳";s:2:"";s:3:"凵";s:2:"B";s:3:"凶";s:2:"";s:3:"凸";s:2:"Y";s:3:"凹";s:2:"W";s:3:"出";s:2:"X";s:3:"函";s:2:"";s:3:"刀";s:2:"M";s:3:"刁";s:2:"N";s:3:"刃";s:2:"b";s:3:"分";s:2:"";s:3:"切";s:2:"";s:3:"刈";s:2:"";s:3:"刉";s:2:"ɾ";s:3:"刊";s:2:"Z";s:3:"刌";s:2:"k";s:3:"刎";s:2:"F";s:3:"刐";s:2:"ɿ";s:3:"刑";s:2:"D";s:3:"划";s:2:"E";s:3:"刓";s:2:"ɽ";s:3:"刖";s:2:"G";s:3:"列";s:2:"C";s:3:"刜";s:2:"l";s:3:"初";s:2:"";s:3:"刞";s:2:"m";s:3:"刡";s:2:"n";s:3:"判";s:2:"P";s:3:"別";s:2:"O";s:3:"刨";s:2:"S";s:3:"利";s:2:"Q";s:3:"刪";s:2:"R";s:3:"刮";s:2:"";s:3:"到";s:2:"";s:3:"刱";s:2:"";s:3:"刲";s:2:"";s:3:"刳";s:2:"";s:3:"刵";s:2:"";s:3:"制";s:2:"";s:3:"刷";s:2:"";s:3:"券";s:2:"";s:3:"刺";s:2:"";s:3:"刻";s:2:"";s:3:"剁";s:2:"";s:3:"剃";s:2:"c";s:3:"剄";s:2:"";s:3:"剆";s:2:"";s:3:"則";s:2:"h";s:3:"剉";s:2:"";s:3:"削";s:2:"d";s:3:"剋";s:2:"g";s:3:"剌";s:2:"f";s:3:"前";s:2:"e";s:3:"剎";s:2:"b";s:3:"剒";s:2:"";s:3:"剔";s:2:"";s:3:"剕";s:2:"";s:3:"剖";s:2:"";s:3:"剚";s:2:"";s:3:"剛";s:2:"";s:3:"剜";s:2:"";s:3:"剝";s:2:"";s:3:"剞";s:2:"";s:3:"剟";s:2:"";s:3:"剡";s:2:"";s:3:"剢";s:2:"";s:3:"剩";s:2:"";s:3:"剪";s:2:"";s:3:"剫";s:2:"i";s:3:"剬";s:2:"k";s:3:"剭";s:2:"j";s:3:"剮";s:2:"l";s:3:"副";s:2:"";s:3:"割";s:2:"";s:3:"剴";s:2:"";s:3:"創";s:2:"";s:3:"剷";s:2:"";s:3:"剸";s:2:"";s:3:"剺";s:2:"";s:3:"剻";s:2:"";s:3:"剼";s:2:"";s:3:"剽";s:2:"";s:3:"剿";s:2:"";s:3:"劀";s:2:"A";s:3:"劁";s:2:"B";s:3:"劂";s:2:"";s:3:"劃";s:2:"";s:3:"劄";s:2:"Z";s:3:"劇";s:2:"@";s:3:"劈";s:2:"A";s:3:"劉";s:2:"B";s:3:"劊";s:2:"D";s:3:"劋";s:2:"";s:3:"劌";s:2:"";s:3:"劍";s:2:"C";s:3:"劑";s:2:"";s:3:"劓";s:2:"";s:3:"劖";s:2:"";s:3:"劗";s:2:"";s:3:"劘";s:2:"";s:3:"劙";s:2:"";s:3:"力";s:2:"O";s:3:"功";s:2:"\";s:3:"加";s:2:"[";s:3:"劣";s:2:"H";s:3:"劦";s:2:"";s:3:"助";s:2:"U";s:3:"努";s:2:"V";s:3:"劫";s:2:"T";s:3:"劬";s:2:"W";s:3:"劭";s:2:"o";s:3:"劮";s:2:"p";s:3:"劻";s:2:"";s:3:"劼";s:2:"";s:3:"劾";s:2:"";s:3:"勀";s:2:"";s:3:"勁";s:2:"l";s:3:"勂";s:2:"";s:3:"勃";s:2:"k";s:3:"勇";s:2:"i";s:3:"勉";s:2:"j";s:3:"勍";s:2:"";s:3:"勒";s:2:"";s:3:"勓";s:2:"n";s:3:"動";s:2:"";s:3:"勖";s:2:"m";s:3:"勗";s:2:"";s:3:"勘";s:2:"";s:3:"務";s:2:"";s:3:"勛";s:2:"";s:3:"勝";s:2:"";s:3:"勞";s:2:"";s:3:"募";s:2:"";s:3:"勢";s:2:"";s:3:"勣";s:2:"";s:3:"勤";s:2:"";s:3:"勦";s:2:"";s:3:"勩";s:2:"C";s:3:"勫";s:2:"D";s:3:"勯";s:2:"";s:3:"勰";s:2:"E";s:3:"勱";s:2:"";s:3:"勳";s:2:"";s:3:"勴";s:2:"";s:3:"勵";s:2:"y";s:3:"勷";s:2:"";s:3:"勸";s:2:"U";s:3:"勺";s:2:"c";s:3:"勻";s:2:"";s:3:"勼";s:2:"V";s:3:"勾";s:2:"";s:3:"勿";s:2:"";s:3:"包";s:2:"]";s:3:"匆";s:2:"^";s:3:"匈";s:2:"I";s:3:"匉";s:2:"q";s:3:"匊";s:2:"";s:3:"匋";s:2:"";s:3:"匍";s:2:"m";s:3:"匎";s:2:"";s:3:"匏";s:2:"";s:3:"匐";s:2:"";s:3:"匑";s:2:"c";s:3:"匒";s:2:"b";s:3:"匕";s:2:"P";s:3:"化";s:2:"";s:3:"北";s:2:"_";s:3:"匙";s:2:"";s:3:"匚";s:2:"C";s:3:"匜";s:2:"l";s:3:"匝";s:2:"`";s:3:"匟";s:2:"";s:3:"匠";s:2:"K";s:3:"匡";s:2:"J";s:3:"匢";s:2:"";s:3:"匣";s:2:"X";s:3:"匪";s:2:"";s:3:"匭";s:2:"o";s:3:"匯";s:2:"";s:3:"匰";s:2:"E";s:3:"匱";s:2:"";s:3:"匴";s:2:"";s:3:"匷";s:2:"";s:3:"匹";s:2:"";s:3:"匼";s:2:"";s:3:"匽";s:2:"";s:3:"匾";s:2:"";s:3:"匿";s:2:"";s:3:"區";s:2:"";s:3:"十";s:2:"Q";s:3:"千";s:2:"d";s:3:"卄";s:2:"";s:3:"卅";s:2:"";s:3:"升";s:2:"";s:3:"午";s:2:"";s:3:"卉";s:2:"c";s:3:"半";s:2:"b";s:3:"卌";s:2:"m";s:3:"卍";s:2:"";s:3:"卑";s:2:"";s:3:"卒";s:2:"";s:3:"卓";s:2:"";s:3:"協";s:2:"";s:3:"南";s:2:"n";s:3:"博";s:2:"";s:3:"卜";s:2:"R";s:3:"卞";s:2:"";s:3:"占";s:2:"e";s:3:"卡";s:2:"d";s:3:"卣";s:2:"r";s:3:"卦";s:2:"";s:3:"卬";s:2:"W";s:3:"卮";s:2:"g";s:3:"卯";s:2:"f";s:3:"印";s:2:"L";s:3:"危";s:2:"M";s:3:"卲";s:2:"s";s:3:"即";s:2:"Y";s:3:"卵";s:2:"Z";s:3:"卷";s:2:"";s:3:"卸";s:2:"";s:3:"卹";s:2:"";s:3:"卻";s:2:"o";s:3:"卼";s:2:"";s:3:"卿";s:2:"";s:3:"厂";s:2:"D";s:3:"厄";s:2:"";s:3:"厊";s:2:"";s:3:"厎";s:2:"t";s:3:"厏";s:2:"u";s:3:"厒";s:2:"";s:3:"厔";s:2:"";s:3:"厖";s:2:"";s:3:"厗";s:2:"";s:3:"厘";s:2:"";s:3:"厙";s:2:"";s:3:"厚";s:2:"p";s:3:"厜";s:2:"p";s:3:"厝";s:2:"";s:3:"厞";s:2:"";s:3:"原";s:2:"";s:3:"厤";s:2:"d";s:3:"厥";s:2:"";s:3:"厧";s:2:"e";s:3:"厬";s:2:"F";s:3:"厭";s:2:"";s:3:"厲";s:2:"F";s:3:"厴";s:2:"";s:3:"厹";s:2:"X";s:3:"去";s:2:"h";s:3:"參";s:2:"";s:3:"又";s:2:"S";s:3:"叉";s:2:"e";s:3:"及";s:2:"";s:3:"友";s:2:"";s:3:"反";s:2:"";s:3:"叔";s:2:"";s:3:"取";s:2:"";s:3:"受";s:2:"";s:3:"叛";s:2:"q";s:3:"叟";s:2:"";s:3:"叡";s:2:"";s:3:"叢";s:2:"O";s:3:"口";s:2:"f";s:3:"古";s:2:"j";s:3:"句";s:2:"y";s:3:"另";s:2:"t";s:3:"叨";s:2:"o";s:3:"叩";s:2:"n";s:3:"只";s:2:"u";s:3:"叫";s:2:"s";s:3:"召";s:2:"l";s:3:"叭";s:2:"z";s:3:"叮";s:2:"m";s:3:"可";s:2:"i";s:3:"台";s:2:"x";s:3:"叱";s:2:"w";s:3:"史";s:2:"v";s:3:"右";s:2:"k";s:3:"叵";s:2:"r";s:3:"司";s:2:"q";s:3:"叻";s:2:"{";s:3:"叼";s:2:"p";s:3:"吁";s:2:"S";s:3:"吃";s:2:"Y";s:3:"各";s:2:"U";s:3:"吆";s:2:"[";s:3:"吇";s:2:"";s:3:"合";s:2:"X";s:3:"吉";s:2:"N";s:3:"吊";s:2:"Q";s:3:"吋";s:2:"T";s:3:"同";s:2:"P";s:3:"名";s:2:"W";s:3:"后";s:2:"Z";s:3:"吏";s:2:"O";s:3:"吐";s:2:"R";s:3:"向";s:2:"V";s:3:"吒";s:2:"\";s:3:"吘";s:2:"~";s:3:"吙";s:2:"{";s:3:"君";s:2:"g";s:3:"吜";s:2:"|";s:3:"吝";s:2:"[";s:3:"吞";s:2:"]";s:3:"吟";s:2:"u";s:3:"吠";s:2:"p";s:3:"吤";s:2:"ʥ";s:3:"吥";s:2:"}";s:3:"否";s:2:"_";s:3:"吧";s:2:"a";s:3:"吨";s:2:"ʤ";s:3:"吩";s:2:"h";s:3:"吪";s:2:"x";s:3:"含";s:2:"t";s:3:"听";s:2:"v";s:3:"吭";s:2:"\";s:3:"吮";s:2:"m";s:3:"吰";s:2:"v";s:3:"吱";s:2:"s";s:3:"吳";s:2:"d";s:3:"吵";s:2:"n";s:3:"吶";s:2:"o";s:3:"吷";s:2:"w";s:3:"吸";s:2:"l";s:3:"吹";s:2:"j";s:3:"吻";s:2:"k";s:3:"吼";s:2:"q";s:3:"吽";s:2:"ʡ";s:3:"吾";s:2:"^";s:3:"呀";s:2:"r";s:3:"呁";s:2:"ʣ";s:3:"呂";s:2:"f";s:3:"呃";s:2:"c";s:3:"呅";s:2:"z";s:3:"呆";s:2:"b";s:3:"呇";s:2:"ʦ";s:3:"呈";s:2:"e";s:3:"告";s:2:"i";s:3:"呎";s:2:"`";s:3:"呏";s:2:"ʢ";s:3:"呔";s:2:"y";s:3:"呠";s:2:"";s:3:"呡";s:2:"";s:3:"呢";s:2:"O";s:3:"呣";s:2:"";s:3:"呤";s:2:"";s:3:"呥";s:2:"";s:3:"呦";s:2:"";s:3:"呧";s:2:"";s:3:"周";s:2:"P";s:3:"呫";s:2:"";s:3:"呬";s:2:"";s:3:"呯";s:2:"";s:3:"呰";s:2:"I";s:3:"呱";s:2:"K";s:3:"呲";s:2:"M";s:3:"味";s:2:"";s:3:"呴";s:2:"";s:3:"呵";s:2:"";s:3:"呶";s:2:"L";s:3:"呷";s:2:"E";s:3:"呸";s:2:"A";s:3:"呺";s:2:"";s:3:"呻";s:2:"D";s:3:"呼";s:2:"I";s:3:"命";s:2:"R";s:3:"呾";s:2:"";s:3:"呿";s:2:"";s:3:"咀";s:2:"C";s:3:"咁";s:2:"";s:3:"咂";s:2:"";s:3:"咄";s:2:"F";s:3:"咆";s:2:"H";s:3:"咇";s:2:"";s:3:"咈";s:2:"";s:3:"咋";s:2:"Q";s:3:"和";s:2:"M";s:3:"咍";s:2:"";s:3:"咎";s:2:"S";s:3:"咐";s:2:"J";s:3:"咑";s:2:"";s:3:"咒";s:2:"G";s:3:"咕";s:2:"B";s:3:"咖";s:2:"@";s:3:"咘";s:2:"";s:3:"咚";s:2:"N";s:3:"咠";s:2:"H";s:3:"咡";s:2:"";s:3:"咢";s:2:"K";s:3:"咥";s:2:"";s:3:"咦";s:2:"x";s:3:"咧";s:2:"";s:3:"咨";s:2:"t";s:3:"咩";s:2:"";s:3:"咪";s:2:"}";s:3:"咫";s:2:"";s:3:"咬";s:2:"r";s:3:"咭";s:2:"";s:3:"咮";s:2:"C";s:3:"咯";s:2:"";s:3:"咰";s:2:"O";s:3:"咱";s:2:"";s:3:"咳";s:2:"y";s:3:"咶";s:2:"E";s:3:"咷";s:2:"B";s:3:"咸";s:2:"w";s:3:"咺";s:2:"";s:3:"咻";s:2:"";s:3:"咼";s:2:"J";s:3:"咽";s:2:"|";s:3:"咾";s:2:"L";s:3:"咿";s:2:"";s:3:"哀";s:2:"s";s:3:"品";s:2:"~";s:3:"哂";s:2:"{";s:3:"哃";s:2:"@";s:3:"哄";s:2:"";s:3:"哅";s:2:"F";s:3:"哆";s:2:"G";s:3:"哇";s:2:"z";s:3:"哈";s:2:"";s:3:"哉";s:2:"v";s:3:"哎";s:2:"u";s:3:"哏";s:2:"";s:3:"哖";s:2:"D";s:3:"哞";s:2:"N";s:3:"哠";s:2:"D";s:3:"員";s:2:"";s:3:"哢";s:2:"";s:3:"哤";s:2:"";s:3:"哥";s:2:"";s:3:"哦";s:2:"@";s:3:"哧";s:2:"";s:3:"哨";s:2:"";s:3:"哩";s:2:"";s:3:"哪";s:2:"";s:3:"哫";s:2:"";s:3:"哭";s:2:"";s:3:"哮";s:2:"";s:3:"哱";s:2:"";s:3:"哲";s:2:"";s:3:"哳";s:2:"";s:3:"哷";s:2:"B";s:3:"哸";s:2:"C";s:3:"哺";s:2:"";s:3:"哻";s:2:"A";s:3:"哼";s:2:"";s:3:"哽";s:2:"C";s:3:"哿";s:2:"";s:3:"唁";s:2:"";s:3:"唃";s:2:"F";s:3:"唄";s:2:"";s:3:"唅";s:2:"";s:3:"唆";s:2:"";s:3:"唇";s:2:"B";s:3:"唈";s:2:"";s:3:"唉";s:2:"";s:3:"唊";s:2:"@";s:3:"唋";s:2:"G";s:3:"唌";s:2:"ԡ";s:3:"唎";s:2:"E";s:3:"唏";s:2:"D";s:3:"唐";s:2:"";s:3:"唑";s:2:"";s:3:"唒";s:2:"";s:3:"唔";s:2:"";s:3:"唗";s:2:"";s:3:"唚";s:2:"";s:3:"唦";s:2:"";s:3:"唧";s:2:"A";s:3:"唪";s:2:"w";s:3:"唬";s:2:"";s:3:"唭";s:2:"ԧ";s:3:"售";s:2:"";s:3:"唯";s:2:"";s:3:"唰";s:2:"|";s:3:"唱";s:2:"";s:3:"唲";s:2:"Ԣ";s:3:"唳";s:2:"";s:3:"唴";s:2:"v";s:3:"唵";s:2:"{";s:3:"唶";s:2:"z";s:3:"唷";s:2:"";s:3:"唸";s:2:"";s:3:"唹";s:2:"ԥ";s:3:"唻";s:2:"Ԩ";s:3:"唼";s:2:"s";s:3:"唾";s:2:"";s:3:"啀";s:2:"ԩ";s:3:"啁";s:2:"";s:3:"啃";s:2:"";s:3:"啄";s:2:"";s:3:"啅";s:2:"~";s:3:"商";s:2:"";s:3:"啈";s:2:"Ԧ";s:3:"啊";s:2:"";s:3:"啋";s:2:"Ԫ";s:3:"啍";s:2:"t";s:3:"啎";s:2:"Ԥ";s:3:"問";s:2:"";s:3:"啐";s:2:"u";s:3:"啑";s:2:"x";s:3:"啒";s:2:"}";s:3:"啕";s:2:"";s:3:"啖";s:2:"";s:3:"啗";s:2:"";s:3:"啜";s:2:"";s:3:"啞";s:2:"";s:3:"啟";s:2:"";s:3:"啡";s:2:"";s:3:"啢";s:2:"y";s:3:"啣";s:2:"";s:3:"啤";s:2:"";s:3:"啥";s:2:"ԣ";s:3:"啦";s:2:"";s:3:"啪";s:2:"";s:3:"啵";s:2:"q";s:3:"啶";s:2:"r";s:3:"啷";s:2:"j";s:3:"啻";s:2:"";s:3:"啼";s:2:"";s:3:"啽";s:2:"u";s:3:"啾";s:2:"";s:3:"啿";s:2:"x";s:3:"喀";s:2:"";s:3:"喁";s:2:"q";s:3:"喂";s:2:"";s:3:"喃";s:2:"";s:3:"善";s:2:"";s:3:"喇";s:2:"";s:3:"喈";s:2:"n";s:3:"喉";s:2:"";s:3:"喊";s:2:"";s:3:"喋";s:2:"";s:3:"喌";s:2:"v";s:3:"喍";s:2:"";s:3:"喎";s:2:"{";s:3:"喏";s:2:"o";s:3:"喑";s:2:"f";s:3:"喒";s:2:"s";s:3:"喓";s:2:"m";s:3:"喔";s:2:"";s:3:"喕";s:2:"y";s:3:"喘";s:2:"";s:3:"喙";s:2:"";s:3:"喚";s:2:"";s:3:"喜";s:2:"";s:3:"喝";s:2:"";s:3:"喟";s:2:"";s:3:"喡";s:2:"z";s:3:"喢";s:2:"l";s:3:"喣";s:2:"r";s:3:"喤";s:2:"t";s:3:"喥";s:2:"h";s:3:"喦";s:2:"w";s:3:"喧";s:2:"";s:3:"喨";s:2:"g";s:3:"喪";s:2:"";s:3:"喫";s:2:"";s:3:"喬";s:2:"";s:3:"喭";s:2:"i";s:3:"單";s:2:"";s:3:"喱";s:2:"";s:3:"喲";s:2:"";s:3:"喳";s:2:"";s:3:"喵";s:2:"p";s:3:"喻";s:2:"";s:3:"喿";s:2:"";s:3:"嗀";s:2:"";s:3:"嗂";s:2:"";s:3:"嗃";s:2:"";s:3:"嗄";s:2:"";s:3:"嗅";s:2:"";s:3:"嗆";s:2:"";s:3:"嗇";s:2:"";s:3:"嗈";s:2:"";s:3:"嗉";s:2:"";s:3:"嗊";s:2:"";s:3:"嗋";s:2:"";s:3:"嗌";s:2:"";s:3:"嗍";s:2:"";s:3:"嗎";s:2:"";s:3:"嗏";s:2:"";s:3:"嗐";s:2:"";s:3:"嗑";s:2:"";s:3:"嗒";s:2:"";s:3:"嗓";s:2:"";s:3:"嗔";s:2:"";s:3:"嗕";s:2:"";s:3:"嗖";s:2:"";s:3:"嗙";s:2:"";s:3:"嗚";s:2:"";s:3:"嗛";s:2:"";s:3:"嗜";s:2:"";s:3:"嗝";s:2:"";s:3:"嗟";s:2:"";s:3:"嗡";s:2:"";s:3:"嗢";s:2:"";s:3:"嗣";s:2:"";s:3:"嗤";s:2:"";s:3:"嗥";s:2:"";s:3:"嗦";s:2:"";s:3:"嗧";s:2:"_";s:3:"嗨";s:2:"";s:3:"嗩";s:2:"";s:3:"嗯";s:2:"";s:3:"嗲";s:2:"";s:3:"嗶";s:2:"";s:3:"嗷";s:2:"";s:3:"嗹";s:2:"U";s:3:"嗺";s:2:"Q";s:3:"嗼";s:2:"K";s:3:"嗽";s:2:"";s:3:"嗾";s:2:"";s:3:"嗿";s:2:"T";s:3:"嘀";s:2:"";s:3:"嘁";s:2:"N";s:3:"嘂";s:2:"P";s:3:"嘄";s:2:"S";s:3:"嘆";s:2:"";s:3:"嘈";s:2:"";s:3:"嘉";s:2:"";s:3:"嘌";s:2:"I";s:3:"嘍";s:2:"";s:3:"嘎";s:2:"";s:3:"嘏";s:2:"L";s:3:"嘐";s:2:"";s:3:"嘒";s:2:"J";s:3:"嘓";s:2:"O";s:3:"嘔";s:2:"";s:3:"嘕";s:2:"H";s:3:"嘖";s:2:"";s:3:"嘗";s:2:"";s:3:"嘛";s:2:"";s:3:"嘜";s:2:"M";s:3:"嘝";s:2:"R";s:3:"嘟";s:2:"";s:3:"嘧";s:2:"G";s:3:"嘩";s:2:"M";s:3:"嘪";s:2:"G";s:3:"嘬";s:2:"D";s:3:"嘮";s:2:"G";s:3:"嘯";s:2:"S";s:3:"嘰";s:2:"T";s:3:"嘲";s:2:"J";s:3:"嘳";s:2:"B";s:3:"嘴";s:2:"L";s:3:"嘵";s:2:"";s:3:"嘶";s:2:"R";s:3:"嘸";s:2:"F";s:3:"嘹";s:2:"I";s:3:"嘺";s:2:"H";s:3:"嘻";s:2:"H";s:3:"嘽";s:2:"C";s:3:"嘾";s:2:"E";s:3:"嘿";s:2:"K";s:3:"噀";s:2:"A";s:3:"噁";s:2:"";s:3:"噂";s:2:"";s:3:"噅";s:2:"k";s:3:"噆";s:2:"";s:3:"噈";s:2:"";s:3:"噉";s:2:"";s:3:"噊";s:2:"";s:3:"噌";s:2:"";s:3:"噎";s:2:"O";s:3:"噓";s:2:"N";s:3:"噗";s:2:"P";s:3:"噘";s:2:"";s:3:"噙";s:2:"";s:3:"噚";s:2:"@";s:3:"噞";s:2:"E";s:3:"噠";s:2:"";s:3:"噢";s:2:"";s:3:"噣";s:2:"B";s:3:"噤";s:2:"";s:3:"噥";s:2:"";s:3:"噦";s:2:"A";s:3:"器";s:2:"";s:3:"噩";s:2:"";s:3:"噪";s:2:"";s:3:"噫";s:2:"";s:3:"噬";s:2:"";s:3:"噭";s:2:"C";s:3:"噮";s:2:"";s:3:"噯";s:2:"";s:3:"噰";s:2:"";s:3:"噱";s:2:"";s:3:"噲";s:2:"D";s:3:"噳";s:2:"@";s:3:"噴";s:2:"Q";s:3:"噶";s:2:"";s:3:"噷";s:2:"F";s:3:"噸";s:2:"";s:3:"噹";s:2:"";s:3:"噾";s:2:"";s:3:"噿";s:2:"";s:3:"嚀";s:2:"{";s:3:"嚁";s:2:"";s:3:"嚂";s:2:"";s:3:"嚃";s:2:"";s:3:"嚄";s:2:"";s:3:"嚅";s:2:"}";s:3:"嚆";s:2:"";s:3:"嚇";s:2:"~";s:3:"嚌";s:2:"";s:3:"嚍";s:2:"";s:3:"嚎";s:2:"z";s:3:"嚏";s:2:"";s:3:"嚐";s:2:"|";s:3:"嚓";s:2:"";s:3:"嚕";s:2:"P";s:3:"嚗";s:2:"";s:3:"嚘";s:2:"";s:3:"嚙";s:2:"";s:3:"嚚";s:2:"";s:3:"嚜";s:2:"";s:3:"嚝";s:2:"";s:3:"嚥";s:2:"`";s:3:"嚦";s:2:"";s:3:"嚧";s:2:"";s:3:"嚨";s:2:"V";s:3:"嚪";s:2:"";s:3:"嚫";s:2:"";s:3:"嚬";s:2:"";s:3:"嚭";s:2:"";s:3:"嚮";s:2:"Q";s:3:"嚲";s:2:"";s:3:"嚳";s:2:"A";s:3:"嚴";s:2:"Y";s:3:"嚵";s:2:"@";s:3:"嚶";s:2:"X";s:3:"嚷";s:2:"W";s:3:"嚼";s:2:"Z";s:3:"嚽";s:2:"";s:3:"嚾";s:2:"";s:3:"囀";s:2:"";s:3:"囁";s:2:"";s:3:"囂";s:2:"";s:3:"囃";s:2:"";s:3:"囅";s:2:"";s:3:"囆";s:2:"";s:3:"囈";s:2:"m";s:3:"囉";s:2:"o";s:3:"囊";s:2:"n";s:3:"囋";s:2:"";s:3:"囌";s:2:"";s:3:"囍";s:2:"";s:3:"囑";s:2:"";s:3:"囓";s:2:"";s:3:"囔";s:2:"";s:3:"囗";s:2:"I";s:3:"囚";s:2:"}";s:3:"四";s:2:"|";s:3:"囝";s:2:"_";s:3:"回";s:2:"^";s:3:"囟";s:2:"";s:3:"因";s:2:"]";s:3:"囡";s:2:"";s:3:"囤";s:2:"y";s:3:"囥";s:2:"ʩ";s:3:"囧";s:2:"ʨ";s:3:"囪";s:2:"w";s:3:"囫";s:2:"z";s:3:"囮";s:2:"ʧ";s:3:"困";s:2:"x";s:3:"囷";s:2:"";s:3:"囹";s:2:"";s:3:"固";s:2:"T";s:3:"囿";s:2:"";s:3:"圁";s:2:"H";s:3:"圂";s:2:"I";s:3:"圃";s:2:"E";s:3:"圄";s:2:"F";s:3:"圇";s:2:"Ԭ";s:3:"圈";s:2:"";s:3:"圉";s:2:"";s:3:"圊";s:2:"ԫ";s:3:"國";s:2:"";s:3:"圌";s:2:"|";s:3:"圍";s:2:"";s:3:"園";s:2:"";s:3:"圓";s:2:"";s:3:"圔";s:2:"";s:3:"圖";s:2:"";s:3:"團";s:2:"";s:3:"圚";s:2:"I";s:3:"圛";s:2:"H";s:3:"圜";s:2:"G";s:3:"圞";s:2:"k";s:3:"土";s:2:"g";s:3:"圠";s:2:"Y";s:3:"圢";s:2:"n";s:3:"圣";s:2:"o";s:3:"在";s:2:"b";s:3:"圩";s:2:"f";s:3:"圪";s:2:"";s:3:"圬";s:2:"d";s:3:"圭";s:2:"c";s:3:"圮";s:2:"";s:3:"圯";s:2:"e";s:3:"地";s:2:"a";s:3:"圳";s:2:"`";s:3:"圴";s:2:"";s:3:"圻";s:2:"";s:3:"圾";s:2:"";s:3:"址";s:2:"}";s:3:"坁";s:2:"ʪ";s:3:"坅";s:2:"ʫ";s:3:"均";s:2:"";s:3:"坉";s:2:"ʭ";s:3:"坊";s:2:"{";s:3:"坋";s:2:"ʮ";s:3:"坌";s:2:"ʬ";s:3:"坍";s:2:"~";s:3:"坎";s:2:"";s:3:"坏";s:2:"";s:3:"坐";s:2:"";s:3:"坑";s:2:"|";s:3:"坒";s:2:"ʯ";s:3:"坡";s:2:"Y";s:3:"坢";s:2:"";s:3:"坤";s:2:"[";s:3:"坦";s:2:"Z";s:3:"坨";s:2:"@";s:3:"坩";s:2:"X";s:3:"坪";s:2:"W";s:3:"坫";s:2:"";s:3:"坭";s:2:"";s:3:"坯";s:2:"";s:3:"坰";s:2:"";s:3:"坱";s:2:"";s:3:"坲";s:2:"";s:3:"坳";s:2:"";s:3:"坴";s:2:"";s:3:"坵";s:2:"";s:3:"坶";s:2:"";s:3:"坷";s:2:"V";s:3:"坻";s:2:"";s:3:"坼";s:2:"\";s:3:"坽";s:2:"A";s:3:"垀";s:2:"";s:3:"垂";s:2:"";s:3:"垃";s:2:"U";s:3:"型";s:2:"";s:3:"垌";s:2:"T";s:3:"垏";s:2:"Z";s:3:"垓";s:2:"";s:3:"垔";s:2:"X";s:3:"垕";s:2:"^";s:3:"垗";s:2:"U";s:3:"垘";s:2:"Y";s:3:"垙";s:2:"[";s:3:"垚";s:2:"]";s:3:"垛";s:2:"W";s:3:"垝";s:2:"V";s:3:"垞";s:2:"Q";s:3:"垟";s:2:"R";s:3:"垠";s:2:"";s:3:"垢";s:2:"";s:3:"垣";s:2:"";s:3:"垤";s:2:"S";s:3:"垥";s:2:"\";s:3:"垮";s:2:"";s:3:"垵";s:2:"P";s:3:"垶";s:2:"S";s:3:"垸";s:2:"R";s:3:"垹";s:2:"W";s:3:"垺";s:2:"N";s:3:"垼";s:2:"Q";s:3:"垽";s:2:"P";s:3:"垿";s:2:"T";s:3:"埁";s:2:"X";s:3:"埂";s:2:"G";s:3:"埃";s:2:"J";s:3:"埆";s:2:"O";s:3:"埇";s:2:"U";s:3:"埋";s:2:"I";s:3:"埌";s:2:"J";s:3:"城";s:2:"";s:3:"埏";s:2:"Ժ";s:3:"埐";s:2:"V";s:3:"埒";s:2:"M";s:3:"埔";s:2:"H";s:3:"埕";s:2:"L";s:3:"埜";s:2:"Ա";s:3:"域";s:2:"";s:3:"埠";s:2:"";s:3:"埡";s:2:"";s:3:"埢";s:2:"ԯ";s:3:"埣";s:2:"Խ";s:3:"埤";s:2:"";s:3:"埥";s:2:"Կ";s:3:"埧";s:2:"";s:3:"埩";s:2:"";s:3:"埬";s:2:"";s:3:"埭";s:2:"Դ";s:3:"埮";s:2:"Լ";s:3:"埰";s:2:"";s:3:"埱";s:2:"";s:3:"埲";s:2:"Ծ";s:3:"埳";s:2:"Թ";s:3:"埴";s:2:"Բ";s:3:"埵";s:2:"ئ";s:3:"埶";s:2:"԰";s:3:"執";s:2:"";s:3:"埸";s:2:"Է";s:3:"培";s:2:"";s:3:"基";s:2:"";s:3:"埻";s:2:"ԭ";s:3:"埼";s:2:"";s:3:"埽";s:2:"Ե";s:3:"堀";s:2:"Գ";s:3:"堁";s:2:"";s:3:"堂";s:2:"";s:3:"堄";s:2:"";s:3:"堅";s:2:"";s:3:"堆";s:2:"";s:3:"堇";s:2:"Ի";s:3:"堈";s:2:"Զ";s:3:"堉";s:2:"K";s:3:"堊";s:2:"";s:3:"堋";s:2:"Ը";s:3:"堌";s:2:"";s:3:"堍";s:2:"";s:3:"堎";s:2:"";s:3:"堐";s:2:"";s:3:"堔";s:2:"Ԯ";s:3:"堙";s:2:"ء";s:3:"堛";s:2:"ت";s:3:"堜";s:2:"ة";s:3:"堝";s:2:"";s:3:"堞";s:2:"آ";s:3:"堠";s:2:"";s:3:"堡";s:2:"";s:3:"堣";s:2:"ؤ";s:3:"堤";s:2:"";s:3:"堥";s:2:"ب";s:3:"堧";s:2:"أ";s:3:"堨";s:2:"إ";s:3:"堩";s:2:"}";s:3:"堪";s:2:"";s:3:"堬";s:2:"ز";s:3:"堭";s:2:"ر";s:3:"堮";s:2:"خ";s:3:"堯";s:2:"";s:3:"堰";s:2:"";s:3:"報";s:2:"";s:3:"堲";s:2:"K";s:3:"堳";s:2:"ث";s:3:"場";s:2:"";s:3:"堵";s:2:"";s:3:"堶";s:2:"ح";s:3:"堷";s:2:"~";s:3:"堸";s:2:"ذ";s:3:"堹";s:2:"د";s:3:"堻";s:2:"س";s:3:"堽";s:2:"";s:3:"堿";s:2:"ج";s:3:"塈";s:2:"ا";s:3:"塉";s:2:"";s:3:"塊";s:2:"";s:3:"塋";s:2:"";s:3:"塌";s:2:"";s:3:"塍";s:2:"";s:3:"塎";s:2:"";s:3:"塏";s:2:"";s:3:"塑";s:2:"";s:3:"塒";s:2:"";s:3:"塓";s:2:"";s:3:"塔";s:2:"";s:3:"塕";s:2:"";s:3:"塗";s:2:"";s:3:"塘";s:2:"";s:3:"塙";s:2:"";s:3:"塚";s:2:"";s:3:"塛";s:2:"";s:3:"塝";s:2:"";s:3:"塞";s:2:"";s:3:"塢";s:2:"";s:3:"塣";s:2:"";s:3:"塤";s:2:"";s:3:"塥";s:2:"";s:3:"塨";s:2:"";s:3:"填";s:2:"";s:3:"塭";s:2:"";s:3:"塯";s:2:"";s:3:"塱";s:2:"";s:3:"塴";s:2:"]";s:3:"塵";s:2:"";s:3:"塶";s:2:"c";s:3:"塹";s:2:"";s:3:"塺";s:2:"_";s:3:"塻";s:2:"f";s:3:"塼";s:2:"W";s:3:"塽";s:2:"";s:3:"塾";s:2:"";s:3:"塿";s:2:"\";s:3:"墀";s:2:"U";s:3:"墁";s:2:"[";s:3:"墂";s:2:"d";s:3:"境";s:2:"";s:3:"墅";s:2:"";s:3:"墆";s:2:"Z";s:3:"墇";s:2:"`";s:3:"墈";s:2:"e";s:3:"墉";s:2:"V";s:3:"墊";s:2:"";s:3:"墋";s:2:"^";s:3:"墎";s:2:"b";s:3:"墏";s:2:"h";s:3:"墐";s:2:"X";s:3:"墑";s:2:"a";s:3:"墓";s:2:"";s:3:"墔";s:2:"g";s:3:"墘";s:2:"Y";s:3:"墜";s:2:"Y";s:3:"墝";s:2:"K";s:3:"增";s:2:"W";s:3:"墟";s:2:"V";s:3:"墠";s:2:"M";s:3:"墡";s:2:"R";s:3:"墣";s:2:"N";s:3:"墥";s:2:"Q";s:3:"墦";s:2:"\";s:3:"墨";s:2:"";s:3:"墩";s:2:"[";s:3:"墫";s:2:"J";s:3:"墬";s:2:"P";s:3:"墮";s:2:"Z";s:3:"墯";s:2:"O";s:3:"墱";s:2:"L";s:3:"墳";s:2:"X";s:3:"墺";s:2:"M";s:3:"墻";s:2:"";s:3:"墼";s:2:"O";s:3:"墽";s:2:"J";s:3:"墾";s:2:"";s:3:"墿";s:2:"L";s:3:"壁";s:2:"";s:3:"壂";s:2:"N";s:3:"壅";s:2:"";s:3:"壆";s:2:"P";s:3:"壇";s:2:"";s:3:"壈";s:2:"I";s:3:"壉";s:2:"K";s:3:"壎";s:2:"";s:3:"壏";s:2:"";s:3:"壑";s:2:"";s:3:"壒";s:2:"";s:3:"壓";s:2:"";s:3:"壔";s:2:"";s:3:"壕";s:2:"";s:3:"壖";s:2:"";s:3:"壘";s:2:"S";s:3:"壙";s:2:"R";s:3:"壚";s:2:"";s:3:"壛";s:2:"";s:3:"壝";s:2:"";s:3:"壞";s:2:"a";s:3:"壟";s:2:"b";s:3:"壢";s:2:"c";s:3:"壣";s:2:"B";s:3:"壤";s:2:"[";s:3:"壧";s:2:"";s:3:"壨";s:2:"";s:3:"壩";s:2:"";s:3:"士";s:2:"h";s:3:"壬";s:2:"";s:3:"壯";s:2:"";s:3:"壴";s:2:"_";s:3:"壹";s:2:"";s:3:"壺";s:2:"";s:3:"壼";s:2:"";s:3:"壽";s:2:"";s:3:"壾";s:2:"i";s:3:"壿";s:2:"S";s:3:"夃";s:2:"Z";s:3:"夆";s:2:"ʰ";s:3:"夌";s:2:"B";s:3:"复";s:2:"`";s:3:"夎";s:2:"Y";s:3:"夏";s:2:"L";s:3:"夒";s:2:"";s:3:"夔";s:2:"";s:3:"夕";s:2:"i";s:3:"外";s:2:"~";s:3:"夗";s:2:"p";s:3:"夙";s:2:"g";s:3:"多";s:2:"h";s:3:"夜";s:2:"]";s:3:"夠";s:2:"";s:3:"夢";s:2:"";s:3:"夤";s:2:"";s:3:"夥";s:2:"";s:3:"大";s:2:"j";s:3:"天";s:2:"";s:3:"太";s:2:"";s:3:"夫";s:2:"";s:3:"夬";s:2:"[";s:3:"夭";s:2:"";s:3:"央";s:2:"";s:3:"夯";s:2:"q";s:3:"失";s:2:"";s:3:"夷";s:2:"i";s:3:"夸";s:2:"j";s:3:"夼";s:2:"";s:3:"夾";s:2:"";s:3:"奀";s:2:"ʱ";s:3:"奄";s:2:"a";s:3:"奅";s:2:"C";s:3:"奇";s:2:"_";s:3:"奈";s:2:"`";s:3:"奉";s:2:"^";s:3:"奊";s:2:"Z";s:3:"奎";s:2:"";s:3:"奏";s:2:"";s:3:"奐";s:2:"";s:3:"契";s:2:"";s:3:"奓";s:2:"a";s:3:"奔";s:2:"b";s:3:"奕";s:2:"";s:3:"套";s:2:"M";s:3:"奘";s:2:"N";s:3:"奚";s:2:"O";s:3:"奜";s:2:"";s:3:"奠";s:2:"";s:3:"奡";s:2:"ش";s:3:"奢";s:2:"";s:3:"奧";s:2:"";s:3:"奩";s:2:"";s:3:"奪";s:2:"";s:3:"奫";s:2:"j";s:3:"奭";s:2:"]";s:3:"奮";s:2:"";s:3:"奰";s:2:"";s:3:"奱";s:2:"";s:3:"奲";s:2:"";s:3:"女";s:2:"k";s:3:"奴";s:2:"";s:3:"奶";s:2:"";s:3:"奷";s:2:"";s:3:"奸";s:2:"l";s:3:"她";s:2:"o";s:3:"奻";s:2:"";s:3:"奼";s:2:"";s:3:"好";s:2:"n";s:3:"奾";s:2:"";s:3:"奿";s:2:"";s:3:"妀";s:2:"";s:3:"妁";s:2:"q";s:3:"如";s:2:"p";s:3:"妃";s:2:"m";s:3:"妄";s:2:"k";s:3:"妅";s:2:"";s:3:"妊";s:2:"";s:3:"妍";s:2:"";s:3:"妎";s:2:"ʶ";s:3:"妏";s:2:"ʹ";s:3:"妐";s:2:"ʸ";s:3:"妒";s:2:"";s:3:"妓";s:2:"";s:3:"妖";s:2:"";s:3:"妗";s:2:"ʵ";s:3:"妘";s:2:"ʳ";s:3:"妙";s:2:"";s:3:"妝";s:2:"";s:3:"妞";s:2:"";s:3:"妠";s:2:"ʴ";s:3:"妡";s:2:"ʻ";s:3:"妢";s:2:"ʷ";s:3:"妣";s:2:"";s:3:"妤";s:2:"";s:3:"妥";s:2:"";s:3:"妦";s:2:"ʲ";s:3:"妧";s:2:"ʺ";s:3:"妨";s:2:"";s:3:"妮";s:2:"g";s:3:"妯";s:2:"o";s:3:"妱";s:2:"O";s:3:"妲";s:2:"H";s:3:"妳";s:2:"p";s:3:"妴";s:2:"S";s:3:"妵";s:2:"D";s:3:"妶";s:2:"K";s:3:"妹";s:2:"f";s:3:"妺";s:2:"E";s:3:"妻";s:2:"d";s:3:"妼";s:2:"L";s:3:"妽";s:2:"P";s:3:"妾";s:2:"c";s:3:"姀";s:2:"Q";s:3:"姁";s:2:"J";s:3:"姃";s:2:"M";s:3:"姅";s:2:"r";s:3:"姆";s:2:"i";s:3:"姇";s:2:"T";s:3:"姈";s:2:"R";s:3:"姊";s:2:"n";s:3:"始";s:2:"l";s:3:"姌";s:2:"I";s:3:"姍";s:2:"k";s:3:"姎";s:2:"G";s:3:"姏";s:2:"F";s:3:"姐";s:2:"j";s:3:"姑";s:2:"h";s:3:"姒";s:2:"q";s:3:"姓";s:2:"m";s:3:"委";s:2:"e";s:3:"姖";s:2:"N";s:3:"姘";s:2:"";s:3:"姚";s:2:"";s:3:"姛";s:2:"o";s:3:"姜";s:2:"";s:3:"姝";s:2:"g";s:3:"姞";s:2:"c";s:3:"姠";s:2:"s";s:3:"姡";s:2:"b";s:3:"姣";s:2:"";s:3:"姤";s:2:"l";s:3:"姥";s:2:"";s:3:"姦";s:2:"";s:3:"姨";s:2:"";s:3:"姩";s:2:"p";s:3:"姪";s:2:"";s:3:"姬";s:2:"V";s:3:"姭";s:2:"v";s:3:"姮";s:2:"d";s:3:"姱";s:2:"f";s:3:"姲";s:2:"m";s:3:"姳";s:2:"q";s:3:"姴";s:2:"u";s:3:"姵";s:2:"r";s:3:"姶";s:2:"k";s:3:"姷";s:2:"n";s:3:"姺";s:2:"h";s:3:"姻";s:2:"";s:3:"姼";s:2:"j";s:3:"姽";s:2:"i";s:3:"姾";s:2:"t";s:3:"姿";s:2:"";s:3:"娀";s:2:"e";s:3:"威";s:2:"";s:3:"娃";s:2:"";s:3:"娉";s:2:"\";s:3:"娊";s:2:"b";s:3:"娌";s:2:"[";s:3:"娏";s:2:"`";s:3:"娑";s:2:"P";s:3:"娓";s:2:"U";s:3:"娕";s:2:"_";s:3:"娖";s:2:"\";s:3:"娗";s:2:"a";s:3:"娘";s:2:"Q";s:3:"娙";s:2:"[";s:3:"娛";s:2:"T";s:3:"娜";s:2:"R";s:3:"娞";s:2:"c";s:3:"娟";s:2:"S";s:3:"娠";s:2:"W";s:3:"娣";s:2:"X";s:3:"娥";s:2:"Z";s:3:"娩";s:2:"Y";s:3:"娭";s:2:"]";s:3:"娮";s:2:"^";s:3:"娳";s:2:"d";s:3:"娵";s:2:"";s:3:"娶";s:2:"";s:3:"娷";s:2:"";s:3:"娸";s:2:"";s:3:"娹";s:2:"";s:3:"娼";s:2:"@";s:3:"娾";s:2:"";s:3:"婀";s:2:"";s:3:"婁";s:2:"";s:3:"婂";s:2:"";s:3:"婃";s:2:"";s:3:"婄";s:2:"";s:3:"婆";s:2:"C";s:3:"婇";s:2:"";s:3:"婈";s:2:"";s:3:"婉";s:2:"";s:3:"婊";s:2:"D";s:3:"婌";s:2:"";s:3:"婍";s:2:"";s:3:"婐";s:2:"";s:3:"婑";s:2:"";s:3:"婒";s:2:"";s:3:"婓";s:2:"";s:3:"婕";s:2:"";s:3:"婖";s:2:"";s:3:"婗";s:2:"";s:3:"婘";s:2:"";s:3:"婚";s:2:"B";s:3:"婛";s:2:"";s:3:"婜";s:2:"";s:3:"婝";s:2:"";s:3:"婞";s:2:"";s:3:"婟";s:2:"";s:3:"婠";s:2:"";s:3:"婢";s:2:"A";s:3:"婤";s:2:"";s:3:"婥";s:2:"";s:3:"婦";s:2:"";s:3:"婧";s:2:"";s:3:"婩";s:2:"";s:3:"婪";s:2:"";s:3:"婬";s:2:"";s:3:"婭";s:2:"";s:3:"婰";s:2:"";s:3:"婷";s:2:"@";s:3:"婸";s:2:"ػ";s:3:"婺";s:2:"ظ";s:3:"婻";s:2:"";s:3:"婼";s:2:"ؽ";s:3:"婽";s:2:"";s:3:"婿";s:2:"B";s:3:"媃";s:2:"";s:3:"媄";s:2:"";s:3:"媊";s:2:"";s:3:"媋";s:2:"";s:3:"媌";s:2:"";s:3:"媎";s:2:"";s:3:"媏";s:2:"";s:3:"媐";s:2:"G";s:3:"媒";s:2:"C";s:3:"媓";s:2:"";s:3:"媔";s:2:"ض";s:3:"媕";s:2:"";s:3:"媗";s:2:"";s:3:"媚";s:2:"A";s:3:"媛";s:2:"D";s:3:"媜";s:2:"";s:3:"媝";s:2:"";s:3:"媞";s:2:"غ";s:3:"媟";s:2:"ط";s:3:"媢";s:2:"ع";s:3:"媥";s:2:"ؾ";s:3:"媦";s:2:"ؼ";s:3:"媧";s:2:"E";s:3:"媩";s:2:"";s:3:"媬";s:2:"ؿ";s:3:"媮";s:2:"";s:3:"媯";s:2:"ص";s:3:"媰";s:2:"";s:3:"媱";s:2:"";s:3:"媲";s:2:"B";s:3:"媳";s:2:"@";s:3:"媴";s:2:"C";s:3:"媵";s:2:"";s:3:"媶";s:2:"D";s:3:"媷";s:2:"@";s:3:"媸";s:2:"";s:3:"媹";s:2:"F";s:3:"媺";s:2:"";s:3:"媻";s:2:"";s:3:"媼";s:2:"";s:3:"媽";s:2:"";s:3:"媾";s:2:"";s:3:"媿";s:2:"";s:3:"嫀";s:2:"A";s:3:"嫁";s:2:"";s:3:"嫂";s:2:"A";s:3:"嫄";s:2:"";s:3:"嫆";s:2:"";s:3:"嫇";s:2:"";s:3:"嫈";s:2:"";s:3:"嫉";s:2:"";s:3:"嫊";s:2:"B";s:3:"嫋";s:2:"";s:3:"嫌";s:2:"";s:3:"嫍";s:2:"E";s:3:"嫕";s:2:"n";s:3:"嫖";s:2:"";s:3:"嫗";s:2:"";s:3:"嫘";s:2:"";s:3:"嫙";s:2:"z";s:3:"嫚";s:2:"p";s:3:"嫛";s:2:"v";s:3:"嫜";s:2:"k";s:3:"嫝";s:2:"y";s:3:"嫞";s:2:"x";s:3:"嫟";s:2:"|";s:3:"嫠";s:2:"u";s:3:"嫡";s:2:"";s:3:"嫢";s:2:"t";s:3:"嫣";s:2:"";s:3:"嫥";s:2:"m";s:3:"嫦";s:2:"";s:3:"嫨";s:2:"{";s:3:"嫩";s:2:"";s:3:"嫪";s:2:"o";s:3:"嫫";s:2:"r";s:3:"嫬";s:2:"w";s:3:"嫭";s:2:"q";s:3:"嫮";s:2:"l";s:3:"嫳";s:2:"s";s:3:"嫴";s:2:"U";s:3:"嫵";s:2:"a";s:3:"嫶";s:2:"X";s:3:"嫷";s:2:"W";s:3:"嫸";s:2:"Z";s:3:"嫹";s:2:"\";s:3:"嫺";s:2:"";s:3:"嫻";s:2:"_";s:3:"嫽";s:2:"V";s:3:"嫿";s:2:"T";s:3:"嬁";s:2:"]";s:3:"嬂";s:2:"[";s:3:"嬃";s:2:"Y";s:3:"嬅";s:2:"_";s:3:"嬇";s:2:"^";s:3:"嬈";s:2:"c";s:3:"嬉";s:2:"^";s:3:"嬋";s:2:"`";s:3:"嬌";s:2:"b";s:3:"嬏";s:2:"`";s:3:"嬐";s:2:"W";s:3:"嬓";s:2:"V";s:3:"嬔";s:2:"U";s:3:"嬖";s:2:"X";s:3:"嬗";s:2:"Q";s:3:"嬙";s:2:"R";s:3:"嬚";s:2:"Z";s:3:"嬛";s:2:"S";s:3:"嬝";s:2:"";s:3:"嬞";s:2:"\";s:3:"嬠";s:2:"[";s:3:"嬡";s:2:"T";s:3:"嬣";s:2:"";s:3:"嬤";s:2:"";s:3:"嬥";s:2:"";s:3:"嬦";s:2:"";s:3:"嬧";s:2:"";s:3:"嬨";s:2:"Y";s:3:"嬪";s:2:"";s:3:"嬬";s:2:"";s:3:"嬭";s:2:"";s:3:"嬮";s:2:"";s:3:"嬯";s:2:"";s:3:"嬰";s:2:"";s:3:"嬲";s:2:"";s:3:"嬴";s:2:"";s:3:"嬸";s:2:"T";s:3:"嬼";s:2:"";s:3:"嬽";s:2:"";s:3:"嬾";s:2:"";s:3:"嬿";s:2:"";s:3:"孀";s:2:"\";s:3:"孃";s:2:"]";s:3:"孅";s:2:"C";s:3:"孇";s:2:"";s:3:"孈";s:2:"";s:3:"孋";s:2:"";s:3:"孌";s:2:"";s:3:"孍";s:2:"";s:3:"孎";s:2:"";s:3:"子";s:2:"l";s:3:"孑";s:2:"m";s:3:"孓";s:2:"n";s:3:"孔";s:2:"";s:3:"孕";s:2:"";s:3:"孖";s:2:"";s:3:"字";s:2:"r";s:3:"存";s:2:"s";s:3:"孚";s:2:"";s:3:"孛";s:2:"";s:3:"孜";s:2:"";s:3:"孝";s:2:"";s:3:"孟";s:2:"s";s:3:"孢";s:2:"U";s:3:"季";s:2:"u";s:3:"孤";s:2:"t";s:3:"孥";s:2:"V";s:3:"孩";s:2:"";s:3:"孫";s:2:"]";s:3:"孬";s:2:"e";s:3:"孮";s:2:"";s:3:"孰";s:2:"E";s:3:"孱";s:2:"G";s:3:"孲";s:2:"";s:3:"孳";s:2:"F";s:3:"孵";s:2:"";s:3:"孷";s:2:"}";s:3:"學";s:2:"";s:3:"孺";s:2:"";s:3:"孻";s:2:"";s:3:"孽";s:2:"^";s:3:"孿";s:2:"p";s:3:"宁";s:2:"r";s:3:"它";s:2:"";s:3:"宄";s:2:"s";s:3:"宅";s:2:"v";s:3:"宇";s:2:"t";s:3:"守";s:2:"u";s:3:"安";s:2:"w";s:3:"宋";s:2:"";s:3:"完";s:2:"";s:3:"宎";s:2:"ʼ";s:3:"宏";s:2:"";s:3:"宒";s:2:"ʽ";s:3:"宓";s:2:"W";s:3:"宕";s:2:"X";s:3:"宗";s:2:"v";s:3:"官";s:2:"x";s:3:"宙";s:2:"z";s:3:"定";s:2:"w";s:3:"宛";s:2:"{";s:3:"宜";s:2:"y";s:3:"客";s:2:"";s:3:"宣";s:2:"";s:3:"室";s:2:"";s:3:"宥";s:2:"";s:3:"宦";s:2:"";s:3:"宧";s:2:"f";s:3:"宨";s:2:"w";s:3:"宬";s:2:"h";s:3:"宭";s:2:"g";s:3:"宮";s:2:"c";s:3:"宰";s:2:"_";s:3:"害";s:2:"`";s:3:"宴";s:2:"b";s:3:"宵";s:2:"d";s:3:"家";s:2:"a";s:3:"宸";s:2:"f";s:3:"容";s:2:"e";s:3:"宿";s:2:"J";s:3:"寀";s:2:"";s:3:"寁";s:2:"";s:3:"寂";s:2:"I";s:3:"寄";s:2:"H";s:3:"寅";s:2:"G";s:3:"密";s:2:"K";s:3:"寇";s:2:"F";s:3:"寊";s:2:"";s:3:"寋";s:2:"";s:3:"富";s:2:"I";s:3:"寍";s:2:"";s:3:"寎";s:2:"";s:3:"寐";s:2:"K";s:3:"寑";s:2:"";s:3:"寒";s:2:"H";s:3:"寓";s:2:"J";s:3:"寔";s:2:"";s:3:"寖";s:2:"H";s:3:"寘";s:2:"I";s:3:"寙";s:2:"J";s:3:"寞";s:2:"";s:3:"察";s:2:"";s:3:"寠";s:2:"~";s:3:"寡";s:2:"";s:3:"寢";s:2:"";s:3:"寣";s:2:"";s:3:"寤";s:2:"";s:3:"寥";s:2:"";s:3:"實";s:2:"";s:3:"寧";s:2:"";s:3:"寨";s:2:"";s:3:"審";s:2:"f";s:3:"寪";s:2:"";s:3:"寫";s:2:"g";s:3:"寬";s:2:"e";s:3:"寮";s:2:"d";s:3:"寯";s:2:"]";s:3:"寰";s:2:"";s:3:"寱";s:2:"";s:3:"寲";s:2:"";s:3:"寵";s:2:"d";s:3:"寶";s:2:"_";s:3:"寸";s:2:"o";s:3:"寺";s:2:"x";s:3:"封";s:2:"";s:3:"尃";s:2:"i";s:3:"射";s:2:"g";s:3:"將";s:2:"N";s:3:"專";s:2:"M";s:3:"尉";s:2:"L";s:3:"尊";s:2:"L";s:3:"尋";s:2:"M";s:3:"尌";s:2:"";s:3:"對";s:2:"";s:3:"導";s:2:"";s:3:"小";s:2:"p";s:3:"尐";s:2:"\";s:3:"少";s:2:"";s:3:"尒";s:2:"t";s:3:"尕";s:2:"";s:3:"尖";s:2:"y";s:3:"尚";s:2:"|";s:3:"尟";s:2:"K";s:3:"尢";s:2:"q";s:3:"尤";s:2:"";s:3:"尥";s:2:"";s:3:"尨";s:2:"ʾ";s:3:"尪";s:2:"ʿ";s:3:"尬";s:2:"";s:3:"尰";s:2:"";s:3:"就";s:2:"N";s:3:"尳";s:2:"L";s:3:"尷";s:2:"";s:3:"尸";s:2:"r";s:3:"尹";s:2:"";s:3:"尺";s:2:"";s:3:"尻";s:2:"u";s:3:"尼";s:2:"";s:3:"尾";s:2:"";s:3:"尿";s:2:"";s:3:"局";s:2:"";s:3:"屁";s:2:"";s:3:"屄";s:2:"Y";s:3:"居";s:2:"~";s:3:"屆";s:2:"";s:3:"屇";s:2:"Z";s:3:"屈";s:2:"}";s:3:"屋";s:2:"";s:3:"屌";s:2:"x";s:3:"屍";s:2:"";s:3:"屎";s:2:"";s:3:"屏";s:2:"";s:3:"屐";s:2:"j";s:3:"屑";s:2:"h";s:3:"屔";s:2:"k";s:3:"展";s:2:"i";s:3:"屖";s:2:"j";s:3:"屘";s:2:"^";s:3:"屙";s:2:"";s:3:"屜";s:2:"P";s:3:"屝";s:2:"Q";s:3:"屠";s:2:"O";s:3:"屢";s:2:"";s:3:"屣";s:2:"";s:3:"層";s:2:"h";s:3:"履";s:2:"i";s:3:"屧";s:2:"a";s:3:"屨";s:2:"";s:3:"屩";s:2:"";s:3:"屪";s:2:"";s:3:"屬";s:2:"";s:3:"屭";s:2:"";s:3:"屮";s:2:"K";s:3:"屯";s:2:"";s:3:"山";s:2:"s";s:3:"屳";s:2:"w";s:3:"屴";s:2:"v";s:3:"屹";s:2:"z";s:3:"屺";s:2:"";s:3:"屻";s:2:"";s:3:"屼";s:2:"";s:3:"屾";s:2:"";s:3:"岆";s:2:"";s:3:"岈";s:2:"";s:3:"岉";s:2:"";s:3:"岊";s:2:"";s:3:"岋";s:2:"";s:3:"岌";s:2:"";s:3:"岍";s:2:"";s:3:"岏";s:2:"";s:3:"岐";s:2:"";s:3:"岑";s:2:"";s:3:"岒";s:2:"";s:3:"岓";s:2:"";s:3:"岔";s:2:"";s:3:"岕";s:2:"";s:3:"岝";s:2:"h";s:3:"岟";s:2:"b";s:3:"岠";s:2:"]";s:3:"岡";s:2:"";s:3:"岢";s:2:"e";s:3:"岣";s:2:"c";s:3:"岤";s:2:"\";s:3:"岥";s:2:"i";s:3:"岦";s:2:"l";s:3:"岧";s:2:"g";s:3:"岨";s:2:"`";s:3:"岩";s:2:"";s:3:"岪";s:2:"f";s:3:"岫";s:2:"";s:3:"岬";s:2:"a";s:3:"岭";s:2:"d";s:3:"岮";s:2:"[";s:3:"岯";s:2:"_";s:3:"岰";s:2:"k";s:3:"岱";s:2:"";s:3:"岳";s:2:"";s:3:"岵";s:2:"^";s:3:"岶";s:2:"j";s:3:"岷";s:2:"";s:3:"岸";s:2:"";s:3:"峆";s:2:"Ϋ";s:3:"峇";s:2:"Τ";s:3:"峈";s:2:"Ϊ";s:3:"峉";s:2:"Σ";s:3:"峊";s:2:"Υ";s:3:"峋";s:2:"}";s:3:"峌";s:2:"{";s:3:"峎";s:2:"ά";s:3:"峏";s:2:"Ω";s:3:"峐";s:2:"y";s:3:"峒";s:2:"";s:3:"峓";s:2:"Χ";s:3:"峔";s:2:"Ψ";s:3:"峖";s:2:"Φ";s:3:"峗";s:2:"|";s:3:"峘";s:2:"z";s:3:"峙";s:2:"";s:3:"峚";s:2:"΢";s:3:"峛";s:2:"~";s:3:"峞";s:2:"Ρ";s:3:"峟";s:2:"έ";s:3:"峨";s:2:"o";s:3:"峪";s:2:"n";s:3:"峬";s:2:"l";s:3:"峭";s:2:"k";s:3:"峮";s:2:"n";s:3:"峰";s:2:"p";s:3:"峱";s:2:"o";s:3:"峴";s:2:"s";s:3:"島";s:2:"q";s:3:"峷";s:2:"p";s:3:"峸";s:2:"ή";s:3:"峹";s:2:"r";s:3:"峻";s:2:"m";s:3:"峽";s:2:"l";s:3:"峿";s:2:"m";s:3:"崀";s:2:"q";s:3:"崁";s:2:"r";s:3:"崆";s:2:"S";s:3:"崇";s:2:"R";s:3:"崋";s:2:"";s:3:"崌";s:2:"";s:3:"崍";s:2:"";s:3:"崎";s:2:"T";s:3:"崏";s:2:"";s:3:"崑";s:2:"X";s:3:"崒";s:2:"A";s:3:"崔";s:2:"Z";s:3:"崖";s:2:"V";s:3:"崗";s:2:"^";s:3:"崙";s:2:"[";s:3:"崚";s:2:"";s:3:"崛";s:2:"U";s:3:"崝";s:2:"";s:3:"崞";s:2:"";s:3:"崟";s:2:"C";s:3:"崠";s:2:"";s:3:"崢";s:2:"W";s:3:"崣";s:2:"B";s:3:"崤";s:2:"\";s:3:"崥";s:2:"";s:3:"崦";s:2:"";s:3:"崧";s:2:"]";s:3:"崨";s:2:"";s:3:"崩";s:2:"Y";s:3:"崮";s:2:"D";s:3:"崰";s:2:"@";s:3:"崱";s:2:"";s:3:"崲";s:2:"";s:3:"崳";s:2:"";s:3:"崴";s:2:"Q";s:3:"崵";s:2:"";s:3:"崶";s:2:"";s:3:"崷";s:2:"";s:3:"崸";s:2:"";s:3:"崹";s:2:"";s:3:"崺";s:2:"";s:3:"崼";s:2:"";s:3:"崽";s:2:"";s:3:"崿";s:2:"";s:3:"嵀";s:2:"";s:3:"嵁";s:2:"";s:3:"嵂";s:2:"";s:3:"嵃";s:2:"";s:3:"嵅";s:2:"";s:3:"嵇";s:2:"R";s:3:"嵉";s:2:"";s:3:"嵊";s:2:"O";s:3:"嵋";s:2:"";s:3:"嵌";s:2:"O";s:3:"嵎";s:2:"";s:3:"嵐";s:2:"P";s:3:"嵑";s:2:"";s:3:"嵒";s:2:"";s:3:"嵕";s:2:"";s:3:"嵙";s:2:"";s:3:"嵞";s:2:"S";s:3:"嵢";s:2:"V";s:3:"嵣";s:2:"N";s:3:"嵥";s:2:"P";s:3:"嵧";s:2:"U";s:3:"嵨";s:2:"T";s:3:"嵩";s:2:"C";s:3:"嵫";s:2:"";s:3:"嵬";s:2:"R";s:3:"嵯";s:2:"D";s:3:"嵱";s:2:"M";s:3:"嵲";s:2:"Q";s:3:"嵷";s:2:"";s:3:"嵹";s:2:"";s:3:"嵺";s:2:"";s:3:"嵼";s:2:"";s:3:"嵽";s:2:"";s:3:"嵾";s:2:"";s:3:"嵿";s:2:"";s:3:"嶀";s:2:"";s:3:"嶁";s:2:"";s:3:"嶂";s:2:"";s:3:"嶄";s:2:"";s:3:"嶆";s:2:"";s:3:"嶇";s:2:"";s:3:"嶈";s:2:"";s:3:"嶉";s:2:"";s:3:"嶊";s:2:"";s:3:"嶍";s:2:"";s:3:"嶒";s:2:"e";s:3:"嶓";s:2:"g";s:3:"嶔";s:2:"k";s:3:"嶕";s:2:"h";s:3:"嶗";s:2:"c";s:3:"嶙";s:2:"b";s:3:"嶚";s:2:"l";s:3:"嶜";s:2:"j";s:3:"嶝";s:2:"j";s:3:"嶞";s:2:"m";s:3:"嶟";s:2:"d";s:3:"嶠";s:2:"i";s:3:"嶡";s:2:"k";s:3:"嶢";s:2:"f";s:3:"嶧";s:2:"a";s:3:"嶨";s:2:"f";s:3:"嶩";s:2:"`";s:3:"嶪";s:2:"e";s:3:"嶬";s:2:"^";s:3:"嶭";s:2:"h";s:3:"嶮";s:2:"d";s:3:"嶯";s:2:"i";s:3:"嶰";s:2:"c";s:3:"嶱";s:2:"_";s:3:"嶲";s:2:"g";s:3:"嶴";s:2:"j";s:3:"嶵";s:2:"b";s:3:"嶷";s:2:"";s:3:"嶸";s:2:"";s:3:"嶺";s:2:"";s:3:"嶼";s:2:"";s:3:"嶽";s:2:"";s:3:"巀";s:2:"";s:3:"巂";s:2:"r";s:3:"巃";s:2:"";s:3:"巆";s:2:"D";s:3:"巇";s:2:"E";s:3:"巉";s:2:"`";s:3:"巋";s:2:"";s:3:"巍";s:2:"";s:3:"巏";s:2:"";s:3:"巑";s:2:"";s:3:"巒";s:2:"r";s:3:"巔";s:2:"q";s:3:"巕";s:2:"";s:3:"巖";s:2:"";s:3:"巘";s:2:"";s:3:"川";s:2:"t";s:3:"州";s:2:"{";s:3:"巟";s:2:"";s:3:"巠";s:2:"";s:3:"巡";s:2:"";s:3:"巢";s:2:"_";s:3:"工";s:2:"u";s:3:"左";s:2:"";s:3:"巧";s:2:"";s:3:"巨";s:2:"";s:3:"巫";s:2:"";s:3:"差";s:2:"t";s:3:"巰";s:2:"W";s:3:"己";s:2:"v";s:3:"已";s:2:"w";s:3:"巳";s:2:"x";s:3:"巴";s:2:"";s:3:"巷";s:2:"";s:3:"巹";s:2:"ί";s:3:"巽";s:2:"S";s:3:"巾";s:2:"y";s:3:"巿";s:2:"]";s:3:"市";s:2:"";s:3:"布";s:2:"";s:3:"帄";s:2:"x";s:3:"帆";s:2:"|";s:3:"帊";s:2:"";s:3:"希";s:2:"";s:3:"帎";s:2:"";s:3:"帑";s:2:"";s:3:"帔";s:2:"n";s:3:"帕";s:2:"";s:3:"帖";s:2:"";s:3:"帗";s:2:"m";s:3:"帘";s:2:"";s:3:"帙";s:2:"o";s:3:"帚";s:2:"";s:3:"帛";s:2:"";s:3:"帝";s:2:"";s:3:"帟";s:2:"";s:3:"帠";s:2:"γ";s:3:"帡";s:2:"ΰ";s:3:"帢";s:2:"α";s:3:"帣";s:2:"β";s:3:"帤";s:2:"δ";s:3:"帥";s:2:"";s:3:"帨";s:2:"t";s:3:"帩";s:2:"s";s:3:"師";s:2:"v";s:3:"席";s:2:"u";s:3:"帳";s:2:"b";s:3:"帴";s:2:"F";s:3:"帶";s:2:"a";s:3:"帷";s:2:"c";s:3:"常";s:2:"`";s:3:"帽";s:2:"U";s:3:"帾";s:2:"E";s:3:"幀";s:2:"V";s:3:"幁";s:2:"";s:3:"幃";s:2:"W";s:3:"幄";s:2:"";s:3:"幅";s:2:"T";s:3:"幊";s:2:"Z";s:3:"幋";s:2:"\";s:3:"幌";s:2:"E";s:3:"幍";s:2:"[";s:3:"幎";s:2:"Y";s:3:"幏";s:2:"X";s:3:"幓";s:2:"";s:3:"幔";s:2:"";s:3:"幕";s:2:"";s:3:"幗";s:2:"";s:3:"幘";s:2:"";s:3:"幙";s:2:"";s:3:"幛";s:2:"";s:3:"幜";s:2:"q";s:3:"幝";s:2:"o";s:3:"幟";s:2:"m";s:3:"幠";s:2:"p";s:3:"幡";s:2:"n";s:3:"幢";s:2:"l";s:3:"幣";s:2:"";s:3:"幦";s:2:"m";s:3:"幧";s:2:"k";s:3:"幨";s:2:"l";s:3:"幩";s:2:"n";s:3:"幪";s:2:"";s:3:"幫";s:2:"";s:3:"幬";s:2:"";s:3:"幭";s:2:"";s:3:"幮";s:2:"";s:3:"幯";s:2:"n";s:3:"幰";s:2:"";s:3:"干";s:2:"z";s:3:"平";s:2:"";s:3:"年";s:2:"~";s:3:"幵";s:2:"";s:3:"并";s:2:"}";s:3:"幸";s:2:"";s:3:"幹";s:2:"F";s:3:"幻";s:2:"";s:3:"幼";s:2:"";s:3:"幽";s:2:"";s:3:"幾";s:2:"X";s:3:"庀";s:2:"y";s:3:"庂";s:2:"z";s:3:"庄";s:2:"";s:3:"庇";s:2:"";s:3:"庈";s:2:"";s:3:"庉";s:2:"";s:3:"床";s:2:"";s:3:"庋";s:2:"";s:3:"庌";s:2:"";s:3:"庍";s:2:"";s:3:"序";s:2:"";s:3:"底";s:2:"";s:3:"庖";s:2:"";s:3:"店";s:2:"";s:3:"庚";s:2:"";s:3:"庛";s:2:"θ";s:3:"府";s:2:"";s:3:"庠";s:2:"";s:3:"庢";s:2:"η";s:3:"庣";s:2:"ι";s:3:"庤";s:2:"ζ";s:3:"庥";s:2:"κ";s:3:"度";s:2:"";s:3:"座";s:2:"y";s:3:"庨";s:2:"u";s:3:"庪";s:2:"w";s:3:"庫";s:2:"w";s:3:"庬";s:2:"x";s:3:"庭";s:2:"x";s:3:"庮";s:2:"v";s:3:"庰";s:2:"ε";s:3:"庱";s:2:"G";s:3:"庲";s:2:"J";s:3:"庳";s:2:"K";s:3:"庴";s:2:"H";s:3:"庵";s:2:"g";s:3:"庶";s:2:"f";s:3:"康";s:2:"d";s:3:"庸";s:2:"e";s:3:"庹";s:2:"I";s:3:"庾";s:2:"h";s:3:"廁";s:2:"Z";s:3:"廂";s:2:"[";s:3:"廄";s:2:"\";s:3:"廅";s:2:"]";s:3:"廆";s:2:"_";s:3:"廇";s:2:"a";s:3:"廈";s:2:"H";s:3:"廉";s:2:"G";s:3:"廊";s:2:"Y";s:3:"廋";s:2:"`";s:3:"廌";s:2:"^";s:3:"廎";s:2:"";s:3:"廑";s:2:"";s:3:"廒";s:2:"";s:3:"廓";s:2:"";s:3:"廔";s:2:"";s:3:"廕";s:2:"";s:3:"廖";s:2:"";s:3:"廗";s:2:"";s:3:"廘";s:2:"";s:3:"廙";s:2:"";s:3:"廚";s:2:"p";s:3:"廛";s:2:"s";s:3:"廜";s:2:"";s:3:"廝";s:2:"r";s:3:"廞";s:2:"t";s:3:"廟";s:2:"q";s:3:"廠";s:2:"t";s:3:"廡";s:2:"u";s:3:"廢";s:2:"o";s:3:"廣";s:2:"s";s:3:"廥";s:2:"s";s:3:"廦";s:2:"q";s:3:"廧";s:2:"p";s:3:"廨";s:2:"r";s:3:"廩";s:2:"o";s:3:"廬";s:2:"f";s:3:"廮";s:2:"F";s:3:"廯";s:2:"G";s:3:"廱";s:2:"";s:3:"廲";s:2:"";s:3:"廳";s:2:"U";s:3:"延";s:2:"";s:3:"廷";s:2:"";s:3:"建";s:2:"";s:3:"廾";s:2:"{";s:3:"廿";s:2:"";s:3:"弁";s:2:"";s:3:"异";s:2:"";s:3:"弄";s:2:"";s:3:"弅";s:2:"";s:3:"弇";s:2:"λ";s:3:"弈";s:2:"";s:3:"弊";s:2:"";s:3:"弋";s:2:"|";s:3:"式";s:2:"";s:3:"弒";s:2:"I";s:3:"弓";s:2:"}";s:3:"弔";s:2:"";s:3:"引";s:2:"";s:3:"弗";s:2:"";s:3:"弘";s:2:"";s:3:"弚";s:2:"";s:3:"弛";s:2:"";s:3:"弝";s:2:"";s:3:"弟";s:2:"";s:3:"弢";s:2:"q";s:3:"弣";s:2:"r";s:3:"弤";s:2:"s";s:3:"弦";s:2:"";s:3:"弧";s:2:"";s:3:"弨";s:2:"p";s:3:"弩";s:2:"";s:3:"弭";s:2:"";s:3:"弮";s:2:"μ";s:3:"弰";s:2:"z";s:3:"弱";s:2:"z";s:3:"弳";s:2:"y";s:3:"張";s:2:"i";s:3:"弶";s:2:"L";s:3:"強";s:2:"j";s:3:"弸";s:2:"M";s:3:"弼";s:2:"]";s:3:"彀";s:2:"b";s:3:"彃";s:2:"";s:3:"彄";s:2:"";s:3:"彆";s:2:"";s:3:"彈";s:2:"u";s:3:"彉";s:2:"v";s:3:"彊";s:2:"";s:3:"彋";s:2:"t";s:3:"彌";s:2:"";s:3:"彎";s:2:"s";s:3:"彏";s:2:"";s:3:"彔";s:2:"t";s:3:"彖";s:2:"ν";s:3:"彗";s:2:"k";s:3:"彘";s:2:"";s:3:"彙";s:2:"J";s:3:"彝";s:2:"U";s:3:"形";s:2:"";s:3:"彤";s:2:"";s:3:"彥";s:2:"";s:3:"彧";s:2:"{";s:3:"彩";s:2:"m";s:3:"彪";s:2:"C";s:3:"彫";s:2:"n";s:3:"彬";s:2:"l";s:3:"彭";s:2:"^";s:3:"彯";s:2:"";s:3:"彰";s:2:"";s:3:"影";s:2:"v";s:3:"彳";s:2:"L";s:3:"彴";s:2:"";s:3:"彶";s:2:"";s:3:"彷";s:2:"";s:3:"彸";s:2:"";s:3:"役";s:2:"";s:3:"彼";s:2:"";s:3:"彽";s:2:"w";s:3:"彾";s:2:"v";s:3:"彿";s:2:"";s:3:"往";s:2:"";s:3:"征";s:2:"";s:3:"徂";s:2:"u";s:3:"待";s:2:"";s:3:"徆";s:2:"ξ";s:3:"徇";s:2:"";s:3:"很";s:2:"";s:3:"徉";s:2:"";s:3:"徊";s:2:"";s:3:"律";s:2:"";s:3:"後";s:2:"";s:3:"徐";s:2:"}";s:3:"徑";s:2:"|";s:3:"徒";s:2:"{";s:3:"徖";s:2:"O";s:3:"得";s:2:"o";s:3:"徘";s:2:"r";s:3:"徙";s:2:"p";s:3:"徛";s:2:"N";s:3:"徜";s:2:"u";s:3:"從";s:2:"q";s:3:"徟";s:2:"P";s:3:"徠";s:2:"t";s:3:"御";s:2:"s";s:3:"徥";s:2:"";s:3:"徦";s:2:"";s:3:"徨";s:2:"a";s:3:"復";s:2:"_";s:3:"循";s:2:"`";s:3:"徫";s:2:"";s:3:"徬";s:2:"K";s:3:"徭";s:2:"d";s:3:"微";s:2:"L";s:3:"徯";s:2:"c";s:3:"徲";s:2:"w";s:3:"徵";s:2:"x";s:3:"徶";s:2:"";s:3:"德";s:2:"w";s:3:"徹";s:2:"";s:3:"徻";s:2:"";s:3:"徼";s:2:"u";s:3:"徽";s:2:"";s:3:"徾";s:2:"";s:3:"徿";s:2:"@";s:3:"忀";s:2:"H";s:3:"忁";s:2:"I";s:3:"心";s:2:"";s:3:"必";s:2:"";s:3:"忉";s:2:"{";s:3:"忌";s:2:"";s:3:"忍";s:2:"";s:3:"忏";s:2:"";s:3:"忐";s:2:"";s:3:"忑";s:2:"";s:3:"忒";s:2:"";s:3:"忔";s:2:"";s:3:"忕";s:2:"";s:3:"忖";s:2:"";s:3:"志";s:2:"";s:3:"忘";s:2:"";s:3:"忙";s:2:"";s:3:"忝";s:2:"";s:3:"忞";s:2:"x";s:3:"忠";s:2:"";s:3:"忡";s:2:"";s:3:"忣";s:2:"";s:3:"忤";s:2:"";s:3:"忥";s:2:"y";s:3:"忨";s:2:"";s:3:"忪";s:2:"";s:3:"快";s:2:"";s:3:"忭";s:2:"";s:3:"忮";s:2:"";s:3:"忯";s:2:"";s:3:"忱";s:2:"";s:3:"忳";s:2:"";s:3:"忴";s:2:"";s:3:"念";s:2:"";s:3:"忷";s:2:"";s:3:"忸";s:2:"";s:3:"忺";s:2:"";s:3:"忻";s:2:"";s:3:"忽";s:2:"";s:3:"忿";s:2:"";s:3:"怀";s:2:"";s:3:"怉";s:2:"̯";s:3:"怊";s:2:"̢";s:3:"怋";s:2:"~";s:3:"怌";s:2:"̮";s:3:"怍";s:2:"̩";s:3:"怎";s:2:"";s:3:"怏";s:2:"";s:3:"怐";s:2:"̪";s:3:"怑";s:2:"̭";s:3:"怒";s:2:"";s:3:"怓";s:2:"̬";s:3:"怔";s:2:"";s:3:"怕";s:2:"";s:3:"怖";s:2:"";s:3:"怗";s:2:"̣";s:3:"怙";s:2:"|";s:3:"怚";s:2:"̥";s:3:"怛";s:2:"";s:3:"怜";s:2:"̰";s:3:"思";s:2:"";s:3:"怞";s:2:"̦";s:3:"怠";s:2:"";s:3:"怡";s:2:"";s:3:"怢";s:2:"̨";s:3:"怤";s:2:"";s:3:"急";s:2:"";s:3:"怦";s:2:"{";s:3:"性";s:2:"";s:3:"怨";s:2:"";s:3:"怩";s:2:"";s:3:"怪";s:2:"";s:3:"怫";s:2:"";s:3:"怬";s:2:"̧";s:3:"怭";s:2:"z";s:3:"怮";s:2:"̫";s:3:"怯";s:2:"";s:3:"怲";s:2:"}";s:3:"怳";s:2:"̤";s:3:"怴";s:2:"̡";s:3:"怵";s:2:"";s:3:"怷";s:2:"ο";s:3:"怹";s:2:"";s:3:"恀";s:2:"";s:3:"恁";s:2:"ѡ";s:3:"恂";s:2:"";s:3:"恃";s:2:"";s:3:"恄";s:2:"";s:3:"恅";s:2:"";s:3:"恆";s:2:"";s:3:"恇";s:2:"";s:3:"恉";s:2:"";s:3:"恌";s:2:"";s:3:"恍";s:2:"";s:3:"恐";s:2:"";s:3:"恒";s:2:"";s:3:"恓";s:2:"";s:3:"恔";s:2:"";s:3:"恕";s:2:"";s:3:"恘";s:2:"";s:3:"恙";s:2:"~";s:3:"恚";s:2:"}";s:3:"恛";s:2:"";s:3:"恝";s:2:"|";s:3:"恞";s:2:"";s:3:"恟";s:2:"";s:3:"恢";s:2:"";s:3:"恣";s:2:"";s:3:"恤";s:2:"";s:3:"恥";s:2:"";s:3:"恦";s:2:"";s:3:"恧";s:2:"~";s:3:"恨";s:2:"";s:3:"恩";s:2:"";s:3:"恪";s:2:"";s:3:"恫";s:2:"";s:3:"恬";s:2:"";s:3:"恭";s:2:"";s:3:"恮";s:2:"";s:3:"息";s:2:"";s:3:"恰";s:2:"";s:3:"恲";s:2:"";s:3:"恿";s:2:"v";s:3:"悀";s:2:"Ѥ";s:3:"悁";s:2:"Ѧ";s:3:"悃";s:2:"Ѩ";s:3:"悄";s:2:"";s:3:"悅";s:2:"";s:3:"悆";s:2:"S";s:3:"悇";s:2:"Ѭ";s:3:"悈";s:2:"ѣ";s:3:"悉";s:2:"x";s:3:"悊";s:2:"Q";s:3:"悌";s:2:"";s:3:"悍";s:2:"";s:3:"悎";s:2:"Ѯ";s:3:"悐";s:2:"R";s:3:"悒";s:2:"ѥ";s:3:"悔";s:2:"";s:3:"悕";s:2:"ѩ";s:3:"悖";s:2:"";s:3:"悗";s:2:"ѫ";s:3:"悚";s:2:"";s:3:"悛";s:2:"Ѫ";s:3:"悜";s:2:"ѭ";s:3:"悝";s:2:"ѧ";s:3:"悟";s:2:"";s:3:"悠";s:2:"y";s:3:"悢";s:2:"Ѣ";s:3:"患";s:2:"w";s:3:"您";s:2:"z";s:3:"悰";s:2:"U";s:3:"悱";s:2:"^";s:3:"悲";s:2:"d";s:3:"悴";s:2:"|";s:3:"悵";s:2:"";s:3:"悶";s:2:"e";s:3:"悷";s:2:"`";s:3:"悸";s:2:"";s:3:"悹";s:2:"";s:3:"悺";s:2:"V";s:3:"悻";s:2:"";s:3:"悼";s:2:"";s:3:"悽";s:2:"~";s:3:"悾";s:2:"T";s:3:"悿";s:2:"b";s:3:"惀";s:2:"e";s:3:"惁";s:2:"I";s:3:"惃";s:2:"c";s:3:"惄";s:2:"";s:3:"情";s:2:"";s:3:"惆";s:2:"";s:3:"惇";s:2:"";s:3:"惈";s:2:"]";s:3:"惉";s:2:"";s:3:"惊";s:2:"a";s:3:"惋";s:2:"{";s:3:"惌";s:2:"";s:3:"惍";s:2:"d";s:3:"惎";s:2:"";s:3:"惏";s:2:"Y";s:3:"惑";s:2:"b";s:3:"惓";s:2:"W";s:3:"惔";s:2:"X";s:3:"惕";s:2:"";s:3:"惘";s:2:"";s:3:"惙";s:2:"[";s:3:"惚";s:2:"";s:3:"惛";s:2:"_";s:3:"惜";s:2:"";s:3:"惝";s:2:"\";s:3:"惟";s:2:"";s:3:"惠";s:2:"f";s:3:"惡";s:2:"c";s:3:"惢";s:2:"";s:3:"惤";s:2:"Z";s:3:"惦";s:2:"}";s:3:"惰";s:2:"k";s:3:"惱";s:2:"o";s:3:"惲";s:2:"@";s:3:"想";s:2:"Q";s:3:"惴";s:2:"m";s:3:"惵";s:2:"D";s:3:"惶";s:2:"q";s:3:"惷";s:2:"e";s:3:"惸";s:2:"F";s:3:"惹";s:2:"S";s:3:"惺";s:2:"i";s:3:"惻";s:2:"l";s:3:"惼";s:2:"G";s:3:"惾";s:2:"H";s:3:"惿";s:2:"N";s:3:"愀";s:2:"s";s:3:"愁";s:2:"T";s:3:"愃";s:2:"J";s:3:"愄";s:2:"O";s:3:"愅";s:2:"C";s:3:"愆";s:2:"^";s:3:"愈";s:2:"U";s:3:"愉";s:2:"r";s:3:"愊";s:2:"A";s:3:"愋";s:2:"P";s:3:"愍";s:2:"]";s:3:"愎";s:2:"p";s:3:"意";s:2:"N";s:3:"愐";s:2:"M";s:3:"愒";s:2:"t";s:3:"愓";s:2:"E";s:3:"愔";s:2:"";s:3:"愕";s:2:"j";s:3:"愖";s:2:"B";s:3:"愘";s:2:"K";s:3:"愚";s:2:"M";s:3:"愛";s:2:"R";s:3:"愜";s:2:"g";s:3:"愝";s:2:"L";s:3:"感";s:2:"P";s:3:"愣";s:2:"h";s:3:"愧";s:2:"\";s:3:"愨";s:2:"";s:3:"愩";s:2:"p";s:3:"愫";s:2:"h";s:3:"愬";s:2:"";s:3:"愮";s:2:"l";s:3:"愯";s:2:"n";s:3:"愲";s:2:"k";s:3:"愴";s:2:"[";s:3:"愶";s:2:"j";s:3:"愷";s:2:"_";s:3:"愻";s:2:"";s:3:"愾";s:2:"Z";s:3:"愿";s:2:"@";s:3:"慀";s:2:"q";s:3:"慁";s:2:"";s:3:"慄";s:2:"X";s:3:"慅";s:2:"i";s:3:"慆";s:2:"m";s:3:"慇";s:2:"";s:3:"慈";s:2:"O";s:3:"慉";s:2:"f";s:3:"慊";s:2:"g";s:3:"態";s:2:"A";s:3:"慌";s:2:"W";s:3:"慍";s:2:"Y";s:3:"慎";s:2:"V";s:3:"慏";s:2:"o";s:3:"慒";s:2:"";s:3:"慓";s:2:"";s:3:"慔";s:2:"";s:3:"慕";s:2:"}";s:3:"慖";s:2:"";s:3:"慘";s:2:"G";s:3:"慚";s:2:"F";s:3:"慛";s:2:"";s:3:"慝";s:2:"|";s:3:"慞";s:2:"";s:3:"慟";s:2:"E";s:3:"慡";s:2:"";s:3:"慢";s:2:"C";s:3:"慣";s:2:"D";s:3:"慥";s:2:"";s:3:"慦";s:2:"";s:3:"慧";s:2:"z";s:3:"慨";s:2:"n";s:3:"慪";s:2:"";s:3:"慫";s:2:"";s:3:"慬";s:2:"";s:3:"慮";s:2:"{";s:3:"慰";s:2:"";s:3:"慱";s:2:"";s:3:"慲";s:2:"";s:3:"慳";s:2:"";s:3:"慴";s:2:"";s:3:"慵";s:2:"H";s:3:"慶";s:2:"y";s:3:"慷";s:2:"B";s:3:"慹";s:2:"z";s:3:"慺";s:2:"";s:3:"慼";s:2:"";s:3:"慾";s:2:"";s:3:"憀";s:2:"";s:3:"憂";s:2:"~";s:3:"憃";s:2:"y";s:3:"憉";s:2:"~";s:3:"憊";s:2:"";s:3:"憋";s:2:"x";s:3:"憌";s:2:"";s:3:"憍";s:2:"";s:3:"憎";s:2:"";s:3:"憐";s:2:"";s:3:"憑";s:2:"";s:3:"憒";s:2:"";s:3:"憓";s:2:"";s:3:"憔";s:2:"";s:3:"憖";s:2:"x";s:3:"憚";s:2:"";s:3:"憛";s:2:"";s:3:"憝";s:2:"v";s:3:"憟";s:2:"";s:3:"憡";s:2:"";s:3:"憢";s:2:"}";s:3:"憤";s:2:"";s:3:"憧";s:2:"";s:3:"憨";s:2:"w";s:3:"憩";s:2:"";s:3:"憪";s:2:"";s:3:"憫";s:2:"";s:3:"憬";s:2:"";s:3:"憭";s:2:"";s:3:"憮";s:2:"";s:3:"憯";s:2:"";s:3:"憰";s:2:"|";s:3:"憱";s:2:"{";s:3:"憲";s:2:"";s:3:"憳";s:2:"";s:3:"憴";s:2:"z";s:3:"憵";s:2:"";s:3:"憶";s:2:"";s:3:"憸";s:2:"";s:3:"憺";s:2:"~";s:3:"憼";s:2:"";s:3:"憾";s:2:"";s:3:"憿";s:2:"";s:3:"懁";s:2:"|";s:3:"懂";s:2:"";s:3:"懃";s:2:"";s:3:"懅";s:2:"y";s:3:"懆";s:2:"{";s:3:"懇";s:2:"";s:3:"懈";s:2:"";s:3:"應";s:2:"";s:3:"懊";s:2:"";s:3:"懋";s:2:"";s:3:"懌";s:2:"}";s:3:"懍";s:2:"";s:3:"懖";s:2:"";s:3:"懘";s:2:"";s:3:"懞";s:2:"";s:3:"懟";s:2:"";s:3:"懠";s:2:"";s:3:"懣";s:2:"V";s:3:"懤";s:2:"";s:3:"懥";s:2:"";s:3:"懦";s:2:"";s:3:"懧";s:2:"";s:3:"懨";s:2:"";s:3:"懩";s:2:"";s:3:"懪";s:2:"";s:3:"懫";s:2:"";s:3:"懭";s:2:"";s:3:"懮";s:2:"";s:3:"懰";s:2:"";s:3:"懱";s:2:"";s:3:"懲";s:2:"g";s:3:"懵";s:2:"j";s:3:"懶";s:2:"i";s:3:"懷";s:2:"h";s:3:"懸";s:2:"a";s:3:"懹";s:2:"J";s:3:"懺";s:2:"b";s:3:"懻";s:2:"A";s:3:"懼";s:2:"";s:3:"懽";s:2:"";s:3:"懾";s:2:"";s:3:"懿";s:2:"t";s:3:"戀";s:2:"";s:3:"戁";s:2:"";s:3:"戃";s:2:"";s:3:"戄";s:2:"";s:3:"戇";s:2:"";s:3:"戈";s:2:"";s:3:"戉";s:2:"|";s:3:"戊";s:2:"";s:3:"戌";s:2:"";s:3:"戍";s:2:"";s:3:"戎";s:2:"";s:3:"成";s:2:"";s:3:"我";s:2:"";s:3:"戒";s:2:"";s:3:"戔";s:2:"̱";s:3:"戕";s:2:"";s:3:"或";s:2:"";s:3:"戙";s:2:"ѯ";s:3:"戚";s:2:"";s:3:"戛";s:2:"";s:3:"戟";s:2:"u";s:3:"戠";s:2:"r";s:3:"戡";s:2:"`";s:3:"戢";s:2:"a";s:3:"戣";s:2:"t";s:3:"戤";s:2:"v";s:3:"戥";s:2:"u";s:3:"戧";s:2:"";s:3:"戩";s:2:"";s:3:"截";s:2:"I";s:3:"戫";s:2:"";s:3:"戭";s:2:"";s:3:"戮";s:2:"";s:3:"戰";s:2:"";s:3:"戲";s:2:"";s:3:"戳";s:2:"W";s:3:"戴";s:2:"";s:3:"戶";s:2:"";s:3:"戺";s:2:"";s:3:"戽";s:2:"̲";s:3:"戾";s:2:"";s:3:"房";s:2:"";s:3:"所";s:2:"";s:3:"扁";s:2:"";s:3:"扂";s:2:"";s:3:"扃";s:2:"";s:3:"扆";s:2:"Ѱ";s:3:"扇";s:2:"";s:3:"扈";s:2:"";s:3:"扉";s:2:"v";s:3:"扊";s:2:"Q";s:3:"手";s:2:"";s:3:"才";s:2:"~";s:3:"扎";s:2:"";s:3:"扐";s:2:"}";s:3:"扑";s:2:"";s:3:"扒";s:2:"";s:3:"打";s:2:"";s:3:"扔";s:2:"";s:3:"托";s:2:"";s:3:"扙";s:2:"";s:3:"扚";s:2:"";s:3:"扛";s:2:"";s:3:"扜";s:2:"";s:3:"扞";s:2:"";s:3:"扠";s:2:"";s:3:"扡";s:2:"";s:3:"扢";s:2:"";s:3:"扣";s:2:"";s:3:"扤";s:2:"";s:3:"扥";s:2:"";s:3:"扦";s:2:"";s:3:"扭";s:2:"";s:3:"扮";s:2:"";s:3:"扯";s:2:"";s:3:"扰";s:2:"";s:3:"扱";s:2:"";s:3:"扲";s:2:"";s:3:"扳";s:2:"";s:3:"扴";s:2:"";s:3:"扶";s:2:"";s:3:"扷";s:2:"";s:3:"批";s:2:"";s:3:"扺";s:2:"";s:3:"扻";s:2:"";s:3:"扼";s:2:"";s:3:"扽";s:2:"";s:3:"找";s:2:"";s:3:"承";s:2:"";s:3:"技";s:2:"";s:3:"抁";s:2:"";s:3:"抃";s:2:"";s:3:"抄";s:2:"";s:3:"抆";s:2:"";s:3:"抇";s:2:"";s:3:"抈";s:2:"";s:3:"抉";s:2:"";s:3:"把";s:2:"";s:3:"抌";s:2:"";s:3:"抎";s:2:"";s:3:"抏";s:2:"";s:3:"抑";s:2:"";s:3:"抒";s:2:"";s:3:"抓";s:2:"";s:3:"抔";s:2:"";s:3:"投";s:2:"";s:3:"抖";s:2:"";s:3:"抗";s:2:"";s:3:"折";s:2:"";s:3:"抨";s:2:"";s:3:"抩";s:2:"̾";s:3:"抪";s:2:"̷";s:3:"披";s:2:"";s:3:"抬";s:2:"";s:3:"抭";s:2:"̳";s:3:"抮";s:2:"̺";s:3:"抯";s:2:"̼";s:3:"抰";s:2:"̿";s:3:"抱";s:2:"";s:3:"抳";s:2:"̻";s:3:"抴";s:2:"̴";s:3:"抵";s:2:"";s:3:"抶";s:2:"̸";s:3:"抸";s:2:"";s:3:"抹";s:2:"";s:3:"抻";s:2:"̽";s:3:"押";s:2:"";s:3:"抽";s:2:"";s:3:"抾";s:2:"̶";s:3:"抿";s:2:"";s:3:"拂";s:2:"";s:3:"拄";s:2:"";s:3:"拆";s:2:"";s:3:"拇";s:2:"";s:3:"拈";s:2:"";s:3:"拉";s:2:"";s:3:"拊";s:2:"̹";s:3:"拋";s:2:"";s:3:"拌";s:2:"";s:3:"拍";s:2:"";s:3:"拎";s:2:"";s:3:"拏";s:2:"";s:3:"拐";s:2:"";s:3:"拑";s:2:"̵";s:3:"拒";s:2:"";s:3:"拓";s:2:"";s:3:"拔";s:2:"";s:3:"拖";s:2:"";s:3:"拗";s:2:"";s:3:"拘";s:2:"";s:3:"拙";s:2:"";s:3:"拚";s:2:"";s:3:"招";s:2:"";s:3:"拜";s:2:"";s:3:"拫";s:2:"";s:3:"括";s:2:"A";s:3:"拭";s:2:"";s:3:"拮";s:2:"";s:3:"拯";s:2:"@";s:3:"拰";s:2:"";s:3:"拱";s:2:"";s:3:"拲";s:2:"ѱ";s:3:"拳";s:2:"";s:3:"拴";s:2:"C";s:3:"拵";s:2:"";s:3:"拶";s:2:"";s:3:"拷";s:2:"";s:3:"拸";s:2:"";s:3:"拹";s:2:"";s:3:"拺";s:2:"";s:3:"拻";s:2:"";s:3:"拼";s:2:"";s:3:"拽";s:2:"";s:3:"拾";s:2:"B";s:3:"拿";s:2:"";s:3:"挀";s:2:"";s:3:"持";s:2:"";s:3:"挂";s:2:"E";s:3:"挃";s:2:"";s:3:"指";s:2:"";s:3:"挈";s:2:"";s:3:"按";s:2:"";s:3:"挋";s:2:"";s:3:"挌";s:2:"";s:3:"挍";s:2:"";s:3:"挎";s:2:"";s:3:"挏";s:2:"";s:3:"挐";s:2:"Ѳ";s:3:"挑";s:2:"D";s:3:"挓";s:2:"";s:3:"挔";s:2:"";s:3:"挕";s:2:"";s:3:"挖";s:2:"";s:3:"挨";s:2:"";s:3:"挩";s:2:"Ѿ";s:3:"挪";s:2:"";s:3:"挫";s:2:"";s:3:"挬";s:2:"Ѵ";s:3:"挭";s:2:"";s:3:"振";s:2:"";s:3:"挲";s:2:"f";s:3:"挳";s:2:"";s:3:"挴";s:2:"";s:3:"挶";s:2:"ѷ";s:3:"挸";s:2:"";s:3:"挹";s:2:"Ѻ";s:3:"挺";s:2:"";s:3:"挻";s:2:"}";s:3:"挼";s:2:"ѽ";s:3:"挽";s:2:"";s:3:"挾";s:2:"";s:3:"捀";s:2:"";s:3:"捁";s:2:"ѿ";s:3:"捂";s:2:"";s:3:"捃";s:2:"Ѹ";s:3:"捄";s:2:"ѵ";s:3:"捅";s:2:"Ѷ";s:3:"捆";s:2:"";s:3:"捇";s:2:"";s:3:"捈";s:2:"";s:3:"捉";s:2:"";s:3:"捊";s:2:"Ѽ";s:3:"捋";s:2:"ѻ";s:3:"捌";s:2:"";s:3:"捍";s:2:"";s:3:"捎";s:2:"";s:3:"捏";s:2:"";s:3:"捐";s:2:"";s:3:"捑";s:2:"";s:3:"捔";s:2:"";s:3:"捕";s:2:"";s:3:"捖";s:2:"ѳ";s:3:"捗";s:2:"";s:3:"捘";s:2:"";s:3:"捙";s:2:"";s:3:"捚";s:2:"";s:3:"捥";s:2:"g";s:3:"捧";s:2:"";s:3:"捨";s:2:"";s:3:"捩";s:2:"";s:3:"捫";s:2:"";s:3:"捭";s:2:"y";s:3:"据";s:2:"u";s:3:"捯";s:2:"r";s:3:"捰";s:2:"զ";s:3:"捱";s:2:"";s:3:"捲";s:2:"";s:3:"捵";s:2:"w";s:3:"捶";s:2:"";s:3:"捷";s:2:"";s:3:"捸";s:2:"ա";s:3:"捺";s:2:"";s:3:"捻";s:2:"";s:3:"捼";s:2:"{";s:3:"捽";s:2:"j";s:3:"掀";s:2:"";s:3:"掁";s:2:"գ";s:3:"掂";s:2:"i";s:3:"掃";s:2:"";s:3:"掄";s:2:"";s:3:"掅";s:2:"բ";s:3:"掇";s:2:"s";s:3:"授";s:2:"";s:3:"掉";s:2:"";s:3:"掊";s:2:"h";s:3:"掌";s:2:"x";s:3:"掍";s:2:"ե";s:3:"掎";s:2:"q";s:3:"掏";s:2:"";s:3:"掐";s:2:"t";s:3:"掑";s:2:"դ";s:3:"排";s:2:"";s:3:"掔";s:2:"R";s:3:"掖";s:2:"";s:3:"掗";s:2:"o";s:3:"掘";s:2:"";s:3:"掙";s:2:"";s:3:"掛";s:2:"";s:3:"掜";s:2:"x";s:3:"掝";s:2:"n";s:3:"掞";s:2:"l";s:3:"掟";s:2:"~";s:3:"掠";s:2:"";s:3:"採";s:2:"";s:3:"探";s:2:"";s:3:"掣";s:2:"w";s:3:"掤";s:2:"|";s:3:"接";s:2:"";s:3:"控";s:2:"";s:3:"推";s:2:"";s:3:"掩";s:2:"";s:3:"措";s:2:"";s:3:"掫";s:2:"p";s:3:"掬";s:2:"";s:3:"掭";s:2:"m";s:3:"掮";s:2:"z";s:3:"掯";s:2:"v";s:3:"掰";s:2:"T";s:3:"掱";s:2:"S";s:3:"掽";s:2:"k";s:3:"掾";s:2:"d";s:3:"揀";s:2:"z";s:3:"揂";s:2:"j";s:3:"揃";s:2:"Y";s:3:"揄";s:2:"g";s:3:"揅";s:2:"w";s:3:"揆";s:2:"}";s:3:"揇";s:2:"k";s:3:"揈";s:2:"n";s:3:"揉";s:2:"|";s:3:"揊";s:2:"\";s:3:"揋";s:2:"m";s:3:"揌";s:2:"l";s:3:"揍";s:2:"~";s:3:"揎";s:2:"U";s:3:"描";s:2:"y";s:3:"提";s:2:"";s:3:"插";s:2:"";s:3:"揓";s:2:"i";s:3:"揕";s:2:"_";s:3:"揖";s:2:"";s:3:"揗";s:2:"p";s:3:"揘";s:2:"h";s:3:"揙";s:2:"q";s:3:"揚";s:2:"";s:3:"換";s:2:"";s:3:"揜";s:2:"f";s:3:"揝";s:2:"e";s:3:"揟";s:2:"c";s:3:"揠";s:2:"]";s:3:"握";s:2:"";s:3:"揣";s:2:"";s:3:"揤";s:2:"ѹ";s:3:"揥";s:2:"V";s:3:"揧";s:2:"ݷ";s:3:"揨";s:2:"W";s:3:"揩";s:2:"{";s:3:"揪";s:2:"";s:3:"揫";s:2:"y";s:3:"揭";s:2:"";s:3:"揮";s:2:"";s:3:"揯";s:2:"X";s:3:"揰";s:2:"o";s:3:"揱";s:2:"x";s:3:"揲";s:2:"`";s:3:"揳";s:2:"[";s:3:"援";s:2:"";s:3:"揵";s:2:"a";s:3:"揶";s:2:"^";s:3:"揹";s:2:"";s:3:"搆";s:2:"p";s:3:"搉";s:2:"|";s:3:"搊";s:2:"ݱ";s:3:"搋";s:2:"ݶ";s:3:"搌";s:2:"ݪ";s:3:"損";s:2:"l";s:3:"搎";s:2:"ݻ";s:3:"搏";s:2:"i";s:3:"搐";s:2:"z";s:3:"搒";s:2:"{";s:3:"搓";s:2:"b";s:3:"搔";s:2:"k";s:3:"搕";s:2:"ݤ";s:3:"搖";s:2:"n";s:3:"搗";s:2:"o";s:3:"搘";s:2:"ݥ";s:3:"搚";s:2:"ݲ";s:3:"搛";s:2:"ݸ";s:3:"搜";s:2:"j";s:3:"搞";s:2:"d";s:3:"搟";s:2:"ݣ";s:3:"搠";s:2:"}";s:3:"搡";s:2:"ݺ";s:3:"搢";s:2:"ݨ";s:3:"搣";s:2:"ݩ";s:3:"搤";s:2:"~";s:3:"搥";s:2:"ݴ";s:3:"搦";s:2:"ݫ";s:3:"搧";s:2:"ݵ";s:3:"搨";s:2:"ݭ";s:3:"搪";s:2:"e";s:3:"搫";s:2:"";s:3:"搬";s:2:"h";s:3:"搭";s:2:"f";s:3:"搮";s:2:"ݹ";s:3:"搯";s:2:"ݰ";s:3:"搰";s:2:"ݬ";s:3:"搳";s:2:"ݡ";s:3:"搴";s:2:"S";s:3:"搵";s:2:"ݯ";s:3:"搶";s:2:"m";s:3:"搷";s:2:"ݧ";s:3:"搹";s:2:"ݦ";s:3:"搽";s:2:"g";s:3:"搾";s:2:"c";s:3:"搿";s:2:"";s:3:"摀";s:2:"ݳ";s:3:"摁";s:2:"ݮ";s:3:"摃";s:2:"ݢ";s:3:"摋";s:2:"";s:3:"摍";s:2:"";s:3:"摎";s:2:"";s:3:"摐";s:2:"";s:3:"摑";s:2:"Q";s:3:"摒";s:2:"";s:3:"摓";s:2:"";s:3:"摔";s:2:"L";s:3:"摘";s:2:"K";s:3:"摙";s:2:"";s:3:"摛";s:2:"";s:3:"摜";s:2:"";s:3:"摝";s:2:"";s:3:"摞";s:2:"";s:3:"摟";s:2:"O";s:3:"摠";s:2:"";s:3:"摡";s:2:"b";s:3:"摥";s:2:"";s:3:"摦";s:2:"";s:3:"摧";s:2:"R";s:3:"摨";s:2:"";s:3:"摩";s:2:"";s:3:"摫";s:2:"";s:3:"摬";s:2:"";s:3:"摭";s:2:"T";s:3:"摮";s:2:"";s:3:"摯";s:2:"";s:3:"摰";s:2:"";s:3:"摲";s:2:"";s:3:"摳";s:2:"";s:3:"摴";s:2:"";s:3:"摵";s:2:"";s:3:"摶";s:2:"";s:3:"摷";s:2:"";s:3:"摸";s:2:"N";s:3:"摹";s:2:"";s:3:"摺";s:2:"P";s:3:"摻";s:2:"U";s:3:"摽";s:2:"";s:3:"摿";s:2:"";s:3:"撂";s:2:"";s:3:"撅";s:2:"";s:3:"撇";s:2:"J";s:3:"撈";s:2:"";s:3:"撉";s:2:"";s:3:"撊";s:2:"";s:3:"撋";s:2:"";s:3:"撌";s:2:"";s:3:"撏";s:2:"";s:3:"撐";s:2:"";s:3:"撒";s:2:"";s:3:"撓";s:2:"";s:3:"撕";s:2:"";s:3:"撖";s:2:"";s:3:"撗";s:2:"";s:3:"撘";s:2:"";s:3:"撙";s:2:"";s:3:"撚";s:2:"";s:3:"撜";s:2:"";s:3:"撝";s:2:"Z";s:3:"撞";s:2:"";s:3:"撟";s:2:"";s:3:"撠";s:2:"";s:3:"撢";s:2:"";s:3:"撣";s:2:"";s:3:"撤";s:2:"M";s:3:"撥";s:2:"";s:3:"撦";s:2:"";s:3:"撩";s:2:"";s:3:"撫";s:2:"";s:3:"撬";s:2:"";s:3:"播";s:2:"";s:3:"撮";s:2:"";s:3:"撰";s:2:"";s:3:"撱";s:2:"";s:3:"撲";s:2:"";s:3:"撳";s:2:"";s:3:"撻";s:2:"";s:3:"撼";s:2:"";s:3:"撽";s:2:"";s:3:"撾";s:2:"";s:3:"撿";s:2:"";s:3:"擁";s:2:"";s:3:"擂";s:2:"";s:3:"擃";s:2:"";s:3:"擄";s:2:"";s:3:"擅";s:2:"";s:3:"擇";s:2:"";s:3:"擉";s:2:"";s:3:"擊";s:2:"";s:3:"擋";s:2:"";s:3:"操";s:2:"";s:3:"擎";s:2:"";s:3:"擏";s:2:"";s:3:"擐";s:2:"";s:3:"擒";s:2:"";s:3:"擔";s:2:"";s:3:"擖";s:2:"";s:3:"擗";s:2:"";s:3:"擘";s:2:"";s:3:"擙";s:2:"";s:3:"據";s:2:"";s:3:"擛";s:2:"";s:3:"擠";s:2:"";s:3:"擢";s:2:"";s:3:"擣";s:2:"";s:3:"擤";s:2:"";s:3:"擦";s:2:"";s:3:"擨";s:2:"";s:3:"擩";s:2:"";s:3:"擫";s:2:"";s:3:"擬";s:2:"";s:3:"擭";s:2:"";s:3:"擯";s:2:"";s:3:"擰";s:2:"";s:3:"擱";s:2:"";s:3:"擲";s:2:"Y";s:3:"擳";s:2:"";s:3:"擴";s:2:"X";s:3:"擷";s:2:"^";s:3:"擸";s:2:"";s:3:"擺";s:2:"\";s:3:"擻";s:2:"]";s:3:"擼";s:2:"";s:3:"擽";s:2:"";s:3:"擾";s:2:"Z";s:3:"擿";s:2:"";s:3:"攀";s:2:"k";s:3:"攁";s:2:"";s:3:"攃";s:2:"";s:3:"攄";s:2:"";s:3:"攆";s:2:"[";s:3:"攇";s:2:"B";s:3:"攉";s:2:"E";s:3:"攌";s:2:"F";s:3:"攍";s:2:"D";s:3:"攎";s:2:"G";s:3:"攏";s:2:"l";s:3:"攐";s:2:"C";s:3:"攓";s:2:"N";s:3:"攔";s:2:"d";s:3:"攕";s:2:"M";s:3:"攖";s:2:"L";s:3:"攗";s:2:"K";s:3:"攘";s:2:"c";s:3:"攙";s:2:"e";s:3:"攛";s:2:"";s:3:"攜";s:2:"";s:3:"攝";s:2:"";s:3:"攠";s:2:"";s:3:"攡";s:2:"";s:3:"攢";s:2:"";s:3:"攣";s:2:"";s:3:"攤";s:2:"u";s:3:"攥";s:2:"";s:3:"攦";s:2:"";s:3:"攩";s:2:"";s:3:"攪";s:2:"";s:3:"攫";s:2:"";s:3:"攬";s:2:"";s:3:"攭";s:2:"";s:3:"攮";s:2:"";s:3:"支";s:2:"";s:3:"攲";s:2:"r";s:3:"攳";s:2:"";s:3:"收";s:2:"";s:3:"攷";s:2:"";s:3:"攸";s:2:"";s:3:"改";s:2:"";s:3:"攻";s:2:"";s:3:"攽";s:2:"";s:3:"放";s:2:"";s:3:"政";s:2:"F";s:3:"敁";s:2:"";s:3:"敃";s:2:"";s:3:"故";s:2:"G";s:3:"敆";s:2:"";s:3:"效";s:2:"";s:3:"敉";s:2:"";s:3:"敊";s:2:"";s:3:"敏";s:2:"";s:3:"救";s:2:"";s:3:"敓";s:2:"է";s:3:"敔";s:2:"";s:3:"敕";s:2:"";s:3:"敖";s:2:"";s:3:"敗";s:2:"";s:3:"敘";s:2:"";s:3:"教";s:2:"";s:3:"敜";s:2:"v";s:3:"敝";s:2:"";s:3:"敞";s:2:"";s:3:"敢";s:2:"";s:3:"散";s:2:"";s:3:"敤";s:2:"u";s:3:"敥";s:2:"x";s:3:"敦";s:2:"";s:3:"敧";s:2:"s";s:3:"敨";s:2:"w";s:3:"敪";s:2:"t";s:3:"敬";s:2:"q";s:3:"敯";s:2:"ݼ";s:3:"敲";s:2:"V";s:3:"敳";s:2:"";s:3:"整";s:2:"";s:3:"敵";s:2:"";s:3:"敶";s:2:"";s:3:"敷";s:2:"";s:3:"數";s:2:"";s:3:"敹";s:2:"";s:3:"敺";s:2:"";s:3:"敻";s:2:"";s:3:"敼";s:2:"";s:3:"敿";s:2:"";s:3:"斀";s:2:"";s:3:"斁";s:2:"";s:3:"斂";s:2:"";s:3:"斃";s:2:"";s:3:"斄";s:2:"H";s:3:"文";s:2:"";s:3:"斌";s:2:"y";s:3:"斐";s:2:"";s:3:"斑";s:2:"";s:3:"斒";s:2:"ݽ";s:3:"斔";s:2:"";s:3:"斕";s:2:"";s:3:"斖";s:2:"";s:3:"斗";s:2:"";s:3:"料";s:2:"";s:3:"斛";s:2:"";s:3:"斜";s:2:"";s:3:"斝";s:2:"z";s:3:"斞";s:2:"{";s:3:"斟";s:2:"r";s:3:"斠";s:2:"";s:3:"斡";s:2:"W";s:3:"斢";s:2:"";s:3:"斤";s:2:"";s:3:"斥";s:2:"";s:3:"斧";s:2:"";s:3:"斨";s:2:"";s:3:"斪";s:2:"";s:3:"斫";s:2:"H";s:3:"斬";s:2:"";s:3:"斮";s:2:"|";s:3:"斯";s:2:"";s:3:"新";s:2:"s";s:3:"斲";s:2:"";s:3:"斳";s:2:"";s:3:"斶";s:2:"";s:3:"斷";s:2:"_";s:3:"斸";s:2:"";s:3:"方";s:2:"";s:3:"斻";s:2:"";s:3:"於";s:2:"";s:3:"施";s:2:"I";s:3:"斿";s:2:"";s:3:"旁";s:2:"";s:3:"旂";s:2:"";s:3:"旃";s:2:"";s:3:"旄";s:2:"";s:3:"旅";s:2:"";s:3:"旆";s:2:"";s:3:"旋";s:2:"";s:3:"旌";s:2:"";s:3:"旍";s:2:"ը";s:3:"旎";s:2:"";s:3:"族";s:2:"";s:3:"旐";s:2:"}";s:3:"旒";s:2:"~";s:3:"旓";s:2:"ݾ";s:3:"旖";s:2:"Y";s:3:"旗";s:2:"X";s:3:"旚";s:2:"";s:3:"旛";s:2:"";s:3:"旝";s:2:"J";s:3:"旞";s:2:"I";s:3:"旟";s:2:"O";s:3:"旡";s:2:"^";s:3:"既";s:2:"J";s:3:"日";s:2:"";s:3:"旦";s:2:"";s:3:"旨";s:2:"";s:3:"早";s:2:"";s:3:"旬";s:2:"";s:3:"旭";s:2:"";s:3:"旮";s:2:"";s:3:"旯";s:2:"";s:3:"旰";s:2:"";s:3:"旱";s:2:"";s:3:"旲";s:2:"";s:3:"旳";s:2:"";s:3:"旴";s:2:"";s:3:"旵";s:2:"";s:3:"旺";s:2:"";s:3:"旻";s:2:"";s:3:"旼";s:2:"";s:3:"旽";s:2:"";s:3:"昀";s:2:"";s:3:"昂";s:2:"";s:3:"昃";s:2:"";s:3:"昄";s:2:"";s:3:"昅";s:2:"";s:3:"昆";s:2:"";s:3:"昇";s:2:"@";s:3:"昈";s:2:"";s:3:"昉";s:2:"";s:3:"昊";s:2:"";s:3:"昋";s:2:"";s:3:"昌";s:2:"";s:3:"昍";s:2:"";s:3:"明";s:2:"";s:3:"昏";s:2:"";s:3:"昐";s:2:"";s:3:"昑";s:2:"";s:3:"昒";s:2:"";s:3:"易";s:2:"";s:3:"昔";s:2:"";s:3:"昕";s:2:"";s:3:"昜";s:2:"";s:3:"昝";s:2:"";s:3:"星";s:2:"P";s:3:"映";s:2:"M";s:3:"昡";s:2:"";s:3:"昢";s:2:"";s:3:"昤";s:2:"S";s:3:"春";s:2:"K";s:3:"昦";s:2:"";s:3:"昧";s:2:"N";s:3:"昨";s:2:"Q";s:3:"昫";s:2:"";s:3:"昭";s:2:"L";s:3:"昮";s:2:"";s:3:"是";s:2:"O";s:3:"昱";s:2:"R";s:3:"昲";s:2:"";s:3:"昳";s:2:"";s:3:"昴";s:2:"";s:3:"昵";s:2:"";s:3:"昶";s:2:"";s:3:"昹";s:2:"";s:3:"昺";s:2:"";s:3:"晁";s:2:"";s:3:"時";s:2:"";s:3:"晃";s:2:"";s:3:"晅";s:2:"";s:3:"晇";s:2:"";s:3:"晉";s:2:"";s:3:"晊";s:2:"";s:3:"晌";s:2:"";s:3:"晏";s:2:"";s:3:"晑";s:2:"";s:3:"晒";s:2:"";s:3:"晙";s:2:"լ";s:3:"晚";s:2:"";s:3:"晛";s:2:"ի";s:3:"晜";s:2:"խ";s:3:"晝";s:2:"";s:3:"晞";s:2:"";s:3:"晟";s:2:"";s:3:"晡";s:2:"ժ";s:3:"晢";s:2:"ծ";s:3:"晤";s:2:"";s:3:"晥";s:2:"թ";s:3:"晦";s:2:"";s:3:"晨";s:2:"";s:3:"晪";s:2:"٧";s:3:"晬";s:2:"٢";s:3:"普";s:2:"";s:3:"景";s:2:"";s:3:"晰";s:2:"";s:3:"晱";s:2:"٥";s:3:"晲";s:2:"٨";s:3:"晴";s:2:"";s:3:"晶";s:2:"";s:3:"晷";s:2:"";s:3:"晸";s:2:"";s:3:"晹";s:2:"٦";s:3:"智";s:2:"";s:3:"晻";s:2:"٣";s:3:"晼";s:2:"١";s:3:"晾";s:2:"";s:3:"暀";s:2:"٤";s:3:"暄";s:2:"y";s:3:"暆";s:2:"ݿ";s:3:"暇";s:2:"v";s:3:"暈";s:2:"w";s:3:"暉";s:2:"u";s:3:"暊";s:2:"";s:3:"暋";s:2:"";s:3:"暌";s:2:"";s:3:"暍";s:2:"{";s:3:"暐";s:2:"";s:3:"暑";s:2:"";s:3:"暔";s:2:"";s:3:"暕";s:2:"";s:3:"暖";s:2:"x";s:3:"暗";s:2:"t";s:3:"暘";s:2:"z";s:3:"暙";s:2:"";s:3:"暝";s:2:"\";s:3:"暟";s:2:"";s:3:"暠";s:2:"";s:3:"暡";s:2:"";s:3:"暢";s:2:"Z";s:3:"暨";s:2:"[";s:3:"暩";s:2:"";s:3:"暪";s:2:"";s:3:"暫";s:2:"";s:3:"暮";s:2:"";s:3:"暯";s:2:"";s:3:"暰";s:2:"";s:3:"暱";s:2:"";s:3:"暲";s:2:"";s:3:"暴";s:2:"";s:3:"暵";s:2:"";s:3:"暷";s:2:"";s:3:"暸";s:2:"";s:3:"暹";s:2:"";s:3:"暺";s:2:"";s:3:"暻";s:2:"";s:3:"暽";s:2:"";s:3:"暾";s:2:"";s:3:"曀";s:2:"";s:3:"曄";s:2:"";s:3:"曆";s:2:"";s:3:"曇";s:2:"";s:3:"曈";s:2:"";s:3:"曉";s:2:"";s:3:"曊";s:2:"";s:3:"曋";s:2:"";s:3:"曌";s:2:"";s:3:"曏";s:2:"";s:3:"曒";s:2:"";s:3:"曖";s:2:"";s:3:"曘";s:2:"";s:3:"曙";s:2:"";s:3:"曚";s:2:"";s:3:"曛";s:2:"";s:3:"曜";s:2:"`";s:3:"曝";s:2:"n";s:3:"曞";s:2:"K";s:3:"曠";s:2:"m";s:3:"曣";s:2:"Q";s:3:"曤";s:2:"R";s:3:"曦";s:2:"f";s:3:"曨";s:2:"P";s:3:"曩";s:2:"";s:3:"曫";s:2:"";s:3:"曬";s:2:"";s:3:"曭";s:2:"";s:3:"曮";s:2:"";s:3:"曰";s:2:"";s:3:"曲";s:2:"";s:3:"曳";s:2:"";s:3:"更";s:2:"";s:3:"曶";s:2:"";s:3:"曷";s:2:"T";s:3:"書";s:2:"";s:3:"曹";s:2:"";s:3:"曼";s:2:"";s:3:"曾";s:2:"";s:3:"替";s:2:"";s:3:"最";s:2:"";s:3:"朁";s:2:"٩";s:3:"會";s:2:"|";s:3:"朄";s:2:"";s:3:"朅";s:2:"";s:3:"月";s:2:"";s:3:"有";s:2:"";s:3:"朊";s:2:"";s:3:"朋";s:2:"B";s:3:"服";s:2:"A";s:3:"朏";s:2:"";s:3:"朐";s:2:"";s:3:"朒";s:2:"";s:3:"朓";s:2:"";s:3:"朔";s:2:"";s:3:"朕";s:2:"";s:3:"朗";s:2:"";s:3:"朘";s:2:"կ";s:3:"望";s:2:"";s:3:"朝";s:2:"";s:3:"期";s:2:"";s:3:"朠";s:2:"";s:3:"朡";s:2:"z";s:3:"朢";s:2:"";s:3:"朣";s:2:"";s:3:"朦";s:2:"a";s:3:"朧";s:2:"g";s:3:"木";s:2:"";s:3:"未";s:2:"";s:3:"末";s:2:"";s:3:"本";s:2:"";s:3:"札";s:2:"";s:3:"朮";s:2:"";s:3:"朱";s:2:"";s:3:"朳";s:2:"";s:3:"朴";s:2:"";s:3:"朵";s:2:"";s:3:"朸";s:2:"";s:3:"朹";s:2:"";s:3:"机";s:2:"";s:3:"朻";s:2:"";s:3:"朼";s:2:"";s:3:"朽";s:2:"";s:3:"朾";s:2:"";s:3:"朿";s:2:"";s:3:"杅";s:2:"";s:3:"杆";s:2:"";s:3:"杇";s:2:"";s:3:"杈";s:2:"C";s:3:"杉";s:2:"";s:3:"杋";s:2:"G";s:3:"杌";s:2:"B";s:3:"杍";s:2:"E";s:3:"李";s:2:"";s:3:"杏";s:2:"";s:3:"材";s:2:"";s:3:"村";s:2:"";s:3:"杓";s:2:"@";s:3:"杕";s:2:"A";s:3:"杖";s:2:"";s:3:"杗";s:2:"A";s:3:"杙";s:2:"@";s:3:"杚";s:2:"F";s:3:"杜";s:2:"";s:3:"杝";s:2:"D";s:3:"杞";s:2:"";s:3:"束";s:2:"";s:3:"杠";s:2:"";s:3:"杪";s:2:"W";s:3:"杬";s:2:"";s:3:"杭";s:2:"C";s:3:"杯";s:2:"M";s:3:"杰";s:2:"N";s:3:"東";s:2:"F";s:3:"杲";s:2:"X";s:3:"杳";s:2:"H";s:3:"杴";s:2:"";s:3:"杵";s:2:"S";s:3:"杶";s:2:"";s:3:"杷";s:2:"I";s:3:"杸";s:2:"";s:3:"杹";s:2:"";s:3:"杺";s:2:"";s:3:"杻";s:2:"";s:3:"杼";s:2:"V";s:3:"杽";s:2:"";s:3:"松";s:2:"Q";s:3:"板";s:2:"O";s:3:"极";s:2:"";s:3:"枃";s:2:"";s:3:"构";s:2:"";s:3:"枅";s:2:"";s:3:"枆";s:2:"";s:3:"枇";s:2:"J";s:3:"枉";s:2:"P";s:3:"枋";s:2:"D";s:3:"枌";s:2:"";s:3:"枍";s:2:"";s:3:"枎";s:2:"";s:3:"析";s:2:"R";s:3:"枑";s:2:"";s:3:"枒";s:2:"";s:3:"枓";s:2:"U";s:3:"枔";s:2:"";s:3:"枕";s:2:"E";s:3:"林";s:2:"L";s:3:"枘";s:2:"";s:3:"枙";s:2:"";s:3:"枚";s:2:"T";s:3:"果";s:2:"G";s:3:"枝";s:2:"K";s:3:"枟";s:2:"";s:3:"枮";s:2:"[";s:3:"枯";s:2:"\";s:3:"枰";s:2:"i";s:3:"枲";s:2:"V";s:3:"枳";s:2:"L";s:3:"枴";s:2:"b";s:3:"枵";s:2:"J";s:3:"架";s:2:"[";s:3:"枷";s:2:"E";s:3:"枸";s:2:"e";s:3:"枹";s:2:"R";s:3:"枺";s:2:"";s:3:"枻";s:2:"A";s:3:"柀";s:2:"D";s:3:"柁";s:2:"";s:3:"柂";s:2:"Q";s:3:"柃";s:2:"a";s:3:"柄";s:2:"`";s:3:"柅";s:2:"F";s:3:"柆";s:2:"X";s:3:"柈";s:2:"";s:3:"柉";s:2:"_";s:3:"柊";s:2:"`";s:3:"柋";s:2:"c";s:3:"柌";s:2:"Z";s:3:"柍";s:2:"K";s:3:"柎";s:2:"S";s:3:"柏";s:2:"f";s:3:"某";s:2:"Y";s:3:"柑";s:2:"a";s:3:"柒";s:2:"m";s:3:"染";s:2:"V";s:3:"柔";s:2:"X";s:3:"柘";s:2:"C";s:3:"柙";s:2:"j";s:3:"柚";s:2:"c";s:3:"柛";s:2:"]";s:3:"柜";s:2:"@";s:3:"柝";s:2:"l";s:3:"柞";s:2:"g";s:3:"柟";s:2:"I";s:3:"柢";s:2:"k";s:3:"柣";s:2:"P";s:3:"柤";s:2:"H";s:3:"查";s:2:"d";s:3:"柦";s:2:"\";s:3:"柧";s:2:"T";s:3:"柩";s:2:"^";s:3:"柪";s:2:"b";s:3:"柫";s:2:"G";s:3:"柬";s:2:"Z";s:3:"柭";s:2:"Y";s:3:"柮";s:2:"O";s:3:"柯";s:2:"_";s:3:"柰";s:2:"U";s:3:"柱";s:2:"W";s:3:"柲";s:2:"";s:3:"柳";s:2:"h";s:3:"柴";s:2:"";s:3:"柵";s:2:"]";s:3:"柶";s:2:"N";s:3:"柷";s:2:"M";s:3:"柸";s:2:"B";s:3:"柺";s:2:"^";s:3:"柼";s:2:"W";s:3:"柿";s:2:"U";s:3:"栒";s:2:"";s:3:"栓";s:2:"";s:3:"栔";s:2:"";s:3:"栖";s:2:"";s:3:"栗";s:2:"";s:3:"栘";s:2:"";s:3:"栚";s:2:"";s:3:"栜";s:2:"";s:3:"栝";s:2:"";s:3:"栟";s:2:"";s:3:"栠";s:2:"";s:3:"校";s:2:"";s:3:"栥";s:2:"";s:3:"栦";s:2:"";s:3:"栨";s:2:"";s:3:"栩";s:2:"";s:3:"株";s:2:"";s:3:"栫";s:2:"";s:3:"栭";s:2:"";s:3:"栮";s:2:"";s:3:"栯";s:2:"";s:3:"栱";s:2:"";s:3:"栲";s:2:"";s:3:"栳";s:2:"";s:3:"栴";s:2:"";s:3:"栵";s:2:"";s:3:"核";s:2:"";s:3:"根";s:2:"";s:3:"栺";s:2:"";s:3:"栻";s:2:"";s:3:"格";s:2:"";s:3:"栽";s:2:"";s:3:"桀";s:2:"";s:3:"桁";s:2:"";s:3:"桂";s:2:"";s:3:"桃";s:2:"";s:3:"桄";s:2:"";s:3:"桅";s:2:"";s:3:"框";s:2:"";s:3:"案";s:2:"";s:3:"桉";s:2:"";s:3:"桋";s:2:"";s:3:"桌";s:2:"";s:3:"桍";s:2:"";s:3:"桎";s:2:"";s:3:"桏";s:2:"";s:3:"桐";s:2:"";s:3:"桑";s:2:"";s:3:"桓";s:2:"";s:3:"桔";s:2:"";s:3:"桫";s:2:"";s:3:"桭";s:2:"մ";s:3:"桮";s:2:"յ";s:3:"桯";s:2:"չ";s:3:"桱";s:2:"";s:3:"桲";s:2:"";s:3:"桴";s:2:"վ";s:3:"桵";s:2:"ս";s:3:"桶";s:2:"";s:3:"桷";s:2:"";s:3:"桸";s:2:"";s:3:"桹";s:2:"հ";s:3:"桻";s:2:"";s:3:"桼";s:2:"";s:3:"桽";s:2:"";s:3:"桾";s:2:"";s:3:"桿";s:2:"";s:3:"梀";s:2:"";s:3:"梁";s:2:"";s:3:"梂";s:2:"";s:3:"梃";s:2:"";s:3:"梅";s:2:"";s:3:"梆";s:2:"";s:3:"梇";s:2:"ձ";s:3:"梉";s:2:"";s:3:"梊";s:2:"";s:3:"梋";s:2:"";s:3:"梌";s:2:"";s:3:"梏";s:2:"";s:3:"梐";s:2:"ղ";s:3:"梑";s:2:"";s:3:"梒";s:2:"";s:3:"梓";s:2:"";s:3:"梔";s:2:"";s:3:"梖";s:2:"";s:3:"梗";s:2:"";s:3:"梛";s:2:"";s:3:"梜";s:2:"ճ";s:3:"條";s:2:"";s:3:"梟";s:2:"";s:3:"梠";s:2:"";s:3:"梡";s:2:"";s:3:"梢";s:2:"";s:3:"梣";s:2:"պ";s:3:"梤";s:2:"";s:3:"梧";s:2:"";s:3:"梨";s:2:"";s:3:"梩";s:2:"ռ";s:3:"梪";s:2:"";s:3:"梫";s:2:"շ";s:3:"梬";s:2:"ջ";s:3:"梭";s:2:"";s:3:"梮";s:2:"ն";s:3:"梯";s:2:"";s:3:"械";s:2:"";s:3:"梱";s:2:"";s:3:"梲";s:2:"տ";s:3:"梳";s:2:"";s:3:"梴";s:2:"";s:3:"梵";s:2:"";s:3:"棄";s:2:"";s:3:"棆";s:2:"";s:3:"棇";s:2:"";s:3:"棈";s:2:"";s:3:"棉";s:2:"";s:3:"棋";s:2:"";s:3:"棌";s:2:"ٽ";s:3:"棍";s:2:"";s:3:"棎";s:2:"";s:3:"棐";s:2:"";s:3:"棑";s:2:"";s:3:"棒";s:2:"";s:3:"棓";s:2:"٫";s:3:"棔";s:2:"";s:3:"棕";s:2:"";s:3:"棖";s:2:"ٳ";s:3:"棗";s:2:"";s:3:"棘";s:2:"";s:3:"棚";s:2:"";s:3:"棜";s:2:"٭";s:3:"棝";s:2:"";s:3:"棞";s:2:"";s:3:"棟";s:2:"";s:3:"棠";s:2:"";s:3:"棡";s:2:"ٻ";s:3:"棣";s:2:"";s:3:"棤";s:2:"ٶ";s:3:"棦";s:2:"";s:3:"棧";s:2:"";s:3:"棨";s:2:"";s:3:"棩";s:2:"";s:3:"棪";s:2:"ٰ";s:3:"棫";s:2:"ٵ";s:3:"棬";s:2:"ٯ";s:3:"森";s:2:"";s:3:"棯";s:2:"";s:3:"棰";s:2:"";s:3:"棱";s:2:"ٱ";s:3:"棲";s:2:"";s:3:"棳";s:2:"ٺ";s:3:"棴";s:2:"";s:3:"棵";s:2:"";s:3:"棶";s:2:"ٷ";s:3:"棷";s:2:"ٴ";s:3:"棸";s:2:"";s:3:"棹";s:2:"";s:3:"棺";s:2:"";s:3:"棻";s:2:"";s:3:"棼";s:2:"";s:3:"棽";s:2:"";s:3:"椄";s:2:"٬";s:3:"椅";s:2:"";s:3:"椆";s:2:"";s:3:"椇";s:2:"ټ";s:3:"椈";s:2:"پ";s:3:"椊";s:2:"";s:3:"椋";s:2:"";s:3:"椌";s:2:"٪";s:3:"植";s:2:"";s:3:"椎";s:2:"";s:3:"椏";s:2:"ٲ";s:3:"椐";s:2:"ٹ";s:3:"椑";s:2:"";s:3:"椒";s:2:"";s:3:"椓";s:2:"ٸ";s:3:"椔";s:2:"";s:3:"椕";s:2:"";s:3:"椗";s:2:"";s:3:"椥";s:2:"";s:3:"椪";s:2:"ٮ";s:3:"椯";s:2:"";s:3:"椰";s:2:"";s:3:"椲";s:2:"";s:3:"椳";s:2:"";s:3:"椴";s:2:"";s:3:"椵";s:2:"";s:3:"椷";s:2:"";s:3:"椸";s:2:"";s:3:"椹";s:2:"";s:3:"椻";s:2:"";s:3:"椼";s:2:"";s:3:"椽";s:2:"";s:3:"椿";s:2:"";s:3:"楀";s:2:"";s:3:"楁";s:2:"";s:3:"楂";s:2:"";s:3:"楄";s:2:"";s:3:"楅";s:2:"";s:3:"楈";s:2:"";s:3:"楉";s:2:"";s:3:"楊";s:2:"";s:3:"楋";s:2:"";s:3:"楌";s:2:"";s:3:"楎";s:2:"";s:3:"楏";s:2:"";s:3:"楑";s:2:"";s:3:"楒";s:2:"";s:3:"楓";s:2:"";s:3:"楔";s:2:"";s:3:"楖";s:2:"ո";s:3:"楗";s:2:"";s:3:"楘";s:2:"";s:3:"楙";s:2:"";s:3:"楚";s:2:"";s:3:"楛";s:2:"";s:3:"楜";s:2:"";s:3:"楝";s:2:"";s:3:"楞";s:2:"";s:3:"楟";s:2:"";s:3:"楠";s:2:"";s:3:"楢";s:2:"";s:3:"楣";s:2:"";s:3:"楥";s:2:"";s:3:"楦";s:2:"";s:3:"楨";s:2:"";s:3:"楩";s:2:"";s:3:"楪";s:2:"";s:3:"楫";s:2:"";s:3:"楬";s:2:"";s:3:"業";s:2:"~";s:3:"楮";s:2:"";s:3:"楯";s:2:"";s:3:"楰";s:2:"ٿ";s:3:"楱";s:2:"";s:3:"楴";s:2:"";s:3:"極";s:2:"";s:3:"楶";s:2:"";s:3:"楷";s:2:"";s:3:"楸";s:2:"";s:3:"楹";s:2:"";s:3:"楺";s:2:"";s:3:"楻";s:2:"";s:3:"概";s:2:"";s:3:"榃";s:2:"";s:3:"榆";s:2:"";s:3:"榍";s:2:"J";s:3:"榎";s:2:"H";s:3:"榐";s:2:"^";s:3:"榑";s:2:"F";s:3:"榓";s:2:"X";s:3:"榔";s:2:"}";s:3:"榕";s:2:"_";s:3:"榖";s:2:"B";s:3:"榗";s:2:"]";s:3:"榙";s:2:"G";s:3:"榚";s:2:"U";s:3:"榛";s:2:"d";s:3:"榜";s:2:"]";s:3:"榞";s:2:"[";s:3:"榠";s:2:"@";s:3:"榡";s:2:"Z";s:3:"榣";s:2:"o";s:3:"榤";s:2:"Q";s:3:"榥";s:2:"a";s:3:"榦";s:2:"m";s:3:"榧";s:2:"I";s:3:"榨";s:2:"^";s:3:"榩";s:2:"K";s:3:"榪";s:2:"Y";s:3:"榫";s:2:"g";s:3:"榬";s:2:"D";s:3:"榭";s:2:"k";s:3:"榮";s:2:"a";s:3:"榯";s:2:"M";s:3:"榰";s:2:"C";s:3:"榱";s:2:"";s:3:"榳";s:2:"W";s:3:"榴";s:2:"h";s:3:"榵";s:2:"`";s:3:"榶";s:2:"";s:3:"榷";s:2:"e";s:3:"榹";s:2:"S";s:3:"榻";s:2:"f";s:3:"榼";s:2:"E";s:3:"榽";s:2:"P";s:3:"榾";s:2:"L";s:3:"榿";s:2:"N";s:3:"槁";s:2:"`";s:3:"槂";s:2:"_";s:3:"槃";s:2:"n";s:3:"槄";s:2:"O";s:3:"槆";s:2:"b";s:3:"槉";s:2:"";s:3:"槊";s:2:"T";s:3:"構";s:2:"c";s:3:"槌";s:2:"l";s:3:"槍";s:2:"j";s:3:"槎";s:2:"A";s:3:"槏";s:2:"V";s:3:"槐";s:2:"i";s:3:"槓";s:2:"b";s:3:"槔";s:2:"R";s:3:"槙";s:2:"\";s:3:"槢";s:2:"";s:3:"槤";s:2:"";s:3:"槥";s:2:"";s:3:"槦";s:2:"";s:3:"槧";s:2:"";s:3:"槨";s:2:"";s:3:"槫";s:2:"";s:3:"槬";s:2:"";s:3:"槭";s:2:"";s:3:"槮";s:2:"";s:3:"槱";s:2:"";s:3:"槲";s:2:"";s:3:"槳";s:2:"";s:3:"槴";s:2:"";s:3:"槶";s:2:"";s:3:"槷";s:2:"";s:3:"槸";s:2:"";s:3:"槻";s:2:"";s:3:"槼";s:2:"";s:3:"槽";s:2:"";s:3:"槾";s:2:"";s:3:"槿";s:2:"";s:3:"樀";s:2:"";s:3:"樁";s:2:"";s:3:"樂";s:2:"";s:3:"樄";s:2:"";s:3:"樅";s:2:"";s:3:"樆";s:2:"";s:3:"樇";s:2:"";s:3:"樈";s:2:"";s:3:"樉";s:2:"";s:3:"樊";s:2:"";s:3:"樍";s:2:"";s:3:"樏";s:2:"";s:3:"樑";s:2:"";s:3:"樓";s:2:"";s:3:"樔";s:2:"";s:3:"樕";s:2:"";s:3:"樖";s:2:"";s:3:"樗";s:2:"";s:3:"樘";s:2:"";s:3:"標";s:2:"";s:3:"樛";s:2:"";s:3:"樝";s:2:"";s:3:"樞";s:2:"";s:3:"樟";s:2:"";s:3:"樠";s:2:"";s:3:"模";s:2:"";s:3:"樣";s:2:"";s:3:"樥";s:2:"";s:3:"樦";s:2:"";s:3:"樧";s:2:"";s:3:"樨";s:2:"";s:3:"樲";s:2:"";s:3:"樴";s:2:"";s:3:"樵";s:2:"";s:3:"樸";s:2:"";s:3:"樹";s:2:"";s:3:"樺";s:2:"";s:3:"樻";s:2:"";s:3:"樼";s:2:"";s:3:"樽";s:2:"";s:3:"樾";s:2:"";s:3:"樿";s:2:"";s:3:"橀";s:2:"";s:3:"橁";s:2:"";s:3:"橄";s:2:"";s:3:"橆";s:2:"";s:3:"橇";s:2:"";s:3:"橈";s:2:"";s:3:"橉";s:2:"";s:3:"橋";s:2:"";s:3:"橍";s:2:"";s:3:"橎";s:2:"";s:3:"橏";s:2:"";s:3:"橐";s:2:"";s:3:"橑";s:2:"";s:3:"橔";s:2:"";s:3:"橕";s:2:"";s:3:"橖";s:2:"";s:3:"橘";s:2:"";s:3:"橙";s:2:"";s:3:"橚";s:2:"";s:3:"橛";s:2:"";s:3:"橝";s:2:"";s:3:"橞";s:2:"";s:3:"機";s:2:"";s:3:"橠";s:2:"";s:3:"橡";s:2:"";s:3:"橢";s:2:"";s:3:"橤";s:2:"";s:3:"橦";s:2:"";s:3:"橧";s:2:"";s:3:"橨";s:2:"";s:3:"橩";s:2:"";s:3:"橪";s:2:"";s:3:"橫";s:2:"";s:3:"橭";s:2:"";s:3:"橯";s:2:"";s:3:"橶";s:2:"";s:3:"橾";s:2:"";s:3:"橿";s:2:"E";s:3:"檀";s:2:"";s:3:"檁";s:2:"";s:3:"檃";s:2:"A";s:3:"檄";s:2:"";s:3:"檅";s:2:"H";s:3:"檇";s:2:"";s:3:"檉";s:2:"";s:3:"檌";s:2:"I";s:3:"檍";s:2:"";s:3:"檎";s:2:"";s:3:"檐";s:2:"";s:3:"檑";s:2:"D";s:3:"檒";s:2:"J";s:3:"檓";s:2:"";s:3:"檔";s:2:"";s:3:"檕";s:2:"@";s:3:"檖";s:2:"";s:3:"檗";s:2:"";s:3:"檚";s:2:"G";s:3:"檛";s:2:"";s:3:"檜";s:2:"";s:3:"檞";s:2:"";s:3:"檟";s:2:"";s:3:"檠";s:2:"";s:3:"檡";s:2:"";s:3:"檢";s:2:"";s:3:"檣";s:2:"";s:3:"檤";s:2:"C";s:3:"檥";s:2:"";s:3:"檦";s:2:"F";s:3:"檨";s:2:"B";s:3:"檬";s:2:"c";s:3:"檭";s:2:"";s:3:"檮";s:2:"h";s:3:"檯";s:2:"i";s:3:"檳";s:2:"b";s:3:"檴";s:2:"";s:3:"檶";s:2:"";s:3:"檷";s:2:"";s:3:"檸";s:2:"f";s:3:"檹";s:2:"";s:3:"檺";s:2:"";s:3:"檻";s:2:"e";s:3:"檽";s:2:"";s:3:"櫂";s:2:"g";s:3:"櫃";s:2:"d";s:3:"櫅";s:2:"";s:3:"櫆";s:2:"";s:3:"櫇";s:2:"";s:3:"櫋";s:2:"Q";s:3:"櫌";s:2:"N";s:3:"櫍";s:2:"W";s:3:"櫏";s:2:"V";s:3:"櫐";s:2:"T";s:3:"櫑";s:2:"O";s:3:"櫓";s:2:"r";s:3:"櫙";s:2:"P";s:3:"櫚";s:2:"q";s:3:"櫛";s:2:"";s:3:"櫜";s:2:"S";s:3:"櫝";s:2:"p";s:3:"櫞";s:2:"X";s:3:"櫟";s:2:"R";s:3:"櫠";s:2:"M";s:3:"櫡";s:2:"";s:3:"櫥";s:2:"o";s:3:"櫧";s:2:"L";s:3:"櫨";s:2:"V";s:3:"櫪";s:2:"U";s:3:"櫫";s:2:"U";s:3:"櫬";s:2:"h";s:3:"櫮";s:2:"Y";s:3:"櫯";s:2:"Z";s:3:"櫰";s:2:"T";s:3:"櫱";s:2:"X";s:3:"櫳";s:2:"S";s:3:"櫸";s:2:"";s:3:"櫹";s:2:"W";s:3:"櫺";s:2:"";s:3:"櫻";s:2:"";s:3:"櫼";s:2:"";s:3:"欀";s:2:"";s:3:"欂";s:2:"";s:3:"欃";s:2:"";s:3:"欄";s:2:"";s:3:"欈";s:2:"";s:3:"欉";s:2:"";s:3:"權";s:2:"v";s:3:"欋";s:2:"";s:3:"欏";s:2:"";s:3:"欐";s:2:"";s:3:"欑";s:2:"";s:3:"欒";s:2:"";s:3:"欓";s:2:"";s:3:"欖";s:2:"V";s:3:"欗";s:2:"";s:3:"欘";s:2:"";s:3:"欙";s:2:"";s:3:"欚";s:2:"";s:3:"欞";s:2:"";s:3:"欠";s:2:"";s:3:"次";s:2:"";s:3:"欣";s:2:"Y";s:3:"欥";s:2:"";s:3:"欨";s:2:"d";s:3:"欬";s:2:"";s:3:"欭";s:2:"";s:3:"欯";s:2:"";s:3:"欱";s:2:"";s:3:"欲";s:2:"";s:3:"欳";s:2:"";s:3:"欴";s:2:"";s:3:"欶";s:2:"";s:3:"欷";s:2:"";s:3:"欸";s:2:"";s:3:"欹";s:2:"";s:3:"欺";s:2:"";s:3:"欻";s:2:"";s:3:"欼";s:2:"";s:3:"欽";s:2:"";s:3:"款";s:2:"";s:3:"欿";s:2:"";s:3:"歁";s:2:"";s:3:"歂";s:2:"";s:3:"歃";s:2:"";s:3:"歅";s:2:"";s:3:"歆";s:2:"";s:3:"歇";s:2:"";s:3:"歈";s:2:"";s:3:"歉";s:2:"p";s:3:"歊";s:2:"c";s:3:"歋";s:2:"e";s:3:"歌";s:2:"q";s:3:"歍";s:2:"d";s:3:"歎";s:2:"";s:3:"歐";s:2:"";s:3:"歑";s:2:"";s:3:"歔";s:2:"";s:3:"歕";s:2:"";s:3:"歖";s:2:"";s:3:"歙";s:2:"";s:3:"歛";s:2:"K";s:3:"歜";s:2:"";s:3:"歞";s:2:"";s:3:"歟";s:2:"j";s:3:"歠";s:2:"Y";s:3:"歡";s:2:"w";s:3:"止";s:2:"";s:3:"正";s:2:"";s:3:"此";s:2:"";s:3:"步";s:2:"B";s:3:"武";s:2:"Z";s:3:"歧";s:2:"[";s:3:"歪";s:2:"n";s:3:"歭";s:2:"";s:3:"歲";s:2:"";s:3:"歶";s:2:"";s:3:"歷";s:2:"";s:3:"歸";s:2:"k";s:3:"歹";s:2:"";s:3:"死";s:2:"";s:3:"歾";s:2:"";s:3:"歿";s:2:"\";s:3:"殀";s:2:"";s:3:"殂";s:2:"e";s:3:"殃";s:2:"o";s:3:"殄";s:2:"f";s:3:"殆";s:2:"p";s:3:"殈";s:2:"";s:3:"殉";s:2:"";s:3:"殊";s:2:"";s:3:"殌";s:2:"";s:3:"殍";s:2:"";s:3:"殎";s:2:"";s:3:"殏";s:2:"";s:3:"殑";s:2:"";s:3:"殔";s:2:"";s:3:"殕";s:2:"";s:3:"殖";s:2:"";s:3:"殗";s:2:"";s:3:"殘";s:2:"";s:3:"殙";s:2:"";s:3:"殛";s:2:"";s:3:"殞";s:2:"f";s:3:"殟";s:2:"g";s:3:"殠";s:2:"h";s:3:"殢";s:2:"";s:3:"殣";s:2:"";s:3:"殤";s:2:"";s:3:"殥";s:2:"";s:3:"殦";s:2:"";s:3:"殧";s:2:"";s:3:"殪";s:2:"";s:3:"殫";s:2:"";s:3:"殭";s:2:"L";s:3:"殮";s:2:"";s:3:"殯";s:2:"l";s:3:"殰";s:2:"Z";s:3:"殲";s:2:"";s:3:"殳";s:2:"_";s:3:"段";s:2:"q";s:3:"殶";s:2:"g";s:3:"殷";s:2:"";s:3:"殺";s:2:"";s:3:"殼";s:2:"";s:3:"殽";s:2:"";s:3:"殿";s:2:"";s:3:"毀";s:2:"";s:3:"毃";s:2:"i";s:3:"毄";s:2:"j";s:3:"毅";s:2:"";s:3:"毆";s:2:"";s:3:"毇";s:2:"";s:3:"毈";s:2:"";s:3:"毉";s:2:"";s:3:"毊";s:2:"";s:3:"毋";s:2:"";s:3:"毌";s:2:"`";s:3:"母";s:2:"";s:3:"每";s:2:"C";s:3:"毐";s:2:"H";s:3:"毒";s:2:"r";s:3:"毓";s:2:"";s:3:"比";s:2:"";s:3:"毖";s:2:"h";s:3:"毗";s:2:"s";s:3:"毘";s:2:"i";s:3:"毚";s:2:"";s:3:"毛";s:2:"";s:3:"毞";s:2:"";s:3:"毠";s:2:"j";s:3:"毢";s:2:"B";s:3:"毣";s:2:"A";s:3:"毤";s:2:"";s:3:"毦";s:2:"";s:3:"毧";s:2:"C";s:3:"毨";s:2:"@";s:3:"毫";s:2:"@";s:3:"毬";s:2:"A";s:3:"毯";s:2:"";s:3:"毰";s:2:"";s:3:"毲";s:2:"";s:3:"毳";s:2:"";s:3:"毷";s:2:"A";s:3:"毸";s:2:"B";s:3:"毹";s:2:"@";s:3:"毻";s:2:"";s:3:"毼";s:2:"";s:3:"毽";s:2:"";s:3:"毾";s:2:"k";s:3:"毿";s:2:"";s:3:"氀";s:2:"";s:3:"氁";s:2:"";s:3:"氂";s:2:"";s:3:"氃";s:2:"";s:3:"氄";s:2:"";s:3:"氅";s:2:"";s:3:"氆";s:2:"";s:3:"氈";s:2:"";s:3:"氉";s:2:"M";s:3:"氋";s:2:"";s:3:"氌";s:2:"[";s:3:"氍";s:2:"";s:3:"氏";s:2:"";s:3:"氐";s:2:"";s:3:"民";s:2:"";s:3:"氓";s:2:"]";s:3:"气";s:2:"a";s:3:"氕";s:2:"~";s:3:"氖";s:2:"";s:3:"氘";s:2:"";s:3:"氙";s:2:"I";s:3:"氚";s:2:"J";s:3:"氛";s:2:"^";s:3:"氝";s:2:"";s:3:"氟";s:2:"t";s:3:"氠";s:2:"k";s:3:"氡";s:2:"l";s:3:"氣";s:2:"";s:3:"氤";s:2:"";s:3:"氥";s:2:"D";s:3:"氦";s:2:"";s:3:"氧";s:2:"";s:3:"氨";s:2:"";s:3:"氪";s:2:"";s:3:"氫";s:2:"B";s:3:"氬";s:2:"";s:3:"氮";s:2:"";s:3:"氯";s:2:"";s:3:"氰";s:2:"";s:3:"氳";s:2:"r";s:3:"水";s:2:"";s:3:"氶";s:2:"ɡ";s:3:"永";s:2:"";s:3:"氻";s:2:"ɤ";s:3:"氾";s:2:"";s:3:"氿";s:2:"ɣ";s:3:"汀";s:2:"";s:3:"汁";s:2:"";s:3:"求";s:2:"D";s:3:"汃";s:2:"ɢ";s:3:"汆";s:2:"";s:3:"汊";s:2:"";s:3:"汋";s:2:"";s:3:"汌";s:2:"@";s:3:"汍";s:2:"";s:3:"汎";s:2:"";s:3:"汏";s:2:"";s:3:"汐";s:2:"";s:3:"汒";s:2:"";s:3:"汔";s:2:"";s:3:"汕";s:2:"";s:3:"汗";s:2:"";s:3:"汙";s:2:"";s:3:"汛";s:2:"";s:3:"汜";s:2:"";s:3:"汝";s:2:"";s:3:"汞";s:2:"E";s:3:"江";s:2:"";s:3:"池";s:2:"";s:3:"污";s:2:"";s:3:"汥";s:2:"[";s:3:"汦";s:2:"Y";s:3:"汧";s:2:"L";s:3:"汨";s:2:"Q";s:3:"汩";s:2:"S";s:3:"汪";s:2:"L";s:3:"汫";s:2:"M";s:3:"汭";s:2:"U";s:3:"汯";s:2:"R";s:3:"汰";s:2:"O";s:3:"汱";s:2:"Q";s:3:"汲";s:2:"V";s:3:"汳";s:2:"Z";s:3:"汴";s:2:"X";s:3:"汶";s:2:"Z";s:3:"汸";s:2:"K";s:3:"決";s:2:"M";s:3:"汻";s:2:"\";s:3:"汽";s:2:"T";s:3:"汾";s:2:"W";s:3:"沀";s:2:"E";s:3:"沁";s:2:"G";s:3:"沂";s:2:"^";s:3:"沃";s:2:"U";s:3:"沄";s:2:"N";s:3:"沅";s:2:"J";s:3:"沆";s:2:"Y";s:3:"沇";s:2:"V";s:3:"沈";s:2:"H";s:3:"沉";s:2:"I";s:3:"沊";s:2:"C";s:3:"沋";s:2:"O";s:3:"沌";s:2:"P";s:3:"沍";s:2:"[";s:3:"沎";s:2:"]";s:3:"沏";s:2:"P";s:3:"沐";s:2:"N";s:3:"沒";s:2:"S";s:3:"沓";s:2:"";s:3:"沔";s:2:"\";s:3:"沕";s:2:"W";s:3:"沖";s:2:"R";s:3:"沘";s:2:"]";s:3:"沙";s:2:"F";s:3:"沚";s:2:"T";s:3:"沛";s:2:"K";s:3:"沜";s:2:"X";s:3:"沝";s:2:"D";s:3:"沫";s:2:"j";s:3:"沬";s:2:"z";s:3:"沭";s:2:"";s:3:"沮";s:2:"q";s:3:"沰";s:2:"K";s:3:"沱";s:2:"b";s:3:"河";s:2:"e";s:3:"沴";s:2:"B";s:3:"沶";s:2:"";s:3:"沷";s:2:"";s:3:"沸";s:2:"m";s:3:"油";s:2:"o";s:3:"沺";s:2:"";s:3:"治";s:2:"v";s:3:"沼";s:2:"h";s:3:"沽";s:2:"f";s:3:"沾";s:2:"g";s:3:"沿";s:2:"u";s:3:"泀";s:2:"G";s:3:"況";s:2:"p";s:3:"泂";s:2:"";s:3:"泃";s:2:"";s:3:"泄";s:2:"n";s:3:"泅";s:2:"s";s:3:"泆";s:2:"";s:3:"泇";s:2:"J";s:3:"泉";s:2:"u";s:3:"泊";s:2:"y";s:3:"泌";s:2:"c";s:3:"泍";s:2:"I";s:3:"泏";s:2:"M";s:3:"泐";s:2:"";s:3:"泑";s:2:"O";s:3:"泒";s:2:"@";s:3:"泓";s:2:"l";s:3:"泔";s:2:"";s:3:"法";s:2:"k";s:3:"泖";s:2:"}";s:3:"泗";s:2:"r";s:3:"泙";s:2:"";s:3:"泚";s:2:"u";s:3:"泛";s:2:"x";s:3:"泜";s:2:"|";s:3:"泝";s:2:"A";s:3:"泞";s:2:"F";s:3:"泠";s:2:"~";s:3:"泡";s:2:"w";s:3:"波";s:2:"i";s:3:"泣";s:2:"_";s:3:"泥";s:2:"d";s:3:"泧";s:2:"";s:3:"注";s:2:"`";s:3:"泩";s:2:"N";s:3:"泫";s:2:"";s:3:"泬";s:2:"";s:3:"泭";s:2:"";s:3:"泮";s:2:"";s:3:"泯";s:2:"{";s:3:"泰";s:2:"";s:3:"泱";s:2:"t";s:3:"泲";s:2:"";s:3:"泳";s:2:"a";s:3:"泵";s:2:"";s:3:"泹";s:2:"L";s:3:"洀";s:2:"|";s:3:"洁";s:2:"ϡ";s:3:"洃";s:2:"Ϥ";s:3:"洄";s:2:"w";s:3:"洇";s:2:"ϧ";s:3:"洈";s:2:"Ϫ";s:3:"洉";s:2:"Ϭ";s:3:"洊";s:2:"t";s:3:"洋";s:2:"v";s:3:"洌";s:2:"{";s:3:"洍";s:2:"I";s:3:"洎";s:2:"";s:3:"洏";s:2:"ϥ";s:3:"洐";s:2:"ϭ";s:3:"洑";s:2:"{";s:3:"洒";s:2:"s";s:3:"洖";s:2:"d";s:3:"洗";s:2:"~";s:3:"洘";s:2:"Ϣ";s:3:"洙";s:2:"x";s:3:"洚";s:2:"z";s:3:"洛";s:2:"";s:3:"洝";s:2:"}";s:3:"洞";s:2:"}";s:3:"洟";s:2:"p";s:3:"洠";s:2:"Ϩ";s:3:"洢";s:2:"ϫ";s:3:"津";s:2:"z";s:3:"洧";s:2:"";s:3:"洨";s:2:"m";s:3:"洩";s:2:"";s:3:"洪";s:2:"x";s:3:"洫";s:2:"";s:3:"洬";s:2:"ϩ";s:3:"洭";s:2:"o";s:3:"洮";s:2:"";s:3:"洯";s:2:"^";s:3:"洰";s:2:"H";s:3:"洱";s:2:"|";s:3:"洲";s:2:"w";s:3:"洳";s:2:"v";s:3:"洴";s:2:"n";s:3:"洵";s:2:"";s:3:"洶";s:2:"";s:3:"洷";s:2:"ϣ";s:3:"洸";s:2:"";s:3:"洹";s:2:"";s:3:"洺";s:2:"y";s:3:"活";s:2:"";s:3:"洼";s:2:"q";s:3:"洽";s:2:"";s:3:"派";s:2:"";s:3:"洿";s:2:"r";s:3:"浀";s:2:"Ϧ";s:3:"流";s:2:"y";s:3:"浂";s:2:"~";s:3:"浘";s:2:"L";s:3:"浙";s:2:"";s:3:"浚";s:2:"C";s:3:"浞";s:2:"U";s:3:"浟";s:2:"[";s:3:"浠";s:2:"W";s:3:"浡";s:2:"J";s:3:"浢";s:2:"M";s:3:"浣";s:2:"F";s:3:"浤";s:2:"G";s:3:"浥";s:2:"J";s:3:"浦";s:2:"";s:3:"浧";s:2:"V";s:3:"浨";s:2:"_";s:3:"浩";s:2:"E";s:3:"浪";s:2:"";s:3:"浬";s:2:"@";s:3:"浭";s:2:"N";s:3:"浮";s:2:"B";s:3:"浯";s:2:"O";s:3:"浰";s:2:"Y";s:3:"浴";s:2:"D";s:3:"浵";s:2:"h";s:3:"浶";s:2:"H";s:3:"海";s:2:"";s:3:"浸";s:2:"";s:3:"浹";s:2:"H";s:3:"浺";s:2:"E";s:3:"浻";s:2:"f";s:3:"浼";s:2:"Z";s:3:"浽";s:2:"g";s:3:"浾";s:2:"a";s:3:"浿";s:2:"S";s:3:"涀";s:2:"b";s:3:"涂";s:2:"\";s:3:"涃";s:2:"e";s:3:"涄";s:2:"c";s:3:"涅";s:2:"I";s:3:"涆";s:2:"T";s:3:"涇";s:2:"";s:3:"消";s:2:"";s:3:"涉";s:2:"A";s:3:"涊";s:2:"G";s:3:"涋";s:2:"`";s:3:"涌";s:2:"F";s:3:"涍";s:2:"Q";s:3:"涎";s:2:"C";s:3:"涐";s:2:"i";s:3:"涑";s:2:"P";s:3:"涒";s:2:"K";s:3:"涓";s:2:"";s:3:"涔";s:2:"K";s:3:"涕";s:2:"";s:3:"涗";s:2:"X";s:3:"涘";s:2:"]";s:3:"涪";s:2:"e";s:3:"涫";s:2:"";s:3:"涬";s:2:"";s:3:"涮";s:2:"R";s:3:"涯";s:2:"P";s:3:"液";s:2:"G";s:3:"涳";s:2:"";s:3:"涴";s:2:"";s:3:"涵";s:2:"[";s:3:"涷";s:2:"";s:3:"涸";s:2:"U";s:3:"涺";s:2:"";s:3:"涻";s:2:"G";s:3:"涼";s:2:"D";s:3:"涽";s:2:"";s:3:"涾";s:2:"";s:3:"涿";s:2:"g";s:3:"淀";s:2:"";s:3:"淂";s:2:"";s:3:"淄";s:2:"d";s:3:"淅";s:2:"X";s:3:"淆";s:2:"c";s:3:"淇";s:2:"N";s:3:"淈";s:2:"";s:3:"淉";s:2:"";s:3:"淊";s:2:"";s:3:"淋";s:2:"O";s:3:"淌";s:2:"I";s:3:"淍";s:2:"E";s:3:"淏";s:2:"";s:3:"淐";s:2:"@";s:3:"淑";s:2:"Q";s:3:"淒";s:2:"Y";s:3:"淓";s:2:"B";s:3:"淔";s:2:"";s:3:"淕";s:2:"";s:3:"淖";s:2:"";s:3:"淗";s:2:"D";s:3:"淘";s:2:"^";s:3:"淙";s:2:"F";s:3:"淚";s:2:"\";s:3:"淛";s:2:"";s:3:"淜";s:2:"";s:3:"淝";s:2:"";s:3:"淞";s:2:"S";s:3:"淟";s:2:"";s:3:"淠";s:2:"";s:3:"淡";s:2:"H";s:3:"淢";s:2:"";s:3:"淣";s:2:"F";s:3:"淤";s:2:"J";s:3:"淥";s:2:"";s:3:"淦";s:2:"h";s:3:"淨";s:2:"b";s:3:"淩";s:2:"";s:3:"淪";s:2:"_";s:3:"淫";s:2:"]";s:3:"淬";s:2:"f";s:3:"淭";s:2:"";s:3:"淮";s:2:"a";s:3:"淯";s:2:"R";s:3:"淰";s:2:"";s:3:"深";s:2:"`";s:3:"淲";s:2:"A";s:3:"淳";s:2:"E";s:3:"淴";s:2:"";s:3:"淵";s:2:"W";s:3:"淶";s:2:"";s:3:"混";s:2:"V";s:3:"淹";s:2:"T";s:3:"淺";s:2:"L";s:3:"添";s:2:"K";s:3:"淼";s:2:"";s:3:"淽";s:2:"C";s:3:"渀";s:2:"";s:3:"渃";s:2:"";s:3:"清";s:2:"M";s:3:"渙";s:2:"A";s:3:"渚";s:2:"Z";s:3:"減";s:2:"";s:3:"渜";s:2:"";s:3:"渝";s:2:"";s:3:"渟";s:2:"";s:3:"渠";s:2:"";s:3:"渡";s:2:"";s:3:"渢";s:2:"I";s:3:"渣";s:2:"";s:3:"渤";s:2:"";s:3:"渥";s:2:"";s:3:"渦";s:2:"";s:3:"渧";s:2:"M";s:3:"渨";s:2:"D";s:3:"渫";s:2:"";s:3:"測";s:2:"";s:3:"渭";s:2:"";s:3:"渮";s:2:"";s:3:"港";s:2:"";s:3:"渰";s:2:"J";s:3:"渱";s:2:"C";s:3:"渲";s:2:"";s:3:"渳";s:2:"";s:3:"渴";s:2:"";s:3:"渵";s:2:"U";s:3:"渶";s:2:"V";s:3:"游";s:2:"";s:3:"渹";s:2:"H";s:3:"渺";s:2:"";s:3:"渻";s:2:"";s:3:"渼";s:2:"";s:3:"渽";s:2:"";s:3:"渾";s:2:"";s:3:"渿";s:2:"";s:3:"湀";s:2:"";s:3:"湁";s:2:"";s:3:"湃";s:2:"";s:3:"湄";s:2:"D";s:3:"湅";s:2:"";s:3:"湆";s:2:"";s:3:"湇";s:2:"";s:3:"湉";s:2:"";s:3:"湊";s:2:"";s:3:"湋";s:2:"";s:3:"湍";s:2:"";s:3:"湎";s:2:"B";s:3:"湑";s:2:"";s:3:"湒";s:2:"S";s:3:"湓";s:2:"K";s:3:"湔";s:2:"";s:3:"湕";s:2:"Q";s:3:"湖";s:2:"";s:3:"湘";s:2:"";s:3:"湚";s:2:"W";s:3:"湛";s:2:"";s:3:"湜";s:2:"A";s:3:"湝";s:2:"";s:3:"湞";s:2:"";s:3:"湟";s:2:"G";s:3:"湠";s:2:"E";s:3:"湡";s:2:"B";s:3:"湢";s:2:"";s:3:"湣";s:2:"C";s:3:"湤";s:2:"O";s:3:"湥";s:2:"L";s:3:"湦";s:2:"T";s:3:"湧";s:2:"";s:3:"湨";s:2:"@";s:3:"湩";s:2:"F";s:3:"湫";s:2:"G";s:3:"湮";s:2:"";s:3:"湯";s:2:"";s:3:"湱";s:2:"F";s:3:"湲";s:2:"E";s:3:"湳";s:2:"";s:3:"湴";s:2:"";s:3:"湷";s:2:"P";s:3:"湸";s:2:"N";s:3:"湹";s:2:"R";s:3:"溈";s:2:"";s:3:"溉";s:2:"@";s:3:"溍";s:2:"a";s:3:"溎";s:2:"`";s:3:"溏";s:2:"F";s:3:"源";s:2:"";s:3:"溒";s:2:"_";s:3:"溓";s:2:"I";s:3:"溔";s:2:"J";s:3:"準";s:2:"";s:3:"溗";s:2:"h";s:3:"溘";s:2:"";s:3:"溙";s:2:"^";s:3:"溛";s:2:"C";s:3:"溜";s:2:"";s:3:"溝";s:2:"";s:3:"溞";s:2:"R";s:3:"溟";s:2:"H";s:3:"溠";s:2:"K";s:3:"溡";s:2:"c";s:3:"溢";s:2:"";s:3:"溣";s:2:"j";s:3:"溤";s:2:"b";s:3:"溥";s:2:"";s:3:"溦";s:2:"W";s:3:"溧";s:2:"";s:3:"溪";s:2:"";s:3:"溫";s:2:"";s:3:"溮";s:2:"i";s:3:"溯";s:2:"";s:3:"溰";s:2:"U";s:3:"溱";s:2:"L";s:3:"溲";s:2:"Y";s:3:"溳";s:2:"e";s:3:"溴";s:2:"";s:3:"溶";s:2:"";s:3:"溷";s:2:"T";s:3:"溹";s:2:"M";s:3:"溺";s:2:"";s:3:"溼";s:2:"";s:3:"溽";s:2:"P";s:3:"溾";s:2:"Z";s:3:"溿";s:2:"d";s:3:"滀";s:2:"G";s:3:"滁";s:2:"Q";s:3:"滂";s:2:"";s:3:"滃";s:2:"[";s:3:"滄";s:2:"";s:3:"滅";s:2:"";s:3:"滆";s:2:"N";s:3:"滇";s:2:"";s:3:"滈";s:2:"E";s:3:"滉";s:2:"S";s:3:"滊";s:2:"g";s:3:"滋";s:2:"";s:3:"滌";s:2:"";s:3:"滍";s:2:"V";s:3:"滎";s:2:"l";s:3:"滏";s:2:"X";s:3:"滐";s:2:"f";s:3:"滑";s:2:"";s:3:"滒";s:2:"O";s:3:"滓";s:2:"";s:3:"滔";s:2:"";s:3:"滕";s:2:"";s:3:"滖";s:2:"D";s:3:"滘";s:2:"]";s:3:"滜";s:2:"\";s:3:"滫";s:2:"";s:3:"滬";s:2:"";s:3:"滭";s:2:"}";s:3:"滮";s:2:"";s:3:"滯";s:2:"";s:3:"滱";s:2:"n";s:3:"滲";s:2:"";s:3:"滴";s:2:"w";s:3:"滵";s:2:"m";s:3:"滶";s:2:"";s:3:"滷";s:2:"";s:3:"滸";s:2:"q";s:3:"滹";s:2:"";s:3:"滻";s:2:"s";s:3:"滼";s:2:"";s:3:"滽";s:2:"";s:3:"滾";s:2:"u";s:3:"滿";s:2:"";s:3:"漀";s:2:"S";s:3:"漁";s:2:"";s:3:"漂";s:2:"}";s:3:"漃";s:2:"o";s:3:"漅";s:2:"";s:3:"漆";s:2:"";s:3:"漇";s:2:"";s:3:"漈";s:2:"";s:3:"漉";s:2:"u";s:3:"漊";s:2:"~";s:3:"漍";s:2:"";s:3:"漎";s:2:"";s:3:"漏";s:2:"|";s:3:"漒";s:2:"|";s:3:"漓";s:2:"v";s:3:"演";s:2:"t";s:3:"漕";s:2:"";s:3:"漘";s:2:"z";s:3:"漙";s:2:"w";s:3:"漚";s:2:"x";s:3:"漜";s:2:"";s:3:"漞";s:2:"";s:3:"漟";s:2:"";s:3:"漠";s:2:"z";s:3:"漡";s:2:"";s:3:"漢";s:2:"~";s:3:"漣";s:2:"";s:3:"漥";s:2:"p";s:3:"漦";s:2:"";s:3:"漧";s:2:"y";s:3:"漩";s:2:"x";s:3:"漪";s:2:"";s:3:"漫";s:2:"";s:3:"漬";s:2:"{";s:3:"漭";s:2:"";s:3:"漮";s:2:"t";s:3:"漯";s:2:"";s:3:"漰";s:2:"";s:3:"漱";s:2:"";s:3:"漲";s:2:"";s:3:"漳";s:2:"s";s:3:"漵";s:2:"";s:3:"漶";s:2:"";s:3:"漷";s:2:"r";s:3:"漸";s:2:"";s:3:"漹";s:2:"";s:3:"漺";s:2:"";s:3:"漻";s:2:"{";s:3:"漼";s:2:"";s:3:"漾";s:2:"y";s:3:"漿";s:2:"";s:3:"潀";s:2:"";s:3:"潁";s:2:"";s:3:"潃";s:2:"";s:3:"潎";s:2:"v";s:3:"潏";s:2:"D";s:3:"潐";s:2:"N";s:3:"潑";s:2:"";s:3:"潒";s:2:"M";s:3:"潓";s:2:"Y";s:3:"潔";s:2:"";s:3:"潕";s:2:"K";s:3:"潗";s:2:"O";s:3:"潘";s:2:"";s:3:"潚";s:2:"F";s:3:"潛";s:2:"";s:3:"潝";s:2:"R";s:3:"潞";s:2:"";s:3:"潟";s:2:"";s:3:"潠";s:2:"";s:3:"潡";s:2:"T";s:3:"潢";s:2:"C";s:3:"潣";s:2:"^";s:3:"潤";s:2:"";s:3:"潦";s:2:"";s:3:"潧";s:2:"W";s:3:"潩";s:2:"[";s:3:"潪";s:2:"`";s:3:"潫";s:2:"U";s:3:"潬";s:2:"I";s:3:"潭";s:2:"";s:3:"潮";s:2:"";s:3:"潯";s:2:"";s:3:"潰";s:2:"";s:3:"潲";s:2:"L";s:3:"潳";s:2:"";s:3:"潶";s:2:"H";s:3:"潷";s:2:"_";s:3:"潸";s:2:"";s:3:"潺";s:2:"";s:3:"潻";s:2:"a";s:3:"潼";s:2:"";s:3:"潽";s:2:"V";s:3:"潾";s:2:"";s:3:"潿";s:2:"\";s:3:"澀";s:2:"";s:3:"澂";s:2:"J";s:3:"澄";s:2:"";s:3:"澅";s:2:"E";s:3:"澆";s:2:"";s:3:"澇";s:2:"";s:3:"澈";s:2:"";s:3:"澉";s:2:"A";s:3:"澋";s:2:"Z";s:3:"澌";s:2:"B";s:3:"澍";s:2:"@";s:3:"澎";s:2:"";s:3:"澐";s:2:"X";s:3:"澒";s:2:"";s:3:"澓";s:2:"Q";s:3:"澔";s:2:"P";s:3:"澕";s:2:"]";s:3:"澖";s:2:"G";s:3:"澗";s:2:"";s:3:"澞";s:2:"";s:3:"澠";s:2:"I";s:3:"澡";s:2:"";s:3:"澢";s:2:"@";s:3:"澣";s:2:"";s:3:"澤";s:2:"A";s:3:"澥";s:2:"";s:3:"澦";s:2:"H";s:3:"澧";s:2:"C";s:3:"澨";s:2:"";s:3:"澩";s:2:"O";s:3:"澪";s:2:"";s:3:"澫";s:2:"B";s:3:"澬";s:2:"";s:3:"澭";s:2:"";s:3:"澮";s:2:"";s:3:"澯";s:2:"D";s:3:"澰";s:2:"F";s:3:"澱";s:2:"";s:3:"澲";s:2:"E";s:3:"澳";s:2:"D";s:3:"澴";s:2:"J";s:3:"澶";s:2:"G";s:3:"澸";s:2:"";s:3:"澹";s:2:"F";s:3:"澺";s:2:"";s:3:"澼";s:2:"";s:3:"澽";s:2:"";s:3:"澿";s:2:"";s:3:"激";s:2:"E";s:3:"濁";s:2:"B";s:3:"濂";s:2:"";s:3:"濃";s:2:"@";s:3:"濄";s:2:"";s:3:"濆";s:2:"";s:3:"濇";s:2:"";s:3:"濈";s:2:"";s:3:"濉";s:2:"A";s:3:"濊";s:2:"";s:3:"濋";s:2:"";s:3:"濌";s:2:"N";s:3:"濍";s:2:"C";s:3:"濎";s:2:"";s:3:"濏";s:2:"";s:3:"濔";s:2:"Q";s:3:"濕";s:2:"";s:3:"濘";s:2:"";s:3:"濛";s:2:"";s:3:"濜";s:2:"S";s:3:"濝";s:2:"Y";s:3:"濞";s:2:"W";s:3:"濟";s:2:"";s:3:"濠";s:2:"";s:3:"濡";s:2:"";s:3:"濢";s:2:"Z";s:3:"濣";s:2:"R";s:3:"濤";s:2:"";s:3:"濦";s:2:"V";s:3:"濧";s:2:"U";s:3:"濨";s:2:"[";s:3:"濩";s:2:"";s:3:"濫";s:2:"";s:3:"濬";s:2:"";s:3:"濭";s:2:"T";s:3:"濮";s:2:"";s:3:"濯";s:2:"";s:3:"濰";s:2:"";s:3:"濱";s:2:"";s:3:"濲";s:2:"X";s:3:"濴";s:2:"P";s:3:"濷";s:2:"";s:3:"濺";s:2:"q";s:3:"濻";s:2:"";s:3:"濼";s:2:"";s:3:"濾";s:2:"o";s:3:"濿";s:2:"";s:3:"瀀";s:2:"";s:3:"瀁";s:2:"";s:3:"瀄";s:2:"";s:3:"瀅";s:2:"";s:3:"瀆";s:2:"p";s:3:"瀇";s:2:"";s:3:"瀉";s:2:"m";s:3:"瀊";s:2:"";s:3:"瀋";s:2:"n";s:3:"瀌";s:2:"";s:3:"瀍";s:2:"";s:3:"瀎";s:2:"";s:3:"瀏";s:2:"s";s:3:"瀑";s:2:"r";s:3:"瀔";s:2:"";s:3:"瀕";s:2:"x";s:3:"瀖";s:2:"_";s:3:"瀗";s:2:"e";s:3:"瀘";s:2:"y";s:3:"瀙";s:2:"\";s:3:"瀚";s:2:"v";s:3:"瀛";s:2:"s";s:3:"瀜";s:2:"g";s:3:"瀝";s:2:"w";s:3:"瀟";s:2:"t";s:3:"瀠";s:2:"^";s:3:"瀡";s:2:"a";s:3:"瀢";s:2:"b";s:3:"瀣";s:2:"c";s:3:"瀤";s:2:"f";s:3:"瀦";s:2:"";s:3:"瀧";s:2:"]";s:3:"瀨";s:2:"u";s:3:"瀩";s:2:"d";s:3:"瀪";s:2:"h";s:3:"瀫";s:2:"`";s:3:"瀯";s:2:"]";s:3:"瀰";s:2:"j";s:3:"瀱";s:2:"`";s:3:"瀲";s:2:"k";s:3:"瀳";s:2:"h";s:3:"瀴";s:2:"_";s:3:"瀵";s:2:"\";s:3:"瀷";s:2:"^";s:3:"瀸";s:2:"b";s:3:"瀹";s:2:"e";s:3:"瀺";s:2:"d";s:3:"瀻";s:2:"g";s:3:"瀼";s:2:"[";s:3:"瀾";s:2:"i";s:3:"瀿";s:2:"c";s:3:"灀";s:2:"f";s:3:"灁";s:2:"i";s:3:"灂";s:2:"a";s:3:"灃";s:2:"";s:3:"灄";s:2:"";s:3:"灅";s:2:"";s:3:"灆";s:2:"";s:3:"灈";s:2:"";s:3:"灉";s:2:"";s:3:"灊";s:2:"";s:3:"灌";s:2:"";s:3:"灑";s:2:"x";s:3:"灒";s:2:"";s:3:"灕";s:2:"";s:3:"灖";s:2:"";s:3:"灗";s:2:"";s:3:"灘";s:2:"y";s:3:"灚";s:2:"";s:3:"灛";s:2:"";s:3:"灝";s:2:"";s:3:"灞";s:2:"";s:3:"灟";s:2:"";s:3:"灠";s:2:"";s:3:"灡";s:2:"";s:3:"灢";s:2:"";s:3:"灣";s:2:"W";s:3:"灤";s:2:"e";s:3:"灥";s:2:"";s:3:"灦";s:2:"l";s:3:"灨";s:2:"";s:3:"灩";s:2:"";s:3:"灪";s:2:"";s:3:"火";s:2:"";s:3:"灰";s:2:"";s:3:"灱";s:2:"A";s:3:"灴";s:2:"^";s:3:"灶";s:2:"_";s:3:"灸";s:2:"b";s:3:"灺";s:2:"_";s:3:"灼";s:2:"`";s:3:"災";s:2:"a";s:3:"炂";s:2:"X";s:3:"炃";s:2:"Z";s:3:"炄";s:2:"U";s:3:"炅";s:2:"R";s:3:"炆";s:2:"T";s:3:"炊";s:2:"";s:3:"炎";s:2:"";s:3:"炑";s:2:"V";s:3:"炒";s:2:"";s:3:"炓";s:2:"S";s:3:"炔";s:2:"P";s:3:"炕";s:2:"";s:3:"炖";s:2:"W";s:3:"炘";s:2:"Q";s:3:"炙";s:2:"";s:3:"炚";s:2:"Y";s:3:"炟";s:2:"ϯ";s:3:"炡";s:2:"ϳ";s:3:"炤";s:2:"";s:3:"炩";s:2:"϶";s:3:"炫";s:2:"";s:3:"炬";s:2:"";s:3:"炭";s:2:"";s:3:"炮";s:2:"";s:3:"炯";s:2:"";s:3:"炰";s:2:"ϲ";s:3:"炱";s:2:"ϱ";s:3:"炳";s:2:"";s:3:"炴";s:2:"ϴ";s:3:"炵";s:2:"ϵ";s:3:"炷";s:2:"Ϯ";s:3:"炸";s:2:"";s:3:"為";s:2:"";s:3:"炾";s:2:"ϰ";s:3:"烅";s:2:"w";s:3:"烆";s:2:"x";s:3:"烇";s:2:"y";s:3:"烈";s:2:"P";s:3:"烊";s:2:"L";s:3:"烋";s:2:"n";s:3:"烍";s:2:"v";s:3:"烎";s:2:"{";s:3:"烏";s:2:"Q";s:3:"烑";s:2:"l";s:3:"烒";s:2:"r";s:3:"烓";s:2:"k";s:3:"烔";s:2:"u";s:3:"烗";s:2:"q";s:3:"烘";s:2:"M";s:3:"烙";s:2:"O";s:3:"烚";s:2:"z";s:3:"烜";s:2:"j";s:3:"烝";s:2:"m";s:3:"烞";s:2:"s";s:3:"烠";s:2:"t";s:3:"烡";s:2:"|";s:3:"烢";s:2:"p";s:3:"烤";s:2:"N";s:3:"烯";s:2:"m";s:3:"烰";s:2:"N";s:3:"烳";s:2:"P";s:3:"烴";s:2:"L";s:3:"烶";s:2:"X";s:3:"烷";s:2:"J";s:3:"烸";s:2:"W";s:3:"烹";s:2:"i";s:3:"烺";s:2:"H";s:3:"烻";s:2:"[";s:3:"烼";s:2:"R";s:3:"烽";s:2:"l";s:3:"烿";s:2:"S";s:3:"焀";s:2:"V";s:3:"焂";s:2:"Z";s:3:"焄";s:2:"O";s:3:"焆";s:2:"T";s:3:"焉";s:2:"j";s:3:"焊";s:2:"k";s:3:"焋";s:2:"Y";s:3:"焌";s:2:"M";s:3:"焍";s:2:"I";s:3:"焎";s:2:"[";s:3:"焐";s:2:"Q";s:3:"焓";s:2:"U";s:3:"焗";s:2:"K";s:3:"焙";s:2:"H";s:3:"焚";s:2:"I";s:3:"焛";s:2:"e";s:3:"焜";s:2:"O";s:3:"焞";s:2:"Y";s:3:"焟";s:2:"b";s:3:"焠";s:2:"X";s:3:"無";s:2:"L";s:3:"焢";s:2:"`";s:3:"焣";s:2:"^";s:3:"焥";s:2:"_";s:3:"焦";s:2:"J";s:3:"焨";s:2:"c";s:3:"焮";s:2:"\";s:3:"焯";s:2:"Z";s:3:"焰";s:2:"K";s:3:"焱";s:2:"]";s:3:"焲";s:2:"a";s:3:"然";s:2:"M";s:3:"焺";s:2:"d";s:3:"煁";s:2:"p";s:3:"煂";s:2:"w";s:3:"煃";s:2:"y";s:3:"煄";s:2:"ޡ";s:3:"煆";s:2:"";s:3:"煇";s:2:"k";s:3:"煉";s:2:"";s:3:"煋";s:2:"z";s:3:"煌";s:2:"";s:3:"煍";s:2:"ޢ";s:3:"煎";s:2:"";s:3:"煐";s:2:"}";s:3:"煒";s:2:"m";s:3:"煓";s:2:"~";s:3:"煔";s:2:"l";s:3:"煖";s:2:"";s:3:"煘";s:2:"x";s:3:"煙";s:2:"";s:3:"煚";s:2:"ޣ";s:3:"煜";s:2:"";s:3:"煝";s:2:"q";s:3:"煞";s:2:"";s:3:"煟";s:2:"|";s:3:"煠";s:2:"o";s:3:"煡";s:2:"v";s:3:"煢";s:2:"r";s:3:"煣";s:2:"n";s:3:"煤";s:2:"";s:3:"煥";s:2:"";s:3:"煦";s:2:"";s:3:"照";s:2:"";s:3:"煨";s:2:"";s:3:"煩";s:2:"";s:3:"煪";s:2:"u";s:3:"煬";s:2:"";s:3:"煮";s:2:"N";s:3:"煰";s:2:"{";s:3:"煲";s:2:"s";s:3:"煸";s:2:"t";s:3:"煻";s:2:"";s:3:"煽";s:2:"";s:3:"熀";s:2:"";s:3:"熁";s:2:"";s:3:"熂";s:2:"";s:3:"熄";s:2:"";s:3:"熅";s:2:"";s:3:"熆";s:2:"";s:3:"熇";s:2:"";s:3:"熉";s:2:"";s:3:"熊";s:2:"";s:3:"熏";s:2:"";s:3:"熐";s:2:"";s:3:"熒";s:2:"";s:3:"熔";s:2:"";s:3:"熗";s:2:"";s:3:"熙";s:2:"";s:3:"熚";s:2:"g";s:3:"熛";s:2:"d";s:3:"熜";s:2:"p";s:3:"熝";s:2:"j";s:3:"熞";s:2:"l";s:3:"熟";s:2:"";s:3:"熠";s:2:"f";s:3:"熡";s:2:"n";s:3:"熤";s:2:"m";s:3:"熥";s:2:"k";s:3:"熧";s:2:"q";s:3:"熨";s:2:"";s:3:"熩";s:2:"h";s:3:"熪";s:2:"o";s:3:"熬";s:2:"";s:3:"熯";s:2:"c";s:3:"熰";s:2:"e";s:3:"熱";s:2:"";s:3:"熲";s:2:"b";s:3:"熳";s:2:"r";s:3:"熵";s:2:"i";s:3:"熸";s:2:"J";s:3:"熹";s:2:"Q";s:3:"熼";s:2:"U";s:3:"熽";s:2:"S";s:3:"熾";s:2:"K";s:3:"熿";s:2:"I";s:3:"燀";s:2:"L";s:3:"燁";s:2:"M";s:3:"燂";s:2:"H";s:3:"燃";s:2:"U";s:3:"燄";s:2:"V";s:3:"燅";s:2:"G";s:3:"燆";s:2:"V";s:3:"燇";s:2:"Q";s:3:"燈";s:2:"O";s:3:"燉";s:2:"L";s:3:"燊";s:2:"P";s:3:"燋";s:2:"N";s:3:"燎";s:2:"R";s:3:"燏";s:2:"R";s:3:"燐";s:2:"M";s:3:"燒";s:2:"N";s:3:"燔";s:2:"O";s:3:"燕";s:2:"P";s:3:"燖";s:2:"K";s:3:"燘";s:2:"T";s:3:"燙";s:2:"S";s:3:"燚";s:2:"W";s:3:"燛";s:2:"X";s:3:"燜";s:2:"T";s:3:"營";s:2:"";s:3:"燠";s:2:"";s:3:"燡";s:2:"\";s:3:"燢";s:2:"b";s:3:"燤";s:2:"`";s:3:"燥";s:2:"";s:3:"燦";s:2:"";s:3:"燧";s:2:"";s:3:"燨";s:2:"^";s:3:"燬";s:2:"";s:3:"燭";s:2:"";s:3:"燮";s:2:"";s:3:"燰";s:2:"a";s:3:"燱";s:2:"]";s:3:"燲";s:2:"_";s:3:"燴";s:2:"";s:3:"燸";s:2:"w";s:3:"燹";s:2:"";s:3:"燻";s:2:"t";s:3:"燼";s:2:"u";s:3:"燽";s:2:"";s:3:"燾";s:2:"v";s:3:"燿";s:2:"";s:3:"爁";s:2:"";s:3:"爂";s:2:"l";s:3:"爃";s:2:"";s:3:"爅";s:2:"m";s:3:"爆";s:2:"z";s:3:"爇";s:2:"k";s:3:"爊";s:2:"j";s:3:"爌";s:2:"i";s:3:"爍";s:2:"{";s:3:"爐";s:2:"l";s:3:"爓";s:2:"j";s:3:"爔";s:2:"k";s:3:"爙";s:2:"";s:3:"爚";s:2:"";s:3:"爛";s:2:"";s:3:"爝";s:2:"";s:3:"爞";s:2:"";s:3:"爟";s:2:"";s:3:"爢";s:2:"";s:3:"爣";s:2:"";s:3:"爦";s:2:"";s:3:"爧";s:2:"";s:3:"爨";s:2:"y";s:3:"爩";s:2:"";s:3:"爪";s:2:"";s:3:"爬";s:2:"";s:3:"爭";s:2:"";s:3:"爰";s:2:"";s:3:"爵";s:2:"";s:3:"父";s:2:"";s:3:"爸";s:2:"";s:3:"爹";s:2:"R";s:3:"爺";s:2:"";s:3:"爻";s:2:"";s:3:"爽";s:2:"n";s:3:"爾";s:2:"";s:3:"爿";s:2:"b";s:3:"牁";s:2:"Ϸ";s:3:"牂";s:2:"}";s:3:"牄";s:2:"";s:3:"牆";s:2:"";s:3:"片";s:2:"";s:3:"版";s:2:"";s:3:"牉";s:2:"ϸ";s:3:"牊";s:2:"Ϲ";s:3:"牋";s:2:"f";s:3:"牌";s:2:"P";s:3:"牏";s:2:"ޤ";s:3:"牒";s:2:"";s:3:"牓";s:2:"";s:3:"牖";s:2:"";s:3:"牘";s:2:"|";s:3:"牙";s:2:"";s:3:"牚";s:2:"g";s:3:"牛";s:2:"";s:3:"牝";s:2:"";s:3:"牞";s:2:"B";s:3:"牟";s:2:"";s:3:"牠";s:2:"e";s:3:"牡";s:2:"d";s:3:"牢";s:2:"c";s:3:"牣";s:2:"`";s:3:"牧";s:2:"";s:3:"物";s:2:"";s:3:"牪";s:2:"[";s:3:"牬";s:2:"Ϻ";s:3:"牮";s:2:"Ͻ";s:3:"牯";s:2:"";s:3:"牰";s:2:"ϻ";s:3:"牲";s:2:"";s:3:"牳";s:2:"ϼ";s:3:"牴";s:2:"";s:3:"牶";s:2:"Ң";s:3:"牷";s:2:"ҡ";s:3:"牸";s:2:"~";s:3:"特";s:2:"S";s:3:"牻";s:2:"]";s:3:"牼";s:2:"^";s:3:"牽";s:2:"o";s:3:"牾";s:2:"\";s:3:"牿";s:2:"_";s:3:"犀";s:2:"R";s:3:"犁";s:2:"p";s:3:"犄";s:2:"Q";s:3:"犅";s:2:"k";s:3:"犆";s:2:"j";s:3:"犈";s:2:"h";s:3:"犉";s:2:"i";s:3:"犋";s:2:"l";s:3:"犌";s:2:"ަ";s:3:"犍";s:2:"ޥ";s:3:"犎";s:2:"ީ";s:3:"犐";s:2:"ި";s:3:"犑";s:2:"ާ";s:3:"犒";s:2:"";s:3:"犓";s:2:"";s:3:"犕";s:2:"";s:3:"犖";s:2:"";s:3:"犗";s:2:"";s:3:"犘";s:2:"s";s:3:"犚";s:2:"t";s:3:"犛";s:2:"";s:3:"犝";s:2:"Y";s:3:"犞";s:2:"Z";s:3:"犡";s:2:"r";s:3:"犢";s:2:"}";s:3:"犣";s:2:"q";s:3:"犤";s:2:"p";s:3:"犥";s:2:"n";s:3:"犦";s:2:"o";s:3:"犧";s:2:"";s:3:"犨";s:2:"l";s:3:"犩";s:2:"";s:3:"犪";s:2:"";s:3:"犬";s:2:"";s:3:"犮";s:2:"ɥ";s:3:"犯";s:2:"";s:3:"犰";s:2:"ɦ";s:3:"犴";s:2:"C";s:3:"犵";s:2:"D";s:3:"犺";s:2:"f";s:3:"犽";s:2:"b";s:3:"犿";s:2:"a";s:3:"狀";s:2:"";s:3:"狁";s:2:"e";s:3:"狂";s:2:"g";s:3:"狃";s:2:"c";s:3:"狄";s:2:"f";s:3:"狅";s:2:"g";s:3:"狆";s:2:"d";s:3:"狉";s:2:"_";s:3:"狊";s:2:"Ͼ";s:3:"狋";s:2:"]";s:3:"狌";s:2:"d";s:3:"狎";s:2:"";s:3:"狐";s:2:"";s:3:"狑";s:2:"e";s:3:"狒";s:2:"a";s:3:"狔";s:2:"b";s:3:"狖";s:2:"\";s:3:"狗";s:2:"";s:3:"狘";s:2:"^";s:3:"狙";s:2:"";s:3:"狚";s:2:"c";s:3:"狜";s:2:"`";s:3:"狟";s:2:"";s:3:"狠";s:2:"";s:3:"狡";s:2:"";s:3:"狣";s:2:"";s:3:"狤";s:2:"Ͽ";s:3:"狦";s:2:"";s:3:"狨";s:2:"";s:3:"狩";s:2:"";s:3:"狪";s:2:"";s:3:"狫";s:2:"";s:3:"狳";s:2:"Ҩ";s:3:"狴";s:2:"ҥ";s:3:"狶";s:2:"ҧ";s:3:"狷";s:2:"X";s:3:"狸";s:2:"W";s:3:"狹";s:2:"U";s:3:"狺";s:2:"Ҥ";s:3:"狻";s:2:"ҩ";s:3:"狼";s:2:"T";s:3:"狽";s:2:"V";s:3:"狾";s:2:"Ҧ";s:3:"狿";s:2:"g";s:3:"猀";s:2:"ң";s:3:"猁";s:2:"Ҫ";s:3:"猇";s:2:"b";s:3:"猈";s:2:"f";s:3:"猊";s:2:"e";s:3:"猋";s:2:"n";s:3:"猌";s:2:"y";s:3:"猏";s:2:"h";s:3:"猑";s:2:"c";s:3:"猒";s:2:"m";s:3:"猓";s:2:"t";s:3:"猖";s:2:"s";s:3:"猗";s:2:"a";s:3:"猘";s:2:"d";s:3:"猙";s:2:"u";s:3:"猛";s:2:"r";s:3:"猜";s:2:"q";s:3:"猝";s:2:"`";s:3:"猞";s:2:"i";s:3:"猢";s:2:"p";s:3:"猣";s:2:"w";s:3:"猥";s:2:"T";s:3:"猦";s:2:"v";s:3:"猧";s:2:"s";s:3:"猩";s:2:"V";s:3:"猭";s:2:"u";s:3:"猰";s:2:"o";s:3:"猱";s:2:"q";s:3:"猲";s:2:"t";s:3:"猳";s:2:"r";s:3:"猴";s:2:"U";s:3:"猵";s:2:"x";s:3:"猶";s:2:"S";s:3:"猷";s:2:"";s:3:"猺";s:2:"ޭ";s:3:"猻";s:2:"ެ";s:3:"猼";s:2:"ު";s:3:"猾";s:2:"";s:3:"猿";s:2:"";s:3:"獀";s:2:"ޮ";s:3:"獂";s:2:"ޫ";s:3:"獃";s:2:"";s:3:"獄";s:2:"";s:3:"獅";s:2:"";s:3:"獉";s:2:"ް";s:3:"獊";s:2:"ޯ";s:3:"獌";s:2:"";s:3:"獍";s:2:"";s:3:"獎";s:2:"";s:3:"獐";s:2:"";s:3:"獑";s:2:"";s:3:"獒";s:2:"v";s:3:"獗";s:2:"";s:3:"獘";s:2:"u";s:3:"獙";s:2:"~";s:3:"獚";s:2:"}";s:3:"獛";s:2:"{";s:3:"獝";s:2:"z";s:3:"獞";s:2:"w";s:3:"獟";s:2:"x";s:3:"獠";s:2:"y";s:3:"獡";s:2:"|";s:3:"獢";s:2:"";s:3:"獥";s:2:"_";s:3:"獦";s:2:"\";s:3:"獧";s:2:"]";s:3:"獨";s:2:"W";s:3:"獩";s:2:"[";s:3:"獪";s:2:"a";s:3:"獫";s:2:"`";s:3:"獬";s:2:"^";s:3:"獮";s:2:"d";s:3:"獯";s:2:"e";s:3:"獰";s:2:"";s:3:"獲";s:2:"";s:3:"獳";s:2:"c";s:3:"獵";s:2:"y";s:3:"獶";s:2:"";s:3:"獷";s:2:"x";s:3:"獸";s:2:"~";s:3:"獺";s:2:"á";s:3:"獻";s:2:"m";s:3:"獼";s:2:"n";s:3:"獽";s:2:"m";s:3:"獾";s:2:"";s:3:"獿";s:2:"";s:3:"玀";s:2:"z";s:3:"玁";s:2:"";s:3:"玂";s:2:"";s:3:"玃";s:2:"";s:3:"玄";s:2:"";s:3:"玅";s:2:"";s:3:"玆";s:2:"Y";s:3:"率";s:2:"v";s:3:"玈";s:2:"j";s:3:"玉";s:2:"";s:3:"玊";s:2:"ɧ";s:3:"王";s:2:"";s:3:"玎";s:2:"E";s:3:"玒";s:2:"l";s:3:"玓";s:2:"j";s:3:"玔";s:2:"k";s:3:"玕";s:2:"h";s:3:"玖";s:2:"h";s:3:"玗";s:2:"i";s:3:"玝";s:2:"m";s:3:"玟";s:2:"";s:3:"玠";s:2:"k";s:3:"玡";s:2:"g";s:3:"玢";s:2:"j";s:3:"玤";s:2:"f";s:3:"玥";s:2:"";s:3:"玦";s:2:"i";s:3:"玨";s:2:"";s:3:"玩";s:2:"";s:3:"玫";s:2:"";s:3:"玬";s:2:"l";s:3:"玭";s:2:"h";s:3:"玲";s:2:"";s:3:"玳";s:2:"";s:3:"玴";s:2:"";s:3:"玵";s:2:"";s:3:"玶";s:2:"";s:3:"玷";s:2:"";s:3:"玸";s:2:"";s:3:"玹";s:2:"";s:3:"玻";s:2:"";s:3:"玼";s:2:"ү";s:3:"玾";s:2:"";s:3:"玿";s:2:"";s:3:"珀";s:2:"";s:3:"珂";s:2:"";s:3:"珃";s:2:"";s:3:"珅";s:2:"";s:3:"珆";s:2:"";s:3:"珇";s:2:"";s:3:"珈";s:2:"";s:3:"珊";s:2:"";s:3:"珋";s:2:"";s:3:"珌";s:2:"";s:3:"珍";s:2:"";s:3:"珒";s:2:"Ҵ";s:3:"珓";s:2:"ҫ";s:3:"珔";s:2:"Ҷ";s:3:"珖";s:2:"Ү";s:3:"珗";s:2:"ҹ";s:3:"珘";s:2:"Һ";s:3:"珙";s:2:"Ҭ";s:3:"珚";s:2:"Ҹ";s:3:"珛";s:2:"ҵ";s:3:"珜";s:2:"ҳ";s:3:"珝";s:2:"ҷ";s:3:"珞";s:2:"_";s:3:"珠";s:2:"]";s:3:"珣";s:2:"ұ";s:3:"珥";s:2:"ҭ";s:3:"珧";s:2:"Ұ";s:3:"珨";s:2:"һ";s:3:"珩";s:2:"Ҳ";s:3:"珪";s:2:"^";s:3:"珫";s:2:"";s:3:"班";s:2:"Z";s:3:"珮";s:2:"\";s:3:"珴";s:2:"x";s:3:"珵";s:2:"m";s:3:"珶";s:2:"k";s:3:"珸";s:2:"l";s:3:"珺";s:2:"s";s:3:"珼";s:2:"t";s:3:"珽";s:2:"p";s:3:"現";s:2:"{";s:3:"珿";s:2:"u";s:3:"琀";s:2:"r";s:3:"琁";s:2:"o";s:3:"球";s:2:"y";s:3:"琄";s:2:"n";s:3:"琅";s:2:"w";s:3:"理";s:2:"z";s:3:"琇";s:2:"q";s:3:"琈";s:2:"y";s:3:"琉";s:2:"[";s:3:"琊";s:2:"x";s:3:"琋";s:2:"w";s:3:"琌";s:2:"v";s:3:"琍";s:2:"|";s:3:"琖";s:2:"~";s:3:"琚";s:2:"ڡ";s:3:"琛";s:2:"`";s:3:"琝";s:2:"ڧ";s:3:"琠";s:2:"ک";s:3:"琡";s:2:"ڢ";s:3:"琢";s:2:"Z";s:3:"琣";s:2:"ڦ";s:3:"琤";s:2:"ڥ";s:3:"琥";s:2:"[";s:3:"琦";s:2:"a";s:3:"琨";s:2:"b";s:3:"琩";s:2:"ڨ";s:3:"琪";s:2:"X";s:3:"琫";s:2:"}";s:3:"琬";s:2:"{";s:3:"琭";s:2:"ڣ";s:3:"琮";s:2:"z";s:3:"琯";s:2:"_";s:3:"琰";s:2:"|";s:3:"琱";s:2:"ڤ";s:3:"琲";s:2:"ڪ";s:3:"琳";s:2:"Y";s:3:"琴";s:2:"^";s:3:"琵";s:2:"\";s:3:"琶";s:2:"]";s:3:"琺";s:2:"W";s:3:"琿";s:2:"";s:3:"瑀";s:2:"޷";s:3:"瑁";s:2:"";s:3:"瑂";s:2:"޻";s:3:"瑄";s:2:"ޱ";s:3:"瑆";s:2:"޼";s:3:"瑊";s:2:"޲";s:3:"瑋";s:2:"޳";s:3:"瑍";s:2:"޽";s:3:"瑎";s:2:"޺";s:3:"瑏";s:2:"޸";s:3:"瑐";s:2:"޹";s:3:"瑑";s:2:"޵";s:3:"瑒";s:2:"޴";s:3:"瑔";s:2:"޾";s:3:"瑕";s:2:"";s:3:"瑗";s:2:"޶";s:3:"瑙";s:2:"";s:3:"瑚";s:2:"";s:3:"瑛";s:2:"";s:3:"瑜";s:2:"";s:3:"瑞";s:2:"";s:3:"瑟";s:2:"";s:3:"瑢";s:2:"";s:3:"瑣";s:2:"";s:3:"瑤";s:2:"";s:3:"瑧";s:2:"";s:3:"瑩";s:2:"";s:3:"瑪";s:2:"";s:3:"瑭";s:2:"";s:3:"瑮";s:2:"";s:3:"瑯";s:2:"";s:3:"瑰";s:2:"";s:3:"瑱";s:2:"";s:3:"瑲";s:2:"";s:3:"瑳";s:2:"";s:3:"瑵";s:2:"";s:3:"瑹";s:2:"";s:3:"瑼";s:2:"";s:3:"瑽";s:2:"";s:3:"瑾";s:2:"@";s:3:"瑿";s:2:"b";s:3:"璀";s:2:"A";s:3:"璁";s:2:"";s:3:"璃";s:2:"";s:3:"璅";s:2:"";s:3:"璆";s:2:"";s:3:"璇";s:2:"";s:3:"璈";s:2:"";s:3:"璉";s:2:"";s:3:"璊";s:2:"";s:3:"璋";s:2:"";s:3:"璐";s:2:"i";s:3:"璒";s:2:"f";s:3:"璔";s:2:"e";s:3:"璕";s:2:"g";s:3:"璗";s:2:"f";s:3:"璘";s:2:"Z";s:3:"璚";s:2:"c";s:3:"璜";s:2:"X";s:3:"璞";s:2:"\";s:3:"璟";s:2:"[";s:3:"璠";s:2:"d";s:3:"璡";s:2:"h";s:3:"璣";s:2:"Y";s:3:"璥";s:2:"m";s:3:"璦";s:2:"";s:3:"璧";s:2:"z";s:3:"璨";s:2:"";s:3:"璩";s:2:"";s:3:"璪";s:2:"j";s:3:"璫";s:2:"h";s:3:"璭";s:2:"k";s:3:"璯";s:2:"n";s:3:"環";s:2:"";s:3:"璱";s:2:"l";s:3:"璲";s:2:"g";s:3:"璵";s:2:"B";s:3:"璶";s:2:"E";s:3:"璷";s:2:"u";s:3:"璸";s:2:"@";s:3:"璺";s:2:"o";s:3:"璻";s:2:"F";s:3:"璽";s:2:"â";s:3:"璾";s:2:"D";s:3:"璿";s:2:"{";s:3:"瓀";s:2:"A";s:3:"瓁";s:2:"C";s:3:"瓂";s:2:"G";s:3:"瓃";s:2:"v";s:3:"瓅";s:2:"t";s:3:"瓊";s:2:"ã";s:3:"瓋";s:2:"s";s:3:"瓏";s:2:"n";s:3:"瓔";s:2:"";s:3:"瓕";s:2:"";s:3:"瓖";s:2:"";s:3:"瓗";s:2:"";s:3:"瓘";s:2:"";s:3:"瓙";s:2:"";s:3:"瓚";s:2:"";s:3:"瓛";s:2:"";s:3:"瓜";s:2:"";s:3:"瓝";s:2:"n";s:3:"瓞";s:2:"Ҽ";s:3:"瓟";s:2:"ҽ";s:3:"瓠";s:2:"}";s:3:"瓡";s:2:"޿";s:3:"瓢";s:2:"]";s:3:"瓣";s:2:"ä";s:3:"瓤";s:2:"{";s:3:"瓥";s:2:"";s:3:"瓦";s:2:"";s:3:"瓨";s:2:"o";s:3:"瓩";s:2:"`";s:3:"瓬";s:2:"";s:3:"瓮";s:2:"";s:3:"瓴";s:2:"Ҿ";s:3:"瓵";s:2:"ҿ";s:3:"瓶";s:2:"~";s:3:"瓷";s:2:"";s:3:"瓻";s:2:"ګ";s:3:"瓽";s:2:"";s:3:"瓾";s:2:"";s:3:"瓿";s:2:"";s:3:"甀";s:2:"";s:3:"甂";s:2:"";s:3:"甃";s:2:"";s:3:"甄";s:2:"";s:3:"甇";s:2:"";s:3:"甈";s:2:"";s:3:"甋";s:2:"i";s:3:"甌";s:2:"^";s:3:"甍";s:2:"_";s:3:"甏";s:2:"r";s:3:"甐";s:2:"o";s:3:"甑";s:2:"p";s:3:"甒";s:2:"q";s:3:"甓";s:2:"I";s:3:"甔";s:2:"H";s:3:"甕";s:2:"|";s:3:"甖";s:2:"w";s:3:"甗";s:2:"";s:3:"甘";s:2:"";s:3:"甚";s:2:"";s:3:"甜";s:2:"";s:3:"甝";s:2:"";s:3:"生";s:2:"";s:3:"甡";s:2:"";s:3:"產";s:2:"";s:3:"甥";s:2:"c";s:3:"甦";s:2:"d";s:3:"用";s:2:"";s:3:"甩";s:2:"";s:3:"甪";s:2:"F";s:3:"甫";s:2:"j";s:3:"甬";s:2:"i";s:3:"甭";s:2:"";s:3:"甮";s:2:"";s:3:"甯";s:2:"ڬ";s:3:"田";s:2:"";s:3:"由";s:2:"";s:3:"甲";s:2:"";s:3:"申";s:2:"";s:3:"男";s:2:"k";s:3:"甸";s:2:"l";s:3:"甹";s:2:"n";s:3:"町";s:2:"m";s:3:"甽";s:2:"";s:3:"甾";s:2:"r";s:3:"甿";s:2:"p";s:3:"畀";s:2:"q";s:3:"畇";s:2:"";s:3:"畈";s:2:"";s:3:"畋";s:2:"";s:3:"界";s:2:"";s:3:"畎";s:2:"";s:3:"畏";s:2:"";s:3:"畔";s:2:"`";s:3:"留";s:2:"d";s:3:"畚";s:2:"c";s:3:"畛";s:2:"";s:3:"畜";s:2:"b";s:3:"畝";s:2:"a";s:3:"畟";s:2:"";s:3:"畢";s:2:"";s:3:"畣";s:2:"{";s:3:"畤";s:2:"z";s:3:"略";s:2:"";s:3:"畦";s:2:"";s:3:"番";s:2:"f";s:3:"畫";s:2:"e";s:3:"畬";s:2:"ڮ";s:3:"畯";s:2:"ڭ";s:3:"異";s:2:"";s:3:"當";s:2:"";s:3:"畷";s:2:"";s:3:"畸";s:2:"";s:3:"畹";s:2:"";s:3:"畽";s:2:"";s:3:"畾";s:2:"";s:3:"畿";s:2:"B";s:3:"疀";s:2:"j";s:3:"疄";s:2:"s";s:3:"疆";s:2:"æ";s:3:"疇";s:2:"å";s:3:"疊";s:2:"|";s:3:"疋";s:2:"";s:3:"疌";s:2:"s";s:3:"疏";s:2:"";s:3:"疐";s:2:"";s:3:"疑";s:2:"";s:3:"疔";s:2:"o";s:3:"疕";s:2:"p";s:3:"疘";s:2:"t";s:3:"疙";s:2:"";s:3:"疚";s:2:"";s:3:"疝";s:2:"";s:3:"疢";s:2:"";s:3:"疣";s:2:"";s:3:"疤";s:2:"";s:3:"疥";s:2:"";s:3:"疧";s:2:"";s:3:"疪";s:2:"";s:3:"疫";s:2:"";s:3:"疰";s:2:"";s:3:"疲";s:2:"h";s:3:"疳";s:2:"i";s:3:"疵";s:2:"";s:3:"疶";s:2:"";s:3:"疸";s:2:"n";s:3:"疹";s:2:"l";s:3:"疺";s:2:"";s:3:"疻";s:2:"";s:3:"疼";s:2:"k";s:3:"疽";s:2:"j";s:3:"疾";s:2:"e";s:3:"疿";s:2:"";s:3:"痀";s:2:"";s:3:"痁";s:2:"";s:3:"痂";s:2:"m";s:3:"痄";s:2:"";s:3:"病";s:2:"f";s:3:"症";s:2:"g";s:3:"痊";s:2:"";s:3:"痋";s:2:"֡";s:3:"痌";s:2:"֢";s:3:"痍";s:2:"";s:3:"痎";s:2:"|";s:3:"痏";s:2:"~";s:3:"痐";s:2:"֤";s:3:"痑";s:2:"֣";s:3:"痒";s:2:"}";s:3:"痔";s:2:"";s:3:"痕";s:2:"";s:3:"痗";s:2:"ڶ";s:3:"痘";s:2:"k";s:3:"痙";s:2:"j";s:3:"痚";s:2:"ڰ";s:3:"痛";s:2:"h";s:3:"痝";s:2:"ڳ";s:3:"痞";s:2:"l";s:3:"痟";s:2:"ڴ";s:3:"痠";s:2:"m";s:3:"痡";s:2:"ڱ";s:3:"痢";s:2:"g";s:3:"痣";s:2:"i";s:3:"痤";s:2:"ڵ";s:3:"痦";s:2:"ڲ";s:3:"痧";s:2:"گ";s:3:"痭";s:2:"";s:3:"痯";s:2:"";s:3:"痰";s:2:"";s:3:"痱";s:2:"";s:3:"痲";s:2:"";s:3:"痳";s:2:"";s:3:"痴";s:2:"";s:3:"痵";s:2:"";s:3:"痶";s:2:"";s:3:"痷";s:2:"";s:3:"痸";s:2:"";s:3:"痹";s:2:"";s:3:"痺";s:2:"";s:3:"痻";s:2:"";s:3:"痼";s:2:"";s:3:"痽";s:2:"";s:3:"痾";s:2:"";s:3:"痿";s:2:"";s:3:"瘀";s:2:"";s:3:"瘁";s:2:"";s:3:"瘃";s:2:"";s:3:"瘈";s:2:"";s:3:"瘉";s:2:"";s:3:"瘊";s:2:"";s:3:"瘋";s:2:"";s:3:"瘌";s:2:"";s:3:"瘍";s:2:"";s:3:"瘏";s:2:"";s:3:"瘐";s:2:"";s:3:"瘑";s:2:"";s:3:"瘓";s:2:"";s:3:"瘔";s:2:"";s:3:"瘕";s:2:"";s:3:"瘖";s:2:"";s:3:"瘙";s:2:"";s:3:"瘚";s:2:"";s:3:"瘛";s:2:"";s:3:"瘜";s:2:"";s:3:"瘝";s:2:"";s:3:"瘞";s:2:"";s:3:"瘟";s:2:"E";s:3:"瘠";s:2:"C";s:3:"瘡";s:2:"H";s:3:"瘢";s:2:"I";s:3:"瘣";s:2:"";s:3:"瘤";s:2:"F";s:3:"瘥";s:2:"";s:3:"瘦";s:2:"G";s:3:"瘧";s:2:"";s:3:"瘨";s:2:"";s:3:"瘩";s:2:"D";s:3:"瘭";s:2:"l";s:3:"瘯";s:2:"k";s:3:"瘰";s:2:"s";s:3:"瘱";s:2:"m";s:3:"瘲";s:2:"r";s:3:"瘳";s:2:"o";s:3:"瘴";s:2:"`";s:3:"瘵";s:2:"q";s:3:"瘸";s:2:"a";s:3:"瘺";s:2:"b";s:3:"瘼";s:2:"p";s:3:"瘽";s:2:"n";s:3:"療";s:2:"";s:3:"癃";s:2:"t";s:3:"癆";s:2:"";s:3:"癇";s:2:"w";s:3:"癈";s:2:"u";s:3:"癉";s:2:"v";s:3:"癌";s:2:"";s:3:"癐";s:2:"M";s:3:"癒";s:2:"¡";s:3:"癓";s:2:"N";s:3:"癖";s:2:"}";s:3:"癗";s:2:"O";s:3:"癘";s:2:"~";s:3:"癙";s:2:"L";s:3:"癚";s:2:"P";s:3:"癜";s:2:"J";s:3:"癟";s:2:"ç";s:3:"癠";s:2:"x";s:3:"癡";s:2:"è";s:3:"癢";s:2:"o";s:3:"癤";s:2:"K";s:3:"癥";s:2:"p";s:3:"癩";s:2:"";s:3:"癪";s:2:"";s:3:"癬";s:2:"~";s:3:"癭";s:2:"";s:3:"癮";s:2:"}";s:3:"癰";s:2:"";s:3:"癱";s:2:"";s:3:"癲";s:2:"";s:3:"癵";s:2:"";s:3:"癸";s:2:"";s:3:"癹";s:2:"";s:3:"登";s:2:"n";s:3:"發";s:2:"o";s:3:"白";s:2:"";s:3:"百";s:2:"";s:3:"癿";s:2:"G";s:3:"皁";s:2:"q";s:3:"皂";s:2:"m";s:3:"的";s:2:"";s:3:"皆";s:2:"";s:3:"皇";s:2:"";s:3:"皈";s:2:"";s:3:"皉";s:2:"֦";s:3:"皊";s:2:"";s:3:"皋";s:2:"o";s:3:"皎";s:2:"";s:3:"皏";s:2:"֥";s:3:"皒";s:2:"ڸ";s:3:"皓";s:2:"q";s:3:"皕";s:2:"ڷ";s:3:"皖";s:2:"p";s:3:"皙";s:2:"";s:3:"皚";s:2:"J";s:3:"皛";s:2:"";s:3:"皜";s:2:"";s:3:"皝";s:2:"";s:3:"皞";s:2:"";s:3:"皤";s:2:"x";s:3:"皦";s:2:"Q";s:3:"皪";s:2:"q";s:3:"皫";s:2:"p";s:3:"皭";s:2:"";s:3:"皮";s:2:"";s:3:"皯";s:2:"u";s:3:"皰";s:2:"p";s:3:"皴";s:2:"r";s:3:"皵";s:2:"";s:3:"皸";s:2:"";s:3:"皺";s:2:"K";s:3:"皻";s:2:"t";s:3:"皽";s:2:"R";s:3:"皾";s:2:"r";s:3:"皿";s:2:"";s:3:"盂";s:2:"";s:3:"盃";s:2:"";s:3:"盄";s:2:"";s:3:"盅";s:2:"";s:3:"盆";s:2:"";s:3:"盈";s:2:"";s:3:"盉";s:2:"";s:3:"益";s:2:"q";s:3:"盍";s:2:"r";s:3:"盎";s:2:"s";s:3:"盒";s:2:"";s:3:"盓";s:2:"֧";s:3:"盔";s:2:"";s:3:"盚";s:2:"ڹ";s:3:"盛";s:2:"";s:3:"盜";s:2:"s";s:3:"盝";s:2:"";s:3:"盞";s:2:"";s:3:"盟";s:2:"";s:3:"盡";s:2:"";s:3:"監";s:2:"";s:3:"盤";s:2:"L";s:3:"盥";s:2:"d";s:3:"盦";s:2:"u";s:3:"盧";s:2:"c";s:3:"盩";s:2:"y";s:3:"盪";s:2:"";s:3:"盬";s:2:"S";s:3:"盭";s:2:"s";s:3:"目";s:2:"";s:3:"盯";s:2:"n";s:3:"盰";s:2:"x";s:3:"盱";s:2:"w";s:3:"盲";s:2:"";s:3:"盳";s:2:"v";s:3:"直";s:2:"";s:3:"盵";s:2:"y";s:3:"盷";s:2:"";s:3:"相";s:2:"";s:3:"盹";s:2:"";s:3:"盺";s:2:"";s:3:"盻";s:2:"";s:3:"盼";s:2:"";s:3:"盾";s:2:"";s:3:"省";s:2:"";s:3:"眃";s:2:"";s:3:"眄";s:2:"";s:3:"眅";s:2:"";s:3:"眇";s:2:"";s:3:"眈";s:2:"";s:3:"眉";s:2:"";s:3:"眊";s:2:"";s:3:"看";s:2:"";s:3:"眐";s:2:"";s:3:"眑";s:2:"";s:3:"眒";s:2:"";s:3:"眓";s:2:"";s:3:"眕";s:2:"";s:3:"眙";s:2:"";s:3:"眚";s:2:"";s:3:"眛";s:2:"";s:3:"眝";s:2:"";s:3:"真";s:2:"u";s:3:"眠";s:2:"v";s:3:"眢";s:2:"";s:3:"眣";s:2:"";s:3:"眥";s:2:"ְ";s:3:"眧";s:2:"";s:3:"眨";s:2:"w";s:3:"眩";s:2:"t";s:3:"眭";s:2:"֪";s:3:"眯";s:2:"֩";s:3:"眱";s:2:"֫";s:3:"眲";s:2:"֬";s:3:"眳";s:2:"֮";s:3:"眴";s:2:"֭";s:3:"眵";s:2:"ֲ";s:3:"眶";s:2:"";s:3:"眷";s:2:"";s:3:"眸";s:2:"";s:3:"眹";s:2:"֨";s:3:"眺";s:2:"";s:3:"眻";s:2:"ֱ";s:3:"眼";s:2:"";s:3:"眽";s:2:"֯";s:3:"眾";s:2:"";s:3:"睄";s:2:"ڼ";s:3:"睅";s:2:"ھ";s:3:"睆";s:2:"ں";s:3:"睇";s:2:"ڻ";s:3:"睊";s:2:"ڿ";s:3:"睋";s:2:"";s:3:"睌";s:2:"";s:3:"睍";s:2:"ڽ";s:3:"睎";s:2:"";s:3:"睏";s:2:"t";s:3:"睒";s:2:"";s:3:"睔";s:2:"";s:3:"睕";s:2:"";s:3:"睖";s:2:"";s:3:"睙";s:2:"";s:3:"睚";s:2:"";s:3:"睛";s:2:"";s:3:"睜";s:2:"C";s:3:"睞";s:2:"";s:3:"睟";s:2:"";s:3:"睠";s:2:"";s:3:"睡";s:2:"";s:3:"睢";s:2:"F";s:3:"督";s:2:"";s:3:"睥";s:2:"D";s:3:"睦";s:2:"";s:3:"睧";s:2:"";s:3:"睨";s:2:"E";s:3:"睩";s:2:"";s:3:"睪";s:2:"A";s:3:"睫";s:2:"";s:3:"睬";s:2:"B";s:3:"睭";s:2:"";s:3:"睮";s:2:"";s:3:"睯";s:2:"";s:3:"睹";s:2:"@";s:3:"睼";s:2:"";s:3:"睽";s:2:"";s:3:"睾";s:2:"";s:3:"睿";s:2:"";s:3:"瞀";s:2:"";s:3:"瞁";s:2:"";s:3:"瞂";s:2:"";s:3:"瞃";s:2:"";s:3:"瞄";s:2:"";s:3:"瞅";s:2:"";s:3:"瞇";s:2:"N";s:3:"瞈";s:2:"";s:3:"瞉";s:2:"";s:3:"瞋";s:2:"Q";s:3:"瞌";s:2:"O";s:3:"瞍";s:2:"";s:3:"瞎";s:2:"M";s:3:"瞏";s:2:"";s:3:"瞑";s:2:"P";s:3:"瞕";s:2:"}";s:3:"瞗";s:2:"";s:3:"瞙";s:2:"~";s:3:"瞚";s:2:"v";s:3:"瞛";s:2:"z";s:3:"瞜";s:2:"y";s:3:"瞝";s:2:"w";s:3:"瞞";s:2:"f";s:3:"瞟";s:2:"g";s:3:"瞠";s:2:"e";s:3:"瞡";s:2:"x";s:3:"瞢";s:2:"{";s:3:"瞣";s:2:"|";s:3:"瞥";s:2:"h";s:3:"瞧";s:2:"@";s:3:"瞨";s:2:"";s:3:"瞪";s:2:"";s:3:"瞫";s:2:"{";s:3:"瞬";s:2:"";s:3:"瞭";s:2:"A";s:3:"瞰";s:2:"";s:3:"瞱";s:2:"";s:3:"瞲";s:2:"|";s:3:"瞳";s:2:"";s:3:"瞴";s:2:"";s:3:"瞵";s:2:"z";s:3:"瞶";s:2:"~";s:3:"瞷";s:2:"}";s:3:"瞺";s:2:"U";s:3:"瞻";s:2:"¤";s:3:"瞼";s:2:"¥";s:3:"瞽";s:2:"¢";s:3:"瞿";s:2:"£";s:3:"矂";s:2:"T";s:3:"矄";s:2:"{";s:3:"矇";s:2:"é";s:3:"矉";s:2:"y";s:3:"矊";s:2:"z";s:3:"矌";s:2:"t";s:3:"矍";s:2:"w";s:3:"矎";s:2:"u";s:3:"矏";s:2:"v";s:3:"矐";s:2:"";s:3:"矓";s:2:"";s:3:"矔";s:2:"";s:3:"矕";s:2:"";s:3:"矗";s:2:"";s:3:"矘";s:2:"";s:3:"矙";s:2:"";s:3:"矚";s:2:"f";s:3:"矛";s:2:"";s:3:"矜";s:2:"";s:3:"矞";s:2:"";s:3:"矠";s:2:"";s:3:"矢";s:2:"";s:3:"矣";s:2:"o";s:3:"知";s:2:"";s:3:"矧";s:2:"";s:3:"矨";s:2:"";s:3:"矩";s:2:"x";s:3:"矬";s:2:"";s:3:"短";s:2:"u";s:3:"矮";s:2:"G";s:3:"矯";s:2:"B";s:3:"矰";s:2:"";s:3:"矱";s:2:"|";s:3:"矲";s:2:"x";s:3:"石";s:2:"";s:3:"矷";s:2:"͡";s:3:"矸";s:2:"z";s:3:"矹";s:2:"|";s:3:"矺";s:2:"~";s:3:"矻";s:2:"}";s:3:"矼";s:2:"{";s:3:"矽";s:2:"";s:3:"砂";s:2:"";s:3:"砃";s:2:"";s:3:"砅";s:2:"";s:3:"砆";s:2:"";s:3:"砉";s:2:"";s:3:"砌";s:2:"";s:3:"砍";s:2:"";s:3:"砎";s:2:"";s:3:"砏";s:2:"";s:3:"砐";s:2:"";s:3:"砑";s:2:"";s:3:"砒";s:2:"";s:3:"砓";s:2:"";s:3:"研";s:2:"";s:3:"砝";s:2:"|";s:3:"砟";s:2:"";s:3:"砠";s:2:"";s:3:"砡";s:2:"";s:3:"砢";s:2:"";s:3:"砣";s:2:"";s:3:"砥";s:2:"";s:3:"砦";s:2:"ֹ";s:3:"砧";s:2:"z";s:3:"砨";s:2:"";s:3:"砩";s:2:"";s:3:"砪";s:2:"";s:3:"砫";s:2:"";s:3:"砬";s:2:"";s:3:"砭";s:2:"";s:3:"砮";s:2:"";s:3:"砯";s:2:"";s:3:"砰";s:2:"y";s:3:"砱";s:2:"";s:3:"砲";s:2:"";s:3:"砳";s:2:"";s:3:"破";s:2:"}";s:3:"砵";s:2:"";s:3:"砷";s:2:"~";s:3:"砸";s:2:"{";s:3:"硃";s:2:"";s:3:"硅";s:2:"ֺ";s:3:"硈";s:2:"ֳ";s:3:"硉";s:2:"ֵ";s:3:"硊";s:2:"ַ";s:3:"硌";s:2:"ָ";s:3:"硍";s:2:"ֶ";s:3:"硎";s:2:"";s:3:"硐";s:2:"ֻ";s:3:"硒";s:2:"ִ";s:3:"硜";s:2:"";s:3:"硝";s:2:"v";s:3:"硞";s:2:"";s:3:"硠";s:2:"";s:3:"硢";s:2:"";s:3:"硤";s:2:"";s:3:"硥";s:2:"";s:3:"硨";s:2:"";s:3:"硩";s:2:"";s:3:"硪";s:2:"";s:3:"硫";s:2:"";s:3:"硬";s:2:"w";s:3:"硭";s:2:"";s:3:"确";s:2:"";s:3:"硯";s:2:"x";s:3:"硰";s:2:"";s:3:"硱";s:2:"";s:3:"硹";s:2:"";s:3:"硻";s:2:"";s:3:"硼";s:2:"N";s:3:"硾";s:2:"";s:3:"硿";s:2:"Q";s:3:"碀";s:2:"";s:3:"碁";s:2:"";s:3:"碃";s:2:"";s:3:"碄";s:2:"";s:3:"碅";s:2:"";s:3:"碆";s:2:"";s:3:"碇";s:2:"";s:3:"碉";s:2:"M";s:3:"碌";s:2:"L";s:3:"碎";s:2:"H";s:3:"碏";s:2:"";s:3:"碑";s:2:"O";s:3:"碓";s:2:"P";s:3:"碔";s:2:"";s:3:"碕";s:2:"";s:3:"碖";s:2:"";s:3:"碗";s:2:"J";s:3:"碘";s:2:"K";s:3:"碙";s:2:"";s:3:"碚";s:2:"";s:3:"碞";s:2:"";s:3:"碟";s:2:"";s:3:"碠";s:2:"";s:3:"碡";s:2:"";s:3:"碢";s:2:"";s:3:"碣";s:2:"";s:3:"碤";s:2:"";s:3:"碥";s:2:"";s:3:"碧";s:2:"";s:3:"碨";s:2:"";s:3:"碩";s:2:"";s:3:"碪";s:2:"";s:3:"碫";s:2:"";s:3:"碬";s:2:"";s:3:"碭";s:2:"";s:3:"碰";s:2:"I";s:3:"碲";s:2:"";s:3:"碳";s:2:"";s:3:"碴";s:2:"";s:3:"確";s:2:"T";s:3:"碻";s:2:"";s:3:"碼";s:2:"X";s:3:"碾";s:2:"V";s:3:"磁";s:2:"";s:3:"磃";s:2:"";s:3:"磄";s:2:"";s:3:"磅";s:2:"S";s:3:"磈";s:2:"";s:3:"磉";s:2:"";s:3:"磊";s:2:"U";s:3:"磋";s:2:"R";s:3:"磌";s:2:"";s:3:"磍";s:2:"";s:3:"磎";s:2:"";s:3:"磏";s:2:"";s:3:"磐";s:2:"Y";s:3:"磑";s:2:"";s:3:"磔";s:2:"";s:3:"磕";s:2:"W";s:3:"磚";s:2:"j";s:3:"磛";s:2:"";s:3:"磝";s:2:"";s:3:"磞";s:2:"";s:3:"磟";s:2:"";s:3:"磠";s:2:"";s:3:"磡";s:2:"";s:3:"磢";s:2:"";s:3:"磣";s:2:"";s:3:"磥";s:2:"";s:3:"磧";s:2:"l";s:3:"磨";s:2:"i";s:3:"磩";s:2:"";s:3:"磪";s:2:"";s:3:"磬";s:2:"k";s:3:"磭";s:2:"";s:3:"磯";s:2:"F";s:3:"磲";s:2:"";s:3:"磳";s:2:"";s:3:"磴";s:2:"E";s:3:"磷";s:2:"C";s:3:"磹";s:2:"";s:3:"磺";s:2:"D";s:3:"磻";s:2:"";s:3:"磼";s:2:"";s:3:"磽";s:2:"";s:3:"磾";s:2:"";s:3:"磿";s:2:"V";s:3:"礁";s:2:"G";s:3:"礂";s:2:"";s:3:"礄";s:2:"";s:3:"礅";s:2:"";s:3:"礉";s:2:"Z";s:3:"礌";s:2:"W";s:3:"礎";s:2:"¦";s:3:"礐";s:2:"[";s:3:"礑";s:2:"]";s:3:"礒";s:2:"\";s:3:"礓";s:2:"X";s:3:"礔";s:2:"Y";s:3:"礗";s:2:"";s:3:"礙";s:2:"ê";s:3:"礛";s:2:"~";s:3:"礜";s:2:"";s:3:"礝";s:2:"}";s:3:"礞";s:2:"";s:3:"礡";s:2:"";s:3:"礣";s:2:"z";s:3:"礤";s:2:"}";s:3:"礥";s:2:"y";s:3:"礦";s:2:"q";s:3:"礧";s:2:"{";s:3:"礨";s:2:"|";s:3:"礩";s:2:"~";s:3:"礪";s:2:"r";s:3:"礫";s:2:"t";s:3:"礬";s:2:"s";s:3:"礭";s:2:"";s:3:"礯";s:2:"";s:3:"礱";s:2:"";s:3:"礵";s:2:"";s:3:"礸";s:2:"";s:3:"礹";s:2:"";s:3:"示";s:2:"";s:3:"礽";s:2:"r";s:3:"社";s:2:"";s:3:"礿";s:2:"ͣ";s:3:"祀";s:2:"";s:3:"祁";s:2:"";s:3:"祂";s:2:"͢";s:3:"祄";s:2:"";s:3:"祅";s:2:"";s:3:"祆";s:2:"";s:3:"祇";s:2:"";s:3:"祈";s:2:"";s:3:"祉";s:2:"";s:3:"祊";s:2:"";s:3:"祋";s:2:"";s:3:"祌";s:2:"";s:3:"祏";s:2:"";s:3:"祐";s:2:"";s:3:"祑";s:2:"";s:3:"祒";s:2:"";s:3:"祓";s:2:"";s:3:"祔";s:2:"";s:3:"祕";s:2:"";s:3:"祖";s:2:"";s:3:"祗";s:2:"";s:3:"祚";s:2:"";s:3:"祛";s:2:"";s:3:"祜";s:2:"";s:3:"祝";s:2:"";s:3:"神";s:2:"";s:3:"祟";s:2:"";s:3:"祠";s:2:"";s:3:"祡";s:2:"";s:3:"祣";s:2:"";s:3:"祤";s:2:"ּ";s:3:"祥";s:2:"";s:3:"祧";s:2:"ֽ";s:3:"票";s:2:"";s:3:"祩";s:2:"־";s:3:"祪";s:2:"ֿ";s:3:"祫";s:2:"";s:3:"祭";s:2:"";s:3:"祰";s:2:"";s:3:"祲";s:2:"";s:3:"祳";s:2:"";s:3:"祴";s:2:"";s:3:"祹";s:2:"";s:3:"祺";s:2:"R";s:3:"祼";s:2:"";s:3:"祽";s:2:"";s:3:"祿";s:2:"S";s:3:"禁";s:2:"T";s:3:"禂";s:2:"";s:3:"禈";s:2:"A";s:3:"禊";s:2:"";s:3:"禋";s:2:"";s:3:"禍";s:2:"";s:3:"禎";s:2:"";s:3:"福";s:2:"";s:3:"禐";s:2:"C";s:3:"禒";s:2:"B";s:3:"禓";s:2:"";s:3:"禔";s:2:"";s:3:"禕";s:2:"";s:3:"禖";s:2:"";s:3:"禗";s:2:"@";s:3:"禘";s:2:"";s:3:"禚";s:2:"";s:3:"禛";s:2:"";s:3:"禜";s:2:"";s:3:"禠";s:2:"";s:3:"禡";s:2:"";s:3:"禢";s:2:"";s:3:"禤";s:2:"";s:3:"禦";s:2:"m";s:3:"禧";s:2:"H";s:3:"禨";s:2:"";s:3:"禪";s:2:"I";s:3:"禫";s:2:"";s:3:"禬";s:2:"_";s:3:"禭";s:2:"^";s:3:"禮";s:2:"§";s:3:"禰";s:2:"";s:3:"禱";s:2:"ë";s:3:"禲";s:2:"";s:3:"禳";s:2:"š";s:3:"禴";s:2:"";s:3:"禶";s:2:"";s:3:"禷";s:2:"";s:3:"禸";s:2:"ɨ";s:3:"禹";s:2:"";s:3:"禺";s:2:"";s:3:"离";s:2:"";s:3:"禽";s:2:"V";s:3:"禾";s:2:"";s:3:"禿";s:2:"r";s:3:"秀";s:2:"q";s:3:"私";s:2:"p";s:3:"秅";s:2:"ͤ";s:3:"秈";s:2:"";s:3:"秉";s:2:"";s:3:"秋";s:2:"";s:3:"种";s:2:"";s:3:"秎";s:2:"";s:3:"秏";s:2:"";s:3:"科";s:2:"";s:3:"秒";s:2:"";s:3:"秕";s:2:"";s:3:"秖";s:2:"";s:3:"秘";s:2:"";s:3:"秜";s:2:"";s:3:"秝";s:2:"";s:3:"秞";s:2:"";s:3:"租";s:2:"";s:3:"秠";s:2:"";s:3:"秣";s:2:"";s:3:"秤";s:2:"";s:3:"秦";s:2:"";s:3:"秧";s:2:"";s:3:"秩";s:2:"";s:3:"秪";s:2:"";s:3:"秫";s:2:"";s:3:"秬";s:2:"";s:3:"秭";s:2:"";s:3:"秮";s:2:"";s:3:"秶";s:2:"";s:3:"秷";s:2:"";s:3:"秸";s:2:"";s:3:"秺";s:2:"";s:3:"移";s:2:"";s:3:"稀";s:2:"}";s:3:"稂";s:2:"";s:3:"稃";s:2:"";s:3:"稄";s:2:"";s:3:"稅";s:2:"|";s:3:"稈";s:2:"z";s:3:"稊";s:2:"";s:3:"程";s:2:"{";s:3:"稌";s:2:"";s:3:"稍";s:2:"y";s:3:"稐";s:2:"A";s:3:"稑";s:2:"";s:3:"稒";s:2:"";s:3:"稓";s:2:"";s:3:"稔";s:2:"Z";s:3:"稕";s:2:"";s:3:"稗";s:2:"";s:3:"稘";s:2:"";s:3:"稙";s:2:"";s:3:"稚";s:2:"X";s:3:"稛";s:2:"@";s:3:"稜";s:2:"W";s:3:"稞";s:2:"\";s:3:"稟";s:2:"[";s:3:"稠";s:2:"Y";s:3:"稢";s:2:"";s:3:"稦";s:2:"I";s:3:"稨";s:2:"H";s:3:"稫";s:2:"D";s:3:"種";s:2:"";s:3:"稯";s:2:"G";s:3:"稰";s:2:"F";s:3:"稱";s:2:"";s:3:"稷";s:2:"^";s:3:"稹";s:2:"";s:3:"稻";s:2:"_";s:3:"稼";s:2:"[";s:3:"稽";s:2:"]";s:3:"稿";s:2:"Z";s:3:"穀";s:2:"\";s:3:"穄";s:2:"";s:3:"穆";s:2:"p";s:3:"穇";s:2:"";s:3:"穈";s:2:"";s:3:"穊";s:2:"E";s:3:"穋";s:2:"r";s:3:"穌";s:2:"q";s:3:"積";s:2:"n";s:3:"穎";s:2:"o";s:3:"穔";s:2:"";s:3:"穖";s:2:"";s:3:"穗";s:2:"J";s:3:"穘";s:2:"";s:3:"穚";s:2:"";s:3:"穛";s:2:"";s:3:"穜";s:2:"";s:3:"穟";s:2:"`";s:3:"穠";s:2:"ª";s:3:"穡";s:2:"¨";s:3:"穢";s:2:"©";s:3:"穧";s:2:"";s:3:"穨";s:2:"";s:3:"穩";s:2:"í";s:3:"穫";s:2:"ì";s:3:"穬";s:2:"";s:3:"穭";s:2:"";s:3:"穮";s:2:"";s:3:"穰";s:2:"";s:3:"穱";s:2:"";s:3:"穴";s:2:"";s:3:"穵";s:2:"H";s:3:"究";s:2:"s";s:3:"穸";s:2:"ͥ";s:3:"穹";s:2:"";s:3:"空";s:2:"";s:3:"穻";s:2:"ͦ";s:3:"穾";s:2:"@";s:3:"穿";s:2:"";s:3:"窀";s:2:"";s:3:"突";s:2:"";s:3:"窄";s:2:"";s:3:"窅";s:2:"";s:3:"窆";s:2:"";s:3:"窇";s:2:"";s:3:"窈";s:2:"";s:3:"窉";s:2:"";s:3:"窊";s:2:"";s:3:"窋";s:2:"";s:3:"窌";s:2:"";s:3:"窏";s:2:"";s:3:"窐";s:2:"";s:3:"窒";s:2:"";s:3:"窔";s:2:"";s:3:"窕";s:2:"";s:3:"窖";s:2:"";s:3:"窗";s:2:"";s:3:"窘";s:2:"~";s:3:"窙";s:2:"";s:3:"窞";s:2:"D";s:3:"窟";s:2:"]";s:3:"窠";s:2:"^";s:3:"窢";s:2:"C";s:3:"窣";s:2:"B";s:3:"窨";s:2:"J";s:3:"窩";s:2:"";s:3:"窪";s:2:"";s:3:"窫";s:2:"K";s:3:"窬";s:2:"L";s:3:"窮";s:2:"a";s:3:"窯";s:2:"`";s:3:"窱";s:2:"";s:3:"窲";s:2:"";s:3:"窳";s:2:"";s:3:"窴";s:2:"";s:3:"窵";s:2:"";s:3:"窶";s:2:"";s:3:"窷";s:2:"";s:3:"窸";s:2:"";s:3:"窺";s:2:"s";s:3:"窾";s:2:"";s:3:"窿";s:2:"K";s:3:"竀";s:2:"";s:3:"竁";s:2:"";s:3:"竄";s:2:"«";s:3:"竅";s:2:"¬";s:3:"竇";s:2:"u";s:3:"竊";s:2:"";s:3:"立";s:2:"";s:3:"竑";s:2:"A";s:3:"竘";s:2:"";s:3:"站";s:2:"";s:3:"竟";s:2:"";s:3:"章";s:2:"";s:3:"竣";s:2:"";s:3:"竤";s:2:"";s:3:"童";s:2:"";s:3:"竦";s:2:"";s:3:"竫";s:2:"E";s:3:"竭";s:2:"";s:3:"竮";s:2:"M";s:3:"端";s:2:"";s:3:"競";s:2:"v";s:3:"竷";s:2:"";s:3:"竹";s:2:"";s:3:"竺";s:2:"";s:3:"竻";s:2:"ͧ";s:3:"竽";s:2:"";s:3:"竿";s:2:"";s:3:"笀";s:2:"B";s:3:"笁";s:2:"C";s:3:"笄";s:2:"@";s:3:"笅";s:2:"B";s:3:"笆";s:2:"";s:3:"笈";s:2:"D";s:3:"笉";s:2:"G";s:3:"笊";s:2:"E";s:3:"笎";s:2:"F";s:3:"笏";s:2:"C";s:3:"笐";s:2:"";s:3:"笑";s:2:"";s:3:"笒";s:2:"H";s:3:"笓";s:2:"A";s:3:"笘";s:2:"";s:3:"笙";s:2:"";s:3:"笚";s:2:"";s:3:"笛";s:2:"";s:3:"笝";s:2:"";s:3:"笞";s:2:"";s:3:"笠";s:2:"";s:3:"笢";s:2:"";s:3:"笣";s:2:"";s:3:"笤";s:2:"";s:3:"笥";s:2:"";s:3:"符";s:2:"";s:3:"笨";s:2:"";s:3:"笪";s:2:"";s:3:"笫";s:2:"";s:3:"第";s:2:"";s:3:"笭";s:2:"";s:3:"笮";s:2:"";s:3:"笯";s:2:"";s:3:"笰";s:2:"";s:3:"笱";s:2:"";s:3:"笲";s:2:"";s:3:"笳";s:2:"";s:3:"笴";s:2:"";s:3:"笵";s:2:"";s:3:"笸";s:2:"";s:3:"笻";s:2:"";s:3:"筀";s:2:"";s:3:"筄";s:2:"";s:3:"筅";s:2:"";s:3:"筆";s:2:"";s:3:"筇";s:2:"";s:3:"筈";s:2:"";s:3:"等";s:2:"";s:3:"筊";s:2:"";s:3:"筋";s:2:"";s:3:"筌";s:2:"";s:3:"筍";s:2:"";s:3:"筎";s:2:"";s:3:"筏";s:2:"";s:3:"筐";s:2:"";s:3:"筑";s:2:"";s:3:"筒";s:2:"";s:3:"答";s:2:"";s:3:"策";s:2:"";s:3:"筘";s:2:"";s:3:"筠";s:2:"a";s:3:"筡";s:2:"P";s:3:"筣";s:2:"S";s:3:"筤";s:2:"G";s:3:"筥";s:2:"L";s:3:"筦";s:2:"F";s:3:"筧";s:2:"c";s:3:"筩";s:2:"J";s:3:"筭";s:2:"H";s:3:"筮";s:2:"b";s:3:"筰";s:2:"O";s:3:"筱";s:2:"N";s:3:"筲";s:2:"K";s:3:"筳";s:2:"M";s:3:"筴";s:2:"I";s:3:"筵";s:2:"";s:3:"筶";s:2:"R";s:3:"筷";s:2:"_";s:3:"筸";s:2:"Q";s:3:"箂";s:2:"]";s:3:"箄";s:2:"";s:3:"箅";s:2:"X";s:3:"箇";s:2:"";s:3:"箈";s:2:"N";s:3:"箊";s:2:"P";s:3:"箋";s:2:"";s:3:"箌";s:2:"U";s:3:"箍";s:2:"T";s:3:"箎";s:2:"W";s:3:"箏";s:2:"";s:3:"箐";s:2:"R";s:3:"箑";s:2:"Q";s:3:"箔";s:2:"";s:3:"箕";s:2:"";s:3:"箖";s:2:"S";s:3:"算";s:2:"";s:3:"箘";s:2:"Y";s:3:"箙";s:2:"[";s:3:"箛";s:2:"V";s:3:"箜";s:2:"O";s:3:"箝";s:2:"";s:3:"箠";s:2:"i";s:3:"管";s:2:"";s:3:"箤";s:2:"\";s:3:"箬";s:2:"";s:3:"箭";s:2:"b";s:3:"箯";s:2:"";s:3:"箱";s:2:"c";s:3:"箴";s:2:"e";s:3:"箵";s:2:"";s:3:"箷";s:2:"";s:3:"箸";s:2:"";s:3:"箹";s:2:"";s:3:"箾";s:2:"";s:3:"節";s:2:"`";s:3:"篁";s:2:"h";s:3:"範";s:2:"d";s:3:"篆";s:2:"f";s:3:"篇";s:2:"g";s:3:"築";s:2:"v";s:3:"篊";s:2:"";s:3:"篋";s:2:"";s:3:"篌";s:2:"j";s:3:"篎";s:2:"";s:3:"篔";s:2:"";s:3:"篕";s:2:"";s:3:"篘";s:2:"";s:3:"篙";s:2:"t";s:3:"篚";s:2:"";s:3:"篛";s:2:"x";s:3:"篜";s:2:"";s:3:"篝";s:2:"";s:3:"篞";s:2:"";s:3:"篟";s:2:"";s:3:"篠";s:2:"Q";s:3:"篡";s:2:"y";s:3:"篢";s:2:"";s:3:"篣";s:2:"";s:3:"篤";s:2:"w";s:3:"篥";s:2:"";s:3:"篦";s:2:"{";s:3:"篧";s:2:"";s:3:"篨";s:2:"";s:3:"篩";s:2:"z";s:3:"篪";s:2:"";s:3:"篫";s:2:"";s:3:"篰";s:2:"";s:3:"篱";s:2:"";s:3:"篲";s:2:"";s:3:"篳";s:2:"";s:3:"篴";s:2:"";s:3:"篷";s:2:"O";s:3:"篸";s:2:"";s:3:"篹";s:2:"";s:3:"篻";s:2:"";s:3:"篽";s:2:"";s:3:"篾";s:2:"N";s:3:"篿";s:2:"";s:3:"簀";s:2:"";s:3:"簁";s:2:"";s:3:"簂";s:2:"";s:3:"簃";s:2:"";s:3:"簅";s:2:"";s:3:"簆";s:2:"";s:3:"簇";s:2:"L";s:3:"簉";s:2:"";s:3:"簊";s:2:"";s:3:"簋";s:2:"";s:3:"簌";s:2:"P";s:3:"簍";s:2:"M";s:3:"簎";s:2:"";s:3:"簏";s:2:"";s:3:"簐";s:2:"";s:3:"簑";s:2:"u";s:3:"簙";s:2:"c";s:3:"簜";s:2:"a";s:3:"簝";s:2:"g";s:3:"簞";s:2:"°";s:3:"簟";s:2:"e";s:3:"簠";s:2:"d";s:3:"簡";s:2:"²";s:3:"簢";s:2:"j";s:3:"簣";s:2:"±";s:3:"簥";s:2:"k";s:3:"簦";s:2:"h";s:3:"簧";s:2:"®";s:3:"簨";s:2:"i";s:3:"簩";s:2:"b";s:3:"簪";s:2:"¯";s:3:"簫";s:2:"­";s:3:"簬";s:2:"";s:3:"簭";s:2:"f";s:3:"簰";s:2:"l";s:3:"簳";s:2:"";s:3:"簷";s:2:"ò";s:3:"簸";s:2:"ð";s:3:"簹";s:2:"";s:3:"簻";s:2:"";s:3:"簼";s:2:"";s:3:"簽";s:2:"ñ";s:3:"簾";s:2:"î";s:3:"簿";s:2:"ï";s:3:"籀";s:2:"ó";s:3:"籃";s:2:"x";s:3:"籅";s:2:"";s:3:"籇";s:2:"";s:3:"籈";s:2:"";s:3:"籉";s:2:"";s:3:"籊";s:2:"";s:3:"籌";s:2:"w";s:3:"籍";s:2:"y";s:3:"籐";s:2:"";s:3:"籓";s:2:"";s:3:"籔";s:2:"";s:3:"籗";s:2:"";s:3:"籙";s:2:"";s:3:"籚";s:2:"";s:3:"籛";s:2:"";s:3:"籜";s:2:"";s:3:"籟";s:2:"ţ";s:3:"籠";s:2:"Ţ";s:3:"籣";s:2:"";s:3:"籤";s:2:"";s:3:"籥";s:2:"";s:3:"籦";s:2:"";s:3:"籧";s:2:"";s:3:"籩";s:2:"";s:3:"籪";s:2:"";s:3:"籫";s:2:"";s:3:"籬";s:2:"X";s:3:"籮";s:2:"Y";s:3:"籯";s:2:"m";s:3:"籲";s:2:"~";s:3:"米";s:2:"";s:3:"籵";s:2:"ͨ";s:3:"籸";s:2:"E";s:3:"籹";s:2:"F";s:3:"籺";s:2:"D";s:3:"籽";s:2:"";s:3:"籿";s:2:"G";s:3:"粀";s:2:"H";s:3:"粁";s:2:"I";s:3:"粄";s:2:"I";s:3:"粅";s:2:"O";s:3:"粈";s:2:"M";s:3:"粉";s:2:"";s:3:"粊";s:2:"K";s:3:"粌";s:2:"L";s:3:"粍";s:2:"N";s:3:"粑";s:2:"J";s:3:"粒";s:2:"";s:3:"粔";s:2:"";s:3:"粕";s:2:"";s:3:"粖";s:2:"";s:3:"粗";s:2:"";s:3:"粘";s:2:"";s:3:"粞";s:2:"";s:3:"粟";s:2:"";s:3:"粡";s:2:"";s:3:"粢";s:2:"";s:3:"粣";s:2:"";s:3:"粥";s:2:"";s:3:"粧";s:2:"";s:3:"粨";s:2:"";s:3:"粯";s:2:"V";s:3:"粱";s:2:"d";s:3:"粲";s:2:"T";s:3:"粳";s:2:"e";s:3:"粴";s:2:"U";s:3:"粵";s:2:"f";s:3:"粹";s:2:"";s:3:"粺";s:2:"a";s:3:"粻";s:2:"^";s:3:"粼";s:2:"`";s:3:"粽";s:2:"";s:3:"精";s:2:"";s:3:"粿";s:2:"_";s:3:"糅";s:2:"";s:3:"糈";s:2:"";s:3:"糊";s:2:"k";s:3:"糋";s:2:"";s:3:"糌";s:2:"";s:3:"糎";s:2:"a";s:3:"糐";s:2:"";s:3:"糑";s:2:"";s:3:"糒";s:2:"";s:3:"糔";s:2:"";s:3:"糕";s:2:"|";s:3:"糖";s:2:"}";s:3:"糗";s:2:"";s:3:"糙";s:2:"W";s:3:"糜";s:2:"S";s:3:"糝";s:2:"X";s:3:"糞";s:2:"T";s:3:"糟";s:2:"V";s:3:"糠";s:2:"R";s:3:"糢";s:2:"U";s:3:"糧";s:2:"³";s:3:"糨";s:2:"";s:3:"糪";s:2:"";s:3:"糬";s:2:"";s:3:"糮";s:2:"";s:3:"糯";s:2:"z";s:3:"糰";s:2:"{";s:3:"糱";s:2:"A";s:3:"糲";s:2:"";s:3:"糴";s:2:"@";s:3:"糶";s:2:"";s:3:"糷";s:2:"";s:3:"糸";s:2:"";s:3:"系";s:2:"t";s:3:"糽";s:2:"ͩ";s:3:"糾";s:2:"";s:3:"紀";s:2:"";s:3:"紁";s:2:"L";s:3:"紂";s:2:"";s:3:"紃";s:2:"J";s:3:"約";s:2:"";s:3:"紅";s:2:"";s:3:"紆";s:2:"";s:3:"紇";s:2:"";s:3:"紈";s:2:"K";s:3:"紉";s:2:"";s:3:"紊";s:2:"";s:3:"紋";s:2:"";s:3:"紌";s:2:"Z";s:3:"納";s:2:"";s:3:"紎";s:2:"S";s:3:"紏";s:2:"Y";s:3:"紐";s:2:"";s:3:"紑";s:2:"R";s:3:"紒";s:2:"X";s:3:"紓";s:2:"V";s:3:"純";s:2:"";s:3:"紕";s:2:"";s:3:"紖";s:2:"U";s:3:"紗";s:2:"";s:3:"紘";s:2:"T";s:3:"紙";s:2:"";s:3:"級";s:2:"";s:3:"紛";s:2:"";s:3:"紜";s:2:"";s:3:"紝";s:2:"Q";s:3:"紞";s:2:"P";s:3:"紟";s:2:"W";s:3:"素";s:2:"";s:3:"紡";s:2:"";s:3:"索";s:2:"";s:3:"紨";s:2:"";s:3:"紩";s:2:"";s:3:"紫";s:2:"";s:3:"紬";s:2:"";s:3:"紮";s:2:"";s:3:"累";s:2:"";s:3:"細";s:2:"";s:3:"紱";s:2:"";s:3:"紲";s:2:"";s:3:"紳";s:2:"";s:3:"紵";s:2:"";s:3:"紶";s:2:"";s:3:"紸";s:2:"";s:3:"紹";s:2:"";s:3:"紺";s:2:"";s:3:"紻";s:2:"";s:3:"紼";s:2:"";s:3:"紽";s:2:"";s:3:"紾";s:2:"";s:3:"紿";s:2:"";s:3:"絀";s:2:"";s:3:"絁";s:2:"";s:3:"終";s:2:"";s:3:"絃";s:2:"";s:3:"組";s:2:"";s:3:"絅";s:2:"";s:3:"絆";s:2:"";s:3:"絇";s:2:"";s:3:"絊";s:2:"";s:3:"絎";s:2:"";s:3:"絏";s:2:"";s:3:"結";s:2:"";s:3:"絑";s:2:"";s:3:"絒";s:2:"";s:3:"絓";s:2:"";s:3:"絔";s:2:"";s:3:"絕";s:2:"";s:3:"絖";s:2:"";s:3:"絘";s:2:"";s:3:"絛";s:2:"l";s:3:"絜";s:2:"";s:3:"絞";s:2:"";s:3:"絟";s:2:"";s:3:"絡";s:2:"";s:3:"絢";s:2:"";s:3:"絣";s:2:"";s:3:"給";s:2:"";s:3:"絧";s:2:"";s:3:"絨";s:2:"";s:3:"絩";s:2:"";s:3:"絪";s:2:"";s:3:"絫";s:2:"";s:3:"絭";s:2:"";s:3:"絮";s:2:"";s:3:"絯";s:2:"";s:3:"絰";s:2:"";s:3:"統";s:2:"";s:3:"絲";s:2:"";s:3:"絳";s:2:"";s:3:"絹";s:2:"h";s:3:"絺";s:2:"]";s:3:"絻";s:2:"_";s:3:"絼";s:2:"a";s:3:"絽";s:2:"e";s:3:"絿";s:2:"[";s:3:"綀";s:2:"Y";s:3:"綁";s:2:"j";s:3:"綃";s:2:"`";s:3:"綄";s:2:"d";s:3:"綅";s:2:"\";s:3:"綆";s:2:"X";s:3:"綈";s:2:"W";s:3:"綌";s:2:"b";s:3:"綍";s:2:"Z";s:3:"綎";s:2:"^";s:3:"綏";s:2:"k";s:3:"綑";s:2:"i";s:3:"綒";s:2:"f";s:3:"經";s:2:"g";s:3:"綔";s:2:"c";s:3:"綖";s:2:"r";s:3:"綜";s:2:"";s:3:"綝";s:2:"j";s:3:"綞";s:2:"x";s:3:"綟";s:2:"t";s:3:"綠";s:2:"";s:3:"綡";s:2:"x";s:3:"綢";s:2:"";s:3:"綣";s:2:"e";s:3:"綦";s:2:"u";s:3:"綧";s:2:"b";s:3:"綩";s:2:"w";s:3:"綪";s:2:"f";s:3:"綬";s:2:"";s:3:"維";s:2:"";s:3:"綮";s:2:"v";s:3:"綯";s:2:"p";s:3:"綰";s:2:"";s:3:"綱";s:2:"";s:3:"網";s:2:"";s:3:"綴";s:2:"";s:3:"綵";s:2:"";s:3:"綷";s:2:"c";s:3:"綸";s:2:"";s:3:"綹";s:2:"q";s:3:"綺";s:2:"";s:3:"綻";s:2:"";s:3:"綼";s:2:"s";s:3:"綽";s:2:"";s:3:"綾";s:2:"";s:3:"綿";s:2:"";s:3:"緀";s:2:"h";s:3:"緁";s:2:"g";s:3:"緂";s:2:"d";s:3:"緄";s:2:"l";s:3:"緅";s:2:"i";s:3:"緆";s:2:"m";s:3:"緇";s:2:"";s:3:"緉";s:2:"y";s:3:"緊";s:2:"";s:3:"緋";s:2:"n";s:3:"緌";s:2:"o";s:3:"緎";s:2:"k";s:3:"緒";s:2:"";s:3:"緗";s:2:"";s:3:"緘";s:2:"p";s:3:"緙";s:2:"y";s:3:"線";s:2:"u";s:3:"緛";s:2:"";s:3:"緝";s:2:"r";s:3:"緞";s:2:"v";s:3:"緟";s:2:"";s:3:"締";s:2:"l";s:3:"緡";s:2:"";s:3:"緣";s:2:"t";s:3:"緦";s:2:"";s:3:"緧";s:2:"";s:3:"編";s:2:"s";s:3:"緩";s:2:"w";s:3:"緪";s:2:"";s:3:"緬";s:2:"q";s:3:"緮";s:2:"";s:3:"緯";s:2:"n";s:3:"緰";s:2:"";s:3:"緱";s:2:"";s:3:"緲";s:2:"z";s:3:"緳";s:2:"r";s:3:"練";s:2:"m";s:3:"緶";s:2:"";s:3:"緷";s:2:"";s:3:"緹";s:2:"{";s:3:"緺";s:2:"";s:3:"緻";s:2:"o";s:3:"縃";s:2:"";s:3:"縈";s:2:"";s:3:"縉";s:2:"";s:3:"縊";s:2:"~";s:3:"縋";s:2:"";s:3:"縌";s:2:"";s:3:"縍";s:2:"";s:3:"縎";s:2:"";s:3:"縏";s:2:"";s:3:"縐";s:2:"";s:3:"縑";s:2:"";s:3:"縒";s:2:"";s:3:"縓";s:2:"";s:3:"縔";s:2:"";s:3:"縕";s:2:"";s:3:"縖";s:2:"";s:3:"縗";s:2:"";s:3:"縚";s:2:"";s:3:"縛";s:2:"";s:3:"縜";s:2:"";s:3:"縝";s:2:"";s:3:"縞";s:2:"";s:3:"縟";s:2:"";s:3:"縠";s:2:"";s:3:"縡";s:2:"";s:3:"縢";s:2:"";s:3:"縣";s:2:"";s:3:"縤";s:2:"";s:3:"縥";s:2:"";s:3:"縩";s:2:"";s:3:"縪";s:2:"";s:3:"縫";s:2:"_";s:3:"縭";s:2:"";s:3:"縮";s:2:"Y";s:3:"縯";s:2:"i";s:3:"縰";s:2:"";s:3:"縱";s:2:"a";s:3:"縲";s:2:"]";s:3:"縳";s:2:"";s:3:"縴";s:2:"d";s:3:"縵";s:2:"g";s:3:"縶";s:2:"";s:3:"縷";s:2:"\";s:3:"縸";s:2:"";s:3:"縹";s:2:"e";s:3:"縺";s:2:"";s:3:"縻";s:2:"";s:3:"縼";s:2:"";s:3:"總";s:2:"`";s:3:"績";s:2:"Z";s:3:"縿";s:2:"h";s:3:"繀";s:2:"";s:3:"繁";s:2:"c";s:3:"繂";s:2:"";s:3:"繃";s:2:"^";s:3:"繄";s:2:"";s:3:"繅";s:2:"b";s:3:"繆";s:2:"[";s:3:"繇";s:2:"";s:3:"繈";s:2:"f";s:3:"繉";s:2:"";s:3:"繌";s:2:"";s:3:"繐";s:2:"n";s:3:"繑";s:2:"t";s:3:"繒";s:2:"¹";s:3:"繓";s:2:"w";s:3:"織";s:2:"´";s:3:"繕";s:2:"µ";s:3:"繖";s:2:"o";s:3:"繗";s:2:"v";s:3:"繘";s:2:"q";s:3:"繙";s:2:"º";s:3:"繚";s:2:"·";s:3:"繜";s:2:"m";s:3:"繞";s:2:"¶";s:3:"繟";s:2:"s";s:3:"繠";s:2:"u";s:3:"繡";s:2:"¸";s:3:"繢";s:2:"r";s:3:"繣";s:2:"p";s:3:"繨";s:2:"";s:3:"繩";s:2:"÷";s:3:"繪";s:2:"ø";s:3:"繫";s:2:"ô";s:3:"繭";s:2:"õ";s:3:"繯";s:2:"";s:3:"繰";s:2:"";s:3:"繲";s:2:"";s:3:"繳";s:2:"ú";s:3:"繴";s:2:"";s:3:"繵";s:2:"";s:3:"繶";s:2:"";s:3:"繷";s:2:"";s:3:"繸";s:2:"";s:3:"繹";s:2:"ö";s:3:"繺";s:2:"";s:3:"繻";s:2:"";s:3:"繼";s:2:"~";s:3:"繽";s:2:"}";s:3:"繾";s:2:"";s:3:"纀";s:2:"";s:3:"纁";s:2:"";s:3:"纂";s:2:"ġ";s:3:"纆";s:2:"";s:3:"纇";s:2:"";s:3:"纈";s:2:"";s:3:"纊";s:2:"";s:3:"纋";s:2:"";s:3:"續";s:2:"";s:3:"纍";s:2:"";s:3:"纏";s:2:"";s:3:"纑";s:2:"B";s:3:"纓";s:2:"";s:3:"纔";s:2:"";s:3:"纕";s:2:"";s:3:"纖";s:2:"";s:3:"纗";s:2:"";s:3:"纘";s:2:"@";s:3:"纙";s:2:"B";s:3:"纚";s:2:"";s:3:"纛";s:2:"A";s:3:"纜";s:2:"l";s:3:"缶";s:2:"";s:3:"缸";s:2:"";s:3:"缹";s:2:"o";s:3:"缺";s:2:"";s:3:"缽";s:2:"";s:3:"缾";s:2:"";s:3:"缿";s:2:"";s:3:"罃";s:2:"";s:3:"罄";s:2:"j";s:3:"罅";s:2:"";s:3:"罈";s:2:"»";s:3:"罊";s:2:"";s:3:"罋";s:2:"";s:3:"罌";s:2:"Ģ";s:3:"罍";s:2:"";s:3:"罏";s:2:"C";s:3:"罐";s:2:"";s:3:"网";s:2:"I";s:3:"罔";s:2:"";s:3:"罕";s:2:"u";s:3:"罘";s:2:"M";s:3:"罛";s:2:"`";s:3:"罜";s:2:"[";s:3:"罝";s:2:"_";s:3:"罞";s:2:"]";s:3:"罟";s:2:"";s:3:"罠";s:2:"^";s:3:"罡";s:2:"\";s:3:"罣";s:2:"";s:3:"罥";s:2:"";s:3:"罦";s:2:"@";s:3:"罧";s:2:"i";s:3:"罨";s:2:"j";s:3:"罩";s:2:"n";s:3:"罪";s:2:"o";s:3:"罫";s:2:"h";s:3:"罬";s:2:"k";s:3:"罭";s:2:"g";s:3:"置";s:2:"m";s:3:"罰";s:2:"@";s:3:"署";s:2:"p";s:3:"罳";s:2:"z";s:3:"罵";s:2:"|";s:3:"罶";s:2:"";s:3:"罷";s:2:"}";s:3:"罹";s:2:"";s:3:"罺";s:2:"";s:3:"罻";s:2:"";s:3:"罼";s:2:"";s:3:"罽";s:2:"";s:3:"罾";s:2:"";s:3:"罿";s:2:"";s:3:"羃";s:2:"";s:3:"羅";s:2:"ù";s:3:"羆";s:2:"";s:3:"羇";s:2:"D";s:3:"羈";s:2:"";s:3:"羉";s:2:"";s:3:"羊";s:2:"";s:3:"羋";s:2:"";s:3:"羌";s:2:"";s:3:"羍";s:2:"O";s:3:"美";s:2:"";s:3:"羑";s:2:"N";s:3:"羒";s:2:"b";s:3:"羔";s:2:"";s:3:"羕";s:2:"";s:3:"羖";s:2:"a";s:3:"羚";s:2:"";s:3:"羛";s:2:"";s:3:"羜";s:2:"";s:3:"羝";s:2:"";s:3:"羞";s:2:"";s:3:"羠";s:2:"B";s:3:"羡";s:2:"C";s:3:"羢";s:2:"A";s:3:"群";s:2:"s";s:3:"羥";s:2:"m";s:3:"羦";s:2:"l";s:3:"羧";s:2:"n";s:3:"羨";s:2:"r";s:3:"義";s:2:"q";s:3:"羬";s:2:"";s:3:"羭";s:2:"";s:3:"羯";s:2:"~";s:3:"羰";s:2:"";s:3:"羱";s:2:"";s:3:"羲";s:2:"";s:3:"羳";s:2:"y";s:3:"羵";s:2:"x";s:3:"羶";s:2:"û";s:3:"羷";s:2:"";s:3:"羸";s:2:"ý";s:3:"羹";s:2:"ü";s:3:"羺";s:2:"";s:3:"羻";s:2:"";s:3:"羼";s:2:"";s:3:"羽";s:2:"";s:3:"羾";s:2:"P";s:3:"羿";s:2:"";s:3:"翀";s:2:"e";s:3:"翁";s:2:"";s:3:"翂";s:2:"d";s:3:"翃";s:2:"c";s:3:"翅";s:2:"";s:3:"翇";s:2:"";s:3:"翉";s:2:"";s:3:"翊";s:2:"";s:3:"翋";s:2:"";s:3:"翌";s:2:"";s:3:"翍";s:2:"";s:3:"翎";s:2:"";s:3:"翏";s:2:"";s:3:"翐";s:2:"";s:3:"翑";s:2:"";s:3:"習";s:2:"";s:3:"翔";s:2:"";s:3:"翕";s:2:"";s:3:"翗";s:2:"D";s:3:"翛";s:2:"o";s:3:"翜";s:2:"p";s:3:"翞";s:2:"~";s:3:"翟";s:2:"C";s:3:"翠";s:2:"A";s:3:"翡";s:2:"B";s:3:"翢";s:2:"{";s:3:"翣";s:2:"|";s:3:"翥";s:2:"}";s:3:"翦";s:2:"";s:3:"翨";s:2:"";s:3:"翩";s:2:"";s:3:"翪";s:2:"";s:3:"翫";s:2:"";s:3:"翬";s:2:"";s:3:"翭";s:2:"";s:3:"翮";s:2:"";s:3:"翯";s:2:"";s:3:"翰";s:2:"";s:3:"翱";s:2:"";s:3:"翲";s:2:"";s:3:"翳";s:2:"k";s:3:"翴";s:2:"";s:3:"翵";s:2:"";s:3:"翷";s:2:"z";s:3:"翸";s:2:"{";s:3:"翹";s:2:"¼";s:3:"翻";s:2:"½";s:3:"翼";s:2:"l";s:3:"翽";s:2:"";s:3:"翾";s:2:"";s:3:"翿";s:2:"";s:3:"耀";s:2:"ģ";s:3:"老";s:2:"";s:3:"考";s:2:"";s:3:"耄";s:2:"";s:3:"者";s:2:"";s:3:"耆";s:2:"";s:3:"耇";s:2:"Q";s:3:"耋";s:2:"";s:3:"而";s:2:"";s:3:"耍";s:2:"A";s:3:"耎";s:2:"R";s:3:"耏";s:2:"S";s:3:"耐";s:2:"@";s:3:"耑";s:2:"B";s:3:"耒";s:2:"";s:3:"耔";s:2:"T";s:3:"耕";s:2:"";s:3:"耖";s:2:"f";s:3:"耗";s:2:"";s:3:"耘";s:2:"";s:3:"耙";s:2:"";s:3:"耛";s:2:"A";s:3:"耜";s:2:"";s:3:"耞";s:2:"@";s:3:"耟";s:2:"";s:3:"耡";s:2:"q";s:3:"耤";s:2:"";s:3:"耦";s:2:"";s:3:"耨";s:2:"";s:3:"耩";s:2:"";s:3:"耪";s:2:"";s:3:"耬";s:2:"";s:3:"耰";s:2:"";s:3:"耳";s:2:"";s:3:"耴";s:2:"s";s:3:"耵";s:2:"ͪ";s:3:"耶";s:2:"C";s:3:"耷";s:2:"U";s:3:"耹";s:2:"h";s:3:"耽";s:2:"";s:3:"耾";s:2:"g";s:3:"耿";s:2:"";s:3:"聃";s:2:"C";s:3:"聆";s:2:"";s:3:"聇";s:2:"B";s:3:"聈";s:2:"D";s:3:"聊";s:2:"";s:3:"聏";s:2:"F";s:3:"聐";s:2:"G";s:3:"聑";s:2:"E";s:3:"聒";s:2:"";s:3:"聖";s:2:"t";s:3:"聘";s:2:"u";s:3:"聚";s:2:"E";s:3:"聜";s:2:"";s:3:"聝";s:2:"";s:3:"聞";s:2:"D";s:3:"聤";s:2:"";s:3:"聧";s:2:"";s:3:"聬";s:2:"";s:3:"聯";s:2:"p";s:3:"聰";s:2:"o";s:3:"聱";s:2:"m";s:3:"聲";s:2:"n";s:3:"聳";s:2:"q";s:3:"聵";s:2:"|";s:3:"聶";s:2:"¿";s:3:"職";s:2:"¾";s:3:"聸";s:2:"";s:3:"聹";s:2:"";s:3:"聽";s:2:"ť";s:3:"聾";s:2:"Ť";s:3:"聿";s:2:"";s:3:"肂";s:2:"";s:3:"肄";s:2:"w";s:3:"肅";s:2:"";s:3:"肆";s:2:"v";s:3:"肇";s:2:"F";s:3:"肉";s:2:"";s:3:"肊";s:2:"ɩ";s:3:"肋";s:2:"";s:3:"肌";s:2:"";s:3:"肏";s:2:"ͫ";s:3:"肐";s:2:"v";s:3:"肒";s:2:"w";s:3:"肓";s:2:"w";s:3:"肕";s:2:"t";s:3:"肖";s:2:"v";s:3:"肘";s:2:"y";s:3:"肙";s:2:"u";s:3:"肚";s:2:"{";s:3:"肛";s:2:"z";s:3:"肜";s:2:"x";s:3:"肝";s:2:"x";s:3:"股";s:2:"";s:3:"肢";s:2:"";s:3:"肣";s:2:"ͭ";s:3:"肥";s:2:"";s:3:"肩";s:2:"";s:3:"肪";s:2:"";s:3:"肫";s:2:"";s:3:"肭";s:2:"Ͱ";s:3:"肮";s:2:"ͬ";s:3:"肯";s:2:"";s:3:"肱";s:2:"";s:3:"育";s:2:"|";s:3:"肴";s:2:"";s:3:"肵";s:2:"ͯ";s:3:"肸";s:2:"ͮ";s:3:"肺";s:2:"";s:3:"胂";s:2:"[";s:3:"胃";s:2:"G";s:3:"胄";s:2:"H";s:3:"胅";s:2:"]";s:3:"胇";s:2:"W";s:3:"胈";s:2:"Z";s:3:"胉";s:2:"c";s:3:"胊";s:2:"a";s:3:"背";s:2:"I";s:3:"胍";s:2:"g";s:3:"胎";s:2:"L";s:3:"胏";s:2:"d";s:3:"胐";s:2:"\";s:3:"胑";s:2:"Y";s:3:"胔";s:2:"I";s:3:"胕";s:2:"b";s:3:"胖";s:2:"D";s:3:"胗";s:2:"e";s:3:"胘";s:2:"V";s:3:"胙";s:2:"_";s:3:"胚";s:2:"F";s:3:"胛";s:2:"K";s:3:"胜";s:2:"`";s:3:"胝";s:2:"O";s:3:"胞";s:2:"M";s:3:"胠";s:2:"X";s:3:"胡";s:2:"J";s:3:"胣";s:2:"^";s:3:"胤";s:2:"N";s:3:"胥";s:2:"E";s:3:"胦";s:2:"f";s:3:"胭";s:2:"";s:3:"胯";s:2:"";s:3:"胰";s:2:"";s:3:"胱";s:2:"";s:3:"胲";s:2:"j";s:3:"胳";s:2:"";s:3:"胴";s:2:"";s:3:"胵";s:2:"l";s:3:"胸";s:2:"";s:3:"胹";s:2:"k";s:3:"胺";s:2:"i";s:3:"胻";s:2:"n";s:3:"胼";s:2:"";s:3:"能";s:2:"";s:3:"胾";s:2:"H";s:3:"脀";s:2:"o";s:3:"脁";s:2:"m";s:3:"脂";s:2:"";s:3:"脅";s:2:"";s:3:"脆";s:2:"";s:3:"脈";s:2:"";s:3:"脊";s:2:"";s:3:"脕";s:2:"N";s:3:"脖";s:2:"";s:3:"脘";s:2:"E";s:3:"脙";s:2:"G";s:3:"脛";s:2:"H";s:3:"脝";s:2:"P";s:3:"脞";s:2:"L";s:3:"脟";s:2:"J";s:3:"脡";s:2:"M";s:3:"脢";s:2:"Q";s:3:"脣";s:2:"";s:3:"脤";s:2:"";s:3:"脥";s:2:"F";s:3:"脧";s:2:"O";s:3:"脩";s:2:"";s:3:"脫";s:2:"";s:3:"脬";s:2:"K";s:3:"脭";s:2:"I";s:3:"脯";s:2:"";s:3:"脰";s:2:"";s:3:"脹";s:2:"";s:3:"脺";s:2:"Q";s:3:"脽";s:2:"O";s:3:"脾";s:2:"";s:3:"腃";s:2:"J";s:3:"腄";s:2:"ߡ";s:3:"腆";s:2:"";s:3:"腇";s:2:"N";s:3:"腊";s:2:"K";s:3:"腋";s:2:"";s:3:"腌";s:2:"";s:3:"腍";s:2:"P";s:3:"腎";s:2:"";s:3:"腏";s:2:"M";s:3:"腐";s:2:"G";s:3:"腑";s:2:"";s:3:"腒";s:2:"L";s:3:"腓";s:2:"";s:3:"腔";s:2:"";s:3:"腕";s:2:"";s:3:"腛";s:2:"w";s:3:"腜";s:2:"u";s:3:"腞";s:2:"{";s:3:"腠";s:2:"s";s:3:"腡";s:2:"ߢ";s:3:"腢";s:2:"x";s:3:"腤";s:2:"r";s:3:"腥";s:2:"{";s:3:"腦";s:2:"";s:3:"腧";s:2:"}";s:3:"腩";s:2:"v";s:3:"腫";s:2:"~";s:3:"腮";s:2:"|";s:3:"腯";s:2:"~";s:3:"腰";s:2:"y";s:3:"腱";s:2:"x";s:3:"腲";s:2:"y";s:3:"腳";s:2:"}";s:3:"腴";s:2:"";s:3:"腶";s:2:"|";s:3:"腷";s:2:"t";s:3:"腸";s:2:"z";s:3:"腹";s:2:"";s:3:"腺";s:2:"";s:3:"腿";s:2:"L";s:3:"膀";s:2:"H";s:3:"膂";s:2:"M";s:3:"膃";s:2:"";s:3:"膆";s:2:"";s:3:"膇";s:2:"";s:3:"膈";s:2:"J";s:3:"膉";s:2:"";s:3:"膊";s:2:"K";s:3:"膋";s:2:"";s:3:"膌";s:2:"";s:3:"膍";s:2:"";s:3:"膏";s:2:"I";s:3:"膕";s:2:"A";s:3:"膗";s:2:"D";s:3:"膘";s:2:"";s:3:"膙";s:2:"C";s:3:"膚";s:2:"";s:3:"膛";s:2:"";s:3:"膜";s:2:"";s:3:"膝";s:2:"";s:3:"膞";s:2:"@";s:3:"膟";s:2:"";s:3:"膠";s:2:"";s:3:"膢";s:2:"B";s:3:"膣";s:2:"";s:3:"膦";s:2:"";s:3:"膧";s:2:"";s:3:"膨";s:2:"";s:3:"膩";s:2:"";s:3:"膫";s:2:"";s:3:"膬";s:2:"";s:3:"膮";s:2:"";s:3:"膰";s:2:"";s:3:"膱";s:2:"";s:3:"膲";s:2:"";s:3:"膳";s:2:"";s:3:"膴";s:2:"";s:3:"膵";s:2:"";s:3:"膷";s:2:"";s:3:"膹";s:2:"";s:3:"膺";s:2:"t";s:3:"膻";s:2:"";s:3:"膼";s:2:"";s:3:"膽";s:2:"x";s:3:"膾";s:2:"z";s:3:"膿";s:2:"w";s:3:"臀";s:2:"v";s:3:"臂";s:2:"u";s:3:"臃";s:2:"s";s:3:"臄";s:2:"";s:3:"臅";s:2:"";s:3:"臆";s:2:"r";s:3:"臇";s:2:"";s:3:"臉";s:2:"y";s:3:"臊";s:2:"";s:3:"臌";s:2:"";s:3:"臍";s:2:"";s:3:"臏";s:2:"";s:3:"臐";s:2:"";s:3:"臑";s:2:"}";s:3:"臒";s:2:"~";s:3:"臕";s:2:"";s:3:"臗";s:2:"";s:3:"臘";s:2:"þ";s:3:"臙";s:2:"";s:3:"臚";s:2:"Ĥ";s:3:"臛";s:2:"";s:3:"臝";s:2:"";s:3:"臞";s:2:"E";s:3:"臟";s:2:"Ŧ";s:3:"臠";s:2:"C";s:3:"臡";s:2:"D";s:3:"臢";s:2:"";s:3:"臣";s:2:"";s:3:"臥";s:2:"";s:3:"臦";s:2:"R";s:3:"臧";s:2:"N";s:3:"臨";s:2:"{";s:3:"臩";s:2:"";s:3:"自";s:2:"";s:3:"臬";s:2:"";s:3:"臭";s:2:"";s:3:"臮";s:2:"S";s:3:"臲";s:2:"";s:3:"至";s:2:"";s:3:"致";s:2:"P";s:3:"臷";s:2:"T";s:3:"臸";s:2:"U";s:3:"臹";s:2:"V";s:3:"臺";s:2:"O";s:3:"臻";s:2:"";s:3:"臼";s:2:"";s:3:"臾";s:2:"";s:3:"臿";s:2:"h";s:3:"舀";s:2:"";s:3:"舁";s:2:"p";s:3:"舂";s:2:"";s:3:"舄";s:2:"W";s:3:"舅";s:2:"";s:3:"與";s:2:"P";s:3:"興";s:2:"";s:3:"舉";s:2:"|";s:3:"舊";s:2:"";s:3:"舋";s:2:"";s:3:"舌";s:2:"";s:3:"舍";s:2:"";s:3:"舐";s:2:"";s:3:"舑";s:2:"R";s:3:"舒";s:2:"";s:3:"舔";s:2:"Q";s:3:"舕";s:2:"";s:3:"舖";s:2:"E";s:3:"舛";s:2:"";s:3:"舜";s:2:"";s:3:"舝";s:2:"ߣ";s:3:"舞";s:2:"R";s:3:"舟";s:2:"";s:3:"舠";s:2:"ͱ";s:3:"舡";s:2:"i";s:3:"舢";s:2:"Q";s:3:"舥";s:2:"r";s:3:"舨";s:2:"";s:3:"航";s:2:"";s:3:"舫";s:2:"";s:3:"般";s:2:"";s:3:"舯";s:2:"q";s:3:"舲";s:2:"W";s:3:"舳";s:2:"T";s:3:"舴";s:2:"V";s:3:"舵";s:2:"";s:3:"舶";s:2:"";s:3:"舷";s:2:"";s:3:"舸";s:2:"S";s:3:"船";s:2:"";s:3:"舺";s:2:"U";s:3:"舼";s:2:"X";s:3:"舽";s:2:"Y";s:3:"舿";s:2:"Z";s:3:"艀";s:2:"ߦ";s:3:"艂";s:2:"ߧ";s:3:"艄";s:2:"ߥ";s:3:"艅";s:2:"ߨ";s:3:"艇";s:2:"";s:3:"艉";s:2:"ߤ";s:3:"艋";s:2:"S";s:3:"艎";s:2:"J";s:3:"艏";s:2:"F";s:3:"艐";s:2:"I";s:3:"艑";s:2:"K";s:3:"艒";s:2:"H";s:3:"艓";s:2:"G";s:3:"艕";s:2:"";s:3:"艖";s:2:"";s:3:"艗";s:2:"";s:3:"艘";s:2:"";s:3:"艙";s:2:"";s:3:"艚";s:2:"";s:3:"艛";s:2:"";s:3:"艜";s:2:"";s:3:"艞";s:2:"";s:3:"艟";s:2:"";s:3:"艡";s:2:"";s:3:"艣";s:2:"";s:3:"艤";s:2:"";s:3:"艦";s:2:"ĥ";s:3:"艨";s:2:"";s:3:"艩";s:2:"";s:3:"艫";s:2:"F";s:3:"艬";s:2:"";s:3:"艭";s:2:"";s:3:"艮";s:2:"";s:3:"良";s:2:"}";s:3:"艱";s:2:"}";s:3:"色";s:2:"";s:3:"艴";s:2:"X";s:3:"艵";s:2:"[";s:3:"艷";s:2:"A";s:3:"艸";s:2:"J";s:3:"艼";s:2:"K";s:3:"艽";s:2:"M";s:3:"艾";s:2:"";s:3:"艿";s:2:"N";s:3:"芀";s:2:"L";s:3:"芃";s:2:"ˢ";s:3:"芄";s:2:"ˣ";s:3:"芅";s:2:"{";s:3:"芊";s:2:"ˡ";s:3:"芋";s:2:"";s:3:"芍";s:2:"";s:3:"芎";s:2:"|";s:3:"芏";s:2:"z";s:3:"芐";s:2:"y";s:3:"芑";s:2:"}";s:3:"芒";s:2:"~";s:3:"芓";s:2:"~";s:3:"芔";s:2:"j";s:3:"芘";s:2:"Ͷ";s:3:"芙";s:2:"";s:3:"芚";s:2:"͵";s:3:"芛";s:2:"ͷ";s:3:"芝";s:2:"";s:3:"芞";s:2:"ͼ";s:3:"芟";s:2:"";s:3:"芠";s:2:"Ͳ";s:3:"芡";s:2:"";s:3:"芢";s:2:"";s:3:"芣";s:2:"";s:3:"芤";s:2:"";s:3:"芥";s:2:"";s:3:"芧";s:2:"͹";s:3:"芨";s:2:"Ϳ";s:3:"芩";s:2:"";s:3:"芫";s:2:"ʹ";s:3:"芬";s:2:"";s:3:"芭";s:2:"";s:3:"芮";s:2:"ͺ";s:3:"芯";s:2:"";s:3:"芰";s:2:"";s:3:"花";s:2:"";s:3:"芳";s:2:"";s:3:"芴";s:2:";";s:3:"芵";s:2:"͸";s:3:"芶";s:2:"";s:3:"芷";s:2:"";s:3:"芸";s:2:"";s:3:"芹";s:2:"";s:3:"芺";s:2:"ͽ";s:3:"芻";s:2:"";s:3:"芼";s:2:"ͻ";s:3:"芽";s:2:"";s:3:"芾";s:2:"";s:3:"苀";s:2:"ͳ";s:3:"苂";s:2:"";s:3:"苃";s:2:"";s:3:"苑";s:2:"b";s:3:"苒";s:2:"\";s:3:"苓";s:2:"d";s:3:"苔";s:2:"a";s:3:"苕";s:2:"q";s:3:"苖";s:2:"t";s:3:"苗";s:2:"]";s:3:"苙";s:2:"k";s:3:"苛";s:2:"V";s:3:"苜";s:2:"`";s:3:"苞";s:2:"c";s:3:"苟";s:2:"e";s:3:"苠";s:2:"Т";s:3:"苡";s:2:"w";s:3:"苣";s:2:"U";s:3:"苤";s:2:"С";s:3:"若";s:2:"Y";s:3:"苦";s:2:"W";s:3:"苧";s:2:"R";s:3:"苨";s:2:"o";s:3:"苪";s:2:"~";s:3:"苫";s:2:"s";s:3:"苬";s:2:"v";s:3:"苭";s:2:"Х";s:3:"苯";s:2:"f";s:3:"苰";s:2:"}";s:3:"英";s:2:"^";s:3:"苲";s:2:"x";s:3:"苳";s:2:"Ф";s:3:"苴";s:2:"u";s:3:"苵";s:2:"y";s:3:"苶";s:2:"|";s:3:"苹";s:2:"m";s:3:"苺";s:2:"У";s:3:"苻";s:2:"{";s:3:"苾";s:2:"l";s:3:"茀";s:2:"p";s:3:"茁";s:2:"_";s:3:"茂";s:2:"Z";s:3:"范";s:2:"S";s:3:"茄";s:2:"X";s:3:"茅";s:2:"T";s:3:"茆";s:2:"g";s:3:"茇";s:2:"n";s:3:"茈";s:2:"ӥ";s:3:"茉";s:2:"[";s:3:"茌";s:2:"z";s:3:"茍";s:2:"A";s:3:"茖";s:2:"Ө";s:3:"茗";s:2:"";s:3:"茙";s:2:"v";s:3:"茛";s:2:"ӣ";s:3:"茜";s:2:"}";s:3:"茞";s:2:"Ӳ";s:3:"茠";s:2:"Ӫ";s:3:"茢";s:2:"~";s:3:"茤";s:2:"ө";s:3:"茥";s:2:"x";s:3:"茦";s:2:"|";s:3:"茧";s:2:"ӵ";s:3:"茨";s:2:"";s:3:"茩";s:2:"ӭ";s:3:"茪";s:2:"Ӥ";s:3:"茫";s:2:"";s:3:"茬";s:2:"ӳ";s:3:"茭";s:2:"t";s:3:"茯";s:2:"Ӭ";s:3:"茱";s:2:"";s:3:"茲";s:2:"";s:3:"茳";s:2:"s";s:3:"茴";s:2:"";s:3:"茵";s:2:"";s:3:"茶";s:2:"";s:3:"茷";s:2:"ӫ";s:3:"茸";s:2:"";s:3:"茹";s:2:"";s:3:"茺";s:2:"r";s:3:"茻";s:2:"\";s:3:"茼";s:2:"Ӧ";s:3:"茿";s:2:"z";s:3:"荀";s:2:"";s:3:"荁";s:2:"{";s:3:"荂";s:2:"ӡ";s:3:"荃";s:2:"";s:3:"荄";s:2:"u";s:3:"荅";s:2:"ӯ";s:3:"荇";s:2:"Ӯ";s:3:"荈";s:2:"Ӷ";s:3:"草";s:2:"";s:3:"荊";s:2:"";s:3:"荋";s:2:"Ӵ";s:3:"荌";s:2:"Ӱ";s:3:"荍";s:2:"ӧ";s:3:"荎";s:2:"Ӣ";s:3:"荏";s:2:"";s:3:"荐";s:2:"";s:3:"荑";s:2:"w";s:3:"荒";s:2:"";s:3:"荓";s:2:"ӱ";s:3:"荔";s:2:"";s:3:"荖";s:2:"y";s:3:"荳";s:2:"^";s:3:"荴";s:2:"`";s:3:"荵";s:2:"e";s:3:"荶";s:2:"y";s:3:"荷";s:2:"";s:3:"荸";s:2:"";s:3:"荺";s:2:"]";s:3:"荻";s:2:"";s:3:"荼";s:2:"";s:3:"荽";s:2:"h";s:3:"荾";s:2:"o";s:3:"荿";s:2:"u";s:3:"莁";s:2:"b";s:3:"莃";s:2:"i";s:3:"莆";s:2:"@";s:3:"莇";s:2:"w";s:3:"莈";s:2:"r";s:3:"莉";s:2:"";s:3:"莊";s:2:"";s:3:"莋";s:2:"n";s:3:"莌";s:2:"j";s:3:"莍";s:2:"\";s:3:"莎";s:2:"";s:3:"莏";s:2:"a";s:3:"莐";s:2:"Y";s:3:"莒";s:2:"";s:3:"莓";s:2:"";s:3:"莔";s:2:"f";s:3:"莕";s:2:"c";s:3:"莖";s:2:"";s:3:"莗";s:2:"s";s:3:"莘";s:2:"";s:3:"莙";s:2:"d";s:3:"莚";s:2:"z";s:3:"莛";s:2:"l";s:3:"莝";s:2:"k";s:3:"莞";s:2:"";s:3:"莠";s:2:"";s:3:"莢";s:2:"";s:3:"莣";s:2:"Z";s:3:"莤";s:2:"_";s:3:"莥";s:2:"p";s:3:"莦";s:2:"v";s:3:"莧";s:2:"A";s:3:"莨";s:2:"[";s:3:"莩";s:2:"g";s:3:"莪";s:2:"m";s:3:"莫";s:2:"";s:3:"莮";s:2:"x";s:3:"莯";s:2:"q";s:3:"莰";s:2:"t";s:3:"莽";s:2:"";s:3:"莿";s:2:"l";s:3:"菀";s:2:"`";s:3:"菁";s:2:"";s:3:"菂";s:2:"}";s:3:"菃";s:2:"ۧ";s:3:"菄";s:2:"۪";s:3:"菅";s:2:"";s:3:"菆";s:2:"h";s:3:"菇";s:2:"ۣ";s:3:"菈";s:2:"i";s:3:"菉";s:2:"w";s:3:"菊";s:2:"";s:3:"菋";s:2:"s";s:3:"菌";s:2:"";s:3:"菎";s:2:"t";s:3:"菏";s:2:"]";s:3:"菑";s:2:"ۤ";s:3:"菔";s:2:"";s:3:"菕";s:2:"ۡ";s:3:"菖";s:2:"u";s:3:"菗";s:2:"۬";s:3:"菘";s:2:"p";s:3:"菙";s:2:"";s:3:"菛";s:2:"ۯ";s:3:"菜";s:2:"";s:3:"菝";s:2:"n";s:3:"菞";s:2:"z";s:3:"菟";s:2:"";s:3:"菠";s:2:"";s:3:"菡";s:2:"r";s:3:"菢";s:2:"ۭ";s:3:"菣";s:2:"k";s:3:"菤";s:2:"d";s:3:"菥";s:2:"o";s:3:"菧";s:2:"c";s:3:"菨";s:2:"a";s:3:"菩";s:2:"";s:3:"菪";s:2:"ۥ";s:3:"菫";s:2:"j";s:3:"菬";s:2:"ۨ";s:3:"菮";s:2:"۩";s:3:"華";s:2:"";s:3:"菰";s:2:"";s:3:"菱";s:2:"";s:3:"菲";s:2:"";s:3:"菳";s:2:"~";s:3:"菴";s:2:"";s:3:"菵";s:2:"v";s:3:"菶";s:2:"f";s:3:"菸";s:2:"";s:3:"菹";s:2:"^";s:3:"菺";s:2:"ۢ";s:3:"菻";s:2:"۫";s:3:"菼";s:2:"e";s:3:"菽";s:2:"";s:3:"菾";s:2:"۰";s:3:"菿";s:2:"q";s:3:"萁";s:2:"m";s:3:"萃";s:2:"";s:3:"萄";s:2:"";s:3:"萆";s:2:"|";s:3:"萇";s:2:"";s:3:"萉";s:2:"x";s:3:"萊";s:2:"";s:3:"萋";s:2:"";s:3:"萌";s:2:"";s:3:"萍";s:2:"";s:3:"萎";s:2:"";s:3:"萏";s:2:"y";s:3:"萐";s:2:"g";s:3:"萑";s:2:"{";s:3:"萒";s:2:"b";s:3:"萓";s:2:"ۦ";s:3:"萛";s:2:"ۮ";s:3:"萣";s:2:"_";s:3:"萩";s:2:"";s:3:"萫";s:2:"";s:3:"萬";s:2:"U";s:3:"萭";s:2:"";s:3:"萯";s:2:"";s:3:"萰";s:2:"ߵ";s:3:"萱";s:2:"";s:3:"萲";s:2:"";s:3:"萳";s:2:"";s:3:"萴";s:2:"";s:3:"萵";s:2:"";s:3:"萶";s:2:"";s:3:"萷";s:2:"߿";s:3:"萸";s:2:"";s:3:"萹";s:2:"";s:3:"萺";s:2:"";s:3:"萻";s:2:"";s:3:"萼";s:2:"";s:3:"落";s:2:"";s:3:"萿";s:2:"ߪ";s:3:"葀";s:2:"߲";s:3:"葂";s:2:"";s:3:"葃";s:2:"";s:3:"葄";s:2:"";s:3:"葅";s:2:"";s:3:"葆";s:2:"";s:3:"葇";s:2:"";s:3:"葉";s:2:"";s:3:"葋";s:2:"";s:3:"葌";s:2:"";s:3:"葍";s:2:"߶";s:3:"葎";s:2:"";s:3:"葐";s:2:"";s:3:"葑";s:2:"߱";s:3:"葒";s:2:"";s:3:"葔";s:2:"";s:3:"葖";s:2:"߫";s:3:"著";s:2:"";s:3:"葙";s:2:"߹";s:3:"葚";s:2:"߸";s:3:"葛";s:2:"";s:3:"葝";s:2:"߼";s:3:"葞";s:2:"߾";s:3:"葟";s:2:"";s:3:"葠";s:2:"";s:3:"葡";s:2:"";s:3:"董";s:2:"";s:3:"葥";s:2:"߰";s:3:"葦";s:2:"";s:3:"葧";s:2:"ߴ";s:3:"葨";s:2:"";s:3:"葩";s:2:"";s:3:"葫";s:2:"";s:3:"葬";s:2:"";s:3:"葭";s:2:"";s:3:"葮";s:2:"";s:3:"葯";s:2:"";s:3:"葰";s:2:"";s:3:"葳";s:2:"߻";s:3:"葴";s:2:"ߺ";s:3:"葵";s:2:"";s:3:"葶";s:2:"߬";s:3:"葷";s:2:"";s:3:"葸";s:2:"";s:3:"葹";s:2:"߭";s:3:"葺";s:2:"";s:3:"葽";s:2:"߷";s:3:"葾";s:2:"";s:3:"蒂";s:2:"";s:3:"蒆";s:2:"߳";s:3:"蒍";s:2:"߯";s:3:"蒎";s:2:"";s:3:"蒏";s:2:"߮";s:3:"蒐";s:2:"`";s:3:"蒑";s:2:"";s:3:"蒔";s:2:"";s:3:"蒗";s:2:"";s:3:"蒘";s:2:"";s:3:"蒙";s:2:"X";s:3:"蒚";s:2:"";s:3:"蒛";s:2:"";s:3:"蒜";s:2:"[";s:3:"蒝";s:2:"";s:3:"蒞";s:2:"Y";s:3:"蒟";s:2:"";s:3:"蒠";s:2:"";s:3:"蒡";s:2:"";s:3:"蒢";s:2:"";s:3:"蒤";s:2:"";s:3:"蒧";s:2:"";s:3:"蒨";s:2:"";s:3:"蒩";s:2:"";s:3:"蒪";s:2:"";s:3:"蒫";s:2:"";s:3:"蒬";s:2:"";s:3:"蒮";s:2:"";s:3:"蒯";s:2:"";s:3:"蒰";s:2:"";s:3:"蒱";s:2:"";s:3:"蒲";s:2:"Z";s:3:"蒴";s:2:"";s:3:"蒶";s:2:"";s:3:"蒸";s:2:"]";s:3:"蒹";s:2:"";s:3:"蒺";s:2:"";s:3:"蒻";s:2:"";s:3:"蒼";s:2:"a";s:3:"蒿";s:2:"U";s:3:"蓀";s:2:"^";s:3:"蓁";s:2:"";s:3:"蓂";s:2:"";s:3:"蓄";s:2:"W";s:3:"蓅";s:2:"";s:3:"蓆";s:2:"V";s:3:"蓇";s:2:"";s:3:"蓉";s:2:"T";s:3:"蓊";s:2:"c";s:3:"蓋";s:2:"\";s:3:"蓌";s:2:"";s:3:"蓍";s:2:"";s:3:"蓎";s:2:"";s:3:"蓏";s:2:"";s:3:"蓐";s:2:"";s:3:"蓑";s:2:"b";s:3:"蓒";s:2:"";s:3:"蓓";s:2:"_";s:3:"蓔";s:2:"";s:3:"蓖";s:2:"";s:3:"蓗";s:2:"";s:3:"蓛";s:2:"";s:3:"蓧";s:2:"s";s:3:"蓨";s:2:"t";s:3:"蓩";s:2:"g";s:3:"蓪";s:2:"f";s:3:"蓫";s:2:"b";s:3:"蓬";s:2:"";s:3:"蓮";s:2:"";s:3:"蓯";s:2:"v";s:3:"蓰";s:2:"u";s:3:"蓱";s:2:"ߩ";s:3:"蓲";s:2:"_";s:3:"蓳";s:2:"c";s:3:"蓴";s:2:"]";s:3:"蓶";s:2:"p";s:3:"蓷";s:2:"a";s:3:"蓹";s:2:"w";s:3:"蓺";s:2:"Z";s:3:"蓻";s:2:"X";s:3:"蓼";s:2:"d";s:3:"蓽";s:2:"n";s:3:"蓾";s:2:"i";s:3:"蓿";s:2:"";s:3:"蔀";s:2:"O";s:3:"蔂";s:2:"m";s:3:"蔆";s:2:"";s:3:"蔇";s:2:"߽";s:3:"蔈";s:2:"[";s:3:"蔉";s:2:"R";s:3:"蔊";s:2:"U";s:3:"蔋";s:2:"{";s:3:"蔌";s:2:"\";s:3:"蔍";s:2:"S";s:3:"蔎";s:2:"Q";s:3:"蔏";s:2:"N";s:3:"蔑";s:2:"";s:3:"蔒";s:2:"e";s:3:"蔓";s:2:"";s:3:"蔔";s:2:"";s:3:"蔕";s:2:"`";s:3:"蔖";s:2:"h";s:3:"蔗";s:2:"";s:3:"蔘";s:2:"x";s:3:"蔙";s:2:"|";s:3:"蔚";s:2:"";s:3:"蔜";s:2:"W";s:3:"蔝";s:2:"k";s:3:"蔞";s:2:"o";s:3:"蔟";s:2:"T";s:3:"蔠";s:2:"y";s:3:"蔡";s:2:"";s:3:"蔣";s:2:"";s:3:"蔤";s:2:"L";s:3:"蔥";s:2:"";s:3:"蔦";s:2:"r";s:3:"蔧";s:2:"V";s:3:"蔨";s:2:"j";s:3:"蔩";s:2:"P";s:3:"蔪";s:2:"^";s:3:"蔫";s:2:"Y";s:3:"蔬";s:2:"";s:3:"蔭";s:2:"";s:3:"蔮";s:2:"l";s:3:"蔯";s:2:"}";s:3:"蔰";s:2:"z";s:3:"蔱";s:2:"q";s:3:"蔻";s:2:"M";s:3:"蔽";s:2:"";s:3:"蔾";s:2:"I";s:3:"蕀";s:2:"@";s:3:"蕁";s:2:"C";s:3:"蕃";s:2:"";s:3:"蕄";s:2:"E";s:3:"蕅";s:2:"";s:3:"蕆";s:2:"A";s:3:"蕇";s:2:"G";s:3:"蕈";s:2:"";s:3:"蕉";s:2:"";s:3:"蕊";s:2:"";s:3:"蕍";s:2:"";s:3:"蕎";s:2:"L";s:3:"蕑";s:2:"F";s:3:"蕓";s:2:"";s:3:"蕔";s:2:"U";s:3:"蕕";s:2:"O";s:3:"蕖";s:2:"";s:3:"蕗";s:2:"F";s:3:"蕘";s:2:"";s:3:"蕙";s:2:"";s:3:"蕛";s:2:"J";s:3:"蕝";s:2:"T";s:3:"蕞";s:2:"";s:3:"蕠";s:2:"Q";s:3:"蕡";s:2:"";s:3:"蕢";s:2:"D";s:3:"蕣";s:2:"H";s:3:"蕤";s:2:"B";s:3:"蕥";s:2:"V";s:3:"蕦";s:2:"S";s:3:"蕧";s:2:"P";s:3:"蕨";s:2:"";s:3:"蕩";s:2:"";s:3:"蕪";s:2:"";s:3:"蕫";s:2:"";s:3:"蕬";s:2:"W";s:3:"蕭";s:2:"";s:3:"蕮";s:2:"M";s:3:"蕱";s:2:"K";s:3:"蕵";s:2:"N";s:3:"蕶";s:2:"S";s:3:"蕷";s:2:"@";s:3:"蕸";s:2:"E";s:3:"蕹";s:2:"R";s:3:"蕺";s:2:"D";s:3:"蕻";s:2:"";s:3:"蕼";s:2:"A";s:3:"蕾";s:2:"";s:3:"薀";s:2:"";s:3:"薁";s:2:"M";s:3:"薂";s:2:"O";s:3:"薃";s:2:"";s:3:"薄";s:2:"";s:3:"薅";s:2:"Q";s:3:"薆";s:2:"I";s:3:"薇";s:2:"";s:3:"薈";s:2:"P";s:3:"薉";s:2:"B";s:3:"薊";s:2:"";s:3:"薋";s:2:"";s:3:"薌";s:2:"R";s:3:"薍";s:2:"J";s:3:"薎";s:2:"G";s:3:"薏";s:2:"";s:3:"薐";s:2:"U";s:3:"薑";s:2:"";s:3:"薔";s:2:"";s:3:"薕";s:2:"";s:3:"薖";s:2:"H";s:3:"薘";s:2:"T";s:3:"薙";s:2:"K";s:3:"薚";s:2:"";s:3:"薛";s:2:"";s:3:"薜";s:2:"";s:3:"薝";s:2:"L";s:3:"薞";s:2:"";s:3:"薟";s:2:"V";s:3:"薠";s:2:"";s:3:"薡";s:2:"C";s:3:"薢";s:2:"N";s:3:"薣";s:2:"";s:3:"薤";s:2:"";s:3:"薦";s:2:"";s:3:"薧";s:2:"";s:3:"薨";s:2:"";s:3:"薩";s:2:"";s:3:"薪";s:2:"~";s:3:"薯";s:2:"";s:3:"薰";s:2:"";s:3:"薱";s:2:"";s:3:"薳";s:2:"";s:3:"薴";s:2:"";s:3:"薵";s:2:"";s:3:"薶";s:2:"";s:3:"薷";s:2:"";s:3:"薸";s:2:"";s:3:"薹";s:2:"";s:3:"薺";s:2:"";s:3:"薽";s:2:"";s:3:"薾";s:2:"";s:3:"薿";s:2:"";s:3:"藀";s:2:"";s:3:"藂";s:2:"";s:3:"藃";s:2:"";s:3:"藄";s:2:"";s:3:"藅";s:2:"";s:3:"藆";s:2:"";s:3:"藇";s:2:"";s:3:"藈";s:2:"";s:3:"藉";s:2:"";s:3:"藋";s:2:"";s:3:"藍";s:2:"";s:3:"藎";s:2:"";s:3:"藏";s:2:"";s:3:"藐";s:2:"";s:3:"藑";s:2:"";s:3:"藒";s:2:"";s:3:"藕";s:2:"";s:3:"藗";s:2:"";s:3:"藘";s:2:"";s:3:"藙";s:2:"";s:3:"藚";s:2:"";s:3:"藜";s:2:"";s:3:"藝";s:2:"";s:3:"藞";s:2:"";s:3:"藟";s:2:"";s:3:"藡";s:2:"";s:3:"藢";s:2:"";s:3:"藣";s:2:"";s:3:"藤";s:2:"";s:3:"藥";s:2:"";s:3:"藦";s:2:"";s:3:"藨";s:2:"";s:3:"藩";s:2:"ÿ";s:3:"藪";s:2:"";s:3:"藫";s:2:"";s:3:"藬";s:2:"";s:3:"藭";s:2:"";s:3:"藯";s:2:"";s:3:"藰";s:2:"";s:3:"藱";s:2:"";s:3:"藲";s:2:"";s:3:"藶";s:2:"";s:3:"藷";s:2:"";s:3:"藸";s:2:"";s:3:"藹";s:2:"ħ";s:3:"藺";s:2:"ĩ";s:3:"藻";s:2:"Ħ";s:3:"藽";s:2:"";s:3:"藾";s:2:"";s:3:"藿";s:2:"";s:3:"蘀";s:2:"";s:3:"蘁";s:2:"";s:3:"蘄";s:2:"";s:3:"蘅";s:2:"";s:3:"蘆";s:2:"Ī";s:3:"蘇";s:2:"Ĭ";s:3:"蘉";s:2:"";s:3:"蘊";s:2:"ĭ";s:3:"蘋";s:2:"ī";s:3:"蘌";s:2:"";s:3:"蘑";s:2:"Ĩ";s:3:"蘗";s:2:"";s:3:"蘘";s:2:"";s:3:"蘙";s:2:"";s:3:"蘚";s:2:"";s:3:"蘛";s:2:"";s:3:"蘜";s:2:"";s:3:"蘞";s:2:"";s:3:"蘟";s:2:"";s:3:"蘠";s:2:"";s:3:"蘡";s:2:"";s:3:"蘢";s:2:"";s:3:"蘣";s:2:"";s:3:"蘤";s:2:"";s:3:"蘥";s:2:"";s:3:"蘦";s:2:"";s:3:"蘧";s:2:"";s:3:"蘩";s:2:"";s:3:"蘪";s:2:"";s:3:"蘬";s:2:"J";s:3:"蘭";s:2:"";s:3:"蘮";s:2:"";s:3:"蘱";s:2:"";s:3:"蘲";s:2:"K";s:3:"蘳";s:2:"I";s:3:"蘴";s:2:"G";s:3:"蘵";s:2:"H";s:3:"蘶";s:2:"L";s:3:"蘸";s:2:"";s:3:"蘹";s:2:"";s:3:"蘺";s:2:"";s:3:"蘻";s:2:"";s:3:"蘼";s:2:"";s:3:"蘾";s:2:"";s:3:"蘿";s:2:"";s:3:"虀";s:2:"";s:3:"虃";s:2:"";s:3:"虆";s:2:"E";s:3:"虇";s:2:"F";s:3:"虈";s:2:"G";s:3:"虋";s:2:"";s:3:"虌";s:2:"";s:3:"虍";s:2:"O";s:3:"虎";s:2:"";s:3:"虐";s:2:"h";s:3:"虒";s:2:"Ӹ";s:3:"虓";s:2:"ӷ";s:3:"虔";s:2:"@";s:3:"處";s:2:"B";s:3:"虖";s:2:"|";s:3:"虙";s:2:"{";s:3:"虛";s:2:"";s:3:"虜";s:2:"";s:3:"虞";s:2:"";s:3:"號";s:2:"";s:3:"虡";s:2:"";s:3:"虢";s:2:"~";s:3:"虣";s:2:"X";s:3:"虤";s:2:"Z";s:3:"虥";s:2:"Y";s:3:"虧";s:2:"";s:3:"虨";s:2:"W";s:3:"虩";s:2:"";s:3:"虪";s:2:"";s:3:"虫";s:2:"";s:3:"虭";s:2:"";s:3:"虮";s:2:"";s:3:"虯";s:2:"";s:3:"虰";s:2:"";s:3:"虱";s:2:"";s:3:"虳";s:2:"Щ";s:3:"虴";s:2:"Ч";s:3:"虷";s:2:"Ц";s:3:"虹";s:2:"i";s:3:"虺";s:2:"k";s:3:"虻";s:2:"j";s:3:"虼";s:2:"Ш";s:3:"蚅";s:2:"";s:3:"蚆";s:2:"";s:3:"蚇";s:2:"ӿ";s:3:"蚊";s:2:"A";s:3:"蚋";s:2:"";s:3:"蚌";s:2:"F";s:3:"蚍";s:2:"Ӽ";s:3:"蚎";s:2:"";s:3:"蚐";s:2:"";s:3:"蚑";s:2:"ӽ";s:3:"蚓";s:2:"C";s:3:"蚔";s:2:"";s:3:"蚕";s:2:"";s:3:"蚖";s:2:"ӻ";s:3:"蚗";s:2:"";s:3:"蚘";s:2:"";s:3:"蚙";s:2:"";s:3:"蚚";s:2:"";s:3:"蚜";s:2:"H";s:3:"蚝";s:2:"";s:3:"蚞";s:2:"Ӿ";s:3:"蚡";s:2:"";s:3:"蚢";s:2:"ӹ";s:3:"蚣";s:2:"G";s:3:"蚤";s:2:"D";s:3:"蚥";s:2:"";s:3:"蚧";s:2:"";s:3:"蚨";s:2:"Ӻ";s:3:"蚩";s:2:"E";s:3:"蚪";s:2:"B";s:3:"蚯";s:2:"L";s:3:"蚰";s:2:"ץ";s:3:"蚱";s:2:"K";s:3:"蚳";s:2:"ר";s:3:"蚴";s:2:"׫";s:3:"蚵";s:2:"H";s:3:"蚶";s:2:"F";s:3:"蚷";s:2:"~";s:3:"蚸";s:2:"ש";s:3:"蚹";s:2:"ק";s:3:"蚺";s:2:"פ";s:3:"蚻";s:2:"׬";s:3:"蚼";s:2:"׭";s:3:"蚽";s:2:"ׯ";s:3:"蚾";s:2:"װ";s:3:"蚿";s:2:"}";s:3:"蛀";s:2:"E";s:3:"蛁";s:2:"ע";s:3:"蛂";s:2:"ס";s:3:"蛃";s:2:"׮";s:3:"蛄";s:2:"G";s:3:"蛅";s:2:"ף";s:3:"蛆";s:2:"I";s:3:"蛇";s:2:"D";s:3:"蛈";s:2:"צ";s:3:"蛉";s:2:"M";s:3:"蛋";s:2:"J";s:3:"蛌";s:2:"ת";s:3:"蛐";s:2:"";s:3:"蛑";s:2:"ۿ";s:3:"蛓";s:2:"۴";s:3:"蛔";s:2:"";s:3:"蛖";s:2:"";s:3:"蛗";s:2:"۽";s:3:"蛘";s:2:"۱";s:3:"蛙";s:2:"";s:3:"蛚";s:2:"۶";s:3:"蛛";s:2:"";s:3:"蛜";s:2:"ۺ";s:3:"蛝";s:2:"۸";s:3:"蛞";s:2:"";s:3:"蛟";s:2:"";s:3:"蛢";s:2:"۲";s:3:"蛣";s:2:"۵";s:3:"蛤";s:2:"";s:3:"蛦";s:2:"۳";s:3:"蛨";s:2:"۾";s:3:"蛩";s:2:"ۼ";s:3:"蛪";s:2:"۷";s:3:"蛫";s:2:"۹";s:3:"蛬";s:2:"ۻ";s:3:"蛭";s:2:"";s:3:"蛵";s:2:"";s:3:"蛶";s:2:"";s:3:"蛷";s:2:"";s:3:"蛸";s:2:"";s:3:"蛹";s:2:"";s:3:"蛺";s:2:"";s:3:"蛻";s:2:"";s:3:"蛾";s:2:"";s:3:"蜀";s:2:"";s:3:"蜁";s:2:"";s:3:"蜂";s:2:"";s:3:"蜃";s:2:"";s:3:"蜄";s:2:"";s:3:"蜅";s:2:"";s:3:"蜆";s:2:"";s:3:"蜇";s:2:"";s:3:"蜈";s:2:"";s:3:"蜉";s:2:"";s:3:"蜊";s:2:"";s:3:"蜋";s:2:"";s:3:"蜌";s:2:"";s:3:"蜍";s:2:"";s:3:"蜎";s:2:"";s:3:"蜑";s:2:"";s:3:"蜒";s:2:"";s:3:"蜓";s:2:"";s:3:"蜘";s:2:"j";s:3:"蜙";s:2:"";s:3:"蜚";s:2:"";s:3:"蜛";s:2:"";s:3:"蜜";s:2:"e";s:3:"蜞";s:2:"";s:3:"蜠";s:2:"";s:3:"蜡";s:2:"";s:3:"蜢";s:2:"g";s:3:"蜣";s:2:"";s:3:"蜤";s:2:"";s:3:"蜥";s:2:"h";s:3:"蜦";s:2:"";s:3:"蜧";s:2:"";s:3:"蜨";s:2:"";s:3:"蜩";s:2:"m";s:3:"蜪";s:2:"";s:3:"蜬";s:2:"";s:3:"蜭";s:2:"";s:3:"蜮";s:2:"";s:3:"蜰";s:2:"";s:3:"蜱";s:2:"";s:3:"蜲";s:2:"";s:3:"蜳";s:2:"";s:3:"蜴";s:2:"i";s:3:"蜵";s:2:"";s:3:"蜷";s:2:"l";s:3:"蜸";s:2:"";s:3:"蜺";s:2:"";s:3:"蜻";s:2:"f";s:3:"蜼";s:2:"";s:3:"蜾";s:2:"";s:3:"蜿";s:2:"d";s:3:"蝀";s:2:"";s:3:"蝁";s:2:"";s:3:"蝂";s:2:"";s:3:"蝃";s:2:"";s:3:"蝆";s:2:"";s:3:"蝌";s:2:"";s:3:"蝍";s:2:"";s:3:"蝎";s:2:"";s:3:"蝏";s:2:"";s:3:"蝐";s:2:"";s:3:"蝑";s:2:"";s:3:"蝒";s:2:"";s:3:"蝓";s:2:"";s:3:"蝔";s:2:"";s:3:"蝕";s:2:"k";s:3:"蝖";s:2:"";s:3:"蝗";s:2:"";s:3:"蝘";s:2:"";s:3:"蝙";s:2:"";s:3:"蝚";s:2:"";s:3:"蝛";s:2:"";s:3:"蝜";s:2:"";s:3:"蝝";s:2:"";s:3:"蝞";s:2:"";s:3:"蝟";s:2:"";s:3:"蝠";s:2:"";s:3:"蝡";s:2:"";s:3:"蝢";s:2:"";s:3:"蝣";s:2:"";s:3:"蝤";s:2:"";s:3:"蝥";s:2:"";s:3:"蝦";s:2:"";s:3:"蝧";s:2:"";s:3:"蝨";s:2:"";s:3:"蝩";s:2:"";s:3:"蝪";s:2:"";s:3:"蝫";s:2:"";s:3:"蝬";s:2:"";s:3:"蝭";s:2:"";s:3:"蝮";s:2:"";s:3:"蝯";s:2:"";s:3:"蝳";s:2:"";s:3:"蝴";s:2:"";s:3:"蝵";s:2:"";s:3:"蝶";s:2:"";s:3:"蝷";s:2:"";s:3:"蝸";s:2:"";s:3:"蝹";s:2:"d";s:3:"蝺";s:2:"";s:3:"蝻";s:2:"";s:3:"螁";s:2:"a";s:3:"螂";s:2:"";s:3:"螃";s:2:"";s:3:"螄";s:2:"k";s:3:"螅";s:2:"g";s:3:"螇";s:2:"e";s:3:"螈";s:2:"`";s:3:"螉";s:2:"o";s:3:"融";s:2:"";s:3:"螏";s:2:"\";s:3:"螐";s:2:"h";s:3:"螑";s:2:"i";s:3:"螒";s:2:"_";s:3:"螓";s:2:"^";s:3:"螔";s:2:"l";s:3:"螖";s:2:"b";s:3:"螗";s:2:"]";s:3:"螘";s:2:"c";s:3:"螚";s:2:"n";s:3:"螛";s:2:"[";s:3:"螜";s:2:"m";s:3:"螝";s:2:"j";s:3:"螞";s:2:"";s:3:"螟";s:2:"";s:3:"螢";s:2:"";s:3:"螣";s:2:"f";s:3:"螤";s:2:"";s:3:"螪";s:2:"Y";s:3:"螫";s:2:"";s:3:"螬";s:2:"]";s:3:"螭";s:2:"Z";s:3:"螮";s:2:"a";s:3:"螯";s:2:"g";s:3:"螰";s:2:"\";s:3:"螲";s:2:"p";s:3:"螳";s:2:"";s:3:"螴";s:2:"j";s:3:"螵";s:2:"_";s:3:"螶";s:2:"k";s:3:"螷";s:2:"f";s:3:"螸";s:2:"m";s:3:"螹";s:2:"^";s:3:"螺";s:2:"";s:3:"螻";s:2:"";s:3:"螼";s:2:"`";s:3:"螽";s:2:"n";s:3:"螾";s:2:"X";s:3:"螿";s:2:"l";s:3:"蟀";s:2:"";s:3:"蟂";s:2:"d";s:3:"蟃";s:2:"c";s:3:"蟄";s:2:"h";s:3:"蟅";s:2:"[";s:3:"蟆";s:2:"";s:3:"蟈";s:2:"";s:3:"蟉";s:2:"b";s:3:"蟊";s:2:"i";s:3:"蟋";s:2:"";s:3:"蟌";s:2:"e";s:3:"蟑";s:2:"";s:3:"蟒";s:2:"";s:3:"蟓";s:2:"";s:3:"蟔";s:2:"";s:3:"蟗";s:2:"";s:3:"蟘";s:2:"";s:3:"蟙";s:2:"";s:3:"蟛";s:2:"";s:3:"蟜";s:2:"";s:3:"蟝";s:2:"";s:3:"蟞";s:2:"o";s:3:"蟟";s:2:"";s:3:"蟠";s:2:"";s:3:"蟡";s:2:"";s:3:"蟢";s:2:"";s:3:"蟣";s:2:"";s:3:"蟤";s:2:"";s:3:"蟥";s:2:"";s:3:"蟦";s:2:"";s:3:"蟧";s:2:"";s:3:"蟨";s:2:"";s:3:"蟪";s:2:"";s:3:"蟫";s:2:"";s:3:"蟬";s:2:"";s:3:"蟭";s:2:"";s:3:"蟯";s:2:"";s:3:"蟲";s:2:"";s:3:"蟳";s:2:"";s:3:"蟴";s:2:"";s:3:"蟶";s:2:"";s:3:"蟷";s:2:"";s:3:"蟹";s:2:"";s:3:"蟺";s:2:"";s:3:"蟻";s:2:"";s:3:"蟼";s:2:"";s:3:"蟾";s:2:"";s:3:"蟿";s:2:"";s:3:"蠀";s:2:"";s:3:"蠁";s:2:"";s:3:"蠂";s:2:"";s:3:"蠃";s:2:"";s:3:"蠅";s:2:"";s:3:"蠆";s:2:"";s:3:"蠈";s:2:"";s:3:"蠉";s:2:"";s:3:"蠊";s:2:"";s:3:"蠋";s:2:"";s:3:"蠌";s:2:"";s:3:"蠍";s:2:"";s:3:"蠐";s:2:"";s:3:"蠑";s:2:"";s:3:"蠓";s:2:"";s:3:"蠔";s:2:"Į";s:3:"蠕";s:2:"į";s:3:"蠖";s:2:"";s:3:"蠗";s:2:"";s:3:"蠙";s:2:"";s:3:"蠛";s:2:"B";s:3:"蠜";s:2:"E";s:3:"蠝";s:2:"A";s:3:"蠟";s:2:"";s:3:"蠠";s:2:"C";s:3:"蠡";s:2:"";s:3:"蠢";s:2:"";s:3:"蠣";s:2:"";s:3:"蠤";s:2:"D";s:3:"蠥";s:2:"Q";s:3:"蠦";s:2:"O";s:3:"蠨";s:2:"N";s:3:"蠩";s:2:"@";s:3:"蠪";s:2:"P";s:3:"蠫";s:2:"F";s:3:"蠬";s:2:"M";s:3:"蠮";s:2:"";s:3:"蠯";s:2:"";s:3:"蠰";s:2:"";s:3:"蠱";s:2:"";s:3:"蠲";s:2:"";s:3:"蠳";s:2:"";s:3:"蠵";s:2:"";s:3:"蠶";s:2:"";s:3:"蠷";s:2:"";s:3:"蠸";s:2:"";s:3:"蠹";s:2:"";s:3:"蠻";s:2:"Z";s:3:"蠼";s:2:"n";s:3:"蠽";s:2:"";s:3:"蠾";s:2:"";s:3:"蠿";s:2:"";s:3:"血";s:2:"";s:3:"衁";s:2:"Ъ";s:3:"衃";s:2:"";s:3:"衄";s:2:"";s:3:"衈";s:2:"";s:3:"衊";s:2:"G";s:3:"衋";s:2:"";s:3:"行";s:2:"";s:3:"衍";s:2:"l";s:3:"衎";s:2:"Ы";s:3:"衒";s:2:"ױ";s:3:"術";s:2:"N";s:3:"衕";s:2:"";s:3:"衖";s:2:"";s:3:"街";s:2:"";s:3:"衙";s:2:"";s:3:"衚";s:2:"";s:3:"衛";s:2:"";s:3:"衝";s:2:"";s:3:"衡";s:2:"";s:3:"衢";s:2:"";s:3:"衣";s:2:"";s:3:"衧";s:2:"Ь";s:3:"表";s:2:"";s:3:"衩";s:2:"Ю";s:3:"衪";s:2:"Э";s:3:"衫";s:2:"m";s:3:"衭";s:2:"";s:3:"衯";s:2:"";s:3:"衰";s:2:"I";s:3:"衱";s:2:"";s:3:"衲";s:2:"";s:3:"衴";s:2:"";s:3:"衵";s:2:"";s:3:"衶";s:2:"";s:3:"衷";s:2:"J";s:3:"衹";s:2:"N";s:3:"衼";s:2:"";s:3:"衽";s:2:"M";s:3:"衾";s:2:"";s:3:"衿";s:2:"";s:3:"袀";s:2:"";s:3:"袁";s:2:"K";s:3:"袂";s:2:"L";s:3:"袃";s:2:"";s:3:"袈";s:2:"P";s:3:"袉";s:2:"ײ";s:3:"袋";s:2:"U";s:3:"袌";s:2:"";s:3:"袍";s:2:"T";s:3:"袎";s:2:"";s:3:"袑";s:2:"׸";s:3:"袒";s:2:"R";s:3:"袓";s:2:"";s:3:"袕";s:2:"׳";s:3:"袖";s:2:"S";s:3:"袗";s:2:"׿";s:3:"袘";s:2:"׻";s:3:"袙";s:2:"׽";s:3:"袚";s:2:"׷";s:3:"袛";s:2:"׾";s:3:"袞";s:2:"O";s:3:"袟";s:2:"׺";s:3:"袡";s:2:"׹";s:3:"袢";s:2:"׵";s:3:"袤";s:2:"";s:3:"袧";s:2:"׼";s:3:"袨";s:2:"״";s:3:"袪";s:2:"׶";s:3:"被";s:2:"Q";s:3:"袬";s:2:"";s:3:"袱";s:2:"";s:3:"袲";s:2:"";s:3:"袶";s:2:"";s:3:"袷";s:2:"";s:3:"袸";s:2:"";s:3:"袹";s:2:"";s:3:"袺";s:2:"";s:3:"袼";s:2:"";s:3:"袽";s:2:"";s:3:"袾";s:2:"";s:3:"裀";s:2:"";s:3:"裁";s:2:"";s:3:"裂";s:2:"";s:3:"裉";s:2:"";s:3:"裊";s:2:"";s:3:"裋";s:2:"";s:3:"裌";s:2:"";s:3:"裍";s:2:"";s:3:"裎";s:2:"";s:3:"裏";s:2:"";s:3:"裐";s:2:"";s:3:"裒";s:2:"";s:3:"裔";s:2:"";s:3:"裕";s:2:"";s:3:"裖";s:2:"";s:3:"裗";s:2:"";s:3:"裘";s:2:"";s:3:"裙";s:2:"";s:3:"裚";s:2:"";s:3:"裛";s:2:"";s:3:"補";s:2:"";s:3:"裝";s:2:"";s:3:"裞";s:2:"";s:3:"裟";s:2:"";s:3:"裡";s:2:"";s:3:"裧";s:2:"";s:3:"裨";s:2:"t";s:3:"裫";s:2:"B";s:3:"裬";s:2:"A";s:3:"裮";s:2:"";s:3:"裯";s:2:"v";s:3:"裰";s:2:"@";s:3:"裱";s:2:"";s:3:"裲";s:2:"";s:3:"裳";s:2:"n";s:3:"裴";s:2:"p";s:3:"裶";s:2:"";s:3:"裷";s:2:"";s:3:"裸";s:2:"r";s:3:"裹";s:2:"q";s:3:"裺";s:2:"";s:3:"裻";s:2:"";s:3:"裼";s:2:"";s:3:"製";s:2:"s";s:3:"裾";s:2:"";s:3:"褁";s:2:"";s:3:"褂";s:2:"o";s:3:"褅";s:2:"";s:3:"褆";s:2:"";s:3:"複";s:2:"";s:3:"褉";s:2:"";s:3:"褊";s:2:"";s:3:"褋";s:2:"";s:3:"褌";s:2:"";s:3:"褎";s:2:"";s:3:"褐";s:2:"";s:3:"褑";s:2:"";s:3:"褒";s:2:"";s:3:"褓";s:2:"";s:3:"褔";s:2:"";s:3:"褕";s:2:"";s:3:"褖";s:2:"";s:3:"褗";s:2:"";s:3:"褘";s:2:"";s:3:"褙";s:2:"";s:3:"褚";s:2:"u";s:3:"褞";s:2:"p";s:3:"褟";s:2:"|";s:3:"褡";s:2:"";s:3:"褢";s:2:"w";s:3:"褣";s:2:"y";s:3:"褥";s:2:"";s:3:"褦";s:2:"q";s:3:"褧";s:2:"u";s:3:"褩";s:2:"x";s:3:"褪";s:2:"";s:3:"褫";s:2:"";s:3:"褬";s:2:"{";s:3:"褭";s:2:"s";s:3:"褮";s:2:"t";s:3:"褯";s:2:"z";s:3:"褰";s:2:"r";s:3:"褱";s:2:"v";s:3:"褲";s:2:"";s:3:"褳";s:2:"r";s:3:"褵";s:2:"q";s:3:"褶";s:2:"";s:3:"褷";s:2:"w";s:3:"褸";s:2:"";s:3:"褻";s:2:"";s:3:"褼";s:2:"s";s:3:"褽";s:2:"";s:3:"褾";s:2:"t";s:3:"襁";s:2:"u";s:3:"襂";s:2:"x";s:3:"襄";s:2:"";s:3:"襆";s:2:"";s:3:"襉";s:2:"";s:3:"襋";s:2:"";s:3:"襌";s:2:"";s:3:"襏";s:2:"";s:3:"襐";s:2:"";s:3:"襑";s:2:"";s:3:"襒";s:2:"v";s:3:"襓";s:2:"";s:3:"襖";s:2:"";s:3:"襗";s:2:"";s:3:"襘";s:2:"";s:3:"襙";s:2:"";s:3:"襚";s:2:"";s:3:"襛";s:2:"";s:3:"襜";s:2:"";s:3:"襝";s:2:"";s:3:"襞";s:2:"";s:3:"襟";s:2:"";s:3:"襠";s:2:"";s:3:"襡";s:2:"";s:3:"襢";s:2:"";s:3:"襣";s:2:"";s:3:"襤";s:2:"İ";s:3:"襦";s:2:"";s:3:"襩";s:2:"I";s:3:"襪";s:2:"";s:3:"襫";s:2:"K";s:3:"襬";s:2:"";s:3:"襭";s:2:"H";s:3:"襮";s:2:"J";s:3:"襯";s:2:"Ũ";s:3:"襱";s:2:"R";s:3:"襲";s:2:"ŧ";s:3:"襳";s:2:"";s:3:"襴";s:2:"";s:3:"襶";s:2:"";s:3:"襹";s:2:"H";s:3:"襺";s:2:"I";s:3:"襻";s:2:"K";s:3:"襼";s:2:"J";s:3:"襾";s:2:"P";s:3:"西";s:2:"";s:3:"要";s:2:"n";s:3:"覂";s:2:"";s:3:"覃";s:2:"";s:3:"覅";s:2:"";s:3:"覆";s:2:"";s:3:"覈";s:2:"";s:3:"見";s:2:"";s:3:"規";s:2:"W";s:3:"覓";s:2:"V";s:3:"覕";s:2:"";s:3:"視";s:2:"";s:3:"覗";s:2:"";s:3:"覘";s:2:"";s:3:"覛";s:2:"";s:3:"覜";s:2:"";s:3:"覝";s:2:"C";s:3:"覞";s:2:"F";s:3:"覟";s:2:"E";s:3:"覡";s:2:"D";s:3:"覢";s:2:"";s:3:"覣";s:2:"";s:3:"覤";s:2:"";s:3:"覦";s:2:"";s:3:"親";s:2:"";s:3:"覬";s:2:"";s:3:"覭";s:2:"y";s:3:"覮";s:2:"{";s:3:"覯";s:2:"z";s:3:"覲";s:2:"";s:3:"覶";s:2:"";s:3:"覷";s:2:"";s:3:"覹";s:2:"";s:3:"覺";s:2:"ı";s:3:"覽";s:2:"";s:3:"覾";s:2:"T";s:3:"覿";s:2:"S";s:3:"觀";s:2:"[";s:3:"角";s:2:"";s:3:"觓";s:2:"Я";s:3:"觔";s:2:"o";s:3:"觕";s:2:"";s:3:"觖";s:2:"";s:3:"觙";s:2:"";s:3:"觚";s:2:"";s:3:"觛";s:2:"";s:3:"觜";s:2:"C";s:3:"觝";s:2:"";s:3:"觟";s:2:"";s:3:"觠";s:2:"A";s:3:"觡";s:2:"@";s:3:"觢";s:2:"B";s:3:"解";s:2:"";s:3:"觤";s:2:"";s:3:"觥";s:2:"";s:3:"触";s:2:"D";s:3:"觨";s:2:"I";s:3:"觩";s:2:"G";s:3:"觫";s:2:"H";s:3:"觬";s:2:"";s:3:"觭";s:2:"";s:3:"觰";s:2:"";s:3:"觱";s:2:"}";s:3:"觲";s:2:"|";s:3:"觳";s:2:"}";s:3:"觴";s:2:"";s:3:"觶";s:2:"";s:3:"觷";s:2:"";s:3:"觸";s:2:"Ĳ";s:3:"觺";s:2:"L";s:3:"觻";s:2:"U";s:3:"觼";s:2:"ũ";s:3:"觾";s:2:"";s:3:"觿";s:2:"L";s:3:"言";s:2:"";s:3:"訂";s:2:"q";s:3:"訃";s:2:"r";s:3:"訄";s:2:"а";s:3:"訇";s:2:"б";s:3:"計";s:2:"p";s:3:"訊";s:2:"T";s:3:"訌";s:2:"R";s:3:"討";s:2:"Q";s:3:"訏";s:2:"X";s:3:"訐";s:2:"P";s:3:"訑";s:2:"Y";s:3:"訒";s:2:"";s:3:"訓";s:2:"V";s:3:"訕";s:2:"S";s:3:"訖";s:2:"W";s:3:"託";s:2:"U";s:3:"記";s:2:"O";s:3:"訛";s:2:"_";s:3:"訝";s:2:"Y";s:3:"訞";s:2:"";s:3:"訟";s:2:"^";s:3:"訢";s:2:"`";s:3:"訣";s:2:"Z";s:3:"訥";s:2:"[";s:3:"訧";s:2:"";s:3:"訪";s:2:"X";s:3:"訬";s:2:"";s:3:"設";s:2:"]";s:3:"訰";s:2:"";s:3:"許";s:2:"\";s:3:"訴";s:2:"D";s:3:"訶";s:2:"F";s:3:"訹";s:2:"";s:3:"診";s:2:"E";s:3:"註";s:2:"";s:3:"証";s:2:"";s:3:"訾";s:2:"";s:3:"訿";s:2:"I";s:3:"詀";s:2:"";s:3:"詁";s:2:"";s:3:"詄";s:2:"";s:3:"詅";s:2:"";s:3:"詆";s:2:"C";s:3:"詈";s:2:"";s:3:"詊";s:2:"";s:3:"詌";s:2:"";s:3:"詍";s:2:"";s:3:"詎";s:2:"";s:3:"詏";s:2:"";s:3:"詐";s:2:"B";s:3:"詑";s:2:"";s:3:"詒";s:2:"";s:3:"詔";s:2:"@";s:3:"評";s:2:"";s:3:"詖";s:2:"G";s:3:"詗";s:2:"";s:3:"詘";s:2:"";s:3:"詙";s:2:"";s:3:"詛";s:2:"A";s:3:"詞";s:2:"";s:3:"詠";s:2:"";s:3:"詡";s:2:"H";s:3:"詢";s:2:"";s:3:"詣";s:2:"";s:3:"試";s:2:"";s:3:"詨";s:2:"";s:3:"詩";s:2:"";s:3:"詫";s:2:"";s:3:"詬";s:2:"";s:3:"詭";s:2:"";s:3:"詮";s:2:"";s:3:"詰";s:2:"";s:3:"話";s:2:"";s:3:"該";s:2:"";s:3:"詳";s:2:"";s:3:"詴";s:2:"P";s:3:"詵";s:2:"M";s:3:"詶";s:2:"E";s:3:"詷";s:2:"J";s:3:"詹";s:2:"";s:3:"詺";s:2:"Q";s:3:"詻";s:2:"";s:3:"詼";s:2:"";s:3:"詿";s:2:"G";s:3:"誁";s:2:"O";s:3:"誂";s:2:"K";s:3:"誃";s:2:"N";s:3:"誄";s:2:"L";s:3:"誅";s:2:"";s:3:"誆";s:2:"F";s:3:"誇";s:2:"";s:3:"誋";s:2:"L";s:3:"誌";s:2:"x";s:3:"認";s:2:"{";s:3:"誏";s:2:"N";s:3:"誑";s:2:"";s:3:"誒";s:2:"M";s:3:"誓";s:2:"}";s:3:"誕";s:2:"";s:3:"誖";s:2:"O";s:3:"誘";s:2:"";s:3:"誙";s:2:"K";s:3:"誚";s:2:"";s:3:"語";s:2:"y";s:3:"誠";s:2:"";s:3:"誡";s:2:"|";s:3:"誣";s:2:"z";s:3:"誤";s:2:"~";s:3:"誥";s:2:"";s:3:"誦";s:2:"w";s:3:"誧";s:2:"";s:3:"誨";s:2:"";s:3:"說";s:2:"";s:3:"誫";s:2:"J";s:3:"誰";s:2:"";s:3:"課";s:2:"";s:3:"誶";s:2:"";s:3:"誸";s:2:"";s:3:"誹";s:2:"";s:3:"誺";s:2:"";s:3:"誻";s:2:"";s:3:"誼";s:2:"";s:3:"誽";s:2:"";s:3:"誾";s:2:"";s:3:"調";s:2:"";s:3:"諀";s:2:"";s:3:"諂";s:2:"";s:3:"諃";s:2:"";s:3:"諄";s:2:"";s:3:"諅";s:2:"";s:3:"諆";s:2:"";s:3:"談";s:2:"";s:3:"諈";s:2:"";s:3:"諉";s:2:"";s:3:"請";s:2:"";s:3:"諍";s:2:"";s:3:"諏";s:2:"";s:3:"諑";s:2:"";s:3:"諒";s:2:"";s:3:"諓";s:2:"";s:3:"諔";s:2:"";s:3:"諕";s:2:"";s:3:"論";s:2:"";s:3:"諗";s:2:"";s:3:"諘";s:2:"";s:3:"諙";s:2:"";s:3:"諛";s:2:"";s:3:"諜";s:2:"";s:3:"諝";s:2:"";s:3:"諞";s:2:"";s:3:"諟";s:2:"";s:3:"諠";s:2:"~";s:3:"諡";s:2:"";s:3:"諢";s:2:"";s:3:"諤";s:2:"";s:3:"諦";s:2:"";s:3:"諧";s:2:"";s:3:"諨";s:2:"";s:3:"諫";s:2:"";s:3:"諭";s:2:"";s:3:"諮";s:2:"";s:3:"諯";s:2:"";s:3:"諰";s:2:"";s:3:"諱";s:2:"";s:3:"諲";s:2:"";s:3:"諳";s:2:"";s:3:"諴";s:2:"";s:3:"諵";s:2:"";s:3:"諶";s:2:"";s:3:"諷";s:2:"";s:3:"諸";s:2:"";s:3:"諺";s:2:"";s:3:"諻";s:2:"";s:3:"諼";s:2:"";s:3:"諾";s:2:"";s:3:"諿";s:2:"";s:3:"謀";s:2:"";s:3:"謁";s:2:"";s:3:"謂";s:2:"";s:3:"謄";s:2:"";s:3:"謅";s:2:"";s:3:"謆";s:2:"";s:3:"謇";s:2:"";s:3:"謈";s:2:"";s:3:"謊";s:2:"";s:3:"謋";s:2:"";s:3:"謍";s:2:"";s:3:"謎";s:2:"";s:3:"謏";s:2:"";s:3:"謐";s:2:"";s:3:"謑";s:2:"";s:3:"謒";s:2:"";s:3:"謓";s:2:"";s:3:"謔";s:2:"";s:3:"謕";s:2:"";s:3:"謖";s:2:"";s:3:"謗";s:2:"";s:3:"謘";s:2:"";s:3:"謙";s:2:"";s:3:"謚";s:2:"";s:3:"講";s:2:"";s:3:"謜";s:2:"";s:3:"謝";s:2:"";s:3:"謞";s:2:"~";s:3:"謠";s:2:"";s:3:"謢";s:2:"";s:3:"謣";s:2:"";s:3:"謤";s:2:"";s:3:"謥";s:2:"";s:3:"謦";s:2:"";s:3:"謧";s:2:"";s:3:"謨";s:2:"";s:3:"謪";s:2:"";s:3:"謫";s:2:"";s:3:"謬";s:2:"";s:3:"謮";s:2:"";s:3:"謯";s:2:"";s:3:"謰";s:2:"";s:3:"謱";s:2:"";s:3:"謳";s:2:"";s:3:"謵";s:2:"";s:3:"謶";s:2:"";s:3:"謷";s:2:"";s:3:"謹";s:2:"";s:3:"謺";s:2:"";s:3:"謻";s:2:"";s:3:"謼";s:2:"";s:3:"謽";s:2:"";s:3:"謾";s:2:"";s:3:"譀";s:2:"";s:3:"譁";s:2:"";s:3:"譂";s:2:"A";s:3:"譅";s:2:"O";s:3:"譆";s:2:"";s:3:"譇";s:2:"";s:3:"譈";s:2:"";s:3:"證";s:2:"";s:3:"譊";s:2:"";s:3:"譋";s:2:"";s:3:"譎";s:2:"";s:3:"譏";s:2:"";s:3:"譐";s:2:"";s:3:"譑";s:2:"@";s:3:"譒";s:2:"B";s:3:"譓";s:2:"";s:3:"譔";s:2:"";s:3:"譕";s:2:"";s:3:"譖";s:2:"";s:3:"譗";s:2:"C";s:3:"識";s:2:"";s:3:"譙";s:2:"";s:3:"譚";s:2:"";s:3:"譜";s:2:"";s:3:"譝";s:2:"";s:3:"譟";s:2:"ķ";s:3:"譠";s:2:"";s:3:"譣";s:2:"";s:3:"譥";s:2:"";s:3:"警";s:2:"ĵ";s:3:"譧";s:2:"";s:3:"譨";s:2:"";s:3:"譪";s:2:"";s:3:"譫";s:2:"ĸ";s:3:"譬";s:2:"Ĵ";s:3:"譭";s:2:"";s:3:"譯";s:2:"Ķ";s:3:"議";s:2:"ĳ";s:3:"譴";s:2:"";s:3:"護";s:2:"@";s:3:"譸";s:2:"N";s:3:"譹";s:2:"M";s:3:"譺";s:2:"P";s:3:"譻";s:2:"Q";s:3:"譽";s:2:"A";s:3:"譾";s:2:"V";s:3:"譿";s:2:"[";s:3:"讀";s:2:"Ū";s:3:"讂";s:2:"X";s:3:"讄";s:2:"W";s:3:"讅";s:2:"Z";s:3:"讆";s:2:"Y";s:3:"讈";s:2:"C";s:3:"變";s:2:"";s:3:"讋";s:2:"B";s:3:"讌";s:2:"@";s:3:"讎";s:2:"A";s:3:"讒";s:2:"";s:3:"讓";s:2:"";s:3:"讔";s:2:"";s:3:"讕";s:2:"";s:3:"讖";s:2:"@";s:3:"讘";s:2:"M";s:3:"讙";s:2:"N";s:3:"讚";s:2:"g";s:3:"讜";s:2:"m";s:3:"讞";s:2:"";s:3:"讟";s:2:"";s:3:"谷";s:2:"";s:3:"谹";s:2:"";s:3:"谻";s:2:"";s:3:"谼";s:2:"R";s:3:"谽";s:2:"P";s:3:"谾";s:2:"";s:3:"谿";s:2:"";s:3:"豁";s:2:"";s:3:"豂";s:2:"";s:3:"豃";s:2:"D";s:3:"豅";s:2:"D";s:3:"豆";s:2:"";s:3:"豇";s:2:"";s:3:"豈";s:2:"Z";s:3:"豉";s:2:"a";s:3:"豊";s:2:"T";s:3:"豋";s:2:"S";s:3:"豌";s:2:"";s:3:"豍";s:2:"";s:3:"豎";s:2:"";s:3:"豏";s:2:"";s:3:"豐";s:2:"";s:3:"豔";s:2:"v";s:3:"豕";s:2:"";s:3:"豖";s:2:"";s:3:"豗";s:2:"";s:3:"豚";s:2:"b";s:3:"豜";s:2:"";s:3:"豝";s:2:"";s:3:"豟";s:2:"";s:3:"象";s:2:"H";s:3:"豢";s:2:"";s:3:"豤";s:2:"V";s:3:"豥";s:2:"U";s:3:"豦";s:2:"W";s:3:"豨";s:2:"Q";s:3:"豩";s:2:"R";s:3:"豪";s:2:"";s:3:"豫";s:2:"";s:3:"豬";s:2:"";s:3:"豭";s:2:"";s:3:"豯";s:2:"";s:3:"豰";s:2:"";s:3:"豱";s:2:"";s:3:"豲";s:2:"";s:3:"豳";s:2:"";s:3:"豵";s:2:"";s:3:"豶";s:2:"F";s:3:"豷";s:2:"E";s:3:"豸";s:2:"ˤ";s:3:"豹";s:2:"\";s:3:"豺";s:2:"[";s:3:"豻";s:2:"";s:3:"豽";s:2:"";s:3:"貀";s:2:"";s:3:"貁";s:2:"";s:3:"貂";s:2:"I";s:3:"貄";s:2:"Y";s:3:"貅";s:2:"Z";s:3:"貆";s:2:"X";s:3:"貉";s:2:"";s:3:"貊";s:2:"";s:3:"貌";s:2:"";s:3:"貍";s:2:"";s:3:"貏";s:2:"";s:3:"貐";s:2:"";s:3:"貑";s:2:"";s:3:"貒";s:2:"";s:3:"貓";s:2:"";s:3:"貔";s:2:"";s:3:"貕";s:2:"";s:3:"貗";s:2:"";s:3:"貘";s:2:"";s:3:"貙";s:2:"";s:3:"貚";s:2:"G";s:3:"貜";s:2:"";s:3:"貝";s:2:"";s:3:"貞";s:2:"s";s:3:"負";s:2:"t";s:3:"財";s:2:"]";s:3:"貢";s:2:"^";s:3:"貣";s:2:"";s:3:"貤";s:2:"";s:3:"貥";s:2:"";s:3:"貧";s:2:"h";s:3:"貨";s:2:"f";s:3:"販";s:2:"c";s:3:"貪";s:2:"g";s:3:"貫";s:2:"e";s:3:"責";s:2:"d";s:3:"貯";s:2:"J";s:3:"貰";s:2:"";s:3:"貲";s:2:"";s:3:"貳";s:2:"L";s:3:"貴";s:2:"Q";s:3:"貵";s:2:"";s:3:"貶";s:2:"S";s:3:"買";s:2:"R";s:3:"貸";s:2:"U";s:3:"貹";s:2:"";s:3:"貺";s:2:"";s:3:"費";s:2:"O";s:3:"貼";s:2:"K";s:3:"貽";s:2:"M";s:3:"貾";s:2:"";s:3:"貿";s:2:"T";s:3:"賀";s:2:"P";s:3:"賁";s:2:"N";s:3:"賂";s:2:"";s:3:"賃";s:2:"";s:3:"賄";s:2:"";s:3:"賅";s:2:"";s:3:"資";s:2:"";s:3:"賈";s:2:"";s:3:"賊";s:2:"";s:3:"賌";s:2:"[";s:3:"賏";s:2:"T";s:3:"賑";s:2:"";s:3:"賒";s:2:"";s:3:"賓";s:2:"";s:3:"賕";s:2:"S";s:3:"賗";s:2:"U";s:3:"賙";s:2:"";s:3:"賚";s:2:"";s:3:"賜";s:2:"";s:3:"賝";s:2:"";s:3:"賞";s:2:"";s:3:"賟";s:2:"";s:3:"賠";s:2:"";s:3:"賡";s:2:"";s:3:"賢";s:2:"";s:3:"賣";s:2:"";s:3:"賤";s:2:"";s:3:"賥";s:2:"";s:3:"賦";s:2:"";s:3:"賧";s:2:"";s:3:"賨";s:2:"";s:3:"質";s:2:"";s:3:"賬";s:2:"";s:3:"賭";s:2:"";s:3:"賮";s:2:"";s:3:"賰";s:2:"";s:3:"賱";s:2:"";s:3:"賳";s:2:"";s:3:"賴";s:2:"";s:3:"賵";s:2:"";s:3:"賸";s:2:"";s:3:"賹";s:2:"";s:3:"賺";s:2:"";s:3:"賻";s:2:"";s:3:"購";s:2:"";s:3:"賽";s:2:"";s:3:"賾";s:2:"";s:3:"贀";s:2:"";s:3:"贂";s:2:"";s:3:"贄";s:2:"";s:3:"贅";s:2:"";s:3:"贆";s:2:"H";s:3:"贇";s:2:"I";s:3:"贈";s:2:"";s:3:"贉";s:2:"J";s:3:"贊";s:2:"";s:3:"贍";s:2:"ĺ";s:3:"贏";s:2:"Ĺ";s:3:"贐";s:2:"R";s:3:"贓";s:2:"B";s:3:"贔";s:2:"S";s:3:"贕";s:2:"\";s:3:"贖";s:2:"ū";s:3:"贗";s:2:"Ŭ";s:3:"贙";s:2:"E";s:3:"贛";s:2:"B";s:3:"赤";s:2:"";s:3:"赦";s:2:"j";s:3:"赧";s:2:"i";s:3:"赨";s:2:"\";s:3:"赩";s:2:"]";s:3:"赫";s:2:"";s:3:"赬";s:2:"";s:3:"赭";s:2:"";s:3:"赮";s:2:"";s:3:"赯";s:2:"";s:3:"走";s:2:"";s:3:"赲";s:2:"в";s:3:"赳";s:2:"v";s:3:"赴";s:2:"u";s:3:"赶";s:2:"";s:3:"起";s:2:"_";s:3:"赸";s:2:"";s:3:"赹";s:2:"";s:3:"赻";s:2:"";s:3:"赽";s:2:"";s:3:"趀";s:2:"";s:3:"趁";s:2:"X";s:3:"趄";s:2:"";s:3:"超";s:2:"W";s:3:"趉";s:2:"";s:3:"越";s:2:"V";s:3:"趌";s:2:"_";s:3:"趍";s:2:"b";s:3:"趎";s:2:"`";s:3:"趏";s:2:"a";s:3:"趐";s:2:"e";s:3:"趑";s:2:"^";s:3:"趒";s:2:"f";s:3:"趓";s:2:"c";s:3:"趔";s:2:"d";s:3:"趕";s:2:"";s:3:"趖";s:2:"V";s:3:"趙";s:2:"";s:3:"趛";s:2:"";s:3:"趜";s:2:"";s:3:"趟";s:2:"";s:3:"趠";s:2:"";s:3:"趡";s:2:"";s:3:"趣";s:2:"";s:3:"趥";s:2:"";s:3:"趧";s:2:"";s:3:"趨";s:2:"";s:3:"趪";s:2:"L";s:3:"趫";s:2:"N";s:3:"趬";s:2:"K";s:3:"趭";s:2:"M";s:3:"趮";s:2:"";s:3:"趯";s:2:"T";s:3:"趲";s:2:"o";s:3:"足";s:2:"";s:3:"趴";s:2:"w";s:3:"趵";s:2:"";s:3:"趶";s:2:"";s:3:"趷";s:2:"";s:3:"趹";s:2:"";s:3:"趺";s:2:"l";s:3:"趼";s:2:"";s:3:"趾";s:2:"k";s:3:"趿";s:2:"";s:3:"跁";s:2:"";s:3:"跂";s:2:"";s:3:"跅";s:2:"";s:3:"跆";s:2:"`";s:3:"跇";s:2:"";s:3:"跈";s:2:"";s:3:"跋";s:2:"[";s:3:"跌";s:2:"^";s:3:"跍";s:2:"";s:3:"跎";s:2:"Y";s:3:"跏";s:2:"";s:3:"跐";s:2:"l";s:3:"跑";s:2:"]";s:3:"跓";s:2:"";s:3:"跕";s:2:"";s:3:"跖";s:2:"";s:3:"跗";s:2:"";s:3:"跘";s:2:"";s:3:"跙";s:2:"";s:3:"跚";s:2:"\";s:3:"跛";s:2:"_";s:3:"跜";s:2:"";s:3:"距";s:2:"Z";s:3:"跟";s:2:"";s:3:"跠";s:2:"h";s:3:"跡";s:2:"";s:3:"跢";s:2:"o";s:3:"跣";s:2:"n";s:3:"跤";s:2:"";s:3:"跦";s:2:"";s:3:"跧";s:2:"p";s:3:"跨";s:2:"";s:3:"跩";s:2:"m";s:3:"跪";s:2:"";s:3:"跫";s:2:"r";s:3:"跬";s:2:"i";s:3:"跮";s:2:"k";s:3:"路";s:2:"";s:3:"跰";s:2:"g";s:3:"跱";s:2:"j";s:3:"跲";s:2:"q";s:3:"跳";s:2:"";s:3:"跴";s:2:"s";s:3:"跺";s:2:"";s:3:"跼";s:2:"";s:3:"跽";s:2:"[";s:3:"跾";s:2:"a";s:3:"跿";s:2:"Y";s:3:"踀";s:2:"b";s:3:"踂";s:2:"X";s:3:"踃";s:2:"]";s:3:"踄";s:2:"c";s:3:"踅";s:2:"`";s:3:"踆";s:2:"_";s:3:"踇";s:2:"^";s:3:"踉";s:2:"W";s:3:"踊";s:2:"\";s:3:"踍";s:2:"Z";s:3:"踏";s:2:"";s:3:"踐";s:2:"";s:3:"踑";s:2:"";s:3:"踒";s:2:"A";s:3:"踓";s:2:"C";s:3:"踔";s:2:"@";s:3:"踕";s:2:"";s:3:"踖";s:2:"";s:3:"踗";s:2:"E";s:3:"踘";s:2:"B";s:3:"踙";s:2:"";s:3:"踚";s:2:"F";s:3:"踛";s:2:"";s:3:"踜";s:2:"D";s:3:"踝";s:2:"";s:3:"踞";s:2:"";s:3:"踟";s:2:"";s:3:"踠";s:2:"";s:3:"踡";s:2:"";s:3:"踢";s:2:"";s:3:"踣";s:2:"";s:3:"踤";s:2:"";s:3:"踥";s:2:"";s:3:"踦";s:2:"";s:3:"踧";s:2:"";s:3:"踩";s:2:"";s:3:"踫";s:2:"";s:3:"踮";s:2:"";s:3:"踰";s:2:"";s:3:"踱";s:2:"";s:3:"踳";s:2:"";s:3:"踴";s:2:"";s:3:"踵";s:2:"";s:3:"踶";s:2:"";s:3:"踸";s:2:"";s:3:"踹";s:2:"";s:3:"踼";s:2:"";s:3:"踽";s:2:"";s:3:"踾";s:2:"";s:3:"踿";s:2:"";s:3:"蹀";s:2:"";s:3:"蹁";s:2:"";s:3:"蹂";s:2:"";s:3:"蹄";s:2:"";s:3:"蹅";s:2:"";s:3:"蹇";s:2:"";s:3:"蹈";s:2:"";s:3:"蹉";s:2:"";s:3:"蹊";s:2:"";s:3:"蹋";s:2:"";s:3:"蹌";s:2:"";s:3:"蹍";s:2:"";s:3:"蹎";s:2:"";s:3:"蹐";s:2:"";s:3:"蹓";s:2:"";s:3:"蹔";s:2:"E";s:3:"蹕";s:2:"";s:3:"蹖";s:2:"";s:3:"蹗";s:2:"";s:3:"蹙";s:2:"";s:3:"蹚";s:2:"A";s:3:"蹛";s:2:"@";s:3:"蹜";s:2:"";s:3:"蹝";s:2:"C";s:3:"蹞";s:2:"";s:3:"蹟";s:2:"";s:3:"蹠";s:2:"";s:3:"蹡";s:2:"B";s:3:"蹢";s:2:"";s:3:"蹣";s:2:"";s:3:"蹤";s:2:"";s:3:"蹥";s:2:"";s:3:"蹦";s:2:"";s:3:"蹧";s:2:"";s:3:"蹩";s:2:"D";s:3:"蹪";s:2:"R";s:3:"蹬";s:2:"";s:3:"蹭";s:2:"O";s:3:"蹯";s:2:"S";s:3:"蹲";s:2:"";s:3:"蹳";s:2:"Q";s:3:"蹴";s:2:"";s:3:"蹶";s:2:"";s:3:"蹸";s:2:"P";s:3:"蹺";s:2:"";s:3:"蹻";s:2:"T";s:3:"蹼";s:2:"";s:3:"躁";s:2:"ļ";s:3:"躂";s:2:"ľ";s:3:"躄";s:2:"";s:3:"躅";s:2:"Ľ";s:3:"躆";s:2:"";s:3:"躇";s:2:"";s:3:"躈";s:2:"";s:3:"躉";s:2:"Ļ";s:3:"躊";s:2:"C";s:3:"躋";s:2:"E";s:3:"躌";s:2:"V";s:3:"躍";s:2:"D";s:3:"躎";s:2:"U";s:3:"躐";s:2:"a";s:3:"躑";s:2:"ŭ";s:3:"躒";s:2:"`";s:3:"躓";s:2:"Ů";s:3:"躔";s:2:"^";s:3:"躕";s:2:"]";s:3:"躖";s:2:"b";s:3:"躗";s:2:"c";s:3:"躘";s:2:"F";s:3:"躚";s:2:"_";s:3:"躝";s:2:"";s:3:"躞";s:2:"";s:3:"躟";s:2:"";s:3:"躠";s:2:"";s:3:"躡";s:2:"\";s:3:"躣";s:2:"Q";s:3:"躤";s:2:"P";s:3:"躥";s:2:"O";s:3:"躦";s:2:"p";s:3:"躨";s:2:"";s:3:"躩";s:2:"";s:3:"躪";s:2:"n";s:3:"身";s:2:"";s:3:"躬";s:2:"`";s:3:"躲";s:2:"";s:3:"躺";s:2:"";s:3:"躽";s:2:"";s:3:"軀";s:2:"";s:3:"軂";s:2:"U";s:3:"軉";s:2:"";s:3:"車";s:2:"";s:3:"軋";s:2:"";s:3:"軌";s:2:"y";s:3:"軍";s:2:"x";s:3:"軏";s:2:"c";s:3:"軑";s:2:"";s:3:"軒";s:2:"a";s:3:"軓";s:2:"";s:3:"軔";s:2:"b";s:3:"軗";s:2:"";s:3:"軘";s:2:"";s:3:"軛";s:2:"m";s:3:"軜";s:2:"";s:3:"軝";s:2:"";s:3:"軞";s:2:"";s:3:"軟";s:2:"n";s:3:"軠";s:2:"";s:3:"軡";s:2:"";s:3:"軥";s:2:"C";s:3:"軦";s:2:"A";s:3:"軧";s:2:"E";s:3:"軨";s:2:"F";s:3:"軩";s:2:"L";s:3:"軫";s:2:"H";s:3:"軬";s:2:"J";s:3:"軮";s:2:"B";s:3:"軯";s:2:"";s:3:"軱";s:2:"I";s:3:"軴";s:2:"K";s:3:"軵";s:2:"D";s:3:"軶";s:2:"G";s:3:"軷";s:2:"";s:3:"軸";s:2:"b";s:3:"軹";s:2:"@";s:3:"軺";s:2:"";s:3:"軻";s:2:"a";s:3:"軼";s:2:"c";s:3:"軾";s:2:"";s:3:"軿";s:2:"u";s:3:"輀";s:2:"w";s:3:"輁";s:2:"v";s:3:"輂";s:2:"{";s:3:"較";s:2:"";s:3:"輅";s:2:"x";s:3:"輆";s:2:"t";s:3:"輇";s:2:"y";s:3:"輈";s:2:"z";s:3:"載";s:2:"";s:3:"輊";s:2:"";s:3:"輋";s:2:"|";s:3:"輍";s:2:"g";s:3:"輎";s:2:"f";s:3:"輐";s:2:"d";s:3:"輑";s:2:"e";s:3:"輒";s:2:"";s:3:"輓";s:2:"";s:3:"輔";s:2:"";s:3:"輕";s:2:"";s:3:"輖";s:2:"M";s:3:"輗";s:2:"N";s:3:"輘";s:2:"I";s:3:"輚";s:2:"J";s:3:"輛";s:2:"";s:3:"輜";s:2:"";s:3:"輝";s:2:"";s:3:"輞";s:2:"";s:3:"輟";s:2:"";s:3:"輠";s:2:"K";s:3:"輣";s:2:"L";s:3:"輤";s:2:"H";s:3:"輥";s:2:"@";s:3:"輦";s:2:"";s:3:"輩";s:2:"";s:3:"輪";s:2:"";s:3:"輬";s:2:"G";s:3:"輮";s:2:"";s:3:"輯";s:2:"";s:3:"輲";s:2:"";s:3:"輳";s:2:"";s:3:"輴";s:2:"";s:3:"輵";s:2:"";s:3:"輶";s:2:"";s:3:"輷";s:2:"";s:3:"輸";s:2:"";s:3:"輹";s:2:"";s:3:"輻";s:2:"";s:3:"輾";s:2:"";s:3:"輿";s:2:"";s:3:"轀";s:2:"";s:3:"轂";s:2:"";s:3:"轃";s:2:"";s:3:"轄";s:2:"";s:3:"轅";s:2:"";s:3:"轆";s:2:"F";s:3:"轇";s:2:"G";s:3:"轈";s:2:"H";s:3:"轉";s:2:"";s:3:"轋";s:2:"I";s:3:"轍";s:2:"";s:3:"轎";s:2:"";s:3:"轏";s:2:"X";s:3:"轐";s:2:"Y";s:3:"轑";s:2:"W";s:3:"轒";s:2:"V";s:3:"轓";s:2:"Z";s:3:"轔";s:2:"";s:3:"轕";s:2:"";s:3:"轖";s:2:"";s:3:"轗";s:2:"";s:3:"轘";s:2:"";s:3:"轙";s:2:"";s:3:"轚";s:2:"";s:3:"轛";s:2:"X";s:3:"轝";s:2:"Y";s:3:"轞";s:2:"W";s:3:"轟";s:2:"F";s:3:"轠";s:2:"d";s:3:"轡";s:2:"ů";s:3:"轢";s:2:"e";s:3:"轣";s:2:"H";s:3:"轤";s:2:"G";s:3:"辛";s:2:"";s:3:"辜";s:2:"d";s:3:"辟";s:2:"@";s:3:"辣";s:2:"";s:3:"辦";s:2:"";s:3:"辨";s:2:"";s:3:"辭";s:2:"";s:3:"辮";s:2:"|";s:3:"辯";s:2:"G";s:3:"辰";s:2:"";s:3:"辱";s:2:"d";s:3:"農";s:2:"A";s:3:"辴";s:2:"[";s:3:"辿";s:2:"˦";s:3:"迂";s:2:"";s:3:"迄";s:2:"";s:3:"迅";s:2:"";s:3:"迆";s:2:"";s:3:"迉";s:2:"˥";s:3:"迋";s:2:"";s:3:"迍";s:2:"";s:3:"迎";s:2:"";s:3:"近";s:2:"";s:3:"迒";s:2:"";s:3:"迓";s:2:"";s:3:"返";s:2:"";s:3:"迕";s:2:"";s:3:"迖";s:2:"";s:3:"迗";s:2:"";s:3:"迠";s:2:"ж";s:3:"迡";s:2:"д";s:3:"迢";s:2:"|";s:3:"迣";s:2:"г";s:3:"迤";s:2:"";s:3:"迥";s:2:"~";s:3:"迦";s:2:"{";s:3:"迨";s:2:"";s:3:"迪";s:2:"}";s:3:"迫";s:2:"";s:3:"迭";s:2:"";s:3:"迮";s:2:"е";s:3:"述";s:2:"z";s:3:"迴";s:2:"j";s:3:"迵";s:2:"";s:3:"迶";s:2:"";s:3:"迷";s:2:"g";s:3:"迸";s:2:"n";s:3:"迺";s:2:"i";s:3:"迻";s:2:"";s:3:"迼";s:2:"";s:3:"追";s:2:"l";s:3:"迾";s:2:"";s:3:"迿";s:2:"";s:3:"退";s:2:"h";s:3:"送";s:2:"e";s:3:"适";s:2:"";s:3:"逃";s:2:"k";s:3:"逄";s:2:"";s:3:"逅";s:2:"m";s:3:"逆";s:2:"f";s:3:"逋";s:2:"";s:3:"逌";s:2:"";s:3:"逍";s:2:"p";s:3:"透";s:2:"z";s:3:"逐";s:2:"v";s:3:"逑";s:2:"";s:3:"途";s:2:"~";s:3:"逕";s:2:"w";s:3:"逖";s:2:"|";s:3:"逗";s:2:"r";s:3:"這";s:2:"o";s:3:"通";s:2:"q";s:3:"逛";s:2:"}";s:3:"逜";s:2:"";s:3:"逝";s:2:"u";s:3:"逞";s:2:"x";s:3:"速";s:2:"t";s:3:"造";s:2:"y";s:3:"逡";s:2:"";s:3:"逢";s:2:"{";s:3:"連";s:2:"s";s:3:"逤";s:2:"";s:3:"逭";s:2:"M";s:3:"逮";s:2:"e";s:3:"逯";s:2:"O";s:3:"週";s:2:"g";s:3:"進";s:2:"i";s:3:"逴";s:2:"N";s:3:"逵";s:2:"f";s:3:"逶";s:2:"j";s:3:"逸";s:2:"h";s:3:"逼";s:2:"G";s:3:"逽";s:2:"";s:3:"逾";s:2:"O";s:3:"逿";s:2:"~";s:3:"遁";s:2:"P";s:3:"遂";s:2:"E";s:3:"遄";s:2:"";s:3:"遇";s:2:"J";s:3:"遉";s:2:"";s:3:"遊";s:2:"C";s:3:"運";s:2:"B";s:3:"遍";s:2:"M";s:3:"過";s:2:"L";s:3:"遏";s:2:"K";s:3:"遐";s:2:"I";s:3:"遑";s:2:"N";s:3:"遒";s:2:"}";s:3:"道";s:2:"D";s:3:"達";s:2:"F";s:3:"違";s:2:"H";s:3:"遘";s:2:"";s:3:"遙";s:2:"";s:3:"遛";s:2:"";s:3:"遜";s:2:"";s:3:"遝";s:2:"";s:3:"遞";s:2:"";s:3:"遠";s:2:"";s:3:"遢";s:2:"";s:3:"遣";s:2:"";s:3:"遧";s:2:"R";s:3:"遨";s:2:"C";s:3:"適";s:2:"A";s:3:"遫";s:2:"S";s:3:"遭";s:2:"D";s:3:"遮";s:2:"B";s:3:"遯";s:2:"Q";s:3:"遰";s:2:"P";s:3:"遲";s:2:"";s:3:"遳";s:2:"O";s:3:"遴";s:2:"";s:3:"遵";s:2:"";s:3:"遶";s:2:"";s:3:"遷";s:2:"E";s:3:"選";s:2:"";s:3:"遹";s:2:"";s:3:"遺";s:2:"";s:3:"遻";s:2:"";s:3:"遼";s:2:"";s:3:"遽";s:2:"";s:3:"遾";s:2:"";s:3:"避";s:2:"";s:3:"邀";s:2:"";s:3:"邁";s:2:"";s:3:"邂";s:2:"";s:3:"邃";s:2:"";s:3:"還";s:2:"";s:3:"邅";s:2:"";s:3:"邆";s:2:"";s:3:"邇";s:2:"";s:3:"邈";s:2:"";s:3:"邊";s:2:"";s:3:"邋";s:2:"";s:3:"邍";s:2:"";s:3:"邏";s:2:"";s:3:"邐";s:2:"";s:3:"邑";s:2:"";s:3:"邔";s:2:"U";s:3:"邕";s:2:"o";s:3:"邗";s:2:"R";s:3:"邘";s:2:"S";s:3:"邙";s:2:"Q";s:3:"邛";s:2:"T";s:3:"邞";s:2:"˪";s:3:"邟";s:2:"˧";s:3:"邠";s:2:"ˬ";s:3:"邡";s:2:"˨";s:3:"邢";s:2:"";s:3:"那";s:2:"";s:3:"邥";s:2:"˩";s:3:"邦";s:2:"";s:3:"邧";s:2:"˫";s:3:"邪";s:2:"";s:3:"邯";s:2:"";s:3:"邰";s:2:"";s:3:"邱";s:2:"";s:3:"邲";s:2:"";s:3:"邳";s:2:"";s:3:"邴";s:2:"";s:3:"邵";s:2:"";s:3:"邶";s:2:"";s:3:"邸";s:2:"";s:3:"邽";s:2:"и";s:3:"邾";s:2:"м";s:3:"邿";s:2:"й";s:3:"郁";s:2:"";s:3:"郃";s:2:"";s:3:"郅";s:2:"л";s:3:"郇";s:2:"н";s:3:"郈";s:2:"п";s:3:"郊";s:2:"";s:3:"郋";s:2:"о";s:3:"郎";s:2:"";s:3:"郔";s:2:"";s:3:"郕";s:2:"к";s:3:"郖";s:2:"";s:3:"郗";s:2:"";s:3:"郘";s:2:"";s:3:"郙";s:2:"";s:3:"郚";s:2:"";s:3:"郛";s:2:"";s:3:"郜";s:2:"";s:3:"郝";s:2:"q";s:3:"郟";s:2:"";s:3:"郠";s:2:"";s:3:"郡";s:2:"p";s:3:"郢";s:2:"r";s:3:"郣";s:2:"";s:3:"郤";s:2:"";s:3:"郥";s:2:"";s:3:"部";s:2:"";s:3:"郩";s:2:"";s:3:"郪";s:2:"";s:3:"郫";s:2:"";s:3:"郬";s:2:"";s:3:"郭";s:2:"";s:3:"郯";s:2:"";s:3:"郰";s:2:"";s:3:"郱";s:2:"з";s:3:"郲";s:2:"";s:3:"郳";s:2:"";s:3:"郴";s:2:"";s:3:"郵";s:2:"l";s:3:"郹";s:2:"V";s:3:"郺";s:2:"";s:3:"郻";s:2:"W";s:3:"郼";s:2:"T";s:3:"都";s:2:"";s:3:"郾";s:2:"n";s:3:"郿";s:2:"S";s:3:"鄀";s:2:"Y";s:3:"鄁";s:2:"X";s:3:"鄂";s:2:"k";s:3:"鄃";s:2:"\";s:3:"鄄";s:2:"R";s:3:"鄅";s:2:"[";s:3:"鄆";s:2:"P";s:3:"鄇";s:2:"Z";s:3:"鄈";s:2:"U";s:3:"鄉";s:2:"m";s:3:"鄋";s:2:"";s:3:"鄍";s:2:"";s:3:"鄎";s:2:"";s:3:"鄏";s:2:"";s:3:"鄐";s:2:"";s:3:"鄑";s:2:"";s:3:"鄒";s:2:"Q";s:3:"鄔";s:2:"";s:3:"鄖";s:2:"";s:3:"鄗";s:2:"R";s:3:"鄘";s:2:"";s:3:"鄙";s:2:"";s:3:"鄚";s:2:"n";s:3:"鄛";s:2:"q";s:3:"鄜";s:2:"i";s:3:"鄝";s:2:"m";s:3:"鄞";s:2:"";s:3:"鄟";s:2:"l";s:3:"鄠";s:2:"j";s:3:"鄡";s:2:"p";s:3:"鄢";s:2:"k";s:3:"鄣";s:2:"h";s:3:"鄤";s:2:"o";s:3:"鄦";s:2:"Y";s:3:"鄧";s:2:"H";s:3:"鄨";s:2:"J";s:3:"鄩";s:2:"V";s:3:"鄪";s:2:"W";s:3:"鄫";s:2:"U";s:3:"鄬";s:2:"Q";s:3:"鄭";s:2:"G";s:3:"鄮";s:2:"Z";s:3:"鄯";s:2:"T";s:3:"鄰";s:2:"F";s:3:"鄱";s:2:"I";s:3:"鄲";s:2:"X";s:3:"鄳";s:2:"";s:3:"鄴";s:2:"";s:3:"鄵";s:2:"";s:3:"鄶";s:2:"";s:3:"鄸";s:2:"";s:3:"鄹";s:2:"";s:3:"鄺";s:2:"K";s:3:"鄻";s:2:"L";s:3:"鄾";s:2:"M";s:3:"鄿";s:2:"]";s:3:"酀";s:2:"\";s:3:"酁";s:2:"";s:3:"酃";s:2:"";s:3:"酄";s:2:"[";s:3:"酅";s:2:"\";s:3:"酆";s:2:"Z";s:3:"酇";s:2:"f";s:3:"酈";s:2:"Ű";s:3:"酉";s:2:"";s:3:"酊";s:2:"";s:3:"酋";s:2:"";s:3:"酌";s:2:"u";s:3:"配";s:2:"t";s:3:"酎";s:2:"@";s:3:"酏";s:2:"A";s:3:"酐";s:2:"";s:3:"酒";s:2:"s";s:3:"酓";s:2:"";s:3:"酕";s:2:"";s:3:"酖";s:2:"";s:3:"酗";s:2:"";s:3:"酘";s:2:"";s:3:"酚";s:2:"";s:3:"酟";s:2:"_";s:3:"酠";s:2:"a";s:3:"酡";s:2:"]";s:3:"酢";s:2:"`";s:3:"酣";s:2:"o";s:3:"酤";s:2:"^";s:3:"酥";s:2:"p";s:3:"酨";s:2:"s";s:3:"酩";s:2:"U";s:3:"酪";s:2:"T";s:3:"酬";s:2:"S";s:3:"酮";s:2:"";s:3:"酯";s:2:"";s:3:"酲";s:2:"s";s:3:"酳";s:2:"u";s:3:"酴";s:2:"";s:3:"酵";s:2:"";s:3:"酷";s:2:"";s:3:"酸";s:2:"";s:3:"酹";s:2:"t";s:3:"酺";s:2:"r";s:3:"醀";s:2:"a";s:3:"醁";s:2:"^";s:3:"醂";s:2:"_";s:3:"醃";s:2:"M";s:3:"醄";s:2:"`";s:3:"醅";s:2:"[";s:3:"醆";s:2:"\";s:3:"醇";s:2:"J";s:3:"醉";s:2:"K";s:3:"醊";s:2:"]";s:3:"醋";s:2:"L";s:3:"醍";s:2:"";s:3:"醏";s:2:"";s:3:"醐";s:2:"";s:3:"醑";s:2:"";s:3:"醒";s:2:"";s:3:"醓";s:2:"";s:3:"醙";s:2:"";s:3:"醚";s:2:"";s:3:"醛";s:2:"";s:3:"醜";s:2:"";s:3:"醝";s:2:"";s:3:"醞";s:2:"";s:3:"醟";s:2:"";s:3:"醠";s:2:"";s:3:"醡";s:2:"";s:3:"醢";s:2:"";s:3:"醣";s:2:"";s:3:"醥";s:2:"O";s:3:"醧";s:2:"P";s:3:"醨";s:2:"N";s:3:"醪";s:2:"R";s:3:"醫";s:2:"";s:3:"醬";s:2:"";s:3:"醭";s:2:"_";s:3:"醮";s:2:"";s:3:"醯";s:2:"Q";s:3:"醰";s:2:"^";s:3:"醱";s:2:"";s:3:"醲";s:2:"";s:3:"醳";s:2:"";s:3:"醴";s:2:"Ŀ";s:3:"醵";s:2:"";s:3:"醷";s:2:"";s:3:"醹";s:2:"]";s:3:"醺";s:2:"H";s:3:"醼";s:2:"I";s:3:"醽";s:2:"";s:3:"醾";s:2:"";s:3:"釀";s:2:"C";s:3:"釁";s:2:"]";s:3:"釂";s:2:"";s:3:"釃";s:2:"q";s:3:"釅";s:2:"o";s:3:"釆";s:2:"";s:3:"采";s:2:"";s:3:"釉";s:2:"V";s:3:"釋";s:2:"";s:3:"里";s:2:"";s:3:"重";s:2:"";s:3:"野";s:2:"";s:3:"量";s:2:"q";s:3:"釐";s:2:"";s:3:"金";s:2:"";s:3:"釓";s:2:"";s:3:"釔";s:2:"";s:3:"釕";s:2:"B";s:3:"釗";s:2:"x";s:3:"釘";s:2:"v";s:3:"釙";s:2:"z";s:3:"釚";s:2:"D";s:3:"釜";s:2:"y";s:3:"針";s:2:"w";s:3:"釢";s:2:"C";s:3:"釣";s:2:"";s:3:"釤";s:2:"";s:3:"釦";s:2:"";s:3:"釧";s:2:"";s:3:"釨";s:2:"B";s:3:"釩";s:2:"";s:3:"釪";s:2:"";s:3:"釫";s:2:"@";s:3:"釬";s:2:"";s:3:"釭";s:2:"";s:3:"釮";s:2:"C";s:3:"釱";s:2:"";s:3:"釳";s:2:"";s:3:"釴";s:2:"";s:3:"釵";s:2:"";s:3:"釷";s:2:"A";s:3:"釸";s:2:"";s:3:"釹";s:2:"";s:3:"釽";s:2:"m";s:3:"釿";s:2:"l";s:3:"鈀";s:2:"j";s:3:"鈁";s:2:"b";s:3:"鈂";s:2:"q";s:3:"鈃";s:2:"e";s:3:"鈄";s:2:"o";s:3:"鈅";s:2:"v";s:3:"鈆";s:2:"n";s:3:"鈇";s:2:"y";s:3:"鈉";s:2:"u";s:3:"鈊";s:2:"c";s:3:"鈌";s:2:"i";s:3:"鈍";s:2:"w";s:3:"鈏";s:2:"h";s:3:"鈐";s:2:"x";s:3:"鈑";s:2:"z";s:3:"鈒";s:2:"k";s:3:"鈔";s:2:"r";s:3:"鈕";s:2:"s";s:3:"鈖";s:2:"w";s:3:"鈗";s:2:"u";s:3:"鈙";s:2:"t";s:3:"鈚";s:2:"f";s:3:"鈜";s:2:"r";s:3:"鈞";s:2:"v";s:3:"鈣";s:2:"t";s:3:"鈤";s:2:"s";s:3:"鈥";s:2:"d";s:3:"鈦";s:2:"g";s:3:"鈧";s:2:"p";s:3:"鈭";s:2:"";s:3:"鈮";s:2:"";s:3:"鈰";s:2:"";s:3:"鈱";s:2:"";s:3:"鈲";s:2:"";s:3:"鈳";s:2:"";s:3:"鈴";s:2:"a";s:3:"鈶";s:2:"";s:3:"鈷";s:2:"W";s:3:"鈸";s:2:"Y";s:3:"鈹";s:2:"e";s:3:"鈺";s:2:"";s:3:"鈽";s:2:"Z";s:3:"鈾";s:2:"\";s:3:"鈿";s:2:"f";s:3:"鉀";s:2:"[";s:3:"鉅";s:2:"d";s:3:"鉆";s:2:"";s:3:"鉈";s:2:"";s:3:"鉉";s:2:"b";s:3:"鉊";s:2:"";s:3:"鉋";s:2:"^";s:3:"鉌";s:2:"";s:3:"鉍";s:2:"c";s:3:"鉎";s:2:"";s:3:"鉏";s:2:"";s:3:"鉐";s:2:"";s:3:"鉑";s:2:"`";s:3:"鉒";s:2:"";s:3:"鉓";s:2:"";s:3:"鉔";s:2:"";s:3:"鉖";s:2:"";s:3:"鉗";s:2:"X";s:3:"鉚";s:2:"g";s:3:"鉛";s:2:"]";s:3:"鉞";s:2:"";s:3:"鉠";s:2:"";s:3:"鉡";s:2:"";s:3:"鉣";s:2:"";s:3:"鉤";s:2:"_";s:3:"鉥";s:2:"";s:3:"鉦";s:2:"";s:3:"鉧";s:2:"";s:3:"鉬";s:2:"";s:3:"鉭";s:2:"";s:3:"鉯";s:2:"";s:3:"鉰";s:2:"";s:3:"鉲";s:2:"";s:3:"鉶";s:2:"x";s:3:"鉸";s:2:"";s:3:"鉹";s:2:"";s:3:"鉺";s:2:"z";s:3:"鉻";s:2:"";s:3:"鉼";s:2:"";s:3:"鉽";s:2:"";s:3:"鉾";s:2:"";s:3:"鉿";s:2:"";s:3:"銀";s:2:"";s:3:"銂";s:2:"";s:3:"銃";s:2:"";s:3:"銅";s:2:"";s:3:"銆";s:2:"";s:3:"銇";s:2:"";s:3:"銈";s:2:"";s:3:"銊";s:2:"";s:3:"銋";s:2:"";s:3:"銌";s:2:"";s:3:"銍";s:2:"~";s:3:"銎";s:2:"";s:3:"銑";s:2:"";s:3:"銓";s:2:"";s:3:"銔";s:2:"|";s:3:"銕";s:2:"";s:3:"銖";s:2:"";s:3:"銗";s:2:"";s:3:"銘";s:2:"";s:3:"銙";s:2:"";s:3:"銚";s:2:"";s:3:"銛";s:2:"y";s:3:"銜";s:2:"";s:3:"銝";s:2:"";s:3:"銠";s:2:"{";s:3:"銡";s:2:"";s:3:"銢";s:2:"";s:3:"銣";s:2:"";s:3:"銤";s:2:"w";s:3:"銥";s:2:"v";s:3:"銦";s:2:"";s:3:"銧";s:2:"";s:3:"銨";s:2:"";s:3:"銩";s:2:"";s:3:"銪";s:2:"}";s:3:"銫";s:2:"";s:3:"銬";s:2:"R";s:3:"銲";s:2:"Z";s:3:"銳";s:2:"U";s:3:"銴";s:2:"";s:3:"銵";s:2:"";s:3:"銶";s:2:"g";s:3:"銷";s:2:"P";s:3:"銹";s:2:"";s:3:"銻";s:2:"O";s:3:"銼";s:2:"V";s:3:"鋀";s:2:"e";s:3:"鋁";s:2:"T";s:3:"鋂";s:2:"q";s:3:"鋃";s:2:"c";s:3:"鋄";s:2:"d";s:3:"鋅";s:2:"N";s:3:"鋆";s:2:"";s:3:"鋇";s:2:"X";s:3:"鋈";s:2:"t";s:3:"鋉";s:2:"y";s:3:"鋊";s:2:"s";s:3:"鋋";s:2:"";s:3:"鋌";s:2:"o";s:3:"鋍";s:2:"w";s:3:"鋎";s:2:"u";s:3:"鋏";s:2:"h";s:3:"鋐";s:2:"b";s:3:"鋑";s:2:"}";s:3:"鋒";s:2:"W";s:3:"鋓";s:2:"~";s:3:"鋕";s:2:"x";s:3:"鋗";s:2:"m";s:3:"鋘";s:2:"k";s:3:"鋙";s:2:"f";s:3:"鋝";s:2:"n";s:3:"鋞";s:2:"{";s:3:"鋟";s:2:"j";s:3:"鋠";s:2:"z";s:3:"鋡";s:2:"";s:3:"鋤";s:2:"S";s:3:"鋦";s:2:"v";s:3:"鋧";s:2:"|";s:3:"鋨";s:2:"r";s:3:"鋩";s:2:"l";s:3:"鋪";s:2:"Q";s:3:"鋮";s:2:"";s:3:"鋯";s:2:"p";s:3:"鋰";s:2:"Y";s:3:"鋱";s:2:"i";s:3:"鋷";s:2:"";s:3:"鋸";s:2:"";s:3:"鋹";s:2:"";s:3:"鋺";s:2:"";s:3:"鋻";s:2:"D";s:3:"鋼";s:2:"";s:3:"鋾";s:2:"A";s:3:"鋿";s:2:"";s:3:"錀";s:2:"C";s:3:"錁";s:2:"";s:3:"錂";s:2:"";s:3:"錄";s:2:"";s:3:"錆";s:2:"";s:3:"錈";s:2:"";s:3:"錉";s:2:"B";s:3:"錋";s:2:"@";s:3:"錌";s:2:"";s:3:"錍";s:2:"";s:3:"錎";s:2:"";s:3:"錏";s:2:"";s:3:"錐";s:2:"@";s:3:"錒";s:2:"";s:3:"錓";s:2:"";s:3:"錔";s:2:"";s:3:"錕";s:2:"C";s:3:"錖";s:2:"E";s:3:"錘";s:2:"";s:3:"錙";s:2:"E";s:3:"錚";s:2:"";s:3:"錛";s:2:"";s:3:"錝";s:2:"";s:3:"錞";s:2:"";s:3:"錟";s:2:"";s:3:"錠";s:2:"";s:3:"錡";s:2:"B";s:3:"錢";s:2:"";s:3:"錣";s:2:"";s:3:"錤";s:2:"";s:3:"錥";s:2:"";s:3:"錦";s:2:"A";s:3:"錧";s:2:"";s:3:"錨";s:2:"";s:3:"錩";s:2:"";s:3:"錪";s:2:"";s:3:"錫";s:2:"";s:3:"錭";s:2:"";s:3:"錮";s:2:"D";s:3:"錯";s:2:"";s:3:"錳";s:2:"";s:3:"錴";s:2:"";s:3:"錵";s:2:"";s:3:"錶";s:2:"";s:3:"錸";s:2:"";s:3:"錹";s:2:"";s:3:"錼";s:2:"";s:3:"鍆";s:2:"";s:3:"鍇";s:2:"";s:3:"鍉";s:2:"";s:3:"鍊";s:2:"";s:3:"鍋";s:2:"";s:3:"鍌";s:2:"";s:3:"鍍";s:2:"";s:3:"鍎";s:2:"";s:3:"鍏";s:2:"";s:3:"鍐";s:2:"";s:3:"鍑";s:2:"";s:3:"鍒";s:2:"";s:3:"鍔";s:2:"";s:3:"鍕";s:2:"";s:3:"鍖";s:2:"";s:3:"鍗";s:2:"";s:3:"鍘";s:2:"";s:3:"鍙";s:2:"";s:3:"鍚";s:2:"";s:3:"鍛";s:2:"";s:3:"鍜";s:2:"";s:3:"鍞";s:2:"";s:3:"鍠";s:2:"";s:3:"鍡";s:2:"";s:3:"鍣";s:2:"";s:3:"鍤";s:2:"";s:3:"鍥";s:2:"";s:3:"鍧";s:2:"";s:3:"鍪";s:2:"";s:3:"鍬";s:2:"";s:3:"鍭";s:2:"";s:3:"鍰";s:2:"";s:3:"鍱";s:2:"";s:3:"鍵";s:2:"";s:3:"鍶";s:2:"";s:3:"鍷";s:2:"";s:3:"鍹";s:2:"";s:3:"鍺";s:2:"";s:3:"鍻";s:2:"";s:3:"鍼";s:2:"";s:3:"鍾";s:2:"";s:3:"鎀";s:2:"";s:3:"鎂";s:2:"";s:3:"鎃";s:2:"";s:3:"鎈";s:2:"`";s:3:"鎉";s:2:"Y";s:3:"鎊";s:2:"";s:3:"鎌";s:2:"T";s:3:"鎍";s:2:"c";s:3:"鎎";s:2:"[";s:3:"鎏";s:2:"";s:3:"鎑";s:2:"e";s:3:"鎒";s:2:"U";s:3:"鎔";s:2:"";s:3:"鎕";s:2:"_";s:3:"鎖";s:2:"";s:3:"鎗";s:2:"";s:3:"鎘";s:2:"";s:3:"鎙";s:2:"a";s:3:"鎚";s:2:"";s:3:"鎛";s:2:"W";s:3:"鎝";s:2:"X";s:3:"鎞";s:2:"]";s:3:"鎟";s:2:"b";s:3:"鎡";s:2:"";s:3:"鎢";s:2:"";s:3:"鎣";s:2:"j";s:3:"鎤";s:2:"g";s:3:"鎥";s:2:"k";s:3:"鎦";s:2:"^";s:3:"鎧";s:2:"Z";s:3:"鎨";s:2:"h";s:3:"鎩";s:2:"j";s:3:"鎪";s:2:"\";s:3:"鎬";s:2:"";s:3:"鎮";s:2:"";s:3:"鎯";s:2:"";s:3:"鎰";s:2:"";s:3:"鎱";s:2:"d";s:3:"鎲";s:2:"f";s:3:"鎳";s:2:"";s:3:"鎴";s:2:"i";s:3:"鎵";s:2:"S";s:3:"鎷";s:2:"V";s:3:"鏀";s:2:"s";s:3:"鏂";s:2:"c";s:3:"鏃";s:2:"";s:3:"鏄";s:2:"q";s:3:"鏇";s:2:"a";s:3:"鏈";s:2:"";s:3:"鏊";s:2:"l";s:3:"鏌";s:2:"h";s:3:"鏍";s:2:"";s:3:"鏎";s:2:"r";s:3:"鏏";s:2:"b";s:3:"鏐";s:2:"e";s:3:"鏑";s:2:"";s:3:"鏒";s:2:"t";s:3:"鏔";s:2:"m";s:3:"鏕";s:2:"p";s:3:"鏖";s:2:"";s:3:"鏗";s:2:"";s:3:"鏘";s:2:"";s:3:"鏙";s:2:"i";s:3:"鏚";s:2:"d";s:3:"鏜";s:2:"";s:3:"鏝";s:2:"";s:3:"鏞";s:2:"`";s:3:"鏟";s:2:"";s:3:"鏡";s:2:"";s:3:"鏢";s:2:"";s:3:"鏣";s:2:"o";s:3:"鏤";s:2:"";s:3:"鏦";s:2:"k";s:3:"鏧";s:2:"u";s:3:"鏨";s:2:"";s:3:"鏬";s:2:"g";s:3:"鏮";s:2:"n";s:3:"鏵";s:2:"";s:3:"鏶";s:2:"B";s:3:"鏷";s:2:"";s:3:"鏸";s:2:"";s:3:"鏹";s:2:"f";s:3:"鏺";s:2:"";s:3:"鏻";s:2:"";s:3:"鏼";s:2:"@";s:3:"鏽";s:2:"";s:3:"鏾";s:2:"";s:3:"鏿";s:2:"";s:3:"鐀";s:2:"";s:3:"鐃";s:2:"";s:3:"鐆";s:2:"D";s:3:"鐇";s:2:"";s:3:"鐉";s:2:"";s:3:"鐊";s:2:"";s:3:"鐋";s:2:"";s:3:"鐌";s:2:"A";s:3:"鐍";s:2:"";s:3:"鐎";s:2:"";s:3:"鐏";s:2:"";s:3:"鐐";s:2:"";s:3:"鐑";s:2:"C";s:3:"鐒";s:2:"";s:3:"鐓";s:2:"";s:3:"鐔";s:2:"";s:3:"鐕";s:2:"";s:3:"鐖";s:2:"";s:3:"鐘";s:2:"";s:3:"鐙";s:2:"";s:3:"鐠";s:2:"";s:3:"鐨";s:2:"";s:3:"鐩";s:2:"a";s:3:"鐪";s:2:"f";s:3:"鐫";s:2:"O";s:3:"鐬";s:2:"h";s:3:"鐮";s:2:"I";s:3:"鐰";s:2:"d";s:3:"鐱";s:2:"j";s:3:"鐲";s:2:"N";s:3:"鐳";s:2:"J";s:3:"鐵";s:2:"K";s:3:"鐶";s:2:"`";s:3:"鐷";s:2:"g";s:3:"鐸";s:2:"M";s:3:"鐹";s:2:"e";s:3:"鐺";s:2:"L";s:3:"鐻";s:2:"_";s:3:"鐼";s:2:"c";s:3:"鐽";s:2:"b";s:3:"鐿";s:2:"^";s:3:"鑀";s:2:"i";s:3:"鑄";s:2:"ű";s:3:"鑅";s:2:"m";s:3:"鑆";s:2:"p";s:3:"鑇";s:2:"l";s:3:"鑈";s:2:"n";s:3:"鑉";s:2:"o";s:3:"鑊";s:2:"i";s:3:"鑋";s:2:"j";s:3:"鑌";s:2:"g";s:3:"鑏";s:2:"k";s:3:"鑐";s:2:"h";s:3:"鑑";s:2:"Ų";s:3:"鑒";s:2:"ų";s:3:"鑕";s:2:"K";s:3:"鑗";s:2:"M";s:3:"鑝";s:2:"L";s:3:"鑞";s:2:"N";s:3:"鑠";s:2:"";s:3:"鑢";s:2:"J";s:3:"鑣";s:2:"";s:3:"鑤";s:2:"";s:3:"鑨";s:2:"";s:3:"鑩";s:2:"";s:3:"鑪";s:2:"D";s:3:"鑫";s:2:"";s:3:"鑭";s:2:"S";s:3:"鑮";s:2:"R";s:3:"鑯";s:2:"T";s:3:"鑰";s:2:"_";s:3:"鑱";s:2:"U";s:3:"鑲";s:2:"^";s:3:"鑳";s:2:"V";s:3:"鑴";s:2:"r";s:3:"鑵";s:2:"u";s:3:"鑶";s:2:"t";s:3:"鑷";s:2:"h";s:3:"鑸";s:2:"s";s:3:"鑼";s:2:"r";s:3:"鑽";s:2:"p";s:3:"鑾";s:2:"q";s:3:"鑿";s:2:"w";s:3:"钀";s:2:"";s:3:"钁";s:2:"";s:3:"钂";s:2:"";s:3:"钃";s:2:"";s:3:"長";s:2:"";s:3:"镺";s:2:"D";s:3:"镻";s:2:"x";s:3:"镼";s:2:"";s:3:"镽";s:2:"v";s:3:"門";s:2:"";s:3:"閂";s:2:"";s:3:"閃";s:2:"{";s:3:"閆";s:2:"E";s:3:"閈";s:2:"F";s:3:"閉";s:2:"";s:3:"開";s:2:"}";s:3:"閌";s:2:"z";s:3:"閍";s:2:"y";s:3:"閎";s:2:"";s:3:"閏";s:2:"|";s:3:"閐";s:2:"{";s:3:"閑";s:2:"~";s:3:"閒";s:2:"";s:3:"間";s:2:"";s:3:"閔";s:2:"{";s:3:"閘";s:2:"h";s:3:"閛";s:2:"";s:3:"閜";s:2:"";s:3:"閞";s:2:"";s:3:"閟";s:2:"";s:3:"閡";s:2:"";s:3:"閣";s:2:"";s:3:"閤";s:2:"";s:3:"閥";s:2:"";s:3:"閨";s:2:"";s:3:"閩";s:2:"";s:3:"閫";s:2:"";s:3:"閬";s:2:"";s:3:"閭";s:2:"[";s:3:"閮";s:2:"";s:3:"閰";s:2:"";s:3:"閱";s:2:"\";s:3:"閵";s:2:"M";s:3:"閶";s:2:"K";s:3:"閷";s:2:"";s:3:"閹";s:2:"I";s:3:"閺";s:2:"J";s:3:"閻";s:2:"F";s:3:"閼";s:2:"F";s:3:"閽";s:2:"N";s:3:"閾";s:2:"H";s:3:"閿";s:2:"L";s:3:"闀";s:2:"";s:3:"闃";s:2:"";s:3:"闅";s:2:"";s:3:"闆";s:2:"";s:3:"闇";s:2:"";s:3:"闈";s:2:"";s:3:"闉";s:2:"";s:3:"闊";s:2:"";s:3:"闋";s:2:"";s:3:"闌";s:2:"";s:3:"闍";s:2:"G";s:3:"闐";s:2:"";s:3:"闑";s:2:"n";s:3:"闒";s:2:"l";s:3:"闓";s:2:"m";s:3:"闔";s:2:"";s:3:"闕";s:2:"";s:3:"闖";s:2:"";s:3:"闚";s:2:"w";s:3:"闛";s:2:"x";s:3:"關";s:2:"";s:3:"闞";s:2:"E";s:3:"闟";s:2:"G";s:3:"闠";s:2:"F";s:3:"闡";s:2:"";s:3:"闢";s:2:"P";s:3:"闣";s:2:"m";s:3:"闤";s:2:"l";s:3:"闥";s:2:"k";s:3:"阜";s:2:"";s:3:"阞";s:2:"ɪ";s:3:"阠";s:2:"X";s:3:"阡";s:2:"";s:3:"阢";s:2:"V";s:3:"阣";s:2:"Y";s:3:"阤";s:2:"W";s:3:"阨";s:2:"ˮ";s:3:"阪";s:2:"";s:3:"阬";s:2:"";s:3:"阭";s:2:"˰";s:3:"阮";s:2:"";s:3:"阯";s:2:"˯";s:3:"阰";s:2:"˭";s:3:"阱";s:2:"";s:3:"防";s:2:"";s:3:"阹";s:2:"";s:3:"阺";s:2:"";s:3:"阻";s:2:"";s:3:"阼";s:2:"";s:3:"阽";s:2:"";s:3:"阿";s:2:"";s:3:"陀";s:2:"";s:3:"陂";s:2:"@";s:3:"陃";s:2:"";s:3:"附";s:2:"";s:3:"陊";s:2:"";s:3:"陋";s:2:"";s:3:"陌";s:2:"";s:3:"降";s:2:"";s:3:"陎";s:2:"";s:3:"陏";s:2:"";s:3:"限";s:2:"";s:3:"陑";s:2:"";s:3:"陓";s:2:"";s:3:"陔";s:2:"";s:3:"陘";s:2:"";s:3:"陛";s:2:"";s:3:"陜";s:2:"E";s:3:"陝";s:2:"";s:3:"陞";s:2:"";s:3:"陟";s:2:"F";s:3:"陡";s:2:"~";s:3:"院";s:2:"|";s:3:"陣";s:2:"}";s:3:"除";s:2:"";s:3:"陪";s:2:"";s:3:"陫";s:2:"I";s:3:"陬";s:2:"";s:3:"陭";s:2:"H";s:3:"陯";s:2:"K";s:3:"陰";s:2:"";s:3:"陱";s:2:"J";s:3:"陲";s:2:"";s:3:"陳";s:2:"";s:3:"陴";s:2:"";s:3:"陵";s:2:"";s:3:"陶";s:2:"";s:3:"陷";s:2:"";s:3:"陸";s:2:"";s:3:"陼";s:2:"G";s:3:"陽";s:2:"";s:3:"陾";s:2:"}";s:3:"隀";s:2:"ܣ";s:3:"隃";s:2:"ܢ";s:3:"隄";s:2:"";s:3:"隅";s:2:"";s:3:"隆";s:2:"";s:3:"隇";s:2:"|";s:3:"隈";s:2:"~";s:3:"隉";s:2:"ܡ";s:3:"隊";s:2:"";s:3:"隋";s:2:"";s:3:"隍";s:2:"";s:3:"階";s:2:"";s:3:"隑";s:2:"";s:3:"隒";s:2:"";s:3:"隓";s:2:"";s:3:"隔";s:2:"j";s:3:"隕";s:2:"k";s:3:"隗";s:2:"";s:3:"隘";s:2:"i";s:3:"隙";s:2:"";s:3:"際";s:2:"";s:3:"障";s:2:"";s:3:"隞";s:2:"";s:3:"隡";s:2:"";s:3:"隢";s:2:"";s:3:"隤";s:2:"";s:3:"隧";s:2:"G";s:3:"隨";s:2:"H";s:3:"隩";s:2:"O";s:3:"險";s:2:"I";s:3:"隬";s:2:"";s:3:"隮";s:2:"";s:3:"隰";s:2:"";s:3:"隱";s:2:"";s:3:"隳";s:2:"o";s:3:"隴";s:2:"";s:3:"隸";s:2:"";s:3:"隹";s:2:"A";s:3:"隻";s:2:"";s:3:"隼";s:2:"G";s:3:"隿";s:2:"L";s:3:"雀";s:2:"";s:3:"雁";s:2:"";s:3:"雂";s:2:"ܤ";s:3:"雃";s:2:"ܦ";s:3:"雄";s:2:"";s:3:"雅";s:2:"";s:3:"集";s:2:"";s:3:"雇";s:2:"";s:3:"雈";s:2:"ܥ";s:3:"雉";s:2:"n";s:3:"雊";s:2:"o";s:3:"雋";s:2:"m";s:3:"雌";s:2:"";s:3:"雍";s:2:"l";s:3:"雎";s:2:"";s:3:"雒";s:2:"";s:3:"雓";s:2:"";s:3:"雔";s:2:"P";s:3:"雕";s:2:"J";s:3:"雖";s:2:"";s:3:"雗";s:2:"p";s:3:"雘";s:2:"t";s:3:"雙";s:2:"";s:3:"雚";s:2:"q";s:3:"雛";s:2:"";s:3:"雜";s:2:"";s:3:"雝";s:2:"u";s:3:"雞";s:2:"";s:3:"雟";s:2:"s";s:3:"雡";s:2:"y";s:3:"離";s:2:"";s:3:"難";s:2:"";s:3:"雥";s:2:"";s:3:"雨";s:2:"B";s:3:"雩";s:2:"";s:3:"雪";s:2:"";s:3:"雯";s:2:"";s:3:"雰";s:2:"ܨ";s:3:"雱";s:2:"ܧ";s:3:"雲";s:2:"";s:3:"雵";s:2:"";s:3:"零";s:2:"s";s:3:"雷";s:2:"p";s:3:"雸";s:2:"";s:3:"雹";s:2:"r";s:3:"雺";s:2:"";s:3:"電";s:2:"q";s:3:"雽";s:2:"";s:3:"雿";s:2:"";s:3:"需";s:2:"";s:3:"霂";s:2:"";s:3:"霄";s:2:"]";s:3:"霅";s:2:"";s:3:"霆";s:2:"^";s:3:"震";s:2:"_";s:3:"霈";s:2:"";s:3:"霉";s:2:"`";s:3:"霋";s:2:"Q";s:3:"霍";s:2:"N";s:3:"霎";s:2:"K";s:3:"霏";s:2:"P";s:3:"霐";s:2:"S";s:3:"霑";s:2:"L";s:3:"霒";s:2:"R";s:3:"霓";s:2:"O";s:3:"霖";s:2:"M";s:3:"霘";s:2:"";s:3:"霙";s:2:"";s:3:"霜";s:2:"";s:3:"霝";s:2:"";s:3:"霞";s:2:"";s:3:"霟";s:2:"";s:3:"霠";s:2:"";s:3:"霢";s:2:"w";s:3:"霣";s:2:"v";s:3:"霤";s:2:"";s:3:"霥";s:2:"x";s:3:"霦";s:2:"~";s:3:"霧";s:2:"";s:3:"霨";s:2:"}";s:3:"霩";s:2:"z";s:3:"霪";s:2:"";s:3:"霫";s:2:"{";s:3:"霬";s:2:"|";s:3:"霮";s:2:"H";s:3:"霯";s:2:"I";s:3:"霰";s:2:"";s:3:"露";s:2:"S";s:3:"霵";s:2:"n";s:3:"霸";s:2:"Q";s:3:"霹";s:2:"R";s:3:"霺";s:2:"o";s:3:"霽";s:2:"Ŵ";s:3:"霾";s:2:"ŵ";s:3:"霿";s:2:"q";s:3:"靂";s:2:"E";s:3:"靃";s:2:"";s:3:"靄";s:2:"G";s:3:"靆";s:2:"";s:3:"靇";s:2:"";s:3:"靈";s:2:"F";s:3:"靉";s:2:"W";s:3:"靋";s:2:"";s:3:"青";s:2:"C";s:3:"靖";s:2:"t";s:3:"靘";s:2:"";s:3:"靚";s:2:"";s:3:"靛";s:2:"Q";s:3:"靜";s:2:"R";s:3:"非";s:2:"D";s:3:"靠";s:2:"a";s:3:"靡";s:2:"";s:3:"面";s:2:"";s:3:"靦";s:2:"S";s:3:"靨";s:2:"";s:3:"革";s:2:"";s:3:"靪";s:2:"M";s:3:"靬";s:2:"ܩ";s:3:"靮";s:2:"ܫ";s:3:"靰";s:2:"ܪ";s:3:"靲";s:2:"";s:3:"靳";s:2:"";s:3:"靴";s:2:"u";s:3:"靶";s:2:"v";s:3:"靷";s:2:"";s:3:"靸";s:2:"";s:3:"靺";s:2:"";s:3:"靻";s:2:"";s:3:"靼";s:2:"";s:3:"靽";s:2:"";s:3:"靾";s:2:"";s:3:"靿";s:2:"";s:3:"鞀";s:2:"";s:3:"鞁";s:2:"";s:3:"鞂";s:2:"";s:3:"鞃";s:2:"";s:3:"鞄";s:2:"";s:3:"鞅";s:2:"";s:3:"鞈";s:2:"";s:3:"鞊";s:2:"";s:3:"鞋";s:2:"c";s:3:"鞍";s:2:"b";s:3:"鞎";s:2:"";s:3:"鞏";s:2:"d";s:3:"鞔";s:2:"V";s:3:"鞗";s:2:"U";s:3:"鞘";s:2:"T";s:3:"鞙";s:2:"T";s:3:"鞚";s:2:"";s:3:"鞜";s:2:"";s:3:"鞝";s:2:"A";s:3:"鞞";s:2:"@";s:3:"鞠";s:2:"";s:3:"鞡";s:2:"";s:3:"鞢";s:2:"";s:3:"鞣";s:2:"";s:3:"鞤";s:2:"}";s:3:"鞥";s:2:"";s:3:"鞦";s:2:"";s:3:"鞨";s:2:"{";s:3:"鞪";s:2:"~";s:3:"鞫";s:2:"|";s:3:"鞬";s:2:"y";s:3:"鞭";s:2:"@";s:3:"鞮";s:2:"z";s:3:"鞳";s:2:"";s:3:"鞶";s:2:"";s:3:"鞷";s:2:"";s:3:"鞹";s:2:"J";s:3:"鞻";s:2:"K";s:3:"鞿";s:2:"p";s:3:"韁";s:2:"ŷ";s:3:"韃";s:2:"Ŷ";s:3:"韄";s:2:"O";s:3:"韅";s:2:"P";s:3:"韆";s:2:"H";s:3:"韇";s:2:"";s:3:"韉";s:2:"i";s:3:"韋";s:2:"";s:3:"韌";s:2:"";s:3:"韍";s:2:"";s:3:"韎";s:2:"";s:3:"韏";s:2:"";s:3:"韐";s:2:"";s:3:"韓";s:2:"";s:3:"韔";s:2:"C";s:3:"韕";s:2:"B";s:3:"韖";s:2:"";s:3:"韗";s:2:"";s:3:"韘";s:2:"";s:3:"韙";s:2:"";s:3:"韜";s:2:"";s:3:"韝";s:2:"";s:3:"韞";s:2:"";s:3:"韟";s:2:"";s:3:"韡";s:2:"q";s:3:"韣";s:2:"r";s:3:"韥";s:2:"";s:3:"韭";s:2:"";s:3:"韰";s:2:"W";s:3:"韱";s:2:"D";s:3:"音";s:2:"";s:3:"韶";s:2:"";s:3:"韸";s:2:"X";s:3:"韹";s:2:"A";s:3:"韺";s:2:"";s:3:"韻";s:2:"";s:3:"韽";s:2:"L";s:3:"韾";s:2:"M";s:3:"響";s:2:"T";s:3:"頀";s:2:"Q";s:3:"頁";s:2:"";s:3:"頂";s:2:"";s:3:"頃";s:2:"";s:3:"頄";s:2:"N";s:3:"項";s:2:"";s:3:"順";s:2:"";s:3:"頇";s:2:"ܬ";s:3:"須";s:2:"";s:3:"頊";s:2:"z";s:3:"頌";s:2:"|";s:3:"頍";s:2:"";s:3:"頎";s:2:"";s:3:"頏";s:2:"";s:3:"預";s:2:"w";s:3:"頑";s:2:"x";s:3:"頒";s:2:"{";s:3:"頓";s:2:"y";s:3:"頖";s:2:"";s:3:"頗";s:2:"";s:3:"領";s:2:"";s:3:"頛";s:2:"";s:3:"頜";s:2:"g";s:3:"頝";s:2:"";s:3:"頞";s:2:"";s:3:"頠";s:2:"";s:3:"頡";s:2:"e";s:3:"頤";s:2:"[";s:3:"頦";s:2:"";s:3:"頧";s:2:"";s:3:"頨";s:2:"";s:3:"頩";s:2:"";s:3:"頫";s:2:"f";s:3:"頭";s:2:"Y";s:3:"頯";s:2:"Z";s:3:"頰";s:2:"U";s:3:"頲";s:2:"[";s:3:"頵";s:2:"Y";s:3:"頷";s:2:"X";s:3:"頸";s:2:"V";s:3:"頹";s:2:"Z";s:3:"頻";s:2:"W";s:3:"顁";s:2:"E";s:3:"顃";s:2:"J";s:3:"顄";s:2:"F";s:3:"顅";s:2:"I";s:3:"顆";s:2:"";s:3:"顈";s:2:"";s:3:"顉";s:2:"H";s:3:"顊";s:2:"G";s:3:"題";s:2:"D";s:3:"額";s:2:"B";s:3:"顎";s:2:"E";s:3:"顏";s:2:"C";s:3:"顐";s:2:"";s:3:"顑";s:2:"";s:3:"顒";s:2:"";s:3:"顓";s:2:"F";s:3:"顗";s:2:"";s:3:"願";s:2:"@";s:3:"顙";s:2:"";s:3:"顛";s:2:"A";s:3:"顜";s:2:"";s:3:"顝";s:2:"";s:3:"類";s:2:"";s:3:"顟";s:2:"Q";s:3:"顠";s:2:"N";s:3:"顢";s:2:"O";s:3:"顣";s:2:"P";s:3:"顤";s:2:"r";s:3:"顥";s:2:"V";s:3:"顧";s:2:"U";s:3:"顩";s:2:"t";s:3:"顪";s:2:"s";s:3:"顫";s:2:"Ÿ";s:3:"顯";s:2:"";s:3:"顰";s:2:"I";s:3:"顱";s:2:"`";s:3:"顲";s:2:"X";s:3:"顳";s:2:"";s:3:"顴";s:2:"";s:3:"風";s:2:"";s:3:"颩";s:2:"ܭ";s:3:"颬";s:2:"";s:3:"颭";s:2:"";s:3:"颮";s:2:"";s:3:"颯";s:2:"";s:3:"颱";s:2:"";s:3:"颲";s:2:"";s:3:"颳";s:2:"h";s:3:"颶";s:2:"";s:3:"颸";s:2:"";s:3:"颺";s:2:"G";s:3:"颻";s:2:"";s:3:"颼";s:2:"B";s:3:"颽";s:2:"";s:3:"颾";s:2:"";s:3:"颿";s:2:"";s:3:"飀";s:2:"u";s:3:"飁";s:2:"R";s:3:"飂";s:2:"S";s:3:"飄";s:2:"";s:3:"飆";s:2:"t";s:3:"飉";s:2:"s";s:3:"飋";s:2:"u";s:3:"飌";s:2:"";s:3:"飛";s:2:"";s:3:"食";s:2:"";s:3:"飢";s:2:"";s:3:"飣";s:2:"H";s:3:"飥";s:2:"O";s:3:"飧";s:2:"";s:3:"飩";s:2:"";s:3:"飪";s:2:"";s:3:"飫";s:2:"ܮ";s:3:"飭";s:2:"";s:3:"飯";s:2:"";s:3:"飲";s:2:"";s:3:"飴";s:2:"~";s:3:"飶";s:2:"";s:3:"飹";s:2:"";s:3:"飺";s:2:"";s:3:"飼";s:2:"}";s:3:"飽";s:2:"";s:3:"飾";s:2:"";s:3:"餀";s:2:"";s:3:"餂";s:2:"";s:3:"餃";s:2:"";s:3:"餅";s:2:"";s:3:"餇";s:2:"";s:3:"餈";s:2:"";s:3:"餉";s:2:"";s:3:"養";s:2:"i";s:3:"餌";s:2:"";s:3:"餐";s:2:"\";s:3:"餑";s:2:"";s:3:"餒";s:2:"k";s:3:"餓";s:2:"j";s:3:"餔";s:2:"";s:3:"餕";s:2:"";s:3:"餖";s:2:"";s:3:"餗";s:2:"";s:3:"餘";s:2:"l";s:3:"餚";s:2:"a";s:3:"餛";s:2:"_";s:3:"餞";s:2:"^";s:3:"餟";s:2:"]";s:3:"餡";s:2:"`";s:3:"餤";s:2:"\";s:3:"餥";s:2:"K";s:3:"餧";s:2:"^";s:3:"館";s:2:"]";s:3:"餩";s:2:"_";s:3:"餪";s:2:"N";s:3:"餫";s:2:"L";s:3:"餬";s:2:"M";s:3:"餭";s:2:"R";s:3:"餮";s:2:"K";s:3:"餯";s:2:"Q";s:3:"餰";s:2:"T";s:3:"餱";s:2:"S";s:3:"餲";s:2:"P";s:3:"餳";s:2:"O";s:3:"餵";s:2:"";s:3:"餺";s:2:"";s:3:"餼";s:2:"";s:3:"餽";s:2:"J";s:3:"餾";s:2:"H";s:3:"餿";s:2:"I";s:3:"饁";s:2:"";s:3:"饃";s:2:"";s:3:"饅";s:2:"C";s:3:"饇";s:2:"";s:3:"饈";s:2:"";s:3:"饉";s:2:"D";s:3:"饋";s:2:"X";s:3:"饌";s:2:"W";s:3:"饎";s:2:"U";s:3:"饐";s:2:"T";s:3:"饑";s:2:"";s:3:"饒";s:2:"";s:3:"饓";s:2:"Y";s:3:"饔";s:2:"v";s:3:"饕";s:2:"Ź";s:3:"饖";s:2:"w";s:3:"饗";s:2:"W";s:3:"饘";s:2:"v";s:3:"饙";s:2:"V";s:3:"饛";s:2:"w";s:3:"饜";s:2:"";s:3:"饞";s:2:"a";s:3:"饟";s:2:"Y";s:3:"饡";s:2:"";s:3:"首";s:2:"";s:3:"馗";s:2:"P";s:3:"馘";s:2:"U";s:3:"香";s:2:"";s:3:"馜";s:2:"";s:3:"馝";s:2:"";s:3:"馞";s:2:"`";s:3:"馡";s:2:"W";s:3:"馣";s:2:"V";s:3:"馥";s:2:"L";s:3:"馦";s:2:"";s:3:"馧";s:2:"";s:3:"馨";s:2:"";s:3:"馫";s:2:"";s:3:"馬";s:2:"";s:3:"馭";s:2:"";s:3:"馮";s:2:"";s:3:"馯";s:2:"";s:3:"馰";s:2:"";s:3:"馱";s:2:"";s:3:"馲";s:2:"";s:3:"馳";s:2:"";s:3:"馴";s:2:"";s:3:"馵";s:2:"";s:3:"馹";s:2:"";s:3:"馺";s:2:"";s:3:"馻";s:2:"";s:3:"馽";s:2:"";s:3:"駁";s:2:"";s:3:"駂";s:2:"";s:3:"駃";s:2:"";s:3:"駇";s:2:"";s:3:"駉";s:2:"";s:3:"駋";s:2:"";s:3:"駌";s:2:"";s:3:"駍";s:2:"";s:3:"駎";s:2:"";s:3:"駏";s:2:"";s:3:"駐";s:2:"n";s:3:"駑";s:2:"q";s:3:"駒";s:2:"s";s:3:"駓";s:2:"";s:3:"駔";s:2:"";s:3:"駕";s:2:"r";s:3:"駖";s:2:"";s:3:"駗";s:2:"";s:3:"駘";s:2:"";s:3:"駙";s:2:"t";s:3:"駛";s:2:"p";s:3:"駜";s:2:"";s:3:"駝";s:2:"m";s:3:"駟";s:2:"o";s:3:"駢";s:2:"c";s:3:"駣";s:2:"f";s:3:"駤";s:2:"d";s:3:"駥";s:2:"c";s:3:"駧";s:2:"i";s:3:"駩";s:2:"h";s:3:"駪";s:2:"g";s:3:"駬";s:2:"b";s:3:"駭";s:2:"b";s:3:"駮";s:2:"a";s:3:"駰";s:2:"e";s:3:"駱";s:2:"d";s:3:"駴";s:2:"Z";s:3:"駶";s:2:"^";s:3:"駷";s:2:"[";s:3:"駸";s:2:"]";s:3:"駹";s:2:"\";s:3:"駺";s:2:"Y";s:3:"駻";s:2:"_";s:3:"駼";s:2:"b";s:3:"駽";s:2:"`";s:3:"駾";s:2:"a";s:3:"駿";s:2:"@";s:3:"騁";s:2:"";s:3:"騂";s:2:"X";s:3:"騃";s:2:"c";s:3:"騄";s:2:"";s:3:"騅";s:2:"";s:3:"騆";s:2:"";s:3:"騇";s:2:"";s:3:"騉";s:2:"";s:3:"騊";s:2:"";s:3:"騋";s:2:"";s:3:"騍";s:2:"";s:3:"騎";s:2:"M";s:3:"騏";s:2:"";s:3:"騑";s:2:"";s:3:"騔";s:2:"";s:3:"騕";s:2:"";s:3:"騖";s:2:"E";s:3:"騙";s:2:"F";s:3:"騚";s:2:"";s:3:"騛";s:2:"";s:3:"騜";s:2:"";s:3:"騝";s:2:"";s:3:"騞";s:2:"";s:3:"騠";s:2:"";s:3:"騢";s:2:"";s:3:"騣";s:2:"";s:3:"騤";s:2:"";s:3:"騥";s:2:"";s:3:"騧";s:2:"";s:3:"騩";s:2:"`";s:3:"騪";s:2:"^";s:3:"騫";s:2:"";s:3:"騬";s:2:"]";s:3:"騭";s:2:"c";s:3:"騮";s:2:"a";s:3:"騰";s:2:"";s:3:"騱";s:2:"\";s:3:"騲";s:2:"Z";s:3:"騴";s:2:"[";s:3:"騵";s:2:"";s:3:"騶";s:2:"_";s:3:"騷";s:2:"";s:3:"騸";s:2:"b";s:3:"騹";s:2:"x";s:3:"騺";s:2:"~";s:3:"騽";s:2:"y";s:3:"騾";s:2:"[";s:3:"騿";s:2:"";s:3:"驀";s:2:"Z";s:3:"驁";s:2:"}";s:3:"驂";s:2:"|";s:3:"驃";s:2:"Y";s:3:"驄";s:2:"{";s:3:"驅";s:2:"X";s:3:"驆";s:2:"z";s:3:"驈";s:2:"}";s:3:"驉";s:2:"";s:3:"驊";s:2:"~";s:3:"驌";s:2:"{";s:3:"驍";s:2:"Ż";s:3:"驎";s:2:"x";s:3:"驏";s:2:"|";s:3:"驐";s:2:"";s:3:"驒";s:2:"";s:3:"驓";s:2:"y";s:3:"驔";s:2:"z";s:3:"驕";s:2:"ź";s:3:"驖";s:2:"R";s:3:"驗";s:2:"";s:3:"驙";s:2:"S";s:3:"驚";s:2:"";s:3:"驛";s:2:"";s:3:"驞";s:2:"";s:3:"驟";s:2:"J";s:3:"驠";s:2:"v";s:3:"驢";s:2:"j";s:3:"驤";s:2:"";s:3:"驥";s:2:"k";s:3:"驦";s:2:"";s:3:"驧";s:2:"";s:3:"驨";s:2:"";s:3:"驩";s:2:"";s:3:"驪";s:2:"z";s:3:"驫";s:2:"";s:3:"骨";s:2:"";s:3:"骫";s:2:"";s:3:"骭";s:2:"";s:3:"骯";s:2:"";s:3:"骰";s:2:"";s:3:"骱";s:2:"";s:3:"骳";s:2:"";s:3:"骴";s:2:"l";s:3:"骷";s:2:"u";s:3:"骸";s:2:"e";s:3:"骹";s:2:"j";s:3:"骻";s:2:"m";s:3:"骼";s:2:"f";s:3:"骾";s:2:"d";s:3:"骿";s:2:"k";s:3:"髀";s:2:"";s:3:"髁";s:2:"N";s:3:"髂";s:2:"";s:3:"髆";s:2:"f";s:3:"髇";s:2:"d";s:3:"髊";s:2:"e";s:3:"髍";s:2:"";s:3:"髏";s:2:"\";s:3:"髐";s:2:"";s:3:"髑";s:2:"";s:3:"髒";s:2:"ż";s:3:"髓";s:2:"";s:3:"體";s:2:"";s:3:"髕";s:2:"";s:3:"髖";s:2:"b";s:3:"高";s:2:"";s:3:"髜";s:2:"";s:3:"髟";s:2:"I";s:3:"髡";s:2:"";s:3:"髣";s:2:"";s:3:"髦";s:2:"";s:3:"髧";s:2:"";s:3:"髫";s:2:"";s:3:"髬";s:2:"";s:3:"髭";s:2:"h";s:3:"髮";s:2:"v";s:3:"髯";s:2:"w";s:3:"髱";s:2:"";s:3:"髲";s:2:"";s:3:"髳";s:2:"";s:3:"髶";s:2:"n";s:3:"髷";s:2:"q";s:3:"髹";s:2:"p";s:3:"髺";s:2:"o";s:3:"髻";s:2:"g";s:3:"髼";s:2:"h";s:3:"髽";s:2:"f";s:3:"髾";s:2:"e";s:3:"鬁";s:2:"g";s:3:"鬃";s:2:"O";s:3:"鬄";s:2:"";s:3:"鬅";s:2:"";s:3:"鬆";s:2:"P";s:3:"鬈";s:2:"";s:3:"鬊";s:2:"";s:3:"鬋";s:2:"";s:3:"鬌";s:2:"";s:3:"鬍";s:2:"G";s:3:"鬎";s:2:"";s:3:"鬐";s:2:"g";s:3:"鬑";s:2:"i";s:3:"鬒";s:2:"h";s:3:"鬕";s:2:"";s:3:"鬖";s:2:"";s:3:"鬗";s:2:"";s:3:"鬘";s:2:"";s:3:"鬙";s:2:"";s:3:"鬚";s:2:"Ž";s:3:"鬞";s:2:"T";s:3:"鬟";s:2:"U";s:3:"鬠";s:2:"V";s:3:"鬢";s:2:"K";s:3:"鬣";s:2:"c";s:3:"鬤";s:2:"";s:3:"鬥";s:2:"";s:3:"鬧";s:2:"x";s:3:"鬨";s:2:"i";s:3:"鬩";s:2:"";s:3:"鬫";s:2:"";s:3:"鬮";s:2:"";s:3:"鬯";s:2:"J";s:3:"鬱";s:2:"{";s:3:"鬲";s:2:"";s:3:"鬳";s:2:"r";s:3:"鬵";s:2:"";s:3:"鬷";s:2:"";s:3:"鬺";s:2:"";s:3:"鬻";s:2:"";s:3:"鬼";s:2:"";s:3:"鬾";s:2:"";s:3:"鬿";s:2:"";s:3:"魁";s:2:"";s:3:"魂";s:2:"";s:3:"魃";s:2:"";s:3:"魄";s:2:"z";s:3:"魅";s:2:"y";s:3:"魆";s:2:"";s:3:"魈";s:2:"i";s:3:"魊";s:2:"";s:3:"魋";s:2:"";s:3:"魌";s:2:"";s:3:"魍";s:2:"S";s:3:"魎";s:2:"R";s:3:"魏";s:2:"Q";s:3:"魑";s:2:"^";s:3:"魒";s:2:"";s:3:"魔";s:2:"]";s:3:"魕";s:2:"";s:3:"魖";s:2:"";s:3:"魘";s:2:"L";s:3:"魙";s:2:"";s:3:"魚";s:2:"";s:3:"魛";s:2:"";s:3:"魟";s:2:"";s:3:"魠";s:2:"";s:3:"魡";s:2:"";s:3:"魤";s:2:"";s:3:"魦";s:2:"";s:3:"魧";s:2:"";s:3:"魨";s:2:"";s:3:"魬";s:2:"";s:3:"魯";s:2:"|";s:3:"魰";s:2:"";s:3:"魱";s:2:"";s:3:"魴";s:2:"";s:3:"魵";s:2:"";s:3:"魶";s:2:"";s:3:"魷";s:2:"{";s:3:"魺";s:2:"}";s:3:"魻";s:2:"x";s:3:"魼";s:2:"v";s:3:"魽";s:2:"";s:3:"魾";s:2:"w";s:3:"鮀";s:2:"s";s:3:"鮂";s:2:"y";s:3:"鮅";s:2:"t";s:3:"鮆";s:2:"r";s:3:"鮇";s:2:"u";s:3:"鮈";s:2:"";s:3:"鮐";s:2:"|";s:3:"鮑";s:2:"j";s:3:"鮒";s:2:"{";s:3:"鮓";s:2:"z";s:3:"鮕";s:2:"~";s:3:"鮚";s:2:"j";s:3:"鮛";s:2:"m";s:3:"鮞";s:2:"l";s:3:"鮠";s:2:"t";s:3:"鮡";s:2:"o";s:3:"鮢";s:2:"s";s:3:"鮤";s:2:"q";s:3:"鮥";s:2:"p";s:3:"鮦";s:2:"n";s:3:"鮨";s:2:"k";s:3:"鮪";s:2:"C";s:3:"鮫";s:2:"B";s:3:"鮭";s:2:"D";s:3:"鮮";s:2:"A";s:3:"鮯";s:2:"u";s:3:"鮵";s:2:"";s:3:"鮶";s:2:"";s:3:"鮸";s:2:"";s:3:"鮹";s:2:"";s:3:"鮽";s:2:"";s:3:"鮿";s:2:"";s:3:"鯀";s:2:"X";s:3:"鯁";s:2:"";s:3:"鯃";s:2:"";s:3:"鯄";s:2:"";s:3:"鯆";s:2:"";s:3:"鯇";s:2:"";s:3:"鯈";s:2:"W";s:3:"鯉";s:2:"U";s:3:"鯊";s:2:"T";s:3:"鯓";s:2:"";s:3:"鯔";s:2:"";s:3:"鯕";s:2:"";s:3:"鯖";s:2:"J";s:3:"鯗";s:2:"";s:3:"鯙";s:2:"";s:3:"鯚";s:2:"";s:3:"鯛";s:2:"K";s:3:"鯜";s:2:"";s:3:"鯞";s:2:"";s:3:"鯠";s:2:"";s:3:"鯡";s:2:"";s:3:"鯢";s:2:"";s:3:"鯤";s:2:"";s:3:"鯥";s:2:"";s:3:"鯦";s:2:"";s:3:"鯧";s:2:"I";s:3:"鯨";s:2:"H";s:3:"鯪";s:2:"";s:3:"鯫";s:2:"";s:3:"鯬";s:2:"";s:3:"鯰";s:2:"";s:3:"鯷";s:2:"l";s:3:"鯸";s:2:"o";s:3:"鯽";s:2:"V";s:3:"鰅";s:2:"m";s:3:"鰆";s:2:"s";s:3:"鰇";s:2:"q";s:3:"鰈";s:2:"k";s:3:"鰉";s:2:"v";s:3:"鰋";s:2:"j";s:3:"鰍";s:2:"";s:3:"鰎";s:2:"r";s:3:"鰒";s:2:"n";s:3:"鰓";s:2:"";s:3:"鰔";s:2:"u";s:3:"鰗";s:2:"t";s:3:"鰜";s:2:"";s:3:"鰝";s:2:"";s:3:"鰡";s:2:"";s:3:"鰣";s:2:"";s:3:"鰤";s:2:"";s:3:"鰥";s:2:"`";s:3:"鰨";s:2:"";s:3:"鰩";s:2:"";s:3:"鰫";s:2:"";s:3:"鰬";s:2:"";s:3:"鰭";s:2:"_";s:3:"鰱";s:2:"ſ";s:3:"鰲";s:2:"";s:3:"鰳";s:2:"";s:3:"鰴";s:2:"";s:3:"鰶";s:2:"";s:3:"鰷";s:2:"";s:3:"鰹";s:2:"";s:3:"鰻";s:2:"";s:3:"鰼";s:2:"";s:3:"鰽";s:2:"";s:3:"鰾";s:2:"";s:3:"鰿";s:2:"";s:3:"鱀";s:2:"p";s:3:"鱁";s:2:"";s:3:"鱄";s:2:"";s:3:"鱆";s:2:"";s:3:"鱈";s:2:"";s:3:"鱉";s:2:"ž";s:3:"鱊";s:2:"Z";s:3:"鱋";s:2:"\";s:3:"鱌";s:2:"_";s:3:"鱍";s:2:"[";s:3:"鱎";s:2:"`";s:3:"鱐";s:2:"Y";s:3:"鱒";s:2:"W";s:3:"鱔";s:2:"";s:3:"鱕";s:2:"]";s:3:"鱖";s:2:"";s:3:"鱗";s:2:"";s:3:"鱘";s:2:"X";s:3:"鱙";s:2:"^";s:3:"鱞";s:2:"";s:3:"鱟";s:2:"M";s:3:"鱠";s:2:"";s:3:"鱢";s:2:"";s:3:"鱣";s:2:"";s:3:"鱦";s:2:"";s:3:"鱧";s:2:"";s:3:"鱨";s:2:"Z";s:3:"鱭";s:2:"\";s:3:"鱮";s:2:"[";s:3:"鱱";s:2:"y";s:3:"鱳";s:2:"x";s:3:"鱴";s:2:"w";s:3:"鱵";s:2:"z";s:3:"鱷";s:2:"s";s:3:"鱸";s:2:"t";s:3:"鱹";s:2:"";s:3:"鱺";s:2:"";s:3:"鳥";s:2:"";s:3:"鳦";s:2:"ܯ";s:3:"鳧";s:2:"";s:3:"鳩";s:2:"";s:3:"鳪";s:2:"";s:3:"鳭";s:2:"";s:3:"鳱";s:2:"";s:3:"鳲";s:2:"";s:3:"鳳";s:2:"";s:3:"鳴";s:2:"";s:3:"鳵";s:2:"";s:3:"鳶";s:2:"";s:3:"鳷";s:2:"";s:3:"鳹";s:2:"";s:3:"鳺";s:2:"";s:3:"鳻";s:2:"";s:3:"鳼";s:2:"";s:3:"鳽";s:2:"";s:3:"鳿";s:2:"";s:3:"鴀";s:2:"";s:3:"鴃";s:2:"";s:3:"鴄";s:2:"";s:3:"鴅";s:2:"";s:3:"鴆";s:2:"}";s:3:"鴇";s:2:"";s:3:"鴈";s:2:"";s:3:"鴉";s:2:"~";s:3:"鴐";s:2:"";s:3:"鴒";s:2:"o";s:3:"鴔";s:2:"";s:3:"鴕";s:2:"k";s:3:"鴗";s:2:"";s:3:"鴘";s:2:"";s:3:"鴙";s:2:"";s:3:"鴛";s:2:"p";s:3:"鴝";s:2:"";s:3:"鴞";s:2:"";s:3:"鴟";s:2:"";s:3:"鴠";s:2:"";s:3:"鴢";s:2:"";s:3:"鴣";s:2:"l";s:3:"鴥";s:2:"";s:3:"鴦";s:2:"m";s:3:"鴨";s:2:"n";s:3:"鴩";s:2:"";s:3:"鴭";s:2:"";s:3:"鴮";s:2:"z";s:3:"鴯";s:2:"{";s:3:"鴰";s:2:"~";s:3:"鴱";s:2:"|";s:3:"鴳";s:2:"v";s:3:"鴶";s:2:"y";s:3:"鴷";s:2:"";s:3:"鴸";s:2:"}";s:3:"鴻";s:2:"E";s:3:"鴽";s:2:"";s:3:"鴾";s:2:"";s:3:"鴿";s:2:"F";s:3:"鵀";s:2:"";s:3:"鵁";s:2:"w";s:3:"鵂";s:2:"";s:3:"鵃";s:2:"";s:3:"鵅";s:2:"";s:3:"鵊";s:2:"";s:3:"鵋";s:2:"";s:3:"鵌";s:2:"";s:3:"鵏";s:2:"";s:3:"鵑";s:2:"Y";s:3:"鵒";s:2:"";s:3:"鵓";s:2:"";s:3:"鵔";s:2:"";s:3:"鵖";s:2:"";s:3:"鵗";s:2:"";s:3:"鵘";s:2:"";s:3:"鵙";s:2:"";s:3:"鵚";s:2:"";s:3:"鵛";s:2:"";s:3:"鵜";s:2:"";s:3:"鵝";s:2:"Z";s:3:"鵟";s:2:"";s:3:"鵠";s:2:"[";s:3:"鵡";s:2:"M";s:3:"鵧";s:2:"x";s:3:"鵨";s:2:"";s:3:"鵩";s:2:"";s:3:"鵪";s:2:"O";s:3:"鵫";s:2:"";s:3:"鵬";s:2:"P";s:3:"鵯";s:2:"";s:3:"鵰";s:2:"";s:3:"鵱";s:2:"";s:3:"鵲";s:2:"N";s:3:"鵳";s:2:"";s:3:"鵴";s:2:"";s:3:"鵵";s:2:"";s:3:"鵷";s:2:"";s:3:"鵸";s:2:"";s:3:"鵹";s:2:"";s:3:"鵻";s:2:"";s:3:"鵽";s:2:"";s:3:"鵿";s:2:"";s:3:"鶀";s:2:"";s:3:"鶁";s:2:"";s:3:"鶂";s:2:"";s:3:"鶄";s:2:"";s:3:"鶅";s:2:"";s:3:"鶆";s:2:"";s:3:"鶇";s:2:"";s:3:"鶈";s:2:"";s:3:"鶉";s:2:"L";s:3:"鶊";s:2:"";s:3:"鶋";s:2:"";s:3:"鶌";s:2:"";s:3:"鶐";s:2:"}";s:3:"鶒";s:2:"{";s:3:"鶔";s:2:"";s:3:"鶖";s:2:"";s:3:"鶗";s:2:"";s:3:"鶘";s:2:"|";s:3:"鶙";s:2:"x";s:3:"鶚";s:2:"";s:3:"鶛";s:2:"~";s:3:"鶜";s:2:"";s:3:"鶝";s:2:"z";s:3:"鶞";s:2:"";s:3:"鶟";s:2:"w";s:3:"鶠";s:2:"";s:3:"鶡";s:2:"";s:3:"鶢";s:2:"";s:3:"鶣";s:2:"";s:3:"鶤";s:2:"y";s:3:"鶦";s:2:"";s:3:"鶧";s:2:"";s:3:"鶨";s:2:"";s:3:"鶩";s:2:"";s:3:"鶪";s:2:"";s:3:"鶬";s:2:"";s:3:"鶭";s:2:"";s:3:"鶯";s:2:"a";s:3:"鶱";s:2:"";s:3:"鶲";s:2:"";s:3:"鶳";s:2:"";s:3:"鶴";s:2:"b";s:3:"鶵";s:2:"";s:3:"鶶";s:2:"";s:3:"鶷";s:2:"";s:3:"鶸";s:2:"d";s:3:"鶹";s:2:"";s:3:"鶺";s:2:"";s:3:"鶻";s:2:"";s:3:"鶼";s:2:"";s:3:"鶾";s:2:"";s:3:"鶿";s:2:"";s:3:"鷁";s:2:"";s:3:"鷂";s:2:"c";s:3:"鷃";s:2:"";s:3:"鷅";s:2:"";s:3:"鷇";s:2:"";s:3:"鷈";s:2:"";s:3:"鷊";s:2:"";s:3:"鷋";s:2:"";s:3:"鷌";s:2:"";s:3:"鷍";s:2:"";s:3:"鷎";s:2:"";s:3:"鷏";s:2:"";s:3:"鷐";s:2:"";s:3:"鷑";s:2:"";s:3:"鷒";s:2:"";s:3:"鷓";s:2:"";s:3:"鷕";s:2:"";s:3:"鷖";s:2:"";s:3:"鷗";s:2:"";s:3:"鷘";s:2:"";s:3:"鷙";s:2:"";s:3:"鷚";s:2:"";s:3:"鷛";s:2:"";s:3:"鷜";s:2:"";s:3:"鷝";s:2:"";s:3:"鷞";s:2:"";s:3:"鷟";s:2:"";s:3:"鷡";s:2:"i";s:3:"鷢";s:2:"n";s:3:"鷣";s:2:"d";s:3:"鷤";s:2:"g";s:3:"鷥";s:2:"";s:3:"鷦";s:2:"k";s:3:"鷨";s:2:"r";s:3:"鷩";s:2:"";s:3:"鷫";s:2:"e";s:3:"鷬";s:2:"o";s:3:"鷭";s:2:"s";s:3:"鷮";s:2:"j";s:3:"鷯";s:2:"c";s:3:"鷰";s:2:"m";s:3:"鷲";s:2:"l";s:3:"鷳";s:2:"q";s:3:"鷴";s:2:"p";s:3:"鷵";s:2:"";s:3:"鷶";s:2:"h";s:3:"鷷";s:2:"b";s:3:"鷸";s:2:"f";s:3:"鷹";s:2:"N";s:3:"鷺";s:2:"O";s:3:"鷻";s:2:"a";s:3:"鷽";s:2:"";s:3:"鷾";s:2:"";s:3:"鷿";s:2:"";s:3:"鸀";s:2:"";s:3:"鸁";s:2:"";s:3:"鸂";s:2:"";s:3:"鸃";s:2:"";s:3:"鸄";s:2:"";s:3:"鸅";s:2:"";s:3:"鸆";s:2:"";s:3:"鸇";s:2:"";s:3:"鸉";s:2:"";s:3:"鸋";s:2:"]";s:3:"鸍";s:2:"^";s:3:"鸏";s:2:"`";s:3:"鸐";s:2:"_";s:3:"鸑";s:2:"b";s:3:"鸒";s:2:"a";s:3:"鸓";s:2:"|";s:3:"鸔";s:2:"{";s:3:"鸕";s:2:"";s:3:"鸗";s:2:"";s:3:"鸙";s:2:"";s:3:"鸚";s:2:"x";s:3:"鸛";s:2:"|";s:3:"鸝";s:2:"";s:3:"鸞";s:2:"}";s:3:"鹵";s:2:"";s:3:"鹹";s:2:"";s:3:"鹺";s:2:"";s:3:"鹼";s:2:"P";s:3:"鹽";s:2:"Q";s:3:"鹿";s:2:"";s:3:"麀";s:2:"";s:3:"麂";s:2:"";s:3:"麃";s:2:"";s:3:"麆";s:2:"";s:3:"麇";s:2:"";s:3:"麈";s:2:"";s:3:"麉";s:2:"";s:3:"麊";s:2:"";s:3:"麋";s:2:"G";s:3:"麌";s:2:"";s:3:"麍";s:2:"";s:3:"麎";s:2:"";s:3:"麑";s:2:"";s:3:"麒";s:2:"Q";s:3:"麓";s:2:"S";s:3:"麔";s:2:"";s:3:"麗";s:2:"R";s:3:"麙";s:2:"";s:3:"麚";s:2:"";s:3:"麛";s:2:"";s:3:"麜";s:2:"";s:3:"麝";s:2:"e";s:3:"麟";s:2:"";s:3:"麠";s:2:"";s:3:"麡";s:2:"c";s:3:"麤";s:2:"";s:3:"麥";s:2:"";s:3:"麧";s:2:"";s:3:"麩";s:2:"";s:3:"麭";s:2:"";s:3:"麮";s:2:"";s:3:"麰";s:2:"";s:3:"麴";s:2:"T";s:3:"麵";s:2:"";s:3:"麶";s:2:"";s:3:"麷";s:2:"";s:3:"麻";s:2:"";s:3:"麼";s:2:"";s:3:"麾";s:2:"";s:3:"黀";s:2:"";s:3:"黂";s:2:"t";s:3:"黃";s:2:"";s:3:"黈";s:2:"";s:3:"黌";s:2:"d";s:3:"黍";s:2:"";s:3:"黎";s:2:"";s:3:"黏";s:2:"H";s:3:"黐";s:2:"u";s:3:"黑";s:2:"";s:3:"黓";s:2:"";s:3:"黔";s:2:"r";s:3:"黕";s:2:"";s:3:"黖";s:2:"";s:3:"默";s:2:"q";s:3:"黚";s:2:"";s:3:"黛";s:2:"L";s:3:"黜";s:2:"J";s:3:"黝";s:2:"K";s:3:"點";s:2:"I";s:3:"黟";s:2:"";s:3:"黠";s:2:"\";s:3:"黤";s:2:"";s:3:"黥";s:2:"";s:3:"黦";s:2:"";s:3:"黧";s:2:"";s:3:"黨";s:2:"";s:3:"黫";s:2:"";s:3:"黭";s:2:"";s:3:"黮";s:2:"";s:3:"黯";s:2:"f";s:3:"黰";s:2:"";s:3:"黲";s:2:"v";s:3:"黳";s:2:"w";s:3:"黴";s:2:"";s:3:"黵";s:2:"d";s:3:"黶";s:2:"}";s:3:"黷";s:2:"u";s:3:"黹";s:2:"ܰ";s:3:"黺";s:2:"";s:3:"黻";s:2:"";s:3:"黼";s:2:"";s:3:"黽";s:2:"";s:3:"黿";s:2:"";s:3:"鼀";s:2:"";s:3:"鼁";s:2:"";s:3:"鼆";s:2:"x";s:3:"鼇";s:2:"R";s:3:"鼉";s:2:"e";s:3:"鼊";s:2:"~";s:3:"鼎";s:2:"";s:3:"鼏";s:2:"";s:3:"鼐";s:2:"";s:3:"鼒";s:2:"";s:3:"鼓";s:2:"";s:3:"鼕";s:2:"]";s:3:"鼖";s:2:"";s:3:"鼘";s:2:"";s:3:"鼙";s:2:"g";s:3:"鼚";s:2:"";s:3:"鼛";s:2:"";s:3:"鼜";s:2:"y";s:3:"鼞";s:2:"";s:3:"鼠";s:2:"";s:3:"鼢";s:2:"";s:3:"鼣";s:2:"";s:3:"鼤";s:2:"";s:3:"鼥";s:2:"";s:3:"鼨";s:2:"";s:3:"鼩";s:2:"";s:3:"鼪";s:2:"";s:3:"鼫";s:2:"";s:3:"鼬";s:2:"^";s:3:"鼭";s:2:"";s:3:"鼮";s:2:"";s:3:"鼯";s:2:"";s:3:"鼰";s:2:"";s:3:"鼱";s:2:"";s:3:"鼲";s:2:"";s:3:"鼳";s:2:"";s:3:"鼴";s:2:"";s:3:"鼵";s:2:"";s:3:"鼶";s:2:"|";s:3:"鼷";s:2:"{";s:3:"鼸";s:2:"z";s:3:"鼻";s:2:"";s:3:"鼽";s:2:"";s:3:"鼾";s:2:"M";s:3:"齀";s:2:"";s:3:"齁";s:2:"";s:3:"齂";s:2:"";s:3:"齃";s:2:"}";s:3:"齆";s:2:"";s:3:"齇";s:2:"f";s:3:"齈";s:2:"";s:3:"齉";s:2:"";s:3:"齊";s:2:"";s:3:"齋";s:2:"N";s:3:"齌";s:2:"";s:3:"齍";s:2:"";s:3:"齎";s:2:"";s:3:"齏";s:2:"~";s:3:"齒";s:2:"";s:3:"齔";s:2:"";s:3:"齕";s:2:"";s:3:"齖";s:2:"";s:3:"齗";s:2:"";s:3:"齘";s:2:"";s:3:"齙";s:2:"";s:3:"齛";s:2:"";s:3:"齜";s:2:"h";s:3:"齝";s:2:"";s:3:"齞";s:2:"";s:3:"齟";s:2:"";s:3:"齠";s:2:"";s:3:"齡";s:2:"";s:3:"齣";s:2:"";s:3:"齤";s:2:"";s:3:"齥";s:2:"";s:3:"齦";s:2:"i";s:3:"齧";s:2:"j";s:3:"齪";s:2:"";s:3:"齫";s:2:"";s:3:"齬";s:2:"";s:3:"齮";s:2:"";s:3:"齯";s:2:"";s:3:"齰";s:2:"";s:3:"齱";s:2:"";s:3:"齲";s:2:"T";s:3:"齴";s:2:"";s:3:"齵";s:2:"";s:3:"齶";s:2:"";s:3:"齷";s:2:"S";s:3:"齸";s:2:"g";s:3:"齹";s:2:"j";s:3:"齺";s:2:"i";s:3:"齻";s:2:"h";s:3:"齾";s:2:"";s:3:"龍";s:2:"s";s:3:"龐";s:2:"e";s:3:"龑";s:2:"";s:3:"龒";s:2:"";s:3:"龔";s:2:"";s:3:"龕";s:2:"";s:3:"龘";s:2:"";s:3:"龜";s:2:"t";s:3:"龠";s:2:"";s:3:"龢";s:2:"";s:3:"龤";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"ơ";s:3:"";s:2:"Ƣ";s:3:"";s:2:"ƣ";s:3:"";s:2:"Ƥ";s:3:"";s:2:"ƥ";s:3:"";s:2:"Ʀ";s:3:"";s:2:"Ƨ";s:3:"";s:2:"ƨ";s:3:"";s:2:"Ʃ";s:3:"";s:2:"ƪ";s:3:"";s:2:"ƫ";s:3:"";s:2:"Ƭ";s:3:"";s:2:"ƭ";s:3:"";s:2:"Ʈ";s:3:"";s:2:"Ư";s:3:"";s:2:"ư";s:3:"";s:2:"Ʊ";s:3:"";s:2:"Ʋ";s:3:"";s:2:"Ƴ";s:3:"";s:2:"ƴ";s:3:"";s:2:"Ƶ";s:3:"";s:2:"ƶ";s:3:"";s:2:"Ʒ";s:3:"";s:2:"Ƹ";s:3:"";s:2:"ƹ";s:3:"";s:2:"ƺ";s:3:"";s:2:"ƻ";s:3:"";s:2:"Ƽ";s:3:"";s:2:"ƽ";s:3:"";s:2:"ƾ";s:3:"";s:2:"ƿ";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"ǡ";s:3:"";s:2:"Ǣ";s:3:"";s:2:"ǣ";s:3:"";s:2:"Ǥ";s:3:"";s:2:"ǥ";s:3:"";s:2:"Ǧ";s:3:"";s:2:"ǧ";s:3:"";s:2:"Ǩ";s:3:"";s:2:"ǩ";s:3:"";s:2:"Ǫ";s:3:"";s:2:"ǫ";s:3:"";s:2:"Ǭ";s:3:"";s:2:"ǭ";s:3:"";s:2:"Ǯ";s:3:"";s:2:"ǯ";s:3:"";s:2:"ǰ";s:3:"";s:2:"Ǳ";s:3:"";s:2:"ǲ";s:3:"";s:2:"ǳ";s:3:"";s:2:"Ǵ";s:3:"";s:2:"ǵ";s:3:"";s:2:"Ƕ";s:3:"";s:2:"Ƿ";s:3:"";s:2:"Ǹ";s:3:"";s:2:"ǹ";s:3:"";s:2:"Ǻ";s:3:"";s:2:"ǻ";s:3:"";s:2:"Ǽ";s:3:"";s:2:"ǽ";s:3:"";s:2:"Ǿ";s:3:"";s:2:"ǿ";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"@";s:3:"";s:2:"A";s:3:"";s:2:"B";s:3:"";s:2:"C";s:3:"";s:2:"D";s:3:"";s:2:"E";s:3:"";s:2:"F";s:3:"";s:2:"G";s:3:"";s:2:"H";s:3:"";s:2:"I";s:3:"";s:2:"J";s:3:"";s:2:"K";s:3:"";s:2:"L";s:3:"";s:2:"M";s:3:"";s:2:"N";s:3:"";s:2:"O";s:3:"";s:2:"P";s:3:"";s:2:"Q";s:3:"";s:2:"R";s:3:"";s:2:"S";s:3:"";s:2:"T";s:3:"";s:2:"U";s:3:"";s:2:"V";s:3:"";s:2:"W";s:3:"";s:2:"X";s:3:"";s:2:"Y";s:3:"";s:2:"Z";s:3:"";s:2:"[";s:3:"";s:2:"\";s:3:"";s:2:"]";s:3:"";s:2:"^";s:3:"";s:2:"_";s:3:"";s:2:"`";s:3:"";s:2:"a";s:3:"";s:2:"b";s:3:"";s:2:"c";s:3:"";s:2:"d";s:3:"";s:2:"e";s:3:"";s:2:"f";s:3:"";s:2:"g";s:3:"";s:2:"h";s:3:"";s:2:"i";s:3:"";s:2:"j";s:3:"";s:2:"k";s:3:"";s:2:"l";s:3:"";s:2:"m";s:3:"";s:2:"n";s:3:"";s:2:"o";s:3:"";s:2:"p";s:3:"";s:2:"q";s:3:"";s:2:"r";s:3:"";s:2:"s";s:3:"";s:2:"t";s:3:"";s:2:"u";s:3:"";s:2:"v";s:3:"";s:2:"w";s:3:"";s:2:"x";s:3:"";s:2:"y";s:3:"";s:2:"z";s:3:"";s:2:"{";s:3:"";s:2:"|";s:3:"";s:2:"}";s:3:"";s:2:"~";s:3:"";s:2:"ȡ";s:3:"";s:2:"Ȣ";s:3:"";s:2:"ȣ";s:3:"";s:2:"Ȥ";s:3:"";s:2:"ȥ";s:3:"";s:2:"Ȧ";s:3:"";s:2:"ȧ";s:3:"";s:2:"Ȩ";s:3:"";s:2:"ȩ";s:3:"";s:2:"Ȫ";s:3:"";s:2:"ȫ";s:3:"";s:2:"Ȭ";s:3:"";s:2:"ȭ";s:3:"";s:2:"Ȯ";s:3:"";s:2:"ȯ";s:3:"";s:2:"Ȱ";s:3:"";s:2:"ȱ";s:3:"";s:2:"Ȳ";s:3:"";s:2:"ȳ";s:3:"";s:2:"ȴ";s:3:"";s:2:"ȵ";s:3:"";s:2:"ȶ";s:3:"";s:2:"ȷ";s:3:"";s:2:"ȸ";s:3:"";s:2:"ȹ";s:3:"";s:2:"Ⱥ";s:3:"";s:2:"Ȼ";s:3:"";s:2:"ȼ";s:3:"";s:2:"Ƚ";s:3:"";s:2:"Ⱦ";s:3:"";s:2:"ȿ";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:2:"";s:3:"";s:1:"";s:3:"豈";s:2:"Z";s:3:"更";s:2:"";s:3:"車";s:2:"";s:3:"賈";s:2:"";s:3:"滑";s:2:"";s:3:"串";s:2:"";s:3:"句";s:2:"y";s:3:"龜";s:2:"t";s:3:"龜";s:2:"t";s:3:"契";s:2:"";s:3:"金";s:2:"";s:3:"喇";s:2:"";s:3:"奈";s:2:"`";s:3:"懶";s:2:"i";s:3:"癩";s:2:"";s:3:"羅";s:2:"ù";s:3:"蘿";s:2:"";s:3:"螺";s:2:"";s:3:"裸";s:2:"r";s:3:"邏";s:2:"";s:3:"樂";s:2:"";s:3:"洛";s:2:"";s:3:"烙";s:2:"O";s:3:"珞";s:2:"_";s:3:"落";s:2:"";s:3:"酪";s:2:"T";s:3:"駱";s:2:"d";s:3:"亂";s:2:"";s:3:"卵";s:2:"Z";s:3:"欄";s:2:"";s:3:"爛";s:2:"";s:3:"蘭";s:2:"";s:3:"鸞";s:2:"}";s:3:"嵐";s:2:"P";s:3:"濫";s:2:"";s:3:"藍";s:2:"";s:3:"襤";s:2:"İ";s:3:"拉";s:2:"";s:3:"臘";s:2:"þ";s:3:"蠟";s:2:"";s:3:"廊";s:2:"Y";s:3:"朗";s:2:"";s:3:"浪";s:2:"";s:3:"狼";s:2:"T";s:3:"來";s:2:"";s:3:"冷";s:2:"N";s:3:"勞";s:2:"";s:3:"擄";s:2:"";s:3:"櫓";s:2:"r";s:3:"爐";s:2:"l";s:3:"盧";s:2:"c";s:3:"老";s:2:"";s:3:"蘆";s:2:"Ī";s:3:"虜";s:2:"";s:3:"路";s:2:"";s:3:"露";s:2:"S";s:3:"魯";s:2:"|";s:3:"鷺";s:2:"O";s:3:"碌";s:2:"L";s:3:"祿";s:2:"S";s:3:"綠";s:2:"";s:3:"菉";s:2:"w";s:3:"錄";s:2:"";s:3:"鹿";s:2:"";s:3:"論";s:2:"";s:3:"壟";s:2:"b";s:3:"弄";s:2:"";s:3:"籠";s:2:"Ţ";s:3:"聾";s:2:"Ť";s:3:"牢";s:2:"c";s:3:"磊";s:2:"U";s:3:"賂";s:2:"";s:3:"雷";s:2:"p";s:3:"壘";s:2:"S";s:3:"屢";s:2:"";s:3:"樓";s:2:"";s:3:"淚";s:2:"\";s:3:"漏";s:2:"|";s:3:"累";s:2:"";s:3:"縷";s:2:"\";s:3:"陋";s:2:"";s:3:"勒";s:2:"";s:3:"肋";s:2:"";s:3:"凜";s:2:"";s:3:"凌";s:2:"";s:3:"稜";s:2:"W";s:3:"綾";s:2:"";s:3:"菱";s:2:"";s:3:"陵";s:2:"";s:3:"讀";s:2:"Ū";s:3:"拏";s:2:"";s:3:"樂";s:2:"";s:3:"諾";s:2:"";s:3:"丹";s:2:"";s:3:"寧";s:2:"";s:3:"怒";s:2:"";s:3:"率";s:2:"v";s:3:"異";s:2:"";s:3:"北";s:2:"_";s:3:"磻";s:2:"";s:3:"便";s:2:"K";s:3:"復";s:2:"_";s:3:"不";s:2:"";s:3:"泌";s:2:"c";s:3:"數";s:2:"";s:3:"索";s:2:"";s:3:"參";s:2:"";s:3:"塞";s:2:"";s:3:"省";s:2:"";s:3:"葉";s:2:"";s:3:"說";s:2:"";s:3:"殺";s:2:"";s:3:"辰";s:2:"";s:3:"沈";s:2:"H";s:3:"拾";s:2:"B";s:3:"若";s:2:"Y";s:3:"掠";s:2:"";s:3:"略";s:2:"";s:3:"亮";s:2:"G";s:3:"兩";s:2:"";s:3:"梁";s:2:"";s:3:"糧";s:2:"³";s:3:"良";s:2:"}";s:3:"諒";s:2:"";s:3:"量";s:2:"q";s:3:"勵";s:2:"y";s:3:"呂";s:2:"f";s:3:"女";s:2:"k";s:3:"廬";s:2:"f";s:3:"旅";s:2:"";s:3:"濾";s:2:"o";s:3:"礪";s:2:"r";s:3:"閭";s:2:"[";s:3:"驪";s:2:"z";s:3:"麗";s:2:"R";s:3:"黎";s:2:"";s:3:"力";s:2:"O";s:3:"曆";s:2:"";s:3:"歷";s:2:"";s:3:"轢";s:2:"e";s:3:"年";s:2:"~";s:3:"憐";s:2:"";s:3:"戀";s:2:"";s:3:"撚";s:2:"";s:3:"漣";s:2:"";s:3:"煉";s:2:"";s:3:"璉";s:2:"";s:3:"練";s:2:"m";s:3:"聯";s:2:"p";s:3:"輦";s:2:"";s:3:"蓮";s:2:"";s:3:"連";s:2:"s";s:3:"鍊";s:2:"";s:3:"列";s:2:"C";s:3:"劣";s:2:"H";s:3:"咽";s:2:"|";s:3:"烈";s:2:"P";s:3:"裂";s:2:"";s:3:"說";s:2:"";s:3:"廉";s:2:"G";s:3:"念";s:2:"";s:3:"捻";s:2:"";s:3:"殮";s:2:"";s:3:"簾";s:2:"î";s:3:"獵";s:2:"y";s:3:"令";s:2:"O";s:3:"囹";s:2:"";s:3:"寧";s:2:"";s:3:"嶺";s:2:"";s:3:"怜";s:2:"̰";s:3:"玲";s:2:"";s:3:"瑩";s:2:"";s:3:"羚";s:2:"";s:3:"聆";s:2:"";s:3:"鈴";s:2:"a";s:3:"零";s:2:"s";s:3:"靈";s:2:"F";s:3:"領";s:2:"";s:3:"例";s:2:"";s:3:"禮";s:2:"§";s:3:"醴";s:2:"Ŀ";s:3:"隸";s:2:"";s:3:"惡";s:2:"c";s:3:"了";s:2:"F";s:3:"僚";s:2:"";s:3:"寮";s:2:"d";s:3:"尿";s:2:"";s:3:"料";s:2:"";s:3:"樂";s:2:"";s:3:"燎";s:2:"R";s:3:"療";s:2:"";s:3:"蓼";s:2:"d";s:3:"遼";s:2:"";s:3:"龍";s:2:"s";s:3:"暈";s:2:"w";s:3:"阮";s:2:"";s:3:"劉";s:2:"B";s:3:"杻";s:2:"";s:3:"柳";s:2:"h";s:3:"流";s:2:"y";s:3:"溜";s:2:"";s:3:"琉";s:2:"[";s:3:"留";s:2:"d";s:3:"硫";s:2:"";s:3:"紐";s:2:"";s:3:"類";s:2:"";s:3:"六";s:2:"";s:3:"戮";s:2:"";s:3:"陸";s:2:"";s:3:"倫";s:2:"";s:3:"崙";s:2:"[";s:3:"淪";s:2:"_";s:3:"輪";s:2:"";s:3:"律";s:2:"";s:3:"慄";s:2:"X";s:3:"栗";s:2:"";s:3:"率";s:2:"v";s:3:"隆";s:2:"";s:3:"利";s:2:"Q";s:3:"吏";s:2:"O";s:3:"履";s:2:"i";s:3:"易";s:2:"";s:3:"李";s:2:"";s:3:"梨";s:2:"";s:3:"泥";s:2:"d";s:3:"理";s:2:"z";s:3:"痢";s:2:"g";s:3:"罹";s:2:"";s:3:"裡";s:2:"";s:3:"里";s:2:"";s:3:"離";s:2:"";s:3:"匿";s:2:"";s:3:"溺";s:2:"";s:3:"吝";s:2:"[";s:3:"燐";s:2:"M";s:3:"璘";s:2:"Z";s:3:"藺";s:2:"ĩ";s:3:"鱗";s:2:"";s:3:"麟";s:2:"";s:3:"林";s:2:"L";s:3:"淋";s:2:"O";s:3:"臨";s:2:"{";s:3:"立";s:2:"";s:3:"笠";s:2:"";s:3:"粒";s:2:"";s:3:"狀";s:2:"";s:3:"炙";s:2:"";s:3:"識";s:2:"";s:3:"什";s:2:"";s:3:"茶";s:2:"";s:3:"刺";s:2:"";s:3:"切";s:2:"";s:3:"度";s:2:"";s:3:"拓";s:2:"";s:3:"糖";s:2:"}";s:3:"宅";s:2:"v";s:3:"洞";s:2:"}";s:3:"暴";s:2:"";s:3:"輻";s:2:"";s:3:"行";s:2:"";s:3:"降";s:2:"";s:3:"見";s:2:"";s:3:"廓";s:2:"";s:3:"兀";s:2:"J";s:3:"嗀";s:2:"";s:3:"塚";s:2:"";s:3:"晴";s:2:"";s:3:"凞";s:2:"";s:3:"猪";s:2:"";s:3:"益";s:2:"q";s:3:"神";s:2:"";s:3:"祥";s:2:"";s:3:"福";s:2:"";s:3:"靖";s:2:"t";s:3:"精";s:2:"";s:3:"羽";s:2:"";s:3:"諸";s:2:"";s:3:"逸";s:2:"h";s:3:"都";s:2:"";s:3:"飯";s:2:"";s:3:"飼";s:2:"}";s:3:"館";s:2:"]";s:3:"鶴";s:2:"b";s:3:"︰";s:2:"J";s:3:"︱";s:2:"W";s:3:"︳";s:2:"Y";s:3:"︴";s:2:"[";s:3:"︵";s:2:"_";s:3:"︶";s:2:"`";s:3:"︷";s:2:"c";s:3:"︸";s:2:"d";s:3:"︹";s:2:"g";s:3:"︺";s:2:"h";s:3:"︻";s:2:"k";s:3:"︼";s:2:"l";s:3:"︽";s:2:"o";s:3:"︾";s:2:"p";s:3:"︿";s:2:"s";s:3:"﹀";s:2:"t";s:3:"﹁";s:2:"w";s:3:"﹂";s:2:"x";s:3:"﹃";s:2:"{";s:3:"﹄";s:2:"|";s:3:"﹉";s:2:"";s:3:"﹊";s:2:"";s:3:"﹋";s:2:"";s:3:"﹌";s:2:"";s:3:"﹍";s:2:"";s:3:"﹎";s:2:"";s:3:"﹏";s:2:"\";s:3:"﹐";s:2:"M";s:3:"﹑";s:2:"N";s:3:"﹒";s:2:"O";s:3:"﹔";s:2:"Q";s:3:"﹕";s:2:"R";s:3:"﹖";s:2:"S";s:3:"﹗";s:2:"T";s:3:"﹙";s:2:"}";s:3:"﹚";s:2:"~";s:3:"﹛";s:2:"";s:3:"﹜";s:2:"";s:3:"﹝";s:2:"";s:3:"﹞";s:2:"";s:3:"﹟";s:2:"";s:3:"﹠";s:2:"";s:3:"﹡";s:2:"";s:3:"﹢";s:2:"";s:3:"﹣";s:2:"";s:3:"﹤";s:2:"";s:3:"﹥";s:2:"";s:3:"﹦";s:2:"";s:3:"﹨";s:2:"B";s:3:"﹩";s:2:"L";s:3:"﹪";s:2:"M";s:3:"﹫";s:2:"N";s:3:"！";s:2:"I";s:3:"＂";s:2:"";s:3:"＃";s:2:"";s:3:"＄";s:2:"C";s:3:"％";s:2:"H";s:3:"＆";s:2:"";s:3:"＇";s:2:"";s:3:"（";s:2:"]";s:3:"）";s:2:"^";s:3:"＊";s:2:"";s:3:"＋";s:2:"";s:3:"，";s:2:"A";s:3:"－";s:2:"";s:3:"．";s:2:"D";s:3:"／";s:2:"";s:3:"０";s:2:"";s:3:"１";s:2:"";s:3:"２";s:2:"";s:3:"３";s:2:"";s:3:"４";s:2:"";s:3:"５";s:2:"";s:3:"６";s:2:"";s:3:"７";s:2:"";s:3:"８";s:2:"";s:3:"９";s:2:"";s:3:"：";s:2:"G";s:3:"；";s:2:"F";s:3:"＜";s:2:"";s:3:"＝";s:2:"";s:3:"＞";s:2:"";s:3:"？";s:2:"H";s:3:"＠";s:2:"I";s:3:"Ａ";s:2:"";s:3:"Ｂ";s:2:"";s:3:"Ｃ";s:2:"";s:3:"Ｄ";s:2:"";s:3:"Ｅ";s:2:"";s:3:"Ｆ";s:2:"";s:3:"Ｇ";s:2:"";s:3:"Ｈ";s:2:"";s:3:"Ｉ";s:2:"";s:3:"Ｊ";s:2:"";s:3:"Ｋ";s:2:"";s:3:"Ｌ";s:2:"";s:3:"Ｍ";s:2:"";s:3:"Ｎ";s:2:"";s:3:"Ｏ";s:2:"";s:3:"Ｐ";s:2:"";s:3:"Ｑ";s:2:"";s:3:"Ｒ";s:2:"";s:3:"Ｓ";s:2:"";s:3:"Ｔ";s:2:"";s:3:"Ｕ";s:2:"";s:3:"Ｖ";s:2:"";s:3:"Ｗ";s:2:"";s:3:"Ｘ";s:2:"";s:3:"Ｙ";s:2:"";s:3:"Ｚ";s:2:"";s:3:"［";s:2:"e";s:3:"＼";s:2:"@";s:3:"］";s:2:"f";s:3:"＾";s:2:"s";s:3:"＿";s:2:"";s:3:"｀";s:2:"";s:3:"ａ";s:2:"";s:3:"ｂ";s:2:"";s:3:"ｃ";s:2:"";s:3:"ｄ";s:2:"";s:3:"ｅ";s:2:"";s:3:"ｆ";s:2:"";s:3:"ｇ";s:2:"";s:3:"ｈ";s:2:"";s:3:"ｉ";s:2:"";s:3:"ｊ";s:2:"";s:3:"ｋ";s:2:"";s:3:"ｌ";s:2:"";s:3:"ｍ";s:2:"";s:3:"ｎ";s:2:"";s:3:"ｏ";s:2:"";s:3:"ｐ";s:2:"";s:3:"ｑ";s:2:"";s:3:"ｒ";s:2:"";s:3:"ｓ";s:2:"";s:3:"ｔ";s:2:"";s:3:"ｕ";s:2:"";s:3:"ｖ";s:2:"";s:3:"ｗ";s:2:"@";s:3:"ｘ";s:2:"A";s:3:"ｙ";s:2:"B";s:3:"ｚ";s:2:"C";s:3:"｛";s:2:"a";s:3:"｜";s:2:"U";s:3:"｝";s:2:"b";s:3:"～";s:2:"";s:3:"､";s:2:"N";s:3:"￠";s:2:"F";s:3:"￡";s:2:"G";s:3:"￣";s:2:"";s:3:"￥";s:2:"D";}
\ No newline at end of file
--- /dev/null
+++ b/vendor/patchwork/utf8/src/Patchwork/Utf8/data/translit_extra.ser
@@ -0,0 +1 @@
+a:224:{s:2:"Ð";s:1:"D";s:2:"Ø";s:1:"O";s:2:"Þ";s:2:"TH";s:2:"ð";s:1:"d";s:2:"ø";s:1:"o";s:2:"þ";s:2:"th";s:2:"Đ";s:1:"D";s:2:"đ";s:1:"d";s:2:"Ħ";s:1:"H";s:2:"ħ";s:1:"h";s:2:"ı";s:1:"i";s:2:"ĸ";s:1:"q";s:2:"Ŋ";s:1:"N";s:2:"ŋ";s:1:"n";s:2:"Ŧ";s:1:"T";s:2:"ŧ";s:1:"t";s:2:"ƀ";s:1:"b";s:2:"Ɓ";s:1:"B";s:2:"Ƃ";s:1:"B";s:2:"ƃ";s:1:"b";s:2:"Ƈ";s:1:"C";s:2:"ƈ";s:1:"c";s:2:"Ɖ";s:1:"D";s:2:"Ɗ";s:1:"D";s:2:"Ƌ";s:1:"D";s:2:"ƌ";s:1:"d";s:2:"Ɛ";s:1:"E";s:2:"Ƒ";s:1:"F";s:2:"ƒ";s:1:"f";s:2:"Ɠ";s:1:"G";s:2:"ƕ";s:2:"hv";s:2:"Ɩ";s:1:"I";s:2:"Ɨ";s:1:"I";s:2:"Ƙ";s:1:"K";s:2:"ƙ";s:1:"k";s:2:"ƚ";s:1:"l";s:2:"Ɲ";s:1:"N";s:2:"ƞ";s:1:"n";s:2:"Ƣ";s:2:"OI";s:2:"ƣ";s:2:"oi";s:2:"Ƥ";s:1:"P";s:2:"ƥ";s:1:"p";s:2:"ƫ";s:1:"t";s:2:"Ƭ";s:1:"T";s:2:"ƭ";s:1:"t";s:2:"Ʈ";s:1:"T";s:2:"Ʋ";s:1:"V";s:2:"Ƴ";s:1:"Y";s:2:"ƴ";s:1:"y";s:2:"Ƶ";s:1:"Z";s:2:"ƶ";s:1:"z";s:2:"Ǥ";s:1:"G";s:2:"ǥ";s:1:"g";s:2:"ȡ";s:1:"d";s:2:"Ȥ";s:1:"Z";s:2:"ȥ";s:1:"z";s:2:"ȴ";s:1:"l";s:2:"ȵ";s:1:"n";s:2:"ȶ";s:1:"t";s:2:"ȷ";s:1:"j";s:2:"ȸ";s:2:"db";s:2:"ȹ";s:2:"qp";s:2:"Ⱥ";s:1:"A";s:2:"Ȼ";s:1:"C";s:2:"ȼ";s:1:"c";s:2:"Ƚ";s:1:"L";s:2:"Ⱦ";s:1:"T";s:2:"ȿ";s:1:"s";s:2:"ɀ";s:1:"z";s:2:"Ƀ";s:1:"B";s:2:"Ʉ";s:1:"U";s:2:"Ɇ";s:1:"E";s:2:"ɇ";s:1:"e";s:2:"Ɉ";s:1:"J";s:2:"ɉ";s:1:"j";s:2:"Ɍ";s:1:"R";s:2:"ɍ";s:1:"r";s:2:"Ɏ";s:1:"Y";s:2:"ɏ";s:1:"y";s:2:"ɓ";s:1:"b";s:2:"ɕ";s:1:"c";s:2:"ɖ";s:1:"d";s:2:"ɗ";s:1:"d";s:2:"ɛ";s:1:"e";s:2:"ɟ";s:1:"j";s:2:"ɠ";s:1:"g";s:2:"ɡ";s:1:"g";s:2:"ɢ";s:1:"G";s:2:"ɦ";s:1:"h";s:2:"ɧ";s:1:"h";s:2:"ɨ";s:1:"i";s:2:"ɪ";s:1:"I";s:2:"ɫ";s:1:"l";s:2:"ɬ";s:1:"l";s:2:"ɭ";s:1:"l";s:2:"ɱ";s:1:"m";s:2:"ɲ";s:1:"n";s:2:"ɳ";s:1:"n";s:2:"ɴ";s:1:"N";s:2:"ɶ";s:2:"OE";s:2:"ɼ";s:1:"r";s:2:"ɽ";s:1:"r";s:2:"ɾ";s:1:"r";s:2:"ʀ";s:1:"R";s:2:"ʂ";s:1:"s";s:2:"ʈ";s:1:"t";s:2:"ʉ";s:1:"u";s:2:"ʋ";s:1:"v";s:2:"ʏ";s:1:"Y";s:2:"ʐ";s:1:"z";s:2:"ʑ";s:1:"z";s:2:"ʙ";s:1:"B";s:2:"ʛ";s:1:"G";s:2:"ʜ";s:1:"H";s:2:"ʝ";s:1:"j";s:2:"ʟ";s:1:"L";s:2:"ʠ";s:1:"q";s:2:"ʣ";s:2:"dz";s:2:"ʥ";s:2:"dz";s:2:"ʦ";s:2:"ts";s:2:"ʪ";s:2:"ls";s:2:"ʫ";s:2:"lz";s:3:"ᴀ";s:1:"A";s:3:"ᴁ";s:2:"AE";s:3:"ᴃ";s:1:"B";s:3:"ᴄ";s:1:"C";s:3:"ᴅ";s:1:"D";s:3:"ᴆ";s:1:"D";s:3:"ᴇ";s:1:"E";s:3:"ᴊ";s:1:"J";s:3:"ᴋ";s:1:"K";s:3:"ᴌ";s:1:"L";s:3:"ᴍ";s:1:"M";s:3:"ᴏ";s:1:"O";s:3:"ᴘ";s:1:"P";s:3:"ᴛ";s:1:"T";s:3:"ᴜ";s:1:"U";s:3:"ᴠ";s:1:"V";s:3:"ᴡ";s:1:"W";s:3:"ᴢ";s:1:"Z";s:3:"ᵫ";s:2:"ue";s:3:"ᵬ";s:1:"b";s:3:"ᵭ";s:1:"d";s:3:"ᵮ";s:1:"f";s:3:"ᵯ";s:1:"m";s:3:"ᵰ";s:1:"n";s:3:"ᵱ";s:1:"p";s:3:"ᵲ";s:1:"r";s:3:"ᵳ";s:1:"r";s:3:"ᵴ";s:1:"s";s:3:"ᵵ";s:1:"t";s:3:"ᵶ";s:1:"z";s:3:"ᵺ";s:2:"th";s:3:"ᵻ";s:1:"I";s:3:"ᵽ";s:1:"p";s:3:"ᵾ";s:1:"U";s:3:"ᶀ";s:1:"b";s:3:"ᶁ";s:1:"d";s:3:"ᶂ";s:1:"f";s:3:"ᶃ";s:1:"g";s:3:"ᶄ";s:1:"k";s:3:"ᶅ";s:1:"l";s:3:"ᶆ";s:1:"m";s:3:"ᶇ";s:1:"n";s:3:"ᶈ";s:1:"p";s:3:"ᶉ";s:1:"r";s:3:"ᶊ";s:1:"s";s:3:"ᶌ";s:1:"v";s:3:"ᶍ";s:1:"x";s:3:"ᶎ";s:1:"z";s:3:"ᶏ";s:1:"a";s:3:"ᶑ";s:1:"d";s:3:"ᶒ";s:1:"e";s:3:"ᶓ";s:1:"e";s:3:"ᶖ";s:1:"i";s:3:"ᶙ";s:1:"u";s:3:"ẜ";s:1:"s";s:3:"ẝ";s:1:"s";s:3:"ẞ";s:2:"SS";s:3:"Ỻ";s:2:"LL";s:3:"ỻ";s:2:"ll";s:3:"Ỽ";s:1:"V";s:3:"ỽ";s:1:"v";s:3:"Ỿ";s:1:"Y";s:3:"ỿ";s:1:"y";s:3:"₠";s:2:"CE";s:3:"₢";s:2:"Cr";s:3:"₣";s:3:"Fr.";s:3:"₤";s:2:"L.";s:3:"₧";s:3:"Pts";s:3:"₹";s:2:"Rs";s:3:"℞";s:2:"Rx";s:3:"〇";s:1:"0";s:3:"′";s:1:"'";s:3:"〝";s:1:""";s:3:"〞";s:1:""";s:3:"‖";s:2:"||";s:3:"⁅";s:1:"[";s:3:"⁆";s:1:"]";s:3:"⁎";s:1:"*";s:3:"、";s:1:",";s:3:"。";s:1:".";s:3:"〈";s:1:"<";s:3:"〉";s:1:">";s:3:"《";s:2:"<<";s:3:"》";s:2:">>";s:3:"〔";s:1:"[";s:3:"〕";s:1:"]";s:3:"〘";s:1:"[";s:3:"〙";s:1:"]";s:3:"〚";s:1:"[";s:3:"〛";s:1:"]";s:3:"︑";s:1:",";s:3:"︒";s:1:".";s:3:"︹";s:1:"[";s:3:"︺";s:1:"]";s:3:"︽";s:2:"<<";s:3:"︾";s:2:">>";s:3:"︿";s:1:"<";s:3:"﹀";s:1:">";s:2:"÷";s:1:"/";s:3:"∥";s:2:"||";s:3:"⦅";s:2:"((";s:3:"⦆";s:2:"))";}
\ No newline at end of file
--- a/vendor/psr/log/Psr/Log/AbstractLogger.php
+++ b/vendor/psr/log/Psr/Log/AbstractLogger.php
@@ -15,8 +15,9 @@ abstract class AbstractLogger implements LoggerInterface
      * System is unusable.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function emergency($message, array $context = array())
     {
@@ -30,8 +31,9 @@ abstract class AbstractLogger implements LoggerInterface
      * trigger the SMS alerts and wake you up.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function alert($message, array $context = array())
     {
@@ -44,8 +46,9 @@ abstract class AbstractLogger implements LoggerInterface
      * Example: Application component unavailable, unexpected exception.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function critical($message, array $context = array())
     {
@@ -57,8 +60,9 @@ abstract class AbstractLogger implements LoggerInterface
      * be logged and monitored.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function error($message, array $context = array())
     {
@@ -72,8 +76,9 @@ abstract class AbstractLogger implements LoggerInterface
      * that are not necessarily wrong.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function warning($message, array $context = array())
     {
@@ -84,8 +89,9 @@ abstract class AbstractLogger implements LoggerInterface
      * Normal but significant events.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function notice($message, array $context = array())
     {
@@ -98,8 +104,9 @@ abstract class AbstractLogger implements LoggerInterface
      * Example: User logs in, SQL logs.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function info($message, array $context = array())
     {
@@ -110,8 +117,9 @@ abstract class AbstractLogger implements LoggerInterface
      * Detailed debug information.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function debug($message, array $context = array())
     {
--- a/vendor/psr/log/Psr/Log/LogLevel.php
+++ b/vendor/psr/log/Psr/Log/LogLevel.php
@@ -3,16 +3,16 @@
 namespace Psr\Log;
 
 /**
- * Describes log levels
+ * Describes log levels.
  */
 class LogLevel
 {
     const EMERGENCY = 'emergency';
-    const ALERT = 'alert';
-    const CRITICAL = 'critical';
-    const ERROR = 'error';
-    const WARNING = 'warning';
-    const NOTICE = 'notice';
-    const INFO = 'info';
-    const DEBUG = 'debug';
+    const ALERT     = 'alert';
+    const CRITICAL  = 'critical';
+    const ERROR     = 'error';
+    const WARNING   = 'warning';
+    const NOTICE    = 'notice';
+    const INFO      = 'info';
+    const DEBUG     = 'debug';
 }
--- a/vendor/psr/log/Psr/Log/LoggerAwareInterface.php
+++ b/vendor/psr/log/Psr/Log/LoggerAwareInterface.php
@@ -3,15 +3,16 @@
 namespace Psr\Log;
 
 /**
- * Describes a logger-aware instance
+ * Describes a logger-aware instance.
  */
 interface LoggerAwareInterface
 {
     /**
-     * Sets a logger instance on the object
+     * Sets a logger instance on the object.
      *
      * @param LoggerInterface $logger
-     * @return null
+     *
+     * @return void
      */
     public function setLogger(LoggerInterface $logger);
 }
--- a/vendor/psr/log/Psr/Log/LoggerAwareTrait.php
+++ b/vendor/psr/log/Psr/Log/LoggerAwareTrait.php
@@ -7,12 +7,16 @@ namespace Psr\Log;
  */
 trait LoggerAwareTrait
 {
-    /** @var LoggerInterface */
+    /**
+     * The logger instance.
+     *
+     * @var LoggerInterface
+     */
     protected $logger;
 
     /**
      * Sets a logger.
-     * 
+     *
      * @param LoggerInterface $logger
      */
     public function setLogger(LoggerInterface $logger)
--- a/vendor/psr/log/Psr/Log/LoggerInterface.php
+++ b/vendor/psr/log/Psr/Log/LoggerInterface.php
@@ -3,14 +3,14 @@
 namespace Psr\Log;
 
 /**
- * Describes a logger instance
+ * Describes a logger instance.
  *
  * The message MUST be a string or object implementing __toString().
  *
  * The message MAY contain placeholders in the form: {foo} where foo
  * will be replaced by the context data in key "foo".
  *
- * The context array can contain arbitrary data, the only assumption that
+ * The context array can contain arbitrary data. The only assumption that
  * can be made by implementors is that if an Exception instance is given
  * to produce a stack trace, it MUST be in a key named "exception".
  *
@@ -23,8 +23,9 @@ interface LoggerInterface
      * System is unusable.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function emergency($message, array $context = array());
 
@@ -35,8 +36,9 @@ interface LoggerInterface
      * trigger the SMS alerts and wake you up.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function alert($message, array $context = array());
 
@@ -46,8 +48,9 @@ interface LoggerInterface
      * Example: Application component unavailable, unexpected exception.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function critical($message, array $context = array());
 
@@ -56,8 +59,9 @@ interface LoggerInterface
      * be logged and monitored.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function error($message, array $context = array());
 
@@ -68,8 +72,9 @@ interface LoggerInterface
      * that are not necessarily wrong.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function warning($message, array $context = array());
 
@@ -77,8 +82,9 @@ interface LoggerInterface
      * Normal but significant events.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function notice($message, array $context = array());
 
@@ -88,8 +94,9 @@ interface LoggerInterface
      * Example: User logs in, SQL logs.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function info($message, array $context = array());
 
@@ -97,18 +104,20 @@ interface LoggerInterface
      * Detailed debug information.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function debug($message, array $context = array());
 
     /**
      * Logs with an arbitrary level.
      *
-     * @param mixed $level
+     * @param mixed  $level
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function log($level, $message, array $context = array());
 }
--- a/vendor/psr/log/Psr/Log/LoggerTrait.php
+++ b/vendor/psr/log/Psr/Log/LoggerTrait.php
@@ -6,8 +6,8 @@ namespace Psr\Log;
  * This is a simple Logger trait that classes unable to extend AbstractLogger
  * (because they extend another class, etc) can include.
  *
- * It simply delegates all log-level-specific methods to the `log` method to 
- * reduce boilerplate code that a simple Logger that does the same thing with 
+ * It simply delegates all log-level-specific methods to the `log` method to
+ * reduce boilerplate code that a simple Logger that does the same thing with
  * messages regardless of the error level has to implement.
  */
 trait LoggerTrait
@@ -16,8 +16,9 @@ trait LoggerTrait
      * System is unusable.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function emergency($message, array $context = array())
     {
@@ -31,8 +32,9 @@ trait LoggerTrait
      * trigger the SMS alerts and wake you up.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function alert($message, array $context = array())
     {
@@ -45,8 +47,9 @@ trait LoggerTrait
      * Example: Application component unavailable, unexpected exception.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function critical($message, array $context = array())
     {
@@ -58,8 +61,9 @@ trait LoggerTrait
      * be logged and monitored.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function error($message, array $context = array())
     {
@@ -73,8 +77,9 @@ trait LoggerTrait
      * that are not necessarily wrong.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function warning($message, array $context = array())
     {
@@ -85,8 +90,9 @@ trait LoggerTrait
      * Normal but significant events.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function notice($message, array $context = array())
     {
@@ -99,8 +105,9 @@ trait LoggerTrait
      * Example: User logs in, SQL logs.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function info($message, array $context = array())
     {
@@ -111,8 +118,9 @@ trait LoggerTrait
      * Detailed debug information.
      *
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function debug($message, array $context = array())
     {
@@ -122,10 +130,11 @@ trait LoggerTrait
     /**
      * Logs with an arbitrary level.
      *
-     * @param mixed $level
+     * @param mixed  $level
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     abstract public function log($level, $message, array $context = array());
 }
--- a/vendor/psr/log/Psr/Log/NullLogger.php
+++ b/vendor/psr/log/Psr/Log/NullLogger.php
@@ -3,7 +3,7 @@
 namespace Psr\Log;
 
 /**
- * This Logger can be used to avoid conditional log calls
+ * This Logger can be used to avoid conditional log calls.
  *
  * Logging should always be optional, and if no logger is provided to your
  * library creating a NullLogger instance to have something to throw logs at
@@ -15,10 +15,11 @@ class NullLogger extends AbstractLogger
     /**
      * Logs with an arbitrary level.
      *
-     * @param mixed $level
+     * @param mixed  $level
      * @param string $message
-     * @param array $context
-     * @return null
+     * @param array  $context
+     *
+     * @return void
      */
     public function log($level, $message, array $context = array())
     {
--- a/vendor/psr/log/composer.json
+++ b/vendor/psr/log/composer.json
@@ -2,6 +2,7 @@
     "name": "psr/log",
     "description": "Common interface for logging libraries",
     "keywords": ["psr", "psr-3", "log"],
+    "homepage": "https://github.com/php-fig/log",
     "license": "MIT",
     "authors": [
         {
@@ -9,9 +10,17 @@
             "homepage": "http://www.php-fig.org/"
         }
     ],
+    "require": {
+        "php": ">=5.3.0"
+    },
     "autoload": {
-        "psr-0": {
-            "Psr\\Log\\": ""
+        "psr-4": {
+            "Psr\\Log\\": "Psr/Log/"
+        }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.0.x-dev"
         }
     }
 }
--- /dev/null
+++ b/vendor/react/promise/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2012-2016 Jan Sorgalla
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
--- /dev/null
+++ b/vendor/react/promise/composer.json
@@ -0,0 +1,27 @@
+{
+    "name": "react/promise",
+    "description": "A lightweight implementation of CommonJS Promises/A for PHP",
+    "license": "MIT",
+    "authors": [
+        {"name": "Jan Sorgalla", "email": "jsorgalla@gmail.com"}
+    ],
+    "require": {
+        "php": ">=5.4.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "React\\Promise\\": "src/"
+        },
+        "files": ["src/functions_include.php"]
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "React\\Promise\\": "tests/fixtures"
+        }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.0-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/react/promise/src/CancellablePromiseInterface.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace React\Promise;
+
+interface CancellablePromiseInterface extends PromiseInterface
+{
+    /**
+     * @return void
+     */
+    public function cancel();
+}
--- /dev/null
+++ b/vendor/react/promise/src/CancellationQueue.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace React\Promise;
+
+class CancellationQueue
+{
+    private $started = false;
+    private $queue = [];
+
+    public function __invoke()
+    {
+        if ($this->started) {
+            return;
+        }
+
+        $this->started = true;
+        $this->drain();
+    }
+
+    public function enqueue($cancellable)
+    {
+        if (!method_exists($cancellable, 'then') || !method_exists($cancellable, 'cancel')) {
+            return;
+        }
+
+        $length = array_push($this->queue, $cancellable);
+
+        if ($this->started && 1 === $length) {
+            $this->drain();
+        }
+    }
+
+    private function drain()
+    {
+        for ($i = key($this->queue); isset($this->queue[$i]); $i++) {
+            $cancellable = $this->queue[$i];
+
+            $exception = null;
+
+            try {
+                $cancellable->cancel();
+            } catch (\Throwable $exception) {
+            } catch (\Exception $exception) {
+            }
+
+            unset($this->queue[$i]);
+
+            if ($exception) {
+                throw $exception;
+            }
+        }
+
+        $this->queue = [];
+    }
+}
--- /dev/null
+++ b/vendor/react/promise/src/Deferred.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace React\Promise;
+
+class Deferred implements PromisorInterface
+{
+    private $promise;
+    private $resolveCallback;
+    private $rejectCallback;
+    private $notifyCallback;
+    private $canceller;
+
+    public function __construct(callable $canceller = null)
+    {
+        $this->canceller = $canceller;
+    }
+
+    public function promise()
+    {
+        if (null === $this->promise) {
+            $this->promise = new Promise(function ($resolve, $reject, $notify) {
+                $this->resolveCallback = $resolve;
+                $this->rejectCallback  = $reject;
+                $this->notifyCallback  = $notify;
+            }, $this->canceller);
+        }
+
+        return $this->promise;
+    }
+
+    public function resolve($value = null)
+    {
+        $this->promise();
+
+        call_user_func($this->resolveCallback, $value);
+    }
+
+    public function reject($reason = null)
+    {
+        $this->promise();
+
+        call_user_func($this->rejectCallback, $reason);
+    }
+
+    public function notify($update = null)
+    {
+        $this->promise();
+
+        call_user_func($this->notifyCallback, $update);
+    }
+
+    /**
+     * @deprecated 2.2.0
+     * @see Deferred::notify()
+     */
+    public function progress($update = null)
+    {
+        $this->notify($update);
+    }
+}
--- /dev/null
+++ b/vendor/react/promise/src/Exception/LengthException.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace React\Promise\Exception;
+
+class LengthException extends \LengthException
+{
+}
--- /dev/null
+++ b/vendor/react/promise/src/ExtendedPromiseInterface.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace React\Promise;
+
+interface ExtendedPromiseInterface extends PromiseInterface
+{
+    /**
+     * @return void
+     */
+    public function done(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null);
+
+    /**
+     * @return ExtendedPromiseInterface
+     */
+    public function otherwise(callable $onRejected);
+
+    /**
+     * @return ExtendedPromiseInterface
+     */
+    public function always(callable $onFulfilledOrRejected);
+
+    /**
+     * @return ExtendedPromiseInterface
+     */
+    public function progress(callable $onProgress);
+}
--- /dev/null
+++ b/vendor/react/promise/src/FulfilledPromise.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace React\Promise;
+
+class FulfilledPromise implements ExtendedPromiseInterface, CancellablePromiseInterface
+{
+    private $value;
+
+    public function __construct($value = null)
+    {
+        if ($value instanceof PromiseInterface) {
+            throw new \InvalidArgumentException('You cannot create React\Promise\FulfilledPromise with a promise. Use React\Promise\resolve($promiseOrValue) instead.');
+        }
+
+        $this->value = $value;
+    }
+
+    public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null)
+    {
+        if (null === $onFulfilled) {
+            return $this;
+        }
+
+        try {
+            return resolve($onFulfilled($this->value));
+        } catch (\Throwable $exception) {
+            return new RejectedPromise($exception);
+        } catch (\Exception $exception) {
+            return new RejectedPromise($exception);
+        }
+    }
+
+    public function done(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null)
+    {
+        if (null === $onFulfilled) {
+            return;
+        }
+
+        $result = $onFulfilled($this->value);
+
+        if ($result instanceof ExtendedPromiseInterface) {
+            $result->done();
+        }
+    }
+
+    public function otherwise(callable $onRejected)
+    {
+        return $this;
+    }
+
+    public function always(callable $onFulfilledOrRejected)
+    {
+        return $this->then(function ($value) use ($onFulfilledOrRejected) {
+            return resolve($onFulfilledOrRejected())->then(function () use ($value) {
+                return $value;
+            });
+        });
+    }
+
+    public function progress(callable $onProgress)
+    {
+        return $this;
+    }
+
+    public function cancel()
+    {
+    }
+}
--- /dev/null
+++ b/vendor/react/promise/src/LazyPromise.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace React\Promise;
+
+class LazyPromise implements ExtendedPromiseInterface, CancellablePromiseInterface
+{
+    private $factory;
+    private $promise;
+
+    public function __construct(callable $factory)
+    {
+        $this->factory = $factory;
+    }
+
+    public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null)
+    {
+        return $this->promise()->then($onFulfilled, $onRejected, $onProgress);
+    }
+
+    public function done(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null)
+    {
+        return $this->promise()->done($onFulfilled, $onRejected, $onProgress);
+    }
+
+    public function otherwise(callable $onRejected)
+    {
+        return $this->promise()->otherwise($onRejected);
+    }
+
+    public function always(callable $onFulfilledOrRejected)
+    {
+        return $this->promise()->always($onFulfilledOrRejected);
+    }
+
+    public function progress(callable $onProgress)
+    {
+        return $this->promise()->progress($onProgress);
+    }
+
+    public function cancel()
+    {
+        return $this->promise()->cancel();
+    }
+
+    private function promise()
+    {
+        if (null === $this->promise) {
+            try {
+                $this->promise = resolve(call_user_func($this->factory));
+            } catch (\Throwable $exception) {
+                $this->promise = new RejectedPromise($exception);
+            } catch (\Exception $exception) {
+                $this->promise = new RejectedPromise($exception);
+            }
+        }
+
+        return $this->promise;
+    }
+}
--- /dev/null
+++ b/vendor/react/promise/src/Promise.php
@@ -0,0 +1,197 @@
+<?php
+
+namespace React\Promise;
+
+class Promise implements ExtendedPromiseInterface, CancellablePromiseInterface
+{
+    private $canceller;
+    private $result;
+
+    private $handlers = [];
+    private $progressHandlers = [];
+
+    private $requiredCancelRequests = 0;
+    private $cancelRequests = 0;
+
+    public function __construct(callable $resolver, callable $canceller = null)
+    {
+        $this->canceller = $canceller;
+        $this->call($resolver);
+    }
+
+    public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null)
+    {
+        if (null !== $this->result) {
+            return $this->result()->then($onFulfilled, $onRejected, $onProgress);
+        }
+
+        if (null === $this->canceller) {
+            return new static($this->resolver($onFulfilled, $onRejected, $onProgress));
+        }
+
+        $this->requiredCancelRequests++;
+
+        return new static($this->resolver($onFulfilled, $onRejected, $onProgress), function () {
+            if (++$this->cancelRequests < $this->requiredCancelRequests) {
+                return;
+            }
+
+            $this->cancel();
+        });
+    }
+
+    public function done(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null)
+    {
+        if (null !== $this->result) {
+            return $this->result()->done($onFulfilled, $onRejected, $onProgress);
+        }
+
+        $this->handlers[] = function (ExtendedPromiseInterface $promise) use ($onFulfilled, $onRejected) {
+            $promise
+                ->done($onFulfilled, $onRejected);
+        };
+
+        if ($onProgress) {
+            $this->progressHandlers[] = $onProgress;
+        }
+    }
+
+    public function otherwise(callable $onRejected)
+    {
+        return $this->then(null, function ($reason) use ($onRejected) {
+            if (!_checkTypehint($onRejected, $reason)) {
+                return new RejectedPromise($reason);
+            }
+
+            return $onRejected($reason);
+        });
+    }
+
+    public function always(callable $onFulfilledOrRejected)
+    {
+        return $this->then(function ($value) use ($onFulfilledOrRejected) {
+            return resolve($onFulfilledOrRejected())->then(function () use ($value) {
+                return $value;
+            });
+        }, function ($reason) use ($onFulfilledOrRejected) {
+            return resolve($onFulfilledOrRejected())->then(function () use ($reason) {
+                return new RejectedPromise($reason);
+            });
+        });
+    }
+
+    public function progress(callable $onProgress)
+    {
+        return $this->then(null, null, $onProgress);
+    }
+
+    public function cancel()
+    {
+        if (null === $this->canceller || null !== $this->result) {
+            return;
+        }
+
+        $canceller = $this->canceller;
+        $this->canceller = null;
+
+        $this->call($canceller);
+    }
+
+    private function resolver(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null)
+    {
+        return function ($resolve, $reject, $notify) use ($onFulfilled, $onRejected, $onProgress) {
+            if ($onProgress) {
+                $progressHandler = function ($update) use ($notify, $onProgress) {
+                    try {
+                        $notify($onProgress($update));
+                    } catch (\Throwable $e) {
+                        $notify($e);
+                    } catch (\Exception $e) {
+                        $notify($e);
+                    }
+                };
+            } else {
+                $progressHandler = $notify;
+            }
+
+            $this->handlers[] = function (ExtendedPromiseInterface $promise) use ($onFulfilled, $onRejected, $resolve, $reject, $progressHandler) {
+                $promise
+                    ->then($onFulfilled, $onRejected)
+                    ->done($resolve, $reject, $progressHandler);
+            };
+
+            $this->progressHandlers[] = $progressHandler;
+        };
+    }
+
+    private function resolve($value = null)
+    {
+        if (null !== $this->result) {
+            return;
+        }
+
+        $this->settle(resolve($value));
+    }
+
+    private function reject($reason = null)
+    {
+        if (null !== $this->result) {
+            return;
+        }
+
+        $this->settle(reject($reason));
+    }
+
+    private function notify($update = null)
+    {
+        if (null !== $this->result) {
+            return;
+        }
+
+        foreach ($this->progressHandlers as $handler) {
+            $handler($update);
+        }
+    }
+
+    private function settle(ExtendedPromiseInterface $promise)
+    {
+        $handlers = $this->handlers;
+
+        $this->progressHandlers = $this->handlers = [];
+        $this->result = $promise;
+
+        foreach ($handlers as $handler) {
+            $handler($promise);
+        }
+    }
+
+    private function result()
+    {
+        while ($this->result instanceof self && null !== $this->result->result) {
+            $this->result = $this->result->result;
+        }
+
+        return $this->result;
+    }
+
+    private function call(callable $callback)
+    {
+        try {
+            $callback(
+                function ($value = null) {
+                    $this->resolve($value);
+                },
+                function ($reason = null) {
+                    $this->reject($reason);
+                },
+                function ($update = null) {
+                    $this->notify($update);
+                }
+            );
+        } catch (\Throwable $e) {
+            $this->reject($e);
+        } catch (\Exception $e) {
+            $this->reject($e);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/react/promise/src/PromiseInterface.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace React\Promise;
+
+interface PromiseInterface
+{
+    /**
+     * @return PromiseInterface
+     */
+    public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null);
+}
--- /dev/null
+++ b/vendor/react/promise/src/PromisorInterface.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace React\Promise;
+
+interface PromisorInterface
+{
+    /**
+     * @return PromiseInterface
+     */
+    public function promise();
+}
--- /dev/null
+++ b/vendor/react/promise/src/RejectedPromise.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace React\Promise;
+
+class RejectedPromise implements ExtendedPromiseInterface, CancellablePromiseInterface
+{
+    private $reason;
+
+    public function __construct($reason = null)
+    {
+        if ($reason instanceof PromiseInterface) {
+            throw new \InvalidArgumentException('You cannot create React\Promise\RejectedPromise with a promise. Use React\Promise\reject($promiseOrValue) instead.');
+        }
+
+        $this->reason = $reason;
+    }
+
+    public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null)
+    {
+        if (null === $onRejected) {
+            return $this;
+        }
+
+        try {
+            return resolve($onRejected($this->reason));
+        } catch (\Throwable $exception) {
+            return new RejectedPromise($exception);
+        } catch (\Exception $exception) {
+            return new RejectedPromise($exception);
+        }
+    }
+
+    public function done(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null)
+    {
+        if (null === $onRejected) {
+            throw UnhandledRejectionException::resolve($this->reason);
+        }
+
+        $result = $onRejected($this->reason);
+
+        if ($result instanceof self) {
+            throw UnhandledRejectionException::resolve($result->reason);
+        }
+
+        if ($result instanceof ExtendedPromiseInterface) {
+            $result->done();
+        }
+    }
+
+    public function otherwise(callable $onRejected)
+    {
+        if (!_checkTypehint($onRejected, $this->reason)) {
+            return $this;
+        }
+
+        return $this->then(null, $onRejected);
+    }
+
+    public function always(callable $onFulfilledOrRejected)
+    {
+        return $this->then(null, function ($reason) use ($onFulfilledOrRejected) {
+            return resolve($onFulfilledOrRejected())->then(function () use ($reason) {
+                return new RejectedPromise($reason);
+            });
+        });
+    }
+
+    public function progress(callable $onProgress)
+    {
+        return $this;
+    }
+
+    public function cancel()
+    {
+    }
+}
--- /dev/null
+++ b/vendor/react/promise/src/UnhandledRejectionException.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace React\Promise;
+
+class UnhandledRejectionException extends \RuntimeException
+{
+    private $reason;
+
+    public static function resolve($reason)
+    {
+        if ($reason instanceof \Exception || $reason instanceof \Throwable) {
+            return $reason;
+        }
+
+        return new static($reason);
+    }
+
+    public function __construct($reason)
+    {
+        $this->reason = $reason;
+
+        $message = sprintf('Unhandled Rejection: %s', json_encode($reason));
+
+        parent::__construct($message, 0);
+    }
+
+    public function getReason()
+    {
+        return $this->reason;
+    }
+}
--- /dev/null
+++ b/vendor/react/promise/src/functions.php
@@ -0,0 +1,255 @@
+<?php
+
+namespace React\Promise;
+
+function resolve($promiseOrValue = null)
+{
+    if ($promiseOrValue instanceof ExtendedPromiseInterface) {
+        return $promiseOrValue;
+    }
+
+    if (method_exists($promiseOrValue, 'then')) {
+        $canceller = null;
+
+        if (method_exists($promiseOrValue, 'cancel')) {
+            $canceller = [$promiseOrValue, 'cancel'];
+        }
+
+        return new Promise(function ($resolve, $reject, $notify) use ($promiseOrValue) {
+            $promiseOrValue->then($resolve, $reject, $notify);
+        }, $canceller);
+    }
+
+    return new FulfilledPromise($promiseOrValue);
+}
+
+function reject($promiseOrValue = null)
+{
+    if ($promiseOrValue instanceof PromiseInterface) {
+        return resolve($promiseOrValue)->then(function ($value) {
+            return new RejectedPromise($value);
+        });
+    }
+
+    return new RejectedPromise($promiseOrValue);
+}
+
+function all($promisesOrValues)
+{
+    return map($promisesOrValues, function ($val) {
+        return $val;
+    });
+}
+
+function race($promisesOrValues)
+{
+    $cancellationQueue = new CancellationQueue();
+    $cancellationQueue->enqueue($promisesOrValues);
+
+    return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $cancellationQueue) {
+        resolve($promisesOrValues)
+            ->done(function ($array) use ($cancellationQueue, $resolve, $reject, $notify) {
+                if (!is_array($array) || !$array) {
+                    $resolve();
+                    return;
+                }
+
+                $fulfiller = function ($value) use ($cancellationQueue, $resolve) {
+                    $cancellationQueue();
+                    $resolve($value);
+                };
+
+                $rejecter = function ($reason) use ($cancellationQueue, $reject) {
+                    $cancellationQueue();
+                    $reject($reason);
+                };
+
+                foreach ($array as $promiseOrValue) {
+                    $cancellationQueue->enqueue($promiseOrValue);
+
+                    resolve($promiseOrValue)
+                        ->done($fulfiller, $rejecter, $notify);
+                }
+            }, $reject, $notify);
+    }, $cancellationQueue);
+}
+
+function any($promisesOrValues)
+{
+    return some($promisesOrValues, 1)
+        ->then(function ($val) {
+            return array_shift($val);
+        });
+}
+
+function some($promisesOrValues, $howMany)
+{
+    $cancellationQueue = new CancellationQueue();
+    $cancellationQueue->enqueue($promisesOrValues);
+
+    return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $howMany, $cancellationQueue) {
+        resolve($promisesOrValues)
+            ->done(function ($array) use ($howMany, $cancellationQueue, $resolve, $reject, $notify) {
+                if (!is_array($array) || $howMany < 1) {
+                    $resolve([]);
+                    return;
+                }
+
+                $len = count($array);
+
+                if ($len < $howMany) {
+                    throw new Exception\LengthException(
+                        sprintf(
+                            'Input array must contain at least %d item%s but contains only %s item%s.',
+                            $howMany,
+                            1 === $howMany ? '' : 's',
+                            $len,
+                            1 === $len ? '' : 's'
+                        )
+                    );
+                }
+
+                $toResolve = $howMany;
+                $toReject  = ($len - $toResolve) + 1;
+                $values    = [];
+                $reasons   = [];
+
+                foreach ($array as $i => $promiseOrValue) {
+                    $fulfiller = function ($val) use ($i, &$values, &$toResolve, $toReject, $resolve, $cancellationQueue) {
+                        if ($toResolve < 1 || $toReject < 1) {
+                            return;
+                        }
+
+                        $values[$i] = $val;
+
+                        if (0 === --$toResolve) {
+                            $cancellationQueue();
+                            $resolve($values);
+                        }
+                    };
+
+                    $rejecter = function ($reason) use ($i, &$reasons, &$toReject, $toResolve, $reject, $cancellationQueue) {
+                        if ($toResolve < 1 || $toReject < 1) {
+                            return;
+                        }
+
+                        $reasons[$i] = $reason;
+
+                        if (0 === --$toReject) {
+                            $cancellationQueue();
+                            $reject($reasons);
+                        }
+                    };
+
+                    $cancellationQueue->enqueue($promiseOrValue);
+
+                    resolve($promiseOrValue)
+                        ->done($fulfiller, $rejecter, $notify);
+                }
+            }, $reject, $notify);
+    }, $cancellationQueue);
+}
+
+function map($promisesOrValues, callable $mapFunc)
+{
+    $cancellationQueue = new CancellationQueue();
+    $cancellationQueue->enqueue($promisesOrValues);
+
+    return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $mapFunc, $cancellationQueue) {
+        resolve($promisesOrValues)
+            ->done(function ($array) use ($mapFunc, $cancellationQueue, $resolve, $reject, $notify) {
+                if (!is_array($array) || !$array) {
+                    $resolve([]);
+                    return;
+                }
+
+                $toResolve = count($array);
+                $values    = [];
+
+                foreach ($array as $i => $promiseOrValue) {
+                    $cancellationQueue->enqueue($promiseOrValue);
+
+                    resolve($promiseOrValue)
+                        ->then($mapFunc)
+                        ->done(
+                            function ($mapped) use ($i, &$values, &$toResolve, $resolve) {
+                                $values[$i] = $mapped;
+
+                                if (0 === --$toResolve) {
+                                    $resolve($values);
+                                }
+                            },
+                            $reject,
+                            $notify
+                        );
+                }
+            }, $reject, $notify);
+    }, $cancellationQueue);
+}
+
+function reduce($promisesOrValues, callable $reduceFunc, $initialValue = null)
+{
+    $cancellationQueue = new CancellationQueue();
+    $cancellationQueue->enqueue($promisesOrValues);
+
+    return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $reduceFunc, $initialValue, $cancellationQueue) {
+        resolve($promisesOrValues)
+            ->done(function ($array) use ($reduceFunc, $initialValue, $cancellationQueue, $resolve, $reject, $notify) {
+                if (!is_array($array)) {
+                    $array = [];
+                }
+
+                $total = count($array);
+                $i = 0;
+
+                // Wrap the supplied $reduceFunc with one that handles promises and then
+                // delegates to the supplied.
+                $wrappedReduceFunc = function ($current, $val) use ($reduceFunc, $cancellationQueue, $total, &$i) {
+                    $cancellationQueue->enqueue($val);
+
+                    return $current
+                        ->then(function ($c) use ($reduceFunc, $total, &$i, $val) {
+                            return resolve($val)
+                                ->then(function ($value) use ($reduceFunc, $total, &$i, $c) {
+                                    return $reduceFunc($c, $value, $i++, $total);
+                                });
+                        });
+                };
+
+                $cancellationQueue->enqueue($initialValue);
+
+                array_reduce($array, $wrappedReduceFunc, resolve($initialValue))
+                    ->done($resolve, $reject, $notify);
+            }, $reject, $notify);
+    }, $cancellationQueue);
+}
+
+// Internal functions
+function _checkTypehint(callable $callback, $object)
+{
+    if (!is_object($object)) {
+        return true;
+    }
+
+    if (is_array($callback)) {
+        $callbackReflection = new \ReflectionMethod($callback[0], $callback[1]);
+    } elseif (is_object($callback) && !$callback instanceof \Closure) {
+        $callbackReflection = new \ReflectionMethod($callback, '__invoke');
+    } else {
+        $callbackReflection = new \ReflectionFunction($callback);
+    }
+
+    $parameters = $callbackReflection->getParameters();
+
+    if (!isset($parameters[0])) {
+        return true;
+    }
+
+    $expectedException = $parameters[0];
+
+    if (!$expectedException->getClass()) {
+        return true;
+    }
+
+    return $expectedException->getClass()->isInstance($object);
+}
--- /dev/null
+++ b/vendor/react/promise/src/functions_include.php
@@ -0,0 +1,5 @@
+<?php
+
+if (!function_exists('React\Promise\resolve')) {
+    require __DIR__.'/functions.php';
+}
--- /dev/null
+++ b/vendor/s9e/text-formatter/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2010-2016 The s9e Authors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--- /dev/null
+++ b/vendor/s9e/text-formatter/composer.json
@@ -0,0 +1,29 @@
+{
+	"name": "s9e/text-formatter",
+	"version": "0.8.4",
+	"type": "library",
+	"description": "Multi-purpose text formatting and markup library. Plugins offer support for BBCodes, Markdown, emoticons, HTML, embedding media (YouTube, etc...), enhanced typography and more.",
+	"homepage": "https://github.com/s9e/TextFormatter/",
+	"keywords": ["bbcode","bbcodes","blog","censor","embed","emoji","emoticons","engine","forum","html","markdown","markup","media","parser","shortcodes"],
+	"license": "MIT",
+	"require": {
+		"php":        ">=5.3.3",
+		"ext-dom":    "*",
+		"ext-filter": "*",
+		"lib-pcre":   ">=7.2"
+	},
+	"suggest": {
+		"ext-curl":      "Improves the performance of the MediaEmbed plugin and some JavaScript minifiers",
+		"ext-intl":      "Allows international URLs to be accepted by the URL filter",
+		"ext-json":      "Enables the generation of a JavaScript parser",
+		"ext-mbstring":  "Improves the performance of the PHP renderer",
+		"ext-tokenizer": "Improves the performance of the PHP renderer",
+		"ext-xsl":       "Enables the XSLT renderer",
+		"ext-zlib":      "Enables gzip compression when scraping content via the MediaEmbed plugin"
+	},
+	"autoload": {
+		"psr-4": {
+			"s9e\\TextFormatter\\": "src"
+		}
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Bundle.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter;
+abstract class Bundle
+{
+	public static function getCachedParser()
+	{
+		if (!isset(static::$parser))
+			static::$parser = static::getParser();
+		return static::$parser;
+	}
+	public static function getCachedRenderer()
+	{
+		if (!isset(static::$renderer))
+			static::$renderer = static::getRenderer();
+		return static::$renderer;
+	}
+	public static function parse($text)
+	{
+		if (isset(static::$beforeParse))
+			$text = \call_user_func(static::$beforeParse, $text);
+		$xml = static::getCachedParser()->parse($text);
+		if (isset(static::$afterParse))
+			$xml = \call_user_func(static::$afterParse, $xml);
+		return $xml;
+	}
+	public static function render($xml, array $params = array())
+	{
+		$renderer = static::getCachedRenderer();
+		if (!empty($params))
+			$renderer->setParameters($params);
+		if (isset(static::$beforeRender))
+			$xml = \call_user_func(static::$beforeRender, $xml);
+		$output = $renderer->render($xml);
+		if (isset(static::$afterRender))
+			$output = \call_user_func(static::$afterRender, $output);
+		return $output;
+	}
+	public static function reset()
+	{
+		static::$parser   = \null;
+		static::$renderer = \null;
+	}
+	public static function unparse($xml)
+	{
+		if (isset(static::$beforeUnparse))
+			$xml = \call_user_func(static::$beforeUnparse, $xml);
+		$text = Unparser::unparse($xml);
+		if (isset(static::$afterUnparse))
+			$text = \call_user_func(static::$afterUnparse, $text);
+		return $text;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Bundles/Fatdown.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Bundles;
+abstract class Fatdown extends \s9e\TextFormatter\Bundle
+{
+	protected static $parser;
+	protected static $renderer;
+	public static function getParser()
+	{
+		return \unserialize('O:24:"s9e\\TextFormatter\\Parser":4:{s:16:"' . "\0" . '*' . "\0" . 'pluginsConfig";a:10:{s:9:"Autoemail";a:5:{s:8:"attrName";s:5:"email";s:10:"quickMatch";s:1:"@";s:6:"regexp";s:39:"/\\b[-a-z0-9_+.]+@[-a-z0-9.]*[a-z0-9]/Si";s:7:"tagName";s:5:"EMAIL";s:11:"regexpLimit";i:10000;}s:8:"Autolink";a:5:{s:8:"attrName";s:3:"url";s:6:"regexp";s:117:"#\\b(?:ftp|https?)://\\S(?>[^\\s\\[\\]\\x{FF01}-\\x{FF0F}\\x{FF1A}-\\x{FF20}\\x{FF3B}-\\x{FF40}\\x{FF5B}-\\x{FF65}]|\\[\\w*\\])++#Siu";s:7:"tagName";s:3:"URL";s:10:"quickMatch";s:3:"://";s:11:"regexpLimit";i:10000;}s:7:"Escaper";a:4:{s:10:"quickMatch";s:1:"\\";s:6:"regexp";s:29:"/\\\\[-!#()*+.:<>@[\\\\\\]^_`{|}]/";s:7:"tagName";s:3:"ESC";s:11:"regexpLimit";i:10000;}s:10:"FancyPants";a:2:{s:8:"attrName";s:4:"char";s:7:"tagName";s:2:"FP";}s:12:"HTMLComments";a:5:{s:8:"attrName";s:7:"content";s:10:"quickMatch";s:4:"<!--";s:6:"regexp";s:22:"/<!--(?!\\[if).*?-->/is";s:7:"tagName";s:2:"HC";s:11:"regexpLimit";i:10000;}s:12:"HTMLElements";a:5:{s:10:"quickMatch";s:1:"<";s:6:"prefix";s:4:"html";s:6:"regexp";s:393:"#<(?>/((?:a(?>bbr)?|br?|code|d(?>[dlt]|el|iv)|em|hr|i(?>mg|ns)?|li|ol|pre|r(?:[bp]|tc?|uby)|s(?>(?>pan|trong|u[bp]))?|t(?:[dr]|able|body|foot|h(?>ead)?)|ul?))|((?:a(?>bbr)?|br?|code|d(?>[dlt]|el|iv)|em|hr|i(?>mg|ns)?|li|ol|pre|r(?:[bp]|tc?|uby)|s(?>(?>pan|trong|u[bp]))?|t(?:[dr]|able|body|foot|h(?>ead)?)|ul?))((?>\\s+[a-z][-a-z0-9]*(?>\\s*=\\s*(?>"[^"]*"|\'[^\']*\'|[^\\s"\'=<>`]+))?)*+)\\s*/?)\\s*>#i";s:7:"aliases";a:6:{s:1:"a";a:2:{s:0:"";s:3:"URL";s:4:"href";s:3:"url";}s:2:"hr";a:1:{s:0:"";s:2:"HR";}s:2:"em";a:1:{s:0:"";s:2:"EM";}s:1:"s";a:1:{s:0:"";s:1:"S";}s:6:"strong";a:1:{s:0:"";s:6:"STRONG";}s:3:"sup";a:1:{s:0:"";s:3:"SUP";}}s:11:"regexpLimit";i:10000;}s:12:"HTMLEntities";a:5:{s:8:"attrName";s:4:"char";s:10:"quickMatch";s:1:"&";s:6:"regexp";s:38:"/&(?>[a-z]+|#(?>[0-9]+|x[0-9a-f]+));/i";s:7:"tagName";s:2:"HE";s:11:"regexpLimit";i:10000;}s:8:"Litedown";a:1:{s:18:"decodeHtmlEntities";b:1;}s:10:"MediaEmbed";a:4:{s:10:"quickMatch";s:1:":";s:6:"regexp";s:39:"/\\b(?>spotify:|https?:\\/\\/)[^["\'\\s]+/Si";s:7:"tagName";s:5:"MEDIA";s:11:"regexpLimit";i:10000;}s:10:"PipeTables";a:3:{s:16:"overwriteEscapes";b:1;s:17:"overwriteMarkdown";b:1;s:10:"quickMatch";s:1:"|";}}s:14:"registeredVars";a:2:{s:9:"urlConfig";a:1:{s:14:"allowedSchemes";s:20:"/^(?:ftp|https?)$/Di";}s:10:"mediasites";a:13:{s:12:"bandcamp.com";s:8:"bandcamp";s:15:"dailymotion.com";s:11:"dailymotion";s:12:"facebook.com";s:8:"facebook";s:12:"liveleak.com";s:8:"liveleak";s:14:"soundcloud.com";s:10:"soundcloud";s:16:"open.spotify.com";s:7:"spotify";s:16:"play.spotify.com";s:7:"spotify";s:8:"spotify:";s:7:"spotify";s:9:"twitch.tv";s:6:"twitch";s:9:"vimeo.com";s:5:"vimeo";s:7:"vine.co";s:4:"vine";s:11:"youtube.com";s:7:"youtube";s:8:"youtu.be";s:7:"youtube";}}s:14:"' . "\0" . '*' . "\0" . 'rootContext";a:2:{s:7:"allowed";a:2:{i:0;i:65335;i:1;i:65520;}s:5:"flags";i:8;}s:13:"' . "\0" . '*' . "\0" . 'tagsConfig";a:73:{s:8:"BANDCAMP";a:7:{s:10:"attributes";a:4:{s:8:"album_id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:8:"!^\\d+$!D";}}}s:8:"required";b:0;}s:8:"track_id";R:90;s:9:"track_num";R:90;s:3:"url";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:50:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterUrl";s:6:"params";a:3:{s:9:"attrValue";N;s:9:"urlConfig";N;s:6:"logger";N;}}}s:8:"required";b:0;}}s:11:"filterChain";a:3:{i:0;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:2:{i:0;a:3:{i:0;s:23:"!bandcamp\\.com/album/.!";i:1;s:25:"!/album=(?\'album_id\'\\d+)!";i:2;a:1:{i:0;s:8:"album_id";}}i:1;a:3:{i:0;s:23:"!bandcamp\\.com/track/.!";i:1;a:3:{i:0;s:29:"!"album_id":(?\'album_id\'\\d+)!";i:1;s:31:"!"track_num":(?\'track_num\'\\d+)!";i:2;s:25:"!/track=(?\'track_id\'\\d+)!";}i:2;a:3:{i:0;s:8:"album_id";i:1;s:8:"track_id";i:2;s:9:"track_num";}}}s:8:"cacheDir";N;}}i:1;a:2:{s:8:"callback";s:42:"s9e\\TextFormatter\\Parser::filterAttributes";s:6:"params";a:4:{s:3:"tag";N;s:9:"tagConfig";N;s:14:"registeredVars";N;s:6:"logger";N;}}i:2;a:2:{s:8:"callback";s:67:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::hasNonDefaultAttribute";s:6:"params";a:1:{s:3:"tag";N;}}}s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:3093;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:13;s:7:"allowed";a:2:{i:0;i:65329;i:1;i:65472;}}s:1:"C";a:6:{s:11:"filterChain";a:1:{i:0;R:129;}s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:66;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";a:2:{i:0;i:0;i:1;i:0;}}s:4:"CODE";a:7:{s:10:"attributes";a:1:{s:4:"lang";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:57:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterSimpletext";s:6:"params";a:1:{s:9:"attrValue";N;}}}s:8:"required";b:0;}}s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:2:{s:12:"fosterParent";a:10:{s:1:"C";i:1;s:2:"EM";i:1;s:6:"STRONG";i:1;s:3:"URL";i:1;s:5:"EMAIL";i:1;s:6:"html:b";i:1;s:9:"html:code";i:1;s:6:"html:i";i:1;s:11:"html:strong";i:1;s:6:"html:u";i:1;}s:5:"flags";i:4436;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:155;}s:11:"DAILYMOTION";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:17:"!^[A-Za-z0-9]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:98;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:94:"!dailymotion\\.com/(?:live/|swf/|user/[^#]+#video=|(?:related/\\d+/)?video/)(?\'id\'[A-Za-z0-9]+)!";i:2;a:2:{i:0;s:0:"";i:1;s:2:"id";}}i:1;a:3:{i:0;s:3:"url";i:1;s:24:"!^(?\'id\'[A-Za-z0-9]+)$!D";i:2;R:197;}}s:11:"filterChain";a:2:{i:0;a:2:{s:8:"callback";s:55:"s9e\\TextFormatter\\Parser::executeAttributePreprocessors";s:6:"params";a:2:{s:3:"tag";N;s:9:"tagConfig";N;}}i:1;R:129;}s:12:"nestingLimit";i:10;s:5:"rules";R:141;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:13;s:7:"allowed";R:145;}s:3:"DEL";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:512;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";R:83;}s:2:"EM";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:2;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";a:2:{i:0;i:65329;i:1;i:65488;}}s:5:"EMAIL";a:7:{s:10:"attributes";a:1:{s:5:"email";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:52:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterEmail";s:6:"params";R:164;}}s:8:"required";b:1;}}s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:514;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:4;s:7:"allowed";a:2:{i:0;i:61223;i:1;i:7952;}}s:3:"ESC";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:1616;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:5;s:7:"allowed";R:155;}s:8:"FACEBOOK";a:8:{s:10:"attributes";a:3:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:8:"@^\\d+$@D";}}}s:8:"required";b:1;}s:4:"type";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:10:"#^video$#D";}}}s:8:"required";b:0;}s:3:"url";R:98;}s:22:"attributePreprocessors";a:3:{i:0;a:3:{i:0;s:3:"url";i:1;s:135:"@/(?!(?:apps|developers|graph)\\.)[-\\w.]*facebook\\.com/(?:[/\\w]+/permalink|(?!pages/|groups/).*?)(?:/|fbid=|\\?v=)(?\'id\'\\d+)(?=$|[/?&#])@";i:2;R:197;}i:1;a:3:{i:0;s:3:"url";i:1;s:20:"#/(?\'type\'video)s?/#";i:2;a:2:{i:0;s:0:"";i:1;s:4:"type";}}i:2;a:3:{i:0;s:3:"url";i:1;s:15:"@^(?\'id\'\\d+)$@D";i:2;R:197;}}s:11:"filterChain";R:203;s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:3089;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:14;s:7:"allowed";a:2:{i:0;i:65329;i:1;i:65408;}}s:2:"FP";a:7:{s:10:"attributes";a:1:{s:4:"char";a:1:{s:8:"required";b:1;}}s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";R:280;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";R:224;}s:2:"H1";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:2:{s:12:"fosterParent";R:169;s:5:"flags";i:260;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:2;s:7:"allowed";R:224;}s:2:"H2";R:294;s:2:"H3";R:294;s:2:"H4";R:294;s:2:"H5";R:294;s:2:"H6";R:294;s:2:"HC";a:7:{s:10:"attributes";a:1:{s:7:"content";R:289;}s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:3153;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:5;s:7:"allowed";R:155;}s:2:"HE";R:287;s:2:"HR";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:3349;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:224;}s:3:"IMG";a:7:{s:10:"attributes";a:3:{s:3:"alt";a:1:{s:8:"required";b:0;}s:3:"src";a:2:{s:11:"filterChain";R:99;s:8:"required";b:1;}s:5:"title";R:315;}s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";R:280;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";R:224;}s:2:"LI";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:3:{s:12:"fosterParent";R:169;s:11:"closeParent";a:2:{s:2:"LI";i:1;s:7:"html:li";i:1;}s:5:"flags";i:264;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:3;s:7:"allowed";R:83;}s:4:"LIST";a:7:{s:10:"attributes";a:2:{s:5:"start";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterUint";s:6:"params";R:164;}}s:8:"required";b:0;}s:4:"type";R:160;}s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:2:{s:12:"fosterParent";R:169;s:5:"flags";i:3460;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";a:2:{i:0;i:65320;i:1;i:65296;}}s:8:"LIVELEAK";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:15:"!^[a-f_0-9]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:98;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:41:"!liveleak\\.com/view\\?i=(?\'id\'[a-f_0-9]+)!";i:2;R:197;}i:1;a:3:{i:0;s:3:"url";i:1;s:22:"!^(?\'id\'[a-f_0-9]+)$!D";i:2;R:197;}}s:11:"filterChain";R:203;s:12:"nestingLimit";i:10;s:5:"rules";R:141;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:13;s:7:"allowed";R:145;}s:5:"MEDIA";a:6:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:54:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::filterTag";s:6:"params";a:3:{s:3:"tag";N;s:6:"parser";N;s:10:"mediasites";N;}}}s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:513;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:12;s:7:"allowed";a:2:{i:0;i:65335;i:1;i:65504;}}s:5:"QUOTE";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:2:{s:12:"fosterParent";R:169;s:5:"flags";i:268;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:83;}s:10:"SOUNDCLOUD";a:8:{s:10:"attributes";a:5:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:83:"@^(?:https?://(?:api\\.)?soundcloud\\.com/(?!pages/)[-/\\w]+/[-/\\w]+|^[^/]+/[^/]+$)$@D";}}}s:8:"required";b:1;}s:11:"playlist_id";a:2:{s:11:"filterChain";R:251;s:8:"required";b:0;}s:12:"secret_token";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:11:"@^[-\\w]+$@D";}}}s:8:"required";b:0;}s:8:"track_id";R:398;s:3:"url";R:98;}s:22:"attributePreprocessors";a:5:{i:0;a:3:{i:0;s:3:"url";i:1;s:83:"@(?\'id\'https?://(?:api\\.)?soundcloud\\.com/(?!pages/)[-/\\w]+/[-/\\w]+|^[^/]+/[^/]+$)@";i:2;R:197;}i:1;a:3:{i:0;s:3:"url";i:1;s:52:"@api\\.soundcloud\\.com/playlists/(?\'playlist_id\'\\d+)@";i:2;a:2:{i:0;s:0:"";i:1;s:11:"playlist_id";}}i:2;a:3:{i:0;s:3:"url";i:1;s:89:"@api\\.soundcloud\\.com/tracks/(?\'track_id\'\\d+)(?:\\?secret_token=(?\'secret_token\'[-\\w]+))?@";i:2;a:3:{i:0;s:0:"";i:1;s:8:"track_id";i:2;s:12:"secret_token";}}i:3;a:3:{i:0;s:3:"url";i:1;s:81:"@soundcloud\\.com/(?!playlists|tracks)[-\\w]+/[-\\w]+/(?=s-)(?\'secret_token\'[-\\w]+)@";i:2;a:2:{i:0;s:0:"";i:1;s:12:"secret_token";}}i:4;a:3:{i:0;s:3:"url";i:1;s:90:"@^(?\'id\'(?:https?://(?:api\\.)?soundcloud\\.com/(?!pages/)[-/\\w]+/[-/\\w]+|^[^/]+/[^/]+$))$@D";i:2;R:197;}}s:11:"filterChain";a:3:{i:0;R:204;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:2:{i:0;a:3:{i:0;s:54:"@soundcloud\\.com/(?!playlists|tracks)[-\\w]+/[-\\w]+/s-@";i:1;s:36:"@soundcloud:tracks:(?\'track_id\'\\d+)@";i:2;a:1:{i:0;s:8:"track_id";}}i:1;a:3:{i:0;s:27:"@soundcloud\\.com/\\w+/sets/@";i:1;s:44:"@soundcloud://playlists:(?\'playlist_id\'\\d+)@";i:2;a:1:{i:0;s:11:"playlist_id";}}}s:8:"cacheDir";N;}}i:2;R:129;}s:12:"nestingLimit";i:10;s:5:"rules";R:280;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:15;s:7:"allowed";a:2:{i:0;i:65329;i:1;i:65344;}}s:7:"SPOTIFY";a:8:{s:10:"attributes";a:3:{s:4:"path";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:44:"!^(?:(?:album|artist|track|user)/[-/\\w]+)$!D";}}}s:8:"required";b:0;}s:3:"uri";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:61:"!^(?:spotify:(?:album|artist|user|track(?:set)?):[-,:\\w]+)$!D";}}}s:8:"required";b:0;}s:3:"url";R:98;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:62:"!(?\'uri\'spotify:(?:album|artist|user|track(?:set)?):[-,:\\w]+)!";i:2;a:2:{i:0;s:0:"";i:1;s:3:"uri";}}i:1;a:3:{i:0;s:3:"url";i:1;s:74:"!(?:open|play)\\.spotify\\.com/(?\'path\'(?:album|artist|track|user)/[-/\\w]+)!";i:2;a:2:{i:0;s:0:"";i:1;s:4:"path";}}}s:11:"filterChain";a:3:{i:0;R:204;i:1;R:129;i:2;R:136;}s:12:"nestingLimit";i:10;s:5:"rules";R:141;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:13;s:7:"allowed";R:145;}s:6:"STRONG";R:218;s:3:"SUP";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:0;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";R:224;}s:5:"TABLE";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";R:339;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";a:2:{i:0;i:65376;i:1;i:65297;}}s:5:"TBODY";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:3:{s:12:"fosterParent";R:169;s:11:"closeParent";a:11:{s:5:"TBODY";i:1;s:2:"TD";i:1;s:2:"TH";i:1;s:5:"THEAD";i:1;s:2:"TR";i:1;s:10:"html:tbody";i:1;s:7:"html:td";i:1;s:10:"html:tfoot";i:1;s:7:"html:th";i:1;s:10:"html:thead";i:1;s:7:"html:tr";i:1;}s:5:"flags";i:3456;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:6;s:7:"allowed";a:2:{i:0;i:65312;i:1;i:65297;}}s:2:"TD";a:7:{s:10:"attributes";a:1:{s:5:"align";a:2:{s:11:"filterChain";a:2:{i:0;a:2:{s:8:"callback";s:10:"strtolower";s:6:"params";R:164;}i:1;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:34:"/^(?>center|justify|left|right)$/D";}}}s:8:"required";b:0;}}s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:3:{s:12:"fosterParent";R:169;s:11:"closeParent";a:4:{s:2:"TD";i:1;s:2:"TH";i:1;s:7:"html:td";i:1;s:7:"html:th";i:1;}s:5:"flags";i:256;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:7;s:7:"allowed";R:83;}s:2:"TH";a:7:{s:10:"attributes";R:527;s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";R:539;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:7;s:7:"allowed";a:2:{i:0;i:64307;i:1;i:65520;}}s:5:"THEAD";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:2:{s:12:"fosterParent";R:169;s:5:"flags";i:3456;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:6;s:7:"allowed";R:523;}s:2:"TR";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:3:{s:12:"fosterParent";R:169;s:11:"closeParent";a:6:{s:2:"TD";i:1;s:2:"TH";i:1;s:2:"TR";i:1;s:7:"html:td";i:1;s:7:"html:th";i:1;s:7:"html:tr";i:1;}s:5:"flags";i:3456;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:8;s:7:"allowed";a:2:{i:0;i:65440;i:1;i:65296;}}s:6:"TWITCH";a:8:{s:10:"attributes";a:7:{s:10:"archive_id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:8:"#^\\d+$#D";}}}s:8:"required";b:0;}s:7:"channel";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:8:"#^\\w+$#D";}}}s:8:"required";b:0;}s:10:"chapter_id";R:579;s:7:"clip_id";R:587;s:1:"t";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:27:"#^(?:(?:\\d+h)?\\d+m)?\\d+s$#D";}}}s:8:"required";b:0;}s:3:"url";R:98;s:8:"video_id";R:579;}s:22:"attributePreprocessors";a:3:{i:0;a:3:{i:0;s:3:"url";i:1;s:96:"#twitch\\.tv/(?\'channel\'\\w+)(?:/b/(?\'archive_id\'\\d+)|/c/(?\'chapter_id\'\\d+)|/v/(?\'video_id\'\\d+))?#";i:2;a:5:{i:0;s:0:"";i:1;s:7:"channel";i:2;s:10:"archive_id";i:3;s:10:"chapter_id";i:4;s:8:"video_id";}}i:1;a:3:{i:0;s:3:"url";i:1;s:32:"#t=(?\'t\'(?:(?:\\d+h)?\\d+m)?\\d+s)#";i:2;a:2:{i:0;s:0:"";i:1;s:1:"t";}}i:2;a:3:{i:0;s:3:"url";i:1;s:51:"#clips\\.twitch\\.tv/(?\'channel\'\\w+)/(?\'clip_id\'\\w+)#";i:2;a:3:{i:0;s:0:"";i:1;s:7:"channel";i:2;s:7:"clip_id";}}}s:11:"filterChain";R:488;s:12:"nestingLimit";i:10;s:5:"rules";R:141;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:13;s:7:"allowed";R:145;}s:3:"URL";a:7:{s:10:"attributes";a:2:{s:5:"title";R:315;s:3:"url";R:317;}s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";R:235;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:4;s:7:"allowed";R:239;}s:5:"VIMEO";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";R:91;s:8:"required";b:1;}s:3:"url";R:98;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:50:"!vimeo\\.com/(?:channels/[^/]+/|video/)?(?\'id\'\\d+)!";i:2;R:197;}i:1;a:3:{i:0;s:3:"url";i:1;s:15:"!^(?\'id\'\\d+)$!D";i:2;R:197;}}s:11:"filterChain";R:203;s:12:"nestingLimit";i:10;s:5:"rules";R:141;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:13;s:7:"allowed";R:145;}s:4:"VINE";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:10:"!^[^/]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:98;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:25:"!vine\\.co/v/(?\'id\'[^/]+)!";i:2;R:197;}i:1;a:3:{i:0;s:3:"url";i:1;s:17:"!^(?\'id\'[^/]+)$!D";i:2;R:197;}}s:11:"filterChain";R:203;s:12:"nestingLimit";i:10;s:5:"rules";R:141;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:13;s:7:"allowed";R:145;}s:7:"YOUTUBE";a:8:{s:10:"attributes";a:7:{s:1:"h";R:90;s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:11:"!^[-\\w]+$!D";}}}s:8:"required";b:1;}s:4:"list";a:2:{s:11:"filterChain";R:671;s:8:"required";b:0;}s:1:"m";R:90;s:1:"s";R:90;s:1:"t";R:90;s:3:"url";R:98;}s:22:"attributePreprocessors";a:5:{i:0;a:3:{i:0;s:3:"url";i:1;s:45:"!youtube\\.com/(?:watch.*?v=|v/)(?\'id\'[-\\w]+)!";i:2;R:197;}i:1;a:3:{i:0;s:3:"url";i:1;s:25:"!youtu\\.be/(?\'id\'[-\\w]+)!";i:2;R:197;}i:2;a:3:{i:0;s:3:"url";i:1;s:57:"![#&?]t=(?:(?:(?\'h\'\\d+)h)?(?\'m\'\\d+)m(?\'s\'\\d+)|(?\'t\'\\d+))!";i:2;a:5:{i:0;s:0:"";i:1;s:1:"h";i:2;s:1:"m";i:3;s:1:"s";i:4;s:1:"t";}}i:3;a:3:{i:0;s:3:"url";i:1;s:23:"!&list=(?\'list\'[-\\w]+)!";i:2;a:2:{i:0;s:0:"";i:1;s:4:"list";}}i:4;a:3:{i:0;s:3:"url";i:1;s:18:"!^(?\'id\'[-\\w]+)$!D";i:2;R:197;}}s:11:"filterChain";R:203;s:12:"nestingLimit";i:10;s:5:"rules";R:141;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:13;s:7:"allowed";R:145;}s:9:"html:abbr";a:7:{s:10:"attributes";a:1:{s:5:"title";R:315;}s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";R:494;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";R:224;}s:6:"html:b";R:218;s:7:"html:br";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:3201;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";a:2:{i:0;i:65312;i:1;i:65296;}}s:9:"html:code";R:148;s:7:"html:dd";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:3:{s:12:"fosterParent";R:169;s:11:"closeParent";a:2:{s:7:"html:dd";i:1;s:7:"html:dt";i:1;}s:5:"flags";i:256;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:9;s:7:"allowed";R:83;}s:8:"html:del";R:212;s:8:"html:div";a:7:{s:10:"attributes";a:1:{s:5:"class";R:315;}s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";R:384;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:83;}s:7:"html:dl";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";R:339;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";a:2:{i:0;i:65312;i:1;i:65298;}}s:7:"html:dt";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";R:724;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:9;s:7:"allowed";R:552;}s:6:"html:i";R:218;s:8:"html:img";a:7:{s:10:"attributes";a:5:{s:3:"alt";R:315;s:6:"height";R:315;s:3:"src";R:98;s:5:"title";R:315;s:5:"width";R:315;}s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";R:715;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";R:719;}s:8:"html:ins";R:212;s:7:"html:li";R:322;s:7:"html:ol";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";R:339;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:343;}s:8:"html:pre";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:2:{s:12:"fosterParent";R:169;s:5:"flags";i:276;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:224;}s:7:"html:rb";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:2:{s:12:"fosterParent";R:169;s:5:"flags";i:256;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:10;s:7:"allowed";R:224;}s:7:"html:rp";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:3:{s:12:"fosterParent";R:169;s:11:"closeParent";a:2:{s:7:"html:rp";i:1;s:7:"html:rt";i:1;}s:5:"flags";i:256;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:11;s:7:"allowed";R:224;}s:7:"html:rt";R:768;s:8:"html:rtc";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";R:764;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:10;s:7:"allowed";a:2:{i:0;i:65329;i:1;i:65496;}}s:9:"html:ruby";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";R:494;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";a:2:{i:0;i:65329;i:1;i:65500;}}s:9:"html:span";a:7:{s:10:"attributes";R:732;s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";R:494;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";R:224;}s:11:"html:strong";R:218;s:8:"html:sub";R:492;s:8:"html:sup";R:492;s:10:"html:table";R:498;s:10:"html:tbody";R:505;s:7:"html:td";a:7:{s:10:"attributes";a:2:{s:7:"colspan";R:315;s:7:"rowspan";R:315;}s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";R:539;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:7;s:7:"allowed";R:83;}s:10:"html:tfoot";a:6:{s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";a:3:{s:12:"fosterParent";R:169;s:11:"closeParent";a:10:{s:5:"TBODY";i:1;s:2:"TD";i:1;s:2:"TH";i:1;s:5:"THEAD";i:1;s:2:"TR";i:1;s:10:"html:tbody";i:1;s:7:"html:td";i:1;s:7:"html:th";i:1;s:10:"html:thead";i:1;s:7:"html:tr";i:1;}s:5:"flags";i:3456;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:6;s:7:"allowed";R:523;}s:7:"html:th";a:7:{s:10:"attributes";a:3:{s:7:"colspan";R:315;s:7:"rowspan";R:315;s:5:"scope";R:315;}s:11:"filterChain";R:149;s:12:"nestingLimit";i:10;s:5:"rules";R:539;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:7;s:7:"allowed";R:552;}s:10:"html:thead";R:555;s:7:"html:tr";R:561;s:6:"html:u";R:218;s:7:"html:ul";R:752;}}');
+	}
+	public static function getRenderer()
+	{
+		return \unserialize('O:42:"s9e\\TextFormatter\\Bundles\\Fatdown\\Renderer":2:{s:9:"' . "\0" . '*' . "\0" . 'params";a:0:{}s:18:"metaElementsRegexp";s:22:"(<[eis]>[^<]*</[eis]>)";}');
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Bundles/Fatdown/Renderer.php
@@ -0,0 +1,117 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Bundles\Fatdown;
+class Renderer extends \s9e\TextFormatter\Renderer
+{
+	protected $params=array();
+	protected static $tagBranches=array('BANDCAMP'=>0,'C'=>1,'html:code'=>1,'CODE'=>2,'DAILYMOTION'=>3,'DEL'=>4,'html:del'=>4,'EM'=>5,'EMAIL'=>6,'ESC'=>7,'FACEBOOK'=>8,'FP'=>9,'HE'=>9,'H1'=>10,'H2'=>11,'H3'=>12,'H4'=>13,'H5'=>14,'H6'=>15,'HC'=>16,'HR'=>17,'IMG'=>18,'LI'=>19,'html:li'=>19,'LIST'=>20,'LIVELEAK'=>21,'QUOTE'=>22,'SOUNDCLOUD'=>23,'SPOTIFY'=>24,'STRONG'=>25,'html:strong'=>25,'SUP'=>26,'html:sup'=>26,'TABLE'=>27,'html:table'=>27,'TBODY'=>28,'html:tbody'=>28,'TD'=>29,'TH'=>30,'THEAD'=>31,'html:thead'=>31,'TR'=>32,'html:tr'=>32,'TWITCH'=>33,'URL'=>34,'VIMEO'=>35,'VINE'=>36,'YOUTUBE'=>37,'br'=>38,'e'=>39,'i'=>39,'s'=>39,'html:abbr'=>40,'html:b'=>41,'html:br'=>42,'html:dd'=>43,'html:div'=>44,'html:dl'=>45,'html:dt'=>46,'html:i'=>47,'html:img'=>48,'html:ins'=>49,'html:ol'=>50,'html:pre'=>51,'html:rb'=>52,'html:rp'=>53,'html:rt'=>54,'html:rtc'=>55,'html:ruby'=>56,'html:span'=>57,'html:sub'=>58,'html:td'=>59,'html:tfoot'=>60,'html:th'=>61,'html:u'=>62,'html:ul'=>63,'p'=>64);
+	public function __sleep()
+	{
+		$props = \get_object_vars($this);
+		unset($props['out'], $props['proc'], $props['source']);
+		return \array_keys($props);
+	}
+	public function renderRichText($xml)
+	{
+		if (!isset($this->quickRenderingTest) || !\preg_match($this->quickRenderingTest, $xml))
+			try
+			{
+				return $this->renderQuick($xml);
+			}
+			catch (\Exception $e)
+			{
+			}
+		$dom = $this->loadXML($xml);
+		$this->out = '';
+		$this->at($dom->documentElement);
+		return $this->out;
+	}
+	protected function at(\DOMNode $root)
+	{
+		if ($root->nodeType === 3)
+			$this->out .= \htmlspecialchars($root->textContent,0);
+		else
+			foreach ($root->childNodes as $node)
+				if (!isset(self::$tagBranches[$node->nodeName]))
+					$this->at($node);
+				else
+				{
+					$tb = self::$tagBranches[$node->nodeName];
+					if($tb<33)if($tb<17)if($tb<9)if($tb<5)if($tb<3)if($tb===0){$this->out.='<div data-s9e-mediaembed="bandcamp" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="//bandcamp.com/EmbeddedPlayer/size=large/minimal=true/';if($node->hasAttribute('album_id')){$this->out.='album='.\htmlspecialchars($node->getAttribute('album_id'),2);if($node->hasAttribute('track_num'))$this->out.='/t='.\htmlspecialchars($node->getAttribute('track_num'),2);}else$this->out.='track='.\htmlspecialchars($node->getAttribute('track_id'),2);$this->out.='"></iframe></div></div>';}elseif($tb===1){$this->out.='<code>';$this->at($node);$this->out.='</code>';}else{$this->out.='<pre><code';if($node->hasAttribute('lang'))$this->out.=' class="language-'.\htmlspecialchars($node->getAttribute('lang'),2).'"';$this->out.='>';$this->at($node);$this->out.='</code></pre>';}elseif($tb===3)$this->out.='<div data-s9e-mediaembed="dailymotion" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.dailymotion.com/embed/video/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else{$this->out.='<del>';$this->at($node);$this->out.='</del>';}elseif($tb===5){$this->out.='<em>';$this->at($node);$this->out.='</em>';}elseif($tb===6){$this->out.='<a href="mailto:'.\htmlspecialchars($node->getAttribute('email'),2).'">';$this->at($node);$this->out.='</a>';}elseif($tb===7)$this->at($node);else$this->out.='<iframe data-s9e-mediaembed="facebook" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/facebook.min.html#'.\htmlspecialchars($node->getAttribute('type').$node->getAttribute('id'),2).'" style="border:0;height:360px;max-width:640px;width:100%"></iframe>';elseif($tb<13)if($tb===9)$this->out.=\htmlspecialchars($node->getAttribute('char'),0);elseif($tb===10){$this->out.='<h1>';$this->at($node);$this->out.='</h1>';}elseif($tb===11){$this->out.='<h2>';$this->at($node);$this->out.='</h2>';}else{$this->out.='<h3>';$this->at($node);$this->out.='</h3>';}elseif($tb===13){$this->out.='<h4>';$this->at($node);$this->out.='</h4>';}elseif($tb===14){$this->out.='<h5>';$this->at($node);$this->out.='</h5>';}elseif($tb===15){$this->out.='<h6>';$this->at($node);$this->out.='</h6>';}else$this->out.='<!--'.\htmlspecialchars($node->getAttribute('content'),0).'-->';elseif($tb<25)if($tb<21){if($tb===17)$this->out.='<hr>';elseif($tb===18){$this->out.='<img src="'.\htmlspecialchars($node->getAttribute('src'),2).'"';if($node->hasAttribute('alt'))$this->out.=' alt="'.\htmlspecialchars($node->getAttribute('alt'),2).'"';if($node->hasAttribute('title'))$this->out.=' title="'.\htmlspecialchars($node->getAttribute('title'),2).'"';$this->out.='>';}elseif($tb===19){$this->out.='<li>';$this->at($node);$this->out.='</li>';}elseif(!$node->hasAttribute('type')){$this->out.='<ul>';$this->at($node);$this->out.='</ul>';}else{$this->out.='<ol';if($node->hasAttribute('start'))$this->out.=' start="'.\htmlspecialchars($node->getAttribute('start'),2).'"';$this->out.='>';$this->at($node);$this->out.='</ol>';}}elseif($tb===21)$this->out.='<div data-s9e-mediaembed="liveleak" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.liveleak.com/ll_embed?i='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===22){$this->out.='<blockquote>';$this->at($node);$this->out.='</blockquote>';}elseif($tb===23){$this->out.='<iframe data-s9e-mediaembed="soundcloud" allowfullscreen="" scrolling="no" src="https://w.soundcloud.com/player/?url=';if($node->hasAttribute('playlist_id'))$this->out.='https%3A//api.soundcloud.com/playlists/'.\htmlspecialchars($node->getAttribute('playlist_id'),2);elseif($node->hasAttribute('track_id'))$this->out.='https%3A//api.soundcloud.com/tracks/'.\htmlspecialchars($node->getAttribute('track_id'),2).'&amp;secret_token='.\htmlspecialchars($node->getAttribute('secret_token'),2);else{if((\strpos($node->getAttribute('id'),'://')===\false))$this->out.='https%3A//soundcloud.com/';$this->out.=\htmlspecialchars($node->getAttribute('id'),2);}$this->out.='" style="border:0;height:';if($node->hasAttribute('playlist_id')||(\strpos($node->getAttribute('id'),'/sets/')!==\false))$this->out.='450';else$this->out.='166';$this->out.='px;max-width:900px;width:100%"></iframe>';}else{$this->out.='<div data-s9e-mediaembed="spotify" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:120%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="https://embed.spotify.com/?view=coverart&amp;uri=';if($node->hasAttribute('uri'))$this->out.=\htmlspecialchars($node->getAttribute('uri'),2);else$this->out.='spotify:'.\htmlspecialchars(\strtr($node->getAttribute('path'),'/',':'),2);$this->out.='"></iframe></div></div>';}elseif($tb<29)if($tb===25){$this->out.='<strong>';$this->at($node);$this->out.='</strong>';}elseif($tb===26){$this->out.='<sup>';$this->at($node);$this->out.='</sup>';}elseif($tb===27){$this->out.='<table>';$this->at($node);$this->out.='</table>';}else{$this->out.='<tbody>';$this->at($node);$this->out.='</tbody>';}elseif($tb===29){$this->out.='<td';if($node->hasAttribute('align'))$this->out.=' style="text-align:'.\htmlspecialchars($node->getAttribute('align'),2).'"';$this->out.='>';$this->at($node);$this->out.='</td>';}elseif($tb===30){$this->out.='<th';if($node->hasAttribute('align'))$this->out.=' style="text-align:'.\htmlspecialchars($node->getAttribute('align'),2).'"';$this->out.='>';$this->at($node);$this->out.='</th>';}elseif($tb===31){$this->out.='<thead>';$this->at($node);$this->out.='</thead>';}else{$this->out.='<tr>';$this->at($node);$this->out.='</tr>';}elseif($tb<49)if($tb<41){if($tb<37)if($tb===33){$this->out.='<div data-s9e-mediaembed="twitch" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="';if($node->hasAttribute('clip_id'))$this->out.='//clips.twitch.tv/embed?autoplay=false&amp;clip='.\htmlspecialchars($node->getAttribute('channel'),2).'/'.\htmlspecialchars($node->getAttribute('clip_id'),2);else{$this->out.='//player.twitch.tv/?autoplay=false&amp;';if($node->hasAttribute('archive_id'))$this->out.='video=a'.\htmlspecialchars($node->getAttribute('archive_id'),2);elseif($node->hasAttribute('chapter_id'))$this->out.='video=c'.\htmlspecialchars($node->getAttribute('chapter_id'),2);elseif($node->hasAttribute('video_id'))$this->out.='video=v'.\htmlspecialchars($node->getAttribute('video_id'),2);else$this->out.='channel='.\htmlspecialchars($node->getAttribute('channel'),2);if($node->hasAttribute('t'))$this->out.='&amp;time='.\htmlspecialchars($node->getAttribute('t'),2);}$this->out.='"></iframe></div></div>';}elseif($tb===34){$this->out.='<a href="'.\htmlspecialchars($node->getAttribute('url'),2).'"';if($node->hasAttribute('title'))$this->out.=' title="'.\htmlspecialchars($node->getAttribute('title'),2).'"';$this->out.='>';$this->at($node);$this->out.='</a>';}elseif($tb===35)$this->out.='<div data-s9e-mediaembed="vimeo" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//player.vimeo.com/video/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="vine" style="display:inline-block;width:100%;max-width:480px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" src="https://vine.co/v/'.\htmlspecialchars($node->getAttribute('id'),2).'/embed/simple?audio=1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===37){$this->out.='<div data-s9e-mediaembed="youtube" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="background:url(https://i.ytimg.com/vi/'.\htmlspecialchars($node->getAttribute('id'),2).'/hqdefault.jpg) 50% 50% / cover;border:0;height:100%;left:0;position:absolute;width:100%" src="https://www.youtube.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2);if($node->hasAttribute('list'))$this->out.='?list='.\htmlspecialchars($node->getAttribute('list'),2);if($node->hasAttribute('t')||$node->hasAttribute('m')){if($node->hasAttribute('list'))$this->out.='&amp;';else$this->out.='?';$this->out.='start=';if($node->hasAttribute('t'))$this->out.=\htmlspecialchars($node->getAttribute('t'),2);elseif($node->hasAttribute('h'))$this->out.=\htmlspecialchars($node->getAttribute('h')*3600+$node->getAttribute('m')*60+$node->getAttribute('s'),2);else$this->out.=\htmlspecialchars($node->getAttribute('m')*60+$node->getAttribute('s'),2);}$this->out.='"></iframe></div></div>';}elseif($tb===38)$this->out.='<br>';elseif($tb===39);else{$this->out.='<abbr';if($node->hasAttribute('title'))$this->out.=' title="'.\htmlspecialchars($node->getAttribute('title'),2).'"';$this->out.='>';$this->at($node);$this->out.='</abbr>';}}elseif($tb<45){if($tb===41){$this->out.='<b>';$this->at($node);$this->out.='</b>';}elseif($tb===42)$this->out.='<br>';elseif($tb===43){$this->out.='<dd>';$this->at($node);$this->out.='</dd>';}else{$this->out.='<div';if($node->hasAttribute('class'))$this->out.=' class="'.\htmlspecialchars($node->getAttribute('class'),2).'"';$this->out.='>';$this->at($node);$this->out.='</div>';}}elseif($tb===45){$this->out.='<dl>';$this->at($node);$this->out.='</dl>';}elseif($tb===46){$this->out.='<dt>';$this->at($node);$this->out.='</dt>';}elseif($tb===47){$this->out.='<i>';$this->at($node);$this->out.='</i>';}else{$this->out.='<img';if($node->hasAttribute('alt'))$this->out.=' alt="'.\htmlspecialchars($node->getAttribute('alt'),2).'"';if($node->hasAttribute('height'))$this->out.=' height="'.\htmlspecialchars($node->getAttribute('height'),2).'"';if($node->hasAttribute('src'))$this->out.=' src="'.\htmlspecialchars($node->getAttribute('src'),2).'"';if($node->hasAttribute('title'))$this->out.=' title="'.\htmlspecialchars($node->getAttribute('title'),2).'"';if($node->hasAttribute('width'))$this->out.=' width="'.\htmlspecialchars($node->getAttribute('width'),2).'"';$this->out.='>';}elseif($tb<57)if($tb<53)if($tb===49){$this->out.='<ins>';$this->at($node);$this->out.='</ins>';}elseif($tb===50){$this->out.='<ol>';$this->at($node);$this->out.='</ol>';}elseif($tb===51){$this->out.='<pre>';$this->at($node);$this->out.='</pre>';}else{$this->out.='<rb>';$this->at($node);$this->out.='</rb>';}elseif($tb===53){$this->out.='<rp>';$this->at($node);$this->out.='</rp>';}elseif($tb===54){$this->out.='<rt>';$this->at($node);$this->out.='</rt>';}elseif($tb===55){$this->out.='<rtc>';$this->at($node);$this->out.='</rtc>';}else{$this->out.='<ruby>';$this->at($node);$this->out.='</ruby>';}elseif($tb<61)if($tb===57){$this->out.='<span';if($node->hasAttribute('class'))$this->out.=' class="'.\htmlspecialchars($node->getAttribute('class'),2).'"';$this->out.='>';$this->at($node);$this->out.='</span>';}elseif($tb===58){$this->out.='<sub>';$this->at($node);$this->out.='</sub>';}elseif($tb===59){$this->out.='<td';if($node->hasAttribute('colspan'))$this->out.=' colspan="'.\htmlspecialchars($node->getAttribute('colspan'),2).'"';if($node->hasAttribute('rowspan'))$this->out.=' rowspan="'.\htmlspecialchars($node->getAttribute('rowspan'),2).'"';$this->out.='>';$this->at($node);$this->out.='</td>';}else{$this->out.='<tfoot>';$this->at($node);$this->out.='</tfoot>';}elseif($tb===61){$this->out.='<th';if($node->hasAttribute('colspan'))$this->out.=' colspan="'.\htmlspecialchars($node->getAttribute('colspan'),2).'"';if($node->hasAttribute('rowspan'))$this->out.=' rowspan="'.\htmlspecialchars($node->getAttribute('rowspan'),2).'"';if($node->hasAttribute('scope'))$this->out.=' scope="'.\htmlspecialchars($node->getAttribute('scope'),2).'"';$this->out.='>';$this->at($node);$this->out.='</th>';}elseif($tb===62){$this->out.='<u>';$this->at($node);$this->out.='</u>';}elseif($tb===63){$this->out.='<ul>';$this->at($node);$this->out.='</ul>';}else{$this->out.='<p>';$this->at($node);$this->out.='</p>';}
+				}
+	}
+	private static $static=array('/C'=>'</code>','/CODE'=>'</code></pre>','/DEL'=>'</del>','/EM'=>'</em>','/EMAIL'=>'</a>','/ESC'=>'','/H1'=>'</h1>','/H2'=>'</h2>','/H3'=>'</h3>','/H4'=>'</h4>','/H5'=>'</h5>','/H6'=>'</h6>','/LI'=>'</li>','/QUOTE'=>'</blockquote>','/STRONG'=>'</strong>','/SUP'=>'</sup>','/TABLE'=>'</table>','/TBODY'=>'</tbody>','/TD'=>'</td>','/TH'=>'</th>','/THEAD'=>'</thead>','/TR'=>'</tr>','/URL'=>'</a>','/html:abbr'=>'</abbr>','/html:b'=>'</b>','/html:code'=>'</code>','/html:dd'=>'</dd>','/html:del'=>'</del>','/html:div'=>'</div>','/html:dl'=>'</dl>','/html:dt'=>'</dt>','/html:i'=>'</i>','/html:ins'=>'</ins>','/html:li'=>'</li>','/html:ol'=>'</ol>','/html:pre'=>'</pre>','/html:rb'=>'</rb>','/html:rp'=>'</rp>','/html:rt'=>'</rt>','/html:rtc'=>'</rtc>','/html:ruby'=>'</ruby>','/html:span'=>'</span>','/html:strong'=>'</strong>','/html:sub'=>'</sub>','/html:sup'=>'</sup>','/html:table'=>'</table>','/html:tbody'=>'</tbody>','/html:td'=>'</td>','/html:tfoot'=>'</tfoot>','/html:th'=>'</th>','/html:thead'=>'</thead>','/html:tr'=>'</tr>','/html:u'=>'</u>','/html:ul'=>'</ul>','C'=>'<code>','DEL'=>'<del>','EM'=>'<em>','ESC'=>'','H1'=>'<h1>','H2'=>'<h2>','H3'=>'<h3>','H4'=>'<h4>','H5'=>'<h5>','H6'=>'<h6>','HR'=>'<hr>','LI'=>'<li>','QUOTE'=>'<blockquote>','STRONG'=>'<strong>','SUP'=>'<sup>','TABLE'=>'<table>','TBODY'=>'<tbody>','THEAD'=>'<thead>','TR'=>'<tr>','html:b'=>'<b>','html:br'=>'<br>','html:code'=>'<code>','html:dd'=>'<dd>','html:del'=>'<del>','html:dl'=>'<dl>','html:dt'=>'<dt>','html:i'=>'<i>','html:ins'=>'<ins>','html:li'=>'<li>','html:ol'=>'<ol>','html:pre'=>'<pre>','html:rb'=>'<rb>','html:rp'=>'<rp>','html:rt'=>'<rt>','html:rtc'=>'<rtc>','html:ruby'=>'<ruby>','html:strong'=>'<strong>','html:sub'=>'<sub>','html:sup'=>'<sup>','html:table'=>'<table>','html:tbody'=>'<tbody>','html:tfoot'=>'<tfoot>','html:thead'=>'<thead>','html:tr'=>'<tr>','html:u'=>'<u>','html:ul'=>'<ul>');
+	private static $dynamic=array('DAILYMOTION'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="dailymotion" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.dailymotion.com/embed/video/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'EMAIL'=>array('(^[^ ]+(?> (?!email=)[^=]+="[^"]*")*(?> email="([^"]*)")?.*)s','<a href="mailto:$1">'),'IMG'=>array('(^[^ ]+(?> (?!(?>alt|src|title)=)[^=]+="[^"]*")*( alt="[^"]*")?(?> (?!(?>src|title)=)[^=]+="[^"]*")*(?> src="([^"]*)")?(?> (?!title=)[^=]+="[^"]*")*( title="[^"]*")?.*)s','<img src="$2"$1$3>'),'LIVELEAK'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="liveleak" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.liveleak.com/ll_embed?i=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'URL'=>array('(^[^ ]+(?> (?!(?>title|url)=)[^=]+="[^"]*")*( title="[^"]*")?(?> (?!url=)[^=]+="[^"]*")*(?> url="([^"]*)")?.*)s','<a href="$2"$1>'),'VIMEO'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="vimeo" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//player.vimeo.com/video/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'VINE'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="vine" style="display:inline-block;width:100%;max-width:480px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" src="https://vine.co/v/$1/embed/simple?audio=1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'html:abbr'=>array('(^[^ ]+(?> (?!title=)[^=]+="[^"]*")*( title="[^"]*")?.*)s','<abbr$1>'),'html:div'=>array('(^[^ ]+(?> (?!class=)[^=]+="[^"]*")*( class="[^"]*")?.*)s','<div$1>'),'html:img'=>array('(^[^ ]+(?> (?!(?>alt|height|src|title|width)=)[^=]+="[^"]*")*( alt="[^"]*")?(?> (?!(?>height|src|title|width)=)[^=]+="[^"]*")*( height="[^"]*")?(?> (?!(?>src|title|width)=)[^=]+="[^"]*")*( src="[^"]*")?(?> (?!(?>title|width)=)[^=]+="[^"]*")*( title="[^"]*")?(?> (?!width=)[^=]+="[^"]*")*( width="[^"]*")?.*)s','<img$1$2$3$4$5>'),'html:span'=>array('(^[^ ]+(?> (?!class=)[^=]+="[^"]*")*( class="[^"]*")?.*)s','<span$1>'),'html:td'=>array('(^[^ ]+(?> (?!(?>col|row)span=)[^=]+="[^"]*")*( colspan="[^"]*")?(?> (?!rowspan=)[^=]+="[^"]*")*( rowspan="[^"]*")?.*)s','<td$1$2>'),'html:th'=>array('(^[^ ]+(?> (?!(?>colspan|rowspan|scope)=)[^=]+="[^"]*")*( colspan="[^"]*")?(?> (?!(?>rowspan|scope)=)[^=]+="[^"]*")*( rowspan="[^"]*")?(?> (?!scope=)[^=]+="[^"]*")*( scope="[^"]*")?.*)s','<th$1$2$3>'));
+	private static $attributes;
+	private static $quickBranches=array('/LIST'=>0,'BANDCAMP'=>1,'CODE'=>2,'FACEBOOK'=>3,'FP'=>4,'HC'=>5,'HE'=>4,'LIST'=>6,'SOUNDCLOUD'=>7,'SPOTIFY'=>8,'TD'=>9,'TH'=>10,'TWITCH'=>11,'YOUTUBE'=>12);
+	protected function renderQuick($xml)
+	{
+		$xml = $this->decodeSMP($xml);
+		self::$attributes = array();
+		$html = \preg_replace_callback(
+			'(<(?:(?!/)((?>BANDCAMP|DAILYMOTION|F(?>P|ACEBOOK)|H[CER]|IMG|LIVELEAK|S(?>OUNDCLOUD|POTIFY)|TWITCH|VI(?>MEO|NE)|YOUTUBE|html:(?>br|img)))(?: [^>]*)?>.*?</\\1|(/?(?!br/|p>)[^ />]+)[^>]*?(/)?)>)s',
+			array($this, 'quick'),
+			\preg_replace(
+				'(<[eis]>[^<]*</[eis]>)',
+				'',
+				\substr($xml, 1 + \strpos($xml, '>'), -4)
+			)
+		);
+		return \str_replace('<br/>', '<br>', $html);
+	}
+	protected function quick($m)
+	{
+		if (isset($m[2]))
+		{
+			$id = $m[2];
+			if (isset($m[3]))
+			{
+				unset($m[3]);
+				$m[0] = \substr($m[0], 0, -2) . '>';
+				$html = $this->quick($m);
+				$m[0] = '</' . $id . '>';
+				$m[2] = '/' . $id;
+				$html .= $this->quick($m);
+				return $html;
+			}
+		}
+		else
+		{
+			$id = $m[1];
+			$lpos = 1 + \strpos($m[0], '>');
+			$rpos = \strrpos($m[0], '<');
+			$textContent = \substr($m[0], $lpos, $rpos - $lpos);
+			if (\strpos($textContent, '<') !== \false)
+				throw new \RuntimeException;
+			$textContent = \htmlspecialchars_decode($textContent);
+		}
+		if (isset(self::$static[$id]))
+			return self::$static[$id];
+		if (isset(self::$dynamic[$id]))
+		{
+			list($match, $replace) = self::$dynamic[$id];
+			return \preg_replace($match, $replace, $m[0], 1);
+		}
+		if (!isset(self::$quickBranches[$id]))
+		{
+			if ($id[0] === '!' || $id[0] === '?')
+				throw new \RuntimeException;
+			return '';
+		}
+		$attributes = array();
+		if (\strpos($m[0], '="') !== \false)
+		{
+			\preg_match_all('(([^ =]++)="([^"]*))S', \substr($m[0], 0, \strpos($m[0], '>')), $matches);
+			foreach ($matches[1] as $i => $attrName)
+				$attributes[$attrName] = $matches[2][$i];
+		}
+		$qb = self::$quickBranches[$id];
+		if($qb<7){if($qb<4)if($qb===0){$attributes=\array_pop(self::$attributes);$html='';if(!isset($attributes['type']))$html.='</ul>';else$html.='</ol>';}elseif($qb===1){$attributes+=array('track_num'=>\null,'track_id'=>\null);$html='<div data-s9e-mediaembed="bandcamp" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="//bandcamp.com/EmbeddedPlayer/size=large/minimal=true/';if(isset($attributes['album_id'])){$html.='album='.$attributes['album_id'];if(isset($attributes['track_num']))$html.='/t='.$attributes['track_num'];}else$html.='track='.$attributes['track_id'];$html.='"></iframe></div></div>';}elseif($qb===2){$html='<pre><code';if(isset($attributes['lang']))$html.=' class="language-'.$attributes['lang'].'"';$html.='>';}else{$attributes+=array('type'=>\null,'id'=>\null);$html='<iframe data-s9e-mediaembed="facebook" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/facebook.min.html#'.\htmlspecialchars(\htmlspecialchars_decode($attributes['type']).\htmlspecialchars_decode($attributes['id']),2).'" style="border:0;height:360px;max-width:640px;width:100%"></iframe>';}elseif($qb===4){$attributes+=array('char'=>\null);$html=\str_replace('&quot;','"',$attributes['char']);}elseif($qb===5){$attributes+=array('content'=>\null);$html='<!--'.\str_replace('&quot;','"',$attributes['content']).'-->';}else{$html='';if(!isset($attributes['type']))$html.='<ul>';else{$html.='<ol';if(isset($attributes['start']))$html.=' start="'.$attributes['start'].'"';$html.='>';}self::$attributes[]=$attributes;}}elseif($qb<10)if($qb===7){$attributes+=array('secret_token'=>\null,'id'=>\null);$html='<iframe data-s9e-mediaembed="soundcloud" allowfullscreen="" scrolling="no" src="https://w.soundcloud.com/player/?url=';if(isset($attributes['playlist_id']))$html.='https%3A//api.soundcloud.com/playlists/'.$attributes['playlist_id'];elseif(isset($attributes['track_id']))$html.='https%3A//api.soundcloud.com/tracks/'.$attributes['track_id'].'&amp;secret_token='.$attributes['secret_token'];else{if((\strpos($attributes['id'],'://')===\false))$html.='https%3A//soundcloud.com/';$html.=$attributes['id'];}$html.='" style="border:0;height:';if(isset($attributes['playlist_id'])||(\strpos($attributes['id'],'/sets/')!==\false))$html.='450';else$html.='166';$html.='px;max-width:900px;width:100%"></iframe>';}elseif($qb===8){$attributes+=array('path'=>\null);$html='<div data-s9e-mediaembed="spotify" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:120%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="https://embed.spotify.com/?view=coverart&amp;uri=';if(isset($attributes['uri']))$html.=$attributes['uri'];else$html.='spotify:'.\strtr($attributes['path'],'/',':');$html.='"></iframe></div></div>';}else{$html='<td';if(isset($attributes['align']))$html.=' style="text-align:'.$attributes['align'].'"';$html.='>';}elseif($qb===10){$html='<th';if(isset($attributes['align']))$html.=' style="text-align:'.$attributes['align'].'"';$html.='>';}elseif($qb===11){$attributes+=array('channel'=>\null);$html='<div data-s9e-mediaembed="twitch" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="';if(isset($attributes['clip_id']))$html.='//clips.twitch.tv/embed?autoplay=false&amp;clip='.$attributes['channel'].'/'.$attributes['clip_id'];else{$html.='//player.twitch.tv/?autoplay=false&amp;';if(isset($attributes['archive_id']))$html.='video=a'.$attributes['archive_id'];elseif(isset($attributes['chapter_id']))$html.='video=c'.$attributes['chapter_id'];elseif(isset($attributes['video_id']))$html.='video=v'.$attributes['video_id'];else$html.='channel='.$attributes['channel'];if(isset($attributes['t']))$html.='&amp;time='.$attributes['t'];}$html.='"></iframe></div></div>';}else{$attributes+=array('id'=>\null,'m'=>\null,'s'=>\null);$html='<div data-s9e-mediaembed="youtube" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="background:url(https://i.ytimg.com/vi/'.$attributes['id'].'/hqdefault.jpg) 50% 50% / cover;border:0;height:100%;left:0;position:absolute;width:100%" src="https://www.youtube.com/embed/'.$attributes['id'];if(isset($attributes['list']))$html.='?list='.$attributes['list'];if(isset($attributes['t'])||isset($attributes['m'])){if(isset($attributes['list']))$html.='&amp;';else$html.='?';$html.='start=';if(isset($attributes['t']))$html.=$attributes['t'];elseif(isset($attributes['h']))$html.=\htmlspecialchars($attributes['h']*3600+$attributes['m']*60+$attributes['s'],2);else$html.=\htmlspecialchars($attributes['m']*60+$attributes['s'],2);}$html.='"></iframe></div></div>';}
+		return $html;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Bundles/Forum.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Bundles;
+abstract class Forum extends \s9e\TextFormatter\Bundle
+{
+	protected static $parser;
+	protected static $renderer;
+	public static function getParser()
+	{
+		return \unserialize('O:24:"s9e\\TextFormatter\\Parser":4:{s:16:"' . "\0" . '*' . "\0" . 'pluginsConfig";a:5:{s:9:"Autoemail";a:5:{s:8:"attrName";s:5:"email";s:10:"quickMatch";s:1:"@";s:6:"regexp";s:39:"/\\b[-a-z0-9_+.]+@[-a-z0-9.]*[a-z0-9]/Si";s:7:"tagName";s:5:"EMAIL";s:11:"regexpLimit";i:10000;}s:8:"Autolink";a:5:{s:8:"attrName";s:3:"url";s:6:"regexp";s:109:"#\\bhttps?://\\S(?>[^\\s\\[\\]\\x{FF01}-\\x{FF0F}\\x{FF1A}-\\x{FF20}\\x{FF3B}-\\x{FF40}\\x{FF5B}-\\x{FF65}]|\\[\\w*\\])++#Siu";s:7:"tagName";s:3:"URL";s:10:"quickMatch";s:3:"://";s:11:"regexpLimit";i:10000;}s:7:"BBCodes";a:4:{s:7:"bbcodes";a:38:{s:1:"*";a:1:{s:7:"tagName";s:2:"LI";}s:1:"B";a:0:{}s:8:"BANDCAMP";a:2:{s:17:"contentAttributes";a:1:{i:0;s:3:"url";}s:16:"defaultAttribute";s:3:"url";}s:6:"CENTER";R:19;s:4:"CODE";a:1:{s:16:"defaultAttribute";s:4:"lang";}s:5:"COLOR";R:19;s:11:"DAILYMOTION";R:20;s:5:"EMAIL";a:1:{s:17:"contentAttributes";a:1:{i:0;s:5:"email";}}s:8:"FACEBOOK";R:20;s:4:"FONT";R:19;s:1:"I";R:19;s:3:"IMG";a:2:{s:17:"contentAttributes";a:1:{i:0;s:3:"src";}s:16:"defaultAttribute";s:3:"src";}s:9:"INDIEGOGO";R:20;s:9:"INSTAGRAM";R:20;s:11:"KICKSTARTER";R:20;s:2:"LI";R:19;s:4:"LIST";a:1:{s:16:"defaultAttribute";s:4:"type";}s:8:"LIVELEAK";R:20;s:5:"MEDIA";a:2:{s:17:"contentAttributes";R:21;s:16:"defaultAttribute";s:4:"site";}s:2:"OL";R:19;s:5:"QUOTE";a:1:{s:16:"defaultAttribute";s:6:"author";}s:1:"S";R:19;s:4:"SIZE";R:19;s:10:"SOUNDCLOUD";R:20;s:7:"SPOILER";a:1:{s:16:"defaultAttribute";s:5:"title";}s:5:"TABLE";R:19;s:2:"TD";a:1:{s:16:"defaultAttribute";s:5:"align";}s:2:"TH";R:41;s:2:"TR";R:19;s:6:"TWITCH";R:20;s:7:"TWITTER";R:20;s:1:"U";R:19;s:2:"UL";R:19;s:3:"URL";a:1:{s:17:"contentAttributes";R:21;}s:5:"VIMEO";R:20;s:4:"VINE";R:20;s:4:"WSHH";R:20;s:7:"YOUTUBE";R:20;}s:10:"quickMatch";s:1:"[";s:6:"regexp";s:30:"#\\[/?(\\*|[-\\w]+)(?=[\\]\\s=:/])#";s:11:"regexpLimit";i:10000;}s:5:"Emoji";a:4:{s:8:"attrName";s:3:"seq";s:7:"tagName";s:5:"EMOJI";s:7:"aliases";a:23:{s:2:":)";s:4:"🙂";s:3:":-)";s:4:"🙂";s:2:";)";s:4:"😉";s:3:";-)";s:4:"😉";s:2:":D";s:4:"😀";s:3:":-D";s:4:"😀";s:2:":(";s:3:"☹";s:3:":-(";s:3:"☹";s:3:":-*";s:4:"😘";s:2:":P";s:4:"😛";s:3:":-P";s:4:"😛";s:2:":p";s:4:"😛";s:3:":-p";s:4:"😛";s:2:";P";s:4:"😜";s:3:";-P";s:4:"😜";s:2:";p";s:4:"😜";s:3:";-p";s:4:"😜";s:2:":?";s:4:"😕";s:3:":-?";s:4:"😕";s:2:":|";s:4:"😐";s:3:":-|";s:4:"😐";s:2:":o";s:4:"😮";s:5:":lol:";s:4:"😂";}s:13:"aliasesRegexp";s:47:"/(?::(?:[()?DPop|]|-[()*?DPp|]|lol:)|;-?[)Pp])/";}s:10:"MediaEmbed";a:4:{s:10:"quickMatch";s:3:"://";s:6:"regexp";s:26:"/\\bhttps?:\\/\\/[^["\'\\s]+/Si";s:7:"tagName";s:5:"MEDIA";s:11:"regexpLimit";i:10000;}}s:14:"registeredVars";a:2:{s:9:"urlConfig";a:1:{s:14:"allowedSchemes";s:12:"/^https?$/Di";}s:10:"mediasites";a:15:{s:12:"bandcamp.com";s:8:"bandcamp";s:15:"dailymotion.com";s:11:"dailymotion";s:12:"facebook.com";s:8:"facebook";s:13:"indiegogo.com";s:9:"indiegogo";s:13:"instagram.com";s:9:"instagram";s:15:"kickstarter.com";s:11:"kickstarter";s:12:"liveleak.com";s:8:"liveleak";s:14:"soundcloud.com";s:10:"soundcloud";s:9:"twitch.tv";s:6:"twitch";s:11:"twitter.com";s:7:"twitter";s:9:"vimeo.com";s:5:"vimeo";s:7:"vine.co";s:4:"vine";s:19:"worldstarhiphop.com";s:4:"wshh";s:11:"youtube.com";s:7:"youtube";s:8:"youtu.be";s:7:"youtube";}}s:14:"' . "\0" . '*' . "\0" . 'rootContext";a:2:{s:7:"allowed";a:2:{i:0;i:65431;i:1;i:3855;}s:5:"flags";i:32;}s:13:"' . "\0" . '*' . "\0" . 'tagsConfig";a:38:{s:1:"B";a:6:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:42:"s9e\\TextFormatter\\Parser::filterAttributes";s:6:"params";a:4:{s:3:"tag";N;s:9:"tagConfig";N;s:14:"registeredVars";N;s:6:"logger";N;}}}s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:2;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";a:2:{i:0;i:65413;i:1;i:3855;}}s:8:"BANDCAMP";a:7:{s:10:"attributes";a:4:{s:8:"album_id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:8:"!^\\d+$!D";}}}s:8:"required";b:0;}s:8:"track_id";R:124;s:9:"track_num";R:124;s:3:"url";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:50:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterUrl";s:6:"params";a:3:{s:9:"attrValue";N;s:9:"urlConfig";N;s:6:"logger";N;}}}s:8:"required";b:0;}}s:11:"filterChain";a:3:{i:0;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:2:{i:0;a:3:{i:0;s:23:"!bandcamp\\.com/album/.!";i:1;s:25:"!/album=(?\'album_id\'\\d+)!";i:2;a:1:{i:0;s:8:"album_id";}}i:1;a:3:{i:0;s:23:"!bandcamp\\.com/track/.!";i:1;a:3:{i:0;s:29:"!"album_id":(?\'album_id\'\\d+)!";i:1;s:31:"!"track_num":(?\'track_num\'\\d+)!";i:2;s:25:"!/track=(?\'track_id\'\\d+)!";}i:2;a:3:{i:0;s:8:"album_id";i:1;s:8:"track_id";i:2;s:9:"track_num";}}}s:8:"cacheDir";N;}}i:1;R:107;i:2;a:2:{s:8:"callback";s:67:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::hasNonDefaultAttribute";s:6:"params";a:1:{s:3:"tag";N;}}}s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:3089;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:4;s:7:"allowed";a:2:{i:0;i:65285;i:1;i:3855;}}s:6:"CENTER";a:6:{s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";a:2:{s:12:"fosterParent";a:9:{s:1:"B";i:1;s:5:"COLOR";i:1;s:5:"EMAIL";i:1;s:4:"FONT";i:1;s:1:"I";i:1;s:1:"S";i:1;s:4:"SIZE";i:1;s:1:"U";i:1;s:3:"URL";i:1;}s:5:"flags";i:256;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:100;}s:4:"CODE";a:7:{s:10:"attributes";a:1:{s:4:"lang";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:57:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterIdentifier";s:6:"params";a:1:{s:9:"attrValue";N;}}}s:8:"required";b:0;}}s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";a:2:{s:12:"fosterParent";R:178;s:5:"flags";i:4432;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";a:2:{i:0;i:0;i:1;i:0;}}s:5:"COLOR";a:7:{s:10:"attributes";a:1:{s:5:"color";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:52:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterColor";s:6:"params";R:197;}}s:8:"required";b:1;}}s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";R:115;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";R:119;}s:11:"DAILYMOTION";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:17:"!^[A-Za-z0-9]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:132;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:94:"!dailymotion\\.com/(?:live/|swf/|user/[^#]+#video=|(?:related/\\d+/)?video/)(?\'id\'[A-Za-z0-9]+)!";i:2;a:2:{i:0;s:0:"";i:1;s:2:"id";}}i:1;a:3:{i:0;s:3:"url";i:1;s:24:"!^(?\'id\'[A-Za-z0-9]+)$!D";i:2;R:232;}}s:11:"filterChain";a:2:{i:0;a:2:{s:8:"callback";s:55:"s9e\\TextFormatter\\Parser::executeAttributePreprocessors";s:6:"params";a:2:{s:3:"tag";N;s:9:"tagConfig";N;}}i:1;R:107;}s:12:"nestingLimit";i:10;s:5:"rules";R:168;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:4;s:7:"allowed";R:172;}s:5:"EMAIL";a:7:{s:10:"attributes";a:1:{s:5:"email";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:52:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterEmail";s:6:"params";R:197;}}s:8:"required";b:1;}}s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:514;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:2;s:7:"allowed";a:2:{i:0;i:60291;i:1;i:0;}}s:5:"EMOJI";a:7:{s:10:"attributes";a:1:{s:3:"seq";a:2:{s:11:"filterChain";R:194;s:8:"required";b:1;}}s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";R:168;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";R:119;}s:8:"FACEBOOK";a:8:{s:10:"attributes";a:3:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:8:"@^\\d+$@D";}}}s:8:"required";b:1;}s:4:"type";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:10:"#^video$#D";}}}s:8:"required";b:0;}s:3:"url";R:132;}s:22:"attributePreprocessors";a:3:{i:0;a:3:{i:0;s:3:"url";i:1;s:135:"@/(?!(?:apps|developers|graph)\\.)[-\\w.]*facebook\\.com/(?:[/\\w]+/permalink|(?!pages/|groups/).*?)(?:/|fbid=|\\?v=)(?\'id\'\\d+)(?=$|[/?&#])@";i:2;R:232;}i:1;a:3:{i:0;s:3:"url";i:1;s:20:"#/(?\'type\'video)s?/#";i:2;a:2:{i:0;s:0:"";i:1;s:4:"type";}}i:2;a:3:{i:0;s:3:"url";i:1;s:15:"@^(?\'id\'\\d+)$@D";i:2;R:232;}}s:11:"filterChain";R:238;s:12:"nestingLimit";i:10;s:5:"rules";R:168;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:8;s:7:"allowed";a:2:{i:0;i:65285;i:1;i:3854;}}s:4:"FONT";a:7:{s:10:"attributes";a:1:{s:4:"font";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:74:"/^(?:\'[- \\w]+\'|"[- \\w]+"|[- \\w]+)(?:, *(?:\'[- \\w]+\'|"[- \\w]+"|[- \\w]+))*$/";}}}s:8:"required";b:1;}}s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";R:115;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";R:119;}s:1:"I";R:105;s:3:"IMG";a:7:{s:10:"attributes";a:3:{s:3:"alt";a:1:{s:8:"required";b:0;}s:3:"src";a:2:{s:11:"filterChain";R:133;s:8:"required";b:1;}s:5:"title";R:321;}s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";R:168;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";R:119;}s:9:"INDIEGOGO";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:11:"!^[-\\w]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:132;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:39:"!indiegogo\\.com/projects/(?\'id\'[-\\w]+)!";i:2;R:232;}i:1;a:3:{i:0;s:3:"url";i:1;s:18:"!^(?\'id\'[-\\w]+)$!D";i:2;R:232;}}s:11:"filterChain";R:238;s:12:"nestingLimit";i:10;s:5:"rules";R:168;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:4;s:7:"allowed";R:172;}s:9:"INSTAGRAM";a:8:{s:10:"attributes";R:329;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:32:"!instagram\\.com/p/(?\'id\'[-\\w]+)!";i:2;R:232;}i:1;R:342;}s:11:"filterChain";R:238;s:12:"nestingLimit";i:10;s:5:"rules";R:168;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:9;s:7:"allowed";a:2:{i:0;i:65285;i:1;i:3853;}}s:11:"KICKSTARTER";a:8:{s:10:"attributes";a:4:{s:4:"card";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:9:"!^card$!D";}}}s:8:"required";b:0;}s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:17:"!^[^/]+/[^/?]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:132;s:5:"video";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:10:"!^video$!D";}}}s:8:"required";b:0;}}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:93:"!kickstarter\\.com/projects/(?\'id\'[^/]+/[^/?]+)(?:/widget/(?:(?\'card\'card)|(?\'video\'video)))?!";i:2;a:4:{i:0;s:0:"";i:1;s:2:"id";i:2;s:4:"card";i:3;s:5:"video";}}i:1;a:3:{i:0;s:3:"url";i:1;s:24:"!^(?\'id\'[^/]+/[^/?]+)$!D";i:2;R:232;}}s:11:"filterChain";R:238;s:12:"nestingLimit";i:10;s:5:"rules";R:168;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:4;s:7:"allowed";R:172;}s:2:"LI";a:6:{s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";a:3:{s:12:"fosterParent";R:178;s:11:"closeParent";a:1:{s:2:"LI";i:1;}s:5:"flags";i:256;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:3;s:7:"allowed";R:100;}s:4:"LIST";a:7:{s:10:"attributes";a:2:{s:5:"start";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterUint";s:6:"params";R:197;}}s:8:"required";b:0;}s:4:"type";a:2:{s:11:"filterChain";a:2:{i:0;a:2:{s:8:"callback";s:54:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterHashmap";s:6:"params";a:3:{s:9:"attrValue";N;i:0;a:5:{s:1:"A";s:11:"upper-alpha";s:1:"I";s:11:"upper-roman";s:1:"a";s:11:"lower-alpha";s:1:"i";s:11:"lower-roman";i:1;s:7:"decimal";}i:1;b:0;}}i:1;a:2:{s:8:"callback";s:57:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterSimpletext";s:6:"params";R:197;}}s:8:"required";b:0;}}s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";a:3:{s:11:"createChild";a:1:{i:0;s:2:"LI";}s:12:"fosterParent";R:178;s:5:"flags";i:3456;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";a:2:{i:0;i:65416;i:1;i:3840;}}s:8:"LIVELEAK";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:15:"!^[a-f_0-9]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:132;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:41:"!liveleak\\.com/view\\?i=(?\'id\'[a-f_0-9]+)!";i:2;R:232;}i:1;a:3:{i:0;s:3:"url";i:1;s:22:"!^(?\'id\'[a-f_0-9]+)$!D";i:2;R:232;}}s:11:"filterChain";R:238;s:12:"nestingLimit";i:10;s:5:"rules";R:168;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:4;s:7:"allowed";R:172;}s:5:"MEDIA";a:6:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:54:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::filterTag";s:6:"params";a:3:{s:3:"tag";N;s:6:"parser";N;s:10:"mediasites";N;}}}s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:513;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:7;s:7:"allowed";a:2:{i:0;i:65303;i:1;i:3855;}}s:2:"OL";a:6:{s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";a:2:{s:12:"fosterParent";R:178;s:5:"flags";i:3456;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:438;}s:5:"QUOTE";a:7:{s:10:"attributes";a:1:{s:6:"author";R:321;}s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";R:177;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:100;}s:1:"S";R:105;s:4:"SIZE";a:7:{s:10:"attributes";a:1:{s:4:"size";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:52:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRange";s:6:"params";a:4:{s:9:"attrValue";N;i:0;i:8;i:1;i:36;s:6:"logger";N;}}}s:8:"required";b:1;}}s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";R:115;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";R:119;}s:10:"SOUNDCLOUD";a:8:{s:10:"attributes";a:5:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:83:"@^(?:https?://(?:api\\.)?soundcloud\\.com/(?!pages/)[-/\\w]+/[-/\\w]+|^[^/]+/[^/]+$)$@D";}}}s:8:"required";b:1;}s:11:"playlist_id";a:2:{s:11:"filterChain";R:272;s:8:"required";b:0;}s:12:"secret_token";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:11:"@^[-\\w]+$@D";}}}s:8:"required";b:0;}s:8:"track_id";R:513;s:3:"url";R:132;}s:22:"attributePreprocessors";a:5:{i:0;a:3:{i:0;s:3:"url";i:1;s:83:"@(?\'id\'https?://(?:api\\.)?soundcloud\\.com/(?!pages/)[-/\\w]+/[-/\\w]+|^[^/]+/[^/]+$)@";i:2;R:232;}i:1;a:3:{i:0;s:3:"url";i:1;s:52:"@api\\.soundcloud\\.com/playlists/(?\'playlist_id\'\\d+)@";i:2;a:2:{i:0;s:0:"";i:1;s:11:"playlist_id";}}i:2;a:3:{i:0;s:3:"url";i:1;s:89:"@api\\.soundcloud\\.com/tracks/(?\'track_id\'\\d+)(?:\\?secret_token=(?\'secret_token\'[-\\w]+))?@";i:2;a:3:{i:0;s:0:"";i:1;s:8:"track_id";i:2;s:12:"secret_token";}}i:3;a:3:{i:0;s:3:"url";i:1;s:81:"@soundcloud\\.com/(?!playlists|tracks)[-\\w]+/[-\\w]+/(?=s-)(?\'secret_token\'[-\\w]+)@";i:2;a:2:{i:0;s:0:"";i:1;s:12:"secret_token";}}i:4;a:3:{i:0;s:3:"url";i:1;s:90:"@^(?\'id\'(?:https?://(?:api\\.)?soundcloud\\.com/(?!pages/)[-/\\w]+/[-/\\w]+|^[^/]+/[^/]+$))$@D";i:2;R:232;}}s:11:"filterChain";a:3:{i:0;R:239;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:2:{i:0;a:3:{i:0;s:54:"@soundcloud\\.com/(?!playlists|tracks)[-\\w]+/[-\\w]+/s-@";i:1;s:36:"@soundcloud:tracks:(?\'track_id\'\\d+)@";i:2;a:1:{i:0;s:8:"track_id";}}i:1;a:3:{i:0;s:27:"@soundcloud\\.com/\\w+/sets/@";i:1;s:44:"@soundcloud://playlists:(?\'playlist_id\'\\d+)@";i:2;a:1:{i:0;s:11:"playlist_id";}}}s:8:"cacheDir";N;}}i:2;R:107;}s:12:"nestingLimit";i:10;s:5:"rules";R:168;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:10;s:7:"allowed";a:2:{i:0;i:65285;i:1;i:3851;}}s:7:"SPOILER";a:7:{s:10:"attributes";a:1:{s:5:"title";R:321;}s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";R:177;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:4;s:7:"allowed";R:100;}s:5:"TABLE";a:6:{s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";R:479;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";a:2:{i:0;i:65472;i:1;i:3840;}}s:2:"TD";a:7:{s:10:"attributes";a:1:{s:5:"align";a:2:{s:11:"filterChain";a:2:{i:0;a:2:{s:8:"callback";s:10:"strtolower";s:6:"params";R:197;}i:1;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:34:"/^(?>center|justify|left|right)$/D";}}}s:8:"required";b:0;}}s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";a:3:{s:12:"fosterParent";R:178;s:11:"closeParent";a:2:{s:2:"TD";i:1;s:2:"TH";i:1;}s:5:"flags";i:256;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:5;s:7:"allowed";R:100;}s:2:"TH";R:584;s:2:"TR";a:6:{s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";a:3:{s:12:"fosterParent";R:178;s:11:"closeParent";a:3:{s:2:"TD";i:1;s:2:"TH";i:1;s:2:"TR";i:1;}s:5:"flags";i:3456;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:6;s:7:"allowed";a:2:{i:0;i:65440;i:1;i:3840;}}s:6:"TWITCH";a:8:{s:10:"attributes";a:7:{s:10:"archive_id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:8:"#^\\d+$#D";}}}s:8:"required";b:0;}s:7:"channel";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:8:"#^\\w+$#D";}}}s:8:"required";b:0;}s:10:"chapter_id";R:619;s:7:"clip_id";R:627;s:1:"t";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:27:"#^(?:(?:\\d+h)?\\d+m)?\\d+s$#D";}}}s:8:"required";b:0;}s:3:"url";R:132;s:8:"video_id";R:619;}s:22:"attributePreprocessors";a:3:{i:0;a:3:{i:0;s:3:"url";i:1;s:96:"#twitch\\.tv/(?\'channel\'\\w+)(?:/b/(?\'archive_id\'\\d+)|/c/(?\'chapter_id\'\\d+)|/v/(?\'video_id\'\\d+))?#";i:2;a:5:{i:0;s:0:"";i:1;s:7:"channel";i:2;s:10:"archive_id";i:3;s:10:"chapter_id";i:4;s:8:"video_id";}}i:1;a:3:{i:0;s:3:"url";i:1;s:32:"#t=(?\'t\'(?:(?:\\d+h)?\\d+m)?\\d+s)#";i:2;a:2:{i:0;s:0:"";i:1;s:1:"t";}}i:2;a:3:{i:0;s:3:"url";i:1;s:51:"#clips\\.twitch\\.tv/(?\'channel\'\\w+)/(?\'clip_id\'\\w+)#";i:2;a:3:{i:0;s:0:"";i:1;s:7:"channel";i:2;s:7:"clip_id";}}}s:11:"filterChain";a:3:{i:0;R:239;i:1;R:107;i:2;R:163;}s:12:"nestingLimit";i:10;s:5:"rules";R:168;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:4;s:7:"allowed";R:172;}s:7:"TWITTER";a:8:{s:10:"attributes";a:2:{s:2:"id";R:271;s:3:"url";R:132;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:51:"@twitter\\.com/(?:#!/)?\\w+/status(?:es)?/(?\'id\'\\d+)@";i:2;R:232;}i:1;R:297;}s:11:"filterChain";R:238;s:12:"nestingLimit";i:10;s:5:"rules";R:168;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:11;s:7:"allowed";a:2:{i:0;i:65285;i:1;i:3847;}}s:1:"U";R:105;s:2:"UL";R:477;s:3:"URL";a:7:{s:10:"attributes";a:2:{s:5:"title";R:321;s:3:"url";R:323;}s:11:"filterChain";R:106;s:12:"nestingLimit";i:10;s:5:"rules";R:255;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:2;s:7:"allowed";R:259;}s:5:"VIMEO";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";R:125;s:8:"required";b:1;}s:3:"url";R:132;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:50:"!vimeo\\.com/(?:channels/[^/]+/|video/)?(?\'id\'\\d+)!";i:2;R:232;}i:1;a:3:{i:0;s:3:"url";i:1;s:15:"!^(?\'id\'\\d+)$!D";i:2;R:232;}}s:11:"filterChain";R:238;s:12:"nestingLimit";i:10;s:5:"rules";R:168;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:4;s:7:"allowed";R:172;}s:4:"VINE";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:10:"!^[^/]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:132;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:25:"!vine\\.co/v/(?\'id\'[^/]+)!";i:2;R:232;}i:1;a:3:{i:0;s:3:"url";i:1;s:17:"!^(?\'id\'[^/]+)$!D";i:2;R:232;}}s:11:"filterChain";R:238;s:12:"nestingLimit";i:10;s:5:"rules";R:168;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:4;s:7:"allowed";R:172;}s:4:"WSHH";a:8:{s:10:"attributes";R:688;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:42:"!worldstarhiphop\\.com/featured/(?\'id\'\\d+)!";i:2;R:232;}i:1;R:695;}s:11:"filterChain";a:3:{i:0;R:239;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:49:"!worldstarhiphop\\.com/(?:\\w+/)?video\\.php\\?v=\\w+!";i:1;s:35:"!disqus_identifier[ =\']+(?\'id\'\\d+)!";i:2;a:1:{i:0;s:2:"id";}}}s:8:"cacheDir";N;}}i:2;R:107;}s:12:"nestingLimit";i:10;s:5:"rules";R:168;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:4;s:7:"allowed";R:172;}s:7:"YOUTUBE";a:8:{s:10:"attributes";a:7:{s:1:"h";R:124;s:2:"id";R:330;s:4:"list";a:2:{s:11:"filterChain";R:331;s:8:"required";b:0;}s:1:"m";R:124;s:1:"s";R:124;s:1:"t";R:124;s:3:"url";R:132;}s:22:"attributePreprocessors";a:5:{i:0;a:3:{i:0;s:3:"url";i:1;s:45:"!youtube\\.com/(?:watch.*?v=|v/)(?\'id\'[-\\w]+)!";i:2;R:232;}i:1;a:3:{i:0;s:3:"url";i:1;s:25:"!youtu\\.be/(?\'id\'[-\\w]+)!";i:2;R:232;}i:2;a:3:{i:0;s:3:"url";i:1;s:57:"![#&?]t=(?:(?:(?\'h\'\\d+)h)?(?\'m\'\\d+)m(?\'s\'\\d+)|(?\'t\'\\d+))!";i:2;a:5:{i:0;s:0:"";i:1;s:1:"h";i:2;s:1:"m";i:3;s:1:"s";i:4;s:1:"t";}}i:3;a:3:{i:0;s:3:"url";i:1;s:23:"!&list=(?\'list\'[-\\w]+)!";i:2;a:2:{i:0;s:0:"";i:1;s:4:"list";}}i:4;R:342;}s:11:"filterChain";R:238;s:12:"nestingLimit";i:10;s:5:"rules";R:168;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:4;s:7:"allowed";R:172;}}}');
+	}
+	public static function getRenderer()
+	{
+		return \unserialize('O:40:"s9e\\TextFormatter\\Bundles\\Forum\\Renderer":2:{s:9:"' . "\0" . '*' . "\0" . 'params";a:4:{s:6:"L_HIDE";s:4:"Hide";s:6:"L_SHOW";s:4:"Show";s:9:"L_SPOILER";s:7:"Spoiler";s:7:"L_WROTE";s:6:"wrote:";}s:18:"metaElementsRegexp";s:22:"(<[eis]>[^<]*</[eis]>)";}');
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Bundles/Forum/Renderer.php
@@ -0,0 +1,117 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Bundles\Forum;
+class Renderer extends \s9e\TextFormatter\Renderer
+{
+	protected $params=array('L_HIDE'=>'Hide','L_SHOW'=>'Show','L_SPOILER'=>'Spoiler','L_WROTE'=>'wrote:');
+	protected static $tagBranches=array('B'=>0,'BANDCAMP'=>1,'CENTER'=>2,'CODE'=>3,'COLOR'=>4,'DAILYMOTION'=>5,'EMAIL'=>6,'EMOJI'=>7,'FACEBOOK'=>8,'FONT'=>9,'I'=>10,'IMG'=>11,'INDIEGOGO'=>12,'INSTAGRAM'=>13,'KICKSTARTER'=>14,'LI'=>15,'LIST'=>16,'LIVELEAK'=>17,'OL'=>18,'QUOTE'=>19,'S'=>20,'SIZE'=>21,'SOUNDCLOUD'=>22,'SPOILER'=>23,'TABLE'=>24,'TD'=>25,'TH'=>26,'TR'=>27,'TWITCH'=>28,'TWITTER'=>29,'U'=>30,'UL'=>31,'URL'=>32,'VIMEO'=>33,'VINE'=>34,'WSHH'=>35,'YOUTUBE'=>36,'br'=>37,'e'=>38,'i'=>38,'s'=>38,'p'=>39);
+	public function __sleep()
+	{
+		$props = \get_object_vars($this);
+		unset($props['out'], $props['proc'], $props['source']);
+		return \array_keys($props);
+	}
+	public function renderRichText($xml)
+	{
+		if (!isset($this->quickRenderingTest) || !\preg_match($this->quickRenderingTest, $xml))
+			try
+			{
+				return $this->renderQuick($xml);
+			}
+			catch (\Exception $e)
+			{
+			}
+		$dom = $this->loadXML($xml);
+		$this->out = '';
+		$this->at($dom->documentElement);
+		return $this->out;
+	}
+	protected function at(\DOMNode $root)
+	{
+		if ($root->nodeType === 3)
+			$this->out .= \htmlspecialchars($root->textContent,0);
+		else
+			foreach ($root->childNodes as $node)
+				if (!isset(self::$tagBranches[$node->nodeName]))
+					$this->at($node);
+				else
+				{
+					$tb = self::$tagBranches[$node->nodeName];
+					if($tb<20){if($tb<10)if($tb<5)if($tb<3)if($tb===0){$this->out.='<b>';$this->at($node);$this->out.='</b>';}elseif($tb===1){$this->out.='<div data-s9e-mediaembed="bandcamp" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="//bandcamp.com/EmbeddedPlayer/size=large/minimal=true/';if($node->hasAttribute('album_id')){$this->out.='album='.\htmlspecialchars($node->getAttribute('album_id'),2);if($node->hasAttribute('track_num'))$this->out.='/t='.\htmlspecialchars($node->getAttribute('track_num'),2);}else$this->out.='track='.\htmlspecialchars($node->getAttribute('track_id'),2);$this->out.='"></iframe></div></div>';}else{$this->out.='<div style="text-align:center">';$this->at($node);$this->out.='</div>';}elseif($tb===3){$this->out.='<pre data-hljs="" data-s9e-livepreview-postprocess="if(\'undefined\'!==typeof hljs)hljs._hb(this)"><code';if($node->hasAttribute('lang'))$this->out.=' class="language-'.\htmlspecialchars($node->getAttribute('lang'),2).'"';$this->out.='>';$this->at($node);$this->out.='</code></pre><script>if("undefined"!==typeof hljs)hljs._ha();else if("undefined"===typeof hljsLoading){hljsLoading=1;var a=document.getElementsByTagName("head")[0],e=document.createElement("link");e.type="text/css";e.rel="stylesheet";e.href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/default.min.css";a.appendChild(e);e=document.createElement("script");e.type="text/javascript";e.onload=function(){var d={},f=0;hljs._hb=function(b){b.removeAttribute("data-hljs");var c=b.innerHTML;c in d?b.innerHTML=d[c]:(7<++f&&(d={},f=0),hljs.highlightBlock(b.firstChild),d[c]=b.innerHTML)};hljs._ha=function(){for(var b=document.querySelectorAll("pre[data-hljs]"),c=b.length;0<c;)hljs._hb(b.item(--c))};hljs._ha()};e.async=!0;e.src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/highlight.min.js";a.appendChild(e)}</script>';}else{$this->out.='<span style="color:'.\htmlspecialchars($node->getAttribute('color'),2).'">';$this->at($node);$this->out.='</span>';}elseif($tb<8)if($tb===5)$this->out.='<div data-s9e-mediaembed="dailymotion" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.dailymotion.com/embed/video/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===6){$this->out.='<a href="mailto:'.\htmlspecialchars($node->getAttribute('email'),2).'">';$this->at($node);$this->out.='</a>';}else$this->out.='<img alt="'.\htmlspecialchars($node->textContent,2).'" class="emoji" draggable="false" width="16" height="16" src="//cdn.jsdelivr.net/emojione/assets/png/'.\htmlspecialchars($node->getAttribute('seq'),2).'.png">';elseif($tb===8)$this->out.='<iframe data-s9e-mediaembed="facebook" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/facebook.min.html#'.\htmlspecialchars($node->getAttribute('type').$node->getAttribute('id'),2).'" style="border:0;height:360px;max-width:640px;width:100%"></iframe>';else{$this->out.='<span style="font-family:'.\htmlspecialchars($node->getAttribute('font'),2).'">';$this->at($node);$this->out.='</span>';}elseif($tb<15)if($tb<13)if($tb===10){$this->out.='<i>';$this->at($node);$this->out.='</i>';}elseif($tb===11)$this->out.='<img src="'.\htmlspecialchars($node->getAttribute('src'),2).'" title="'.\htmlspecialchars($node->getAttribute('title'),2).'" alt="'.\htmlspecialchars($node->getAttribute('alt'),2).'">';else$this->out.='<div data-s9e-mediaembed="indiegogo" style="display:inline-block;width:100%;max-width:222px"><div style="overflow:hidden;position:relative;padding-bottom:200.45045045045%"><iframe allowfullscreen="" scrolling="no" src="//www.indiegogo.com/project/'.\htmlspecialchars($node->getAttribute('id'),2).'/embedded" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===13)$this->out.='<iframe data-s9e-mediaembed="instagram" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/instagram.min.html#'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:640px;max-width:640px;width:100%"></iframe>';elseif($node->hasAttribute('video'))$this->out.='<div data-s9e-mediaembed="kickstarter" style="display:inline-block;width:100%;max-width:480px"><div style="overflow:hidden;position:relative;padding-bottom:75%"><iframe allowfullscreen="" scrolling="no" src="//www.kickstarter.com/projects/'.\htmlspecialchars($node->getAttribute('id'),2).'/widget/video.html" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="kickstarter" style="display:inline-block;width:100%;max-width:220px"><div style="overflow:hidden;position:relative;padding-bottom:190.90909090909%"><iframe allowfullscreen="" scrolling="no" src="//www.kickstarter.com/projects/'.\htmlspecialchars($node->getAttribute('id'),2).'/widget/card.html" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb<18)if($tb===15){$this->out.='<li>';$this->at($node);$this->out.='</li>';}elseif($tb===16)if(!$node->hasAttribute('type')){$this->out.='<ul>';$this->at($node);$this->out.='</ul>';}elseif((\strpos($node->getAttribute('type'),'decimal')===0)||(\strpos($node->getAttribute('type'),'lower')===0)||(\strpos($node->getAttribute('type'),'upper')===0)){$this->out.='<ol style="list-style-type:'.\htmlspecialchars($node->getAttribute('type'),2).'"';if($node->hasAttribute('start'))$this->out.=' start="'.\htmlspecialchars($node->getAttribute('start'),2).'"';$this->out.='>';$this->at($node);$this->out.='</ol>';}else{$this->out.='<ul style="list-style-type:'.\htmlspecialchars($node->getAttribute('type'),2).'">';$this->at($node);$this->out.='</ul>';}else$this->out.='<div data-s9e-mediaembed="liveleak" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.liveleak.com/ll_embed?i='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===18){$this->out.='<ol>';$this->at($node);$this->out.='</ol>';}else{$this->out.='<blockquote';if(!$node->hasAttribute('author'))$this->out.=' class="uncited"';$this->out.='><div>';if($node->hasAttribute('author'))$this->out.='<cite>'.\htmlspecialchars($node->getAttribute('author'),0).' '.\htmlspecialchars($this->params['L_WROTE'],0).'</cite>';$this->at($node);$this->out.='</div></blockquote>';}}elseif($tb<30)if($tb<25)if($tb<23)if($tb===20){$this->out.='<s>';$this->at($node);$this->out.='</s>';}elseif($tb===21){$this->out.='<span style="font-size:'.\htmlspecialchars($node->getAttribute('size'),2).'px">';$this->at($node);$this->out.='</span>';}else{$this->out.='<iframe data-s9e-mediaembed="soundcloud" allowfullscreen="" scrolling="no" src="https://w.soundcloud.com/player/?url=';if($node->hasAttribute('playlist_id'))$this->out.='https%3A//api.soundcloud.com/playlists/'.\htmlspecialchars($node->getAttribute('playlist_id'),2);elseif($node->hasAttribute('track_id'))$this->out.='https%3A//api.soundcloud.com/tracks/'.\htmlspecialchars($node->getAttribute('track_id'),2).'&amp;secret_token='.\htmlspecialchars($node->getAttribute('secret_token'),2);else{if((\strpos($node->getAttribute('id'),'://')===\false))$this->out.='https%3A//soundcloud.com/';$this->out.=\htmlspecialchars($node->getAttribute('id'),2);}$this->out.='" style="border:0;height:';if($node->hasAttribute('playlist_id')||(\strpos($node->getAttribute('id'),'/sets/')!==\false))$this->out.='450';else$this->out.='166';$this->out.='px;max-width:900px;width:100%"></iframe>';}elseif($tb===23){$this->out.='<div class="spoiler"><div class="spoiler-header"><button onclick="var a=parentNode.nextSibling.style,b=firstChild.style,c=lastChild.style;\'\'!==a.display?(a.display=c.display=\'\',b.display=\'none\'):(a.display=c.display=\'none\',b.display=\'\')"><span>'.\htmlspecialchars($this->params['L_SHOW'],0).'</span><span style="display:none">'.\htmlspecialchars($this->params['L_HIDE'],0).'</span></button><span class="spoiler-title">'.\htmlspecialchars($this->params['L_SPOILER'],0).' '.\htmlspecialchars($node->getAttribute('title'),0).'</span></div><div class="spoiler-content" style="display:none">';$this->at($node);$this->out.='</div></div>';}else{$this->out.='<table>';$this->at($node);$this->out.='</table>';}elseif($tb<28)if($tb===25){$this->out.='<td';if($node->hasAttribute('align'))$this->out.=' style="text-align:'.\htmlspecialchars($node->getAttribute('align'),2).'"';$this->out.='>';$this->at($node);$this->out.='</td>';}elseif($tb===26){$this->out.='<th';if($node->hasAttribute('align'))$this->out.=' style="text-align:'.\htmlspecialchars($node->getAttribute('align'),2).'"';$this->out.='>';$this->at($node);$this->out.='</th>';}else{$this->out.='<tr>';$this->at($node);$this->out.='</tr>';}elseif($tb===28){$this->out.='<div data-s9e-mediaembed="twitch" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="';if($node->hasAttribute('clip_id'))$this->out.='//clips.twitch.tv/embed?autoplay=false&amp;clip='.\htmlspecialchars($node->getAttribute('channel'),2).'/'.\htmlspecialchars($node->getAttribute('clip_id'),2);else{$this->out.='//player.twitch.tv/?autoplay=false&amp;';if($node->hasAttribute('archive_id'))$this->out.='video=a'.\htmlspecialchars($node->getAttribute('archive_id'),2);elseif($node->hasAttribute('chapter_id'))$this->out.='video=c'.\htmlspecialchars($node->getAttribute('chapter_id'),2);elseif($node->hasAttribute('video_id'))$this->out.='video=v'.\htmlspecialchars($node->getAttribute('video_id'),2);else$this->out.='channel='.\htmlspecialchars($node->getAttribute('channel'),2);if($node->hasAttribute('t'))$this->out.='&amp;time='.\htmlspecialchars($node->getAttribute('t'),2);}$this->out.='"></iframe></div></div>';}else$this->out.='<iframe data-s9e-mediaembed="twitter" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/twitter.min.html#'.\htmlspecialchars($node->getAttribute('id'),2).'" style="background:url(https://abs.twimg.com/favicons/favicon.ico) no-repeat 50% 50%;border:0;height:186px;max-width:500px;width:100%"></iframe>';elseif($tb<35)if($tb<33)if($tb===30){$this->out.='<u>';$this->at($node);$this->out.='</u>';}elseif($tb===31){$this->out.='<ul>';$this->at($node);$this->out.='</ul>';}else{$this->out.='<a href="'.\htmlspecialchars($node->getAttribute('url'),2).'"';if($node->hasAttribute('title'))$this->out.=' title="'.\htmlspecialchars($node->getAttribute('title'),2).'"';$this->out.='>';$this->at($node);$this->out.='</a>';}elseif($tb===33)$this->out.='<div data-s9e-mediaembed="vimeo" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//player.vimeo.com/video/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="vine" style="display:inline-block;width:100%;max-width:480px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" src="https://vine.co/v/'.\htmlspecialchars($node->getAttribute('id'),2).'/embed/simple?audio=1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb<38)if($tb===35)$this->out.='<div data-s9e-mediaembed="wshh" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.worldstarhiphop.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===36){$this->out.='<div data-s9e-mediaembed="youtube" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="background:url(https://i.ytimg.com/vi/'.\htmlspecialchars($node->getAttribute('id'),2).'/hqdefault.jpg) 50% 50% / cover;border:0;height:100%;left:0;position:absolute;width:100%" src="https://www.youtube.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2);if($node->hasAttribute('list'))$this->out.='?list='.\htmlspecialchars($node->getAttribute('list'),2);if($node->hasAttribute('t')||$node->hasAttribute('m')){if($node->hasAttribute('list'))$this->out.='&amp;';else$this->out.='?';$this->out.='start=';if($node->hasAttribute('t'))$this->out.=\htmlspecialchars($node->getAttribute('t'),2);elseif($node->hasAttribute('h'))$this->out.=\htmlspecialchars($node->getAttribute('h')*3600+$node->getAttribute('m')*60+$node->getAttribute('s'),2);else$this->out.=\htmlspecialchars($node->getAttribute('m')*60+$node->getAttribute('s'),2);}$this->out.='"></iframe></div></div>';}else$this->out.='<br>';elseif($tb===38);else{$this->out.='<p>';$this->at($node);$this->out.='</p>';}
+				}
+	}
+	private static $static=array('/B'=>'</b>','/CENTER'=>'</div>','/CODE'=>'</code></pre><script>if("undefined"!==typeof hljs)hljs._ha();else if("undefined"===typeof hljsLoading){hljsLoading=1;var a=document.getElementsByTagName("head")[0],e=document.createElement("link");e.type="text/css";e.rel="stylesheet";e.href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/default.min.css";a.appendChild(e);e=document.createElement("script");e.type="text/javascript";e.onload=function(){var d={},f=0;hljs._hb=function(b){b.removeAttribute("data-hljs");var c=b.innerHTML;c in d?b.innerHTML=d[c]:(7<++f&&(d={},f=0),hljs.highlightBlock(b.firstChild),d[c]=b.innerHTML)};hljs._ha=function(){for(var b=document.querySelectorAll("pre[data-hljs]"),c=b.length;0<c;)hljs._hb(b.item(--c))};hljs._ha()};e.async=!0;e.src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/highlight.min.js";a.appendChild(e)}</script>','/COLOR'=>'</span>','/EMAIL'=>'</a>','/FONT'=>'</span>','/I'=>'</i>','/LI'=>'</li>','/OL'=>'</ol>','/QUOTE'=>'</div></blockquote>','/S'=>'</s>','/SIZE'=>'</span>','/SPOILER'=>'</div></div>','/TABLE'=>'</table>','/TD'=>'</td>','/TH'=>'</th>','/TR'=>'</tr>','/U'=>'</u>','/UL'=>'</ul>','/URL'=>'</a>','B'=>'<b>','CENTER'=>'<div style="text-align:center">','I'=>'<i>','LI'=>'<li>','OL'=>'<ol>','S'=>'<s>','TABLE'=>'<table>','TR'=>'<tr>','U'=>'<u>','UL'=>'<ul>');
+	private static $dynamic=array('COLOR'=>array('(^[^ ]+(?> (?!color=)[^=]+="[^"]*")*(?> color="([^"]*)")?.*)s','<span style="color:$1">'),'DAILYMOTION'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="dailymotion" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.dailymotion.com/embed/video/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'EMAIL'=>array('(^[^ ]+(?> (?!email=)[^=]+="[^"]*")*(?> email="([^"]*)")?.*)s','<a href="mailto:$1">'),'FONT'=>array('(^[^ ]+(?> (?!font=)[^=]+="[^"]*")*(?> font="([^"]*)")?.*)s','<span style="font-family:$1">'),'IMG'=>array('(^[^ ]+(?> (?!(?>alt|src|title)=)[^=]+="[^"]*")*(?> alt="([^"]*)")?(?> (?!(?>src|title)=)[^=]+="[^"]*")*(?> src="([^"]*)")?(?> (?!title=)[^=]+="[^"]*")*(?> title="([^"]*)")?.*)s','<img src="$2" title="$3" alt="$1">'),'INDIEGOGO'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="indiegogo" style="display:inline-block;width:100%;max-width:222px"><div style="overflow:hidden;position:relative;padding-bottom:200.45045045045%"><iframe allowfullscreen="" scrolling="no" src="//www.indiegogo.com/project/$1/embedded" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'INSTAGRAM'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<iframe data-s9e-mediaembed="instagram" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/instagram.min.html#$1" style="border:0;height:640px;max-width:640px;width:100%"></iframe>'),'LIVELEAK'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="liveleak" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.liveleak.com/ll_embed?i=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'SIZE'=>array('(^[^ ]+(?> (?!size=)[^=]+="[^"]*")*(?> size="([^"]*)")?.*)s','<span style="font-size:$1px">'),'TWITTER'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<iframe data-s9e-mediaembed="twitter" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/twitter.min.html#$1" style="background:url(https://abs.twimg.com/favicons/favicon.ico) no-repeat 50% 50%;border:0;height:186px;max-width:500px;width:100%"></iframe>'),'URL'=>array('(^[^ ]+(?> (?!(?>title|url)=)[^=]+="[^"]*")*( title="[^"]*")?(?> (?!url=)[^=]+="[^"]*")*(?> url="([^"]*)")?.*)s','<a href="$2"$1>'),'VIMEO'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="vimeo" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//player.vimeo.com/video/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'VINE'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="vine" style="display:inline-block;width:100%;max-width:480px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" src="https://vine.co/v/$1/embed/simple?audio=1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'WSHH'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="wshh" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.worldstarhiphop.com/embed/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'));
+	private static $attributes;
+	private static $quickBranches=array('/LIST'=>0,'BANDCAMP'=>1,'CODE'=>2,'EMOJI'=>3,'FACEBOOK'=>4,'KICKSTARTER'=>5,'LIST'=>6,'QUOTE'=>7,'SOUNDCLOUD'=>8,'SPOILER'=>9,'TD'=>10,'TH'=>11,'TWITCH'=>12,'YOUTUBE'=>13);
+	protected function renderQuick($xml)
+	{
+		$xml = $this->decodeSMP($xml);
+		self::$attributes = array();
+		$html = \preg_replace_callback(
+			'(<(?:(?!/)((?>BANDCAMP|DAILYMOTION|EMOJI|FACEBOOK|I(?>MG|N(?>DIEGOGO|STAGRAM))|KICKSTARTER|LIVELEAK|SOUNDCLOUD|TWIT(?>CH|TER)|VI(?>MEO|NE)|WSHH|YOUTUBE))(?: [^>]*)?>.*?</\\1|(/?(?!br/|p>)[^ />]+)[^>]*?(/)?)>)s',
+			array($this, 'quick'),
+			\preg_replace(
+				'(<[eis]>[^<]*</[eis]>)',
+				'',
+				\substr($xml, 1 + \strpos($xml, '>'), -4)
+			)
+		);
+		return \str_replace('<br/>', '<br>', $html);
+	}
+	protected function quick($m)
+	{
+		if (isset($m[2]))
+		{
+			$id = $m[2];
+			if (isset($m[3]))
+			{
+				unset($m[3]);
+				$m[0] = \substr($m[0], 0, -2) . '>';
+				$html = $this->quick($m);
+				$m[0] = '</' . $id . '>';
+				$m[2] = '/' . $id;
+				$html .= $this->quick($m);
+				return $html;
+			}
+		}
+		else
+		{
+			$id = $m[1];
+			$lpos = 1 + \strpos($m[0], '>');
+			$rpos = \strrpos($m[0], '<');
+			$textContent = \substr($m[0], $lpos, $rpos - $lpos);
+			if (\strpos($textContent, '<') !== \false)
+				throw new \RuntimeException;
+			$textContent = \htmlspecialchars_decode($textContent);
+		}
+		if (isset(self::$static[$id]))
+			return self::$static[$id];
+		if (isset(self::$dynamic[$id]))
+		{
+			list($match, $replace) = self::$dynamic[$id];
+			return \preg_replace($match, $replace, $m[0], 1);
+		}
+		if (!isset(self::$quickBranches[$id]))
+		{
+			if ($id[0] === '!' || $id[0] === '?')
+				throw new \RuntimeException;
+			return '';
+		}
+		$attributes = array();
+		if (\strpos($m[0], '="') !== \false)
+		{
+			\preg_match_all('(([^ =]++)="([^"]*))S', \substr($m[0], 0, \strpos($m[0], '>')), $matches);
+			foreach ($matches[1] as $i => $attrName)
+				$attributes[$attrName] = $matches[2][$i];
+		}
+		$qb = self::$quickBranches[$id];
+		if($qb<7)if($qb<4)if($qb===0){$attributes=\array_pop(self::$attributes);$html='';if(!isset($attributes['type']))$html.='</ul>';elseif((\strpos($attributes['type'],'decimal')===0)||(\strpos($attributes['type'],'lower')===0)||(\strpos($attributes['type'],'upper')===0))$html.='</ol>';else$html.='</ul>';}elseif($qb===1){$attributes+=array('track_num'=>\null,'track_id'=>\null);$html='<div data-s9e-mediaembed="bandcamp" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="//bandcamp.com/EmbeddedPlayer/size=large/minimal=true/';if(isset($attributes['album_id'])){$html.='album='.$attributes['album_id'];if(isset($attributes['track_num']))$html.='/t='.$attributes['track_num'];}else$html.='track='.$attributes['track_id'];$html.='"></iframe></div></div>';}elseif($qb===2){$html='<pre data-hljs="" data-s9e-livepreview-postprocess="if(\'undefined\'!==typeof hljs)hljs._hb(this)"><code';if(isset($attributes['lang']))$html.=' class="language-'.$attributes['lang'].'"';$html.='>';}else{$attributes+=array('seq'=>\null);$html='<img alt="'.\htmlspecialchars($textContent,2).'" class="emoji" draggable="false" width="16" height="16" src="//cdn.jsdelivr.net/emojione/assets/png/'.$attributes['seq'].'.png">';}elseif($qb===4){$attributes+=array('type'=>\null,'id'=>\null);$html='<iframe data-s9e-mediaembed="facebook" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/facebook.min.html#'.\htmlspecialchars(\htmlspecialchars_decode($attributes['type']).\htmlspecialchars_decode($attributes['id']),2).'" style="border:0;height:360px;max-width:640px;width:100%"></iframe>';}elseif($qb===5){$attributes+=array('id'=>\null);$html='';if(isset($attributes['video']))$html.='<div data-s9e-mediaembed="kickstarter" style="display:inline-block;width:100%;max-width:480px"><div style="overflow:hidden;position:relative;padding-bottom:75%"><iframe allowfullscreen="" scrolling="no" src="//www.kickstarter.com/projects/'.$attributes['id'].'/widget/video.html" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$html.='<div data-s9e-mediaembed="kickstarter" style="display:inline-block;width:100%;max-width:220px"><div style="overflow:hidden;position:relative;padding-bottom:190.90909090909%"><iframe allowfullscreen="" scrolling="no" src="//www.kickstarter.com/projects/'.$attributes['id'].'/widget/card.html" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';}else{$attributes+=array('type'=>\null);$html='';if(!isset($attributes['type']))$html.='<ul>';elseif((\strpos($attributes['type'],'decimal')===0)||(\strpos($attributes['type'],'lower')===0)||(\strpos($attributes['type'],'upper')===0)){$html.='<ol style="list-style-type:'.$attributes['type'].'"';if(isset($attributes['start']))$html.=' start="'.$attributes['start'].'"';$html.='>';}else$html.='<ul style="list-style-type:'.$attributes['type'].'">';self::$attributes[]=$attributes;}elseif($qb<11)if($qb===7){$html='<blockquote';if(!isset($attributes['author']))$html.=' class="uncited"';$html.='><div>';if(isset($attributes['author']))$html.='<cite>'.\str_replace('&quot;','"',$attributes['author']).' '.\htmlspecialchars($this->params['L_WROTE'],0).'</cite>';}elseif($qb===8){$attributes+=array('secret_token'=>\null,'id'=>\null);$html='<iframe data-s9e-mediaembed="soundcloud" allowfullscreen="" scrolling="no" src="https://w.soundcloud.com/player/?url=';if(isset($attributes['playlist_id']))$html.='https%3A//api.soundcloud.com/playlists/'.$attributes['playlist_id'];elseif(isset($attributes['track_id']))$html.='https%3A//api.soundcloud.com/tracks/'.$attributes['track_id'].'&amp;secret_token='.$attributes['secret_token'];else{if((\strpos($attributes['id'],'://')===\false))$html.='https%3A//soundcloud.com/';$html.=$attributes['id'];}$html.='" style="border:0;height:';if(isset($attributes['playlist_id'])||(\strpos($attributes['id'],'/sets/')!==\false))$html.='450';else$html.='166';$html.='px;max-width:900px;width:100%"></iframe>';}elseif($qb===9){$attributes+=array('title'=>\null);$html='<div class="spoiler"><div class="spoiler-header"><button onclick="var a=parentNode.nextSibling.style,b=firstChild.style,c=lastChild.style;\'\'!==a.display?(a.display=c.display=\'\',b.display=\'none\'):(a.display=c.display=\'none\',b.display=\'\')"><span>'.\htmlspecialchars($this->params['L_SHOW'],0).'</span><span style="display:none">'.\htmlspecialchars($this->params['L_HIDE'],0).'</span></button><span class="spoiler-title">'.\htmlspecialchars($this->params['L_SPOILER'],0).' '.\str_replace('&quot;','"',$attributes['title']).'</span></div><div class="spoiler-content" style="display:none">';}else{$html='<td';if(isset($attributes['align']))$html.=' style="text-align:'.$attributes['align'].'"';$html.='>';}elseif($qb===11){$html='<th';if(isset($attributes['align']))$html.=' style="text-align:'.$attributes['align'].'"';$html.='>';}elseif($qb===12){$attributes+=array('channel'=>\null);$html='<div data-s9e-mediaembed="twitch" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="';if(isset($attributes['clip_id']))$html.='//clips.twitch.tv/embed?autoplay=false&amp;clip='.$attributes['channel'].'/'.$attributes['clip_id'];else{$html.='//player.twitch.tv/?autoplay=false&amp;';if(isset($attributes['archive_id']))$html.='video=a'.$attributes['archive_id'];elseif(isset($attributes['chapter_id']))$html.='video=c'.$attributes['chapter_id'];elseif(isset($attributes['video_id']))$html.='video=v'.$attributes['video_id'];else$html.='channel='.$attributes['channel'];if(isset($attributes['t']))$html.='&amp;time='.$attributes['t'];}$html.='"></iframe></div></div>';}else{$attributes+=array('id'=>\null,'m'=>\null,'s'=>\null);$html='<div data-s9e-mediaembed="youtube" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="background:url(https://i.ytimg.com/vi/'.$attributes['id'].'/hqdefault.jpg) 50% 50% / cover;border:0;height:100%;left:0;position:absolute;width:100%" src="https://www.youtube.com/embed/'.$attributes['id'];if(isset($attributes['list']))$html.='?list='.$attributes['list'];if(isset($attributes['t'])||isset($attributes['m'])){if(isset($attributes['list']))$html.='&amp;';else$html.='?';$html.='start=';if(isset($attributes['t']))$html.=$attributes['t'];elseif(isset($attributes['h']))$html.=\htmlspecialchars($attributes['h']*3600+$attributes['m']*60+$attributes['s'],2);else$html.=\htmlspecialchars($attributes['m']*60+$attributes['s'],2);}$html.='"></iframe></div></div>';}
+		return $html;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Bundles/MediaPack.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Bundles;
+abstract class MediaPack extends \s9e\TextFormatter\Bundle
+{
+	protected static $parser;
+	protected static $renderer;
+	public static function getParser()
+	{
+		return \unserialize('O:24:"s9e\\TextFormatter\\Parser":4:{s:16:"' . "\0" . '*' . "\0" . 'pluginsConfig";a:1:{s:10:"MediaEmbed";a:4:{s:10:"quickMatch";s:1:":";s:6:"regexp";s:39:"/\\b(?>spotify:|https?:\\/\\/)[^["\'\\s]+/Si";s:7:"tagName";s:5:"MEDIA";s:11:"regexpLimit";i:10000;}}s:14:"registeredVars";a:2:{s:9:"urlConfig";a:1:{s:14:"allowedSchemes";s:12:"/^https?$/Di";}s:10:"mediasites";a:151:{s:14:"abcnews.go.com";s:7:"abcnews";s:9:"amazon.ca";s:6:"amazon";s:12:"amazon.co.uk";s:6:"amazon";s:12:"amazon.co.jp";s:6:"amazon";s:10:"amazon.com";s:6:"amazon";s:9:"amazon.de";s:6:"amazon";s:9:"amazon.es";s:6:"amazon";s:9:"amazon.fr";s:6:"amazon";s:9:"amazon.it";s:6:"amazon";s:11:"audioboo.fm";s:9:"audioboom";s:13:"audioboom.com";s:9:"audioboom";s:13:"audiomack.com";s:9:"audiomack";s:12:"bandcamp.com";s:8:"bandcamp";s:7:"bbc.com";s:7:"bbcnews";s:7:"blab.im";s:4:"blab";s:18:"bleacherreport.com";s:14:"bleacherreport";s:9:"break.com";s:5:"break";s:8:"bcove.me";s:10:"brightcove";s:19:"link.brightcove.com";s:10:"brightcove";s:11:"cbsnews.com";s:7:"cbsnews";s:14:"video.cnbc.com";s:4:"cnbc";s:7:"cnn.com";s:3:"cnn";s:13:"money.cnn.com";s:8:"cnnmoney";s:16:"collegehumor.com";s:12:"collegehumor";s:6:"cc.com";s:13:"comedycentral";s:17:"comedycentral.com";s:13:"comedycentral";s:8:"coub.com";s:4:"coub";s:15:"dailymotion.com";s:11:"dailymotion";s:16:"democracynow.org";s:12:"democracynow";s:10:"dumpert.nl";s:7:"dumpert";s:11:"8tracks.com";s:11:"eighttracks";s:8:"espn.com";s:4:"espn";s:11:"espn.go.com";s:4:"espn";s:12:"facebook.com";s:8:"facebook";s:10:"flickr.com";s:6:"flickr";s:7:"fora.tv";s:6:"foratv";s:17:"video.foxnews.com";s:7:"foxnews";s:14:"funnyordie.com";s:10:"funnyordie";s:12:"gamespot.com";s:8:"gamespot";s:16:"gametrailers.com";s:12:"gametrailers";s:14:"gettyimages.be";s:5:"getty";s:14:"gettyimages.cn";s:5:"getty";s:17:"gettyimages.co.jp";s:5:"getty";s:17:"gettyimages.co.uk";s:5:"getty";s:15:"gettyimages.com";s:5:"getty";s:18:"gettyimages.com.au";s:5:"getty";s:14:"gettyimages.de";s:5:"getty";s:14:"gettyimages.dk";s:5:"getty";s:14:"gettyimages.es";s:5:"getty";s:14:"gettyimages.fr";s:5:"getty";s:14:"gettyimages.ie";s:5:"getty";s:14:"gettyimages.it";s:5:"getty";s:14:"gettyimages.nl";s:5:"getty";s:14:"gettyimages.pt";s:5:"getty";s:14:"gettyimages.se";s:5:"getty";s:6:"gty.im";s:5:"getty";s:10:"gfycat.com";s:6:"gfycat";s:10:"github.com";s:4:"gist";s:13:"globalnews.ca";s:10:"globalnews";s:12:"gofundme.com";s:8:"gofundme";s:16:"drive.google.com";s:11:"googledrive";s:15:"plus.google.com";s:10:"googleplus";s:15:"docs.google.com";s:12:"googlesheets";s:14:"healthguru.com";s:10:"healthguru";s:8:"hudl.com";s:4:"hudl";s:8:"hulu.com";s:4:"hulu";s:15:"humortv.vara.nl";s:9:"humortvnl";s:7:"ign.com";s:3:"ign";s:8:"imdb.com";s:4:"imdb";s:9:"imgur.com";s:5:"imgur";s:13:"indiegogo.com";s:9:"indiegogo";s:13:"instagram.com";s:9:"instagram";s:11:"archive.org";s:15:"internetarchive";s:12:"izlesene.com";s:8:"izlesene";s:14:"jwplatform.com";s:10:"jwplatform";s:12:"video.khl.ru";s:3:"khl";s:15:"kickstarter.com";s:11:"kickstarter";s:15:"kissvideo.click";s:9:"kissvideo";s:10:"libsyn.com";s:6:"libsyn";s:10:"livecap.tv";s:7:"livecap";s:12:"liveleak.com";s:8:"liveleak";s:11:"livestre.am";s:10:"livestream";s:14:"livestream.com";s:10:"livestream";s:10:"my.mail.ru";s:6:"mailru";s:10:"medium.com";s:6:"medium";s:12:"metacafe.com";s:8:"metacafe";s:12:"mixcloud.com";s:8:"mixcloud";s:7:"mlb.com";s:3:"mlb";s:9:"mrctv.org";s:5:"mrctv";s:9:"msnbc.com";s:5:"msnbc";s:30:"channel.nationalgeographic.com";s:13:"natgeochannel";s:28:"video.nationalgeographic.com";s:11:"natgeovideo";s:11:"nbcnews.com";s:7:"nbcnews";s:13:"nbcsports.com";s:9:"nbcsports";s:7:"nhl.com";s:3:"nhl";s:7:"npr.org";s:3:"npr";s:4:"n.pr";s:3:"npr";s:11:"nytimes.com";s:7:"nytimes";s:10:"oddshot.tv";s:7:"oddshot";s:12:"pastebin.com";s:8:"pastebin";s:8:"plays.tv";s:7:"playstv";s:11:"podbean.com";s:7:"podbean";s:9:"prezi.com";s:5:"prezi";s:10:"reddit.com";s:6:"reddit";s:9:"rutube.ru";s:6:"rutube";s:10:"scribd.com";s:6:"scribd";s:14:"slideshare.net";s:10:"slideshare";s:14:"soundcloud.com";s:10:"soundcloud";s:12:"sportsnet.ca";s:9:"sportsnet";s:16:"open.spotify.com";s:7:"spotify";s:16:"play.spotify.com";s:7:"spotify";s:8:"spotify:";s:7:"spotify";s:22:"store.steampowered.com";s:10:"steamstore";s:12:"stitcher.com";s:8:"stitcher";s:12:"strawpoll.me";s:9:"strawpoll";s:14:"streamable.com";s:10:"streamable";s:12:"teamcoco.com";s:8:"teamcoco";s:7:"ted.com";s:3:"ted";s:15:"theatlantic.com";s:11:"theatlantic";s:15:"theguardian.com";s:11:"theguardian";s:12:"theonion.com";s:8:"theonion";s:11:"tinypic.com";s:7:"tinypic";s:7:"tmz.com";s:3:"tmz";s:17:"traileraddict.com";s:13:"traileraddict";s:10:"tumblr.com";s:6:"tumblr";s:9:"twitch.tv";s:6:"twitch";s:11:"twitter.com";s:7:"twitter";s:10:"ustream.tv";s:7:"ustream";s:9:"vbox7.com";s:5:"vbox7";s:8:"veoh.com";s:4:"veoh";s:8:"vevo.com";s:4:"vevo";s:11:"viagame.com";s:7:"viagame";s:18:"videodetective.com";s:14:"videodetective";s:12:"videomega.tv";s:9:"videomega";s:6:"vid.me";s:5:"vidme";s:9:"vimeo.com";s:5:"vimeo";s:7:"vine.co";s:4:"vine";s:6:"vk.com";s:2:"vk";s:12:"vkontakte.ru";s:2:"vk";s:11:"vocaroo.com";s:7:"vocaroo";s:7:"vox.com";s:3:"vox";s:18:"washingtonpost.com";s:14:"washingtonpost";s:19:"worldstarhiphop.com";s:4:"wshh";s:7:"wsj.com";s:3:"wsj";s:13:"xboxclips.com";s:9:"xboxclips";s:11:"xboxdvr.com";s:7:"xboxdvr";s:16:"screen.yahoo.com";s:11:"yahooscreen";s:9:"youku.com";s:5:"youku";s:11:"youtube.com";s:7:"youtube";s:8:"youtu.be";s:7:"youtube";s:14:"zippyshare.com";s:10:"zippyshare";}}s:14:"' . "\0" . '*' . "\0" . 'rootContext";a:2:{s:7:"allowed";a:3:{i:0;i:65535;i:1;i:65535;i:2;i:32639;}s:5:"flags";i:0;}s:13:"' . "\0" . '*' . "\0" . 'tagsConfig";a:120:{s:7:"ABCNEWS";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:8:"!^\\d+$!D";}}}s:8:"required";b:1;}s:3:"url";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:50:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterUrl";s:6:"params";a:3:{s:9:"attrValue";N;s:9:"urlConfig";N;s:6:"logger";N;}}}s:8:"required";b:0;}}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:47:"!abcnews\\.go\\.com/[^/]+/video/[^/]+-(?\'id\'\\d+)!";i:2;a:2:{i:0;s:0:"";i:1;s:2:"id";}}i:1;a:3:{i:0;s:3:"url";i:1;s:15:"!^(?\'id\'\\d+)$!D";i:2;R:193;}}s:11:"filterChain";a:2:{i:0;a:2:{s:8:"callback";s:55:"s9e\\TextFormatter\\Parser::executeAttributePreprocessors";s:6:"params";a:2:{s:3:"tag";N;s:9:"tagConfig";N;}}i:1;a:2:{s:8:"callback";s:42:"s9e\\TextFormatter\\Parser::filterAttributes";s:6:"params";a:4:{s:3:"tag";N;s:9:"tagConfig";N;s:14:"registeredVars";N;s:6:"logger";N;}}}s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:3089;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";a:3:{i:0;i:65532;i:1;i:65535;i:2;i:32639;}}s:6:"AMAZON";a:8:{s:10:"attributes";a:3:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:14:"#^[A-Z0-9]+$#D";}}}s:8:"required";b:1;}s:3:"tld";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:29:"#^(?:ca|de|es|fr|it|jp|uk)$#D";}}}s:8:"required";b:0;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:3:{i:0;a:3:{i:0;s:3:"url";i:1;s:37:"#/(?:dp|gp/product)/(?\'id\'[A-Z0-9]+)#";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:47:"#amazon\\.(?:co\\.)?(?\'tld\'ca|de|es|fr|it|jp|uk)#";i:2;a:2:{i:0;s:0:"";i:1;s:3:"tld";}}i:2;a:3:{i:0;s:3:"url";i:1;s:21:"#^(?\'id\'[A-Z0-9]+)$#D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:9:"AUDIOBOOM";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:40:"!audioboo(?:\\.f|m\\.co)m/boos/(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:2;s:7:"allowed";a:3:{i:0;i:65528;i:1;i:65535;i:2;i:32639;}}s:9:"AUDIOMACK";a:8:{s:10:"attributes";a:3:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:18:"!^[-\\w]+/[-\\w]+$!D";}}}s:8:"required";b:1;}s:4:"mode";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:19:"!^(?:album|song)$!D";}}}s:8:"required";b:0;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:57:"!audiomack\\.com/(?\'mode\'album|song)/(?\'id\'[-\\w]+/[-\\w]+)!";i:2;a:3:{i:0;s:0:"";i:1;s:4:"mode";i:2;s:2:"id";}}i:1;a:3:{i:0;s:3:"url";i:1;s:25:"!^(?\'id\'[-\\w]+/[-\\w]+)$!D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:3;s:7:"allowed";a:3:{i:0;i:65524;i:1;i:65535;i:2;i:32639;}}s:8:"BANDCAMP";a:7:{s:10:"attributes";a:4:{s:8:"album_id";a:2:{s:11:"filterChain";R:173;s:8:"required";b:0;}s:8:"track_id";R:305;s:9:"track_num";R:305;s:3:"url";R:180;}s:11:"filterChain";a:3:{i:0;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:2:{i:0;a:3:{i:0;s:23:"!bandcamp\\.com/album/.!";i:1;s:25:"!/album=(?\'album_id\'\\d+)!";i:2;a:1:{i:0;s:8:"album_id";}}i:1;a:3:{i:0;s:23:"!bandcamp\\.com/track/.!";i:1;a:3:{i:0;s:29:"!"album_id":(?\'album_id\'\\d+)!";i:1;s:31:"!"track_num":(?\'track_num\'\\d+)!";i:2;s:25:"!/track=(?\'track_id\'\\d+)!";}i:2;a:3:{i:0;s:8:"album_id";i:1;s:8:"track_id";i:2;s:9:"track_num";}}}s:8:"cacheDir";N;}}i:1;R:205;i:2;a:2:{s:8:"callback";s:67:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::hasNonDefaultAttribute";s:6:"params";a:1:{s:3:"tag";N;}}}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:7:"BBCNEWS";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:11:"!^[-\\w]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:1:{i:0;a:3:{i:0;s:3:"url";i:1;s:18:"!^(?\'id\'[-\\w]+)$!D";i:2;R:193;}}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:19:"!bbc\\.com/news/\\w+!";i:1;s:41:"!bbc\\.com\\\\/news\\\\/(?\'id\'[-\\w]+)\\\\/embed!";i:2;a:1:{i:0;s:2:"id";}}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:4:"BLAB";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:11:"#^[-\\w]+$#D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:68:"#blab\\.im/(?!about$|live$|replay$|scheduled$|search\\?)(?\'id\'[-\\w]+)#";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:18:"#^(?\'id\'[-\\w]+)$#D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:14:"BLEACHERREPORT";a:8:{s:10:"attributes";R:337;s:22:"attributePreprocessors";R:346;s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:13:"!/articles/.!";i:1;s:25:"!id="video-(?\'id\'[-\\w]+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:5:"BREAK";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:33:"!break\\.com/video/.*-(?\'id\'\\d+)$!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:10:"BRIGHTCOVE";a:7:{s:10:"attributes";a:4:{s:5:"bckey";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:13:"!^[-,~\\w]+$!D";}}}s:8:"required";b:0;}s:5:"bcpid";R:305;s:5:"bctid";R:305;s:3:"url";R:180;}s:11:"filterChain";a:3:{i:0;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;a:2:{i:0;s:13:"!bcove\\.me/.!";i:1;s:40:"!link\\.brightcove\\.com/services/player/!";}i:1;s:108:"!meta name="twitter:player" content=".*?bcpid(?\'bcpid\'\\d+).*?bckey=(?\'bckey\'[-,~\\w]+).*?bctid=(?\'bctid\'\\d+)!";i:2;a:3:{i:0;s:5:"bckey";i:1;s:5:"bcpid";i:2;s:5:"bctid";}}}s:8:"cacheDir";N;}}i:1;R:205;i:2;R:329;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:7:"CBSNEWS";a:8:{s:10:"attributes";a:3:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:8:"#^\\d+$#D";}}}s:8:"required";b:0;}s:3:"pid";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:8:"#^\\w+$#D";}}}s:8:"required";b:0;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:42:"#cbsnews\\.com/video/watch/\\?id=(?\'id\'\\d+)#";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:15:"#^(?\'id\'\\d+)$#D";i:2;R:193;}}s:11:"filterChain";a:4:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:32:"#cbsnews\\.com/videos/(?!watch/)#";i:1;s:21:"#"pid":"(?\'pid\'\\w+)"#";i:2;a:1:{i:0;s:3:"pid";}}}s:8:"cacheDir";N;}}i:2;R:205;i:3;R:329;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:4:"CNBC";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:38:"!cnbc\\.com/gallery/\\?video=(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:3:"CNN";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:12:"!^.*\\.cnn$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:3:{i:0;a:3:{i:0;s:3:"url";i:1;s:31:"!cnn.com/videos/(?\'id\'.*\\.cnn)!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:47:"!cnn\\.com/video/data/2\\.0/video/(?\'id\'.*\\.cnn)!";i:2;R:193;}i:2;a:3:{i:0;s:3:"url";i:1;s:19:"!^(?\'id\'.*\\.cnn)$!D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:8:"CNNMONEY";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:17:"!^.*\\.cnnmoney$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:43:"!money\\.cnn\\.com/video/(?\'id\'.*\\.cnnmoney)!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:24:"!^(?\'id\'.*\\.cnnmoney)$!D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:12:"COLLEGEHUMOR";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:46:"!collegehumor\\.com/(?:video|embed)/(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:13:"COMEDYCENTRAL";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:49:"!^(?:mgid:arc:(?:episode|video):[.\\w]+:[-\\w]+)$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:1:{i:0;a:3:{i:0;s:3:"url";i:1;s:56:"!^(?\'id\'(?:mgid:arc:(?:episode|video):[.\\w]+:[-\\w]+))$!D";i:2;R:193;}}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:56:"!c(?:c|omedycentral)\\.com/(?:full-episode|video-clip)s/!";i:1;s:49:"!(?\'id\'mgid:arc:(?:episode|video):[.\\w]+:[-\\w]+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:4:"COUB";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:8:"!^\\w+$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:27:"!coub\\.com/view/(?\'id\'\\w+)!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:15:"!^(?\'id\'\\w+)$!D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:11:"DAILYMOTION";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:17:"!^[A-Za-z0-9]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:94:"!dailymotion\\.com/(?:live/|swf/|user/[^#]+#video=|(?:related/\\d+/)?video/)(?\'id\'[A-Za-z0-9]+)!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:24:"!^(?\'id\'[A-Za-z0-9]+)$!D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:12:"DEMOCRACYNOW";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:34:"!^(?:\\w+/)?\\d+/\\d+/\\d+(?:/\\w+)?$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:66:"!democracynow.org/(?:embed/)?(?\'id\'(?:\\w+/)?\\d+/\\d+/\\d+(?:/\\w+)?)!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:41:"!^(?\'id\'(?:\\w+/)?\\d+/\\d+/\\d+(?:/\\w+)?)$!D";i:2;R:193;}}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:33:"!m\\.democracynow\\.org/stories/\\d!";i:1;s:72:"!democracynow\\.org/(?\'id\'(?:\\w+/)?\\d+/\\d+/\\d+(?:/\\w+)?)\' rel=\'canonical!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:7:"DUMPERT";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:15:"!^\\d+[/_]\\w+$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:41:"!dumpert\\.nl/mediabase/(?\'id\'\\d+[/_]\\w+)!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:22:"!^(?\'id\'\\d+[/_]\\w+)$!D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:11:"EIGHTTRACKS";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:39:"!8tracks\\.com/[-\\w]+/(?\'id\'\\d+)(?=#|$)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:28:"!8tracks\\.com/[-\\w]+/[-\\w]+!";i:1;s:30:"!eighttracks://mix/(?\'id\'\\d+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:4:"ESPN";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";R:439;s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:43:"#video/(?:clip(?:\\?id=|/_/id/))?(?\'id\'\\d+)#";i:2;R:193;}i:1;R:458;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:8:"FACEBOOK";a:8:{s:10:"attributes";a:3:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:8:"@^\\d+$@D";}}}s:8:"required";b:1;}s:4:"type";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:10:"#^video$#D";}}}s:8:"required";b:0;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:3:{i:0;a:3:{i:0;s:3:"url";i:1;s:135:"@/(?!(?:apps|developers|graph)\\.)[-\\w.]*facebook\\.com/(?:[/\\w]+/permalink|(?!pages/|groups/).*?)(?:/|fbid=|\\?v=)(?\'id\'\\d+)(?=$|[/?&#])@";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:20:"#/(?\'type\'video)s?/#";i:2;a:2:{i:0;s:0:"";i:1;s:4:"type";}}i:2;a:3:{i:0;s:3:"url";i:1;s:15:"@^(?\'id\'\\d+)$@D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:4;s:7:"allowed";a:3:{i:0;i:65516;i:1;i:65535;i:2;i:32639;}}s:6:"FLICKR";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:37:"!flickr\\.com/photos/[^/]+/(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:6:"FORATV";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:1:{i:0;R:196;}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:24:"!fora\\.tv/\\d+/\\d+/\\d+/.!";i:1;s:22:"!embed\\?id=(?\'id\'\\d+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:7:"FOXNEWS";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:34:"!video\\.foxnews\\.com/v/(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:10:"FUNNYORDIE";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:14:"!^[0-9a-f]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:41:"!funnyordie\\.com/videos/(?\'id\'[0-9a-f]+)!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:21:"!^(?\'id\'[0-9a-f]+)$!D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:8:"GAMESPOT";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:64:"!gamespot\\.com.*?/(?:events|videos)/.*?-(?\'id\'\\d+)/(?:[#?].*)?$!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:12:"GAMETRAILERS";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";R:728;s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:51:"!gametrailers\\.com/(?:full-episode|review|video)s/!";i:1;s:18:"!embed/(?\'id\'\\d+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:5:"GETTY";a:8:{s:10:"attributes";a:6:{s:2:"et";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:12:"!^[-=\\w]+$!D";}}}s:8:"required";b:0;}s:6:"height";a:3:{s:12:"defaultValue";s:3:"360";s:11:"filterChain";R:173;s:8:"required";b:0;}s:2:"id";R:172;s:3:"sig";R:794;s:3:"url";R:180;s:5:"width";a:3:{s:12:"defaultValue";s:3:"640";s:11:"filterChain";R:173;s:8:"required";b:0;}}s:22:"attributePreprocessors";a:4:{i:0;a:3:{i:0;s:3:"url";i:1;s:20:"!gty\\.im/(?\'id\'\\d+)!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:47:"!gettyimages\\.[.\\w]+/detail(?=/).*?/(?\'id\'\\d+)!";i:2;R:193;}i:2;a:3:{i:0;s:3:"url";i:1;s:30:"!#[-\\w]*picture-id(?\'id\'\\d+)$!";i:2;R:193;}i:3;R:196;}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:4:{i:0;s:2:"//";i:1;a:4:{i:0;s:30:"!"height":[ "]*(?\'height\'\\d+)!";i:1;s:28:"!"width":[ "]*(?\'width\'\\d+)!";i:2;s:19:"!et=(?\'et\'[-=\\w]+)!";i:3;s:21:"!sig=(?\'sig\'[-=\\w]+)!";}i:2;a:4:{i:0;s:2:"et";i:1;s:6:"height";i:2;s:3:"sig";i:3;s:5:"width";}i:3;s:42:"http://embed.gettyimages.com/preview/{@id}";}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:6:"GFYCAT";a:8:{s:10:"attributes";a:4:{s:6:"height";a:3:{s:12:"defaultValue";s:3:"315";s:11:"filterChain";R:173;s:8:"required";b:0;}s:2:"id";R:564;s:3:"url";R:180;s:5:"width";a:3:{s:12:"defaultValue";s:3:"560";s:11:"filterChain";R:173;s:8:"required";b:0;}}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:24:"!gfycat\\.com/(?\'id\'\\w+)!";i:2;R:193;}i:1;R:576;}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:4:{i:0;s:2:"//";i:1;a:2:{i:0;s:39:"!video:height" content="(?\'height\'\\d+)!";i:1;s:37:"!video:width" content="(?\'width\'\\d+)!";}i:2;a:2:{i:0;s:6:"height";i:1;s:5:"width";}i:3;s:23:"http://gfycat.com/{@id}";}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:4:"GIST";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:36:"!^(?:\\w+/)?[\\da-f]+(?:/[\\da-f]+)?$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:58:"!gist\\.github\\.com/(?\'id\'(?:\\w+/)?[\\da-f]+(?:/[\\da-f]+)?)!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:43:"!^(?\'id\'(?:\\w+/)?[\\da-f]+(?:/[\\da-f]+)?)$!D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:5;s:7:"allowed";a:3:{i:0;i:65500;i:1;i:65535;i:2;i:32639;}}s:10:"GLOBALNEWS";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:33:"!globalnews\\.ca/video/(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:8:"GOFUNDME";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:8:"@^\\w+$@D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:35:"@gofundme\\.com/(?\'id\'\\w+)(?![^#?])@";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:15:"@^(?\'id\'\\w+)$@D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:11:"GOOGLEDRIVE";a:8:{s:10:"attributes";R:337;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:44:"!drive\\.google\\.com/.*?file/d/(?\'id\'[-\\w]+)!";i:2;R:193;}i:1;R:347;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:10:"GOOGLEPLUS";a:8:{s:10:"attributes";a:4:{s:4:"name";a:2:{s:11:"filterChain";a:2:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:10:"!^[^/]+$!D";}}i:1;a:2:{s:8:"callback";s:9:"urldecode";s:6:"params";a:1:{s:9:"attrValue";N;}}}s:8:"required";b:0;}s:3:"oid";R:305;s:3:"pid";a:2:{s:11:"filterChain";R:565;s:8:"required";b:0;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:1:{i:0;a:3:{i:0;s:3:"url";i:1;s:83:"!//plus\\.google\\.com/(?:u/\\d+/)?(?:\\+(?\'name\'[^/]+)|(?\'oid\'\\d+))/posts/(?\'pid\'\\w+)!";i:2;a:4:{i:0;s:0:"";i:1;s:4:"name";i:2;s:3:"oid";i:3;s:3:"pid";}}}s:11:"filterChain";a:3:{i:0;R:200;i:1;R:205;i:2;R:329;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:6;s:7:"allowed";a:3:{i:0;i:65468;i:1;i:65535;i:2;i:32639;}}s:12:"GOOGLESHEETS";a:8:{s:10:"attributes";a:3:{s:3:"gid";R:305;s:2:"id";R:338;s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:89:"!docs\\.google\\.com/spreadsheet(?:/ccc\\?key=|s/d/)(?\'id\'[-\\w]+)[^#]*(?:#gid=(?\'gid\'\\d+))?!";i:2;a:3:{i:0;s:0:"";i:1;s:2:"id";i:2;s:3:"gid";}}i:1;R:347;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:7;s:7:"allowed";a:3:{i:0;i:65404;i:1;i:65535;i:2;i:32639;}}s:10:"HEALTHGURU";a:8:{s:10:"attributes";R:563;s:22:"attributePreprocessors";a:1:{i:0;R:576;}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:38:"!healthguru\\.com/(?:content/)?video/.!";i:1;s:34:"!healthguru\\.com/embed/(?\'id\'\\w+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:4:"HUDL";a:8:{s:10:"attributes";a:3:{s:7:"athlete";R:305;s:9:"highlight";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:13:"!^[\\da-f]+$!D";}}}s:8:"required";b:0;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:69:"!hudl\\.com/athlete/(?\'athlete\'\\d+)/highlights/(?\'highlight\'[\\da-f]+)!";i:2;a:3:{i:0;s:0:"";i:1;s:7:"athlete";i:2;s:9:"highlight";}}i:1;a:3:{i:0;s:3:"url";i:1;s:60:"!hudl\\.com/video/\\d+/(?\'athlete\'\\d+)/(?\'highlight\'[\\da-f]+)!";i:2;R:1011;}}s:11:"filterChain";a:4:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:14:"!hudl\\.com/v/!";i:1;s:60:"!hudl\\.com/video/\\d+/(?\'athlete\'\\d+)/(?\'highlight\'[\\da-f]+)!";i:2;a:2:{i:0;s:7:"athlete";i:1;s:9:"highlight";}}}s:8:"cacheDir";N;}}i:2;R:205;i:3;R:329;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:4:"HULU";a:8:{s:10:"attributes";R:337;s:22:"attributePreprocessors";R:346;s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:18:"!hulu\\.com/watch/!";i:1;s:19:"!eid=(?\'id\'[-\\w]+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:9:"HUMORTVNL";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:12:"!^[-.\\w]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:45:"!humortv\\.vara\\.nl/\\w+\\.(?\'id\'[-.\\w]+)\\.html!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:19:"!^(?\'id\'[-.\\w]+)$!D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:3:"IGN";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:35:"!^https?://.*?ign\\.com/videos/.+$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:39:"!(?\'id\'https?://.*?ign\\.com/videos/.+)!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:42:"!^(?\'id\'https?://.*?ign\\.com/videos/.+)$!D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:4:"IMDB";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:31:"!imdb\\.com/[/\\w]+/vi(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:5:"IMGUR";a:8:{s:10:"attributes";a:3:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:15:"@^(?:a/)?\\w+$@D";}}}s:8:"required";b:1;}s:4:"type";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:52:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterAlnum";s:6:"params";R:943;}}s:8:"required";b:0;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:74:"@imgur\\.com/(?!r/|user/)(?:gallery/)?(?\'id\'(?:a/)?\\w+)(?!\\w|\\.(?:pn|jp)g)@";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:22:"@^(?\'id\'(?:a/)?\\w+)$@D";i:2;R:193;}}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:23:"@imgur\\.com/gallery/\\w@";i:1;a:3:{i:0;s:41:"!image\\s*:\\s*.*?"is_(?\'type\'album)":true!";i:1;s:26:"!<div id="(?\'type\'album)-!";i:2;s:29:"!class="(?\'type\'album)-image!";}i:2;a:1:{i:0;s:4:"type";}}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:8;s:7:"allowed";a:3:{i:0;i:65532;i:1;i:65534;i:2;i:32639;}}s:9:"INDIEGOGO";a:8:{s:10:"attributes";R:337;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:39:"!indiegogo\\.com/projects/(?\'id\'[-\\w]+)!";i:2;R:193;}i:1;R:347;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:9:"INSTAGRAM";a:8:{s:10:"attributes";R:337;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:32:"!instagram\\.com/p/(?\'id\'[-\\w]+)!";i:2;R:193;}i:1;R:347;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:9;s:7:"allowed";a:3:{i:0;i:65532;i:1;i:65533;i:2;i:32639;}}s:15:"INTERNETARCHIVE";a:8:{s:10:"attributes";a:4:{s:6:"height";R:802;s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:11:"!^[^/"]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;s:5:"width";R:805;}s:22:"attributePreprocessors";a:1:{i:0;a:3:{i:0;s:3:"url";i:1;s:18:"!^(?\'id\'[^/"]+)$!D";i:2;R:193;}}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:23:"!archive\\.org/details/!";i:1;a:3:{i:0;s:81:"!meta property="twitter:player" content="https://archive.org/embed/(?\'id\'[^/"]+)!";i:1;s:55:"!meta property="og:video:width" content="(?\'width\'\\d+)!";i:2;s:57:"!meta property="og:video:height" content="(?\'height\'\\d+)!";}i:2;a:3:{i:0;s:6:"height";i:1;s:2:"id";i:2;s:5:"width";}}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:8:"IZLESENE";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:39:"!izlesene\\.com/video/[-\\w]+/(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:10:"JWPLATFORM";a:8:{s:10:"attributes";R:337;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:35:"!jwplatform\\.com/\\w+/(?\'id\'[-\\w]+)!";i:2;R:193;}i:1;R:347;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:3:"KHL";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:11:"!^[/\\w]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:1:{i:0;a:3:{i:0;s:3:"url";i:1;s:18:"!^(?\'id\'[/\\w]+)$!D";i:2;R:193;}}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:36:"!video\\.khl\\.ru/(?:event|quote)s/\\d!";i:1;s:27:"!/feed/start/(?\'id\'[/\\w]+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:11:"KICKSTARTER";a:8:{s:10:"attributes";a:4:{s:4:"card";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:9:"!^card$!D";}}}s:8:"required";b:0;}s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:17:"!^[^/]+/[^/?]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;s:5:"video";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:10:"!^video$!D";}}}s:8:"required";b:0;}}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:93:"!kickstarter\\.com/projects/(?\'id\'[^/]+/[^/?]+)(?:/widget/(?:(?\'card\'card)|(?\'video\'video)))?!";i:2;a:4:{i:0;s:0:"";i:1;s:2:"id";i:2;s:4:"card";i:3;s:5:"video";}}i:1;a:3:{i:0;s:3:"url";i:1;s:24:"!^(?\'id\'[^/]+/[^/?]+)$!D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:9:"KISSVIDEO";a:8:{s:10:"attributes";R:751;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:41:"!kissvideo\\.click/[^_]*_(?\'id\'[0-9a-f]+)!";i:2;R:193;}i:1;R:764;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:6:"LIBSYN";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";R:728;s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:16:"@(?!\\.mp3)....$@";i:1;s:29:"!embed/episode/id/(?\'id\'\\d+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:10;s:7:"allowed";a:3:{i:0;i:65532;i:1;i:65531;i:2;i:32639;}}s:7:"LIVECAP";a:8:{s:10:"attributes";a:3:{s:7:"channel";R:946;s:2:"id";R:564;s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:44:"!livecap.tv/[st]/(?\'channel\'\\w+)/(?\'id\'\\w+)!";i:2;a:3:{i:0;s:0:"";i:1;s:7:"channel";i:2;s:2:"id";}}i:1;R:576;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:8:"LIVELEAK";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:15:"!^[a-f_0-9]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:41:"!liveleak\\.com/view\\?i=(?\'id\'[a-f_0-9]+)!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:22:"!^(?\'id\'[a-f_0-9]+)$!D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:10:"LIVESTREAM";a:8:{s:10:"attributes";a:6:{s:10:"account_id";R:305;s:7:"channel";R:946;s:7:"clip_id";a:2:{s:11:"filterChain";R:339;s:8:"required";b:0;}s:8:"event_id";R:305;s:3:"url";R:180;s:8:"video_id";R:305;}s:22:"attributePreprocessors";a:3:{i:0;a:3:{i:0;s:3:"url";i:1;s:69:"!livestream\\.com/accounts/(?\'account_id\'\\d+)/events/(?\'event_id\'\\d+)!";i:2;a:3:{i:0;s:0:"";i:1;s:10:"account_id";i:2;s:8:"event_id";}}i:1;a:3:{i:0;s:3:"url";i:1;s:26:"!/videos/(?\'video_id\'\\d+)!";i:2;a:2:{i:0;s:0:"";i:1;s:8:"video_id";}}i:2;a:3:{i:0;s:3:"url";i:1;s:76:"!original\\.livestream\\.com/(?\'channel\'\\w+)/video\\?clipId=(?\'clip_id\'[-\\w]+)!";i:2;a:3:{i:0;s:0:"";i:1;s:7:"channel";i:2;s:7:"clip_id";}}}s:11:"filterChain";a:4:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:2:{i:0;a:3:{i:0;s:2:"//";i:1;s:53:"!accounts/(?\'account_id\'\\d+)/events/(?\'event_id\'\\d+)!";i:2;a:2:{i:0;s:10:"account_id";i:1;s:8:"event_id";}}i:1;a:3:{i:0;s:13:"!livestre.am!";i:1;s:70:"!//original\\.livestream\\.com/(?\'channel\'\\w+)/video/(?\'clip_id\'[-\\w]+)!";i:2;a:2:{i:0;s:7:"channel";i:1;s:7:"clip_id";}}}s:8:"cacheDir";N;}}i:2;R:205;i:3;R:329;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:6:"MAILRU";a:8:{s:10:"attributes";R:1211;s:22:"attributePreprocessors";R:1220;s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:35:"!my\\.mail\\.ru/\\w+/\\w+/video/\\w+/\\d!";i:1;s:36:"!mail\\.ru/video/(?\'id\'[/\\w]+)\\.html!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:5:"MEDIA";a:6:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:54:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::filterTag";s:6:"params";a:3:{s:3:"tag";N;s:6:"parser";N;s:10:"mediasites";N;}}}s:12:"nestingLimit";i:10;s:5:"rules";a:1:{s:5:"flags";i:513;}s:8:"tagLimit";i:1000;s:9:"bitNumber";i:0;s:7:"allowed";a:3:{i:0;i:65534;i:1;i:65535;i:2;i:32639;}}s:6:"MEDIUM";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";R:1000;s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:47:"!medium\\.com/[^/]*/(?:[-\\w]+-)?(?\'id\'[\\da-f]+)!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:20:"!^(?\'id\'[\\da-f]+)$!D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:11;s:7:"allowed";a:3:{i:0;i:65532;i:1;i:65527;i:2;i:32639;}}s:8:"METACAFE";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:32:"!metacafe\\.com/watch/(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:8:"MIXCLOUD";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:18:"@^[-\\w]+/[^/&]+$@D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:55:"@mixcloud\\.com/(?!categories|tag)(?\'id\'[-\\w]+/[^/&]+)/@";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:25:"@^(?\'id\'[-\\w]+/[^/&]+)$@D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:3:"MLB";a:8:{s:10:"attributes";R:671;s:22:"attributePreprocessors";a:3:{i:0;a:3:{i:0;s:3:"url";i:1;s:29:"#mlb\\.com/[\\w/]*/v(?\'id\'\\d+)#";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:41:"#mlb\\.com/r/video\\?content_id=(?\'id\'\\d+)#";i:2;R:193;}i:2;R:458;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:5:"MRCTV";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";R:728;s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:21:"!mrctv\\.org/videos/.!";i:1;s:29:"!mrctv\\.org/embed/(?\'id\'\\d+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:5:"MSNBC";a:8:{s:10:"attributes";R:905;s:22:"attributePreprocessors";a:1:{i:0;R:918;}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;a:2:{i:0;s:26:"@msnbc\\.com/[-\\w]+/watch/@";i:1;s:18:"@on\\.msnbc\\.com/.@";}i:1;s:19:"@guid="?(?\'id\'\\w+)@";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:13:"NATGEOCHANNEL";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:26:"@^[-/\\w]+/videos/[-\\w]+$@D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:63:"@channel\\.nationalgeographic\\.com/(?\'id\'[-/\\w]+/videos/[-\\w]+)@";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:33:"@^(?\'id\'[-/\\w]+/videos/[-\\w]+)$@D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:11:"NATGEOVIDEO";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:11:"@^[-\\w]+$@D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:1:{i:0;a:3:{i:0;s:3:"url";i:1;s:18:"@^(?\'id\'[-\\w]+)$@D";i:2;R:193;}}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:48:"@video\\.nationalgeographic\\.com/(?:tv|video)/\\w@";i:1;s:22:"@guid="(?\'id\'[-\\w]+)"@";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:7:"NBCNEWS";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:63:"!nbcnews\\.com/(?:widget/video-embed/|video/[-\\w]+?-)(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:9:"NBCSPORTS";a:8:{s:10:"attributes";R:563;s:22:"attributePreprocessors";R:983;s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:24:"!nbcsports\\.com/video/.!";i:1;s:25:"!select/media/(?\'id\'\\w+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:3:"NHL";a:8:{s:10:"attributes";a:4:{s:1:"c";R:438;s:2:"id";a:2:{s:11:"filterChain";R:368;s:8:"required";b:0;}s:1:"t";R:438;s:3:"url";R:180;}s:22:"attributePreprocessors";a:3:{i:0;a:3:{i:0;s:3:"url";i:1;s:44:"#nhl\\.com/videocenter/.*?\\Wid=(?\'id\'[-\\w]+)#";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:80:"#nhl\\.com/(?:\\w+/)?video(?:/(?![ct]-)[-\\w]+)?(?:/t-(?\'t\'\\d+))?(?:/c-(?\'c\'\\d+))?#";i:2;a:3:{i:0;s:0:"";i:1;s:1:"t";i:2;s:1:"c";}}i:2;R:379;}s:11:"filterChain";R:957;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:3:"NPR";a:7:{s:10:"attributes";a:3:{s:1:"i";R:305;s:1:"m";R:305;s:3:"url";R:180;}s:11:"filterChain";a:3:{i:0;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;a:2:{i:0;s:21:"!npr\\.org/[/\\w]+/\\d+!";i:1;s:10:"!n\\.pr/\\w!";}i:1;s:34:"!player/embed/(?\'i\'\\d+)/(?\'m\'\\d+)!";i:2;a:2:{i:0;s:1:"i";i:1;s:1:"m";}}}s:8:"cacheDir";N;}}i:1;R:205;i:2;R:329;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:12;s:7:"allowed";a:3:{i:0;i:65532;i:1;i:65519;i:2;i:32639;}}s:7:"NYTIMES";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:3:{i:0;a:3:{i:0;s:3:"url";i:1;s:50:"!nytimes\\.com/video/[a-z]+/(?:[a-z]+/)?(?\'id\'\\d+)!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:50:"!nytimes\\.com/video/\\d+/\\d+/\\d+/[a-z]+/(?\'id\'\\d+)!";i:2;R:193;}i:2;R:196;}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:4:{i:0;s:65:"!nytimes\\.com/movie(?:s/movie)?/(?\'playlist\'\\d+)/[-\\w]+/trailers!";i:1;s:26:"!/video/movies/(?\'id\'\\d+)!";i:2;R:359;i:3;s:73:"http://www.nytimes.com/svc/video/api/playlist/{@playlist}?externalId=true";}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:7:"ODDSHOT";a:8:{s:10:"attributes";R:337;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:31:"!oddshot.tv/shot/(?\'id\'[-\\w]+)!";i:2;R:193;}i:1;R:347;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:8:"PASTEBIN";a:8:{s:10:"attributes";R:905;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:55:"@pastebin\\.com/(?!u/)(?:\\w+(?:\\.php\\?i=|/))?(?\'id\'\\w+)@";i:2;R:193;}i:1;R:918;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:13;s:7:"allowed";a:3:{i:0;i:65532;i:1;i:65503;i:2;i:32639;}}s:7:"PLAYSTV";a:8:{s:10:"attributes";R:563;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:28:"!plays\\.tv/video/(?\'id\'\\w+)!";i:2;R:193;}i:1;R:576;}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:14:"!plays\\.tv/s/!";i:1;s:28:"!plays\\.tv/video/(?\'id\'\\w+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:7:"PODBEAN";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:55:"!podbean\\.com/site/player/index/pid/\\d+/eid/(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:17:"!podbean\\.com/e/!";i:1;s:25:"!embed/postId/(?\'id\'\\d+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:14;s:7:"allowed";a:3:{i:0;i:65532;i:1;i:65471;i:2;i:32639;}}s:5:"PREZI";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";R:447;s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:221:"#//prezi\\.com/(?!(?:a(?:bout|mbassadors)|c(?:o(?:llaborate|mmunity|ntact)|reate)|exp(?:erts|lore)|ip(?:ad|hone)|jobs|l(?:ear|ogi)n|m(?:ac|obility)|pr(?:es(?:s|ent)|icing)|recommend|support|user|windows|your)/)(?\'id\'\\w+)/#";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:15:"#^(?\'id\'\\w+)$#D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:6:"REDDIT";a:8:{s:10:"attributes";a:2:{s:4:"path";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:37:"!^/r/\\w+/comments/\\w+/(?:\\w+/\\w+)?$!D";}}}s:8:"required";b:0;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:1:{i:0;a:3:{i:0;s:3:"url";i:1;s:43:"!(?\'path\'/r/\\w+/comments/\\w+/(?:\\w+/\\w+)?)!";i:2;a:2:{i:0;s:0:"";i:1;s:4:"path";}}}s:11:"filterChain";R:957;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:15;s:7:"allowed";a:3:{i:0;i:65532;i:1;i:65407;i:2;i:32639;}}s:6:"RUTUBE";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:30:"!rutube\\.ru/tracks/(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:31:"!rutube\\.ru/video/[0-9a-f]{32}!";i:1;s:34:"!rutube\\.ru/play/embed/(?\'id\'\\d+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:6:"SCRIBD";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:50:"!scribd\\.com/(?:mobile/)?doc(?:ument)?/(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:16;s:7:"allowed";a:3:{i:0;i:65532;i:1;i:65535;i:2;i:32638;}}s:10:"SLIDESHARE";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:11:"!^\\d{6,}$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:45:"!slideshare\\.net/[^/]+/[-\\w]+-(?\'id\'\\d{6,})$!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:18:"!^(?\'id\'\\d{6,})$!D";i:2;R:193;}}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:26:"!slideshare\\.net/[^/]+/\\w!";i:1;s:29:"!"presentationId":(?\'id\'\\d+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:10:"SOUNDCLOUD";a:8:{s:10:"attributes";a:5:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:83:"@^(?:https?://(?:api\\.)?soundcloud\\.com/(?!pages/)[-/\\w]+/[-/\\w]+|^[^/]+/[^/]+$)$@D";}}}s:8:"required";b:1;}s:11:"playlist_id";a:2:{s:11:"filterChain";R:684;s:8:"required";b:0;}s:12:"secret_token";a:2:{s:11:"filterChain";R:1526;s:8:"required";b:0;}s:8:"track_id";R:1804;s:3:"url";R:180;}s:22:"attributePreprocessors";a:5:{i:0;a:3:{i:0;s:3:"url";i:1;s:83:"@(?\'id\'https?://(?:api\\.)?soundcloud\\.com/(?!pages/)[-/\\w]+/[-/\\w]+|^[^/]+/[^/]+$)@";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:52:"@api\\.soundcloud\\.com/playlists/(?\'playlist_id\'\\d+)@";i:2;a:2:{i:0;s:0:"";i:1;s:11:"playlist_id";}}i:2;a:3:{i:0;s:3:"url";i:1;s:89:"@api\\.soundcloud\\.com/tracks/(?\'track_id\'\\d+)(?:\\?secret_token=(?\'secret_token\'[-\\w]+))?@";i:2;a:3:{i:0;s:0:"";i:1;s:8:"track_id";i:2;s:12:"secret_token";}}i:3;a:3:{i:0;s:3:"url";i:1;s:81:"@soundcloud\\.com/(?!playlists|tracks)[-\\w]+/[-\\w]+/(?=s-)(?\'secret_token\'[-\\w]+)@";i:2;a:2:{i:0;s:0:"";i:1;s:12:"secret_token";}}i:4;a:3:{i:0;s:3:"url";i:1;s:90:"@^(?\'id\'(?:https?://(?:api\\.)?soundcloud\\.com/(?!pages/)[-/\\w]+/[-/\\w]+|^[^/]+/[^/]+$))$@D";i:2;R:193;}}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:2:{i:0;a:3:{i:0;s:54:"@soundcloud\\.com/(?!playlists|tracks)[-\\w]+/[-\\w]+/s-@";i:1;s:36:"@soundcloud:tracks:(?\'track_id\'\\d+)@";i:2;a:1:{i:0;s:8:"track_id";}}i:1;a:3:{i:0;s:27:"@soundcloud\\.com/\\w+/sets/@";i:1;s:44:"@soundcloud://playlists:(?\'playlist_id\'\\d+)@";i:2;a:1:{i:0;s:11:"playlist_id";}}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:17;s:7:"allowed";a:3:{i:0;i:65532;i:1;i:65535;i:2;i:32637;}}s:9:"SPORTSNET";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:8:"/^\\d+$/D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:1:{i:0;a:3:{i:0;s:3:"url";i:1;s:15:"/^(?\'id\'\\d+)$/D";i:2;R:193;}}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:2:"//";i:1;a:2:{i:0;s:25:"/vid(?:eoId)?=(?\'id\'\\d+)/";i:1;s:46:"/param name="@videoPlayer" value="(?\'id\'\\d+)"/";}i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:7:"SPOTIFY";a:8:{s:10:"attributes";a:3:{s:4:"path";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:44:"!^(?:(?:album|artist|track|user)/[-/\\w]+)$!D";}}}s:8:"required";b:0;}s:3:"uri";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:61:"!^(?:spotify:(?:album|artist|user|track(?:set)?):[-,:\\w]+)$!D";}}}s:8:"required";b:0;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:62:"!(?\'uri\'spotify:(?:album|artist|user|track(?:set)?):[-,:\\w]+)!";i:2;a:2:{i:0;s:0:"";i:1;s:3:"uri";}}i:1;a:3:{i:0;s:3:"url";i:1;s:74:"!(?:open|play)\\.spotify\\.com/(?\'path\'(?:album|artist|track|user)/[-/\\w]+)!";i:2;R:1724;}}s:11:"filterChain";R:957;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:10:"STEAMSTORE";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:39:"!store.steampowered.com/app/(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:18;s:7:"allowed";a:3:{i:0;i:65532;i:1;i:65535;i:2;i:32635;}}s:8:"STITCHER";a:7:{s:10:"attributes";a:3:{s:3:"eid";R:305;s:3:"fid";R:305;s:3:"url";R:180;}s:11:"filterChain";a:3:{i:0;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:11:"!/podcast/!";i:1;a:2:{i:0;s:23:"!data-eid="(?\'eid\'\\d+)!";i:1;s:23:"!data-fid="(?\'fid\'\\d+)!";}i:2;a:2:{i:0;s:3:"eid";i:1;s:3:"fid";}}}s:8:"cacheDir";N;}}i:1;R:205;i:2;R:329;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:19;s:7:"allowed";a:3:{i:0;i:65532;i:1;i:65535;i:2;i:32631;}}s:9:"STRAWPOLL";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:26:"!strawpoll\\.me/(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:10:"STREAMABLE";a:8:{s:10:"attributes";R:563;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:28:"!streamable\\.com/(?\'id\'\\w+)!";i:2;R:193;}i:1;R:576;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:8:"TEAMCOCO";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:32:"!teamcoco\\.com/video/(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:23:"!teamcoco\\.com/video/.!";i:1;s:17:"!"id":(?\'id\'\\d+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:3:"TED";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:46:"#^(?:(?:talk|playlist)s/[-\\w]+(?:\\.html)?)$#iD";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:76:"#ted\\.com/(?\'id\'(?:talk|playlist)s/[-\\w]+(?:\\.html)?)(?![-\\w]|/transcript)#i";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:53:"#^(?\'id\'(?:(?:talk|playlist)s/[-\\w]+(?:\\.html)?))$#iD";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:11:"THEATLANTIC";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:41:"!theatlantic\\.com/video/index/(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:11:"THEGUARDIAN";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:22:"!^\\w+/video/[-/\\w]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:43:"!theguardian\\.com/(?\'id\'\\w+/video/[-/\\w]+)!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:29:"!^(?\'id\'\\w+/video/[-/\\w]+)$!D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:8:"THEONION";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:42:"!theonion\\.com/video/[-\\w]+[-,](?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:7:"TINYPIC";a:8:{s:10:"attributes";a:3:{s:2:"id";R:564;s:1:"s";R:305;s:3:"url";R:180;}s:22:"attributePreprocessors";a:3:{i:0;a:3:{i:0;s:3:"url";i:1;s:52:"!tinypic\\.com/player\\.php\\?v=(?\'id\'\\w+)&s=(?\'s\'\\d+)!";i:2;a:3:{i:0;s:0:"";i:1;s:2:"id";i:2;s:1:"s";}}i:1;a:3:{i:0;s:3:"url";i:1;s:37:"!tinypic\\.com/r/(?\'id\'\\w+)/(?\'s\'\\d+)!";i:2;R:2050;}i:2;R:576;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:3:"TMZ";a:8:{s:10:"attributes";R:905;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:28:"@tmz\\.com/videos/(?\'id\'\\w+)@";i:2;R:193;}i:1;R:918;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:13:"TRAILERADDICT";a:8:{s:10:"attributes";a:2:{s:2:"id";R:683;s:3:"url";R:180;}s:22:"attributePreprocessors";a:1:{i:0;R:709;}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:37:"@traileraddict\\.com/(?!tags/)[^/]+/.@";i:1;s:34:"@v\\.traileraddict\\.com/(?\'id\'\\d+)@";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:6:"TUMBLR";a:8:{s:10:"attributes";a:5:{s:3:"did";R:1339;s:2:"id";R:172;s:3:"key";R:1339;s:4:"name";R:1339;s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:46:"!(?\'name\'[-\\w]+)\\.tumblr\\.com/post/(?\'id\'\\d+)!";i:2;a:3:{i:0;s:0:"";i:1;s:4:"name";i:2;s:2:"id";}}i:1;R:196;}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:4:{i:0;s:25:"!\\w\\.tumblr\\.com/post/\\d!";i:1;a:2:{i:0;s:27:"!did=\\\\u0022(?\'did\'[-\\w]+)!";i:1;s:31:"!embed\\\\/post\\\\/(?\'key\'[-\\w]+)!";}i:2;a:2:{i:0;s:3:"did";i:1;s:3:"key";}i:3;s:73:"http://www.tumblr.com/oembed/1.0?url=http://{@name}.tumblr.com/post/{@id}";}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:20;s:7:"allowed";a:3:{i:0;i:65532;i:1;i:65535;i:2;i:32623;}}s:6:"TWITCH";a:8:{s:10:"attributes";a:7:{s:10:"archive_id";R:438;s:7:"channel";R:446;s:10:"chapter_id";R:438;s:7:"clip_id";R:446;s:1:"t";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:27:"#^(?:(?:\\d+h)?\\d+m)?\\d+s$#D";}}}s:8:"required";b:0;}s:3:"url";R:180;s:8:"video_id";R:438;}s:22:"attributePreprocessors";a:3:{i:0;a:3:{i:0;s:3:"url";i:1;s:96:"#twitch\\.tv/(?\'channel\'\\w+)(?:/b/(?\'archive_id\'\\d+)|/c/(?\'chapter_id\'\\d+)|/v/(?\'video_id\'\\d+))?#";i:2;a:5:{i:0;s:0:"";i:1;s:7:"channel";i:2;s:10:"archive_id";i:3;s:10:"chapter_id";i:4;s:8:"video_id";}}i:1;a:3:{i:0;s:3:"url";i:1;s:32:"#t=(?\'t\'(?:(?:\\d+h)?\\d+m)?\\d+s)#";i:2;a:2:{i:0;s:0:"";i:1;s:1:"t";}}i:2;a:3:{i:0;s:3:"url";i:1;s:51:"#clips\\.twitch\\.tv/(?\'channel\'\\w+)/(?\'clip_id\'\\w+)#";i:2;R:1358;}}s:11:"filterChain";R:957;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:7:"TWITTER";a:8:{s:10:"attributes";R:2069;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:51:"@twitter\\.com/(?:#!/)?\\w+/status(?:es)?/(?\'id\'\\d+)@";i:2;R:193;}i:1;R:709;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:21;s:7:"allowed";a:3:{i:0;i:65532;i:1;i:65535;i:2;i:32607;}}s:7:"USTREAM";a:8:{s:10:"attributes";a:3:{s:3:"cid";R:305;s:3:"url";R:180;s:3:"vid";R:305;}s:22:"attributePreprocessors";a:1:{i:0;a:3:{i:0;s:3:"url";i:1;s:34:"!ustream\\.tv/recorded/(?\'vid\'\\d+)!";i:2;a:2:{i:0;s:0:"";i:1;s:3:"vid";}}}s:11:"filterChain";a:4:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:90:"#ustream\\.tv/(?!explore/|platform/|recorded/|search\\?|upcoming$|user/)(?:channel/)?[-\\w]+#";i:1;s:19:"!embed/(?\'cid\'\\d+)!";i:2;a:1:{i:0;s:3:"cid";}}}s:8:"cacheDir";N;}}i:2;R:205;i:3;R:329;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:5:"VBOX7";a:8:{s:10:"attributes";R:1416;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:33:"!vbox7\\.com/play:(?\'id\'[\\da-f]+)!";i:2;R:193;}i:1;R:1423;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:4:"VEOH";a:8:{s:10:"attributes";R:563;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:50:"!veoh\\.com/(?:m/watch\\.php\\?v=|watch/)v(?\'id\'\\w+)!";i:2;R:193;}i:1;R:576;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:4:"VEVO";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:14:"!^[A-Z0-9]+$!D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:45:"!vevo\\.com/watch/([-/\\w]+/)?(?\'id\'[A-Z0-9]+)!";i:2;a:3:{i:0;s:0:"";i:1;s:0:"";i:2;s:2:"id";}}i:1;a:3:{i:0;s:3:"url";i:1;s:21:"!^(?\'id\'[A-Z0-9]+)$!D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:7:"VIAGAME";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:40:"!viagame\\.com/channels/[^/]+/(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:14:"VIDEODETECTIVE";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:59:"!videodetective\\.com/\\w+/[-\\w]+/(?:trailer/P0*)?(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:9:"VIDEOMEGA";a:8:{s:10:"attributes";R:563;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:32:"!videomega\\.tv/\\?ref=(?\'id\'\\w+)!";i:2;R:193;}i:1;R:576;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:5:"VIDME";a:8:{s:10:"attributes";a:4:{s:6:"height";R:802;s:2:"id";R:564;s:3:"url";R:180;s:5:"width";R:805;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:20:"!vid\\.me/(?\'id\'\\w+)!";i:2;R:193;}i:1;R:576;}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:2:"//";i:1;s:170:"!meta property="og:video:type" content="video/\\w+">\\s*<meta property="og:video:height" content="(?\'height\'\\d+)">\\s*<meta property="og:video:width" content="(?\'width\'\\d+)!";i:2;R:864;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:5:"VIMEO";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:50:"!vimeo\\.com/(?:channels/[^/]+/|video/)?(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:4:"VINE";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;R:936;}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:25:"!vine\\.co/v/(?\'id\'[^/]+)!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:17:"!^(?\'id\'[^/]+)$!D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:2:"VK";a:8:{s:10:"attributes";a:4:{s:4:"hash";a:2:{s:11:"filterChain";R:753;s:8:"required";b:0;}s:3:"oid";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:10:"!^-?\\d+$!D";}}}s:8:"required";b:0;}s:3:"url";R:180;s:3:"vid";R:305;}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:71:"!vk(?:\\.com|ontakte\\.ru)/(?:[\\w.]+\\?z=)?video(?\'oid\'-?\\d+)_(?\'vid\'\\d+)!";i:2;a:3:{i:0;s:0:"";i:1;s:3:"oid";i:2;s:3:"vid";}}i:1;a:3:{i:0;s:3:"url";i:1;s:98:"!vk(?:\\.com|ontakte\\.ru)/video_ext\\.php\\?oid=(?\'oid\'-?\\d+)&id=(?\'vid\'\\d+)&hash=(?\'hash\'[0-9a-f]+)!";i:2;a:4:{i:0;s:0:"";i:1;s:3:"oid";i:2;s:3:"vid";i:3;s:4:"hash";}}}s:11:"filterChain";a:4:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:4:{i:0;s:21:"!vk.*?video-?\\d+_\\d+!";i:1;s:31:"!embed_hash=(?\'hash\'[0-9a-f]+)!";i:2;a:1:{i:0;s:4:"hash";}i:3;s:32:"http://vk.com/video{@oid}_{@vid}";}}s:8:"cacheDir";N;}}i:2;R:205;i:3;R:329;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:7:"VOCAROO";a:8:{s:10:"attributes";R:563;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:27:"!vocaroo\\.com/i/(?\'id\'\\w+)!";i:2;R:193;}i:1;R:576;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:3:"VOX";a:8:{s:10:"attributes";R:337;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:31:"!vox.com/.*#ooid=(?\'id\'[-\\w]+)!";i:2;R:193;}i:1;R:347;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:14:"WASHINGTONPOST";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:15:"#^[-0-9a-f]+$#D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:3:{i:0;a:3:{i:0;s:3:"url";i:1;s:51:"#washingtonpost\\.com/video/c/\\w+/(?\'id\'[-0-9a-f]+)#";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:65:"#washingtonpost\\.com/video/[-/\\w]+/(?\'id\'[-0-9a-f]+)_video\\.html#";i:2;R:193;}i:2;a:3:{i:0;s:3:"url";i:1;s:22:"#^(?\'id\'[-0-9a-f]+)$#D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:4:"WSHH";a:8:{s:10:"attributes";R:171;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:42:"!worldstarhiphop\\.com/featured/(?\'id\'\\d+)!";i:2;R:193;}i:1;R:196;}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:49:"!worldstarhiphop\\.com/(?:\\w+/)?video\\.php\\?v=\\w+!";i:1;s:35:"!disqus_identifier[ =\']+(?\'id\'\\d+)!";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:3:"WSJ";a:8:{s:10:"attributes";a:2:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:18:"@^[-0-9A-F]{36}$@D";}}}s:8:"required";b:1;}s:3:"url";R:180;}s:22:"attributePreprocessors";a:3:{i:0;a:3:{i:0;s:3:"url";i:1;s:38:"@wsj\\.com/[^#]*#!(?\'id\'[-0-9A-F]{36})@";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:43:"@wsj\\.com/video/[^/]+/(?\'id\'[-0-9A-F]{36})@";i:2;R:193;}i:2;a:3:{i:0;s:3:"url";i:1;s:25:"@^(?\'id\'[-0-9A-F]{36})$@D";i:2;R:193;}}s:11:"filterChain";a:3:{i:0;R:200;i:1;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:17:"@on\\.wsj\\.com/\\w@";i:1;s:27:"@guid=(?\'id\'[-0-9A-F]{36})@";i:2;R:359;}}s:8:"cacheDir";N;}}i:2;R:205;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:9:"XBOXCLIPS";a:8:{s:10:"attributes";a:3:{s:2:"id";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:15:"@^[-0-9a-f]+$@D";}}}s:8:"required";b:1;}s:3:"url";R:180;s:4:"user";a:2:{s:11:"filterChain";a:1:{i:0;a:2:{s:8:"callback";s:53:"s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp";s:6:"params";a:2:{s:9:"attrValue";N;i:0;s:10:"@^[^/]+$@D";}}}s:8:"required";b:0;}}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:65:"@xboxclips\\.com/(?\'user\'[^/]+)/(?!screenshots/)(?\'id\'[-0-9a-f]+)@";i:2;a:3:{i:0;s:0:"";i:1;s:4:"user";i:2;s:2:"id";}}i:1;a:3:{i:0;s:3:"url";i:1;s:22:"@^(?\'id\'[-0-9a-f]+)$@D";i:2;R:193;}}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:7:"XBOXDVR";a:8:{s:10:"attributes";a:3:{s:2:"id";R:172;s:3:"url";R:180;s:4:"user";a:2:{s:11:"filterChain";R:2279;s:8:"required";b:0;}}s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:52:"!xboxdvr\\.com/gamer/(?\'user\'[^/]+)/video/(?\'id\'\\d+)!";i:2;R:2447;}i:1;R:196;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:11:"YAHOOSCREEN";a:8:{s:10:"attributes";R:337;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:52:"!screen\\.yahoo\\.com/(?:[-\\w]+/)?(?\'id\'[-\\w]+)\\.html!";i:2;R:193;}i:1;R:347;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:5:"YOUKU";a:8:{s:10:"attributes";R:563;s:22:"attributePreprocessors";a:2:{i:0;a:3:{i:0;s:3:"url";i:1;s:33:"!youku\\.com/v_show/id_(?\'id\'\\w+)!";i:2;R:193;}i:1;R:576;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:7:"YOUTUBE";a:8:{s:10:"attributes";a:7:{s:1:"h";R:305;s:2:"id";R:338;s:4:"list";R:1339;s:1:"m";R:305;s:1:"s";R:305;s:1:"t";R:305;s:3:"url";R:180;}s:22:"attributePreprocessors";a:5:{i:0;a:3:{i:0;s:3:"url";i:1;s:45:"!youtube\\.com/(?:watch.*?v=|v/)(?\'id\'[-\\w]+)!";i:2;R:193;}i:1;a:3:{i:0;s:3:"url";i:1;s:25:"!youtu\\.be/(?\'id\'[-\\w]+)!";i:2;R:193;}i:2;a:3:{i:0;s:3:"url";i:1;s:57:"![#&?]t=(?:(?:(?\'h\'\\d+)h)?(?\'m\'\\d+)m(?\'s\'\\d+)|(?\'t\'\\d+))!";i:2;a:5:{i:0;s:0:"";i:1;s:1:"h";i:2;s:1:"m";i:3;s:1:"s";i:4;s:1:"t";}}i:3;a:3:{i:0;s:3:"url";i:1;s:23:"!&list=(?\'list\'[-\\w]+)!";i:2;a:2:{i:0;s:0:"";i:1;s:4:"list";}}i:4;R:347;}s:11:"filterChain";R:199;s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:1;s:7:"allowed";R:217;}s:10:"ZIPPYSHARE";a:7:{s:10:"attributes";a:3:{s:4:"file";R:946;s:6:"server";R:305;s:3:"url";R:180;}s:11:"filterChain";a:3:{i:0;a:2:{s:8:"callback";s:51:"s9e\\TextFormatter\\Plugins\\MediaEmbed\\Parser::scrape";s:6:"params";a:3:{s:3:"tag";N;i:0;a:1:{i:0;a:3:{i:0;s:5:"!/v/!";i:1;s:45:"!file=(?\'file\'\\w+)&amp;server=(?\'server\'\\d+)!";i:2;a:2:{i:0;s:4:"file";i:1;s:6:"server";}}}s:8:"cacheDir";N;}}i:1;R:205;i:2;R:329;}s:12:"nestingLimit";i:10;s:5:"rules";R:213;s:8:"tagLimit";i:1000;s:9:"bitNumber";i:22;s:7:"allowed";a:3:{i:0;i:65532;i:1;i:65535;i:2;i:32575;}}}}');
+	}
+	public static function getRenderer()
+	{
+		return \unserialize('O:44:"s9e\\TextFormatter\\Bundles\\MediaPack\\Renderer":2:{s:9:"' . "\0" . '*' . "\0" . 'params";a:8:{s:20:"AMAZON_ASSOCIATE_TAG";s:0:"";s:23:"AMAZON_ASSOCIATE_TAG_CA";s:0:"";s:23:"AMAZON_ASSOCIATE_TAG_DE";s:0:"";s:23:"AMAZON_ASSOCIATE_TAG_ES";s:0:"";s:23:"AMAZON_ASSOCIATE_TAG_FR";s:0:"";s:23:"AMAZON_ASSOCIATE_TAG_IT";s:0:"";s:23:"AMAZON_ASSOCIATE_TAG_JP";s:0:"";s:23:"AMAZON_ASSOCIATE_TAG_UK";s:0:"";}s:18:"metaElementsRegexp";s:22:"(<[eis]>[^<]*</[eis]>)";}');
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Bundles/MediaPack/Renderer.php
@@ -0,0 +1,114 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Bundles\MediaPack;
+class Renderer extends \s9e\TextFormatter\Renderer
+{
+	protected $params=array('AMAZON_ASSOCIATE_TAG'=>'','AMAZON_ASSOCIATE_TAG_CA'=>'','AMAZON_ASSOCIATE_TAG_DE'=>'','AMAZON_ASSOCIATE_TAG_ES'=>'','AMAZON_ASSOCIATE_TAG_FR'=>'','AMAZON_ASSOCIATE_TAG_IT'=>'','AMAZON_ASSOCIATE_TAG_JP'=>'','AMAZON_ASSOCIATE_TAG_UK'=>'');
+	protected static $tagBranches=array('ABCNEWS'=>0,'AMAZON'=>1,'AUDIOBOOM'=>2,'AUDIOMACK'=>3,'BANDCAMP'=>4,'BBCNEWS'=>5,'BLAB'=>6,'BLEACHERREPORT'=>7,'BREAK'=>8,'BRIGHTCOVE'=>9,'CBSNEWS'=>10,'CNBC'=>11,'CNN'=>12,'CNNMONEY'=>13,'COLLEGEHUMOR'=>14,'COMEDYCENTRAL'=>15,'COUB'=>16,'DAILYMOTION'=>17,'DEMOCRACYNOW'=>18,'DUMPERT'=>19,'EIGHTTRACKS'=>20,'ESPN'=>21,'FACEBOOK'=>22,'FLICKR'=>23,'FORATV'=>24,'FOXNEWS'=>25,'FUNNYORDIE'=>26,'GAMESPOT'=>27,'GAMETRAILERS'=>28,'GETTY'=>29,'GFYCAT'=>30,'GIST'=>31,'GLOBALNEWS'=>32,'GOFUNDME'=>33,'GOOGLEDRIVE'=>34,'GOOGLEPLUS'=>35,'GOOGLESHEETS'=>36,'HEALTHGURU'=>37,'HUDL'=>38,'HULU'=>39,'HUMORTVNL'=>40,'IGN'=>41,'IMDB'=>42,'IMGUR'=>43,'INDIEGOGO'=>44,'INSTAGRAM'=>45,'INTERNETARCHIVE'=>46,'IZLESENE'=>47,'JWPLATFORM'=>48,'KHL'=>49,'KICKSTARTER'=>50,'KISSVIDEO'=>51,'LIBSYN'=>52,'LIVECAP'=>53,'LIVELEAK'=>54,'LIVESTREAM'=>55,'MAILRU'=>56,'MEDIUM'=>57,'METACAFE'=>58,'MIXCLOUD'=>59,'MLB'=>60,'MRCTV'=>61,'MSNBC'=>62,'NATGEOCHANNEL'=>63,'NATGEOVIDEO'=>64,'NBCNEWS'=>65,'NBCSPORTS'=>66,'NHL'=>67,'NPR'=>68,'NYTIMES'=>69,'ODDSHOT'=>70,'PASTEBIN'=>71,'PLAYSTV'=>72,'PODBEAN'=>73,'PREZI'=>74,'REDDIT'=>75,'RUTUBE'=>76,'SCRIBD'=>77,'SLIDESHARE'=>78,'SOUNDCLOUD'=>79,'SPORTSNET'=>80,'SPOTIFY'=>81,'STEAMSTORE'=>82,'STITCHER'=>83,'STRAWPOLL'=>84,'STREAMABLE'=>85,'TEAMCOCO'=>86,'TED'=>87,'THEATLANTIC'=>88,'THEGUARDIAN'=>89,'THEONION'=>90,'TINYPIC'=>91,'TMZ'=>92,'TRAILERADDICT'=>93,'TUMBLR'=>94,'TWITCH'=>95,'TWITTER'=>96,'USTREAM'=>97,'VBOX7'=>98,'VEOH'=>99,'VEVO'=>100,'VIAGAME'=>101,'VIDEODETECTIVE'=>102,'VIDEOMEGA'=>103,'VIDME'=>104,'VIMEO'=>105,'VINE'=>106,'VK'=>107,'VOCAROO'=>108,'VOX'=>109,'WASHINGTONPOST'=>110,'WSHH'=>111,'WSJ'=>112,'XBOXCLIPS'=>113,'XBOXDVR'=>114,'YAHOOSCREEN'=>115,'YOUKU'=>116,'YOUTUBE'=>117,'ZIPPYSHARE'=>118,'br'=>119,'e'=>120,'i'=>120,'s'=>120,'p'=>121);
+	public function __sleep()
+	{
+		$props = \get_object_vars($this);
+		unset($props['out'], $props['proc'], $props['source']);
+		return \array_keys($props);
+	}
+	public function renderRichText($xml)
+	{
+		if (!isset($this->quickRenderingTest) || !\preg_match($this->quickRenderingTest, $xml))
+			try
+			{
+				return $this->renderQuick($xml);
+			}
+			catch (\Exception $e)
+			{
+			}
+		$dom = $this->loadXML($xml);
+		$this->out = '';
+		$this->at($dom->documentElement);
+		return $this->out;
+	}
+	protected function at(\DOMNode $root)
+	{
+		if ($root->nodeType === 3)
+			$this->out .= \htmlspecialchars($root->textContent,0);
+		else
+			foreach ($root->childNodes as $node)
+				if (!isset(self::$tagBranches[$node->nodeName]))
+					$this->at($node);
+				else
+				{
+					$tb = self::$tagBranches[$node->nodeName];
+					if($tb<61)if($tb<31){if($tb<16)if($tb<8)if($tb<4)if($tb===0)$this->out.='<div data-s9e-mediaembed="abcnews" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//abcnews.go.com/video/embed?id='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===1){$this->out.='<div data-s9e-mediaembed="amazon" style="display:inline-block;width:100%;max-width:120px"><div style="overflow:hidden;position:relative;padding-bottom:200%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="//';if($node->getAttribute('tld')==='es'||$node->getAttribute('tld')==='it'){$this->out.='rcm-eu.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;p=8&amp;l=as1&amp;f=ifr&amp;asins='.\htmlspecialchars($node->getAttribute('id'),2).'&amp;o=';if($node->getAttribute('tld')==='es')$this->out.='30';else$this->out.='29';$this->out.='&amp;t=';if($node->getAttribute('tld')==='es'&&!empty($this->params['AMAZON_ASSOCIATE_TAG_ES']))$this->out.=\htmlspecialchars($this->params['AMAZON_ASSOCIATE_TAG_ES'],2);elseif($node->getAttribute('tld')==='it'&&!empty($this->params['AMAZON_ASSOCIATE_TAG_IT']))$this->out.=\htmlspecialchars($this->params['AMAZON_ASSOCIATE_TAG_IT'],2);else$this->out.='_';}else{$this->out.='ws-';if($node->getAttribute('tld')==='jp')$this->out.='fe';elseif($node->hasAttribute('tld')&&(\strpos('desfrituk',$node->getAttribute('tld'))!==\false))$this->out.='eu';else$this->out.='na';$this->out.='.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&amp;OneJS=1&amp;Operation=GetAdHtml&amp;MarketPlace=';if($node->hasAttribute('tld'))$this->out.=\htmlspecialchars(\strtr($node->getAttribute('tld'),'acdefijkprstu','ACDEFIJBPRSTG'),2);else$this->out.='US';$this->out.='&amp;ad_type=product_link&amp;tracking_id=';if($node->getAttribute('tld')==='ca'&&!empty($this->params['AMAZON_ASSOCIATE_TAG_CA']))$this->out.=\htmlspecialchars($this->params['AMAZON_ASSOCIATE_TAG_CA'],2);elseif($node->getAttribute('tld')==='de'&&!empty($this->params['AMAZON_ASSOCIATE_TAG_DE']))$this->out.=\htmlspecialchars($this->params['AMAZON_ASSOCIATE_TAG_DE'],2);elseif($node->getAttribute('tld')==='fr'&&!empty($this->params['AMAZON_ASSOCIATE_TAG_FR']))$this->out.=\htmlspecialchars($this->params['AMAZON_ASSOCIATE_TAG_FR'],2);elseif($node->getAttribute('tld')==='jp'&&!empty($this->params['AMAZON_ASSOCIATE_TAG_JP']))$this->out.=\htmlspecialchars($this->params['AMAZON_ASSOCIATE_TAG_JP'],2);elseif($node->getAttribute('tld')==='uk'&&!empty($this->params['AMAZON_ASSOCIATE_TAG_UK']))$this->out.=\htmlspecialchars($this->params['AMAZON_ASSOCIATE_TAG_UK'],2);elseif(!empty($this->params['AMAZON_ASSOCIATE_TAG']))$this->out.=\htmlspecialchars($this->params['AMAZON_ASSOCIATE_TAG'],2);else$this->out.='_';$this->out.='&amp;marketplace=amazon&amp;region=';if($node->hasAttribute('tld'))$this->out.=\htmlspecialchars(\strtr($node->getAttribute('tld'),'acdefijkprstu','ACDEFIJBPRSTG'),2);else$this->out.='US';$this->out.='&amp;asins='.\htmlspecialchars($node->getAttribute('id'),2).'&amp;show_border=true&amp;link_opens_in_new_window=true';}$this->out.='"></iframe></div></div>';}elseif($tb===2)$this->out.='<iframe data-s9e-mediaembed="audioboom" allowfullscreen="" scrolling="no" src="//audioboom.com/boos/'.\htmlspecialchars($node->getAttribute('id'),2).'/embed/v3" style="border:0;height:150px;max-width:700px;width:100%"></iframe>';elseif($node->getAttribute('mode')==='album')$this->out.='<iframe data-s9e-mediaembed="audiomack" allowfullscreen="" scrolling="no" src="//www.audiomack.com/embed4-album/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:340px;max-width:900px;width:100%"></iframe>';else$this->out.='<iframe data-s9e-mediaembed="audiomack" allowfullscreen="" scrolling="no" src="//www.audiomack.com/embed4/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:110px;max-width:900px;width:100%"></iframe>';elseif($tb===4){$this->out.='<div data-s9e-mediaembed="bandcamp" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="//bandcamp.com/EmbeddedPlayer/size=large/minimal=true/';if($node->hasAttribute('album_id')){$this->out.='album='.\htmlspecialchars($node->getAttribute('album_id'),2);if($node->hasAttribute('track_num'))$this->out.='/t='.\htmlspecialchars($node->getAttribute('track_num'),2);}else$this->out.='track='.\htmlspecialchars($node->getAttribute('track_id'),2);$this->out.='"></iframe></div></div>';}elseif($tb===5){$this->out.='<div data-s9e-mediaembed="bbcnews" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="//www.bbc.com';if((\strpos($node->getAttribute('playlist'),'/news/')===0)&&(\strpos($node->getAttribute('playlist'),'A')!==\false))$this->out.=\htmlspecialchars(\strstr($node->getAttribute('playlist'),'A',\true),2);else$this->out.='/news/'.\htmlspecialchars($node->getAttribute('id'),2);$this->out.='/embed"></iframe></div></div>';}elseif($tb===6)$this->out.='<div data-s9e-mediaembed="blab" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" src="https://blab.im/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="bleacherreport" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//bleacherreport.com/video_embed?id='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb<12)if($tb===8)$this->out.='<div data-s9e-mediaembed="break" style="display:inline-block;width:100%;max-width:464px"><div style="overflow:hidden;position:relative;padding-bottom:60.344827586207%"><iframe allowfullscreen="" scrolling="no" src="//break.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===9)$this->out.='<div data-s9e-mediaembed="brightcove" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="https://link.brightcove.com/services/player/bcpid'.\htmlspecialchars($node->getAttribute('bcpid'),2).'?bckey='.\htmlspecialchars($node->getAttribute('bckey'),2).'&amp;bctid='.\htmlspecialchars($node->getAttribute('bctid'),2).'&amp;secureConnections=true&amp;secureHTMLConnections=true&amp;autoStart=false&amp;height=100%25&amp;width=100%25" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===10){$this->out.='<div data-s9e-mediaembed="cbsnews" style="display:inline-block;width:100%;max-width:640px">';if($node->hasAttribute('pid'))$this->out.='<div style="overflow:hidden;position:relative;padding-bottom:62.1875%;padding-bottom:calc(56.25% + 38px)"><object data="//www.cbsnews.com/common/video/cbsnews_player.swf" style="height:100%;left:0;position:absolute;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"><param name="flashvars" value="pType=embed&amp;si=254&amp;pid='.\htmlspecialchars($node->getAttribute('pid'),2);else$this->out.='<div style="overflow:hidden;position:relative;padding-bottom:62.5%;padding-bottom:calc(56.25% + 40px)"><object data="//i.i.cbsi.com/cnwk.1d/av/video/cbsnews/atlantis2/cbsnews_player_embed.swf" style="height:100%;left:0;position:absolute;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"><param name="flashvars" value="si=254&amp;contentValue='.\htmlspecialchars($node->getAttribute('id'),2);$this->out.='"></object></div>';$this->out.='</div>';}else$this->out.='<div data-s9e-mediaembed="cnbc" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:95%"><object data="//plus.cnbc.com/rssvideosearch/action/player/id/'.\htmlspecialchars($node->getAttribute('id'),2).'/code/cnbcplayershare" style="height:100%;left:0;position:absolute;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"></object></div></div>';elseif($tb===12)$this->out.='<div data-s9e-mediaembed="cnn" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//edition.cnn.com/video/api/embed.html#/video/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===13)$this->out.='<div data-s9e-mediaembed="cnnmoney" style="display:inline-block;width:100%;max-width:560px"><div style="overflow:hidden;position:relative;padding-bottom:64.285714285714%"><iframe allowfullscreen="" scrolling="no" src="//money.cnn.com/.element/ssi/video/7.0/players/embed.player.html?videoid=video/'.\htmlspecialchars($node->getAttribute('id'),2).'&amp;width=560&amp;height=360" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===14)$this->out.='<div data-s9e-mediaembed="collegehumor" style="display:inline-block;width:100%;max-width:600px"><div style="overflow:hidden;position:relative;padding-bottom:61.5%"><iframe allowfullscreen="" scrolling="no" src="//www.collegehumor.com/e/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="comedycentral" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//media.mtvnservices.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb<24)if($tb<20)if($tb===16)$this->out.='<div data-s9e-mediaembed="coub" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//coub.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===17)$this->out.='<div data-s9e-mediaembed="dailymotion" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.dailymotion.com/embed/video/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===18){$this->out.='<div data-s9e-mediaembed="democracynow" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="//www.democracynow.org/embed/';if((\strpos($node->getAttribute('id'),'/headlines')!==\false))$this->out.='headlines/'.\htmlspecialchars(\strstr($node->getAttribute('id'),'/headlines',\true),2);elseif((\strpos($node->getAttribute('id'),'2')===0))$this->out.='story/'.\htmlspecialchars($node->getAttribute('id'),2);elseif((\strpos($node->getAttribute('id'),'shows/')===0))$this->out.='show/'.\htmlspecialchars(\substr(\strstr($node->getAttribute('id'),'/'),1),2);else$this->out.=\htmlspecialchars($node->getAttribute('id'),2);$this->out.='"></iframe></div></div>';}else$this->out.='<div data-s9e-mediaembed="dumpert" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.dumpert.nl/embed/'.\htmlspecialchars(\strtr($node->getAttribute('id'),'_','/'),2).'/" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===20)$this->out.='<div data-s9e-mediaembed="eighttracks" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" src="//8tracks.com/mixes/'.\htmlspecialchars($node->getAttribute('id'),2).'/player_v3_universal" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===21)$this->out.='<div data-s9e-mediaembed="espn" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.espn.com/core/video/iframe?id='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===22)$this->out.='<iframe data-s9e-mediaembed="facebook" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/facebook.min.html#'.\htmlspecialchars($node->getAttribute('type').$node->getAttribute('id'),2).'" style="border:0;height:360px;max-width:640px;width:100%"></iframe>';else$this->out.='<div data-s9e-mediaembed="flickr" style="display:inline-block;width:100%;max-width:500px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" src="https://www.flickr.com/photos/_/'.\htmlspecialchars($node->getAttribute('id'),2).'/player/" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb<28)if($tb===24)$this->out.='<div data-s9e-mediaembed="foratv" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//library.fora.tv/embed?id='.\htmlspecialchars($node->getAttribute('id'),2).'&amp;type=c" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===25)$this->out.='<div data-s9e-mediaembed="foxnews" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//video.foxnews.com/v/video-embed.html?video_id='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===26)$this->out.='<div data-s9e-mediaembed="funnyordie" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.funnyordie.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="gamespot" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:62.5%"><iframe allowfullscreen="" scrolling="no" src="//www.gamespot.com/videos/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'/" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===28){$this->out.='<div data-s9e-mediaembed="gametrailers" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="';if((\strpos($node->getAttribute('id'),'mgid:')===0))$this->out.='//media.mtvnservices.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2);else$this->out.='//embed.gametrailers.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'?embed=1&amp;suppressBumper=1';$this->out.='"></iframe></div></div>';}elseif($tb===29){$this->out.='<div data-s9e-mediaembed="getty" style="display:inline-block;width:100%;max-width:'.\htmlspecialchars($node->getAttribute('width'),2).'px"><div style="overflow:hidden;position:relative;';if($node->getAttribute('width')>0)$this->out.='padding-bottom:'.\htmlspecialchars(100*($node->getAttribute('height')+49)/$node->getAttribute('width'),2).'%;padding-bottom:calc('.\htmlspecialchars(100*$node->getAttribute('height')/$node->getAttribute('width'),2).'% + 49px)';$this->out.='"><iframe allowfullscreen="" scrolling="no" src="//embed.gettyimages.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'?et='.\htmlspecialchars($node->getAttribute('et'),2).'&amp;sig='.\htmlspecialchars($node->getAttribute('sig'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';}else{$this->out.='<div data-s9e-mediaembed="gfycat" style="display:inline-block;width:100%;max-width:'.\htmlspecialchars($node->getAttribute('width'),2).'px"><div style="overflow:hidden;position:relative;';if($node->getAttribute('width')>0)$this->out.='padding-bottom:'.\htmlspecialchars(100*$node->getAttribute('height')/$node->getAttribute('width'),2).'%';$this->out.='"><iframe allowfullscreen="" scrolling="no" src="//gfycat.com/iframe/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';}}elseif($tb<46)if($tb<39)if($tb<35)if($tb===31)$this->out.='<iframe data-s9e-mediaembed="gist" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="" src="https://s9e.github.io/iframe/gist.min.html#'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:180px;width:100%"></iframe>';elseif($tb===32)$this->out.='<div data-s9e-mediaembed="globalnews" style="display:inline-block;width:100%;max-width:560px"><div style="overflow:hidden;position:relative;padding-bottom:67.321428571429%"><iframe allowfullscreen="" scrolling="no" src="//globalnews.ca/video/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'/" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===33)$this->out.='<div data-s9e-mediaembed="gofundme" style="display:inline-block;width:100%;max-width:258px"><div style="overflow:hidden;position:relative;padding-bottom:131.00775193798%"><object data="//funds.gofundme.com/Widgetflex.swf" style="height:100%;left:0;position:absolute;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"><param name="flashvars" value="page='.\htmlspecialchars($node->getAttribute('id'),2).'"></object></div></div>';else$this->out.='<div data-s9e-mediaembed="googledrive" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:75%"><iframe allowfullscreen="" scrolling="no" src="//drive.google.com/file/d/'.\htmlspecialchars($node->getAttribute('id'),2).'/preview" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===35){$this->out.='<iframe data-s9e-mediaembed="googleplus" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" style="border:0;height:240px;max-width:450px;width:100%" src="https://s9e.github.io/iframe/googleplus.min.html#';if($node->hasAttribute('oid'))$this->out.=\htmlspecialchars($node->getAttribute('oid'),2);else$this->out.='+'.\htmlspecialchars($node->getAttribute('name'),2);$this->out.='/posts/'.\htmlspecialchars($node->getAttribute('pid'),2).'"></iframe>';}elseif($tb===36)$this->out.='<iframe data-s9e-mediaembed="googlesheets" allowfullscreen="" scrolling="no" src="https://docs.google.com/spreadsheet/ccc?key='.\htmlspecialchars($node->getAttribute('id'),2).'&amp;widget=true&amp;headers=false&amp;rm=minimal#gid='.\htmlspecialchars($node->getAttribute('gid'),2).'" style="border:0;height:500px;resize:vertical;width:100%"></iframe>';elseif($tb===37)$this->out.='<div data-s9e-mediaembed="healthguru" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.healthguru.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="hudl" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.hudl.com/embed/athlete/'.\htmlspecialchars($node->getAttribute('athlete'),2).'/highlights/'.\htmlspecialchars($node->getAttribute('highlight'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb<43)if($tb===39)$this->out.='<div data-s9e-mediaembed="hulu" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="https://secure.hulu.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===40)$this->out.='<div data-s9e-mediaembed="humortvnl" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//humortv.vara.nl/embed.'.\htmlspecialchars($node->getAttribute('id'),2).'.html" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===41)$this->out.='<div data-s9e-mediaembed="ign" style="display:inline-block;width:100%;max-width:468px"><div style="overflow:hidden;position:relative;padding-bottom:56.196581196581%"><iframe allowfullscreen="" scrolling="no" src="//widgets.ign.com/video/embed/content.html?url='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="imdb" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.imdb.com/videoembed/vi'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===43){$this->out.='<iframe data-s9e-mediaembed="imgur" allowfullscreen="" onload="var b=Math.random();window.addEventListener(\'message\',function(a){a.data.id==b&amp;&amp;(style.height=a.data.height+\'px\',style.width=a.data.width+\'px\')});contentWindow.postMessage(\'s9e:\'+b,\'https://s9e.github.io\')" scrolling="no" style="border:0;height:450px;width:568px" src="https://s9e.github.io/iframe/imgur.min.html#';if($node->getAttribute('type')==='album'&&!((\strpos($node->getAttribute('id'),'a/')===0)))$this->out.='a/';$this->out.=\htmlspecialchars($node->getAttribute('id'),2).'"></iframe>';}elseif($tb===44)$this->out.='<div data-s9e-mediaembed="indiegogo" style="display:inline-block;width:100%;max-width:222px"><div style="overflow:hidden;position:relative;padding-bottom:200.45045045045%"><iframe allowfullscreen="" scrolling="no" src="//www.indiegogo.com/project/'.\htmlspecialchars($node->getAttribute('id'),2).'/embedded" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<iframe data-s9e-mediaembed="instagram" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/instagram.min.html#'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:640px;max-width:640px;width:100%"></iframe>';elseif($tb<54)if($tb<50)if($tb===46){$this->out.='<div data-s9e-mediaembed="internetarchive" style="display:inline-block;width:100%;max-width:'.\htmlspecialchars($node->getAttribute('width'),2).'px"><div style="overflow:hidden;position:relative;';if($node->getAttribute('width')>0)$this->out.='padding-bottom:'.\htmlspecialchars(100*$node->getAttribute('height')/$node->getAttribute('width'),2).'%';$this->out.='"><iframe allowfullscreen="" scrolling="no" src="https://archive.org/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';}elseif($tb===47)$this->out.='<div data-s9e-mediaembed="izlesene" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.izlesene.com/embedplayer/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===48)$this->out.='<div data-s9e-mediaembed="jwplatform" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//content.jwplatform.com/players/'.\htmlspecialchars($node->getAttribute('id'),2).'.html" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="khl" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//video.khl.ru/iframe/feed/start/'.\htmlspecialchars($node->getAttribute('id'),2).'?type_id=18&amp;width=560&amp;height=315" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===50)if($node->hasAttribute('video'))$this->out.='<div data-s9e-mediaembed="kickstarter" style="display:inline-block;width:100%;max-width:480px"><div style="overflow:hidden;position:relative;padding-bottom:75%"><iframe allowfullscreen="" scrolling="no" src="//www.kickstarter.com/projects/'.\htmlspecialchars($node->getAttribute('id'),2).'/widget/video.html" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="kickstarter" style="display:inline-block;width:100%;max-width:220px"><div style="overflow:hidden;position:relative;padding-bottom:190.90909090909%"><iframe allowfullscreen="" scrolling="no" src="//www.kickstarter.com/projects/'.\htmlspecialchars($node->getAttribute('id'),2).'/widget/card.html" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===51)$this->out.='<div data-s9e-mediaembed="kissvideo" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.kissvideo.click/embed.php?vid='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===52)$this->out.='<iframe data-s9e-mediaembed="libsyn" allowfullscreen="" scrolling="no" src="//html5-player.libsyn.com/embed/episode/id/'.\htmlspecialchars($node->getAttribute('id'),2).'/height/45/width/900/theme/standard/direction/no/autoplay/no/autonext/no/thumbnail/no/preload/no/no_addthis/no/" style="border:0;height:45px;max-width:900px;width:100%"></iframe>';else$this->out.='<div data-s9e-mediaembed="livecap" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="https://www.livecap.tv/s/embed/'.\htmlspecialchars($node->getAttribute('channel'),2).'/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb<58)if($tb===54)$this->out.='<div data-s9e-mediaembed="liveleak" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.liveleak.com/ll_embed?i='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===55){$this->out.='<div data-s9e-mediaembed="livestream" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="';if($node->hasAttribute('clip_id'))$this->out.='//cdn.livestream.com/embed/'.\htmlspecialchars($node->getAttribute('channel'),2).'?layout=4&amp;autoplay=false&amp;clip='.\htmlspecialchars($node->getAttribute('clip_id'),2);else{$this->out.='//livestream.com/accounts/'.\htmlspecialchars($node->getAttribute('account_id'),2).'/events/'.\htmlspecialchars($node->getAttribute('event_id'),2);if($node->hasAttribute('video_id'))$this->out.='/videos/'.\htmlspecialchars($node->getAttribute('video_id'),2);$this->out.='/player?autoPlay=false';}$this->out.='"></iframe></div></div>';}elseif($tb===56)$this->out.='<div data-s9e-mediaembed="mailru" style="display:inline-block;width:100%;max-width:560px"><div style="overflow:hidden;position:relative;padding-bottom:61.071428571429%"><iframe allowfullscreen="" scrolling="no" src="//videoapi.my.mail.ru/videos/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'.html" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<iframe data-s9e-mediaembed="medium" allowfullscreen="" onload="window.addEventListener(\'message\',function(a){a=a.data.split(\'::\');\'m\'===a[0]&amp;&amp;0&lt;src.indexOf(a[1])&amp;&amp;a[2]&amp;&amp;(style.height=a[2]+\'px\')})" scrolling="no" src="https://api.medium.com/embed?type=story&amp;path=%2F%2F'.\htmlspecialchars($node->getAttribute('id'),2).'&amp;id='.\htmlspecialchars(\strtr($node->getAttribute('id'),'abcdef','111111'),2).'" style="border:1px solid;border-color:#eee #ddd #bbb;border-radius:5px;box-shadow:rgba(0,0,0,.15) 0 1px 3px;height:400px;max-width:400px;width:100%"></iframe>';elseif($tb===58)$this->out.='<div data-s9e-mediaembed="metacafe" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.metacafe.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'/" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===59)$this->out.='<div data-s9e-mediaembed="mixcloud" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" src="//www.mixcloud.com/widget/iframe/?feed=http%3A%2F%2Fwww.mixcloud.com%2F'.\htmlspecialchars($node->getAttribute('id'),2).'%2F&amp;embed_type=widget_standard" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="mlb" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//m.mlb.com/shared/video/embed/embed.html?content_id='.\htmlspecialchars($node->getAttribute('id'),2).'&amp;width=640&amp;height=360" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb<92)if($tb<77)if($tb<69)if($tb<65)if($tb===61)$this->out.='<div data-s9e-mediaembed="mrctv" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="https://www.mrctv.org/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===62)$this->out.='<div data-s9e-mediaembed="msnbc" style="display:inline-block;width:100%;max-width:635px"><div style="overflow:hidden;position:relative;padding-bottom:69.291338582677%"><iframe allowfullscreen="" scrolling="no" src="//player.theplatform.com/p/2E2eJC/EmbeddedOffSite?guid='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===63)$this->out.='<div data-s9e-mediaembed="natgeochannel" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//channel.nationalgeographic.com/'.\htmlspecialchars($node->getAttribute('id'),2).'/embed/" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="natgeovideo" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//player.d.nationalgeographic.com/players/ngsvideo/share/?guid='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===65)$this->out.='<div data-s9e-mediaembed="nbcnews" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.nbcnews.com/widget/video-embed/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===66)$this->out.='<div data-s9e-mediaembed="nbcsports" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//vplayer.nbcsports.com/p/BxmELC/nbcsports_embed/select/media/'.\htmlspecialchars($node->getAttribute('id'),2).'?parentUrl=" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===67){$this->out.='<div data-s9e-mediaembed="nhl" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="';if($node->hasAttribute('c')||$node->hasAttribute('t')){$this->out.='//www.nhl.com/video/embed';if($node->hasAttribute('t'))$this->out.='/t-'.\htmlspecialchars($node->getAttribute('t'),2);if($node->hasAttribute('c'))$this->out.='/c-'.\htmlspecialchars($node->getAttribute('c'),2);$this->out.='?autostart=false';}else$this->out.='//video.nhl.com/videocenter/embed?playlist='.\htmlspecialchars($node->getAttribute('id'),2);$this->out.='"></iframe></div></div>';}else$this->out.='<iframe data-s9e-mediaembed="npr" allowfullscreen="" scrolling="no" src="//www.npr.org/player/embed/'.\htmlspecialchars($node->getAttribute('i'),2).'/'.\htmlspecialchars($node->getAttribute('m'),2).'" style="border:0;height:228px;max-width:800px;width:100%"></iframe>';elseif($tb<73)if($tb===69)$this->out.='<div data-s9e-mediaembed="nytimes" style="display:inline-block;width:100%;max-width:585px"><div style="overflow:hidden;position:relative;padding-bottom:68.376068376068%"><iframe allowfullscreen="" scrolling="no" src="//graphics8.nytimes.com/video/players/offsite/index.html?videoId='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===70)$this->out.='<div data-s9e-mediaembed="oddshot" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//oddshot.tv/shot/'.\htmlspecialchars($node->getAttribute('id'),2).'/embed" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===71)$this->out.='<iframe data-s9e-mediaembed="pastebin" allowfullscreen="" scrolling="" src="//pastebin.com/embed_iframe.php?i='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:300px;resize:vertical;width:100%"></iframe>';else$this->out.='<div data-s9e-mediaembed="playstv" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//plays.tv/embeds/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===73)$this->out.='<iframe data-s9e-mediaembed="podbean" allowfullscreen="" scrolling="no" src="//www.podbean.com/media/player/audio/postId/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100px;max-width:900px;width:100%"></iframe>';elseif($tb===74)$this->out.='<div data-s9e-mediaembed="prezi" style="display:inline-block;width:100%;max-width:550px"><div style="overflow:hidden;position:relative;padding-bottom:72.727272727273%"><iframe allowfullscreen="" scrolling="no" src="//prezi.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'/" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===75)$this->out.='<iframe data-s9e-mediaembed="reddit" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/reddit.min.html#'.\htmlspecialchars($node->getAttribute('path'),2).'" style="border:0;height:165px;max-width:800px;width:100%"></iframe>';else$this->out.='<div data-s9e-mediaembed="rutube" style="display:inline-block;width:100%;max-width:720px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//rutube.ru/play/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb<85)if($tb<81)if($tb===77)$this->out.='<iframe data-s9e-mediaembed="scribd" allowfullscreen="" scrolling="no" src="https://www.scribd.com/embeds/'.\htmlspecialchars($node->getAttribute('id'),2).'/content?view_mode=scroll&amp;show_recommendations=false" style="border:0;height:500px;resize:vertical;width:100%"></iframe>';elseif($tb===78)$this->out.='<div data-s9e-mediaembed="slideshare" style="display:inline-block;width:100%;max-width:427px"><div style="overflow:hidden;position:relative;padding-bottom:83.372365339578%"><iframe allowfullscreen="" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===79){$this->out.='<iframe data-s9e-mediaembed="soundcloud" allowfullscreen="" scrolling="no" src="https://w.soundcloud.com/player/?url=';if($node->hasAttribute('playlist_id'))$this->out.='https%3A//api.soundcloud.com/playlists/'.\htmlspecialchars($node->getAttribute('playlist_id'),2);elseif($node->hasAttribute('track_id'))$this->out.='https%3A//api.soundcloud.com/tracks/'.\htmlspecialchars($node->getAttribute('track_id'),2).'&amp;secret_token='.\htmlspecialchars($node->getAttribute('secret_token'),2);else{if((\strpos($node->getAttribute('id'),'://')===\false))$this->out.='https%3A//soundcloud.com/';$this->out.=\htmlspecialchars($node->getAttribute('id'),2);}$this->out.='" style="border:0;height:';if($node->hasAttribute('playlist_id')||(\strpos($node->getAttribute('id'),'/sets/')!==\false))$this->out.='450';else$this->out.='166';$this->out.='px;max-width:900px;width:100%"></iframe>';}else$this->out.='<div data-s9e-mediaembed="sportsnet" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="https://images.rogersdigitalmedia.com/video_service.php?videoId='.\htmlspecialchars($node->getAttribute('id'),2).'&amp;playerKey=AQ~~,AAAAAGWRwLc~,cRCmKE8Utf7OFWP38XQcokFZ80fR-u_y&amp;autoStart=false&amp;width=100%25&amp;height=100%25" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===81){$this->out.='<div data-s9e-mediaembed="spotify" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:120%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="https://embed.spotify.com/?view=coverart&amp;uri=';if($node->hasAttribute('uri'))$this->out.=\htmlspecialchars($node->getAttribute('uri'),2);else$this->out.='spotify:'.\htmlspecialchars(\strtr($node->getAttribute('path'),'/',':'),2);$this->out.='"></iframe></div></div>';}elseif($tb===82)$this->out.='<iframe data-s9e-mediaembed="steamstore" allowfullscreen="" scrolling="no" src="//store.steampowered.com/widget/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:190px;max-width:900px;width:100%"></iframe>';elseif($tb===83)$this->out.='<iframe data-s9e-mediaembed="stitcher" allowfullscreen="" scrolling="no" src="//app.stitcher.com/splayer/f/'.\htmlspecialchars($node->getAttribute('fid'),2).'/'.\htmlspecialchars($node->getAttribute('eid'),2).'" style="border:0;height:150px;max-width:900px;width:100%"></iframe>';else$this->out.='<div data-s9e-mediaembed="strawpoll" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="" src="//www.strawpoll.me/embed_1/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb<89)if($tb===85)$this->out.='<div data-s9e-mediaembed="streamable" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//streamable.com/e/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===86)$this->out.='<div data-s9e-mediaembed="teamcoco" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:64.84375%"><iframe allowfullscreen="" scrolling="no" src="//teamcoco.com/embed/v/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===87){$this->out.='<div data-s9e-mediaembed="ted" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="//embed.ted.com/'.\htmlspecialchars($node->getAttribute('id'),2);if((\strpos($node->getAttribute('id'),'.html')===\false))$this->out.='.html';$this->out.='"></iframe></div></div>';}else$this->out.='<div data-s9e-mediaembed="theatlantic" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.theatlantic.com/video/iframe/'.\htmlspecialchars($node->getAttribute('id'),2).'/" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===89)$this->out.='<div data-s9e-mediaembed="theguardian" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//embed.theguardian.com/embed/video/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===90)$this->out.='<div data-s9e-mediaembed="theonion" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.theonion.com/video_embed/?id='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="tinypic" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:60.9375%;padding-bottom:calc(56.25% + 30px)"><object data="//tinypic.com/player.swf?file='.\htmlspecialchars($node->getAttribute('id'),2).'&amp;s='.\htmlspecialchars($node->getAttribute('s'),2).'" style="height:100%;left:0;position:absolute;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"></object></div></div>';elseif($tb<107)if($tb<100)if($tb<96){if($tb===92)$this->out.='<div data-s9e-mediaembed="tmz" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.kaltura.com/index.php/kwidget/cache_st/133592691/wid/_591531/partner_id/591531/uiconf_id/9071262/entry_id/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===93)$this->out.='<div data-s9e-mediaembed="traileraddict" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//v.traileraddict.com/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===94)$this->out.='<iframe data-s9e-mediaembed="tumblr" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/tumblr.min.html#'.\htmlspecialchars($node->getAttribute('key'),2).'/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:180px;max-width:520px;width:100%"></iframe>';else{$this->out.='<div data-s9e-mediaembed="twitch" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="';if($node->hasAttribute('clip_id'))$this->out.='//clips.twitch.tv/embed?autoplay=false&amp;clip='.\htmlspecialchars($node->getAttribute('channel'),2).'/'.\htmlspecialchars($node->getAttribute('clip_id'),2);else{$this->out.='//player.twitch.tv/?autoplay=false&amp;';if($node->hasAttribute('archive_id'))$this->out.='video=a'.\htmlspecialchars($node->getAttribute('archive_id'),2);elseif($node->hasAttribute('chapter_id'))$this->out.='video=c'.\htmlspecialchars($node->getAttribute('chapter_id'),2);elseif($node->hasAttribute('video_id'))$this->out.='video=v'.\htmlspecialchars($node->getAttribute('video_id'),2);else$this->out.='channel='.\htmlspecialchars($node->getAttribute('channel'),2);if($node->hasAttribute('t'))$this->out.='&amp;time='.\htmlspecialchars($node->getAttribute('t'),2);}$this->out.='"></iframe></div></div>';}}elseif($tb===96)$this->out.='<iframe data-s9e-mediaembed="twitter" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/twitter.min.html#'.\htmlspecialchars($node->getAttribute('id'),2).'" style="background:url(https://abs.twimg.com/favicons/favicon.ico) no-repeat 50% 50%;border:0;height:186px;max-width:500px;width:100%"></iframe>';elseif($tb===97){$this->out.='<div data-s9e-mediaembed="ustream" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%">';if($node->hasAttribute('vid'))$this->out.='<iframe allowfullscreen="" scrolling="no" src="//www.ustream.tv/embed/recorded/'.\htmlspecialchars($node->getAttribute('vid'),2);else$this->out.='<iframe allowfullscreen="" scrolling="no" src="//www.ustream.tv/embed/'.\htmlspecialchars($node->getAttribute('cid'),2);$this->out.='?html5ui" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe>';$this->out.='</div></div>';}elseif($tb===98)$this->out.='<div data-s9e-mediaembed="vbox7" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//vbox7.com/emb/external.php?vid='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="veoh" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:62.5%;padding-bottom:calc(56.25% + 40px)"><object data="//www.veoh.com/swf/webplayer/WebPlayer.swf?version=AFrontend.5.7.0.1509&amp;permalinkId=v'.\htmlspecialchars($node->getAttribute('id'),2).'&amp;player=videodetailsembedded&amp;videoAutoPlay=0&amp;id=anonymous" style="height:100%;left:0;position:absolute;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"></object></div></div>';elseif($tb<104)if($tb===100)$this->out.='<div data-s9e-mediaembed="vevo" style="display:inline-block;width:100%;max-width:575px"><div style="overflow:hidden;position:relative;padding-bottom:56.347826086957%"><iframe allowfullscreen="" scrolling="no" src="//cache.vevo.com/m/html/embed.html?video='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===101)$this->out.='<div data-s9e-mediaembed="viagame" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:61.25%"><iframe allowfullscreen="" scrolling="no" src="//www.viagame.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===102)$this->out.='<div data-s9e-mediaembed="videodetective" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.videodetective.com/embed/video/?options=false&amp;autostart=false&amp;playlist=none&amp;publishedid='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="videomega" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//videomega.tv/iframe.php?ref='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===104){$this->out.='<div data-s9e-mediaembed="vidme" style="display:inline-block;width:100%;max-width:'.\htmlspecialchars($node->getAttribute('width'),2).'px"><div style="overflow:hidden;position:relative;';if($node->getAttribute('width')>0)$this->out.='padding-bottom:'.\htmlspecialchars(100*$node->getAttribute('height')/$node->getAttribute('width'),2).'%';$this->out.='"><iframe allowfullscreen="" scrolling="no" src="https://vid.me/e/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';}elseif($tb===105)$this->out.='<div data-s9e-mediaembed="vimeo" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//player.vimeo.com/video/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="vine" style="display:inline-block;width:100%;max-width:480px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" src="https://vine.co/v/'.\htmlspecialchars($node->getAttribute('id'),2).'/embed/simple?audio=1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb<115)if($tb<111)if($tb===107)$this->out.='<div data-s9e-mediaembed="vk" style="display:inline-block;width:100%;max-width:607px"><div style="overflow:hidden;position:relative;padding-bottom:59.308072487644%"><iframe allowfullscreen="" scrolling="no" src="//vk.com/video_ext.php?oid='.\htmlspecialchars($node->getAttribute('oid'),2).'&amp;id='.\htmlspecialchars($node->getAttribute('vid'),2).'&amp;hash='.\htmlspecialchars($node->getAttribute('hash'),2).'&amp;hd=1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===108)$this->out.='<div data-s9e-mediaembed="vocaroo" style="display:inline-block;width:100%;max-width:148px"><div style="overflow:hidden;position:relative;padding-bottom:29.72972972973%"><object data="//vocaroo.com/player.swf?playMediaID='.\htmlspecialchars($node->getAttribute('id'),2).'&amp;autoplay=0" style="height:100%;left:0;position:absolute;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"></object></div></div>';elseif($tb===109)$this->out.='<div data-s9e-mediaembed="vox" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//player.ooyala.com/iframe.html#pbid=a637d53c5c0a43c7bf4e342886b9d8b0&amp;ec='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="washingtonpost" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.washingtonpost.com/video/c/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===111)$this->out.='<div data-s9e-mediaembed="wshh" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.worldstarhiphop.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===112)$this->out.='<div data-s9e-mediaembed="wsj" style="display:inline-block;width:100%;max-width:512px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//video-api.wsj.com/api-video/player/iframe.html?guid='.\htmlspecialchars($node->getAttribute('id'),2).'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===113)$this->out.='<div data-s9e-mediaembed="xboxclips" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//xboxclips.com/'.\htmlspecialchars($node->getAttribute('user'),2).'/'.\htmlspecialchars($node->getAttribute('id'),2).'/embed" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$this->out.='<div data-s9e-mediaembed="xboxdvr" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//xboxdvr.com/gamer/'.\htmlspecialchars($node->getAttribute('user'),2).'/video/'.\htmlspecialchars($node->getAttribute('id'),2).'/embed" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb<119)if($tb===115)$this->out.='<div data-s9e-mediaembed="yahooscreen" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="https://screen.yahoo.com/'.\htmlspecialchars($node->getAttribute('id'),2).'.html?format=embed" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';elseif($tb===116)$this->out.='<div data-s9e-mediaembed="youku" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:62.5%;padding-bottom:calc(56.25% + 40px)"><object data="https://players.youku.com/player.php/sid/'.\htmlspecialchars($node->getAttribute('id'),2).'/v.swf" style="height:100%;left:0;position:absolute;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"></object></div></div>';elseif($tb===117){$this->out.='<div data-s9e-mediaembed="youtube" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="background:url(https://i.ytimg.com/vi/'.\htmlspecialchars($node->getAttribute('id'),2).'/hqdefault.jpg) 50% 50% / cover;border:0;height:100%;left:0;position:absolute;width:100%" src="https://www.youtube.com/embed/'.\htmlspecialchars($node->getAttribute('id'),2);if($node->hasAttribute('list'))$this->out.='?list='.\htmlspecialchars($node->getAttribute('list'),2);if($node->hasAttribute('t')||$node->hasAttribute('m')){if($node->hasAttribute('list'))$this->out.='&amp;';else$this->out.='?';$this->out.='start=';if($node->hasAttribute('t'))$this->out.=\htmlspecialchars($node->getAttribute('t'),2);elseif($node->hasAttribute('h'))$this->out.=\htmlspecialchars($node->getAttribute('h')*3600+$node->getAttribute('m')*60+$node->getAttribute('s'),2);else$this->out.=\htmlspecialchars($node->getAttribute('m')*60+$node->getAttribute('s'),2);}$this->out.='"></iframe></div></div>';}else$this->out.='<object data-s9e-mediaembed="zippyshare" data="//api.zippyshare.com/api/player.swf" style="height:80px;max-width:900px;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"><param name="flashvars" value="file='.\htmlspecialchars($node->getAttribute('file'),2).'&amp;server='.\htmlspecialchars($node->getAttribute('server'),2).'&amp;autostart=false"></object>';elseif($tb===119)$this->out.='<br>';elseif($tb===120);else{$this->out.='<p>';$this->at($node);$this->out.='</p>';}
+				}
+	}
+	private static $dynamic=array('ABCNEWS'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="abcnews" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//abcnews.go.com/video/embed?id=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'AUDIOBOOM'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<iframe data-s9e-mediaembed="audioboom" allowfullscreen="" scrolling="no" src="//audioboom.com/boos/$1/embed/v3" style="border:0;height:150px;max-width:700px;width:100%"></iframe>'),'BLAB'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="blab" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" src="https://blab.im/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'BLEACHERREPORT'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="bleacherreport" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//bleacherreport.com/video_embed?id=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'BREAK'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="break" style="display:inline-block;width:100%;max-width:464px"><div style="overflow:hidden;position:relative;padding-bottom:60.344827586207%"><iframe allowfullscreen="" scrolling="no" src="//break.com/embed/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'BRIGHTCOVE'=>array('(^[^ ]+(?> (?!bc(?>key|pid|tid)=)[^=]+="[^"]*")*(?> bckey="([^"]*)")?(?> (?!bc[pt]id=)[^=]+="[^"]*")*(?> bcpid="([^"]*)")?(?> (?!bctid=)[^=]+="[^"]*")*(?> bctid="([^"]*)")?.*)s','<div data-s9e-mediaembed="brightcove" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="https://link.brightcove.com/services/player/bcpid$2?bckey=$1&amp;bctid=$3&amp;secureConnections=true&amp;secureHTMLConnections=true&amp;autoStart=false&amp;height=100%25&amp;width=100%25" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'CNBC'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="cnbc" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:95%"><object data="//plus.cnbc.com/rssvideosearch/action/player/id/$1/code/cnbcplayershare" style="height:100%;left:0;position:absolute;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"></object></div></div>'),'CNN'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="cnn" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//edition.cnn.com/video/api/embed.html#/video/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'CNNMONEY'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="cnnmoney" style="display:inline-block;width:100%;max-width:560px"><div style="overflow:hidden;position:relative;padding-bottom:64.285714285714%"><iframe allowfullscreen="" scrolling="no" src="//money.cnn.com/.element/ssi/video/7.0/players/embed.player.html?videoid=video/$1&amp;width=560&amp;height=360" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'COLLEGEHUMOR'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="collegehumor" style="display:inline-block;width:100%;max-width:600px"><div style="overflow:hidden;position:relative;padding-bottom:61.5%"><iframe allowfullscreen="" scrolling="no" src="//www.collegehumor.com/e/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'COMEDYCENTRAL'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="comedycentral" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//media.mtvnservices.com/embed/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'COUB'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="coub" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//coub.com/embed/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'DAILYMOTION'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="dailymotion" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.dailymotion.com/embed/video/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'EIGHTTRACKS'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="eighttracks" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" src="//8tracks.com/mixes/$1/player_v3_universal" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'ESPN'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="espn" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.espn.com/core/video/iframe?id=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'FLICKR'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="flickr" style="display:inline-block;width:100%;max-width:500px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" src="https://www.flickr.com/photos/_/$1/player/" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'FORATV'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="foratv" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//library.fora.tv/embed?id=$1&amp;type=c" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'FOXNEWS'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="foxnews" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//video.foxnews.com/v/video-embed.html?video_id=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'FUNNYORDIE'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="funnyordie" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.funnyordie.com/embed/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'GAMESPOT'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="gamespot" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:62.5%"><iframe allowfullscreen="" scrolling="no" src="//www.gamespot.com/videos/embed/$1/" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'GIST'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<iframe data-s9e-mediaembed="gist" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="" src="https://s9e.github.io/iframe/gist.min.html#$1" style="border:0;height:180px;width:100%"></iframe>'),'GLOBALNEWS'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="globalnews" style="display:inline-block;width:100%;max-width:560px"><div style="overflow:hidden;position:relative;padding-bottom:67.321428571429%"><iframe allowfullscreen="" scrolling="no" src="//globalnews.ca/video/embed/$1/" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'GOFUNDME'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="gofundme" style="display:inline-block;width:100%;max-width:258px"><div style="overflow:hidden;position:relative;padding-bottom:131.00775193798%"><object data="//funds.gofundme.com/Widgetflex.swf" style="height:100%;left:0;position:absolute;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"><param name="flashvars" value="page=$1"></object></div></div>'),'GOOGLEDRIVE'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="googledrive" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:75%"><iframe allowfullscreen="" scrolling="no" src="//drive.google.com/file/d/$1/preview" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'GOOGLESHEETS'=>array('(^[^ ]+(?> (?!g?id=)[^=]+="[^"]*")*(?> gid="([^"]*)")?(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<iframe data-s9e-mediaembed="googlesheets" allowfullscreen="" scrolling="no" src="https://docs.google.com/spreadsheet/ccc?key=$2&amp;widget=true&amp;headers=false&amp;rm=minimal#gid=$1" style="border:0;height:500px;resize:vertical;width:100%"></iframe>'),'HEALTHGURU'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="healthguru" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.healthguru.com/embed/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'HUDL'=>array('(^[^ ]+(?> (?!(?>athlete|highlight)=)[^=]+="[^"]*")*(?> athlete="([^"]*)")?(?> (?!highlight=)[^=]+="[^"]*")*(?> highlight="([^"]*)")?.*)s','<div data-s9e-mediaembed="hudl" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.hudl.com/embed/athlete/$1/highlights/$2" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'HULU'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="hulu" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="https://secure.hulu.com/embed/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'HUMORTVNL'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="humortvnl" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//humortv.vara.nl/embed.$1.html" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'IGN'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="ign" style="display:inline-block;width:100%;max-width:468px"><div style="overflow:hidden;position:relative;padding-bottom:56.196581196581%"><iframe allowfullscreen="" scrolling="no" src="//widgets.ign.com/video/embed/content.html?url=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'IMDB'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="imdb" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.imdb.com/videoembed/vi$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'INDIEGOGO'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="indiegogo" style="display:inline-block;width:100%;max-width:222px"><div style="overflow:hidden;position:relative;padding-bottom:200.45045045045%"><iframe allowfullscreen="" scrolling="no" src="//www.indiegogo.com/project/$1/embedded" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'INSTAGRAM'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<iframe data-s9e-mediaembed="instagram" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/instagram.min.html#$1" style="border:0;height:640px;max-width:640px;width:100%"></iframe>'),'IZLESENE'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="izlesene" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.izlesene.com/embedplayer/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'JWPLATFORM'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="jwplatform" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//content.jwplatform.com/players/$1.html" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'KHL'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="khl" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//video.khl.ru/iframe/feed/start/$1?type_id=18&amp;width=560&amp;height=315" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'KISSVIDEO'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="kissvideo" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.kissvideo.click/embed.php?vid=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'LIBSYN'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<iframe data-s9e-mediaembed="libsyn" allowfullscreen="" scrolling="no" src="//html5-player.libsyn.com/embed/episode/id/$1/height/45/width/900/theme/standard/direction/no/autoplay/no/autonext/no/thumbnail/no/preload/no/no_addthis/no/" style="border:0;height:45px;max-width:900px;width:100%"></iframe>'),'LIVECAP'=>array('(^[^ ]+(?> (?!(?>channel|id)=)[^=]+="[^"]*")*(?> channel="([^"]*)")?(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="livecap" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="https://www.livecap.tv/s/embed/$1/$2" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'LIVELEAK'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="liveleak" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.liveleak.com/ll_embed?i=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'MAILRU'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="mailru" style="display:inline-block;width:100%;max-width:560px"><div style="overflow:hidden;position:relative;padding-bottom:61.071428571429%"><iframe allowfullscreen="" scrolling="no" src="//videoapi.my.mail.ru/videos/embed/$1.html" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'METACAFE'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="metacafe" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.metacafe.com/embed/$1/" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'MIXCLOUD'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="mixcloud" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" src="//www.mixcloud.com/widget/iframe/?feed=http%3A%2F%2Fwww.mixcloud.com%2F$1%2F&amp;embed_type=widget_standard" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'MLB'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="mlb" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//m.mlb.com/shared/video/embed/embed.html?content_id=$1&amp;width=640&amp;height=360" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'MRCTV'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="mrctv" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="https://www.mrctv.org/embed/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'MSNBC'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="msnbc" style="display:inline-block;width:100%;max-width:635px"><div style="overflow:hidden;position:relative;padding-bottom:69.291338582677%"><iframe allowfullscreen="" scrolling="no" src="//player.theplatform.com/p/2E2eJC/EmbeddedOffSite?guid=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'NATGEOCHANNEL'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="natgeochannel" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//channel.nationalgeographic.com/$1/embed/" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'NATGEOVIDEO'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="natgeovideo" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//player.d.nationalgeographic.com/players/ngsvideo/share/?guid=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'NBCNEWS'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="nbcnews" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.nbcnews.com/widget/video-embed/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'NBCSPORTS'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="nbcsports" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//vplayer.nbcsports.com/p/BxmELC/nbcsports_embed/select/media/$1?parentUrl=" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'NPR'=>array('(^[^ ]+(?> (?![im]=)[^=]+="[^"]*")*(?> i="([^"]*)")?(?> (?!m=)[^=]+="[^"]*")*(?> m="([^"]*)")?.*)s','<iframe data-s9e-mediaembed="npr" allowfullscreen="" scrolling="no" src="//www.npr.org/player/embed/$1/$2" style="border:0;height:228px;max-width:800px;width:100%"></iframe>'),'NYTIMES'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="nytimes" style="display:inline-block;width:100%;max-width:585px"><div style="overflow:hidden;position:relative;padding-bottom:68.376068376068%"><iframe allowfullscreen="" scrolling="no" src="//graphics8.nytimes.com/video/players/offsite/index.html?videoId=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'ODDSHOT'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="oddshot" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//oddshot.tv/shot/$1/embed" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'PASTEBIN'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<iframe data-s9e-mediaembed="pastebin" allowfullscreen="" scrolling="" src="//pastebin.com/embed_iframe.php?i=$1" style="border:0;height:300px;resize:vertical;width:100%"></iframe>'),'PLAYSTV'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="playstv" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//plays.tv/embeds/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'PODBEAN'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<iframe data-s9e-mediaembed="podbean" allowfullscreen="" scrolling="no" src="//www.podbean.com/media/player/audio/postId/$1" style="border:0;height:100px;max-width:900px;width:100%"></iframe>'),'PREZI'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="prezi" style="display:inline-block;width:100%;max-width:550px"><div style="overflow:hidden;position:relative;padding-bottom:72.727272727273%"><iframe allowfullscreen="" scrolling="no" src="//prezi.com/embed/$1/" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'REDDIT'=>array('(^[^ ]+(?> (?!path=)[^=]+="[^"]*")*(?> path="([^"]*)")?.*)s','<iframe data-s9e-mediaembed="reddit" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/reddit.min.html#$1" style="border:0;height:165px;max-width:800px;width:100%"></iframe>'),'RUTUBE'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="rutube" style="display:inline-block;width:100%;max-width:720px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//rutube.ru/play/embed/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'SCRIBD'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<iframe data-s9e-mediaembed="scribd" allowfullscreen="" scrolling="no" src="https://www.scribd.com/embeds/$1/content?view_mode=scroll&amp;show_recommendations=false" style="border:0;height:500px;resize:vertical;width:100%"></iframe>'),'SLIDESHARE'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="slideshare" style="display:inline-block;width:100%;max-width:427px"><div style="overflow:hidden;position:relative;padding-bottom:83.372365339578%"><iframe allowfullscreen="" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'SPORTSNET'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="sportsnet" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="https://images.rogersdigitalmedia.com/video_service.php?videoId=$1&amp;playerKey=AQ~~,AAAAAGWRwLc~,cRCmKE8Utf7OFWP38XQcokFZ80fR-u_y&amp;autoStart=false&amp;width=100%25&amp;height=100%25" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'STEAMSTORE'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<iframe data-s9e-mediaembed="steamstore" allowfullscreen="" scrolling="no" src="//store.steampowered.com/widget/$1" style="border:0;height:190px;max-width:900px;width:100%"></iframe>'),'STITCHER'=>array('(^[^ ]+(?> (?![ef]id=)[^=]+="[^"]*")*(?> eid="([^"]*)")?(?> (?!fid=)[^=]+="[^"]*")*(?> fid="([^"]*)")?.*)s','<iframe data-s9e-mediaembed="stitcher" allowfullscreen="" scrolling="no" src="//app.stitcher.com/splayer/f/$2/$1" style="border:0;height:150px;max-width:900px;width:100%"></iframe>'),'STRAWPOLL'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="strawpoll" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="" src="//www.strawpoll.me/embed_1/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'STREAMABLE'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="streamable" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//streamable.com/e/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'TEAMCOCO'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="teamcoco" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:64.84375%"><iframe allowfullscreen="" scrolling="no" src="//teamcoco.com/embed/v/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'THEATLANTIC'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="theatlantic" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.theatlantic.com/video/iframe/$1/" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'THEGUARDIAN'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="theguardian" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//embed.theguardian.com/embed/video/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'THEONION'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="theonion" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.theonion.com/video_embed/?id=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'TINYPIC'=>array('(^[^ ]+(?> (?!(?>s|id)=)[^=]+="[^"]*")*(?> id="([^"]*)")?(?> (?!s=)[^=]+="[^"]*")*(?> s="([^"]*)")?.*)s','<div data-s9e-mediaembed="tinypic" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:60.9375%;padding-bottom:calc(56.25% + 30px)"><object data="//tinypic.com/player.swf?file=$1&amp;s=$2" style="height:100%;left:0;position:absolute;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"></object></div></div>'),'TMZ'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="tmz" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.kaltura.com/index.php/kwidget/cache_st/133592691/wid/_591531/partner_id/591531/uiconf_id/9071262/entry_id/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'TRAILERADDICT'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="traileraddict" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//v.traileraddict.com/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'TUMBLR'=>array('(^[^ ]+(?> (?!(?>id|key)=)[^=]+="[^"]*")*(?> id="([^"]*)")?(?> (?!key=)[^=]+="[^"]*")*(?> key="([^"]*)")?.*)s','<iframe data-s9e-mediaembed="tumblr" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/tumblr.min.html#$2/$1" style="border:0;height:180px;max-width:520px;width:100%"></iframe>'),'TWITTER'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<iframe data-s9e-mediaembed="twitter" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/twitter.min.html#$1" style="background:url(https://abs.twimg.com/favicons/favicon.ico) no-repeat 50% 50%;border:0;height:186px;max-width:500px;width:100%"></iframe>'),'VBOX7'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="vbox7" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//vbox7.com/emb/external.php?vid=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'VEOH'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="veoh" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:62.5%;padding-bottom:calc(56.25% + 40px)"><object data="//www.veoh.com/swf/webplayer/WebPlayer.swf?version=AFrontend.5.7.0.1509&amp;permalinkId=v$1&amp;player=videodetailsembedded&amp;videoAutoPlay=0&amp;id=anonymous" style="height:100%;left:0;position:absolute;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"></object></div></div>'),'VEVO'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="vevo" style="display:inline-block;width:100%;max-width:575px"><div style="overflow:hidden;position:relative;padding-bottom:56.347826086957%"><iframe allowfullscreen="" scrolling="no" src="//cache.vevo.com/m/html/embed.html?video=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'VIAGAME'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="viagame" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:61.25%"><iframe allowfullscreen="" scrolling="no" src="//www.viagame.com/embed/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'VIDEODETECTIVE'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="videodetective" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.videodetective.com/embed/video/?options=false&amp;autostart=false&amp;playlist=none&amp;publishedid=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'VIDEOMEGA'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="videomega" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//videomega.tv/iframe.php?ref=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'VIMEO'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="vimeo" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//player.vimeo.com/video/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'VINE'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="vine" style="display:inline-block;width:100%;max-width:480px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" src="https://vine.co/v/$1/embed/simple?audio=1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'VK'=>array('(^[^ ]+(?> (?!(?>hash|oid|vid)=)[^=]+="[^"]*")*(?> hash="([^"]*)")?(?> (?![ov]id=)[^=]+="[^"]*")*(?> oid="([^"]*)")?(?> (?!vid=)[^=]+="[^"]*")*(?> vid="([^"]*)")?.*)s','<div data-s9e-mediaembed="vk" style="display:inline-block;width:100%;max-width:607px"><div style="overflow:hidden;position:relative;padding-bottom:59.308072487644%"><iframe allowfullscreen="" scrolling="no" src="//vk.com/video_ext.php?oid=$2&amp;id=$3&amp;hash=$1&amp;hd=1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'VOCAROO'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="vocaroo" style="display:inline-block;width:100%;max-width:148px"><div style="overflow:hidden;position:relative;padding-bottom:29.72972972973%"><object data="//vocaroo.com/player.swf?playMediaID=$1&amp;autoplay=0" style="height:100%;left:0;position:absolute;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"></object></div></div>'),'VOX'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="vox" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//player.ooyala.com/iframe.html#pbid=a637d53c5c0a43c7bf4e342886b9d8b0&amp;ec=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'WASHINGTONPOST'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="washingtonpost" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.washingtonpost.com/video/c/embed/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'WSHH'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="wshh" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.worldstarhiphop.com/embed/$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'WSJ'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="wsj" style="display:inline-block;width:100%;max-width:512px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//video-api.wsj.com/api-video/player/iframe.html?guid=$1" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'XBOXCLIPS'=>array('(^[^ ]+(?> (?!(?>id|user)=)[^=]+="[^"]*")*(?> id="([^"]*)")?(?> (?!user=)[^=]+="[^"]*")*(?> user="([^"]*)")?.*)s','<div data-s9e-mediaembed="xboxclips" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//xboxclips.com/$2/$1/embed" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'XBOXDVR'=>array('(^[^ ]+(?> (?!(?>id|user)=)[^=]+="[^"]*")*(?> id="([^"]*)")?(?> (?!user=)[^=]+="[^"]*")*(?> user="([^"]*)")?.*)s','<div data-s9e-mediaembed="xboxdvr" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//xboxdvr.com/gamer/$2/video/$1/embed" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'YAHOOSCREEN'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="yahooscreen" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="https://screen.yahoo.com/$1.html?format=embed" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>'),'YOUKU'=>array('(^[^ ]+(?> (?!id=)[^=]+="[^"]*")*(?> id="([^"]*)")?.*)s','<div data-s9e-mediaembed="youku" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:62.5%;padding-bottom:calc(56.25% + 40px)"><object data="https://players.youku.com/player.php/sid/$1/v.swf" style="height:100%;left:0;position:absolute;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"></object></div></div>'),'ZIPPYSHARE'=>array('(^[^ ]+(?> (?!(?>file|server)=)[^=]+="[^"]*")*(?> file="([^"]*)")?(?> (?!server=)[^=]+="[^"]*")*(?> server="([^"]*)")?.*)s','<object data-s9e-mediaembed="zippyshare" data="//api.zippyshare.com/api/player.swf" style="height:80px;max-width:900px;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"><param name="flashvars" value="file=$1&amp;server=$2&amp;autostart=false"></object>'));
+	private static $attributes;
+	private static $quickBranches=array('AMAZON'=>0,'AUDIOMACK'=>1,'BANDCAMP'=>2,'BBCNEWS'=>3,'CBSNEWS'=>4,'DEMOCRACYNOW'=>5,'DUMPERT'=>6,'FACEBOOK'=>7,'GAMETRAILERS'=>8,'GETTY'=>9,'GFYCAT'=>10,'GOOGLEPLUS'=>11,'IMGUR'=>12,'INTERNETARCHIVE'=>13,'KICKSTARTER'=>14,'LIVESTREAM'=>15,'MEDIUM'=>16,'NHL'=>17,'SOUNDCLOUD'=>18,'SPOTIFY'=>19,'TED'=>20,'TWITCH'=>21,'USTREAM'=>22,'VIDME'=>23,'YOUTUBE'=>24);
+	protected function renderQuick($xml)
+	{
+		$xml = $this->decodeSMP($xml);
+		self::$attributes = array();
+		$html = \preg_replace_callback(
+			'(<(?:(?!/)((?:A(?>BCNEWS|MAZON|UDIO(?>BOOM|MACK))|B(?>ANDCAMP|BCNEWS|L(?>AB|EACHERREPORT)|R(?>EAK|IGHTCOVE))|C(?:BSNEWS|N(?:BC|N(?>MONEY)?)|O(?>LLEGEHUMOR|MEDYCENTRAL|UB))|D(?>AILYMOTION|EMOCRACYNOW|UMPERT)|E(?>IGHTTRACKS|SPN)|F(?>ACEBOOK|LICKR|O(?>RATV|XNEWS)|UNNYORDIE)|G(?>AME(?>SPOT|TRAILERS)|ETTY|FYCAT|IST|LOBALNEWS|O(?>FUNDME|OGLE(?>DRIVE|PLUS|SHEETS)))|H(?>EALTHGURU|U(?>DL|LU|MORTVNL))|I(?>GN|M(?>DB|GUR)|N(?>DIEGOGO|STAGRAM|TERNETARCHIVE)|ZLESENE)|JWPLATFORM|K(?>HL|I(?>CKSTARTER|SSVIDEO))|LI(?>BSYN|VE(?>CAP|LEAK|STREAM))|M(?>AILRU|E(?>DIUM|TACAFE)|IXCLOUD|LB|RCTV|SNBC)|N(?>ATGEO(?>CHANNEL|VIDEO)|BC(?>NEW|SPORT)S|HL|PR|YTIMES)|ODDSHOT|P(?>ASTEBIN|LAYSTV|ODBEAN|REZI)|R(?>EDDIT|UTUBE)|S(?>CRIBD|LIDESHARE|OUNDCLOUD|PO(?>RTSNET|TIFY)|T(?>EAMSTORE|ITCHER|R(?>AWPOLL|EAMABLE)))|T(?>E(?>D|AMCOCO)|HE(?>ATLANTIC|GUARDIAN|ONION)|INYPIC|MZ|RAILERADDICT|UMBLR|WIT(?>CH|TER))|USTREAM|V(?>K|BOX7|E(?>OH|VO)|I(?>AGAME|D(?>EO(?>DETECTIVE|MEGA)|ME)|MEO|NE)|O(?>X|CAROO))|W(?>ASHINGTONPOST|S(?>J|HH))|XBOX(?>CLIPS|DVR)|Y(?>AHOOSCREEN|OU(?>KU|TUBE))|ZIPPYSHARE))(?: [^>]*)?>.*?</\\1|(/?(?!br/|p>)[^ />]+)[^>]*?(/)?)>)s',
+			array($this, 'quick'),
+			\preg_replace(
+				'(<[eis]>[^<]*</[eis]>)',
+				'',
+				\substr($xml, 1 + \strpos($xml, '>'), -4)
+			)
+		);
+		return \str_replace('<br/>', '<br>', $html);
+	}
+	protected function quick($m)
+	{
+		if (isset($m[2]))
+		{
+			$id = $m[2];
+			if (isset($m[3]))
+			{
+				unset($m[3]);
+				$m[0] = \substr($m[0], 0, -2) . '>';
+				$html = $this->quick($m);
+				$m[0] = '</' . $id . '>';
+				$m[2] = '/' . $id;
+				$html .= $this->quick($m);
+				return $html;
+			}
+		}
+		else
+		{
+			$id = $m[1];
+			$lpos = 1 + \strpos($m[0], '>');
+			$rpos = \strrpos($m[0], '<');
+			$textContent = \substr($m[0], $lpos, $rpos - $lpos);
+			if (\strpos($textContent, '<') !== \false)
+				throw new \RuntimeException;
+			$textContent = \htmlspecialchars_decode($textContent);
+		}
+		if (isset(self::$dynamic[$id]))
+		{
+			list($match, $replace) = self::$dynamic[$id];
+			return \preg_replace($match, $replace, $m[0], 1);
+		}
+		if (!isset(self::$quickBranches[$id]))
+		{
+			if ($id[0] === '!' || $id[0] === '?')
+				throw new \RuntimeException;
+			return '';
+		}
+		$attributes = array();
+		if (\strpos($m[0], '="') !== \false)
+		{
+			\preg_match_all('(([^ =]++)="([^"]*))S', \substr($m[0], 0, \strpos($m[0], '>')), $matches);
+			foreach ($matches[1] as $i => $attrName)
+				$attributes[$attrName] = $matches[2][$i];
+		}
+		$qb = self::$quickBranches[$id];
+		if($qb<13){if($qb<7)if($qb<4)if($qb===0){$attributes+=array('tld'=>\null,'id'=>\null);$html='<div data-s9e-mediaembed="amazon" style="display:inline-block;width:100%;max-width:120px"><div style="overflow:hidden;position:relative;padding-bottom:200%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="//';if($attributes['tld']==='es'||$attributes['tld']==='it'){$html.='rcm-eu.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;p=8&amp;l=as1&amp;f=ifr&amp;asins='.$attributes['id'].'&amp;o=';if($attributes['tld']==='es')$html.='30';else$html.='29';$html.='&amp;t=';if($attributes['tld']==='es'&&!empty($this->params['AMAZON_ASSOCIATE_TAG_ES']))$html.=\htmlspecialchars($this->params['AMAZON_ASSOCIATE_TAG_ES'],2);elseif($attributes['tld']==='it'&&!empty($this->params['AMAZON_ASSOCIATE_TAG_IT']))$html.=\htmlspecialchars($this->params['AMAZON_ASSOCIATE_TAG_IT'],2);else$html.='_';}else{$html.='ws-';if($attributes['tld']==='jp')$html.='fe';elseif(isset($attributes['tld'])&&(\strpos('desfrituk',$attributes['tld'])!==\false))$html.='eu';else$html.='na';$html.='.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&amp;OneJS=1&amp;Operation=GetAdHtml&amp;MarketPlace=';if(isset($attributes['tld']))$html.=\htmlspecialchars(\strtr(\htmlspecialchars_decode($attributes['tld']),'acdefijkprstu','ACDEFIJBPRSTG'),2);else$html.='US';$html.='&amp;ad_type=product_link&amp;tracking_id=';if($attributes['tld']==='ca'&&!empty($this->params['AMAZON_ASSOCIATE_TAG_CA']))$html.=\htmlspecialchars($this->params['AMAZON_ASSOCIATE_TAG_CA'],2);elseif($attributes['tld']==='de'&&!empty($this->params['AMAZON_ASSOCIATE_TAG_DE']))$html.=\htmlspecialchars($this->params['AMAZON_ASSOCIATE_TAG_DE'],2);elseif($attributes['tld']==='fr'&&!empty($this->params['AMAZON_ASSOCIATE_TAG_FR']))$html.=\htmlspecialchars($this->params['AMAZON_ASSOCIATE_TAG_FR'],2);elseif($attributes['tld']==='jp'&&!empty($this->params['AMAZON_ASSOCIATE_TAG_JP']))$html.=\htmlspecialchars($this->params['AMAZON_ASSOCIATE_TAG_JP'],2);elseif($attributes['tld']==='uk'&&!empty($this->params['AMAZON_ASSOCIATE_TAG_UK']))$html.=\htmlspecialchars($this->params['AMAZON_ASSOCIATE_TAG_UK'],2);elseif(!empty($this->params['AMAZON_ASSOCIATE_TAG']))$html.=\htmlspecialchars($this->params['AMAZON_ASSOCIATE_TAG'],2);else$html.='_';$html.='&amp;marketplace=amazon&amp;region=';if(isset($attributes['tld']))$html.=\htmlspecialchars(\strtr(\htmlspecialchars_decode($attributes['tld']),'acdefijkprstu','ACDEFIJBPRSTG'),2);else$html.='US';$html.='&amp;asins='.$attributes['id'].'&amp;show_border=true&amp;link_opens_in_new_window=true';}$html.='"></iframe></div></div>';}elseif($qb===1){$attributes+=array('mode'=>\null,'id'=>\null);$html='';if($attributes['mode']==='album')$html.='<iframe data-s9e-mediaembed="audiomack" allowfullscreen="" scrolling="no" src="//www.audiomack.com/embed4-album/'.$attributes['id'].'" style="border:0;height:340px;max-width:900px;width:100%"></iframe>';else$html.='<iframe data-s9e-mediaembed="audiomack" allowfullscreen="" scrolling="no" src="//www.audiomack.com/embed4/'.$attributes['id'].'" style="border:0;height:110px;max-width:900px;width:100%"></iframe>';}elseif($qb===2){$attributes+=array('track_num'=>\null,'track_id'=>\null);$html='<div data-s9e-mediaembed="bandcamp" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:100%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="//bandcamp.com/EmbeddedPlayer/size=large/minimal=true/';if(isset($attributes['album_id'])){$html.='album='.$attributes['album_id'];if(isset($attributes['track_num']))$html.='/t='.$attributes['track_num'];}else$html.='track='.$attributes['track_id'];$html.='"></iframe></div></div>';}else{$attributes+=array('playlist'=>\null,'id'=>\null);$html='<div data-s9e-mediaembed="bbcnews" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="//www.bbc.com';if((\strpos($attributes['playlist'],'/news/')===0)&&(\strpos($attributes['playlist'],'A')!==\false))$html.=\htmlspecialchars(\strstr(\htmlspecialchars_decode($attributes['playlist']),'A',\true),2);else$html.='/news/'.$attributes['id'];$html.='/embed"></iframe></div></div>';}elseif($qb===4){$attributes+=array('id'=>\null);$html='<div data-s9e-mediaembed="cbsnews" style="display:inline-block;width:100%;max-width:640px">';if(isset($attributes['pid']))$html.='<div style="overflow:hidden;position:relative;padding-bottom:62.1875%;padding-bottom:calc(56.25% + 38px)"><object data="//www.cbsnews.com/common/video/cbsnews_player.swf" style="height:100%;left:0;position:absolute;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"><param name="flashvars" value="pType=embed&amp;si=254&amp;pid='.$attributes['pid'];else$html.='<div style="overflow:hidden;position:relative;padding-bottom:62.5%;padding-bottom:calc(56.25% + 40px)"><object data="//i.i.cbsi.com/cnwk.1d/av/video/cbsnews/atlantis2/cbsnews_player_embed.swf" style="height:100%;left:0;position:absolute;width:100%" type="application/x-shockwave-flash" typemustmatch=""><param name="allowfullscreen" value="true"><param name="flashvars" value="si=254&amp;contentValue='.$attributes['id'];$html.='"></object></div>';$html.='</div>';}elseif($qb===5){$attributes+=array('id'=>\null);$html='<div data-s9e-mediaembed="democracynow" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="//www.democracynow.org/embed/';if((\strpos($attributes['id'],'/headlines')!==\false))$html.='headlines/'.\htmlspecialchars(\strstr(\htmlspecialchars_decode($attributes['id']),'/headlines',\true),2);elseif((\strpos($attributes['id'],'2')===0))$html.='story/'.$attributes['id'];elseif((\strpos($attributes['id'],'shows/')===0))$html.='show/'.\htmlspecialchars(\substr(\strstr(\htmlspecialchars_decode($attributes['id']),'/'),1),2);else$html.=$attributes['id'];$html.='"></iframe></div></div>';}else{$attributes+=array('id'=>\null);$html='<div data-s9e-mediaembed="dumpert" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" src="//www.dumpert.nl/embed/'.\strtr($attributes['id'],'_','/').'/" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';}elseif($qb<10)if($qb===7){$attributes+=array('type'=>\null,'id'=>\null);$html='<iframe data-s9e-mediaembed="facebook" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" src="https://s9e.github.io/iframe/facebook.min.html#'.\htmlspecialchars(\htmlspecialchars_decode($attributes['type']).\htmlspecialchars_decode($attributes['id']),2).'" style="border:0;height:360px;max-width:640px;width:100%"></iframe>';}elseif($qb===8){$attributes+=array('id'=>\null);$html='<div data-s9e-mediaembed="gametrailers" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="';if((\strpos($attributes['id'],'mgid:')===0))$html.='//media.mtvnservices.com/embed/'.$attributes['id'];else$html.='//embed.gametrailers.com/embed/'.$attributes['id'].'?embed=1&amp;suppressBumper=1';$html.='"></iframe></div></div>';}else{$attributes+=array('width'=>\null,'height'=>\null,'id'=>\null,'et'=>\null,'sig'=>\null);$html='<div data-s9e-mediaembed="getty" style="display:inline-block;width:100%;max-width:'.$attributes['width'].'px"><div style="overflow:hidden;position:relative;';if(\htmlspecialchars_decode($attributes['width'])>0)$html.='padding-bottom:'.\htmlspecialchars(100*($attributes['height']+49)/\htmlspecialchars_decode($attributes['width']),2).'%;padding-bottom:calc('.\htmlspecialchars(100*$attributes['height']/\htmlspecialchars_decode($attributes['width']),2).'% + 49px)';$html.='"><iframe allowfullscreen="" scrolling="no" src="//embed.gettyimages.com/embed/'.$attributes['id'].'?et='.$attributes['et'].'&amp;sig='.$attributes['sig'].'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';}elseif($qb===10){$attributes+=array('width'=>\null,'height'=>\null,'id'=>\null);$html='<div data-s9e-mediaembed="gfycat" style="display:inline-block;width:100%;max-width:'.$attributes['width'].'px"><div style="overflow:hidden;position:relative;';if(\htmlspecialchars_decode($attributes['width'])>0)$html.='padding-bottom:'.\htmlspecialchars(100*$attributes['height']/\htmlspecialchars_decode($attributes['width']),2).'%';$html.='"><iframe allowfullscreen="" scrolling="no" src="//gfycat.com/iframe/'.$attributes['id'].'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';}elseif($qb===11){$attributes+=array('name'=>\null,'pid'=>\null);$html='<iframe data-s9e-mediaembed="googleplus" allowfullscreen="" onload="var a=Math.random();window.addEventListener(\'message\',function(b){if(b.data.id==a)style.height=b.data.height+\'px\'});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')" scrolling="no" style="border:0;height:240px;max-width:450px;width:100%" src="https://s9e.github.io/iframe/googleplus.min.html#';if(isset($attributes['oid']))$html.=$attributes['oid'];else$html.='+'.$attributes['name'];$html.='/posts/'.$attributes['pid'].'"></iframe>';}else{$attributes+=array('type'=>\null,'id'=>\null);$html='<iframe data-s9e-mediaembed="imgur" allowfullscreen="" onload="var b=Math.random();window.addEventListener(\'message\',function(a){a.data.id==b&amp;&amp;(style.height=a.data.height+\'px\',style.width=a.data.width+\'px\')});contentWindow.postMessage(\'s9e:\'+b,\'https://s9e.github.io\')" scrolling="no" style="border:0;height:450px;width:568px" src="https://s9e.github.io/iframe/imgur.min.html#';if($attributes['type']==='album'&&!((\strpos($attributes['id'],'a/')===0)))$html.='a/';$html.=$attributes['id'].'"></iframe>';}}elseif($qb<19)if($qb<16)if($qb===13){$attributes+=array('width'=>\null,'height'=>\null,'id'=>\null);$html='<div data-s9e-mediaembed="internetarchive" style="display:inline-block;width:100%;max-width:'.$attributes['width'].'px"><div style="overflow:hidden;position:relative;';if(\htmlspecialchars_decode($attributes['width'])>0)$html.='padding-bottom:'.\htmlspecialchars(100*$attributes['height']/\htmlspecialchars_decode($attributes['width']),2).'%';$html.='"><iframe allowfullscreen="" scrolling="no" src="https://archive.org/embed/'.$attributes['id'].'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';}elseif($qb===14){$attributes+=array('id'=>\null);$html='';if(isset($attributes['video']))$html.='<div data-s9e-mediaembed="kickstarter" style="display:inline-block;width:100%;max-width:480px"><div style="overflow:hidden;position:relative;padding-bottom:75%"><iframe allowfullscreen="" scrolling="no" src="//www.kickstarter.com/projects/'.$attributes['id'].'/widget/video.html" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';else$html.='<div data-s9e-mediaembed="kickstarter" style="display:inline-block;width:100%;max-width:220px"><div style="overflow:hidden;position:relative;padding-bottom:190.90909090909%"><iframe allowfullscreen="" scrolling="no" src="//www.kickstarter.com/projects/'.$attributes['id'].'/widget/card.html" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';}else{$attributes+=array('channel'=>\null,'account_id'=>\null,'event_id'=>\null);$html='<div data-s9e-mediaembed="livestream" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="';if(isset($attributes['clip_id']))$html.='//cdn.livestream.com/embed/'.$attributes['channel'].'?layout=4&amp;autoplay=false&amp;clip='.$attributes['clip_id'];else{$html.='//livestream.com/accounts/'.$attributes['account_id'].'/events/'.$attributes['event_id'];if(isset($attributes['video_id']))$html.='/videos/'.$attributes['video_id'];$html.='/player?autoPlay=false';}$html.='"></iframe></div></div>';}elseif($qb===16){$attributes+=array('id'=>\null);$html='<iframe data-s9e-mediaembed="medium" allowfullscreen="" onload="window.addEventListener(\'message\',function(a){a=a.data.split(\'::\');\'m\'===a[0]&amp;&amp;0&lt;src.indexOf(a[1])&amp;&amp;a[2]&amp;&amp;(style.height=a[2]+\'px\')})" scrolling="no" src="https://api.medium.com/embed?type=story&amp;path=%2F%2F'.$attributes['id'].'&amp;id='.\htmlspecialchars(\strtr(\htmlspecialchars_decode($attributes['id']),'abcdef','111111'),2).'" style="border:1px solid;border-color:#eee #ddd #bbb;border-radius:5px;box-shadow:rgba(0,0,0,.15) 0 1px 3px;height:400px;max-width:400px;width:100%"></iframe>';}elseif($qb===17){$attributes+=array('t'=>\null,'id'=>\null);$html='<div data-s9e-mediaembed="nhl" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="';if(isset($attributes['c'])||isset($attributes['t'])){$html.='//www.nhl.com/video/embed';if(isset($attributes['t']))$html.='/t-'.$attributes['t'];if(isset($attributes['c']))$html.='/c-'.$attributes['c'];$html.='?autostart=false';}else$html.='//video.nhl.com/videocenter/embed?playlist='.$attributes['id'];$html.='"></iframe></div></div>';}else{$attributes+=array('secret_token'=>\null,'id'=>\null);$html='<iframe data-s9e-mediaembed="soundcloud" allowfullscreen="" scrolling="no" src="https://w.soundcloud.com/player/?url=';if(isset($attributes['playlist_id']))$html.='https%3A//api.soundcloud.com/playlists/'.$attributes['playlist_id'];elseif(isset($attributes['track_id']))$html.='https%3A//api.soundcloud.com/tracks/'.$attributes['track_id'].'&amp;secret_token='.$attributes['secret_token'];else{if((\strpos($attributes['id'],'://')===\false))$html.='https%3A//soundcloud.com/';$html.=$attributes['id'];}$html.='" style="border:0;height:';if(isset($attributes['playlist_id'])||(\strpos($attributes['id'],'/sets/')!==\false))$html.='450';else$html.='166';$html.='px;max-width:900px;width:100%"></iframe>';}elseif($qb<22)if($qb===19){$attributes+=array('path'=>\null);$html='<div data-s9e-mediaembed="spotify" style="display:inline-block;width:100%;max-width:400px"><div style="overflow:hidden;position:relative;padding-bottom:120%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="https://embed.spotify.com/?view=coverart&amp;uri=';if(isset($attributes['uri']))$html.=$attributes['uri'];else$html.='spotify:'.\strtr($attributes['path'],'/',':');$html.='"></iframe></div></div>';}elseif($qb===20){$attributes+=array('id'=>\null);$html='<div data-s9e-mediaembed="ted" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="//embed.ted.com/'.$attributes['id'];if((\strpos($attributes['id'],'.html')===\false))$html.='.html';$html.='"></iframe></div></div>';}else{$attributes+=array('channel'=>\null);$html='<div data-s9e-mediaembed="twitch" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="border:0;height:100%;left:0;position:absolute;width:100%" src="';if(isset($attributes['clip_id']))$html.='//clips.twitch.tv/embed?autoplay=false&amp;clip='.$attributes['channel'].'/'.$attributes['clip_id'];else{$html.='//player.twitch.tv/?autoplay=false&amp;';if(isset($attributes['archive_id']))$html.='video=a'.$attributes['archive_id'];elseif(isset($attributes['chapter_id']))$html.='video=c'.$attributes['chapter_id'];elseif(isset($attributes['video_id']))$html.='video=v'.$attributes['video_id'];else$html.='channel='.$attributes['channel'];if(isset($attributes['t']))$html.='&amp;time='.$attributes['t'];}$html.='"></iframe></div></div>';}elseif($qb===22){$attributes+=array('cid'=>\null);$html='<div data-s9e-mediaembed="ustream" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%">';if(isset($attributes['vid']))$html.='<iframe allowfullscreen="" scrolling="no" src="//www.ustream.tv/embed/recorded/'.$attributes['vid'];else$html.='<iframe allowfullscreen="" scrolling="no" src="//www.ustream.tv/embed/'.$attributes['cid'];$html.='?html5ui" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe>';$html.='</div></div>';}elseif($qb===23){$attributes+=array('width'=>\null,'height'=>\null,'id'=>\null);$html='<div data-s9e-mediaembed="vidme" style="display:inline-block;width:100%;max-width:'.$attributes['width'].'px"><div style="overflow:hidden;position:relative;';if(\htmlspecialchars_decode($attributes['width'])>0)$html.='padding-bottom:'.\htmlspecialchars(100*$attributes['height']/\htmlspecialchars_decode($attributes['width']),2).'%';$html.='"><iframe allowfullscreen="" scrolling="no" src="https://vid.me/e/'.$attributes['id'].'" style="border:0;height:100%;left:0;position:absolute;width:100%"></iframe></div></div>';}else{$attributes+=array('id'=>\null,'m'=>\null,'s'=>\null);$html='<div data-s9e-mediaembed="youtube" style="display:inline-block;width:100%;max-width:640px"><div style="overflow:hidden;position:relative;padding-bottom:56.25%"><iframe allowfullscreen="" scrolling="no" style="background:url(https://i.ytimg.com/vi/'.$attributes['id'].'/hqdefault.jpg) 50% 50% / cover;border:0;height:100%;left:0;position:absolute;width:100%" src="https://www.youtube.com/embed/'.$attributes['id'];if(isset($attributes['list']))$html.='?list='.$attributes['list'];if(isset($attributes['t'])||isset($attributes['m'])){if(isset($attributes['list']))$html.='&amp;';else$html.='?';$html.='start=';if(isset($attributes['t']))$html.=$attributes['t'];elseif(isset($attributes['h']))$html.=\htmlspecialchars($attributes['h']*3600+$attributes['m']*60+$attributes['s'],2);else$html.=\htmlspecialchars($attributes['m']*60+$attributes['s'],2);}$html.='"></iframe></div></div>';}
+		return $html;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator.php
@@ -0,0 +1,9008 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter;
+use InvalidArgumentException;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\BundleGenerator;
+use s9e\TextFormatter\Configurator\Collections\AttributeFilterCollection;
+use s9e\TextFormatter\Configurator\Collections\PluginCollection;
+use s9e\TextFormatter\Configurator\Collections\Ruleset;
+use s9e\TextFormatter\Configurator\Collections\TagCollection;
+use s9e\TextFormatter\Configurator\ConfigProvider;
+use s9e\TextFormatter\Configurator\Helpers\ConfigHelper;
+use s9e\TextFormatter\Configurator\Helpers\RulesHelper;
+use s9e\TextFormatter\Configurator\JavaScript;
+use s9e\TextFormatter\Configurator\JavaScript\Dictionary;
+use s9e\TextFormatter\Configurator\Rendering;
+use s9e\TextFormatter\Configurator\RulesGenerator;
+use s9e\TextFormatter\Configurator\TemplateChecker;
+use s9e\TextFormatter\Configurator\TemplateNormalizer;
+use s9e\TextFormatter\Configurator\UrlConfig;
+class Configurator implements ConfigProvider
+{
+	public $attributeFilters;
+	public $bundleGenerator;
+	public $javascript;
+	public $plugins;
+	public $registeredVars;
+	public $rendering;
+	public $rootRules;
+	public $rulesGenerator;
+	public $tags;
+	public $templateChecker;
+	public $templateNormalizer;
+	public function __construct()
+	{
+		$this->attributeFilters   = new AttributeFilterCollection;
+		$this->bundleGenerator    = new BundleGenerator($this);
+		$this->plugins            = new PluginCollection($this);
+		$this->registeredVars     = array('urlConfig' => new UrlConfig);
+		$this->rendering          = new Rendering($this);
+		$this->rootRules          = new Ruleset;
+		$this->rulesGenerator     = new RulesGenerator;
+		$this->tags               = new TagCollection;
+		$this->templateChecker    = new TemplateChecker;
+		$this->templateNormalizer = new TemplateNormalizer;
+	}
+	public function __get($k)
+	{
+		if (\preg_match('#^[A-Z][A-Za-z_0-9]+$#D', $k))
+			return (isset($this->plugins[$k]))
+			     ? $this->plugins[$k]
+			     : $this->plugins->load($k);
+		if (isset($this->registeredVars[$k]))
+			return $this->registeredVars[$k];
+		throw new RuntimeException("Undefined property '" . __CLASS__ . '::$' . $k . "'");
+	}
+	public function __isset($k)
+	{
+		if (\preg_match('#^[A-Z][A-Za-z_0-9]+$#D', $k))
+			return isset($this->plugins[$k]);
+		return isset($this->registeredVars[$k]);
+	}
+	public function __set($k, $v)
+	{
+		if (\preg_match('#^[A-Z][A-Za-z_0-9]+$#D', $k))
+			$this->plugins[$k] = $v;
+		else
+			$this->registeredVars[$k] = $v;
+	}
+	public function __unset($k)
+	{
+		if (\preg_match('#^[A-Z][A-Za-z_0-9]+$#D', $k))
+			unset($this->plugins[$k]);
+		else
+			unset($this->registeredVars[$k]);
+	}
+	public function enableJavaScript()
+	{
+		if (!isset($this->javascript))
+			$this->javascript = new JavaScript($this);
+	}
+	public function finalize(array $options = array())
+	{
+		$return = array();
+		$options += array(
+			'addHTML5Rules'  => \true,
+			'optimizeConfig' => \true,
+			'returnJS'       => isset($this->javascript),
+			'returnParser'   => \true,
+			'returnRenderer' => \true
+		);
+		if ($options['addHTML5Rules'])
+			$this->addHTML5Rules($options);
+		if ($options['returnRenderer'])
+		{
+			$renderer = $this->rendering->getRenderer();
+			if (isset($options['finalizeRenderer']))
+				\call_user_func($options['finalizeRenderer'], $renderer);
+			$return['renderer'] = $renderer;
+		}
+		if ($options['returnJS'] || $options['returnParser'])
+		{
+			$config = $this->asConfig();
+			if ($options['returnJS'])
+				$return['js'] = $this->javascript->getParser(ConfigHelper::filterConfig($config, 'JS'));
+			if ($options['returnParser'])
+			{
+				$config = ConfigHelper::filterConfig($config, 'PHP');
+				if ($options['optimizeConfig'])
+					ConfigHelper::optimizeArray($config);
+				$parser = new Parser($config);
+				if (isset($options['finalizeParser']))
+					\call_user_func($options['finalizeParser'], $parser);
+				$return['parser'] = $parser;
+			}
+		}
+		return $return;
+	}
+	public function loadBundle($bundleName)
+	{
+		if (!\preg_match('#^[A-Z][A-Za-z0-9]+$#D', $bundleName))
+			throw new InvalidArgumentException("Invalid bundle name '" . $bundleName . "'");
+		$className = __CLASS__ . '\\Bundles\\' . $bundleName;
+		$bundle = new $className;
+		$bundle->configure($this);
+	}
+	public function saveBundle($className, $filepath, array $options = array())
+	{
+		$file = "<?php\n\n" . $this->bundleGenerator->generate($className, $options);
+		return (\file_put_contents($filepath, $file) !== \false);
+	}
+	public function addHTML5Rules(array $options = array())
+	{
+		$options += array('rootRules' => $this->rootRules);
+		$this->plugins->finalize();
+		foreach ($this->tags as $tag)
+			$this->templateNormalizer->normalizeTag($tag);
+		$rules = $this->rulesGenerator->getRules($this->tags, $options);
+		$this->rootRules->merge($rules['root'], \false);
+		foreach ($rules['tags'] as $tagName => $tagRules)
+			$this->tags[$tagName]->rules->merge($tagRules, \false);
+	}
+	public function asConfig()
+	{
+		$this->plugins->finalize();
+		$properties = \get_object_vars($this);
+		unset($properties['attributeFilters']);
+		unset($properties['bundleGenerator']);
+		unset($properties['javascript']);
+		unset($properties['rendering']);
+		unset($properties['rulesGenerator']);
+		unset($properties['registeredVars']);
+		unset($properties['templateChecker']);
+		unset($properties['templateNormalizer']);
+		unset($properties['stylesheet']);
+		$config    = ConfigHelper::toArray($properties);
+		$bitfields = RulesHelper::getBitfields($this->tags, $this->rootRules);
+		$config['rootContext'] = $bitfields['root'];
+		$config['rootContext']['flags'] = $config['rootRules']['flags'];
+		$config['registeredVars'] = ConfigHelper::toArray($this->registeredVars, \true);
+		$config += array(
+			'plugins' => array(),
+			'tags'    => array()
+		);
+		$config['tags'] = \array_intersect_key($config['tags'], $bitfields['tags']);
+		foreach ($bitfields['tags'] as $tagName => $tagBitfields)
+			$config['tags'][$tagName] += $tagBitfields;
+		unset($config['rootRules']);
+		return $config;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator;
+use s9e\TextFormatter\Configurator;
+use s9e\TextFormatter\Configurator\RendererGenerators\PHP;
+class BundleGenerator
+{
+	protected $configurator;
+	public $serializer = 'serialize';
+	public $unserializer = 'unserialize';
+	public function __construct(Configurator $configurator)
+	{
+		$this->configurator = $configurator;
+	}
+	public function generate($className, array $options = array())
+	{
+		$options += array('autoInclude' => \true);
+		$objects  = $this->configurator->finalize($options);
+		$parser   = $objects['parser'];
+		$renderer = $objects['renderer'];
+		$namespace = '';
+		if (\preg_match('#(.*)\\\\([^\\\\]+)$#', $className, $m))
+		{
+			$namespace = $m[1];
+			$className = $m[2];
+		}
+		$php = array();
+		$php[] = '/**';
+		$php[] = '* @package   s9e\TextFormatter';
+		$php[] = '* @copyright Copyright (c) 2010-2016 The s9e Authors';
+		$php[] = '* @license   http://www.opensource.org/licenses/mit-license.php The MIT License';
+		$php[] = '*/';
+		if ($namespace)
+		{
+			$php[] = 'namespace ' . $namespace . ';';
+			$php[] = '';
+		}
+		$php[] = 'abstract class ' . $className . ' extends \\s9e\\TextFormatter\\Bundle';
+		$php[] = '{';
+		$php[] = '	/**';
+		$php[] = '	* @var s9e\\TextFormatter\\Parser Singleton instance used by parse()';
+		$php[] = '	*/';
+		$php[] = '	protected static $parser;';
+		$php[] = '';
+		$php[] = '	/**';
+		$php[] = '	* @var s9e\\TextFormatter\\Renderer Singleton instance used by render()';
+		$php[] = '	*/';
+		$php[] = '	protected static $renderer;';
+		$php[] = '';
+		$events = array(
+			'beforeParse'
+				=> 'Callback executed before parse(), receives the original text as argument',
+			'afterParse'
+				=> 'Callback executed after parse(), receives the parsed text as argument',
+			'beforeRender'
+				=> 'Callback executed before render(), receives the parsed text as argument',
+			'afterRender'
+				=> 'Callback executed after render(), receives the output as argument',
+			'beforeUnparse'
+				=> 'Callback executed before unparse(), receives the parsed text as argument',
+			'afterUnparse'
+				=> 'Callback executed after unparse(), receives the original text as argument'
+		);
+		foreach ($events as $eventName => $eventDesc)
+			if (isset($options[$eventName]))
+			{
+				$php[] = '	/**';
+				$php[] = '	* @var ' . $eventDesc;
+				$php[] = '	*/';
+				$php[] = '	public static $' . $eventName . ' = ' . \var_export($options[$eventName], \true) . ';';
+				$php[] = '';
+			}
+		$php[] = '	/**';
+		$php[] = '	* Return a new instance of s9e\\TextFormatter\\Parser';
+		$php[] = '	*';
+		$php[] = '	* @return s9e\\TextFormatter\\Parser';
+		$php[] = '	*/';
+		$php[] = '	public static function getParser()';
+		$php[] = '	{';
+		if (isset($options['parserSetup']))
+		{
+			$php[] = '		$parser = ' . $this->exportObject($parser) . ';';
+			$php[] = '		' . $this->exportCallback($namespace, $options['parserSetup'], '$parser') . ';';
+			$php[] = '';
+			$php[] = '		return $parser;';
+		}
+		else
+			$php[] = '		return ' . $this->exportObject($parser) . ';';
+		$php[] = '	}';
+		$php[] = '';
+		$php[] = '	/**';
+		$php[] = '	* Return a new instance of s9e\\TextFormatter\\Renderer';
+		$php[] = '	*';
+		$php[] = '	* @return s9e\\TextFormatter\\Renderer';
+		$php[] = '	*/';
+		$php[] = '	public static function getRenderer()';
+		$php[] = '	{';
+		if (!empty($options['autoInclude'])
+		 && $this->configurator->rendering->engine instanceof PHP
+		 && isset($this->configurator->rendering->engine->lastFilepath))
+		{
+			$className = \get_class($renderer);
+			$filepath  = \realpath($this->configurator->rendering->engine->lastFilepath);
+			$php[] = '		if (!class_exists(' . \var_export($className, \true) . ', false)';
+			$php[] = '		 && file_exists(' . \var_export($filepath, \true) . '))';
+			$php[] = '		{';
+			$php[] = '			include ' . \var_export($filepath, \true) . ';';
+			$php[] = '		}';
+			$php[] = '';
+		}
+		if (isset($options['rendererSetup']))
+		{
+			$php[] = '		$renderer = ' . $this->exportObject($renderer) . ';';
+			$php[] = '		' . $this->exportCallback($namespace, $options['rendererSetup'], '$renderer') . ';';
+			$php[] = '';
+			$php[] = '		return $renderer;';
+		}
+		else
+			$php[] = '		return ' . $this->exportObject($renderer) . ';';
+		$php[] = '	}';
+		$php[] = '}';
+		return \implode("\n", $php);
+	}
+	protected function exportCallback($namespace, $callback, $argument)
+	{
+		if (\is_array($callback) && \is_string($callback[0]))
+			$callback = $callback[0] . '::' . $callback[1];
+		if (!\is_string($callback))
+			return 'call_user_func(' . \var_export($callback, \true) . ', ' . $argument . ')';
+		if ($callback[0] !== '\\')
+			$callback = '\\' . $callback;
+		if (\substr($callback, 0, 2 + \strlen($namespace)) === '\\' . $namespace . '\\')
+			$callback = \substr($callback, 2 + \strlen($namespace));
+		return $callback . '(' . $argument . ')';
+	}
+	protected function exportObject($obj)
+	{
+		$str = \call_user_func($this->serializer, $obj);
+		$str = \var_export($str, \true);
+		return $this->unserializer . '(' . $str . ')';
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator;
+interface ConfigProvider
+{
+	public function asConfig();
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator;
+interface FilterableConfigValue
+{
+	public function filterConfig($target);
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Helpers;
+use DOMAttr;
+use RuntimeException;
+abstract class AVTHelper
+{
+	public static function parse($attrValue)
+	{
+		$tokens  = array();
+		$attrLen = \strlen($attrValue);
+		$pos = 0;
+		while ($pos < $attrLen)
+		{
+			if ($attrValue[$pos] === '{')
+			{
+				if (\substr($attrValue, $pos, 2) === '{{')
+				{
+					$tokens[] = array('literal', '{');
+					$pos += 2;
+					continue;
+				}
+				++$pos;
+				$expr = '';
+				while ($pos < $attrLen)
+				{
+					$spn = \strcspn($attrValue, '\'"}', $pos);
+					if ($spn)
+					{
+						$expr .= \substr($attrValue, $pos, $spn);
+						$pos += $spn;
+					}
+					if ($pos >= $attrLen)
+						throw new RuntimeException('Unterminated XPath expression');
+					$c = $attrValue[$pos];
+					++$pos;
+					if ($c === '}')
+						break;
+					$quotePos = \strpos($attrValue, $c, $pos);
+					if ($quotePos === \false)
+						throw new RuntimeException('Unterminated XPath expression');
+					$expr .= $c . \substr($attrValue, $pos, $quotePos + 1 - $pos);
+					$pos = 1 + $quotePos;
+				}
+				$tokens[] = array('expression', $expr);
+			}
+			$spn = \strcspn($attrValue, '{', $pos);
+			if ($spn)
+			{
+				$str = \substr($attrValue, $pos, $spn);
+				$str = \str_replace('}}', '}', $str);
+				$tokens[] = array('literal', $str);
+				$pos += $spn;
+			}
+		}
+		return $tokens;
+	}
+	public static function replace(DOMAttr $attribute, $callback)
+	{
+		$tokens = self::parse($attribute->value);
+		foreach ($tokens as $k => $token)
+			$tokens[$k] = $callback($token);
+		$attribute->value = \htmlspecialchars(self::serialize($tokens), \ENT_NOQUOTES, 'UTF-8');
+	}
+	public static function serialize(array $tokens)
+	{
+		$attrValue = '';
+		foreach ($tokens as $token)
+			if ($token[0] === 'literal')
+				$attrValue .= \preg_replace('([{}])', '$0$0', $token[1]);
+			elseif ($token[0] === 'expression')
+				$attrValue .= '{' . $token[1] . '}';
+			else
+				throw new RuntimeException('Unknown token type');
+		return $attrValue;
+	}
+	public static function toXSL($attrValue)
+	{
+		$xsl = '';
+		foreach (self::parse($attrValue) as $_f6b3b659)
+		{
+			list($type, $content) = $_f6b3b659;
+			if ($type === 'literal')
+				$xsl .= \htmlspecialchars($content, \ENT_NOQUOTES, 'UTF-8');
+			else
+				$xsl .= '<xsl:value-of select="' . \htmlspecialchars($content, \ENT_COMPAT, 'UTF-8') . '"/>';
+		}
+		return $xsl;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Helpers;
+class CharacterClassBuilder
+{
+	protected $chars;
+	public $delimiter = '/';
+	protected $ranges;
+	public function fromList(array $chars)
+	{
+		$this->chars = $chars;
+		$this->unescapeLiterals();
+		\sort($this->chars);
+		$this->storeRanges();
+		$this->reorderDash();
+		$this->fixCaret();
+		$this->escapeSpecialChars();
+		return $this->buildCharacterClass();
+	}
+	protected function buildCharacterClass()
+	{
+		$str = '[';
+		foreach ($this->ranges as $_b7914274)
+		{
+			list($start, $end) = $_b7914274;
+			if ($end > $start + 2)
+				$str .= $this->chars[$start] . '-' . $this->chars[$end];
+			else
+				$str .= \implode('', \array_slice($this->chars, $start, $end + 1 - $start));
+		}
+		$str .= ']';
+		return $str;
+	}
+	protected function escapeSpecialChars()
+	{
+		$specialChars = array('\\', ']', $this->delimiter);
+		foreach (\array_intersect($this->chars, $specialChars) as $k => $v)
+			$this->chars[$k] = '\\' . $v;
+	}
+	protected function fixCaret()
+	{
+		$k = \array_search('^', $this->chars, \true);
+		if ($this->ranges[0][0] !== $k)
+			return;
+		if (isset($this->ranges[1]))
+		{
+			$range           = $this->ranges[0];
+			$this->ranges[0] = $this->ranges[1];
+			$this->ranges[1] = $range;
+		}
+		else
+			$this->chars[$k] = '\\^';
+	}
+	protected function reorderDash()
+	{
+		$dashIndex = \array_search('-', $this->chars, \true);
+		if ($dashIndex === \false)
+			return;
+		$k = \array_search(array($dashIndex, $dashIndex), $this->ranges, \true);
+		if ($k > 0)
+		{
+			unset($this->ranges[$k]);
+			\array_unshift($this->ranges, array($dashIndex, $dashIndex));
+		}
+		$commaIndex = \array_search(',', $this->chars);
+		$range      = array($commaIndex, $dashIndex);
+		$k          = \array_search($range, $this->ranges, \true);
+		if ($k !== \false)
+		{
+			$this->ranges[$k] = array($commaIndex, $commaIndex);
+			\array_unshift($this->ranges, array($dashIndex, $dashIndex));
+		}
+	}
+	protected function storeRanges()
+	{
+		$values = array();
+		foreach ($this->chars as $char)
+			if (\strlen($char) === 1)
+				$values[] = \ord($char);
+			else
+				$values[] = \false;
+		$i = \count($values) - 1;
+		$ranges = array();
+		while ($i >= 0)
+		{
+			$start = $i;
+			$end   = $i;
+			while ($start > 0 && $values[$start - 1] === $values[$end] - ($end + 1 - $start))
+				--$start;
+			$ranges[] = array($start, $end);
+			$i = $start - 1;
+		}
+		$this->ranges = \array_reverse($ranges);
+	}
+	protected function unescapeLiterals()
+	{
+		foreach ($this->chars as $k => $char)
+			if ($char[0] === '\\' && \preg_match('(^\\\\[^a-z]$)Di', $char))
+				$this->chars[$k] = \substr($char, 1);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Helpers;
+use RuntimeException;
+use Traversable;
+use s9e\TextFormatter\Configurator\ConfigProvider;
+use s9e\TextFormatter\Configurator\FilterableConfigValue;
+abstract class ConfigHelper
+{
+	public static function filterConfig(array $config, $target = 'PHP')
+	{
+		$filteredConfig = array();
+		foreach ($config as $name => $value)
+		{
+			if ($value instanceof FilterableConfigValue)
+			{
+				$value = $value->filterConfig($target);
+				if (!isset($value))
+					continue;
+			}
+			if (\is_array($value))
+				$value = self::filterConfig($value, $target);
+			$filteredConfig[$name] = $value;
+		}
+		return $filteredConfig;
+	}
+	public static function generateQuickMatchFromList(array $strings)
+	{
+		foreach ($strings as $string)
+		{
+			$stringLen  = \strlen($string);
+			$substrings = array();
+			for ($len = $stringLen; $len; --$len)
+			{
+				$pos = $stringLen - $len;
+				do
+				{
+					$substrings[\substr($string, $pos, $len)] = 1;
+				}
+				while (--$pos >= 0);
+			}
+			if (isset($goodStrings))
+			{
+				$goodStrings = \array_intersect_key($goodStrings, $substrings);
+				if (empty($goodStrings))
+					break;
+			}
+			else
+				$goodStrings = $substrings;
+		}
+		if (empty($goodStrings))
+			return \false;
+		return \strval(\key($goodStrings));
+	}
+	public static function optimizeArray(array &$config, array &$cache = array())
+	{
+		foreach ($config as $k => &$v)
+		{
+			if (!\is_array($v))
+				continue;
+			self::optimizeArray($v, $cache);
+			$cacheKey = \serialize($v);
+			if (!isset($cache[$cacheKey]))
+				$cache[$cacheKey] = $v;
+			$config[$k] =& $cache[$cacheKey];
+		}
+		unset($v);
+	}
+	public static function toArray($value, $keepEmpty = \false, $keepNull = \false)
+	{
+		$array = array();
+		foreach ($value as $k => $v)
+		{
+			if ($v instanceof ConfigProvider)
+				$v = $v->asConfig();
+			elseif ($v instanceof Traversable || \is_array($v))
+				$v = self::toArray($v, $keepEmpty, $keepNull);
+			elseif (\is_scalar($v) || \is_null($v))
+				;
+			else
+			{
+				$type = (\is_object($v))
+				      ? 'an instance of ' . \get_class($v)
+				      : 'a ' . \gettype($v);
+				throw new RuntimeException('Cannot convert ' . $type . ' to array');
+			}
+			if (!isset($v) && !$keepNull)
+				continue;
+			if (!$keepEmpty && $v === array())
+				continue;
+			$array[$k] = $v;
+		}
+		return $array;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Helpers;
+use RuntimeException;
+abstract class RegexpBuilder
+{
+	protected static $characterClassBuilder;
+	public static function fromList(array $words, array $options = array())
+	{
+		if (empty($words))
+			return '';
+		$options += array(
+			'delimiter'       => '/',
+			'caseInsensitive' => \false,
+			'specialChars'    => array(),
+			'unicode'         => \true,
+			'useLookahead'    => \false
+		);
+		if ($options['caseInsensitive'])
+		{
+			foreach ($words as &$word)
+				$word = \strtr(
+					$word,
+					'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+					'abcdefghijklmnopqrstuvwxyz'
+				);
+			unset($word);
+		}
+		$words = \array_unique($words);
+		\sort($words);
+		$initials = array();
+		$esc  = $options['specialChars'];
+		$esc += array($options['delimiter'] => '\\' . $options['delimiter']);
+		$esc += array(
+			'!' => '!',
+			'-' => '-',
+			':' => ':',
+			'<' => '<',
+			'=' => '=',
+			'>' => '>',
+			'}' => '}'
+		);
+		$splitWords = array();
+		foreach ($words as $word)
+		{
+			$regexp = ($options['unicode']) ? '(.)us' : '(.)s';
+			if (\preg_match_all($regexp, $word, $matches) === \false || ($options['unicode'] && !\preg_match('/^(?:[[:ascii:]]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3})*$/D', $word)))
+				throw new RuntimeException("Invalid UTF-8 string '" . $word . "'");
+			$splitWord = array();
+			foreach ($matches[0] as $pos => $c)
+			{
+				if (!isset($esc[$c]))
+					$esc[$c] = \preg_quote($c);
+				if ($pos === 0)
+					$initials[] = $esc[$c];
+				$splitWord[] = $esc[$c];
+			}
+			$splitWords[] = $splitWord;
+		}
+		self::$characterClassBuilder            = new CharacterClassBuilder;
+		self::$characterClassBuilder->delimiter = $options['delimiter'];
+		$regexp = self::assemble(array(self::mergeChains($splitWords)));
+		if ($options['useLookahead']
+		 && \count($initials) > 1
+		 && $regexp[0] !== '[')
+		{
+			$useLookahead = \true;
+			foreach ($initials as $initial)
+				if (!self::canBeUsedInCharacterClass($initial))
+				{
+					$useLookahead = \false;
+					break;
+				}
+			if ($useLookahead)
+				$regexp = '(?=' . self::generateCharacterClass($initials) . ')' . $regexp;
+		}
+		return $regexp;
+	}
+	protected static function mergeChains(array $chains)
+	{
+		if (!isset($chains[1]))
+			return $chains[0];
+		$mergedChain = self::removeLongestCommonPrefix($chains);
+		if (!isset($chains[0][0])
+		 && !\array_filter($chains))
+			return $mergedChain;
+		$suffix = self::removeLongestCommonSuffix($chains);
+		if (isset($chains[1]))
+		{
+			self::optimizeDotChains($chains);
+			self::optimizeCatchallChains($chains);
+		}
+		$endOfChain = \false;
+		$remerge = \false;
+		$groups = array();
+		foreach ($chains as $chain)
+		{
+			if (!isset($chain[0]))
+			{
+				$endOfChain = \true;
+				continue;
+			}
+			$head = $chain[0];
+			if (isset($groups[$head]))
+				$remerge = \true;
+			$groups[$head][] = $chain;
+		}
+		$characterClass = array();
+		foreach ($groups as $head => $groupChains)
+		{
+			$head = (string) $head;
+			if ($groupChains === array(array($head))
+			 && self::canBeUsedInCharacterClass($head))
+				$characterClass[$head] = $head;
+		}
+		\sort($characterClass);
+		if (isset($characterClass[1]))
+		{
+			foreach ($characterClass as $char)
+				unset($groups[$char]);
+			$head = self::generateCharacterClass($characterClass);
+			$groups[$head][] = array($head);
+			$groups = array($head => $groups[$head])
+			        + $groups;
+		}
+		if ($remerge)
+		{
+			$mergedChains = array();
+			foreach ($groups as $head => $groupChains)
+				$mergedChains[] = self::mergeChains($groupChains);
+			self::mergeTails($mergedChains);
+			$regexp = \implode('', self::mergeChains($mergedChains));
+			if ($endOfChain)
+				$regexp = self::makeRegexpOptional($regexp);
+			$mergedChain[] = $regexp;
+		}
+		else
+		{
+			self::mergeTails($chains);
+			$mergedChain[] = self::assemble($chains);
+		}
+		foreach ($suffix as $atom)
+			$mergedChain[] = $atom;
+		return $mergedChain;
+	}
+	protected static function mergeTails(array &$chains)
+	{
+		self::mergeTailsCC($chains);
+		self::mergeTailsAltern($chains);
+		$chains = \array_values($chains);
+	}
+	protected static function mergeTailsCC(array &$chains)
+	{
+		$groups = array();
+		foreach ($chains as $k => $chain)
+			if (isset($chain[1])
+			 && !isset($chain[2])
+			 && self::canBeUsedInCharacterClass($chain[0]))
+				$groups[$chain[1]][$k] = $chain;
+		foreach ($groups as $groupChains)
+		{
+			if (\count($groupChains) < 2)
+				continue;
+			$chains = \array_diff_key($chains, $groupChains);
+			$chains[] = self::mergeChains(\array_values($groupChains));
+		}
+	}
+	protected static function mergeTailsAltern(array &$chains)
+	{
+		$groups = array();
+		foreach ($chains as $k => $chain)
+			if (!empty($chain))
+			{
+				$tail = \array_slice($chain, -1);
+				$groups[$tail[0]][$k] = $chain;
+			}
+		foreach ($groups as $tail => $groupChains)
+		{
+			if (\count($groupChains) < 2)
+				continue;
+			$mergedChain = self::mergeChains(\array_values($groupChains));
+			$oldLen = 0;
+			foreach ($groupChains as $groupChain)
+				$oldLen += \array_sum(\array_map('strlen', $groupChain));
+			if ($oldLen <= \array_sum(\array_map('strlen', $mergedChain)))
+				continue;
+			$chains = \array_diff_key($chains, $groupChains);
+			$chains[] = $mergedChain;
+		}
+	}
+	protected static function removeLongestCommonPrefix(array &$chains)
+	{
+		$pLen = 0;
+		while (1)
+		{
+			$c = \null;
+			foreach ($chains as $chain)
+			{
+				if (!isset($chain[$pLen]))
+					break 2;
+				if (!isset($c))
+				{
+					$c = $chain[$pLen];
+					continue;
+				}
+				if ($chain[$pLen] !== $c)
+					break 2;
+			}
+			++$pLen;
+		}
+		if (!$pLen)
+			return array();
+		$prefix = \array_slice($chains[0], 0, $pLen);
+		foreach ($chains as &$chain)
+			$chain = \array_slice($chain, $pLen);
+		unset($chain);
+		return $prefix;
+	}
+	protected static function removeLongestCommonSuffix(array &$chains)
+	{
+		$chainsLen = \array_map('count', $chains);
+		$maxLen = \min($chainsLen);
+		if (\max($chainsLen) === $maxLen)
+			--$maxLen;
+		$sLen = 0;
+		while ($sLen < $maxLen)
+		{
+			$c = \null;
+			foreach ($chains as $k => $chain)
+			{
+				$pos = $chainsLen[$k] - ($sLen + 1);
+				if (!isset($c))
+				{
+					$c = $chain[$pos];
+					continue;
+				}
+				if ($chain[$pos] !== $c)
+					break 2;
+			}
+			++$sLen;
+		}
+		if (!$sLen)
+			return array();
+		$suffix = \array_slice($chains[0], -$sLen);
+		foreach ($chains as &$chain)
+			$chain = \array_slice($chain, 0, -$sLen);
+		unset($chain);
+		return $suffix;
+	}
+	protected static function assemble(array $chains)
+	{
+		$endOfChain = \false;
+		$regexps        = array();
+		$characterClass = array();
+		foreach ($chains as $chain)
+		{
+			if (empty($chain))
+			{
+				$endOfChain = \true;
+				continue;
+			}
+			if (!isset($chain[1])
+			 && self::canBeUsedInCharacterClass($chain[0]))
+				$characterClass[$chain[0]] = $chain[0];
+			else
+				$regexps[] = \implode('', $chain);
+		}
+		if (!empty($characterClass))
+		{
+			\sort($characterClass);
+			$regexp = (isset($characterClass[1]))
+					? self::generateCharacterClass($characterClass)
+					: $characterClass[0];
+			\array_unshift($regexps, $regexp);
+		}
+		if (empty($regexps))
+			return '';
+		if (isset($regexps[1]))
+		{
+			$regexp = \implode('|', $regexps);
+			$regexp = ((self::canUseAtomicGrouping($regexp)) ? '(?>' : '(?:') . $regexp . ')';
+		}
+		else
+			$regexp = $regexps[0];
+		if ($endOfChain)
+			$regexp = self::makeRegexpOptional($regexp);
+		return $regexp;
+	}
+	protected static function makeRegexpOptional($regexp)
+	{
+		if (\preg_match('#^\\.\\+\\??$#', $regexp))
+			return \str_replace('+', '*', $regexp);
+		if (\preg_match('#^(\\\\?.)((?:\\1\\?)+)$#Du', $regexp, $m))
+			return $m[1] . '?' . $m[2];
+		if (\preg_match('#^(?:[$^]|\\\\[bBAZzGQEK])$#', $regexp))
+			return '';
+		if (\preg_match('#^\\\\?.$#Dus', $regexp))
+			$isAtomic = \true;
+		elseif (\preg_match('#^[^[(].#s', $regexp))
+			$isAtomic = \false;
+		else
+		{
+			$def    = RegexpParser::parse('#' . $regexp . '#');
+			$tokens = $def['tokens'];
+			switch (\count($tokens))
+			{
+				case 1:
+					$startPos = $tokens[0]['pos'];
+					$len      = $tokens[0]['len'];
+					$isAtomic = (bool) ($startPos === 0 && $len === \strlen($regexp));
+					if ($isAtomic && $tokens[0]['type'] === 'characterClass')
+					{
+						$regexp = \rtrim($regexp, '+*?');
+						if (!empty($tokens[0]['quantifiers']) && $tokens[0]['quantifiers'] !== '?')
+							$regexp .= '*';
+					}
+					break;
+				case 2:
+					if ($tokens[0]['type'] === 'nonCapturingSubpatternStart'
+					 && $tokens[1]['type'] === 'nonCapturingSubpatternEnd')
+					{
+						$startPos = $tokens[0]['pos'];
+						$len      = $tokens[1]['pos'] + $tokens[1]['len'];
+						$isAtomic = (bool) ($startPos === 0 && $len === \strlen($regexp));
+						break;
+					}
+					default:
+					$isAtomic = \false;
+			}
+		}
+		if (!$isAtomic)
+			$regexp = ((self::canUseAtomicGrouping($regexp)) ? '(?>' : '(?:') . $regexp . ')';
+		$regexp .= '?';
+		return $regexp;
+	}
+	protected static function generateCharacterClass(array $chars)
+	{
+		return self::$characterClassBuilder->fromList($chars);
+	}
+	protected static function canBeUsedInCharacterClass($char)
+	{
+		if (\preg_match('#^\\\\[aefnrtdDhHsSvVwW]$#D', $char))
+			return \true;
+		if (\preg_match('#^\\\\[^A-Za-z0-9]$#Dus', $char))
+			return \true;
+		if (\preg_match('#..#Dus', $char))
+			return \false;
+		if (\preg_quote($char) !== $char
+		 && !\preg_match('#^[-!:<=>}]$#D', $char))
+			return \false;
+		return \true;
+	}
+	protected static function optimizeDotChains(array &$chains)
+	{
+		$validAtoms = array(
+			'\\d' => 1, '\\D' => 1, '\\h' => 1, '\\H' => 1,
+			'\\s' => 1, '\\S' => 1, '\\v' => 1, '\\V' => 1,
+			'\\w' => 1, '\\W' => 1,
+			'\\^' => 1, '\\$' => 1, '\\.' => 1, '\\?' => 1,
+			'\\[' => 1, '\\]' => 1, '\\(' => 1, '\\)' => 1,
+			'\\+' => 1, '\\*' => 1, '\\\\' => 1
+		);
+		do
+		{
+			$hasMoreDots = \false;
+			foreach ($chains as $k1 => $dotChain)
+			{
+				$dotKeys = \array_keys($dotChain, '.?', \true);
+				if (!empty($dotKeys))
+				{
+					$dotChain[$dotKeys[0]] = '.';
+					$chains[$k1] = $dotChain;
+					\array_splice($dotChain, $dotKeys[0], 1);
+					$chains[] = $dotChain;
+					if (isset($dotKeys[1]))
+						$hasMoreDots = \true;
+				}
+			}
+		}
+		while ($hasMoreDots);
+		foreach ($chains as $k1 => $dotChain)
+		{
+			$dotKeys = \array_keys($dotChain, '.', \true);
+			if (empty($dotKeys))
+				continue;
+			foreach ($chains as $k2 => $tmpChain)
+			{
+				if ($k2 === $k1)
+					continue;
+				foreach ($dotKeys as $dotKey)
+				{
+					if (!isset($tmpChain[$dotKey]))
+						continue 2;
+					if (!\preg_match('#^.$#Du', \preg_quote($tmpChain[$dotKey]))
+					 && !isset($validAtoms[$tmpChain[$dotKey]]))
+						continue 2;
+					$tmpChain[$dotKey] = '.';
+				}
+				if ($tmpChain === $dotChain)
+					unset($chains[$k2]);
+			}
+		}
+	}
+	protected static function optimizeCatchallChains(array &$chains)
+	{
+		$precedence = array(
+			'.*'  => 3,
+			'.*?' => 2,
+			'.+'  => 1,
+			'.+?' => 0
+		);
+		$tails = array();
+		foreach ($chains as $k => $chain)
+		{
+			if (!isset($chain[0]))
+				continue;
+			$head = $chain[0];
+			if (!isset($precedence[$head]))
+				continue;
+			$tail = \implode('', \array_slice($chain, 1));
+			if (!isset($tails[$tail])
+			 || $precedence[$head] > $tails[$tail]['precedence'])
+				$tails[$tail] = array(
+					'key'        => $k,
+					'precedence' => $precedence[$head]
+				);
+		}
+		$catchallChains = array();
+		foreach ($tails as $tail => $info)
+			$catchallChains[$info['key']] = $chains[$info['key']];
+		foreach ($catchallChains as $k1 => $catchallChain)
+		{
+			$headExpr = $catchallChain[0];
+			$tailExpr = \false;
+			$match    = \array_slice($catchallChain, 1);
+			if (isset($catchallChain[1])
+			 && isset($precedence[\end($catchallChain)]))
+				$tailExpr = \array_pop($match);
+			$matchCnt = \count($match);
+			foreach ($chains as $k2 => $chain)
+			{
+				if ($k2 === $k1)
+					continue;
+				$start = 0;
+				$end = \count($chain);
+				if ($headExpr[1] === '+')
+				{
+					$found = \false;
+					foreach ($chain as $start => $atom)
+						if (self::matchesAtLeastOneCharacter($atom))
+						{
+							$found = \true;
+							break;
+						}
+					if (!$found)
+						continue;
+				}
+				if ($tailExpr === \false)
+					$end = $start;
+				else
+				{
+					if ($tailExpr[1] === '+')
+					{
+						$found = \false;
+						while (--$end > $start)
+							if (self::matchesAtLeastOneCharacter($chain[$end]))
+							{
+								$found = \true;
+								break;
+							}
+						if (!$found)
+							continue;
+					}
+					$end -= $matchCnt;
+				}
+				while ($start <= $end)
+				{
+					if (\array_slice($chain, $start, $matchCnt) === $match)
+					{
+						unset($chains[$k2]);
+						break;
+					}
+					++$start;
+				}
+			}
+		}
+	}
+	protected static function matchesAtLeastOneCharacter($expr)
+	{
+		if (\preg_match('#^[$*?^]$#', $expr))
+			return \false;
+		if (\preg_match('#^.$#u', $expr))
+			return \true;
+		if (\preg_match('#^.\\+#u', $expr))
+			return \true;
+		if (\preg_match('#^\\\\[^bBAZzGQEK1-9](?![*?])#', $expr))
+			return \true;
+		return \false;
+	}
+	protected static function canUseAtomicGrouping($expr)
+	{
+		if (\preg_match('#(?<!\\\\)(?>\\\\\\\\)*\\.#', $expr))
+			return \false;
+		if (\preg_match('#(?<!\\\\)(?>\\\\\\\\)*[+*]#', $expr))
+			return \false;
+		if (\preg_match('#(?<!\\\\)(?>\\\\\\\\)*\\(?(?<!\\()\\?#', $expr))
+			return \false;
+		if (\preg_match('#(?<!\\\\)(?>\\\\\\\\)*\\\\[a-z0-9]#', $expr))
+			return \false;
+		return \true;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Helpers;
+use s9e\TextFormatter\Configurator\Collections\Ruleset;
+use s9e\TextFormatter\Configurator\Collections\TagCollection;
+abstract class RulesHelper
+{
+	public static function getBitfields(TagCollection $tags, Ruleset $rootRules)
+	{
+		$rules = array('*root*' => \iterator_to_array($rootRules));
+		foreach ($tags as $tagName => $tag)
+			$rules[$tagName] = \iterator_to_array($tag->rules);
+		$matrix = self::unrollRules($rules);
+		self::pruneMatrix($matrix);
+		$groupedTags = array();
+		foreach (\array_keys($matrix) as $tagName)
+		{
+			if ($tagName === '*root*')
+				continue;
+			$k = '';
+			foreach ($matrix as $tagMatrix)
+			{
+				$k .= $tagMatrix['allowedChildren'][$tagName];
+				$k .= $tagMatrix['allowedDescendants'][$tagName];
+			}
+			$groupedTags[$k][] = $tagName;
+		}
+		$bitTag     = array();
+		$bitNumber  = 0;
+		$tagsConfig = array();
+		foreach ($groupedTags as $tagNames)
+		{
+			foreach ($tagNames as $tagName)
+			{
+				$tagsConfig[$tagName]['bitNumber'] = $bitNumber;
+				$bitTag[$bitNumber] = $tagName;
+			}
+			++$bitNumber;
+		}
+		foreach ($matrix as $tagName => $tagMatrix)
+		{
+			$allowedChildren    = '';
+			$allowedDescendants = '';
+			foreach ($bitTag as $targetName)
+			{
+				$allowedChildren    .= $tagMatrix['allowedChildren'][$targetName];
+				$allowedDescendants .= $tagMatrix['allowedDescendants'][$targetName];
+			}
+			$tagsConfig[$tagName]['allowed'] = self::pack($allowedChildren, $allowedDescendants);
+		}
+		$return = array(
+			'root' => $tagsConfig['*root*'],
+			'tags' => $tagsConfig
+		);
+		unset($return['tags']['*root*']);
+		return $return;
+	}
+	protected static function initMatrix(array $rules)
+	{
+		$matrix   = array();
+		$tagNames = \array_keys($rules);
+		foreach ($rules as $tagName => $tagRules)
+		{
+			if ($tagRules['defaultDescendantRule'] === 'allow')
+			{
+				$childValue      = (int) ($tagRules['defaultChildRule'] === 'allow');
+				$descendantValue = 1;
+			}
+			else
+			{
+				$childValue      = 0;
+				$descendantValue = 0;
+			}
+			$matrix[$tagName]['allowedChildren']    = \array_fill_keys($tagNames, $childValue);
+			$matrix[$tagName]['allowedDescendants'] = \array_fill_keys($tagNames, $descendantValue);
+		}
+		return $matrix;
+	}
+	protected static function applyTargetedRule(array &$matrix, $rules, $ruleName, $key, $value)
+	{
+		foreach ($rules as $tagName => $tagRules)
+		{
+			if (!isset($tagRules[$ruleName]))
+				continue;
+			foreach ($tagRules[$ruleName] as $targetName)
+				$matrix[$tagName][$key][$targetName] = $value;
+		}
+	}
+	protected static function unrollRules(array $rules)
+	{
+		$matrix = self::initMatrix($rules);
+		$tagNames = \array_keys($rules);
+		foreach ($rules as $tagName => $tagRules)
+		{
+			if (!empty($tagRules['ignoreTags']))
+				$rules[$tagName]['denyDescendant'] = $tagNames;
+			if (!empty($tagRules['requireParent']))
+			{
+				$denyParents = \array_diff($tagNames, $tagRules['requireParent']);
+				foreach ($denyParents as $parentName)
+					$rules[$parentName]['denyChild'][] = $tagName;
+			}
+		}
+		self::applyTargetedRule($matrix, $rules, 'allowChild',      'allowedChildren',    1);
+		self::applyTargetedRule($matrix, $rules, 'allowDescendant', 'allowedChildren',    1);
+		self::applyTargetedRule($matrix, $rules, 'allowDescendant', 'allowedDescendants', 1);
+		self::applyTargetedRule($matrix, $rules, 'denyChild',      'allowedChildren',    0);
+		self::applyTargetedRule($matrix, $rules, 'denyDescendant', 'allowedChildren',    0);
+		self::applyTargetedRule($matrix, $rules, 'denyDescendant', 'allowedDescendants', 0);
+		return $matrix;
+	}
+	protected static function pruneMatrix(array &$matrix)
+	{
+		$usableTags = array('*root*' => 1);
+		$parentTags = $usableTags;
+		do
+		{
+			$nextTags = array();
+			foreach (\array_keys($parentTags) as $tagName)
+				$nextTags += \array_filter($matrix[$tagName]['allowedChildren']);
+			$parentTags  = \array_diff_key($nextTags, $usableTags);
+			$parentTags  = \array_intersect_key($parentTags, $matrix);
+			$usableTags += $parentTags;
+		}
+		while (!empty($parentTags));
+		$matrix = \array_intersect_key($matrix, $usableTags);
+		unset($usableTags['*root*']);
+		foreach ($matrix as $tagName => &$tagMatrix)
+		{
+			$tagMatrix['allowedChildren']
+				= \array_intersect_key($tagMatrix['allowedChildren'], $usableTags);
+			$tagMatrix['allowedDescendants']
+				= \array_intersect_key($tagMatrix['allowedDescendants'], $usableTags);
+		}
+		unset($tagMatrix);
+	}
+	protected static function pack($allowedChildren, $allowedDescendants)
+	{
+		$allowedChildren    = \str_split($allowedChildren,    8);
+		$allowedDescendants = \str_split($allowedDescendants, 8);
+		$allowed = array();
+		foreach (\array_keys($allowedChildren) as $k)
+			$allowed[] = \bindec(\sprintf(
+				'%1$08s%2$08s',
+				\strrev($allowedDescendants[$k]),
+				\strrev($allowedChildren[$k])
+			));
+		return $allowed;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Helpers;
+use DOMDocument;
+use DOMElement;
+use DOMXPath;
+class TemplateForensics
+{
+	protected $allowChildBitfield = "\0";
+	protected $allowsChildElements = \true;
+	protected $allowsText = \true;
+	protected $contentBitfield = "\0";
+	protected $denyDescendantBitfield = "\0";
+	protected $dom;
+	protected $hasElements = \false;
+	protected $hasRootText = \false;
+	protected $isBlock = \false;
+	protected $isEmpty = \true;
+	protected $isFormattingElement = \false;
+	protected $isPassthrough = \false;
+	protected $isTransparent = \false;
+	protected $isVoid = \true;
+	protected $leafNodes = array();
+	protected $preservesNewLines = \false;
+	protected $rootBitfields = array();
+	protected $rootNodes = array();
+	protected $xpath;
+	public function __construct($template)
+	{
+		$this->dom   = TemplateHelper::loadTemplate($template);
+		$this->xpath = new DOMXPath($this->dom);
+		$this->analyseRootNodes();
+		$this->analyseBranches();
+		$this->analyseContent();
+	}
+	public function allowsChild(self $child)
+	{
+		if (!$this->allowsDescendant($child))
+			return \false;
+		foreach ($child->rootBitfields as $rootBitfield)
+			if (!self::match($rootBitfield, $this->allowChildBitfield))
+				return \false;
+		if (!$this->allowsText && $child->hasRootText)
+			return \false;
+		return \true;
+	}
+	public function allowsDescendant(self $descendant)
+	{
+		if (self::match($descendant->contentBitfield, $this->denyDescendantBitfield))
+			return \false;
+		if (!$this->allowsChildElements && $descendant->hasElements)
+			return \false;
+		return \true;
+	}
+	public function allowsChildElements()
+	{
+		return $this->allowsChildElements;
+	}
+	public function allowsText()
+	{
+		return $this->allowsText;
+	}
+	public function closesParent(self $parent)
+	{
+		foreach ($this->rootNodes as $rootName)
+		{
+			if (empty(self::$htmlElements[$rootName]['cp']))
+				continue;
+			foreach ($parent->leafNodes as $leafName)
+				if (\in_array($leafName, self::$htmlElements[$rootName]['cp'], \true))
+					return \true;
+		}
+		return \false;
+	}
+	public function getDOM()
+	{
+		return $this->dom;
+	}
+	public function isBlock()
+	{
+		return $this->isBlock;
+	}
+	public function isFormattingElement()
+	{
+		return $this->isFormattingElement;
+	}
+	public function isEmpty()
+	{
+		return $this->isEmpty;
+	}
+	public function isPassthrough()
+	{
+		return $this->isPassthrough;
+	}
+	public function isTransparent()
+	{
+		return $this->isTransparent;
+	}
+	public function isVoid()
+	{
+		return $this->isVoid;
+	}
+	public function preservesNewLines()
+	{
+		return $this->preservesNewLines;
+	}
+	protected function analyseContent()
+	{
+		$query = '//*[namespace-uri() != "http://www.w3.org/1999/XSL/Transform"]';
+		foreach ($this->xpath->query($query) as $node)
+		{
+			$this->contentBitfield |= $this->getBitfield($node->localName, 'c', $node);
+			$this->hasElements = \true;
+		}
+		$this->isPassthrough = (bool) $this->xpath->evaluate('count(//xsl:apply-templates)');
+	}
+	protected function analyseRootNodes()
+	{
+		$query = '//*[namespace-uri() != "http://www.w3.org/1999/XSL/Transform"][not(ancestor::*[namespace-uri() != "http://www.w3.org/1999/XSL/Transform"])]';
+		foreach ($this->xpath->query($query) as $node)
+		{
+			$elName = $node->localName;
+			$this->rootNodes[] = $elName;
+			if (!isset(self::$htmlElements[$elName]))
+				$elName = 'span';
+			if ($this->elementIsBlock($elName, $node))
+				$this->isBlock = \true;
+			$this->rootBitfields[] = $this->getBitfield($elName, 'c', $node);
+		}
+		$predicate = '[not(ancestor::*[namespace-uri() != "http://www.w3.org/1999/XSL/Transform"])]';
+		$predicate .= '[not(ancestor::xsl:attribute | ancestor::xsl:comment | ancestor::xsl:variable)]';
+		$query = '//text()[normalize-space() != ""]' . $predicate
+		       . '|//xsl:text[normalize-space() != ""]' . $predicate
+		       . '|//xsl:value-of' . $predicate;
+		if ($this->evaluate($query, $this->dom->documentElement))
+			$this->hasRootText = \true;
+	}
+	protected function analyseBranches()
+	{
+		$branchBitfields = array();
+		$isFormattingElement = \true;
+		$this->isTransparent = \true;
+		foreach ($this->getXSLElements('apply-templates') as $applyTemplates)
+		{
+			$nodes = $this->xpath->query(
+				'ancestor::*[namespace-uri() != "http://www.w3.org/1999/XSL/Transform"]',
+				$applyTemplates
+			);
+			$allowsChildElements = \true;
+			$allowsText = \true;
+			$branchBitfield = self::$htmlElements['div']['ac'];
+			$isEmpty = \false;
+			$isVoid = \false;
+			$leafNode = \null;
+			$preservesNewLines = \false;
+			foreach ($nodes as $node)
+			{
+				$elName = $leafNode = $node->localName;
+				if (!isset(self::$htmlElements[$elName]))
+					$elName = 'span';
+				if ($this->hasProperty($elName, 'v', $node))
+					$isVoid = \true;
+				if ($this->hasProperty($elName, 'e', $node))
+					$isEmpty = \true;
+				if (!$this->hasProperty($elName, 't', $node))
+				{
+					$branchBitfield = "\0";
+					$this->isTransparent = \false;
+				}
+				if (!$this->hasProperty($elName, 'fe', $node)
+				 && !$this->isFormattingSpan($node))
+					$isFormattingElement = \false;
+				$allowsChildElements = !$this->hasProperty($elName, 'to', $node);
+				$allowsText = !$this->hasProperty($elName, 'nt', $node);
+				$branchBitfield |= $this->getBitfield($elName, 'ac', $node);
+				$this->denyDescendantBitfield |= $this->getBitfield($elName, 'dd', $node);
+				$style = '';
+				if ($this->hasProperty($elName, 'pre', $node))
+					$style .= 'white-space:pre;';
+				if ($node->hasAttribute('style'))
+					$style .= $node->getAttribute('style') . ';';
+				$attributes = $this->xpath->query('.//xsl:attribute[@name="style"]', $node);
+				foreach ($attributes as $attribute)
+					$style .= $attribute->textContent;
+				\preg_match_all(
+					'/white-space\\s*:\\s*(no|pre)/i',
+					\strtolower($style),
+					$matches
+				);
+				foreach ($matches[1] as $match)
+					$preservesNewLines = ($match === 'pre');
+			}
+			$branchBitfields[] = $branchBitfield;
+			if (isset($leafNode))
+				$this->leafNodes[] = $leafNode;
+			if (!$allowsChildElements)
+				$this->allowsChildElements = \false;
+			if (!$allowsText)
+				$this->allowsText = \false;
+			if (!$isEmpty)
+				$this->isEmpty = \false;
+			if (!$isVoid)
+				$this->isVoid = \false;
+			if ($preservesNewLines)
+				$this->preservesNewLines = \true;
+		}
+		if (empty($branchBitfields))
+		{
+			$this->allowsChildElements = \false;
+			$this->isTransparent       = \false;
+		}
+		else
+		{
+			$this->allowChildBitfield = $branchBitfields[0];
+			foreach ($branchBitfields as $branchBitfield)
+				$this->allowChildBitfield &= $branchBitfield;
+			if (!empty($this->leafNodes))
+				$this->isFormattingElement = $isFormattingElement;
+		}
+	}
+	protected function elementIsBlock($elName, DOMElement $node)
+	{
+		$style = $this->getStyle($node);
+		if (\preg_match('(\\bdisplay\\s*:\\s*block)i', $style))
+			return \true;
+		if (\preg_match('(\\bdisplay\\s*:\\s*inline)i', $style))
+			return \false;
+		return $this->hasProperty($elName, 'b', $node);
+	}
+	protected function evaluate($query, DOMElement $node)
+	{
+		return $this->xpath->evaluate('boolean(' . $query . ')', $node);
+	}
+	protected function getStyle(DOMElement $node)
+	{
+		$style = $node->getAttribute('style');
+		$xpath = new DOMXPath($node->ownerDocument);
+		$query = 'xsl:attribute[@name="style"]';
+		foreach ($xpath->query($query, $node) as $attribute)
+			$style .= ';' . $attribute->textContent;
+		return $style;
+	}
+	protected function getXSLElements($elName)
+	{
+		return $this->dom->getElementsByTagNameNS('http://www.w3.org/1999/XSL/Transform', $elName);
+	}
+	protected function isFormattingSpan(DOMElement $node)
+	{
+		if ($node->nodeName !== 'span')
+			return \false;
+		if ($node->getAttribute('class') === ''
+		 && $node->getAttribute('style') === '')
+			return \false;
+		foreach ($node->attributes as $attrName => $attribute)
+			if ($attrName !== 'class' && $attrName !== 'style')
+				return \false;
+		return \true;
+	}
+	protected static $htmlElements = array(
+		'a'=>array('c'=>"\17\0\0\0\0\1",'c3'=>'@href','ac'=>"\0",'dd'=>"\10\0\0\0\0\1",'t'=>1,'fe'=>1),
+		'abbr'=>array('c'=>"\7",'ac'=>"\4"),
+		'address'=>array('c'=>"\3\40",'ac'=>"\1",'dd'=>"\0\45",'b'=>1,'cp'=>array('p')),
+		'article'=>array('c'=>"\3\4",'ac'=>"\1",'b'=>1,'cp'=>array('p')),
+		'aside'=>array('c'=>"\3\4",'ac'=>"\1",'dd'=>"\0\0\0\0\10",'b'=>1,'cp'=>array('p')),
+		'audio'=>array('c'=>"\57",'c3'=>'@controls','c1'=>'@controls','ac'=>"\0\0\0\104",'ac26'=>'not(@src)','dd'=>"\0\0\0\0\0\2",'dd41'=>'@src','t'=>1),
+		'b'=>array('c'=>"\7",'ac'=>"\4",'fe'=>1),
+		'base'=>array('c'=>"\20",'nt'=>1,'e'=>1,'v'=>1,'b'=>1),
+		'bdi'=>array('c'=>"\7",'ac'=>"\4"),
+		'bdo'=>array('c'=>"\7",'ac'=>"\4"),
+		'blockquote'=>array('c'=>"\203",'ac'=>"\1",'b'=>1,'cp'=>array('p')),
+		'body'=>array('c'=>"\200\0\4",'ac'=>"\1",'b'=>1),
+		'br'=>array('c'=>"\5",'nt'=>1,'e'=>1,'v'=>1),
+		'button'=>array('c'=>"\117",'ac'=>"\4",'dd'=>"\10"),
+		'canvas'=>array('c'=>"\47",'ac'=>"\0",'t'=>1),
+		'caption'=>array('c'=>"\0\2",'ac'=>"\1",'dd'=>"\0\0\0\200",'b'=>1),
+		'cite'=>array('c'=>"\7",'ac'=>"\4"),
+		'code'=>array('c'=>"\7",'ac'=>"\4",'fe'=>1),
+		'col'=>array('c'=>"\0\0\20",'nt'=>1,'e'=>1,'v'=>1,'b'=>1),
+		'colgroup'=>array('c'=>"\0\2",'ac'=>"\0\0\20",'ac20'=>'not(@span)','nt'=>1,'e'=>1,'e0'=>'@span','b'=>1),
+		'data'=>array('c'=>"\7",'ac'=>"\4"),
+		'datalist'=>array('c'=>"\5",'ac'=>"\4\200\0\10"),
+		'dd'=>array('c'=>"\0\0\200",'ac'=>"\1",'b'=>1,'cp'=>array('dd','dt')),
+		'del'=>array('c'=>"\5",'ac'=>"\0",'t'=>1),
+		'details'=>array('c'=>"\213",'ac'=>"\1\0\0\2",'b'=>1,'cp'=>array('p')),
+		'dfn'=>array('c'=>"\7\0\0\0\40",'ac'=>"\4",'dd'=>"\0\0\0\0\40"),
+		'div'=>array('c'=>"\3",'ac'=>"\1",'b'=>1,'cp'=>array('p')),
+		'dl'=>array('c'=>"\3",'c1'=>'dt and dd','ac'=>"\0\200\200",'nt'=>1,'b'=>1,'cp'=>array('p')),
+		'dt'=>array('c'=>"\0\0\200",'ac'=>"\1",'dd'=>"\0\5\0\40",'b'=>1,'cp'=>array('dd','dt')),
+		'em'=>array('c'=>"\7",'ac'=>"\4",'fe'=>1),
+		'embed'=>array('c'=>"\57",'nt'=>1,'e'=>1,'v'=>1),
+		'fieldset'=>array('c'=>"\303",'ac'=>"\1\0\0\20",'b'=>1,'cp'=>array('p')),
+		'figcaption'=>array('c'=>"\0\0\0\0\0\4",'ac'=>"\1",'b'=>1,'cp'=>array('p')),
+		'figure'=>array('c'=>"\203",'ac'=>"\1\0\0\0\0\4",'b'=>1,'cp'=>array('p')),
+		'footer'=>array('c'=>"\3\40",'ac'=>"\1",'dd'=>"\0\0\0\0\10",'b'=>1,'cp'=>array('p')),
+		'form'=>array('c'=>"\3\0\0\0\20",'ac'=>"\1",'dd'=>"\0\0\0\0\20",'b'=>1,'cp'=>array('p')),
+		'h1'=>array('c'=>"\3\1",'ac'=>"\4",'b'=>1,'cp'=>array('p')),
+		'h2'=>array('c'=>"\3\1",'ac'=>"\4",'b'=>1,'cp'=>array('p')),
+		'h3'=>array('c'=>"\3\1",'ac'=>"\4",'b'=>1,'cp'=>array('p')),
+		'h4'=>array('c'=>"\3\1",'ac'=>"\4",'b'=>1,'cp'=>array('p')),
+		'h5'=>array('c'=>"\3\1",'ac'=>"\4",'b'=>1,'cp'=>array('p')),
+		'h6'=>array('c'=>"\3\1",'ac'=>"\4",'b'=>1,'cp'=>array('p')),
+		'head'=>array('c'=>"\0\0\4",'ac'=>"\20",'nt'=>1,'b'=>1),
+		'header'=>array('c'=>"\3\40\0\40",'ac'=>"\1",'dd'=>"\0\0\0\0\10",'b'=>1,'cp'=>array('p')),
+		'hr'=>array('c'=>"\1\100",'nt'=>1,'e'=>1,'v'=>1,'b'=>1,'cp'=>array('p')),
+		'html'=>array('c'=>"\0",'ac'=>"\0\0\4",'nt'=>1,'b'=>1),
+		'i'=>array('c'=>"\7",'ac'=>"\4",'fe'=>1),
+		'iframe'=>array('c'=>"\57",'ac'=>"\4"),
+		'img'=>array('c'=>"\57\20\10",'c3'=>'@usemap','nt'=>1,'e'=>1,'v'=>1),
+		'input'=>array('c'=>"\17\20",'c3'=>'@type!="hidden"','c12'=>'@type!="hidden" or @type="hidden"','c1'=>'@type!="hidden"','nt'=>1,'e'=>1,'v'=>1),
+		'ins'=>array('c'=>"\7",'ac'=>"\0",'t'=>1),
+		'kbd'=>array('c'=>"\7",'ac'=>"\4"),
+		'keygen'=>array('c'=>"\117",'nt'=>1,'e'=>1,'v'=>1),
+		'label'=>array('c'=>"\17\20\0\0\4",'ac'=>"\4",'dd'=>"\0\0\1\0\4"),
+		'legend'=>array('c'=>"\0\0\0\20",'ac'=>"\4",'b'=>1),
+		'li'=>array('c'=>"\0\0\0\0\200",'ac'=>"\1",'b'=>1,'cp'=>array('li')),
+		'link'=>array('c'=>"\20",'nt'=>1,'e'=>1,'v'=>1,'b'=>1),
+		'main'=>array('c'=>"\3\0\0\0\10",'ac'=>"\1",'b'=>1,'cp'=>array('p')),
+		'mark'=>array('c'=>"\7",'ac'=>"\4"),
+		'media element'=>array('c'=>"\0\0\0\0\0\2",'nt'=>1,'b'=>1),
+		'menu'=>array('c'=>"\1\100",'ac'=>"\0\300",'nt'=>1,'b'=>1,'cp'=>array('p')),
+		'menuitem'=>array('c'=>"\0\100",'nt'=>1,'e'=>1,'v'=>1,'b'=>1),
+		'meta'=>array('c'=>"\20",'nt'=>1,'e'=>1,'v'=>1,'b'=>1),
+		'meter'=>array('c'=>"\7\0\1\0\2",'ac'=>"\4",'dd'=>"\0\0\0\0\2"),
+		'nav'=>array('c'=>"\3\4",'ac'=>"\1",'dd'=>"\0\0\0\0\10",'b'=>1,'cp'=>array('p')),
+		'noscript'=>array('c'=>"\25",'nt'=>1),
+		'object'=>array('c'=>"\147",'ac'=>"\0\0\0\0\1",'t'=>1),
+		'ol'=>array('c'=>"\3",'c1'=>'li','ac'=>"\0\200\0\0\200",'nt'=>1,'b'=>1,'cp'=>array('p')),
+		'optgroup'=>array('c'=>"\0\0\2",'ac'=>"\0\200\0\10",'nt'=>1,'b'=>1,'cp'=>array('optgroup','option')),
+		'option'=>array('c'=>"\0\0\2\10",'b'=>1,'cp'=>array('option')),
+		'output'=>array('c'=>"\107",'ac'=>"\4"),
+		'p'=>array('c'=>"\3",'ac'=>"\4",'b'=>1,'cp'=>array('p')),
+		'param'=>array('c'=>"\0\0\0\0\1",'nt'=>1,'e'=>1,'v'=>1,'b'=>1),
+		'picture'=>array('c'=>"\45",'ac'=>"\0\200\10",'nt'=>1),
+		'pre'=>array('c'=>"\3",'ac'=>"\4",'pre'=>1,'b'=>1,'cp'=>array('p')),
+		'progress'=>array('c'=>"\7\0\1\1",'ac'=>"\4",'dd'=>"\0\0\0\1"),
+		'q'=>array('c'=>"\7",'ac'=>"\4"),
+		'rb'=>array('c'=>"\0\10",'ac'=>"\4",'b'=>1),
+		'rp'=>array('c'=>"\0\10\100",'ac'=>"\4",'b'=>1,'cp'=>array('rp','rt')),
+		'rt'=>array('c'=>"\0\10\100",'ac'=>"\4",'b'=>1,'cp'=>array('rp','rt')),
+		'rtc'=>array('c'=>"\0\10",'ac'=>"\4\0\100",'b'=>1),
+		'ruby'=>array('c'=>"\7",'ac'=>"\4\10"),
+		's'=>array('c'=>"\7",'ac'=>"\4",'fe'=>1),
+		'samp'=>array('c'=>"\7",'ac'=>"\4"),
+		'script'=>array('c'=>"\25\200",'to'=>1),
+		'section'=>array('c'=>"\3\4",'ac'=>"\1",'b'=>1,'cp'=>array('p')),
+		'select'=>array('c'=>"\117",'ac'=>"\0\200\2",'nt'=>1),
+		'small'=>array('c'=>"\7",'ac'=>"\4",'fe'=>1),
+		'source'=>array('c'=>"\0\0\10\4",'nt'=>1,'e'=>1,'v'=>1,'b'=>1),
+		'span'=>array('c'=>"\7",'ac'=>"\4"),
+		'strong'=>array('c'=>"\7",'ac'=>"\4",'fe'=>1),
+		'style'=>array('c'=>"\20",'to'=>1,'b'=>1),
+		'sub'=>array('c'=>"\7",'ac'=>"\4"),
+		'summary'=>array('c'=>"\0\0\0\2",'ac'=>"\4\1",'b'=>1),
+		'sup'=>array('c'=>"\7",'ac'=>"\4"),
+		'table'=>array('c'=>"\3\0\0\200",'ac'=>"\0\202",'nt'=>1,'b'=>1,'cp'=>array('p')),
+		'tbody'=>array('c'=>"\0\2",'ac'=>"\0\200\0\0\100",'nt'=>1,'b'=>1,'cp'=>array('tbody','td','tfoot','th','thead','tr')),
+		'td'=>array('c'=>"\200\0\40",'ac'=>"\1",'b'=>1,'cp'=>array('td','th')),
+		'template'=>array('c'=>"\25\200\20",'nt'=>1),
+		'textarea'=>array('c'=>"\117",'pre'=>1,'to'=>1),
+		'tfoot'=>array('c'=>"\0\2",'ac'=>"\0\200\0\0\100",'nt'=>1,'b'=>1,'cp'=>array('tbody','td','th','thead','tr')),
+		'th'=>array('c'=>"\0\0\40",'ac'=>"\1",'dd'=>"\0\5\0\40",'b'=>1,'cp'=>array('td','th')),
+		'thead'=>array('c'=>"\0\2",'ac'=>"\0\200\0\0\100",'nt'=>1,'b'=>1),
+		'time'=>array('c'=>"\7",'ac'=>"\4",'ac2'=>'@datetime'),
+		'title'=>array('c'=>"\20",'to'=>1,'b'=>1),
+		'tr'=>array('c'=>"\0\2\0\0\100",'ac'=>"\0\200\40",'nt'=>1,'b'=>1,'cp'=>array('td','th','tr')),
+		'track'=>array('c'=>"\0\0\0\100",'nt'=>1,'e'=>1,'v'=>1,'b'=>1),
+		'u'=>array('c'=>"\7",'ac'=>"\4",'fe'=>1),
+		'ul'=>array('c'=>"\3",'c1'=>'li','ac'=>"\0\200\0\0\200",'nt'=>1,'b'=>1,'cp'=>array('p')),
+		'var'=>array('c'=>"\7",'ac'=>"\4"),
+		'video'=>array('c'=>"\57",'c3'=>'@controls','ac'=>"\0\0\0\104",'ac26'=>'not(@src)','dd'=>"\0\0\0\0\0\2",'dd41'=>'@src','t'=>1),
+		'wbr'=>array('c'=>"\5",'nt'=>1,'e'=>1,'v'=>1)
+	);
+	protected function getBitfield($elName, $k, DOMElement $node)
+	{
+		if (!isset(self::$htmlElements[$elName][$k]))
+			return "\0";
+		$bitfield = self::$htmlElements[$elName][$k];
+		foreach (\str_split($bitfield, 1) as $byteNumber => $char)
+		{
+			$byteValue = \ord($char);
+			for ($bitNumber = 0; $bitNumber < 8; ++$bitNumber)
+			{
+				$bitValue = 1 << $bitNumber;
+				if (!($byteValue & $bitValue))
+					continue;
+				$n = $byteNumber * 8 + $bitNumber;
+				if (isset(self::$htmlElements[$elName][$k . $n]))
+				{
+					$xpath = 'boolean(' . self::$htmlElements[$elName][$k . $n] . ')';
+					if (!$this->evaluate($xpath, $node))
+					{
+						$byteValue ^= $bitValue;
+						$bitfield[$byteNumber] = \chr($byteValue);
+					}
+				}
+			}
+		}
+		return $bitfield;
+	}
+	protected function hasProperty($elName, $propName, DOMElement $node)
+	{
+		if (!empty(self::$htmlElements[$elName][$propName]))
+			if (!isset(self::$htmlElements[$elName][$propName . '0'])
+			 || $this->evaluate(self::$htmlElements[$elName][$propName . '0'], $node))
+				return \true;
+		return \false;
+	}
+	protected static function match($bitfield1, $bitfield2)
+	{
+		return (\trim($bitfield1 & $bitfield2, "\0") !== '');
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Helpers;
+use DOMAttr;
+use DOMCharacterData;
+use DOMDocument;
+use DOMElement;
+use DOMNode;
+use DOMProcessingInstruction;
+use DOMXPath;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Exceptions\InvalidXslException;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+abstract class TemplateHelper
+{
+	const XMLNS_XSL = 'http://www.w3.org/1999/XSL/Transform';
+	public static function getAttributesByRegexp(DOMDocument $dom, $regexp)
+	{
+		$xpath = new DOMXPath($dom);
+		$nodes = array();
+		foreach ($xpath->query('//@*') as $attribute)
+			if (\preg_match($regexp, $attribute->name))
+				$nodes[] = $attribute;
+		foreach ($xpath->query('//xsl:attribute') as $attribute)
+			if (\preg_match($regexp, $attribute->getAttribute('name')))
+				$nodes[] = $attribute;
+		foreach ($xpath->query('//xsl:copy-of') as $node)
+		{
+			$expr = $node->getAttribute('select');
+			if (\preg_match('/^@(\\w+)$/', $expr, $m)
+			 && \preg_match($regexp, $m[1]))
+				$nodes[] = $node;
+		}
+		return $nodes;
+	}
+	public static function getCSSNodes(DOMDocument $dom)
+	{
+		$regexp = '/^style$/i';
+		$nodes  = \array_merge(
+			self::getAttributesByRegexp($dom, $regexp),
+			self::getElementsByRegexp($dom, '/^style$/i')
+		);
+		return $nodes;
+	}
+	public static function getElementsByRegexp(DOMDocument $dom, $regexp)
+	{
+		$xpath = new DOMXPath($dom);
+		$nodes = array();
+		foreach ($xpath->query('//*') as $element)
+			if (\preg_match($regexp, $element->localName))
+				$nodes[] = $element;
+		foreach ($xpath->query('//xsl:element') as $element)
+			if (\preg_match($regexp, $element->getAttribute('name')))
+				$nodes[] = $element;
+		foreach ($xpath->query('//xsl:copy-of') as $node)
+		{
+			$expr = $node->getAttribute('select');
+			if (\preg_match('/^\\w+$/', $expr)
+			 && \preg_match($regexp, $expr))
+				$nodes[] = $node;
+		}
+		return $nodes;
+	}
+	public static function getJSNodes(DOMDocument $dom)
+	{
+		$regexp = '/^(?>data-s9e-livepreview-postprocess$|on)/i';
+		$nodes  = \array_merge(
+			self::getAttributesByRegexp($dom, $regexp),
+			self::getElementsByRegexp($dom, '/^script$/i')
+		);
+		return $nodes;
+	}
+	public static function getMetaElementsRegexp(array $templates)
+	{
+		$exprs = array();
+		$xsl = '<xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform">' . \implode('', $templates) . '</xsl:template>';
+		$dom = new DOMDocument;
+		$dom->loadXML($xsl);
+		$xpath = new DOMXPath($dom);
+		$query = '//xsl:*/@*[contains("matchselectest", name())]';
+		foreach ($xpath->query($query) as $attribute)
+			$exprs[] = $attribute->value;
+		$query = '//*[namespace-uri() != "' . self::XMLNS_XSL . '"]/@*';
+		foreach ($xpath->query($query) as $attribute)
+			foreach (AVTHelper::parse($attribute->value) as $token)
+				if ($token[0] === 'expression')
+					$exprs[] = $token[1];
+		$tagNames = array(
+			'e' => \true,
+			'i' => \true,
+			's' => \true
+		);
+		foreach (\array_keys($tagNames) as $tagName)
+			if (isset($templates[$tagName]) && $templates[$tagName] !== '')
+				unset($tagNames[$tagName]);
+		$regexp = '(\\b(?<![$@])(' . \implode('|', \array_keys($tagNames)) . ')(?!-)\\b)';
+		\preg_match_all($regexp, \implode("\n", $exprs), $m);
+		foreach ($m[0] as $tagName)
+			unset($tagNames[$tagName]);
+		if (empty($tagNames))
+			return '((?!))';
+		return '(<' . RegexpBuilder::fromList(\array_keys($tagNames)) . '>[^<]*</[^>]+>)';
+	}
+	public static function getObjectParamsByRegexp(DOMDocument $dom, $regexp)
+	{
+		$xpath = new DOMXPath($dom);
+		$nodes = array();
+		foreach (self::getAttributesByRegexp($dom, $regexp) as $attribute)
+			if ($attribute->nodeType === \XML_ATTRIBUTE_NODE)
+			{
+				if (\strtolower($attribute->parentNode->localName) === 'embed')
+					$nodes[] = $attribute;
+			}
+			elseif ($xpath->evaluate('ancestor::embed', $attribute))
+				$nodes[] = $attribute;
+		foreach ($dom->getElementsByTagName('object') as $object)
+			foreach ($object->getElementsByTagName('param') as $param)
+				if (\preg_match($regexp, $param->getAttribute('name')))
+					$nodes[] = $param;
+		return $nodes;
+	}
+	public static function getParametersFromXSL($xsl)
+	{
+		$paramNames = array();
+		$xsl = '<xsl:stylesheet xmlns:xsl="' . self::XMLNS_XSL . '"><xsl:template>'
+		     . $xsl
+		     . '</xsl:template></xsl:stylesheet>';
+		$dom = new DOMDocument;
+		$dom->loadXML($xsl);
+		$xpath = new DOMXPath($dom);
+		$query = '//xsl:*/@match | //xsl:*/@select | //xsl:*/@test';
+		foreach ($xpath->query($query) as $attribute)
+			foreach (XPathHelper::getVariables($attribute->value) as $varName)
+			{
+				$varQuery = 'ancestor-or-self::*/preceding-sibling::xsl:variable[@name="' . $varName . '"]';
+				if (!$xpath->query($varQuery, $attribute)->length)
+					$paramNames[] = $varName;
+			}
+		$query = '//*[namespace-uri() != "' . self::XMLNS_XSL . '"]/@*[contains(., "{")]';
+		foreach ($xpath->query($query) as $attribute)
+		{
+			$tokens = AVTHelper::parse($attribute->value);
+			foreach ($tokens as $token)
+			{
+				if ($token[0] !== 'expression')
+					continue;
+				foreach (XPathHelper::getVariables($token[1]) as $varName)
+				{
+					$varQuery = 'ancestor-or-self::*/preceding-sibling::xsl:variable[@name="' . $varName . '"]';
+					if (!$xpath->query($varQuery, $attribute)->length)
+						$paramNames[] = $varName;
+				}
+			}
+		}
+		$paramNames = \array_unique($paramNames);
+		\sort($paramNames);
+		return $paramNames;
+	}
+	public static function getURLNodes(DOMDocument $dom)
+	{
+		$regexp = '/(?>^(?>action|background|c(?>ite|lassid|odebase)|data|formaction|href|icon|longdesc|manifest|p(?>luginspage|oster|rofile)|usemap)|src)$/i';
+		$nodes  = self::getAttributesByRegexp($dom, $regexp);
+		foreach (self::getObjectParamsByRegexp($dom, '/^(?:dataurl|movie)$/i') as $param)
+		{
+			$node = $param->getAttributeNode('value');
+			if ($node)
+				$nodes[] = $node;
+		}
+		return $nodes;
+	}
+	public static function highlightNode(DOMNode $node, $prepend, $append)
+	{
+		$uniqid = \uniqid('_');
+		if ($node instanceof DOMAttr)
+			$node->value .= $uniqid;
+		elseif ($node instanceof DOMElement)
+			$node->setAttribute($uniqid, '');
+		elseif ($node instanceof DOMCharacterData
+		     || $node instanceof DOMProcessingInstruction)
+			$node->data .= $uniqid;
+		$dom = $node->ownerDocument;
+		$dom->formatOutput = \true;
+		$docXml = self::innerXML($dom->documentElement);
+		$docXml = \trim(\str_replace("\n  ", "\n", $docXml));
+		$nodeHtml = \htmlspecialchars(\trim($dom->saveXML($node)));
+		$docHtml  = \htmlspecialchars($docXml);
+		$html = \str_replace($nodeHtml, $prepend . $nodeHtml . $append, $docHtml);
+		if ($node instanceof DOMAttr)
+		{
+			$node->value = \substr($node->value, 0, -\strlen($uniqid));
+			$html = \str_replace($uniqid, '', $html);
+		}
+		elseif ($node instanceof DOMElement)
+		{
+			$node->removeAttribute($uniqid);
+			$html = \str_replace(' ' . $uniqid . '=&quot;&quot;', '', $html);
+		}
+		elseif ($node instanceof DOMCharacterData
+		     || $node instanceof DOMProcessingInstruction)
+		{
+			$node->data .= $uniqid;
+			$html = \str_replace($uniqid, '', $html);
+		}
+		return $html;
+	}
+	public static function loadTemplate($template)
+	{
+		$dom = self::loadTemplateAsXML($template);
+		if ($dom)
+			return $dom;
+		$dom = self::loadTemplateAsXML(self::fixEntities($template));
+		if ($dom)
+			return $dom;
+		if (\strpos($template, '<xsl:') !== \false)
+		{
+			$error = \libxml_get_last_error();
+			throw new InvalidXslException($error->message);
+		}
+		return self::loadTemplateAsHTML($template);
+	}
+	public static function replaceHomogeneousTemplates(array &$templates, $minCount = 3)
+	{
+		$tagNames = array();
+		$expr = 'name()';
+		foreach ($templates as $tagName => $template)
+		{
+			$elName = \strtolower(\preg_replace('/^[^:]+:/', '', $tagName));
+			if ($template === '<' . $elName . '><xsl:apply-templates/></' . $elName . '>')
+			{
+				$tagNames[] = $tagName;
+				if (\strpos($tagName, ':') !== \false)
+					$expr = 'local-name()';
+			}
+		}
+		if (\count($tagNames) < $minCount)
+			return;
+		$chars = \preg_replace('/[^A-Z]+/', '', \count_chars(\implode('', $tagNames), 3));
+		if (\is_string($chars) && $chars !== '')
+			$expr = 'translate(' . $expr . ",'" . $chars . "','" . \strtolower($chars) . "')";
+		$template = '<xsl:element name="{' . $expr . '}"><xsl:apply-templates/></xsl:element>';
+		foreach ($tagNames as $tagName)
+			$templates[$tagName] = $template;
+	}
+	public static function replaceTokens($template, $regexp, $fn)
+	{
+		if ($template === '')
+			return $template;
+		$dom   = self::loadTemplate($template);
+		$xpath = new DOMXPath($dom);
+		foreach ($xpath->query('//@*') as $attribute)
+		{
+			$attrValue = \preg_replace_callback(
+				$regexp,
+				function ($m) use ($fn, $attribute)
+				{
+					$replacement = $fn($m, $attribute);
+					if ($replacement[0] === 'expression')
+						return '{' . $replacement[1] . '}';
+					elseif ($replacement[0] === 'passthrough')
+						return '{.}';
+					else
+						return $replacement[1];
+				},
+				$attribute->value
+			);
+			$attribute->value = \htmlspecialchars($attrValue, \ENT_COMPAT, 'UTF-8');
+		}
+		foreach ($xpath->query('//text()') as $node)
+		{
+			\preg_match_all(
+				$regexp,
+				$node->textContent,
+				$matches,
+				\PREG_SET_ORDER | \PREG_OFFSET_CAPTURE
+			);
+			if (empty($matches))
+				continue;
+			$parentNode = $node->parentNode;
+			$lastPos = 0;
+			foreach ($matches as $m)
+			{
+				$pos = $m[0][1];
+				if ($pos > $lastPos)
+					$parentNode->insertBefore(
+						$dom->createTextNode(
+							\substr($node->textContent, $lastPos, $pos - $lastPos)
+						),
+						$node
+					);
+				$lastPos = $pos + \strlen($m[0][0]);
+				$_m = array();
+				foreach ($m as $capture)
+					$_m[] = $capture[0];
+				$replacement = $fn($_m, $node);
+				if ($replacement[0] === 'expression')
+					$parentNode
+						->insertBefore(
+							$dom->createElementNS(self::XMLNS_XSL, 'xsl:value-of'),
+							$node
+						)
+						->setAttribute('select', $replacement[1]);
+				elseif ($replacement[0] === 'passthrough')
+					$parentNode->insertBefore(
+						$dom->createElementNS(self::XMLNS_XSL, 'xsl:apply-templates'),
+						$node
+					);
+				else
+					$parentNode->insertBefore($dom->createTextNode($replacement[1]), $node);
+			}
+			$text = \substr($node->textContent, $lastPos);
+			if ($text > '')
+				$parentNode->insertBefore($dom->createTextNode($text), $node);
+			$parentNode->removeChild($node);
+		}
+		return self::saveTemplate($dom);
+	}
+	public static function saveTemplate(DOMDocument $dom)
+	{
+		return self::innerXML($dom->documentElement);
+	}
+	protected static function fixEntities($template)
+	{
+		return \preg_replace_callback(
+			'(&(?!quot;|amp;|apos;|lt;|gt;)\\w+;)',
+			function ($m)
+			{
+				return \html_entity_decode($m[0], \ENT_NOQUOTES, 'UTF-8');
+			},
+			\preg_replace('(&(?![A-Za-z0-9]+;|#\\d+;|#x[A-Fa-f0-9]+;))', '&amp;', $template)
+		);
+	}
+	protected static function innerXML(DOMElement $element)
+	{
+		$xml = $element->ownerDocument->saveXML($element);
+		$pos = 1 + \strpos($xml, '>');
+		$len = \strrpos($xml, '<') - $pos;
+		if ($len < 1)
+			return '';
+		$xml = \substr($xml, $pos, $len);
+		return $xml;
+	}
+	protected static function loadTemplateAsHTML($template)
+	{
+		$dom  = new DOMDocument;
+		$html = '<?xml version="1.0" encoding="utf-8" ?><html><body><div>' . $template . '</div></body></html>';
+		$useErrors = \libxml_use_internal_errors(\true);
+		$dom->loadHTML($html);
+		self::removeInvalidAttributes($dom);
+		\libxml_use_internal_errors($useErrors);
+		$xml = '<?xml version="1.0" encoding="utf-8" ?><xsl:template xmlns:xsl="' . self::XMLNS_XSL . '">' . self::innerXML($dom->documentElement->firstChild->firstChild) . '</xsl:template>';
+		$useErrors = \libxml_use_internal_errors(\true);
+		$dom->loadXML($xml);
+		\libxml_use_internal_errors($useErrors);
+		return $dom;
+	}
+	protected static function loadTemplateAsXML($template)
+	{
+		$xml = '<?xml version="1.0" encoding="utf-8" ?><xsl:template xmlns:xsl="' . self::XMLNS_XSL . '">' . $template . '</xsl:template>';
+		$useErrors = \libxml_use_internal_errors(\true);
+		$dom       = new DOMDocument;
+		$success   = $dom->loadXML($xml);
+		self::removeInvalidAttributes($dom);
+		\libxml_use_internal_errors($useErrors);
+		return ($success) ? $dom : \false;
+	}
+	protected static function removeInvalidAttributes(DOMDocument $dom)
+	{
+		$xpath = new DOMXPath($dom);
+		foreach ($xpath->query('//@*') as $attribute)
+			if (!\preg_match('(^(?:[-\\w]+:)?(?!\\d)[-\\w]+$)D', $attribute->nodeName))
+				$attribute->parentNode->removeAttributeNode($attribute);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Helpers;
+use DOMDocument;
+use DOMElement;
+use DOMNode;
+use DOMXPath;
+use RuntimeException;
+class TemplateParser
+{
+	const XMLNS_XSL = 'http://www.w3.org/1999/XSL/Transform';
+	public static $voidRegexp = '/^(?:area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/Di';
+	public static function parse($template)
+	{
+		$xsl = '<xsl:template xmlns:xsl="' . self::XMLNS_XSL . '">' . $template . '</xsl:template>';
+		$dom = new DOMDocument;
+		$dom->loadXML($xsl);
+		$ir = new DOMDocument;
+		$ir->loadXML('<template/>');
+		self::parseChildren($ir->documentElement, $dom->documentElement);
+		self::normalize($ir);
+		return $ir;
+	}
+	public static function parseEqualityExpr($expr)
+	{
+		$eq = '(?<equality>(?<key>@[-\\w]+|\\$\\w+|\\.)(?<operator>\\s*=\\s*)(?:(?<literal>(?<string>"[^"]*"|\'[^\']*\')|0|[1-9][0-9]*)|(?<concat>concat\\(\\s*(?&string)\\s*(?:,\\s*(?&string)\\s*)+\\)))|(?:(?<literal>(?&literal))|(?<concat>(?&concat)))(?&operator)(?<key>(?&key)))';
+		$regexp = '(^(?J)\\s*' . $eq . '\\s*(?:or\\s*(?&equality)\\s*)*$)';
+		if (!\preg_match($regexp, $expr))
+			return \false;
+		\preg_match_all("((?J)$eq)", $expr, $matches, \PREG_SET_ORDER);
+		$map = array();
+		foreach ($matches as $m)
+		{
+			$key = $m['key'];
+			if (!empty($m['concat']))
+			{
+				\preg_match_all('(\'[^\']*\'|"[^"]*")', $m['concat'], $strings);
+				$value = '';
+				foreach ($strings[0] as $string)
+					$value .= \substr($string, 1, -1);
+			}
+			else
+			{
+				$value = $m['literal'];
+				if ($value[0] === "'" || $value[0] === '"')
+					$value = \substr($value, 1, -1);
+			}
+			$map[$key][] = $value;
+		}
+		return $map;
+	}
+	protected static function parseChildren(DOMElement $ir, DOMElement $parent)
+	{
+		foreach ($parent->childNodes as $child)
+		{
+			switch ($child->nodeType)
+			{
+				case \XML_COMMENT_NODE:
+					break;
+				case \XML_TEXT_NODE:
+					if (\trim($child->textContent) !== '')
+						self::appendOutput($ir, 'literal', $child->textContent);
+					break;
+				case \XML_ELEMENT_NODE:
+					self::parseNode($ir, $child);
+					break;
+				default:
+					throw new RuntimeException("Cannot parse node '" . $child->nodeName . "''");
+			}
+		}
+	}
+	protected static function parseNode(DOMElement $ir, DOMElement $node)
+	{
+		if ($node->namespaceURI === self::XMLNS_XSL)
+		{
+			$methodName = 'parseXsl' . \str_replace(' ', '', \ucwords(\str_replace('-', ' ', $node->localName)));
+			if (!\method_exists(__CLASS__, $methodName))
+				throw new RuntimeException("Element '" . $node->nodeName . "' is not supported");
+			return self::$methodName($ir, $node);
+		}
+		if (!\is_null($node->namespaceURI))
+			throw new RuntimeException("Namespaced element '" . $node->nodeName . "' is not supported");
+		$element = self::appendElement($ir, 'element');
+		$element->setAttribute('name', $node->localName);
+		foreach ($node->attributes as $attribute)
+		{
+			$irAttribute = self::appendElement($element, 'attribute');
+			$irAttribute->setAttribute('name', $attribute->name);
+			self::appendOutput($irAttribute, 'avt', $attribute->value);
+		}
+		self::parseChildren($element, $node);
+	}
+	protected static function parseXslApplyTemplates(DOMElement $ir, DOMElement $node)
+	{
+		$applyTemplates = self::appendElement($ir, 'applyTemplates');
+		if ($node->hasAttribute('select'))
+			$applyTemplates->setAttribute(
+				'select',
+				$node->getAttribute('select')
+			);
+	}
+	protected static function parseXslAttribute(DOMElement $ir, DOMElement $node)
+	{
+		$attrName = $node->getAttribute('name');
+		if ($attrName !== '')
+		{
+			$attribute = self::appendElement($ir, 'attribute');
+			$attribute->setAttribute('name', $attrName);
+			self::parseChildren($attribute, $node);
+		}
+	}
+	protected static function parseXslChoose(DOMElement $ir, DOMElement $node)
+	{
+		$switch = self::appendElement($ir, 'switch');
+		foreach ($node->getElementsByTagNameNS(self::XMLNS_XSL, 'when') as $when)
+		{
+			if ($when->parentNode !== $node)
+				continue;
+			$case = self::appendElement($switch, 'case');
+			$case->setAttribute('test', $when->getAttribute('test'));
+			self::parseChildren($case, $when);
+		}
+		foreach ($node->getElementsByTagNameNS(self::XMLNS_XSL, 'otherwise') as $otherwise)
+		{
+			if ($otherwise->parentNode !== $node)
+				continue;
+			$case = self::appendElement($switch, 'case');
+			self::parseChildren($case, $otherwise);
+			break;
+		}
+	}
+	protected static function parseXslComment(DOMElement $ir, DOMElement $node)
+	{
+		$comment = self::appendElement($ir, 'comment');
+		self::parseChildren($comment, $node);
+	}
+	protected static function parseXslCopyOf(DOMElement $ir, DOMElement $node)
+	{
+		$expr = $node->getAttribute('select');
+		if (\preg_match('#^@([-\\w]+)$#', $expr, $m))
+		{
+			$switch = self::appendElement($ir, 'switch');
+			$case   = self::appendElement($switch, 'case');
+			$case->setAttribute('test', $expr);
+			$attribute = self::appendElement($case, 'attribute');
+			$attribute->setAttribute('name', $m[1]);
+			self::appendOutput($attribute, 'xpath', $expr);
+			return;
+		}
+		if ($expr === '@*')
+		{
+			self::appendElement($ir, 'copyOfAttributes');
+			return;
+		}
+		throw new RuntimeException("Unsupported <xsl:copy-of/> expression '" . $expr . "'");
+	}
+	protected static function parseXslElement(DOMElement $ir, DOMElement $node)
+	{
+		$elName = $node->getAttribute('name');
+		if ($elName !== '')
+		{
+			$element = self::appendElement($ir, 'element');
+			$element->setAttribute('name', $elName);
+			self::parseChildren($element, $node);
+		}
+	}
+	protected static function parseXslIf(DOMElement $ir, DOMElement $node)
+	{
+		$switch = self::appendElement($ir, 'switch');
+		$case   = self::appendElement($switch, 'case');
+		$case->setAttribute('test', $node->getAttribute('test'));
+		self::parseChildren($case, $node);
+	}
+	protected static function parseXslText(DOMElement $ir, DOMElement $node)
+	{
+		self::appendOutput($ir, 'literal', $node->textContent);
+	}
+	protected static function parseXslValueOf(DOMElement $ir, DOMElement $node)
+	{
+		self::appendOutput($ir, 'xpath', $node->getAttribute('select'));
+	}
+	protected static function normalize(DOMDocument $ir)
+	{
+		self::addDefaultCase($ir);
+		self::addElementIds($ir);
+		self::addCloseTagElements($ir);
+		self::markEmptyElements($ir);
+		self::optimize($ir);
+		self::markConditionalCloseTagElements($ir);
+		self::setOutputContext($ir);
+		self::markBranchTables($ir);
+	}
+	protected static function addDefaultCase(DOMDocument $ir)
+	{
+		$xpath = new DOMXPath($ir);
+		foreach ($xpath->query('//switch[not(case[not(@test)])]') as $switch)
+			self::appendElement($switch, 'case');
+	}
+	protected static function addElementIds(DOMDocument $ir)
+	{
+		$id = 0;
+		foreach ($ir->getElementsByTagName('element') as $element)
+			$element->setAttribute('id', ++$id);
+	}
+	protected static function addCloseTagElements(DOMDocument $ir)
+	{
+		$xpath = new DOMXPath($ir);
+		$exprs = array(
+			'//applyTemplates[not(ancestor::attribute)]',
+			'//comment',
+			'//element',
+			'//output[not(ancestor::attribute)]'
+		);
+		foreach ($xpath->query(\implode('|', $exprs)) as $node)
+		{
+			$parentElementId = self::getParentElementId($node);
+			if (isset($parentElementId))
+				$node->parentNode
+				     ->insertBefore($ir->createElement('closeTag'), $node)
+				     ->setAttribute('id', $parentElementId);
+			if ($node->nodeName === 'element')
+			{
+				$id = $node->getAttribute('id');
+				self::appendElement($node, 'closeTag')->setAttribute('id', $id);
+			}
+		}
+	}
+	protected static function markConditionalCloseTagElements(DOMDocument $ir)
+	{
+		$xpath = new DOMXPath($ir);
+		foreach ($ir->getElementsByTagName('closeTag') as $closeTag)
+		{
+			$id = $closeTag->getAttribute('id');
+			$query = 'ancestor::switch/following-sibling::*/descendant-or-self::closeTag[@id = "' . $id . '"]';
+			foreach ($xpath->query($query, $closeTag) as $following)
+			{
+				$following->setAttribute('check', '');
+				$closeTag->setAttribute('set', '');
+			}
+		}
+	}
+	protected static function markEmptyElements(DOMDocument $ir)
+	{
+		foreach ($ir->getElementsByTagName('element') as $element)
+		{
+			$elName = $element->getAttribute('name');
+			if (\strpos($elName, '{') !== \false)
+				$element->setAttribute('void', 'maybe');
+			elseif (\preg_match(self::$voidRegexp, $elName))
+				$element->setAttribute('void', 'yes');
+			$isEmpty = self::isEmpty($element);
+			if ($isEmpty === 'yes' || $isEmpty === 'maybe')
+				$element->setAttribute('empty', $isEmpty);
+		}
+	}
+	protected static function getOutputContext(DOMNode $output)
+	{
+		$xpath = new DOMXPath($output->ownerDocument);
+		if ($xpath->evaluate('boolean(ancestor::attribute)', $output))
+			return 'attribute';
+		if ($xpath->evaluate('boolean(ancestor::element[@name="script"])', $output))
+			return 'raw';
+		return 'text';
+	}
+	protected static function getParentElementId(DOMNode $node)
+	{
+		$parentNode = $node->parentNode;
+		while (isset($parentNode))
+		{
+			if ($parentNode->nodeName === 'element')
+				return $parentNode->getAttribute('id');
+			$parentNode = $parentNode->parentNode;
+		}
+	}
+	protected static function setOutputContext(DOMDocument $ir)
+	{
+		foreach ($ir->getElementsByTagName('output') as $output)
+			$output->setAttribute('escape', self::getOutputContext($output));
+	}
+	protected static function optimize(DOMDocument $ir)
+	{
+		$xml = $ir->saveXML();
+		$remainingLoops = 10;
+		do
+		{
+			$old = $xml;
+			self::optimizeCloseTagElements($ir);
+			$xml = $ir->saveXML();
+		}
+		while (--$remainingLoops > 0 && $xml !== $old);
+		self::removeCloseTagSiblings($ir);
+		self::removeContentFromVoidElements($ir);
+		self::mergeConsecutiveLiteralOutputElements($ir);
+		self::removeEmptyDefaultCases($ir);
+	}
+	protected static function removeCloseTagSiblings(DOMDocument $ir)
+	{
+		$xpath = new DOMXPath($ir);
+		$query = '//switch[not(case[not(closeTag)])]/following-sibling::closeTag';
+		foreach ($xpath->query($query) as $closeTag)
+			$closeTag->parentNode->removeChild($closeTag);
+	}
+	protected static function removeEmptyDefaultCases(DOMDocument $ir)
+	{
+		$xpath = new DOMXPath($ir);
+		foreach ($xpath->query('//case[not(@test | node())]') as $case)
+			$case->parentNode->removeChild($case);
+	}
+	protected static function mergeConsecutiveLiteralOutputElements(DOMDocument $ir)
+	{
+		$xpath = new DOMXPath($ir);
+		foreach ($xpath->query('//output[@type="literal"]') as $output)
+			while ($output->nextSibling
+				&& $output->nextSibling->nodeName === 'output'
+				&& $output->nextSibling->getAttribute('type') === 'literal')
+			{
+				$output->nodeValue
+					= \htmlspecialchars($output->nodeValue . $output->nextSibling->nodeValue);
+				$output->parentNode->removeChild($output->nextSibling);
+			}
+	}
+	protected static function optimizeCloseTagElements(DOMDocument $ir)
+	{
+		self::cloneCloseTagElementsIntoSwitch($ir);
+		self::cloneCloseTagElementsOutOfSwitch($ir);
+		self::removeRedundantCloseTagElementsInSwitch($ir);
+		self::removeRedundantCloseTagElements($ir);
+	}
+	protected static function cloneCloseTagElementsIntoSwitch(DOMDocument $ir)
+	{
+		$xpath = new DOMXPath($ir);
+		$query = '//switch[name(following-sibling::*) = "closeTag"]';
+		foreach ($xpath->query($query) as $switch)
+		{
+			$closeTag = $switch->nextSibling;
+			foreach ($switch->childNodes as $case)
+				if (!$case->lastChild || $case->lastChild->nodeName !== 'closeTag')
+					$case->appendChild($closeTag->cloneNode());
+		}
+	}
+	protected static function cloneCloseTagElementsOutOfSwitch(DOMDocument $ir)
+	{
+		$xpath = new DOMXPath($ir);
+		$query = '//switch[not(preceding-sibling::closeTag)]';
+		foreach ($xpath->query($query) as $switch)
+		{
+			foreach ($switch->childNodes as $case)
+				if (!$case->firstChild || $case->firstChild->nodeName !== 'closeTag')
+					continue 2;
+			$switch->parentNode->insertBefore($switch->lastChild->firstChild->cloneNode(), $switch);
+		}
+	}
+	protected static function removeRedundantCloseTagElementsInSwitch(DOMDocument $ir)
+	{
+		$xpath = new DOMXPath($ir);
+		$query = '//switch[name(following-sibling::*) = "closeTag"]';
+		foreach ($xpath->query($query) as $switch)
+			foreach ($switch->childNodes as $case)
+				while ($case->lastChild && $case->lastChild->nodeName === 'closeTag')
+					$case->removeChild($case->lastChild);
+	}
+	protected static function removeRedundantCloseTagElements(DOMDocument $ir)
+	{
+		$xpath = new DOMXPath($ir);
+		foreach ($xpath->query('//closeTag') as $closeTag)
+		{
+			$id    = $closeTag->getAttribute('id');
+			$query = 'following-sibling::*/descendant-or-self::closeTag[@id="' . $id . '"]';
+			foreach ($xpath->query($query, $closeTag) as $dupe)
+				$dupe->parentNode->removeChild($dupe);
+		}
+	}
+	protected static function removeContentFromVoidElements(DOMDocument $ir)
+	{
+		$xpath = new DOMXPath($ir);
+		foreach ($xpath->query('//element[@void="yes"]') as $element)
+		{
+			$id    = $element->getAttribute('id');
+			$query = './/closeTag[@id="' . $id . '"]/following-sibling::*';
+			foreach ($xpath->query($query, $element) as $node)
+				$node->parentNode->removeChild($node);
+		}
+	}
+	protected static function markBranchTables(DOMDocument $ir)
+	{
+		$xpath = new DOMXPath($ir);
+		foreach ($xpath->query('//switch[case[2][@test]]') as $switch)
+		{
+			$key = \null;
+			$branchValues = array();
+			foreach ($switch->childNodes as $i => $case)
+			{
+				if (!$case->hasAttribute('test'))
+					continue;
+				$map = self::parseEqualityExpr($case->getAttribute('test'));
+				if ($map === \false)
+					continue 2;
+				if (\count($map) !== 1)
+					continue 2;
+				if (isset($key) && $key !== \key($map))
+					continue 2;
+				$key = \key($map);
+				$branchValues[$i] = \end($map);
+			}
+			$switch->setAttribute('branch-key', $key);
+			foreach ($branchValues as $i => $values)
+			{
+				\sort($values);
+				$switch->childNodes->item($i)->setAttribute('branch-values', \serialize($values));
+			}
+		}
+	}
+	protected static function appendElement(DOMElement $parentNode, $name, $value = '')
+	{
+		if ($value === '')
+			$element = $parentNode->ownerDocument->createElement($name);
+		else
+			$element = $parentNode->ownerDocument->createElement($name, $value);
+		$parentNode->appendChild($element);
+		return $element;
+	}
+	protected static function appendOutput(DOMElement $ir, $type, $content)
+	{
+		if ($type === 'avt')
+		{
+			foreach (AVTHelper::parse($content) as $token)
+			{
+				$type = ($token[0] === 'expression') ? 'xpath' : 'literal';
+				self::appendOutput($ir, $type, $token[1]);
+			}
+			return;
+		}
+		if ($type === 'xpath')
+			$content = \trim($content);
+		if ($type === 'literal' && $content === '')
+			return;
+		self::appendElement($ir, 'output', \htmlspecialchars($content))
+			->setAttribute('type', $type);
+	}
+	protected static function isEmpty(DOMElement $ir)
+	{
+		$xpath = new DOMXPath($ir->ownerDocument);
+		if ($xpath->evaluate('count(comment | element | output[@type="literal"])', $ir))
+			return 'no';
+		$cases = array();
+		foreach ($xpath->query('switch/case', $ir) as $case)
+			$cases[self::isEmpty($case)] = 1;
+		if (isset($cases['maybe']))
+			return 'maybe';
+		if (isset($cases['no']))
+		{
+			if (!isset($cases['yes']))
+				return 'no';
+			return 'maybe';
+		}
+		if ($xpath->evaluate('count(applyTemplates | output[@type="xpath"])', $ir))
+			return 'maybe';
+		return 'yes';
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Helpers;
+use RuntimeException;
+abstract class XPathHelper
+{
+	public static function export($str)
+	{
+		if (\strpos($str, "'") === \false)
+			return "'" . $str . "'";
+		if (\strpos($str, '"') === \false)
+			return '"' . $str . '"';
+		$toks = array();
+		$c = '"';
+		$pos = 0;
+		while ($pos < \strlen($str))
+		{
+			$spn = \strcspn($str, $c, $pos);
+			if ($spn)
+			{
+				$toks[] = $c . \substr($str, $pos, $spn) . $c;
+				$pos += $spn;
+			}
+			$c = ($c === '"') ? "'" : '"';
+		}
+		return 'concat(' . \implode(',', $toks) . ')';
+	}
+	public static function getVariables($expr)
+	{
+		$expr = \preg_replace('/(["\']).*?\\1/s', '$1$1', $expr);
+		\preg_match_all('/\\$(\\w+)/', $expr, $matches);
+		$varNames = \array_unique($matches[1]);
+		\sort($varNames);
+		return $varNames;
+	}
+	public static function isExpressionNumeric($expr)
+	{
+		$expr = \strrev(\preg_replace('(\\((?!\\s*(?!vid(?!\\w))\\w))', ' ', \strrev($expr)));
+		$expr = \str_replace(')', ' ', $expr);
+		if (\preg_match('(^\\s*([$@][-\\w]++|-?\\d++)(?>\\s*(?>[-+*]|div)\\s*(?1))++\\s*$)', $expr))
+			return \true;
+		return \false;
+	}
+	public static function minify($expr)
+	{
+		$old     = $expr;
+		$strings = array();
+		$expr = \preg_replace_callback(
+			'/"[^"]*"|\'[^\']*\'/',
+			function ($m) use (&$strings)
+			{
+				$uniqid = '(' . \sha1(\uniqid()) . ')';
+				$strings[$uniqid] = $m[0];
+				return $uniqid;
+			},
+			\trim($expr)
+		);
+		if (\preg_match('/[\'"]/', $expr))
+			throw new RuntimeException("Cannot parse XPath expression '" . $old . "'");
+		$expr = \preg_replace('/\\s+/', ' ', $expr);
+		$expr = \preg_replace('/([-a-z_0-9]) ([^-a-z_0-9])/i', '$1$2', $expr);
+		$expr = \preg_replace('/([^-a-z_0-9]) ([-a-z_0-9])/i', '$1$2', $expr);
+		$expr = \preg_replace('/(?!- -)([^-a-z_0-9]) ([^-a-z_0-9])/i', '$1$2', $expr);
+		$expr = \preg_replace('/ - ([a-z_0-9])/i', ' -$1', $expr);
+		$expr = \preg_replace('/((?:^|[ \\(])\\d+) div ?/', '$1div', $expr);
+		$expr = \preg_replace('/([^-a-z_0-9]div) (?=[$0-9@])/', '$1', $expr);
+		$expr = \strtr($expr, $strings);
+		return $expr;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items;
+use DOMDocument;
+use s9e\TextFormatter\Configurator\Helpers\TemplateForensics;
+use s9e\TextFormatter\Configurator\Helpers\TemplateHelper;
+use s9e\TextFormatter\Configurator\TemplateNormalizer;
+class Template
+{
+	protected $forensics;
+	protected $isNormalized = \false;
+	protected $template;
+	public function __construct($template)
+	{
+		$this->template = $template;
+	}
+	public function __call($methodName, $args)
+	{
+		return \call_user_func_array(array($this->getForensics(), $methodName), $args);
+	}
+	public function __toString()
+	{
+		return $this->template;
+	}
+	public function asDOM()
+	{
+		$xml = '<xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform">'
+		     . $this->__toString()
+		     . '</xsl:template>';
+		$dom = new TemplateDocument($this);
+		$dom->loadXML($xml);
+		return $dom;
+	}
+	public function getCSSNodes()
+	{
+		return TemplateHelper::getCSSNodes($this->asDOM());
+	}
+	public function getForensics()
+	{
+		if (!isset($this->forensics))
+			$this->forensics = new TemplateForensics($this->__toString());
+		return $this->forensics;
+	}
+	public function getJSNodes()
+	{
+		return TemplateHelper::getJSNodes($this->asDOM());
+	}
+	public function getURLNodes()
+	{
+		return TemplateHelper::getURLNodes($this->asDOM());
+	}
+	public function getParameters()
+	{
+		return TemplateHelper::getParametersFromXSL($this->__toString());
+	}
+	public function isNormalized($bool = \null)
+	{
+		if (isset($bool))
+			$this->isNormalized = $bool;
+		return $this->isNormalized;
+	}
+	public function normalize(TemplateNormalizer $templateNormalizer)
+	{
+		$this->forensics    = \null;
+		$this->template     = $templateNormalizer->normalizeTemplate($this->template);
+		$this->isNormalized = \true;
+	}
+	public function replaceTokens($regexp, $fn)
+	{
+		$this->forensics    = \null;
+		$this->template     = TemplateHelper::replaceTokens($this->template, $regexp, $fn);
+		$this->isNormalized = \false;
+	}
+	public function setContent($template)
+	{
+		$this->forensics    = \null;
+		$this->template     = (string) $template;
+		$this->isNormalized = \false;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript;
+use InvalidArgumentException;
+class FunctionProvider
+{
+	public static $cache = array(
+		'addslashes'=>'function(str)
+{
+	return str.replace(/["\'\\\\]/g, \'\\\\$&\').replace(/\\u0000/g, \'\\\\0\');
+}',
+		'dechex'=>'function(str)
+{
+	return parseInt(str).toString(16);
+}',
+		'intval'=>'function(str)
+{
+	return parseInt(str) || 0;
+}',
+		'ltrim'=>'function(str)
+{
+	return str.replace(/^[ \\n\\r\\t\\0\\x0B]+/g, \'\');
+}',
+		'mb_strtolower'=>'function(str)
+{
+	return str.toLowerCase();
+}',
+		'mb_strtoupper'=>'function(str)
+{
+	return str.toUpperCase();
+}',
+		'mt_rand'=>'function(min, max)
+{
+	return (min + Math.floor(Math.random() * (max + 1 - min)));
+}',
+		'rawurlencode'=>'function(str)
+{
+	return encodeURIComponent(str).replace(
+		/[!\'()*]/g,
+		/**
+		* @param {!string} c
+		*/
+		function(c)
+		{
+			return \'%\' + c.charCodeAt(0).toString(16).toUpperCase();
+		}
+	);
+}',
+		'rtrim'=>'function(str)
+{
+	return str.replace(/[ \\n\\r\\t\\0\\x0B]+$/g, \'\');
+}',
+		'str_rot13'=>'function(str)
+{
+	return str.replace(
+		/[a-z]/gi,
+		function(c)
+		{
+			return String.fromCharCode(c.charCodeAt(0) + ((c.toLowerCase() < \'n\') ? 13 : -13));
+		}
+	);
+}',
+		'stripslashes'=>'function(str)
+{
+	// NOTE: this will not correctly transform \\0 into a NULL byte. I consider this a feature
+	//       rather than a bug. There\'s no reason to use NULL bytes in a text.
+	return str.replace(/\\\\([\\s\\S]?)/g, \'\\\\1\');
+}',
+		'strrev'=>'function(str)
+{
+	return str.split(\'\').reverse().join(\'\');
+}',
+		'strtolower'=>'function(str)
+{
+	return str.toLowerCase();
+}',
+		'strtotime'=>'function(str)
+{
+	return Date.parse(str) / 1000;
+}',
+		'strtoupper'=>'function(str)
+{
+	return str.toUpperCase();
+}',
+		'trim'=>'function(str)
+{
+	return str.replace(/^[ \\n\\r\\t\\0\\x0B]+/g, \'\').replace(/[ \\n\\r\\t\\0\\x0B]+$/g, \'\');
+}',
+		'ucfirst'=>'function(str)
+{
+	return str.charAt(0).toUpperCase() + str.substr(1);
+}',
+		'ucwords'=>'function(str)
+{
+	return str.replace(
+		/(?:^|\\s)[a-z]/g,
+		function(m)
+		{
+			return m.toUpperCase()
+		}
+	);
+}',
+		'urldecode'=>'function(str)
+{
+	return decodeURIComponent(str);
+}',
+		'urlencode'=>'function(str)
+{
+	return encodeURIComponent(str);
+}'
+	);
+	public static function get($funcName)
+	{
+		if (isset(self::$cache[$funcName]))
+			return self::$cache[$funcName];
+		if (\preg_match('(^[a-z_0-9]+$)D', $funcName))
+		{
+			$filepath = __DIR__ . '/Configurator/JavaScript/functions/' . $funcName . '.js';
+			if (\file_exists($filepath))
+				return \file_get_contents($filepath);
+		}
+		throw new InvalidArgumentException("Unknown function '" . $funcName . "'");
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator;
+interface RendererGenerator
+{
+	public function getRenderer(Rendering $rendering);
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RendererGenerators\PHP;
+abstract class AbstractOptimizer
+{
+	protected $cnt;
+	protected $i;
+	protected $changed;
+	protected $tokens;
+	public function optimize($php)
+	{
+		$this->reset($php);
+		$this->optimizeTokens();
+		if ($this->changed)
+			$php = $this->serialize();
+		unset($this->tokens);
+		return $php;
+	}
+	abstract protected function optimizeTokens();
+	protected function reset($php)
+	{
+		$this->tokens  = \token_get_all('<?php ' . $php);
+		$this->i       = 0;
+		$this->cnt     = \count($this->tokens);
+		$this->changed = \false;
+	}
+	protected function serialize()
+	{
+		unset($this->tokens[0]);
+		$php = '';
+		foreach ($this->tokens as $token)
+			$php .= (\is_string($token)) ? $token : $token[1];
+		return $php;
+	}
+	protected function skipToString($str)
+	{
+		while (++$this->i < $this->cnt && $this->tokens[$this->i] !== $str);
+	}
+	protected function skipWhitespace()
+	{
+		while (++$this->i < $this->cnt && $this->tokens[$this->i][0] === \T_WHITESPACE);
+	}
+	protected function unindentBlock($start, $end)
+	{
+		$this->i = $start;
+		do
+		{
+			if ($this->tokens[$this->i][0] === \T_WHITESPACE || $this->tokens[$this->i][0] === \T_DOC_COMMENT)
+				$this->tokens[$this->i][1] = \preg_replace("/^\t/m", '', $this->tokens[$this->i][1]);
+		}
+		while (++$this->i <= $end);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RendererGenerators\PHP;
+class BranchOutputOptimizer
+{
+	protected $cnt;
+	protected $i;
+	protected $tokens;
+	public function optimize(array $tokens)
+	{
+		$this->tokens = $tokens;
+		$this->i      = 0;
+		$this->cnt    = \count($this->tokens);
+		$php = '';
+		while (++$this->i < $this->cnt)
+			if ($this->tokens[$this->i][0] === \T_IF)
+				$php .= $this->serializeIfBlock($this->parseIfBlock());
+			else
+				$php .= $this->serializeToken($this->tokens[$this->i]);
+		unset($this->tokens);
+		return $php;
+	}
+	protected function captureOutput()
+	{
+		$expressions = array();
+		while ($this->skipOutputAssignment())
+		{
+			do
+			{
+				$expressions[] = $this->captureOutputExpression();
+			}
+			while ($this->tokens[$this->i++] === '.');
+		}
+		return $expressions;
+	}
+	protected function captureOutputExpression()
+	{
+		$parens = 0;
+		$php = '';
+		do
+		{
+			if ($this->tokens[$this->i] === ';')
+				break;
+			elseif ($this->tokens[$this->i] === '.' && !$parens)
+				break;
+			elseif ($this->tokens[$this->i] === '(')
+				++$parens;
+			elseif ($this->tokens[$this->i] === ')')
+				--$parens;
+			$php .= $this->serializeToken($this->tokens[$this->i]);
+		}
+		while (++$this->i < $this->cnt);
+		return $php;
+	}
+	protected function captureStructure()
+	{
+		$php = '';
+		do
+		{
+			$php .= $this->serializeToken($this->tokens[$this->i]);
+		}
+		while ($this->tokens[++$this->i] !== '{');
+		++$this->i;
+		return $php;
+	}
+	protected function isBranchToken()
+	{
+		return \in_array($this->tokens[$this->i][0], array(\T_ELSE, \T_ELSEIF, \T_IF), \true);
+	}
+	protected function mergeIfBranches(array $branches)
+	{
+		$lastBranch = \end($branches);
+		if ($lastBranch['structure'] === 'else')
+		{
+			$before = $this->optimizeBranchesHead($branches);
+			$after  = $this->optimizeBranchesTail($branches);
+		}
+		else
+			$before = $after = array();
+		$source = '';
+		foreach ($branches as $branch)
+			$source .= $this->serializeBranch($branch);
+		return array(
+			'before' => $before,
+			'source' => $source,
+			'after'  => $after
+		);
+	}
+	protected function mergeOutput(array $left, array $right)
+	{
+		if (empty($left))
+			return $right;
+		if (empty($right))
+			return $left;
+		$k = \count($left) - 1;
+		if (\substr($left[$k], -1) === "'" && $right[0][0] === "'")
+		{
+			$right[0] = \substr($left[$k], 0, -1) . \substr($right[0], 1);
+			unset($left[$k]);
+		}
+		return \array_merge($left, $right);
+	}
+	protected function optimizeBranchesHead(array &$branches)
+	{
+		$before = $this->optimizeBranchesOutput($branches, 'head');
+		foreach ($branches as &$branch)
+		{
+			if ($branch['body'] !== '' || !empty($branch['tail']))
+				continue;
+			$branch['tail'] = \array_reverse($branch['head']);
+			$branch['head'] = array();
+		}
+		unset($branch);
+		return $before;
+	}
+	protected function optimizeBranchesOutput(array &$branches, $which)
+	{
+		$expressions = array();
+		while (isset($branches[0][$which][0]))
+		{
+			$expr = $branches[0][$which][0];
+			foreach ($branches as $branch)
+				if (!isset($branch[$which][0]) || $branch[$which][0] !== $expr)
+					break 2;
+			$expressions[] = $expr;
+			foreach ($branches as &$branch)
+				\array_shift($branch[$which]);
+			unset($branch);
+		}
+		return $expressions;
+	}
+	protected function optimizeBranchesTail(array &$branches)
+	{
+		return $this->optimizeBranchesOutput($branches, 'tail');
+	}
+	protected function parseBranch()
+	{
+		$structure = $this->captureStructure();
+		$head = $this->captureOutput();
+		$body = '';
+		$tail = array();
+		$braces = 0;
+		do
+		{
+			$tail = $this->mergeOutput($tail, \array_reverse($this->captureOutput()));
+			if ($this->tokens[$this->i] === '}' && !$braces)
+				break;
+			$body .= $this->serializeOutput(\array_reverse($tail));
+			$tail  = array();
+			if ($this->tokens[$this->i][0] === \T_IF)
+			{
+				$child = $this->parseIfBlock();
+				if ($body === '')
+					$head = $this->mergeOutput($head, $child['before']);
+				else
+					$body .= $this->serializeOutput($child['before']);
+				$body .= $child['source'];
+				$tail  = $child['after'];
+			}
+			else
+			{
+				$body .= $this->serializeToken($this->tokens[$this->i]);
+				if ($this->tokens[$this->i] === '{')
+					++$braces;
+				elseif ($this->tokens[$this->i] === '}')
+					--$braces;
+			}
+		}
+		while (++$this->i < $this->cnt);
+		return array(
+			'structure' => $structure,
+			'head'      => $head,
+			'body'      => $body,
+			'tail'      => $tail
+		);
+	}
+	protected function parseIfBlock()
+	{
+		$branches = array();
+		do
+		{
+			$branches[] = $this->parseBranch();
+		}
+		while (++$this->i < $this->cnt && $this->isBranchToken());
+		--$this->i;
+		return $this->mergeIfBranches($branches);
+	}
+	protected function serializeBranch(array $branch)
+	{
+		if ($branch['structure'] === 'else'
+		 && $branch['body']      === ''
+		 && empty($branch['head'])
+		 && empty($branch['tail']))
+			return '';
+		return $branch['structure'] . '{' . $this->serializeOutput($branch['head']) . $branch['body'] . $this->serializeOutput(\array_reverse($branch['tail'])) . '}';
+	}
+	protected function serializeIfBlock(array $block)
+	{
+		return $this->serializeOutput($block['before']) . $block['source'] . $this->serializeOutput(\array_reverse($block['after']));
+	}
+	protected function serializeOutput(array $expressions)
+	{
+		if (empty($expressions))
+			return '';
+		return '$this->out.=' . \implode('.', $expressions) . ';';
+	}
+	protected function serializeToken($token)
+	{
+		return (\is_array($token)) ? $token[1] : $token;
+	}
+	protected function skipOutputAssignment()
+	{
+		if ($this->tokens[$this->i    ][0] !== \T_VARIABLE
+		 || $this->tokens[$this->i    ][1] !== '$this'
+		 || $this->tokens[$this->i + 1][0] !== \T_OBJECT_OPERATOR
+		 || $this->tokens[$this->i + 2][0] !== \T_STRING
+		 || $this->tokens[$this->i + 2][1] !== 'out'
+		 || $this->tokens[$this->i + 3][0] !== \T_CONCAT_EQUAL)
+			 return \false;
+		$this->i += 4;
+		return \true;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RendererGenerators\PHP;
+class Optimizer
+{
+	public $branchOutputOptimizer;
+	protected $cnt;
+	protected $i;
+	public $maxLoops = 10;
+	protected $tokens;
+	public function __construct()
+	{
+		$this->branchOutputOptimizer = new BranchOutputOptimizer;
+	}
+	public function optimize($php)
+	{
+		$this->tokens = \token_get_all('<?php ' . $php);
+		$this->cnt    = \count($this->tokens);
+		$this->i      = 0;
+		foreach ($this->tokens as &$token)
+			if (\is_array($token))
+				unset($token[2]);
+		unset($token);
+		$passes = array(
+			'optimizeOutConcatEqual',
+			'optimizeConcatenations',
+			'optimizeHtmlspecialchars'
+		);
+		$remainingLoops = $this->maxLoops;
+		do
+		{
+			$continue = \false;
+			foreach ($passes as $pass)
+			{
+				$this->$pass();
+				$cnt = \count($this->tokens);
+				if ($this->cnt !== $cnt)
+				{
+					$this->tokens = \array_values($this->tokens);
+					$this->cnt    = $cnt;
+					$continue     = \true;
+				}
+			}
+		}
+		while ($continue && --$remainingLoops);
+		$php = $this->branchOutputOptimizer->optimize($this->tokens);
+		unset($this->tokens);
+		return $php;
+	}
+	protected function isBetweenHtmlspecialcharCalls()
+	{
+		return ($this->tokens[$this->i + 1]    === array(\T_STRING, 'htmlspecialchars')
+		     && $this->tokens[$this->i + 2]    === '('
+		     && $this->tokens[$this->i - 1]    === ')'
+		     && $this->tokens[$this->i - 2][0] === \T_LNUMBER
+		     && $this->tokens[$this->i - 3]    === ',');
+	}
+	protected function isHtmlspecialcharSafeVar()
+	{
+		return ($this->tokens[$this->i    ]    === array(\T_VARIABLE,        '$node')
+		     && $this->tokens[$this->i + 1]    === array(\T_OBJECT_OPERATOR, '->')
+		     && ($this->tokens[$this->i + 2]   === array(\T_STRING,          'localName')
+		      || $this->tokens[$this->i + 2]   === array(\T_STRING,          'nodeName'))
+		     && $this->tokens[$this->i + 3]    === ','
+		     && $this->tokens[$this->i + 4][0] === \T_LNUMBER
+		     && $this->tokens[$this->i + 5]    === ')');
+	}
+	protected function isOutputAssignment()
+	{
+		return ($this->tokens[$this->i    ] === array(\T_VARIABLE,        '$this')
+		     && $this->tokens[$this->i + 1] === array(\T_OBJECT_OPERATOR, '->')
+		     && $this->tokens[$this->i + 2] === array(\T_STRING,          'out')
+		     && $this->tokens[$this->i + 3] === array(\T_CONCAT_EQUAL,    '.='));
+	}
+	protected function isPrecededByOutputVar()
+	{
+		return ($this->tokens[$this->i - 1] === array(\T_STRING,          'out')
+		     && $this->tokens[$this->i - 2] === array(\T_OBJECT_OPERATOR, '->')
+		     && $this->tokens[$this->i - 3] === array(\T_VARIABLE,        '$this'));
+	}
+	protected function mergeConcatenatedHtmlSpecialChars()
+	{
+		if (!$this->isBetweenHtmlspecialcharCalls())
+			 return \false;
+		$escapeMode = $this->tokens[$this->i - 2][1];
+		$startIndex = $this->i - 3;
+		$endIndex = $this->i + 2;
+		$this->i = $endIndex;
+		$parens = 0;
+		while (++$this->i < $this->cnt)
+		{
+			if ($this->tokens[$this->i] === ',' && !$parens)
+				break;
+			if ($this->tokens[$this->i] === '(')
+				++$parens;
+			elseif ($this->tokens[$this->i] === ')')
+				--$parens;
+		}
+		if ($this->tokens[$this->i + 1] !== array(\T_LNUMBER, $escapeMode))
+			return \false;
+		$this->tokens[$startIndex] = '.';
+		$this->i = $startIndex;
+		while (++$this->i <= $endIndex)
+			unset($this->tokens[$this->i]);
+		return \true;
+	}
+	protected function mergeConcatenatedStrings()
+	{
+		if ($this->tokens[$this->i - 1][0]    !== \T_CONSTANT_ENCAPSED_STRING
+		 || $this->tokens[$this->i + 1][0]    !== \T_CONSTANT_ENCAPSED_STRING
+		 || $this->tokens[$this->i - 1][1][0] !== $this->tokens[$this->i + 1][1][0])
+			return \false;
+		$this->tokens[$this->i + 1][1] = \substr($this->tokens[$this->i - 1][1], 0, -1)
+		                               . \substr($this->tokens[$this->i + 1][1], 1);
+		unset($this->tokens[$this->i - 1]);
+		unset($this->tokens[$this->i]);
+		++$this->i;
+		return \true;
+	}
+	protected function optimizeOutConcatEqual()
+	{
+		$this->i = 3;
+		while ($this->skipTo(array(\T_CONCAT_EQUAL, '.=')))
+		{
+			if (!$this->isPrecededByOutputVar())
+				 continue;
+			while ($this->skipPast(';'))
+			{
+				if (!$this->isOutputAssignment())
+					 break;
+				$this->tokens[$this->i - 1] = '.';
+				unset($this->tokens[$this->i++]);
+				unset($this->tokens[$this->i++]);
+				unset($this->tokens[$this->i++]);
+				unset($this->tokens[$this->i++]);
+			}
+		}
+	}
+	protected function optimizeConcatenations()
+	{
+		$this->i = 1;
+		while ($this->skipTo('.'))
+			$this->mergeConcatenatedStrings() || $this->mergeConcatenatedHtmlSpecialChars();
+	}
+	protected function optimizeHtmlspecialchars()
+	{
+		$this->i = 0;
+		while ($this->skipPast(array(\T_STRING, 'htmlspecialchars')))
+			if ($this->tokens[$this->i] === '(')
+			{
+				++$this->i;
+				$this->replaceHtmlspecialcharsLiteral() || $this->removeHtmlspecialcharsSafeVar();
+			}
+	}
+	protected function removeHtmlspecialcharsSafeVar()
+	{
+		if (!$this->isHtmlspecialcharSafeVar())
+			 return \false;
+		unset($this->tokens[$this->i - 2]);
+		unset($this->tokens[$this->i - 1]);
+		unset($this->tokens[$this->i + 3]);
+		unset($this->tokens[$this->i + 4]);
+		unset($this->tokens[$this->i + 5]);
+		$this->i += 6;
+		return \true;
+	}
+	protected function replaceHtmlspecialcharsLiteral()
+	{
+		if ($this->tokens[$this->i    ][0] !== \T_CONSTANT_ENCAPSED_STRING
+		 || $this->tokens[$this->i + 1]    !== ','
+		 || $this->tokens[$this->i + 2][0] !== \T_LNUMBER
+		 || $this->tokens[$this->i + 3]    !== ')')
+			return \false;
+		$this->tokens[$this->i][1] = \var_export(
+			\htmlspecialchars(
+				\stripslashes(\substr($this->tokens[$this->i][1], 1, -1)),
+				$this->tokens[$this->i + 2][1]
+			),
+			\true
+		);
+		unset($this->tokens[$this->i - 2]);
+		unset($this->tokens[$this->i - 1]);
+		unset($this->tokens[++$this->i]);
+		unset($this->tokens[++$this->i]);
+		unset($this->tokens[++$this->i]);
+		return \true;
+	}
+	protected function skipPast($token)
+	{
+		return ($this->skipTo($token) && ++$this->i < $this->cnt);
+	}
+	protected function skipTo($token)
+	{
+		while (++$this->i < $this->cnt)
+			if ($this->tokens[$this->i] === $token)
+				return \true;
+		return \false;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RendererGenerators\PHP;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+class Quick
+{
+	public static function getSource(array $compiledTemplates)
+	{
+		$map = array();
+		$tagNames = array();
+		$unsupported = array();
+		foreach ($compiledTemplates as $tagName => $php)
+		{
+			if (\preg_match('(^(?:br|[ieps])$)', $tagName))
+				continue;
+			$rendering = self::getRenderingStrategy($php);
+			if ($rendering === \false)
+			{
+				$unsupported[] = $tagName;
+				continue;
+			}
+			foreach ($rendering as $i => $_562c18b7)
+			{
+				list($strategy, $replacement) = $_562c18b7;
+				$match = (($i) ? '/' : '') . $tagName;
+				$map[$strategy][$match] = $replacement;
+			}
+			if (!isset($rendering[1]))
+				$tagNames[] = $tagName;
+		}
+		$php = array();
+		if (isset($map['static']))
+			$php[] = '	private static $static=' . self::export($map['static']) . ';';
+		if (isset($map['dynamic']))
+			$php[] = '	private static $dynamic=' . self::export($map['dynamic']) . ';';
+		if (isset($map['php']))
+		{
+			list($quickBranches, $quickSource) = self::generateBranchTable('$qb', $map['php']);
+			$php[] = '	private static $attributes;';
+			$php[] = '	private static $quickBranches=' . self::export($quickBranches) . ';';
+		}
+		if (!empty($unsupported))
+		{
+			$regexp = '(<' . RegexpBuilder::fromList($unsupported, array('useLookahead' => \true)) . '[ />])';
+			$php[] = '	public $quickRenderingTest=' . \var_export($regexp, \true) . ';';
+		}
+		$php[] = '';
+		$php[] = '	protected function renderQuick($xml)';
+		$php[] = '	{';
+		$php[] = '		$xml = $this->decodeSMP($xml);';
+		if (isset($map['php']))
+			$php[] = '		self::$attributes = array();';
+		$regexp  = '(<(?:(?!/)(';
+		$regexp .= ($tagNames) ? RegexpBuilder::fromList($tagNames) : '(?!)';
+		$regexp .= ')(?: [^>]*)?>.*?</\\1|(/?(?!br/|p>)[^ />]+)[^>]*?(/)?)>)s';
+		$php[] = '		$html = preg_replace_callback(';
+		$php[] = '			' . \var_export($regexp, \true) . ',';
+		$php[] = "			array(\$this, 'quick'),";
+		$php[] = '			preg_replace(';
+		$php[] = "				'(<[eis]>[^<]*</[eis]>)',";
+		$php[] = "				'',";
+		$php[] = '				substr($xml, 1 + strpos($xml, \'>\'), -4)';
+		$php[] = '			)';
+		$php[] = '		);';
+		$php[] = '';
+		$php[] = "		return str_replace('<br/>', '<br>', \$html);";
+		$php[] = '	}';
+		$php[] = '';
+		$php[] = '	protected function quick($m)';
+		$php[] = '	{';
+		$php[] = '		if (isset($m[2]))';
+		$php[] = '		{';
+		$php[] = '			$id = $m[2];';
+		$php[] = '';
+		$php[] = '			if (isset($m[3]))';
+		$php[] = '			{';
+		$php[] = '				unset($m[3]);';
+		$php[] = '';
+		$php[] = '				$m[0] = substr($m[0], 0, -2) . \'>\';';
+		$php[] = '				$html = $this->quick($m);';
+		$php[] = '';
+		$php[] = '				$m[0] = \'</\' . $id . \'>\';';
+		$php[] = '				$m[2] = \'/\' . $id;';
+		$php[] = '				$html .= $this->quick($m);';
+		$php[] = '';
+		$php[] = '				return $html;';
+		$php[] = '			}';
+		$php[] = '		}';
+		$php[] = '		else';
+		$php[] = '		{';
+		$php[] = '			$id = $m[1];';
+		$php[] = '';
+		$php[] = '			$lpos = 1 + strpos($m[0], \'>\');';
+		$php[] = '			$rpos = strrpos($m[0], \'<\');';
+		$php[] = '			$textContent = substr($m[0], $lpos, $rpos - $lpos);';
+		$php[] = '';
+		$php[] = '			if (strpos($textContent, \'<\') !== false)';
+		$php[] = '			{';
+		$php[] = '				throw new \\RuntimeException;';
+		$php[] = '			}';
+		$php[] = '';
+		$php[] = '			$textContent = htmlspecialchars_decode($textContent);';
+		$php[] = '		}';
+		$php[] = '';
+		if (isset($map['static']))
+		{
+			$php[] = '		if (isset(self::$static[$id]))';
+			$php[] = '		{';
+			$php[] = '			return self::$static[$id];';
+			$php[] = '		}';
+			$php[] = '';
+		}
+		if (isset($map['dynamic']))
+		{
+			$php[] = '		if (isset(self::$dynamic[$id]))';
+			$php[] = '		{';
+			$php[] = '			list($match, $replace) = self::$dynamic[$id];';
+			$php[] = '			return preg_replace($match, $replace, $m[0], 1);';
+			$php[] = '		}';
+			$php[] = '';
+		}
+		if (isset($map['php']))
+		{
+			$php[] = '		if (!isset(self::$quickBranches[$id]))';
+			$php[] = '		{';
+		}
+		$condition = "\$id[0] === '!' || \$id[0] === '?'";
+		if (!empty($unsupported))
+		{
+			$regexp = '(^/?' . RegexpBuilder::fromList($unsupported) . '$)';
+			$condition .= ' || preg_match(' . \var_export($regexp, \true) . ', $id)';
+		}
+		$php[] = '			if (' . $condition . ')';
+		$php[] = '			{';
+		$php[] = '				throw new \\RuntimeException;';
+		$php[] = '			}';
+		$php[] = "			return '';";
+		if (isset($map['php']))
+		{
+			$php[] = '		}';
+			$php[] = '';
+			$php[] = '		$attributes = array();';
+			$php[] = '		if (strpos($m[0], \'="\') !== false)';
+			$php[] = '		{';
+			$php[] = '			preg_match_all(\'(([^ =]++)="([^"]*))S\', substr($m[0], 0, strpos($m[0], \'>\')), $matches);';
+			$php[] = '			foreach ($matches[1] as $i => $attrName)';
+			$php[] = '			{';
+			$php[] = '				$attributes[$attrName] = $matches[2][$i];';
+			$php[] = '			}';
+			$php[] = '		}';
+			$php[] = '';
+			$php[] = '		$qb = self::$quickBranches[$id];';
+			$php[] = '		' . $quickSource;
+			$php[] = '';
+			$php[] = '		return $html;';
+		}
+		$php[] = '	}';
+		return \implode("\n", $php);
+	}
+	protected static function export(array $arr)
+	{
+		$exportKeys = (\array_keys($arr) !== \range(0, \count($arr) - 1));
+		\ksort($arr);
+		$entries = array();
+		foreach ($arr as $k => $v)
+			$entries[] = (($exportKeys) ? \var_export($k, \true) . '=>' : '')
+			           . ((\is_array($v)) ? self::export($v) : \var_export($v, \true));
+		return 'array(' . \implode(',', $entries) . ')';
+	}
+	public static function getRenderingStrategy($php)
+	{
+		$chunks = \explode('$this->at($node);', $php);
+		$renderings = array();
+		if (\count($chunks) <= 2)
+		{
+			foreach ($chunks as $k => $chunk)
+			{
+				$rendering = self::getStaticRendering($chunk);
+				if ($rendering !== \false)
+				{
+					$renderings[$k] = array('static', $rendering);
+					continue;
+				}
+				if ($k === 0)
+				{
+					$rendering = self::getDynamicRendering($chunk);
+					if ($rendering !== \false)
+					{
+						$renderings[$k] = array('dynamic', $rendering);
+						continue;
+					}
+				}
+				$renderings[$k] = \false;
+			}
+			if (!\in_array(\false, $renderings, \true))
+				return $renderings;
+		}
+		$phpRenderings = self::getQuickRendering($php);
+		if ($phpRenderings === \false)
+			return \false;
+		foreach ($phpRenderings as $i => $phpRendering)
+			if (!isset($renderings[$i]) || $renderings[$i] === \false || \strpos($phpRendering, 'self::$attributes[]') !== \false)
+				$renderings[$i] = array('php', $phpRendering);
+		return $renderings;
+	}
+	protected static function getQuickRendering($php)
+	{
+		if (\preg_match('(\\$this->at\\((?!\\$node\\);))', $php))
+			return \false;
+		$tokens   = \token_get_all('<?php ' . $php);
+		$tokens[] = array(0, '');
+		\array_shift($tokens);
+		$cnt = \count($tokens);
+		$branch = array(
+			'braces'      => -1,
+			'branches'    => array(),
+			'head'        => '',
+			'passthrough' => 0,
+			'statement'   => '',
+			'tail'        => ''
+		);
+		$braces = 0;
+		$i = 0;
+		do
+		{
+			if ($tokens[$i    ][0] === \T_VARIABLE
+			 && $tokens[$i    ][1] === '$this'
+			 && $tokens[$i + 1][0] === \T_OBJECT_OPERATOR
+			 && $tokens[$i + 2][0] === \T_STRING
+			 && $tokens[$i + 2][1] === 'at'
+			 && $tokens[$i + 3]    === '('
+			 && $tokens[$i + 4][0] === \T_VARIABLE
+			 && $tokens[$i + 4][1] === '$node'
+			 && $tokens[$i + 5]    === ')'
+			 && $tokens[$i + 6]    === ';')
+			{
+				if (++$branch['passthrough'] > 1)
+					return \false;
+				$i += 6;
+				continue;
+			}
+			$key = ($branch['passthrough']) ? 'tail' : 'head';
+			$branch[$key] .= (\is_array($tokens[$i])) ? $tokens[$i][1] : $tokens[$i];
+			if ($tokens[$i] === '{')
+			{
+				++$braces;
+				continue;
+			}
+			if ($tokens[$i] === '}')
+			{
+				--$braces;
+				if ($branch['braces'] === $braces)
+				{
+					$branch[$key] = \substr($branch[$key], 0, -1);
+					$branch =& $branch['parent'];
+					$j = $i;
+					while ($tokens[++$j][0] === \T_WHITESPACE);
+					if ($tokens[$j][0] !== \T_ELSEIF
+					 && $tokens[$j][0] !== \T_ELSE)
+					{
+						$passthroughs = self::getBranchesPassthrough($branch['branches']);
+						if ($passthroughs === array(0))
+						{
+							foreach ($branch['branches'] as $child)
+								$branch['head'] .= $child['statement'] . '{' . $child['head'] . '}';
+							$branch['branches'] = array();
+							continue;
+						}
+						if ($passthroughs === array(1))
+						{
+							++$branch['passthrough'];
+							continue;
+						}
+						return \false;
+					}
+				}
+				continue;
+			}
+			if ($branch['passthrough'])
+				continue;
+			if ($tokens[$i][0] === \T_IF
+			 || $tokens[$i][0] === \T_ELSEIF
+			 || $tokens[$i][0] === \T_ELSE)
+			{
+				$branch[$key] = \substr($branch[$key], 0, -\strlen($tokens[$i][1]));
+				$branch['branches'][] = array(
+					'braces'      => $braces,
+					'branches'    => array(),
+					'head'        => '',
+					'parent'      => &$branch,
+					'passthrough' => 0,
+					'statement'   => '',
+					'tail'        => ''
+				);
+				$branch =& $branch['branches'][\count($branch['branches']) - 1];
+				do
+				{
+					$branch['statement'] .= (\is_array($tokens[$i])) ? $tokens[$i][1] : $tokens[$i];
+				}
+				while ($tokens[++$i] !== '{');
+				++$braces;
+			}
+		}
+		while (++$i < $cnt);
+		list($head, $tail) = self::buildPHP($branch['branches']);
+		$head  = $branch['head'] . $head;
+		$tail .= $branch['tail'];
+		self::convertPHP($head, $tail, (bool) $branch['passthrough']);
+		if (\preg_match('((?<!-)->(?!params\\[))', $head . $tail))
+			return \false;
+		return ($branch['passthrough']) ? array($head, $tail) : array($head);
+	}
+	protected static function convertPHP(&$head, &$tail, $passthrough)
+	{
+		$saveAttributes = (bool) \preg_match('(\\$node->(?:get|has)Attribute)', $tail);
+		\preg_match_all(
+			"(\\\$node->getAttribute\\('([^']+)'\\))",
+			\preg_replace_callback(
+				'(if\\(\\$node->hasAttribute\\(([^\\)]+)[^}]+)',
+				function ($m)
+				{
+					return \str_replace('$node->getAttribute(' . $m[1] . ')', '', $m[0]);
+				},
+				$head . $tail
+			),
+			$matches
+		);
+		$attrNames = \array_unique($matches[1]);
+		self::replacePHP($head);
+		self::replacePHP($tail);
+		if (!$passthrough)
+			$head = \str_replace('$node->textContent', '$textContent', $head);
+		if (!empty($attrNames))
+		{
+			\ksort($attrNames);
+			$head = "\$attributes+=array('" . \implode("'=>null,'", $attrNames) . "'=>null);" . $head;
+		}
+		if ($saveAttributes)
+		{
+			if (\strpos($head, '$html') === \false)
+				$head .= "\$html='';";
+			$head .= 'self::$attributes[]=$attributes;';
+			$tail  = '$attributes=array_pop(self::$attributes);' . $tail;
+		}
+	}
+	protected static function replacePHP(&$php)
+	{
+		if ($php === '')
+			return;
+		$php = \str_replace('$this->out', '$html', $php);
+		$getAttribute = "\\\$node->getAttribute\\(('[^']+')\\)";
+		$php = \preg_replace(
+			'(htmlspecialchars\\(' . $getAttribute . ',' . \ENT_NOQUOTES . '\\))',
+			"str_replace('&quot;','\"',\$attributes[\$1])",
+			$php
+		);
+		$php = \preg_replace(
+			'(htmlspecialchars\\(' . $getAttribute . ',' . \ENT_COMPAT . '\\))',
+			'$attributes[$1]',
+			$php
+		);
+		$php = \preg_replace(
+			'(htmlspecialchars\\(strtr\\(' . $getAttribute . ",('[^\"&\\\\';<>aglmopqtu]+'),('[^\"&\\\\'<>]+')\\)," . \ENT_COMPAT . '\\))',
+			'strtr($attributes[$1],$2,$3)',
+			$php
+		);
+		$php = \preg_replace(
+			'(' . $getAttribute . '(!?=+)' . $getAttribute . ')',
+			'$attributes[$1]$2$attributes[$3]',
+			$php
+		);
+		$php = \preg_replace_callback(
+			'(' . $getAttribute . "===('.*?(?<!\\\\)(?:\\\\\\\\)*'))s",
+			function ($m)
+			{
+				return '$attributes[' . $m[1] . ']===' . \htmlspecialchars($m[2], \ENT_COMPAT);
+			},
+			$php
+		);
+		$php = \preg_replace_callback(
+			"(('.*?(?<!\\\\)(?:\\\\\\\\)*')===" . $getAttribute . ')s',
+			function ($m)
+			{
+				return \htmlspecialchars($m[1], \ENT_COMPAT) . '===$attributes[' . $m[2] . ']';
+			},
+			$php
+		);
+		$php = \preg_replace_callback(
+			'(strpos\\(' . $getAttribute . ",('.*?(?<!\\\\)(?:\\\\\\\\)*')\\)([!=]==(?:0|false)))s",
+			function ($m)
+			{
+				return 'strpos($attributes[' . $m[1] . "]," . \htmlspecialchars($m[2], \ENT_COMPAT) . ')' . $m[3];
+			},
+			$php
+		);
+		$php = \preg_replace_callback(
+			"(strpos\\(('.*?(?<!\\\\)(?:\\\\\\\\)*')," . $getAttribute . '\\)([!=]==(?:0|false)))s',
+			function ($m)
+			{
+				return 'strpos(' . \htmlspecialchars($m[1], \ENT_COMPAT) . ',$attributes[' . $m[2] . '])' . $m[3];
+			},
+			$php
+		);
+		$php = \preg_replace(
+			'(' . $getAttribute . '(?=(?:==|[-+*])\\d+))',
+			'$attributes[$1]',
+			$php
+		);
+		$php = \preg_replace(
+			'((?<!\\w)(\\d+(?:==|[-+*]))' . $getAttribute . ')',
+			'$1$attributes[$2]',
+			$php
+		);
+		$php = \preg_replace(
+			"(empty\\(\\\$node->getAttribute\\(('[^']+')\\)\\))",
+			'empty($attributes[$1])',
+			$php
+		);
+		$php = \preg_replace(
+			"(\\\$node->hasAttribute\\(('[^']+')\\))",
+			'isset($attributes[$1])',
+			$php
+		);
+		$php = \preg_replace(
+			"(\\\$node->getAttribute\\(('[^']+')\\))",
+			'htmlspecialchars_decode($attributes[$1])',
+			$php
+		);
+		if (\substr($php, 0, 7) === '$html.=')
+			$php = '$html=' . \substr($php, 7);
+		else
+			$php = "\$html='';" . $php;
+	}
+	protected static function buildPHP(array $branches)
+	{
+		$return = array('', '');
+		foreach ($branches as $branch)
+		{
+			$return[0] .= $branch['statement'] . '{' . $branch['head'];
+			$return[1] .= $branch['statement'] . '{';
+			if ($branch['branches'])
+			{
+				list($head, $tail) = self::buildPHP($branch['branches']);
+				$return[0] .= $head;
+				$return[1] .= $tail;
+			}
+			$return[0] .= '}';
+			$return[1] .= $branch['tail'] . '}';
+		}
+		return $return;
+	}
+	protected static function getBranchesPassthrough(array $branches)
+	{
+		$values = array();
+		foreach ($branches as $branch)
+			$values[] = $branch['passthrough'];
+		if ($branch['statement'] !== 'else')
+			$values[] = 0;
+		return \array_unique($values);
+	}
+	protected static function getDynamicRendering($php)
+	{
+		$rendering = '';
+		$literal   = "(?<literal>'((?>[^'\\\\]+|\\\\['\\\\])*)')";
+		$attribute = "(?<attribute>htmlspecialchars\\(\\\$node->getAttribute\\('([^']+)'\\),2\\))";
+		$value     = "(?<value>$literal|$attribute)";
+		$output    = "(?<output>\\\$this->out\\.=$value(?:\\.(?&value))*;)";
+		$copyOfAttribute = "(?<copyOfAttribute>if\\(\\\$node->hasAttribute\\('([^']+)'\\)\\)\\{\\\$this->out\\.=' \\g-1=\"'\\.htmlspecialchars\\(\\\$node->getAttribute\\('\\g-1'\\),2\\)\\.'\"';\\})";
+		$regexp = '(^(' . $output . '|' . $copyOfAttribute . ')*$)';
+		if (!\preg_match($regexp, $php, $m))
+			return \false;
+		$copiedAttributes = array();
+		$usedAttributes = array();
+		$regexp = '(' . $output . '|' . $copyOfAttribute . ')A';
+		$offset = 0;
+		while (\preg_match($regexp, $php, $m, 0, $offset))
+			if ($m['output'])
+			{
+				$offset += 12;
+				while (\preg_match('(' . $value . ')A', $php, $m, 0, $offset))
+				{
+					if ($m['literal'])
+					{
+						$str = \stripslashes(\substr($m[0], 1, -1));
+						$rendering .= \preg_replace('([\\\\$](?=\\d))', '\\\\$0', $str);
+					}
+					else
+					{
+						$attrName = \end($m);
+						if (!isset($usedAttributes[$attrName]))
+							$usedAttributes[$attrName] = \uniqid($attrName, \true);
+						$rendering .= $usedAttributes[$attrName];
+					}
+					$offset += 1 + \strlen($m[0]);
+				}
+			}
+			else
+			{
+				$attrName = \end($m);
+				if (!isset($copiedAttributes[$attrName]))
+					$copiedAttributes[$attrName] = \uniqid($attrName, \true);
+				$rendering .= $copiedAttributes[$attrName];
+				$offset += \strlen($m[0]);
+			}
+		$attrNames = \array_keys($copiedAttributes + $usedAttributes);
+		\sort($attrNames);
+		$remainingAttributes = \array_combine($attrNames, $attrNames);
+		$regexp = '(^[^ ]+';
+		$index  = 0;
+		foreach ($attrNames as $attrName)
+		{
+			$regexp .= '(?> (?!' . RegexpBuilder::fromList($remainingAttributes) . '=)[^=]+="[^"]*")*';
+			unset($remainingAttributes[$attrName]);
+			$regexp .= '(';
+			if (isset($copiedAttributes[$attrName]))
+				self::replacePlaceholder($rendering, $copiedAttributes[$attrName], ++$index);
+			else
+				$regexp .= '?>';
+			$regexp .= ' ' . $attrName . '="';
+			if (isset($usedAttributes[$attrName]))
+			{
+				$regexp .= '(';
+				self::replacePlaceholder($rendering, $usedAttributes[$attrName], ++$index);
+			}
+			$regexp .= '[^"]*';
+			if (isset($usedAttributes[$attrName]))
+				$regexp .= ')';
+			$regexp .= '")?';
+		}
+		$regexp .= '.*)s';
+		return array($regexp, $rendering);
+	}
+	protected static function getStaticRendering($php)
+	{
+		if ($php === '')
+			return '';
+		$regexp = "(^\\\$this->out\.='((?>[^'\\\\]+|\\\\['\\\\])*)';\$)";
+		if (!\preg_match($regexp, $php, $m))
+			return \false;
+		return \stripslashes($m[1]);
+	}
+	protected static function replacePlaceholder(&$str, $uniqid, $index)
+	{
+		$str = \preg_replace_callback(
+			'(' . \preg_quote($uniqid) . '(.))',
+			function ($m) use ($index)
+			{
+				if (\is_numeric($m[1]))
+					return '${' . $index . '}' . $m[1];
+				else
+					return '$' . $index . $m[1];
+			},
+			$str
+		);
+	}
+	public static function generateConditionals($expr, array $statements)
+	{
+		$keys = \array_keys($statements);
+		$cnt  = \count($statements);
+		$min  = (int) $keys[0];
+		$max  = (int) $keys[$cnt - 1];
+		if ($cnt <= 4)
+		{
+			if ($cnt === 1)
+				return \end($statements);
+			$php = '';
+			$k = $min;
+			do
+			{
+				$php .= 'if(' . $expr . '===' . $k . '){' . $statements[$k] . '}else';
+			}
+			while (++$k < $max);
+			$php .= '{' . $statements[$max] . '}';
+			
+			return $php;
+		}
+		$cutoff = \ceil($cnt / 2);
+		$chunks = \array_chunk($statements, $cutoff, \true);
+		return 'if(' . $expr . '<' . \key($chunks[1]) . '){' . self::generateConditionals($expr, \array_slice($statements, 0, $cutoff, \true)) . '}else' . self::generateConditionals($expr, \array_slice($statements, $cutoff, \null, \true));
+	}
+	public static function generateBranchTable($expr, array $statements)
+	{
+		$branchTable = array();
+		$branchIds = array();
+		\ksort($statements);
+		foreach ($statements as $value => $statement)
+		{
+			if (!isset($branchIds[$statement]))
+				$branchIds[$statement] = \count($branchIds);
+			$branchTable[$value] = $branchIds[$statement];
+		}
+		return array($branchTable, self::generateConditionals($expr, \array_keys($branchIds)));
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RendererGenerators\PHP;
+use DOMElement;
+use DOMXPath;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Helpers\AVTHelper;
+use s9e\TextFormatter\Configurator\Helpers\TemplateParser;
+class Serializer
+{
+	public $branchTableThreshold = 8;
+	public $branchTables = array();
+	public $convertor;
+	public $useMultibyteStringFunctions = \false;
+	public function __construct()
+	{
+		$this->convertor = new XPathConvertor;
+	}
+	protected function convertAttributeValueTemplate($attrValue)
+	{
+		$phpExpressions = array();
+		foreach (AVTHelper::parse($attrValue) as $token)
+			if ($token[0] === 'literal')
+				$phpExpressions[] = \var_export($token[1], \true);
+			else
+				$phpExpressions[] = $this->convertXPath($token[1]);
+		return \implode('.', $phpExpressions);
+	}
+	public function convertCondition($expr)
+	{
+		$this->convertor->useMultibyteStringFunctions = $this->useMultibyteStringFunctions;
+		return $this->convertor->convertCondition($expr);
+	}
+	public function convertXPath($expr)
+	{
+		$this->convertor->useMultibyteStringFunctions = $this->useMultibyteStringFunctions;
+		return $this->convertor->convertXPath($expr);
+	}
+	protected function escapeLiteral($text, $context)
+	{
+		if ($context === 'raw')
+			return $text;
+		$escapeMode = ($context === 'attribute') ? \ENT_COMPAT : \ENT_NOQUOTES;
+		return \htmlspecialchars($text, $escapeMode);
+	}
+	protected function escapePHPOutput($php, $context)
+	{
+		if ($context === 'raw')
+			return $php;
+		$escapeMode = ($context === 'attribute') ? \ENT_COMPAT : \ENT_NOQUOTES;
+		return 'htmlspecialchars(' . $php . ',' . $escapeMode . ')';
+	}
+	protected function serializeApplyTemplates(DOMElement $applyTemplates)
+	{
+		$php = '$this->at($node';
+		if ($applyTemplates->hasAttribute('select'))
+			$php .= ',' . \var_export($applyTemplates->getAttribute('select'), \true);
+		$php .= ');';
+		return $php;
+	}
+	protected function serializeAttribute(DOMElement $attribute)
+	{
+		$attrName = $attribute->getAttribute('name');
+		$phpAttrName = $this->convertAttributeValueTemplate($attrName);
+		$phpAttrName = 'htmlspecialchars(' . $phpAttrName . ',' . \ENT_QUOTES . ')';
+		return "\$this->out.=' '." . $phpAttrName . ".'=\"';"
+		     . $this->serializeChildren($attribute)
+		     . "\$this->out.='\"';";
+	}
+	public function serialize(DOMElement $ir)
+	{
+		$this->branchTables = array();
+		return $this->serializeChildren($ir);
+	}
+	protected function serializeChildren(DOMElement $ir)
+	{
+		$php = '';
+		foreach ($ir->childNodes as $node)
+		{
+			$methodName = 'serialize' . \ucfirst($node->localName);
+			$php .= $this->$methodName($node);
+		}
+		return $php;
+	}
+	protected function serializeCloseTag(DOMElement $closeTag)
+	{
+		$php = '';
+		$id  = $closeTag->getAttribute('id');
+		if ($closeTag->hasAttribute('check'))
+			$php .= 'if(!isset($t' . $id . ')){';
+		if ($closeTag->hasAttribute('set'))
+			$php .= '$t' . $id . '=1;';
+		$xpath   = new DOMXPath($closeTag->ownerDocument);
+		$element = $xpath->query('ancestor::element[@id="' . $id . '"]', $closeTag)->item(0);
+		if (!($element instanceof DOMElement))
+			throw new RuntimeException;
+		$php .= "\$this->out.='>';";
+		if ($element->getAttribute('void') === 'maybe')
+			$php .= 'if(!$v' . $id . '){';
+		if ($closeTag->hasAttribute('check'))
+			$php .= '}';
+		return $php;
+	}
+	protected function serializeComment(DOMElement $comment)
+	{
+		return "\$this->out.='<!--';"
+		     . $this->serializeChildren($comment)
+		     . "\$this->out.='-->';";
+	}
+	protected function serializeCopyOfAttributes(DOMElement $copyOfAttributes)
+	{
+		return 'foreach($node->attributes as $attribute){'
+		     . "\$this->out.=' ';\$this->out.=\$attribute->name;\$this->out.='=\"';\$this->out.=htmlspecialchars(\$attribute->value," . \ENT_COMPAT . ");\$this->out.='\"';"
+		     . '}';
+	}
+	protected function serializeElement(DOMElement $element)
+	{
+		$php     = '';
+		$elName  = $element->getAttribute('name');
+		$id      = $element->getAttribute('id');
+		$isVoid  = $element->getAttribute('void');
+		$isDynamic = (bool) (\strpos($elName, '{') !== \false);
+		$phpElName = $this->convertAttributeValueTemplate($elName);
+		$phpElName = 'htmlspecialchars(' . $phpElName . ',' . \ENT_QUOTES . ')';
+		if ($isDynamic)
+		{
+			$varName = '$e' . $id;
+			$php .= $varName . '=' . $phpElName . ';';
+			$phpElName = $varName;
+		}
+		if ($isVoid === 'maybe')
+			$php .= '$v' . $id . '=preg_match(' . \var_export(TemplateParser::$voidRegexp, \true) . ',' . $phpElName . ');';
+		$php .= "\$this->out.='<'." . $phpElName . ';';
+		$php .= $this->serializeChildren($element);
+		if ($isVoid !== 'yes')
+			$php .= "\$this->out.='</'." . $phpElName . ".'>';";
+		if ($isVoid === 'maybe')
+			$php .= '}';
+		return $php;
+	}
+	protected function serializeHash(DOMElement $switch)
+	{
+		$statements = array();
+		foreach ($switch->getElementsByTagName('case') as $case)
+		{
+			if (!$case->parentNode->isSameNode($switch))
+				continue;
+			if ($case->hasAttribute('branch-values'))
+			{
+				$php = $this->serializeChildren($case);
+				foreach (\unserialize($case->getAttribute('branch-values')) as $value)
+					$statements[$value] = $php;
+			}
+		}
+		if (!isset($case))
+			throw new RuntimeException;
+		list($branchTable, $php) = Quick::generateBranchTable('$n', $statements);
+		$varName = 'bt' . \sprintf('%08X', \crc32(\serialize($branchTable)));
+		$expr = 'self::$' . $varName . '[' . $this->convertXPath($switch->getAttribute('branch-key')) . ']';
+		$php = 'if(isset(' . $expr . ')){$n=' . $expr . ';' . $php . '}';
+		if (!$case->hasAttribute('branch-values'))
+			$php .= 'else{' . $this->serializeChildren($case) . '}';
+		$this->branchTables[$varName] = $branchTable;
+		return $php;
+	}
+	protected function serializeOutput(DOMElement $output)
+	{
+		$context = $output->getAttribute('escape');
+		$php = '$this->out.=';
+		if ($output->getAttribute('type') === 'xpath')
+			$php .= $this->escapePHPOutput($this->convertXPath($output->textContent), $context);
+		else
+			$php .= \var_export($this->escapeLiteral($output->textContent, $context), \true);
+		$php .= ';';
+		return $php;
+	}
+	protected function serializeSwitch(DOMElement $switch)
+	{
+		if ($switch->hasAttribute('branch-key')
+		 && $switch->childNodes->length >= $this->branchTableThreshold)
+			return $this->serializeHash($switch);
+		$php  = '';
+		$else = '';
+		foreach ($switch->getElementsByTagName('case') as $case)
+		{
+			if (!$case->parentNode->isSameNode($switch))
+				continue;
+			if ($case->hasAttribute('test'))
+				$php .= $else . 'if(' . $this->convertCondition($case->getAttribute('test')) . ')';
+			else
+				$php .= 'else';
+			$else = 'else';
+			$php .= '{';
+			$php .= $this->serializeChildren($case);
+			$php .= '}';
+		}
+		return $php;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RendererGenerators\PHP;
+use LogicException;
+use RuntimeException;
+class XPathConvertor
+{
+	public $pcreVersion;
+	protected $regexp;
+	public $useMultibyteStringFunctions = \false;
+	public function __construct()
+	{
+		$this->pcreVersion = \PCRE_VERSION;
+	}
+	public function convertCondition($expr)
+	{
+		$expr = \trim($expr);
+		if (\preg_match('#^@([-\\w]+)$#', $expr, $m))
+			return '$node->hasAttribute(' . \var_export($m[1], \true) . ')';
+		if (\preg_match('#^not\\(@([-\\w]+)\\)$#', $expr, $m))
+			return '!$node->hasAttribute(' . \var_export($m[1], \true) . ')';
+		if (\preg_match('#^\\$(\\w+)$#', $expr, $m))
+			return '!empty($this->params[' . \var_export($m[1], \true) . '])';
+		if (\preg_match('#^not\\(\\$(\\w+)\\)$#', $expr, $m))
+			return 'empty($this->params[' . \var_export($m[1], \true) . '])';
+		if (\preg_match('#^([$@][-\\w]+)\\s*([<>])\\s*(\\d+)$#', $expr, $m))
+			return $this->convertXPath($m[1]) . $m[2] . $m[3];
+		if (!\preg_match('#[=<>]|\\bor\\b|\\band\\b|^[-\\w]+\\s*\\(#', $expr))
+			$expr = 'boolean(' . $expr . ')';
+		return $this->convertXPath($expr);
+	}
+	public function convertXPath($expr)
+	{
+		$expr = \trim($expr);
+		$this->generateXPathRegexp();
+		if (\preg_match($this->regexp, $expr, $m))
+		{
+			$methodName = \null;
+			foreach ($m as $k => $v)
+			{
+				if (\is_numeric($k) || $v === '' || !\method_exists($this, $k))
+					continue;
+				$methodName = $k;
+				break;
+			}
+			if (isset($methodName))
+			{
+				$args = array($m[$methodName]);
+				$i = 0;
+				while (isset($m[$methodName . $i]))
+				{
+					$args[$i] = $m[$methodName . $i];
+					++$i;
+				}
+				return \call_user_func_array(array($this, $methodName), $args);
+			}
+		}
+		if (!\preg_match('#[=<>]|\\bor\\b|\\band\\b|^[-\\w]+\\s*\\(#', $expr))
+			$expr = 'string(' . $expr . ')';
+		return '$this->xpath->evaluate(' . $this->exportXPath($expr) . ',$node)';
+	}
+	protected function attr($attrName)
+	{
+		return '$node->getAttribute(' . \var_export($attrName, \true) . ')';
+	}
+	protected function dot()
+	{
+		return '$node->textContent';
+	}
+	protected function param($paramName)
+	{
+		return '$this->params[' . \var_export($paramName, \true) . ']';
+	}
+	protected function string($string)
+	{
+		return \var_export(\substr($string, 1, -1), \true);
+	}
+	protected function lname()
+	{
+		return '$node->localName';
+	}
+	protected function name()
+	{
+		return '$node->nodeName';
+	}
+	protected function number($number)
+	{
+		return "'" . $number . "'";
+	}
+	protected function strlen($expr)
+	{
+		if ($expr === '')
+			$expr = '.';
+		$php = $this->convertXPath($expr);
+		return ($this->useMultibyteStringFunctions)
+			? 'mb_strlen(' . $php . ",'utf-8')"
+			: "strlen(preg_replace('(.)us','.'," . $php . '))';
+	}
+	protected function contains($haystack, $needle)
+	{
+		return '(strpos(' . $this->convertXPath($haystack) . ',' . $this->convertXPath($needle) . ')!==false)';
+	}
+	protected function startswith($string, $substring)
+	{
+		return '(strpos(' . $this->convertXPath($string) . ',' . $this->convertXPath($substring) . ')===0)';
+	}
+	protected function not($expr)
+	{
+		return '!(' . $this->convertCondition($expr) . ')';
+	}
+	protected function notcontains($haystack, $needle)
+	{
+		return '(strpos(' . $this->convertXPath($haystack) . ',' . $this->convertXPath($needle) . ')===false)';
+	}
+	protected function substr($exprString, $exprPos, $exprLen = \null)
+	{
+		if (!$this->useMultibyteStringFunctions)
+		{
+			$expr = 'substring(' . $exprString . ',' . $exprPos;
+			if (isset($exprLen))
+				$expr .= ',' . $exprLen;
+			$expr .= ')';
+			return '$this->xpath->evaluate(' . $this->exportXPath($expr) . ',$node)';
+		}
+		$php = 'mb_substr(' . $this->convertXPath($exprString) . ',';
+		if (\is_numeric($exprPos))
+			$php .= \max(0, $exprPos - 1);
+		else
+			$php .= 'max(0,' . $this->convertXPath($exprPos) . '-1)';
+		$php .= ',';
+		if (isset($exprLen))
+			if (\is_numeric($exprLen))
+				if (\is_numeric($exprPos) && $exprPos < 1)
+					$php .= \max(0, $exprPos + $exprLen - 1);
+				else
+					$php .= \max(0, $exprLen);
+			else
+				$php .= 'max(0,' . $this->convertXPath($exprLen) . ')';
+		else
+			$php .= 0x7fffffe;
+		$php .= ",'utf-8')";
+		return $php;
+	}
+	protected function substringafter($expr, $str)
+	{
+		return 'substr(strstr(' . $this->convertXPath($expr) . ',' . $this->convertXPath($str) . '),' . (\strlen($str) - 2) . ')';
+	}
+	protected function substringbefore($expr1, $expr2)
+	{
+		return 'strstr(' . $this->convertXPath($expr1) . ',' . $this->convertXPath($expr2) . ',true)';
+	}
+	protected function cmp($expr1, $operator, $expr2)
+	{
+		$operands  = array();
+		$operators = array(
+			'='  => '===',
+			'!=' => '!==',
+			'>'  => '>',
+			'>=' => '>=',
+			'<'  => '<',
+			'<=' => '<='
+		);
+		foreach (array($expr1, $expr2) as $expr)
+			if (\is_numeric($expr))
+			{
+				$operators['=']  = '==';
+				$operators['!='] = '!=';
+				$operands[] = \preg_replace('(^0(.+))', '$1', $expr);
+			}
+			else
+				$operands[] = $this->convertXPath($expr);
+		return \implode($operators[$operator], $operands);
+	}
+	protected function bool($expr1, $operator, $expr2)
+	{
+		$operators = array(
+			'and' => '&&',
+			'or'  => '||'
+		);
+		return $this->convertCondition($expr1) . $operators[$operator] . $this->convertCondition($expr2);
+	}
+	protected function parens($expr)
+	{
+		return '(' . $this->convertXPath($expr) . ')';
+	}
+	protected function translate($str, $from, $to)
+	{
+		\preg_match_all('(.)su', \substr($from, 1, -1), $matches);
+		$from = $matches[0];
+		\preg_match_all('(.)su', \substr($to, 1, -1), $matches);
+		$to = $matches[0];
+		if (\count($to) > \count($from))
+			$to = \array_slice($to, 0, \count($from));
+		else
+			while (\count($from) > \count($to))
+				$to[] = '';
+		$from = \array_unique($from);
+		$to   = \array_intersect_key($to, $from);
+		$php = 'strtr(' . $this->convertXPath($str) . ',';
+		if (array(1) === \array_unique(\array_map('strlen', $from))
+		 && array(1) === \array_unique(\array_map('strlen', $to)))
+			$php .= \var_export(\implode('', $from), \true) . ',' . \var_export(\implode('', $to), \true);
+		else
+		{
+			$php .= 'array(';
+			$cnt = \count($from);
+			for ($i = 0; $i < $cnt; ++$i)
+			{
+				if ($i)
+					$php .= ',';
+				$php .= \var_export($from[$i], \true) . '=>' . \var_export($to[$i], \true);
+			}
+			$php .= ')';
+		}
+		$php .= ')';
+		return $php;
+	}
+	protected function math($expr1, $operator, $expr2)
+	{
+		if (!\is_numeric($expr1))
+			$expr1 = $this->convertXPath($expr1);
+		if (!\is_numeric($expr2))
+			$expr2 = $this->convertXPath($expr2);
+		if ($operator === 'div')
+			$operator = '/';
+		return $expr1 . $operator . $expr2;
+	}
+	protected function exportXPath($expr)
+	{
+		$phpTokens = array();
+		$pos = 0;
+		$len = \strlen($expr);
+		while ($pos < $len)
+		{
+			if ($expr[$pos] === "'" || $expr[$pos] === '"')
+			{
+				$nextPos = \strpos($expr, $expr[$pos], 1 + $pos);
+				if ($nextPos === \false)
+					throw new RuntimeException('Unterminated string literal in XPath expression ' . \var_export($expr, \true));
+				$phpTokens[] = \var_export(\substr($expr, $pos, $nextPos + 1 - $pos), \true);
+				$pos = $nextPos + 1;
+				continue;
+			}
+			if ($expr[$pos] === '$' && \preg_match('/\\$(\\w+)/', $expr, $m, 0, $pos))
+			{
+				$phpTokens[] = '$this->getParamAsXPath(' . \var_export($m[1], \true) . ')';
+				$pos += \strlen($m[0]);
+				continue;
+			}
+			$spn = \strcspn($expr, '\'"$', $pos);
+			if ($spn)
+			{
+				$phpTokens[] = \var_export(\substr($expr, $pos, $spn), \true);
+				$pos += $spn;
+			}
+		}
+		return \implode('.', $phpTokens);
+	}
+	protected function generateXPathRegexp()
+	{
+		if (isset($this->regexp))
+			return;
+		$patterns = array(
+			'attr'      => array('@', '(?<attr0>[-\\w]+)'),
+			'dot'       => '\\.',
+			'name'      => 'name\\(\\)',
+			'lname'     => 'local-name\\(\\)',
+			'param'     => array('\\$', '(?<param0>\\w+)'),
+			'string'    => '"[^"]*"|\'[^\']*\'',
+			'number'    => array('-?', '\\d++'),
+			'strlen'    => array('string-length', '\\(', '(?<strlen0>(?&value)?)', '\\)'),
+			'contains'  => array(
+				'contains',
+				'\\(',
+				'(?<contains0>(?&value))',
+				',',
+				'(?<contains1>(?&value))',
+				'\\)'
+			),
+			'translate' => array(
+				'translate',
+				'\\(',
+				'(?<translate0>(?&value))',
+				',',
+				'(?<translate1>(?&string))',
+				',',
+				'(?<translate2>(?&string))',
+				'\\)'
+			),
+			'substr' => array(
+				'substring',
+				'\\(',
+				'(?<substr0>(?&value))',
+				',',
+				'(?<substr1>(?&value))',
+				'(?:, (?<substr2>(?&value)))?',
+				'\\)'
+			),
+			'substringafter' => array(
+				'substring-after',
+				'\\(',
+				'(?<substringafter0>(?&value))',
+				',',
+				'(?<substringafter1>(?&string))',
+				'\\)'
+			),
+			'substringbefore' => array(
+				'substring-before',
+				'\\(',
+				'(?<substringbefore0>(?&value))',
+				',',
+				'(?<substringbefore1>(?&value))',
+				'\\)'
+			),
+			'startswith' => array(
+				'starts-with',
+				'\\(',
+				'(?<startswith0>(?&value))',
+				',',
+				'(?<startswith1>(?&value))',
+				'\\)'
+			),
+			'math' => array(
+				'(?<math0>(?&attr)|(?&number)|(?&param))',
+				'(?<math1>[-+*]|div)',
+				'(?<math2>(?&math)|(?&math0))'
+			),
+			'notcontains' => array(
+				'not',
+				'\\(',
+				'contains',
+				'\\(',
+				'(?<notcontains0>(?&value))',
+				',',
+				'(?<notcontains1>(?&value))',
+				'\\)',
+				'\\)'
+			)
+		);
+		$exprs = array();
+		if (\version_compare($this->pcreVersion, '8.13', '>='))
+		{
+			$exprs[] = '(?<cmp>(?<cmp0>(?&value)) (?<cmp1>!?=) (?<cmp2>(?&value)))';
+			$exprs[] = '(?<parens>\\( (?<parens0>(?&bool)|(?&cmp)|(?&math)) \\))';
+			$exprs[] = '(?<bool>(?<bool0>(?&cmp)|(?&not)|(?&value)|(?&parens)) (?<bool1>and|or) (?<bool2>(?&bool)|(?&cmp)|(?&not)|(?&value)|(?&parens)))';
+			$exprs[] = '(?<not>not \\( (?<not0>(?&bool)|(?&value)) \\))';
+			$patterns['math'][0] = \str_replace('))', ')|(?&parens))', $patterns['math'][0]);
+			$patterns['math'][1] = \str_replace('))', ')|(?&parens))', $patterns['math'][1]);
+		}
+		$valueExprs = array();
+		foreach ($patterns as $name => $pattern)
+		{
+			if (\is_array($pattern))
+				$pattern = \implode(' ', $pattern);
+			if (\strpos($pattern, '?&') === \false || \version_compare($this->pcreVersion, '8.13', '>='))
+				$valueExprs[] = '(?<' . $name . '>' . $pattern . ')';
+		}
+		\array_unshift($exprs, '(?<value>' . \implode('|', $valueExprs) . ')');
+
+		$regexp = '#^(?:' . \implode('|', $exprs) . ')$#S';
+		$regexp = \str_replace(' ', '\\s*', $regexp);
+		$this->regexp = $regexp;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator;
+use InvalidArgumentException;
+use ReflectionClass;
+use RuntimeException;
+use Traversable;
+use s9e\TextFormatter\Configurator;
+use s9e\TextFormatter\Configurator\Collections\Collection;
+use s9e\TextFormatter\Configurator\Collections\NormalizedCollection;
+use s9e\TextFormatter\Configurator\Collections\TemplateParameterCollection;
+use s9e\TextFormatter\Configurator\RendererGenerator;
+use s9e\TextFormatter\Configurator\Traits\Configurable;
+class Rendering
+{
+	public function __get($propName)
+	{
+		$methodName = 'get' . \ucfirst($propName);
+		if (\method_exists($this, $methodName))
+			return $this->$methodName();
+		if (!\property_exists($this, $propName))
+			throw new RuntimeException("Property '" . $propName . "' does not exist");
+		return $this->$propName;
+	}
+	public function __set($propName, $propValue)
+	{
+		$methodName = 'set' . \ucfirst($propName);
+		if (\method_exists($this, $methodName))
+		{
+			$this->$methodName($propValue);
+			return;
+		}
+		if (!isset($this->$propName))
+		{
+			$this->$propName = $propValue;
+			return;
+		}
+		if ($this->$propName instanceof NormalizedCollection)
+		{
+			if (!\is_array($propValue)
+			 && !($propValue instanceof Traversable))
+				throw new InvalidArgumentException("Property '" . $propName . "' expects an array or a traversable object to be passed");
+			$this->$propName->clear();
+			foreach ($propValue as $k => $v)
+				$this->$propName->set($k, $v);
+			return;
+		}
+		if (\is_object($this->$propName))
+		{
+			if (!($propValue instanceof $this->$propName))
+				throw new InvalidArgumentException("Cannot replace property '" . $propName . "' of class '" . \get_class($this->$propName) . "' with instance of '" . \get_class($propValue) . "'");
+		}
+		else
+		{
+			$oldType = \gettype($this->$propName);
+			$newType = \gettype($propValue);
+			if ($oldType === 'boolean')
+				if ($propValue === 'false')
+				{
+					$newType   = 'boolean';
+					$propValue = \false;
+				}
+				elseif ($propValue === 'true')
+				{
+					$newType   = 'boolean';
+					$propValue = \true;
+				}
+			if ($oldType !== $newType)
+			{
+				$tmp = $propValue;
+				\settype($tmp, $oldType);
+				\settype($tmp, $newType);
+				if ($tmp !== $propValue)
+					throw new InvalidArgumentException("Cannot replace property '" . $propName . "' of type " . $oldType . ' with value of type ' . $newType);
+				\settype($propValue, $oldType);
+			}
+		}
+		$this->$propName = $propValue;
+	}
+	public function __isset($propName)
+	{
+		$methodName = 'isset' . \ucfirst($propName);
+		if (\method_exists($this, $methodName))
+			return $this->$methodName();
+		return isset($this->$propName);
+	}
+	public function __unset($propName)
+	{
+		$methodName = 'unset' . \ucfirst($propName);
+		if (\method_exists($this, $methodName))
+		{
+			$this->$methodName();
+			return;
+		}
+		if (!isset($this->$propName))
+			return;
+		if ($this->$propName instanceof Collection)
+		{
+			$this->$propName->clear();
+			return;
+		}
+		throw new RuntimeException("Property '" . $propName . "' cannot be unset");
+	}
+	protected $configurator;
+	protected $engine;
+	protected $parameters;
+	public function __construct(Configurator $configurator)
+	{
+		$this->configurator = $configurator;
+		$this->parameters   = new TemplateParameterCollection;
+	}
+	public function getAllParameters()
+	{
+		$params = array();
+		foreach ($this->configurator->tags as $tag)
+			if (isset($tag->template))
+				foreach ($tag->template->getParameters() as $paramName)
+					$params[$paramName] = '';
+		$params = \iterator_to_array($this->parameters) + $params;
+		\ksort($params);
+		return $params;
+	}
+	public function getEngine()
+	{
+		if (!isset($this->engine))
+			$this->setEngine('XSLT');
+		return $this->engine;
+	}
+	public function getRenderer()
+	{
+		return $this->getEngine()->getRenderer($this);
+	}
+	public function getTemplates()
+	{
+		$templates = array(
+			'br' => '<br/>',
+			'e'  => '',
+			'i'  => '',
+			'p'  => '<p><xsl:apply-templates/></p>',
+			's'  => ''
+		);
+		foreach ($this->configurator->tags as $tagName => $tag)
+			if (isset($tag->template))
+				$templates[$tagName] = (string) $tag->template;
+		\ksort($templates);
+		return $templates;
+	}
+	public function setEngine($engine)
+	{
+		if (!($engine instanceof RendererGenerator))
+		{
+			$className  = 's9e\\TextFormatter\\Configurator\\RendererGenerators\\' . $engine;
+			$reflection = new ReflectionClass($className);
+			$engine = (\func_num_args() > 1) ? $reflection->newInstanceArgs(\array_slice(\func_get_args(), 1)) : $reflection->newInstance();
+		}
+		$this->engine = $engine;
+		return $engine;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator;
+use ArrayAccess;
+use DOMDocument;
+use Iterator;
+use s9e\TextFormatter\Configurator\Collections\RulesGeneratorList;
+use s9e\TextFormatter\Configurator\Collections\TagCollection;
+use s9e\TextFormatter\Configurator\Helpers\TemplateForensics;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\BooleanRulesGenerator;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\TargetedRulesGenerator;
+use s9e\TextFormatter\Configurator\Traits\CollectionProxy;
+class RulesGenerator implements ArrayAccess, Iterator
+{
+	public function __call($methodName, $args)
+	{
+		return \call_user_func_array(array($this->collection, $methodName), $args);
+	}
+	public function offsetExists($offset)
+	{
+		return isset($this->collection[$offset]);
+	}
+	public function offsetGet($offset)
+	{
+		return $this->collection[$offset];
+	}
+	public function offsetSet($offset, $value)
+	{
+		$this->collection[$offset] = $value;
+	}
+	public function offsetUnset($offset)
+	{
+		unset($this->collection[$offset]);
+	}
+	public function count()
+	{
+		return \count($this->collection);
+	}
+	public function current()
+	{
+		return $this->collection->current();
+	}
+	public function key()
+	{
+		return $this->collection->key();
+	}
+	public function next()
+	{
+		return $this->collection->next();
+	}
+	public function rewind()
+	{
+		$this->collection->rewind();
+	}
+	public function valid()
+	{
+		return $this->collection->valid();
+	}
+	protected $collection;
+	public function __construct()
+	{
+		$this->collection = new RulesGeneratorList;
+		$this->collection->append('AutoCloseIfVoid');
+		$this->collection->append('AutoReopenFormattingElements');
+		$this->collection->append('BlockElementsFosterFormattingElements');
+		$this->collection->append('DisableAutoLineBreaksIfNewLinesArePreserved');
+		$this->collection->append('EnforceContentModels');
+		$this->collection->append('EnforceOptionalEndTags');
+		$this->collection->append('IgnoreTagsInCode');
+		$this->collection->append('IgnoreTextIfDisallowed');
+		$this->collection->append('IgnoreWhitespaceAroundBlockElements');
+		$this->collection->append('TrimFirstLineInCodeBlocks');
+	}
+	public function getRules(TagCollection $tags, array $options = array())
+	{
+		$parentHTML = (isset($options['parentHTML'])) ? $options['parentHTML'] : '<div>';
+		$rootForensics = $this->generateRootForensics($parentHTML);
+		$templateForensics = array();
+		foreach ($tags as $tagName => $tag)
+		{
+			$template = (isset($tag->template)) ? $tag->template : '<xsl:apply-templates/>';
+			$templateForensics[$tagName] = new TemplateForensics($template);
+		}
+		$rules = $this->generateRulesets($templateForensics, $rootForensics);
+		unset($rules['root']['autoClose']);
+		unset($rules['root']['autoReopen']);
+		unset($rules['root']['breakParagraph']);
+		unset($rules['root']['closeAncestor']);
+		unset($rules['root']['closeParent']);
+		unset($rules['root']['fosterParent']);
+		unset($rules['root']['ignoreSurroundingWhitespace']);
+		unset($rules['root']['isTransparent']);
+		unset($rules['root']['requireAncestor']);
+		unset($rules['root']['requireParent']);
+		return $rules;
+	}
+	protected function generateRootForensics($html)
+	{
+		$dom = new DOMDocument;
+		$dom->loadHTML($html);
+		$body = $dom->getElementsByTagName('body')->item(0);
+		$node = $body;
+		while ($node->firstChild)
+			$node = $node->firstChild;
+		$node->appendChild($dom->createElementNS(
+			'http://www.w3.org/1999/XSL/Transform',
+			'xsl:apply-templates'
+		));
+		return new TemplateForensics($dom->saveXML($body));
+	}
+	protected function generateRulesets(array $templateForensics, TemplateForensics $rootForensics)
+	{
+		$rules = array(
+			'root' => $this->generateRuleset($rootForensics, $templateForensics),
+			'tags' => array()
+		);
+		foreach ($templateForensics as $tagName => $src)
+			$rules['tags'][$tagName] = $this->generateRuleset($src, $templateForensics);
+		return $rules;
+	}
+	protected function generateRuleset(TemplateForensics $src, array $targets)
+	{
+		$rules = array();
+		foreach ($this->collection as $rulesGenerator)
+		{
+			if ($rulesGenerator instanceof BooleanRulesGenerator)
+				foreach ($rulesGenerator->generateBooleanRules($src) as $ruleName => $bool)
+					$rules[$ruleName] = $bool;
+			if ($rulesGenerator instanceof TargetedRulesGenerator)
+				foreach ($targets as $tagName => $trg)
+					foreach ($rulesGenerator->generateTargetedRules($src, $trg) as $ruleName)
+						$rules[$ruleName][] = $tagName;
+		}
+		return $rules;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RulesGenerators\Interfaces;
+use s9e\TextFormatter\Configurator\Helpers\TemplateForensics;
+interface BooleanRulesGenerator
+{
+	public function generateBooleanRules(TemplateForensics $src);
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RulesGenerators\Interfaces;
+use s9e\TextFormatter\Configurator\Helpers\TemplateForensics;
+interface TargetedRulesGenerator
+{
+	public function generateTargetedRules(TemplateForensics $src, TemplateForensics $trg);
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator;
+use DOMElement;
+use s9e\TextFormatter\Configurator\Items\Tag;
+abstract class TemplateCheck
+{
+	const XMLNS_XSL = 'http://www.w3.org/1999/XSL/Transform';
+	abstract public function check(DOMElement $template, Tag $tag);
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator;
+use ArrayAccess;
+use Iterator;
+use s9e\TextFormatter\Configurator\Collections\TemplateCheckList;
+use s9e\TextFormatter\Configurator\Helpers\TemplateHelper;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\Items\UnsafeTemplate;
+use s9e\TextFormatter\Configurator\TemplateChecks\DisallowElementNS;
+use s9e\TextFormatter\Configurator\TemplateChecks\DisallowXPathFunction;
+use s9e\TextFormatter\Configurator\TemplateChecks\RestrictFlashScriptAccess;
+use s9e\TextFormatter\Configurator\Traits\CollectionProxy;
+class TemplateChecker implements ArrayAccess, Iterator
+{
+	public function __call($methodName, $args)
+	{
+		return \call_user_func_array(array($this->collection, $methodName), $args);
+	}
+	public function offsetExists($offset)
+	{
+		return isset($this->collection[$offset]);
+	}
+	public function offsetGet($offset)
+	{
+		return $this->collection[$offset];
+	}
+	public function offsetSet($offset, $value)
+	{
+		$this->collection[$offset] = $value;
+	}
+	public function offsetUnset($offset)
+	{
+		unset($this->collection[$offset]);
+	}
+	public function count()
+	{
+		return \count($this->collection);
+	}
+	public function current()
+	{
+		return $this->collection->current();
+	}
+	public function key()
+	{
+		return $this->collection->key();
+	}
+	public function next()
+	{
+		return $this->collection->next();
+	}
+	public function rewind()
+	{
+		$this->collection->rewind();
+	}
+	public function valid()
+	{
+		return $this->collection->valid();
+	}
+	protected $collection;
+	protected $disabled = \false;
+	public function __construct()
+	{
+		$this->collection = new TemplateCheckList;
+		$this->collection->append('DisallowAttributeSets');
+		$this->collection->append('DisallowCopy');
+		$this->collection->append('DisallowDisableOutputEscaping');
+		$this->collection->append('DisallowDynamicAttributeNames');
+		$this->collection->append('DisallowDynamicElementNames');
+		$this->collection->append('DisallowObjectParamsWithGeneratedName');
+		$this->collection->append('DisallowPHPTags');
+		$this->collection->append('DisallowUnsafeCopyOf');
+		$this->collection->append('DisallowUnsafeDynamicCSS');
+		$this->collection->append('DisallowUnsafeDynamicJS');
+		$this->collection->append('DisallowUnsafeDynamicURL');
+		$this->collection->append(new DisallowElementNS('http://icl.com/saxon', 'output'));
+		$this->collection->append(new DisallowXPathFunction('document'));
+		$this->collection->append(new RestrictFlashScriptAccess('sameDomain', \true));
+	}
+	public function checkTag(Tag $tag)
+	{
+		if (isset($tag->template) && !($tag->template instanceof UnsafeTemplate))
+		{
+			$template = (string) $tag->template;
+			$this->checkTemplate($template, $tag);
+		}
+	}
+	public function checkTemplate($template, Tag $tag = \null)
+	{
+		if ($this->disabled)
+			return;
+		if (!isset($tag))
+			$tag = new Tag;
+		$dom = TemplateHelper::loadTemplate($template);
+		foreach ($this->collection as $check)
+			$check->check($dom->documentElement, $tag);
+	}
+	public function disable()
+	{
+		$this->disabled = \true;
+	}
+	public function enable()
+	{
+		$this->disabled = \false;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator;
+use DOMElement;
+abstract class TemplateNormalization
+{
+	const XMLNS_XSL = 'http://www.w3.org/1999/XSL/Transform';
+	public $onlyOnce = \false;
+	abstract public function normalize(DOMElement $template);
+	public static function lowercase($str)
+	{
+		return \strtr($str, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license'); The MIT License
+*/
+namespace s9e\TextFormatter\Configurator;
+use ArrayAccess;
+use Iterator;
+use s9e\TextFormatter\Configurator\Collections\TemplateNormalizationList;
+use s9e\TextFormatter\Configurator\Helpers\TemplateHelper;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\Traits\CollectionProxy;
+class TemplateNormalizer implements ArrayAccess, Iterator
+{
+	public function __call($methodName, $args)
+	{
+		return \call_user_func_array(array($this->collection, $methodName), $args);
+	}
+	public function offsetExists($offset)
+	{
+		return isset($this->collection[$offset]);
+	}
+	public function offsetGet($offset)
+	{
+		return $this->collection[$offset];
+	}
+	public function offsetSet($offset, $value)
+	{
+		$this->collection[$offset] = $value;
+	}
+	public function offsetUnset($offset)
+	{
+		unset($this->collection[$offset]);
+	}
+	public function count()
+	{
+		return \count($this->collection);
+	}
+	public function current()
+	{
+		return $this->collection->current();
+	}
+	public function key()
+	{
+		return $this->collection->key();
+	}
+	public function next()
+	{
+		return $this->collection->next();
+	}
+	public function rewind()
+	{
+		$this->collection->rewind();
+	}
+	public function valid()
+	{
+		return $this->collection->valid();
+	}
+	protected $collection;
+	public function __construct()
+	{
+		$this->collection = new TemplateNormalizationList;
+		$this->collection->append('PreserveSingleSpaces');
+		$this->collection->append('RemoveComments');
+		$this->collection->append('RemoveInterElementWhitespace');
+		$this->collection->append('FixUnescapedCurlyBracesInHtmlAttributes');
+		$this->collection->append('FoldArithmeticConstants');
+		$this->collection->append('FoldConstantXPathExpressions');
+		$this->collection->append('InlineAttributes');
+		$this->collection->append('InlineCDATA');
+		$this->collection->append('InlineElements');
+		$this->collection->append('InlineInferredValues');
+		$this->collection->append('InlineTextElements');
+		$this->collection->append('InlineXPathLiterals');
+		$this->collection->append('MinifyXPathExpressions');
+		$this->collection->append('NormalizeAttributeNames');
+		$this->collection->append('NormalizeElementNames');
+		$this->collection->append('NormalizeUrls');
+		$this->collection->append('OptimizeConditionalAttributes');
+		$this->collection->append('OptimizeConditionalValueOf');
+		$this->collection->append('OptimizeChoose');
+		$this->collection->append('SetRelNoreferrerOnTargetedLinks');
+	}
+	public function normalizeTag(Tag $tag)
+	{
+		if (isset($tag->template) && !$tag->template->isNormalized())
+			$tag->template->normalize($this);
+	}
+	public function normalizeTemplate($template)
+	{
+		$dom = TemplateHelper::loadTemplate($template);
+		$applied = array();
+		$loops = 5;
+		do
+		{
+			$old = $template;
+			foreach ($this->collection as $k => $normalization)
+			{
+				if (isset($applied[$k]) && !empty($normalization->onlyOnce))
+					continue;
+				$normalization->normalize($dom->documentElement);
+				$applied[$k] = 1;
+			}
+			$template = TemplateHelper::saveTemplate($dom);
+		}
+		while (--$loops && $template !== $old);
+		return $template;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Validators;
+use InvalidArgumentException;
+abstract class AttributeName
+{
+	public static function isValid($name)
+	{
+		return (bool) \preg_match('#^(?!xmlns$)[a-z_][-a-z_0-9]*$#Di', $name);
+	}
+	public static function normalize($name)
+	{
+		if (!static::isValid($name))
+			throw new InvalidArgumentException("Invalid attribute name '" . $name . "'");
+		return \strtolower($name);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Validators;
+use InvalidArgumentException;
+abstract class TagName
+{
+	public static function isValid($name)
+	{
+		return (bool) \preg_match('#^(?:(?!xmlns|xsl|s9e)[a-z_][a-z_0-9]*:)?[a-z_][-a-z_0-9]*$#Di', $name);
+	}
+	public static function normalize($name)
+	{
+		if (!static::isValid($name))
+			throw new InvalidArgumentException("Invalid tag name '" . $name . "'");
+		if (\strpos($name, ':') === \false)
+			$name = \strtoupper($name);
+		return $name;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use Countable;
+use Iterator;
+use s9e\TextFormatter\Configurator\ConfigProvider;
+use s9e\TextFormatter\Configurator\Helpers\ConfigHelper;
+class Collection implements ConfigProvider, Countable, Iterator
+{
+	protected $items = array();
+	public function clear()
+	{
+		$this->items = array();
+	}
+	public function asConfig()
+	{
+		return ConfigHelper::toArray($this->items, \true);
+	}
+	public function count()
+	{
+		return \count($this->items);
+	}
+	public function current()
+	{
+		return \current($this->items);
+	}
+	public function key()
+	{
+		return \key($this->items);
+	}
+	public function next()
+	{
+		return \next($this->items);
+	}
+	public function rewind()
+	{
+		\reset($this->items);
+	}
+	public function valid()
+	{
+		return (\key($this->items) !== \null);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items;
+use InvalidArgumentException;
+use RuntimeException;
+use Traversable;
+use s9e\TextFormatter\Configurator\Collections\AttributeFilterChain;
+use s9e\TextFormatter\Configurator\Collections\Collection;
+use s9e\TextFormatter\Configurator\Collections\NormalizedCollection;
+use s9e\TextFormatter\Configurator\ConfigProvider;
+use s9e\TextFormatter\Configurator\Helpers\ConfigHelper;
+use s9e\TextFormatter\Configurator\Items\ProgrammableCallback;
+use s9e\TextFormatter\Configurator\Traits\Configurable;
+use s9e\TextFormatter\Configurator\Traits\TemplateSafeness;
+class Attribute implements ConfigProvider
+{
+	public function __get($propName)
+	{
+		$methodName = 'get' . \ucfirst($propName);
+		if (\method_exists($this, $methodName))
+			return $this->$methodName();
+		if (!\property_exists($this, $propName))
+			throw new RuntimeException("Property '" . $propName . "' does not exist");
+		return $this->$propName;
+	}
+	public function __set($propName, $propValue)
+	{
+		$methodName = 'set' . \ucfirst($propName);
+		if (\method_exists($this, $methodName))
+		{
+			$this->$methodName($propValue);
+			return;
+		}
+		if (!isset($this->$propName))
+		{
+			$this->$propName = $propValue;
+			return;
+		}
+		if ($this->$propName instanceof NormalizedCollection)
+		{
+			if (!\is_array($propValue)
+			 && !($propValue instanceof Traversable))
+				throw new InvalidArgumentException("Property '" . $propName . "' expects an array or a traversable object to be passed");
+			$this->$propName->clear();
+			foreach ($propValue as $k => $v)
+				$this->$propName->set($k, $v);
+			return;
+		}
+		if (\is_object($this->$propName))
+		{
+			if (!($propValue instanceof $this->$propName))
+				throw new InvalidArgumentException("Cannot replace property '" . $propName . "' of class '" . \get_class($this->$propName) . "' with instance of '" . \get_class($propValue) . "'");
+		}
+		else
+		{
+			$oldType = \gettype($this->$propName);
+			$newType = \gettype($propValue);
+			if ($oldType === 'boolean')
+				if ($propValue === 'false')
+				{
+					$newType   = 'boolean';
+					$propValue = \false;
+				}
+				elseif ($propValue === 'true')
+				{
+					$newType   = 'boolean';
+					$propValue = \true;
+				}
+			if ($oldType !== $newType)
+			{
+				$tmp = $propValue;
+				\settype($tmp, $oldType);
+				\settype($tmp, $newType);
+				if ($tmp !== $propValue)
+					throw new InvalidArgumentException("Cannot replace property '" . $propName . "' of type " . $oldType . ' with value of type ' . $newType);
+				\settype($propValue, $oldType);
+			}
+		}
+		$this->$propName = $propValue;
+	}
+	public function __isset($propName)
+	{
+		$methodName = 'isset' . \ucfirst($propName);
+		if (\method_exists($this, $methodName))
+			return $this->$methodName();
+		return isset($this->$propName);
+	}
+	public function __unset($propName)
+	{
+		$methodName = 'unset' . \ucfirst($propName);
+		if (\method_exists($this, $methodName))
+		{
+			$this->$methodName();
+			return;
+		}
+		if (!isset($this->$propName))
+			return;
+		if ($this->$propName instanceof Collection)
+		{
+			$this->$propName->clear();
+			return;
+		}
+		throw new RuntimeException("Property '" . $propName . "' cannot be unset");
+	}
+	protected $markedSafe = array();
+
+	public function isSafeAsURL()
+	{
+		return $this->isSafe('AsURL');
+	}
+	public function isSafeInCSS()
+	{
+		return $this->isSafe('InCSS');
+	}
+	public function isSafeInJS()
+	{
+		return $this->isSafe('InJS');
+	}
+	public function markAsSafeAsURL()
+	{
+		$this->markedSafe['AsURL'] = \true;
+		return $this;
+	}
+	public function markAsSafeInCSS()
+	{
+		$this->markedSafe['InCSS'] = \true;
+		return $this;
+	}
+	public function markAsSafeInJS()
+	{
+		$this->markedSafe['InJS'] = \true;
+		return $this;
+	}
+	public function resetSafeness()
+	{
+		$this->markedSafe = array();
+		return $this;
+	}
+	protected $defaultValue;
+	protected $filterChain;
+	protected $generator;
+	protected $required = \true;
+	public function __construct(array $options = \null)
+	{
+		$this->filterChain = new AttributeFilterChain;
+		if (isset($options))
+			foreach ($options as $optionName => $optionValue)
+				$this->__set($optionName, $optionValue);
+	}
+	protected function isSafe($context)
+	{
+		$methodName = 'isSafe' . $context;
+		foreach ($this->filterChain as $filter)
+			if ($filter->$methodName())
+				return \true;
+		return !empty($this->markedSafe[$context]);
+	}
+	public function setGenerator($callback)
+	{
+		if (!($callback instanceof ProgrammableCallback))
+			$callback = new ProgrammableCallback($callback);
+		$this->generator = $callback;
+	}
+	public function asConfig()
+	{
+		$vars = \get_object_vars($this);
+		unset($vars['markedSafe']);
+		return ConfigHelper::toArray($vars);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items;
+use InvalidArgumentException;
+use s9e\TextFormatter\Configurator\ConfigProvider;
+use s9e\TextFormatter\Configurator\Helpers\ConfigHelper;
+use s9e\TextFormatter\Configurator\JavaScript\Code;
+use s9e\TextFormatter\Configurator\JavaScript\FunctionProvider;
+class ProgrammableCallback implements ConfigProvider
+{
+	protected $callback;
+	protected $js = 'returnFalse';
+	protected $params = array();
+	protected $vars = array();
+	public function __construct($callback)
+	{
+		if (!\is_callable($callback))
+			throw new InvalidArgumentException(__METHOD__ . '() expects a callback');
+		$this->callback = $this->normalizeCallback($callback);
+		$this->autoloadJS();
+	}
+	public function addParameterByValue($paramValue)
+	{
+		$this->params[] = $paramValue;
+		return $this;
+	}
+	public function addParameterByName($paramName)
+	{
+		if (\array_key_exists($paramName, $this->params))
+			throw new InvalidArgumentException("Parameter '" . $paramName . "' already exists");
+		$this->params[$paramName] = \null;
+		return $this;
+	}
+	public function getCallback()
+	{
+		return $this->callback;
+	}
+	public function getJS()
+	{
+		return $this->js;
+	}
+	public function getVars()
+	{
+		return $this->vars;
+	}
+	public function resetParameters()
+	{
+		$this->params = array();
+		return $this;
+	}
+	public function setJS($js)
+	{
+		$this->js = $js;
+		return $this;
+	}
+	public function setVar($name, $value)
+	{
+		$this->vars[$name] = $value;
+		return $this;
+	}
+	public function setVars(array $vars)
+	{
+		$this->vars = $vars;
+		return $this;
+	}
+	public function asConfig()
+	{
+		$config = array('callback' => $this->callback);
+		foreach ($this->params as $k => $v)
+			if (\is_numeric($k))
+				$config['params'][] = $v;
+			elseif (isset($this->vars[$k]))
+				$config['params'][] = $this->vars[$k];
+			else
+				$config['params'][$k] = \null;
+		if (isset($config['params']))
+			$config['params'] = ConfigHelper::toArray($config['params'], \true, \true);
+		$config['js'] = new Code($this->js);
+		return $config;
+	}
+	protected function autoloadJS()
+	{
+		if (!\is_string($this->callback))
+			return;
+		try
+		{
+			$this->js = FunctionProvider::get($this->callback);
+		}
+		catch (InvalidArgumentException $e)
+		{
+			}
+	}
+	protected function normalizeCallback($callback)
+	{
+		if (\is_array($callback) && \is_string($callback[0]))
+			$callback = $callback[0] . '::' . $callback[1];
+		if (\is_string($callback))
+			$callback = \ltrim($callback, '\\');
+		return $callback;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items;
+use InvalidArgumentException;
+use s9e\TextFormatter\Configurator\ConfigProvider;
+use s9e\TextFormatter\Configurator\FilterableConfigValue;
+use s9e\TextFormatter\Configurator\Helpers\RegexpParser;
+use s9e\TextFormatter\Configurator\JavaScript\Code;
+use s9e\TextFormatter\Configurator\JavaScript\RegexpConvertor;
+class Regexp implements ConfigProvider, FilterableConfigValue
+{
+	protected $isGlobal;
+	protected $jsRegexp;
+	protected $regexp;
+	public function __construct($regexp, $isGlobal = \false)
+	{
+		if (@\preg_match($regexp, '') === \false)
+			throw new InvalidArgumentException('Invalid regular expression ' . \var_export($regexp, \true));
+		$this->regexp   = $regexp;
+		$this->isGlobal = $isGlobal;
+	}
+	public function __toString()
+	{
+		return $this->regexp;
+	}
+	public function asConfig()
+	{
+		return $this;
+	}
+	public function filterConfig($target)
+	{
+		return ($target === 'JS') ? new Code($this->getJS()) : (string) $this;
+	}
+	public function getCaptureNames()
+	{
+		return RegexpParser::getCaptureNames($this->regexp);
+	}
+	public function getJS()
+	{
+		if (!isset($this->jsRegexp))
+			$this->jsRegexp = RegexpConvertor::toJS($this->regexp, $this->isGlobal);
+		return $this->jsRegexp;
+	}
+	public function getNamedCaptures()
+	{
+		$captures   = array();
+		$regexpInfo = RegexpParser::parse($this->regexp);
+		$start = $regexpInfo['delimiter'] . '^';
+		$end   = '$' . $regexpInfo['delimiter'] . $regexpInfo['modifiers'];
+		if (\strpos($regexpInfo['modifiers'], 'D') === \false)
+			$end .= 'D';
+		foreach ($this->getNamedCapturesExpressions($regexpInfo['tokens']) as $name => $expr)
+			$captures[$name] = $start . $expr . $end;
+		return $captures;
+	}
+	protected function getNamedCapturesExpressions(array $tokens)
+	{
+		$exprs = array();
+		foreach ($tokens as $token)
+		{
+			if ($token['type'] !== 'capturingSubpatternStart' || !isset($token['name']))
+				continue;
+			$expr = $token['content'];
+			if (\strpos($expr, '|') !== \false)
+				$expr = '(?:' . $expr . ')';
+			$exprs[$token['name']] = $expr;
+		}
+		return $exprs;
+	}
+	public function setJS($jsRegexp)
+	{
+		$this->jsRegexp = $jsRegexp;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items;
+use InvalidArgumentException;
+use RuntimeException;
+use Traversable;
+use s9e\TextFormatter\Configurator\Collections\AttributeCollection;
+use s9e\TextFormatter\Configurator\Collections\AttributePreprocessorCollection;
+use s9e\TextFormatter\Configurator\Collections\Collection;
+use s9e\TextFormatter\Configurator\Collections\NormalizedCollection;
+use s9e\TextFormatter\Configurator\Collections\Ruleset;
+use s9e\TextFormatter\Configurator\Collections\TagFilterChain;
+use s9e\TextFormatter\Configurator\ConfigProvider;
+use s9e\TextFormatter\Configurator\Helpers\ConfigHelper;
+use s9e\TextFormatter\Configurator\Items\Template;
+use s9e\TextFormatter\Configurator\Traits\Configurable;
+class Tag implements ConfigProvider
+{
+	public function __get($propName)
+	{
+		$methodName = 'get' . \ucfirst($propName);
+		if (\method_exists($this, $methodName))
+			return $this->$methodName();
+		if (!\property_exists($this, $propName))
+			throw new RuntimeException("Property '" . $propName . "' does not exist");
+		return $this->$propName;
+	}
+	public function __set($propName, $propValue)
+	{
+		$methodName = 'set' . \ucfirst($propName);
+		if (\method_exists($this, $methodName))
+		{
+			$this->$methodName($propValue);
+			return;
+		}
+		if (!isset($this->$propName))
+		{
+			$this->$propName = $propValue;
+			return;
+		}
+		if ($this->$propName instanceof NormalizedCollection)
+		{
+			if (!\is_array($propValue)
+			 && !($propValue instanceof Traversable))
+				throw new InvalidArgumentException("Property '" . $propName . "' expects an array or a traversable object to be passed");
+			$this->$propName->clear();
+			foreach ($propValue as $k => $v)
+				$this->$propName->set($k, $v);
+			return;
+		}
+		if (\is_object($this->$propName))
+		{
+			if (!($propValue instanceof $this->$propName))
+				throw new InvalidArgumentException("Cannot replace property '" . $propName . "' of class '" . \get_class($this->$propName) . "' with instance of '" . \get_class($propValue) . "'");
+		}
+		else
+		{
+			$oldType = \gettype($this->$propName);
+			$newType = \gettype($propValue);
+			if ($oldType === 'boolean')
+				if ($propValue === 'false')
+				{
+					$newType   = 'boolean';
+					$propValue = \false;
+				}
+				elseif ($propValue === 'true')
+				{
+					$newType   = 'boolean';
+					$propValue = \true;
+				}
+			if ($oldType !== $newType)
+			{
+				$tmp = $propValue;
+				\settype($tmp, $oldType);
+				\settype($tmp, $newType);
+				if ($tmp !== $propValue)
+					throw new InvalidArgumentException("Cannot replace property '" . $propName . "' of type " . $oldType . ' with value of type ' . $newType);
+				\settype($propValue, $oldType);
+			}
+		}
+		$this->$propName = $propValue;
+	}
+	public function __isset($propName)
+	{
+		$methodName = 'isset' . \ucfirst($propName);
+		if (\method_exists($this, $methodName))
+			return $this->$methodName();
+		return isset($this->$propName);
+	}
+	public function __unset($propName)
+	{
+		$methodName = 'unset' . \ucfirst($propName);
+		if (\method_exists($this, $methodName))
+		{
+			$this->$methodName();
+			return;
+		}
+		if (!isset($this->$propName))
+			return;
+		if ($this->$propName instanceof Collection)
+		{
+			$this->$propName->clear();
+			return;
+		}
+		throw new RuntimeException("Property '" . $propName . "' cannot be unset");
+	}
+	protected $attributes;
+	protected $attributePreprocessors;
+	protected $filterChain;
+	protected $nestingLimit = 10;
+	protected $rules;
+	protected $tagLimit = 1000;
+	protected $template;
+	public function __construct(array $options = \null)
+	{
+		$this->attributes             = new AttributeCollection;
+		$this->attributePreprocessors = new AttributePreprocessorCollection;
+		$this->filterChain            = new TagFilterChain;
+		$this->rules                  = new Ruleset;
+		$this->filterChain->append('s9e\\TextFormatter\\Parser::executeAttributePreprocessors')
+		                  ->addParameterByName('tagConfig')
+		                  ->setJS('executeAttributePreprocessors');
+		$this->filterChain->append('s9e\\TextFormatter\\Parser::filterAttributes')
+		                  ->addParameterByName('tagConfig')
+		                  ->addParameterByName('registeredVars')
+		                  ->addParameterByName('logger')
+		                  ->setJS('filterAttributes');
+		if (isset($options))
+		{
+			\ksort($options);
+			foreach ($options as $optionName => $optionValue)
+				$this->__set($optionName, $optionValue);
+		}
+	}
+	public function asConfig()
+	{
+		$vars = \get_object_vars($this);
+		unset($vars['defaultChildRule']);
+		unset($vars['defaultDescendantRule']);
+		unset($vars['template']);
+		if (!\count($this->attributePreprocessors))
+		{
+			$callback = 's9e\\TextFormatter\\Parser::executeAttributePreprocessors';
+			$filterChain = clone $vars['filterChain'];
+			$i = \count($filterChain);
+			while (--$i >= 0)
+				if ($filterChain[$i]->getCallback() === $callback)
+					unset($filterChain[$i]);
+			$vars['filterChain'] = $filterChain;
+		}
+		return ConfigHelper::toArray($vars);
+	}
+	public function getTemplate()
+	{
+		return $this->template;
+	}
+	public function issetTemplate()
+	{
+		return isset($this->template);
+	}
+	public function setAttributePreprocessors($attributePreprocessors)
+	{
+		$this->attributePreprocessors->clear();
+		$this->attributePreprocessors->merge($attributePreprocessors);
+	}
+	public function setNestingLimit($limit)
+	{
+		$limit = (int) $limit;
+		if ($limit < 1)
+			throw new InvalidArgumentException('nestingLimit must be a number greater than 0');
+		$this->nestingLimit = $limit;
+	}
+	public function setRules($rules)
+	{
+		$this->rules->clear();
+		$this->rules->merge($rules);
+	}
+	public function setTagLimit($limit)
+	{
+		$limit = (int) $limit;
+		if ($limit < 1)
+			throw new InvalidArgumentException('tagLimit must be a number greater than 0');
+		$this->tagLimit = $limit;
+	}
+	public function setTemplate($template)
+	{
+		if (!($template instanceof Template))
+			$template = new Template($template);
+		$this->template = $template;
+	}
+	public function unsetTemplate()
+	{
+		unset($this->template);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript;
+use s9e\TextFormatter\Configurator\FilterableConfigValue;
+class Code implements FilterableConfigValue
+{
+	public $code;
+	public function __construct($code)
+	{
+		$this->code = $code;
+	}
+	public function __toString()
+	{
+		return (string) $this->code;
+	}
+	public function filterConfig($target)
+	{
+		return ($target === 'JS') ? $this : \null;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RendererGenerators;
+use DOMElement;
+use s9e\TextFormatter\Configurator\Helpers\TemplateHelper;
+use s9e\TextFormatter\Configurator\Helpers\TemplateParser;
+use s9e\TextFormatter\Configurator\RendererGenerator;
+use s9e\TextFormatter\Configurator\RendererGenerators\PHP\ControlStructuresOptimizer;
+use s9e\TextFormatter\Configurator\RendererGenerators\PHP\Optimizer;
+use s9e\TextFormatter\Configurator\RendererGenerators\PHP\Quick;
+use s9e\TextFormatter\Configurator\RendererGenerators\PHP\Serializer;
+use s9e\TextFormatter\Configurator\Rendering;
+class PHP implements RendererGenerator
+{
+	const XMLNS_XSL = 'http://www.w3.org/1999/XSL/Transform';
+	public $cacheDir;
+	public $className;
+	public $controlStructuresOptimizer;
+	public $defaultClassPrefix = 'Renderer_';
+	public $enableQuickRenderer = \true;
+	public $filepath;
+	public $lastClassName;
+	public $lastFilepath;
+	public $optimizer;
+	public $serializer;
+	public $useMultibyteStringFunctions;
+	public function __construct($cacheDir = \null)
+	{
+		$this->cacheDir = (isset($cacheDir)) ? $cacheDir : \sys_get_temp_dir();
+		if (\extension_loaded('tokenizer'))
+		{
+			$this->controlStructuresOptimizer = new ControlStructuresOptimizer;
+			$this->optimizer = new Optimizer;
+		}
+		$this->useMultibyteStringFunctions = \extension_loaded('mbstring');
+		$this->serializer = new Serializer;
+	}
+	public function getRenderer(Rendering $rendering)
+	{
+		$php = $this->generate($rendering);
+		if (isset($this->filepath))
+			$filepath = $this->filepath;
+		else
+			$filepath = $this->cacheDir . '/' . \str_replace('\\', '_', $this->lastClassName) . '.php';
+		\file_put_contents($filepath, "<?php\n" . $php);
+		$this->lastFilepath = \realpath($filepath);
+		if (!\class_exists($this->lastClassName, \false))
+			include $filepath;
+		$renderer = new $this->lastClassName;
+		$renderer->source = $php;
+		return $renderer;
+	}
+	public function generate(Rendering $rendering)
+	{
+		$this->serializer->useMultibyteStringFunctions = $this->useMultibyteStringFunctions;
+		$templates = $rendering->getTemplates();
+		$groupedTemplates = array();
+		foreach ($templates as $tagName => $template)
+			$groupedTemplates[$template][] = $tagName;
+		$hasApplyTemplatesSelect = \false;
+		$tagBranch   = 0;
+		$tagBranches = array();
+		$compiledTemplates = array();
+		$branchTables = array();
+		foreach ($groupedTemplates as $template => $tagNames)
+		{
+			$ir = TemplateParser::parse($template);
+			if (!$hasApplyTemplatesSelect)
+				foreach ($ir->getElementsByTagName('applyTemplates') as $applyTemplates)
+					if ($applyTemplates->hasAttribute('select'))
+						$hasApplyTemplatesSelect = \true;
+			$templateSource = $this->serializer->serialize($ir->documentElement);
+			if (isset($this->optimizer))
+				$templateSource = $this->optimizer->optimize($templateSource);
+			$branchTables += $this->serializer->branchTables;
+			$compiledTemplates[$tagBranch] = $templateSource;
+			foreach ($tagNames as $tagName)
+				$tagBranches[$tagName] = $tagBranch;
+			++$tagBranch;
+		}
+		unset($groupedTemplates, $ir, $quickRender);
+		$quickSource = \false;
+		if ($this->enableQuickRenderer)
+		{
+			$quickRender = array();
+			foreach ($tagBranches as $tagName => $tagBranch)
+				$quickRender[$tagName] = $compiledTemplates[$tagBranch];
+			$quickSource = Quick::getSource($quickRender);
+			unset($quickRender);
+		}
+		$templatesSource = Quick::generateConditionals('$tb', $compiledTemplates);
+		unset($compiledTemplates);
+		if ($hasApplyTemplatesSelect)
+			$needsXPath = \true;
+		elseif (\strpos($templatesSource, '$this->getParamAsXPath') !== \false)
+			$needsXPath = \true;
+		elseif (\strpos($templatesSource, '$this->xpath') !== \false)
+			$needsXPath = \true;
+		else
+			$needsXPath = \false;
+		$php = array();
+		$php[] = ' extends \\s9e\\TextFormatter\\Renderer';
+		$php[] = '{';
+		$php[] = '	protected $params=' . self::export($rendering->getAllParameters()) . ';';
+		$php[] = '	protected static $tagBranches=' . self::export($tagBranches) . ';';
+		foreach ($branchTables as $varName => $branchTable)
+			$php[] = '	protected static $' . $varName . '=' . self::export($branchTable) . ';';
+		if ($needsXPath)
+			$php[] = '	protected $xpath;';
+		$php[] = '	public function __sleep()';
+		$php[] = '	{';
+		$php[] = '		$props = get_object_vars($this);';
+		$php[] = "		unset(\$props['out'], \$props['proc'], \$props['source']" . (($needsXPath) ? ", \$props['xpath']" : '') . ');';
+		$php[] = '		return array_keys($props);';
+		$php[] = '	}';
+		$php[] = '	public function renderRichText($xml)';
+		$php[] = '	{';
+		if ($quickSource !== \false)
+		{
+			$php[] = '		if (!isset($this->quickRenderingTest) || !preg_match($this->quickRenderingTest, $xml))';
+			$php[] = '		{';
+			$php[] = '			try';
+			$php[] = '			{';
+			$php[] = '				return $this->renderQuick($xml);';
+			$php[] = '			}';
+			$php[] = '			catch (\\Exception $e)';
+			$php[] = '			{';
+			$php[] = '			}';
+			$php[] = '		}';
+		}
+		$php[] = '		$dom = $this->loadXML($xml);';
+		if ($needsXPath)
+			$php[] = '		$this->xpath = new \\DOMXPath($dom);';
+		$php[] = "		\$this->out = '';";
+		$php[] = '		$this->at($dom->documentElement);';
+		if ($needsXPath)
+			$php[] = '		$this->xpath = null;';
+		$php[] = '		return $this->out;';
+		$php[] = '	}';
+		if ($hasApplyTemplatesSelect)
+			$php[] = '	protected function at(\\DOMNode $root, $xpath = null)';
+		else
+			$php[] = '	protected function at(\\DOMNode $root)';
+		$php[] = '	{';
+		$php[] = '		if ($root->nodeType === 3)';
+		$php[] = '		{';
+		$php[] = '			$this->out .= htmlspecialchars($root->textContent,' . \ENT_NOQUOTES . ');';
+		$php[] = '		}';
+		$php[] = '		else';
+		$php[] = '		{';
+		if ($hasApplyTemplatesSelect)
+			$php[] = '			foreach (isset($xpath) ? $this->xpath->query($xpath, $root) : $root->childNodes as $node)';
+		else
+			$php[] = '			foreach ($root->childNodes as $node)';
+		$php[] = '			{';
+		$php[] = '				if (!isset(self::$tagBranches[$node->nodeName]))';
+		$php[] = '				{';
+		$php[] = '					$this->at($node);';
+		$php[] = '				}';
+		$php[] = '				else';
+		$php[] = '				{';
+		$php[] = '					$tb = self::$tagBranches[$node->nodeName];';
+		$php[] = '					' . $templatesSource;
+		$php[] = '				}';
+		$php[] = '			}';
+		$php[] = '		}';
+		$php[] = '	}';
+		if (\strpos($templatesSource, '$this->getParamAsXPath') !== \false)
+		{
+			$php[] = '	protected function getParamAsXPath($k)';
+			$php[] = '	{';
+			$php[] = '		if (!isset($this->params[$k]))';
+			$php[] = '		{';
+			$php[] = '			return "\'\'";';
+			$php[] = '		}';
+			$php[] = '		$str = $this->params[$k];';
+			$php[] = '		if (strpos($str, "\'") === false)';
+			$php[] = '		{';
+			$php[] = '			return "\'$str\'";';
+			$php[] = '		}';
+			$php[] = '		if (strpos($str, \'"\') === false)';
+			$php[] = '		{';
+			$php[] = '			return "\\"$str\\"";';
+			$php[] = '		}';
+			$php[] = '		$toks = array();';
+			$php[] = '		$c = \'"\';';
+			$php[] = '		$pos = 0;';
+			$php[] = '		while ($pos < strlen($str))';
+			$php[] = '		{';
+			$php[] = '			$spn = strcspn($str, $c, $pos);';
+			$php[] = '			if ($spn)';
+			$php[] = '			{';
+			$php[] = '				$toks[] = $c . substr($str, $pos, $spn) . $c;';
+			$php[] = '				$pos += $spn;';
+			$php[] = '			}';
+			$php[] = '			$c = ($c === \'"\') ? "\'" : \'"\';';
+			$php[] = '		}';
+			$php[] = '		return \'concat(\' . implode(\',\', $toks) . \')\';';
+			$php[] = '	}';
+		}
+		if ($quickSource !== \false)
+			$php[] = $quickSource;
+		$php[] = '}';
+		$php = \implode("\n", $php);
+		if (isset($this->controlStructuresOptimizer))
+			$php = $this->controlStructuresOptimizer->optimize($php);
+		$className = (isset($this->className))
+		           ? $this->className
+		           : $this->defaultClassPrefix . \sha1($php);
+		$this->lastClassName = $className;
+		$header = "\n/**\n* @package   s9e\TextFormatter\n* @copyright Copyright (c) 2010-2016 The s9e Authors\n* @license   http://www.opensource.org/licenses/mit-license.php The MIT License\n*/\n";
+		$pos = \strrpos($className, '\\');
+		if ($pos !== \false)
+		{
+			$header .= 'namespace ' . \substr($className, 0, $pos) . ";\n\n";
+			$className = \substr($className, 1 + $pos);
+		}
+		$php = $header . 'class ' . $className . $php;
+		return $php;
+	}
+	protected static function export(array $value)
+	{
+		$pairs = array();
+		foreach ($value as $k => $v)
+			$pairs[] = \var_export($k, \true) . '=>' . \var_export($v, \true);
+		return 'array(' . \implode(',', $pairs) . ')';
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RendererGenerators\PHP;
+class ControlStructuresOptimizer extends AbstractOptimizer
+{
+	protected $braces;
+	protected $context;
+	protected function blockEndsWithIf()
+	{
+		return \in_array($this->context['lastBlock'], array(\T_IF, \T_ELSEIF), \true);
+	}
+	protected function isControlStructure()
+	{
+		return \in_array(
+			$this->tokens[$this->i][0],
+			array(\T_ELSE, \T_ELSEIF, \T_FOR, \T_FOREACH, \T_IF, \T_WHILE),
+			\true
+		);
+	}
+	protected function isFollowedByElse()
+	{
+		if ($this->i > $this->cnt - 4)
+			return \false;
+		$k = $this->i + 1;
+		if ($this->tokens[$k][0] === \T_WHITESPACE)
+			++$k;
+		return \in_array($this->tokens[$k][0], array(\T_ELSEIF, \T_ELSE), \true);
+	}
+	protected function mustPreserveBraces()
+	{
+		return ($this->blockEndsWithIf() && $this->isFollowedByElse());
+	}
+	protected function optimizeTokens()
+	{
+		while (++$this->i < $this->cnt)
+			if ($this->tokens[$this->i] === ';')
+				++$this->context['statements'];
+			elseif ($this->tokens[$this->i] === '{')
+				++$this->braces;
+			elseif ($this->tokens[$this->i] === '}')
+			{
+				if ($this->context['braces'] === $this->braces)
+					$this->processEndOfBlock();
+				--$this->braces;
+			}
+			elseif ($this->isControlStructure())
+				$this->processControlStructure();
+	}
+	protected function processControlStructure()
+	{
+		$savedIndex = $this->i;
+		if (!\in_array($this->tokens[$this->i][0], array(\T_ELSE, \T_ELSEIF), \true))
+			++$this->context['statements'];
+		if ($this->tokens[$this->i][0] !== \T_ELSE)
+			$this->skipCondition();
+		$this->skipWhitespace();
+		if ($this->tokens[$this->i] !== '{')
+		{
+			$this->i = $savedIndex;
+			return;
+		}
+		++$this->braces;
+		$replacement = array(\T_WHITESPACE, '');
+		if ($this->tokens[$savedIndex][0]  === \T_ELSE
+		 && $this->tokens[$this->i + 1][0] !== \T_VARIABLE
+		 && $this->tokens[$this->i + 1][0] !== \T_WHITESPACE)
+			$replacement = array(\T_WHITESPACE, ' ');
+		$this->context['lastBlock'] = $this->tokens[$savedIndex][0];
+		$this->context = array(
+			'braces'      => $this->braces,
+			'index'       => $this->i,
+			'lastBlock'   => \null,
+			'parent'      => $this->context,
+			'replacement' => $replacement,
+			'savedIndex'  => $savedIndex,
+			'statements'  => 0
+		);
+	}
+	protected function processEndOfBlock()
+	{
+		if ($this->context['statements'] < 2 && !$this->mustPreserveBraces())
+			$this->removeBracesInCurrentContext();
+		$this->context = $this->context['parent'];
+		$this->context['parent']['lastBlock'] = $this->context['lastBlock'];
+	}
+	protected function removeBracesInCurrentContext()
+	{
+		$this->tokens[$this->context['index']] = $this->context['replacement'];
+		$this->tokens[$this->i] = ($this->context['statements']) ? array(\T_WHITESPACE, '') : ';';
+		foreach (array($this->context['index'] - 1, $this->i - 1) as $tokenIndex)
+			if ($this->tokens[$tokenIndex][0] === \T_WHITESPACE)
+				$this->tokens[$tokenIndex][1] = '';
+		if ($this->tokens[$this->context['savedIndex']][0] === \T_ELSE)
+		{
+			$j = 1 + $this->context['savedIndex'];
+			while ($this->tokens[$j][0] === \T_WHITESPACE
+			    || $this->tokens[$j][0] === \T_COMMENT
+			    || $this->tokens[$j][0] === \T_DOC_COMMENT)
+				++$j;
+			if ($this->tokens[$j][0] === \T_IF)
+			{
+				$this->tokens[$j] = array(\T_ELSEIF, 'elseif');
+				$j = $this->context['savedIndex'];
+				$this->tokens[$j] = array(\T_WHITESPACE, '');
+				if ($this->tokens[$j - 1][0] === \T_WHITESPACE)
+					$this->tokens[$j - 1][1] = '';
+				$this->unindentBlock($j, $this->i - 1);
+				$this->tokens[$this->context['index']] = array(\T_WHITESPACE, '');
+			}
+		}
+		$this->changed = \true;
+	}
+	protected function reset($php)
+	{
+		parent::reset($php);
+		$this->braces  = 0;
+		$this->context = array(
+			'braces'      => 0,
+			'index'       => -1,
+			'parent'      => array(),
+			'preventElse' => \false,
+			'savedIndex'  => 0,
+			'statements'  => 0
+		);
+	}
+	protected function skipCondition()
+	{
+		$this->skipToString('(');
+		$parens = 0;
+		while (++$this->i < $this->cnt)
+			if ($this->tokens[$this->i] === ')')
+				if ($parens)
+					--$parens;
+				else
+					break;
+			elseif ($this->tokens[$this->i] === '(')
+				++$parens;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RulesGenerators;
+use s9e\TextFormatter\Configurator\Helpers\TemplateForensics;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\BooleanRulesGenerator;
+class AutoCloseIfVoid implements BooleanRulesGenerator
+{
+	public function generateBooleanRules(TemplateForensics $src)
+	{
+		return ($src->isVoid()) ? array('autoClose' => \true) : array();
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RulesGenerators;
+use s9e\TextFormatter\Configurator\Helpers\TemplateForensics;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\BooleanRulesGenerator;
+class AutoReopenFormattingElements implements BooleanRulesGenerator
+{
+	public function generateBooleanRules(TemplateForensics $src)
+	{
+		return ($src->isFormattingElement()) ? array('autoReopen' => \true) : array();
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RulesGenerators;
+use s9e\TextFormatter\Configurator\Helpers\TemplateForensics;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\TargetedRulesGenerator;
+class BlockElementsFosterFormattingElements implements TargetedRulesGenerator
+{
+	public function generateTargetedRules(TemplateForensics $src, TemplateForensics $trg)
+	{
+		return ($src->isBlock() && $src->isPassthrough() && $trg->isFormattingElement()) ? array('fosterParent') : array();
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RulesGenerators;
+use s9e\TextFormatter\Configurator\Helpers\TemplateForensics;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\BooleanRulesGenerator;
+class DisableAutoLineBreaksIfNewLinesArePreserved implements BooleanRulesGenerator
+{
+	public function generateBooleanRules(TemplateForensics $src)
+	{
+		return ($src->preservesNewLines()) ? array('disableAutoLineBreaks' => \true) : array();
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RulesGenerators;
+use s9e\TextFormatter\Configurator\Helpers\TemplateForensics;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\BooleanRulesGenerator;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\TargetedRulesGenerator;
+class EnforceContentModels implements BooleanRulesGenerator, TargetedRulesGenerator
+{
+	protected $br;
+	protected $span;
+	public function __construct()
+	{
+		$this->br   = new TemplateForensics('<br/>');
+		$this->span = new TemplateForensics('<span><xsl:apply-templates/></span>');
+	}
+	public function generateBooleanRules(TemplateForensics $src)
+	{
+		$rules = array();
+		if ($src->isTransparent())
+			$rules['isTransparent'] = \true;
+		if (!$src->allowsChild($this->br))
+		{
+			$rules['preventLineBreaks'] = \true;
+			$rules['suspendAutoLineBreaks'] = \true;
+		}
+		if (!$src->allowsDescendant($this->br))
+		{
+			$rules['disableAutoLineBreaks'] = \true;
+			$rules['preventLineBreaks'] = \true;
+		}
+		return $rules;
+	}
+	public function generateTargetedRules(TemplateForensics $src, TemplateForensics $trg)
+	{
+		if (!$src->allowsChildElements())
+			$src = $this->span;
+		$rules = array();
+		if (!$src->allowsChild($trg))
+			$rules[] = 'denyChild';
+		if (!$src->allowsDescendant($trg))
+			$rules[] = 'denyDescendant';
+		return $rules;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RulesGenerators;
+use s9e\TextFormatter\Configurator\Helpers\TemplateForensics;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\TargetedRulesGenerator;
+class EnforceOptionalEndTags implements TargetedRulesGenerator
+{
+	public function generateTargetedRules(TemplateForensics $src, TemplateForensics $trg)
+	{
+		return ($src->closesParent($trg)) ? array('closeParent') : array();
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RulesGenerators;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Helpers\TemplateForensics;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\BooleanRulesGenerator;
+class IgnoreTagsInCode implements BooleanRulesGenerator
+{
+	public function generateBooleanRules(TemplateForensics $src)
+	{
+		$xpath = new DOMXPath($src->getDOM());
+		if ($xpath->evaluate('count(//code//xsl:apply-templates)'))
+			return array('ignoreTags' => \true);
+		return array();
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RulesGenerators;
+use s9e\TextFormatter\Configurator\Helpers\TemplateForensics;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\BooleanRulesGenerator;
+class IgnoreTextIfDisallowed implements BooleanRulesGenerator
+{
+	public function generateBooleanRules(TemplateForensics $src)
+	{
+		return ($src->allowsText()) ? array() : array('ignoreText' => \true);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RulesGenerators;
+use s9e\TextFormatter\Configurator\Helpers\TemplateForensics;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\BooleanRulesGenerator;
+class IgnoreWhitespaceAroundBlockElements implements BooleanRulesGenerator
+{
+	public function generateBooleanRules(TemplateForensics $src)
+	{
+		return ($src->isBlock()) ? array('ignoreSurroundingWhitespace' => \true) : array();
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RulesGenerators;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Helpers\TemplateForensics;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\BooleanRulesGenerator;
+class TrimFirstLineInCodeBlocks implements BooleanRulesGenerator
+{
+	public function generateBooleanRules(TemplateForensics $src)
+	{
+		$rules = array();
+		$xpath = new DOMXPath($src->getDOM());
+		if ($xpath->evaluate('count(//pre//code//xsl:apply-templates)') > 0)
+			$rules['trimFirstLine'] = \true;
+		return $rules;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMAttr;
+use DOMElement;
+use DOMNode;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Exceptions\UnsafeTemplateException;
+use s9e\TextFormatter\Configurator\Helpers\AVTHelper;
+use s9e\TextFormatter\Configurator\Items\Attribute;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\TemplateCheck;
+abstract class AbstractDynamicContentCheck extends TemplateCheck
+{
+	protected $ignoreUnknownAttributes = \false;
+	abstract protected function getNodes(DOMElement $template);
+	abstract protected function isSafe(Attribute $attribute);
+	public function check(DOMElement $template, Tag $tag)
+	{
+		foreach ($this->getNodes($template) as $node)
+			$this->checkNode($node, $tag);
+	}
+	public function detectUnknownAttributes()
+	{
+		$this->ignoreUnknownAttributes = \false;
+	}
+	public function ignoreUnknownAttributes()
+	{
+		$this->ignoreUnknownAttributes = \true;
+	}
+	protected function checkAttribute(DOMNode $node, Tag $tag, $attrName)
+	{
+		if (!isset($tag->attributes[$attrName]))
+		{
+			if ($this->ignoreUnknownAttributes)
+				return;
+			throw new UnsafeTemplateException("Cannot assess the safety of unknown attribute '" . $attrName . "'", $node);
+		}
+		if (!$this->tagFiltersAttributes($tag) || !$this->isSafe($tag->attributes[$attrName]))
+			throw new UnsafeTemplateException("Attribute '" . $attrName . "' is not properly sanitized to be used in this context", $node);
+	}
+	protected function checkAttributeNode(DOMAttr $attribute, Tag $tag)
+	{
+		foreach (AVTHelper::parse($attribute->value) as $token)
+			if ($token[0] === 'expression')
+				$this->checkExpression($attribute, $token[1], $tag);
+	}
+	protected function checkContext(DOMNode $node)
+	{
+		$xpath     = new DOMXPath($node->ownerDocument);
+		$ancestors = $xpath->query('ancestor::xsl:for-each', $node);
+		if ($ancestors->length)
+			throw new UnsafeTemplateException("Cannot assess context due to '" . $ancestors->item(0)->nodeName . "'", $node);
+	}
+	protected function checkCopyOfNode(DOMElement $node, Tag $tag)
+	{
+		$this->checkSelectNode($node->getAttributeNode('select'), $tag);
+	}
+	protected function checkElementNode(DOMElement $element, Tag $tag)
+	{
+		$xpath = new DOMXPath($element->ownerDocument);
+		$predicate = ($element->localName === 'attribute') ? '' : '[not(ancestor::xsl:attribute)]';
+		$query = './/xsl:value-of' . $predicate;
+		foreach ($xpath->query($query, $element) as $valueOf)
+			$this->checkSelectNode($valueOf->getAttributeNode('select'), $tag);
+		$query = './/xsl:apply-templates' . $predicate;
+		foreach ($xpath->query($query, $element) as $applyTemplates)
+			throw new UnsafeTemplateException('Cannot allow unfiltered data in this context', $applyTemplates);
+	}
+	protected function checkExpression(DOMNode $node, $expr, Tag $tag)
+	{
+		$this->checkContext($node);
+		if (\preg_match('/^\\$(\\w+)$/', $expr, $m))
+		{
+			$this->checkVariable($node, $tag, $m[1]);
+			return;
+		}
+		if ($this->isExpressionSafe($expr))
+			return;
+		if (\preg_match('/^@(\\w+)$/', $expr, $m))
+		{
+			$this->checkAttribute($node, $tag, $m[1]);
+			return;
+		}
+		throw new UnsafeTemplateException("Cannot assess the safety of expression '" . $expr . "'", $node);
+	}
+	protected function checkNode(DOMNode $node, Tag $tag)
+	{
+		if ($node instanceof DOMAttr)
+			$this->checkAttributeNode($node, $tag);
+		elseif ($node instanceof DOMElement)
+			if ($node->namespaceURI === self::XMLNS_XSL
+			 && $node->localName    === 'copy-of')
+				$this->checkCopyOfNode($node, $tag);
+			else
+				$this->checkElementNode($node, $tag);
+	}
+	protected function checkVariable(DOMNode $node, $tag, $qname)
+	{
+		$this->checkVariableDeclaration($node, $tag, 'xsl:param[@name="' . $qname . '"]');
+		$this->checkVariableDeclaration($node, $tag, 'xsl:variable[@name="' . $qname . '"]');
+	}
+	protected function checkVariableDeclaration(DOMNode $node, $tag, $query)
+	{
+		$query = 'ancestor-or-self::*/preceding-sibling::' . $query . '[@select]';
+		$xpath = new DOMXPath($node->ownerDocument);
+		foreach ($xpath->query($query, $node) as $varNode)
+		{
+			try
+			{
+				$this->checkExpression($varNode, $varNode->getAttribute('select'), $tag);
+			}
+			catch (UnsafeTemplateException $e)
+			{
+				$e->setNode($node);
+				throw $e;
+			}
+		}
+	}
+	protected function checkSelectNode(DOMAttr $select, Tag $tag)
+	{
+		$this->checkExpression($select, $select->value, $tag);
+	}
+	protected function isExpressionSafe($expr)
+	{
+		return \false;
+	}
+	protected function tagFiltersAttributes(Tag $tag)
+	{
+		return $tag->filterChain->containsCallback('s9e\\TextFormatter\\Parser::filterAttributes');
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMElement;
+use DOMNode;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Exceptions\UnsafeTemplateException;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\TemplateCheck;
+abstract class AbstractFlashRestriction extends TemplateCheck
+{
+	public $defaultSetting;
+	public $maxSetting;
+	public $onlyIfDynamic;
+	protected $settingName;
+	protected $settings;
+	protected $template;
+	public function __construct($maxSetting, $onlyIfDynamic = \false)
+	{
+		$this->maxSetting    = $maxSetting;
+		$this->onlyIfDynamic = $onlyIfDynamic;
+	}
+	public function check(DOMElement $template, Tag $tag)
+	{
+		$this->template = $template;
+		$this->checkEmbeds();
+		$this->checkObjects();
+	}
+	protected function checkAttributes(DOMElement $embed)
+	{
+		$settingName = \strtolower($this->settingName);
+		$useDefault  = \true;
+		foreach ($embed->attributes as $attribute)
+		{
+			$attrName = \strtolower($attribute->name);
+			if ($attrName === $settingName)
+			{
+				$this->checkSetting($attribute, $attribute->value);
+				$useDefault = \false;
+			}
+		}
+		if ($useDefault)
+			$this->checkSetting($embed, $this->defaultSetting);
+	}
+	protected function checkDynamicAttributes(DOMElement $embed)
+	{
+		$settingName = \strtolower($this->settingName);
+		foreach ($embed->getElementsByTagNameNS(self::XMLNS_XSL, 'attribute') as $attribute)
+		{
+			$attrName = \strtolower($attribute->getAttribute('name'));
+			if ($attrName === $settingName)
+				throw new UnsafeTemplateException('Cannot assess the safety of dynamic attributes', $attribute);
+		}
+	}
+	protected function checkDynamicParams(DOMElement $object)
+	{
+		foreach ($this->getObjectParams($object) as $param)
+			foreach ($param->getElementsByTagNameNS(self::XMLNS_XSL, 'attribute') as $attribute)
+				if (\strtolower($attribute->getAttribute('name')) === 'value')
+					throw new UnsafeTemplateException('Cannot assess the safety of dynamic attributes', $attribute);
+	}
+	protected function checkEmbeds()
+	{
+		foreach ($this->getElements('embed') as $embed)
+		{
+			$this->checkDynamicAttributes($embed);
+			$this->checkAttributes($embed);
+		}
+	}
+	protected function checkObjects()
+	{
+		foreach ($this->getElements('object') as $object)
+		{
+			$this->checkDynamicParams($object);
+			$params = $this->getObjectParams($object);
+			foreach ($params as $param)
+				$this->checkSetting($param, $param->getAttribute('value'));
+			if (empty($params))
+				$this->checkSetting($object, $this->defaultSetting);
+		}
+	}
+	protected function checkSetting(DOMNode $node, $setting)
+	{
+		if (!isset($this->settings[\strtolower($setting)]))
+		{
+			if (\preg_match('/(?<!\\{)\\{(?:\\{\\{)*(?!\\{)/', $setting))
+				throw new UnsafeTemplateException('Cannot assess ' . $this->settingName . " setting '" . $setting . "'", $node);
+			throw new UnsafeTemplateException('Unknown ' . $this->settingName . " value '" . $setting . "'", $node);
+		}
+		$value    = $this->settings[\strtolower($setting)];
+		$maxValue = $this->settings[\strtolower($this->maxSetting)];
+		if ($value > $maxValue)
+			throw new UnsafeTemplateException($this->settingName . " setting '" . $setting . "' exceeds restricted value '" . $this->maxSetting . "'", $node);
+	}
+	protected function isDynamic(DOMElement $node)
+	{
+		if ($node->getElementsByTagNameNS(self::XMLNS_XSL, '*')->length)
+			return \true;
+		$xpath = new DOMXPath($node->ownerDocument);
+		$query = './/@*[contains(., "{")]';
+		foreach ($xpath->query($query, $node) as $attribute)
+			if (\preg_match('/(?<!\\{)\\{(?:\\{\\{)*(?!\\{)/', $attribute->value))
+				return \true;
+		return \false;
+	}
+	protected function getElements($tagName)
+	{
+		$nodes = array();
+		foreach ($this->template->ownerDocument->getElementsByTagName($tagName) as $node)
+			if (!$this->onlyIfDynamic || $this->isDynamic($node))
+				$nodes[] = $node;
+		return $nodes;
+	}
+	protected function getObjectParams(DOMElement $object)
+	{
+		$params      = array();
+		$settingName = \strtolower($this->settingName);
+		foreach ($object->getElementsByTagName('param') as $param)
+		{
+			$paramName = \strtolower($param->getAttribute('name'));
+			if ($paramName === $settingName && $param->parentNode->isSameNode($object))
+				$params[] = $param;
+		}
+		return $params;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Exceptions\UnsafeTemplateException;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\TemplateCheck;
+class DisallowAttributeSets extends TemplateCheck
+{
+	public function check(DOMElement $template, Tag $tag)
+	{
+		$xpath = new DOMXPath($template->ownerDocument);
+		$nodes = $xpath->query('//@use-attribute-sets');
+		if ($nodes->length)
+			throw new UnsafeTemplateException('Cannot assess the safety of attribute sets', $nodes->item(0));
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMElement;
+use s9e\TextFormatter\Configurator\Exceptions\UnsafeTemplateException;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\TemplateCheck;
+class DisallowCopy extends TemplateCheck
+{
+	public function check(DOMElement $template, Tag $tag)
+	{
+		$nodes = $template->getElementsByTagNameNS(self::XMLNS_XSL, 'copy');
+		$node  = $nodes->item(0);
+		if ($node)
+			throw new UnsafeTemplateException("Cannot assess the safety of an '" . $node->nodeName . "' element", $node);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Exceptions\UnsafeTemplateException;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\TemplateCheck;
+class DisallowDisableOutputEscaping extends TemplateCheck
+{
+	public function check(DOMElement $template, Tag $tag)
+	{
+		$xpath = new DOMXPath($template->ownerDocument);
+		$node  = $xpath->query('//@disable-output-escaping')->item(0);
+		if ($node)
+			throw new UnsafeTemplateException("The template contains a 'disable-output-escaping' attribute", $node);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMElement;
+use s9e\TextFormatter\Configurator\Exceptions\UnsafeTemplateException;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\TemplateCheck;
+class DisallowDynamicAttributeNames extends TemplateCheck
+{
+	public function check(DOMElement $template, Tag $tag)
+	{
+		$nodes = $template->getElementsByTagNameNS(self::XMLNS_XSL, 'attribute');
+		foreach ($nodes as $node)
+			if (\strpos($node->getAttribute('name'), '{') !== \false)
+				throw new UnsafeTemplateException('Dynamic <xsl:attribute/> names are disallowed', $node);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMElement;
+use s9e\TextFormatter\Configurator\Exceptions\UnsafeTemplateException;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\TemplateCheck;
+class DisallowDynamicElementNames extends TemplateCheck
+{
+	public function check(DOMElement $template, Tag $tag)
+	{
+		$nodes = $template->getElementsByTagNameNS(self::XMLNS_XSL, 'element');
+		foreach ($nodes as $node)
+			if (\strpos($node->getAttribute('name'), '{') !== \false)
+				throw new UnsafeTemplateException('Dynamic <xsl:element/> names are disallowed', $node);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMElement;
+use s9e\TextFormatter\Configurator\Exceptions\UnsafeTemplateException;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\TemplateCheck;
+class DisallowElementNS extends TemplateCheck
+{
+	public $elName;
+	public $namespaceURI;
+	public function __construct($namespaceURI, $elName)
+	{
+		$this->namespaceURI  = $namespaceURI;
+		$this->elName        = $elName;
+	}
+	public function check(DOMElement $template, Tag $tag)
+	{
+		$node = $template->getElementsByTagNameNS($this->namespaceURI, $this->elName)->item(0);
+		if ($node)
+			throw new UnsafeTemplateException("Element '" . $node->nodeName . "' is disallowed", $node);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Exceptions\UnsafeTemplateException;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\TemplateCheck;
+class DisallowObjectParamsWithGeneratedName extends TemplateCheck
+{
+	public function check(DOMElement $template, Tag $tag)
+	{
+		$xpath = new DOMXPath($template->ownerDocument);
+		$query = '//object//param[contains(@name, "{") or .//xsl:attribute[translate(@name, "NAME", "name") = "name"]]';
+		$nodes = $xpath->query($query);
+		foreach ($nodes as $node)
+			throw new UnsafeTemplateException("A 'param' element with a suspect name has been found", $node);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Exceptions\UnsafeTemplateException;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\TemplateCheck;
+class DisallowPHPTags extends TemplateCheck
+{
+	public function check(DOMElement $template, Tag $tag)
+	{
+		$queries = array(
+			'//processing-instruction()["php" = translate(name(),"HP","hp")]'
+				=> 'PHP tags are not allowed in the template',
+			'//script["php" = translate(@language,"HP","hp")]'
+				=> 'PHP tags are not allowed in the template',
+			'//xsl:processing-instruction["php" = translate(@name,"HP","hp")]'
+				=> 'PHP tags are not allowed in the output',
+			'//xsl:processing-instruction[contains(@name, "{")]'
+				=> 'Dynamic processing instructions are not allowed',
+		);
+		$xpath = new DOMXPath($template->ownerDocument);
+		foreach ($queries as $query => $error)
+		{
+			$nodes = $xpath->query($query); 
+			if ($nodes->length)
+				throw new UnsafeTemplateException($error, $nodes->item(0));
+		}
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMElement;
+use s9e\TextFormatter\Configurator\Exceptions\UnsafeTemplateException;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\TemplateCheck;
+class DisallowUnsafeCopyOf extends TemplateCheck
+{
+	public function check(DOMElement $template, Tag $tag)
+	{
+		$nodes = $template->getElementsByTagNameNS(self::XMLNS_XSL, 'copy-of');
+		foreach ($nodes as $node)
+		{
+			$expr = $node->getAttribute('select');
+			if (!\preg_match('#^@[-\\w]*$#D', $expr))
+				throw new UnsafeTemplateException("Cannot assess the safety of '" . $node->nodeName . "' select expression '" . $expr . "'", $node);
+		}
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Exceptions\UnsafeTemplateException;
+use s9e\TextFormatter\Configurator\Helpers\AVTHelper;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\TemplateCheck;
+class DisallowXPathFunction extends TemplateCheck
+{
+	public $funcName;
+	public function __construct($funcName)
+	{
+		$this->funcName = $funcName;
+	}
+	public function check(DOMElement $template, Tag $tag)
+	{
+		$regexp = '#(?!<\\pL)' . \preg_quote($this->funcName, '#') . '\\s*\\(#iu';
+		$regexp = \str_replace('\\:', '\\s*:\\s*', $regexp);
+		foreach ($this->getExpressions($template) as $expr => $node)
+		{
+			$expr = \preg_replace('#([\'"]).*?\\1#s', '', $expr);
+			if (\preg_match($regexp, $expr))
+				throw new UnsafeTemplateException('An XPath expression uses the ' . $this->funcName . '() function', $node);
+		}
+	}
+	protected function getExpressions(DOMElement $template)
+	{
+		$xpath = new DOMXPath($template->ownerDocument);
+		$exprs = array();
+		foreach ($xpath->query('//@*') as $attribute)
+			if ($attribute->parentNode->namespaceURI === self::XMLNS_XSL)
+			{
+				$expr = $attribute->value;
+				$exprs[$expr] = $attribute;
+			}
+			else
+				foreach (AVTHelper::parse($attribute->value) as $token)
+					if ($token[0] === 'expression')
+						$exprs[$token[1]] = $attribute;
+		return $exprs;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMAttr;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Helpers\AVTHelper;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+abstract class AbstractConstantFolding extends TemplateNormalization
+{
+	abstract protected function getOptimizationPasses();
+	public function normalize(DOMElement $template)
+	{
+		$xpath = new DOMXPath($template->ownerDocument);
+		$query = '//*[namespace-uri() != "' . self::XMLNS_XSL . '"]/@*[contains(.,"{")]';
+		foreach ($xpath->query($query) as $attribute)
+			$this->replaceAVT($attribute);
+		foreach ($template->getElementsByTagNameNS(self::XMLNS_XSL, 'value-of') as $valueOf)
+			$this->replaceValueOf($valueOf);
+	}
+	public function evaluateExpression($expr)
+	{
+		$original = $expr;
+		foreach ($this->getOptimizationPasses() as $regexp => $methodName)
+		{
+			$regexp = \str_replace(' ', '\\s*', $regexp);
+			$expr   = \preg_replace_callback($regexp, array($this, $methodName), $expr);
+		}
+		return ($expr === $original) ? $expr : $this->evaluateExpression(\trim($expr));
+	}
+	protected function replaceAVT(DOMAttr $attribute)
+	{
+		$_this = $this;
+		AVTHelper::replace(
+			$attribute,
+			function ($token) use ($_this)
+			{
+				if ($token[0] === 'expression')
+					$token[1] = $_this->evaluateExpression($token[1]);
+				return $token;
+			}
+		);
+	}
+	protected function replaceValueOf(DOMElement $valueOf)
+	{
+		$valueOf->setAttribute('select', $this->evaluateExpression($valueOf->getAttribute('select')));
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMAttr;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class FixUnescapedCurlyBracesInHtmlAttributes extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$dom   = $template->ownerDocument;
+		$xpath = new DOMXPath($dom);
+		$query = '//@*[contains(., "{")]';
+		foreach ($xpath->query($query) as $attribute)
+			$this->fixAttribute($attribute);
+	}
+	protected function fixAttribute(DOMAttr $attribute)
+	{
+		$parentNode = $attribute->parentNode;
+		if ($parentNode->namespaceURI === self::XMLNS_XSL)
+			return;
+		$attribute->value = \htmlspecialchars(
+			\preg_replace(
+				'(\\b(?:do|else|(?:if|while)\\s*\\(.*?\\))\\s*\\{(?![{@]))',
+				'$0{',
+				$attribute->value
+			),
+			\ENT_NOQUOTES,
+			'UTF-8'
+		);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMException;
+use DOMText;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class InlineAttributes extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$xpath = new DOMXPath($template->ownerDocument);
+		$query = '//*[namespace-uri() != "' . self::XMLNS_XSL . '"]/xsl:attribute';
+		foreach ($xpath->query($query) as $attribute)
+			$this->inlineAttribute($attribute);
+	}
+	protected function inlineAttribute(DOMElement $attribute)
+	{
+		$value = '';
+		foreach ($attribute->childNodes as $node)
+			if ($node instanceof DOMText
+			 || array($node->namespaceURI, $node->localName) === array(self::XMLNS_XSL, 'text'))
+				$value .= \preg_replace('([{}])', '$0$0', $node->textContent);
+			elseif (array($node->namespaceURI, $node->localName) === array(self::XMLNS_XSL, 'value-of'))
+				$value .= '{' . $node->getAttribute('select') . '}';
+			else
+				return;
+		$attribute->parentNode->setAttribute($attribute->getAttribute('name'), $value);
+		$attribute->parentNode->removeChild($attribute);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class InlineCDATA extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$dom   = $template->ownerDocument;
+		$xpath = new DOMXPath($dom);
+		foreach ($xpath->query('//text()') as $textNode)
+			if ($textNode->nodeType === \XML_CDATA_SECTION_NODE)
+				$textNode->parentNode->replaceChild(
+					$dom->createTextNode($textNode->textContent),
+					$textNode
+				);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMException;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class InlineElements extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$dom = $template->ownerDocument;
+		foreach ($template->getElementsByTagNameNS(self::XMLNS_XSL, 'element') as $element)
+		{
+			$elName = $element->getAttribute('name');
+			try
+			{
+				$newElement = ($element->hasAttribute('namespace'))
+				            ? $dom->createElementNS($element->getAttribute('namespace'), $elName)
+				            : $dom->createElement($elName);
+			}
+			catch (DOMException $e)
+			{
+				continue;
+			}
+			$element->parentNode->replaceChild($newElement, $element);
+			while ($element->firstChild)
+				$newElement->appendChild($element->removeChild($element->firstChild));
+		}
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMAttr;
+use DOMElement;
+use DOMNode;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Helpers\AVTHelper;
+use s9e\TextFormatter\Configurator\Helpers\TemplateParser;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class InlineInferredValues extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$xpath = new DOMXPath($template->ownerDocument);
+		$query = '//xsl:if | //xsl:when';
+		foreach ($xpath->query($query) as $node)
+		{
+			$map = TemplateParser::parseEqualityExpr($node->getAttribute('test'));
+			if ($map === \false || \count($map) !== 1 || \count($map[\key($map)]) !== 1)
+				continue;
+			$expr  = \key($map);
+			$value = \end($map[$expr]);
+			$this->inlineInferredValue($node, $expr, $value);
+		}
+	}
+	protected function inlineInferredValue(DOMNode $node, $expr, $value)
+	{
+		$xpath = new DOMXPath($node->ownerDocument);
+		$query = './/xsl:value-of[@select="' . $expr . '"]';
+		foreach ($xpath->query($query, $node) as $valueOf)
+			$this->replaceValueOf($valueOf, $value);
+		$query = './/*[namespace-uri() != "' . self::XMLNS_XSL . '"]/@*[contains(., "{' . $expr . '}")]';
+		foreach ($xpath->query($query, $node) as $attribute)
+			$this->replaceAttribute($attribute, $expr, $value);
+	}
+	protected function replaceAttribute(DOMAttr $attribute, $expr, $value)
+	{
+		AVTHelper::replace(
+			$attribute,
+			function ($token) use ($expr, $value)
+			{
+				if ($token[0] === 'expression' && $token[1] === $expr)
+					$token = array('literal', $value);
+				return $token;
+			}
+		);
+	}
+	protected function replaceValueOf(DOMElement $valueOf, $value)
+	{
+		$valueOf->parentNode->replaceChild(
+			$valueOf->ownerDocument->createTextNode($value),
+			$valueOf
+		);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class InlineTextElements extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$dom   = $template->ownerDocument;
+		$xpath = new DOMXPath($dom);
+		foreach ($xpath->query('//xsl:text') as $node)
+		{
+			if (\trim($node->textContent) === '')
+				if ($node->previousSibling && $node->previousSibling->nodeType === \XML_TEXT_NODE)
+					;
+				elseif ($node->nextSibling && $node->nextSibling->nodeType === \XML_TEXT_NODE)
+					;
+				else
+					continue;
+			$node->parentNode->replaceChild(
+				$dom->createTextNode($node->textContent),
+				$node
+			);
+		}
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+use s9e\TextFormatter\Configurator\Helpers\AVTHelper;
+class InlineXPathLiterals extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$_this = $this;
+		$xpath = new DOMXPath($template->ownerDocument);
+		foreach ($xpath->query('//xsl:value-of') as $valueOf)
+		{
+			$textContent = $this->getTextContent($valueOf->getAttribute('select'));
+			if ($textContent !== \false)
+				$this->replaceElement($valueOf, $textContent);
+		}
+		$query = '//*[namespace-uri() != "' . self::XMLNS_XSL . '"]/@*[contains(., "{")]';
+		foreach ($xpath->query($query) as $attribute)
+		{
+			AVTHelper::replace(
+				$attribute,
+				function ($token) use ($_this)
+				{
+					if ($token[0] === 'expression')
+					{
+						$textContent = $_this->getTextContent($token[1]);
+						if ($textContent !== \false)
+							$token = array('literal', $textContent);
+					}
+					return $token;
+				}
+			);
+		}
+	}
+	public function getTextContent($expr)
+	{
+		$expr = \trim($expr);
+		if (\preg_match('(^(?:\'[^\']*\'|"[^"]*")$)', $expr))
+			return \substr($expr, 1, -1);
+		if (\preg_match('(^0*([0-9]+(?:\\.[0-9]+)?)$)', $expr, $m))
+			return $m[1];
+		return \false;
+	}
+	protected function replaceElement(DOMElement $valueOf, $textContent)
+	{
+		$valueOf->parentNode->replaceChild(
+			$valueOf->ownerDocument->createTextNode($textContent),
+			$valueOf
+		);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Helpers\AVTHelper;
+use s9e\TextFormatter\Configurator\Helpers\XPathHelper;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class MinifyXPathExpressions extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$xpath = new DOMXPath($template->ownerDocument);
+		$query = '//xsl:*/@*[contains(., " ")][contains("matchselectest", name())]';
+		foreach ($xpath->query($query) as $attribute)
+			$attribute->parentNode->setAttribute(
+				$attribute->nodeName,
+				XPathHelper::minify($attribute->nodeValue)
+			);
+		$query = '//*[namespace-uri() != "' . self::XMLNS_XSL . '"]/@*[contains(., " ")]';
+		foreach ($xpath->query($query) as $attribute)
+		{
+			AVTHelper::replace(
+				$attribute,
+				function ($token)
+				{
+					if ($token[0] === 'expression')
+						$token[1] = XPathHelper::minify($token[1]);
+					return $token;
+				}
+			);
+		}
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class NormalizeAttributeNames extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$xpath = new DOMXPath($template->ownerDocument);
+		foreach ($xpath->query('.//@*', $template) as $attribute)
+		{
+			$attrName = self::lowercase($attribute->localName);
+			if ($attrName !== $attribute->localName)
+			{
+				$attribute->parentNode->setAttribute($attrName, $attribute->value);
+				$attribute->parentNode->removeAttributeNode($attribute);
+			}
+		}
+		foreach ($xpath->query('//xsl:attribute[not(contains(@name, "{"))]') as $attribute)
+		{
+			$attrName = self::lowercase($attribute->getAttribute('name'));
+			$attribute->setAttribute('name', $attrName);
+		}
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class NormalizeElementNames extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$dom   = $template->ownerDocument;
+		$xpath = new DOMXPath($dom);
+		foreach ($xpath->query('//*[namespace-uri() != "' . self::XMLNS_XSL . '"]') as $element)
+		{
+			$elName = self::lowercase($element->localName);
+			if ($elName === $element->localName)
+				continue;
+			$newElement = (\is_null($element->namespaceURI))
+			            ? $dom->createElement($elName)
+			            : $dom->createElementNS($element->namespaceURI, $elName);
+			while ($element->firstChild)
+				$newElement->appendChild($element->removeChild($element->firstChild));
+			foreach ($element->attributes as $attribute)
+				$newElement->setAttributeNS(
+					$attribute->namespaceURI,
+					$attribute->nodeName,
+					$attribute->value
+				);
+			$element->parentNode->replaceChild($newElement, $element);
+		}
+		foreach ($xpath->query('//xsl:element[not(contains(@name, "{"))]') as $element)
+		{
+			$elName = self::lowercase($element->getAttribute('name'));
+			$element->setAttribute('name', $elName);
+		}
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMAttr;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Helpers\AVTHelper;
+use s9e\TextFormatter\Configurator\Helpers\TemplateHelper;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+use s9e\TextFormatter\Parser\BuiltInFilters;
+class NormalizeUrls extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		foreach (TemplateHelper::getURLNodes($template->ownerDocument) as $node)
+			if ($node instanceof DOMAttr)
+				$this->normalizeAttribute($node);
+			elseif ($node instanceof DOMElement)
+				$this->normalizeElement($node);
+	}
+	protected function normalizeAttribute(DOMAttr $attribute)
+	{
+		$tokens = AVTHelper::parse(\trim($attribute->value));
+		$attrValue = '';
+		foreach ($tokens as $_f6b3b659)
+		{
+			list($type, $content) = $_f6b3b659;
+			if ($type === 'literal')
+				$attrValue .= BuiltInFilters::sanitizeUrl($content);
+			else
+				$attrValue .= '{' . $content . '}';
+		}
+		$attrValue = $this->unescapeBrackets($attrValue);
+		$attribute->value = \htmlspecialchars($attrValue);
+	}
+	protected function normalizeElement(DOMElement $element)
+	{
+		$xpath = new DOMXPath($element->ownerDocument);
+		$query = './/text()[normalize-space() != ""]';
+		foreach ($xpath->query($query, $element) as $i => $node)
+		{
+			$value = BuiltInFilters::sanitizeUrl($node->nodeValue);
+			if (!$i)
+				$value = $this->unescapeBrackets(\ltrim($value));
+			$node->nodeValue = $value;
+		}
+		if (isset($node))
+			$node->nodeValue = \rtrim($node->nodeValue);
+	}
+	protected function unescapeBrackets($url)
+	{
+		return \preg_replace('#^(\\w+://)%5B([-\\w:._%]+)%5D#i', '$1[$2]', $url);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMNode;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class OptimizeChoose extends TemplateNormalization
+{
+	protected $choose;
+	protected $xpath;
+	public function normalize(DOMElement $template)
+	{
+		$this->xpath = new DOMXPath($template->ownerDocument);
+		foreach ($template->getElementsByTagNameNS(self::XMLNS_XSL, 'choose') as $choose)
+		{
+			$this->choose = $choose;
+			$this->optimizeChooseElement();
+		}
+	}
+	protected function adoptChildren(DOMElement $branch)
+	{
+		while ($branch->firstChild->firstChild)
+			$branch->appendChild($branch->firstChild->removeChild($branch->firstChild->firstChild));
+		$branch->removeChild($branch->firstChild);
+	}
+	protected function getAttributes(DOMElement $element)
+	{
+		$attributes = array();
+		foreach ($element->attributes as $attribute)
+		{
+			$key = $attribute->namespaceURI . '#' . $attribute->nodeName;
+			$attributes[$key] = $attribute->nodeValue;
+		}
+		return $attributes;
+	}
+	protected function getBranches()
+	{
+		$query = 'xsl:when|xsl:otherwise';
+		$nodes = array();
+		foreach ($this->xpath->query($query, $this->choose) as $node)
+			$nodes[] = $node;
+		return $nodes;
+	}
+	protected function hasNoContent()
+	{
+		$query = 'count(xsl:when/node() | xsl:otherwise/node())';
+		return !$this->xpath->evaluate($query, $this->choose);
+	}
+	protected function hasOtherwise()
+	{
+		return (bool) $this->xpath->evaluate('count(xsl:otherwise)', $this->choose);
+	}
+	protected function isEqualNode(DOMNode $node1, DOMNode $node2)
+	{
+		return ($node1->ownerDocument->saveXML($node1) === $node2->ownerDocument->saveXML($node2));
+	}
+	protected function isEqualTag(DOMElement $el1, DOMElement $el2)
+	{
+		return ($el1->namespaceURI === $el2->namespaceURI && $el1->nodeName === $el2->nodeName && $this->getAttributes($el1) === $this->getAttributes($el2));
+	}
+	protected function matchBranches($childType)
+	{
+		$branches = $this->getBranches();
+		if (!isset($branches[0]->$childType))
+			return \false;
+		$childNode = $branches[0]->$childType;
+		foreach ($branches as $branch)
+			if (!isset($branch->$childType) || !$this->isEqualNode($childNode, $branch->$childType))
+				return \false;
+		return \true;
+	}
+	protected function matchOnlyChild()
+	{
+		$branches = $this->getBranches();
+		if (!isset($branches[0]->firstChild))
+			return \false;
+		$firstChild = $branches[0]->firstChild;
+		foreach ($branches as $branch)
+		{
+			if ($branch->childNodes->length !== 1 || !($branch->firstChild instanceof DOMElement))
+				return \false;
+			if (!$this->isEqualTag($firstChild, $branch->firstChild))
+				return \false;
+		}
+		return \true;
+	}
+	protected function moveFirstChildBefore()
+	{
+		$branches = $this->getBranches();
+		$this->choose->parentNode->insertBefore(\array_pop($branches)->firstChild, $this->choose);
+		foreach ($branches as $branch)
+			$branch->removeChild($branch->firstChild);
+	}
+	protected function moveLastChildAfter()
+	{
+		$branches = $this->getBranches();
+		$node     = \array_pop($branches)->lastChild;
+		if (isset($this->choose->nextSibling))
+			$this->choose->parentNode->insertBefore($node, $this->choose->nextSibling);
+		else
+			$this->choose->parentNode->appendChild($node);
+		foreach ($branches as $branch)
+			$branch->removeChild($branch->lastChild);
+	}
+	protected function optimizeChooseElement()
+	{
+		if ($this->hasOtherwise())
+		{
+			$this->optimizeCommonFirstChild();
+			$this->optimizeCommonLastChild();
+			$this->optimizeCommonOnlyChild();
+			$this->optimizeEmptyOtherwise();
+		}
+		if ($this->hasNoContent())
+			$this->choose->parentNode->removeChild($this->choose);
+		else
+			$this->optimizeSingleBranch();
+	}
+	protected function optimizeCommonFirstChild()
+	{
+		while ($this->matchBranches('firstChild'))
+			$this->moveFirstChildBefore();
+	}
+	protected function optimizeCommonLastChild()
+	{
+		while ($this->matchBranches('lastChild'))
+			$this->moveLastChildAfter();
+	}
+	protected function optimizeCommonOnlyChild()
+	{
+		while ($this->matchOnlyChild())
+			$this->reparentChild();
+	}
+	protected function optimizeEmptyOtherwise()
+	{
+		$query = 'xsl:otherwise[count(node()) = 0]';
+		foreach ($this->xpath->query($query, $this->choose) as $otherwise)
+			$this->choose->removeChild($otherwise);
+	}
+	protected function optimizeSingleBranch()
+	{
+		$query = 'count(xsl:when) = 1 and not(xsl:otherwise)';
+		if (!$this->xpath->evaluate($query, $this->choose))
+			return;
+		$when = $this->xpath->query('xsl:when', $this->choose)->item(0);
+		$if   = $this->choose->ownerDocument->createElementNS(self::XMLNS_XSL, 'xsl:if');
+		$if->setAttribute('test', $when->getAttribute('test'));
+		while ($when->firstChild)
+			$if->appendChild($when->removeChild($when->firstChild));
+		$this->choose->parentNode->replaceChild($if, $this->choose);
+	}
+	protected function reparentChild()
+	{
+		$branches  = $this->getBranches();
+		$childNode = $branches[0]->firstChild->cloneNode();
+		$childNode->appendChild($this->choose->parentNode->replaceChild($childNode, $this->choose));
+		foreach ($branches as $branch)
+			$this->adoptChildren($branch);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class OptimizeConditionalAttributes extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$dom   = $template->ownerDocument;
+		$xpath = new DOMXPath($dom);
+		$query = '//xsl:if'
+		       . "[starts-with(@test, '@')]"
+		       . '[count(descendant::node()) = 2][xsl:attribute[@name = substring(../@test, 2)][xsl:value-of[@select = ../../@test]]]';
+		foreach ($xpath->query($query) as $if)
+		{
+			$copyOf = $dom->createElementNS(self::XMLNS_XSL, 'xsl:copy-of');
+			$copyOf->setAttribute('select', $if->getAttribute('test'));
+			$if->parentNode->replaceChild($copyOf, $if);
+		}
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class OptimizeConditionalValueOf extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$xpath = new DOMXPath($template->ownerDocument);
+		$query = '//xsl:if[count(descendant::node()) = 1]/xsl:value-of';
+		foreach ($xpath->query($query) as $valueOf)
+		{
+			$if     = $valueOf->parentNode;
+			$test   = $if->getAttribute('test');
+			$select = $valueOf->getAttribute('select');
+			if ($select !== $test
+			 || !\preg_match('#^@[-\\w]+$#D', $select))
+				continue;
+			$if->parentNode->replaceChild(
+				$if->removeChild($valueOf),
+				$if
+			);
+		}
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class PreserveSingleSpaces extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$dom   = $template->ownerDocument;
+		$xpath = new DOMXPath($dom);
+		$query = '//text()[. = " "][not(parent::xsl:text)]';
+		foreach ($xpath->query($query) as $textNode)
+			$textNode->parentNode->replaceChild(
+				$dom->createElementNS(self::XMLNS_XSL, 'text', ' '),
+				$textNode
+			);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class RemoveComments extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$xpath = new DOMXPath($template->ownerDocument);
+		foreach ($xpath->query('//comment()') as $comment)
+			$comment->parentNode->removeChild($comment);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class RemoveInterElementWhitespace extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$xpath = new DOMXPath($template->ownerDocument);
+		$query = '//text()[normalize-space() = ""][. != " "][not(parent::xsl:text)]';
+		foreach ($xpath->query($query) as $textNode)
+			$textNode->parentNode->removeChild($textNode);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMNodeList;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class SetRelNoreferrerOnTargetedLinks extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$this->normalizeElements($template->ownerDocument->getElementsByTagName('a'));
+		$this->normalizeElements($template->ownerDocument->getElementsByTagName('area'));
+	}
+	protected function addRelAttribute(DOMElement $element)
+	{
+		$rel = $element->getAttribute('rel');
+		if (\preg_match('(\\S$)', $rel))
+			$rel .= ' ';
+		$rel .= 'noreferrer';
+		$element->setAttribute('rel', $rel);
+	}
+	protected function linkTargetCanAccessOpener(DOMElement $element)
+	{
+		if (!$element->hasAttribute('target'))
+			return \false;
+		if (\preg_match('(\\bno(?:open|referr)er\\b)', $element->getAttribute('rel')))
+			return \false;
+		return \true;
+	}
+	protected function normalizeElements(DOMNodeList $elements)
+	{
+		foreach ($elements as $element)
+			if ($this->linkTargetCanAccessOpener($element))
+				$this->addRelAttribute($element);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Collections\HostnameList;
+use s9e\TextFormatter\Configurator\Collections\SchemeList;
+use s9e\TextFormatter\Configurator\Helpers\ConfigHelper;
+class UrlConfig implements ConfigProvider
+{
+	protected $allowedSchemes;
+	protected $disallowedHosts;
+	protected $restrictedHosts;
+	public function __construct()
+	{
+		$this->disallowedHosts = new HostnameList;
+		$this->restrictedHosts = new HostnameList;
+		$this->allowedSchemes   = new SchemeList;
+		$this->allowedSchemes[] = 'http';
+		$this->allowedSchemes[] = 'https';
+	}
+	public function asConfig()
+	{
+		return ConfigHelper::toArray(\get_object_vars($this));
+	}
+	public function allowScheme($scheme)
+	{
+		if (\strtolower($scheme) === 'javascript')
+			throw new RuntimeException('The JavaScript URL scheme cannot be allowed');
+		$this->allowedSchemes[] = $scheme;
+	}
+	public function disallowHost($host, $matchSubdomains = \true)
+	{
+		$this->disallowedHosts[] = $host;
+		if ($matchSubdomains && \substr($host, 0, 1) !== '*')
+			$this->disallowedHosts[] = '*.' . $host;
+	}
+	public function disallowScheme($scheme)
+	{
+		$this->allowedSchemes->remove($scheme);
+	}
+	public function getAllowedSchemes()
+	{
+		return \iterator_to_array($this->allowedSchemes);
+	}
+	public function restrictHost($host, $matchSubdomains = \true)
+	{
+		$this->restrictedHosts[] = $host;
+		if ($matchSubdomains && \substr($host, 0, 1) !== '*')
+			$this->restrictedHosts[] = '*.' . $host;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use InvalidArgumentException;
+use s9e\TextFormatter\Configurator\Helpers\RegexpParser;
+use s9e\TextFormatter\Configurator\Items\AttributePreprocessor;
+use s9e\TextFormatter\Configurator\Items\Regexp;
+use s9e\TextFormatter\Configurator\JavaScript\RegexpConvertor;
+use s9e\TextFormatter\Configurator\Validators\AttributeName;
+class AttributePreprocessorCollection extends Collection
+{
+	public function add($attrName, $regexp)
+	{
+		$attrName = AttributeName::normalize($attrName);
+		$k = \serialize(array($attrName, $regexp));
+		$this->items[$k] = new AttributePreprocessor($regexp);
+		return $this->items[$k];
+	}
+	public function key()
+	{
+		list($attrName) = \unserialize(\key($this->items));
+		return $attrName;
+	}
+	public function merge($attributePreprocessors)
+	{
+		$error = \false;
+		if ($attributePreprocessors instanceof AttributePreprocessorCollection)
+			foreach ($attributePreprocessors as $attrName => $attributePreprocessor)
+				$this->add($attrName, $attributePreprocessor->getRegexp());
+		elseif (\is_array($attributePreprocessors))
+		{
+			foreach ($attributePreprocessors as $values)
+			{
+				if (!\is_array($values))
+				{
+					$error = \true;
+					break;
+				}
+				list($attrName, $value) = $values;
+				if ($value instanceof AttributePreprocessor)
+					$value = $value->getRegexp();
+				$this->add($attrName, $value);
+			}
+		}
+		else
+			$error = \true;
+		if ($error)
+			throw new InvalidArgumentException('merge() expects an instance of AttributePreprocessorCollection or a 2D array where each element is a [attribute name, regexp] pair');
+	}
+	public function asConfig()
+	{
+		$config = array();
+		foreach ($this->items as $k => $ap)
+		{
+			list($attrName) = \unserialize($k);
+			$config[] = array($attrName, $ap, $ap->getCaptureNames());
+		}
+		return $config;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use ArrayAccess;
+use InvalidArgumentException;
+use RuntimeException;
+class NormalizedCollection extends Collection implements ArrayAccess
+{
+	protected $onDuplicateAction = 'error';
+	public function asConfig()
+	{
+		$config = parent::asConfig();
+		\ksort($config);
+		return $config;
+	}
+	public function onDuplicate($action = \null)
+	{
+		$old = $this->onDuplicateAction;
+		if (\func_num_args() && $action !== 'error' && $action !== 'ignore' && $action !== 'replace')
+			throw new InvalidArgumentException("Invalid onDuplicate action '" . $action . "'. Expected: 'error', 'ignore' or 'replace'");
+		$this->onDuplicateAction = $action;
+		return $old;
+	}
+	protected function getAlreadyExistsException($key)
+	{
+		return new RuntimeException("Item '" . $key . "' already exists");
+	}
+	protected function getNotExistException($key)
+	{
+		return new RuntimeException("Item '" . $key . "' does not exist");
+	}
+	public function normalizeKey($key)
+	{
+		return $key;
+	}
+	public function normalizeValue($value)
+	{
+		return $value;
+	}
+	public function add($key, $value = \null)
+	{
+		if ($this->exists($key))
+			if ($this->onDuplicateAction === 'ignore')
+				return $this->get($key);
+			elseif ($this->onDuplicateAction === 'error')
+				throw $this->getAlreadyExistsException($key);
+		return $this->set($key, $value);
+	}
+	public function contains($value)
+	{
+		return \in_array($this->normalizeValue($value), $this->items);
+	}
+	public function delete($key)
+	{
+		$key = $this->normalizeKey($key);
+		unset($this->items[$key]);
+	}
+	public function exists($key)
+	{
+		$key = $this->normalizeKey($key);
+		return \array_key_exists($key, $this->items);
+	}
+	public function get($key)
+	{
+		if (!$this->exists($key))
+			throw $this->getNotExistException($key);
+		$key = $this->normalizeKey($key);
+		return $this->items[$key];
+	}
+	public function indexOf($value)
+	{
+		return \array_search($this->normalizeValue($value), $this->items);
+	}
+	public function set($key, $value)
+	{
+		$key = $this->normalizeKey($key);
+		$this->items[$key] = $this->normalizeValue($value);
+		return $this->items[$key];
+	}
+	public function offsetExists($offset)
+	{
+		return $this->exists($offset);
+	}
+	public function offsetGet($offset)
+	{
+		return $this->get($offset);
+	}
+	public function offsetSet($offset, $value)
+	{
+		$this->set($offset, $value);
+	}
+	public function offsetUnset($offset)
+	{
+		$this->delete($offset);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use ArrayAccess;
+use InvalidArgumentException;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\ConfigProvider;
+use s9e\TextFormatter\Configurator\JavaScript\Dictionary;
+use s9e\TextFormatter\Configurator\Validators\TagName;
+use s9e\TextFormatter\Parser;
+class Ruleset extends Collection implements ArrayAccess, ConfigProvider
+{
+	public function __construct()
+	{
+		$this->clear();
+	}
+	public function clear()
+	{
+		parent::clear();
+		$this->defaultChildRule('allow');
+		$this->defaultDescendantRule('allow');
+	}
+	public function offsetExists($k)
+	{
+		return isset($this->items[$k]);
+	}
+	public function offsetGet($k)
+	{
+		return $this->items[$k];
+	}
+	public function offsetSet($k, $v)
+	{
+		throw new RuntimeException('Not supported');
+	}
+	public function offsetUnset($k)
+	{
+		return $this->remove($k);
+	}
+	public function asConfig()
+	{
+		$config = $this->items;
+		unset($config['allowChild']);
+		unset($config['allowDescendant']);
+		unset($config['defaultChildRule']);
+		unset($config['defaultDescendantRule']);
+		unset($config['denyChild']);
+		unset($config['denyDescendant']);
+		unset($config['requireParent']);
+		$bitValues = array(
+			'autoClose'                   => Parser::RULE_AUTO_CLOSE,
+			'autoReopen'                  => Parser::RULE_AUTO_REOPEN,
+			'breakParagraph'              => Parser::RULE_BREAK_PARAGRAPH,
+			'createParagraphs'            => Parser::RULE_CREATE_PARAGRAPHS,
+			'disableAutoLineBreaks'       => Parser::RULE_DISABLE_AUTO_BR,
+			'enableAutoLineBreaks'        => Parser::RULE_ENABLE_AUTO_BR,
+			'ignoreSurroundingWhitespace' => Parser::RULE_IGNORE_WHITESPACE,
+			'ignoreTags'                  => Parser::RULE_IGNORE_TAGS,
+			'ignoreText'                  => Parser::RULE_IGNORE_TEXT,
+			'isTransparent'               => Parser::RULE_IS_TRANSPARENT,
+			'preventLineBreaks'           => Parser::RULE_PREVENT_BR,
+			'suspendAutoLineBreaks'       => Parser::RULE_SUSPEND_AUTO_BR,
+			'trimFirstLine'               => Parser::RULE_TRIM_FIRST_LINE
+		);
+		$bitfield = 0;
+		foreach ($bitValues as $ruleName => $bitValue)
+		{
+			if (!empty($config[$ruleName]))
+				$bitfield |= $bitValue;
+			unset($config[$ruleName]);
+		}
+		foreach (array('closeAncestor', 'closeParent', 'fosterParent') as $ruleName)
+			if (isset($config[$ruleName]))
+			{
+				$targets = \array_fill_keys($config[$ruleName], 1);
+				$config[$ruleName] = new Dictionary($targets);
+			}
+		$config['flags'] = $bitfield;
+		return $config;
+	}
+	public function merge($rules, $overwrite = \true)
+	{
+		if (!\is_array($rules)
+		 && !($rules instanceof self))
+			throw new InvalidArgumentException('merge() expects an array or an instance of Ruleset');
+		foreach ($rules as $action => $value)
+			if (\is_array($value))
+				foreach ($value as $tagName)
+					$this->$action($tagName);
+			elseif ($overwrite || !isset($this->items[$action]))
+				$this->$action($value);
+	}
+	public function remove($type, $tagName = \null)
+	{
+		if (\preg_match('(^default(?:Child|Descendant)Rule)', $type))
+			throw new RuntimeException('Cannot remove ' . $type);
+		if (isset($tagName))
+		{
+			$tagName = TagName::normalize($tagName);
+			if (isset($this->items[$type]))
+			{
+				$this->items[$type] = \array_diff(
+					$this->items[$type],
+					array($tagName)
+				);
+				if (empty($this->items[$type]))
+					unset($this->items[$type]);
+				else
+					$this->items[$type] = \array_values($this->items[$type]);
+			}
+		}
+		else
+			unset($this->items[$type]);
+	}
+	protected function addBooleanRule($ruleName, $bool)
+	{
+		if (!\is_bool($bool))
+			throw new InvalidArgumentException($ruleName . '() expects a boolean');
+		$this->items[$ruleName] = $bool;
+		return $this;
+	}
+	protected function addTargetedRule($ruleName, $tagName)
+	{
+		$this->items[$ruleName][] = TagName::normalize($tagName);
+		return $this;
+	}
+	public function allowChild($tagName)
+	{
+		return $this->addTargetedRule('allowChild', $tagName);
+	}
+	public function allowDescendant($tagName)
+	{
+		return $this->addTargetedRule('allowDescendant', $tagName);
+	}
+	public function autoClose($bool = \true)
+	{
+		return $this->addBooleanRule('autoClose', $bool);
+	}
+	public function autoReopen($bool = \true)
+	{
+		return $this->addBooleanRule('autoReopen', $bool);
+	}
+	public function breakParagraph($bool = \true)
+	{
+		return $this->addBooleanRule('breakParagraph', $bool);
+	}
+	public function closeAncestor($tagName)
+	{
+		return $this->addTargetedRule('closeAncestor', $tagName);
+	}
+	public function closeParent($tagName)
+	{
+		return $this->addTargetedRule('closeParent', $tagName);
+	}
+	public function createChild($tagName)
+	{
+		return $this->addTargetedRule('createChild', $tagName);
+	}
+	public function createParagraphs($bool = \true)
+	{
+		return $this->addBooleanRule('createParagraphs', $bool);
+	}
+	public function defaultChildRule($rule)
+	{
+		if ($rule !== 'allow' && $rule !== 'deny')
+			throw new InvalidArgumentException("defaultChildRule() only accepts 'allow' or 'deny'");
+		$this->items['defaultChildRule'] = $rule;
+		return $this;
+	}
+	public function defaultDescendantRule($rule)
+	{
+		if ($rule !== 'allow' && $rule !== 'deny')
+			throw new InvalidArgumentException("defaultDescendantRule() only accepts 'allow' or 'deny'");
+		$this->items['defaultDescendantRule'] = $rule;
+		return $this;
+	}
+	public function denyChild($tagName)
+	{
+		return $this->addTargetedRule('denyChild', $tagName);
+	}
+	public function denyDescendant($tagName)
+	{
+		return $this->addTargetedRule('denyDescendant', $tagName);
+	}
+	public function disableAutoLineBreaks($bool = \true)
+	{
+		return $this->addBooleanRule('disableAutoLineBreaks', $bool);
+	}
+	public function enableAutoLineBreaks($bool = \true)
+	{
+		return $this->addBooleanRule('enableAutoLineBreaks', $bool);
+	}
+	public function fosterParent($tagName)
+	{
+		return $this->addTargetedRule('fosterParent', $tagName);
+	}
+	public function ignoreSurroundingWhitespace($bool = \true)
+	{
+		return $this->addBooleanRule('ignoreSurroundingWhitespace', $bool);
+	}
+	public function ignoreTags($bool = \true)
+	{
+		return $this->addBooleanRule('ignoreTags', $bool);
+	}
+	public function ignoreText($bool = \true)
+	{
+		return $this->addBooleanRule('ignoreText', $bool);
+	}
+	public function isTransparent($bool = \true)
+	{
+		return $this->addBooleanRule('isTransparent', $bool);
+	}
+	public function preventLineBreaks($bool = \true)
+	{
+		return $this->addBooleanRule('preventLineBreaks', $bool);
+	}
+	public function requireParent($tagName)
+	{
+		return $this->addTargetedRule('requireParent', $tagName);
+	}
+	public function requireAncestor($tagName)
+	{
+		return $this->addTargetedRule('requireAncestor', $tagName);
+	}
+	public function suspendAutoLineBreaks($bool = \true)
+	{
+		return $this->addBooleanRule('suspendAutoLineBreaks', $bool);
+	}
+	public function trimFirstLine($bool = \true)
+	{
+		return $this->addBooleanRule('trimFirstLine', $bool);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items;
+abstract class Filter extends ProgrammableCallback
+{
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMElement;
+use s9e\TextFormatter\Configurator\Helpers\TemplateHelper;
+use s9e\TextFormatter\Configurator\Helpers\XPathHelper;
+use s9e\TextFormatter\Configurator\Items\Attribute;
+class DisallowUnsafeDynamicCSS extends AbstractDynamicContentCheck
+{
+	protected function getNodes(DOMElement $template)
+	{
+		return TemplateHelper::getCSSNodes($template->ownerDocument);
+	}
+	protected function isExpressionSafe($expr)
+	{
+		return XPathHelper::isExpressionNumeric($expr);
+	}
+	protected function isSafe(Attribute $attribute)
+	{
+		return $attribute->isSafeInCSS();
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMElement;
+use s9e\TextFormatter\Configurator\Helpers\XPathHelper;
+use s9e\TextFormatter\Configurator\Helpers\TemplateHelper;
+use s9e\TextFormatter\Configurator\Items\Attribute;
+class DisallowUnsafeDynamicJS extends AbstractDynamicContentCheck
+{
+	protected function getNodes(DOMElement $template)
+	{
+		return TemplateHelper::getJSNodes($template->ownerDocument);
+	}
+	protected function isExpressionSafe($expr)
+	{
+		return XPathHelper::isExpressionNumeric($expr);
+	}
+	protected function isSafe(Attribute $attribute)
+	{
+		return $attribute->isSafeInJS();
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMAttr;
+use DOMElement;
+use DOMText;
+use s9e\TextFormatter\Configurator\Helpers\TemplateHelper;
+use s9e\TextFormatter\Configurator\Items\Attribute;
+use s9e\TextFormatter\Configurator\Items\Tag;
+class DisallowUnsafeDynamicURL extends AbstractDynamicContentCheck
+{
+	protected $exceptionRegexp = '(^(?:(?!data|\\w*script)\\w+:|[^:]*/|#))i';
+	protected function getNodes(DOMElement $template)
+	{
+		return TemplateHelper::getURLNodes($template->ownerDocument);
+	}
+	protected function isSafe(Attribute $attribute)
+	{
+		return $attribute->isSafeAsURL();
+	}
+	protected function checkAttributeNode(DOMAttr $attribute, Tag $tag)
+	{
+		if (\preg_match($this->exceptionRegexp, $attribute->value))
+			return;
+		parent::checkAttributeNode($attribute, $tag);
+	}
+	protected function checkElementNode(DOMElement $element, Tag $tag)
+	{
+		if ($element->firstChild
+		 && $element->firstChild instanceof DOMText
+		 && \preg_match($this->exceptionRegexp, $element->firstChild->textContent))
+			return;
+		parent::checkElementNode($element, $tag);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+class RestrictFlashScriptAccess extends AbstractFlashRestriction
+{
+	public $defaultSetting = 'sameDomain';
+	protected $settingName = 'allowScriptAccess';
+	protected $settings = array(
+		'always'     => 3,
+		'samedomain' => 2,
+		'never'      => 1
+	);
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMDocument;
+use DOMXPath;
+class FoldArithmeticConstants extends AbstractConstantFolding
+{
+	protected $xpath;
+	public function __construct()
+	{
+		$this->xpath = new DOMXPath(new DOMDocument);
+	}
+	protected function getOptimizationPasses()
+	{
+		return array(
+			'(^[-+0-9\\s]+$)'                        => 'foldOperation',
+			'( \\+ 0(?! [^+\\)])|(?<![-\\w])0 \\+ )' => 'foldAdditiveIdentity',
+			'(^((?>\\d+ [-+] )*)(\\d+) div (\\d+))'  => 'foldDivision',
+			'(^((?>\\d+ [-+] )*)(\\d+) \\* (\\d+))'  => 'foldMultiplication',
+			'(\\( \\d+ (?>(?>[-+*]|div) \\d+ )+\\))' => 'foldSubExpression',
+			'((?<=[-+*\\(]|\\bdiv|^) \\( ([@$][-\\w]+|\\d+(?>\\.\\d+)?) \\) (?=[-+*\\)]|div|$))' => 'removeParentheses'
+		);
+	}
+	public function evaluateExpression($expr)
+	{
+		$expr = \preg_replace_callback(
+			'(([\'"])(.*?)\\1)s',
+			function ($m)
+			{
+				return $m[1] . \bin2hex($m[2]) . $m[1];
+			},
+			$expr
+		);
+		$expr = parent::evaluateExpression($expr);
+		$expr = \preg_replace_callback(
+			'(([\'"])(.*?)\\1)s',
+			function ($m)
+			{
+				return $m[1] . \pack('H*', $m[2]) . $m[1];
+			},
+			$expr
+		);
+		return $expr;
+	}
+	protected function foldAdditiveIdentity(array $m)
+	{
+		return '';
+	}
+	protected function foldDivision(array $m)
+	{
+		return $m[1] . ($m[2] / $m[3]);
+	}
+	protected function foldMultiplication(array $m)
+	{
+		return $m[1] . ($m[2] * $m[3]);
+	}
+	protected function foldOperation(array $m)
+	{
+		return (string) $this->xpath->evaluate($m[0]);
+	}
+	protected function foldSubExpression(array $m)
+	{
+		return '(' . $this->evaluateExpression(\trim(\substr($m[0], 1, -1))) . ')';
+	}
+	protected function removeParentheses(array $m)
+	{
+		return ' ' . $m[1] . ' ';
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMDocument;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Helpers\XPathHelper;
+class FoldConstantXPathExpressions extends AbstractConstantFolding
+{
+	protected $supportedFunctions = array(
+		'ceiling',
+		'concat',
+		'contains',
+		'floor',
+		'normalize-space',
+		'number',
+		'round',
+		'starts-with',
+		'string',
+		'string-length',
+		'substring',
+		'substring-after',
+		'substring-before',
+		'sum',
+		'translate'
+	);
+	protected $xpath;
+	public function __construct()
+	{
+		$this->xpath = new DOMXPath(new DOMDocument);
+	}
+	protected function getOptimizationPasses()
+	{
+		return array(
+			'(^(?:"[^"]*"|\'[^\']*\'|\\.[0-9]|[^"$&\'./:<=>@[\\]])++$)' => 'foldConstantXPathExpression'
+		);
+	}
+	protected function canBeSerialized($value)
+	{
+		return (\is_string($value) || \is_integer($value) || \is_float($value));
+	}
+	protected function evaluate($expr)
+	{
+		$useErrors = \libxml_use_internal_errors(\true);
+		$result    = $this->xpath->evaluate($expr);
+		\libxml_use_internal_errors($useErrors);
+		return $result;
+	}
+	protected function foldConstantXPathExpression(array $m)
+	{
+		$expr = $m[0];
+		if ($this->isConstantExpression($expr))
+		{
+			$result = $this->evaluate($expr);
+			if ($this->canBeSerialized($result))
+			{
+				$foldedExpr = XPathHelper::export($result);
+				if (\strlen($foldedExpr) < \strlen($expr))
+					$expr = $foldedExpr;
+			}
+		}
+		return $expr;
+	}
+	protected function isConstantExpression($expr)
+	{
+		$expr = \preg_replace('("[^"]*"|\'[^\']*\')', '', $expr);
+		\preg_match_all('(\\w[-\\w]+(?=\\())', $expr, $m);
+		if (\count(\array_diff($m[0], $this->supportedFunctions)) > 0)
+			return \false;
+		return !\preg_match('([^\\s\\-0-9a-z\\(-.]|\\.(?![0-9])|\\b[-a-z](?![-\\w]+\\())i', $expr);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Items\Attribute;
+use s9e\TextFormatter\Configurator\Validators\AttributeName;
+class AttributeCollection extends NormalizedCollection
+{
+	protected $onDuplicateAction = 'replace';
+	protected function getAlreadyExistsException($key)
+	{
+		return new RuntimeException("Attribute '" . $key . "' already exists");
+	}
+	protected function getNotExistException($key)
+	{
+		return new RuntimeException("Attribute '" . $key . "' does not exist");
+	}
+	public function normalizeKey($key)
+	{
+		return AttributeName::normalize($key);
+	}
+	public function normalizeValue($value)
+	{
+		return ($value instanceof Attribute)
+		     ? $value
+		     : new Attribute($value);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use InvalidArgumentException;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class AttributeFilterCollection extends NormalizedCollection
+{
+	public function get($key)
+	{
+		$key = $this->normalizeKey($key);
+		if (!$this->exists($key))
+			if ($key[0] === '#')
+				$this->set($key, self::getDefaultFilter(\substr($key, 1)));
+			else
+				$this->set($key, new AttributeFilter($key));
+		$filter = parent::get($key);
+		$filter = clone $filter;
+		return $filter;
+	}
+	public static function getDefaultFilter($filterName)
+	{
+		$filterName = \ucfirst(\strtolower($filterName));
+		$className  = 's9e\\TextFormatter\\Configurator\\Items\\AttributeFilters\\' . $filterName . 'Filter';
+		if (!\class_exists($className))
+			throw new InvalidArgumentException("Unknown attribute filter '" . $filterName . "'");
+		return new $className;
+	}
+	public function normalizeKey($key)
+	{
+		if (\preg_match('/^#[a-z_0-9]+$/Di', $key))
+			return \strtolower($key);
+		if (\is_string($key) && \is_callable($key))
+			return $key;
+		throw new InvalidArgumentException("Invalid filter name '" . $key . "'");
+	}
+	public function normalizeValue($value)
+	{
+		if ($value instanceof AttributeFilter)
+			return $value;
+		if (\is_callable($value))
+			return new AttributeFilter($value);
+		throw new InvalidArgumentException('Argument 1 passed to ' . __METHOD__ . ' must be a valid callback or an instance of s9e\\TextFormatter\\Configurator\\Items\\AttributeFilter');
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use InvalidArgumentException;
+class NormalizedList extends NormalizedCollection
+{
+	public function add($value, $void = \null)
+	{
+		return $this->append($value);
+	}
+	public function append($value)
+	{
+		$value = $this->normalizeValue($value);
+		$this->items[] = $value;
+		return $value;
+	}
+	public function delete($key)
+	{
+		parent::delete($key);
+		$this->items = \array_values($this->items);
+	}
+	public function insert($offset, $value)
+	{
+		$offset = $this->normalizeKey($offset);
+		$value  = $this->normalizeValue($value);
+		\array_splice($this->items, $offset, 0, array($value));
+		return $value;
+	}
+	public function normalizeKey($key)
+	{
+		$normalizedKey = \filter_var(
+			(\preg_match('(^-\\d+$)D', $key)) ? \count($this->items) + $key : $key,
+			\FILTER_VALIDATE_INT,
+			array(
+				'options' => array(
+					'min_range' => 0,
+					'max_range' => \count($this->items)
+				)
+			)
+		);
+		if ($normalizedKey === \false)
+			throw new InvalidArgumentException("Invalid offset '" . $key . "'");
+		return $normalizedKey;
+	}
+	public function offsetSet($offset, $value)
+	{
+		if ($offset === \null)
+			$this->append($value);
+		else
+			parent::offsetSet($offset, $value);
+	}
+	public function prepend($value)
+	{
+		$value = $this->normalizeValue($value);
+		\array_unshift($this->items, $value);
+		return $value;
+	}
+	public function remove($value)
+	{
+		$keys = \array_keys($this->items, $this->normalizeValue($value));
+		foreach ($keys as $k)
+			unset($this->items[$k]);
+		$this->items = \array_values($this->items);
+		return \count($keys);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use InvalidArgumentException;
+use RuntimeException;
+use s9e\TextFormatter\Configurator;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class PluginCollection extends NormalizedCollection
+{
+	protected $configurator;
+	public function __construct(Configurator $configurator)
+	{
+		$this->configurator = $configurator;
+	}
+	public function finalize()
+	{
+		foreach ($this->items as $plugin)
+			$plugin->finalize();
+	}
+	public function normalizeKey($pluginName)
+	{
+		if (!\preg_match('#^[A-Z][A-Za-z_0-9]+$#D', $pluginName))
+			throw new InvalidArgumentException("Invalid plugin name '" . $pluginName . "'");
+		return $pluginName;
+	}
+	public function normalizeValue($value)
+	{
+		if (\is_string($value) && \class_exists($value))
+			$value = new $value($this->configurator);
+		if ($value instanceof ConfiguratorBase)
+			return $value;
+		throw new InvalidArgumentException('PluginCollection::normalizeValue() expects a class name or an object that implements s9e\\TextFormatter\\Plugins\\ConfiguratorBase');
+	}
+	public function load($pluginName, array $overrideProps = array())
+	{
+		$pluginName = $this->normalizeKey($pluginName);
+		$className  = 's9e\\TextFormatter\\Plugins\\' . $pluginName . '\\Configurator';
+		if (!\class_exists($className))
+			throw new RuntimeException("Class '" . $className . "' does not exist");
+		$plugin = new $className($this->configurator, $overrideProps);
+		$this->set($pluginName, $plugin);
+		return $plugin;
+	}
+	public function asConfig()
+	{
+		$plugins = parent::asConfig();
+		foreach ($plugins as $pluginName => &$pluginConfig)
+		{
+			$plugin = $this->get($pluginName);
+			$pluginConfig += $plugin->getBaseProperties();
+			if ($pluginConfig['quickMatch'] === \false)
+				unset($pluginConfig['quickMatch']);
+			if (!isset($pluginConfig['regexp']))
+				unset($pluginConfig['regexpLimit']);
+			$className = 's9e\\TextFormatter\\Plugins\\' . $pluginName . '\\Parser';
+			if ($pluginConfig['className'] === $className)
+				unset($pluginConfig['className']);
+		}
+		unset($pluginConfig);
+		return $plugins;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\Validators\TagName;
+class TagCollection extends NormalizedCollection
+{
+	protected $onDuplicateAction = 'replace';
+	protected function getAlreadyExistsException($key)
+	{
+		return new RuntimeException("Tag '" . $key . "' already exists");
+	}
+	protected function getNotExistException($key)
+	{
+		return new RuntimeException("Tag '" . $key . "' does not exist");
+	}
+	public function normalizeKey($key)
+	{
+		return TagName::normalize($key);
+	}
+	public function normalizeValue($value)
+	{
+		return ($value instanceof Tag)
+		     ? $value
+		     : new Tag($value);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use s9e\TextFormatter\Configurator\Validators\TemplateParameterName;
+class TemplateParameterCollection extends NormalizedCollection
+{
+	public function normalizeKey($key)
+	{
+		return TemplateParameterName::normalize($key);
+	}
+	public function normalizeValue($value)
+	{
+		return (string) $value;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items;
+use s9e\TextFormatter\Configurator\Traits\TemplateSafeness;
+class AttributeFilter extends Filter
+{
+	protected $markedSafe = array();
+	protected function isSafe($context)
+	{
+		return !empty($this->markedSafe[$context]);
+	}
+	public function isSafeAsURL()
+	{
+		return $this->isSafe('AsURL');
+	}
+	public function isSafeInCSS()
+	{
+		return $this->isSafe('InCSS');
+	}
+
+	public function markAsSafeAsURL()
+	{
+		$this->markedSafe['AsURL'] = \true;
+		return $this;
+	}
+	public function markAsSafeInCSS()
+	{
+		$this->markedSafe['InCSS'] = \true;
+		return $this;
+	}
+	public function markAsSafeInJS()
+	{
+		$this->markedSafe['InJS'] = \true;
+		return $this;
+	}
+	public function resetSafeness()
+	{
+		$this->markedSafe = array();
+		return $this;
+	}
+	public function __construct($callback)
+	{
+		parent::__construct($callback);
+		$this->resetParameters();
+		$this->addParameterByName('attrValue');
+	}
+	public function isSafeInJS()
+	{
+		$safeCallbacks = array(
+			'urlencode',
+			'strtotime',
+			'rawurlencode'
+		);
+		if (\in_array($this->callback, $safeCallbacks, \true))
+			return \true;
+		return $this->isSafe('InJS');
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items;
+class TagFilter extends Filter
+{
+	public function __construct($callback)
+	{
+		parent::__construct($callback);
+		$this->resetParameters();
+		$this->addParameterByName('tag');
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use InvalidArgumentException;
+use s9e\TextFormatter\Configurator\Items\ProgrammableCallback;
+abstract class FilterChain extends NormalizedList
+{
+	abstract protected function getFilterClassName();
+	public function containsCallback($callback)
+	{
+		$pc = new ProgrammableCallback($callback);
+		$callback = $pc->getCallback();
+		foreach ($this->items as $filter)
+			if ($callback === $filter->getCallback())
+				return \true;
+		return \false;
+	}
+	public function normalizeValue($value)
+	{
+		$className  = $this->getFilterClassName();
+		if ($value instanceof $className)
+			return $value;
+		if (!\is_callable($value))
+			throw new InvalidArgumentException('Filter ' . \var_export($value, \true) . ' is neither callable nor an instance of ' . $className);
+		return new $className($value);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+use s9e\TextFormatter\Configurator\Items\Regexp;
+class HostnameList extends NormalizedList
+{
+	public function asConfig()
+	{
+		if (empty($this->items))
+			return \null;
+		return new Regexp($this->getRegexp());
+	}
+	public function getRegexp()
+	{
+		$hosts = array();
+		foreach ($this->items as $host)
+			$hosts[] = $this->normalizeHostmask($host);
+		$regexp = RegexpBuilder::fromList(
+			$hosts,
+			array(
+				'specialChars' => array(
+					'*' => '.*',
+					'^' => '^',
+					'$' => '$'
+				)
+			)
+		);
+		return '/' . $regexp . '/DSis';
+	}
+	protected function normalizeHostmask($host)
+	{
+		if (\preg_match('#[\\x80-\xff]#', $host) && \function_exists('idn_to_ascii'))
+			$host = \idn_to_ascii($host);
+		if (\substr($host, 0, 1) === '*')
+			$host = \ltrim($host, '*');
+		else
+			$host = '^' . $host;
+		if (\substr($host, -1) === '*')
+			$host = \rtrim($host, '*');
+		else
+			$host .= '$';
+		return $host;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use InvalidArgumentException;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\BooleanRulesGenerator;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\TargetedRulesGenerator;
+class RulesGeneratorList extends NormalizedList
+{
+	public function normalizeValue($generator)
+	{
+		if (\is_string($generator))
+		{
+			$className = 's9e\\TextFormatter\\Configurator\\RulesGenerators\\' . $generator;
+			if (\class_exists($className))
+				$generator = new $className;
+		}
+		if (!($generator instanceof BooleanRulesGenerator)
+		 && !($generator instanceof TargetedRulesGenerator))
+			throw new InvalidArgumentException('Invalid rules generator ' . \var_export($generator, \true));
+		return $generator;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use InvalidArgumentException;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+use s9e\TextFormatter\Configurator\Items\Regexp;
+class SchemeList extends NormalizedList
+{
+	public function asConfig()
+	{
+		return new Regexp('/^' . RegexpBuilder::fromList($this->items) . '$/Di');
+	}
+	public function normalizeValue($scheme)
+	{
+		if (!\preg_match('#^[a-z][a-z0-9+\\-.]*$#Di', $scheme))
+			throw new InvalidArgumentException("Invalid scheme name '" . $scheme . "'");
+		return \strtolower($scheme);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use s9e\TextFormatter\Configurator\TemplateCheck;
+class TemplateCheckList extends NormalizedList
+{
+	public function normalizeValue($check)
+	{
+		if (!($check instanceof TemplateCheck))
+		{
+			$className = 's9e\\TextFormatter\\Configurator\\TemplateChecks\\' . $check;
+			$check     = new $className;
+		}
+		return $check;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+use s9e\TextFormatter\Configurator\TemplateNormalizations\Custom;
+class TemplateNormalizationList extends NormalizedList
+{
+	public function normalizeValue($value)
+	{
+		if ($value instanceof TemplateNormalization)
+			return $value;
+		if (\is_callable($value))
+			return new Custom($value);
+		$className = 's9e\\TextFormatter\\Configurator\\TemplateNormalizations\\' . $value;
+		return new $className;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class UrlFilter extends AttributeFilter
+{
+	public function __construct()
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterUrl');
+		$this->resetParameters();
+		$this->addParameterByName('attrValue');
+		$this->addParameterByName('urlConfig');
+		$this->addParameterByName('logger');
+		$this->setJS('BuiltInFilters.filterUrl');
+	}
+	public function isSafeInCSS()
+	{
+		return \true;
+	}
+	public function isSafeInJS()
+	{
+		return \true;
+	}
+	public function isSafeAsURL()
+	{
+		return \true;
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+class AttributeFilterChain extends FilterChain
+{
+	public function getFilterClassName()
+	{
+		return 's9e\\TextFormatter\\Configurator\\Items\\AttributeFilter';
+	}
+	public function normalizeValue($value)
+	{
+		if (\is_string($value) && \preg_match('(^#\\w+$)', $value))
+			$value = AttributeFilterCollection::getDefaultFilter(\substr($value, 1));
+		return parent::normalizeValue($value);
+	}
+}
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+class TagFilterChain extends FilterChain
+{
+	public function getFilterClassName()
+	{
+		return 's9e\\TextFormatter\\Configurator\\Items\\TagFilter';
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Bundle.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator;
+use s9e\TextFormatter\Configurator;
+abstract class Bundle
+{
+	abstract public function configure(Configurator $configurator);
+	public static function getConfigurator()
+	{
+		$configurator = new Configurator;
+		$bundle  = new static;
+		$bundle->configure($configurator);
+		return $configurator;
+	}
+	public static function getOptions()
+	{
+		return array();
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Bundles/Fatdown.php
@@ -0,0 +1,113 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Bundles;
+use s9e\TextFormatter\Configurator;
+use s9e\TextFormatter\Configurator\Bundle;
+class Fatdown extends Bundle
+{
+	public function configure(Configurator $configurator)
+	{
+		$configurator->urlConfig->allowScheme('ftp');
+		$configurator->Litedown->decodeHtmlEntities = \true;
+		$configurator->Autoemail;
+		$configurator->Autolink;
+		$configurator->Escaper;
+		$configurator->FancyPants;
+		$configurator->HTMLComments;
+		$configurator->HTMLEntities;
+		$configurator->PipeTables;
+		$htmlAliases = array(
+			'a'      => array('URL', 'href' => 'url'),
+			'hr'     => 'HR',
+			'em'     => 'EM',
+			's'      => 'S',
+			'strong' => 'STRONG',
+			'sup'    => 'SUP'
+		);
+		foreach ($htmlAliases as $elName => $alias)
+			if (\is_array($alias))
+			{
+				$configurator->HTMLElements->aliasElement($elName, $alias[0]);
+				unset($alias[0]);
+				foreach ($alias as $attrName => $alias)
+					$configurator->HTMLElements->aliasAttribute($elName, $attrName, $alias);
+			}
+			else
+				$configurator->HTMLElements->aliasElement($elName, $alias);
+		$htmlElements = array(
+			'abbr' => array('title'),
+			'b',
+			'br',
+			'code',
+			'dd',
+			'del',
+			'div' => array('class'),
+			'dl',
+			'dt',
+			'i',
+			'img' => array('alt', 'height', 'src', 'title', 'width'),
+			'ins',
+			'li',
+			'ol',
+			'pre',
+			'rb',
+			'rp',
+			'rt',
+			'rtc',
+			'ruby',
+			'span' => array('class'),
+			'strong',
+			'sub',
+			'sup',
+			'table',
+			'tbody',
+			'td' => array('colspan', 'rowspan'),
+			'tfoot',
+			'th' => array('colspan', 'rowspan', 'scope'),
+			'thead',
+			'tr',
+			'u',
+			'ul'
+		);
+		foreach ($htmlElements as $k => $v)
+		{
+			if (\is_numeric($k))
+			{
+				$elName    = $v;
+				$attrNames = array();
+			}
+			else
+			{
+				$elName    = $k;
+				$attrNames = $v;
+			}
+			$configurator->HTMLElements->allowElement($elName);
+			foreach ($attrNames as $attrName)
+				$configurator->HTMLElements->allowAttribute($elName, $attrName);
+		}
+		$configurator->tags['html:dd']->rules->createParagraphs(\false);
+		$configurator->tags['html:dt']->rules->createParagraphs(\false);
+		$configurator->tags['html:td']->rules->createParagraphs(\false);
+		$configurator->tags['html:th']->rules->createParagraphs(\false);
+		$configurator->plugins->load('MediaEmbed', array('createMediaBBCode' => \false));
+		$sites = array(
+			'bandcamp',
+			'dailymotion',
+			'facebook',
+			'liveleak',
+			'soundcloud',
+			'spotify',
+			'twitch',
+			'vimeo',
+			'vine',
+			'youtube'
+		);
+		foreach ($sites as $site)
+			$configurator->MediaEmbed->add($site);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Bundles/Forum.php
@@ -0,0 +1,96 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Bundles;
+use s9e\TextFormatter\Configurator;
+use s9e\TextFormatter\Configurator\Bundle;
+class Forum extends Bundle
+{
+	public function configure(Configurator $configurator)
+	{
+		$configurator->rootRules->enableAutoLineBreaks();
+		$configurator->BBCodes->addFromRepository('B');
+		$configurator->BBCodes->addFromRepository('CENTER');
+		$configurator->BBCodes->addFromRepository('CODE');
+		$configurator->BBCodes->addFromRepository('COLOR');
+		$configurator->BBCodes->addFromRepository('EMAIL');
+		$configurator->BBCodes->addFromRepository('FONT');
+		$configurator->BBCodes->addFromRepository('I');
+		$configurator->BBCodes->addFromRepository('IMG');
+		$configurator->BBCodes->addFromRepository('LIST');
+		$configurator->BBCodes->addFromRepository('*');
+		$configurator->BBCodes->add('LI');
+		$configurator->BBCodes->addFromRepository('OL');
+		$configurator->BBCodes->addFromRepository('QUOTE', 'default', array(
+			'authorStr' => '<xsl:value-of select="@author"/> <xsl:value-of select="$L_WROTE"/>'
+		));
+		$configurator->BBCodes->addFromRepository('S');
+		$configurator->BBCodes->addFromRepository('SIZE');
+		$configurator->BBCodes->addFromRepository('SPOILER', 'default', array(
+			'hideStr'    => '{L_HIDE}',
+			'showStr'    => '{L_SHOW}',
+			'spoilerStr' => '{L_SPOILER}',
+		));
+		$configurator->BBCodes->addFromRepository('TABLE');
+		$configurator->BBCodes->addFromRepository('TD');
+		$configurator->BBCodes->addFromRepository('TH');
+		$configurator->BBCodes->addFromRepository('TR');
+		$configurator->BBCodes->addFromRepository('U');
+		$configurator->BBCodes->addFromRepository('UL');
+		$configurator->BBCodes->addFromRepository('URL');
+		$configurator->rendering->parameters = array(
+			'L_WROTE'   => 'wrote:',
+			'L_HIDE'    => 'Hide',
+			'L_SHOW'    => 'Show',
+			'L_SPOILER' => 'Spoiler'
+		);
+		$emoticons = array(
+			':)'  => '1F642',
+			':-)' => '1F642',
+			';)'  => '1F609',
+			';-)' => '1F609',
+			':D'  => '1F600',
+			':-D' => '1F600',
+			':('  => '2639',
+			':-(' => '2639',
+			':-*' => '1F618',
+			':P'  => '1F61B',
+			':-P' => '1F61B',
+			':p'  => '1F61B',
+			':-p' => '1F61B',
+			';P'  => '1F61C',
+			';-P' => '1F61C',
+			';p'  => '1F61C',
+			';-p' => '1F61C',
+			':?'  => '1F615',
+			':-?' => '1F615',
+			':|'  => '1F610',
+			':-|' => '1F610',
+			':o'  => '1F62E',
+			':lol:' => '1F602'
+		);
+		foreach ($emoticons as $code => $hex)
+			$configurator->Emoji->addAlias($code, \html_entity_decode('&#x' . $hex . ';'));
+		$configurator->MediaEmbed->createIndividualBBCodes = \true;
+		$configurator->MediaEmbed->add('bandcamp');
+		$configurator->MediaEmbed->add('dailymotion');
+		$configurator->MediaEmbed->add('facebook');
+		$configurator->MediaEmbed->add('indiegogo');
+		$configurator->MediaEmbed->add('instagram');
+		$configurator->MediaEmbed->add('kickstarter');
+		$configurator->MediaEmbed->add('liveleak');
+		$configurator->MediaEmbed->add('soundcloud');
+		$configurator->MediaEmbed->add('twitch');
+		$configurator->MediaEmbed->add('twitter');
+		$configurator->MediaEmbed->add('vimeo');
+		$configurator->MediaEmbed->add('vine');
+		$configurator->MediaEmbed->add('wshh');
+		$configurator->MediaEmbed->add('youtube');
+		$configurator->Autoemail;
+		$configurator->Autolink;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Bundles/MediaPack.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Bundles;
+use DOMDocument;
+use s9e\TextFormatter\Configurator;
+use s9e\TextFormatter\Configurator\Bundle;
+class MediaPack extends Bundle
+{
+	public function configure(Configurator $configurator)
+	{
+		if (!isset($configurator->MediaEmbed))
+		{
+			$pluginOptions = array('createMediaBBCode' => isset($configurator->BBCodes));
+			$configurator->plugins->load('MediaEmbed', $pluginOptions);
+		}
+		foreach ($configurator->MediaEmbed->defaultSites as $siteId => $siteConfig)
+			$configurator->MediaEmbed->add($siteId);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Collections/AttributeList.php
@@ -0,0 +1,22 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use s9e\TextFormatter\Configurator\Validators\AttributeName;
+class AttributeList extends NormalizedList
+{
+	public function normalizeValue($attrName)
+	{
+		return AttributeName::normalize($attrName);
+	}
+	public function asConfig()
+	{
+		$list = \array_unique($this->items);
+		\sort($list);
+		return $list;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Collections/MinifierList.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use InvalidArgumentException;
+use ReflectionClass;
+use s9e\TextFormatter\Configurator\JavaScript\Minifier;
+class MinifierList extends NormalizedList
+{
+	public function normalizeValue($minifier)
+	{
+		if (\is_string($minifier))
+			$minifier = $this->getMinifierInstance($minifier);
+		elseif (\is_array($minifier) && !empty($minifier[0]))
+			$minifier = $this->getMinifierInstance($minifier[0], \array_slice($minifier, 1));
+		if (!($minifier instanceof Minifier))
+			throw new InvalidArgumentException('Invalid minifier ' . \var_export($minifier, \true));
+		return $minifier;
+	}
+	protected function getMinifierInstance($name, array $args = array())
+	{
+		$className = 's9e\\TextFormatter\\Configurator\\JavaScript\\Minifiers\\' . $name;
+		if (!\class_exists($className))
+			throw new InvalidArgumentException('Invalid minifier ' . \var_export($name, \true));
+		$reflection = new ReflectionClass($className);
+		$minifier   = (empty($args)) ? $reflection->newInstance() : $reflection->newInstanceArgs($args);
+		return $minifier;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Collections/TagList.php
@@ -0,0 +1,22 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Collections;
+use s9e\TextFormatter\Configurator\Validators\TagName;
+class TagList extends NormalizedList
+{
+	public function normalizeValue($attrName)
+	{
+		return TagName::normalize($attrName);
+	}
+	public function asConfig()
+	{
+		$list = \array_unique($this->items);
+		\sort($list);
+		return $list;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Exceptions/InvalidTemplateException.php
@@ -0,0 +1,12 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Exceptions;
+use RuntimeException;
+class InvalidTemplateException extends RuntimeException
+{
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Exceptions/InvalidXslException.php
@@ -0,0 +1,11 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Exceptions;
+class InvalidXslException extends InvalidTemplateException
+{
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Exceptions/UnsafeTemplateException.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Exceptions;
+use DOMNode;
+use s9e\TextFormatter\Configurator\Helpers\TemplateHelper;
+class UnsafeTemplateException extends InvalidTemplateException
+{
+	protected $node;
+	public function __construct($msg, DOMNode $node)
+	{
+		parent::__construct($msg);
+		$this->node = $node;
+	}
+	public function getNode()
+	{
+		return $this->node;
+	}
+	public function highlightNode($prepend = '<span style="background-color:#ff0">', $append = '</span>')
+	{
+		return TemplateHelper::highlightNode($this->node, $prepend, $append);
+	}
+	public function setNode(DOMNode $node)
+	{
+		$this->node = $node;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Helpers/ContextSafeness.php
@@ -0,0 +1,23 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Helpers;
+abstract class ContextSafeness
+{
+	public static function getDisallowedCharactersAsURL()
+	{
+		return array(':');
+	}
+	public static function getDisallowedCharactersInCSS()
+	{
+		return array('(', ')', ':', '\\', '"', "'", ';', '{', '}');
+	}
+	public static function getDisallowedCharactersInJS()
+	{
+		return array('(', ')', '"', "'", '\\', "\r", "\n", "\xE2\x80\xA8", "\xE2\x80\xA9", ':', '%', '=');
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Helpers/RegexpParser.php
@@ -0,0 +1,232 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Helpers;
+use RuntimeException;
+abstract class RegexpParser
+{
+	public static function getAllowedCharacterRegexp($regexp)
+	{
+		$def = self::parse($regexp);
+		if (\strpos($def['modifiers'], 'm') !== \false)
+			return '//';
+		if (\substr($def['regexp'], 0, 1) !== '^'
+		 || \substr($def['regexp'], -1)   !== '$')
+			return '//';
+		$def['tokens'][] = array(
+			'pos'  => \strlen($def['regexp']),
+			'len'  => 0,
+			'type' => 'end'
+		);
+		$patterns = array();
+		$literal = '';
+		$pos     = 0;
+		$skipPos = 0;
+		$depth   = 0;
+		foreach ($def['tokens'] as $token)
+		{
+			if ($token['type'] === 'option')
+				$skipPos = \max($skipPos, $token['pos'] + $token['len']);
+			if (\strpos($token['type'], 'AssertionStart') !== \false)
+			{
+				$endToken = $def['tokens'][$token['endToken']];
+				$skipPos  = \max($skipPos, $endToken['pos'] + $endToken['len']);
+			}
+			if ($token['pos'] >= $skipPos)
+			{
+				if ($token['type'] === 'characterClass')
+					$patterns[] = '[' . $token['content'] . ']';
+				if ($token['pos'] > $pos)
+				{
+					$tmp = \substr($def['regexp'], $pos, $token['pos'] - $pos);
+					$literal .= $tmp;
+					if (!$depth)
+					{
+						$tmp = \str_replace('\\\\', '', $tmp);
+						if (\preg_match('/(?<!\\\\)\\|(?!\\^)/', $tmp))
+							return '//';
+						if (\preg_match('/(?<![$\\\\])\\|/', $tmp))
+							return '//';
+					}
+				}
+			}
+			if (\substr($token['type'], -5) === 'Start')
+				++$depth;
+			elseif (\substr($token['type'], -3) === 'End')
+				--$depth;
+			$pos = \max($skipPos, $token['pos'] + $token['len']);
+		}
+		if (\preg_match('#(?<!\\\\)(?:\\\\\\\\)*\\.#', $literal))
+		{
+			if (\strpos($def['modifiers'], 's') !== \false
+			 || \strpos($literal, "\n") !== \false)
+				return '//';
+			$patterns[] = '.';
+			$literal = \preg_replace('#(?<!\\\\)((?:\\\\\\\\)*)\\.#', '$1', $literal);
+		}
+		$literal = \preg_replace('#(?<!\\\\)((?:\\\\\\\\)*)[*+?]#', '$1', $literal);
+		$literal = \preg_replace('#(?<!\\\\)((?:\\\\\\\\)*)\\{[^}]+\\}#', '$1', $literal);
+		$literal = \preg_replace('#(?<!\\\\)((?:\\\\\\\\)*)\\\\[bBAZzG1-9]#', '$1', $literal);
+		$literal = \preg_replace('#(?<!\\\\)((?:\\\\\\\\)*)[$^|]#', '$1', $literal);
+		$literal = \preg_replace('#(?<!\\\\)((?:\\\\\\\\)*)([-^\\]])#', '$1\\\\$2', $literal);
+		if (\strpos($def['modifiers'], 'D') === \false)
+			$literal .= "\n";
+		if ($literal !== '')
+			$patterns[] = '[' . $literal . ']';
+		if (empty($patterns))
+			return '/^$/D';
+		$regexp = $def['delimiter'] . \implode('|', $patterns) . $def['delimiter'];
+		if (\strpos($def['modifiers'], 'i') !== \false)
+			$regexp .= 'i';
+		if (\strpos($def['modifiers'], 'u') !== \false)
+			$regexp .= 'u';
+		return $regexp;
+	}
+	public static function getCaptureNames($regexp)
+	{
+		$map        = array('');
+		$regexpInfo = self::parse($regexp);
+		foreach ($regexpInfo['tokens'] as $tok)
+			if ($tok['type'] === 'capturingSubpatternStart')
+				$map[] = (isset($tok['name'])) ? $tok['name'] : '';
+		return $map;
+	}
+	public static function parse($regexp)
+	{
+		if (!\preg_match('#^(.)(.*?)\\1([a-zA-Z]*)$#Ds', $regexp, $m))
+			throw new RuntimeException('Could not parse regexp delimiters');
+		$ret = array(
+			'delimiter' => $m[1],
+			'modifiers' => $m[3],
+			'regexp'    => $m[2],
+			'tokens'    => array()
+		);
+		$regexp = $m[2];
+		$openSubpatterns = array();
+		$pos = 0;
+		$regexpLen = \strlen($regexp);
+		while ($pos < $regexpLen)
+		{
+			switch ($regexp[$pos])
+			{
+				case '\\':
+					$pos += 2;
+					break;
+				case '[':
+					if (!\preg_match('#\\[(.*?(?<!\\\\)(?:\\\\\\\\)*+)\\]((?:[+*][+?]?|\\?)?)#', $regexp, $m, 0, $pos))
+						throw new RuntimeException('Could not find matching bracket from pos ' . $pos);
+					$ret['tokens'][] = array(
+						'pos'         => $pos,
+						'len'         => \strlen($m[0]),
+						'type'        => 'characterClass',
+						'content'     => $m[1],
+						'quantifiers' => $m[2]
+					);
+					$pos += \strlen($m[0]);
+					break;
+				case '(':
+					if (\preg_match('#\\(\\?([a-z]*)\\)#i', $regexp, $m, 0, $pos))
+					{
+						$ret['tokens'][] = array(
+							'pos'     => $pos,
+							'len'     => \strlen($m[0]),
+							'type'    => 'option',
+							'options' => $m[1]
+						);
+						$pos += \strlen($m[0]);
+						break;
+					}
+					if (\preg_match("#(?J)\\(\\?(?:P?<(?<name>[a-z_0-9]+)>|'(?<name>[a-z_0-9]+)')#A", $regexp, $m, \PREG_OFFSET_CAPTURE, $pos))
+					{
+						$tok = array(
+							'pos'  => $pos,
+							'len'  => \strlen($m[0][0]),
+							'type' => 'capturingSubpatternStart',
+							'name' => $m['name'][0]
+						);
+						$pos += \strlen($m[0][0]);
+					}
+					elseif (\preg_match('#\\(\\?([a-z]*):#iA', $regexp, $m, 0, $pos))
+					{
+						$tok = array(
+							'pos'     => $pos,
+							'len'     => \strlen($m[0]),
+							'type'    => 'nonCapturingSubpatternStart',
+							'options' => $m[1]
+						);
+						$pos += \strlen($m[0]);
+					}
+					elseif (\preg_match('#\\(\\?>#iA', $regexp, $m, 0, $pos))
+					{
+						$tok = array(
+							'pos'     => $pos,
+							'len'     => \strlen($m[0]),
+							'type'    => 'nonCapturingSubpatternStart',
+							'subtype' => 'atomic'
+						);
+						$pos += \strlen($m[0]);
+					}
+					elseif (\preg_match('#\\(\\?(<?[!=])#A', $regexp, $m, 0, $pos))
+					{
+						$assertions = array(
+							'='  => 'lookahead',
+							'<=' => 'lookbehind',
+							'!'  => 'negativeLookahead',
+							'<!' => 'negativeLookbehind'
+						);
+						$tok = array(
+							'pos'     => $pos,
+							'len'     => \strlen($m[0]),
+							'type'    => $assertions[$m[1]] . 'AssertionStart'
+						);
+						$pos += \strlen($m[0]);
+					}
+					elseif (\preg_match('#\\(\\?#A', $regexp, $m, 0, $pos))
+						throw new RuntimeException('Unsupported subpattern type at pos ' . $pos);
+					else
+					{
+						$tok = array(
+							'pos'  => $pos,
+							'len'  => 1,
+							'type' => 'capturingSubpatternStart'
+						);
+						++$pos;
+					}
+					$openSubpatterns[] = \count($ret['tokens']);
+					$ret['tokens'][] = $tok;
+					break;
+				case ')':
+					if (empty($openSubpatterns))
+						throw new RuntimeException('Could not find matching pattern start for right parenthesis at pos ' . $pos);
+					$k = \array_pop($openSubpatterns);
+					$startToken =& $ret['tokens'][$k];
+					$startToken['endToken'] = \count($ret['tokens']);
+					$startToken['content']  = \substr(
+						$regexp,
+						$startToken['pos'] + $startToken['len'],
+						$pos - ($startToken['pos'] + $startToken['len'])
+					);
+					$spn = \strspn($regexp, '+*?', 1 + $pos);
+					$quantifiers = \substr($regexp, 1 + $pos, $spn);
+					$ret['tokens'][] = array(
+						'pos'  => $pos,
+						'len'  => 1 + $spn,
+						'type' => \substr($startToken['type'], 0, -5) . 'End',
+						'quantifiers' => $quantifiers
+					);
+					unset($startToken);
+					$pos += 1 + $spn;
+					break;
+				default:
+					++$pos;
+			}
+		}
+		if (!empty($openSubpatterns))
+			throw new RuntimeException('Could not find matching pattern end for left parenthesis at pos ' . $ret['tokens'][$openSubpatterns[0]]['pos']);
+		return $ret;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/AlnumFilter.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class AlnumFilter extends AttributeFilter
+{
+	public function __construct()
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterAlnum');
+		$this->setJS('BuiltInFilters.filterAlnum');
+		$this->markAsSafeAsURL();
+		$this->markAsSafeInCSS();
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/ChoiceFilter.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use InvalidArgumentException;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+class ChoiceFilter extends RegexpFilter
+{
+	public function __construct(array $values = \null, $caseSensitive = \false)
+	{
+		parent::__construct();
+		if (isset($values))
+			$this->setValues($values, $caseSensitive);
+	}
+	public function setValues(array $values, $caseSensitive = \false)
+	{
+		if (!\is_bool($caseSensitive))
+			throw new InvalidArgumentException('Argument 2 passed to ' . __METHOD__ . ' must be a boolean');
+		$regexp = RegexpBuilder::fromList($values, array('delimiter' => '/'));
+		$regexp = '/^' . $regexp . '$/D';
+		if (!$caseSensitive)
+			$regexp .= 'i';
+		if (!\preg_match('#^[[:ascii:]]*$#D', $regexp))
+			$regexp .= 'u';
+		$this->setRegexp($regexp);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/ColorFilter.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class ColorFilter extends AttributeFilter
+{
+	public function __construct()
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterColor');
+		$this->setJS('BuiltInFilters.filterColor');
+		$this->markAsSafeInCSS();
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/EmailFilter.php
@@ -0,0 +1,17 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class EmailFilter extends AttributeFilter
+{
+	public function __construct()
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterEmail');
+		$this->setJS('BuiltInFilters.filterEmail');
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/FalseFilter.php
@@ -0,0 +1,17 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class FalseFilter extends AttributeFilter
+{
+	public function __construct()
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterFalse');
+		$this->setJS('BuiltInFilters.filterFalse');
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/FloatFilter.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class FloatFilter extends AttributeFilter
+{
+	public function __construct()
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterFloat');
+		$this->setJS('BuiltInFilters.filterFloat');
+		$this->markAsSafeAsURL();
+		$this->markAsSafeInCSS();
+		$this->markAsSafeInJS();
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/FontfamilyFilter.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+class FontfamilyFilter extends RegexpFilter
+{
+	public function __construct()
+	{
+		$namechars = '[- \\w]+';
+		$double    = '"' . $namechars . '"';
+		$single    = "'" . $namechars . "'";
+		$name      = '(?:' . $single . '|' . $double . '|' . $namechars . ')';
+		$regexp    = '/^' . $name . '(?:, *' . $name . ')*$/';
+		parent::__construct($regexp);
+		$this->markAsSafeInCSS();
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/HashmapFilter.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use InvalidArgumentException;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Helpers\ContextSafeness;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class HashmapFilter extends AttributeFilter
+{
+	public function __construct(array $map = \null, $strict = \false)
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterHashmap');
+		$this->resetParameters();
+		$this->addParameterByName('attrValue');
+		$this->addParameterByName('map');
+		$this->addParameterByName('strict');
+		$this->setJS('BuiltInFilters.filterHashmap');
+		if (isset($map))
+			$this->setMap($map, $strict);
+	}
+	public function asConfig()
+	{
+		if (!isset($this->vars['map']))
+			throw new RuntimeException("Hashmap filter is missing a 'map' value");
+		return parent::asConfig();
+	}
+	public function setMap(array $map, $strict = \false)
+	{
+		if (!\is_bool($strict))
+			throw new InvalidArgumentException('Argument 2 passed to ' . __METHOD__ . ' must be a boolean');
+		if (!$strict)
+			$map = $this->optimizeLooseMap($map);
+		\ksort($map);
+		$this->vars['map']    = $map;
+		$this->vars['strict'] = $strict;
+		$this->resetSafeness();
+		if (!empty($this->vars['strict']))
+		{
+			$this->evaluateSafenessInCSS();
+			$this->evaluateSafenessInJS();
+		}
+	}
+	protected function evaluateSafenessInCSS()
+	{
+		$disallowedChars = ContextSafeness::getDisallowedCharactersInCSS();
+		foreach ($this->vars['map'] as $value)
+			foreach ($disallowedChars as $char)
+				if (\strpos($value, $char) !== \false)
+					return;
+		$this->markAsSafeInCSS();
+	}
+	protected function evaluateSafenessInJS()
+	{
+		$disallowedChars = ContextSafeness::getDisallowedCharactersInJS();
+		foreach ($this->vars['map'] as $value)
+			foreach ($disallowedChars as $char)
+				if (\strpos($value, $char) !== \false)
+					return;
+		$this->markAsSafeInJS();
+	}
+	protected function optimizeLooseMap(array $map)
+	{
+		foreach ($map as $k => $v)
+			if ($k === $v)
+				unset($map[$k]);
+		return $map;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/IdentifierFilter.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class IdentifierFilter extends AttributeFilter
+{
+	public function __construct()
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterIdentifier');
+		$this->setJS('BuiltInFilters.filterIdentifier');
+		$this->markAsSafeAsURL();
+		$this->markAsSafeInCSS();
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/IntFilter.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class IntFilter extends AttributeFilter
+{
+	public function __construct()
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterInt');
+		$this->setJS('BuiltInFilters.filterInt');
+		$this->markAsSafeAsURL();
+		$this->markAsSafeInCSS();
+		$this->markAsSafeInJS();
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/IpFilter.php
@@ -0,0 +1,17 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class IpFilter extends AttributeFilter
+{
+	public function __construct()
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterIp');
+		$this->setJS('BuiltInFilters.filterIp');
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/IpportFilter.php
@@ -0,0 +1,17 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class IpportFilter extends AttributeFilter
+{
+	public function __construct()
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterIpport');
+		$this->setJS('BuiltInFilters.filterIpport');
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/Ipv4Filter.php
@@ -0,0 +1,17 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class Ipv4Filter extends AttributeFilter
+{
+	public function __construct()
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterIpv4');
+		$this->setJS('BuiltInFilters.filterIpv4');
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/Ipv6Filter.php
@@ -0,0 +1,17 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class Ipv6Filter extends AttributeFilter
+{
+	public function __construct()
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterIpv6');
+		$this->setJS('BuiltInFilters.filterIpv6');
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/MapFilter.php
@@ -0,0 +1,88 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use InvalidArgumentException;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Helpers\ContextSafeness;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+use s9e\TextFormatter\Configurator\Items\Regexp;
+class MapFilter extends AttributeFilter
+{
+	public function __construct(array $map = \null, $caseSensitive = \false, $strict = \false)
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterMap');
+		$this->resetParameters();
+		$this->addParameterByName('attrValue');
+		$this->addParameterByName('map');
+		$this->setJS('BuiltInFilters.filterMap');
+		if (isset($map))
+			$this->setMap($map, $caseSensitive, $strict);
+	}
+	public function asConfig()
+	{
+		if (!isset($this->vars['map']))
+			throw new RuntimeException("Map filter is missing a 'map' value");
+		return parent::asConfig();
+	}
+	public function setMap(array $map, $caseSensitive = \false, $strict = \false)
+	{
+		if (!\is_bool($caseSensitive))
+			throw new InvalidArgumentException('Argument 2 passed to ' . __METHOD__ . ' must be a boolean');
+		if (!\is_bool($strict))
+			throw new InvalidArgumentException('Argument 3 passed to ' . __METHOD__ . ' must be a boolean');
+		$this->resetSafeness();
+		if ($strict)
+			$this->assessSafeness($map);
+		$valueKeys = array();
+		foreach ($map as $key => $value)
+			$valueKeys[$value][] = $key;
+		$map = array();
+		foreach ($valueKeys as $value => $keys)
+		{
+			$regexp = RegexpBuilder::fromList(
+				$keys,
+				array(
+					'delimiter'       => '/',
+					'caseInsensitive' => !$caseSensitive
+				)
+			);
+			$regexp = '/^' . $regexp . '$/D';
+			if (!$caseSensitive)
+				$regexp .= 'i';
+			if (!\preg_match('#^[[:ascii:]]*$#D', $regexp))
+				$regexp .= 'u';
+			$map[] = array(new Regexp($regexp), $value);
+		}
+		if ($strict)
+			$map[] = array('//', \false);
+		$this->vars['map'] = $map;
+	}
+	protected function assessSafeness(array $map)
+	{
+		$values = \implode('', $map);
+		$isSafeInCSS = \true;
+		foreach (ContextSafeness::getDisallowedCharactersInCSS() as $char)
+			if (\strpos($values, $char) !== \false)
+			{
+				$isSafeInCSS = \false;
+				break;
+			}
+		if ($isSafeInCSS)
+			$this->markAsSafeInCSS();
+		$isSafeInJS = \true;
+		foreach (ContextSafeness::getDisallowedCharactersInJS() as $char)
+			if (\strpos($values, $char) !== \false)
+			{
+				$isSafeInJS = \false;
+				break;
+			}
+		if ($isSafeInJS)
+			$this->markAsSafeInJS();
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/NumberFilter.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class NumberFilter extends AttributeFilter
+{
+	public function __construct()
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterNumber');
+		$this->setJS('BuiltInFilters.filterNumber');
+		$this->markAsSafeAsURL();
+		$this->markAsSafeInCSS();
+		$this->markAsSafeInJS();
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/RangeFilter.php
@@ -0,0 +1,50 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use InvalidArgumentException;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class RangeFilter extends AttributeFilter
+{
+	public function __construct($min = \null, $max = \null)
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRange');
+		$this->resetParameters();
+		$this->addParameterByName('attrValue');
+		$this->addParameterByName('min');
+		$this->addParameterByName('max');
+		$this->addParameterByName('logger');
+		$this->setJS('BuiltInFilters.filterRange');
+		$this->markAsSafeAsURL();
+		$this->markAsSafeInCSS();
+		$this->markAsSafeInJS();
+		if (isset($min))
+			$this->setRange($min, $max);
+	}
+	public function asConfig()
+	{
+		if (!isset($this->vars['min']))
+			throw new RuntimeException("Range filter is missing a 'min' value");
+		if (!isset($this->vars['max']))
+			throw new RuntimeException("Range filter is missing a 'max' value");
+		return parent::asConfig();
+	}
+	public function setRange($min, $max)
+	{
+		$min = \filter_var($min, \FILTER_VALIDATE_INT);
+		$max = \filter_var($max, \FILTER_VALIDATE_INT);
+		if ($min === \false)
+			throw new InvalidArgumentException('Argument 1 passed to ' . __METHOD__ . ' must be an integer');
+		if ($max === \false)
+			throw new InvalidArgumentException('Argument 2 passed to ' . __METHOD__ . ' must be an integer');
+		if ($min > $max)
+			throw new InvalidArgumentException('Invalid range: min (' . $min . ') > max (' . $max . ')');
+		$this->vars['min'] = $min;
+		$this->vars['max'] = $max;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/RegexpFilter.php
@@ -0,0 +1,92 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use Exception;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Helpers\ContextSafeness;
+use s9e\TextFormatter\Configurator\Helpers\RegexpParser;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+use s9e\TextFormatter\Configurator\Items\Regexp;
+class RegexpFilter extends AttributeFilter
+{
+	public function __construct($regexp = \null)
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterRegexp');
+		$this->resetParameters();
+		$this->addParameterByName('attrValue');
+		$this->addParameterByName('regexp');
+		$this->setJS('BuiltInFilters.filterRegexp');
+		if (isset($regexp))
+			$this->setRegexp($regexp);
+	}
+	public function asConfig()
+	{
+		if (!isset($this->vars['regexp']))
+			throw new RuntimeException("Regexp filter is missing a 'regexp' value");
+		return parent::asConfig();
+	}
+	public function getRegexp()
+	{
+		return (string) $this->vars['regexp'];
+	}
+	public function setRegexp($regexp)
+	{
+		if (\is_string($regexp))
+			$regexp = new Regexp($regexp);
+		$this->vars['regexp'] = $regexp;
+		$this->resetSafeness();
+		$this->evaluateSafeness();
+	}
+	protected function evaluateSafeness()
+	{
+		try
+		{
+			$this->evaluateSafenessAsURL();
+			$this->evaluateSafenessInCSS();
+			$this->evaluateSafenessInJS();
+		}
+		catch (Exception $e)
+		{
+			}
+	}
+	protected function evaluateSafenessAsURL()
+	{
+		$regexpInfo = RegexpParser::parse($this->vars['regexp']);
+		$captureStart = '(?>\\((?:\\?:)?)*';
+		$regexp = '#^\\^' . $captureStart . '(?!data|\\w*script)[a-z0-9]+\\??:#i';
+		if (\preg_match($regexp, $regexpInfo['regexp'])
+		 && \strpos($regexpInfo['modifiers'], 'm') === \false)
+		{
+			$this->markAsSafeAsURL();
+			return;
+		}
+		$regexp = RegexpParser::getAllowedCharacterRegexp($this->vars['regexp']);
+		foreach (ContextSafeness::getDisallowedCharactersAsURL() as $char)
+			if (\preg_match($regexp, $char))
+				return;
+		$this->markAsSafeAsURL();
+	}
+	protected function evaluateSafenessInCSS()
+	{
+		$regexp = RegexpParser::getAllowedCharacterRegexp($this->vars['regexp']);
+		foreach (ContextSafeness::getDisallowedCharactersInCSS() as $char)
+			if (\preg_match($regexp, $char))
+				return;
+		$this->markAsSafeInCSS();
+	}
+	protected function evaluateSafenessInJS()
+	{
+		$safeExpressions = array(
+			'\\d+',
+			'[0-9]+'
+		);
+		$regexp = '(^(?<delim>.)\\^(?:(?<expr>' . \implode('|', \array_map('preg_quote', $safeExpressions)) . ')|\\((?:\\?[:>])?(?&expr)\\))\\$(?&delim)(?=.*D)[Dis]*$)D';
+		if (\preg_match($regexp, $this->vars['regexp']))
+			$this->markAsSafeInJS();
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/SimpletextFilter.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class SimpletextFilter extends AttributeFilter
+{
+	public function __construct()
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterSimpletext');
+		$this->setJS('BuiltInFilters.filterSimpletext');
+	}
+	public function isSafeInCSS()
+	{
+		return \true;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributeFilters/UintFilter.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items\AttributeFilters;
+use s9e\TextFormatter\Configurator\Items\AttributeFilter;
+class UintFilter extends AttributeFilter
+{
+	public function __construct()
+	{
+		parent::__construct('s9e\\TextFormatter\\Parser\\BuiltInFilters::filterUint');
+		$this->setJS('BuiltInFilters.filterUint');
+	}
+	public function isSafeInCSS()
+	{
+		return \true;
+	}
+	public function isSafeInJS()
+	{
+		return \true;
+	}
+	public function isSafeAsURL()
+	{
+		return \true;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/AttributePreprocessor.php
@@ -0,0 +1,22 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items;
+use InvalidArgumentException;
+use s9e\TextFormatter\Configurator\Items\Regexp;
+class AttributePreprocessor extends Regexp
+{
+	public function getAttributes()
+	{
+		return $this->getNamedCaptures();
+	}
+	
+	public function getRegexp()
+	{
+		return $this->regexp;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/TemplateDocument.php
@@ -0,0 +1,22 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items;
+use DOMDocument;
+use s9e\TextFormatter\Configurator\Helpers\TemplateHelper;
+class TemplateDocument extends DOMDocument
+{
+	protected $template;
+	public function __construct(Template $template)
+	{
+		$this->template = $template;
+	}
+	public function saveChanges()
+	{
+		$this->template->setContent(TemplateHelper::saveTemplate($this));
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Items/UnsafeTemplate.php
@@ -0,0 +1,11 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Items;
+class UnsafeTemplate extends Template
+{
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript.php
@@ -0,0 +1,232 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator;
+use ReflectionClass;
+use s9e\TextFormatter\Configurator;
+use s9e\TextFormatter\Configurator\Helpers\ConfigHelper;
+use s9e\TextFormatter\Configurator\JavaScript\CallbackGenerator;
+use s9e\TextFormatter\Configurator\JavaScript\Code;
+use s9e\TextFormatter\Configurator\JavaScript\ConfigOptimizer;
+use s9e\TextFormatter\Configurator\JavaScript\Dictionary;
+use s9e\TextFormatter\Configurator\JavaScript\Encoder;
+use s9e\TextFormatter\Configurator\JavaScript\HintGenerator;
+use s9e\TextFormatter\Configurator\JavaScript\Minifier;
+use s9e\TextFormatter\Configurator\JavaScript\Minifiers\Noop;
+use s9e\TextFormatter\Configurator\JavaScript\RegexpConvertor;
+use s9e\TextFormatter\Configurator\JavaScript\StylesheetCompressor;
+use s9e\TextFormatter\Configurator\RendererGenerators\XSLT;
+class JavaScript
+{
+	protected $callbackGenerator;
+	protected $config;
+	protected $configOptimizer;
+	protected $configurator;
+	public $encoder;
+	public $exportMethods = array(
+		'disablePlugin',
+		'disableTag',
+		'enablePlugin',
+		'enableTag',
+		'getLogger',
+		'parse',
+		'preview',
+		'setNestingLimit',
+		'setParameter',
+		'setTagLimit'
+	);
+	protected $hintGenerator;
+	protected $minifier;
+	protected $stylesheetCompressor;
+	protected $xsl;
+	public function __construct(Configurator $configurator)
+	{
+		$this->encoder              = new Encoder;
+		$this->callbackGenerator    = new CallbackGenerator;
+		$this->configOptimizer      = new ConfigOptimizer($this->encoder);
+		$this->configurator         = $configurator;
+		$this->hintGenerator        = new HintGenerator;
+		$this->stylesheetCompressor = new StylesheetCompressor;
+	}
+	public function getMinifier()
+	{
+		if (!isset($this->minifier))
+			$this->minifier = new Noop;
+		return $this->minifier;
+	}
+	public function getParser(array $config = \null)
+	{
+		$this->configOptimizer->reset();
+		$rendererGenerator = new XSLT;
+		$this->xsl = $rendererGenerator->getXSL($this->configurator->rendering);
+		$this->config = (isset($config)) ? $config : $this->configurator->asConfig();
+		$this->config = ConfigHelper::filterConfig($this->config, 'JS');
+		$this->config = $this->callbackGenerator->replaceCallbacks($this->config);
+		$src = $this->getHints() . $this->injectConfig($this->getSource());
+		$src .= $this->getExports();
+		$src = $this->getMinifier()->get($src);
+		$src = '(function(){' . $src . '})()';
+		return $src;
+	}
+	public function setMinifier($minifier)
+	{
+		if (\is_string($minifier))
+		{
+			$className = __NAMESPACE__ . '\\JavaScript\\Minifiers\\' . $minifier;
+			$args = \array_slice(\func_get_args(), 1);
+			if (!empty($args))
+			{
+				$reflection = new ReflectionClass($className);
+				$minifier   = $reflection->newInstanceArgs($args);
+			}
+			else
+				$minifier = new $className;
+		}
+		$this->minifier = $minifier;
+		return $minifier;
+	}
+	protected function encode($value)
+	{
+		return $this->encoder->encode($value);
+	}
+	protected function getExports()
+	{
+		if (empty($this->exportMethods))
+			return '';
+		$methods = array();
+		foreach ($this->exportMethods as $method)
+			$methods[] = "'" . $method . "':" . $method;
+		return "window['s9e'] = { 'TextFormatter': {" . \implode(',', $methods) . "} }\n";
+	}
+	protected function getHints()
+	{
+		$this->hintGenerator->setConfig($this->config);
+		$this->hintGenerator->setPlugins($this->configurator->plugins);
+		$this->hintGenerator->setXSL($this->xsl);
+		return $this->hintGenerator->getHints();
+	}
+	protected function getPluginsConfig()
+	{
+		$plugins = new Dictionary;
+		foreach ($this->config['plugins'] as $pluginName => $pluginConfig)
+		{
+			if (!isset($pluginConfig['js']))
+				continue;
+			$js = $pluginConfig['js'];
+			unset($pluginConfig['js']);
+			unset($pluginConfig['className']);
+			if (isset($pluginConfig['quickMatch']))
+			{
+				$valid = array(
+					'[[:ascii:]]',
+					'[\\xC0-\\xDF][\\x80-\\xBF]',
+					'[\\xE0-\\xEF][\\x80-\\xBF]{2}',
+					'[\\xF0-\\xF7][\\x80-\\xBF]{3}'
+				);
+				$regexp = '#(?>' . \implode('|', $valid) . ')+#';
+				if (\preg_match($regexp, $pluginConfig['quickMatch'], $m))
+					$pluginConfig['quickMatch'] = $m[0];
+				else
+					unset($pluginConfig['quickMatch']);
+			}
+			$globalKeys = array(
+				'quickMatch'  => 1,
+				'regexp'      => 1,
+				'regexpLimit' => 1
+			);
+			$globalConfig = \array_intersect_key($pluginConfig, $globalKeys);
+			$localConfig  = \array_diff_key($pluginConfig, $globalKeys);
+			if (isset($globalConfig['regexp']) && !($globalConfig['regexp'] instanceof Code))
+				$globalConfig['regexp'] = new Code(RegexpConvertor::toJS($globalConfig['regexp'], \true));
+			$globalConfig['parser'] = new Code(
+				'/**
+				* @param {!string} text
+				* @param {!Array.<Array>} matches
+				*/
+				function(text, matches)
+				{
+					/** @const */
+					var config=' . $this->encode($localConfig) . ';
+					' . $js . '
+				}'
+			);
+			$plugins[$pluginName] = $globalConfig;
+		}
+		return $plugins;
+	}
+	protected function getRegisteredVarsConfig()
+	{
+		$registeredVars = $this->config['registeredVars'];
+		unset($registeredVars['cacheDir']);
+		return new Dictionary($registeredVars);
+	}
+	protected function getRootContext()
+	{
+		return $this->config['rootContext'];
+	}
+	protected function getSource()
+	{
+		$src = '';
+		$files = array(
+			'Parser/utils.js',
+			'Parser/BuiltInFilters.js',
+			'Parser/' . (\in_array('getLogger', $this->exportMethods) ? '' : 'Null') . 'Logger.js',
+			'Parser/Tag.js',
+			'Parser.js'
+		);
+		if (\in_array('preview', $this->exportMethods, \true))
+		{
+			$files[] = 'render.js';
+			$src .= '/** @const */ var xsl=' . $this->getStylesheet() . ";\n";
+		}
+		foreach ($files as $filename)
+		{
+			$filepath = __DIR__ . '/../' . $filename;
+			$src .= \file_get_contents($filepath) . "\n";
+		}
+		return $src;
+	}
+	protected function getStylesheet()
+	{
+		return $this->stylesheetCompressor->encode($this->xsl);
+	}
+	protected function getTagsConfig()
+	{
+		$tags = new Dictionary;
+		foreach ($this->config['tags'] as $tagName => $tagConfig)
+		{
+			if (isset($tagConfig['attributes']))
+				$tagConfig['attributes'] = new Dictionary($tagConfig['attributes']);
+			$tags[$tagName] = $tagConfig;
+		}
+		return $tags;
+	}
+	protected function injectConfig($src)
+	{
+		$config = \array_map(
+			array($this, 'encode'),
+			$this->configOptimizer->optimize(
+				array(
+					'plugins'        => $this->getPluginsConfig(),
+					'registeredVars' => $this->getRegisteredVarsConfig(),
+					'rootContext'    => $this->getRootContext(),
+					'tagsConfig'     => $this->getTagsConfig()
+				)
+			)
+		);
+		$src = \preg_replace_callback(
+			'/(\\nvar (' . \implode('|', \array_keys($config)) . '))(;)/',
+			function ($m) use ($config)
+			{
+				return $m[1] . '=' . $config[$m[2]] . $m[3];
+			},
+			$src
+		);
+		$src = $this->configOptimizer->getVarDeclarations() . $src;
+		return $src;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/CallbackGenerator.php
@@ -0,0 +1,84 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript;
+class CallbackGenerator
+{
+	public $callbacks = array(
+		'tags.*.attributes.*.filterChain.*' => array(
+			'attrValue' => '*',
+			'attrName'  => '!string'
+		),
+		'tags.*.attributes.*.generator' => array(
+			'attrName'  => '!string'
+		),
+		'tags.*.filterChain.*' => array(
+			'tag'       => '!Tag',
+			'tagConfig' => '!Object'
+		)
+	);
+	protected $encoder;
+	public function __construct()
+	{
+		$this->encoder = new Encoder;
+	}
+	public function replaceCallbacks(array $config)
+	{
+		foreach ($this->callbacks as $path => $params)
+			$config = $this->mapArray($config, \explode('.', $path), $params);
+		return $config;
+	}
+	protected function buildCallbackArguments(array $params, array $localVars)
+	{
+		unset($params['parser']);
+		$localVars += array('logger' => 1, 'openTags' => 1, 'registeredVars' => 1, 'text' => 1);
+		$args = array();
+		foreach ($params as $k => $v)
+			if (isset($v))
+				$args[] = $this->encoder->encode($v);
+			elseif (isset($localVars[$k]))
+				$args[] = $k;
+			else
+				$args[] = 'registeredVars[' . \json_encode($k) . ']';
+		return \implode(',', $args);
+	}
+	protected function generateFunction(array $config, array $params)
+	{
+		if ($config['js'] == 'returnFalse' || $config['js'] == 'returnTrue')
+			return new Code((string) $config['js']);
+		$config += array('params' => array());
+		$src  = $this->getHeader($params);
+		$src .= 'function(' . \implode(',', \array_keys($params)) . '){';
+		$src .= 'return ' . $this->parenthesizeCallback($config['js']);
+		$src .= '(' . $this->buildCallbackArguments($config['params'], $params) . ');}';
+		return new Code($src);
+	}
+	protected function getHeader(array $params)
+	{
+		$header = "/**\n";
+		foreach ($params as $paramName => $paramType)
+			$header .= '* @param {' . $paramType . '} ' . $paramName . "\n";
+		$header .= "*/\n";
+		return $header;
+	}
+	protected function mapArray(array $array, array $path, array $params)
+	{
+		$key  = \array_shift($path);
+		$keys = ($key === '*') ? \array_keys($array) : array($key);
+		foreach ($keys as $key)
+		{
+			if (!isset($array[$key]))
+				continue;
+			$array[$key] = (empty($path)) ? $this->generateFunction($array[$key], $params) : $this->mapArray($array[$key], $path, $params);
+		}
+		return $array;
+	}
+	protected function parenthesizeCallback($callback)
+	{
+		return (\preg_match('(^[.\\w]+$)D', $callback)) ? $callback : '(' . $callback  . ')';
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/ConfigOptimizer.php
@@ -0,0 +1,93 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript;
+class ConfigOptimizer
+{
+	protected $configValues;
+	protected $encoder;
+	protected $jsLengths;
+	public function __construct(Encoder $encoder)
+	{
+		$this->encoder = $encoder;
+		$this->reset();
+	}
+	public function getVarDeclarations()
+	{
+		\asort($this->jsLengths);
+		$src = '';
+		foreach (\array_keys($this->jsLengths) as $varName)
+		{
+			$configValue = $this->configValues[$varName];
+			if ($configValue->isDeduplicated())
+				$src .= '/** @const */ var ' . $varName . '=' . $this->encoder->encode($configValue->getValue()) . ";\n";
+		}
+		return $src;
+	}
+	public function optimize($object)
+	{
+		return \current($this->optimizeObjectContent(array($object)))->getValue();
+	}
+	public function reset()
+	{
+		$this->configValues = array();
+		$this->jsLengths    = array();
+	}
+	protected function canDeduplicate($value)
+	{
+		return (\is_array($value) || $value instanceof Code || $value instanceof Dictionary);
+	}
+	protected function deduplicateConfigValues()
+	{
+		\arsort($this->jsLengths);
+		foreach (\array_keys($this->jsLengths) as $varName)
+		{
+			$configValue = $this->configValues[$varName];
+			if ($configValue->getUseCount() > 1)
+				$configValue->deduplicate();
+		}
+	}
+	protected function getVarName($js)
+	{
+		return \sprintf('o%08X', \crc32($js));
+	}
+	protected function isIterable($value)
+	{
+		return (\is_array($value) || $value instanceof Dictionary);
+	}
+	protected function optimizeObjectContent($object)
+	{
+		$object = $this->recordObject($object);
+		$this->deduplicateConfigValues();
+		return $object->getValue();
+	}
+	protected function recordObject($object)
+	{
+		$js      = $this->encoder->encode($object);
+		$varName = $this->getVarName($js);
+		if ($this->isIterable($object))
+			$object = $this->recordObjectContent($object);
+		if (!isset($this->configValues[$varName]))
+		{
+			$this->configValues[$varName] = new ConfigValue($object, $varName);
+			$this->jsLengths[$varName]    = \strlen($js);
+		}
+		$this->configValues[$varName]->incrementUseCount();
+		return $this->configValues[$varName];
+	}
+	protected function recordObjectContent($object)
+	{
+		foreach ($object as $k => $v)
+			if ($this->canDeduplicate($v) && !$this->shouldPreserve($v))
+				$object[$k] = $this->recordObject($v);
+		return $object;
+	}
+	protected function shouldPreserve($value)
+	{
+		return ($value instanceof Code && \preg_match('(^\\w+$)', $value));
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/ConfigValue.php
@@ -0,0 +1,56 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript;
+class ConfigValue
+{
+	protected $isDeduplicated = \false;
+	protected $name;
+	protected $useCount = 0;
+	protected $value;
+	protected $varName;
+	public function __construct($value, $varName)
+	{
+		$this->value   = $value;
+		$this->varName = $varName;
+	}
+	public function deduplicate()
+	{
+		if ($this->useCount > 1)
+		{
+			$this->isDeduplicated = \true;
+			$this->decrementUseCount($this->useCount - 1);
+		}
+	}
+	public function getUseCount()
+	{
+		return $this->useCount;
+	}
+	public function getValue()
+	{
+		return $this->value;
+	}
+	public function getVarName()
+	{
+		return $this->varName;
+	}
+	public function incrementUseCount()
+	{
+		++$this->useCount;
+	}
+	public function isDeduplicated()
+	{
+		return $this->isDeduplicated;
+	}
+	protected function decrementUseCount($step = 1)
+	{
+		$this->useCount -= $step;
+		foreach ($this->value as $value)
+			if ($value instanceof ConfigValue)
+				$value->decrementUseCount($step);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/Dictionary.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript;
+use ArrayObject;
+use s9e\TextFormatter\Configurator\FilterableConfigValue;
+use s9e\TextFormatter\Configurator\Helpers\ConfigHelper;
+class Dictionary extends ArrayObject implements FilterableConfigValue
+{
+	public function filterConfig($target)
+	{
+		$value = $this->getArrayCopy();
+		if ($target === 'JS')
+			$value = new Dictionary(ConfigHelper::filterConfig($value, $target));
+		return $value;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/Encoder.php
@@ -0,0 +1,114 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Items\Regexp;
+use s9e\TextFormatter\Configurator\JavaScript\Code;
+use s9e\TextFormatter\Configurator\JavaScript\Dictionary;
+use s9e\TextFormatter\Configurator\JavaScript\Encoder;
+class Encoder
+{
+	public $objectEncoders;
+	public $typeEncoders;
+	public function __construct()
+	{
+		$ns = 's9e\\TextFormatter\\Configurator\\';
+		$this->objectEncoders = array(
+			$ns . 'Items\\Regexp'           => array($this, 'encodeRegexp'),
+			$ns . 'JavaScript\\Code'        => array($this, 'encodeCode'),
+			$ns . 'JavaScript\\ConfigValue' => array($this, 'encodeConfigValue'),
+			$ns . 'JavaScript\\Dictionary'  => array($this, 'encodeDictionary')
+		);
+		$this->typeEncoders = array(
+			'array'   => array($this, 'encodeArray'),
+			'boolean' => array($this, 'encodeBoolean'),
+			'double'  => array($this, 'encodeScalar'),
+			'integer' => array($this, 'encodeScalar'),
+			'object'  => array($this, 'encodeObject'),
+			'string'  => array($this, 'encodeScalar')
+		);
+	}
+	public function encode($value)
+	{
+		$type = \gettype($value);
+		if (!isset($this->typeEncoders[$type]))
+			throw new RuntimeException('Cannot encode ' . $type . ' value');
+		return \call_user_func($this->typeEncoders[$type], $value);
+	}
+	protected function encodeArray(array $array)
+	{
+		return ($this->isIndexedArray($array)) ? $this->encodeIndexedArray($array) : $this->encodeAssociativeArray($array);
+	}
+	protected function encodeAssociativeArray(array $array, $preserveNames = \false)
+	{
+		\ksort($array);
+		$src = '{';
+		$sep = '';
+		foreach ($array as $k => $v)
+		{
+			$src .= $sep . $this->encodePropertyName("$k", $preserveNames) . ':' . $this->encode($v);
+			$sep = ',';
+		}
+		$src .= '}';
+		return $src;
+	}
+	protected function encodeBoolean($value)
+	{
+		return ($value) ? '!0' : '!1';
+	}
+	protected function encodeCode(Code $code)
+	{
+		return (string) $code;
+	}
+	protected function encodeConfigValue(ConfigValue $configValue)
+	{
+		return ($configValue->isDeduplicated()) ? $configValue->getVarName() : $this->encode($configValue->getValue());
+	}
+	protected function encodeDictionary(Dictionary $dict)
+	{
+		return $this->encodeAssociativeArray($dict->getArrayCopy(), \true);
+	}
+	protected function encodeIndexedArray(array $array)
+	{
+		return '[' . \implode(',', \array_map(array($this, 'encode'), $array)) . ']';
+	}
+	protected function encodeObject($object)
+	{
+		foreach ($this->objectEncoders as $className => $callback)
+			if ($object instanceof $className)
+				return \call_user_func($callback, $object);
+		throw new RuntimeException('Cannot encode instance of ' . \get_class($object));
+	}
+	protected function encodePropertyName($name, $preserveNames)
+	{
+		return ($preserveNames || !$this->isLegalProp($name)) ? \json_encode($name) : $name;
+	}
+	protected function encodeRegexp(Regexp $regexp)
+	{
+		return $regexp->getJS();
+	}
+	protected function encodeScalar($value)
+	{
+		return \json_encode($value);
+	}
+	protected function isIndexedArray(array $array)
+	{
+		if (empty($array))
+			return \true;
+		if (isset($array[0]) && \array_keys($array) === \range(0, \count($array) - 1))
+			return \true;
+		return \false;
+	}
+	protected function isLegalProp($name)
+	{
+		$reserved = array('abstract', 'boolean', 'break', 'byte', 'case', 'catch', 'char', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'double', 'else', 'enum', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', 'if', 'implements', 'import', 'in', 'instanceof', 'int', 'interface', 'let', 'long', 'native', 'new', 'null', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'super', 'switch', 'synchronized', 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void', 'volatile', 'while', 'with');
+		if (\in_array($name, $reserved, \true))
+			return \false;
+		return (bool) \preg_match('#^(?![0-9])[$_\\pL][$_\\pL\\pNl]+$#Du', $name);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/HintGenerator.php
@@ -0,0 +1,92 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript;
+use ReflectionClass;
+use s9e\TextFormatter\Configurator\Collections\PluginCollection;
+class HintGenerator
+{
+	protected $config;
+	protected $hints;
+	protected $plugins;
+	protected $xsl;
+	public function getHints()
+	{
+		$this->hints = array();
+		$this->setPluginsHints();
+		$this->setRenderingHints();
+		$this->setRulesHints();
+		$this->setTagsHints();
+		$js = "/** @const */ var HINT={};\n";
+		\ksort($this->hints);
+		foreach ($this->hints as $hintName => $hintValue)
+			$js .= '/** @const */ HINT.' . $hintName . '=' . \json_encode($hintValue) . ";\n";
+		return $js;
+	}
+	public function setConfig(array $config)
+	{
+		$this->config = $config;
+	}
+	public function setPlugins(PluginCollection $plugins)
+	{
+		$this->plugins = $plugins;
+	}
+	public function setXSL($xsl)
+	{
+		$this->xsl = $xsl;
+	}
+	protected function setPluginsHints()
+	{
+		foreach ($this->plugins as $plugins)
+			$this->hints += $plugins->getJSHints();
+	}
+	protected function setRenderingHints()
+	{
+		$this->hints['postProcessing'] = (int) (\strpos($this->xsl, 'data-s9e-livepreview-postprocess') !== \false);
+	}
+	protected function setRulesHints()
+	{
+		$this->hints['closeAncestor']   = 0;
+		$this->hints['closeParent']     = 0;
+		$this->hints['createChild']     = 0;
+		$this->hints['fosterParent']    = 0;
+		$this->hints['requireAncestor'] = 0;
+		$flags = 0;
+		foreach ($this->config['tags'] as $tagConfig)
+		{
+			foreach (\array_intersect_key($tagConfig['rules'], $this->hints) as $k => $v)
+				$this->hints[$k] = 1;
+			$flags |= $tagConfig['rules']['flags'];
+		}
+		$flags |= $this->config['rootContext']['flags'];
+		$parser = new ReflectionClass('s9e\\TextFormatter\\Parser');
+		foreach ($parser->getConstants() as $constName => $constValue)
+			if (\substr($constName, 0, 5) === 'RULE_')
+				$this->hints[$constName] = ($flags & $constValue) ? 1 : 0;
+	}
+	protected function setTagAttributesHints(array $tagConfig)
+	{
+		if (empty($tagConfig['attributes']))
+			return;
+		foreach ($tagConfig['attributes'] as $attrConfig)
+		{
+			$this->hints['attributeGenerator']    |= isset($attrConfig['generator']);
+			$this->hints['attributeDefaultValue'] |= isset($attrConfig['defaultValue']);
+		}
+	}
+	protected function setTagsHints()
+	{
+		$this->hints['attributeGenerator']    = 0;
+		$this->hints['attributeDefaultValue'] = 0;
+		$this->hints['namespaces']            = 0;
+		foreach ($this->config['tags'] as $tagName => $tagConfig)
+		{
+			$this->hints['namespaces'] |= (\strpos($tagName, ':') !== \false);
+			$this->setTagAttributesHints($tagConfig);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/Minifier.php
@@ -0,0 +1,41 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript;
+use Exception;
+abstract class Minifier
+{
+	public $cacheDir;
+	public $keepGoing = \false;
+	abstract public function minify($src);
+	public function get($src)
+	{
+		try
+		{
+			return (isset($this->cacheDir)) ? $this->getFromCache($src) : $this->minify($src);
+		}
+		catch (Exception $e)
+		{
+			if (!$this->keepGoing)
+				throw $e;
+		}
+		return $src;
+	}
+	public function getCacheDifferentiator()
+	{
+		return '';
+	}
+	protected function getFromCache($src)
+	{
+		$differentiator = $this->getCacheDifferentiator();
+		$key            = \sha1(\serialize(array(\get_class($this), $differentiator, $src)));
+		$cacheFile      = $this->cacheDir . '/minifier.' . $key . '.js';
+		if (!\file_exists($cacheFile))
+			\file_put_contents($cacheFile, $this->minify($src));
+		return \file_get_contents($cacheFile);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/Minifiers/ClosureCompilerApplication.php
@@ -0,0 +1,79 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript\Minifiers;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\JavaScript\Minifier;
+class ClosureCompilerApplication extends Minifier
+{
+	public $closureCompilerBin;
+	public $compilationLevel = 'ADVANCED_OPTIMIZATIONS';
+	public $excludeDefaultExterns = \true;
+	public $javaBin = 'java';
+	public $options = '--use_types_for_optimization';
+	public function __construct($filepath = \null)
+	{
+		if (isset($filepath))
+		{
+			$this->closureCompilerBin = $filepath;
+			$this->testFilepaths();
+		}
+	}
+	public function getCacheDifferentiator()
+	{
+		$key = array(
+			$this->compilationLevel,
+			$this->excludeDefaultExterns,
+			$this->options,
+			$this->getClosureCompilerBinHash()
+		);
+		if ($this->excludeDefaultExterns)
+			$key[] = \file_get_contents(__DIR__ . '/../externs.application.js');
+		return $key;
+	}
+	public function minify($src)
+	{
+		$this->testFilepaths();
+		$options = ($this->options) ? ' ' . $this->options : '';
+		if ($this->excludeDefaultExterns && $this->compilationLevel === 'ADVANCED_OPTIMIZATIONS')
+			$options .= ' --externs ' . __DIR__ . '/../externs.application.js --env=CUSTOM';
+		$crc     = \crc32($src);
+		$inFile  = \sys_get_temp_dir() . '/' . $crc . '.js';
+		$outFile = \sys_get_temp_dir() . '/' . $crc . '.min.js';
+		\file_put_contents($inFile, $src);
+		$cmd = \escapeshellcmd($this->javaBin)
+		     . ' -jar ' . \escapeshellarg($this->closureCompilerBin)
+		     . ' --compilation_level ' . \escapeshellarg($this->compilationLevel)
+		     . $options
+		     . ' --js ' . \escapeshellarg($inFile)
+		     . ' --js_output_file ' . \escapeshellarg($outFile);
+		\exec($cmd . ' 2>/dev/null', $output, $return);
+		\unlink($inFile);
+		if (\file_exists($outFile))
+		{
+			$src = \trim(\file_get_contents($outFile));
+			\unlink($outFile);
+		}
+		if (!empty($return))
+			throw new RuntimeException('An error occured during minification');
+		return $src;
+	}
+	protected function getClosureCompilerBinHash()
+	{
+		static $cache = array();
+		if (!isset($cache[$this->closureCompilerBin]))
+			$cache[$this->closureCompilerBin] = \md5_file($this->closureCompilerBin);
+		return $cache[$this->closureCompilerBin];
+	}
+	protected function testFilepaths()
+	{
+		if (!isset($this->closureCompilerBin))
+			throw new RuntimeException('No path set for Closure Compiler');
+		if (!\file_exists($this->closureCompilerBin))
+			throw new RuntimeException('Cannot find Closure Compiler at ' . $this->closureCompilerBin);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/Minifiers/ClosureCompilerService.php
@@ -0,0 +1,88 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript\Minifiers;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\JavaScript\OnlineMinifier;
+class ClosureCompilerService extends OnlineMinifier
+{
+	public $compilationLevel = 'ADVANCED_OPTIMIZATIONS';
+	public $excludeDefaultExterns = \true;
+	public $externs;
+	public $url = 'http://closure-compiler.appspot.com/compile';
+	public function __construct()
+	{
+		parent::__construct();
+		$this->externs = \file_get_contents(__DIR__ . '/../externs.service.js');
+	}
+	public function getCacheDifferentiator()
+	{
+		$key = array($this->compilationLevel, $this->excludeDefaultExterns);
+		if ($this->excludeDefaultExterns)
+			$key[] = $this->externs;
+		return $key;
+	}
+	public function minify($src)
+	{
+		$body     = $this->generateRequestBody($src);
+		$response = $this->query($body);
+		if ($response === \false)
+			throw new RuntimeException('Could not contact the Closure Compiler service');
+		return $this->decodeResponse($response);
+	}
+	protected function decodeResponse($response)
+	{
+		$response = \json_decode($response, \true);
+		if (\is_null($response))
+		{
+			$msgs = array(
+					\JSON_ERROR_NONE => 'No error',
+					\JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
+					\JSON_ERROR_STATE_MISMATCH => 'State mismatch (invalid or malformed JSON)',
+					\JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
+					\JSON_ERROR_SYNTAX => 'Syntax error',
+					\JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded'
+				);
+				throw new RuntimeException('Closure Compiler service returned invalid JSON: ' . (isset($msgs[\json_last_error()]) ? $msgs[\json_last_error()] : 'Unknown error'));
+		}
+		if (isset($response['serverErrors'][0]))
+		{
+			$error = $response['serverErrors'][0];
+			throw new RuntimeException('Server error ' . $error['code'] . ': ' . $error['error']);
+		}
+		if (isset($response['errors'][0]))
+		{
+			$error = $response['errors'][0];
+			throw new RuntimeException('Compilation error: ' . $error['error']);
+		}
+		return $response['compiledCode'];
+	}
+	protected function generateRequestBody($src)
+	{
+		$params = array(
+			'compilation_level' => $this->compilationLevel,
+			'js_code'           => $src,
+			'output_format'     => 'json',
+			'output_info'       => 'compiled_code'
+		);
+		if ($this->excludeDefaultExterns && $this->compilationLevel === 'ADVANCED_OPTIMIZATIONS')
+		{
+			$params['exclude_default_externs'] = 'true';
+			$params['js_externs'] = $this->externs;
+		}
+		$body = \http_build_query($params) . '&output_info=errors';
+		return $body;
+	}
+	protected function query($body)
+	{
+		return $this->httpClient->post(
+			$this->url,
+			array('Content-Type: application/x-www-form-urlencoded'),
+			$body
+		);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/Minifiers/FirstAvailable.php
@@ -0,0 +1,81 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript\Minifiers;
+use ArrayAccess;
+use Exception;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Collections\MinifierList;
+use s9e\TextFormatter\Configurator\JavaScript\Minifier;
+use s9e\TextFormatter\Configurator\Traits\CollectionProxy;
+
+class FirstAvailable extends Minifier implements ArrayAccess
+{
+	public function __call($methodName, $args)
+	{
+		return \call_user_func_array(array($this->collection, $methodName), $args);
+	}
+	public function offsetExists($offset)
+	{
+		return isset($this->collection[$offset]);
+	}
+	public function offsetGet($offset)
+	{
+		return $this->collection[$offset];
+	}
+	public function offsetSet($offset, $value)
+	{
+		$this->collection[$offset] = $value;
+	}
+	public function offsetUnset($offset)
+	{
+		unset($this->collection[$offset]);
+	}
+	public function count()
+	{
+		return \count($this->collection);
+	}
+	public function current()
+	{
+		return $this->collection->current();
+	}
+	public function key()
+	{
+		return $this->collection->key();
+	}
+	public function next()
+	{
+		return $this->collection->next();
+	}
+	public function rewind()
+	{
+		$this->collection->rewind();
+	}
+	public function valid()
+	{
+		return $this->collection->valid();
+	}
+	protected $collection;
+	public function __construct()
+	{
+		$this->collection = new MinifierList;
+		foreach (\func_get_args() as $minifier)
+			$this->collection->add($minifier);
+	}
+	public function minify($src)
+	{
+		foreach ($this->collection as $minifier)
+			try
+			{
+				return $minifier->minify($src);
+			}
+			catch (Exception $e)
+			{
+				}
+		throw new RuntimeException('No minifier available');
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/Minifiers/HostedMinifier.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript\Minifiers;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\JavaScript\OnlineMinifier;
+class HostedMinifier extends OnlineMinifier
+{
+	public $gzLevel = 5;
+	public $url = 'http://s9e-textformatter.rhcloud.com/minifier/';
+	public function minify($src)
+	{
+		$headers = array('Content-Type: application/octet-stream');
+		$body    = $src;
+		if (\extension_loaded('zlib'))
+		{
+			$headers[] = 'Content-Encoding: gzip';
+			$body      = \gzencode($body, $this->gzLevel);
+		}
+		$code = $this->httpClient->post($this->url, $headers, $body);
+		if ($code === \false)
+			throw new RuntimeException;
+		return $code;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/Minifiers/MatthiasMullieMinify.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript\Minifiers;
+use MatthiasMullie\Minify;
+use s9e\TextFormatter\Configurator\JavaScript\Minifier;
+class MatthiasMullieMinify extends Minifier
+{
+	public function minify($src)
+	{
+		$minifier = new Minify\JS($src);
+		return $minifier->minify();
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/Minifiers/Noop.php
@@ -0,0 +1,16 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript\Minifiers;
+use s9e\TextFormatter\Configurator\JavaScript\Minifier;
+class Noop extends Minifier
+{
+	public function minify($src)
+	{
+		return $src;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/Minifiers/RemoteCache.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript\Minifiers;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\JavaScript\OnlineMinifier;
+class RemoteCache extends OnlineMinifier
+{
+	public $url = 'http://s9e-textformatter.rhcloud.com/minifier/';
+	public function minify($src)
+	{
+		$url  = $this->url . '?hash=' . $this->getHash($src);
+		$code = $this->httpClient->get($url);
+		if ($code === \false)
+			throw new RuntimeException;
+		return $code;
+	}
+	protected function getHash($src)
+	{
+		return \strtr(\base64_encode(\sha1($src, \true) . \md5($src, \true)), '+/', '-_');
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/OnlineMinifier.php
@@ -0,0 +1,17 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript;
+use s9e\TextFormatter\Utils\Http;
+abstract class OnlineMinifier extends Minifier
+{
+	public $httpClient;
+	public function __construct()
+	{
+		$this->httpClient = Http::getClient();
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/RegexpConvertor.php
@@ -0,0 +1,172 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Helpers\RegexpParser;
+abstract class RegexpConvertor
+{
+	protected static $unicodePropsRegexp = '((?<!\\\\)((?:\\\\\\\\)*+)\\\\([Pp](?:L[mo]?|N[dlo]?|P[c-fios]?|S[ckmo]?|Z[lps]?|\\{(?:L[mo]?|N[dlo]?|P[c-fios]?|S[ckmo]?|Z[lps]?|\\^(?:L[mo]?|N[dlo]?|P[c-fios]?|S[ckmo]?|Z[lps]?))})))';
+	public static function toJS($regexp, $isGlobal = \false)
+	{
+		$regexpInfo = RegexpParser::parse($regexp);
+		$dotAll     = (\strpos($regexpInfo['modifiers'], 's') !== \false);
+		$regexp = '';
+		$pos = 0;
+		foreach ($regexpInfo['tokens'] as $tok)
+		{
+			$regexp .= self::convertUnicodeCharacters(
+				\substr($regexpInfo['regexp'], $pos, $tok['pos'] - $pos),
+				\false,
+				$dotAll
+			);
+			switch ($tok['type'])
+			{
+				case 'option':
+					if ($tok['options'] !== 'J')
+						throw new RuntimeException('Regexp options are not supported');
+					break;
+				case 'capturingSubpatternStart':
+					$regexp .= '(';
+					break;
+				case 'nonCapturingSubpatternStart':
+					if (!empty($tok['options']))
+						throw new RuntimeException('Subpattern options are not supported');
+					$regexp .= '(?:';
+					break;
+				case 'capturingSubpatternEnd':
+				case 'nonCapturingSubpatternEnd':
+					$regexp .= ')' . \substr($tok['quantifiers'], 0, 1);
+					break;
+				case 'characterClass':
+					$regexp .= '[';
+					$regexp .= self::convertUnicodeCharacters($tok['content'], \true, \false);
+					$regexp .= ']' . \substr($tok['quantifiers'], 0, 1);
+					break;
+				case 'lookaheadAssertionStart':
+					$regexp .= '(?=';
+					break;
+				case 'negativeLookaheadAssertionStart':
+					$regexp .= '(?!';
+					break;
+				case 'lookaheadAssertionEnd':
+				case 'negativeLookaheadAssertionEnd':
+					$regexp .= ')';
+					break;
+				default:
+					throw new RuntimeException("Unsupported token type '" . $tok['type'] . "'");
+			}
+			$pos = $tok['pos'] + $tok['len'];
+		}
+		$regexp .= self::convertUnicodeCharacters(\substr($regexpInfo['regexp'], $pos), \false, $dotAll);
+		if ($regexpInfo['delimiter'] !== '/')
+			$regexp = \preg_replace('#(?<!\\\\)((?:\\\\\\\\)*+)/#', '$1\\/', $regexp);
+		$modifiers = \preg_replace('#[^im]#', '', $regexpInfo['modifiers']);
+		if ($isGlobal)
+			$modifiers .= 'g';
+		return '/' . self::escapeLineTerminators($regexp) . '/' . $modifiers;
+	}
+	protected static function convertUnicodeCharacters($str, $inCharacterClass, $dotAll)
+	{
+		$str = \preg_replace('((?<!\\\\)(?:\\\\\\\\)*\\K\\\\x\\{([0-9a-f]{4})\\})i', '\\u$1', $str);
+		$str = self::unfoldUnicodeProperties($str, $inCharacterClass, $dotAll);
+		return $str;
+	}
+	protected static function escapeLineTerminators($regexp)
+	{
+		return \preg_replace_callback(
+			"/(\\\\*)([\\r\\n]|\xE2\x80\xA8|\xE2\x80\xA9)/",
+			function ($m)
+			{
+				$table = array(
+					"\r" => '\\r',
+					"\n" => '\\n',
+					"\xE2\x80\xA8" => '\\u2028',
+					"\xE2\x80\xA9" => '\\u2029'
+				);
+				if (\strlen($m[1]) & 1)
+					$m[1] .= '\\';
+				return $m[1] . $table[$m[2]];
+			},
+			$regexp
+		);
+	}
+	protected static function unfoldUnicodeProperties($str, $inCharacterClass, $dotAll)
+	{
+		$unicodeProps = self::$unicodeProps;
+		$str = \preg_replace_callback(
+			self::$unicodePropsRegexp,
+			function ($m) use ($inCharacterClass, $unicodeProps)
+			{
+				$propName = \preg_replace('#[\\{\\}]#', '', $m[2]);
+				if ($propName[1] === '^')
+					$propName = (($propName[0] === 'p') ? 'P' : 'p') . \substr($propName, 2);
+				return (($inCharacterClass) ? '' : '[')
+				     . $unicodeProps[$propName]
+				     . (($inCharacterClass) ? '' : ']');
+			},
+			$str
+		);
+		if ($dotAll)
+			$str = \preg_replace(
+				'#(?<!\\\\)((?:\\\\\\\\)*+)\\.#',
+				'$1[\\s\\S]',
+				$str
+			);
+		return $str;
+	}
+	protected static $unicodeProps = array(
+		'PL' => '\\u0000-@\\[-`\\{-\\u00A9\\u00AB-\\u00B4\\u00B6-\\u00B9\\u00BB-\\u00BF\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02EF-\\u036F\\u0378\\u0379\\u0380-\\u0385\\u0482-\\u0489\\u0557\\u0558\\u055A-\\u0560\\u0588-\\u05CF\\u05EB-\\u05EF\\u05F3-\\u061F\\u064B-\\u066D\\u06D6-\\u06E4\\u06E7-\\u06ED\\u06F0-\\u06F9\\u06FD\\u06FE\\u0700-\\u070F\\u0730-\\u074C\\u07A6-\\u07B0\\u07B2-\\u07C9\\u07EB-\\u07F3\\u07F6-\\u07F9\\u07FB-\\u07FF\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u083F\\u0859-\\u089F\\u08BE-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962-\\u0970\\u0981-\\u0984\\u098D\\u098E\\u0991\\u0992\\u09B3-\\u09B5\\u09BA-\\u09BC\\u09BE-\\u09CD\\u09CF-\\u09DB\\u09E2-\\u09EF\\u09F2-\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A3A-\\u0A58\\u0A5F-\\u0A71\\u0A75-\\u0A84\\u0ABA-\\u0ABC\\u0ABE-\\u0ACF\\u0AD1-\\u0ADF\\u0AE2-\\u0AF8\\u0AFA-\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B3A-\\u0B3C\\u0B3E-\\u0B5B\\u0B62-\\u0B70\\u0B72-\\u0B82\\u0B8B-\\u0B8D\\u0B96-\\u0B98\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BCF\\u0BD1-\\u0C04\\u0C3A-\\u0C3C\\u0C3E-\\u0C57\\u0C5B-\\u0C5F\\u0C62-\\u0C7F\\u0C81-\\u0C84\\u0CBA-\\u0CBC\\u0CBE-\\u0CDD\\u0CE2-\\u0CF0\\u0CF3-\\u0D04\\u0D3B\\u0D3C\\u0D3E-\\u0D4D\\u0D4F-\\u0D53\\u0D57-\\u0D5E\\u0D62-\\u0D79\\u0D80-\\u0D84\\u0D97-\\u0D99\\u0DBE\\u0DBF\\u0DC7-\\u0E00\\u0E34-\\u0E3F\\u0E47-\\u0E80\\u0E85\\u0E86\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0EA8\\u0EA9\\u0EB4-\\u0EBC\\u0EBE\\u0EBF\\u0EC7-\\u0EDB\\u0EE0-\\u0EFF\\u0F01-\\u0F3F\\u0F6D-\\u0F87\\u0F8D-\\u0FFF\\u102B-\\u103E\\u1040-\\u104F\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F-\\u109F\\u10C8-\\u10CC\\u10CE\\u10CF\\u124E\\u124F\\u125E\\u125F\\u128E\\u128F\\u12B6\\u12B7\\u12C6\\u12C7\\u1316\\u1317\\u135B-\\u137F\\u1390-\\u139F\\u13F6\\u13F7\\u13FE-\\u1400\\u166D\\u166E\\u169B-\\u169F\\u16EB-\\u16F0\\u16F9-\\u16FF\\u1712-\\u171F\\u1732-\\u173F\\u1752-\\u175F\\u1771-\\u177F\\u17B4-\\u17D6\\u17D8-\\u17DB\\u17DD-\\u181F\\u1878-\\u187F\\u1885\\u1886\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F-\\u194F\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19FF\\u1A17-\\u1A1F\\u1A55-\\u1AA6\\u1AA8-\\u1B04\\u1B34-\\u1B44\\u1B4C-\\u1B82\\u1BA1-\\u1BAD\\u1BB0-\\u1BB9\\u1BE6-\\u1BFF\\u1C24-\\u1C4C\\u1C50-\\u1C59\\u1C7E\\u1C7F\\u1C89-\\u1CE8\\u1CF2-\\u1CF4\\u1CF7-\\u1CFF\\u1DC0-\\u1DFF\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F7E\\u1F7F\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FD4\\u1FD5\\u1FDC-\\u1FDF\\u1FED-\\u1FF1\\u1FFD-\\u2070\\u2072-\\u207E\\u2080-\\u208F\\u209D-\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2116-\\u2118\\u211E-\\u2123\\u213A\\u213B\\u2140-\\u2144\\u214A-\\u214D\\u214F-\\u2182\\u2185-\\u2BFF\\u2CE5-\\u2CEA\\u2CEF-\\u2CF1\\u2CF4-\\u2CFF\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D70-\\u2D7F\\u2D97-\\u2D9F\\u2DDF-\\u2E2E\\u2E30-\\u3004\\u3007-\\u3030\\u3036-\\u303A\\u303D-\\u3040\\u3097-\\u309C\\u3100-\\u3104\\u312E-\\u3130\\u318F-\\u319F\\u31BB-\\u31EF\\u3200-\\u33FF\\u4DB6-\\u4DFF\\u9FD6-\\u9FFF\\uA48D-\\uA4CF\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA620-\\uA629\\uA62C-\\uA63F\\uA66F-\\uA67E\\uA69E\\uA69F\\uA6E6-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uA7B8-\\uA7F6\\uA823-\\uA83F\\uA874-\\uA881\\uA8B4-\\uA8F1\\uA8F8-\\uA8FA\\uA8FE-\\uA909\\uA926-\\uA92F\\uA947-\\uA95F\\uA97D-\\uA983\\uA9B3-\\uA9CE\\uA9D0-\\uA9DF\\uA9F0-\\uA9F9\\uAA29-\\uAA3F\\uAA4C-\\uAA5F\\uAA77-\\uAA79\\uAA7B-\\uAA7D\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC3-\\uAADA\\uAADE\\uAADF\\uAAEB-\\uAAF1\\uAAF5-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB66-\\uAB6F\\uABE3-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uF8FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFBB2-\\uFBD2\\uFD3E-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFC-\\uFE6F\\uFEFD-\\uFF20\\uFF3B-\\uFF40\\uFF5B-\\uFF65\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFFF',
+		'PLm' => '\\u0000-\\u02AF\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02EF-\\u0373\\u0375-\\u0379\\u037B-\\u0558\\u055A-\\u063F\\u0641-\\u06E4\\u06E7-\\u07F3\\u07F6-\\u07F9\\u07FB-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u0970\\u0972-\\u0E45\\u0E47-\\u0EC5\\u0EC7-\\u10FB\\u10FD-\\u17D6\\u17D8-\\u1842\\u1844-\\u1AA6\\u1AA8-\\u1C77\\u1C7E-\\u1D2B\\u1D6B-\\u1D77\\u1D79-\\u1D9A\\u1DC0-\\u2070\\u2072-\\u207E\\u2080-\\u208F\\u209D-\\u2C7B\\u2C7E-\\u2D6E\\u2D70-\\u2E2E\\u2E30-\\u3004\\u3006-\\u3030\\u3036-\\u303A\\u303C-\\u309C\\u309F-\\u30FB\\u30FF-\\uA014\\uA016-\\uA4F7\\uA4FE-\\uA60B\\uA60D-\\uA67E\\uA680-\\uA69B\\uA69E-\\uA716\\uA720-\\uA76F\\uA771-\\uA787\\uA789-\\uA7F7\\uA7FA-\\uA9CE\\uA9D0-\\uA9E5\\uA9E7-\\uAA6F\\uAA71-\\uAADC\\uAADE-\\uAAF2\\uAAF5-\\uAB5B\\uAB60-\\uFF6F\\uFF71-\\uFF9D\\uFFA0-\\uFFFF',
+		'PLo' => '\\u0000-\\u00A9\\u00AB-\\u00B9\\u00BB-\\u01BA\\u01BC-\\u01BF\\u01C4-\\u0293\\u0295-\\u05CF\\u05EB-\\u05EF\\u05F3-\\u061F\\u064B-\\u066D\\u06D6-\\u06ED\\u06F0-\\u06F9\\u06FD\\u06FE\\u0700-\\u070F\\u0730-\\u074C\\u07A6-\\u07B0\\u07B2-\\u07C9\\u07EB-\\u07FF\\u0816-\\u083F\\u0859-\\u089F\\u08BE-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962-\\u0971\\u0981-\\u0984\\u098D\\u098E\\u0991\\u0992\\u09B3-\\u09B5\\u09BA-\\u09BC\\u09BE-\\u09CD\\u09CF-\\u09DB\\u09E2-\\u09EF\\u09F2-\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A3A-\\u0A58\\u0A5F-\\u0A71\\u0A75-\\u0A84\\u0ABA-\\u0ABC\\u0ABE-\\u0ACF\\u0AD1-\\u0ADF\\u0AE2-\\u0AF8\\u0AFA-\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B3A-\\u0B3C\\u0B3E-\\u0B5B\\u0B62-\\u0B70\\u0B72-\\u0B82\\u0B8B-\\u0B8D\\u0B96-\\u0B98\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BCF\\u0BD1-\\u0C04\\u0C3A-\\u0C3C\\u0C3E-\\u0C57\\u0C5B-\\u0C5F\\u0C62-\\u0C7F\\u0C81-\\u0C84\\u0CBA-\\u0CBC\\u0CBE-\\u0CDD\\u0CE2-\\u0CF0\\u0CF3-\\u0D04\\u0D3B\\u0D3C\\u0D3E-\\u0D4D\\u0D4F-\\u0D53\\u0D57-\\u0D5E\\u0D62-\\u0D79\\u0D80-\\u0D84\\u0D97-\\u0D99\\u0DBE\\u0DBF\\u0DC7-\\u0E00\\u0E34-\\u0E3F\\u0E46-\\u0E80\\u0E85\\u0E86\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0EA8\\u0EA9\\u0EB4-\\u0EBC\\u0EBE\\u0EBF\\u0EC5-\\u0EDB\\u0EE0-\\u0EFF\\u0F01-\\u0F3F\\u0F6D-\\u0F87\\u0F8D-\\u0FFF\\u102B-\\u103E\\u1040-\\u104F\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F-\\u10CF\\u10FB\\u10FC\\u124E\\u124F\\u125E\\u125F\\u128E\\u128F\\u12B6\\u12B7\\u12C6\\u12C7\\u1316\\u1317\\u135B-\\u137F\\u1390-\\u1400\\u166D\\u166E\\u169B-\\u169F\\u16EB-\\u16F0\\u16F9-\\u16FF\\u1712-\\u171F\\u1732-\\u173F\\u1752-\\u175F\\u1771-\\u177F\\u17B4-\\u17DB\\u17DD-\\u181F\\u1878-\\u187F\\u1885\\u1886\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F-\\u194F\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19FF\\u1A17-\\u1A1F\\u1A55-\\u1B04\\u1B34-\\u1B44\\u1B4C-\\u1B82\\u1BA1-\\u1BAD\\u1BB0-\\u1BB9\\u1BE6-\\u1BFF\\u1C24-\\u1C4C\\u1C50-\\u1C59\\u1C78-\\u1CE8\\u1CF2-\\u1CF4\\u1CF7-\\u2134\\u2139-\\u2D2F\\u2D68-\\u2D7F\\u2D97-\\u2D9F\\u2DDF-\\u3005\\u3007-\\u303B\\u303D-\\u3040\\u3097-\\u309E\\u30FB-\\u30FE\\u3100-\\u3104\\u312E-\\u3130\\u318F-\\u319F\\u31BB-\\u31EF\\u3200-\\u33FF\\u4DB6-\\u4DFF\\u9FD6-\\u9FFF\\uA48D-\\uA4CF\\uA4F8-\\uA4FF\\uA60C-\\uA60F\\uA620-\\uA629\\uA62C-\\uA66D\\uA66F-\\uA69F\\uA6E6-\\uA78E\\uA790-\\uA7F6\\uA7F8-\\uA7FA\\uA823-\\uA83F\\uA874-\\uA881\\uA8B4-\\uA8F1\\uA8F8-\\uA8FA\\uA8FE-\\uA909\\uA926-\\uA92F\\uA947-\\uA95F\\uA97D-\\uA983\\uA9B3-\\uA9DF\\uA9E5\\uA9E6\\uA9F0-\\uA9F9\\uAA29-\\uAA3F\\uAA4C-\\uAA5F\\uAA77-\\uAA79\\uAA7B-\\uAA7D\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC3-\\uAADA\\uAADD-\\uAADF\\uAAEB-\\uAAF1\\uAAF3-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB2F-\\uABBF\\uABE3-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uF8FF\\uFA6E\\uFA6F\\uFADA-\\uFB1C\\uFBB2-\\uFBD2\\uFD3E-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFC-\\uFE6F\\uFEFD-\\uFF65\\uFF9E\\uFF9F\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFFF',
+		'PN' => '\\u0000-/\\:-\\u00B1\\u00B4-\\u00B8\\u00BA\\u00BB\\u00BF-\\u065F\\u066A-\\u06EF\\u06FA-\\u07BF\\u07CA-\\u0965\\u0970-\\u09E5\\u09F0-\\u09F3\\u09FA-\\u0A65\\u0A70-\\u0AE5\\u0AF0-\\u0B65\\u0B70\\u0B71\\u0B78-\\u0BE5\\u0BF3-\\u0C65\\u0C70-\\u0C77\\u0C7F-\\u0CE5\\u0CF0-\\u0D57\\u0D5F-\\u0D65\\u0D79-\\u0DE5\\u0DF0-\\u0E4F\\u0E5A-\\u0ECF\\u0EDA-\\u0F1F\\u0F34-\\u103F\\u104A-\\u108F\\u109A-\\u1368\\u137D-\\u16ED\\u16F1-\\u17DF\\u17EA-\\u17EF\\u17FA-\\u180F\\u181A-\\u1945\\u1950-\\u19CF\\u19DB-\\u1A7F\\u1A8A-\\u1A8F\\u1A9A-\\u1B4F\\u1B5A-\\u1BAF\\u1BBA-\\u1C3F\\u1C4A-\\u1C4F\\u1C5A-\\u206F\\u2071-\\u2073\\u207A-\\u207F\\u208A-\\u214F\\u2183\\u2184\\u218A-\\u245F\\u249C-\\u24E9\\u2500-\\u2775\\u2794-\\u2CFC\\u2CFE-\\u3006\\u3008-\\u3020\\u302A-\\u3037\\u303B-\\u3191\\u3196-\\u321F\\u322A-\\u3247\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\uA61F\\uA62A-\\uA6E5\\uA6F0-\\uA82F\\uA836-\\uA8CF\\uA8DA-\\uA8FF\\uA90A-\\uA9CF\\uA9DA-\\uA9EF\\uA9FA-\\uAA4F\\uAA5A-\\uABEF\\uABFA-\\uFF0F\\uFF1A-\\uFFFF',
+		'PNd' => '\\u0000-/\\:-\\u065F\\u066A-\\u06EF\\u06FA-\\u07BF\\u07CA-\\u0965\\u0970-\\u09E5\\u09F0-\\u0A65\\u0A70-\\u0AE5\\u0AF0-\\u0B65\\u0B70-\\u0BE5\\u0BF0-\\u0C65\\u0C70-\\u0CE5\\u0CF0-\\u0D65\\u0D70-\\u0DE5\\u0DF0-\\u0E4F\\u0E5A-\\u0ECF\\u0EDA-\\u0F1F\\u0F2A-\\u103F\\u104A-\\u108F\\u109A-\\u17DF\\u17EA-\\u180F\\u181A-\\u1945\\u1950-\\u19CF\\u19DA-\\u1A7F\\u1A8A-\\u1A8F\\u1A9A-\\u1B4F\\u1B5A-\\u1BAF\\u1BBA-\\u1C3F\\u1C4A-\\u1C4F\\u1C5A-\\uA61F\\uA62A-\\uA8CF\\uA8DA-\\uA8FF\\uA90A-\\uA9CF\\uA9DA-\\uA9EF\\uA9FA-\\uAA4F\\uAA5A-\\uABEF\\uABFA-\\uFF0F\\uFF1A-\\uFFFF',
+		'PNl' => '\\u0000-\\u16ED\\u16F1-\\u215F\\u2183\\u2184\\u2189-\\u3006\\u3008-\\u3020\\u302A-\\u3037\\u303B-\\uA6E5\\uA6F0-\\uFFFF',
+		'PNo' => '\\u0000-\\u00B1\\u00B4-\\u00B8\\u00BA\\u00BB\\u00BF-\\u09F3\\u09FA-\\u0B71\\u0B78-\\u0BEF\\u0BF3-\\u0C77\\u0C7F-\\u0D57\\u0D5F-\\u0D6F\\u0D79-\\u0F29\\u0F34-\\u1368\\u137D-\\u17EF\\u17FA-\\u19D9\\u19DB-\\u206F\\u2071-\\u2073\\u207A-\\u207F\\u208A-\\u214F\\u2160-\\u2188\\u218A-\\u245F\\u249C-\\u24E9\\u2500-\\u2775\\u2794-\\u2CFC\\u2CFE-\\u3191\\u3196-\\u321F\\u322A-\\u3247\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\uA82F\\uA836-\\uFFFF',
+		'PP' => '\\u0000- 0-9\\<-\\>A-Z`-z~-\\u00A0\\u00A2-\\u00A6\\u00A8-\\u00AA\\u00AC-\\u00B5\\u00B8-\\u00BA\\u00BC-\\u00BE\\u00C0-\\u037D\\u037F-\\u0386\\u0388-\\u0559\\u0560-\\u0588\\u058B-\\u05BD\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7-\\u05F2\\u05F5-\\u0608\\u060E-\\u061A\\u061C\\u061D\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06FF\\u070E-\\u07F6\\u07FA-\\u082F\\u083F-\\u085D\\u085F-\\u0963\\u0966-\\u096F\\u0971-\\u0AEF\\u0AF1-\\u0DF3\\u0DF5-\\u0E4E\\u0E50-\\u0E59\\u0E5C-\\u0F03\\u0F15-\\u0F39\\u0F3E-\\u0F84\\u0F86-\\u0FCF\\u0FD5-\\u0FD8\\u0FDB-\\u1049\\u1050-\\u10FA\\u10FC-\\u135F\\u1369-\\u13FF\\u1401-\\u166C\\u166F-\\u169A\\u169D-\\u16EA\\u16EE-\\u1734\\u1737-\\u17D3\\u17DB-\\u17FF\\u180B-\\u1943\\u1946-\\u1A1D\\u1A20-\\u1A9F\\u1AAE-\\u1B59\\u1B61-\\u1BFB\\u1C00-\\u1C3A\\u1C40-\\u1C7D\\u1C80-\\u1CBF\\u1CC8-\\u1CD2\\u1CD4-\\u200F\\u2028-\\u202F\\u205F-\\u207C\\u207F-\\u208C\\u208F-\\u2307\\u230C-\\u2328\\u232B-\\u2767\\u2776-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2CF8\\u2D00-\\u2D6F\\u2D71-\\u2DFF\\u2E45-\\u3000\\u3004-\\u3007\\u3012\\u3013\\u3020-\\u302F\\u3031-\\u303C\\u303E-\\u309F\\u30A1-\\u30FA\\u30FC-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA672\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA6F8-\\uA873\\uA878-\\uA8CD\\uA8D0-\\uA8F7\\uA8FD-\\uA92D\\uA930-\\uA95E\\uA960-\\uA9C0\\uA9CE-\\uA9DD\\uA9E0-\\uAA5B\\uAA60-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uABEA\\uABEC-\\uFD3D\\uFD40-\\uFE0F\\uFE1A-\\uFE2F\\uFE64-\\uFE67\\uFE6C-\\uFF00\\uFF10-\\uFF19\\uFF1C-\\uFF1E\\uFF21-\\uFF3A\\uFF40-\\uFF5A\\uFF66-\\uFFFF',
+		'PPc' => '\\u0000-\\^`-\\u203E\\u2041-\\u2053\\u2055-\\uFE32\\uFE35-\\uFE4C\\uFE50-\\uFF3E\\uFF40-\\uFFFF',
+		'PPd' => '\\u0000-,\\.-\\u0589\\u058B-\\u05BD\\u05BF-\\u13FF\\u1401-\\u1805\\u1807-\\u200F\\u2016-\\u2E16\\u2E18\\u2E19\\u2E1B-\\u2E39\\u2E3C-\\u2E3F\\u2E41-\\u301B\\u301D-\\u302F\\u3031-\\u309F\\u30A1-\\uFE30\\uFE33-\\uFE57\\uFE59-\\uFE62\\uFE64-\\uFF0C\\uFF0E-\\uFFFF',
+		'PPe' => '\\u0000-\\(\\*-\\\\\\^-\\|~-\\u0F3A\\u0F3E-\\u169B\\u169D-\\u2045\\u2047-\\u207D\\u207F-\\u208D\\u208F-\\u2308\\u230C-\\u2329\\u232B-\\u2768\\u2776-\\u27C5\\u27C7-\\u27E6\\u27F0-\\u2983\\u2999-\\u29D8\\u29DC-\\u29FC\\u29FE-\\u2E22\\u2E2A-\\u3008\\u3012-\\u3014\\u301C\\u301D\\u3020-\\uFD3D\\uFD3F-\\uFE17\\uFE19-\\uFE35\\uFE45-\\uFE47\\uFE49-\\uFE59\\uFE5F-\\uFF08\\uFF0A-\\uFF3C\\uFF3E-\\uFF5C\\uFF5E\\uFF5F\\uFF61\\uFF62\\uFF64-\\uFFFF',
+		'PPf' => '\\u0000-\\u00BA\\u00BC-\\u2018\\u201A-\\u201C\\u201E-\\u2039\\u203B-\\u2E02\\u2E06-\\u2E09\\u2E0B\\u2E0C\\u2E0E-\\u2E1C\\u2E1E-\\u2E20\\u2E22-\\uFFFF',
+		'PPi' => '\\u0000-\\u00AA\\u00AC-\\u2017\\u2019\\u201A\\u201D\\u201E\\u2020-\\u2038\\u203A-\\u2E01\\u2E05-\\u2E08\\u2E0A\\u2E0B\\u2E0D-\\u2E1B\\u2E1D-\\u2E1F\\u2E21-\\uFFFF',
+		'PPo' => '\\u0000- \\(\\)0-9\\<-\\>A-\\[\\]-\\u00A0\\u00A2-\\u00A6\\u00A8-\\u00B5\\u00B8-\\u00BE\\u00C0-\\u037D\\u037F-\\u0386\\u0388-\\u0559\\u0560-\\u0588\\u058A-\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7-\\u05F2\\u05F5-\\u0608\\u060E-\\u061A\\u061C\\u061D\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06FF\\u070E-\\u07F6\\u07FA-\\u082F\\u083F-\\u085D\\u085F-\\u0963\\u0966-\\u096F\\u0971-\\u0AEF\\u0AF1-\\u0DF3\\u0DF5-\\u0E4E\\u0E50-\\u0E59\\u0E5C-\\u0F03\\u0F15-\\u0F84\\u0F86-\\u0FCF\\u0FD5-\\u0FD8\\u0FDB-\\u1049\\u1050-\\u10FA\\u10FC-\\u135F\\u1369-\\u166C\\u166F-\\u16EA\\u16EE-\\u1734\\u1737-\\u17D3\\u17DB-\\u17FF\\u180B-\\u1943\\u1946-\\u1A1D\\u1A20-\\u1A9F\\u1AAE-\\u1B59\\u1B61-\\u1BFB\\u1C00-\\u1C3A\\u1C40-\\u1C7D\\u1C80-\\u1CBF\\u1CC8-\\u1CD2\\u1CD4-\\u2015\\u2018-\\u201F\\u2028-\\u202F\\u2039\\u203A\\u203F\\u2040\\u2044-\\u2046\\u205F-\\u2CF8\\u2D00-\\u2D6F\\u2D71-\\u2DFF\\u2E02-\\u2E05\\u2E09\\u2E0A\\u2E0C\\u2E0D\\u2E1C\\u2E1D\\u2E20-\\u2E29\\u2E3A\\u2E3B\\u2E45-\\u3000\\u3004-\\u303C\\u303E-\\u30FA\\u30FC-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA672\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA6F8-\\uA873\\uA878-\\uA8CD\\uA8D0-\\uA8F7\\uA8FD-\\uA92D\\uA930-\\uA95E\\uA960-\\uA9C0\\uA9CE-\\uA9DD\\uA9E0-\\uAA5B\\uAA60-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uABEA\\uABEC-\\uFE0F\\uFE17\\uFE18\\uFE1A-\\uFE2F\\uFE31-\\uFE44\\uFE47\\uFE48\\uFE4D-\\uFE4F\\uFE58-\\uFE5E\\uFE62-\\uFE67\\uFE6C-\\uFF00\\uFF08\\uFF09\\uFF10-\\uFF19\\uFF1C-\\uFF1E\\uFF21-\\uFF3B\\uFF3D-\\uFF60\\uFF62\\uFF63\\uFF66-\\uFFFF',
+		'PPs' => '\\u0000-\'\\)-Z\\\\-z\\|-\\u0F39\\u0F3D-\\u169A\\u169C-\\u2019\\u201B-\\u201D\\u201F-\\u2044\\u2046-\\u207C\\u207E-\\u208C\\u208E-\\u2307\\u230B-\\u2328\\u232A-\\u2767\\u2775-\\u27C4\\u27C6-\\u27E5\\u27EF-\\u2982\\u2998-\\u29D7\\u29DB-\\u29FB\\u29FD-\\u2E21\\u2E29-\\u2E41\\u2E43-\\u3007\\u3011-\\u3013\\u301B\\u301C\\u301E-\\uFD3E\\uFD40-\\uFE16\\uFE18-\\uFE34\\uFE44-\\uFE46\\uFE48-\\uFE58\\uFE5E-\\uFF07\\uFF09-\\uFF3A\\uFF3C-\\uFF5A\\uFF5C-\\uFF5E\\uFF60\\uFF61\\uFF63-\\uFFFF',
+		'PS' => '\\u0000-#%-\\*,-;\\?-\\]a-\\{\\u007F-\\u00A1\\u00AA\\u00AB\\u00B2\\u00B3\\u00B5-\\u00B7\\u00B9-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u0300-\\u0374\\u0376-\\u0383\\u0386-\\u03F5\\u03F7-\\u0481\\u0483-\\u058C\\u0590-\\u0605\\u0609\\u060A\\u060C\\u060D\\u0610-\\u06DD\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF-\\u07F5\\u07F7-\\u09F1\\u09F4-\\u09F9\\u09FC-\\u0AF0\\u0AF2-\\u0B6F\\u0B71-\\u0BF2\\u0BFB-\\u0C7E\\u0C80-\\u0D4E\\u0D50-\\u0D78\\u0D7A-\\u0E3E\\u0E40-\\u0F00\\u0F04-\\u0F12\\u0F18\\u0F19\\u0F20-\\u0F33\\u0F39-\\u0FBD\\u0FD0-\\u0FD4\\u0FD9-\\u109D\\u10A0-\\u138F\\u139A-\\u17DA\\u17DC-\\u193F\\u1941-\\u19DD\\u1A00-\\u1B60\\u1B6B-\\u1B73\\u1B7D-\\u1FBC\\u1FC2-\\u1FCC\\u1FD0-\\u1FDC\\u1FE0-\\u1FEC\\u1FF0-\\u1FFC\\u1FFF-\\u2043\\u2045-\\u2051\\u2053-\\u2079\\u207D-\\u2089\\u208D-\\u209F\\u20BF-\\u20FF\\u210A-\\u2113\\u2119-\\u211D\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u2150-\\u2189\\u218C-\\u218F\\u2308-\\u230B\\u2329\\u232A\\u2427-\\u243F\\u244B-\\u249B\\u24EA-\\u24FF\\u2768-\\u2793\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2B74\\u2B75\\u2B96\\u2B97\\u2BBA-\\u2BBC\\u2BD2-\\u2BEB\\u2BF0-\\u2CE4\\u2CEB-\\u2E7F\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u3003\\u3005-\\u3011\\u3014-\\u301F\\u3021-\\u3035\\u3038-\\u303D\\u3040-\\u309A\\u309D-\\u318F\\u3192-\\u3195\\u31A0-\\u31BF\\u31E4-\\u31FF\\u321F-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\u3400-\\u4DBF\\u4E00-\\uA48F\\uA4C7-\\uA6FF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA827\\uA82C-\\uA835\\uA83A-\\uAA76\\uAA7A-\\uAB5A\\uAB5C-\\uFB28\\uFB2A-\\uFBB1\\uFBC2-\\uFDFB\\uFDFE-\\uFE61\\uFE67\\uFE68\\uFE6A-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF1B\\uFF1F-\\uFF3D\\uFF41-\\uFF5B\\uFF5F-\\uFFDF\\uFFEF-\\uFFFB\\uFFFE\\uFFFF',
+		'PSc' => '\\u0000-#%-\\u00A1\\u00A6-\\u058E\\u0590-\\u060A\\u060C-\\u09F1\\u09F4-\\u09FA\\u09FC-\\u0AF0\\u0AF2-\\u0BF8\\u0BFA-\\u0E3E\\u0E40-\\u17DA\\u17DC-\\u209F\\u20BF-\\uA837\\uA839-\\uFDFB\\uFDFD-\\uFE68\\uFE6A-\\uFF03\\uFF05-\\uFFDF\\uFFE2-\\uFFE4\\uFFE7-\\uFFFF',
+		'PSk' => '\\u0000-\\]a-\\u00A7\\u00A9-\\u00AE\\u00B0-\\u00B3\\u00B5-\\u00B7\\u00B9-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u0300-\\u0374\\u0376-\\u0383\\u0386-\\u1FBC\\u1FC2-\\u1FCC\\u1FD0-\\u1FDC\\u1FE0-\\u1FEC\\u1FF0-\\u1FFC\\u1FFF-\\u309A\\u309D-\\uA6FF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uAB5A\\uAB5C-\\uFBB1\\uFBC2-\\uFF3D\\uFF41-\\uFFE2\\uFFE4-\\uFFFF',
+		'PSm' => '\\u0000-\\*,-;\\?-\\{\\u007F-\\u00AB\\u00AD-\\u00B0\\u00B2-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u03F5\\u03F7-\\u0605\\u0609-\\u2043\\u2045-\\u2051\\u2053-\\u2079\\u207D-\\u2089\\u208D-\\u2117\\u2119-\\u213F\\u2145-\\u214A\\u214C-\\u218F\\u2195-\\u2199\\u219C-\\u219F\\u21A1\\u21A2\\u21A4\\u21A5\\u21A7-\\u21AD\\u21AF-\\u21CD\\u21D0\\u21D1\\u21D5-\\u21F3\\u2300-\\u231F\\u2322-\\u237B\\u237D-\\u239A\\u23B4-\\u23DB\\u23E2-\\u25B6\\u25B8-\\u25C0\\u25C2-\\u25F7\\u2600-\\u266E\\u2670-\\u27BF\\u27C5\\u27C6\\u27E6-\\u27EF\\u2800-\\u28FF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2B00-\\u2B2F\\u2B45\\u2B46\\u2B4D-\\uFB28\\uFB2A-\\uFE61\\uFE67-\\uFF0A\\uFF0C-\\uFF1B\\uFF1F-\\uFF5B\\uFF5F-\\uFFE1\\uFFE3-\\uFFE8\\uFFED-\\uFFFF',
+		'PSo' => '\\u0000-\\u00A5\\u00A7\\u00A8\\u00AA-\\u00AD\\u00B1-\\u0481\\u0483-\\u058C\\u058F-\\u060D\\u0610-\\u06DD\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF-\\u07F5\\u07F7-\\u09F9\\u09FB-\\u0B6F\\u0B71-\\u0BF2\\u0BFB-\\u0C7E\\u0C80-\\u0D4E\\u0D50-\\u0D78\\u0D7A-\\u0F00\\u0F04-\\u0F12\\u0F18\\u0F19\\u0F20-\\u0F33\\u0F39-\\u0FBD\\u0FD0-\\u0FD4\\u0FD9-\\u109D\\u10A0-\\u138F\\u139A-\\u193F\\u1941-\\u19DD\\u1A00-\\u1B60\\u1B6B-\\u1B73\\u1B7D-\\u20FF\\u210A-\\u2113\\u2118-\\u211D\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u2149\\u2150-\\u2189\\u218C-\\u2194\\u219A\\u219B\\u21CE\\u21CF\\u21F4-\\u22FF\\u2308-\\u230B\\u2320\\u2321\\u2329\\u232A\\u239B-\\u23B3\\u23DC-\\u23E1\\u2427-\\u243F\\u244B-\\u249B\\u24EA-\\u24FF\\u25F8-\\u25FF\\u2768-\\u2793\\u27C0-\\u27FF\\u2900-\\u2AFF\\u2B30-\\u2B44\\u2B47-\\u2B4C\\u2B74\\u2B75\\u2B96\\u2B97\\u2BBA-\\u2BBC\\u2BD2-\\u2BEB\\u2BF0-\\u2CE4\\u2CEB-\\u2E7F\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u3003\\u3005-\\u3011\\u3014-\\u301F\\u3021-\\u3035\\u3038-\\u303D\\u3040-\\u318F\\u3192-\\u3195\\u31A0-\\u31BF\\u31E4-\\u31FF\\u321F-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\u3400-\\u4DBF\\u4E00-\\uA48F\\uA4C7-\\uA827\\uA82C-\\uA835\\uA83A-\\uAA76\\uAA7A-\\uFDFC\\uFDFE-\\uFFE3\\uFFE5-\\uFFE7\\uFFE9-\\uFFEC\\uFFEF-\\uFFFB\\uFFFE\\uFFFF',
+		'PZ' => '\\u0000-\\u001F\\!-\\u009F\\u00A1-\\u167F\\u1681-\\u1FFF\\u200B-\\u2027\\u202A-\\u202E\\u2030-\\u205E\\u2060-\\u2FFF\\u3001-\\uFFFF',
+		'PZl' => '\\u0000-\\u2027\\u2029-\\uFFFF',
+		'PZp' => '\\u0000-\\u2028\\u202A-\\uFFFF',
+		'PZs' => '\\u0000-\\u001F\\!-\\u009F\\u00A1-\\u167F\\u1681-\\u1FFF\\u200B-\\u202E\\u2030-\\u205E\\u2060-\\u2FFF\\u3001-\\uFFFF',
+		'pL' => 'A-Za-z\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',
+		'pLm' => '\\u02B0-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u0640\\u06E5\\u06E6\\u07F4\\u07F5\\u07FA\\u081A\\u0824\\u0828\\u0971\\u0E46\\u0EC6\\u10FC\\u17D7\\u1843\\u1AA7\\u1C78-\\u1C7D\\u1D2C-\\u1D6A\\u1D78\\u1D9B-\\u1DBF\\u2071\\u207F\\u2090-\\u209C\\u2C7C\\u2C7D\\u2D6F\\u2E2F\\u3005\\u3031-\\u3035\\u303B\\u309D\\u309E\\u30FC-\\u30FE\\uA015\\uA4F8-\\uA4FD\\uA60C\\uA67F\\uA69C\\uA69D\\uA717-\\uA71F\\uA770\\uA788\\uA7F8\\uA7F9\\uA9CF\\uA9E6\\uAA70\\uAADD\\uAAF3\\uAAF4\\uAB5C-\\uAB5F\\uFF70\\uFF9E\\uFF9F',
+		'pLo' => '\\u00AA\\u00BA\\u01BB\\u01C0-\\u01C3\\u0294\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u063F\\u0641-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u0800-\\u0815\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0972-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E45\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10D0-\\u10FA\\u10FD-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17DC\\u1820-\\u1842\\u1844-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C77\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u2135-\\u2138\\u2D30-\\u2D67\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3006\\u303C\\u3041-\\u3096\\u309F\\u30A1-\\u30FA\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA014\\uA016-\\uA48C\\uA4D0-\\uA4F7\\uA500-\\uA60B\\uA610-\\uA61F\\uA62A\\uA62B\\uA66E\\uA6A0-\\uA6E5\\uA78F\\uA7F7\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9E0-\\uA9E4\\uA9E7-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA6F\\uAA71-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB\\uAADC\\uAAE0-\\uAAEA\\uAAF2\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF66-\\uFF6F\\uFF71-\\uFF9D\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',
+		'pN' => '0-9\\u00B2\\u00B3\\u00B9\\u00BC-\\u00BE\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u09F4-\\u09F9\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0B72-\\u0B77\\u0BE6-\\u0BF2\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0CE6-\\u0CEF\\u0D58-\\u0D5E\\u0D66-\\u0D78\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F33\\u1040-\\u1049\\u1090-\\u1099\\u1369-\\u137C\\u16EE-\\u16F0\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19DA\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u2182\\u2185-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3007\\u3021-\\u3029\\u3038-\\u303A\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA620-\\uA629\\uA6E6-\\uA6EF\\uA830-\\uA835\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',
+		'pNd' => '0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',
+		'pNl' => '\\u16EE-\\u16F0\\u2160-\\u2182\\u2185-\\u2188\\u3007\\u3021-\\u3029\\u3038-\\u303A\\uA6E6-\\uA6EF',
+		'pNo' => '\\u00B2\\u00B3\\u00B9\\u00BC-\\u00BE\\u09F4-\\u09F9\\u0B72-\\u0B77\\u0BF0-\\u0BF2\\u0C78-\\u0C7E\\u0D58-\\u0D5E\\u0D70-\\u0D78\\u0F2A-\\u0F33\\u1369-\\u137C\\u17F0-\\u17F9\\u19DA\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u215F\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA830-\\uA835',
+		'pP' => '\\!-#%-\\*,-/\\:;\\?@\\[-\\]_\\{\\}\\u00A1\\u00A7\\u00AB\\u00B6\\u00B7\\u00BB\\u00BF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E44\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65',
+		'pPc' => '_\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F',
+		'pPd' => '\\-\\u058A\\u05BE\\u1400\\u1806\\u2010-\\u2015\\u2E17\\u2E1A\\u2E3A\\u2E3B\\u2E40\\u301C\\u3030\\u30A0\\uFE31\\uFE32\\uFE58\\uFE63\\uFF0D',
+		'pPe' => '\\)\\]\\}\\u0F3B\\u0F3D\\u169C\\u2046\\u207E\\u208E\\u2309\\u230B\\u232A\\u2769\\u276B\\u276D\\u276F\\u2771\\u2773\\u2775\\u27C6\\u27E7\\u27E9\\u27EB\\u27ED\\u27EF\\u2984\\u2986\\u2988\\u298A\\u298C\\u298E\\u2990\\u2992\\u2994\\u2996\\u2998\\u29D9\\u29DB\\u29FD\\u2E23\\u2E25\\u2E27\\u2E29\\u3009\\u300B\\u300D\\u300F\\u3011\\u3015\\u3017\\u3019\\u301B\\u301E\\u301F\\uFD3E\\uFE18\\uFE36\\uFE38\\uFE3A\\uFE3C\\uFE3E\\uFE40\\uFE42\\uFE44\\uFE48\\uFE5A\\uFE5C\\uFE5E\\uFF09\\uFF3D\\uFF5D\\uFF60\\uFF63',
+		'pPf' => '\\u00BB\\u2019\\u201D\\u203A\\u2E03\\u2E05\\u2E0A\\u2E0D\\u2E1D\\u2E21',
+		'pPi' => '\\u00AB\\u2018\\u201B\\u201C\\u201F\\u2039\\u2E02\\u2E04\\u2E09\\u2E0C\\u2E1C\\u2E20',
+		'pPo' => '\\!-#%-\'\\*,\\./\\:;\\?@\\\\\\u00A1\\u00A7\\u00B6\\u00B7\\u00BF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u166D\\u166E\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u1805\\u1807-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2016\\u2017\\u2020-\\u2027\\u2030-\\u2038\\u203B-\\u203E\\u2041-\\u2043\\u2047-\\u2051\\u2053\\u2055-\\u205E\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00\\u2E01\\u2E06-\\u2E08\\u2E0B\\u2E0E-\\u2E16\\u2E18\\u2E19\\u2E1B\\u2E1E\\u2E1F\\u2E2A-\\u2E2E\\u2E30-\\u2E39\\u2E3C-\\u2E3F\\u2E41\\u2E43\\u2E44\\u3001-\\u3003\\u303D\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFE10-\\uFE16\\uFE19\\uFE30\\uFE45\\uFE46\\uFE49-\\uFE4C\\uFE50-\\uFE52\\uFE54-\\uFE57\\uFE5F-\\uFE61\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF07\\uFF0A\\uFF0C\\uFF0E\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3C\\uFF61\\uFF64\\uFF65',
+		'pPs' => '\\(\\[\\{\\u0F3A\\u0F3C\\u169B\\u201A\\u201E\\u2045\\u207D\\u208D\\u2308\\u230A\\u2329\\u2768\\u276A\\u276C\\u276E\\u2770\\u2772\\u2774\\u27C5\\u27E6\\u27E8\\u27EA\\u27EC\\u27EE\\u2983\\u2985\\u2987\\u2989\\u298B\\u298D\\u298F\\u2991\\u2993\\u2995\\u2997\\u29D8\\u29DA\\u29FC\\u2E22\\u2E24\\u2E26\\u2E28\\u2E42\\u3008\\u300A\\u300C\\u300E\\u3010\\u3014\\u3016\\u3018\\u301A\\u301D\\uFD3F\\uFE17\\uFE35\\uFE37\\uFE39\\uFE3B\\uFE3D\\uFE3F\\uFE41\\uFE43\\uFE47\\uFE59\\uFE5B\\uFE5D\\uFF08\\uFF3B\\uFF5B\\uFF5F\\uFF62',
+		'pS' => '\\$\\+\\<-\\>\\^`\\|~\\u00A2-\\u00A6\\u00A8\\u00A9\\u00AC\\u00AE-\\u00B1\\u00B4\\u00B8\\u00D7\\u00F7\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u03F6\\u0482\\u058D-\\u058F\\u0606-\\u0608\\u060B\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09F2\\u09F3\\u09FA\\u09FB\\u0AF1\\u0B70\\u0BF3-\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0E3F\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u17DB\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u20A0-\\u20BE\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116-\\u2118\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u2140-\\u2144\\u214A-\\u214D\\u214F\\u218A\\u218B\\u2190-\\u2307\\u230C-\\u2328\\u232B-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u2767\\u2794-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2CE5-\\u2CEA\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u309B\\u309C\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u32FE\\u3300-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uA828-\\uA82B\\uA836-\\uA839\\uAA77-\\uAA79\\uAB5B\\uFB29\\uFBB2-\\uFBC1\\uFDFC\\uFDFD\\uFE62\\uFE64-\\uFE66\\uFE69\\uFF04\\uFF0B\\uFF1C-\\uFF1E\\uFF3E\\uFF40\\uFF5C\\uFF5E\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFFC\\uFFFD',
+		'pSc' => '\\$\\u00A2-\\u00A5\\u058F\\u060B\\u09F2\\u09F3\\u09FB\\u0AF1\\u0BF9\\u0E3F\\u17DB\\u20A0-\\u20BE\\uA838\\uFDFC\\uFE69\\uFF04\\uFFE0\\uFFE1\\uFFE5\\uFFE6',
+		'pSk' => '\\^`\\u00A8\\u00AF\\u00B4\\u00B8\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u309B\\u309C\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uAB5B\\uFBB2-\\uFBC1\\uFF3E\\uFF40\\uFFE3',
+		'pSm' => '\\+\\<-\\>\\|~\\u00AC\\u00B1\\u00D7\\u00F7\\u03F6\\u0606-\\u0608\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u2118\\u2140-\\u2144\\u214B\\u2190-\\u2194\\u219A\\u219B\\u21A0\\u21A3\\u21A6\\u21AE\\u21CE\\u21CF\\u21D2\\u21D4\\u21F4-\\u22FF\\u2320\\u2321\\u237C\\u239B-\\u23B3\\u23DC-\\u23E1\\u25B7\\u25C1\\u25F8-\\u25FF\\u266F\\u27C0-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u27FF\\u2900-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2AFF\\u2B30-\\u2B44\\u2B47-\\u2B4C\\uFB29\\uFE62\\uFE64-\\uFE66\\uFF0B\\uFF1C-\\uFF1E\\uFF5C\\uFF5E\\uFFE2\\uFFE9-\\uFFEC',
+		'pSo' => '\\u00A6\\u00A9\\u00AE\\u00B0\\u0482\\u058D\\u058E\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09FA\\u0B70\\u0BF3-\\u0BF8\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116\\u2117\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u214A\\u214C\\u214D\\u214F\\u218A\\u218B\\u2195-\\u2199\\u219C-\\u219F\\u21A1\\u21A2\\u21A4\\u21A5\\u21A7-\\u21AD\\u21AF-\\u21CD\\u21D0\\u21D1\\u21D3\\u21D5-\\u21F3\\u2300-\\u2307\\u230C-\\u231F\\u2322-\\u2328\\u232B-\\u237B\\u237D-\\u239A\\u23B4-\\u23DB\\u23E2-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u25B6\\u25B8-\\u25C0\\u25C2-\\u25F7\\u2600-\\u266E\\u2670-\\u2767\\u2794-\\u27BF\\u2800-\\u28FF\\u2B00-\\u2B2F\\u2B45\\u2B46\\u2B4D-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2CE5-\\u2CEA\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u32FE\\u3300-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA828-\\uA82B\\uA836\\uA837\\uA839\\uAA77-\\uAA79\\uFDFD\\uFFE4\\uFFE8\\uFFED\\uFFEE\\uFFFC\\uFFFD',
+		'pZ' => ' \\u00A0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000',
+		'pZl' => '\\u2028',
+		'pZp' => '\\u2029',
+		'pZs' => ' \\u00A0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000'
+	);
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/StylesheetCompressor.php
@@ -0,0 +1,112 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\JavaScript;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+use s9e\TextFormatter\Configurator\JavaScript\Code;
+class StylesheetCompressor
+{
+	protected $deduplicateTargets = array(
+		'<xsl:template match="',
+		'</xsl:template>',
+		'<xsl:apply-templates/>',
+		'<param name="allowfullscreen" value="true"/>',
+		'<xsl:value-of select="',
+		'<xsl:copy-of select="@',
+		'<iframe allowfullscreen="" scrolling="no"',
+		'overflow:hidden;position:relative;padding-bottom:',
+		'display:inline-block;width:100%;max-width:',
+		' [-:\\w]++="',
+		'\\{[^}]++\\}',
+		'@[-\\w]{4,}+',
+		'(?<=<)[-:\\w]{4,}+',
+		'(?<==")[^"]{4,}+"'
+	);
+	protected $dictionary;
+	protected $keyPrefix = '$';
+	public $minSaving = 10;
+	protected $savings;
+	protected $xsl;
+	public function encode($xsl)
+	{
+		$this->xsl = $xsl;
+		$this->estimateSavings();
+		$this->filterSavings();
+		$this->buildDictionary();
+		$js = \json_encode($this->getCompressedStylesheet());
+		if (!empty($this->dictionary))
+			$js .= '.replace(' . $this->getReplacementRegexp() . ',function(k){return' . \json_encode($this->dictionary) . '[k]})';
+		return $js;
+	}
+	protected function buildDictionary()
+	{
+		$keys = $this->getAvailableKeys();
+		\rsort($keys);
+		$this->dictionary = array();
+		\arsort($this->savings);
+		foreach (\array_keys($this->savings) as $str)
+		{
+			$key = \array_pop($keys);
+			if (!$key)
+				break;
+			$this->dictionary[$key] = $str;
+		}
+	}
+	protected function estimateSavings()
+	{
+		$this->savings = array();
+		foreach ($this->getStringsFrequency() as $str => $cnt)
+		{
+			$len             = \strlen($str);
+			$originalCost    = $cnt * $len;
+			$replacementCost = $cnt * 2;
+			$overhead        = $len + 6;
+			$this->savings[$str] = $originalCost - ($replacementCost + $overhead);
+		}
+	}
+	protected function filterSavings()
+	{
+		$_this = $this;
+		$this->savings = \array_filter(
+			$this->savings,
+			function ($saving) use ($_this)
+			{
+				return ($saving >= $_this->minSaving);
+			}
+		);
+	}
+	protected function getAvailableKeys()
+	{
+		return \array_diff($this->getPossibleKeys(), $this->getUnavailableKeys());
+	}
+	protected function getCompressedStylesheet()
+	{
+		return \strtr($this->xsl, \array_flip($this->dictionary));
+	}
+	protected function getPossibleKeys()
+	{
+		$keys = array();
+		foreach (\range('a', 'z') as $char)
+			$keys[] = $this->keyPrefix . $char;
+		return $keys;
+	}
+	protected function getReplacementRegexp()
+	{
+		return '/' . RegexpBuilder::fromList(\array_keys($this->dictionary)) . '/g';
+	}
+	protected function getStringsFrequency()
+	{
+		$regexp = '(' . \implode('|', $this->deduplicateTargets) . ')S';
+		\preg_match_all($regexp, $this->xsl, $matches);
+		return \array_count_values($matches[0]);
+	}
+	protected function getUnavailableKeys()
+	{
+		\preg_match_all('(' . \preg_quote($this->keyPrefix) . '.)', $this->xsl, $matches);
+		return \array_unique($matches[0]);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/externs.application.js
@@ -0,0 +1,227 @@
+/*
+ * Copyright 2008 The Closure Compiler Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// This file was auto-generated.
+// See https://github.com/google/closure-compiler for the original source.
+// See https://github.com/s9e/TextFormatter/blob/master/scripts/generateExterns.php for details.
+
+/**
+ * @const
+ */
+var punycode = {};
+/**
+ * @param {string} domain
+ * @return {string}
+ */
+punycode.toASCII;
+/** @constructor */
+function XSLTProcessor() {}
+/**
+ * @type {string}
+ * @implicitCast
+ */
+Element.prototype.innerHTML;
+/**
+ * @constructor
+ */
+function DOMParser() {}
+/**
+ * @param {string} src The UTF16 string to be parsed.
+ * @param {string} type The content type of the string.
+ * @return {Document}
+ */
+DOMParser.prototype.parseFromString = function(src, type) {};
+/**
+ * @type {!Window}
+ */
+var window;
+/**
+ * @constructor
+ * @extends {Node}
+ */
+function Document() {}
+/**
+ * @return {!DocumentFragment}
+ * @nosideeffects
+ */
+Document.prototype.createDocumentFragment = function() {};
+/**
+ * @param {string} tagName
+ * @param {string=} opt_typeExtension
+ * @return {!Element}
+ * @nosideeffects
+ */
+Document.prototype.createElement = function(tagName, opt_typeExtension) {};
+/**
+ * @constructor
+ * @extends {Node}
+ */
+function DocumentFragment() {}
+/**
+ * @constructor
+ * @implements {IObject<(string|number), T>}
+ * @implements {IArrayLike<T>}
+ * @implements {Iterable<T>}
+ * @template T
+ */
+function NamedNodeMap() {}
+/**
+ * @param {number} index
+ * @return {Node}
+ * @nosideeffects
+ */
+NamedNodeMap.prototype.item = function(index) {};
+/**
+ * @type {number}
+ */
+NamedNodeMap.prototype.length;
+/**
+ * @constructor
+ */
+function Node() {}
+/**
+ * @param {Node} newChild
+ * @return {Node}
+ */
+Node.prototype.appendChild = function(newChild) {};
+/**
+ * @type {!NodeList<!Node>}
+ */
+Node.prototype.childNodes;
+/**
+ * @param {boolean} deep
+ * @return {!Node}
+ * @nosideeffects
+ */
+Node.prototype.cloneNode = function(deep) {};
+/**
+ * @type {Node}
+ */
+Node.prototype.firstChild;
+/**
+ * @param {Node} newChild
+ * @param {Node} refChild
+ * @return {!Node}
+ */
+Node.prototype.insertBefore = function(newChild, refChild) {};
+/**
+ * @type {string}
+ */
+Node.prototype.nodeName;
+/**
+ * @type {number}
+ */
+Node.prototype.nodeType;
+/**
+ * @type {string}
+ */
+Node.prototype.nodeValue;
+/**
+ * @type {Document}
+ */
+Node.prototype.ownerDocument;
+/**
+ * @type {Node}
+ */
+Node.prototype.parentNode;
+/**
+ * @param {Node} oldChild
+ * @return {!Node}
+ */
+Node.prototype.removeChild = function(oldChild) {};
+/**
+ * @constructor
+ * @implements {IArrayLike<T>}
+ * @implements {Iterable<T>}
+ * @template T
+ */
+function NodeList() {}
+/**
+ * @type {number}
+ */
+NodeList.prototype.length;
+/**
+ * @constructor
+ * @extends {Node}
+ */
+function Element() {}
+/**
+ * @constructor
+ */
+function Window() {}
+/**
+ * @param {Node} externalNode
+ * @param {boolean} deep
+ * @return {Node}
+ */
+Document.prototype.importNode = function(externalNode, deep) {};
+/**
+ * @constructor
+ * @extends {Document}
+ */
+function HTMLDocument() {}
+/**
+ * @constructor
+ * @extends {Element}
+ */
+function HTMLElement() {}
+/**
+ * @param {?string} namespaceURI
+ * @param {string} localName
+ * @return {string}
+ * @nosideeffects
+ */
+Element.prototype.getAttributeNS = function(namespaceURI, localName) {};
+/**
+ * @param {?string} namespaceURI
+ * @param {string} localName
+ * @return {boolean}
+ * @nosideeffects
+ */
+Element.prototype.hasAttributeNS = function(namespaceURI, localName) {};
+/**
+ * @param {?string} namespaceURI
+ * @param {string} localName
+ * @return {undefined}
+ */
+Element.prototype.removeAttributeNS = function(namespaceURI, localName) {};
+/**
+ * @param {?string} namespaceURI
+ * @param {string} qualifiedName
+ * @param {string|number|boolean} value Values are converted to strings with
+ * @return {undefined}
+ */
+Element.prototype.setAttributeNS = function(namespaceURI, qualifiedName, value) {};
+/**
+ * @param {Node} arg
+ * @return {boolean}
+ * @nosideeffects
+ */
+Node.prototype.isEqualNode = function(arg) {};
+/**
+ * @type {string}
+ */
+Node.prototype.namespaceURI;
+/**
+ * @type {string}
+ * @implicitCast
+ */
+Node.prototype.textContent;
+/**
+ * @type {!HTMLDocument}
+ * @const
+ */
+var document;
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/JavaScript/externs.service.js
@@ -0,0 +1,553 @@
+/*
+ * Copyright 2008 The Closure Compiler Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// This file was auto-generated.
+// See https://github.com/google/closure-compiler for the original source.
+// See https://github.com/s9e/TextFormatter/blob/master/scripts/generateExterns.php for details.
+
+/**
+ * @const
+ */
+var punycode = {};
+/**
+ * @param {string} domain
+ * @return {string}
+ */
+punycode.toASCII;
+/** @constructor */
+function XSLTProcessor() {}
+/**
+ * @type {number}
+ * @const
+ */
+var Infinity;
+/**
+ * @type {undefined}
+ * @const
+ */
+var undefined;
+/** @typedef {?} */
+var symbol;
+/**
+ * @param {string=} opt_description
+ * @return {symbol}
+ */
+function Symbol(opt_description) {}
+/**
+ * @param {string} uri
+ * @return {string}
+ * @nosideeffects
+ */
+function decodeURIComponent(uri) {}
+/**
+ * @param {string} uri
+ * @return {string}
+ * @nosideeffects
+ */
+function encodeURIComponent(uri) {}
+/**
+ * @param {string} str
+ * @return {string}
+ * @nosideeffects
+ */
+function escape(str) {}
+/**
+ * @param {*} num
+ * @return {boolean}
+ * @nosideeffects
+ */
+function isNaN(num) {}
+/**
+ * @param {*} num
+ * @param {number|undefined} base
+ * @return {number}
+ * @nosideeffects
+ */
+function parseInt(num, base) {}
+/**
+ * @constructor
+ * @implements {IArrayLike<T>}
+ * @implements {Iterable<T>}
+ * @param {...*} var_args
+ * @return {!Array<?>}
+ * @nosideeffects
+ * @template T
+ */
+function Array(var_args) {}
+/**
+ * @param {?function(this:S, T, number, !Array<T>): ?} callback
+ * @param {S=} opt_thisobj
+ * @this {IArrayLike<T>|string}
+ * @template T,S
+ * @return {undefined}
+ */
+Array.prototype.forEach = function(callback, opt_thisobj) {};
+/**
+ * @param {T} obj
+ * @param {number=} opt_fromIndex
+ * @return {number}
+ * @this {IArrayLike<T>|string}
+ * @nosideeffects
+ * @template T
+ */
+Array.prototype.indexOf = function(obj, opt_fromIndex) {};
+/**
+ * @param {*=} opt_separator Specifies a string to separate each element of the
+ * @return {string}
+ * @this {IArrayLike<?>|string}
+ * @nosideeffects
+ */
+Array.prototype.join = function(opt_separator) {};
+/**
+ * @type {number}
+ */
+Array.prototype.length;
+/**
+ * @return {T}
+ * @this {IArrayLike<T>}
+ * @modifies {this}
+ * @template T
+ */
+Array.prototype.pop = function() {};
+/**
+ * @param {...T} var_args
+ * @return {number} The new length of the array.
+ * @this {IArrayLike<T>}
+ * @template T
+ * @modifies {this}
+ */
+Array.prototype.push = function(var_args) {};
+/**
+ * @return {THIS} A reference to the original modified array.
+ * @this {THIS}
+ * @template THIS
+ * @modifies {this}
+ */
+Array.prototype.reverse = function() {};
+/**
+ * @this {IArrayLike<T>}
+ * @modifies {this}
+ * @return {T}
+ * @template T
+ */
+Array.prototype.shift = function() {};
+/**
+ * @param {*=} opt_begin Zero-based index at which to begin extraction.  A
+ * @param {*=} opt_end Zero-based index at which to end extraction.  slice
+ * @return {!Array<T>}
+ * @this {IArrayLike<T>|string}
+ * @template T
+ * @nosideeffects
+ */
+Array.prototype.slice = function(opt_begin, opt_end) {};
+/**
+ * @param {function(T,T):number=} opt_compareFunction Specifies a function that
+ * @this {IArrayLike<T>}
+ * @template T
+ * @modifies {this}
+ * @return {!Array<T>}
+ */
+Array.prototype.sort = function(opt_compareFunction) {};
+/**
+ * @param {*=} opt_index Index at which to start changing the array. If negative,  *     will begin that many elements from the end.  A non-number type will be
+ * @param {*=} opt_howMany An integer indicating the number of old array elements
+ * @param {...T} var_args
+ * @return {!Array<T>}
+ * @this {IArrayLike<T>}
+ * @modifies {this}
+ * @template T
+ */
+Array.prototype.splice = function(opt_index, opt_howMany, var_args) {};
+/**
+ * @param {...*} var_args
+ * @return {number} The new length of the array
+ * @this {IArrayLike<?>}
+ * @modifies {this}
+ */
+Array.prototype.unshift = function(var_args) {};
+/**
+ * @param {?=} opt_yr_num
+ * @param {?=} opt_mo_num
+ * @param {?=} opt_day_num
+ * @param {?=} opt_hr_num
+ * @param {?=} opt_min_num
+ * @param {?=} opt_sec_num
+ * @param {?=} opt_ms_num
+ * @constructor
+ * @return {string}
+ * @nosideeffects
+ */
+function Date(opt_yr_num, opt_mo_num, opt_day_num, opt_hr_num, opt_min_num,     opt_sec_num, opt_ms_num) {}
+/**
+ * @param {*} date
+ * @return {number}
+ * @nosideeffects
+ */
+Date.parse = function(date) {};
+/**
+ * @constructor
+ * @param {...*} var_args
+ * @throws {Error}
+ */
+function Function(var_args) {}
+/**
+ * @const
+ */
+var Math = {};
+/**
+ * @param {?} x
+ * @return {number}
+ * @nosideeffects
+ */
+Math.floor = function(x) {};
+/**
+ * @param {...?} var_args
+ * @return {number}
+ * @nosideeffects
+ */
+Math.max = function(var_args) {};
+/**
+ * @param {...?} var_args
+ * @return {number}
+ * @nosideeffects
+ */
+Math.min = function(var_args) {};
+/**
+ * @return {number}
+ * @nosideeffects
+ */
+Math.random = function() {};
+/**
+ * @constructor
+ * @param {*=} opt_value
+ * @return {number}
+ * @nosideeffects
+ */
+function Number(opt_value) {}
+/**
+ * @this {Number|number}
+ * @param {(number|Number)=} opt_radix An optional radix.
+ * @return {string}
+ * @nosideeffects
+ * @override
+ */
+Number.prototype.toString = function(opt_radix) {};
+/**
+ * @constructor
+ * @param {*=} opt_value
+ * @return {!Object}
+ * @nosideeffects
+ */
+function Object(opt_value) {}
+/**
+ * @this {*}
+ * @return {string}
+ * @nosideeffects
+ */
+Object.prototype.toString = function() {};
+/**
+ * @constructor
+ * @param {*=} opt_pattern
+ * @param {*=} opt_flags
+ * @return {!RegExp}
+ * @nosideeffects
+ */
+function RegExp(opt_pattern, opt_flags) {}
+/**
+ * @param {*} str The string to search.
+ * @return {Array<string>} This should really return an Array with a few
+ */
+RegExp.prototype.exec = function(str) {};
+/**
+ * @type {number}
+ */
+RegExp.prototype.lastIndex;
+/**
+ * @param {*} str The string to search.
+ * @return {boolean} Whether the string was matched.
+ */
+RegExp.prototype.test = function(str) {};
+/**
+ * @constructor
+ * @param {*=} opt_str
+ * @return {string}
+ * @nosideeffects
+ */
+function String(opt_str) {}
+/**
+ * @param {...number} var_args
+ * @return {string}
+ * @nosideeffects
+ */
+String.fromCharCode = function(var_args) {};
+/**
+ * @this {String|string}
+ * @param {number} index
+ * @return {string}
+ * @nosideeffects
+ */
+String.prototype.charAt = function(index) {};
+/**
+ * @this {String|string}
+ * @param {number=} opt_index
+ * @return {number}
+ * @nosideeffects
+ */
+String.prototype.charCodeAt = function(opt_index) {};
+/**
+ * @this {String|string}
+ * @param {string|null} searchValue
+ * @param {(number|null)=} opt_fromIndex
+ * @return {number}
+ * @nosideeffects
+ */
+String.prototype.indexOf = function(searchValue, opt_fromIndex) {};
+/**
+ * @type {number}
+ */
+String.prototype.length;
+/**
+ * @this {String|string}
+ * @param {RegExp|string} regex
+ * @param {string|Function} str
+ * @param {string=} opt_flags
+ * @return {string}
+ */
+String.prototype.replace = function(regex, str, opt_flags) {};
+/**
+ * @this {String|string}
+ * @param {*=} opt_separator
+ * @param {number=} opt_limit
+ * @return {!Array<string>}
+ * @nosideeffects
+ */
+String.prototype.split = function(opt_separator, opt_limit) {};
+/**
+ * @this {String|string}
+ * @param {number} start
+ * @param {number=} opt_length
+ * @return {string} The specified substring.
+ * @nosideeffects
+ */
+String.prototype.substr = function(start, opt_length) {};
+/**
+ * @this {String|string}
+ * @return {string}
+ * @nosideeffects
+ */
+String.prototype.toLowerCase = function() {};
+/**
+ * @this {String|string}
+ * @return {string}
+ * @nosideeffects
+ */
+String.prototype.toUpperCase = function() {};
+/**
+ * @type {string}
+ * @implicitCast
+ */
+Element.prototype.innerHTML;
+/**
+ * @constructor
+ */
+function DOMParser() {}
+/**
+ * @param {string} src The UTF16 string to be parsed.
+ * @param {string} type The content type of the string.
+ * @return {Document}
+ */
+DOMParser.prototype.parseFromString = function(src, type) {};
+/**
+ * @type {!Window}
+ */
+var window;
+/**
+ * @constructor
+ * @extends {Node}
+ */
+function Document() {}
+/**
+ * @return {!DocumentFragment}
+ * @nosideeffects
+ */
+Document.prototype.createDocumentFragment = function() {};
+/**
+ * @param {string} tagName
+ * @param {string=} opt_typeExtension
+ * @return {!Element}
+ * @nosideeffects
+ */
+Document.prototype.createElement = function(tagName, opt_typeExtension) {};
+/**
+ * @constructor
+ * @extends {Node}
+ */
+function DocumentFragment() {}
+/**
+ * @constructor
+ * @implements {IObject<(string|number), T>}
+ * @implements {IArrayLike<T>}
+ * @implements {Iterable<T>}
+ * @template T
+ */
+function NamedNodeMap() {}
+/**
+ * @param {number} index
+ * @return {Node}
+ * @nosideeffects
+ */
+NamedNodeMap.prototype.item = function(index) {};
+/**
+ * @type {number}
+ */
+NamedNodeMap.prototype.length;
+/**
+ * @constructor
+ */
+function Node() {}
+/**
+ * @param {Node} newChild
+ * @return {Node}
+ */
+Node.prototype.appendChild = function(newChild) {};
+/**
+ * @type {!NodeList<!Node>}
+ */
+Node.prototype.childNodes;
+/**
+ * @param {boolean} deep
+ * @return {!Node}
+ * @nosideeffects
+ */
+Node.prototype.cloneNode = function(deep) {};
+/**
+ * @type {Node}
+ */
+Node.prototype.firstChild;
+/**
+ * @param {Node} newChild
+ * @param {Node} refChild
+ * @return {!Node}
+ */
+Node.prototype.insertBefore = function(newChild, refChild) {};
+/**
+ * @type {string}
+ */
+Node.prototype.nodeName;
+/**
+ * @type {number}
+ */
+Node.prototype.nodeType;
+/**
+ * @type {string}
+ */
+Node.prototype.nodeValue;
+/**
+ * @type {Document}
+ */
+Node.prototype.ownerDocument;
+/**
+ * @type {Node}
+ */
+Node.prototype.parentNode;
+/**
+ * @param {Node} oldChild
+ * @return {!Node}
+ */
+Node.prototype.removeChild = function(oldChild) {};
+/**
+ * @constructor
+ * @implements {IArrayLike<T>}
+ * @implements {Iterable<T>}
+ * @template T
+ */
+function NodeList() {}
+/**
+ * @type {number}
+ */
+NodeList.prototype.length;
+/**
+ * @constructor
+ * @extends {Node}
+ */
+function Element() {}
+/**
+ * @constructor
+ */
+function Window() {}
+/**
+ * @param {Node} externalNode
+ * @param {boolean} deep
+ * @return {Node}
+ */
+Document.prototype.importNode = function(externalNode, deep) {};
+/**
+ * @constructor
+ * @extends {Document}
+ */
+function HTMLDocument() {}
+/**
+ * @constructor
+ * @extends {Element}
+ */
+function HTMLElement() {}
+/**
+ * @param {?string} namespaceURI
+ * @param {string} localName
+ * @return {string}
+ * @nosideeffects
+ */
+Element.prototype.getAttributeNS = function(namespaceURI, localName) {};
+/**
+ * @param {?string} namespaceURI
+ * @param {string} localName
+ * @return {boolean}
+ * @nosideeffects
+ */
+Element.prototype.hasAttributeNS = function(namespaceURI, localName) {};
+/**
+ * @param {?string} namespaceURI
+ * @param {string} localName
+ * @return {undefined}
+ */
+Element.prototype.removeAttributeNS = function(namespaceURI, localName) {};
+/**
+ * @param {?string} namespaceURI
+ * @param {string} qualifiedName
+ * @param {string|number|boolean} value Values are converted to strings with
+ * @return {undefined}
+ */
+Element.prototype.setAttributeNS = function(namespaceURI, qualifiedName, value) {};
+/**
+ * @param {Node} arg
+ * @return {boolean}
+ * @nosideeffects
+ */
+Node.prototype.isEqualNode = function(arg) {};
+/**
+ * @type {string}
+ */
+Node.prototype.namespaceURI;
+/**
+ * @type {string}
+ * @implicitCast
+ */
+Node.prototype.textContent;
+/**
+ * @type {!HTMLDocument}
+ * @const
+ */
+var document;
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/RendererGenerators/Unformatted.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RendererGenerators;
+use s9e\TextFormatter\Configurator\RendererGenerator;
+use s9e\TextFormatter\Configurator\Rendering;
+use s9e\TextFormatter\Renderers\Unformatted as UnformattedRenderer;
+class Unformatted implements RendererGenerator
+{
+	public function getRenderer(Rendering $rendering)
+	{
+		return new UnformattedRenderer;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/RendererGenerators/XSLT.php
@@ -0,0 +1,67 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RendererGenerators;
+use s9e\TextFormatter\Configurator\Helpers\TemplateHelper;
+use s9e\TextFormatter\Configurator\RendererGenerator;
+use s9e\TextFormatter\Configurator\RendererGenerators\XSLT\Optimizer;
+use s9e\TextFormatter\Configurator\Rendering;
+use s9e\TextFormatter\Renderers\XSLT as XSLTRenderer;
+class XSLT implements RendererGenerator
+{
+	public $optimizer;
+	public function __construct()
+	{
+		$this->optimizer = new Optimizer;
+	}
+	public function getRenderer(Rendering $rendering)
+	{
+		return new XSLTRenderer($this->getXSL($rendering));
+	}
+	public function getXSL(Rendering $rendering)
+	{
+		$groupedTemplates = array();
+		$prefixes         = array();
+		$templates        = $rendering->getTemplates();
+		TemplateHelper::replaceHomogeneousTemplates($templates, 3);
+		foreach ($templates as $tagName => $template)
+		{
+			$template = $this->optimizer->optimizeTemplate($template);
+			$groupedTemplates[$template][] = $tagName;
+			$pos = \strpos($tagName, ':');
+			if ($pos !== \false)
+				$prefixes[\substr($tagName, 0, $pos)] = 1;
+		}
+		$xsl = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"';
+		$prefixes = \array_keys($prefixes);
+		\sort($prefixes);
+		foreach ($prefixes as $prefix)
+			$xsl .= ' xmlns:' . $prefix . '="urn:s9e:TextFormatter:' . $prefix . '"';
+		if (!empty($prefixes))
+			$xsl .= ' exclude-result-prefixes="' . \implode(' ', $prefixes) . '"';
+		$xsl .= '><xsl:output method="html" encoding="utf-8" indent="no"';
+		$xsl .= '/>';
+		foreach ($rendering->getAllParameters() as $paramName => $paramValue)
+		{
+			$xsl .= '<xsl:param name="' . \htmlspecialchars($paramName) . '"';
+			if ($paramValue === '')
+				$xsl .= '/>';
+			else
+				$xsl .= '>' . \htmlspecialchars($paramValue) . '</xsl:param>';
+		}
+		foreach ($groupedTemplates as $template => $tagNames)
+		{
+			$xsl .= '<xsl:template match="' . \implode('|', $tagNames) . '"';
+			if ($template === '')
+				$xsl .= '/>';
+			else
+				$xsl .= '>' . $template . '</xsl:template>';
+		}
+		$xsl .= '</xsl:stylesheet>';
+		return $xsl;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/RendererGenerators/XSLT/Optimizer.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RendererGenerators\XSLT;
+use s9e\TextFormatter\Configurator\TemplateNormalizer;
+class Optimizer
+{
+	public $normalizer;
+	public function __construct()
+	{
+		$this->normalizer = new TemplateNormalizer;
+		$this->normalizer->clear();
+		$this->normalizer->append('MergeConsecutiveCopyOf');
+		$this->normalizer->append('MergeIdenticalConditionalBranches');
+		$this->normalizer->append('OptimizeNestedConditionals');
+	}
+	public function optimizeTemplate($template)
+	{
+		return $this->normalizer->normalizeTemplate($template);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/RulesGenerators/BlockElementsCloseFormattingElements.php
@@ -0,0 +1,17 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RulesGenerators;
+use s9e\TextFormatter\Configurator\Helpers\TemplateForensics;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\TargetedRulesGenerator;
+class BlockElementsCloseFormattingElements implements TargetedRulesGenerator
+{
+	public function generateTargetedRules(TemplateForensics $src, TemplateForensics $trg)
+	{
+		return ($src->isBlock() && $trg->isFormattingElement()) ? array('closeParent') : array();
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/RulesGenerators/ManageParagraphs.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\RulesGenerators;
+use s9e\TextFormatter\Configurator\Helpers\TemplateForensics;
+use s9e\TextFormatter\Configurator\RulesGenerators\Interfaces\BooleanRulesGenerator;
+class ManageParagraphs implements BooleanRulesGenerator
+{
+	protected $p;
+	public function __construct()
+	{
+		$this->p = new TemplateForensics('<p><xsl:apply-templates/></p>');
+	}
+	public function generateBooleanRules(TemplateForensics $src)
+	{
+		$rules = array();
+		if ($src->allowsChild($this->p) && $src->isBlock() && !$this->p->closesParent($src))
+			$rules['createParagraphs'] = \true;
+		if ($src->closesParent($this->p))
+			$rules['breakParagraph'] = \true;
+		return $rules;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/TemplateChecks/DisallowElement.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Exceptions\UnsafeTemplateException;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\TemplateCheck;
+class DisallowElement extends TemplateCheck
+{
+	public $elName;
+	public function __construct($elName)
+	{
+		$this->elName = \strtolower($elName);
+	}
+	public function check(DOMElement $template, Tag $tag)
+	{
+		$xpath = new DOMXPath($template->ownerDocument);
+		$query
+			= '//*[translate(local-name(), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz") = "' . $this->elName . '"]|//xsl:element[translate(@name,"ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz") = "' . $this->elName . '"]';
+		$node = $xpath->query($query)->item(0);
+		if ($node)
+			throw new UnsafeTemplateException("Element '" . $this->elName . "' is disallowed", $node);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/TemplateChecks/DisallowFlashFullScreen.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+class DisallowFlashFullScreen extends AbstractFlashRestriction
+{
+	public $defaultSetting = 'false';
+	protected $settingName = 'allowFullScreen';
+	protected $settings = array(
+		'true'  => 1,
+		'false' => 0
+	);
+	public function __construct($onlyIfDynamic = \false)
+	{
+		parent::__construct('false', $onlyIfDynamic);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/TemplateChecks/DisallowNodeByXPath.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Exceptions\UnsafeTemplateException;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\TemplateCheck;
+class DisallowNodeByXPath extends TemplateCheck
+{
+	public $query;
+	public function __construct($query)
+	{
+		$this->query = $query;
+	}
+	public function check(DOMElement $template, Tag $tag)
+	{
+		$xpath = new DOMXPath($template->ownerDocument);
+		foreach ($xpath->query($this->query) as $node)
+			throw new UnsafeTemplateException("Node '" . $node->nodeName . "' is disallowed because it matches '" . $this->query . "'", $node);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/TemplateChecks/RestrictFlashNetworking.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateChecks;
+class RestrictFlashNetworking extends AbstractFlashRestriction
+{
+	public $defaultSetting = 'all';
+	protected $settingName = 'allowNetworking';
+	protected $settings = array(
+		'all'      => 3,
+		'internal' => 2,
+		'none'     => 1
+	);
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/TemplateNormalizations/ConvertCurlyExpressionsInText.php
@@ -0,0 +1,52 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class ConvertCurlyExpressionsInText extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$dom   = $template->ownerDocument;
+		$xpath = new DOMXPath($dom);
+		$query = '//text()[contains(., "{@") or contains(., "{$")]';
+		foreach ($xpath->query($query) as $node)
+		{
+			$parentNode = $node->parentNode;
+			if ($parentNode->namespaceURI === self::XMLNS_XSL)
+				continue;
+			\preg_match_all(
+				'#\\{([$@][-\\w]+)\\}#',
+				$node->textContent,
+				$matches,
+				\PREG_SET_ORDER | \PREG_OFFSET_CAPTURE
+			);
+			$lastPos = 0;
+			foreach ($matches as $m)
+			{
+				$pos = $m[0][1];
+				if ($pos > $lastPos)
+					$parentNode->insertBefore(
+						$dom->createTextNode(
+							\substr($node->textContent, $lastPos, $pos - $lastPos)
+						),
+						$node
+					);
+				$lastPos = $pos + \strlen($m[0][0]);
+				$parentNode
+					->insertBefore($dom->createElementNS(self::XMLNS_XSL, 'xsl:value-of'), $node)
+					->setAttribute('select', $m[1][0]);
+			}
+			$text = \substr($node->textContent, $lastPos);
+			if ($text > '')
+				$parentNode->insertBefore($dom->createTextNode($text), $node);
+			$parentNode->removeChild($node);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/TemplateNormalizations/Custom.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class Custom extends TemplateNormalization
+{
+	protected $callback;
+	public function __construct($callback)
+	{
+		if (!\is_callable($callback))
+			\trigger_error("Argument 1 passed to " . __METHOD__ . "() must be callable, " . \gettype($callback) . " given", \E_USER_ERROR);
+		$this->callback = $callback;
+	}
+	public function normalize(DOMElement $template)
+	{
+		\call_user_func($this->callback, $template);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/TemplateNormalizations/MergeConsecutiveCopyOf.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class MergeConsecutiveCopyOf extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$xpath = new DOMXPath($template->ownerDocument);
+		foreach ($xpath->query('//xsl:copy-of') as $node)
+			$this->mergeCopyOfSiblings($node);
+	}
+	protected function mergeCopyOfSiblings(DOMElement $node)
+	{
+		while ($this->nextSiblingIsCopyOf($node))
+		{
+			$node->setAttribute('select', $node->getAttribute('select') . '|' . $node->nextSibling->getAttribute('select'));
+			$node->parentNode->removeChild($node->nextSibling);
+		}
+	}
+	protected function nextSiblingIsCopyOf(DOMElement $node)
+	{
+		return ($node->nextSibling && $node->nextSibling->localName === 'copy-of' && $node->nextSibling->namespaceURI === self::XMLNS_XSL);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/TemplateNormalizations/MergeIdenticalConditionalBranches.php
@@ -0,0 +1,96 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMNode;
+use s9e\TextFormatter\Configurator\Helpers\TemplateParser;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class MergeIdenticalConditionalBranches extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		foreach ($template->getElementsByTagNameNS(self::XMLNS_XSL, 'choose') as $choose)
+		{
+			self::mergeCompatibleBranches($choose);
+			self::mergeConsecutiveBranches($choose);
+		}
+	}
+	protected static function mergeCompatibleBranches(DOMElement $choose)
+	{
+		$node = $choose->firstChild;
+		while ($node)
+		{
+			$nodes = self::collectCompatibleBranches($node);
+			if (\count($nodes) > 1)
+			{
+				$node = \end($nodes)->nextSibling;
+				self::mergeBranches($nodes);
+			}
+			else
+				$node = $node->nextSibling;
+		}
+	}
+	protected static function mergeConsecutiveBranches(DOMElement $choose)
+	{
+		$nodes = array();
+		foreach ($choose->childNodes as $node)
+			if (self::isXslWhen($node))
+				$nodes[] = $node;
+		$i = \count($nodes);
+		while (--$i > 0)
+			self::mergeBranches(array($nodes[$i - 1], $nodes[$i]));
+	}
+	protected static function collectCompatibleBranches(DOMNode $node)
+	{
+		$nodes  = array();
+		$key    = \null;
+		$values = array();
+		while ($node && self::isXslWhen($node))
+		{
+			$branch = TemplateParser::parseEqualityExpr($node->getAttribute('test'));
+			if ($branch === \false || \count($branch) !== 1)
+				break;
+			if (isset($key) && \key($branch) !== $key)
+				break;
+			if (\array_intersect($values, \end($branch)))
+				break;
+			$key    = \key($branch);
+			$values = \array_merge($values, \end($branch));
+			$nodes[] = $node;
+			$node    = $node->nextSibling;
+		}
+		return $nodes;
+	}
+	protected static function mergeBranches(array $nodes)
+	{
+		$sortedNodes = array();
+		foreach ($nodes as $node)
+		{
+			$outerXML = $node->ownerDocument->saveXML($node);
+			$innerXML = \preg_replace('([^>]+>(.*)<[^<]+)s', '$1', $outerXML);
+			$sortedNodes[$innerXML][] = $node;
+		}
+		foreach ($sortedNodes as $identicalNodes)
+		{
+			if (\count($identicalNodes) < 2)
+				continue;
+			$expr = array();
+			foreach ($identicalNodes as $i => $node)
+			{
+				$expr[] = $node->getAttribute('test');
+				if ($i > 0)
+					$node->parentNode->removeChild($node);
+			}
+			$identicalNodes[0]->setAttribute('test', \implode(' or ', $expr));
+		}
+	}
+	protected static function isXslWhen(DOMNode $node)
+	{
+		return ($node->namespaceURI === self::XMLNS_XSL && $node->localName === 'when');
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/TemplateNormalizations/OptimizeNestedConditionals.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class OptimizeNestedConditionals extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$xpath = new DOMXPath($template->ownerDocument);
+		$query = '//xsl:choose/xsl:otherwise[count(node()) = 1]/xsl:choose';
+		foreach ($xpath->query($query) as $innerChoose)
+		{
+			$otherwise   = $innerChoose->parentNode;
+			$outerChoose = $otherwise->parentNode;
+			while ($innerChoose->firstChild)
+				$outerChoose->appendChild($innerChoose->removeChild($innerChoose->firstChild));
+			$outerChoose->removeChild($otherwise);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/TemplateNormalizations/SortAttributesByName.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class SortAttributesByName extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		foreach ($template->getElementsByTagName('*') as $element)
+		{
+			if (!$element->attributes->length)
+				continue;
+			$attributes = array();
+			foreach ($element->attributes as $name => $attribute)
+				$attributes[$name] = $element->removeAttributeNode($attribute);
+			\ksort($attributes);
+			foreach ($attributes as $attribute)
+				$element->setAttributeNode($attribute);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/TemplateNormalizations/TransposeComments.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
+use DOMElement;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\TemplateNormalization;
+class TransposeComments extends TemplateNormalization
+{
+	public function normalize(DOMElement $template)
+	{
+		$dom   = $template->ownerDocument;
+		$xpath = new DOMXPath($dom);
+		foreach ($xpath->query('//comment()') as $comment)
+			$comment->parentNode->replaceChild(
+				$dom->createElementNS(
+					self::XMLNS_XSL,
+					'xsl:comment',
+					\htmlspecialchars($comment->nodeValue)
+				),
+				$comment
+			);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Configurator/Validators/TemplateParameterName.php
@@ -0,0 +1,23 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Configurator\Validators;
+use InvalidArgumentException;
+abstract class TemplateParameterName
+{
+	public static function isValid($name)
+	{
+		return (bool) \preg_match('#^[a-z_][-a-z_0-9]*$#Di', $name);
+	}
+	public static function normalize($name)
+	{
+		$name = (string) $name;
+		if (!static::isValid($name))
+			throw new InvalidArgumentException("Invalid parameter name '" . $name . "'");
+		return $name;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Parser.js
@@ -0,0 +1,2178 @@
+/**#@+
+* Boolean rules bitfield
+*/
+/** @const */ var RULE_AUTO_CLOSE        = 1 << 0;
+/** @const */ var RULE_AUTO_REOPEN       = 1 << 1;
+/** @const */ var RULE_BREAK_PARAGRAPH   = 1 << 2;
+/** @const */ var RULE_CREATE_PARAGRAPHS = 1 << 3;
+/** @const */ var RULE_DISABLE_AUTO_BR   = 1 << 4;
+/** @const */ var RULE_ENABLE_AUTO_BR    = 1 << 5;
+/** @const */ var RULE_IGNORE_TAGS       = 1 << 6;
+/** @const */ var RULE_IGNORE_TEXT       = 1 << 7;
+/** @const */ var RULE_IGNORE_WHITESPACE = 1 << 8;
+/** @const */ var RULE_IS_TRANSPARENT    = 1 << 9;
+/** @const */ var RULE_PREVENT_BR        = 1 << 10;
+/** @const */ var RULE_SUSPEND_AUTO_BR   = 1 << 11;
+/** @const */ var RULE_TRIM_FIRST_LINE   = 1 << 12;
+/**#@-*/
+
+/**
+* @const Bitwise disjunction of rules related to automatic line breaks
+*/
+var RULES_AUTO_LINEBREAKS = RULE_DISABLE_AUTO_BR | RULE_ENABLE_AUTO_BR | RULE_SUSPEND_AUTO_BR;
+
+/**
+* @const Bitwise disjunction of rules that are inherited by subcontexts
+*/
+var RULES_INHERITANCE = RULE_ENABLE_AUTO_BR;
+
+/**
+* @const All the characters that are considered whitespace
+*/
+var WHITESPACE = " \n\t";
+
+/**
+* @type {!Object.<string,!number>} Number of open tags for each tag name
+*/
+var cntOpen;
+
+/**
+* @type {!Object.<string,!number>} Number of times each tag has been used
+*/
+var cntTotal;
+
+/**
+* @type {!Object} Current context
+*/
+var context;
+
+/**
+* @type {!number} How hard the parser has worked on fixing bad markup so far
+*/
+var currentFixingCost;
+
+/**
+* @type {Tag} Current tag being processed
+*/
+var currentTag;
+
+/**
+* @type {!boolean} Whether the output contains "rich" tags, IOW any tag that is not <p> or <br/>
+*/
+var isRich;
+
+/**
+* @type {!Logger} This parser's logger
+*/
+var logger = new Logger;
+
+/**
+* @type {!number} How hard the parser should work on fixing bad markup
+*/
+var maxFixingCost = 1000;
+
+/**
+* @type {!Object} Associative array of namespace prefixes in use in document (prefixes used as key)
+*/
+var namespaces;
+
+/**
+* @type {!Array.<!Tag>} Stack of open tags (instances of Tag)
+*/
+var openTags;
+
+/**
+* @type {!string} This parser's output
+*/
+var output;
+
+/**
+* @type {!Object.<!Object>}
+*/
+var plugins;
+
+/**
+* @type {!number} Position of the cursor in the original text
+*/
+var pos;
+
+/**
+* @type {!Object} Variables registered for use in filters
+*/
+var registeredVars;
+
+/**
+* @type {!Object} Root context, used at the root of the document
+*/
+var rootContext;
+
+/**
+* @type {!Object} Tags' config
+* @const
+*/
+var tagsConfig;
+
+/**
+* @type {!Array.<!Tag>} Tag storage
+*/
+var tagStack;
+
+/**
+* @type {!boolean} Whether the tags in the stack are sorted
+*/
+var tagStackIsSorted;
+
+/**
+* @type {!string} Text being parsed
+*/
+var text;
+
+/**
+* @type {!number} Length of the text being parsed
+*/
+var textLen;
+
+/**
+* @type {!number} Counter incremented everytime the parser is reset. Used to as a canary to detect
+*                 whether the parser was reset during execution
+*/
+var uid = 0;
+
+/**
+* @type {!number} Position before which we output text verbatim, without paragraphs or linebreaks
+*/
+var wsPos;
+
+//==========================================================================
+// Public API
+//==========================================================================
+
+/**
+* Disable a tag
+*
+* @param {!string} tagName Name of the tag
+*/
+function disableTag(tagName)
+{
+	if (tagsConfig[tagName])
+	{
+		copyTagConfig(tagName).isDisabled = true;
+	}
+}
+
+/**
+* Enable a tag
+*
+* @param {!string} tagName Name of the tag
+*/
+function enableTag(tagName)
+{
+	if (tagsConfig[tagName])
+	{
+		copyTagConfig(tagName).isDisabled = false;
+	}
+}
+
+/**
+* Get this parser's Logger instance
+*
+* @return {!Logger}
+*/
+function getLogger()
+{
+	return logger;
+}
+
+/**
+* Parse a text
+*
+* @param  {!string} _text Text to parse
+* @return {!string}       XML representation
+*/
+function parse(_text)
+{
+	// Reset the parser and save the uid
+	reset(_text);
+	var _uid = uid;
+
+	// Do the heavy lifting
+	executePluginParsers();
+	processTags();
+
+	// Finalize the document
+	finalizeOutput();
+
+	// Check the uid in case a plugin or a filter reset the parser mid-execution
+	if (uid !== _uid)
+	{
+		throw 'The parser has been reset during execution';
+	}
+
+	// Log a warning if the fixing cost limit was exceeded
+	if (currentFixingCost > maxFixingCost)
+	{
+		logger.warn('Fixing cost limit exceeded');
+	}
+
+	return output;
+}
+
+/**
+* Reset the parser for a new parsing
+*
+* @param {!string} _text Text to be parsed
+*/
+function reset(_text)
+{
+	// Normalize CR/CRLF to LF, remove control characters that aren't allowed in XML
+	_text = _text.replace(/\r\n?/g, "\n");
+	_text = _text.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F]+/g, '');
+
+	// Clear the logs
+	logger.clear();
+
+	// Initialize the rest
+	cntOpen           = {};
+	cntTotal          = {};
+	currentFixingCost = 0;
+	currentTag        = null;
+	isRich            = false;
+	namespaces        = {};
+	openTags          = [];
+	output            = '';
+	pos               = 0;
+	tagStack          = [];
+	tagStackIsSorted  = false;
+	text              = _text;
+	textLen           = text.length;
+	wsPos             = 0;
+
+	// Initialize the root context
+	context = rootContext;
+	context.inParagraph = false;
+
+	// Bump the UID
+	++uid;
+}
+
+/**
+* Change a tag's tagLimit
+*
+* NOTE: the default tagLimit should generally be set during configuration instead
+*
+* @param {!string} tagName  The tag's name, in UPPERCASE
+* @param {!number} tagLimit
+*/
+function setTagLimit(tagName, tagLimit)
+{
+	if (tagsConfig[tagName])
+	{
+		copyTagConfig(tagName).tagLimit = tagLimit;
+	}
+}
+
+/**
+* Change a tag's nestingLimit
+*
+* NOTE: the default nestingLimit should generally be set during configuration instead
+*
+* @param {!string} tagName      The tag's name, in UPPERCASE
+* @param {!number} nestingLimit
+*/
+function setNestingLimit(tagName, nestingLimit)
+{
+	if (tagsConfig[tagName])
+	{
+		copyTagConfig(tagName).nestingLimit = nestingLimit;
+	}
+}
+
+/**
+* Copy a tag's config
+*
+* This method ensures that the tag's config is its own object and not shared with another
+* identical tag
+*
+* @param  {!string} tagName Tag's name
+* @return {!Object}         Tag's config
+*/
+function copyTagConfig(tagName)
+{
+	var tagConfig = {}, k;
+	for (k in tagsConfig[tagName])
+	{
+		tagConfig[k] = tagsConfig[tagName][k];
+	}
+
+	return tagsConfig[tagName] = tagConfig;
+}
+
+//==========================================================================
+// Filter processing
+//==========================================================================
+
+/**
+* Execute all the attribute preprocessors of given tag
+*
+* @private
+*
+* @param  {!Tag}     tag       Source tag
+* @param  {!Object}  tagConfig Tag's config
+* @return {!boolean}           Unconditionally TRUE
+*/
+function executeAttributePreprocessors(tag, tagConfig)
+{
+	if (tagConfig.attributePreprocessors)
+	{
+		tagConfig.attributePreprocessors.forEach(function(attributePreprocessor)
+		{
+			var attrName = attributePreprocessor[0],
+				regexp   = attributePreprocessor[1],
+				map      = attributePreprocessor[2];
+
+			if (!tag.hasAttribute(attrName))
+			{
+				return;
+			}
+
+			executeAttributePreprocessor(tag, attrName, regexp, map);
+		});
+	}
+
+	return true;
+}
+
+/**
+* Execute an attribute preprocessor
+*
+* @param  {!Tag}            tag
+* @param  {!string}         attrName
+* @param  {!string}         regexp
+* @param  {!Array<!string>} map
+*/
+function executeAttributePreprocessor(tag, attrName, regexp, map)
+{
+	var attrValue = tag.getAttribute(attrName),
+		captures  = getNamedCaptures(attrValue, regexp, map),
+		k;
+	
+	for (k in captures)
+	{
+		// Attribute preprocessors cannot overwrite other attributes but they can
+		// overwrite themselves
+		if (k === attrName || !tag.hasAttribute(k))
+		{
+			tag.setAttribute(k, captures[k]);
+		}
+	}
+}
+
+/**
+* Execute a regexp and return the values of the mapped captures
+*
+* @param  {!string}                  attrValue
+* @param  {!string}                  regexp
+* @param  {!Array<!string>}          map
+* @return {!Object<!string,!string>}
+*/
+function getNamedCaptures(attrValue, regexp, map)
+{
+	var m = regexp.exec(attrValue);
+	if (!m)
+	{
+		return [];
+	}
+
+	var values = {};
+	map.forEach(function(k, i)
+	{
+		if (typeof m[i] === 'string' && m[i] !== '')
+		{
+			values[k] = m[i];
+		}
+	});
+
+	return values;
+}
+
+/**
+* Filter the attributes of given tag
+*
+* @private
+*
+* @param  {!Tag}     tag            Tag being checked
+* @param  {!Object}  tagConfig      Tag's config
+* @param  {!Object}  registeredVars Vars registered for use in attribute filters
+* @param  {!Logger}  logger         This parser's Logger instance
+* @return {!boolean}           Whether the whole attribute set is valid
+*/
+function filterAttributes(tag, tagConfig, registeredVars, logger)
+{
+	if (!tagConfig.attributes)
+	{
+		tag.setAttributes({});
+
+		return true;
+	}
+
+	var attrName, attrConfig;
+
+	// Generate values for attributes with a generator set
+	if (HINT.attributeGenerator)
+	{
+		for (attrName in tagConfig.attributes)
+		{
+			attrConfig = tagConfig.attributes[attrName];
+
+			if (attrConfig.generator)
+			{
+				tag.setAttribute(attrName, attrConfig.generator(attrName));
+			}
+		}
+	}
+
+	// Filter and remove invalid attributes
+	var attributes = tag.getAttributes();
+	for (attrName in attributes)
+	{
+		var attrValue = attributes[attrName];
+
+		// Test whether this attribute exists and remove it if it doesn't
+		if (!tagConfig.attributes[attrName])
+		{
+			tag.removeAttribute(attrName);
+			continue;
+		}
+
+		attrConfig = tagConfig.attributes[attrName];
+
+		// Test whether this attribute has a filterChain
+		if (!attrConfig.filterChain)
+		{
+			continue;
+		}
+
+		// Record the name of the attribute being filtered into the logger
+		logger.setAttribute(attrName);
+
+		for (var i = 0; i < attrConfig.filterChain.length; ++i)
+		{
+			// NOTE: attrValue is intentionally set as the first argument to facilitate inlining
+			attrValue = attrConfig.filterChain[i](attrValue, attrName);
+
+			if (attrValue === false)
+			{
+				tag.removeAttribute(attrName);
+				break;
+			}
+		}
+
+		// Update the attribute value if it's valid
+		if (attrValue !== false)
+		{
+			tag.setAttribute(attrName, attrValue);
+		}
+
+		// Remove the attribute's name from the logger
+		logger.unsetAttribute();
+	}
+
+	// Iterate over the attribute definitions to handle missing attributes
+	for (attrName in tagConfig.attributes)
+	{
+		attrConfig = tagConfig.attributes[attrName];
+
+		// Test whether this attribute is missing
+		if (!tag.hasAttribute(attrName))
+		{
+			if (HINT.attributeDefaultValue && attrConfig.defaultValue !== undefined)
+			{
+				// Use the attribute's default value
+				tag.setAttribute(attrName, attrConfig.defaultValue);
+			}
+			else if (attrConfig.required)
+			{
+				// This attribute is missing, has no default value and is required, which means
+				// the attribute set is invalid
+				return false;
+			}
+		}
+	}
+
+	return true;
+}
+
+/**
+* Execute given tag's filterChain
+*
+* @param  {!Tag}     tag Tag to filter
+* @return {!boolean}     Whether the tag is valid
+*/
+function filterTag(tag)
+{
+	var tagName   = tag.getName(),
+		tagConfig = tagsConfig[tagName],
+		isValid   = true;
+
+	if (tagConfig.filterChain)
+	{
+		// Record the tag being processed into the logger it can be added to the context of
+		// messages logged during the execution
+		logger.setTag(tag);
+
+		for (var i = 0; i < tagConfig.filterChain.length; ++i)
+		{
+			if (!tagConfig.filterChain[i](tag, tagConfig))
+			{
+				isValid = false;
+				break;
+			}
+		}
+
+		// Remove the tag from the logger
+		logger.unsetTag();
+	}
+
+	return isValid;
+}
+
+//==========================================================================
+// Output handling
+//==========================================================================
+
+/**
+* Replace Unicode characters outside the BMP with XML entities in the output
+*/
+function encodeUnicodeSupplementaryCharacters()
+{
+	output = output.replace(
+		/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
+		encodeUnicodeSupplementaryCharactersCallback
+	);
+}
+
+/**
+* Encode given surrogate pair into an XML entity
+*
+* @param  {!string} pair Surrogate pair
+* @return {!string}      XML entity
+*/
+function encodeUnicodeSupplementaryCharactersCallback(pair)
+{
+	var cp = (pair.charCodeAt(0) << 10) + pair.charCodeAt(1) - 56613888;
+
+	return '&#' + cp + ';';
+}
+
+/**
+* Finalize the output by appending the rest of the unprocessed text and create the root node
+*/
+function finalizeOutput()
+{
+	var tmp;
+
+	// Output the rest of the text and close the last paragraph
+	outputText(textLen, 0, true);
+
+	// Remove empty tag pairs, e.g. <I><U></U></I> as well as empty paragraphs
+	do
+	{
+		tmp = output;
+		output = output.replace(/<([^ />]+)><\/\1>/g, '');
+	}
+	while (output !== tmp);
+
+	// Merge consecutive <i> tags
+	output = output.replace(/<\/i><i>/g, '', output);
+
+	// Encode Unicode characters that are outside of the BMP
+	encodeUnicodeSupplementaryCharacters();
+
+	// Use a <r> root if the text is rich, or <t> for plain text (including <p></p> and <br/>)
+	var tagName = (isRich) ? 'r' : 't';
+
+	// Prepare the root node with all the namespace declarations
+	tmp = '<' + tagName;
+	if (HINT.namespaces)
+	{
+		for (var prefix in namespaces)
+		{
+			tmp += ' xmlns:' + prefix + '="urn:s9e:TextFormatter:' + prefix + '"';
+		}
+	}
+
+	output = tmp + '>' + output + '</' + tagName + '>';
+}
+
+/**
+* Append a tag to the output
+*
+* @param {!Tag} tag Tag to append
+*/
+function outputTag(tag)
+{
+	isRich = true;
+
+	var tagName    = tag.getName(),
+		tagPos     = tag.getPos(),
+		tagLen     = tag.getLen(),
+		tagFlags   = tag.getFlags(),
+		skipBefore = 0,
+		skipAfter  = 0;
+
+	if (HINT.RULE_IGNORE_WHITESPACE && (tagFlags & RULE_IGNORE_WHITESPACE))
+	{
+		skipBefore = 1;
+		skipAfter  = (tag.isEndTag()) ? 2 : 1;
+	}
+
+	// Current paragraph must end before the tag if:
+	//  - the tag is a start (or self-closing) tag and it breaks paragraphs, or
+	//  - the tag is an end tag (but not self-closing)
+	var closeParagraph = false;
+	if (tag.isStartTag())
+	{
+		if (HINT.RULE_BREAK_PARAGRAPH && (tagFlags & RULE_BREAK_PARAGRAPH))
+		{
+			closeParagraph = true;
+		}
+	}
+	else
+	{
+		closeParagraph = true;
+	}
+
+	// Let the cursor catch up with this tag's position
+	outputText(tagPos, skipBefore, closeParagraph);
+
+	// Capture the text consumed by the tag
+	var tagText = (tagLen)
+				? htmlspecialchars_noquotes(text.substr(tagPos, tagLen))
+				: '';
+
+	// Output current tag
+	if (tag.isStartTag())
+	{
+		// Handle paragraphs before opening the tag
+		if (!HINT.RULE_BREAK_PARAGRAPH || !(tagFlags & RULE_BREAK_PARAGRAPH))
+		{
+			outputParagraphStart(tagPos);
+		}
+
+		// Record this tag's namespace, if applicable
+		if (HINT.namespaces)
+		{
+			var colonPos = tagName.indexOf(':');
+			if (colonPos > 0)
+			{
+				namespaces[tagName.substr(0, colonPos)] = 0;
+			}
+		}
+
+		// Open the start tag and add its attributes, but don't close the tag
+		output += '<' + tagName;
+
+		// We output the attributes in lexical order. Helps canonicalizing the output and could
+		// prove useful someday
+		var attributes = tag.getAttributes(),
+			attributeNames = [];
+		for (var attrName in attributes)
+		{
+			attributeNames.push(attrName);
+		}
+		attributeNames.sort(
+			function(a, b)
+			{
+				return (a > b) ? 1 : -1;
+			}
+		);
+		attributeNames.forEach(
+			function(attrName)
+			{
+				output += ' ' + attrName + '="' + htmlspecialchars_compat(attributes[attrName].toString()).replace(/\n/g, '&#10;') + '"';
+			}
+		);
+
+		if (tag.isSelfClosingTag())
+		{
+			if (tagLen)
+			{
+				output += '>' + tagText + '</' + tagName + '>';
+			}
+			else
+			{
+				output += '/>';
+			}
+		}
+		else if (tagLen)
+		{
+			output += '><s>' + tagText + '</s>';
+		}
+		else
+		{
+			output += '>';
+		}
+	}
+	else
+	{
+		if (tagLen)
+		{
+			output += '<e>' + tagText + '</e>';
+		}
+
+		output += '</' + tagName + '>';
+	}
+
+	// Move the cursor past the tag
+	pos = tagPos + tagLen;
+
+	// Skip newlines (no other whitespace) after this tag
+	wsPos = pos;
+	while (skipAfter && wsPos < textLen && text.charAt(wsPos) === "\n")
+	{
+		// Decrement the number of lines to skip
+		--skipAfter;
+
+		// Move the cursor past the newline
+		++wsPos;
+	}
+}
+
+/**
+* Output the text between the cursor's position (included) and given position (not included)
+*
+* @param  {!number}  catchupPos     Position we're catching up to
+* @param  {!number}  maxLines       Maximum number of lines to ignore at the end of the text
+* @param  {!boolean} closeParagraph Whether to close the paragraph at the end, if applicable
+*/
+function outputText(catchupPos, maxLines, closeParagraph)
+{
+	if (closeParagraph)
+	{
+		if (!(context.flags & RULE_CREATE_PARAGRAPHS))
+		{
+			closeParagraph = false;
+		}
+		else
+		{
+			// Ignore any number of lines at the end if we're closing a paragraph
+			maxLines = -1;
+		}
+	}
+
+	if (pos >= catchupPos)
+	{
+		// We're already there, close the paragraph if applicable and return
+		if (closeParagraph)
+		{
+			outputParagraphEnd();
+		}
+	}
+
+	// Skip over previously identified whitespace if applicable
+	if (wsPos > pos)
+	{
+		var skipPos = Math.min(catchupPos, wsPos);
+		output += text.substr(pos, skipPos - pos);
+		pos = skipPos;
+
+		if (pos >= catchupPos)
+		{
+			// Skipped everything. Close the paragraph if applicable and return
+			if (closeParagraph)
+			{
+				outputParagraphEnd();
+			}
+		}
+	}
+
+	var catchupLen, catchupText;
+
+	// Test whether we're even supposed to output anything
+	if (HINT.RULE_IGNORE_TEXT && context.flags & RULE_IGNORE_TEXT)
+	{
+		catchupLen  = catchupPos - pos,
+		catchupText = text.substr(pos, catchupLen);
+
+		// If the catchup text is not entirely composed of whitespace, we put it inside ignore tags
+		if (!/^[ \n\t]*$/.test(catchupText))
+		{
+			catchupText = '<i>' + catchupText + '</i>';
+		}
+
+		output += catchupText;
+		pos = catchupPos;
+
+		if (closeParagraph)
+		{
+			outputParagraphEnd();
+		}
+
+		return;
+	}
+
+	// Compute the amount of text to ignore at the end of the output
+	var ignorePos = catchupPos,
+		ignoreLen = 0;
+
+	// Ignore as many lines (including whitespace) as specified
+	while (maxLines && --ignorePos >= pos)
+	{
+		var c = text.charAt(ignorePos);
+		if (c !== ' ' && c !== "\n" && c !== "\t")
+		{
+			break;
+		}
+
+		if (c === "\n")
+		{
+			--maxLines;
+		}
+
+		++ignoreLen;
+	}
+
+	// Adjust catchupPos to ignore the text at the end
+	catchupPos -= ignoreLen;
+
+	// Break down the text in paragraphs if applicable
+	if (HINT.RULE_CREATE_PARAGRAPHS && context.flags & RULE_CREATE_PARAGRAPHS)
+	{
+		if (!context.inParagraph)
+		{
+			outputWhitespace(catchupPos);
+
+			if (catchupPos > pos)
+			{
+				outputParagraphStart(catchupPos);
+			}
+		}
+
+		// Look for a paragraph break in this text
+		var pbPos = text.indexOf("\n\n", pos);
+
+		while (pbPos > -1 && pbPos < catchupPos)
+		{
+			outputText(pbPos, 0, true);
+			outputParagraphStart(catchupPos);
+
+			pbPos = text.indexOf("\n\n", pos);
+		}
+	}
+
+	// Capture, escape and output the text
+	if (catchupPos > pos)
+	{
+		catchupText = htmlspecialchars_noquotes(
+			text.substr(pos, catchupPos - pos)
+		);
+
+		// Format line breaks if applicable
+		if (HINT.RULE_ENABLE_AUTO_BR && (context.flags & RULES_AUTO_LINEBREAKS) === RULE_ENABLE_AUTO_BR)
+		{
+			catchupText = catchupText.replace(/\n/g, "<br/>\n");
+		}
+
+		output += catchupText;
+	}
+
+	// Close the paragraph if applicable
+	if (closeParagraph)
+	{
+		outputParagraphEnd();
+	}
+
+	// Add the ignored text if applicable
+	if (ignoreLen)
+	{
+		output += text.substr(catchupPos, ignoreLen);
+	}
+
+	// Move the cursor past the text
+	pos = catchupPos + ignoreLen;
+}
+
+/**
+* Output a linebreak tag
+*
+* @param  {!Tag} tag
+* @return void
+*/
+function outputBrTag(tag)
+{
+	outputText(tag.getPos(), 0, false);
+	output += '<br/>';
+}
+
+/**
+* Output an ignore tag
+*
+* @param  {!Tag} tag
+* @return void
+*/
+function outputIgnoreTag(tag)
+{
+	var tagPos = tag.getPos(),
+		tagLen = tag.getLen();
+
+	// Capture the text to ignore
+	var ignoreText = text.substr(tagPos, tagLen);
+
+	// Catch up with the tag's position then output the tag
+	outputText(tagPos, 0, false);
+	output += '<i>' + htmlspecialchars_noquotes(ignoreText) + '</i>';
+	isRich = true;
+
+	// Move the cursor past this tag
+	pos = tagPos + tagLen;
+}
+
+/**
+* Start a paragraph between current position and given position, if applicable
+*
+* @param  {!number} maxPos Rightmost position at which the paragraph can be opened
+*/
+function outputParagraphStart(maxPos)
+{
+	if (!HINT.RULE_CREATE_PARAGRAPHS)
+	{
+		return;
+	}
+
+	// Do nothing if we're already in a paragraph, or if we don't use paragraphs
+	if (context.inParagraph
+	 || !(context.flags & RULE_CREATE_PARAGRAPHS))
+	{
+		return;
+	}
+
+	// Output the whitespace between pos and maxPos if applicable
+	outputWhitespace(maxPos);
+
+	// Open the paragraph, but only if it's not at the very end of the text
+	if (pos < textLen)
+	{
+		output += '<p>';
+		context.inParagraph = true;
+	}
+}
+
+/**
+* Close current paragraph at current position if applicable
+*/
+function outputParagraphEnd()
+{
+	// Do nothing if we're not in a paragraph
+	if (!context.inParagraph)
+	{
+		return;
+	}
+
+	output += '</p>';
+	context.inParagraph = false;
+}
+
+/**
+* Output the content of a verbatim tag
+*
+* @param {!Tag} tag
+*/
+function outputVerbatim(tag)
+{
+	var flags = context.flags;
+	context.flags = tag.getFlags();
+	outputText(currentTag.getPos() + currentTag.getLen(), 0, false);
+	context.flags = flags;
+}
+
+/**
+* Skip as much whitespace after current position as possible
+*
+* @param  {!number} maxPos Rightmost character to be skipped
+*/
+function outputWhitespace(maxPos)
+{
+	while (pos < maxPos && " \n\t".indexOf(text.charAt(pos)) > -1)
+	{
+		output += text.charAt(pos);
+		++pos;
+	}
+}
+
+//==========================================================================
+// Plugins handling
+//==========================================================================
+
+/**
+* Disable a plugin
+*
+* @param {!string} pluginName Name of the plugin
+*/
+function disablePlugin(pluginName)
+{
+	if (plugins[pluginName])
+	{
+		plugins[pluginName].isDisabled = true;
+	}
+}
+
+/**
+* Enable a plugin
+*
+* @param {!string} pluginName Name of the plugin
+*/
+function enablePlugin(pluginName)
+{
+	if (plugins[pluginName])
+	{
+		plugins[pluginName].isDisabled = false;
+	}
+}
+
+/**
+* Execute given plugin
+*
+* @param {!string} pluginName Plugin's name
+*/
+function executePluginParser(pluginName)
+{
+	var pluginConfig = plugins[pluginName];
+	if (pluginConfig.quickMatch && text.indexOf(pluginConfig.quickMatch) < 0)
+	{
+		return;
+	}
+
+	var matches = [];
+	if (pluginConfig.regexp)
+	{
+		matches = getMatches(pluginConfig.regexp, pluginConfig.regexpLimit);
+		if (!matches.length)
+		{
+			return;
+		}
+	}
+
+	// Execute the plugin's parser, which will add tags via addStartTag() and others
+	getPluginParser(pluginName)(text, matches);
+}
+
+/**
+* Execute all the plugins
+*/
+function executePluginParsers()
+{
+	for (var pluginName in plugins)
+	{
+		if (!plugins[pluginName].isDisabled)
+		{
+			executePluginParser(pluginName);
+		}
+	}
+}
+
+/**
+* Get regexp matches in a manner similar to preg_match_all() with PREG_SET_ORDER | PREG_OFFSET_CAPTURE
+*
+* @param  {!RegExp} regexp
+* @param  {!number} limit
+* @return {!Array.<!Array>}
+*/
+function getMatches(regexp, limit)
+{
+	// Reset the regexp
+	regexp.lastIndex = 0;
+	var matches = [], cnt = 0, m;
+	while (++cnt <= limit && (m = regexp.exec(text)))
+	{
+		// NOTE: coercing m.index to a number because Closure Compiler thinks pos is a string otherwise
+		var pos   = +m['index'],
+			match = [[m[0], pos]],
+			i = 0;
+		while (++i < m.length)
+		{
+			var str = m[i];
+
+			// Sub-expressions that were not evaluated return undefined
+			if (str === undefined)
+			{
+				match.push(['', -1]);
+			}
+			else
+			{
+				match.push([str, text.indexOf(str, pos)]);
+				pos += str.length;
+			}
+		}
+
+		matches.push(match);
+	}
+
+	return matches;
+}
+
+/**
+* Get the callback for given plugin's parser
+*
+* @param  {!string}   pluginName
+* @return {!function(string, Array)}
+*/
+function getPluginParser(pluginName)
+{
+	return plugins[pluginName].parser;
+}
+
+/**
+* Register a parser
+*
+* Can be used to add a new parser with no plugin config, or pre-generate a parser for an
+* existing plugin
+*
+* @param  {!string}   pluginName
+* @param  {!Function} parser
+* @param  {RegExp}   regexp
+* @param  {number}   limit
+*/
+function registerParser(pluginName, parser, regexp, limit)
+{
+	// Create an empty config for this plugin to ensure it is executed
+	if (!plugins[pluginName])
+	{
+		plugins[pluginName] = {};
+	}
+	if (regexp)
+	{
+		plugins[pluginName].regexp = regexp;
+		plugins[pluginName].limit  = limit || Infinity;
+	}
+	plugins[pluginName].parser = parser;
+}
+
+//==========================================================================
+// Rules handling
+//==========================================================================
+
+/**
+* Apply closeAncestor rules associated with given tag
+*
+* @param  {!Tag}     tag Tag
+* @return {!boolean}     Whether a new tag has been added
+*/
+function closeAncestor(tag)
+{
+	if (!HINT.closeAncestor)
+	{
+		return false;
+	}
+
+	if (openTags.length)
+	{
+		var tagName   = tag.getName(),
+			tagConfig = tagsConfig[tagName];
+
+		if (tagConfig.rules.closeAncestor)
+		{
+			var i = openTags.length;
+
+			while (--i >= 0)
+			{
+				var ancestor     = openTags[i],
+					ancestorName = ancestor.getName();
+
+				if (tagConfig.rules.closeAncestor[ancestorName])
+				{
+					// We have to close this ancestor. First we reinsert this tag...
+					tagStack.push(tag);
+
+					// ...then we add a new end tag for it
+					addMagicEndTag(ancestor, tag.getPos());
+
+					return true;
+				}
+			}
+		}
+	}
+
+	return false;
+}
+
+/**
+* Apply closeParent rules associated with given tag
+*
+* @param  {!Tag}     tag Tag
+* @return {!boolean}     Whether a new tag has been added
+*/
+function closeParent(tag)
+{
+	if (!HINT.closeParent)
+	{
+		return false;
+	}
+
+	if (openTags.length)
+	{
+		var tagName   = tag.getName(),
+			tagConfig = tagsConfig[tagName];
+
+		if (tagConfig.rules.closeParent)
+		{
+			var parent     = openTags[openTags.length - 1],
+				parentName = parent.getName();
+
+			if (tagConfig.rules.closeParent[parentName])
+			{
+				// We have to close that parent. First we reinsert the tag...
+				tagStack.push(tag);
+
+				// ...then we add a new end tag for it
+				addMagicEndTag(parent, tag.getPos());
+
+				return true;
+			}
+		}
+	}
+
+	return false;
+}
+
+/**
+* Apply the createChild rules associated with given tag
+*
+* @param {!Tag} tag Tag
+*/
+function createChild(tag)
+{
+	if (!HINT.createChild)
+	{
+		return;
+	}
+
+	var tagConfig = tagsConfig[tag.getName()];
+	if (tagConfig.rules.createChild)
+	{
+		var priority = -1000,
+			_text    = text.substr(pos),
+			tagPos   = pos + _text.length - _text.replace(/^[ \n\r\t]+/, '').length;
+		tagConfig.rules.createChild.forEach(function(tagName)
+		{
+			addStartTag(tagName, tagPos, 0, ++priority);
+		});
+	}
+}
+
+/**
+* Apply fosterParent rules associated with given tag
+*
+* NOTE: this rule has the potential for creating an unbounded loop, either if a tag tries to
+*       foster itself or two or more tags try to foster each other in a loop. We mitigate the
+*       risk by preventing a tag from creating a child of itself (the parent still gets closed)
+*       and by checking and increasing the currentFixingCost so that a loop of multiple tags
+*       do not run indefinitely. The default tagLimit and nestingLimit also serve to prevent the
+*       loop from running indefinitely
+*
+* @param  {!Tag}     tag Tag
+* @return {!boolean}     Whether a new tag has been added
+*/
+function fosterParent(tag)
+{
+	if (!HINT.fosterParent)
+	{
+		return false;
+	}
+
+	if (openTags.length)
+	{
+		var tagName   = tag.getName(),
+			tagConfig = tagsConfig[tagName];
+
+		if (tagConfig.rules.fosterParent)
+		{
+			var parent     = openTags[openTags.length - 1],
+				parentName = parent.getName();
+
+			if (tagConfig.rules.fosterParent[parentName])
+			{
+				if (parentName !== tagName && currentFixingCost < maxFixingCost)
+				{
+					// Add a 0-width copy of the parent tag right after this tag, with a worse
+					// priority and make it depend on this tag
+					var child = addCopyTag(parent, tag.getPos() + tag.getLen(), 0, tag.getSortPriority() + 1);
+					tag.cascadeInvalidationTo(child);
+				}
+
+				// Reinsert current tag
+				tagStack.push(tag);
+
+				// And finally close its parent with a priority that ensures it is processed
+				// before this tag
+				addMagicEndTag(parent, tag.getPos(), tag.getSortPriority() - 1);
+
+				// Adjust the fixing cost to account for the additional tags/processing
+				currentFixingCost += 4;
+
+				return true;
+			}
+		}
+	}
+
+	return false;
+}
+
+/**
+* Apply requireAncestor rules associated with given tag
+*
+* @param  {!Tag}     tag Tag
+* @return {!boolean}     Whether this tag has an unfulfilled requireAncestor requirement
+*/
+function requireAncestor(tag)
+{
+	if (!HINT.requireAncestor)
+	{
+		return false;
+	}
+
+	var tagName   = tag.getName(),
+		tagConfig = tagsConfig[tagName];
+
+	if (tagConfig.rules.requireAncestor)
+	{
+		var i = tagConfig.rules.requireAncestor.length;
+		while (--i >= 0)
+		{
+			var ancestorName = tagConfig.rules.requireAncestor[i];
+			if (cntOpen[ancestorName])
+			{
+				return false;
+			}
+		}
+
+		logger.err('Tag requires an ancestor', {
+			'requireAncestor' : tagConfig.rules.requireAncestor.join(', '),
+			'tag'             : tag
+		});
+
+		return true;
+	}
+
+	return false;
+}
+
+//==========================================================================
+// Tag processing
+//==========================================================================
+
+/**
+* Create and add an end tag for given start tag at given position
+*
+* @param  {!Tag}    startTag Start tag
+* @param  {!number} tagPos   End tag's position (will be adjusted for whitespace if applicable)
+* @return {!Tag}
+*/
+function addMagicEndTag(startTag, tagPos)
+{
+	var tagName = startTag.getName();
+
+	// Adjust the end tag's position if whitespace is to be minimized
+	if (HINT.RULE_IGNORE_WHITESPACE && (startTag.getFlags() & RULE_IGNORE_WHITESPACE))
+	{
+		tagPos = getMagicPos(tagPos);
+	}
+
+	// Add a 0-width end tag that is paired with the given start tag
+	var endTag = addEndTag(tagName, tagPos, 0);
+	endTag.pairWith(startTag);
+
+	return endTag;
+}
+
+/**
+* Compute the position of a magic end tag, adjusted for whitespace
+*
+* @param  {!number} tagPos Rightmost possible position for the tag
+* @return {!number}
+*/
+function getMagicPos(tagPos)
+{
+	// Back up from given position to the cursor's position until we find a character that
+	// is not whitespace
+	while (tagPos > pos && WHITESPACE.indexOf(text.charAt(tagPos - 1)) > -1)
+	{
+		--tagPos;
+	}
+
+	return tagPos;
+}
+
+/**
+* Test whether given start tag is immediately followed by a closing tag
+*
+* @param  {!Tag} tag Start tag (including self-closing)
+* @return {!boolean}
+*/
+function isFollowedByClosingTag(tag)
+{
+	return (!tagStack.length) ? false : tagStack[tagStack.length - 1].canClose(tag);
+}
+
+/**
+* Process all tags in the stack
+*/
+function processTags()
+{
+	if (!tagStack.length)
+	{
+		return;
+	}
+
+	// Initialize the count tables
+	for (var tagName in tagsConfig)
+	{
+		cntOpen[tagName]  = 0;
+		cntTotal[tagName] = 0;
+	}
+
+	// Process the tag stack, close tags that were left open and repeat until done
+	do
+	{
+		while (tagStack.length)
+		{
+			if (!tagStackIsSorted)
+			{
+				sortTags();
+			}
+
+			currentTag = tagStack.pop();
+			processCurrentTag();
+		}
+
+		// Close tags that were left open
+		openTags.forEach(function (startTag)
+		{
+			// NOTE: we add tags in hierarchical order (ancestors to descendants) but since
+			//       the stack is processed in LIFO order, it means that tags get closed in
+			//       the correct order, from descendants to ancestors
+			addMagicEndTag(startTag, textLen);
+		});
+	}
+	while (tagStack.length);
+}
+
+/**
+* Process current tag
+*/
+function processCurrentTag()
+{
+	// Invalidate current tag if tags are disabled and current tag would not close the last open
+	// tag and is not a system tag
+	if ((context.flags & RULE_IGNORE_TAGS)
+	 && !currentTag.canClose(openTags[openTags.length - 1])
+	 && !currentTag.isSystemTag())
+	{
+		currentTag.invalidate();
+	}
+
+	var tagPos = currentTag.getPos(),
+		tagLen = currentTag.getLen();
+
+	// Test whether the cursor passed this tag's position already
+	if (pos > tagPos && !currentTag.isInvalid())
+	{
+		// Test whether this tag is paired with a start tag and this tag is still open
+		var startTag = currentTag.getStartTag();
+
+		if (startTag && openTags.indexOf(startTag) >= 0)
+		{
+			// Create an end tag that matches current tag's start tag, which consumes as much of
+			// the same text as current tag and is paired with the same start tag
+			addEndTag(
+				startTag.getName(),
+				pos,
+				Math.max(0, tagPos + tagLen - pos)
+			).pairWith(startTag);
+
+			// Note that current tag is not invalidated, it's merely replaced
+			return;
+		}
+
+		// If this is an ignore tag, try to ignore as much as the remaining text as possible
+		if (currentTag.isIgnoreTag())
+		{
+			var ignoreLen = tagPos + tagLen - pos;
+
+			if (ignoreLen > 0)
+			{
+				// Create a new ignore tag and move on
+				addIgnoreTag(pos, ignoreLen);
+
+				return;
+			}
+		}
+
+		// Skipped tags are invalidated
+		currentTag.invalidate();
+	}
+
+	if (currentTag.isInvalid())
+	{
+		return;
+	}
+
+	if (currentTag.isIgnoreTag())
+	{
+		outputIgnoreTag(currentTag);
+	}
+	else if (currentTag.isBrTag())
+	{
+		// Output the tag if it's allowed, ignore it otherwise
+		if (!HINT.RULE_PREVENT_BR || !(context.flags & RULE_PREVENT_BR))
+		{
+			outputBrTag(currentTag);
+		}
+	}
+	else if (currentTag.isParagraphBreak())
+	{
+		outputText(currentTag.getPos(), 0, true);
+	}
+	else if (currentTag.isVerbatim())
+	{
+		outputVerbatim(currentTag);
+	}
+	else if (currentTag.isStartTag())
+	{
+		processStartTag(currentTag);
+	}
+	else
+	{
+		processEndTag(currentTag);
+	}
+}
+
+/**
+* Process given start tag (including self-closing tags) at current position
+*
+* @param {!Tag} tag Start tag (including self-closing)
+*/
+function processStartTag(tag)
+{
+	var tagName   = tag.getName(),
+		tagConfig = tagsConfig[tagName];
+
+	// 1. Check that this tag has not reached its global limit tagLimit
+	// 2. Execute this tag's filterChain, which will filter/validate its attributes
+	// 3. Apply closeParent, closeAncestor and fosterParent rules
+	// 4. Check for nestingLimit
+	// 5. Apply requireAncestor rules
+	//
+	// This order ensures that the tag is valid and within the set limits before we attempt to
+	// close parents or ancestors. We need to close ancestors before we can check for nesting
+	// limits, whether this tag is allowed within current context (the context may change
+	// as ancestors are closed) or whether the required ancestors are still there (they might
+	// have been closed by a rule.)
+	if (cntTotal[tagName] >= tagConfig.tagLimit)
+	{
+		logger.err(
+			'Tag limit exceeded',
+			{
+				'tag'      : tag,
+				'tagName'  : tagName,
+				'tagLimit' : tagConfig.tagLimit
+			}
+		);
+		tag.invalidate();
+
+		return;
+	}
+
+	if (!filterTag(tag))
+	{
+		tag.invalidate();
+
+		return;
+	}
+
+	if (fosterParent(tag) || closeParent(tag) || closeAncestor(tag))
+	{
+		// This tag parent/ancestor needs to be closed, we just return (the tag is still valid)
+		return;
+	}
+
+	if (cntOpen[tagName] >= tagConfig.nestingLimit)
+	{
+		logger.err(
+			'Nesting limit exceeded',
+			{
+				'tag'          : tag,
+				'tagName'      : tagName,
+				'nestingLimit' : tagConfig.nestingLimit
+			}
+		);
+		tag.invalidate();
+
+		return;
+	}
+
+	if (!tagIsAllowed(tagName))
+	{
+		var msg     = 'Tag is not allowed in this context',
+			context = {'tag': tag, 'tagName': tagName};
+		if (tag.getLen() > 0)
+		{
+			logger.warn(msg, context);
+		}
+		else
+		{
+			logger.debug(msg, context);
+		}
+		tag.invalidate();
+
+		return;
+	}
+
+	if (requireAncestor(tag))
+	{
+		tag.invalidate();
+
+		return;
+	}
+
+	// If this tag has an autoClose rule and it's not paired with an end tag or followed by an
+	// end tag, we replace it with a self-closing tag with the same properties
+	if (HINT.RULE_AUTO_CLOSE
+	 && tag.getFlags() & RULE_AUTO_CLOSE
+	 && !tag.getEndTag()
+	 && !isFollowedByClosingTag(tag))
+	{
+		var newTag = new Tag(Tag.SELF_CLOSING_TAG, tagName, tag.getPos(), tag.getLen());
+		newTag.setAttributes(tag.getAttributes());
+		newTag.setFlags(tag.getFlags());
+
+		tag = newTag;
+	}
+
+	if (HINT.RULE_TRIM_FIRST_LINE
+	 && tag.getFlags() & RULE_TRIM_FIRST_LINE
+	 && !tag.getEndTag()
+	 && text.charAt(tag.getPos() + tag.getLen()) === "\n")
+	{
+		addIgnoreTag(tag.getPos() + tag.getLen(), 1);
+	}
+
+	// This tag is valid, output it and update the context
+	outputTag(tag);
+	pushContext(tag);
+
+	// Apply the createChild rules if applicable
+	createChild(tag);
+}
+
+/**
+* Process given end tag at current position
+*
+* @param {!Tag} tag End tag
+*/
+function processEndTag(tag)
+{
+	var tagName = tag.getName();
+
+	if (!cntOpen[tagName])
+	{
+		// This is an end tag with no start tag
+		return;
+	}
+
+	/**
+	* @type {!Array.<!Tag>} List of tags need to be closed before given tag
+	*/
+	var closeTags = [];
+
+	// Iterate through all open tags from last to first to find a match for our tag
+	var i = openTags.length;
+	while (--i >= 0)
+	{
+		var openTag = openTags[i];
+
+		if (tag.canClose(openTag))
+		{
+			break;
+		}
+
+		closeTags.push(openTag);
+		++currentFixingCost;
+	}
+
+	if (i < 0)
+	{
+		// Did not find a matching tag
+		logger.debug('Skipping end tag with no start tag', {'tag': tag});
+
+		return;
+	}
+
+	// Only reopen tags if we haven't exceeded our "fixing" budget
+	var keepReopening = HINT.RULE_AUTO_REOPEN && (currentFixingCost < maxFixingCost),
+		reopenTags    = [];
+	closeTags.forEach(function(openTag)
+	{
+		var openTagName = openTag.getName();
+
+		// Test whether this tag should be reopened automatically
+		if (keepReopening)
+		{
+			if (openTag.getFlags() & RULE_AUTO_REOPEN)
+			{
+				reopenTags.push(openTag);
+			}
+			else
+			{
+				keepReopening = false;
+			}
+		}
+
+		// Find the earliest position we can close this open tag
+		var tagPos = tag.getPos();
+		if (HINT.RULE_IGNORE_WHITESPACE && openTag.getFlags() & RULE_IGNORE_WHITESPACE)
+		{
+			tagPos = getMagicPos(tagPos);
+		}
+
+		// Output an end tag to close this start tag, then update the context
+		var endTag = new Tag(Tag.END_TAG, openTagName, tagPos, 0);
+		endTag.setFlags(openTag.getFlags());
+		outputTag(endTag);
+		popContext();
+	});
+
+	// Output our tag, moving the cursor past it, then update the context
+	outputTag(tag);
+	popContext();
+
+	// If our fixing budget allows it, peek at upcoming tags and remove end tags that would
+	// close tags that are already being closed now. Also, filter our list of tags being
+	// reopened by removing those that would immediately be closed
+	if (closeTags.length && currentFixingCost < maxFixingCost)
+	{
+		/**
+		* @type {number} Rightmost position of the portion of text to ignore
+		*/
+		var ignorePos = pos;
+
+		i = tagStack.length;
+		while (--i >= 0 && ++currentFixingCost < maxFixingCost)
+		{
+			var upcomingTag = tagStack[i];
+
+			// Test whether the upcoming tag is positioned at current "ignore" position and it's
+			// strictly an end tag (not a start tag or a self-closing tag)
+			if (upcomingTag.getPos() > ignorePos
+			 || upcomingTag.isStartTag())
+			{
+				break;
+			}
+
+			// Test whether this tag would close any of the tags we're about to reopen
+			var j = closeTags.length;
+
+			while (--j >= 0 && ++currentFixingCost < maxFixingCost)
+			{
+				if (upcomingTag.canClose(closeTags[j]))
+				{
+					// Remove the tag from the lists and reset the keys
+					closeTags.splice(j, 1);
+
+					if (reopenTags[j])
+					{
+						reopenTags.splice(j, 1);
+					}
+
+					// Extend the ignored text to cover this tag
+					ignorePos = Math.max(
+						ignorePos,
+						upcomingTag.getPos() + upcomingTag.getLen()
+					);
+
+					break;
+				}
+			}
+		}
+
+		if (ignorePos > pos)
+		{
+			/**
+			* @todo have a method that takes (pos,len) rather than a Tag
+			*/
+			outputIgnoreTag(new Tag(Tag.SELF_CLOSING_TAG, 'i', pos, ignorePos - pos));
+		}
+	}
+
+	// Re-add tags that need to be reopened, at current cursor position
+	reopenTags.forEach(function(startTag)
+	{
+		var newTag = addCopyTag(startTag, pos, 0);
+
+		// Re-pair the new tag
+		var endTag = startTag.getEndTag();
+		if (endTag)
+		{
+			newTag.pairWith(endTag);
+		}
+	});
+}
+
+/**
+* Update counters and replace current context with its parent context
+*/
+function popContext()
+{
+	var tag = openTags.pop();
+	--cntOpen[tag.getName()];
+	context = context.parentContext;
+}
+
+/**
+* Update counters and replace current context with a new context based on given tag
+*
+* If given tag is a self-closing tag, the context won't change
+*
+* @param {!Tag} tag Start tag (including self-closing)
+*/
+function pushContext(tag)
+{
+	var tagName   = tag.getName(),
+		tagFlags  = tag.getFlags(),
+		tagConfig = tagsConfig[tagName];
+
+	++cntTotal[tagName];
+
+	// If this is a self-closing tag, the context remains the same
+	if (tag.isSelfClosingTag())
+	{
+		return;
+	}
+
+	// Recompute the allowed tags
+	var allowed = [];
+	if (HINT.RULE_IS_TRANSPARENT && (tagFlags & RULE_IS_TRANSPARENT))
+	{
+		context.allowed.forEach(function(v, k)
+		{
+			allowed.push(tagConfig.allowed[k] & v);
+		});
+	}
+	else
+	{
+		context.allowed.forEach(function(v, k)
+		{
+			allowed.push(tagConfig.allowed[k] & ((v & 0xFF00) | (v >> 8)));
+		});
+	}
+
+	// Use this tag's flags as a base for this context and add inherited rules
+	var flags = tagFlags | (context.flags & RULES_INHERITANCE);
+
+	// RULE_DISABLE_AUTO_BR turns off RULE_ENABLE_AUTO_BR
+	if (flags & RULE_DISABLE_AUTO_BR)
+	{
+		flags &= ~RULE_ENABLE_AUTO_BR;
+	}
+
+	++cntOpen[tagName];
+	openTags.push(tag);
+	context = {
+		allowed       : allowed,
+		flags         : flags,
+		parentContext : context
+	};
+}
+
+/**
+* Return whether given tag is allowed in current context
+*
+* @param  {!string}  tagName
+* @return {!boolean}
+*/
+function tagIsAllowed(tagName)
+{
+	var n = tagsConfig[tagName].bitNumber;
+
+	return !!(context.allowed[n >> 3] & (1 << (n & 7)));
+}
+
+//==========================================================================
+// Tag stack
+//==========================================================================
+
+/**
+* Add a start tag
+*
+* @param  {!string} name Name of the tag
+* @param  {!number} pos  Position of the tag in the text
+* @param  {!number} len  Length of text consumed by the tag
+* @param  {number}  prio Tags' priority
+* @return {!Tag}
+*/
+function addStartTag(name, pos, len, prio)
+{
+	return addTag(Tag.START_TAG, name, pos, len, prio || 0);
+}
+
+/**
+* Add an end tag
+*
+* @param  {!string} name Name of the tag
+* @param  {!number} pos  Position of the tag in the text
+* @param  {!number} len  Length of text consumed by the tag
+* @param  {number}  prio Tags' priority
+* @return {!Tag}
+*/
+function addEndTag(name, pos, len, prio)
+{
+	return addTag(Tag.END_TAG, name, pos, len, prio || 0);
+}
+
+/**
+* Add a self-closing tag
+*
+* @param  {!string} name Name of the tag
+* @param  {!number} pos  Position of the tag in the text
+* @param  {!number} len  Length of text consumed by the tag
+* @param  {number}  prio Tags' priority
+* @return {!Tag}
+*/
+function addSelfClosingTag(name, pos, len, prio)
+{
+	return addTag(Tag.SELF_CLOSING_TAG, name, pos, len, prio || 0);
+}
+
+/**
+* Add a 0-width "br" tag to force a line break at given position
+*
+* @param  {!number} pos  Position of the tag in the text
+* @param  {number}  prio Tags' priority
+* @return {!Tag}
+*/
+function addBrTag(pos, prio)
+{
+	return addTag(Tag.SELF_CLOSING_TAG, 'br', pos, 0, prio || 0);
+}
+
+/**
+* Add an "ignore" tag
+*
+* @param  {!number} pos  Position of the tag in the text
+* @param  {!number} len  Length of text consumed by the tag
+* @param  {number}  prio Tags' priority
+* @return {!Tag}
+*/
+function addIgnoreTag(pos, len, prio)
+{
+	return addTag(Tag.SELF_CLOSING_TAG, 'i', pos, Math.min(len, textLen - pos), prio || 0);
+}
+
+/**
+* Add a paragraph break at given position
+*
+* Uses a zero-width tag that is actually never output in the result
+*
+* @param  {!number} pos  Position of the tag in the text
+* @param  {number}  prio Tags' priority
+* @return {!Tag}
+*/
+function addParagraphBreak(pos, prio)
+{
+	return addTag(Tag.SELF_CLOSING_TAG, 'pb', pos, 0, prio || 0);
+}
+
+/**
+* Add a copy of given tag at given position and length
+*
+* @param  {!Tag}    tag Original tag
+* @param  {!number} pos Copy's position
+* @param  {!number} len Copy's length
+* @param  {number}  prio Tags' priority
+* @return {!Tag}         Copy tag
+*/
+function addCopyTag(tag, pos, len, prio)
+{
+	var copy = addTag(tag.getType(), tag.getName(), pos, len, tag.getSortPriority());
+	copy.setAttributes(tag.getAttributes());
+
+	return copy;
+}
+
+/**
+* Add a tag
+*
+* @param  {!number} type Tag's type
+* @param  {!string} name Name of the tag
+* @param  {!number} pos  Position of the tag in the text
+* @param  {!number} len  Length of text consumed by the tag
+* @param  {number}  prio Tags' priority
+* @return {!Tag}
+*/
+function addTag(type, name, pos, len, prio)
+{
+	// Create the tag
+	var tag = new Tag(type, name, pos, len, prio || 0);
+
+	// Set this tag's rules bitfield
+	if (tagsConfig[name])
+	{
+		tag.setFlags(tagsConfig[name].rules.flags);
+	}
+
+	// Invalidate this tag if it's an unknown tag, a disabled tag, if either of its length or
+	// position is negative or if it's out of bounds
+	if (!tagsConfig[name] && !tag.isSystemTag())
+	{
+		tag.invalidate();
+	}
+	else if (tagsConfig[name] && tagsConfig[name].isDisabled)
+	{
+		logger.warn(
+			'Tag is disabled',
+			{
+				'tag'     : tag,
+				'tagName' : name
+			}
+		);
+		tag.invalidate();
+	}
+	else if (len < 0 || pos < 0 || pos + len > textLen)
+	{
+		tag.invalidate();
+	}
+	else
+	{
+		insertTag(tag);
+	}
+
+	return tag;
+}
+
+/**
+* Insert given tag in the tag stack
+*
+* @param {!Tag} tag
+*/
+function insertTag(tag)
+{
+	if (!tagStackIsSorted)
+	{
+		tagStack.push(tag);
+	}
+	else
+	{
+		// Scan the stack and copy every tag to the next slot until we find the correct index
+		var i = tagStack.length;
+		while (i > 0 && compareTags(tagStack[i - 1], tag) > 0)
+		{
+			tagStack[i] = tagStack[i - 1];
+			--i;
+		}
+		tagStack[i] = tag;
+	}
+}
+
+/**
+* Add a pair of tags
+*
+* @param  {!string} name     Name of the tags
+* @param  {!number} startPos Position of the start tag
+* @param  {!number} startLen Length of the start tag
+* @param  {!number} endPos   Position of the start tag
+* @param  {!number} endLen   Length of the start tag
+* @param  {number}  prio     Start tag's priority (the end tag will be set to minus that value)
+* @return {!Tag}             Start tag
+*/
+function addTagPair(name, startPos, startLen, endPos, endLen, prio)
+{
+	// NOTE: the end tag is added first to try to keep the stack in the correct order
+	var endTag   = addEndTag(name, endPos, endLen, -prio || 0),
+		startTag = addStartTag(name, startPos, startLen, prio || 0);
+	startTag.pairWith(endTag);
+
+	return startTag;
+}
+
+/**
+* Add a tag that represents a verbatim copy of the original text
+*
+* @param  {!number} pos  Position of the tag in the text
+* @param  {!number} len  Length of text consumed by the tag
+* @return {!Tag}
+*/
+function addVerbatim(pos, len, prio)
+{
+	return addTag(Tag.SELF_CLOSING_TAG, 'v', pos, len, prio || 0);
+}
+
+/**
+* Sort tags by position and precedence
+*/
+function sortTags()
+{
+	tagStack.sort(compareTags);
+	tagStackIsSorted = true;
+}
+
+/**
+* sortTags() callback
+*
+* Tags are stored as a stack, in LIFO order. We sort tags by position _descending_ so that they
+* are processed in the order they appear in the text.
+*
+* @param  {!Tag}    a First tag to compare
+* @param  {!Tag}    b Second tag to compare
+* @return {!number}
+*/
+function compareTags(a, b)
+{
+	var aPos = a.getPos(),
+		bPos = b.getPos();
+
+	// First we order by pos descending
+	if (aPos !== bPos)
+	{
+		return bPos - aPos;
+	}
+
+	// If the tags start at the same position, we'll use their sortPriority if applicable. Tags
+	// with a lower value get sorted last, which means they'll be processed first. IOW, -10 is
+	// processed before 10
+	if (a.getSortPriority() !== b.getSortPriority())
+	{
+		return b.getSortPriority() - a.getSortPriority();
+	}
+
+	// If the tags start at the same position and have the same priority, we'll sort them
+	// according to their length, with special considerations for  zero-width tags
+	var aLen = a.getLen(),
+		bLen = b.getLen();
+
+	if (!aLen || !bLen)
+	{
+		// Zero-width end tags are ordered after zero-width start tags so that a pair that ends
+		// with a zero-width tag has the opportunity to be closed before another pair starts
+		// with a zero-width tag. For example, the pairs that would enclose each of the letters
+		// in the string "XY". Self-closing tags are ordered between end tags and start tags in
+		// an attempt to keep them out of tag pairs
+		if (!aLen && !bLen)
+		{
+			var order = {};
+			order[Tag.END_TAG]          = 0;
+			order[Tag.SELF_CLOSING_TAG] = 1;
+			order[Tag.START_TAG]        = 2;
+
+			return order[b.getType()] - order[a.getType()];
+		}
+
+		// Here, we know that only one of a or b is a zero-width tags. Zero-width tags are
+		// ordered after wider tags so that they have a chance to be processed before the next
+		// character is consumed, which would force them to be skipped
+		return (aLen) ? -1 : 1;
+	}
+
+	// Here we know that both tags start at the same position and have a length greater than 0.
+	// We sort tags by length ascending, so that the longest matches are processed first. If
+	// their length is identical, the order is undefined as PHP's sort isn't stable
+	return aLen - bLen;
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Parser.php
@@ -0,0 +1,1040 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter;
+use InvalidArgumentException;
+use RuntimeException;
+use s9e\TextFormatter\Parser\Logger;
+use s9e\TextFormatter\Parser\Tag;
+class Parser
+{
+	const RULE_AUTO_CLOSE        = 1;
+	const RULE_AUTO_REOPEN       = 2;
+	const RULE_BREAK_PARAGRAPH   = 4;
+	const RULE_CREATE_PARAGRAPHS = 8;
+	const RULE_DISABLE_AUTO_BR   = 16;
+	const RULE_ENABLE_AUTO_BR    = 32;
+	const RULE_IGNORE_TAGS       = 64;
+	const RULE_IGNORE_TEXT       = 128;
+	const RULE_IGNORE_WHITESPACE = 256;
+	const RULE_IS_TRANSPARENT    = 512;
+	const RULE_PREVENT_BR        = 1024;
+	const RULE_SUSPEND_AUTO_BR   = 2048;
+	const RULE_TRIM_FIRST_LINE   = 4096;
+	const RULES_AUTO_LINEBREAKS = 2096;
+	const RULES_INHERITANCE = 32;
+	const WHITESPACE = ' 
+	';
+	protected $cntOpen;
+	protected $cntTotal;
+	protected $context;
+	protected $currentFixingCost;
+	protected $currentTag;
+	protected $isRich;
+	protected $logger;
+	public $maxFixingCost = 1000;
+	protected $namespaces;
+	protected $openTags;
+	protected $output;
+	protected $pos;
+	protected $pluginParsers = array();
+	protected $pluginsConfig;
+	public $registeredVars = array();
+	protected $rootContext;
+	protected $tagsConfig;
+	protected $tagStack;
+	protected $tagStackIsSorted;
+	protected $text;
+	protected $textLen;
+	protected $uid = 0;
+	protected $wsPos;
+	public function __construct(array $config)
+	{
+		$this->pluginsConfig  = $config['plugins'];
+		$this->registeredVars = $config['registeredVars'];
+		$this->rootContext    = $config['rootContext'];
+		$this->tagsConfig     = $config['tags'];
+		$this->__wakeup();
+	}
+	public function __sleep()
+	{
+		return array('pluginsConfig', 'registeredVars', 'rootContext', 'tagsConfig');
+	}
+	public function __wakeup()
+	{
+		$this->logger = new Logger;
+	}
+	protected function reset($text)
+	{
+		$text = \preg_replace('/\\r\\n?/', "\n", $text);
+		$text = \preg_replace('/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]+/S', '', $text);
+		$this->logger->clear();
+		$this->cntOpen           = array();
+		$this->cntTotal          = array();
+		$this->currentFixingCost = 0;
+		$this->currentTag        = \null;
+		$this->isRich            = \false;
+		$this->namespaces        = array();
+		$this->openTags          = array();
+		$this->output            = '';
+		$this->pos               = 0;
+		$this->tagStack          = array();
+		$this->tagStackIsSorted  = \false;
+		$this->text              = $text;
+		$this->textLen           = \strlen($text);
+		$this->wsPos             = 0;
+		$this->context = $this->rootContext;
+		$this->context['inParagraph'] = \false;
+		++$this->uid;
+	}
+	protected function setTagOption($tagName, $optionName, $optionValue)
+	{
+		if (isset($this->tagsConfig[$tagName]))
+		{
+			$tagConfig = $this->tagsConfig[$tagName];
+			unset($this->tagsConfig[$tagName]);
+			$tagConfig[$optionName]     = $optionValue;
+			$this->tagsConfig[$tagName] = $tagConfig;
+		}
+	}
+	public function disableTag($tagName)
+	{
+		$this->setTagOption($tagName, 'isDisabled', \true);
+	}
+	public function enableTag($tagName)
+	{
+		if (isset($this->tagsConfig[$tagName]))
+			unset($this->tagsConfig[$tagName]['isDisabled']);
+	}
+	public function getLogger()
+	{
+		return $this->logger;
+	}
+	public function getText()
+	{
+		return $this->text;
+	}
+	public function parse($text)
+	{
+		$this->reset($text);
+		$uid = $this->uid;
+		$this->executePluginParsers();
+		$this->processTags();
+		$this->finalizeOutput();
+		if ($this->uid !== $uid)
+			throw new RuntimeException('The parser has been reset during execution');
+		if ($this->currentFixingCost > $this->maxFixingCost)
+			$this->logger->warn('Fixing cost limit exceeded');
+		return $this->output;
+	}
+	public function setTagLimit($tagName, $tagLimit)
+	{
+		$this->setTagOption($tagName, 'tagLimit', $tagLimit);
+	}
+	public function setNestingLimit($tagName, $nestingLimit)
+	{
+		$this->setTagOption($tagName, 'nestingLimit', $nestingLimit);
+	}
+	public static function executeAttributePreprocessors(Tag $tag, array $tagConfig)
+	{
+		if (!empty($tagConfig['attributePreprocessors']))
+			foreach ($tagConfig['attributePreprocessors'] as $_5f417eec)
+			{
+				list($attrName, $regexp, $map) = $_5f417eec;
+				if (!$tag->hasAttribute($attrName))
+					continue;
+				self::executeAttributePreprocessor($tag, $attrName, $regexp, $map);
+			}
+		return \true;
+	}
+	protected static function executeAttributePreprocessor(Tag $tag, $attrName, $regexp, $map)
+	{
+		$attrValue = $tag->getAttribute($attrName);
+		$captures  = self::getNamedCaptures($attrValue, $regexp, $map);
+		foreach ($captures as $k => $v)
+			if ($k === $attrName || !$tag->hasAttribute($k))
+				$tag->setAttribute($k, $v);
+	}
+	protected static function getNamedCaptures($attrValue, $regexp, $map)
+	{
+		if (!\preg_match($regexp, $attrValue, $m))
+			return array();
+		$values = array();
+		foreach ($map as $i => $k)
+			if (isset($m[$i]) && $m[$i] !== '')
+				$values[$k] = $m[$i];
+		return $values;
+	}
+	protected static function executeFilter(array $filter, array $vars)
+	{
+		$callback = $filter['callback'];
+		$params   = (isset($filter['params'])) ? $filter['params'] : array();
+		$args = array();
+		foreach ($params as $k => $v)
+			if (\is_numeric($k))
+				$args[] = $v;
+			elseif (isset($vars[$k]))
+				$args[] = $vars[$k];
+			elseif (isset($vars['registeredVars'][$k]))
+				$args[] = $vars['registeredVars'][$k];
+			else
+				$args[] = \null;
+		return \call_user_func_array($callback, $args);
+	}
+	public static function filterAttributes(Tag $tag, array $tagConfig, array $registeredVars, Logger $logger)
+	{
+		if (empty($tagConfig['attributes']))
+		{
+			$tag->setAttributes(array());
+			return \true;
+		}
+		foreach ($tagConfig['attributes'] as $attrName => $attrConfig)
+			if (isset($attrConfig['generator']))
+				$tag->setAttribute(
+					$attrName,
+					self::executeFilter(
+						$attrConfig['generator'],
+						array(
+							'attrName'       => $attrName,
+							'logger'         => $logger,
+							'registeredVars' => $registeredVars
+						)
+					)
+				);
+		foreach ($tag->getAttributes() as $attrName => $attrValue)
+		{
+			if (!isset($tagConfig['attributes'][$attrName]))
+			{
+				$tag->removeAttribute($attrName);
+				continue;
+			}
+			$attrConfig = $tagConfig['attributes'][$attrName];
+			if (!isset($attrConfig['filterChain']))
+				continue;
+			$logger->setAttribute($attrName);
+			foreach ($attrConfig['filterChain'] as $filter)
+			{
+				$attrValue = self::executeFilter(
+					$filter,
+					array(
+						'attrName'       => $attrName,
+						'attrValue'      => $attrValue,
+						'logger'         => $logger,
+						'registeredVars' => $registeredVars
+					)
+				);
+				if ($attrValue === \false)
+				{
+					$tag->removeAttribute($attrName);
+					break;
+				}
+			}
+			if ($attrValue !== \false)
+				$tag->setAttribute($attrName, $attrValue);
+			$logger->unsetAttribute();
+		}
+		foreach ($tagConfig['attributes'] as $attrName => $attrConfig)
+			if (!$tag->hasAttribute($attrName))
+				if (isset($attrConfig['defaultValue']))
+					$tag->setAttribute($attrName, $attrConfig['defaultValue']);
+				elseif (!empty($attrConfig['required']))
+					return \false;
+		return \true;
+	}
+	protected function filterTag(Tag $tag)
+	{
+		$tagName   = $tag->getName();
+		$tagConfig = $this->tagsConfig[$tagName];
+		$isValid   = \true;
+		if (!empty($tagConfig['filterChain']))
+		{
+			$this->logger->setTag($tag);
+			$vars = array(
+				'logger'         => $this->logger,
+				'openTags'       => $this->openTags,
+				'parser'         => $this,
+				'registeredVars' => $this->registeredVars,
+				'tag'            => $tag,
+				'tagConfig'      => $tagConfig,
+				'text'           => $this->text
+			);
+			foreach ($tagConfig['filterChain'] as $filter)
+				if (!self::executeFilter($filter, $vars))
+				{
+					$isValid = \false;
+					break;
+				}
+			$this->logger->unsetTag();
+		}
+		return $isValid;
+	}
+	protected function finalizeOutput()
+	{
+		$this->outputText($this->textLen, 0, \true);
+		do
+		{
+			$this->output = \preg_replace('(<([^ />]+)></\\1>)', '', $this->output, -1, $cnt);
+		}
+		while ($cnt > 0);
+		if (\strpos($this->output, '</i><i>') !== \false)
+			$this->output = \str_replace('</i><i>', '', $this->output);
+		$this->output = Utils::encodeUnicodeSupplementaryCharacters($this->output);
+		$tagName = ($this->isRich) ? 'r' : 't';
+		$tmp = '<' . $tagName;
+		foreach (\array_keys($this->namespaces) as $prefix)
+			$tmp .= ' xmlns:' . $prefix . '="urn:s9e:TextFormatter:' . $prefix . '"';
+		$this->output = $tmp . '>' . $this->output . '</' . $tagName . '>';
+	}
+	protected function outputTag(Tag $tag)
+	{
+		$this->isRich = \true;
+		$tagName  = $tag->getName();
+		$tagPos   = $tag->getPos();
+		$tagLen   = $tag->getLen();
+		$tagFlags = $tag->getFlags();
+		if ($tagFlags & self::RULE_IGNORE_WHITESPACE)
+		{
+			$skipBefore = 1;
+			$skipAfter  = ($tag->isEndTag()) ? 2 : 1;
+		}
+		else
+			$skipBefore = $skipAfter = 0;
+		$closeParagraph = \false;
+		if ($tag->isStartTag())
+		{
+			if ($tagFlags & self::RULE_BREAK_PARAGRAPH)
+				$closeParagraph = \true;
+		}
+		else
+			$closeParagraph = \true;
+		$this->outputText($tagPos, $skipBefore, $closeParagraph);
+		$tagText = ($tagLen)
+		         ? \htmlspecialchars(\substr($this->text, $tagPos, $tagLen), \ENT_NOQUOTES, 'UTF-8')
+		         : '';
+		if ($tag->isStartTag())
+		{
+			if (!($tagFlags & self::RULE_BREAK_PARAGRAPH))
+				$this->outputParagraphStart($tagPos);
+			$colonPos = \strpos($tagName, ':');
+			if ($colonPos)
+				$this->namespaces[\substr($tagName, 0, $colonPos)] = 0;
+			$this->output .= '<' . $tagName;
+			$attributes = $tag->getAttributes();
+			\ksort($attributes);
+			foreach ($attributes as $attrName => $attrValue)
+				$this->output .= ' ' . $attrName . '="' . \str_replace("\n", '&#10;', \htmlspecialchars($attrValue, \ENT_COMPAT, 'UTF-8')) . '"';
+			if ($tag->isSelfClosingTag())
+				if ($tagLen)
+					$this->output .= '>' . $tagText . '</' . $tagName . '>';
+				else
+					$this->output .= '/>';
+			elseif ($tagLen)
+				$this->output .= '><s>' . $tagText . '</s>';
+			else
+				$this->output .= '>';
+		}
+		else
+		{
+			if ($tagLen)
+				$this->output .= '<e>' . $tagText . '</e>';
+			$this->output .= '</' . $tagName . '>';
+		}
+		$this->pos = $tagPos + $tagLen;
+		$this->wsPos = $this->pos;
+		while ($skipAfter && $this->wsPos < $this->textLen && $this->text[$this->wsPos] === "\n")
+		{
+			--$skipAfter;
+			++$this->wsPos;
+		}
+	}
+	protected function outputText($catchupPos, $maxLines, $closeParagraph)
+	{
+		if ($closeParagraph)
+			if (!($this->context['flags'] & self::RULE_CREATE_PARAGRAPHS))
+				$closeParagraph = \false;
+			else
+				$maxLines = -1;
+		if ($this->pos >= $catchupPos)
+		{
+			if ($closeParagraph)
+				$this->outputParagraphEnd();
+			return;
+		}
+		if ($this->wsPos > $this->pos)
+		{
+			$skipPos       = \min($catchupPos, $this->wsPos);
+			$this->output .= \substr($this->text, $this->pos, $skipPos - $this->pos);
+			$this->pos     = $skipPos;
+			if ($this->pos >= $catchupPos)
+			{
+				if ($closeParagraph)
+					$this->outputParagraphEnd();
+				return;
+			}
+		}
+		if ($this->context['flags'] & self::RULE_IGNORE_TEXT)
+		{
+			$catchupLen  = $catchupPos - $this->pos;
+			$catchupText = \substr($this->text, $this->pos, $catchupLen);
+			if (\strspn($catchupText, " \n\t") < $catchupLen)
+				$catchupText = '<i>' . $catchupText . '</i>';
+			$this->output .= $catchupText;
+			$this->pos = $catchupPos;
+			if ($closeParagraph)
+				$this->outputParagraphEnd();
+			return;
+		}
+		$ignorePos = $catchupPos;
+		$ignoreLen = 0;
+		while ($maxLines && --$ignorePos >= $this->pos)
+		{
+			$c = $this->text[$ignorePos];
+			if (\strpos(self::WHITESPACE, $c) === \false)
+				break;
+			if ($c === "\n")
+				--$maxLines;
+			++$ignoreLen;
+		}
+		$catchupPos -= $ignoreLen;
+		if ($this->context['flags'] & self::RULE_CREATE_PARAGRAPHS)
+		{
+			if (!$this->context['inParagraph'])
+			{
+				$this->outputWhitespace($catchupPos);
+				if ($catchupPos > $this->pos)
+					$this->outputParagraphStart($catchupPos);
+			}
+			$pbPos = \strpos($this->text, "\n\n", $this->pos);
+			while ($pbPos !== \false && $pbPos < $catchupPos)
+			{
+				$this->outputText($pbPos, 0, \true);
+				$this->outputParagraphStart($catchupPos);
+				$pbPos = \strpos($this->text, "\n\n", $this->pos);
+			}
+		}
+		if ($catchupPos > $this->pos)
+		{
+			$catchupText = \htmlspecialchars(
+				\substr($this->text, $this->pos, $catchupPos - $this->pos),
+				\ENT_NOQUOTES,
+				'UTF-8'
+			);
+			if (($this->context['flags'] & self::RULES_AUTO_LINEBREAKS) === self::RULE_ENABLE_AUTO_BR)
+				$catchupText = \str_replace("\n", "<br/>\n", $catchupText);
+			$this->output .= $catchupText;
+		}
+		if ($closeParagraph)
+			$this->outputParagraphEnd();
+		if ($ignoreLen)
+			$this->output .= \substr($this->text, $catchupPos, $ignoreLen);
+		$this->pos = $catchupPos + $ignoreLen;
+	}
+	protected function outputBrTag(Tag $tag)
+	{
+		$this->outputText($tag->getPos(), 0, \false);
+		$this->output .= '<br/>';
+	}
+	protected function outputIgnoreTag(Tag $tag)
+	{
+		$tagPos = $tag->getPos();
+		$tagLen = $tag->getLen();
+		$ignoreText = \substr($this->text, $tagPos, $tagLen);
+		$this->outputText($tagPos, 0, \false);
+		$this->output .= '<i>' . \htmlspecialchars($ignoreText, \ENT_NOQUOTES, 'UTF-8') . '</i>';
+		$this->isRich = \true;
+		$this->pos = $tagPos + $tagLen;
+	}
+	protected function outputParagraphStart($maxPos)
+	{
+		if ($this->context['inParagraph']
+		 || !($this->context['flags'] & self::RULE_CREATE_PARAGRAPHS))
+			return;
+		$this->outputWhitespace($maxPos);
+		if ($this->pos < $this->textLen)
+		{
+			$this->output .= '<p>';
+			$this->context['inParagraph'] = \true;
+		}
+	}
+	protected function outputParagraphEnd()
+	{
+		if (!$this->context['inParagraph'])
+			return;
+		$this->output .= '</p>';
+		$this->context['inParagraph'] = \false;
+	}
+	protected function outputVerbatim(Tag $tag)
+	{
+		$flags = $this->context['flags'];
+		$this->context['flags'] = $tag->getFlags();
+		$this->outputText($this->currentTag->getPos() + $this->currentTag->getLen(), 0, \false);
+		$this->context['flags'] = $flags;
+	}
+	protected function outputWhitespace($maxPos)
+	{
+		if ($maxPos > $this->pos)
+		{
+			$spn = \strspn($this->text, self::WHITESPACE, $this->pos, $maxPos - $this->pos);
+			if ($spn)
+			{
+				$this->output .= \substr($this->text, $this->pos, $spn);
+				$this->pos += $spn;
+			}
+		}
+	}
+	public function disablePlugin($pluginName)
+	{
+		if (isset($this->pluginsConfig[$pluginName]))
+		{
+			$pluginConfig = $this->pluginsConfig[$pluginName];
+			unset($this->pluginsConfig[$pluginName]);
+			$pluginConfig['isDisabled'] = \true;
+			$this->pluginsConfig[$pluginName] = $pluginConfig;
+		}
+	}
+	public function enablePlugin($pluginName)
+	{
+		if (isset($this->pluginsConfig[$pluginName]))
+			$this->pluginsConfig[$pluginName]['isDisabled'] = \false;
+	}
+	protected function executePluginParser($pluginName)
+	{
+		$pluginConfig = $this->pluginsConfig[$pluginName];
+		if (isset($pluginConfig['quickMatch']) && \strpos($this->text, $pluginConfig['quickMatch']) === \false)
+			return;
+		$matches = array();
+		if (isset($pluginConfig['regexp']))
+		{
+			$matches = $this->getMatches($pluginConfig['regexp'], $pluginConfig['regexpLimit']);
+			if (empty($matches))
+				return;
+		}
+		\call_user_func($this->getPluginParser($pluginName), $this->text, $matches);
+	}
+	protected function executePluginParsers()
+	{
+		foreach ($this->pluginsConfig as $pluginName => $pluginConfig)
+			if (empty($pluginConfig['isDisabled']))
+				$this->executePluginParser($pluginName);
+	}
+	protected function getMatches($regexp, $limit)
+	{
+		$cnt = \preg_match_all($regexp, $this->text, $matches, \PREG_SET_ORDER | \PREG_OFFSET_CAPTURE);
+		if ($cnt > $limit)
+			$matches = \array_slice($matches, 0, $limit);
+		return $matches;
+	}
+	protected function getPluginParser($pluginName)
+	{
+		if (!isset($this->pluginParsers[$pluginName]))
+		{
+			$pluginConfig = $this->pluginsConfig[$pluginName];
+			$className = (isset($pluginConfig['className']))
+			           ? $pluginConfig['className']
+			           : 's9e\\TextFormatter\\Plugins\\' . $pluginName . '\\Parser';
+			$this->pluginParsers[$pluginName] = array(new $className($this, $pluginConfig), 'parse');
+		}
+		return $this->pluginParsers[$pluginName];
+	}
+	public function registerParser($pluginName, $parser, $regexp = \null, $limit = \PHP_INT_MAX)
+	{
+		if (!\is_callable($parser))
+			throw new InvalidArgumentException('Argument 1 passed to ' . __METHOD__ . ' must be a valid callback');
+		if (!isset($this->pluginsConfig[$pluginName]))
+			$this->pluginsConfig[$pluginName] = array();
+		if (isset($regexp))
+		{
+			$this->pluginsConfig[$pluginName]['regexp']      = $regexp;
+			$this->pluginsConfig[$pluginName]['regexpLimit'] = $limit;
+		}
+		$this->pluginParsers[$pluginName] = $parser;
+	}
+	protected function closeAncestor(Tag $tag)
+	{
+		if (!empty($this->openTags))
+		{
+			$tagName   = $tag->getName();
+			$tagConfig = $this->tagsConfig[$tagName];
+			if (!empty($tagConfig['rules']['closeAncestor']))
+			{
+				$i = \count($this->openTags);
+				while (--$i >= 0)
+				{
+					$ancestor     = $this->openTags[$i];
+					$ancestorName = $ancestor->getName();
+					if (isset($tagConfig['rules']['closeAncestor'][$ancestorName]))
+					{
+						$this->tagStack[] = $tag;
+						$this->addMagicEndTag($ancestor, $tag->getPos());
+						return \true;
+					}
+				}
+			}
+		}
+		return \false;
+	}
+	protected function closeParent(Tag $tag)
+	{
+		if (!empty($this->openTags))
+		{
+			$tagName   = $tag->getName();
+			$tagConfig = $this->tagsConfig[$tagName];
+			if (!empty($tagConfig['rules']['closeParent']))
+			{
+				$parent     = \end($this->openTags);
+				$parentName = $parent->getName();
+				if (isset($tagConfig['rules']['closeParent'][$parentName]))
+				{
+					$this->tagStack[] = $tag;
+					$this->addMagicEndTag($parent, $tag->getPos());
+					return \true;
+				}
+			}
+		}
+		return \false;
+	}
+	protected function createChild(Tag $tag)
+	{
+		$tagConfig = $this->tagsConfig[$tag->getName()];
+		if (isset($tagConfig['rules']['createChild']))
+		{
+			$priority = -1000;
+			$tagPos   = $this->pos + \strspn($this->text, " \n\r\t", $this->pos);
+			foreach ($tagConfig['rules']['createChild'] as $tagName)
+				$this->addStartTag($tagName, $tagPos, 0, ++$priority);
+		}
+	}
+	protected function fosterParent(Tag $tag)
+	{
+		if (!empty($this->openTags))
+		{
+			$tagName   = $tag->getName();
+			$tagConfig = $this->tagsConfig[$tagName];
+			if (!empty($tagConfig['rules']['fosterParent']))
+			{
+				$parent     = \end($this->openTags);
+				$parentName = $parent->getName();
+				if (isset($tagConfig['rules']['fosterParent'][$parentName]))
+				{
+					if ($parentName !== $tagName && $this->currentFixingCost < $this->maxFixingCost)
+					{
+						$child = $this->addCopyTag($parent, $tag->getPos() + $tag->getLen(), 0, $tag->getSortPriority() + 1);
+						$tag->cascadeInvalidationTo($child);
+					}
+					$this->tagStack[] = $tag;
+					$this->addMagicEndTag($parent, $tag->getPos(), $tag->getSortPriority() - 1);
+					$this->currentFixingCost += 4;
+					return \true;
+				}
+			}
+		}
+		return \false;
+	}
+	protected function requireAncestor(Tag $tag)
+	{
+		$tagName   = $tag->getName();
+		$tagConfig = $this->tagsConfig[$tagName];
+		if (isset($tagConfig['rules']['requireAncestor']))
+		{
+			foreach ($tagConfig['rules']['requireAncestor'] as $ancestorName)
+				if (!empty($this->cntOpen[$ancestorName]))
+					return \false;
+			$this->logger->err('Tag requires an ancestor', array(
+				'requireAncestor' => \implode(',', $tagConfig['rules']['requireAncestor']),
+				'tag'             => $tag
+			));
+			return \true;
+		}
+		return \false;
+	}
+	protected function addMagicEndTag(Tag $startTag, $tagPos, $prio = 0)
+	{
+		$tagName = $startTag->getName();
+		if ($startTag->getFlags() & self::RULE_IGNORE_WHITESPACE)
+			$tagPos = $this->getMagicPos($tagPos);
+		$endTag = $this->addEndTag($tagName, $tagPos, 0, $prio);
+		$endTag->pairWith($startTag);
+		return $endTag;
+	}
+	protected function getMagicPos($tagPos)
+	{
+		while ($tagPos > $this->pos && \strpos(self::WHITESPACE, $this->text[$tagPos - 1]) !== \false)
+			--$tagPos;
+		return $tagPos;
+	}
+	protected function isFollowedByClosingTag(Tag $tag)
+	{
+		return (empty($this->tagStack)) ? \false : \end($this->tagStack)->canClose($tag);
+	}
+	protected function processTags()
+	{
+		if (empty($this->tagStack))
+			return;
+		foreach (\array_keys($this->tagsConfig) as $tagName)
+		{
+			$this->cntOpen[$tagName]  = 0;
+			$this->cntTotal[$tagName] = 0;
+		}
+		do
+		{
+			while (!empty($this->tagStack))
+			{
+				if (!$this->tagStackIsSorted)
+					$this->sortTags();
+				$this->currentTag = \array_pop($this->tagStack);
+				$this->processCurrentTag();
+			}
+			foreach ($this->openTags as $startTag)
+				$this->addMagicEndTag($startTag, $this->textLen);
+		}
+		while (!empty($this->tagStack));
+	}
+	protected function processCurrentTag()
+	{
+		if (($this->context['flags'] & self::RULE_IGNORE_TAGS)
+		 && !$this->currentTag->canClose(\end($this->openTags))
+		 && !$this->currentTag->isSystemTag())
+			$this->currentTag->invalidate();
+		$tagPos = $this->currentTag->getPos();
+		$tagLen = $this->currentTag->getLen();
+		if ($this->pos > $tagPos && !$this->currentTag->isInvalid())
+		{
+			$startTag = $this->currentTag->getStartTag();
+			if ($startTag && \in_array($startTag, $this->openTags, \true))
+			{
+				$this->addEndTag(
+					$startTag->getName(),
+					$this->pos,
+					\max(0, $tagPos + $tagLen - $this->pos)
+				)->pairWith($startTag);
+				return;
+			}
+			if ($this->currentTag->isIgnoreTag())
+			{
+				$ignoreLen = $tagPos + $tagLen - $this->pos;
+				if ($ignoreLen > 0)
+				{
+					$this->addIgnoreTag($this->pos, $ignoreLen);
+					return;
+				}
+			}
+			$this->currentTag->invalidate();
+		}
+		if ($this->currentTag->isInvalid())
+			return;
+		if ($this->currentTag->isIgnoreTag())
+			$this->outputIgnoreTag($this->currentTag);
+		elseif ($this->currentTag->isBrTag())
+		{
+			if (!($this->context['flags'] & self::RULE_PREVENT_BR))
+				$this->outputBrTag($this->currentTag);
+		}
+		elseif ($this->currentTag->isParagraphBreak())
+			$this->outputText($this->currentTag->getPos(), 0, \true);
+		elseif ($this->currentTag->isVerbatim())
+			$this->outputVerbatim($this->currentTag);
+		elseif ($this->currentTag->isStartTag())
+			$this->processStartTag($this->currentTag);
+		else
+			$this->processEndTag($this->currentTag);
+	}
+	protected function processStartTag(Tag $tag)
+	{
+		$tagName   = $tag->getName();
+		$tagConfig = $this->tagsConfig[$tagName];
+		if ($this->cntTotal[$tagName] >= $tagConfig['tagLimit'])
+		{
+			$this->logger->err(
+				'Tag limit exceeded',
+				array(
+					'tag'      => $tag,
+					'tagName'  => $tagName,
+					'tagLimit' => $tagConfig['tagLimit']
+				)
+			);
+			$tag->invalidate();
+			return;
+		}
+		if (!$this->filterTag($tag))
+		{
+			$tag->invalidate();
+			return;
+		}
+		if ($this->fosterParent($tag) || $this->closeParent($tag) || $this->closeAncestor($tag))
+			return;
+		if ($this->cntOpen[$tagName] >= $tagConfig['nestingLimit'])
+		{
+			$this->logger->err(
+				'Nesting limit exceeded',
+				array(
+					'tag'          => $tag,
+					'tagName'      => $tagName,
+					'nestingLimit' => $tagConfig['nestingLimit']
+				)
+			);
+			$tag->invalidate();
+			return;
+		}
+		if (!$this->tagIsAllowed($tagName))
+		{
+			$msg     = 'Tag is not allowed in this context';
+			$context = array('tag' => $tag, 'tagName' => $tagName);
+			if ($tag->getLen() > 0)
+				$this->logger->warn($msg, $context);
+			else
+				$this->logger->debug($msg, $context);
+			$tag->invalidate();
+			return;
+		}
+		if ($this->requireAncestor($tag))
+		{
+			$tag->invalidate();
+			return;
+		}
+		if ($tag->getFlags() & self::RULE_AUTO_CLOSE
+		 && !$tag->getEndTag()
+		 && !$this->isFollowedByClosingTag($tag))
+		{
+			$newTag = new Tag(Tag::SELF_CLOSING_TAG, $tagName, $tag->getPos(), $tag->getLen());
+			$newTag->setAttributes($tag->getAttributes());
+			$newTag->setFlags($tag->getFlags());
+			$tag = $newTag;
+		}
+		if ($tag->getFlags() & self::RULE_TRIM_FIRST_LINE
+		 && !$tag->getEndTag()
+		 && \substr($this->text, $tag->getPos() + $tag->getLen(), 1) === "\n")
+			$this->addIgnoreTag($tag->getPos() + $tag->getLen(), 1);
+		$this->outputTag($tag);
+		$this->pushContext($tag);
+		$this->createChild($tag);
+	}
+	protected function processEndTag(Tag $tag)
+	{
+		$tagName = $tag->getName();
+		if (empty($this->cntOpen[$tagName]))
+			return;
+		$closeTags = array();
+		$i = \count($this->openTags);
+		while (--$i >= 0)
+		{
+			$openTag = $this->openTags[$i];
+			if ($tag->canClose($openTag))
+				break;
+			$closeTags[] = $openTag;
+			++$this->currentFixingCost;
+		}
+		if ($i < 0)
+		{
+			$this->logger->debug('Skipping end tag with no start tag', array('tag' => $tag));
+			return;
+		}
+		$keepReopening = (bool) ($this->currentFixingCost < $this->maxFixingCost);
+		$reopenTags = array();
+		foreach ($closeTags as $openTag)
+		{
+			$openTagName = $openTag->getName();
+			if ($keepReopening)
+				if ($openTag->getFlags() & self::RULE_AUTO_REOPEN)
+					$reopenTags[] = $openTag;
+				else
+					$keepReopening = \false;
+			$tagPos = $tag->getPos();
+			if ($openTag->getFlags() & self::RULE_IGNORE_WHITESPACE)
+				$tagPos = $this->getMagicPos($tagPos);
+			$endTag = new Tag(Tag::END_TAG, $openTagName, $tagPos, 0);
+			$endTag->setFlags($openTag->getFlags());
+			$this->outputTag($endTag);
+			$this->popContext();
+		}
+		$this->outputTag($tag);
+		$this->popContext();
+		if (!empty($closeTags) && $this->currentFixingCost < $this->maxFixingCost)
+		{
+			$ignorePos = $this->pos;
+			$i = \count($this->tagStack);
+			while (--$i >= 0 && ++$this->currentFixingCost < $this->maxFixingCost)
+			{
+				$upcomingTag = $this->tagStack[$i];
+				if ($upcomingTag->getPos() > $ignorePos
+				 || $upcomingTag->isStartTag())
+					break;
+				$j = \count($closeTags);
+				while (--$j >= 0 && ++$this->currentFixingCost < $this->maxFixingCost)
+					if ($upcomingTag->canClose($closeTags[$j]))
+					{
+						\array_splice($closeTags, $j, 1);
+						if (isset($reopenTags[$j]))
+							\array_splice($reopenTags, $j, 1);
+						$ignorePos = \max(
+							$ignorePos,
+							$upcomingTag->getPos() + $upcomingTag->getLen()
+						);
+						break;
+					}
+			}
+			if ($ignorePos > $this->pos)
+				$this->outputIgnoreTag(new Tag(Tag::SELF_CLOSING_TAG, 'i', $this->pos, $ignorePos - $this->pos));
+		}
+		foreach ($reopenTags as $startTag)
+		{
+			$newTag = $this->addCopyTag($startTag, $this->pos, 0);
+			$endTag = $startTag->getEndTag();
+			if ($endTag)
+				$newTag->pairWith($endTag);
+		}
+	}
+	protected function popContext()
+	{
+		$tag = \array_pop($this->openTags);
+		--$this->cntOpen[$tag->getName()];
+		$this->context = $this->context['parentContext'];
+	}
+	protected function pushContext(Tag $tag)
+	{
+		$tagName   = $tag->getName();
+		$tagFlags  = $tag->getFlags();
+		$tagConfig = $this->tagsConfig[$tagName];
+		++$this->cntTotal[$tagName];
+		if ($tag->isSelfClosingTag())
+			return;
+		$allowed = array();
+		if ($tagFlags & self::RULE_IS_TRANSPARENT)
+			foreach ($this->context['allowed'] as $k => $v)
+				$allowed[] = $tagConfig['allowed'][$k] & $v;
+		else
+			foreach ($this->context['allowed'] as $k => $v)
+				$allowed[] = $tagConfig['allowed'][$k] & (($v & 0xFF00) | ($v >> 8));
+		$flags = $tagFlags | ($this->context['flags'] & self::RULES_INHERITANCE);
+		if ($flags & self::RULE_DISABLE_AUTO_BR)
+			$flags &= ~self::RULE_ENABLE_AUTO_BR;
+		++$this->cntOpen[$tagName];
+		$this->openTags[] = $tag;
+		$this->context = array(
+			'allowed'       => $allowed,
+			'flags'         => $flags,
+			'inParagraph'   => \false,
+			'parentContext' => $this->context
+		);
+	}
+	protected function tagIsAllowed($tagName)
+	{
+		$n = $this->tagsConfig[$tagName]['bitNumber'];
+		return (bool) ($this->context['allowed'][$n >> 3] & (1 << ($n & 7)));
+	}
+	public function addStartTag($name, $pos, $len, $prio = 0)
+	{
+		return $this->addTag(Tag::START_TAG, $name, $pos, $len, $prio);
+	}
+	public function addEndTag($name, $pos, $len, $prio = 0)
+	{
+		return $this->addTag(Tag::END_TAG, $name, $pos, $len, $prio);
+	}
+	public function addSelfClosingTag($name, $pos, $len, $prio = 0)
+	{
+		return $this->addTag(Tag::SELF_CLOSING_TAG, $name, $pos, $len, $prio);
+	}
+	public function addBrTag($pos, $prio = 0)
+	{
+		return $this->addTag(Tag::SELF_CLOSING_TAG, 'br', $pos, 0, $prio);
+	}
+	public function addIgnoreTag($pos, $len, $prio = 0)
+	{
+		return $this->addTag(Tag::SELF_CLOSING_TAG, 'i', $pos, \min($len, $this->textLen - $pos), $prio);
+	}
+	public function addParagraphBreak($pos, $prio = 0)
+	{
+		return $this->addTag(Tag::SELF_CLOSING_TAG, 'pb', $pos, 0, $prio);
+	}
+	public function addCopyTag(Tag $tag, $pos, $len, $prio = \null)
+	{
+		if (!isset($prio))
+			$prio = $tag->getSortPriority();
+		$copy = $this->addTag($tag->getType(), $tag->getName(), $pos, $len, $prio);
+		$copy->setAttributes($tag->getAttributes());
+		return $copy;
+	}
+	protected function addTag($type, $name, $pos, $len, $prio)
+	{
+		$tag = new Tag($type, $name, $pos, $len, $prio);
+		if (isset($this->tagsConfig[$name]))
+			$tag->setFlags($this->tagsConfig[$name]['rules']['flags']);
+		if (!isset($this->tagsConfig[$name]) && !$tag->isSystemTag())
+			$tag->invalidate();
+		elseif (!empty($this->tagsConfig[$name]['isDisabled']))
+		{
+			$this->logger->warn(
+				'Tag is disabled',
+				array(
+					'tag'     => $tag,
+					'tagName' => $name
+				)
+			);
+			$tag->invalidate();
+		}
+		elseif ($len < 0 || $pos < 0 || $pos + $len > $this->textLen)
+			$tag->invalidate();
+		else
+			$this->insertTag($tag);
+		return $tag;
+	}
+	protected function insertTag(Tag $tag)
+	{
+		if (!$this->tagStackIsSorted)
+			$this->tagStack[] = $tag;
+		else
+		{
+			$i = \count($this->tagStack);
+			while ($i > 0 && self::compareTags($this->tagStack[$i - 1], $tag) > 0)
+			{
+				$this->tagStack[$i] = $this->tagStack[$i - 1];
+				--$i;
+			}
+			$this->tagStack[$i] = $tag;
+		}
+	}
+	public function addTagPair($name, $startPos, $startLen, $endPos, $endLen, $prio = 0)
+	{
+		$endTag   = $this->addEndTag($name, $endPos, $endLen, -$prio);
+		$startTag = $this->addStartTag($name, $startPos, $startLen, $prio);
+		$startTag->pairWith($endTag);
+		return $startTag;
+	}
+	public function addVerbatim($pos, $len, $prio = 0)
+	{
+		return $this->addTag(Tag::SELF_CLOSING_TAG, 'v', $pos, $len, $prio);
+	}
+	protected function sortTags()
+	{
+		\usort($this->tagStack, __CLASS__ . '::compareTags');
+		$this->tagStackIsSorted = \true;
+	}
+	protected static function compareTags(Tag $a, Tag $b)
+	{
+		$aPos = $a->getPos();
+		$bPos = $b->getPos();
+		if ($aPos !== $bPos)
+			return $bPos - $aPos;
+		if ($a->getSortPriority() !== $b->getSortPriority())
+			return $b->getSortPriority() - $a->getSortPriority();
+		$aLen = $a->getLen();
+		$bLen = $b->getLen();
+		if (!$aLen || !$bLen)
+		{
+			if (!$aLen && !$bLen)
+			{
+				$order = array(
+					Tag::END_TAG          => 0,
+					Tag::SELF_CLOSING_TAG => 1,
+					Tag::START_TAG        => 2
+				);
+				return $order[$b->getType()] - $order[$a->getType()];
+			}
+			return ($aLen) ? -1 : 1;
+		}
+		return $aLen - $bLen;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Parser/BuiltInFilters.js
@@ -0,0 +1,538 @@
+/**
+* @param  {!string} str
+* @return {!string}
+*/
+function rawurlencode(str)
+{
+	return encodeURIComponent(str).replace(
+		/[!'()*]/g,
+		/**
+		* @param {!string} c
+		*/
+		function(c)
+		{
+			return '%' + c.charCodeAt(0).toString(16).toUpperCase();
+		}
+	);
+}
+
+/**
+* IMPORTANT NOTE: those filters are only meant to catch bad input and honest mistakes. They don't
+*                 match their PHP equivalent exactly and may let unwanted values through. Their
+*                 result should always be checked by PHP filters
+*
+* @const
+*/
+var BuiltInFilters =
+{
+	/**
+	* @param  {*} attrValue
+	* @return {*}
+	*/
+	filterAlnum: function(attrValue)
+	{
+		return /^[0-9A-Za-z]+$/.test(attrValue) ? attrValue : false;
+	},
+
+	/**
+	* @param  {*} attrValue
+	* @return {*}
+	*/
+	filterColor: function(attrValue)
+	{
+		return /^(?:#[0-9a-f]{3,6}|rgb\(\d{1,3}, *\d{1,3}, *\d{1,3}\)|[a-z]+)$/i.test(attrValue) ? attrValue : false;
+	},
+
+	/**
+	* @param  {*} attrValue
+	* @return {*}
+	*/
+	filterEmail: function(attrValue)
+	{
+		return /^[-\w.+]+@[-\w.]+$/.test(attrValue) ? attrValue : false;
+	},
+
+	/**
+	* @param  {*} attrValue
+	* @return {!boolean}
+	*/
+	filterFalse: function(attrValue)
+	{
+		return false;
+	},
+
+	/**
+	* @param  {*} attrValue
+	* @return {*}
+	*/
+	filterFloat: function(attrValue)
+	{
+		return /^(?:0|-?[1-9]\d*)(?:\.\d+)?(?:e[1-9]\d*)?$/i.test(attrValue) ? attrValue : false;
+	},
+
+	/**
+	* @param  {*}        attrValue Original value
+	* @param  {!Object}  map       Hash map
+	* @param  {!boolean} strict    Whether this map is strict (values with no match are invalid)
+	* @return {*}                  Filtered value, or FALSE if invalid
+	*/
+	filterHashmap: function(attrValue, map, strict)
+	{
+		if (attrValue in map)
+		{
+			return map[attrValue];
+		}
+
+		return (strict) ? false : attrValue;
+	},
+
+	/**
+	* @param  {*} attrValue
+	* @return {*}
+	*/
+	filterIdentifier: function(attrValue)
+	{
+		return /^[-\w]+$/.test(attrValue) ? attrValue : false;
+	},
+
+	/**
+	* @param  {*} attrValue
+	* @return {*}
+	*/
+	filterInt: function(attrValue)
+	{
+		return /^(?:0|-?[1-9]\d*)$/.test(attrValue) ? attrValue : false;
+	},
+
+	/**
+	* @param  {*} attrValue
+	* @return {*}
+	*/
+	filterIp: function(attrValue)
+	{
+		if (/^[\d.]+$/.test(attrValue))
+		{
+			return BuiltInFilters.filterIpv4(attrValue);
+		}
+
+		if (/^[\da-f:]+$/i.test(attrValue))
+		{
+			return BuiltInFilters.filterIpv6(attrValue);
+		}
+
+		return false;
+	},
+
+	/**
+	* @param  {*} attrValue
+	* @return {*}
+	*/
+	filterIpport: function(attrValue)
+	{
+		var m, ip;
+
+		if (m = /^\[([\da-f:]+)(\]:[1-9]\d*)$/i.exec(attrValue))
+		{
+			ip = BuiltInFilters.filterIpv6(m[1]);
+
+			if (ip === false)
+			{
+				return false;
+			}
+
+			return '[' + ip + m[2];
+		}
+
+		if (m = /^([\d.]+)(:[1-9]\d*)$/.exec(attrValue))
+		{
+			ip = BuiltInFilters.filterIpv4(m[1]);
+
+			if (ip === false)
+			{
+				return false;
+			}
+
+			return ip + m[2];
+		}
+
+		return false;
+	},
+
+	/**
+	* @param  {*} attrValue
+	* @return {*}
+	*/
+	filterIpv4: function(attrValue)
+	{
+		if (!/^\d+\.\d+\.\d+\.\d+$/.test(attrValue))
+		{
+			return false;
+		}
+
+		var i = 4, p = attrValue.split('.');
+		while (--i >= 0)
+		{
+			// NOTE: ext/filter doesn't support octal notation
+			if (p[i].charAt(0) === '0' || p[i] > 255)
+			{
+				return false;
+			}
+		}
+
+		return attrValue;
+	},
+
+	/**
+	* @param  {*} attrValue
+	* @return {*}
+	*/
+	filterIpv6: function(attrValue)
+	{
+		return /^(\d*:){2,7}\d+(?:\.\d+\.\d+\.\d+)?$/.test(attrValue) ? attrValue : false;
+	},
+
+	/**
+	* @param  {*} attrValue
+	* @param  {!Array.<!Array>}  map
+	* @return {*}
+	*/
+	filterMap: function(attrValue, map)
+	{
+		var i = -1, cnt = map.length;
+		while (++i < cnt)
+		{
+			if (map[i][0].test(attrValue))
+			{
+				return map[i][1];
+			}
+		}
+
+		return attrValue;
+	},
+
+	/**
+	* @param  {*} attrValue
+	* @return {*}
+	*/
+	filterNumber: function(attrValue)
+	{
+		return /^\d+$/.test(attrValue) ? attrValue : false;
+	},
+
+	/**
+	* @param  {*}       attrValue
+	* @param  {!number} min
+	* @param  {!number} max
+	* @param  {Logger}  logger
+	* @return {!number|boolean}
+	*/
+	filterRange: function(attrValue, min, max, logger)
+	{
+		if (!/^(?:0|-?[1-9]\d*)$/.test(attrValue))
+		{
+			return false;
+		}
+
+		attrValue = parseInt(attrValue, 10);
+
+		if (attrValue < min)
+		{
+			if (logger)
+			{
+				logger.warn(
+					'Value outside of range, adjusted up to min value',
+					{
+						'attrValue' : attrValue,
+						'min'       : min,
+						'max'       : max
+					}
+				);
+			}
+
+			return min;
+		}
+
+		if (attrValue > max)
+		{
+			if (logger)
+			{
+				logger.warn(
+					'Value outside of range, adjusted down to max value',
+					{
+						'attrValue' : attrValue,
+						'min'       : min,
+						'max'       : max
+					}
+				);
+			}
+
+			return max;
+		}
+
+		return attrValue;
+	},
+
+	/**
+	* @param  {*} attrValue
+	* @param  {!RegExp} regexp
+	* @return {*}
+	*/
+	filterRegexp: function(attrValue, regexp)
+	{
+		return regexp.test(attrValue) ? attrValue : false;
+	},
+
+	/**
+	* @param  {*} attrValue
+	* @return {*}
+	*/
+	filterSimpletext: function(attrValue)
+	{
+		return /^[-\w+., ]+$/.test(attrValue) ? attrValue : false;
+	},
+
+	/**
+	* @param  {*} attrValue
+	* @return {*}
+	*/
+	filterUint: function(attrValue)
+	{
+		return /^(?:0|[1-9]\d*)$/.test(attrValue) ? attrValue : false;
+	},
+
+	/**
+	* @param  {*} attrValue
+	* @param  {!Object} urlConfig
+	* @param  {Logger} logger
+	* @return {*}
+	*/
+	filterUrl: function(attrValue, urlConfig, logger)
+	{
+		/**
+		* Trim the URL to conform with HTML5 then parse it
+		* @link http://dev.w3.org/html5/spec/links.html#attr-hyperlink-href
+		*/
+		var p = BuiltInFilters.parseUrl(attrValue.replace(/^\s+/, '').replace(/\s+$/, ''));
+
+		var error = BuiltInFilters.validateUrl(urlConfig, p);
+		if (error)
+		{
+			if (logger)
+			{
+				p['attrValue'] = attrValue;
+				logger.err(error, p);
+			}
+
+			return false;
+		}
+
+		return BuiltInFilters.rebuildUrl(urlConfig, p);
+	},
+
+	/**
+	* Parse a URL and return its components
+	*
+	* Similar to PHP's own parse_url() except that all parts are always returned
+	*
+	* @param  {!string} url Original URL
+	* @return {!Object}
+	*/
+	parseUrl: function(url)
+	{
+		var regexp = /^(?:([a-z][-+.\w]*):)?(?:\/\/(?:([^:\/?#]*)(?::([^\/?#]*)?)?@)?(?:(\[[a-f\d:]+\]|[^:\/?#]+)(?::(\d*))?)?(?![^\/?#]))?([^?#]*)(\?[^#]*)?(#.*)?$/i;
+
+		// NOTE: this regexp always matches because of the last three captures
+		var m = regexp['exec'](url),
+			parts = {},
+			tokens = ['scheme', 'user', 'pass', 'host', 'port', 'path', 'query', 'fragment'];
+		tokens.forEach(
+			function(name, i)
+			{
+				parts[name] = (m[i + 1] > '') ? m[i + 1] : '';
+			}
+		);
+
+		/**
+		* @link http://tools.ietf.org/html/rfc3986#section-3.1
+		*
+		* 'An implementation should accept uppercase letters as equivalent to lowercase in
+		* scheme names (e.g., allow "HTTP" as well as "http") for the sake of robustness but
+		* should only produce lowercase scheme names for consistency.'
+		*/
+		parts['scheme'] = parts['scheme'].toLowerCase();
+
+		/**
+		* Normalize the domain label separators and remove trailing dots
+		* @link http://url.spec.whatwg.org/#domain-label-separators
+		*/
+		parts['host'] = parts['host'].replace(/[\u3002\uff0e\uff61]/g, '.').replace(/\.+$/g, '');
+
+		// Test whether host has non-ASCII characters and punycode it if possible
+		if (/[^\x00-\x7F]/.test(parts['host']) && typeof punycode !== 'undefined')
+		{
+			parts['host'] = punycode.toASCII(parts['host']);
+		}
+
+		return parts;
+	},
+
+	/**
+	* Rebuild a parsed URL
+	*
+	* @param  {!Object} urlConfig
+	* @param  {!Object} p
+	* @return {!string}
+	*/
+	rebuildUrl: function(urlConfig, p)
+	{
+		var url = '';
+		if (p['scheme'] !== '')
+		{
+			url += p['scheme'] + ':';
+		}
+		if (p['host'] === '')
+		{
+			// Allow the file: scheme to not have a host and ensure it starts with slashes
+			if (p['scheme'] === 'file')
+			{
+				url += '//';
+			}
+		}
+		else
+		{
+			url += '//';
+
+			// Add the credentials if applicable
+			if (p['user'] !== '')
+			{
+				// Reencode the credentials in case there are invalid chars in them, or suspicious
+				// characters such as : or @ that could confuse a browser into connecting to the
+				// wrong host (or at least, to a host that is different than the one we thought)
+				url += rawurlencode(decodeURIComponent(p['user']));
+
+				if (p['pass'] !== '')
+				{
+					url += ':' + rawurlencode(decodeURIComponent(p['pass']));
+				}
+
+				url += '@';
+			}
+
+			url += p['host'];
+
+			// Append the port number (note that as per the regexp it can only contain digits)
+			if (p['port'] !== '')
+			{
+				url += ':' + p['port'];
+			}
+		}
+
+		// Build the path, including the query and fragment parts
+		var path = p['path'] + p['query'] + p['fragment'];
+
+		/**
+		* "For consistency, URI producers and normalizers should use uppercase hexadecimal digits
+		* for all percent- encodings."
+		*
+		* @link http://tools.ietf.org/html/rfc3986#section-2.1
+		*/
+		path = path.replace(
+			/%.?[a-f]/,
+			function (m)
+			{
+				return m[0].toUpperCase();
+			},
+			path
+		);
+
+		// Append the sanitized path to the URL
+		url += BuiltInFilters.sanitizeUrl(path);
+
+		// Replace the first colon if there's no scheme and it could potentially be interpreted as
+		// the scheme separator
+		if (!p['scheme'])
+		{
+			url = url.replace(/^([^\/]*):/, '$1%3A', url);
+		}
+
+		return url;
+	},
+
+	/**
+	* Sanitize a URL for safe use regardless of context
+	*
+	* This method URL-encodes some sensitive characters in case someone would want to use the URL in
+	* some JavaScript thingy, or in CSS. We also encode characters that are not allowed in the path
+	* of a URL as defined in RFC 3986 appendix A, including percent signs that are not immediately
+	* followed by two hex digits.
+	*
+	* " and ' to prevent breaking out of quotes (JavaScript or otherwise)
+	* ( and ) to prevent the use of functions in JavaScript (eval()) or CSS (expression())
+	* < and > to prevent breaking out of <script>
+	* \r and \n because they're illegal in JavaScript
+	* [ and ] because the W3 validator rejects them and they "should" be escaped as per RFC 3986
+	* Non-ASCII characters as per RFC 3986
+	* Control codes and spaces, as per RFC 3986
+	*
+	* @link http://sla.ckers.org/forum/read.php?2,51478
+	* @link http://timelessrepo.com/json-isnt-a-javascript-subset
+	* @link http://www.ietf.org/rfc/rfc3986.txt
+	* @link http://stackoverflow.com/a/1547922
+	* @link http://tools.ietf.org/html/rfc3986#appendix-A
+	*
+	* @param  {!string} url Original URL
+	* @return {!string}     Sanitized URL
+	*/
+	sanitizeUrl: function(url)
+	{
+		return url.replace(/[^\u0020-\u007E]+/g, encodeURIComponent).replace(/%(?![0-9A-Fa-f]{2})|[^!#-&*-;=?-Z_a-z~]/g, escape);
+	},
+
+	/**
+	* Validate a parsed URL
+	*
+	* @param  {!Object} urlConfig
+	* @param  {!Object} p
+	* @return {string|undefined}
+	*/
+	validateUrl: function(urlConfig, p)
+	{
+		if (p['scheme'] !== '' && !urlConfig.allowedSchemes.test(p['scheme']))
+		{
+			return 'URL scheme is not allowed';
+		}
+
+		if (p['host'] === '')
+		{
+			// Reject malformed URLs such as http:///example.org but allow schemeless paths
+			if (p['scheme'] !== 'file' && p['scheme'] !== '')
+			{
+				return 'Missing host';
+			}
+		}
+		else
+		{
+			/**
+			* Test whether the host is valid
+			* @link http://tools.ietf.org/html/rfc1035#section-2.3.1
+			* @link http://tools.ietf.org/html/rfc1123#section-2
+			*/
+			var regexp = /^(?!-)[-a-z0-9]{0,62}[a-z0-9](?:\.(?!-)[-a-z0-9]{0,62}[a-z0-9])*$/i;
+			if (!regexp.test(p['host']))
+			{
+				// If the host invalid, retest as an IPv4 and IPv6 address (IPv6 in brackets)
+				if (!BuiltInFilters.filterIpv4(p['host'])
+				 && !BuiltInFilters.filterIpv6(p['host'].replace(/^\[(.*)\]$/, '$1', p['host'])))
+				{
+					return 'URL host is invalid';
+				}
+			}
+
+			if ((urlConfig.disallowedHosts && urlConfig.disallowedHosts.test(p['host']))
+			 || (urlConfig.restrictedHosts && !urlConfig.restrictedHosts.test(p['host'])))
+			{
+				return 'URL host is not allowed';
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Parser/BuiltInFilters.php
@@ -0,0 +1,246 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Parser;
+class BuiltInFilters
+{
+	public static function filterAlnum($attrValue)
+	{
+		return \filter_var($attrValue, \FILTER_VALIDATE_REGEXP, array(
+			'options' => array('regexp' => '/^[0-9A-Za-z]+$/D')
+		));
+	}
+	public static function filterColor($attrValue)
+	{
+		return \filter_var($attrValue, \FILTER_VALIDATE_REGEXP, array(
+			'options' => array(
+				'regexp' => '/^(?>#[0-9a-f]{3,6}|rgb\\(\\d{1,3}, *\\d{1,3}, *\\d{1,3}\\)|[a-z]+)$/Di'
+			)
+		));
+	}
+	public static function filterEmail($attrValue)
+	{
+		return \filter_var($attrValue, \FILTER_VALIDATE_EMAIL);
+	}
+	public static function filterFalse($attrValue)
+	{
+		return \false;
+	}
+	public static function filterFloat($attrValue)
+	{
+		return \filter_var($attrValue, \FILTER_VALIDATE_FLOAT);
+	}
+	public static function filterHashmap($attrValue, array $map, $strict)
+	{
+		if (isset($map[$attrValue]))
+			return $map[$attrValue];
+		return ($strict) ? \false : $attrValue;
+	}
+	public static function filterIdentifier($attrValue)
+	{
+		return \filter_var($attrValue, \FILTER_VALIDATE_REGEXP, array(
+			'options' => array('regexp' => '/^[-0-9A-Za-z_]+$/D')
+		));
+	}
+	public static function filterInt($attrValue)
+	{
+		return \filter_var($attrValue, \FILTER_VALIDATE_INT);
+	}
+	public static function filterIp($attrValue)
+	{
+		return \filter_var($attrValue, \FILTER_VALIDATE_IP);
+	}
+	public static function filterIpport($attrValue)
+	{
+		if (\preg_match('/^\\[([^\\]]+)(\\]:[1-9][0-9]*)$/D', $attrValue, $m))
+		{
+			$ip = self::filterIpv6($m[1]);
+			if ($ip === \false)
+				return \false;
+			return '[' . $ip . $m[2];
+		}
+		if (\preg_match('/^([^:]+)(:[1-9][0-9]*)$/D', $attrValue, $m))
+		{
+			$ip = self::filterIpv4($m[1]);
+			if ($ip === \false)
+				return \false;
+			return $ip . $m[2];
+		}
+		return \false;
+	}
+	public static function filterIpv4($attrValue)
+	{
+		return \filter_var($attrValue, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4);
+	}
+	public static function filterIpv6($attrValue)
+	{
+		return \filter_var($attrValue, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6);
+	}
+	public static function filterMap($attrValue, array $map)
+	{
+		foreach ($map as $pair)
+			if (\preg_match($pair[0], $attrValue))
+				return $pair[1];
+		return $attrValue;
+	}
+	public static function filterNumber($attrValue)
+	{
+		return \filter_var($attrValue, \FILTER_VALIDATE_REGEXP, array(
+			'options' => array('regexp' => '/^[0-9]+$/D')
+		));
+	}
+	public static function filterRange($attrValue, $min, $max, Logger $logger = \null)
+	{
+		$attrValue = \filter_var($attrValue, \FILTER_VALIDATE_INT);
+		if ($attrValue === \false)
+			return \false;
+		if ($attrValue < $min)
+		{
+			if (isset($logger))
+				$logger->warn(
+					'Value outside of range, adjusted up to min value',
+					array(
+						'attrValue' => $attrValue,
+						'min'       => $min,
+						'max'       => $max
+					)
+				);
+			return $min;
+		}
+		if ($attrValue > $max)
+		{
+			if (isset($logger))
+				$logger->warn(
+					'Value outside of range, adjusted down to max value',
+					array(
+						'attrValue' => $attrValue,
+						'min'       => $min,
+						'max'       => $max
+					)
+				);
+			return $max;
+		}
+		return $attrValue;
+	}
+	public static function filterRegexp($attrValue, $regexp)
+	{
+		return \filter_var($attrValue, \FILTER_VALIDATE_REGEXP, array(
+			'options' => array('regexp' => $regexp)
+		));
+	}
+	public static function filterSimpletext($attrValue)
+	{
+		return \filter_var($attrValue, \FILTER_VALIDATE_REGEXP, array(
+			'options' => array('regexp' => '/^[- +,.0-9A-Za-z_]+$/D')
+		));
+	}
+	public static function filterUint($attrValue)
+	{
+		return \filter_var($attrValue, \FILTER_VALIDATE_INT, array(
+			'options' => array('min_range' => 0)
+		));
+	}
+	public static function filterUrl($attrValue, array $urlConfig, Logger $logger = \null)
+	{
+		$p = self::parseUrl(\trim($attrValue));
+		$error = self::validateUrl($urlConfig, $p);
+		if (!empty($error))
+		{
+			if (isset($logger))
+			{
+				$p['attrValue'] = $attrValue;
+				$logger->err($error, $p);
+			}
+			return \false;
+		}
+		return self::rebuildUrl($p);
+	}
+	protected static function parseUrl($url)
+	{
+		$regexp = '(^(?:([a-z][-+.\\w]*):)?(?://(?:([^:/?#]*)(?::([^/?#]*)?)?@)?(?:(\\[[a-f\\d:]+\\]|[^:/?#]+)(?::(\\d*))?)?(?![^/?#]))?([^?#]*)(\\?[^#]*)?(#.*)?$)Di';
+		\preg_match($regexp, $url, $m);
+		$parts  = array();
+		$tokens = array('scheme', 'user', 'pass', 'host', 'port', 'path', 'query', 'fragment');
+		foreach ($tokens as $i => $name)
+			$parts[$name] = (isset($m[$i + 1])) ? $m[$i + 1] : '';
+		$parts['scheme'] = \strtolower($parts['scheme']);
+		$parts['host'] = \rtrim(\preg_replace("/\xE3\x80\x82|\xEF(?:\xBC\x8E|\xBD\xA1)/s", '.', $parts['host']), '.');
+		if (\preg_match('#[^[:ascii:]]#', $parts['host']) && \function_exists('idn_to_ascii'))
+			$parts['host'] = \idn_to_ascii($parts['host']);
+		return $parts;
+	}
+	protected static function rebuildUrl(array $p)
+	{
+		$url = '';
+		if ($p['scheme'] !== '')
+			$url .= $p['scheme'] . ':';
+		if ($p['host'] === '')
+		{
+			if ($p['scheme'] === 'file')
+				$url .= '//';
+		}
+		else
+		{
+			$url .= '//';
+			if ($p['user'] !== '')
+			{
+				$url .= \rawurlencode(\urldecode($p['user']));
+				if ($p['pass'] !== '')
+					$url .= ':' . \rawurlencode(\urldecode($p['pass']));
+				$url .= '@';
+			}
+			$url .= $p['host'];
+			if ($p['port'] !== '')
+				$url .= ':' . $p['port'];
+		}
+		$path = $p['path'] . $p['query'] . $p['fragment'];
+		$path = \preg_replace_callback(
+			'/%.?[a-f]/',
+			function ($m)
+			{
+				return \strtoupper($m[0]);
+			},
+			$path
+		);
+		$url .= self::sanitizeUrl($path);
+		if (!$p['scheme'])
+			$url = \preg_replace('#^([^/]*):#', '$1%3A', $url);
+		return $url;
+	}
+	public static function sanitizeUrl($url)
+	{
+		return \preg_replace_callback(
+			'/%(?![0-9A-Fa-f]{2})|[^!#-&*-;=?-Z_a-z]/S',
+			function ($m)
+			{
+				return \rawurlencode($m[0]);
+			},
+			$url
+		);
+	}
+	protected static function validateUrl(array $urlConfig, array $p)
+	{
+		if ($p['scheme'] !== '' && !\preg_match($urlConfig['allowedSchemes'], $p['scheme']))
+			return 'URL scheme is not allowed';
+		if ($p['host'] === '')
+		{
+			if ($p['scheme'] !== 'file' && $p['scheme'] !== '')
+				return 'Missing host';
+		}
+		else
+		{
+			$regexp = '/^(?!-)[-a-z0-9]{0,62}[a-z0-9](?:\\.(?!-)[-a-z0-9]{0,62}[a-z0-9])*$/i';
+			if (!\preg_match($regexp, $p['host']))
+				if (!self::filterIpv4($p['host'])
+				 && !self::filterIpv6(\preg_replace('/^\\[(.*)\\]$/', '$1', $p['host'])))
+					return 'URL host is invalid';
+			if ((isset($urlConfig['disallowedHosts']) && \preg_match($urlConfig['disallowedHosts'], $p['host']))
+			 || (isset($urlConfig['restrictedHosts']) && !\preg_match($urlConfig['restrictedHosts'], $p['host'])))
+				return 'URL host is not allowed';
+		}
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Parser/Logger.js
@@ -0,0 +1,174 @@
+/**
+* @constructor
+*/
+function Logger()
+{
+}
+
+/**
+* @type {string} Name of the attribute being processed
+*/
+Logger.prototype.attrName;
+
+/**
+* @type {!Object.<string,!Array>} 2D array of [<log type> => [<callbacks>]]
+*/
+Logger.prototype.callbacks = {};
+
+/**
+* @type {!Array.<!Array>} Log entries in the form [[<type>,<msg>,<context>]]
+*/
+Logger.prototype.logs = [];
+
+/**
+* @type {Tag} Tag being processed
+*/
+Logger.prototype.tag;
+
+/**
+* Add a log entry
+*
+* @param  {!string}  type    Log type
+* @param  {!string}  msg     Log message
+* @param  {!Object=} context Log context
+*/
+Logger.prototype.add = function(type, msg, context)
+{
+	context = context || {};
+
+	if (!('attrName' in context) && this.attrName)
+	{
+		context['attrName'] = this.attrName;
+	}
+
+	if (!('tag' in context) && this.tag)
+	{
+		context['tag'] = this.tag;
+	}
+
+	// Execute callbacks
+	if (this.callbacks[type])
+	{
+		this.callbacks[type].forEach(function(callback)
+		{
+			callback(msg, context);
+		});
+	}
+
+	this.logs.push([type, msg, context]);
+}
+
+/**
+* Clear the log
+*/
+Logger.prototype.clear = function()
+{
+	this.logs = [];
+	this.unsetAttribute();
+	this.unsetTag();
+}
+
+/**
+* Return the logs
+*
+* @return {!Object}
+*/
+Logger.prototype['get'] = function()
+{
+	return this.logs;
+}
+
+/**
+* Attach a callback to be executed when a message of given type is logged
+*
+* @param {!string}   type     Log type
+* @param {!Function} callback Callback
+*/
+Logger.prototype['on'] = function(type, callback)
+{
+	this.callbacks[type].push(callback);
+}
+
+/**
+* Record the name of the attribute being processed
+*
+* @param  {!string} attrName
+*/
+Logger.prototype.setAttribute = function(attrName)
+{
+	this.attrName = attrName;
+}
+
+/**
+* Record the tag being processed
+*
+* @param  {!Tag} tag
+*/
+Logger.prototype.setTag = function(tag)
+{
+	this.tag = tag;
+}
+
+/**
+* Unset the name of the attribute being processed
+*/
+Logger.prototype.unsetAttribute = function()
+{
+	delete this.attrName;
+}
+
+/**
+* Unset the tag being processed
+*/
+Logger.prototype.unsetTag = function()
+{
+	delete this.tag;
+}
+
+//==========================================================================
+// Log levels
+//==========================================================================
+
+/**
+* Add a "debug" type log entry
+*
+* @param  {!string}  msg     Log message
+* @param  {!Object=} context Log context
+*/
+Logger.prototype.debug = function(msg, context)
+{
+	this.add('debug', msg, context);
+}
+
+/**
+* Add an "err" type log entry
+*
+* @param  {!string}  msg     Log message
+* @param  {!Object=} context Log context
+*/
+Logger.prototype.err = function(msg, context)
+{
+	this.add('err', msg, context);
+}
+
+/**
+* Add an "info" type log entry
+*
+* @param  {!string}  msg     Log message
+* @param  {!Object=} context Log context
+*/
+Logger.prototype.info = function(msg, context)
+{
+	this.add('info', msg, context);
+}
+
+/**
+* Add a "warn" type log entry
+*
+* @param  {!string}  msg     Log message
+* @param  {!Object=} context Log context
+*/
+Logger.prototype.warn = function(msg, context)
+{
+	this.add('warn', msg, context);
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Parser/Logger.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Parser;
+use InvalidArgumentException;
+use s9e\TextFormatter\Parser;
+class Logger
+{
+	protected $attrName;
+	protected $logs = array();
+	protected $tag;
+	protected function add($type, $msg, array $context)
+	{
+		if (!isset($context['attrName']) && isset($this->attrName))
+			$context['attrName'] = $this->attrName;
+		if (!isset($context['tag']) && isset($this->tag))
+			$context['tag'] = $this->tag;
+		$this->logs[] = array($type, $msg, $context);
+	}
+	public function clear()
+	{
+		$this->logs = array();
+		$this->unsetAttribute();
+		$this->unsetTag();
+	}
+	public function get()
+	{
+		return $this->logs;
+	}
+	public function setAttribute($attrName)
+	{
+		$this->attrName = $attrName;
+	}
+	public function setTag(Tag $tag)
+	{
+		$this->tag = $tag;
+	}
+	public function unsetAttribute()
+	{
+		unset($this->attrName);
+	}
+	public function unsetTag()
+	{
+		unset($this->tag);
+	}
+	public function debug($msg, array $context = array())
+	{
+		$this->add('debug', $msg, $context);
+	}
+	public function err($msg, array $context = array())
+	{
+		$this->add('err', $msg, $context);
+	}
+	public function info($msg, array $context = array())
+	{
+		$this->add('info', $msg, $context);
+	}
+	public function warn($msg, array $context = array())
+	{
+		$this->add('warn', $msg, $context);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Parser/NullLogger.js
@@ -0,0 +1,51 @@
+/**@constructor*/function Logger(){}Logger.prototype={add:/**
+* Add a log entry
+*
+* @param  {!string}  type    Log type
+* @param  {!string}  msg     Log message
+* @param  {!Object=} context Log context
+*/
+function(type, msg, context){},clear:/**
+* Clear the log
+*/
+function(){},setAttribute:/**
+* Record the name of the attribute being processed
+*
+* @param  {!string} attrName
+*/
+function(attrName){},setTag:/**
+* Record the tag being processed
+*
+* @param  {!Tag} tag
+*/
+function(tag){},unsetAttribute:/**
+* Unset the name of the attribute being processed
+*/
+function(){},unsetTag:/**
+* Unset the tag being processed
+*/
+function(){},debug:/**
+* Add a "debug" type log entry
+*
+* @param  {!string}  msg     Log message
+* @param  {!Object=} context Log context
+*/
+function(msg, context){},err:/**
+* Add an "err" type log entry
+*
+* @param  {!string}  msg     Log message
+* @param  {!Object=} context Log context
+*/
+function(msg, context){},info:/**
+* Add an "info" type log entry
+*
+* @param  {!string}  msg     Log message
+* @param  {!Object=} context Log context
+*/
+function(msg, context){},warn:/**
+* Add a "warn" type log entry
+*
+* @param  {!string}  msg     Log message
+* @param  {!Object=} context Log context
+*/
+function(msg, context){}}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Parser/Tag.js
@@ -0,0 +1,475 @@
+/**
+* @constructor
+*
+* @param {!number} type     Tag's type
+* @param {!string} name     Name of the tag
+* @param {!number} pos      Position of the tag in the text
+* @param {!number} len      Length of text consumed by the tag
+* @param {number}  priority This tag's sorting tiebreaker
+*/
+function Tag(type, name, pos, len, priority)
+{
+	this.type = +type;
+	this.name = name;
+	this.pos  = +pos;
+	this.len  = +len;
+	if (typeof priority !== 'undefined')
+	{
+		this.sortPriority = +priority;
+	}
+
+	this.attributes = {};
+	this.cascade    = [];
+
+	// Invalidate this tag now if any value is not a number, they could wreck
+	// havoc in other parts of the program
+	if (isNaN(type + pos + len))
+	{
+		this.invalidate();
+	}
+}
+
+/** @const */
+Tag.START_TAG = 1;
+
+/** @const */
+Tag.END_TAG = 2;
+
+/** @const */
+Tag.SELF_CLOSING_TAG = 3;
+
+/**
+* @type {!Object} Dictionary of attributes
+*/
+Tag.prototype.attributes;
+
+/**
+* @type {!Array.<!Tag>} List of tags that are invalidated when this tag is invalidated
+*/
+Tag.prototype.cascade;
+
+/**
+* @type {Tag} End tag that unconditionally ends this start tag
+*/
+Tag.prototype.endTag;
+
+/**
+* @type {!boolean} Whether this tag is be invalid
+*/
+Tag.prototype.invalid = false;
+
+/**
+* @type {!number} Length of text consumed by this tag
+*/
+Tag.prototype.len;
+
+/**
+* @type {!string} Name of this tag
+*/
+Tag.prototype.name;
+
+/**
+* @type {!number} Position of this tag in the text
+*/
+Tag.prototype.pos;
+
+/**
+* @type {!number} Tiebreaker used when sorting identical tags
+*/
+Tag.prototype.sortPriority;
+
+/**
+* @type {Tag} Start tag that is unconditionally closed this end tag
+*/
+Tag.prototype.startTag;
+
+/**
+* @type {!number} Tag type
+*/
+Tag.prototype.type;
+
+/**
+* Add a set of flags to this tag's
+*
+* @param {!number} flags
+*/
+Tag.prototype.addFlags = function(flags)
+{
+	this.flags |= flags;
+};
+
+/**
+* Set given tag to be invalidated if this tag is invalidated
+*
+* @param {!Tag} tag
+*/
+Tag.prototype.cascadeInvalidationTo = function(tag)
+{
+	this.cascade.push(tag);
+
+	// If this tag is already invalid, cascade it now
+	if (this.invalid)
+	{
+		tag.invalidate();
+	}
+};
+
+/**
+* Invalidate this tag, as well as tags bound to this tag
+*/
+Tag.prototype.invalidate = function()
+{
+	// If this tag is already invalid, we can return now. This prevent infinite loops
+	if (this.invalid)
+	{
+		return;
+	}
+
+	this.invalid = true;
+
+	this.cascade.forEach(
+		/**
+		* @param {!Tag} tag
+		*/
+		function(tag)
+		{
+			tag.invalidate();
+		}
+	);
+}
+
+/**
+* Pair this tag with given tag
+*
+* @param {!Tag} tag
+*/
+Tag.prototype.pairWith = function(tag)
+{
+	if (this.name === tag.name)
+	{
+		if (this.type === Tag.START_TAG
+		 && tag.type  === Tag.END_TAG
+		 && tag.pos   >=  this.pos)
+		{
+			this.endTag  = tag;
+			tag.startTag = this;
+
+			this.cascadeInvalidationTo(tag);
+		}
+		else if (this.type === Tag.END_TAG
+		      && tag.type  === Tag.START_TAG
+		      && tag.pos   <=  this.pos)
+		{
+			this.startTag = tag;
+			tag.endTag    = this;
+		}
+	}
+}
+
+/**
+* Remove a set of flags from this tag's
+*
+* @param {!number} flags
+*/
+Tag.prototype.removeFlags = function(flags)
+{
+	this.flags &= ~flags;
+};
+
+/**
+* Set the bitfield of boolean rules that apply to this tag
+*
+* @param  {!number} flags Bitfield of boolean rules that apply to this tag
+*/
+Tag.prototype.setFlags = function(flags)
+{
+	this.flags = flags;
+}
+
+/**
+* Set this tag's tiebreaker
+*
+* @param  {!number} sortPriority
+*/
+Tag.prototype.setSortPriority = function(sortPriority)
+{
+	this.sortPriority = sortPriority;
+}
+
+//==========================================================================
+// Getters
+//==========================================================================
+
+/**
+* Return this tag's attributes
+*
+* @return {!Object}
+*/
+Tag.prototype.getAttributes = function()
+{
+	var attributes = {};
+	for (var attrName in this.attributes)
+	{
+		attributes[attrName] = this.attributes[attrName];
+	}
+
+	return attributes;
+}
+
+/**
+* Return this tag's end tag
+*
+* @return {Tag} This tag's end tag
+*/
+Tag.prototype.getEndTag = function()
+{
+	return this.endTag;
+}
+
+/**
+* Return the bitfield of boolean rules that apply to this tag
+*
+* @return {!number}
+*/
+Tag.prototype.getFlags = function()
+{
+	return this.flags;
+}
+
+/**
+* Return the length of text consumed by this tag
+*
+* @return {!number}
+*/
+Tag.prototype.getLen = function()
+{
+	return this.len;
+}
+
+/**
+* Return this tag's name
+*
+* @return {!string}
+*/
+Tag.prototype.getName = function()
+{
+	return this.name;
+}
+
+/**
+* Return this tag's position
+*
+* @return {!number}
+*/
+Tag.prototype.getPos = function()
+{
+	return this.pos;
+}
+
+/**
+* Return this tag's tiebreaker
+*
+* @return {!number}
+*/
+Tag.prototype.getSortPriority = function()
+{
+	return this.sortPriority;
+}
+
+/**
+* Return this tag's start tag
+*
+* @return {Tag} This tag's start tag
+*/
+Tag.prototype.getStartTag = function()
+{
+	return this.startTag;
+}
+
+/**
+* Return this tag's type
+*
+* @return {!number}
+*/
+Tag.prototype.getType = function()
+{
+	return this.type;
+}
+
+//==========================================================================
+// Tag's status
+//==========================================================================
+
+/**
+* Test whether this tag can close given start tag
+*
+* @param  {!Tag} startTag
+* @return {!boolean}
+*/
+Tag.prototype.canClose = function(startTag)
+{
+	if (this.invalid
+	 || this.name !== startTag.name
+	 || startTag.type !== Tag.START_TAG
+	 || this.type !== Tag.END_TAG
+	 || this.pos < startTag.pos
+	 || (this.startTag && this.startTag !== startTag)
+	 || (startTag.endTag && startTag.endTag !== this))
+	{
+		return false;
+	}
+
+	return true;
+}
+
+/**
+* Test whether this tag is a br tag
+*
+* @return {!boolean}
+*/
+Tag.prototype.isBrTag = function()
+{
+	return (this.name === 'br');
+}
+
+/**
+* Test whether this tag is an end tag (self-closing tags inclusive)
+*
+* @return {!boolean}
+*/
+Tag.prototype.isEndTag = function()
+{
+	return !!(this.type & Tag.END_TAG);
+}
+
+/**
+* Test whether this tag is an ignore tag
+*
+* @return {!boolean}
+*/
+Tag.prototype.isIgnoreTag = function()
+{
+	return (this.name === 'i');
+}
+
+/**
+* Test whether this tag is invalid
+*
+* @return {!boolean}
+*/
+Tag.prototype.isInvalid = function()
+{
+	return this.invalid;
+}
+
+/**
+* Test whether this tag represents a paragraph break
+*
+* @return {!boolean}
+*/
+Tag.prototype.isParagraphBreak = function()
+{
+	return (this.name === 'pb');
+}
+
+/**
+* Test whether this tag is a self-closing tag
+*
+* @return {!boolean}
+*/
+Tag.prototype.isSelfClosingTag = function()
+{
+	return (this.type === Tag.SELF_CLOSING_TAG);
+}
+
+/**
+* Test whether this tag is a special tag: "br", "i", "pb" or "v"
+*
+* @return {!boolean}
+*/
+Tag.prototype.isSystemTag = function()
+{
+	return ('br i pb v'.indexOf(this.name) > -1);
+}
+
+/**
+* Test whether this tag is a start tag (self-closing tags inclusive)
+*
+* @return {!boolean}
+*/
+Tag.prototype.isStartTag = function()
+{
+	return !!(this.type & Tag.START_TAG);
+}
+
+/**
+* Test whether this tag represents verbatim text
+*
+* @return {!boolean}
+*/
+Tag.prototype.isVerbatim = function()
+{
+	return (this.name === 'v');
+}
+
+//==========================================================================
+// Attributes handling
+//==========================================================================
+
+/**
+* Return the value of given attribute
+*
+* @param  {!string} attrName
+* @return {!string}
+*/
+Tag.prototype.getAttribute = function(attrName)
+{
+	return this.attributes[attrName];
+}
+
+/**
+* Return whether given attribute is set
+*
+* @param  {!string} attrName
+* @return {!boolean}
+*/
+Tag.prototype.hasAttribute = function(attrName)
+{
+	return (attrName in this.attributes);
+}
+
+/**
+* Remove given attribute
+*
+* @param {!string} attrName
+*/
+Tag.prototype.removeAttribute = function(attrName)
+{
+	delete this.attributes[attrName];
+}
+
+/**
+* Set the value of an attribute
+*
+* @param {!string} attrName  Attribute's name
+* @param {*}       attrValue Attribute's value
+*/
+Tag.prototype.setAttribute = function(attrName, attrValue)
+{
+	this.attributes[attrName] = attrValue;
+}
+
+/**
+* Set all of this tag's attributes at once
+*
+* @param {!Object} attributes
+*/
+Tag.prototype.setAttributes = function(attributes)
+{
+	this.attributes = {}
+
+	for (var attrName in attributes)
+	{
+		this.attributes[attrName] = attributes[attrName];
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Parser/Tag.php
@@ -0,0 +1,187 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Parser;
+class Tag
+{
+	const START_TAG = 1;
+	const END_TAG = 2;
+	const SELF_CLOSING_TAG = 3;
+	protected $attributes = array();
+	protected $cascade = array();
+	protected $endTag = \null;
+	protected $flags = 0;
+	protected $invalid = \false;
+	protected $len;
+	protected $name;
+	protected $pos;
+	protected $sortPriority;
+	protected $startTag = \null;
+	protected $type;
+	public function __construct($type, $name, $pos, $len, $priority = 0)
+	{
+		$this->type = (int) $type;
+		$this->name = $name;
+		$this->pos  = (int) $pos;
+		$this->len  = (int) $len;
+		$this->sortPriority = (int) $priority;
+	}
+	public function addFlags($flags)
+	{
+		$this->flags |= $flags;
+	}
+	public function cascadeInvalidationTo(Tag $tag)
+	{
+		$this->cascade[] = $tag;
+		if ($this->invalid)
+			$tag->invalidate();
+	}
+	public function invalidate()
+	{
+		if ($this->invalid)
+			return;
+		$this->invalid = \true;
+		foreach ($this->cascade as $tag)
+			$tag->invalidate();
+	}
+	public function pairWith(Tag $tag)
+	{
+		if ($this->name === $tag->name)
+			if ($this->type === self::START_TAG
+			 && $tag->type  === self::END_TAG
+			 && $tag->pos   >=  $this->pos)
+			{
+				$this->endTag  = $tag;
+				$tag->startTag = $this;
+				$this->cascadeInvalidationTo($tag);
+			}
+			elseif ($this->type === self::END_TAG
+			     && $tag->type  === self::START_TAG
+			     && $tag->pos   <=  $this->pos)
+			{
+				$this->startTag = $tag;
+				$tag->endTag    = $this;
+			}
+	}
+	public function removeFlags($flags)
+	{
+		$this->flags &= ~$flags;
+	}
+	public function setFlags($flags)
+	{
+		$this->flags = $flags;
+	}
+	public function setSortPriority($sortPriority)
+	{
+		$this->sortPriority = $sortPriority;
+		\trigger_error('setSortPriority() is deprecated. Set the priority when calling adding the tag instead. See http://s9etextformatter.readthedocs.io/Internals/API_changes/#070', \E_USER_DEPRECATED);
+	}
+	public function getAttributes()
+	{
+		return $this->attributes;
+	}
+	public function getEndTag()
+	{
+		return $this->endTag;
+	}
+	public function getFlags()
+	{
+		return $this->flags;
+	}
+	public function getLen()
+	{
+		return $this->len;
+	}
+	public function getName()
+	{
+		return $this->name;
+	}
+	public function getPos()
+	{
+		return $this->pos;
+	}
+	public function getSortPriority()
+	{
+		return $this->sortPriority;
+	}
+	public function getStartTag()
+	{
+		return $this->startTag;
+	}
+	public function getType()
+	{
+		return $this->type;
+	}
+	public function canClose(Tag $startTag)
+	{
+		if ($this->invalid
+		 || $this->name !== $startTag->name
+		 || $startTag->type !== self::START_TAG
+		 || $this->type !== self::END_TAG
+		 || $this->pos < $startTag->pos
+		 || ($this->startTag && $this->startTag !== $startTag)
+		 || ($startTag->endTag && $startTag->endTag !== $this))
+			return \false;
+		return \true;
+	}
+	public function isBrTag()
+	{
+		return ($this->name === 'br');
+	}
+	public function isEndTag()
+	{
+		return (bool) ($this->type & self::END_TAG);
+	}
+	public function isIgnoreTag()
+	{
+		return ($this->name === 'i');
+	}
+	public function isInvalid()
+	{
+		return $this->invalid;
+	}
+	public function isParagraphBreak()
+	{
+		return ($this->name === 'pb');
+	}
+	public function isSelfClosingTag()
+	{
+		return ($this->type === self::SELF_CLOSING_TAG);
+	}
+	public function isSystemTag()
+	{
+		return (\strpos('br i pb v', $this->name) !== \false);
+	}
+	public function isStartTag()
+	{
+		return (bool) ($this->type & self::START_TAG);
+	}
+	public function isVerbatim()
+	{
+		return ($this->name === 'v');
+	}
+	public function getAttribute($attrName)
+	{
+		return $this->attributes[$attrName];
+	}
+	public function hasAttribute($attrName)
+	{
+		return isset($this->attributes[$attrName]);
+	}
+	public function removeAttribute($attrName)
+	{
+		unset($this->attributes[$attrName]);
+	}
+	public function setAttribute($attrName, $attrValue)
+	{
+		$this->attributes[$attrName] = $attrValue;
+	}
+	public function setAttributes(array $attributes)
+	{
+		$this->attributes = $attributes;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Parser/utils.js
@@ -0,0 +1,82 @@
+/**
+* @param  {!string} str
+* @return {!string}
+*/
+function html_entity_decode(str)
+{
+	var b = document.createElement('b');
+
+	html_entity_decode = function (str)
+	{
+		// We escape left brackets so that we don't inadvertently evaluate some nasty HTML such as
+		// <img src=... onload=evil() />
+		b.innerHTML = str.replace(/</g, '&lt;');
+
+		return b.textContent;
+	}
+
+	return html_entity_decode(str);
+}
+
+/**
+* @param  {!string} str
+* @return {!string}
+*/
+function htmlspecialchars_compat(str)
+{
+	var t = {
+		'<' : '&lt;',
+		'>' : '&gt;',
+		'&' : '&amp;',
+		'"' : '&quot;'
+	};
+	return str.replace(
+		/[<>&"]/g,
+		/**
+		* @param {!string} c
+		*/
+		function(c)
+		{
+			return t[c];
+		}
+	);
+}
+
+/**
+* @param  {!string} str
+* @return {!string}
+*/
+function htmlspecialchars_noquotes(str)
+{
+	var t = {
+		'<' : '&lt;',
+		'>' : '&gt;',
+		'&' : '&amp;'
+	};
+	return str.replace(
+		/[<>&]/g,
+		/**
+		* @param {!string} c
+		*/
+		function(c)
+		{
+			return t[c];
+		}
+	);
+}
+
+/**
+* @return {!boolean}
+*/
+function returnFalse()
+{
+	return false;
+}
+
+/**
+* @return {!boolean}
+*/
+function returnTrue()
+{
+	return true;
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Autoemail/Configurator.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Autoemail;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class Configurator extends ConfiguratorBase
+{
+	protected $attrName = 'email';
+	protected $quickMatch = '@';
+	protected $regexp = '/\\b[-a-z0-9_+.]+@[-a-z0-9.]*[a-z0-9]/Si';
+	protected $tagName = 'EMAIL';
+	protected function setUp()
+	{
+		if (isset($this->configurator->tags[$this->tagName]))
+			return;
+		$tag = $this->configurator->tags->add($this->tagName);
+		$filter = $this->configurator->attributeFilters->get('#email');
+		$tag->attributes->add($this->attrName)->filterChain->append($filter);
+		$tag->template = '<a href="mailto:{@' . $this->attrName . '}"><xsl:apply-templates/></a>';
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Autoemail/Parser.js
@@ -0,0 +1,15 @@
+var tagName  = config.tagName,
+	attrName = config.attrName;
+
+matches.forEach(function(m)
+{
+	// Create a zero-width start tag right before the address
+	var startTag = addStartTag(tagName, m[0][1], 0);
+	startTag.setAttribute(attrName, m[0][0]);
+
+	// Create a zero-width end tag right after the address
+	var endTag = addEndTag(tagName, m[0][1] + m[0][0].length, 0);
+
+	// Pair the tags together
+	startTag.pairWith(endTag);
+});
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Autoemail/Parser.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Autoemail;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	public function parse($text, array $matches)
+	{
+		$tagName  = $this->config['tagName'];
+		$attrName = $this->config['attrName'];
+		foreach ($matches as $m)
+		{
+			$startTag = $this->parser->addStartTag($tagName, $m[0][1], 0);
+			$startTag->setAttribute($attrName, $m[0][0]);
+			$endTag = $this->parser->addEndTag($tagName, $m[0][1] + \strlen($m[0][0]), 0);
+			$startTag->pairWith($endTag);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Autoimage/Configurator.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Autoimage;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class Configurator extends ConfiguratorBase
+{
+	protected $attrName = 'src';
+	protected $quickMatch = '://';
+	protected $regexp = '#\\bhttps?://[-.\\w]+/[-./\\w]+\\.(?:gif|jpe?g|png)(?!\\S)#i';
+	protected $tagName = 'IMG';
+	protected function setUp()
+	{
+		if (isset($this->configurator->tags[$this->tagName]))
+			return;
+		$tag = $this->configurator->tags->add($this->tagName);
+		$filter = $this->configurator->attributeFilters->get('#url');
+		$tag->attributes->add($this->attrName)->filterChain->append($filter);
+		$tag->template = '<img src="{@' . $this->attrName . '}"/>';
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Autoimage/Parser.js
@@ -0,0 +1,7 @@
+var tagName  = config.tagName,
+	attrName = config.attrName;
+
+matches.forEach(function(m)
+{
+	addTagPair(tagName, m[0][1], 0, m[0][1] + m[0][0].length, 0, -1).setAttribute(attrName, m[0][0]);
+});
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Autoimage/Parser.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Autoimage;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	public function parse($text, array $matches)
+	{
+		$tagName  = $this->config['tagName'];
+		$attrName = $this->config['attrName'];
+		foreach ($matches as $m)
+			$this->parser->addTagPair($tagName, $m[0][1], 0, $m[0][1] + \strlen($m[0][0]), 0, -1)
+			             ->setAttribute($attrName, $m[0][0]);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Autolink/Configurator.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Autolink;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class Configurator extends ConfiguratorBase
+{
+	protected $attrName = 'url';
+	public $matchWww = \false;
+	protected $tagName = 'URL';
+	protected function setUp()
+	{
+		if (isset($this->configurator->tags[$this->tagName]))
+			return;
+		$tag = $this->configurator->tags->add($this->tagName);
+		$filter = $this->configurator->attributeFilters->get('#url');
+		$tag->attributes->add($this->attrName)->filterChain->append($filter);
+		$tag->template = '<a href="{@' . $this->attrName . '}"><xsl:apply-templates/></a>';
+	}
+	public function asConfig()
+	{
+		$config = array(
+			'attrName'   => $this->attrName,
+			'regexp'     => $this->getRegexp(),
+			'tagName'    => $this->tagName
+		);
+		if (!$this->matchWww)
+			$config['quickMatch'] = '://';
+		return $config;
+	}
+	protected function getRegexp()
+	{
+		$anchor = RegexpBuilder::fromList($this->configurator->urlConfig->getAllowedSchemes()) . '://';
+		if ($this->matchWww)
+			$anchor = '(?:' . $anchor . '|www\\.)';
+		$regexp = '#\\b' . $anchor . '\\S(?>[^\\s\\[\\]\\x{FF01}-\\x{FF0F}\\x{FF1A}-\\x{FF20}\\x{FF3B}-\\x{FF40}\\x{FF5B}-\\x{FF65}]|\\[\\w*\\])++#Siu';
+		return $regexp;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Autolink/Parser.js
@@ -0,0 +1,66 @@
+matches.forEach(function(m)
+{
+	// Linkify the trimmed URL
+	linkifyUrl(m[0][1], trimUrl(m[0][0]));
+});
+
+/**
+* Linkify given URL at given position
+*
+* @param {!number} tagPos URL's position in the text
+* @param {!string} url    URL
+*/
+function linkifyUrl(tagPos, url)
+{
+	// Ensure that the anchor (scheme/www) is still there
+	if (!/^www\.|^[^:]+:/i.test(url))
+	{
+		return;
+	}
+
+	// Create a zero-width end tag right after the URL
+	var endTag = addEndTag(config.tagName, tagPos + url.length, 0);
+
+	// If the URL starts with "www." we prepend "http://"
+	if (url.charAt(3) === '.')
+	{
+		url = 'http://' + url;
+	}
+
+	// Create a zero-width start tag right before the URL, with a slightly worse priority to
+	// allow specialized plugins to use the URL instead
+	var startTag = addStartTag(config.tagName, tagPos, 0, 1);
+	startTag.setAttribute(config.attrName, url);
+
+	// Pair the tags together
+	startTag.pairWith(endTag);
+};
+
+/**
+* Remove trailing punctuation from given URL
+*
+* We remove most ASCII non-letters from the end of the string.
+* Exceptions:
+*  - dashes (some YouTube URLs end with a dash due to the video ID)
+*  - equal signs (because of "foo?bar="),
+*  - trailing slashes,
+*  - closing parentheses are balanced separately.
+*
+* @param  {!string} url Original URL
+* @return {!string}     Trimmed URL
+*/
+function trimUrl(url)
+{
+	while (1)
+	{
+		url = url.replace(/(?![-=\/)])[\s!-.:-@[-`{-~]+$/, '');
+		if (url.substr(-1) === ')' && url.replace(/[^(]+/g, '').length < url.replace(/[^)]+/g, '').length)
+		{
+			url = url.substr(0, url.length - 1);
+			continue;
+		}
+		break;
+	}
+
+	return url;
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Autolink/Parser.php
@@ -0,0 +1,42 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Autolink;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	public function parse($text, array $matches)
+	{
+		foreach ($matches as $m)
+			$this->linkifyUrl($m[0][1], $this->trimUrl($m[0][0]));
+	}
+	protected function linkifyUrl($tagPos, $url)
+	{
+		if (!\preg_match('/^[^:]+:|^www\\./i', $url))
+			return;
+		$endTag = $this->parser->addEndTag($this->config['tagName'], $tagPos + \strlen($url), 0);
+		if ($url[3] === '.')
+			$url = 'http://' . $url;
+		$startTag = $this->parser->addStartTag($this->config['tagName'], $tagPos, 0, 1);
+		$startTag->setAttribute($this->config['attrName'], $url);
+		$startTag->pairWith($endTag);
+	}
+	protected function trimUrl($url)
+	{
+		while (1)
+		{
+			$url = \preg_replace('#(?![-=/)])[\\s!-.:-@[-`{-~\\pP]+$#Du', '', $url);
+			if (\substr($url, -1) === ')' && \substr_count($url, '(') < \substr_count($url, ')'))
+			{
+				$url = \substr($url, 0, -1);
+				continue;
+			}
+			break;
+		}
+		return $url;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Autovideo/Configurator.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Autovideo;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class Configurator extends ConfiguratorBase
+{
+	protected $attrName = 'src';
+	protected $quickMatch = '://';
+	protected $regexp = '#\\bhttps?://[-.\\w]+/[-./\\w]+\\.(?:mp4|ogg|webm)(?!\\S)#i';
+	protected $tagName = 'VIDEO';
+	protected function setUp()
+	{
+		if (isset($this->configurator->tags[$this->tagName]))
+			return;
+		$tag = $this->configurator->tags->add($this->tagName);
+		$filter = $this->configurator->attributeFilters['#url'];
+		$tag->attributes->add($this->attrName)->filterChain->append($filter);
+		$tag->template = '<video src="{@' . $this->attrName . '}"/>';
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Autovideo/Parser.js
@@ -0,0 +1,7 @@
+var tagName  = config.tagName,
+	attrName = config.attrName;
+
+matches.forEach(function(m)
+{
+	addTagPair(tagName, m[0][1], 0, m[0][1] + m[0][0].length, 0, -1).setAttribute(attrName, m[0][0]);
+});
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Autovideo/Parser.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Autovideo;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	public function parse($text, array $matches)
+	{
+		$tagName  = $this->config['tagName'];
+		$attrName = $this->config['attrName'];
+		foreach ($matches as $m)
+			$this->parser->addTagPair($tagName, $m[0][1], 0, $m[0][1] + \strlen($m[0][0]), 0, -1)
+			             ->setAttribute($attrName, $m[0][0]);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/BBCodes/Configurator.php
@@ -0,0 +1,124 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\BBCodes;
+use ArrayAccess;
+use Countable;
+use InvalidArgumentException;
+use Iterator;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+use s9e\TextFormatter\Configurator\Helpers\RegexpParser;
+use s9e\TextFormatter\Configurator\JavaScript\Dictionary;
+use s9e\TextFormatter\Configurator\Traits\CollectionProxy;
+use s9e\TextFormatter\Plugins\BBCodes\Configurator\BBCode;
+use s9e\TextFormatter\Plugins\BBCodes\Configurator\BBCodeCollection;
+use s9e\TextFormatter\Plugins\BBCodes\Configurator\BBCodeMonkey;
+use s9e\TextFormatter\Plugins\BBCodes\Configurator\Repository;
+use s9e\TextFormatter\Plugins\BBCodes\Configurator\RepositoryCollection;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class Configurator extends ConfiguratorBase implements ArrayAccess, Countable, Iterator
+{
+	public function __call($methodName, $args)
+	{
+		return \call_user_func_array(array($this->collection, $methodName), $args);
+	}
+	public function offsetExists($offset)
+	{
+		return isset($this->collection[$offset]);
+	}
+	public function offsetGet($offset)
+	{
+		return $this->collection[$offset];
+	}
+	public function offsetSet($offset, $value)
+	{
+		$this->collection[$offset] = $value;
+	}
+	public function offsetUnset($offset)
+	{
+		unset($this->collection[$offset]);
+	}
+	public function count()
+	{
+		return \count($this->collection);
+	}
+	public function current()
+	{
+		return $this->collection->current();
+	}
+	public function key()
+	{
+		return $this->collection->key();
+	}
+	public function next()
+	{
+		return $this->collection->next();
+	}
+	public function rewind()
+	{
+		$this->collection->rewind();
+	}
+	public function valid()
+	{
+		return $this->collection->valid();
+	}
+	public $bbcodeMonkey;
+	public $collection;
+	protected $quickMatch = '[';
+	protected $regexp = '#\\[/?(\\*|[-\\w]+)(?=[\\]\\s=:/])#';
+	public $repositories;
+	protected function setUp()
+	{
+		$this->bbcodeMonkey = new BBCodeMonkey($this->configurator);
+		$this->collection   = new BBCodeCollection;
+		$this->repositories = new RepositoryCollection($this->bbcodeMonkey);
+		$this->repositories->add('default', __DIR__ . '/Configurator/repository.xml');
+	}
+	public function addCustom($usage, $template, array $options = array())
+	{
+		$config = $this->bbcodeMonkey->create($usage, $template);
+		if (isset($options['tagName']))
+			$config['bbcode']->tagName = $options['tagName'];
+		if (isset($options['rules']))
+			$config['tag']->rules->merge($options['rules']);
+		return $this->addFromConfig($config);
+	}
+	public function addFromRepository($name, $repository = 'default', array $vars = array())
+	{
+		if (!($repository instanceof Repository))
+		{
+			if (!$this->repositories->exists($repository))
+				throw new InvalidArgumentException("Repository '" . $repository . "' does not exist");
+			$repository = $this->repositories->get($repository);
+		}
+		return $this->addFromConfig($repository->get($name, $vars));
+	}
+	protected function addFromConfig(array $config)
+	{
+		$bbcodeName = $config['bbcodeName'];
+		$bbcode     = $config['bbcode'];
+		$tag        = $config['tag'];
+		if (!isset($bbcode->tagName))
+			$bbcode->tagName = $bbcodeName;
+		$this->configurator->templateNormalizer->normalizeTag($tag);
+		$this->configurator->templateChecker->checkTag($tag);
+		$this->collection->add($bbcodeName, $bbcode);
+		$this->configurator->tags->add($bbcode->tagName, $tag);
+		return $bbcode;
+	}
+	public function asConfig()
+	{
+		if (!\count($this->collection))
+			return;
+		return array(
+			'bbcodes'    => $this->collection->asConfig(),
+			'quickMatch' => $this->quickMatch,
+			'regexp'     => $this->regexp
+		);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/BBCodes/Configurator/AttributeValueCollection.php
@@ -0,0 +1,17 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\BBCodes\Configurator;
+use s9e\TextFormatter\Configurator\Collections\NormalizedCollection;
+use s9e\TextFormatter\Configurator\Validators\AttributeName;
+class AttributeValueCollection extends NormalizedCollection
+{
+	public function normalizeKey($key)
+	{
+		return AttributeName::normalize($key);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/BBCodes/Configurator/BBCode.php
@@ -0,0 +1,149 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\BBCodes\Configurator;
+use InvalidArgumentException;
+use RuntimeException;
+use Traversable;
+use s9e\TextFormatter\Configurator\Collections\AttributeList;
+use s9e\TextFormatter\Configurator\Collections\Collection;
+use s9e\TextFormatter\Configurator\Collections\NormalizedCollection;
+use s9e\TextFormatter\Configurator\ConfigProvider;
+use s9e\TextFormatter\Configurator\Helpers\ConfigHelper;
+use s9e\TextFormatter\Configurator\JavaScript\Dictionary;
+use s9e\TextFormatter\Configurator\Traits\Configurable;
+use s9e\TextFormatter\Configurator\Validators\AttributeName;
+use s9e\TextFormatter\Configurator\Validators\TagName;
+class BBCode implements ConfigProvider
+{
+	public function __get($propName)
+	{
+		$methodName = 'get' . \ucfirst($propName);
+		if (\method_exists($this, $methodName))
+			return $this->$methodName();
+		if (!\property_exists($this, $propName))
+			throw new RuntimeException("Property '" . $propName . "' does not exist");
+		return $this->$propName;
+	}
+	public function __set($propName, $propValue)
+	{
+		$methodName = 'set' . \ucfirst($propName);
+		if (\method_exists($this, $methodName))
+		{
+			$this->$methodName($propValue);
+			return;
+		}
+		if (!isset($this->$propName))
+		{
+			$this->$propName = $propValue;
+			return;
+		}
+		if ($this->$propName instanceof NormalizedCollection)
+		{
+			if (!\is_array($propValue)
+			 && !($propValue instanceof Traversable))
+				throw new InvalidArgumentException("Property '" . $propName . "' expects an array or a traversable object to be passed");
+			$this->$propName->clear();
+			foreach ($propValue as $k => $v)
+				$this->$propName->set($k, $v);
+			return;
+		}
+		if (\is_object($this->$propName))
+		{
+			if (!($propValue instanceof $this->$propName))
+				throw new InvalidArgumentException("Cannot replace property '" . $propName . "' of class '" . \get_class($this->$propName) . "' with instance of '" . \get_class($propValue) . "'");
+		}
+		else
+		{
+			$oldType = \gettype($this->$propName);
+			$newType = \gettype($propValue);
+			if ($oldType === 'boolean')
+				if ($propValue === 'false')
+				{
+					$newType   = 'boolean';
+					$propValue = \false;
+				}
+				elseif ($propValue === 'true')
+				{
+					$newType   = 'boolean';
+					$propValue = \true;
+				}
+			if ($oldType !== $newType)
+			{
+				$tmp = $propValue;
+				\settype($tmp, $oldType);
+				\settype($tmp, $newType);
+				if ($tmp !== $propValue)
+					throw new InvalidArgumentException("Cannot replace property '" . $propName . "' of type " . $oldType . ' with value of type ' . $newType);
+				\settype($propValue, $oldType);
+			}
+		}
+		$this->$propName = $propValue;
+	}
+	public function __isset($propName)
+	{
+		$methodName = 'isset' . \ucfirst($propName);
+		if (\method_exists($this, $methodName))
+			return $this->$methodName();
+		return isset($this->$propName);
+	}
+	public function __unset($propName)
+	{
+		$methodName = 'unset' . \ucfirst($propName);
+		if (\method_exists($this, $methodName))
+		{
+			$this->$methodName();
+			return;
+		}
+		if (!isset($this->$propName))
+			return;
+		if ($this->$propName instanceof Collection)
+		{
+			$this->$propName->clear();
+			return;
+		}
+		throw new RuntimeException("Property '" . $propName . "' cannot be unset");
+	}
+	protected $contentAttributes;
+	protected $defaultAttribute;
+	protected $forceLookahead = \false;
+	protected $predefinedAttributes;
+	protected $tagName;
+	public function __construct(array $options = \null)
+	{
+		$this->contentAttributes    = new AttributeList;
+		$this->predefinedAttributes = new AttributeValueCollection;
+		if (isset($options))
+			foreach ($options as $optionName => $optionValue)
+				$this->__set($optionName, $optionValue);
+	}
+	public function asConfig()
+	{
+		$config = ConfigHelper::toArray(\get_object_vars($this));
+		if (!$this->forceLookahead)
+			unset($config['forceLookahead']);
+		if (isset($config['predefinedAttributes']))
+			$config['predefinedAttributes'] = new Dictionary($config['predefinedAttributes']);
+		return $config;
+	}
+	public static function normalizeName($bbcodeName)
+	{
+		if ($bbcodeName === '*')
+			return '*';
+		if (!TagName::isValid($bbcodeName))
+			throw new InvalidArgumentException("Invalid BBCode name '" . $bbcodeName . "'");
+		return TagName::normalize($bbcodeName);
+	}
+	public function setDefaultAttribute($attrName)
+	{
+		$this->defaultAttribute = AttributeName::normalize($attrName);
+	}
+	public function setTagName($tagName)
+	{
+		$this->tagName = TagName::normalize($tagName);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/BBCodes/Configurator/BBCodeCollection.php
@@ -0,0 +1,52 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\BBCodes\Configurator;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Collections\NormalizedCollection;
+use s9e\TextFormatter\Configurator\JavaScript\Dictionary;
+use s9e\TextFormatter\Configurator\Validators\AttributeName;
+use s9e\TextFormatter\Configurator\Validators\TagName;
+class BBCodeCollection extends NormalizedCollection
+{
+	protected $onDuplicateAction = 'replace';
+	protected function getAlreadyExistsException($key)
+	{
+		return new RuntimeException("BBCode '" . $key . "' already exists");
+	}
+	protected function getNotExistException($key)
+	{
+		return new RuntimeException("BBCode '" . $key . "' does not exist");
+	}
+	public function normalizeKey($key)
+	{
+		return BBCode::normalizeName($key);
+	}
+	public function normalizeValue($value)
+	{
+		return ($value instanceof BBCode)
+		     ? $value
+		     : new BBCode($value);
+	}
+	public function asConfig()
+	{
+		$bbcodes = parent::asConfig();
+		foreach ($bbcodes as $bbcodeName => &$bbcode)
+		{
+			if (isset($bbcode['tagName'])
+			 && TagName::isValid($bbcodeName)
+			 && TagName::normalize($bbcodeName) === $bbcode['tagName'])
+				unset($bbcode['tagName']);
+			if (isset($bbcode['defaultAttribute'])
+			 && AttributeName::isValid($bbcodeName)
+			 && AttributeName::normalize($bbcodeName) === $bbcode['defaultAttribute'])
+				unset($bbcode['defaultAttribute']);
+		}
+		unset($bbcode);
+		return new Dictionary($bbcodes);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/BBCodes/Configurator/BBCodeMonkey.php
@@ -0,0 +1,462 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\BBCodes\Configurator;
+use Exception;
+use InvalidArgumentException;
+use RuntimeException;
+use s9e\TextFormatter\Configurator;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+use s9e\TextFormatter\Configurator\Items\Attribute;
+use s9e\TextFormatter\Configurator\Items\ProgrammableCallback;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\Items\Template;
+class BBCodeMonkey
+{
+	const REGEXP = '(.).*?(?<!\\\\)(?>\\\\\\\\)*+\\g{-1}[DSUisu]*';
+	public $allowedFilters = array(
+		'addslashes',
+		'dechex',
+		'intval',
+		'json_encode',
+		'ltrim',
+		'mb_strtolower',
+		'mb_strtoupper',
+		'rawurlencode',
+		'rtrim',
+		'str_rot13',
+		'stripslashes',
+		'strrev',
+		'strtolower',
+		'strtotime',
+		'strtoupper',
+		'trim',
+		'ucfirst',
+		'ucwords',
+		'urlencode'
+	);
+	protected $configurator;
+	public $tokenRegexp = array(
+		'COLOR'      => '[a-zA-Z]+|#[0-9a-fA-F]+',
+		'EMAIL'      => '[^@]+@.+?',
+		'FLOAT'      => '(?>0|-?[1-9]\\d*)(?>\\.\\d+)?(?>e[1-9]\\d*)?',
+		'ID'         => '[-a-zA-Z0-9_]+',
+		'IDENTIFIER' => '[-a-zA-Z0-9_]+',
+		'INT'        => '0|-?[1-9]\\d*',
+		'INTEGER'    => '0|-?[1-9]\\d*',
+		'NUMBER'     => '\\d+',
+		'RANGE'      => '\\d+',
+		'SIMPLETEXT' => '[-a-zA-Z0-9+.,_ ]+',
+		'UINT'       => '0|[1-9]\\d*'
+	);
+	public $unfilteredTokens = array(
+		'ANYTHING',
+		'TEXT'
+	);
+	public function __construct(Configurator $configurator)
+	{
+		$this->configurator = $configurator;
+	}
+	public function create($usage, $template)
+	{
+		$_this = $this;
+		$config = $this->parse($usage);
+		if (!($template instanceof Template))
+			$template = new Template($template);
+		$template->replaceTokens(
+			'#\\{(?:[A-Z]+[A-Z_0-9]*|@[-\\w]+)\\}#',
+			function ($m) use ($config, $_this)
+			{
+				$tokenId = \substr($m[0], 1, -1);
+				if ($tokenId[0] === '@')
+					return array('expression', $tokenId);
+				if (isset($config['tokens'][$tokenId]))
+					return array('expression', '@' . $config['tokens'][$tokenId]);
+				if ($tokenId === $config['passthroughToken'])
+					return array('passthrough');
+				if ($_this->isFilter($tokenId))
+					throw new RuntimeException('Token {' . $tokenId . '} is ambiguous or undefined');
+				return array('expression', '$' . $tokenId);
+			}
+		);
+		$return = array(
+			'bbcode'     => $config['bbcode'],
+			'bbcodeName' => $config['bbcodeName'],
+			'tag'        => $config['tag']
+		);
+		$return['tag']->template = $template;
+		return $return;
+	}
+	protected function parse($usage)
+	{
+		$tag    = new Tag;
+		$bbcode = new BBCode;
+		$config = array(
+			'tag'              => $tag,
+			'bbcode'           => $bbcode,
+			'passthroughToken' => \null
+		);
+		$usage = \preg_replace_callback(
+			'#(\\{(?>HASH)?MAP=)([^:]+:[^,;}]+(?>,[^:]+:[^,;}]+)*)(?=[;}])#',
+			function ($m)
+			{
+				return $m[1] . \base64_encode($m[2]);
+			},
+			$usage
+		);
+		$usage = \preg_replace_callback(
+			'#(\\{(?:PARSE|REGEXP)=)(' . self::REGEXP . '(?:,' . self::REGEXP . ')*)#',
+			function ($m)
+			{
+				return $m[1] . \base64_encode($m[2]);
+			},
+			$usage
+		);
+		$regexp = '(^'
+		        . '\\[(?<bbcodeName>\\S+?)'
+		        . '(?<defaultAttribute>=\\S+?)?'
+		        . '(?<attributes>(?:\\s+[^=]+=\\S+?)*?)?'
+		        . '\\s*(?:/?\\]|\\]\\s*(?<content>.*?)\\s*(?<endTag>\\[/\\1]))$)i';
+		if (!\preg_match($regexp, \trim($usage), $m))
+			throw new InvalidArgumentException('Cannot interpret the BBCode definition');
+		$config['bbcodeName'] = BBCode::normalizeName($m['bbcodeName']);
+		$definitions = \preg_split('#\\s+#', \trim($m['attributes']), -1, \PREG_SPLIT_NO_EMPTY);
+		if (!empty($m['defaultAttribute']))
+			\array_unshift($definitions, $m['bbcodeName'] . $m['defaultAttribute']);
+		if (!empty($m['content']))
+		{
+			$regexp = '#^\\{' . RegexpBuilder::fromList($this->unfilteredTokens) . '[0-9]*\\}$#D';
+			if (\preg_match($regexp, $m['content']))
+				$config['passthroughToken'] = \substr($m['content'], 1, -1);
+			else
+			{
+				$definitions[] = 'content=' . $m['content'];
+				$bbcode->contentAttributes[] = 'content';
+			}
+		}
+		$attributeDefinitions = array();
+		foreach ($definitions as $definition)
+		{
+			$pos   = \strpos($definition, '=');
+			$name  = \substr($definition, 0, $pos);
+			$value = \preg_replace('(^"(.*?)")s', '$1', \substr($definition, 1 + $pos));
+			$value = \preg_replace_callback(
+				'#(\\{(?>HASHMAP|MAP|PARSE|REGEXP)=)([A-Za-z0-9+/]+=*)#',
+				function ($m)
+				{
+					return $m[1] . \base64_decode($m[2]);
+				},
+				$value
+			);
+			if ($name[0] === '$')
+			{
+				$optionName = \substr($name, 1);
+				$bbcode->$optionName = $this->convertValue($value);
+			}
+			elseif ($name[0] === '#')
+			{
+				$ruleName = \substr($name, 1);
+				foreach (\explode(',', $value) as $value)
+					$tag->rules->$ruleName($this->convertValue($value));
+			}
+			else
+			{
+				$attrName = \strtolower(\trim($name));
+				$attributeDefinitions[] = array($attrName, $value);
+			}
+		}
+		$tokens = $this->addAttributes($attributeDefinitions, $bbcode, $tag);
+		if (isset($tokens[$config['passthroughToken']]))
+			$config['passthroughToken'] = \null;
+		$config['tokens'] = \array_filter($tokens);
+		return $config;
+	}
+	protected function addAttributes(array $definitions, BBCode $bbcode, Tag $tag)
+	{
+		$composites = array();
+		$table = array();
+		foreach ($definitions as $_e874cdc7)
+		{
+			list($attrName, $definition) = $_e874cdc7;
+			if (!isset($bbcode->defaultAttribute))
+				$bbcode->defaultAttribute = $attrName;
+			$tokens = self::parseTokens($definition);
+			if (empty($tokens))
+				throw new RuntimeException('No valid tokens found in ' . $attrName . "'s definition " . $definition);
+			if ($tokens[0]['content'] === $definition)
+			{
+				$token = $tokens[0];
+				if ($token['type'] === 'PARSE')
+					foreach ($token['regexps'] as $regexp)
+						$tag->attributePreprocessors->add($attrName, $regexp);
+				elseif (isset($tag->attributes[$attrName]))
+					throw new RuntimeException("Attribute '" . $attrName . "' is declared twice");
+				else
+				{
+					if (!empty($token['options']['useContent']))
+						$bbcode->contentAttributes[] = $attrName;
+					unset($token['options']['useContent']);
+					$tag->attributes[$attrName] = $this->generateAttribute($token);
+					$tokenId = $token['id'];
+					$table[$tokenId] = (isset($table[$tokenId]))
+					                 ? \false
+					                 : $attrName;
+				}
+			}
+			else
+				$composites[] = array($attrName, $definition, $tokens);
+		}
+		foreach ($composites as $_2d84f0a0)
+		{
+			list($attrName, $definition, $tokens) = $_2d84f0a0;
+			$regexp  = '/^';
+			$lastPos = 0;
+			$usedTokens = array();
+			foreach ($tokens as $token)
+			{
+				$tokenId   = $token['id'];
+				$tokenType = $token['type'];
+				if ($tokenType === 'PARSE')
+					throw new RuntimeException('{PARSE} tokens can only be used has the sole content of an attribute');
+				if (isset($usedTokens[$tokenId]))
+					throw new RuntimeException('Token {' . $tokenId . '} used multiple times in attribute ' . $attrName . "'s definition");
+				$usedTokens[$tokenId] = 1;
+				if (isset($table[$tokenId]))
+				{
+					$matchName = $table[$tokenId];
+					if ($matchName === \false)
+						throw new RuntimeException('Token {' . $tokenId . "} used in attribute '" . $attrName . "' is ambiguous");
+				}
+				else
+				{
+					$i = 0;
+					do
+					{
+						$matchName = $attrName . $i;
+						++$i;
+					}
+					while (isset($tag->attributes[$matchName]));
+					$attribute = $tag->attributes->add($matchName);
+					if (!\in_array($tokenType, $this->unfilteredTokens, \true))
+					{
+						$filter = $this->configurator->attributeFilters->get('#' . \strtolower($tokenType));
+						$attribute->filterChain->append($filter);
+					}
+					$table[$tokenId] = $matchName;
+				}
+				$regexp .= \preg_quote(\substr($definition, $lastPos, $token['pos'] - $lastPos), '/');
+				$expr = (isset($this->tokenRegexp[$tokenType]))
+				      ? $this->tokenRegexp[$tokenType]
+				      : '.+?';
+				$regexp .= '(?<' . $matchName . '>' . $expr . ')';
+				$lastPos = $token['pos'] + \strlen($token['content']);
+			}
+			$regexp .= \preg_quote(\substr($definition, $lastPos), '/') . '$/D';
+			$tag->attributePreprocessors->add($attrName, $regexp);
+		}
+		$newAttributes = array();
+		foreach ($tag->attributePreprocessors as $attributePreprocessor)
+			foreach ($attributePreprocessor->getAttributes() as $attrName => $regexp)
+			{
+				if (isset($tag->attributes[$attrName]))
+					continue;
+				if (isset($newAttributes[$attrName])
+				 && $newAttributes[$attrName] !== $regexp)
+					throw new RuntimeException("Ambiguous attribute '" . $attrName . "' created using different regexps needs to be explicitly defined");
+				$newAttributes[$attrName] = $regexp;
+			}
+		foreach ($newAttributes as $attrName => $regexp)
+		{
+			$filter = $this->configurator->attributeFilters->get('#regexp');
+			$tag->attributes->add($attrName)->filterChain->append($filter)->setRegexp($regexp);
+		}
+		return $table;
+	}
+	protected function convertValue($value)
+	{
+		if ($value === 'true')
+			return \true;
+		if ($value === 'false')
+			return \false;
+		return $value;
+	}
+	protected static function parseTokens($definition)
+	{
+		$tokenTypes = array(
+			'choice' => 'CHOICE[0-9]*=(?<choices>.+?)',
+			'map'    => '(?:HASH)?MAP[0-9]*=(?<map>.+?)',
+			'parse'  => 'PARSE=(?<regexps>' . self::REGEXP . '(?:,' . self::REGEXP . ')*)',
+			'range'  => 'RAN(?:DOM|GE)[0-9]*=(?<min>-?[0-9]+),(?<max>-?[0-9]+)',
+			'regexp' => 'REGEXP[0-9]*=(?<regexp>' . self::REGEXP . ')',
+			'other'  => '(?<other>[A-Z_]+[0-9]*)'
+		);
+		\preg_match_all(
+			'#\\{(' . \implode('|', $tokenTypes) . ')(?<options>(?:;[^;]*)*)\\}#',
+			$definition,
+			$matches,
+			\PREG_SET_ORDER | \PREG_OFFSET_CAPTURE
+		);
+		$tokens = array();
+		foreach ($matches as $m)
+		{
+			if (isset($m['other'][0])
+			 && \preg_match('#^(?:CHOICE|HASHMAP|MAP|REGEXP|PARSE|RANDOM|RANGE)#', $m['other'][0]))
+				throw new RuntimeException("Malformed token '" . $m['other'][0] . "'");
+			$token = array(
+				'pos'     => $m[0][1],
+				'content' => $m[0][0],
+				'options' => array()
+			);
+			$head = $m[1][0];
+			$pos  = \strpos($head, '=');
+			if ($pos === \false)
+				$token['id'] = $head;
+			else
+			{
+				$token['id'] = \substr($head, 0, $pos);
+				foreach ($m as $k => $v)
+					if (!\is_numeric($k) && $k !== 'options' && $v[1] !== -1)
+						$token[$k] = $v[0];
+			}
+			$token['type'] = \rtrim($token['id'], '0123456789');
+			$options = (isset($m['options'][0])) ? $m['options'][0] : '';
+			foreach (\preg_split('#;+#', $options, -1, \PREG_SPLIT_NO_EMPTY) as $pair)
+			{
+				$pos = \strpos($pair, '=');
+				if ($pos === \false)
+				{
+					$k = $pair;
+					$v = \true;
+				}
+				else
+				{
+					$k = \substr($pair, 0, $pos);
+					$v = \substr($pair, 1 + $pos);
+				}
+				$token['options'][$k] = $v;
+			}
+			if ($token['type'] === 'PARSE')
+			{
+				\preg_match_all('#' . self::REGEXP . '(?:,|$)#', $token['regexps'], $m);
+				$regexps = array();
+				foreach ($m[0] as $regexp)
+					$regexps[] = \rtrim($regexp, ',');
+				$token['regexps'] = $regexps;
+			}
+			$tokens[] = $token;
+		}
+		return $tokens;
+	}
+	protected function generateAttribute(array $token)
+	{
+		$attribute = new Attribute;
+		if (isset($token['options']['preFilter']))
+		{
+			$this->appendFilters($attribute, $token['options']['preFilter']);
+			unset($token['options']['preFilter']);
+		}
+		if ($token['type'] === 'REGEXP')
+		{
+			$filter = $this->configurator->attributeFilters->get('#regexp');
+			$attribute->filterChain->append($filter)->setRegexp($token['regexp']);
+		}
+		elseif ($token['type'] === 'RANGE')
+		{
+			$filter = $this->configurator->attributeFilters->get('#range');
+			$attribute->filterChain->append($filter)->setRange($token['min'], $token['max']);
+		}
+		elseif ($token['type'] === 'RANDOM')
+		{
+			$attribute->generator = new ProgrammableCallback('mt_rand');
+			$attribute->generator->addParameterByValue((int) $token['min']);
+			$attribute->generator->addParameterByValue((int) $token['max']);
+		}
+		elseif ($token['type'] === 'CHOICE')
+		{
+			$filter = $this->configurator->attributeFilters->get('#choice');
+			$attribute->filterChain->append($filter)->setValues(
+				\explode(',', $token['choices']),
+				!empty($token['options']['caseSensitive'])
+			);
+			unset($token['options']['caseSensitive']);
+		}
+		elseif ($token['type'] === 'HASHMAP' || $token['type'] === 'MAP')
+		{
+			$map = array();
+			foreach (\explode(',', $token['map']) as $pair)
+			{
+				$pos = \strpos($pair, ':');
+				if ($pos === \false)
+					throw new RuntimeException("Invalid map assignment '" . $pair . "'");
+				$map[\substr($pair, 0, $pos)] = \substr($pair, 1 + $pos);
+			}
+			if ($token['type'] === 'HASHMAP')
+			{
+				$filter = $this->configurator->attributeFilters->get('#hashmap');
+				$attribute->filterChain->append($filter)->setMap(
+					$map,
+					!empty($token['options']['strict'])
+				);
+			}
+			else
+			{
+				$filter = $this->configurator->attributeFilters->get('#map');
+				$attribute->filterChain->append($filter)->setMap(
+					$map,
+					!empty($token['options']['caseSensitive']),
+					!empty($token['options']['strict'])
+				);
+			}
+			unset($token['options']['caseSensitive']);
+			unset($token['options']['strict']);
+		}
+		elseif (!\in_array($token['type'], $this->unfilteredTokens, \true))
+		{
+			$filter = $this->configurator->attributeFilters->get('#' . $token['type']);
+			$attribute->filterChain->append($filter);
+		}
+		if (isset($token['options']['postFilter']))
+		{
+			$this->appendFilters($attribute, $token['options']['postFilter']);
+			unset($token['options']['postFilter']);
+		}
+		if (isset($token['options']['required']))
+			$token['options']['required'] = (bool) $token['options']['required'];
+		elseif (isset($token['options']['optional']))
+			$token['options']['required'] = !$token['options']['optional'];
+		unset($token['options']['optional']);
+		foreach ($token['options'] as $k => $v)
+			$attribute->$k = $v;
+		return $attribute;
+	}
+	protected function appendFilters(Attribute $attribute, $filters)
+	{
+		foreach (\preg_split('#\\s*,\\s*#', $filters) as $filterName)
+		{
+			if (\substr($filterName, 0, 1) !== '#'
+			 && !\in_array($filterName, $this->allowedFilters, \true))
+				throw new RuntimeException("Filter '" . $filterName . "' is not allowed");
+			$filter = $this->configurator->attributeFilters->get($filterName);
+			$attribute->filterChain->append($filter);
+		}
+	}
+	public function isFilter($tokenId)
+	{
+		$filterName = \rtrim($tokenId, '0123456789');
+		if (\in_array($filterName, $this->unfilteredTokens, \true))
+			return \true;
+		try
+		{
+			if ($this->configurator->attributeFilters->get('#' . $filterName))
+				return \true;
+		}
+		catch (Exception $e)
+		{
+			}
+		return \false;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/BBCodes/Configurator/Repository.php
@@ -0,0 +1,85 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\BBCodes\Configurator;
+use DOMDocument;
+use DOMElement;
+use DOMXPath;
+use InvalidArgumentException;
+use RuntimeException;
+class Repository
+{
+	protected $bbcodeMonkey;
+	protected $dom;
+	public function __construct($value, BBCodeMonkey $bbcodeMonkey)
+	{
+		if (!($value instanceof DOMDocument))
+		{
+			if (!\file_exists($value))
+				throw new InvalidArgumentException('Not a DOMDocument or the path to a repository file');
+			$dom = new DOMDocument;
+			$dom->preserveWhiteSpace = \false;
+			$useErrors = \libxml_use_internal_errors(\true);
+			$success = $dom->load($value);
+			\libxml_use_internal_errors($useErrors);
+			if (!$success)
+				throw new InvalidArgumentException('Invalid repository file');
+			$value = $dom;
+		}
+		$this->bbcodeMonkey = $bbcodeMonkey;
+		$this->dom = $value;
+	}
+	public function get($name, array $vars = array())
+	{
+		$name = \preg_replace_callback(
+			'/^[^#]+/',
+			function ($m)
+			{
+				return BBCode::normalizeName($m[0]);
+			},
+			$name
+		);
+		$xpath = new DOMXPath($this->dom);
+		$node  = $xpath->query('//bbcode[@name="' . \htmlspecialchars($name) . '"]')->item(0);
+		if (!($node instanceof DOMElement))
+			throw new RuntimeException("Could not find '" . $name . "' in repository");
+		$clonedNode = $node->cloneNode(\true);
+		foreach ($xpath->query('.//var', $clonedNode) as $varNode)
+		{
+			$varName = $varNode->getAttribute('name');
+			if (isset($vars[$varName]))
+				$varNode->parentNode->replaceChild(
+					$this->dom->createTextNode($vars[$varName]),
+					$varNode
+				);
+		}
+		$usage      = $xpath->evaluate('string(usage)', $clonedNode);
+		$template   = $xpath->evaluate('string(template)', $clonedNode);
+		$config     = $this->bbcodeMonkey->create($usage, $template);
+		$bbcode     = $config['bbcode'];
+		$bbcodeName = $config['bbcodeName'];
+		$tag        = $config['tag'];
+		if ($node->hasAttribute('tagName'))
+			$bbcode->tagName = $node->getAttribute('tagName');
+		foreach ($xpath->query('rules/*', $node) as $ruleNode)
+		{
+			$methodName = $ruleNode->nodeName;
+			$args       = array();
+			if ($ruleNode->textContent)
+				$args[] = $ruleNode->textContent;
+			\call_user_func_array(array($tag->rules, $methodName), $args);
+		}
+		foreach ($node->getElementsByTagName('predefinedAttributes') as $predefinedAttributes)
+			foreach ($predefinedAttributes->attributes as $attribute)
+				$bbcode->predefinedAttributes->set($attribute->name, $attribute->value);
+		return array(
+			'bbcode'     => $bbcode,
+			'bbcodeName' => $bbcodeName,
+			'tag'        => $tag
+		);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/BBCodes/Configurator/RepositoryCollection.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\BBCodes\Configurator;
+use s9e\TextFormatter\Configurator;
+use s9e\TextFormatter\Configurator\Collections\NormalizedCollection;
+class RepositoryCollection extends NormalizedCollection
+{
+	protected $bbcodeMonkey;
+	public function __construct(BBCodeMonkey $bbcodeMonkey)
+	{
+		$this->bbcodeMonkey = $bbcodeMonkey;
+	}
+	public function normalizeValue($value)
+	{
+		return ($value instanceof Repository)
+		     ? $value
+		     : new Repository($value, $this->bbcodeMonkey);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/BBCodes/Configurator/repository.xml
@@ -0,0 +1,489 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<repository>
+
+	<bbcode name="ACRONYM">
+		<usage>[ACRONYM title={TEXT1;optional}]{TEXT2}[/ACRONYM]</usage>
+		<template><![CDATA[
+			<acronym title="{TEXT1}">{TEXT2}</acronym>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="ALIGN">
+		<usage>[ALIGN={CHOICE=left,right,center,justify}]{TEXT}[/ALIGN]</usage>
+		<template><![CDATA[
+			<div style="text-align:{CHOICE}">{TEXT}</div>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="B">
+		<usage>[B]{TEXT}[/B]</usage>
+		<template><![CDATA[
+			<b><xsl:apply-templates /></b>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="BACKGROUND">
+		<usage>[BACKGROUND={COLOR}]{TEXT}[/BACKGROUND]</usage>
+		<template><![CDATA[
+			<span style="background-color:{COLOR}">{TEXT}</span>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="C">
+		<usage>[C]{TEXT}[/C]</usage>
+		<template><![CDATA[
+			<code class="inline"><xsl:apply-templates /></code>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="CENTER">
+		<usage>[CENTER]{TEXT}[/CENTER]</usage>
+		<template><![CDATA[
+			<div style="text-align:center">{TEXT}</div>
+		]]></template>
+	</bbcode>
+
+	<!-- [CODE] BBCode, uses Hightlight.js for highlighting: https://highlightjs.org/ -->
+	<bbcode name="CODE">
+		<usage>[CODE lang={IDENTIFIER;optional}]{TEXT}[/CODE]</usage>
+		<template><![CDATA[
+			<pre data-hljs="" data-s9e-livepreview-postprocess="if('undefined'!==typeof hljs)hljs._hb(this)"><code>
+				<xsl:if test="@lang">
+					<xsl:attribute name="class">language-<xsl:value-of select="@lang"/></xsl:attribute>
+				</xsl:if>
+				<xsl:apply-templates />
+			</code></pre>
+			<script>if("undefined"!==typeof hljs)hljs._ha();else if("undefined"===typeof hljsLoading){hljsLoading=1;var a=document.getElementsByTagName("head")[0],e=document.createElement("link");e.type="text/css";e.rel="stylesheet";e.href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/default.min.css";a.appendChild(e);e=document.createElement("script");e.type="text/javascript";e.onload=function(){var d={},f=0;hljs._hb=function(b){b.removeAttribute("data-hljs");var c=b.innerHTML;c in d?b.innerHTML=d[c]:(7&lt;++f&amp;&amp;(d={},f=0),hljs.highlightBlock(b.firstChild),d[c]=b.innerHTML)};hljs._ha=function(){for(var b=document.querySelectorAll("pre[data-hljs]"),c=b.length;0&lt;c;)hljs._hb(b.item(--c))};hljs._ha()};e.async=!0;e.src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/highlight.min.js";a.appendChild(e)}</script>
+		]]></template>
+		<ignore><![CDATA[
+			if (typeof hljs !== 'undefined')
+			{
+				hljs['_ha']();
+			}
+			else if (typeof hljsLoading === 'undefined')
+			{
+				hljsLoading = 1;
+
+				var head = document.getElementsByTagName('head')[0],
+					el   = document.createElement('link');
+
+				el.type = 'text/css';
+				el.rel  = 'stylesheet';
+				el.href = '//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/default.min.css';
+
+				head.appendChild(el);
+
+				el        = document.createElement('script');
+				el.type   = 'text/javascript';
+				el.onload = function()
+				{
+					var cache = {}, cnt = 0;
+
+					// Highlight block
+					hljs['_hb'] = function (block)
+					{
+						block.removeAttribute('data-hljs');
+
+						var html = block.innerHTML;
+						if (html in cache)
+						{
+							block.innerHTML = cache[html];
+						}
+						else
+						{
+							if (++cnt > 7)
+							{
+								cache = {};
+								cnt = 0;
+							}
+							hljs['highlightBlock'](block.firstChild);
+							cache[html] = block.innerHTML;
+						}
+					};
+
+					// Highlight all
+					hljs['_ha'] = function ()
+					{
+						var blocks = document.querySelectorAll('pre[data-hljs]'),
+							i = blocks.length;
+						while (i > 0)
+						{
+							hljs['_hb'](blocks.item(--i));
+						}
+					};
+					hljs['_ha']();
+				};
+				el.async = true;
+				el.src   = '//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/highlight.min.js';
+
+				head.appendChild(el);
+			}
+		]]></ignore>
+	</bbcode>
+
+	<bbcode name="COLOR">
+		<usage>[COLOR={COLOR}]{TEXT}[/COLOR]</usage>
+		<template><![CDATA[
+			<span style="color:{COLOR}">{TEXT}</span>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="DD">
+		<usage>[DD]{TEXT}[/DD]</usage>
+		<template><![CDATA[
+			<dd>{TEXT}</dd>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="DEL">
+		<usage>[DEL]{TEXT}[/DEL]</usage>
+		<template><![CDATA[
+			<del>{TEXT}</del>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="DL">
+		<usage>[DL]{TEXT}[/DL]</usage>
+		<template><![CDATA[
+			<dl>{TEXT}</dl>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="DT">
+		<usage>[DT]{TEXT}[/DT]</usage>
+		<template><![CDATA[
+			<dt>{TEXT}</dt>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="EM">
+		<usage>[EM]{TEXT}[/EM]</usage>
+		<template><![CDATA[
+			<em>{TEXT}</em>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="EMAIL">
+		<usage>[EMAIL={EMAIL;useContent}]{TEXT}[/EMAIL]</usage>
+		<template><![CDATA[
+			<a href="mailto:{EMAIL}">{TEXT}</a>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="FLASH">
+		<!-- The size of the object is set to range from 0x0 to 1920x1080 and defaults to 80x60 -->
+		<usage><![CDATA[[FLASH={PARSE=/^(?<width>\d+),(?<height>\d+)/} width={RANGE=]]><var name="minWidth" description="Minimum width for the Flash object">0</var>,<var name="maxWidth" description="Maximum width for the Flash object">1920</var><![CDATA[;defaultValue=80} height={RANGE=]]><var name="minHeight" description="Minimum height for the Flash object">0</var>,<var name="maxHeight" description="Maximum height for the Flash object">1080</var><![CDATA[;defaultValue=60} url={URL;useContent}]
+		]]></usage>
+		<template><![CDATA[
+			<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://fpdownload.macromedia.com/get/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="{@width}" height="{@height}">
+				<param name="movie" value="{@url}" />
+				<param name="quality" value="high" />
+				<param name="wmode" value="opaque" />
+				<param name="play" value="false" />
+				<param name="loop" value="false" />
+
+				<param name="allowScriptAccess" value="never" />
+				<param name="allowNetworking" value="internal" />
+
+				<embed src="{@url}" quality="high" width="{@width}" height="{@height}" wmode="opaque" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" play="false" loop="false" allowscriptaccess="never" allownetworking="internal"></embed>
+			</object>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="FLOAT">
+		<usage>[float={CHOICE=left,right,none}]{TEXT}[/float]</usage>
+		<template><![CDATA[
+			<div style="float:{CHOICE}">{TEXT}</div>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="FONT">
+		<usage>[font={FONTFAMILY}]{TEXT}[/font]</usage>
+		<template><![CDATA[
+			<span style="font-family:{FONTFAMILY}">{TEXT}</span>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="H1">
+		<usage>[H1]{TEXT}[/H1]</usage>
+		<template><![CDATA[
+			<h1>{TEXT}</h1>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="H2">
+		<usage>[H2]{TEXT}[/H2]</usage>
+		<template><![CDATA[
+			<h2>{TEXT}</h2>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="H3">
+		<usage>[H3]{TEXT}[/H3]</usage>
+		<template><![CDATA[
+			<h3>{TEXT}</h3>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="H4">
+		<usage>[H4]{TEXT}[/H4]</usage>
+		<template><![CDATA[
+			<h4>{TEXT}</h4>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="H5">
+		<usage>[H5]{TEXT}[/H5]</usage>
+		<template><![CDATA[
+			<h5>{TEXT}</h5>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="H6">
+		<usage>[H6]{TEXT}[/H6]</usage>
+		<template><![CDATA[
+			<h6>{TEXT}</h6>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="HR">
+		<usage>[HR]</usage>
+		<template><![CDATA[<hr/>]]></template>
+	</bbcode>
+
+	<bbcode name="I">
+		<usage>[I]{TEXT}[/I]</usage>
+		<template><![CDATA[
+			<i>{TEXT}</i>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="IMG">
+		<usage>[IMG src={URL;useContent} title={TEXT;optional} alt={TEXT;optional}]</usage>
+		<template><![CDATA[
+			<img src="{@src}" title="{@title}" alt="{@alt}" />
+		]]></template>
+	</bbcode>
+
+	<bbcode name="INS">
+		<usage>[INS]{TEXT}[/INS]</usage>
+		<template><![CDATA[
+			<ins>{TEXT}</ins>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="JUSTIFY">
+		<usage>[JUSTIFY]{TEXT}[/JUSTIFY]</usage>
+		<template><![CDATA[
+			<div style="text-align:justify">{TEXT}</div>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="LEFT">
+		<usage>[LEFT]{TEXT}[/LEFT]</usage>
+		<template><![CDATA[
+			<div style="text-align:left">{TEXT}</div>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="LIST">
+		<usage>[LIST type={HASHMAP=1:decimal,a:lower-alpha,A:upper-alpha,i:lower-roman,I:upper-roman;optional;postFilter=#simpletext} start={UINT;optional} #createChild=LI]{TEXT}[/LIST]</usage>
+		<template><![CDATA[
+			<xsl:choose>
+				<xsl:when test="not(@type)">
+					<ul><xsl:apply-templates /></ul>
+				</xsl:when>
+				<xsl:when test="starts-with(@type,'decimal') or starts-with(@type,'lower') or starts-with(@type,'upper')">
+					<ol style="list-style-type:{@type}"><xsl:copy-of select="@start"/><xsl:apply-templates /></ol>
+				</xsl:when>
+				<xsl:otherwise>
+					<ul style="list-style-type:{@type}"><xsl:apply-templates /></ul>
+				</xsl:otherwise>
+			</xsl:choose>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="*" tagName="LI">
+		<usage>[*]{TEXT}[/*]</usage>
+		<template><![CDATA[
+			<li><xsl:apply-templates /></li>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="MAGNET">
+		<usage>[MAGNET={REGEXP=/^magnet:/;useContent}]{TEXT}[/MAGNET]</usage>
+		<!-- Includes a public domain image from http://commons.wikimedia.org/wiki/File:TPB_Magnet_Icon.gif -->
+		<template><![CDATA[
+			<a href="{REGEXP}"><img alt="" src="data:image/gif;base64,R0lGODlhDAAMALMPAOXl5ewvErW1tebm5oocDkVFRePj47a2ts0WAOTk5MwVAIkcDesuEs0VAEZGRv///yH5BAEAAA8ALAAAAAAMAAwAAARB8MnnqpuzroZYzQvSNMroUeFIjornbK1mVkRzUgQSyPfbFi/dBRdzCAyJoTFhcBQOiYHyAABUDsiCxAFNWj6UbwQAOw==" style="vertical-align:middle;border:0;margin:0 5px 0 0"/>{TEXT}</a>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="NOPARSE">
+		<usage>[NOPARSE #ignoreTags=true]{TEXT}[/NOPARSE]</usage>
+		<template>{TEXT}</template>
+	</bbcode>
+
+	<bbcode name="OL">
+		<usage>[OL]{TEXT}[/OL]</usage>
+		<template><![CDATA[
+			<ol>{TEXT}</ol>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="QUOTE">
+		<usage>[QUOTE author={TEXT;optional}]{TEXT}[/QUOTE]</usage>
+		<template><![CDATA[
+			<blockquote>
+				<xsl:if test="not(@author)">
+					<xsl:attribute name="class">uncited</xsl:attribute>
+				</xsl:if>
+				<div>
+					<xsl:if test="@author">
+						<cite>]]>
+							<var name="authorStr"><![CDATA[<xsl:value-of select="@author" /> wrote:]]></var>
+						<![CDATA[</cite>
+					</xsl:if>
+					<xsl:apply-templates />
+				</div>
+			</blockquote>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="RIGHT">
+		<usage>[RIGHT]{TEXT}[/RIGHT]</usage>
+		<template><![CDATA[
+			<div style="text-align:right">{TEXT}</div>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="S">
+		<usage>[S]{TEXT}[/S]</usage>
+		<template><![CDATA[
+			<s>{TEXT}</s>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="SIZE">
+		<usage>[SIZE={RANGE=<var name="min">8</var>,<var name="max">36</var>}]{TEXT}[/SIZE]</usage>
+		<template><![CDATA[
+			<span style="font-size:{RANGE}px">{TEXT}</span>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="SPOILER">
+		<usage>[SPOILER title={TEXT1;optional}]{TEXT2}[/SPOILER]</usage>
+		<template><![CDATA[
+			<div class="spoiler">
+				<div class="spoiler-header">
+					<!--
+						var nextSiblingStyle = parentNode.nextSibling.style,
+							firstChildStyle  = firstChild.style,
+							lastChildStyle   = lastChild.style;
+
+						if (nextSiblingStyle.display !== '')
+						{
+							nextSiblingStyle.display = lastChildStyle.display = '';
+							firstChildStyle.display  = 'none';
+						}
+						else
+						{
+							nextSiblingStyle.display = lastChildStyle.display = 'none';
+							firstChildStyle.display  = '';
+						}
+					-->
+					<button onclick="var a=parentNode.nextSibling.style,b=firstChild.style,c=lastChild.style;''!==a.display?(a.display=c.display='',b.display='none'):(a.display=c.display='none',b.display='')"><span>]]><var name="showStr">Show</var><![CDATA[</span><span style="display:none">]]><var name="hideStr">Hide</var><![CDATA[</span></button>
+					<span class="spoiler-title">]]><var name="spoilerStr">Spoiler:</var><![CDATA[ {TEXT1}</span>
+				</div>
+				<div class="spoiler-content" style="display:none">{TEXT2}</div>
+			</div>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="STRONG">
+		<usage>[STRONG]{TEXT}[/STRONG]</usage>
+		<template><![CDATA[
+			<strong>{TEXT}</strong>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="SUB">
+		<usage>[SUB]{TEXT}[/SUB]</usage>
+		<template><![CDATA[
+			<sub>{TEXT}</sub>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="SUP">
+		<usage>[SUP]{TEXT}[/SUP]</usage>
+		<template><![CDATA[
+			<sup>{TEXT}</sup>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="TABLE">
+		<usage>[TABLE]{ANYTHING}[/TABLE]</usage>
+		<template><![CDATA[
+			<table>{ANYTHING}</table>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="TD">
+		<usage>[TD align={CHOICE=left,center,right,justify;caseSensitive;optional;preFilter=strtolower} #createParagraphs=false]{TEXT}[/TD]</usage>
+		<template><![CDATA[
+			<td>
+				<xsl:if test="@align">
+					<xsl:attribute name="style">text-align:{CHOICE}</xsl:attribute>
+				</xsl:if>
+				<xsl:apply-templates/>
+			</td>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="TH">
+		<usage>[TH align={CHOICE=left,center,right,justify;caseSensitive;optional;preFilter=strtolower} #createParagraphs=false]{TEXT}[/TH]</usage>
+		<template><![CDATA[
+			<th>
+				<xsl:if test="@align">
+					<xsl:attribute name="style">text-align:{CHOICE}</xsl:attribute>
+				</xsl:if>
+				<xsl:apply-templates/>
+			</th>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="TR">
+		<usage>[TR]{ANYTHING}[/TR]</usage>
+		<template><![CDATA[
+			<tr>{ANYTHING}</tr>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="U">
+		<usage>[U]{TEXT}[/U]</usage>
+		<template><![CDATA[
+			<u>{TEXT}</u>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="UL">
+		<usage>[UL]{TEXT}[/UL]</usage>
+		<template><![CDATA[
+			<ul>{TEXT}</ul>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="URL">
+		<usage>[URL={URL;useContent} title={TEXT;optional}]{TEXT}[/URL]</usage>
+		<template><![CDATA[
+			<a href="{@url}"><xsl:copy-of select="@title" /><xsl:apply-templates /></a>
+		]]></template>
+	</bbcode>
+
+	<bbcode name="VAR">
+		<usage>[VAR]{TEXT}[/VAR]</usage>
+		<template><![CDATA[
+			<var>{TEXT}</var>
+		]]></template>
+	</bbcode>
+
+</repository>
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/BBCodes/Parser.js
@@ -0,0 +1,377 @@
+/**
+* @type {!Object} Attributes of the BBCode being parsed
+*/
+var attributes;
+
+/**
+* @type {!Object} Configuration for the BBCode being parsed
+*/
+var bbcodeConfig;
+
+/**
+* @type {!string} Name of the BBCode being parsed
+*/
+var bbcodeName;
+
+/**
+* @type {!string} Suffix of the BBCode being parsed, including its colon
+*/
+var bbcodeSuffix;
+
+/**
+* @type {!number} Position of the cursor in the original text
+*/
+var pos;
+
+/**
+* @type {!number} Position of the start of the BBCode being parsed
+*/
+var startPos;
+
+/**
+* @type {!number} Length of the text being parsed
+*/
+var textLen = text.length;
+
+/**
+* @type {!string} Text being parsed, normalized to uppercase
+*/
+var uppercaseText = '';
+
+matches.forEach(function(m)
+{
+	bbcodeName = m[1][0].toUpperCase();
+	if (!(bbcodeName in config.bbcodes))
+	{
+		return;
+	}
+	bbcodeConfig = config.bbcodes[bbcodeName];
+	startPos     = m[0][1];
+	pos          = startPos + m[0][0].length;
+
+	try
+	{
+		parseBBCode();
+	}
+	catch (e)
+	{
+		// Do nothing
+	}
+});
+
+/**
+* Add the end tag that matches current BBCode
+*
+* @return {!Tag}
+*/
+function addBBCodeEndTag()
+{
+	return addEndTag(getTagName(), startPos, pos - startPos);
+}
+
+/**
+* Add the self-closing tag that matches current BBCode
+*
+* @return {!Tag}
+*/
+function addBBCodeSelfClosingTag()
+{
+	var tag = addSelfClosingTag(getTagName(), startPos, pos - startPos);
+	tag.setAttributes(attributes);
+
+	return tag;
+}
+
+/**
+* Add the start tag that matches current BBCode
+*
+* @return {!Tag}
+*/
+function addBBCodeStartTag()
+{
+	var tag = addStartTag(getTagName(), startPos, pos - startPos);
+	tag.setAttributes(attributes);
+
+	return tag;
+}
+
+/**
+* Parse the end tag that matches given BBCode name and suffix starting at current position
+*
+* @return {Tag}
+*/
+function captureEndTag()
+{
+	if (!uppercaseText)
+	{
+		uppercaseText = text.toUpperCase();
+	}
+	var match     = '[/' + bbcodeName + bbcodeSuffix + ']',
+		endTagPos = uppercaseText.indexOf(match, pos);
+	if (endTagPos < 0)
+	{
+		return null;
+	}
+
+	return addEndTag(getTagName(), endTagPos, match.length);
+}
+
+/**
+* Get the tag name for current BBCode
+*
+* @return string
+*/
+function getTagName()
+{
+	// Use the configured tagName if available, or reuse the BBCode's name otherwise
+	return bbcodeConfig.tagName || bbcodeName;
+}
+
+/**
+* Parse attributes starting at current position
+*
+* @return array Associative array of [name => value]
+*/
+function parseAttributes()
+{
+	var firstPos = pos, attrName;
+	attributes = {};
+	while (pos < textLen)
+	{
+		var c = text.charAt(pos);
+		if (" \n\t".indexOf(c) > -1)
+		{
+			++pos;
+			continue;
+		}
+		if ('/]'.indexOf(c) > -1)
+		{
+			return;
+		}
+
+		// Capture the attribute name
+		var spn = /^[-\w]*/.exec(text.substr(pos, 100))[0].length;
+		if (spn)
+		{
+			attrName = text.substr(pos, spn).toLowerCase();
+			pos += spn;
+			if (pos >= textLen)
+			{
+				// The attribute name extends to the end of the text
+				throw '';
+			}
+			if (text.charAt(pos) !== '=')
+			{
+				// It's an attribute name not followed by an equal sign, ignore it
+				continue;
+			}
+		}
+		else if (c === '=' && pos === firstPos)
+		{
+			// This is the default param, e.g. [quote=foo]
+			attrName = bbcodeConfig.defaultAttribute || bbcodeName.toLowerCase();
+		}
+		else
+		{
+			throw '';
+		}
+
+		// Move past the = and make sure we're not at the end of the text
+		if (++pos >= textLen)
+		{
+			throw '';
+		}
+
+		attributes[attrName] = parseAttributeValue();
+	}
+}
+
+/**
+* Parse the attribute value starting at current position
+*
+* @return string
+*/
+function parseAttributeValue()
+{
+	// Test whether the value is in quotes
+	if (text.charAt(pos) === '"' || text.charAt(pos) === "'")
+	{
+		return parseQuotedAttributeValue();
+	}
+
+	// Capture everything up to whichever comes first:
+	//  - an endline
+	//  - whitespace followed by a slash and a closing bracket
+	//  - a closing bracket, optionally preceded by whitespace
+	//  - whitespace followed by another attribute (name followed by equal sign)
+	//
+	// NOTE: this is for compatibility with some forums (such as vBulletin it seems)
+	//       that do not put attribute values in quotes, e.g.
+	//       [quote=John Smith;123456] (quoting "John Smith" from post #123456)
+	var match = /[^\]\n]*?(?=\s*(?:\s\/)?\]|\s+[-\w]+=)/.exec(text.substr(pos));
+	if (!match)
+	{
+		throw '';
+	}
+
+	var attrValue = match[0];
+	pos += attrValue.length;
+
+	return attrValue;
+}
+
+/**
+* Parse current BBCode
+*
+* @return void
+*/
+function parseBBCode()
+{
+	parseBBCodeSuffix();
+
+	// Test whether this is an end tag
+	if (text.charAt(startPos + 1) === '/')
+	{
+		// Test whether the tag is properly closed and whether this tag has an identifier.
+		// We skip end tags that carry an identifier because they're automatically added
+		// when their start tag is processed
+		if (text.charAt(pos) === ']' && bbcodeSuffix === '')
+		{
+			++pos;
+			addBBCodeEndTag();
+		}
+
+		return;
+	}
+
+	// Parse attributes and fill in the blanks with predefined attributes
+	parseAttributes();
+	if (bbcodeConfig.predefinedAttributes)
+	{
+		for (var attrName in bbcodeConfig.predefinedAttributes)
+		{
+			if (!(attrName in attributes))
+			{
+				attributes[attrName] = bbcodeConfig.predefinedAttributes[attrName];
+			}
+		}
+	}
+
+	// Test whether the tag is properly closed
+	if (text.charAt(pos) === ']')
+	{
+		++pos;
+	}
+	else
+	{
+		// Test whether this is a self-closing tag
+		if (text.substr(pos, 2) === '/]')
+		{
+			pos += 2;
+			addBBCodeSelfClosingTag();
+		}
+
+		return;
+	}
+
+	// Record the names of attributes that need the content of this tag
+	var contentAttributes = [];
+	if (bbcodeConfig.contentAttributes)
+	{
+		bbcodeConfig.contentAttributes.forEach(function(attrName)
+		{
+			if (!(attrName in attributes))
+			{
+				contentAttributes.push(attrName);
+			}
+		});
+	}
+
+	// Look ahead and parse the end tag that matches this tag, if applicable
+	var requireEndTag = (bbcodeSuffix || bbcodeConfig.forceLookahead),
+		endTag = (requireEndTag || contentAttributes.length) ? captureEndTag() : null;
+	if (endTag)
+	{
+		contentAttributes.forEach(function(attrName)
+		{
+			attributes[attrName] = text.substr(pos, endTag.getPos() - pos);
+		});
+	}
+	else if (requireEndTag)
+	{
+		return;
+	}
+
+	// Create this start tag
+	var tag = addBBCodeStartTag();
+
+	// If an end tag was created, pair it with this start tag
+	if (endTag)
+	{
+		tag.pairWith(endTag);
+	}
+}
+
+/**
+* Parse the BBCode suffix starting at current position
+*
+* Used to explicitly pair specific tags together, e.g.
+*   [code:123][code]type your code here[/code][/code:123]
+*
+* @return void
+*/
+function parseBBCodeSuffix()
+{
+	bbcodeSuffix = '';
+	if (text[pos] === ':')
+	{
+		// Capture the colon and the (0 or more) digits following it
+		bbcodeSuffix = /^:\d*/.exec(text.substr(pos))[0];
+
+		// Move past the suffix
+		pos += bbcodeSuffix.length;
+	}
+}
+
+/**
+* Parse a quoted attribute value that starts at current offset
+*
+* @return {!string}
+*/
+function parseQuotedAttributeValue()
+{
+	var quote    = text.charAt(pos),
+		valuePos = pos + 1;
+	while (1)
+	{
+		// Look for the next quote
+		pos = text.indexOf(quote, pos + 1);
+		if (pos < 0)
+		{
+			// No matching quote. Apparently that string never ends...
+			throw '';
+		}
+
+		// Test for an odd number of backslashes before this character
+		var n = 0;
+		do
+		{
+			++n;
+		}
+		while (text.charAt(pos - n) === '\\');
+
+		if (n % 2)
+		{
+			// If n is odd, it means there's an even number of backslashes. We can exit this loop
+			break;
+		}
+	}
+
+	// Unescape special characters ' " and \
+	var attrValue = text.substr(valuePos, pos - valuePos).replace(/\\([\\'"])/g, '$1');
+
+	// Skip past the closing quote
+	++pos;
+
+	return attrValue;
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/BBCodes/Parser.php
@@ -0,0 +1,200 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\BBCodes;
+use RuntimeException;
+use s9e\TextFormatter\Parser\Tag;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	protected $attributes;
+	protected $bbcodeConfig;
+	protected $bbcodeName;
+	protected $bbcodeSuffix;
+	protected $pos;
+	protected $startPos;
+	protected $text;
+	protected $textLen;
+	protected $uppercaseText;
+	public function parse($text, array $matches)
+	{
+		$this->text          = $text;
+		$this->textLen       = \strlen($text);
+		$this->uppercaseText = '';
+		foreach ($matches as $m)
+		{
+			$this->bbcodeName = \strtoupper($m[1][0]);
+			if (!isset($this->config['bbcodes'][$this->bbcodeName]))
+				continue;
+			$this->bbcodeConfig = $this->config['bbcodes'][$this->bbcodeName];
+			$this->startPos     = $m[0][1];
+			$this->pos          = $this->startPos + \strlen($m[0][0]);
+			try
+			{
+				$this->parseBBCode();
+			}
+			catch (RuntimeException $e)
+			{
+				}
+		}
+	}
+	protected function addBBCodeEndTag()
+	{
+		return $this->parser->addEndTag($this->getTagName(), $this->startPos, $this->pos - $this->startPos);
+	}
+	protected function addBBCodeSelfClosingTag()
+	{
+		$tag = $this->parser->addSelfClosingTag($this->getTagName(), $this->startPos, $this->pos - $this->startPos);
+		$tag->setAttributes($this->attributes);
+		return $tag;
+	}
+	protected function addBBCodeStartTag()
+	{
+		$tag = $this->parser->addStartTag($this->getTagName(), $this->startPos, $this->pos - $this->startPos);
+		$tag->setAttributes($this->attributes);
+		return $tag;
+	}
+	protected function captureEndTag()
+	{
+		if (empty($this->uppercaseText))
+			$this->uppercaseText = \strtoupper($this->text);
+		$match     = '[/' . $this->bbcodeName . $this->bbcodeSuffix . ']';
+		$endTagPos = \strpos($this->uppercaseText, $match, $this->pos);
+		if ($endTagPos === \false)
+			return;
+		return $this->parser->addEndTag($this->getTagName(), $endTagPos, \strlen($match));
+	}
+	protected function getTagName()
+	{
+		return (isset($this->bbcodeConfig['tagName']))
+		     ? $this->bbcodeConfig['tagName']
+		     : $this->bbcodeName;
+	}
+	protected function parseAttributes()
+	{
+		$firstPos = $this->pos;
+		$this->attributes = array();
+		while ($this->pos < $this->textLen)
+		{
+			$c = $this->text[$this->pos];
+			if (\strpos(" \n\t", $c) !== \false)
+			{
+				++$this->pos;
+				continue;
+			}
+			if (\strpos('/]', $c) !== \false)
+				return;
+			$spn = \strspn($this->text, 'abcdefghijklmnopqrstuvwxyz_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-', $this->pos);
+			if ($spn)
+			{
+				$attrName = \strtolower(\substr($this->text, $this->pos, $spn));
+				$this->pos += $spn;
+				if ($this->pos >= $this->textLen)
+					throw new RuntimeException;
+				if ($this->text[$this->pos] !== '=')
+					continue;
+			}
+			elseif ($c === '=' && $this->pos === $firstPos)
+				$attrName = (isset($this->bbcodeConfig['defaultAttribute']))
+				          ? $this->bbcodeConfig['defaultAttribute']
+				          : \strtolower($this->bbcodeName);
+			else
+				throw new RuntimeException;
+			if (++$this->pos >= $this->textLen)
+				throw new RuntimeException;
+			$this->attributes[$attrName] = $this->parseAttributeValue();
+		}
+	}
+	protected function parseAttributeValue()
+	{
+		if ($this->text[$this->pos] === '"' || $this->text[$this->pos] === "'")
+			return $this->parseQuotedAttributeValue();
+		if (!\preg_match('#[^\\]\\n]*?(?=\\s*(?:\\s/)?\\]|\\s+[-\\w]+=)#', $this->text, $m, \null, $this->pos))
+			throw new RuntimeException;
+		$attrValue  = $m[0];
+		$this->pos += \strlen($attrValue);
+		return $attrValue;
+	}
+	protected function parseBBCode()
+	{
+		$this->parseBBCodeSuffix();
+		if ($this->text[$this->startPos + 1] === '/')
+		{
+			if (\substr($this->text, $this->pos, 1) === ']' && $this->bbcodeSuffix === '')
+			{
+				++$this->pos;
+				$this->addBBCodeEndTag();
+			}
+			return;
+		}
+		$this->parseAttributes();
+		if (isset($this->bbcodeConfig['predefinedAttributes']))
+			$this->attributes += $this->bbcodeConfig['predefinedAttributes'];
+		if (\substr($this->text, $this->pos, 1) === ']')
+			++$this->pos;
+		else
+		{
+			if (\substr($this->text, $this->pos, 2) === '/]')
+			{
+				$this->pos += 2;
+				$this->addBBCodeSelfClosingTag();
+			}
+			return;
+		}
+		$contentAttributes = array();
+		if (isset($this->bbcodeConfig['contentAttributes']))
+			foreach ($this->bbcodeConfig['contentAttributes'] as $attrName)
+				if (!isset($this->attributes[$attrName]))
+					$contentAttributes[] = $attrName;
+		$requireEndTag = ($this->bbcodeSuffix || !empty($this->bbcodeConfig['forceLookahead']));
+		$endTag = ($requireEndTag || !empty($contentAttributes)) ? $this->captureEndTag() : \null;
+		if (isset($endTag))
+			foreach ($contentAttributes as $attrName)
+				$this->attributes[$attrName] = \substr($this->text, $this->pos, $endTag->getPos() - $this->pos);
+		elseif ($requireEndTag)
+			return;
+		$tag = $this->addBBCodeStartTag();
+		if (isset($endTag))
+			$tag->pairWith($endTag);
+	}
+	protected function parseBBCodeSuffix()
+	{
+		$this->bbcodeSuffix = '';
+		if ($this->text[$this->pos] === ':')
+		{
+			$spn = 1 + \strspn($this->text, '0123456789', 1 + $this->pos);
+			$this->bbcodeSuffix = \substr($this->text, $this->pos, $spn);
+			$this->pos += $spn;
+		}
+	}
+	protected function parseQuotedAttributeValue()
+	{
+		$quote    = $this->text[$this->pos];
+		$valuePos = $this->pos + 1;
+		while (1)
+		{
+			$this->pos = \strpos($this->text, $quote, $this->pos + 1);
+			if ($this->pos === \false)
+				throw new RuntimeException;
+			$n = 0;
+			do
+			{
+				++$n;
+			}
+			while ($this->text[$this->pos - $n] === '\\');
+			if ($n % 2)
+				break;
+		}
+		$attrValue = \preg_replace(
+			'#\\\\([\\\\\'"])#',
+			'$1',
+			\substr($this->text, $valuePos, $this->pos - $valuePos)
+		);
+		++$this->pos;
+		return $attrValue;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Censor/Configurator.php
@@ -0,0 +1,164 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Censor;
+use ArrayAccess;
+use Countable;
+use Iterator;
+use s9e\TextFormatter\Configurator\Collections\NormalizedCollection;
+use s9e\TextFormatter\Configurator\Helpers\ConfigHelper;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+use s9e\TextFormatter\Configurator\Items\Regexp;
+use s9e\TextFormatter\Configurator\JavaScript\Code;
+use s9e\TextFormatter\Configurator\JavaScript\RegexpConvertor;
+use s9e\TextFormatter\Configurator\Traits\CollectionProxy;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class Configurator extends ConfiguratorBase implements ArrayAccess, Countable, Iterator
+{
+	public function __call($methodName, $args)
+	{
+		return \call_user_func_array(array($this->collection, $methodName), $args);
+	}
+	public function offsetExists($offset)
+	{
+		return isset($this->collection[$offset]);
+	}
+	public function offsetGet($offset)
+	{
+		return $this->collection[$offset];
+	}
+	public function offsetSet($offset, $value)
+	{
+		$this->collection[$offset] = $value;
+	}
+	public function offsetUnset($offset)
+	{
+		unset($this->collection[$offset]);
+	}
+	public function count()
+	{
+		return \count($this->collection);
+	}
+	public function current()
+	{
+		return $this->collection->current();
+	}
+	public function key()
+	{
+		return $this->collection->key();
+	}
+	public function next()
+	{
+		return $this->collection->next();
+	}
+	public function rewind()
+	{
+		$this->collection->rewind();
+	}
+	public function valid()
+	{
+		return $this->collection->valid();
+	}
+	protected $allowed = array();
+	protected $attrName = 'with';
+	protected $collection;
+	protected $defaultReplacement = '****';
+	protected $regexpOptions = array(
+		'caseInsensitive' => \true,
+		'specialChars'    => array(
+			'*' => '[\\pL\\pN]*',
+			'?' => '.',
+			' ' => '\\s*'
+		)
+	);
+	protected $tagName = 'CENSOR';
+	protected function setUp()
+	{
+		$this->collection = new NormalizedCollection;
+		$this->collection->onDuplicate('replace');
+		if (isset($this->configurator->tags[$this->tagName]))
+			return;
+		$tag = $this->configurator->tags->add($this->tagName);
+		$tag->attributes->add($this->attrName)->required = \false;
+		$tag->rules->ignoreTags();
+		$tag->template =
+			'<xsl:choose>
+				<xsl:when test="@' . $this->attrName . '">
+					<xsl:value-of select="@' . \htmlspecialchars($this->attrName) . '"/>
+				</xsl:when>
+				<xsl:otherwise>' . \htmlspecialchars($this->defaultReplacement) . '</xsl:otherwise>
+			</xsl:choose>';
+	}
+	public function allow($word)
+	{
+		$this->allowed[$word] = \true;
+	}
+	public function getHelper()
+	{
+		$config = $this->asConfig();
+		if (isset($config))
+			$config = ConfigHelper::filterConfig($config, 'PHP');
+		else
+			$config = array(
+				'attrName' => $this->attrName,
+				'regexp'   => '/(?!)/',
+				'tagName'  => $this->tagName
+			);
+		return new Helper($config);
+	}
+	public function asConfig()
+	{
+		$words = $this->getWords();
+		if (empty($words))
+			return;
+		$config = array(
+			'attrName' => $this->attrName,
+			'regexp'   => $this->getWordsRegexp(\array_keys($words)),
+			'tagName'  => $this->tagName
+		);
+		$replacementWords = array();
+		foreach ($words as $word => $replacement)
+			if (isset($replacement) && $replacement !== $this->defaultReplacement)
+				$replacementWords[$replacement][] = $word;
+		foreach ($replacementWords as $replacement => $words)
+		{
+			$wordsRegexp = '/^' . RegexpBuilder::fromList($words, $this->regexpOptions) . '$/Diu';
+			$regexp = new Regexp($wordsRegexp);
+			$regexp->setJS(RegexpConvertor::toJS(\str_replace('[\\pL\\pN]', '[^\\s!-\\/:-?]', $wordsRegexp)));
+			$config['replacements'][] = array($regexp, $replacement);
+		}
+		if (!empty($this->allowed))
+			$config['allowed'] = $this->getWordsRegexp(\array_keys($this->allowed));
+		return $config;
+	}
+	public function getJSHints()
+	{
+		$hints = array(
+			'CENSOR_HAS_ALLOWED'      => !empty($this->allowed),
+			'CENSOR_HAS_REPLACEMENTS' => \false
+		);
+		foreach ($this->getWords() as $replacement)
+			if (isset($replacement) && $replacement !== $this->defaultReplacement)
+			{
+				$hints['CENSOR_HAS_REPLACEMENTS'] = \true;
+				break;
+			}
+		return $hints;
+	}
+	protected function getWords()
+	{
+		return \array_diff_key(\iterator_to_array($this->collection), $this->allowed);
+	}
+	protected function getWordsRegexp(array $words)
+	{
+		$expr = RegexpBuilder::fromList($words, $this->regexpOptions);
+		$expr = \preg_replace('/(?<!\\\\)((?>\\\\\\\\)*)\\(\\?:/', '$1(?>', $expr);
+		$regexp = new Regexp('/(?<![\\pL\\pN])' . $expr . '(?![\\pL\\pN])/Siu');
+		$regexp->setJS('/(?:^|\\W)' . \str_replace('[\\pL\\pN]', '[^\\s!-\\/:-?]', $expr) . '(?!\\w)/gi');
+		return $regexp;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Censor/Helper.php
@@ -0,0 +1,122 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Censor;
+class Helper
+{
+	public $allowed;
+	public $attrName = 'with';
+	public $defaultReplacement = '****';
+	public $regexp = '/(?!)/';
+	public $replacements = array();
+	public $tagName = 'CENSOR';
+	public function __construct(array $config)
+	{
+		foreach ($config as $k => $v)
+			$this->$k = $v;
+	}
+	public function censorHtml($html, $censorAttributes = \false)
+	{
+		$_this = $this;
+		$attributesExpr = '';
+		if ($censorAttributes)
+			$attributesExpr = '|[^<">]*+(?=<|$|"(?> [-\\w]+="[^"]*+")*+\\/?>)';
+		$delim  = $this->regexp[0];
+		$pos    = \strrpos($this->regexp, $delim);
+		$regexp = $delim
+		        . '(?<!&#)(?<!&)'
+		        . \substr($this->regexp, 1, $pos - 1)
+		        . '(?=[^<>]*+(?=<|$)' . $attributesExpr . ')'
+		        . \substr($this->regexp, $pos);
+		return \preg_replace_callback(
+			$regexp,
+			function ($m) use ($_this)
+			{
+				return \htmlspecialchars($_this->getReplacement($m[0]), \ENT_QUOTES);
+			},
+			$html
+		);
+	}
+	public function censorText($text)
+	{
+		$_this = $this;
+		return \preg_replace_callback(
+			$this->regexp,
+			function ($m) use ($_this)
+			{
+				return $_this->getReplacement($m[0]);
+			},
+			$text
+		);
+	}
+	public function isCensored($word)
+	{
+		return (\preg_match($this->regexp, $word) && !$this->isAllowed($word));
+	}
+	public function reparse($xml)
+	{
+		$_this = $this;
+		if (\strpos($xml, '</' . $this->tagName . '>') !== \false)
+		{
+			$xml = \preg_replace_callback(
+				'#<' . $this->tagName . '[^>]*>([^<]+)</' . $this->tagName . '>#',
+				function ($m) use ($_this)
+				{
+					return ($_this->isCensored($m[1])) ? $_this->buildTag($m[1]) : $m[1];
+				},
+				$xml
+			);
+		}
+		$delim  = $this->regexp[0];
+		$pos    = \strrpos($this->regexp, $delim);
+		$regexp = $delim
+		        . '(?<!&)'
+		        . \substr($this->regexp, 1, $pos - 1)
+		        . '(?=[^<>]*+<(?!\\/(?-i)' . $this->tagName . '>))'
+		        . \substr($this->regexp, $pos);
+		$xml = \preg_replace_callback(
+			$regexp,
+			function ($m) use ($_this)
+			{
+				return ($_this->isAllowed($m[0])) ? $m[0] : $_this->buildTag($m[0]);
+			},
+			$xml,
+			-1,
+			$cnt
+		);
+		if ($cnt > 0 && $xml[1] === 't')
+		{
+			$xml[1] = 'r';
+			$xml[\strlen($xml) - 2] = 'r';
+		}
+		return $xml;
+	}
+	public function buildTag($word)
+	{
+		$startTag = '<' . $this->tagName;
+		$replacement = $this->getReplacement($word);
+		if ($replacement !== $this->defaultReplacement)
+			$startTag .= ' ' . $this->attrName . '="' . \htmlspecialchars($replacement, \ENT_COMPAT) . '"';
+		return $startTag . '>' . $word . '</' . $this->tagName . '>';
+	}
+	public function getReplacement($word)
+	{
+		if ($this->isAllowed($word))
+			return $word;
+		foreach ($this->replacements as $_23be09c)
+		{
+			list($regexp, $replacement) = $_23be09c;
+			if (\preg_match($regexp, $word))
+				return $replacement;
+		}
+		return $this->defaultReplacement;
+	}
+	public function isAllowed($word)
+	{
+		return (isset($this->allowed) && \preg_match($this->allowed, $word));
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Censor/Parser.js
@@ -0,0 +1,42 @@
+var tagName  = config.tagName,
+	attrName = config.attrName;
+
+matches.forEach(function(m)
+{
+	if (isAllowed(m[0][0]))
+	{
+		return;
+	}
+
+	// NOTE: unlike the PCRE regexp, the JavaScript regexp can consume an extra character at the
+	//       start of the match, so we have to adjust the position and length accordingly
+	var offset = /^\W/.test(m[0][0]) ? 1 : 0,
+		word   = m[0][0].substr(offset),
+		tag    = addSelfClosingTag(tagName, m[0][1] + offset, word.length);
+
+	if (HINT.CENSOR_HAS_REPLACEMENTS && config.replacements)
+	{
+		for (var i = 0; i < config.replacements.length; ++i)
+		{
+			var regexp      = config.replacements[i][0],
+				replacement = config.replacements[i][1];
+
+			if (regexp.test(word))
+			{
+				tag.setAttribute(attrName, replacement);
+				break;
+			}
+		}
+	}
+});
+
+/**
+* Test whether given word is allowed
+*
+* @param  {!string}  word
+* @return {!boolean}
+*/
+function isAllowed(word)
+{
+	return (HINT.CENSOR_HAS_ALLOWED && config.allowed && config.allowed.test(word));
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Censor/Parser.php
@@ -0,0 +1,37 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Censor;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	public function parse($text, array $matches)
+	{
+		$tagName      = $this->config['tagName'];
+		$attrName     = $this->config['attrName'];
+		$replacements = (isset($this->config['replacements'])) ? $this->config['replacements'] : array();
+		foreach ($matches as $m)
+		{
+			if ($this->isAllowed($m[0][0]))
+				continue;
+			$tag = $this->parser->addSelfClosingTag($tagName, $m[0][1], \strlen($m[0][0]));
+			foreach ($replacements as $_681051f1)
+			{
+				list($regexp, $replacement) = $_681051f1;
+				if (\preg_match($regexp, $m[0][0]))
+				{
+					$tag->setAttribute($attrName, $replacement);
+					break;
+				}
+			}
+		}
+	}
+	protected function isAllowed($word)
+	{
+		return (isset($this->config['allowed']) && \preg_match($this->config['allowed'], $word));
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/ConfiguratorBase.php
@@ -0,0 +1,113 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins;
+use InvalidArgumentException;
+use RuntimeException;
+use s9e\TextFormatter\Configurator;
+use s9e\TextFormatter\Configurator\ConfigProvider;
+use s9e\TextFormatter\Configurator\Helpers\ConfigHelper;
+use s9e\TextFormatter\Configurator\JavaScript\Code;
+use s9e\TextFormatter\Configurator\Validators\AttributeName;
+use s9e\TextFormatter\Configurator\Validators\TagName;
+abstract class ConfiguratorBase implements ConfigProvider
+{
+	protected $configurator;
+	protected $quickMatch = \false;
+	protected $regexpLimit = 10000;
+	final public function __construct(Configurator $configurator, array $overrideProps = array())
+	{
+		$this->configurator = $configurator;
+		foreach ($overrideProps as $k => $v)
+		{
+			$methodName = 'set' . \ucfirst($k);
+			if (\method_exists($this, $methodName))
+				$this->$methodName($v);
+			elseif (\property_exists($this, $k))
+				$this->$k = $v;
+			else
+				throw new RuntimeException("Unknown property '" . $k . "'");
+		}
+		$this->setUp();
+	}
+	protected function setUp()
+	{
+	}
+	public function finalize()
+	{
+	}
+	public function asConfig()
+	{
+		$properties = \get_object_vars($this);
+		unset($properties['configurator']);
+		return ConfigHelper::toArray($properties);
+	}
+	final public function getBaseProperties()
+	{
+		$config = array(
+			'className'   => \preg_replace('/Configurator$/', 'Parser', \get_class($this)),
+			'quickMatch'  => $this->quickMatch,
+			'regexpLimit' => $this->regexpLimit
+		);
+		$js = $this->getJSParser();
+		if (isset($js))
+			$config['js'] = new Code($js);
+		return $config;
+	}
+	public function getJSHints()
+	{
+		return array();
+	}
+	public function getJSParser()
+	{
+		$className = \get_class($this);
+		if (\strpos($className, 's9e\\TextFormatter\\Plugins\\') === 0)
+		{
+			$p = \explode('\\', $className);
+			$pluginName = $p[3];
+			$filepath = __DIR__ . '/' . $pluginName . '/Parser.js';
+			if (\file_exists($filepath))
+				return \file_get_contents($filepath);
+		}
+		return \null;
+	}
+	public function getTag()
+	{
+		if (!isset($this->tagName))
+			throw new RuntimeException('No tag associated with this plugin');
+		return $this->configurator->tags[$this->tagName];
+	}
+	public function disableQuickMatch()
+	{
+		$this->quickMatch = \false;
+	}
+	protected function setAttrName($attrName)
+	{
+		if (!\property_exists($this, 'attrName'))
+			throw new RuntimeException("Unknown property 'attrName'");
+		$this->attrName = AttributeName::normalize($attrName);
+	}
+	public function setQuickMatch($quickMatch)
+	{
+		if (!\is_string($quickMatch))
+			throw new InvalidArgumentException('quickMatch must be a string');
+		$this->quickMatch = $quickMatch;
+	}
+	public function setRegexpLimit($limit)
+	{
+		$limit = (int) $limit;
+		if ($limit < 1)
+			throw new InvalidArgumentException('regexpLimit must be a number greater than 0');
+		$this->regexpLimit = $limit;
+	}
+	protected function setTagName($tagName)
+	{
+		if (!\property_exists($this, 'tagName'))
+			throw new RuntimeException("Unknown property 'tagName'");
+		$this->tagName = TagName::normalize($tagName);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Emoji/Configurator.php
@@ -0,0 +1,177 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Emoji;
+use s9e\TextFormatter\Configurator\Helpers\ConfigHelper;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+use s9e\TextFormatter\Configurator\Items\Regexp;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class Configurator extends ConfiguratorBase
+{
+	protected $attrName = 'seq';
+	protected $aliases = array();
+	protected $forceImageSize = \true;
+	protected $imageSet = 'emojione';
+	protected $imageSize = 16;
+	protected $imageType = 'png';
+	protected $tagName = 'EMOJI';
+	protected $twemojiAliases = array(
+		'00a9'                    => 'a9',
+		'00ae'                    => 'ae',
+		'0023-20e3'               => '23-20e3',
+		'002a-20e3'               => '2a-20e3',
+		'0030-20e3'               => '30-20e3',
+		'0031-20e3'               => '31-20e3',
+		'0032-20e3'               => '32-20e3',
+		'0033-20e3'               => '33-20e3',
+		'0034-20e3'               => '34-20e3',
+		'0035-20e3'               => '35-20e3',
+		'0036-20e3'               => '36-20e3',
+		'0037-20e3'               => '37-20e3',
+		'0038-20e3'               => '38-20e3',
+		'0039-20e3'               => '39-20e3',
+		'1f3f3-1f308'             => '1f3f3-fe0f-200d-1f308',
+		'1f3f4-2620'              => '1f3f4-200d-2620-fe0f',
+		'1f441-1f5e8'             => '1f441-200d-1f5e8',
+		'1f468-1f468-1f466-1f466' => '1f468-200d-1f468-200d-1f466-200d-1f466',
+		'1f468-1f468-1f466'       => '1f468-200d-1f468-200d-1f466',
+		'1f468-1f468-1f467-1f466' => '1f468-200d-1f468-200d-1f467-200d-1f466',
+		'1f468-1f468-1f467-1f467' => '1f468-200d-1f468-200d-1f467-200d-1f467',
+		'1f468-1f468-1f467'       => '1f468-200d-1f468-200d-1f467',
+		'1f468-1f469-1f466-1f466' => '1f468-200d-1f469-200d-1f466-200d-1f466',
+		'1f468-1f469-1f466'       => '1f468-200d-1f469-200d-1f466',
+		'1f468-1f469-1f467-1f466' => '1f468-200d-1f469-200d-1f467-200d-1f466',
+		'1f468-1f469-1f467-1f467' => '1f468-200d-1f469-200d-1f467-200d-1f467',
+		'1f468-1f469-1f467'       => '1f468-200d-1f469-200d-1f467',
+		'1f468-2764-1f468'        => '1f468-200d-2764-fe0f-200d-1f468',
+		'1f468-2764-1f48b-1f468'  => '1f468-200d-2764-fe0f-200d-1f48b-200d-1f468',
+		'1f469-1f469-1f466-1f466' => '1f469-200d-1f469-200d-1f466-200d-1f466',
+		'1f469-1f469-1f466'       => '1f469-200d-1f469-200d-1f466',
+		'1f469-1f469-1f467-1f466' => '1f469-200d-1f469-200d-1f467-200d-1f466',
+		'1f469-1f469-1f467-1f467' => '1f469-200d-1f469-200d-1f467-200d-1f467',
+		'1f469-1f469-1f467'       => '1f469-200d-1f469-200d-1f467',
+		'1f469-2764-1f468'        => '1f469-200d-2764-fe0f-200d-1f468',
+		'1f469-2764-1f469'        => '1f469-200d-2764-fe0f-200d-1f469',
+		'1f469-2764-1f48b-1f468'  => '1f469-200d-2764-fe0f-200d-1f48b-200d-1f468',
+		'1f469-2764-1f48b-1f469'  => '1f469-200d-2764-fe0f-200d-1f48b-200d-1f469'
+	);
+	protected function setUp()
+	{
+		if (isset($this->configurator->tags[$this->tagName]))
+			return;
+		$tag = $this->configurator->tags->add($this->tagName);
+		$tag->attributes->add($this->attrName)->filterChain->append(
+			$this->configurator->attributeFilters['#identifier']
+		);
+		$this->resetTemplate();
+	}
+	public function addAlias($alias, $emoji)
+	{
+		$this->aliases[$alias] = $emoji;
+	}
+	public function forceImageSize()
+	{
+		$this->forceImageSize = \true;
+		$this->resetTemplate();
+	}
+	public function removeAlias($alias)
+	{
+		unset($this->aliases[$alias]);
+	}
+	public function omitImageSize()
+	{
+		$this->forceImageSize = \false;
+		$this->resetTemplate();
+	}
+	public function getAliases()
+	{
+		return $this->aliases;
+	}
+	public function setImageSize($size)
+	{
+		$this->imageSize = (int) $size;
+		$this->resetTemplate();
+	}
+	public function useEmojiOne()
+	{
+		$this->imageSet = 'emojione';
+		$this->resetTemplate();
+	}
+	public function usePNG()
+	{
+		$this->imageType = 'png';
+		$this->resetTemplate();
+	}
+	public function useSVG()
+	{
+		$this->imageType = 'svg';
+		$this->resetTemplate();
+	}
+	public function useTwemoji()
+	{
+		$this->imageSet = 'twemoji';
+		$this->resetTemplate();
+	}
+	public function asConfig()
+	{
+		$config = array(
+			'attrName' => $this->attrName,
+			'tagName'  => $this->tagName
+		);
+		if (!empty($this->aliases))
+		{
+			$aliases = \array_keys($this->aliases);
+			$regexp  = '/' . RegexpBuilder::fromList($aliases) . '/';
+			$config['aliases']       = $this->aliases;
+			$config['aliasesRegexp'] = new Regexp($regexp, \true);
+			$quickMatch = ConfigHelper::generateQuickMatchFromList($aliases);
+			if ($quickMatch !== \false)
+				$config['aliasesQuickMatch'] = $quickMatch;
+		}
+		return $config;
+	}
+	public function getJSHints()
+	{
+		$quickMatch = ConfigHelper::generateQuickMatchFromList(\array_keys($this->aliases));
+		return array(
+			'EMOJI_HAS_ALIASES'          => !empty($this->aliases),
+			'EMOJI_HAS_ALIAS_QUICKMATCH' => ($quickMatch !== \false)
+		);
+	}
+	protected function getEmojiOneSrc()
+	{
+		$src  = '//cdn.jsdelivr.net/emojione/assets/' . $this->imageType . '/';
+		$src .= '<xsl:value-of select="@seq"/>';
+		$src .= '.' . $this->imageType;
+		return $src;
+	}
+	protected function getTemplate()
+	{
+		$template = '<img alt="{.}" class="emoji" draggable="false"';
+		if ($this->forceImageSize)
+			$template .= ' width="' . $this->imageSize . '" height="' . $this->imageSize . '"';
+		$template .= '><xsl:attribute name="src">';
+		$template .= ($this->imageSet === 'emojione') ? $this->getEmojiOneSrc() :  $this->getTwemojiSrc();
+		$template .= '</xsl:attribute></img>';
+		return $template;
+	}
+	protected function getTwemojiSrc()
+	{
+		$src  = '//twemoji.maxcdn.com/2/';
+		$src .= ($this->imageType === 'svg') ? 'svg' : '72x72';
+		$src .= '/<xsl:choose>';
+		foreach ($this->twemojiAliases as $seq => $filename)
+			$src .= '<xsl:when test="@seq=\'' . $seq . '\'">' . $filename . '</xsl:when>';
+		$src .= '<xsl:otherwise><xsl:value-of select="@seq"/></xsl:otherwise></xsl:choose>';
+		$src .= '.' . $this->imageType;
+		return $src;
+	}
+	protected function resetTemplate()
+	{
+		$this->getTag()->template = $this->getTemplate();
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Emoji/Parser.js
@@ -0,0 +1,125 @@
+/** @const */
+var asciiRegexp = /:[-+_a-z0-9]+(?=:)/g;
+
+/** @const */
+var map = {"+1":"1f44d","-1":"1f44e","100":"1f4af","1234":"1f522","8ball":"1f3b1","a":"1f170","ab":"1f18e","abc":"1f524","abcd":"1f521","accept":"1f251","aerial_tramway":"1f6a1","afghanistan":"1f1e6-1f1eb","airplane":"2708","airplane_arriving":"1f6ec","airplane_departure":"1f6eb","airplane_small":"1f6e9","aland_islands":"1f1e6-1f1fd","alarm_clock":"23f0","albania":"1f1e6-1f1f1","alembic":"2697","algeria":"1f1e9-1f1ff","alien":"1f47d","ambulance":"1f691","american_samoa":"1f1e6-1f1f8","amphora":"1f3fa","anchor":"2693","andorra":"1f1e6-1f1e9","angel":"1f47c","angel_tone1":"1f47c-1f3fb","angel_tone2":"1f47c-1f3fc","angel_tone3":"1f47c-1f3fd","angel_tone4":"1f47c-1f3fe","angel_tone5":"1f47c-1f3ff","anger":"1f4a2","anger_right":"1f5ef","angola":"1f1e6-1f1f4","angry":"1f620","anguilla":"1f1e6-1f1ee","anguished":"1f627","ant":"1f41c","antarctica":"1f1e6-1f1f6","antigua_barbuda":"1f1e6-1f1ec","apple":"1f34e","aquarius":"2652","argentina":"1f1e6-1f1f7","aries":"2648","armenia":"1f1e6-1f1f2","arrow_backward":"25c0","arrow_double_down":"23ec","arrow_double_up":"23eb","arrow_down":"2b07","arrow_down_small":"1f53d","arrow_forward":"25b6","arrow_heading_down":"2935","arrow_heading_up":"2934","arrow_left":"2b05","arrow_lower_left":"2199","arrow_lower_right":"2198","arrow_right":"27a1","arrow_right_hook":"21aa","arrow_up":"2b06","arrow_up_down":"2195","arrow_up_small":"1f53c","arrow_upper_left":"2196","arrow_upper_right":"2197","arrows_clockwise":"1f503","arrows_counterclockwise":"1f504","art":"1f3a8","articulated_lorry":"1f69b","artificial_satellite":"1f6f0","aruba":"1f1e6-1f1fc","asterisk":"002a-20e3","astonished":"1f632","athletic_shoe":"1f45f","atm":"1f3e7","atom":"269b","atom_symbol":"269b","australia":"1f1e6-1f1fa","austria":"1f1e6-1f1f9","avocado":"1f951","azerbaijan":"1f1e6-1f1ff","b":"1f171","baby":"1f476","baby_bottle":"1f37c","baby_chick":"1f424","baby_symbol":"1f6bc","baby_tone1":"1f476-1f3fb","baby_tone2":"1f476-1f3fc","baby_tone3":"1f476-1f3fd","baby_tone4":"1f476-1f3fe","baby_tone5":"1f476-1f3ff","back":"1f519","bacon":"1f953","badminton":"1f3f8","baggage_claim":"1f6c4","bahamas":"1f1e7-1f1f8","bahrain":"1f1e7-1f1ed","balance_scale":"2696","balloon":"1f388","ballot_box":"1f5f3","ballot_box_with_check":"2611","bamboo":"1f38d","banana":"1f34c","bangbang":"203c","bangladesh":"1f1e7-1f1e9","bank":"1f3e6","bar_chart":"1f4ca","barbados":"1f1e7-1f1e7","barber":"1f488","baseball":"26be","basketball":"1f3c0","basketball_man":"26f9","basketball_player":"26f9","basketball_player_tone1":"26f9-1f3fb","basketball_player_tone2":"26f9-1f3fc","basketball_player_tone3":"26f9-1f3fd","basketball_player_tone4":"26f9-1f3fe","basketball_player_tone5":"26f9-1f3ff","bat":"1f987","bath":"1f6c0","bath_tone1":"1f6c0-1f3fb","bath_tone2":"1f6c0-1f3fc","bath_tone3":"1f6c0-1f3fd","bath_tone4":"1f6c0-1f3fe","bath_tone5":"1f6c0-1f3ff","bathtub":"1f6c1","battery":"1f50b","beach":"1f3d6","beach_umbrella":"26f1","bear":"1f43b","bed":"1f6cf","bee":"1f41d","beer":"1f37a","beers":"1f37b","beetle":"1f41e","beginner":"1f530","belarus":"1f1e7-1f1fe","belgium":"1f1e7-1f1ea","belize":"1f1e7-1f1ff","bell":"1f514","bellhop":"1f6ce","bellhop_bell":"1f6ce","benin":"1f1e7-1f1ef","bento":"1f371","bermuda":"1f1e7-1f1f2","bhutan":"1f1e7-1f1f9","bicyclist":"1f6b4","bicyclist_tone1":"1f6b4-1f3fb","bicyclist_tone2":"1f6b4-1f3fc","bicyclist_tone3":"1f6b4-1f3fd","bicyclist_tone4":"1f6b4-1f3fe","bicyclist_tone5":"1f6b4-1f3ff","bike":"1f6b2","biking_man":"1f6b4","bikini":"1f459","biohazard":"2623","bird":"1f426","birthday":"1f382","black_circle":"26ab","black_flag":"1f3f4","black_heart":"1f5a4","black_joker":"1f0cf","black_large_square":"2b1b","black_medium_small_square":"25fe","black_medium_square":"25fc","black_nib":"2712","black_small_square":"25aa","black_square_button":"1f532","blonde_man":"1f471","blossom":"1f33c","blowfish":"1f421","blue_book":"1f4d8","blue_car":"1f699","blue_heart":"1f499","blush":"1f60a","boar":"1f417","boat":"26f5","bolivia":"1f1e7-1f1f4","bomb":"1f4a3","book":"1f4d6","bookmark":"1f516","bookmark_tabs":"1f4d1","books":"1f4da","boom":"1f4a5","boot":"1f462","bosnia_herzegovina":"1f1e7-1f1e6","botswana":"1f1e7-1f1fc","bouquet":"1f490","bow":"1f647","bow_and_arrow":"1f3f9","bow_tone1":"1f647-1f3fb","bow_tone2":"1f647-1f3fc","bow_tone3":"1f647-1f3fd","bow_tone4":"1f647-1f3fe","bow_tone5":"1f647-1f3ff","bowing_man":"1f647","bowling":"1f3b3","boxing_glove":"1f94a","boy":"1f466","boy_tone1":"1f466-1f3fb","boy_tone2":"1f466-1f3fc","boy_tone3":"1f466-1f3fd","boy_tone4":"1f466-1f3fe","boy_tone5":"1f466-1f3ff","brazil":"1f1e7-1f1f7","bread":"1f35e","bride_with_veil":"1f470","bride_with_veil_tone1":"1f470-1f3fb","bride_with_veil_tone2":"1f470-1f3fc","bride_with_veil_tone3":"1f470-1f3fd","bride_with_veil_tone4":"1f470-1f3fe","bride_with_veil_tone5":"1f470-1f3ff","bridge_at_night":"1f309","briefcase":"1f4bc","british_indian_ocean_territory":"1f1ee-1f1f4","british_virgin_islands":"1f1fb-1f1ec","broken_heart":"1f494","brunei":"1f1e7-1f1f3","bug":"1f41b","building_construction":"1f3d7","bulb":"1f4a1","bulgaria":"1f1e7-1f1ec","bullettrain_front":"1f685","bullettrain_side":"1f684","burkina_faso":"1f1e7-1f1eb","burrito":"1f32f","burundi":"1f1e7-1f1ee","bus":"1f68c","business_suit_levitating":"1f574","busstop":"1f68f","bust_in_silhouette":"1f464","busts_in_silhouette":"1f465","butterfly":"1f98b","cactus":"1f335","cake":"1f370","calendar":"1f4c6","calendar_spiral":"1f5d3","call_me":"1f919","call_me_tone1":"1f919-1f3fb","call_me_tone2":"1f919-1f3fc","call_me_tone3":"1f919-1f3fd","call_me_tone4":"1f919-1f3fe","call_me_tone5":"1f919-1f3ff","calling":"1f4f2","cambodia":"1f1f0-1f1ed","camel":"1f42b","camera":"1f4f7","camera_flash":"1f4f8","camera_with_flash":"1f4f8","cameroon":"1f1e8-1f1f2","camping":"1f3d5","canada":"1f1e8-1f1e6","canary_islands":"1f1ee-1f1e8","cancer":"264b","candle":"1f56f","candy":"1f36c","canoe":"1f6f6","cape_verde":"1f1e8-1f1fb","capital_abcd":"1f520","capricorn":"2651","car":"1f697","card_box":"1f5c3","card_file_box":"1f5c3","card_index":"1f4c7","card_index_dividers":"1f5c2","caribbean_netherlands":"1f1e7-1f1f6","carousel_horse":"1f3a0","carrot":"1f955","cartwheel":"1f938","cartwheel_tone1":"1f938-1f3fb","cartwheel_tone2":"1f938-1f3fc","cartwheel_tone3":"1f938-1f3fd","cartwheel_tone4":"1f938-1f3fe","cartwheel_tone5":"1f938-1f3ff","cat":"1f431","cat2":"1f408","cayman_islands":"1f1f0-1f1fe","cd":"1f4bf","central_african_republic":"1f1e8-1f1eb","chad":"1f1f9-1f1e9","chains":"26d3","champagne":"1f37e","champagne_glass":"1f942","chart":"1f4b9","chart_with_downwards_trend":"1f4c9","chart_with_upwards_trend":"1f4c8","checkered_flag":"1f3c1","cheese":"1f9c0","cherries":"1f352","cherry_blossom":"1f338","chestnut":"1f330","chicken":"1f414","children_crossing":"1f6b8","chile":"1f1e8-1f1f1","chipmunk":"1f43f","chocolate_bar":"1f36b","christmas_island":"1f1e8-1f1fd","christmas_tree":"1f384","church":"26ea","cinema":"1f3a6","circus_tent":"1f3aa","city_dusk":"1f306","city_sunrise":"1f307","city_sunset":"1f307","cityscape":"1f3d9","cl":"1f191","clamp":"1f5dc","clap":"1f44f","clap_tone1":"1f44f-1f3fb","clap_tone2":"1f44f-1f3fc","clap_tone3":"1f44f-1f3fd","clap_tone4":"1f44f-1f3fe","clap_tone5":"1f44f-1f3ff","clapper":"1f3ac","classical_building":"1f3db","clipboard":"1f4cb","clock":"1f570","clock1":"1f550","clock10":"1f559","clock1030":"1f565","clock11":"1f55a","clock1130":"1f566","clock12":"1f55b","clock1230":"1f567","clock130":"1f55c","clock2":"1f551","clock230":"1f55d","clock3":"1f552","clock330":"1f55e","clock4":"1f553","clock430":"1f55f","clock5":"1f554","clock530":"1f560","clock6":"1f555","clock630":"1f561","clock7":"1f556","clock730":"1f562","clock8":"1f557","clock830":"1f563","clock9":"1f558","clock930":"1f564","closed_book":"1f4d5","closed_lock_with_key":"1f510","closed_umbrella":"1f302","cloud":"2601","cloud_lightning":"1f329","cloud_rain":"1f327","cloud_snow":"1f328","cloud_tornado":"1f32a","cloud_with_lightning":"1f329","cloud_with_lightning_and_rain":"26c8","cloud_with_rain":"1f327","cloud_with_snow":"1f328","clown":"1f921","clubs":"2663","cn":"1f1e8-1f1f3","cocktail":"1f378","cocos_islands":"1f1e8-1f1e8","coffee":"2615","coffin":"26b0","cold_sweat":"1f630","collision":"1f4a5","colombia":"1f1e8-1f1f4","comet":"2604","comoros":"1f1f0-1f1f2","compression":"1f5dc","computer":"1f4bb","computer_mouse":"1f5b1","confetti_ball":"1f38a","confounded":"1f616","confused":"1f615","congo_brazzaville":"1f1e8-1f1ec","congo_kinshasa":"1f1e8-1f1e9","congratulations":"3297","construction":"1f6a7","construction_site":"1f3d7","construction_worker":"1f477","construction_worker_man":"1f477","construction_worker_tone1":"1f477-1f3fb","construction_worker_tone2":"1f477-1f3fc","construction_worker_tone3":"1f477-1f3fd","construction_worker_tone4":"1f477-1f3fe","construction_worker_tone5":"1f477-1f3ff","control_knobs":"1f39b","convenience_store":"1f3ea","cook_islands":"1f1e8-1f1f0","cookie":"1f36a","cooking":"1f373","cool":"1f192","cop":"1f46e","cop_tone1":"1f46e-1f3fb","cop_tone2":"1f46e-1f3fc","cop_tone3":"1f46e-1f3fd","cop_tone4":"1f46e-1f3fe","cop_tone5":"1f46e-1f3ff","copyright":"00a9","corn":"1f33d","costa_rica":"1f1e8-1f1f7","cote_divoire":"1f1e8-1f1ee","couch":"1f6cb","couch_and_lamp":"1f6cb","couple":"1f46b","couple_mm":"1f468-2764-1f468","couple_with_heart":"1f491","couple_with_heart_man_man":"1f468-2764-1f468","couple_with_heart_woman_man":"1f491","couple_with_heart_woman_woman":"1f469-2764-1f469","couple_ww":"1f469-2764-1f469","couplekiss":"1f48f","couplekiss_man_man":"1f468-2764-1f48b-1f468","couplekiss_man_woman":"1f48f","couplekiss_woman_woman":"1f469-2764-1f48b-1f469","cow":"1f42e","cow2":"1f404","cowboy":"1f920","crab":"1f980","crayon":"1f58d","credit_card":"1f4b3","crescent_moon":"1f319","cricket":"1f3cf","croatia":"1f1ed-1f1f7","crocodile":"1f40a","croissant":"1f950","cross":"271d","crossed_flags":"1f38c","crossed_swords":"2694","crown":"1f451","cruise_ship":"1f6f3","cry":"1f622","crying_cat_face":"1f63f","crystal_ball":"1f52e","cuba":"1f1e8-1f1fa","cucumber":"1f952","cupid":"1f498","curacao":"1f1e8-1f1fc","curly_loop":"27b0","currency_exchange":"1f4b1","curry":"1f35b","custard":"1f36e","customs":"1f6c3","cyclone":"1f300","cyprus":"1f1e8-1f1fe","czech_republic":"1f1e8-1f1ff","dagger":"1f5e1","dancer":"1f483","dancer_tone1":"1f483-1f3fb","dancer_tone2":"1f483-1f3fc","dancer_tone3":"1f483-1f3fd","dancer_tone4":"1f483-1f3fe","dancer_tone5":"1f483-1f3ff","dancers":"1f46f","dancing_women":"1f46f","dango":"1f361","dark_sunglasses":"1f576","dart":"1f3af","dash":"1f4a8","date":"1f4c5","de":"1f1e9-1f1ea","deciduous_tree":"1f333","deer":"1f98c","denmark":"1f1e9-1f1f0","department_store":"1f3ec","derelict_house":"1f3da","desert":"1f3dc","desert_island":"1f3dd","desktop":"1f5a5","desktop_computer":"1f5a5","detective":"1f575","diamond_shape_with_a_dot_inside":"1f4a0","diamonds":"2666","disappointed":"1f61e","disappointed_relieved":"1f625","dividers":"1f5c2","dizzy":"1f4ab","dizzy_face":"1f635","djibouti":"1f1e9-1f1ef","do_not_litter":"1f6af","dog":"1f436","dog2":"1f415","dollar":"1f4b5","dolls":"1f38e","dolphin":"1f42c","dominica":"1f1e9-1f1f2","dominican_republic":"1f1e9-1f1f4","door":"1f6aa","doughnut":"1f369","dove":"1f54a","dragon":"1f409","dragon_face":"1f432","dress":"1f457","dromedary_camel":"1f42a","drooling_face":"1f924","droplet":"1f4a7","drum":"1f941","duck":"1f986","dvd":"1f4c0","e-mail":"1f4e7","eagle":"1f985","ear":"1f442","ear_of_rice":"1f33e","ear_tone1":"1f442-1f3fb","ear_tone2":"1f442-1f3fc","ear_tone3":"1f442-1f3fd","ear_tone4":"1f442-1f3fe","ear_tone5":"1f442-1f3ff","earth_africa":"1f30d","earth_americas":"1f30e","earth_asia":"1f30f","ecuador":"1f1ea-1f1e8","egg":"1f95a","eggplant":"1f346","egypt":"1f1ea-1f1ec","eight":"0038-20e3","eight_pointed_black_star":"2734","eight_spoked_asterisk":"2733","eject":"23cf","el_salvador":"1f1f8-1f1fb","electric_plug":"1f50c","elephant":"1f418","email":"2709","end":"1f51a","envelope":"2709","envelope_with_arrow":"1f4e9","equatorial_guinea":"1f1ec-1f1f6","eritrea":"1f1ea-1f1f7","es":"1f1ea-1f1f8","estonia":"1f1ea-1f1ea","ethiopia":"1f1ea-1f1f9","eu":"1f1ea-1f1fa","euro":"1f4b6","european_castle":"1f3f0","european_post_office":"1f3e4","european_union":"1f1ea-1f1fa","evergreen_tree":"1f332","exclamation":"2757","expressionless":"1f611","eye":"1f441","eye_in_speech_bubble":"1f441-1f5e8","eye_speech_bubble":"1f441-1f5e8","eyeglasses":"1f453","eyes":"1f440","face_palm":"1f926","face_palm_tone1":"1f926-1f3fb","face_palm_tone2":"1f926-1f3fc","face_palm_tone3":"1f926-1f3fd","face_palm_tone4":"1f926-1f3fe","face_palm_tone5":"1f926-1f3ff","face_with_head_bandage":"1f915","face_with_thermometer":"1f912","facepunch":"1f44a","factory":"1f3ed","falkland_islands":"1f1eb-1f1f0","fallen_leaf":"1f342","family":"1f46a","family_man_man_boy":"1f468-1f468-1f466","family_man_man_boy_boy":"1f468-1f468-1f466-1f466","family_man_man_girl":"1f468-1f468-1f467","family_man_man_girl_boy":"1f468-1f468-1f467-1f466","family_man_man_girl_girl":"1f468-1f468-1f467-1f467","family_man_woman_boy":"1f46a","family_man_woman_boy_boy":"1f468-1f469-1f466-1f466","family_man_woman_girl":"1f468-1f469-1f467","family_man_woman_girl_boy":"1f468-1f469-1f467-1f466","family_man_woman_girl_girl":"1f468-1f469-1f467-1f467","family_mmb":"1f468-1f468-1f466","family_mmbb":"1f468-1f468-1f466-1f466","family_mmg":"1f468-1f468-1f467","family_mmgb":"1f468-1f468-1f467-1f466","family_mmgg":"1f468-1f468-1f467-1f467","family_mwbb":"1f468-1f469-1f466-1f466","family_mwg":"1f468-1f469-1f467","family_mwgb":"1f468-1f469-1f467-1f466","family_mwgg":"1f468-1f469-1f467-1f467","family_woman_woman_boy":"1f469-1f469-1f466","family_woman_woman_boy_boy":"1f469-1f469-1f466-1f466","family_woman_woman_girl":"1f469-1f469-1f467","family_woman_woman_girl_boy":"1f469-1f469-1f467-1f466","family_woman_woman_girl_girl":"1f469-1f469-1f467-1f467","family_wwb":"1f469-1f469-1f466","family_wwbb":"1f469-1f469-1f466-1f466","family_wwg":"1f469-1f469-1f467","family_wwgb":"1f469-1f469-1f467-1f466","family_wwgg":"1f469-1f469-1f467-1f467","faroe_islands":"1f1eb-1f1f4","fast_forward":"23e9","fax":"1f4e0","fearful":"1f628","feet":"1f43e","fencer":"1f93a","ferris_wheel":"1f3a1","ferry":"26f4","field_hockey":"1f3d1","fiji":"1f1eb-1f1ef","file_cabinet":"1f5c4","file_folder":"1f4c1","film_frames":"1f39e","film_projector":"1f4fd","film_strip":"1f39e","fingers_crossed":"1f91e","fingers_crossed_tone1":"1f91e-1f3fb","fingers_crossed_tone2":"1f91e-1f3fc","fingers_crossed_tone3":"1f91e-1f3fd","fingers_crossed_tone4":"1f91e-1f3fe","fingers_crossed_tone5":"1f91e-1f3ff","finland":"1f1eb-1f1ee","fire":"1f525","fire_engine":"1f692","fireworks":"1f386","first_place":"1f947","first_quarter_moon":"1f313","first_quarter_moon_with_face":"1f31b","fish":"1f41f","fish_cake":"1f365","fishing_pole_and_fish":"1f3a3","fist":"270a","fist_tone1":"270a-1f3fb","fist_tone2":"270a-1f3fc","fist_tone3":"270a-1f3fd","fist_tone4":"270a-1f3fe","fist_tone5":"270a-1f3ff","five":"0035-20e3","flag_ac":"1f1e6-1f1e8","flag_ad":"1f1e6-1f1e9","flag_ae":"1f1e6-1f1ea","flag_af":"1f1e6-1f1eb","flag_ag":"1f1e6-1f1ec","flag_ai":"1f1e6-1f1ee","flag_al":"1f1e6-1f1f1","flag_am":"1f1e6-1f1f2","flag_ao":"1f1e6-1f1f4","flag_aq":"1f1e6-1f1f6","flag_ar":"1f1e6-1f1f7","flag_as":"1f1e6-1f1f8","flag_at":"1f1e6-1f1f9","flag_au":"1f1e6-1f1fa","flag_aw":"1f1e6-1f1fc","flag_ax":"1f1e6-1f1fd","flag_az":"1f1e6-1f1ff","flag_ba":"1f1e7-1f1e6","flag_bb":"1f1e7-1f1e7","flag_bd":"1f1e7-1f1e9","flag_be":"1f1e7-1f1ea","flag_bf":"1f1e7-1f1eb","flag_bg":"1f1e7-1f1ec","flag_bh":"1f1e7-1f1ed","flag_bi":"1f1e7-1f1ee","flag_bj":"1f1e7-1f1ef","flag_bl":"1f1e7-1f1f1","flag_black":"1f3f4","flag_bm":"1f1e7-1f1f2","flag_bn":"1f1e7-1f1f3","flag_bo":"1f1e7-1f1f4","flag_bq":"1f1e7-1f1f6","flag_br":"1f1e7-1f1f7","flag_bs":"1f1e7-1f1f8","flag_bt":"1f1e7-1f1f9","flag_bv":"1f1e7-1f1fb","flag_bw":"1f1e7-1f1fc","flag_by":"1f1e7-1f1fe","flag_bz":"1f1e7-1f1ff","flag_ca":"1f1e8-1f1e6","flag_cc":"1f1e8-1f1e8","flag_cd":"1f1e8-1f1e9","flag_cf":"1f1e8-1f1eb","flag_cg":"1f1e8-1f1ec","flag_ch":"1f1e8-1f1ed","flag_ci":"1f1e8-1f1ee","flag_ck":"1f1e8-1f1f0","flag_cl":"1f1e8-1f1f1","flag_cm":"1f1e8-1f1f2","flag_cn":"1f1e8-1f1f3","flag_co":"1f1e8-1f1f4","flag_cp":"1f1e8-1f1f5","flag_cr":"1f1e8-1f1f7","flag_cu":"1f1e8-1f1fa","flag_cv":"1f1e8-1f1fb","flag_cw":"1f1e8-1f1fc","flag_cx":"1f1e8-1f1fd","flag_cy":"1f1e8-1f1fe","flag_cz":"1f1e8-1f1ff","flag_de":"1f1e9-1f1ea","flag_dg":"1f1e9-1f1ec","flag_dj":"1f1e9-1f1ef","flag_dk":"1f1e9-1f1f0","flag_dm":"1f1e9-1f1f2","flag_do":"1f1e9-1f1f4","flag_dz":"1f1e9-1f1ff","flag_ea":"1f1ea-1f1e6","flag_ec":"1f1ea-1f1e8","flag_ee":"1f1ea-1f1ea","flag_eg":"1f1ea-1f1ec","flag_eh":"1f1ea-1f1ed","flag_er":"1f1ea-1f1f7","flag_es":"1f1ea-1f1f8","flag_et":"1f1ea-1f1f9","flag_eu":"1f1ea-1f1fa","flag_fi":"1f1eb-1f1ee","flag_fj":"1f1eb-1f1ef","flag_fk":"1f1eb-1f1f0","flag_fm":"1f1eb-1f1f2","flag_fo":"1f1eb-1f1f4","flag_fr":"1f1eb-1f1f7","flag_ga":"1f1ec-1f1e6","flag_gb":"1f1ec-1f1e7","flag_gd":"1f1ec-1f1e9","flag_ge":"1f1ec-1f1ea","flag_gf":"1f1ec-1f1eb","flag_gg":"1f1ec-1f1ec","flag_gh":"1f1ec-1f1ed","flag_gi":"1f1ec-1f1ee","flag_gl":"1f1ec-1f1f1","flag_gm":"1f1ec-1f1f2","flag_gn":"1f1ec-1f1f3","flag_gp":"1f1ec-1f1f5","flag_gq":"1f1ec-1f1f6","flag_gr":"1f1ec-1f1f7","flag_gs":"1f1ec-1f1f8","flag_gt":"1f1ec-1f1f9","flag_gu":"1f1ec-1f1fa","flag_gw":"1f1ec-1f1fc","flag_gy":"1f1ec-1f1fe","flag_hk":"1f1ed-1f1f0","flag_hm":"1f1ed-1f1f2","flag_hn":"1f1ed-1f1f3","flag_hr":"1f1ed-1f1f7","flag_ht":"1f1ed-1f1f9","flag_hu":"1f1ed-1f1fa","flag_ic":"1f1ee-1f1e8","flag_id":"1f1ee-1f1e9","flag_ie":"1f1ee-1f1ea","flag_il":"1f1ee-1f1f1","flag_im":"1f1ee-1f1f2","flag_in":"1f1ee-1f1f3","flag_io":"1f1ee-1f1f4","flag_iq":"1f1ee-1f1f6","flag_ir":"1f1ee-1f1f7","flag_is":"1f1ee-1f1f8","flag_it":"1f1ee-1f1f9","flag_je":"1f1ef-1f1ea","flag_jm":"1f1ef-1f1f2","flag_jo":"1f1ef-1f1f4","flag_jp":"1f1ef-1f1f5","flag_ke":"1f1f0-1f1ea","flag_kg":"1f1f0-1f1ec","flag_kh":"1f1f0-1f1ed","flag_ki":"1f1f0-1f1ee","flag_km":"1f1f0-1f1f2","flag_kn":"1f1f0-1f1f3","flag_kp":"1f1f0-1f1f5","flag_kr":"1f1f0-1f1f7","flag_kw":"1f1f0-1f1fc","flag_ky":"1f1f0-1f1fe","flag_kz":"1f1f0-1f1ff","flag_la":"1f1f1-1f1e6","flag_lb":"1f1f1-1f1e7","flag_lc":"1f1f1-1f1e8","flag_li":"1f1f1-1f1ee","flag_lk":"1f1f1-1f1f0","flag_lr":"1f1f1-1f1f7","flag_ls":"1f1f1-1f1f8","flag_lt":"1f1f1-1f1f9","flag_lu":"1f1f1-1f1fa","flag_lv":"1f1f1-1f1fb","flag_ly":"1f1f1-1f1fe","flag_ma":"1f1f2-1f1e6","flag_mc":"1f1f2-1f1e8","flag_md":"1f1f2-1f1e9","flag_me":"1f1f2-1f1ea","flag_mf":"1f1f2-1f1eb","flag_mg":"1f1f2-1f1ec","flag_mh":"1f1f2-1f1ed","flag_mk":"1f1f2-1f1f0","flag_ml":"1f1f2-1f1f1","flag_mm":"1f1f2-1f1f2","flag_mn":"1f1f2-1f1f3","flag_mo":"1f1f2-1f1f4","flag_mp":"1f1f2-1f1f5","flag_mq":"1f1f2-1f1f6","flag_mr":"1f1f2-1f1f7","flag_ms":"1f1f2-1f1f8","flag_mt":"1f1f2-1f1f9","flag_mu":"1f1f2-1f1fa","flag_mv":"1f1f2-1f1fb","flag_mw":"1f1f2-1f1fc","flag_mx":"1f1f2-1f1fd","flag_my":"1f1f2-1f1fe","flag_mz":"1f1f2-1f1ff","flag_na":"1f1f3-1f1e6","flag_nc":"1f1f3-1f1e8","flag_ne":"1f1f3-1f1ea","flag_nf":"1f1f3-1f1eb","flag_ng":"1f1f3-1f1ec","flag_ni":"1f1f3-1f1ee","flag_nl":"1f1f3-1f1f1","flag_no":"1f1f3-1f1f4","flag_np":"1f1f3-1f1f5","flag_nr":"1f1f3-1f1f7","flag_nu":"1f1f3-1f1fa","flag_nz":"1f1f3-1f1ff","flag_om":"1f1f4-1f1f2","flag_pa":"1f1f5-1f1e6","flag_pe":"1f1f5-1f1ea","flag_pf":"1f1f5-1f1eb","flag_pg":"1f1f5-1f1ec","flag_ph":"1f1f5-1f1ed","flag_pk":"1f1f5-1f1f0","flag_pl":"1f1f5-1f1f1","flag_pm":"1f1f5-1f1f2","flag_pn":"1f1f5-1f1f3","flag_pr":"1f1f5-1f1f7","flag_ps":"1f1f5-1f1f8","flag_pt":"1f1f5-1f1f9","flag_pw":"1f1f5-1f1fc","flag_py":"1f1f5-1f1fe","flag_qa":"1f1f6-1f1e6","flag_re":"1f1f7-1f1ea","flag_ro":"1f1f7-1f1f4","flag_rs":"1f1f7-1f1f8","flag_ru":"1f1f7-1f1fa","flag_rw":"1f1f7-1f1fc","flag_sa":"1f1f8-1f1e6","flag_sb":"1f1f8-1f1e7","flag_sc":"1f1f8-1f1e8","flag_sd":"1f1f8-1f1e9","flag_se":"1f1f8-1f1ea","flag_sg":"1f1f8-1f1ec","flag_sh":"1f1f8-1f1ed","flag_si":"1f1f8-1f1ee","flag_sj":"1f1f8-1f1ef","flag_sk":"1f1f8-1f1f0","flag_sl":"1f1f8-1f1f1","flag_sm":"1f1f8-1f1f2","flag_sn":"1f1f8-1f1f3","flag_so":"1f1f8-1f1f4","flag_sr":"1f1f8-1f1f7","flag_ss":"1f1f8-1f1f8","flag_st":"1f1f8-1f1f9","flag_sv":"1f1f8-1f1fb","flag_sx":"1f1f8-1f1fd","flag_sy":"1f1f8-1f1fe","flag_sz":"1f1f8-1f1ff","flag_ta":"1f1f9-1f1e6","flag_tc":"1f1f9-1f1e8","flag_td":"1f1f9-1f1e9","flag_tf":"1f1f9-1f1eb","flag_tg":"1f1f9-1f1ec","flag_th":"1f1f9-1f1ed","flag_tj":"1f1f9-1f1ef","flag_tk":"1f1f9-1f1f0","flag_tl":"1f1f9-1f1f1","flag_tm":"1f1f9-1f1f2","flag_tn":"1f1f9-1f1f3","flag_to":"1f1f9-1f1f4","flag_tr":"1f1f9-1f1f7","flag_tt":"1f1f9-1f1f9","flag_tv":"1f1f9-1f1fb","flag_tw":"1f1f9-1f1fc","flag_tz":"1f1f9-1f1ff","flag_ua":"1f1fa-1f1e6","flag_ug":"1f1fa-1f1ec","flag_um":"1f1fa-1f1f2","flag_us":"1f1fa-1f1f8","flag_uy":"1f1fa-1f1fe","flag_uz":"1f1fa-1f1ff","flag_va":"1f1fb-1f1e6","flag_vc":"1f1fb-1f1e8","flag_ve":"1f1fb-1f1ea","flag_vg":"1f1fb-1f1ec","flag_vi":"1f1fb-1f1ee","flag_vn":"1f1fb-1f1f3","flag_vu":"1f1fb-1f1fa","flag_wf":"1f1fc-1f1eb","flag_white":"1f3f3","flag_ws":"1f1fc-1f1f8","flag_xk":"1f1fd-1f1f0","flag_ye":"1f1fe-1f1ea","flag_yt":"1f1fe-1f1f9","flag_za":"1f1ff-1f1e6","flag_zm":"1f1ff-1f1f2","flag_zw":"1f1ff-1f1fc","flags":"1f38f","flashlight":"1f526","fleur-de-lis":"269c","fleur_de_lis":"269c","flight_arrival":"1f6ec","flight_departure":"1f6eb","flipper":"1f42c","floppy_disk":"1f4be","flower_playing_cards":"1f3b4","flushed":"1f633","fog":"1f32b","foggy":"1f301","football":"1f3c8","footprints":"1f463","fork_and_knife":"1f374","fork_knife_plate":"1f37d","fountain":"26f2","fountain_pen":"1f58b","four":"0034-20e3","four_leaf_clover":"1f340","fox":"1f98a","fr":"1f1eb-1f1f7","frame_photo":"1f5bc","framed_picture":"1f5bc","free":"1f193","french_bread":"1f956","french_guiana":"1f1ec-1f1eb","french_polynesia":"1f1f5-1f1eb","french_southern_territories":"1f1f9-1f1eb","fried_shrimp":"1f364","fries":"1f35f","frog":"1f438","frowning":"1f626","frowning2":"2639","frowning_face":"2639","frowning_woman":"1f64d","fu":"1f595","fuelpump":"26fd","full_moon":"1f315","full_moon_with_face":"1f31d","funeral_urn":"26b1","gabon":"1f1ec-1f1e6","gambia":"1f1ec-1f1f2","game_die":"1f3b2","gay_pride_flag":"1f3f3-1f308","gb":"1f1ec-1f1e7","gear":"2699","gem":"1f48e","gemini":"264a","georgia":"1f1ec-1f1ea","ghana":"1f1ec-1f1ed","ghost":"1f47b","gibraltar":"1f1ec-1f1ee","gift":"1f381","gift_heart":"1f49d","girl":"1f467","girl_tone1":"1f467-1f3fb","girl_tone2":"1f467-1f3fc","girl_tone3":"1f467-1f3fd","girl_tone4":"1f467-1f3fe","girl_tone5":"1f467-1f3ff","globe_with_meridians":"1f310","goal":"1f945","goat":"1f410","golf":"26f3","golfer":"1f3cc","golfing_man":"1f3cc","gorilla":"1f98d","grapes":"1f347","greece":"1f1ec-1f1f7","green_apple":"1f34f","green_book":"1f4d7","green_heart":"1f49a","greenland":"1f1ec-1f1f1","grenada":"1f1ec-1f1e9","grey_exclamation":"2755","grey_question":"2754","grimacing":"1f62c","grin":"1f601","grinning":"1f600","guadeloupe":"1f1ec-1f1f5","guam":"1f1ec-1f1fa","guardsman":"1f482","guardsman_tone1":"1f482-1f3fb","guardsman_tone2":"1f482-1f3fc","guardsman_tone3":"1f482-1f3fd","guardsman_tone4":"1f482-1f3fe","guardsman_tone5":"1f482-1f3ff","guatemala":"1f1ec-1f1f9","guernsey":"1f1ec-1f1ec","guinea":"1f1ec-1f1f3","guinea_bissau":"1f1ec-1f1fc","guitar":"1f3b8","gun":"1f52b","guyana":"1f1ec-1f1fe","haircut":"1f487","haircut_tone1":"1f487-1f3fb","haircut_tone2":"1f487-1f3fc","haircut_tone3":"1f487-1f3fd","haircut_tone4":"1f487-1f3fe","haircut_tone5":"1f487-1f3ff","haircut_woman":"1f487","haiti":"1f1ed-1f1f9","hamburger":"1f354","hammer":"1f528","hammer_and_pick":"2692","hammer_and_wrench":"1f6e0","hammer_pick":"2692","hamster":"1f439","hand":"270b","hand_splayed":"1f590","hand_splayed_tone1":"1f590-1f3fb","hand_splayed_tone2":"1f590-1f3fc","hand_splayed_tone3":"1f590-1f3fd","hand_splayed_tone4":"1f590-1f3fe","hand_splayed_tone5":"1f590-1f3ff","handbag":"1f45c","handball":"1f93e","handball_tone1":"1f93e-1f3fb","handball_tone2":"1f93e-1f3fc","handball_tone3":"1f93e-1f3fd","handball_tone4":"1f93e-1f3fe","handball_tone5":"1f93e-1f3ff","handshake":"1f91d","handshake_tone1":"1f91d-1f3fb","handshake_tone2":"1f91d-1f3fc","handshake_tone3":"1f91d-1f3fd","handshake_tone4":"1f91d-1f3fe","handshake_tone5":"1f91d-1f3ff","hankey":"1f4a9","hash":"0023-20e3","hatched_chick":"1f425","hatching_chick":"1f423","head_bandage":"1f915","headphones":"1f3a7","hear_no_evil":"1f649","heart":"2764","heart_decoration":"1f49f","heart_exclamation":"2763","heart_eyes":"1f60d","heart_eyes_cat":"1f63b","heartbeat":"1f493","heartpulse":"1f497","hearts":"2665","heavy_check_mark":"2714","heavy_division_sign":"2797","heavy_dollar_sign":"1f4b2","heavy_exclamation_mark":"2757","heavy_heart_exclamation":"2763","heavy_minus_sign":"2796","heavy_multiplication_x":"2716","heavy_plus_sign":"2795","helicopter":"1f681","helmet_with_cross":"26d1","herb":"1f33f","hibiscus":"1f33a","high_brightness":"1f506","high_heel":"1f460","hocho":"1f52a","hockey":"1f3d2","hole":"1f573","homes":"1f3d8","honduras":"1f1ed-1f1f3","honey_pot":"1f36f","honeybee":"1f41d","hong_kong":"1f1ed-1f1f0","horse":"1f434","horse_racing":"1f3c7","horse_racing_tone1":"1f3c7-1f3fb","horse_racing_tone2":"1f3c7-1f3fc","horse_racing_tone3":"1f3c7-1f3fd","horse_racing_tone4":"1f3c7-1f3fe","horse_racing_tone5":"1f3c7-1f3ff","hospital":"1f3e5","hot_pepper":"1f336","hotdog":"1f32d","hotel":"1f3e8","hotsprings":"2668","hourglass":"231b","hourglass_flowing_sand":"23f3","house":"1f3e0","house_abandoned":"1f3da","house_with_garden":"1f3e1","houses":"1f3d8","hugging":"1f917","hugs":"1f917","hungary":"1f1ed-1f1fa","hushed":"1f62f","ice_cream":"1f368","ice_hockey":"1f3d2","ice_skate":"26f8","icecream":"1f366","iceland":"1f1ee-1f1f8","id":"1f194","ideograph_advantage":"1f250","imp":"1f47f","inbox_tray":"1f4e5","incoming_envelope":"1f4e8","india":"1f1ee-1f1f3","indonesia":"1f1ee-1f1e9","information_desk_person":"1f481","information_desk_person_tone1":"1f481-1f3fb","information_desk_person_tone2":"1f481-1f3fc","information_desk_person_tone3":"1f481-1f3fd","information_desk_person_tone4":"1f481-1f3fe","information_desk_person_tone5":"1f481-1f3ff","information_source":"2139","innocent":"1f607","interrobang":"2049","iphone":"1f4f1","iran":"1f1ee-1f1f7","iraq":"1f1ee-1f1f6","ireland":"1f1ee-1f1ea","island":"1f3dd","isle_of_man":"1f1ee-1f1f2","israel":"1f1ee-1f1f1","it":"1f1ee-1f1f9","izakaya_lantern":"1f3ee","jack_o_lantern":"1f383","jamaica":"1f1ef-1f1f2","japan":"1f5fe","japanese_castle":"1f3ef","japanese_goblin":"1f47a","japanese_ogre":"1f479","jeans":"1f456","jersey":"1f1ef-1f1ea","jordan":"1f1ef-1f1f4","joy":"1f602","joy_cat":"1f639","joystick":"1f579","jp":"1f1ef-1f1f5","juggling":"1f939","juggling_tone1":"1f939-1f3fb","juggling_tone2":"1f939-1f3fc","juggling_tone3":"1f939-1f3fd","juggling_tone4":"1f939-1f3fe","juggling_tone5":"1f939-1f3ff","kaaba":"1f54b","kazakhstan":"1f1f0-1f1ff","kenya":"1f1f0-1f1ea","key":"1f511","key2":"1f5dd","keyboard":"2328","keycap_ten":"1f51f","kimono":"1f458","kiribati":"1f1f0-1f1ee","kiss":"1f48b","kiss_mm":"1f468-2764-1f48b-1f468","kiss_ww":"1f469-2764-1f48b-1f469","kissing":"1f617","kissing_cat":"1f63d","kissing_closed_eyes":"1f61a","kissing_heart":"1f618","kissing_smiling_eyes":"1f619","kiwi":"1f95d","knife":"1f52a","koala":"1f428","koko":"1f201","kosovo":"1f1fd-1f1f0","kr":"1f1f0-1f1f7","kuwait":"1f1f0-1f1fc","kyrgyzstan":"1f1f0-1f1ec","label":"1f3f7","lantern":"1f3ee","laos":"1f1f1-1f1e6","large_blue_circle":"1f535","large_blue_diamond":"1f537","large_orange_diamond":"1f536","last_quarter_moon":"1f317","last_quarter_moon_with_face":"1f31c","latin_cross":"271d","latvia":"1f1f1-1f1fb","laughing":"1f606","leaves":"1f343","lebanon":"1f1f1-1f1e7","ledger":"1f4d2","left_facing_fist":"1f91b","left_facing_fist_tone1":"1f91b-1f3fb","left_facing_fist_tone2":"1f91b-1f3fc","left_facing_fist_tone3":"1f91b-1f3fd","left_facing_fist_tone4":"1f91b-1f3fe","left_facing_fist_tone5":"1f91b-1f3ff","left_luggage":"1f6c5","left_right_arrow":"2194","leftwards_arrow_with_hook":"21a9","lemon":"1f34b","leo":"264c","leopard":"1f406","lesotho":"1f1f1-1f1f8","level_slider":"1f39a","levitate":"1f574","liberia":"1f1f1-1f1f7","libra":"264e","libya":"1f1f1-1f1fe","liechtenstein":"1f1f1-1f1ee","lifter":"1f3cb","lifter_tone1":"1f3cb-1f3fb","lifter_tone2":"1f3cb-1f3fc","lifter_tone3":"1f3cb-1f3fd","lifter_tone4":"1f3cb-1f3fe","lifter_tone5":"1f3cb-1f3ff","light_rail":"1f688","link":"1f517","lion":"1f981","lion_face":"1f981","lips":"1f444","lipstick":"1f484","lithuania":"1f1f1-1f1f9","lizard":"1f98e","lock":"1f512","lock_with_ink_pen":"1f50f","lollipop":"1f36d","loop":"27bf","loud_sound":"1f50a","loudspeaker":"1f4e2","love_hotel":"1f3e9","love_letter":"1f48c","low_brightness":"1f505","luxembourg":"1f1f1-1f1fa","lying_face":"1f925","m":"24c2","macau":"1f1f2-1f1f4","macedonia":"1f1f2-1f1f0","madagascar":"1f1f2-1f1ec","mag":"1f50d","mag_right":"1f50e","mahjong":"1f004","mailbox":"1f4eb","mailbox_closed":"1f4ea","mailbox_with_mail":"1f4ec","mailbox_with_no_mail":"1f4ed","malawi":"1f1f2-1f1fc","malaysia":"1f1f2-1f1fe","maldives":"1f1f2-1f1fb","male_detective":"1f575","mali":"1f1f2-1f1f1","malta":"1f1f2-1f1f9","man":"1f468","man_dancing":"1f57a","man_dancing_tone1":"1f57a-1f3fb","man_dancing_tone2":"1f57a-1f3fc","man_dancing_tone3":"1f57a-1f3fd","man_dancing_tone4":"1f57a-1f3fe","man_dancing_tone5":"1f57a-1f3ff","man_in_tuxedo":"1f935","man_in_tuxedo_tone1":"1f935-1f3fb","man_in_tuxedo_tone2":"1f935-1f3fc","man_in_tuxedo_tone3":"1f935-1f3fd","man_in_tuxedo_tone4":"1f935-1f3fe","man_in_tuxedo_tone5":"1f935-1f3ff","man_tone1":"1f468-1f3fb","man_tone2":"1f468-1f3fc","man_tone3":"1f468-1f3fd","man_tone4":"1f468-1f3fe","man_tone5":"1f468-1f3ff","man_with_gua_pi_mao":"1f472","man_with_gua_pi_mao_tone1":"1f472-1f3fb","man_with_gua_pi_mao_tone2":"1f472-1f3fc","man_with_gua_pi_mao_tone3":"1f472-1f3fd","man_with_gua_pi_mao_tone4":"1f472-1f3fe","man_with_gua_pi_mao_tone5":"1f472-1f3ff","man_with_turban":"1f473","man_with_turban_tone1":"1f473-1f3fb","man_with_turban_tone2":"1f473-1f3fc","man_with_turban_tone3":"1f473-1f3fd","man_with_turban_tone4":"1f473-1f3fe","man_with_turban_tone5":"1f473-1f3ff","mandarin":"1f34a","mans_shoe":"1f45e","mantelpiece_clock":"1f570","map":"1f5fa","maple_leaf":"1f341","marshall_islands":"1f1f2-1f1ed","martial_arts_uniform":"1f94b","martinique":"1f1f2-1f1f6","mask":"1f637","massage":"1f486","massage_tone1":"1f486-1f3fb","massage_tone2":"1f486-1f3fc","massage_tone3":"1f486-1f3fd","massage_tone4":"1f486-1f3fe","massage_tone5":"1f486-1f3ff","massage_woman":"1f486","mauritania":"1f1f2-1f1f7","mauritius":"1f1f2-1f1fa","mayotte":"1f1fe-1f1f9","meat_on_bone":"1f356","medal":"1f3c5","medal_military":"1f396","medal_sports":"1f3c5","mega":"1f4e3","melon":"1f348","memo":"1f4dd","menorah":"1f54e","mens":"1f6b9","metal":"1f918","metal_tone1":"1f918-1f3fb","metal_tone2":"1f918-1f3fc","metal_tone3":"1f918-1f3fd","metal_tone4":"1f918-1f3fe","metal_tone5":"1f918-1f3ff","metro":"1f687","mexico":"1f1f2-1f1fd","micronesia":"1f1eb-1f1f2","microphone":"1f3a4","microphone2":"1f399","microscope":"1f52c","middle_finger":"1f595","middle_finger_tone1":"1f595-1f3fb","middle_finger_tone2":"1f595-1f3fc","middle_finger_tone3":"1f595-1f3fd","middle_finger_tone4":"1f595-1f3fe","middle_finger_tone5":"1f595-1f3ff","military_medal":"1f396","milk":"1f95b","milky_way":"1f30c","minibus":"1f690","minidisc":"1f4bd","mobile_phone_off":"1f4f4","moldova":"1f1f2-1f1e9","monaco":"1f1f2-1f1e8","money_mouth":"1f911","money_mouth_face":"1f911","money_with_wings":"1f4b8","moneybag":"1f4b0","mongolia":"1f1f2-1f1f3","monkey":"1f412","monkey_face":"1f435","monorail":"1f69d","montenegro":"1f1f2-1f1ea","montserrat":"1f1f2-1f1f8","moon":"1f314","morocco":"1f1f2-1f1e6","mortar_board":"1f393","mosque":"1f54c","motor_boat":"1f6e5","motor_scooter":"1f6f5","motorboat":"1f6e5","motorcycle":"1f3cd","motorway":"1f6e3","mount_fuji":"1f5fb","mountain":"26f0","mountain_bicyclist":"1f6b5","mountain_bicyclist_tone1":"1f6b5-1f3fb","mountain_bicyclist_tone2":"1f6b5-1f3fc","mountain_bicyclist_tone3":"1f6b5-1f3fd","mountain_bicyclist_tone4":"1f6b5-1f3fe","mountain_bicyclist_tone5":"1f6b5-1f3ff","mountain_biking_man":"1f6b5","mountain_cableway":"1f6a0","mountain_railway":"1f69e","mountain_snow":"1f3d4","mouse":"1f42d","mouse2":"1f401","mouse_three_button":"1f5b1","movie_camera":"1f3a5","moyai":"1f5ff","mozambique":"1f1f2-1f1ff","mrs_claus":"1f936","mrs_claus_tone1":"1f936-1f3fb","mrs_claus_tone2":"1f936-1f3fc","mrs_claus_tone3":"1f936-1f3fd","mrs_claus_tone4":"1f936-1f3fe","mrs_claus_tone5":"1f936-1f3ff","muscle":"1f4aa","muscle_tone1":"1f4aa-1f3fb","muscle_tone2":"1f4aa-1f3fc","muscle_tone3":"1f4aa-1f3fd","muscle_tone4":"1f4aa-1f3fe","muscle_tone5":"1f4aa-1f3ff","mushroom":"1f344","musical_keyboard":"1f3b9","musical_note":"1f3b5","musical_score":"1f3bc","mute":"1f507","myanmar":"1f1f2-1f1f2","nail_care":"1f485","nail_care_tone1":"1f485-1f3fb","nail_care_tone2":"1f485-1f3fc","nail_care_tone3":"1f485-1f3fd","nail_care_tone4":"1f485-1f3fe","nail_care_tone5":"1f485-1f3ff","name_badge":"1f4db","namibia":"1f1f3-1f1e6","national_park":"1f3de","nauru":"1f1f3-1f1f7","nauseated_face":"1f922","necktie":"1f454","negative_squared_cross_mark":"274e","nepal":"1f1f3-1f1f5","nerd":"1f913","nerd_face":"1f913","netherlands":"1f1f3-1f1f1","neutral_face":"1f610","new":"1f195","new_caledonia":"1f1f3-1f1e8","new_moon":"1f311","new_moon_with_face":"1f31a","new_zealand":"1f1f3-1f1ff","newspaper":"1f4f0","newspaper2":"1f5de","newspaper_roll":"1f5de","next_track_button":"23ed","ng":"1f196","ng_woman":"1f645","nicaragua":"1f1f3-1f1ee","niger":"1f1f3-1f1ea","nigeria":"1f1f3-1f1ec","night_with_stars":"1f303","nine":"0039-20e3","niue":"1f1f3-1f1fa","no_bell":"1f515","no_bicycles":"1f6b3","no_entry":"26d4","no_entry_sign":"1f6ab","no_good":"1f645","no_good_tone1":"1f645-1f3fb","no_good_tone2":"1f645-1f3fc","no_good_tone3":"1f645-1f3fd","no_good_tone4":"1f645-1f3fe","no_good_tone5":"1f645-1f3ff","no_good_woman":"1f645","no_mobile_phones":"1f4f5","no_mouth":"1f636","no_pedestrians":"1f6b7","no_smoking":"1f6ad","non-potable_water":"1f6b1","norfolk_island":"1f1f3-1f1eb","north_korea":"1f1f0-1f1f5","northern_mariana_islands":"1f1f2-1f1f5","norway":"1f1f3-1f1f4","nose":"1f443","nose_tone1":"1f443-1f3fb","nose_tone2":"1f443-1f3fc","nose_tone3":"1f443-1f3fd","nose_tone4":"1f443-1f3fe","nose_tone5":"1f443-1f3ff","notebook":"1f4d3","notebook_with_decorative_cover":"1f4d4","notepad_spiral":"1f5d2","notes":"1f3b6","nut_and_bolt":"1f529","o":"2b55","o2":"1f17e","ocean":"1f30a","octagonal_sign":"1f6d1","octopus":"1f419","oden":"1f362","office":"1f3e2","oil":"1f6e2","oil_drum":"1f6e2","ok":"1f197","ok_hand":"1f44c","ok_hand_tone1":"1f44c-1f3fb","ok_hand_tone2":"1f44c-1f3fc","ok_hand_tone3":"1f44c-1f3fd","ok_hand_tone4":"1f44c-1f3fe","ok_hand_tone5":"1f44c-1f3ff","ok_woman":"1f646","ok_woman_tone1":"1f646-1f3fb","ok_woman_tone2":"1f646-1f3fc","ok_woman_tone3":"1f646-1f3fd","ok_woman_tone4":"1f646-1f3fe","ok_woman_tone5":"1f646-1f3ff","old_key":"1f5dd","older_man":"1f474","older_man_tone1":"1f474-1f3fb","older_man_tone2":"1f474-1f3fc","older_man_tone3":"1f474-1f3fd","older_man_tone4":"1f474-1f3fe","older_man_tone5":"1f474-1f3ff","older_woman":"1f475","older_woman_tone1":"1f475-1f3fb","older_woman_tone2":"1f475-1f3fc","older_woman_tone3":"1f475-1f3fd","older_woman_tone4":"1f475-1f3fe","older_woman_tone5":"1f475-1f3ff","om":"1f549","om_symbol":"1f549","oman":"1f1f4-1f1f2","on":"1f51b","oncoming_automobile":"1f698","oncoming_bus":"1f68d","oncoming_police_car":"1f694","oncoming_taxi":"1f696","one":"0031-20e3","open_book":"1f4d6","open_file_folder":"1f4c2","open_hands":"1f450","open_hands_tone1":"1f450-1f3fb","open_hands_tone2":"1f450-1f3fc","open_hands_tone3":"1f450-1f3fd","open_hands_tone4":"1f450-1f3fe","open_hands_tone5":"1f450-1f3ff","open_mouth":"1f62e","open_umbrella":"2602","ophiuchus":"26ce","orange":"1f34a","orange_book":"1f4d9","orthodox_cross":"2626","outbox_tray":"1f4e4","owl":"1f989","ox":"1f402","package":"1f4e6","page_facing_up":"1f4c4","page_with_curl":"1f4c3","pager":"1f4df","paintbrush":"1f58c","pakistan":"1f1f5-1f1f0","palau":"1f1f5-1f1fc","palestinian_territories":"1f1f5-1f1f8","palm_tree":"1f334","panama":"1f1f5-1f1e6","pancakes":"1f95e","panda_face":"1f43c","paperclip":"1f4ce","paperclips":"1f587","papua_new_guinea":"1f1f5-1f1ec","paraguay":"1f1f5-1f1fe","parasol_on_ground":"26f1","park":"1f3de","parking":"1f17f","part_alternation_mark":"303d","partly_sunny":"26c5","passenger_ship":"1f6f3","passport_control":"1f6c2","pause_button":"23f8","paw_prints":"1f43e","peace":"262e","peace_symbol":"262e","peach":"1f351","peanuts":"1f95c","pear":"1f350","pen":"1f58a","pen_ballpoint":"1f58a","pen_fountain":"1f58b","pencil":"1f4dd","pencil2":"270f","penguin":"1f427","pensive":"1f614","performing_arts":"1f3ad","persevere":"1f623","person_frowning":"1f64d","person_frowning_tone1":"1f64d-1f3fb","person_frowning_tone2":"1f64d-1f3fc","person_frowning_tone3":"1f64d-1f3fd","person_frowning_tone4":"1f64d-1f3fe","person_frowning_tone5":"1f64d-1f3ff","person_with_blond_hair":"1f471","person_with_blond_hair_tone1":"1f471-1f3fb","person_with_blond_hair_tone2":"1f471-1f3fc","person_with_blond_hair_tone3":"1f471-1f3fd","person_with_blond_hair_tone4":"1f471-1f3fe","person_with_blond_hair_tone5":"1f471-1f3ff","person_with_pouting_face":"1f64e","person_with_pouting_face_tone1":"1f64e-1f3fb","person_with_pouting_face_tone2":"1f64e-1f3fc","person_with_pouting_face_tone3":"1f64e-1f3fd","person_with_pouting_face_tone4":"1f64e-1f3fe","person_with_pouting_face_tone5":"1f64e-1f3ff","peru":"1f1f5-1f1ea","philippines":"1f1f5-1f1ed","phone":"260e","pick":"26cf","pig":"1f437","pig2":"1f416","pig_nose":"1f43d","pill":"1f48a","pineapple":"1f34d","ping_pong":"1f3d3","pisces":"2653","pitcairn_islands":"1f1f5-1f1f3","pizza":"1f355","place_of_worship":"1f6d0","plate_with_cutlery":"1f37d","play_or_pause_button":"23ef","play_pause":"23ef","point_down":"1f447","point_down_tone1":"1f447-1f3fb","point_down_tone2":"1f447-1f3fc","point_down_tone3":"1f447-1f3fd","point_down_tone4":"1f447-1f3fe","point_down_tone5":"1f447-1f3ff","point_left":"1f448","point_left_tone1":"1f448-1f3fb","point_left_tone2":"1f448-1f3fc","point_left_tone3":"1f448-1f3fd","point_left_tone4":"1f448-1f3fe","point_left_tone5":"1f448-1f3ff","point_right":"1f449","point_right_tone1":"1f449-1f3fb","point_right_tone2":"1f449-1f3fc","point_right_tone3":"1f449-1f3fd","point_right_tone4":"1f449-1f3fe","point_right_tone5":"1f449-1f3ff","point_up":"261d","point_up_2":"1f446","point_up_2_tone1":"1f446-1f3fb","point_up_2_tone2":"1f446-1f3fc","point_up_2_tone3":"1f446-1f3fd","point_up_2_tone4":"1f446-1f3fe","point_up_2_tone5":"1f446-1f3ff","point_up_tone1":"261d-1f3fb","point_up_tone2":"261d-1f3fc","point_up_tone3":"261d-1f3fd","point_up_tone4":"261d-1f3fe","point_up_tone5":"261d-1f3ff","poland":"1f1f5-1f1f1","police_car":"1f693","policeman":"1f46e","poodle":"1f429","poop":"1f4a9","popcorn":"1f37f","portugal":"1f1f5-1f1f9","post_office":"1f3e3","postal_horn":"1f4ef","postbox":"1f4ee","potable_water":"1f6b0","potato":"1f954","pouch":"1f45d","poultry_leg":"1f357","pound":"1f4b7","pout":"1f621","pouting_cat":"1f63e","pouting_woman":"1f64e","pray":"1f64f","pray_tone1":"1f64f-1f3fb","pray_tone2":"1f64f-1f3fc","pray_tone3":"1f64f-1f3fd","pray_tone4":"1f64f-1f3fe","pray_tone5":"1f64f-1f3ff","prayer_beads":"1f4ff","pregnant_woman":"1f930","pregnant_woman_tone1":"1f930-1f3fb","pregnant_woman_tone2":"1f930-1f3fc","pregnant_woman_tone3":"1f930-1f3fd","pregnant_woman_tone4":"1f930-1f3fe","pregnant_woman_tone5":"1f930-1f3ff","previous_track_button":"23ee","prince":"1f934","prince_tone1":"1f934-1f3fb","prince_tone2":"1f934-1f3fc","prince_tone3":"1f934-1f3fd","prince_tone4":"1f934-1f3fe","prince_tone5":"1f934-1f3ff","princess":"1f478","princess_tone1":"1f478-1f3fb","princess_tone2":"1f478-1f3fc","princess_tone3":"1f478-1f3fd","princess_tone4":"1f478-1f3fe","princess_tone5":"1f478-1f3ff","printer":"1f5a8","projector":"1f4fd","puerto_rico":"1f1f5-1f1f7","punch":"1f44a","punch_tone1":"1f44a-1f3fb","punch_tone2":"1f44a-1f3fc","punch_tone3":"1f44a-1f3fd","punch_tone4":"1f44a-1f3fe","punch_tone5":"1f44a-1f3ff","purple_heart":"1f49c","purse":"1f45b","pushpin":"1f4cc","put_litter_in_its_place":"1f6ae","qatar":"1f1f6-1f1e6","question":"2753","rabbit":"1f430","rabbit2":"1f407","race_car":"1f3ce","racehorse":"1f40e","racing_car":"1f3ce","radio":"1f4fb","radio_button":"1f518","radioactive":"2622","rage":"1f621","railway_car":"1f683","railway_track":"1f6e4","rainbow":"1f308","rainbow_flag":"1f3f3-1f308","raised_back_of_hand":"1f91a","raised_back_of_hand_tone1":"1f91a-1f3fb","raised_back_of_hand_tone2":"1f91a-1f3fc","raised_back_of_hand_tone3":"1f91a-1f3fd","raised_back_of_hand_tone4":"1f91a-1f3fe","raised_back_of_hand_tone5":"1f91a-1f3ff","raised_hand":"270b","raised_hand_tone1":"270b-1f3fb","raised_hand_tone2":"270b-1f3fc","raised_hand_tone3":"270b-1f3fd","raised_hand_tone4":"270b-1f3fe","raised_hand_tone5":"270b-1f3ff","raised_hand_with_fingers_splayed":"1f590","raised_hands":"1f64c","raised_hands_tone1":"1f64c-1f3fb","raised_hands_tone2":"1f64c-1f3fc","raised_hands_tone3":"1f64c-1f3fd","raised_hands_tone4":"1f64c-1f3fe","raised_hands_tone5":"1f64c-1f3ff","raising_hand":"1f64b","raising_hand_tone1":"1f64b-1f3fb","raising_hand_tone2":"1f64b-1f3fc","raising_hand_tone3":"1f64b-1f3fd","raising_hand_tone4":"1f64b-1f3fe","raising_hand_tone5":"1f64b-1f3ff","raising_hand_woman":"1f64b","ram":"1f40f","ramen":"1f35c","rat":"1f400","record_button":"23fa","recycle":"267b","red_car":"1f697","red_circle":"1f534","regional_indicator_a":"1f1e6","regional_indicator_b":"1f1e7","regional_indicator_c":"1f1e8","regional_indicator_d":"1f1e9","regional_indicator_e":"1f1ea","regional_indicator_f":"1f1eb","regional_indicator_g":"1f1ec","regional_indicator_h":"1f1ed","regional_indicator_i":"1f1ee","regional_indicator_j":"1f1ef","regional_indicator_k":"1f1f0","regional_indicator_l":"1f1f1","regional_indicator_m":"1f1f2","regional_indicator_n":"1f1f3","regional_indicator_o":"1f1f4","regional_indicator_p":"1f1f5","regional_indicator_q":"1f1f6","regional_indicator_r":"1f1f7","regional_indicator_s":"1f1f8","regional_indicator_t":"1f1f9","regional_indicator_u":"1f1fa","regional_indicator_v":"1f1fb","regional_indicator_w":"1f1fc","regional_indicator_x":"1f1fd","regional_indicator_y":"1f1fe","regional_indicator_z":"1f1ff","registered":"00ae","relaxed":"263a","relieved":"1f60c","reminder_ribbon":"1f397","repeat":"1f501","repeat_one":"1f502","rescue_worker_helmet":"26d1","restroom":"1f6bb","reunion":"1f1f7-1f1ea","revolving_hearts":"1f49e","rewind":"23ea","rhino":"1f98f","ribbon":"1f380","rice":"1f35a","rice_ball":"1f359","rice_cracker":"1f358","rice_scene":"1f391","right_anger_bubble":"1f5ef","right_facing_fist":"1f91c","right_facing_fist_tone1":"1f91c-1f3fb","right_facing_fist_tone2":"1f91c-1f3fc","right_facing_fist_tone3":"1f91c-1f3fd","right_facing_fist_tone4":"1f91c-1f3fe","right_facing_fist_tone5":"1f91c-1f3ff","ring":"1f48d","robot":"1f916","rocket":"1f680","rofl":"1f923","roll_eyes":"1f644","roller_coaster":"1f3a2","rolling_eyes":"1f644","romania":"1f1f7-1f1f4","rooster":"1f413","rose":"1f339","rosette":"1f3f5","rotating_light":"1f6a8","round_pushpin":"1f4cd","rowboat":"1f6a3","rowboat_tone1":"1f6a3-1f3fb","rowboat_tone2":"1f6a3-1f3fc","rowboat_tone3":"1f6a3-1f3fd","rowboat_tone4":"1f6a3-1f3fe","rowboat_tone5":"1f6a3-1f3ff","rowing_man":"1f6a3","ru":"1f1f7-1f1fa","rugby_football":"1f3c9","runner":"1f3c3","runner_tone1":"1f3c3-1f3fb","runner_tone2":"1f3c3-1f3fc","runner_tone3":"1f3c3-1f3fd","runner_tone4":"1f3c3-1f3fe","runner_tone5":"1f3c3-1f3ff","running":"1f3c3","running_man":"1f3c3","running_shirt_with_sash":"1f3bd","rwanda":"1f1f7-1f1fc","sa":"1f202","sagittarius":"2650","sailboat":"26f5","sake":"1f376","salad":"1f957","samoa":"1f1fc-1f1f8","san_marino":"1f1f8-1f1f2","sandal":"1f461","santa":"1f385","santa_tone1":"1f385-1f3fb","santa_tone2":"1f385-1f3fc","santa_tone3":"1f385-1f3fd","santa_tone4":"1f385-1f3fe","santa_tone5":"1f385-1f3ff","sao_tome_principe":"1f1f8-1f1f9","satellite":"1f4e1","satellite_orbital":"1f6f0","satisfied":"1f606","saudi_arabia":"1f1f8-1f1e6","saxophone":"1f3b7","scales":"2696","school":"1f3eb","school_satchel":"1f392","scissors":"2702","scooter":"1f6f4","scorpion":"1f982","scorpius":"264f","scream":"1f631","scream_cat":"1f640","scroll":"1f4dc","seat":"1f4ba","second_place":"1f948","secret":"3299","see_no_evil":"1f648","seedling":"1f331","selfie":"1f933","selfie_tone1":"1f933-1f3fb","selfie_tone2":"1f933-1f3fc","selfie_tone3":"1f933-1f3fd","selfie_tone4":"1f933-1f3fe","selfie_tone5":"1f933-1f3ff","senegal":"1f1f8-1f1f3","serbia":"1f1f7-1f1f8","seven":"0037-20e3","seychelles":"1f1f8-1f1e8","shallow_pan_of_food":"1f958","shamrock":"2618","shark":"1f988","shaved_ice":"1f367","sheep":"1f411","shell":"1f41a","shield":"1f6e1","shinto_shrine":"26e9","ship":"1f6a2","shirt":"1f455","shit":"1f4a9","shoe":"1f45e","shopping":"1f6cd","shopping_bags":"1f6cd","shopping_cart":"1f6d2","shower":"1f6bf","shrimp":"1f990","shrug":"1f937","shrug_tone1":"1f937-1f3fb","shrug_tone2":"1f937-1f3fc","shrug_tone3":"1f937-1f3fd","shrug_tone4":"1f937-1f3fe","shrug_tone5":"1f937-1f3ff","sierra_leone":"1f1f8-1f1f1","signal_strength":"1f4f6","singapore":"1f1f8-1f1ec","sint_maarten":"1f1f8-1f1fd","six":"0036-20e3","six_pointed_star":"1f52f","ski":"1f3bf","skier":"26f7","skull":"1f480","skull_and_crossbones":"2620","skull_crossbones":"2620","sleeping":"1f634","sleeping_accommodation":"1f6cc","sleeping_bed":"1f6cc","sleepy":"1f62a","slight_frown":"1f641","slight_smile":"1f642","slightly_frowning_face":"1f641","slightly_smiling_face":"1f642","slot_machine":"1f3b0","slovakia":"1f1f8-1f1f0","slovenia":"1f1f8-1f1ee","small_airplane":"1f6e9","small_blue_diamond":"1f539","small_orange_diamond":"1f538","small_red_triangle":"1f53a","small_red_triangle_down":"1f53b","smile":"1f604","smile_cat":"1f638","smiley":"1f603","smiley_cat":"1f63a","smiling_imp":"1f608","smirk":"1f60f","smirk_cat":"1f63c","smoking":"1f6ac","snail":"1f40c","snake":"1f40d","sneezing_face":"1f927","snowboarder":"1f3c2","snowflake":"2744","snowman":"26c4","snowman2":"2603","snowman_with_snow":"2603","sob":"1f62d","soccer":"26bd","solomon_islands":"1f1f8-1f1e7","somalia":"1f1f8-1f1f4","soon":"1f51c","sos":"1f198","sound":"1f509","south_africa":"1f1ff-1f1e6","south_georgia_south_sandwich_islands":"1f1ec-1f1f8","south_sudan":"1f1f8-1f1f8","space_invader":"1f47e","spades":"2660","spaghetti":"1f35d","sparkle":"2747","sparkler":"1f387","sparkles":"2728","sparkling_heart":"1f496","speak_no_evil":"1f64a","speaker":"1f508","speaking_head":"1f5e3","speech_balloon":"1f4ac","speech_left":"1f5e8","speedboat":"1f6a4","spider":"1f577","spider_web":"1f578","spiral_calendar":"1f5d3","spiral_notepad":"1f5d2","spoon":"1f944","spy":"1f575","spy_tone1":"1f575-1f3fb","spy_tone2":"1f575-1f3fc","spy_tone3":"1f575-1f3fd","spy_tone4":"1f575-1f3fe","spy_tone5":"1f575-1f3ff","squid":"1f991","sri_lanka":"1f1f1-1f1f0","st_barthelemy":"1f1e7-1f1f1","st_helena":"1f1f8-1f1ed","st_kitts_nevis":"1f1f0-1f1f3","st_lucia":"1f1f1-1f1e8","st_pierre_miquelon":"1f1f5-1f1f2","st_vincent_grenadines":"1f1fb-1f1e8","stadium":"1f3df","star":"2b50","star2":"1f31f","star_and_crescent":"262a","star_of_david":"2721","stars":"1f320","station":"1f689","statue_of_liberty":"1f5fd","steam_locomotive":"1f682","stew":"1f372","stop_button":"23f9","stopwatch":"23f1","straight_ruler":"1f4cf","strawberry":"1f353","stuck_out_tongue":"1f61b","stuck_out_tongue_closed_eyes":"1f61d","stuck_out_tongue_winking_eye":"1f61c","studio_microphone":"1f399","stuffed_flatbread":"1f959","sudan":"1f1f8-1f1e9","sun_behind_large_cloud":"1f325","sun_behind_rain_cloud":"1f326","sun_behind_small_cloud":"1f324","sun_with_face":"1f31e","sunflower":"1f33b","sunglasses":"1f60e","sunny":"2600","sunrise":"1f305","sunrise_over_mountains":"1f304","surfer":"1f3c4","surfer_tone1":"1f3c4-1f3fb","surfer_tone2":"1f3c4-1f3fc","surfer_tone3":"1f3c4-1f3fd","surfer_tone4":"1f3c4-1f3fe","surfer_tone5":"1f3c4-1f3ff","surfing_man":"1f3c4","suriname":"1f1f8-1f1f7","sushi":"1f363","suspension_railway":"1f69f","swaziland":"1f1f8-1f1ff","sweat":"1f613","sweat_drops":"1f4a6","sweat_smile":"1f605","sweden":"1f1f8-1f1ea","sweet_potato":"1f360","swimmer":"1f3ca","swimmer_tone1":"1f3ca-1f3fb","swimmer_tone2":"1f3ca-1f3fc","swimmer_tone3":"1f3ca-1f3fd","swimmer_tone4":"1f3ca-1f3fe","swimmer_tone5":"1f3ca-1f3ff","swimming_man":"1f3ca","switzerland":"1f1e8-1f1ed","symbols":"1f523","synagogue":"1f54d","syria":"1f1f8-1f1fe","syringe":"1f489","taco":"1f32e","tada":"1f389","taiwan":"1f1f9-1f1fc","tajikistan":"1f1f9-1f1ef","tanabata_tree":"1f38b","tangerine":"1f34a","tanzania":"1f1f9-1f1ff","taurus":"2649","taxi":"1f695","tea":"1f375","telephone":"260e","telephone_receiver":"1f4de","telescope":"1f52d","tennis":"1f3be","tent":"26fa","thailand":"1f1f9-1f1ed","thermometer":"1f321","thermometer_face":"1f912","thinking":"1f914","third_place":"1f949","thought_balloon":"1f4ad","three":"0033-20e3","thumbsdown":"1f44e","thumbsdown_tone1":"1f44e-1f3fb","thumbsdown_tone2":"1f44e-1f3fc","thumbsdown_tone3":"1f44e-1f3fd","thumbsdown_tone4":"1f44e-1f3fe","thumbsdown_tone5":"1f44e-1f3ff","thumbsup":"1f44d","thumbsup_tone1":"1f44d-1f3fb","thumbsup_tone2":"1f44d-1f3fc","thumbsup_tone3":"1f44d-1f3fd","thumbsup_tone4":"1f44d-1f3fe","thumbsup_tone5":"1f44d-1f3ff","thunder_cloud_rain":"26c8","ticket":"1f3ab","tickets":"1f39f","tiger":"1f42f","tiger2":"1f405","timer":"23f2","timer_clock":"23f2","timor_leste":"1f1f9-1f1f1","tipping_hand_woman":"1f481","tired_face":"1f62b","tm":"2122","togo":"1f1f9-1f1ec","toilet":"1f6bd","tokelau":"1f1f9-1f1f0","tokyo_tower":"1f5fc","tomato":"1f345","tone1":"1f3fb","tone2":"1f3fc","tone3":"1f3fd","tone4":"1f3fe","tone5":"1f3ff","tonga":"1f1f9-1f1f4","tongue":"1f445","tools":"1f6e0","top":"1f51d","tophat":"1f3a9","tornado":"1f32a","tr":"1f1f9-1f1f7","track_next":"23ed","track_previous":"23ee","trackball":"1f5b2","tractor":"1f69c","traffic_light":"1f6a5","train":"1f68b","train2":"1f686","tram":"1f68a","triangular_flag_on_post":"1f6a9","triangular_ruler":"1f4d0","trident":"1f531","trinidad_tobago":"1f1f9-1f1f9","triumph":"1f624","trolleybus":"1f68e","trophy":"1f3c6","tropical_drink":"1f379","tropical_fish":"1f420","truck":"1f69a","trumpet":"1f3ba","tshirt":"1f455","tulip":"1f337","tumbler_glass":"1f943","tunisia":"1f1f9-1f1f3","turkey":"1f983","turkmenistan":"1f1f9-1f1f2","turks_caicos_islands":"1f1f9-1f1e8","turtle":"1f422","tuvalu":"1f1f9-1f1fb","tv":"1f4fa","twisted_rightwards_arrows":"1f500","two":"0032-20e3","two_hearts":"1f495","two_men_holding_hands":"1f46c","two_women_holding_hands":"1f46d","u5272":"1f239","u5408":"1f234","u55b6":"1f23a","u6307":"1f22f","u6708":"1f237","u6709":"1f236","u6e80":"1f235","u7121":"1f21a","u7533":"1f238","u7981":"1f232","u7a7a":"1f233","uganda":"1f1fa-1f1ec","uk":"1f1ec-1f1e7","ukraine":"1f1fa-1f1e6","umbrella":"2614","umbrella2":"2602","unamused":"1f612","underage":"1f51e","unicorn":"1f984","united_arab_emirates":"1f1e6-1f1ea","unlock":"1f513","up":"1f199","upside_down":"1f643","upside_down_face":"1f643","urn":"26b1","uruguay":"1f1fa-1f1fe","us":"1f1fa-1f1f8","us_virgin_islands":"1f1fb-1f1ee","uzbekistan":"1f1fa-1f1ff","v":"270c","v_tone1":"270c-1f3fb","v_tone2":"270c-1f3fc","v_tone3":"270c-1f3fd","v_tone4":"270c-1f3fe","v_tone5":"270c-1f3ff","vanuatu":"1f1fb-1f1fa","vatican_city":"1f1fb-1f1e6","venezuela":"1f1fb-1f1ea","vertical_traffic_light":"1f6a6","vhs":"1f4fc","vibration_mode":"1f4f3","video_camera":"1f4f9","video_game":"1f3ae","vietnam":"1f1fb-1f1f3","violin":"1f3bb","virgo":"264d","volcano":"1f30b","volleyball":"1f3d0","vs":"1f19a","vulcan":"1f596","vulcan_salute":"1f596","vulcan_tone1":"1f596-1f3fb","vulcan_tone2":"1f596-1f3fc","vulcan_tone3":"1f596-1f3fd","vulcan_tone4":"1f596-1f3fe","vulcan_tone5":"1f596-1f3ff","walking":"1f6b6","walking_man":"1f6b6","walking_tone1":"1f6b6-1f3fb","walking_tone2":"1f6b6-1f3fc","walking_tone3":"1f6b6-1f3fd","walking_tone4":"1f6b6-1f3fe","walking_tone5":"1f6b6-1f3ff","wallis_futuna":"1f1fc-1f1eb","waning_crescent_moon":"1f318","waning_gibbous_moon":"1f316","warning":"26a0","wastebasket":"1f5d1","watch":"231a","water_buffalo":"1f403","water_polo":"1f93d","water_polo_tone1":"1f93d-1f3fb","water_polo_tone2":"1f93d-1f3fc","water_polo_tone3":"1f93d-1f3fd","water_polo_tone4":"1f93d-1f3fe","water_polo_tone5":"1f93d-1f3ff","watermelon":"1f349","wave":"1f44b","wave_tone1":"1f44b-1f3fb","wave_tone2":"1f44b-1f3fc","wave_tone3":"1f44b-1f3fd","wave_tone4":"1f44b-1f3fe","wave_tone5":"1f44b-1f3ff","wavy_dash":"3030","waxing_crescent_moon":"1f312","waxing_gibbous_moon":"1f314","wc":"1f6be","weary":"1f629","wedding":"1f492","weight_lifting_man":"1f3cb","western_sahara":"1f1ea-1f1ed","whale":"1f433","whale2":"1f40b","wheel_of_dharma":"2638","wheelchair":"267f","white_check_mark":"2705","white_circle":"26aa","white_flag":"1f3f3","white_flower":"1f4ae","white_large_square":"2b1c","white_medium_small_square":"25fd","white_medium_square":"25fb","white_small_square":"25ab","white_square_button":"1f533","white_sun_cloud":"1f325","white_sun_rain_cloud":"1f326","white_sun_small_cloud":"1f324","wilted_rose":"1f940","wind_blowing_face":"1f32c","wind_chime":"1f390","wind_face":"1f32c","wine_glass":"1f377","wink":"1f609","wolf":"1f43a","woman":"1f469","woman_tone1":"1f469-1f3fb","woman_tone2":"1f469-1f3fc","woman_tone3":"1f469-1f3fd","woman_tone4":"1f469-1f3fe","woman_tone5":"1f469-1f3ff","womans_clothes":"1f45a","womans_hat":"1f452","womens":"1f6ba","world_map":"1f5fa","worried":"1f61f","wrench":"1f527","wrestlers":"1f93c","wrestlers_tone1":"1f93c-1f3fb","wrestlers_tone2":"1f93c-1f3fc","wrestlers_tone3":"1f93c-1f3fd","wrestlers_tone4":"1f93c-1f3fe","wrestlers_tone5":"1f93c-1f3ff","writing_hand":"270d","writing_hand_tone1":"270d-1f3fb","writing_hand_tone2":"270d-1f3fc","writing_hand_tone3":"270d-1f3fd","writing_hand_tone4":"270d-1f3fe","writing_hand_tone5":"270d-1f3ff","x":"274c","yellow_heart":"1f49b","yemen":"1f1fe-1f1ea","yen":"1f4b4","yin_yang":"262f","yum":"1f60b","zambia":"1f1ff-1f1f2","zap":"26a1","zero":"0030-20e3","zimbabwe":"1f1ff-1f1fc","zipper_mouth":"1f910","zipper_mouth_face":"1f910","zzz":"1f4a4"};
+
+/** @const */
+var unicodeRegexp = /(?:[#*0-9]\uFE0F\u20E3?|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2660\u2663\u2665\u2666\u2668\u267B\u2692\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u2764\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]\uFE0F|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]\uFE0F?|[\u261D\u26F9\u270C\u270D](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|\uD83C(?:[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC2\uDFC5-\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]\uFE0F?|[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCC-\uDFCE\uDFD4-\uDFDF\uDFF3\uDFF5\uDFF7]\uFE0F|[\uDDE6-\uDDFF](?:\uD83C[\uDDE6-\uDDFF]|\uFE0F)?|[\uDF85\uDFC3\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|\uDFCB(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F))|\uD83D(?:[\uDC00-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A-\uDC6D\uDC6F\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDECC\uDED0-\uDED2\uDEEB\uDEEC\uDEF4-\uDEF6]\uFE0F?|[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD74\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6E\uDC70-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDCAA\uDD7A\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\uDD75\uDD90](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)|\uDC41(?:\u200D\uD83D\uDDE8|\uFE0F)|\uDC68(?:\u200D(?:\u2764\uFE0F\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83D[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|\uDC69(?:\u200D(?:\u2764\uFE0F\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83D\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83C[\uDFFB-\uDFFF]|\uFE0F)?)|\uD83E(?:[\uDD10-\uDD17\uDD20-\uDD25\uDD27\uDD3A\uDD40-\uDD45\uDD47-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]\uFE0F?|[\uDD18-\uDD1E\uDD26\uDD30\uDD33-\uDD39\uDD3C-\uDD3E](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?))(?!\uFE0E)/g;
+
+parseAsciiEmoji(text);
+parseAliases(text);
+parseUnicodeEmoji(text);
+
+
+/**
+* Add an emoji tag for given sequence
+*
+* @param  {!integer} tagPos Position of the tag in the original text
+* @param  {!integer} tagLen Length of text consumed by the tag
+* @param  {!string}  seq    Sequence of Unicode codepoints in hex
+*/
+function addTag(tagPos, tagLen, seq)
+{
+	addSelfClosingTag(config.tagName, tagPos, tagLen, 10).setAttribute(config.attrName, seq);
+}
+
+/**
+* Get the sequence of Unicode codepoints that corresponds to given emoji
+*
+* @param  {!string} str UTF-8 emoji
+* @return {!string}     Codepoint sequence, e.g. "23-20e3"
+*/
+function getSequence(str)
+{
+	// Remove U+FE0F and U+200D from the emoji
+	str = str.replace(/[\u200D\uFE0F]/g, '');
+	var seq = [],
+		i   = 0;
+	do
+	{
+		var cp = str.charCodeAt(i);
+		if (cp >= 0xD800)
+		{
+			cp = (cp << 10) + str.charCodeAt(++i) - 56613888;
+		}
+		seq.push(('000' + cp.toString(16)).replace(/^0+(.{4,})$/, '$1'));
+	}
+	while (++i < str.length);
+
+	return seq.join('-');
+}
+
+/**
+* Parse aliases in given text
+*
+* @param {!string} text Original text
+*/
+function parseAliases(text)
+{
+	if (!HINT.EMOJI_HAS_ALIASES || !config.aliases)
+	{
+		return;
+	}
+
+	var matchPos = 0, m;
+	if (HINT.EMOJI_HAS_ALIAS_QUICKMATCH && config.aliasesQuickMatch)
+	{
+		matchPos = text.indexOf(config.aliasesQuickMatch);
+		if (matchPos < 0)
+		{
+			return;
+		}
+	}
+
+	config.aliasesRegexp.lastIndex = matchPos;
+	while (m = config.aliasesRegexp.exec(text))
+	{
+		var alias = m[0], tagPos = m['index'], emoji;
+		if (config.aliases[alias])
+		{
+			emoji = config.aliases[alias];
+			addTag(tagPos, alias.length, getSequence(emoji));
+		}
+	}
+}
+
+/**
+* Parse ASCII emoji in given text
+*
+* @param {!string} text Original text
+*/
+function parseAsciiEmoji(text)
+{
+	var m, matchPos = text.indexOf(':');
+	if (matchPos < 0)
+	{
+		return;
+	}
+	asciiRegexp.lastIndex = matchPos;
+	while (m = asciiRegexp.exec(text))
+	{
+		var shortName = m[0].substr(1),
+			tagPos    = m['index'];
+		if (map[shortName])
+		{
+			addTag(tagPos, 2 + shortName.length, map[shortName]);
+		}
+	}
+}
+
+/**
+* Parse Unicode emoji in given text
+*
+* @param {!string} text Original text
+*/
+function parseUnicodeEmoji(text)
+{
+	var m;
+	unicodeRegexp.lastIndex = 0;
+	while (m = unicodeRegexp.exec(text))
+	{
+		var emoji = m[0], tagPos = m['index'];
+		addTag(tagPos, emoji.length, getSequence(emoji));
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Emoji/Parser.php
@@ -0,0 +1,93 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Emoji;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	protected $asciiRegexp = '/:[-+_a-z0-9]+(?=:)/';
+	protected static $map = array('+1'=>'1f44d','-1'=>'1f44e','100'=>'1f4af','1234'=>'1f522','8ball'=>'1f3b1','a'=>'1f170','ab'=>'1f18e','abc'=>'1f524','abcd'=>'1f521','accept'=>'1f251','aerial_tramway'=>'1f6a1','afghanistan'=>'1f1e6-1f1eb','airplane'=>'2708','airplane_arriving'=>'1f6ec','airplane_departure'=>'1f6eb','airplane_small'=>'1f6e9','aland_islands'=>'1f1e6-1f1fd','alarm_clock'=>'23f0','albania'=>'1f1e6-1f1f1','alembic'=>'2697','algeria'=>'1f1e9-1f1ff','alien'=>'1f47d','ambulance'=>'1f691','american_samoa'=>'1f1e6-1f1f8','amphora'=>'1f3fa','anchor'=>'2693','andorra'=>'1f1e6-1f1e9','angel'=>'1f47c','angel_tone1'=>'1f47c-1f3fb','angel_tone2'=>'1f47c-1f3fc','angel_tone3'=>'1f47c-1f3fd','angel_tone4'=>'1f47c-1f3fe','angel_tone5'=>'1f47c-1f3ff','anger'=>'1f4a2','anger_right'=>'1f5ef','angola'=>'1f1e6-1f1f4','angry'=>'1f620','anguilla'=>'1f1e6-1f1ee','anguished'=>'1f627','ant'=>'1f41c','antarctica'=>'1f1e6-1f1f6','antigua_barbuda'=>'1f1e6-1f1ec','apple'=>'1f34e','aquarius'=>'2652','argentina'=>'1f1e6-1f1f7','aries'=>'2648','armenia'=>'1f1e6-1f1f2','arrow_backward'=>'25c0','arrow_double_down'=>'23ec','arrow_double_up'=>'23eb','arrow_down'=>'2b07','arrow_down_small'=>'1f53d','arrow_forward'=>'25b6','arrow_heading_down'=>'2935','arrow_heading_up'=>'2934','arrow_left'=>'2b05','arrow_lower_left'=>'2199','arrow_lower_right'=>'2198','arrow_right'=>'27a1','arrow_right_hook'=>'21aa','arrow_up'=>'2b06','arrow_up_down'=>'2195','arrow_up_small'=>'1f53c','arrow_upper_left'=>'2196','arrow_upper_right'=>'2197','arrows_clockwise'=>'1f503','arrows_counterclockwise'=>'1f504','art'=>'1f3a8','articulated_lorry'=>'1f69b','artificial_satellite'=>'1f6f0','aruba'=>'1f1e6-1f1fc','asterisk'=>'002a-20e3','astonished'=>'1f632','athletic_shoe'=>'1f45f','atm'=>'1f3e7','atom'=>'269b','atom_symbol'=>'269b','australia'=>'1f1e6-1f1fa','austria'=>'1f1e6-1f1f9','avocado'=>'1f951','azerbaijan'=>'1f1e6-1f1ff','b'=>'1f171','baby'=>'1f476','baby_bottle'=>'1f37c','baby_chick'=>'1f424','baby_symbol'=>'1f6bc','baby_tone1'=>'1f476-1f3fb','baby_tone2'=>'1f476-1f3fc','baby_tone3'=>'1f476-1f3fd','baby_tone4'=>'1f476-1f3fe','baby_tone5'=>'1f476-1f3ff','back'=>'1f519','bacon'=>'1f953','badminton'=>'1f3f8','baggage_claim'=>'1f6c4','bahamas'=>'1f1e7-1f1f8','bahrain'=>'1f1e7-1f1ed','balance_scale'=>'2696','balloon'=>'1f388','ballot_box'=>'1f5f3','ballot_box_with_check'=>'2611','bamboo'=>'1f38d','banana'=>'1f34c','bangbang'=>'203c','bangladesh'=>'1f1e7-1f1e9','bank'=>'1f3e6','bar_chart'=>'1f4ca','barbados'=>'1f1e7-1f1e7','barber'=>'1f488','baseball'=>'26be','basketball'=>'1f3c0','basketball_man'=>'26f9','basketball_player'=>'26f9','basketball_player_tone1'=>'26f9-1f3fb','basketball_player_tone2'=>'26f9-1f3fc','basketball_player_tone3'=>'26f9-1f3fd','basketball_player_tone4'=>'26f9-1f3fe','basketball_player_tone5'=>'26f9-1f3ff','bat'=>'1f987','bath'=>'1f6c0','bath_tone1'=>'1f6c0-1f3fb','bath_tone2'=>'1f6c0-1f3fc','bath_tone3'=>'1f6c0-1f3fd','bath_tone4'=>'1f6c0-1f3fe','bath_tone5'=>'1f6c0-1f3ff','bathtub'=>'1f6c1','battery'=>'1f50b','beach'=>'1f3d6','beach_umbrella'=>'26f1','bear'=>'1f43b','bed'=>'1f6cf','bee'=>'1f41d','beer'=>'1f37a','beers'=>'1f37b','beetle'=>'1f41e','beginner'=>'1f530','belarus'=>'1f1e7-1f1fe','belgium'=>'1f1e7-1f1ea','belize'=>'1f1e7-1f1ff','bell'=>'1f514','bellhop'=>'1f6ce','bellhop_bell'=>'1f6ce','benin'=>'1f1e7-1f1ef','bento'=>'1f371','bermuda'=>'1f1e7-1f1f2','bhutan'=>'1f1e7-1f1f9','bicyclist'=>'1f6b4','bicyclist_tone1'=>'1f6b4-1f3fb','bicyclist_tone2'=>'1f6b4-1f3fc','bicyclist_tone3'=>'1f6b4-1f3fd','bicyclist_tone4'=>'1f6b4-1f3fe','bicyclist_tone5'=>'1f6b4-1f3ff','bike'=>'1f6b2','biking_man'=>'1f6b4','bikini'=>'1f459','biohazard'=>'2623','bird'=>'1f426','birthday'=>'1f382','black_circle'=>'26ab','black_flag'=>'1f3f4','black_heart'=>'1f5a4','black_joker'=>'1f0cf','black_large_square'=>'2b1b','black_medium_small_square'=>'25fe','black_medium_square'=>'25fc','black_nib'=>'2712','black_small_square'=>'25aa','black_square_button'=>'1f532','blonde_man'=>'1f471','blossom'=>'1f33c','blowfish'=>'1f421','blue_book'=>'1f4d8','blue_car'=>'1f699','blue_heart'=>'1f499','blush'=>'1f60a','boar'=>'1f417','boat'=>'26f5','bolivia'=>'1f1e7-1f1f4','bomb'=>'1f4a3','book'=>'1f4d6','bookmark'=>'1f516','bookmark_tabs'=>'1f4d1','books'=>'1f4da','boom'=>'1f4a5','boot'=>'1f462','bosnia_herzegovina'=>'1f1e7-1f1e6','botswana'=>'1f1e7-1f1fc','bouquet'=>'1f490','bow'=>'1f647','bow_and_arrow'=>'1f3f9','bow_tone1'=>'1f647-1f3fb','bow_tone2'=>'1f647-1f3fc','bow_tone3'=>'1f647-1f3fd','bow_tone4'=>'1f647-1f3fe','bow_tone5'=>'1f647-1f3ff','bowing_man'=>'1f647','bowling'=>'1f3b3','boxing_glove'=>'1f94a','boy'=>'1f466','boy_tone1'=>'1f466-1f3fb','boy_tone2'=>'1f466-1f3fc','boy_tone3'=>'1f466-1f3fd','boy_tone4'=>'1f466-1f3fe','boy_tone5'=>'1f466-1f3ff','brazil'=>'1f1e7-1f1f7','bread'=>'1f35e','bride_with_veil'=>'1f470','bride_with_veil_tone1'=>'1f470-1f3fb','bride_with_veil_tone2'=>'1f470-1f3fc','bride_with_veil_tone3'=>'1f470-1f3fd','bride_with_veil_tone4'=>'1f470-1f3fe','bride_with_veil_tone5'=>'1f470-1f3ff','bridge_at_night'=>'1f309','briefcase'=>'1f4bc','british_indian_ocean_territory'=>'1f1ee-1f1f4','british_virgin_islands'=>'1f1fb-1f1ec','broken_heart'=>'1f494','brunei'=>'1f1e7-1f1f3','bug'=>'1f41b','building_construction'=>'1f3d7','bulb'=>'1f4a1','bulgaria'=>'1f1e7-1f1ec','bullettrain_front'=>'1f685','bullettrain_side'=>'1f684','burkina_faso'=>'1f1e7-1f1eb','burrito'=>'1f32f','burundi'=>'1f1e7-1f1ee','bus'=>'1f68c','business_suit_levitating'=>'1f574','busstop'=>'1f68f','bust_in_silhouette'=>'1f464','busts_in_silhouette'=>'1f465','butterfly'=>'1f98b','cactus'=>'1f335','cake'=>'1f370','calendar'=>'1f4c6','calendar_spiral'=>'1f5d3','call_me'=>'1f919','call_me_tone1'=>'1f919-1f3fb','call_me_tone2'=>'1f919-1f3fc','call_me_tone3'=>'1f919-1f3fd','call_me_tone4'=>'1f919-1f3fe','call_me_tone5'=>'1f919-1f3ff','calling'=>'1f4f2','cambodia'=>'1f1f0-1f1ed','camel'=>'1f42b','camera'=>'1f4f7','camera_flash'=>'1f4f8','camera_with_flash'=>'1f4f8','cameroon'=>'1f1e8-1f1f2','camping'=>'1f3d5','canada'=>'1f1e8-1f1e6','canary_islands'=>'1f1ee-1f1e8','cancer'=>'264b','candle'=>'1f56f','candy'=>'1f36c','canoe'=>'1f6f6','cape_verde'=>'1f1e8-1f1fb','capital_abcd'=>'1f520','capricorn'=>'2651','car'=>'1f697','card_box'=>'1f5c3','card_file_box'=>'1f5c3','card_index'=>'1f4c7','card_index_dividers'=>'1f5c2','caribbean_netherlands'=>'1f1e7-1f1f6','carousel_horse'=>'1f3a0','carrot'=>'1f955','cartwheel'=>'1f938','cartwheel_tone1'=>'1f938-1f3fb','cartwheel_tone2'=>'1f938-1f3fc','cartwheel_tone3'=>'1f938-1f3fd','cartwheel_tone4'=>'1f938-1f3fe','cartwheel_tone5'=>'1f938-1f3ff','cat'=>'1f431','cat2'=>'1f408','cayman_islands'=>'1f1f0-1f1fe','cd'=>'1f4bf','central_african_republic'=>'1f1e8-1f1eb','chad'=>'1f1f9-1f1e9','chains'=>'26d3','champagne'=>'1f37e','champagne_glass'=>'1f942','chart'=>'1f4b9','chart_with_downwards_trend'=>'1f4c9','chart_with_upwards_trend'=>'1f4c8','checkered_flag'=>'1f3c1','cheese'=>'1f9c0','cherries'=>'1f352','cherry_blossom'=>'1f338','chestnut'=>'1f330','chicken'=>'1f414','children_crossing'=>'1f6b8','chile'=>'1f1e8-1f1f1','chipmunk'=>'1f43f','chocolate_bar'=>'1f36b','christmas_island'=>'1f1e8-1f1fd','christmas_tree'=>'1f384','church'=>'26ea','cinema'=>'1f3a6','circus_tent'=>'1f3aa','city_dusk'=>'1f306','city_sunrise'=>'1f307','city_sunset'=>'1f307','cityscape'=>'1f3d9','cl'=>'1f191','clamp'=>'1f5dc','clap'=>'1f44f','clap_tone1'=>'1f44f-1f3fb','clap_tone2'=>'1f44f-1f3fc','clap_tone3'=>'1f44f-1f3fd','clap_tone4'=>'1f44f-1f3fe','clap_tone5'=>'1f44f-1f3ff','clapper'=>'1f3ac','classical_building'=>'1f3db','clipboard'=>'1f4cb','clock'=>'1f570','clock1'=>'1f550','clock10'=>'1f559','clock1030'=>'1f565','clock11'=>'1f55a','clock1130'=>'1f566','clock12'=>'1f55b','clock1230'=>'1f567','clock130'=>'1f55c','clock2'=>'1f551','clock230'=>'1f55d','clock3'=>'1f552','clock330'=>'1f55e','clock4'=>'1f553','clock430'=>'1f55f','clock5'=>'1f554','clock530'=>'1f560','clock6'=>'1f555','clock630'=>'1f561','clock7'=>'1f556','clock730'=>'1f562','clock8'=>'1f557','clock830'=>'1f563','clock9'=>'1f558','clock930'=>'1f564','closed_book'=>'1f4d5','closed_lock_with_key'=>'1f510','closed_umbrella'=>'1f302','cloud'=>'2601','cloud_lightning'=>'1f329','cloud_rain'=>'1f327','cloud_snow'=>'1f328','cloud_tornado'=>'1f32a','cloud_with_lightning'=>'1f329','cloud_with_lightning_and_rain'=>'26c8','cloud_with_rain'=>'1f327','cloud_with_snow'=>'1f328','clown'=>'1f921','clubs'=>'2663','cn'=>'1f1e8-1f1f3','cocktail'=>'1f378','cocos_islands'=>'1f1e8-1f1e8','coffee'=>'2615','coffin'=>'26b0','cold_sweat'=>'1f630','collision'=>'1f4a5','colombia'=>'1f1e8-1f1f4','comet'=>'2604','comoros'=>'1f1f0-1f1f2','compression'=>'1f5dc','computer'=>'1f4bb','computer_mouse'=>'1f5b1','confetti_ball'=>'1f38a','confounded'=>'1f616','confused'=>'1f615','congo_brazzaville'=>'1f1e8-1f1ec','congo_kinshasa'=>'1f1e8-1f1e9','congratulations'=>'3297','construction'=>'1f6a7','construction_site'=>'1f3d7','construction_worker'=>'1f477','construction_worker_man'=>'1f477','construction_worker_tone1'=>'1f477-1f3fb','construction_worker_tone2'=>'1f477-1f3fc','construction_worker_tone3'=>'1f477-1f3fd','construction_worker_tone4'=>'1f477-1f3fe','construction_worker_tone5'=>'1f477-1f3ff','control_knobs'=>'1f39b','convenience_store'=>'1f3ea','cook_islands'=>'1f1e8-1f1f0','cookie'=>'1f36a','cooking'=>'1f373','cool'=>'1f192','cop'=>'1f46e','cop_tone1'=>'1f46e-1f3fb','cop_tone2'=>'1f46e-1f3fc','cop_tone3'=>'1f46e-1f3fd','cop_tone4'=>'1f46e-1f3fe','cop_tone5'=>'1f46e-1f3ff','copyright'=>'00a9','corn'=>'1f33d','costa_rica'=>'1f1e8-1f1f7','cote_divoire'=>'1f1e8-1f1ee','couch'=>'1f6cb','couch_and_lamp'=>'1f6cb','couple'=>'1f46b','couple_mm'=>'1f468-2764-1f468','couple_with_heart'=>'1f491','couple_with_heart_man_man'=>'1f468-2764-1f468','couple_with_heart_woman_man'=>'1f491','couple_with_heart_woman_woman'=>'1f469-2764-1f469','couple_ww'=>'1f469-2764-1f469','couplekiss'=>'1f48f','couplekiss_man_man'=>'1f468-2764-1f48b-1f468','couplekiss_man_woman'=>'1f48f','couplekiss_woman_woman'=>'1f469-2764-1f48b-1f469','cow'=>'1f42e','cow2'=>'1f404','cowboy'=>'1f920','crab'=>'1f980','crayon'=>'1f58d','credit_card'=>'1f4b3','crescent_moon'=>'1f319','cricket'=>'1f3cf','croatia'=>'1f1ed-1f1f7','crocodile'=>'1f40a','croissant'=>'1f950','cross'=>'271d','crossed_flags'=>'1f38c','crossed_swords'=>'2694','crown'=>'1f451','cruise_ship'=>'1f6f3','cry'=>'1f622','crying_cat_face'=>'1f63f','crystal_ball'=>'1f52e','cuba'=>'1f1e8-1f1fa','cucumber'=>'1f952','cupid'=>'1f498','curacao'=>'1f1e8-1f1fc','curly_loop'=>'27b0','currency_exchange'=>'1f4b1','curry'=>'1f35b','custard'=>'1f36e','customs'=>'1f6c3','cyclone'=>'1f300','cyprus'=>'1f1e8-1f1fe','czech_republic'=>'1f1e8-1f1ff','dagger'=>'1f5e1','dancer'=>'1f483','dancer_tone1'=>'1f483-1f3fb','dancer_tone2'=>'1f483-1f3fc','dancer_tone3'=>'1f483-1f3fd','dancer_tone4'=>'1f483-1f3fe','dancer_tone5'=>'1f483-1f3ff','dancers'=>'1f46f','dancing_women'=>'1f46f','dango'=>'1f361','dark_sunglasses'=>'1f576','dart'=>'1f3af','dash'=>'1f4a8','date'=>'1f4c5','de'=>'1f1e9-1f1ea','deciduous_tree'=>'1f333','deer'=>'1f98c','denmark'=>'1f1e9-1f1f0','department_store'=>'1f3ec','derelict_house'=>'1f3da','desert'=>'1f3dc','desert_island'=>'1f3dd','desktop'=>'1f5a5','desktop_computer'=>'1f5a5','detective'=>'1f575','diamond_shape_with_a_dot_inside'=>'1f4a0','diamonds'=>'2666','disappointed'=>'1f61e','disappointed_relieved'=>'1f625','dividers'=>'1f5c2','dizzy'=>'1f4ab','dizzy_face'=>'1f635','djibouti'=>'1f1e9-1f1ef','do_not_litter'=>'1f6af','dog'=>'1f436','dog2'=>'1f415','dollar'=>'1f4b5','dolls'=>'1f38e','dolphin'=>'1f42c','dominica'=>'1f1e9-1f1f2','dominican_republic'=>'1f1e9-1f1f4','door'=>'1f6aa','doughnut'=>'1f369','dove'=>'1f54a','dragon'=>'1f409','dragon_face'=>'1f432','dress'=>'1f457','dromedary_camel'=>'1f42a','drooling_face'=>'1f924','droplet'=>'1f4a7','drum'=>'1f941','duck'=>'1f986','dvd'=>'1f4c0','e-mail'=>'1f4e7','eagle'=>'1f985','ear'=>'1f442','ear_of_rice'=>'1f33e','ear_tone1'=>'1f442-1f3fb','ear_tone2'=>'1f442-1f3fc','ear_tone3'=>'1f442-1f3fd','ear_tone4'=>'1f442-1f3fe','ear_tone5'=>'1f442-1f3ff','earth_africa'=>'1f30d','earth_americas'=>'1f30e','earth_asia'=>'1f30f','ecuador'=>'1f1ea-1f1e8','egg'=>'1f95a','eggplant'=>'1f346','egypt'=>'1f1ea-1f1ec','eight'=>'0038-20e3','eight_pointed_black_star'=>'2734','eight_spoked_asterisk'=>'2733','eject'=>'23cf','el_salvador'=>'1f1f8-1f1fb','electric_plug'=>'1f50c','elephant'=>'1f418','email'=>'2709','end'=>'1f51a','envelope'=>'2709','envelope_with_arrow'=>'1f4e9','equatorial_guinea'=>'1f1ec-1f1f6','eritrea'=>'1f1ea-1f1f7','es'=>'1f1ea-1f1f8','estonia'=>'1f1ea-1f1ea','ethiopia'=>'1f1ea-1f1f9','eu'=>'1f1ea-1f1fa','euro'=>'1f4b6','european_castle'=>'1f3f0','european_post_office'=>'1f3e4','european_union'=>'1f1ea-1f1fa','evergreen_tree'=>'1f332','exclamation'=>'2757','expressionless'=>'1f611','eye'=>'1f441','eye_in_speech_bubble'=>'1f441-1f5e8','eye_speech_bubble'=>'1f441-1f5e8','eyeglasses'=>'1f453','eyes'=>'1f440','face_palm'=>'1f926','face_palm_tone1'=>'1f926-1f3fb','face_palm_tone2'=>'1f926-1f3fc','face_palm_tone3'=>'1f926-1f3fd','face_palm_tone4'=>'1f926-1f3fe','face_palm_tone5'=>'1f926-1f3ff','face_with_head_bandage'=>'1f915','face_with_thermometer'=>'1f912','facepunch'=>'1f44a','factory'=>'1f3ed','falkland_islands'=>'1f1eb-1f1f0','fallen_leaf'=>'1f342','family'=>'1f46a','family_man_man_boy'=>'1f468-1f468-1f466','family_man_man_boy_boy'=>'1f468-1f468-1f466-1f466','family_man_man_girl'=>'1f468-1f468-1f467','family_man_man_girl_boy'=>'1f468-1f468-1f467-1f466','family_man_man_girl_girl'=>'1f468-1f468-1f467-1f467','family_man_woman_boy'=>'1f46a','family_man_woman_boy_boy'=>'1f468-1f469-1f466-1f466','family_man_woman_girl'=>'1f468-1f469-1f467','family_man_woman_girl_boy'=>'1f468-1f469-1f467-1f466','family_man_woman_girl_girl'=>'1f468-1f469-1f467-1f467','family_mmb'=>'1f468-1f468-1f466','family_mmbb'=>'1f468-1f468-1f466-1f466','family_mmg'=>'1f468-1f468-1f467','family_mmgb'=>'1f468-1f468-1f467-1f466','family_mmgg'=>'1f468-1f468-1f467-1f467','family_mwbb'=>'1f468-1f469-1f466-1f466','family_mwg'=>'1f468-1f469-1f467','family_mwgb'=>'1f468-1f469-1f467-1f466','family_mwgg'=>'1f468-1f469-1f467-1f467','family_woman_woman_boy'=>'1f469-1f469-1f466','family_woman_woman_boy_boy'=>'1f469-1f469-1f466-1f466','family_woman_woman_girl'=>'1f469-1f469-1f467','family_woman_woman_girl_boy'=>'1f469-1f469-1f467-1f466','family_woman_woman_girl_girl'=>'1f469-1f469-1f467-1f467','family_wwb'=>'1f469-1f469-1f466','family_wwbb'=>'1f469-1f469-1f466-1f466','family_wwg'=>'1f469-1f469-1f467','family_wwgb'=>'1f469-1f469-1f467-1f466','family_wwgg'=>'1f469-1f469-1f467-1f467','faroe_islands'=>'1f1eb-1f1f4','fast_forward'=>'23e9','fax'=>'1f4e0','fearful'=>'1f628','feet'=>'1f43e','fencer'=>'1f93a','ferris_wheel'=>'1f3a1','ferry'=>'26f4','field_hockey'=>'1f3d1','fiji'=>'1f1eb-1f1ef','file_cabinet'=>'1f5c4','file_folder'=>'1f4c1','film_frames'=>'1f39e','film_projector'=>'1f4fd','film_strip'=>'1f39e','fingers_crossed'=>'1f91e','fingers_crossed_tone1'=>'1f91e-1f3fb','fingers_crossed_tone2'=>'1f91e-1f3fc','fingers_crossed_tone3'=>'1f91e-1f3fd','fingers_crossed_tone4'=>'1f91e-1f3fe','fingers_crossed_tone5'=>'1f91e-1f3ff','finland'=>'1f1eb-1f1ee','fire'=>'1f525','fire_engine'=>'1f692','fireworks'=>'1f386','first_place'=>'1f947','first_quarter_moon'=>'1f313','first_quarter_moon_with_face'=>'1f31b','fish'=>'1f41f','fish_cake'=>'1f365','fishing_pole_and_fish'=>'1f3a3','fist'=>'270a','fist_tone1'=>'270a-1f3fb','fist_tone2'=>'270a-1f3fc','fist_tone3'=>'270a-1f3fd','fist_tone4'=>'270a-1f3fe','fist_tone5'=>'270a-1f3ff','five'=>'0035-20e3','flag_ac'=>'1f1e6-1f1e8','flag_ad'=>'1f1e6-1f1e9','flag_ae'=>'1f1e6-1f1ea','flag_af'=>'1f1e6-1f1eb','flag_ag'=>'1f1e6-1f1ec','flag_ai'=>'1f1e6-1f1ee','flag_al'=>'1f1e6-1f1f1','flag_am'=>'1f1e6-1f1f2','flag_ao'=>'1f1e6-1f1f4','flag_aq'=>'1f1e6-1f1f6','flag_ar'=>'1f1e6-1f1f7','flag_as'=>'1f1e6-1f1f8','flag_at'=>'1f1e6-1f1f9','flag_au'=>'1f1e6-1f1fa','flag_aw'=>'1f1e6-1f1fc','flag_ax'=>'1f1e6-1f1fd','flag_az'=>'1f1e6-1f1ff','flag_ba'=>'1f1e7-1f1e6','flag_bb'=>'1f1e7-1f1e7','flag_bd'=>'1f1e7-1f1e9','flag_be'=>'1f1e7-1f1ea','flag_bf'=>'1f1e7-1f1eb','flag_bg'=>'1f1e7-1f1ec','flag_bh'=>'1f1e7-1f1ed','flag_bi'=>'1f1e7-1f1ee','flag_bj'=>'1f1e7-1f1ef','flag_bl'=>'1f1e7-1f1f1','flag_black'=>'1f3f4','flag_bm'=>'1f1e7-1f1f2','flag_bn'=>'1f1e7-1f1f3','flag_bo'=>'1f1e7-1f1f4','flag_bq'=>'1f1e7-1f1f6','flag_br'=>'1f1e7-1f1f7','flag_bs'=>'1f1e7-1f1f8','flag_bt'=>'1f1e7-1f1f9','flag_bv'=>'1f1e7-1f1fb','flag_bw'=>'1f1e7-1f1fc','flag_by'=>'1f1e7-1f1fe','flag_bz'=>'1f1e7-1f1ff','flag_ca'=>'1f1e8-1f1e6','flag_cc'=>'1f1e8-1f1e8','flag_cd'=>'1f1e8-1f1e9','flag_cf'=>'1f1e8-1f1eb','flag_cg'=>'1f1e8-1f1ec','flag_ch'=>'1f1e8-1f1ed','flag_ci'=>'1f1e8-1f1ee','flag_ck'=>'1f1e8-1f1f0','flag_cl'=>'1f1e8-1f1f1','flag_cm'=>'1f1e8-1f1f2','flag_cn'=>'1f1e8-1f1f3','flag_co'=>'1f1e8-1f1f4','flag_cp'=>'1f1e8-1f1f5','flag_cr'=>'1f1e8-1f1f7','flag_cu'=>'1f1e8-1f1fa','flag_cv'=>'1f1e8-1f1fb','flag_cw'=>'1f1e8-1f1fc','flag_cx'=>'1f1e8-1f1fd','flag_cy'=>'1f1e8-1f1fe','flag_cz'=>'1f1e8-1f1ff','flag_de'=>'1f1e9-1f1ea','flag_dg'=>'1f1e9-1f1ec','flag_dj'=>'1f1e9-1f1ef','flag_dk'=>'1f1e9-1f1f0','flag_dm'=>'1f1e9-1f1f2','flag_do'=>'1f1e9-1f1f4','flag_dz'=>'1f1e9-1f1ff','flag_ea'=>'1f1ea-1f1e6','flag_ec'=>'1f1ea-1f1e8','flag_ee'=>'1f1ea-1f1ea','flag_eg'=>'1f1ea-1f1ec','flag_eh'=>'1f1ea-1f1ed','flag_er'=>'1f1ea-1f1f7','flag_es'=>'1f1ea-1f1f8','flag_et'=>'1f1ea-1f1f9','flag_eu'=>'1f1ea-1f1fa','flag_fi'=>'1f1eb-1f1ee','flag_fj'=>'1f1eb-1f1ef','flag_fk'=>'1f1eb-1f1f0','flag_fm'=>'1f1eb-1f1f2','flag_fo'=>'1f1eb-1f1f4','flag_fr'=>'1f1eb-1f1f7','flag_ga'=>'1f1ec-1f1e6','flag_gb'=>'1f1ec-1f1e7','flag_gd'=>'1f1ec-1f1e9','flag_ge'=>'1f1ec-1f1ea','flag_gf'=>'1f1ec-1f1eb','flag_gg'=>'1f1ec-1f1ec','flag_gh'=>'1f1ec-1f1ed','flag_gi'=>'1f1ec-1f1ee','flag_gl'=>'1f1ec-1f1f1','flag_gm'=>'1f1ec-1f1f2','flag_gn'=>'1f1ec-1f1f3','flag_gp'=>'1f1ec-1f1f5','flag_gq'=>'1f1ec-1f1f6','flag_gr'=>'1f1ec-1f1f7','flag_gs'=>'1f1ec-1f1f8','flag_gt'=>'1f1ec-1f1f9','flag_gu'=>'1f1ec-1f1fa','flag_gw'=>'1f1ec-1f1fc','flag_gy'=>'1f1ec-1f1fe','flag_hk'=>'1f1ed-1f1f0','flag_hm'=>'1f1ed-1f1f2','flag_hn'=>'1f1ed-1f1f3','flag_hr'=>'1f1ed-1f1f7','flag_ht'=>'1f1ed-1f1f9','flag_hu'=>'1f1ed-1f1fa','flag_ic'=>'1f1ee-1f1e8','flag_id'=>'1f1ee-1f1e9','flag_ie'=>'1f1ee-1f1ea','flag_il'=>'1f1ee-1f1f1','flag_im'=>'1f1ee-1f1f2','flag_in'=>'1f1ee-1f1f3','flag_io'=>'1f1ee-1f1f4','flag_iq'=>'1f1ee-1f1f6','flag_ir'=>'1f1ee-1f1f7','flag_is'=>'1f1ee-1f1f8','flag_it'=>'1f1ee-1f1f9','flag_je'=>'1f1ef-1f1ea','flag_jm'=>'1f1ef-1f1f2','flag_jo'=>'1f1ef-1f1f4','flag_jp'=>'1f1ef-1f1f5','flag_ke'=>'1f1f0-1f1ea','flag_kg'=>'1f1f0-1f1ec','flag_kh'=>'1f1f0-1f1ed','flag_ki'=>'1f1f0-1f1ee','flag_km'=>'1f1f0-1f1f2','flag_kn'=>'1f1f0-1f1f3','flag_kp'=>'1f1f0-1f1f5','flag_kr'=>'1f1f0-1f1f7','flag_kw'=>'1f1f0-1f1fc','flag_ky'=>'1f1f0-1f1fe','flag_kz'=>'1f1f0-1f1ff','flag_la'=>'1f1f1-1f1e6','flag_lb'=>'1f1f1-1f1e7','flag_lc'=>'1f1f1-1f1e8','flag_li'=>'1f1f1-1f1ee','flag_lk'=>'1f1f1-1f1f0','flag_lr'=>'1f1f1-1f1f7','flag_ls'=>'1f1f1-1f1f8','flag_lt'=>'1f1f1-1f1f9','flag_lu'=>'1f1f1-1f1fa','flag_lv'=>'1f1f1-1f1fb','flag_ly'=>'1f1f1-1f1fe','flag_ma'=>'1f1f2-1f1e6','flag_mc'=>'1f1f2-1f1e8','flag_md'=>'1f1f2-1f1e9','flag_me'=>'1f1f2-1f1ea','flag_mf'=>'1f1f2-1f1eb','flag_mg'=>'1f1f2-1f1ec','flag_mh'=>'1f1f2-1f1ed','flag_mk'=>'1f1f2-1f1f0','flag_ml'=>'1f1f2-1f1f1','flag_mm'=>'1f1f2-1f1f2','flag_mn'=>'1f1f2-1f1f3','flag_mo'=>'1f1f2-1f1f4','flag_mp'=>'1f1f2-1f1f5','flag_mq'=>'1f1f2-1f1f6','flag_mr'=>'1f1f2-1f1f7','flag_ms'=>'1f1f2-1f1f8','flag_mt'=>'1f1f2-1f1f9','flag_mu'=>'1f1f2-1f1fa','flag_mv'=>'1f1f2-1f1fb','flag_mw'=>'1f1f2-1f1fc','flag_mx'=>'1f1f2-1f1fd','flag_my'=>'1f1f2-1f1fe','flag_mz'=>'1f1f2-1f1ff','flag_na'=>'1f1f3-1f1e6','flag_nc'=>'1f1f3-1f1e8','flag_ne'=>'1f1f3-1f1ea','flag_nf'=>'1f1f3-1f1eb','flag_ng'=>'1f1f3-1f1ec','flag_ni'=>'1f1f3-1f1ee','flag_nl'=>'1f1f3-1f1f1','flag_no'=>'1f1f3-1f1f4','flag_np'=>'1f1f3-1f1f5','flag_nr'=>'1f1f3-1f1f7','flag_nu'=>'1f1f3-1f1fa','flag_nz'=>'1f1f3-1f1ff','flag_om'=>'1f1f4-1f1f2','flag_pa'=>'1f1f5-1f1e6','flag_pe'=>'1f1f5-1f1ea','flag_pf'=>'1f1f5-1f1eb','flag_pg'=>'1f1f5-1f1ec','flag_ph'=>'1f1f5-1f1ed','flag_pk'=>'1f1f5-1f1f0','flag_pl'=>'1f1f5-1f1f1','flag_pm'=>'1f1f5-1f1f2','flag_pn'=>'1f1f5-1f1f3','flag_pr'=>'1f1f5-1f1f7','flag_ps'=>'1f1f5-1f1f8','flag_pt'=>'1f1f5-1f1f9','flag_pw'=>'1f1f5-1f1fc','flag_py'=>'1f1f5-1f1fe','flag_qa'=>'1f1f6-1f1e6','flag_re'=>'1f1f7-1f1ea','flag_ro'=>'1f1f7-1f1f4','flag_rs'=>'1f1f7-1f1f8','flag_ru'=>'1f1f7-1f1fa','flag_rw'=>'1f1f7-1f1fc','flag_sa'=>'1f1f8-1f1e6','flag_sb'=>'1f1f8-1f1e7','flag_sc'=>'1f1f8-1f1e8','flag_sd'=>'1f1f8-1f1e9','flag_se'=>'1f1f8-1f1ea','flag_sg'=>'1f1f8-1f1ec','flag_sh'=>'1f1f8-1f1ed','flag_si'=>'1f1f8-1f1ee','flag_sj'=>'1f1f8-1f1ef','flag_sk'=>'1f1f8-1f1f0','flag_sl'=>'1f1f8-1f1f1','flag_sm'=>'1f1f8-1f1f2','flag_sn'=>'1f1f8-1f1f3','flag_so'=>'1f1f8-1f1f4','flag_sr'=>'1f1f8-1f1f7','flag_ss'=>'1f1f8-1f1f8','flag_st'=>'1f1f8-1f1f9','flag_sv'=>'1f1f8-1f1fb','flag_sx'=>'1f1f8-1f1fd','flag_sy'=>'1f1f8-1f1fe','flag_sz'=>'1f1f8-1f1ff','flag_ta'=>'1f1f9-1f1e6','flag_tc'=>'1f1f9-1f1e8','flag_td'=>'1f1f9-1f1e9','flag_tf'=>'1f1f9-1f1eb','flag_tg'=>'1f1f9-1f1ec','flag_th'=>'1f1f9-1f1ed','flag_tj'=>'1f1f9-1f1ef','flag_tk'=>'1f1f9-1f1f0','flag_tl'=>'1f1f9-1f1f1','flag_tm'=>'1f1f9-1f1f2','flag_tn'=>'1f1f9-1f1f3','flag_to'=>'1f1f9-1f1f4','flag_tr'=>'1f1f9-1f1f7','flag_tt'=>'1f1f9-1f1f9','flag_tv'=>'1f1f9-1f1fb','flag_tw'=>'1f1f9-1f1fc','flag_tz'=>'1f1f9-1f1ff','flag_ua'=>'1f1fa-1f1e6','flag_ug'=>'1f1fa-1f1ec','flag_um'=>'1f1fa-1f1f2','flag_us'=>'1f1fa-1f1f8','flag_uy'=>'1f1fa-1f1fe','flag_uz'=>'1f1fa-1f1ff','flag_va'=>'1f1fb-1f1e6','flag_vc'=>'1f1fb-1f1e8','flag_ve'=>'1f1fb-1f1ea','flag_vg'=>'1f1fb-1f1ec','flag_vi'=>'1f1fb-1f1ee','flag_vn'=>'1f1fb-1f1f3','flag_vu'=>'1f1fb-1f1fa','flag_wf'=>'1f1fc-1f1eb','flag_white'=>'1f3f3','flag_ws'=>'1f1fc-1f1f8','flag_xk'=>'1f1fd-1f1f0','flag_ye'=>'1f1fe-1f1ea','flag_yt'=>'1f1fe-1f1f9','flag_za'=>'1f1ff-1f1e6','flag_zm'=>'1f1ff-1f1f2','flag_zw'=>'1f1ff-1f1fc','flags'=>'1f38f','flashlight'=>'1f526','fleur-de-lis'=>'269c','fleur_de_lis'=>'269c','flight_arrival'=>'1f6ec','flight_departure'=>'1f6eb','flipper'=>'1f42c','floppy_disk'=>'1f4be','flower_playing_cards'=>'1f3b4','flushed'=>'1f633','fog'=>'1f32b','foggy'=>'1f301','football'=>'1f3c8','footprints'=>'1f463','fork_and_knife'=>'1f374','fork_knife_plate'=>'1f37d','fountain'=>'26f2','fountain_pen'=>'1f58b','four'=>'0034-20e3','four_leaf_clover'=>'1f340','fox'=>'1f98a','fr'=>'1f1eb-1f1f7','frame_photo'=>'1f5bc','framed_picture'=>'1f5bc','free'=>'1f193','french_bread'=>'1f956','french_guiana'=>'1f1ec-1f1eb','french_polynesia'=>'1f1f5-1f1eb','french_southern_territories'=>'1f1f9-1f1eb','fried_shrimp'=>'1f364','fries'=>'1f35f','frog'=>'1f438','frowning'=>'1f626','frowning2'=>'2639','frowning_face'=>'2639','frowning_woman'=>'1f64d','fu'=>'1f595','fuelpump'=>'26fd','full_moon'=>'1f315','full_moon_with_face'=>'1f31d','funeral_urn'=>'26b1','gabon'=>'1f1ec-1f1e6','gambia'=>'1f1ec-1f1f2','game_die'=>'1f3b2','gay_pride_flag'=>'1f3f3-1f308','gb'=>'1f1ec-1f1e7','gear'=>'2699','gem'=>'1f48e','gemini'=>'264a','georgia'=>'1f1ec-1f1ea','ghana'=>'1f1ec-1f1ed','ghost'=>'1f47b','gibraltar'=>'1f1ec-1f1ee','gift'=>'1f381','gift_heart'=>'1f49d','girl'=>'1f467','girl_tone1'=>'1f467-1f3fb','girl_tone2'=>'1f467-1f3fc','girl_tone3'=>'1f467-1f3fd','girl_tone4'=>'1f467-1f3fe','girl_tone5'=>'1f467-1f3ff','globe_with_meridians'=>'1f310','goal'=>'1f945','goat'=>'1f410','golf'=>'26f3','golfer'=>'1f3cc','golfing_man'=>'1f3cc','gorilla'=>'1f98d','grapes'=>'1f347','greece'=>'1f1ec-1f1f7','green_apple'=>'1f34f','green_book'=>'1f4d7','green_heart'=>'1f49a','greenland'=>'1f1ec-1f1f1','grenada'=>'1f1ec-1f1e9','grey_exclamation'=>'2755','grey_question'=>'2754','grimacing'=>'1f62c','grin'=>'1f601','grinning'=>'1f600','guadeloupe'=>'1f1ec-1f1f5','guam'=>'1f1ec-1f1fa','guardsman'=>'1f482','guardsman_tone1'=>'1f482-1f3fb','guardsman_tone2'=>'1f482-1f3fc','guardsman_tone3'=>'1f482-1f3fd','guardsman_tone4'=>'1f482-1f3fe','guardsman_tone5'=>'1f482-1f3ff','guatemala'=>'1f1ec-1f1f9','guernsey'=>'1f1ec-1f1ec','guinea'=>'1f1ec-1f1f3','guinea_bissau'=>'1f1ec-1f1fc','guitar'=>'1f3b8','gun'=>'1f52b','guyana'=>'1f1ec-1f1fe','haircut'=>'1f487','haircut_tone1'=>'1f487-1f3fb','haircut_tone2'=>'1f487-1f3fc','haircut_tone3'=>'1f487-1f3fd','haircut_tone4'=>'1f487-1f3fe','haircut_tone5'=>'1f487-1f3ff','haircut_woman'=>'1f487','haiti'=>'1f1ed-1f1f9','hamburger'=>'1f354','hammer'=>'1f528','hammer_and_pick'=>'2692','hammer_and_wrench'=>'1f6e0','hammer_pick'=>'2692','hamster'=>'1f439','hand'=>'270b','hand_splayed'=>'1f590','hand_splayed_tone1'=>'1f590-1f3fb','hand_splayed_tone2'=>'1f590-1f3fc','hand_splayed_tone3'=>'1f590-1f3fd','hand_splayed_tone4'=>'1f590-1f3fe','hand_splayed_tone5'=>'1f590-1f3ff','handbag'=>'1f45c','handball'=>'1f93e','handball_tone1'=>'1f93e-1f3fb','handball_tone2'=>'1f93e-1f3fc','handball_tone3'=>'1f93e-1f3fd','handball_tone4'=>'1f93e-1f3fe','handball_tone5'=>'1f93e-1f3ff','handshake'=>'1f91d','handshake_tone1'=>'1f91d-1f3fb','handshake_tone2'=>'1f91d-1f3fc','handshake_tone3'=>'1f91d-1f3fd','handshake_tone4'=>'1f91d-1f3fe','handshake_tone5'=>'1f91d-1f3ff','hankey'=>'1f4a9','hash'=>'0023-20e3','hatched_chick'=>'1f425','hatching_chick'=>'1f423','head_bandage'=>'1f915','headphones'=>'1f3a7','hear_no_evil'=>'1f649','heart'=>'2764','heart_decoration'=>'1f49f','heart_exclamation'=>'2763','heart_eyes'=>'1f60d','heart_eyes_cat'=>'1f63b','heartbeat'=>'1f493','heartpulse'=>'1f497','hearts'=>'2665','heavy_check_mark'=>'2714','heavy_division_sign'=>'2797','heavy_dollar_sign'=>'1f4b2','heavy_exclamation_mark'=>'2757','heavy_heart_exclamation'=>'2763','heavy_minus_sign'=>'2796','heavy_multiplication_x'=>'2716','heavy_plus_sign'=>'2795','helicopter'=>'1f681','helmet_with_cross'=>'26d1','herb'=>'1f33f','hibiscus'=>'1f33a','high_brightness'=>'1f506','high_heel'=>'1f460','hocho'=>'1f52a','hockey'=>'1f3d2','hole'=>'1f573','homes'=>'1f3d8','honduras'=>'1f1ed-1f1f3','honey_pot'=>'1f36f','honeybee'=>'1f41d','hong_kong'=>'1f1ed-1f1f0','horse'=>'1f434','horse_racing'=>'1f3c7','horse_racing_tone1'=>'1f3c7-1f3fb','horse_racing_tone2'=>'1f3c7-1f3fc','horse_racing_tone3'=>'1f3c7-1f3fd','horse_racing_tone4'=>'1f3c7-1f3fe','horse_racing_tone5'=>'1f3c7-1f3ff','hospital'=>'1f3e5','hot_pepper'=>'1f336','hotdog'=>'1f32d','hotel'=>'1f3e8','hotsprings'=>'2668','hourglass'=>'231b','hourglass_flowing_sand'=>'23f3','house'=>'1f3e0','house_abandoned'=>'1f3da','house_with_garden'=>'1f3e1','houses'=>'1f3d8','hugging'=>'1f917','hugs'=>'1f917','hungary'=>'1f1ed-1f1fa','hushed'=>'1f62f','ice_cream'=>'1f368','ice_hockey'=>'1f3d2','ice_skate'=>'26f8','icecream'=>'1f366','iceland'=>'1f1ee-1f1f8','id'=>'1f194','ideograph_advantage'=>'1f250','imp'=>'1f47f','inbox_tray'=>'1f4e5','incoming_envelope'=>'1f4e8','india'=>'1f1ee-1f1f3','indonesia'=>'1f1ee-1f1e9','information_desk_person'=>'1f481','information_desk_person_tone1'=>'1f481-1f3fb','information_desk_person_tone2'=>'1f481-1f3fc','information_desk_person_tone3'=>'1f481-1f3fd','information_desk_person_tone4'=>'1f481-1f3fe','information_desk_person_tone5'=>'1f481-1f3ff','information_source'=>'2139','innocent'=>'1f607','interrobang'=>'2049','iphone'=>'1f4f1','iran'=>'1f1ee-1f1f7','iraq'=>'1f1ee-1f1f6','ireland'=>'1f1ee-1f1ea','island'=>'1f3dd','isle_of_man'=>'1f1ee-1f1f2','israel'=>'1f1ee-1f1f1','it'=>'1f1ee-1f1f9','izakaya_lantern'=>'1f3ee','jack_o_lantern'=>'1f383','jamaica'=>'1f1ef-1f1f2','japan'=>'1f5fe','japanese_castle'=>'1f3ef','japanese_goblin'=>'1f47a','japanese_ogre'=>'1f479','jeans'=>'1f456','jersey'=>'1f1ef-1f1ea','jordan'=>'1f1ef-1f1f4','joy'=>'1f602','joy_cat'=>'1f639','joystick'=>'1f579','jp'=>'1f1ef-1f1f5','juggling'=>'1f939','juggling_tone1'=>'1f939-1f3fb','juggling_tone2'=>'1f939-1f3fc','juggling_tone3'=>'1f939-1f3fd','juggling_tone4'=>'1f939-1f3fe','juggling_tone5'=>'1f939-1f3ff','kaaba'=>'1f54b','kazakhstan'=>'1f1f0-1f1ff','kenya'=>'1f1f0-1f1ea','key'=>'1f511','key2'=>'1f5dd','keyboard'=>'2328','keycap_ten'=>'1f51f','kimono'=>'1f458','kiribati'=>'1f1f0-1f1ee','kiss'=>'1f48b','kiss_mm'=>'1f468-2764-1f48b-1f468','kiss_ww'=>'1f469-2764-1f48b-1f469','kissing'=>'1f617','kissing_cat'=>'1f63d','kissing_closed_eyes'=>'1f61a','kissing_heart'=>'1f618','kissing_smiling_eyes'=>'1f619','kiwi'=>'1f95d','knife'=>'1f52a','koala'=>'1f428','koko'=>'1f201','kosovo'=>'1f1fd-1f1f0','kr'=>'1f1f0-1f1f7','kuwait'=>'1f1f0-1f1fc','kyrgyzstan'=>'1f1f0-1f1ec','label'=>'1f3f7','lantern'=>'1f3ee','laos'=>'1f1f1-1f1e6','large_blue_circle'=>'1f535','large_blue_diamond'=>'1f537','large_orange_diamond'=>'1f536','last_quarter_moon'=>'1f317','last_quarter_moon_with_face'=>'1f31c','latin_cross'=>'271d','latvia'=>'1f1f1-1f1fb','laughing'=>'1f606','leaves'=>'1f343','lebanon'=>'1f1f1-1f1e7','ledger'=>'1f4d2','left_facing_fist'=>'1f91b','left_facing_fist_tone1'=>'1f91b-1f3fb','left_facing_fist_tone2'=>'1f91b-1f3fc','left_facing_fist_tone3'=>'1f91b-1f3fd','left_facing_fist_tone4'=>'1f91b-1f3fe','left_facing_fist_tone5'=>'1f91b-1f3ff','left_luggage'=>'1f6c5','left_right_arrow'=>'2194','leftwards_arrow_with_hook'=>'21a9','lemon'=>'1f34b','leo'=>'264c','leopard'=>'1f406','lesotho'=>'1f1f1-1f1f8','level_slider'=>'1f39a','levitate'=>'1f574','liberia'=>'1f1f1-1f1f7','libra'=>'264e','libya'=>'1f1f1-1f1fe','liechtenstein'=>'1f1f1-1f1ee','lifter'=>'1f3cb','lifter_tone1'=>'1f3cb-1f3fb','lifter_tone2'=>'1f3cb-1f3fc','lifter_tone3'=>'1f3cb-1f3fd','lifter_tone4'=>'1f3cb-1f3fe','lifter_tone5'=>'1f3cb-1f3ff','light_rail'=>'1f688','link'=>'1f517','lion'=>'1f981','lion_face'=>'1f981','lips'=>'1f444','lipstick'=>'1f484','lithuania'=>'1f1f1-1f1f9','lizard'=>'1f98e','lock'=>'1f512','lock_with_ink_pen'=>'1f50f','lollipop'=>'1f36d','loop'=>'27bf','loud_sound'=>'1f50a','loudspeaker'=>'1f4e2','love_hotel'=>'1f3e9','love_letter'=>'1f48c','low_brightness'=>'1f505','luxembourg'=>'1f1f1-1f1fa','lying_face'=>'1f925','m'=>'24c2','macau'=>'1f1f2-1f1f4','macedonia'=>'1f1f2-1f1f0','madagascar'=>'1f1f2-1f1ec','mag'=>'1f50d','mag_right'=>'1f50e','mahjong'=>'1f004','mailbox'=>'1f4eb','mailbox_closed'=>'1f4ea','mailbox_with_mail'=>'1f4ec','mailbox_with_no_mail'=>'1f4ed','malawi'=>'1f1f2-1f1fc','malaysia'=>'1f1f2-1f1fe','maldives'=>'1f1f2-1f1fb','male_detective'=>'1f575','mali'=>'1f1f2-1f1f1','malta'=>'1f1f2-1f1f9','man'=>'1f468','man_dancing'=>'1f57a','man_dancing_tone1'=>'1f57a-1f3fb','man_dancing_tone2'=>'1f57a-1f3fc','man_dancing_tone3'=>'1f57a-1f3fd','man_dancing_tone4'=>'1f57a-1f3fe','man_dancing_tone5'=>'1f57a-1f3ff','man_in_tuxedo'=>'1f935','man_in_tuxedo_tone1'=>'1f935-1f3fb','man_in_tuxedo_tone2'=>'1f935-1f3fc','man_in_tuxedo_tone3'=>'1f935-1f3fd','man_in_tuxedo_tone4'=>'1f935-1f3fe','man_in_tuxedo_tone5'=>'1f935-1f3ff','man_tone1'=>'1f468-1f3fb','man_tone2'=>'1f468-1f3fc','man_tone3'=>'1f468-1f3fd','man_tone4'=>'1f468-1f3fe','man_tone5'=>'1f468-1f3ff','man_with_gua_pi_mao'=>'1f472','man_with_gua_pi_mao_tone1'=>'1f472-1f3fb','man_with_gua_pi_mao_tone2'=>'1f472-1f3fc','man_with_gua_pi_mao_tone3'=>'1f472-1f3fd','man_with_gua_pi_mao_tone4'=>'1f472-1f3fe','man_with_gua_pi_mao_tone5'=>'1f472-1f3ff','man_with_turban'=>'1f473','man_with_turban_tone1'=>'1f473-1f3fb','man_with_turban_tone2'=>'1f473-1f3fc','man_with_turban_tone3'=>'1f473-1f3fd','man_with_turban_tone4'=>'1f473-1f3fe','man_with_turban_tone5'=>'1f473-1f3ff','mandarin'=>'1f34a','mans_shoe'=>'1f45e','mantelpiece_clock'=>'1f570','map'=>'1f5fa','maple_leaf'=>'1f341','marshall_islands'=>'1f1f2-1f1ed','martial_arts_uniform'=>'1f94b','martinique'=>'1f1f2-1f1f6','mask'=>'1f637','massage'=>'1f486','massage_tone1'=>'1f486-1f3fb','massage_tone2'=>'1f486-1f3fc','massage_tone3'=>'1f486-1f3fd','massage_tone4'=>'1f486-1f3fe','massage_tone5'=>'1f486-1f3ff','massage_woman'=>'1f486','mauritania'=>'1f1f2-1f1f7','mauritius'=>'1f1f2-1f1fa','mayotte'=>'1f1fe-1f1f9','meat_on_bone'=>'1f356','medal'=>'1f3c5','medal_military'=>'1f396','medal_sports'=>'1f3c5','mega'=>'1f4e3','melon'=>'1f348','memo'=>'1f4dd','menorah'=>'1f54e','mens'=>'1f6b9','metal'=>'1f918','metal_tone1'=>'1f918-1f3fb','metal_tone2'=>'1f918-1f3fc','metal_tone3'=>'1f918-1f3fd','metal_tone4'=>'1f918-1f3fe','metal_tone5'=>'1f918-1f3ff','metro'=>'1f687','mexico'=>'1f1f2-1f1fd','micronesia'=>'1f1eb-1f1f2','microphone'=>'1f3a4','microphone2'=>'1f399','microscope'=>'1f52c','middle_finger'=>'1f595','middle_finger_tone1'=>'1f595-1f3fb','middle_finger_tone2'=>'1f595-1f3fc','middle_finger_tone3'=>'1f595-1f3fd','middle_finger_tone4'=>'1f595-1f3fe','middle_finger_tone5'=>'1f595-1f3ff','military_medal'=>'1f396','milk'=>'1f95b','milky_way'=>'1f30c','minibus'=>'1f690','minidisc'=>'1f4bd','mobile_phone_off'=>'1f4f4','moldova'=>'1f1f2-1f1e9','monaco'=>'1f1f2-1f1e8','money_mouth'=>'1f911','money_mouth_face'=>'1f911','money_with_wings'=>'1f4b8','moneybag'=>'1f4b0','mongolia'=>'1f1f2-1f1f3','monkey'=>'1f412','monkey_face'=>'1f435','monorail'=>'1f69d','montenegro'=>'1f1f2-1f1ea','montserrat'=>'1f1f2-1f1f8','moon'=>'1f314','morocco'=>'1f1f2-1f1e6','mortar_board'=>'1f393','mosque'=>'1f54c','motor_boat'=>'1f6e5','motor_scooter'=>'1f6f5','motorboat'=>'1f6e5','motorcycle'=>'1f3cd','motorway'=>'1f6e3','mount_fuji'=>'1f5fb','mountain'=>'26f0','mountain_bicyclist'=>'1f6b5','mountain_bicyclist_tone1'=>'1f6b5-1f3fb','mountain_bicyclist_tone2'=>'1f6b5-1f3fc','mountain_bicyclist_tone3'=>'1f6b5-1f3fd','mountain_bicyclist_tone4'=>'1f6b5-1f3fe','mountain_bicyclist_tone5'=>'1f6b5-1f3ff','mountain_biking_man'=>'1f6b5','mountain_cableway'=>'1f6a0','mountain_railway'=>'1f69e','mountain_snow'=>'1f3d4','mouse'=>'1f42d','mouse2'=>'1f401','mouse_three_button'=>'1f5b1','movie_camera'=>'1f3a5','moyai'=>'1f5ff','mozambique'=>'1f1f2-1f1ff','mrs_claus'=>'1f936','mrs_claus_tone1'=>'1f936-1f3fb','mrs_claus_tone2'=>'1f936-1f3fc','mrs_claus_tone3'=>'1f936-1f3fd','mrs_claus_tone4'=>'1f936-1f3fe','mrs_claus_tone5'=>'1f936-1f3ff','muscle'=>'1f4aa','muscle_tone1'=>'1f4aa-1f3fb','muscle_tone2'=>'1f4aa-1f3fc','muscle_tone3'=>'1f4aa-1f3fd','muscle_tone4'=>'1f4aa-1f3fe','muscle_tone5'=>'1f4aa-1f3ff','mushroom'=>'1f344','musical_keyboard'=>'1f3b9','musical_note'=>'1f3b5','musical_score'=>'1f3bc','mute'=>'1f507','myanmar'=>'1f1f2-1f1f2','nail_care'=>'1f485','nail_care_tone1'=>'1f485-1f3fb','nail_care_tone2'=>'1f485-1f3fc','nail_care_tone3'=>'1f485-1f3fd','nail_care_tone4'=>'1f485-1f3fe','nail_care_tone5'=>'1f485-1f3ff','name_badge'=>'1f4db','namibia'=>'1f1f3-1f1e6','national_park'=>'1f3de','nauru'=>'1f1f3-1f1f7','nauseated_face'=>'1f922','necktie'=>'1f454','negative_squared_cross_mark'=>'274e','nepal'=>'1f1f3-1f1f5','nerd'=>'1f913','nerd_face'=>'1f913','netherlands'=>'1f1f3-1f1f1','neutral_face'=>'1f610','new'=>'1f195','new_caledonia'=>'1f1f3-1f1e8','new_moon'=>'1f311','new_moon_with_face'=>'1f31a','new_zealand'=>'1f1f3-1f1ff','newspaper'=>'1f4f0','newspaper2'=>'1f5de','newspaper_roll'=>'1f5de','next_track_button'=>'23ed','ng'=>'1f196','ng_woman'=>'1f645','nicaragua'=>'1f1f3-1f1ee','niger'=>'1f1f3-1f1ea','nigeria'=>'1f1f3-1f1ec','night_with_stars'=>'1f303','nine'=>'0039-20e3','niue'=>'1f1f3-1f1fa','no_bell'=>'1f515','no_bicycles'=>'1f6b3','no_entry'=>'26d4','no_entry_sign'=>'1f6ab','no_good'=>'1f645','no_good_tone1'=>'1f645-1f3fb','no_good_tone2'=>'1f645-1f3fc','no_good_tone3'=>'1f645-1f3fd','no_good_tone4'=>'1f645-1f3fe','no_good_tone5'=>'1f645-1f3ff','no_good_woman'=>'1f645','no_mobile_phones'=>'1f4f5','no_mouth'=>'1f636','no_pedestrians'=>'1f6b7','no_smoking'=>'1f6ad','non-potable_water'=>'1f6b1','norfolk_island'=>'1f1f3-1f1eb','north_korea'=>'1f1f0-1f1f5','northern_mariana_islands'=>'1f1f2-1f1f5','norway'=>'1f1f3-1f1f4','nose'=>'1f443','nose_tone1'=>'1f443-1f3fb','nose_tone2'=>'1f443-1f3fc','nose_tone3'=>'1f443-1f3fd','nose_tone4'=>'1f443-1f3fe','nose_tone5'=>'1f443-1f3ff','notebook'=>'1f4d3','notebook_with_decorative_cover'=>'1f4d4','notepad_spiral'=>'1f5d2','notes'=>'1f3b6','nut_and_bolt'=>'1f529','o'=>'2b55','o2'=>'1f17e','ocean'=>'1f30a','octagonal_sign'=>'1f6d1','octopus'=>'1f419','oden'=>'1f362','office'=>'1f3e2','oil'=>'1f6e2','oil_drum'=>'1f6e2','ok'=>'1f197','ok_hand'=>'1f44c','ok_hand_tone1'=>'1f44c-1f3fb','ok_hand_tone2'=>'1f44c-1f3fc','ok_hand_tone3'=>'1f44c-1f3fd','ok_hand_tone4'=>'1f44c-1f3fe','ok_hand_tone5'=>'1f44c-1f3ff','ok_woman'=>'1f646','ok_woman_tone1'=>'1f646-1f3fb','ok_woman_tone2'=>'1f646-1f3fc','ok_woman_tone3'=>'1f646-1f3fd','ok_woman_tone4'=>'1f646-1f3fe','ok_woman_tone5'=>'1f646-1f3ff','old_key'=>'1f5dd','older_man'=>'1f474','older_man_tone1'=>'1f474-1f3fb','older_man_tone2'=>'1f474-1f3fc','older_man_tone3'=>'1f474-1f3fd','older_man_tone4'=>'1f474-1f3fe','older_man_tone5'=>'1f474-1f3ff','older_woman'=>'1f475','older_woman_tone1'=>'1f475-1f3fb','older_woman_tone2'=>'1f475-1f3fc','older_woman_tone3'=>'1f475-1f3fd','older_woman_tone4'=>'1f475-1f3fe','older_woman_tone5'=>'1f475-1f3ff','om'=>'1f549','om_symbol'=>'1f549','oman'=>'1f1f4-1f1f2','on'=>'1f51b','oncoming_automobile'=>'1f698','oncoming_bus'=>'1f68d','oncoming_police_car'=>'1f694','oncoming_taxi'=>'1f696','one'=>'0031-20e3','open_book'=>'1f4d6','open_file_folder'=>'1f4c2','open_hands'=>'1f450','open_hands_tone1'=>'1f450-1f3fb','open_hands_tone2'=>'1f450-1f3fc','open_hands_tone3'=>'1f450-1f3fd','open_hands_tone4'=>'1f450-1f3fe','open_hands_tone5'=>'1f450-1f3ff','open_mouth'=>'1f62e','open_umbrella'=>'2602','ophiuchus'=>'26ce','orange'=>'1f34a','orange_book'=>'1f4d9','orthodox_cross'=>'2626','outbox_tray'=>'1f4e4','owl'=>'1f989','ox'=>'1f402','package'=>'1f4e6','page_facing_up'=>'1f4c4','page_with_curl'=>'1f4c3','pager'=>'1f4df','paintbrush'=>'1f58c','pakistan'=>'1f1f5-1f1f0','palau'=>'1f1f5-1f1fc','palestinian_territories'=>'1f1f5-1f1f8','palm_tree'=>'1f334','panama'=>'1f1f5-1f1e6','pancakes'=>'1f95e','panda_face'=>'1f43c','paperclip'=>'1f4ce','paperclips'=>'1f587','papua_new_guinea'=>'1f1f5-1f1ec','paraguay'=>'1f1f5-1f1fe','parasol_on_ground'=>'26f1','park'=>'1f3de','parking'=>'1f17f','part_alternation_mark'=>'303d','partly_sunny'=>'26c5','passenger_ship'=>'1f6f3','passport_control'=>'1f6c2','pause_button'=>'23f8','paw_prints'=>'1f43e','peace'=>'262e','peace_symbol'=>'262e','peach'=>'1f351','peanuts'=>'1f95c','pear'=>'1f350','pen'=>'1f58a','pen_ballpoint'=>'1f58a','pen_fountain'=>'1f58b','pencil'=>'1f4dd','pencil2'=>'270f','penguin'=>'1f427','pensive'=>'1f614','performing_arts'=>'1f3ad','persevere'=>'1f623','person_frowning'=>'1f64d','person_frowning_tone1'=>'1f64d-1f3fb','person_frowning_tone2'=>'1f64d-1f3fc','person_frowning_tone3'=>'1f64d-1f3fd','person_frowning_tone4'=>'1f64d-1f3fe','person_frowning_tone5'=>'1f64d-1f3ff','person_with_blond_hair'=>'1f471','person_with_blond_hair_tone1'=>'1f471-1f3fb','person_with_blond_hair_tone2'=>'1f471-1f3fc','person_with_blond_hair_tone3'=>'1f471-1f3fd','person_with_blond_hair_tone4'=>'1f471-1f3fe','person_with_blond_hair_tone5'=>'1f471-1f3ff','person_with_pouting_face'=>'1f64e','person_with_pouting_face_tone1'=>'1f64e-1f3fb','person_with_pouting_face_tone2'=>'1f64e-1f3fc','person_with_pouting_face_tone3'=>'1f64e-1f3fd','person_with_pouting_face_tone4'=>'1f64e-1f3fe','person_with_pouting_face_tone5'=>'1f64e-1f3ff','peru'=>'1f1f5-1f1ea','philippines'=>'1f1f5-1f1ed','phone'=>'260e','pick'=>'26cf','pig'=>'1f437','pig2'=>'1f416','pig_nose'=>'1f43d','pill'=>'1f48a','pineapple'=>'1f34d','ping_pong'=>'1f3d3','pisces'=>'2653','pitcairn_islands'=>'1f1f5-1f1f3','pizza'=>'1f355','place_of_worship'=>'1f6d0','plate_with_cutlery'=>'1f37d','play_or_pause_button'=>'23ef','play_pause'=>'23ef','point_down'=>'1f447','point_down_tone1'=>'1f447-1f3fb','point_down_tone2'=>'1f447-1f3fc','point_down_tone3'=>'1f447-1f3fd','point_down_tone4'=>'1f447-1f3fe','point_down_tone5'=>'1f447-1f3ff','point_left'=>'1f448','point_left_tone1'=>'1f448-1f3fb','point_left_tone2'=>'1f448-1f3fc','point_left_tone3'=>'1f448-1f3fd','point_left_tone4'=>'1f448-1f3fe','point_left_tone5'=>'1f448-1f3ff','point_right'=>'1f449','point_right_tone1'=>'1f449-1f3fb','point_right_tone2'=>'1f449-1f3fc','point_right_tone3'=>'1f449-1f3fd','point_right_tone4'=>'1f449-1f3fe','point_right_tone5'=>'1f449-1f3ff','point_up'=>'261d','point_up_2'=>'1f446','point_up_2_tone1'=>'1f446-1f3fb','point_up_2_tone2'=>'1f446-1f3fc','point_up_2_tone3'=>'1f446-1f3fd','point_up_2_tone4'=>'1f446-1f3fe','point_up_2_tone5'=>'1f446-1f3ff','point_up_tone1'=>'261d-1f3fb','point_up_tone2'=>'261d-1f3fc','point_up_tone3'=>'261d-1f3fd','point_up_tone4'=>'261d-1f3fe','point_up_tone5'=>'261d-1f3ff','poland'=>'1f1f5-1f1f1','police_car'=>'1f693','policeman'=>'1f46e','poodle'=>'1f429','poop'=>'1f4a9','popcorn'=>'1f37f','portugal'=>'1f1f5-1f1f9','post_office'=>'1f3e3','postal_horn'=>'1f4ef','postbox'=>'1f4ee','potable_water'=>'1f6b0','potato'=>'1f954','pouch'=>'1f45d','poultry_leg'=>'1f357','pound'=>'1f4b7','pout'=>'1f621','pouting_cat'=>'1f63e','pouting_woman'=>'1f64e','pray'=>'1f64f','pray_tone1'=>'1f64f-1f3fb','pray_tone2'=>'1f64f-1f3fc','pray_tone3'=>'1f64f-1f3fd','pray_tone4'=>'1f64f-1f3fe','pray_tone5'=>'1f64f-1f3ff','prayer_beads'=>'1f4ff','pregnant_woman'=>'1f930','pregnant_woman_tone1'=>'1f930-1f3fb','pregnant_woman_tone2'=>'1f930-1f3fc','pregnant_woman_tone3'=>'1f930-1f3fd','pregnant_woman_tone4'=>'1f930-1f3fe','pregnant_woman_tone5'=>'1f930-1f3ff','previous_track_button'=>'23ee','prince'=>'1f934','prince_tone1'=>'1f934-1f3fb','prince_tone2'=>'1f934-1f3fc','prince_tone3'=>'1f934-1f3fd','prince_tone4'=>'1f934-1f3fe','prince_tone5'=>'1f934-1f3ff','princess'=>'1f478','princess_tone1'=>'1f478-1f3fb','princess_tone2'=>'1f478-1f3fc','princess_tone3'=>'1f478-1f3fd','princess_tone4'=>'1f478-1f3fe','princess_tone5'=>'1f478-1f3ff','printer'=>'1f5a8','projector'=>'1f4fd','puerto_rico'=>'1f1f5-1f1f7','punch'=>'1f44a','punch_tone1'=>'1f44a-1f3fb','punch_tone2'=>'1f44a-1f3fc','punch_tone3'=>'1f44a-1f3fd','punch_tone4'=>'1f44a-1f3fe','punch_tone5'=>'1f44a-1f3ff','purple_heart'=>'1f49c','purse'=>'1f45b','pushpin'=>'1f4cc','put_litter_in_its_place'=>'1f6ae','qatar'=>'1f1f6-1f1e6','question'=>'2753','rabbit'=>'1f430','rabbit2'=>'1f407','race_car'=>'1f3ce','racehorse'=>'1f40e','racing_car'=>'1f3ce','radio'=>'1f4fb','radio_button'=>'1f518','radioactive'=>'2622','rage'=>'1f621','railway_car'=>'1f683','railway_track'=>'1f6e4','rainbow'=>'1f308','rainbow_flag'=>'1f3f3-1f308','raised_back_of_hand'=>'1f91a','raised_back_of_hand_tone1'=>'1f91a-1f3fb','raised_back_of_hand_tone2'=>'1f91a-1f3fc','raised_back_of_hand_tone3'=>'1f91a-1f3fd','raised_back_of_hand_tone4'=>'1f91a-1f3fe','raised_back_of_hand_tone5'=>'1f91a-1f3ff','raised_hand'=>'270b','raised_hand_tone1'=>'270b-1f3fb','raised_hand_tone2'=>'270b-1f3fc','raised_hand_tone3'=>'270b-1f3fd','raised_hand_tone4'=>'270b-1f3fe','raised_hand_tone5'=>'270b-1f3ff','raised_hand_with_fingers_splayed'=>'1f590','raised_hands'=>'1f64c','raised_hands_tone1'=>'1f64c-1f3fb','raised_hands_tone2'=>'1f64c-1f3fc','raised_hands_tone3'=>'1f64c-1f3fd','raised_hands_tone4'=>'1f64c-1f3fe','raised_hands_tone5'=>'1f64c-1f3ff','raising_hand'=>'1f64b','raising_hand_tone1'=>'1f64b-1f3fb','raising_hand_tone2'=>'1f64b-1f3fc','raising_hand_tone3'=>'1f64b-1f3fd','raising_hand_tone4'=>'1f64b-1f3fe','raising_hand_tone5'=>'1f64b-1f3ff','raising_hand_woman'=>'1f64b','ram'=>'1f40f','ramen'=>'1f35c','rat'=>'1f400','record_button'=>'23fa','recycle'=>'267b','red_car'=>'1f697','red_circle'=>'1f534','regional_indicator_a'=>'1f1e6','regional_indicator_b'=>'1f1e7','regional_indicator_c'=>'1f1e8','regional_indicator_d'=>'1f1e9','regional_indicator_e'=>'1f1ea','regional_indicator_f'=>'1f1eb','regional_indicator_g'=>'1f1ec','regional_indicator_h'=>'1f1ed','regional_indicator_i'=>'1f1ee','regional_indicator_j'=>'1f1ef','regional_indicator_k'=>'1f1f0','regional_indicator_l'=>'1f1f1','regional_indicator_m'=>'1f1f2','regional_indicator_n'=>'1f1f3','regional_indicator_o'=>'1f1f4','regional_indicator_p'=>'1f1f5','regional_indicator_q'=>'1f1f6','regional_indicator_r'=>'1f1f7','regional_indicator_s'=>'1f1f8','regional_indicator_t'=>'1f1f9','regional_indicator_u'=>'1f1fa','regional_indicator_v'=>'1f1fb','regional_indicator_w'=>'1f1fc','regional_indicator_x'=>'1f1fd','regional_indicator_y'=>'1f1fe','regional_indicator_z'=>'1f1ff','registered'=>'00ae','relaxed'=>'263a','relieved'=>'1f60c','reminder_ribbon'=>'1f397','repeat'=>'1f501','repeat_one'=>'1f502','rescue_worker_helmet'=>'26d1','restroom'=>'1f6bb','reunion'=>'1f1f7-1f1ea','revolving_hearts'=>'1f49e','rewind'=>'23ea','rhino'=>'1f98f','ribbon'=>'1f380','rice'=>'1f35a','rice_ball'=>'1f359','rice_cracker'=>'1f358','rice_scene'=>'1f391','right_anger_bubble'=>'1f5ef','right_facing_fist'=>'1f91c','right_facing_fist_tone1'=>'1f91c-1f3fb','right_facing_fist_tone2'=>'1f91c-1f3fc','right_facing_fist_tone3'=>'1f91c-1f3fd','right_facing_fist_tone4'=>'1f91c-1f3fe','right_facing_fist_tone5'=>'1f91c-1f3ff','ring'=>'1f48d','robot'=>'1f916','rocket'=>'1f680','rofl'=>'1f923','roll_eyes'=>'1f644','roller_coaster'=>'1f3a2','rolling_eyes'=>'1f644','romania'=>'1f1f7-1f1f4','rooster'=>'1f413','rose'=>'1f339','rosette'=>'1f3f5','rotating_light'=>'1f6a8','round_pushpin'=>'1f4cd','rowboat'=>'1f6a3','rowboat_tone1'=>'1f6a3-1f3fb','rowboat_tone2'=>'1f6a3-1f3fc','rowboat_tone3'=>'1f6a3-1f3fd','rowboat_tone4'=>'1f6a3-1f3fe','rowboat_tone5'=>'1f6a3-1f3ff','rowing_man'=>'1f6a3','ru'=>'1f1f7-1f1fa','rugby_football'=>'1f3c9','runner'=>'1f3c3','runner_tone1'=>'1f3c3-1f3fb','runner_tone2'=>'1f3c3-1f3fc','runner_tone3'=>'1f3c3-1f3fd','runner_tone4'=>'1f3c3-1f3fe','runner_tone5'=>'1f3c3-1f3ff','running'=>'1f3c3','running_man'=>'1f3c3','running_shirt_with_sash'=>'1f3bd','rwanda'=>'1f1f7-1f1fc','sa'=>'1f202','sagittarius'=>'2650','sailboat'=>'26f5','sake'=>'1f376','salad'=>'1f957','samoa'=>'1f1fc-1f1f8','san_marino'=>'1f1f8-1f1f2','sandal'=>'1f461','santa'=>'1f385','santa_tone1'=>'1f385-1f3fb','santa_tone2'=>'1f385-1f3fc','santa_tone3'=>'1f385-1f3fd','santa_tone4'=>'1f385-1f3fe','santa_tone5'=>'1f385-1f3ff','sao_tome_principe'=>'1f1f8-1f1f9','satellite'=>'1f4e1','satellite_orbital'=>'1f6f0','satisfied'=>'1f606','saudi_arabia'=>'1f1f8-1f1e6','saxophone'=>'1f3b7','scales'=>'2696','school'=>'1f3eb','school_satchel'=>'1f392','scissors'=>'2702','scooter'=>'1f6f4','scorpion'=>'1f982','scorpius'=>'264f','scream'=>'1f631','scream_cat'=>'1f640','scroll'=>'1f4dc','seat'=>'1f4ba','second_place'=>'1f948','secret'=>'3299','see_no_evil'=>'1f648','seedling'=>'1f331','selfie'=>'1f933','selfie_tone1'=>'1f933-1f3fb','selfie_tone2'=>'1f933-1f3fc','selfie_tone3'=>'1f933-1f3fd','selfie_tone4'=>'1f933-1f3fe','selfie_tone5'=>'1f933-1f3ff','senegal'=>'1f1f8-1f1f3','serbia'=>'1f1f7-1f1f8','seven'=>'0037-20e3','seychelles'=>'1f1f8-1f1e8','shallow_pan_of_food'=>'1f958','shamrock'=>'2618','shark'=>'1f988','shaved_ice'=>'1f367','sheep'=>'1f411','shell'=>'1f41a','shield'=>'1f6e1','shinto_shrine'=>'26e9','ship'=>'1f6a2','shirt'=>'1f455','shit'=>'1f4a9','shoe'=>'1f45e','shopping'=>'1f6cd','shopping_bags'=>'1f6cd','shopping_cart'=>'1f6d2','shower'=>'1f6bf','shrimp'=>'1f990','shrug'=>'1f937','shrug_tone1'=>'1f937-1f3fb','shrug_tone2'=>'1f937-1f3fc','shrug_tone3'=>'1f937-1f3fd','shrug_tone4'=>'1f937-1f3fe','shrug_tone5'=>'1f937-1f3ff','sierra_leone'=>'1f1f8-1f1f1','signal_strength'=>'1f4f6','singapore'=>'1f1f8-1f1ec','sint_maarten'=>'1f1f8-1f1fd','six'=>'0036-20e3','six_pointed_star'=>'1f52f','ski'=>'1f3bf','skier'=>'26f7','skull'=>'1f480','skull_and_crossbones'=>'2620','skull_crossbones'=>'2620','sleeping'=>'1f634','sleeping_accommodation'=>'1f6cc','sleeping_bed'=>'1f6cc','sleepy'=>'1f62a','slight_frown'=>'1f641','slight_smile'=>'1f642','slightly_frowning_face'=>'1f641','slightly_smiling_face'=>'1f642','slot_machine'=>'1f3b0','slovakia'=>'1f1f8-1f1f0','slovenia'=>'1f1f8-1f1ee','small_airplane'=>'1f6e9','small_blue_diamond'=>'1f539','small_orange_diamond'=>'1f538','small_red_triangle'=>'1f53a','small_red_triangle_down'=>'1f53b','smile'=>'1f604','smile_cat'=>'1f638','smiley'=>'1f603','smiley_cat'=>'1f63a','smiling_imp'=>'1f608','smirk'=>'1f60f','smirk_cat'=>'1f63c','smoking'=>'1f6ac','snail'=>'1f40c','snake'=>'1f40d','sneezing_face'=>'1f927','snowboarder'=>'1f3c2','snowflake'=>'2744','snowman'=>'26c4','snowman2'=>'2603','snowman_with_snow'=>'2603','sob'=>'1f62d','soccer'=>'26bd','solomon_islands'=>'1f1f8-1f1e7','somalia'=>'1f1f8-1f1f4','soon'=>'1f51c','sos'=>'1f198','sound'=>'1f509','south_africa'=>'1f1ff-1f1e6','south_georgia_south_sandwich_islands'=>'1f1ec-1f1f8','south_sudan'=>'1f1f8-1f1f8','space_invader'=>'1f47e','spades'=>'2660','spaghetti'=>'1f35d','sparkle'=>'2747','sparkler'=>'1f387','sparkles'=>'2728','sparkling_heart'=>'1f496','speak_no_evil'=>'1f64a','speaker'=>'1f508','speaking_head'=>'1f5e3','speech_balloon'=>'1f4ac','speech_left'=>'1f5e8','speedboat'=>'1f6a4','spider'=>'1f577','spider_web'=>'1f578','spiral_calendar'=>'1f5d3','spiral_notepad'=>'1f5d2','spoon'=>'1f944','spy'=>'1f575','spy_tone1'=>'1f575-1f3fb','spy_tone2'=>'1f575-1f3fc','spy_tone3'=>'1f575-1f3fd','spy_tone4'=>'1f575-1f3fe','spy_tone5'=>'1f575-1f3ff','squid'=>'1f991','sri_lanka'=>'1f1f1-1f1f0','st_barthelemy'=>'1f1e7-1f1f1','st_helena'=>'1f1f8-1f1ed','st_kitts_nevis'=>'1f1f0-1f1f3','st_lucia'=>'1f1f1-1f1e8','st_pierre_miquelon'=>'1f1f5-1f1f2','st_vincent_grenadines'=>'1f1fb-1f1e8','stadium'=>'1f3df','star'=>'2b50','star2'=>'1f31f','star_and_crescent'=>'262a','star_of_david'=>'2721','stars'=>'1f320','station'=>'1f689','statue_of_liberty'=>'1f5fd','steam_locomotive'=>'1f682','stew'=>'1f372','stop_button'=>'23f9','stopwatch'=>'23f1','straight_ruler'=>'1f4cf','strawberry'=>'1f353','stuck_out_tongue'=>'1f61b','stuck_out_tongue_closed_eyes'=>'1f61d','stuck_out_tongue_winking_eye'=>'1f61c','studio_microphone'=>'1f399','stuffed_flatbread'=>'1f959','sudan'=>'1f1f8-1f1e9','sun_behind_large_cloud'=>'1f325','sun_behind_rain_cloud'=>'1f326','sun_behind_small_cloud'=>'1f324','sun_with_face'=>'1f31e','sunflower'=>'1f33b','sunglasses'=>'1f60e','sunny'=>'2600','sunrise'=>'1f305','sunrise_over_mountains'=>'1f304','surfer'=>'1f3c4','surfer_tone1'=>'1f3c4-1f3fb','surfer_tone2'=>'1f3c4-1f3fc','surfer_tone3'=>'1f3c4-1f3fd','surfer_tone4'=>'1f3c4-1f3fe','surfer_tone5'=>'1f3c4-1f3ff','surfing_man'=>'1f3c4','suriname'=>'1f1f8-1f1f7','sushi'=>'1f363','suspension_railway'=>'1f69f','swaziland'=>'1f1f8-1f1ff','sweat'=>'1f613','sweat_drops'=>'1f4a6','sweat_smile'=>'1f605','sweden'=>'1f1f8-1f1ea','sweet_potato'=>'1f360','swimmer'=>'1f3ca','swimmer_tone1'=>'1f3ca-1f3fb','swimmer_tone2'=>'1f3ca-1f3fc','swimmer_tone3'=>'1f3ca-1f3fd','swimmer_tone4'=>'1f3ca-1f3fe','swimmer_tone5'=>'1f3ca-1f3ff','swimming_man'=>'1f3ca','switzerland'=>'1f1e8-1f1ed','symbols'=>'1f523','synagogue'=>'1f54d','syria'=>'1f1f8-1f1fe','syringe'=>'1f489','taco'=>'1f32e','tada'=>'1f389','taiwan'=>'1f1f9-1f1fc','tajikistan'=>'1f1f9-1f1ef','tanabata_tree'=>'1f38b','tangerine'=>'1f34a','tanzania'=>'1f1f9-1f1ff','taurus'=>'2649','taxi'=>'1f695','tea'=>'1f375','telephone'=>'260e','telephone_receiver'=>'1f4de','telescope'=>'1f52d','tennis'=>'1f3be','tent'=>'26fa','thailand'=>'1f1f9-1f1ed','thermometer'=>'1f321','thermometer_face'=>'1f912','thinking'=>'1f914','third_place'=>'1f949','thought_balloon'=>'1f4ad','three'=>'0033-20e3','thumbsdown'=>'1f44e','thumbsdown_tone1'=>'1f44e-1f3fb','thumbsdown_tone2'=>'1f44e-1f3fc','thumbsdown_tone3'=>'1f44e-1f3fd','thumbsdown_tone4'=>'1f44e-1f3fe','thumbsdown_tone5'=>'1f44e-1f3ff','thumbsup'=>'1f44d','thumbsup_tone1'=>'1f44d-1f3fb','thumbsup_tone2'=>'1f44d-1f3fc','thumbsup_tone3'=>'1f44d-1f3fd','thumbsup_tone4'=>'1f44d-1f3fe','thumbsup_tone5'=>'1f44d-1f3ff','thunder_cloud_rain'=>'26c8','ticket'=>'1f3ab','tickets'=>'1f39f','tiger'=>'1f42f','tiger2'=>'1f405','timer'=>'23f2','timer_clock'=>'23f2','timor_leste'=>'1f1f9-1f1f1','tipping_hand_woman'=>'1f481','tired_face'=>'1f62b','tm'=>'2122','togo'=>'1f1f9-1f1ec','toilet'=>'1f6bd','tokelau'=>'1f1f9-1f1f0','tokyo_tower'=>'1f5fc','tomato'=>'1f345','tone1'=>'1f3fb','tone2'=>'1f3fc','tone3'=>'1f3fd','tone4'=>'1f3fe','tone5'=>'1f3ff','tonga'=>'1f1f9-1f1f4','tongue'=>'1f445','tools'=>'1f6e0','top'=>'1f51d','tophat'=>'1f3a9','tornado'=>'1f32a','tr'=>'1f1f9-1f1f7','track_next'=>'23ed','track_previous'=>'23ee','trackball'=>'1f5b2','tractor'=>'1f69c','traffic_light'=>'1f6a5','train'=>'1f68b','train2'=>'1f686','tram'=>'1f68a','triangular_flag_on_post'=>'1f6a9','triangular_ruler'=>'1f4d0','trident'=>'1f531','trinidad_tobago'=>'1f1f9-1f1f9','triumph'=>'1f624','trolleybus'=>'1f68e','trophy'=>'1f3c6','tropical_drink'=>'1f379','tropical_fish'=>'1f420','truck'=>'1f69a','trumpet'=>'1f3ba','tshirt'=>'1f455','tulip'=>'1f337','tumbler_glass'=>'1f943','tunisia'=>'1f1f9-1f1f3','turkey'=>'1f983','turkmenistan'=>'1f1f9-1f1f2','turks_caicos_islands'=>'1f1f9-1f1e8','turtle'=>'1f422','tuvalu'=>'1f1f9-1f1fb','tv'=>'1f4fa','twisted_rightwards_arrows'=>'1f500','two'=>'0032-20e3','two_hearts'=>'1f495','two_men_holding_hands'=>'1f46c','two_women_holding_hands'=>'1f46d','u5272'=>'1f239','u5408'=>'1f234','u55b6'=>'1f23a','u6307'=>'1f22f','u6708'=>'1f237','u6709'=>'1f236','u6e80'=>'1f235','u7121'=>'1f21a','u7533'=>'1f238','u7981'=>'1f232','u7a7a'=>'1f233','uganda'=>'1f1fa-1f1ec','uk'=>'1f1ec-1f1e7','ukraine'=>'1f1fa-1f1e6','umbrella'=>'2614','umbrella2'=>'2602','unamused'=>'1f612','underage'=>'1f51e','unicorn'=>'1f984','united_arab_emirates'=>'1f1e6-1f1ea','unlock'=>'1f513','up'=>'1f199','upside_down'=>'1f643','upside_down_face'=>'1f643','urn'=>'26b1','uruguay'=>'1f1fa-1f1fe','us'=>'1f1fa-1f1f8','us_virgin_islands'=>'1f1fb-1f1ee','uzbekistan'=>'1f1fa-1f1ff','v'=>'270c','v_tone1'=>'270c-1f3fb','v_tone2'=>'270c-1f3fc','v_tone3'=>'270c-1f3fd','v_tone4'=>'270c-1f3fe','v_tone5'=>'270c-1f3ff','vanuatu'=>'1f1fb-1f1fa','vatican_city'=>'1f1fb-1f1e6','venezuela'=>'1f1fb-1f1ea','vertical_traffic_light'=>'1f6a6','vhs'=>'1f4fc','vibration_mode'=>'1f4f3','video_camera'=>'1f4f9','video_game'=>'1f3ae','vietnam'=>'1f1fb-1f1f3','violin'=>'1f3bb','virgo'=>'264d','volcano'=>'1f30b','volleyball'=>'1f3d0','vs'=>'1f19a','vulcan'=>'1f596','vulcan_salute'=>'1f596','vulcan_tone1'=>'1f596-1f3fb','vulcan_tone2'=>'1f596-1f3fc','vulcan_tone3'=>'1f596-1f3fd','vulcan_tone4'=>'1f596-1f3fe','vulcan_tone5'=>'1f596-1f3ff','walking'=>'1f6b6','walking_man'=>'1f6b6','walking_tone1'=>'1f6b6-1f3fb','walking_tone2'=>'1f6b6-1f3fc','walking_tone3'=>'1f6b6-1f3fd','walking_tone4'=>'1f6b6-1f3fe','walking_tone5'=>'1f6b6-1f3ff','wallis_futuna'=>'1f1fc-1f1eb','waning_crescent_moon'=>'1f318','waning_gibbous_moon'=>'1f316','warning'=>'26a0','wastebasket'=>'1f5d1','watch'=>'231a','water_buffalo'=>'1f403','water_polo'=>'1f93d','water_polo_tone1'=>'1f93d-1f3fb','water_polo_tone2'=>'1f93d-1f3fc','water_polo_tone3'=>'1f93d-1f3fd','water_polo_tone4'=>'1f93d-1f3fe','water_polo_tone5'=>'1f93d-1f3ff','watermelon'=>'1f349','wave'=>'1f44b','wave_tone1'=>'1f44b-1f3fb','wave_tone2'=>'1f44b-1f3fc','wave_tone3'=>'1f44b-1f3fd','wave_tone4'=>'1f44b-1f3fe','wave_tone5'=>'1f44b-1f3ff','wavy_dash'=>'3030','waxing_crescent_moon'=>'1f312','waxing_gibbous_moon'=>'1f314','wc'=>'1f6be','weary'=>'1f629','wedding'=>'1f492','weight_lifting_man'=>'1f3cb','western_sahara'=>'1f1ea-1f1ed','whale'=>'1f433','whale2'=>'1f40b','wheel_of_dharma'=>'2638','wheelchair'=>'267f','white_check_mark'=>'2705','white_circle'=>'26aa','white_flag'=>'1f3f3','white_flower'=>'1f4ae','white_large_square'=>'2b1c','white_medium_small_square'=>'25fd','white_medium_square'=>'25fb','white_small_square'=>'25ab','white_square_button'=>'1f533','white_sun_cloud'=>'1f325','white_sun_rain_cloud'=>'1f326','white_sun_small_cloud'=>'1f324','wilted_rose'=>'1f940','wind_blowing_face'=>'1f32c','wind_chime'=>'1f390','wind_face'=>'1f32c','wine_glass'=>'1f377','wink'=>'1f609','wolf'=>'1f43a','woman'=>'1f469','woman_tone1'=>'1f469-1f3fb','woman_tone2'=>'1f469-1f3fc','woman_tone3'=>'1f469-1f3fd','woman_tone4'=>'1f469-1f3fe','woman_tone5'=>'1f469-1f3ff','womans_clothes'=>'1f45a','womans_hat'=>'1f452','womens'=>'1f6ba','world_map'=>'1f5fa','worried'=>'1f61f','wrench'=>'1f527','wrestlers'=>'1f93c','wrestlers_tone1'=>'1f93c-1f3fb','wrestlers_tone2'=>'1f93c-1f3fc','wrestlers_tone3'=>'1f93c-1f3fd','wrestlers_tone4'=>'1f93c-1f3fe','wrestlers_tone5'=>'1f93c-1f3ff','writing_hand'=>'270d','writing_hand_tone1'=>'270d-1f3fb','writing_hand_tone2'=>'270d-1f3fc','writing_hand_tone3'=>'270d-1f3fd','writing_hand_tone4'=>'270d-1f3fe','writing_hand_tone5'=>'270d-1f3ff','x'=>'274c','yellow_heart'=>'1f49b','yemen'=>'1f1fe-1f1ea','yen'=>'1f4b4','yin_yang'=>'262f','yum'=>'1f60b','zambia'=>'1f1ff-1f1f2','zap'=>'26a1','zero'=>'0030-20e3','zimbabwe'=>'1f1ff-1f1fc','zipper_mouth'=>'1f910','zipper_mouth_face'=>'1f910','zzz'=>'1f4a4');
+	protected $unicodeRegexp = '((?:[#*0-9]\\xEF\\xB8\\x8F(?:\\xE2\\x83\\xA3)?|\\xC2[\\xA9\\xAE]\\xEF\\xB8\\x8F|\\xE2(?:\\x80\\xBC\\xEF\\xB8\\x8F|\\x81\\x89\\xEF\\xB8\\x8F|\\x84[\\xA2\\xB9]\\xEF\\xB8\\x8F|\\x86[\\x94-\\x99\\xA9\\xAA]\\xEF\\xB8\\x8F|\\x8C(?:[\\x9A\\x9B](?:\\xEF\\xB8\\x8F)?|\\xA8\\xEF\\xB8\\x8F)|\\x8F(?:[\\x8F\\xAD-\\xAF\\xB1\\xB2\\xB8-\\xBA]\\xEF\\xB8\\x8F|[\\xA9-\\xAC\\xB0\\xB3](?:\\xEF\\xB8\\x8F)?)|\\x93\\x82\\xEF\\xB8\\x8F|\\x96[\\xAA\\xAB\\xB6]\\xEF\\xB8\\x8F|\\x97(?:[\\x80\\xBB\\xBC]\\xEF\\xB8\\x8F|[\\xBD\\xBE](?:\\xEF\\xB8\\x8F)?)|\\x98(?:[\\x80-\\x84\\x8E\\x91\\x98\\xA0\\xA2\\xA3\\xA6\\xAA\\xAE\\xAF\\xB8-\\xBA]\\xEF\\xB8\\x8F|[\\x94\\x95](?:\\xEF\\xB8\\x8F)?|\\x9D(?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF]))|\\x99(?:[\\x88-\\x93\\xBF](?:\\xEF\\xB8\\x8F)?|[\\xA0\\xA3\\xA5\\xA6\\xA8\\xBB]\\xEF\\xB8\\x8F)|\\x9A(?:[\\x92\\x94\\x96\\x97\\x99\\x9B\\x9C\\xA0\\xB0\\xB1]\\xEF\\xB8\\x8F|[\\x93\\xA1\\xAA\\xAB\\xBD\\xBE](?:\\xEF\\xB8\\x8F)?)|\\x9B(?:[\\x84\\x85\\x8E\\x94\\xAA\\xB2\\xB3\\xB5\\xBA\\xBD](?:\\xEF\\xB8\\x8F)?|[\\x88\\x8F\\x91\\x93\\xA9\\xB0\\xB1\\xB4\\xB7\\xB8]\\xEF\\xB8\\x8F|\\xB9(?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF]))|\\x9C(?:[\\x82\\x88\\x89\\x8F\\x92\\x94\\x96\\x9D\\xA1\\xB3\\xB4]\\xEF\\xB8\\x8F|[\\x85\\xA8](?:\\xEF\\xB8\\x8F)?|[\\x8A\\x8B](?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF])?|[\\x8C\\x8D](?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF]))|\\x9D(?:[\\x84\\x87\\xA3\\xA4]\\xEF\\xB8\\x8F|[\\x8C\\x8E\\x93-\\x95\\x97](?:\\xEF\\xB8\\x8F)?)|\\x9E(?:[\\x95-\\x97\\xB0\\xBF](?:\\xEF\\xB8\\x8F)?|\\xA1\\xEF\\xB8\\x8F)|\\xA4[\\xB4\\xB5]\\xEF\\xB8\\x8F|\\xAC(?:[\\x85-\\x87]\\xEF\\xB8\\x8F|[\\x9B\\x9C](?:\\xEF\\xB8\\x8F)?)|\\xAD[\\x90\\x95](?:\\xEF\\xB8\\x8F)?)|\\xE3(?:\\x80[\\xB0\\xBD]|\\x8A[\\x97\\x99])\\xEF\\xB8\\x8F|\\xF0\\x9F(?:\\x80\\x84(?:\\xEF\\xB8\\x8F)?|\\x83\\x8F(?:\\xEF\\xB8\\x8F)?|\\x85[\\xB0\\xB1\\xBE\\xBF]\\xEF\\xB8\\x8F|\\x86[\\x8E\\x91-\\x9A](?:\\xEF\\xB8\\x8F)?|\\x87[\\xA6-\\xBF](?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x87[\\xA6-\\xBF])?|\\x88(?:[\\x81\\x9A\\xAF\\xB2-\\xB6\\xB8-\\xBA](?:\\xEF\\xB8\\x8F)?|[\\x82\\xB7]\\xEF\\xB8\\x8F)|\\x89[\\x90\\x91](?:\\xEF\\xB8\\x8F)?|\\x8C(?:[\\x80-\\xA0\\xAD-\\xB5\\xB7-\\xBF](?:\\xEF\\xB8\\x8F)?|[\\xA1\\xA4-\\xAC\\xB6]\\xEF\\xB8\\x8F)|\\x8D(?:[\\x80-\\xBC\\xBE\\xBF](?:\\xEF\\xB8\\x8F)?|\\xBD\\xEF\\xB8\\x8F)|\\x8E(?:[\\x80-\\x84\\x86-\\x93\\xA0-\\xBF](?:\\xEF\\xB8\\x8F)?|[\\x96\\x97\\x99-\\x9B\\x9E\\x9F]\\xEF\\xB8\\x8F|\\x85(?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF])?)|\\x8F(?:[\\x80-\\x82\\x85-\\x89\\x8F-\\x93\\xA0-\\xB0\\xB4\\xB8-\\xBF](?:\\xEF\\xB8\\x8F)?|[\\x83\\x84\\x8A](?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF])?|[\\x8C-\\x8E\\x94-\\x9F\\xB3\\xB5\\xB7]\\xEF\\xB8\\x8F|\\x8B(?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF]))|\\x90(?:[\\x80-\\xBE](?:\\xEF\\xB8\\x8F)?|\\xBF\\xEF\\xB8\\x8F)|\\x91(?:[\\x80\\x84\\x85\\x91-\\xA5\\xAA-\\xAD\\xAF\\xB9-\\xBB\\xBD-\\xBF](?:\\xEF\\xB8\\x8F)?|[\\x82\\x83\\x86-\\x90\\xA6\\xA7\\xAE\\xB0-\\xB8\\xBC](?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF])?|\\x81(?:\\xE2\\x80\\x8D\\xF0\\x9F\\x97\\xA8|\\xEF\\xB8\\x8F)|\\xA8(?:\\xE2\\x80\\x8D(?:\\xE2\\x9D\\xA4\\xEF\\xB8\\x8F\\xE2\\x80\\x8D\\xF0\\x9F(?:\\x92\\x8B\\xE2\\x80\\x8D\\xF0\\x9F)?\\x91\\xA8|\\xF0\\x9F\\x91[\\xA8\\xA9]\\xE2\\x80\\x8D\\xF0\\x9F\\x91(?:\\xA6(?:\\xE2\\x80\\x8D\\xF0\\x9F\\x91\\xA6)?|\\xA7(?:\\xE2\\x80\\x8D\\xF0\\x9F\\x91[\\xA6\\xA7])?))|\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF])?|\\xA9(?:\\xE2\\x80\\x8D(?:\\xE2\\x9D\\xA4\\xEF\\xB8\\x8F\\xE2\\x80\\x8D\\xF0\\x9F(?:\\x92\\x8B\\xE2\\x80\\x8D\\xF0\\x9F)?\\x91[\\xA8\\xA9]|\\xF0\\x9F\\x91\\xA9\\xE2\\x80\\x8D\\xF0\\x9F\\x91(?:\\xA6(?:\\xE2\\x80\\x8D\\xF0\\x9F\\x91\\xA6)?|\\xA7(?:\\xE2\\x80\\x8D\\xF0\\x9F\\x91[\\xA6\\xA7])?))|\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF])?)|\\x92(?:[\\x80\\x84\\x88-\\xA9\\xAB-\\xBF](?:\\xEF\\xB8\\x8F)?|[\\x81-\\x83\\x85-\\x87\\xAA](?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF])?)|\\x93(?:[\\x80-\\xBC\\xBF](?:\\xEF\\xB8\\x8F)?|\\xBD\\xEF\\xB8\\x8F)|\\x94[\\x80-\\xBD](?:\\xEF\\xB8\\x8F)?|\\x95(?:[\\x89\\x8A\\xAF\\xB0\\xB3\\xB4\\xB6-\\xB9]\\xEF\\xB8\\x8F|[\\x8B-\\x8E\\x90-\\xA7](?:\\xEF\\xB8\\x8F)?|\\xB5(?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF])|\\xBA(?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF])?)|\\x96(?:[\\x87\\x8A-\\x8D\\xA5\\xA8\\xB1\\xB2\\xBC]\\xEF\\xB8\\x8F|[\\x95\\x96](?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF])?|\\x90(?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF])|\\xA4(?:\\xEF\\xB8\\x8F)?)|\\x97(?:[\\x82-\\x84\\x91-\\x93\\x9C-\\x9E\\xA1\\xA3\\xA8\\xAF\\xB3\\xBA]\\xEF\\xB8\\x8F|[\\xBB-\\xBF](?:\\xEF\\xB8\\x8F)?)|\\x98[\\x80-\\xBF](?:\\xEF\\xB8\\x8F)?|\\x99(?:[\\x80-\\x84\\x88-\\x8A](?:\\xEF\\xB8\\x8F)?|[\\x85-\\x87\\x8B-\\x8F](?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF])?)|\\x9A(?:[\\x80-\\xA2\\xA4-\\xB3\\xB7-\\xBF](?:\\xEF\\xB8\\x8F)?|[\\xA3\\xB4-\\xB6](?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF])?)|\\x9B(?:[\\x81-\\x85\\x8C\\x90-\\x92\\xAB\\xAC\\xB4-\\xB6](?:\\xEF\\xB8\\x8F)?|[\\x8B\\x8D-\\x8F\\xA0-\\xA5\\xA9\\xB0\\xB3]\\xEF\\xB8\\x8F|\\x80(?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF])?)|\\xA4(?:[\\x90-\\x97\\xA0-\\xA5\\xA7\\xBA](?:\\xEF\\xB8\\x8F)?|[\\x98-\\x9E\\xA6\\xB0\\xB3-\\xB9\\xBC-\\xBE](?:\\xEF\\xB8\\x8F|\\xF0\\x9F\\x8F[\\xBB-\\xBF])?)|\\xA5[\\x80-\\x85\\x87-\\x8B\\x90-\\x9E](?:\\xEF\\xB8\\x8F)?|\\xA6[\\x80-\\x91](?:\\xEF\\xB8\\x8F)?|\\xA7\\x80(?:\\xEF\\xB8\\x8F)?))(?!\\xEF\\xB8\\x8E))S';
+
+	public function parse($text, array $matches)
+	{
+		$this->parseAliases($text);
+		$this->parseAsciiEmoji($text);
+		$this->parseUnicodeEmoji($text);
+	}
+	protected function addTag($tagPos, $tagLen, $seq)
+	{
+		$this->parser->addSelfClosingTag($this->config['tagName'], $tagPos, $tagLen, 10)
+		             ->setAttribute($this->config['attrName'], $seq);
+	}
+	protected function getSequence($str)
+	{
+		$str = \str_replace("\xEF\xB8\x8F", '', \str_replace("\xE2\x80\x8D", '', $str));
+		$seq = array();
+		$i   = 0;
+		do
+		{
+			$cp = \ord($str[$i]);
+			if ($cp >= 0xF0)
+				$cp = ($cp << 18) + (\ord($str[++$i]) << 12) + (\ord($str[++$i]) << 6) + \ord($str[++$i]) - 0x3C82080;
+			elseif ($cp >= 0xE0)
+				$cp = ($cp << 12) + (\ord($str[++$i]) << 6) + \ord($str[++$i]) - 0xE2080;
+			elseif ($cp >= 0xC0)
+				$cp = ($cp << 6) + \ord($str[++$i]) - 0x3080;
+			$seq[] = \sprintf('%04x', $cp);
+		}
+		while (++$i < \strlen($str));
+		return \implode('-', $seq);
+	}
+	protected function parseAliases($text)
+	{
+		if (empty($this->config['aliases']))
+			return;
+		$matchPos = 0;
+		if (isset($this->config['aliasesQuickMatch']))
+		{
+			$matchPos = \strpos($text, $this->config['aliasesQuickMatch']);
+			if ($matchPos === \false)
+				return;
+		}
+		\preg_match_all($this->config['aliasesRegexp'], $text, $matches, \PREG_OFFSET_CAPTURE, $matchPos);
+		foreach ($matches[0] as $_8bb89e38)
+		{
+			list($alias, $tagPos) = $_8bb89e38;
+			if (isset($this->config['aliases'][$alias]))
+			{
+				$emoji = $this->config['aliases'][$alias];
+				$this->addTag($tagPos, \strlen($alias), $this->getSequence($emoji));
+			}
+		}
+	}
+	protected function parseAsciiEmoji($text)
+	{
+		$matchPos = \strpos($text, ':');
+		if ($matchPos === \false)
+			return;
+		\preg_match_all($this->asciiRegexp, $text, $matches, \PREG_OFFSET_CAPTURE, $matchPos);
+		foreach ($matches[0] as $_765c1971)
+		{
+			list($shortName, $tagPos) = $_765c1971;
+			$shortName = \substr($shortName, 1);
+			if (isset(self::$map[$shortName]))
+				$this->addTag($tagPos, 2 + \strlen($shortName), self::$map[$shortName]);
+		}
+	}
+	protected function parseUnicodeEmoji($text)
+	{
+		if (\strpos($text, "\xE2") === \false && \strpos($text, "\xEF") === \false && \strpos($text, "\xF0") === \false)
+			return;
+		\preg_match_all($this->unicodeRegexp, $text, $matches, \PREG_OFFSET_CAPTURE);
+		foreach ($matches[0] as $_e20330bd)
+		{
+			list($emoji, $tagPos) = $_e20330bd;
+			$this->addTag($tagPos, \strlen($emoji), $this->getSequence($emoji));
+		}
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Emoticons/Configurator.php
@@ -0,0 +1,136 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Emoticons;
+use ArrayAccess;
+use Countable;
+use Iterator;
+use s9e\TextFormatter\Configurator\Helpers\ConfigHelper;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+use s9e\TextFormatter\Configurator\Helpers\XPathHelper;
+use s9e\TextFormatter\Configurator\Items\Regexp;
+use s9e\TextFormatter\Configurator\JavaScript\RegexpConvertor;
+use s9e\TextFormatter\Configurator\Traits\CollectionProxy;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+use s9e\TextFormatter\Plugins\Emoticons\Configurator\EmoticonCollection;
+class Configurator extends ConfiguratorBase implements ArrayAccess, Countable, Iterator
+{
+	public function __call($methodName, $args)
+	{
+		return \call_user_func_array(array($this->collection, $methodName), $args);
+	}
+	public function offsetExists($offset)
+	{
+		return isset($this->collection[$offset]);
+	}
+	public function offsetGet($offset)
+	{
+		return $this->collection[$offset];
+	}
+	public function offsetSet($offset, $value)
+	{
+		$this->collection[$offset] = $value;
+	}
+	public function offsetUnset($offset)
+	{
+		unset($this->collection[$offset]);
+	}
+	public function count()
+	{
+		return \count($this->collection);
+	}
+	public function current()
+	{
+		return $this->collection->current();
+	}
+	public function key()
+	{
+		return $this->collection->key();
+	}
+	public function next()
+	{
+		return $this->collection->next();
+	}
+	public function rewind()
+	{
+		$this->collection->rewind();
+	}
+	public function valid()
+	{
+		return $this->collection->valid();
+	}
+	protected $collection;
+	public $notAfter = '';
+	public $notBefore = '';
+	public $notIfCondition;
+	protected $onDuplicateAction = 'replace';
+	protected $tagName = 'E';
+	protected function setUp()
+	{
+		$this->collection = new EmoticonCollection;
+		if (!$this->configurator->tags->exists($this->tagName))
+			$this->configurator->tags->add($this->tagName);
+	}
+	public function finalize()
+	{
+		$tag = $this->getTag();
+		if (!isset($tag->template))
+			$tag->template = $this->getTemplate();
+	}
+	public function asConfig()
+	{
+		if (!\count($this->collection))
+			return;
+		$codes = \array_keys(\iterator_to_array($this->collection));
+		$regexp = '/';
+		if ($this->notAfter !== '')
+			$regexp .= '(?<!' . $this->notAfter . ')';
+		$regexp .= RegexpBuilder::fromList($codes);
+		if ($this->notBefore !== '')
+			$regexp .= '(?!' . $this->notBefore . ')';
+		$regexp .= '/S';
+		if (\preg_match('/\\\\[pP](?>\\{\\^?\\w+\\}|\\w\\w?)/', $regexp))
+			$regexp .= 'u';
+		$regexp = \preg_replace('/(?<!\\\\)((?>\\\\\\\\)*)\\(\\?:/', '$1(?>', $regexp);
+		$config = array(
+			'quickMatch' => $this->quickMatch,
+			'regexp'     => $regexp,
+			'tagName'    => $this->tagName
+		);
+		if ($this->notAfter !== '')
+		{
+			$lpos = 6 + \strlen($this->notAfter);
+			$rpos = \strrpos($regexp, '/');
+			$jsRegexp = RegexpConvertor::toJS('/' . \substr($regexp, $lpos, $rpos - $lpos) . '/', \true);
+			$config['regexp'] = new Regexp($regexp);
+			$config['regexp']->setJS($jsRegexp);
+			$config['notAfter'] = new Regexp('/' . $this->notAfter . '/');
+		}
+		if ($this->quickMatch === \false)
+			$config['quickMatch'] = ConfigHelper::generateQuickMatchFromList($codes);
+		return $config;
+	}
+	public function getJSHints()
+	{
+		return array('EMOTICONS_NOT_AFTER' => (int) !empty($this->notAfter));
+	}
+	public function getTemplate()
+	{
+		$xsl = '<xsl:choose>';
+		if (!empty($this->notIfCondition))
+			$xsl .= '<xsl:when test="' . \htmlspecialchars($this->notIfCondition) . '"><xsl:value-of select="."/></xsl:when><xsl:otherwise><xsl:choose>';
+		foreach ($this->collection as $code => $template)
+			$xsl .= '<xsl:when test=".=' . \htmlspecialchars(XPathHelper::export($code)) . '">'
+			      . $template
+			      . '</xsl:when>';
+		$xsl .= '<xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>';
+		$xsl .= '</xsl:choose>';
+		if (!empty($this->notIfCondition))
+			$xsl .= '</xsl:otherwise></xsl:choose>';
+		return $xsl;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Emoticons/Configurator/EmoticonCollection.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Emoticons\Configurator;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Collections\NormalizedCollection;
+use s9e\TextFormatter\Configurator\Helpers\TemplateHelper;
+class EmoticonCollection extends NormalizedCollection
+{
+	protected $onDuplicateAction = 'replace';
+	public function normalizeValue($value)
+	{
+		return TemplateHelper::saveTemplate(TemplateHelper::loadTemplate($value));
+	}
+	protected function getAlreadyExistsException($key)
+	{
+		return new RuntimeException("Emoticon '" . $key . "' already exists");
+	}
+	protected function getNotExistException($key)
+	{
+		return new RuntimeException("Emoticon '" . $key . "' does not exist");
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Emoticons/Parser.js
@@ -0,0 +1,9 @@
+matches.forEach(function(m)
+{
+	if (HINT.EMOTICONS_NOT_AFTER && config.notAfter && m[0][1] && config.notAfter.test(text.charAt(m[0][1] - 1)))
+	{
+		return;
+	}
+
+	addSelfClosingTag(config.tagName, m[0][1], m[0][0].length);
+});
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Emoticons/Parser.php
@@ -0,0 +1,17 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Emoticons;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	public function parse($text, array $matches)
+	{
+		foreach ($matches as $m)
+			$this->parser->addSelfClosingTag($this->config['tagName'], $m[0][1], \strlen($m[0][0]));
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Escaper/Configurator.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Escaper;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class Configurator extends ConfiguratorBase
+{
+	protected $quickMatch = '\\';
+	protected $regexp;
+	protected $tagName = 'ESC';
+	public function escapeAll($bool = \true)
+	{
+		$this->regexp = ($bool) ? '/\\\\./su' : '/\\\\[-!#()*+.:<>@[\\\\\\]^_`{|}]/';
+	}
+	protected function setUp()
+	{
+		$this->escapeAll(\false);
+		$tag = $this->configurator->tags->add($this->tagName);
+		$tag->rules->disableAutoLineBreaks();
+		$tag->rules->ignoreTags();
+		$tag->rules->preventLineBreaks();
+		$tag->template = '<xsl:apply-templates/>';
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Escaper/Parser.js
@@ -0,0 +1,10 @@
+matches.forEach(function(m)
+{
+	addTagPair(
+		config.tagName,
+		m[0][1],
+		1,
+		m[0][1] + m[0][0].length,
+		0
+	);
+});
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Escaper/Parser.php
@@ -0,0 +1,23 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Escaper;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	public function parse($text, array $matches)
+	{
+		foreach ($matches as $m)
+			$this->parser->addTagPair(
+				$this->config['tagName'],
+				$m[0][1],
+				1,
+				$m[0][1] + \strlen($m[0][0]),
+				0
+			);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/FancyPants/Configurator.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\FancyPants;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class Configurator extends ConfiguratorBase
+{
+	protected $attrName = 'char';
+	protected $tagName = 'FP';
+	protected function setUp()
+	{
+		if (isset($this->configurator->tags[$this->tagName]))
+			return;
+		$tag = $this->configurator->tags->add($this->tagName);
+		$tag->attributes->add($this->attrName);
+		$tag->template
+			= '<xsl:value-of select="@' . \htmlspecialchars($this->attrName) . '"/>';
+	}
+	public function asConfig()
+	{
+		return array(
+			'attrName' => $this->attrName,
+			'tagName'  => $this->tagName
+		);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/FancyPants/Parser.js
@@ -0,0 +1,231 @@
+var attrName       = config.attrName,
+	hasSingleQuote = (text.indexOf("'") >= 0),
+	hasDoubleQuote = (text.indexOf('"') >= 0),
+	tagName        = config.tagName;
+
+parseSingleQuotes();
+parseSymbolsAfterDigits();
+parseSingleQuotePairs();
+parseDoubleQuotePairs();
+parseDashesAndEllipses();
+parseSymbolsInParentheses();
+parseNotEqualSign();
+parseGuillemets();
+
+/**
+* Add a fancy replacement tag
+*
+* @param  {!number} tagPos Position of the tag in the text
+* @param  {!number} tagLen Length of text consumed by the tag
+* @param  {!string} chr    Replacement character
+* @param  {number}  prio   Tag's priority
+* @return {!Tag}
+*/
+function addTag(tagPos, tagLen, chr, prio)
+{
+	var tag = addSelfClosingTag(tagName, tagPos, tagLen, prio || 0);
+	tag.setAttribute(attrName, chr);
+
+	return tag;
+}
+
+/**
+* Parse dashes and ellipses
+*
+* Does en dash –, em dash — and ellipsis …
+*/
+function parseDashesAndEllipses()
+{
+	if (text.indexOf('...') < 0 && text.indexOf('--') < 0)
+	{
+		return;
+	}
+
+	var chrs = {
+			'--'  : "\u2013",
+			'---' : "\u2014",
+			'...' : "\u2026"
+		},
+		regexp = /---?|\.\.\./g,
+		m;
+	while (m = regexp.exec(text))
+	{
+		addTag(+m['index'], m[0].length, chrs[m[0]]);
+	}
+}
+
+/**
+* Parse pairs of double quotes
+*
+* Does quote pairs “” -- must be done separately to handle nesting
+*/
+function parseDoubleQuotePairs()
+{
+	if (hasDoubleQuote)
+	{
+		parseQuotePairs('"', /(?:^|\W)".+?"(?!\w)/g, "\u201c", "\u201d");
+	}
+}
+
+/**
+* Parse guillemets-style quotation marks
+*/
+function parseGuillemets()
+{
+	if (text.indexOf('<<') < 0)
+	{
+		return;
+	}
+
+	var m, regexp = /<<( ?)(?! )[^\n<>]*?[^\n <>]\1>>(?!>)/g;
+	while (m = regexp.exec(text))
+	{
+		var left  = addTag(+m['index'],                   2, "\u00AB"),
+			right = addTag(+m['index'] + m[0].length - 2, 2, "\u00BB");
+
+		left.cascadeInvalidationTo(right);
+	}
+}
+
+/**
+* Parse the not equal sign
+*/
+function parseNotEqualSign()
+{
+	if (text.indexOf('!=') < 0)
+	{
+		return;
+	}
+
+	var m, regexp = /\b !=(?= \b)/g;
+	while (m = regexp.exec(text))
+	{
+		addTag(+m['index'] + 1, 2, "\u2260");
+	}
+}
+
+/**
+* Parse pairs of quotes
+*
+* @param {!string} q          ASCII quote character 
+* @param {!RegExp} regexp     Regexp used to identify quote pairs
+* @param {!string} leftQuote  Fancy replacement for left quote
+* @param {!string} rightQuote Fancy replacement for right quote
+*/
+function parseQuotePairs(q, regexp, leftQuote, rightQuote)
+{
+	var m;
+	while (m = regexp.exec(text))
+	{
+		var left  = addTag(+m['index'] + m[0].indexOf(q), 1, leftQuote),
+			right = addTag(+m['index'] + m[0].length - 1, 1, rightQuote);
+
+		// Cascade left tag's invalidation to the right so that if we skip the left quote,
+		// the right quote remains untouched
+		left.cascadeInvalidationTo(right);
+	}
+}
+
+/**
+* Parse pairs of single quotes
+*
+* Does quote pairs ‘’ must be done separately to handle nesting
+*/
+function parseSingleQuotePairs()
+{
+	if (hasSingleQuote)
+	{
+		parseQuotePairs("'", /(?:^|\W)'.+?'(?!\w)/g, "\u2018", "\u2019");
+	}
+}
+
+/**
+* Parse single quotes in general
+*
+* Does apostrophes ’ after a letter or at the beginning of a word or a couple of digits
+*/
+function parseSingleQuotes()
+{
+	if (!hasSingleQuote)
+	{
+		return;
+	}
+
+	var m, regexp = /[a-z]'|(?:^|\s)'(?=[a-z]|[0-9]{2})/gi;
+	while (m = regexp.exec(text))
+	{
+		// Give this tag a worse priority than default so that quote pairs take precedence
+		addTag(+m['index'] + m[0].indexOf("'"), 1, "\u2019", 10);
+	}
+}
+
+/**
+* Parse symbols found after digits
+*
+* Does symbols found after a digit:
+*  - apostrophe ’ if it's followed by an "s" as in 80's
+*  - prime ′ and double prime ″
+*  - multiply sign × if it's followed by an optional space and another digit
+*/
+function parseSymbolsAfterDigits()
+{
+	if (!hasSingleQuote && !hasDoubleQuote && text.indexOf('x') < 0)
+	{
+		return;
+	}
+
+	/** @const */
+	var map = {
+		// 80's -- use an apostrophe
+		"'s" : "\u2019",
+		// 12' or 12" -- use a prime
+		"'"  : "\u2032",
+		"' " : "\u2032",
+		"'x" : "\u2032",
+		'"'  : "\u2033",
+		'" ' : "\u2033",
+		'"x' : "\u2033"
+	};
+
+	var m, regexp = /[0-9](?:'s|["']? ?x(?= ?[0-9])|["'])/g;
+	while (m = regexp.exec(text))
+	{
+		// Test for a multiply sign at the end
+		if (m[0].charAt(m[0].length - 1) === 'x')
+		{
+			addTag(+m['index'] + m[0].length - 1, 1, "\u00d7");
+		}
+
+		// Test for an apostrophe/prime right after the digit
+		var str = m[0].substr(1, 2);
+		if (map[str])
+		{
+			addTag(+m['index'] + 1, 1, map[str]);
+		}
+	}
+}
+
+/**
+* Parse symbols found in parentheses such as (c)
+*
+* Does symbols ©, ® and ™
+*/
+function parseSymbolsInParentheses()
+{
+	if (text.indexOf('(') < 0)
+	{
+		return;
+	}
+
+	var chrs = {
+			'(c)'  : "\u00A9",
+			'(r)'  : "\u00AE",
+			'(tm)' : "\u2122"
+		},
+		regexp = /\((?:c|r|tm)\)/gi,
+		m;
+	while (m = regexp.exec(text))
+	{
+		addTag(+m['index'], m[0].length, chrs[m[0].toLowerCase()]);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/FancyPants/Parser.php
@@ -0,0 +1,147 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\FancyPants;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	protected $hasDoubleQuote;
+	protected $hasSingleQuote;
+	protected $text;
+	public function parse($text, array $matches)
+	{
+		$this->text           = $text;
+		$this->hasSingleQuote = (\strpos($text, "'") !== \false);
+		$this->hasDoubleQuote = (\strpos($text, '"') !== \false);
+		$this->parseSingleQuotes();
+		$this->parseSymbolsAfterDigits();
+		$this->parseSingleQuotePairs();
+		$this->parseDoubleQuotePairs();
+		$this->parseDashesAndEllipses();
+		$this->parseSymbolsInParentheses();
+		$this->parseNotEqualSign();
+		$this->parseGuillemets();
+		unset($this->text);
+	}
+	protected function addTag($tagPos, $tagLen, $chr, $prio = 0)
+	{
+		$tag = $this->parser->addSelfClosingTag($this->config['tagName'], $tagPos, $tagLen, $prio);
+		$tag->setAttribute($this->config['attrName'], $chr);
+		return $tag;
+	}
+	protected function parseDashesAndEllipses()
+	{
+		if (\strpos($this->text, '...') === \false && \strpos($this->text, '--') === \false)
+			return;
+		$chrs = array(
+			'--'  => "\xE2\x80\x93",
+			'---' => "\xE2\x80\x94",
+			'...' => "\xE2\x80\xA6"
+		);
+		$regexp = '/---?|\\.\\.\\./S';
+		\preg_match_all($regexp, $this->text, $matches, \PREG_OFFSET_CAPTURE);
+		foreach ($matches[0] as $m)
+			$this->addTag($m[1], \strlen($m[0]), $chrs[$m[0]]);
+	}
+	protected function parseDoubleQuotePairs()
+	{
+		if ($this->hasDoubleQuote)
+			$this->parseQuotePairs(
+				'/(?<![0-9\\pL])"[^"\\n]+"(?![0-9\\pL])/uS',
+				"\xE2\x80\x9C",
+				"\xE2\x80\x9D"
+			);
+	}
+	protected function parseGuillemets()
+	{
+		if (\strpos($this->text, '<<') === \false)
+			return;
+		$regexp = '/<<( ?)(?! )[^\\n<>]*?[^\\n <>]\\1>>(?!>)/';
+		\preg_match_all($regexp, $this->text, $matches, \PREG_OFFSET_CAPTURE);
+		foreach ($matches[0] as $m)
+		{
+			$left  = $this->addTag($m[1],                     2, "\xC2\xAB");
+			$right = $this->addTag($m[1] + \strlen($m[0]) - 2, 2, "\xC2\xBB");
+			$left->cascadeInvalidationTo($right);
+		}
+	}
+	protected function parseNotEqualSign()
+	{
+		if (\strpos($this->text, '!=') === \false)
+			return;
+		$regexp = '/\\b !=(?= \\b)/';
+		\preg_match_all($regexp, $this->text, $matches, \PREG_OFFSET_CAPTURE);
+		foreach ($matches[0] as $m)
+			$this->addTag($m[1] + 1, 2, "\xE2\x89\xA0");
+	}
+	protected function parseQuotePairs($regexp, $leftQuote, $rightQuote)
+	{
+		\preg_match_all($regexp, $this->text, $matches, \PREG_OFFSET_CAPTURE);
+		foreach ($matches[0] as $m)
+		{
+			$left  = $this->addTag($m[1], 1, $leftQuote);
+			$right = $this->addTag($m[1] + \strlen($m[0]) - 1, 1, $rightQuote);
+			$left->cascadeInvalidationTo($right);
+		}
+	}
+	protected function parseSingleQuotePairs()
+	{
+		if ($this->hasSingleQuote)
+			$this->parseQuotePairs(
+				"/(?<![0-9\\pL])'[^'\\n]+'(?![0-9\\pL])/uS",
+				"\xE2\x80\x98",
+				"\xE2\x80\x99"
+			);
+	}
+	protected function parseSingleQuotes()
+	{
+		if (!$this->hasSingleQuote)
+			return;
+		$regexp = "/(?<=\\pL)'|(?<!\\S)'(?=\\pL|[0-9]{2})/uS";
+		\preg_match_all($regexp, $this->text, $matches, \PREG_OFFSET_CAPTURE);
+		foreach ($matches[0] as $m)
+			$this->addTag($m[1], 1, "\xE2\x80\x99", 10);
+	}
+	protected function parseSymbolsAfterDigits()
+	{
+		if (!$this->hasSingleQuote && !$this->hasDoubleQuote && \strpos($this->text, 'x') === \false)
+			return;
+		$map = array(
+			"'s" => "\xE2\x80\x99",
+			"'"  => "\xE2\x80\xB2",
+			"' " => "\xE2\x80\xB2",
+			"'x" => "\xE2\x80\xB2",
+			'"'  => "\xE2\x80\xB3",
+			'" ' => "\xE2\x80\xB3",
+			'"x' => "\xE2\x80\xB3"
+		);
+		$regexp = "/[0-9](?>'s|[\"']? ?x(?= ?[0-9])|[\"'])/S";
+		\preg_match_all($regexp, $this->text, $matches, \PREG_OFFSET_CAPTURE);
+		foreach ($matches[0] as $m)
+		{
+			if (\substr($m[0], -1) === 'x')
+				$this->addTag($m[1] + \strlen($m[0]) - 1, 1, "\xC3\x97");
+			$str = \substr($m[0], 1, 2);
+			if (isset($map[$str]))
+				$this->addTag($m[1] + 1, 1, $map[$str]);
+		}
+	}
+	protected function parseSymbolsInParentheses()
+	{
+		if (\strpos($this->text, '(') === \false)
+			return;
+		$chrs = array(
+			'(c)'  => "\xC2\xA9",
+			'(r)'  => "\xC2\xAE",
+			'(tm)' => "\xE2\x84\xA2"
+		);
+		$regexp = '/\\((?>c|r|tm)\\)/i';
+		\preg_match_all($regexp, $this->text, $matches, \PREG_OFFSET_CAPTURE);
+		foreach ($matches[0] as $m)
+			$this->addTag($m[1], \strlen($m[0]), $chrs[\strtr($m[0], 'CMRT', 'cmrt')]);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/HTMLComments/Configurator.php
@@ -0,0 +1,23 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\HTMLComments;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class Configurator extends ConfiguratorBase
+{
+	protected $attrName = 'content';
+	protected $quickMatch = '<!--';
+	protected $regexp = '/<!--(?!\\[if).*?-->/is';
+	protected $tagName = 'HC';
+	protected function setUp()
+	{
+		$tag = $this->configurator->tags->add($this->tagName);
+		$tag->attributes->add($this->attrName);
+		$tag->rules->ignoreTags();
+		$tag->template = '<xsl:comment><xsl:value-of select="@' . \htmlspecialchars($this->attrName) . '"/></xsl:comment>';
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/HTMLComments/Parser.js
@@ -0,0 +1,16 @@
+var tagName  = config.tagName,
+	attrName = config.attrName;
+
+matches.forEach(function(m)
+{
+	// Decode HTML entities
+	var content = html_entity_decode(m[0][0].substr(4, m[0][0].length - 7));
+
+	// Remove angle brackets from the content
+	content = content.replace(/[<>]/g, '');
+
+	// Remove the illegal sequence "--" from the content
+	content = content.replace(/--/g, '');
+
+	addSelfClosingTag(tagName, m[0][1], m[0][0].length).setAttribute(attrName, content);
+});
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/HTMLComments/Parser.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\HTMLComments;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	public function parse($text, array $matches)
+	{
+		$tagName  = $this->config['tagName'];
+		$attrName = $this->config['attrName'];
+		foreach ($matches as $m)
+		{
+			$content = \html_entity_decode(\substr($m[0][0], 4, -3), \ENT_QUOTES, 'UTF-8');
+			$content = \str_replace(array('<', '>'), '', $content);
+			$content = \str_replace('--', '', $content);
+			$this->parser->addSelfClosingTag($tagName, $m[0][1], \strlen($m[0][0]))->setAttribute($attrName, $content);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/HTMLElements/Configurator.php
@@ -0,0 +1,165 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\HTMLElements;
+use InvalidArgumentException;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\Items\UnsafeTemplate;
+use s9e\TextFormatter\Configurator\JavaScript\Dictionary;
+use s9e\TextFormatter\Configurator\Validators\AttributeName;
+use s9e\TextFormatter\Configurator\Validators\TagName;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class Configurator extends ConfiguratorBase
+{
+	protected $aliases = array();
+	protected $attributeFilters = array(
+		'action'     => '#url',
+		'cite'       => '#url',
+		'data'       => '#url',
+		'formaction' => '#url',
+		'href'       => '#url',
+		'icon'       => '#url',
+		'longdesc'   => '#url',
+		'poster'     => '#url',
+		'src'        => '#url'
+	);
+	protected $elements = array();
+	protected $prefix = 'html';
+	protected $quickMatch = '<';
+	protected $unsafeElements = array(
+		'base',
+		'embed',
+		'frame',
+		'iframe',
+		'meta',
+		'object',
+		'script'
+	);
+	protected $unsafeAttributes = array(
+		'style',
+		'target'
+	);
+	public function aliasAttribute($elName, $attrName, $alias)
+	{
+		$elName   = $this->normalizeElementName($elName);
+		$attrName = $this->normalizeAttributeName($attrName);
+		$this->aliases[$elName][$attrName] = AttributeName::normalize($alias);
+	}
+	public function aliasElement($elName, $tagName)
+	{
+		$elName = $this->normalizeElementName($elName);
+		$this->aliases[$elName][''] = TagName::normalize($tagName);
+	}
+	public function allowElement($elName)
+	{
+		return $this->allowElementWithSafety($elName, \false);
+	}
+	public function allowUnsafeElement($elName)
+	{
+		return $this->allowElementWithSafety($elName, \true);
+	}
+	protected function allowElementWithSafety($elName, $allowUnsafe)
+	{
+		$elName  = $this->normalizeElementName($elName);
+		$tagName = $this->prefix . ':' . $elName;
+		if (!$allowUnsafe && \in_array($elName, $this->unsafeElements))
+			throw new RuntimeException("'" . $elName . "' elements are unsafe and are disabled by default. Please use " . __CLASS__ . '::allowUnsafeElement() to bypass this security measure');
+		$tag = ($this->configurator->tags->exists($tagName))
+		     ? $this->configurator->tags->get($tagName)
+		     : $this->configurator->tags->add($tagName);
+		$this->rebuildTemplate($tag, $elName, $allowUnsafe);
+		$this->elements[$elName] = 1;
+		return $tag;
+	}
+	public function allowAttribute($elName, $attrName)
+	{
+		return $this->allowAttributeWithSafety($elName, $attrName, \false);
+	}
+	public function allowUnsafeAttribute($elName, $attrName)
+	{
+		return $this->allowAttributeWithSafety($elName, $attrName, \true);
+	}
+	protected function allowAttributeWithSafety($elName, $attrName, $allowUnsafe)
+	{
+		$elName   = $this->normalizeElementName($elName);
+		$attrName = $this->normalizeAttributeName($attrName);
+		$tagName  = $this->prefix . ':' . $elName;
+		if (!isset($this->elements[$elName]))
+			throw new RuntimeException("Element '" . $elName . "' has not been allowed");
+		if (!$allowUnsafe)
+			if (\substr($attrName, 0, 2) === 'on'
+			 || \in_array($attrName, $this->unsafeAttributes))
+				throw new RuntimeException("'" . $attrName . "' attributes are unsafe and are disabled by default. Please use " . __CLASS__ . '::allowUnsafeAttribute() to bypass this security measure');
+		$tag = $this->configurator->tags->get($tagName);
+		if (!isset($tag->attributes[$attrName]))
+		{
+			$attribute = $tag->attributes->add($attrName);
+			$attribute->required = \false;
+			if (isset($this->attributeFilters[$attrName]))
+			{
+				$filterName = $this->attributeFilters[$attrName];
+				$filter = $this->configurator->attributeFilters->get($filterName);
+				$attribute->filterChain->append($filter);
+			}
+		}
+		$this->rebuildTemplate($tag, $elName, $allowUnsafe);
+		return $tag->attributes[$attrName];
+	}
+	protected function normalizeElementName($elName)
+	{
+		if (!\preg_match('#^[a-z][a-z0-9]*$#Di', $elName))
+			throw new InvalidArgumentException ("Invalid element name '" . $elName . "'");
+		return \strtolower($elName);
+	}
+	protected function normalizeAttributeName($attrName)
+	{
+		if (!\preg_match('#^[a-z][-\\w]*$#Di', $attrName))
+			throw new InvalidArgumentException ("Invalid attribute name '" . $attrName . "'");
+		return \strtolower($attrName);
+	}
+	protected function rebuildTemplate(Tag $tag, $elName, $allowUnsafe)
+	{
+		$template = '<' . $elName . '>';
+		foreach ($tag->attributes as $attrName => $attribute)
+			$template .= '<xsl:copy-of select="@' . $attrName . '"/>';
+		$template .= '<xsl:apply-templates/></' . $elName . '>';
+		if ($allowUnsafe)
+			$template = new UnsafeTemplate($template);
+		$tag->setTemplate($template);
+	}
+	public function asConfig()
+	{
+		if (empty($this->elements) && empty($this->aliases))
+			return;
+		$attrRegexp = '[a-z][-a-z0-9]*(?>\\s*=\\s*(?>"[^"]*"|\'[^\']*\'|[^\\s"\'=<>`]+))?';
+		$tagRegexp  = RegexpBuilder::fromList(\array_merge(
+			\array_keys($this->aliases),
+			\array_keys($this->elements)
+		));
+		$endTagRegexp   = '/(' . $tagRegexp . ')';
+		$startTagRegexp = '(' . $tagRegexp . ')((?>\\s+' . $attrRegexp . ')*+)\\s*/?';
+		$regexp = '#<(?>' . $endTagRegexp . '|' . $startTagRegexp . ')\\s*>#i';
+		$config = array(
+			'quickMatch' => $this->quickMatch,
+			'prefix'     => $this->prefix,
+			'regexp'     => $regexp
+		);
+		if (!empty($this->aliases))
+		{
+			$config['aliases'] = new Dictionary;
+			foreach ($this->aliases as $elName => $aliases)
+				$config['aliases'][$elName] = new Dictionary($aliases);
+		}
+		return $config;
+	}
+	public function getJSHints()
+	{
+		return array('HTMLELEMENTS_HAS_ALIASES' => (int) !empty($this->aliases));
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/HTMLElements/Parser.js
@@ -0,0 +1,86 @@
+matches.forEach(function(m)
+{
+	// Test whether this is an end tag
+	var isEnd = (text.charAt(m[0][1] + 1) === '/');
+
+	var pos    = m[0][1],
+		len    = m[0][0].length,
+		elName = m[2 - isEnd][0].toLowerCase();
+
+	// Use the element's alias if applicable, or the  name of the element (with the
+	// configured prefix) otherwise
+	var tagName = (config.aliases && config.aliases[elName] && config.aliases[elName][''])
+	            ? config.aliases[elName]['']
+	            : config.prefix + ':' + elName;
+
+	if (isEnd)
+	{
+		addEndTag(tagName, pos, len);
+
+		return;
+	}
+
+	// Test whether it's a self-closing tag or a start tag.
+	//
+	// A self-closing tag will become one start tag consuming all of the text followed by a
+	// 0-width end tag. Alternatively, it could be replaced by a pair of 0-width tags plus
+	// an ignore tag to prevent the text in between from being output
+	var tag = (/(<\S+|['"\s])\/>$/.test(m[0][0]))
+			? addTagPair(tagName, pos, len, pos + len, 0)
+			: addStartTag(tagName, pos, len);
+
+	captureAttributes(tag, elName, m[3][0]);
+});
+
+/**
+* Capture all attributes in given string
+*
+* @param  {!Tag}    tag    Target tag
+* @param  {!string} elName Name of the HTML element
+* @param  {!string} str    String containing the attribute declarations
+*/
+function captureAttributes(tag, elName, str)
+{
+	// Capture attributes
+	var attrRegexp = /[a-z][-a-z0-9]*(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s"'=<>`]+))?/gi,
+		attrName,
+		attrValue,
+		attrMatch,
+		pos;
+
+	while (attrMatch = attrRegexp.exec(str))
+	{
+		pos = attrMatch[0].indexOf('=');
+
+		/**
+		* If there's no equal sign, it's a boolean attribute and we generate a value equal
+		* to the attribute's name, lowercased
+		*
+		* @link http://www.w3.org/html/wg/drafts/html/master/single-page.html#boolean-attributes
+		*/
+		if (pos < 0)
+		{
+			pos = attrMatch[0].length;
+			attrMatch[0] += '=' + attrMatch[0].toLowerCase();
+		}
+
+		// Normalize the attribute name, remove the whitespace around its value to account
+		// for cases like <b title = "foo"/>
+		attrName  = attrMatch[0].substr(0, pos).toLowerCase().replace(/^\s+/, '').replace('/\s+$/', '');
+		attrValue = attrMatch[0].substr(1 + pos).replace(/^\s+/, '').replace('/\s+$/', '');
+
+		// Use the attribute's alias if applicable
+		if (HINT.HTMLELEMENTS_HAS_ALIASES && config.aliases && config.aliases[elName] && config.aliases[elName][attrName])
+		{
+			attrName = config.aliases[elName][attrName];
+		}
+
+		// Remove quotes around the value
+		if (/^["']/.test(attrValue))
+		{
+			attrValue = attrValue.substr(1, attrValue.length - 2);
+		}
+
+		tag.setAttribute(attrName, html_entity_decode(attrValue));
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/HTMLElements/Parser.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\HTMLElements;
+use s9e\TextFormatter\Parser\Tag;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	public function parse($text, array $matches)
+	{
+		foreach ($matches as $m)
+		{
+			$isEnd = (bool) ($text[$m[0][1] + 1] === '/');
+			$pos    = $m[0][1];
+			$len    = \strlen($m[0][0]);
+			$elName = \strtolower($m[2 - $isEnd][0]);
+			$tagName = (isset($this->config['aliases'][$elName]['']))
+			         ? $this->config['aliases'][$elName]['']
+			         : $this->config['prefix'] . ':' . $elName;
+			if ($isEnd)
+			{
+				$this->parser->addEndTag($tagName, $pos, $len);
+				continue;
+			}
+			$tag = (\preg_match('/(<\\S+|[\'"\\s])\\/>$/', $m[0][0]))
+			     ? $this->parser->addTagPair($tagName, $pos, $len, $pos + $len, 0)
+			     : $this->parser->addStartTag($tagName, $pos, $len);
+			$this->captureAttributes($tag, $elName, $m[3][0]);
+		}
+	}
+	protected function captureAttributes(Tag $tag, $elName, $str)
+	{
+		\preg_match_all(
+			'/[a-z][-a-z0-9]*(?>\\s*=\\s*(?>"[^"]*"|\'[^\']*\'|[^\\s"\'=<>`]+))?/i',
+			$str,
+			$attrMatches
+		);
+		foreach ($attrMatches[0] as $attrMatch)
+		{
+			$pos = \strpos($attrMatch, '=');
+			if ($pos === \false)
+			{
+				$pos = \strlen($attrMatch);
+				$attrMatch .= '=' . \strtolower($attrMatch);
+			}
+			$attrName  = \strtolower(\trim(\substr($attrMatch, 0, $pos)));
+			$attrValue = \trim(\substr($attrMatch, 1 + $pos));
+			if (isset($this->config['aliases'][$elName][$attrName]))
+				$attrName = $this->config['aliases'][$elName][$attrName];
+			if ($attrValue[0] === '"' || $attrValue[0] === "'")
+				$attrValue = \substr($attrValue, 1, -1);
+			$tag->setAttribute($attrName, \html_entity_decode($attrValue, \ENT_QUOTES, 'UTF-8'));
+		}
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/HTMLEntities/Configurator.php
@@ -0,0 +1,23 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\HTMLEntities;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class Configurator extends ConfiguratorBase
+{
+	protected $attrName = 'char';
+	protected $quickMatch = '&';
+	protected $regexp = '/&(?>[a-z]+|#(?>[0-9]+|x[0-9a-f]+));/i';
+	protected $tagName = 'HE';
+	protected function setUp()
+	{
+		$tag = $this->configurator->tags->add($this->tagName);
+		$tag->attributes->add($this->attrName);
+		$tag->template
+			= '<xsl:value-of select="@' . \htmlspecialchars($this->attrName) . '"/>';
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/HTMLEntities/Parser.js
@@ -0,0 +1,17 @@
+var tagName  = config.tagName,
+	attrName = config.attrName;
+
+matches.forEach(function(m)
+{
+	var entity = m[0][0],
+		chr    = html_entity_decode(entity);
+
+	if (chr === entity || chr.charCodeAt(0) < 32)
+	{
+		// If the entity was not decoded, we assume it's not valid and we ignore it.
+		// Same thing if it's a control character
+		return;
+	}
+
+	addSelfClosingTag(tagName, m[0][1], entity.length).setAttribute(attrName, chr);
+});
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/HTMLEntities/Parser.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\HTMLEntities;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	public function parse($text, array $matches)
+	{
+		$tagName  = $this->config['tagName'];
+		$attrName = $this->config['attrName'];
+		foreach ($matches as $m)
+		{
+			$entity = $m[0][0];
+			$chr    = \html_entity_decode($entity, \ENT_QUOTES, 'UTF-8');
+			if ($chr === $entity || \ord($chr) < 32)
+				continue;
+			$this->parser->addSelfClosingTag($tagName, $m[0][1], \strlen($entity))->setAttribute($attrName, $chr);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Keywords/Configurator.php
@@ -0,0 +1,111 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Keywords;
+use s9e\TextFormatter\Configurator\Collections\NormalizedList;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+use s9e\TextFormatter\Configurator\Items\Regexp;
+use s9e\TextFormatter\Configurator\Traits\CollectionProxy;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class Configurator extends ConfiguratorBase
+{
+	public function __call($methodName, $args)
+	{
+		return \call_user_func_array(array($this->collection, $methodName), $args);
+	}
+	public function offsetExists($offset)
+	{
+		return isset($this->collection[$offset]);
+	}
+	public function offsetGet($offset)
+	{
+		return $this->collection[$offset];
+	}
+	public function offsetSet($offset, $value)
+	{
+		$this->collection[$offset] = $value;
+	}
+	public function offsetUnset($offset)
+	{
+		unset($this->collection[$offset]);
+	}
+	public function count()
+	{
+		return \count($this->collection);
+	}
+	public function current()
+	{
+		return $this->collection->current();
+	}
+	public function key()
+	{
+		return $this->collection->key();
+	}
+	public function next()
+	{
+		return $this->collection->next();
+	}
+	public function rewind()
+	{
+		$this->collection->rewind();
+	}
+	public function valid()
+	{
+		return $this->collection->valid();
+	}
+	protected $attrName = 'value';
+	public $caseSensitive = \true;
+	protected $collection;
+	public $onlyFirst = \false;
+	protected $tagName = 'KEYWORD';
+	protected function setUp()
+	{
+		$this->collection = new NormalizedList;
+		$this->configurator->tags->add($this->tagName)->attributes->add($this->attrName);
+	}
+	public function asConfig()
+	{
+		if (!\count($this->collection))
+			return;
+		$config = array(
+			'attrName' => $this->attrName,
+			'tagName'  => $this->tagName
+		);
+		if (!empty($this->onlyFirst))
+			$config['onlyFirst'] = $this->onlyFirst;
+		$keywords = \array_unique(\iterator_to_array($this->collection));
+		\sort($keywords);
+		$groups   = array();
+		$groupKey = 0;
+		$groupLen = 0;
+		foreach ($keywords as $keyword)
+		{
+			$keywordLen  = 4 + \strlen($keyword);
+			$groupLen   += $keywordLen;
+			if ($groupLen > 30000)
+			{
+				$groupLen = $keywordLen;
+				++$groupKey;
+			}
+			$groups[$groupKey][] = $keyword;
+		}
+		foreach ($groups as $keywords)
+		{
+			$regexp = RegexpBuilder::fromList(
+				$keywords,
+				array('caseInsensitive' => !$this->caseSensitive)
+			);
+			$regexp = '/\\b' . $regexp . '\\b/S';
+			if (!$this->caseSensitive)
+				$regexp .= 'i';
+			if (\preg_match('/[^[:ascii:]]/', $regexp))
+				$regexp .= 'u';
+			$config['regexps'][] = new Regexp($regexp, \true);
+		}
+		return $config;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Keywords/Parser.js
@@ -0,0 +1,31 @@
+var regexps  = config.regexps,
+	tagName  = config.tagName,
+	attrName = config.attrName;
+
+var onlyFirst = config.onlyFirst,
+	keywords  = {};
+
+regexps.forEach(function(regexp)
+{
+	var m;
+
+	regexp.lastIndex = 0;
+	while (m = regexp.exec(text))
+	{
+		// NOTE: coercing m.index to a number because Closure Compiler thinks pos is a string otherwise
+		var value = m[0],
+			pos   = +m['index'];
+
+		if (onlyFirst)
+		{
+			if (value in keywords)
+			{
+				continue;
+			}
+
+			keywords[value] = 1;
+		}
+
+		addSelfClosingTag(tagName, pos, value.length).setAttribute(attrName, value);
+	}
+});
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Keywords/Parser.php
@@ -0,0 +1,36 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Keywords;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	public function parse($text, array $matches)
+	{
+		$regexps  = $this->config['regexps'];
+		$tagName  = $this->config['tagName'];
+		$attrName = $this->config['attrName'];
+		$onlyFirst = !empty($this->config['onlyFirst']);
+		$keywords  = array();
+		foreach ($regexps as $regexp)
+		{
+			\preg_match_all($regexp, $text, $matches, \PREG_OFFSET_CAPTURE);
+			foreach ($matches[0] as $_11955a1f)
+			{
+				list($value, $pos) = $_11955a1f;
+				if ($onlyFirst)
+				{
+					if (isset($keywords[$value]))
+						continue;
+					$keywords[$value] = 1;
+				}
+				$this->parser->addSelfClosingTag($tagName, $pos, \strlen($value))
+				             ->setAttribute($attrName, $value);
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Litedown/Configurator.php
@@ -0,0 +1,121 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Litedown;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class Configurator extends ConfiguratorBase
+{
+	public $decodeHtmlEntities = \false;
+	protected $tags = array(
+		'C'      => '<code><xsl:apply-templates /></code>',
+		'CODE'   => array(
+			'attributes' => array(
+				'lang' => array(
+					'filterChain' => array('#simpletext'),
+					'required'    => \false
+				)
+			),
+			'template' =>
+				'<pre>
+					<code>
+						<xsl:if test="@lang">
+							<xsl:attribute name="class">
+								<xsl:text>language-</xsl:text>
+								<xsl:value-of select="@lang"/>
+							</xsl:attribute>
+						</xsl:if>
+						<xsl:apply-templates />
+					</code>
+				</pre>'
+		),
+		'DEL'    => '<del><xsl:apply-templates/></del>',
+		'EM'     => '<em><xsl:apply-templates/></em>',
+		'H1'     => '<h1><xsl:apply-templates/></h1>',
+		'H2'     => '<h2><xsl:apply-templates/></h2>',
+		'H3'     => '<h3><xsl:apply-templates/></h3>',
+		'H4'     => '<h4><xsl:apply-templates/></h4>',
+		'H5'     => '<h5><xsl:apply-templates/></h5>',
+		'H6'     => '<h6><xsl:apply-templates/></h6>',
+		'HR'     => '<hr/>',
+		'IMG'    => array(
+			'attributes' => array(
+				'alt'   => array('required' => \false),
+				'src'   => array('filterChain' => array('#url')),
+				'title' => array('required' => \false)
+			),
+			'template' => '<img src="{@src}"><xsl:copy-of select="@alt"/><xsl:copy-of select="@title"/></img>'
+		),
+		'LI'     => '<li><xsl:apply-templates/></li>',
+		'LIST'   => array(
+			'attributes' => array(
+				'start' => array(
+					'filterChain' => array('#uint'),
+					'required'    => \false
+				),
+				'type' => array(
+					'filterChain' => array('#simpletext'),
+					'required'    => \false
+				)
+			),
+			'template' =>
+				'<xsl:choose>
+					<xsl:when test="not(@type)">
+						<ul><xsl:apply-templates/></ul>
+					</xsl:when>
+					<xsl:otherwise>
+						<ol><xsl:copy-of select="@start"/><xsl:apply-templates/></ol>
+					</xsl:otherwise>
+				</xsl:choose>'
+		),
+		'QUOTE'  => '<blockquote><xsl:apply-templates/></blockquote>',
+		'STRONG' => '<strong><xsl:apply-templates/></strong>',
+		'SUP'    => '<sup><xsl:apply-templates/></sup>',
+		'URL'    => array(
+			'attributes' => array(
+				'title' => array(
+					'required' => \false
+				),
+				'url'   => array(
+					'filterChain' => array('#url')
+				)
+			),
+			'template' => '<a href="{@url}"><xsl:copy-of select="@title"/><xsl:apply-templates/></a>'
+		)
+	);
+	protected function setUp()
+	{
+		$this->configurator->rulesGenerator->append('ManageParagraphs');
+		foreach ($this->tags as $tagName => $tagConfig)
+		{
+			if (isset($this->configurator->tags[$tagName]))
+				continue;
+			if (\is_string($tagConfig))
+				$tagConfig = array('template' => $tagConfig);
+			if (isset($tagConfig['attributes']))
+			{
+				foreach ($tagConfig['attributes'] as &$attributeConfig)
+					if (isset($attributeConfig['filterChain']))
+					{
+						foreach ($attributeConfig['filterChain'] as &$filter)
+							if (\is_string($filter) && $filter[0] === '#')
+								$filter = $this->configurator->attributeFilters[$filter];
+						unset($filter);
+					}
+				unset($attributeConfig);
+			}
+			$this->configurator->tags->add($tagName, $tagConfig);
+		}
+	}
+	public function asConfig()
+	{
+		return array('decodeHtmlEntities' => (bool) $this->decodeHtmlEntities);
+	}
+	public function getJSHints()
+	{
+		return array('LITEDOWN_DECODE_HTML_ENTITIES' => (int) $this->decodeHtmlEntities);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Litedown/Parser.js
@@ -0,0 +1,1202 @@
+var hasEscapedChars, hasRefs, refs, startTagLen, startTagPos, endTagPos, endTagLen;
+
+// Unlike the PHP parser, init() must not take an argument
+init();
+
+// Match block-level markup as well as forced line breaks
+matchBlockLevelMarkup();
+
+// Capture link references after block markup as been overwritten
+matchLinkReferences();
+
+// Inline code must be done first to avoid false positives in other inline markup
+matchInlineCode();
+
+// Do the rest of inline markup. Images must be matched before links
+matchImages();
+matchLinks();
+matchStrikethrough();
+matchSuperscript();
+matchEmphasis();
+matchForcedLineBreaks();
+
+/**
+* Add an image tag for given text span
+*
+* @param {!number} startTagPos Start tag position
+* @param {!number} endTagPos   End tag position
+* @param {!number} endTagLen   End tag length
+* @param {!string} linkInfo    URL optionally followed by space and a title
+* @param {!string} alt         Value for the alt attribute
+*/
+function addImageTag(startTagPos, endTagPos, endTagLen, linkInfo, alt)
+{
+	var tag = addTagPair('IMG', startTagPos, 2, endTagPos, endTagLen);
+	setLinkAttributes(tag, linkInfo, 'src');
+	tag.setAttribute('alt', decode(alt));
+
+	// Overwrite the markup
+	overwrite(startTagPos, endTagPos + endTagLen - startTagPos);
+}
+
+/**
+* Add the tag pair for an inline code span
+*
+* @param {!Object} left  Left marker
+* @param {!Object} right Right marker
+*/
+function addInlineCodeTags(left, right)
+{
+	var startTagPos = left.pos,
+		startTagLen = left.len + left.trimAfter,
+		endTagPos   = right.pos - right.trimBefore,
+		endTagLen   = right.len + right.trimBefore;
+	addTagPair('C', startTagPos, startTagLen, endTagPos, endTagLen);
+	overwrite(startTagPos, endTagPos + endTagLen - startTagPos);
+}
+
+/**
+* Add an image tag for given text span
+*
+* @param {!number} startTagPos Start tag position
+* @param {!number} endTagPos   End tag position
+* @param {!number} endTagLen   End tag length
+* @param {!string} linkInfo    URL optionally followed by space and a title
+*/
+function addLinkTag(startTagPos, endTagPos, endTagLen, linkInfo)
+{
+	// Give the link a slightly worse priority if this is a implicit reference and a slightly
+	// better priority if it's an explicit reference or an inline link or  to give it precedence
+	// over possible BBCodes such as [b](https://en.wikipedia.org/wiki/B)
+	var priority = (endTagLen === 1) ? 1 : -1;
+
+	var tag = addTagPair('URL', startTagPos, 1, endTagPos, endTagLen, priority);
+	setLinkAttributes(tag, linkInfo, 'url');
+
+	// Overwrite the markup without touching the link's text
+	overwrite(startTagPos, 1);
+	overwrite(endTagPos,   endTagLen);
+}
+
+/**
+* Close a list at given offset
+*
+* @param  {!Array}  list
+* @param  {!number} textBoundary
+*/
+function closeList(list, textBoundary)
+{
+	addEndTag('LIST', textBoundary, 0).pairWith(list.listTag);
+	addEndTag('LI',   textBoundary, 0).pairWith(list.itemTag);
+
+	if (list.tight)
+	{
+		list.itemTags.forEach(function(itemTag)
+		{
+			itemTag.removeFlags(RULE_CREATE_PARAGRAPHS);
+		});
+	}
+}
+
+/**
+* Compute the amount of text to ignore at the start of a quote line
+*
+* @param  {!string} str           Original quote markup
+* @param  {!number} maxQuoteDepth Maximum quote depth
+* @return {!number}               Number of characters to ignore
+*/
+function computeQuoteIgnoreLen(str, maxQuoteDepth)
+{
+	var remaining = str;
+	while (--maxQuoteDepth >= 0)
+	{
+		remaining = remaining.replace(/^ *> ?/, '');
+	}
+
+	return str.length - remaining.length;
+}
+
+/**
+* Decode a chunk of encoded text to be used as an attribute value
+*
+* Decodes escaped literals and removes slashes and 0x1A characters
+*
+* @param  {!string}  str Encoded text
+* @return {!string}      Decoded text
+*/
+function decode(str)
+{
+	if (HINT.LITEDOWN_DECODE_HTML_ENTITIES && config.decodeHtmlEntities && str.indexOf('&') > -1)
+	{
+		str = html_entity_decode(str);
+	}
+	str = str.replace(/\x1A/g, '');
+
+	if (hasEscapedChars)
+	{
+		str = str.replace(
+			/\x1B./g,
+			function (seq)
+			{
+				return {
+					"\x1B0": '!', "\x1B1": '"', "\x1B2": "'", "\x1B3": '(',
+					"\x1B4": ')', "\x1B5": '*', "\x1B6": '[', "\x1B7": '\\',
+					"\x1B8": ']', "\x1B9": '^', "\x1BA": '_', "\x1BB": '`',
+					"\x1BC": '~'
+				}[seq];
+			}
+		);
+	}
+
+	return str;
+}
+
+/**
+* Encode escaped literals that have a special meaning
+*
+* @param  {!string}  str Original text
+* @return {!string}      Encoded text
+*/
+function encode(str)
+{
+	return str.replace(
+		/\\[!"'()*[\\\]^_`~]/g,
+		function (str)
+		{
+			return {
+				'\\!': "\x1B0", '\\"': "\x1B1", "\\'": "\x1B2", '\\(' : "\x1B3",
+				'\\)': "\x1B4", '\\*': "\x1B5", '\\[': "\x1B6", '\\\\': "\x1B7",
+				'\\]': "\x1B8", '\\^': "\x1B9", '\\_': "\x1BA", '\\`' : "\x1BB",
+				'\\~': "\x1BC"
+			}[str];
+		}
+	);
+}
+
+/**
+* Return the length of the markup at the end of an ATX header
+*
+* @param  {!number} startPos Start of the header's text
+* @param  {!number} endPos   End of the header's text
+* @return {!number}
+*/
+function getAtxHeaderEndTagLen(startPos, endPos)
+{
+	var content = text.substr(startPos, endPos - startPos),
+		m = /[ \t]*#*[ \t]*$/.exec(content);
+
+	return m[0].length;
+}
+
+/**
+* Get emphasis markup split by block
+*
+* @param  {!RegExp} regexp Regexp used to match emphasis
+* @param  {!number} pos    Position in the text of the first emphasis character
+* @return {!Array}         Each array contains a list of [matchPos, matchLen] pairs
+*/
+function getEmphasisByBlock(regexp, pos)
+{
+	var block    = [],
+		blocks   = [],
+		breakPos = breakPos  = text.indexOf("\x17", pos),
+		m;
+
+	regexp.lastIndex = pos;
+	while (m = regexp.exec(text))
+	{
+		var matchPos = m['index'],
+			matchLen = m[0].length;
+
+		// Test whether we've just passed the limits of a block
+		if (matchPos > breakPos)
+		{
+			blocks.push(block);
+			block    = [];
+			breakPos = text.indexOf("\x17", matchPos);
+		}
+
+		// Test whether we should ignore this markup
+		if (!ignoreEmphasis(matchPos, matchLen))
+		{
+			block.push([matchPos, matchLen]);
+		}
+	}
+	blocks.push(block);
+
+	return blocks;
+}
+
+/**
+* Capture and return inline code markers
+*
+* @return {!Array<!Object>}
+*/
+function getInlineCodeMarkers()
+{
+	var pos = text.indexOf('`');
+	if (pos < 0)
+	{
+		return [];
+	}
+
+	var regexp   = /(`+)(\s*)[^\x17`]*/g,
+		trimNext = 0,
+		markers  = [],
+		_text    = text.replace(/\x1BB/g, '\\`'),
+		m;
+	regexp.lastIndex = pos;
+	while (m = regexp.exec(_text))
+	{
+		markers.push({
+			pos        : m['index'],
+			len        : m[1].length,
+			trimBefore : trimNext,
+			trimAfter  : m[2].length,
+			next       : m['index'] + m[0].length
+		});
+		trimNext = m[0].length - m[0].replace(/\s+$/, '').length;
+	}
+
+	return markers;
+}
+
+/**
+* Capture and return labels used in current text
+*
+* @return {!Object} Labels' text position as keys, lowercased text content as values
+*/
+function getLabels()
+{
+	var labels = {}, m, regexp = /\[((?:[^\x17[\]]|\[[^\x17[\]]*\])*)\]/g;
+	while (m = regexp.exec(text))
+	{
+		labels[m['index']] = m[1].toLowerCase();
+	}
+
+	return labels;
+}
+
+/**
+* Capture lines that contain a Setext-tyle header
+*
+* @return {!Object}
+*/
+function getSetextLines()
+{
+	var setextLines = {};
+
+	// Capture the underlines used for Setext-style headers
+	if (text.indexOf('-') === -1 && text.indexOf('=') === -1)
+	{
+		return setextLines;
+	}
+
+	// Capture the any series of - or = alone on a line, optionally preceded with the
+	// angle brackets notation used in blockquotes
+	var m, regexp = /^(?=[-=>])(?:> ?)*(?=[-=])(?:-+|=+) *$/gm;
+
+	while (m = regexp.exec(text))
+	{
+		var match    = m[0],
+			matchPos = m['index'];
+
+		// Compute the position of the end tag. We start on the LF character before the
+		// match and keep rewinding until we find a non-space character
+		var endTagPos = matchPos - 1;
+		while (endTagPos > 0 && text[endTagPos - 1] === ' ')
+		{
+			--endTagPos;
+		}
+
+		// Store at the offset of the LF character
+		setextLines[matchPos - 1] = {
+			endTagLen  : matchPos + match.length - endTagPos,
+			endTagPos  : endTagPos,
+			quoteDepth : match.length - match.replace(/>/g, '').length,
+			tagName    : (match.charAt(0) === '=') ? 'H1' : 'H2'
+		};
+	}
+
+	return setextLines;
+}
+
+/**
+* Test whether emphasis should be ignored at the given position in the text
+*
+* @param  {!number}  matchPos Position of the emphasis in the text
+* @param  {!number}  matchLen Length of the emphasis
+* @return {!boolean}
+*/
+function ignoreEmphasis(matchPos, matchLen)
+{
+	// Ignore single underscores between alphanumeric characters
+	return (text[matchPos] === '_' && matchLen === 1 && isSurroundedByAlnum(matchPos, matchLen));
+}
+
+/**
+* Initialize this parser
+*/
+function init()
+{
+	if (text.indexOf('\\') < 0)
+	{
+		hasEscapedChars = false;
+	}
+	else
+	{
+		hasEscapedChars = true;
+
+		// Encode escaped literals that have a special meaning otherwise, so that we don't have
+		// to take them into account in regexps
+		text = encode(text);
+	}
+
+	// We append a couple of lines and a non-whitespace character at the end of the text in
+	// order to trigger the closure of all open blocks such as quotes and lists
+	text += "\n\n\x17";
+}
+
+/**
+* Test whether given character is alphanumeric
+*
+* @param  {!string}  chr
+* @return {!boolean}
+*/
+function isAlnum(chr)
+{
+	return (' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'.indexOf(chr) > 0);
+}
+
+/**
+* Test whether a length of text is surrounded by alphanumeric characters
+*
+* @param  {!number}  matchPos Start of the text
+* @param  {!number}  matchLen Length of the text
+* @return {!boolean}
+*/
+function isSurroundedByAlnum(matchPos, matchLen)
+{
+	return (matchPos > 0 && isAlnum(text[matchPos - 1]) && isAlnum(text[matchPos + matchLen]));
+}
+
+/**
+* Mark the boundary of a block in the original text
+*
+* @param {!number} pos
+*/
+function markBoundary(pos)
+{
+	text = text.substr(0, pos) + "\x17" + text.substr(pos + 1);
+}
+
+/**
+* Match block-level markup, as well as forced line breaks and headers
+*/
+function matchBlockLevelMarkup()
+{
+	var codeFence,
+		codeIndent   = 4,
+		codeTag,
+		lineIsEmpty  = true,
+		lists        = [],
+		listsCnt     = 0,
+		newContext   = false,
+		quotes       = [],
+		quotesCnt    = 0,
+		setextLines  = getSetextLines(),
+		textBoundary = 0,
+		breakParagraph,
+		continuation,
+		endTag,
+		ignoreLen,
+		indentStr,
+		indentLen,
+		lfPos,
+		listIndex,
+		maxIndent,
+		minIndent,
+		quoteDepth,
+		tagPos,
+		tagLen;
+
+	// Capture all the lines at once so that we can overwrite newlines safely, without preventing
+	// further matches
+	var matches = [],
+		m,
+		regexp = /^(?:(?=[-*+\d \t>`~#_])((?: {0,3}> ?)+)?([ \t]+)?(\* *\* *\*[* ]*$|- *- *-[- ]*$|_ *_ *_[_ ]*$)?((?:[-*+]|\d+\.)[ \t]+(?=\S))?[ \t]*(#{1,6}[ \t]+|```+[^`\n]*$|~~~+[^~\n]*$)?)?/gm;
+	while (m = regexp.exec(text))
+	{
+		matches.push(m);
+
+		// Move regexp.lastIndex if the current match is empty
+		if (m['index'] === regexp['lastIndex'])
+		{
+			++regexp['lastIndex'];
+		}
+	}
+
+	matches.forEach(function(m)
+	{
+		var matchPos = m['index'],
+			matchLen = m[0].length;
+
+		ignoreLen  = 0;
+		quoteDepth = 0;
+
+		// If the last line was empty then this is not a continuation, and vice-versa
+		continuation = !lineIsEmpty;
+
+		// Capture the position of the end of the line and determine whether the line is empty
+		lfPos       = text.indexOf("\n", matchPos);
+		lineIsEmpty = (lfPos === matchPos + matchLen && !m[3] && !m[4] && !m[5]);
+
+		// If the match is empty we need to move the cursor manually
+		if (!matchLen)
+		{
+			++regexp.lastIndex;
+		}
+
+		// If the line is empty and it's the first empty line then we break current paragraph.
+		breakParagraph = (lineIsEmpty && continuation);
+
+		// Count quote marks
+		if (m[1])
+		{
+			quoteDepth = m[1].length - m[1].replace(/>/g, '').length;
+			ignoreLen  = m[1].length;
+			if (codeTag && codeTag.hasAttribute('quoteDepth'))
+			{
+				quoteDepth = Math.min(quoteDepth, codeTag.getAttribute('quoteDepth'));
+				ignoreLen  = computeQuoteIgnoreLen(m[1], quoteDepth);
+			}
+
+			// Overwrite quote markup
+			overwrite(matchPos, ignoreLen);
+		}
+
+		// Close supernumerary quotes
+		if (quoteDepth < quotesCnt && !continuation)
+		{
+			newContext = true;
+
+			do
+			{
+				addEndTag('QUOTE', textBoundary, 0).pairWith(quotes.pop());
+			}
+			while (quoteDepth < --quotesCnt);
+		}
+
+		// Open new quotes
+		if (quoteDepth > quotesCnt && !lineIsEmpty)
+		{
+			newContext = true;
+
+			do
+			{
+				var tag = addStartTag('QUOTE', matchPos, 0, quotesCnt - 999);
+				quotes.push(tag);
+			}
+			while (quoteDepth > ++quotesCnt);
+		}
+
+		// Compute the width of the indentation
+		var indentWidth = 0,
+			indentPos   = 0;
+		if (m[2] && !codeFence)
+		{
+			indentStr = m[2];
+			indentLen = indentStr.length;
+
+			do
+			{
+				if (indentStr.charAt(indentPos) === ' ')
+				{
+					++indentWidth;
+				}
+				else
+				{
+					indentWidth = (indentWidth + 4) & ~3;
+				}
+			}
+			while (++indentPos < indentLen && indentWidth < codeIndent);
+		}
+
+		// Test whether we're out of a code block
+		if (codeTag && !codeFence && indentWidth < codeIndent && !lineIsEmpty)
+		{
+			newContext = true;
+		}
+
+		if (newContext)
+		{
+			newContext = false;
+
+			// Close the code block if applicable
+			if (codeTag)
+			{
+				// Overwrite the whole block
+				overwrite(codeTag.getPos(), textBoundary - codeTag.getPos());
+
+				endTag = addEndTag('CODE', textBoundary, 0, -1);
+				endTag.pairWith(codeTag);
+				codeTag = null;
+				codeFence = null;
+			}
+
+			// Close all the lists
+			lists.forEach(function(list)
+			{
+				closeList(list, textBoundary);
+			});
+			lists    = [];
+			listsCnt = 0;
+
+			// Mark the block boundary
+			if (matchPos)
+			{
+				markBoundary(matchPos - 1);
+			}
+		}
+
+		if (indentWidth >= codeIndent)
+		{
+			if (codeTag || !continuation)
+			{
+				// Adjust the amount of text being ignored
+				ignoreLen = (m[1] || '').length + indentPos;
+
+				if (!codeTag)
+				{
+					// Create code block
+					codeTag = addStartTag('CODE', matchPos + ignoreLen, 0, -999);
+				}
+
+				// Clear the captures to prevent any further processing
+				m = {};
+			}
+		}
+		else
+		{
+			var hasListItem = !!m[4];
+
+			if (!indentWidth && !continuation && !hasListItem)
+			{
+				// Start of a new context
+				listIndex = -1;
+			}
+			else if (continuation && !hasListItem)
+			{
+				// Continuation of current list item or paragraph
+				listIndex = listsCnt - 1;
+			}
+			else if (!listsCnt)
+			{
+				// We're not inside of a list already, we can start one if there's a list item
+				// and it's either not in continuation of a paragraph or immediately after a
+				// block
+				if (hasListItem && (!continuation || text.charAt(matchPos - 1) === "\x17"))
+				{
+					// Start of a new list
+					listIndex = 0;
+				}
+				else
+				{
+					// We're in a normal paragraph
+					listIndex = -1;
+				}
+			}
+			else
+			{
+				// We're inside of a list but we need to compute the depth
+				listIndex = 0;
+				while (listIndex < listsCnt && indentWidth > lists[listIndex].maxIndent)
+				{
+					++listIndex;
+				}
+			}
+
+			// Close deeper lists
+			while (listIndex < listsCnt - 1)
+			{
+				closeList(lists.pop(), textBoundary);
+				--listsCnt;
+			}
+
+			// If there's no list item at current index, we'll need to either create one or
+			// drop down to previous index, in which case we have to adjust maxIndent
+			if (listIndex === listsCnt && !hasListItem)
+			{
+				--listIndex;
+			}
+
+			if (hasListItem && listIndex >= 0)
+			{
+				breakParagraph = true;
+
+				// Compute the position and amount of text consumed by the item tag
+				tagPos = matchPos + ignoreLen + indentPos
+				tagLen = m[4].length;
+
+				// Create a LI tag that consumes its markup
+				var itemTag = addStartTag('LI', tagPos, tagLen);
+
+				// Overwrite the markup
+				overwrite(tagPos, tagLen);
+
+				// If the list index is within current lists count it means this is not a new
+				// list and we have to close the last item. Otherwise, it's a new list that we
+				// have to create
+				if (listIndex < listsCnt)
+				{
+					addEndTag('LI', textBoundary, 0).pairWith(lists[listIndex].itemTag);
+
+					// Record the item in the list
+					lists[listIndex].itemTag = itemTag;
+					lists[listIndex].itemTags.push(itemTag);
+				}
+				else
+				{
+					++listsCnt;
+
+					if (listIndex)
+					{
+						minIndent = lists[listIndex - 1].maxIndent + 1;
+						maxIndent = Math.max(minIndent, listIndex * 4);
+					}
+					else
+					{
+						minIndent = 0;
+						maxIndent = indentWidth;
+					}
+
+					// Create a 0-width LIST tag right before the item tag LI
+					var listTag = addStartTag('LIST', tagPos, 0);
+
+					// Test whether the list item ends with a dot, as in "1."
+					if (m[4].indexOf('.') > -1)
+					{
+						listTag.setAttribute('type', 'decimal');
+
+						var start = +m[4];
+						if (start !== 1)
+						{
+							listTag.setAttribute('start', start);
+						}
+					}
+
+					// Record the new list depth
+					lists.push({
+						listTag   : listTag,
+						itemTag   : itemTag,
+						itemTags  : [itemTag],
+						minIndent : minIndent,
+						maxIndent : maxIndent,
+						tight     : true
+					});
+				}
+			}
+
+			// If we're in a list, on a non-empty line preceded with a blank line...
+			if (listsCnt && !continuation && !lineIsEmpty)
+			{
+				// ...and this is not the first item of the list...
+				if (lists[0].itemTags.length > 1 || !hasListItem)
+				{
+					// ...every list that is currently open becomes loose
+					lists.forEach(function(list)
+					{
+						list.tight = false;
+					});
+				}
+			}
+
+			codeIndent = (listsCnt + 1) * 4;
+		}
+
+		if (m[5])
+		{
+			// Headers
+			if (m[5].charAt(0) === '#')
+			{
+				startTagLen = m[5].length;
+				startTagPos = matchPos + matchLen - startTagLen;
+				endTagLen   = getAtxHeaderEndTagLen(matchPos + matchLen, lfPos);
+				endTagPos   = lfPos - endTagLen;
+
+				addTagPair('H' + /#{1,6}/.exec(m[5])[0].length, startTagPos, startTagLen, endTagPos, endTagLen);
+
+				// Mark the start and the end of the header as boundaries
+				markBoundary(startTagPos);
+				markBoundary(lfPos);
+
+				if (continuation)
+				{
+					breakParagraph = true;
+				}
+			}
+			// Code fence
+			else if (m[5].charAt(0) === '`' || m[5].charAt(0) === '~')
+			{
+				tagPos = matchPos + ignoreLen;
+				tagLen = lfPos - tagPos;
+
+				if (codeTag && m[5] === codeFence)
+				{
+					endTag = addEndTag('CODE', tagPos, tagLen, -1);
+					endTag.pairWith(codeTag);
+
+					addIgnoreTag(textBoundary, tagPos - textBoundary);
+
+					// Overwrite the whole block
+					overwrite(codeTag.getPos(), tagPos + tagLen - codeTag.getPos());
+					codeTag = null;
+					codeFence = null;
+				}
+				else if (!codeTag)
+				{
+					// Create code block
+					codeTag   = addStartTag('CODE', tagPos, tagLen);
+					codeFence = m[5].replace(/[^`~]+/, '');
+					codeTag.setAttribute('quoteDepth', quoteDepth);
+
+					// Ignore the next character, which should be a newline
+					addIgnoreTag(tagPos + tagLen, 1);
+
+					// Add the language if present, e.g. ```php
+					var lang = m[5].replace(/^[`~\s]*/, '').replace(/\s+$/, '');
+					if (lang !== '')
+					{
+						codeTag.setAttribute('lang', lang);
+					}
+				}
+			}
+		}
+		else if (m[3] && !listsCnt && text.charAt(matchPos + matchLen) !== "\x17")
+		{
+			// Horizontal rule
+			addSelfClosingTag('HR', matchPos + ignoreLen, matchLen - ignoreLen);
+			breakParagraph = true;
+
+			// Mark the end of the line as a boundary
+			markBoundary(lfPos);
+		}
+		else if (setextLines[lfPos] && setextLines[lfPos].quoteDepth === quoteDepth && !lineIsEmpty && !listsCnt && !codeTag)
+		{
+			// Setext-style header
+			addTagPair(
+				setextLines[lfPos].tagName,
+				matchPos + ignoreLen,
+				0,
+				setextLines[lfPos].endTagPos,
+				setextLines[lfPos].endTagLen
+			);
+
+			// Mark the end of the Setext line
+			markBoundary(setextLines[lfPos].endTagPos + setextLines[lfPos].endTagLen);
+		}
+
+		if (breakParagraph)
+		{
+			addParagraphBreak(textBoundary);
+			markBoundary(textBoundary);
+		}
+
+		if (!lineIsEmpty)
+		{
+			textBoundary = lfPos;
+		}
+
+		if (ignoreLen)
+		{
+			addIgnoreTag(matchPos, ignoreLen, 1000);
+		}
+	});
+}
+
+/**
+* Match all forms of emphasis (emphasis and strong, using underscores or asterisks)
+*/
+function matchEmphasis()
+{
+	matchEmphasisByCharacter('*', /\*+/g);
+	matchEmphasisByCharacter('_', /_+/g);
+}
+
+/**
+* Match emphasis and strong applied using given character
+*
+* @param  {!string} character Markup character, either * or _
+* @param  {!RegExp} regexp    Regexp used to match the series of emphasis character
+*/
+function matchEmphasisByCharacter(character, regexp)
+{
+	var pos = text.indexOf(character);
+	if (pos === -1)
+	{
+		return;
+	}
+
+	getEmphasisByBlock(regexp, pos).forEach(processEmphasisBlock);
+}
+
+/**
+* Match forced line break
+*/
+function matchForcedLineBreaks()
+{
+	var pos = text.indexOf("  \n");
+	while (pos !== -1)
+	{
+		addBrTag(pos + 2);
+		pos = text.indexOf("  \n", pos + 3);
+	}
+}
+
+/**
+* Match images markup
+*/
+function matchImages()
+{
+	var pos = text.indexOf('![');
+	if (pos === -1)
+	{
+		return;
+	}
+	if (text.indexOf('](', pos) > 0)
+	{
+		matchInlineImages();
+	}
+	if (hasRefs)
+	{
+		matchReferenceImages();
+	}
+}
+
+/**
+* Match inline images markup
+*/
+function matchInlineImages()
+{
+	var m, regexp = /!\[(?:[^\x17[\]]|\[[^\x17[\]]*\])*\]\(( *(?:[^\x17\s()]|\([^\x17\s()]*\))*(?=[ )]) *(?:"[^\x17]*?"|'[^\x17]*?'|\([^\x17)]*\))? *)\)/g;
+	while (m = regexp.exec(text))
+	{
+		var linkInfo    = m[1],
+			startTagPos = m['index'],
+			endTagLen   = 3 + linkInfo.length,
+			endTagPos   = startTagPos + m[0].length - endTagLen,
+			alt         = m[0].substr(2, m[0].length - endTagLen - 2);
+
+		addImageTag(startTagPos, endTagPos, endTagLen, linkInfo, alt);
+	}
+}
+
+/**
+* Match reference images markup
+*/
+function matchReferenceImages()
+{
+	var m, regexp = /!\[((?:[^\x17[\]]|\[[^\x17[\]]*\])*)\](?: ?\[([^\x17[\]]+)\])?/g;
+	while (m = regexp.exec(text))
+	{
+		var startTagPos = +m['index'],
+			endTagPos   = startTagPos + 2 + m[1].length,
+			endTagLen   = 1,
+			alt         = m[1],
+			id          = alt;
+
+		if (m[2] > '' && refs[m[2]])
+		{
+			endTagLen = m[0].length - alt.length - 2;
+			id        = m[2];
+		}
+		else if (!refs[id])
+		{
+			continue;
+		}
+
+		addImageTag(startTagPos, endTagPos, endTagLen, refs[id], alt);
+	}
+}
+
+/**
+* Match inline code spans
+*/
+function matchInlineCode()
+{
+	var markers = getInlineCodeMarkers(),
+		i       = -1,
+		cnt     = markers.length;
+	while (++i < (cnt - 1))
+	{
+		var pos = markers[i].next,
+			j   = i;
+		if (text.charAt(markers[i].pos) !== '`')
+		{
+			// Adjust the left marker if its first backtick was escaped
+			++markers[i].pos;
+			--markers[i].len;
+		}
+		while (++j < cnt && markers[j].pos === pos)
+		{
+			if (markers[j].len === markers[i].len)
+			{
+				addInlineCodeTags(markers[i], markers[j]);
+				i = j;
+				break;
+			}
+			pos = markers[j].next;
+		}
+	}
+}
+
+/**
+* Match inline links markup
+*/
+function matchInlineLinks()
+{
+	var m, regexp = /\[(?:[^\x17[\]]|\[[^\x17[\]]*\])*\]\(( *(?:[^\x17\s()]|\([^\x17\s()]*\))*(?=[ )]) *(?:"[^\x17]*?"|'[^\x17]*?'|\([^\x17)]*\))? *)\)/g;
+	while (m = regexp.exec(text))
+	{
+		var linkInfo    = m[1],
+			startTagPos = m['index'],
+			endTagLen   = 3 + linkInfo.length,
+			endTagPos   = startTagPos + m[0].length - endTagLen;
+
+		addLinkTag(startTagPos, endTagPos, endTagLen, linkInfo);
+	}
+}
+
+/**
+* Capture link reference definitions in current text
+*/
+function matchLinkReferences()
+{
+	hasRefs = false;
+	refs    = {};
+	if (text.indexOf(']:') === -1)
+	{
+		return;
+	}
+
+	var m, regexp = /^\x1A* {0,3}\[([^\x17\]]+)\]: *([^\s\x17]+ *(?:"[^\x17]*?"|'[^\x17]*?'|\([^\x17)]*\))?)[^\x17\n]*\n?/gm;
+	while (m = regexp.exec(text))
+	{
+		addIgnoreTag(m['index'], m[0].length, -2);
+
+		// Ignore the reference if it already exists
+		var id = m[1].toLowerCase();
+		if (refs[id])
+		{
+			continue;
+		}
+
+		hasRefs  = true;
+		refs[id] = m[2];
+	}
+}
+
+/**
+* Match inline and reference links
+*/
+function matchLinks()
+{
+	if (text.indexOf('](') !== -1)
+	{
+		matchInlineLinks();
+	}
+	if (hasRefs)
+	{
+		matchReferenceLinks();
+	}
+}
+
+/**
+* Match reference links markup
+*/
+function matchReferenceLinks()
+{
+	var labels = getLabels(), startTagPos;
+	for (startTagPos in labels)
+	{
+		var id        = labels[startTagPos],
+			labelPos  = +startTagPos + 2 + id.length,
+			endTagPos = labelPos - 1,
+			endTagLen = 1;
+
+		if (text.charAt(labelPos) === ' ')
+		{
+			++labelPos;
+		}
+		if (labels[labelPos] > '' && refs[labels[labelPos]])
+		{
+			id        = labels[labelPos];
+			endTagLen = labelPos + 2 + id.length - endTagPos;
+		}
+		if (refs[id])
+		{
+			addLinkTag(+startTagPos, endTagPos, endTagLen, refs[id]);
+		}
+	}
+}
+
+/**
+* Match strikethrough
+*/
+function matchStrikethrough()
+{
+	if (text.indexOf('~~') === -1)
+	{
+		return;
+	}
+
+	var m, regexp = /~~[^\x17]+?~~/g;
+	while (m = regexp.exec(text))
+	{
+		var match    = m[0],
+			matchPos = m['index'],
+			matchLen = match.length;
+
+		addTagPair('DEL', matchPos, 2, matchPos + matchLen - 2, 2);
+	}
+}
+
+/**
+* Match superscript
+*/
+function matchSuperscript()
+{
+	if (text.indexOf('^') === -1)
+	{
+		return;
+	}
+
+	var m, regexp = /\^[^\x17\s]+/g;
+	while (m = regexp.exec(text))
+	{
+		var match       = m[0],
+			matchPos    = m['index'],
+			matchLen    = match.length,
+			startTagPos = matchPos,
+			endTagPos   = matchPos + matchLen;
+
+		var parts = match.split('^');
+		parts.shift();
+
+		parts.forEach(function(part)
+		{
+			addTagPair('SUP', startTagPos, 1, endTagPos, 0);
+			startTagPos += 1 + part.length;
+		});
+	}
+}
+
+/**
+* Overwrite part of the text with substitution characters ^Z (0x1A)
+*
+* @param  {!number} pos Start of the range
+* @param  {!number} len Length of text to overwrite
+*/
+function overwrite(pos, len)
+{
+	text = text.substr(0, pos) + new Array(1 + len).join("\x1A") + text.substr(pos + len);
+}
+
+/**
+* Process a list of emphasis markup strings
+*
+* @param {!Array<!Array<!number>>} block List of [matchPos, matchLen] pairs
+*/
+function processEmphasisBlock(block)
+{
+	var buffered  = 0,
+		emPos     = -1,
+		strongPos = -1,
+		pair,
+		remaining;
+
+	block.forEach(function(pair)
+	{
+		var matchPos     = pair[0],
+			matchLen     = pair[1],
+			closeLen     = Math.min(3, matchLen),
+			closeEm      = closeLen & buffered & 1,
+			closeStrong  = closeLen & buffered & 2,
+			emEndPos     = matchPos,
+			strongEndPos = matchPos;
+
+		if (buffered > 2 && emPos === strongPos)
+		{
+			if (closeEm)
+			{
+				emPos += 2;
+			}
+			else
+			{
+				++strongPos;
+			}
+		}
+
+		if (closeEm && closeStrong)
+		{
+			if (emPos < strongPos)
+			{
+				emEndPos += 2;
+			}
+			else
+			{
+				++strongEndPos;
+			}
+		}
+
+		remaining = matchLen;
+		if (closeEm)
+		{
+			--buffered;
+			--remaining;
+			addTagPair('EM', emPos, 1, emEndPos, 1);
+		}
+		if (closeStrong)
+		{
+			buffered  -= 2;
+			remaining -= 2;
+			addTagPair('STRONG', strongPos, 2, strongEndPos, 2);
+		}
+
+		remaining = Math.min(3, remaining);
+		if (remaining & 1)
+		{
+			emPos = matchPos + matchLen - remaining;
+		}
+		if (remaining & 2)
+		{
+			strongPos = matchPos + matchLen - remaining;
+		}
+		buffered += remaining;
+	});
+}
+
+/**
+* Set a URL or IMG tag's attributes
+*
+* @param {!Tag}    tag      URL or IMG tag
+* @param {!string} linkInfo Link's info: an URL optionally followed by spaces and a title
+* @param {!string} attrName Name of the URL attribute
+*/
+function setLinkAttributes(tag, linkInfo, attrName)
+{
+	var url   = linkInfo.replace(/^\s*/, '').replace(/\s*$/, ''),
+		title = '',
+		pos   = url.indexOf(' ')
+	if (pos !== -1)
+	{
+		title = url.substr(pos).replace(/^\s*\S/, '').replace(/\S\s*$/, '');
+		url   = url.substr(0, pos);
+	}
+
+	tag.setAttribute(attrName, decode(url));
+	if (title > '')
+	{
+		tag.setAttribute('title', decode(title));
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Litedown/Parser.php
@@ -0,0 +1,735 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Litedown;
+use s9e\TextFormatter\Parser as Rules;
+use s9e\TextFormatter\Parser\Tag;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	protected $hasEscapedChars;
+	protected $hasRefs;
+	protected $refs;
+	protected $text;
+	public function parse($text, array $matches)
+	{
+		$this->init($text);
+		$this->matchBlockLevelMarkup();
+		$this->matchLinkReferences();
+		$this->matchInlineCode();
+		$this->matchImages();
+		$this->matchLinks();
+		$this->matchStrikethrough();
+		$this->matchSuperscript();
+		$this->matchEmphasis();
+		$this->matchForcedLineBreaks();
+		unset($this->text);
+	}
+	protected function addImageTag($startTagPos, $endTagPos, $endTagLen, $linkInfo, $alt)
+	{
+		$tag = $this->parser->addTagPair('IMG', $startTagPos, 2, $endTagPos, $endTagLen);
+		$this->setLinkAttributes($tag, $linkInfo, 'src');
+		$tag->setAttribute('alt', $this->decode($alt));
+		$this->overwrite($startTagPos, $endTagPos + $endTagLen - $startTagPos);
+	}
+	protected function addInlineCodeTags($left, $right)
+	{
+		$startTagPos = $left['pos'];
+		$startTagLen = $left['len'] + $left['trimAfter'];
+		$endTagPos   = $right['pos'] - $right['trimBefore'];
+		$endTagLen   = $right['len'] + $right['trimBefore'];
+		$this->parser->addTagPair('C', $startTagPos, $startTagLen, $endTagPos, $endTagLen);
+		$this->overwrite($startTagPos, $endTagPos + $endTagLen - $startTagPos);
+	}
+	protected function addLinkTag($startTagPos, $endTagPos, $endTagLen, $linkInfo)
+	{
+		$priority = ($endTagLen === 1) ? 1 : -1;
+		$tag = $this->parser->addTagPair('URL', $startTagPos, 1, $endTagPos, $endTagLen, $priority);
+		$this->setLinkAttributes($tag, $linkInfo, 'url');
+		$this->overwrite($startTagPos, 1);
+		$this->overwrite($endTagPos,   $endTagLen);
+	}
+	protected function closeList(array $list, $textBoundary)
+	{
+		$this->parser->addEndTag('LIST', $textBoundary, 0)->pairWith($list['listTag']);
+		$this->parser->addEndTag('LI',   $textBoundary, 0)->pairWith($list['itemTag']);
+		if ($list['tight'])
+			foreach ($list['itemTags'] as $itemTag)
+				$itemTag->removeFlags(Rules::RULE_CREATE_PARAGRAPHS);
+	}
+	protected function computeQuoteIgnoreLen($str, $maxQuoteDepth)
+	{
+		$remaining = $str;
+		while (--$maxQuoteDepth >= 0)
+			$remaining = \preg_replace('/^ *> ?/', '', $remaining);
+		return \strlen($str) - \strlen($remaining);
+	}
+	protected function decode($str)
+	{
+		if ($this->config['decodeHtmlEntities'] && \strpos($str, '&') !== \false)
+			$str = \html_entity_decode($str, \ENT_QUOTES, 'UTF-8');
+		$str = \str_replace("\x1A", '', $str);
+		if ($this->hasEscapedChars)
+			$str = \strtr(
+				$str,
+				array(
+					"\x1B0" => '!', "\x1B1" => '"', "\x1B2" => "'", "\x1B3" => '(',
+					"\x1B4" => ')', "\x1B5" => '*', "\x1B6" => '[', "\x1B7" => '\\',
+					"\x1B8" => ']', "\x1B9" => '^', "\x1BA" => '_', "\x1BB" => '`',
+					"\x1BC" => '~'
+				)
+			);
+		return $str;
+	}
+	protected function encode($str)
+	{
+		return \strtr(
+			$str,
+			array(
+				'\\!' => "\x1B0", '\\"' => "\x1B1", "\\'" => "\x1B2", '\\('  => "\x1B3",
+				'\\)' => "\x1B4", '\\*' => "\x1B5", '\\[' => "\x1B6", '\\\\' => "\x1B7",
+				'\\]' => "\x1B8", '\\^' => "\x1B9", '\\_' => "\x1BA", '\\`'  => "\x1BB",
+				'\\~' => "\x1BC"
+			)
+		);
+	}
+	protected function getAtxHeaderEndTagLen($startPos, $endPos)
+	{
+		$content = \substr($this->text, $startPos, $endPos - $startPos);
+		\preg_match('/[ \\t]*#*[ \\t]*$/', $content, $m);
+		return \strlen($m[0]);
+	}
+	protected function getSetextLines()
+	{
+		$setextLines = array();
+		if (\strpos($this->text, '-') === \false && \strpos($this->text, '=') === \false)
+			return $setextLines;
+		$regexp = '/^(?=[-=>])(?:> ?)*(?=[-=])(?:-+|=+) *$/m';
+		if (\preg_match_all($regexp, $this->text, $matches, \PREG_OFFSET_CAPTURE))
+			foreach ($matches[0] as $_f570d26d)
+			{
+				list($match, $matchPos) = $_f570d26d;
+				$endTagPos = $matchPos - 1;
+				while ($endTagPos > 0 && $this->text[$endTagPos - 1] === ' ')
+					--$endTagPos;
+				$setextLines[$matchPos - 1] = array(
+					'endTagLen'  => $matchPos + \strlen($match) - $endTagPos,
+					'endTagPos'  => $endTagPos,
+					'quoteDepth' => \substr_count($match, '>'),
+					'tagName'    => ($match[0] === '=') ? 'H1' : 'H2'
+				);
+			}
+		return $setextLines;
+	}
+	protected function getEmphasisByBlock($regexp, $pos)
+	{
+		$block    = array();
+		$blocks   = array();
+		$breakPos = \strpos($this->text, "\x17", $pos);
+		\preg_match_all($regexp, $this->text, $matches, \PREG_OFFSET_CAPTURE, $pos);
+		foreach ($matches[0] as $m)
+		{
+			$matchPos = $m[1];
+			$matchLen = \strlen($m[0]);
+			if ($matchPos > $breakPos)
+			{
+				$blocks[] = $block;
+				$block    = array();
+				$breakPos = \strpos($this->text, "\x17", $matchPos);
+			}
+			if (!$this->ignoreEmphasis($matchPos, $matchLen))
+				$block[] = array($matchPos, $matchLen);
+		}
+		$blocks[] = $block;
+		return $blocks;
+	}
+	protected function getInlineCodeMarkers()
+	{
+		$pos = \strpos($this->text, '`');
+		if ($pos === \false)
+			return array();
+		\preg_match_all(
+			'/(`+)(\\s*)[^\\x17`]*/',
+			\str_replace("\x1BB", '\\`', $this->text),
+			$matches,
+			\PREG_OFFSET_CAPTURE | \PREG_SET_ORDER,
+			$pos
+		);
+		$trimNext = 0;
+		$markers  = array();
+		foreach ($matches as $m)
+		{
+			$markers[] = array(
+				'pos'        => $m[0][1],
+				'len'        => \strlen($m[1][0]),
+				'trimBefore' => $trimNext,
+				'trimAfter'  => \strlen($m[2][0]),
+				'next'       => $m[0][1] + \strlen($m[0][0])
+			);
+			$trimNext = \strlen($m[0][0]) - \strlen(\rtrim($m[0][0]));
+		}
+		return $markers;
+	}
+	protected function getLabels()
+	{
+		\preg_match_all(
+			'/\\[((?:[^\\x17[\\]]|\\[[^\\x17[\\]]*\\])*)\\]/',
+			$this->text,
+			$matches,
+			\PREG_OFFSET_CAPTURE
+		);
+		$labels = array();
+		foreach ($matches[1] as $m)
+			$labels[$m[1] - 1] = \strtolower($m[0]);
+		return $labels;
+	}
+	protected function ignoreEmphasis($matchPos, $matchLen)
+	{
+		return ($this->text[$matchPos] === '_' && $matchLen === 1 && $this->isSurroundedByAlnum($matchPos, $matchLen));
+	}
+	protected function init($text)
+	{
+		if (\strpos($text, '\\') === \false || !\preg_match('/\\\\[!"\'()*[\\\\\\]^_`~]/', $text))
+			$this->hasEscapedChars = \false;
+		else
+		{
+			$this->hasEscapedChars = \true;
+			$text = $this->encode($text);
+		}
+		$text .= "\n\n\x17";
+		$this->text = $text;
+	}
+	protected function isAlnum($chr)
+	{
+		return (\strpos(' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', $chr) > 0);
+	}
+	protected function isSurroundedByAlnum($matchPos, $matchLen)
+	{
+		return ($matchPos > 0 && $this->isAlnum($this->text[$matchPos - 1]) && $this->isAlnum($this->text[$matchPos + $matchLen]));
+	}
+	protected function markBoundary($pos)
+	{
+		$this->text[$pos] = "\x17";
+	}
+	protected function matchBlockLevelMarkup()
+	{
+		$codeFence    = \null;
+		$codeIndent   = 4;
+		$codeTag      = \null;
+		$lineIsEmpty  = \true;
+		$lists        = array();
+		$listsCnt     = 0;
+		$newContext   = \false;
+		$quotes       = array();
+		$quotesCnt    = 0;
+		$setextLines  = $this->getSetextLines();
+		$textBoundary = 0;
+		$regexp = '/^(?:(?=[-*+\\d \\t>`~#_])((?: {0,3}> ?)+)?([ \\t]+)?(\\* *\\* *\\*[* ]*$|- *- *-[- ]*$|_ *_ *_[_ ]*$|=+$)?((?:[-*+]|\\d+\\.)[ \\t]+(?=\\S))?[ \\t]*(#{1,6}[ \\t]+|```+[^`\\n]*$|~~~+[^~\\n]*$)?)?/m';
+		\preg_match_all($regexp, $this->text, $matches, \PREG_OFFSET_CAPTURE | \PREG_SET_ORDER);
+		foreach ($matches as $m)
+		{
+			$matchPos   = $m[0][1];
+			$matchLen   = \strlen($m[0][0]);
+			$ignoreLen  = 0;
+			$quoteDepth = 0;
+			$continuation = !$lineIsEmpty;
+			$lfPos       = \strpos($this->text, "\n", $matchPos);
+			$lineIsEmpty = ($lfPos === $matchPos + $matchLen && empty($m[3][0]) && empty($m[4][0]) && empty($m[5][0]));
+			$breakParagraph = ($lineIsEmpty && $continuation);
+			if (!empty($m[1][0]))
+			{
+				$quoteDepth = \substr_count($m[1][0], '>');
+				$ignoreLen  = \strlen($m[1][0]);
+				if (isset($codeTag) && $codeTag->hasAttribute('quoteDepth'))
+				{
+					$quoteDepth = \min($quoteDepth, $codeTag->getAttribute('quoteDepth'));
+					$ignoreLen  = $this->computeQuoteIgnoreLen($m[1][0], $quoteDepth);
+				}
+				$this->overwrite($matchPos, $ignoreLen);
+			}
+			if ($quoteDepth < $quotesCnt && !$continuation)
+			{
+				$newContext = \true;
+				do
+				{
+					$this->parser->addEndTag('QUOTE', $textBoundary, 0)
+					             ->pairWith(\array_pop($quotes));
+				}
+				while ($quoteDepth < --$quotesCnt);
+			}
+			if ($quoteDepth > $quotesCnt && !$lineIsEmpty)
+			{
+				$newContext = \true;
+				do
+				{
+					$tag = $this->parser->addStartTag('QUOTE', $matchPos, 0, $quotesCnt - 999);
+					$quotes[] = $tag;
+				}
+				while ($quoteDepth > ++$quotesCnt);
+			}
+			$indentWidth = 0;
+			$indentPos   = 0;
+			if (!empty($m[2][0]) && !$codeFence)
+			{
+				$indentStr = $m[2][0];
+				$indentLen = \strlen($indentStr);
+				do
+				{
+					if ($indentStr[$indentPos] === ' ')
+						++$indentWidth;
+					else
+						$indentWidth = ($indentWidth + 4) & ~3;
+				}
+				while (++$indentPos < $indentLen && $indentWidth < $codeIndent);
+			}
+			if (isset($codeTag) && !$codeFence && $indentWidth < $codeIndent && !$lineIsEmpty)
+				$newContext = \true;
+			if ($newContext)
+			{
+				$newContext = \false;
+				if (isset($codeTag))
+				{
+					$this->overwrite($codeTag->getPos(), $textBoundary - $codeTag->getPos());
+					$endTag = $this->parser->addEndTag('CODE', $textBoundary, 0, -1);
+					$endTag->pairWith($codeTag);
+					$codeTag = \null;
+					$codeFence = \null;
+				}
+				foreach ($lists as $list)
+					$this->closeList($list, $textBoundary);
+				$lists    = array();
+				$listsCnt = 0;
+				if ($matchPos)
+					$this->markBoundary($matchPos - 1);
+			}
+			if ($indentWidth >= $codeIndent)
+			{
+				if (isset($codeTag) || !$continuation)
+				{
+					$ignoreLen += $indentPos;
+					if (!isset($codeTag))
+						$codeTag = $this->parser->addStartTag('CODE', $matchPos + $ignoreLen, 0, -999);
+					$m = array();
+				}
+			}
+			else
+			{
+				$hasListItem = !empty($m[4][0]);
+				if (!$indentWidth && !$continuation && !$hasListItem)
+					$listIndex = -1;
+				elseif ($continuation && !$hasListItem)
+					$listIndex = $listsCnt - 1;
+				elseif (!$listsCnt)
+					if ($hasListItem && (!$continuation || $this->text[$matchPos - 1] === "\x17"))
+						$listIndex = 0;
+					else
+						$listIndex = -1;
+				else
+				{
+					$listIndex = 0;
+					while ($listIndex < $listsCnt && $indentWidth > $lists[$listIndex]['maxIndent'])
+						++$listIndex;
+				}
+				while ($listIndex < $listsCnt - 1)
+				{
+					$this->closeList(\array_pop($lists), $textBoundary);
+					--$listsCnt;
+				}
+				if ($listIndex === $listsCnt && !$hasListItem)
+					--$listIndex;
+				if ($hasListItem && $listIndex >= 0)
+				{
+					$breakParagraph = \true;
+					$tagPos = $matchPos + $ignoreLen + $indentPos;
+					$tagLen = \strlen($m[4][0]);
+					$itemTag = $this->parser->addStartTag('LI', $tagPos, $tagLen);
+					$this->overwrite($tagPos, $tagLen);
+					if ($listIndex < $listsCnt)
+					{
+						$this->parser->addEndTag('LI', $textBoundary, 0)
+						             ->pairWith($lists[$listIndex]['itemTag']);
+						$lists[$listIndex]['itemTag']    = $itemTag;
+						$lists[$listIndex]['itemTags'][] = $itemTag;
+					}
+					else
+					{
+						++$listsCnt;
+						if ($listIndex)
+						{
+							$minIndent = $lists[$listIndex - 1]['maxIndent'] + 1;
+							$maxIndent = \max($minIndent, $listIndex * 4);
+						}
+						else
+						{
+							$minIndent = 0;
+							$maxIndent = $indentWidth;
+						}
+						$listTag = $this->parser->addStartTag('LIST', $tagPos, 0);
+						if (\strpos($m[4][0], '.') !== \false)
+						{
+							$listTag->setAttribute('type', 'decimal');
+							$start = (int) $m[4][0];
+							if ($start !== 1)
+								$listTag->setAttribute('start', $start);
+						}
+						$lists[] = array(
+							'listTag'   => $listTag,
+							'itemTag'   => $itemTag,
+							'itemTags'  => array($itemTag),
+							'minIndent' => $minIndent,
+							'maxIndent' => $maxIndent,
+							'tight'     => \true
+						);
+					}
+				}
+				if ($listsCnt && !$continuation && !$lineIsEmpty)
+					if (\count($lists[0]['itemTags']) > 1 || !$hasListItem)
+					{
+						foreach ($lists as &$list)
+							$list['tight'] = \false;
+						unset($list);
+					}
+				$codeIndent = ($listsCnt + 1) * 4;
+			}
+			if (isset($m[5]))
+			{
+				if ($m[5][0][0] === '#')
+				{
+					$startTagLen = \strlen($m[5][0]);
+					$startTagPos = $matchPos + $matchLen - $startTagLen;
+					$endTagLen   = $this->getAtxHeaderEndTagLen($matchPos + $matchLen, $lfPos);
+					$endTagPos   = $lfPos - $endTagLen;
+					$this->parser->addTagPair('H' . \strspn($m[5][0], '#', 0, 6), $startTagPos, $startTagLen, $endTagPos, $endTagLen);
+					$this->markBoundary($startTagPos);
+					$this->markBoundary($lfPos);
+					if ($continuation)
+						$breakParagraph = \true;
+				}
+				elseif ($m[5][0][0] === '`' || $m[5][0][0] === '~')
+				{
+					$tagPos = $matchPos + $ignoreLen;
+					$tagLen = $lfPos - $tagPos;
+					if (isset($codeTag) && $m[5][0] === $codeFence)
+					{
+						$endTag = $this->parser->addEndTag('CODE', $tagPos, $tagLen, -1);
+						$endTag->pairWith($codeTag);
+						$this->parser->addIgnoreTag($textBoundary, $tagPos - $textBoundary);
+						$this->overwrite($codeTag->getPos(), $tagPos + $tagLen - $codeTag->getPos());
+						$codeTag = \null;
+						$codeFence = \null;
+					}
+					elseif (!isset($codeTag))
+					{
+						$codeTag   = $this->parser->addStartTag('CODE', $tagPos, $tagLen);
+						$codeFence = \substr($m[5][0], 0, \strspn($m[5][0], '`~'));
+						$codeTag->setAttribute('quoteDepth', $quoteDepth);
+						$this->parser->addIgnoreTag($tagPos + $tagLen, 1);
+						$lang = \trim(\trim($m[5][0], '`~'));
+						if ($lang !== '')
+							$codeTag->setAttribute('lang', $lang);
+					}
+				}
+			}
+			elseif (!empty($m[3][0]) && !$listsCnt && $this->text[$matchPos + $matchLen] !== "\x17")
+			{
+				$this->parser->addSelfClosingTag('HR', $matchPos + $ignoreLen, $matchLen - $ignoreLen);
+				$breakParagraph = \true;
+				$this->markBoundary($lfPos);
+			}
+			elseif (isset($setextLines[$lfPos]) && $setextLines[$lfPos]['quoteDepth'] === $quoteDepth && !$lineIsEmpty && !$listsCnt && !isset($codeTag))
+			{
+				$this->parser->addTagPair(
+					$setextLines[$lfPos]['tagName'],
+					$matchPos + $ignoreLen,
+					0,
+					$setextLines[$lfPos]['endTagPos'],
+					$setextLines[$lfPos]['endTagLen']
+				);
+				$this->markBoundary($setextLines[$lfPos]['endTagPos'] + $setextLines[$lfPos]['endTagLen']);
+			}
+			if ($breakParagraph)
+			{
+				$this->parser->addParagraphBreak($textBoundary);
+				$this->markBoundary($textBoundary);
+			}
+			if (!$lineIsEmpty)
+				$textBoundary = $lfPos;
+			if ($ignoreLen)
+				$this->parser->addIgnoreTag($matchPos, $ignoreLen, 1000);
+		}
+	}
+	protected function matchEmphasis()
+	{
+		$this->matchEmphasisByCharacter('*', '/\\*+/');
+		$this->matchEmphasisByCharacter('_', '/_+/');
+	}
+	protected function matchEmphasisByCharacter($character, $regexp)
+	{
+		$pos = \strpos($this->text, $character);
+		if ($pos === \false)
+			return;
+		foreach ($this->getEmphasisByBlock($regexp, $pos) as $block)
+			$this->processEmphasisBlock($block);
+	}
+	protected function matchForcedLineBreaks()
+	{
+		$pos = \strpos($this->text, "  \n");
+		while ($pos !== \false)
+		{
+			$this->parser->addBrTag($pos + 2);
+			$pos = \strpos($this->text, "  \n", $pos + 3);
+		}
+	}
+	protected function matchImages()
+	{
+		$pos = \strpos($this->text, '![');
+		if ($pos === \false)
+			return;
+		if (\strpos($this->text, '](', $pos) !== \false)
+			$this->matchInlineImages();
+		if ($this->hasRefs)
+			$this->matchReferenceImages();
+	}
+	protected function matchInlineImages()
+	{
+		\preg_match_all(
+			'/!\\[(?:[^\\x17[\\]]|\\[[^\\x17[\\]]*\\])*\\]\\(( *(?:[^\\x17\\s()]|\\([^\\x17\\s()]*\\))*(?=[ )]) *(?:"[^\\x17]*?"|\'[^\\x17]*?\'|\\([^\\x17)]*\\))? *)\\)/',
+			$this->text,
+			$matches,
+			\PREG_OFFSET_CAPTURE | \PREG_SET_ORDER
+		);
+		foreach ($matches as $m)
+		{
+			$linkInfo    = $m[1][0];
+			$startTagPos = $m[0][1];
+			$endTagLen   = 3 + \strlen($linkInfo);
+			$endTagPos   = $startTagPos + \strlen($m[0][0]) - $endTagLen;
+			$alt         = \substr($m[0][0], 2, \strlen($m[0][0]) - $endTagLen - 2);
+			$this->addImageTag($startTagPos, $endTagPos, $endTagLen, $linkInfo, $alt);
+		}
+	}
+	protected function matchReferenceImages()
+	{
+		\preg_match_all(
+			'/!\\[((?:[^\\x17[\\]]|\\[[^\\x17[\\]]*\\])*)\\](?: ?\\[([^\\x17[\\]]+)\\])?/',
+			$this->text,
+			$matches,
+			\PREG_OFFSET_CAPTURE | \PREG_SET_ORDER
+		);
+		foreach ($matches as $m)
+		{
+			$startTagPos = $m[0][1];
+			$endTagPos   = $startTagPos + 2 + \strlen($m[1][0]);
+			$endTagLen   = 1;
+			$alt         = $m[1][0];
+			$id          = $alt;
+			if (isset($m[2][0], $this->refs[$m[2][0]]))
+			{
+				$endTagLen = \strlen($m[0][0]) - \strlen($alt) - 2;
+				$id        = $m[2][0];
+			}
+			elseif (!isset($this->refs[$id]))
+				continue;
+			$this->addImageTag($startTagPos, $endTagPos, $endTagLen, $this->refs[$id], $alt);
+		}
+	}
+	protected function matchInlineCode()
+	{
+		$markers = $this->getInlineCodeMarkers();
+		$i       = -1;
+		$cnt     = \count($markers);
+		while (++$i < ($cnt - 1))
+		{
+			$pos = $markers[$i]['next'];
+			$j   = $i;
+			if ($this->text[$markers[$i]['pos']] !== '`')
+			{
+				++$markers[$i]['pos'];
+				--$markers[$i]['len'];
+			}
+			while (++$j < $cnt && $markers[$j]['pos'] === $pos)
+			{
+				if ($markers[$j]['len'] === $markers[$i]['len'])
+				{
+					$this->addInlineCodeTags($markers[$i], $markers[$j]);
+					$i = $j;
+					break;
+				}
+				$pos = $markers[$j]['next'];
+			}
+		}
+	}
+	protected function matchInlineLinks()
+	{
+		\preg_match_all(
+			'/\\[(?:[^\\x17[\\]]|\\[[^\\x17[\\]]*\\])*\\]\\(( *(?:[^\\x17\\s()]|\\([^\\x17\\s()]*\\))*(?=[ )]) *(?:"[^\\x17]*?"|\'[^\\x17]*?\'|\\([^\\x17)]*\\))? *)\\)/',
+			$this->text,
+			$matches,
+			\PREG_OFFSET_CAPTURE | \PREG_SET_ORDER
+		);
+		foreach ($matches as $m)
+		{
+			$linkInfo    = $m[1][0];
+			$startTagPos = $m[0][1];
+			$endTagLen   = 3 + \strlen($linkInfo);
+			$endTagPos   = $startTagPos + \strlen($m[0][0]) - $endTagLen;
+			$this->addLinkTag($startTagPos, $endTagPos, $endTagLen, $linkInfo);
+		}
+	}
+	protected function matchLinkReferences()
+	{
+		$this->hasRefs = \false;
+		$this->refs    = array();
+		if (\strpos($this->text, ']:') === \false)
+			return;
+		$regexp = '/^\\x1A* {0,3}\\[([^\\x17\\]]+)\\]: *([^\\s\\x17]+ *(?:"[^\\x17]*?"|\'[^\\x17]*?\'|\\([^\\x17)]*\\))?)[^\\x17\\n]*\\n?/m';
+		\preg_match_all($regexp, $this->text, $matches, \PREG_OFFSET_CAPTURE | \PREG_SET_ORDER);
+		foreach ($matches as $m)
+		{
+			$this->parser->addIgnoreTag($m[0][1], \strlen($m[0][0]), -2);
+			$id = \strtolower($m[1][0]);
+			if (isset($this->refs[$id]))
+				continue;
+			$this->hasRefs   = \true;
+			$this->refs[$id] = $m[2][0];
+		}
+	}
+	protected function matchLinks()
+	{
+		if (\strpos($this->text, '](') !== \false)
+			$this->matchInlineLinks();
+		if ($this->hasRefs)
+			$this->matchReferenceLinks();
+	}
+	protected function matchReferenceLinks()
+	{
+		$labels = $this->getLabels();
+		foreach ($labels as $startTagPos => $id)
+		{
+			$labelPos  = $startTagPos + 2 + \strlen($id);
+			$endTagPos = $labelPos - 1;
+			$endTagLen = 1;
+			if ($this->text[$labelPos] === ' ')
+				++$labelPos;
+			if (isset($labels[$labelPos], $this->refs[$labels[$labelPos]]))
+			{
+				$id        = $labels[$labelPos];
+				$endTagLen = $labelPos + 2 + \strlen($id) - $endTagPos;
+			}
+			if (isset($this->refs[$id]))
+				$this->addLinkTag($startTagPos, $endTagPos, $endTagLen, $this->refs[$id]);
+		}
+	}
+	protected function matchStrikethrough()
+	{
+		$pos = \strpos($this->text, '~~');
+		if ($pos === \false)
+			return;
+		\preg_match_all(
+			'/~~[^\\x17]+?~~/',
+			$this->text,
+			$matches,
+			\PREG_OFFSET_CAPTURE,
+			$pos
+		);
+		foreach ($matches[0] as $_4b034d25)
+		{
+			list($match, $matchPos) = $_4b034d25;
+			$matchLen = \strlen($match);
+			$this->parser->addTagPair('DEL', $matchPos, 2, $matchPos + $matchLen - 2, 2);
+		}
+	}
+	protected function matchSuperscript()
+	{
+		$pos = \strpos($this->text, '^');
+		if ($pos === \false)
+			return;
+		\preg_match_all(
+			'/\\^[^\\x17\\s]++/',
+			$this->text,
+			$matches,
+			\PREG_OFFSET_CAPTURE,
+			$pos
+		);
+		foreach ($matches[0] as $_4b034d25)
+		{
+			list($match, $matchPos) = $_4b034d25;
+			$matchLen    = \strlen($match);
+			$startTagPos = $matchPos;
+			$endTagPos   = $matchPos + $matchLen;
+			$parts = \explode('^', $match);
+			unset($parts[0]);
+			foreach ($parts as $part)
+			{
+				$this->parser->addTagPair('SUP', $startTagPos, 1, $endTagPos, 0);
+				$startTagPos += 1 + \strlen($part);
+			}
+		}
+	}
+	protected function overwrite($pos, $len)
+	{
+		$this->text = \substr($this->text, 0, $pos) . \str_repeat("\x1A", $len) . \substr($this->text, $pos + $len);
+	}
+	protected function processEmphasisBlock(array $block)
+	{
+		$buffered  = 0;
+		$emPos     = -1;
+		$strongPos = -1;
+		foreach ($block as $_aab3a45e)
+		{
+			list($matchPos, $matchLen) = $_aab3a45e;
+			$closeLen     = \min(3, $matchLen);
+			$closeEm      = $closeLen & $buffered & 1;
+			$closeStrong  = $closeLen & $buffered & 2;
+			$emEndPos     = $matchPos;
+			$strongEndPos = $matchPos;
+			if ($buffered > 2 && $emPos === $strongPos)
+				if ($closeEm)
+					$emPos += 2;
+				else
+					++$strongPos;
+			if ($closeEm && $closeStrong)
+				if ($emPos < $strongPos)
+					$emEndPos += 2;
+				else
+					++$strongEndPos;
+			$remaining = $matchLen;
+			if ($closeEm)
+			{
+				--$buffered;
+				--$remaining;
+				$this->parser->addTagPair('EM', $emPos, 1, $emEndPos, 1);
+			}
+			if ($closeStrong)
+			{
+				$buffered  -= 2;
+				$remaining -= 2;
+				$this->parser->addTagPair('STRONG', $strongPos, 2, $strongEndPos, 2);
+			}
+			$remaining = \min(3, $remaining);
+			if ($remaining & 1)
+				$emPos = $matchPos + $matchLen - $remaining;
+			if ($remaining & 2)
+				$strongPos = $matchPos + $matchLen - $remaining;
+			$buffered += $remaining;
+		}
+	}
+	protected function setLinkAttributes(Tag $tag, $linkInfo, $attrName)
+	{
+		$url   = \trim($linkInfo);
+		$title = '';
+		$pos   = \strpos($url, ' ');
+		if ($pos !== \false)
+		{
+			$title = \substr(\trim(\substr($url, $pos)), 1, -1);
+			$url   = \substr($url, 0, $pos);
+		}
+		$tag->setAttribute($attrName, $this->decode($url));
+		if ($title > '')
+			$tag->setAttribute('title', $this->decode($title));
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator.php
@@ -0,0 +1,205 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\MediaEmbed;
+use InvalidArgumentException;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Helpers\RegexpBuilder;
+use s9e\TextFormatter\Configurator\Items\Attribute;
+use s9e\TextFormatter\Configurator\Items\AttributeFilters\RegexpFilter;
+use s9e\TextFormatter\Configurator\Items\AttributePreprocessor;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+use s9e\TextFormatter\Plugins\MediaEmbed\Configurator\Collections\CachedDefinitionCollection;
+use s9e\TextFormatter\Plugins\MediaEmbed\Configurator\Collections\SiteCollection;
+use s9e\TextFormatter\Plugins\MediaEmbed\Configurator\TemplateBuilder;
+class Configurator extends ConfiguratorBase
+{
+	public $allowedFilters = array(
+		'hexdec',
+		'urldecode'
+	);
+	protected $appendTemplate = '';
+	protected $captureURLs = \true;
+	protected $collection;
+	protected $createMediaBBCode = \true;
+	public $createIndividualBBCodes = \false;
+	public $defaultSites;
+	protected $tagName = 'MEDIA';
+	protected $templateBuilder;
+	protected function setUp()
+	{
+		$this->collection = new SiteCollection;
+		$this->configurator->registeredVars['mediasites'] = $this->collection;
+		$tag = $this->configurator->tags->add($this->tagName);
+		$tag->rules->autoClose();
+		$tag->rules->denyChild($this->tagName);
+		$tag->filterChain->clear();
+		$tag->filterChain
+		    ->append(array(__NAMESPACE__ . '\\Parser', 'filterTag'))
+		    ->addParameterByName('parser')
+		    ->addParameterByName('mediasites')
+		    ->setJS(\file_get_contents(__DIR__ . '/Parser/tagFilter.js'));
+		if ($this->createMediaBBCode)
+			$this->configurator->BBCodes->set(
+				$this->tagName,
+				array(
+					'contentAttributes' => array('url'),
+					'defaultAttribute'  => 'site'
+				)
+			);
+		if (!isset($this->defaultSites))
+			$this->defaultSites = new CachedDefinitionCollection;
+		$this->templateBuilder = new TemplateBuilder;
+	}
+	public function asConfig()
+	{
+		if (!$this->captureURLs || !\count($this->collection))
+			return;
+		$regexp  = 'https?:\\/\\/';
+		$schemes = $this->getSchemes();
+		if (!empty($schemes))
+			$regexp = '(?>' . RegexpBuilder::fromList($schemes) . ':|' . $regexp . ')';
+		return array(
+			'quickMatch' => (empty($schemes)) ? '://' : ':',
+			'regexp'     => '/\\b' . $regexp . '[^["\'\\s]+/Si',
+			'tagName'    => $this->tagName
+		);
+	}
+	public function add($siteId, array $siteConfig = \null)
+	{
+		$siteId = $this->normalizeId($siteId);
+		if (!isset($siteConfig))
+			$siteConfig = $this->defaultSites->get($siteId);
+		$this->collection[$siteId] = $siteConfig;
+		$tag = new Tag;
+		$tag->rules->autoClose();
+		$tag->rules->denyChild($siteId);
+		$tag->rules->denyChild($this->tagName);
+		$attributes = array(
+			'url' => array('type' => 'url')
+		);
+		if (isset($siteConfig['scrape']))
+			$attributes += $this->addScrapes($tag, $siteConfig['scrape']);
+		if (isset($siteConfig['extract']))
+			foreach ((array) $siteConfig['extract'] as $regexp)
+			{
+				$attrRegexps = $tag->attributePreprocessors->add('url', $regexp)->getAttributes();
+				foreach ($attrRegexps as $attrName => $attrRegexp)
+					$attributes[$attrName]['regexp'] = $attrRegexp;
+			}
+		if (isset($siteConfig['attributes']))
+			foreach ($siteConfig['attributes'] as $attrName => $attrConfig)
+				foreach ($attrConfig as $configName => $configValue)
+					$attributes[$attrName][$configName] = $configValue;
+		$hasRequiredAttribute = \false;
+		foreach ($attributes as $attrName => $attrConfig)
+		{
+			$attribute = $tag->attributes->add($attrName);
+			if (isset($attrConfig['preFilter']))
+				$this->appendFilter($attribute, $attrConfig['preFilter']);
+			if (isset($attrConfig['type']))
+			{
+				$filter = $this->configurator->attributeFilters['#' . $attrConfig['type']];
+				$attribute->filterChain->append($filter);
+			}
+			elseif (isset($attrConfig['regexp']))
+				$attribute->filterChain->append(new RegexpFilter($attrConfig['regexp']));
+			if (isset($attrConfig['required']))
+				$attribute->required = $attrConfig['required'];
+			else
+				$attribute->required = ($attrName === 'id');
+			if (isset($attrConfig['postFilter']))
+				$this->appendFilter($attribute, $attrConfig['postFilter']);
+			if (isset($attrConfig['defaultValue']))
+				$attribute->defaultValue = $attrConfig['defaultValue'];
+			$hasRequiredAttribute |= $attribute->required;
+		}
+		if (isset($attributes['id']['regexp']))
+		{
+			$attrRegexp = \preg_replace('(\\^(.*)\\$)s', "^(?'id'$1)$", $attributes['id']['regexp']);
+			$tag->attributePreprocessors->add('url', $attrRegexp);
+		}
+		if (!$hasRequiredAttribute)
+			$tag->filterChain
+				->append(array(__NAMESPACE__ . '\\Parser', 'hasNonDefaultAttribute'))
+				->setJS(\file_get_contents(__DIR__ . '/Parser/hasNonDefaultAttribute.js'));
+		$tag->template = $this->templateBuilder->build($siteId, $siteConfig) . $this->appendTemplate;
+		$this->configurator->templateNormalizer->normalizeTag($tag);
+		$this->configurator->templateChecker->checkTag($tag);
+		$this->configurator->tags->add($siteId, $tag);
+		if ($this->createIndividualBBCodes)
+			$this->configurator->BBCodes->add(
+				$siteId,
+				array(
+					'defaultAttribute'  => 'url',
+					'contentAttributes' => array('url')
+				)
+			);
+		return $tag;
+	}
+	public function appendTemplate($template = '')
+	{
+		$this->appendTemplate = $this->configurator->templateNormalizer->normalizeTemplate($template);
+	}
+	protected function addScrapes(Tag $tag, array $scrapes)
+	{
+		if (!isset($scrapes[0]))
+			$scrapes = array($scrapes);
+		$attributes   = array();
+		$scrapeConfig = array();
+		foreach ($scrapes as $scrape)
+		{
+			$attrNames = array();
+			foreach ((array) $scrape['extract'] as $extractRegexp)
+			{
+				$attributePreprocessor = new AttributePreprocessor($extractRegexp);
+				foreach ($attributePreprocessor->getAttributes() as $attrName => $attrRegexp)
+				{
+					$attrNames[] = $attrName;
+					$attributes[$attrName]['regexp'] = $attrRegexp;
+				}
+			}
+			$attrNames = \array_unique($attrNames);
+			\sort($attrNames);
+			if (!isset($scrape['match']))
+				$scrape['match'] = '//';
+			$entry = array($scrape['match'], $scrape['extract'], $attrNames);
+			if (isset($scrape['url']))
+				$entry[] = $scrape['url'];
+			$scrapeConfig[] = $entry;
+		}
+		$tag->filterChain->insert(1, __NAMESPACE__ . '\\Parser::scrape')
+		                 ->addParameterByName('scrapeConfig')
+		                 ->addParameterByName('cacheDir')
+		                 ->setVar('scrapeConfig', $scrapeConfig)
+		                 ->setJS('returnTrue');
+		return $attributes;
+	}
+	protected function appendFilter(Attribute $attribute, $filter)
+	{
+		if (!\in_array($filter, $this->allowedFilters, \true))
+			throw new RuntimeException("Filter '" . $filter . "' is not allowed");
+		$attribute->filterChain->append($this->configurator->attributeFilters[$filter]);
+	}
+	protected function getSchemes()
+	{
+		$schemes = array();
+		foreach ($this->collection as $site)
+			if (isset($site['scheme']))
+				foreach ((array) $site['scheme'] as $scheme)
+					$schemes[] = $scheme;
+		return $schemes;
+	}
+	protected function normalizeId($siteId)
+	{
+		$siteId = \strtolower($siteId);
+		if (!\preg_match('(^[a-z0-9]+$)', $siteId))
+			throw new InvalidArgumentException('Invalid site ID');
+		return $siteId;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/Collections/CachedDefinitionCollection.php
@@ -0,0 +1,132 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\MediaEmbed\Configurator\Collections;
+class CachedDefinitionCollection extends SiteDefinitionCollection
+{
+	protected $items = array(
+		'abcnews'=>array('extract'=>'!abcnews\\.go\\.com/[^/]+/video/[^/]+-(?\'id\'\\d+)!','host'=>'abcnews.go.com','iframe'=>array('height'=>'360','src'=>'//abcnews.go.com/video/embed?id={@id}','width'=>'640'),'name'=>'ABC News','tags'=>array('news')),
+		'amazon'=>array('extract'=>array('#/(?:dp|gp/product)/(?\'id\'[A-Z0-9]+)#','#amazon\\.(?:co\\.)?(?\'tld\'ca|de|es|fr|it|jp|uk)#'),'host'=>array('amazon.ca','amazon.co.uk','amazon.co.jp','amazon.com','amazon.de','amazon.es','amazon.fr','amazon.it'),'iframe'=>array('height'=>'240','src'=>'//<xsl:choose><xsl:when test="@tld=\'es\'or@tld=\'it\'">rcm-eu.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;p=8&amp;l=as1&amp;f=ifr&amp;asins=<xsl:value-of select="@id"/>&amp;o=<xsl:choose><xsl:when test="@tld=\'es\'">30</xsl:when><xsl:otherwise>29</xsl:otherwise></xsl:choose>&amp;t=<xsl:choose><xsl:when test="@tld=\'es\'and$AMAZON_ASSOCIATE_TAG_ES"><xsl:value-of select="$AMAZON_ASSOCIATE_TAG_ES"/></xsl:when><xsl:when test="@tld=\'it\'and$AMAZON_ASSOCIATE_TAG_IT"><xsl:value-of select="$AMAZON_ASSOCIATE_TAG_IT"/></xsl:when><xsl:otherwise>_</xsl:otherwise></xsl:choose></xsl:when><xsl:otherwise>ws-<xsl:choose><xsl:when test="@tld=\'jp\'">fe</xsl:when><xsl:when test="@tld and contains(\'desfrituk\',@tld)">eu</xsl:when><xsl:otherwise>na</xsl:otherwise></xsl:choose>.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&amp;OneJS=1&amp;Operation=GetAdHtml&amp;MarketPlace=<xsl:choose><xsl:when test="@tld"><xsl:value-of select="translate(@tld,\'acdefijkprstu\',\'ACDEFIJBPRSTG\')"/></xsl:when><xsl:otherwise>US</xsl:otherwise></xsl:choose>&amp;ad_type=product_link&amp;tracking_id=<xsl:choose><xsl:when test="@tld=\'ca\'and$AMAZON_ASSOCIATE_TAG_CA"><xsl:value-of select="$AMAZON_ASSOCIATE_TAG_CA"/></xsl:when><xsl:when test="@tld=\'de\'and$AMAZON_ASSOCIATE_TAG_DE"><xsl:value-of select="$AMAZON_ASSOCIATE_TAG_DE"/></xsl:when><xsl:when test="@tld=\'fr\'and$AMAZON_ASSOCIATE_TAG_FR"><xsl:value-of select="$AMAZON_ASSOCIATE_TAG_FR"/></xsl:when><xsl:when test="@tld=\'jp\'and$AMAZON_ASSOCIATE_TAG_JP"><xsl:value-of select="$AMAZON_ASSOCIATE_TAG_JP"/></xsl:when><xsl:when test="@tld=\'uk\'and$AMAZON_ASSOCIATE_TAG_UK"><xsl:value-of select="$AMAZON_ASSOCIATE_TAG_UK"/></xsl:when><xsl:when test="$AMAZON_ASSOCIATE_TAG"><xsl:value-of select="$AMAZON_ASSOCIATE_TAG"/></xsl:when><xsl:otherwise>_</xsl:otherwise></xsl:choose>&amp;marketplace=amazon&amp;region=<xsl:choose><xsl:when test="@tld"><xsl:value-of select="translate(@tld,\'acdefijkprstu\',\'ACDEFIJBPRSTG\')"/></xsl:when><xsl:otherwise>US</xsl:otherwise></xsl:choose>&amp;asins=<xsl:value-of select="@id"/>&amp;show_border=true&amp;link_opens_in_new_window=true</xsl:otherwise></xsl:choose>','width'=>'120'),'name'=>'Amazon Product'),
+		'audioboom'=>array('extract'=>'!audioboo(?:\\.f|m\\.co)m/boos/(?\'id\'\\d+)!','host'=>array('audioboo.fm','audioboom.com'),'iframe'=>array('height'=>'150','max-width'=>'700','src'=>'//audioboom.com/boos/{@id}/embed/v3','width'=>'100%'),'name'=>'audioBoom','tags'=>array('podcasts')),
+		'audiomack'=>array('choose'=>array('otherwise'=>array('iframe'=>array('height'=>'110','max-width'=>'900','src'=>'//www.audiomack.com/embed4/{@id}','width'=>'100%')),'when'=>array('iframe'=>array('height'=>'340','max-width'=>'900','src'=>'//www.audiomack.com/embed4-album/{@id}','width'=>'100%'),'test'=>'@mode=\'album\'')),'extract'=>'!audiomack\\.com/(?\'mode\'album|song)/(?\'id\'[-\\w]+/[-\\w]+)!','host'=>'audiomack.com','name'=>'Audiomack','tags'=>array('music')),
+		'bandcamp'=>array('host'=>'bandcamp.com','iframe'=>array('height'=>'400','src'=>'//bandcamp.com/EmbeddedPlayer/size=large/minimal=true/<xsl:choose><xsl:when test="@album_id">album=<xsl:value-of select="@album_id"/><xsl:if test="@track_num">/t=<xsl:value-of select="@track_num"/></xsl:if></xsl:when><xsl:otherwise>track=<xsl:value-of select="@track_id"/></xsl:otherwise></xsl:choose>','width'=>'400'),'name'=>'Bandcamp','scrape'=>array(array('extract'=>'!/album=(?\'album_id\'\\d+)!','match'=>'!bandcamp\\.com/album/.!'),array('extract'=>array('!"album_id":(?\'album_id\'\\d+)!','!"track_num":(?\'track_num\'\\d+)!','!/track=(?\'track_id\'\\d+)!'),'match'=>'!bandcamp\\.com/track/.!')),'tags'=>array('music')),
+		'bbcnews'=>array('host'=>'bbc.com','iframe'=>array('src'=>'//www.bbc.com<xsl:choose><xsl:when test="starts-with(@playlist,\'/news/\')and contains(@playlist,\'A\')"><xsl:value-of select="substring-before(@playlist,\'A\')"/></xsl:when><xsl:otherwise>/news/<xsl:value-of select="@id"/></xsl:otherwise></xsl:choose>/embed'),'name'=>'BBC News','scrape'=>array('extract'=>'!bbc\\.com\\\\/news\\\\/(?\'id\'[-\\w]+)\\\\/embed!','match'=>'!bbc\\.com/news/\\w+!'),'tags'=>array('news')),
+		'blab'=>array('extract'=>'#blab\\.im/(?!about$|live$|replay$|scheduled$|search\\?)(?\'id\'[-\\w]+)#','host'=>'blab.im','iframe'=>array('height'=>'400','src'=>'https://blab.im/{@id}','width'=>'400'),'name'=>'Blab','tags'=>array('social')),
+		'bleacherreport'=>array('host'=>'bleacherreport.com','iframe'=>array('height'=>'360','src'=>'//bleacherreport.com/video_embed?id={@id}','width'=>'640'),'name'=>'Bleacher Report videos','scrape'=>array('extract'=>'!id="video-(?\'id\'[-\\w]+)!','match'=>'!/articles/.!'),'tags'=>array('sports')),
+		'break'=>array('extract'=>'!break\\.com/video/.*-(?\'id\'\\d+)$!','host'=>'break.com','iframe'=>array('height'=>'280','src'=>'//break.com/embed/{@id}','width'=>'464'),'name'=>'Break','tags'=>array('entertainment')),
+		'brightcove'=>array('host'=>array('bcove.me','link.brightcove.com'),'iframe'=>array('src'=>'https://link.brightcove.com/services/player/bcpid{@bcpid}?bckey={@bckey}&bctid={@bctid}&secureConnections=true&secureHTMLConnections=true&autoStart=false&height=100%25&width=100%25'),'name'=>'Brightcove','scrape'=>array('extract'=>'!meta name="twitter:player" content=".*?bcpid(?\'bcpid\'\\d+).*?bckey=(?\'bckey\'[-,~\\w]+).*?bctid=(?\'bctid\'\\d+)!','match'=>array('!bcove\\.me/.!','!link\\.brightcove\\.com/services/player/!')),'tags'=>array('videos')),
+		'cbsnews'=>array('attributes'=>array('id'=>array('required'=>'false')),'choose'=>array('otherwise'=>array('flash'=>array('flashvars'=>'si=254&contentValue={@id}','padding-height'=>'40','src'=>'//i.i.cbsi.com/cnwk.1d/av/video/cbsnews/atlantis2/cbsnews_player_embed.swf')),'when'=>array('flash'=>array('flashvars'=>'pType=embed&si=254&pid={@pid}','padding-height'=>'38','src'=>'//www.cbsnews.com/common/video/cbsnews_player.swf'),'test'=>'@pid')),'extract'=>'#cbsnews\\.com/video/watch/\\?id=(?\'id\'\\d+)#','host'=>'cbsnews.com','name'=>'CBS News Video','scrape'=>array('extract'=>'#"pid":"(?\'pid\'\\w+)"#','match'=>'#cbsnews\\.com/videos/(?!watch/)#'),'tags'=>array('news')),
+		'cnbc'=>array('extract'=>'!cnbc\\.com/gallery/\\?video=(?\'id\'\\d+)!','flash'=>array('height'=>'380','src'=>'//plus.cnbc.com/rssvideosearch/action/player/id/{@id}/code/cnbcplayershare','width'=>'400'),'host'=>'video.cnbc.com','name'=>'CNBC','tags'=>array('news')),
+		'cnn'=>array('extract'=>array('!cnn.com/videos/(?\'id\'.*\\.cnn)!','!cnn\\.com/video/data/2\\.0/video/(?\'id\'.*\\.cnn)!'),'host'=>'cnn.com','iframe'=>array('src'=>'//edition.cnn.com/video/api/embed.html#/video/{@id}'),'name'=>'CNN','tags'=>array('news')),
+		'cnnmoney'=>array('extract'=>'!money\\.cnn\\.com/video/(?\'id\'.*\\.cnnmoney)!','host'=>'money.cnn.com','iframe'=>array('height'=>'360','src'=>'//money.cnn.com/.element/ssi/video/7.0/players/embed.player.html?videoid=video/{@id}&width=560&height=360','width'=>'560'),'name'=>'CNNMoney','tags'=>array('news')),
+		'collegehumor'=>array('extract'=>'!collegehumor\\.com/(?:video|embed)/(?\'id\'\\d+)!','host'=>'collegehumor.com','iframe'=>array('height'=>'369','src'=>'//www.collegehumor.com/e/{@id}','width'=>'600'),'name'=>'CollegeHumor','tags'=>array('entertainment')),
+		'comedycentral'=>array('host'=>array('cc.com','comedycentral.com'),'iframe'=>array('height'=>'360','src'=>'//media.mtvnservices.com/embed/{@id}','width'=>'640'),'name'=>'Comedy Central','scrape'=>array('extract'=>'!(?\'id\'mgid:arc:(?:episode|video):[.\\w]+:[-\\w]+)!','match'=>'!c(?:c|omedycentral)\\.com/(?:full-episode|video-clip)s/!'),'tags'=>array('entertainment')),
+		'coub'=>array('extract'=>'!coub\\.com/view/(?\'id\'\\w+)!','host'=>'coub.com','iframe'=>array('src'=>'//coub.com/embed/{@id}'),'name'=>'Coub','tags'=>array('videos')),
+		'dailymotion'=>array('extract'=>'!dailymotion\\.com/(?:live/|swf/|user/[^#]+#video=|(?:related/\\d+/)?video/)(?\'id\'[A-Za-z0-9]+)!','host'=>'dailymotion.com','iframe'=>array('src'=>'//www.dailymotion.com/embed/video/{@id}'),'name'=>'Dailymotion','tags'=>array('videos')),
+		'democracynow'=>array('extract'=>'!democracynow.org/(?:embed/)?(?\'id\'(?:\\w+/)?\\d+/\\d+/\\d+(?:/\\w+)?)!','host'=>'democracynow.org','iframe'=>array('height'=>'360','src'=>'//www.democracynow.org/embed/<xsl:choose><xsl:when test="contains(@id,\'/headlines\')">headlines/<xsl:value-of select="substring-before(@id,\'/headlines\')"/></xsl:when><xsl:when test="starts-with(@id,\'2\')">story/<xsl:value-of select="@id"/></xsl:when><xsl:when test="starts-with(@id,\'shows/\')">show/<xsl:value-of select="substring-after(@id,\'/\')"/></xsl:when><xsl:otherwise><xsl:value-of select="@id"/></xsl:otherwise></xsl:choose>','width'=>'640'),'name'=>'Democracy Now!','scrape'=>array('extract'=>'!democracynow\\.org/(?\'id\'(?:\\w+/)?\\d+/\\d+/\\d+(?:/\\w+)?)\' rel=\'canonical!','match'=>'!m\\.democracynow\\.org/stories/\\d!')),
+		'dumpert'=>array('extract'=>'!dumpert\\.nl/mediabase/(?\'id\'\\d+[/_]\\w+)!','host'=>'dumpert.nl','iframe'=>array('src'=>'//www.dumpert.nl/embed/{translate(@id,\'_\',\'/\')}/'),'name'=>'dumpert','tags'=>array('.nl','entertainment')),
+		'eighttracks'=>array('extract'=>'!8tracks\\.com/[-\\w]+/(?\'id\'\\d+)(?=#|$)!','host'=>'8tracks.com','iframe'=>array('height'=>'400','src'=>'//8tracks.com/mixes/{@id}/player_v3_universal','width'=>'400'),'name'=>'8tracks','scrape'=>array('extract'=>'!eighttracks://mix/(?\'id\'\\d+)!','match'=>'!8tracks\\.com/[-\\w]+/[-\\w]+!'),'tags'=>array('music')),
+		'espn'=>array('extract'=>'#video/(?:clip(?:\\?id=|/_/id/))?(?\'id\'\\d+)#','host'=>array('espn.com','espn.go.com'),'iframe'=>array('src'=>'//www.espn.com/core/video/iframe?id={@id}'),'name'=>'ESPN','tags'=>array('sports')),
+		'facebook'=>array('extract'=>array('@/(?!(?:apps|developers|graph)\\.)[-\\w.]*facebook\\.com/(?:[/\\w]+/permalink|(?!pages/|groups/).*?)(?:/|fbid=|\\?v=)(?\'id\'\\d+)(?=$|[/?&#])@','#/(?\'type\'video)s?/#'),'host'=>'facebook.com','iframe'=>array('onload'=>'var a=Math.random();window.addEventListener(\'message\',function(b){{if(b.data.id==a)style.height=b.data.height+\'px\'}});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')','src'=>'https://s9e.github.io/iframe/facebook.min.html#{@type}{@id}'),'name'=>'Facebook','tags'=>array('social')),
+		'flickr'=>array('extract'=>'!flickr\\.com/photos/[^/]+/(?\'id\'\\d+)!','host'=>'flickr.com','iframe'=>array('height'=>'500','src'=>'https://www.flickr.com/photos/_/{@id}/player/','width'=>'500'),'name'=>'Flickr','tags'=>array('images')),
+		'foratv'=>array('host'=>'fora.tv','iframe'=>array('src'=>'//library.fora.tv/embed?id={@id}&type=c'),'name'=>'FORA.tv','scrape'=>array('extract'=>'!embed\\?id=(?\'id\'\\d+)!','match'=>'!fora\\.tv/\\d+/\\d+/\\d+/.!')),
+		'foxnews'=>array('extract'=>'!video\\.foxnews\\.com/v/(?\'id\'\\d+)!','host'=>'video.foxnews.com','iframe'=>array('src'=>'//video.foxnews.com/v/video-embed.html?video_id={@id}'),'name'=>'Fox News','tags'=>array('news')),
+		'funnyordie'=>array('extract'=>'!funnyordie\\.com/videos/(?\'id\'[0-9a-f]+)!','host'=>'funnyordie.com','iframe'=>array('height'=>'360','src'=>'//www.funnyordie.com/embed/{@id}','width'=>'640'),'name'=>'Funny or Die','tags'=>array('entertainment')),
+		'gamespot'=>array('extract'=>'!gamespot\\.com.*?/(?:events|videos)/.*?-(?\'id\'\\d+)/(?:[#?].*)?$!','host'=>'gamespot.com','iframe'=>array('height'=>'400','src'=>'//www.gamespot.com/videos/embed/{@id}/','width'=>'640'),'name'=>'Gamespot','tags'=>array('gaming')),
+		'gametrailers'=>array('host'=>'gametrailers.com','iframe'=>array('height'=>'360','src'=>'<xsl:choose><xsl:when test="starts-with(@id,\'mgid:\')">//media.mtvnservices.com/embed/<xsl:value-of select="@id"/></xsl:when><xsl:otherwise>//embed.gametrailers.com/embed/<xsl:value-of select="@id"/>?embed=1&amp;suppressBumper=1</xsl:otherwise></xsl:choose>','width'=>'640'),'name'=>'GameTrailers','scrape'=>array('extract'=>'!embed/(?\'id\'\\d+)!','match'=>'!gametrailers\\.com/(?:full-episode|review|video)s/!'),'tags'=>array('gaming')),
+		'getty'=>array('attributes'=>array('height'=>array('defaultValue'=>'360'),'width'=>array('defaultValue'=>'640')),'extract'=>array('!gty\\.im/(?\'id\'\\d+)!','!gettyimages\\.[.\\w]+/detail(?=/).*?/(?\'id\'\\d+)!','!#[-\\w]*picture-id(?\'id\'\\d+)$!'),'host'=>array('gettyimages.be','gettyimages.cn','gettyimages.co.jp','gettyimages.co.uk','gettyimages.com','gettyimages.com.au','gettyimages.de','gettyimages.dk','gettyimages.es','gettyimages.fr','gettyimages.ie','gettyimages.it','gettyimages.nl','gettyimages.pt','gettyimages.se','gty.im'),'iframe'=>array('height'=>'{@height}','padding-height'=>'49','src'=>'//embed.gettyimages.com/embed/{@id}?et={@et}&sig={@sig}','width'=>'{@width}'),'name'=>'Getty Images','scrape'=>array('extract'=>array('!"height":[ "]*(?\'height\'\\d+)!','!"width":[ "]*(?\'width\'\\d+)!','!et=(?\'et\'[-=\\w]+)!','!sig=(?\'sig\'[-=\\w]+)!'),'url'=>'http://embed.gettyimages.com/preview/{@id}'),'tags'=>array('images')),
+		'gfycat'=>array('attributes'=>array('height'=>array('defaultValue'=>'315'),'width'=>array('defaultValue'=>'560')),'extract'=>'!gfycat\\.com/(?\'id\'\\w+)!','host'=>'gfycat.com','iframe'=>array('height'=>'{@height}','src'=>'//gfycat.com/iframe/{@id}','width'=>'{@width}'),'name'=>'Gfycat','scrape'=>array('extract'=>array('!video:height" content="(?\'height\'\\d+)!','!video:width" content="(?\'width\'\\d+)!'),'url'=>'http://gfycat.com/{@id}'),'tags'=>array('images')),
+		'gist'=>array('extract'=>'!gist\\.github\\.com/(?\'id\'(?:\\w+/)?[\\da-f]+(?:/[\\da-f]+)?)!','host'=>'github.com','iframe'=>array('height'=>'180','onload'=>'var a=Math.random();window.addEventListener(\'message\',function(b){{if(b.data.id==a)style.height=b.data.height+\'px\'}});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')','scrolling'=>'','src'=>'https://s9e.github.io/iframe/gist.min.html#{@id}','width'=>'100%'),'name'=>'GitHub Gist (via custom iframe)'),
+		'globalnews'=>array('extract'=>'!globalnews\\.ca/video/(?\'id\'\\d+)!','host'=>'globalnews.ca','iframe'=>array('height'=>'377','src'=>'//globalnews.ca/video/embed/{@id}/','width'=>'560'),'name'=>'Global News','tags'=>array('.ca','news')),
+		'gofundme'=>array('extract'=>'@gofundme\\.com/(?\'id\'\\w+)(?![^#?])@','flash'=>array('flashvars'=>'page={@id}','height'=>'338','src'=>'//funds.gofundme.com/Widgetflex.swf','width'=>'258'),'host'=>'gofundme.com','name'=>'GoFundMe','tags'=>array('fundraising')),
+		'googledrive'=>array('extract'=>'!drive\\.google\\.com/.*?file/d/(?\'id\'[-\\w]+)!','host'=>'drive.google.com','iframe'=>array('height'=>'480','src'=>'//drive.google.com/file/d/{@id}/preview','width'=>'640'),'name'=>'Google Drive','tags'=>array('documents','images','videos')),
+		'googleplus'=>array('attributes'=>array('name'=>array('postFilter'=>'urldecode')),'extract'=>'!//plus\\.google\\.com/(?:u/\\d+/)?(?:\\+(?\'name\'[^/]+)|(?\'oid\'\\d+))/posts/(?\'pid\'\\w+)!','host'=>'plus.google.com','iframe'=>array('height'=>'240','onload'=>'var a=Math.random();window.addEventListener(\'message\',function(b){{if(b.data.id==a)style.height=b.data.height+\'px\'}});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')','src'=>'https://s9e.github.io/iframe/googleplus.min.html#<xsl:choose><xsl:when test="@oid"><xsl:value-of select="@oid"/></xsl:when><xsl:otherwise>+<xsl:value-of select="@name"/></xsl:otherwise></xsl:choose>/posts/<xsl:value-of select="@pid"/>','width'=>'450'),'name'=>'Google+','tags'=>array('social')),
+		'googlesheets'=>array('extract'=>'!docs\\.google\\.com/spreadsheet(?:/ccc\\?key=|s/d/)(?\'id\'[-\\w]+)[^#]*(?:#gid=(?\'gid\'\\d+))?!','host'=>'docs.google.com','iframe'=>array('height'=>'500','src'=>'https://docs.google.com/spreadsheet/ccc?key={@id}&widget=true&headers=false&rm=minimal#gid={@gid}','style'=>array('resize'=>'vertical'),'width'=>'100%'),'name'=>'Google Sheets','tags'=>array('documents')),
+		'healthguru'=>array('host'=>'healthguru.com','iframe'=>array('src'=>'//www.healthguru.com/embed/{@id}'),'name'=>'Healthguru','scrape'=>array('extract'=>'!healthguru\\.com/embed/(?\'id\'\\w+)!','match'=>'!healthguru\\.com/(?:content/)?video/.!'),'tags'=>array('health')),
+		'hudl'=>array('extract'=>array('!hudl\\.com/athlete/(?\'athlete\'\\d+)/highlights/(?\'highlight\'[\\da-f]+)!','!hudl\\.com/video/\\d+/(?\'athlete\'\\d+)/(?\'highlight\'[\\da-f]+)!'),'host'=>'hudl.com','iframe'=>array('height'=>'360','src'=>'//www.hudl.com/embed/athlete/{@athlete}/highlights/{@highlight}','width'=>'640'),'name'=>'Hudl','scrape'=>array('extract'=>'!hudl\\.com/video/\\d+/(?\'athlete\'\\d+)/(?\'highlight\'[\\da-f]+)!','match'=>'!hudl\\.com/v/!'),'tags'=>array('sports')),
+		'hulu'=>array('host'=>'hulu.com','iframe'=>array('height'=>'360','src'=>'https://secure.hulu.com/embed/{@id}','width'=>'640'),'name'=>'Hulu','scrape'=>array('extract'=>'!eid=(?\'id\'[-\\w]+)!','match'=>'!hulu\\.com/watch/!')),
+		'humortvnl'=>array('extract'=>'!humortv\\.vara\\.nl/\\w+\\.(?\'id\'[-.\\w]+)\\.html!','host'=>'humortv.vara.nl','iframe'=>array('src'=>'//humortv.vara.nl/embed.{@id}.html'),'name'=>'HumorTV','tags'=>array('.nl','entertainment')),
+		'ign'=>array('extract'=>'!(?\'id\'https?://.*?ign\\.com/videos/.+)!','host'=>'ign.com','iframe'=>array('height'=>'263','src'=>'//widgets.ign.com/video/embed/content.html?url={@id}','width'=>'468'),'name'=>'IGN','tags'=>array('gaming')),
+		'imdb'=>array('extract'=>'!imdb\\.com/[/\\w]+/vi(?\'id\'\\d+)!','host'=>'imdb.com','iframe'=>array('src'=>'//www.imdb.com/videoembed/vi{@id}'),'name'=>'IMDb','tags'=>array('movies')),
+		'imgur'=>array('attributes'=>array('type'=>array('type'=>'alnum')),'extract'=>'@imgur\\.com/(?!r/|user/)(?:gallery/)?(?\'id\'(?:a/)?\\w+)(?!\\w|\\.(?:pn|jp)g)@','host'=>'imgur.com','iframe'=>array('height'=>'450','onload'=>'var b=Math.random();window.addEventListener(\'message\',function(a){{a.data.id==b&&(style.height=a.data.height+\'px\',style.width=a.data.width+\'px\')}});contentWindow.postMessage(\'s9e:\'+b,\'https://s9e.github.io\')','src'=>'https://s9e.github.io/iframe/imgur.min.html#<xsl:if test="@type=\'album\'and not(starts-with(@id,\'a/\'))">a/</xsl:if><xsl:value-of select="@id"/>','width'=>'568'),'name'=>'Imgur','scrape'=>array('extract'=>array('!image\\s*:\\s*.*?"is_(?\'type\'album)":true!','!<div id="(?\'type\'album)-!','!class="(?\'type\'album)-image!'),'match'=>'@imgur\\.com/gallery/\\w@'),'tags'=>array('images')),
+		'indiegogo'=>array('extract'=>'!indiegogo\\.com/projects/(?\'id\'[-\\w]+)!','host'=>'indiegogo.com','iframe'=>array('height'=>'445','src'=>'//www.indiegogo.com/project/{@id}/embedded','width'=>'222'),'name'=>'Indiegogo','tags'=>array('fundraising')),
+		'instagram'=>array('extract'=>'!instagram\\.com/p/(?\'id\'[-\\w]+)!','host'=>'instagram.com','iframe'=>array('height'=>'640','onload'=>'var a=Math.random();window.addEventListener(\'message\',function(b){{if(b.data.id==a)style.height=b.data.height+\'px\'}});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')','src'=>'https://s9e.github.io/iframe/instagram.min.html#{@id}','width'=>'640'),'name'=>'Instagram','tags'=>array('social')),
+		'internetarchive'=>array('attributes'=>array('height'=>array('defaultValue'=>'360'),'width'=>array('defaultValue'=>'640')),'host'=>'archive.org','iframe'=>array('height'=>'{@height}','src'=>'https://archive.org/embed/{@id}','width'=>'{@width}'),'name'=>'Internet Archive','scrape'=>array('extract'=>array('!meta property="twitter:player" content="https://archive.org/embed/(?\'id\'[^/"]+)!','!meta property="og:video:width" content="(?\'width\'\\d+)!','!meta property="og:video:height" content="(?\'height\'\\d+)!'),'match'=>'!archive\\.org/details/!')),
+		'izlesene'=>array('extract'=>'!izlesene\\.com/video/[-\\w]+/(?\'id\'\\d+)!','host'=>'izlesene.com','iframe'=>array('src'=>'//www.izlesene.com/embedplayer/{@id}'),'name'=>'İzlesene','tags'=>array('.tr')),
+		'jwplatform'=>array('extract'=>'!jwplatform\\.com/\\w+/(?\'id\'[-\\w]+)!','host'=>'jwplatform.com','iframe'=>array('src'=>'//content.jwplatform.com/players/{@id}.html'),'name'=>'JW Platform','tags'=>array('videos')),
+		'khl'=>array('host'=>'video.khl.ru','iframe'=>array('src'=>'//video.khl.ru/iframe/feed/start/{@id}?type_id=18&width=560&height=315'),'name'=>'Kontinental Hockey League (КХЛ)','scrape'=>array('extract'=>'!/feed/start/(?\'id\'[/\\w]+)!','match'=>'!video\\.khl\\.ru/(?:event|quote)s/\\d!'),'tags'=>array('.ru','sports')),
+		'kickstarter'=>array('choose'=>array('otherwise'=>array('iframe'=>array('height'=>'420','src'=>'//www.kickstarter.com/projects/{@id}/widget/card.html','width'=>'220')),'when'=>array('iframe'=>array('height'=>'360','src'=>'//www.kickstarter.com/projects/{@id}/widget/video.html','width'=>'480'),'test'=>'@video')),'extract'=>'!kickstarter\\.com/projects/(?\'id\'[^/]+/[^/?]+)(?:/widget/(?:(?\'card\'card)|(?\'video\'video)))?!','host'=>'kickstarter.com','name'=>'Kickstarter','tags'=>array('fundraising')),
+		'kissvideo'=>array('extract'=>'!kissvideo\\.click/[^_]*_(?\'id\'[0-9a-f]+)!','host'=>'kissvideo.click','iframe'=>array('height'=>'360','src'=>'//www.kissvideo.click/embed.php?vid={@id}','width'=>'640'),'name'=>'Kiss Video','tags'=>array('videos')),
+		'libsyn'=>array('host'=>'libsyn.com','iframe'=>array('height'=>'45','max-width'=>'900','src'=>'//html5-player.libsyn.com/embed/episode/id/{@id}/height/45/width/900/theme/standard/direction/no/autoplay/no/autonext/no/thumbnail/no/preload/no/no_addthis/no/','width'=>'100%'),'name'=>'Libsyn','scrape'=>array('extract'=>'!embed/episode/id/(?\'id\'\\d+)!','match'=>'@(?!\\.mp3)....$@'),'tags'=>array('podcasts')),
+		'livecap'=>array('extract'=>'!livecap.tv/[st]/(?\'channel\'\\w+)/(?\'id\'\\w+)!','host'=>'livecap.tv','iframe'=>array('height'=>'360','src'=>'https://www.livecap.tv/s/embed/{@channel}/{@id}','width'=>'640'),'name'=>'LiveCap','tags'=>array('gaming')),
+		'liveleak'=>array('extract'=>'!liveleak\\.com/view\\?i=(?\'id\'[a-f_0-9]+)!','host'=>'liveleak.com','iframe'=>array('height'=>'360','src'=>'//www.liveleak.com/ll_embed?i={@id}','width'=>'640'),'name'=>'LiveLeak','tags'=>array('videos')),
+		'livestream'=>array('extract'=>array('!livestream\\.com/accounts/(?\'account_id\'\\d+)/events/(?\'event_id\'\\d+)!','!/videos/(?\'video_id\'\\d+)!','!original\\.livestream\\.com/(?\'channel\'\\w+)/video\\?clipId=(?\'clip_id\'[-\\w]+)!'),'host'=>array('livestre.am','livestream.com'),'iframe'=>array('height'=>'360','src'=>'<xsl:choose><xsl:when test="@clip_id">//cdn.livestream.com/embed/<xsl:value-of select="@channel"/>?layout=4&amp;autoplay=false&amp;clip=<xsl:value-of select="@clip_id"/></xsl:when><xsl:otherwise>//livestream.com/accounts/<xsl:value-of select="@account_id"/>/events/<xsl:value-of select="@event_id"/><xsl:if test="@video_id">/videos/<xsl:value-of select="@video_id"/></xsl:if>/player?autoPlay=false</xsl:otherwise></xsl:choose>','width'=>'640'),'name'=>'Livestream','scrape'=>array(array('extract'=>'!accounts/(?\'account_id\'\\d+)/events/(?\'event_id\'\\d+)!'),array('extract'=>'!//original\\.livestream\\.com/(?\'channel\'\\w+)/video/(?\'clip_id\'[-\\w]+)!','match'=>'!livestre.am!')),'tags'=>array('videos')),
+		'mailru'=>array('host'=>'my.mail.ru','iframe'=>array('height'=>'342','src'=>'//videoapi.my.mail.ru/videos/embed/{@id}.html','width'=>'560'),'name'=>'Mail.Ru','scrape'=>array('extract'=>'!mail\\.ru/video/(?\'id\'[/\\w]+)\\.html!','match'=>'!my\\.mail\\.ru/\\w+/\\w+/video/\\w+/\\d!'),'tags'=>array('.ru')),
+		'medium'=>array('extract'=>'!medium\\.com/[^/]*/(?:[-\\w]+-)?(?\'id\'[\\da-f]+)!','host'=>'medium.com','iframe'=>array('height'=>'400','onload'=>'window.addEventListener(\'message\',function(a){{a=a.data.split(\'::\');\'m\'===a[0]&&0<src.indexOf(a[1])&&a[2]&&(style.height=a[2]+\'px\')}})','src'=>'https://api.medium.com/embed?type=story&path=%2F%2F{@id}&id={translate(@id,\'abcdef\',\'111111\')}','style'=>array('border'=>'1px solid','border-color'=>'#eee #ddd #bbb','border-radius'=>'5px','box-shadow'=>'rgba(0,0,0,.15) 0 1px 3px'),'width'=>'400'),'name'=>'Medium','tags'=>array('blogging')),
+		'metacafe'=>array('extract'=>'!metacafe\\.com/watch/(?\'id\'\\d+)!','host'=>'metacafe.com','iframe'=>array('src'=>'//www.metacafe.com/embed/{@id}/'),'name'=>'Metacafe','tags'=>array('videos')),
+		'mixcloud'=>array('extract'=>'@mixcloud\\.com/(?!categories|tag)(?\'id\'[-\\w]+/[^/&]+)/@','host'=>'mixcloud.com','iframe'=>array('height'=>'400','src'=>'//www.mixcloud.com/widget/iframe/?feed=http%3A%2F%2Fwww.mixcloud.com%2F{@id}%2F&embed_type=widget_standard','width'=>'400'),'name'=>'Mixcloud','tags'=>array('music')),
+		'mlb'=>array('extract'=>array('#mlb\\.com/[\\w/]*/v(?\'id\'\\d+)#','#mlb\\.com/r/video\\?content_id=(?\'id\'\\d+)#'),'host'=>'mlb.com','iframe'=>array('src'=>'//m.mlb.com/shared/video/embed/embed.html?content_id={@id}&width=640&height=360'),'name'=>'MLB','tags'=>array('sports')),
+		'mrctv'=>array('host'=>'mrctv.org','iframe'=>array('src'=>'https://www.mrctv.org/embed/{@id}'),'name'=>'MRCTV','scrape'=>array('extract'=>'!mrctv\\.org/embed/(?\'id\'\\d+)!','match'=>'!mrctv\\.org/videos/.!')),
+		'msnbc'=>array('host'=>'msnbc.com','iframe'=>array('height'=>'440','src'=>'//player.theplatform.com/p/2E2eJC/EmbeddedOffSite?guid={@id}','width'=>'635'),'name'=>'MSNBC','scrape'=>array('extract'=>'@guid="?(?\'id\'\\w+)@','match'=>array('@msnbc\\.com/[-\\w]+/watch/@','@on\\.msnbc\\.com/.@')),'tags'=>array('news')),
+		'natgeochannel'=>array('extract'=>'@channel\\.nationalgeographic\\.com/(?\'id\'[-/\\w]+/videos/[-\\w]+)@','host'=>'channel.nationalgeographic.com','iframe'=>array('src'=>'//channel.nationalgeographic.com/{@id}/embed/'),'name'=>'National Geographic Channel'),
+		'natgeovideo'=>array('host'=>'video.nationalgeographic.com','iframe'=>array('src'=>'//player.d.nationalgeographic.com/players/ngsvideo/share/?guid={@id}'),'name'=>'National Geographic Video','scrape'=>array('extract'=>'@guid="(?\'id\'[-\\w]+)"@','match'=>'@video\\.nationalgeographic\\.com/(?:tv|video)/\\w@'),'tags'=>array('documentaries')),
+		'nbcnews'=>array('extract'=>'!nbcnews\\.com/(?:widget/video-embed/|video/[-\\w]+?-)(?\'id\'\\d+)!','host'=>'nbcnews.com','iframe'=>array('src'=>'//www.nbcnews.com/widget/video-embed/{@id}'),'name'=>'NBC News','tags'=>array('news')),
+		'nbcsports'=>array('host'=>'nbcsports.com','iframe'=>array('src'=>'//vplayer.nbcsports.com/p/BxmELC/nbcsports_embed/select/media/{@id}?parentUrl='),'name'=>'NBC Sports','scrape'=>array('extract'=>'!select/media/(?\'id\'\\w+)!','match'=>'!nbcsports\\.com/video/.!'),'tags'=>array('sports')),
+		'nhl'=>array('attributes'=>array('id'=>array('required'=>'false')),'extract'=>array('#nhl\\.com/videocenter/.*?\\Wid=(?\'id\'[-\\w]+)#','#nhl\\.com/(?:\\w+/)?video(?:/(?![ct]-)[-\\w]+)?(?:/t-(?\'t\'\\d+))?(?:/c-(?\'c\'\\d+))?#'),'host'=>'nhl.com','iframe'=>array('height'=>'360','src'=>'<xsl:choose><xsl:when test="@c or@t">//www.nhl.com/video/embed<xsl:if test="@t">/t-<xsl:value-of select="@t"/></xsl:if><xsl:if test="@c">/c-<xsl:value-of select="@c"/></xsl:if>?autostart=false</xsl:when><xsl:otherwise>//video.nhl.com/videocenter/embed?playlist=<xsl:value-of select="@id"/></xsl:otherwise></xsl:choose>','width'=>'640'),'name'=>'NHL Videos and Highlights','tags'=>array('sports')),
+		'npr'=>array('host'=>array('npr.org','n.pr'),'iframe'=>array('height'=>'228','max-width'=>'800','src'=>'//www.npr.org/player/embed/{@i}/{@m}','width'=>'100%'),'name'=>'NPR','scrape'=>array('extract'=>'!player/embed/(?\'i\'\\d+)/(?\'m\'\\d+)!','match'=>array('!npr\\.org/[/\\w]+/\\d+!','!n\\.pr/\\w!')),'tags'=>array('podcasts')),
+		'nytimes'=>array('extract'=>array('!nytimes\\.com/video/[a-z]+/(?:[a-z]+/)?(?\'id\'\\d+)!','!nytimes\\.com/video/\\d+/\\d+/\\d+/[a-z]+/(?\'id\'\\d+)!'),'host'=>'nytimes.com','iframe'=>array('height'=>'400','src'=>'//graphics8.nytimes.com/video/players/offsite/index.html?videoId={@id}','width'=>'585'),'name'=>'The New York Times Video','scrape'=>array('extract'=>'!/video/movies/(?\'id\'\\d+)!','match'=>'!nytimes\\.com/movie(?:s/movie)?/(?\'playlist\'\\d+)/[-\\w]+/trailers!','url'=>'http://www.nytimes.com/svc/video/api/playlist/{@playlist}?externalId=true'),'tags'=>array('movies','news')),
+		'oddshot'=>array('extract'=>'!oddshot.tv/shot/(?\'id\'[-\\w]+)!','host'=>'oddshot.tv','iframe'=>array('src'=>'//oddshot.tv/shot/{@id}/embed'),'name'=>'Oddshot','tags'=>array('gaming')),
+		'pastebin'=>array('extract'=>'@pastebin\\.com/(?!u/)(?:\\w+(?:\\.php\\?i=|/))?(?\'id\'\\w+)@','host'=>'pastebin.com','iframe'=>array('height'=>'300','scrolling'=>'','src'=>'//pastebin.com/embed_iframe.php?i={@id}','style'=>array('resize'=>'vertical'),'width'=>'100%'),'name'=>'Pastebin'),
+		'playstv'=>array('extract'=>'!plays\\.tv/video/(?\'id\'\\w+)!','host'=>'plays.tv','iframe'=>array('src'=>'//plays.tv/embeds/{@id}'),'name'=>'Plays.tv','scrape'=>array('extract'=>'!plays\\.tv/video/(?\'id\'\\w+)!','match'=>'!plays\\.tv/s/!'),'tags'=>array('gaming')),
+		'podbean'=>array('extract'=>'!podbean\\.com/site/player/index/pid/\\d+/eid/(?\'id\'\\d+)!','host'=>'podbean.com','iframe'=>array('height'=>'100','max-width'=>'900','src'=>'//www.podbean.com/media/player/audio/postId/{@id}','width'=>'100%'),'name'=>'Podbean','scrape'=>array('extract'=>'!embed/postId/(?\'id\'\\d+)!','match'=>'!podbean\\.com/e/!'),'tags'=>array('podcasts')),
+		'prezi'=>array('extract'=>'#//prezi\\.com/(?!(?:a(?:bout|mbassadors)|c(?:o(?:llaborate|mmunity|ntact)|reate)|exp(?:erts|lore)|ip(?:ad|hone)|jobs|l(?:ear|ogi)n|m(?:ac|obility)|pr(?:es(?:s|ent)|icing)|recommend|support|user|windows|your)/)(?\'id\'\\w+)/#','host'=>'prezi.com','iframe'=>array('height'=>'400','src'=>'//prezi.com/embed/{@id}/','width'=>'550'),'name'=>'Prezi','tags'=>array('presentations')),
+		'reddit'=>array('extract'=>'!(?\'path\'/r/\\w+/comments/\\w+/(?:\\w+/\\w+)?)!','host'=>'reddit.com','iframe'=>array('height'=>'165','onload'=>'var a=Math.random();window.addEventListener(\'message\',function(b){{if(b.data.id==a)style.height=b.data.height+\'px\'}});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')','src'=>'https://s9e.github.io/iframe/reddit.min.html#{@path}','width'=>'800'),'name'=>'Reddit threads and comments','tags'=>array('social')),
+		'rutube'=>array('extract'=>'!rutube\\.ru/tracks/(?\'id\'\\d+)!','host'=>'rutube.ru','iframe'=>array('height'=>'405','src'=>'//rutube.ru/play/embed/{@id}','width'=>'720'),'name'=>'Rutube','scrape'=>array('extract'=>'!rutube\\.ru/play/embed/(?\'id\'\\d+)!','match'=>'!rutube\\.ru/video/[0-9a-f]{32}!'),'tags'=>array('.ru')),
+		'scribd'=>array('extract'=>'!scribd\\.com/(?:mobile/)?doc(?:ument)?/(?\'id\'\\d+)!','host'=>'scribd.com','iframe'=>array('height'=>'500','src'=>'https://www.scribd.com/embeds/{@id}/content?view_mode=scroll&show_recommendations=false','style'=>array('resize'=>'vertical'),'width'=>'100%'),'name'=>'Scribd','tags'=>array('documents','presentations')),
+		'slideshare'=>array('extract'=>'!slideshare\\.net/[^/]+/[-\\w]+-(?\'id\'\\d{6,})$!','host'=>'slideshare.net','iframe'=>array('height'=>'356','src'=>'//www.slideshare.net/slideshow/embed_code/{@id}','width'=>'427'),'name'=>'SlideShare','scrape'=>array('extract'=>'!"presentationId":(?\'id\'\\d+)!','match'=>'!slideshare\\.net/[^/]+/\\w!'),'tags'=>array('presentations')),
+		'soundcloud'=>array('extract'=>array('@(?\'id\'https?://(?:api\\.)?soundcloud\\.com/(?!pages/)[-/\\w]+/[-/\\w]+|^[^/]+/[^/]+$)@','@api\\.soundcloud\\.com/playlists/(?\'playlist_id\'\\d+)@','@api\\.soundcloud\\.com/tracks/(?\'track_id\'\\d+)(?:\\?secret_token=(?\'secret_token\'[-\\w]+))?@','@soundcloud\\.com/(?!playlists|tracks)[-\\w]+/[-\\w]+/(?=s-)(?\'secret_token\'[-\\w]+)@'),'host'=>'soundcloud.com','iframe'=>array('height'=>'<xsl:choose><xsl:when test="@playlist_id or contains(@id,\'/sets/\')">450</xsl:when><xsl:otherwise>166</xsl:otherwise></xsl:choose>','max-width'=>'900','src'=>'https://w.soundcloud.com/player/?url=<xsl:choose><xsl:when test="@playlist_id">https%3A//api.soundcloud.com/playlists/<xsl:value-of select="@playlist_id"/></xsl:when><xsl:when test="@track_id">https%3A//api.soundcloud.com/tracks/<xsl:value-of select="@track_id"/>&amp;secret_token=<xsl:value-of select="@secret_token"/></xsl:when><xsl:otherwise><xsl:if test="not(contains(@id,\'://\'))">https%3A//soundcloud.com/</xsl:if><xsl:value-of select="@id"/></xsl:otherwise></xsl:choose>','width'=>'100%'),'name'=>'SoundCloud','scrape'=>array(array('extract'=>'@soundcloud:tracks:(?\'track_id\'\\d+)@','match'=>'@soundcloud\\.com/(?!playlists|tracks)[-\\w]+/[-\\w]+/s-@'),array('extract'=>'@soundcloud://playlists:(?\'playlist_id\'\\d+)@','match'=>'@soundcloud\\.com/\\w+/sets/@')),'tags'=>array('music')),
+		'sportsnet'=>array('host'=>'sportsnet.ca','iframe'=>array('src'=>'https://images.rogersdigitalmedia.com/video_service.php?videoId={@id}&playerKey=AQ~~,AAAAAGWRwLc~,cRCmKE8Utf7OFWP38XQcokFZ80fR-u_y&autoStart=false&width=100%25&height=100%25'),'name'=>'Sportsnet','scrape'=>array('extract'=>array('/vid(?:eoId)?=(?\'id\'\\d+)/','/param name="@videoPlayer" value="(?\'id\'\\d+)"/')),'tags'=>array('.ca','sports')),
+		'spotify'=>array('extract'=>array('!(?\'uri\'spotify:(?:album|artist|user|track(?:set)?):[-,:\\w]+)!','!(?:open|play)\\.spotify\\.com/(?\'path\'(?:album|artist|track|user)/[-/\\w]+)!'),'host'=>array('open.spotify.com','play.spotify.com'),'iframe'=>array('height'=>'480','src'=>'https://embed.spotify.com/?view=coverart&amp;uri=<xsl:choose><xsl:when test="@uri"><xsl:value-of select="@uri"/></xsl:when><xsl:otherwise>spotify:<xsl:value-of select="translate(@path,\'/\',\':\')"/></xsl:otherwise></xsl:choose>','width'=>'400'),'name'=>'Spotify','scheme'=>'spotify','tags'=>array('music')),
+		'steamstore'=>array('extract'=>'!store.steampowered.com/app/(?\'id\'\\d+)!','host'=>'store.steampowered.com','iframe'=>array('height'=>'190','max-width'=>'900','src'=>'//store.steampowered.com/widget/{@id}','width'=>'100%'),'name'=>'Steam store','tags'=>array('gaming')),
+		'stitcher'=>array('host'=>'stitcher.com','iframe'=>array('height'=>'150','max-width'=>'900','src'=>'//app.stitcher.com/splayer/f/{@fid}/{@eid}','width'=>'100%'),'name'=>'Stitcher','scrape'=>array('extract'=>array('!data-eid="(?\'eid\'\\d+)!','!data-fid="(?\'fid\'\\d+)!'),'match'=>'!/podcast/!'),'tags'=>array('podcasts')),
+		'strawpoll'=>array('extract'=>'!strawpoll\\.me/(?\'id\'\\d+)!','host'=>'strawpoll.me','iframe'=>array('height'=>'360','scrolling'=>'','src'=>'//www.strawpoll.me/embed_1/{@id}','width'=>'640'),'name'=>'Straw Poll'),
+		'streamable'=>array('extract'=>'!streamable\\.com/(?\'id\'\\w+)!','host'=>'streamable.com','iframe'=>array('src'=>'//streamable.com/e/{@id}'),'name'=>'Streamable','tags'=>array('videos')),
+		'teamcoco'=>array('extract'=>'!teamcoco\\.com/video/(?\'id\'\\d+)!','host'=>'teamcoco.com','iframe'=>array('height'=>'415','src'=>'//teamcoco.com/embed/v/{@id}','width'=>'640'),'name'=>'Team Coco','scrape'=>array('extract'=>'!"id":(?\'id\'\\d+)!','match'=>'!teamcoco\\.com/video/.!'),'tags'=>array('entertainment')),
+		'ted'=>array('extract'=>'#ted\\.com/(?\'id\'(?:talk|playlist)s/[-\\w]+(?:\\.html)?)(?![-\\w]|/transcript)#i','host'=>'ted.com','iframe'=>array('src'=>'//embed.ted.com/<xsl:value-of select="@id"/><xsl:if test="not(contains(@id,\'.html\'))">.html</xsl:if>'),'name'=>'TED Talks','tags'=>array('presentations')),
+		'theatlantic'=>array('extract'=>'!theatlantic\\.com/video/index/(?\'id\'\\d+)!','host'=>'theatlantic.com','iframe'=>array('height'=>'360','src'=>'//www.theatlantic.com/video/iframe/{@id}/','width'=>'640'),'name'=>'The Atlantic Video','tags'=>array('news')),
+		'theguardian'=>array('extract'=>'!theguardian\\.com/(?\'id\'\\w+/video/[-/\\w]+)!','host'=>'theguardian.com','iframe'=>array('src'=>'//embed.theguardian.com/embed/video/{@id}'),'name'=>'The Guardian','tags'=>array('news')),
+		'theonion'=>array('extract'=>'!theonion\\.com/video/[-\\w]+[-,](?\'id\'\\d+)!','host'=>'theonion.com','iframe'=>array('src'=>'//www.theonion.com/video_embed/?id={@id}'),'name'=>'The Onion','tags'=>array('entertainment')),
+		'tinypic'=>array('extract'=>array('!tinypic\\.com/player\\.php\\?v=(?\'id\'\\w+)&s=(?\'s\'\\d+)!','!tinypic\\.com/r/(?\'id\'\\w+)/(?\'s\'\\d+)!'),'flash'=>array('padding-height'=>'30','src'=>'//tinypic.com/player.swf?file={@id}&s={@s}'),'host'=>'tinypic.com','name'=>'TinyPic videos','tags'=>array('images')),
+		'tmz'=>array('extract'=>'@tmz\\.com/videos/(?\'id\'\\w+)@','host'=>'tmz.com','iframe'=>array('src'=>'//www.kaltura.com/index.php/kwidget/cache_st/133592691/wid/_591531/partner_id/591531/uiconf_id/9071262/entry_id/{@id}'),'name'=>'TMZ','tags'=>array('gossip')),
+		'traileraddict'=>array('host'=>'traileraddict.com','iframe'=>array('src'=>'//v.traileraddict.com/{@id}'),'name'=>'Trailer Addict','scrape'=>array('extract'=>'@v\\.traileraddict\\.com/(?\'id\'\\d+)@','match'=>'@traileraddict\\.com/(?!tags/)[^/]+/.@'),'tags'=>array('movies')),
+		'tumblr'=>array('extract'=>'!(?\'name\'[-\\w]+)\\.tumblr\\.com/post/(?\'id\'\\d+)!','host'=>'tumblr.com','iframe'=>array('height'=>'180','onload'=>'var a=Math.random();window.addEventListener(\'message\',function(b){{if(b.data.id==a)style.height=b.data.height+\'px\'}});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')','src'=>'https://s9e.github.io/iframe/tumblr.min.html#{@key}/{@id}','width'=>'520'),'name'=>'Tumblr','scrape'=>array('extract'=>array('!did=\\\\u0022(?\'did\'[-\\w]+)!','!embed\\\\/post\\\\/(?\'key\'[-\\w]+)!'),'match'=>'!\\w\\.tumblr\\.com/post/\\d!','url'=>'http://www.tumblr.com/oembed/1.0?url=http://{@name}.tumblr.com/post/{@id}'),'tags'=>array('social')),
+		'twitch'=>array('extract'=>array('#twitch\\.tv/(?\'channel\'\\w+)(?:/b/(?\'archive_id\'\\d+)|/c/(?\'chapter_id\'\\d+)|/v/(?\'video_id\'\\d+))?#','#t=(?\'t\'(?:(?:\\d+h)?\\d+m)?\\d+s)#','#clips\\.twitch\\.tv/(?\'channel\'\\w+)/(?\'clip_id\'\\w+)#'),'host'=>'twitch.tv','iframe'=>array('src'=>'<xsl:choose><xsl:when test="@clip_id">//clips.twitch.tv/embed?autoplay=false&amp;clip=<xsl:value-of select="@channel"/>/<xsl:value-of select="@clip_id"/></xsl:when><xsl:otherwise>//player.twitch.tv/?autoplay=false&amp;<xsl:choose><xsl:when test="@archive_id">video=a<xsl:value-of select="@archive_id"/></xsl:when><xsl:when test="@chapter_id">video=c<xsl:value-of select="@chapter_id"/></xsl:when><xsl:when test="@video_id">video=v<xsl:value-of select="@video_id"/></xsl:when><xsl:otherwise>channel=<xsl:value-of select="@channel"/></xsl:otherwise></xsl:choose><xsl:if test="@t">&amp;time=<xsl:value-of select="@t"/></xsl:if></xsl:otherwise></xsl:choose>'),'name'=>'Twitch','tags'=>array('gaming')),
+		'twitter'=>array('extract'=>'@twitter\\.com/(?:#!/)?\\w+/status(?:es)?/(?\'id\'\\d+)@','host'=>'twitter.com','iframe'=>array('height'=>'186','onload'=>'var a=Math.random();window.addEventListener(\'message\',function(b){{if(b.data.id==a)style.height=b.data.height+\'px\'}});contentWindow.postMessage(\'s9e:\'+a,\'https://s9e.github.io\')','src'=>'https://s9e.github.io/iframe/twitter.min.html#{@id}','style'=>array('background'=>'url(https://abs.twimg.com/favicons/favicon.ico) no-repeat 50% 50%'),'width'=>'500'),'name'=>'Twitter','tags'=>array('social')),
+		'ustream'=>array('choose'=>array('otherwise'=>array('iframe'=>array('src'=>'//www.ustream.tv/embed/{@cid}?html5ui')),'when'=>array('iframe'=>array('src'=>'//www.ustream.tv/embed/recorded/{@vid}?html5ui'),'test'=>'@vid')),'extract'=>'!ustream\\.tv/recorded/(?\'vid\'\\d+)!','host'=>'ustream.tv','name'=>'Ustream','scrape'=>array('extract'=>'!embed/(?\'cid\'\\d+)!','match'=>'#ustream\\.tv/(?!explore/|platform/|recorded/|search\\?|upcoming$|user/)(?:channel/)?[-\\w]+#'),'tags'=>array('gaming')),
+		'vbox7'=>array('extract'=>'!vbox7\\.com/play:(?\'id\'[\\da-f]+)!','host'=>'vbox7.com','iframe'=>array('src'=>'//vbox7.com/emb/external.php?vid={@id}'),'name'=>'VBOX7','tags'=>array('.bg')),
+		'veoh'=>array('extract'=>'!veoh\\.com/(?:m/watch\\.php\\?v=|watch/)v(?\'id\'\\w+)!','flash'=>array('padding-height'=>'40','src'=>'//www.veoh.com/swf/webplayer/WebPlayer.swf?version=AFrontend.5.7.0.1509&permalinkId=v{@id}&player=videodetailsembedded&videoAutoPlay=0&id=anonymous'),'host'=>'veoh.com','name'=>'Veoh','tags'=>array('videos')),
+		'vevo'=>array('extract'=>'!vevo\\.com/watch/([-/\\w]+/)?(?\'id\'[A-Z0-9]+)!','host'=>'vevo.com','iframe'=>array('height'=>'324','src'=>'//cache.vevo.com/m/html/embed.html?video={@id}','width'=>'575'),'name'=>'VEVO','tags'=>array('music')),
+		'viagame'=>array('extract'=>'!viagame\\.com/channels/[^/]+/(?\'id\'\\d+)!','host'=>'viagame.com','iframe'=>array('height'=>'392','src'=>'//www.viagame.com/embed/{@id}','width'=>'640'),'name'=>'Viagame','tags'=>array('gaming')),
+		'videodetective'=>array('extract'=>'!videodetective\\.com/\\w+/[-\\w]+/(?:trailer/P0*)?(?\'id\'\\d+)!','host'=>'videodetective.com','iframe'=>array('src'=>'//www.videodetective.com/embed/video/?options=false&autostart=false&playlist=none&publishedid={@id}'),'name'=>'Video Detective'),
+		'videomega'=>array('extract'=>'!videomega\\.tv/\\?ref=(?\'id\'\\w+)!','host'=>'videomega.tv','iframe'=>array('src'=>'//videomega.tv/iframe.php?ref={@id}'),'name'=>'Videomega','tags'=>array('videos')),
+		'vidme'=>array('attributes'=>array('height'=>array('defaultValue'=>'360'),'width'=>array('defaultValue'=>'640')),'extract'=>'!vid\\.me/(?\'id\'\\w+)!','host'=>'vid.me','iframe'=>array('height'=>'{@height}','src'=>'https://vid.me/e/{@id}','width'=>'{@width}'),'name'=>'vidme','scrape'=>array('extract'=>'!meta property="og:video:type" content="video/\\w+">\\s*<meta property="og:video:height" content="(?\'height\'\\d+)">\\s*<meta property="og:video:width" content="(?\'width\'\\d+)!'),'tags'=>array('videos')),
+		'vimeo'=>array('extract'=>'!vimeo\\.com/(?:channels/[^/]+/|video/)?(?\'id\'\\d+)!','host'=>'vimeo.com','iframe'=>array('src'=>'//player.vimeo.com/video/{@id}'),'name'=>'Vimeo','tags'=>array('videos')),
+		'vine'=>array('extract'=>'!vine\\.co/v/(?\'id\'[^/]+)!','host'=>'vine.co','iframe'=>array('height'=>'480','src'=>'https://vine.co/v/{@id}/embed/simple?audio=1','width'=>'480'),'name'=>'Vine','tags'=>array('social','videos')),
+		'vk'=>array('extract'=>array('!vk(?:\\.com|ontakte\\.ru)/(?:[\\w.]+\\?z=)?video(?\'oid\'-?\\d+)_(?\'vid\'\\d+)!','!vk(?:\\.com|ontakte\\.ru)/video_ext\\.php\\?oid=(?\'oid\'-?\\d+)&id=(?\'vid\'\\d+)&hash=(?\'hash\'[0-9a-f]+)!'),'host'=>array('vk.com','vkontakte.ru'),'iframe'=>array('height'=>'360','src'=>'//vk.com/video_ext.php?oid={@oid}&id={@vid}&hash={@hash}&hd=1','width'=>'607'),'name'=>'VK','scrape'=>array('extract'=>'!embed_hash=(?\'hash\'[0-9a-f]+)!','match'=>'!vk.*?video-?\\d+_\\d+!','url'=>'http://vk.com/video{@oid}_{@vid}'),'tags'=>array('.ru')),
+		'vocaroo'=>array('extract'=>'!vocaroo\\.com/i/(?\'id\'\\w+)!','flash'=>array('height'=>'44','src'=>'//vocaroo.com/player.swf?playMediaID={@id}&autoplay=0','width'=>'148'),'host'=>'vocaroo.com','name'=>'Vocaroo'),
+		'vox'=>array('extract'=>'!vox.com/.*#ooid=(?\'id\'[-\\w]+)!','host'=>'vox.com','iframe'=>array('src'=>'//player.ooyala.com/iframe.html#pbid=a637d53c5c0a43c7bf4e342886b9d8b0&ec={@id}'),'name'=>'Vox'),
+		'washingtonpost'=>array('extract'=>array('#washingtonpost\\.com/video/c/\\w+/(?\'id\'[-0-9a-f]+)#','#washingtonpost\\.com/video/[-/\\w]+/(?\'id\'[-0-9a-f]+)_video\\.html#'),'host'=>'washingtonpost.com','iframe'=>array('src'=>'//www.washingtonpost.com/video/c/embed/{@id}'),'name'=>'Washington Post Video','tags'=>array('news')),
+		'wshh'=>array('extract'=>'!worldstarhiphop\\.com/featured/(?\'id\'\\d+)!','host'=>'worldstarhiphop.com','iframe'=>array('height'=>'360','src'=>'//www.worldstarhiphop.com/embed/{@id}','width'=>'640'),'name'=>'WorldStarHipHop','scrape'=>array('extract'=>'!disqus_identifier[ =\']+(?\'id\'\\d+)!','match'=>'!worldstarhiphop\\.com/(?:\\w+/)?video\\.php\\?v=\\w+!'),'tags'=>array('videos')),
+		'wsj'=>array('extract'=>array('@wsj\\.com/[^#]*#!(?\'id\'[-0-9A-F]{36})@','@wsj\\.com/video/[^/]+/(?\'id\'[-0-9A-F]{36})@'),'host'=>'wsj.com','iframe'=>array('height'=>'288','src'=>'//video-api.wsj.com/api-video/player/iframe.html?guid={@id}','width'=>'512'),'name'=>'The Wall Street Journal Online','scrape'=>array('extract'=>'@guid=(?\'id\'[-0-9A-F]{36})@','match'=>'@on\\.wsj\\.com/\\w@'),'tags'=>array('news')),
+		'xboxclips'=>array('extract'=>'@xboxclips\\.com/(?\'user\'[^/]+)/(?!screenshots/)(?\'id\'[-0-9a-f]+)@','host'=>'xboxclips.com','iframe'=>array('src'=>'//xboxclips.com/{@user}/{@id}/embed'),'name'=>'XboxClips','tags'=>array('gaming')),
+		'xboxdvr'=>array('extract'=>'!xboxdvr\\.com/gamer/(?\'user\'[^/]+)/video/(?\'id\'\\d+)!','host'=>'xboxdvr.com','iframe'=>array('height'=>'360','src'=>'//xboxdvr.com/gamer/{@user}/video/{@id}/embed','width'=>'640'),'name'=>'Xbox DVR','tags'=>array('gaming')),
+		'yahooscreen'=>array('extract'=>'!screen\\.yahoo\\.com/(?:[-\\w]+/)?(?\'id\'[-\\w]+)\\.html!','host'=>'screen.yahoo.com','iframe'=>array('height'=>'360','src'=>'https://screen.yahoo.com/{@id}.html?format=embed','width'=>'640'),'name'=>'Yahoo! Screen','tags'=>array('movies')),
+		'youku'=>array('extract'=>'!youku\\.com/v_show/id_(?\'id\'\\w+)!','flash'=>array('padding-height'=>'40','src'=>'https://players.youku.com/player.php/sid/{@id}/v.swf'),'host'=>'youku.com','name'=>'Youku','tags'=>array('.cn')),
+		'youtube'=>array('extract'=>array('!youtube\\.com/(?:watch.*?v=|v/)(?\'id\'[-\\w]+)!','!youtu\\.be/(?\'id\'[-\\w]+)!','![#&?]t=(?:(?:(?\'h\'\\d+)h)?(?\'m\'\\d+)m(?\'s\'\\d+)|(?\'t\'\\d+))!','!&list=(?\'list\'[-\\w]+)!'),'host'=>array('youtube.com','youtu.be'),'iframe'=>array('src'=>'https://www.youtube.com/embed/<xsl:value-of select="@id"/><xsl:if test="@list">?list=<xsl:value-of select="@list"/></xsl:if><xsl:if test="@t or@m"><xsl:choose><xsl:when test="@list">&amp;</xsl:when><xsl:otherwise>?</xsl:otherwise></xsl:choose>start=<xsl:choose><xsl:when test="@t"><xsl:value-of select="@t"/></xsl:when><xsl:when test="@h"><xsl:value-of select="@h*3600+@m*60+@s"/></xsl:when><xsl:otherwise><xsl:value-of select="@m*60+@s"/></xsl:otherwise></xsl:choose></xsl:if>','style'=>array('background'=>'url(https://i.ytimg.com/vi/{@id}/hqdefault.jpg) 50% 50% / cover')),'name'=>'YouTube','tags'=>array('videos')),
+		'zippyshare'=>array('flash'=>array('flashvars'=>'file={@file}&server={@server}&autostart=false','height'=>'80','max-width'=>'900','src'=>'//api.zippyshare.com/api/player.swf','width'=>'100%'),'host'=>'zippyshare.com','name'=>'Zippyshare audio files','scrape'=>array('extract'=>'!file=(?\'file\'\\w+)&amp;server=(?\'server\'\\d+)!','match'=>'!/v/!'),'tags'=>array('file sharing'))
+	);
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/Collections/SiteCollection.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\MediaEmbed\Configurator\Collections;
+use ArrayObject;
+use s9e\TextFormatter\Configurator\ConfigProvider;
+use s9e\TextFormatter\Configurator\JavaScript\Dictionary;
+class SiteCollection extends ArrayObject implements ConfigProvider
+{
+	public function asConfig()
+	{
+		$map = array();
+		foreach ($this as $siteId => $siteConfig)
+		{
+			if (isset($siteConfig['host']))
+				foreach ((array) $siteConfig['host'] as $host)
+					$map[$host] = $siteId;
+			if (isset($siteConfig['scheme']))
+				foreach ((array) $siteConfig['scheme'] as $scheme)
+					$map[$scheme . ':'] = $siteId;
+		}
+		return new Dictionary($map);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/Collections/SiteDefinitionCollection.php
@@ -0,0 +1,36 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\MediaEmbed\Configurator\Collections;
+use InvalidArgumentException;
+use RuntimeException;
+use s9e\TextFormatter\Configurator\Collections\NormalizedCollection;
+class SiteDefinitionCollection extends NormalizedCollection
+{
+	protected $onDuplicateAction = 'replace';
+	protected function getAlreadyExistsException($key)
+	{
+		return new RuntimeException("Media site '" . $key . "' already exists");
+	}
+	protected function getNotExistException($key)
+	{
+		return new RuntimeException("Media site '" . $key . "' does not exist");
+	}
+	public function normalizeKey($siteId)
+	{
+		$siteId = \strtolower($siteId);
+		if (!\preg_match('(^[a-z0-9]+$)', $siteId))
+			throw new InvalidArgumentException('Invalid site ID');
+		return $siteId;
+	}
+	public function normalizeValue($siteConfig)
+	{
+		if (!\is_array($siteConfig))
+			throw new InvalidArgumentException('Invalid site definition type');
+		return $siteConfig;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/Collections/XmlFileDefinitionCollection.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\MediaEmbed\Configurator\Collections;
+use DOMDocument;
+use DOMElement;
+use InvalidArgumentException;
+class XmlFileDefinitionCollection extends SiteDefinitionCollection
+{
+	public function __construct($path)
+	{
+		if (!\file_exists($path) || !\is_dir($path))
+			throw new InvalidArgumentException('Invalid site directory');
+		foreach (\glob($path . '/*.xml') as $filepath)
+		{
+			$siteId = \basename($filepath, '.xml');
+			$this->items[$siteId] = $this->getConfigFromXmlFile($filepath);
+		}
+	}
+	protected function flattenConfig(array $config)
+	{
+		foreach ($config as $k => $v)
+			if (\is_array($v) && \count($v) === 1)
+				$config[$k] = \end($v);
+		return $config;
+	}
+	protected function getConfigFromXmlFile($filepath)
+	{
+		$dom = new DOMDocument;
+		$dom->load($filepath);
+		return $this->getElementConfig($dom->documentElement);
+	}
+	protected function getElementConfig(DOMElement $element)
+	{
+		$config = array();
+		foreach ($element->attributes as $attribute)
+			$config[$attribute->name][] = $attribute->value;
+		foreach ($element->childNodes as $childNode)
+			if ($childNode instanceof DOMElement)
+				$config[$childNode->nodeName][] = $this->getValueFromElement($childNode);
+		return $this->flattenConfig($config);
+	}
+	protected function getValueFromElement(DOMElement $element)
+	{
+		return (!$element->attributes->length && $element->childNodes->length === 1)
+		     ? $element->nodeValue
+		     : $this->getElementConfig($element);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/TemplateBuilder.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\MediaEmbed\Configurator;
+use DOMXPath;
+use s9e\TextFormatter\Configurator\Helpers\TemplateHelper;
+use s9e\TextFormatter\Plugins\MediaEmbed\Configurator\TemplateGenerators\Choose;
+use s9e\TextFormatter\Plugins\MediaEmbed\Configurator\TemplateGenerators\Flash;
+use s9e\TextFormatter\Plugins\MediaEmbed\Configurator\TemplateGenerators\Iframe;
+class TemplateBuilder
+{
+	protected $templateGenerators = array();
+	public function __construct()
+	{
+		$this->templateGenerators['choose'] = new Choose($this);
+		$this->templateGenerators['flash']  = new Flash;
+		$this->templateGenerators['iframe'] = new Iframe;
+	}
+	public function build($siteId, array $siteConfig)
+	{
+		return $this->addSiteId($siteId, $this->getTemplate($siteConfig));
+	}
+	public function getTemplate(array $config)
+	{
+		foreach ($this->templateGenerators as $type => $generator)
+			if (isset($config[$type]))
+				return $generator->getTemplate($config[$type]);
+		return '';
+	}
+	protected function addSiteId($siteId, $template)
+	{
+		$dom   = TemplateHelper::loadTemplate($template);
+		$xpath = new DOMXPath($dom);
+		$query = '//*[namespace-uri() != "' . TemplateHelper::XMLNS_XSL . '"][not(ancestor::*[namespace-uri() != "' . TemplateHelper::XMLNS_XSL . '"])]';
+		foreach ($xpath->query($query) as $element)
+			$element->setAttribute('data-s9e-mediaembed', $siteId);
+		return TemplateHelper::saveTemplate($dom);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/TemplateGenerator.php
@@ -0,0 +1,108 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\MediaEmbed\Configurator;
+use s9e\TextFormatter\Configurator\Helpers\AVTHelper;
+abstract class TemplateGenerator
+{
+	protected $attributes;
+	protected $defaultAttributes = array(
+		'height'         => 360,
+		'padding-height' => 0,
+		'style'          => array(),
+		'width'          => 640
+	);
+	abstract protected function getContentTemplate();
+	public function getTemplate(array $attributes)
+	{
+		$this->attributes = $attributes + $this->defaultAttributes;
+		$prepend = $append = '';
+		if ($this->needsWrapper())
+		{
+			$this->attributes['style']['width']    = '100%';
+			$this->attributes['style']['height']   = '100%';
+			$this->attributes['style']['position'] = 'absolute';
+			$this->attributes['style']['left'] = '0';
+			$outerStyle = 'display:inline-block;width:100%;max-width:' . $this->attributes['width'] . 'px';
+			$innerStyle = 'overflow:hidden;position:relative;' . $this->getResponsivePadding();
+			$prepend .= '<div>' . $this->generateAttributes(array('style' => $outerStyle));
+			$prepend .= '<div>' . $this->generateAttributes(array('style' => $innerStyle));
+			$append  .= '</div></div>';
+		}
+		else
+		{
+			$this->attributes['style']['width']  = '100%';
+			$this->attributes['style']['height'] = $this->attributes['height'] . 'px';
+			if (isset($this->attributes['max-width']))
+				$this->attributes['style']['max-width'] = $this->attributes['max-width'] . 'px';
+			elseif ($this->attributes['width'] !== '100%')
+			{
+				$property = ($this->hasDynamicWidth()) ? 'width' : 'max-width';
+				$this->attributes['style'][$property] = $this->attributes['width'] . 'px';
+			}
+		}
+		return $prepend . $this->getContentTemplate() . $append;
+	}
+	protected function expr($expr)
+	{
+		$expr = \trim($expr, '{}');
+		return (\preg_match('(^[@$]?[-\\w]+$)D', $expr)) ? $expr : "($expr)";
+	}
+	protected function getResponsivePadding()
+	{
+		$height        = $this->expr($this->attributes['height']);
+		$paddingHeight = $this->expr($this->attributes['padding-height']);
+		$width         = $this->expr($this->attributes['width']);
+		$css = 'padding-bottom:<xsl:value-of select="100*(' . $height . '+' . $paddingHeight . ')div' . $width . '"/>%';
+		
+		if (!empty($this->attributes['padding-height']))
+			$css .= ';padding-bottom:calc(<xsl:value-of select="100*' . $height . ' div' . $width . '"/>% + ' . $paddingHeight . 'px)';
+		if (\strpos($width, '@') !== \false)
+			$css = '<xsl:if test="@width&gt;0">' . $css . '</xsl:if>';
+		return $css;
+	}
+	protected function generateAttributes(array $attributes)
+	{
+		if (isset($attributes['style']) && \is_array($attributes['style']))
+			$attributes['style'] = $this->generateStyle($attributes['style']);
+		\ksort($attributes);
+		$xsl = '';
+		foreach ($attributes as $attrName => $attrValue)
+		{
+			$innerXML = (\strpos($attrValue, '<xsl:') !== \false) ? $attrValue : AVTHelper::toXSL($attrValue);
+			$xsl .= '<xsl:attribute name="' . \htmlspecialchars($attrName, \ENT_QUOTES, 'UTF-8') . '">' . $innerXML . '</xsl:attribute>';
+		}
+		return $xsl;
+	}
+	protected function generateStyle(array $properties)
+	{
+		\ksort($properties);
+		$style = '';
+		foreach ($properties as $name => $value)
+			$style .= $name . ':' . $value . ';';
+		return \trim($style, ';');
+	}
+	protected function hasDynamicHeight()
+	{
+		return (isset($this->attributes['onload']) && \strpos($this->attributes['onload'], '.height') !== \false);
+	}
+	protected function hasDynamicWidth()
+	{
+		return (isset($this->attributes['onload']) && \strpos($this->attributes['onload'], '.width') !== \false);
+	}
+	protected function mergeAttributes(array $defaultAttributes, array $newAttributes)
+	{
+		$attributes = \array_merge($defaultAttributes, $newAttributes);
+		if (isset($defaultAttributes['style'], $newAttributes['style']))
+			$attributes['style'] += $defaultAttributes['style'];
+		return $attributes;
+	}
+	protected function needsWrapper()
+	{
+		return ($this->attributes['width'] !== '100%' && !$this->hasDynamicHeight());
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/TemplateGenerators/Choose.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\MediaEmbed\Configurator\TemplateGenerators;
+use s9e\TextFormatter\Plugins\MediaEmbed\Configurator\TemplateBuilder;
+use s9e\TextFormatter\Plugins\MediaEmbed\Configurator\TemplateGenerator;
+class Choose extends TemplateGenerator
+{
+	protected $templateBuilder;
+	public function __construct(TemplateBuilder $templateBuilder)
+	{
+		$this->templateBuilder = $templateBuilder;
+	}
+	protected function needsWrapper()
+	{
+		return \false;
+	}
+	protected function getContentTemplate()
+	{
+		$branches = (isset($this->attributes['when'][0])) ? $this->attributes['when'] : array($this->attributes['when']);
+		$template = '<xsl:choose>';
+		foreach ($branches as $when)
+			$template .= '<xsl:when test="' . \htmlspecialchars($when['test'], \ENT_COMPAT, 'UTF-8') . '">' . $this->templateBuilder->getTemplate($when) . '</xsl:when>';
+		$template .= '<xsl:otherwise>' . $this->templateBuilder->getTemplate($this->attributes['otherwise']) . '</xsl:otherwise></xsl:choose>';
+		return $template;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/TemplateGenerators/Flash.php
@@ -0,0 +1,34 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\MediaEmbed\Configurator\TemplateGenerators;
+use s9e\TextFormatter\Plugins\MediaEmbed\Configurator\TemplateGenerator;
+class Flash extends TemplateGenerator
+{
+	protected function getContentTemplate()
+	{
+		$attributes = array(
+			'data'          => $this->attributes['src'],
+			'style'         => $this->attributes['style'],
+			'type'          => 'application/x-shockwave-flash',
+			'typemustmatch' => ''
+		);
+		$flashVarsParam = '';
+		if (isset($this->attributes['flashvars']))
+			$flashVarsParam = $this->generateParamElement('flashvars', $this->attributes['flashvars']);
+		$template = '<object>'
+		          . $this->generateAttributes($attributes)
+		          . $this->generateParamElement('allowfullscreen', 'true')
+		          . $flashVarsParam
+		          . '</object>';
+		return $template;
+	}
+	protected function generateParamElement($paramName, $paramValue)
+	{
+		return '<param name="' . \htmlspecialchars($paramName) . '">' . $this->generateAttributes(array('value' => $paramValue)) . '</param>';
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/MediaEmbed/Configurator/TemplateGenerators/Iframe.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\MediaEmbed\Configurator\TemplateGenerators;
+use s9e\TextFormatter\Plugins\MediaEmbed\Configurator\TemplateGenerator;
+class Iframe extends TemplateGenerator
+{
+	protected $defaultIframeAttributes = array(
+		'allowfullscreen' => '',
+		'scrolling'       => 'no',
+		'style'           => array('border' => '0')
+	);
+	protected $iframeAttributes = array('onload', 'scrolling', 'src', 'style');
+	protected function getContentTemplate()
+	{
+		$attributes = $this->mergeAttributes($this->defaultIframeAttributes, $this->getFilteredAttributes());
+		return '<iframe>' . $this->generateAttributes($attributes) . '</iframe>';
+	}
+	protected function getFilteredAttributes()
+	{
+		return \array_intersect_key($this->attributes, \array_flip($this->iframeAttributes));
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/MediaEmbed/Parser.js
@@ -0,0 +1,10 @@
+matches.forEach(function(m)
+{
+	var url = m[0][0],
+		pos = m[0][1],
+		len = url.length,
+		// Give that tag priority over other tags such as Autolink's
+		tag = addSelfClosingTag(config.tagName, pos, len, -10);
+
+	tag.setAttribute('url', url);
+});
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/MediaEmbed/Parser.php
@@ -0,0 +1,163 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\MediaEmbed;
+use s9e\TextFormatter\Parser as TagStack;
+use s9e\TextFormatter\Parser\Tag;
+use s9e\TextFormatter\Plugins\ParserBase;
+use s9e\TextFormatter\Utils\Http;
+class Parser extends ParserBase
+{
+	protected static $client;
+	public function parse($text, array $matches)
+	{
+		foreach ($matches as $m)
+		{
+			$url = $m[0][0];
+			$pos = $m[0][1];
+			$len = \strlen($url);
+			$tag = $this->parser->addSelfClosingTag($this->config['tagName'], $pos, $len, -10);
+			$tag->setAttribute('url', $url);
+		}
+	}
+	public static function filterTag(Tag $tag, TagStack $tagStack, array $sites)
+	{
+		if ($tag->hasAttribute('site'))
+			self::addTagFromMediaId($tag, $tagStack, $sites);
+		elseif ($tag->hasAttribute('url'))
+			self::addTagFromMediaUrl($tag, $tagStack, $sites);
+		return \false;
+	}
+	public static function hasNonDefaultAttribute(Tag $tag)
+	{
+		foreach ($tag->getAttributes() as $attrName => $void)
+			if ($attrName !== 'url')
+				return \true;
+		return \false;
+	}
+	public static function scrape(Tag $tag, array $scrapeConfig, $cacheDir = \null)
+	{
+		if ($tag->hasAttribute('url'))
+		{
+			$url = $tag->getAttribute('url');
+			if (\preg_match('#^https?://[^<>"\'\\s]+$#D', $url))
+				foreach ($scrapeConfig as $scrape)
+					self::scrapeEntry($url, $tag, $scrape, $cacheDir);
+		}
+		return \true;
+	}
+	protected static function addSiteTag(Tag $tag, TagStack $tagStack, $siteId)
+	{
+		$endTag = $tag->getEndTag() ?: $tag;
+		$lpos = $tag->getPos();
+		$rpos = $endTag->getPos() + $endTag->getLen();
+		$tagStack->addTagPair(\strtoupper($siteId), $lpos, 0, $rpos, 0, $tag->getSortPriority())->setAttributes($tag->getAttributes());
+	}
+	protected static function addTagFromMediaId(Tag $tag, TagStack $tagStack, array $sites)
+	{
+		$siteId = \strtolower($tag->getAttribute('site'));
+		if (\in_array($siteId, $sites, \true))
+			self::addSiteTag($tag, $tagStack, $siteId);
+	}
+	protected static function addTagFromMediaUrl(Tag $tag, TagStack $tagStack, array $sites)
+	{
+		$p = \parse_url($tag->getAttribute('url'));
+		if (isset($p['scheme']) && isset($sites[$p['scheme'] . ':']))
+			$siteId = $sites[$p['scheme'] . ':'];
+		elseif (isset($p['host']))
+			$siteId = self::findSiteIdByHost($p['host'], $sites);
+		if (!empty($siteId))
+			self::addSiteTag($tag, $tagStack, $siteId);
+	}
+	protected static function findSiteIdByHost($host, array $sites)
+	{
+		do
+		{
+			if (isset($sites[$host]))
+				return $sites[$host];
+			$pos = \strpos($host, '.');
+			if ($pos === \false)
+				break;
+			$host = \substr($host, 1 + $pos);
+		}
+		while ($host > '');
+		return \false;
+	}
+	protected static function getHttpClient()
+	{
+		if (!isset(self::$client))
+			self::$client = Http::getClient();
+		self::$client->timeout = 10;
+		return self::$client;
+	}
+	protected static function replaceTokens($url, array $vars)
+	{
+		return \preg_replace_callback(
+			'#\\{@(\\w+)\\}#',
+			function ($m) use ($vars)
+			{
+				return (isset($vars[$m[1]])) ? $vars[$m[1]] : '';
+			},
+			$url
+		);
+	}
+	protected static function scrapeEntry($url, Tag $tag, array $scrape, $cacheDir)
+	{
+		list($matchRegexps, $extractRegexps, $attrNames) = $scrape;
+		if (!self::tagIsMissingAnyAttribute($tag, $attrNames))
+			return;
+		$vars    = array();
+		$matched = \false;
+		foreach ((array) $matchRegexps as $matchRegexp)
+			if (\preg_match($matchRegexp, $url, $m))
+			{
+				$vars   += $m;
+				$matched = \true;
+			}
+		if (!$matched)
+			return;
+		$vars += $tag->getAttributes();
+		$scrapeUrl = (isset($scrape[3])) ? self::replaceTokens($scrape[3], $vars) : $url;
+		self::scrapeUrl($scrapeUrl, $tag, (array) $extractRegexps, $cacheDir);
+	}
+	protected static function scrapeUrl($url, Tag $tag, array $regexps, $cacheDir)
+	{
+		$content = self::wget($url, $cacheDir);
+		foreach ($regexps as $regexp)
+			if (\preg_match($regexp, $content, $m))
+				foreach ($m as $k => $v)
+					if (!\is_numeric($k) && !$tag->hasAttribute($k))
+						$tag->setAttribute($k, $v);
+	}
+	protected static function tagIsMissingAnyAttribute(Tag $tag, array $attrNames)
+	{
+		foreach ($attrNames as $attrName)
+			if (!$tag->hasAttribute($attrName))
+				return \true;
+		return \false;
+	}
+	protected static function wget($url, $cacheDir = \null)
+	{
+		$prefix = '';
+		$url    = \preg_replace('(#.*)s', '', $url);
+		if (isset($cacheDir) && \file_exists($cacheDir))
+		{
+			$cacheFile = $cacheDir . '/http.' . \crc32($url);
+			if (\extension_loaded('zlib'))
+			{
+				$prefix     = 'compress.zlib://';
+				$cacheFile .= '.gz';
+			}
+			if (\file_exists($cacheFile))
+				return \file_get_contents($prefix . $cacheFile);
+		}
+		$content = @self::getHttpClient()->get($url, array('User-Agent: PHP (not Mozilla)'));
+		if (isset($cacheFile) && !empty($content))
+			\file_put_contents($prefix . $cacheFile, $content);
+		return $content;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/MediaEmbed/Parser/hasNonDefaultAttribute.js
@@ -0,0 +1,18 @@
+/**
+* Test whether a given tag has at least one non-default attribute
+*
+* @param  {!Tag}     tag The original tag
+* @return {!boolean}     Whether the tag contains an attribute not named "url"
+*/
+function (tag)
+{
+	for (var attrName in tag.getAttributes())
+	{
+		if (attrName !== 'url')
+		{
+			return true;
+		}
+	}
+
+	return false;
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/MediaEmbed/Parser/tagFilter.js
@@ -0,0 +1,135 @@
+/**
+* @param  {!Tag}     tag   The original tag
+* @param  {!Object}  sites Map of [host => siteId]
+* @return {!boolean}       Always false
+*/
+function (tag, sites)
+{
+	function in_array(needle, haystack)
+	{
+		var k;
+		for (k in haystack)
+		{
+			if (haystack[k] === needle)
+			{
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	* Filter a MEDIA tag
+	*
+	* This will always invalidate the original tag, and possibly replace it with the tag that
+	* corresponds to the media site
+	*
+	* @param  {!Tag}     tag   The original tag
+	* @param  {!Object}  sites Map of [host => siteId]
+	* @return {!boolean}       Always false
+	*/
+	function filterTag(tag, sites)
+	{
+		if (tag.hasAttribute('site'))
+		{
+			addTagFromMediaId(tag, sites);
+		}
+		else if (tag.hasAttribute('url'))
+		{
+			addTagFromMediaUrl(tag, sites);
+		}
+
+		return false;
+	}
+
+	/**
+	* Add a site tag
+	*
+	* @param {!Tag}    tag    The original tag
+	* @param {!string} siteId Site ID
+	*/
+	function addSiteTag(tag, siteId)
+	{
+		var endTag = tag.getEndTag() || tag;
+
+		// Compute the boundaries of our new tag
+		var lpos = tag.getPos(),
+			rpos = endTag.getPos() + endTag.getLen();
+
+		// Create a new tag and copy this tag's attributes and priority
+		addTagPair(siteId.toUpperCase(), lpos, 0, rpos, 0, tag.getSortPriority()).setAttributes(tag.getAttributes());
+	}
+
+	/**
+	* Add a media site tag based on the attributes of a MEDIA tag
+	*
+	* @param {!Tag}    tag   The original tag
+	* @param {!Object} sites Map of [host => siteId]
+	*/
+	function addTagFromMediaId(tag, sites)
+	{
+		var siteId = tag.getAttribute('site').toLowerCase();
+		if (in_array(siteId, sites))
+		{
+			addSiteTag(tag, siteId);
+		}
+	}
+
+	/**
+	* Add a media site tag based on the url attribute of a MEDIA tag
+	*
+	* @param {!Tag}    tag   The original tag
+	* @param {!Object} sites Map of [host => siteId]
+	*/
+	function addTagFromMediaUrl(tag, sites)
+	{
+		// Capture the scheme and (if applicable) host of the URL
+		var p = /^(?:([^:]+):)?(?:\/\/([^\/]+))?/.exec(tag.getAttribute('url')), siteId;
+		if (p[1] && sites[p[1] + ':'])
+		{
+			siteId = sites[p[1] + ':'];
+		}
+		else if (p[2])
+		{
+			siteId = findSiteIdByHost(p[2], sites);
+		}
+
+		if (siteId)
+		{
+			addSiteTag(tag, siteId);
+		}
+	}
+
+	/**
+	* Match a given host to a site ID
+	*
+	* @param  {!string}          host  Host
+	* @param  {!Object}          sites Map of [host => siteId]
+	* @return {!string|!boolean}       Site ID or FALSE
+	*/
+	function findSiteIdByHost(host, sites)
+	{
+		// Start with the full host then pop domain labels off the start until we get a match
+		do
+		{
+			if (sites[host])
+			{
+				return sites[host];
+			}
+
+			var pos = host.indexOf('.');
+			if (pos < 0)
+			{
+				break;
+			}
+
+			host = host.substr(1 + pos);
+		}
+		while (host > '');
+
+		return false;
+	}
+
+	return filterTag(tag, sites);
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/ParserBase.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins;
+use s9e\TextFormatter\Parser;
+abstract class ParserBase
+{
+	protected $config;
+	protected $parser;
+	final public function __construct(Parser $parser, array $config)
+	{
+		$this->parser = $parser;
+		$this->config = $config;
+		$this->setUp();
+	}
+	protected function setUp()
+	{
+	}
+	abstract public function parse($text, array $matches);
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/PipeTables/Configurator.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\PipeTables;
+use s9e\TextFormatter\Configurator\Items\AttributeFilters\ChoiceFilter;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class Configurator extends ConfiguratorBase
+{
+	protected $quickMatch = '|';
+	protected function setUp()
+	{
+		$tags = array(
+			'TABLE' => array('template' => '<table><xsl:apply-templates/></table>'),
+			'TBODY' => array('template' => '<tbody><xsl:apply-templates/></tbody>'),
+			'TD'    => $this->generateCellTagConfig('td'),
+			'TH'    => $this->generateCellTagConfig('th'),
+			'THEAD' => array('template' => '<thead><xsl:apply-templates/></thead>'),
+			'TR'    => array('template' => '<tr><xsl:apply-templates/></tr>')
+		);
+		foreach ($tags as $tagName => $tagConfig)
+			if (!isset($this->configurator->tags[$tagName]))
+				$this->configurator->tags->add($tagName, $tagConfig);
+	}
+	protected function generateCellTagConfig($elName)
+	{
+		$alignFilter = new ChoiceFilter(array('left', 'center', 'right', 'justify'), \true);
+		return	array(
+			'attributes' => array(
+				'align' => array(
+					'filterChain' => array('strtolower', $alignFilter),
+					'required' => \false
+				)
+			),
+			'rules' => array('createParagraphs' => \false),
+			'template' =>
+				'<' . $elName . '>
+					<xsl:if test="@align">
+						<xsl:attribute name="style">text-align:<xsl:value-of select="@align"/></xsl:attribute>
+					</xsl:if>
+					<xsl:apply-templates/>
+				</' . $elName . '>'
+		);
+	}
+	public function asConfig()
+	{
+		return array(
+			'overwriteEscapes'  => isset($this->configurator->Escaper),
+			'overwriteMarkdown' => isset($this->configurator->Litedown)
+		);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/PipeTables/Parser.js
@@ -0,0 +1,361 @@
+var	pos, table = null, tableTag, tables, text;
+
+if (config.overwriteMarkdown)
+{
+	overwriteMarkdown();
+}
+if (config.overwriteEscapes)
+{
+	overwriteEscapes();
+}
+
+captureTables();
+processTables();
+
+/**
+* Add current line to a table
+*
+* @param {!string} line Line of text
+*/
+function addLine(line)
+{
+	var ignoreLen = 0;
+
+	if (!table)
+	{
+		table = { rows: [] };
+
+		// Make the table start at the first non-space character
+		ignoreLen = /^ */.exec(line)[0].length;
+		line      = line.substr(ignoreLen);
+	}
+
+	// Overwrite the outermost pipes
+	line = line.replace(/^( *)\|/, '$1 ').replace(/\|( *)$/, ' $1');
+
+	table.rows.push({ line: line, pos: pos + ignoreLen });
+}
+
+/**
+* Process current table's body
+*/
+function addTableBody()
+{
+	var i   = 1,
+		cnt = table.rows.length;
+	while (++i < cnt)
+	{
+		addTableRow('TD', table.rows[i]);
+	}
+
+	createBodyTags(table.rows[2].pos, pos);
+}
+
+/**
+* Add a cell's tags for current table at current position
+*
+* @param {!string} tagName Either TD or TH
+* @param {!string} align   Either "left", "center", "right" or ""
+*/
+function addTableCell(tagName, align, text)
+{
+	var startPos  = pos,
+		endPos    = startPos + text.length,
+		ignoreLen;
+	pos = endPos;
+
+	var m = /^( *).*?( *)$/.exec(text);
+	if (m[1])
+	{
+		ignoreLen = m[1].length;
+		createIgnoreTag(startPos, ignoreLen);
+		startPos += ignoreLen;
+	}
+	if (m[2])
+	{
+		ignoreLen = m[2].length;
+		createIgnoreTag(endPos - ignoreLen, ignoreLen);
+		endPos -= ignoreLen;
+	}
+
+	createCellTags(tagName, startPos, endPos, align);
+}
+
+/**
+* Process current table's head
+*/
+function addTableHead()
+{
+	addTableRow('TH', table.rows[0]);
+	createHeadTags(table.rows[0].pos, pos);
+}
+
+/**
+* Process given table row
+*
+* @param {!string} tagName Either TD or TH
+* @param {!Object} row
+*/
+function addTableRow(tagName, row)
+{
+	pos = row.pos;
+	row.line.split('|').forEach(function(str, i)
+	{
+		if (i > 0)
+		{
+			createIgnoreTag(pos, 1);
+			++pos;
+		}
+
+		var align = (!table.cols[i]) ? '' : table.cols[i];
+		addTableCell(tagName, align, str);
+	});
+
+	createRowTags(row.pos, pos);
+}
+
+/**
+* Capture all pipe tables in current text
+*/
+function captureTables()
+{
+	table  = null;
+	tables = [];
+
+	pos = 0;
+	text.split("\n").forEach(function(line)
+	{
+		if (line.indexOf('|') < 0)
+		{
+			endTable();
+		}
+		else
+		{
+			addLine(line);
+		}
+		pos += 1 + line.length;
+	});
+	endTable();
+}
+
+/**
+* Create a pair of TBODY tags for given text span
+*
+* @param {!number} startPos
+* @param {!number} endPos
+*/
+function createBodyTags(startPos, endPos)
+{
+	addTagPair('TBODY', startPos, 0, endPos, 0, -3);
+}
+
+/**
+* Create a pair of TD or TH tags for given text span
+*
+* @param {!string} tagName  Either TD or TH
+* @param {!number} startPos
+* @param {!number} endPos
+* @param {!string} align    Either "left", "center", "right" or ""
+*/
+function createCellTags(tagName, startPos, endPos, align)
+{
+	var tag = addTagPair(tagName, startPos, 0, endPos, 0, -1);
+	if (align)
+	{
+		tag.setAttribute('align', align);
+	}
+}
+
+/**
+* Create a pair of THEAD tags for given text span
+*
+* @param {!number} startPos
+* @param {!number} endPos
+*/
+function createHeadTags(startPos, endPos)
+{
+	addTagPair('THEAD', startPos, 0, endPos, 0, -3);
+}
+
+/**
+* Create an ignore tag for given text span
+*
+* @param {!number} pos
+* @param {!number} len
+*/
+function createIgnoreTag(pos, len)
+{
+	tableTag.cascadeInvalidationTo(addIgnoreTag(pos, len, 1000));
+}
+
+/**
+* Create a pair of TR tags for given text span
+*
+* @param {!number} startPos
+* @param {!number} endPos
+*/
+function createRowTags(startPos, endPos)
+{
+	addTagPair('TR', startPos, 0, endPos, 0, -2);
+}
+
+/**
+* Create an ignore tag for given separator row
+*
+* @param {!Object} row
+*/
+function createSeparatorTag(row)
+{
+	createIgnoreTag(row.pos - 1, 1 + row.line.length);
+}
+
+/**
+* Create a pair of TABLE tags for given text span
+*
+* @param {!number} startPos
+* @param {!number} endPos
+*/
+function createTableTags(startPos, endPos)
+{
+	tableTag = addTagPair('TABLE', startPos, 0, endPos, 0, -4);
+}
+
+/**
+* End current buffered table
+*/
+function endTable()
+{
+	if (hasValidTable())
+	{
+		table.cols = parseColumnAlignments(table.rows[1].line);
+		tables.push(table);
+	}
+	table = null;
+}
+
+/**
+* Test whether a valid table is currently buffered
+*
+* @return {!boolean}
+*/
+function hasValidTable()
+{
+	return (table && table.rows.length > 2 && isValidSeparator(table.rows[1].line));
+}
+
+/**
+* Test whether given line is a valid separator
+*
+* @param  {!string}  line
+* @return {!boolean}
+*/
+function isValidSeparator(line)
+{
+	return /^ *:?-+:?(?:(?:\+| *\| *):?-+:?)+ */.test(line);
+}
+
+/**
+* Overwrite right angle brackets in given match
+*
+* @param  {!string} str
+* @return {!string}
+*/
+function overwriteBlockquoteCallback(str)
+{
+	return str.replace(/>/g, ' ');
+}
+
+/**
+* Overwrite escape sequences in current text
+*/
+function overwriteEscapes()
+{
+	if (text.indexOf('\\|') > -1)
+	{
+		text = text.replace(/\\[\\|]/g, '..');
+	}
+}
+
+/**
+* Overwrite backticks in given match
+*
+* @param  {!string} str
+* @return string
+*/
+function overwriteInlineCodeCallback(str)
+{
+	return str.replace(/\|/g, '.');
+}
+
+/**
+* Overwrite Markdown-style markup in current text
+*/
+function overwriteMarkdown()
+{
+	// Overwrite inline code spans
+	if (text.indexOf('`') > -1)
+	{
+		text = text.replace(/`[^`]*`/g, overwriteInlineCodeCallback);
+	}
+
+	// Overwrite blockquotes
+	if (text.indexOf('>') > -1)
+	{
+		text = text.replace(/^(?:> ?)+/gm, overwriteBlockquoteCallback);
+	}
+}
+
+/**
+* Parse and return column alignments in given separator line
+*
+* @param  {!string} line
+* @return {!Array<!string>}
+*/
+function parseColumnAlignments(line)
+{
+	// Use a bitfield to represent the colons' presence and map it to the CSS value
+	var align = [
+			'',
+			'right',
+			'left',
+			'center'
+		],
+		cols = [],
+		regexp = /(:?)-+(:?)/g,
+		m;
+
+	while (m = regexp.exec(line))
+	{
+		var key = (m[1] ? 2 : 0) + (m[2] ? 1 : 0);
+		cols.push(align[key]);
+	}
+
+	return cols;
+}
+
+/**
+* Process current table declaration
+*/
+function processCurrentTable()
+{
+	var firstRow = table.rows[0],
+		lastRow  = table.rows[table.rows.length - 1];
+	createTableTags(firstRow.pos, lastRow.pos + lastRow.line.length);
+
+	addTableHead();
+	createSeparatorTag(table.rows[1]);
+	addTableBody();
+}
+
+/**
+* Process all the captured tables
+*/
+function processTables()
+{
+	var i = -1, cnt = tables.length;
+	while (++i < cnt)
+	{
+		table = tables[i];
+		processCurrentTable();
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/PipeTables/Parser.php
@@ -0,0 +1,207 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\PipeTables;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	protected $pos;
+	protected $table;
+	protected $tableTag;
+	protected $tables;
+	protected $text;
+	public function parse($text, array $matches)
+	{
+		$this->text = $text;
+		if ($this->config['overwriteMarkdown'])
+			$this->overwriteMarkdown();
+		if ($this->config['overwriteEscapes'])
+			$this->overwriteEscapes();
+		$this->captureTables();
+		$this->processTables();
+		unset($this->tables);
+		unset($this->text);
+	}
+	protected function addLine($line)
+	{
+		$ignoreLen = 0;
+		if (!isset($this->table))
+		{
+			$this->table = array();
+			\preg_match('/^ */', $line, $m);
+			$ignoreLen = \strlen($m[0]);
+			$line      = \substr($line, $ignoreLen);
+		}
+		$line = \preg_replace('/^( *)\\|/', '$1 ', $line);
+		$line = \preg_replace('/\\|( *)$/', ' $1', $line);
+		$this->table['rows'][] = array('line' => $line, 'pos' => $this->pos + $ignoreLen);
+	}
+	protected function addTableBody()
+	{
+		$i   = 1;
+		$cnt = \count($this->table['rows']);
+		while (++$i < $cnt)
+			$this->addTableRow('TD', $this->table['rows'][$i]);
+		$this->createBodyTags($this->table['rows'][2]['pos'], $this->pos);
+	}
+	protected function addTableCell($tagName, $align, $text)
+	{
+		$startPos  = $this->pos;
+		$endPos    = $startPos + \strlen($text);
+		$this->pos = $endPos;
+		\preg_match('/^( *).*?( *)$/', $text, $m);
+		if ($m[1])
+		{
+			$ignoreLen = \strlen($m[1]);
+			$this->createIgnoreTag($startPos, $ignoreLen);
+			$startPos += $ignoreLen;
+		}
+		if ($m[2])
+		{
+			$ignoreLen = \strlen($m[2]);
+			$this->createIgnoreTag($endPos - $ignoreLen, $ignoreLen);
+			$endPos -= $ignoreLen;
+		}
+		$this->createCellTags($tagName, $startPos, $endPos, $align);
+	}
+	protected function addTableHead()
+	{
+		$this->addTableRow('TH', $this->table['rows'][0]);
+		$this->createHeadTags($this->table['rows'][0]['pos'], $this->pos);
+	}
+	protected function addTableRow($tagName, $row)
+	{
+		$this->pos = $row['pos'];
+		foreach (\explode('|', $row['line']) as $i => $str)
+		{
+			if ($i > 0)
+			{
+				$this->createIgnoreTag($this->pos, 1);
+				++$this->pos;
+			}
+			$align = (empty($this->table['cols'][$i])) ? '' : $this->table['cols'][$i];
+			$this->addTableCell($tagName, $align, $str);
+		}
+		$this->createRowTags($row['pos'], $this->pos);
+	}
+	protected function captureTables()
+	{
+		unset($this->table);
+		$this->tables = array();
+		$this->pos = 0;
+		foreach (\explode("\n", $this->text) as $line)
+		{
+			if (\strpos($line, '|') === \false)
+				$this->endTable();
+			else
+				$this->addLine($line);
+			$this->pos += 1 + \strlen($line);
+		}
+		$this->endTable();
+	}
+	protected function createBodyTags($startPos, $endPos)
+	{
+		$this->parser->addTagPair('TBODY', $startPos, 0, $endPos, 0, -3);
+	}
+	protected function createCellTags($tagName, $startPos, $endPos, $align)
+	{
+		$tag = $this->parser->addTagPair($tagName, $startPos, 0, $endPos, 0, -1);
+		if ($align)
+			$tag->setAttribute('align', $align);
+	}
+	protected function createHeadTags($startPos, $endPos)
+	{
+		$this->parser->addTagPair('THEAD', $startPos, 0, $endPos, 0, -3);
+	}
+	protected function createIgnoreTag($pos, $len)
+	{
+		$this->tableTag->cascadeInvalidationTo($this->parser->addIgnoreTag($pos, $len, 1000));
+	}
+	protected function createRowTags($startPos, $endPos)
+	{
+		$this->parser->addTagPair('TR', $startPos, 0, $endPos, 0, -2);
+	}
+	protected function createSeparatorTag(array $row)
+	{
+		$this->createIgnoreTag($row['pos'] - 1, 1 + \strlen($row['line']));
+	}
+	protected function createTableTags($startPos, $endPos)
+	{
+		$this->tableTag = $this->parser->addTagPair('TABLE', $startPos, 0, $endPos, 0, -4);
+	}
+	protected function endTable()
+	{
+		if ($this->hasValidTable())
+		{
+			$this->table['cols'] = $this->parseColumnAlignments($this->table['rows'][1]['line']);
+			$this->tables[]      = $this->table;
+		}
+		unset($this->table);
+	}
+	protected function hasValidTable()
+	{
+		return (isset($this->table) && \count($this->table['rows']) > 2 && $this->isValidSeparator($this->table['rows'][1]['line']));
+	}
+	protected function isValidSeparator($line)
+	{
+		return (bool) \preg_match('/^ *:?-+:?(?:(?:\\+| *\\| *):?-+:?)+ *$/', $line);
+	}
+	protected function overwriteBlockquoteCallback(array $m)
+	{
+		return \strtr($m[0], '>', ' ');
+	}
+	protected function overwriteEscapes()
+	{
+		if (\strpos($this->text, '\\|') !== \false)
+			$this->text = \preg_replace('/\\\\[\\\\|]/', '..', $this->text);
+	}
+	protected function overwriteInlineCodeCallback(array $m)
+	{
+		return \strtr($m[0], '|', '.');
+	}
+	protected function overwriteMarkdown()
+	{
+		if (\strpos($this->text, '`') !== \false)
+			$this->text = \preg_replace_callback('/`[^`]*`/', array($this, 'overwriteInlineCodeCallback'), $this->text);
+		if (\strpos($this->text, '>') !== \false)
+			$this->text = \preg_replace_callback('/^(?:> ?)+/m', array($this, 'overwriteBlockquoteCallback'), $this->text);
+	}
+	protected function parseColumnAlignments($line)
+	{
+		$align = array(
+			0 => '',
+			1 => 'right',
+			2 => 'left',
+			3 => 'center'
+		);
+		$cols = array();
+		\preg_match_all('/(:?)-+(:?)/', $line, $matches, \PREG_SET_ORDER);
+		foreach ($matches as $m)
+		{
+			$key = (!empty($m[1]) ? 2 : 0) + (!empty($m[2]) ? 1 : 0);
+			$cols[] = $align[$key];
+		}
+		return $cols;
+	}
+	protected function processCurrentTable()
+	{
+		$firstRow = $this->table['rows'][0];
+		$lastRow  = \end($this->table['rows']);
+		$this->createTableTags($firstRow['pos'], $lastRow['pos'] + \strlen($lastRow['line']));
+		$this->addTableHead();
+		$this->createSeparatorTag($this->table['rows'][1]);
+		$this->addTableBody();
+	}
+	protected function processTables()
+	{
+		foreach ($this->tables as $table)
+		{
+			$this->table = $table;
+			$this->processCurrentTable();
+		}
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Preg/Configurator.php
@@ -0,0 +1,262 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Preg;
+use DOMAttr;
+use DOMText;
+use DOMXPath;
+use Exception;
+use InvalidArgumentException;
+use s9e\TextFormatter\Configurator\Helpers\RegexpParser;
+use s9e\TextFormatter\Configurator\Helpers\TemplateHelper;
+use s9e\TextFormatter\Configurator\Items\Regexp;
+use s9e\TextFormatter\Configurator\Items\Tag;
+use s9e\TextFormatter\Configurator\JavaScript\RegexpConvertor;
+use s9e\TextFormatter\Plugins\ConfiguratorBase;
+class Configurator extends ConfiguratorBase
+{
+	public $captures;
+	protected $collection = array();
+	protected $delimiter;
+	protected $modifiers;
+	protected $references;
+	protected $referencesRegexp = '((?<!\\\\)(?:\\\\\\\\)*\\K(?:[$\\\\]\\d+|\\$\\{\\d+\\}))S';
+	public function asConfig()
+	{
+		if (!\count($this->collection))
+			return;
+		$pregs = array();
+		foreach ($this->collection as $_ca164be8)
+		{
+			list($tagName, $regexp, $passthroughIdx) = $_ca164be8;
+			$captures = RegexpParser::getCaptureNames($regexp);
+			$pregs[]  = array($tagName, new Regexp($regexp, \true), $passthroughIdx, $captures);
+		}
+		return array('generics' => $pregs);
+	}
+	public function getJSHints()
+	{
+		$hasPassthrough = \false;
+		foreach ($this->collection as $_ca164be8)
+		{
+			list($tagName, $regexp, $passthroughIdx) = $_ca164be8;
+			if ($passthroughIdx)
+			{
+				$hasPassthrough = \true;
+				break;
+			}
+		}
+		return array('PREG_HAS_PASSTHROUGH' => $hasPassthrough);
+	}
+	public function match($regexp, $tagName)
+	{
+		$passthrough = 0;
+		$this->parseRegexp($regexp);
+		foreach ($this->captures as $i => $capture)
+		{
+			if (!$this->isCatchAll($capture['expr']))
+				continue;
+			$passthrough = $i;
+		}
+		$this->collection[] = array($tagName, $regexp, $passthrough);
+	}
+	public function replace($regexp, $template, $tagName = \null)
+	{
+		if (!isset($tagName))
+			$tagName = 'PREG_' . \strtoupper(\dechex(\crc32($regexp)));
+		$this->parseRegexp($regexp);
+		$this->parseTemplate($template);
+		$passthrough = $this->getPassthroughCapture();
+		if ($passthrough)
+			$this->captures[$passthrough]['passthrough'] = \true;
+		$regexp   = $this->fixUnnamedCaptures($regexp);
+		$template = $this->convertTemplate($template, $passthrough);
+		$this->collection[] = array($tagName, $regexp, $passthrough);
+		return $this->createTag($tagName, $template);
+	}
+	protected function addAttribute(Tag $tag, $attrName)
+	{
+		$isUrl = \false;
+		$exprs = array();
+		foreach ($this->captures as $key => $capture)
+		{
+			if ($capture['name'] !== $attrName)
+				continue;
+			$exprs[] = $capture['expr'];
+			if (isset($this->references['asUrl'][$key]))
+				$isUrl = \true;
+		}
+		$exprs = \array_unique($exprs);
+		$regexp = $this->delimiter . '^';
+		$regexp .= (\count($exprs) === 1) ? $exprs[0] : '(?:' . \implode('|', $exprs) . ')';
+		$regexp .= '$' . $this->delimiter . 'D' . $this->modifiers;
+		$attribute = $tag->attributes->add($attrName);
+		$filter = $this->configurator->attributeFilters['#regexp'];
+		$filter->setRegexp($regexp);
+		$attribute->filterChain[] = $filter;
+		if ($isUrl)
+		{
+			$filter = $this->configurator->attributeFilters['#url'];
+			$attribute->filterChain[] = $filter;
+		}
+	}
+	protected function convertTemplate($template, $passthrough)
+	{
+		$_this = $this;
+		$template = TemplateHelper::replaceTokens(
+			$template,
+			$this->referencesRegexp,
+			function ($m, $node) use ($passthrough, $_this)
+			{
+				$key = (int) \trim($m[0], '\\${}');
+				if ($key === 0)
+					return array('expression', '.');
+				if ($key === $passthrough && $node instanceof DOMText)
+					return array('passthrough');
+				if (isset($_this->captures[$key]['name']))
+					return array('expression', '@' . $_this->captures[$key]['name']);
+				return array('literal', '');
+			}
+		);
+		$template = TemplateHelper::replaceTokens(
+			$template,
+			'(\\\\+[0-9${\\\\])',
+			function ($m)
+			{
+				return array('literal', \stripslashes($m[0]));
+			}
+		);
+		return $template;
+	}
+	protected function createTag($tagName, $template)
+	{
+		$tag = new Tag;
+		foreach ($this->captures as $key => $capture)
+		{
+			if (!isset($capture['name']))
+				continue;
+			$attrName = $capture['name'];
+			if (isset($tag->attributes[$attrName]))
+				continue;
+			$this->addAttribute($tag, $attrName);
+		}
+		$tag->template = $template;
+		$this->configurator->templateNormalizer->normalizeTag($tag);
+		$this->configurator->templateChecker->checkTag($tag);
+		return $this->configurator->tags->add($tagName, $tag);
+	}
+	protected function fixUnnamedCaptures($regexp)
+	{
+		$keys = array();
+		foreach ($this->references['anywhere'] as $key)
+		{
+			$capture = $this->captures[$key];
+			if (!$key || isset($capture['name']))
+				continue;
+			if (isset($this->references['asUrl'][$key]) || !isset($capture['passthrough']))
+				$keys[] = $key;
+		}
+		\rsort($keys);
+		foreach ($keys as $key)
+		{
+			$name   = '_' . $key;
+			$pos    = $this->captures[$key]['pos'];
+			$regexp = \substr_replace($regexp, "?'" . $name . "'", 2 + $pos, 0);
+			$this->captures[$key]['name'] = $name;
+		}
+		return $regexp;
+	}
+	protected function getPassthroughCapture()
+	{
+		$passthrough = 0;
+		foreach ($this->references['inText'] as $key)
+		{
+			if (!$this->isCatchAll($this->captures[$key]['expr']))
+				continue;
+			if ($passthrough)
+			{
+				$passthrough = 0;
+				break;
+			}
+			$passthrough = (int) $key;
+		}
+		return $passthrough;
+	}
+	protected function getRegexpInfo($regexp)
+	{
+		$valid = \false;
+		try
+		{
+			$valid = @\preg_match_all($regexp, '', $m);
+		}
+		catch (Exception $e)
+		{
+			}
+		if ($valid === \false)
+			throw new InvalidArgumentException('Invalid regexp');
+		return RegexpParser::parse($regexp);
+	}
+	protected function isCatchAll($expr)
+	{
+		return (bool) \preg_match('(^\\.[*+]\\??$)D', $expr);
+	}
+	protected function parseRegexp($regexp)
+	{
+		$this->captures = array(array('name' => \null, 'expr' => \null));
+		$regexpInfo = $this->getRegexpInfo($regexp);
+		$this->delimiter = $regexpInfo['delimiter'];
+		$this->modifiers = \str_replace('D', '', $regexpInfo['modifiers']);
+		foreach ($regexpInfo['tokens'] as $token)
+		{
+			if ($token['type'] !== 'capturingSubpatternStart')
+				continue;
+			$this->captures[] = array(
+				'pos'    => $token['pos'],
+				'name'   => (isset($token['name'])) ? $token['name'] : \null,
+				'expr'   => $token['content']
+			);
+		}
+	}
+	protected function parseTemplate($template)
+	{
+		$this->references = array(
+			'anywhere' => array(),
+			'asUrl'    => array(),
+			'inText'   => array()
+		);
+		\preg_match_all($this->referencesRegexp, $template, $matches);
+		foreach ($matches[0] as $match)
+		{
+			$key = \trim($match, '\\${}');
+			$this->references['anywhere'][$key] = $key;
+		}
+		$dom   = TemplateHelper::loadTemplate($template);
+		$xpath = new DOMXPath($dom);
+		foreach ($xpath->query('//text()') as $node)
+		{
+			\preg_match_all($this->referencesRegexp, $node->textContent, $matches);
+			foreach ($matches[0] as $match)
+			{
+				$key = \trim($match, '\\${}');
+				$this->references['inText'][$key] = $key;
+			}
+		}
+		foreach (TemplateHelper::getURLNodes($dom) as $node)
+			if ($node instanceof DOMAttr
+			 && \preg_match('(^(?:[$\\\\]\\d+|\\$\\{\\d+\\}))', \trim($node->value), $m))
+			{
+				$key = \trim($m[0], '\\${}');
+				$this->references['asUrl'][$key] = $key;
+			}
+		$this->removeUnknownReferences();
+	}
+	protected function removeUnknownReferences()
+	{
+		foreach ($this->references as &$references)
+			$references = \array_intersect_key($references, $this->captures);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Preg/Parser.js
@@ -0,0 +1,46 @@
+config.generics.forEach(function(entry)
+{
+	var tagName        = entry[0],
+		regexp         = entry[1],
+		passthroughIdx = entry[2],
+		map            = entry[3],
+		m;
+
+	// Reset the regexp
+	regexp.lastIndex = 0;
+
+	while (m = regexp.exec(text))
+	{
+		var startTagPos = m['index'],
+			matchLen    = m[0].length,
+			tag;
+
+		if (HINT.PREG_HAS_PASSTHROUGH && passthroughIdx && m[passthroughIdx] !== '')
+		{
+			// Compute the position and length of the start tag, end tag, and the content in
+			// between. m.index gives us the position of the start tag but we don't know its length.
+			// We use indexOf() to locate the content part so that we know how long the start tag
+			// is. It is an imperfect solution but it should work well enough in most cases.
+			var contentPos  = text.indexOf(m[passthroughIdx], startTagPos),
+				contentLen  = m[passthroughIdx].length,
+				startTagLen = contentPos - startTagPos,
+				endTagPos   = contentPos + contentLen,
+				endTagLen   = matchLen - (startTagLen + contentLen);
+
+			tag = addTagPair(tagName, startTagPos, startTagLen, endTagPos, endTagLen, -100);
+		}
+		else
+		{
+			tag = addSelfClosingTag(tagName, startTagPos, matchLen, -100);
+		}
+
+		map.forEach(function(attrName, i)
+		{
+			// NOTE: subpatterns with no name have an empty entry to preserve the array indices
+			if (attrName && typeof m[i] !== 'undefined')
+			{
+				tag.setAttribute(attrName, m[i]);
+			}
+		});
+	}
+});
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Plugins/Preg/Parser.php
@@ -0,0 +1,39 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Plugins\Preg;
+use s9e\TextFormatter\Plugins\ParserBase;
+class Parser extends ParserBase
+{
+	public function parse($text, array $matches)
+	{
+		foreach ($this->config['generics'] as $_8d36e519)
+		{
+			list($tagName, $regexp, $passthroughIdx, $map) = $_8d36e519;
+			\preg_match_all($regexp, $text, $matches, \PREG_SET_ORDER | \PREG_OFFSET_CAPTURE);
+			foreach ($matches as $m)
+			{
+				$startTagPos = $m[0][1];
+				$matchLen    = \strlen($m[0][0]);
+				if ($passthroughIdx && isset($m[$passthroughIdx]) && $m[$passthroughIdx][0] !== '')
+				{
+					$contentPos  = $m[$passthroughIdx][1];
+					$contentLen  = \strlen($m[$passthroughIdx][0]);
+					$startTagLen = $contentPos - $startTagPos;
+					$endTagPos   = $contentPos + $contentLen;
+					$endTagLen   = $matchLen - ($startTagLen + $contentLen);
+					$tag = $this->parser->addTagPair($tagName, $startTagPos, $startTagLen, $endTagPos, $endTagLen, -100);
+				}
+				else
+					$tag = $this->parser->addSelfClosingTag($tagName, $startTagPos, $matchLen, -100);
+				foreach ($map as $i => $attrName)
+					if ($attrName && isset($m[$i]) && $m[$i][0] !== '')
+						$tag->setAttribute($attrName, $m[$i][0]);
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Renderer.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter;
+use DOMDocument;
+use InvalidArgumentException;
+abstract class Renderer
+{
+	public $metaElementsRegexp = '(<[eis]>[^<]*</[eis]>)';
+	protected $params = array();
+	protected function loadXML($xml)
+	{
+		$this->checkUnsupported($xml);
+		$flags = (\LIBXML_VERSION >= 20700) ? \LIBXML_COMPACT | \LIBXML_PARSEHUGE : 0;
+		$dom = new DOMDocument;
+		$dom->loadXML($xml, $flags);
+		return $dom;
+	}
+	public function render($xml)
+	{
+		if (\substr($xml, 0, 3) === '<t>')
+			return $this->renderPlainText($xml);
+		else
+			return $this->renderRichText(\preg_replace($this->metaElementsRegexp, '', $xml));
+	}
+	protected function renderPlainText($xml)
+	{
+		$html = \substr($xml, 3, -4);
+		$html = \str_replace('<br/>', '<br>', $html);
+		$html = $this->decodeSMP($html);
+		return $html;
+	}
+	abstract protected function renderRichText($xml);
+	public function getParameter($paramName)
+	{
+		return (isset($this->params[$paramName])) ? $this->params[$paramName] : '';
+	}
+	public function getParameters()
+	{
+		return $this->params;
+	}
+	public function setParameter($paramName, $paramValue)
+	{
+		$this->params[$paramName] = (string) $paramValue;
+	}
+	public function setParameters(array $params)
+	{
+		foreach ($params as $paramName => $paramValue)
+			$this->setParameter($paramName, $paramValue);
+	}
+	protected function checkUnsupported($xml)
+	{
+		if (\strpos($xml, '<!') !== \false)
+			throw new InvalidArgumentException('DTDs, CDATA nodes and comments are not allowed');
+		if (\strpos($xml, '<?') !== \false)
+			throw new InvalidArgumentException('Processing instructions are not allowed');
+	}
+	protected function decodeSMP($str)
+	{
+		if (\strpos($str, '&#') === \false)
+			return $str;
+		return \preg_replace_callback('(&#(?:x[0-9A-Fa-f]+|[0-9]+);)', __CLASS__ . '::decodeEntity', $str);
+	}
+	protected static function decodeEntity(array $m)
+	{
+		return \htmlspecialchars(\html_entity_decode($m[0], \ENT_QUOTES, 'UTF-8'), \ENT_COMPAT);
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Renderers/Unformatted.php
@@ -0,0 +1,17 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Renderers;
+use s9e\TextFormatter\Renderer;
+class Unformatted extends Renderer
+{
+	public $metaElementsRegexp = '((?!))';
+	protected function renderRichText($xml)
+	{
+		return \str_replace("\n", "<br>\n", \htmlspecialchars(\strip_tags($xml), \ENT_COMPAT, 'UTF-8', \false));
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Renderers/XSLT.php
@@ -0,0 +1,75 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Renderers;
+use XSLTProcessor;
+use s9e\TextFormatter\Renderer;
+class XSLT extends Renderer
+{
+	protected $proc;
+	protected $reloadParams = \false;
+	protected $stylesheet;
+	public function __construct($stylesheet)
+	{
+		$this->stylesheet = $stylesheet;
+		\preg_match_all('#<xsl:param name="([^"]+)"(?>/>|>([^<]+))#', $stylesheet, $matches);
+		foreach ($matches[1] as $k => $paramName)
+			$this->params[$paramName] = (isset($matches[2][$k]))
+			                          ? \htmlspecialchars_decode($matches[2][$k])
+			                          : '';
+	}
+	public function __sleep()
+	{
+		$props = \get_object_vars($this);
+		unset($props['proc']);
+		if (empty($props['reloadParams']))
+			unset($props['reloadParams']);
+		return \array_keys($props);
+	}
+	public function __wakeup()
+	{
+		if (!empty($this->reloadParams))
+		{
+			$this->setParameters($this->params);
+			$this->reloadParams = \false;
+		}
+	}
+	public function setParameter($paramName, $paramValue)
+	{
+		if (\strpos($paramValue, '"') !== \false
+		 && \strpos($paramValue, "'") !== \false)
+			$paramValue = \str_replace('"', "\xEF\xBC\x82", $paramValue);
+		else
+			$paramValue = (string) $paramValue;
+		if (!isset($this->params[$paramName]) || $this->params[$paramName] !== $paramValue)
+		{
+			$this->load();
+			$this->proc->setParameter('', $paramName, $paramValue);
+			$this->params[$paramName] = $paramValue;
+			$this->reloadParams = \true;
+		}
+	}
+	protected function renderRichText($xml)
+	{
+		$dom = $this->loadXML($xml);
+		$this->load();
+		$output = (string) $this->proc->transformToXml($dom);
+		$output = \str_replace('</embed>', '', $output);
+		if (\substr($output, -1) === "\n")
+			$output = \substr($output, 0, -1);
+		return $output;
+	}
+	protected function load()
+	{
+		if (!isset($this->proc))
+		{
+			$xsl = $this->loadXML($this->stylesheet);
+			$this->proc = new XSLTProcessor;
+			$this->proc->importStylesheet($xsl);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Unparser.php
@@ -0,0 +1,16 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter;
+use DOMDocument;
+abstract class Unparser
+{
+	public static function unparse($xml)
+	{
+		return \html_entity_decode(\strip_tags($xml), \ENT_QUOTES, 'UTF-8');
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Utils.php
@@ -0,0 +1,102 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter;
+use DOMDocument;
+use DOMXPath;
+abstract class Utils
+{
+	public static function getAttributeValues($xml, $tagName, $attrName)
+	{
+		$values = array();
+		if (\strpos($xml, '<' . $tagName) !== \false)
+		{
+			$regexp = '(<' . \preg_quote($tagName) . '(?= )[^>]*? ' . \preg_quote($attrName) . '="([^"]*+))';
+			\preg_match_all($regexp, $xml, $matches);
+			foreach ($matches[1] as $value)
+				$values[] = \html_entity_decode($value, \ENT_QUOTES, 'UTF-8');
+		}
+		return $values;
+	}
+	public static function encodeUnicodeSupplementaryCharacters($str)
+	{
+		return \preg_replace_callback(
+			'([\\xF0-\\xF4]...)S',
+			__CLASS__ . '::encodeUnicodeSupplementaryCharactersCallback',
+			$str
+		);
+	}
+	public static function removeFormatting($xml)
+	{
+		$dom   = self::loadXML($xml);
+		$xpath = new DOMXPath($dom);
+		foreach ($xpath->query('//e | //s') as $node)
+			$node->parentNode->removeChild($node);
+		return $dom->documentElement->textContent;
+	}
+	public static function removeTag($xml, $tagName, $nestingLevel = 0)
+	{
+		if (\strpos($xml, '<' . $tagName) === \false)
+			return $xml;
+		$dom   = self::loadXML($xml);
+		$xpath = new DOMXPath($dom);
+		$nodes = $xpath->query(\str_repeat('//' . $tagName, 1 + $nestingLevel));
+		foreach ($nodes as $node)
+			$node->parentNode->removeChild($node);
+		return self::saveXML($dom);
+	}
+	public static function replaceAttributes($xml, $tagName, $callback)
+	{
+		$_self = __CLASS__;
+		if (\strpos($xml, '<' . $tagName) === \false)
+			return $xml;
+		return \preg_replace_callback(
+			'((<' . \preg_quote($tagName) . ')(?=[ />])[^>]*?(/?>))',
+			function ($m) use ($callback, $_self)
+			{
+				return $m[1] . $_self::serializeAttributes($callback($_self::parseAttributes($m[0]))) . $m[2];
+			},
+			$xml
+		);
+	}
+	protected static function encodeUnicodeSupplementaryCharactersCallback(array $m)
+	{
+		$utf8 = $m[0];
+		$cp   = (\ord($utf8[0]) << 18) + (\ord($utf8[1]) << 12) + (\ord($utf8[2]) << 6) + \ord($utf8[3]) - 0x3C82080;
+		return '&#' . $cp . ';';
+	}
+	protected static function loadXML($xml)
+	{
+		$flags = (\LIBXML_VERSION >= 20700) ? \LIBXML_COMPACT | \LIBXML_PARSEHUGE : 0;
+		$dom = new DOMDocument;
+		$dom->loadXML($xml, $flags);
+		return $dom;
+	}
+	public static function parseAttributes($xml)
+	{
+		$attributes = array();
+		if (\strpos($xml, '="') !== \false)
+		{
+			\preg_match_all('(([^ =]++)="([^"]*))S', $xml, $matches);
+			foreach ($matches[1] as $i => $attrName)
+				$attributes[$attrName] = \html_entity_decode($matches[2][$i], \ENT_QUOTES, 'UTF-8');
+		}
+		return $attributes;
+	}
+	protected static function saveXML(DOMDocument $dom)
+	{
+		return self::encodeUnicodeSupplementaryCharacters($dom->saveXML($dom->documentElement));
+	}
+	public static function serializeAttributes(array $attributes)
+	{
+		$xml = '';
+		\ksort($attributes);
+		foreach ($attributes as $attrName => $attrValue)
+			$xml .= ' ' . \htmlspecialchars($attrName, \ENT_QUOTES) . '="' . self::encodeUnicodeSupplementaryCharacters(\htmlspecialchars($attrValue, \ENT_COMPAT)) . '"';
+		return $xml;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Utils/Http.php
@@ -0,0 +1,17 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Utils;
+use s9e\TextFormatter\Utils\Http\Clients\Curl;
+use s9e\TextFormatter\Utils\Http\Clients\Native;
+abstract class Http
+{
+	public static function getClient()
+	{
+		return (\extension_loaded('curl') && !\ini_get('safe_mode')) ? new Curl : new Native;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Utils/Http/Client.php
@@ -0,0 +1,15 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Utils\Http;
+abstract class Client
+{
+	public $sslVerifyPeer = \false;
+	public $timeout = 10;
+	abstract public function get($url, $headers = array());
+	abstract public function post($url, $headers = array(), $body = '');
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Utils/Http/Clients/Curl.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Utils\Http\Clients;
+use s9e\TextFormatter\Utils\Http\Client;
+class Curl extends Client
+{
+	protected static $handle;
+	public function get($url, $headers = array())
+	{
+		$handle = $this->getHandle();
+		\curl_setopt($handle, \CURLOPT_HTTPGET,    \true);
+		\curl_setopt($handle, \CURLOPT_HTTPHEADER, $headers);
+		\curl_setopt($handle, \CURLOPT_URL,        $url);
+		return \curl_exec($handle);
+	}
+	public function post($url, $headers = array(), $body = '')
+	{
+		$headers[] = 'Content-Length: ' . \strlen($body);
+		$handle = $this->getHandle();
+		\curl_setopt($handle, \CURLOPT_HTTPHEADER, $headers);
+		\curl_setopt($handle, \CURLOPT_POST,       \true);
+		\curl_setopt($handle, \CURLOPT_POSTFIELDS, $body);
+		\curl_setopt($handle, \CURLOPT_URL,        $url);
+		return \curl_exec($handle);
+	}
+	protected function getHandle()
+	{
+		if (!isset(self::$handle))
+			self::$handle = $this->getNewHandle();
+		\curl_setopt(self::$handle, \CURLOPT_SSL_VERIFYPEER, $this->sslVerifyPeer);
+		\curl_setopt(self::$handle, \CURLOPT_TIMEOUT,        $this->timeout);
+		return self::$handle;
+	}
+	protected function getNewHandle()
+	{
+		$handle = \curl_init();
+		\curl_setopt($handle, \CURLOPT_ENCODING,       '');
+		\curl_setopt($handle, \CURLOPT_FAILONERROR,    \true);
+		\curl_setopt($handle, \CURLOPT_FOLLOWLOCATION, \true);
+		\curl_setopt($handle, \CURLOPT_RETURNTRANSFER, \true);
+		return $handle;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/Utils/Http/Clients/Native.php
@@ -0,0 +1,56 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter\Utils\Http\Clients;
+use s9e\TextFormatter\Utils\Http\Client;
+class Native extends Client
+{
+	public $gzipEnabled;
+	public function __construct()
+	{
+		$this->gzipEnabled = \extension_loaded('zlib');
+	}
+	public function get($url, $headers = array())
+	{
+		return $this->request('GET', $url, $headers);
+	}
+	public function post($url, $headers = array(), $body = '')
+	{
+		return $this->request('POST', $url, $headers, $body);
+	}
+	protected function createContext($method, array $headers, $body)
+	{
+		$contextOptions = array(
+			'ssl'  => array('verify_peer' => $this->sslVerifyPeer),
+			'http' => array(
+				'method'  => $method,
+				'timeout' => $this->timeout,
+				'header'  => $this->generateHeaders($headers, $body),
+				'content' => $body
+			)
+		);
+		return \stream_context_create($contextOptions);
+	}
+	protected function decompress($content)
+	{
+		if ($this->gzipEnabled && \substr($content, 0, 2) === "\x1f\x8b")
+			return \gzdecode($content);
+		return $content;
+	}
+	protected function generateHeaders(array $headers, $body)
+	{
+		if ($this->gzipEnabled)
+			$headers[] = 'Accept-Encoding: gzip';
+		$headers[] = 'Content-Length: ' . \strlen($body);
+		return $headers;
+	}
+	protected function request($method, $url, $headers, $body = '')
+	{
+		$response = @\file_get_contents($url, \false, $this->createContext($method, $headers, $body));
+		return (\is_string($response)) ? $this->decompress($response) : $response;
+	}
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/autoloader.php
@@ -0,0 +1,22 @@
+<?php
+
+/*
+* @package   s9e\TextFormatter
+* @copyright Copyright (c) 2010-2016 The s9e Authors
+* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
+*/
+namespace s9e\TextFormatter;
+function autoload($className)
+{
+	if (\strpos($className, 's9e\\TextFormatter\\') === 0
+	 && \strpos($className, '.') === \false)
+	{
+		$path = __DIR__ . \strtr(\substr($className, 17), '\\', '/') . '.php';
+		if (\file_exists($path))
+			include $path;
+		elseif (!\class_exists('s9e\\TextFormatter\\Configurator', \false)
+			 && \strpos($className, 's9e\\TextFormatter\\Configurator\\') === 0)
+			include __DIR__ . '/Configurator.php';
+	}
+}
+\spl_autoload_register('s9e\\TextFormatter\\autoload');
\ No newline at end of file
--- /dev/null
+++ b/vendor/s9e/text-formatter/src/render.js
@@ -0,0 +1,284 @@
+var MSXML = (typeof DOMParser === 'undefined' || typeof XSLTProcessor === 'undefined');
+var xslt = {
+	/**
+	* @param {!string} xsl
+	*/
+	init: function(xsl)
+	{
+		var stylesheet = xslt.loadXML(xsl, 'MSXML2.FreeThreadedDOMDocument.6.0');
+		if (MSXML)
+		{
+			var generator = new ActiveXObject("MSXML2.XSLTemplate.6.0");
+			generator['stylesheet'] = stylesheet;
+			xslt.proc = generator['createProcessor']();
+		}
+		else
+		{
+			xslt.proc = new XSLTProcessor;
+			xslt.proc['importStylesheet'](stylesheet);
+		}
+	},
+
+	/**
+	* @param {!string} xml
+	* @param {string} type
+	*/
+	loadXML: function(xml, type)
+	{
+		if (MSXML)
+		{
+			var dom = new ActiveXObject(type);
+			dom['async'] = false;
+			dom['validateOnParse'] = false;
+			dom['loadXML'](xml);
+
+			return dom;
+		}
+
+		return (new DOMParser).parseFromString(xml, 'text/xml');
+	},
+
+	/**
+	* @param {!string} paramName  Parameter name
+	* @param {!string} paramValue Parameter's value
+	*/
+	setParameter: function(paramName, paramValue)
+	{
+		if (MSXML)
+		{
+			xslt.proc['addParameter'](paramName, paramValue, '');
+		}
+		else
+		{
+			xslt.proc['setParameter'](null, paramName, paramValue);
+		}
+	},
+
+	/**
+	* @param {!string} xml
+	* @param {!HTMLDocument} targetDoc
+	*/
+	transformToFragment: function(xml, targetDoc)
+	{
+		if (MSXML)
+		{
+			var div = targetDoc.createElement('div'),
+				fragment = targetDoc.createDocumentFragment();
+
+			xslt.proc['input'] = xslt.loadXML(xml, 'MSXML2.DOMDocument.6.0');
+			xslt.proc['transform']();
+			div.innerHTML = xslt.proc['output'];
+			while (div.firstChild)
+			{
+				fragment.appendChild(div.removeChild(div.firstChild));
+			}
+
+			return fragment;
+		}
+
+		// NOTE: importNode() is used because of https://code.google.com/p/chromium/issues/detail?id=266305
+		return targetDoc.importNode(xslt.proc['transformToFragment'](xslt.loadXML(xml), targetDoc), true);
+	}
+}
+xslt.init(xsl);
+
+var postProcessFunctions = {};
+
+/**
+* Parse a given text and render it into given HTML element
+*
+* @param {!string} text
+* @param {!HTMLElement} target
+*/
+function preview(text, target)
+{
+	var targetDoc = target.ownerDocument,
+		resultFragment = xslt.transformToFragment(parse(text), targetDoc);
+
+	// Apply post-processing
+	if (HINT.postProcessing)
+	{
+		var nodes = resultFragment['querySelectorAll']('[data-s9e-livepreview-postprocess]'),
+			i     = nodes.length;
+		while (--i >= 0)
+		{
+			/** @type {!string} */
+			var code = nodes[i]['getAttribute']('data-s9e-livepreview-postprocess');
+
+			if (!postProcessFunctions[code])
+			{
+				postProcessFunctions[code] = new Function(code);
+			}
+
+			postProcessFunctions[code]['call'](nodes[i]);
+		}
+	}
+
+	/**
+	* Update the content of given element oldEl to match element newEl
+	*
+	* @param {!HTMLElement} oldEl
+	* @param {!HTMLElement} newEl
+	*/
+	function refreshElementContent(oldEl, newEl)
+	{
+		var oldNodes = oldEl.childNodes,
+			newNodes = newEl.childNodes,
+			oldCnt = oldNodes.length,
+			newCnt = newNodes.length,
+			oldNode,
+			newNode,
+			left  = 0,
+			right = 0;
+
+		// Skip the leftmost matching nodes
+		while (left < oldCnt && left < newCnt)
+		{
+			oldNode = oldNodes[left];
+			newNode = newNodes[left];
+
+			if (!refreshNode(oldNode, newNode))
+			{
+				break;
+			}
+
+			++left;
+		}
+
+		// Skip the rightmost matching nodes
+		var maxRight = Math.min(oldCnt - left, newCnt - left);
+
+		while (right < maxRight)
+		{
+			oldNode = oldNodes[oldCnt - (right + 1)];
+			newNode = newNodes[newCnt - (right + 1)];
+
+			if (!refreshNode(oldNode, newNode))
+			{
+				break;
+			}
+
+			++right;
+		}
+
+		// Clone the new nodes
+		var newNodesFragment = targetDoc.createDocumentFragment(),
+			i = left;
+
+		while (i < (newCnt - right))
+		{
+			newNode = newNodes[i].cloneNode(true);
+
+			newNodesFragment.appendChild(newNode);
+			++i;
+		}
+
+		// Remove the old dirty nodes in the middle of the tree
+		i = oldCnt - right;
+		while (--i >= left)
+		{
+			oldEl.removeChild(oldNodes[i]);
+		}
+
+		// If we haven't skipped any nodes to the right, we can just append the fragment
+		if (!right)
+		{
+			oldEl.appendChild(newNodesFragment);
+		}
+		else
+		{
+			oldEl.insertBefore(newNodesFragment, oldEl.childNodes[left]);
+		}
+	}
+
+	/**
+	* Update given node oldNode to make it match newNode
+	*
+	* @param {!HTMLElement} oldNode
+	* @param {!HTMLElement} newNode
+	* @return boolean Whether the node can be skipped
+	*/
+	function refreshNode(oldNode, newNode)
+	{
+		if (oldNode.nodeName !== newNode.nodeName
+		 || oldNode.nodeType !== newNode.nodeType)
+		{
+			return false;
+		}
+
+		// Node.TEXT_NODE || Node.COMMENT_NODE
+		if (oldNode.nodeType === 3 || oldNode.nodeType === 8)
+		{
+			if (oldNode.nodeValue !== newNode.nodeValue)
+			{
+				oldNode.nodeValue = newNode.nodeValue;
+			}
+
+			return true;
+		}
+
+		if (oldNode.isEqualNode && oldNode.isEqualNode(newNode))
+		{
+			return true;
+		}
+
+		syncElementAttributes(oldNode, newNode);
+		refreshElementContent(oldNode, newNode);
+
+		return true;
+	}
+
+	/**
+	* Make the set of attributes of given element oldEl match newEl's
+	*
+	* @param {!HTMLElement} oldEl
+	* @param {!HTMLElement} newEl
+	*/
+	function syncElementAttributes(oldEl, newEl)
+	{
+		var oldAttributes = oldEl['attributes'],
+			newAttributes = newEl['attributes'],
+			oldCnt = oldAttributes.length,
+			newCnt = newAttributes.length,
+			i = oldCnt;
+
+		while (--i >= 0)
+		{
+			var oldAttr      = oldAttributes[i],
+				namespaceURI = oldAttr['namespaceURI'],
+				attrName     = oldAttr['name'];
+
+			if (!newEl.hasAttributeNS(namespaceURI, attrName))
+			{
+				oldEl.removeAttributeNS(namespaceURI, attrName);
+			}
+		}
+
+		i = newCnt;
+		while (--i >= 0)
+		{
+			var newAttr      = newAttributes[i],
+				namespaceURI = newAttr['namespaceURI'],
+				attrName     = newAttr['name'],
+				attrValue    = newAttr['value'];
+
+			if (attrValue !== oldEl.getAttributeNS(namespaceURI, attrName))
+			{
+				oldEl.setAttributeNS(namespaceURI, attrName, attrValue);
+			}
+		}
+	}
+
+	refreshElementContent(target, resultFragment);
+}
+
+/**
+* Set the value of a stylesheet parameter
+*
+* @param {!string} paramName  Parameter name
+* @param {!string} paramValue Parameter's value
+*/
+function setParameter(paramName, paramValue)
+{
+	xslt.setParameter(paramName, paramValue);
+}
\ No newline at end of file
--- /dev/null
+++ b/vendor/symfony/config/ConfigCache.php
@@ -0,0 +1,79 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config;
+
+use Symfony\Component\Config\Resource\BCResourceInterfaceChecker;
+use Symfony\Component\Config\Resource\SelfCheckingResourceChecker;
+
+/**
+ * ConfigCache caches arbitrary content in files on disk.
+ *
+ * When in debug mode, those metadata resources that implement
+ * \Symfony\Component\Config\Resource\SelfCheckingResourceInterface will
+ * be used to check cache freshness.
+ *
+ * During a transition period, also instances of
+ * \Symfony\Component\Config\Resource\ResourceInterface will be checked
+ * by means of the isFresh() method. This behaviour is deprecated since 2.8
+ * and will be removed in 3.0.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Matthias Pigulla <mp@webfactory.de>
+ */
+class ConfigCache extends ResourceCheckerConfigCache
+{
+    private $debug;
+
+    /**
+     * @param string $file  The absolute cache path
+     * @param bool   $debug Whether debugging is enabled or not
+     */
+    public function __construct($file, $debug)
+    {
+        parent::__construct($file, array(
+            new SelfCheckingResourceChecker(),
+            new BCResourceInterfaceChecker(),
+        ));
+        $this->debug = (bool) $debug;
+    }
+
+    /**
+     * Gets the cache file path.
+     *
+     * @return string The cache file path
+     *
+     * @deprecated since 2.7, to be removed in 3.0. Use getPath() instead.
+     */
+    public function __toString()
+    {
+        @trigger_error('ConfigCache::__toString() is deprecated since version 2.7 and will be removed in 3.0. Use the getPath() method instead.', E_USER_DEPRECATED);
+
+        return $this->getPath();
+    }
+
+    /**
+     * Checks if the cache is still fresh.
+     *
+     * This implementation always returns true when debug is off and the
+     * cache file exists.
+     *
+     * @return bool true if the cache is fresh, false otherwise
+     */
+    public function isFresh()
+    {
+        if (!$this->debug && is_file($this->getPath())) {
+            return true;
+        }
+
+        return parent::isFresh();
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/ConfigCacheFactory.php
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config;
+
+/**
+ * Basic implementation of ConfigCacheFactoryInterface that
+ * creates an instance of the default ConfigCache.
+ *
+ * This factory and/or cache <em>do not</em> support cache validation
+ * by means of ResourceChecker instances (that is, service-based).
+ *
+ * @author Matthias Pigulla <mp@webfactory.de>
+ */
+class ConfigCacheFactory implements ConfigCacheFactoryInterface
+{
+    /**
+     * @var bool Debug flag passed to the ConfigCache
+     */
+    private $debug;
+
+    /**
+     * @param bool $debug The debug flag to pass to ConfigCache
+     */
+    public function __construct($debug)
+    {
+        $this->debug = $debug;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function cache($file, $callback)
+    {
+        if (!is_callable($callback)) {
+            throw new \InvalidArgumentException(sprintf('Invalid type for callback argument. Expected callable, but got "%s".', gettype($callback)));
+        }
+
+        $cache = new ConfigCache($file, $this->debug);
+        if (!$cache->isFresh()) {
+            call_user_func($callback, $cache);
+        }
+
+        return $cache;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/ConfigCacheFactoryInterface.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config;
+
+/**
+ * Interface for a ConfigCache factory. This factory creates
+ * an instance of ConfigCacheInterface and initializes the
+ * cache if necessary.
+ *
+ * @author Matthias Pigulla <mp@webfactory.de>
+ */
+interface ConfigCacheFactoryInterface
+{
+    /**
+     * Creates a cache instance and (re-)initializes it if necessary.
+     *
+     * @param string   $file     The absolute cache file path
+     * @param callable $callable The callable to be executed when the cache needs to be filled (i. e. is not fresh). The cache will be passed as the only parameter to this callback
+     *
+     * @return ConfigCacheInterface $configCache The cache instance
+     */
+    public function cache($file, $callable);
+}
--- /dev/null
+++ b/vendor/symfony/config/ConfigCacheInterface.php
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config;
+
+use Symfony\Component\Config\Resource\ResourceInterface;
+
+/**
+ * Interface for ConfigCache.
+ *
+ * @author Matthias Pigulla <mp@webfactory.de>
+ */
+interface ConfigCacheInterface
+{
+    /**
+     * Gets the cache file path.
+     *
+     * @return string The cache file path
+     */
+    public function getPath();
+
+    /**
+     * Checks if the cache is still fresh.
+     *
+     * This check should take the metadata passed to the write() method into consideration.
+     *
+     * @return bool Whether the cache is still fresh
+     */
+    public function isFresh();
+
+    /**
+     * Writes the given content into the cache file. Metadata will be stored
+     * independently and can be used to check cache freshness at a later time.
+     *
+     * @param string                   $content  The content to write into the cache
+     * @param ResourceInterface[]|null $metadata An array of ResourceInterface instances
+     *
+     * @throws \RuntimeException When the cache file cannot be written
+     */
+    public function write($content, array $metadata = null);
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/ArrayNode.php
@@ -0,0 +1,401 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition;
+
+use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
+use Symfony\Component\Config\Definition\Exception\InvalidTypeException;
+use Symfony\Component\Config\Definition\Exception\UnsetKeyException;
+
+/**
+ * Represents an Array node in the config tree.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ArrayNode extends BaseNode implements PrototypeNodeInterface
+{
+    protected $xmlRemappings = array();
+    protected $children = array();
+    protected $allowFalse = false;
+    protected $allowNewKeys = true;
+    protected $addIfNotSet = false;
+    protected $performDeepMerging = true;
+    protected $ignoreExtraKeys = false;
+    protected $removeExtraKeys = true;
+    protected $normalizeKeys = true;
+
+    public function setNormalizeKeys($normalizeKeys)
+    {
+        $this->normalizeKeys = (bool) $normalizeKeys;
+    }
+
+    /**
+     * Normalizes keys between the different configuration formats.
+     *
+     * Namely, you mostly have foo_bar in YAML while you have foo-bar in XML.
+     * After running this method, all keys are normalized to foo_bar.
+     *
+     * If you have a mixed key like foo-bar_moo, it will not be altered.
+     * The key will also not be altered if the target key already exists.
+     *
+     * @param mixed $value
+     *
+     * @return array The value with normalized keys
+     */
+    protected function preNormalize($value)
+    {
+        if (!$this->normalizeKeys || !is_array($value)) {
+            return $value;
+        }
+
+        $normalized = array();
+
+        foreach ($value as $k => $v) {
+            if (false !== strpos($k, '-') && false === strpos($k, '_') && !array_key_exists($normalizedKey = str_replace('-', '_', $k), $value)) {
+                $normalized[$normalizedKey] = $v;
+            } else {
+                $normalized[$k] = $v;
+            }
+        }
+
+        return $normalized;
+    }
+
+    /**
+     * Retrieves the children of this node.
+     *
+     * @return array The children
+     */
+    public function getChildren()
+    {
+        return $this->children;
+    }
+
+    /**
+     * Sets the xml remappings that should be performed.
+     *
+     * @param array $remappings an array of the form array(array(string, string))
+     */
+    public function setXmlRemappings(array $remappings)
+    {
+        $this->xmlRemappings = $remappings;
+    }
+
+    /**
+     * Gets the xml remappings that should be performed.
+     *
+     * @return array $remappings an array of the form array(array(string, string))
+     */
+    public function getXmlRemappings()
+    {
+        return $this->xmlRemappings;
+    }
+
+    /**
+     * Sets whether to add default values for this array if it has not been
+     * defined in any of the configuration files.
+     *
+     * @param bool $boolean
+     */
+    public function setAddIfNotSet($boolean)
+    {
+        $this->addIfNotSet = (bool) $boolean;
+    }
+
+    /**
+     * Sets whether false is allowed as value indicating that the array should be unset.
+     *
+     * @param bool $allow
+     */
+    public function setAllowFalse($allow)
+    {
+        $this->allowFalse = (bool) $allow;
+    }
+
+    /**
+     * Sets whether new keys can be defined in subsequent configurations.
+     *
+     * @param bool $allow
+     */
+    public function setAllowNewKeys($allow)
+    {
+        $this->allowNewKeys = (bool) $allow;
+    }
+
+    /**
+     * Sets if deep merging should occur.
+     *
+     * @param bool $boolean
+     */
+    public function setPerformDeepMerging($boolean)
+    {
+        $this->performDeepMerging = (bool) $boolean;
+    }
+
+    /**
+     * Whether extra keys should just be ignore without an exception.
+     *
+     * @param bool $boolean To allow extra keys
+     * @param bool $remove  To remove extra keys
+     */
+    public function setIgnoreExtraKeys($boolean, $remove = true)
+    {
+        $this->ignoreExtraKeys = (bool) $boolean;
+        $this->removeExtraKeys = $this->ignoreExtraKeys && $remove;
+    }
+
+    /**
+     * Sets the node Name.
+     *
+     * @param string $name The node's name
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * Checks if the node has a default value.
+     *
+     * @return bool
+     */
+    public function hasDefaultValue()
+    {
+        return $this->addIfNotSet;
+    }
+
+    /**
+     * Retrieves the default value.
+     *
+     * @return array The default value
+     *
+     * @throws \RuntimeException if the node has no default value
+     */
+    public function getDefaultValue()
+    {
+        if (!$this->hasDefaultValue()) {
+            throw new \RuntimeException(sprintf('The node at path "%s" has no default value.', $this->getPath()));
+        }
+
+        $defaults = array();
+        foreach ($this->children as $name => $child) {
+            if ($child->hasDefaultValue()) {
+                $defaults[$name] = $child->getDefaultValue();
+            }
+        }
+
+        return $defaults;
+    }
+
+    /**
+     * Adds a child node.
+     *
+     * @param NodeInterface $node The child node to add
+     *
+     * @throws \InvalidArgumentException when the child node has no name
+     * @throws \InvalidArgumentException when the child node's name is not unique
+     */
+    public function addChild(NodeInterface $node)
+    {
+        $name = $node->getName();
+        if (!strlen($name)) {
+            throw new \InvalidArgumentException('Child nodes must be named.');
+        }
+        if (isset($this->children[$name])) {
+            throw new \InvalidArgumentException(sprintf('A child node named "%s" already exists.', $name));
+        }
+
+        $this->children[$name] = $node;
+    }
+
+    /**
+     * Finalizes the value of this node.
+     *
+     * @param mixed $value
+     *
+     * @return mixed The finalised value
+     *
+     * @throws UnsetKeyException
+     * @throws InvalidConfigurationException if the node doesn't have enough children
+     */
+    protected function finalizeValue($value)
+    {
+        if (false === $value) {
+            $msg = sprintf('Unsetting key for path "%s", value: %s', $this->getPath(), json_encode($value));
+            throw new UnsetKeyException($msg);
+        }
+
+        foreach ($this->children as $name => $child) {
+            if (!array_key_exists($name, $value)) {
+                if ($child->isRequired()) {
+                    $msg = sprintf('The child node "%s" at path "%s" must be configured.', $name, $this->getPath());
+                    $ex = new InvalidConfigurationException($msg);
+                    $ex->setPath($this->getPath());
+
+                    throw $ex;
+                }
+
+                if ($child->hasDefaultValue()) {
+                    $value[$name] = $child->getDefaultValue();
+                }
+
+                continue;
+            }
+
+            try {
+                $value[$name] = $child->finalize($value[$name]);
+            } catch (UnsetKeyException $e) {
+                unset($value[$name]);
+            }
+        }
+
+        return $value;
+    }
+
+    /**
+     * Validates the type of the value.
+     *
+     * @param mixed $value
+     *
+     * @throws InvalidTypeException
+     */
+    protected function validateType($value)
+    {
+        if (!is_array($value) && (!$this->allowFalse || false !== $value)) {
+            $ex = new InvalidTypeException(sprintf(
+                'Invalid type for path "%s". Expected array, but got %s',
+                $this->getPath(),
+                gettype($value)
+            ));
+            if ($hint = $this->getInfo()) {
+                $ex->addHint($hint);
+            }
+            $ex->setPath($this->getPath());
+
+            throw $ex;
+        }
+    }
+
+    /**
+     * Normalizes the value.
+     *
+     * @param mixed $value The value to normalize
+     *
+     * @return mixed The normalized value
+     *
+     * @throws InvalidConfigurationException
+     */
+    protected function normalizeValue($value)
+    {
+        if (false === $value) {
+            return $value;
+        }
+
+        $value = $this->remapXml($value);
+
+        $normalized = array();
+        foreach ($value as $name => $val) {
+            if (isset($this->children[$name])) {
+                $normalized[$name] = $this->children[$name]->normalize($val);
+                unset($value[$name]);
+            } elseif (!$this->removeExtraKeys) {
+                $normalized[$name] = $val;
+            }
+        }
+
+        // if extra fields are present, throw exception
+        if (count($value) && !$this->ignoreExtraKeys) {
+            $msg = sprintf('Unrecognized option%s "%s" under "%s"', 1 === count($value) ? '' : 's', implode(', ', array_keys($value)), $this->getPath());
+            $ex = new InvalidConfigurationException($msg);
+            $ex->setPath($this->getPath());
+
+            throw $ex;
+        }
+
+        return $normalized;
+    }
+
+    /**
+     * Remaps multiple singular values to a single plural value.
+     *
+     * @param array $value The source values
+     *
+     * @return array The remapped values
+     */
+    protected function remapXml($value)
+    {
+        foreach ($this->xmlRemappings as $transformation) {
+            list($singular, $plural) = $transformation;
+
+            if (!isset($value[$singular])) {
+                continue;
+            }
+
+            $value[$plural] = Processor::normalizeConfig($value, $singular, $plural);
+            unset($value[$singular]);
+        }
+
+        return $value;
+    }
+
+    /**
+     * Merges values together.
+     *
+     * @param mixed $leftSide  The left side to merge
+     * @param mixed $rightSide The right side to merge
+     *
+     * @return mixed The merged values
+     *
+     * @throws InvalidConfigurationException
+     * @throws \RuntimeException
+     */
+    protected function mergeValues($leftSide, $rightSide)
+    {
+        if (false === $rightSide) {
+            // if this is still false after the last config has been merged the
+            // finalization pass will take care of removing this key entirely
+            return false;
+        }
+
+        if (false === $leftSide || !$this->performDeepMerging) {
+            return $rightSide;
+        }
+
+        foreach ($rightSide as $k => $v) {
+            // no conflict
+            if (!array_key_exists($k, $leftSide)) {
+                if (!$this->allowNewKeys) {
+                    $ex = new InvalidConfigurationException(sprintf(
+                        'You are not allowed to define new elements for path "%s". '
+                       .'Please define all elements for this path in one config file. '
+                       .'If you are trying to overwrite an element, make sure you redefine it '
+                       .'with the same name.',
+                        $this->getPath()
+                    ));
+                    $ex->setPath($this->getPath());
+
+                    throw $ex;
+                }
+
+                $leftSide[$k] = $v;
+                continue;
+            }
+
+            if (!isset($this->children[$k])) {
+                throw new \RuntimeException('merge() expects a normalized config array.');
+            }
+
+            $leftSide[$k] = $this->children[$k]->merge($leftSide[$k], $v);
+        }
+
+        return $leftSide;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/BaseNode.php
@@ -0,0 +1,356 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition;
+
+use Symfony\Component\Config\Definition\Exception\Exception;
+use Symfony\Component\Config\Definition\Exception\ForbiddenOverwriteException;
+use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
+use Symfony\Component\Config\Definition\Exception\InvalidTypeException;
+
+/**
+ * The base node class.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+abstract class BaseNode implements NodeInterface
+{
+    protected $name;
+    protected $parent;
+    protected $normalizationClosures = array();
+    protected $finalValidationClosures = array();
+    protected $allowOverwrite = true;
+    protected $required = false;
+    protected $equivalentValues = array();
+    protected $attributes = array();
+
+    /**
+     * Constructor.
+     *
+     * @param string        $name   The name of the node
+     * @param NodeInterface $parent The parent of this node
+     *
+     * @throws \InvalidArgumentException if the name contains a period.
+     */
+    public function __construct($name, NodeInterface $parent = null)
+    {
+        if (false !== strpos($name, '.')) {
+            throw new \InvalidArgumentException('The name must not contain ".".');
+        }
+
+        $this->name = $name;
+        $this->parent = $parent;
+    }
+
+    public function setAttribute($key, $value)
+    {
+        $this->attributes[$key] = $value;
+    }
+
+    public function getAttribute($key, $default = null)
+    {
+        return isset($this->attributes[$key]) ? $this->attributes[$key] : $default;
+    }
+
+    public function hasAttribute($key)
+    {
+        return isset($this->attributes[$key]);
+    }
+
+    public function getAttributes()
+    {
+        return $this->attributes;
+    }
+
+    public function setAttributes(array $attributes)
+    {
+        $this->attributes = $attributes;
+    }
+
+    public function removeAttribute($key)
+    {
+        unset($this->attributes[$key]);
+    }
+
+    /**
+     * Sets an info message.
+     *
+     * @param string $info
+     */
+    public function setInfo($info)
+    {
+        $this->setAttribute('info', $info);
+    }
+
+    /**
+     * Returns info message.
+     *
+     * @return string The info text
+     */
+    public function getInfo()
+    {
+        return $this->getAttribute('info');
+    }
+
+    /**
+     * Sets the example configuration for this node.
+     *
+     * @param string|array $example
+     */
+    public function setExample($example)
+    {
+        $this->setAttribute('example', $example);
+    }
+
+    /**
+     * Retrieves the example configuration for this node.
+     *
+     * @return string|array The example
+     */
+    public function getExample()
+    {
+        return $this->getAttribute('example');
+    }
+
+    /**
+     * Adds an equivalent value.
+     *
+     * @param mixed $originalValue
+     * @param mixed $equivalentValue
+     */
+    public function addEquivalentValue($originalValue, $equivalentValue)
+    {
+        $this->equivalentValues[] = array($originalValue, $equivalentValue);
+    }
+
+    /**
+     * Set this node as required.
+     *
+     * @param bool $boolean Required node
+     */
+    public function setRequired($boolean)
+    {
+        $this->required = (bool) $boolean;
+    }
+
+    /**
+     * Sets if this node can be overridden.
+     *
+     * @param bool $allow
+     */
+    public function setAllowOverwrite($allow)
+    {
+        $this->allowOverwrite = (bool) $allow;
+    }
+
+    /**
+     * Sets the closures used for normalization.
+     *
+     * @param \Closure[] $closures An array of Closures used for normalization
+     */
+    public function setNormalizationClosures(array $closures)
+    {
+        $this->normalizationClosures = $closures;
+    }
+
+    /**
+     * Sets the closures used for final validation.
+     *
+     * @param \Closure[] $closures An array of Closures used for final validation
+     */
+    public function setFinalValidationClosures(array $closures)
+    {
+        $this->finalValidationClosures = $closures;
+    }
+
+    /**
+     * Checks if this node is required.
+     *
+     * @return bool
+     */
+    public function isRequired()
+    {
+        return $this->required;
+    }
+
+    /**
+     * Returns the name of this node.
+     *
+     * @return string The Node's name
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Retrieves the path of this node.
+     *
+     * @return string The Node's path
+     */
+    public function getPath()
+    {
+        $path = $this->name;
+
+        if (null !== $this->parent) {
+            $path = $this->parent->getPath().'.'.$path;
+        }
+
+        return $path;
+    }
+
+    /**
+     * Merges two values together.
+     *
+     * @param mixed $leftSide
+     * @param mixed $rightSide
+     *
+     * @return mixed The merged value
+     *
+     * @throws ForbiddenOverwriteException
+     */
+    final public function merge($leftSide, $rightSide)
+    {
+        if (!$this->allowOverwrite) {
+            throw new ForbiddenOverwriteException(sprintf(
+                'Configuration path "%s" cannot be overwritten. You have to '
+               .'define all options for this path, and any of its sub-paths in '
+               .'one configuration section.',
+                $this->getPath()
+            ));
+        }
+
+        $this->validateType($leftSide);
+        $this->validateType($rightSide);
+
+        return $this->mergeValues($leftSide, $rightSide);
+    }
+
+    /**
+     * Normalizes a value, applying all normalization closures.
+     *
+     * @param mixed $value Value to normalize
+     *
+     * @return mixed The normalized value
+     */
+    final public function normalize($value)
+    {
+        $value = $this->preNormalize($value);
+
+        // run custom normalization closures
+        foreach ($this->normalizationClosures as $closure) {
+            $value = $closure($value);
+        }
+
+        // replace value with their equivalent
+        foreach ($this->equivalentValues as $data) {
+            if ($data[0] === $value) {
+                $value = $data[1];
+            }
+        }
+
+        // validate type
+        $this->validateType($value);
+
+        // normalize value
+        return $this->normalizeValue($value);
+    }
+
+    /**
+     * Normalizes the value before any other normalization is applied.
+     *
+     * @param $value
+     *
+     * @return $value The normalized array value
+     */
+    protected function preNormalize($value)
+    {
+        return $value;
+    }
+
+    /**
+     * Returns parent node for this node.
+     *
+     * @return NodeInterface|null
+     */
+    public function getParent()
+    {
+        return $this->parent;
+    }
+
+    /**
+     * Finalizes a value, applying all finalization closures.
+     *
+     * @param mixed $value The value to finalize
+     *
+     * @return mixed The finalized value
+     *
+     * @throws Exception
+     * @throws InvalidConfigurationException
+     */
+    final public function finalize($value)
+    {
+        $this->validateType($value);
+
+        $value = $this->finalizeValue($value);
+
+        // Perform validation on the final value if a closure has been set.
+        // The closure is also allowed to return another value.
+        foreach ($this->finalValidationClosures as $closure) {
+            try {
+                $value = $closure($value);
+            } catch (Exception $e) {
+                throw $e;
+            } catch (\Exception $e) {
+                throw new InvalidConfigurationException(sprintf('Invalid configuration for path "%s": %s', $this->getPath(), $e->getMessage()), $e->getCode(), $e);
+            }
+        }
+
+        return $value;
+    }
+
+    /**
+     * Validates the type of a Node.
+     *
+     * @param mixed $value The value to validate
+     *
+     * @throws InvalidTypeException when the value is invalid
+     */
+    abstract protected function validateType($value);
+
+    /**
+     * Normalizes the value.
+     *
+     * @param mixed $value The value to normalize
+     *
+     * @return mixed The normalized value
+     */
+    abstract protected function normalizeValue($value);
+
+    /**
+     * Merges two values together.
+     *
+     * @param mixed $leftSide
+     * @param mixed $rightSide
+     *
+     * @return mixed The merged value
+     */
+    abstract protected function mergeValues($leftSide, $rightSide);
+
+    /**
+     * Finalizes a value.
+     *
+     * @param mixed $value The value to finalize
+     *
+     * @return mixed The finalized value
+     */
+    abstract protected function finalizeValue($value);
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/BooleanNode.php
@@ -0,0 +1,51 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition;
+
+use Symfony\Component\Config\Definition\Exception\InvalidTypeException;
+
+/**
+ * This node represents a Boolean value in the config tree.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class BooleanNode extends ScalarNode
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function validateType($value)
+    {
+        if (!is_bool($value)) {
+            $ex = new InvalidTypeException(sprintf(
+                'Invalid type for path "%s". Expected boolean, but got %s.',
+                $this->getPath(),
+                gettype($value)
+            ));
+            if ($hint = $this->getInfo()) {
+                $ex->addHint($hint);
+            }
+            $ex->setPath($this->getPath());
+
+            throw $ex;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function isValueEmpty($value)
+    {
+        // a boolean value cannot be empty
+        return false;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php
@@ -0,0 +1,493 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+use Symfony\Component\Config\Definition\ArrayNode;
+use Symfony\Component\Config\Definition\PrototypedArrayNode;
+use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException;
+
+/**
+ * This class provides a fluent interface for defining an array node.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinitionInterface
+{
+    protected $performDeepMerging = true;
+    protected $ignoreExtraKeys = false;
+    protected $removeExtraKeys = true;
+    protected $children = array();
+    protected $prototype;
+    protected $atLeastOne = false;
+    protected $allowNewKeys = true;
+    protected $key;
+    protected $removeKeyItem;
+    protected $addDefaults = false;
+    protected $addDefaultChildren = false;
+    protected $nodeBuilder;
+    protected $normalizeKeys = true;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct($name, NodeParentInterface $parent = null)
+    {
+        parent::__construct($name, $parent);
+
+        $this->nullEquivalent = array();
+        $this->trueEquivalent = array();
+    }
+
+    /**
+     * Sets a custom children builder.
+     *
+     * @param NodeBuilder $builder A custom NodeBuilder
+     */
+    public function setBuilder(NodeBuilder $builder)
+    {
+        $this->nodeBuilder = $builder;
+    }
+
+    /**
+     * Returns a builder to add children nodes.
+     *
+     * @return NodeBuilder
+     */
+    public function children()
+    {
+        return $this->getNodeBuilder();
+    }
+
+    /**
+     * Sets a prototype for child nodes.
+     *
+     * @param string $type the type of node
+     *
+     * @return NodeDefinition
+     */
+    public function prototype($type)
+    {
+        return $this->prototype = $this->getNodeBuilder()->node(null, $type)->setParent($this);
+    }
+
+    /**
+     * Adds the default value if the node is not set in the configuration.
+     *
+     * This method is applicable to concrete nodes only (not to prototype nodes).
+     * If this function has been called and the node is not set during the finalization
+     * phase, it's default value will be derived from its children default values.
+     *
+     * @return ArrayNodeDefinition
+     */
+    public function addDefaultsIfNotSet()
+    {
+        $this->addDefaults = true;
+
+        return $this;
+    }
+
+    /**
+     * Adds children with a default value when none are defined.
+     *
+     * @param int|string|array|null $children The number of children|The child name|The children names to be added
+     *
+     * This method is applicable to prototype nodes only.
+     *
+     * @return ArrayNodeDefinition
+     */
+    public function addDefaultChildrenIfNoneSet($children = null)
+    {
+        $this->addDefaultChildren = $children;
+
+        return $this;
+    }
+
+    /**
+     * Requires the node to have at least one element.
+     *
+     * This method is applicable to prototype nodes only.
+     *
+     * @return ArrayNodeDefinition
+     */
+    public function requiresAtLeastOneElement()
+    {
+        $this->atLeastOne = true;
+
+        return $this;
+    }
+
+    /**
+     * Disallows adding news keys in a subsequent configuration.
+     *
+     * If used all keys have to be defined in the same configuration file.
+     *
+     * @return ArrayNodeDefinition
+     */
+    public function disallowNewKeysInSubsequentConfigs()
+    {
+        $this->allowNewKeys = false;
+
+        return $this;
+    }
+
+    /**
+     * Sets a normalization rule for XML configurations.
+     *
+     * @param string $singular The key to remap
+     * @param string $plural   The plural of the key for irregular plurals
+     *
+     * @return ArrayNodeDefinition
+     */
+    public function fixXmlConfig($singular, $plural = null)
+    {
+        $this->normalization()->remap($singular, $plural);
+
+        return $this;
+    }
+
+    /**
+     * Sets the attribute which value is to be used as key.
+     *
+     * This is useful when you have an indexed array that should be an
+     * associative array. You can select an item from within the array
+     * to be the key of the particular item. For example, if "id" is the
+     * "key", then:
+     *
+     *     array(
+     *         array('id' => 'my_name', 'foo' => 'bar'),
+     *     );
+     *
+     *   becomes
+     *
+     *     array(
+     *         'my_name' => array('foo' => 'bar'),
+     *     );
+     *
+     * If you'd like "'id' => 'my_name'" to still be present in the resulting
+     * array, then you can set the second argument of this method to false.
+     *
+     * This method is applicable to prototype nodes only.
+     *
+     * @param string $name          The name of the key
+     * @param bool   $removeKeyItem Whether or not the key item should be removed
+     *
+     * @return ArrayNodeDefinition
+     */
+    public function useAttributeAsKey($name, $removeKeyItem = true)
+    {
+        $this->key = $name;
+        $this->removeKeyItem = $removeKeyItem;
+
+        return $this;
+    }
+
+    /**
+     * Sets whether the node can be unset.
+     *
+     * @param bool $allow
+     *
+     * @return ArrayNodeDefinition
+     */
+    public function canBeUnset($allow = true)
+    {
+        $this->merge()->allowUnset($allow);
+
+        return $this;
+    }
+
+    /**
+     * Adds an "enabled" boolean to enable the current section.
+     *
+     * By default, the section is disabled. If any configuration is specified then
+     * the node will be automatically enabled:
+     *
+     * enableableArrayNode: {enabled: true, ...}   # The config is enabled & default values get overridden
+     * enableableArrayNode: ~                      # The config is enabled & use the default values
+     * enableableArrayNode: true                   # The config is enabled & use the default values
+     * enableableArrayNode: {other: value, ...}    # The config is enabled & default values get overridden
+     * enableableArrayNode: {enabled: false, ...}  # The config is disabled
+     * enableableArrayNode: false                  # The config is disabled
+     *
+     * @return ArrayNodeDefinition
+     */
+    public function canBeEnabled()
+    {
+        $this
+            ->addDefaultsIfNotSet()
+            ->treatFalseLike(array('enabled' => false))
+            ->treatTrueLike(array('enabled' => true))
+            ->treatNullLike(array('enabled' => true))
+            ->beforeNormalization()
+                ->ifArray()
+                ->then(function ($v) {
+                    $v['enabled'] = isset($v['enabled']) ? $v['enabled'] : true;
+
+                    return $v;
+                })
+            ->end()
+            ->children()
+                ->booleanNode('enabled')
+                    ->defaultFalse()
+        ;
+
+        return $this;
+    }
+
+    /**
+     * Adds an "enabled" boolean to enable the current section.
+     *
+     * By default, the section is enabled.
+     *
+     * @return ArrayNodeDefinition
+     */
+    public function canBeDisabled()
+    {
+        $this
+            ->addDefaultsIfNotSet()
+            ->treatFalseLike(array('enabled' => false))
+            ->treatTrueLike(array('enabled' => true))
+            ->treatNullLike(array('enabled' => true))
+            ->children()
+                ->booleanNode('enabled')
+                    ->defaultTrue()
+        ;
+
+        return $this;
+    }
+
+    /**
+     * Disables the deep merging of the node.
+     *
+     * @return ArrayNodeDefinition
+     */
+    public function performNoDeepMerging()
+    {
+        $this->performDeepMerging = false;
+
+        return $this;
+    }
+
+    /**
+     * Allows extra config keys to be specified under an array without
+     * throwing an exception.
+     *
+     * Those config values are simply ignored and removed from the
+     * resulting array. This should be used only in special cases where
+     * you want to send an entire configuration array through a special
+     * tree that processes only part of the array.
+     *
+     * @param bool $remove Whether to remove the extra keys
+     *
+     * @return ArrayNodeDefinition
+     */
+    public function ignoreExtraKeys($remove = true)
+    {
+        $this->ignoreExtraKeys = true;
+        $this->removeExtraKeys = $remove;
+
+        return $this;
+    }
+
+    /**
+     * Sets key normalization.
+     *
+     * @param bool $bool Whether to enable key normalization
+     *
+     * @return ArrayNodeDefinition
+     */
+    public function normalizeKeys($bool)
+    {
+        $this->normalizeKeys = (bool) $bool;
+
+        return $this;
+    }
+
+    /**
+     * Appends a node definition.
+     *
+     *     $node = new ArrayNodeDefinition()
+     *         ->children()
+     *             ->scalarNode('foo')->end()
+     *             ->scalarNode('baz')->end()
+     *         ->end()
+     *         ->append($this->getBarNodeDefinition())
+     *     ;
+     *
+     * @param NodeDefinition $node A NodeDefinition instance
+     *
+     * @return ArrayNodeDefinition This node
+     */
+    public function append(NodeDefinition $node)
+    {
+        $this->children[$node->name] = $node->setParent($this);
+
+        return $this;
+    }
+
+    /**
+     * Returns a node builder to be used to add children and prototype.
+     *
+     * @return NodeBuilder The node builder
+     */
+    protected function getNodeBuilder()
+    {
+        if (null === $this->nodeBuilder) {
+            $this->nodeBuilder = new NodeBuilder();
+        }
+
+        return $this->nodeBuilder->setParent($this);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function createNode()
+    {
+        if (null === $this->prototype) {
+            $node = new ArrayNode($this->name, $this->parent);
+
+            $this->validateConcreteNode($node);
+
+            $node->setAddIfNotSet($this->addDefaults);
+
+            foreach ($this->children as $child) {
+                $child->parent = $node;
+                $node->addChild($child->getNode());
+            }
+        } else {
+            $node = new PrototypedArrayNode($this->name, $this->parent);
+
+            $this->validatePrototypeNode($node);
+
+            if (null !== $this->key) {
+                $node->setKeyAttribute($this->key, $this->removeKeyItem);
+            }
+
+            if (true === $this->atLeastOne) {
+                $node->setMinNumberOfElements(1);
+            }
+
+            if ($this->default) {
+                $node->setDefaultValue($this->defaultValue);
+            }
+
+            if (false !== $this->addDefaultChildren) {
+                $node->setAddChildrenIfNoneSet($this->addDefaultChildren);
+                if ($this->prototype instanceof static && null === $this->prototype->prototype) {
+                    $this->prototype->addDefaultsIfNotSet();
+                }
+            }
+
+            $this->prototype->parent = $node;
+            $node->setPrototype($this->prototype->getNode());
+        }
+
+        $node->setAllowNewKeys($this->allowNewKeys);
+        $node->addEquivalentValue(null, $this->nullEquivalent);
+        $node->addEquivalentValue(true, $this->trueEquivalent);
+        $node->addEquivalentValue(false, $this->falseEquivalent);
+        $node->setPerformDeepMerging($this->performDeepMerging);
+        $node->setRequired($this->required);
+        $node->setIgnoreExtraKeys($this->ignoreExtraKeys, $this->removeExtraKeys);
+        $node->setNormalizeKeys($this->normalizeKeys);
+
+        if (null !== $this->normalization) {
+            $node->setNormalizationClosures($this->normalization->before);
+            $node->setXmlRemappings($this->normalization->remappings);
+        }
+
+        if (null !== $this->merge) {
+            $node->setAllowOverwrite($this->merge->allowOverwrite);
+            $node->setAllowFalse($this->merge->allowFalse);
+        }
+
+        if (null !== $this->validation) {
+            $node->setFinalValidationClosures($this->validation->rules);
+        }
+
+        return $node;
+    }
+
+    /**
+     * Validate the configuration of a concrete node.
+     *
+     * @param ArrayNode $node The related node
+     *
+     * @throws InvalidDefinitionException
+     */
+    protected function validateConcreteNode(ArrayNode $node)
+    {
+        $path = $node->getPath();
+
+        if (null !== $this->key) {
+            throw new InvalidDefinitionException(
+                sprintf('->useAttributeAsKey() is not applicable to concrete nodes at path "%s"', $path)
+            );
+        }
+
+        if (true === $this->atLeastOne) {
+            throw new InvalidDefinitionException(
+                sprintf('->requiresAtLeastOneElement() is not applicable to concrete nodes at path "%s"', $path)
+            );
+        }
+
+        if ($this->default) {
+            throw new InvalidDefinitionException(
+                sprintf('->defaultValue() is not applicable to concrete nodes at path "%s"', $path)
+            );
+        }
+
+        if (false !== $this->addDefaultChildren) {
+            throw new InvalidDefinitionException(
+                sprintf('->addDefaultChildrenIfNoneSet() is not applicable to concrete nodes at path "%s"', $path)
+            );
+        }
+    }
+
+    /**
+     * Validate the configuration of a prototype node.
+     *
+     * @param PrototypedArrayNode $node The related node
+     *
+     * @throws InvalidDefinitionException
+     */
+    protected function validatePrototypeNode(PrototypedArrayNode $node)
+    {
+        $path = $node->getPath();
+
+        if ($this->addDefaults) {
+            throw new InvalidDefinitionException(
+                sprintf('->addDefaultsIfNotSet() is not applicable to prototype nodes at path "%s"', $path)
+            );
+        }
+
+        if (false !== $this->addDefaultChildren) {
+            if ($this->default) {
+                throw new InvalidDefinitionException(
+                    sprintf('A default value and default children might not be used together at path "%s"', $path)
+                );
+            }
+
+            if (null !== $this->key && (null === $this->addDefaultChildren || is_int($this->addDefaultChildren) && $this->addDefaultChildren > 0)) {
+                throw new InvalidDefinitionException(
+                    sprintf('->addDefaultChildrenIfNoneSet() should set default children names as ->useAttributeAsKey() is used at path "%s"', $path)
+                );
+            }
+
+            if (null === $this->key && (is_string($this->addDefaultChildren) || is_array($this->addDefaultChildren))) {
+                throw new InvalidDefinitionException(
+                    sprintf('->addDefaultChildrenIfNoneSet() might not set default children names as ->useAttributeAsKey() is not used at path "%s"', $path)
+                );
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/BooleanNodeDefinition.php
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+use Symfony\Component\Config\Definition\BooleanNode;
+
+/**
+ * This class provides a fluent interface for defining a node.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class BooleanNodeDefinition extends ScalarNodeDefinition
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct($name, NodeParentInterface $parent = null)
+    {
+        parent::__construct($name, $parent);
+
+        $this->nullEquivalent = true;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @deprecated Deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function cannotBeEmpty()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        return parent::cannotBeEmpty();
+    }
+
+    /**
+     * Instantiate a Node.
+     *
+     * @return BooleanNode The node
+     */
+    protected function instantiateNode()
+    {
+        return new BooleanNode($this->name, $this->parent);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/EnumNodeDefinition.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+use Symfony\Component\Config\Definition\EnumNode;
+
+/**
+ * Enum Node Definition.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class EnumNodeDefinition extends ScalarNodeDefinition
+{
+    private $values;
+
+    /**
+     * @param array $values
+     *
+     * @return EnumNodeDefinition|$this
+     */
+    public function values(array $values)
+    {
+        $values = array_unique($values);
+
+        if (empty($values)) {
+            throw new \InvalidArgumentException('->values() must be called with at least one value.');
+        }
+
+        $this->values = $values;
+
+        return $this;
+    }
+
+    /**
+     * Instantiate a Node.
+     *
+     * @return EnumNode The node
+     *
+     * @throws \RuntimeException
+     */
+    protected function instantiateNode()
+    {
+        if (null === $this->values) {
+            throw new \RuntimeException('You must call ->values() on enum nodes.');
+        }
+
+        return new EnumNode($this->name, $this->parent, $this->values);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/ExprBuilder.php
@@ -0,0 +1,238 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+use Symfony\Component\Config\Definition\Exception\UnsetKeyException;
+
+/**
+ * This class builds an if expression.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ * @author Christophe Coevoet <stof@notk.org>
+ */
+class ExprBuilder
+{
+    protected $node;
+    public $ifPart;
+    public $thenPart;
+
+    /**
+     * Constructor.
+     *
+     * @param NodeDefinition $node The related node
+     */
+    public function __construct(NodeDefinition $node)
+    {
+        $this->node = $node;
+    }
+
+    /**
+     * Marks the expression as being always used.
+     *
+     * @param \Closure $then
+     *
+     * @return ExprBuilder
+     */
+    public function always(\Closure $then = null)
+    {
+        $this->ifPart = function ($v) { return true; };
+
+        if (null !== $then) {
+            $this->thenPart = $then;
+        }
+
+        return $this;
+    }
+
+    /**
+     * Sets a closure to use as tests.
+     *
+     * The default one tests if the value is true.
+     *
+     * @param \Closure $closure
+     *
+     * @return ExprBuilder
+     */
+    public function ifTrue(\Closure $closure = null)
+    {
+        if (null === $closure) {
+            $closure = function ($v) { return true === $v; };
+        }
+
+        $this->ifPart = $closure;
+
+        return $this;
+    }
+
+    /**
+     * Tests if the value is a string.
+     *
+     * @return ExprBuilder
+     */
+    public function ifString()
+    {
+        $this->ifPart = function ($v) { return is_string($v); };
+
+        return $this;
+    }
+
+    /**
+     * Tests if the value is null.
+     *
+     * @return ExprBuilder
+     */
+    public function ifNull()
+    {
+        $this->ifPart = function ($v) { return null === $v; };
+
+        return $this;
+    }
+
+    /**
+     * Tests if the value is an array.
+     *
+     * @return ExprBuilder
+     */
+    public function ifArray()
+    {
+        $this->ifPart = function ($v) { return is_array($v); };
+
+        return $this;
+    }
+
+    /**
+     * Tests if the value is in an array.
+     *
+     * @param array $array
+     *
+     * @return ExprBuilder
+     */
+    public function ifInArray(array $array)
+    {
+        $this->ifPart = function ($v) use ($array) { return in_array($v, $array, true); };
+
+        return $this;
+    }
+
+    /**
+     * Tests if the value is not in an array.
+     *
+     * @param array $array
+     *
+     * @return ExprBuilder
+     */
+    public function ifNotInArray(array $array)
+    {
+        $this->ifPart = function ($v) use ($array) { return !in_array($v, $array, true); };
+
+        return $this;
+    }
+
+    /**
+     * Sets the closure to run if the test pass.
+     *
+     * @param \Closure $closure
+     *
+     * @return ExprBuilder
+     */
+    public function then(\Closure $closure)
+    {
+        $this->thenPart = $closure;
+
+        return $this;
+    }
+
+    /**
+     * Sets a closure returning an empty array.
+     *
+     * @return ExprBuilder
+     */
+    public function thenEmptyArray()
+    {
+        $this->thenPart = function ($v) { return array(); };
+
+        return $this;
+    }
+
+    /**
+     * Sets a closure marking the value as invalid at validation time.
+     *
+     * if you want to add the value of the node in your message just use a %s placeholder.
+     *
+     * @param string $message
+     *
+     * @return ExprBuilder
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function thenInvalid($message)
+    {
+        $this->thenPart = function ($v) use ($message) {throw new \InvalidArgumentException(sprintf($message, json_encode($v))); };
+
+        return $this;
+    }
+
+    /**
+     * Sets a closure unsetting this key of the array at validation time.
+     *
+     * @return ExprBuilder
+     *
+     * @throws UnsetKeyException
+     */
+    public function thenUnset()
+    {
+        $this->thenPart = function ($v) { throw new UnsetKeyException('Unsetting key'); };
+
+        return $this;
+    }
+
+    /**
+     * Returns the related node.
+     *
+     * @return NodeDefinition
+     *
+     * @throws \RuntimeException
+     */
+    public function end()
+    {
+        if (null === $this->ifPart) {
+            throw new \RuntimeException('You must specify an if part.');
+        }
+        if (null === $this->thenPart) {
+            throw new \RuntimeException('You must specify a then part.');
+        }
+
+        return $this->node;
+    }
+
+    /**
+     * Builds the expressions.
+     *
+     * @param ExprBuilder[] $expressions An array of ExprBuilder instances to build
+     *
+     * @return array
+     */
+    public static function buildExpressions(array $expressions)
+    {
+        foreach ($expressions as $k => $expr) {
+            if ($expr instanceof self) {
+                $if = $expr->ifPart;
+                $then = $expr->thenPart;
+                $expressions[$k] = function ($v) use ($if, $then) {
+                    return $if($v) ? $then($v) : $v;
+                };
+            }
+        }
+
+        return $expressions;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/FloatNodeDefinition.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+use Symfony\Component\Config\Definition\FloatNode;
+
+/**
+ * This class provides a fluent interface for defining a float node.
+ *
+ * @author Jeanmonod David <david.jeanmonod@gmail.com>
+ */
+class FloatNodeDefinition extends NumericNodeDefinition
+{
+    /**
+     * Instantiates a Node.
+     *
+     * @return FloatNode The node
+     */
+    protected function instantiateNode()
+    {
+        return new FloatNode($this->name, $this->parent, $this->min, $this->max);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/IntegerNodeDefinition.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+use Symfony\Component\Config\Definition\IntegerNode;
+
+/**
+ * This class provides a fluent interface for defining an integer node.
+ *
+ * @author Jeanmonod David <david.jeanmonod@gmail.com>
+ */
+class IntegerNodeDefinition extends NumericNodeDefinition
+{
+    /**
+     * Instantiates a Node.
+     *
+     * @return IntegerNode The node
+     */
+    protected function instantiateNode()
+    {
+        return new IntegerNode($this->name, $this->parent, $this->min, $this->max);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/MergeBuilder.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+/**
+ * This class builds merge conditions.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class MergeBuilder
+{
+    protected $node;
+    public $allowFalse = false;
+    public $allowOverwrite = true;
+
+    /**
+     * Constructor.
+     *
+     * @param NodeDefinition $node The related node
+     */
+    public function __construct(NodeDefinition $node)
+    {
+        $this->node = $node;
+    }
+
+    /**
+     * Sets whether the node can be unset.
+     *
+     * @param bool $allow
+     *
+     * @return MergeBuilder
+     */
+    public function allowUnset($allow = true)
+    {
+        $this->allowFalse = $allow;
+
+        return $this;
+    }
+
+    /**
+     * Sets whether the node can be overwritten.
+     *
+     * @param bool $deny Whether the overwriting is forbidden or not
+     *
+     * @return MergeBuilder
+     */
+    public function denyOverwrite($deny = true)
+    {
+        $this->allowOverwrite = !$deny;
+
+        return $this;
+    }
+
+    /**
+     * Returns the related node.
+     *
+     * @return NodeDefinition
+     */
+    public function end()
+    {
+        return $this->node;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/NodeBuilder.php
@@ -0,0 +1,245 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+/**
+ * This class provides a fluent interface for building a node.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class NodeBuilder implements NodeParentInterface
+{
+    protected $parent;
+    protected $nodeMapping;
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        $this->nodeMapping = array(
+            'variable' => __NAMESPACE__.'\\VariableNodeDefinition',
+            'scalar' => __NAMESPACE__.'\\ScalarNodeDefinition',
+            'boolean' => __NAMESPACE__.'\\BooleanNodeDefinition',
+            'integer' => __NAMESPACE__.'\\IntegerNodeDefinition',
+            'float' => __NAMESPACE__.'\\FloatNodeDefinition',
+            'array' => __NAMESPACE__.'\\ArrayNodeDefinition',
+            'enum' => __NAMESPACE__.'\\EnumNodeDefinition',
+        );
+    }
+
+    /**
+     * Set the parent node.
+     *
+     * @param ParentNodeDefinitionInterface $parent The parent node
+     *
+     * @return NodeBuilder This node builder
+     */
+    public function setParent(ParentNodeDefinitionInterface $parent = null)
+    {
+        $this->parent = $parent;
+
+        return $this;
+    }
+
+    /**
+     * Creates a child array node.
+     *
+     * @param string $name The name of the node
+     *
+     * @return ArrayNodeDefinition The child node
+     */
+    public function arrayNode($name)
+    {
+        return $this->node($name, 'array');
+    }
+
+    /**
+     * Creates a child scalar node.
+     *
+     * @param string $name the name of the node
+     *
+     * @return ScalarNodeDefinition The child node
+     */
+    public function scalarNode($name)
+    {
+        return $this->node($name, 'scalar');
+    }
+
+    /**
+     * Creates a child Boolean node.
+     *
+     * @param string $name The name of the node
+     *
+     * @return BooleanNodeDefinition The child node
+     */
+    public function booleanNode($name)
+    {
+        return $this->node($name, 'boolean');
+    }
+
+    /**
+     * Creates a child integer node.
+     *
+     * @param string $name the name of the node
+     *
+     * @return IntegerNodeDefinition The child node
+     */
+    public function integerNode($name)
+    {
+        return $this->node($name, 'integer');
+    }
+
+    /**
+     * Creates a child float node.
+     *
+     * @param string $name the name of the node
+     *
+     * @return FloatNodeDefinition The child node
+     */
+    public function floatNode($name)
+    {
+        return $this->node($name, 'float');
+    }
+
+    /**
+     * Creates a child EnumNode.
+     *
+     * @param string $name
+     *
+     * @return EnumNodeDefinition
+     */
+    public function enumNode($name)
+    {
+        return $this->node($name, 'enum');
+    }
+
+    /**
+     * Creates a child variable node.
+     *
+     * @param string $name The name of the node
+     *
+     * @return VariableNodeDefinition The builder of the child node
+     */
+    public function variableNode($name)
+    {
+        return $this->node($name, 'variable');
+    }
+
+    /**
+     * Returns the parent node.
+     *
+     * @return ParentNodeDefinitionInterface|NodeDefinition The parent node
+     */
+    public function end()
+    {
+        return $this->parent;
+    }
+
+    /**
+     * Creates a child node.
+     *
+     * @param string $name The name of the node
+     * @param string $type The type of the node
+     *
+     * @return NodeDefinition The child node
+     *
+     * @throws \RuntimeException When the node type is not registered
+     * @throws \RuntimeException When the node class is not found
+     */
+    public function node($name, $type)
+    {
+        $class = $this->getNodeClass($type);
+
+        $node = new $class($name);
+
+        $this->append($node);
+
+        return $node;
+    }
+
+    /**
+     * Appends a node definition.
+     *
+     * Usage:
+     *
+     *     $node = new ArrayNodeDefinition('name')
+     *         ->children()
+     *             ->scalarNode('foo')->end()
+     *             ->scalarNode('baz')->end()
+     *             ->append($this->getBarNodeDefinition())
+     *         ->end()
+     *     ;
+     *
+     * @param NodeDefinition $node
+     *
+     * @return NodeBuilder This node builder
+     */
+    public function append(NodeDefinition $node)
+    {
+        if ($node instanceof ParentNodeDefinitionInterface) {
+            $builder = clone $this;
+            $builder->setParent(null);
+            $node->setBuilder($builder);
+        }
+
+        if (null !== $this->parent) {
+            $this->parent->append($node);
+            // Make this builder the node parent to allow for a fluid interface
+            $node->setParent($this);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Adds or overrides a node Type.
+     *
+     * @param string $type  The name of the type
+     * @param string $class The fully qualified name the node definition class
+     *
+     * @return NodeBuilder This node builder
+     */
+    public function setNodeClass($type, $class)
+    {
+        $this->nodeMapping[strtolower($type)] = $class;
+
+        return $this;
+    }
+
+    /**
+     * Returns the class name of the node definition.
+     *
+     * @param string $type The node type
+     *
+     * @return string The node definition class name
+     *
+     * @throws \RuntimeException When the node type is not registered
+     * @throws \RuntimeException When the node class is not found
+     */
+    protected function getNodeClass($type)
+    {
+        $type = strtolower($type);
+
+        if (!isset($this->nodeMapping[$type])) {
+            throw new \RuntimeException(sprintf('The node type "%s" is not registered.', $type));
+        }
+
+        $class = $this->nodeMapping[$type];
+
+        if (!class_exists($class)) {
+            throw new \RuntimeException(sprintf('The node class "%s" does not exist.', $class));
+        }
+
+        return $class;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/NodeDefinition.php
@@ -0,0 +1,343 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+use Symfony\Component\Config\Definition\NodeInterface;
+use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException;
+
+/**
+ * This class provides a fluent interface for defining a node.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+abstract class NodeDefinition implements NodeParentInterface
+{
+    protected $name;
+    protected $normalization;
+    protected $validation;
+    protected $defaultValue;
+    protected $default = false;
+    protected $required = false;
+    protected $merge;
+    protected $allowEmptyValue = true;
+    protected $nullEquivalent;
+    protected $trueEquivalent = true;
+    protected $falseEquivalent = false;
+
+    /**
+     * @var NodeParentInterface|null
+     */
+    protected $parent;
+    protected $attributes = array();
+
+    /**
+     * Constructor.
+     *
+     * @param string                   $name   The name of the node
+     * @param NodeParentInterface|null $parent The parent
+     */
+    public function __construct($name, NodeParentInterface $parent = null)
+    {
+        $this->parent = $parent;
+        $this->name = $name;
+    }
+
+    /**
+     * Sets the parent node.
+     *
+     * @param NodeParentInterface $parent The parent
+     *
+     * @return NodeDefinition|$this
+     */
+    public function setParent(NodeParentInterface $parent)
+    {
+        $this->parent = $parent;
+
+        return $this;
+    }
+
+    /**
+     * Sets info message.
+     *
+     * @param string $info The info text
+     *
+     * @return NodeDefinition|$this
+     */
+    public function info($info)
+    {
+        return $this->attribute('info', $info);
+    }
+
+    /**
+     * Sets example configuration.
+     *
+     * @param string|array $example
+     *
+     * @return NodeDefinition|$this
+     */
+    public function example($example)
+    {
+        return $this->attribute('example', $example);
+    }
+
+    /**
+     * Sets an attribute on the node.
+     *
+     * @param string $key
+     * @param mixed  $value
+     *
+     * @return NodeDefinition|$this
+     */
+    public function attribute($key, $value)
+    {
+        $this->attributes[$key] = $value;
+
+        return $this;
+    }
+
+    /**
+     * Returns the parent node.
+     *
+     * @return NodeParentInterface|NodeBuilder|NodeDefinition|null The builder of the parent node
+     */
+    public function end()
+    {
+        return $this->parent;
+    }
+
+    /**
+     * Creates the node.
+     *
+     * @param bool $forceRootNode Whether to force this node as the root node
+     *
+     * @return NodeInterface
+     */
+    public function getNode($forceRootNode = false)
+    {
+        if ($forceRootNode) {
+            $this->parent = null;
+        }
+
+        if (null !== $this->normalization) {
+            $this->normalization->before = ExprBuilder::buildExpressions($this->normalization->before);
+        }
+
+        if (null !== $this->validation) {
+            $this->validation->rules = ExprBuilder::buildExpressions($this->validation->rules);
+        }
+
+        $node = $this->createNode();
+        $node->setAttributes($this->attributes);
+
+        return $node;
+    }
+
+    /**
+     * Sets the default value.
+     *
+     * @param mixed $value The default value
+     *
+     * @return NodeDefinition|$this
+     */
+    public function defaultValue($value)
+    {
+        $this->default = true;
+        $this->defaultValue = $value;
+
+        return $this;
+    }
+
+    /**
+     * Sets the node as required.
+     *
+     * @return NodeDefinition|$this
+     */
+    public function isRequired()
+    {
+        $this->required = true;
+
+        return $this;
+    }
+
+    /**
+     * Sets the equivalent value used when the node contains null.
+     *
+     * @param mixed $value
+     *
+     * @return NodeDefinition|$this
+     */
+    public function treatNullLike($value)
+    {
+        $this->nullEquivalent = $value;
+
+        return $this;
+    }
+
+    /**
+     * Sets the equivalent value used when the node contains true.
+     *
+     * @param mixed $value
+     *
+     * @return NodeDefinition|$this
+     */
+    public function treatTrueLike($value)
+    {
+        $this->trueEquivalent = $value;
+
+        return $this;
+    }
+
+    /**
+     * Sets the equivalent value used when the node contains false.
+     *
+     * @param mixed $value
+     *
+     * @return NodeDefinition|$this
+     */
+    public function treatFalseLike($value)
+    {
+        $this->falseEquivalent = $value;
+
+        return $this;
+    }
+
+    /**
+     * Sets null as the default value.
+     *
+     * @return NodeDefinition|$this
+     */
+    public function defaultNull()
+    {
+        return $this->defaultValue(null);
+    }
+
+    /**
+     * Sets true as the default value.
+     *
+     * @return NodeDefinition|$this
+     */
+    public function defaultTrue()
+    {
+        return $this->defaultValue(true);
+    }
+
+    /**
+     * Sets false as the default value.
+     *
+     * @return NodeDefinition|$this
+     */
+    public function defaultFalse()
+    {
+        return $this->defaultValue(false);
+    }
+
+    /**
+     * Sets an expression to run before the normalization.
+     *
+     * @return ExprBuilder
+     */
+    public function beforeNormalization()
+    {
+        return $this->normalization()->before();
+    }
+
+    /**
+     * Denies the node value being empty.
+     *
+     * @return NodeDefinition|$this
+     */
+    public function cannotBeEmpty()
+    {
+        $this->allowEmptyValue = false;
+
+        return $this;
+    }
+
+    /**
+     * Sets an expression to run for the validation.
+     *
+     * The expression receives the value of the node and must return it. It can
+     * modify it.
+     * An exception should be thrown when the node is not valid.
+     *
+     * @return ExprBuilder
+     */
+    public function validate()
+    {
+        return $this->validation()->rule();
+    }
+
+    /**
+     * Sets whether the node can be overwritten.
+     *
+     * @param bool $deny Whether the overwriting is forbidden or not
+     *
+     * @return NodeDefinition|$this
+     */
+    public function cannotBeOverwritten($deny = true)
+    {
+        $this->merge()->denyOverwrite($deny);
+
+        return $this;
+    }
+
+    /**
+     * Gets the builder for validation rules.
+     *
+     * @return ValidationBuilder
+     */
+    protected function validation()
+    {
+        if (null === $this->validation) {
+            $this->validation = new ValidationBuilder($this);
+        }
+
+        return $this->validation;
+    }
+
+    /**
+     * Gets the builder for merging rules.
+     *
+     * @return MergeBuilder
+     */
+    protected function merge()
+    {
+        if (null === $this->merge) {
+            $this->merge = new MergeBuilder($this);
+        }
+
+        return $this->merge;
+    }
+
+    /**
+     * Gets the builder for normalization rules.
+     *
+     * @return NormalizationBuilder
+     */
+    protected function normalization()
+    {
+        if (null === $this->normalization) {
+            $this->normalization = new NormalizationBuilder($this);
+        }
+
+        return $this->normalization;
+    }
+
+    /**
+     * Instantiate and configure the node according to this definition.
+     *
+     * @return NodeInterface $node The node instance
+     *
+     * @throws InvalidDefinitionException When the definition is invalid
+     */
+    abstract protected function createNode();
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/NodeParentInterface.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+/**
+ * An interface that must be implemented by all node parents.
+ *
+ * @author Victor Berchet <victor@suumit.com>
+ */
+interface NodeParentInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/NormalizationBuilder.php
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+/**
+ * This class builds normalization conditions.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class NormalizationBuilder
+{
+    protected $node;
+    public $before = array();
+    public $remappings = array();
+
+    /**
+     * Constructor.
+     *
+     * @param NodeDefinition $node The related node
+     */
+    public function __construct(NodeDefinition $node)
+    {
+        $this->node = $node;
+    }
+
+    /**
+     * Registers a key to remap to its plural form.
+     *
+     * @param string $key    The key to remap
+     * @param string $plural The plural of the key in case of irregular plural
+     *
+     * @return NormalizationBuilder
+     */
+    public function remap($key, $plural = null)
+    {
+        $this->remappings[] = array($key, null === $plural ? $key.'s' : $plural);
+
+        return $this;
+    }
+
+    /**
+     * Registers a closure to run before the normalization or an expression builder to build it if null is provided.
+     *
+     * @param \Closure $closure
+     *
+     * @return ExprBuilder|NormalizationBuilder
+     */
+    public function before(\Closure $closure = null)
+    {
+        if (null !== $closure) {
+            $this->before[] = $closure;
+
+            return $this;
+        }
+
+        return $this->before[] = new ExprBuilder($this->node);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/NumericNodeDefinition.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+/**
+ * Abstract class that contains common code of integer and float node definitions.
+ *
+ * @author David Jeanmonod <david.jeanmonod@gmail.com>
+ */
+abstract class NumericNodeDefinition extends ScalarNodeDefinition
+{
+    protected $min;
+    protected $max;
+
+    /**
+     * Ensures that the value is smaller than the given reference.
+     *
+     * @param mixed $max
+     *
+     * @return NumericNodeDefinition
+     *
+     * @throws \InvalidArgumentException when the constraint is inconsistent
+     */
+    public function max($max)
+    {
+        if (isset($this->min) && $this->min > $max) {
+            throw new \InvalidArgumentException(sprintf('You cannot define a max(%s) as you already have a min(%s)', $max, $this->min));
+        }
+        $this->max = $max;
+
+        return $this;
+    }
+
+    /**
+     * Ensures that the value is bigger than the given reference.
+     *
+     * @param mixed $min
+     *
+     * @return NumericNodeDefinition
+     *
+     * @throws \InvalidArgumentException when the constraint is inconsistent
+     */
+    public function min($min)
+    {
+        if (isset($this->max) && $this->max < $min) {
+            throw new \InvalidArgumentException(sprintf('You cannot define a min(%s) as you already have a max(%s)', $min, $this->max));
+        }
+        $this->min = $min;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @deprecated Deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function cannotBeEmpty()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        return parent::cannotBeEmpty();
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+/**
+ * An interface that must be implemented by nodes which can have children.
+ *
+ * @author Victor Berchet <victor@suumit.com>
+ */
+interface ParentNodeDefinitionInterface
+{
+    public function children();
+
+    public function append(NodeDefinition $node);
+
+    public function setBuilder(NodeBuilder $builder);
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/ScalarNodeDefinition.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+use Symfony\Component\Config\Definition\ScalarNode;
+
+/**
+ * This class provides a fluent interface for defining a node.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ScalarNodeDefinition extends VariableNodeDefinition
+{
+    /**
+     * Instantiate a Node.
+     *
+     * @return ScalarNode The node
+     */
+    protected function instantiateNode()
+    {
+        return new ScalarNode($this->name, $this->parent);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/TreeBuilder.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+use Symfony\Component\Config\Definition\NodeInterface;
+
+/**
+ * This is the entry class for building a config tree.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class TreeBuilder implements NodeParentInterface
+{
+    protected $tree;
+    protected $root;
+    protected $builder;
+
+    /**
+     * Creates the root node.
+     *
+     * @param string      $name    The name of the root node
+     * @param string      $type    The type of the root node
+     * @param NodeBuilder $builder A custom node builder instance
+     *
+     * @return ArrayNodeDefinition|NodeDefinition The root node (as an ArrayNodeDefinition when the type is 'array')
+     *
+     * @throws \RuntimeException When the node type is not supported
+     */
+    public function root($name, $type = 'array', NodeBuilder $builder = null)
+    {
+        $builder = $builder ?: new NodeBuilder();
+
+        return $this->root = $builder->node($name, $type)->setParent($this);
+    }
+
+    /**
+     * Builds the tree.
+     *
+     * @return NodeInterface
+     *
+     * @throws \RuntimeException
+     */
+    public function buildTree()
+    {
+        if (null === $this->root) {
+            throw new \RuntimeException('The configuration tree has no root node.');
+        }
+        if (null !== $this->tree) {
+            return $this->tree;
+        }
+
+        return $this->tree = $this->root->getNode(true);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/ValidationBuilder.php
@@ -0,0 +1,51 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+/**
+ * This class builds validation conditions.
+ *
+ * @author Christophe Coevoet <stof@notk.org>
+ */
+class ValidationBuilder
+{
+    protected $node;
+    public $rules = array();
+
+    /**
+     * Constructor.
+     *
+     * @param NodeDefinition $node The related node
+     */
+    public function __construct(NodeDefinition $node)
+    {
+        $this->node = $node;
+    }
+
+    /**
+     * Registers a closure to run as normalization or an expression builder to build it if null is provided.
+     *
+     * @param \Closure $closure
+     *
+     * @return ExprBuilder|ValidationBuilder
+     */
+    public function rule(\Closure $closure = null)
+    {
+        if (null !== $closure) {
+            $this->rules[] = $closure;
+
+            return $this;
+        }
+
+        return $this->rules[] = new ExprBuilder($this->node);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Builder/VariableNodeDefinition.php
@@ -0,0 +1,64 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Builder;
+
+use Symfony\Component\Config\Definition\VariableNode;
+
+/**
+ * This class provides a fluent interface for defining a node.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class VariableNodeDefinition extends NodeDefinition
+{
+    /**
+     * Instantiate a Node.
+     *
+     * @return VariableNode The node
+     */
+    protected function instantiateNode()
+    {
+        return new VariableNode($this->name, $this->parent);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function createNode()
+    {
+        $node = $this->instantiateNode();
+
+        if (null !== $this->normalization) {
+            $node->setNormalizationClosures($this->normalization->before);
+        }
+
+        if (null !== $this->merge) {
+            $node->setAllowOverwrite($this->merge->allowOverwrite);
+        }
+
+        if (true === $this->default) {
+            $node->setDefaultValue($this->defaultValue);
+        }
+
+        $node->setAllowEmptyValue($this->allowEmptyValue);
+        $node->addEquivalentValue(null, $this->nullEquivalent);
+        $node->addEquivalentValue(true, $this->trueEquivalent);
+        $node->addEquivalentValue(false, $this->falseEquivalent);
+        $node->setRequired($this->required);
+
+        if (null !== $this->validation) {
+            $node->setFinalValidationClosures($this->validation->rules);
+        }
+
+        return $node;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/ConfigurationInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition;
+
+/**
+ * Configuration interface.
+ *
+ * @author Victor Berchet <victor@suumit.com>
+ */
+interface ConfigurationInterface
+{
+    /**
+     * Generates the configuration tree builder.
+     *
+     * @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
+     */
+    public function getConfigTreeBuilder();
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Dumper/XmlReferenceDumper.php
@@ -0,0 +1,304 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Dumper;
+
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+use Symfony\Component\Config\Definition\NodeInterface;
+use Symfony\Component\Config\Definition\ArrayNode;
+use Symfony\Component\Config\Definition\EnumNode;
+use Symfony\Component\Config\Definition\PrototypedArrayNode;
+
+/**
+ * Dumps a XML reference configuration for the given configuration/node instance.
+ *
+ * @author Wouter J <waldio.webdesign@gmail.com>
+ */
+class XmlReferenceDumper
+{
+    private $reference;
+
+    public function dump(ConfigurationInterface $configuration, $namespace = null)
+    {
+        return $this->dumpNode($configuration->getConfigTreeBuilder()->buildTree(), $namespace);
+    }
+
+    public function dumpNode(NodeInterface $node, $namespace = null)
+    {
+        $this->reference = '';
+        $this->writeNode($node, 0, true, $namespace);
+        $ref = $this->reference;
+        $this->reference = null;
+
+        return $ref;
+    }
+
+    /**
+     * @param NodeInterface $node
+     * @param int           $depth
+     * @param bool          $root      If the node is the root node
+     * @param string        $namespace The namespace of the node
+     */
+    private function writeNode(NodeInterface $node, $depth = 0, $root = false, $namespace = null)
+    {
+        $rootName = ($root ? 'config' : $node->getName());
+        $rootNamespace = ($namespace ?: ($root ? 'http://example.org/schema/dic/'.$node->getName() : null));
+
+        // xml remapping
+        if ($node->getParent()) {
+            $remapping = array_filter($node->getParent()->getXmlRemappings(), function ($mapping) use ($rootName) {
+                return $rootName === $mapping[1];
+            });
+
+            if (count($remapping)) {
+                list($singular) = current($remapping);
+                $rootName = $singular;
+            }
+        }
+        $rootName = str_replace('_', '-', $rootName);
+
+        $rootAttributes = array();
+        $rootAttributeComments = array();
+        $rootChildren = array();
+        $rootComments = array();
+
+        if ($node instanceof ArrayNode) {
+            $children = $node->getChildren();
+
+            // comments about the root node
+            if ($rootInfo = $node->getInfo()) {
+                $rootComments[] = $rootInfo;
+            }
+
+            if ($rootNamespace) {
+                $rootComments[] = 'Namespace: '.$rootNamespace;
+            }
+
+            // render prototyped nodes
+            if ($node instanceof PrototypedArrayNode) {
+                $prototype = $node->getPrototype();
+
+                $info = 'prototype';
+                if (null !== $prototype->getInfo()) {
+                    $info .= ': '.$prototype->getInfo();
+                }
+                array_unshift($rootComments, $info);
+
+                if ($key = $node->getKeyAttribute()) {
+                    $rootAttributes[$key] = str_replace('-', ' ', $rootName).' '.$key;
+                }
+
+                if ($prototype instanceof ArrayNode) {
+                    $children = $prototype->getChildren();
+                } else {
+                    if ($prototype->hasDefaultValue()) {
+                        $prototypeValue = $prototype->getDefaultValue();
+                    } else {
+                        switch (get_class($prototype)) {
+                            case 'Symfony\Component\Config\Definition\ScalarNode':
+                                $prototypeValue = 'scalar value';
+                                break;
+
+                            case 'Symfony\Component\Config\Definition\FloatNode':
+                            case 'Symfony\Component\Config\Definition\IntegerNode':
+                                $prototypeValue = 'numeric value';
+                                break;
+
+                            case 'Symfony\Component\Config\Definition\BooleanNode':
+                                $prototypeValue = 'true|false';
+                                break;
+
+                            case 'Symfony\Component\Config\Definition\EnumNode':
+                                $prototypeValue = implode('|', array_map('json_encode', $prototype->getValues()));
+                                break;
+
+                            default:
+                                $prototypeValue = 'value';
+                        }
+                    }
+                }
+            }
+
+            // get attributes and elements
+            foreach ($children as $child) {
+                if (!$child instanceof ArrayNode) {
+                    // get attributes
+
+                    // metadata
+                    $name = str_replace('_', '-', $child->getName());
+                    $value = '%%%%not_defined%%%%'; // use a string which isn't used in the normal world
+
+                    // comments
+                    $comments = array();
+                    if ($info = $child->getInfo()) {
+                        $comments[] = $info;
+                    }
+
+                    if ($example = $child->getExample()) {
+                        $comments[] = 'Example: '.$example;
+                    }
+
+                    if ($child->isRequired()) {
+                        $comments[] = 'Required';
+                    }
+
+                    if ($child instanceof EnumNode) {
+                        $comments[] = 'One of '.implode('; ', array_map('json_encode', $child->getValues()));
+                    }
+
+                    if (count($comments)) {
+                        $rootAttributeComments[$name] = implode(";\n", $comments);
+                    }
+
+                    // default values
+                    if ($child->hasDefaultValue()) {
+                        $value = $child->getDefaultValue();
+                    }
+
+                    // append attribute
+                    $rootAttributes[$name] = $value;
+                } else {
+                    // get elements
+                    $rootChildren[] = $child;
+                }
+            }
+        }
+
+        // render comments
+
+        // root node comment
+        if (count($rootComments)) {
+            foreach ($rootComments as $comment) {
+                $this->writeLine('<!-- '.$comment.' -->', $depth);
+            }
+        }
+
+        // attribute comments
+        if (count($rootAttributeComments)) {
+            foreach ($rootAttributeComments as $attrName => $comment) {
+                $commentDepth = $depth + 4 + strlen($attrName) + 2;
+                $commentLines = explode("\n", $comment);
+                $multiline = (count($commentLines) > 1);
+                $comment = implode(PHP_EOL.str_repeat(' ', $commentDepth), $commentLines);
+
+                if ($multiline) {
+                    $this->writeLine('<!--', $depth);
+                    $this->writeLine($attrName.': '.$comment, $depth + 4);
+                    $this->writeLine('-->', $depth);
+                } else {
+                    $this->writeLine('<!-- '.$attrName.': '.$comment.' -->', $depth);
+                }
+            }
+        }
+
+        // render start tag + attributes
+        $rootIsVariablePrototype = isset($prototypeValue);
+        $rootIsEmptyTag = (0 === count($rootChildren) && !$rootIsVariablePrototype);
+        $rootOpenTag = '<'.$rootName;
+        if (1 >= ($attributesCount = count($rootAttributes))) {
+            if (1 === $attributesCount) {
+                $rootOpenTag .= sprintf(' %s="%s"', current(array_keys($rootAttributes)), $this->writeValue(current($rootAttributes)));
+            }
+
+            $rootOpenTag .= $rootIsEmptyTag ? ' />' : '>';
+
+            if ($rootIsVariablePrototype) {
+                $rootOpenTag .= $prototypeValue.'</'.$rootName.'>';
+            }
+
+            $this->writeLine($rootOpenTag, $depth);
+        } else {
+            $this->writeLine($rootOpenTag, $depth);
+
+            $i = 1;
+
+            foreach ($rootAttributes as $attrName => $attrValue) {
+                $attr = sprintf('%s="%s"', $attrName, $this->writeValue($attrValue));
+
+                $this->writeLine($attr, $depth + 4);
+
+                if ($attributesCount === $i++) {
+                    $this->writeLine($rootIsEmptyTag ? '/>' : '>', $depth);
+
+                    if ($rootIsVariablePrototype) {
+                        $rootOpenTag .= $prototypeValue.'</'.$rootName.'>';
+                    }
+                }
+            }
+        }
+
+        // render children tags
+        foreach ($rootChildren as $child) {
+            $this->writeLine('');
+            $this->writeNode($child, $depth + 4);
+        }
+
+        // render end tag
+        if (!$rootIsEmptyTag && !$rootIsVariablePrototype) {
+            $this->writeLine('');
+
+            $rootEndTag = '</'.$rootName.'>';
+            $this->writeLine($rootEndTag, $depth);
+        }
+    }
+
+    /**
+     * Outputs a single config reference line.
+     *
+     * @param string $text
+     * @param int    $indent
+     */
+    private function writeLine($text, $indent = 0)
+    {
+        $indent = strlen($text) + $indent;
+        $format = '%'.$indent.'s';
+
+        $this->reference .= sprintf($format, $text).PHP_EOL;
+    }
+
+    /**
+     * Renders the string conversion of the value.
+     *
+     * @param mixed $value
+     *
+     * @return string
+     */
+    private function writeValue($value)
+    {
+        if ('%%%%not_defined%%%%' === $value) {
+            return '';
+        }
+
+        if (is_string($value) || is_numeric($value)) {
+            return $value;
+        }
+
+        if (false === $value) {
+            return 'false';
+        }
+
+        if (true === $value) {
+            return 'true';
+        }
+
+        if (null === $value) {
+            return 'null';
+        }
+
+        if (empty($value)) {
+            return '';
+        }
+
+        if (is_array($value)) {
+            return implode(',', $value);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Dumper/YamlReferenceDumper.php
@@ -0,0 +1,203 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Dumper;
+
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+use Symfony\Component\Config\Definition\NodeInterface;
+use Symfony\Component\Config\Definition\ArrayNode;
+use Symfony\Component\Config\Definition\EnumNode;
+use Symfony\Component\Config\Definition\PrototypedArrayNode;
+use Symfony\Component\Yaml\Inline;
+
+/**
+ * Dumps a Yaml reference configuration for the given configuration/node instance.
+ *
+ * @author Kevin Bond <kevinbond@gmail.com>
+ */
+class YamlReferenceDumper
+{
+    private $reference;
+
+    public function dump(ConfigurationInterface $configuration)
+    {
+        return $this->dumpNode($configuration->getConfigTreeBuilder()->buildTree());
+    }
+
+    public function dumpNode(NodeInterface $node)
+    {
+        $this->reference = '';
+        $this->writeNode($node);
+        $ref = $this->reference;
+        $this->reference = null;
+
+        return $ref;
+    }
+
+    /**
+     * @param NodeInterface $node
+     * @param int           $depth
+     */
+    private function writeNode(NodeInterface $node, $depth = 0)
+    {
+        $comments = array();
+        $default = '';
+        $defaultArray = null;
+        $children = null;
+        $example = $node->getExample();
+
+        // defaults
+        if ($node instanceof ArrayNode) {
+            $children = $node->getChildren();
+
+            if ($node instanceof PrototypedArrayNode) {
+                $prototype = $node->getPrototype();
+
+                if ($prototype instanceof ArrayNode) {
+                    $children = $prototype->getChildren();
+                }
+
+                // check for attribute as key
+                if ($key = $node->getKeyAttribute()) {
+                    $keyNodeClass = 'Symfony\Component\Config\Definition\\'.($prototype instanceof ArrayNode ? 'ArrayNode' : 'ScalarNode');
+                    $keyNode = new $keyNodeClass($key, $node);
+
+                    $info = 'Prototype';
+                    if (null !== $prototype->getInfo()) {
+                        $info .= ': '.$prototype->getInfo();
+                    }
+                    $keyNode->setInfo($info);
+
+                    // add children
+                    foreach ($children as $childNode) {
+                        $keyNode->addChild($childNode);
+                    }
+                    $children = array($key => $keyNode);
+                }
+            }
+
+            if (!$children) {
+                if ($node->hasDefaultValue() && count($defaultArray = $node->getDefaultValue())) {
+                    $default = '';
+                } elseif (!is_array($example)) {
+                    $default = '[]';
+                }
+            }
+        } elseif ($node instanceof EnumNode) {
+            $comments[] = 'One of '.implode('; ', array_map('json_encode', $node->getValues()));
+            $default = $node->hasDefaultValue() ? Inline::dump($node->getDefaultValue()) : '~';
+        } else {
+            $default = '~';
+
+            if ($node->hasDefaultValue()) {
+                $default = $node->getDefaultValue();
+
+                if (is_array($default)) {
+                    if (count($defaultArray = $node->getDefaultValue())) {
+                        $default = '';
+                    } elseif (!is_array($example)) {
+                        $default = '[]';
+                    }
+                } else {
+                    $default = Inline::dump($default);
+                }
+            }
+        }
+
+        // required?
+        if ($node->isRequired()) {
+            $comments[] = 'Required';
+        }
+
+        // example
+        if ($example && !is_array($example)) {
+            $comments[] = 'Example: '.$example;
+        }
+
+        $default = (string) $default != '' ? ' '.$default : '';
+        $comments = count($comments) ? '# '.implode(', ', $comments) : '';
+
+        $text = rtrim(sprintf('%-20s %s %s', $node->getName().':', $default, $comments), ' ');
+
+        if ($info = $node->getInfo()) {
+            $this->writeLine('');
+            // indenting multi-line info
+            $info = str_replace("\n", sprintf("\n%".($depth * 4).'s# ', ' '), $info);
+            $this->writeLine('# '.$info, $depth * 4);
+        }
+
+        $this->writeLine($text, $depth * 4);
+
+        // output defaults
+        if ($defaultArray) {
+            $this->writeLine('');
+
+            $message = count($defaultArray) > 1 ? 'Defaults' : 'Default';
+
+            $this->writeLine('# '.$message.':', $depth * 4 + 4);
+
+            $this->writeArray($defaultArray, $depth + 1);
+        }
+
+        if (is_array($example)) {
+            $this->writeLine('');
+
+            $message = count($example) > 1 ? 'Examples' : 'Example';
+
+            $this->writeLine('# '.$message.':', $depth * 4 + 4);
+
+            $this->writeArray($example, $depth + 1);
+        }
+
+        if ($children) {
+            foreach ($children as $childNode) {
+                $this->writeNode($childNode, $depth + 1);
+            }
+        }
+    }
+
+    /**
+     * Outputs a single config reference line.
+     *
+     * @param string $text
+     * @param int    $indent
+     */
+    private function writeLine($text, $indent = 0)
+    {
+        $indent = strlen($text) + $indent;
+        $format = '%'.$indent.'s';
+
+        $this->reference .= sprintf($format, $text)."\n";
+    }
+
+    private function writeArray(array $array, $depth)
+    {
+        $isIndexed = array_values($array) === $array;
+
+        foreach ($array as $key => $value) {
+            if (is_array($value)) {
+                $val = '';
+            } else {
+                $val = $value;
+            }
+
+            if ($isIndexed) {
+                $this->writeLine('- '.$val, $depth * 4);
+            } else {
+                $this->writeLine(sprintf('%-20s %s', $key.':', $val), $depth * 4);
+            }
+
+            if (is_array($value)) {
+                $this->writeArray($value, $depth + 1);
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/EnumNode.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition;
+
+use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
+
+/**
+ * Node which only allows a finite set of values.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class EnumNode extends ScalarNode
+{
+    private $values;
+
+    public function __construct($name, NodeInterface $parent = null, array $values = array())
+    {
+        $values = array_unique($values);
+        if (empty($values)) {
+            throw new \InvalidArgumentException('$values must contain at least one element.');
+        }
+
+        parent::__construct($name, $parent);
+        $this->values = $values;
+    }
+
+    public function getValues()
+    {
+        return $this->values;
+    }
+
+    protected function finalizeValue($value)
+    {
+        $value = parent::finalizeValue($value);
+
+        if (!in_array($value, $this->values, true)) {
+            $ex = new InvalidConfigurationException(sprintf(
+                'The value %s is not allowed for path "%s". Permissible values: %s',
+                json_encode($value),
+                $this->getPath(),
+                implode(', ', array_map('json_encode', $this->values))));
+            $ex->setPath($this->getPath());
+
+            throw $ex;
+        }
+
+        return $value;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Exception/DuplicateKeyException.php
@@ -0,0 +1,22 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Exception;
+
+/**
+ * This exception is thrown whenever the key of an array is not unique. This can
+ * only be the case if the configuration is coming from an XML file.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class DuplicateKeyException extends InvalidConfigurationException
+{
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Exception/Exception.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Exception;
+
+/**
+ * Base exception for all configuration exceptions.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class Exception extends \RuntimeException
+{
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Exception/ForbiddenOverwriteException.php
@@ -0,0 +1,22 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Exception;
+
+/**
+ * This exception is thrown when a configuration path is overwritten from a
+ * subsequent configuration file, but the entry node specifically forbids this.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ForbiddenOverwriteException extends InvalidConfigurationException
+{
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Exception/InvalidConfigurationException.php
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Exception;
+
+/**
+ * A very general exception which can be thrown whenever non of the more specific
+ * exceptions is suitable.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class InvalidConfigurationException extends Exception
+{
+    private $path;
+    private $containsHints = false;
+
+    public function setPath($path)
+    {
+        $this->path = $path;
+    }
+
+    public function getPath()
+    {
+        return $this->path;
+    }
+
+    /**
+     * Adds extra information that is suffixed to the original exception message.
+     *
+     * @param string $hint
+     */
+    public function addHint($hint)
+    {
+        if (!$this->containsHints) {
+            $this->message .= "\nHint: ".$hint;
+            $this->containsHints = true;
+        } else {
+            $this->message .= ', '.$hint;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Exception/InvalidDefinitionException.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Exception;
+
+/**
+ * Thrown when an error is detected in a node Definition.
+ *
+ * @author Victor Berchet <victor.berchet@suumit.com>
+ */
+class InvalidDefinitionException extends Exception
+{
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Exception/InvalidTypeException.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Exception;
+
+/**
+ * This exception is thrown if an invalid type is encountered.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class InvalidTypeException extends InvalidConfigurationException
+{
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Exception/UnsetKeyException.php
@@ -0,0 +1,22 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition\Exception;
+
+/**
+ * This exception is usually not encountered by the end-user, but only used
+ * internally to signal the parent scope to unset a key.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class UnsetKeyException extends Exception
+{
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/FloatNode.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition;
+
+use Symfony\Component\Config\Definition\Exception\InvalidTypeException;
+
+/**
+ * This node represents a float value in the config tree.
+ *
+ * @author Jeanmonod David <david.jeanmonod@gmail.com>
+ */
+class FloatNode extends NumericNode
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function validateType($value)
+    {
+        // Integers are also accepted, we just cast them
+        if (is_int($value)) {
+            $value = (float) $value;
+        }
+
+        if (!is_float($value)) {
+            $ex = new InvalidTypeException(sprintf('Invalid type for path "%s". Expected float, but got %s.', $this->getPath(), gettype($value)));
+            if ($hint = $this->getInfo()) {
+                $ex->addHint($hint);
+            }
+            $ex->setPath($this->getPath());
+
+            throw $ex;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/IntegerNode.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition;
+
+use Symfony\Component\Config\Definition\Exception\InvalidTypeException;
+
+/**
+ * This node represents an integer value in the config tree.
+ *
+ * @author Jeanmonod David <david.jeanmonod@gmail.com>
+ */
+class IntegerNode extends NumericNode
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function validateType($value)
+    {
+        if (!is_int($value)) {
+            $ex = new InvalidTypeException(sprintf('Invalid type for path "%s". Expected int, but got %s.', $this->getPath(), gettype($value)));
+            if ($hint = $this->getInfo()) {
+                $ex->addHint($hint);
+            }
+            $ex->setPath($this->getPath());
+
+            throw $ex;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/NodeInterface.php
@@ -0,0 +1,88 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition;
+
+/**
+ * Common Interface among all nodes.
+ *
+ * In most cases, it is better to inherit from BaseNode instead of implementing
+ * this interface yourself.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+interface NodeInterface
+{
+    /**
+     * Returns the name of the node.
+     *
+     * @return string The name of the node
+     */
+    public function getName();
+
+    /**
+     * Returns the path of the node.
+     *
+     * @return string The node path
+     */
+    public function getPath();
+
+    /**
+     * Returns true when the node is required.
+     *
+     * @return bool If the node is required
+     */
+    public function isRequired();
+
+    /**
+     * Returns true when the node has a default value.
+     *
+     * @return bool If the node has a default value
+     */
+    public function hasDefaultValue();
+
+    /**
+     * Returns the default value of the node.
+     *
+     * @return mixed The default value
+     *
+     * @throws \RuntimeException if the node has no default value
+     */
+    public function getDefaultValue();
+
+    /**
+     * Normalizes the supplied value.
+     *
+     * @param mixed $value The value to normalize
+     *
+     * @return mixed The normalized value
+     */
+    public function normalize($value);
+
+    /**
+     * Merges two values together.
+     *
+     * @param mixed $leftSide
+     * @param mixed $rightSide
+     *
+     * @return mixed The merged values
+     */
+    public function merge($leftSide, $rightSide);
+
+    /**
+     * Finalizes a value.
+     *
+     * @param mixed $value The value to finalize
+     *
+     * @return mixed The finalized value
+     */
+    public function finalize($value);
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/NumericNode.php
@@ -0,0 +1,64 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition;
+
+use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
+
+/**
+ * This node represents a numeric value in the config tree.
+ *
+ * @author David Jeanmonod <david.jeanmonod@gmail.com>
+ */
+class NumericNode extends ScalarNode
+{
+    protected $min;
+    protected $max;
+
+    public function __construct($name, NodeInterface $parent = null, $min = null, $max = null)
+    {
+        parent::__construct($name, $parent);
+        $this->min = $min;
+        $this->max = $max;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function finalizeValue($value)
+    {
+        $value = parent::finalizeValue($value);
+
+        $errorMsg = null;
+        if (isset($this->min) && $value < $this->min) {
+            $errorMsg = sprintf('The value %s is too small for path "%s". Should be greater than or equal to %s', $value, $this->getPath(), $this->min);
+        }
+        if (isset($this->max) && $value > $this->max) {
+            $errorMsg = sprintf('The value %s is too big for path "%s". Should be less than or equal to %s', $value, $this->getPath(), $this->max);
+        }
+        if (isset($errorMsg)) {
+            $ex = new InvalidConfigurationException($errorMsg);
+            $ex->setPath($this->getPath());
+            throw $ex;
+        }
+
+        return $value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function isValueEmpty($value)
+    {
+        // a numeric value cannot be empty
+        return false;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/Processor.php
@@ -0,0 +1,97 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition;
+
+/**
+ * This class is the entry point for config normalization/merging/finalization.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class Processor
+{
+    /**
+     * Processes an array of configurations.
+     *
+     * @param NodeInterface $configTree The node tree describing the configuration
+     * @param array         $configs    An array of configuration items to process
+     *
+     * @return array The processed configuration
+     */
+    public function process(NodeInterface $configTree, array $configs)
+    {
+        $currentConfig = array();
+        foreach ($configs as $config) {
+            $config = $configTree->normalize($config);
+            $currentConfig = $configTree->merge($currentConfig, $config);
+        }
+
+        return $configTree->finalize($currentConfig);
+    }
+
+    /**
+     * Processes an array of configurations.
+     *
+     * @param ConfigurationInterface $configuration The configuration class
+     * @param array                  $configs       An array of configuration items to process
+     *
+     * @return array The processed configuration
+     */
+    public function processConfiguration(ConfigurationInterface $configuration, array $configs)
+    {
+        return $this->process($configuration->getConfigTreeBuilder()->buildTree(), $configs);
+    }
+
+    /**
+     * Normalizes a configuration entry.
+     *
+     * This method returns a normalize configuration array for a given key
+     * to remove the differences due to the original format (YAML and XML mainly).
+     *
+     * Here is an example.
+     *
+     * The configuration in XML:
+     *
+     * <twig:extension>twig.extension.foo</twig:extension>
+     * <twig:extension>twig.extension.bar</twig:extension>
+     *
+     * And the same configuration in YAML:
+     *
+     * extensions: ['twig.extension.foo', 'twig.extension.bar']
+     *
+     * @param array  $config A config array
+     * @param string $key    The key to normalize
+     * @param string $plural The plural form of the key if it is irregular
+     *
+     * @return array
+     */
+    public static function normalizeConfig($config, $key, $plural = null)
+    {
+        if (null === $plural) {
+            $plural = $key.'s';
+        }
+
+        if (isset($config[$plural])) {
+            return $config[$plural];
+        }
+
+        if (isset($config[$key])) {
+            if (is_string($config[$key]) || !is_int(key($config[$key]))) {
+                // only one
+                return  array($config[$key]);
+            }
+
+            return  $config[$key];
+        }
+
+        return array();
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/PrototypeNodeInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition;
+
+/**
+ * This interface must be implemented by nodes which can be used as prototypes.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+interface PrototypeNodeInterface extends NodeInterface
+{
+    /**
+     * Sets the name of the node.
+     *
+     * @param string $name The name of the node
+     */
+    public function setName($name);
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/PrototypedArrayNode.php
@@ -0,0 +1,331 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition;
+
+use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
+use Symfony\Component\Config\Definition\Exception\DuplicateKeyException;
+use Symfony\Component\Config\Definition\Exception\UnsetKeyException;
+use Symfony\Component\Config\Definition\Exception\Exception;
+
+/**
+ * Represents a prototyped Array node in the config tree.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class PrototypedArrayNode extends ArrayNode
+{
+    protected $prototype;
+    protected $keyAttribute;
+    protected $removeKeyAttribute = false;
+    protected $minNumberOfElements = 0;
+    protected $defaultValue = array();
+    protected $defaultChildren;
+
+    /**
+     * Sets the minimum number of elements that a prototype based node must
+     * contain. By default this is zero, meaning no elements.
+     *
+     * @param int $number
+     */
+    public function setMinNumberOfElements($number)
+    {
+        $this->minNumberOfElements = $number;
+    }
+
+    /**
+     * Sets the attribute which value is to be used as key.
+     *
+     * This is useful when you have an indexed array that should be an
+     * associative array. You can select an item from within the array
+     * to be the key of the particular item. For example, if "id" is the
+     * "key", then:
+     *
+     *     array(
+     *         array('id' => 'my_name', 'foo' => 'bar'),
+     *     );
+     *
+     *  becomes
+     *
+     *      array(
+     *          'my_name' => array('foo' => 'bar'),
+     *      );
+     *
+     * If you'd like "'id' => 'my_name'" to still be present in the resulting
+     * array, then you can set the second argument of this method to false.
+     *
+     * @param string $attribute The name of the attribute which value is to be used as a key
+     * @param bool   $remove    Whether or not to remove the key
+     */
+    public function setKeyAttribute($attribute, $remove = true)
+    {
+        $this->keyAttribute = $attribute;
+        $this->removeKeyAttribute = $remove;
+    }
+
+    /**
+     * Retrieves the name of the attribute which value should be used as key.
+     *
+     * @return string The name of the attribute
+     */
+    public function getKeyAttribute()
+    {
+        return $this->keyAttribute;
+    }
+
+    /**
+     * Sets the default value of this node.
+     *
+     * @param string $value
+     *
+     * @throws \InvalidArgumentException if the default value is not an array
+     */
+    public function setDefaultValue($value)
+    {
+        if (!is_array($value)) {
+            throw new \InvalidArgumentException($this->getPath().': the default value of an array node has to be an array.');
+        }
+
+        $this->defaultValue = $value;
+    }
+
+    /**
+     * Checks if the node has a default value.
+     *
+     * @return bool
+     */
+    public function hasDefaultValue()
+    {
+        return true;
+    }
+
+    /**
+     * Adds default children when none are set.
+     *
+     * @param int|string|array|null $children The number of children|The child name|The children names to be added
+     */
+    public function setAddChildrenIfNoneSet($children = array('defaults'))
+    {
+        if (null === $children) {
+            $this->defaultChildren = array('defaults');
+        } else {
+            $this->defaultChildren = is_int($children) && $children > 0 ? range(1, $children) : (array) $children;
+        }
+    }
+
+    /**
+     * Retrieves the default value.
+     *
+     * The default value could be either explicited or derived from the prototype
+     * default value.
+     *
+     * @return array The default value
+     */
+    public function getDefaultValue()
+    {
+        if (null !== $this->defaultChildren) {
+            $default = $this->prototype->hasDefaultValue() ? $this->prototype->getDefaultValue() : array();
+            $defaults = array();
+            foreach (array_values($this->defaultChildren) as $i => $name) {
+                $defaults[null === $this->keyAttribute ? $i : $name] = $default;
+            }
+
+            return $defaults;
+        }
+
+        return $this->defaultValue;
+    }
+
+    /**
+     * Sets the node prototype.
+     *
+     * @param PrototypeNodeInterface $node
+     */
+    public function setPrototype(PrototypeNodeInterface $node)
+    {
+        $this->prototype = $node;
+    }
+
+    /**
+     * Retrieves the prototype.
+     *
+     * @return PrototypeNodeInterface The prototype
+     */
+    public function getPrototype()
+    {
+        return $this->prototype;
+    }
+
+    /**
+     * Disable adding concrete children for prototyped nodes.
+     *
+     * @param NodeInterface $node The child node to add
+     *
+     * @throws Exception
+     */
+    public function addChild(NodeInterface $node)
+    {
+        throw new Exception('A prototyped array node can not have concrete children.');
+    }
+
+    /**
+     * Finalizes the value of this node.
+     *
+     * @param mixed $value
+     *
+     * @return mixed The finalized value
+     *
+     * @throws UnsetKeyException
+     * @throws InvalidConfigurationException if the node doesn't have enough children
+     */
+    protected function finalizeValue($value)
+    {
+        if (false === $value) {
+            $msg = sprintf('Unsetting key for path "%s", value: %s', $this->getPath(), json_encode($value));
+            throw new UnsetKeyException($msg);
+        }
+
+        foreach ($value as $k => $v) {
+            $this->prototype->setName($k);
+            try {
+                $value[$k] = $this->prototype->finalize($v);
+            } catch (UnsetKeyException $e) {
+                unset($value[$k]);
+            }
+        }
+
+        if (count($value) < $this->minNumberOfElements) {
+            $msg = sprintf('The path "%s" should have at least %d element(s) defined.', $this->getPath(), $this->minNumberOfElements);
+            $ex = new InvalidConfigurationException($msg);
+            $ex->setPath($this->getPath());
+
+            throw $ex;
+        }
+
+        return $value;
+    }
+
+    /**
+     * Normalizes the value.
+     *
+     * @param mixed $value The value to normalize
+     *
+     * @return mixed The normalized value
+     *
+     * @throws InvalidConfigurationException
+     * @throws DuplicateKeyException
+     */
+    protected function normalizeValue($value)
+    {
+        if (false === $value) {
+            return $value;
+        }
+
+        $value = $this->remapXml($value);
+
+        $isAssoc = array_keys($value) !== range(0, count($value) - 1);
+        $normalized = array();
+        foreach ($value as $k => $v) {
+            if (null !== $this->keyAttribute && is_array($v)) {
+                if (!isset($v[$this->keyAttribute]) && is_int($k) && !$isAssoc) {
+                    $msg = sprintf('The attribute "%s" must be set for path "%s".', $this->keyAttribute, $this->getPath());
+                    $ex = new InvalidConfigurationException($msg);
+                    $ex->setPath($this->getPath());
+
+                    throw $ex;
+                } elseif (isset($v[$this->keyAttribute])) {
+                    $k = $v[$this->keyAttribute];
+
+                    // remove the key attribute when required
+                    if ($this->removeKeyAttribute) {
+                        unset($v[$this->keyAttribute]);
+                    }
+
+                    // if only "value" is left
+                    if (1 == count($v) && isset($v['value'])) {
+                        $v = $v['value'];
+                    }
+                }
+
+                if (array_key_exists($k, $normalized)) {
+                    $msg = sprintf('Duplicate key "%s" for path "%s".', $k, $this->getPath());
+                    $ex = new DuplicateKeyException($msg);
+                    $ex->setPath($this->getPath());
+
+                    throw $ex;
+                }
+            }
+
+            $this->prototype->setName($k);
+            if (null !== $this->keyAttribute || $isAssoc) {
+                $normalized[$k] = $this->prototype->normalize($v);
+            } else {
+                $normalized[] = $this->prototype->normalize($v);
+            }
+        }
+
+        return $normalized;
+    }
+
+    /**
+     * Merges values together.
+     *
+     * @param mixed $leftSide  The left side to merge
+     * @param mixed $rightSide The right side to merge
+     *
+     * @return mixed The merged values
+     *
+     * @throws InvalidConfigurationException
+     * @throws \RuntimeException
+     */
+    protected function mergeValues($leftSide, $rightSide)
+    {
+        if (false === $rightSide) {
+            // if this is still false after the last config has been merged the
+            // finalization pass will take care of removing this key entirely
+            return false;
+        }
+
+        if (false === $leftSide || !$this->performDeepMerging) {
+            return $rightSide;
+        }
+
+        foreach ($rightSide as $k => $v) {
+            // prototype, and key is irrelevant, so simply append the element
+            if (null === $this->keyAttribute) {
+                $leftSide[] = $v;
+                continue;
+            }
+
+            // no conflict
+            if (!array_key_exists($k, $leftSide)) {
+                if (!$this->allowNewKeys) {
+                    $ex = new InvalidConfigurationException(sprintf(
+                        'You are not allowed to define new elements for path "%s". '.
+                        'Please define all elements for this path in one config file.',
+                        $this->getPath()
+                    ));
+                    $ex->setPath($this->getPath());
+
+                    throw $ex;
+                }
+
+                $leftSide[$k] = $v;
+                continue;
+            }
+
+            $this->prototype->setName($k);
+            $leftSide[$k] = $this->prototype->merge($leftSide[$k], $v);
+        }
+
+        return $leftSide;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/ReferenceDumper.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition;
+
+@trigger_error('The '.__NAMESPACE__.'\ReferenceDumper class is deprecated since version 2.4 and will be removed in 3.0. Use the Symfony\Component\Config\Definition\Dumper\YamlReferenceDumper class instead.', E_USER_DEPRECATED);
+
+use Symfony\Component\Config\Definition\Dumper\YamlReferenceDumper;
+
+/**
+ * @deprecated since version 2.4, to be removed in 3.0.
+ *             Use {@link \Symfony\Component\Config\Definition\Dumper\YamlReferenceDumper} instead.
+ */
+class ReferenceDumper extends YamlReferenceDumper
+{
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/ScalarNode.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition;
+
+use Symfony\Component\Config\Definition\Exception\InvalidTypeException;
+
+/**
+ * This node represents a scalar value in the config tree.
+ *
+ * The following values are considered scalars:
+ *   * booleans
+ *   * strings
+ *   * null
+ *   * integers
+ *   * floats
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ScalarNode extends VariableNode
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function validateType($value)
+    {
+        if (!is_scalar($value) && null !== $value) {
+            $ex = new InvalidTypeException(sprintf(
+                'Invalid type for path "%s". Expected scalar, but got %s.',
+                $this->getPath(),
+                gettype($value)
+            ));
+            if ($hint = $this->getInfo()) {
+                $ex->addHint($hint);
+            }
+            $ex->setPath($this->getPath());
+
+            throw $ex;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function isValueEmpty($value)
+    {
+        return null === $value || '' === $value;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Definition/VariableNode.php
@@ -0,0 +1,135 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Definition;
+
+use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
+
+/**
+ * This node represents a value of variable type in the config tree.
+ *
+ * This node is intended for values of arbitrary type.
+ * Any PHP type is accepted as a value.
+ *
+ * @author Jeremy Mikola <jmikola@gmail.com>
+ */
+class VariableNode extends BaseNode implements PrototypeNodeInterface
+{
+    protected $defaultValueSet = false;
+    protected $defaultValue;
+    protected $allowEmptyValue = true;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setDefaultValue($value)
+    {
+        $this->defaultValueSet = true;
+        $this->defaultValue = $value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasDefaultValue()
+    {
+        return $this->defaultValueSet;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDefaultValue()
+    {
+        $v = $this->defaultValue;
+
+        return $v instanceof \Closure ? $v() : $v;
+    }
+
+    /**
+     * Sets if this node is allowed to have an empty value.
+     *
+     * @param bool $boolean True if this entity will accept empty values
+     */
+    public function setAllowEmptyValue($boolean)
+    {
+        $this->allowEmptyValue = (bool) $boolean;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function validateType($value)
+    {
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function finalizeValue($value)
+    {
+        if (!$this->allowEmptyValue && $this->isValueEmpty($value)) {
+            $ex = new InvalidConfigurationException(sprintf(
+                'The path "%s" cannot contain an empty value, but got %s.',
+                $this->getPath(),
+                json_encode($value)
+            ));
+            if ($hint = $this->getInfo()) {
+                $ex->addHint($hint);
+            }
+            $ex->setPath($this->getPath());
+
+            throw $ex;
+        }
+
+        return $value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function normalizeValue($value)
+    {
+        return $value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function mergeValues($leftSide, $rightSide)
+    {
+        return $rightSide;
+    }
+
+    /**
+     * Evaluates if the given value is to be treated as empty.
+     *
+     * By default, PHP's empty() function is used to test for emptiness. This
+     * method may be overridden by subtypes to better match their understanding
+     * of empty data.
+     *
+     * @param mixed $value
+     *
+     * @return bool
+     */
+    protected function isValueEmpty($value)
+    {
+        return empty($value);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Exception/FileLoaderImportCircularReferenceException.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Exception;
+
+/**
+ * Exception class for when a circular reference is detected when importing resources.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class FileLoaderImportCircularReferenceException extends FileLoaderLoadException
+{
+    public function __construct(array $resources, $code = null, $previous = null)
+    {
+        $message = sprintf('Circular reference detected in "%s" ("%s" > "%s").', $this->varToString($resources[0]), implode('" > "', $resources), $resources[0]);
+
+        \Exception::__construct($message, $code, $previous);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Exception/FileLoaderLoadException.php
@@ -0,0 +1,101 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Exception;
+
+/**
+ * Exception class for when a resource cannot be loaded or imported.
+ *
+ * @author Ryan Weaver <ryan@thatsquality.com>
+ */
+class FileLoaderLoadException extends \Exception
+{
+    /**
+     * @param string     $resource       The resource that could not be imported
+     * @param string     $sourceResource The original resource importing the new resource
+     * @param int        $code           The error code
+     * @param \Exception $previous       A previous exception
+     */
+    public function __construct($resource, $sourceResource = null, $code = null, $previous = null)
+    {
+        $message = '';
+        if ($previous) {
+            // Include the previous exception, to help the user see what might be the underlying cause
+
+            // Trim the trailing period of the previous message. We only want 1 period remove so no rtrim...
+            if ('.' === substr($previous->getMessage(), -1)) {
+                $trimmedMessage = substr($previous->getMessage(), 0, -1);
+                $message .= sprintf('%s', $trimmedMessage).' in ';
+            } else {
+                $message .= sprintf('%s', $previous->getMessage()).' in ';
+            }
+            $message .= $resource.' ';
+
+            // show tweaked trace to complete the human readable sentence
+            if (null === $sourceResource) {
+                $message .= sprintf('(which is loaded in resource "%s")', $this->varToString($resource));
+            } else {
+                $message .= sprintf('(which is being imported from "%s")', $this->varToString($sourceResource));
+            }
+            $message .= '.';
+
+        // if there's no previous message, present it the default way
+        } elseif (null === $sourceResource) {
+            $message .= sprintf('Cannot load resource "%s".', $this->varToString($resource));
+        } else {
+            $message .= sprintf('Cannot import resource "%s" from "%s".', $this->varToString($resource), $this->varToString($sourceResource));
+        }
+
+        // Is the resource located inside a bundle?
+        if ('@' === $resource[0]) {
+            $parts = explode(DIRECTORY_SEPARATOR, $resource);
+            $bundle = substr($parts[0], 1);
+            $message .= sprintf(' Make sure the "%s" bundle is correctly registered and loaded in the application kernel class.', $bundle);
+            $message .= sprintf(' If the bundle is registered, make sure the bundle path "%s" is not empty.', $resource);
+        }
+
+        parent::__construct($message, $code, $previous);
+    }
+
+    protected function varToString($var)
+    {
+        if (is_object($var)) {
+            return sprintf('Object(%s)', get_class($var));
+        }
+
+        if (is_array($var)) {
+            $a = array();
+            foreach ($var as $k => $v) {
+                $a[] = sprintf('%s => %s', $k, $this->varToString($v));
+            }
+
+            return sprintf('Array(%s)', implode(', ', $a));
+        }
+
+        if (is_resource($var)) {
+            return sprintf('Resource(%s)', get_resource_type($var));
+        }
+
+        if (null === $var) {
+            return 'null';
+        }
+
+        if (false === $var) {
+            return 'false';
+        }
+
+        if (true === $var) {
+            return 'true';
+        }
+
+        return (string) $var;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/FileLocator.php
@@ -0,0 +1,96 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config;
+
+/**
+ * FileLocator uses an array of pre-defined paths to find files.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class FileLocator implements FileLocatorInterface
+{
+    protected $paths;
+
+    /**
+     * Constructor.
+     *
+     * @param string|array $paths A path or an array of paths where to look for resources
+     */
+    public function __construct($paths = array())
+    {
+        $this->paths = (array) $paths;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function locate($name, $currentPath = null, $first = true)
+    {
+        if ('' == $name) {
+            throw new \InvalidArgumentException('An empty file name is not valid to be located.');
+        }
+
+        if ($this->isAbsolutePath($name)) {
+            if (!file_exists($name)) {
+                throw new \InvalidArgumentException(sprintf('The file "%s" does not exist.', $name));
+            }
+
+            return $name;
+        }
+
+        $paths = $this->paths;
+
+        if (null !== $currentPath) {
+            array_unshift($paths, $currentPath);
+        }
+
+        $paths = array_unique($paths);
+        $filepaths = array();
+
+        foreach ($paths as $path) {
+            if (@file_exists($file = $path.DIRECTORY_SEPARATOR.$name)) {
+                if (true === $first) {
+                    return $file;
+                }
+                $filepaths[] = $file;
+            }
+        }
+
+        if (!$filepaths) {
+            throw new \InvalidArgumentException(sprintf('The file "%s" does not exist (in: %s).', $name, implode(', ', $paths)));
+        }
+
+        return $filepaths;
+    }
+
+    /**
+     * Returns whether the file path is an absolute path.
+     *
+     * @param string $file A file path
+     *
+     * @return bool
+     */
+    private function isAbsolutePath($file)
+    {
+        if ($file[0] === '/' || $file[0] === '\\'
+            || (strlen($file) > 3 && ctype_alpha($file[0])
+                && $file[1] === ':'
+                && ($file[2] === '\\' || $file[2] === '/')
+            )
+            || null !== parse_url($file, PHP_URL_SCHEME)
+        ) {
+            return true;
+        }
+
+        return false;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/FileLocatorInterface.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface FileLocatorInterface
+{
+    /**
+     * Returns a full path for a given file name.
+     *
+     * @param string      $name        The file name to locate
+     * @param string|null $currentPath The current path
+     * @param bool        $first       Whether to return the first occurrence or an array of filenames
+     *
+     * @return string|array The full path to the file or an array of file paths
+     *
+     * @throws \InvalidArgumentException When file is not found
+     */
+    public function locate($name, $currentPath = null, $first = true);
+}
--- /dev/null
+++ b/vendor/symfony/config/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2016 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/symfony/config/Loader/DelegatingLoader.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Loader;
+
+use Symfony\Component\Config\Exception\FileLoaderLoadException;
+
+/**
+ * DelegatingLoader delegates loading to other loaders using a loader resolver.
+ *
+ * This loader acts as an array of LoaderInterface objects - each having
+ * a chance to load a given resource (handled by the resolver)
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class DelegatingLoader extends Loader
+{
+    /**
+     * Constructor.
+     *
+     * @param LoaderResolverInterface $resolver A LoaderResolverInterface instance
+     */
+    public function __construct(LoaderResolverInterface $resolver)
+    {
+        $this->resolver = $resolver;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load($resource, $type = null)
+    {
+        if (false === $loader = $this->resolver->resolve($resource, $type)) {
+            throw new FileLoaderLoadException($resource);
+        }
+
+        return $loader->load($resource, $type);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($resource, $type = null)
+    {
+        return false !== $this->resolver->resolve($resource, $type);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Loader/FileLoader.php
@@ -0,0 +1,137 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Loader;
+
+use Symfony\Component\Config\FileLocatorInterface;
+use Symfony\Component\Config\Exception\FileLoaderLoadException;
+use Symfony\Component\Config\Exception\FileLoaderImportCircularReferenceException;
+
+/**
+ * FileLoader is the abstract class used by all built-in loaders that are file based.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class FileLoader extends Loader
+{
+    /**
+     * @var array
+     */
+    protected static $loading = array();
+
+    /**
+     * @var FileLocatorInterface
+     */
+    protected $locator;
+
+    private $currentDir;
+
+    /**
+     * Constructor.
+     *
+     * @param FileLocatorInterface $locator A FileLocatorInterface instance
+     */
+    public function __construct(FileLocatorInterface $locator)
+    {
+        $this->locator = $locator;
+    }
+
+    /**
+     * Sets the current directory.
+     *
+     * @param string $dir
+     */
+    public function setCurrentDir($dir)
+    {
+        $this->currentDir = $dir;
+    }
+
+    /**
+     * Returns the file locator used by this loader.
+     *
+     * @return FileLocatorInterface
+     */
+    public function getLocator()
+    {
+        return $this->locator;
+    }
+
+    /**
+     * Imports a resource.
+     *
+     * @param mixed       $resource       A Resource
+     * @param string|null $type           The resource type or null if unknown
+     * @param bool        $ignoreErrors   Whether to ignore import errors or not
+     * @param string|null $sourceResource The original resource importing the new resource
+     *
+     * @return mixed
+     *
+     * @throws FileLoaderLoadException
+     * @throws FileLoaderImportCircularReferenceException
+     */
+    public function import($resource, $type = null, $ignoreErrors = false, $sourceResource = null)
+    {
+        try {
+            $loader = $this->resolve($resource, $type);
+
+            if ($loader instanceof self && null !== $this->currentDir) {
+                // we fallback to the current locator to keep BC
+                // as some some loaders do not call the parent __construct()
+                // @deprecated should be removed in 3.0
+                $locator = $loader->getLocator();
+                if (null === $locator) {
+                    @trigger_error('Not calling the parent constructor in '.get_class($loader).' which extends '.__CLASS__.' is deprecated since version 2.7 and will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+                    $locator = $this->locator;
+                }
+
+                $resource = $locator->locate($resource, $this->currentDir, false);
+            }
+
+            $resources = is_array($resource) ? $resource : array($resource);
+            for ($i = 0; $i < $resourcesCount = count($resources); ++$i) {
+                if (isset(self::$loading[$resources[$i]])) {
+                    if ($i == $resourcesCount - 1) {
+                        throw new FileLoaderImportCircularReferenceException(array_keys(self::$loading));
+                    }
+                } else {
+                    $resource = $resources[$i];
+                    break;
+                }
+            }
+            self::$loading[$resource] = true;
+
+            try {
+                $ret = $loader->load($resource, $type);
+            } catch (\Exception $e) {
+                unset(self::$loading[$resource]);
+                throw $e;
+            } catch (\Throwable $e) {
+                unset(self::$loading[$resource]);
+                throw $e;
+            }
+
+            unset(self::$loading[$resource]);
+
+            return $ret;
+        } catch (FileLoaderImportCircularReferenceException $e) {
+            throw $e;
+        } catch (\Exception $e) {
+            if (!$ignoreErrors) {
+                // prevent embedded imports from nesting multiple exceptions
+                if ($e instanceof FileLoaderLoadException) {
+                    throw $e;
+                }
+
+                throw new FileLoaderLoadException($resource, $sourceResource, null, $e);
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Loader/Loader.php
@@ -0,0 +1,78 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Loader;
+
+use Symfony\Component\Config\Exception\FileLoaderLoadException;
+
+/**
+ * Loader is the abstract class used by all built-in loaders.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class Loader implements LoaderInterface
+{
+    protected $resolver;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getResolver()
+    {
+        return $this->resolver;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setResolver(LoaderResolverInterface $resolver)
+    {
+        $this->resolver = $resolver;
+    }
+
+    /**
+     * Imports a resource.
+     *
+     * @param mixed       $resource A resource
+     * @param string|null $type     The resource type or null if unknown
+     *
+     * @return mixed
+     */
+    public function import($resource, $type = null)
+    {
+        return $this->resolve($resource, $type)->load($resource, $type);
+    }
+
+    /**
+     * Finds a loader able to load an imported resource.
+     *
+     * @param mixed       $resource A resource
+     * @param string|null $type     The resource type or null if unknown
+     *
+     * @return LoaderInterface A LoaderInterface instance
+     *
+     * @throws FileLoaderLoadException If no loader is found
+     */
+    public function resolve($resource, $type = null)
+    {
+        if ($this->supports($resource, $type)) {
+            return $this;
+        }
+
+        $loader = null === $this->resolver ? false : $this->resolver->resolve($resource, $type);
+
+        if (false === $loader) {
+            throw new FileLoaderLoadException($resource);
+        }
+
+        return $loader;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Loader/LoaderInterface.php
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Loader;
+
+/**
+ * LoaderInterface is the interface implemented by all loader classes.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface LoaderInterface
+{
+    /**
+     * Loads a resource.
+     *
+     * @param mixed       $resource The resource
+     * @param string|null $type     The resource type or null if unknown
+     *
+     * @throws \Exception If something went wrong
+     */
+    public function load($resource, $type = null);
+
+    /**
+     * Returns whether this class supports the given resource.
+     *
+     * @param mixed       $resource A resource
+     * @param string|null $type     The resource type or null if unknown
+     *
+     * @return bool True if this class supports the given resource, false otherwise
+     */
+    public function supports($resource, $type = null);
+
+    /**
+     * Gets the loader resolver.
+     *
+     * @return LoaderResolverInterface A LoaderResolverInterface instance
+     */
+    public function getResolver();
+
+    /**
+     * Sets the loader resolver.
+     *
+     * @param LoaderResolverInterface $resolver A LoaderResolverInterface instance
+     */
+    public function setResolver(LoaderResolverInterface $resolver);
+}
--- /dev/null
+++ b/vendor/symfony/config/Loader/LoaderResolver.php
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Loader;
+
+/**
+ * LoaderResolver selects a loader for a given resource.
+ *
+ * A resource can be anything (e.g. a full path to a config file or a Closure).
+ * Each loader determines whether it can load a resource and how.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class LoaderResolver implements LoaderResolverInterface
+{
+    /**
+     * @var LoaderInterface[] An array of LoaderInterface objects
+     */
+    private $loaders = array();
+
+    /**
+     * Constructor.
+     *
+     * @param LoaderInterface[] $loaders An array of loaders
+     */
+    public function __construct(array $loaders = array())
+    {
+        foreach ($loaders as $loader) {
+            $this->addLoader($loader);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function resolve($resource, $type = null)
+    {
+        foreach ($this->loaders as $loader) {
+            if ($loader->supports($resource, $type)) {
+                return $loader;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Adds a loader.
+     *
+     * @param LoaderInterface $loader A LoaderInterface instance
+     */
+    public function addLoader(LoaderInterface $loader)
+    {
+        $this->loaders[] = $loader;
+        $loader->setResolver($this);
+    }
+
+    /**
+     * Returns the registered loaders.
+     *
+     * @return LoaderInterface[] An array of LoaderInterface instances
+     */
+    public function getLoaders()
+    {
+        return $this->loaders;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Loader/LoaderResolverInterface.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Loader;
+
+/**
+ * LoaderResolverInterface selects a loader for a given resource.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface LoaderResolverInterface
+{
+    /**
+     * Returns a loader able to load the resource.
+     *
+     * @param mixed       $resource A resource
+     * @param string|null $type     The resource type or null if unknown
+     *
+     * @return LoaderInterface|false The loader or false if none is able to load the resource
+     */
+    public function resolve($resource, $type = null);
+}
--- /dev/null
+++ b/vendor/symfony/config/Resource/BCResourceInterfaceChecker.php
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Resource;
+
+/**
+ * Resource checker for the ResourceInterface. Exists for BC.
+ *
+ * @author Matthias Pigulla <mp@webfactory.de>
+ *
+ * @deprecated since 2.8, to be removed in 3.0.
+ */
+class BCResourceInterfaceChecker extends SelfCheckingResourceChecker
+{
+    public function supports(ResourceInterface $metadata)
+    {
+        /* As all resources must be instanceof ResourceInterface,
+           we support them all. */
+        return true;
+    }
+
+    public function isFresh(ResourceInterface $resource, $timestamp)
+    {
+        @trigger_error(sprintf('The class "%s" is performing resource checking through ResourceInterface::isFresh(), which is deprecated since 2.8 and will be removed in 3.0', get_class($resource)), E_USER_DEPRECATED);
+
+        return parent::isFresh($resource, $timestamp); // For now, $metadata features the isFresh() method, so off we go (quack quack)
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Resource/DirectoryResource.php
@@ -0,0 +1,99 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Resource;
+
+/**
+ * DirectoryResource represents a resources stored in a subdirectory tree.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class DirectoryResource implements SelfCheckingResourceInterface, \Serializable
+{
+    private $resource;
+    private $pattern;
+
+    /**
+     * Constructor.
+     *
+     * @param string      $resource The file path to the resource
+     * @param string|null $pattern  A pattern to restrict monitored files
+     */
+    public function __construct($resource, $pattern = null)
+    {
+        $this->resource = $resource;
+        $this->pattern = $pattern;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __toString()
+    {
+        return md5(serialize(array($this->resource, $this->pattern)));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getResource()
+    {
+        return $this->resource;
+    }
+
+    /**
+     * Returns the pattern to restrict monitored files.
+     *
+     * @return string|null
+     */
+    public function getPattern()
+    {
+        return $this->pattern;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isFresh($timestamp)
+    {
+        if (!is_dir($this->resource)) {
+            return false;
+        }
+
+        $newestMTime = filemtime($this->resource);
+        foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->resource), \RecursiveIteratorIterator::SELF_FIRST) as $file) {
+            // if regex filtering is enabled only check matching files
+            if ($this->pattern && $file->isFile() && !preg_match($this->pattern, $file->getBasename())) {
+                continue;
+            }
+
+            // always monitor directories for changes, except the .. entries
+            // (otherwise deleted files wouldn't get detected)
+            if ($file->isDir() && '/..' === substr($file, -3)) {
+                continue;
+            }
+
+            $newestMTime = max($file->getMTime(), $newestMTime);
+        }
+
+        return $newestMTime < $timestamp;
+    }
+
+    public function serialize()
+    {
+        return serialize(array($this->resource, $this->pattern));
+    }
+
+    public function unserialize($serialized)
+    {
+        list($this->resource, $this->pattern) = unserialize($serialized);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Resource/FileExistenceResource.php
@@ -0,0 +1,78 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Resource;
+
+/**
+ * FileExistenceResource represents a resource stored on the filesystem.
+ * Freshness is only evaluated against resource creation or deletion.
+ *
+ * The resource can be a file or a directory.
+ *
+ * @author Charles-Henri Bruyand <charleshenri.bruyand@gmail.com>
+ */
+class FileExistenceResource implements SelfCheckingResourceInterface, \Serializable
+{
+    private $resource;
+
+    private $exists;
+
+    /**
+     * Constructor.
+     *
+     * @param string $resource The file path to the resource
+     */
+    public function __construct($resource)
+    {
+        $this->resource = (string) $resource;
+        $this->exists = file_exists($resource);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __toString()
+    {
+        return $this->resource;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getResource()
+    {
+        return $this->resource;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isFresh($timestamp)
+    {
+        return file_exists($this->resource) === $this->exists;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function serialize()
+    {
+        return serialize(array($this->resource, $this->exists));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function unserialize($serialized)
+    {
+        list($this->resource, $this->exists) = unserialize($serialized);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Resource/FileResource.php
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Resource;
+
+/**
+ * FileResource represents a resource stored on the filesystem.
+ *
+ * The resource can be a file or a directory.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class FileResource implements SelfCheckingResourceInterface, \Serializable
+{
+    /**
+     * @var string|false
+     */
+    private $resource;
+
+    /**
+     * Constructor.
+     *
+     * @param string $resource The file path to the resource
+     */
+    public function __construct($resource)
+    {
+        $this->resource = realpath($resource) ?: (file_exists($resource) ? $resource : false);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __toString()
+    {
+        return (string) $this->resource;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getResource()
+    {
+        return $this->resource;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isFresh($timestamp)
+    {
+        if (false === $this->resource || !file_exists($this->resource)) {
+            return false;
+        }
+
+        return filemtime($this->resource) <= $timestamp;
+    }
+
+    public function serialize()
+    {
+        return serialize($this->resource);
+    }
+
+    public function unserialize($serialized)
+    {
+        $this->resource = unserialize($serialized);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Resource/ResourceInterface.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Resource;
+
+/**
+ * ResourceInterface is the interface that must be implemented by all Resource classes.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface ResourceInterface
+{
+    /**
+     * Returns a string representation of the Resource.
+     *
+     * This method is necessary to allow for resource de-duplication, for example by means
+     * of array_unique(). The string returned need not have a particular meaning, but has
+     * to be identical for different ResourceInterface instances referring to the same
+     * resource; and it should be unlikely to collide with that of other, unrelated
+     * resource instances.
+     *
+     * @return string A string representation unique to the underlying Resource
+     */
+    public function __toString();
+
+    /**
+     * Returns true if the resource has not been updated since the given timestamp.
+     *
+     * @param int $timestamp The last time the resource was loaded
+     *
+     * @return bool True if the resource has not been updated, false otherwise
+     *
+     * @deprecated since 2.8, to be removed in 3.0. If your resource can check itself for
+     *             freshness implement the SelfCheckingResourceInterface instead.
+     */
+    public function isFresh($timestamp);
+
+    /**
+     * Returns the tied resource.
+     *
+     * @return mixed The resource
+     *
+     * @deprecated since 2.8, to be removed in 3.0. As there are many different kinds of resource,
+     *             a single getResource() method does not make sense at the interface level. You
+     *             can still call getResource() on implementing classes, probably after performing
+     *             a type check. If you know the concrete type of Resource at hand, the return value
+     *             of this method may make sense to you.
+     */
+    public function getResource();
+}
--- /dev/null
+++ b/vendor/symfony/config/Resource/SelfCheckingResourceChecker.php
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Resource;
+
+use Symfony\Component\Config\ResourceCheckerInterface;
+
+/**
+ * Resource checker for instances of SelfCheckingResourceInterface.
+ *
+ * As these resources perform the actual check themselves, we can provide
+ * this class as a standard way of validating them.
+ *
+ * @author Matthias Pigulla <mp@webfactory.de>
+ */
+class SelfCheckingResourceChecker implements ResourceCheckerInterface
+{
+    public function supports(ResourceInterface $metadata)
+    {
+        return $metadata instanceof SelfCheckingResourceInterface;
+    }
+
+    public function isFresh(ResourceInterface $resource, $timestamp)
+    {
+        /* @var SelfCheckingResourceInterface $resource */
+        return $resource->isFresh($timestamp);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/Resource/SelfCheckingResourceInterface.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Resource;
+
+/**
+ * Interface for Resources that can check for freshness autonomously,
+ * without special support from external services.
+ *
+ * @author Matthias Pigulla <mp@webfactory.de>
+ */
+interface SelfCheckingResourceInterface extends ResourceInterface
+{
+    /**
+     * Returns true if the resource has not been updated since the given timestamp.
+     *
+     * @param int $timestamp The last time the resource was loaded
+     *
+     * @return bool True if the resource has not been updated, false otherwise
+     */
+    public function isFresh($timestamp);
+}
--- /dev/null
+++ b/vendor/symfony/config/ResourceCheckerConfigCache.php
@@ -0,0 +1,140 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config;
+
+use Symfony\Component\Config\Resource\ResourceInterface;
+use Symfony\Component\Filesystem\Exception\IOException;
+use Symfony\Component\Filesystem\Filesystem;
+
+/**
+ * ResourceCheckerConfigCache uses instances of ResourceCheckerInterface
+ * to check whether cached data is still fresh.
+ *
+ * @author Matthias Pigulla <mp@webfactory.de>
+ */
+class ResourceCheckerConfigCache implements ConfigCacheInterface
+{
+    /**
+     * @var string
+     */
+    private $file;
+
+    /**
+     * @var ResourceCheckerInterface[]
+     */
+    private $resourceCheckers;
+
+    /**
+     * @param string                     $file             The absolute cache path
+     * @param ResourceCheckerInterface[] $resourceCheckers The ResourceCheckers to use for the freshness check
+     */
+    public function __construct($file, array $resourceCheckers = array())
+    {
+        $this->file = $file;
+        $this->resourceCheckers = $resourceCheckers;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getPath()
+    {
+        return $this->file;
+    }
+
+    /**
+     * Checks if the cache is still fresh.
+     *
+     * This implementation will make a decision solely based on the ResourceCheckers
+     * passed in the constructor.
+     *
+     * The first ResourceChecker that supports a given resource is considered authoritative.
+     * Resources with no matching ResourceChecker will silently be ignored and considered fresh.
+     *
+     * @return bool true if the cache is fresh, false otherwise
+     */
+    public function isFresh()
+    {
+        if (!is_file($this->file)) {
+            return false;
+        }
+
+        if (!$this->resourceCheckers) {
+            return true; // shortcut - if we don't have any checkers we don't need to bother with the meta file at all
+        }
+
+        $metadata = $this->getMetaFile();
+        if (!is_file($metadata)) {
+            return true;
+        }
+
+        $time = filemtime($this->file);
+        $meta = unserialize(file_get_contents($metadata));
+
+        foreach ($meta as $resource) {
+            /* @var ResourceInterface $resource */
+            foreach ($this->resourceCheckers as $checker) {
+                if (!$checker->supports($resource)) {
+                    continue; // next checker
+                }
+                if ($checker->isFresh($resource, $time)) {
+                    break; // no need to further check this resource
+                }
+
+                return false; // cache is stale
+            }
+            // no suitable checker found, ignore this resource
+        }
+
+        return true;
+    }
+
+    /**
+     * Writes cache.
+     *
+     * @param string              $content  The content to write in the cache
+     * @param ResourceInterface[] $metadata An array of metadata
+     *
+     * @throws \RuntimeException When cache file can't be written
+     */
+    public function write($content, array $metadata = null)
+    {
+        $mode = 0666;
+        $umask = umask();
+        $filesystem = new Filesystem();
+        $filesystem->dumpFile($this->file, $content, null);
+        try {
+            $filesystem->chmod($this->file, $mode, $umask);
+        } catch (IOException $e) {
+            // discard chmod failure (some filesystem may not support it)
+        }
+
+        if (null !== $metadata) {
+            $filesystem->dumpFile($this->getMetaFile(), serialize($metadata), null);
+            try {
+                $filesystem->chmod($this->getMetaFile(), $mode, $umask);
+            } catch (IOException $e) {
+                // discard chmod failure (some filesystem may not support it)
+            }
+        }
+    }
+
+    /**
+     * Gets the meta file path.
+     *
+     * @return string The meta file path
+     */
+    private function getMetaFile()
+    {
+        return $this->file.'.meta';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/ResourceCheckerConfigCacheFactory.php
@@ -0,0 +1,51 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config;
+
+/**
+ * A ConfigCacheFactory implementation that validates the
+ * cache with an arbitrary set of ResourceCheckers.
+ *
+ * @author Matthias Pigulla <mp@webfactory.de>
+ */
+class ResourceCheckerConfigCacheFactory implements ConfigCacheFactoryInterface
+{
+    /**
+     * @var ResourceCheckerInterface[]
+     */
+    private $resourceCheckers = array();
+
+    /**
+     * @param ResourceCheckerInterface[] $resourceCheckers
+     */
+    public function __construct(array $resourceCheckers = array())
+    {
+        $this->resourceCheckers = $resourceCheckers;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function cache($file, $callback)
+    {
+        if (!is_callable($callback)) {
+            throw new \InvalidArgumentException(sprintf('Invalid type for callback argument. Expected callable, but got "%s".', gettype($callback)));
+        }
+
+        $cache = new ResourceCheckerConfigCache($file, $this->resourceCheckers);
+        if (!$cache->isFresh()) {
+            call_user_func($callback, $cache);
+        }
+
+        return $cache;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/ResourceCheckerInterface.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config;
+
+use Symfony\Component\Config\Resource\ResourceInterface;
+
+/**
+ * Interface for ResourceCheckers.
+ *
+ * When a ResourceCheckerConfigCache instance is checked for freshness, all its associated
+ * metadata resources are passed to ResourceCheckers. The ResourceCheckers
+ * can then inspect the resources and decide whether the cache can be considered
+ * fresh or not.
+ *
+ * @author Matthias Pigulla <mp@webfactory.de>
+ * @author Benjamin Klotz <bk@webfactory.de>
+ */
+interface ResourceCheckerInterface
+{
+    /**
+     * Queries the ResourceChecker whether it can validate a given
+     * resource or not.
+     *
+     * @param ResourceInterface $metadata The resource to be checked for freshness
+     *
+     * @return bool True if the ResourceChecker can handle this resource type, false if not
+     */
+    public function supports(ResourceInterface $metadata);
+
+    /**
+     * Validates the resource.
+     *
+     * @param ResourceInterface $resource  The resource to be validated
+     * @param int               $timestamp The timestamp at which the cache associated with this resource was created
+     *
+     * @return bool True if the resource has not changed since the given timestamp, false otherwise
+     */
+    public function isFresh(ResourceInterface $resource, $timestamp);
+}
--- /dev/null
+++ b/vendor/symfony/config/Util/XmlUtils.php
@@ -0,0 +1,238 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Config\Util;
+
+/**
+ * XMLUtils is a bunch of utility methods to XML operations.
+ *
+ * This class contains static methods only and is not meant to be instantiated.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Martin Hasoň <martin.hason@gmail.com>
+ */
+class XmlUtils
+{
+    /**
+     * This class should not be instantiated.
+     */
+    private function __construct()
+    {
+    }
+
+    /**
+     * Loads an XML file.
+     *
+     * @param string               $file             An XML file path
+     * @param string|callable|null $schemaOrCallable An XSD schema file path, a callable, or null to disable validation
+     *
+     * @return \DOMDocument
+     *
+     * @throws \InvalidArgumentException When loading of XML file returns error
+     */
+    public static function loadFile($file, $schemaOrCallable = null)
+    {
+        $content = @file_get_contents($file);
+        if ('' === trim($content)) {
+            throw new \InvalidArgumentException(sprintf('File %s does not contain valid XML, it is empty.', $file));
+        }
+
+        $internalErrors = libxml_use_internal_errors(true);
+        $disableEntities = libxml_disable_entity_loader(true);
+        libxml_clear_errors();
+
+        $dom = new \DOMDocument();
+        $dom->validateOnParse = true;
+        if (!$dom->loadXML($content, LIBXML_NONET | (defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0))) {
+            libxml_disable_entity_loader($disableEntities);
+
+            throw new \InvalidArgumentException(implode("\n", static::getXmlErrors($internalErrors)));
+        }
+
+        $dom->normalizeDocument();
+
+        libxml_use_internal_errors($internalErrors);
+        libxml_disable_entity_loader($disableEntities);
+
+        foreach ($dom->childNodes as $child) {
+            if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) {
+                throw new \InvalidArgumentException('Document types are not allowed.');
+            }
+        }
+
+        if (null !== $schemaOrCallable) {
+            $internalErrors = libxml_use_internal_errors(true);
+            libxml_clear_errors();
+
+            $e = null;
+            if (is_callable($schemaOrCallable)) {
+                try {
+                    $valid = call_user_func($schemaOrCallable, $dom, $internalErrors);
+                } catch (\Exception $e) {
+                    $valid = false;
+                }
+            } elseif (!is_array($schemaOrCallable) && is_file((string) $schemaOrCallable)) {
+                $schemaSource = file_get_contents((string) $schemaOrCallable);
+                $valid = @$dom->schemaValidateSource($schemaSource);
+            } else {
+                libxml_use_internal_errors($internalErrors);
+
+                throw new \InvalidArgumentException('The schemaOrCallable argument has to be a valid path to XSD file or callable.');
+            }
+
+            if (!$valid) {
+                $messages = static::getXmlErrors($internalErrors);
+                if (empty($messages)) {
+                    $messages = array(sprintf('The XML file "%s" is not valid.', $file));
+                }
+                throw new \InvalidArgumentException(implode("\n", $messages), 0, $e);
+            }
+        }
+
+        libxml_clear_errors();
+        libxml_use_internal_errors($internalErrors);
+
+        return $dom;
+    }
+
+    /**
+     * Converts a \DomElement object to a PHP array.
+     *
+     * The following rules applies during the conversion:
+     *
+     *  * Each tag is converted to a key value or an array
+     *    if there is more than one "value"
+     *
+     *  * The content of a tag is set under a "value" key (<foo>bar</foo>)
+     *    if the tag also has some nested tags
+     *
+     *  * The attributes are converted to keys (<foo foo="bar"/>)
+     *
+     *  * The nested-tags are converted to keys (<foo><foo>bar</foo></foo>)
+     *
+     * @param \DomElement $element     A \DomElement instance
+     * @param bool        $checkPrefix Check prefix in an element or an attribute name
+     *
+     * @return array A PHP array
+     */
+    public static function convertDomElementToArray(\DOMElement $element, $checkPrefix = true)
+    {
+        $prefix = (string) $element->prefix;
+        $empty = true;
+        $config = array();
+        foreach ($element->attributes as $name => $node) {
+            if ($checkPrefix && !in_array((string) $node->prefix, array('', $prefix), true)) {
+                continue;
+            }
+            $config[$name] = static::phpize($node->value);
+            $empty = false;
+        }
+
+        $nodeValue = false;
+        foreach ($element->childNodes as $node) {
+            if ($node instanceof \DOMText) {
+                if ('' !== trim($node->nodeValue)) {
+                    $nodeValue = trim($node->nodeValue);
+                    $empty = false;
+                }
+            } elseif ($checkPrefix && $prefix != (string) $node->prefix) {
+                continue;
+            } elseif (!$node instanceof \DOMComment) {
+                $value = static::convertDomElementToArray($node, $checkPrefix);
+
+                $key = $node->localName;
+                if (isset($config[$key])) {
+                    if (!is_array($config[$key]) || !is_int(key($config[$key]))) {
+                        $config[$key] = array($config[$key]);
+                    }
+                    $config[$key][] = $value;
+                } else {
+                    $config[$key] = $value;
+                }
+
+                $empty = false;
+            }
+        }
+
+        if (false !== $nodeValue) {
+            $value = static::phpize($nodeValue);
+            if (count($config)) {
+                $config['value'] = $value;
+            } else {
+                $config = $value;
+            }
+        }
+
+        return !$empty ? $config : null;
+    }
+
+    /**
+     * Converts an xml value to a PHP type.
+     *
+     * @param mixed $value
+     *
+     * @return mixed
+     */
+    public static function phpize($value)
+    {
+        $value = (string) $value;
+        $lowercaseValue = strtolower($value);
+
+        switch (true) {
+            case 'null' === $lowercaseValue:
+                return;
+            case ctype_digit($value):
+                $raw = $value;
+                $cast = (int) $value;
+
+                return '0' == $value[0] ? octdec($value) : (((string) $raw === (string) $cast) ? $cast : $raw);
+            case isset($value[1]) && '-' === $value[0] && ctype_digit(substr($value, 1)):
+                $raw = $value;
+                $cast = (int) $value;
+
+                return '0' == $value[1] ? octdec($value) : (((string) $raw === (string) $cast) ? $cast : $raw);
+            case 'true' === $lowercaseValue:
+                return true;
+            case 'false' === $lowercaseValue:
+                return false;
+            case isset($value[1]) && '0b' == $value[0].$value[1]:
+                return bindec($value);
+            case is_numeric($value):
+                return '0x' === $value[0].$value[1] ? hexdec($value) : (float) $value;
+            case preg_match('/^0x[0-9a-f]++$/i', $value):
+                return hexdec($value);
+            case preg_match('/^(-|\+)?[0-9]+(\.[0-9]+)?$/', $value):
+                return (float) $value;
+            default:
+                return $value;
+        }
+    }
+
+    protected static function getXmlErrors($internalErrors)
+    {
+        $errors = array();
+        foreach (libxml_get_errors() as $error) {
+            $errors[] = sprintf('[%s %s] %s (in %s - line %d, column %d)',
+                LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR',
+                $error->code,
+                trim($error->message),
+                $error->file ?: 'n/a',
+                $error->line,
+                $error->column
+            );
+        }
+
+        libxml_clear_errors();
+        libxml_use_internal_errors($internalErrors);
+
+        return $errors;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/config/composer.json
@@ -0,0 +1,37 @@
+{
+    "name": "symfony/config",
+    "type": "library",
+    "description": "Symfony Config Component",
+    "keywords": [],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.9",
+        "symfony/filesystem": "~2.3|~3.0.0"
+    },
+    "suggest": {
+        "symfony/yaml": "To use the yaml reference dumper"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Component\\Config\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.8-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Application.php
@@ -0,0 +1,1157 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console;
+
+use Symfony\Component\Console\Descriptor\TextDescriptor;
+use Symfony\Component\Console\Descriptor\XmlDescriptor;
+use Symfony\Component\Console\Exception\ExceptionInterface;
+use Symfony\Component\Console\Helper\DebugFormatterHelper;
+use Symfony\Component\Console\Helper\ProcessHelper;
+use Symfony\Component\Console\Helper\QuestionHelper;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\ArgvInput;
+use Symfony\Component\Console\Input\ArrayInput;
+use Symfony\Component\Console\Input\InputDefinition;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputAwareInterface;
+use Symfony\Component\Console\Output\BufferedOutput;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Output\ConsoleOutput;
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Command\HelpCommand;
+use Symfony\Component\Console\Command\ListCommand;
+use Symfony\Component\Console\Helper\HelperSet;
+use Symfony\Component\Console\Helper\FormatterHelper;
+use Symfony\Component\Console\Helper\DialogHelper;
+use Symfony\Component\Console\Helper\ProgressHelper;
+use Symfony\Component\Console\Helper\TableHelper;
+use Symfony\Component\Console\Event\ConsoleCommandEvent;
+use Symfony\Component\Console\Event\ConsoleExceptionEvent;
+use Symfony\Component\Console\Event\ConsoleTerminateEvent;
+use Symfony\Component\Console\Exception\CommandNotFoundException;
+use Symfony\Component\Console\Exception\LogicException;
+use Symfony\Component\Debug\Exception\FatalThrowableError;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+
+/**
+ * An Application is the container for a collection of commands.
+ *
+ * It is the main entry point of a Console application.
+ *
+ * This class is optimized for a standard CLI environment.
+ *
+ * Usage:
+ *
+ *     $app = new Application('myapp', '1.0 (stable)');
+ *     $app->add(new SimpleCommand());
+ *     $app->run();
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Application
+{
+    private $commands = array();
+    private $wantHelps = false;
+    private $runningCommand;
+    private $name;
+    private $version;
+    private $catchExceptions = true;
+    private $autoExit = true;
+    private $definition;
+    private $helperSet;
+    private $dispatcher;
+    private $terminalDimensions;
+    private $defaultCommand;
+
+    /**
+     * Constructor.
+     *
+     * @param string $name    The name of the application
+     * @param string $version The version of the application
+     */
+    public function __construct($name = 'UNKNOWN', $version = 'UNKNOWN')
+    {
+        $this->name = $name;
+        $this->version = $version;
+        $this->defaultCommand = 'list';
+        $this->helperSet = $this->getDefaultHelperSet();
+        $this->definition = $this->getDefaultInputDefinition();
+
+        foreach ($this->getDefaultCommands() as $command) {
+            $this->add($command);
+        }
+    }
+
+    public function setDispatcher(EventDispatcherInterface $dispatcher)
+    {
+        $this->dispatcher = $dispatcher;
+    }
+
+    /**
+     * Runs the current application.
+     *
+     * @param InputInterface  $input  An Input instance
+     * @param OutputInterface $output An Output instance
+     *
+     * @return int 0 if everything went fine, or an error code
+     *
+     * @throws \Exception When doRun returns Exception
+     */
+    public function run(InputInterface $input = null, OutputInterface $output = null)
+    {
+        if (null === $input) {
+            $input = new ArgvInput();
+        }
+
+        if (null === $output) {
+            $output = new ConsoleOutput();
+        }
+
+        $this->configureIO($input, $output);
+
+        try {
+            $exitCode = $this->doRun($input, $output);
+        } catch (\Exception $e) {
+            if (!$this->catchExceptions) {
+                throw $e;
+            }
+
+            if ($output instanceof ConsoleOutputInterface) {
+                $this->renderException($e, $output->getErrorOutput());
+            } else {
+                $this->renderException($e, $output);
+            }
+
+            $exitCode = $e->getCode();
+            if (is_numeric($exitCode)) {
+                $exitCode = (int) $exitCode;
+                if (0 === $exitCode) {
+                    $exitCode = 1;
+                }
+            } else {
+                $exitCode = 1;
+            }
+        }
+
+        if ($this->autoExit) {
+            if ($exitCode > 255) {
+                $exitCode = 255;
+            }
+
+            exit($exitCode);
+        }
+
+        return $exitCode;
+    }
+
+    /**
+     * Runs the current application.
+     *
+     * @param InputInterface  $input  An Input instance
+     * @param OutputInterface $output An Output instance
+     *
+     * @return int 0 if everything went fine, or an error code
+     */
+    public function doRun(InputInterface $input, OutputInterface $output)
+    {
+        if (true === $input->hasParameterOption(array('--version', '-V'))) {
+            $output->writeln($this->getLongVersion());
+
+            return 0;
+        }
+
+        $name = $this->getCommandName($input);
+        if (true === $input->hasParameterOption(array('--help', '-h'))) {
+            if (!$name) {
+                $name = 'help';
+                $input = new ArrayInput(array('command' => 'help'));
+            } else {
+                $this->wantHelps = true;
+            }
+        }
+
+        if (!$name) {
+            $name = $this->defaultCommand;
+            $input = new ArrayInput(array('command' => $this->defaultCommand));
+        }
+
+        // the command name MUST be the first element of the input
+        $command = $this->find($name);
+
+        $this->runningCommand = $command;
+        $exitCode = $this->doRunCommand($command, $input, $output);
+        $this->runningCommand = null;
+
+        return $exitCode;
+    }
+
+    /**
+     * Set a helper set to be used with the command.
+     *
+     * @param HelperSet $helperSet The helper set
+     */
+    public function setHelperSet(HelperSet $helperSet)
+    {
+        $this->helperSet = $helperSet;
+    }
+
+    /**
+     * Get the helper set associated with the command.
+     *
+     * @return HelperSet The HelperSet instance associated with this command
+     */
+    public function getHelperSet()
+    {
+        return $this->helperSet;
+    }
+
+    /**
+     * Set an input definition to be used with this application.
+     *
+     * @param InputDefinition $definition The input definition
+     */
+    public function setDefinition(InputDefinition $definition)
+    {
+        $this->definition = $definition;
+    }
+
+    /**
+     * Gets the InputDefinition related to this Application.
+     *
+     * @return InputDefinition The InputDefinition instance
+     */
+    public function getDefinition()
+    {
+        return $this->definition;
+    }
+
+    /**
+     * Gets the help message.
+     *
+     * @return string A help message
+     */
+    public function getHelp()
+    {
+        return $this->getLongVersion();
+    }
+
+    /**
+     * Sets whether to catch exceptions or not during commands execution.
+     *
+     * @param bool $boolean Whether to catch exceptions or not during commands execution
+     */
+    public function setCatchExceptions($boolean)
+    {
+        $this->catchExceptions = (bool) $boolean;
+    }
+
+    /**
+     * Sets whether to automatically exit after a command execution or not.
+     *
+     * @param bool $boolean Whether to automatically exit after a command execution or not
+     */
+    public function setAutoExit($boolean)
+    {
+        $this->autoExit = (bool) $boolean;
+    }
+
+    /**
+     * Gets the name of the application.
+     *
+     * @return string The application name
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Sets the application name.
+     *
+     * @param string $name The application name
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * Gets the application version.
+     *
+     * @return string The application version
+     */
+    public function getVersion()
+    {
+        return $this->version;
+    }
+
+    /**
+     * Sets the application version.
+     *
+     * @param string $version The application version
+     */
+    public function setVersion($version)
+    {
+        $this->version = $version;
+    }
+
+    /**
+     * Returns the long version of the application.
+     *
+     * @return string The long application version
+     */
+    public function getLongVersion()
+    {
+        if ('UNKNOWN' !== $this->getName()) {
+            if ('UNKNOWN' !== $this->getVersion()) {
+                return sprintf('<info>%s</info> version <comment>%s</comment>', $this->getName(), $this->getVersion());
+            }
+
+            return sprintf('<info>%s</info>', $this->getName());
+        }
+
+        return '<info>Console Tool</info>';
+    }
+
+    /**
+     * Registers a new command.
+     *
+     * @param string $name The command name
+     *
+     * @return Command The newly created command
+     */
+    public function register($name)
+    {
+        return $this->add(new Command($name));
+    }
+
+    /**
+     * Adds an array of command objects.
+     *
+     * If a Command is not enabled it will not be added.
+     *
+     * @param Command[] $commands An array of commands
+     */
+    public function addCommands(array $commands)
+    {
+        foreach ($commands as $command) {
+            $this->add($command);
+        }
+    }
+
+    /**
+     * Adds a command object.
+     *
+     * If a command with the same name already exists, it will be overridden.
+     * If the command is not enabled it will not be added.
+     *
+     * @param Command $command A Command object
+     *
+     * @return Command|null The registered command if enabled or null
+     */
+    public function add(Command $command)
+    {
+        $command->setApplication($this);
+
+        if (!$command->isEnabled()) {
+            $command->setApplication(null);
+
+            return;
+        }
+
+        if (null === $command->getDefinition()) {
+            throw new LogicException(sprintf('Command class "%s" is not correctly initialized. You probably forgot to call the parent constructor.', get_class($command)));
+        }
+
+        $this->commands[$command->getName()] = $command;
+
+        foreach ($command->getAliases() as $alias) {
+            $this->commands[$alias] = $command;
+        }
+
+        return $command;
+    }
+
+    /**
+     * Returns a registered command by name or alias.
+     *
+     * @param string $name The command name or alias
+     *
+     * @return Command A Command object
+     *
+     * @throws CommandNotFoundException When command name given does not exist
+     */
+    public function get($name)
+    {
+        if (!isset($this->commands[$name])) {
+            throw new CommandNotFoundException(sprintf('The command "%s" does not exist.', $name));
+        }
+
+        $command = $this->commands[$name];
+
+        if ($this->wantHelps) {
+            $this->wantHelps = false;
+
+            $helpCommand = $this->get('help');
+            $helpCommand->setCommand($command);
+
+            return $helpCommand;
+        }
+
+        return $command;
+    }
+
+    /**
+     * Returns true if the command exists, false otherwise.
+     *
+     * @param string $name The command name or alias
+     *
+     * @return bool true if the command exists, false otherwise
+     */
+    public function has($name)
+    {
+        return isset($this->commands[$name]);
+    }
+
+    /**
+     * Returns an array of all unique namespaces used by currently registered commands.
+     *
+     * It does not return the global namespace which always exists.
+     *
+     * @return string[] An array of namespaces
+     */
+    public function getNamespaces()
+    {
+        $namespaces = array();
+        foreach ($this->all() as $command) {
+            $namespaces = array_merge($namespaces, $this->extractAllNamespaces($command->getName()));
+
+            foreach ($command->getAliases() as $alias) {
+                $namespaces = array_merge($namespaces, $this->extractAllNamespaces($alias));
+            }
+        }
+
+        return array_values(array_unique(array_filter($namespaces)));
+    }
+
+    /**
+     * Finds a registered namespace by a name or an abbreviation.
+     *
+     * @param string $namespace A namespace or abbreviation to search for
+     *
+     * @return string A registered namespace
+     *
+     * @throws CommandNotFoundException When namespace is incorrect or ambiguous
+     */
+    public function findNamespace($namespace)
+    {
+        $allNamespaces = $this->getNamespaces();
+        $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { return preg_quote($matches[1]).'[^:]*'; }, $namespace);
+        $namespaces = preg_grep('{^'.$expr.'}', $allNamespaces);
+
+        if (empty($namespaces)) {
+            $message = sprintf('There are no commands defined in the "%s" namespace.', $namespace);
+
+            if ($alternatives = $this->findAlternatives($namespace, $allNamespaces)) {
+                if (1 == count($alternatives)) {
+                    $message .= "\n\nDid you mean this?\n    ";
+                } else {
+                    $message .= "\n\nDid you mean one of these?\n    ";
+                }
+
+                $message .= implode("\n    ", $alternatives);
+            }
+
+            throw new CommandNotFoundException($message, $alternatives);
+        }
+
+        $exact = in_array($namespace, $namespaces, true);
+        if (count($namespaces) > 1 && !$exact) {
+            throw new CommandNotFoundException(sprintf('The namespace "%s" is ambiguous (%s).', $namespace, $this->getAbbreviationSuggestions(array_values($namespaces))), array_values($namespaces));
+        }
+
+        return $exact ? $namespace : reset($namespaces);
+    }
+
+    /**
+     * Finds a command by name or alias.
+     *
+     * Contrary to get, this command tries to find the best
+     * match if you give it an abbreviation of a name or alias.
+     *
+     * @param string $name A command name or a command alias
+     *
+     * @return Command A Command instance
+     *
+     * @throws CommandNotFoundException When command name is incorrect or ambiguous
+     */
+    public function find($name)
+    {
+        $allCommands = array_keys($this->commands);
+        $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { return preg_quote($matches[1]).'[^:]*'; }, $name);
+        $commands = preg_grep('{^'.$expr.'}', $allCommands);
+
+        if (empty($commands) || count(preg_grep('{^'.$expr.'$}', $commands)) < 1) {
+            if (false !== $pos = strrpos($name, ':')) {
+                // check if a namespace exists and contains commands
+                $this->findNamespace(substr($name, 0, $pos));
+            }
+
+            $message = sprintf('Command "%s" is not defined.', $name);
+
+            if ($alternatives = $this->findAlternatives($name, $allCommands)) {
+                if (1 == count($alternatives)) {
+                    $message .= "\n\nDid you mean this?\n    ";
+                } else {
+                    $message .= "\n\nDid you mean one of these?\n    ";
+                }
+                $message .= implode("\n    ", $alternatives);
+            }
+
+            throw new CommandNotFoundException($message, $alternatives);
+        }
+
+        // filter out aliases for commands which are already on the list
+        if (count($commands) > 1) {
+            $commandList = $this->commands;
+            $commands = array_filter($commands, function ($nameOrAlias) use ($commandList, $commands) {
+                $commandName = $commandList[$nameOrAlias]->getName();
+
+                return $commandName === $nameOrAlias || !in_array($commandName, $commands);
+            });
+        }
+
+        $exact = in_array($name, $commands, true);
+        if (count($commands) > 1 && !$exact) {
+            $suggestions = $this->getAbbreviationSuggestions(array_values($commands));
+
+            throw new CommandNotFoundException(sprintf('Command "%s" is ambiguous (%s).', $name, $suggestions), array_values($commands));
+        }
+
+        return $this->get($exact ? $name : reset($commands));
+    }
+
+    /**
+     * Gets the commands (registered in the given namespace if provided).
+     *
+     * The array keys are the full names and the values the command instances.
+     *
+     * @param string $namespace A namespace name
+     *
+     * @return Command[] An array of Command instances
+     */
+    public function all($namespace = null)
+    {
+        if (null === $namespace) {
+            return $this->commands;
+        }
+
+        $commands = array();
+        foreach ($this->commands as $name => $command) {
+            if ($namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1)) {
+                $commands[$name] = $command;
+            }
+        }
+
+        return $commands;
+    }
+
+    /**
+     * Returns an array of possible abbreviations given a set of names.
+     *
+     * @param array $names An array of names
+     *
+     * @return array An array of abbreviations
+     */
+    public static function getAbbreviations($names)
+    {
+        $abbrevs = array();
+        foreach ($names as $name) {
+            for ($len = strlen($name); $len > 0; --$len) {
+                $abbrev = substr($name, 0, $len);
+                $abbrevs[$abbrev][] = $name;
+            }
+        }
+
+        return $abbrevs;
+    }
+
+    /**
+     * Returns a text representation of the Application.
+     *
+     * @param string $namespace An optional namespace name
+     * @param bool   $raw       Whether to return raw command list
+     *
+     * @return string A string representing the Application
+     *
+     * @deprecated since version 2.3, to be removed in 3.0.
+     */
+    public function asText($namespace = null, $raw = false)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.3 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        $descriptor = new TextDescriptor();
+        $output = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, !$raw);
+        $descriptor->describe($output, $this, array('namespace' => $namespace, 'raw_output' => true));
+
+        return $output->fetch();
+    }
+
+    /**
+     * Returns an XML representation of the Application.
+     *
+     * @param string $namespace An optional namespace name
+     * @param bool   $asDom     Whether to return a DOM or an XML string
+     *
+     * @return string|\DOMDocument An XML string representing the Application
+     *
+     * @deprecated since version 2.3, to be removed in 3.0.
+     */
+    public function asXml($namespace = null, $asDom = false)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.3 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        $descriptor = new XmlDescriptor();
+
+        if ($asDom) {
+            return $descriptor->getApplicationDocument($this, $namespace);
+        }
+
+        $output = new BufferedOutput();
+        $descriptor->describe($output, $this, array('namespace' => $namespace));
+
+        return $output->fetch();
+    }
+
+    /**
+     * Renders a caught exception.
+     *
+     * @param \Exception      $e      An exception instance
+     * @param OutputInterface $output An OutputInterface instance
+     */
+    public function renderException($e, $output)
+    {
+        $output->writeln('', OutputInterface::VERBOSITY_QUIET);
+
+        do {
+            $title = sprintf('  [%s]  ', get_class($e));
+
+            $len = $this->stringWidth($title);
+
+            $width = $this->getTerminalWidth() ? $this->getTerminalWidth() - 1 : PHP_INT_MAX;
+            // HHVM only accepts 32 bits integer in str_split, even when PHP_INT_MAX is a 64 bit integer: https://github.com/facebook/hhvm/issues/1327
+            if (defined('HHVM_VERSION') && $width > 1 << 31) {
+                $width = 1 << 31;
+            }
+            $formatter = $output->getFormatter();
+            $lines = array();
+            foreach (preg_split('/\r?\n/', $e->getMessage()) as $line) {
+                foreach ($this->splitStringByWidth($line, $width - 4) as $line) {
+                    // pre-format lines to get the right string length
+                    $lineLength = $this->stringWidth(preg_replace('/\[[^m]*m/', '', $formatter->format($line))) + 4;
+                    $lines[] = array($line, $lineLength);
+
+                    $len = max($lineLength, $len);
+                }
+            }
+
+            $messages = array();
+            $messages[] = $emptyLine = $formatter->format(sprintf('<error>%s</error>', str_repeat(' ', $len)));
+            $messages[] = $formatter->format(sprintf('<error>%s%s</error>', $title, str_repeat(' ', max(0, $len - $this->stringWidth($title)))));
+            foreach ($lines as $line) {
+                $messages[] = $formatter->format(sprintf('<error>  %s  %s</error>', $line[0], str_repeat(' ', $len - $line[1])));
+            }
+            $messages[] = $emptyLine;
+            $messages[] = '';
+
+            $output->writeln($messages, OutputInterface::OUTPUT_RAW | OutputInterface::VERBOSITY_QUIET);
+
+            if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
+                $output->writeln('<comment>Exception trace:</comment>', OutputInterface::VERBOSITY_QUIET);
+
+                // exception related properties
+                $trace = $e->getTrace();
+                array_unshift($trace, array(
+                    'function' => '',
+                    'file' => $e->getFile() !== null ? $e->getFile() : 'n/a',
+                    'line' => $e->getLine() !== null ? $e->getLine() : 'n/a',
+                    'args' => array(),
+                ));
+
+                for ($i = 0, $count = count($trace); $i < $count; ++$i) {
+                    $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : '';
+                    $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : '';
+                    $function = $trace[$i]['function'];
+                    $file = isset($trace[$i]['file']) ? $trace[$i]['file'] : 'n/a';
+                    $line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a';
+
+                    $output->writeln(sprintf(' %s%s%s() at <info>%s:%s</info>', $class, $type, $function, $file, $line), OutputInterface::VERBOSITY_QUIET);
+                }
+
+                $output->writeln('', OutputInterface::VERBOSITY_QUIET);
+            }
+        } while ($e = $e->getPrevious());
+
+        if (null !== $this->runningCommand) {
+            $output->writeln(sprintf('<info>%s</info>', sprintf($this->runningCommand->getSynopsis(), $this->getName())), OutputInterface::VERBOSITY_QUIET);
+            $output->writeln('', OutputInterface::VERBOSITY_QUIET);
+        }
+    }
+
+    /**
+     * Tries to figure out the terminal width in which this application runs.
+     *
+     * @return int|null
+     */
+    protected function getTerminalWidth()
+    {
+        $dimensions = $this->getTerminalDimensions();
+
+        return $dimensions[0];
+    }
+
+    /**
+     * Tries to figure out the terminal height in which this application runs.
+     *
+     * @return int|null
+     */
+    protected function getTerminalHeight()
+    {
+        $dimensions = $this->getTerminalDimensions();
+
+        return $dimensions[1];
+    }
+
+    /**
+     * Tries to figure out the terminal dimensions based on the current environment.
+     *
+     * @return array Array containing width and height
+     */
+    public function getTerminalDimensions()
+    {
+        if ($this->terminalDimensions) {
+            return $this->terminalDimensions;
+        }
+
+        if ('\\' === DIRECTORY_SEPARATOR) {
+            // extract [w, H] from "wxh (WxH)"
+            if (preg_match('/^(\d+)x\d+ \(\d+x(\d+)\)$/', trim(getenv('ANSICON')), $matches)) {
+                return array((int) $matches[1], (int) $matches[2]);
+            }
+            // extract [w, h] from "wxh"
+            if (preg_match('/^(\d+)x(\d+)$/', $this->getConsoleMode(), $matches)) {
+                return array((int) $matches[1], (int) $matches[2]);
+            }
+        }
+
+        if ($sttyString = $this->getSttyColumns()) {
+            // extract [w, h] from "rows h; columns w;"
+            if (preg_match('/rows.(\d+);.columns.(\d+);/i', $sttyString, $matches)) {
+                return array((int) $matches[2], (int) $matches[1]);
+            }
+            // extract [w, h] from "; h rows; w columns"
+            if (preg_match('/;.(\d+).rows;.(\d+).columns/i', $sttyString, $matches)) {
+                return array((int) $matches[2], (int) $matches[1]);
+            }
+        }
+
+        return array(null, null);
+    }
+
+    /**
+     * Sets terminal dimensions.
+     *
+     * Can be useful to force terminal dimensions for functional tests.
+     *
+     * @param int $width  The width
+     * @param int $height The height
+     *
+     * @return Application The current application
+     */
+    public function setTerminalDimensions($width, $height)
+    {
+        $this->terminalDimensions = array($width, $height);
+
+        return $this;
+    }
+
+    /**
+     * Configures the input and output instances based on the user arguments and options.
+     *
+     * @param InputInterface  $input  An InputInterface instance
+     * @param OutputInterface $output An OutputInterface instance
+     */
+    protected function configureIO(InputInterface $input, OutputInterface $output)
+    {
+        if (true === $input->hasParameterOption(array('--ansi'))) {
+            $output->setDecorated(true);
+        } elseif (true === $input->hasParameterOption(array('--no-ansi'))) {
+            $output->setDecorated(false);
+        }
+
+        if (true === $input->hasParameterOption(array('--no-interaction', '-n'))) {
+            $input->setInteractive(false);
+        } elseif (function_exists('posix_isatty') && $this->getHelperSet()->has('question')) {
+            $inputStream = $this->getHelperSet()->get('question')->getInputStream();
+            if (!@posix_isatty($inputStream) && false === getenv('SHELL_INTERACTIVE')) {
+                $input->setInteractive(false);
+            }
+        }
+
+        if (true === $input->hasParameterOption(array('--quiet', '-q'))) {
+            $output->setVerbosity(OutputInterface::VERBOSITY_QUIET);
+            $input->setInteractive(false);
+        } else {
+            if ($input->hasParameterOption('-vvv') || $input->hasParameterOption('--verbose=3') || $input->getParameterOption('--verbose') === 3) {
+                $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG);
+            } elseif ($input->hasParameterOption('-vv') || $input->hasParameterOption('--verbose=2') || $input->getParameterOption('--verbose') === 2) {
+                $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);
+            } elseif ($input->hasParameterOption('-v') || $input->hasParameterOption('--verbose=1') || $input->hasParameterOption('--verbose') || $input->getParameterOption('--verbose')) {
+                $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE);
+            }
+        }
+    }
+
+    /**
+     * Runs the current command.
+     *
+     * If an event dispatcher has been attached to the application,
+     * events are also dispatched during the life-cycle of the command.
+     *
+     * @param Command         $command A Command instance
+     * @param InputInterface  $input   An Input instance
+     * @param OutputInterface $output  An Output instance
+     *
+     * @return int 0 if everything went fine, or an error code
+     *
+     * @throws \Exception when the command being run threw an exception
+     */
+    protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output)
+    {
+        foreach ($command->getHelperSet() as $helper) {
+            if ($helper instanceof InputAwareInterface) {
+                $helper->setInput($input);
+            }
+        }
+
+        if (null === $this->dispatcher) {
+            return $command->run($input, $output);
+        }
+
+        // bind before the console.command event, so the listeners have access to input options/arguments
+        try {
+            $command->mergeApplicationDefinition();
+            $input->bind($command->getDefinition());
+        } catch (ExceptionInterface $e) {
+            // ignore invalid options/arguments for now, to allow the event listeners to customize the InputDefinition
+        }
+
+        $event = new ConsoleCommandEvent($command, $input, $output);
+        $this->dispatcher->dispatch(ConsoleEvents::COMMAND, $event);
+
+        if ($event->commandShouldRun()) {
+            try {
+                $e = null;
+                $exitCode = $command->run($input, $output);
+            } catch (\Exception $x) {
+                $e = $x;
+            } catch (\Throwable $x) {
+                $e = new FatalThrowableError($x);
+            }
+            if (null !== $e) {
+                $event = new ConsoleExceptionEvent($command, $input, $output, $e, $e->getCode());
+                $this->dispatcher->dispatch(ConsoleEvents::EXCEPTION, $event);
+
+                if ($e !== $event->getException()) {
+                    $x = $e = $event->getException();
+                }
+
+                $event = new ConsoleTerminateEvent($command, $input, $output, $e->getCode());
+                $this->dispatcher->dispatch(ConsoleEvents::TERMINATE, $event);
+
+                throw $x;
+            }
+        } else {
+            $exitCode = ConsoleCommandEvent::RETURN_CODE_DISABLED;
+        }
+
+        $event = new ConsoleTerminateEvent($command, $input, $output, $exitCode);
+        $this->dispatcher->dispatch(ConsoleEvents::TERMINATE, $event);
+
+        return $event->getExitCode();
+    }
+
+    /**
+     * Gets the name of the command based on input.
+     *
+     * @param InputInterface $input The input interface
+     *
+     * @return string The command name
+     */
+    protected function getCommandName(InputInterface $input)
+    {
+        return $input->getFirstArgument();
+    }
+
+    /**
+     * Gets the default input definition.
+     *
+     * @return InputDefinition An InputDefinition instance
+     */
+    protected function getDefaultInputDefinition()
+    {
+        return new InputDefinition(array(
+            new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'),
+
+            new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display this help message'),
+            new InputOption('--quiet', '-q', InputOption::VALUE_NONE, 'Do not output any message'),
+            new InputOption('--verbose', '-v|vv|vvv', InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug'),
+            new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display this application version'),
+            new InputOption('--ansi', '', InputOption::VALUE_NONE, 'Force ANSI output'),
+            new InputOption('--no-ansi', '', InputOption::VALUE_NONE, 'Disable ANSI output'),
+            new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question'),
+        ));
+    }
+
+    /**
+     * Gets the default commands that should always be available.
+     *
+     * @return Command[] An array of default Command instances
+     */
+    protected function getDefaultCommands()
+    {
+        return array(new HelpCommand(), new ListCommand());
+    }
+
+    /**
+     * Gets the default helper set with the helpers that should always be available.
+     *
+     * @return HelperSet A HelperSet instance
+     */
+    protected function getDefaultHelperSet()
+    {
+        return new HelperSet(array(
+            new FormatterHelper(),
+            new DialogHelper(false),
+            new ProgressHelper(false),
+            new TableHelper(false),
+            new DebugFormatterHelper(),
+            new ProcessHelper(),
+            new QuestionHelper(),
+        ));
+    }
+
+    /**
+     * Runs and parses stty -a if it's available, suppressing any error output.
+     *
+     * @return string
+     */
+    private function getSttyColumns()
+    {
+        if (!function_exists('proc_open')) {
+            return;
+        }
+
+        $descriptorspec = array(1 => array('pipe', 'w'), 2 => array('pipe', 'w'));
+        $process = proc_open('stty -a | grep columns', $descriptorspec, $pipes, null, null, array('suppress_errors' => true));
+        if (is_resource($process)) {
+            $info = stream_get_contents($pipes[1]);
+            fclose($pipes[1]);
+            fclose($pipes[2]);
+            proc_close($process);
+
+            return $info;
+        }
+    }
+
+    /**
+     * Runs and parses mode CON if it's available, suppressing any error output.
+     *
+     * @return string|null <width>x<height> or null if it could not be parsed
+     */
+    private function getConsoleMode()
+    {
+        if (!function_exists('proc_open')) {
+            return;
+        }
+
+        $descriptorspec = array(1 => array('pipe', 'w'), 2 => array('pipe', 'w'));
+        $process = proc_open('mode CON', $descriptorspec, $pipes, null, null, array('suppress_errors' => true));
+        if (is_resource($process)) {
+            $info = stream_get_contents($pipes[1]);
+            fclose($pipes[1]);
+            fclose($pipes[2]);
+            proc_close($process);
+
+            if (preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) {
+                return $matches[2].'x'.$matches[1];
+            }
+        }
+    }
+
+    /**
+     * Returns abbreviated suggestions in string format.
+     *
+     * @param array $abbrevs Abbreviated suggestions to convert
+     *
+     * @return string A formatted string of abbreviated suggestions
+     */
+    private function getAbbreviationSuggestions($abbrevs)
+    {
+        return sprintf('%s, %s%s', $abbrevs[0], $abbrevs[1], count($abbrevs) > 2 ? sprintf(' and %d more', count($abbrevs) - 2) : '');
+    }
+
+    /**
+     * Returns the namespace part of the command name.
+     *
+     * This method is not part of public API and should not be used directly.
+     *
+     * @param string $name  The full name of the command
+     * @param string $limit The maximum number of parts of the namespace
+     *
+     * @return string The namespace of the command
+     */
+    public function extractNamespace($name, $limit = null)
+    {
+        $parts = explode(':', $name);
+        array_pop($parts);
+
+        return implode(':', null === $limit ? $parts : array_slice($parts, 0, $limit));
+    }
+
+    /**
+     * Finds alternative of $name among $collection,
+     * if nothing is found in $collection, try in $abbrevs.
+     *
+     * @param string             $name       The string
+     * @param array|\Traversable $collection The collection
+     *
+     * @return string[] A sorted array of similar string
+     */
+    private function findAlternatives($name, $collection)
+    {
+        $threshold = 1e3;
+        $alternatives = array();
+
+        $collectionParts = array();
+        foreach ($collection as $item) {
+            $collectionParts[$item] = explode(':', $item);
+        }
+
+        foreach (explode(':', $name) as $i => $subname) {
+            foreach ($collectionParts as $collectionName => $parts) {
+                $exists = isset($alternatives[$collectionName]);
+                if (!isset($parts[$i]) && $exists) {
+                    $alternatives[$collectionName] += $threshold;
+                    continue;
+                } elseif (!isset($parts[$i])) {
+                    continue;
+                }
+
+                $lev = levenshtein($subname, $parts[$i]);
+                if ($lev <= strlen($subname) / 3 || '' !== $subname && false !== strpos($parts[$i], $subname)) {
+                    $alternatives[$collectionName] = $exists ? $alternatives[$collectionName] + $lev : $lev;
+                } elseif ($exists) {
+                    $alternatives[$collectionName] += $threshold;
+                }
+            }
+        }
+
+        foreach ($collection as $item) {
+            $lev = levenshtein($name, $item);
+            if ($lev <= strlen($name) / 3 || false !== strpos($item, $name)) {
+                $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev;
+            }
+        }
+
+        $alternatives = array_filter($alternatives, function ($lev) use ($threshold) { return $lev < 2 * $threshold; });
+        asort($alternatives);
+
+        return array_keys($alternatives);
+    }
+
+    /**
+     * Sets the default Command name.
+     *
+     * @param string $commandName The Command name
+     */
+    public function setDefaultCommand($commandName)
+    {
+        $this->defaultCommand = $commandName;
+    }
+
+    private function stringWidth($string)
+    {
+        if (false === $encoding = mb_detect_encoding($string, null, true)) {
+            return strlen($string);
+        }
+
+        return mb_strwidth($string, $encoding);
+    }
+
+    private function splitStringByWidth($string, $width)
+    {
+        // str_split is not suitable for multi-byte characters, we should use preg_split to get char array properly.
+        // additionally, array_slice() is not enough as some character has doubled width.
+        // we need a function to split string not by character count but by string width
+        if (false === $encoding = mb_detect_encoding($string, null, true)) {
+            return str_split($string, $width);
+        }
+
+        $utf8String = mb_convert_encoding($string, 'utf8', $encoding);
+        $lines = array();
+        $line = '';
+        foreach (preg_split('//u', $utf8String) as $char) {
+            // test if $char could be appended to current line
+            if (mb_strwidth($line.$char, 'utf8') <= $width) {
+                $line .= $char;
+                continue;
+            }
+            // if not, push current line to array and make new line
+            $lines[] = str_pad($line, $width);
+            $line = $char;
+        }
+        if ('' !== $line) {
+            $lines[] = count($lines) ? str_pad($line, $width) : $line;
+        }
+
+        mb_convert_variables($encoding, 'utf8', $lines);
+
+        return $lines;
+    }
+
+    /**
+     * Returns all namespaces of the command name.
+     *
+     * @param string $name The full name of the command
+     *
+     * @return string[] The namespaces of the command
+     */
+    private function extractAllNamespaces($name)
+    {
+        // -1 as third argument is needed to skip the command short name when exploding
+        $parts = explode(':', $name, -1);
+        $namespaces = array();
+
+        foreach ($parts as $part) {
+            if (count($namespaces)) {
+                $namespaces[] = end($namespaces).':'.$part;
+            } else {
+                $namespaces[] = $part;
+            }
+        }
+
+        return $namespaces;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Command/Command.php
@@ -0,0 +1,681 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Command;
+
+use Symfony\Component\Console\Descriptor\TextDescriptor;
+use Symfony\Component\Console\Descriptor\XmlDescriptor;
+use Symfony\Component\Console\Exception\ExceptionInterface;
+use Symfony\Component\Console\Input\InputDefinition;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\BufferedOutput;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Application;
+use Symfony\Component\Console\Helper\HelperSet;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Exception\LogicException;
+
+/**
+ * Base class for all commands.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Command
+{
+    private $application;
+    private $name;
+    private $processTitle;
+    private $aliases = array();
+    private $definition;
+    private $help;
+    private $description;
+    private $ignoreValidationErrors = false;
+    private $applicationDefinitionMerged = false;
+    private $applicationDefinitionMergedWithArgs = false;
+    private $code;
+    private $synopsis = array();
+    private $usages = array();
+    private $helperSet;
+
+    /**
+     * Constructor.
+     *
+     * @param string|null $name The name of the command; passing null means it must be set in configure()
+     *
+     * @throws LogicException When the command name is empty
+     */
+    public function __construct($name = null)
+    {
+        $this->definition = new InputDefinition();
+
+        if (null !== $name) {
+            $this->setName($name);
+        }
+
+        $this->configure();
+
+        if (!$this->name) {
+            throw new LogicException(sprintf('The command defined in "%s" cannot have an empty name.', get_class($this)));
+        }
+    }
+
+    /**
+     * Ignores validation errors.
+     *
+     * This is mainly useful for the help command.
+     */
+    public function ignoreValidationErrors()
+    {
+        $this->ignoreValidationErrors = true;
+    }
+
+    /**
+     * Sets the application instance for this command.
+     *
+     * @param Application $application An Application instance
+     */
+    public function setApplication(Application $application = null)
+    {
+        $this->application = $application;
+        if ($application) {
+            $this->setHelperSet($application->getHelperSet());
+        } else {
+            $this->helperSet = null;
+        }
+    }
+
+    /**
+     * Sets the helper set.
+     *
+     * @param HelperSet $helperSet A HelperSet instance
+     */
+    public function setHelperSet(HelperSet $helperSet)
+    {
+        $this->helperSet = $helperSet;
+    }
+
+    /**
+     * Gets the helper set.
+     *
+     * @return HelperSet A HelperSet instance
+     */
+    public function getHelperSet()
+    {
+        return $this->helperSet;
+    }
+
+    /**
+     * Gets the application instance for this command.
+     *
+     * @return Application An Application instance
+     */
+    public function getApplication()
+    {
+        return $this->application;
+    }
+
+    /**
+     * Checks whether the command is enabled or not in the current environment.
+     *
+     * Override this to check for x or y and return false if the command can not
+     * run properly under the current conditions.
+     *
+     * @return bool
+     */
+    public function isEnabled()
+    {
+        return true;
+    }
+
+    /**
+     * Configures the current command.
+     */
+    protected function configure()
+    {
+    }
+
+    /**
+     * Executes the current command.
+     *
+     * This method is not abstract because you can use this class
+     * as a concrete class. In this case, instead of defining the
+     * execute() method, you set the code to execute by passing
+     * a Closure to the setCode() method.
+     *
+     * @param InputInterface  $input  An InputInterface instance
+     * @param OutputInterface $output An OutputInterface instance
+     *
+     * @return null|int null or 0 if everything went fine, or an error code
+     *
+     * @throws LogicException When this abstract method is not implemented
+     *
+     * @see setCode()
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        throw new LogicException('You must override the execute() method in the concrete command class.');
+    }
+
+    /**
+     * Interacts with the user.
+     *
+     * This method is executed before the InputDefinition is validated.
+     * This means that this is the only place where the command can
+     * interactively ask for values of missing required arguments.
+     *
+     * @param InputInterface  $input  An InputInterface instance
+     * @param OutputInterface $output An OutputInterface instance
+     */
+    protected function interact(InputInterface $input, OutputInterface $output)
+    {
+    }
+
+    /**
+     * Initializes the command just after the input has been validated.
+     *
+     * This is mainly useful when a lot of commands extends one main command
+     * where some things need to be initialized based on the input arguments and options.
+     *
+     * @param InputInterface  $input  An InputInterface instance
+     * @param OutputInterface $output An OutputInterface instance
+     */
+    protected function initialize(InputInterface $input, OutputInterface $output)
+    {
+    }
+
+    /**
+     * Runs the command.
+     *
+     * The code to execute is either defined directly with the
+     * setCode() method or by overriding the execute() method
+     * in a sub-class.
+     *
+     * @param InputInterface  $input  An InputInterface instance
+     * @param OutputInterface $output An OutputInterface instance
+     *
+     * @return int The command exit code
+     *
+     * @see setCode()
+     * @see execute()
+     */
+    public function run(InputInterface $input, OutputInterface $output)
+    {
+        // force the creation of the synopsis before the merge with the app definition
+        $this->getSynopsis(true);
+        $this->getSynopsis(false);
+
+        // add the application arguments and options
+        $this->mergeApplicationDefinition();
+
+        // bind the input against the command specific arguments/options
+        try {
+            $input->bind($this->definition);
+        } catch (ExceptionInterface $e) {
+            if (!$this->ignoreValidationErrors) {
+                throw $e;
+            }
+        }
+
+        $this->initialize($input, $output);
+
+        if (null !== $this->processTitle) {
+            if (function_exists('cli_set_process_title')) {
+                cli_set_process_title($this->processTitle);
+            } elseif (function_exists('setproctitle')) {
+                setproctitle($this->processTitle);
+            } elseif (OutputInterface::VERBOSITY_VERY_VERBOSE === $output->getVerbosity()) {
+                $output->writeln('<comment>Install the proctitle PECL to be able to change the process title.</comment>');
+            }
+        }
+
+        if ($input->isInteractive()) {
+            $this->interact($input, $output);
+        }
+
+        // The command name argument is often omitted when a command is executed directly with its run() method.
+        // It would fail the validation if we didn't make sure the command argument is present,
+        // since it's required by the application.
+        if ($input->hasArgument('command') && null === $input->getArgument('command')) {
+            $input->setArgument('command', $this->getName());
+        }
+
+        $input->validate();
+
+        if ($this->code) {
+            $statusCode = call_user_func($this->code, $input, $output);
+        } else {
+            $statusCode = $this->execute($input, $output);
+        }
+
+        return is_numeric($statusCode) ? (int) $statusCode : 0;
+    }
+
+    /**
+     * Sets the code to execute when running this command.
+     *
+     * If this method is used, it overrides the code defined
+     * in the execute() method.
+     *
+     * @param callable $code A callable(InputInterface $input, OutputInterface $output)
+     *
+     * @return Command The current instance
+     *
+     * @throws InvalidArgumentException
+     *
+     * @see execute()
+     */
+    public function setCode($code)
+    {
+        if (!is_callable($code)) {
+            throw new InvalidArgumentException('Invalid callable provided to Command::setCode.');
+        }
+
+        if (PHP_VERSION_ID >= 50400 && $code instanceof \Closure) {
+            $r = new \ReflectionFunction($code);
+            if (null === $r->getClosureThis()) {
+                $code = \Closure::bind($code, $this);
+            }
+        }
+
+        $this->code = $code;
+
+        return $this;
+    }
+
+    /**
+     * Merges the application definition with the command definition.
+     *
+     * This method is not part of public API and should not be used directly.
+     *
+     * @param bool $mergeArgs Whether to merge or not the Application definition arguments to Command definition arguments
+     */
+    public function mergeApplicationDefinition($mergeArgs = true)
+    {
+        if (null === $this->application || (true === $this->applicationDefinitionMerged && ($this->applicationDefinitionMergedWithArgs || !$mergeArgs))) {
+            return;
+        }
+
+        $this->definition->addOptions($this->application->getDefinition()->getOptions());
+
+        if ($mergeArgs) {
+            $currentArguments = $this->definition->getArguments();
+            $this->definition->setArguments($this->application->getDefinition()->getArguments());
+            $this->definition->addArguments($currentArguments);
+        }
+
+        $this->applicationDefinitionMerged = true;
+        if ($mergeArgs) {
+            $this->applicationDefinitionMergedWithArgs = true;
+        }
+    }
+
+    /**
+     * Sets an array of argument and option instances.
+     *
+     * @param array|InputDefinition $definition An array of argument and option instances or a definition instance
+     *
+     * @return Command The current instance
+     */
+    public function setDefinition($definition)
+    {
+        if ($definition instanceof InputDefinition) {
+            $this->definition = $definition;
+        } else {
+            $this->definition->setDefinition($definition);
+        }
+
+        $this->applicationDefinitionMerged = false;
+
+        return $this;
+    }
+
+    /**
+     * Gets the InputDefinition attached to this Command.
+     *
+     * @return InputDefinition An InputDefinition instance
+     */
+    public function getDefinition()
+    {
+        return $this->definition;
+    }
+
+    /**
+     * Gets the InputDefinition to be used to create XML and Text representations of this Command.
+     *
+     * Can be overridden to provide the original command representation when it would otherwise
+     * be changed by merging with the application InputDefinition.
+     *
+     * This method is not part of public API and should not be used directly.
+     *
+     * @return InputDefinition An InputDefinition instance
+     */
+    public function getNativeDefinition()
+    {
+        return $this->getDefinition();
+    }
+
+    /**
+     * Adds an argument.
+     *
+     * @param string $name        The argument name
+     * @param int    $mode        The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
+     * @param string $description A description text
+     * @param mixed  $default     The default value (for InputArgument::OPTIONAL mode only)
+     *
+     * @return Command The current instance
+     */
+    public function addArgument($name, $mode = null, $description = '', $default = null)
+    {
+        $this->definition->addArgument(new InputArgument($name, $mode, $description, $default));
+
+        return $this;
+    }
+
+    /**
+     * Adds an option.
+     *
+     * @param string $name        The option name
+     * @param string $shortcut    The shortcut (can be null)
+     * @param int    $mode        The option mode: One of the InputOption::VALUE_* constants
+     * @param string $description A description text
+     * @param mixed  $default     The default value (must be null for InputOption::VALUE_NONE)
+     *
+     * @return Command The current instance
+     */
+    public function addOption($name, $shortcut = null, $mode = null, $description = '', $default = null)
+    {
+        $this->definition->addOption(new InputOption($name, $shortcut, $mode, $description, $default));
+
+        return $this;
+    }
+
+    /**
+     * Sets the name of the command.
+     *
+     * This method can set both the namespace and the name if
+     * you separate them by a colon (:)
+     *
+     *     $command->setName('foo:bar');
+     *
+     * @param string $name The command name
+     *
+     * @return Command The current instance
+     *
+     * @throws InvalidArgumentException When the name is invalid
+     */
+    public function setName($name)
+    {
+        $this->validateName($name);
+
+        $this->name = $name;
+
+        return $this;
+    }
+
+    /**
+     * Sets the process title of the command.
+     *
+     * This feature should be used only when creating a long process command,
+     * like a daemon.
+     *
+     * PHP 5.5+ or the proctitle PECL library is required
+     *
+     * @param string $title The process title
+     *
+     * @return Command The current instance
+     */
+    public function setProcessTitle($title)
+    {
+        $this->processTitle = $title;
+
+        return $this;
+    }
+
+    /**
+     * Returns the command name.
+     *
+     * @return string The command name
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Sets the description for the command.
+     *
+     * @param string $description The description for the command
+     *
+     * @return Command The current instance
+     */
+    public function setDescription($description)
+    {
+        $this->description = $description;
+
+        return $this;
+    }
+
+    /**
+     * Returns the description for the command.
+     *
+     * @return string The description for the command
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+
+    /**
+     * Sets the help for the command.
+     *
+     * @param string $help The help for the command
+     *
+     * @return Command The current instance
+     */
+    public function setHelp($help)
+    {
+        $this->help = $help;
+
+        return $this;
+    }
+
+    /**
+     * Returns the help for the command.
+     *
+     * @return string The help for the command
+     */
+    public function getHelp()
+    {
+        return $this->help;
+    }
+
+    /**
+     * Returns the processed help for the command replacing the %command.name% and
+     * %command.full_name% patterns with the real values dynamically.
+     *
+     * @return string The processed help for the command
+     */
+    public function getProcessedHelp()
+    {
+        $name = $this->name;
+
+        $placeholders = array(
+            '%command.name%',
+            '%command.full_name%',
+        );
+        $replacements = array(
+            $name,
+            $_SERVER['PHP_SELF'].' '.$name,
+        );
+
+        return str_replace($placeholders, $replacements, $this->getHelp() ?: $this->getDescription());
+    }
+
+    /**
+     * Sets the aliases for the command.
+     *
+     * @param string[] $aliases An array of aliases for the command
+     *
+     * @return Command The current instance
+     *
+     * @throws InvalidArgumentException When an alias is invalid
+     */
+    public function setAliases($aliases)
+    {
+        if (!is_array($aliases) && !$aliases instanceof \Traversable) {
+            throw new InvalidArgumentException('$aliases must be an array or an instance of \Traversable');
+        }
+
+        foreach ($aliases as $alias) {
+            $this->validateName($alias);
+        }
+
+        $this->aliases = $aliases;
+
+        return $this;
+    }
+
+    /**
+     * Returns the aliases for the command.
+     *
+     * @return array An array of aliases for the command
+     */
+    public function getAliases()
+    {
+        return $this->aliases;
+    }
+
+    /**
+     * Returns the synopsis for the command.
+     *
+     * @param bool $short Whether to show the short version of the synopsis (with options folded) or not
+     *
+     * @return string The synopsis
+     */
+    public function getSynopsis($short = false)
+    {
+        $key = $short ? 'short' : 'long';
+
+        if (!isset($this->synopsis[$key])) {
+            $this->synopsis[$key] = trim(sprintf('%s %s', $this->name, $this->definition->getSynopsis($short)));
+        }
+
+        return $this->synopsis[$key];
+    }
+
+    /**
+     * Add a command usage example.
+     *
+     * @param string $usage The usage, it'll be prefixed with the command name
+     *
+     * @return Command The current instance
+     */
+    public function addUsage($usage)
+    {
+        if (0 !== strpos($usage, $this->name)) {
+            $usage = sprintf('%s %s', $this->name, $usage);
+        }
+
+        $this->usages[] = $usage;
+
+        return $this;
+    }
+
+    /**
+     * Returns alternative usages of the command.
+     *
+     * @return array
+     */
+    public function getUsages()
+    {
+        return $this->usages;
+    }
+
+    /**
+     * Gets a helper instance by name.
+     *
+     * @param string $name The helper name
+     *
+     * @return mixed The helper value
+     *
+     * @throws LogicException           if no HelperSet is defined
+     * @throws InvalidArgumentException if the helper is not defined
+     */
+    public function getHelper($name)
+    {
+        if (null === $this->helperSet) {
+            throw new LogicException(sprintf('Cannot retrieve helper "%s" because there is no HelperSet defined. Did you forget to add your command to the application or to set the application on the command using the setApplication() method? You can also set the HelperSet directly using the setHelperSet() method.', $name));
+        }
+
+        return $this->helperSet->get($name);
+    }
+
+    /**
+     * Returns a text representation of the command.
+     *
+     * @return string A string representing the command
+     *
+     * @deprecated since version 2.3, to be removed in 3.0.
+     */
+    public function asText()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.3 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        $descriptor = new TextDescriptor();
+        $output = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, true);
+        $descriptor->describe($output, $this, array('raw_output' => true));
+
+        return $output->fetch();
+    }
+
+    /**
+     * Returns an XML representation of the command.
+     *
+     * @param bool $asDom Whether to return a DOM or an XML string
+     *
+     * @return string|\DOMDocument An XML string representing the command
+     *
+     * @deprecated since version 2.3, to be removed in 3.0.
+     */
+    public function asXml($asDom = false)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.3 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        $descriptor = new XmlDescriptor();
+
+        if ($asDom) {
+            return $descriptor->getCommandDocument($this);
+        }
+
+        $output = new BufferedOutput();
+        $descriptor->describe($output, $this);
+
+        return $output->fetch();
+    }
+
+    /**
+     * Validates a command name.
+     *
+     * It must be non-empty and parts can optionally be separated by ":".
+     *
+     * @param string $name
+     *
+     * @throws InvalidArgumentException When the name is invalid
+     */
+    private function validateName($name)
+    {
+        if (!preg_match('/^[^\:]++(\:[^\:]++)*$/', $name)) {
+            throw new InvalidArgumentException(sprintf('Command name "%s" is invalid.', $name));
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Command/HelpCommand.php
@@ -0,0 +1,93 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Command;
+
+use Symfony\Component\Console\Helper\DescriptorHelper;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * HelpCommand displays the help for a given command.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class HelpCommand extends Command
+{
+    private $command;
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this->ignoreValidationErrors();
+
+        $this
+            ->setName('help')
+            ->setDefinition(array(
+                new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help'),
+                new InputOption('xml', null, InputOption::VALUE_NONE, 'To output help as XML'),
+                new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'),
+                new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help'),
+            ))
+            ->setDescription('Displays help for a command')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command displays help for a given command:
+
+  <info>php %command.full_name% list</info>
+
+You can also output the help in other formats by using the <comment>--format</comment> option:
+
+  <info>php %command.full_name% --format=xml list</info>
+
+To display the list of available commands, please use the <info>list</info> command.
+EOF
+            )
+        ;
+    }
+
+    /**
+     * Sets the command.
+     *
+     * @param Command $command The command to set
+     */
+    public function setCommand(Command $command)
+    {
+        $this->command = $command;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        if (null === $this->command) {
+            $this->command = $this->getApplication()->find($input->getArgument('command_name'));
+        }
+
+        if ($input->getOption('xml')) {
+            @trigger_error('The --xml option was deprecated in version 2.7 and will be removed in version 3.0. Use the --format option instead.', E_USER_DEPRECATED);
+
+            $input->setOption('format', 'xml');
+        }
+
+        $helper = new DescriptorHelper();
+        $helper->describe($output, $this->command, array(
+            'format' => $input->getOption('format'),
+            'raw_text' => $input->getOption('raw'),
+        ));
+
+        $this->command = null;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Command/ListCommand.php
@@ -0,0 +1,97 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Command;
+
+use Symfony\Component\Console\Helper\DescriptorHelper;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Input\InputDefinition;
+
+/**
+ * ListCommand displays the list of all available commands for the application.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ListCommand extends Command
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function configure()
+    {
+        $this
+            ->setName('list')
+            ->setDefinition($this->createDefinition())
+            ->setDescription('Lists commands')
+            ->setHelp(<<<'EOF'
+The <info>%command.name%</info> command lists all commands:
+
+  <info>php %command.full_name%</info>
+
+You can also display the commands for a specific namespace:
+
+  <info>php %command.full_name% test</info>
+
+You can also output the information in other formats by using the <comment>--format</comment> option:
+
+  <info>php %command.full_name% --format=xml</info>
+
+It's also possible to get raw list of commands (useful for embedding command runner):
+
+  <info>php %command.full_name% --raw</info>
+EOF
+            )
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getNativeDefinition()
+    {
+        return $this->createDefinition();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        if ($input->getOption('xml')) {
+            @trigger_error('The --xml option was deprecated in version 2.7 and will be removed in version 3.0. Use the --format option instead.', E_USER_DEPRECATED);
+
+            $input->setOption('format', 'xml');
+        }
+
+        $helper = new DescriptorHelper();
+        $helper->describe($output, $this->getApplication(), array(
+            'format' => $input->getOption('format'),
+            'raw_text' => $input->getOption('raw'),
+            'namespace' => $input->getArgument('namespace'),
+        ));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    private function createDefinition()
+    {
+        return new InputDefinition(array(
+            new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name'),
+            new InputOption('xml', null, InputOption::VALUE_NONE, 'To output list as XML'),
+            new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'),
+            new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'),
+        ));
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/ConsoleEvents.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console;
+
+/**
+ * Contains all events dispatched by an Application.
+ *
+ * @author Francesco Levorato <git@flevour.net>
+ */
+final class ConsoleEvents
+{
+    /**
+     * The COMMAND event allows you to attach listeners before any command is
+     * executed by the console. It also allows you to modify the command, input and output
+     * before they are handled to the command.
+     *
+     * The event listener method receives a Symfony\Component\Console\Event\ConsoleCommandEvent
+     * instance.
+     *
+     * @Event
+     *
+     * @var string
+     */
+    const COMMAND = 'console.command';
+
+    /**
+     * The TERMINATE event allows you to attach listeners after a command is
+     * executed by the console.
+     *
+     * The event listener method receives a Symfony\Component\Console\Event\ConsoleTerminateEvent
+     * instance.
+     *
+     * @Event
+     *
+     * @var string
+     */
+    const TERMINATE = 'console.terminate';
+
+    /**
+     * The EXCEPTION event occurs when an uncaught exception appears.
+     *
+     * This event allows you to deal with the exception or
+     * to modify the thrown exception. The event listener method receives
+     * a Symfony\Component\Console\Event\ConsoleExceptionEvent
+     * instance.
+     *
+     * @Event
+     *
+     * @var string
+     */
+    const EXCEPTION = 'console.exception';
+}
--- /dev/null
+++ b/vendor/symfony/console/Descriptor/ApplicationDescription.php
@@ -0,0 +1,160 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Descriptor;
+
+use Symfony\Component\Console\Application;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Exception\CommandNotFoundException;
+
+/**
+ * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
+ */
+class ApplicationDescription
+{
+    const GLOBAL_NAMESPACE = '_global';
+
+    /**
+     * @var Application
+     */
+    private $application;
+
+    /**
+     * @var null|string
+     */
+    private $namespace;
+
+    /**
+     * @var array
+     */
+    private $namespaces;
+
+    /**
+     * @var Command[]
+     */
+    private $commands;
+
+    /**
+     * @var Command[]
+     */
+    private $aliases;
+
+    /**
+     * Constructor.
+     *
+     * @param Application $application
+     * @param string|null $namespace
+     */
+    public function __construct(Application $application, $namespace = null)
+    {
+        $this->application = $application;
+        $this->namespace = $namespace;
+    }
+
+    /**
+     * @return array
+     */
+    public function getNamespaces()
+    {
+        if (null === $this->namespaces) {
+            $this->inspectApplication();
+        }
+
+        return $this->namespaces;
+    }
+
+    /**
+     * @return Command[]
+     */
+    public function getCommands()
+    {
+        if (null === $this->commands) {
+            $this->inspectApplication();
+        }
+
+        return $this->commands;
+    }
+
+    /**
+     * @param string $name
+     *
+     * @return Command
+     *
+     * @throws CommandNotFoundException
+     */
+    public function getCommand($name)
+    {
+        if (!isset($this->commands[$name]) && !isset($this->aliases[$name])) {
+            throw new CommandNotFoundException(sprintf('Command %s does not exist.', $name));
+        }
+
+        return isset($this->commands[$name]) ? $this->commands[$name] : $this->aliases[$name];
+    }
+
+    private function inspectApplication()
+    {
+        $this->commands = array();
+        $this->namespaces = array();
+
+        $all = $this->application->all($this->namespace ? $this->application->findNamespace($this->namespace) : null);
+        foreach ($this->sortCommands($all) as $namespace => $commands) {
+            $names = array();
+
+            /** @var Command $command */
+            foreach ($commands as $name => $command) {
+                if (!$command->getName()) {
+                    continue;
+                }
+
+                if ($command->getName() === $name) {
+                    $this->commands[$name] = $command;
+                } else {
+                    $this->aliases[$name] = $command;
+                }
+
+                $names[] = $name;
+            }
+
+            $this->namespaces[$namespace] = array('id' => $namespace, 'commands' => $names);
+        }
+    }
+
+    /**
+     * @param array $commands
+     *
+     * @return array
+     */
+    private function sortCommands(array $commands)
+    {
+        $namespacedCommands = array();
+        $globalCommands = array();
+        foreach ($commands as $name => $command) {
+            $key = $this->application->extractNamespace($name, 1);
+            if (!$key) {
+                $globalCommands['_global'][$name] = $command;
+            } else {
+                $namespacedCommands[$key][$name] = $command;
+            }
+        }
+        ksort($namespacedCommands);
+        $namespacedCommands = array_merge($globalCommands, $namespacedCommands);
+
+        foreach ($namespacedCommands as &$commandsSet) {
+            ksort($commandsSet);
+        }
+        // unset reference to keep scope clear
+        unset($commandsSet);
+
+        return $namespacedCommands;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Descriptor/Descriptor.php
@@ -0,0 +1,122 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Descriptor;
+
+use Symfony\Component\Console\Application;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputDefinition;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+
+/**
+ * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
+ */
+abstract class Descriptor implements DescriptorInterface
+{
+    /**
+     * @var OutputInterface
+     */
+    private $output;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function describe(OutputInterface $output, $object, array $options = array())
+    {
+        $this->output = $output;
+
+        switch (true) {
+            case $object instanceof InputArgument:
+                $this->describeInputArgument($object, $options);
+                break;
+            case $object instanceof InputOption:
+                $this->describeInputOption($object, $options);
+                break;
+            case $object instanceof InputDefinition:
+                $this->describeInputDefinition($object, $options);
+                break;
+            case $object instanceof Command:
+                $this->describeCommand($object, $options);
+                break;
+            case $object instanceof Application:
+                $this->describeApplication($object, $options);
+                break;
+            default:
+                throw new InvalidArgumentException(sprintf('Object of type "%s" is not describable.', get_class($object)));
+        }
+    }
+
+    /**
+     * Writes content to output.
+     *
+     * @param string $content
+     * @param bool   $decorated
+     */
+    protected function write($content, $decorated = false)
+    {
+        $this->output->write($content, false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW);
+    }
+
+    /**
+     * Describes an InputArgument instance.
+     *
+     * @param InputArgument $argument
+     * @param array         $options
+     *
+     * @return string|mixed
+     */
+    abstract protected function describeInputArgument(InputArgument $argument, array $options = array());
+
+    /**
+     * Describes an InputOption instance.
+     *
+     * @param InputOption $option
+     * @param array       $options
+     *
+     * @return string|mixed
+     */
+    abstract protected function describeInputOption(InputOption $option, array $options = array());
+
+    /**
+     * Describes an InputDefinition instance.
+     *
+     * @param InputDefinition $definition
+     * @param array           $options
+     *
+     * @return string|mixed
+     */
+    abstract protected function describeInputDefinition(InputDefinition $definition, array $options = array());
+
+    /**
+     * Describes a Command instance.
+     *
+     * @param Command $command
+     * @param array   $options
+     *
+     * @return string|mixed
+     */
+    abstract protected function describeCommand(Command $command, array $options = array());
+
+    /**
+     * Describes an Application instance.
+     *
+     * @param Application $application
+     * @param array       $options
+     *
+     * @return string|mixed
+     */
+    abstract protected function describeApplication(Application $application, array $options = array());
+}
--- /dev/null
+++ b/vendor/symfony/console/Descriptor/DescriptorInterface.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Descriptor;
+
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * Descriptor interface.
+ *
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ */
+interface DescriptorInterface
+{
+    /**
+     * Describes an InputArgument instance.
+     *
+     * @param OutputInterface $output
+     * @param object          $object
+     * @param array           $options
+     */
+    public function describe(OutputInterface $output, $object, array $options = array());
+}
--- /dev/null
+++ b/vendor/symfony/console/Descriptor/JsonDescriptor.php
@@ -0,0 +1,166 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Descriptor;
+
+use Symfony\Component\Console\Application;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputDefinition;
+use Symfony\Component\Console\Input\InputOption;
+
+/**
+ * JSON descriptor.
+ *
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ *
+ * @internal
+ */
+class JsonDescriptor extends Descriptor
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeInputArgument(InputArgument $argument, array $options = array())
+    {
+        $this->writeData($this->getInputArgumentData($argument), $options);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeInputOption(InputOption $option, array $options = array())
+    {
+        $this->writeData($this->getInputOptionData($option), $options);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeInputDefinition(InputDefinition $definition, array $options = array())
+    {
+        $this->writeData($this->getInputDefinitionData($definition), $options);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeCommand(Command $command, array $options = array())
+    {
+        $this->writeData($this->getCommandData($command), $options);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeApplication(Application $application, array $options = array())
+    {
+        $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
+        $description = new ApplicationDescription($application, $describedNamespace);
+        $commands = array();
+
+        foreach ($description->getCommands() as $command) {
+            $commands[] = $this->getCommandData($command);
+        }
+
+        $data = $describedNamespace
+            ? array('commands' => $commands, 'namespace' => $describedNamespace)
+            : array('commands' => $commands, 'namespaces' => array_values($description->getNamespaces()));
+
+        $this->writeData($data, $options);
+    }
+
+    /**
+     * Writes data as json.
+     *
+     * @param array $data
+     * @param array $options
+     *
+     * @return array|string
+     */
+    private function writeData(array $data, array $options)
+    {
+        $this->write(json_encode($data, isset($options['json_encoding']) ? $options['json_encoding'] : 0));
+    }
+
+    /**
+     * @param InputArgument $argument
+     *
+     * @return array
+     */
+    private function getInputArgumentData(InputArgument $argument)
+    {
+        return array(
+            'name' => $argument->getName(),
+            'is_required' => $argument->isRequired(),
+            'is_array' => $argument->isArray(),
+            'description' => preg_replace('/\s*[\r\n]\s*/', ' ', $argument->getDescription()),
+            'default' => $argument->getDefault(),
+        );
+    }
+
+    /**
+     * @param InputOption $option
+     *
+     * @return array
+     */
+    private function getInputOptionData(InputOption $option)
+    {
+        return array(
+            'name' => '--'.$option->getName(),
+            'shortcut' => $option->getShortcut() ? '-'.implode('|-', explode('|', $option->getShortcut())) : '',
+            'accept_value' => $option->acceptValue(),
+            'is_value_required' => $option->isValueRequired(),
+            'is_multiple' => $option->isArray(),
+            'description' => preg_replace('/\s*[\r\n]\s*/', ' ', $option->getDescription()),
+            'default' => $option->getDefault(),
+        );
+    }
+
+    /**
+     * @param InputDefinition $definition
+     *
+     * @return array
+     */
+    private function getInputDefinitionData(InputDefinition $definition)
+    {
+        $inputArguments = array();
+        foreach ($definition->getArguments() as $name => $argument) {
+            $inputArguments[$name] = $this->getInputArgumentData($argument);
+        }
+
+        $inputOptions = array();
+        foreach ($definition->getOptions() as $name => $option) {
+            $inputOptions[$name] = $this->getInputOptionData($option);
+        }
+
+        return array('arguments' => $inputArguments, 'options' => $inputOptions);
+    }
+
+    /**
+     * @param Command $command
+     *
+     * @return array
+     */
+    private function getCommandData(Command $command)
+    {
+        $command->getSynopsis();
+        $command->mergeApplicationDefinition(false);
+
+        return array(
+            'name' => $command->getName(),
+            'usage' => array_merge(array($command->getSynopsis()), $command->getUsages(), $command->getAliases()),
+            'description' => $command->getDescription(),
+            'help' => $command->getProcessedHelp(),
+            'definition' => $this->getInputDefinitionData($command->getNativeDefinition()),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Descriptor/MarkdownDescriptor.php
@@ -0,0 +1,143 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Descriptor;
+
+use Symfony\Component\Console\Application;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputDefinition;
+use Symfony\Component\Console\Input\InputOption;
+
+/**
+ * Markdown descriptor.
+ *
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ *
+ * @internal
+ */
+class MarkdownDescriptor extends Descriptor
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeInputArgument(InputArgument $argument, array $options = array())
+    {
+        $this->write(
+            '**'.$argument->getName().':**'."\n\n"
+            .'* Name: '.($argument->getName() ?: '<none>')."\n"
+            .'* Is required: '.($argument->isRequired() ? 'yes' : 'no')."\n"
+            .'* Is array: '.($argument->isArray() ? 'yes' : 'no')."\n"
+            .'* Description: '.preg_replace('/\s*[\r\n]\s*/', "\n  ", $argument->getDescription() ?: '<none>')."\n"
+            .'* Default: `'.str_replace("\n", '', var_export($argument->getDefault(), true)).'`'
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeInputOption(InputOption $option, array $options = array())
+    {
+        $this->write(
+            '**'.$option->getName().':**'."\n\n"
+            .'* Name: `--'.$option->getName().'`'."\n"
+            .'* Shortcut: '.($option->getShortcut() ? '`-'.implode('|-', explode('|', $option->getShortcut())).'`' : '<none>')."\n"
+            .'* Accept value: '.($option->acceptValue() ? 'yes' : 'no')."\n"
+            .'* Is value required: '.($option->isValueRequired() ? 'yes' : 'no')."\n"
+            .'* Is multiple: '.($option->isArray() ? 'yes' : 'no')."\n"
+            .'* Description: '.preg_replace('/\s*[\r\n]\s*/', "\n  ", $option->getDescription() ?: '<none>')."\n"
+            .'* Default: `'.str_replace("\n", '', var_export($option->getDefault(), true)).'`'
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeInputDefinition(InputDefinition $definition, array $options = array())
+    {
+        if ($showArguments = count($definition->getArguments()) > 0) {
+            $this->write('### Arguments:');
+            foreach ($definition->getArguments() as $argument) {
+                $this->write("\n\n");
+                $this->write($this->describeInputArgument($argument));
+            }
+        }
+
+        if (count($definition->getOptions()) > 0) {
+            if ($showArguments) {
+                $this->write("\n\n");
+            }
+
+            $this->write('### Options:');
+            foreach ($definition->getOptions() as $option) {
+                $this->write("\n\n");
+                $this->write($this->describeInputOption($option));
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeCommand(Command $command, array $options = array())
+    {
+        $command->getSynopsis();
+        $command->mergeApplicationDefinition(false);
+
+        $this->write(
+            $command->getName()."\n"
+            .str_repeat('-', strlen($command->getName()))."\n\n"
+            .'* Description: '.($command->getDescription() ?: '<none>')."\n"
+            .'* Usage:'."\n\n"
+            .array_reduce(array_merge(array($command->getSynopsis()), $command->getAliases(), $command->getUsages()), function ($carry, $usage) {
+                return $carry.'  * `'.$usage.'`'."\n";
+            })
+        );
+
+        if ($help = $command->getProcessedHelp()) {
+            $this->write("\n");
+            $this->write($help);
+        }
+
+        if ($command->getNativeDefinition()) {
+            $this->write("\n\n");
+            $this->describeInputDefinition($command->getNativeDefinition());
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeApplication(Application $application, array $options = array())
+    {
+        $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
+        $description = new ApplicationDescription($application, $describedNamespace);
+
+        $this->write($application->getName()."\n".str_repeat('=', strlen($application->getName())));
+
+        foreach ($description->getNamespaces() as $namespace) {
+            if (ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {
+                $this->write("\n\n");
+                $this->write('**'.$namespace['id'].':**');
+            }
+
+            $this->write("\n\n");
+            $this->write(implode("\n", array_map(function ($commandName) {
+                return '* '.$commandName;
+            }, $namespace['commands'])));
+        }
+
+        foreach ($description->getCommands() as $command) {
+            $this->write("\n\n");
+            $this->write($this->describeCommand($command));
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Descriptor/TextDescriptor.php
@@ -0,0 +1,287 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Descriptor;
+
+use Symfony\Component\Console\Application;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputDefinition;
+use Symfony\Component\Console\Input\InputOption;
+
+/**
+ * Text descriptor.
+ *
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ *
+ * @internal
+ */
+class TextDescriptor extends Descriptor
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeInputArgument(InputArgument $argument, array $options = array())
+    {
+        if (null !== $argument->getDefault() && (!is_array($argument->getDefault()) || count($argument->getDefault()))) {
+            $default = sprintf('<comment> [default: %s]</comment>', $this->formatDefaultValue($argument->getDefault()));
+        } else {
+            $default = '';
+        }
+
+        $totalWidth = isset($options['total_width']) ? $options['total_width'] : strlen($argument->getName());
+        $spacingWidth = $totalWidth - strlen($argument->getName()) + 2;
+
+        $this->writeText(sprintf('  <info>%s</info>%s%s%s',
+            $argument->getName(),
+            str_repeat(' ', $spacingWidth),
+            // + 17 = 2 spaces + <info> + </info> + 2 spaces
+            preg_replace('/\s*[\r\n]\s*/', "\n".str_repeat(' ', $totalWidth + 17), $argument->getDescription()),
+            $default
+        ), $options);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeInputOption(InputOption $option, array $options = array())
+    {
+        if ($option->acceptValue() && null !== $option->getDefault() && (!is_array($option->getDefault()) || count($option->getDefault()))) {
+            $default = sprintf('<comment> [default: %s]</comment>', $this->formatDefaultValue($option->getDefault()));
+        } else {
+            $default = '';
+        }
+
+        $value = '';
+        if ($option->acceptValue()) {
+            $value = '='.strtoupper($option->getName());
+
+            if ($option->isValueOptional()) {
+                $value = '['.$value.']';
+            }
+        }
+
+        $totalWidth = isset($options['total_width']) ? $options['total_width'] : $this->calculateTotalWidthForOptions(array($option));
+        $synopsis = sprintf('%s%s',
+            $option->getShortcut() ? sprintf('-%s, ', $option->getShortcut()) : '    ',
+            sprintf('--%s%s', $option->getName(), $value)
+        );
+
+        $spacingWidth = $totalWidth - strlen($synopsis) + 2;
+
+        $this->writeText(sprintf('  <info>%s</info>%s%s%s%s',
+            $synopsis,
+            str_repeat(' ', $spacingWidth),
+            // + 17 = 2 spaces + <info> + </info> + 2 spaces
+            preg_replace('/\s*[\r\n]\s*/', "\n".str_repeat(' ', $totalWidth + 17), $option->getDescription()),
+            $default,
+            $option->isArray() ? '<comment> (multiple values allowed)</comment>' : ''
+        ), $options);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeInputDefinition(InputDefinition $definition, array $options = array())
+    {
+        $totalWidth = $this->calculateTotalWidthForOptions($definition->getOptions());
+        foreach ($definition->getArguments() as $argument) {
+            $totalWidth = max($totalWidth, strlen($argument->getName()));
+        }
+
+        if ($definition->getArguments()) {
+            $this->writeText('<comment>Arguments:</comment>', $options);
+            $this->writeText("\n");
+            foreach ($definition->getArguments() as $argument) {
+                $this->describeInputArgument($argument, array_merge($options, array('total_width' => $totalWidth)));
+                $this->writeText("\n");
+            }
+        }
+
+        if ($definition->getArguments() && $definition->getOptions()) {
+            $this->writeText("\n");
+        }
+
+        if ($definition->getOptions()) {
+            $laterOptions = array();
+
+            $this->writeText('<comment>Options:</comment>', $options);
+            foreach ($definition->getOptions() as $option) {
+                if (strlen($option->getShortcut()) > 1) {
+                    $laterOptions[] = $option;
+                    continue;
+                }
+                $this->writeText("\n");
+                $this->describeInputOption($option, array_merge($options, array('total_width' => $totalWidth)));
+            }
+            foreach ($laterOptions as $option) {
+                $this->writeText("\n");
+                $this->describeInputOption($option, array_merge($options, array('total_width' => $totalWidth)));
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeCommand(Command $command, array $options = array())
+    {
+        $command->getSynopsis(true);
+        $command->getSynopsis(false);
+        $command->mergeApplicationDefinition(false);
+
+        $this->writeText('<comment>Usage:</comment>', $options);
+        foreach (array_merge(array($command->getSynopsis(true)), $command->getAliases(), $command->getUsages()) as $usage) {
+            $this->writeText("\n");
+            $this->writeText('  '.$usage, $options);
+        }
+        $this->writeText("\n");
+
+        $definition = $command->getNativeDefinition();
+        if ($definition->getOptions() || $definition->getArguments()) {
+            $this->writeText("\n");
+            $this->describeInputDefinition($definition, $options);
+            $this->writeText("\n");
+        }
+
+        if ($help = $command->getProcessedHelp()) {
+            $this->writeText("\n");
+            $this->writeText('<comment>Help:</comment>', $options);
+            $this->writeText("\n");
+            $this->writeText('  '.str_replace("\n", "\n  ", $help), $options);
+            $this->writeText("\n");
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeApplication(Application $application, array $options = array())
+    {
+        $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
+        $description = new ApplicationDescription($application, $describedNamespace);
+
+        if (isset($options['raw_text']) && $options['raw_text']) {
+            $width = $this->getColumnWidth($description->getCommands());
+
+            foreach ($description->getCommands() as $command) {
+                $this->writeText(sprintf("%-{$width}s %s", $command->getName(), $command->getDescription()), $options);
+                $this->writeText("\n");
+            }
+        } else {
+            if ('' != $help = $application->getHelp()) {
+                $this->writeText("$help\n\n", $options);
+            }
+
+            $this->writeText("<comment>Usage:</comment>\n", $options);
+            $this->writeText("  command [options] [arguments]\n\n", $options);
+
+            $this->describeInputDefinition(new InputDefinition($application->getDefinition()->getOptions()), $options);
+
+            $this->writeText("\n");
+            $this->writeText("\n");
+
+            $width = $this->getColumnWidth($description->getCommands());
+
+            if ($describedNamespace) {
+                $this->writeText(sprintf('<comment>Available commands for the "%s" namespace:</comment>', $describedNamespace), $options);
+            } else {
+                $this->writeText('<comment>Available commands:</comment>', $options);
+            }
+
+            // add commands by namespace
+            foreach ($description->getNamespaces() as $namespace) {
+                if (!$describedNamespace && ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {
+                    $this->writeText("\n");
+                    $this->writeText(' <comment>'.$namespace['id'].'</comment>', $options);
+                }
+
+                foreach ($namespace['commands'] as $name) {
+                    $this->writeText("\n");
+                    $spacingWidth = $width - strlen($name);
+                    $this->writeText(sprintf('  <info>%s</info>%s%s', $name, str_repeat(' ', $spacingWidth), $description->getCommand($name)->getDescription()), $options);
+                }
+            }
+
+            $this->writeText("\n");
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    private function writeText($content, array $options = array())
+    {
+        $this->write(
+            isset($options['raw_text']) && $options['raw_text'] ? strip_tags($content) : $content,
+            isset($options['raw_output']) ? !$options['raw_output'] : true
+        );
+    }
+
+    /**
+     * Formats input option/argument default value.
+     *
+     * @param mixed $default
+     *
+     * @return string
+     */
+    private function formatDefaultValue($default)
+    {
+        if (PHP_VERSION_ID < 50400) {
+            return str_replace(array('\/', '\\\\'), array('/', '\\'), json_encode($default));
+        }
+
+        return str_replace('\\\\', '\\', json_encode($default, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
+    }
+
+    /**
+     * @param Command[] $commands
+     *
+     * @return int
+     */
+    private function getColumnWidth(array $commands)
+    {
+        $widths = array();
+
+        foreach ($commands as $command) {
+            $widths[] = strlen($command->getName());
+            foreach ($command->getAliases() as $alias) {
+                $widths[] = strlen($alias);
+            }
+        }
+
+        return max($widths) + 2;
+    }
+
+    /**
+     * @param InputOption[] $options
+     *
+     * @return int
+     */
+    private function calculateTotalWidthForOptions($options)
+    {
+        $totalWidth = 0;
+        foreach ($options as $option) {
+            // "-" + shortcut + ", --" + name
+            $nameLength = 1 + max(strlen($option->getShortcut()), 1) + 4 + strlen($option->getName());
+
+            if ($option->acceptValue()) {
+                $valueLength = 1 + strlen($option->getName()); // = + value
+                $valueLength += $option->isValueOptional() ? 2 : 0; // [ + ]
+
+                $nameLength += $valueLength;
+            }
+            $totalWidth = max($totalWidth, $nameLength);
+        }
+
+        return $totalWidth;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Descriptor/XmlDescriptor.php
@@ -0,0 +1,263 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Descriptor;
+
+use Symfony\Component\Console\Application;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputDefinition;
+use Symfony\Component\Console\Input\InputOption;
+
+/**
+ * XML descriptor.
+ *
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ *
+ * @internal
+ */
+class XmlDescriptor extends Descriptor
+{
+    /**
+     * @param InputDefinition $definition
+     *
+     * @return \DOMDocument
+     */
+    public function getInputDefinitionDocument(InputDefinition $definition)
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+        $dom->appendChild($definitionXML = $dom->createElement('definition'));
+
+        $definitionXML->appendChild($argumentsXML = $dom->createElement('arguments'));
+        foreach ($definition->getArguments() as $argument) {
+            $this->appendDocument($argumentsXML, $this->getInputArgumentDocument($argument));
+        }
+
+        $definitionXML->appendChild($optionsXML = $dom->createElement('options'));
+        foreach ($definition->getOptions() as $option) {
+            $this->appendDocument($optionsXML, $this->getInputOptionDocument($option));
+        }
+
+        return $dom;
+    }
+
+    /**
+     * @param Command $command
+     *
+     * @return \DOMDocument
+     */
+    public function getCommandDocument(Command $command)
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+        $dom->appendChild($commandXML = $dom->createElement('command'));
+
+        $command->getSynopsis();
+        $command->mergeApplicationDefinition(false);
+
+        $commandXML->setAttribute('id', $command->getName());
+        $commandXML->setAttribute('name', $command->getName());
+
+        $commandXML->appendChild($usagesXML = $dom->createElement('usages'));
+
+        foreach (array_merge(array($command->getSynopsis()), $command->getAliases(), $command->getUsages()) as $usage) {
+            $usagesXML->appendChild($dom->createElement('usage', $usage));
+        }
+
+        $commandXML->appendChild($descriptionXML = $dom->createElement('description'));
+        $descriptionXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getDescription())));
+
+        $commandXML->appendChild($helpXML = $dom->createElement('help'));
+        $helpXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getProcessedHelp())));
+
+        $definitionXML = $this->getInputDefinitionDocument($command->getNativeDefinition());
+        $this->appendDocument($commandXML, $definitionXML->getElementsByTagName('definition')->item(0));
+
+        return $dom;
+    }
+
+    /**
+     * @param Application $application
+     * @param string|null $namespace
+     *
+     * @return \DOMDocument
+     */
+    public function getApplicationDocument(Application $application, $namespace = null)
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+        $dom->appendChild($rootXml = $dom->createElement('symfony'));
+
+        if ($application->getName() !== 'UNKNOWN') {
+            $rootXml->setAttribute('name', $application->getName());
+            if ($application->getVersion() !== 'UNKNOWN') {
+                $rootXml->setAttribute('version', $application->getVersion());
+            }
+        }
+
+        $rootXml->appendChild($commandsXML = $dom->createElement('commands'));
+
+        $description = new ApplicationDescription($application, $namespace);
+
+        if ($namespace) {
+            $commandsXML->setAttribute('namespace', $namespace);
+        }
+
+        foreach ($description->getCommands() as $command) {
+            $this->appendDocument($commandsXML, $this->getCommandDocument($command));
+        }
+
+        if (!$namespace) {
+            $rootXml->appendChild($namespacesXML = $dom->createElement('namespaces'));
+
+            foreach ($description->getNamespaces() as $namespaceDescription) {
+                $namespacesXML->appendChild($namespaceArrayXML = $dom->createElement('namespace'));
+                $namespaceArrayXML->setAttribute('id', $namespaceDescription['id']);
+
+                foreach ($namespaceDescription['commands'] as $name) {
+                    $namespaceArrayXML->appendChild($commandXML = $dom->createElement('command'));
+                    $commandXML->appendChild($dom->createTextNode($name));
+                }
+            }
+        }
+
+        return $dom;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeInputArgument(InputArgument $argument, array $options = array())
+    {
+        $this->writeDocument($this->getInputArgumentDocument($argument));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeInputOption(InputOption $option, array $options = array())
+    {
+        $this->writeDocument($this->getInputOptionDocument($option));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeInputDefinition(InputDefinition $definition, array $options = array())
+    {
+        $this->writeDocument($this->getInputDefinitionDocument($definition));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeCommand(Command $command, array $options = array())
+    {
+        $this->writeDocument($this->getCommandDocument($command));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function describeApplication(Application $application, array $options = array())
+    {
+        $this->writeDocument($this->getApplicationDocument($application, isset($options['namespace']) ? $options['namespace'] : null));
+    }
+
+    /**
+     * Appends document children to parent node.
+     *
+     * @param \DOMNode $parentNode
+     * @param \DOMNode $importedParent
+     */
+    private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent)
+    {
+        foreach ($importedParent->childNodes as $childNode) {
+            $parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, true));
+        }
+    }
+
+    /**
+     * Writes DOM document.
+     *
+     * @param \DOMDocument $dom
+     *
+     * @return \DOMDocument|string
+     */
+    private function writeDocument(\DOMDocument $dom)
+    {
+        $dom->formatOutput = true;
+        $this->write($dom->saveXML());
+    }
+
+    /**
+     * @param InputArgument $argument
+     *
+     * @return \DOMDocument
+     */
+    private function getInputArgumentDocument(InputArgument $argument)
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+
+        $dom->appendChild($objectXML = $dom->createElement('argument'));
+        $objectXML->setAttribute('name', $argument->getName());
+        $objectXML->setAttribute('is_required', $argument->isRequired() ? 1 : 0);
+        $objectXML->setAttribute('is_array', $argument->isArray() ? 1 : 0);
+        $objectXML->appendChild($descriptionXML = $dom->createElement('description'));
+        $descriptionXML->appendChild($dom->createTextNode($argument->getDescription()));
+
+        $objectXML->appendChild($defaultsXML = $dom->createElement('defaults'));
+        $defaults = is_array($argument->getDefault()) ? $argument->getDefault() : (is_bool($argument->getDefault()) ? array(var_export($argument->getDefault(), true)) : ($argument->getDefault() ? array($argument->getDefault()) : array()));
+        foreach ($defaults as $default) {
+            $defaultsXML->appendChild($defaultXML = $dom->createElement('default'));
+            $defaultXML->appendChild($dom->createTextNode($default));
+        }
+
+        return $dom;
+    }
+
+    /**
+     * @param InputOption $option
+     *
+     * @return \DOMDocument
+     */
+    private function getInputOptionDocument(InputOption $option)
+    {
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+
+        $dom->appendChild($objectXML = $dom->createElement('option'));
+        $objectXML->setAttribute('name', '--'.$option->getName());
+        $pos = strpos($option->getShortcut(), '|');
+        if (false !== $pos) {
+            $objectXML->setAttribute('shortcut', '-'.substr($option->getShortcut(), 0, $pos));
+            $objectXML->setAttribute('shortcuts', '-'.implode('|-', explode('|', $option->getShortcut())));
+        } else {
+            $objectXML->setAttribute('shortcut', $option->getShortcut() ? '-'.$option->getShortcut() : '');
+        }
+        $objectXML->setAttribute('accept_value', $option->acceptValue() ? 1 : 0);
+        $objectXML->setAttribute('is_value_required', $option->isValueRequired() ? 1 : 0);
+        $objectXML->setAttribute('is_multiple', $option->isArray() ? 1 : 0);
+        $objectXML->appendChild($descriptionXML = $dom->createElement('description'));
+        $descriptionXML->appendChild($dom->createTextNode($option->getDescription()));
+
+        if ($option->acceptValue()) {
+            $defaults = is_array($option->getDefault()) ? $option->getDefault() : (is_bool($option->getDefault()) ? array(var_export($option->getDefault(), true)) : ($option->getDefault() ? array($option->getDefault()) : array()));
+            $objectXML->appendChild($defaultsXML = $dom->createElement('defaults'));
+
+            if (!empty($defaults)) {
+                foreach ($defaults as $default) {
+                    $defaultsXML->appendChild($defaultXML = $dom->createElement('default'));
+                    $defaultXML->appendChild($dom->createTextNode($default));
+                }
+            }
+        }
+
+        return $dom;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Event/ConsoleCommandEvent.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Event;
+
+/**
+ * Allows to do things before the command is executed, like skipping the command or changing the input.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ConsoleCommandEvent extends ConsoleEvent
+{
+    /**
+     * The return code for skipped commands, this will also be passed into the terminate event.
+     */
+    const RETURN_CODE_DISABLED = 113;
+
+    /**
+     * Indicates if the command should be run or skipped.
+     *
+     * @var bool
+     */
+    private $commandShouldRun = true;
+
+    /**
+     * Disables the command, so it won't be run.
+     *
+     * @return bool
+     */
+    public function disableCommand()
+    {
+        return $this->commandShouldRun = false;
+    }
+
+    /**
+     * Enables the command.
+     *
+     * @return bool
+     */
+    public function enableCommand()
+    {
+        return $this->commandShouldRun = true;
+    }
+
+    /**
+     * Returns true if the command is runnable, false otherwise.
+     *
+     * @return bool
+     */
+    public function commandShouldRun()
+    {
+        return $this->commandShouldRun;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Event/ConsoleEvent.php
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Event;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Allows to inspect input and output of a command.
+ *
+ * @author Francesco Levorato <git@flevour.net>
+ */
+class ConsoleEvent extends Event
+{
+    protected $command;
+
+    private $input;
+    private $output;
+
+    public function __construct(Command $command, InputInterface $input, OutputInterface $output)
+    {
+        $this->command = $command;
+        $this->input = $input;
+        $this->output = $output;
+    }
+
+    /**
+     * Gets the command that is executed.
+     *
+     * @return Command A Command instance
+     */
+    public function getCommand()
+    {
+        return $this->command;
+    }
+
+    /**
+     * Gets the input instance.
+     *
+     * @return InputInterface An InputInterface instance
+     */
+    public function getInput()
+    {
+        return $this->input;
+    }
+
+    /**
+     * Gets the output instance.
+     *
+     * @return OutputInterface An OutputInterface instance
+     */
+    public function getOutput()
+    {
+        return $this->output;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Event/ConsoleExceptionEvent.php
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Event;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * Allows to handle exception thrown in a command.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ConsoleExceptionEvent extends ConsoleEvent
+{
+    private $exception;
+    private $exitCode;
+
+    public function __construct(Command $command, InputInterface $input, OutputInterface $output, \Exception $exception, $exitCode)
+    {
+        parent::__construct($command, $input, $output);
+
+        $this->setException($exception);
+        $this->exitCode = (int) $exitCode;
+    }
+
+    /**
+     * Returns the thrown exception.
+     *
+     * @return \Exception The thrown exception
+     */
+    public function getException()
+    {
+        return $this->exception;
+    }
+
+    /**
+     * Replaces the thrown exception.
+     *
+     * This exception will be thrown if no response is set in the event.
+     *
+     * @param \Exception $exception The thrown exception
+     */
+    public function setException(\Exception $exception)
+    {
+        $this->exception = $exception;
+    }
+
+    /**
+     * Gets the exit code.
+     *
+     * @return int The command exit code
+     */
+    public function getExitCode()
+    {
+        return $this->exitCode;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Event/ConsoleTerminateEvent.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Event;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * Allows to manipulate the exit code of a command after its execution.
+ *
+ * @author Francesco Levorato <git@flevour.net>
+ */
+class ConsoleTerminateEvent extends ConsoleEvent
+{
+    /**
+     * The exit code of the command.
+     *
+     * @var int
+     */
+    private $exitCode;
+
+    public function __construct(Command $command, InputInterface $input, OutputInterface $output, $exitCode)
+    {
+        parent::__construct($command, $input, $output);
+
+        $this->setExitCode($exitCode);
+    }
+
+    /**
+     * Sets the exit code.
+     *
+     * @param int $exitCode The command exit code
+     */
+    public function setExitCode($exitCode)
+    {
+        $this->exitCode = (int) $exitCode;
+    }
+
+    /**
+     * Gets the exit code.
+     *
+     * @return int The command exit code
+     */
+    public function getExitCode()
+    {
+        return $this->exitCode;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Exception/CommandNotFoundException.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Exception;
+
+/**
+ * Represents an incorrect command name typed in the console.
+ *
+ * @author Jérôme Tamarelle <jerome@tamarelle.net>
+ */
+class CommandNotFoundException extends \InvalidArgumentException implements ExceptionInterface
+{
+    private $alternatives;
+
+    /**
+     * @param string    $message      Exception message to throw
+     * @param array     $alternatives List of similar defined names
+     * @param int       $code         Exception code
+     * @param Exception $previous     previous exception used for the exception chaining
+     */
+    public function __construct($message, array $alternatives = array(), $code = 0, \Exception $previous = null)
+    {
+        parent::__construct($message, $code, $previous);
+
+        $this->alternatives = $alternatives;
+    }
+
+    /**
+     * @return array A list of similar defined names
+     */
+    public function getAlternatives()
+    {
+        return $this->alternatives;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Exception/ExceptionInterface.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Exception;
+
+/**
+ * ExceptionInterface.
+ *
+ * @author Jérôme Tamarelle <jerome@tamarelle.net>
+ */
+interface ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/console/Exception/InvalidArgumentException.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Exception;
+
+/**
+ * @author Jérôme Tamarelle <jerome@tamarelle.net>
+ */
+class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/console/Exception/InvalidOptionException.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Exception;
+
+/**
+ * Represents an incorrect option name typed in the console.
+ *
+ * @author Jérôme Tamarelle <jerome@tamarelle.net>
+ */
+class InvalidOptionException extends \InvalidArgumentException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/console/Exception/LogicException.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Exception;
+
+/**
+ * @author Jérôme Tamarelle <jerome@tamarelle.net>
+ */
+class LogicException extends \LogicException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/console/Exception/RuntimeException.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Exception;
+
+/**
+ * @author Jérôme Tamarelle <jerome@tamarelle.net>
+ */
+class RuntimeException extends \RuntimeException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/console/Formatter/OutputFormatter.php
@@ -0,0 +1,240 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Formatter;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+
+/**
+ * Formatter class for console output.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class OutputFormatter implements OutputFormatterInterface
+{
+    private $decorated;
+    private $styles = array();
+    private $styleStack;
+
+    /**
+     * Escapes "<" special char in given text.
+     *
+     * @param string $text Text to escape
+     *
+     * @return string Escaped text
+     */
+    public static function escape($text)
+    {
+        $text = preg_replace('/([^\\\\]?)</', '$1\\<', $text);
+
+        if ('\\' === substr($text, -1)) {
+            $len = strlen($text);
+            $text = rtrim($text, '\\');
+            $text .= str_repeat('<<', $len - strlen($text));
+        }
+
+        return $text;
+    }
+
+    /**
+     * Initializes console output formatter.
+     *
+     * @param bool                            $decorated Whether this formatter should actually decorate strings
+     * @param OutputFormatterStyleInterface[] $styles    Array of "name => FormatterStyle" instances
+     */
+    public function __construct($decorated = false, array $styles = array())
+    {
+        $this->decorated = (bool) $decorated;
+
+        $this->setStyle('error', new OutputFormatterStyle('white', 'red'));
+        $this->setStyle('info', new OutputFormatterStyle('green'));
+        $this->setStyle('comment', new OutputFormatterStyle('yellow'));
+        $this->setStyle('question', new OutputFormatterStyle('black', 'cyan'));
+
+        foreach ($styles as $name => $style) {
+            $this->setStyle($name, $style);
+        }
+
+        $this->styleStack = new OutputFormatterStyleStack();
+    }
+
+    /**
+     * Sets the decorated flag.
+     *
+     * @param bool $decorated Whether to decorate the messages or not
+     */
+    public function setDecorated($decorated)
+    {
+        $this->decorated = (bool) $decorated;
+    }
+
+    /**
+     * Gets the decorated flag.
+     *
+     * @return bool true if the output will decorate messages, false otherwise
+     */
+    public function isDecorated()
+    {
+        return $this->decorated;
+    }
+
+    /**
+     * Sets a new style.
+     *
+     * @param string                        $name  The style name
+     * @param OutputFormatterStyleInterface $style The style instance
+     */
+    public function setStyle($name, OutputFormatterStyleInterface $style)
+    {
+        $this->styles[strtolower($name)] = $style;
+    }
+
+    /**
+     * Checks if output formatter has style with specified name.
+     *
+     * @param string $name
+     *
+     * @return bool
+     */
+    public function hasStyle($name)
+    {
+        return isset($this->styles[strtolower($name)]);
+    }
+
+    /**
+     * Gets style options from style with specified name.
+     *
+     * @param string $name
+     *
+     * @return OutputFormatterStyleInterface
+     *
+     * @throws InvalidArgumentException When style isn't defined
+     */
+    public function getStyle($name)
+    {
+        if (!$this->hasStyle($name)) {
+            throw new InvalidArgumentException(sprintf('Undefined style: %s', $name));
+        }
+
+        return $this->styles[strtolower($name)];
+    }
+
+    /**
+     * Formats a message according to the given styles.
+     *
+     * @param string $message The message to style
+     *
+     * @return string The styled message
+     */
+    public function format($message)
+    {
+        $message = (string) $message;
+        $offset = 0;
+        $output = '';
+        $tagRegex = '[a-z][a-z0-9_=;-]*+';
+        preg_match_all("#<(($tagRegex) | /($tagRegex)?)>#ix", $message, $matches, PREG_OFFSET_CAPTURE);
+        foreach ($matches[0] as $i => $match) {
+            $pos = $match[1];
+            $text = $match[0];
+
+            if (0 != $pos && '\\' == $message[$pos - 1]) {
+                continue;
+            }
+
+            // add the text up to the next tag
+            $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset));
+            $offset = $pos + strlen($text);
+
+            // opening tag?
+            if ($open = '/' != $text[1]) {
+                $tag = $matches[1][$i][0];
+            } else {
+                $tag = isset($matches[3][$i][0]) ? $matches[3][$i][0] : '';
+            }
+
+            if (!$open && !$tag) {
+                // </>
+                $this->styleStack->pop();
+            } elseif (false === $style = $this->createStyleFromString(strtolower($tag))) {
+                $output .= $this->applyCurrentStyle($text);
+            } elseif ($open) {
+                $this->styleStack->push($style);
+            } else {
+                $this->styleStack->pop($style);
+            }
+        }
+
+        $output .= $this->applyCurrentStyle(substr($message, $offset));
+
+        if (false !== strpos($output, '<<')) {
+            return strtr($output, array('\\<' => '<', '<<' => '\\'));
+        }
+
+        return str_replace('\\<', '<', $output);
+    }
+
+    /**
+     * @return OutputFormatterStyleStack
+     */
+    public function getStyleStack()
+    {
+        return $this->styleStack;
+    }
+
+    /**
+     * Tries to create new style instance from string.
+     *
+     * @param string $string
+     *
+     * @return OutputFormatterStyle|bool false if string is not format string
+     */
+    private function createStyleFromString($string)
+    {
+        if (isset($this->styles[$string])) {
+            return $this->styles[$string];
+        }
+
+        if (!preg_match_all('/([^=]+)=([^;]+)(;|$)/', strtolower($string), $matches, PREG_SET_ORDER)) {
+            return false;
+        }
+
+        $style = new OutputFormatterStyle();
+        foreach ($matches as $match) {
+            array_shift($match);
+
+            if ('fg' == $match[0]) {
+                $style->setForeground($match[1]);
+            } elseif ('bg' == $match[0]) {
+                $style->setBackground($match[1]);
+            } else {
+                try {
+                    $style->setOption($match[1]);
+                } catch (\InvalidArgumentException $e) {
+                    return false;
+                }
+            }
+        }
+
+        return $style;
+    }
+
+    /**
+     * Applies current style from stack to text, if must be applied.
+     *
+     * @param string $text Input text
+     *
+     * @return string Styled text
+     */
+    private function applyCurrentStyle($text)
+    {
+        return $this->isDecorated() && strlen($text) > 0 ? $this->styleStack->getCurrent()->apply($text) : $text;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Formatter/OutputFormatterInterface.php
@@ -0,0 +1,69 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Formatter;
+
+/**
+ * Formatter interface for console output.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+interface OutputFormatterInterface
+{
+    /**
+     * Sets the decorated flag.
+     *
+     * @param bool $decorated Whether to decorate the messages or not
+     */
+    public function setDecorated($decorated);
+
+    /**
+     * Gets the decorated flag.
+     *
+     * @return bool true if the output will decorate messages, false otherwise
+     */
+    public function isDecorated();
+
+    /**
+     * Sets a new style.
+     *
+     * @param string                        $name  The style name
+     * @param OutputFormatterStyleInterface $style The style instance
+     */
+    public function setStyle($name, OutputFormatterStyleInterface $style);
+
+    /**
+     * Checks if output formatter has style with specified name.
+     *
+     * @param string $name
+     *
+     * @return bool
+     */
+    public function hasStyle($name);
+
+    /**
+     * Gets style options from style with specified name.
+     *
+     * @param string $name
+     *
+     * @return OutputFormatterStyleInterface
+     */
+    public function getStyle($name);
+
+    /**
+     * Formats a message according to the given styles.
+     *
+     * @param string $message The message to style
+     *
+     * @return string The styled message
+     */
+    public function format($message);
+}
--- /dev/null
+++ b/vendor/symfony/console/Formatter/OutputFormatterStyle.php
@@ -0,0 +1,221 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Formatter;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+
+/**
+ * Formatter style class for defining styles.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class OutputFormatterStyle implements OutputFormatterStyleInterface
+{
+    private static $availableForegroundColors = array(
+        'black' => array('set' => 30, 'unset' => 39),
+        'red' => array('set' => 31, 'unset' => 39),
+        'green' => array('set' => 32, 'unset' => 39),
+        'yellow' => array('set' => 33, 'unset' => 39),
+        'blue' => array('set' => 34, 'unset' => 39),
+        'magenta' => array('set' => 35, 'unset' => 39),
+        'cyan' => array('set' => 36, 'unset' => 39),
+        'white' => array('set' => 37, 'unset' => 39),
+        'default' => array('set' => 39, 'unset' => 39),
+    );
+    private static $availableBackgroundColors = array(
+        'black' => array('set' => 40, 'unset' => 49),
+        'red' => array('set' => 41, 'unset' => 49),
+        'green' => array('set' => 42, 'unset' => 49),
+        'yellow' => array('set' => 43, 'unset' => 49),
+        'blue' => array('set' => 44, 'unset' => 49),
+        'magenta' => array('set' => 45, 'unset' => 49),
+        'cyan' => array('set' => 46, 'unset' => 49),
+        'white' => array('set' => 47, 'unset' => 49),
+        'default' => array('set' => 49, 'unset' => 49),
+    );
+    private static $availableOptions = array(
+        'bold' => array('set' => 1, 'unset' => 22),
+        'underscore' => array('set' => 4, 'unset' => 24),
+        'blink' => array('set' => 5, 'unset' => 25),
+        'reverse' => array('set' => 7, 'unset' => 27),
+        'conceal' => array('set' => 8, 'unset' => 28),
+    );
+
+    private $foreground;
+    private $background;
+    private $options = array();
+
+    /**
+     * Initializes output formatter style.
+     *
+     * @param string|null $foreground The style foreground color name
+     * @param string|null $background The style background color name
+     * @param array       $options    The style options
+     */
+    public function __construct($foreground = null, $background = null, array $options = array())
+    {
+        if (null !== $foreground) {
+            $this->setForeground($foreground);
+        }
+        if (null !== $background) {
+            $this->setBackground($background);
+        }
+        if (count($options)) {
+            $this->setOptions($options);
+        }
+    }
+
+    /**
+     * Sets style foreground color.
+     *
+     * @param string|null $color The color name
+     *
+     * @throws InvalidArgumentException When the color name isn't defined
+     */
+    public function setForeground($color = null)
+    {
+        if (null === $color) {
+            $this->foreground = null;
+
+            return;
+        }
+
+        if (!isset(static::$availableForegroundColors[$color])) {
+            throw new InvalidArgumentException(sprintf(
+                'Invalid foreground color specified: "%s". Expected one of (%s)',
+                $color,
+                implode(', ', array_keys(static::$availableForegroundColors))
+            ));
+        }
+
+        $this->foreground = static::$availableForegroundColors[$color];
+    }
+
+    /**
+     * Sets style background color.
+     *
+     * @param string|null $color The color name
+     *
+     * @throws InvalidArgumentException When the color name isn't defined
+     */
+    public function setBackground($color = null)
+    {
+        if (null === $color) {
+            $this->background = null;
+
+            return;
+        }
+
+        if (!isset(static::$availableBackgroundColors[$color])) {
+            throw new InvalidArgumentException(sprintf(
+                'Invalid background color specified: "%s". Expected one of (%s)',
+                $color,
+                implode(', ', array_keys(static::$availableBackgroundColors))
+            ));
+        }
+
+        $this->background = static::$availableBackgroundColors[$color];
+    }
+
+    /**
+     * Sets some specific style option.
+     *
+     * @param string $option The option name
+     *
+     * @throws InvalidArgumentException When the option name isn't defined
+     */
+    public function setOption($option)
+    {
+        if (!isset(static::$availableOptions[$option])) {
+            throw new InvalidArgumentException(sprintf(
+                'Invalid option specified: "%s". Expected one of (%s)',
+                $option,
+                implode(', ', array_keys(static::$availableOptions))
+            ));
+        }
+
+        if (!in_array(static::$availableOptions[$option], $this->options)) {
+            $this->options[] = static::$availableOptions[$option];
+        }
+    }
+
+    /**
+     * Unsets some specific style option.
+     *
+     * @param string $option The option name
+     *
+     * @throws InvalidArgumentException When the option name isn't defined
+     */
+    public function unsetOption($option)
+    {
+        if (!isset(static::$availableOptions[$option])) {
+            throw new InvalidArgumentException(sprintf(
+                'Invalid option specified: "%s". Expected one of (%s)',
+                $option,
+                implode(', ', array_keys(static::$availableOptions))
+            ));
+        }
+
+        $pos = array_search(static::$availableOptions[$option], $this->options);
+        if (false !== $pos) {
+            unset($this->options[$pos]);
+        }
+    }
+
+    /**
+     * Sets multiple style options at once.
+     *
+     * @param array $options
+     */
+    public function setOptions(array $options)
+    {
+        $this->options = array();
+
+        foreach ($options as $option) {
+            $this->setOption($option);
+        }
+    }
+
+    /**
+     * Applies the style to a given text.
+     *
+     * @param string $text The text to style
+     *
+     * @return string
+     */
+    public function apply($text)
+    {
+        $setCodes = array();
+        $unsetCodes = array();
+
+        if (null !== $this->foreground) {
+            $setCodes[] = $this->foreground['set'];
+            $unsetCodes[] = $this->foreground['unset'];
+        }
+        if (null !== $this->background) {
+            $setCodes[] = $this->background['set'];
+            $unsetCodes[] = $this->background['unset'];
+        }
+        if (count($this->options)) {
+            foreach ($this->options as $option) {
+                $setCodes[] = $option['set'];
+                $unsetCodes[] = $option['unset'];
+            }
+        }
+
+        if (0 === count($setCodes)) {
+            return $text;
+        }
+
+        return sprintf("\033[%sm%s\033[%sm", implode(';', $setCodes), $text, implode(';', $unsetCodes));
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php
@@ -0,0 +1,64 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Formatter;
+
+/**
+ * Formatter style interface for defining styles.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+interface OutputFormatterStyleInterface
+{
+    /**
+     * Sets style foreground color.
+     *
+     * @param string $color The color name
+     */
+    public function setForeground($color = null);
+
+    /**
+     * Sets style background color.
+     *
+     * @param string $color The color name
+     */
+    public function setBackground($color = null);
+
+    /**
+     * Sets some specific style option.
+     *
+     * @param string $option The option name
+     */
+    public function setOption($option);
+
+    /**
+     * Unsets some specific style option.
+     *
+     * @param string $option The option name
+     */
+    public function unsetOption($option);
+
+    /**
+     * Sets multiple style options at once.
+     *
+     * @param array $options
+     */
+    public function setOptions(array $options);
+
+    /**
+     * Applies the style to a given text.
+     *
+     * @param string $text The text to style
+     *
+     * @return string
+     */
+    public function apply($text);
+}
--- /dev/null
+++ b/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php
@@ -0,0 +1,123 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Formatter;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+
+/**
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ */
+class OutputFormatterStyleStack
+{
+    /**
+     * @var OutputFormatterStyleInterface[]
+     */
+    private $styles;
+
+    /**
+     * @var OutputFormatterStyleInterface
+     */
+    private $emptyStyle;
+
+    /**
+     * Constructor.
+     *
+     * @param OutputFormatterStyleInterface|null $emptyStyle
+     */
+    public function __construct(OutputFormatterStyleInterface $emptyStyle = null)
+    {
+        $this->emptyStyle = $emptyStyle ?: new OutputFormatterStyle();
+        $this->reset();
+    }
+
+    /**
+     * Resets stack (ie. empty internal arrays).
+     */
+    public function reset()
+    {
+        $this->styles = array();
+    }
+
+    /**
+     * Pushes a style in the stack.
+     *
+     * @param OutputFormatterStyleInterface $style
+     */
+    public function push(OutputFormatterStyleInterface $style)
+    {
+        $this->styles[] = $style;
+    }
+
+    /**
+     * Pops a style from the stack.
+     *
+     * @param OutputFormatterStyleInterface|null $style
+     *
+     * @return OutputFormatterStyleInterface
+     *
+     * @throws InvalidArgumentException When style tags incorrectly nested
+     */
+    public function pop(OutputFormatterStyleInterface $style = null)
+    {
+        if (empty($this->styles)) {
+            return $this->emptyStyle;
+        }
+
+        if (null === $style) {
+            return array_pop($this->styles);
+        }
+
+        foreach (array_reverse($this->styles, true) as $index => $stackedStyle) {
+            if ($style->apply('') === $stackedStyle->apply('')) {
+                $this->styles = array_slice($this->styles, 0, $index);
+
+                return $stackedStyle;
+            }
+        }
+
+        throw new InvalidArgumentException('Incorrectly nested style tag found.');
+    }
+
+    /**
+     * Computes current style with stacks top codes.
+     *
+     * @return OutputFormatterStyle
+     */
+    public function getCurrent()
+    {
+        if (empty($this->styles)) {
+            return $this->emptyStyle;
+        }
+
+        return $this->styles[count($this->styles) - 1];
+    }
+
+    /**
+     * @param OutputFormatterStyleInterface $emptyStyle
+     *
+     * @return OutputFormatterStyleStack
+     */
+    public function setEmptyStyle(OutputFormatterStyleInterface $emptyStyle)
+    {
+        $this->emptyStyle = $emptyStyle;
+
+        return $this;
+    }
+
+    /**
+     * @return OutputFormatterStyleInterface
+     */
+    public function getEmptyStyle()
+    {
+        return $this->emptyStyle;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/DebugFormatterHelper.php
@@ -0,0 +1,127 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+/**
+ * Helps outputting debug information when running an external program from a command.
+ *
+ * An external program can be a Process, an HTTP request, or anything else.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class DebugFormatterHelper extends Helper
+{
+    private $colors = array('black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'default');
+    private $started = array();
+    private $count = -1;
+
+    /**
+     * Starts a debug formatting session.
+     *
+     * @param string $id      The id of the formatting session
+     * @param string $message The message to display
+     * @param string $prefix  The prefix to use
+     *
+     * @return string
+     */
+    public function start($id, $message, $prefix = 'RUN')
+    {
+        $this->started[$id] = array('border' => ++$this->count % count($this->colors));
+
+        return sprintf("%s<bg=blue;fg=white> %s </> <fg=blue>%s</>\n", $this->getBorder($id), $prefix, $message);
+    }
+
+    /**
+     * Adds progress to a formatting session.
+     *
+     * @param string $id          The id of the formatting session
+     * @param string $buffer      The message to display
+     * @param bool   $error       Whether to consider the buffer as error
+     * @param string $prefix      The prefix for output
+     * @param string $errorPrefix The prefix for error output
+     *
+     * @return string
+     */
+    public function progress($id, $buffer, $error = false, $prefix = 'OUT', $errorPrefix = 'ERR')
+    {
+        $message = '';
+
+        if ($error) {
+            if (isset($this->started[$id]['out'])) {
+                $message .= "\n";
+                unset($this->started[$id]['out']);
+            }
+            if (!isset($this->started[$id]['err'])) {
+                $message .= sprintf('%s<bg=red;fg=white> %s </> ', $this->getBorder($id), $errorPrefix);
+                $this->started[$id]['err'] = true;
+            }
+
+            $message .= str_replace("\n", sprintf("\n%s<bg=red;fg=white> %s </> ", $this->getBorder($id), $errorPrefix), $buffer);
+        } else {
+            if (isset($this->started[$id]['err'])) {
+                $message .= "\n";
+                unset($this->started[$id]['err']);
+            }
+            if (!isset($this->started[$id]['out'])) {
+                $message .= sprintf('%s<bg=green;fg=white> %s </> ', $this->getBorder($id), $prefix);
+                $this->started[$id]['out'] = true;
+            }
+
+            $message .= str_replace("\n", sprintf("\n%s<bg=green;fg=white> %s </> ", $this->getBorder($id), $prefix), $buffer);
+        }
+
+        return $message;
+    }
+
+    /**
+     * Stops a formatting session.
+     *
+     * @param string $id         The id of the formatting session
+     * @param string $message    The message to display
+     * @param bool   $successful Whether to consider the result as success
+     * @param string $prefix     The prefix for the end output
+     *
+     * @return string
+     */
+    public function stop($id, $message, $successful, $prefix = 'RES')
+    {
+        $trailingEOL = isset($this->started[$id]['out']) || isset($this->started[$id]['err']) ? "\n" : '';
+
+        if ($successful) {
+            return sprintf("%s%s<bg=green;fg=white> %s </> <fg=green>%s</>\n", $trailingEOL, $this->getBorder($id), $prefix, $message);
+        }
+
+        $message = sprintf("%s%s<bg=red;fg=white> %s </> <fg=red>%s</>\n", $trailingEOL, $this->getBorder($id), $prefix, $message);
+
+        unset($this->started[$id]['out'], $this->started[$id]['err']);
+
+        return $message;
+    }
+
+    /**
+     * @param string $id The id of the formatting session
+     *
+     * @return string
+     */
+    private function getBorder($id)
+    {
+        return sprintf('<bg=%s> </>', $this->colors[$this->started[$id]['border']]);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'debug_formatter';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/DescriptorHelper.php
@@ -0,0 +1,97 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Descriptor\DescriptorInterface;
+use Symfony\Component\Console\Descriptor\JsonDescriptor;
+use Symfony\Component\Console\Descriptor\MarkdownDescriptor;
+use Symfony\Component\Console\Descriptor\TextDescriptor;
+use Symfony\Component\Console\Descriptor\XmlDescriptor;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+
+/**
+ * This class adds helper method to describe objects in various formats.
+ *
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ */
+class DescriptorHelper extends Helper
+{
+    /**
+     * @var DescriptorInterface[]
+     */
+    private $descriptors = array();
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        $this
+            ->register('txt', new TextDescriptor())
+            ->register('xml', new XmlDescriptor())
+            ->register('json', new JsonDescriptor())
+            ->register('md', new MarkdownDescriptor())
+        ;
+    }
+
+    /**
+     * Describes an object if supported.
+     *
+     * Available options are:
+     * * format: string, the output format name
+     * * raw_text: boolean, sets output type as raw
+     *
+     * @param OutputInterface $output
+     * @param object          $object
+     * @param array           $options
+     *
+     * @throws InvalidArgumentException when the given format is not supported
+     */
+    public function describe(OutputInterface $output, $object, array $options = array())
+    {
+        $options = array_merge(array(
+            'raw_text' => false,
+            'format' => 'txt',
+        ), $options);
+
+        if (!isset($this->descriptors[$options['format']])) {
+            throw new InvalidArgumentException(sprintf('Unsupported format "%s".', $options['format']));
+        }
+
+        $descriptor = $this->descriptors[$options['format']];
+        $descriptor->describe($output, $object, $options);
+    }
+
+    /**
+     * Registers a descriptor.
+     *
+     * @param string              $format
+     * @param DescriptorInterface $descriptor
+     *
+     * @return DescriptorHelper
+     */
+    public function register($format, DescriptorInterface $descriptor)
+    {
+        $this->descriptors[$format] = $descriptor;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'descriptor';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/DialogHelper.php
@@ -0,0 +1,502 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Exception\RuntimeException;
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Formatter\OutputFormatterStyle;
+
+/**
+ * The Dialog class provides helpers to interact with the user.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 2.5, to be removed in 3.0.
+ *             Use {@link \Symfony\Component\Console\Helper\QuestionHelper} instead.
+ */
+class DialogHelper extends InputAwareHelper
+{
+    private $inputStream;
+    private static $shell;
+    private static $stty;
+
+    public function __construct($triggerDeprecationError = true)
+    {
+        if ($triggerDeprecationError) {
+            @trigger_error('"Symfony\Component\Console\Helper\DialogHelper" is deprecated since version 2.5 and will be removed in 3.0. Use "Symfony\Component\Console\Helper\QuestionHelper" instead.', E_USER_DEPRECATED);
+        }
+    }
+
+    /**
+     * Asks the user to select a value.
+     *
+     * @param OutputInterface $output       An Output instance
+     * @param string|array    $question     The question to ask
+     * @param array           $choices      List of choices to pick from
+     * @param bool|string     $default      The default answer if the user enters nothing
+     * @param bool|int        $attempts     Max number of times to ask before giving up (false by default, which means infinite)
+     * @param string          $errorMessage Message which will be shown if invalid value from choice list would be picked
+     * @param bool            $multiselect  Select more than one value separated by comma
+     *
+     * @return int|string|array The selected value or values (the key of the choices array)
+     *
+     * @throws InvalidArgumentException
+     */
+    public function select(OutputInterface $output, $question, $choices, $default = null, $attempts = false, $errorMessage = 'Value "%s" is invalid', $multiselect = false)
+    {
+        if ($output instanceof ConsoleOutputInterface) {
+            $output = $output->getErrorOutput();
+        }
+
+        $width = max(array_map('strlen', array_keys($choices)));
+
+        $messages = (array) $question;
+        foreach ($choices as $key => $value) {
+            $messages[] = sprintf("  [<info>%-{$width}s</info>] %s", $key, $value);
+        }
+
+        $output->writeln($messages);
+
+        $result = $this->askAndValidate($output, '> ', function ($picked) use ($choices, $errorMessage, $multiselect) {
+            // Collapse all spaces.
+            $selectedChoices = str_replace(' ', '', $picked);
+
+            if ($multiselect) {
+                // Check for a separated comma values
+                if (!preg_match('/^[a-zA-Z0-9_-]+(?:,[a-zA-Z0-9_-]+)*$/', $selectedChoices, $matches)) {
+                    throw new InvalidArgumentException(sprintf($errorMessage, $picked));
+                }
+                $selectedChoices = explode(',', $selectedChoices);
+            } else {
+                $selectedChoices = array($picked);
+            }
+
+            $multiselectChoices = array();
+
+            foreach ($selectedChoices as $value) {
+                if (empty($choices[$value])) {
+                    throw new InvalidArgumentException(sprintf($errorMessage, $value));
+                }
+                $multiselectChoices[] = $value;
+            }
+
+            if ($multiselect) {
+                return $multiselectChoices;
+            }
+
+            return $picked;
+        }, $attempts, $default);
+
+        return $result;
+    }
+
+    /**
+     * Asks a question to the user.
+     *
+     * @param OutputInterface $output       An Output instance
+     * @param string|array    $question     The question to ask
+     * @param string          $default      The default answer if none is given by the user
+     * @param array           $autocomplete List of values to autocomplete
+     *
+     * @return string The user answer
+     *
+     * @throws RuntimeException If there is no data to read in the input stream
+     */
+    public function ask(OutputInterface $output, $question, $default = null, array $autocomplete = null)
+    {
+        if ($this->input && !$this->input->isInteractive()) {
+            return $default;
+        }
+
+        if ($output instanceof ConsoleOutputInterface) {
+            $output = $output->getErrorOutput();
+        }
+
+        $output->write($question);
+
+        $inputStream = $this->inputStream ?: STDIN;
+
+        if (null === $autocomplete || !$this->hasSttyAvailable()) {
+            $ret = fgets($inputStream, 4096);
+            if (false === $ret) {
+                throw new RuntimeException('Aborted');
+            }
+            $ret = trim($ret);
+        } else {
+            $ret = '';
+
+            $i = 0;
+            $ofs = -1;
+            $matches = $autocomplete;
+            $numMatches = count($matches);
+
+            $sttyMode = shell_exec('stty -g');
+
+            // Disable icanon (so we can fread each keypress) and echo (we'll do echoing here instead)
+            shell_exec('stty -icanon -echo');
+
+            // Add highlighted text style
+            $output->getFormatter()->setStyle('hl', new OutputFormatterStyle('black', 'white'));
+
+            // Read a keypress
+            while (!feof($inputStream)) {
+                $c = fread($inputStream, 1);
+
+                // Backspace Character
+                if ("\177" === $c) {
+                    if (0 === $numMatches && 0 !== $i) {
+                        --$i;
+                        // Move cursor backwards
+                        $output->write("\033[1D");
+                    }
+
+                    if ($i === 0) {
+                        $ofs = -1;
+                        $matches = $autocomplete;
+                        $numMatches = count($matches);
+                    } else {
+                        $numMatches = 0;
+                    }
+
+                    // Pop the last character off the end of our string
+                    $ret = substr($ret, 0, $i);
+                } elseif ("\033" === $c) {
+                    // Did we read an escape sequence?
+                    $c .= fread($inputStream, 2);
+
+                    // A = Up Arrow. B = Down Arrow
+                    if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) {
+                        if ('A' === $c[2] && -1 === $ofs) {
+                            $ofs = 0;
+                        }
+
+                        if (0 === $numMatches) {
+                            continue;
+                        }
+
+                        $ofs += ('A' === $c[2]) ? -1 : 1;
+                        $ofs = ($numMatches + $ofs) % $numMatches;
+                    }
+                } elseif (ord($c) < 32) {
+                    if ("\t" === $c || "\n" === $c) {
+                        if ($numMatches > 0 && -1 !== $ofs) {
+                            $ret = $matches[$ofs];
+                            // Echo out remaining chars for current match
+                            $output->write(substr($ret, $i));
+                            $i = strlen($ret);
+                        }
+
+                        if ("\n" === $c) {
+                            $output->write($c);
+                            break;
+                        }
+
+                        $numMatches = 0;
+                    }
+
+                    continue;
+                } else {
+                    $output->write($c);
+                    $ret .= $c;
+                    ++$i;
+
+                    $numMatches = 0;
+                    $ofs = 0;
+
+                    foreach ($autocomplete as $value) {
+                        // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle)
+                        if (0 === strpos($value, $ret) && $i !== strlen($value)) {
+                            $matches[$numMatches++] = $value;
+                        }
+                    }
+                }
+
+                // Erase characters from cursor to end of line
+                $output->write("\033[K");
+
+                if ($numMatches > 0 && -1 !== $ofs) {
+                    // Save cursor position
+                    $output->write("\0337");
+                    // Write highlighted text
+                    $output->write('<hl>'.substr($matches[$ofs], $i).'</hl>');
+                    // Restore cursor position
+                    $output->write("\0338");
+                }
+            }
+
+            // Reset stty so it behaves normally again
+            shell_exec(sprintf('stty %s', $sttyMode));
+        }
+
+        return strlen($ret) > 0 ? $ret : $default;
+    }
+
+    /**
+     * Asks a confirmation to the user.
+     *
+     * The question will be asked until the user answers by nothing, yes, or no.
+     *
+     * @param OutputInterface $output   An Output instance
+     * @param string|array    $question The question to ask
+     * @param bool            $default  The default answer if the user enters nothing
+     *
+     * @return bool true if the user has confirmed, false otherwise
+     */
+    public function askConfirmation(OutputInterface $output, $question, $default = true)
+    {
+        $answer = 'z';
+        while ($answer && !in_array(strtolower($answer[0]), array('y', 'n'))) {
+            $answer = $this->ask($output, $question);
+        }
+
+        if (false === $default) {
+            return $answer && 'y' == strtolower($answer[0]);
+        }
+
+        return !$answer || 'y' == strtolower($answer[0]);
+    }
+
+    /**
+     * Asks a question to the user, the response is hidden.
+     *
+     * @param OutputInterface $output   An Output instance
+     * @param string|array    $question The question
+     * @param bool            $fallback In case the response can not be hidden, whether to fallback on non-hidden question or not
+     *
+     * @return string The answer
+     *
+     * @throws RuntimeException In case the fallback is deactivated and the response can not be hidden
+     */
+    public function askHiddenResponse(OutputInterface $output, $question, $fallback = true)
+    {
+        if ($output instanceof ConsoleOutputInterface) {
+            $output = $output->getErrorOutput();
+        }
+
+        if ('\\' === DIRECTORY_SEPARATOR) {
+            $exe = __DIR__.'/../Resources/bin/hiddeninput.exe';
+
+            // handle code running from a phar
+            if ('phar:' === substr(__FILE__, 0, 5)) {
+                $tmpExe = sys_get_temp_dir().'/hiddeninput.exe';
+                copy($exe, $tmpExe);
+                $exe = $tmpExe;
+            }
+
+            $output->write($question);
+            $value = rtrim(shell_exec($exe));
+            $output->writeln('');
+
+            if (isset($tmpExe)) {
+                unlink($tmpExe);
+            }
+
+            return $value;
+        }
+
+        if ($this->hasSttyAvailable()) {
+            $output->write($question);
+
+            $sttyMode = shell_exec('stty -g');
+
+            shell_exec('stty -echo');
+            $value = fgets($this->inputStream ?: STDIN, 4096);
+            shell_exec(sprintf('stty %s', $sttyMode));
+
+            if (false === $value) {
+                throw new RuntimeException('Aborted');
+            }
+
+            $value = trim($value);
+            $output->writeln('');
+
+            return $value;
+        }
+
+        if (false !== $shell = $this->getShell()) {
+            $output->write($question);
+            $readCmd = $shell === 'csh' ? 'set mypassword = $<' : 'read -r mypassword';
+            $command = sprintf("/usr/bin/env %s -c 'stty -echo; %s; stty echo; echo \$mypassword'", $shell, $readCmd);
+            $value = rtrim(shell_exec($command));
+            $output->writeln('');
+
+            return $value;
+        }
+
+        if ($fallback) {
+            return $this->ask($output, $question);
+        }
+
+        throw new RuntimeException('Unable to hide the response');
+    }
+
+    /**
+     * Asks for a value and validates the response.
+     *
+     * The validator receives the data to validate. It must return the
+     * validated data when the data is valid and throw an exception
+     * otherwise.
+     *
+     * @param OutputInterface $output       An Output instance
+     * @param string|array    $question     The question to ask
+     * @param callable        $validator    A PHP callback
+     * @param int|false       $attempts     Max number of times to ask before giving up (false by default, which means infinite)
+     * @param string          $default      The default answer if none is given by the user
+     * @param array           $autocomplete List of values to autocomplete
+     *
+     * @return mixed
+     *
+     * @throws \Exception When any of the validators return an error
+     */
+    public function askAndValidate(OutputInterface $output, $question, $validator, $attempts = false, $default = null, array $autocomplete = null)
+    {
+        $that = $this;
+
+        $interviewer = function () use ($output, $question, $default, $autocomplete, $that) {
+            return $that->ask($output, $question, $default, $autocomplete);
+        };
+
+        return $this->validateAttempts($interviewer, $output, $validator, $attempts);
+    }
+
+    /**
+     * Asks for a value, hide and validates the response.
+     *
+     * The validator receives the data to validate. It must return the
+     * validated data when the data is valid and throw an exception
+     * otherwise.
+     *
+     * @param OutputInterface $output    An Output instance
+     * @param string|array    $question  The question to ask
+     * @param callable        $validator A PHP callback
+     * @param int|false       $attempts  Max number of times to ask before giving up (false by default, which means infinite)
+     * @param bool            $fallback  In case the response can not be hidden, whether to fallback on non-hidden question or not
+     *
+     * @return string The response
+     *
+     * @throws \Exception       When any of the validators return an error
+     * @throws RuntimeException In case the fallback is deactivated and the response can not be hidden
+     */
+    public function askHiddenResponseAndValidate(OutputInterface $output, $question, $validator, $attempts = false, $fallback = true)
+    {
+        $that = $this;
+
+        $interviewer = function () use ($output, $question, $fallback, $that) {
+            return $that->askHiddenResponse($output, $question, $fallback);
+        };
+
+        return $this->validateAttempts($interviewer, $output, $validator, $attempts);
+    }
+
+    /**
+     * Sets the input stream to read from when interacting with the user.
+     *
+     * This is mainly useful for testing purpose.
+     *
+     * @param resource $stream The input stream
+     */
+    public function setInputStream($stream)
+    {
+        $this->inputStream = $stream;
+    }
+
+    /**
+     * Returns the helper's input stream.
+     *
+     * @return resource|null The input stream or null if the default STDIN is used
+     */
+    public function getInputStream()
+    {
+        return $this->inputStream;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'dialog';
+    }
+
+    /**
+     * Return a valid Unix shell.
+     *
+     * @return string|bool The valid shell name, false in case no valid shell is found
+     */
+    private function getShell()
+    {
+        if (null !== self::$shell) {
+            return self::$shell;
+        }
+
+        self::$shell = false;
+
+        if (file_exists('/usr/bin/env')) {
+            // handle other OSs with bash/zsh/ksh/csh if available to hide the answer
+            $test = "/usr/bin/env %s -c 'echo OK' 2> /dev/null";
+            foreach (array('bash', 'zsh', 'ksh', 'csh') as $sh) {
+                if ('OK' === rtrim(shell_exec(sprintf($test, $sh)))) {
+                    self::$shell = $sh;
+                    break;
+                }
+            }
+        }
+
+        return self::$shell;
+    }
+
+    private function hasSttyAvailable()
+    {
+        if (null !== self::$stty) {
+            return self::$stty;
+        }
+
+        exec('stty 2>&1', $output, $exitcode);
+
+        return self::$stty = $exitcode === 0;
+    }
+
+    /**
+     * Validate an attempt.
+     *
+     * @param callable        $interviewer A callable that will ask for a question and return the result
+     * @param OutputInterface $output      An Output instance
+     * @param callable        $validator   A PHP callback
+     * @param int|false       $attempts    Max number of times to ask before giving up; false will ask infinitely
+     *
+     * @return string The validated response
+     *
+     * @throws \Exception In case the max number of attempts has been reached and no valid response has been given
+     */
+    private function validateAttempts($interviewer, OutputInterface $output, $validator, $attempts)
+    {
+        if ($output instanceof ConsoleOutputInterface) {
+            $output = $output->getErrorOutput();
+        }
+
+        $e = null;
+        while (false === $attempts || $attempts--) {
+            if (null !== $e) {
+                $output->writeln($this->getHelperSet()->get('formatter')->formatBlock($e->getMessage(), 'error'));
+            }
+
+            try {
+                return call_user_func($validator, $interviewer());
+            } catch (\Exception $e) {
+            }
+        }
+
+        throw $e;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/FormatterHelper.php
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Formatter\OutputFormatter;
+
+/**
+ * The Formatter class provides helpers to format messages.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class FormatterHelper extends Helper
+{
+    /**
+     * Formats a message within a section.
+     *
+     * @param string $section The section name
+     * @param string $message The message
+     * @param string $style   The style to apply to the section
+     *
+     * @return string The format section
+     */
+    public function formatSection($section, $message, $style = 'info')
+    {
+        return sprintf('<%s>[%s]</%s> %s', $style, $section, $style, $message);
+    }
+
+    /**
+     * Formats a message as a block of text.
+     *
+     * @param string|array $messages The message to write in the block
+     * @param string       $style    The style to apply to the whole block
+     * @param bool         $large    Whether to return a large block
+     *
+     * @return string The formatter message
+     */
+    public function formatBlock($messages, $style, $large = false)
+    {
+        if (!is_array($messages)) {
+            $messages = array($messages);
+        }
+
+        $len = 0;
+        $lines = array();
+        foreach ($messages as $message) {
+            $message = OutputFormatter::escape($message);
+            $lines[] = sprintf($large ? '  %s  ' : ' %s ', $message);
+            $len = max($this->strlen($message) + ($large ? 4 : 2), $len);
+        }
+
+        $messages = $large ? array(str_repeat(' ', $len)) : array();
+        for ($i = 0; isset($lines[$i]); ++$i) {
+            $messages[] = $lines[$i].str_repeat(' ', $len - $this->strlen($lines[$i]));
+        }
+        if ($large) {
+            $messages[] = str_repeat(' ', $len);
+        }
+
+        for ($i = 0; isset($messages[$i]); ++$i) {
+            $messages[$i] = sprintf('<%s>%s</%s>', $style, $messages[$i], $style);
+        }
+
+        return implode("\n", $messages);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'formatter';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/Helper.php
@@ -0,0 +1,119 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Formatter\OutputFormatterInterface;
+
+/**
+ * Helper is the base class for all helper classes.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class Helper implements HelperInterface
+{
+    protected $helperSet = null;
+
+    /**
+     * Sets the helper set associated with this helper.
+     *
+     * @param HelperSet $helperSet A HelperSet instance
+     */
+    public function setHelperSet(HelperSet $helperSet = null)
+    {
+        $this->helperSet = $helperSet;
+    }
+
+    /**
+     * Gets the helper set associated with this helper.
+     *
+     * @return HelperSet A HelperSet instance
+     */
+    public function getHelperSet()
+    {
+        return $this->helperSet;
+    }
+
+    /**
+     * Returns the length of a string, using mb_strwidth if it is available.
+     *
+     * @param string $string The string to check its length
+     *
+     * @return int The length of the string
+     */
+    public static function strlen($string)
+    {
+        if (false === $encoding = mb_detect_encoding($string, null, true)) {
+            return strlen($string);
+        }
+
+        return mb_strwidth($string, $encoding);
+    }
+
+    public static function formatTime($secs)
+    {
+        static $timeFormats = array(
+            array(0, '< 1 sec'),
+            array(1, '1 sec'),
+            array(2, 'secs', 1),
+            array(60, '1 min'),
+            array(120, 'mins', 60),
+            array(3600, '1 hr'),
+            array(7200, 'hrs', 3600),
+            array(86400, '1 day'),
+            array(172800, 'days', 86400),
+        );
+
+        foreach ($timeFormats as $index => $format) {
+            if ($secs >= $format[0]) {
+                if ((isset($timeFormats[$index + 1]) && $secs < $timeFormats[$index + 1][0])
+                    || $index == count($timeFormats) - 1
+                ) {
+                    if (2 == count($format)) {
+                        return $format[1];
+                    }
+
+                    return floor($secs / $format[2]).' '.$format[1];
+                }
+            }
+        }
+    }
+
+    public static function formatMemory($memory)
+    {
+        if ($memory >= 1024 * 1024 * 1024) {
+            return sprintf('%.1f GiB', $memory / 1024 / 1024 / 1024);
+        }
+
+        if ($memory >= 1024 * 1024) {
+            return sprintf('%.1f MiB', $memory / 1024 / 1024);
+        }
+
+        if ($memory >= 1024) {
+            return sprintf('%d KiB', $memory / 1024);
+        }
+
+        return sprintf('%d B', $memory);
+    }
+
+    public static function strlenWithoutDecoration(OutputFormatterInterface $formatter, $string)
+    {
+        $isDecorated = $formatter->isDecorated();
+        $formatter->setDecorated(false);
+        // remove <...> formatting
+        $string = $formatter->format($string);
+        // remove already formatted characters
+        $string = preg_replace("/\033\[[^m]*m/", '', $string);
+        $formatter->setDecorated($isDecorated);
+
+        return self::strlen($string);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/HelperInterface.php
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+/**
+ * HelperInterface is the interface all helpers must implement.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface HelperInterface
+{
+    /**
+     * Sets the helper set associated with this helper.
+     *
+     * @param HelperSet $helperSet A HelperSet instance
+     */
+    public function setHelperSet(HelperSet $helperSet = null);
+
+    /**
+     * Gets the helper set associated with this helper.
+     *
+     * @return HelperSet A HelperSet instance
+     */
+    public function getHelperSet();
+
+    /**
+     * Returns the canonical name of this helper.
+     *
+     * @return string The canonical name
+     */
+    public function getName();
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/HelperSet.php
@@ -0,0 +1,123 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+
+/**
+ * HelperSet represents a set of helpers to be used with a command.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class HelperSet implements \IteratorAggregate
+{
+    /**
+     * @var Helper[]
+     */
+    private $helpers = array();
+    private $command;
+
+    /**
+     * Constructor.
+     *
+     * @param Helper[] $helpers An array of helper
+     */
+    public function __construct(array $helpers = array())
+    {
+        foreach ($helpers as $alias => $helper) {
+            $this->set($helper, is_int($alias) ? null : $alias);
+        }
+    }
+
+    /**
+     * Sets a helper.
+     *
+     * @param HelperInterface $helper The helper instance
+     * @param string          $alias  An alias
+     */
+    public function set(HelperInterface $helper, $alias = null)
+    {
+        $this->helpers[$helper->getName()] = $helper;
+        if (null !== $alias) {
+            $this->helpers[$alias] = $helper;
+        }
+
+        $helper->setHelperSet($this);
+    }
+
+    /**
+     * Returns true if the helper if defined.
+     *
+     * @param string $name The helper name
+     *
+     * @return bool true if the helper is defined, false otherwise
+     */
+    public function has($name)
+    {
+        return isset($this->helpers[$name]);
+    }
+
+    /**
+     * Gets a helper value.
+     *
+     * @param string $name The helper name
+     *
+     * @return HelperInterface The helper instance
+     *
+     * @throws InvalidArgumentException if the helper is not defined
+     */
+    public function get($name)
+    {
+        if (!$this->has($name)) {
+            throw new InvalidArgumentException(sprintf('The helper "%s" is not defined.', $name));
+        }
+
+        if ('dialog' === $name && $this->helpers[$name] instanceof DialogHelper) {
+            @trigger_error('"Symfony\Component\Console\Helper\DialogHelper" is deprecated since version 2.5 and will be removed in 3.0. Use "Symfony\Component\Console\Helper\QuestionHelper" instead.', E_USER_DEPRECATED);
+        } elseif ('progress' === $name && $this->helpers[$name] instanceof ProgressHelper) {
+            @trigger_error('"Symfony\Component\Console\Helper\ProgressHelper" is deprecated since version 2.5 and will be removed in 3.0. Use "Symfony\Component\Console\Helper\ProgressBar" instead.', E_USER_DEPRECATED);
+        } elseif ('table' === $name && $this->helpers[$name] instanceof TableHelper) {
+            @trigger_error('"Symfony\Component\Console\Helper\TableHelper" is deprecated since version 2.5 and will be removed in 3.0. Use "Symfony\Component\Console\Helper\Table" instead.', E_USER_DEPRECATED);
+        }
+
+        return $this->helpers[$name];
+    }
+
+    /**
+     * Sets the command associated with this helper set.
+     *
+     * @param Command $command A Command instance
+     */
+    public function setCommand(Command $command = null)
+    {
+        $this->command = $command;
+    }
+
+    /**
+     * Gets the command associated with this helper set.
+     *
+     * @return Command A Command instance
+     */
+    public function getCommand()
+    {
+        return $this->command;
+    }
+
+    /**
+     * @return Helper[]
+     */
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->helpers);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/InputAwareHelper.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputAwareInterface;
+
+/**
+ * An implementation of InputAwareInterface for Helpers.
+ *
+ * @author Wouter J <waldio.webdesign@gmail.com>
+ */
+abstract class InputAwareHelper extends Helper implements InputAwareInterface
+{
+    protected $input;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setInput(InputInterface $input)
+    {
+        $this->input = $input;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/ProcessHelper.php
@@ -0,0 +1,151 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Process\Exception\ProcessFailedException;
+use Symfony\Component\Process\Process;
+use Symfony\Component\Process\ProcessBuilder;
+
+/**
+ * The ProcessHelper class provides helpers to run external processes.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ProcessHelper extends Helper
+{
+    /**
+     * Runs an external process.
+     *
+     * @param OutputInterface      $output    An OutputInterface instance
+     * @param string|array|Process $cmd       An instance of Process or an array of arguments to escape and run or a command to run
+     * @param string|null          $error     An error message that must be displayed if something went wrong
+     * @param callable|null        $callback  A PHP callback to run whenever there is some
+     *                                        output available on STDOUT or STDERR
+     * @param int                  $verbosity The threshold for verbosity
+     *
+     * @return Process The process that ran
+     */
+    public function run(OutputInterface $output, $cmd, $error = null, $callback = null, $verbosity = OutputInterface::VERBOSITY_VERY_VERBOSE)
+    {
+        if ($output instanceof ConsoleOutputInterface) {
+            $output = $output->getErrorOutput();
+        }
+
+        $formatter = $this->getHelperSet()->get('debug_formatter');
+
+        if (is_array($cmd)) {
+            $process = ProcessBuilder::create($cmd)->getProcess();
+        } elseif ($cmd instanceof Process) {
+            $process = $cmd;
+        } else {
+            $process = new Process($cmd);
+        }
+
+        if ($verbosity <= $output->getVerbosity()) {
+            $output->write($formatter->start(spl_object_hash($process), $this->escapeString($process->getCommandLine())));
+        }
+
+        if ($output->isDebug()) {
+            $callback = $this->wrapCallback($output, $process, $callback);
+        }
+
+        $process->run($callback);
+
+        if ($verbosity <= $output->getVerbosity()) {
+            $message = $process->isSuccessful() ? 'Command ran successfully' : sprintf('%s Command did not run successfully', $process->getExitCode());
+            $output->write($formatter->stop(spl_object_hash($process), $message, $process->isSuccessful()));
+        }
+
+        if (!$process->isSuccessful() && null !== $error) {
+            $output->writeln(sprintf('<error>%s</error>', $this->escapeString($error)));
+        }
+
+        return $process;
+    }
+
+    /**
+     * Runs the process.
+     *
+     * This is identical to run() except that an exception is thrown if the process
+     * exits with a non-zero exit code.
+     *
+     * @param OutputInterface $output   An OutputInterface instance
+     * @param string|Process  $cmd      An instance of Process or a command to run
+     * @param string|null     $error    An error message that must be displayed if something went wrong
+     * @param callable|null   $callback A PHP callback to run whenever there is some
+     *                                  output available on STDOUT or STDERR
+     *
+     * @return Process The process that ran
+     *
+     * @throws ProcessFailedException
+     *
+     * @see run()
+     */
+    public function mustRun(OutputInterface $output, $cmd, $error = null, $callback = null)
+    {
+        $process = $this->run($output, $cmd, $error, $callback);
+
+        if (!$process->isSuccessful()) {
+            throw new ProcessFailedException($process);
+        }
+
+        return $process;
+    }
+
+    /**
+     * Wraps a Process callback to add debugging output.
+     *
+     * @param OutputInterface $output   An OutputInterface interface
+     * @param Process         $process  The Process
+     * @param callable|null   $callback A PHP callable
+     *
+     * @return callable
+     */
+    public function wrapCallback(OutputInterface $output, Process $process, $callback = null)
+    {
+        if ($output instanceof ConsoleOutputInterface) {
+            $output = $output->getErrorOutput();
+        }
+
+        $formatter = $this->getHelperSet()->get('debug_formatter');
+
+        $that = $this;
+
+        return function ($type, $buffer) use ($output, $process, $callback, $formatter, $that) {
+            $output->write($formatter->progress(spl_object_hash($process), $that->escapeString($buffer), Process::ERR === $type));
+
+            if (null !== $callback) {
+                call_user_func($callback, $type, $buffer);
+            }
+        };
+    }
+
+    /**
+     * This method is public for PHP 5.3 compatibility, it should be private.
+     *
+     * @internal
+     */
+    public function escapeString($str)
+    {
+        return str_replace('<', '\\<', $str);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'process';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/ProgressBar.php
@@ -0,0 +1,636 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Exception\LogicException;
+
+/**
+ * The ProgressBar provides helpers to display progress output.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Chris Jones <leeked@gmail.com>
+ */
+class ProgressBar
+{
+    // options
+    private $barWidth = 28;
+    private $barChar;
+    private $emptyBarChar = '-';
+    private $progressChar = '>';
+    private $format;
+    private $internalFormat;
+    private $redrawFreq = 1;
+
+    /**
+     * @var OutputInterface
+     */
+    private $output;
+    private $step = 0;
+    private $max;
+    private $startTime;
+    private $stepWidth;
+    private $percent = 0.0;
+    private $formatLineCount;
+    private $messages = array();
+    private $overwrite = true;
+    private $firstRun = true;
+
+    private static $formatters;
+    private static $formats;
+
+    /**
+     * Constructor.
+     *
+     * @param OutputInterface $output An OutputInterface instance
+     * @param int             $max    Maximum steps (0 if unknown)
+     */
+    public function __construct(OutputInterface $output, $max = 0)
+    {
+        if ($output instanceof ConsoleOutputInterface) {
+            $output = $output->getErrorOutput();
+        }
+
+        $this->output = $output;
+        $this->setMaxSteps($max);
+
+        if (!$this->output->isDecorated()) {
+            // disable overwrite when output does not support ANSI codes.
+            $this->overwrite = false;
+
+            // set a reasonable redraw frequency so output isn't flooded
+            $this->setRedrawFrequency($max / 10);
+        }
+
+        $this->startTime = time();
+    }
+
+    /**
+     * Sets a placeholder formatter for a given name.
+     *
+     * This method also allow you to override an existing placeholder.
+     *
+     * @param string   $name     The placeholder name (including the delimiter char like %)
+     * @param callable $callable A PHP callable
+     */
+    public static function setPlaceholderFormatterDefinition($name, $callable)
+    {
+        if (!self::$formatters) {
+            self::$formatters = self::initPlaceholderFormatters();
+        }
+
+        self::$formatters[$name] = $callable;
+    }
+
+    /**
+     * Gets the placeholder formatter for a given name.
+     *
+     * @param string $name The placeholder name (including the delimiter char like %)
+     *
+     * @return callable|null A PHP callable
+     */
+    public static function getPlaceholderFormatterDefinition($name)
+    {
+        if (!self::$formatters) {
+            self::$formatters = self::initPlaceholderFormatters();
+        }
+
+        return isset(self::$formatters[$name]) ? self::$formatters[$name] : null;
+    }
+
+    /**
+     * Sets a format for a given name.
+     *
+     * This method also allow you to override an existing format.
+     *
+     * @param string $name   The format name
+     * @param string $format A format string
+     */
+    public static function setFormatDefinition($name, $format)
+    {
+        if (!self::$formats) {
+            self::$formats = self::initFormats();
+        }
+
+        self::$formats[$name] = $format;
+    }
+
+    /**
+     * Gets the format for a given name.
+     *
+     * @param string $name The format name
+     *
+     * @return string|null A format string
+     */
+    public static function getFormatDefinition($name)
+    {
+        if (!self::$formats) {
+            self::$formats = self::initFormats();
+        }
+
+        return isset(self::$formats[$name]) ? self::$formats[$name] : null;
+    }
+
+    /**
+     * Associates a text with a named placeholder.
+     *
+     * The text is displayed when the progress bar is rendered but only
+     * when the corresponding placeholder is part of the custom format line
+     * (by wrapping the name with %).
+     *
+     * @param string $message The text to associate with the placeholder
+     * @param string $name    The name of the placeholder
+     */
+    public function setMessage($message, $name = 'message')
+    {
+        $this->messages[$name] = $message;
+    }
+
+    public function getMessage($name = 'message')
+    {
+        return $this->messages[$name];
+    }
+
+    /**
+     * Gets the progress bar start time.
+     *
+     * @return int The progress bar start time
+     */
+    public function getStartTime()
+    {
+        return $this->startTime;
+    }
+
+    /**
+     * Gets the progress bar maximal steps.
+     *
+     * @return int The progress bar max steps
+     */
+    public function getMaxSteps()
+    {
+        return $this->max;
+    }
+
+    /**
+     * Gets the progress bar step.
+     *
+     * @deprecated since version 2.6, to be removed in 3.0. Use {@link getProgress()} instead.
+     *
+     * @return int The progress bar step
+     */
+    public function getStep()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the getProgress() method instead.', E_USER_DEPRECATED);
+
+        return $this->getProgress();
+    }
+
+    /**
+     * Gets the current step position.
+     *
+     * @return int The progress bar step
+     */
+    public function getProgress()
+    {
+        return $this->step;
+    }
+
+    /**
+     * Gets the progress bar step width.
+     *
+     * @internal This method is public for PHP 5.3 compatibility, it should not be used.
+     *
+     * @return int The progress bar step width
+     */
+    public function getStepWidth()
+    {
+        return $this->stepWidth;
+    }
+
+    /**
+     * Gets the current progress bar percent.
+     *
+     * @return float The current progress bar percent
+     */
+    public function getProgressPercent()
+    {
+        return $this->percent;
+    }
+
+    /**
+     * Sets the progress bar width.
+     *
+     * @param int $size The progress bar size
+     */
+    public function setBarWidth($size)
+    {
+        $this->barWidth = (int) $size;
+    }
+
+    /**
+     * Gets the progress bar width.
+     *
+     * @return int The progress bar size
+     */
+    public function getBarWidth()
+    {
+        return $this->barWidth;
+    }
+
+    /**
+     * Sets the bar character.
+     *
+     * @param string $char A character
+     */
+    public function setBarCharacter($char)
+    {
+        $this->barChar = $char;
+    }
+
+    /**
+     * Gets the bar character.
+     *
+     * @return string A character
+     */
+    public function getBarCharacter()
+    {
+        if (null === $this->barChar) {
+            return $this->max ? '=' : $this->emptyBarChar;
+        }
+
+        return $this->barChar;
+    }
+
+    /**
+     * Sets the empty bar character.
+     *
+     * @param string $char A character
+     */
+    public function setEmptyBarCharacter($char)
+    {
+        $this->emptyBarChar = $char;
+    }
+
+    /**
+     * Gets the empty bar character.
+     *
+     * @return string A character
+     */
+    public function getEmptyBarCharacter()
+    {
+        return $this->emptyBarChar;
+    }
+
+    /**
+     * Sets the progress bar character.
+     *
+     * @param string $char A character
+     */
+    public function setProgressCharacter($char)
+    {
+        $this->progressChar = $char;
+    }
+
+    /**
+     * Gets the progress bar character.
+     *
+     * @return string A character
+     */
+    public function getProgressCharacter()
+    {
+        return $this->progressChar;
+    }
+
+    /**
+     * Sets the progress bar format.
+     *
+     * @param string $format The format
+     */
+    public function setFormat($format)
+    {
+        $this->format = null;
+        $this->internalFormat = $format;
+    }
+
+    /**
+     * Sets the redraw frequency.
+     *
+     * @param int|float $freq The frequency in steps
+     */
+    public function setRedrawFrequency($freq)
+    {
+        $this->redrawFreq = max((int) $freq, 1);
+    }
+
+    /**
+     * Starts the progress output.
+     *
+     * @param int|null $max Number of steps to complete the bar (0 if indeterminate), null to leave unchanged
+     */
+    public function start($max = null)
+    {
+        $this->startTime = time();
+        $this->step = 0;
+        $this->percent = 0.0;
+
+        if (null !== $max) {
+            $this->setMaxSteps($max);
+        }
+
+        $this->display();
+    }
+
+    /**
+     * Advances the progress output X steps.
+     *
+     * @param int $step Number of steps to advance
+     *
+     * @throws LogicException
+     */
+    public function advance($step = 1)
+    {
+        $this->setProgress($this->step + $step);
+    }
+
+    /**
+     * Sets the current progress.
+     *
+     * @deprecated since version 2.6, to be removed in 3.0. Use {@link setProgress()} instead.
+     *
+     * @param int $step The current progress
+     *
+     * @throws LogicException
+     */
+    public function setCurrent($step)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the setProgress() method instead.', E_USER_DEPRECATED);
+
+        $this->setProgress($step);
+    }
+
+    /**
+     * Sets whether to overwrite the progressbar, false for new line.
+     *
+     * @param bool $overwrite
+     */
+    public function setOverwrite($overwrite)
+    {
+        $this->overwrite = (bool) $overwrite;
+    }
+
+    /**
+     * Sets the current progress.
+     *
+     * @param int $step The current progress
+     *
+     * @throws LogicException
+     */
+    public function setProgress($step)
+    {
+        $step = (int) $step;
+        if ($step < $this->step) {
+            throw new LogicException('You can\'t regress the progress bar.');
+        }
+
+        if ($this->max && $step > $this->max) {
+            $this->max = $step;
+        }
+
+        $prevPeriod = (int) ($this->step / $this->redrawFreq);
+        $currPeriod = (int) ($step / $this->redrawFreq);
+        $this->step = $step;
+        $this->percent = $this->max ? (float) $this->step / $this->max : 0;
+        if ($prevPeriod !== $currPeriod || $this->max === $step) {
+            $this->display();
+        }
+    }
+
+    /**
+     * Finishes the progress output.
+     */
+    public function finish()
+    {
+        if (!$this->max) {
+            $this->max = $this->step;
+        }
+
+        if ($this->step === $this->max && !$this->overwrite) {
+            // prevent double 100% output
+            return;
+        }
+
+        $this->setProgress($this->max);
+    }
+
+    /**
+     * Outputs the current progress string.
+     */
+    public function display()
+    {
+        if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) {
+            return;
+        }
+
+        if (null === $this->format) {
+            $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat());
+        }
+
+        // these 3 variables can be removed in favor of using $this in the closure when support for PHP 5.3 will be dropped.
+        $self = $this;
+        $output = $this->output;
+        $messages = $this->messages;
+        $this->overwrite(preg_replace_callback("{%([a-z\-_]+)(?:\:([^%]+))?%}i", function ($matches) use ($self, $output, $messages) {
+            if ($formatter = $self::getPlaceholderFormatterDefinition($matches[1])) {
+                $text = call_user_func($formatter, $self, $output);
+            } elseif (isset($messages[$matches[1]])) {
+                $text = $messages[$matches[1]];
+            } else {
+                return $matches[0];
+            }
+
+            if (isset($matches[2])) {
+                $text = sprintf('%'.$matches[2], $text);
+            }
+
+            return $text;
+        }, $this->format));
+    }
+
+    /**
+     * Removes the progress bar from the current line.
+     *
+     * This is useful if you wish to write some output
+     * while a progress bar is running.
+     * Call display() to show the progress bar again.
+     */
+    public function clear()
+    {
+        if (!$this->overwrite) {
+            return;
+        }
+
+        if (null === $this->format) {
+            $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat());
+        }
+
+        $this->overwrite('');
+    }
+
+    /**
+     * Sets the progress bar format.
+     *
+     * @param string $format The format
+     */
+    private function setRealFormat($format)
+    {
+        // try to use the _nomax variant if available
+        if (!$this->max && null !== self::getFormatDefinition($format.'_nomax')) {
+            $this->format = self::getFormatDefinition($format.'_nomax');
+        } elseif (null !== self::getFormatDefinition($format)) {
+            $this->format = self::getFormatDefinition($format);
+        } else {
+            $this->format = $format;
+        }
+
+        $this->formatLineCount = substr_count($this->format, "\n");
+    }
+
+    /**
+     * Sets the progress bar maximal steps.
+     *
+     * @param int $max The progress bar max steps
+     */
+    private function setMaxSteps($max)
+    {
+        $this->max = max(0, (int) $max);
+        $this->stepWidth = $this->max ? Helper::strlen($this->max) : 4;
+    }
+
+    /**
+     * Overwrites a previous message to the output.
+     *
+     * @param string $message The message
+     */
+    private function overwrite($message)
+    {
+        if ($this->overwrite) {
+            if (!$this->firstRun) {
+                // Move the cursor to the beginning of the line
+                $this->output->write("\x0D");
+
+                // Erase the line
+                $this->output->write("\x1B[2K");
+
+                // Erase previous lines
+                if ($this->formatLineCount > 0) {
+                    $this->output->write(str_repeat("\x1B[1A\x1B[2K", $this->formatLineCount));
+                }
+            }
+        } elseif ($this->step > 0) {
+            $this->output->writeln('');
+        }
+
+        $this->firstRun = false;
+
+        $this->output->write($message);
+    }
+
+    private function determineBestFormat()
+    {
+        switch ($this->output->getVerbosity()) {
+            // OutputInterface::VERBOSITY_QUIET: display is disabled anyway
+            case OutputInterface::VERBOSITY_VERBOSE:
+                return $this->max ? 'verbose' : 'verbose_nomax';
+            case OutputInterface::VERBOSITY_VERY_VERBOSE:
+                return $this->max ? 'very_verbose' : 'very_verbose_nomax';
+            case OutputInterface::VERBOSITY_DEBUG:
+                return $this->max ? 'debug' : 'debug_nomax';
+            default:
+                return $this->max ? 'normal' : 'normal_nomax';
+        }
+    }
+
+    private static function initPlaceholderFormatters()
+    {
+        return array(
+            'bar' => function (ProgressBar $bar, OutputInterface $output) {
+                $completeBars = floor($bar->getMaxSteps() > 0 ? $bar->getProgressPercent() * $bar->getBarWidth() : $bar->getProgress() % $bar->getBarWidth());
+                $display = str_repeat($bar->getBarCharacter(), $completeBars);
+                if ($completeBars < $bar->getBarWidth()) {
+                    $emptyBars = $bar->getBarWidth() - $completeBars - Helper::strlenWithoutDecoration($output->getFormatter(), $bar->getProgressCharacter());
+                    $display .= $bar->getProgressCharacter().str_repeat($bar->getEmptyBarCharacter(), $emptyBars);
+                }
+
+                return $display;
+            },
+            'elapsed' => function (ProgressBar $bar) {
+                return Helper::formatTime(time() - $bar->getStartTime());
+            },
+            'remaining' => function (ProgressBar $bar) {
+                if (!$bar->getMaxSteps()) {
+                    throw new LogicException('Unable to display the remaining time if the maximum number of steps is not set.');
+                }
+
+                if (!$bar->getProgress()) {
+                    $remaining = 0;
+                } else {
+                    $remaining = round((time() - $bar->getStartTime()) / $bar->getProgress() * ($bar->getMaxSteps() - $bar->getProgress()));
+                }
+
+                return Helper::formatTime($remaining);
+            },
+            'estimated' => function (ProgressBar $bar) {
+                if (!$bar->getMaxSteps()) {
+                    throw new LogicException('Unable to display the estimated time if the maximum number of steps is not set.');
+                }
+
+                if (!$bar->getProgress()) {
+                    $estimated = 0;
+                } else {
+                    $estimated = round((time() - $bar->getStartTime()) / $bar->getProgress() * $bar->getMaxSteps());
+                }
+
+                return Helper::formatTime($estimated);
+            },
+            'memory' => function (ProgressBar $bar) {
+                return Helper::formatMemory(memory_get_usage(true));
+            },
+            'current' => function (ProgressBar $bar) {
+                return str_pad($bar->getProgress(), $bar->getStepWidth(), ' ', STR_PAD_LEFT);
+            },
+            'max' => function (ProgressBar $bar) {
+                return $bar->getMaxSteps();
+            },
+            'percent' => function (ProgressBar $bar) {
+                return floor($bar->getProgressPercent() * 100);
+            },
+        );
+    }
+
+    private static function initFormats()
+    {
+        return array(
+            'normal' => ' %current%/%max% [%bar%] %percent:3s%%',
+            'normal_nomax' => ' %current% [%bar%]',
+
+            'verbose' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%',
+            'verbose_nomax' => ' %current% [%bar%] %elapsed:6s%',
+
+            'very_verbose' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s%',
+            'very_verbose_nomax' => ' %current% [%bar%] %elapsed:6s%',
+
+            'debug' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%',
+            'debug_nomax' => ' %current% [%bar%] %elapsed:6s% %memory:6s%',
+        );
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/ProgressHelper.php
@@ -0,0 +1,469 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Output\NullOutput;
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Exception\LogicException;
+
+/**
+ * The Progress class provides helpers to display progress output.
+ *
+ * @author Chris Jones <leeked@gmail.com>
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 2.5, to be removed in 3.0
+ *             Use {@link ProgressBar} instead.
+ */
+class ProgressHelper extends Helper
+{
+    const FORMAT_QUIET = ' %percent%%';
+    const FORMAT_NORMAL = ' %current%/%max% [%bar%] %percent%%';
+    const FORMAT_VERBOSE = ' %current%/%max% [%bar%] %percent%% Elapsed: %elapsed%';
+    const FORMAT_QUIET_NOMAX = ' %current%';
+    const FORMAT_NORMAL_NOMAX = ' %current% [%bar%]';
+    const FORMAT_VERBOSE_NOMAX = ' %current% [%bar%] Elapsed: %elapsed%';
+
+    // options
+    private $barWidth = 28;
+    private $barChar = '=';
+    private $emptyBarChar = '-';
+    private $progressChar = '>';
+    private $format = null;
+    private $redrawFreq = 1;
+
+    private $lastMessagesLength;
+    private $barCharOriginal;
+
+    /**
+     * @var OutputInterface
+     */
+    private $output;
+
+    /**
+     * Current step.
+     *
+     * @var int
+     */
+    private $current;
+
+    /**
+     * Maximum number of steps.
+     *
+     * @var int
+     */
+    private $max;
+
+    /**
+     * Start time of the progress bar.
+     *
+     * @var int
+     */
+    private $startTime;
+
+    /**
+     * List of formatting variables.
+     *
+     * @var array
+     */
+    private $defaultFormatVars = array(
+        'current',
+        'max',
+        'bar',
+        'percent',
+        'elapsed',
+    );
+
+    /**
+     * Available formatting variables.
+     *
+     * @var array
+     */
+    private $formatVars;
+
+    /**
+     * Stored format part widths (used for padding).
+     *
+     * @var array
+     */
+    private $widths = array(
+        'current' => 4,
+        'max' => 4,
+        'percent' => 3,
+        'elapsed' => 6,
+    );
+
+    /**
+     * Various time formats.
+     *
+     * @var array
+     */
+    private $timeFormats = array(
+        array(0, '???'),
+        array(2, '1 sec'),
+        array(59, 'secs', 1),
+        array(60, '1 min'),
+        array(3600, 'mins', 60),
+        array(5400, '1 hr'),
+        array(86400, 'hrs', 3600),
+        array(129600, '1 day'),
+        array(604800, 'days', 86400),
+    );
+
+    public function __construct($triggerDeprecationError = true)
+    {
+        if ($triggerDeprecationError) {
+            @trigger_error('The '.__CLASS__.' class is deprecated since version 2.5 and will be removed in 3.0. Use the Symfony\Component\Console\Helper\ProgressBar class instead.', E_USER_DEPRECATED);
+        }
+    }
+
+    /**
+     * Sets the progress bar width.
+     *
+     * @param int $size The progress bar size
+     */
+    public function setBarWidth($size)
+    {
+        $this->barWidth = (int) $size;
+    }
+
+    /**
+     * Sets the bar character.
+     *
+     * @param string $char A character
+     */
+    public function setBarCharacter($char)
+    {
+        $this->barChar = $char;
+    }
+
+    /**
+     * Sets the empty bar character.
+     *
+     * @param string $char A character
+     */
+    public function setEmptyBarCharacter($char)
+    {
+        $this->emptyBarChar = $char;
+    }
+
+    /**
+     * Sets the progress bar character.
+     *
+     * @param string $char A character
+     */
+    public function setProgressCharacter($char)
+    {
+        $this->progressChar = $char;
+    }
+
+    /**
+     * Sets the progress bar format.
+     *
+     * @param string $format The format
+     */
+    public function setFormat($format)
+    {
+        $this->format = $format;
+    }
+
+    /**
+     * Sets the redraw frequency.
+     *
+     * @param int $freq The frequency in steps
+     */
+    public function setRedrawFrequency($freq)
+    {
+        $this->redrawFreq = (int) $freq;
+    }
+
+    /**
+     * Starts the progress output.
+     *
+     * @param OutputInterface $output An Output instance
+     * @param int|null        $max    Maximum steps
+     */
+    public function start(OutputInterface $output, $max = null)
+    {
+        if ($output instanceof ConsoleOutputInterface) {
+            $output = $output->getErrorOutput();
+        }
+
+        $this->startTime = time();
+        $this->current = 0;
+        $this->max = (int) $max;
+
+        // Disabling output when it does not support ANSI codes as it would result in a broken display anyway.
+        $this->output = $output->isDecorated() ? $output : new NullOutput();
+        $this->lastMessagesLength = 0;
+        $this->barCharOriginal = '';
+
+        if (null === $this->format) {
+            switch ($output->getVerbosity()) {
+                case OutputInterface::VERBOSITY_QUIET:
+                    $this->format = self::FORMAT_QUIET_NOMAX;
+                    if ($this->max > 0) {
+                        $this->format = self::FORMAT_QUIET;
+                    }
+                    break;
+                case OutputInterface::VERBOSITY_VERBOSE:
+                case OutputInterface::VERBOSITY_VERY_VERBOSE:
+                case OutputInterface::VERBOSITY_DEBUG:
+                    $this->format = self::FORMAT_VERBOSE_NOMAX;
+                    if ($this->max > 0) {
+                        $this->format = self::FORMAT_VERBOSE;
+                    }
+                    break;
+                default:
+                    $this->format = self::FORMAT_NORMAL_NOMAX;
+                    if ($this->max > 0) {
+                        $this->format = self::FORMAT_NORMAL;
+                    }
+                    break;
+            }
+        }
+
+        $this->initialize();
+    }
+
+    /**
+     * Advances the progress output X steps.
+     *
+     * @param int  $step   Number of steps to advance
+     * @param bool $redraw Whether to redraw or not
+     *
+     * @throws LogicException
+     */
+    public function advance($step = 1, $redraw = false)
+    {
+        $this->setCurrent($this->current + $step, $redraw);
+    }
+
+    /**
+     * Sets the current progress.
+     *
+     * @param int  $current The current progress
+     * @param bool $redraw  Whether to redraw or not
+     *
+     * @throws LogicException
+     */
+    public function setCurrent($current, $redraw = false)
+    {
+        if (null === $this->startTime) {
+            throw new LogicException('You must start the progress bar before calling setCurrent().');
+        }
+
+        $current = (int) $current;
+
+        if ($current < $this->current) {
+            throw new LogicException('You can\'t regress the progress bar');
+        }
+
+        if (0 === $this->current) {
+            $redraw = true;
+        }
+
+        $prevPeriod = (int) ($this->current / $this->redrawFreq);
+
+        $this->current = $current;
+
+        $currPeriod = (int) ($this->current / $this->redrawFreq);
+        if ($redraw || $prevPeriod !== $currPeriod || $this->max === $this->current) {
+            $this->display();
+        }
+    }
+
+    /**
+     * Outputs the current progress string.
+     *
+     * @param bool $finish Forces the end result
+     *
+     * @throws LogicException
+     */
+    public function display($finish = false)
+    {
+        if (null === $this->startTime) {
+            throw new LogicException('You must start the progress bar before calling display().');
+        }
+
+        $message = $this->format;
+        foreach ($this->generate($finish) as $name => $value) {
+            $message = str_replace("%{$name}%", $value, $message);
+        }
+        $this->overwrite($this->output, $message);
+    }
+
+    /**
+     * Removes the progress bar from the current line.
+     *
+     * This is useful if you wish to write some output
+     * while a progress bar is running.
+     * Call display() to show the progress bar again.
+     */
+    public function clear()
+    {
+        $this->overwrite($this->output, '');
+    }
+
+    /**
+     * Finishes the progress output.
+     */
+    public function finish()
+    {
+        if (null === $this->startTime) {
+            throw new LogicException('You must start the progress bar before calling finish().');
+        }
+
+        if (null !== $this->startTime) {
+            if (!$this->max) {
+                $this->barChar = $this->barCharOriginal;
+                $this->display(true);
+            }
+            $this->startTime = null;
+            $this->output->writeln('');
+            $this->output = null;
+        }
+    }
+
+    /**
+     * Initializes the progress helper.
+     */
+    private function initialize()
+    {
+        $this->formatVars = array();
+        foreach ($this->defaultFormatVars as $var) {
+            if (false !== strpos($this->format, "%{$var}%")) {
+                $this->formatVars[$var] = true;
+            }
+        }
+
+        if ($this->max > 0) {
+            $this->widths['max'] = $this->strlen($this->max);
+            $this->widths['current'] = $this->widths['max'];
+        } else {
+            $this->barCharOriginal = $this->barChar;
+            $this->barChar = $this->emptyBarChar;
+        }
+    }
+
+    /**
+     * Generates the array map of format variables to values.
+     *
+     * @param bool $finish Forces the end result
+     *
+     * @return array Array of format vars and values
+     */
+    private function generate($finish = false)
+    {
+        $vars = array();
+        $percent = 0;
+        if ($this->max > 0) {
+            $percent = (float) $this->current / $this->max;
+        }
+
+        if (isset($this->formatVars['bar'])) {
+            if ($this->max > 0) {
+                $completeBars = floor($percent * $this->barWidth);
+            } else {
+                if (!$finish) {
+                    $completeBars = floor($this->current % $this->barWidth);
+                } else {
+                    $completeBars = $this->barWidth;
+                }
+            }
+
+            $emptyBars = $this->barWidth - $completeBars - $this->strlen($this->progressChar);
+            $bar = str_repeat($this->barChar, $completeBars);
+            if ($completeBars < $this->barWidth) {
+                $bar .= $this->progressChar;
+                $bar .= str_repeat($this->emptyBarChar, $emptyBars);
+            }
+
+            $vars['bar'] = $bar;
+        }
+
+        if (isset($this->formatVars['elapsed'])) {
+            $elapsed = time() - $this->startTime;
+            $vars['elapsed'] = str_pad($this->humaneTime($elapsed), $this->widths['elapsed'], ' ', STR_PAD_LEFT);
+        }
+
+        if (isset($this->formatVars['current'])) {
+            $vars['current'] = str_pad($this->current, $this->widths['current'], ' ', STR_PAD_LEFT);
+        }
+
+        if (isset($this->formatVars['max'])) {
+            $vars['max'] = $this->max;
+        }
+
+        if (isset($this->formatVars['percent'])) {
+            $vars['percent'] = str_pad(floor($percent * 100), $this->widths['percent'], ' ', STR_PAD_LEFT);
+        }
+
+        return $vars;
+    }
+
+    /**
+     * Converts seconds into human-readable format.
+     *
+     * @param int $secs Number of seconds
+     *
+     * @return string Time in readable format
+     */
+    private function humaneTime($secs)
+    {
+        $text = '';
+        foreach ($this->timeFormats as $format) {
+            if ($secs < $format[0]) {
+                if (count($format) == 2) {
+                    $text = $format[1];
+                    break;
+                } else {
+                    $text = ceil($secs / $format[2]).' '.$format[1];
+                    break;
+                }
+            }
+        }
+
+        return $text;
+    }
+
+    /**
+     * Overwrites a previous message to the output.
+     *
+     * @param OutputInterface $output  An Output instance
+     * @param string          $message The message
+     */
+    private function overwrite(OutputInterface $output, $message)
+    {
+        $length = $this->strlen($message);
+
+        // append whitespace to match the last line's length
+        if (null !== $this->lastMessagesLength && $this->lastMessagesLength > $length) {
+            $message = str_pad($message, $this->lastMessagesLength, "\x20", STR_PAD_RIGHT);
+        }
+
+        // carriage return
+        $output->write("\x0D");
+        $output->write($message);
+
+        $this->lastMessagesLength = $this->strlen($message);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'progress';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/ProgressIndicator.php
@@ -0,0 +1,307 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Exception\LogicException;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * @author Kevin Bond <kevinbond@gmail.com>
+ */
+class ProgressIndicator
+{
+    private $output;
+    private $startTime;
+    private $format;
+    private $message;
+    private $indicatorValues;
+    private $indicatorCurrent;
+    private $indicatorChangeInterval;
+    private $indicatorUpdateTime;
+    private $started = false;
+
+    private static $formatters;
+    private static $formats;
+
+    /**
+     * @param OutputInterface $output
+     * @param string|null     $format                  Indicator format
+     * @param int             $indicatorChangeInterval Change interval in milliseconds
+     * @param array|null      $indicatorValues         Animated indicator characters
+     */
+    public function __construct(OutputInterface $output, $format = null, $indicatorChangeInterval = 100, $indicatorValues = null)
+    {
+        $this->output = $output;
+
+        if (null === $format) {
+            $format = $this->determineBestFormat();
+        }
+
+        if (null === $indicatorValues) {
+            $indicatorValues = array('-', '\\', '|', '/');
+        }
+
+        $indicatorValues = array_values($indicatorValues);
+
+        if (2 > count($indicatorValues)) {
+            throw new InvalidArgumentException('Must have at least 2 indicator value characters.');
+        }
+
+        $this->format = self::getFormatDefinition($format);
+        $this->indicatorChangeInterval = $indicatorChangeInterval;
+        $this->indicatorValues = $indicatorValues;
+        $this->startTime = time();
+    }
+
+    /**
+     * Sets the current indicator message.
+     *
+     * @param string|null $message
+     */
+    public function setMessage($message)
+    {
+        $this->message = $message;
+
+        $this->display();
+    }
+
+    /**
+     * Gets the current indicator message.
+     *
+     * @return string|null
+     *
+     * @internal for PHP 5.3 compatibility
+     */
+    public function getMessage()
+    {
+        return $this->message;
+    }
+
+    /**
+     * Gets the progress bar start time.
+     *
+     * @return int The progress bar start time
+     *
+     * @internal for PHP 5.3 compatibility
+     */
+    public function getStartTime()
+    {
+        return $this->startTime;
+    }
+
+    /**
+     * Gets the current animated indicator character.
+     *
+     * @return string
+     *
+     * @internal for PHP 5.3 compatibility
+     */
+    public function getCurrentValue()
+    {
+        return $this->indicatorValues[$this->indicatorCurrent % count($this->indicatorValues)];
+    }
+
+    /**
+     * Starts the indicator output.
+     *
+     * @param $message
+     */
+    public function start($message)
+    {
+        if ($this->started) {
+            throw new LogicException('Progress indicator already started.');
+        }
+
+        $this->message = $message;
+        $this->started = true;
+        $this->startTime = time();
+        $this->indicatorUpdateTime = $this->getCurrentTimeInMilliseconds() + $this->indicatorChangeInterval;
+        $this->indicatorCurrent = 0;
+
+        $this->display();
+    }
+
+    /**
+     * Advances the indicator.
+     */
+    public function advance()
+    {
+        if (!$this->started) {
+            throw new LogicException('Progress indicator has not yet been started.');
+        }
+
+        if (!$this->output->isDecorated()) {
+            return;
+        }
+
+        $currentTime = $this->getCurrentTimeInMilliseconds();
+
+        if ($currentTime < $this->indicatorUpdateTime) {
+            return;
+        }
+
+        $this->indicatorUpdateTime = $currentTime + $this->indicatorChangeInterval;
+        ++$this->indicatorCurrent;
+
+        $this->display();
+    }
+
+    /**
+     * Finish the indicator with message.
+     *
+     * @param $message
+     */
+    public function finish($message)
+    {
+        if (!$this->started) {
+            throw new LogicException('Progress indicator has not yet been started.');
+        }
+
+        $this->message = $message;
+        $this->display();
+        $this->output->writeln('');
+        $this->started = false;
+    }
+
+    /**
+     * Gets the format for a given name.
+     *
+     * @param string $name The format name
+     *
+     * @return string|null A format string
+     */
+    public static function getFormatDefinition($name)
+    {
+        if (!self::$formats) {
+            self::$formats = self::initFormats();
+        }
+
+        return isset(self::$formats[$name]) ? self::$formats[$name] : null;
+    }
+
+    /**
+     * Sets a placeholder formatter for a given name.
+     *
+     * This method also allow you to override an existing placeholder.
+     *
+     * @param string   $name     The placeholder name (including the delimiter char like %)
+     * @param callable $callable A PHP callable
+     */
+    public static function setPlaceholderFormatterDefinition($name, $callable)
+    {
+        if (!self::$formatters) {
+            self::$formatters = self::initPlaceholderFormatters();
+        }
+
+        self::$formatters[$name] = $callable;
+    }
+
+    /**
+     * Gets the placeholder formatter for a given name.
+     *
+     * @param string $name The placeholder name (including the delimiter char like %)
+     *
+     * @return callable|null A PHP callable
+     */
+    public static function getPlaceholderFormatterDefinition($name)
+    {
+        if (!self::$formatters) {
+            self::$formatters = self::initPlaceholderFormatters();
+        }
+
+        return isset(self::$formatters[$name]) ? self::$formatters[$name] : null;
+    }
+
+    private function display()
+    {
+        if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) {
+            return;
+        }
+
+        $self = $this;
+
+        $this->overwrite(preg_replace_callback("{%([a-z\-_]+)(?:\:([^%]+))?%}i", function ($matches) use ($self) {
+            if ($formatter = $self::getPlaceholderFormatterDefinition($matches[1])) {
+                return call_user_func($formatter, $self);
+            }
+
+            return $matches[0];
+        }, $this->format));
+    }
+
+    private function determineBestFormat()
+    {
+        switch ($this->output->getVerbosity()) {
+            // OutputInterface::VERBOSITY_QUIET: display is disabled anyway
+            case OutputInterface::VERBOSITY_VERBOSE:
+                return $this->output->isDecorated() ? 'verbose' : 'verbose_no_ansi';
+            case OutputInterface::VERBOSITY_VERY_VERBOSE:
+            case OutputInterface::VERBOSITY_DEBUG:
+                return $this->output->isDecorated() ? 'very_verbose' : 'very_verbose_no_ansi';
+            default:
+                return $this->output->isDecorated() ? 'normal' : 'normal_no_ansi';
+        }
+    }
+
+    /**
+     * Overwrites a previous message to the output.
+     *
+     * @param string $message The message
+     */
+    private function overwrite($message)
+    {
+        if ($this->output->isDecorated()) {
+            $this->output->write("\x0D\x1B[2K");
+            $this->output->write($message);
+        } else {
+            $this->output->writeln($message);
+        }
+    }
+
+    private function getCurrentTimeInMilliseconds()
+    {
+        return round(microtime(true) * 1000);
+    }
+
+    private static function initPlaceholderFormatters()
+    {
+        return array(
+            'indicator' => function (ProgressIndicator $indicator) {
+                return $indicator->getCurrentValue();
+            },
+            'message' => function (ProgressIndicator $indicator) {
+                return $indicator->getMessage();
+            },
+            'elapsed' => function (ProgressIndicator $indicator) {
+                return Helper::formatTime(time() - $indicator->getStartTime());
+            },
+            'memory' => function () {
+                return Helper::formatMemory(memory_get_usage(true));
+            },
+        );
+    }
+
+    private static function initFormats()
+    {
+        return array(
+            'normal' => ' %indicator% %message%',
+            'normal_no_ansi' => ' %message%',
+
+            'verbose' => ' %indicator% %message% (%elapsed:6s%)',
+            'verbose_no_ansi' => ' %message% (%elapsed:6s%)',
+
+            'very_verbose' => ' %indicator% %message% (%elapsed:6s%, %memory:6s%)',
+            'very_verbose_no_ansi' => ' %message% (%elapsed:6s%, %memory:6s%)',
+        );
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/QuestionHelper.php
@@ -0,0 +1,453 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Exception\RuntimeException;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Formatter\OutputFormatterStyle;
+use Symfony\Component\Console\Question\Question;
+use Symfony\Component\Console\Question\ChoiceQuestion;
+
+/**
+ * The QuestionHelper class provides helpers to interact with the user.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class QuestionHelper extends Helper
+{
+    private $inputStream;
+    private static $shell;
+    private static $stty;
+
+    /**
+     * Asks a question to the user.
+     *
+     * @param InputInterface  $input    An InputInterface instance
+     * @param OutputInterface $output   An OutputInterface instance
+     * @param Question        $question The question to ask
+     *
+     * @return string The user answer
+     *
+     * @throws RuntimeException If there is no data to read in the input stream
+     */
+    public function ask(InputInterface $input, OutputInterface $output, Question $question)
+    {
+        if ($output instanceof ConsoleOutputInterface) {
+            $output = $output->getErrorOutput();
+        }
+
+        if (!$input->isInteractive()) {
+            return $question->getDefault();
+        }
+
+        if (!$question->getValidator()) {
+            return $this->doAsk($output, $question);
+        }
+
+        $that = $this;
+
+        $interviewer = function () use ($output, $question, $that) {
+            return $that->doAsk($output, $question);
+        };
+
+        return $this->validateAttempts($interviewer, $output, $question);
+    }
+
+    /**
+     * Sets the input stream to read from when interacting with the user.
+     *
+     * This is mainly useful for testing purpose.
+     *
+     * @param resource $stream The input stream
+     *
+     * @throws InvalidArgumentException In case the stream is not a resource
+     */
+    public function setInputStream($stream)
+    {
+        if (!is_resource($stream)) {
+            throw new InvalidArgumentException('Input stream must be a valid resource.');
+        }
+
+        $this->inputStream = $stream;
+    }
+
+    /**
+     * Returns the helper's input stream.
+     *
+     * @return resource
+     */
+    public function getInputStream()
+    {
+        return $this->inputStream;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'question';
+    }
+
+    /**
+     * Asks the question to the user.
+     *
+     * This method is public for PHP 5.3 compatibility, it should be private.
+     *
+     * @param OutputInterface $output
+     * @param Question        $question
+     *
+     * @return bool|mixed|null|string
+     *
+     * @throws \Exception
+     * @throws \RuntimeException
+     */
+    public function doAsk(OutputInterface $output, Question $question)
+    {
+        $this->writePrompt($output, $question);
+
+        $inputStream = $this->inputStream ?: STDIN;
+        $autocomplete = $question->getAutocompleterValues();
+
+        if (null === $autocomplete || !$this->hasSttyAvailable()) {
+            $ret = false;
+            if ($question->isHidden()) {
+                try {
+                    $ret = trim($this->getHiddenResponse($output, $inputStream));
+                } catch (\RuntimeException $e) {
+                    if (!$question->isHiddenFallback()) {
+                        throw $e;
+                    }
+                }
+            }
+
+            if (false === $ret) {
+                $ret = fgets($inputStream, 4096);
+                if (false === $ret) {
+                    throw new RuntimeException('Aborted');
+                }
+                $ret = trim($ret);
+            }
+        } else {
+            $ret = trim($this->autocomplete($output, $question, $inputStream));
+        }
+
+        $ret = strlen($ret) > 0 ? $ret : $question->getDefault();
+
+        if ($normalizer = $question->getNormalizer()) {
+            return $normalizer($ret);
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Outputs the question prompt.
+     *
+     * @param OutputInterface $output
+     * @param Question        $question
+     */
+    protected function writePrompt(OutputInterface $output, Question $question)
+    {
+        $message = $question->getQuestion();
+
+        if ($question instanceof ChoiceQuestion) {
+            $maxWidth = max(array_map(array($this, 'strlen'), array_keys($question->getChoices())));
+
+            $messages = (array) $question->getQuestion();
+            foreach ($question->getChoices() as $key => $value) {
+                $width = $maxWidth - $this->strlen($key);
+                $messages[] = '  [<info>'.$key.str_repeat(' ', $width).'</info>] '.$value;
+            }
+
+            $output->writeln($messages);
+
+            $message = $question->getPrompt();
+        }
+
+        $output->write($message);
+    }
+
+    /**
+     * Outputs an error message.
+     *
+     * @param OutputInterface $output
+     * @param \Exception      $error
+     */
+    protected function writeError(OutputInterface $output, \Exception $error)
+    {
+        if (null !== $this->getHelperSet() && $this->getHelperSet()->has('formatter')) {
+            $message = $this->getHelperSet()->get('formatter')->formatBlock($error->getMessage(), 'error');
+        } else {
+            $message = '<error>'.$error->getMessage().'</error>';
+        }
+
+        $output->writeln($message);
+    }
+
+    /**
+     * Autocompletes a question.
+     *
+     * @param OutputInterface $output
+     * @param Question        $question
+     * @param resource        $inputStream
+     *
+     * @return string
+     */
+    private function autocomplete(OutputInterface $output, Question $question, $inputStream)
+    {
+        $autocomplete = $question->getAutocompleterValues();
+        $ret = '';
+
+        $i = 0;
+        $ofs = -1;
+        $matches = $autocomplete;
+        $numMatches = count($matches);
+
+        $sttyMode = shell_exec('stty -g');
+
+        // Disable icanon (so we can fread each keypress) and echo (we'll do echoing here instead)
+        shell_exec('stty -icanon -echo');
+
+        // Add highlighted text style
+        $output->getFormatter()->setStyle('hl', new OutputFormatterStyle('black', 'white'));
+
+        // Read a keypress
+        while (!feof($inputStream)) {
+            $c = fread($inputStream, 1);
+
+            // Backspace Character
+            if ("\177" === $c) {
+                if (0 === $numMatches && 0 !== $i) {
+                    --$i;
+                    // Move cursor backwards
+                    $output->write("\033[1D");
+                }
+
+                if ($i === 0) {
+                    $ofs = -1;
+                    $matches = $autocomplete;
+                    $numMatches = count($matches);
+                } else {
+                    $numMatches = 0;
+                }
+
+                // Pop the last character off the end of our string
+                $ret = substr($ret, 0, $i);
+            } elseif ("\033" === $c) {
+                // Did we read an escape sequence?
+                $c .= fread($inputStream, 2);
+
+                // A = Up Arrow. B = Down Arrow
+                if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) {
+                    if ('A' === $c[2] && -1 === $ofs) {
+                        $ofs = 0;
+                    }
+
+                    if (0 === $numMatches) {
+                        continue;
+                    }
+
+                    $ofs += ('A' === $c[2]) ? -1 : 1;
+                    $ofs = ($numMatches + $ofs) % $numMatches;
+                }
+            } elseif (ord($c) < 32) {
+                if ("\t" === $c || "\n" === $c) {
+                    if ($numMatches > 0 && -1 !== $ofs) {
+                        $ret = $matches[$ofs];
+                        // Echo out remaining chars for current match
+                        $output->write(substr($ret, $i));
+                        $i = strlen($ret);
+                    }
+
+                    if ("\n" === $c) {
+                        $output->write($c);
+                        break;
+                    }
+
+                    $numMatches = 0;
+                }
+
+                continue;
+            } else {
+                $output->write($c);
+                $ret .= $c;
+                ++$i;
+
+                $numMatches = 0;
+                $ofs = 0;
+
+                foreach ($autocomplete as $value) {
+                    // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle)
+                    if (0 === strpos($value, $ret) && $i !== strlen($value)) {
+                        $matches[$numMatches++] = $value;
+                    }
+                }
+            }
+
+            // Erase characters from cursor to end of line
+            $output->write("\033[K");
+
+            if ($numMatches > 0 && -1 !== $ofs) {
+                // Save cursor position
+                $output->write("\0337");
+                // Write highlighted text
+                $output->write('<hl>'.substr($matches[$ofs], $i).'</hl>');
+                // Restore cursor position
+                $output->write("\0338");
+            }
+        }
+
+        // Reset stty so it behaves normally again
+        shell_exec(sprintf('stty %s', $sttyMode));
+
+        return $ret;
+    }
+
+    /**
+     * Gets a hidden response from user.
+     *
+     * @param OutputInterface $output      An Output instance
+     * @param resource        $inputStream The handler resource
+     *
+     * @return string The answer
+     *
+     * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden
+     */
+    private function getHiddenResponse(OutputInterface $output, $inputStream)
+    {
+        if ('\\' === DIRECTORY_SEPARATOR) {
+            $exe = __DIR__.'/../Resources/bin/hiddeninput.exe';
+
+            // handle code running from a phar
+            if ('phar:' === substr(__FILE__, 0, 5)) {
+                $tmpExe = sys_get_temp_dir().'/hiddeninput.exe';
+                copy($exe, $tmpExe);
+                $exe = $tmpExe;
+            }
+
+            $value = rtrim(shell_exec($exe));
+            $output->writeln('');
+
+            if (isset($tmpExe)) {
+                unlink($tmpExe);
+            }
+
+            return $value;
+        }
+
+        if ($this->hasSttyAvailable()) {
+            $sttyMode = shell_exec('stty -g');
+
+            shell_exec('stty -echo');
+            $value = fgets($inputStream, 4096);
+            shell_exec(sprintf('stty %s', $sttyMode));
+
+            if (false === $value) {
+                throw new RuntimeException('Aborted');
+            }
+
+            $value = trim($value);
+            $output->writeln('');
+
+            return $value;
+        }
+
+        if (false !== $shell = $this->getShell()) {
+            $readCmd = $shell === 'csh' ? 'set mypassword = $<' : 'read -r mypassword';
+            $command = sprintf("/usr/bin/env %s -c 'stty -echo; %s; stty echo; echo \$mypassword'", $shell, $readCmd);
+            $value = rtrim(shell_exec($command));
+            $output->writeln('');
+
+            return $value;
+        }
+
+        throw new RuntimeException('Unable to hide the response.');
+    }
+
+    /**
+     * Validates an attempt.
+     *
+     * @param callable        $interviewer A callable that will ask for a question and return the result
+     * @param OutputInterface $output      An Output instance
+     * @param Question        $question    A Question instance
+     *
+     * @return string The validated response
+     *
+     * @throws \Exception In case the max number of attempts has been reached and no valid response has been given
+     */
+    private function validateAttempts($interviewer, OutputInterface $output, Question $question)
+    {
+        $error = null;
+        $attempts = $question->getMaxAttempts();
+        while (null === $attempts || $attempts--) {
+            if (null !== $error) {
+                $this->writeError($output, $error);
+            }
+
+            try {
+                return call_user_func($question->getValidator(), $interviewer());
+            } catch (RuntimeException $e) {
+                throw $e;
+            } catch (\Exception $error) {
+            }
+        }
+
+        throw $error;
+    }
+
+    /**
+     * Returns a valid unix shell.
+     *
+     * @return string|bool The valid shell name, false in case no valid shell is found
+     */
+    private function getShell()
+    {
+        if (null !== self::$shell) {
+            return self::$shell;
+        }
+
+        self::$shell = false;
+
+        if (file_exists('/usr/bin/env')) {
+            // handle other OSs with bash/zsh/ksh/csh if available to hide the answer
+            $test = "/usr/bin/env %s -c 'echo OK' 2> /dev/null";
+            foreach (array('bash', 'zsh', 'ksh', 'csh') as $sh) {
+                if ('OK' === rtrim(shell_exec(sprintf($test, $sh)))) {
+                    self::$shell = $sh;
+                    break;
+                }
+            }
+        }
+
+        return self::$shell;
+    }
+
+    /**
+     * Returns whether Stty is available or not.
+     *
+     * @return bool
+     */
+    private function hasSttyAvailable()
+    {
+        if (null !== self::$stty) {
+            return self::$stty;
+        }
+
+        exec('stty 2>&1', $output, $exitcode);
+
+        return self::$stty = $exitcode === 0;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/SymfonyQuestionHelper.php
@@ -0,0 +1,120 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Exception\LogicException;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\ChoiceQuestion;
+use Symfony\Component\Console\Question\ConfirmationQuestion;
+use Symfony\Component\Console\Question\Question;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\Console\Formatter\OutputFormatter;
+
+/**
+ * Symfony Style Guide compliant question helper.
+ *
+ * @author Kevin Bond <kevinbond@gmail.com>
+ */
+class SymfonyQuestionHelper extends QuestionHelper
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function ask(InputInterface $input, OutputInterface $output, Question $question)
+    {
+        $validator = $question->getValidator();
+        $question->setValidator(function ($value) use ($validator) {
+            if (null !== $validator) {
+                $value = $validator($value);
+            } else {
+                // make required
+                if (!is_array($value) && !is_bool($value) && 0 === strlen($value)) {
+                    throw new LogicException('A value is required.');
+                }
+            }
+
+            return $value;
+        });
+
+        return parent::ask($input, $output, $question);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function writePrompt(OutputInterface $output, Question $question)
+    {
+        $text = OutputFormatter::escape($question->getQuestion());
+        $default = $question->getDefault();
+
+        switch (true) {
+            case null === $default:
+                $text = sprintf(' <info>%s</info>:', $text);
+
+                break;
+
+            case $question instanceof ConfirmationQuestion:
+                $text = sprintf(' <info>%s (yes/no)</info> [<comment>%s</comment>]:', $text, $default ? 'yes' : 'no');
+
+                break;
+
+            case $question instanceof ChoiceQuestion && $question->isMultiselect():
+                $choices = $question->getChoices();
+                $default = explode(',', $default);
+
+                foreach ($default as $key => $value) {
+                    $default[$key] = $choices[trim($value)];
+                }
+
+                $text = sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, OutputFormatter::escape(implode(', ', $default)));
+
+                break;
+
+            case $question instanceof ChoiceQuestion:
+                $choices = $question->getChoices();
+                $text = sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, OutputFormatter::escape($choices[$default]));
+
+                break;
+
+            default:
+                $text = sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, OutputFormatter::escape($default));
+        }
+
+        $output->writeln($text);
+
+        if ($question instanceof ChoiceQuestion) {
+            $width = max(array_map('strlen', array_keys($question->getChoices())));
+
+            foreach ($question->getChoices() as $key => $value) {
+                $output->writeln(sprintf("  [<comment>%-${width}s</comment>] %s", $key, $value));
+            }
+        }
+
+        $output->write(' > ');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function writeError(OutputInterface $output, \Exception $error)
+    {
+        if ($output instanceof SymfonyStyle) {
+            $output->newLine();
+            $output->error($error->getMessage());
+
+            return;
+        }
+
+        parent::writeError($output, $error);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/Table.php
@@ -0,0 +1,664 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+
+/**
+ * Provides helpers to display a table.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Саша Стаменковић <umpirsky@gmail.com>
+ * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
+ * @author Max Grigorian <maxakawizard@gmail.com>
+ */
+class Table
+{
+    /**
+     * Table headers.
+     *
+     * @var array
+     */
+    private $headers = array();
+
+    /**
+     * Table rows.
+     *
+     * @var array
+     */
+    private $rows = array();
+
+    /**
+     * Column widths cache.
+     *
+     * @var array
+     */
+    private $columnWidths = array();
+
+    /**
+     * Number of columns cache.
+     *
+     * @var array
+     */
+    private $numberOfColumns;
+
+    /**
+     * @var OutputInterface
+     */
+    private $output;
+
+    /**
+     * @var TableStyle
+     */
+    private $style;
+
+    /**
+     * @var array
+     */
+    private $columnStyles = array();
+
+    private static $styles;
+
+    public function __construct(OutputInterface $output)
+    {
+        $this->output = $output;
+
+        if (!self::$styles) {
+            self::$styles = self::initStyles();
+        }
+
+        $this->setStyle('default');
+    }
+
+    /**
+     * Sets a style definition.
+     *
+     * @param string     $name  The style name
+     * @param TableStyle $style A TableStyle instance
+     */
+    public static function setStyleDefinition($name, TableStyle $style)
+    {
+        if (!self::$styles) {
+            self::$styles = self::initStyles();
+        }
+
+        self::$styles[$name] = $style;
+    }
+
+    /**
+     * Gets a style definition by name.
+     *
+     * @param string $name The style name
+     *
+     * @return TableStyle A TableStyle instance
+     */
+    public static function getStyleDefinition($name)
+    {
+        if (!self::$styles) {
+            self::$styles = self::initStyles();
+        }
+
+        if (isset(self::$styles[$name])) {
+            return self::$styles[$name];
+        }
+
+        throw new InvalidArgumentException(sprintf('Style "%s" is not defined.', $name));
+    }
+
+    /**
+     * Sets table style.
+     *
+     * @param TableStyle|string $name The style name or a TableStyle instance
+     *
+     * @return Table
+     */
+    public function setStyle($name)
+    {
+        $this->style = $this->resolveStyle($name);
+
+        return $this;
+    }
+
+    /**
+     * Gets the current table style.
+     *
+     * @return TableStyle
+     */
+    public function getStyle()
+    {
+        return $this->style;
+    }
+
+    /**
+     * Sets table column style.
+     *
+     * @param int               $columnIndex Column index
+     * @param TableStyle|string $name        The style name or a TableStyle instance
+     *
+     * @return Table
+     */
+    public function setColumnStyle($columnIndex, $name)
+    {
+        $columnIndex = intval($columnIndex);
+
+        $this->columnStyles[$columnIndex] = $this->resolveStyle($name);
+
+        return $this;
+    }
+
+    /**
+     * Gets the current style for a column.
+     *
+     * If style was not set, it returns the global table style.
+     *
+     * @param int $columnIndex Column index
+     *
+     * @return TableStyle
+     */
+    public function getColumnStyle($columnIndex)
+    {
+        if (isset($this->columnStyles[$columnIndex])) {
+            return $this->columnStyles[$columnIndex];
+        }
+
+        return $this->getStyle();
+    }
+
+    public function setHeaders(array $headers)
+    {
+        $headers = array_values($headers);
+        if (!empty($headers) && !is_array($headers[0])) {
+            $headers = array($headers);
+        }
+
+        $this->headers = $headers;
+
+        return $this;
+    }
+
+    public function setRows(array $rows)
+    {
+        $this->rows = array();
+
+        return $this->addRows($rows);
+    }
+
+    public function addRows(array $rows)
+    {
+        foreach ($rows as $row) {
+            $this->addRow($row);
+        }
+
+        return $this;
+    }
+
+    public function addRow($row)
+    {
+        if ($row instanceof TableSeparator) {
+            $this->rows[] = $row;
+
+            return $this;
+        }
+
+        if (!is_array($row)) {
+            throw new InvalidArgumentException('A row must be an array or a TableSeparator instance.');
+        }
+
+        $this->rows[] = array_values($row);
+
+        return $this;
+    }
+
+    public function setRow($column, array $row)
+    {
+        $this->rows[$column] = $row;
+
+        return $this;
+    }
+
+    /**
+     * Renders table to output.
+     *
+     * Example:
+     * +---------------+-----------------------+------------------+
+     * | ISBN          | Title                 | Author           |
+     * +---------------+-----------------------+------------------+
+     * | 99921-58-10-7 | Divine Comedy         | Dante Alighieri  |
+     * | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |
+     * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |
+     * +---------------+-----------------------+------------------+
+     */
+    public function render()
+    {
+        $this->calculateNumberOfColumns();
+        $rows = $this->buildTableRows($this->rows);
+        $headers = $this->buildTableRows($this->headers);
+
+        $this->calculateColumnsWidth(array_merge($headers, $rows));
+
+        $this->renderRowSeparator();
+        if (!empty($headers)) {
+            foreach ($headers as $header) {
+                $this->renderRow($header, $this->style->getCellHeaderFormat());
+                $this->renderRowSeparator();
+            }
+        }
+        foreach ($rows as $row) {
+            if ($row instanceof TableSeparator) {
+                $this->renderRowSeparator();
+            } else {
+                $this->renderRow($row, $this->style->getCellRowFormat());
+            }
+        }
+        if (!empty($rows)) {
+            $this->renderRowSeparator();
+        }
+
+        $this->cleanup();
+    }
+
+    /**
+     * Renders horizontal header separator.
+     *
+     * Example: +-----+-----------+-------+
+     */
+    private function renderRowSeparator()
+    {
+        if (0 === $count = $this->numberOfColumns) {
+            return;
+        }
+
+        if (!$this->style->getHorizontalBorderChar() && !$this->style->getCrossingChar()) {
+            return;
+        }
+
+        $markup = $this->style->getCrossingChar();
+        for ($column = 0; $column < $count; ++$column) {
+            $markup .= str_repeat($this->style->getHorizontalBorderChar(), $this->columnWidths[$column]).$this->style->getCrossingChar();
+        }
+
+        $this->output->writeln(sprintf($this->style->getBorderFormat(), $markup));
+    }
+
+    /**
+     * Renders vertical column separator.
+     */
+    private function renderColumnSeparator()
+    {
+        return sprintf($this->style->getBorderFormat(), $this->style->getVerticalBorderChar());
+    }
+
+    /**
+     * Renders table row.
+     *
+     * Example: | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |
+     *
+     * @param array  $row
+     * @param string $cellFormat
+     */
+    private function renderRow(array $row, $cellFormat)
+    {
+        if (empty($row)) {
+            return;
+        }
+
+        $rowContent = $this->renderColumnSeparator();
+        foreach ($this->getRowColumns($row) as $column) {
+            $rowContent .= $this->renderCell($row, $column, $cellFormat);
+            $rowContent .= $this->renderColumnSeparator();
+        }
+        $this->output->writeln($rowContent);
+    }
+
+    /**
+     * Renders table cell with padding.
+     *
+     * @param array  $row
+     * @param int    $column
+     * @param string $cellFormat
+     */
+    private function renderCell(array $row, $column, $cellFormat)
+    {
+        $cell = isset($row[$column]) ? $row[$column] : '';
+        $width = $this->columnWidths[$column];
+        if ($cell instanceof TableCell && $cell->getColspan() > 1) {
+            // add the width of the following columns(numbers of colspan).
+            foreach (range($column + 1, $column + $cell->getColspan() - 1) as $nextColumn) {
+                $width += $this->getColumnSeparatorWidth() + $this->columnWidths[$nextColumn];
+            }
+        }
+
+        // str_pad won't work properly with multi-byte strings, we need to fix the padding
+        if (false !== $encoding = mb_detect_encoding($cell, null, true)) {
+            $width += strlen($cell) - mb_strwidth($cell, $encoding);
+        }
+
+        $style = $this->getColumnStyle($column);
+
+        if ($cell instanceof TableSeparator) {
+            return sprintf($style->getBorderFormat(), str_repeat($style->getHorizontalBorderChar(), $width));
+        }
+
+        $width += Helper::strlen($cell) - Helper::strlenWithoutDecoration($this->output->getFormatter(), $cell);
+        $content = sprintf($style->getCellRowContentFormat(), $cell);
+
+        return sprintf($cellFormat, str_pad($content, $width, $style->getPaddingChar(), $style->getPadType()));
+    }
+
+    /**
+     * Calculate number of columns for this table.
+     */
+    private function calculateNumberOfColumns()
+    {
+        if (null !== $this->numberOfColumns) {
+            return;
+        }
+
+        $columns = array(0);
+        foreach (array_merge($this->headers, $this->rows) as $row) {
+            if ($row instanceof TableSeparator) {
+                continue;
+            }
+
+            $columns[] = $this->getNumberOfColumns($row);
+        }
+
+        $this->numberOfColumns = max($columns);
+    }
+
+    private function buildTableRows($rows)
+    {
+        $unmergedRows = array();
+        for ($rowKey = 0; $rowKey < count($rows); ++$rowKey) {
+            $rows = $this->fillNextRows($rows, $rowKey);
+
+            // Remove any new line breaks and replace it with a new line
+            foreach ($rows[$rowKey] as $column => $cell) {
+                if (!strstr($cell, "\n")) {
+                    continue;
+                }
+                $lines = explode("\n", $cell);
+                foreach ($lines as $lineKey => $line) {
+                    if ($cell instanceof TableCell) {
+                        $line = new TableCell($line, array('colspan' => $cell->getColspan()));
+                    }
+                    if (0 === $lineKey) {
+                        $rows[$rowKey][$column] = $line;
+                    } else {
+                        $unmergedRows[$rowKey][$lineKey][$column] = $line;
+                    }
+                }
+            }
+        }
+
+        $tableRows = array();
+        foreach ($rows as $rowKey => $row) {
+            $tableRows[] = $this->fillCells($row);
+            if (isset($unmergedRows[$rowKey])) {
+                $tableRows = array_merge($tableRows, $unmergedRows[$rowKey]);
+            }
+        }
+
+        return $tableRows;
+    }
+
+    /**
+     * fill rows that contains rowspan > 1.
+     *
+     * @param array $rows
+     * @param int   $line
+     *
+     * @return array
+     */
+    private function fillNextRows($rows, $line)
+    {
+        $unmergedRows = array();
+        foreach ($rows[$line] as $column => $cell) {
+            if ($cell instanceof TableCell && $cell->getRowspan() > 1) {
+                $nbLines = $cell->getRowspan() - 1;
+                $lines = array($cell);
+                if (strstr($cell, "\n")) {
+                    $lines = explode("\n", $cell);
+                    $nbLines = count($lines) > $nbLines ? substr_count($cell, "\n") : $nbLines;
+
+                    $rows[$line][$column] = new TableCell($lines[0], array('colspan' => $cell->getColspan()));
+                    unset($lines[0]);
+                }
+
+                // create a two dimensional array (rowspan x colspan)
+                $unmergedRows = array_replace_recursive(array_fill($line + 1, $nbLines, array()), $unmergedRows);
+                foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) {
+                    $value = isset($lines[$unmergedRowKey - $line]) ? $lines[$unmergedRowKey - $line] : '';
+                    $unmergedRows[$unmergedRowKey][$column] = new TableCell($value, array('colspan' => $cell->getColspan()));
+                }
+            }
+        }
+
+        foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) {
+            // we need to know if $unmergedRow will be merged or inserted into $rows
+            if (isset($rows[$unmergedRowKey]) && is_array($rows[$unmergedRowKey]) && ($this->getNumberOfColumns($rows[$unmergedRowKey]) + $this->getNumberOfColumns($unmergedRows[$unmergedRowKey]) <= $this->numberOfColumns)) {
+                foreach ($unmergedRow as $cellKey => $cell) {
+                    // insert cell into row at cellKey position
+                    array_splice($rows[$unmergedRowKey], $cellKey, 0, array($cell));
+                }
+            } else {
+                $row = $this->copyRow($rows, $unmergedRowKey - 1);
+                foreach ($unmergedRow as $column => $cell) {
+                    if (!empty($cell)) {
+                        $row[$column] = $unmergedRow[$column];
+                    }
+                }
+                array_splice($rows, $unmergedRowKey, 0, array($row));
+            }
+        }
+
+        return $rows;
+    }
+
+    /**
+     * fill cells for a row that contains colspan > 1.
+     *
+     * @param array $row
+     *
+     * @return array
+     */
+    private function fillCells($row)
+    {
+        $newRow = array();
+        foreach ($row as $column => $cell) {
+            $newRow[] = $cell;
+            if ($cell instanceof TableCell && $cell->getColspan() > 1) {
+                foreach (range($column + 1, $column + $cell->getColspan() - 1) as $position) {
+                    // insert empty value at column position
+                    $newRow[] = '';
+                }
+            }
+        }
+
+        return $newRow ?: $row;
+    }
+
+    /**
+     * @param array $rows
+     * @param int   $line
+     *
+     * @return array
+     */
+    private function copyRow($rows, $line)
+    {
+        $row = $rows[$line];
+        foreach ($row as $cellKey => $cellValue) {
+            $row[$cellKey] = '';
+            if ($cellValue instanceof TableCell) {
+                $row[$cellKey] = new TableCell('', array('colspan' => $cellValue->getColspan()));
+            }
+        }
+
+        return $row;
+    }
+
+    /**
+     * Gets number of columns by row.
+     *
+     * @param array $row
+     *
+     * @return int
+     */
+    private function getNumberOfColumns(array $row)
+    {
+        $columns = count($row);
+        foreach ($row as $column) {
+            $columns += $column instanceof TableCell ? ($column->getColspan() - 1) : 0;
+        }
+
+        return $columns;
+    }
+
+    /**
+     * Gets list of columns for the given row.
+     *
+     * @param array $row
+     *
+     * @return array
+     */
+    private function getRowColumns($row)
+    {
+        $columns = range(0, $this->numberOfColumns - 1);
+        foreach ($row as $cellKey => $cell) {
+            if ($cell instanceof TableCell && $cell->getColspan() > 1) {
+                // exclude grouped columns.
+                $columns = array_diff($columns, range($cellKey + 1, $cellKey + $cell->getColspan() - 1));
+            }
+        }
+
+        return $columns;
+    }
+
+    /**
+     * Calculates columns widths.
+     *
+     * @param array $rows
+     */
+    private function calculateColumnsWidth($rows)
+    {
+        for ($column = 0; $column < $this->numberOfColumns; ++$column) {
+            $lengths = array();
+            foreach ($rows as $row) {
+                if ($row instanceof TableSeparator) {
+                    continue;
+                }
+
+                foreach ($row as $i => $cell) {
+                    if ($cell instanceof TableCell) {
+                        $textLength = strlen($cell);
+                        if ($textLength > 0) {
+                            $contentColumns = str_split($cell, ceil($textLength / $cell->getColspan()));
+                            foreach ($contentColumns as $position => $content) {
+                                $row[$i + $position] = $content;
+                            }
+                        }
+                    }
+                }
+
+                $lengths[] = $this->getCellWidth($row, $column);
+            }
+
+            $this->columnWidths[$column] = max($lengths) + strlen($this->style->getCellRowContentFormat()) - 2;
+        }
+    }
+
+    /**
+     * Gets column width.
+     *
+     * @return int
+     */
+    private function getColumnSeparatorWidth()
+    {
+        return strlen(sprintf($this->style->getBorderFormat(), $this->style->getVerticalBorderChar()));
+    }
+
+    /**
+     * Gets cell width.
+     *
+     * @param array $row
+     * @param int   $column
+     *
+     * @return int
+     */
+    private function getCellWidth(array $row, $column)
+    {
+        if (isset($row[$column])) {
+            $cell = $row[$column];
+            $cellWidth = Helper::strlenWithoutDecoration($this->output->getFormatter(), $cell);
+
+            return $cellWidth;
+        }
+
+        return 0;
+    }
+
+    /**
+     * Called after rendering to cleanup cache data.
+     */
+    private function cleanup()
+    {
+        $this->columnWidths = array();
+        $this->numberOfColumns = null;
+    }
+
+    private static function initStyles()
+    {
+        $borderless = new TableStyle();
+        $borderless
+            ->setHorizontalBorderChar('=')
+            ->setVerticalBorderChar(' ')
+            ->setCrossingChar(' ')
+        ;
+
+        $compact = new TableStyle();
+        $compact
+            ->setHorizontalBorderChar('')
+            ->setVerticalBorderChar(' ')
+            ->setCrossingChar('')
+            ->setCellRowContentFormat('%s')
+        ;
+
+        $styleGuide = new TableStyle();
+        $styleGuide
+            ->setHorizontalBorderChar('-')
+            ->setVerticalBorderChar(' ')
+            ->setCrossingChar(' ')
+            ->setCellHeaderFormat('%s')
+        ;
+
+        return array(
+            'default' => new TableStyle(),
+            'borderless' => $borderless,
+            'compact' => $compact,
+            'symfony-style-guide' => $styleGuide,
+        );
+    }
+
+    private function resolveStyle($name)
+    {
+        if ($name instanceof TableStyle) {
+            return $name;
+        }
+
+        if (isset(self::$styles[$name])) {
+            return self::$styles[$name];
+        }
+
+        throw new InvalidArgumentException(sprintf('Style "%s" is not defined.', $name));
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/TableCell.php
@@ -0,0 +1,79 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+
+/**
+ * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
+ */
+class TableCell
+{
+    /**
+     * @var string
+     */
+    private $value;
+
+    /**
+     * @var array
+     */
+    private $options = array(
+        'rowspan' => 1,
+        'colspan' => 1,
+    );
+
+    /**
+     * @param string $value
+     * @param array  $options
+     */
+    public function __construct($value = '', array $options = array())
+    {
+        $this->value = $value;
+
+        // check option names
+        if ($diff = array_diff(array_keys($options), array_keys($this->options))) {
+            throw new InvalidArgumentException(sprintf('The TableCell does not support the following options: \'%s\'.', implode('\', \'', $diff)));
+        }
+
+        $this->options = array_merge($this->options, $options);
+    }
+
+    /**
+     * Returns the cell value.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->value;
+    }
+
+    /**
+     * Gets number of colspan.
+     *
+     * @return int
+     */
+    public function getColspan()
+    {
+        return (int) $this->options['colspan'];
+    }
+
+    /**
+     * Gets number of rowspan.
+     *
+     * @return int
+     */
+    public function getRowspan()
+    {
+        return (int) $this->options['rowspan'];
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/TableHelper.php
@@ -0,0 +1,269 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Output\NullOutput;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+
+/**
+ * Provides helpers to display table output.
+ *
+ * @author Саша Стаменковић <umpirsky@gmail.com>
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 2.5, to be removed in 3.0
+ *             Use {@link Table} instead.
+ */
+class TableHelper extends Helper
+{
+    const LAYOUT_DEFAULT = 0;
+    const LAYOUT_BORDERLESS = 1;
+    const LAYOUT_COMPACT = 2;
+
+    /**
+     * @var Table
+     */
+    private $table;
+
+    public function __construct($triggerDeprecationError = true)
+    {
+        if ($triggerDeprecationError) {
+            @trigger_error('The '.__CLASS__.' class is deprecated since version 2.5 and will be removed in 3.0. Use the Symfony\Component\Console\Helper\Table class instead.', E_USER_DEPRECATED);
+        }
+
+        $this->table = new Table(new NullOutput());
+    }
+
+    /**
+     * Sets table layout type.
+     *
+     * @param int $layout self::LAYOUT_*
+     *
+     * @return TableHelper
+     *
+     * @throws InvalidArgumentException when the table layout is not known
+     */
+    public function setLayout($layout)
+    {
+        switch ($layout) {
+            case self::LAYOUT_BORDERLESS:
+                $this->table->setStyle('borderless');
+                break;
+
+            case self::LAYOUT_COMPACT:
+                $this->table->setStyle('compact');
+                break;
+
+            case self::LAYOUT_DEFAULT:
+                $this->table->setStyle('default');
+                break;
+
+            default:
+                throw new InvalidArgumentException(sprintf('Invalid table layout "%s".', $layout));
+        }
+
+        return $this;
+    }
+
+    public function setHeaders(array $headers)
+    {
+        $this->table->setHeaders($headers);
+
+        return $this;
+    }
+
+    public function setRows(array $rows)
+    {
+        $this->table->setRows($rows);
+
+        return $this;
+    }
+
+    public function addRows(array $rows)
+    {
+        $this->table->addRows($rows);
+
+        return $this;
+    }
+
+    public function addRow(array $row)
+    {
+        $this->table->addRow($row);
+
+        return $this;
+    }
+
+    public function setRow($column, array $row)
+    {
+        $this->table->setRow($column, $row);
+
+        return $this;
+    }
+
+    /**
+     * Sets padding character, used for cell padding.
+     *
+     * @param string $paddingChar
+     *
+     * @return TableHelper
+     */
+    public function setPaddingChar($paddingChar)
+    {
+        $this->table->getStyle()->setPaddingChar($paddingChar);
+
+        return $this;
+    }
+
+    /**
+     * Sets horizontal border character.
+     *
+     * @param string $horizontalBorderChar
+     *
+     * @return TableHelper
+     */
+    public function setHorizontalBorderChar($horizontalBorderChar)
+    {
+        $this->table->getStyle()->setHorizontalBorderChar($horizontalBorderChar);
+
+        return $this;
+    }
+
+    /**
+     * Sets vertical border character.
+     *
+     * @param string $verticalBorderChar
+     *
+     * @return TableHelper
+     */
+    public function setVerticalBorderChar($verticalBorderChar)
+    {
+        $this->table->getStyle()->setVerticalBorderChar($verticalBorderChar);
+
+        return $this;
+    }
+
+    /**
+     * Sets crossing character.
+     *
+     * @param string $crossingChar
+     *
+     * @return TableHelper
+     */
+    public function setCrossingChar($crossingChar)
+    {
+        $this->table->getStyle()->setCrossingChar($crossingChar);
+
+        return $this;
+    }
+
+    /**
+     * Sets header cell format.
+     *
+     * @param string $cellHeaderFormat
+     *
+     * @return TableHelper
+     */
+    public function setCellHeaderFormat($cellHeaderFormat)
+    {
+        $this->table->getStyle()->setCellHeaderFormat($cellHeaderFormat);
+
+        return $this;
+    }
+
+    /**
+     * Sets row cell format.
+     *
+     * @param string $cellRowFormat
+     *
+     * @return TableHelper
+     */
+    public function setCellRowFormat($cellRowFormat)
+    {
+        $this->table->getStyle()->setCellHeaderFormat($cellRowFormat);
+
+        return $this;
+    }
+
+    /**
+     * Sets row cell content format.
+     *
+     * @param string $cellRowContentFormat
+     *
+     * @return TableHelper
+     */
+    public function setCellRowContentFormat($cellRowContentFormat)
+    {
+        $this->table->getStyle()->setCellRowContentFormat($cellRowContentFormat);
+
+        return $this;
+    }
+
+    /**
+     * Sets table border format.
+     *
+     * @param string $borderFormat
+     *
+     * @return TableHelper
+     */
+    public function setBorderFormat($borderFormat)
+    {
+        $this->table->getStyle()->setBorderFormat($borderFormat);
+
+        return $this;
+    }
+
+    /**
+     * Sets cell padding type.
+     *
+     * @param int $padType STR_PAD_*
+     *
+     * @return TableHelper
+     */
+    public function setPadType($padType)
+    {
+        $this->table->getStyle()->setPadType($padType);
+
+        return $this;
+    }
+
+    /**
+     * Renders table to output.
+     *
+     * Example:
+     * +---------------+-----------------------+------------------+
+     * | ISBN          | Title                 | Author           |
+     * +---------------+-----------------------+------------------+
+     * | 99921-58-10-7 | Divine Comedy         | Dante Alighieri  |
+     * | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |
+     * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |
+     * +---------------+-----------------------+------------------+
+     *
+     * @param OutputInterface $output
+     */
+    public function render(OutputInterface $output)
+    {
+        $p = new \ReflectionProperty($this->table, 'output');
+        $p->setAccessible(true);
+        $p->setValue($this->table, $output);
+
+        $this->table->render();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'table';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/TableSeparator.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+/**
+ * Marks a row as being a separator.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TableSeparator extends TableCell
+{
+    /**
+     * @param array $options
+     */
+    public function __construct(array $options = array())
+    {
+        parent::__construct('', $options);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Helper/TableStyle.php
@@ -0,0 +1,258 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Helper;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Exception\LogicException;
+
+/**
+ * Defines the styles for a Table.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Саша Стаменковић <umpirsky@gmail.com>
+ */
+class TableStyle
+{
+    private $paddingChar = ' ';
+    private $horizontalBorderChar = '-';
+    private $verticalBorderChar = '|';
+    private $crossingChar = '+';
+    private $cellHeaderFormat = '<info>%s</info>';
+    private $cellRowFormat = '%s';
+    private $cellRowContentFormat = ' %s ';
+    private $borderFormat = '%s';
+    private $padType = STR_PAD_RIGHT;
+
+    /**
+     * Sets padding character, used for cell padding.
+     *
+     * @param string $paddingChar
+     *
+     * @return TableStyle
+     */
+    public function setPaddingChar($paddingChar)
+    {
+        if (!$paddingChar) {
+            throw new LogicException('The padding char must not be empty');
+        }
+
+        $this->paddingChar = $paddingChar;
+
+        return $this;
+    }
+
+    /**
+     * Gets padding character, used for cell padding.
+     *
+     * @return string
+     */
+    public function getPaddingChar()
+    {
+        return $this->paddingChar;
+    }
+
+    /**
+     * Sets horizontal border character.
+     *
+     * @param string $horizontalBorderChar
+     *
+     * @return TableStyle
+     */
+    public function setHorizontalBorderChar($horizontalBorderChar)
+    {
+        $this->horizontalBorderChar = $horizontalBorderChar;
+
+        return $this;
+    }
+
+    /**
+     * Gets horizontal border character.
+     *
+     * @return string
+     */
+    public function getHorizontalBorderChar()
+    {
+        return $this->horizontalBorderChar;
+    }
+
+    /**
+     * Sets vertical border character.
+     *
+     * @param string $verticalBorderChar
+     *
+     * @return TableStyle
+     */
+    public function setVerticalBorderChar($verticalBorderChar)
+    {
+        $this->verticalBorderChar = $verticalBorderChar;
+
+        return $this;
+    }
+
+    /**
+     * Gets vertical border character.
+     *
+     * @return string
+     */
+    public function getVerticalBorderChar()
+    {
+        return $this->verticalBorderChar;
+    }
+
+    /**
+     * Sets crossing character.
+     *
+     * @param string $crossingChar
+     *
+     * @return TableStyle
+     */
+    public function setCrossingChar($crossingChar)
+    {
+        $this->crossingChar = $crossingChar;
+
+        return $this;
+    }
+
+    /**
+     * Gets crossing character.
+     *
+     * @return string $crossingChar
+     */
+    public function getCrossingChar()
+    {
+        return $this->crossingChar;
+    }
+
+    /**
+     * Sets header cell format.
+     *
+     * @param string $cellHeaderFormat
+     *
+     * @return TableStyle
+     */
+    public function setCellHeaderFormat($cellHeaderFormat)
+    {
+        $this->cellHeaderFormat = $cellHeaderFormat;
+
+        return $this;
+    }
+
+    /**
+     * Gets header cell format.
+     *
+     * @return string
+     */
+    public function getCellHeaderFormat()
+    {
+        return $this->cellHeaderFormat;
+    }
+
+    /**
+     * Sets row cell format.
+     *
+     * @param string $cellRowFormat
+     *
+     * @return TableStyle
+     */
+    public function setCellRowFormat($cellRowFormat)
+    {
+        $this->cellRowFormat = $cellRowFormat;
+
+        return $this;
+    }
+
+    /**
+     * Gets row cell format.
+     *
+     * @return string
+     */
+    public function getCellRowFormat()
+    {
+        return $this->cellRowFormat;
+    }
+
+    /**
+     * Sets row cell content format.
+     *
+     * @param string $cellRowContentFormat
+     *
+     * @return TableStyle
+     */
+    public function setCellRowContentFormat($cellRowContentFormat)
+    {
+        $this->cellRowContentFormat = $cellRowContentFormat;
+
+        return $this;
+    }
+
+    /**
+     * Gets row cell content format.
+     *
+     * @return string
+     */
+    public function getCellRowContentFormat()
+    {
+        return $this->cellRowContentFormat;
+    }
+
+    /**
+     * Sets table border format.
+     *
+     * @param string $borderFormat
+     *
+     * @return TableStyle
+     */
+    public function setBorderFormat($borderFormat)
+    {
+        $this->borderFormat = $borderFormat;
+
+        return $this;
+    }
+
+    /**
+     * Gets table border format.
+     *
+     * @return string
+     */
+    public function getBorderFormat()
+    {
+        return $this->borderFormat;
+    }
+
+    /**
+     * Sets cell padding type.
+     *
+     * @param int $padType STR_PAD_*
+     *
+     * @return TableStyle
+     */
+    public function setPadType($padType)
+    {
+        if (!in_array($padType, array(STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH), true)) {
+            throw new InvalidArgumentException('Invalid padding type. Expected one of (STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH).');
+        }
+
+        $this->padType = $padType;
+
+        return $this;
+    }
+
+    /**
+     * Gets cell padding type.
+     *
+     * @return int
+     */
+    public function getPadType()
+    {
+        return $this->padType;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Input/ArgvInput.php
@@ -0,0 +1,342 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Input;
+
+use Symfony\Component\Console\Exception\RuntimeException;
+
+/**
+ * ArgvInput represents an input coming from the CLI arguments.
+ *
+ * Usage:
+ *
+ *     $input = new ArgvInput();
+ *
+ * By default, the `$_SERVER['argv']` array is used for the input values.
+ *
+ * This can be overridden by explicitly passing the input values in the constructor:
+ *
+ *     $input = new ArgvInput($_SERVER['argv']);
+ *
+ * If you pass it yourself, don't forget that the first element of the array
+ * is the name of the running application.
+ *
+ * When passing an argument to the constructor, be sure that it respects
+ * the same rules as the argv one. It's almost always better to use the
+ * `StringInput` when you want to provide your own input.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @see http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html
+ * @see http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02
+ */
+class ArgvInput extends Input
+{
+    private $tokens;
+    private $parsed;
+
+    /**
+     * Constructor.
+     *
+     * @param array|null           $argv       An array of parameters from the CLI (in the argv format)
+     * @param InputDefinition|null $definition A InputDefinition instance
+     */
+    public function __construct(array $argv = null, InputDefinition $definition = null)
+    {
+        if (null === $argv) {
+            $argv = $_SERVER['argv'];
+        }
+
+        // strip the application name
+        array_shift($argv);
+
+        $this->tokens = $argv;
+
+        parent::__construct($definition);
+    }
+
+    protected function setTokens(array $tokens)
+    {
+        $this->tokens = $tokens;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parse()
+    {
+        $parseOptions = true;
+        $this->parsed = $this->tokens;
+        while (null !== $token = array_shift($this->parsed)) {
+            if ($parseOptions && '' == $token) {
+                $this->parseArgument($token);
+            } elseif ($parseOptions && '--' == $token) {
+                $parseOptions = false;
+            } elseif ($parseOptions && 0 === strpos($token, '--')) {
+                $this->parseLongOption($token);
+            } elseif ($parseOptions && '-' === $token[0] && '-' !== $token) {
+                $this->parseShortOption($token);
+            } else {
+                $this->parseArgument($token);
+            }
+        }
+    }
+
+    /**
+     * Parses a short option.
+     *
+     * @param string $token The current token
+     */
+    private function parseShortOption($token)
+    {
+        $name = substr($token, 1);
+
+        if (strlen($name) > 1) {
+            if ($this->definition->hasShortcut($name[0]) && $this->definition->getOptionForShortcut($name[0])->acceptValue()) {
+                // an option with a value (with no space)
+                $this->addShortOption($name[0], substr($name, 1));
+            } else {
+                $this->parseShortOptionSet($name);
+            }
+        } else {
+            $this->addShortOption($name, null);
+        }
+    }
+
+    /**
+     * Parses a short option set.
+     *
+     * @param string $name The current token
+     *
+     * @throws RuntimeException When option given doesn't exist
+     */
+    private function parseShortOptionSet($name)
+    {
+        $len = strlen($name);
+        for ($i = 0; $i < $len; ++$i) {
+            if (!$this->definition->hasShortcut($name[$i])) {
+                throw new RuntimeException(sprintf('The "-%s" option does not exist.', $name[$i]));
+            }
+
+            $option = $this->definition->getOptionForShortcut($name[$i]);
+            if ($option->acceptValue()) {
+                $this->addLongOption($option->getName(), $i === $len - 1 ? null : substr($name, $i + 1));
+
+                break;
+            } else {
+                $this->addLongOption($option->getName(), null);
+            }
+        }
+    }
+
+    /**
+     * Parses a long option.
+     *
+     * @param string $token The current token
+     */
+    private function parseLongOption($token)
+    {
+        $name = substr($token, 2);
+
+        if (false !== $pos = strpos($name, '=')) {
+            if (0 === strlen($value = substr($name, $pos + 1))) {
+                array_unshift($this->parsed, null);
+            }
+            $this->addLongOption(substr($name, 0, $pos), $value);
+        } else {
+            $this->addLongOption($name, null);
+        }
+    }
+
+    /**
+     * Parses an argument.
+     *
+     * @param string $token The current token
+     *
+     * @throws RuntimeException When too many arguments are given
+     */
+    private function parseArgument($token)
+    {
+        $c = count($this->arguments);
+
+        // if input is expecting another argument, add it
+        if ($this->definition->hasArgument($c)) {
+            $arg = $this->definition->getArgument($c);
+            $this->arguments[$arg->getName()] = $arg->isArray() ? array($token) : $token;
+
+        // if last argument isArray(), append token to last argument
+        } elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) {
+            $arg = $this->definition->getArgument($c - 1);
+            $this->arguments[$arg->getName()][] = $token;
+
+        // unexpected argument
+        } else {
+            $all = $this->definition->getArguments();
+            if (count($all)) {
+                throw new RuntimeException(sprintf('Too many arguments, expected arguments "%s".', implode('" "', array_keys($all))));
+            }
+
+            throw new RuntimeException(sprintf('No arguments expected, got "%s".', $token));
+        }
+    }
+
+    /**
+     * Adds a short option value.
+     *
+     * @param string $shortcut The short option key
+     * @param mixed  $value    The value for the option
+     *
+     * @throws RuntimeException When option given doesn't exist
+     */
+    private function addShortOption($shortcut, $value)
+    {
+        if (!$this->definition->hasShortcut($shortcut)) {
+            throw new RuntimeException(sprintf('The "-%s" option does not exist.', $shortcut));
+        }
+
+        $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value);
+    }
+
+    /**
+     * Adds a long option value.
+     *
+     * @param string $name  The long option key
+     * @param mixed  $value The value for the option
+     *
+     * @throws RuntimeException When option given doesn't exist
+     */
+    private function addLongOption($name, $value)
+    {
+        if (!$this->definition->hasOption($name)) {
+            throw new RuntimeException(sprintf('The "--%s" option does not exist.', $name));
+        }
+
+        $option = $this->definition->getOption($name);
+
+        // Convert empty values to null
+        if (!isset($value[0])) {
+            $value = null;
+        }
+
+        if (null !== $value && !$option->acceptValue()) {
+            throw new RuntimeException(sprintf('The "--%s" option does not accept a value.', $name));
+        }
+
+        if (null === $value && $option->acceptValue() && count($this->parsed)) {
+            // if option accepts an optional or mandatory argument
+            // let's see if there is one provided
+            $next = array_shift($this->parsed);
+            if (isset($next[0]) && '-' !== $next[0]) {
+                $value = $next;
+            } elseif (empty($next)) {
+                $value = null;
+            } else {
+                array_unshift($this->parsed, $next);
+            }
+        }
+
+        if (null === $value) {
+            if ($option->isValueRequired()) {
+                throw new RuntimeException(sprintf('The "--%s" option requires a value.', $name));
+            }
+
+            if (!$option->isArray()) {
+                $value = $option->isValueOptional() ? $option->getDefault() : true;
+            }
+        }
+
+        if ($option->isArray()) {
+            $this->options[$name][] = $value;
+        } else {
+            $this->options[$name] = $value;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFirstArgument()
+    {
+        foreach ($this->tokens as $token) {
+            if ($token && '-' === $token[0]) {
+                continue;
+            }
+
+            return $token;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasParameterOption($values)
+    {
+        $values = (array) $values;
+
+        foreach ($this->tokens as $token) {
+            foreach ($values as $value) {
+                if ($token === $value || 0 === strpos($token, $value.'=')) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getParameterOption($values, $default = false)
+    {
+        $values = (array) $values;
+        $tokens = $this->tokens;
+
+        while (0 < count($tokens)) {
+            $token = array_shift($tokens);
+
+            foreach ($values as $value) {
+                if ($token === $value || 0 === strpos($token, $value.'=')) {
+                    if (false !== $pos = strpos($token, '=')) {
+                        return substr($token, $pos + 1);
+                    }
+
+                    return array_shift($tokens);
+                }
+            }
+        }
+
+        return $default;
+    }
+
+    /**
+     * Returns a stringified representation of the args passed to the command.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        $self = $this;
+        $tokens = array_map(function ($token) use ($self) {
+            if (preg_match('{^(-[^=]+=)(.+)}', $token, $match)) {
+                return $match[1].$self->escapeToken($match[2]);
+            }
+
+            if ($token && $token[0] !== '-') {
+                return $self->escapeToken($token);
+            }
+
+            return $token;
+        }, $this->tokens);
+
+        return implode(' ', $tokens);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Input/ArrayInput.php
@@ -0,0 +1,193 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Input;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Exception\InvalidOptionException;
+
+/**
+ * ArrayInput represents an input provided as an array.
+ *
+ * Usage:
+ *
+ *     $input = new ArrayInput(array('name' => 'foo', '--bar' => 'foobar'));
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ArrayInput extends Input
+{
+    private $parameters;
+
+    /**
+     * Constructor.
+     *
+     * @param array                $parameters An array of parameters
+     * @param InputDefinition|null $definition A InputDefinition instance
+     */
+    public function __construct(array $parameters, InputDefinition $definition = null)
+    {
+        $this->parameters = $parameters;
+
+        parent::__construct($definition);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFirstArgument()
+    {
+        foreach ($this->parameters as $key => $value) {
+            if ($key && '-' === $key[0]) {
+                continue;
+            }
+
+            return $value;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasParameterOption($values)
+    {
+        $values = (array) $values;
+
+        foreach ($this->parameters as $k => $v) {
+            if (!is_int($k)) {
+                $v = $k;
+            }
+
+            if (in_array($v, $values)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getParameterOption($values, $default = false)
+    {
+        $values = (array) $values;
+
+        foreach ($this->parameters as $k => $v) {
+            if (is_int($k)) {
+                if (in_array($v, $values)) {
+                    return true;
+                }
+            } elseif (in_array($k, $values)) {
+                return $v;
+            }
+        }
+
+        return $default;
+    }
+
+    /**
+     * Returns a stringified representation of the args passed to the command.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        $params = array();
+        foreach ($this->parameters as $param => $val) {
+            if ($param && '-' === $param[0]) {
+                $params[] = $param.('' != $val ? '='.$this->escapeToken($val) : '');
+            } else {
+                $params[] = $this->escapeToken($val);
+            }
+        }
+
+        return implode(' ', $params);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function parse()
+    {
+        foreach ($this->parameters as $key => $value) {
+            if (0 === strpos($key, '--')) {
+                $this->addLongOption(substr($key, 2), $value);
+            } elseif ('-' === $key[0]) {
+                $this->addShortOption(substr($key, 1), $value);
+            } else {
+                $this->addArgument($key, $value);
+            }
+        }
+    }
+
+    /**
+     * Adds a short option value.
+     *
+     * @param string $shortcut The short option key
+     * @param mixed  $value    The value for the option
+     *
+     * @throws InvalidOptionException When option given doesn't exist
+     */
+    private function addShortOption($shortcut, $value)
+    {
+        if (!$this->definition->hasShortcut($shortcut)) {
+            throw new InvalidOptionException(sprintf('The "-%s" option does not exist.', $shortcut));
+        }
+
+        $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value);
+    }
+
+    /**
+     * Adds a long option value.
+     *
+     * @param string $name  The long option key
+     * @param mixed  $value The value for the option
+     *
+     * @throws InvalidOptionException When option given doesn't exist
+     * @throws InvalidOptionException When a required value is missing
+     */
+    private function addLongOption($name, $value)
+    {
+        if (!$this->definition->hasOption($name)) {
+            throw new InvalidOptionException(sprintf('The "--%s" option does not exist.', $name));
+        }
+
+        $option = $this->definition->getOption($name);
+
+        if (null === $value) {
+            if ($option->isValueRequired()) {
+                throw new InvalidOptionException(sprintf('The "--%s" option requires a value.', $name));
+            }
+
+            $value = $option->isValueOptional() ? $option->getDefault() : true;
+        }
+
+        $this->options[$name] = $value;
+    }
+
+    /**
+     * Adds an argument value.
+     *
+     * @param string $name  The argument name
+     * @param mixed  $value The value for the argument
+     *
+     * @throws InvalidArgumentException When argument given doesn't exist
+     */
+    private function addArgument($name, $value)
+    {
+        if (!$this->definition->hasArgument($name)) {
+            throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
+        }
+
+        $this->arguments[$name] = $value;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Input/Input.php
@@ -0,0 +1,194 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Input;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Exception\RuntimeException;
+
+/**
+ * Input is the base class for all concrete Input classes.
+ *
+ * Three concrete classes are provided by default:
+ *
+ *  * `ArgvInput`: The input comes from the CLI arguments (argv)
+ *  * `StringInput`: The input is provided as a string
+ *  * `ArrayInput`: The input is provided as an array
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class Input implements InputInterface
+{
+    /**
+     * @var InputDefinition
+     */
+    protected $definition;
+    protected $options = array();
+    protected $arguments = array();
+    protected $interactive = true;
+
+    /**
+     * Constructor.
+     *
+     * @param InputDefinition|null $definition A InputDefinition instance
+     */
+    public function __construct(InputDefinition $definition = null)
+    {
+        if (null === $definition) {
+            $this->definition = new InputDefinition();
+        } else {
+            $this->bind($definition);
+            $this->validate();
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function bind(InputDefinition $definition)
+    {
+        $this->arguments = array();
+        $this->options = array();
+        $this->definition = $definition;
+
+        $this->parse();
+    }
+
+    /**
+     * Processes command line arguments.
+     */
+    abstract protected function parse();
+
+    /**
+     * {@inheritdoc}
+     */
+    public function validate()
+    {
+        $definition = $this->definition;
+        $givenArguments = $this->arguments;
+
+        $missingArguments = array_filter(array_keys($definition->getArguments()), function ($argument) use ($definition, $givenArguments) {
+            return !array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired();
+        });
+
+        if (count($missingArguments) > 0) {
+            throw new RuntimeException(sprintf('Not enough arguments (missing: "%s").', implode(', ', $missingArguments)));
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isInteractive()
+    {
+        return $this->interactive;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setInteractive($interactive)
+    {
+        $this->interactive = (bool) $interactive;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getArguments()
+    {
+        return array_merge($this->definition->getArgumentDefaults(), $this->arguments);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getArgument($name)
+    {
+        if (!$this->definition->hasArgument($name)) {
+            throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
+        }
+
+        return isset($this->arguments[$name]) ? $this->arguments[$name] : $this->definition->getArgument($name)->getDefault();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setArgument($name, $value)
+    {
+        if (!$this->definition->hasArgument($name)) {
+            throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
+        }
+
+        $this->arguments[$name] = $value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasArgument($name)
+    {
+        return $this->definition->hasArgument($name);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getOptions()
+    {
+        return array_merge($this->definition->getOptionDefaults(), $this->options);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getOption($name)
+    {
+        if (!$this->definition->hasOption($name)) {
+            throw new InvalidArgumentException(sprintf('The "%s" option does not exist.', $name));
+        }
+
+        return isset($this->options[$name]) ? $this->options[$name] : $this->definition->getOption($name)->getDefault();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setOption($name, $value)
+    {
+        if (!$this->definition->hasOption($name)) {
+            throw new InvalidArgumentException(sprintf('The "%s" option does not exist.', $name));
+        }
+
+        $this->options[$name] = $value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasOption($name)
+    {
+        return $this->definition->hasOption($name);
+    }
+
+    /**
+     * Escapes a token through escapeshellarg if it contains unsafe chars.
+     *
+     * @param string $token
+     *
+     * @return string
+     */
+    public function escapeToken($token)
+    {
+        return preg_match('{^[\w-]+$}', $token) ? $token : escapeshellarg($token);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Input/InputArgument.php
@@ -0,0 +1,131 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Input;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Exception\LogicException;
+
+/**
+ * Represents a command line argument.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class InputArgument
+{
+    const REQUIRED = 1;
+    const OPTIONAL = 2;
+    const IS_ARRAY = 4;
+
+    private $name;
+    private $mode;
+    private $default;
+    private $description;
+
+    /**
+     * Constructor.
+     *
+     * @param string $name        The argument name
+     * @param int    $mode        The argument mode: self::REQUIRED or self::OPTIONAL
+     * @param string $description A description text
+     * @param mixed  $default     The default value (for self::OPTIONAL mode only)
+     *
+     * @throws InvalidArgumentException When argument mode is not valid
+     */
+    public function __construct($name, $mode = null, $description = '', $default = null)
+    {
+        if (null === $mode) {
+            $mode = self::OPTIONAL;
+        } elseif (!is_int($mode) || $mode > 7 || $mode < 1) {
+            throw new InvalidArgumentException(sprintf('Argument mode "%s" is not valid.', $mode));
+        }
+
+        $this->name = $name;
+        $this->mode = $mode;
+        $this->description = $description;
+
+        $this->setDefault($default);
+    }
+
+    /**
+     * Returns the argument name.
+     *
+     * @return string The argument name
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Returns true if the argument is required.
+     *
+     * @return bool true if parameter mode is self::REQUIRED, false otherwise
+     */
+    public function isRequired()
+    {
+        return self::REQUIRED === (self::REQUIRED & $this->mode);
+    }
+
+    /**
+     * Returns true if the argument can take multiple values.
+     *
+     * @return bool true if mode is self::IS_ARRAY, false otherwise
+     */
+    public function isArray()
+    {
+        return self::IS_ARRAY === (self::IS_ARRAY & $this->mode);
+    }
+
+    /**
+     * Sets the default value.
+     *
+     * @param mixed $default The default value
+     *
+     * @throws LogicException When incorrect default value is given
+     */
+    public function setDefault($default = null)
+    {
+        if (self::REQUIRED === $this->mode && null !== $default) {
+            throw new LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.');
+        }
+
+        if ($this->isArray()) {
+            if (null === $default) {
+                $default = array();
+            } elseif (!is_array($default)) {
+                throw new LogicException('A default value for an array argument must be an array.');
+            }
+        }
+
+        $this->default = $default;
+    }
+
+    /**
+     * Returns the default value.
+     *
+     * @return mixed The default value
+     */
+    public function getDefault()
+    {
+        return $this->default;
+    }
+
+    /**
+     * Returns the description text.
+     *
+     * @return string The description text
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Input/InputAwareInterface.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Input;
+
+/**
+ * InputAwareInterface should be implemented by classes that depends on the
+ * Console Input.
+ *
+ * @author Wouter J <waldio.webdesign@gmail.com>
+ */
+interface InputAwareInterface
+{
+    /**
+     * Sets the Console Input.
+     *
+     * @param InputInterface
+     */
+    public function setInput(InputInterface $input);
+}
--- /dev/null
+++ b/vendor/symfony/console/Input/InputDefinition.php
@@ -0,0 +1,460 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Input;
+
+use Symfony\Component\Console\Descriptor\TextDescriptor;
+use Symfony\Component\Console\Descriptor\XmlDescriptor;
+use Symfony\Component\Console\Output\BufferedOutput;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Exception\LogicException;
+
+/**
+ * A InputDefinition represents a set of valid command line arguments and options.
+ *
+ * Usage:
+ *
+ *     $definition = new InputDefinition(array(
+ *       new InputArgument('name', InputArgument::REQUIRED),
+ *       new InputOption('foo', 'f', InputOption::VALUE_REQUIRED),
+ *     ));
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class InputDefinition
+{
+    private $arguments;
+    private $requiredCount;
+    private $hasAnArrayArgument = false;
+    private $hasOptional;
+    private $options;
+    private $shortcuts;
+
+    /**
+     * Constructor.
+     *
+     * @param array $definition An array of InputArgument and InputOption instance
+     */
+    public function __construct(array $definition = array())
+    {
+        $this->setDefinition($definition);
+    }
+
+    /**
+     * Sets the definition of the input.
+     *
+     * @param array $definition The definition array
+     */
+    public function setDefinition(array $definition)
+    {
+        $arguments = array();
+        $options = array();
+        foreach ($definition as $item) {
+            if ($item instanceof InputOption) {
+                $options[] = $item;
+            } else {
+                $arguments[] = $item;
+            }
+        }
+
+        $this->setArguments($arguments);
+        $this->setOptions($options);
+    }
+
+    /**
+     * Sets the InputArgument objects.
+     *
+     * @param InputArgument[] $arguments An array of InputArgument objects
+     */
+    public function setArguments($arguments = array())
+    {
+        $this->arguments = array();
+        $this->requiredCount = 0;
+        $this->hasOptional = false;
+        $this->hasAnArrayArgument = false;
+        $this->addArguments($arguments);
+    }
+
+    /**
+     * Adds an array of InputArgument objects.
+     *
+     * @param InputArgument[] $arguments An array of InputArgument objects
+     */
+    public function addArguments($arguments = array())
+    {
+        if (null !== $arguments) {
+            foreach ($arguments as $argument) {
+                $this->addArgument($argument);
+            }
+        }
+    }
+
+    /**
+     * Adds an InputArgument object.
+     *
+     * @param InputArgument $argument An InputArgument object
+     *
+     * @throws LogicException When incorrect argument is given
+     */
+    public function addArgument(InputArgument $argument)
+    {
+        if (isset($this->arguments[$argument->getName()])) {
+            throw new LogicException(sprintf('An argument with name "%s" already exists.', $argument->getName()));
+        }
+
+        if ($this->hasAnArrayArgument) {
+            throw new LogicException('Cannot add an argument after an array argument.');
+        }
+
+        if ($argument->isRequired() && $this->hasOptional) {
+            throw new LogicException('Cannot add a required argument after an optional one.');
+        }
+
+        if ($argument->isArray()) {
+            $this->hasAnArrayArgument = true;
+        }
+
+        if ($argument->isRequired()) {
+            ++$this->requiredCount;
+        } else {
+            $this->hasOptional = true;
+        }
+
+        $this->arguments[$argument->getName()] = $argument;
+    }
+
+    /**
+     * Returns an InputArgument by name or by position.
+     *
+     * @param string|int $name The InputArgument name or position
+     *
+     * @return InputArgument An InputArgument object
+     *
+     * @throws InvalidArgumentException When argument given doesn't exist
+     */
+    public function getArgument($name)
+    {
+        if (!$this->hasArgument($name)) {
+            throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
+        }
+
+        $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments;
+
+        return $arguments[$name];
+    }
+
+    /**
+     * Returns true if an InputArgument object exists by name or position.
+     *
+     * @param string|int $name The InputArgument name or position
+     *
+     * @return bool true if the InputArgument object exists, false otherwise
+     */
+    public function hasArgument($name)
+    {
+        $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments;
+
+        return isset($arguments[$name]);
+    }
+
+    /**
+     * Gets the array of InputArgument objects.
+     *
+     * @return InputArgument[] An array of InputArgument objects
+     */
+    public function getArguments()
+    {
+        return $this->arguments;
+    }
+
+    /**
+     * Returns the number of InputArguments.
+     *
+     * @return int The number of InputArguments
+     */
+    public function getArgumentCount()
+    {
+        return $this->hasAnArrayArgument ? PHP_INT_MAX : count($this->arguments);
+    }
+
+    /**
+     * Returns the number of required InputArguments.
+     *
+     * @return int The number of required InputArguments
+     */
+    public function getArgumentRequiredCount()
+    {
+        return $this->requiredCount;
+    }
+
+    /**
+     * Gets the default values.
+     *
+     * @return array An array of default values
+     */
+    public function getArgumentDefaults()
+    {
+        $values = array();
+        foreach ($this->arguments as $argument) {
+            $values[$argument->getName()] = $argument->getDefault();
+        }
+
+        return $values;
+    }
+
+    /**
+     * Sets the InputOption objects.
+     *
+     * @param InputOption[] $options An array of InputOption objects
+     */
+    public function setOptions($options = array())
+    {
+        $this->options = array();
+        $this->shortcuts = array();
+        $this->addOptions($options);
+    }
+
+    /**
+     * Adds an array of InputOption objects.
+     *
+     * @param InputOption[] $options An array of InputOption objects
+     */
+    public function addOptions($options = array())
+    {
+        foreach ($options as $option) {
+            $this->addOption($option);
+        }
+    }
+
+    /**
+     * Adds an InputOption object.
+     *
+     * @param InputOption $option An InputOption object
+     *
+     * @throws LogicException When option given already exist
+     */
+    public function addOption(InputOption $option)
+    {
+        if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) {
+            throw new LogicException(sprintf('An option named "%s" already exists.', $option->getName()));
+        }
+
+        if ($option->getShortcut()) {
+            foreach (explode('|', $option->getShortcut()) as $shortcut) {
+                if (isset($this->shortcuts[$shortcut]) && !$option->equals($this->options[$this->shortcuts[$shortcut]])) {
+                    throw new LogicException(sprintf('An option with shortcut "%s" already exists.', $shortcut));
+                }
+            }
+        }
+
+        $this->options[$option->getName()] = $option;
+        if ($option->getShortcut()) {
+            foreach (explode('|', $option->getShortcut()) as $shortcut) {
+                $this->shortcuts[$shortcut] = $option->getName();
+            }
+        }
+    }
+
+    /**
+     * Returns an InputOption by name.
+     *
+     * @param string $name The InputOption name
+     *
+     * @return InputOption A InputOption object
+     *
+     * @throws InvalidArgumentException When option given doesn't exist
+     */
+    public function getOption($name)
+    {
+        if (!$this->hasOption($name)) {
+            throw new InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name));
+        }
+
+        return $this->options[$name];
+    }
+
+    /**
+     * Returns true if an InputOption object exists by name.
+     *
+     * This method can't be used to check if the user included the option when
+     * executing the command (use getOption() instead).
+     *
+     * @param string $name The InputOption name
+     *
+     * @return bool true if the InputOption object exists, false otherwise
+     */
+    public function hasOption($name)
+    {
+        return isset($this->options[$name]);
+    }
+
+    /**
+     * Gets the array of InputOption objects.
+     *
+     * @return InputOption[] An array of InputOption objects
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * Returns true if an InputOption object exists by shortcut.
+     *
+     * @param string $name The InputOption shortcut
+     *
+     * @return bool true if the InputOption object exists, false otherwise
+     */
+    public function hasShortcut($name)
+    {
+        return isset($this->shortcuts[$name]);
+    }
+
+    /**
+     * Gets an InputOption by shortcut.
+     *
+     * @param string $shortcut the Shortcut name
+     *
+     * @return InputOption An InputOption object
+     */
+    public function getOptionForShortcut($shortcut)
+    {
+        return $this->getOption($this->shortcutToName($shortcut));
+    }
+
+    /**
+     * Gets an array of default values.
+     *
+     * @return array An array of all default values
+     */
+    public function getOptionDefaults()
+    {
+        $values = array();
+        foreach ($this->options as $option) {
+            $values[$option->getName()] = $option->getDefault();
+        }
+
+        return $values;
+    }
+
+    /**
+     * Returns the InputOption name given a shortcut.
+     *
+     * @param string $shortcut The shortcut
+     *
+     * @return string The InputOption name
+     *
+     * @throws InvalidArgumentException When option given does not exist
+     */
+    private function shortcutToName($shortcut)
+    {
+        if (!isset($this->shortcuts[$shortcut])) {
+            throw new InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut));
+        }
+
+        return $this->shortcuts[$shortcut];
+    }
+
+    /**
+     * Gets the synopsis.
+     *
+     * @param bool $short Whether to return the short version (with options folded) or not
+     *
+     * @return string The synopsis
+     */
+    public function getSynopsis($short = false)
+    {
+        $elements = array();
+
+        if ($short && $this->getOptions()) {
+            $elements[] = '[options]';
+        } elseif (!$short) {
+            foreach ($this->getOptions() as $option) {
+                $value = '';
+                if ($option->acceptValue()) {
+                    $value = sprintf(
+                        ' %s%s%s',
+                        $option->isValueOptional() ? '[' : '',
+                        strtoupper($option->getName()),
+                        $option->isValueOptional() ? ']' : ''
+                    );
+                }
+
+                $shortcut = $option->getShortcut() ? sprintf('-%s|', $option->getShortcut()) : '';
+                $elements[] = sprintf('[%s--%s%s]', $shortcut, $option->getName(), $value);
+            }
+        }
+
+        if (count($elements) && $this->getArguments()) {
+            $elements[] = '[--]';
+        }
+
+        foreach ($this->getArguments() as $argument) {
+            $element = '<'.$argument->getName().'>';
+            if (!$argument->isRequired()) {
+                $element = '['.$element.']';
+            } elseif ($argument->isArray()) {
+                $element = $element.' ('.$element.')';
+            }
+
+            if ($argument->isArray()) {
+                $element .= '...';
+            }
+
+            $elements[] = $element;
+        }
+
+        return implode(' ', $elements);
+    }
+
+    /**
+     * Returns a textual representation of the InputDefinition.
+     *
+     * @return string A string representing the InputDefinition
+     *
+     * @deprecated since version 2.3, to be removed in 3.0.
+     */
+    public function asText()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.3 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        $descriptor = new TextDescriptor();
+        $output = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, true);
+        $descriptor->describe($output, $this, array('raw_output' => true));
+
+        return $output->fetch();
+    }
+
+    /**
+     * Returns an XML representation of the InputDefinition.
+     *
+     * @param bool $asDom Whether to return a DOM or an XML string
+     *
+     * @return string|\DOMDocument An XML string representing the InputDefinition
+     *
+     * @deprecated since version 2.3, to be removed in 3.0.
+     */
+    public function asXml($asDom = false)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.3 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        $descriptor = new XmlDescriptor();
+
+        if ($asDom) {
+            return $descriptor->getInputDefinitionDocument($this);
+        }
+
+        $output = new BufferedOutput();
+        $descriptor->describe($output, $this);
+
+        return $output->fetch();
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Input/InputInterface.php
@@ -0,0 +1,157 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Input;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Exception\RuntimeException;
+
+/**
+ * InputInterface is the interface implemented by all input classes.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface InputInterface
+{
+    /**
+     * Returns the first argument from the raw parameters (not parsed).
+     *
+     * @return string The value of the first argument or null otherwise
+     */
+    public function getFirstArgument();
+
+    /**
+     * Returns true if the raw parameters (not parsed) contain a value.
+     *
+     * This method is to be used to introspect the input parameters
+     * before they have been validated. It must be used carefully.
+     *
+     * @param string|array $values The values to look for in the raw parameters (can be an array)
+     *
+     * @return bool true if the value is contained in the raw parameters
+     */
+    public function hasParameterOption($values);
+
+    /**
+     * Returns the value of a raw option (not parsed).
+     *
+     * This method is to be used to introspect the input parameters
+     * before they have been validated. It must be used carefully.
+     *
+     * @param string|array $values  The value(s) to look for in the raw parameters (can be an array)
+     * @param mixed        $default The default value to return if no result is found
+     *
+     * @return mixed The option value
+     */
+    public function getParameterOption($values, $default = false);
+
+    /**
+     * Binds the current Input instance with the given arguments and options.
+     *
+     * @param InputDefinition $definition A InputDefinition instance
+     */
+    public function bind(InputDefinition $definition);
+
+    /**
+     * Validates the input.
+     *
+     * @throws RuntimeException When not enough arguments are given
+     */
+    public function validate();
+
+    /**
+     * Returns all the given arguments merged with the default values.
+     *
+     * @return array
+     */
+    public function getArguments();
+
+    /**
+     * Returns the argument value for a given argument name.
+     *
+     * @param string $name The argument name
+     *
+     * @return mixed The argument value
+     *
+     * @throws InvalidArgumentException When argument given doesn't exist
+     */
+    public function getArgument($name);
+
+    /**
+     * Sets an argument value by name.
+     *
+     * @param string $name  The argument name
+     * @param string $value The argument value
+     *
+     * @throws InvalidArgumentException When argument given doesn't exist
+     */
+    public function setArgument($name, $value);
+
+    /**
+     * Returns true if an InputArgument object exists by name or position.
+     *
+     * @param string|int $name The InputArgument name or position
+     *
+     * @return bool true if the InputArgument object exists, false otherwise
+     */
+    public function hasArgument($name);
+
+    /**
+     * Returns all the given options merged with the default values.
+     *
+     * @return array
+     */
+    public function getOptions();
+
+    /**
+     * Returns the option value for a given option name.
+     *
+     * @param string $name The option name
+     *
+     * @return mixed The option value
+     *
+     * @throws InvalidArgumentException When option given doesn't exist
+     */
+    public function getOption($name);
+
+    /**
+     * Sets an option value by name.
+     *
+     * @param string      $name  The option name
+     * @param string|bool $value The option value
+     *
+     * @throws InvalidArgumentException When option given doesn't exist
+     */
+    public function setOption($name, $value);
+
+    /**
+     * Returns true if an InputOption object exists by name.
+     *
+     * @param string $name The InputOption name
+     *
+     * @return bool true if the InputOption object exists, false otherwise
+     */
+    public function hasOption($name);
+
+    /**
+     * Is this input means interactive?
+     *
+     * @return bool
+     */
+    public function isInteractive();
+
+    /**
+     * Sets the input interactivity.
+     *
+     * @param bool $interactive If the input should be interactive
+     */
+    public function setInteractive($interactive);
+}
--- /dev/null
+++ b/vendor/symfony/console/Input/InputOption.php
@@ -0,0 +1,212 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Input;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Exception\LogicException;
+
+/**
+ * Represents a command line option.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class InputOption
+{
+    const VALUE_NONE = 1;
+    const VALUE_REQUIRED = 2;
+    const VALUE_OPTIONAL = 4;
+    const VALUE_IS_ARRAY = 8;
+
+    private $name;
+    private $shortcut;
+    private $mode;
+    private $default;
+    private $description;
+
+    /**
+     * Constructor.
+     *
+     * @param string       $name        The option name
+     * @param string|array $shortcut    The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
+     * @param int          $mode        The option mode: One of the VALUE_* constants
+     * @param string       $description A description text
+     * @param mixed        $default     The default value (must be null for self::VALUE_NONE)
+     *
+     * @throws InvalidArgumentException If option mode is invalid or incompatible
+     */
+    public function __construct($name, $shortcut = null, $mode = null, $description = '', $default = null)
+    {
+        if (0 === strpos($name, '--')) {
+            $name = substr($name, 2);
+        }
+
+        if (empty($name)) {
+            throw new InvalidArgumentException('An option name cannot be empty.');
+        }
+
+        if (empty($shortcut)) {
+            $shortcut = null;
+        }
+
+        if (null !== $shortcut) {
+            if (is_array($shortcut)) {
+                $shortcut = implode('|', $shortcut);
+            }
+            $shortcuts = preg_split('{(\|)-?}', ltrim($shortcut, '-'));
+            $shortcuts = array_filter($shortcuts);
+            $shortcut = implode('|', $shortcuts);
+
+            if (empty($shortcut)) {
+                throw new InvalidArgumentException('An option shortcut cannot be empty.');
+            }
+        }
+
+        if (null === $mode) {
+            $mode = self::VALUE_NONE;
+        } elseif (!is_int($mode) || $mode > 15 || $mode < 1) {
+            throw new InvalidArgumentException(sprintf('Option mode "%s" is not valid.', $mode));
+        }
+
+        $this->name = $name;
+        $this->shortcut = $shortcut;
+        $this->mode = $mode;
+        $this->description = $description;
+
+        if ($this->isArray() && !$this->acceptValue()) {
+            throw new InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.');
+        }
+
+        $this->setDefault($default);
+    }
+
+    /**
+     * Returns the option shortcut.
+     *
+     * @return string The shortcut
+     */
+    public function getShortcut()
+    {
+        return $this->shortcut;
+    }
+
+    /**
+     * Returns the option name.
+     *
+     * @return string The name
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Returns true if the option accepts a value.
+     *
+     * @return bool true if value mode is not self::VALUE_NONE, false otherwise
+     */
+    public function acceptValue()
+    {
+        return $this->isValueRequired() || $this->isValueOptional();
+    }
+
+    /**
+     * Returns true if the option requires a value.
+     *
+     * @return bool true if value mode is self::VALUE_REQUIRED, false otherwise
+     */
+    public function isValueRequired()
+    {
+        return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode);
+    }
+
+    /**
+     * Returns true if the option takes an optional value.
+     *
+     * @return bool true if value mode is self::VALUE_OPTIONAL, false otherwise
+     */
+    public function isValueOptional()
+    {
+        return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode);
+    }
+
+    /**
+     * Returns true if the option can take multiple values.
+     *
+     * @return bool true if mode is self::VALUE_IS_ARRAY, false otherwise
+     */
+    public function isArray()
+    {
+        return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode);
+    }
+
+    /**
+     * Sets the default value.
+     *
+     * @param mixed $default The default value
+     *
+     * @throws LogicException When incorrect default value is given
+     */
+    public function setDefault($default = null)
+    {
+        if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) {
+            throw new LogicException('Cannot set a default value when using InputOption::VALUE_NONE mode.');
+        }
+
+        if ($this->isArray()) {
+            if (null === $default) {
+                $default = array();
+            } elseif (!is_array($default)) {
+                throw new LogicException('A default value for an array option must be an array.');
+            }
+        }
+
+        $this->default = $this->acceptValue() ? $default : false;
+    }
+
+    /**
+     * Returns the default value.
+     *
+     * @return mixed The default value
+     */
+    public function getDefault()
+    {
+        return $this->default;
+    }
+
+    /**
+     * Returns the description text.
+     *
+     * @return string The description text
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+
+    /**
+     * Checks whether the given option equals this one.
+     *
+     * @param InputOption $option option to compare
+     *
+     * @return bool
+     */
+    public function equals(InputOption $option)
+    {
+        return $option->getName() === $this->getName()
+            && $option->getShortcut() === $this->getShortcut()
+            && $option->getDefault() === $this->getDefault()
+            && $option->isArray() === $this->isArray()
+            && $option->isValueRequired() === $this->isValueRequired()
+            && $option->isValueOptional() === $this->isValueOptional()
+        ;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Input/StringInput.php
@@ -0,0 +1,85 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Input;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+
+/**
+ * StringInput represents an input provided as a string.
+ *
+ * Usage:
+ *
+ *     $input = new StringInput('foo --bar="foobar"');
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class StringInput extends ArgvInput
+{
+    const REGEX_STRING = '([^\s]+?)(?:\s|(?<!\\\\)"|(?<!\\\\)\'|$)';
+    const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\')';
+
+    /**
+     * Constructor.
+     *
+     * @param string          $input      An array of parameters from the CLI (in the argv format)
+     * @param InputDefinition $definition A InputDefinition instance
+     *
+     * @deprecated The second argument is deprecated as it does not work (will be removed in 3.0), use 'bind' method instead
+     */
+    public function __construct($input, InputDefinition $definition = null)
+    {
+        if ($definition) {
+            @trigger_error('The $definition argument of the '.__METHOD__.' method is deprecated and will be removed in 3.0. Set this parameter with the bind() method instead.', E_USER_DEPRECATED);
+        }
+
+        parent::__construct(array(), null);
+
+        $this->setTokens($this->tokenize($input));
+
+        if (null !== $definition) {
+            $this->bind($definition);
+        }
+    }
+
+    /**
+     * Tokenizes a string.
+     *
+     * @param string $input The input to tokenize
+     *
+     * @return array An array of tokens
+     *
+     * @throws InvalidArgumentException When unable to parse input (should never happen)
+     */
+    private function tokenize($input)
+    {
+        $tokens = array();
+        $length = strlen($input);
+        $cursor = 0;
+        while ($cursor < $length) {
+            if (preg_match('/\s+/A', $input, $match, null, $cursor)) {
+            } elseif (preg_match('/([^="\'\s]+?)(=?)('.self::REGEX_QUOTED_STRING.'+)/A', $input, $match, null, $cursor)) {
+                $tokens[] = $match[1].$match[2].stripcslashes(str_replace(array('"\'', '\'"', '\'\'', '""'), '', substr($match[3], 1, strlen($match[3]) - 2)));
+            } elseif (preg_match('/'.self::REGEX_QUOTED_STRING.'/A', $input, $match, null, $cursor)) {
+                $tokens[] = stripcslashes(substr($match[0], 1, strlen($match[0]) - 2));
+            } elseif (preg_match('/'.self::REGEX_STRING.'/A', $input, $match, null, $cursor)) {
+                $tokens[] = stripcslashes($match[1]);
+            } else {
+                // should never happen
+                throw new InvalidArgumentException(sprintf('Unable to parse input near "... %s ..."', substr($input, $cursor, 10)));
+            }
+
+            $cursor += strlen($match[0]);
+        }
+
+        return $tokens;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2016 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/symfony/console/Logger/ConsoleLogger.php
@@ -0,0 +1,119 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Logger;
+
+use Psr\Log\AbstractLogger;
+use Psr\Log\InvalidArgumentException;
+use Psr\Log\LogLevel;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
+
+/**
+ * PSR-3 compliant console logger.
+ *
+ * @author Kévin Dunglas <dunglas@gmail.com>
+ *
+ * @see http://www.php-fig.org/psr/psr-3/
+ */
+class ConsoleLogger extends AbstractLogger
+{
+    const INFO = 'info';
+    const ERROR = 'error';
+
+    /**
+     * @var OutputInterface
+     */
+    private $output;
+    /**
+     * @var array
+     */
+    private $verbosityLevelMap = array(
+        LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL,
+        LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL,
+        LogLevel::CRITICAL => OutputInterface::VERBOSITY_NORMAL,
+        LogLevel::ERROR => OutputInterface::VERBOSITY_NORMAL,
+        LogLevel::WARNING => OutputInterface::VERBOSITY_NORMAL,
+        LogLevel::NOTICE => OutputInterface::VERBOSITY_VERBOSE,
+        LogLevel::INFO => OutputInterface::VERBOSITY_VERY_VERBOSE,
+        LogLevel::DEBUG => OutputInterface::VERBOSITY_DEBUG,
+    );
+    /**
+     * @var array
+     */
+    private $formatLevelMap = array(
+        LogLevel::EMERGENCY => self::ERROR,
+        LogLevel::ALERT => self::ERROR,
+        LogLevel::CRITICAL => self::ERROR,
+        LogLevel::ERROR => self::ERROR,
+        LogLevel::WARNING => self::INFO,
+        LogLevel::NOTICE => self::INFO,
+        LogLevel::INFO => self::INFO,
+        LogLevel::DEBUG => self::INFO,
+    );
+
+    /**
+     * @param OutputInterface $output
+     * @param array           $verbosityLevelMap
+     * @param array           $formatLevelMap
+     */
+    public function __construct(OutputInterface $output, array $verbosityLevelMap = array(), array $formatLevelMap = array())
+    {
+        $this->output = $output;
+        $this->verbosityLevelMap = $verbosityLevelMap + $this->verbosityLevelMap;
+        $this->formatLevelMap = $formatLevelMap + $this->formatLevelMap;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function log($level, $message, array $context = array())
+    {
+        if (!isset($this->verbosityLevelMap[$level])) {
+            throw new InvalidArgumentException(sprintf('The log level "%s" does not exist.', $level));
+        }
+
+        // Write to the error output if necessary and available
+        if ($this->formatLevelMap[$level] === self::ERROR && $this->output instanceof ConsoleOutputInterface) {
+            $output = $this->output->getErrorOutput();
+        } else {
+            $output = $this->output;
+        }
+
+        if ($output->getVerbosity() >= $this->verbosityLevelMap[$level]) {
+            $output->writeln(sprintf('<%1$s>[%2$s] %3$s</%1$s>', $this->formatLevelMap[$level], $level, $this->interpolate($message, $context)));
+        }
+    }
+
+    /**
+     * Interpolates context values into the message placeholders.
+     *
+     * @author PHP Framework Interoperability Group
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return string
+     */
+    private function interpolate($message, array $context)
+    {
+        // build a replacement array with braces around the context keys
+        $replace = array();
+        foreach ($context as $key => $val) {
+            if (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) {
+                $replace[sprintf('{%s}', $key)] = $val;
+            }
+        }
+
+        // interpolate replacement values into the message and return
+        return strtr($message, $replace);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Output/BufferedOutput.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Output;
+
+/**
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ */
+class BufferedOutput extends Output
+{
+    /**
+     * @var string
+     */
+    private $buffer = '';
+
+    /**
+     * Empties buffer and returns its content.
+     *
+     * @return string
+     */
+    public function fetch()
+    {
+        $content = $this->buffer;
+        $this->buffer = '';
+
+        return $content;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doWrite($message, $newline)
+    {
+        $this->buffer .= $message;
+
+        if ($newline) {
+            $this->buffer .= "\n";
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Output/ConsoleOutput.php
@@ -0,0 +1,156 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Output;
+
+use Symfony\Component\Console\Formatter\OutputFormatterInterface;
+
+/**
+ * ConsoleOutput is the default class for all CLI output. It uses STDOUT.
+ *
+ * This class is a convenient wrapper around `StreamOutput`.
+ *
+ *     $output = new ConsoleOutput();
+ *
+ * This is equivalent to:
+ *
+ *     $output = new StreamOutput(fopen('php://stdout', 'w'));
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface
+{
+    /**
+     * @var StreamOutput
+     */
+    private $stderr;
+
+    /**
+     * Constructor.
+     *
+     * @param int                           $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
+     * @param bool|null                     $decorated Whether to decorate messages (null for auto-guessing)
+     * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
+     */
+    public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null)
+    {
+        parent::__construct($this->openOutputStream(), $verbosity, $decorated, $formatter);
+
+        $actualDecorated = $this->isDecorated();
+        $this->stderr = new StreamOutput($this->openErrorStream(), $verbosity, $decorated, $this->getFormatter());
+
+        if (null === $decorated) {
+            $this->setDecorated($actualDecorated && $this->stderr->isDecorated());
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setDecorated($decorated)
+    {
+        parent::setDecorated($decorated);
+        $this->stderr->setDecorated($decorated);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFormatter(OutputFormatterInterface $formatter)
+    {
+        parent::setFormatter($formatter);
+        $this->stderr->setFormatter($formatter);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setVerbosity($level)
+    {
+        parent::setVerbosity($level);
+        $this->stderr->setVerbosity($level);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getErrorOutput()
+    {
+        return $this->stderr;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setErrorOutput(OutputInterface $error)
+    {
+        $this->stderr = $error;
+    }
+
+    /**
+     * Returns true if current environment supports writing console output to
+     * STDOUT.
+     *
+     * @return bool
+     */
+    protected function hasStdoutSupport()
+    {
+        return false === $this->isRunningOS400();
+    }
+
+    /**
+     * Returns true if current environment supports writing console output to
+     * STDERR.
+     *
+     * @return bool
+     */
+    protected function hasStderrSupport()
+    {
+        return false === $this->isRunningOS400();
+    }
+
+    /**
+     * Checks if current executing environment is IBM iSeries (OS400), which
+     * doesn't properly convert character-encodings between ASCII to EBCDIC.
+     *
+     * @return bool
+     */
+    private function isRunningOS400()
+    {
+        $checks = array(
+            function_exists('php_uname') ? php_uname('s') : '',
+            getenv('OSTYPE'),
+            PHP_OS,
+        );
+
+        return false !== stripos(implode(';', $checks), 'OS400');
+    }
+
+    /**
+     * @return resource
+     */
+    private function openOutputStream()
+    {
+        $outputStream = $this->hasStdoutSupport() ? 'php://stdout' : 'php://output';
+
+        return @fopen($outputStream, 'w') ?: fopen('php://output', 'w');
+    }
+
+    /**
+     * @return resource
+     */
+    private function openErrorStream()
+    {
+        $errorStream = $this->hasStderrSupport() ? 'php://stderr' : 'php://output';
+
+        return fopen($errorStream, 'w');
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Output/ConsoleOutputInterface.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Output;
+
+/**
+ * ConsoleOutputInterface is the interface implemented by ConsoleOutput class.
+ * This adds information about stderr output stream.
+ *
+ * @author Dariusz Górecki <darek.krk@gmail.com>
+ */
+interface ConsoleOutputInterface extends OutputInterface
+{
+    /**
+     * Gets the OutputInterface for errors.
+     *
+     * @return OutputInterface
+     */
+    public function getErrorOutput();
+
+    /**
+     * Sets the OutputInterface used for errors.
+     *
+     * @param OutputInterface $error
+     */
+    public function setErrorOutput(OutputInterface $error);
+}
--- /dev/null
+++ b/vendor/symfony/console/Output/NullOutput.php
@@ -0,0 +1,123 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Output;
+
+use Symfony\Component\Console\Formatter\OutputFormatter;
+use Symfony\Component\Console\Formatter\OutputFormatterInterface;
+
+/**
+ * NullOutput suppresses all output.
+ *
+ *     $output = new NullOutput();
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Tobias Schultze <http://tobion.de>
+ */
+class NullOutput implements OutputInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function setFormatter(OutputFormatterInterface $formatter)
+    {
+        // do nothing
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFormatter()
+    {
+        // to comply with the interface we must return a OutputFormatterInterface
+        return new OutputFormatter();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setDecorated($decorated)
+    {
+        // do nothing
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isDecorated()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setVerbosity($level)
+    {
+        // do nothing
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getVerbosity()
+    {
+        return self::VERBOSITY_QUIET;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isQuiet()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isVerbose()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isVeryVerbose()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isDebug()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function writeln($messages, $options = self::OUTPUT_NORMAL)
+    {
+        // do nothing
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write($messages, $newline = false, $options = self::OUTPUT_NORMAL)
+    {
+        // do nothing
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Output/Output.php
@@ -0,0 +1,177 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Output;
+
+use Symfony\Component\Console\Formatter\OutputFormatterInterface;
+use Symfony\Component\Console\Formatter\OutputFormatter;
+
+/**
+ * Base class for output classes.
+ *
+ * There are five levels of verbosity:
+ *
+ *  * normal: no option passed (normal output)
+ *  * verbose: -v (more output)
+ *  * very verbose: -vv (highly extended output)
+ *  * debug: -vvv (all debug output)
+ *  * quiet: -q (no output)
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class Output implements OutputInterface
+{
+    private $verbosity;
+    private $formatter;
+
+    /**
+     * Constructor.
+     *
+     * @param int                           $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
+     * @param bool                          $decorated Whether to decorate messages
+     * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
+     */
+    public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = false, OutputFormatterInterface $formatter = null)
+    {
+        $this->verbosity = null === $verbosity ? self::VERBOSITY_NORMAL : $verbosity;
+        $this->formatter = $formatter ?: new OutputFormatter();
+        $this->formatter->setDecorated($decorated);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFormatter(OutputFormatterInterface $formatter)
+    {
+        $this->formatter = $formatter;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFormatter()
+    {
+        return $this->formatter;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setDecorated($decorated)
+    {
+        $this->formatter->setDecorated($decorated);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isDecorated()
+    {
+        return $this->formatter->isDecorated();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setVerbosity($level)
+    {
+        $this->verbosity = (int) $level;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getVerbosity()
+    {
+        return $this->verbosity;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isQuiet()
+    {
+        return self::VERBOSITY_QUIET === $this->verbosity;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isVerbose()
+    {
+        return self::VERBOSITY_VERBOSE <= $this->verbosity;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isVeryVerbose()
+    {
+        return self::VERBOSITY_VERY_VERBOSE <= $this->verbosity;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isDebug()
+    {
+        return self::VERBOSITY_DEBUG <= $this->verbosity;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function writeln($messages, $options = self::OUTPUT_NORMAL)
+    {
+        $this->write($messages, true, $options);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write($messages, $newline = false, $options = self::OUTPUT_NORMAL)
+    {
+        $messages = (array) $messages;
+
+        $types = self::OUTPUT_NORMAL | self::OUTPUT_RAW | self::OUTPUT_PLAIN;
+        $type = $types & $options ?: self::OUTPUT_NORMAL;
+
+        $verbosities = self::VERBOSITY_QUIET | self::VERBOSITY_NORMAL | self::VERBOSITY_VERBOSE | self::VERBOSITY_VERY_VERBOSE | self::VERBOSITY_DEBUG;
+        $verbosity = $verbosities & $options ?: self::VERBOSITY_NORMAL;
+
+        if ($verbosity > $this->getVerbosity()) {
+            return;
+        }
+
+        foreach ($messages as $message) {
+            switch ($type) {
+                case OutputInterface::OUTPUT_NORMAL:
+                    $message = $this->formatter->format($message);
+                    break;
+                case OutputInterface::OUTPUT_RAW:
+                    break;
+                case OutputInterface::OUTPUT_PLAIN:
+                    $message = strip_tags($this->formatter->format($message));
+                    break;
+            }
+
+            $this->doWrite($message, $newline);
+        }
+    }
+
+    /**
+     * Writes a message to the output.
+     *
+     * @param string $message A message to write to the output
+     * @param bool   $newline Whether to add a newline or not
+     */
+    abstract protected function doWrite($message, $newline);
+}
--- /dev/null
+++ b/vendor/symfony/console/Output/OutputInterface.php
@@ -0,0 +1,91 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Output;
+
+use Symfony\Component\Console\Formatter\OutputFormatterInterface;
+
+/**
+ * OutputInterface is the interface implemented by all Output classes.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface OutputInterface
+{
+    const VERBOSITY_QUIET = 16;
+    const VERBOSITY_NORMAL = 32;
+    const VERBOSITY_VERBOSE = 64;
+    const VERBOSITY_VERY_VERBOSE = 128;
+    const VERBOSITY_DEBUG = 256;
+
+    const OUTPUT_NORMAL = 1;
+    const OUTPUT_RAW = 2;
+    const OUTPUT_PLAIN = 4;
+
+    /**
+     * Writes a message to the output.
+     *
+     * @param string|array $messages The message as an array of lines or a single string
+     * @param bool         $newline  Whether to add a newline
+     * @param int          $options  A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL
+     */
+    public function write($messages, $newline = false, $options = 0);
+
+    /**
+     * Writes a message to the output and adds a newline at the end.
+     *
+     * @param string|array $messages The message as an array of lines of a single string
+     * @param int          $options  A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL
+     */
+    public function writeln($messages, $options = 0);
+
+    /**
+     * Sets the verbosity of the output.
+     *
+     * @param int $level The level of verbosity (one of the VERBOSITY constants)
+     */
+    public function setVerbosity($level);
+
+    /**
+     * Gets the current verbosity of the output.
+     *
+     * @return int The current level of verbosity (one of the VERBOSITY constants)
+     */
+    public function getVerbosity();
+
+    /**
+     * Sets the decorated flag.
+     *
+     * @param bool $decorated Whether to decorate the messages
+     */
+    public function setDecorated($decorated);
+
+    /**
+     * Gets the decorated flag.
+     *
+     * @return bool true if the output will decorate messages, false otherwise
+     */
+    public function isDecorated();
+
+    /**
+     * Sets output formatter.
+     *
+     * @param OutputFormatterInterface $formatter
+     */
+    public function setFormatter(OutputFormatterInterface $formatter);
+
+    /**
+     * Returns current output formatter instance.
+     *
+     * @return OutputFormatterInterface
+     */
+    public function getFormatter();
+}
--- /dev/null
+++ b/vendor/symfony/console/Output/StreamOutput.php
@@ -0,0 +1,105 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Output;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Exception\RuntimeException;
+use Symfony\Component\Console\Formatter\OutputFormatterInterface;
+
+/**
+ * StreamOutput writes the output to a given stream.
+ *
+ * Usage:
+ *
+ * $output = new StreamOutput(fopen('php://stdout', 'w'));
+ *
+ * As `StreamOutput` can use any stream, you can also use a file:
+ *
+ * $output = new StreamOutput(fopen('/path/to/output.log', 'a', false));
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class StreamOutput extends Output
+{
+    private $stream;
+
+    /**
+     * Constructor.
+     *
+     * @param resource                      $stream    A stream resource
+     * @param int                           $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
+     * @param bool|null                     $decorated Whether to decorate messages (null for auto-guessing)
+     * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
+     *
+     * @throws InvalidArgumentException When first argument is not a real stream
+     */
+    public function __construct($stream, $verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null)
+    {
+        if (!is_resource($stream) || 'stream' !== get_resource_type($stream)) {
+            throw new InvalidArgumentException('The StreamOutput class needs a stream as its first argument.');
+        }
+
+        $this->stream = $stream;
+
+        if (null === $decorated) {
+            $decorated = $this->hasColorSupport();
+        }
+
+        parent::__construct($verbosity, $decorated, $formatter);
+    }
+
+    /**
+     * Gets the stream attached to this StreamOutput instance.
+     *
+     * @return resource A stream resource
+     */
+    public function getStream()
+    {
+        return $this->stream;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doWrite($message, $newline)
+    {
+        if (false === @fwrite($this->stream, $message) || ($newline && (false === @fwrite($this->stream, PHP_EOL)))) {
+            // should never happen
+            throw new RuntimeException('Unable to write output.');
+        }
+
+        fflush($this->stream);
+    }
+
+    /**
+     * Returns true if the stream supports colorization.
+     *
+     * Colorization is disabled if not supported by the stream:
+     *
+     *  -  Windows != 10.0.10586 without Ansicon, ConEmu or Mintty
+     *  -  non tty consoles
+     *
+     * @return bool true if the stream supports colorization, false otherwise
+     */
+    protected function hasColorSupport()
+    {
+        if (DIRECTORY_SEPARATOR === '\\') {
+            return
+                '10.0.10586' === PHP_WINDOWS_VERSION_MAJOR.'.'.PHP_WINDOWS_VERSION_MINOR.'.'.PHP_WINDOWS_VERSION_BUILD
+                || false !== getenv('ANSICON')
+                || 'ON' === getenv('ConEmuANSI')
+                || 'xterm' === getenv('TERM');
+        }
+
+        return function_exists('posix_isatty') && @posix_isatty($this->stream);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Question/ChoiceQuestion.php
@@ -0,0 +1,187 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Question;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+
+/**
+ * Represents a choice question.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ChoiceQuestion extends Question
+{
+    private $choices;
+    private $multiselect = false;
+    private $prompt = ' > ';
+    private $errorMessage = 'Value "%s" is invalid';
+
+    /**
+     * Constructor.
+     *
+     * @param string $question The question to ask to the user
+     * @param array  $choices  The list of available choices
+     * @param mixed  $default  The default answer to return
+     */
+    public function __construct($question, array $choices, $default = null)
+    {
+        parent::__construct($question, $default);
+
+        $this->choices = $choices;
+        $this->setValidator($this->getDefaultValidator());
+        $this->setAutocompleterValues($choices);
+    }
+
+    /**
+     * Returns available choices.
+     *
+     * @return array
+     */
+    public function getChoices()
+    {
+        return $this->choices;
+    }
+
+    /**
+     * Sets multiselect option.
+     *
+     * When multiselect is set to true, multiple choices can be answered.
+     *
+     * @param bool $multiselect
+     *
+     * @return ChoiceQuestion The current instance
+     */
+    public function setMultiselect($multiselect)
+    {
+        $this->multiselect = $multiselect;
+        $this->setValidator($this->getDefaultValidator());
+
+        return $this;
+    }
+
+    /**
+     * Returns whether the choices are multiselect.
+     *
+     * @return bool
+     */
+    public function isMultiselect()
+    {
+        return $this->multiselect;
+    }
+
+    /**
+     * Gets the prompt for choices.
+     *
+     * @return string
+     */
+    public function getPrompt()
+    {
+        return $this->prompt;
+    }
+
+    /**
+     * Sets the prompt for choices.
+     *
+     * @param string $prompt
+     *
+     * @return ChoiceQuestion The current instance
+     */
+    public function setPrompt($prompt)
+    {
+        $this->prompt = $prompt;
+
+        return $this;
+    }
+
+    /**
+     * Sets the error message for invalid values.
+     *
+     * The error message has a string placeholder (%s) for the invalid value.
+     *
+     * @param string $errorMessage
+     *
+     * @return ChoiceQuestion The current instance
+     */
+    public function setErrorMessage($errorMessage)
+    {
+        $this->errorMessage = $errorMessage;
+        $this->setValidator($this->getDefaultValidator());
+
+        return $this;
+    }
+
+    /**
+     * Returns the default answer validator.
+     *
+     * @return callable
+     */
+    private function getDefaultValidator()
+    {
+        $choices = $this->choices;
+        $errorMessage = $this->errorMessage;
+        $multiselect = $this->multiselect;
+        $isAssoc = $this->isAssoc($choices);
+
+        return function ($selected) use ($choices, $errorMessage, $multiselect, $isAssoc) {
+            // Collapse all spaces.
+            $selectedChoices = str_replace(' ', '', $selected);
+
+            if ($multiselect) {
+                // Check for a separated comma values
+                if (!preg_match('/^[a-zA-Z0-9_-]+(?:,[a-zA-Z0-9_-]+)*$/', $selectedChoices, $matches)) {
+                    throw new InvalidArgumentException(sprintf($errorMessage, $selected));
+                }
+                $selectedChoices = explode(',', $selectedChoices);
+            } else {
+                $selectedChoices = array($selected);
+            }
+
+            $multiselectChoices = array();
+            foreach ($selectedChoices as $value) {
+                $results = array();
+                foreach ($choices as $key => $choice) {
+                    if ($choice === $value) {
+                        $results[] = $key;
+                    }
+                }
+
+                if (count($results) > 1) {
+                    throw new InvalidArgumentException(sprintf('The provided answer is ambiguous. Value should be one of %s.', implode(' or ', $results)));
+                }
+
+                $result = array_search($value, $choices);
+
+                if (!$isAssoc) {
+                    if (false !== $result) {
+                        $result = $choices[$result];
+                    } elseif (isset($choices[$value])) {
+                        $result = $choices[$value];
+                    }
+                } elseif (false === $result && isset($choices[$value])) {
+                    $result = $value;
+                }
+
+                if (false === $result) {
+                    throw new InvalidArgumentException(sprintf($errorMessage, $value));
+                }
+
+                $multiselectChoices[] = (string) $result;
+            }
+
+            if ($multiselect) {
+                return $multiselectChoices;
+            }
+
+            return current($multiselectChoices);
+        };
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Question/ConfirmationQuestion.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Question;
+
+/**
+ * Represents a yes/no question.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ConfirmationQuestion extends Question
+{
+    private $trueAnswerRegex;
+
+    /**
+     * Constructor.
+     *
+     * @param string $question        The question to ask to the user
+     * @param bool   $default         The default answer to return, true or false
+     * @param string $trueAnswerRegex A regex to match the "yes" answer
+     */
+    public function __construct($question, $default = true, $trueAnswerRegex = '/^y/i')
+    {
+        parent::__construct($question, (bool) $default);
+
+        $this->trueAnswerRegex = $trueAnswerRegex;
+        $this->setNormalizer($this->getDefaultNormalizer());
+    }
+
+    /**
+     * Returns the default answer normalizer.
+     *
+     * @return callable
+     */
+    private function getDefaultNormalizer()
+    {
+        $default = $this->getDefault();
+        $regex = $this->trueAnswerRegex;
+
+        return function ($answer) use ($default, $regex) {
+            if (is_bool($answer)) {
+                return $answer;
+            }
+
+            $answerIsTrue = (bool) preg_match($regex, $answer);
+            if (false === $default) {
+                return $answer && $answerIsTrue;
+            }
+
+            return !$answer || $answerIsTrue;
+        };
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Question/Question.php
@@ -0,0 +1,250 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Question;
+
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Exception\LogicException;
+
+/**
+ * Represents a Question.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Question
+{
+    private $question;
+    private $attempts;
+    private $hidden = false;
+    private $hiddenFallback = true;
+    private $autocompleterValues;
+    private $validator;
+    private $default;
+    private $normalizer;
+
+    /**
+     * Constructor.
+     *
+     * @param string $question The question to ask to the user
+     * @param mixed  $default  The default answer to return if the user enters nothing
+     */
+    public function __construct($question, $default = null)
+    {
+        $this->question = $question;
+        $this->default = $default;
+    }
+
+    /**
+     * Returns the question.
+     *
+     * @return string
+     */
+    public function getQuestion()
+    {
+        return $this->question;
+    }
+
+    /**
+     * Returns the default answer.
+     *
+     * @return mixed
+     */
+    public function getDefault()
+    {
+        return $this->default;
+    }
+
+    /**
+     * Returns whether the user response must be hidden.
+     *
+     * @return bool
+     */
+    public function isHidden()
+    {
+        return $this->hidden;
+    }
+
+    /**
+     * Sets whether the user response must be hidden or not.
+     *
+     * @param bool $hidden
+     *
+     * @return Question The current instance
+     *
+     * @throws LogicException In case the autocompleter is also used
+     */
+    public function setHidden($hidden)
+    {
+        if ($this->autocompleterValues) {
+            throw new LogicException('A hidden question cannot use the autocompleter.');
+        }
+
+        $this->hidden = (bool) $hidden;
+
+        return $this;
+    }
+
+    /**
+     * In case the response can not be hidden, whether to fallback on non-hidden question or not.
+     *
+     * @return bool
+     */
+    public function isHiddenFallback()
+    {
+        return $this->hiddenFallback;
+    }
+
+    /**
+     * Sets whether to fallback on non-hidden question if the response can not be hidden.
+     *
+     * @param bool $fallback
+     *
+     * @return Question The current instance
+     */
+    public function setHiddenFallback($fallback)
+    {
+        $this->hiddenFallback = (bool) $fallback;
+
+        return $this;
+    }
+
+    /**
+     * Gets values for the autocompleter.
+     *
+     * @return null|array|\Traversable
+     */
+    public function getAutocompleterValues()
+    {
+        return $this->autocompleterValues;
+    }
+
+    /**
+     * Sets values for the autocompleter.
+     *
+     * @param null|array|\Traversable $values
+     *
+     * @return Question The current instance
+     *
+     * @throws InvalidArgumentException
+     * @throws LogicException
+     */
+    public function setAutocompleterValues($values)
+    {
+        if (is_array($values)) {
+            $values = $this->isAssoc($values) ? array_merge(array_keys($values), array_values($values)) : array_values($values);
+        }
+
+        if (null !== $values && !is_array($values)) {
+            if (!$values instanceof \Traversable || !$values instanceof \Countable) {
+                throw new InvalidArgumentException('Autocompleter values can be either an array, `null` or an object implementing both `Countable` and `Traversable` interfaces.');
+            }
+        }
+
+        if ($this->hidden) {
+            throw new LogicException('A hidden question cannot use the autocompleter.');
+        }
+
+        $this->autocompleterValues = $values;
+
+        return $this;
+    }
+
+    /**
+     * Sets a validator for the question.
+     *
+     * @param null|callable $validator
+     *
+     * @return Question The current instance
+     */
+    public function setValidator($validator)
+    {
+        $this->validator = $validator;
+
+        return $this;
+    }
+
+    /**
+     * Gets the validator for the question.
+     *
+     * @return null|callable
+     */
+    public function getValidator()
+    {
+        return $this->validator;
+    }
+
+    /**
+     * Sets the maximum number of attempts.
+     *
+     * Null means an unlimited number of attempts.
+     *
+     * @param null|int $attempts
+     *
+     * @return Question The current instance
+     *
+     * @throws InvalidArgumentException In case the number of attempts is invalid.
+     */
+    public function setMaxAttempts($attempts)
+    {
+        if (null !== $attempts && $attempts < 1) {
+            throw new InvalidArgumentException('Maximum number of attempts must be a positive value.');
+        }
+
+        $this->attempts = $attempts;
+
+        return $this;
+    }
+
+    /**
+     * Gets the maximum number of attempts.
+     *
+     * Null means an unlimited number of attempts.
+     *
+     * @return null|int
+     */
+    public function getMaxAttempts()
+    {
+        return $this->attempts;
+    }
+
+    /**
+     * Sets a normalizer for the response.
+     *
+     * The normalizer can be a callable (a string), a closure or a class implementing __invoke.
+     *
+     * @param callable $normalizer
+     *
+     * @return Question The current instance
+     */
+    public function setNormalizer($normalizer)
+    {
+        $this->normalizer = $normalizer;
+
+        return $this;
+    }
+
+    /**
+     * Gets the normalizer for the response.
+     *
+     * The normalizer can ba a callable (a string), a closure or a class implementing __invoke.
+     *
+     * @return callable
+     */
+    public function getNormalizer()
+    {
+        return $this->normalizer;
+    }
+
+    protected function isAssoc($array)
+    {
+        return (bool) count(array_filter(array_keys($array), 'is_string'));
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Resources/bin/hiddeninput.exe
@@ -0,0 +1,21 @@
+MZ                @                                       	!L!This program cannot be run in DOS mode.

+$       ,;B;B;B2מ:B2-B2ƞ9B2ў?Ba98B;CB2Ȟ:B2֞:B2Ӟ:BRich;B        PE  L MoO         	  
+         8           @                      `     ?   @                           "  P    @                      P  p   !                             8!  @                                          .text   	      
+                    `.rdata  	       
+                 @  @.data      0                    @  .rsrc       @                    @  @.reloc     P      "              @  B                                                                                                                                                                                                                                                                                                                                                        j$@ x  j @ e EPV  @ EЃPV @ MX @ e EP5H @ L @ YY5\ @ EP5` @ D @ YYP @ MMT @ 3H  ;
 0@ u  h@   l3@ $40@ 5h3@ 40@ h$0@ h(0@ h 0@  @ 00@ }j  Yjh"@   3ۉ]d   p]俀3@ SVW0 @ ;t;u3Fuh  4 @ 3F|3@ ;u
+j\  Y;|3@ u,5|3@ h @ h @   YYtE      5<0@ |3@ ;uh @ h @ l  YY|3@    9]uSW8 @ 93@ th3@   Yt
+SjS3@ $0@ 
 @ 5$0@ 5(0@ 5 0@ 80@ 9,0@ u7P @ E	MPQ  YYËeE80@ 39,0@ uPh @ 9<0@ u @ E80@   øMZ  f9  @ t3M< @   @ 8PE  uH  t  uՃ   v39   xtv39   j,0@ p @ jl @ YY3@ 3@  @ 
t3@  @ 
p3@  @  x3@ V    =0@  uh@  @ Yg  =0@ u	j @ Y3{  U(  H1@ 
D1@ @1@ <1@ 581@ =41@ f`1@ f
T1@ f01@ f,1@ f%(1@ f-$1@ X1@ E L1@ EP1@ E\1@ 0@   P1@ L0@ @0@ 	 D0@     0@ 0@  @ 0@ j?  Yj   @ h!@ $ @ =0@  uj  Yh	 ( @ P, @ ËUE 8csmu*xu$@= t=!t="t= @u  3] hH@   @ 3% @ jh("@ b  53@ 5 @ YEuu @ Ygj  Ye 53@ ։E53@ YYEEPEPu5l @ YPU  Eu֣3@ uփ3@ E	   E  j  YËUuNYH]ËV!@ !@ W;stЃ;r_^ËV"@ "@ W;stЃ;r_^% @ ̋UMMZ  f9t3]ËA<8PE  u3ҹ  f9H]̋UEH<ASVq3WDv}H;r	X;r
+B(;r3_^[]̋UjhH"@ he@ d    PSVW 0@ 1E3PEd    eE    h  @ *tUE-  @ Ph  @ Pt;@$ЃEMd
    Y_^[]ËE3=  ËeE3Md
    Y_^[]% @ % @ he@ d5    D$l$l$+SVW 0@ 1E3PeuEEEEd    ËMd
    Y__^[]QËUuuuuh@ h 0@    ]ËVh   h   3V   t
VVVVV   ^3ËU 0@ e e SWN@  ;t
t	У0@ `VEP< @ u3u @ 3 @ 3 @ 3EP @ E3E3;uO@u5 0@ ։50@ ^_[%t @ %x @ %| @ % @ % @ % @ % @ % @ % @ Pd5    D$+d$SVW( 0@ 3PEuEEd    ËMd
    Y__^[]QËM3M%T @ T$BJ3J3l"@ s                                                                                                                                                                                                                                                     #  #  #  )  r)  b)  H)  4)  )  (  (  (  (  (  (  )      #  $  %  %  &  d&  &  $      ('  '  '  '  '  (  ((  6(  '  H(  Z(  t(  (  '  '   '  '  '  l'  ^'  R'  F'  >'  >(  0'  '  )          @         W@ @                     MoO       l   !    @0@ 0@ bad allocation      H                                                            0@ !@    RSDSьJ!LZ    c:\users\seld\documents\visual studio 2010\Projects\hiddeninp\Release\hiddeninp.pdb     e                            @ @                 :@             @ @ @ "   d"@                        "          #      $#          &  D   H#          (  h                       #  #  #  )  r)  b)  H)  4)  )  (  (  (  (  (  (  )      #  $  %  %  &  d&  &  $      ('  '  '  '  '  (  ((  6(  '  H(  Z(  t(  (  '  '   '  '  '  l'  ^'  R'  F'  >'  >(  0'  '  )      GetConsoleMode  SetConsoleMode  ;GetStdHandle  KERNEL32.dll   ??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z ?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A  J?cin@std@@3V?$basic_istream@DU?$char_traits@D@std@@@1@A  ??$getline@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@AAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z  _??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ  {??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ  ?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z  MSVCP90.dll _amsg_exit   __getmainargs ,_cexit  |_exit f _XcptFilter exit   __initenv _initterm _initterm_e <_configthreadlocale  __setusermatherr  _adjust_fdiv   __p__commode   __p__fmode  j_encode_pointer  __set_app_type  K_crt_debugger_hook  C ?terminate@@YAXXZ MSVCR90.dll _unlock  __dllonexit v_lock _onexit `_decode_pointer s_except_handler4_common _invoke_watson  ?_controlfp_s  InterlockedExchange !Sleep InterlockedCompareExchange  -TerminateProcess  GetCurrentProcess >UnhandledExceptionFilter  SetUnhandledExceptionFilter IsDebuggerPresent TQueryPerformanceCounter fGetTickCount  GetCurrentThreadId  GetCurrentProcessId OGetSystemTimeAsFileTime s __CxxFrameHandler3                                                    N@D   $!@                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            8                   P                   h                	                   	     @  (        C  V        (4   V S _ V E R S I O N _ I N F O                                                  S t r i n g F i l e I n f o   b   0 4 0 9 0 4 b 0    Q  F i l e D e s c r i p t i o n     R e a d s   f r o m   s t d i n   w i t h o u t   l e a k i n g   i n f o   t o   t h e   t e r m i n a l   a n d   o u t p u t s   b a c k   t o   s t d o u t     6   F i l e V e r s i o n     1 ,   0 ,   0 ,   0     8   I n t e r n a l N a m e   h i d d e n i n p u t   P   L e g a l C o p y r i g h t   J o r d i   B o g g i a n o   -   2 0 1 2   H   O r i g i n a l F i l e n a m e   h i d d e n i n p u t . e x e   : 
  P r o d u c t N a m e     H i d d e n   I n p u t     :   P r o d u c t V e r s i o n   1 ,   0 ,   0 ,   0     D    V a r F i l e I n f o     $    T r a n s l a t i o n     	<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+    <security>
+      <requestedPrivileges>
+        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
+      </requestedPrivileges>
+    </security>
+  </trustInfo>
+  <dependency>
+    <dependentAssembly>
+      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
+    </dependentAssembly>
+  </dependency>
+</assembly>PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDING   @  00!0/080F0L0T0^0d0n0{000000000000001#1-1@1J1O1T1v1{1111111111111112"2*23292A2M2_2j2p222222222222333%303N3T3Z3`3f3l3s3z333333333333333334444%4;4B444444444445!5^5c5555H6M6_6}666 77
7*7w7|777778
88=8E8P8V8\8b8h8n8t8z88889      $   0001 1t1x12 2@2\2`2h2t2 0     0                                                                                                                                                  
\ No newline at end of file
--- /dev/null
+++ b/vendor/symfony/console/Shell.php
@@ -0,0 +1,233 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console;
+
+use Symfony\Component\Console\Exception\RuntimeException;
+use Symfony\Component\Console\Input\StringInput;
+use Symfony\Component\Console\Output\ConsoleOutput;
+use Symfony\Component\Process\ProcessBuilder;
+use Symfony\Component\Process\PhpExecutableFinder;
+
+/**
+ * A Shell wraps an Application to add shell capabilities to it.
+ *
+ * Support for history and completion only works with a PHP compiled
+ * with readline support (either --with-readline or --with-libedit)
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Martin Hasoň <martin.hason@gmail.com>
+ */
+class Shell
+{
+    private $application;
+    private $history;
+    private $output;
+    private $hasReadline;
+    private $processIsolation = false;
+
+    /**
+     * Constructor.
+     *
+     * If there is no readline support for the current PHP executable
+     * a \RuntimeException exception is thrown.
+     *
+     * @param Application $application An application instance
+     */
+    public function __construct(Application $application)
+    {
+        @trigger_error('The '.__CLASS__.' class is deprecated since Symfony 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        $this->hasReadline = function_exists('readline');
+        $this->application = $application;
+        $this->history = getenv('HOME').'/.history_'.$application->getName();
+        $this->output = new ConsoleOutput();
+    }
+
+    /**
+     * Runs the shell.
+     */
+    public function run()
+    {
+        $this->application->setAutoExit(false);
+        $this->application->setCatchExceptions(true);
+
+        if ($this->hasReadline) {
+            readline_read_history($this->history);
+            readline_completion_function(array($this, 'autocompleter'));
+        }
+
+        $this->output->writeln($this->getHeader());
+        $php = null;
+        if ($this->processIsolation) {
+            $finder = new PhpExecutableFinder();
+            $php = $finder->find();
+            $this->output->writeln(<<<'EOF'
+<info>Running with process isolation, you should consider this:</info>
+  * each command is executed as separate process,
+  * commands don't support interactivity, all params must be passed explicitly,
+  * commands output is not colorized.
+
+EOF
+            );
+        }
+
+        while (true) {
+            $command = $this->readline();
+
+            if (false === $command) {
+                $this->output->writeln("\n");
+
+                break;
+            }
+
+            if ($this->hasReadline) {
+                readline_add_history($command);
+                readline_write_history($this->history);
+            }
+
+            if ($this->processIsolation) {
+                $pb = new ProcessBuilder();
+
+                $process = $pb
+                    ->add($php)
+                    ->add($_SERVER['argv'][0])
+                    ->add($command)
+                    ->inheritEnvironmentVariables(true)
+                    ->getProcess()
+                ;
+
+                $output = $this->output;
+                $process->run(function ($type, $data) use ($output) {
+                    $output->writeln($data);
+                });
+
+                $ret = $process->getExitCode();
+            } else {
+                $ret = $this->application->run(new StringInput($command), $this->output);
+            }
+
+            if (0 !== $ret) {
+                $this->output->writeln(sprintf('<error>The command terminated with an error status (%s)</error>', $ret));
+            }
+        }
+    }
+
+    /**
+     * Returns the shell header.
+     *
+     * @return string The header string
+     */
+    protected function getHeader()
+    {
+        return <<<EOF
+
+Welcome to the <info>{$this->application->getName()}</info> shell (<comment>{$this->application->getVersion()}</comment>).
+
+At the prompt, type <comment>help</comment> for some help,
+or <comment>list</comment> to get a list of available commands.
+
+To exit the shell, type <comment>^D</comment>.
+
+EOF;
+    }
+
+    /**
+     * Renders a prompt.
+     *
+     * @return string The prompt
+     */
+    protected function getPrompt()
+    {
+        // using the formatter here is required when using readline
+        return $this->output->getFormatter()->format($this->application->getName().' > ');
+    }
+
+    protected function getOutput()
+    {
+        return $this->output;
+    }
+
+    protected function getApplication()
+    {
+        return $this->application;
+    }
+
+    /**
+     * Tries to return autocompletion for the current entered text.
+     *
+     * @param string $text The last segment of the entered text
+     *
+     * @return bool|array A list of guessed strings or true
+     */
+    private function autocompleter($text)
+    {
+        $info = readline_info();
+        $text = substr($info['line_buffer'], 0, $info['end']);
+
+        if ($info['point'] !== $info['end']) {
+            return true;
+        }
+
+        // task name?
+        if (false === strpos($text, ' ') || !$text) {
+            return array_keys($this->application->all());
+        }
+
+        // options and arguments?
+        try {
+            $command = $this->application->find(substr($text, 0, strpos($text, ' ')));
+        } catch (\Exception $e) {
+            return true;
+        }
+
+        $list = array('--help');
+        foreach ($command->getDefinition()->getOptions() as $option) {
+            $list[] = '--'.$option->getName();
+        }
+
+        return $list;
+    }
+
+    /**
+     * Reads a single line from standard input.
+     *
+     * @return string The single line from standard input
+     */
+    private function readline()
+    {
+        if ($this->hasReadline) {
+            $line = readline($this->getPrompt());
+        } else {
+            $this->output->write($this->getPrompt());
+            $line = fgets(STDIN, 1024);
+            $line = (false === $line || '' === $line) ? false : rtrim($line);
+        }
+
+        return $line;
+    }
+
+    public function getProcessIsolation()
+    {
+        return $this->processIsolation;
+    }
+
+    public function setProcessIsolation($processIsolation)
+    {
+        $this->processIsolation = (bool) $processIsolation;
+
+        if ($this->processIsolation && !class_exists('Symfony\\Component\\Process\\Process')) {
+            throw new RuntimeException('Unable to isolate processes as the Symfony Process Component is not installed.');
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Style/OutputStyle.php
@@ -0,0 +1,116 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Style;
+
+use Symfony\Component\Console\Formatter\OutputFormatterInterface;
+use Symfony\Component\Console\Helper\ProgressBar;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * Decorates output to add console style guide helpers.
+ *
+ * @author Kevin Bond <kevinbond@gmail.com>
+ */
+abstract class OutputStyle implements OutputInterface, StyleInterface
+{
+    private $output;
+
+    /**
+     * @param OutputInterface $output
+     */
+    public function __construct(OutputInterface $output)
+    {
+        $this->output = $output;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function newLine($count = 1)
+    {
+        $this->output->write(str_repeat(PHP_EOL, $count));
+    }
+
+    /**
+     * @param int $max
+     *
+     * @return ProgressBar
+     */
+    public function createProgressBar($max = 0)
+    {
+        return new ProgressBar($this->output, $max);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL)
+    {
+        $this->output->write($messages, $newline, $type);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function writeln($messages, $type = self::OUTPUT_NORMAL)
+    {
+        $this->output->writeln($messages, $type);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setVerbosity($level)
+    {
+        $this->output->setVerbosity($level);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getVerbosity()
+    {
+        return $this->output->getVerbosity();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setDecorated($decorated)
+    {
+        $this->output->setDecorated($decorated);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isDecorated()
+    {
+        return $this->output->isDecorated();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFormatter(OutputFormatterInterface $formatter)
+    {
+        $this->output->setFormatter($formatter);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFormatter()
+    {
+        return $this->output->getFormatter();
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Style/StyleInterface.php
@@ -0,0 +1,159 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Style;
+
+/**
+ * Output style helpers.
+ *
+ * @author Kevin Bond <kevinbond@gmail.com>
+ */
+interface StyleInterface
+{
+    /**
+     * Formats a command title.
+     *
+     * @param string $message
+     */
+    public function title($message);
+
+    /**
+     * Formats a section title.
+     *
+     * @param string $message
+     */
+    public function section($message);
+
+    /**
+     * Formats a list.
+     *
+     * @param array $elements
+     */
+    public function listing(array $elements);
+
+    /**
+     * Formats informational text.
+     *
+     * @param string|array $message
+     */
+    public function text($message);
+
+    /**
+     * Formats a success result bar.
+     *
+     * @param string|array $message
+     */
+    public function success($message);
+
+    /**
+     * Formats an error result bar.
+     *
+     * @param string|array $message
+     */
+    public function error($message);
+
+    /**
+     * Formats an warning result bar.
+     *
+     * @param string|array $message
+     */
+    public function warning($message);
+
+    /**
+     * Formats a note admonition.
+     *
+     * @param string|array $message
+     */
+    public function note($message);
+
+    /**
+     * Formats a caution admonition.
+     *
+     * @param string|array $message
+     */
+    public function caution($message);
+
+    /**
+     * Formats a table.
+     *
+     * @param array $headers
+     * @param array $rows
+     */
+    public function table(array $headers, array $rows);
+
+    /**
+     * Asks a question.
+     *
+     * @param string        $question
+     * @param string|null   $default
+     * @param callable|null $validator
+     *
+     * @return string
+     */
+    public function ask($question, $default = null, $validator = null);
+
+    /**
+     * Asks a question with the user input hidden.
+     *
+     * @param string        $question
+     * @param callable|null $validator
+     *
+     * @return string
+     */
+    public function askHidden($question, $validator = null);
+
+    /**
+     * Asks for confirmation.
+     *
+     * @param string $question
+     * @param bool   $default
+     *
+     * @return bool
+     */
+    public function confirm($question, $default = true);
+
+    /**
+     * Asks a choice question.
+     *
+     * @param string          $question
+     * @param array           $choices
+     * @param string|int|null $default
+     *
+     * @return string
+     */
+    public function choice($question, array $choices, $default = null);
+
+    /**
+     * Add newline(s).
+     *
+     * @param int $count The number of newlines
+     */
+    public function newLine($count = 1);
+
+    /**
+     * Starts the progress output.
+     *
+     * @param int $max Maximum steps (0 if unknown)
+     */
+    public function progressStart($max = 0);
+
+    /**
+     * Advances the progress output X steps.
+     *
+     * @param int $step Number of steps to advance
+     */
+    public function progressAdvance($step = 1);
+
+    /**
+     * Finishes the progress output.
+     */
+    public function progressFinish();
+}
--- /dev/null
+++ b/vendor/symfony/console/Style/SymfonyStyle.php
@@ -0,0 +1,435 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Style;
+
+use Symfony\Component\Console\Application;
+use Symfony\Component\Console\Exception\RuntimeException;
+use Symfony\Component\Console\Formatter\OutputFormatter;
+use Symfony\Component\Console\Helper\Helper;
+use Symfony\Component\Console\Helper\ProgressBar;
+use Symfony\Component\Console\Helper\SymfonyQuestionHelper;
+use Symfony\Component\Console\Helper\Table;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\BufferedOutput;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\ChoiceQuestion;
+use Symfony\Component\Console\Question\ConfirmationQuestion;
+use Symfony\Component\Console\Question\Question;
+
+/**
+ * Output decorator helpers for the Symfony Style Guide.
+ *
+ * @author Kevin Bond <kevinbond@gmail.com>
+ */
+class SymfonyStyle extends OutputStyle
+{
+    const MAX_LINE_LENGTH = 120;
+
+    private $input;
+    private $questionHelper;
+    private $progressBar;
+    private $lineLength;
+    private $bufferedOutput;
+
+    /**
+     * @param InputInterface  $input
+     * @param OutputInterface $output
+     */
+    public function __construct(InputInterface $input, OutputInterface $output)
+    {
+        $this->input = $input;
+        $this->bufferedOutput = new BufferedOutput($output->getVerbosity(), false, clone $output->getFormatter());
+        // Windows cmd wraps lines as soon as the terminal width is reached, whether there are following chars or not.
+        $this->lineLength = min($this->getTerminalWidth() - (int) (DIRECTORY_SEPARATOR === '\\'), self::MAX_LINE_LENGTH);
+
+        parent::__construct($output);
+    }
+
+    /**
+     * Formats a message as a block of text.
+     *
+     * @param string|array $messages The message to write in the block
+     * @param string|null  $type     The block type (added in [] on first line)
+     * @param string|null  $style    The style to apply to the whole block
+     * @param string       $prefix   The prefix for the block
+     * @param bool         $padding  Whether to add vertical padding
+     */
+    public function block($messages, $type = null, $style = null, $prefix = ' ', $padding = false)
+    {
+        $messages = is_array($messages) ? array_values($messages) : array($messages);
+
+        $this->autoPrependBlock();
+        $this->writeln($this->createBlock($messages, $type, $style, $prefix, $padding, true));
+        $this->newLine();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function title($message)
+    {
+        $this->autoPrependBlock();
+        $this->writeln(array(
+            sprintf('<comment>%s</>', $message),
+            sprintf('<comment>%s</>', str_repeat('=', Helper::strlenWithoutDecoration($this->getFormatter(), $message))),
+        ));
+        $this->newLine();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function section($message)
+    {
+        $this->autoPrependBlock();
+        $this->writeln(array(
+            sprintf('<comment>%s</>', $message),
+            sprintf('<comment>%s</>', str_repeat('-', Helper::strlenWithoutDecoration($this->getFormatter(), $message))),
+        ));
+        $this->newLine();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function listing(array $elements)
+    {
+        $this->autoPrependText();
+        $elements = array_map(function ($element) {
+            return sprintf(' * %s', $element);
+        }, $elements);
+
+        $this->writeln($elements);
+        $this->newLine();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function text($message)
+    {
+        $this->autoPrependText();
+
+        $messages = is_array($message) ? array_values($message) : array($message);
+        foreach ($messages as $message) {
+            $this->writeln(sprintf(' %s', $message));
+        }
+    }
+
+    /**
+     * Formats a command comment.
+     *
+     * @param string|array $message
+     */
+    public function comment($message)
+    {
+        $messages = is_array($message) ? array_values($message) : array($message);
+
+        $this->autoPrependBlock();
+        $this->writeln($this->createBlock($messages, null, null, '<fg=default;bg=default> // </>'));
+        $this->newLine();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function success($message)
+    {
+        $this->block($message, 'OK', 'fg=black;bg=green', ' ', true);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function error($message)
+    {
+        $this->block($message, 'ERROR', 'fg=white;bg=red', ' ', true);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function warning($message)
+    {
+        $this->block($message, 'WARNING', 'fg=white;bg=red', ' ', true);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function note($message)
+    {
+        $this->block($message, 'NOTE', 'fg=yellow', ' ! ');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function caution($message)
+    {
+        $this->block($message, 'CAUTION', 'fg=white;bg=red', ' ! ', true);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function table(array $headers, array $rows)
+    {
+        $style = clone Table::getStyleDefinition('symfony-style-guide');
+        $style->setCellHeaderFormat('<info>%s</info>');
+
+        $table = new Table($this);
+        $table->setHeaders($headers);
+        $table->setRows($rows);
+        $table->setStyle($style);
+
+        $table->render();
+        $this->newLine();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function ask($question, $default = null, $validator = null)
+    {
+        $question = new Question($question, $default);
+        $question->setValidator($validator);
+
+        return $this->askQuestion($question);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function askHidden($question, $validator = null)
+    {
+        $question = new Question($question);
+
+        $question->setHidden(true);
+        $question->setValidator($validator);
+
+        return $this->askQuestion($question);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function confirm($question, $default = true)
+    {
+        return $this->askQuestion(new ConfirmationQuestion($question, $default));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function choice($question, array $choices, $default = null)
+    {
+        if (null !== $default) {
+            $values = array_flip($choices);
+            $default = $values[$default];
+        }
+
+        return $this->askQuestion(new ChoiceQuestion($question, $choices, $default));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function progressStart($max = 0)
+    {
+        $this->progressBar = $this->createProgressBar($max);
+        $this->progressBar->start();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function progressAdvance($step = 1)
+    {
+        $this->getProgressBar()->advance($step);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function progressFinish()
+    {
+        $this->getProgressBar()->finish();
+        $this->newLine(2);
+        $this->progressBar = null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function createProgressBar($max = 0)
+    {
+        $progressBar = parent::createProgressBar($max);
+
+        if ('\\' !== DIRECTORY_SEPARATOR) {
+            $progressBar->setEmptyBarCharacter('░'); // light shade character \u2591
+            $progressBar->setProgressCharacter('');
+            $progressBar->setBarCharacter('▓'); // dark shade character \u2593
+        }
+
+        return $progressBar;
+    }
+
+    /**
+     * @param Question $question
+     *
+     * @return string
+     */
+    public function askQuestion(Question $question)
+    {
+        if ($this->input->isInteractive()) {
+            $this->autoPrependBlock();
+        }
+
+        if (!$this->questionHelper) {
+            $this->questionHelper = new SymfonyQuestionHelper();
+        }
+
+        $answer = $this->questionHelper->ask($this->input, $this, $question);
+
+        if ($this->input->isInteractive()) {
+            $this->newLine();
+            $this->bufferedOutput->write("\n");
+        }
+
+        return $answer;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function writeln($messages, $type = self::OUTPUT_NORMAL)
+    {
+        parent::writeln($messages, $type);
+        $this->bufferedOutput->writeln($this->reduceBuffer($messages), $type);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL)
+    {
+        parent::write($messages, $newline, $type);
+        $this->bufferedOutput->write($this->reduceBuffer($messages), $newline, $type);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function newLine($count = 1)
+    {
+        parent::newLine($count);
+        $this->bufferedOutput->write(str_repeat("\n", $count));
+    }
+
+    /**
+     * @return ProgressBar
+     */
+    private function getProgressBar()
+    {
+        if (!$this->progressBar) {
+            throw new RuntimeException('The ProgressBar is not started.');
+        }
+
+        return $this->progressBar;
+    }
+
+    private function getTerminalWidth()
+    {
+        $application = new Application();
+        $dimensions = $application->getTerminalDimensions();
+
+        return $dimensions[0] ?: self::MAX_LINE_LENGTH;
+    }
+
+    private function autoPrependBlock()
+    {
+        $chars = substr(str_replace(PHP_EOL, "\n", $this->bufferedOutput->fetch()), -2);
+
+        if (!isset($chars[0])) {
+            return $this->newLine(); //empty history, so we should start with a new line.
+        }
+        //Prepend new line for each non LF chars (This means no blank line was output before)
+        $this->newLine(2 - substr_count($chars, "\n"));
+    }
+
+    private function autoPrependText()
+    {
+        $fetched = $this->bufferedOutput->fetch();
+        //Prepend new line if last char isn't EOL:
+        if ("\n" !== substr($fetched, -1)) {
+            $this->newLine();
+        }
+    }
+
+    private function reduceBuffer($messages)
+    {
+        // We need to know if the two last chars are PHP_EOL
+        // Preserve the last 4 chars inserted (PHP_EOL on windows is two chars) in the history buffer
+        return array_map(function ($value) {
+            return substr($value, -4);
+        }, array_merge(array($this->bufferedOutput->fetch()), (array) $messages));
+    }
+
+    private function createBlock($messages, $type = null, $style = null, $prefix = ' ', $padding = false, $escape = false)
+    {
+        $indentLength = 0;
+        $prefixLength = Helper::strlenWithoutDecoration($this->getFormatter(), $prefix);
+        $lines = array();
+
+        if (null !== $type) {
+            $type = sprintf('[%s] ', $type);
+            $indentLength = strlen($type);
+            $lineIndentation = str_repeat(' ', $indentLength);
+        }
+
+        // wrap and add newlines for each element
+        foreach ($messages as $key => $message) {
+            if ($escape) {
+                $message = OutputFormatter::escape($message);
+            }
+
+            $lines = array_merge($lines, explode(PHP_EOL, wordwrap($message, $this->lineLength - $prefixLength - $indentLength, PHP_EOL, true)));
+
+            if (count($messages) > 1 && $key < count($messages) - 1) {
+                $lines[] = '';
+            }
+        }
+
+        $firstLineIndex = 0;
+        if ($padding && $this->isDecorated()) {
+            $firstLineIndex = 1;
+            array_unshift($lines, '');
+            $lines[] = '';
+        }
+
+        foreach ($lines as $i => &$line) {
+            if (null !== $type) {
+                $line = $firstLineIndex === $i ? $type.$line : $lineIndentation.$line;
+            }
+
+            $line = $prefix.$line;
+            $line .= str_repeat(' ', $this->lineLength - Helper::strlenWithoutDecoration($this->getFormatter(), $line));
+
+            if ($style) {
+                $line = sprintf('<%s>%s</>', $style, $line);
+            }
+        }
+
+        return $lines;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Tester/ApplicationTester.php
@@ -0,0 +1,128 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Tester;
+
+use Symfony\Component\Console\Application;
+use Symfony\Component\Console\Input\ArrayInput;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Output\StreamOutput;
+
+/**
+ * Eases the testing of console applications.
+ *
+ * When testing an application, don't forget to disable the auto exit flag:
+ *
+ *     $application = new Application();
+ *     $application->setAutoExit(false);
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ApplicationTester
+{
+    private $application;
+    private $input;
+    private $output;
+    private $statusCode;
+
+    /**
+     * Constructor.
+     *
+     * @param Application $application An Application instance to test
+     */
+    public function __construct(Application $application)
+    {
+        $this->application = $application;
+    }
+
+    /**
+     * Executes the application.
+     *
+     * Available options:
+     *
+     *  * interactive: Sets the input interactive flag
+     *  * decorated:   Sets the output decorated flag
+     *  * verbosity:   Sets the output verbosity flag
+     *
+     * @param array $input   An array of arguments and options
+     * @param array $options An array of options
+     *
+     * @return int The command exit code
+     */
+    public function run(array $input, $options = array())
+    {
+        $this->input = new ArrayInput($input);
+        if (isset($options['interactive'])) {
+            $this->input->setInteractive($options['interactive']);
+        }
+
+        $this->output = new StreamOutput(fopen('php://memory', 'w', false));
+        if (isset($options['decorated'])) {
+            $this->output->setDecorated($options['decorated']);
+        }
+        if (isset($options['verbosity'])) {
+            $this->output->setVerbosity($options['verbosity']);
+        }
+
+        return $this->statusCode = $this->application->run($this->input, $this->output);
+    }
+
+    /**
+     * Gets the display returned by the last execution of the application.
+     *
+     * @param bool $normalize Whether to normalize end of lines to \n or not
+     *
+     * @return string The display
+     */
+    public function getDisplay($normalize = false)
+    {
+        rewind($this->output->getStream());
+
+        $display = stream_get_contents($this->output->getStream());
+
+        if ($normalize) {
+            $display = str_replace(PHP_EOL, "\n", $display);
+        }
+
+        return $display;
+    }
+
+    /**
+     * Gets the input instance used by the last execution of the application.
+     *
+     * @return InputInterface The current input instance
+     */
+    public function getInput()
+    {
+        return $this->input;
+    }
+
+    /**
+     * Gets the output instance used by the last execution of the application.
+     *
+     * @return OutputInterface The current output instance
+     */
+    public function getOutput()
+    {
+        return $this->output;
+    }
+
+    /**
+     * Gets the status code returned by the last execution of the application.
+     *
+     * @return int The status code
+     */
+    public function getStatusCode()
+    {
+        return $this->statusCode;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/Tester/CommandTester.php
@@ -0,0 +1,132 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Console\Tester;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\ArrayInput;
+use Symfony\Component\Console\Output\StreamOutput;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * Eases the testing of console commands.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class CommandTester
+{
+    private $command;
+    private $input;
+    private $output;
+    private $statusCode;
+
+    /**
+     * Constructor.
+     *
+     * @param Command $command A Command instance to test
+     */
+    public function __construct(Command $command)
+    {
+        $this->command = $command;
+    }
+
+    /**
+     * Executes the command.
+     *
+     * Available execution options:
+     *
+     *  * interactive: Sets the input interactive flag
+     *  * decorated:   Sets the output decorated flag
+     *  * verbosity:   Sets the output verbosity flag
+     *
+     * @param array $input   An array of command arguments and options
+     * @param array $options An array of execution options
+     *
+     * @return int The command exit code
+     */
+    public function execute(array $input, array $options = array())
+    {
+        // set the command name automatically if the application requires
+        // this argument and no command name was passed
+        if (!isset($input['command'])
+            && (null !== $application = $this->command->getApplication())
+            && $application->getDefinition()->hasArgument('command')
+        ) {
+            $input = array_merge(array('command' => $this->command->getName()), $input);
+        }
+
+        $this->input = new ArrayInput($input);
+        if (isset($options['interactive'])) {
+            $this->input->setInteractive($options['interactive']);
+        }
+
+        $this->output = new StreamOutput(fopen('php://memory', 'w', false));
+        if (isset($options['decorated'])) {
+            $this->output->setDecorated($options['decorated']);
+        }
+        if (isset($options['verbosity'])) {
+            $this->output->setVerbosity($options['verbosity']);
+        }
+
+        return $this->statusCode = $this->command->run($this->input, $this->output);
+    }
+
+    /**
+     * Gets the display returned by the last execution of the command.
+     *
+     * @param bool $normalize Whether to normalize end of lines to \n or not
+     *
+     * @return string The display
+     */
+    public function getDisplay($normalize = false)
+    {
+        rewind($this->output->getStream());
+
+        $display = stream_get_contents($this->output->getStream());
+
+        if ($normalize) {
+            $display = str_replace(PHP_EOL, "\n", $display);
+        }
+
+        return $display;
+    }
+
+    /**
+     * Gets the input instance used by the last execution of the command.
+     *
+     * @return InputInterface The current input instance
+     */
+    public function getInput()
+    {
+        return $this->input;
+    }
+
+    /**
+     * Gets the output instance used by the last execution of the command.
+     *
+     * @return OutputInterface The current output instance
+     */
+    public function getOutput()
+    {
+        return $this->output;
+    }
+
+    /**
+     * Gets the status code returned by the last execution of the application.
+     *
+     * @return int The status code
+     */
+    public function getStatusCode()
+    {
+        return $this->statusCode;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/console/composer.json
@@ -0,0 +1,45 @@
+{
+    "name": "symfony/console",
+    "type": "library",
+    "description": "Symfony Console Component",
+    "keywords": [],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.9",
+        "symfony/polyfill-mbstring": "~1.0",
+        "symfony/debug": "~2.7,>=2.7.2|~3.0.0"
+    },
+    "require-dev": {
+        "symfony/event-dispatcher": "~2.1|~3.0.0",
+        "symfony/process": "~2.1|~3.0.0",
+        "psr/log": "~1.0"
+    },
+    "suggest": {
+        "symfony/event-dispatcher": "",
+        "symfony/process": "",
+        "psr/log": "For using the console logger"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Component\\Console\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.8-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/debug/BufferingLogger.php
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Debug;
+
+use Psr\Log\AbstractLogger;
+
+/**
+ * A buffering logger that stacks logs for later.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class BufferingLogger extends AbstractLogger
+{
+    private $logs = array();
+
+    public function log($level, $message, array $context = array())
+    {
+        $this->logs[] = array($level, $message, $context);
+    }
+
+    public function cleanLogs()
+    {
+        $logs = $this->logs;
+        $this->logs = array();
+
+        return $logs;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/debug/Debug.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Debug;
+
+/**
+ * Registers all the debug tools.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Debug
+{
+    private static $enabled = false;
+
+    /**
+     * Enables the debug tools.
+     *
+     * This method registers an error handler and an exception handler.
+     *
+     * If the Symfony ClassLoader component is available, a special
+     * class loader is also registered.
+     *
+     * @param int  $errorReportingLevel The level of error reporting you want
+     * @param bool $displayErrors       Whether to display errors (for development) or just log them (for production)
+     */
+    public static function enable($errorReportingLevel = null, $displayErrors = true)
+    {
+        if (static::$enabled) {
+            return;
+        }
+
+        static::$enabled = true;
+
+        if (null !== $errorReportingLevel) {
+            error_reporting($errorReportingLevel);
+        } else {
+            error_reporting(-1);
+        }
+
+        if ('cli' !== PHP_SAPI) {
+            ini_set('display_errors', 0);
+            ExceptionHandler::register();
+        } elseif ($displayErrors && (!ini_get('log_errors') || ini_get('error_log'))) {
+            // CLI - display errors only if they're not already logged to STDERR
+            ini_set('display_errors', 1);
+        }
+        if ($displayErrors) {
+            ErrorHandler::register(new ErrorHandler(new BufferingLogger()));
+        } else {
+            ErrorHandler::register()->throwAt(0, true);
+        }
+
+        DebugClassLoader::enable();
+    }
+}
--- /dev/null
+++ b/vendor/symfony/debug/DebugClassLoader.php
@@ -0,0 +1,349 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Debug;
+
+/**
+ * Autoloader checking if the class is really defined in the file found.
+ *
+ * The ClassLoader will wrap all registered autoloaders
+ * and will throw an exception if a file is found but does
+ * not declare the class.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Christophe Coevoet <stof@notk.org>
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class DebugClassLoader
+{
+    private $classLoader;
+    private $isFinder;
+    private $wasFinder;
+    private static $caseCheck;
+    private static $deprecated = array();
+    private static $php7Reserved = array('int', 'float', 'bool', 'string', 'true', 'false', 'null');
+    private static $darwinCache = array('/' => array('/', array()));
+
+    /**
+     * Constructor.
+     *
+     * @param callable|object $classLoader Passing an object is @deprecated since version 2.5 and support for it will be removed in 3.0
+     */
+    public function __construct($classLoader)
+    {
+        $this->wasFinder = is_object($classLoader) && method_exists($classLoader, 'findFile');
+
+        if ($this->wasFinder) {
+            @trigger_error('The '.__METHOD__.' method will no longer support receiving an object into its $classLoader argument in 3.0.', E_USER_DEPRECATED);
+            $this->classLoader = array($classLoader, 'loadClass');
+            $this->isFinder = true;
+        } else {
+            $this->classLoader = $classLoader;
+            $this->isFinder = is_array($classLoader) && method_exists($classLoader[0], 'findFile');
+        }
+
+        if (!isset(self::$caseCheck)) {
+            $file = file_exists(__FILE__) ? __FILE__ : rtrim(realpath('.'), DIRECTORY_SEPARATOR);
+            $i = strrpos($file, DIRECTORY_SEPARATOR);
+            $dir = substr($file, 0, 1 + $i);
+            $file = substr($file, 1 + $i);
+            $test = strtoupper($file) === $file ? strtolower($file) : strtoupper($file);
+            $test = realpath($dir.$test);
+
+            if (false === $test || false === $i) {
+                // filesystem is case sensitive
+                self::$caseCheck = 0;
+            } elseif (substr($test, -strlen($file)) === $file) {
+                // filesystem is case insensitive and realpath() normalizes the case of characters
+                self::$caseCheck = 1;
+            } elseif (false !== stripos(PHP_OS, 'darwin')) {
+                // on MacOSX, HFS+ is case insensitive but realpath() doesn't normalize the case of characters
+                self::$caseCheck = 2;
+            } else {
+                // filesystem case checks failed, fallback to disabling them
+                self::$caseCheck = 0;
+            }
+        }
+    }
+
+    /**
+     * Gets the wrapped class loader.
+     *
+     * @return callable|object A class loader. Since version 2.5, returning an object is @deprecated and support for it will be removed in 3.0
+     */
+    public function getClassLoader()
+    {
+        return $this->wasFinder ? $this->classLoader[0] : $this->classLoader;
+    }
+
+    /**
+     * Wraps all autoloaders.
+     */
+    public static function enable()
+    {
+        // Ensures we don't hit https://bugs.php.net/42098
+        class_exists('Symfony\Component\Debug\ErrorHandler');
+        class_exists('Psr\Log\LogLevel');
+
+        if (!is_array($functions = spl_autoload_functions())) {
+            return;
+        }
+
+        foreach ($functions as $function) {
+            spl_autoload_unregister($function);
+        }
+
+        foreach ($functions as $function) {
+            if (!is_array($function) || !$function[0] instanceof self) {
+                $function = array(new static($function), 'loadClass');
+            }
+
+            spl_autoload_register($function);
+        }
+    }
+
+    /**
+     * Disables the wrapping.
+     */
+    public static function disable()
+    {
+        if (!is_array($functions = spl_autoload_functions())) {
+            return;
+        }
+
+        foreach ($functions as $function) {
+            spl_autoload_unregister($function);
+        }
+
+        foreach ($functions as $function) {
+            if (is_array($function) && $function[0] instanceof self) {
+                $function = $function[0]->getClassLoader();
+            }
+
+            spl_autoload_register($function);
+        }
+    }
+
+    /**
+     * Finds a file by class name.
+     *
+     * @param string $class A class name to resolve to file
+     *
+     * @return string|null
+     *
+     * @deprecated since version 2.5, to be removed in 3.0.
+     */
+    public function findFile($class)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.5 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        if ($this->wasFinder) {
+            return $this->classLoader[0]->findFile($class);
+        }
+    }
+
+    /**
+     * Loads the given class or interface.
+     *
+     * @param string $class The name of the class
+     *
+     * @return bool|null True, if loaded
+     *
+     * @throws \RuntimeException
+     */
+    public function loadClass($class)
+    {
+        ErrorHandler::stackErrors();
+
+        try {
+            if ($this->isFinder) {
+                if ($file = $this->classLoader[0]->findFile($class)) {
+                    require_once $file;
+                }
+            } else {
+                call_user_func($this->classLoader, $class);
+                $file = false;
+            }
+        } catch (\Exception $e) {
+            ErrorHandler::unstackErrors();
+
+            throw $e;
+        } catch (\Throwable $e) {
+            ErrorHandler::unstackErrors();
+
+            throw $e;
+        }
+
+        ErrorHandler::unstackErrors();
+
+        $exists = class_exists($class, false) || interface_exists($class, false) || (function_exists('trait_exists') && trait_exists($class, false));
+
+        if ('\\' === $class[0]) {
+            $class = substr($class, 1);
+        }
+
+        if ($exists) {
+            $refl = new \ReflectionClass($class);
+            $name = $refl->getName();
+
+            if ($name !== $class && 0 === strcasecmp($name, $class)) {
+                throw new \RuntimeException(sprintf('Case mismatch between loaded and declared class names: %s vs %s', $class, $name));
+            }
+
+            if (in_array(strtolower($refl->getShortName()), self::$php7Reserved)) {
+                @trigger_error(sprintf('%s uses a reserved class name (%s) that will break on PHP 7 and higher', $name, $refl->getShortName()), E_USER_DEPRECATED);
+            } elseif (preg_match('#\n \* @deprecated (.*?)\r?\n \*(?: @|/$)#s', $refl->getDocComment(), $notice)) {
+                self::$deprecated[$name] = preg_replace('#\s*\r?\n \* +#', ' ', $notice[1]);
+            } else {
+                if (2 > $len = 1 + (strpos($name, '\\', 1 + strpos($name, '\\')) ?: strpos($name, '_'))) {
+                    $len = 0;
+                    $ns = '';
+                } else {
+                    switch ($ns = substr($name, 0, $len)) {
+                        case 'Symfony\Bridge\\':
+                        case 'Symfony\Bundle\\':
+                        case 'Symfony\Component\\':
+                            $ns = 'Symfony\\';
+                            $len = strlen($ns);
+                            break;
+                    }
+                }
+                $parent = get_parent_class($class);
+
+                if (!$parent || strncmp($ns, $parent, $len)) {
+                    if ($parent && isset(self::$deprecated[$parent]) && strncmp($ns, $parent, $len)) {
+                        @trigger_error(sprintf('The %s class extends %s that is deprecated %s', $name, $parent, self::$deprecated[$parent]), E_USER_DEPRECATED);
+                    }
+
+                    $parentInterfaces = array();
+                    $deprecatedInterfaces = array();
+                    if ($parent) {
+                        foreach (class_implements($parent) as $interface) {
+                            $parentInterfaces[$interface] = 1;
+                        }
+                    }
+
+                    foreach ($refl->getInterfaceNames() as $interface) {
+                        if (isset(self::$deprecated[$interface]) && strncmp($ns, $interface, $len)) {
+                            $deprecatedInterfaces[] = $interface;
+                        }
+                        foreach (class_implements($interface) as $interface) {
+                            $parentInterfaces[$interface] = 1;
+                        }
+                    }
+
+                    foreach ($deprecatedInterfaces as $interface) {
+                        if (!isset($parentInterfaces[$interface])) {
+                            @trigger_error(sprintf('The %s %s %s that is deprecated %s', $name, $refl->isInterface() ? 'interface extends' : 'class implements', $interface, self::$deprecated[$interface]), E_USER_DEPRECATED);
+                        }
+                    }
+                }
+            }
+        }
+
+        if ($file) {
+            if (!$exists) {
+                if (false !== strpos($class, '/')) {
+                    throw new \RuntimeException(sprintf('Trying to autoload a class with an invalid name "%s". Be careful that the namespace separator is "\" in PHP, not "/".', $class));
+                }
+
+                throw new \RuntimeException(sprintf('The autoloader expected class "%s" to be defined in file "%s". The file was found but the class was not in it, the class name or namespace probably has a typo.', $class, $file));
+            }
+            if (self::$caseCheck) {
+                $real = explode('\\', $class.strrchr($file, '.'));
+                $tail = explode(DIRECTORY_SEPARATOR, str_replace('/', DIRECTORY_SEPARATOR, $file));
+
+                $i = count($tail) - 1;
+                $j = count($real) - 1;
+
+                while (isset($tail[$i], $real[$j]) && $tail[$i] === $real[$j]) {
+                    --$i;
+                    --$j;
+                }
+
+                array_splice($tail, 0, $i + 1);
+            }
+            if (self::$caseCheck && $tail) {
+                $tail = DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $tail);
+                $tailLen = strlen($tail);
+                $real = $refl->getFileName();
+
+                if (2 === self::$caseCheck) {
+                    // realpath() on MacOSX doesn't normalize the case of characters
+
+                    $i = 1 + strrpos($real, '/');
+                    $file = substr($real, $i);
+                    $real = substr($real, 0, $i);
+
+                    if (isset(self::$darwinCache[$real])) {
+                        $kDir = $real;
+                    } else {
+                        $kDir = strtolower($real);
+
+                        if (isset(self::$darwinCache[$kDir])) {
+                            $real = self::$darwinCache[$kDir][0];
+                        } else {
+                            $dir = getcwd();
+                            chdir($real);
+                            $real = getcwd().'/';
+                            chdir($dir);
+
+                            $dir = $real;
+                            $k = $kDir;
+                            $i = strlen($dir) - 1;
+                            while (!isset(self::$darwinCache[$k])) {
+                                self::$darwinCache[$k] = array($dir, array());
+                                self::$darwinCache[$dir] = &self::$darwinCache[$k];
+
+                                while ('/' !== $dir[--$i]) {
+                                }
+                                $k = substr($k, 0, ++$i);
+                                $dir = substr($dir, 0, $i--);
+                            }
+                        }
+                    }
+
+                    $dirFiles = self::$darwinCache[$kDir][1];
+
+                    if (isset($dirFiles[$file])) {
+                        $kFile = $file;
+                    } else {
+                        $kFile = strtolower($file);
+
+                        if (!isset($dirFiles[$kFile])) {
+                            foreach (scandir($real, 2) as $f) {
+                                if ('.' !== $f[0]) {
+                                    $dirFiles[$f] = $f;
+                                    if ($f === $file) {
+                                        $kFile = $k = $file;
+                                    } elseif ($f !== $k = strtolower($f)) {
+                                        $dirFiles[$k] = $f;
+                                    }
+                                }
+                            }
+                            self::$darwinCache[$kDir][1] = $dirFiles;
+                        }
+                    }
+
+                    $real .= $dirFiles[$kFile];
+                }
+
+                if (0 === substr_compare($real, $tail, -$tailLen, $tailLen, true)
+                  && 0 !== substr_compare($real, $tail, -$tailLen, $tailLen, false)
+                ) {
+                    throw new \RuntimeException(sprintf('Case mismatch between class and real file names: %s vs %s in %s', substr($tail, -$tailLen + 1), substr($real, -$tailLen + 1), substr($real, 0, -$tailLen + 1)));
+                }
+            }
+
+            return true;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/debug/ErrorHandler.php
@@ -0,0 +1,829 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Debug;
+
+use Psr\Log\LogLevel;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Debug\Exception\ContextErrorException;
+use Symfony\Component\Debug\Exception\FatalErrorException;
+use Symfony\Component\Debug\Exception\FatalThrowableError;
+use Symfony\Component\Debug\Exception\OutOfMemoryException;
+use Symfony\Component\Debug\FatalErrorHandler\UndefinedFunctionFatalErrorHandler;
+use Symfony\Component\Debug\FatalErrorHandler\UndefinedMethodFatalErrorHandler;
+use Symfony\Component\Debug\FatalErrorHandler\ClassNotFoundFatalErrorHandler;
+use Symfony\Component\Debug\FatalErrorHandler\FatalErrorHandlerInterface;
+
+/**
+ * A generic ErrorHandler for the PHP engine.
+ *
+ * Provides five bit fields that control how errors are handled:
+ * - thrownErrors: errors thrown as \ErrorException
+ * - loggedErrors: logged errors, when not @-silenced
+ * - scopedErrors: errors thrown or logged with their local context
+ * - tracedErrors: errors logged with their stack trace, only once for repeated errors
+ * - screamedErrors: never @-silenced errors
+ *
+ * Each error level can be logged by a dedicated PSR-3 logger object.
+ * Screaming only applies to logging.
+ * Throwing takes precedence over logging.
+ * Uncaught exceptions are logged as E_ERROR.
+ * E_DEPRECATED and E_USER_DEPRECATED levels never throw.
+ * E_RECOVERABLE_ERROR and E_USER_ERROR levels always throw.
+ * Non catchable errors that can be detected at shutdown time are logged when the scream bit field allows so.
+ * As errors have a performance cost, repeated errors are all logged, so that the developer
+ * can see them and weight them as more important to fix than others of the same level.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ErrorHandler
+{
+    /**
+     * @deprecated since version 2.6, to be removed in 3.0.
+     */
+    const TYPE_DEPRECATION = -100;
+
+    private $levels = array(
+        E_DEPRECATED => 'Deprecated',
+        E_USER_DEPRECATED => 'User Deprecated',
+        E_NOTICE => 'Notice',
+        E_USER_NOTICE => 'User Notice',
+        E_STRICT => 'Runtime Notice',
+        E_WARNING => 'Warning',
+        E_USER_WARNING => 'User Warning',
+        E_COMPILE_WARNING => 'Compile Warning',
+        E_CORE_WARNING => 'Core Warning',
+        E_USER_ERROR => 'User Error',
+        E_RECOVERABLE_ERROR => 'Catchable Fatal Error',
+        E_COMPILE_ERROR => 'Compile Error',
+        E_PARSE => 'Parse Error',
+        E_ERROR => 'Error',
+        E_CORE_ERROR => 'Core Error',
+    );
+
+    private $loggers = array(
+        E_DEPRECATED => array(null, LogLevel::INFO),
+        E_USER_DEPRECATED => array(null, LogLevel::INFO),
+        E_NOTICE => array(null, LogLevel::WARNING),
+        E_USER_NOTICE => array(null, LogLevel::WARNING),
+        E_STRICT => array(null, LogLevel::WARNING),
+        E_WARNING => array(null, LogLevel::WARNING),
+        E_USER_WARNING => array(null, LogLevel::WARNING),
+        E_COMPILE_WARNING => array(null, LogLevel::WARNING),
+        E_CORE_WARNING => array(null, LogLevel::WARNING),
+        E_USER_ERROR => array(null, LogLevel::CRITICAL),
+        E_RECOVERABLE_ERROR => array(null, LogLevel::CRITICAL),
+        E_COMPILE_ERROR => array(null, LogLevel::CRITICAL),
+        E_PARSE => array(null, LogLevel::CRITICAL),
+        E_ERROR => array(null, LogLevel::CRITICAL),
+        E_CORE_ERROR => array(null, LogLevel::CRITICAL),
+    );
+
+    private $thrownErrors = 0x1FFF; // E_ALL - E_DEPRECATED - E_USER_DEPRECATED
+    private $scopedErrors = 0x1FFF; // E_ALL - E_DEPRECATED - E_USER_DEPRECATED
+    private $tracedErrors = 0x77FB; // E_ALL - E_STRICT - E_PARSE
+    private $screamedErrors = 0x55; // E_ERROR + E_CORE_ERROR + E_COMPILE_ERROR + E_PARSE
+    private $loggedErrors = 0;
+
+    private $loggedTraces = array();
+    private $isRecursive = 0;
+    private $isRoot = false;
+    private $exceptionHandler;
+    private $bootstrappingLogger;
+
+    private static $reservedMemory;
+    private static $stackedErrors = array();
+    private static $stackedErrorLevels = array();
+    private static $toStringException = null;
+
+    /**
+     * Same init value as thrownErrors.
+     *
+     * @deprecated since version 2.6, to be removed in 3.0.
+     */
+    private $displayErrors = 0x1FFF;
+
+    /**
+     * Registers the error handler.
+     *
+     * @param self|null|int $handler The handler to register, or @deprecated (since version 2.6, to be removed in 3.0) bit field of thrown levels
+     * @param bool          $replace Whether to replace or not any existing handler
+     *
+     * @return self The registered error handler
+     */
+    public static function register($handler = null, $replace = true)
+    {
+        if (null === self::$reservedMemory) {
+            self::$reservedMemory = str_repeat('x', 10240);
+            register_shutdown_function(__CLASS__.'::handleFatalError');
+        }
+
+        $levels = -1;
+
+        if ($handlerIsNew = !$handler instanceof self) {
+            // @deprecated polymorphism, to be removed in 3.0
+            if (null !== $handler) {
+                $levels = $replace ? $handler : 0;
+                $replace = true;
+            }
+            $handler = new static();
+        }
+
+        if (null === $prev = set_error_handler(array($handler, 'handleError'))) {
+            restore_error_handler();
+            // Specifying the error types earlier would expose us to https://bugs.php.net/63206
+            set_error_handler(array($handler, 'handleError'), $handler->thrownErrors | $handler->loggedErrors);
+            $handler->isRoot = true;
+        }
+
+        if ($handlerIsNew && is_array($prev) && $prev[0] instanceof self) {
+            $handler = $prev[0];
+            $replace = false;
+        }
+        if ($replace || !$prev) {
+            $handler->setExceptionHandler(set_exception_handler(array($handler, 'handleException')));
+        } else {
+            restore_error_handler();
+        }
+
+        $handler->throwAt($levels & $handler->thrownErrors, true);
+
+        return $handler;
+    }
+
+    public function __construct(BufferingLogger $bootstrappingLogger = null)
+    {
+        if ($bootstrappingLogger) {
+            $this->bootstrappingLogger = $bootstrappingLogger;
+            $this->setDefaultLogger($bootstrappingLogger);
+        }
+    }
+
+    /**
+     * Sets a logger to non assigned errors levels.
+     *
+     * @param LoggerInterface $logger  A PSR-3 logger to put as default for the given levels
+     * @param array|int       $levels  An array map of E_* to LogLevel::* or an integer bit field of E_* constants
+     * @param bool            $replace Whether to replace or not any existing logger
+     */
+    public function setDefaultLogger(LoggerInterface $logger, $levels = null, $replace = false)
+    {
+        $loggers = array();
+
+        if (is_array($levels)) {
+            foreach ($levels as $type => $logLevel) {
+                if (empty($this->loggers[$type][0]) || $replace || $this->loggers[$type][0] === $this->bootstrappingLogger) {
+                    $loggers[$type] = array($logger, $logLevel);
+                }
+            }
+        } else {
+            if (null === $levels) {
+                $levels = E_ALL | E_STRICT;
+            }
+            foreach ($this->loggers as $type => $log) {
+                if (($type & $levels) && (empty($log[0]) || $replace || $log[0] === $this->bootstrappingLogger)) {
+                    $log[0] = $logger;
+                    $loggers[$type] = $log;
+                }
+            }
+        }
+
+        $this->setLoggers($loggers);
+    }
+
+    /**
+     * Sets a logger for each error level.
+     *
+     * @param array $loggers Error levels to [LoggerInterface|null, LogLevel::*] map
+     *
+     * @return array The previous map
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function setLoggers(array $loggers)
+    {
+        $prevLogged = $this->loggedErrors;
+        $prev = $this->loggers;
+        $flush = array();
+
+        foreach ($loggers as $type => $log) {
+            if (!isset($prev[$type])) {
+                throw new \InvalidArgumentException('Unknown error type: '.$type);
+            }
+            if (!is_array($log)) {
+                $log = array($log);
+            } elseif (!array_key_exists(0, $log)) {
+                throw new \InvalidArgumentException('No logger provided');
+            }
+            if (null === $log[0]) {
+                $this->loggedErrors &= ~$type;
+            } elseif ($log[0] instanceof LoggerInterface) {
+                $this->loggedErrors |= $type;
+            } else {
+                throw new \InvalidArgumentException('Invalid logger provided');
+            }
+            $this->loggers[$type] = $log + $prev[$type];
+
+            if ($this->bootstrappingLogger && $prev[$type][0] === $this->bootstrappingLogger) {
+                $flush[$type] = $type;
+            }
+        }
+        $this->reRegister($prevLogged | $this->thrownErrors);
+
+        if ($flush) {
+            foreach ($this->bootstrappingLogger->cleanLogs() as $log) {
+                $type = $log[2]['type'];
+                if (!isset($flush[$type])) {
+                    $this->bootstrappingLogger->log($log[0], $log[1], $log[2]);
+                } elseif ($this->loggers[$type][0]) {
+                    $this->loggers[$type][0]->log($this->loggers[$type][1], $log[1], $log[2]);
+                }
+            }
+        }
+
+        return $prev;
+    }
+
+    /**
+     * Sets a user exception handler.
+     *
+     * @param callable $handler A handler that will be called on Exception
+     *
+     * @return callable|null The previous exception handler
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function setExceptionHandler($handler)
+    {
+        if (null !== $handler && !is_callable($handler)) {
+            throw new \LogicException('The exception handler must be a valid PHP callable.');
+        }
+        $prev = $this->exceptionHandler;
+        $this->exceptionHandler = $handler;
+
+        return $prev;
+    }
+
+    /**
+     * Sets the PHP error levels that throw an exception when a PHP error occurs.
+     *
+     * @param int  $levels  A bit field of E_* constants for thrown errors
+     * @param bool $replace Replace or amend the previous value
+     *
+     * @return int The previous value
+     */
+    public function throwAt($levels, $replace = false)
+    {
+        $prev = $this->thrownErrors;
+        $this->thrownErrors = ($levels | E_RECOVERABLE_ERROR | E_USER_ERROR) & ~E_USER_DEPRECATED & ~E_DEPRECATED;
+        if (!$replace) {
+            $this->thrownErrors |= $prev;
+        }
+        $this->reRegister($prev | $this->loggedErrors);
+
+        // $this->displayErrors is @deprecated since version 2.6
+        $this->displayErrors = $this->thrownErrors;
+
+        return $prev;
+    }
+
+    /**
+     * Sets the PHP error levels for which local variables are preserved.
+     *
+     * @param int  $levels  A bit field of E_* constants for scoped errors
+     * @param bool $replace Replace or amend the previous value
+     *
+     * @return int The previous value
+     */
+    public function scopeAt($levels, $replace = false)
+    {
+        $prev = $this->scopedErrors;
+        $this->scopedErrors = (int) $levels;
+        if (!$replace) {
+            $this->scopedErrors |= $prev;
+        }
+
+        return $prev;
+    }
+
+    /**
+     * Sets the PHP error levels for which the stack trace is preserved.
+     *
+     * @param int  $levels  A bit field of E_* constants for traced errors
+     * @param bool $replace Replace or amend the previous value
+     *
+     * @return int The previous value
+     */
+    public function traceAt($levels, $replace = false)
+    {
+        $prev = $this->tracedErrors;
+        $this->tracedErrors = (int) $levels;
+        if (!$replace) {
+            $this->tracedErrors |= $prev;
+        }
+
+        return $prev;
+    }
+
+    /**
+     * Sets the error levels where the @-operator is ignored.
+     *
+     * @param int  $levels  A bit field of E_* constants for screamed errors
+     * @param bool $replace Replace or amend the previous value
+     *
+     * @return int The previous value
+     */
+    public function screamAt($levels, $replace = false)
+    {
+        $prev = $this->screamedErrors;
+        $this->screamedErrors = (int) $levels;
+        if (!$replace) {
+            $this->screamedErrors |= $prev;
+        }
+
+        return $prev;
+    }
+
+    /**
+     * Re-registers as a PHP error handler if levels changed.
+     */
+    private function reRegister($prev)
+    {
+        if ($prev !== $this->thrownErrors | $this->loggedErrors) {
+            $handler = set_error_handler('var_dump');
+            $handler = is_array($handler) ? $handler[0] : null;
+            restore_error_handler();
+            if ($handler === $this) {
+                restore_error_handler();
+                if ($this->isRoot) {
+                    set_error_handler(array($this, 'handleError'), $this->thrownErrors | $this->loggedErrors);
+                } else {
+                    set_error_handler(array($this, 'handleError'));
+                }
+            }
+        }
+    }
+
+    /**
+     * Handles errors by filtering then logging them according to the configured bit fields.
+     *
+     * @param int    $type      One of the E_* constants
+     * @param string $message
+     * @param string $file
+     * @param int    $line
+     * @param array  $context
+     * @param array  $backtrace
+     *
+     * @return bool Returns false when no handling happens so that the PHP engine can handle the error itself
+     *
+     * @throws \ErrorException When $this->thrownErrors requests so
+     *
+     * @internal
+     */
+    public function handleError($type, $message, $file, $line, array $context, array $backtrace = null)
+    {
+        $level = error_reporting() | E_RECOVERABLE_ERROR | E_USER_ERROR | E_DEPRECATED | E_USER_DEPRECATED;
+        $log = $this->loggedErrors & $type;
+        $throw = $this->thrownErrors & $type & $level;
+        $type &= $level | $this->screamedErrors;
+
+        if (!$type || (!$log && !$throw)) {
+            return $type && $log;
+        }
+
+        if (isset($context['GLOBALS']) && ($this->scopedErrors & $type)) {
+            $e = $context;                  // Whatever the signature of the method,
+            unset($e['GLOBALS'], $context); // $context is always a reference in 5.3
+            $context = $e;
+        }
+
+        if (null !== $backtrace && $type & E_ERROR) {
+            // E_ERROR fatal errors are triggered on HHVM when
+            // hhvm.error_handling.call_user_handler_on_fatals=1
+            // which is the way to get their backtrace.
+            $this->handleFatalError(compact('type', 'message', 'file', 'line', 'backtrace'));
+
+            return true;
+        }
+
+        if ($throw) {
+            if (null !== self::$toStringException) {
+                $throw = self::$toStringException;
+                self::$toStringException = null;
+            } elseif (($this->scopedErrors & $type) && class_exists('Symfony\Component\Debug\Exception\ContextErrorException')) {
+                // Checking for class existence is a work around for https://bugs.php.net/42098
+                $throw = new ContextErrorException($this->levels[$type].': '.$message, 0, $type, $file, $line, $context);
+            } else {
+                $throw = new \ErrorException($this->levels[$type].': '.$message, 0, $type, $file, $line);
+            }
+
+            if (PHP_VERSION_ID <= 50407 && (PHP_VERSION_ID >= 50400 || PHP_VERSION_ID <= 50317)) {
+                // Exceptions thrown from error handlers are sometimes not caught by the exception
+                // handler and shutdown handlers are bypassed before 5.4.8/5.3.18.
+                // We temporarily re-enable display_errors to prevent any blank page related to this bug.
+
+                $throw->errorHandlerCanary = new ErrorHandlerCanary();
+            }
+
+            if (E_USER_ERROR & $type) {
+                $backtrace = $backtrace ?: $throw->getTrace();
+
+                for ($i = 1; isset($backtrace[$i]); ++$i) {
+                    if (isset($backtrace[$i]['function'], $backtrace[$i]['type'], $backtrace[$i - 1]['function'])
+                        && '__toString' === $backtrace[$i]['function']
+                        && '->' === $backtrace[$i]['type']
+                        && !isset($backtrace[$i - 1]['class'])
+                        && ('trigger_error' === $backtrace[$i - 1]['function'] || 'user_error' === $backtrace[$i - 1]['function'])
+                    ) {
+                        // Here, we know trigger_error() has been called from __toString().
+                        // HHVM is fine with throwing from __toString() but PHP triggers a fatal error instead.
+                        // A small convention allows working around the limitation:
+                        // given a caught $e exception in __toString(), quitting the method with
+                        // `return trigger_error($e, E_USER_ERROR);` allows this error handler
+                        // to make $e get through the __toString() barrier.
+
+                        foreach ($context as $e) {
+                            if (($e instanceof \Exception || $e instanceof \Throwable) && $e->__toString() === $message) {
+                                if (1 === $i) {
+                                    // On HHVM
+                                    $throw = $e;
+                                    break;
+                                }
+                                self::$toStringException = $e;
+
+                                return true;
+                            }
+                        }
+
+                        if (1 < $i) {
+                            // On PHP (not on HHVM), display the original error message instead of the default one.
+                            $this->handleException($throw);
+
+                            // Stop the process by giving back the error to the native handler.
+                            return false;
+                        }
+                    }
+                }
+            }
+
+            throw $throw;
+        }
+
+        // For duplicated errors, log the trace only once
+        $e = md5("{$type}/{$line}/{$file}\x00{$message}", true);
+        $trace = true;
+
+        if (!($this->tracedErrors & $type) || isset($this->loggedTraces[$e])) {
+            $trace = false;
+        } else {
+            $this->loggedTraces[$e] = 1;
+        }
+
+        $e = compact('type', 'file', 'line', 'level');
+
+        if ($type & $level) {
+            if ($this->scopedErrors & $type) {
+                $e['scope_vars'] = $context;
+                if ($trace) {
+                    $e['stack'] = $backtrace ?: debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT);
+                }
+            } elseif ($trace) {
+                if (null === $backtrace) {
+                    $e['stack'] = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
+                } else {
+                    foreach ($backtrace as &$frame) {
+                        unset($frame['args'], $frame);
+                    }
+                    $e['stack'] = $backtrace;
+                }
+            }
+        }
+
+        if ($this->isRecursive) {
+            $log = 0;
+        } elseif (self::$stackedErrorLevels) {
+            self::$stackedErrors[] = array($this->loggers[$type][0], ($type & $level) ? $this->loggers[$type][1] : LogLevel::DEBUG, $message, $e);
+        } else {
+            try {
+                $this->isRecursive = true;
+                $this->loggers[$type][0]->log(($type & $level) ? $this->loggers[$type][1] : LogLevel::DEBUG, $message, $e);
+                $this->isRecursive = false;
+            } catch (\Exception $e) {
+                $this->isRecursive = false;
+
+                throw $e;
+            } catch (\Throwable $e) {
+                $this->isRecursive = false;
+
+                throw $e;
+            }
+        }
+
+        return $type && $log;
+    }
+
+    /**
+     * Handles an exception by logging then forwarding it to another handler.
+     *
+     * @param \Exception|\Throwable $exception An exception to handle
+     * @param array                 $error     An array as returned by error_get_last()
+     *
+     * @internal
+     */
+    public function handleException($exception, array $error = null)
+    {
+        if (!$exception instanceof \Exception) {
+            $exception = new FatalThrowableError($exception);
+        }
+        $type = $exception instanceof FatalErrorException ? $exception->getSeverity() : E_ERROR;
+
+        if (($this->loggedErrors & $type) || $exception instanceof FatalThrowableError) {
+            $e = array(
+                'type' => $type,
+                'file' => $exception->getFile(),
+                'line' => $exception->getLine(),
+                'level' => error_reporting(),
+                'stack' => $exception->getTrace(),
+            );
+            if ($exception instanceof FatalErrorException) {
+                if ($exception instanceof FatalThrowableError) {
+                    $error = array(
+                        'type' => $type,
+                        'message' => $message = $exception->getMessage(),
+                        'file' => $e['file'],
+                        'line' => $e['line'],
+                    );
+                } else {
+                    $message = 'Fatal '.$exception->getMessage();
+                }
+            } elseif ($exception instanceof \ErrorException) {
+                $message = 'Uncaught '.$exception->getMessage();
+                if ($exception instanceof ContextErrorException) {
+                    $e['context'] = $exception->getContext();
+                }
+            } else {
+                $message = 'Uncaught Exception: '.$exception->getMessage();
+            }
+        }
+        if ($this->loggedErrors & $type) {
+            $this->loggers[$type][0]->log($this->loggers[$type][1], $message, $e);
+        }
+        if ($exception instanceof FatalErrorException && !$exception instanceof OutOfMemoryException && $error) {
+            foreach ($this->getFatalErrorHandlers() as $handler) {
+                if ($e = $handler->handleError($error, $exception)) {
+                    $exception = $e;
+                    break;
+                }
+            }
+        }
+        if (empty($this->exceptionHandler)) {
+            throw $exception; // Give back $exception to the native handler
+        }
+        try {
+            call_user_func($this->exceptionHandler, $exception);
+        } catch (\Exception $handlerException) {
+        } catch (\Throwable $handlerException) {
+        }
+        if (isset($handlerException)) {
+            $this->exceptionHandler = null;
+            $this->handleException($handlerException);
+        }
+    }
+
+    /**
+     * Shutdown registered function for handling PHP fatal errors.
+     *
+     * @param array $error An array as returned by error_get_last()
+     *
+     * @internal
+     */
+    public static function handleFatalError(array $error = null)
+    {
+        if (null === self::$reservedMemory) {
+            return;
+        }
+
+        self::$reservedMemory = null;
+
+        $handler = set_error_handler('var_dump');
+        $handler = is_array($handler) ? $handler[0] : null;
+        restore_error_handler();
+
+        if (!$handler instanceof self) {
+            return;
+        }
+
+        if (null === $error) {
+            $error = error_get_last();
+        }
+
+        try {
+            while (self::$stackedErrorLevels) {
+                static::unstackErrors();
+            }
+        } catch (\Exception $exception) {
+            // Handled below
+        } catch (\Throwable $exception) {
+            // Handled below
+        }
+
+        if ($error && $error['type'] &= E_PARSE | E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR) {
+            // Let's not throw anymore but keep logging
+            $handler->throwAt(0, true);
+            $trace = isset($error['backtrace']) ? $error['backtrace'] : null;
+
+            if (0 === strpos($error['message'], 'Allowed memory') || 0 === strpos($error['message'], 'Out of memory')) {
+                $exception = new OutOfMemoryException($handler->levels[$error['type']].': '.$error['message'], 0, $error['type'], $error['file'], $error['line'], 2, false, $trace);
+            } else {
+                $exception = new FatalErrorException($handler->levels[$error['type']].': '.$error['message'], 0, $error['type'], $error['file'], $error['line'], 2, true, $trace);
+            }
+        } elseif (!isset($exception)) {
+            return;
+        }
+
+        try {
+            $handler->handleException($exception, $error);
+        } catch (FatalErrorException $e) {
+            // Ignore this re-throw
+        }
+    }
+
+    /**
+     * Configures the error handler for delayed handling.
+     * Ensures also that non-catchable fatal errors are never silenced.
+     *
+     * As shown by http://bugs.php.net/42098 and http://bugs.php.net/60724
+     * PHP has a compile stage where it behaves unusually. To workaround it,
+     * we plug an error handler that only stacks errors for later.
+     *
+     * The most important feature of this is to prevent
+     * autoloading until unstackErrors() is called.
+     */
+    public static function stackErrors()
+    {
+        self::$stackedErrorLevels[] = error_reporting(error_reporting() | E_PARSE | E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR);
+    }
+
+    /**
+     * Unstacks stacked errors and forwards to the logger.
+     */
+    public static function unstackErrors()
+    {
+        $level = array_pop(self::$stackedErrorLevels);
+
+        if (null !== $level) {
+            $e = error_reporting($level);
+            if ($e !== ($level | E_PARSE | E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR)) {
+                // If the user changed the error level, do not overwrite it
+                error_reporting($e);
+            }
+        }
+
+        if (empty(self::$stackedErrorLevels)) {
+            $errors = self::$stackedErrors;
+            self::$stackedErrors = array();
+
+            foreach ($errors as $e) {
+                $e[0]->log($e[1], $e[2], $e[3]);
+            }
+        }
+    }
+
+    /**
+     * Gets the fatal error handlers.
+     *
+     * Override this method if you want to define more fatal error handlers.
+     *
+     * @return FatalErrorHandlerInterface[] An array of FatalErrorHandlerInterface
+     */
+    protected function getFatalErrorHandlers()
+    {
+        return array(
+            new UndefinedFunctionFatalErrorHandler(),
+            new UndefinedMethodFatalErrorHandler(),
+            new ClassNotFoundFatalErrorHandler(),
+        );
+    }
+
+    /**
+     * Sets the level at which the conversion to Exception is done.
+     *
+     * @param int|null $level The level (null to use the error_reporting() value and 0 to disable)
+     *
+     * @deprecated since version 2.6, to be removed in 3.0. Use throwAt() instead.
+     */
+    public function setLevel($level)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the throwAt() method instead.', E_USER_DEPRECATED);
+
+        $level = null === $level ? error_reporting() : $level;
+        $this->throwAt($level, true);
+    }
+
+    /**
+     * Sets the display_errors flag value.
+     *
+     * @param int $displayErrors The display_errors flag value
+     *
+     * @deprecated since version 2.6, to be removed in 3.0. Use throwAt() instead.
+     */
+    public function setDisplayErrors($displayErrors)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the throwAt() method instead.', E_USER_DEPRECATED);
+
+        if ($displayErrors) {
+            $this->throwAt($this->displayErrors, true);
+        } else {
+            $displayErrors = $this->displayErrors;
+            $this->throwAt(0, true);
+            $this->displayErrors = $displayErrors;
+        }
+    }
+
+    /**
+     * Sets a logger for the given channel.
+     *
+     * @param LoggerInterface $logger  A logger interface
+     * @param string          $channel The channel associated with the logger (deprecation, emergency or scream)
+     *
+     * @deprecated since version 2.6, to be removed in 3.0. Use setLoggers() or setDefaultLogger() instead.
+     */
+    public static function setLogger(LoggerInterface $logger, $channel = 'deprecation')
+    {
+        @trigger_error('The '.__METHOD__.' static method is deprecated since version 2.6 and will be removed in 3.0. Use the setLoggers() or setDefaultLogger() methods instead.', E_USER_DEPRECATED);
+
+        $handler = set_error_handler('var_dump');
+        $handler = is_array($handler) ? $handler[0] : null;
+        restore_error_handler();
+        if (!$handler instanceof self) {
+            return;
+        }
+        if ('deprecation' === $channel) {
+            $handler->setDefaultLogger($logger, E_DEPRECATED | E_USER_DEPRECATED, true);
+            $handler->screamAt(E_DEPRECATED | E_USER_DEPRECATED);
+        } elseif ('scream' === $channel) {
+            $handler->setDefaultLogger($logger, E_ALL | E_STRICT, false);
+            $handler->screamAt(E_ALL | E_STRICT);
+        } elseif ('emergency' === $channel) {
+            $handler->setDefaultLogger($logger, E_PARSE | E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR, true);
+            $handler->screamAt(E_PARSE | E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR);
+        }
+    }
+
+    /**
+     * @deprecated since version 2.6, to be removed in 3.0. Use handleError() instead.
+     */
+    public function handle($level, $message, $file = 'unknown', $line = 0, $context = array())
+    {
+        $this->handleError(E_USER_DEPRECATED, 'The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the handleError() method instead.', __FILE__, __LINE__, array());
+
+        return $this->handleError($level, $message, $file, $line, (array) $context);
+    }
+
+    /**
+     * Handles PHP fatal errors.
+     *
+     * @deprecated since version 2.6, to be removed in 3.0. Use handleFatalError() instead.
+     */
+    public function handleFatal()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the handleFatalError() method instead.', E_USER_DEPRECATED);
+
+        static::handleFatalError();
+    }
+}
+
+/**
+ * Private class used to work around https://bugs.php.net/54275.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+class ErrorHandlerCanary
+{
+    private static $displayErrors = null;
+
+    public function __construct()
+    {
+        if (null === self::$displayErrors) {
+            self::$displayErrors = ini_set('display_errors', 1);
+        }
+    }
+
+    public function __destruct()
+    {
+        if (null !== self::$displayErrors) {
+            ini_set('display_errors', self::$displayErrors);
+            self::$displayErrors = null;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/debug/Exception/ClassNotFoundException.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Debug\Exception;
+
+/**
+ * Class (or Trait or Interface) Not Found Exception.
+ *
+ * @author Konstanton Myakshin <koc-dp@yandex.ru>
+ */
+class ClassNotFoundException extends FatalErrorException
+{
+    public function __construct($message, \ErrorException $previous)
+    {
+        parent::__construct(
+            $message,
+            $previous->getCode(),
+            $previous->getSeverity(),
+            $previous->getFile(),
+            $previous->getLine(),
+            $previous->getPrevious()
+        );
+        $this->setTrace($previous->getTrace());
+    }
+}
--- /dev/null
+++ b/vendor/symfony/debug/Exception/ContextErrorException.php
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Debug\Exception;
+
+/**
+ * Error Exception with Variable Context.
+ *
+ * @author Christian Sciberras <uuf6429@gmail.com>
+ */
+class ContextErrorException extends \ErrorException
+{
+    private $context = array();
+
+    public function __construct($message, $code, $severity, $filename, $lineno, $context = array())
+    {
+        parent::__construct($message, $code, $severity, $filename, $lineno);
+        $this->context = $context;
+    }
+
+    /**
+     * @return array Array of variables that existed when the exception occurred
+     */
+    public function getContext()
+    {
+        return $this->context;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/debug/Exception/DummyException.php
@@ -0,0 +1,23 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Debug\Exception;
+
+@trigger_error('The '.__NAMESPACE__.'\DummyException class is deprecated since version 2.5 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 2.5, to be removed in 3.0.
+ */
+class DummyException extends \ErrorException
+{
+}
--- /dev/null
+++ b/vendor/symfony/debug/Exception/FatalErrorException.php
@@ -0,0 +1,99 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * Fatal Error Exception.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Konstanton Myakshin <koc-dp@yandex.ru>
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @deprecated Deprecated in 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
+ */
+class FatalErrorException extends \ErrorException
+{
+}
+
+namespace Symfony\Component\Debug\Exception;
+
+use Symfony\Component\HttpKernel\Exception\FatalErrorException as LegacyFatalErrorException;
+
+/**
+ * Fatal Error Exception.
+ *
+ * @author Konstanton Myakshin <koc-dp@yandex.ru>
+ */
+class FatalErrorException extends LegacyFatalErrorException
+{
+    public function __construct($message, $code, $severity, $filename, $lineno, $traceOffset = null, $traceArgs = true, array $trace = null)
+    {
+        parent::__construct($message, $code, $severity, $filename, $lineno);
+
+        if (null !== $trace) {
+            if (!$traceArgs) {
+                foreach ($trace as &$frame) {
+                    unset($frame['args'], $frame['this'], $frame);
+                }
+            }
+
+            $this->setTrace($trace);
+        } elseif (null !== $traceOffset) {
+            if (function_exists('xdebug_get_function_stack')) {
+                $trace = xdebug_get_function_stack();
+                if (0 < $traceOffset) {
+                    array_splice($trace, -$traceOffset);
+                }
+
+                foreach ($trace as &$frame) {
+                    if (!isset($frame['type'])) {
+                        // XDebug pre 2.1.1 doesn't currently set the call type key http://bugs.xdebug.org/view.php?id=695
+                        if (isset($frame['class'])) {
+                            $frame['type'] = '::';
+                        }
+                    } elseif ('dynamic' === $frame['type']) {
+                        $frame['type'] = '->';
+                    } elseif ('static' === $frame['type']) {
+                        $frame['type'] = '::';
+                    }
+
+                    // XDebug also has a different name for the parameters array
+                    if (!$traceArgs) {
+                        unset($frame['params'], $frame['args']);
+                    } elseif (isset($frame['params']) && !isset($frame['args'])) {
+                        $frame['args'] = $frame['params'];
+                        unset($frame['params']);
+                    }
+                }
+
+                unset($frame);
+                $trace = array_reverse($trace);
+            } elseif (function_exists('symfony_debug_backtrace')) {
+                $trace = symfony_debug_backtrace();
+                if (0 < $traceOffset) {
+                    array_splice($trace, 0, $traceOffset);
+                }
+            } else {
+                $trace = array();
+            }
+
+            $this->setTrace($trace);
+        }
+    }
+
+    protected function setTrace($trace)
+    {
+        $traceReflector = new \ReflectionProperty('Exception', 'trace');
+        $traceReflector->setAccessible(true);
+        $traceReflector->setValue($this, $trace);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/debug/Exception/FatalThrowableError.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Debug\Exception;
+
+/**
+ * Fatal Throwable Error.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class FatalThrowableError extends FatalErrorException
+{
+    public function __construct(\Throwable $e)
+    {
+        if ($e instanceof \ParseError) {
+            $message = 'Parse error: '.$e->getMessage();
+            $severity = E_PARSE;
+        } elseif ($e instanceof \TypeError) {
+            $message = 'Type error: '.$e->getMessage();
+            $severity = E_RECOVERABLE_ERROR;
+        } else {
+            $message = $e->getMessage();
+            $severity = E_ERROR;
+        }
+
+        \ErrorException::__construct(
+            $message,
+            $e->getCode(),
+            $severity,
+            $e->getFile(),
+            $e->getLine()
+        );
+
+        $this->setTrace($e->getTrace());
+    }
+}
--- /dev/null
+++ b/vendor/symfony/debug/Exception/FlattenException.php
@@ -0,0 +1,297 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+use Symfony\Component\Debug\Exception\FlattenException as DebugFlattenException;
+
+/**
+ * FlattenException wraps a PHP Exception to be able to serialize it.
+ *
+ * Basically, this class removes all objects from the trace.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated Deprecated in 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
+ */
+class FlattenException
+{
+    private $handler;
+
+    public static function __callStatic($method, $args)
+    {
+        if (!method_exists('Symfony\Component\Debug\Exception\FlattenException', $method)) {
+            throw new \BadMethodCallException(sprintf('Call to undefined method %s::%s()', get_called_class(), $method));
+        }
+
+        return call_user_func_array(array('Symfony\Component\Debug\Exception\FlattenException', $method), $args);
+    }
+
+    public function __call($method, $args)
+    {
+        if (!isset($this->handler)) {
+            $this->handler = new DebugFlattenException();
+        }
+
+        if (!method_exists($this->handler, $method)) {
+            throw new \BadMethodCallException(sprintf('Call to undefined method %s::%s()', get_class($this), $method));
+        }
+
+        return call_user_func_array(array($this->handler, $method), $args);
+    }
+}
+
+namespace Symfony\Component\Debug\Exception;
+
+use Symfony\Component\HttpKernel\Exception\FlattenException as LegacyFlattenException;
+use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
+
+/**
+ * FlattenException wraps a PHP Exception to be able to serialize it.
+ *
+ * Basically, this class removes all objects from the trace.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class FlattenException extends LegacyFlattenException
+{
+    private $message;
+    private $code;
+    private $previous;
+    private $trace;
+    private $class;
+    private $statusCode;
+    private $headers;
+    private $file;
+    private $line;
+
+    public static function create(\Exception $exception, $statusCode = null, array $headers = array())
+    {
+        $e = new static();
+        $e->setMessage($exception->getMessage());
+        $e->setCode($exception->getCode());
+
+        if ($exception instanceof HttpExceptionInterface) {
+            $statusCode = $exception->getStatusCode();
+            $headers = array_merge($headers, $exception->getHeaders());
+        }
+
+        if (null === $statusCode) {
+            $statusCode = 500;
+        }
+
+        $e->setStatusCode($statusCode);
+        $e->setHeaders($headers);
+        $e->setTraceFromException($exception);
+        $e->setClass(get_class($exception));
+        $e->setFile($exception->getFile());
+        $e->setLine($exception->getLine());
+
+        $previous = $exception->getPrevious();
+
+        if ($previous instanceof \Exception) {
+            $e->setPrevious(static::create($previous));
+        } elseif ($previous instanceof \Throwable) {
+            $e->setPrevious(static::create(new FatalThrowableError($previous)));
+        }
+
+        return $e;
+    }
+
+    public function toArray()
+    {
+        $exceptions = array();
+        foreach (array_merge(array($this), $this->getAllPrevious()) as $exception) {
+            $exceptions[] = array(
+                'message' => $exception->getMessage(),
+                'class' => $exception->getClass(),
+                'trace' => $exception->getTrace(),
+            );
+        }
+
+        return $exceptions;
+    }
+
+    public function getStatusCode()
+    {
+        return $this->statusCode;
+    }
+
+    public function setStatusCode($code)
+    {
+        $this->statusCode = $code;
+    }
+
+    public function getHeaders()
+    {
+        return $this->headers;
+    }
+
+    public function setHeaders(array $headers)
+    {
+        $this->headers = $headers;
+    }
+
+    public function getClass()
+    {
+        return $this->class;
+    }
+
+    public function setClass($class)
+    {
+        $this->class = $class;
+    }
+
+    public function getFile()
+    {
+        return $this->file;
+    }
+
+    public function setFile($file)
+    {
+        $this->file = $file;
+    }
+
+    public function getLine()
+    {
+        return $this->line;
+    }
+
+    public function setLine($line)
+    {
+        $this->line = $line;
+    }
+
+    public function getMessage()
+    {
+        return $this->message;
+    }
+
+    public function setMessage($message)
+    {
+        $this->message = $message;
+    }
+
+    public function getCode()
+    {
+        return $this->code;
+    }
+
+    public function setCode($code)
+    {
+        $this->code = $code;
+    }
+
+    public function getPrevious()
+    {
+        return $this->previous;
+    }
+
+    public function setPrevious(FlattenException $previous)
+    {
+        $this->previous = $previous;
+    }
+
+    public function getAllPrevious()
+    {
+        $exceptions = array();
+        $e = $this;
+        while ($e = $e->getPrevious()) {
+            $exceptions[] = $e;
+        }
+
+        return $exceptions;
+    }
+
+    public function getTrace()
+    {
+        return $this->trace;
+    }
+
+    public function setTraceFromException(\Exception $exception)
+    {
+        $this->setTrace($exception->getTrace(), $exception->getFile(), $exception->getLine());
+    }
+
+    public function setTrace($trace, $file, $line)
+    {
+        $this->trace = array();
+        $this->trace[] = array(
+            'namespace' => '',
+            'short_class' => '',
+            'class' => '',
+            'type' => '',
+            'function' => '',
+            'file' => $file,
+            'line' => $line,
+            'args' => array(),
+        );
+        foreach ($trace as $entry) {
+            $class = '';
+            $namespace = '';
+            if (isset($entry['class'])) {
+                $parts = explode('\\', $entry['class']);
+                $class = array_pop($parts);
+                $namespace = implode('\\', $parts);
+            }
+
+            $this->trace[] = array(
+                'namespace' => $namespace,
+                'short_class' => $class,
+                'class' => isset($entry['class']) ? $entry['class'] : '',
+                'type' => isset($entry['type']) ? $entry['type'] : '',
+                'function' => isset($entry['function']) ? $entry['function'] : null,
+                'file' => isset($entry['file']) ? $entry['file'] : null,
+                'line' => isset($entry['line']) ? $entry['line'] : null,
+                'args' => isset($entry['args']) ? $this->flattenArgs($entry['args']) : array(),
+            );
+        }
+    }
+
+    private function flattenArgs($args, $level = 0, &$count = 0)
+    {
+        $result = array();
+        foreach ($args as $key => $value) {
+            if (++$count > 1e4) {
+                return array('array', '*SKIPPED over 10000 entries*');
+            }
+            if ($value instanceof \__PHP_Incomplete_Class) {
+                // is_object() returns false on PHP<=7.1
+                $result[$key] = array('incomplete-object', $this->getClassNameFromIncomplete($value));
+            } elseif (is_object($value)) {
+                $result[$key] = array('object', get_class($value));
+            } elseif (is_array($value)) {
+                if ($level > 10) {
+                    $result[$key] = array('array', '*DEEP NESTED ARRAY*');
+                } else {
+                    $result[$key] = array('array', $this->flattenArgs($value, $level + 1, $count));
+                }
+            } elseif (null === $value) {
+                $result[$key] = array('null', null);
+            } elseif (is_bool($value)) {
+                $result[$key] = array('boolean', $value);
+            } elseif (is_resource($value)) {
+                $result[$key] = array('resource', get_resource_type($value));
+            } else {
+                $result[$key] = array('string', (string) $value);
+            }
+        }
+
+        return $result;
+    }
+
+    private function getClassNameFromIncomplete(\__PHP_Incomplete_Class $value)
+    {
+        $array = new \ArrayObject($value);
+
+        return $array['__PHP_Incomplete_Class_Name'];
+    }
+}
--- /dev/null
+++ b/vendor/symfony/debug/Exception/OutOfMemoryException.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Debug\Exception;
+
+/**
+ * Out of memory exception.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class OutOfMemoryException extends FatalErrorException
+{
+}
--- /dev/null
+++ b/vendor/symfony/debug/Exception/UndefinedFunctionException.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Debug\Exception;
+
+/**
+ * Undefined Function Exception.
+ *
+ * @author Konstanton Myakshin <koc-dp@yandex.ru>
+ */
+class UndefinedFunctionException extends FatalErrorException
+{
+    public function __construct($message, \ErrorException $previous)
+    {
+        parent::__construct(
+            $message,
+            $previous->getCode(),
+            $previous->getSeverity(),
+            $previous->getFile(),
+            $previous->getLine(),
+            $previous->getPrevious()
+        );
+        $this->setTrace($previous->getTrace());
+    }
+}
--- /dev/null
+++ b/vendor/symfony/debug/Exception/UndefinedMethodException.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Debug\Exception;
+
+/**
+ * Undefined Method Exception.
+ *
+ * @author Grégoire Pineau <lyrixx@lyrixx.info>
+ */
+class UndefinedMethodException extends FatalErrorException
+{
+    public function __construct($message, \ErrorException $previous)
+    {
+        parent::__construct(
+            $message,
+            $previous->getCode(),
+            $previous->getSeverity(),
+            $previous->getFile(),
+            $previous->getLine(),
+            $previous->getPrevious()
+        );
+        $this->setTrace($previous->getTrace());
+    }
+}
--- /dev/null
+++ b/vendor/symfony/debug/ExceptionHandler.php
@@ -0,0 +1,496 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Debug;
+
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Debug\Exception\FlattenException;
+use Symfony\Component\Debug\Exception\OutOfMemoryException;
+
+/**
+ * ExceptionHandler converts an exception to a Response object.
+ *
+ * It is mostly useful in debug mode to replace the default PHP/XDebug
+ * output with something prettier and more useful.
+ *
+ * As this class is mainly used during Kernel boot, where nothing is yet
+ * available, the Response content is always HTML.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ExceptionHandler
+{
+    private $debug;
+    private $charset;
+    private $handler;
+    private $caughtBuffer;
+    private $caughtLength;
+    private $fileLinkFormat;
+
+    public function __construct($debug = true, $charset = null, $fileLinkFormat = null)
+    {
+        if (false !== strpos($charset, '%')) {
+            @trigger_error('Providing $fileLinkFormat as second argument to '.__METHOD__.' is deprecated since version 2.8 and will be unsupported in 3.0. Please provide it as third argument, after $charset.', E_USER_DEPRECATED);
+
+            // Swap $charset and $fileLinkFormat for BC reasons
+            $pivot = $fileLinkFormat;
+            $fileLinkFormat = $charset;
+            $charset = $pivot;
+        }
+        $this->debug = $debug;
+        $this->charset = $charset ?: ini_get('default_charset') ?: 'UTF-8';
+        $this->fileLinkFormat = $fileLinkFormat ?: ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format');
+    }
+
+    /**
+     * Registers the exception handler.
+     *
+     * @param bool        $debug          Enable/disable debug mode, where the stack trace is displayed
+     * @param string|null $charset        The charset used by exception messages
+     * @param string|null $fileLinkFormat The IDE link template
+     *
+     * @return ExceptionHandler The registered exception handler
+     */
+    public static function register($debug = true, $charset = null, $fileLinkFormat = null)
+    {
+        $handler = new static($debug, $charset, $fileLinkFormat);
+
+        $prev = set_exception_handler(array($handler, 'handle'));
+        if (is_array($prev) && $prev[0] instanceof ErrorHandler) {
+            restore_exception_handler();
+            $prev[0]->setExceptionHandler(array($handler, 'handle'));
+        }
+
+        return $handler;
+    }
+
+    /**
+     * Sets a user exception handler.
+     *
+     * @param callable $handler An handler that will be called on Exception
+     *
+     * @return callable|null The previous exception handler if any
+     */
+    public function setHandler($handler)
+    {
+        if (null !== $handler && !is_callable($handler)) {
+            throw new \LogicException('The exception handler must be a valid PHP callable.');
+        }
+        $old = $this->handler;
+        $this->handler = $handler;
+
+        return $old;
+    }
+
+    /**
+     * Sets the format for links to source files.
+     *
+     * @param string $format The format for links to source files
+     *
+     * @return string The previous file link format
+     */
+    public function setFileLinkFormat($format)
+    {
+        $old = $this->fileLinkFormat;
+        $this->fileLinkFormat = $format;
+
+        return $old;
+    }
+
+    /**
+     * Sends a response for the given Exception.
+     *
+     * To be as fail-safe as possible, the exception is first handled
+     * by our simple exception handler, then by the user exception handler.
+     * The latter takes precedence and any output from the former is cancelled,
+     * if and only if nothing bad happens in this handling path.
+     */
+    public function handle(\Exception $exception)
+    {
+        if (null === $this->handler || $exception instanceof OutOfMemoryException) {
+            $this->failSafeHandle($exception);
+
+            return;
+        }
+
+        $caughtLength = $this->caughtLength = 0;
+
+        ob_start(array($this, 'catchOutput'));
+        $this->failSafeHandle($exception);
+        while (null === $this->caughtBuffer && ob_end_flush()) {
+            // Empty loop, everything is in the condition
+        }
+        if (isset($this->caughtBuffer[0])) {
+            ob_start(array($this, 'cleanOutput'));
+            echo $this->caughtBuffer;
+            $caughtLength = ob_get_length();
+        }
+        $this->caughtBuffer = null;
+
+        try {
+            call_user_func($this->handler, $exception);
+            $this->caughtLength = $caughtLength;
+        } catch (\Exception $e) {
+            if (!$caughtLength) {
+                // All handlers failed. Let PHP handle that now.
+                throw $exception;
+            }
+        }
+    }
+
+    /**
+     * Sends a response for the given Exception.
+     *
+     * If you have the Symfony HttpFoundation component installed,
+     * this method will use it to create and send the response. If not,
+     * it will fallback to plain PHP functions.
+     *
+     * @param \Exception $exception An \Exception instance
+     */
+    private function failSafeHandle(\Exception $exception)
+    {
+        if (class_exists('Symfony\Component\HttpFoundation\Response', false)
+            && __CLASS__ !== get_class($this)
+            && ($reflector = new \ReflectionMethod($this, 'createResponse'))
+            && __CLASS__ !== $reflector->class
+        ) {
+            $response = $this->createResponse($exception);
+            $response->sendHeaders();
+            $response->sendContent();
+            @trigger_error(sprintf("The %s::createResponse method is deprecated since 2.8 and won't be called anymore when handling an exception in 3.0.", $reflector->class), E_USER_DEPRECATED);
+
+            return;
+        }
+
+        $this->sendPhpResponse($exception);
+    }
+
+    /**
+     * Sends the error associated with the given Exception as a plain PHP response.
+     *
+     * This method uses plain PHP functions like header() and echo to output
+     * the response.
+     *
+     * @param \Exception|FlattenException $exception An \Exception or FlattenException instance
+     */
+    public function sendPhpResponse($exception)
+    {
+        if (!$exception instanceof FlattenException) {
+            $exception = FlattenException::create($exception);
+        }
+
+        if (!headers_sent()) {
+            header(sprintf('HTTP/1.0 %s', $exception->getStatusCode()));
+            foreach ($exception->getHeaders() as $name => $value) {
+                header($name.': '.$value, false);
+            }
+            header('Content-Type: text/html; charset='.$this->charset);
+        }
+
+        echo $this->decorate($this->getContent($exception), $this->getStylesheet($exception));
+    }
+
+    /**
+     * Creates the error Response associated with the given Exception.
+     *
+     * @param \Exception|FlattenException $exception An \Exception or FlattenException instance
+     *
+     * @return Response A Response instance
+     *
+     * @deprecated since 2.8, to be removed in 3.0.
+     */
+    public function createResponse($exception)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        if (!$exception instanceof FlattenException) {
+            $exception = FlattenException::create($exception);
+        }
+
+        return Response::create($this->getHtml($exception), $exception->getStatusCode(), $exception->getHeaders())->setCharset($this->charset);
+    }
+
+    /**
+     * Gets the full HTML content associated with the given exception.
+     *
+     * @param \Exception|FlattenException $exception An \Exception or FlattenException instance
+     *
+     * @return string The HTML content as a string
+     */
+    public function getHtml($exception)
+    {
+        if (!$exception instanceof FlattenException) {
+            $exception = FlattenException::create($exception);
+        }
+
+        return $this->decorate($this->getContent($exception), $this->getStylesheet($exception));
+    }
+
+    /**
+     * Gets the HTML content associated with the given exception.
+     *
+     * @param FlattenException $exception A FlattenException instance
+     *
+     * @return string The content as a string
+     */
+    public function getContent(FlattenException $exception)
+    {
+        switch ($exception->getStatusCode()) {
+            case 404:
+                $title = 'Sorry, the page you are looking for could not be found.';
+                break;
+            default:
+                $title = 'Whoops, looks like something went wrong.';
+        }
+
+        $content = '';
+        if ($this->debug) {
+            try {
+                $count = count($exception->getAllPrevious());
+                $total = $count + 1;
+                foreach ($exception->toArray() as $position => $e) {
+                    $ind = $count - $position + 1;
+                    $class = $this->formatClass($e['class']);
+                    $message = nl2br($this->escapeHtml($e['message']));
+                    $content .= sprintf(<<<'EOF'
+                        <h2 class="block_exception clear_fix">
+                            <span class="exception_counter">%d/%d</span>
+                            <span class="exception_title">%s%s:</span>
+                            <span class="exception_message">%s</span>
+                        </h2>
+                        <div class="block">
+                            <ol class="traces list_exception">
+
+EOF
+                        , $ind, $total, $class, $this->formatPath($e['trace'][0]['file'], $e['trace'][0]['line']), $message);
+                    foreach ($e['trace'] as $trace) {
+                        $content .= '       <li>';
+                        if ($trace['function']) {
+                            $content .= sprintf('at %s%s%s(%s)', $this->formatClass($trace['class']), $trace['type'], $trace['function'], $this->formatArgs($trace['args']));
+                        }
+                        if (isset($trace['file']) && isset($trace['line'])) {
+                            $content .= $this->formatPath($trace['file'], $trace['line']);
+                        }
+                        $content .= "</li>\n";
+                    }
+
+                    $content .= "    </ol>\n</div>\n";
+                }
+            } catch (\Exception $e) {
+                // something nasty happened and we cannot throw an exception anymore
+                if ($this->debug) {
+                    $title = sprintf('Exception thrown when handling an exception (%s: %s)', get_class($e), $this->escapeHtml($e->getMessage()));
+                } else {
+                    $title = 'Whoops, looks like something went wrong.';
+                }
+            }
+        }
+
+        return <<<EOF
+            <div id="sf-resetcontent" class="sf-reset">
+                <h1>$title</h1>
+                $content
+            </div>
+EOF;
+    }
+
+    /**
+     * Gets the stylesheet associated with the given exception.
+     *
+     * @param FlattenException $exception A FlattenException instance
+     *
+     * @return string The stylesheet as a string
+     */
+    public function getStylesheet(FlattenException $exception)
+    {
+        return <<<'EOF'
+            .sf-reset { font: 11px Verdana, Arial, sans-serif; color: #333 }
+            .sf-reset .clear { clear:both; height:0; font-size:0; line-height:0; }
+            .sf-reset .clear_fix:after { display:block; height:0; clear:both; visibility:hidden; }
+            .sf-reset .clear_fix { display:inline-block; }
+            .sf-reset * html .clear_fix { height:1%; }
+            .sf-reset .clear_fix { display:block; }
+            .sf-reset, .sf-reset .block { margin: auto }
+            .sf-reset abbr { border-bottom: 1px dotted #000; cursor: help; }
+            .sf-reset p { font-size:14px; line-height:20px; color:#868686; padding-bottom:20px }
+            .sf-reset strong { font-weight:bold; }
+            .sf-reset a { color:#6c6159; cursor: default; }
+            .sf-reset a img { border:none; }
+            .sf-reset a:hover { text-decoration:underline; }
+            .sf-reset em { font-style:italic; }
+            .sf-reset h1, .sf-reset h2 { font: 20px Georgia, "Times New Roman", Times, serif }
+            .sf-reset .exception_counter { background-color: #fff; color: #333; padding: 6px; float: left; margin-right: 10px; float: left; display: block; }
+            .sf-reset .exception_title { margin-left: 3em; margin-bottom: 0.7em; display: block; }
+            .sf-reset .exception_message { margin-left: 3em; display: block; }
+            .sf-reset .traces li { font-size:12px; padding: 2px 4px; list-style-type:decimal; margin-left:20px; }
+            .sf-reset .block { background-color:#FFFFFF; padding:10px 28px; margin-bottom:20px;
+                -webkit-border-bottom-right-radius: 16px;
+                -webkit-border-bottom-left-radius: 16px;
+                -moz-border-radius-bottomright: 16px;
+                -moz-border-radius-bottomleft: 16px;
+                border-bottom-right-radius: 16px;
+                border-bottom-left-radius: 16px;
+                border-bottom:1px solid #ccc;
+                border-right:1px solid #ccc;
+                border-left:1px solid #ccc;
+                word-wrap: break-word;
+            }
+            .sf-reset .block_exception { background-color:#ddd; color: #333; padding:20px;
+                -webkit-border-top-left-radius: 16px;
+                -webkit-border-top-right-radius: 16px;
+                -moz-border-radius-topleft: 16px;
+                -moz-border-radius-topright: 16px;
+                border-top-left-radius: 16px;
+                border-top-right-radius: 16px;
+                border-top:1px solid #ccc;
+                border-right:1px solid #ccc;
+                border-left:1px solid #ccc;
+                overflow: hidden;
+                word-wrap: break-word;
+            }
+            .sf-reset a { background:none; color:#868686; text-decoration:none; }
+            .sf-reset a:hover { background:none; color:#313131; text-decoration:underline; }
+            .sf-reset ol { padding: 10px 0; }
+            .sf-reset h1 { background-color:#FFFFFF; padding: 15px 28px; margin-bottom: 20px;
+                -webkit-border-radius: 10px;
+                -moz-border-radius: 10px;
+                border-radius: 10px;
+                border: 1px solid #ccc;
+            }
+EOF;
+    }
+
+    private function decorate($content, $css)
+    {
+        return <<<EOF
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="{$this->charset}" />
+        <meta name="robots" content="noindex,nofollow" />
+        <style>
+            /* Copyright (c) 2010, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.com/yui/license.html */
+            html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:text-top;}sub{vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;}input,textarea,select{*font-size:100%;}legend{color:#000;}
+
+            html { background: #eee; padding: 10px }
+            img { border: 0; }
+            #sf-resetcontent { width:970px; margin:0 auto; }
+            $css
+        </style>
+    </head>
+    <body>
+        $content
+    </body>
+</html>
+EOF;
+    }
+
+    private function formatClass($class)
+    {
+        $parts = explode('\\', $class);
+
+        return sprintf('<abbr title="%s">%s</abbr>', $class, array_pop($parts));
+    }
+
+    private function formatPath($path, $line)
+    {
+        $path = $this->escapeHtml($path);
+        $file = preg_match('#[^/\\\\]*$#', $path, $file) ? $file[0] : $path;
+
+        if ($linkFormat = $this->fileLinkFormat) {
+            $link = strtr($this->escapeHtml($linkFormat), array('%f' => $path, '%l' => (int) $line));
+
+            return sprintf(' in <a href="%s" title="Go to source">%s line %d</a>', $link, $file, $line);
+        }
+
+        return sprintf(' in <a title="%s line %3$d" ondblclick="var f=this.innerHTML;this.innerHTML=this.title;this.title=f;">%s line %d</a>', $path, $file, $line);
+    }
+
+    /**
+     * Formats an array as a string.
+     *
+     * @param array $args The argument array
+     *
+     * @return string
+     */
+    private function formatArgs(array $args)
+    {
+        $result = array();
+        foreach ($args as $key => $item) {
+            if ('object' === $item[0]) {
+                $formattedValue = sprintf('<em>object</em>(%s)', $this->formatClass($item[1]));
+            } elseif ('array' === $item[0]) {
+                $formattedValue = sprintf('<em>array</em>(%s)', is_array($item[1]) ? $this->formatArgs($item[1]) : $item[1]);
+            } elseif ('string' === $item[0]) {
+                $formattedValue = sprintf("'%s'", $this->escapeHtml($item[1]));
+            } elseif ('null' === $item[0]) {
+                $formattedValue = '<em>null</em>';
+            } elseif ('boolean' === $item[0]) {
+                $formattedValue = '<em>'.strtolower(var_export($item[1], true)).'</em>';
+            } elseif ('resource' === $item[0]) {
+                $formattedValue = '<em>resource</em>';
+            } else {
+                $formattedValue = str_replace("\n", '', var_export($this->escapeHtml((string) $item[1]), true));
+            }
+
+            $result[] = is_int($key) ? $formattedValue : sprintf("'%s' => %s", $key, $formattedValue);
+        }
+
+        return implode(', ', $result);
+    }
+
+    /**
+     * Returns an UTF-8 and HTML encoded string.
+     *
+     * @deprecated since version 2.7, to be removed in 3.0.
+     */
+    protected static function utf8Htmlize($str)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.7 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        return htmlspecialchars($str, ENT_QUOTES | (PHP_VERSION_ID >= 50400 ? ENT_SUBSTITUTE : 0), 'UTF-8');
+    }
+
+    /**
+     * HTML-encodes a string.
+     */
+    private function escapeHtml($str)
+    {
+        return htmlspecialchars($str, ENT_QUOTES | (PHP_VERSION_ID >= 50400 ? ENT_SUBSTITUTE : 0), $this->charset);
+    }
+
+    /**
+     * @internal
+     */
+    public function catchOutput($buffer)
+    {
+        $this->caughtBuffer = $buffer;
+
+        return '';
+    }
+
+    /**
+     * @internal
+     */
+    public function cleanOutput($buffer)
+    {
+        if ($this->caughtLength) {
+            // use substr_replace() instead of substr() for mbstring overloading resistance
+            $cleanBuffer = substr_replace($buffer, '', 0, $this->caughtLength);
+            if (isset($cleanBuffer[0])) {
+                $buffer = $cleanBuffer;
+            }
+        }
+
+        return $buffer;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php
@@ -0,0 +1,212 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Debug\FatalErrorHandler;
+
+use Symfony\Component\Debug\Exception\ClassNotFoundException;
+use Symfony\Component\Debug\Exception\FatalErrorException;
+use Symfony\Component\Debug\DebugClassLoader;
+use Composer\Autoload\ClassLoader as ComposerClassLoader;
+use Symfony\Component\ClassLoader\ClassLoader as SymfonyClassLoader;
+use Symfony\Component\ClassLoader\UniversalClassLoader as SymfonyUniversalClassLoader;
+
+/**
+ * ErrorHandler for classes that do not exist.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ClassNotFoundFatalErrorHandler implements FatalErrorHandlerInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function handleError(array $error, FatalErrorException $exception)
+    {
+        $messageLen = strlen($error['message']);
+        $notFoundSuffix = '\' not found';
+        $notFoundSuffixLen = strlen($notFoundSuffix);
+        if ($notFoundSuffixLen > $messageLen) {
+            return;
+        }
+
+        if (0 !== substr_compare($error['message'], $notFoundSuffix, -$notFoundSuffixLen)) {
+            return;
+        }
+
+        foreach (array('class', 'interface', 'trait') as $typeName) {
+            $prefix = ucfirst($typeName).' \'';
+            $prefixLen = strlen($prefix);
+            if (0 !== strpos($error['message'], $prefix)) {
+                continue;
+            }
+
+            $fullyQualifiedClassName = substr($error['message'], $prefixLen, -$notFoundSuffixLen);
+            if (false !== $namespaceSeparatorIndex = strrpos($fullyQualifiedClassName, '\\')) {
+                $className = substr($fullyQualifiedClassName, $namespaceSeparatorIndex + 1);
+                $namespacePrefix = substr($fullyQualifiedClassName, 0, $namespaceSeparatorIndex);
+                $message = sprintf('Attempted to load %s "%s" from namespace "%s".', $typeName, $className, $namespacePrefix);
+                $tail = ' for another namespace?';
+            } else {
+                $className = $fullyQualifiedClassName;
+                $message = sprintf('Attempted to load %s "%s" from the global namespace.', $typeName, $className);
+                $tail = '?';
+            }
+
+            if ($candidates = $this->getClassCandidates($className)) {
+                $tail = array_pop($candidates).'"?';
+                if ($candidates) {
+                    $tail = ' for e.g. "'.implode('", "', $candidates).'" or "'.$tail;
+                } else {
+                    $tail = ' for "'.$tail;
+                }
+            }
+            $message .= "\nDid you forget a \"use\" statement".$tail;
+
+            return new ClassNotFoundException($message, $exception);
+        }
+    }
+
+    /**
+     * Tries to guess the full namespace for a given class name.
+     *
+     * By default, it looks for PSR-0 and PSR-4 classes registered via a Symfony or a Composer
+     * autoloader (that should cover all common cases).
+     *
+     * @param string $class A class name (without its namespace)
+     *
+     * @return array An array of possible fully qualified class names
+     */
+    private function getClassCandidates($class)
+    {
+        if (!is_array($functions = spl_autoload_functions())) {
+            return array();
+        }
+
+        // find Symfony and Composer autoloaders
+        $classes = array();
+
+        foreach ($functions as $function) {
+            if (!is_array($function)) {
+                continue;
+            }
+            // get class loaders wrapped by DebugClassLoader
+            if ($function[0] instanceof DebugClassLoader) {
+                $function = $function[0]->getClassLoader();
+
+                // @deprecated since version 2.5. Returning an object from DebugClassLoader::getClassLoader() is deprecated.
+                if (is_object($function)) {
+                    $function = array($function);
+                }
+
+                if (!is_array($function)) {
+                    continue;
+                }
+            }
+
+            if ($function[0] instanceof ComposerClassLoader || $function[0] instanceof SymfonyClassLoader || $function[0] instanceof SymfonyUniversalClassLoader) {
+                foreach ($function[0]->getPrefixes() as $prefix => $paths) {
+                    foreach ($paths as $path) {
+                        $classes = array_merge($classes, $this->findClassInPath($path, $class, $prefix));
+                    }
+                }
+            }
+            if ($function[0] instanceof ComposerClassLoader) {
+                foreach ($function[0]->getPrefixesPsr4() as $prefix => $paths) {
+                    foreach ($paths as $path) {
+                        $classes = array_merge($classes, $this->findClassInPath($path, $class, $prefix));
+                    }
+                }
+            }
+        }
+
+        return array_unique($classes);
+    }
+
+    /**
+     * @param string $path
+     * @param string $class
+     * @param string $prefix
+     *
+     * @return array
+     */
+    private function findClassInPath($path, $class, $prefix)
+    {
+        if (!$path = realpath($path.'/'.strtr($prefix, '\\_', '//')) ?: realpath($path.'/'.dirname(strtr($prefix, '\\_', '//'))) ?: realpath($path)) {
+            return array();
+        }
+
+        $classes = array();
+        $filename = $class.'.php';
+        foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
+            if ($filename == $file->getFileName() && $class = $this->convertFileToClass($path, $file->getPathName(), $prefix)) {
+                $classes[] = $class;
+            }
+        }
+
+        return $classes;
+    }
+
+    /**
+     * @param string $path
+     * @param string $file
+     * @param string $prefix
+     *
+     * @return string|null
+     */
+    private function convertFileToClass($path, $file, $prefix)
+    {
+        $candidates = array(
+            // namespaced class
+            $namespacedClass = str_replace(array($path.DIRECTORY_SEPARATOR, '.php', '/'), array('', '', '\\'), $file),
+            // namespaced class (with target dir)
+            $prefix.$namespacedClass,
+            // namespaced class (with target dir and separator)
+            $prefix.'\\'.$namespacedClass,
+            // PEAR class
+            str_replace('\\', '_', $namespacedClass),
+            // PEAR class (with target dir)
+            str_replace('\\', '_', $prefix.$namespacedClass),
+            // PEAR class (with target dir and separator)
+            str_replace('\\', '_', $prefix.'\\'.$namespacedClass),
+        );
+
+        if ($prefix) {
+            $candidates = array_filter($candidates, function ($candidate) use ($prefix) {return 0 === strpos($candidate, $prefix);});
+        }
+
+        // We cannot use the autoloader here as most of them use require; but if the class
+        // is not found, the new autoloader call will require the file again leading to a
+        // "cannot redeclare class" error.
+        foreach ($candidates as $candidate) {
+            if ($this->classExists($candidate)) {
+                return $candidate;
+            }
+        }
+
+        require_once $file;
+
+        foreach ($candidates as $candidate) {
+            if ($this->classExists($candidate)) {
+                return $candidate;
+            }
+        }
+    }
+
+    /**
+     * @param string $class
+     *
+     * @return bool
+     */
+    private function classExists($class)
+    {
+        return class_exists($class, false) || interface_exists($class, false) || (function_exists('trait_exists') && trait_exists($class, false));
+    }
+}
--- /dev/null
+++ b/vendor/symfony/debug/FatalErrorHandler/FatalErrorHandlerInterface.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Debug\FatalErrorHandler;
+
+use Symfony\Component\Debug\Exception\FatalErrorException;
+
+/**
+ * Attempts to convert fatal errors to exceptions.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface FatalErrorHandlerInterface
+{
+    /**
+     * Attempts to convert an error into an exception.
+     *
+     * @param array               $error     An array as returned by error_get_last()
+     * @param FatalErrorException $exception A FatalErrorException instance
+     *
+     * @return FatalErrorException|null A FatalErrorException instance if the class is able to convert the error, null otherwise
+     */
+    public function handleError(array $error, FatalErrorException $exception);
+}
--- /dev/null
+++ b/vendor/symfony/debug/FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php
@@ -0,0 +1,84 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Debug\FatalErrorHandler;
+
+use Symfony\Component\Debug\Exception\UndefinedFunctionException;
+use Symfony\Component\Debug\Exception\FatalErrorException;
+
+/**
+ * ErrorHandler for undefined functions.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class UndefinedFunctionFatalErrorHandler implements FatalErrorHandlerInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function handleError(array $error, FatalErrorException $exception)
+    {
+        $messageLen = strlen($error['message']);
+        $notFoundSuffix = '()';
+        $notFoundSuffixLen = strlen($notFoundSuffix);
+        if ($notFoundSuffixLen > $messageLen) {
+            return;
+        }
+
+        if (0 !== substr_compare($error['message'], $notFoundSuffix, -$notFoundSuffixLen)) {
+            return;
+        }
+
+        $prefix = 'Call to undefined function ';
+        $prefixLen = strlen($prefix);
+        if (0 !== strpos($error['message'], $prefix)) {
+            return;
+        }
+
+        $fullyQualifiedFunctionName = substr($error['message'], $prefixLen, -$notFoundSuffixLen);
+        if (false !== $namespaceSeparatorIndex = strrpos($fullyQualifiedFunctionName, '\\')) {
+            $functionName = substr($fullyQualifiedFunctionName, $namespaceSeparatorIndex + 1);
+            $namespacePrefix = substr($fullyQualifiedFunctionName, 0, $namespaceSeparatorIndex);
+            $message = sprintf('Attempted to call function "%s" from namespace "%s".', $functionName, $namespacePrefix);
+        } else {
+            $functionName = $fullyQualifiedFunctionName;
+            $message = sprintf('Attempted to call function "%s" from the global namespace.', $functionName);
+        }
+
+        $candidates = array();
+        foreach (get_defined_functions() as $type => $definedFunctionNames) {
+            foreach ($definedFunctionNames as $definedFunctionName) {
+                if (false !== $namespaceSeparatorIndex = strrpos($definedFunctionName, '\\')) {
+                    $definedFunctionNameBasename = substr($definedFunctionName, $namespaceSeparatorIndex + 1);
+                } else {
+                    $definedFunctionNameBasename = $definedFunctionName;
+                }
+
+                if ($definedFunctionNameBasename === $functionName) {
+                    $candidates[] = '\\'.$definedFunctionName;
+                }
+            }
+        }
+
+        if ($candidates) {
+            sort($candidates);
+            $last = array_pop($candidates).'"?';
+            if ($candidates) {
+                $candidates = 'e.g. "'.implode('", "', $candidates).'" or "'.$last;
+            } else {
+                $candidates = '"'.$last;
+            }
+            $message .= "\nDid you mean to call ".$candidates;
+        }
+
+        return new UndefinedFunctionException($message, $exception);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/debug/FatalErrorHandler/UndefinedMethodFatalErrorHandler.php
@@ -0,0 +1,60 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Debug\FatalErrorHandler;
+
+use Symfony\Component\Debug\Exception\FatalErrorException;
+use Symfony\Component\Debug\Exception\UndefinedMethodException;
+
+/**
+ * ErrorHandler for undefined methods.
+ *
+ * @author Grégoire Pineau <lyrixx@lyrixx.info>
+ */
+class UndefinedMethodFatalErrorHandler implements FatalErrorHandlerInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function handleError(array $error, FatalErrorException $exception)
+    {
+        preg_match('/^Call to undefined method (.*)::(.*)\(\)$/', $error['message'], $matches);
+        if (!$matches) {
+            return;
+        }
+
+        $className = $matches[1];
+        $methodName = $matches[2];
+
+        $message = sprintf('Attempted to call an undefined method named "%s" of class "%s".', $methodName, $className);
+
+        $candidates = array();
+        foreach (get_class_methods($className) as $definedMethodName) {
+            $lev = levenshtein($methodName, $definedMethodName);
+            if ($lev <= strlen($methodName) / 3 || false !== strpos($definedMethodName, $methodName)) {
+                $candidates[] = $definedMethodName;
+            }
+        }
+
+        if ($candidates) {
+            sort($candidates);
+            $last = array_pop($candidates).'"?';
+            if ($candidates) {
+                $candidates = 'e.g. "'.implode('", "', $candidates).'" or "'.$last;
+            } else {
+                $candidates = '"'.$last;
+            }
+            $message .= "\nDid you mean to call ".$candidates;
+        }
+
+        return new UndefinedMethodException($message, $exception);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/debug/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2016 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/symfony/debug/Resources/ext/README.md
@@ -0,0 +1,134 @@
+Symfony Debug Extension for PHP 5
+=================================
+
+This extension publishes several functions to help building powerful debugging tools.
+It is compatible with PHP 5.3, 5.4, 5.5 and 5.6; with ZTS and non-ZTS modes.
+It is not required thus not provided for PHP 7.
+
+symfony_zval_info()
+-------------------
+
+- exposes zval_hash/refcounts, allowing e.g. efficient exploration of arbitrary structures in PHP,
+- does work with references, preventing memory copying.
+
+Its behavior is about the same as:
+
+```php
+<?php
+
+function symfony_zval_info($key, $array, $options = 0)
+{
+
+    // $options is currently not used, but could be in future version.
+
+    if (!array_key_exists($key, $array)) {
+        return null;
+    }
+
+    $info = array(
+        'type' => gettype($array[$key]),
+        'zval_hash' => /* hashed memory address of $array[$key] */,
+        'zval_refcount' => /* internal zval refcount of $array[$key] */,
+        'zval_isref' => /* is_ref status of $array[$key] */,
+    );
+
+    switch ($info['type']) {
+        case 'object':
+            $info += array(
+                'object_class' => get_class($array[$key]),
+                'object_refcount' => /* internal object refcount of $array[$key] */,
+                'object_hash' => spl_object_hash($array[$key]),
+                'object_handle' => /* internal object handle $array[$key] */,
+            );
+            break;
+
+        case 'resource':
+            $info += array(
+                'resource_handle' => (int) $array[$key],
+                'resource_type' => get_resource_type($array[$key]),
+                'resource_refcount' => /* internal resource refcount of $array[$key] */,
+            );
+            break;
+
+        case 'array':
+            $info += array(
+                'array_count' => count($array[$key]),
+            );
+            break;
+
+        case 'string':
+            $info += array(
+                'strlen' => strlen($array[$key]),
+            );
+            break;
+    }
+
+    return $info;
+}
+```
+
+symfony_debug_backtrace()
+-------------------------
+
+This function works like debug_backtrace(), except that it can fetch the full backtrace in case of fatal errors:
+
+```php
+function foo() { fatal(); }
+function bar() { foo(); }
+
+function sd() { var_dump(symfony_debug_backtrace()); }
+
+register_shutdown_function('sd');
+
+bar();
+
+/* Will output
+Fatal error: Call to undefined function fatal() in foo.php on line 42
+array(3) {
+  [0]=>
+  array(2) {
+    ["function"]=>
+    string(2) "sd"
+    ["args"]=>
+    array(0) {
+    }
+  }
+  [1]=>
+  array(4) {
+    ["file"]=>
+    string(7) "foo.php"
+    ["line"]=>
+    int(1)
+    ["function"]=>
+    string(3) "foo"
+    ["args"]=>
+    array(0) {
+    }
+  }
+  [2]=>
+  array(4) {
+    ["file"]=>
+    string(102) "foo.php"
+    ["line"]=>
+    int(2)
+    ["function"]=>
+    string(3) "bar"
+    ["args"]=>
+    array(0) {
+    }
+  }
+}
+*/
+```
+
+Usage
+-----
+
+To enable the extension from source, run:
+
+```
+    phpize
+    ./configure
+    make
+    sudo make install
+```
--- /dev/null
+++ b/vendor/symfony/debug/Resources/ext/config.m4
@@ -0,0 +1,63 @@
+dnl $Id$
+dnl config.m4 for extension symfony_debug
+
+dnl Comments in this file start with the string 'dnl'.
+dnl Remove where necessary. This file will not work
+dnl without editing.
+
+dnl If your extension references something external, use with:
+
+dnl PHP_ARG_WITH(symfony_debug, for symfony_debug support,
+dnl Make sure that the comment is aligned:
+dnl [  --with-symfony_debug             Include symfony_debug support])
+
+dnl Otherwise use enable:
+
+PHP_ARG_ENABLE(symfony_debug, whether to enable symfony_debug support,
+dnl Make sure that the comment is aligned:
+[  --enable-symfony_debug           Enable symfony_debug support])
+
+if test "$PHP_SYMFONY_DEBUG" != "no"; then
+  dnl Write more examples of tests here...
+
+  dnl # --with-symfony_debug -> check with-path
+  dnl SEARCH_PATH="/usr/local /usr"     # you might want to change this
+  dnl SEARCH_FOR="/include/symfony_debug.h"  # you most likely want to change this
+  dnl if test -r $PHP_SYMFONY_DEBUG/$SEARCH_FOR; then # path given as parameter
+  dnl   SYMFONY_DEBUG_DIR=$PHP_SYMFONY_DEBUG
+  dnl else # search default path list
+  dnl   AC_MSG_CHECKING([for symfony_debug files in default path])
+  dnl   for i in $SEARCH_PATH ; do
+  dnl     if test -r $i/$SEARCH_FOR; then
+  dnl       SYMFONY_DEBUG_DIR=$i
+  dnl       AC_MSG_RESULT(found in $i)
+  dnl     fi
+  dnl   done
+  dnl fi
+  dnl
+  dnl if test -z "$SYMFONY_DEBUG_DIR"; then
+  dnl   AC_MSG_RESULT([not found])
+  dnl   AC_MSG_ERROR([Please reinstall the symfony_debug distribution])
+  dnl fi
+
+  dnl # --with-symfony_debug -> add include path
+  dnl PHP_ADD_INCLUDE($SYMFONY_DEBUG_DIR/include)
+
+  dnl # --with-symfony_debug -> check for lib and symbol presence
+  dnl LIBNAME=symfony_debug # you may want to change this
+  dnl LIBSYMBOL=symfony_debug # you most likely want to change this 
+
+  dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
+  dnl [
+  dnl   PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $SYMFONY_DEBUG_DIR/lib, SYMFONY_DEBUG_SHARED_LIBADD)
+  dnl   AC_DEFINE(HAVE_SYMFONY_DEBUGLIB,1,[ ])
+  dnl ],[
+  dnl   AC_MSG_ERROR([wrong symfony_debug lib version or lib not found])
+  dnl ],[
+  dnl   -L$SYMFONY_DEBUG_DIR/lib -lm
+  dnl ])
+  dnl
+  dnl PHP_SUBST(SYMFONY_DEBUG_SHARED_LIBADD)
+
+  PHP_NEW_EXTENSION(symfony_debug, symfony_debug.c, $ext_shared)
+fi
--- /dev/null
+++ b/vendor/symfony/debug/Resources/ext/config.w32
@@ -0,0 +1,13 @@
+// $Id$
+// vim:ft=javascript
+
+// If your extension references something external, use ARG_WITH
+// ARG_WITH("symfony_debug", "for symfony_debug support", "no");
+
+// Otherwise, use ARG_ENABLE
+// ARG_ENABLE("symfony_debug", "enable symfony_debug support", "no");
+
+if (PHP_SYMFONY_DEBUG != "no") {
+	EXTENSION("symfony_debug", "symfony_debug.c");
+}
+
--- /dev/null
+++ b/vendor/symfony/debug/Resources/ext/php_symfony_debug.h
@@ -0,0 +1,60 @@
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+#ifndef PHP_SYMFONY_DEBUG_H
+#define PHP_SYMFONY_DEBUG_H
+
+extern zend_module_entry symfony_debug_module_entry;
+#define phpext_symfony_debug_ptr &symfony_debug_module_entry
+
+#define PHP_SYMFONY_DEBUG_VERSION "2.7"
+
+#ifdef PHP_WIN32
+#	define PHP_SYMFONY_DEBUG_API __declspec(dllexport)
+#elif defined(__GNUC__) && __GNUC__ >= 4
+#	define PHP_SYMFONY_DEBUG_API __attribute__ ((visibility("default")))
+#else
+#	define PHP_SYMFONY_DEBUG_API
+#endif
+
+#ifdef ZTS
+#include "TSRM.h"
+#endif
+
+ZEND_BEGIN_MODULE_GLOBALS(symfony_debug)
+	intptr_t req_rand_init;
+	void (*old_error_cb)(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args);
+	zval *debug_bt;
+ZEND_END_MODULE_GLOBALS(symfony_debug)
+
+PHP_MINIT_FUNCTION(symfony_debug);
+PHP_MSHUTDOWN_FUNCTION(symfony_debug);
+PHP_RINIT_FUNCTION(symfony_debug);
+PHP_RSHUTDOWN_FUNCTION(symfony_debug);
+PHP_MINFO_FUNCTION(symfony_debug);
+PHP_GINIT_FUNCTION(symfony_debug);
+PHP_GSHUTDOWN_FUNCTION(symfony_debug);
+
+PHP_FUNCTION(symfony_zval_info);
+PHP_FUNCTION(symfony_debug_backtrace);
+
+static char *_symfony_debug_memory_address_hash(void * TSRMLS_DC);
+static const char *_symfony_debug_zval_type(zval *);
+static const char* _symfony_debug_get_resource_type(long TSRMLS_DC);
+static int _symfony_debug_get_resource_refcount(long TSRMLS_DC);
+
+void symfony_debug_error_cb(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args);
+
+#ifdef ZTS
+#define SYMFONY_DEBUG_G(v) TSRMG(symfony_debug_globals_id, zend_symfony_debug_globals *, v)
+#else
+#define SYMFONY_DEBUG_G(v) (symfony_debug_globals.v)
+#endif
+
+#endif	/* PHP_SYMFONY_DEBUG_H */
--- /dev/null
+++ b/vendor/symfony/debug/Resources/ext/symfony_debug.c
@@ -0,0 +1,283 @@
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "php.h"
+#ifdef ZTS
+#include "TSRM.h"
+#endif
+#include "php_ini.h"
+#include "ext/standard/info.h"
+#include "php_symfony_debug.h"
+#include "ext/standard/php_rand.h"
+#include "ext/standard/php_lcg.h"
+#include "ext/spl/php_spl.h"
+#include "Zend/zend_gc.h"
+#include "Zend/zend_builtin_functions.h"
+#include "Zend/zend_extensions.h" /* for ZEND_EXTENSION_API_NO */
+#include "ext/standard/php_array.h"
+#include "Zend/zend_interfaces.h"
+#include "SAPI.h"
+
+#define IS_PHP_53 ZEND_EXTENSION_API_NO == 220090626
+
+ZEND_DECLARE_MODULE_GLOBALS(symfony_debug)
+
+ZEND_BEGIN_ARG_INFO_EX(symfony_zval_arginfo, 0, 0, 2)
+	ZEND_ARG_INFO(0, key)
+	ZEND_ARG_ARRAY_INFO(0, array, 0)
+	ZEND_ARG_INFO(0, options)
+ZEND_END_ARG_INFO()
+
+const zend_function_entry symfony_debug_functions[] = {
+	PHP_FE(symfony_zval_info,	symfony_zval_arginfo)
+	PHP_FE(symfony_debug_backtrace, NULL)
+	PHP_FE_END
+};
+
+PHP_FUNCTION(symfony_debug_backtrace)
+{
+	if (zend_parse_parameters_none() == FAILURE) {
+		return;
+	}
+#if IS_PHP_53
+	zend_fetch_debug_backtrace(return_value, 1, 0 TSRMLS_CC);
+#else
+	zend_fetch_debug_backtrace(return_value, 1, 0, 0 TSRMLS_CC);
+#endif
+
+	if (!SYMFONY_DEBUG_G(debug_bt)) {
+		return;
+	}
+
+	php_array_merge(Z_ARRVAL_P(return_value), Z_ARRVAL_P(SYMFONY_DEBUG_G(debug_bt)), 0 TSRMLS_CC);
+}
+
+PHP_FUNCTION(symfony_zval_info)
+{
+	zval *key = NULL, *arg = NULL;
+	zval **data = NULL;
+	HashTable *array = NULL;
+	long options = 0;
+
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zh|l", &key, &array, &options) == FAILURE) {
+		return;
+	}
+
+	switch (Z_TYPE_P(key)) {
+		case IS_STRING:
+			if (zend_symtable_find(array, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, (void **)&data) == FAILURE) {
+				return;
+			}
+		break;
+		case IS_LONG:
+			if (zend_hash_index_find(array, Z_LVAL_P(key), (void **)&data)) {
+				return;
+			}
+		break;
+	}
+
+	arg = *data;
+
+	array_init(return_value);
+
+	add_assoc_string(return_value, "type", (char *)_symfony_debug_zval_type(arg), 1);
+	add_assoc_stringl(return_value, "zval_hash", _symfony_debug_memory_address_hash((void *)arg TSRMLS_CC), 16, 0);
+	add_assoc_long(return_value, "zval_refcount", Z_REFCOUNT_P(arg));
+	add_assoc_bool(return_value, "zval_isref", (zend_bool)Z_ISREF_P(arg));
+
+	if (Z_TYPE_P(arg) == IS_OBJECT) {
+		char hash[33] = {0};
+
+		php_spl_object_hash(arg, (char *)hash TSRMLS_CC);
+		add_assoc_stringl(return_value, "object_class", (char *)Z_OBJCE_P(arg)->name, Z_OBJCE_P(arg)->name_length, 1);
+		add_assoc_long(return_value, "object_refcount", EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(arg)].bucket.obj.refcount);
+		add_assoc_string(return_value, "object_hash", hash, 1);
+		add_assoc_long(return_value, "object_handle", Z_OBJ_HANDLE_P(arg));
+	} else if (Z_TYPE_P(arg) == IS_ARRAY) {
+		add_assoc_long(return_value, "array_count", zend_hash_num_elements(Z_ARRVAL_P(arg)));
+	} else if(Z_TYPE_P(arg) == IS_RESOURCE) {
+		add_assoc_long(return_value, "resource_handle", Z_LVAL_P(arg));
+		add_assoc_string(return_value, "resource_type", (char *)_symfony_debug_get_resource_type(Z_LVAL_P(arg) TSRMLS_CC), 1);
+		add_assoc_long(return_value, "resource_refcount", _symfony_debug_get_resource_refcount(Z_LVAL_P(arg) TSRMLS_CC));
+	} else if (Z_TYPE_P(arg) == IS_STRING) {
+		add_assoc_long(return_value, "strlen", Z_STRLEN_P(arg));
+	}
+}
+
+void symfony_debug_error_cb(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args)
+{
+	TSRMLS_FETCH();
+	zval *retval;
+
+	switch (type) {
+		case E_ERROR:
+		case E_PARSE:
+		case E_CORE_ERROR:
+		case E_CORE_WARNING:
+		case E_COMPILE_ERROR:
+		case E_COMPILE_WARNING:
+			ALLOC_INIT_ZVAL(retval);
+#if IS_PHP_53
+			zend_fetch_debug_backtrace(retval, 1, 0 TSRMLS_CC);
+#else
+			zend_fetch_debug_backtrace(retval, 1, 0, 0 TSRMLS_CC);
+#endif
+			SYMFONY_DEBUG_G(debug_bt) = retval;
+	}
+
+	SYMFONY_DEBUG_G(old_error_cb)(type, error_filename, error_lineno, format, args);
+}
+
+static const char* _symfony_debug_get_resource_type(long rsid TSRMLS_DC)
+{
+	const char *res_type;
+	res_type = zend_rsrc_list_get_rsrc_type(rsid TSRMLS_CC);
+
+	if (!res_type) {
+		return "Unknown";
+	}
+
+	return res_type;
+}
+
+static int _symfony_debug_get_resource_refcount(long rsid TSRMLS_DC)
+{
+	zend_rsrc_list_entry *le;
+
+	if (zend_hash_index_find(&EG(regular_list), rsid, (void **) &le)==SUCCESS) {
+		return le->refcount;
+	}
+
+	return 0;
+}
+
+static char *_symfony_debug_memory_address_hash(void *address TSRMLS_DC)
+{
+	char *result = NULL;
+	intptr_t address_rand;
+
+	if (!SYMFONY_DEBUG_G(req_rand_init)) {
+		if (!BG(mt_rand_is_seeded)) {
+			php_mt_srand(GENERATE_SEED() TSRMLS_CC);
+		}
+		SYMFONY_DEBUG_G(req_rand_init) = (intptr_t)php_mt_rand(TSRMLS_C);
+	}
+
+	address_rand = (intptr_t)address ^ SYMFONY_DEBUG_G(req_rand_init);
+
+	spprintf(&result, 17, "%016zx", address_rand);
+
+	return result;
+}
+
+static const char *_symfony_debug_zval_type(zval *zv)
+{
+	switch (Z_TYPE_P(zv)) {
+		case IS_NULL:
+			return "NULL";
+			break;
+
+		case IS_BOOL:
+			return "boolean";
+			break;
+
+		case IS_LONG:
+			return "integer";
+			break;
+
+		case IS_DOUBLE:
+			return "double";
+			break;
+
+		case IS_STRING:
+			return "string";
+			break;
+
+		case IS_ARRAY:
+			return "array";
+			break;
+
+		case IS_OBJECT:
+			return "object";
+
+		case IS_RESOURCE:
+			return "resource";
+
+		default:
+			return "unknown type";
+	}
+}
+
+zend_module_entry symfony_debug_module_entry = {
+	STANDARD_MODULE_HEADER,
+	"symfony_debug",
+	symfony_debug_functions,
+	PHP_MINIT(symfony_debug),
+	PHP_MSHUTDOWN(symfony_debug),
+	PHP_RINIT(symfony_debug),
+	PHP_RSHUTDOWN(symfony_debug),
+	PHP_MINFO(symfony_debug),
+	PHP_SYMFONY_DEBUG_VERSION,
+	PHP_MODULE_GLOBALS(symfony_debug),
+	PHP_GINIT(symfony_debug),
+	PHP_GSHUTDOWN(symfony_debug),
+	NULL,
+	STANDARD_MODULE_PROPERTIES_EX
+};
+
+#ifdef COMPILE_DL_SYMFONY_DEBUG
+ZEND_GET_MODULE(symfony_debug)
+#endif
+
+PHP_GINIT_FUNCTION(symfony_debug)
+{
+	memset(symfony_debug_globals, 0 , sizeof(*symfony_debug_globals));
+}
+
+PHP_GSHUTDOWN_FUNCTION(symfony_debug)
+{
+
+}
+
+PHP_MINIT_FUNCTION(symfony_debug)
+{
+	SYMFONY_DEBUG_G(old_error_cb) = zend_error_cb;
+	zend_error_cb                 = symfony_debug_error_cb;
+
+	return SUCCESS;
+}
+
+PHP_MSHUTDOWN_FUNCTION(symfony_debug)
+{
+	zend_error_cb = SYMFONY_DEBUG_G(old_error_cb);
+
+	return SUCCESS;
+}
+
+PHP_RINIT_FUNCTION(symfony_debug)
+{
+	return SUCCESS;
+}
+
+PHP_RSHUTDOWN_FUNCTION(symfony_debug)
+{
+	return SUCCESS;
+}
+
+PHP_MINFO_FUNCTION(symfony_debug)
+{
+	php_info_print_table_start();
+	php_info_print_table_header(2, "Symfony Debug support", "enabled");
+	php_info_print_table_header(2, "Symfony Debug version", PHP_SYMFONY_DEBUG_VERSION);
+	php_info_print_table_end();
+}
--- /dev/null
+++ b/vendor/symfony/debug/Resources/ext/tests/001.phpt
@@ -0,0 +1,153 @@
+--TEST--
+Test symfony_zval_info API
+--SKIPIF--
+<?php if (!extension_loaded('symfony_debug')) print 'skip'; ?>
+--FILE--
+<?php
+
+$int = 42;
+$float = 42.42;
+$str = 'foobar';
+$object = new StdClass();
+$array = array('foo', 'bar');
+$resource = tmpfile();
+$null = null;
+$bool = true;
+
+$anotherint = 42;
+$refcount2 = &$anotherint;
+
+$var = array(
+    'int' => $int,
+    'float' => $float,
+    'str' => $str,
+    'object' => $object,
+    'array' => $array,
+    'resource' => $resource,
+    'null' => $null,
+    'bool' => $bool,
+    'refcount' => &$refcount2,
+);
+
+var_dump(symfony_zval_info('int', $var));
+var_dump(symfony_zval_info('float', $var));
+var_dump(symfony_zval_info('str', $var));
+var_dump(symfony_zval_info('object', $var));
+var_dump(symfony_zval_info('array', $var));
+var_dump(symfony_zval_info('resource', $var));
+var_dump(symfony_zval_info('null', $var));
+var_dump(symfony_zval_info('bool', $var));
+
+var_dump(symfony_zval_info('refcount', $var));
+var_dump(symfony_zval_info('not-exist', $var));
+?>
+--EXPECTF--
+array(4) {
+  ["type"]=>
+  string(7) "integer"
+  ["zval_hash"]=>
+  string(16) "%s"
+  ["zval_refcount"]=>
+  int(2)
+  ["zval_isref"]=>
+  bool(false)
+}
+array(4) {
+  ["type"]=>
+  string(6) "double"
+  ["zval_hash"]=>
+  string(16) "%s"
+  ["zval_refcount"]=>
+  int(2)
+  ["zval_isref"]=>
+  bool(false)
+}
+array(5) {
+  ["type"]=>
+  string(6) "string"
+  ["zval_hash"]=>
+  string(16) "%s"
+  ["zval_refcount"]=>
+  int(2)
+  ["zval_isref"]=>
+  bool(false)
+  ["strlen"]=>
+  int(6)
+}
+array(8) {
+  ["type"]=>
+  string(6) "object"
+  ["zval_hash"]=>
+  string(16) "%s"
+  ["zval_refcount"]=>
+  int(2)
+  ["zval_isref"]=>
+  bool(false)
+  ["object_class"]=>
+  string(8) "stdClass"
+  ["object_refcount"]=>
+  int(1)
+  ["object_hash"]=>
+  string(32) "%s"
+  ["object_handle"]=>
+  int(%d)
+}
+array(5) {
+  ["type"]=>
+  string(5) "array"
+  ["zval_hash"]=>
+  string(16) "%s"
+  ["zval_refcount"]=>
+  int(2)
+  ["zval_isref"]=>
+  bool(false)
+  ["array_count"]=>
+  int(2)
+}
+array(7) {
+  ["type"]=>
+  string(8) "resource"
+  ["zval_hash"]=>
+  string(16) "%s"
+  ["zval_refcount"]=>
+  int(2)
+  ["zval_isref"]=>
+  bool(false)
+  ["resource_handle"]=>
+  int(%d)
+  ["resource_type"]=>
+  string(6) "stream"
+  ["resource_refcount"]=>
+  int(1)
+}
+array(4) {
+  ["type"]=>
+  string(4) "NULL"
+  ["zval_hash"]=>
+  string(16) "%s"
+  ["zval_refcount"]=>
+  int(2)
+  ["zval_isref"]=>
+  bool(false)
+}
+array(4) {
+  ["type"]=>
+  string(7) "boolean"
+  ["zval_hash"]=>
+  string(16) "%s"
+  ["zval_refcount"]=>
+  int(2)
+  ["zval_isref"]=>
+  bool(false)
+}
+array(4) {
+  ["type"]=>
+  string(7) "integer"
+  ["zval_hash"]=>
+  string(16) "%s"
+  ["zval_refcount"]=>
+  int(3)
+  ["zval_isref"]=>
+  bool(true)
+}
+NULL
--- /dev/null
+++ b/vendor/symfony/debug/Resources/ext/tests/002.phpt
@@ -0,0 +1,63 @@
+--TEST--
+Test symfony_debug_backtrace in case of fatal error
+--SKIPIF--
+<?php if (!extension_loaded('symfony_debug')) print 'skip'; ?>
+--FILE--
+<?php
+
+function bar()
+{
+    foo();
+}
+
+function foo()
+{
+    notexist();
+}
+
+function bt()
+{
+    print_r(symfony_debug_backtrace());
+}
+
+register_shutdown_function('bt');
+
+bar();
+
+?>
+--EXPECTF--
+Fatal error: Call to undefined function notexist() in %s on line %d
+Array
+(
+    [0] => Array
+        (
+            [function] => bt
+            [args] => Array
+                (
+                )
+
+        )
+
+    [1] => Array
+        (
+            [file] => %s
+            [line] => %d
+            [function] => foo
+            [args] => Array
+                (
+                )
+
+        )
+
+    [2] => Array
+        (
+            [file] => %s
+            [line] => %d
+            [function] => bar
+            [args] => Array
+                (
+                )
+
+        )
+
+)
--- /dev/null
+++ b/vendor/symfony/debug/Resources/ext/tests/002_1.phpt
@@ -0,0 +1,46 @@
+--TEST--
+Test symfony_debug_backtrace in case of non fatal error
+--SKIPIF--
+<?php if (!extension_loaded('symfony_debug')) print 'skip'; ?>
+--FILE--
+<?php
+
+function bar()
+{
+    bt();
+}
+
+function bt()
+{
+    print_r(symfony_debug_backtrace());
+}
+
+bar();
+
+?>
+--EXPECTF--
+Array
+(
+    [0] => Array
+        (
+            [file] => %s
+            [line] => %d
+            [function] => bt
+            [args] => Array
+                (
+                )
+
+        )
+
+    [1] => Array
+        (
+            [file] => %s
+            [line] => %d
+            [function] => bar
+            [args] => Array
+                (
+                )
+
+        )
+
+)
--- /dev/null
+++ b/vendor/symfony/debug/Resources/ext/tests/003.phpt
@@ -0,0 +1,85 @@
+--TEST--
+Test ErrorHandler in case of fatal error
+--SKIPIF--
+<?php if (!extension_loaded('symfony_debug')) print 'skip'; ?>
+--FILE--
+<?php
+
+namespace Psr\Log;
+
+class LogLevel
+{
+    const EMERGENCY = 'emergency';
+    const ALERT = 'alert';
+    const CRITICAL = 'critical';
+    const ERROR = 'error';
+    const WARNING = 'warning';
+    const NOTICE = 'notice';
+    const INFO = 'info';
+    const DEBUG = 'debug';
+}
+
+namespace Symfony\Component\Debug;
+
+$dir = __DIR__.'/../../../';
+require $dir.'ErrorHandler.php';
+require $dir.'Exception/FatalErrorException.php';
+require $dir.'Exception/UndefinedFunctionException.php';
+require $dir.'FatalErrorHandler/FatalErrorHandlerInterface.php';
+require $dir.'FatalErrorHandler/ClassNotFoundFatalErrorHandler.php';
+require $dir.'FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php';
+require $dir.'FatalErrorHandler/UndefinedMethodFatalErrorHandler.php';
+
+function bar()
+{
+    foo();
+}
+
+function foo()
+{
+    notexist();
+}
+
+$handler = ErrorHandler::register();
+$handler->setExceptionHandler('print_r');
+
+if (function_exists('xdebug_disable')) {
+    xdebug_disable();
+}
+
+bar();
+?>
+--EXPECTF--
+Fatal error: Call to undefined function Symfony\Component\Debug\notexist() in %s on line %d
+Symfony\Component\Debug\Exception\UndefinedFunctionException Object
+(
+    [message:protected] => Attempted to call function "notexist" from namespace "Symfony\Component\Debug".
+    [string:Exception:private] => 
+    [code:protected] => 0
+    [file:protected] => %s
+    [line:protected] => %d
+    [trace:Exception:private] => Array
+        (
+            [0] => Array
+                (
+%A                    [function] => Symfony\Component\Debug\foo
+%A                    [args] => Array
+                        (
+                        )
+
+                )
+
+            [1] => Array
+                (
+%A                    [function] => Symfony\Component\Debug\bar
+%A                    [args] => Array
+                        (
+                        )
+
+                )
+%A
+        )
+
+    [previous:Exception:private] => 
+    [severity:protected] => 1
+)
--- /dev/null
+++ b/vendor/symfony/debug/composer.json
@@ -0,0 +1,41 @@
+{
+    "name": "symfony/debug",
+    "type": "library",
+    "description": "Symfony Debug Component",
+    "keywords": [],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.9",
+        "psr/log": "~1.0"
+    },
+    "conflict": {
+        "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+    },
+    "require-dev": {
+        "symfony/class-loader": "~2.2|~3.0.0",
+        "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2|~3.0.0"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Component\\Debug\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.8-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Alias.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+class Alias
+{
+    private $id;
+    private $public;
+
+    /**
+     * @param string $id     Alias identifier
+     * @param bool   $public If this alias is public
+     */
+    public function __construct($id, $public = true)
+    {
+        $this->id = strtolower($id);
+        $this->public = $public;
+    }
+
+    /**
+     * Checks if this DI Alias should be public or not.
+     *
+     * @return bool
+     */
+    public function isPublic()
+    {
+        return $this->public;
+    }
+
+    /**
+     * Sets if this Alias is public.
+     *
+     * @param bool $boolean If this Alias should be public
+     */
+    public function setPublic($boolean)
+    {
+        $this->public = (bool) $boolean;
+    }
+
+    /**
+     * Returns the Id of this alias.
+     *
+     * @return string The alias id
+     */
+    public function __toString()
+    {
+        return $this->id;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php
@@ -0,0 +1,152 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Run this pass before passes that need to know more about the relation of
+ * your services.
+ *
+ * This class will populate the ServiceReferenceGraph with information. You can
+ * retrieve the graph in other passes from the compiler.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class AnalyzeServiceReferencesPass implements RepeatablePassInterface
+{
+    private $graph;
+    private $container;
+    private $currentId;
+    private $currentDefinition;
+    private $repeatedPass;
+    private $onlyConstructorArguments;
+
+    /**
+     * @param bool $onlyConstructorArguments Sets this Service Reference pass to ignore method calls
+     */
+    public function __construct($onlyConstructorArguments = false)
+    {
+        $this->onlyConstructorArguments = (bool) $onlyConstructorArguments;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setRepeatedPass(RepeatedPass $repeatedPass)
+    {
+        $this->repeatedPass = $repeatedPass;
+    }
+
+    /**
+     * Processes a ContainerBuilder object to populate the service reference graph.
+     *
+     * @param ContainerBuilder $container
+     */
+    public function process(ContainerBuilder $container)
+    {
+        $this->container = $container;
+        $this->graph = $container->getCompiler()->getServiceReferenceGraph();
+        $this->graph->clear();
+
+        foreach ($container->getDefinitions() as $id => $definition) {
+            if ($definition->isSynthetic() || $definition->isAbstract()) {
+                continue;
+            }
+
+            $this->currentId = $id;
+            $this->currentDefinition = $definition;
+
+            $this->processArguments($definition->getArguments());
+            if ($definition->getFactoryService(false)) {
+                $this->processArguments(array(new Reference($definition->getFactoryService(false))));
+            }
+            if (is_array($definition->getFactory())) {
+                $this->processArguments($definition->getFactory());
+            }
+
+            if (!$this->onlyConstructorArguments) {
+                $this->processArguments($definition->getMethodCalls());
+                $this->processArguments($definition->getProperties());
+                if ($definition->getConfigurator()) {
+                    $this->processArguments(array($definition->getConfigurator()));
+                }
+            }
+        }
+
+        foreach ($container->getAliases() as $id => $alias) {
+            $this->graph->connect($id, $alias, (string) $alias, $this->getDefinition((string) $alias), null);
+        }
+    }
+
+    /**
+     * Processes service definitions for arguments to find relationships for the service graph.
+     *
+     * @param array $arguments An array of Reference or Definition objects relating to service definitions
+     */
+    private function processArguments(array $arguments)
+    {
+        foreach ($arguments as $argument) {
+            if (is_array($argument)) {
+                $this->processArguments($argument);
+            } elseif ($argument instanceof Reference) {
+                $this->graph->connect(
+                    $this->currentId,
+                    $this->currentDefinition,
+                    $this->getDefinitionId((string) $argument),
+                    $this->getDefinition((string) $argument),
+                    $argument
+                );
+            } elseif ($argument instanceof Definition) {
+                $this->processArguments($argument->getArguments());
+                $this->processArguments($argument->getMethodCalls());
+                $this->processArguments($argument->getProperties());
+
+                if (is_array($argument->getFactory())) {
+                    $this->processArguments($argument->getFactory());
+                }
+                if ($argument->getFactoryService(false)) {
+                    $this->processArguments(array(new Reference($argument->getFactoryService(false))));
+                }
+            }
+        }
+    }
+
+    /**
+     * Returns a service definition given the full name or an alias.
+     *
+     * @param string $id A full id or alias for a service definition
+     *
+     * @return Definition|null The definition related to the supplied id
+     */
+    private function getDefinition($id)
+    {
+        $id = $this->getDefinitionId($id);
+
+        return null === $id ? null : $this->container->getDefinition($id);
+    }
+
+    private function getDefinitionId($id)
+    {
+        while ($this->container->hasAlias($id)) {
+            $id = (string) $this->container->getAlias($id);
+        }
+
+        if (!$this->container->hasDefinition($id)) {
+            return;
+        }
+
+        return $id;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/AutoAliasServicePass.php
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+
+/**
+ * Sets a service to be an alias of another one, given a format pattern.
+ */
+class AutoAliasServicePass implements CompilerPassInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function process(ContainerBuilder $container)
+    {
+        foreach ($container->findTaggedServiceIds('auto_alias') as $serviceId => $tags) {
+            foreach ($tags as $tag) {
+                if (!isset($tag['format'])) {
+                    throw new InvalidArgumentException(sprintf('Missing tag information "format" on auto_alias service "%s".', $serviceId));
+                }
+
+                $aliasId = $container->getParameterBag()->resolveValue($tag['format']);
+                if ($container->hasDefinition($aliasId) || $container->hasAlias($aliasId)) {
+                    $container->setAlias($serviceId, new Alias($aliasId));
+                }
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/AutowirePass.php
@@ -0,0 +1,286 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Guesses constructor arguments of services definitions and try to instantiate services if necessary.
+ *
+ * @author Kévin Dunglas <dunglas@gmail.com>
+ */
+class AutowirePass implements CompilerPassInterface
+{
+    private $container;
+    private $reflectionClasses = array();
+    private $definedTypes = array();
+    private $types;
+    private $notGuessableTypes = array();
+
+    /**
+     * {@inheritdoc}
+     */
+    public function process(ContainerBuilder $container)
+    {
+        $throwingAutoloader = function ($class) { throw new \ReflectionException(sprintf('Class %s does not exist', $class)); };
+        spl_autoload_register($throwingAutoloader);
+
+        try {
+            $this->container = $container;
+            foreach ($container->getDefinitions() as $id => $definition) {
+                if ($definition->isAutowired()) {
+                    $this->completeDefinition($id, $definition);
+                }
+            }
+        } catch (\Exception $e) {
+        } catch (\Throwable $e) {
+        }
+
+        spl_autoload_unregister($throwingAutoloader);
+
+        // Free memory and remove circular reference to container
+        $this->container = null;
+        $this->reflectionClasses = array();
+        $this->definedTypes = array();
+        $this->types = null;
+        $this->notGuessableTypes = array();
+
+        if (isset($e)) {
+            throw $e;
+        }
+    }
+
+    /**
+     * Wires the given definition.
+     *
+     * @param string     $id
+     * @param Definition $definition
+     *
+     * @throws RuntimeException
+     */
+    private function completeDefinition($id, Definition $definition)
+    {
+        if (!$reflectionClass = $this->getReflectionClass($id, $definition)) {
+            return;
+        }
+
+        $this->container->addClassResource($reflectionClass);
+
+        if (!$constructor = $reflectionClass->getConstructor()) {
+            return;
+        }
+
+        $arguments = $definition->getArguments();
+        foreach ($constructor->getParameters() as $index => $parameter) {
+            if (array_key_exists($index, $arguments) && '' !== $arguments[$index]) {
+                continue;
+            }
+
+            try {
+                if (!$typeHint = $parameter->getClass()) {
+                    // no default value? Then fail
+                    if (!$parameter->isOptional()) {
+                        throw new RuntimeException(sprintf('Unable to autowire argument index %d ($%s) for the service "%s". If this is an object, give it a type-hint. Otherwise, specify this argument\'s value explicitly.', $index, $parameter->name, $id));
+                    }
+
+                    // specifically pass the default value
+                    $arguments[$index] = $parameter->getDefaultValue();
+
+                    continue;
+                }
+
+                if (null === $this->types) {
+                    $this->populateAvailableTypes();
+                }
+
+                if (isset($this->types[$typeHint->name]) && !isset($this->notGuessableTypes[$typeHint->name])) {
+                    $value = new Reference($this->types[$typeHint->name]);
+                } else {
+                    try {
+                        $value = $this->createAutowiredDefinition($typeHint, $id);
+                    } catch (RuntimeException $e) {
+                        if ($parameter->allowsNull()) {
+                            $value = null;
+                        } elseif ($parameter->isDefaultValueAvailable()) {
+                            $value = $parameter->getDefaultValue();
+                        } else {
+                            throw $e;
+                        }
+                    }
+                }
+            } catch (\ReflectionException $e) {
+                // Typehint against a non-existing class
+
+                if (!$parameter->isDefaultValueAvailable()) {
+                    throw new RuntimeException(sprintf('Cannot autowire argument %s for %s because the type-hinted class does not exist (%s).', $index + 1, $definition->getClass(), $e->getMessage()), 0, $e);
+                }
+
+                $value = $parameter->getDefaultValue();
+            }
+
+            $arguments[$index] = $value;
+        }
+
+        // it's possible index 1 was set, then index 0, then 2, etc
+        // make sure that we re-order so they're injected as expected
+        ksort($arguments);
+        $definition->setArguments($arguments);
+    }
+
+    /**
+     * Populates the list of available types.
+     */
+    private function populateAvailableTypes()
+    {
+        $this->types = array();
+
+        foreach ($this->container->getDefinitions() as $id => $definition) {
+            $this->populateAvailableType($id, $definition);
+        }
+    }
+
+    /**
+     * Populates the list of available types for a given definition.
+     *
+     * @param string     $id
+     * @param Definition $definition
+     */
+    private function populateAvailableType($id, Definition $definition)
+    {
+        // Never use abstract services
+        if ($definition->isAbstract()) {
+            return;
+        }
+
+        foreach ($definition->getAutowiringTypes() as $type) {
+            $this->definedTypes[$type] = true;
+            $this->types[$type] = $id;
+        }
+
+        if (!$reflectionClass = $this->getReflectionClass($id, $definition)) {
+            return;
+        }
+
+        foreach ($reflectionClass->getInterfaces() as $reflectionInterface) {
+            $this->set($reflectionInterface->name, $id);
+        }
+
+        do {
+            $this->set($reflectionClass->name, $id);
+        } while ($reflectionClass = $reflectionClass->getParentClass());
+    }
+
+    /**
+     * Associates a type and a service id if applicable.
+     *
+     * @param string $type
+     * @param string $id
+     */
+    private function set($type, $id)
+    {
+        if (isset($this->definedTypes[$type])) {
+            return;
+        }
+
+        if (!isset($this->types[$type])) {
+            $this->types[$type] = $id;
+
+            return;
+        }
+
+        if ($this->types[$type] === $id) {
+            return;
+        }
+
+        if (!isset($this->notGuessableTypes[$type])) {
+            $this->notGuessableTypes[$type] = true;
+            $this->types[$type] = (array) $this->types[$type];
+        }
+
+        $this->types[$type][] = $id;
+    }
+
+    /**
+     * Registers a definition for the type if possible or throws an exception.
+     *
+     * @param \ReflectionClass $typeHint
+     * @param string           $id
+     *
+     * @return Reference A reference to the registered definition
+     *
+     * @throws RuntimeException
+     */
+    private function createAutowiredDefinition(\ReflectionClass $typeHint, $id)
+    {
+        if (isset($this->notGuessableTypes[$typeHint->name])) {
+            $classOrInterface = $typeHint->isInterface() ? 'interface' : 'class';
+            $matchingServices = implode(', ', $this->types[$typeHint->name]);
+
+            throw new RuntimeException(sprintf('Unable to autowire argument of type "%s" for the service "%s". Multiple services exist for this %s (%s).', $typeHint->name, $id, $classOrInterface, $matchingServices));
+        }
+
+        if (!$typeHint->isInstantiable()) {
+            $classOrInterface = $typeHint->isInterface() ? 'interface' : 'class';
+            throw new RuntimeException(sprintf('Unable to autowire argument of type "%s" for the service "%s". No services were found matching this %s and it cannot be auto-registered.', $typeHint->name, $id, $classOrInterface));
+        }
+
+        $argumentId = sprintf('autowired.%s', $typeHint->name);
+
+        $argumentDefinition = $this->container->register($argumentId, $typeHint->name);
+        $argumentDefinition->setPublic(false);
+
+        $this->populateAvailableType($argumentId, $argumentDefinition);
+
+        try {
+            $this->completeDefinition($argumentId, $argumentDefinition);
+        } catch (RuntimeException $e) {
+            $classOrInterface = $typeHint->isInterface() ? 'interface' : 'class';
+            $message = sprintf('Unable to autowire argument of type "%s" for the service "%s". No services were found matching this %s and it cannot be auto-registered.', $typeHint->name, $id, $classOrInterface);
+            throw new RuntimeException($message, 0, $e);
+        }
+
+        return new Reference($argumentId);
+    }
+
+    /**
+     * Retrieves the reflection class associated with the given service.
+     *
+     * @param string     $id
+     * @param Definition $definition
+     *
+     * @return \ReflectionClass|false
+     */
+    private function getReflectionClass($id, Definition $definition)
+    {
+        if (isset($this->reflectionClasses[$id])) {
+            return $this->reflectionClasses[$id];
+        }
+
+        // Cannot use reflection if the class isn't set
+        if (!$class = $definition->getClass()) {
+            return false;
+        }
+
+        $class = $this->container->getParameterBag()->resolveValue($class);
+
+        try {
+            $reflector = new \ReflectionClass($class);
+        } catch (\ReflectionException $e) {
+            $reflector = false;
+        }
+
+        return $this->reflectionClasses[$id] = $reflector;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php
@@ -0,0 +1,77 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Checks your services for circular references.
+ *
+ * References from method calls are ignored since we might be able to resolve
+ * these references depending on the order in which services are called.
+ *
+ * Circular reference from method calls will only be detected at run-time.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class CheckCircularReferencesPass implements CompilerPassInterface
+{
+    private $currentPath;
+    private $checkedNodes;
+
+    /**
+     * Checks the ContainerBuilder object for circular references.
+     *
+     * @param ContainerBuilder $container The ContainerBuilder instances
+     */
+    public function process(ContainerBuilder $container)
+    {
+        $graph = $container->getCompiler()->getServiceReferenceGraph();
+
+        $this->checkedNodes = array();
+        foreach ($graph->getNodes() as $id => $node) {
+            $this->currentPath = array($id);
+
+            $this->checkOutEdges($node->getOutEdges());
+        }
+    }
+
+    /**
+     * Checks for circular references.
+     *
+     * @param ServiceReferenceGraphEdge[] $edges An array of Edges
+     *
+     * @throws ServiceCircularReferenceException When a circular reference is found.
+     */
+    private function checkOutEdges(array $edges)
+    {
+        foreach ($edges as $edge) {
+            $node = $edge->getDestNode();
+            $id = $node->getId();
+
+            if (empty($this->checkedNodes[$id])) {
+                $searchKey = array_search($id, $this->currentPath);
+                $this->currentPath[] = $id;
+
+                if (false !== $searchKey) {
+                    throw new ServiceCircularReferenceException($id, array_slice($this->currentPath, $searchKey));
+                }
+
+                $this->checkOutEdges($node->getOutEdges());
+
+                $this->checkedNodes[$id] = true;
+                array_pop($this->currentPath);
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php
@@ -0,0 +1,90 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+
+/**
+ * This pass validates each definition individually only taking the information
+ * into account which is contained in the definition itself.
+ *
+ * Later passes can rely on the following, and specifically do not need to
+ * perform these checks themselves:
+ *
+ * - non synthetic, non abstract services always have a class set
+ * - synthetic services are always public
+ * - synthetic services are always of non-prototype scope
+ * - shared services are always of non-prototype scope
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class CheckDefinitionValidityPass implements CompilerPassInterface
+{
+    /**
+     * Processes the ContainerBuilder to validate the Definition.
+     *
+     * @param ContainerBuilder $container
+     *
+     * @throws RuntimeException When the Definition is invalid
+     */
+    public function process(ContainerBuilder $container)
+    {
+        foreach ($container->getDefinitions() as $id => $definition) {
+            // synthetic service is public
+            if ($definition->isSynthetic() && !$definition->isPublic()) {
+                throw new RuntimeException(sprintf('A synthetic service ("%s") must be public.', $id));
+            }
+
+            // synthetic service has non-prototype scope
+            if ($definition->isSynthetic() && ContainerInterface::SCOPE_PROTOTYPE === $definition->getScope(false)) {
+                throw new RuntimeException(sprintf('A synthetic service ("%s") cannot be of scope "prototype".', $id));
+            }
+
+            // shared service has non-prototype scope
+            if ($definition->isShared() && ContainerInterface::SCOPE_PROTOTYPE === $definition->getScope(false)) {
+                throw new RuntimeException(sprintf('A shared service ("%s") cannot be of scope "prototype".', $id));
+            }
+
+            if ($definition->getFactory() && ($definition->getFactoryClass(false) || $definition->getFactoryService(false) || $definition->getFactoryMethod(false))) {
+                throw new RuntimeException(sprintf('A service ("%s") can use either the old or the new factory syntax, not both.', $id));
+            }
+
+            // non-synthetic, non-abstract service has class
+            if (!$definition->isAbstract() && !$definition->isSynthetic() && !$definition->getClass()) {
+                if ($definition->getFactory() || $definition->getFactoryClass(false) || $definition->getFactoryService(false)) {
+                    throw new RuntimeException(sprintf('Please add the class to service "%s" even if it is constructed by a factory since we might need to add method calls based on compile-time checks.', $id));
+                }
+
+                throw new RuntimeException(sprintf(
+                    'The definition for "%s" has no class. If you intend to inject '
+                   .'this service dynamically at runtime, please mark it as synthetic=true. '
+                   .'If this is an abstract definition solely used by child definitions, '
+                   .'please add abstract=true, otherwise specify a class to get rid of this error.',
+                   $id
+                ));
+            }
+
+            // tag attribute values must be scalars
+            foreach ($definition->getTags() as $name => $tags) {
+                foreach ($tags as $attributes) {
+                    foreach ($attributes as $attribute => $value) {
+                        if (!is_scalar($value) && null !== $value) {
+                            throw new RuntimeException(sprintf('A "tags" attribute must be of a scalar-type for service "%s", tag "%s", attribute "%s".', $id, $name, $attribute));
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Checks that all references are pointing to a valid service.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class CheckExceptionOnInvalidReferenceBehaviorPass implements CompilerPassInterface
+{
+    private $container;
+    private $sourceId;
+
+    public function process(ContainerBuilder $container)
+    {
+        $this->container = $container;
+
+        foreach ($container->getDefinitions() as $id => $definition) {
+            $this->sourceId = $id;
+            $this->processDefinition($definition);
+        }
+    }
+
+    private function processDefinition(Definition $definition)
+    {
+        $this->processReferences($definition->getArguments());
+        $this->processReferences($definition->getMethodCalls());
+        $this->processReferences($definition->getProperties());
+    }
+
+    private function processReferences(array $arguments)
+    {
+        foreach ($arguments as $argument) {
+            if (is_array($argument)) {
+                $this->processReferences($argument);
+            } elseif ($argument instanceof Definition) {
+                $this->processDefinition($argument);
+            } elseif ($argument instanceof Reference && ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE === $argument->getInvalidBehavior()) {
+                $destId = (string) $argument;
+
+                if (!$this->container->has($destId)) {
+                    throw new ServiceNotFoundException($destId, $this->sourceId);
+                }
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php
@@ -0,0 +1,165 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\Exception\ScopeCrossingInjectionException;
+use Symfony\Component\DependencyInjection\Exception\ScopeWideningInjectionException;
+
+/**
+ * Checks the validity of references.
+ *
+ * The following checks are performed by this pass:
+ * - target definitions are not abstract
+ * - target definitions are of equal or wider scope
+ * - target definitions are in the same scope hierarchy
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class CheckReferenceValidityPass implements CompilerPassInterface
+{
+    private $container;
+    private $currentId;
+    private $currentScope;
+    private $currentScopeAncestors;
+    private $currentScopeChildren;
+
+    /**
+     * Processes the ContainerBuilder to validate References.
+     *
+     * @param ContainerBuilder $container
+     */
+    public function process(ContainerBuilder $container)
+    {
+        $this->container = $container;
+
+        $children = $this->container->getScopeChildren(false);
+        $ancestors = array();
+
+        $scopes = $this->container->getScopes(false);
+        foreach ($scopes as $name => $parent) {
+            $ancestors[$name] = array($parent);
+
+            while (isset($scopes[$parent])) {
+                $ancestors[$name][] = $parent = $scopes[$parent];
+            }
+        }
+
+        foreach ($container->getDefinitions() as $id => $definition) {
+            if ($definition->isSynthetic() || $definition->isAbstract()) {
+                continue;
+            }
+
+            $this->currentId = $id;
+            $this->currentScope = $scope = $definition->getScope(false);
+
+            if (ContainerInterface::SCOPE_CONTAINER === $scope) {
+                $this->currentScopeChildren = array_keys($scopes);
+                $this->currentScopeAncestors = array();
+            } elseif (ContainerInterface::SCOPE_PROTOTYPE !== $scope) {
+                $this->currentScopeChildren = isset($children[$scope]) ? $children[$scope] : array();
+                $this->currentScopeAncestors = isset($ancestors[$scope]) ? $ancestors[$scope] : array();
+            }
+
+            $this->validateReferences($definition->getArguments());
+            $this->validateReferences($definition->getMethodCalls());
+            $this->validateReferences($definition->getProperties());
+        }
+    }
+
+    /**
+     * Validates an array of References.
+     *
+     * @param array $arguments An array of Reference objects
+     *
+     * @throws RuntimeException when there is a reference to an abstract definition.
+     */
+    private function validateReferences(array $arguments)
+    {
+        foreach ($arguments as $argument) {
+            if (is_array($argument)) {
+                $this->validateReferences($argument);
+            } elseif ($argument instanceof Reference) {
+                $targetDefinition = $this->getDefinition((string) $argument);
+
+                if (null !== $targetDefinition && $targetDefinition->isAbstract()) {
+                    throw new RuntimeException(sprintf(
+                        'The definition "%s" has a reference to an abstract definition "%s". '
+                       .'Abstract definitions cannot be the target of references.',
+                       $this->currentId,
+                       $argument
+                    ));
+                }
+
+                $this->validateScope($argument, $targetDefinition);
+            }
+        }
+    }
+
+    /**
+     * Validates the scope of a single Reference.
+     *
+     * @param Reference  $reference
+     * @param Definition $definition
+     *
+     * @throws ScopeWideningInjectionException when the definition references a service of a narrower scope
+     * @throws ScopeCrossingInjectionException when the definition references a service of another scope hierarchy
+     */
+    private function validateScope(Reference $reference, Definition $definition = null)
+    {
+        if (ContainerInterface::SCOPE_PROTOTYPE === $this->currentScope) {
+            return;
+        }
+
+        if (!$reference->isStrict(false)) {
+            return;
+        }
+
+        if (null === $definition) {
+            return;
+        }
+
+        if ($this->currentScope === $scope = $definition->getScope(false)) {
+            return;
+        }
+
+        $id = (string) $reference;
+
+        if (in_array($scope, $this->currentScopeChildren, true)) {
+            throw new ScopeWideningInjectionException($this->currentId, $this->currentScope, $id, $scope);
+        }
+
+        if (!in_array($scope, $this->currentScopeAncestors, true)) {
+            throw new ScopeCrossingInjectionException($this->currentId, $this->currentScope, $id, $scope);
+        }
+    }
+
+    /**
+     * Returns the Definition given an id.
+     *
+     * @param string $id Definition identifier
+     *
+     * @return Definition
+     */
+    private function getDefinition($id)
+    {
+        if (!$this->container->hasDefinition($id)) {
+            return;
+        }
+
+        return $this->container->getDefinition($id);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/Compiler.php
@@ -0,0 +1,107 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * This class is used to remove circular dependencies between individual passes.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class Compiler
+{
+    private $passConfig;
+    private $log = array();
+    private $loggingFormatter;
+    private $serviceReferenceGraph;
+
+    public function __construct()
+    {
+        $this->passConfig = new PassConfig();
+        $this->serviceReferenceGraph = new ServiceReferenceGraph();
+        $this->loggingFormatter = new LoggingFormatter();
+    }
+
+    /**
+     * Returns the PassConfig.
+     *
+     * @return PassConfig The PassConfig instance
+     */
+    public function getPassConfig()
+    {
+        return $this->passConfig;
+    }
+
+    /**
+     * Returns the ServiceReferenceGraph.
+     *
+     * @return ServiceReferenceGraph The ServiceReferenceGraph instance
+     */
+    public function getServiceReferenceGraph()
+    {
+        return $this->serviceReferenceGraph;
+    }
+
+    /**
+     * Returns the logging formatter which can be used by compilation passes.
+     *
+     * @return LoggingFormatter
+     */
+    public function getLoggingFormatter()
+    {
+        return $this->loggingFormatter;
+    }
+
+    /**
+     * Adds a pass to the PassConfig.
+     *
+     * @param CompilerPassInterface $pass A compiler pass
+     * @param string                $type The type of the pass
+     */
+    public function addPass(CompilerPassInterface $pass, $type = PassConfig::TYPE_BEFORE_OPTIMIZATION)
+    {
+        $this->passConfig->addPass($pass, $type);
+    }
+
+    /**
+     * Adds a log message.
+     *
+     * @param string $string The log message
+     */
+    public function addLogMessage($string)
+    {
+        $this->log[] = $string;
+    }
+
+    /**
+     * Returns the log.
+     *
+     * @return array Log array
+     */
+    public function getLog()
+    {
+        return $this->log;
+    }
+
+    /**
+     * Run the Compiler and process all Passes.
+     *
+     * @param ContainerBuilder $container
+     */
+    public function compile(ContainerBuilder $container)
+    {
+        foreach ($this->passConfig->getPasses() as $pass) {
+            $pass->process($container);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/CompilerPassInterface.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Interface that must be implemented by compilation passes.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+interface CompilerPassInterface
+{
+    /**
+     * You can modify the container here before it is dumped to PHP code.
+     *
+     * @param ContainerBuilder $container
+     */
+    public function process(ContainerBuilder $container);
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/DecoratorServicePass.php
@@ -0,0 +1,68 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Alias;
+
+/**
+ * Overwrites a service but keeps the overridden one.
+ *
+ * @author Christophe Coevoet <stof@notk.org>
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Diego Saint Esteben <diego@saintesteben.me>
+ */
+class DecoratorServicePass implements CompilerPassInterface
+{
+    public function process(ContainerBuilder $container)
+    {
+        $definitions = new \SplPriorityQueue();
+        $order = PHP_INT_MAX;
+
+        foreach ($container->getDefinitions() as $id => $definition) {
+            if (!$decorated = $definition->getDecoratedService()) {
+                continue;
+            }
+            $definitions->insert(array($id, $definition), array($decorated[2], --$order));
+        }
+
+        foreach ($definitions as $arr) {
+            list($id, $definition) = $arr;
+            list($inner, $renamedId) = $definition->getDecoratedService();
+
+            $definition->setDecoratedService(null);
+
+            if (!$renamedId) {
+                $renamedId = $id.'.inner';
+            }
+
+            // we create a new alias/service for the service we are replacing
+            // to be able to reference it in the new one
+            if ($container->hasAlias($inner)) {
+                $alias = $container->getAlias($inner);
+                $public = $alias->isPublic();
+                $container->setAlias($renamedId, new Alias((string) $alias, false));
+            } else {
+                $decoratedDefinition = $container->getDefinition($inner);
+                $definition->setTags(array_merge($decoratedDefinition->getTags(), $definition->getTags()));
+                $definition->setAutowiringTypes(array_merge($decoratedDefinition->getAutowiringTypes(), $definition->getAutowiringTypes()));
+                $public = $decoratedDefinition->isPublic();
+                $decoratedDefinition->setPublic(false);
+                $decoratedDefinition->setTags(array());
+                $decoratedDefinition->setAutowiringTypes(array());
+                $container->setDefinition($renamedId, $decoratedDefinition);
+            }
+
+            $container->setAlias($inner, new Alias($id, $public));
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * A pass to automatically process extensions if they implement
+ * CompilerPassInterface.
+ *
+ * @author Wouter J <wouter@wouterj.nl>
+ */
+class ExtensionCompilerPass implements CompilerPassInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function process(ContainerBuilder $container)
+    {
+        foreach ($container->getExtensions() as $extension) {
+            if (!$extension instanceof CompilerPassInterface) {
+                continue;
+            }
+
+            $extension->process($container);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php
@@ -0,0 +1,147 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Inline service definitions where this is possible.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class InlineServiceDefinitionsPass implements RepeatablePassInterface
+{
+    private $repeatedPass;
+    private $graph;
+    private $compiler;
+    private $formatter;
+    private $currentId;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setRepeatedPass(RepeatedPass $repeatedPass)
+    {
+        $this->repeatedPass = $repeatedPass;
+    }
+
+    /**
+     * Processes the ContainerBuilder for inline service definitions.
+     *
+     * @param ContainerBuilder $container
+     */
+    public function process(ContainerBuilder $container)
+    {
+        $this->compiler = $container->getCompiler();
+        $this->formatter = $this->compiler->getLoggingFormatter();
+        $this->graph = $this->compiler->getServiceReferenceGraph();
+
+        $container->setDefinitions($this->inlineArguments($container, $container->getDefinitions(), true));
+    }
+
+    /**
+     * Processes inline arguments.
+     *
+     * @param ContainerBuilder $container The ContainerBuilder
+     * @param array            $arguments An array of arguments
+     * @param bool             $isRoot    If we are processing the root definitions or not
+     *
+     * @return array
+     */
+    private function inlineArguments(ContainerBuilder $container, array $arguments, $isRoot = false)
+    {
+        foreach ($arguments as $k => $argument) {
+            if ($isRoot) {
+                $this->currentId = $k;
+            }
+            if (is_array($argument)) {
+                $arguments[$k] = $this->inlineArguments($container, $argument);
+            } elseif ($argument instanceof Reference) {
+                if (!$container->hasDefinition($id = (string) $argument)) {
+                    continue;
+                }
+
+                if ($this->isInlineableDefinition($container, $id, $definition = $container->getDefinition($id))) {
+                    $this->compiler->addLogMessage($this->formatter->formatInlineService($this, $id, $this->currentId));
+
+                    if ($definition->isShared() && ContainerInterface::SCOPE_PROTOTYPE !== $definition->getScope(false)) {
+                        $arguments[$k] = $definition;
+                    } else {
+                        $arguments[$k] = clone $definition;
+                    }
+                }
+            } elseif ($argument instanceof Definition) {
+                $argument->setArguments($this->inlineArguments($container, $argument->getArguments()));
+                $argument->setMethodCalls($this->inlineArguments($container, $argument->getMethodCalls()));
+                $argument->setProperties($this->inlineArguments($container, $argument->getProperties()));
+
+                $configurator = $this->inlineArguments($container, array($argument->getConfigurator()));
+                $argument->setConfigurator($configurator[0]);
+
+                $factory = $this->inlineArguments($container, array($argument->getFactory()));
+                $argument->setFactory($factory[0]);
+            }
+        }
+
+        return $arguments;
+    }
+
+    /**
+     * Checks if the definition is inlineable.
+     *
+     * @param ContainerBuilder $container
+     * @param string           $id
+     * @param Definition       $definition
+     *
+     * @return bool If the definition is inlineable
+     */
+    private function isInlineableDefinition(ContainerBuilder $container, $id, Definition $definition)
+    {
+        if (!$definition->isShared() || ContainerInterface::SCOPE_PROTOTYPE === $definition->getScope(false)) {
+            return true;
+        }
+
+        if ($definition->isPublic() || $definition->isLazy()) {
+            return false;
+        }
+
+        if (!$this->graph->hasNode($id)) {
+            return true;
+        }
+
+        if ($this->currentId == $id) {
+            return false;
+        }
+
+        $ids = array();
+        foreach ($this->graph->getNode($id)->getInEdges() as $edge) {
+            $ids[] = $edge->getSourceNode()->getId();
+        }
+
+        if (count(array_unique($ids)) > 1) {
+            return false;
+        }
+
+        if (count($ids) > 1 && is_array($factory = $definition->getFactory()) && ($factory[0] instanceof Reference || $factory[0] instanceof Definition)) {
+            return false;
+        }
+
+        if (count($ids) > 1 && $definition->getFactoryService(false)) {
+            return false;
+        }
+
+        return $container->getDefinition(reset($ids))->getScope(false) === $definition->getScope(false);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/LoggingFormatter.php
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+/**
+ * Used to format logging messages during the compilation.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class LoggingFormatter
+{
+    public function formatRemoveService(CompilerPassInterface $pass, $id, $reason)
+    {
+        return $this->format($pass, sprintf('Removed service "%s"; reason: %s.', $id, $reason));
+    }
+
+    public function formatInlineService(CompilerPassInterface $pass, $id, $target)
+    {
+        return $this->format($pass, sprintf('Inlined service "%s" to "%s".', $id, $target));
+    }
+
+    public function formatUpdateReference(CompilerPassInterface $pass, $serviceId, $oldDestId, $newDestId)
+    {
+        return $this->format($pass, sprintf('Changed reference of service "%s" previously pointing to "%s" to "%s".', $serviceId, $oldDestId, $newDestId));
+    }
+
+    public function formatResolveInheritance(CompilerPassInterface $pass, $childId, $parentId)
+    {
+        return $this->format($pass, sprintf('Resolving inheritance for "%s" (parent: %s).', $childId, $parentId));
+    }
+
+    public function format(CompilerPassInterface $pass, $message)
+    {
+        return sprintf('%s: %s', get_class($pass), $message);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php
@@ -0,0 +1,64 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
+
+/**
+ * Merges extension configs into the container builder.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class MergeExtensionConfigurationPass implements CompilerPassInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function process(ContainerBuilder $container)
+    {
+        $parameters = $container->getParameterBag()->all();
+        $definitions = $container->getDefinitions();
+        $aliases = $container->getAliases();
+        $exprLangProviders = $container->getExpressionLanguageProviders();
+
+        foreach ($container->getExtensions() as $extension) {
+            if ($extension instanceof PrependExtensionInterface) {
+                $extension->prepend($container);
+            }
+        }
+
+        foreach ($container->getExtensions() as $name => $extension) {
+            if (!$config = $container->getExtensionConfig($name)) {
+                // this extension was not called
+                continue;
+            }
+            $config = $container->getParameterBag()->resolveValue($config);
+
+            $tmpContainer = new ContainerBuilder($container->getParameterBag());
+            $tmpContainer->setResourceTracking($container->isTrackingResources());
+            $tmpContainer->addObjectResource($extension);
+
+            foreach ($exprLangProviders as $provider) {
+                $tmpContainer->addExpressionLanguageProvider($provider);
+            }
+
+            $extension->load($config, $tmpContainer);
+
+            $container->merge($tmpContainer);
+            $container->getParameterBag()->add($parameters);
+        }
+
+        $container->addDefinitions($definitions);
+        $container->addAliases($aliases);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/PassConfig.php
@@ -0,0 +1,224 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+
+/**
+ * Compiler Pass Configuration.
+ *
+ * This class has a default configuration embedded.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class PassConfig
+{
+    const TYPE_AFTER_REMOVING = 'afterRemoving';
+    const TYPE_BEFORE_OPTIMIZATION = 'beforeOptimization';
+    const TYPE_BEFORE_REMOVING = 'beforeRemoving';
+    const TYPE_OPTIMIZE = 'optimization';
+    const TYPE_REMOVE = 'removing';
+
+    private $mergePass;
+    private $afterRemovingPasses = array();
+    private $beforeOptimizationPasses = array();
+    private $beforeRemovingPasses = array();
+    private $optimizationPasses;
+    private $removingPasses;
+
+    public function __construct()
+    {
+        $this->mergePass = new MergeExtensionConfigurationPass();
+
+        $this->optimizationPasses = array(
+            new ExtensionCompilerPass(),
+            new ResolveDefinitionTemplatesPass(),
+            new DecoratorServicePass(),
+            new ResolveParameterPlaceHoldersPass(),
+            new CheckDefinitionValidityPass(),
+            new ResolveReferencesToAliasesPass(),
+            new ResolveInvalidReferencesPass(),
+            new AutowirePass(),
+            new AnalyzeServiceReferencesPass(true),
+            new CheckCircularReferencesPass(),
+            new CheckReferenceValidityPass(),
+        );
+
+        $this->removingPasses = array(
+            new RemovePrivateAliasesPass(),
+            new ReplaceAliasByActualDefinitionPass(),
+            new RemoveAbstractDefinitionsPass(),
+            new RepeatedPass(array(
+                new AnalyzeServiceReferencesPass(),
+                new InlineServiceDefinitionsPass(),
+                new AnalyzeServiceReferencesPass(),
+                new RemoveUnusedDefinitionsPass(),
+            )),
+            new CheckExceptionOnInvalidReferenceBehaviorPass(),
+        );
+    }
+
+    /**
+     * Returns all passes in order to be processed.
+     *
+     * @return array An array of all passes to process
+     */
+    public function getPasses()
+    {
+        return array_merge(
+            array($this->mergePass),
+            $this->beforeOptimizationPasses,
+            $this->optimizationPasses,
+            $this->beforeRemovingPasses,
+            $this->removingPasses,
+            $this->afterRemovingPasses
+        );
+    }
+
+    /**
+     * Adds a pass.
+     *
+     * @param CompilerPassInterface $pass A Compiler pass
+     * @param string                $type The pass type
+     *
+     * @throws InvalidArgumentException when a pass type doesn't exist
+     */
+    public function addPass(CompilerPassInterface $pass, $type = self::TYPE_BEFORE_OPTIMIZATION)
+    {
+        $property = $type.'Passes';
+        if (!isset($this->$property)) {
+            throw new InvalidArgumentException(sprintf('Invalid type "%s".', $type));
+        }
+
+        $this->{$property}[] = $pass;
+    }
+
+    /**
+     * Gets all passes for the AfterRemoving pass.
+     *
+     * @return array An array of passes
+     */
+    public function getAfterRemovingPasses()
+    {
+        return $this->afterRemovingPasses;
+    }
+
+    /**
+     * Gets all passes for the BeforeOptimization pass.
+     *
+     * @return array An array of passes
+     */
+    public function getBeforeOptimizationPasses()
+    {
+        return $this->beforeOptimizationPasses;
+    }
+
+    /**
+     * Gets all passes for the BeforeRemoving pass.
+     *
+     * @return array An array of passes
+     */
+    public function getBeforeRemovingPasses()
+    {
+        return $this->beforeRemovingPasses;
+    }
+
+    /**
+     * Gets all passes for the Optimization pass.
+     *
+     * @return array An array of passes
+     */
+    public function getOptimizationPasses()
+    {
+        return $this->optimizationPasses;
+    }
+
+    /**
+     * Gets all passes for the Removing pass.
+     *
+     * @return array An array of passes
+     */
+    public function getRemovingPasses()
+    {
+        return $this->removingPasses;
+    }
+
+    /**
+     * Gets the Merge pass.
+     *
+     * @return CompilerPassInterface The merge pass
+     */
+    public function getMergePass()
+    {
+        return $this->mergePass;
+    }
+
+    /**
+     * Sets the Merge Pass.
+     *
+     * @param CompilerPassInterface $pass The merge pass
+     */
+    public function setMergePass(CompilerPassInterface $pass)
+    {
+        $this->mergePass = $pass;
+    }
+
+    /**
+     * Sets the AfterRemoving passes.
+     *
+     * @param array $passes An array of passes
+     */
+    public function setAfterRemovingPasses(array $passes)
+    {
+        $this->afterRemovingPasses = $passes;
+    }
+
+    /**
+     * Sets the BeforeOptimization passes.
+     *
+     * @param array $passes An array of passes
+     */
+    public function setBeforeOptimizationPasses(array $passes)
+    {
+        $this->beforeOptimizationPasses = $passes;
+    }
+
+    /**
+     * Sets the BeforeRemoving passes.
+     *
+     * @param array $passes An array of passes
+     */
+    public function setBeforeRemovingPasses(array $passes)
+    {
+        $this->beforeRemovingPasses = $passes;
+    }
+
+    /**
+     * Sets the Optimization passes.
+     *
+     * @param array $passes An array of passes
+     */
+    public function setOptimizationPasses(array $passes)
+    {
+        $this->optimizationPasses = $passes;
+    }
+
+    /**
+     * Sets the Removing passes.
+     *
+     * @param array $passes An array of passes
+     */
+    public function setRemovingPasses(array $passes)
+    {
+        $this->removingPasses = $passes;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Removes abstract Definitions.
+ */
+class RemoveAbstractDefinitionsPass implements CompilerPassInterface
+{
+    /**
+     * Removes abstract definitions from the ContainerBuilder.
+     *
+     * @param ContainerBuilder $container
+     */
+    public function process(ContainerBuilder $container)
+    {
+        $compiler = $container->getCompiler();
+        $formatter = $compiler->getLoggingFormatter();
+
+        foreach ($container->getDefinitions() as $id => $definition) {
+            if ($definition->isAbstract()) {
+                $container->removeDefinition($id);
+                $compiler->addLogMessage($formatter->formatRemoveService($this, $id, 'abstract'));
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Remove private aliases from the container. They were only used to establish
+ * dependencies between services, and these dependencies have been resolved in
+ * one of the previous passes.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class RemovePrivateAliasesPass implements CompilerPassInterface
+{
+    /**
+     * Removes private aliases from the ContainerBuilder.
+     *
+     * @param ContainerBuilder $container
+     */
+    public function process(ContainerBuilder $container)
+    {
+        $compiler = $container->getCompiler();
+        $formatter = $compiler->getLoggingFormatter();
+
+        foreach ($container->getAliases() as $id => $alias) {
+            if ($alias->isPublic()) {
+                continue;
+            }
+
+            $container->removeAlias($id);
+            $compiler->addLogMessage($formatter->formatRemoveService($this, $id, 'private alias'));
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php
@@ -0,0 +1,84 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Removes unused service definitions from the container.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class RemoveUnusedDefinitionsPass implements RepeatablePassInterface
+{
+    private $repeatedPass;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setRepeatedPass(RepeatedPass $repeatedPass)
+    {
+        $this->repeatedPass = $repeatedPass;
+    }
+
+    /**
+     * Processes the ContainerBuilder to remove unused definitions.
+     *
+     * @param ContainerBuilder $container
+     */
+    public function process(ContainerBuilder $container)
+    {
+        $compiler = $container->getCompiler();
+        $formatter = $compiler->getLoggingFormatter();
+        $graph = $compiler->getServiceReferenceGraph();
+
+        $hasChanged = false;
+        foreach ($container->getDefinitions() as $id => $definition) {
+            if ($definition->isPublic()) {
+                continue;
+            }
+
+            if ($graph->hasNode($id)) {
+                $edges = $graph->getNode($id)->getInEdges();
+                $referencingAliases = array();
+                $sourceIds = array();
+                foreach ($edges as $edge) {
+                    $node = $edge->getSourceNode();
+                    $sourceIds[] = $node->getId();
+
+                    if ($node->isAlias()) {
+                        $referencingAliases[] = $node->getValue();
+                    }
+                }
+                $isReferenced = (count(array_unique($sourceIds)) - count($referencingAliases)) > 0;
+            } else {
+                $referencingAliases = array();
+                $isReferenced = false;
+            }
+
+            if (1 === count($referencingAliases) && false === $isReferenced) {
+                $container->setDefinition((string) reset($referencingAliases), $definition);
+                $definition->setPublic(true);
+                $container->removeDefinition($id);
+                $compiler->addLogMessage($formatter->formatRemoveService($this, $id, 'replaces alias '.reset($referencingAliases)));
+            } elseif (0 === count($referencingAliases) && false === $isReferenced) {
+                $container->removeDefinition($id);
+                $compiler->addLogMessage($formatter->formatRemoveService($this, $id, 'unused'));
+                $hasChanged = true;
+            }
+        }
+
+        if ($hasChanged) {
+            $this->repeatedPass->setRepeat();
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/RepeatablePassInterface.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+/**
+ * Interface that must be implemented by passes that are run as part of an
+ * RepeatedPass.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+interface RepeatablePassInterface extends CompilerPassInterface
+{
+    /**
+     * Sets the RepeatedPass interface.
+     *
+     * @param RepeatedPass $repeatedPass
+     */
+    public function setRepeatedPass(RepeatedPass $repeatedPass);
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/RepeatedPass.php
@@ -0,0 +1,84 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+
+/**
+ * A pass that might be run repeatedly.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class RepeatedPass implements CompilerPassInterface
+{
+    /**
+     * @var bool
+     */
+    private $repeat = false;
+
+    /**
+     * @var RepeatablePassInterface[]
+     */
+    private $passes;
+
+    /**
+     * @param RepeatablePassInterface[] $passes An array of RepeatablePassInterface objects
+     *
+     * @throws InvalidArgumentException when the passes don't implement RepeatablePassInterface
+     */
+    public function __construct(array $passes)
+    {
+        foreach ($passes as $pass) {
+            if (!$pass instanceof RepeatablePassInterface) {
+                throw new InvalidArgumentException('$passes must be an array of RepeatablePassInterface.');
+            }
+
+            $pass->setRepeatedPass($this);
+        }
+
+        $this->passes = $passes;
+    }
+
+    /**
+     * Process the repeatable passes that run more than once.
+     *
+     * @param ContainerBuilder $container
+     */
+    public function process(ContainerBuilder $container)
+    {
+        do {
+            $this->repeat = false;
+            foreach ($this->passes as $pass) {
+                $pass->process($container);
+            }
+        } while ($this->repeat);
+    }
+
+    /**
+     * Sets if the pass should repeat.
+     */
+    public function setRepeat()
+    {
+        $this->repeat = true;
+    }
+
+    /**
+     * Returns the passes.
+     *
+     * @return RepeatablePassInterface[] An array of RepeatablePassInterface objects
+     */
+    public function getPasses()
+    {
+        return $this->passes;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php
@@ -0,0 +1,144 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Replaces aliases with actual service definitions, effectively removing these
+ * aliases.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ReplaceAliasByActualDefinitionPass implements CompilerPassInterface
+{
+    private $compiler;
+    private $formatter;
+
+    /**
+     * Process the Container to replace aliases with service definitions.
+     *
+     * @param ContainerBuilder $container
+     *
+     * @throws InvalidArgumentException if the service definition does not exist
+     */
+    public function process(ContainerBuilder $container)
+    {
+        // Setup
+        $this->compiler = $container->getCompiler();
+        $this->formatter = $this->compiler->getLoggingFormatter();
+        // First collect all alias targets that need to be replaced
+        $seenAliasTargets = array();
+        $replacements = array();
+        foreach ($container->getAliases() as $definitionId => $target) {
+            $targetId = (string) $target;
+            // Special case: leave this target alone
+            if ('service_container' === $targetId) {
+                continue;
+            }
+            // Check if target needs to be replaces
+            if (isset($replacements[$targetId])) {
+                $container->setAlias($definitionId, $replacements[$targetId]);
+            }
+            // No neeed to process the same target twice
+            if (isset($seenAliasTargets[$targetId])) {
+                continue;
+            }
+            // Process new target
+            $seenAliasTargets[$targetId] = true;
+            try {
+                $definition = $container->getDefinition($targetId);
+            } catch (InvalidArgumentException $e) {
+                throw new InvalidArgumentException(sprintf('Unable to replace alias "%s" with actual definition "%s".', $definitionId, $targetId), null, $e);
+            }
+            if ($definition->isPublic()) {
+                continue;
+            }
+            // Remove private definition and schedule for replacement
+            $definition->setPublic(true);
+            $container->setDefinition($definitionId, $definition);
+            $container->removeDefinition($targetId);
+            $replacements[$targetId] = $definitionId;
+        }
+
+        // Now replace target instances in all definitions
+        foreach ($container->getDefinitions() as $definitionId => $definition) {
+            $definition->setArguments($this->updateArgumentReferences($replacements, $definitionId, $definition->getArguments()));
+            $definition->setMethodCalls($this->updateArgumentReferences($replacements, $definitionId, $definition->getMethodCalls()));
+            $definition->setProperties($this->updateArgumentReferences($replacements, $definitionId, $definition->getProperties()));
+            $definition->setFactoryService($this->updateFactoryReferenceId($replacements, $definition->getFactoryService(false)), false);
+            $definition->setFactory($this->updateFactoryReference($replacements, $definition->getFactory()));
+        }
+    }
+
+    /**
+     * Recursively updates references in an array.
+     *
+     * @param array  $replacements Table of aliases to replace
+     * @param string $definitionId Identifier of this definition
+     * @param array  $arguments    Where to replace the aliases
+     *
+     * @return array
+     */
+    private function updateArgumentReferences(array $replacements, $definitionId, array $arguments)
+    {
+        foreach ($arguments as $k => $argument) {
+            // Handle recursion step
+            if (is_array($argument)) {
+                $arguments[$k] = $this->updateArgumentReferences($replacements, $definitionId, $argument);
+                continue;
+            }
+            // Skip arguments that don't need replacement
+            if (!$argument instanceof Reference) {
+                continue;
+            }
+            $referenceId = (string) $argument;
+            if (!isset($replacements[$referenceId])) {
+                continue;
+            }
+            // Perform the replacement
+            $newId = $replacements[$referenceId];
+            $arguments[$k] = new Reference($newId, $argument->getInvalidBehavior());
+            $this->compiler->addLogMessage($this->formatter->formatUpdateReference($this, $definitionId, $referenceId, $newId));
+        }
+
+        return $arguments;
+    }
+
+    /**
+     * Returns the updated reference for the factory service.
+     *
+     * @param array       $replacements Table of aliases to replace
+     * @param string|null $referenceId  Factory service reference identifier
+     *
+     * @return string|null
+     */
+    private function updateFactoryReferenceId(array $replacements, $referenceId)
+    {
+        if (null === $referenceId) {
+            return;
+        }
+
+        return isset($replacements[$referenceId]) ? $replacements[$referenceId] : $referenceId;
+    }
+
+    private function updateFactoryReference(array $replacements, $factory)
+    {
+        if (is_array($factory) && $factory[0] instanceof Reference && isset($replacements[$referenceId = (string) $factory[0]])) {
+            $factory[0] = new Reference($replacements[$referenceId], $factory[0]->getInvalidBehavior());
+        }
+
+        return $factory;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/ResolveDefinitionTemplatesPass.php
@@ -0,0 +1,223 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\DefinitionDecorator;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+
+/**
+ * This replaces all DefinitionDecorator instances with their equivalent fully
+ * merged Definition instance.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ResolveDefinitionTemplatesPass implements CompilerPassInterface
+{
+    private $compiler;
+    private $formatter;
+    private $currentId;
+
+    /**
+     * Process the ContainerBuilder to replace DefinitionDecorator instances with their real Definition instances.
+     *
+     * @param ContainerBuilder $container
+     */
+    public function process(ContainerBuilder $container)
+    {
+        $this->compiler = $container->getCompiler();
+        $this->formatter = $this->compiler->getLoggingFormatter();
+
+        $container->setDefinitions($this->resolveArguments($container, $container->getDefinitions(), true));
+    }
+
+    /**
+     * Resolves definition decorator arguments.
+     *
+     * @param ContainerBuilder $container The ContainerBuilder
+     * @param array            $arguments An array of arguments
+     * @param bool             $isRoot    If we are processing the root definitions or not
+     *
+     * @return array
+     */
+    private function resolveArguments(ContainerBuilder $container, array $arguments, $isRoot = false)
+    {
+        foreach ($arguments as $k => $argument) {
+            if ($isRoot) {
+                // yes, we are specifically fetching the definition from the
+                // container to ensure we are not operating on stale data
+                $arguments[$k] = $argument = $container->getDefinition($k);
+                $this->currentId = $k;
+            }
+            if (is_array($argument)) {
+                $arguments[$k] = $this->resolveArguments($container, $argument);
+            } elseif ($argument instanceof Definition) {
+                if ($argument instanceof DefinitionDecorator) {
+                    $arguments[$k] = $argument = $this->resolveDefinition($container, $argument);
+                    if ($isRoot) {
+                        $container->setDefinition($k, $argument);
+                    }
+                }
+                $argument->setArguments($this->resolveArguments($container, $argument->getArguments()));
+                $argument->setMethodCalls($this->resolveArguments($container, $argument->getMethodCalls()));
+                $argument->setProperties($this->resolveArguments($container, $argument->getProperties()));
+
+                $configurator = $this->resolveArguments($container, array($argument->getConfigurator()));
+                $argument->setConfigurator($configurator[0]);
+
+                $factory = $this->resolveArguments($container, array($argument->getFactory()));
+                $argument->setFactory($factory[0]);
+            }
+        }
+
+        return $arguments;
+    }
+
+    /**
+     * Resolves the definition.
+     *
+     * @param ContainerBuilder    $container  The ContainerBuilder
+     * @param DefinitionDecorator $definition
+     *
+     * @return Definition
+     *
+     * @throws \RuntimeException When the definition is invalid
+     */
+    private function resolveDefinition(ContainerBuilder $container, DefinitionDecorator $definition)
+    {
+        if (!$container->hasDefinition($parent = $definition->getParent())) {
+            throw new RuntimeException(sprintf('The parent definition "%s" defined for definition "%s" does not exist.', $parent, $this->currentId));
+        }
+
+        $parentDef = $container->getDefinition($parent);
+        if ($parentDef instanceof DefinitionDecorator) {
+            $id = $this->currentId;
+            $this->currentId = $parent;
+            $parentDef = $this->resolveDefinition($container, $parentDef);
+            $container->setDefinition($parent, $parentDef);
+            $this->currentId = $id;
+        }
+
+        $this->compiler->addLogMessage($this->formatter->formatResolveInheritance($this, $this->currentId, $parent));
+        $def = new Definition();
+
+        // merge in parent definition
+        // purposely ignored attributes: scope, abstract, tags
+        $def->setClass($parentDef->getClass());
+        $def->setArguments($parentDef->getArguments());
+        $def->setMethodCalls($parentDef->getMethodCalls());
+        $def->setProperties($parentDef->getProperties());
+        $def->setAutowiringTypes($parentDef->getAutowiringTypes());
+        if ($parentDef->getFactoryClass(false)) {
+            $def->setFactoryClass($parentDef->getFactoryClass(false));
+        }
+        if ($parentDef->getFactoryMethod(false)) {
+            $def->setFactoryMethod($parentDef->getFactoryMethod(false));
+        }
+        if ($parentDef->getFactoryService(false)) {
+            $def->setFactoryService($parentDef->getFactoryService(false));
+        }
+        if ($parentDef->isDeprecated()) {
+            $def->setDeprecated(true, $parentDef->getDeprecationMessage('%service_id%'));
+        }
+        $def->setFactory($parentDef->getFactory());
+        $def->setConfigurator($parentDef->getConfigurator());
+        $def->setFile($parentDef->getFile());
+        $def->setPublic($parentDef->isPublic());
+        $def->setLazy($parentDef->isLazy());
+        $def->setAutowired($parentDef->isAutowired());
+
+        // overwrite with values specified in the decorator
+        $changes = $definition->getChanges();
+        if (isset($changes['class'])) {
+            $def->setClass($definition->getClass());
+        }
+        if (isset($changes['factory_class'])) {
+            $def->setFactoryClass($definition->getFactoryClass(false));
+        }
+        if (isset($changes['factory_method'])) {
+            $def->setFactoryMethod($definition->getFactoryMethod(false));
+        }
+        if (isset($changes['factory_service'])) {
+            $def->setFactoryService($definition->getFactoryService(false));
+        }
+        if (isset($changes['factory'])) {
+            $def->setFactory($definition->getFactory());
+        }
+        if (isset($changes['configurator'])) {
+            $def->setConfigurator($definition->getConfigurator());
+        }
+        if (isset($changes['file'])) {
+            $def->setFile($definition->getFile());
+        }
+        if (isset($changes['public'])) {
+            $def->setPublic($definition->isPublic());
+        }
+        if (isset($changes['lazy'])) {
+            $def->setLazy($definition->isLazy());
+        }
+        if (isset($changes['deprecated'])) {
+            $def->setDeprecated($definition->isDeprecated(), $definition->getDeprecationMessage('%service_id%'));
+        }
+        if (isset($changes['autowire'])) {
+            $def->setAutowired($definition->isAutowired());
+        }
+        if (isset($changes['decorated_service'])) {
+            $decoratedService = $definition->getDecoratedService();
+            if (null === $decoratedService) {
+                $def->setDecoratedService($decoratedService);
+            } else {
+                $def->setDecoratedService($decoratedService[0], $decoratedService[1], $decoratedService[2]);
+            }
+        }
+
+        // merge arguments
+        foreach ($definition->getArguments() as $k => $v) {
+            if (is_numeric($k)) {
+                $def->addArgument($v);
+                continue;
+            }
+
+            if (0 !== strpos($k, 'index_')) {
+                throw new RuntimeException(sprintf('Invalid argument key "%s" found.', $k));
+            }
+
+            $index = (int) substr($k, strlen('index_'));
+            $def->replaceArgument($index, $v);
+        }
+
+        // merge properties
+        foreach ($definition->getProperties() as $k => $v) {
+            $def->setProperty($k, $v);
+        }
+
+        // append method calls
+        if (count($calls = $definition->getMethodCalls()) > 0) {
+            $def->setMethodCalls(array_merge($def->getMethodCalls(), $calls));
+        }
+
+        // merge autowiring types
+        foreach ($definition->getAutowiringTypes() as $autowiringType) {
+            $def->addAutowiringType($autowiringType);
+        }
+
+        // these attributes are always taken from the child
+        $def->setAbstract($definition->isAbstract());
+        $def->setScope($definition->getScope(false), false);
+        $def->setShared($definition->isShared());
+        $def->setTags($definition->getTags());
+
+        return $def;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php
@@ -0,0 +1,105 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+
+/**
+ * Emulates the invalid behavior if the reference is not found within the
+ * container.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ResolveInvalidReferencesPass implements CompilerPassInterface
+{
+    private $container;
+
+    /**
+     * Process the ContainerBuilder to resolve invalid references.
+     *
+     * @param ContainerBuilder $container
+     */
+    public function process(ContainerBuilder $container)
+    {
+        $this->container = $container;
+        foreach ($container->getDefinitions() as $definition) {
+            if ($definition->isSynthetic() || $definition->isAbstract()) {
+                continue;
+            }
+
+            $definition->setArguments(
+                $this->processArguments($definition->getArguments())
+            );
+
+            $calls = array();
+            foreach ($definition->getMethodCalls() as $call) {
+                try {
+                    $calls[] = array($call[0], $this->processArguments($call[1], true));
+                } catch (RuntimeException $e) {
+                    // this call is simply removed
+                }
+            }
+            $definition->setMethodCalls($calls);
+
+            $properties = array();
+            foreach ($definition->getProperties() as $name => $value) {
+                try {
+                    $value = $this->processArguments(array($value), true);
+                    $properties[$name] = reset($value);
+                } catch (RuntimeException $e) {
+                    // ignore property
+                }
+            }
+            $definition->setProperties($properties);
+        }
+    }
+
+    /**
+     * Processes arguments to determine invalid references.
+     *
+     * @param array $arguments    An array of Reference objects
+     * @param bool  $inMethodCall
+     *
+     * @return array
+     *
+     * @throws RuntimeException When the config is invalid
+     */
+    private function processArguments(array $arguments, $inMethodCall = false)
+    {
+        foreach ($arguments as $k => $argument) {
+            if (is_array($argument)) {
+                $arguments[$k] = $this->processArguments($argument, $inMethodCall);
+            } elseif ($argument instanceof Reference) {
+                $id = (string) $argument;
+
+                $invalidBehavior = $argument->getInvalidBehavior();
+                $exists = $this->container->has($id);
+
+                // resolve invalid behavior
+                if (!$exists && ContainerInterface::NULL_ON_INVALID_REFERENCE === $invalidBehavior) {
+                    $arguments[$k] = null;
+                } elseif (!$exists && ContainerInterface::IGNORE_ON_INVALID_REFERENCE === $invalidBehavior) {
+                    if ($inMethodCall) {
+                        throw new RuntimeException('Method shouldn\'t be called.');
+                    }
+
+                    $arguments[$k] = null;
+                }
+            }
+        }
+
+        return $arguments;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
+
+/**
+ * Resolves all parameter placeholders "%somevalue%" to their real values.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ResolveParameterPlaceHoldersPass implements CompilerPassInterface
+{
+    /**
+     * Processes the ContainerBuilder to resolve parameter placeholders.
+     *
+     * @param ContainerBuilder $container
+     *
+     * @throws ParameterNotFoundException
+     */
+    public function process(ContainerBuilder $container)
+    {
+        $parameterBag = $container->getParameterBag();
+
+        foreach ($container->getDefinitions() as $id => $definition) {
+            try {
+                $definition->setClass($parameterBag->resolveValue($definition->getClass()));
+                $definition->setFile($parameterBag->resolveValue($definition->getFile()));
+                $definition->setArguments($parameterBag->resolveValue($definition->getArguments()));
+                if ($definition->getFactoryClass(false)) {
+                    $definition->setFactoryClass($parameterBag->resolveValue($definition->getFactoryClass(false)));
+                }
+
+                $factory = $definition->getFactory();
+
+                if (is_array($factory) && isset($factory[0])) {
+                    $factory[0] = $parameterBag->resolveValue($factory[0]);
+                    $definition->setFactory($factory);
+                }
+
+                $calls = array();
+                foreach ($definition->getMethodCalls() as $name => $arguments) {
+                    $calls[$parameterBag->resolveValue($name)] = $parameterBag->resolveValue($arguments);
+                }
+                $definition->setMethodCalls($calls);
+
+                $definition->setProperties($parameterBag->resolveValue($definition->getProperties()));
+            } catch (ParameterNotFoundException $e) {
+                $e->setSourceId($id);
+
+                throw $e;
+            }
+        }
+
+        $aliases = array();
+        foreach ($container->getAliases() as $name => $target) {
+            $aliases[$parameterBag->resolveValue($name)] = $parameterBag->resolveValue($target);
+        }
+        $container->setAliases($aliases);
+
+        $parameterBag->resolve();
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php
@@ -0,0 +1,125 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Replaces all references to aliases with references to the actual service.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ResolveReferencesToAliasesPass implements CompilerPassInterface
+{
+    private $container;
+
+    /**
+     * Processes the ContainerBuilder to replace references to aliases with actual service references.
+     *
+     * @param ContainerBuilder $container
+     */
+    public function process(ContainerBuilder $container)
+    {
+        $this->container = $container;
+
+        foreach ($container->getDefinitions() as $definition) {
+            if ($definition->isSynthetic() || $definition->isAbstract()) {
+                continue;
+            }
+
+            $definition->setArguments($this->processArguments($definition->getArguments()));
+            $definition->setMethodCalls($this->processArguments($definition->getMethodCalls()));
+            $definition->setProperties($this->processArguments($definition->getProperties()));
+            $definition->setFactory($this->processFactory($definition->getFactory()));
+            $definition->setFactoryService($this->processFactoryService($definition->getFactoryService(false)), false);
+        }
+
+        foreach ($container->getAliases() as $id => $alias) {
+            $aliasId = (string) $alias;
+            if ($aliasId !== $defId = $this->getDefinitionId($aliasId)) {
+                $container->setAlias($id, new Alias($defId, $alias->isPublic()));
+            }
+        }
+    }
+
+    /**
+     * Processes the arguments to replace aliases.
+     *
+     * @param array $arguments An array of References
+     *
+     * @return array An array of References
+     */
+    private function processArguments(array $arguments)
+    {
+        foreach ($arguments as $k => $argument) {
+            if (is_array($argument)) {
+                $arguments[$k] = $this->processArguments($argument);
+            } elseif ($argument instanceof Reference) {
+                $defId = $this->getDefinitionId($id = (string) $argument);
+
+                if ($defId !== $id) {
+                    $arguments[$k] = new Reference($defId, $argument->getInvalidBehavior(), $argument->isStrict(false));
+                }
+            }
+        }
+
+        return $arguments;
+    }
+
+    private function processFactoryService($factoryService)
+    {
+        if (null === $factoryService) {
+            return;
+        }
+
+        return $this->getDefinitionId($factoryService);
+    }
+
+    private function processFactory($factory)
+    {
+        if (null === $factory || !is_array($factory) || !$factory[0] instanceof Reference) {
+            return $factory;
+        }
+
+        $defId = $this->getDefinitionId($id = (string) $factory[0]);
+
+        if ($defId !== $id) {
+            $factory[0] = new Reference($defId, $factory[0]->getInvalidBehavior(), $factory[0]->isStrict(false));
+        }
+
+        return $factory;
+    }
+
+    /**
+     * Resolves an alias into a definition id.
+     *
+     * @param string $id The definition or alias id to resolve
+     *
+     * @return string The definition id with aliases resolved
+     */
+    private function getDefinitionId($id)
+    {
+        $seen = array();
+        while ($this->container->hasAlias($id)) {
+            if (isset($seen[$id])) {
+                throw new ServiceCircularReferenceException($id, array_keys($seen));
+            }
+            $seen[$id] = true;
+            $id = (string) $this->container->getAlias($id);
+        }
+
+        return $id;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php
@@ -0,0 +1,114 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+
+/**
+ * This is a directed graph of your services.
+ *
+ * This information can be used by your compiler passes instead of collecting
+ * it themselves which improves performance quite a lot.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ServiceReferenceGraph
+{
+    /**
+     * @var ServiceReferenceGraphNode[]
+     */
+    private $nodes = array();
+
+    /**
+     * Checks if the graph has a specific node.
+     *
+     * @param string $id Id to check
+     *
+     * @return bool
+     */
+    public function hasNode($id)
+    {
+        return isset($this->nodes[$id]);
+    }
+
+    /**
+     * Gets a node by identifier.
+     *
+     * @param string $id The id to retrieve
+     *
+     * @return ServiceReferenceGraphNode The node matching the supplied identifier
+     *
+     * @throws InvalidArgumentException if no node matches the supplied identifier
+     */
+    public function getNode($id)
+    {
+        if (!isset($this->nodes[$id])) {
+            throw new InvalidArgumentException(sprintf('There is no node with id "%s".', $id));
+        }
+
+        return $this->nodes[$id];
+    }
+
+    /**
+     * Returns all nodes.
+     *
+     * @return ServiceReferenceGraphNode[] An array of all ServiceReferenceGraphNode objects
+     */
+    public function getNodes()
+    {
+        return $this->nodes;
+    }
+
+    /**
+     * Clears all nodes.
+     */
+    public function clear()
+    {
+        $this->nodes = array();
+    }
+
+    /**
+     * Connects 2 nodes together in the Graph.
+     *
+     * @param string $sourceId
+     * @param string $sourceValue
+     * @param string $destId
+     * @param string $destValue
+     * @param string $reference
+     */
+    public function connect($sourceId, $sourceValue, $destId, $destValue = null, $reference = null)
+    {
+        $sourceNode = $this->createNode($sourceId, $sourceValue);
+        $destNode = $this->createNode($destId, $destValue);
+        $edge = new ServiceReferenceGraphEdge($sourceNode, $destNode, $reference);
+
+        $sourceNode->addOutEdge($edge);
+        $destNode->addInEdge($edge);
+    }
+
+    /**
+     * Creates a graph node.
+     *
+     * @param string $id
+     * @param string $value
+     *
+     * @return ServiceReferenceGraphNode
+     */
+    private function createNode($id, $value)
+    {
+        if (isset($this->nodes[$id]) && $this->nodes[$id]->getValue() === $value) {
+            return $this->nodes[$id];
+        }
+
+        return $this->nodes[$id] = new ServiceReferenceGraphNode($id, $value);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php
@@ -0,0 +1,68 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+/**
+ * Represents an edge in your service graph.
+ *
+ * Value is typically a reference.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ServiceReferenceGraphEdge
+{
+    private $sourceNode;
+    private $destNode;
+    private $value;
+
+    /**
+     * @param ServiceReferenceGraphNode $sourceNode
+     * @param ServiceReferenceGraphNode $destNode
+     * @param string                    $value
+     */
+    public function __construct(ServiceReferenceGraphNode $sourceNode, ServiceReferenceGraphNode $destNode, $value = null)
+    {
+        $this->sourceNode = $sourceNode;
+        $this->destNode = $destNode;
+        $this->value = $value;
+    }
+
+    /**
+     * Returns the value of the edge.
+     *
+     * @return string
+     */
+    public function getValue()
+    {
+        return $this->value;
+    }
+
+    /**
+     * Returns the source node.
+     *
+     * @return ServiceReferenceGraphNode
+     */
+    public function getSourceNode()
+    {
+        return $this->sourceNode;
+    }
+
+    /**
+     * Returns the destination node.
+     *
+     * @return ServiceReferenceGraphNode
+     */
+    public function getDestNode()
+    {
+        return $this->destNode;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php
@@ -0,0 +1,120 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Alias;
+
+/**
+ * Represents a node in your service graph.
+ *
+ * Value is typically a definition, or an alias.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ServiceReferenceGraphNode
+{
+    private $id;
+    private $inEdges = array();
+    private $outEdges = array();
+    private $value;
+
+    /**
+     * @param string $id    The node identifier
+     * @param mixed  $value The node value
+     */
+    public function __construct($id, $value)
+    {
+        $this->id = $id;
+        $this->value = $value;
+    }
+
+    /**
+     * Adds an in edge to this node.
+     *
+     * @param ServiceReferenceGraphEdge $edge
+     */
+    public function addInEdge(ServiceReferenceGraphEdge $edge)
+    {
+        $this->inEdges[] = $edge;
+    }
+
+    /**
+     * Adds an out edge to this node.
+     *
+     * @param ServiceReferenceGraphEdge $edge
+     */
+    public function addOutEdge(ServiceReferenceGraphEdge $edge)
+    {
+        $this->outEdges[] = $edge;
+    }
+
+    /**
+     * Checks if the value of this node is an Alias.
+     *
+     * @return bool True if the value is an Alias instance
+     */
+    public function isAlias()
+    {
+        return $this->value instanceof Alias;
+    }
+
+    /**
+     * Checks if the value of this node is a Definition.
+     *
+     * @return bool True if the value is a Definition instance
+     */
+    public function isDefinition()
+    {
+        return $this->value instanceof Definition;
+    }
+
+    /**
+     * Returns the identifier.
+     *
+     * @return string
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Returns the in edges.
+     *
+     * @return array The in ServiceReferenceGraphEdge array
+     */
+    public function getInEdges()
+    {
+        return $this->inEdges;
+    }
+
+    /**
+     * Returns the out edges.
+     *
+     * @return array The out ServiceReferenceGraphEdge array
+     */
+    public function getOutEdges()
+    {
+        return $this->outEdges;
+    }
+
+    /**
+     * Returns the value of this Node.
+     *
+     * @return mixed The value
+     */
+    public function getValue()
+    {
+        return $this->value;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Container.php
@@ -0,0 +1,595 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\LogicException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
+use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
+use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
+
+/**
+ * Container is a dependency injection container.
+ *
+ * It gives access to object instances (services).
+ *
+ * Services and parameters are simple key/pair stores.
+ *
+ * Parameter and service keys are case insensitive.
+ *
+ * A service id can contain lowercased letters, digits, underscores, and dots.
+ * Underscores are used to separate words, and dots to group services
+ * under namespaces:
+ *
+ * <ul>
+ *   <li>request</li>
+ *   <li>mysql_session_storage</li>
+ *   <li>symfony.mysql_session_storage</li>
+ * </ul>
+ *
+ * A service can also be defined by creating a method named
+ * getXXXService(), where XXX is the camelized version of the id:
+ *
+ * <ul>
+ *   <li>request -> getRequestService()</li>
+ *   <li>mysql_session_storage -> getMysqlSessionStorageService()</li>
+ *   <li>symfony.mysql_session_storage -> getSymfony_MysqlSessionStorageService()</li>
+ * </ul>
+ *
+ * The container can have three possible behaviors when a service does not exist:
+ *
+ *  * EXCEPTION_ON_INVALID_REFERENCE: Throws an exception (the default)
+ *  * NULL_ON_INVALID_REFERENCE:      Returns null
+ *  * IGNORE_ON_INVALID_REFERENCE:    Ignores the wrapping command asking for the reference
+ *                                    (for instance, ignore a setter if the service does not exist)
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class Container implements IntrospectableContainerInterface, ResettableContainerInterface
+{
+    /**
+     * @var ParameterBagInterface
+     */
+    protected $parameterBag;
+
+    protected $services = array();
+    protected $methodMap = array();
+    protected $aliases = array();
+    protected $scopes = array();
+    protected $scopeChildren = array();
+    protected $scopedServices = array();
+    protected $scopeStacks = array();
+    protected $loading = array();
+
+    private $underscoreMap = array('_' => '', '.' => '_', '\\' => '_');
+
+    /**
+     * @param ParameterBagInterface $parameterBag A ParameterBagInterface instance
+     */
+    public function __construct(ParameterBagInterface $parameterBag = null)
+    {
+        $this->parameterBag = $parameterBag ?: new ParameterBag();
+    }
+
+    /**
+     * Compiles the container.
+     *
+     * This method does two things:
+     *
+     *  * Parameter values are resolved;
+     *  * The parameter bag is frozen.
+     */
+    public function compile()
+    {
+        $this->parameterBag->resolve();
+
+        $this->parameterBag = new FrozenParameterBag($this->parameterBag->all());
+    }
+
+    /**
+     * Returns true if the container parameter bag are frozen.
+     *
+     * @return bool true if the container parameter bag are frozen, false otherwise
+     */
+    public function isFrozen()
+    {
+        return $this->parameterBag instanceof FrozenParameterBag;
+    }
+
+    /**
+     * Gets the service container parameter bag.
+     *
+     * @return ParameterBagInterface A ParameterBagInterface instance
+     */
+    public function getParameterBag()
+    {
+        return $this->parameterBag;
+    }
+
+    /**
+     * Gets a parameter.
+     *
+     * @param string $name The parameter name
+     *
+     * @return mixed The parameter value
+     *
+     * @throws InvalidArgumentException if the parameter is not defined
+     */
+    public function getParameter($name)
+    {
+        return $this->parameterBag->get($name);
+    }
+
+    /**
+     * Checks if a parameter exists.
+     *
+     * @param string $name The parameter name
+     *
+     * @return bool The presence of parameter in container
+     */
+    public function hasParameter($name)
+    {
+        return $this->parameterBag->has($name);
+    }
+
+    /**
+     * Sets a parameter.
+     *
+     * @param string $name  The parameter name
+     * @param mixed  $value The parameter value
+     */
+    public function setParameter($name, $value)
+    {
+        $this->parameterBag->set($name, $value);
+    }
+
+    /**
+     * Sets a service.
+     *
+     * Setting a service to null resets the service: has() returns false and get()
+     * behaves in the same way as if the service was never created.
+     *
+     * Note: The $scope parameter is deprecated since version 2.8 and will be removed in 3.0.
+     *
+     * @param string $id      The service identifier
+     * @param object $service The service instance
+     * @param string $scope   The scope of the service
+     *
+     * @throws RuntimeException         When trying to set a service in an inactive scope
+     * @throws InvalidArgumentException When trying to set a service in the prototype scope
+     */
+    public function set($id, $service, $scope = self::SCOPE_CONTAINER)
+    {
+        if (!in_array($scope, array('container', 'request')) || ('request' === $scope && 'request' !== $id)) {
+            @trigger_error('The concept of container scopes is deprecated since version 2.8 and will be removed in 3.0. Omit the third parameter.', E_USER_DEPRECATED);
+        }
+
+        if (self::SCOPE_PROTOTYPE === $scope) {
+            throw new InvalidArgumentException(sprintf('You cannot set service "%s" of scope "prototype".', $id));
+        }
+
+        $id = strtolower($id);
+
+        if ('service_container' === $id) {
+            // BC: 'service_container' is no longer a self-reference but always
+            // $this, so ignore this call.
+            // @todo Throw InvalidArgumentException in next major release.
+            return;
+        }
+        if (self::SCOPE_CONTAINER !== $scope) {
+            if (!isset($this->scopedServices[$scope])) {
+                throw new RuntimeException(sprintf('You cannot set service "%s" of inactive scope.', $id));
+            }
+
+            $this->scopedServices[$scope][$id] = $service;
+        }
+
+        if (isset($this->aliases[$id])) {
+            unset($this->aliases[$id]);
+        }
+
+        $this->services[$id] = $service;
+
+        if (method_exists($this, $method = 'synchronize'.strtr($id, $this->underscoreMap).'Service')) {
+            $this->$method();
+        }
+
+        if (null === $service) {
+            if (self::SCOPE_CONTAINER !== $scope) {
+                unset($this->scopedServices[$scope][$id]);
+            }
+
+            unset($this->services[$id]);
+        }
+    }
+
+    /**
+     * Returns true if the given service is defined.
+     *
+     * @param string $id The service identifier
+     *
+     * @return bool true if the service is defined, false otherwise
+     */
+    public function has($id)
+    {
+        for ($i = 2;;) {
+            if ('service_container' === $id
+                || isset($this->aliases[$id])
+                || isset($this->services[$id])
+                || array_key_exists($id, $this->services)
+            ) {
+                return true;
+            }
+            if (--$i && $id !== $lcId = strtolower($id)) {
+                $id = $lcId;
+            } else {
+                return method_exists($this, 'get'.strtr($id, $this->underscoreMap).'Service');
+            }
+        }
+    }
+
+    /**
+     * Gets a service.
+     *
+     * If a service is defined both through a set() method and
+     * with a get{$id}Service() method, the former has always precedence.
+     *
+     * @param string $id              The service identifier
+     * @param int    $invalidBehavior The behavior when the service does not exist
+     *
+     * @return object The associated service
+     *
+     * @throws ServiceCircularReferenceException When a circular reference is detected
+     * @throws ServiceNotFoundException          When the service is not defined
+     * @throws \Exception                        if an exception has been thrown when the service has been resolved
+     *
+     * @see Reference
+     */
+    public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE)
+    {
+        // Attempt to retrieve the service by checking first aliases then
+        // available services. Service IDs are case insensitive, however since
+        // this method can be called thousands of times during a request, avoid
+        // calling strtolower() unless necessary.
+        for ($i = 2;;) {
+            if ('service_container' === $id) {
+                return $this;
+            }
+            if (isset($this->aliases[$id])) {
+                $id = $this->aliases[$id];
+            }
+            // Re-use shared service instance if it exists.
+            if (isset($this->services[$id]) || array_key_exists($id, $this->services)) {
+                return $this->services[$id];
+            }
+
+            if (isset($this->loading[$id])) {
+                throw new ServiceCircularReferenceException($id, array_keys($this->loading));
+            }
+
+            if (isset($this->methodMap[$id])) {
+                $method = $this->methodMap[$id];
+            } elseif (--$i && $id !== $lcId = strtolower($id)) {
+                $id = $lcId;
+                continue;
+            } elseif (method_exists($this, $method = 'get'.strtr($id, $this->underscoreMap).'Service')) {
+                // $method is set to the right value, proceed
+            } else {
+                if (self::EXCEPTION_ON_INVALID_REFERENCE === $invalidBehavior) {
+                    if (!$id) {
+                        throw new ServiceNotFoundException($id);
+                    }
+
+                    $alternatives = array();
+                    foreach ($this->getServiceIds() as $knownId) {
+                        $lev = levenshtein($id, $knownId);
+                        if ($lev <= strlen($id) / 3 || false !== strpos($knownId, $id)) {
+                            $alternatives[] = $knownId;
+                        }
+                    }
+
+                    throw new ServiceNotFoundException($id, null, null, $alternatives);
+                }
+
+                return;
+            }
+
+            $this->loading[$id] = true;
+
+            try {
+                $service = $this->$method();
+            } catch (\Exception $e) {
+                unset($this->loading[$id]);
+                unset($this->services[$id]);
+
+                if ($e instanceof InactiveScopeException && self::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) {
+                    return;
+                }
+
+                throw $e;
+            } catch (\Throwable $e) {
+                unset($this->loading[$id]);
+                unset($this->services[$id]);
+
+                throw $e;
+            }
+
+            unset($this->loading[$id]);
+
+            return $service;
+        }
+    }
+
+    /**
+     * Returns true if the given service has actually been initialized.
+     *
+     * @param string $id The service identifier
+     *
+     * @return bool true if service has already been initialized, false otherwise
+     */
+    public function initialized($id)
+    {
+        $id = strtolower($id);
+
+        if ('service_container' === $id) {
+            // BC: 'service_container' was a synthetic service previously.
+            // @todo Change to false in next major release.
+            return true;
+        }
+
+        if (isset($this->aliases[$id])) {
+            $id = $this->aliases[$id];
+        }
+
+        return isset($this->services[$id]) || array_key_exists($id, $this->services);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        if (!empty($this->scopedServices)) {
+            throw new LogicException('Resetting the container is not allowed when a scope is active.');
+        }
+
+        $this->services = array();
+    }
+
+    /**
+     * Gets all service ids.
+     *
+     * @return array An array of all defined service ids
+     */
+    public function getServiceIds()
+    {
+        $ids = array();
+        foreach (get_class_methods($this) as $method) {
+            if (preg_match('/^get(.+)Service$/', $method, $match)) {
+                $ids[] = self::underscore($match[1]);
+            }
+        }
+        $ids[] = 'service_container';
+
+        return array_unique(array_merge($ids, array_keys($this->services)));
+    }
+
+    /**
+     * This is called when you enter a scope.
+     *
+     * @param string $name
+     *
+     * @throws RuntimeException         When the parent scope is inactive
+     * @throws InvalidArgumentException When the scope does not exist
+     *
+     * @deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function enterScope($name)
+    {
+        if ('request' !== $name) {
+            @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+        }
+
+        if (!isset($this->scopes[$name])) {
+            throw new InvalidArgumentException(sprintf('The scope "%s" does not exist.', $name));
+        }
+
+        if (self::SCOPE_CONTAINER !== $this->scopes[$name] && !isset($this->scopedServices[$this->scopes[$name]])) {
+            throw new RuntimeException(sprintf('The parent scope "%s" must be active when entering this scope.', $this->scopes[$name]));
+        }
+
+        // check if a scope of this name is already active, if so we need to
+        // remove all services of this scope, and those of any of its child
+        // scopes from the global services map
+        if (isset($this->scopedServices[$name])) {
+            $services = array($this->services, $name => $this->scopedServices[$name]);
+            unset($this->scopedServices[$name]);
+
+            foreach ($this->scopeChildren[$name] as $child) {
+                if (isset($this->scopedServices[$child])) {
+                    $services[$child] = $this->scopedServices[$child];
+                    unset($this->scopedServices[$child]);
+                }
+            }
+
+            // update global map
+            $this->services = call_user_func_array('array_diff_key', $services);
+            array_shift($services);
+
+            // add stack entry for this scope so we can restore the removed services later
+            if (!isset($this->scopeStacks[$name])) {
+                $this->scopeStacks[$name] = new \SplStack();
+            }
+            $this->scopeStacks[$name]->push($services);
+        }
+
+        $this->scopedServices[$name] = array();
+    }
+
+    /**
+     * This is called to leave the current scope, and move back to the parent
+     * scope.
+     *
+     * @param string $name The name of the scope to leave
+     *
+     * @throws InvalidArgumentException if the scope is not active
+     *
+     * @deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function leaveScope($name)
+    {
+        if ('request' !== $name) {
+            @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+        }
+
+        if (!isset($this->scopedServices[$name])) {
+            throw new InvalidArgumentException(sprintf('The scope "%s" is not active.', $name));
+        }
+
+        // remove all services of this scope, or any of its child scopes from
+        // the global service map
+        $services = array($this->services, $this->scopedServices[$name]);
+        unset($this->scopedServices[$name]);
+
+        foreach ($this->scopeChildren[$name] as $child) {
+            if (isset($this->scopedServices[$child])) {
+                $services[] = $this->scopedServices[$child];
+                unset($this->scopedServices[$child]);
+            }
+        }
+
+        // update global map
+        $this->services = call_user_func_array('array_diff_key', $services);
+
+        // check if we need to restore services of a previous scope of this type
+        if (isset($this->scopeStacks[$name]) && count($this->scopeStacks[$name]) > 0) {
+            $services = $this->scopeStacks[$name]->pop();
+            $this->scopedServices += $services;
+
+            if ($this->scopeStacks[$name]->isEmpty()) {
+                unset($this->scopeStacks[$name]);
+            }
+
+            foreach ($services as $array) {
+                foreach ($array as $id => $service) {
+                    $this->set($id, $service, $name);
+                }
+            }
+        }
+    }
+
+    /**
+     * Adds a scope to the container.
+     *
+     * @param ScopeInterface $scope
+     *
+     * @throws InvalidArgumentException
+     *
+     * @deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function addScope(ScopeInterface $scope)
+    {
+        $name = $scope->getName();
+        $parentScope = $scope->getParentName();
+
+        if ('request' !== $name) {
+            @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+        }
+        if (self::SCOPE_CONTAINER === $name || self::SCOPE_PROTOTYPE === $name) {
+            throw new InvalidArgumentException(sprintf('The scope "%s" is reserved.', $name));
+        }
+        if (isset($this->scopes[$name])) {
+            throw new InvalidArgumentException(sprintf('A scope with name "%s" already exists.', $name));
+        }
+        if (self::SCOPE_CONTAINER !== $parentScope && !isset($this->scopes[$parentScope])) {
+            throw new InvalidArgumentException(sprintf('The parent scope "%s" does not exist, or is invalid.', $parentScope));
+        }
+
+        $this->scopes[$name] = $parentScope;
+        $this->scopeChildren[$name] = array();
+
+        // normalize the child relations
+        while ($parentScope !== self::SCOPE_CONTAINER) {
+            $this->scopeChildren[$parentScope][] = $name;
+            $parentScope = $this->scopes[$parentScope];
+        }
+    }
+
+    /**
+     * Returns whether this container has a certain scope.
+     *
+     * @param string $name The name of the scope
+     *
+     * @return bool
+     *
+     * @deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function hasScope($name)
+    {
+        if ('request' !== $name) {
+            @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+        }
+
+        return isset($this->scopes[$name]);
+    }
+
+    /**
+     * Returns whether this scope is currently active.
+     *
+     * This does not actually check if the passed scope actually exists.
+     *
+     * @param string $name
+     *
+     * @return bool
+     *
+     * @deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function isScopeActive($name)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        return isset($this->scopedServices[$name]);
+    }
+
+    /**
+     * Camelizes a string.
+     *
+     * @param string $id A string to camelize
+     *
+     * @return string The camelized string
+     */
+    public static function camelize($id)
+    {
+        return strtr(ucwords(strtr($id, array('_' => ' ', '.' => '_ ', '\\' => '_ '))), array(' ' => ''));
+    }
+
+    /**
+     * A string to underscore.
+     *
+     * @param string $id The string to underscore
+     *
+     * @return string The underscored string
+     */
+    public static function underscore($id)
+    {
+        return strtolower(preg_replace(array('/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'), array('\\1_\\2', '\\1_\\2'), str_replace('_', '.', $id)));
+    }
+
+    private function __clone()
+    {
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/ContainerAware.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+/**
+ * A simple implementation of ContainerAwareInterface.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 2.8, to be removed in 3.0. Use the ContainerAwareTrait instead.
+ */
+abstract class ContainerAware implements ContainerAwareInterface
+{
+    /**
+     * @var ContainerInterface
+     */
+    protected $container;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setContainer(ContainerInterface $container = null)
+    {
+        $this->container = $container;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/ContainerAwareInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+/**
+ * ContainerAwareInterface should be implemented by classes that depends on a Container.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface ContainerAwareInterface
+{
+    /**
+     * Sets the container.
+     *
+     * @param ContainerInterface|null $container A ContainerInterface instance or null
+     */
+    public function setContainer(ContainerInterface $container = null);
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/ContainerAwareTrait.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+/**
+ * ContainerAware trait.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+trait ContainerAwareTrait
+{
+    /**
+     * @var ContainerInterface
+     */
+    protected $container;
+
+    /**
+     * Sets the container.
+     *
+     * @param ContainerInterface|null $container A ContainerInterface instance or null
+     */
+    public function setContainer(ContainerInterface $container = null)
+    {
+        $this->container = $container;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/ContainerBuilder.php
@@ -0,0 +1,1180 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\Compiler\Compiler;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\Compiler\PassConfig;
+use Symfony\Component\DependencyInjection\Exception\BadMethodCallException;
+use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\LogicException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
+use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
+use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Config\Resource\ResourceInterface;
+use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\InstantiatorInterface;
+use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\RealServiceInstantiator;
+use Symfony\Component\ExpressionLanguage\Expression;
+use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
+
+/**
+ * ContainerBuilder is a DI container that provides an API to easily describe services.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ContainerBuilder extends Container implements TaggedContainerInterface
+{
+    /**
+     * @var ExtensionInterface[]
+     */
+    private $extensions = array();
+
+    /**
+     * @var ExtensionInterface[]
+     */
+    private $extensionsByNs = array();
+
+    /**
+     * @var Definition[]
+     */
+    private $definitions = array();
+
+    /**
+     * @var Definition[]
+     */
+    private $obsoleteDefinitions = array();
+
+    /**
+     * @var Alias[]
+     */
+    private $aliasDefinitions = array();
+
+    /**
+     * @var ResourceInterface[]
+     */
+    private $resources = array();
+
+    private $extensionConfigs = array();
+
+    /**
+     * @var Compiler
+     */
+    private $compiler;
+
+    private $trackResources = true;
+
+    /**
+     * @var InstantiatorInterface|null
+     */
+    private $proxyInstantiator;
+
+    /**
+     * @var ExpressionLanguage|null
+     */
+    private $expressionLanguage;
+
+    /**
+     * @var ExpressionFunctionProviderInterface[]
+     */
+    private $expressionLanguageProviders = array();
+
+    /**
+     * @var string[] with tag names used by findTaggedServiceIds
+     */
+    private $usedTags = array();
+
+    /**
+     * Sets the track resources flag.
+     *
+     * If you are not using the loaders and therefore don't want
+     * to depend on the Config component, set this flag to false.
+     *
+     * @param bool $track true if you want to track resources, false otherwise
+     */
+    public function setResourceTracking($track)
+    {
+        $this->trackResources = (bool) $track;
+    }
+
+    /**
+     * Checks if resources are tracked.
+     *
+     * @return bool true if resources are tracked, false otherwise
+     */
+    public function isTrackingResources()
+    {
+        return $this->trackResources;
+    }
+
+    /**
+     * Sets the instantiator to be used when fetching proxies.
+     *
+     * @param InstantiatorInterface $proxyInstantiator
+     */
+    public function setProxyInstantiator(InstantiatorInterface $proxyInstantiator)
+    {
+        $this->proxyInstantiator = $proxyInstantiator;
+    }
+
+    /**
+     * Registers an extension.
+     *
+     * @param ExtensionInterface $extension An extension instance
+     */
+    public function registerExtension(ExtensionInterface $extension)
+    {
+        $this->extensions[$extension->getAlias()] = $extension;
+
+        if (false !== $extension->getNamespace()) {
+            $this->extensionsByNs[$extension->getNamespace()] = $extension;
+        }
+    }
+
+    /**
+     * Returns an extension by alias or namespace.
+     *
+     * @param string $name An alias or a namespace
+     *
+     * @return ExtensionInterface An extension instance
+     *
+     * @throws LogicException if the extension is not registered
+     */
+    public function getExtension($name)
+    {
+        if (isset($this->extensions[$name])) {
+            return $this->extensions[$name];
+        }
+
+        if (isset($this->extensionsByNs[$name])) {
+            return $this->extensionsByNs[$name];
+        }
+
+        throw new LogicException(sprintf('Container extension "%s" is not registered', $name));
+    }
+
+    /**
+     * Returns all registered extensions.
+     *
+     * @return ExtensionInterface[] An array of ExtensionInterface
+     */
+    public function getExtensions()
+    {
+        return $this->extensions;
+    }
+
+    /**
+     * Checks if we have an extension.
+     *
+     * @param string $name The name of the extension
+     *
+     * @return bool If the extension exists
+     */
+    public function hasExtension($name)
+    {
+        return isset($this->extensions[$name]) || isset($this->extensionsByNs[$name]);
+    }
+
+    /**
+     * Returns an array of resources loaded to build this configuration.
+     *
+     * @return ResourceInterface[] An array of resources
+     */
+    public function getResources()
+    {
+        return array_unique($this->resources);
+    }
+
+    /**
+     * Adds a resource for this configuration.
+     *
+     * @param ResourceInterface $resource A resource instance
+     *
+     * @return ContainerBuilder The current instance
+     */
+    public function addResource(ResourceInterface $resource)
+    {
+        if (!$this->trackResources) {
+            return $this;
+        }
+
+        $this->resources[] = $resource;
+
+        return $this;
+    }
+
+    /**
+     * Sets the resources for this configuration.
+     *
+     * @param ResourceInterface[] $resources An array of resources
+     *
+     * @return ContainerBuilder The current instance
+     */
+    public function setResources(array $resources)
+    {
+        if (!$this->trackResources) {
+            return $this;
+        }
+
+        $this->resources = $resources;
+
+        return $this;
+    }
+
+    /**
+     * Adds the object class hierarchy as resources.
+     *
+     * @param object $object An object instance
+     *
+     * @return ContainerBuilder The current instance
+     */
+    public function addObjectResource($object)
+    {
+        if ($this->trackResources) {
+            $this->addClassResource(new \ReflectionClass($object));
+        }
+
+        return $this;
+    }
+
+    /**
+     * Adds the given class hierarchy as resources.
+     *
+     * @param \ReflectionClass $class
+     *
+     * @return ContainerBuilder The current instance
+     */
+    public function addClassResource(\ReflectionClass $class)
+    {
+        if (!$this->trackResources) {
+            return $this;
+        }
+
+        do {
+            if (is_file($class->getFileName())) {
+                $this->addResource(new FileResource($class->getFileName()));
+            }
+        } while ($class = $class->getParentClass());
+
+        return $this;
+    }
+
+    /**
+     * Loads the configuration for an extension.
+     *
+     * @param string $extension The extension alias or namespace
+     * @param array  $values    An array of values that customizes the extension
+     *
+     * @return ContainerBuilder The current instance
+     *
+     * @throws BadMethodCallException When this ContainerBuilder is frozen
+     * @throws \LogicException        if the container is frozen
+     */
+    public function loadFromExtension($extension, array $values = array())
+    {
+        if ($this->isFrozen()) {
+            throw new BadMethodCallException('Cannot load from an extension on a frozen container.');
+        }
+
+        $namespace = $this->getExtension($extension)->getAlias();
+
+        $this->extensionConfigs[$namespace][] = $values;
+
+        return $this;
+    }
+
+    /**
+     * Adds a compiler pass.
+     *
+     * @param CompilerPassInterface $pass A compiler pass
+     * @param string                $type The type of compiler pass
+     *
+     * @return ContainerBuilder The current instance
+     */
+    public function addCompilerPass(CompilerPassInterface $pass, $type = PassConfig::TYPE_BEFORE_OPTIMIZATION)
+    {
+        $this->getCompiler()->addPass($pass, $type);
+
+        $this->addObjectResource($pass);
+
+        return $this;
+    }
+
+    /**
+     * Returns the compiler pass config which can then be modified.
+     *
+     * @return PassConfig The compiler pass config
+     */
+    public function getCompilerPassConfig()
+    {
+        return $this->getCompiler()->getPassConfig();
+    }
+
+    /**
+     * Returns the compiler.
+     *
+     * @return Compiler The compiler
+     */
+    public function getCompiler()
+    {
+        if (null === $this->compiler) {
+            $this->compiler = new Compiler();
+        }
+
+        return $this->compiler;
+    }
+
+    /**
+     * Returns all Scopes.
+     *
+     * @return array An array of scopes
+     *
+     * @deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function getScopes($triggerDeprecationError = true)
+    {
+        if ($triggerDeprecationError) {
+            @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+        }
+
+        return $this->scopes;
+    }
+
+    /**
+     * Returns all Scope children.
+     *
+     * @return array An array of scope children
+     *
+     * @deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function getScopeChildren($triggerDeprecationError = true)
+    {
+        if ($triggerDeprecationError) {
+            @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+        }
+
+        return $this->scopeChildren;
+    }
+
+    /**
+     * Sets a service.
+     *
+     * Note: The $scope parameter is deprecated since version 2.8 and will be removed in 3.0.
+     *
+     * @param string $id      The service identifier
+     * @param object $service The service instance
+     * @param string $scope   The scope
+     *
+     * @throws BadMethodCallException When this ContainerBuilder is frozen
+     */
+    public function set($id, $service, $scope = self::SCOPE_CONTAINER)
+    {
+        $id = strtolower($id);
+        $set = isset($this->definitions[$id]);
+
+        if ($this->isFrozen() && ($set || isset($this->obsoleteDefinitions[$id])) && !$this->{$set ? 'definitions' : 'obsoleteDefinitions'}[$id]->isSynthetic()) {
+            // setting a synthetic service on a frozen container is alright
+            throw new BadMethodCallException(sprintf('Setting service "%s" on a frozen container is not allowed.', $id));
+        }
+
+        if ($set) {
+            $this->obsoleteDefinitions[$id] = $this->definitions[$id];
+        }
+
+        unset($this->definitions[$id], $this->aliasDefinitions[$id]);
+
+        parent::set($id, $service, $scope);
+
+        if (isset($this->obsoleteDefinitions[$id]) && $this->obsoleteDefinitions[$id]->isSynchronized(false)) {
+            $this->synchronize($id);
+        }
+    }
+
+    /**
+     * Removes a service definition.
+     *
+     * @param string $id The service identifier
+     */
+    public function removeDefinition($id)
+    {
+        unset($this->definitions[strtolower($id)]);
+    }
+
+    /**
+     * Returns true if the given service is defined.
+     *
+     * @param string $id The service identifier
+     *
+     * @return bool true if the service is defined, false otherwise
+     */
+    public function has($id)
+    {
+        $id = strtolower($id);
+
+        return isset($this->definitions[$id]) || isset($this->aliasDefinitions[$id]) || parent::has($id);
+    }
+
+    /**
+     * Gets a service.
+     *
+     * @param string $id              The service identifier
+     * @param int    $invalidBehavior The behavior when the service does not exist
+     *
+     * @return object The associated service
+     *
+     * @throws InvalidArgumentException          when no definitions are available
+     * @throws ServiceCircularReferenceException When a circular reference is detected
+     * @throws ServiceNotFoundException          When the service is not defined
+     * @throws \Exception
+     *
+     * @see Reference
+     */
+    public function get($id, $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE)
+    {
+        $id = strtolower($id);
+
+        if ($service = parent::get($id, ContainerInterface::NULL_ON_INVALID_REFERENCE)) {
+            return $service;
+        }
+
+        if (!array_key_exists($id, $this->definitions) && isset($this->aliasDefinitions[$id])) {
+            return $this->get($this->aliasDefinitions[$id]);
+        }
+
+        try {
+            $definition = $this->getDefinition($id);
+        } catch (ServiceNotFoundException $e) {
+            if (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) {
+                return;
+            }
+
+            throw $e;
+        }
+
+        $this->loading[$id] = true;
+
+        try {
+            $service = $this->createService($definition, $id);
+        } catch (\Exception $e) {
+            unset($this->loading[$id]);
+
+            if ($e instanceof InactiveScopeException && self::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) {
+                return;
+            }
+
+            throw $e;
+        } catch (\Throwable $e) {
+            unset($this->loading[$id]);
+
+            throw $e;
+        }
+
+        unset($this->loading[$id]);
+
+        return $service;
+    }
+
+    /**
+     * Merges a ContainerBuilder with the current ContainerBuilder configuration.
+     *
+     * Service definitions overrides the current defined ones.
+     *
+     * But for parameters, they are overridden by the current ones. It allows
+     * the parameters passed to the container constructor to have precedence
+     * over the loaded ones.
+     *
+     * $container = new ContainerBuilder(array('foo' => 'bar'));
+     * $loader = new LoaderXXX($container);
+     * $loader->load('resource_name');
+     * $container->register('foo', new stdClass());
+     *
+     * In the above example, even if the loaded resource defines a foo
+     * parameter, the value will still be 'bar' as defined in the ContainerBuilder
+     * constructor.
+     *
+     * @param ContainerBuilder $container The ContainerBuilder instance to merge
+     *
+     * @throws BadMethodCallException When this ContainerBuilder is frozen
+     */
+    public function merge(ContainerBuilder $container)
+    {
+        if ($this->isFrozen()) {
+            throw new BadMethodCallException('Cannot merge on a frozen container.');
+        }
+
+        $this->addDefinitions($container->getDefinitions());
+        $this->addAliases($container->getAliases());
+        $this->getParameterBag()->add($container->getParameterBag()->all());
+
+        if ($this->trackResources) {
+            foreach ($container->getResources() as $resource) {
+                $this->addResource($resource);
+            }
+        }
+
+        foreach ($this->extensions as $name => $extension) {
+            if (!isset($this->extensionConfigs[$name])) {
+                $this->extensionConfigs[$name] = array();
+            }
+
+            $this->extensionConfigs[$name] = array_merge($this->extensionConfigs[$name], $container->getExtensionConfig($name));
+        }
+    }
+
+    /**
+     * Returns the configuration array for the given extension.
+     *
+     * @param string $name The name of the extension
+     *
+     * @return array An array of configuration
+     */
+    public function getExtensionConfig($name)
+    {
+        if (!isset($this->extensionConfigs[$name])) {
+            $this->extensionConfigs[$name] = array();
+        }
+
+        return $this->extensionConfigs[$name];
+    }
+
+    /**
+     * Prepends a config array to the configs of the given extension.
+     *
+     * @param string $name   The name of the extension
+     * @param array  $config The config to set
+     */
+    public function prependExtensionConfig($name, array $config)
+    {
+        if (!isset($this->extensionConfigs[$name])) {
+            $this->extensionConfigs[$name] = array();
+        }
+
+        array_unshift($this->extensionConfigs[$name], $config);
+    }
+
+    /**
+     * Compiles the container.
+     *
+     * This method passes the container to compiler
+     * passes whose job is to manipulate and optimize
+     * the container.
+     *
+     * The main compiler passes roughly do four things:
+     *
+     *  * The extension configurations are merged;
+     *  * Parameter values are resolved;
+     *  * The parameter bag is frozen;
+     *  * Extension loading is disabled.
+     */
+    public function compile()
+    {
+        $compiler = $this->getCompiler();
+
+        if ($this->trackResources) {
+            foreach ($compiler->getPassConfig()->getPasses() as $pass) {
+                $this->addObjectResource($pass);
+            }
+        }
+
+        $compiler->compile($this);
+
+        if ($this->trackResources) {
+            foreach ($this->definitions as $definition) {
+                if ($definition->isLazy() && ($class = $definition->getClass()) && class_exists($class)) {
+                    $this->addClassResource(new \ReflectionClass($class));
+                }
+            }
+        }
+
+        $this->extensionConfigs = array();
+
+        parent::compile();
+    }
+
+    /**
+     * Gets all service ids.
+     *
+     * @return array An array of all defined service ids
+     */
+    public function getServiceIds()
+    {
+        return array_unique(array_merge(array_keys($this->getDefinitions()), array_keys($this->aliasDefinitions), parent::getServiceIds()));
+    }
+
+    /**
+     * Adds the service aliases.
+     *
+     * @param array $aliases An array of aliases
+     */
+    public function addAliases(array $aliases)
+    {
+        foreach ($aliases as $alias => $id) {
+            $this->setAlias($alias, $id);
+        }
+    }
+
+    /**
+     * Sets the service aliases.
+     *
+     * @param array $aliases An array of aliases
+     */
+    public function setAliases(array $aliases)
+    {
+        $this->aliasDefinitions = array();
+        $this->addAliases($aliases);
+    }
+
+    /**
+     * Sets an alias for an existing service.
+     *
+     * @param string       $alias The alias to create
+     * @param string|Alias $id    The service to alias
+     *
+     * @throws InvalidArgumentException if the id is not a string or an Alias
+     * @throws InvalidArgumentException if the alias is for itself
+     */
+    public function setAlias($alias, $id)
+    {
+        $alias = strtolower($alias);
+
+        if (is_string($id)) {
+            $id = new Alias($id);
+        } elseif (!$id instanceof Alias) {
+            throw new InvalidArgumentException('$id must be a string, or an Alias object.');
+        }
+
+        if ($alias === (string) $id) {
+            throw new InvalidArgumentException(sprintf('An alias can not reference itself, got a circular reference on "%s".', $alias));
+        }
+
+        unset($this->definitions[$alias]);
+
+        $this->aliasDefinitions[$alias] = $id;
+    }
+
+    /**
+     * Removes an alias.
+     *
+     * @param string $alias The alias to remove
+     */
+    public function removeAlias($alias)
+    {
+        unset($this->aliasDefinitions[strtolower($alias)]);
+    }
+
+    /**
+     * Returns true if an alias exists under the given identifier.
+     *
+     * @param string $id The service identifier
+     *
+     * @return bool true if the alias exists, false otherwise
+     */
+    public function hasAlias($id)
+    {
+        return isset($this->aliasDefinitions[strtolower($id)]);
+    }
+
+    /**
+     * Gets all defined aliases.
+     *
+     * @return Alias[] An array of aliases
+     */
+    public function getAliases()
+    {
+        return $this->aliasDefinitions;
+    }
+
+    /**
+     * Gets an alias.
+     *
+     * @param string $id The service identifier
+     *
+     * @return Alias An Alias instance
+     *
+     * @throws InvalidArgumentException if the alias does not exist
+     */
+    public function getAlias($id)
+    {
+        $id = strtolower($id);
+
+        if (!isset($this->aliasDefinitions[$id])) {
+            throw new InvalidArgumentException(sprintf('The service alias "%s" does not exist.', $id));
+        }
+
+        return $this->aliasDefinitions[$id];
+    }
+
+    /**
+     * Registers a service definition.
+     *
+     * This methods allows for simple registration of service definition
+     * with a fluid interface.
+     *
+     * @param string $id    The service identifier
+     * @param string $class The service class
+     *
+     * @return Definition A Definition instance
+     */
+    public function register($id, $class = null)
+    {
+        return $this->setDefinition($id, new Definition($class));
+    }
+
+    /**
+     * Adds the service definitions.
+     *
+     * @param Definition[] $definitions An array of service definitions
+     */
+    public function addDefinitions(array $definitions)
+    {
+        foreach ($definitions as $id => $definition) {
+            $this->setDefinition($id, $definition);
+        }
+    }
+
+    /**
+     * Sets the service definitions.
+     *
+     * @param Definition[] $definitions An array of service definitions
+     */
+    public function setDefinitions(array $definitions)
+    {
+        $this->definitions = array();
+        $this->addDefinitions($definitions);
+    }
+
+    /**
+     * Gets all service definitions.
+     *
+     * @return Definition[] An array of Definition instances
+     */
+    public function getDefinitions()
+    {
+        return $this->definitions;
+    }
+
+    /**
+     * Sets a service definition.
+     *
+     * @param string     $id         The service identifier
+     * @param Definition $definition A Definition instance
+     *
+     * @return Definition the service definition
+     *
+     * @throws BadMethodCallException When this ContainerBuilder is frozen
+     */
+    public function setDefinition($id, Definition $definition)
+    {
+        if ($this->isFrozen()) {
+            throw new BadMethodCallException('Adding definition to a frozen container is not allowed');
+        }
+
+        $id = strtolower($id);
+
+        unset($this->aliasDefinitions[$id]);
+
+        return $this->definitions[$id] = $definition;
+    }
+
+    /**
+     * Returns true if a service definition exists under the given identifier.
+     *
+     * @param string $id The service identifier
+     *
+     * @return bool true if the service definition exists, false otherwise
+     */
+    public function hasDefinition($id)
+    {
+        return array_key_exists(strtolower($id), $this->definitions);
+    }
+
+    /**
+     * Gets a service definition.
+     *
+     * @param string $id The service identifier
+     *
+     * @return Definition A Definition instance
+     *
+     * @throws ServiceNotFoundException if the service definition does not exist
+     */
+    public function getDefinition($id)
+    {
+        $id = strtolower($id);
+
+        if (!array_key_exists($id, $this->definitions)) {
+            throw new ServiceNotFoundException($id);
+        }
+
+        return $this->definitions[$id];
+    }
+
+    /**
+     * Gets a service definition by id or alias.
+     *
+     * The method "unaliases" recursively to return a Definition instance.
+     *
+     * @param string $id The service identifier or alias
+     *
+     * @return Definition A Definition instance
+     *
+     * @throws ServiceNotFoundException if the service definition does not exist
+     */
+    public function findDefinition($id)
+    {
+        $id = strtolower($id);
+
+        while (isset($this->aliasDefinitions[$id])) {
+            $id = (string) $this->aliasDefinitions[$id];
+        }
+
+        return $this->getDefinition($id);
+    }
+
+    /**
+     * Creates a service for a service definition.
+     *
+     * @param Definition $definition A service definition instance
+     * @param string     $id         The service identifier
+     * @param bool       $tryProxy   Whether to try proxying the service with a lazy proxy
+     *
+     * @return object The service described by the service definition
+     *
+     * @throws RuntimeException         When the scope is inactive
+     * @throws RuntimeException         When the factory definition is incomplete
+     * @throws RuntimeException         When the service is a synthetic service
+     * @throws InvalidArgumentException When configure callable is not callable
+     *
+     * @internal this method is public because of PHP 5.3 limitations, do not use it explicitly in your code
+     */
+    public function createService(Definition $definition, $id, $tryProxy = true)
+    {
+        if ('Symfony\Component\DependencyInjection\Definition' !== get_class($definition)) {
+            throw new RuntimeException(sprintf('Constructing service "%s" from a %s is not supported at build time.', $id, get_class($definition)));
+        }
+
+        if ($definition->isSynthetic()) {
+            throw new RuntimeException(sprintf('You have requested a synthetic service ("%s"). The DIC does not know how to construct this service.', $id));
+        }
+
+        if ($definition->isDeprecated()) {
+            @trigger_error($definition->getDeprecationMessage($id), E_USER_DEPRECATED);
+        }
+
+        if ($tryProxy && $definition->isLazy()) {
+            $container = $this;
+
+            $proxy = $this
+                ->getProxyInstantiator()
+                ->instantiateProxy(
+                    $container,
+                    $definition,
+                    $id, function () use ($definition, $id, $container) {
+                        return $container->createService($definition, $id, false);
+                    }
+                );
+            $this->shareService($definition, $proxy, $id);
+
+            return $proxy;
+        }
+
+        $parameterBag = $this->getParameterBag();
+
+        if (null !== $definition->getFile()) {
+            require_once $parameterBag->resolveValue($definition->getFile());
+        }
+
+        $arguments = $this->resolveServices($parameterBag->unescapeValue($parameterBag->resolveValue($definition->getArguments())));
+
+        if (null !== $factory = $definition->getFactory()) {
+            if (is_array($factory)) {
+                $factory = array($this->resolveServices($parameterBag->resolveValue($factory[0])), $factory[1]);
+            } elseif (!is_string($factory)) {
+                throw new RuntimeException(sprintf('Cannot create service "%s" because of invalid factory', $id));
+            }
+
+            $service = call_user_func_array($factory, $arguments);
+
+            if (!$definition->isDeprecated() && is_array($factory) && is_string($factory[0])) {
+                $r = new \ReflectionClass($factory[0]);
+
+                if (0 < strpos($r->getDocComment(), "\n * @deprecated ")) {
+                    @trigger_error(sprintf('The "%s" service relies on the deprecated "%s" factory class. It should either be deprecated or its factory upgraded.', $id, $r->name), E_USER_DEPRECATED);
+                }
+            }
+        } elseif (null !== $definition->getFactoryMethod(false)) {
+            if (null !== $definition->getFactoryClass(false)) {
+                $factory = $parameterBag->resolveValue($definition->getFactoryClass(false));
+            } elseif (null !== $definition->getFactoryService(false)) {
+                $factory = $this->get($parameterBag->resolveValue($definition->getFactoryService(false)));
+            } else {
+                throw new RuntimeException(sprintf('Cannot create service "%s" from factory method without a factory service or factory class.', $id));
+            }
+
+            $service = call_user_func_array(array($factory, $definition->getFactoryMethod(false)), $arguments);
+        } else {
+            $r = new \ReflectionClass($parameterBag->resolveValue($definition->getClass()));
+
+            $service = null === $r->getConstructor() ? $r->newInstance() : $r->newInstanceArgs($arguments);
+
+            if (!$definition->isDeprecated() && 0 < strpos($r->getDocComment(), "\n * @deprecated ")) {
+                @trigger_error(sprintf('The "%s" service relies on the deprecated "%s" class. It should either be deprecated or its implementation upgraded.', $id, $r->name), E_USER_DEPRECATED);
+            }
+        }
+
+        if ($tryProxy || !$definition->isLazy()) {
+            // share only if proxying failed, or if not a proxy
+            $this->shareService($definition, $service, $id);
+        }
+
+        foreach ($definition->getMethodCalls() as $call) {
+            $this->callMethod($service, $call);
+        }
+
+        $properties = $this->resolveServices($parameterBag->unescapeValue($parameterBag->resolveValue($definition->getProperties())));
+        foreach ($properties as $name => $value) {
+            $service->$name = $value;
+        }
+
+        if ($callable = $definition->getConfigurator()) {
+            if (is_array($callable)) {
+                $callable[0] = $parameterBag->resolveValue($callable[0]);
+
+                if ($callable[0] instanceof Reference) {
+                    $callable[0] = $this->get((string) $callable[0], $callable[0]->getInvalidBehavior());
+                } elseif ($callable[0] instanceof Definition) {
+                    $callable[0] = $this->createService($callable[0], null);
+                }
+            }
+
+            if (!is_callable($callable)) {
+                throw new InvalidArgumentException(sprintf('The configure callable for class "%s" is not a callable.', get_class($service)));
+            }
+
+            call_user_func($callable, $service);
+        }
+
+        return $service;
+    }
+
+    /**
+     * Replaces service references by the real service instance and evaluates expressions.
+     *
+     * @param mixed $value A value
+     *
+     * @return mixed The same value with all service references replaced by
+     *               the real service instances and all expressions evaluated
+     */
+    public function resolveServices($value)
+    {
+        if (is_array($value)) {
+            foreach ($value as $k => $v) {
+                $value[$k] = $this->resolveServices($v);
+            }
+        } elseif ($value instanceof Reference) {
+            $value = $this->get((string) $value, $value->getInvalidBehavior());
+        } elseif ($value instanceof Definition) {
+            $value = $this->createService($value, null);
+        } elseif ($value instanceof Expression) {
+            $value = $this->getExpressionLanguage()->evaluate($value, array('container' => $this));
+        }
+
+        return $value;
+    }
+
+    /**
+     * Returns service ids for a given tag.
+     *
+     * Example:
+     *
+     * $container->register('foo')->addTag('my.tag', array('hello' => 'world'));
+     *
+     * $serviceIds = $container->findTaggedServiceIds('my.tag');
+     * foreach ($serviceIds as $serviceId => $tags) {
+     *     foreach ($tags as $tag) {
+     *         echo $tag['hello'];
+     *     }
+     * }
+     *
+     * @param string $name The tag name
+     *
+     * @return array An array of tags with the tagged service as key, holding a list of attribute arrays
+     */
+    public function findTaggedServiceIds($name)
+    {
+        $this->usedTags[] = $name;
+        $tags = array();
+        foreach ($this->getDefinitions() as $id => $definition) {
+            if ($definition->hasTag($name)) {
+                $tags[$id] = $definition->getTag($name);
+            }
+        }
+
+        return $tags;
+    }
+
+    /**
+     * Returns all tags the defined services use.
+     *
+     * @return array An array of tags
+     */
+    public function findTags()
+    {
+        $tags = array();
+        foreach ($this->getDefinitions() as $id => $definition) {
+            $tags = array_merge(array_keys($definition->getTags()), $tags);
+        }
+
+        return array_unique($tags);
+    }
+
+    /**
+     * Returns all tags not queried by findTaggedServiceIds.
+     *
+     * @return string[] An array of tags
+     */
+    public function findUnusedTags()
+    {
+        return array_values(array_diff($this->findTags(), $this->usedTags));
+    }
+
+    public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider)
+    {
+        $this->expressionLanguageProviders[] = $provider;
+    }
+
+    /**
+     * @return ExpressionFunctionProviderInterface[]
+     */
+    public function getExpressionLanguageProviders()
+    {
+        return $this->expressionLanguageProviders;
+    }
+
+    /**
+     * Returns the Service Conditionals.
+     *
+     * @param mixed $value An array of conditionals to return
+     *
+     * @return array An array of Service conditionals
+     */
+    public static function getServiceConditionals($value)
+    {
+        $services = array();
+
+        if (is_array($value)) {
+            foreach ($value as $v) {
+                $services = array_unique(array_merge($services, self::getServiceConditionals($v)));
+            }
+        } elseif ($value instanceof Reference && $value->getInvalidBehavior() === ContainerInterface::IGNORE_ON_INVALID_REFERENCE) {
+            $services[] = (string) $value;
+        }
+
+        return $services;
+    }
+
+    /**
+     * Retrieves the currently set proxy instantiator or instantiates one.
+     *
+     * @return InstantiatorInterface
+     */
+    private function getProxyInstantiator()
+    {
+        if (!$this->proxyInstantiator) {
+            $this->proxyInstantiator = new RealServiceInstantiator();
+        }
+
+        return $this->proxyInstantiator;
+    }
+
+    /**
+     * Synchronizes a service change.
+     *
+     * This method updates all services that depend on the given
+     * service by calling all methods referencing it.
+     *
+     * @param string $id A service id
+     *
+     * @deprecated since version 2.7, will be removed in 3.0.
+     */
+    private function synchronize($id)
+    {
+        if ('request' !== $id) {
+            @trigger_error('The '.__METHOD__.' method is deprecated in version 2.7 and will be removed in version 3.0.', E_USER_DEPRECATED);
+        }
+
+        foreach ($this->definitions as $definitionId => $definition) {
+            // only check initialized services
+            if (!$this->initialized($definitionId)) {
+                continue;
+            }
+
+            foreach ($definition->getMethodCalls() as $call) {
+                foreach ($call[1] as $argument) {
+                    if ($argument instanceof Reference && $id == (string) $argument) {
+                        $this->callMethod($this->get($definitionId), $call);
+                    }
+                }
+            }
+        }
+    }
+
+    private function callMethod($service, $call)
+    {
+        $services = self::getServiceConditionals($call[1]);
+
+        foreach ($services as $s) {
+            if (!$this->has($s)) {
+                return;
+            }
+        }
+
+        call_user_func_array(array($service, $call[0]), $this->resolveServices($this->getParameterBag()->unescapeValue($this->getParameterBag()->resolveValue($call[1]))));
+    }
+
+    /**
+     * Shares a given service in the container.
+     *
+     * @param Definition $definition
+     * @param mixed      $service
+     * @param string     $id
+     *
+     * @throws InactiveScopeException
+     */
+    private function shareService(Definition $definition, $service, $id)
+    {
+        if ($definition->isShared() && self::SCOPE_PROTOTYPE !== $scope = $definition->getScope(false)) {
+            if (self::SCOPE_CONTAINER !== $scope && !isset($this->scopedServices[$scope])) {
+                throw new InactiveScopeException($id, $scope);
+            }
+
+            $this->services[$lowerId = strtolower($id)] = $service;
+
+            if (self::SCOPE_CONTAINER !== $scope) {
+                $this->scopedServices[$scope][$lowerId] = $service;
+            }
+        }
+    }
+
+    private function getExpressionLanguage()
+    {
+        if (null === $this->expressionLanguage) {
+            if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) {
+                throw new RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.');
+            }
+            $this->expressionLanguage = new ExpressionLanguage(null, $this->expressionLanguageProviders);
+        }
+
+        return $this->expressionLanguage;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/ContainerInterface.php
@@ -0,0 +1,145 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
+use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
+
+/**
+ * ContainerInterface is the interface implemented by service container classes.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+interface ContainerInterface
+{
+    const EXCEPTION_ON_INVALID_REFERENCE = 1;
+    const NULL_ON_INVALID_REFERENCE = 2;
+    const IGNORE_ON_INVALID_REFERENCE = 3;
+    const SCOPE_CONTAINER = 'container';
+    const SCOPE_PROTOTYPE = 'prototype';
+
+    /**
+     * Sets a service.
+     *
+     * Note: The $scope parameter is deprecated since version 2.8 and will be removed in 3.0.
+     *
+     * @param string $id      The service identifier
+     * @param object $service The service instance
+     * @param string $scope   The scope of the service
+     */
+    public function set($id, $service, $scope = self::SCOPE_CONTAINER);
+
+    /**
+     * Gets a service.
+     *
+     * @param string $id              The service identifier
+     * @param int    $invalidBehavior The behavior when the service does not exist
+     *
+     * @return object The associated service
+     *
+     * @throws ServiceCircularReferenceException When a circular reference is detected
+     * @throws ServiceNotFoundException          When the service is not defined
+     *
+     * @see Reference
+     */
+    public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE);
+
+    /**
+     * Returns true if the given service is defined.
+     *
+     * @param string $id The service identifier
+     *
+     * @return bool true if the service is defined, false otherwise
+     */
+    public function has($id);
+
+    /**
+     * Gets a parameter.
+     *
+     * @param string $name The parameter name
+     *
+     * @return mixed The parameter value
+     *
+     * @throws InvalidArgumentException if the parameter is not defined
+     */
+    public function getParameter($name);
+
+    /**
+     * Checks if a parameter exists.
+     *
+     * @param string $name The parameter name
+     *
+     * @return bool The presence of parameter in container
+     */
+    public function hasParameter($name);
+
+    /**
+     * Sets a parameter.
+     *
+     * @param string $name  The parameter name
+     * @param mixed  $value The parameter value
+     */
+    public function setParameter($name, $value);
+
+    /**
+     * Enters the given scope.
+     *
+     * @param string $name
+     *
+     * @deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function enterScope($name);
+
+    /**
+     * Leaves the current scope, and re-enters the parent scope.
+     *
+     * @param string $name
+     *
+     * @deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function leaveScope($name);
+
+    /**
+     * Adds a scope to the container.
+     *
+     * @param ScopeInterface $scope
+     *
+     * @deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function addScope(ScopeInterface $scope);
+
+    /**
+     * Whether this container has the given scope.
+     *
+     * @param string $name
+     *
+     * @return bool
+     *
+     * @deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function hasScope($name);
+
+    /**
+     * Determines whether the given scope is currently active.
+     *
+     * It does however not check if the scope actually exists.
+     *
+     * @param string $name
+     *
+     * @return bool
+     *
+     * @deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function isScopeActive($name);
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Definition.php
@@ -0,0 +1,913 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException;
+
+/**
+ * Definition represents a service definition.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Definition
+{
+    private $class;
+    private $file;
+    private $factory;
+    private $factoryClass;
+    private $factoryMethod;
+    private $factoryService;
+    private $shared = true;
+    private $deprecated = false;
+    private $deprecationTemplate = 'The "%service_id%" service is deprecated. You should stop using it, as it will soon be removed.';
+    private $scope = ContainerInterface::SCOPE_CONTAINER;
+    private $properties = array();
+    private $calls = array();
+    private $configurator;
+    private $tags = array();
+    private $public = true;
+    private $synthetic = false;
+    private $abstract = false;
+    private $synchronized = false;
+    private $lazy = false;
+    private $decoratedService;
+    private $autowired = false;
+    private $autowiringTypes = array();
+
+    protected $arguments;
+
+    /**
+     * @param string|null $class     The service class
+     * @param array       $arguments An array of arguments to pass to the service constructor
+     */
+    public function __construct($class = null, array $arguments = array())
+    {
+        $this->class = $class;
+        $this->arguments = $arguments;
+    }
+
+    /**
+     * Sets a factory.
+     *
+     * @param string|array $factory A PHP function or an array containing a class/Reference and a method to call
+     *
+     * @return Definition The current instance
+     */
+    public function setFactory($factory)
+    {
+        if (is_string($factory) && strpos($factory, '::') !== false) {
+            $factory = explode('::', $factory, 2);
+        }
+
+        $this->factory = $factory;
+
+        return $this;
+    }
+
+    /**
+     * Gets the factory.
+     *
+     * @return string|array The PHP function or an array containing a class/Reference and a method to call
+     */
+    public function getFactory()
+    {
+        return $this->factory;
+    }
+
+    /**
+     * Sets the name of the class that acts as a factory using the factory method,
+     * which will be invoked statically.
+     *
+     * @param string $factoryClass The factory class name
+     *
+     * @return Definition The current instance
+     *
+     * @deprecated since version 2.6, to be removed in 3.0.
+     */
+    public function setFactoryClass($factoryClass)
+    {
+        @trigger_error(sprintf('%s(%s) is deprecated since version 2.6 and will be removed in 3.0. Use Definition::setFactory() instead.', __METHOD__, $factoryClass), E_USER_DEPRECATED);
+
+        $this->factoryClass = $factoryClass;
+
+        return $this;
+    }
+
+    /**
+     * Gets the factory class.
+     *
+     * @return string|null The factory class name
+     *
+     * @deprecated since version 2.6, to be removed in 3.0.
+     */
+    public function getFactoryClass($triggerDeprecationError = true)
+    {
+        if ($triggerDeprecationError) {
+            @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0.', E_USER_DEPRECATED);
+        }
+
+        return $this->factoryClass;
+    }
+
+    /**
+     * Sets the factory method able to create an instance of this class.
+     *
+     * @param string $factoryMethod The factory method name
+     *
+     * @return Definition The current instance
+     *
+     * @deprecated since version 2.6, to be removed in 3.0.
+     */
+    public function setFactoryMethod($factoryMethod)
+    {
+        @trigger_error(sprintf('%s(%s) is deprecated since version 2.6 and will be removed in 3.0. Use Definition::setFactory() instead.', __METHOD__, $factoryMethod), E_USER_DEPRECATED);
+
+        $this->factoryMethod = $factoryMethod;
+
+        return $this;
+    }
+
+    /**
+     * Sets the service that this service is decorating.
+     *
+     * @param null|string $id        The decorated service id, use null to remove decoration
+     * @param null|string $renamedId The new decorated service id
+     * @param int         $priority  The priority of decoration
+     *
+     * @return Definition The current instance
+     *
+     * @throws InvalidArgumentException In case the decorated service id and the new decorated service id are equals.
+     */
+    public function setDecoratedService($id, $renamedId = null, $priority = 0)
+    {
+        if ($renamedId && $id == $renamedId) {
+            throw new \InvalidArgumentException(sprintf('The decorated service inner name for "%s" must be different than the service name itself.', $id));
+        }
+
+        if (null === $id) {
+            $this->decoratedService = null;
+        } else {
+            $this->decoratedService = array($id, $renamedId, (int) $priority);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Gets the service that decorates this service.
+     *
+     * @return null|array An array composed of the decorated service id, the new id for it and the priority of decoration, null if no service is decorated
+     */
+    public function getDecoratedService()
+    {
+        return $this->decoratedService;
+    }
+
+    /**
+     * Gets the factory method.
+     *
+     * @return string|null The factory method name
+     *
+     * @deprecated since version 2.6, to be removed in 3.0.
+     */
+    public function getFactoryMethod($triggerDeprecationError = true)
+    {
+        if ($triggerDeprecationError) {
+            @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0.', E_USER_DEPRECATED);
+        }
+
+        return $this->factoryMethod;
+    }
+
+    /**
+     * Sets the name of the service that acts as a factory using the factory method.
+     *
+     * @param string $factoryService The factory service id
+     *
+     * @return Definition The current instance
+     *
+     * @deprecated since version 2.6, to be removed in 3.0.
+     */
+    public function setFactoryService($factoryService, $triggerDeprecationError = true)
+    {
+        if ($triggerDeprecationError) {
+            @trigger_error(sprintf('%s(%s) is deprecated since version 2.6 and will be removed in 3.0. Use Definition::setFactory() instead.', __METHOD__, $factoryService), E_USER_DEPRECATED);
+        }
+
+        $this->factoryService = $factoryService;
+
+        return $this;
+    }
+
+    /**
+     * Gets the factory service id.
+     *
+     * @return string|null The factory service id
+     *
+     * @deprecated since version 2.6, to be removed in 3.0.
+     */
+    public function getFactoryService($triggerDeprecationError = true)
+    {
+        if ($triggerDeprecationError) {
+            @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0.', E_USER_DEPRECATED);
+        }
+
+        return $this->factoryService;
+    }
+
+    /**
+     * Sets the service class.
+     *
+     * @param string $class The service class
+     *
+     * @return Definition The current instance
+     */
+    public function setClass($class)
+    {
+        $this->class = $class;
+
+        return $this;
+    }
+
+    /**
+     * Gets the service class.
+     *
+     * @return string|null The service class
+     */
+    public function getClass()
+    {
+        return $this->class;
+    }
+
+    /**
+     * Sets the arguments to pass to the service constructor/factory method.
+     *
+     * @param array $arguments An array of arguments
+     *
+     * @return Definition The current instance
+     */
+    public function setArguments(array $arguments)
+    {
+        $this->arguments = $arguments;
+
+        return $this;
+    }
+
+    public function setProperties(array $properties)
+    {
+        $this->properties = $properties;
+
+        return $this;
+    }
+
+    public function getProperties()
+    {
+        return $this->properties;
+    }
+
+    public function setProperty($name, $value)
+    {
+        $this->properties[$name] = $value;
+
+        return $this;
+    }
+
+    /**
+     * Adds an argument to pass to the service constructor/factory method.
+     *
+     * @param mixed $argument An argument
+     *
+     * @return Definition The current instance
+     */
+    public function addArgument($argument)
+    {
+        $this->arguments[] = $argument;
+
+        return $this;
+    }
+
+    /**
+     * Sets a specific argument.
+     *
+     * @param int   $index
+     * @param mixed $argument
+     *
+     * @return Definition The current instance
+     *
+     * @throws OutOfBoundsException When the replaced argument does not exist
+     */
+    public function replaceArgument($index, $argument)
+    {
+        if ($index < 0 || $index > count($this->arguments) - 1) {
+            throw new OutOfBoundsException(sprintf('The index "%d" is not in the range [0, %d].', $index, count($this->arguments) - 1));
+        }
+
+        $this->arguments[$index] = $argument;
+
+        return $this;
+    }
+
+    /**
+     * Gets the arguments to pass to the service constructor/factory method.
+     *
+     * @return array The array of arguments
+     */
+    public function getArguments()
+    {
+        return $this->arguments;
+    }
+
+    /**
+     * Gets an argument to pass to the service constructor/factory method.
+     *
+     * @param int $index
+     *
+     * @return mixed The argument value
+     *
+     * @throws OutOfBoundsException When the argument does not exist
+     */
+    public function getArgument($index)
+    {
+        if ($index < 0 || $index > count($this->arguments) - 1) {
+            throw new OutOfBoundsException(sprintf('The index "%d" is not in the range [0, %d].', $index, count($this->arguments) - 1));
+        }
+
+        return $this->arguments[$index];
+    }
+
+    /**
+     * Sets the methods to call after service initialization.
+     *
+     * @param array $calls An array of method calls
+     *
+     * @return Definition The current instance
+     */
+    public function setMethodCalls(array $calls = array())
+    {
+        $this->calls = array();
+        foreach ($calls as $call) {
+            $this->addMethodCall($call[0], $call[1]);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Adds a method to call after service initialization.
+     *
+     * @param string $method    The method name to call
+     * @param array  $arguments An array of arguments to pass to the method call
+     *
+     * @return Definition The current instance
+     *
+     * @throws InvalidArgumentException on empty $method param
+     */
+    public function addMethodCall($method, array $arguments = array())
+    {
+        if (empty($method)) {
+            throw new InvalidArgumentException(sprintf('Method name cannot be empty.'));
+        }
+        $this->calls[] = array($method, $arguments);
+
+        return $this;
+    }
+
+    /**
+     * Removes a method to call after service initialization.
+     *
+     * @param string $method The method name to remove
+     *
+     * @return Definition The current instance
+     */
+    public function removeMethodCall($method)
+    {
+        foreach ($this->calls as $i => $call) {
+            if ($call[0] === $method) {
+                unset($this->calls[$i]);
+                break;
+            }
+        }
+
+        return $this;
+    }
+
+    /**
+     * Check if the current definition has a given method to call after service initialization.
+     *
+     * @param string $method The method name to search for
+     *
+     * @return bool
+     */
+    public function hasMethodCall($method)
+    {
+        foreach ($this->calls as $call) {
+            if ($call[0] === $method) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Gets the methods to call after service initialization.
+     *
+     * @return array An array of method calls
+     */
+    public function getMethodCalls()
+    {
+        return $this->calls;
+    }
+
+    /**
+     * Sets tags for this definition.
+     *
+     * @param array $tags
+     *
+     * @return Definition the current instance
+     */
+    public function setTags(array $tags)
+    {
+        $this->tags = $tags;
+
+        return $this;
+    }
+
+    /**
+     * Returns all tags.
+     *
+     * @return array An array of tags
+     */
+    public function getTags()
+    {
+        return $this->tags;
+    }
+
+    /**
+     * Gets a tag by name.
+     *
+     * @param string $name The tag name
+     *
+     * @return array An array of attributes
+     */
+    public function getTag($name)
+    {
+        return isset($this->tags[$name]) ? $this->tags[$name] : array();
+    }
+
+    /**
+     * Adds a tag for this definition.
+     *
+     * @param string $name       The tag name
+     * @param array  $attributes An array of attributes
+     *
+     * @return Definition The current instance
+     */
+    public function addTag($name, array $attributes = array())
+    {
+        $this->tags[$name][] = $attributes;
+
+        return $this;
+    }
+
+    /**
+     * Whether this definition has a tag with the given name.
+     *
+     * @param string $name
+     *
+     * @return bool
+     */
+    public function hasTag($name)
+    {
+        return isset($this->tags[$name]);
+    }
+
+    /**
+     * Clears all tags for a given name.
+     *
+     * @param string $name The tag name
+     *
+     * @return Definition
+     */
+    public function clearTag($name)
+    {
+        unset($this->tags[$name]);
+
+        return $this;
+    }
+
+    /**
+     * Clears the tags for this definition.
+     *
+     * @return Definition The current instance
+     */
+    public function clearTags()
+    {
+        $this->tags = array();
+
+        return $this;
+    }
+
+    /**
+     * Sets a file to require before creating the service.
+     *
+     * @param string $file A full pathname to include
+     *
+     * @return Definition The current instance
+     */
+    public function setFile($file)
+    {
+        $this->file = $file;
+
+        return $this;
+    }
+
+    /**
+     * Gets the file to require before creating the service.
+     *
+     * @return string|null The full pathname to include
+     */
+    public function getFile()
+    {
+        return $this->file;
+    }
+
+    /**
+     * Sets if the service must be shared or not.
+     *
+     * @param bool $shared Whether the service must be shared or not
+     *
+     * @return Definition The current instance
+     */
+    public function setShared($shared)
+    {
+        $this->shared = (bool) $shared;
+
+        return $this;
+    }
+
+    /**
+     * Whether this service is shared.
+     *
+     * @return bool
+     */
+    public function isShared()
+    {
+        return $this->shared;
+    }
+
+    /**
+     * Sets the scope of the service.
+     *
+     * @param string $scope Whether the service must be shared or not
+     *
+     * @return Definition The current instance
+     *
+     * @deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function setScope($scope, $triggerDeprecationError = true)
+    {
+        if ($triggerDeprecationError) {
+            @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+        }
+
+        if (ContainerInterface::SCOPE_PROTOTYPE === $scope) {
+            $this->setShared(false);
+        }
+
+        $this->scope = $scope;
+
+        return $this;
+    }
+
+    /**
+     * Returns the scope of the service.
+     *
+     * @return string
+     *
+     * @deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function getScope($triggerDeprecationError = true)
+    {
+        if ($triggerDeprecationError) {
+            @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+        }
+
+        return $this->scope;
+    }
+
+    /**
+     * Sets the visibility of this service.
+     *
+     * @param bool $boolean
+     *
+     * @return Definition The current instance
+     */
+    public function setPublic($boolean)
+    {
+        $this->public = (bool) $boolean;
+
+        return $this;
+    }
+
+    /**
+     * Whether this service is public facing.
+     *
+     * @return bool
+     */
+    public function isPublic()
+    {
+        return $this->public;
+    }
+
+    /**
+     * Sets the synchronized flag of this service.
+     *
+     * @param bool $boolean
+     *
+     * @return Definition The current instance
+     *
+     * @deprecated since version 2.7, will be removed in 3.0.
+     */
+    public function setSynchronized($boolean, $triggerDeprecationError = true)
+    {
+        if ($triggerDeprecationError) {
+            @trigger_error('The '.__METHOD__.' method is deprecated since version 2.7 and will be removed in 3.0.', E_USER_DEPRECATED);
+        }
+
+        $this->synchronized = (bool) $boolean;
+
+        return $this;
+    }
+
+    /**
+     * Whether this service is synchronized.
+     *
+     * @return bool
+     *
+     * @deprecated since version 2.7, will be removed in 3.0.
+     */
+    public function isSynchronized($triggerDeprecationError = true)
+    {
+        if ($triggerDeprecationError) {
+            @trigger_error('The '.__METHOD__.' method is deprecated since version 2.7 and will be removed in 3.0.', E_USER_DEPRECATED);
+        }
+
+        return $this->synchronized;
+    }
+
+    /**
+     * Sets the lazy flag of this service.
+     *
+     * @param bool $lazy
+     *
+     * @return Definition The current instance
+     */
+    public function setLazy($lazy)
+    {
+        $this->lazy = (bool) $lazy;
+
+        return $this;
+    }
+
+    /**
+     * Whether this service is lazy.
+     *
+     * @return bool
+     */
+    public function isLazy()
+    {
+        return $this->lazy;
+    }
+
+    /**
+     * Sets whether this definition is synthetic, that is not constructed by the
+     * container, but dynamically injected.
+     *
+     * @param bool $boolean
+     *
+     * @return Definition the current instance
+     */
+    public function setSynthetic($boolean)
+    {
+        $this->synthetic = (bool) $boolean;
+
+        return $this;
+    }
+
+    /**
+     * Whether this definition is synthetic, that is not constructed by the
+     * container, but dynamically injected.
+     *
+     * @return bool
+     */
+    public function isSynthetic()
+    {
+        return $this->synthetic;
+    }
+
+    /**
+     * Whether this definition is abstract, that means it merely serves as a
+     * template for other definitions.
+     *
+     * @param bool $boolean
+     *
+     * @return Definition the current instance
+     */
+    public function setAbstract($boolean)
+    {
+        $this->abstract = (bool) $boolean;
+
+        return $this;
+    }
+
+    /**
+     * Whether this definition is abstract, that means it merely serves as a
+     * template for other definitions.
+     *
+     * @return bool
+     */
+    public function isAbstract()
+    {
+        return $this->abstract;
+    }
+
+    /**
+     * Whether this definition is deprecated, that means it should not be called
+     * anymore.
+     *
+     * @param bool   $status
+     * @param string $template Template message to use if the definition is deprecated
+     *
+     * @return Definition the current instance
+     *
+     * @throws InvalidArgumentException When the message template is invalid.
+     */
+    public function setDeprecated($status = true, $template = null)
+    {
+        if (null !== $template) {
+            if (preg_match('#[\r\n]|\*/#', $template)) {
+                throw new InvalidArgumentException('Invalid characters found in deprecation template.');
+            }
+
+            if (false === strpos($template, '%service_id%')) {
+                throw new InvalidArgumentException('The deprecation template must contain the "%service_id%" placeholder.');
+            }
+
+            $this->deprecationTemplate = $template;
+        }
+
+        $this->deprecated = (bool) $status;
+
+        return $this;
+    }
+
+    /**
+     * Whether this definition is deprecated, that means it should not be called
+     * anymore.
+     *
+     * @return bool
+     */
+    public function isDeprecated()
+    {
+        return $this->deprecated;
+    }
+
+    /**
+     * Message to use if this definition is deprecated.
+     *
+     * @param string $id Service id relying on this definition
+     *
+     * @return string
+     */
+    public function getDeprecationMessage($id)
+    {
+        return str_replace('%service_id%', $id, $this->deprecationTemplate);
+    }
+
+    /**
+     * Sets a configurator to call after the service is fully initialized.
+     *
+     * @param callable $callable A PHP callable
+     *
+     * @return Definition The current instance
+     */
+    public function setConfigurator($callable)
+    {
+        $this->configurator = $callable;
+
+        return $this;
+    }
+
+    /**
+     * Gets the configurator to call after the service is fully initialized.
+     *
+     * @return callable|null The PHP callable to call
+     */
+    public function getConfigurator()
+    {
+        return $this->configurator;
+    }
+
+    /**
+     * Sets types that will default to this definition.
+     *
+     * @param string[] $types
+     *
+     * @return Definition The current instance
+     */
+    public function setAutowiringTypes(array $types)
+    {
+        $this->autowiringTypes = array();
+
+        foreach ($types as $type) {
+            $this->autowiringTypes[$type] = true;
+        }
+
+        return $this;
+    }
+
+    /**
+     * Is the definition autowired?
+     *
+     * @return bool
+     */
+    public function isAutowired()
+    {
+        return $this->autowired;
+    }
+
+    /**
+     * Sets autowired.
+     *
+     * @param bool $autowired
+     *
+     * @return Definition The current instance
+     */
+    public function setAutowired($autowired)
+    {
+        $this->autowired = $autowired;
+
+        return $this;
+    }
+
+    /**
+     * Gets autowiring types that will default to this definition.
+     *
+     * @return string[]
+     */
+    public function getAutowiringTypes()
+    {
+        return array_keys($this->autowiringTypes);
+    }
+
+    /**
+     * Adds a type that will default to this definition.
+     *
+     * @param string $type
+     *
+     * @return Definition The current instance
+     */
+    public function addAutowiringType($type)
+    {
+        $this->autowiringTypes[$type] = true;
+
+        return $this;
+    }
+
+    /**
+     * Removes a type.
+     *
+     * @param string $type
+     *
+     * @return Definition The current instance
+     */
+    public function removeAutowiringType($type)
+    {
+        unset($this->autowiringTypes[$type]);
+
+        return $this;
+    }
+
+    /**
+     * Will this definition default for the given type?
+     *
+     * @param string $type
+     *
+     * @return bool
+     */
+    public function hasAutowiringType($type)
+    {
+        return isset($this->autowiringTypes[$type]);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/DefinitionDecorator.php
@@ -0,0 +1,229 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException;
+
+/**
+ * This definition decorates another definition.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class DefinitionDecorator extends Definition
+{
+    private $parent;
+    private $changes = array();
+
+    /**
+     * @param string $parent The id of Definition instance to decorate
+     */
+    public function __construct($parent)
+    {
+        parent::__construct();
+
+        $this->parent = $parent;
+    }
+
+    /**
+     * Returns the Definition being decorated.
+     *
+     * @return string
+     */
+    public function getParent()
+    {
+        return $this->parent;
+    }
+
+    /**
+     * Returns all changes tracked for the Definition object.
+     *
+     * @return array An array of changes for this Definition
+     */
+    public function getChanges()
+    {
+        return $this->changes;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setClass($class)
+    {
+        $this->changes['class'] = true;
+
+        return parent::setClass($class);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFactory($callable)
+    {
+        $this->changes['factory'] = true;
+
+        return parent::setFactory($callable);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFactoryClass($class)
+    {
+        $this->changes['factory_class'] = true;
+
+        return parent::setFactoryClass($class);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFactoryMethod($method)
+    {
+        $this->changes['factory_method'] = true;
+
+        return parent::setFactoryMethod($method);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFactoryService($service, $triggerDeprecationError = true)
+    {
+        $this->changes['factory_service'] = true;
+
+        return parent::setFactoryService($service, $triggerDeprecationError);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setConfigurator($callable)
+    {
+        $this->changes['configurator'] = true;
+
+        return parent::setConfigurator($callable);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFile($file)
+    {
+        $this->changes['file'] = true;
+
+        return parent::setFile($file);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setPublic($boolean)
+    {
+        $this->changes['public'] = true;
+
+        return parent::setPublic($boolean);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setLazy($boolean)
+    {
+        $this->changes['lazy'] = true;
+
+        return parent::setLazy($boolean);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setDecoratedService($id, $renamedId = null, $priority = 0)
+    {
+        $this->changes['decorated_service'] = true;
+
+        return parent::setDecoratedService($id, $renamedId, $priority);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setDeprecated($boolean = true, $template = null)
+    {
+        $this->changes['deprecated'] = true;
+
+        return parent::setDeprecated($boolean, $template);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setAutowired($autowired)
+    {
+        $this->changes['autowire'] = true;
+
+        return parent::setAutowired($autowired);
+    }
+
+    /**
+     * Gets an argument to pass to the service constructor/factory method.
+     *
+     * If replaceArgument() has been used to replace an argument, this method
+     * will return the replacement value.
+     *
+     * @param int $index
+     *
+     * @return mixed The argument value
+     *
+     * @throws OutOfBoundsException When the argument does not exist
+     */
+    public function getArgument($index)
+    {
+        if (array_key_exists('index_'.$index, $this->arguments)) {
+            return $this->arguments['index_'.$index];
+        }
+
+        $lastIndex = count(array_filter(array_keys($this->arguments), 'is_int')) - 1;
+
+        if ($index < 0 || $index > $lastIndex) {
+            throw new OutOfBoundsException(sprintf('The index "%d" is not in the range [0, %d].', $index, $lastIndex));
+        }
+
+        return $this->arguments[$index];
+    }
+
+    /**
+     * You should always use this method when overwriting existing arguments
+     * of the parent definition.
+     *
+     * If you directly call setArguments() keep in mind that you must follow
+     * certain conventions when you want to overwrite the arguments of the
+     * parent definition, otherwise your arguments will only be appended.
+     *
+     * @param int   $index
+     * @param mixed $value
+     *
+     * @return DefinitionDecorator the current instance
+     *
+     * @throws InvalidArgumentException when $index isn't an integer
+     */
+    public function replaceArgument($index, $value)
+    {
+        if (!is_int($index)) {
+            throw new InvalidArgumentException('$index must be an integer.');
+        }
+
+        $this->arguments['index_'.$index] = $value;
+
+        return $this;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Dumper/Dumper.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Dumper;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Dumper is the abstract class for all built-in dumpers.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class Dumper implements DumperInterface
+{
+    protected $container;
+
+    /**
+     * @param ContainerBuilder $container The service container to dump
+     */
+    public function __construct(ContainerBuilder $container)
+    {
+        $this->container = $container;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Dumper/DumperInterface.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Dumper;
+
+/**
+ * DumperInterface is the interface implemented by service container dumper classes.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface DumperInterface
+{
+    /**
+     * Dumps the service container.
+     *
+     * @param array $options An array of options
+     *
+     * @return string The representation of the service container
+     */
+    public function dump(array $options = array());
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Dumper/GraphvizDumper.php
@@ -0,0 +1,306 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Dumper;
+
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\Parameter;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
+use Symfony\Component\DependencyInjection\Scope;
+
+/**
+ * GraphvizDumper dumps a service container as a graphviz file.
+ *
+ * You can convert the generated dot file with the dot utility (http://www.graphviz.org/):
+ *
+ *   dot -Tpng container.dot > foo.png
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class GraphvizDumper extends Dumper
+{
+    private $nodes;
+    private $edges;
+    private $options = array(
+            'graph' => array('ratio' => 'compress'),
+            'node' => array('fontsize' => 11, 'fontname' => 'Arial', 'shape' => 'record'),
+            'edge' => array('fontsize' => 9, 'fontname' => 'Arial', 'color' => 'grey', 'arrowhead' => 'open', 'arrowsize' => 0.5),
+            'node.instance' => array('fillcolor' => '#9999ff', 'style' => 'filled'),
+            'node.definition' => array('fillcolor' => '#eeeeee'),
+            'node.missing' => array('fillcolor' => '#ff9999', 'style' => 'filled'),
+        );
+
+    /**
+     * Dumps the service container as a graphviz graph.
+     *
+     * Available options:
+     *
+     *  * graph: The default options for the whole graph
+     *  * node: The default options for nodes
+     *  * edge: The default options for edges
+     *  * node.instance: The default options for services that are defined directly by object instances
+     *  * node.definition: The default options for services that are defined via service definition instances
+     *  * node.missing: The default options for missing services
+     *
+     * @param array $options An array of options
+     *
+     * @return string The dot representation of the service container
+     */
+    public function dump(array $options = array())
+    {
+        foreach (array('graph', 'node', 'edge', 'node.instance', 'node.definition', 'node.missing') as $key) {
+            if (isset($options[$key])) {
+                $this->options[$key] = array_merge($this->options[$key], $options[$key]);
+            }
+        }
+
+        $this->nodes = $this->findNodes();
+
+        $this->edges = array();
+        foreach ($this->container->getDefinitions() as $id => $definition) {
+            $this->edges[$id] = array_merge(
+                $this->findEdges($id, $definition->getArguments(), true, ''),
+                $this->findEdges($id, $definition->getProperties(), false, '')
+            );
+
+            foreach ($definition->getMethodCalls() as $call) {
+                $this->edges[$id] = array_merge(
+                    $this->edges[$id],
+                    $this->findEdges($id, $call[1], false, $call[0].'()')
+                );
+            }
+        }
+
+        return $this->startDot().$this->addNodes().$this->addEdges().$this->endDot();
+    }
+
+    /**
+     * Returns all nodes.
+     *
+     * @return string A string representation of all nodes
+     */
+    private function addNodes()
+    {
+        $code = '';
+        foreach ($this->nodes as $id => $node) {
+            $aliases = $this->getAliases($id);
+
+            $code .= sprintf("  node_%s [label=\"%s\\n%s\\n\", shape=%s%s];\n", $this->dotize($id), $id.($aliases ? ' ('.implode(', ', $aliases).')' : ''), $node['class'], $this->options['node']['shape'], $this->addAttributes($node['attributes']));
+        }
+
+        return $code;
+    }
+
+    /**
+     * Returns all edges.
+     *
+     * @return string A string representation of all edges
+     */
+    private function addEdges()
+    {
+        $code = '';
+        foreach ($this->edges as $id => $edges) {
+            foreach ($edges as $edge) {
+                $code .= sprintf("  node_%s -> node_%s [label=\"%s\" style=\"%s\"];\n", $this->dotize($id), $this->dotize($edge['to']), $edge['name'], $edge['required'] ? 'filled' : 'dashed');
+            }
+        }
+
+        return $code;
+    }
+
+    /**
+     * Finds all edges belonging to a specific service id.
+     *
+     * @param string $id        The service id used to find edges
+     * @param array  $arguments An array of arguments
+     * @param bool   $required
+     * @param string $name
+     *
+     * @return array An array of edges
+     */
+    private function findEdges($id, array $arguments, $required, $name)
+    {
+        $edges = array();
+        foreach ($arguments as $argument) {
+            if ($argument instanceof Parameter) {
+                $argument = $this->container->hasParameter($argument) ? $this->container->getParameter($argument) : null;
+            } elseif (is_string($argument) && preg_match('/^%([^%]+)%$/', $argument, $match)) {
+                $argument = $this->container->hasParameter($match[1]) ? $this->container->getParameter($match[1]) : null;
+            }
+
+            if ($argument instanceof Reference) {
+                if (!$this->container->has((string) $argument)) {
+                    $this->nodes[(string) $argument] = array('name' => $name, 'required' => $required, 'class' => '', 'attributes' => $this->options['node.missing']);
+                }
+
+                $edges[] = array('name' => $name, 'required' => $required, 'to' => $argument);
+            } elseif (is_array($argument)) {
+                $edges = array_merge($edges, $this->findEdges($id, $argument, $required, $name));
+            }
+        }
+
+        return $edges;
+    }
+
+    /**
+     * Finds all nodes.
+     *
+     * @return array An array of all nodes
+     */
+    private function findNodes()
+    {
+        $nodes = array();
+
+        $container = $this->cloneContainer();
+
+        foreach ($container->getDefinitions() as $id => $definition) {
+            $class = $definition->getClass();
+
+            if ('\\' === substr($class, 0, 1)) {
+                $class = substr($class, 1);
+            }
+
+            try {
+                $class = $this->container->getParameterBag()->resolveValue($class);
+            } catch (ParameterNotFoundException $e) {
+            }
+
+            $nodes[$id] = array('class' => str_replace('\\', '\\\\', $class), 'attributes' => array_merge($this->options['node.definition'], array('style' => $definition->isShared() && ContainerInterface::SCOPE_PROTOTYPE !== $definition->getScope(false) ? 'filled' : 'dotted')));
+            $container->setDefinition($id, new Definition('stdClass'));
+        }
+
+        foreach ($container->getServiceIds() as $id) {
+            $service = $container->get($id);
+
+            if (array_key_exists($id, $container->getAliases())) {
+                continue;
+            }
+
+            if (!$container->hasDefinition($id)) {
+                $class = ('service_container' === $id) ? get_class($this->container) : get_class($service);
+                $nodes[$id] = array('class' => str_replace('\\', '\\\\', $class), 'attributes' => $this->options['node.instance']);
+            }
+        }
+
+        return $nodes;
+    }
+
+    private function cloneContainer()
+    {
+        $parameterBag = new ParameterBag($this->container->getParameterBag()->all());
+
+        $container = new ContainerBuilder($parameterBag);
+        $container->setDefinitions($this->container->getDefinitions());
+        $container->setAliases($this->container->getAliases());
+        $container->setResources($this->container->getResources());
+        foreach ($this->container->getScopes(false) as $scope => $parentScope) {
+            $container->addScope(new Scope($scope, $parentScope));
+        }
+        foreach ($this->container->getExtensions() as $extension) {
+            $container->registerExtension($extension);
+        }
+
+        return $container;
+    }
+
+    /**
+     * Returns the start dot.
+     *
+     * @return string The string representation of a start dot
+     */
+    private function startDot()
+    {
+        return sprintf("digraph sc {\n  %s\n  node [%s];\n  edge [%s];\n\n",
+            $this->addOptions($this->options['graph']),
+            $this->addOptions($this->options['node']),
+            $this->addOptions($this->options['edge'])
+        );
+    }
+
+    /**
+     * Returns the end dot.
+     *
+     * @return string
+     */
+    private function endDot()
+    {
+        return "}\n";
+    }
+
+    /**
+     * Adds attributes.
+     *
+     * @param array $attributes An array of attributes
+     *
+     * @return string A comma separated list of attributes
+     */
+    private function addAttributes(array $attributes)
+    {
+        $code = array();
+        foreach ($attributes as $k => $v) {
+            $code[] = sprintf('%s="%s"', $k, $v);
+        }
+
+        return $code ? ', '.implode(', ', $code) : '';
+    }
+
+    /**
+     * Adds options.
+     *
+     * @param array $options An array of options
+     *
+     * @return string A space separated list of options
+     */
+    private function addOptions(array $options)
+    {
+        $code = array();
+        foreach ($options as $k => $v) {
+            $code[] = sprintf('%s="%s"', $k, $v);
+        }
+
+        return implode(' ', $code);
+    }
+
+    /**
+     * Dotizes an identifier.
+     *
+     * @param string $id The identifier to dotize
+     *
+     * @return string A dotized string
+     */
+    private function dotize($id)
+    {
+        return strtolower(preg_replace('/\W/i', '_', $id));
+    }
+
+    /**
+     * Compiles an array of aliases for a specified service id.
+     *
+     * @param string $id A service id
+     *
+     * @return array An array of aliases
+     */
+    private function getAliases($id)
+    {
+        $aliases = array();
+        foreach ($this->container->getAliases() as $alias => $origin) {
+            if ($id == $origin) {
+                $aliases[] = $alias;
+            }
+        }
+
+        return $aliases;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Dumper/PhpDumper.php
@@ -0,0 +1,1627 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Dumper;
+
+use Symfony\Component\DependencyInjection\Variable;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Container;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\Parameter;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
+use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\DumperInterface as ProxyDumper;
+use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\NullDumper;
+use Symfony\Component\DependencyInjection\ExpressionLanguage;
+use Symfony\Component\ExpressionLanguage\Expression;
+use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
+use Symfony\Component\HttpKernel\Kernel;
+
+/**
+ * PhpDumper dumps a service container as a PHP class.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class PhpDumper extends Dumper
+{
+    /**
+     * Characters that might appear in the generated variable name as first character.
+     *
+     * @var string
+     */
+    const FIRST_CHARS = 'abcdefghijklmnopqrstuvwxyz';
+
+    /**
+     * Characters that might appear in the generated variable name as any but the first character.
+     *
+     * @var string
+     */
+    const NON_FIRST_CHARS = 'abcdefghijklmnopqrstuvwxyz0123456789_';
+
+    private $inlinedDefinitions;
+    private $definitionVariables;
+    private $referenceVariables;
+    private $variableCount;
+    private $reservedVariables = array('instance', 'class');
+    private $expressionLanguage;
+    private $targetDirRegex;
+    private $targetDirMaxMatches;
+    private $docStar;
+
+    /**
+     * @var ExpressionFunctionProviderInterface[]
+     */
+    private $expressionLanguageProviders = array();
+
+    /**
+     * @var \Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\DumperInterface
+     */
+    private $proxyDumper;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct(ContainerBuilder $container)
+    {
+        parent::__construct($container);
+
+        $this->inlinedDefinitions = new \SplObjectStorage();
+    }
+
+    /**
+     * Sets the dumper to be used when dumping proxies in the generated container.
+     *
+     * @param ProxyDumper $proxyDumper
+     */
+    public function setProxyDumper(ProxyDumper $proxyDumper)
+    {
+        $this->proxyDumper = $proxyDumper;
+    }
+
+    /**
+     * Dumps the service container as a PHP class.
+     *
+     * Available options:
+     *
+     *  * class:      The class name
+     *  * base_class: The base class name
+     *  * namespace:  The class namespace
+     *
+     * @param array $options An array of options
+     *
+     * @return string A PHP class representing of the service container
+     */
+    public function dump(array $options = array())
+    {
+        $this->targetDirRegex = null;
+        $options = array_merge(array(
+            'class' => 'ProjectServiceContainer',
+            'base_class' => 'Container',
+            'namespace' => '',
+            'debug' => true,
+        ), $options);
+        $this->docStar = $options['debug'] ? '*' : '';
+
+        if (!empty($options['file']) && is_dir($dir = dirname($options['file']))) {
+            // Build a regexp where the first root dirs are mandatory,
+            // but every other sub-dir is optional up to the full path in $dir
+            // Mandate at least 2 root dirs and not more that 5 optional dirs.
+
+            $dir = explode(DIRECTORY_SEPARATOR, realpath($dir));
+            $i = count($dir);
+
+            if (3 <= $i) {
+                $regex = '';
+                $lastOptionalDir = $i > 8 ? $i - 5 : 3;
+                $this->targetDirMaxMatches = $i - $lastOptionalDir;
+
+                while (--$i >= $lastOptionalDir) {
+                    $regex = sprintf('(%s%s)?', preg_quote(DIRECTORY_SEPARATOR.$dir[$i], '#'), $regex);
+                }
+
+                do {
+                    $regex = preg_quote(DIRECTORY_SEPARATOR.$dir[$i], '#').$regex;
+                } while (0 < --$i);
+
+                $this->targetDirRegex = '#'.preg_quote($dir[0], '#').$regex.'#';
+            }
+        }
+
+        $code = $this->startClass($options['class'], $options['base_class'], $options['namespace']);
+
+        if ($this->container->isFrozen()) {
+            $code .= $this->addFrozenConstructor();
+            $code .= $this->addFrozenCompile();
+            $code .= $this->addIsFrozenMethod();
+        } else {
+            $code .= $this->addConstructor();
+        }
+
+        $code .=
+            $this->addServices().
+            $this->addDefaultParametersMethod().
+            $this->endClass().
+            $this->addProxyClasses()
+        ;
+        $this->targetDirRegex = null;
+
+        return $code;
+    }
+
+    /**
+     * Retrieves the currently set proxy dumper or instantiates one.
+     *
+     * @return ProxyDumper
+     */
+    private function getProxyDumper()
+    {
+        if (!$this->proxyDumper) {
+            $this->proxyDumper = new NullDumper();
+        }
+
+        return $this->proxyDumper;
+    }
+
+    /**
+     * Generates Service local temp variables.
+     *
+     * @param string $cId
+     * @param string $definition
+     *
+     * @return string
+     */
+    private function addServiceLocalTempVariables($cId, $definition)
+    {
+        static $template = "        \$%s = %s;\n";
+
+        $localDefinitions = array_merge(
+            array($definition),
+            $this->getInlinedDefinitions($definition)
+        );
+
+        $calls = $behavior = array();
+        foreach ($localDefinitions as $iDefinition) {
+            $this->getServiceCallsFromArguments($iDefinition->getArguments(), $calls, $behavior);
+            $this->getServiceCallsFromArguments($iDefinition->getMethodCalls(), $calls, $behavior);
+            $this->getServiceCallsFromArguments($iDefinition->getProperties(), $calls, $behavior);
+            $this->getServiceCallsFromArguments(array($iDefinition->getConfigurator()), $calls, $behavior);
+            $this->getServiceCallsFromArguments(array($iDefinition->getFactory()), $calls, $behavior);
+        }
+
+        $code = '';
+        foreach ($calls as $id => $callCount) {
+            if ('service_container' === $id || $id === $cId) {
+                continue;
+            }
+
+            if ($callCount > 1) {
+                $name = $this->getNextVariableName();
+                $this->referenceVariables[$id] = new Variable($name);
+
+                if (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE === $behavior[$id]) {
+                    $code .= sprintf($template, $name, $this->getServiceCall($id));
+                } else {
+                    $code .= sprintf($template, $name, $this->getServiceCall($id, new Reference($id, ContainerInterface::NULL_ON_INVALID_REFERENCE)));
+                }
+            }
+        }
+
+        if ('' !== $code) {
+            $code .= "\n";
+        }
+
+        return $code;
+    }
+
+    /**
+     * Generates code for the proxies to be attached after the container class.
+     *
+     * @return string
+     */
+    private function addProxyClasses()
+    {
+        /* @var $definitions Definition[] */
+        $definitions = array_filter(
+            $this->container->getDefinitions(),
+            array($this->getProxyDumper(), 'isProxyCandidate')
+        );
+        $code = '';
+        $strip = '' === $this->docStar && method_exists('Symfony\Component\HttpKernel\Kernel', 'stripComments');
+
+        foreach ($definitions as $definition) {
+            $proxyCode = "\n".$this->getProxyDumper()->getProxyCode($definition);
+            if ($strip) {
+                $proxyCode = "<?php\n".$proxyCode;
+                $proxyCode = substr(Kernel::stripComments($proxyCode), 5);
+            }
+            $code .= $proxyCode;
+        }
+
+        return $code;
+    }
+
+    /**
+     * Generates the require_once statement for service includes.
+     *
+     * @param string     $id         The service id
+     * @param Definition $definition
+     *
+     * @return string
+     */
+    private function addServiceInclude($id, $definition)
+    {
+        $template = "        require_once %s;\n";
+        $code = '';
+
+        if (null !== $file = $definition->getFile()) {
+            $code .= sprintf($template, $this->dumpValue($file));
+        }
+
+        foreach ($this->getInlinedDefinitions($definition) as $definition) {
+            if (null !== $file = $definition->getFile()) {
+                $code .= sprintf($template, $this->dumpValue($file));
+            }
+        }
+
+        if ('' !== $code) {
+            $code .= "\n";
+        }
+
+        return $code;
+    }
+
+    /**
+     * Generates the inline definition of a service.
+     *
+     * @param string     $id
+     * @param Definition $definition
+     *
+     * @return string
+     *
+     * @throws RuntimeException                  When the factory definition is incomplete
+     * @throws ServiceCircularReferenceException When a circular reference is detected
+     */
+    private function addServiceInlinedDefinitions($id, $definition)
+    {
+        $code = '';
+        $variableMap = $this->definitionVariables;
+        $nbOccurrences = new \SplObjectStorage();
+        $processed = new \SplObjectStorage();
+        $inlinedDefinitions = $this->getInlinedDefinitions($definition);
+
+        foreach ($inlinedDefinitions as $definition) {
+            if (false === $nbOccurrences->contains($definition)) {
+                $nbOccurrences->offsetSet($definition, 1);
+            } else {
+                $i = $nbOccurrences->offsetGet($definition);
+                $nbOccurrences->offsetSet($definition, $i + 1);
+            }
+        }
+
+        foreach ($inlinedDefinitions as $sDefinition) {
+            if ($processed->contains($sDefinition)) {
+                continue;
+            }
+            $processed->offsetSet($sDefinition);
+
+            $class = $this->dumpValue($sDefinition->getClass());
+            if ($nbOccurrences->offsetGet($sDefinition) > 1 || $sDefinition->getMethodCalls() || $sDefinition->getProperties() || null !== $sDefinition->getConfigurator() || false !== strpos($class, '$')) {
+                $name = $this->getNextVariableName();
+                $variableMap->offsetSet($sDefinition, new Variable($name));
+
+                // a construct like:
+                // $a = new ServiceA(ServiceB $b); $b = new ServiceB(ServiceA $a);
+                // this is an indication for a wrong implementation, you can circumvent this problem
+                // by setting up your service structure like this:
+                // $b = new ServiceB();
+                // $a = new ServiceA(ServiceB $b);
+                // $b->setServiceA(ServiceA $a);
+                if ($this->hasReference($id, $sDefinition->getArguments())) {
+                    throw new ServiceCircularReferenceException($id, array($id));
+                }
+
+                $code .= $this->addNewInstance($id, $sDefinition, '$'.$name, ' = ');
+
+                if (!$this->hasReference($id, $sDefinition->getMethodCalls(), true) && !$this->hasReference($id, $sDefinition->getProperties(), true)) {
+                    $code .= $this->addServiceMethodCalls(null, $sDefinition, $name);
+                    $code .= $this->addServiceProperties(null, $sDefinition, $name);
+                    $code .= $this->addServiceConfigurator(null, $sDefinition, $name);
+                }
+
+                $code .= "\n";
+            }
+        }
+
+        return $code;
+    }
+
+    /**
+     * Adds the service return statement.
+     *
+     * @param string     $id         Service id
+     * @param Definition $definition
+     *
+     * @return string
+     */
+    private function addServiceReturn($id, $definition)
+    {
+        if ($this->isSimpleInstance($id, $definition)) {
+            return "    }\n";
+        }
+
+        return "\n        return \$instance;\n    }\n";
+    }
+
+    /**
+     * Generates the service instance.
+     *
+     * @param string     $id
+     * @param Definition $definition
+     *
+     * @return string
+     *
+     * @throws InvalidArgumentException
+     * @throws RuntimeException
+     */
+    private function addServiceInstance($id, Definition $definition)
+    {
+        $class = $definition->getClass();
+
+        if ('\\' === substr($class, 0, 1)) {
+            $class = substr($class, 1);
+        }
+
+        $class = $this->dumpValue($class);
+
+        if (0 === strpos($class, "'") && !preg_match('/^\'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(\\\{2}[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*\'$/', $class)) {
+            throw new InvalidArgumentException(sprintf('"%s" is not a valid class name for the "%s" service.', $class, $id));
+        }
+
+        $simple = $this->isSimpleInstance($id, $definition);
+        $isProxyCandidate = $this->getProxyDumper()->isProxyCandidate($definition);
+        $instantiation = '';
+
+        if (!$isProxyCandidate && $definition->isShared() && ContainerInterface::SCOPE_CONTAINER === $definition->getScope(false)) {
+            $instantiation = "\$this->services['$id'] = ".($simple ? '' : '$instance');
+        } elseif (!$isProxyCandidate && $definition->isShared() && ContainerInterface::SCOPE_PROTOTYPE !== $scope = $definition->getScope(false)) {
+            $instantiation = "\$this->services['$id'] = \$this->scopedServices['$scope']['$id'] = ".($simple ? '' : '$instance');
+        } elseif (!$simple) {
+            $instantiation = '$instance';
+        }
+
+        $return = '';
+        if ($simple) {
+            $return = 'return ';
+        } else {
+            $instantiation .= ' = ';
+        }
+
+        $code = $this->addNewInstance($id, $definition, $return, $instantiation);
+
+        if (!$simple) {
+            $code .= "\n";
+        }
+
+        return $code;
+    }
+
+    /**
+     * Checks if the definition is a simple instance.
+     *
+     * @param string     $id
+     * @param Definition $definition
+     *
+     * @return bool
+     */
+    private function isSimpleInstance($id, Definition $definition)
+    {
+        foreach (array_merge(array($definition), $this->getInlinedDefinitions($definition)) as $sDefinition) {
+            if ($definition !== $sDefinition && !$this->hasReference($id, $sDefinition->getMethodCalls())) {
+                continue;
+            }
+
+            if ($sDefinition->getMethodCalls() || $sDefinition->getProperties() || $sDefinition->getConfigurator()) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Adds method calls to a service definition.
+     *
+     * @param string     $id
+     * @param Definition $definition
+     * @param string     $variableName
+     *
+     * @return string
+     */
+    private function addServiceMethodCalls($id, Definition $definition, $variableName = 'instance')
+    {
+        $calls = '';
+        foreach ($definition->getMethodCalls() as $call) {
+            $arguments = array();
+            foreach ($call[1] as $value) {
+                $arguments[] = $this->dumpValue($value);
+            }
+
+            $calls .= $this->wrapServiceConditionals($call[1], sprintf("        \$%s->%s(%s);\n", $variableName, $call[0], implode(', ', $arguments)));
+        }
+
+        return $calls;
+    }
+
+    private function addServiceProperties($id, Definition $definition, $variableName = 'instance')
+    {
+        $code = '';
+        foreach ($definition->getProperties() as $name => $value) {
+            $code .= sprintf("        \$%s->%s = %s;\n", $variableName, $name, $this->dumpValue($value));
+        }
+
+        return $code;
+    }
+
+    /**
+     * Generates the inline definition setup.
+     *
+     * @param string     $id
+     * @param Definition $definition
+     *
+     * @return string
+     *
+     * @throws ServiceCircularReferenceException when the container contains a circular reference
+     */
+    private function addServiceInlinedDefinitionsSetup($id, Definition $definition)
+    {
+        $this->referenceVariables[$id] = new Variable('instance');
+
+        $code = '';
+        $processed = new \SplObjectStorage();
+        foreach ($this->getInlinedDefinitions($definition) as $iDefinition) {
+            if ($processed->contains($iDefinition)) {
+                continue;
+            }
+            $processed->offsetSet($iDefinition);
+
+            if (!$this->hasReference($id, $iDefinition->getMethodCalls(), true) && !$this->hasReference($id, $iDefinition->getProperties(), true)) {
+                continue;
+            }
+
+            // if the instance is simple, the return statement has already been generated
+            // so, the only possible way to get there is because of a circular reference
+            if ($this->isSimpleInstance($id, $definition)) {
+                throw new ServiceCircularReferenceException($id, array($id));
+            }
+
+            $name = (string) $this->definitionVariables->offsetGet($iDefinition);
+            $code .= $this->addServiceMethodCalls(null, $iDefinition, $name);
+            $code .= $this->addServiceProperties(null, $iDefinition, $name);
+            $code .= $this->addServiceConfigurator(null, $iDefinition, $name);
+        }
+
+        if ('' !== $code) {
+            $code .= "\n";
+        }
+
+        return $code;
+    }
+
+    /**
+     * Adds configurator definition.
+     *
+     * @param string     $id
+     * @param Definition $definition
+     * @param string     $variableName
+     *
+     * @return string
+     */
+    private function addServiceConfigurator($id, Definition $definition, $variableName = 'instance')
+    {
+        if (!$callable = $definition->getConfigurator()) {
+            return '';
+        }
+
+        if (is_array($callable)) {
+            if ($callable[0] instanceof Reference
+                || ($callable[0] instanceof Definition && $this->definitionVariables->contains($callable[0]))) {
+                return sprintf("        %s->%s(\$%s);\n", $this->dumpValue($callable[0]), $callable[1], $variableName);
+            }
+
+            $class = $this->dumpValue($callable[0]);
+            // If the class is a string we can optimize call_user_func away
+            if (strpos($class, "'") === 0) {
+                return sprintf("        %s::%s(\$%s);\n", $this->dumpLiteralClass($class), $callable[1], $variableName);
+            }
+
+            return sprintf("        call_user_func(array(%s, '%s'), \$%s);\n", $this->dumpValue($callable[0]), $callable[1], $variableName);
+        }
+
+        return sprintf("        %s(\$%s);\n", $callable, $variableName);
+    }
+
+    /**
+     * Adds a service.
+     *
+     * @param string     $id
+     * @param Definition $definition
+     *
+     * @return string
+     */
+    private function addService($id, Definition $definition)
+    {
+        $this->definitionVariables = new \SplObjectStorage();
+        $this->referenceVariables = array();
+        $this->variableCount = 0;
+
+        $return = array();
+
+        if ($definition->isSynthetic()) {
+            $return[] = '@throws RuntimeException always since this service is expected to be injected dynamically';
+        } elseif ($class = $definition->getClass()) {
+            $return[] = sprintf('@return %s A %s instance', 0 === strpos($class, '%') ? 'object' : '\\'.ltrim($class, '\\'), ltrim($class, '\\'));
+        } elseif ($definition->getFactory()) {
+            $factory = $definition->getFactory();
+            if (is_string($factory)) {
+                $return[] = sprintf('@return object An instance returned by %s()', $factory);
+            } elseif (is_array($factory) && (is_string($factory[0]) || $factory[0] instanceof Definition || $factory[0] instanceof Reference)) {
+                if (is_string($factory[0]) || $factory[0] instanceof Reference) {
+                    $return[] = sprintf('@return object An instance returned by %s::%s()', (string) $factory[0], $factory[1]);
+                } elseif ($factory[0] instanceof Definition) {
+                    $return[] = sprintf('@return object An instance returned by %s::%s()', $factory[0]->getClass(), $factory[1]);
+                }
+            }
+        } elseif ($definition->getFactoryClass(false)) {
+            $return[] = sprintf('@return object An instance returned by %s::%s()', $definition->getFactoryClass(false), $definition->getFactoryMethod(false));
+        } elseif ($definition->getFactoryService(false)) {
+            $return[] = sprintf('@return object An instance returned by %s::%s()', $definition->getFactoryService(false), $definition->getFactoryMethod(false));
+        }
+
+        $scope = $definition->getScope(false);
+        if (!in_array($scope, array(ContainerInterface::SCOPE_CONTAINER, ContainerInterface::SCOPE_PROTOTYPE))) {
+            if ($return && 0 === strpos($return[count($return) - 1], '@return')) {
+                $return[] = '';
+            }
+            $return[] = sprintf("@throws InactiveScopeException when the '%s' service is requested while the '%s' scope is not active", $id, $scope);
+        }
+
+        if ($definition->isDeprecated()) {
+            if ($return && 0 === strpos($return[count($return) - 1], '@return')) {
+                $return[] = '';
+            }
+
+            $return[] = sprintf('@deprecated %s', $definition->getDeprecationMessage($id));
+        }
+
+        $return = str_replace("\n     * \n", "\n     *\n", implode("\n     * ", $return));
+
+        $doc = '';
+        if ($definition->isShared() && ContainerInterface::SCOPE_PROTOTYPE !== $scope) {
+            $doc .= <<<'EOF'
+
+     *
+     * This service is shared.
+     * This method always returns the same instance of the service.
+EOF;
+        }
+
+        if (!$definition->isPublic()) {
+            $doc .= <<<'EOF'
+
+     *
+     * This service is private.
+     * If you want to be able to request this service from the container directly,
+     * make it public, otherwise you might end up with broken code.
+EOF;
+        }
+
+        if ($definition->isAutowired()) {
+            $doc = <<<EOF
+
+     *
+     * This service is autowired.
+EOF;
+        }
+
+        if ($definition->isLazy()) {
+            $lazyInitialization = '$lazyLoad = true';
+            $lazyInitializationDoc = "\n     * @param bool    \$lazyLoad whether to try lazy-loading the service with a proxy\n     *";
+        } else {
+            $lazyInitialization = '';
+            $lazyInitializationDoc = '';
+        }
+
+        // with proxies, for 5.3.3 compatibility, the getter must be public to be accessible to the initializer
+        $isProxyCandidate = $this->getProxyDumper()->isProxyCandidate($definition);
+        $visibility = $isProxyCandidate ? 'public' : 'protected';
+        $code = <<<EOF
+
+    /*{$this->docStar}
+     * Gets the '$id' service.$doc
+     *$lazyInitializationDoc
+     * $return
+     */
+    {$visibility} function get{$this->camelize($id)}Service($lazyInitialization)
+    {
+
+EOF;
+
+        $code .= $isProxyCandidate ? $this->getProxyDumper()->getProxyFactoryCode($definition, $id) : '';
+
+        if (!in_array($scope, array(ContainerInterface::SCOPE_CONTAINER, ContainerInterface::SCOPE_PROTOTYPE))) {
+            $code .= <<<EOF
+        if (!isset(\$this->scopedServices['$scope'])) {
+            throw new InactiveScopeException('$id', '$scope');
+        }
+
+
+EOF;
+        }
+
+        if ($definition->isSynthetic()) {
+            $code .= sprintf("        throw new RuntimeException('You have requested a synthetic service (\"%s\"). The DIC does not know how to construct this service.');\n    }\n", $id);
+        } else {
+            if ($definition->isDeprecated()) {
+                $code .= sprintf("        @trigger_error(%s, E_USER_DEPRECATED);\n\n", var_export($definition->getDeprecationMessage($id), true));
+            }
+
+            $code .=
+                $this->addServiceInclude($id, $definition).
+                $this->addServiceLocalTempVariables($id, $definition).
+                $this->addServiceInlinedDefinitions($id, $definition).
+                $this->addServiceInstance($id, $definition).
+                $this->addServiceInlinedDefinitionsSetup($id, $definition).
+                $this->addServiceMethodCalls($id, $definition).
+                $this->addServiceProperties($id, $definition).
+                $this->addServiceConfigurator($id, $definition).
+                $this->addServiceReturn($id, $definition)
+            ;
+        }
+
+        $this->definitionVariables = null;
+        $this->referenceVariables = null;
+
+        return $code;
+    }
+
+    /**
+     * Adds multiple services.
+     *
+     * @return string
+     */
+    private function addServices()
+    {
+        $publicServices = $privateServices = $synchronizers = '';
+        $definitions = $this->container->getDefinitions();
+        ksort($definitions);
+        foreach ($definitions as $id => $definition) {
+            if ($definition->isPublic()) {
+                $publicServices .= $this->addService($id, $definition);
+            } else {
+                $privateServices .= $this->addService($id, $definition);
+            }
+
+            $synchronizers .= $this->addServiceSynchronizer($id, $definition);
+        }
+
+        return $publicServices.$synchronizers.$privateServices;
+    }
+
+    /**
+     * Adds synchronizer methods.
+     *
+     * @param string     $id         A service identifier
+     * @param Definition $definition A Definition instance
+     *
+     * @return string|null
+     *
+     * @deprecated since version 2.7, will be removed in 3.0.
+     */
+    private function addServiceSynchronizer($id, Definition $definition)
+    {
+        if (!$definition->isSynchronized(false)) {
+            return;
+        }
+
+        if ('request' !== $id) {
+            @trigger_error('Synchronized services were deprecated in version 2.7 and won\'t work anymore in 3.0.', E_USER_DEPRECATED);
+        }
+
+        $code = '';
+        foreach ($this->container->getDefinitions() as $definitionId => $definition) {
+            foreach ($definition->getMethodCalls() as $call) {
+                foreach ($call[1] as $argument) {
+                    if ($argument instanceof Reference && $id == (string) $argument) {
+                        $arguments = array();
+                        foreach ($call[1] as $value) {
+                            $arguments[] = $this->dumpValue($value);
+                        }
+
+                        $call = $this->wrapServiceConditionals($call[1], sprintf("\$this->get('%s')->%s(%s);", $definitionId, $call[0], implode(', ', $arguments)));
+
+                        $code .= <<<EOF
+        if (\$this->initialized('$definitionId')) {
+            $call
+        }
+
+EOF;
+                    }
+                }
+            }
+        }
+
+        if (!$code) {
+            return;
+        }
+
+        return <<<EOF
+
+    /*{$this->docStar}
+     * Updates the '$id' service.
+     */
+    protected function synchronize{$this->camelize($id)}Service()
+    {
+$code    }
+
+EOF;
+    }
+
+    private function addNewInstance($id, Definition $definition, $return, $instantiation)
+    {
+        $class = $this->dumpValue($definition->getClass());
+
+        $arguments = array();
+        foreach ($definition->getArguments() as $value) {
+            $arguments[] = $this->dumpValue($value);
+        }
+
+        if (null !== $definition->getFactory()) {
+            $callable = $definition->getFactory();
+            if (is_array($callable)) {
+                if (!preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $callable[1])) {
+                    throw new RuntimeException(sprintf('Cannot dump definition because of invalid factory method (%s)', $callable[1] ?: 'n/a'));
+                }
+
+                if ($callable[0] instanceof Reference
+                    || ($callable[0] instanceof Definition && $this->definitionVariables->contains($callable[0]))) {
+                    return sprintf("        $return{$instantiation}%s->%s(%s);\n", $this->dumpValue($callable[0]), $callable[1], $arguments ? implode(', ', $arguments) : '');
+                }
+
+                $class = $this->dumpValue($callable[0]);
+                // If the class is a string we can optimize call_user_func away
+                if (strpos($class, "'") === 0) {
+                    return sprintf("        $return{$instantiation}%s::%s(%s);\n", $this->dumpLiteralClass($class), $callable[1], $arguments ? implode(', ', $arguments) : '');
+                }
+
+                return sprintf("        $return{$instantiation}call_user_func(array(%s, '%s')%s);\n", $this->dumpValue($callable[0]), $callable[1], $arguments ? ', '.implode(', ', $arguments) : '');
+            }
+
+            return sprintf("        $return{$instantiation}\\%s(%s);\n", $callable, $arguments ? implode(', ', $arguments) : '');
+        } elseif (null !== $definition->getFactoryMethod(false)) {
+            if (null !== $definition->getFactoryClass(false)) {
+                $class = $this->dumpValue($definition->getFactoryClass(false));
+
+                // If the class is a string we can optimize call_user_func away
+                if (strpos($class, "'") === 0) {
+                    return sprintf("        $return{$instantiation}%s::%s(%s);\n", $this->dumpLiteralClass($class), $definition->getFactoryMethod(false), $arguments ? implode(', ', $arguments) : '');
+                }
+
+                return sprintf("        $return{$instantiation}call_user_func(array(%s, '%s')%s);\n", $this->dumpValue($definition->getFactoryClass(false)), $definition->getFactoryMethod(false), $arguments ? ', '.implode(', ', $arguments) : '');
+            }
+
+            if (null !== $definition->getFactoryService(false)) {
+                return sprintf("        $return{$instantiation}%s->%s(%s);\n", $this->getServiceCall($definition->getFactoryService(false)), $definition->getFactoryMethod(false), implode(', ', $arguments));
+            }
+
+            throw new RuntimeException(sprintf('Factory method requires a factory service or factory class in service definition for %s', $id));
+        }
+
+        if (false !== strpos($class, '$')) {
+            return sprintf("        \$class = %s;\n\n        $return{$instantiation}new \$class(%s);\n", $class, implode(', ', $arguments));
+        }
+
+        return sprintf("        $return{$instantiation}new %s(%s);\n", $this->dumpLiteralClass($class), implode(', ', $arguments));
+    }
+
+    /**
+     * Adds the class headers.
+     *
+     * @param string $class     Class name
+     * @param string $baseClass The name of the base class
+     * @param string $namespace The class namespace
+     *
+     * @return string
+     */
+    private function startClass($class, $baseClass, $namespace)
+    {
+        $bagClass = $this->container->isFrozen() ? 'use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;' : 'use Symfony\Component\DependencyInjection\ParameterBag\\ParameterBag;';
+        $namespaceLine = $namespace ? "namespace $namespace;\n" : '';
+
+        return <<<EOF
+<?php
+$namespaceLine
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Container;
+use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\LogicException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+$bagClass
+
+/*{$this->docStar}
+ * $class.
+ *
+ * This class has been auto-generated
+ * by the Symfony Dependency Injection Component.
+ */
+class $class extends $baseClass
+{
+    private \$parameters;
+    private \$targetDirs = array();
+
+EOF;
+    }
+
+    /**
+     * Adds the constructor.
+     *
+     * @return string
+     */
+    private function addConstructor()
+    {
+        $targetDirs = $this->exportTargetDirs();
+        $arguments = $this->container->getParameterBag()->all() ? 'new ParameterBag($this->getDefaultParameters())' : null;
+
+        $code = <<<EOF
+
+    /*{$this->docStar}
+     * Constructor.
+     */
+    public function __construct()
+    {{$targetDirs}
+        parent::__construct($arguments);
+
+EOF;
+
+        if (count($scopes = $this->container->getScopes(false)) > 0) {
+            $code .= "\n";
+            $code .= '        $this->scopes = '.$this->dumpValue($scopes).";\n";
+            $code .= '        $this->scopeChildren = '.$this->dumpValue($this->container->getScopeChildren(false)).";\n";
+        }
+
+        $code .= $this->addMethodMap();
+        $code .= $this->addAliases();
+
+        $code .= <<<'EOF'
+    }
+
+EOF;
+
+        return $code;
+    }
+
+    /**
+     * Adds the constructor for a frozen container.
+     *
+     * @return string
+     */
+    private function addFrozenConstructor()
+    {
+        $targetDirs = $this->exportTargetDirs();
+
+        $code = <<<EOF
+
+    /*{$this->docStar}
+     * Constructor.
+     */
+    public function __construct()
+    {{$targetDirs}
+EOF;
+
+        if ($this->container->getParameterBag()->all()) {
+            $code .= "\n        \$this->parameters = \$this->getDefaultParameters();\n";
+        }
+
+        $code .= <<<'EOF'
+
+        $this->services =
+        $this->scopedServices =
+        $this->scopeStacks = array();
+EOF;
+
+        $code .= "\n";
+        if (count($scopes = $this->container->getScopes(false)) > 0) {
+            $code .= '        $this->scopes = '.$this->dumpValue($scopes).";\n";
+            $code .= '        $this->scopeChildren = '.$this->dumpValue($this->container->getScopeChildren(false)).";\n";
+        } else {
+            $code .= "        \$this->scopes = array();\n";
+            $code .= "        \$this->scopeChildren = array();\n";
+        }
+
+        $code .= $this->addMethodMap();
+        $code .= $this->addAliases();
+
+        $code .= <<<'EOF'
+    }
+
+EOF;
+
+        return $code;
+    }
+
+    /**
+     * Adds the constructor for a frozen container.
+     *
+     * @return string
+     */
+    private function addFrozenCompile()
+    {
+        return <<<EOF
+
+    /*{$this->docStar}
+     * {@inheritdoc}
+     */
+    public function compile()
+    {
+        throw new LogicException('You cannot compile a dumped frozen container.');
+    }
+
+EOF;
+    }
+
+    /**
+     * Adds the isFrozen method for a frozen container.
+     *
+     * @return string
+     */
+    private function addIsFrozenMethod()
+    {
+        return <<<EOF
+
+    /*{$this->docStar}
+     * {@inheritdoc}
+     */
+    public function isFrozen()
+    {
+        return true;
+    }
+
+EOF;
+    }
+
+    /**
+     * Adds the methodMap property definition.
+     *
+     * @return string
+     */
+    private function addMethodMap()
+    {
+        if (!$definitions = $this->container->getDefinitions()) {
+            return '';
+        }
+
+        $code = "        \$this->methodMap = array(\n";
+        ksort($definitions);
+        foreach ($definitions as $id => $definition) {
+            $code .= '            '.var_export($id, true).' => '.var_export('get'.$this->camelize($id).'Service', true).",\n";
+        }
+
+        return $code."        );\n";
+    }
+
+    /**
+     * Adds the aliases property definition.
+     *
+     * @return string
+     */
+    private function addAliases()
+    {
+        if (!$aliases = $this->container->getAliases()) {
+            if ($this->container->isFrozen()) {
+                return "\n        \$this->aliases = array();\n";
+            } else {
+                return '';
+            }
+        }
+
+        $code = "        \$this->aliases = array(\n";
+        ksort($aliases);
+        foreach ($aliases as $alias => $id) {
+            $id = (string) $id;
+            while (isset($aliases[$id])) {
+                $id = (string) $aliases[$id];
+            }
+            $code .= '            '.var_export($alias, true).' => '.var_export($id, true).",\n";
+        }
+
+        return $code."        );\n";
+    }
+
+    /**
+     * Adds default parameters method.
+     *
+     * @return string
+     */
+    private function addDefaultParametersMethod()
+    {
+        if (!$this->container->getParameterBag()->all()) {
+            return '';
+        }
+
+        $parameters = $this->exportParameters($this->container->getParameterBag()->all());
+
+        $code = '';
+        if ($this->container->isFrozen()) {
+            $code .= <<<'EOF'
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getParameter($name)
+    {
+        $name = strtolower($name);
+
+        if (!(isset($this->parameters[$name]) || array_key_exists($name, $this->parameters))) {
+            throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
+        }
+
+        return $this->parameters[$name];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasParameter($name)
+    {
+        $name = strtolower($name);
+
+        return isset($this->parameters[$name]) || array_key_exists($name, $this->parameters);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setParameter($name, $value)
+    {
+        throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getParameterBag()
+    {
+        if (null === $this->parameterBag) {
+            $this->parameterBag = new FrozenParameterBag($this->parameters);
+        }
+
+        return $this->parameterBag;
+    }
+
+EOF;
+            if ('' === $this->docStar) {
+                $code = str_replace('/**', '/*', $code);
+            }
+        }
+
+        $code .= <<<EOF
+
+    /*{$this->docStar}
+     * Gets the default parameters.
+     *
+     * @return array An array of the default parameters
+     */
+    protected function getDefaultParameters()
+    {
+        return $parameters;
+    }
+
+EOF;
+
+        return $code;
+    }
+
+    /**
+     * Exports parameters.
+     *
+     * @param array  $parameters
+     * @param string $path
+     * @param int    $indent
+     *
+     * @return string
+     *
+     * @throws InvalidArgumentException
+     */
+    private function exportParameters(array $parameters, $path = '', $indent = 12)
+    {
+        $php = array();
+        foreach ($parameters as $key => $value) {
+            if (is_array($value)) {
+                $value = $this->exportParameters($value, $path.'/'.$key, $indent + 4);
+            } elseif ($value instanceof Variable) {
+                throw new InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain variable references. Variable "%s" found in "%s".', $value, $path.'/'.$key));
+            } elseif ($value instanceof Definition) {
+                throw new InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain service definitions. Definition for "%s" found in "%s".', $value->getClass(), $path.'/'.$key));
+            } elseif ($value instanceof Reference) {
+                throw new InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain references to other services (reference to service "%s" found in "%s").', $value, $path.'/'.$key));
+            } elseif ($value instanceof Expression) {
+                throw new InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain expressions. Expression "%s" found in "%s".', $value, $path.'/'.$key));
+            } else {
+                $value = $this->export($value);
+            }
+
+            $php[] = sprintf('%s%s => %s,', str_repeat(' ', $indent), var_export($key, true), $value);
+        }
+
+        return sprintf("array(\n%s\n%s)", implode("\n", $php), str_repeat(' ', $indent - 4));
+    }
+
+    /**
+     * Ends the class definition.
+     *
+     * @return string
+     */
+    private function endClass()
+    {
+        return <<<'EOF'
+}
+
+EOF;
+    }
+
+    /**
+     * Wraps the service conditionals.
+     *
+     * @param string $value
+     * @param string $code
+     *
+     * @return string
+     */
+    private function wrapServiceConditionals($value, $code)
+    {
+        if (!$services = ContainerBuilder::getServiceConditionals($value)) {
+            return $code;
+        }
+
+        $conditions = array();
+        foreach ($services as $service) {
+            $conditions[] = sprintf("\$this->has('%s')", $service);
+        }
+
+        // re-indent the wrapped code
+        $code = implode("\n", array_map(function ($line) { return $line ? '    '.$line : $line; }, explode("\n", $code)));
+
+        return sprintf("        if (%s) {\n%s        }\n", implode(' && ', $conditions), $code);
+    }
+
+    /**
+     * Builds service calls from arguments.
+     *
+     * @param array $arguments
+     * @param array &$calls    By reference
+     * @param array &$behavior By reference
+     */
+    private function getServiceCallsFromArguments(array $arguments, array &$calls, array &$behavior)
+    {
+        foreach ($arguments as $argument) {
+            if (is_array($argument)) {
+                $this->getServiceCallsFromArguments($argument, $calls, $behavior);
+            } elseif ($argument instanceof Reference) {
+                $id = (string) $argument;
+
+                if (!isset($calls[$id])) {
+                    $calls[$id] = 0;
+                }
+                if (!isset($behavior[$id])) {
+                    $behavior[$id] = $argument->getInvalidBehavior();
+                } elseif (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $behavior[$id]) {
+                    $behavior[$id] = $argument->getInvalidBehavior();
+                }
+
+                ++$calls[$id];
+            }
+        }
+    }
+
+    /**
+     * Returns the inline definition.
+     *
+     * @param Definition $definition
+     *
+     * @return array
+     */
+    private function getInlinedDefinitions(Definition $definition)
+    {
+        if (false === $this->inlinedDefinitions->contains($definition)) {
+            $definitions = array_merge(
+                $this->getDefinitionsFromArguments($definition->getArguments()),
+                $this->getDefinitionsFromArguments($definition->getMethodCalls()),
+                $this->getDefinitionsFromArguments($definition->getProperties()),
+                $this->getDefinitionsFromArguments(array($definition->getConfigurator())),
+                $this->getDefinitionsFromArguments(array($definition->getFactory()))
+            );
+
+            $this->inlinedDefinitions->offsetSet($definition, $definitions);
+
+            return $definitions;
+        }
+
+        return $this->inlinedDefinitions->offsetGet($definition);
+    }
+
+    /**
+     * Gets the definition from arguments.
+     *
+     * @param array $arguments
+     *
+     * @return array
+     */
+    private function getDefinitionsFromArguments(array $arguments)
+    {
+        $definitions = array();
+        foreach ($arguments as $argument) {
+            if (is_array($argument)) {
+                $definitions = array_merge($definitions, $this->getDefinitionsFromArguments($argument));
+            } elseif ($argument instanceof Definition) {
+                $definitions = array_merge(
+                    $definitions,
+                    $this->getInlinedDefinitions($argument),
+                    array($argument)
+                );
+            }
+        }
+
+        return $definitions;
+    }
+
+    /**
+     * Checks if a service id has a reference.
+     *
+     * @param string $id
+     * @param array  $arguments
+     * @param bool   $deep
+     * @param array  $visited
+     *
+     * @return bool
+     */
+    private function hasReference($id, array $arguments, $deep = false, array &$visited = array())
+    {
+        foreach ($arguments as $argument) {
+            if (is_array($argument)) {
+                if ($this->hasReference($id, $argument, $deep, $visited)) {
+                    return true;
+                }
+            } elseif ($argument instanceof Reference) {
+                $argumentId = (string) $argument;
+                if ($id === $argumentId) {
+                    return true;
+                }
+
+                if ($deep && !isset($visited[$argumentId]) && 'service_container' !== $argumentId) {
+                    $visited[$argumentId] = true;
+
+                    $service = $this->container->getDefinition($argumentId);
+                    $arguments = array_merge($service->getMethodCalls(), $service->getArguments(), $service->getProperties());
+
+                    if ($this->hasReference($id, $arguments, $deep, $visited)) {
+                        return true;
+                    }
+                }
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Dumps values.
+     *
+     * @param mixed $value
+     * @param bool  $interpolate
+     *
+     * @return string
+     *
+     * @throws RuntimeException
+     */
+    private function dumpValue($value, $interpolate = true)
+    {
+        if (is_array($value)) {
+            $code = array();
+            foreach ($value as $k => $v) {
+                $code[] = sprintf('%s => %s', $this->dumpValue($k, $interpolate), $this->dumpValue($v, $interpolate));
+            }
+
+            return sprintf('array(%s)', implode(', ', $code));
+        } elseif ($value instanceof Definition) {
+            if (null !== $this->definitionVariables && $this->definitionVariables->contains($value)) {
+                return $this->dumpValue($this->definitionVariables->offsetGet($value), $interpolate);
+            }
+            if (count($value->getMethodCalls()) > 0) {
+                throw new RuntimeException('Cannot dump definitions which have method calls.');
+            }
+            if (null !== $value->getConfigurator()) {
+                throw new RuntimeException('Cannot dump definitions which have a configurator.');
+            }
+
+            $arguments = array();
+            foreach ($value->getArguments() as $argument) {
+                $arguments[] = $this->dumpValue($argument);
+            }
+
+            if (null !== $value->getFactory()) {
+                $factory = $value->getFactory();
+
+                if (is_string($factory)) {
+                    return sprintf('\\%s(%s)', $factory, implode(', ', $arguments));
+                }
+
+                if (is_array($factory)) {
+                    if (!preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $factory[1])) {
+                        throw new RuntimeException(sprintf('Cannot dump definition because of invalid factory method (%s)', $factory[1] ?: 'n/a'));
+                    }
+
+                    if (is_string($factory[0])) {
+                        return sprintf('%s::%s(%s)', $this->dumpLiteralClass($this->dumpValue($factory[0])), $factory[1], implode(', ', $arguments));
+                    }
+
+                    if ($factory[0] instanceof Definition) {
+                        return sprintf("call_user_func(array(%s, '%s')%s)", $this->dumpValue($factory[0]), $factory[1], count($arguments) > 0 ? ', '.implode(', ', $arguments) : '');
+                    }
+
+                    if ($factory[0] instanceof Reference) {
+                        return sprintf('%s->%s(%s)', $this->dumpValue($factory[0]), $factory[1], implode(', ', $arguments));
+                    }
+                }
+
+                throw new RuntimeException('Cannot dump definition because of invalid factory');
+            }
+
+            if (null !== $value->getFactoryMethod(false)) {
+                if (null !== $value->getFactoryClass(false)) {
+                    return sprintf("call_user_func(array(%s, '%s')%s)", $this->dumpValue($value->getFactoryClass(false)), $value->getFactoryMethod(false), count($arguments) > 0 ? ', '.implode(', ', $arguments) : '');
+                } elseif (null !== $value->getFactoryService(false)) {
+                    $service = $this->dumpValue($value->getFactoryService(false));
+
+                    return sprintf('%s->%s(%s)', 0 === strpos($service, '$') ? sprintf('$this->get(%s)', $service) : $this->getServiceCall($value->getFactoryService(false)), $value->getFactoryMethod(false), implode(', ', $arguments));
+                } else {
+                    throw new RuntimeException('Cannot dump definitions which have factory method without factory service or factory class.');
+                }
+            }
+
+            $class = $value->getClass();
+            if (null === $class) {
+                throw new RuntimeException('Cannot dump definitions which have no class nor factory.');
+            }
+
+            return sprintf('new %s(%s)', $this->dumpLiteralClass($this->dumpValue($class)), implode(', ', $arguments));
+        } elseif ($value instanceof Variable) {
+            return '$'.$value;
+        } elseif ($value instanceof Reference) {
+            if (null !== $this->referenceVariables && isset($this->referenceVariables[$id = (string) $value])) {
+                return $this->dumpValue($this->referenceVariables[$id], $interpolate);
+            }
+
+            return $this->getServiceCall((string) $value, $value);
+        } elseif ($value instanceof Expression) {
+            return $this->getExpressionLanguage()->compile((string) $value, array('this' => 'container'));
+        } elseif ($value instanceof Parameter) {
+            return $this->dumpParameter($value);
+        } elseif (true === $interpolate && is_string($value)) {
+            if (preg_match('/^%([^%]+)%$/', $value, $match)) {
+                // we do this to deal with non string values (Boolean, integer, ...)
+                // the preg_replace_callback converts them to strings
+                return $this->dumpParameter(strtolower($match[1]));
+            } else {
+                $that = $this;
+                $replaceParameters = function ($match) use ($that) {
+                    return "'.".$that->dumpParameter(strtolower($match[2])).".'";
+                };
+
+                $code = str_replace('%%', '%', preg_replace_callback('/(?<!%)(%)([^%]+)\1/', $replaceParameters, $this->export($value)));
+
+                return $code;
+            }
+        } elseif (is_object($value) || is_resource($value)) {
+            throw new RuntimeException('Unable to dump a service container if a parameter is an object or a resource.');
+        } else {
+            return $this->export($value);
+        }
+    }
+
+    /**
+     * Dumps a string to a literal (aka PHP Code) class value.
+     *
+     * @param string $class
+     *
+     * @return string
+     *
+     * @throws RuntimeException
+     */
+    private function dumpLiteralClass($class)
+    {
+        if (false !== strpos($class, '$')) {
+            throw new RuntimeException('Cannot dump definitions which have a variable class name.');
+        }
+        if (0 !== strpos($class, "'") || !preg_match('/^\'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(\\\{2}[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*\'$/', $class)) {
+            throw new RuntimeException(sprintf('Cannot dump definition because of invalid class name (%s)', $class ?: 'n/a'));
+        }
+
+        return '\\'.substr(str_replace('\\\\', '\\', $class), 1, -1);
+    }
+
+    /**
+     * Dumps a parameter.
+     *
+     * @param string $name
+     *
+     * @return string
+     */
+    public function dumpParameter($name)
+    {
+        if ($this->container->isFrozen() && $this->container->hasParameter($name)) {
+            return $this->dumpValue($this->container->getParameter($name), false);
+        }
+
+        return sprintf("\$this->getParameter('%s')", strtolower($name));
+    }
+
+    /**
+     * @deprecated since version 2.6.2, to be removed in 3.0.
+     *             Use \Symfony\Component\DependencyInjection\ContainerBuilder::addExpressionLanguageProvider instead.
+     *
+     * @param ExpressionFunctionProviderInterface $provider
+     */
+    public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6.2 and will be removed in 3.0. Use the Symfony\Component\DependencyInjection\ContainerBuilder::addExpressionLanguageProvider method instead.', E_USER_DEPRECATED);
+
+        $this->expressionLanguageProviders[] = $provider;
+    }
+
+    /**
+     * Gets a service call.
+     *
+     * @param string    $id
+     * @param Reference $reference
+     *
+     * @return string
+     */
+    private function getServiceCall($id, Reference $reference = null)
+    {
+        if ('service_container' === $id) {
+            return '$this';
+        }
+
+        if (null !== $reference && ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $reference->getInvalidBehavior()) {
+            return sprintf('$this->get(\'%s\', ContainerInterface::NULL_ON_INVALID_REFERENCE)', $id);
+        } else {
+            if ($this->container->hasAlias($id)) {
+                $id = (string) $this->container->getAlias($id);
+            }
+
+            return sprintf('$this->get(\'%s\')', $id);
+        }
+    }
+
+    /**
+     * Convert a service id to a valid PHP method name.
+     *
+     * @param string $id
+     *
+     * @return string
+     *
+     * @throws InvalidArgumentException
+     */
+    private function camelize($id)
+    {
+        $name = Container::camelize($id);
+
+        if (!preg_match('/^[a-zA-Z0-9_\x7f-\xff]+$/', $name)) {
+            throw new InvalidArgumentException(sprintf('Service id "%s" cannot be converted to a valid PHP method name.', $id));
+        }
+
+        return $name;
+    }
+
+    /**
+     * Returns the next name to use.
+     *
+     * @return string
+     */
+    private function getNextVariableName()
+    {
+        $firstChars = self::FIRST_CHARS;
+        $firstCharsLength = strlen($firstChars);
+        $nonFirstChars = self::NON_FIRST_CHARS;
+        $nonFirstCharsLength = strlen($nonFirstChars);
+
+        while (true) {
+            $name = '';
+            $i = $this->variableCount;
+
+            if ('' === $name) {
+                $name .= $firstChars[$i % $firstCharsLength];
+                $i = (int) ($i / $firstCharsLength);
+            }
+
+            while ($i > 0) {
+                --$i;
+                $name .= $nonFirstChars[$i % $nonFirstCharsLength];
+                $i = (int) ($i / $nonFirstCharsLength);
+            }
+
+            ++$this->variableCount;
+
+            // check that the name is not reserved
+            if (in_array($name, $this->reservedVariables, true)) {
+                continue;
+            }
+
+            return $name;
+        }
+    }
+
+    private function getExpressionLanguage()
+    {
+        if (null === $this->expressionLanguage) {
+            if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) {
+                throw new RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.');
+            }
+            $providers = array_merge($this->container->getExpressionLanguageProviders(), $this->expressionLanguageProviders);
+            $this->expressionLanguage = new ExpressionLanguage(null, $providers);
+
+            if ($this->container->isTrackingResources()) {
+                foreach ($providers as $provider) {
+                    $this->container->addObjectResource($provider);
+                }
+            }
+        }
+
+        return $this->expressionLanguage;
+    }
+
+    private function exportTargetDirs()
+    {
+        return null === $this->targetDirRegex ? '' : <<<EOF
+
+        \$dir = __DIR__;
+        for (\$i = 1; \$i <= {$this->targetDirMaxMatches}; ++\$i) {
+            \$this->targetDirs[\$i] = \$dir = dirname(\$dir);
+        }
+EOF;
+    }
+
+    private function export($value)
+    {
+        if (null !== $this->targetDirRegex && is_string($value) && preg_match($this->targetDirRegex, $value, $matches, PREG_OFFSET_CAPTURE)) {
+            $prefix = $matches[0][1] ? var_export(substr($value, 0, $matches[0][1]), true).'.' : '';
+            $suffix = $matches[0][1] + strlen($matches[0][0]);
+            $suffix = isset($value[$suffix]) ? '.'.var_export(substr($value, $suffix), true) : '';
+            $dirname = '__DIR__';
+
+            if (0 < $offset = 1 + $this->targetDirMaxMatches - count($matches)) {
+                $dirname = sprintf('$this->targetDirs[%d]', $offset);
+            }
+
+            if ($prefix || $suffix) {
+                return sprintf('(%s%s%s)', $prefix, $dirname, $suffix);
+            }
+
+            return $dirname;
+        }
+
+        return var_export($value, true);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Dumper/XmlDumper.php
@@ -0,0 +1,380 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Dumper;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Parameter;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\ExpressionLanguage\Expression;
+
+/**
+ * XmlDumper dumps a service container as an XML string.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Martin Hasoň <martin.hason@gmail.com>
+ */
+class XmlDumper extends Dumper
+{
+    /**
+     * @var \DOMDocument
+     */
+    private $document;
+
+    /**
+     * Dumps the service container as an XML string.
+     *
+     * @param array $options An array of options
+     *
+     * @return string An xml string representing of the service container
+     */
+    public function dump(array $options = array())
+    {
+        $this->document = new \DOMDocument('1.0', 'utf-8');
+        $this->document->formatOutput = true;
+
+        $container = $this->document->createElementNS('http://symfony.com/schema/dic/services', 'container');
+        $container->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
+        $container->setAttribute('xsi:schemaLocation', 'http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd');
+
+        $this->addParameters($container);
+        $this->addServices($container);
+
+        $this->document->appendChild($container);
+        $xml = $this->document->saveXML();
+        $this->document = null;
+
+        return $xml;
+    }
+
+    /**
+     * Adds parameters.
+     *
+     * @param \DOMElement $parent
+     */
+    private function addParameters(\DOMElement $parent)
+    {
+        $data = $this->container->getParameterBag()->all();
+        if (!$data) {
+            return;
+        }
+
+        if ($this->container->isFrozen()) {
+            $data = $this->escape($data);
+        }
+
+        $parameters = $this->document->createElement('parameters');
+        $parent->appendChild($parameters);
+        $this->convertParameters($data, 'parameter', $parameters);
+    }
+
+    /**
+     * Adds method calls.
+     *
+     * @param array       $methodcalls
+     * @param \DOMElement $parent
+     */
+    private function addMethodCalls(array $methodcalls, \DOMElement $parent)
+    {
+        foreach ($methodcalls as $methodcall) {
+            $call = $this->document->createElement('call');
+            $call->setAttribute('method', $methodcall[0]);
+            if (count($methodcall[1])) {
+                $this->convertParameters($methodcall[1], 'argument', $call);
+            }
+            $parent->appendChild($call);
+        }
+    }
+
+    /**
+     * Adds a service.
+     *
+     * @param Definition  $definition
+     * @param string      $id
+     * @param \DOMElement $parent
+     */
+    private function addService($definition, $id, \DOMElement $parent)
+    {
+        $service = $this->document->createElement('service');
+        if (null !== $id) {
+            $service->setAttribute('id', $id);
+        }
+        if ($class = $definition->getClass()) {
+            if ('\\' === substr($class, 0, 1)) {
+                $class = substr($class, 1);
+            }
+
+            $service->setAttribute('class', $class);
+        }
+        if ($definition->getFactoryMethod(false)) {
+            $service->setAttribute('factory-method', $definition->getFactoryMethod(false));
+        }
+        if ($definition->getFactoryClass(false)) {
+            $service->setAttribute('factory-class', $definition->getFactoryClass(false));
+        }
+        if ($definition->getFactoryService(false)) {
+            $service->setAttribute('factory-service', $definition->getFactoryService(false));
+        }
+        if (!$definition->isShared()) {
+            $service->setAttribute('shared', 'false');
+        }
+        if (ContainerInterface::SCOPE_CONTAINER !== $scope = $definition->getScope(false)) {
+            $service->setAttribute('scope', $scope);
+        }
+        if (!$definition->isPublic()) {
+            $service->setAttribute('public', 'false');
+        }
+        if ($definition->isSynthetic()) {
+            $service->setAttribute('synthetic', 'true');
+        }
+        if ($definition->isSynchronized(false)) {
+            $service->setAttribute('synchronized', 'true');
+        }
+        if ($definition->isLazy()) {
+            $service->setAttribute('lazy', 'true');
+        }
+        if (null !== $decorated = $definition->getDecoratedService()) {
+            list($decorated, $renamedId, $priority) = $decorated;
+            $service->setAttribute('decorates', $decorated);
+            if (null !== $renamedId) {
+                $service->setAttribute('decoration-inner-name', $renamedId);
+            }
+            if (0 !== $priority) {
+                $service->setAttribute('decoration-priority', $priority);
+            }
+        }
+
+        foreach ($definition->getTags() as $name => $tags) {
+            foreach ($tags as $attributes) {
+                $tag = $this->document->createElement('tag');
+                $tag->setAttribute('name', $name);
+                foreach ($attributes as $key => $value) {
+                    $tag->setAttribute($key, $value);
+                }
+                $service->appendChild($tag);
+            }
+        }
+
+        if ($definition->getFile()) {
+            $file = $this->document->createElement('file');
+            $file->appendChild($this->document->createTextNode($definition->getFile()));
+            $service->appendChild($file);
+        }
+
+        if ($parameters = $definition->getArguments()) {
+            $this->convertParameters($parameters, 'argument', $service);
+        }
+
+        if ($parameters = $definition->getProperties()) {
+            $this->convertParameters($parameters, 'property', $service, 'name');
+        }
+
+        $this->addMethodCalls($definition->getMethodCalls(), $service);
+
+        if ($callable = $definition->getFactory()) {
+            $factory = $this->document->createElement('factory');
+
+            if (is_array($callable) && $callable[0] instanceof Definition) {
+                $this->addService($callable[0], null, $factory);
+                $factory->setAttribute('method', $callable[1]);
+            } elseif (is_array($callable)) {
+                $factory->setAttribute($callable[0] instanceof Reference ? 'service' : 'class', $callable[0]);
+                $factory->setAttribute('method', $callable[1]);
+            } else {
+                $factory->setAttribute('function', $callable);
+            }
+            $service->appendChild($factory);
+        }
+
+        if ($definition->isDeprecated()) {
+            $deprecated = $this->document->createElement('deprecated');
+            $deprecated->appendChild($this->document->createTextNode($definition->getDeprecationMessage('%service_id%')));
+
+            $service->appendChild($deprecated);
+        }
+
+        if ($definition->isAutowired()) {
+            $service->setAttribute('autowire', 'true');
+        }
+
+        foreach ($definition->getAutowiringTypes() as $autowiringTypeValue) {
+            $autowiringType = $this->document->createElement('autowiring-type');
+            $autowiringType->appendChild($this->document->createTextNode($autowiringTypeValue));
+
+            $service->appendChild($autowiringType);
+        }
+
+        if ($callable = $definition->getConfigurator()) {
+            $configurator = $this->document->createElement('configurator');
+
+            if (is_array($callable) && $callable[0] instanceof Definition) {
+                $this->addService($callable[0], null, $configurator);
+                $configurator->setAttribute('method', $callable[1]);
+            } elseif (is_array($callable)) {
+                $configurator->setAttribute($callable[0] instanceof Reference ? 'service' : 'class', $callable[0]);
+                $configurator->setAttribute('method', $callable[1]);
+            } else {
+                $configurator->setAttribute('function', $callable);
+            }
+            $service->appendChild($configurator);
+        }
+
+        $parent->appendChild($service);
+    }
+
+    /**
+     * Adds a service alias.
+     *
+     * @param string      $alias
+     * @param Alias       $id
+     * @param \DOMElement $parent
+     */
+    private function addServiceAlias($alias, Alias $id, \DOMElement $parent)
+    {
+        $service = $this->document->createElement('service');
+        $service->setAttribute('id', $alias);
+        $service->setAttribute('alias', $id);
+        if (!$id->isPublic()) {
+            $service->setAttribute('public', 'false');
+        }
+        $parent->appendChild($service);
+    }
+
+    /**
+     * Adds services.
+     *
+     * @param \DOMElement $parent
+     */
+    private function addServices(\DOMElement $parent)
+    {
+        $definitions = $this->container->getDefinitions();
+        if (!$definitions) {
+            return;
+        }
+
+        $services = $this->document->createElement('services');
+        foreach ($definitions as $id => $definition) {
+            $this->addService($definition, $id, $services);
+        }
+
+        $aliases = $this->container->getAliases();
+        foreach ($aliases as $alias => $id) {
+            while (isset($aliases[(string) $id])) {
+                $id = $aliases[(string) $id];
+            }
+            $this->addServiceAlias($alias, $id, $services);
+        }
+        $parent->appendChild($services);
+    }
+
+    /**
+     * Converts parameters.
+     *
+     * @param array       $parameters
+     * @param string      $type
+     * @param \DOMElement $parent
+     * @param string      $keyAttribute
+     */
+    private function convertParameters(array $parameters, $type, \DOMElement $parent, $keyAttribute = 'key')
+    {
+        $withKeys = array_keys($parameters) !== range(0, count($parameters) - 1);
+        foreach ($parameters as $key => $value) {
+            $element = $this->document->createElement($type);
+            if ($withKeys) {
+                $element->setAttribute($keyAttribute, $key);
+            }
+
+            if (is_array($value)) {
+                $element->setAttribute('type', 'collection');
+                $this->convertParameters($value, $type, $element, 'key');
+            } elseif ($value instanceof Reference) {
+                $element->setAttribute('type', 'service');
+                $element->setAttribute('id', (string) $value);
+                $behaviour = $value->getInvalidBehavior();
+                if ($behaviour == ContainerInterface::NULL_ON_INVALID_REFERENCE) {
+                    $element->setAttribute('on-invalid', 'null');
+                } elseif ($behaviour == ContainerInterface::IGNORE_ON_INVALID_REFERENCE) {
+                    $element->setAttribute('on-invalid', 'ignore');
+                }
+                if (!$value->isStrict(false)) {
+                    $element->setAttribute('strict', 'false');
+                }
+            } elseif ($value instanceof Definition) {
+                $element->setAttribute('type', 'service');
+                $this->addService($value, null, $element);
+            } elseif ($value instanceof Expression) {
+                $element->setAttribute('type', 'expression');
+                $text = $this->document->createTextNode(self::phpToXml((string) $value));
+                $element->appendChild($text);
+            } else {
+                if (in_array($value, array('null', 'true', 'false'), true)) {
+                    $element->setAttribute('type', 'string');
+                }
+                $text = $this->document->createTextNode(self::phpToXml($value));
+                $element->appendChild($text);
+            }
+            $parent->appendChild($element);
+        }
+    }
+
+    /**
+     * Escapes arguments.
+     *
+     * @param array $arguments
+     *
+     * @return array
+     */
+    private function escape(array $arguments)
+    {
+        $args = array();
+        foreach ($arguments as $k => $v) {
+            if (is_array($v)) {
+                $args[$k] = $this->escape($v);
+            } elseif (is_string($v)) {
+                $args[$k] = str_replace('%', '%%', $v);
+            } else {
+                $args[$k] = $v;
+            }
+        }
+
+        return $args;
+    }
+
+    /**
+     * Converts php types to xml types.
+     *
+     * @param mixed $value Value to convert
+     *
+     * @return string
+     *
+     * @throws RuntimeException When trying to dump object or resource
+     */
+    public static function phpToXml($value)
+    {
+        switch (true) {
+            case null === $value:
+                return 'null';
+            case true === $value:
+                return 'true';
+            case false === $value:
+                return 'false';
+            case $value instanceof Parameter:
+                return '%'.$value.'%';
+            case is_object($value) || is_resource($value):
+                throw new RuntimeException('Unable to dump a service container if a parameter is an object or a resource.');
+            default:
+                return (string) $value;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Dumper/YamlDumper.php
@@ -0,0 +1,368 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Dumper;
+
+use Symfony\Component\Yaml\Dumper as YmlDumper;
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Parameter;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\ExpressionLanguage\Expression;
+
+/**
+ * YamlDumper dumps a service container as a YAML string.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class YamlDumper extends Dumper
+{
+    private $dumper;
+
+    /**
+     * Dumps the service container as an YAML string.
+     *
+     * @param array $options An array of options
+     *
+     * @return string A YAML string representing of the service container
+     */
+    public function dump(array $options = array())
+    {
+        if (!class_exists('Symfony\Component\Yaml\Dumper')) {
+            throw new RuntimeException('Unable to dump the container as the Symfony Yaml Component is not installed.');
+        }
+
+        if (null === $this->dumper) {
+            $this->dumper = new YmlDumper();
+        }
+
+        return $this->addParameters()."\n".$this->addServices();
+    }
+
+    /**
+     * Adds a service.
+     *
+     * @param string     $id
+     * @param Definition $definition
+     *
+     * @return string
+     */
+    private function addService($id, $definition)
+    {
+        $code = "    $id:\n";
+        if ($class = $definition->getClass()) {
+            if ('\\' === substr($class, 0, 1)) {
+                $class = substr($class, 1);
+            }
+
+            $code .= sprintf("        class: %s\n", $this->dumper->dump($class));
+        }
+
+        if (!$definition->isPublic()) {
+            $code .= "        public: false\n";
+        }
+
+        $tagsCode = '';
+        foreach ($definition->getTags() as $name => $tags) {
+            foreach ($tags as $attributes) {
+                $att = array();
+                foreach ($attributes as $key => $value) {
+                    $att[] = sprintf('%s: %s', $this->dumper->dump($key), $this->dumper->dump($value));
+                }
+                $att = $att ? ', '.implode(', ', $att) : '';
+
+                $tagsCode .= sprintf("            - { name: %s%s }\n", $this->dumper->dump($name), $att);
+            }
+        }
+        if ($tagsCode) {
+            $code .= "        tags:\n".$tagsCode;
+        }
+
+        if ($definition->getFile()) {
+            $code .= sprintf("        file: %s\n", $this->dumper->dump($definition->getFile()));
+        }
+
+        if ($definition->isSynthetic()) {
+            $code .= sprintf("        synthetic: true\n");
+        }
+
+        if ($definition->isSynchronized(false)) {
+            $code .= sprintf("        synchronized: true\n");
+        }
+
+        if ($definition->isDeprecated()) {
+            $code .= sprintf("        deprecated: %s\n", $definition->getDeprecationMessage('%service_id%'));
+        }
+
+        if ($definition->isAutowired()) {
+            $code .= "        autowire: true\n";
+        }
+
+        $autowiringTypesCode = '';
+        foreach ($definition->getAutowiringTypes() as $autowiringType) {
+            $autowiringTypesCode .= sprintf("            - %s\n", $this->dumper->dump($autowiringType));
+        }
+        if ($autowiringTypesCode) {
+            $code .= sprintf("        autowiring_types:\n%s", $autowiringTypesCode);
+        }
+
+        if ($definition->getFactoryClass(false)) {
+            $code .= sprintf("        factory_class: %s\n", $this->dumper->dump($definition->getFactoryClass(false)));
+        }
+
+        if ($definition->isLazy()) {
+            $code .= sprintf("        lazy: true\n");
+        }
+
+        if ($definition->getFactoryMethod(false)) {
+            $code .= sprintf("        factory_method: %s\n", $this->dumper->dump($definition->getFactoryMethod(false)));
+        }
+
+        if ($definition->getFactoryService(false)) {
+            $code .= sprintf("        factory_service: %s\n", $this->dumper->dump($definition->getFactoryService(false)));
+        }
+
+        if ($definition->getArguments()) {
+            $code .= sprintf("        arguments: %s\n", $this->dumper->dump($this->dumpValue($definition->getArguments()), 0));
+        }
+
+        if ($definition->getProperties()) {
+            $code .= sprintf("        properties: %s\n", $this->dumper->dump($this->dumpValue($definition->getProperties()), 0));
+        }
+
+        if ($definition->getMethodCalls()) {
+            $code .= sprintf("        calls:\n%s\n", $this->dumper->dump($this->dumpValue($definition->getMethodCalls()), 1, 12));
+        }
+
+        if (!$definition->isShared()) {
+            $code .= "        shared: false\n";
+        }
+
+        if (ContainerInterface::SCOPE_CONTAINER !== $scope = $definition->getScope(false)) {
+            $code .= sprintf("        scope: %s\n", $this->dumper->dump($scope));
+        }
+
+        if (null !== $decorated = $definition->getDecoratedService()) {
+            list($decorated, $renamedId, $priority) = $decorated;
+            $code .= sprintf("        decorates: %s\n", $decorated);
+            if (null !== $renamedId) {
+                $code .= sprintf("        decoration_inner_name: %s\n", $renamedId);
+            }
+            if (0 !== $priority) {
+                $code .= sprintf("        decoration_priority: %s\n", $priority);
+            }
+        }
+
+        if ($callable = $definition->getFactory()) {
+            $code .= sprintf("        factory: %s\n", $this->dumper->dump($this->dumpCallable($callable), 0));
+        }
+
+        if ($callable = $definition->getConfigurator()) {
+            $code .= sprintf("        configurator: %s\n", $this->dumper->dump($this->dumpCallable($callable), 0));
+        }
+
+        return $code;
+    }
+
+    /**
+     * Adds a service alias.
+     *
+     * @param string $alias
+     * @param Alias  $id
+     *
+     * @return string
+     */
+    private function addServiceAlias($alias, $id)
+    {
+        if ($id->isPublic()) {
+            return sprintf("    %s: '@%s'\n", $alias, $id);
+        }
+
+        return sprintf("    %s:\n        alias: %s\n        public: false", $alias, $id);
+    }
+
+    /**
+     * Adds services.
+     *
+     * @return string
+     */
+    private function addServices()
+    {
+        if (!$this->container->getDefinitions()) {
+            return '';
+        }
+
+        $code = "services:\n";
+        foreach ($this->container->getDefinitions() as $id => $definition) {
+            $code .= $this->addService($id, $definition);
+        }
+
+        $aliases = $this->container->getAliases();
+        foreach ($aliases as $alias => $id) {
+            while (isset($aliases[(string) $id])) {
+                $id = $aliases[(string) $id];
+            }
+            $code .= $this->addServiceAlias($alias, $id);
+        }
+
+        return $code;
+    }
+
+    /**
+     * Adds parameters.
+     *
+     * @return string
+     */
+    private function addParameters()
+    {
+        if (!$this->container->getParameterBag()->all()) {
+            return '';
+        }
+
+        $parameters = $this->prepareParameters($this->container->getParameterBag()->all(), $this->container->isFrozen());
+
+        return $this->dumper->dump(array('parameters' => $parameters), 2);
+    }
+
+    /**
+     * Dumps callable to YAML format.
+     *
+     * @param callable $callable
+     *
+     * @return callable
+     */
+    private function dumpCallable($callable)
+    {
+        if (is_array($callable)) {
+            if ($callable[0] instanceof Reference) {
+                $callable = array($this->getServiceCall((string) $callable[0], $callable[0]), $callable[1]);
+            } else {
+                $callable = array($callable[0], $callable[1]);
+            }
+        }
+
+        return $callable;
+    }
+
+    /**
+     * Dumps the value to YAML format.
+     *
+     * @param mixed $value
+     *
+     * @return mixed
+     *
+     * @throws RuntimeException When trying to dump object or resource
+     */
+    private function dumpValue($value)
+    {
+        if (is_array($value)) {
+            $code = array();
+            foreach ($value as $k => $v) {
+                $code[$k] = $this->dumpValue($v);
+            }
+
+            return $code;
+        } elseif ($value instanceof Reference) {
+            return $this->getServiceCall((string) $value, $value);
+        } elseif ($value instanceof Parameter) {
+            return $this->getParameterCall((string) $value);
+        } elseif ($value instanceof Expression) {
+            return $this->getExpressionCall((string) $value);
+        } elseif (is_object($value) || is_resource($value)) {
+            throw new RuntimeException('Unable to dump a service container if a parameter is an object or a resource.');
+        }
+
+        return $value;
+    }
+
+    /**
+     * Gets the service call.
+     *
+     * @param string    $id
+     * @param Reference $reference
+     *
+     * @return string
+     */
+    private function getServiceCall($id, Reference $reference = null)
+    {
+        if (null !== $reference && ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $reference->getInvalidBehavior()) {
+            return sprintf('@?%s', $id);
+        }
+
+        return sprintf('@%s', $id);
+    }
+
+    /**
+     * Gets parameter call.
+     *
+     * @param string $id
+     *
+     * @return string
+     */
+    private function getParameterCall($id)
+    {
+        return sprintf('%%%s%%', $id);
+    }
+
+    private function getExpressionCall($expression)
+    {
+        return sprintf('@=%s', $expression);
+    }
+
+    /**
+     * Prepares parameters.
+     *
+     * @param array $parameters
+     * @param bool  $escape
+     *
+     * @return array
+     */
+    private function prepareParameters(array $parameters, $escape = true)
+    {
+        $filtered = array();
+        foreach ($parameters as $key => $value) {
+            if (is_array($value)) {
+                $value = $this->prepareParameters($value, $escape);
+            } elseif ($value instanceof Reference || is_string($value) && 0 === strpos($value, '@')) {
+                $value = '@'.$value;
+            }
+
+            $filtered[$key] = $value;
+        }
+
+        return $escape ? $this->escape($filtered) : $filtered;
+    }
+
+    /**
+     * Escapes arguments.
+     *
+     * @param array $arguments
+     *
+     * @return array
+     */
+    private function escape(array $arguments)
+    {
+        $args = array();
+        foreach ($arguments as $k => $v) {
+            if (is_array($v)) {
+                $args[$k] = $this->escape($v);
+            } elseif (is_string($v)) {
+                $args[$k] = str_replace('%', '%%', $v);
+            } else {
+                $args[$k] = $v;
+            }
+        }
+
+        return $args;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Exception/BadMethodCallException.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Exception;
+
+/**
+ * Base BadMethodCallException for Dependency Injection component.
+ */
+class BadMethodCallException extends \BadMethodCallException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Exception/ExceptionInterface.php
@@ -0,0 +1,22 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Exception;
+
+/**
+ * Base ExceptionInterface for Dependency Injection component.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Bulat Shakirzyanov <bulat@theopenskyproject.com>
+ */
+interface ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Exception/InactiveScopeException.php
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Exception;
+
+/**
+ * This exception is thrown when you try to create a service of an inactive scope.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class InactiveScopeException extends RuntimeException
+{
+    private $serviceId;
+    private $scope;
+
+    public function __construct($serviceId, $scope, \Exception $previous = null)
+    {
+        parent::__construct(sprintf('You cannot create a service ("%s") of an inactive scope ("%s").', $serviceId, $scope), 0, $previous);
+
+        $this->serviceId = $serviceId;
+        $this->scope = $scope;
+    }
+
+    public function getServiceId()
+    {
+        return $this->serviceId;
+    }
+
+    public function getScope()
+    {
+        return $this->scope;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Exception/InvalidArgumentException.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Exception;
+
+/**
+ * Base InvalidArgumentException for Dependency Injection component.
+ *
+ * @author Bulat Shakirzyanov <bulat@theopenskyproject.com>
+ */
+class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Exception/LogicException.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Exception;
+
+/**
+ * Base LogicException for Dependency Injection component.
+ */
+class LogicException extends \LogicException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Exception/OutOfBoundsException.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Exception;
+
+/**
+ * Base OutOfBoundsException for Dependency Injection component.
+ */
+class OutOfBoundsException extends \OutOfBoundsException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Exception;
+
+/**
+ * This exception is thrown when a circular reference in a parameter is detected.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ParameterCircularReferenceException extends RuntimeException
+{
+    private $parameters;
+
+    public function __construct($parameters, \Exception $previous = null)
+    {
+        parent::__construct(sprintf('Circular reference detected for parameter "%s" ("%s" > "%s").', $parameters[0], implode('" > "', $parameters), $parameters[0]), 0, $previous);
+
+        $this->parameters = $parameters;
+    }
+
+    public function getParameters()
+    {
+        return $this->parameters;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Exception/ParameterNotFoundException.php
@@ -0,0 +1,93 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Exception;
+
+/**
+ * This exception is thrown when a non-existent parameter is used.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ParameterNotFoundException extends InvalidArgumentException
+{
+    private $key;
+    private $sourceId;
+    private $sourceKey;
+    private $alternatives;
+
+    /**
+     * @param string     $key          The requested parameter key
+     * @param string     $sourceId     The service id that references the non-existent parameter
+     * @param string     $sourceKey    The parameter key that references the non-existent parameter
+     * @param \Exception $previous     The previous exception
+     * @param string[]   $alternatives Some parameter name alternatives
+     */
+    public function __construct($key, $sourceId = null, $sourceKey = null, \Exception $previous = null, array $alternatives = array())
+    {
+        $this->key = $key;
+        $this->sourceId = $sourceId;
+        $this->sourceKey = $sourceKey;
+        $this->alternatives = $alternatives;
+
+        parent::__construct('', 0, $previous);
+
+        $this->updateRepr();
+    }
+
+    public function updateRepr()
+    {
+        if (null !== $this->sourceId) {
+            $this->message = sprintf('The service "%s" has a dependency on a non-existent parameter "%s".', $this->sourceId, $this->key);
+        } elseif (null !== $this->sourceKey) {
+            $this->message = sprintf('The parameter "%s" has a dependency on a non-existent parameter "%s".', $this->sourceKey, $this->key);
+        } else {
+            $this->message = sprintf('You have requested a non-existent parameter "%s".', $this->key);
+        }
+
+        if ($this->alternatives) {
+            if (1 == count($this->alternatives)) {
+                $this->message .= ' Did you mean this: "';
+            } else {
+                $this->message .= ' Did you mean one of these: "';
+            }
+            $this->message .= implode('", "', $this->alternatives).'"?';
+        }
+    }
+
+    public function getKey()
+    {
+        return $this->key;
+    }
+
+    public function getSourceId()
+    {
+        return $this->sourceId;
+    }
+
+    public function getSourceKey()
+    {
+        return $this->sourceKey;
+    }
+
+    public function setSourceId($sourceId)
+    {
+        $this->sourceId = $sourceId;
+
+        $this->updateRepr();
+    }
+
+    public function setSourceKey($sourceKey)
+    {
+        $this->sourceKey = $sourceKey;
+
+        $this->updateRepr();
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Exception/RuntimeException.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Exception;
+
+/**
+ * Base RuntimeException for Dependency Injection component.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class RuntimeException extends \RuntimeException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Exception/ScopeCrossingInjectionException.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Exception;
+
+/**
+ * This exception is thrown when the a scope crossing injection is detected.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ScopeCrossingInjectionException extends RuntimeException
+{
+    private $sourceServiceId;
+    private $sourceScope;
+    private $destServiceId;
+    private $destScope;
+
+    public function __construct($sourceServiceId, $sourceScope, $destServiceId, $destScope, \Exception $previous = null)
+    {
+        parent::__construct(sprintf(
+            'Scope Crossing Injection detected: The definition "%s" references the service "%s" which belongs to another scope hierarchy. '
+           .'This service might not be available consistently. Generally, it is safer to either move the definition "%s" to scope "%s", or '
+           .'declare "%s" as a child scope of "%s". If you can be sure that the other scope is always active, you can set the reference to strict=false to get rid of this error.',
+           $sourceServiceId,
+           $destServiceId,
+           $sourceServiceId,
+           $destScope,
+           $sourceScope,
+           $destScope
+        ), 0, $previous);
+
+        $this->sourceServiceId = $sourceServiceId;
+        $this->sourceScope = $sourceScope;
+        $this->destServiceId = $destServiceId;
+        $this->destScope = $destScope;
+    }
+
+    public function getSourceServiceId()
+    {
+        return $this->sourceServiceId;
+    }
+
+    public function getSourceScope()
+    {
+        return $this->sourceScope;
+    }
+
+    public function getDestServiceId()
+    {
+        return $this->destServiceId;
+    }
+
+    public function getDestScope()
+    {
+        return $this->destScope;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Exception/ScopeWideningInjectionException.php
@@ -0,0 +1,64 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Exception;
+
+/**
+ * Thrown when a scope widening injection is detected.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ScopeWideningInjectionException extends RuntimeException
+{
+    private $sourceServiceId;
+    private $sourceScope;
+    private $destServiceId;
+    private $destScope;
+
+    public function __construct($sourceServiceId, $sourceScope, $destServiceId, $destScope, \Exception $previous = null)
+    {
+        parent::__construct(sprintf(
+            'Scope Widening Injection detected: The definition "%s" references the service "%s" which belongs to a narrower scope. '
+           .'Generally, it is safer to either move "%s" to scope "%s" or alternatively rely on the provider pattern by injecting the container itself, and requesting the service "%s" each time it is needed. '
+           .'In rare, special cases however that might not be necessary, then you can set the reference to strict=false to get rid of this error.',
+           $sourceServiceId,
+           $destServiceId,
+           $sourceServiceId,
+           $destScope,
+           $destServiceId
+        ), 0, $previous);
+
+        $this->sourceServiceId = $sourceServiceId;
+        $this->sourceScope = $sourceScope;
+        $this->destServiceId = $destServiceId;
+        $this->destScope = $destScope;
+    }
+
+    public function getSourceServiceId()
+    {
+        return $this->sourceServiceId;
+    }
+
+    public function getSourceScope()
+    {
+        return $this->sourceScope;
+    }
+
+    public function getDestServiceId()
+    {
+        return $this->destServiceId;
+    }
+
+    public function getDestScope()
+    {
+        return $this->destScope;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Exception;
+
+/**
+ * This exception is thrown when a circular reference is detected.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ServiceCircularReferenceException extends RuntimeException
+{
+    private $serviceId;
+    private $path;
+
+    public function __construct($serviceId, array $path, \Exception $previous = null)
+    {
+        parent::__construct(sprintf('Circular reference detected for service "%s", path: "%s".', $serviceId, implode(' -> ', $path)), 0, $previous);
+
+        $this->serviceId = $serviceId;
+        $this->path = $path;
+    }
+
+    public function getServiceId()
+    {
+        return $this->serviceId;
+    }
+
+    public function getPath()
+    {
+        return $this->path;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Exception/ServiceNotFoundException.php
@@ -0,0 +1,56 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Exception;
+
+/**
+ * This exception is thrown when a non-existent service is requested.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ServiceNotFoundException extends InvalidArgumentException
+{
+    private $id;
+    private $sourceId;
+
+    public function __construct($id, $sourceId = null, \Exception $previous = null, array $alternatives = array())
+    {
+        if (null === $sourceId) {
+            $msg = sprintf('You have requested a non-existent service "%s".', $id);
+        } else {
+            $msg = sprintf('The service "%s" has a dependency on a non-existent service "%s".', $sourceId, $id);
+        }
+
+        if ($alternatives) {
+            if (1 == count($alternatives)) {
+                $msg .= ' Did you mean this: "';
+            } else {
+                $msg .= ' Did you mean one of these: "';
+            }
+            $msg .= implode('", "', $alternatives).'"?';
+        }
+
+        parent::__construct($msg, 0, $previous);
+
+        $this->id = $id;
+        $this->sourceId = $sourceId;
+    }
+
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    public function getSourceId()
+    {
+        return $this->sourceId;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/ExpressionLanguage.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+use Symfony\Component\ExpressionLanguage\ExpressionLanguage as BaseExpressionLanguage;
+use Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface;
+
+/**
+ * Adds some function to the default ExpressionLanguage.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @see ExpressionLanguageProvider
+ */
+class ExpressionLanguage extends BaseExpressionLanguage
+{
+    public function __construct(ParserCacheInterface $cache = null, array $providers = array())
+    {
+        // prepend the default provider to let users override it easily
+        array_unshift($providers, new ExpressionLanguageProvider());
+
+        parent::__construct($cache, $providers);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/ExpressionLanguageProvider.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+use Symfony\Component\ExpressionLanguage\ExpressionFunction;
+use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
+
+/**
+ * Define some ExpressionLanguage functions.
+ *
+ * To get a service, use service('request').
+ * To get a parameter, use parameter('kernel.debug').
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ExpressionLanguageProvider implements ExpressionFunctionProviderInterface
+{
+    public function getFunctions()
+    {
+        return array(
+            new ExpressionFunction('service', function ($arg) {
+                return sprintf('$this->get(%s)', $arg);
+            }, function (array $variables, $value) {
+                return $variables['container']->get($value);
+            }),
+
+            new ExpressionFunction('parameter', function ($arg) {
+                return sprintf('$this->getParameter(%s)', $arg);
+            }, function (array $variables, $value) {
+                return $variables['container']->getParameter($value);
+            }),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Extension/ConfigurationExtensionInterface.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Extension;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+
+/**
+ * ConfigurationExtensionInterface is the interface implemented by container extension classes.
+ *
+ * @author Kevin Bond <kevinbond@gmail.com>
+ */
+interface ConfigurationExtensionInterface
+{
+    /**
+     * Returns extension configuration.
+     *
+     * @param array            $config    An array of configuration values
+     * @param ContainerBuilder $container A ContainerBuilder instance
+     *
+     * @return ConfigurationInterface|null The configuration or null
+     */
+    public function getConfiguration(array $config, ContainerBuilder $container);
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Extension/Extension.php
@@ -0,0 +1,118 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Extension;
+
+use Symfony\Component\DependencyInjection\Container;
+use Symfony\Component\DependencyInjection\Exception\BadMethodCallException;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\Config\Definition\Processor;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+
+/**
+ * Provides useful features shared by many extensions.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class Extension implements ExtensionInterface, ConfigurationExtensionInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getXsdValidationBasePath()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getNamespace()
+    {
+        return 'http://example.org/schema/dic/'.$this->getAlias();
+    }
+
+    /**
+     * Returns the recommended alias to use in XML.
+     *
+     * This alias is also the mandatory prefix to use when using YAML.
+     *
+     * This convention is to remove the "Extension" postfix from the class
+     * name and then lowercase and underscore the result. So:
+     *
+     *     AcmeHelloExtension
+     *
+     * becomes
+     *
+     *     acme_hello
+     *
+     * This can be overridden in a sub-class to specify the alias manually.
+     *
+     * @return string The alias
+     *
+     * @throws BadMethodCallException When the extension name does not follow conventions
+     */
+    public function getAlias()
+    {
+        $className = get_class($this);
+        if (substr($className, -9) != 'Extension') {
+            throw new BadMethodCallException('This extension does not follow the naming convention; you must overwrite the getAlias() method.');
+        }
+        $classBaseName = substr(strrchr($className, '\\'), 1, -9);
+
+        return Container::underscore($classBaseName);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getConfiguration(array $config, ContainerBuilder $container)
+    {
+        $reflected = new \ReflectionClass($this);
+        $namespace = $reflected->getNamespaceName();
+
+        $class = $namespace.'\\Configuration';
+        if (class_exists($class)) {
+            $r = new \ReflectionClass($class);
+            $container->addResource(new FileResource($r->getFileName()));
+
+            if (!method_exists($class, '__construct')) {
+                return new $class();
+            }
+        }
+    }
+
+    final protected function processConfiguration(ConfigurationInterface $configuration, array $configs)
+    {
+        $processor = new Processor();
+
+        return $processor->processConfiguration($configuration, $configs);
+    }
+
+    /**
+     * @param ContainerBuilder $container
+     * @param array            $config
+     *
+     * @return bool Whether the configuration is enabled
+     *
+     * @throws InvalidArgumentException When the config is not enableable
+     */
+    protected function isConfigEnabled(ContainerBuilder $container, array $config)
+    {
+        if (!array_key_exists('enabled', $config)) {
+            throw new InvalidArgumentException("The config array has no 'enabled' key.");
+        }
+
+        return (bool) $container->getParameterBag()->resolveValue($config['enabled']);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Extension/ExtensionInterface.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Extension;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * ExtensionInterface is the interface implemented by container extension classes.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface ExtensionInterface
+{
+    /**
+     * Loads a specific configuration.
+     *
+     * @param array            $configs   An array of configuration values
+     * @param ContainerBuilder $container A ContainerBuilder instance
+     *
+     * @throws \InvalidArgumentException When provided tag is not defined in this extension
+     */
+    public function load(array $configs, ContainerBuilder $container);
+
+    /**
+     * Returns the namespace to be used for this extension (XML namespace).
+     *
+     * @return string The XML namespace
+     */
+    public function getNamespace();
+
+    /**
+     * Returns the base path for the XSD files.
+     *
+     * @return string The XSD base path
+     */
+    public function getXsdValidationBasePath();
+
+    /**
+     * Returns the recommended alias to use in XML.
+     *
+     * This alias is also the mandatory prefix to use when using YAML.
+     *
+     * @return string The alias
+     */
+    public function getAlias();
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Extension/PrependExtensionInterface.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Extension;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+interface PrependExtensionInterface
+{
+    /**
+     * Allow an extension to prepend the extension configurations.
+     *
+     * @param ContainerBuilder $container
+     */
+    public function prepend(ContainerBuilder $container);
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/IntrospectableContainerInterface.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+/**
+ * IntrospectableContainerInterface defines additional introspection functionality
+ * for containers, allowing logic to be implemented based on a Container's state.
+ *
+ * @author Evan Villemez <evillemez@gmail.com>
+ *
+ * @deprecated since version 2.8, to be merged with ContainerInterface in 3.0.
+ */
+interface IntrospectableContainerInterface extends ContainerInterface
+{
+    /**
+     * Check for whether or not a service has been initialized.
+     *
+     * @param string $id
+     *
+     * @return bool true if the service has been initialized, false otherwise
+     */
+    public function initialized($id);
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2016 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/symfony/dependency-injection/LazyProxy/Instantiator/InstantiatorInterface.php
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\LazyProxy\Instantiator;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+
+/**
+ * Lazy proxy instantiator, capable of instantiating a proxy given a container, the
+ * service definitions and a callback that produces the real service instance.
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ */
+interface InstantiatorInterface
+{
+    /**
+     * Instantiates a proxy object.
+     *
+     * @param ContainerInterface $container        the container from which the service is being requested
+     * @param Definition         $definition       the definition of the requested service
+     * @param string             $id               identifier of the requested service
+     * @param callable           $realInstantiator zero-argument callback that is capable of producing the real
+     *                                             service instance
+     *
+     * @return object
+     */
+    public function instantiateProxy(ContainerInterface $container, Definition $definition, $id, $realInstantiator);
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/LazyProxy/Instantiator/RealServiceInstantiator.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\LazyProxy\Instantiator;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+
+/**
+ * {@inheritdoc}
+ *
+ * Noop proxy instantiator - simply produces the real service instead of a proxy instance.
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ */
+class RealServiceInstantiator implements InstantiatorInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function instantiateProxy(ContainerInterface $container, Definition $definition, $id, $realInstantiator)
+    {
+        return call_user_func($realInstantiator);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/LazyProxy/PhpDumper/DumperInterface.php
@@ -0,0 +1,50 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\LazyProxy\PhpDumper;
+
+use Symfony\Component\DependencyInjection\Definition;
+
+/**
+ * Lazy proxy dumper capable of generating the instantiation logic PHP code for proxied services.
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ */
+interface DumperInterface
+{
+    /**
+     * Inspects whether the given definitions should produce proxy instantiation logic in the dumped container.
+     *
+     * @param Definition $definition
+     *
+     * @return bool
+     */
+    public function isProxyCandidate(Definition $definition);
+
+    /**
+     * Generates the code to be used to instantiate a proxy in the dumped factory code.
+     *
+     * @param Definition $definition
+     * @param string     $id         service identifier
+     *
+     * @return string
+     */
+    public function getProxyFactoryCode(Definition $definition, $id);
+
+    /**
+     * Generates the code for the lazy proxy.
+     *
+     * @param Definition $definition
+     *
+     * @return string
+     */
+    public function getProxyCode(Definition $definition);
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/LazyProxy/PhpDumper/NullDumper.php
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\LazyProxy\PhpDumper;
+
+use Symfony\Component\DependencyInjection\Definition;
+
+/**
+ * Null dumper, negates any proxy code generation for any given service definition.
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ */
+class NullDumper implements DumperInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function isProxyCandidate(Definition $definition)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getProxyFactoryCode(Definition $definition, $id)
+    {
+        return '';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getProxyCode(Definition $definition)
+    {
+        return '';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Loader/ClosureLoader.php
@@ -0,0 +1,51 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Loader;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\Config\Loader\Loader;
+
+/**
+ * ClosureLoader loads service definitions from a PHP closure.
+ *
+ * The Closure has access to the container as its first argument.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ClosureLoader extends Loader
+{
+    private $container;
+
+    /**
+     * @param ContainerBuilder $container A ContainerBuilder instance
+     */
+    public function __construct(ContainerBuilder $container)
+    {
+        $this->container = $container;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load($resource, $type = null)
+    {
+        call_user_func($resource, $this->container);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($resource, $type = null)
+    {
+        return $resource instanceof \Closure;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Loader/DirectoryLoader.php
@@ -0,0 +1,56 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Loader;
+
+use Symfony\Component\Config\Resource\DirectoryResource;
+
+/**
+ * DirectoryLoader is a recursive loader to go through directories.
+ *
+ * @author Sebastien Lavoie <seb@wemakecustom.com>
+ */
+class DirectoryLoader extends FileLoader
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function load($file, $type = null)
+    {
+        $file = rtrim($file, '/');
+        $path = $this->locator->locate($file);
+        $this->container->addResource(new DirectoryResource($path));
+
+        foreach (scandir($path) as $dir) {
+            if ('.' !== $dir[0]) {
+                if (is_dir($path.'/'.$dir)) {
+                    $dir .= '/'; // append / to allow recursion
+                }
+
+                $this->setCurrentDir($path);
+
+                $this->import($dir, null, false, $path);
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($resource, $type = null)
+    {
+        if ('directory' === $type) {
+            return true;
+        }
+
+        return null === $type && is_string($resource) && '/' === substr($resource, -1);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Loader/FileLoader.php
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Loader;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\Config\Loader\FileLoader as BaseFileLoader;
+use Symfony\Component\Config\FileLocatorInterface;
+
+/**
+ * FileLoader is the abstract class used by all built-in loaders that are file based.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class FileLoader extends BaseFileLoader
+{
+    protected $container;
+
+    /**
+     * @param ContainerBuilder     $container A ContainerBuilder instance
+     * @param FileLocatorInterface $locator   A FileLocator instance
+     */
+    public function __construct(ContainerBuilder $container, FileLocatorInterface $locator)
+    {
+        $this->container = $container;
+
+        parent::__construct($locator);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Loader/IniFileLoader.php
@@ -0,0 +1,52 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Loader;
+
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+
+/**
+ * IniFileLoader loads parameters from INI files.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class IniFileLoader extends FileLoader
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function load($resource, $type = null)
+    {
+        $path = $this->locator->locate($resource);
+
+        $this->container->addResource(new FileResource($path));
+
+        $result = parse_ini_file($path, true);
+        if (false === $result || array() === $result) {
+            throw new InvalidArgumentException(sprintf('The "%s" file is not valid.', $resource));
+        }
+
+        if (isset($result['parameters']) && is_array($result['parameters'])) {
+            foreach ($result['parameters'] as $key => $value) {
+                $this->container->setParameter($key, $value);
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($resource, $type = null)
+    {
+        return is_string($resource) && 'ini' === pathinfo($resource, PATHINFO_EXTENSION);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Loader/PhpFileLoader.php
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Loader;
+
+use Symfony\Component\Config\Resource\FileResource;
+
+/**
+ * PhpFileLoader loads service definitions from a PHP file.
+ *
+ * The PHP file is required and the $container variable can be
+ * used within the file to change the container.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class PhpFileLoader extends FileLoader
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function load($resource, $type = null)
+    {
+        // the container and loader variables are exposed to the included file below
+        $container = $this->container;
+        $loader = $this;
+
+        $path = $this->locator->locate($resource);
+        $this->setCurrentDir(dirname($path));
+        $this->container->addResource(new FileResource($path));
+
+        include $path;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($resource, $type = null)
+    {
+        return is_string($resource) && 'php' === pathinfo($resource, PATHINFO_EXTENSION);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Loader/XmlFileLoader.php
@@ -0,0 +1,594 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Loader;
+
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Config\Util\XmlUtils;
+use Symfony\Component\DependencyInjection\DefinitionDecorator;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\ExpressionLanguage\Expression;
+
+/**
+ * XmlFileLoader loads XML files service definitions.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class XmlFileLoader extends FileLoader
+{
+    const NS = 'http://symfony.com/schema/dic/services';
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load($resource, $type = null)
+    {
+        $path = $this->locator->locate($resource);
+
+        $xml = $this->parseFileToDOM($path);
+
+        $this->container->addResource(new FileResource($path));
+
+        // anonymous services
+        $this->processAnonymousServices($xml, $path);
+
+        // imports
+        $this->parseImports($xml, $path);
+
+        // parameters
+        $this->parseParameters($xml);
+
+        // extensions
+        $this->loadFromExtensions($xml);
+
+        // services
+        $this->parseDefinitions($xml, $path);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($resource, $type = null)
+    {
+        return is_string($resource) && 'xml' === pathinfo($resource, PATHINFO_EXTENSION);
+    }
+
+    /**
+     * Parses parameters.
+     *
+     * @param \DOMDocument $xml
+     */
+    private function parseParameters(\DOMDocument $xml)
+    {
+        if ($parameters = $this->getChildren($xml->documentElement, 'parameters')) {
+            $this->container->getParameterBag()->add($this->getArgumentsAsPhp($parameters[0], 'parameter'));
+        }
+    }
+
+    /**
+     * Parses imports.
+     *
+     * @param \DOMDocument $xml
+     * @param string       $file
+     */
+    private function parseImports(\DOMDocument $xml, $file)
+    {
+        $xpath = new \DOMXPath($xml);
+        $xpath->registerNamespace('container', self::NS);
+
+        if (false === $imports = $xpath->query('//container:imports/container:import')) {
+            return;
+        }
+
+        $defaultDirectory = dirname($file);
+        foreach ($imports as $import) {
+            $this->setCurrentDir($defaultDirectory);
+            $this->import($import->getAttribute('resource'), null, (bool) XmlUtils::phpize($import->getAttribute('ignore-errors')), $file);
+        }
+    }
+
+    /**
+     * Parses multiple definitions.
+     *
+     * @param \DOMDocument $xml
+     * @param string       $file
+     */
+    private function parseDefinitions(\DOMDocument $xml, $file)
+    {
+        $xpath = new \DOMXPath($xml);
+        $xpath->registerNamespace('container', self::NS);
+
+        if (false === $services = $xpath->query('//container:services/container:service')) {
+            return;
+        }
+
+        foreach ($services as $service) {
+            if (null !== $definition = $this->parseDefinition($service, $file)) {
+                $this->container->setDefinition((string) $service->getAttribute('id'), $definition);
+            }
+        }
+    }
+
+    /**
+     * Parses an individual Definition.
+     *
+     * @param \DOMElement $service
+     * @param string      $file
+     *
+     * @return Definition|null
+     */
+    private function parseDefinition(\DOMElement $service, $file)
+    {
+        if ($alias = $service->getAttribute('alias')) {
+            $public = true;
+            if ($publicAttr = $service->getAttribute('public')) {
+                $public = XmlUtils::phpize($publicAttr);
+            }
+            $this->container->setAlias((string) $service->getAttribute('id'), new Alias($alias, $public));
+
+            return;
+        }
+
+        if ($parent = $service->getAttribute('parent')) {
+            $definition = new DefinitionDecorator($parent);
+        } else {
+            $definition = new Definition();
+        }
+
+        foreach (array('class', 'shared', 'public', 'factory-class', 'factory-method', 'factory-service', 'synthetic', 'lazy', 'abstract') as $key) {
+            if ($value = $service->getAttribute($key)) {
+                if (in_array($key, array('factory-class', 'factory-method', 'factory-service'))) {
+                    @trigger_error(sprintf('The "%s" attribute of service "%s" in file "%s" is deprecated since version 2.6 and will be removed in 3.0. Use the "factory" element instead.', $key, (string) $service->getAttribute('id'), $file), E_USER_DEPRECATED);
+                }
+                $method = 'set'.str_replace('-', '', $key);
+                $definition->$method(XmlUtils::phpize($value));
+            }
+        }
+
+        if ($value = $service->getAttribute('autowire')) {
+            $definition->setAutowired(XmlUtils::phpize($value));
+        }
+
+        if ($value = $service->getAttribute('scope')) {
+            $triggerDeprecation = 'request' !== (string) $service->getAttribute('id');
+
+            if ($triggerDeprecation) {
+                @trigger_error(sprintf('The "scope" attribute of service "%s" in file "%s" is deprecated since version 2.8 and will be removed in 3.0.', (string) $service->getAttribute('id'), $file), E_USER_DEPRECATED);
+            }
+
+            $definition->setScope(XmlUtils::phpize($value), false);
+        }
+
+        if ($value = $service->getAttribute('synchronized')) {
+            $triggerDeprecation = 'request' !== (string) $service->getAttribute('id');
+
+            if ($triggerDeprecation) {
+                @trigger_error(sprintf('The "synchronized" attribute of service "%s" in file "%s" is deprecated since version 2.7 and will be removed in 3.0.', (string) $service->getAttribute('id'), $file), E_USER_DEPRECATED);
+            }
+
+            $definition->setSynchronized(XmlUtils::phpize($value), $triggerDeprecation);
+        }
+
+        if ($files = $this->getChildren($service, 'file')) {
+            $definition->setFile($files[0]->nodeValue);
+        }
+
+        if ($deprecated = $this->getChildren($service, 'deprecated')) {
+            $definition->setDeprecated(true, $deprecated[0]->nodeValue ?: null);
+        }
+
+        $definition->setArguments($this->getArgumentsAsPhp($service, 'argument'));
+        $definition->setProperties($this->getArgumentsAsPhp($service, 'property'));
+
+        if ($factories = $this->getChildren($service, 'factory')) {
+            $factory = $factories[0];
+            if ($function = $factory->getAttribute('function')) {
+                $definition->setFactory($function);
+            } else {
+                $factoryService = $this->getChildren($factory, 'service');
+
+                if (isset($factoryService[0])) {
+                    $class = $this->parseDefinition($factoryService[0], $file);
+                } elseif ($childService = $factory->getAttribute('service')) {
+                    $class = new Reference($childService, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, false);
+                } else {
+                    $class = $factory->getAttribute('class');
+                }
+
+                $definition->setFactory(array($class, $factory->getAttribute('method')));
+            }
+        }
+
+        if ($configurators = $this->getChildren($service, 'configurator')) {
+            $configurator = $configurators[0];
+            if ($function = $configurator->getAttribute('function')) {
+                $definition->setConfigurator($function);
+            } else {
+                $configuratorService = $this->getChildren($configurator, 'service');
+
+                if (isset($configuratorService[0])) {
+                    $class = $this->parseDefinition($configuratorService[0], $file);
+                } elseif ($childService = $configurator->getAttribute('service')) {
+                    $class = new Reference($childService, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, false);
+                } else {
+                    $class = $configurator->getAttribute('class');
+                }
+
+                $definition->setConfigurator(array($class, $configurator->getAttribute('method')));
+            }
+        }
+
+        foreach ($this->getChildren($service, 'call') as $call) {
+            $definition->addMethodCall($call->getAttribute('method'), $this->getArgumentsAsPhp($call, 'argument'));
+        }
+
+        foreach ($this->getChildren($service, 'tag') as $tag) {
+            $parameters = array();
+            foreach ($tag->attributes as $name => $node) {
+                if ('name' === $name) {
+                    continue;
+                }
+
+                if (false !== strpos($name, '-') && false === strpos($name, '_') && !array_key_exists($normalizedName = str_replace('-', '_', $name), $parameters)) {
+                    $parameters[$normalizedName] = XmlUtils::phpize($node->nodeValue);
+                }
+                // keep not normalized key for BC too
+                $parameters[$name] = XmlUtils::phpize($node->nodeValue);
+            }
+
+            if ('' === $tag->getAttribute('name')) {
+                throw new InvalidArgumentException(sprintf('The tag name for service "%s" in %s must be a non-empty string.', (string) $service->getAttribute('id'), $file));
+            }
+
+            $definition->addTag($tag->getAttribute('name'), $parameters);
+        }
+
+        foreach ($this->getChildren($service, 'autowiring-type') as $type) {
+            $definition->addAutowiringType($type->textContent);
+        }
+
+        if ($value = $service->getAttribute('decorates')) {
+            $renameId = $service->hasAttribute('decoration-inner-name') ? $service->getAttribute('decoration-inner-name') : null;
+            $priority = $service->hasAttribute('decoration-priority') ? $service->getAttribute('decoration-priority') : 0;
+            $definition->setDecoratedService($value, $renameId, $priority);
+        }
+
+        return $definition;
+    }
+
+    /**
+     * Parses a XML file to a \DOMDocument.
+     *
+     * @param string $file Path to a file
+     *
+     * @return \DOMDocument
+     *
+     * @throws InvalidArgumentException When loading of XML file returns error
+     */
+    private function parseFileToDOM($file)
+    {
+        try {
+            $dom = XmlUtils::loadFile($file, array($this, 'validateSchema'));
+        } catch (\InvalidArgumentException $e) {
+            throw new InvalidArgumentException(sprintf('Unable to parse file "%s".', $file), $e->getCode(), $e);
+        }
+
+        $this->validateExtensions($dom, $file);
+
+        return $dom;
+    }
+
+    /**
+     * Processes anonymous services.
+     *
+     * @param \DOMDocument $xml
+     * @param string       $file
+     */
+    private function processAnonymousServices(\DOMDocument $xml, $file)
+    {
+        $definitions = array();
+        $count = 0;
+
+        $xpath = new \DOMXPath($xml);
+        $xpath->registerNamespace('container', self::NS);
+
+        // anonymous services as arguments/properties
+        if (false !== $nodes = $xpath->query('//container:argument[@type="service"][not(@id)]|//container:property[@type="service"][not(@id)]')) {
+            foreach ($nodes as $node) {
+                // give it a unique name
+                $id = sprintf('%s_%d', hash('sha256', $file), ++$count);
+                $node->setAttribute('id', $id);
+
+                if ($services = $this->getChildren($node, 'service')) {
+                    $definitions[$id] = array($services[0], $file, false);
+                    $services[0]->setAttribute('id', $id);
+
+                    // anonymous services are always private
+                    // we could not use the constant false here, because of XML parsing
+                    $services[0]->setAttribute('public', 'false');
+                }
+            }
+        }
+
+        // anonymous services "in the wild"
+        if (false !== $nodes = $xpath->query('//container:services/container:service[not(@id)]')) {
+            foreach ($nodes as $node) {
+                // give it a unique name
+                $id = sprintf('%s_%d', hash('sha256', $file), ++$count);
+                $node->setAttribute('id', $id);
+                $definitions[$id] = array($node, $file, true);
+            }
+        }
+
+        // resolve definitions
+        krsort($definitions);
+        foreach ($definitions as $id => $def) {
+            list($domElement, $file, $wild) = $def;
+
+            if (null !== $definition = $this->parseDefinition($domElement, $file)) {
+                $this->container->setDefinition($id, $definition);
+            }
+
+            if (true === $wild) {
+                $tmpDomElement = new \DOMElement('_services', null, self::NS);
+                $domElement->parentNode->replaceChild($tmpDomElement, $domElement);
+                $tmpDomElement->setAttribute('id', $id);
+            } else {
+                $domElement->parentNode->removeChild($domElement);
+            }
+        }
+    }
+
+    /**
+     * Returns arguments as valid php types.
+     *
+     * @param \DOMElement $node
+     * @param string      $name
+     * @param bool        $lowercase
+     *
+     * @return mixed
+     */
+    private function getArgumentsAsPhp(\DOMElement $node, $name, $lowercase = true)
+    {
+        $arguments = array();
+        foreach ($this->getChildren($node, $name) as $arg) {
+            if ($arg->hasAttribute('name')) {
+                $arg->setAttribute('key', $arg->getAttribute('name'));
+            }
+
+            if (!$arg->hasAttribute('key')) {
+                $key = !$arguments ? 0 : max(array_keys($arguments)) + 1;
+            } else {
+                $key = $arg->getAttribute('key');
+            }
+
+            // parameter keys are case insensitive
+            if ('parameter' == $name && $lowercase) {
+                $key = strtolower($key);
+            }
+
+            // this is used by DefinitionDecorator to overwrite a specific
+            // argument of the parent definition
+            if ($arg->hasAttribute('index')) {
+                $key = 'index_'.$arg->getAttribute('index');
+            }
+
+            switch ($arg->getAttribute('type')) {
+                case 'service':
+                    $onInvalid = $arg->getAttribute('on-invalid');
+                    $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
+                    if ('ignore' == $onInvalid) {
+                        $invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE;
+                    } elseif ('null' == $onInvalid) {
+                        $invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE;
+                    }
+
+                    if ($strict = $arg->getAttribute('strict')) {
+                        $strict = XmlUtils::phpize($strict);
+                    } else {
+                        $strict = true;
+                    }
+
+                    $arguments[$key] = new Reference($arg->getAttribute('id'), $invalidBehavior, $strict);
+                    break;
+                case 'expression':
+                    $arguments[$key] = new Expression($arg->nodeValue);
+                    break;
+                case 'collection':
+                    $arguments[$key] = $this->getArgumentsAsPhp($arg, $name, false);
+                    break;
+                case 'string':
+                    $arguments[$key] = $arg->nodeValue;
+                    break;
+                case 'constant':
+                    $arguments[$key] = constant(trim($arg->nodeValue));
+                    break;
+                default:
+                    $arguments[$key] = XmlUtils::phpize($arg->nodeValue);
+            }
+        }
+
+        return $arguments;
+    }
+
+    /**
+     * Get child elements by name.
+     *
+     * @param \DOMNode $node
+     * @param mixed    $name
+     *
+     * @return array
+     */
+    private function getChildren(\DOMNode $node, $name)
+    {
+        $children = array();
+        foreach ($node->childNodes as $child) {
+            if ($child instanceof \DOMElement && $child->localName === $name && $child->namespaceURI === self::NS) {
+                $children[] = $child;
+            }
+        }
+
+        return $children;
+    }
+
+    /**
+     * Validates a documents XML schema.
+     *
+     * @param \DOMDocument $dom
+     *
+     * @return bool
+     *
+     * @throws RuntimeException When extension references a non-existent XSD file
+     */
+    public function validateSchema(\DOMDocument $dom)
+    {
+        $schemaLocations = array('http://symfony.com/schema/dic/services' => str_replace('\\', '/', __DIR__.'/schema/dic/services/services-1.0.xsd'));
+
+        if ($element = $dom->documentElement->getAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation')) {
+            $items = preg_split('/\s+/', $element);
+            for ($i = 0, $nb = count($items); $i < $nb; $i += 2) {
+                if (!$this->container->hasExtension($items[$i])) {
+                    continue;
+                }
+
+                if (($extension = $this->container->getExtension($items[$i])) && false !== $extension->getXsdValidationBasePath()) {
+                    $path = str_replace($extension->getNamespace(), str_replace('\\', '/', $extension->getXsdValidationBasePath()).'/', $items[$i + 1]);
+
+                    if (!is_file($path)) {
+                        throw new RuntimeException(sprintf('Extension "%s" references a non-existent XSD file "%s"', get_class($extension), $path));
+                    }
+
+                    $schemaLocations[$items[$i]] = $path;
+                }
+            }
+        }
+
+        $tmpfiles = array();
+        $imports = '';
+        foreach ($schemaLocations as $namespace => $location) {
+            $parts = explode('/', $location);
+            if (0 === stripos($location, 'phar://')) {
+                $tmpfile = tempnam(sys_get_temp_dir(), 'sf2');
+                if ($tmpfile) {
+                    copy($location, $tmpfile);
+                    $tmpfiles[] = $tmpfile;
+                    $parts = explode('/', str_replace('\\', '/', $tmpfile));
+                }
+            }
+            $drive = '\\' === DIRECTORY_SEPARATOR ? array_shift($parts).'/' : '';
+            $location = 'file:///'.$drive.implode('/', array_map('rawurlencode', $parts));
+
+            $imports .= sprintf('  <xsd:import namespace="%s" schemaLocation="%s" />'."\n", $namespace, $location);
+        }
+
+        $source = <<<EOF
+<?xml version="1.0" encoding="utf-8" ?>
+<xsd:schema xmlns="http://symfony.com/schema"
+    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+    targetNamespace="http://symfony.com/schema"
+    elementFormDefault="qualified">
+
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
+$imports
+</xsd:schema>
+EOF
+        ;
+
+        $disableEntities = libxml_disable_entity_loader(false);
+        $valid = @$dom->schemaValidateSource($source);
+        libxml_disable_entity_loader($disableEntities);
+
+        foreach ($tmpfiles as $tmpfile) {
+            @unlink($tmpfile);
+        }
+
+        return $valid;
+    }
+
+    /**
+     * Validates an extension.
+     *
+     * @param \DOMDocument $dom
+     * @param string       $file
+     *
+     * @throws InvalidArgumentException When no extension is found corresponding to a tag
+     */
+    private function validateExtensions(\DOMDocument $dom, $file)
+    {
+        foreach ($dom->documentElement->childNodes as $node) {
+            if (!$node instanceof \DOMElement || 'http://symfony.com/schema/dic/services' === $node->namespaceURI) {
+                continue;
+            }
+
+            // can it be handled by an extension?
+            if (!$this->container->hasExtension($node->namespaceURI)) {
+                $extensionNamespaces = array_filter(array_map(function ($ext) { return $ext->getNamespace(); }, $this->container->getExtensions()));
+                throw new InvalidArgumentException(sprintf(
+                    'There is no extension able to load the configuration for "%s" (in %s). Looked for namespace "%s", found %s',
+                    $node->tagName,
+                    $file,
+                    $node->namespaceURI,
+                    $extensionNamespaces ? sprintf('"%s"', implode('", "', $extensionNamespaces)) : 'none'
+                ));
+            }
+        }
+    }
+
+    /**
+     * Loads from an extension.
+     *
+     * @param \DOMDocument $xml
+     */
+    private function loadFromExtensions(\DOMDocument $xml)
+    {
+        foreach ($xml->documentElement->childNodes as $node) {
+            if (!$node instanceof \DOMElement || $node->namespaceURI === self::NS) {
+                continue;
+            }
+
+            $values = static::convertDomElementToArray($node);
+            if (!is_array($values)) {
+                $values = array();
+            }
+
+            $this->container->loadFromExtension($node->namespaceURI, $values);
+        }
+    }
+
+    /**
+     * Converts a \DomElement object to a PHP array.
+     *
+     * The following rules applies during the conversion:
+     *
+     *  * Each tag is converted to a key value or an array
+     *    if there is more than one "value"
+     *
+     *  * The content of a tag is set under a "value" key (<foo>bar</foo>)
+     *    if the tag also has some nested tags
+     *
+     *  * The attributes are converted to keys (<foo foo="bar"/>)
+     *
+     *  * The nested-tags are converted to keys (<foo><foo>bar</foo></foo>)
+     *
+     * @param \DomElement $element A \DomElement instance
+     *
+     * @return array A PHP array
+     */
+    public static function convertDomElementToArray(\DOMElement $element)
+    {
+        return XmlUtils::convertDomElementToArray($element);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Loader/YamlFileLoader.php
@@ -0,0 +1,471 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Loader;
+
+use Symfony\Component\DependencyInjection\DefinitionDecorator;
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Yaml\Exception\ParseException;
+use Symfony\Component\Yaml\Parser as YamlParser;
+use Symfony\Component\ExpressionLanguage\Expression;
+
+/**
+ * YamlFileLoader loads YAML files service definitions.
+ *
+ * The YAML format does not support anonymous services (cf. the XML loader).
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class YamlFileLoader extends FileLoader
+{
+    private $yamlParser;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load($resource, $type = null)
+    {
+        $path = $this->locator->locate($resource);
+
+        $content = $this->loadFile($path);
+
+        $this->container->addResource(new FileResource($path));
+
+        // empty file
+        if (null === $content) {
+            return;
+        }
+
+        // imports
+        $this->parseImports($content, $path);
+
+        // parameters
+        if (isset($content['parameters'])) {
+            if (!is_array($content['parameters'])) {
+                throw new InvalidArgumentException(sprintf('The "parameters" key should contain an array in %s. Check your YAML syntax.', $resource));
+            }
+
+            foreach ($content['parameters'] as $key => $value) {
+                $this->container->setParameter($key, $this->resolveServices($value));
+            }
+        }
+
+        // extensions
+        $this->loadFromExtensions($content);
+
+        // services
+        $this->parseDefinitions($content, $resource);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($resource, $type = null)
+    {
+        return is_string($resource) && in_array(pathinfo($resource, PATHINFO_EXTENSION), array('yml', 'yaml'), true);
+    }
+
+    /**
+     * Parses all imports.
+     *
+     * @param array  $content
+     * @param string $file
+     */
+    private function parseImports($content, $file)
+    {
+        if (!isset($content['imports'])) {
+            return;
+        }
+
+        if (!is_array($content['imports'])) {
+            throw new InvalidArgumentException(sprintf('The "imports" key should contain an array in %s. Check your YAML syntax.', $file));
+        }
+
+        $defaultDirectory = dirname($file);
+        foreach ($content['imports'] as $import) {
+            if (!is_array($import)) {
+                throw new InvalidArgumentException(sprintf('The values in the "imports" key should be arrays in %s. Check your YAML syntax.', $file));
+            }
+
+            $this->setCurrentDir($defaultDirectory);
+            $this->import($import['resource'], null, isset($import['ignore_errors']) ? (bool) $import['ignore_errors'] : false, $file);
+        }
+    }
+
+    /**
+     * Parses definitions.
+     *
+     * @param array  $content
+     * @param string $file
+     */
+    private function parseDefinitions($content, $file)
+    {
+        if (!isset($content['services'])) {
+            return;
+        }
+
+        if (!is_array($content['services'])) {
+            throw new InvalidArgumentException(sprintf('The "services" key should contain an array in %s. Check your YAML syntax.', $file));
+        }
+
+        foreach ($content['services'] as $id => $service) {
+            $this->parseDefinition($id, $service, $file);
+        }
+    }
+
+    /**
+     * Parses a definition.
+     *
+     * @param string $id
+     * @param array  $service
+     * @param string $file
+     *
+     * @throws InvalidArgumentException When tags are invalid
+     */
+    private function parseDefinition($id, $service, $file)
+    {
+        if (is_string($service) && 0 === strpos($service, '@')) {
+            $this->container->setAlias($id, substr($service, 1));
+
+            return;
+        }
+
+        if (!is_array($service)) {
+            throw new InvalidArgumentException(sprintf('A service definition must be an array or a string starting with "@" but %s found for service "%s" in %s. Check your YAML syntax.', gettype($service), $id, $file));
+        }
+
+        if (isset($service['alias'])) {
+            $public = !array_key_exists('public', $service) || (bool) $service['public'];
+            $this->container->setAlias($id, new Alias($service['alias'], $public));
+
+            return;
+        }
+
+        if (isset($service['parent'])) {
+            $definition = new DefinitionDecorator($service['parent']);
+        } else {
+            $definition = new Definition();
+        }
+
+        if (isset($service['class'])) {
+            $definition->setClass($service['class']);
+        }
+
+        if (isset($service['shared'])) {
+            $definition->setShared($service['shared']);
+        }
+
+        if (isset($service['scope'])) {
+            if ('request' !== $id) {
+                @trigger_error(sprintf('The "scope" key of service "%s" in file "%s" is deprecated since version 2.8 and will be removed in 3.0.', $id, $file), E_USER_DEPRECATED);
+            }
+            $definition->setScope($service['scope'], false);
+        }
+
+        if (isset($service['synthetic'])) {
+            $definition->setSynthetic($service['synthetic']);
+        }
+
+        if (isset($service['synchronized'])) {
+            @trigger_error(sprintf('The "synchronized" key of service "%s" in file "%s" is deprecated since version 2.7 and will be removed in 3.0.', $id, $file), E_USER_DEPRECATED);
+            $definition->setSynchronized($service['synchronized'], 'request' !== $id);
+        }
+
+        if (isset($service['lazy'])) {
+            $definition->setLazy($service['lazy']);
+        }
+
+        if (isset($service['public'])) {
+            $definition->setPublic($service['public']);
+        }
+
+        if (isset($service['abstract'])) {
+            $definition->setAbstract($service['abstract']);
+        }
+
+        if (array_key_exists('deprecated', $service)) {
+            $definition->setDeprecated(true, $service['deprecated']);
+        }
+
+        if (isset($service['factory'])) {
+            if (is_string($service['factory'])) {
+                if (strpos($service['factory'], ':') !== false && strpos($service['factory'], '::') === false) {
+                    $parts = explode(':', $service['factory']);
+                    $definition->setFactory(array($this->resolveServices('@'.$parts[0]), $parts[1]));
+                } else {
+                    $definition->setFactory($service['factory']);
+                }
+            } else {
+                $definition->setFactory(array($this->resolveServices($service['factory'][0]), $service['factory'][1]));
+            }
+        }
+
+        if (isset($service['factory_class'])) {
+            @trigger_error(sprintf('The "factory_class" key of service "%s" in file "%s" is deprecated since version 2.6 and will be removed in 3.0. Use "factory" instead.', $id, $file), E_USER_DEPRECATED);
+            $definition->setFactoryClass($service['factory_class']);
+        }
+
+        if (isset($service['factory_method'])) {
+            @trigger_error(sprintf('The "factory_method" key of service "%s" in file "%s" is deprecated since version 2.6 and will be removed in 3.0. Use "factory" instead.', $id, $file), E_USER_DEPRECATED);
+            $definition->setFactoryMethod($service['factory_method']);
+        }
+
+        if (isset($service['factory_service'])) {
+            @trigger_error(sprintf('The "factory_service" key of service "%s" in file "%s" is deprecated since version 2.6 and will be removed in 3.0. Use "factory" instead.', $id, $file), E_USER_DEPRECATED);
+            $definition->setFactoryService($service['factory_service']);
+        }
+
+        if (isset($service['file'])) {
+            $definition->setFile($service['file']);
+        }
+
+        if (isset($service['arguments'])) {
+            $definition->setArguments($this->resolveServices($service['arguments']));
+        }
+
+        if (isset($service['properties'])) {
+            $definition->setProperties($this->resolveServices($service['properties']));
+        }
+
+        if (isset($service['configurator'])) {
+            if (is_string($service['configurator'])) {
+                $definition->setConfigurator($service['configurator']);
+            } else {
+                $definition->setConfigurator(array($this->resolveServices($service['configurator'][0]), $service['configurator'][1]));
+            }
+        }
+
+        if (isset($service['calls'])) {
+            if (!is_array($service['calls'])) {
+                throw new InvalidArgumentException(sprintf('Parameter "calls" must be an array for service "%s" in %s. Check your YAML syntax.', $id, $file));
+            }
+
+            foreach ($service['calls'] as $call) {
+                if (isset($call['method'])) {
+                    $method = $call['method'];
+                    $args = isset($call['arguments']) ? $this->resolveServices($call['arguments']) : array();
+                } else {
+                    $method = $call[0];
+                    $args = isset($call[1]) ? $this->resolveServices($call[1]) : array();
+                }
+
+                $definition->addMethodCall($method, $args);
+            }
+        }
+
+        if (isset($service['tags'])) {
+            if (!is_array($service['tags'])) {
+                throw new InvalidArgumentException(sprintf('Parameter "tags" must be an array for service "%s" in %s. Check your YAML syntax.', $id, $file));
+            }
+
+            foreach ($service['tags'] as $tag) {
+                if (!is_array($tag)) {
+                    throw new InvalidArgumentException(sprintf('A "tags" entry must be an array for service "%s" in %s. Check your YAML syntax.', $id, $file));
+                }
+
+                if (!isset($tag['name'])) {
+                    throw new InvalidArgumentException(sprintf('A "tags" entry is missing a "name" key for service "%s" in %s.', $id, $file));
+                }
+
+                if (!is_string($tag['name']) || '' === $tag['name']) {
+                    throw new InvalidArgumentException(sprintf('The tag name for service "%s" in %s must be a non-empty string.', $id, $file));
+                }
+
+                $name = $tag['name'];
+                unset($tag['name']);
+
+                foreach ($tag as $attribute => $value) {
+                    if (!is_scalar($value) && null !== $value) {
+                        throw new InvalidArgumentException(sprintf('A "tags" attribute must be of a scalar-type for service "%s", tag "%s", attribute "%s" in %s. Check your YAML syntax.', $id, $name, $attribute, $file));
+                    }
+                }
+
+                $definition->addTag($name, $tag);
+            }
+        }
+
+        if (isset($service['decorates'])) {
+            if ('' !== $service['decorates'] && '@' === $service['decorates'][0]) {
+                throw new InvalidArgumentException(sprintf('The value of the "decorates" option for the "%s" service must be the id of the service without the "@" prefix (replace "%s" with "%s").', $id, $service['decorates'], substr($service['decorates'], 1)));
+            }
+
+            $renameId = isset($service['decoration_inner_name']) ? $service['decoration_inner_name'] : null;
+            $priority = isset($service['decoration_priority']) ? $service['decoration_priority'] : 0;
+            $definition->setDecoratedService($service['decorates'], $renameId, $priority);
+        }
+
+        if (isset($service['autowire'])) {
+            $definition->setAutowired($service['autowire']);
+        }
+
+        if (isset($service['autowiring_types'])) {
+            if (is_string($service['autowiring_types'])) {
+                $definition->addAutowiringType($service['autowiring_types']);
+            } else {
+                if (!is_array($service['autowiring_types'])) {
+                    throw new InvalidArgumentException(sprintf('Parameter "autowiring_types" must be a string or an array for service "%s" in %s. Check your YAML syntax.', $id, $file));
+                }
+
+                foreach ($service['autowiring_types'] as $autowiringType) {
+                    if (!is_string($autowiringType)) {
+                        throw new InvalidArgumentException(sprintf('A "autowiring_types" attribute must be of type string for service "%s" in %s. Check your YAML syntax.', $id, $file));
+                    }
+
+                    $definition->addAutowiringType($autowiringType);
+                }
+            }
+        }
+
+        $this->container->setDefinition($id, $definition);
+    }
+
+    /**
+     * Loads a YAML file.
+     *
+     * @param string $file
+     *
+     * @return array The file content
+     *
+     * @throws InvalidArgumentException when the given file is not a local file or when it does not exist
+     */
+    protected function loadFile($file)
+    {
+        if (!class_exists('Symfony\Component\Yaml\Parser')) {
+            throw new RuntimeException('Unable to load YAML config files as the Symfony Yaml Component is not installed.');
+        }
+
+        if (!stream_is_local($file)) {
+            throw new InvalidArgumentException(sprintf('This is not a local file "%s".', $file));
+        }
+
+        if (!file_exists($file)) {
+            throw new InvalidArgumentException(sprintf('The service file "%s" is not valid.', $file));
+        }
+
+        if (null === $this->yamlParser) {
+            $this->yamlParser = new YamlParser();
+        }
+
+        try {
+            $configuration = $this->yamlParser->parse(file_get_contents($file));
+        } catch (ParseException $e) {
+            throw new InvalidArgumentException(sprintf('The file "%s" does not contain valid YAML.', $file), 0, $e);
+        }
+
+        return $this->validate($configuration, $file);
+    }
+
+    /**
+     * Validates a YAML file.
+     *
+     * @param mixed  $content
+     * @param string $file
+     *
+     * @return array
+     *
+     * @throws InvalidArgumentException When service file is not valid
+     */
+    private function validate($content, $file)
+    {
+        if (null === $content) {
+            return $content;
+        }
+
+        if (!is_array($content)) {
+            throw new InvalidArgumentException(sprintf('The service file "%s" is not valid. It should contain an array. Check your YAML syntax.', $file));
+        }
+
+        foreach ($content as $namespace => $data) {
+            if (in_array($namespace, array('imports', 'parameters', 'services'))) {
+                continue;
+            }
+
+            if (!$this->container->hasExtension($namespace)) {
+                $extensionNamespaces = array_filter(array_map(function ($ext) { return $ext->getAlias(); }, $this->container->getExtensions()));
+                throw new InvalidArgumentException(sprintf(
+                    'There is no extension able to load the configuration for "%s" (in %s). Looked for namespace "%s", found %s',
+                    $namespace,
+                    $file,
+                    $namespace,
+                    $extensionNamespaces ? sprintf('"%s"', implode('", "', $extensionNamespaces)) : 'none'
+                ));
+            }
+        }
+
+        return $content;
+    }
+
+    /**
+     * Resolves services.
+     *
+     * @param string|array $value
+     *
+     * @return array|string|Reference
+     */
+    private function resolveServices($value)
+    {
+        if (is_array($value)) {
+            $value = array_map(array($this, 'resolveServices'), $value);
+        } elseif (is_string($value) && 0 === strpos($value, '@=')) {
+            return new Expression(substr($value, 2));
+        } elseif (is_string($value) && 0 === strpos($value, '@')) {
+            if (0 === strpos($value, '@@')) {
+                $value = substr($value, 1);
+                $invalidBehavior = null;
+            } elseif (0 === strpos($value, '@?')) {
+                $value = substr($value, 2);
+                $invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE;
+            } else {
+                $value = substr($value, 1);
+                $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
+            }
+
+            if ('=' === substr($value, -1)) {
+                $value = substr($value, 0, -1);
+                $strict = false;
+            } else {
+                $strict = true;
+            }
+
+            if (null !== $invalidBehavior) {
+                $value = new Reference($value, $invalidBehavior, $strict);
+            }
+        }
+
+        return $value;
+    }
+
+    /**
+     * Loads from Extensions.
+     *
+     * @param array $content
+     */
+    private function loadFromExtensions($content)
+    {
+        foreach ($content as $namespace => $values) {
+            if (in_array($namespace, array('imports', 'parameters', 'services'))) {
+                continue;
+            }
+
+            if (!is_array($values)) {
+                $values = array();
+            }
+
+            $this->container->loadFromExtension($namespace, $values);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Loader/schema/dic/services/services-1.0.xsd
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<xsd:schema xmlns="http://symfony.com/schema/dic/services"
+     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+     targetNamespace="http://symfony.com/schema/dic/services"
+     elementFormDefault="qualified">
+
+  <xsd:annotation>
+    <xsd:documentation><![CDATA[
+      Symfony XML Services Schema, version 1.0
+      Authors: Fabien Potencier
+
+      This defines a way to describe PHP objects (services) and their
+      dependencies.
+    ]]></xsd:documentation>
+  </xsd:annotation>
+
+  <xsd:element name="container" type="container" />
+
+  <xsd:complexType name="container">
+    <xsd:annotation>
+      <xsd:documentation><![CDATA[
+        The root element of a service file.
+      ]]></xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:group ref="foreign" />
+      <xsd:sequence minOccurs="0">
+        <xsd:element name="imports" type="imports" />
+        <xsd:group ref="foreign" />
+      </xsd:sequence>
+      <xsd:sequence minOccurs="0">
+        <xsd:element name="parameters" type="parameters" />
+        <xsd:group ref="foreign" />
+      </xsd:sequence>
+      <xsd:sequence minOccurs="0">
+        <xsd:element name="services" type="services" />
+        <xsd:group ref="foreign" />
+      </xsd:sequence>
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:group name="foreign">
+    <xsd:sequence>
+      <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:group>
+
+  <xsd:complexType name="services">
+    <xsd:annotation>
+      <xsd:documentation><![CDATA[
+        Enclosing element for the definition of all services
+      ]]></xsd:documentation>
+    </xsd:annotation>
+    <xsd:choice minOccurs="1" maxOccurs="unbounded">
+      <xsd:element name="service" type="service" />
+    </xsd:choice>
+  </xsd:complexType>
+
+  <xsd:complexType name="imports">
+    <xsd:annotation>
+      <xsd:documentation><![CDATA[
+        Enclosing element for the import elements
+      ]]></xsd:documentation>
+    </xsd:annotation>
+    <xsd:choice minOccurs="1" maxOccurs="unbounded">
+      <xsd:element name="import" type="import" />
+    </xsd:choice>
+  </xsd:complexType>
+
+  <xsd:complexType name="import">
+    <xsd:annotation>
+      <xsd:documentation><![CDATA[
+        Import an external resource defining other services or parameters
+      ]]></xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="resource" type="xsd:string" use="required" />
+    <xsd:attribute name="ignore-errors" type="boolean" />
+  </xsd:complexType>
+
+  <xsd:complexType name="callable">
+    <xsd:choice minOccurs="0" maxOccurs="1">
+      <xsd:element name="service" type="service" minOccurs="0" maxOccurs="1" />
+    </xsd:choice>
+    <xsd:attribute name="id" type="xsd:string" />
+    <xsd:attribute name="service" type="xsd:string" />
+    <xsd:attribute name="class" type="xsd:string" />
+    <xsd:attribute name="method" type="xsd:string" />
+    <xsd:attribute name="function" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="service">
+    <xsd:choice maxOccurs="unbounded">
+      <xsd:element name="file" type="xsd:string" minOccurs="0" maxOccurs="1" />
+      <xsd:element name="argument" type="argument" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="configurator" type="callable" minOccurs="0" maxOccurs="1" />
+      <xsd:element name="factory" type="callable" minOccurs="0" maxOccurs="1" />
+      <xsd:element name="deprecated" type="xsd:string" minOccurs="0" maxOccurs="1" />
+      <xsd:element name="call" type="call" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="tag" type="tag" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="property" type="property" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="autowiring-type" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:choice>
+    <xsd:attribute name="id" type="xsd:string" />
+    <xsd:attribute name="class" type="xsd:string" />
+    <xsd:attribute name="shared" type="boolean" />
+    <xsd:attribute name="scope" type="xsd:string" />
+    <xsd:attribute name="public" type="boolean" />
+    <xsd:attribute name="synthetic" type="boolean" />
+    <xsd:attribute name="synchronized" type="boolean" />
+    <xsd:attribute name="lazy" type="boolean" />
+    <xsd:attribute name="abstract" type="boolean" />
+    <xsd:attribute name="factory-class" type="xsd:string" />
+    <xsd:attribute name="factory-method" type="xsd:string" />
+    <xsd:attribute name="factory-service" type="xsd:string" />
+    <xsd:attribute name="alias" type="xsd:string" />
+    <xsd:attribute name="parent" type="xsd:string" />
+    <xsd:attribute name="decorates" type="xsd:string" />
+    <xsd:attribute name="decoration-inner-name" type="xsd:string" />
+    <xsd:attribute name="decoration-priority" type="xsd:integer" />
+    <xsd:attribute name="autowire" type="boolean" />
+  </xsd:complexType>
+
+  <xsd:complexType name="tag">
+    <xsd:attribute name="name" type="xsd:string" use="required" />
+    <xsd:anyAttribute namespace="##any" processContents="lax" />
+  </xsd:complexType>
+
+  <xsd:complexType name="parameters">
+    <xsd:choice minOccurs="1" maxOccurs="unbounded">
+      <xsd:element name="parameter" type="parameter" />
+    </xsd:choice>
+    <xsd:attribute name="type" type="parameter_type" />
+    <xsd:attribute name="key" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="parameter" mixed="true">
+    <xsd:choice minOccurs="0" maxOccurs="unbounded">
+      <xsd:element name="parameter" type="parameter" />
+    </xsd:choice>
+    <xsd:attribute name="type" type="parameter_type" />
+    <xsd:attribute name="id" type="xsd:string" />
+    <xsd:attribute name="key" type="xsd:string" />
+    <xsd:attribute name="on-invalid" type="invalid_sequence" />
+  </xsd:complexType>
+
+  <xsd:complexType name="property" mixed="true">
+    <xsd:choice minOccurs="0" maxOccurs="1">
+      <xsd:element name="property" type="property" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="service" type="service" />
+    </xsd:choice>
+    <xsd:attribute name="type" type="argument_type" />
+    <xsd:attribute name="id" type="xsd:string" />
+    <xsd:attribute name="key" type="xsd:string" />
+    <xsd:attribute name="name" type="xsd:string" />
+    <xsd:attribute name="on-invalid" type="xsd:string" />
+    <xsd:attribute name="strict" type="boolean" />
+  </xsd:complexType>
+
+  <xsd:complexType name="argument" mixed="true">
+    <xsd:choice maxOccurs="unbounded">
+      <xsd:element name="argument" type="argument" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="service" type="service" />
+    </xsd:choice>
+    <xsd:attribute name="type" type="argument_type" />
+    <xsd:attribute name="id" type="xsd:string" />
+    <xsd:attribute name="key" type="xsd:string" />
+    <xsd:attribute name="index" type="xsd:integer" />
+    <xsd:attribute name="on-invalid" type="xsd:string" />
+    <xsd:attribute name="strict" type="boolean" />
+  </xsd:complexType>
+
+  <xsd:complexType name="call" mixed="true">
+    <xsd:choice maxOccurs="unbounded">
+      <xsd:element name="argument" type="argument" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="service" type="service" />
+    </xsd:choice>
+    <xsd:attribute name="method" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:simpleType name="parameter_type">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="collection" />
+      <xsd:enumeration value="string" />
+      <xsd:enumeration value="constant" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="argument_type">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="collection" />
+      <xsd:enumeration value="service" />
+      <xsd:enumeration value="expression" />
+      <xsd:enumeration value="string" />
+      <xsd:enumeration value="constant" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="invalid_sequence">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="null" />
+      <xsd:enumeration value="ignore" />
+      <xsd:enumeration value="exception" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="boolean">
+    <xsd:restriction base="xsd:string">
+      <xsd:pattern value="(%.+%|true|false)" />
+    </xsd:restriction>
+  </xsd:simpleType>
+</xsd:schema>
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Parameter.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+/**
+ * Parameter represents a parameter reference.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Parameter
+{
+    private $id;
+
+    /**
+     * @param string $id The parameter key
+     */
+    public function __construct($id)
+    {
+        $this->id = $id;
+    }
+
+    /**
+     * @return string The parameter key
+     */
+    public function __toString()
+    {
+        return (string) $this->id;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php
@@ -0,0 +1,68 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\ParameterBag;
+
+use Symfony\Component\DependencyInjection\Exception\LogicException;
+
+/**
+ * Holds read-only parameters.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class FrozenParameterBag extends ParameterBag
+{
+    /**
+     * For performance reasons, the constructor assumes that
+     * all keys are already lowercased.
+     *
+     * This is always the case when used internally.
+     *
+     * @param array $parameters An array of parameters
+     */
+    public function __construct(array $parameters = array())
+    {
+        $this->parameters = $parameters;
+        $this->resolved = true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        throw new LogicException('Impossible to call clear() on a frozen ParameterBag.');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function add(array $parameters)
+    {
+        throw new LogicException('Impossible to call add() on a frozen ParameterBag.');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($name, $value)
+    {
+        throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function remove($name)
+    {
+        throw new LogicException('Impossible to call remove() on a frozen ParameterBag.');
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/ParameterBag/ParameterBag.php
@@ -0,0 +1,275 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\ParameterBag;
+
+use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
+use Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+
+/**
+ * Holds parameters.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ParameterBag implements ParameterBagInterface
+{
+    protected $parameters = array();
+    protected $resolved = false;
+
+    /**
+     * @param array $parameters An array of parameters
+     */
+    public function __construct(array $parameters = array())
+    {
+        $this->add($parameters);
+    }
+
+    /**
+     * Clears all parameters.
+     */
+    public function clear()
+    {
+        $this->parameters = array();
+    }
+
+    /**
+     * Adds parameters to the service container parameters.
+     *
+     * @param array $parameters An array of parameters
+     */
+    public function add(array $parameters)
+    {
+        foreach ($parameters as $key => $value) {
+            $this->parameters[strtolower($key)] = $value;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function all()
+    {
+        return $this->parameters;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($name)
+    {
+        $name = strtolower($name);
+
+        if (!array_key_exists($name, $this->parameters)) {
+            if (!$name) {
+                throw new ParameterNotFoundException($name);
+            }
+
+            $alternatives = array();
+            foreach ($this->parameters as $key => $parameterValue) {
+                $lev = levenshtein($name, $key);
+                if ($lev <= strlen($name) / 3 || false !== strpos($key, $name)) {
+                    $alternatives[] = $key;
+                }
+            }
+
+            throw new ParameterNotFoundException($name, null, null, null, $alternatives);
+        }
+
+        return $this->parameters[$name];
+    }
+
+    /**
+     * Sets a service container parameter.
+     *
+     * @param string $name  The parameter name
+     * @param mixed  $value The parameter value
+     */
+    public function set($name, $value)
+    {
+        $this->parameters[strtolower($name)] = $value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function has($name)
+    {
+        return array_key_exists(strtolower($name), $this->parameters);
+    }
+
+    /**
+     * Removes a parameter.
+     *
+     * @param string $name The parameter name
+     */
+    public function remove($name)
+    {
+        unset($this->parameters[strtolower($name)]);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function resolve()
+    {
+        if ($this->resolved) {
+            return;
+        }
+
+        $parameters = array();
+        foreach ($this->parameters as $key => $value) {
+            try {
+                $value = $this->resolveValue($value);
+                $parameters[$key] = $this->unescapeValue($value);
+            } catch (ParameterNotFoundException $e) {
+                $e->setSourceKey($key);
+
+                throw $e;
+            }
+        }
+
+        $this->parameters = $parameters;
+        $this->resolved = true;
+    }
+
+    /**
+     * Replaces parameter placeholders (%name%) by their values.
+     *
+     * @param mixed $value     A value
+     * @param array $resolving An array of keys that are being resolved (used internally to detect circular references)
+     *
+     * @return mixed The resolved value
+     *
+     * @throws ParameterNotFoundException          if a placeholder references a parameter that does not exist
+     * @throws ParameterCircularReferenceException if a circular reference if detected
+     * @throws RuntimeException                    when a given parameter has a type problem.
+     */
+    public function resolveValue($value, array $resolving = array())
+    {
+        if (is_array($value)) {
+            $args = array();
+            foreach ($value as $k => $v) {
+                $args[$this->resolveValue($k, $resolving)] = $this->resolveValue($v, $resolving);
+            }
+
+            return $args;
+        }
+
+        if (!is_string($value)) {
+            return $value;
+        }
+
+        return $this->resolveString($value, $resolving);
+    }
+
+    /**
+     * Resolves parameters inside a string.
+     *
+     * @param string $value     The string to resolve
+     * @param array  $resolving An array of keys that are being resolved (used internally to detect circular references)
+     *
+     * @return string The resolved string
+     *
+     * @throws ParameterNotFoundException          if a placeholder references a parameter that does not exist
+     * @throws ParameterCircularReferenceException if a circular reference if detected
+     * @throws RuntimeException                    when a given parameter has a type problem.
+     */
+    public function resolveString($value, array $resolving = array())
+    {
+        // we do this to deal with non string values (Boolean, integer, ...)
+        // as the preg_replace_callback throw an exception when trying
+        // a non-string in a parameter value
+        if (preg_match('/^%([^%\s]+)%$/', $value, $match)) {
+            $key = strtolower($match[1]);
+
+            if (isset($resolving[$key])) {
+                throw new ParameterCircularReferenceException(array_keys($resolving));
+            }
+
+            $resolving[$key] = true;
+
+            return $this->resolved ? $this->get($key) : $this->resolveValue($this->get($key), $resolving);
+        }
+
+        $self = $this;
+
+        return preg_replace_callback('/%%|%([^%\s]+)%/', function ($match) use ($self, $resolving, $value) {
+            // skip %%
+            if (!isset($match[1])) {
+                return '%%';
+            }
+
+            $key = strtolower($match[1]);
+            if (isset($resolving[$key])) {
+                throw new ParameterCircularReferenceException(array_keys($resolving));
+            }
+
+            $resolved = $self->get($key);
+
+            if (!is_string($resolved) && !is_numeric($resolved)) {
+                throw new RuntimeException(sprintf('A string value must be composed of strings and/or numbers, but found parameter "%s" of type %s inside string value "%s".', $key, gettype($resolved), $value));
+            }
+
+            $resolved = (string) $resolved;
+            $resolving[$key] = true;
+
+            return $self->isResolved() ? $resolved : $self->resolveString($resolved, $resolving);
+        }, $value);
+    }
+
+    public function isResolved()
+    {
+        return $this->resolved;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function escapeValue($value)
+    {
+        if (is_string($value)) {
+            return str_replace('%', '%%', $value);
+        }
+
+        if (is_array($value)) {
+            $result = array();
+            foreach ($value as $k => $v) {
+                $result[$k] = $this->escapeValue($v);
+            }
+
+            return $result;
+        }
+
+        return $value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function unescapeValue($value)
+    {
+        if (is_string($value)) {
+            return str_replace('%%', '%', $value);
+        }
+
+        if (is_array($value)) {
+            $result = array();
+            foreach ($value as $k => $v) {
+                $result[$k] = $this->unescapeValue($v);
+            }
+
+            return $result;
+        }
+
+        return $value;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php
@@ -0,0 +1,108 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\ParameterBag;
+
+use Symfony\Component\DependencyInjection\Exception\LogicException;
+use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
+
+/**
+ * ParameterBagInterface.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface ParameterBagInterface
+{
+    /**
+     * Clears all parameters.
+     *
+     * @throws LogicException if the ParameterBagInterface can not be cleared
+     */
+    public function clear();
+
+    /**
+     * Adds parameters to the service container parameters.
+     *
+     * @param array $parameters An array of parameters
+     *
+     * @throws LogicException if the parameter can not be added
+     */
+    public function add(array $parameters);
+
+    /**
+     * Gets the service container parameters.
+     *
+     * @return array An array of parameters
+     */
+    public function all();
+
+    /**
+     * Gets a service container parameter.
+     *
+     * @param string $name The parameter name
+     *
+     * @return mixed The parameter value
+     *
+     * @throws ParameterNotFoundException if the parameter is not defined
+     */
+    public function get($name);
+
+    /**
+     * Sets a service container parameter.
+     *
+     * @param string $name  The parameter name
+     * @param mixed  $value The parameter value
+     *
+     * @throws LogicException if the parameter can not be set
+     */
+    public function set($name, $value);
+
+    /**
+     * Returns true if a parameter name is defined.
+     *
+     * @param string $name The parameter name
+     *
+     * @return bool true if the parameter name is defined, false otherwise
+     */
+    public function has($name);
+
+    /**
+     * Replaces parameter placeholders (%name%) by their values for all parameters.
+     */
+    public function resolve();
+
+    /**
+     * Replaces parameter placeholders (%name%) by their values.
+     *
+     * @param mixed $value A value
+     *
+     * @throws ParameterNotFoundException if a placeholder references a parameter that does not exist
+     */
+    public function resolveValue($value);
+
+    /**
+     * Escape parameter placeholders %.
+     *
+     * @param mixed $value
+     *
+     * @return mixed
+     */
+    public function escapeValue($value);
+
+    /**
+     * Unescape parameter placeholders %.
+     *
+     * @param mixed $value
+     *
+     * @return mixed
+     */
+    public function unescapeValue($value);
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Reference.php
@@ -0,0 +1,74 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+/**
+ * Reference represents a service reference.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Reference
+{
+    private $id;
+    private $invalidBehavior;
+    private $strict;
+
+    /**
+     * Note: The $strict parameter is deprecated since version 2.8 and will be removed in 3.0.
+     *
+     * @param string $id              The service identifier
+     * @param int    $invalidBehavior The behavior when the service does not exist
+     * @param bool   $strict          Sets how this reference is validated
+     *
+     * @see Container
+     */
+    public function __construct($id, $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, $strict = true)
+    {
+        $this->id = strtolower($id);
+        $this->invalidBehavior = $invalidBehavior;
+        $this->strict = $strict;
+    }
+
+    /**
+     * @return string The service identifier
+     */
+    public function __toString()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Returns the behavior to be used when the service does not exist.
+     *
+     * @return int
+     */
+    public function getInvalidBehavior()
+    {
+        return $this->invalidBehavior;
+    }
+
+    /**
+     * Returns true when this Reference is strict.
+     *
+     * @return bool
+     *
+     * @deprecated since version 2.8, to be removed in 3.0.
+     */
+    public function isStrict($triggerDeprecationError = true)
+    {
+        if ($triggerDeprecationError) {
+            @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+        }
+
+        return $this->strict;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/ResettableContainerInterface.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+/**
+ * ResettableContainerInterface defines additional resetting functionality
+ * for containers, allowing to release shared services when the container is
+ * not needed anymore.
+ *
+ * @author Christophe Coevoet <stof@notk.org>
+ */
+interface ResettableContainerInterface extends ContainerInterface
+{
+    /**
+     * Resets shared services from the container.
+     *
+     * The container is not intended to be used again after being reset in a normal workflow. This method is
+     * meant as a way to release references for ref-counting.
+     * A subsequent call to ContainerInterface::get will recreate a new instance of the shared service.
+     */
+    public function reset();
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Scope.php
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+/**
+ * Scope class.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
+ */
+class Scope implements ScopeInterface
+{
+    private $name;
+    private $parentName;
+
+    public function __construct($name, $parentName = ContainerInterface::SCOPE_CONTAINER)
+    {
+        $this->name = $name;
+        $this->parentName = $parentName;
+    }
+
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    public function getParentName()
+    {
+        return $this->parentName;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/ScopeInterface.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+/**
+ * Scope Interface.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
+ */
+interface ScopeInterface
+{
+    public function getName();
+
+    public function getParentName();
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/SimpleXMLElement.php
@@ -0,0 +1,116 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+@trigger_error('The '.__NAMESPACE__.'\SimpleXMLElement class is deprecated since version 2.5 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+use Symfony\Component\Config\Util\XmlUtils;
+use Symfony\Component\ExpressionLanguage\Expression;
+
+/**
+ * SimpleXMLElement class.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 2.5, to be removed in 3.0.
+ */
+class SimpleXMLElement extends \SimpleXMLElement
+{
+    /**
+     * Converts an attribute as a PHP type.
+     *
+     * @param string $name
+     *
+     * @return mixed
+     */
+    public function getAttributeAsPhp($name)
+    {
+        return self::phpize($this[$name]);
+    }
+
+    /**
+     * Returns arguments as valid PHP types.
+     *
+     * @param string $name
+     * @param bool   $lowercase
+     *
+     * @return mixed
+     */
+    public function getArgumentsAsPhp($name, $lowercase = true)
+    {
+        $arguments = array();
+        foreach ($this->$name as $arg) {
+            if (isset($arg['name'])) {
+                $arg['key'] = (string) $arg['name'];
+            }
+            $key = isset($arg['key']) ? (string) $arg['key'] : (!$arguments ? 0 : max(array_keys($arguments)) + 1);
+
+            // parameter keys are case insensitive
+            if ('parameter' == $name && $lowercase) {
+                $key = strtolower($key);
+            }
+
+            // this is used by DefinitionDecorator to overwrite a specific
+            // argument of the parent definition
+            if (isset($arg['index'])) {
+                $key = 'index_'.$arg['index'];
+            }
+
+            switch ($arg['type']) {
+                case 'service':
+                    $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
+                    if (isset($arg['on-invalid']) && 'ignore' == $arg['on-invalid']) {
+                        $invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE;
+                    } elseif (isset($arg['on-invalid']) && 'null' == $arg['on-invalid']) {
+                        $invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE;
+                    }
+
+                    if (isset($arg['strict'])) {
+                        $strict = self::phpize($arg['strict']);
+                    } else {
+                        $strict = true;
+                    }
+
+                    $arguments[$key] = new Reference((string) $arg['id'], $invalidBehavior, $strict);
+                    break;
+                case 'expression':
+                    $arguments[$key] = new Expression((string) $arg);
+                    break;
+                case 'collection':
+                    $arguments[$key] = $arg->getArgumentsAsPhp($name, false);
+                    break;
+                case 'string':
+                    $arguments[$key] = (string) $arg;
+                    break;
+                case 'constant':
+                    $arguments[$key] = constant((string) $arg);
+                    break;
+                default:
+                    $arguments[$key] = self::phpize($arg);
+            }
+        }
+
+        return $arguments;
+    }
+
+    /**
+     * Converts an xml value to a PHP type.
+     *
+     * @param mixed $value
+     *
+     * @return mixed
+     */
+    public static function phpize($value)
+    {
+        return XmlUtils::phpize($value);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/TaggedContainerInterface.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+/**
+ * TaggedContainerInterface is the interface implemented when a container knows how to deals with tags.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface TaggedContainerInterface extends ContainerInterface
+{
+    /**
+     * Returns service ids for a given tag.
+     *
+     * @param string $name The tag name
+     *
+     * @return array An array of tags
+     */
+    public function findTaggedServiceIds($name);
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Variable.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+/**
+ * Represents a variable.
+ *
+ *     $var = new Variable('a');
+ *
+ * will be dumped as
+ *
+ *     $a
+ *
+ * by the PHP dumper.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class Variable
+{
+    private $name;
+
+    /**
+     * @param string $name
+     */
+    public function __construct($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * Converts the object to a string.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->name;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/dependency-injection/composer.json
@@ -0,0 +1,47 @@
+{
+    "name": "symfony/dependency-injection",
+    "type": "library",
+    "description": "Symfony DependencyInjection Component",
+    "keywords": [],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.9"
+    },
+    "require-dev": {
+        "symfony/yaml": "~2.3.42|~2.7.14|~2.8.7|~3.0.7",
+        "symfony/config": "~2.2|~3.0.0",
+        "symfony/expression-language": "~2.6|~3.0.0"
+    },
+    "conflict": {
+        "symfony/expression-language": "<2.6"
+    },
+    "suggest": {
+        "symfony/yaml": "",
+        "symfony/config": "",
+        "symfony/expression-language": "For using expressions in service container configuration",
+        "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Component\\DependencyInjection\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.8-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php
@@ -0,0 +1,197 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\EventDispatcher;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Lazily loads listeners and subscribers from the dependency injection
+ * container.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ * @author Jordan Alliot <jordan.alliot@gmail.com>
+ */
+class ContainerAwareEventDispatcher extends EventDispatcher
+{
+    /**
+     * The container from where services are loaded.
+     *
+     * @var ContainerInterface
+     */
+    private $container;
+
+    /**
+     * The service IDs of the event listeners and subscribers.
+     *
+     * @var array
+     */
+    private $listenerIds = array();
+
+    /**
+     * The services registered as listeners.
+     *
+     * @var array
+     */
+    private $listeners = array();
+
+    /**
+     * Constructor.
+     *
+     * @param ContainerInterface $container A ContainerInterface instance
+     */
+    public function __construct(ContainerInterface $container)
+    {
+        $this->container = $container;
+    }
+
+    /**
+     * Adds a service as event listener.
+     *
+     * @param string $eventName Event for which the listener is added
+     * @param array  $callback  The service ID of the listener service & the method
+     *                          name that has to be called
+     * @param int    $priority  The higher this value, the earlier an event listener
+     *                          will be triggered in the chain.
+     *                          Defaults to 0.
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function addListenerService($eventName, $callback, $priority = 0)
+    {
+        if (!is_array($callback) || 2 !== count($callback)) {
+            throw new \InvalidArgumentException('Expected an array("service", "method") argument');
+        }
+
+        $this->listenerIds[$eventName][] = array($callback[0], $callback[1], $priority);
+    }
+
+    public function removeListener($eventName, $listener)
+    {
+        $this->lazyLoad($eventName);
+
+        if (isset($this->listenerIds[$eventName])) {
+            foreach ($this->listenerIds[$eventName] as $i => $args) {
+                list($serviceId, $method, $priority) = $args;
+                $key = $serviceId.'.'.$method;
+                if (isset($this->listeners[$eventName][$key]) && $listener === array($this->listeners[$eventName][$key], $method)) {
+                    unset($this->listeners[$eventName][$key]);
+                    if (empty($this->listeners[$eventName])) {
+                        unset($this->listeners[$eventName]);
+                    }
+                    unset($this->listenerIds[$eventName][$i]);
+                    if (empty($this->listenerIds[$eventName])) {
+                        unset($this->listenerIds[$eventName]);
+                    }
+                }
+            }
+        }
+
+        parent::removeListener($eventName, $listener);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasListeners($eventName = null)
+    {
+        if (null === $eventName) {
+            return (bool) count($this->listenerIds) || (bool) count($this->listeners);
+        }
+
+        if (isset($this->listenerIds[$eventName])) {
+            return true;
+        }
+
+        return parent::hasListeners($eventName);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getListeners($eventName = null)
+    {
+        if (null === $eventName) {
+            foreach ($this->listenerIds as $serviceEventName => $args) {
+                $this->lazyLoad($serviceEventName);
+            }
+        } else {
+            $this->lazyLoad($eventName);
+        }
+
+        return parent::getListeners($eventName);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getListenerPriority($eventName, $listener)
+    {
+        $this->lazyLoad($eventName);
+
+        return parent::getListenerPriority($eventName, $listener);
+    }
+
+    /**
+     * Adds a service as event subscriber.
+     *
+     * @param string $serviceId The service ID of the subscriber service
+     * @param string $class     The service's class name (which must implement EventSubscriberInterface)
+     */
+    public function addSubscriberService($serviceId, $class)
+    {
+        foreach ($class::getSubscribedEvents() as $eventName => $params) {
+            if (is_string($params)) {
+                $this->listenerIds[$eventName][] = array($serviceId, $params, 0);
+            } elseif (is_string($params[0])) {
+                $this->listenerIds[$eventName][] = array($serviceId, $params[0], isset($params[1]) ? $params[1] : 0);
+            } else {
+                foreach ($params as $listener) {
+                    $this->listenerIds[$eventName][] = array($serviceId, $listener[0], isset($listener[1]) ? $listener[1] : 0);
+                }
+            }
+        }
+    }
+
+    public function getContainer()
+    {
+        return $this->container;
+    }
+
+    /**
+     * Lazily loads listeners for this event from the dependency injection
+     * container.
+     *
+     * @param string $eventName The name of the event to dispatch. The name of
+     *                          the event is the name of the method that is
+     *                          invoked on listeners.
+     */
+    protected function lazyLoad($eventName)
+    {
+        if (isset($this->listenerIds[$eventName])) {
+            foreach ($this->listenerIds[$eventName] as $args) {
+                list($serviceId, $method, $priority) = $args;
+                $listener = $this->container->get($serviceId);
+
+                $key = $serviceId.'.'.$method;
+                if (!isset($this->listeners[$eventName][$key])) {
+                    $this->addListener($eventName, array($listener, $method), $priority);
+                } elseif ($listener !== $this->listeners[$eventName][$key]) {
+                    parent::removeListener($eventName, array($this->listeners[$eventName][$key], $method));
+                    $this->addListener($eventName, array($listener, $method), $priority);
+                }
+
+                $this->listeners[$eventName][$key] = $listener;
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
@@ -0,0 +1,376 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\EventDispatcher\Debug;
+
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\EventDispatcher\Event;
+use Symfony\Component\Stopwatch\Stopwatch;
+use Psr\Log\LoggerInterface;
+
+/**
+ * Collects some data about event listeners.
+ *
+ * This event dispatcher delegates the dispatching to another one.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TraceableEventDispatcher implements TraceableEventDispatcherInterface
+{
+    protected $logger;
+    protected $stopwatch;
+
+    private $called;
+    private $dispatcher;
+    private $wrappedListeners;
+
+    /**
+     * Constructor.
+     *
+     * @param EventDispatcherInterface $dispatcher An EventDispatcherInterface instance
+     * @param Stopwatch                $stopwatch  A Stopwatch instance
+     * @param LoggerInterface          $logger     A LoggerInterface instance
+     */
+    public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, LoggerInterface $logger = null)
+    {
+        $this->dispatcher = $dispatcher;
+        $this->stopwatch = $stopwatch;
+        $this->logger = $logger;
+        $this->called = array();
+        $this->wrappedListeners = array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addListener($eventName, $listener, $priority = 0)
+    {
+        $this->dispatcher->addListener($eventName, $listener, $priority);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addSubscriber(EventSubscriberInterface $subscriber)
+    {
+        $this->dispatcher->addSubscriber($subscriber);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function removeListener($eventName, $listener)
+    {
+        if (isset($this->wrappedListeners[$eventName])) {
+            foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) {
+                if ($wrappedListener->getWrappedListener() === $listener) {
+                    $listener = $wrappedListener;
+                    unset($this->wrappedListeners[$eventName][$index]);
+                    break;
+                }
+            }
+        }
+
+        return $this->dispatcher->removeListener($eventName, $listener);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function removeSubscriber(EventSubscriberInterface $subscriber)
+    {
+        return $this->dispatcher->removeSubscriber($subscriber);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getListeners($eventName = null)
+    {
+        return $this->dispatcher->getListeners($eventName);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getListenerPriority($eventName, $listener)
+    {
+        if (!method_exists($this->dispatcher, 'getListenerPriority')) {
+            return 0;
+        }
+
+        return $this->dispatcher->getListenerPriority($eventName, $listener);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasListeners($eventName = null)
+    {
+        return $this->dispatcher->hasListeners($eventName);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dispatch($eventName, Event $event = null)
+    {
+        if (null === $event) {
+            $event = new Event();
+        }
+
+        if (null !== $this->logger && $event->isPropagationStopped()) {
+            $this->logger->debug(sprintf('The "%s" event is already stopped. No listeners have been called.', $eventName));
+        }
+
+        $this->preProcess($eventName);
+        $this->preDispatch($eventName, $event);
+
+        $e = $this->stopwatch->start($eventName, 'section');
+
+        $this->dispatcher->dispatch($eventName, $event);
+
+        if ($e->isStarted()) {
+            $e->stop();
+        }
+
+        $this->postDispatch($eventName, $event);
+        $this->postProcess($eventName);
+
+        return $event;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getCalledListeners()
+    {
+        $called = array();
+        foreach ($this->called as $eventName => $listeners) {
+            foreach ($listeners as $listener) {
+                $info = $this->getListenerInfo($listener->getWrappedListener(), $eventName);
+                $called[$eventName.'.'.$info['pretty']] = $info;
+            }
+        }
+
+        return $called;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getNotCalledListeners()
+    {
+        try {
+            $allListeners = $this->getListeners();
+        } catch (\Exception $e) {
+            if (null !== $this->logger) {
+                $this->logger->info('An exception was thrown while getting the uncalled listeners.', array('exception' => $e));
+            }
+
+            // unable to retrieve the uncalled listeners
+            return array();
+        }
+
+        $notCalled = array();
+        foreach ($allListeners as $eventName => $listeners) {
+            foreach ($listeners as $listener) {
+                $called = false;
+                if (isset($this->called[$eventName])) {
+                    foreach ($this->called[$eventName] as $l) {
+                        if ($l->getWrappedListener() === $listener) {
+                            $called = true;
+
+                            break;
+                        }
+                    }
+                }
+
+                if (!$called) {
+                    $info = $this->getListenerInfo($listener, $eventName);
+                    $notCalled[$eventName.'.'.$info['pretty']] = $info;
+                }
+            }
+        }
+
+        uasort($notCalled, array($this, 'sortListenersByPriority'));
+
+        return $notCalled;
+    }
+
+    /**
+     * Proxies all method calls to the original event dispatcher.
+     *
+     * @param string $method    The method name
+     * @param array  $arguments The method arguments
+     *
+     * @return mixed
+     */
+    public function __call($method, $arguments)
+    {
+        return call_user_func_array(array($this->dispatcher, $method), $arguments);
+    }
+
+    /**
+     * Called before dispatching the event.
+     *
+     * @param string $eventName The event name
+     * @param Event  $event     The event
+     */
+    protected function preDispatch($eventName, Event $event)
+    {
+    }
+
+    /**
+     * Called after dispatching the event.
+     *
+     * @param string $eventName The event name
+     * @param Event  $event     The event
+     */
+    protected function postDispatch($eventName, Event $event)
+    {
+    }
+
+    private function preProcess($eventName)
+    {
+        foreach ($this->dispatcher->getListeners($eventName) as $listener) {
+            $info = $this->getListenerInfo($listener, $eventName);
+            $name = isset($info['class']) ? $info['class'] : $info['type'];
+            $wrappedListener = new WrappedListener($listener, $name, $this->stopwatch, $this);
+            $this->wrappedListeners[$eventName][] = $wrappedListener;
+            $this->dispatcher->removeListener($eventName, $listener);
+            $this->dispatcher->addListener($eventName, $wrappedListener, $info['priority']);
+        }
+    }
+
+    private function postProcess($eventName)
+    {
+        unset($this->wrappedListeners[$eventName]);
+        $skipped = false;
+        foreach ($this->dispatcher->getListeners($eventName) as $listener) {
+            if (!$listener instanceof WrappedListener) { // #12845: a new listener was added during dispatch.
+                continue;
+            }
+            // Unwrap listener
+            $priority = $this->getListenerPriority($eventName, $listener);
+            $this->dispatcher->removeListener($eventName, $listener);
+            $this->dispatcher->addListener($eventName, $listener->getWrappedListener(), $priority);
+
+            $info = $this->getListenerInfo($listener->getWrappedListener(), $eventName);
+            if ($listener->wasCalled()) {
+                if (null !== $this->logger) {
+                    $this->logger->debug(sprintf('Notified event "%s" to listener "%s".', $eventName, $info['pretty']));
+                }
+
+                if (!isset($this->called[$eventName])) {
+                    $this->called[$eventName] = new \SplObjectStorage();
+                }
+
+                $this->called[$eventName]->attach($listener);
+            }
+
+            if (null !== $this->logger && $skipped) {
+                $this->logger->debug(sprintf('Listener "%s" was not called for event "%s".', $info['pretty'], $eventName));
+            }
+
+            if ($listener->stoppedPropagation()) {
+                if (null !== $this->logger) {
+                    $this->logger->debug(sprintf('Listener "%s" stopped propagation of the event "%s".', $info['pretty'], $eventName));
+                }
+
+                $skipped = true;
+            }
+        }
+    }
+
+    /**
+     * Returns information about the listener.
+     *
+     * @param object $listener  The listener
+     * @param string $eventName The event name
+     *
+     * @return array Information about the listener
+     */
+    private function getListenerInfo($listener, $eventName)
+    {
+        $info = array(
+            'event' => $eventName,
+            'priority' => $this->getListenerPriority($eventName, $listener),
+        );
+        if ($listener instanceof \Closure) {
+            $info += array(
+                'type' => 'Closure',
+                'pretty' => 'closure',
+            );
+        } elseif (is_string($listener)) {
+            try {
+                $r = new \ReflectionFunction($listener);
+                $file = $r->getFileName();
+                $line = $r->getStartLine();
+            } catch (\ReflectionException $e) {
+                $file = null;
+                $line = null;
+            }
+            $info += array(
+                'type' => 'Function',
+                'function' => $listener,
+                'file' => $file,
+                'line' => $line,
+                'pretty' => $listener,
+            );
+        } elseif (is_array($listener) || (is_object($listener) && is_callable($listener))) {
+            if (!is_array($listener)) {
+                $listener = array($listener, '__invoke');
+            }
+            $class = is_object($listener[0]) ? get_class($listener[0]) : $listener[0];
+            try {
+                $r = new \ReflectionMethod($class, $listener[1]);
+                $file = $r->getFileName();
+                $line = $r->getStartLine();
+            } catch (\ReflectionException $e) {
+                $file = null;
+                $line = null;
+            }
+            $info += array(
+                'type' => 'Method',
+                'class' => $class,
+                'method' => $listener[1],
+                'file' => $file,
+                'line' => $line,
+                'pretty' => $class.'::'.$listener[1],
+            );
+        }
+
+        return $info;
+    }
+
+    private function sortListenersByPriority($a, $b)
+    {
+        if (is_int($a['priority']) && !is_int($b['priority'])) {
+            return 1;
+        }
+
+        if (!is_int($a['priority']) && is_int($b['priority'])) {
+            return -1;
+        }
+
+        if ($a['priority'] === $b['priority']) {
+            return 0;
+        }
+
+        if ($a['priority'] > $b['priority']) {
+            return -1;
+        }
+
+        return 1;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\EventDispatcher\Debug;
+
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface TraceableEventDispatcherInterface extends EventDispatcherInterface
+{
+    /**
+     * Gets the called listeners.
+     *
+     * @return array An array of called listeners
+     */
+    public function getCalledListeners();
+
+    /**
+     * Gets the not called listeners.
+     *
+     * @return array An array of not called listeners
+     */
+    public function getNotCalledListeners();
+}
--- /dev/null
+++ b/vendor/symfony/event-dispatcher/Debug/WrappedListener.php
@@ -0,0 +1,71 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\EventDispatcher\Debug;
+
+use Symfony\Component\Stopwatch\Stopwatch;
+use Symfony\Component\EventDispatcher\Event;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class WrappedListener
+{
+    private $listener;
+    private $name;
+    private $called;
+    private $stoppedPropagation;
+    private $stopwatch;
+    private $dispatcher;
+
+    public function __construct($listener, $name, Stopwatch $stopwatch, EventDispatcherInterface $dispatcher = null)
+    {
+        $this->listener = $listener;
+        $this->name = $name;
+        $this->stopwatch = $stopwatch;
+        $this->dispatcher = $dispatcher;
+        $this->called = false;
+        $this->stoppedPropagation = false;
+    }
+
+    public function getWrappedListener()
+    {
+        return $this->listener;
+    }
+
+    public function wasCalled()
+    {
+        return $this->called;
+    }
+
+    public function stoppedPropagation()
+    {
+        return $this->stoppedPropagation;
+    }
+
+    public function __invoke(Event $event, $eventName, EventDispatcherInterface $dispatcher)
+    {
+        $this->called = true;
+
+        $e = $this->stopwatch->start($this->name, 'event_listener');
+
+        call_user_func($this->listener, $event, $eventName, $this->dispatcher ?: $dispatcher);
+
+        if ($e->isStarted()) {
+            $e->stop();
+        }
+
+        if ($event->isPropagationStopped()) {
+            $this->stoppedPropagation = true;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php
@@ -0,0 +1,113 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\EventDispatcher\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+
+/**
+ * Compiler pass to register tagged services for an event dispatcher.
+ */
+class RegisterListenersPass implements CompilerPassInterface
+{
+    /**
+     * @var string
+     */
+    protected $dispatcherService;
+
+    /**
+     * @var string
+     */
+    protected $listenerTag;
+
+    /**
+     * @var string
+     */
+    protected $subscriberTag;
+
+    /**
+     * Constructor.
+     *
+     * @param string $dispatcherService Service name of the event dispatcher in processed container
+     * @param string $listenerTag       Tag name used for listener
+     * @param string $subscriberTag     Tag name used for subscribers
+     */
+    public function __construct($dispatcherService = 'event_dispatcher', $listenerTag = 'kernel.event_listener', $subscriberTag = 'kernel.event_subscriber')
+    {
+        $this->dispatcherService = $dispatcherService;
+        $this->listenerTag = $listenerTag;
+        $this->subscriberTag = $subscriberTag;
+    }
+
+    public function process(ContainerBuilder $container)
+    {
+        if (!$container->hasDefinition($this->dispatcherService) && !$container->hasAlias($this->dispatcherService)) {
+            return;
+        }
+
+        $definition = $container->findDefinition($this->dispatcherService);
+
+        foreach ($container->findTaggedServiceIds($this->listenerTag) as $id => $events) {
+            $def = $container->getDefinition($id);
+            if (!$def->isPublic()) {
+                throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event listeners are lazy-loaded.', $id));
+            }
+
+            if ($def->isAbstract()) {
+                throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as event listeners are lazy-loaded.', $id));
+            }
+
+            foreach ($events as $event) {
+                $priority = isset($event['priority']) ? $event['priority'] : 0;
+
+                if (!isset($event['event'])) {
+                    throw new \InvalidArgumentException(sprintf('Service "%s" must define the "event" attribute on "%s" tags.', $id, $this->listenerTag));
+                }
+
+                if (!isset($event['method'])) {
+                    $event['method'] = 'on'.preg_replace_callback(array(
+                        '/(?<=\b)[a-z]/i',
+                        '/[^a-z0-9]/i',
+                    ), function ($matches) { return strtoupper($matches[0]); }, $event['event']);
+                    $event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']);
+                }
+
+                $definition->addMethodCall('addListenerService', array($event['event'], array($id, $event['method']), $priority));
+            }
+        }
+
+        foreach ($container->findTaggedServiceIds($this->subscriberTag) as $id => $attributes) {
+            $def = $container->getDefinition($id);
+            if (!$def->isPublic()) {
+                throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event subscribers are lazy-loaded.', $id));
+            }
+
+            if ($def->isAbstract()) {
+                throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as event subscribers are lazy-loaded.', $id));
+            }
+
+            // We must assume that the class value has been correctly filled, even if the service is created by a factory
+            $class = $container->getParameterBag()->resolveValue($def->getClass());
+            $interface = 'Symfony\Component\EventDispatcher\EventSubscriberInterface';
+
+            if (!is_subclass_of($class, $interface)) {
+                if (!class_exists($class, false)) {
+                    throw new \InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
+                }
+
+                throw new \InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, $interface));
+            }
+
+            $definition->addMethodCall('addSubscriberService', array($id, $class));
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/event-dispatcher/Event.php
@@ -0,0 +1,120 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\EventDispatcher;
+
+/**
+ * Event is the base class for classes containing event data.
+ *
+ * This class contains no event data. It is used by events that do not pass
+ * state information to an event handler when an event is raised.
+ *
+ * You can call the method stopPropagation() to abort the execution of
+ * further listeners in your event listener.
+ *
+ * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
+ * @author Jonathan Wage <jonwage@gmail.com>
+ * @author Roman Borschel <roman@code-factory.org>
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class Event
+{
+    /**
+     * @var bool Whether no further event listeners should be triggered
+     */
+    private $propagationStopped = false;
+
+    /**
+     * @var EventDispatcher Dispatcher that dispatched this event
+     */
+    private $dispatcher;
+
+    /**
+     * @var string This event's name
+     */
+    private $name;
+
+    /**
+     * Returns whether further event listeners should be triggered.
+     *
+     * @see Event::stopPropagation()
+     *
+     * @return bool Whether propagation was already stopped for this event
+     */
+    public function isPropagationStopped()
+    {
+        return $this->propagationStopped;
+    }
+
+    /**
+     * Stops the propagation of the event to further event listeners.
+     *
+     * If multiple event listeners are connected to the same event, no
+     * further event listener will be triggered once any trigger calls
+     * stopPropagation().
+     */
+    public function stopPropagation()
+    {
+        $this->propagationStopped = true;
+    }
+
+    /**
+     * Stores the EventDispatcher that dispatches this Event.
+     *
+     * @param EventDispatcherInterface $dispatcher
+     *
+     * @deprecated since version 2.4, to be removed in 3.0. The event dispatcher is passed to the listener call.
+     */
+    public function setDispatcher(EventDispatcherInterface $dispatcher)
+    {
+        $this->dispatcher = $dispatcher;
+    }
+
+    /**
+     * Returns the EventDispatcher that dispatches this Event.
+     *
+     * @return EventDispatcherInterface
+     *
+     * @deprecated since version 2.4, to be removed in 3.0. The event dispatcher is passed to the listener call.
+     */
+    public function getDispatcher()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.4 and will be removed in 3.0. The event dispatcher instance can be received in the listener call instead.', E_USER_DEPRECATED);
+
+        return $this->dispatcher;
+    }
+
+    /**
+     * Gets the event's name.
+     *
+     * @return string
+     *
+     * @deprecated since version 2.4, to be removed in 3.0. The event name is passed to the listener call.
+     */
+    public function getName()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.4 and will be removed in 3.0. The event name can be received in the listener call instead.', E_USER_DEPRECATED);
+
+        return $this->name;
+    }
+
+    /**
+     * Sets the event's name property.
+     *
+     * @param string $name The event name
+     *
+     * @deprecated since version 2.4, to be removed in 3.0. The event name is passed to the listener call.
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/event-dispatcher/EventDispatcher.php
@@ -0,0 +1,198 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\EventDispatcher;
+
+/**
+ * The EventDispatcherInterface is the central point of Symfony's event listener system.
+ *
+ * Listeners are registered on the manager and events are dispatched through the
+ * manager.
+ *
+ * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
+ * @author Jonathan Wage <jonwage@gmail.com>
+ * @author Roman Borschel <roman@code-factory.org>
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Jordan Alliot <jordan.alliot@gmail.com>
+ */
+class EventDispatcher implements EventDispatcherInterface
+{
+    private $listeners = array();
+    private $sorted = array();
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dispatch($eventName, Event $event = null)
+    {
+        if (null === $event) {
+            $event = new Event();
+        }
+
+        $event->setDispatcher($this);
+        $event->setName($eventName);
+
+        if ($listeners = $this->getListeners($eventName)) {
+            $this->doDispatch($listeners, $eventName, $event);
+        }
+
+        return $event;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getListeners($eventName = null)
+    {
+        if (null !== $eventName) {
+            if (!isset($this->listeners[$eventName])) {
+                return array();
+            }
+
+            if (!isset($this->sorted[$eventName])) {
+                $this->sortListeners($eventName);
+            }
+
+            return $this->sorted[$eventName];
+        }
+
+        foreach ($this->listeners as $eventName => $eventListeners) {
+            if (!isset($this->sorted[$eventName])) {
+                $this->sortListeners($eventName);
+            }
+        }
+
+        return array_filter($this->sorted);
+    }
+
+    /**
+     * Gets the listener priority for a specific event.
+     *
+     * Returns null if the event or the listener does not exist.
+     *
+     * @param string   $eventName The name of the event
+     * @param callable $listener  The listener
+     *
+     * @return int|null The event listener priority
+     */
+    public function getListenerPriority($eventName, $listener)
+    {
+        if (!isset($this->listeners[$eventName])) {
+            return;
+        }
+
+        foreach ($this->listeners[$eventName] as $priority => $listeners) {
+            if (false !== in_array($listener, $listeners, true)) {
+                return $priority;
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasListeners($eventName = null)
+    {
+        return (bool) count($this->getListeners($eventName));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addListener($eventName, $listener, $priority = 0)
+    {
+        $this->listeners[$eventName][$priority][] = $listener;
+        unset($this->sorted[$eventName]);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function removeListener($eventName, $listener)
+    {
+        if (!isset($this->listeners[$eventName])) {
+            return;
+        }
+
+        foreach ($this->listeners[$eventName] as $priority => $listeners) {
+            if (false !== ($key = array_search($listener, $listeners, true))) {
+                unset($this->listeners[$eventName][$priority][$key], $this->sorted[$eventName]);
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addSubscriber(EventSubscriberInterface $subscriber)
+    {
+        foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {
+            if (is_string($params)) {
+                $this->addListener($eventName, array($subscriber, $params));
+            } elseif (is_string($params[0])) {
+                $this->addListener($eventName, array($subscriber, $params[0]), isset($params[1]) ? $params[1] : 0);
+            } else {
+                foreach ($params as $listener) {
+                    $this->addListener($eventName, array($subscriber, $listener[0]), isset($listener[1]) ? $listener[1] : 0);
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function removeSubscriber(EventSubscriberInterface $subscriber)
+    {
+        foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {
+            if (is_array($params) && is_array($params[0])) {
+                foreach ($params as $listener) {
+                    $this->removeListener($eventName, array($subscriber, $listener[0]));
+                }
+            } else {
+                $this->removeListener($eventName, array($subscriber, is_string($params) ? $params : $params[0]));
+            }
+        }
+    }
+
+    /**
+     * Triggers the listeners of an event.
+     *
+     * This method can be overridden to add functionality that is executed
+     * for each listener.
+     *
+     * @param callable[] $listeners The event listeners
+     * @param string     $eventName The name of the event to dispatch
+     * @param Event      $event     The event object to pass to the event handlers/listeners
+     */
+    protected function doDispatch($listeners, $eventName, Event $event)
+    {
+        foreach ($listeners as $listener) {
+            if ($event->isPropagationStopped()) {
+                break;
+            }
+            call_user_func($listener, $event, $eventName, $this);
+        }
+    }
+
+    /**
+     * Sorts the internal list of listeners for the given event by priority.
+     *
+     * @param string $eventName The name of the event
+     */
+    private function sortListeners($eventName)
+    {
+        krsort($this->listeners[$eventName]);
+        $this->sorted[$eventName] = call_user_func_array('array_merge', $this->listeners[$eventName]);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/event-dispatcher/EventDispatcherInterface.php
@@ -0,0 +1,88 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\EventDispatcher;
+
+/**
+ * The EventDispatcherInterface is the central point of Symfony's event listener system.
+ * Listeners are registered on the manager and events are dispatched through the
+ * manager.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+interface EventDispatcherInterface
+{
+    /**
+     * Dispatches an event to all registered listeners.
+     *
+     * @param string $eventName The name of the event to dispatch. The name of
+     *                          the event is the name of the method that is
+     *                          invoked on listeners.
+     * @param Event  $event     The event to pass to the event handlers/listeners
+     *                          If not supplied, an empty Event instance is created.
+     *
+     * @return Event
+     */
+    public function dispatch($eventName, Event $event = null);
+
+    /**
+     * Adds an event listener that listens on the specified events.
+     *
+     * @param string   $eventName The event to listen on
+     * @param callable $listener  The listener
+     * @param int      $priority  The higher this value, the earlier an event
+     *                            listener will be triggered in the chain (defaults to 0)
+     */
+    public function addListener($eventName, $listener, $priority = 0);
+
+    /**
+     * Adds an event subscriber.
+     *
+     * The subscriber is asked for all the events he is
+     * interested in and added as a listener for these events.
+     *
+     * @param EventSubscriberInterface $subscriber The subscriber
+     */
+    public function addSubscriber(EventSubscriberInterface $subscriber);
+
+    /**
+     * Removes an event listener from the specified events.
+     *
+     * @param string   $eventName The event to remove a listener from
+     * @param callable $listener  The listener to remove
+     */
+    public function removeListener($eventName, $listener);
+
+    /**
+     * Removes an event subscriber.
+     *
+     * @param EventSubscriberInterface $subscriber The subscriber
+     */
+    public function removeSubscriber(EventSubscriberInterface $subscriber);
+
+    /**
+     * Gets the listeners of a specific event or all listeners sorted by descending priority.
+     *
+     * @param string $eventName The name of the event
+     *
+     * @return array The event listeners for the specified event, or all event listeners by event name
+     */
+    public function getListeners($eventName = null);
+
+    /**
+     * Checks whether an event has any registered listeners.
+     *
+     * @param string $eventName The name of the event
+     *
+     * @return bool true if the specified event has any listeners, false otherwise
+     */
+    public function hasListeners($eventName = null);
+}
--- /dev/null
+++ b/vendor/symfony/event-dispatcher/EventSubscriberInterface.php
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\EventDispatcher;
+
+/**
+ * An EventSubscriber knows himself what events he is interested in.
+ * If an EventSubscriber is added to an EventDispatcherInterface, the manager invokes
+ * {@link getSubscribedEvents} and registers the subscriber as a listener for all
+ * returned events.
+ *
+ * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
+ * @author Jonathan Wage <jonwage@gmail.com>
+ * @author Roman Borschel <roman@code-factory.org>
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+interface EventSubscriberInterface
+{
+    /**
+     * Returns an array of event names this subscriber wants to listen to.
+     *
+     * The array keys are event names and the value can be:
+     *
+     *  * The method name to call (priority defaults to 0)
+     *  * An array composed of the method name to call and the priority
+     *  * An array of arrays composed of the method names to call and respective
+     *    priorities, or 0 if unset
+     *
+     * For instance:
+     *
+     *  * array('eventName' => 'methodName')
+     *  * array('eventName' => array('methodName', $priority))
+     *  * array('eventName' => array(array('methodName1', $priority), array('methodName2')))
+     *
+     * @return array The event names to listen to
+     */
+    public static function getSubscribedEvents();
+}
--- /dev/null
+++ b/vendor/symfony/event-dispatcher/GenericEvent.php
@@ -0,0 +1,186 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\EventDispatcher;
+
+/**
+ * Event encapsulation class.
+ *
+ * Encapsulates events thus decoupling the observer from the subject they encapsulate.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
+{
+    /**
+     * Event subject.
+     *
+     * @var mixed usually object or callable
+     */
+    protected $subject;
+
+    /**
+     * Array of arguments.
+     *
+     * @var array
+     */
+    protected $arguments;
+
+    /**
+     * Encapsulate an event with $subject and $args.
+     *
+     * @param mixed $subject   The subject of the event, usually an object
+     * @param array $arguments Arguments to store in the event
+     */
+    public function __construct($subject = null, array $arguments = array())
+    {
+        $this->subject = $subject;
+        $this->arguments = $arguments;
+    }
+
+    /**
+     * Getter for subject property.
+     *
+     * @return mixed $subject The observer subject
+     */
+    public function getSubject()
+    {
+        return $this->subject;
+    }
+
+    /**
+     * Get argument by key.
+     *
+     * @param string $key Key
+     *
+     * @return mixed Contents of array key
+     *
+     * @throws \InvalidArgumentException If key is not found.
+     */
+    public function getArgument($key)
+    {
+        if ($this->hasArgument($key)) {
+            return $this->arguments[$key];
+        }
+
+        throw new \InvalidArgumentException(sprintf('Argument "%s" not found.', $key));
+    }
+
+    /**
+     * Add argument to event.
+     *
+     * @param string $key   Argument name
+     * @param mixed  $value Value
+     *
+     * @return GenericEvent
+     */
+    public function setArgument($key, $value)
+    {
+        $this->arguments[$key] = $value;
+
+        return $this;
+    }
+
+    /**
+     * Getter for all arguments.
+     *
+     * @return array
+     */
+    public function getArguments()
+    {
+        return $this->arguments;
+    }
+
+    /**
+     * Set args property.
+     *
+     * @param array $args Arguments
+     *
+     * @return GenericEvent
+     */
+    public function setArguments(array $args = array())
+    {
+        $this->arguments = $args;
+
+        return $this;
+    }
+
+    /**
+     * Has argument.
+     *
+     * @param string $key Key of arguments array
+     *
+     * @return bool
+     */
+    public function hasArgument($key)
+    {
+        return array_key_exists($key, $this->arguments);
+    }
+
+    /**
+     * ArrayAccess for argument getter.
+     *
+     * @param string $key Array key
+     *
+     * @return mixed
+     *
+     * @throws \InvalidArgumentException If key does not exist in $this->args.
+     */
+    public function offsetGet($key)
+    {
+        return $this->getArgument($key);
+    }
+
+    /**
+     * ArrayAccess for argument setter.
+     *
+     * @param string $key   Array key to set
+     * @param mixed  $value Value
+     */
+    public function offsetSet($key, $value)
+    {
+        $this->setArgument($key, $value);
+    }
+
+    /**
+     * ArrayAccess for unset argument.
+     *
+     * @param string $key Array key
+     */
+    public function offsetUnset($key)
+    {
+        if ($this->hasArgument($key)) {
+            unset($this->arguments[$key]);
+        }
+    }
+
+    /**
+     * ArrayAccess has argument.
+     *
+     * @param string $key Array key
+     *
+     * @return bool
+     */
+    public function offsetExists($key)
+    {
+        return $this->hasArgument($key);
+    }
+
+    /**
+     * IteratorAggregate for iterating over the object like an array.
+     *
+     * @return \ArrayIterator
+     */
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->arguments);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php
@@ -0,0 +1,101 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\EventDispatcher;
+
+/**
+ * A read-only proxy for an event dispatcher.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class ImmutableEventDispatcher implements EventDispatcherInterface
+{
+    /**
+     * The proxied dispatcher.
+     *
+     * @var EventDispatcherInterface
+     */
+    private $dispatcher;
+
+    /**
+     * Creates an unmodifiable proxy for an event dispatcher.
+     *
+     * @param EventDispatcherInterface $dispatcher The proxied event dispatcher
+     */
+    public function __construct(EventDispatcherInterface $dispatcher)
+    {
+        $this->dispatcher = $dispatcher;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dispatch($eventName, Event $event = null)
+    {
+        return $this->dispatcher->dispatch($eventName, $event);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addListener($eventName, $listener, $priority = 0)
+    {
+        throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addSubscriber(EventSubscriberInterface $subscriber)
+    {
+        throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function removeListener($eventName, $listener)
+    {
+        throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function removeSubscriber(EventSubscriberInterface $subscriber)
+    {
+        throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getListeners($eventName = null)
+    {
+        return $this->dispatcher->getListeners($eventName);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getListenerPriority($eventName, $listener)
+    {
+        return $this->dispatcher->getListenerPriority($eventName, $listener);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasListeners($eventName = null)
+    {
+        return $this->dispatcher->hasListeners($eventName);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/event-dispatcher/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2016 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/symfony/event-dispatcher/composer.json
@@ -0,0 +1,44 @@
+{
+    "name": "symfony/event-dispatcher",
+    "type": "library",
+    "description": "Symfony EventDispatcher Component",
+    "keywords": [],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.9"
+    },
+    "require-dev": {
+        "symfony/dependency-injection": "~2.6|~3.0.0",
+        "symfony/expression-language": "~2.6|~3.0.0",
+        "symfony/config": "~2.0,>=2.0.5|~3.0.0",
+        "symfony/stopwatch": "~2.3|~3.0.0",
+        "psr/log": "~1.0"
+    },
+    "suggest": {
+        "symfony/dependency-injection": "",
+        "symfony/http-kernel": ""
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.8-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/filesystem/Exception/ExceptionInterface.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Filesystem\Exception;
+
+/**
+ * Exception interface for all exceptions thrown by the component.
+ *
+ * @author Romain Neutron <imprec@gmail.com>
+ */
+interface ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/filesystem/Exception/FileNotFoundException.php
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Filesystem\Exception;
+
+/**
+ * Exception class thrown when a file couldn't be found.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Christian Gärtner <christiangaertner.film@googlemail.com>
+ */
+class FileNotFoundException extends IOException
+{
+    public function __construct($message = null, $code = 0, \Exception $previous = null, $path = null)
+    {
+        if (null === $message) {
+            if (null === $path) {
+                $message = 'File could not be found.';
+            } else {
+                $message = sprintf('File "%s" could not be found.', $path);
+            }
+        }
+
+        parent::__construct($message, $code, $previous, $path);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/filesystem/Exception/IOException.php
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Filesystem\Exception;
+
+/**
+ * Exception class thrown when a filesystem operation failure happens.
+ *
+ * @author Romain Neutron <imprec@gmail.com>
+ * @author Christian Gärtner <christiangaertner.film@googlemail.com>
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class IOException extends \RuntimeException implements IOExceptionInterface
+{
+    private $path;
+
+    public function __construct($message, $code = 0, \Exception $previous = null, $path = null)
+    {
+        $this->path = $path;
+
+        parent::__construct($message, $code, $previous);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getPath()
+    {
+        return $this->path;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/filesystem/Exception/IOExceptionInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Filesystem\Exception;
+
+/**
+ * IOException interface for file and input/output stream related exceptions thrown by the component.
+ *
+ * @author Christian Gärtner <christiangaertner.film@googlemail.com>
+ */
+interface IOExceptionInterface extends ExceptionInterface
+{
+    /**
+     * Returns the associated path for the exception.
+     *
+     * @return string The path
+     */
+    public function getPath();
+}
--- /dev/null
+++ b/vendor/symfony/filesystem/Filesystem.php
@@ -0,0 +1,600 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Filesystem;
+
+use Symfony\Component\Filesystem\Exception\IOException;
+use Symfony\Component\Filesystem\Exception\FileNotFoundException;
+
+/**
+ * Provides basic utility to manipulate the file system.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Filesystem
+{
+    /**
+     * Copies a file.
+     *
+     * If the target file is older than the origin file, it's always overwritten.
+     * If the target file is newer, it is overwritten only when the
+     * $overwriteNewerFiles option is set to true.
+     *
+     * @param string $originFile          The original filename
+     * @param string $targetFile          The target filename
+     * @param bool   $overwriteNewerFiles If true, target files newer than origin files are overwritten
+     *
+     * @throws FileNotFoundException When originFile doesn't exist
+     * @throws IOException           When copy fails
+     */
+    public function copy($originFile, $targetFile, $overwriteNewerFiles = false)
+    {
+        if (stream_is_local($originFile) && !is_file($originFile)) {
+            throw new FileNotFoundException(sprintf('Failed to copy "%s" because file does not exist.', $originFile), 0, null, $originFile);
+        }
+
+        $this->mkdir(dirname($targetFile));
+
+        $doCopy = true;
+        if (!$overwriteNewerFiles && null === parse_url($originFile, PHP_URL_HOST) && is_file($targetFile)) {
+            $doCopy = filemtime($originFile) > filemtime($targetFile);
+        }
+
+        if ($doCopy) {
+            // https://bugs.php.net/bug.php?id=64634
+            if (false === $source = @fopen($originFile, 'r')) {
+                throw new IOException(sprintf('Failed to copy "%s" to "%s" because source file could not be opened for reading.', $originFile, $targetFile), 0, null, $originFile);
+            }
+
+            // Stream context created to allow files overwrite when using FTP stream wrapper - disabled by default
+            if (false === $target = @fopen($targetFile, 'w', null, stream_context_create(array('ftp' => array('overwrite' => true))))) {
+                throw new IOException(sprintf('Failed to copy "%s" to "%s" because target file could not be opened for writing.', $originFile, $targetFile), 0, null, $originFile);
+            }
+
+            $bytesCopied = stream_copy_to_stream($source, $target);
+            fclose($source);
+            fclose($target);
+            unset($source, $target);
+
+            if (!is_file($targetFile)) {
+                throw new IOException(sprintf('Failed to copy "%s" to "%s".', $originFile, $targetFile), 0, null, $originFile);
+            }
+
+            // Like `cp`, preserve executable permission bits
+            @chmod($targetFile, fileperms($targetFile) | (fileperms($originFile) & 0111));
+
+            if (stream_is_local($originFile) && $bytesCopied !== ($bytesOrigin = filesize($originFile))) {
+                throw new IOException(sprintf('Failed to copy the whole content of "%s" to "%s" (%g of %g bytes copied).', $originFile, $targetFile, $bytesCopied, $bytesOrigin), 0, null, $originFile);
+            }
+        }
+    }
+
+    /**
+     * Creates a directory recursively.
+     *
+     * @param string|array|\Traversable $dirs The directory path
+     * @param int                       $mode The directory mode
+     *
+     * @throws IOException On any directory creation failure
+     */
+    public function mkdir($dirs, $mode = 0777)
+    {
+        foreach ($this->toIterator($dirs) as $dir) {
+            if (is_dir($dir)) {
+                continue;
+            }
+
+            if (true !== @mkdir($dir, $mode, true)) {
+                $error = error_get_last();
+                if (!is_dir($dir)) {
+                    // The directory was not created by a concurrent process. Let's throw an exception with a developer friendly error message if we have one
+                    if ($error) {
+                        throw new IOException(sprintf('Failed to create "%s": %s.', $dir, $error['message']), 0, null, $dir);
+                    }
+                    throw new IOException(sprintf('Failed to create "%s"', $dir), 0, null, $dir);
+                }
+            }
+        }
+    }
+
+    /**
+     * Checks the existence of files or directories.
+     *
+     * @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to check
+     *
+     * @return bool true if the file exists, false otherwise
+     */
+    public function exists($files)
+    {
+        foreach ($this->toIterator($files) as $file) {
+            if ('\\' === DIRECTORY_SEPARATOR && strlen($file) > 258) {
+                throw new IOException('Could not check if file exist because path length exceeds 258 characters.', 0, null, $file);
+            }
+
+            if (!file_exists($file)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Sets access and modification time of file.
+     *
+     * @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to create
+     * @param int                       $time  The touch time as a Unix timestamp
+     * @param int                       $atime The access time as a Unix timestamp
+     *
+     * @throws IOException When touch fails
+     */
+    public function touch($files, $time = null, $atime = null)
+    {
+        foreach ($this->toIterator($files) as $file) {
+            $touch = $time ? @touch($file, $time, $atime) : @touch($file);
+            if (true !== $touch) {
+                throw new IOException(sprintf('Failed to touch "%s".', $file), 0, null, $file);
+            }
+        }
+    }
+
+    /**
+     * Removes files or directories.
+     *
+     * @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to remove
+     *
+     * @throws IOException When removal fails
+     */
+    public function remove($files)
+    {
+        if ($files instanceof \Traversable) {
+            $files = iterator_to_array($files, false);
+        } elseif (!is_array($files)) {
+            $files = array($files);
+        }
+        $files = array_reverse($files);
+        foreach ($files as $file) {
+            if (is_link($file)) {
+                // See https://bugs.php.net/52176
+                if (!@(unlink($file) || '\\' !== DIRECTORY_SEPARATOR || rmdir($file)) && file_exists($file)) {
+                    $error = error_get_last();
+                    throw new IOException(sprintf('Failed to remove symlink "%s": %s.', $file, $error['message']));
+                }
+            } elseif (is_dir($file)) {
+                $this->remove(new \FilesystemIterator($file, \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS));
+
+                if (!@rmdir($file) && file_exists($file)) {
+                    $error = error_get_last();
+                    throw new IOException(sprintf('Failed to remove directory "%s": %s.', $file, $error['message']));
+                }
+            } elseif (!@unlink($file) && file_exists($file)) {
+                $error = error_get_last();
+                throw new IOException(sprintf('Failed to remove file "%s": %s.', $file, $error['message']));
+            }
+        }
+    }
+
+    /**
+     * Change mode for an array of files or directories.
+     *
+     * @param string|array|\Traversable $files     A filename, an array of files, or a \Traversable instance to change mode
+     * @param int                       $mode      The new mode (octal)
+     * @param int                       $umask     The mode mask (octal)
+     * @param bool                      $recursive Whether change the mod recursively or not
+     *
+     * @throws IOException When the change fail
+     */
+    public function chmod($files, $mode, $umask = 0000, $recursive = false)
+    {
+        foreach ($this->toIterator($files) as $file) {
+            if (true !== @chmod($file, $mode & ~$umask)) {
+                throw new IOException(sprintf('Failed to chmod file "%s".', $file), 0, null, $file);
+            }
+            if ($recursive && is_dir($file) && !is_link($file)) {
+                $this->chmod(new \FilesystemIterator($file), $mode, $umask, true);
+            }
+        }
+    }
+
+    /**
+     * Change the owner of an array of files or directories.
+     *
+     * @param string|array|\Traversable $files     A filename, an array of files, or a \Traversable instance to change owner
+     * @param string                    $user      The new owner user name
+     * @param bool                      $recursive Whether change the owner recursively or not
+     *
+     * @throws IOException When the change fail
+     */
+    public function chown($files, $user, $recursive = false)
+    {
+        foreach ($this->toIterator($files) as $file) {
+            if ($recursive && is_dir($file) && !is_link($file)) {
+                $this->chown(new \FilesystemIterator($file), $user, true);
+            }
+            if (is_link($file) && function_exists('lchown')) {
+                if (true !== @lchown($file, $user)) {
+                    throw new IOException(sprintf('Failed to chown file "%s".', $file), 0, null, $file);
+                }
+            } else {
+                if (true !== @chown($file, $user)) {
+                    throw new IOException(sprintf('Failed to chown file "%s".', $file), 0, null, $file);
+                }
+            }
+        }
+    }
+
+    /**
+     * Change the group of an array of files or directories.
+     *
+     * @param string|array|\Traversable $files     A filename, an array of files, or a \Traversable instance to change group
+     * @param string                    $group     The group name
+     * @param bool                      $recursive Whether change the group recursively or not
+     *
+     * @throws IOException When the change fail
+     */
+    public function chgrp($files, $group, $recursive = false)
+    {
+        foreach ($this->toIterator($files) as $file) {
+            if ($recursive && is_dir($file) && !is_link($file)) {
+                $this->chgrp(new \FilesystemIterator($file), $group, true);
+            }
+            if (is_link($file) && function_exists('lchgrp')) {
+                if (true !== @lchgrp($file, $group) || (defined('HHVM_VERSION') && !posix_getgrnam($group))) {
+                    throw new IOException(sprintf('Failed to chgrp file "%s".', $file), 0, null, $file);
+                }
+            } else {
+                if (true !== @chgrp($file, $group)) {
+                    throw new IOException(sprintf('Failed to chgrp file "%s".', $file), 0, null, $file);
+                }
+            }
+        }
+    }
+
+    /**
+     * Renames a file or a directory.
+     *
+     * @param string $origin    The origin filename or directory
+     * @param string $target    The new filename or directory
+     * @param bool   $overwrite Whether to overwrite the target if it already exists
+     *
+     * @throws IOException When target file or directory already exists
+     * @throws IOException When origin cannot be renamed
+     */
+    public function rename($origin, $target, $overwrite = false)
+    {
+        // we check that target does not exist
+        if (!$overwrite && $this->isReadable($target)) {
+            throw new IOException(sprintf('Cannot rename because the target "%s" already exists.', $target), 0, null, $target);
+        }
+
+        if (true !== @rename($origin, $target)) {
+            throw new IOException(sprintf('Cannot rename "%s" to "%s".', $origin, $target), 0, null, $target);
+        }
+    }
+
+    /**
+     * Tells whether a file exists and is readable.
+     *
+     * @param string $filename Path to the file
+     *
+     * @return bool
+     *
+     * @throws IOException When windows path is longer than 258 characters
+     */
+    private function isReadable($filename)
+    {
+        if ('\\' === DIRECTORY_SEPARATOR && strlen($filename) > 258) {
+            throw new IOException('Could not check if file is readable because path length exceeds 258 characters.', 0, null, $filename);
+        }
+
+        return is_readable($filename);
+    }
+
+    /**
+     * Creates a symbolic link or copy a directory.
+     *
+     * @param string $originDir     The origin directory path
+     * @param string $targetDir     The symbolic link name
+     * @param bool   $copyOnWindows Whether to copy files if on Windows
+     *
+     * @throws IOException When symlink fails
+     */
+    public function symlink($originDir, $targetDir, $copyOnWindows = false)
+    {
+        if ('\\' === DIRECTORY_SEPARATOR) {
+            $originDir = strtr($originDir, '/', '\\');
+            $targetDir = strtr($targetDir, '/', '\\');
+
+            if ($copyOnWindows) {
+                $this->mirror($originDir, $targetDir);
+
+                return;
+            }
+        }
+
+        $this->mkdir(dirname($targetDir));
+
+        $ok = false;
+        if (is_link($targetDir)) {
+            if (readlink($targetDir) != $originDir) {
+                $this->remove($targetDir);
+            } else {
+                $ok = true;
+            }
+        }
+
+        if (!$ok && true !== @symlink($originDir, $targetDir)) {
+            $report = error_get_last();
+            if (is_array($report)) {
+                if ('\\' === DIRECTORY_SEPARATOR && false !== strpos($report['message'], 'error code(1314)')) {
+                    throw new IOException('Unable to create symlink due to error code 1314: \'A required privilege is not held by the client\'. Do you have the required Administrator-rights?', 0, null, $targetDir);
+                }
+            }
+            throw new IOException(sprintf('Failed to create symbolic link from "%s" to "%s".', $originDir, $targetDir), 0, null, $targetDir);
+        }
+    }
+
+    /**
+     * Given an existing path, convert it to a path relative to a given starting path.
+     *
+     * @param string $endPath   Absolute path of target
+     * @param string $startPath Absolute path where traversal begins
+     *
+     * @return string Path of target relative to starting path
+     */
+    public function makePathRelative($endPath, $startPath)
+    {
+        // Normalize separators on Windows
+        if ('\\' === DIRECTORY_SEPARATOR) {
+            $endPath = str_replace('\\', '/', $endPath);
+            $startPath = str_replace('\\', '/', $startPath);
+        }
+
+        // Split the paths into arrays
+        $startPathArr = explode('/', trim($startPath, '/'));
+        $endPathArr = explode('/', trim($endPath, '/'));
+
+        // Find for which directory the common path stops
+        $index = 0;
+        while (isset($startPathArr[$index]) && isset($endPathArr[$index]) && $startPathArr[$index] === $endPathArr[$index]) {
+            ++$index;
+        }
+
+        // Determine how deep the start path is relative to the common path (ie, "web/bundles" = 2 levels)
+        if (count($startPathArr) === 1 && $startPathArr[0] === '') {
+            $depth = 0;
+        } else {
+            $depth = count($startPathArr) - $index;
+        }
+
+        // When we need to traverse from the start, and we are starting from a root path, don't add '../'
+        if ('/' === $startPath[0] && 0 === $index && 0 === $depth) {
+            $traverser = '';
+        } else {
+            // Repeated "../" for each level need to reach the common path
+            $traverser = str_repeat('../', $depth);
+        }
+
+        $endPathRemainder = implode('/', array_slice($endPathArr, $index));
+
+        // Construct $endPath from traversing to the common path, then to the remaining $endPath
+        $relativePath = $traverser.('' !== $endPathRemainder ? $endPathRemainder.'/' : '');
+
+        return '' === $relativePath ? './' : $relativePath;
+    }
+
+    /**
+     * Mirrors a directory to another.
+     *
+     * @param string       $originDir The origin directory
+     * @param string       $targetDir The target directory
+     * @param \Traversable $iterator  A Traversable instance
+     * @param array        $options   An array of boolean options
+     *                                Valid options are:
+     *                                - $options['override'] Whether to override an existing file on copy or not (see copy())
+     *                                - $options['copy_on_windows'] Whether to copy files instead of links on Windows (see symlink())
+     *                                - $options['delete'] Whether to delete files that are not in the source directory (defaults to false)
+     *
+     * @throws IOException When file type is unknown
+     */
+    public function mirror($originDir, $targetDir, \Traversable $iterator = null, $options = array())
+    {
+        $targetDir = rtrim($targetDir, '/\\');
+        $originDir = rtrim($originDir, '/\\');
+
+        // Iterate in destination folder to remove obsolete entries
+        if ($this->exists($targetDir) && isset($options['delete']) && $options['delete']) {
+            $deleteIterator = $iterator;
+            if (null === $deleteIterator) {
+                $flags = \FilesystemIterator::SKIP_DOTS;
+                $deleteIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($targetDir, $flags), \RecursiveIteratorIterator::CHILD_FIRST);
+            }
+            foreach ($deleteIterator as $file) {
+                $origin = str_replace($targetDir, $originDir, $file->getPathname());
+                if (!$this->exists($origin)) {
+                    $this->remove($file);
+                }
+            }
+        }
+
+        $copyOnWindows = false;
+        if (isset($options['copy_on_windows'])) {
+            $copyOnWindows = $options['copy_on_windows'];
+        }
+
+        if (null === $iterator) {
+            $flags = $copyOnWindows ? \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS : \FilesystemIterator::SKIP_DOTS;
+            $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($originDir, $flags), \RecursiveIteratorIterator::SELF_FIRST);
+        }
+
+        if ($this->exists($originDir)) {
+            $this->mkdir($targetDir);
+        }
+
+        foreach ($iterator as $file) {
+            $target = str_replace($originDir, $targetDir, $file->getPathname());
+
+            if ($copyOnWindows) {
+                if (is_file($file)) {
+                    $this->copy($file, $target, isset($options['override']) ? $options['override'] : false);
+                } elseif (is_dir($file)) {
+                    $this->mkdir($target);
+                } else {
+                    throw new IOException(sprintf('Unable to guess "%s" file type.', $file), 0, null, $file);
+                }
+            } else {
+                if (is_link($file)) {
+                    $this->symlink($file->getLinkTarget(), $target);
+                } elseif (is_dir($file)) {
+                    $this->mkdir($target);
+                } elseif (is_file($file)) {
+                    $this->copy($file, $target, isset($options['override']) ? $options['override'] : false);
+                } else {
+                    throw new IOException(sprintf('Unable to guess "%s" file type.', $file), 0, null, $file);
+                }
+            }
+        }
+    }
+
+    /**
+     * Returns whether the file path is an absolute path.
+     *
+     * @param string $file A file path
+     *
+     * @return bool
+     */
+    public function isAbsolutePath($file)
+    {
+        return strspn($file, '/\\', 0, 1)
+            || (strlen($file) > 3 && ctype_alpha($file[0])
+                && substr($file, 1, 1) === ':'
+                && strspn($file, '/\\', 2, 1)
+            )
+            || null !== parse_url($file, PHP_URL_SCHEME)
+        ;
+    }
+
+    /**
+     * Creates a temporary file with support for custom stream wrappers.
+     *
+     * @param string $dir    The directory where the temporary filename will be created
+     * @param string $prefix The prefix of the generated temporary filename
+     *                       Note: Windows uses only the first three characters of prefix
+     *
+     * @return string The new temporary filename (with path), or throw an exception on failure
+     */
+    public function tempnam($dir, $prefix)
+    {
+        list($scheme, $hierarchy) = $this->getSchemeAndHierarchy($dir);
+
+        // If no scheme or scheme is "file" or "gs" (Google Cloud) create temp file in local filesystem
+        if (null === $scheme || 'file' === $scheme || 'gs' === $scheme) {
+            $tmpFile = @tempnam($hierarchy, $prefix);
+
+            // If tempnam failed or no scheme return the filename otherwise prepend the scheme
+            if (false !== $tmpFile) {
+                if (null !== $scheme && 'gs' !== $scheme) {
+                    return $scheme.'://'.$tmpFile;
+                }
+
+                return $tmpFile;
+            }
+
+            throw new IOException('A temporary file could not be created.');
+        }
+
+        // Loop until we create a valid temp file or have reached 10 attempts
+        for ($i = 0; $i < 10; ++$i) {
+            // Create a unique filename
+            $tmpFile = $dir.'/'.$prefix.uniqid(mt_rand(), true);
+
+            // Use fopen instead of file_exists as some streams do not support stat
+            // Use mode 'x+' to atomically check existence and create to avoid a TOCTOU vulnerability
+            $handle = @fopen($tmpFile, 'x+');
+
+            // If unsuccessful restart the loop
+            if (false === $handle) {
+                continue;
+            }
+
+            // Close the file if it was successfully opened
+            @fclose($handle);
+
+            return $tmpFile;
+        }
+
+        throw new IOException('A temporary file could not be created.');
+    }
+
+    /**
+     * Atomically dumps content into a file.
+     *
+     * @param string   $filename The file to be written to
+     * @param string   $content  The data to write into the file
+     * @param null|int $mode     The file mode (octal). If null, file permissions are not modified
+     *                           Deprecated since version 2.3.12, to be removed in 3.0.
+     *
+     * @throws IOException If the file cannot be written to.
+     */
+    public function dumpFile($filename, $content, $mode = 0666)
+    {
+        $dir = dirname($filename);
+
+        if (!is_dir($dir)) {
+            $this->mkdir($dir);
+        } elseif (!is_writable($dir)) {
+            throw new IOException(sprintf('Unable to write to the "%s" directory.', $dir), 0, null, $dir);
+        }
+
+        $tmpFile = $this->tempnam($dir, basename($filename));
+
+        if (false === @file_put_contents($tmpFile, $content)) {
+            throw new IOException(sprintf('Failed to write file "%s".', $filename), 0, null, $filename);
+        }
+
+        if (null !== $mode) {
+            if (func_num_args() > 2) {
+                @trigger_error('Support for modifying file permissions is deprecated since version 2.3.12 and will be removed in 3.0.', E_USER_DEPRECATED);
+            }
+
+            $this->chmod($tmpFile, $mode);
+        }
+        $this->rename($tmpFile, $filename, true);
+    }
+
+    /**
+     * @param mixed $files
+     *
+     * @return \Traversable
+     */
+    private function toIterator($files)
+    {
+        if (!$files instanceof \Traversable) {
+            $files = new \ArrayObject(is_array($files) ? $files : array($files));
+        }
+
+        return $files;
+    }
+
+    /**
+     * Gets a 2-tuple of scheme (may be null) and hierarchical part of a filename (e.g. file:///tmp -> array(file, tmp)).
+     *
+     * @param string $filename The filename to be parsed
+     *
+     * @return array The filename scheme and hierarchical part
+     */
+    private function getSchemeAndHierarchy($filename)
+    {
+        $components = explode('://', $filename, 2);
+
+        return 2 === count($components) ? array($components[0], $components[1]) : array(null, $components[0]);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/filesystem/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2016 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/symfony/filesystem/LockHandler.php
@@ -0,0 +1,112 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Filesystem;
+
+use Symfony\Component\Filesystem\Exception\IOException;
+
+/**
+ * LockHandler class provides a simple abstraction to lock anything by means of
+ * a file lock.
+ *
+ * A locked file is created based on the lock name when calling lock(). Other
+ * lock handlers will not be able to lock the same name until it is released
+ * (explicitly by calling release() or implicitly when the instance holding the
+ * lock is destroyed).
+ *
+ * @author Grégoire Pineau <lyrixx@lyrixx.info>
+ * @author Romain Neutron <imprec@gmail.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class LockHandler
+{
+    private $file;
+    private $handle;
+
+    /**
+     * @param string      $name     The lock name
+     * @param string|null $lockPath The directory to store the lock. Default values will use temporary directory
+     *
+     * @throws IOException If the lock directory could not be created or is not writable
+     */
+    public function __construct($name, $lockPath = null)
+    {
+        $lockPath = $lockPath ?: sys_get_temp_dir();
+
+        if (!is_dir($lockPath)) {
+            $fs = new Filesystem();
+            $fs->mkdir($lockPath);
+        }
+
+        if (!is_writable($lockPath)) {
+            throw new IOException(sprintf('The directory "%s" is not writable.', $lockPath), 0, null, $lockPath);
+        }
+
+        $this->file = sprintf('%s/sf.%s.%s.lock', $lockPath, preg_replace('/[^a-z0-9\._-]+/i', '-', $name), hash('sha256', $name));
+    }
+
+    /**
+     * Lock the resource.
+     *
+     * @param bool $blocking wait until the lock is released
+     *
+     * @return bool Returns true if the lock was acquired, false otherwise
+     *
+     * @throws IOException If the lock file could not be created or opened
+     */
+    public function lock($blocking = false)
+    {
+        if ($this->handle) {
+            return true;
+        }
+
+        // Silence error reporting
+        set_error_handler(function () {});
+
+        if (!$this->handle = fopen($this->file, 'r')) {
+            if ($this->handle = fopen($this->file, 'x')) {
+                chmod($this->file, 0444);
+            } elseif (!$this->handle = fopen($this->file, 'r')) {
+                usleep(100); // Give some time for chmod() to complete
+                $this->handle = fopen($this->file, 'r');
+            }
+        }
+        restore_error_handler();
+
+        if (!$this->handle) {
+            $error = error_get_last();
+            throw new IOException($error['message'], 0, null, $this->file);
+        }
+
+        // On Windows, even if PHP doc says the contrary, LOCK_NB works, see
+        // https://bugs.php.net/54129
+        if (!flock($this->handle, LOCK_EX | ($blocking ? 0 : LOCK_NB))) {
+            fclose($this->handle);
+            $this->handle = null;
+
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Release the resource.
+     */
+    public function release()
+    {
+        if ($this->handle) {
+            flock($this->handle, LOCK_UN | LOCK_NB);
+            fclose($this->handle);
+            $this->handle = null;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/filesystem/composer.json
@@ -0,0 +1,33 @@
+{
+    "name": "symfony/filesystem",
+    "type": "library",
+    "description": "Symfony Filesystem Component",
+    "keywords": [],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.9"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Component\\Filesystem\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.8-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Adapter/AbstractAdapter.php
@@ -0,0 +1,240 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Adapter;
+
+@trigger_error('The '.__NAMESPACE__.'\AbstractAdapter class is deprecated since version 2.8 and will be removed in 3.0. Use directly the Finder class instead.', E_USER_DEPRECATED);
+
+/**
+ * Interface for finder engine implementations.
+ *
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ *
+ * @deprecated since 2.8, to be removed in 3.0. Use Finder instead.
+ */
+abstract class AbstractAdapter implements AdapterInterface
+{
+    protected $followLinks = false;
+    protected $mode = 0;
+    protected $minDepth = 0;
+    protected $maxDepth = PHP_INT_MAX;
+    protected $exclude = array();
+    protected $names = array();
+    protected $notNames = array();
+    protected $contains = array();
+    protected $notContains = array();
+    protected $sizes = array();
+    protected $dates = array();
+    protected $filters = array();
+    protected $sort = false;
+    protected $paths = array();
+    protected $notPaths = array();
+    protected $ignoreUnreadableDirs = false;
+
+    private static $areSupported = array();
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isSupported()
+    {
+        $name = $this->getName();
+
+        if (!array_key_exists($name, self::$areSupported)) {
+            self::$areSupported[$name] = $this->canBeUsed();
+        }
+
+        return self::$areSupported[$name];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFollowLinks($followLinks)
+    {
+        $this->followLinks = $followLinks;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setMode($mode)
+    {
+        $this->mode = $mode;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setDepths(array $depths)
+    {
+        $this->minDepth = 0;
+        $this->maxDepth = PHP_INT_MAX;
+
+        foreach ($depths as $comparator) {
+            switch ($comparator->getOperator()) {
+                case '>':
+                    $this->minDepth = $comparator->getTarget() + 1;
+                    break;
+                case '>=':
+                    $this->minDepth = $comparator->getTarget();
+                    break;
+                case '<':
+                    $this->maxDepth = $comparator->getTarget() - 1;
+                    break;
+                case '<=':
+                    $this->maxDepth = $comparator->getTarget();
+                    break;
+                default:
+                    $this->minDepth = $this->maxDepth = $comparator->getTarget();
+            }
+        }
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setExclude(array $exclude)
+    {
+        $this->exclude = $exclude;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setNames(array $names)
+    {
+        $this->names = $names;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setNotNames(array $notNames)
+    {
+        $this->notNames = $notNames;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setContains(array $contains)
+    {
+        $this->contains = $contains;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setNotContains(array $notContains)
+    {
+        $this->notContains = $notContains;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setSizes(array $sizes)
+    {
+        $this->sizes = $sizes;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setDates(array $dates)
+    {
+        $this->dates = $dates;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFilters(array $filters)
+    {
+        $this->filters = $filters;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setSort($sort)
+    {
+        $this->sort = $sort;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setPath(array $paths)
+    {
+        $this->paths = $paths;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setNotPath(array $notPaths)
+    {
+        $this->notPaths = $notPaths;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function ignoreUnreadableDirs($ignore = true)
+    {
+        $this->ignoreUnreadableDirs = (bool) $ignore;
+
+        return $this;
+    }
+
+    /**
+     * Returns whether the adapter is supported in the current environment.
+     *
+     * This method should be implemented in all adapters. Do not implement
+     * isSupported in the adapters as the generic implementation provides a cache
+     * layer.
+     *
+     * @see isSupported()
+     *
+     * @return bool Whether the adapter is supported
+     */
+    abstract protected function canBeUsed();
+}
--- /dev/null
+++ b/vendor/symfony/finder/Adapter/AbstractFindAdapter.php
@@ -0,0 +1,331 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Adapter;
+
+@trigger_error('The '.__NAMESPACE__.'\AbstractFindAdapter class is deprecated since version 2.8 and will be removed in 3.0. Use directly the Finder class instead.', E_USER_DEPRECATED);
+
+use Symfony\Component\Finder\Exception\AccessDeniedException;
+use Symfony\Component\Finder\Iterator;
+use Symfony\Component\Finder\Shell\Shell;
+use Symfony\Component\Finder\Expression\Expression;
+use Symfony\Component\Finder\Shell\Command;
+use Symfony\Component\Finder\Comparator\NumberComparator;
+use Symfony\Component\Finder\Comparator\DateComparator;
+
+/**
+ * Shell engine implementation using GNU find command.
+ *
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ *
+ * @deprecated since 2.8, to be removed in 3.0. Use Finder instead.
+ */
+abstract class AbstractFindAdapter extends AbstractAdapter
+{
+    /**
+     * @var Shell
+     */
+    protected $shell;
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        $this->shell = new Shell();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function searchInDirectory($dir)
+    {
+        // having "/../" in path make find fail
+        $dir = realpath($dir);
+
+        // searching directories containing or not containing strings leads to no result
+        if (Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES === $this->mode && ($this->contains || $this->notContains)) {
+            return new Iterator\FilePathsIterator(array(), $dir);
+        }
+
+        $command = Command::create();
+        $find = $this->buildFindCommand($command, $dir);
+
+        if ($this->followLinks) {
+            $find->add('-follow');
+        }
+
+        $find->add('-mindepth')->add($this->minDepth + 1);
+
+        if (PHP_INT_MAX !== $this->maxDepth) {
+            $find->add('-maxdepth')->add($this->maxDepth + 1);
+        }
+
+        if (Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES === $this->mode) {
+            $find->add('-type d');
+        } elseif (Iterator\FileTypeFilterIterator::ONLY_FILES === $this->mode) {
+            $find->add('-type f');
+        }
+
+        $this->buildNamesFiltering($find, $this->names);
+        $this->buildNamesFiltering($find, $this->notNames, true);
+        $this->buildPathsFiltering($find, $dir, $this->paths);
+        $this->buildPathsFiltering($find, $dir, $this->notPaths, true);
+        $this->buildSizesFiltering($find, $this->sizes);
+        $this->buildDatesFiltering($find, $this->dates);
+
+        $useGrep = $this->shell->testCommand('grep') && $this->shell->testCommand('xargs');
+        $useSort = is_int($this->sort) && $this->shell->testCommand('sort') && $this->shell->testCommand('cut');
+
+        if ($useGrep && ($this->contains || $this->notContains)) {
+            $grep = $command->ins('grep');
+            $this->buildContentFiltering($grep, $this->contains);
+            $this->buildContentFiltering($grep, $this->notContains, true);
+        }
+
+        if ($useSort) {
+            $this->buildSorting($command, $this->sort);
+        }
+
+        $command->setErrorHandler(
+            $this->ignoreUnreadableDirs
+                // If directory is unreadable and finder is set to ignore it, `stderr` is ignored.
+                ? function ($stderr) { }
+                : function ($stderr) { throw new AccessDeniedException($stderr); }
+        );
+
+        $paths = $this->shell->testCommand('uniq') ? $command->add('| uniq')->execute() : array_unique($command->execute());
+        $iterator = new Iterator\FilePathsIterator($paths, $dir);
+
+        if ($this->exclude) {
+            $iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $this->exclude);
+        }
+
+        if (!$useGrep && ($this->contains || $this->notContains)) {
+            $iterator = new Iterator\FilecontentFilterIterator($iterator, $this->contains, $this->notContains);
+        }
+
+        if ($this->filters) {
+            $iterator = new Iterator\CustomFilterIterator($iterator, $this->filters);
+        }
+
+        if (!$useSort && $this->sort) {
+            $iteratorAggregate = new Iterator\SortableIterator($iterator, $this->sort);
+            $iterator = $iteratorAggregate->getIterator();
+        }
+
+        return $iterator;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function canBeUsed()
+    {
+        return $this->shell->testCommand('find');
+    }
+
+    /**
+     * @param Command $command
+     * @param string  $dir
+     *
+     * @return Command
+     */
+    protected function buildFindCommand(Command $command, $dir)
+    {
+        return $command
+            ->ins('find')
+            ->add('find ')
+            ->arg($dir)
+            ->add('-noleaf'); // the -noleaf option is required for filesystems that don't follow the '.' and '..' conventions
+    }
+
+    /**
+     * @param Command  $command
+     * @param string[] $names
+     * @param bool     $not
+     */
+    private function buildNamesFiltering(Command $command, array $names, $not = false)
+    {
+        if (0 === count($names)) {
+            return;
+        }
+
+        $command->add($not ? '-not' : null)->cmd('(');
+
+        foreach ($names as $i => $name) {
+            $expr = Expression::create($name);
+
+            // Find does not support expandable globs ("*.{a,b}" syntax).
+            if ($expr->isGlob() && $expr->getGlob()->isExpandable()) {
+                $expr = Expression::create($expr->getGlob()->toRegex(false));
+            }
+
+            // Fixes 'not search' and 'full path matching' regex problems.
+            // - Jokers '.' are replaced by [^/].
+            // - We add '[^/]*' before and after regex (if no ^|$ flags are present).
+            if ($expr->isRegex()) {
+                $regex = $expr->getRegex();
+                $regex->prepend($regex->hasStartFlag() ? '/' : '/[^/]*')
+                    ->setStartFlag(false)
+                    ->setStartJoker(true)
+                    ->replaceJokers('[^/]');
+                if (!$regex->hasEndFlag() || $regex->hasEndJoker()) {
+                    $regex->setEndJoker(false)->append('[^/]*');
+                }
+            }
+
+            $command
+                ->add($i > 0 ? '-or' : null)
+                ->add($expr->isRegex()
+                    ? ($expr->isCaseSensitive() ? '-regex' : '-iregex')
+                    : ($expr->isCaseSensitive() ? '-name' : '-iname')
+                )
+                ->arg($expr->renderPattern());
+        }
+
+        $command->cmd(')');
+    }
+
+    /**
+     * @param Command  $command
+     * @param string   $dir
+     * @param string[] $paths
+     * @param bool     $not
+     */
+    private function buildPathsFiltering(Command $command, $dir, array $paths, $not = false)
+    {
+        if (0 === count($paths)) {
+            return;
+        }
+
+        $command->add($not ? '-not' : null)->cmd('(');
+
+        foreach ($paths as $i => $path) {
+            $expr = Expression::create($path);
+
+            // Find does not support expandable globs ("*.{a,b}" syntax).
+            if ($expr->isGlob() && $expr->getGlob()->isExpandable()) {
+                $expr = Expression::create($expr->getGlob()->toRegex(false));
+            }
+
+            // Fixes 'not search' regex problems.
+            if ($expr->isRegex()) {
+                $regex = $expr->getRegex();
+                $regex->prepend($regex->hasStartFlag() ? preg_quote($dir).DIRECTORY_SEPARATOR : '.*')->setEndJoker(!$regex->hasEndFlag());
+            } else {
+                $expr->prepend('*')->append('*');
+            }
+
+            $command
+                ->add($i > 0 ? '-or' : null)
+                ->add($expr->isRegex()
+                    ? ($expr->isCaseSensitive() ? '-regex' : '-iregex')
+                    : ($expr->isCaseSensitive() ? '-path' : '-ipath')
+                )
+                ->arg($expr->renderPattern());
+        }
+
+        $command->cmd(')');
+    }
+
+    /**
+     * @param Command            $command
+     * @param NumberComparator[] $sizes
+     */
+    private function buildSizesFiltering(Command $command, array $sizes)
+    {
+        foreach ($sizes as $i => $size) {
+            $command->add($i > 0 ? '-and' : null);
+
+            switch ($size->getOperator()) {
+                case '<=':
+                    $command->add('-size -'.($size->getTarget() + 1).'c');
+                    break;
+                case '>=':
+                    $command->add('-size +'.($size->getTarget() - 1).'c');
+                    break;
+                case '>':
+                    $command->add('-size +'.$size->getTarget().'c');
+                    break;
+                case '!=':
+                    $command->add('-size -'.$size->getTarget().'c');
+                    $command->add('-size +'.$size->getTarget().'c');
+                    break;
+                case '<':
+                default:
+                    $command->add('-size -'.$size->getTarget().'c');
+            }
+        }
+    }
+
+    /**
+     * @param Command          $command
+     * @param DateComparator[] $dates
+     */
+    private function buildDatesFiltering(Command $command, array $dates)
+    {
+        foreach ($dates as $i => $date) {
+            $command->add($i > 0 ? '-and' : null);
+
+            $mins = (int) round((time() - $date->getTarget()) / 60);
+
+            if (0 > $mins) {
+                // mtime is in the future
+                $command->add(' -mmin -0');
+                // we will have no result so we don't need to continue
+                return;
+            }
+
+            switch ($date->getOperator()) {
+                case '<=':
+                    $command->add('-mmin +'.($mins - 1));
+                    break;
+                case '>=':
+                    $command->add('-mmin -'.($mins + 1));
+                    break;
+                case '>':
+                    $command->add('-mmin -'.$mins);
+                    break;
+                case '!=':
+                    $command->add('-mmin +'.$mins.' -or -mmin -'.$mins);
+                    break;
+                case '<':
+                default:
+                    $command->add('-mmin +'.$mins);
+            }
+        }
+    }
+
+    /**
+     * @param Command $command
+     * @param string  $sort
+     *
+     * @throws \InvalidArgumentException
+     */
+    private function buildSorting(Command $command, $sort)
+    {
+        $this->buildFormatSorting($command, $sort);
+    }
+
+    /**
+     * @param Command $command
+     * @param string  $sort
+     */
+    abstract protected function buildFormatSorting(Command $command, $sort);
+
+    /**
+     * @param Command $command
+     * @param array   $contains
+     * @param bool    $not
+     */
+    abstract protected function buildContentFiltering(Command $command, array $contains, $not = false);
+}
--- /dev/null
+++ b/vendor/symfony/finder/Adapter/AdapterInterface.php
@@ -0,0 +1,146 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Adapter;
+
+/**
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ *
+ * @deprecated since 2.8, to be removed in 3.0.
+ */
+interface AdapterInterface
+{
+    /**
+     * @param bool $followLinks
+     *
+     * @return AdapterInterface Current instance
+     */
+    public function setFollowLinks($followLinks);
+
+    /**
+     * @param int $mode
+     *
+     * @return AdapterInterface Current instance
+     */
+    public function setMode($mode);
+
+    /**
+     * @param array $exclude
+     *
+     * @return AdapterInterface Current instance
+     */
+    public function setExclude(array $exclude);
+
+    /**
+     * @param array $depths
+     *
+     * @return AdapterInterface Current instance
+     */
+    public function setDepths(array $depths);
+
+    /**
+     * @param array $names
+     *
+     * @return AdapterInterface Current instance
+     */
+    public function setNames(array $names);
+
+    /**
+     * @param array $notNames
+     *
+     * @return AdapterInterface Current instance
+     */
+    public function setNotNames(array $notNames);
+
+    /**
+     * @param array $contains
+     *
+     * @return AdapterInterface Current instance
+     */
+    public function setContains(array $contains);
+
+    /**
+     * @param array $notContains
+     *
+     * @return AdapterInterface Current instance
+     */
+    public function setNotContains(array $notContains);
+
+    /**
+     * @param array $sizes
+     *
+     * @return AdapterInterface Current instance
+     */
+    public function setSizes(array $sizes);
+
+    /**
+     * @param array $dates
+     *
+     * @return AdapterInterface Current instance
+     */
+    public function setDates(array $dates);
+
+    /**
+     * @param array $filters
+     *
+     * @return AdapterInterface Current instance
+     */
+    public function setFilters(array $filters);
+
+    /**
+     * @param \Closure|int $sort
+     *
+     * @return AdapterInterface Current instance
+     */
+    public function setSort($sort);
+
+    /**
+     * @param array $paths
+     *
+     * @return AdapterInterface Current instance
+     */
+    public function setPath(array $paths);
+
+    /**
+     * @param array $notPaths
+     *
+     * @return AdapterInterface Current instance
+     */
+    public function setNotPath(array $notPaths);
+
+    /**
+     * @param bool $ignore
+     *
+     * @return AdapterInterface Current instance
+     */
+    public function ignoreUnreadableDirs($ignore = true);
+
+    /**
+     * @param string $dir
+     *
+     * @return \Iterator Result iterator
+     */
+    public function searchInDirectory($dir);
+
+    /**
+     * Tests adapter support for current platform.
+     *
+     * @return bool
+     */
+    public function isSupported();
+
+    /**
+     * Returns adapter name.
+     *
+     * @return string
+     */
+    public function getName();
+}
--- /dev/null
+++ b/vendor/symfony/finder/Adapter/BsdFindAdapter.php
@@ -0,0 +1,107 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Adapter;
+
+@trigger_error('The '.__NAMESPACE__.'\BsdFindAdapter class is deprecated since version 2.8 and will be removed in 3.0. Use directly the Finder class instead.', E_USER_DEPRECATED);
+
+use Symfony\Component\Finder\Shell\Shell;
+use Symfony\Component\Finder\Shell\Command;
+use Symfony\Component\Finder\Iterator\SortableIterator;
+use Symfony\Component\Finder\Expression\Expression;
+
+/**
+ * Shell engine implementation using BSD find command.
+ *
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ *
+ * @deprecated since 2.8, to be removed in 3.0. Use Finder instead.
+ */
+class BsdFindAdapter extends AbstractFindAdapter
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'bsd_find';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function canBeUsed()
+    {
+        return in_array($this->shell->getType(), array(Shell::TYPE_BSD, Shell::TYPE_DARWIN)) && parent::canBeUsed();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function buildFormatSorting(Command $command, $sort)
+    {
+        switch ($sort) {
+            case SortableIterator::SORT_BY_NAME:
+                $command->ins('sort')->add('| sort');
+
+                return;
+            case SortableIterator::SORT_BY_TYPE:
+                $format = '%HT';
+                break;
+            case SortableIterator::SORT_BY_ACCESSED_TIME:
+                $format = '%a';
+                break;
+            case SortableIterator::SORT_BY_CHANGED_TIME:
+                $format = '%c';
+                break;
+            case SortableIterator::SORT_BY_MODIFIED_TIME:
+                $format = '%m';
+                break;
+            default:
+                throw new \InvalidArgumentException(sprintf('Unknown sort options: %s.', $sort));
+        }
+
+        $command
+            ->add('-print0 | xargs -0 stat -f')
+            ->arg($format.'%t%N')
+            ->add('| sort | cut -f 2');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function buildFindCommand(Command $command, $dir)
+    {
+        parent::buildFindCommand($command, $dir)->addAtIndex('-E', 1);
+
+        return $command;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function buildContentFiltering(Command $command, array $contains, $not = false)
+    {
+        foreach ($contains as $contain) {
+            $expr = Expression::create($contain);
+
+            // todo: avoid forking process for each $pattern by using multiple -e options
+            $command
+                ->add('| grep -v \'^$\'')
+                ->add('| xargs -I{} grep -I')
+                ->add($expr->isCaseSensitive() ? null : '-i')
+                ->add($not ? '-L' : '-l')
+                ->add('-Ee')->arg($expr->renderPattern())
+                ->add('{}')
+            ;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Adapter/GnuFindAdapter.php
@@ -0,0 +1,108 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Adapter;
+
+@trigger_error('The '.__NAMESPACE__.'\GnuFindAdapter class is deprecated since version 2.8 and will be removed in 3.0. Use directly the Finder class instead.', E_USER_DEPRECATED);
+
+use Symfony\Component\Finder\Shell\Shell;
+use Symfony\Component\Finder\Shell\Command;
+use Symfony\Component\Finder\Iterator\SortableIterator;
+use Symfony\Component\Finder\Expression\Expression;
+
+/**
+ * Shell engine implementation using GNU find command.
+ *
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ *
+ * @deprecated since 2.8, to be removed in 3.0. Use Finder instead.
+ */
+class GnuFindAdapter extends AbstractFindAdapter
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'gnu_find';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function buildFormatSorting(Command $command, $sort)
+    {
+        switch ($sort) {
+            case SortableIterator::SORT_BY_NAME:
+                $command->ins('sort')->add('| sort');
+
+                return;
+            case SortableIterator::SORT_BY_TYPE:
+                $format = '%y';
+                break;
+            case SortableIterator::SORT_BY_ACCESSED_TIME:
+                $format = '%A@';
+                break;
+            case SortableIterator::SORT_BY_CHANGED_TIME:
+                $format = '%C@';
+                break;
+            case SortableIterator::SORT_BY_MODIFIED_TIME:
+                $format = '%T@';
+                break;
+            default:
+                throw new \InvalidArgumentException(sprintf('Unknown sort options: %s.', $sort));
+        }
+
+        $command
+            ->get('find')
+            ->add('-printf')
+            ->arg($format.' %h/%f\\n')
+            ->add('| sort | cut')
+            ->arg('-d ')
+            ->arg('-f2-')
+        ;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function canBeUsed()
+    {
+        return $this->shell->getType() === Shell::TYPE_UNIX && parent::canBeUsed();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function buildFindCommand(Command $command, $dir)
+    {
+        return parent::buildFindCommand($command, $dir)->add('-regextype posix-extended');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function buildContentFiltering(Command $command, array $contains, $not = false)
+    {
+        foreach ($contains as $contain) {
+            $expr = Expression::create($contain);
+
+            // todo: avoid forking process for each $pattern by using multiple -e options
+            $command
+                ->add('| xargs -I{} -r grep -I')
+                ->add($expr->isCaseSensitive() ? null : '-i')
+                ->add($not ? '-L' : '-l')
+                ->add('-Ee')->arg($expr->renderPattern())
+                ->add('{}')
+            ;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Adapter/PhpAdapter.php
@@ -0,0 +1,101 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Adapter;
+
+@trigger_error('The '.__NAMESPACE__.'\PhpAdapter class is deprecated since version 2.8 and will be removed in 3.0. Use directly the Finder class instead.', E_USER_DEPRECATED);
+
+use Symfony\Component\Finder\Iterator;
+
+/**
+ * PHP finder engine implementation.
+ *
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ *
+ * @deprecated since 2.8, to be removed in 3.0. Use Finder instead.
+ */
+class PhpAdapter extends AbstractAdapter
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function searchInDirectory($dir)
+    {
+        $flags = \RecursiveDirectoryIterator::SKIP_DOTS;
+
+        if ($this->followLinks) {
+            $flags |= \RecursiveDirectoryIterator::FOLLOW_SYMLINKS;
+        }
+
+        $iterator = new Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs);
+
+        if ($this->exclude) {
+            $iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $this->exclude);
+        }
+
+        $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST);
+
+        if ($this->minDepth > 0 || $this->maxDepth < PHP_INT_MAX) {
+            $iterator = new Iterator\DepthRangeFilterIterator($iterator, $this->minDepth, $this->maxDepth);
+        }
+
+        if ($this->mode) {
+            $iterator = new Iterator\FileTypeFilterIterator($iterator, $this->mode);
+        }
+
+        if ($this->names || $this->notNames) {
+            $iterator = new Iterator\FilenameFilterIterator($iterator, $this->names, $this->notNames);
+        }
+
+        if ($this->contains || $this->notContains) {
+            $iterator = new Iterator\FilecontentFilterIterator($iterator, $this->contains, $this->notContains);
+        }
+
+        if ($this->sizes) {
+            $iterator = new Iterator\SizeRangeFilterIterator($iterator, $this->sizes);
+        }
+
+        if ($this->dates) {
+            $iterator = new Iterator\DateRangeFilterIterator($iterator, $this->dates);
+        }
+
+        if ($this->filters) {
+            $iterator = new Iterator\CustomFilterIterator($iterator, $this->filters);
+        }
+
+        if ($this->paths || $this->notPaths) {
+            $iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $this->notPaths);
+        }
+
+        if ($this->sort) {
+            $iteratorAggregate = new Iterator\SortableIterator($iterator, $this->sort);
+            $iterator = $iteratorAggregate->getIterator();
+        }
+
+        return $iterator;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'php';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function canBeUsed()
+    {
+        return true;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Comparator/Comparator.php
@@ -0,0 +1,98 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Comparator;
+
+/**
+ * Comparator.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Comparator
+{
+    private $target;
+    private $operator = '==';
+
+    /**
+     * Gets the target value.
+     *
+     * @return string The target value
+     */
+    public function getTarget()
+    {
+        return $this->target;
+    }
+
+    /**
+     * Sets the target value.
+     *
+     * @param string $target The target value
+     */
+    public function setTarget($target)
+    {
+        $this->target = $target;
+    }
+
+    /**
+     * Gets the comparison operator.
+     *
+     * @return string The operator
+     */
+    public function getOperator()
+    {
+        return $this->operator;
+    }
+
+    /**
+     * Sets the comparison operator.
+     *
+     * @param string $operator A valid operator
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function setOperator($operator)
+    {
+        if (!$operator) {
+            $operator = '==';
+        }
+
+        if (!in_array($operator, array('>', '<', '>=', '<=', '==', '!='))) {
+            throw new \InvalidArgumentException(sprintf('Invalid operator "%s".', $operator));
+        }
+
+        $this->operator = $operator;
+    }
+
+    /**
+     * Tests against the target.
+     *
+     * @param mixed $test A test value
+     *
+     * @return bool
+     */
+    public function test($test)
+    {
+        switch ($this->operator) {
+            case '>':
+                return $test > $this->target;
+            case '>=':
+                return $test >= $this->target;
+            case '<':
+                return $test < $this->target;
+            case '<=':
+                return $test <= $this->target;
+            case '!=':
+                return $test != $this->target;
+        }
+
+        return $test == $this->target;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Comparator/DateComparator.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Comparator;
+
+/**
+ * DateCompare compiles date comparisons.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class DateComparator extends Comparator
+{
+    /**
+     * Constructor.
+     *
+     * @param string $test A comparison string
+     *
+     * @throws \InvalidArgumentException If the test is not understood
+     */
+    public function __construct($test)
+    {
+        if (!preg_match('#^\s*(==|!=|[<>]=?|after|since|before|until)?\s*(.+?)\s*$#i', $test, $matches)) {
+            throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a date test.', $test));
+        }
+
+        try {
+            $date = new \DateTime($matches[2]);
+            $target = $date->format('U');
+        } catch (\Exception $e) {
+            throw new \InvalidArgumentException(sprintf('"%s" is not a valid date.', $matches[2]));
+        }
+
+        $operator = isset($matches[1]) ? $matches[1] : '==';
+        if ('since' === $operator || 'after' === $operator) {
+            $operator = '>';
+        }
+
+        if ('until' === $operator || 'before' === $operator) {
+            $operator = '<';
+        }
+
+        $this->setOperator($operator);
+        $this->setTarget($target);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Comparator/NumberComparator.php
@@ -0,0 +1,81 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Comparator;
+
+/**
+ * NumberComparator compiles a simple comparison to an anonymous
+ * subroutine, which you can call with a value to be tested again.
+ *
+ * Now this would be very pointless, if NumberCompare didn't understand
+ * magnitudes.
+ *
+ * The target value may use magnitudes of kilobytes (k, ki),
+ * megabytes (m, mi), or gigabytes (g, gi).  Those suffixed
+ * with an i use the appropriate 2**n version in accordance with the
+ * IEC standard: http://physics.nist.gov/cuu/Units/binary.html
+ *
+ * Based on the Perl Number::Compare module.
+ *
+ * @author    Fabien Potencier <fabien@symfony.com> PHP port
+ * @author    Richard Clamp <richardc@unixbeard.net> Perl version
+ * @copyright 2004-2005 Fabien Potencier <fabien@symfony.com>
+ * @copyright 2002 Richard Clamp <richardc@unixbeard.net>
+ *
+ * @see http://physics.nist.gov/cuu/Units/binary.html
+ */
+class NumberComparator extends Comparator
+{
+    /**
+     * Constructor.
+     *
+     * @param string $test A comparison string
+     *
+     * @throws \InvalidArgumentException If the test is not understood
+     */
+    public function __construct($test)
+    {
+        if (!preg_match('#^\s*(==|!=|[<>]=?)?\s*([0-9\.]+)\s*([kmg]i?)?\s*$#i', $test, $matches)) {
+            throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a number test.', $test));
+        }
+
+        $target = $matches[2];
+        if (!is_numeric($target)) {
+            throw new \InvalidArgumentException(sprintf('Invalid number "%s".', $target));
+        }
+        if (isset($matches[3])) {
+            // magnitude
+            switch (strtolower($matches[3])) {
+                case 'k':
+                    $target *= 1000;
+                    break;
+                case 'ki':
+                    $target *= 1024;
+                    break;
+                case 'm':
+                    $target *= 1000000;
+                    break;
+                case 'mi':
+                    $target *= 1024 * 1024;
+                    break;
+                case 'g':
+                    $target *= 1000000000;
+                    break;
+                case 'gi':
+                    $target *= 1024 * 1024 * 1024;
+                    break;
+            }
+        }
+
+        $this->setTarget($target);
+        $this->setOperator(isset($matches[1]) ? $matches[1] : '==');
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Exception/AccessDeniedException.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Exception;
+
+/**
+ * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ */
+class AccessDeniedException extends \UnexpectedValueException
+{
+}
--- /dev/null
+++ b/vendor/symfony/finder/Exception/AdapterFailureException.php
@@ -0,0 +1,50 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Exception;
+
+@trigger_error('The '.__NAMESPACE__.'\AdapterFailureException class is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+use Symfony\Component\Finder\Adapter\AdapterInterface;
+
+/**
+ * Base exception for all adapter failures.
+ *
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ *
+ * @deprecated since 2.8, to be removed in 3.0.
+ */
+class AdapterFailureException extends \RuntimeException implements ExceptionInterface
+{
+    /**
+     * @var \Symfony\Component\Finder\Adapter\AdapterInterface
+     */
+    private $adapter;
+
+    /**
+     * @param AdapterInterface $adapter
+     * @param string|null      $message
+     * @param \Exception|null  $previous
+     */
+    public function __construct(AdapterInterface $adapter, $message = null, \Exception $previous = null)
+    {
+        $this->adapter = $adapter;
+        parent::__construct($message ?: 'Search failed with "'.$adapter->getName().'" adapter.', $previous);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAdapter()
+    {
+        return $this->adapter;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Exception/ExceptionInterface.php
@@ -0,0 +1,23 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Exception;
+
+/**
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ */
+interface ExceptionInterface
+{
+    /**
+     * @return \Symfony\Component\Finder\Adapter\AdapterInterface
+     */
+    public function getAdapter();
+}
--- /dev/null
+++ b/vendor/symfony/finder/Exception/OperationNotPermitedException.php
@@ -0,0 +1,23 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Exception;
+
+@trigger_error('The '.__NAMESPACE__.'\OperationNotPermitedException class is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+/**
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ *
+ * @deprecated since 2.8, to be removed in 3.0.
+ */
+class OperationNotPermitedException extends AdapterFailureException
+{
+}
--- /dev/null
+++ b/vendor/symfony/finder/Exception/ShellCommandFailureException.php
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Exception;
+
+@trigger_error('The '.__NAMESPACE__.'\ShellCommandFailureException class is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+use Symfony\Component\Finder\Adapter\AdapterInterface;
+use Symfony\Component\Finder\Shell\Command;
+
+/**
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ *
+ * @deprecated since 2.8, to be removed in 3.0.
+ */
+class ShellCommandFailureException extends AdapterFailureException
+{
+    /**
+     * @var Command
+     */
+    private $command;
+
+    /**
+     * @param AdapterInterface $adapter
+     * @param Command          $command
+     * @param \Exception|null  $previous
+     */
+    public function __construct(AdapterInterface $adapter, Command $command, \Exception $previous = null)
+    {
+        $this->command = $command;
+        parent::__construct($adapter, 'Shell command failed: "'.$command->join().'".', $previous);
+    }
+
+    /**
+     * @return Command
+     */
+    public function getCommand()
+    {
+        return $this->command;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Expression/Expression.php
@@ -0,0 +1,148 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Expression;
+
+@trigger_error('The '.__NAMESPACE__.'\Expression class is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+/**
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ */
+class Expression implements ValueInterface
+{
+    const TYPE_REGEX = 1;
+    const TYPE_GLOB = 2;
+
+    /**
+     * @var ValueInterface
+     */
+    private $value;
+
+    /**
+     * @param string $expr
+     *
+     * @return Expression
+     */
+    public static function create($expr)
+    {
+        return new self($expr);
+    }
+
+    /**
+     * @param string $expr
+     */
+    public function __construct($expr)
+    {
+        try {
+            $this->value = Regex::create($expr);
+        } catch (\InvalidArgumentException $e) {
+            $this->value = new Glob($expr);
+        }
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->render();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function render()
+    {
+        return $this->value->render();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function renderPattern()
+    {
+        return $this->value->renderPattern();
+    }
+
+    /**
+     * @return bool
+     */
+    public function isCaseSensitive()
+    {
+        return $this->value->isCaseSensitive();
+    }
+
+    /**
+     * @return int
+     */
+    public function getType()
+    {
+        return $this->value->getType();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prepend($expr)
+    {
+        $this->value->prepend($expr);
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function append($expr)
+    {
+        $this->value->append($expr);
+
+        return $this;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isRegex()
+    {
+        return self::TYPE_REGEX === $this->value->getType();
+    }
+
+    /**
+     * @return bool
+     */
+    public function isGlob()
+    {
+        return self::TYPE_GLOB === $this->value->getType();
+    }
+
+    /**
+     * @return Glob
+     *
+     * @throws \LogicException
+     */
+    public function getGlob()
+    {
+        if (self::TYPE_GLOB !== $this->value->getType()) {
+            throw new \LogicException('Regex can\'t be transformed to glob.');
+        }
+
+        return $this->value;
+    }
+
+    /**
+     * @return Regex
+     */
+    public function getRegex()
+    {
+        return self::TYPE_REGEX === $this->value->getType() ? $this->value : $this->value->toRegex();
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Expression/Glob.php
@@ -0,0 +1,111 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Expression;
+
+@trigger_error('The '.__NAMESPACE__.'\Glob class is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+use Symfony\Component\Finder\Glob as FinderGlob;
+
+/**
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ */
+class Glob implements ValueInterface
+{
+    /**
+     * @var string
+     */
+    private $pattern;
+
+    /**
+     * @param string $pattern
+     */
+    public function __construct($pattern)
+    {
+        $this->pattern = $pattern;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function render()
+    {
+        return $this->pattern;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function renderPattern()
+    {
+        return $this->pattern;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getType()
+    {
+        return Expression::TYPE_GLOB;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isCaseSensitive()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prepend($expr)
+    {
+        $this->pattern = $expr.$this->pattern;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function append($expr)
+    {
+        $this->pattern .= $expr;
+
+        return $this;
+    }
+
+    /**
+     * Tests if glob is expandable ("*.{a,b}" syntax).
+     *
+     * @return bool
+     */
+    public function isExpandable()
+    {
+        return false !== strpos($this->pattern, '{')
+            && false !== strpos($this->pattern, '}');
+    }
+
+    /**
+     * @param bool $strictLeadingDot
+     * @param bool $strictWildcardSlash
+     *
+     * @return Regex
+     */
+    public function toRegex($strictLeadingDot = true, $strictWildcardSlash = true)
+    {
+        $regex = FinderGlob::toRegex($this->pattern, $strictLeadingDot, $strictWildcardSlash, '');
+
+        return new Regex($regex);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Expression/Regex.php
@@ -0,0 +1,323 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Expression;
+
+@trigger_error('The '.__NAMESPACE__.'\Regex class is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+/**
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ */
+class Regex implements ValueInterface
+{
+    const START_FLAG = '^';
+    const END_FLAG = '$';
+    const BOUNDARY = '~';
+    const JOKER = '.*';
+    const ESCAPING = '\\';
+
+    /**
+     * @var string
+     */
+    private $pattern;
+
+    /**
+     * @var array
+     */
+    private $options;
+
+    /**
+     * @var bool
+     */
+    private $startFlag;
+
+    /**
+     * @var bool
+     */
+    private $endFlag;
+
+    /**
+     * @var bool
+     */
+    private $startJoker;
+
+    /**
+     * @var bool
+     */
+    private $endJoker;
+
+    /**
+     * @param string $expr
+     *
+     * @return Regex
+     *
+     * @throws \InvalidArgumentException
+     */
+    public static function create($expr)
+    {
+        if (preg_match('/^(.{3,}?)([imsxuADU]*)$/', $expr, $m)) {
+            $start = substr($m[1], 0, 1);
+            $end = substr($m[1], -1);
+
+            if (
+                ($start === $end && !preg_match('/[*?[:alnum:] \\\\]/', $start))
+                || ($start === '{' && $end === '}')
+                || ($start === '(' && $end === ')')
+            ) {
+                return new self(substr($m[1], 1, -1), $m[2], $end);
+            }
+        }
+
+        throw new \InvalidArgumentException('Given expression is not a regex.');
+    }
+
+    /**
+     * @param string $pattern
+     * @param string $options
+     * @param string $delimiter
+     */
+    public function __construct($pattern, $options = '', $delimiter = null)
+    {
+        if (null !== $delimiter) {
+            // removes delimiter escaping
+            $pattern = str_replace('\\'.$delimiter, $delimiter, $pattern);
+        }
+
+        $this->parsePattern($pattern);
+        $this->options = $options;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->render();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function render()
+    {
+        return self::BOUNDARY
+            .$this->renderPattern()
+            .self::BOUNDARY
+            .$this->options;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function renderPattern()
+    {
+        return ($this->startFlag ? self::START_FLAG : '')
+            .($this->startJoker ? self::JOKER : '')
+            .str_replace(self::BOUNDARY, '\\'.self::BOUNDARY, $this->pattern)
+            .($this->endJoker ? self::JOKER : '')
+            .($this->endFlag ? self::END_FLAG : '');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isCaseSensitive()
+    {
+        return !$this->hasOption('i');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getType()
+    {
+        return Expression::TYPE_REGEX;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prepend($expr)
+    {
+        $this->pattern = $expr.$this->pattern;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function append($expr)
+    {
+        $this->pattern .= $expr;
+
+        return $this;
+    }
+
+    /**
+     * @param string $option
+     *
+     * @return bool
+     */
+    public function hasOption($option)
+    {
+        return false !== strpos($this->options, $option);
+    }
+
+    /**
+     * @param string $option
+     *
+     * @return Regex
+     */
+    public function addOption($option)
+    {
+        if (!$this->hasOption($option)) {
+            $this->options .= $option;
+        }
+
+        return $this;
+    }
+
+    /**
+     * @param string $option
+     *
+     * @return Regex
+     */
+    public function removeOption($option)
+    {
+        $this->options = str_replace($option, '', $this->options);
+
+        return $this;
+    }
+
+    /**
+     * @param bool $startFlag
+     *
+     * @return Regex
+     */
+    public function setStartFlag($startFlag)
+    {
+        $this->startFlag = $startFlag;
+
+        return $this;
+    }
+
+    /**
+     * @return bool
+     */
+    public function hasStartFlag()
+    {
+        return $this->startFlag;
+    }
+
+    /**
+     * @param bool $endFlag
+     *
+     * @return Regex
+     */
+    public function setEndFlag($endFlag)
+    {
+        $this->endFlag = (bool) $endFlag;
+
+        return $this;
+    }
+
+    /**
+     * @return bool
+     */
+    public function hasEndFlag()
+    {
+        return $this->endFlag;
+    }
+
+    /**
+     * @param bool $startJoker
+     *
+     * @return Regex
+     */
+    public function setStartJoker($startJoker)
+    {
+        $this->startJoker = $startJoker;
+
+        return $this;
+    }
+
+    /**
+     * @return bool
+     */
+    public function hasStartJoker()
+    {
+        return $this->startJoker;
+    }
+
+    /**
+     * @param bool $endJoker
+     *
+     * @return Regex
+     */
+    public function setEndJoker($endJoker)
+    {
+        $this->endJoker = (bool) $endJoker;
+
+        return $this;
+    }
+
+    /**
+     * @return bool
+     */
+    public function hasEndJoker()
+    {
+        return $this->endJoker;
+    }
+
+    /**
+     * @param array $replacement
+     *
+     * @return Regex
+     */
+    public function replaceJokers($replacement)
+    {
+        $replace = function ($subject) use ($replacement) {
+            $subject = $subject[0];
+            $replace = 0 === substr_count($subject, '\\') % 2;
+
+            return $replace ? str_replace('.', $replacement, $subject) : $subject;
+        };
+
+        $this->pattern = preg_replace_callback('~[\\\\]*\\.~', $replace, $this->pattern);
+
+        return $this;
+    }
+
+    /**
+     * @param string $pattern
+     */
+    private function parsePattern($pattern)
+    {
+        if ($this->startFlag = self::START_FLAG === substr($pattern, 0, 1)) {
+            $pattern = substr($pattern, 1);
+        }
+
+        if ($this->startJoker = self::JOKER === substr($pattern, 0, 2)) {
+            $pattern = substr($pattern, 2);
+        }
+
+        if ($this->endFlag = (self::END_FLAG === substr($pattern, -1) && self::ESCAPING !== substr($pattern, -2, -1))) {
+            $pattern = substr($pattern, 0, -1);
+        }
+
+        if ($this->endJoker = (self::JOKER === substr($pattern, -2) && self::ESCAPING !== substr($pattern, -3, -2))) {
+            $pattern = substr($pattern, 0, -2);
+        }
+
+        $this->pattern = $pattern;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Expression/ValueInterface.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Expression;
+
+@trigger_error('The '.__NAMESPACE__.'\ValueInterface interface is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+/**
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ */
+interface ValueInterface
+{
+    /**
+     * Renders string representation of expression.
+     *
+     * @return string
+     */
+    public function render();
+
+    /**
+     * Renders string representation of pattern.
+     *
+     * @return string
+     */
+    public function renderPattern();
+
+    /**
+     * Returns value case sensitivity.
+     *
+     * @return bool
+     */
+    public function isCaseSensitive();
+
+    /**
+     * Returns expression type.
+     *
+     * @return int
+     */
+    public function getType();
+
+    /**
+     * @param string $expr
+     *
+     * @return ValueInterface
+     */
+    public function prepend($expr);
+
+    /**
+     * @param string $expr
+     *
+     * @return ValueInterface
+     */
+    public function append($expr);
+}
--- /dev/null
+++ b/vendor/symfony/finder/Finder.php
@@ -0,0 +1,905 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder;
+
+use Symfony\Component\Finder\Adapter\AdapterInterface;
+use Symfony\Component\Finder\Adapter\GnuFindAdapter;
+use Symfony\Component\Finder\Adapter\BsdFindAdapter;
+use Symfony\Component\Finder\Adapter\PhpAdapter;
+use Symfony\Component\Finder\Comparator\DateComparator;
+use Symfony\Component\Finder\Comparator\NumberComparator;
+use Symfony\Component\Finder\Exception\ExceptionInterface;
+use Symfony\Component\Finder\Iterator\CustomFilterIterator;
+use Symfony\Component\Finder\Iterator\DateRangeFilterIterator;
+use Symfony\Component\Finder\Iterator\DepthRangeFilterIterator;
+use Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator;
+use Symfony\Component\Finder\Iterator\FilecontentFilterIterator;
+use Symfony\Component\Finder\Iterator\FilenameFilterIterator;
+use Symfony\Component\Finder\Iterator\SizeRangeFilterIterator;
+use Symfony\Component\Finder\Iterator\SortableIterator;
+
+/**
+ * Finder allows to build rules to find files and directories.
+ *
+ * It is a thin wrapper around several specialized iterator classes.
+ *
+ * All rules may be invoked several times.
+ *
+ * All methods return the current Finder object to allow easy chaining:
+ *
+ * $finder = Finder::create()->files()->name('*.php')->in(__DIR__);
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Finder implements \IteratorAggregate, \Countable
+{
+    const IGNORE_VCS_FILES = 1;
+    const IGNORE_DOT_FILES = 2;
+
+    private $mode = 0;
+    private $names = array();
+    private $notNames = array();
+    private $exclude = array();
+    private $filters = array();
+    private $depths = array();
+    private $sizes = array();
+    private $followLinks = false;
+    private $sort = false;
+    private $ignore = 0;
+    private $dirs = array();
+    private $dates = array();
+    private $iterators = array();
+    private $contains = array();
+    private $notContains = array();
+    private $adapters = null;
+    private $paths = array();
+    private $notPaths = array();
+    private $ignoreUnreadableDirs = false;
+
+    private static $vcsPatterns = array('.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg');
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        $this->ignore = static::IGNORE_VCS_FILES | static::IGNORE_DOT_FILES;
+    }
+
+    /**
+     * Creates a new Finder.
+     *
+     * @return Finder A new Finder instance
+     */
+    public static function create()
+    {
+        return new static();
+    }
+
+    /**
+     * Registers a finder engine implementation.
+     *
+     * @param AdapterInterface $adapter  An adapter instance
+     * @param int              $priority Highest is selected first
+     *
+     * @return Finder The current Finder instance
+     *
+     * @deprecated since 2.8, to be removed in 3.0.
+     */
+    public function addAdapter(AdapterInterface $adapter, $priority = 0)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        $this->initDefaultAdapters();
+
+        $this->adapters[$adapter->getName()] = array(
+            'adapter' => $adapter,
+            'priority' => $priority,
+            'selected' => false,
+        );
+
+        return $this->sortAdapters();
+    }
+
+    /**
+     * Sets the selected adapter to the best one according to the current platform the code is run on.
+     *
+     * @return Finder The current Finder instance
+     *
+     * @deprecated since 2.8, to be removed in 3.0.
+     */
+    public function useBestAdapter()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        $this->initDefaultAdapters();
+
+        $this->resetAdapterSelection();
+
+        return $this->sortAdapters();
+    }
+
+    /**
+     * Selects the adapter to use.
+     *
+     * @param string $name
+     *
+     * @return Finder The current Finder instance
+     *
+     * @throws \InvalidArgumentException
+     *
+     * @deprecated since 2.8, to be removed in 3.0.
+     */
+    public function setAdapter($name)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        $this->initDefaultAdapters();
+
+        if (!isset($this->adapters[$name])) {
+            throw new \InvalidArgumentException(sprintf('Adapter "%s" does not exist.', $name));
+        }
+
+        $this->resetAdapterSelection();
+        $this->adapters[$name]['selected'] = true;
+
+        return $this->sortAdapters();
+    }
+
+    /**
+     * Removes all adapters registered in the finder.
+     *
+     * @return Finder The current Finder instance
+     *
+     * @deprecated since 2.8, to be removed in 3.0.
+     */
+    public function removeAdapters()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        $this->adapters = array();
+
+        return $this;
+    }
+
+    /**
+     * Returns registered adapters ordered by priority without extra information.
+     *
+     * @return AdapterInterface[]
+     *
+     * @deprecated since 2.8, to be removed in 3.0.
+     */
+    public function getAdapters()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        $this->initDefaultAdapters();
+
+        return array_values(array_map(function (array $adapter) {
+            return $adapter['adapter'];
+        }, $this->adapters));
+    }
+
+    /**
+     * Restricts the matching to directories only.
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     */
+    public function directories()
+    {
+        $this->mode = Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES;
+
+        return $this;
+    }
+
+    /**
+     * Restricts the matching to files only.
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     */
+    public function files()
+    {
+        $this->mode = Iterator\FileTypeFilterIterator::ONLY_FILES;
+
+        return $this;
+    }
+
+    /**
+     * Adds tests for the directory depth.
+     *
+     * Usage:
+     *
+     *   $finder->depth('> 1') // the Finder will start matching at level 1.
+     *   $finder->depth('< 3') // the Finder will descend at most 3 levels of directories below the starting point.
+     *
+     * @param int $level The depth level expression
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see DepthRangeFilterIterator
+     * @see NumberComparator
+     */
+    public function depth($level)
+    {
+        $this->depths[] = new Comparator\NumberComparator($level);
+
+        return $this;
+    }
+
+    /**
+     * Adds tests for file dates (last modified).
+     *
+     * The date must be something that strtotime() is able to parse:
+     *
+     *   $finder->date('since yesterday');
+     *   $finder->date('until 2 days ago');
+     *   $finder->date('> now - 2 hours');
+     *   $finder->date('>= 2005-10-15');
+     *
+     * @param string $date A date range string
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see strtotime
+     * @see DateRangeFilterIterator
+     * @see DateComparator
+     */
+    public function date($date)
+    {
+        $this->dates[] = new Comparator\DateComparator($date);
+
+        return $this;
+    }
+
+    /**
+     * Adds rules that files must match.
+     *
+     * You can use patterns (delimited with / sign), globs or simple strings.
+     *
+     * $finder->name('*.php')
+     * $finder->name('/\.php$/') // same as above
+     * $finder->name('test.php')
+     *
+     * @param string $pattern A pattern (a regexp, a glob, or a string)
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see FilenameFilterIterator
+     */
+    public function name($pattern)
+    {
+        $this->names[] = $pattern;
+
+        return $this;
+    }
+
+    /**
+     * Adds rules that files must not match.
+     *
+     * @param string $pattern A pattern (a regexp, a glob, or a string)
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see FilenameFilterIterator
+     */
+    public function notName($pattern)
+    {
+        $this->notNames[] = $pattern;
+
+        return $this;
+    }
+
+    /**
+     * Adds tests that file contents must match.
+     *
+     * Strings or PCRE patterns can be used:
+     *
+     * $finder->contains('Lorem ipsum')
+     * $finder->contains('/Lorem ipsum/i')
+     *
+     * @param string $pattern A pattern (string or regexp)
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see FilecontentFilterIterator
+     */
+    public function contains($pattern)
+    {
+        $this->contains[] = $pattern;
+
+        return $this;
+    }
+
+    /**
+     * Adds tests that file contents must not match.
+     *
+     * Strings or PCRE patterns can be used:
+     *
+     * $finder->notContains('Lorem ipsum')
+     * $finder->notContains('/Lorem ipsum/i')
+     *
+     * @param string $pattern A pattern (string or regexp)
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see FilecontentFilterIterator
+     */
+    public function notContains($pattern)
+    {
+        $this->notContains[] = $pattern;
+
+        return $this;
+    }
+
+    /**
+     * Adds rules that filenames must match.
+     *
+     * You can use patterns (delimited with / sign) or simple strings.
+     *
+     * $finder->path('some/special/dir')
+     * $finder->path('/some\/special\/dir/') // same as above
+     *
+     * Use only / as dirname separator.
+     *
+     * @param string $pattern A pattern (a regexp or a string)
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see FilenameFilterIterator
+     */
+    public function path($pattern)
+    {
+        $this->paths[] = $pattern;
+
+        return $this;
+    }
+
+    /**
+     * Adds rules that filenames must not match.
+     *
+     * You can use patterns (delimited with / sign) or simple strings.
+     *
+     * $finder->notPath('some/special/dir')
+     * $finder->notPath('/some\/special\/dir/') // same as above
+     *
+     * Use only / as dirname separator.
+     *
+     * @param string $pattern A pattern (a regexp or a string)
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see FilenameFilterIterator
+     */
+    public function notPath($pattern)
+    {
+        $this->notPaths[] = $pattern;
+
+        return $this;
+    }
+
+    /**
+     * Adds tests for file sizes.
+     *
+     * $finder->size('> 10K');
+     * $finder->size('<= 1Ki');
+     * $finder->size(4);
+     *
+     * @param string $size A size range string
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see SizeRangeFilterIterator
+     * @see NumberComparator
+     */
+    public function size($size)
+    {
+        $this->sizes[] = new Comparator\NumberComparator($size);
+
+        return $this;
+    }
+
+    /**
+     * Excludes directories.
+     *
+     * @param string|array $dirs A directory path or an array of directories
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see ExcludeDirectoryFilterIterator
+     */
+    public function exclude($dirs)
+    {
+        $this->exclude = array_merge($this->exclude, (array) $dirs);
+
+        return $this;
+    }
+
+    /**
+     * Excludes "hidden" directories and files (starting with a dot).
+     *
+     * @param bool $ignoreDotFiles Whether to exclude "hidden" files or not
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see ExcludeDirectoryFilterIterator
+     */
+    public function ignoreDotFiles($ignoreDotFiles)
+    {
+        if ($ignoreDotFiles) {
+            $this->ignore |= static::IGNORE_DOT_FILES;
+        } else {
+            $this->ignore &= ~static::IGNORE_DOT_FILES;
+        }
+
+        return $this;
+    }
+
+    /**
+     * Forces the finder to ignore version control directories.
+     *
+     * @param bool $ignoreVCS Whether to exclude VCS files or not
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see ExcludeDirectoryFilterIterator
+     */
+    public function ignoreVCS($ignoreVCS)
+    {
+        if ($ignoreVCS) {
+            $this->ignore |= static::IGNORE_VCS_FILES;
+        } else {
+            $this->ignore &= ~static::IGNORE_VCS_FILES;
+        }
+
+        return $this;
+    }
+
+    /**
+     * Adds VCS patterns.
+     *
+     * @see ignoreVCS()
+     *
+     * @param string|string[] $pattern VCS patterns to ignore
+     */
+    public static function addVCSPattern($pattern)
+    {
+        foreach ((array) $pattern as $p) {
+            self::$vcsPatterns[] = $p;
+        }
+
+        self::$vcsPatterns = array_unique(self::$vcsPatterns);
+    }
+
+    /**
+     * Sorts files and directories by an anonymous function.
+     *
+     * The anonymous function receives two \SplFileInfo instances to compare.
+     *
+     * This can be slow as all the matching files and directories must be retrieved for comparison.
+     *
+     * @param \Closure $closure An anonymous function
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see SortableIterator
+     */
+    public function sort(\Closure $closure)
+    {
+        $this->sort = $closure;
+
+        return $this;
+    }
+
+    /**
+     * Sorts files and directories by name.
+     *
+     * This can be slow as all the matching files and directories must be retrieved for comparison.
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see SortableIterator
+     */
+    public function sortByName()
+    {
+        $this->sort = Iterator\SortableIterator::SORT_BY_NAME;
+
+        return $this;
+    }
+
+    /**
+     * Sorts files and directories by type (directories before files), then by name.
+     *
+     * This can be slow as all the matching files and directories must be retrieved for comparison.
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see SortableIterator
+     */
+    public function sortByType()
+    {
+        $this->sort = Iterator\SortableIterator::SORT_BY_TYPE;
+
+        return $this;
+    }
+
+    /**
+     * Sorts files and directories by the last accessed time.
+     *
+     * This is the time that the file was last accessed, read or written to.
+     *
+     * This can be slow as all the matching files and directories must be retrieved for comparison.
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see SortableIterator
+     */
+    public function sortByAccessedTime()
+    {
+        $this->sort = Iterator\SortableIterator::SORT_BY_ACCESSED_TIME;
+
+        return $this;
+    }
+
+    /**
+     * Sorts files and directories by the last inode changed time.
+     *
+     * This is the time that the inode information was last modified (permissions, owner, group or other metadata).
+     *
+     * On Windows, since inode is not available, changed time is actually the file creation time.
+     *
+     * This can be slow as all the matching files and directories must be retrieved for comparison.
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see SortableIterator
+     */
+    public function sortByChangedTime()
+    {
+        $this->sort = Iterator\SortableIterator::SORT_BY_CHANGED_TIME;
+
+        return $this;
+    }
+
+    /**
+     * Sorts files and directories by the last modified time.
+     *
+     * This is the last time the actual contents of the file were last modified.
+     *
+     * This can be slow as all the matching files and directories must be retrieved for comparison.
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see SortableIterator
+     */
+    public function sortByModifiedTime()
+    {
+        $this->sort = Iterator\SortableIterator::SORT_BY_MODIFIED_TIME;
+
+        return $this;
+    }
+
+    /**
+     * Filters the iterator with an anonymous function.
+     *
+     * The anonymous function receives a \SplFileInfo and must return false
+     * to remove files.
+     *
+     * @param \Closure $closure An anonymous function
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @see CustomFilterIterator
+     */
+    public function filter(\Closure $closure)
+    {
+        $this->filters[] = $closure;
+
+        return $this;
+    }
+
+    /**
+     * Forces the following of symlinks.
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     */
+    public function followLinks()
+    {
+        $this->followLinks = true;
+
+        return $this;
+    }
+
+    /**
+     * Tells finder to ignore unreadable directories.
+     *
+     * By default, scanning unreadable directories content throws an AccessDeniedException.
+     *
+     * @param bool $ignore
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     */
+    public function ignoreUnreadableDirs($ignore = true)
+    {
+        $this->ignoreUnreadableDirs = (bool) $ignore;
+
+        return $this;
+    }
+
+    /**
+     * Searches files and directories which match defined rules.
+     *
+     * @param string|array $dirs A directory path or an array of directories
+     *
+     * @return Finder|SplFileInfo[] The current Finder instance
+     *
+     * @throws \InvalidArgumentException if one of the directories does not exist
+     */
+    public function in($dirs)
+    {
+        $resolvedDirs = array();
+
+        foreach ((array) $dirs as $dir) {
+            if (is_dir($dir)) {
+                $resolvedDirs[] = $dir;
+            } elseif ($glob = glob($dir, (defined('GLOB_BRACE') ? GLOB_BRACE : 0) | GLOB_ONLYDIR)) {
+                $resolvedDirs = array_merge($resolvedDirs, $glob);
+            } else {
+                throw new \InvalidArgumentException(sprintf('The "%s" directory does not exist.', $dir));
+            }
+        }
+
+        $this->dirs = array_merge($this->dirs, $resolvedDirs);
+
+        return $this;
+    }
+
+    /**
+     * Returns an Iterator for the current Finder configuration.
+     *
+     * This method implements the IteratorAggregate interface.
+     *
+     * @return \Iterator|SplFileInfo[] An iterator
+     *
+     * @throws \LogicException if the in() method has not been called
+     */
+    public function getIterator()
+    {
+        if (0 === count($this->dirs) && 0 === count($this->iterators)) {
+            throw new \LogicException('You must call one of in() or append() methods before iterating over a Finder.');
+        }
+
+        if (1 === count($this->dirs) && 0 === count($this->iterators)) {
+            return $this->searchInDirectory($this->dirs[0]);
+        }
+
+        $iterator = new \AppendIterator();
+        foreach ($this->dirs as $dir) {
+            $iterator->append($this->searchInDirectory($dir));
+        }
+
+        foreach ($this->iterators as $it) {
+            $iterator->append($it);
+        }
+
+        return $iterator;
+    }
+
+    /**
+     * Appends an existing set of files/directories to the finder.
+     *
+     * The set can be another Finder, an Iterator, an IteratorAggregate, or even a plain array.
+     *
+     * @param mixed $iterator
+     *
+     * @return Finder|SplFileInfo[] The finder
+     *
+     * @throws \InvalidArgumentException When the given argument is not iterable.
+     */
+    public function append($iterator)
+    {
+        if ($iterator instanceof \IteratorAggregate) {
+            $this->iterators[] = $iterator->getIterator();
+        } elseif ($iterator instanceof \Iterator) {
+            $this->iterators[] = $iterator;
+        } elseif ($iterator instanceof \Traversable || is_array($iterator)) {
+            $it = new \ArrayIterator();
+            foreach ($iterator as $file) {
+                $it->append($file instanceof \SplFileInfo ? $file : new \SplFileInfo($file));
+            }
+            $this->iterators[] = $it;
+        } else {
+            throw new \InvalidArgumentException('Finder::append() method wrong argument type.');
+        }
+
+        return $this;
+    }
+
+    /**
+     * Counts all the results collected by the iterators.
+     *
+     * @return int
+     */
+    public function count()
+    {
+        return iterator_count($this->getIterator());
+    }
+
+    /**
+     * @return Finder The current Finder instance
+     */
+    private function sortAdapters()
+    {
+        uasort($this->adapters, function (array $a, array $b) {
+            if ($a['selected'] || $b['selected']) {
+                return $a['selected'] ? -1 : 1;
+            }
+
+            return $a['priority'] > $b['priority'] ? -1 : 1;
+        });
+
+        return $this;
+    }
+
+    /**
+     * @param $dir
+     *
+     * @return \Iterator
+     */
+    private function searchInDirectory($dir)
+    {
+        if (static::IGNORE_VCS_FILES === (static::IGNORE_VCS_FILES & $this->ignore)) {
+            $this->exclude = array_merge($this->exclude, self::$vcsPatterns);
+        }
+
+        if (static::IGNORE_DOT_FILES === (static::IGNORE_DOT_FILES & $this->ignore)) {
+            $this->notPaths[] = '#(^|/)\..+(/|$)#';
+        }
+
+        if ($this->adapters) {
+            foreach ($this->adapters as $adapter) {
+                if ($adapter['adapter']->isSupported()) {
+                    try {
+                        return $this
+                            ->buildAdapter($adapter['adapter'])
+                            ->searchInDirectory($dir);
+                    } catch (ExceptionInterface $e) {
+                    }
+                }
+            }
+        }
+
+        $minDepth = 0;
+        $maxDepth = PHP_INT_MAX;
+
+        foreach ($this->depths as $comparator) {
+            switch ($comparator->getOperator()) {
+                case '>':
+                    $minDepth = $comparator->getTarget() + 1;
+                    break;
+                case '>=':
+                    $minDepth = $comparator->getTarget();
+                    break;
+                case '<':
+                    $maxDepth = $comparator->getTarget() - 1;
+                    break;
+                case '<=':
+                    $maxDepth = $comparator->getTarget();
+                    break;
+                default:
+                    $minDepth = $maxDepth = $comparator->getTarget();
+            }
+        }
+
+        $flags = \RecursiveDirectoryIterator::SKIP_DOTS;
+
+        if ($this->followLinks) {
+            $flags |= \RecursiveDirectoryIterator::FOLLOW_SYMLINKS;
+        }
+
+        $iterator = new Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs);
+
+        if ($this->exclude) {
+            $iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $this->exclude);
+        }
+
+        $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST);
+
+        if ($minDepth > 0 || $maxDepth < PHP_INT_MAX) {
+            $iterator = new Iterator\DepthRangeFilterIterator($iterator, $minDepth, $maxDepth);
+        }
+
+        if ($this->mode) {
+            $iterator = new Iterator\FileTypeFilterIterator($iterator, $this->mode);
+        }
+
+        if ($this->names || $this->notNames) {
+            $iterator = new Iterator\FilenameFilterIterator($iterator, $this->names, $this->notNames);
+        }
+
+        if ($this->contains || $this->notContains) {
+            $iterator = new Iterator\FilecontentFilterIterator($iterator, $this->contains, $this->notContains);
+        }
+
+        if ($this->sizes) {
+            $iterator = new Iterator\SizeRangeFilterIterator($iterator, $this->sizes);
+        }
+
+        if ($this->dates) {
+            $iterator = new Iterator\DateRangeFilterIterator($iterator, $this->dates);
+        }
+
+        if ($this->filters) {
+            $iterator = new Iterator\CustomFilterIterator($iterator, $this->filters);
+        }
+
+        if ($this->paths || $this->notPaths) {
+            $iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $this->notPaths);
+        }
+
+        if ($this->sort) {
+            $iteratorAggregate = new Iterator\SortableIterator($iterator, $this->sort);
+            $iterator = $iteratorAggregate->getIterator();
+        }
+
+        return $iterator;
+    }
+
+    /**
+     * @param AdapterInterface $adapter
+     *
+     * @return AdapterInterface
+     */
+    private function buildAdapter(AdapterInterface $adapter)
+    {
+        return $adapter
+            ->setFollowLinks($this->followLinks)
+            ->setDepths($this->depths)
+            ->setMode($this->mode)
+            ->setExclude($this->exclude)
+            ->setNames($this->names)
+            ->setNotNames($this->notNames)
+            ->setContains($this->contains)
+            ->setNotContains($this->notContains)
+            ->setSizes($this->sizes)
+            ->setDates($this->dates)
+            ->setFilters($this->filters)
+            ->setSort($this->sort)
+            ->setPath($this->paths)
+            ->setNotPath($this->notPaths)
+            ->ignoreUnreadableDirs($this->ignoreUnreadableDirs);
+    }
+
+    /**
+     * Unselects all adapters.
+     */
+    private function resetAdapterSelection()
+    {
+        $this->adapters = array_map(function (array $properties) {
+            $properties['selected'] = false;
+
+            return $properties;
+        }, $this->adapters);
+    }
+
+    private function initDefaultAdapters()
+    {
+        if (null === $this->adapters) {
+            $this->adapters = array();
+            $this
+                ->addAdapter(new GnuFindAdapter())
+                ->addAdapter(new BsdFindAdapter())
+                ->addAdapter(new PhpAdapter(), -50)
+                ->setAdapter('php')
+            ;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Glob.php
@@ -0,0 +1,104 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder;
+
+/**
+ * Glob matches globbing patterns against text.
+ *
+ *   if match_glob("foo.*", "foo.bar") echo "matched\n";
+ *
+ * // prints foo.bar and foo.baz
+ * $regex = glob_to_regex("foo.*");
+ * for (array('foo.bar', 'foo.baz', 'foo', 'bar') as $t)
+ * {
+ *   if (/$regex/) echo "matched: $car\n";
+ * }
+ *
+ * Glob implements glob(3) style matching that can be used to match
+ * against text, rather than fetching names from a filesystem.
+ *
+ * Based on the Perl Text::Glob module.
+ *
+ * @author Fabien Potencier <fabien@symfony.com> PHP port
+ * @author     Richard Clamp <richardc@unixbeard.net> Perl version
+ * @copyright  2004-2005 Fabien Potencier <fabien@symfony.com>
+ * @copyright  2002 Richard Clamp <richardc@unixbeard.net>
+ */
+class Glob
+{
+    /**
+     * Returns a regexp which is the equivalent of the glob pattern.
+     *
+     * @param string $glob                The glob pattern
+     * @param bool   $strictLeadingDot
+     * @param bool   $strictWildcardSlash
+     * @param string $delimiter           Optional delimiter
+     *
+     * @return string regex The regexp
+     */
+    public static function toRegex($glob, $strictLeadingDot = true, $strictWildcardSlash = true, $delimiter = '#')
+    {
+        $firstByte = true;
+        $escaping = false;
+        $inCurlies = 0;
+        $regex = '';
+        $sizeGlob = strlen($glob);
+        for ($i = 0; $i < $sizeGlob; ++$i) {
+            $car = $glob[$i];
+            if ($firstByte) {
+                if ($strictLeadingDot && '.' !== $car) {
+                    $regex .= '(?=[^\.])';
+                }
+
+                $firstByte = false;
+            }
+
+            if ('/' === $car) {
+                $firstByte = true;
+            }
+
+            if ($delimiter === $car || '.' === $car || '(' === $car || ')' === $car || '|' === $car || '+' === $car || '^' === $car || '$' === $car) {
+                $regex .= "\\$car";
+            } elseif ('*' === $car) {
+                $regex .= $escaping ? '\\*' : ($strictWildcardSlash ? '[^/]*' : '.*');
+            } elseif ('?' === $car) {
+                $regex .= $escaping ? '\\?' : ($strictWildcardSlash ? '[^/]' : '.');
+            } elseif ('{' === $car) {
+                $regex .= $escaping ? '\\{' : '(';
+                if (!$escaping) {
+                    ++$inCurlies;
+                }
+            } elseif ('}' === $car && $inCurlies) {
+                $regex .= $escaping ? '}' : ')';
+                if (!$escaping) {
+                    --$inCurlies;
+                }
+            } elseif (',' === $car && $inCurlies) {
+                $regex .= $escaping ? ',' : '|';
+            } elseif ('\\' === $car) {
+                if ($escaping) {
+                    $regex .= '\\\\';
+                    $escaping = false;
+                } else {
+                    $escaping = true;
+                }
+
+                continue;
+            } else {
+                $regex .= $car;
+            }
+            $escaping = false;
+        }
+
+        return $delimiter.'^'.$regex.'$'.$delimiter;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Iterator/CustomFilterIterator.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Iterator;
+
+/**
+ * CustomFilterIterator filters files by applying anonymous functions.
+ *
+ * The anonymous function receives a \SplFileInfo and must return false
+ * to remove files.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class CustomFilterIterator extends FilterIterator
+{
+    private $filters = array();
+
+    /**
+     * Constructor.
+     *
+     * @param \Iterator  $iterator The Iterator to filter
+     * @param callable[] $filters  An array of PHP callbacks
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function __construct(\Iterator $iterator, array $filters)
+    {
+        foreach ($filters as $filter) {
+            if (!is_callable($filter)) {
+                throw new \InvalidArgumentException('Invalid PHP callback.');
+            }
+        }
+        $this->filters = $filters;
+
+        parent::__construct($iterator);
+    }
+
+    /**
+     * Filters the iterator values.
+     *
+     * @return bool true if the value should be kept, false otherwise
+     */
+    public function accept()
+    {
+        $fileinfo = $this->current();
+
+        foreach ($this->filters as $filter) {
+            if (false === call_user_func($filter, $fileinfo)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php
@@ -0,0 +1,60 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Iterator;
+
+use Symfony\Component\Finder\Comparator\DateComparator;
+
+/**
+ * DateRangeFilterIterator filters out files that are not in the given date range (last modified dates).
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class DateRangeFilterIterator extends FilterIterator
+{
+    private $comparators = array();
+
+    /**
+     * Constructor.
+     *
+     * @param \Iterator        $iterator    The Iterator to filter
+     * @param DateComparator[] $comparators An array of DateComparator instances
+     */
+    public function __construct(\Iterator $iterator, array $comparators)
+    {
+        $this->comparators = $comparators;
+
+        parent::__construct($iterator);
+    }
+
+    /**
+     * Filters the iterator values.
+     *
+     * @return bool true if the value should be kept, false otherwise
+     */
+    public function accept()
+    {
+        $fileinfo = $this->current();
+
+        if (!file_exists($fileinfo->getPathname())) {
+            return false;
+        }
+
+        $filedate = $fileinfo->getMTime();
+        foreach ($this->comparators as $compare) {
+            if (!$compare->test($filedate)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Iterator;
+
+/**
+ * DepthRangeFilterIterator limits the directory depth.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class DepthRangeFilterIterator extends FilterIterator
+{
+    private $minDepth = 0;
+
+    /**
+     * Constructor.
+     *
+     * @param \RecursiveIteratorIterator $iterator The Iterator to filter
+     * @param int                        $minDepth The min depth
+     * @param int                        $maxDepth The max depth
+     */
+    public function __construct(\RecursiveIteratorIterator $iterator, $minDepth = 0, $maxDepth = PHP_INT_MAX)
+    {
+        $this->minDepth = $minDepth;
+        $iterator->setMaxDepth(PHP_INT_MAX === $maxDepth ? -1 : $maxDepth);
+
+        parent::__construct($iterator);
+    }
+
+    /**
+     * Filters the iterator values.
+     *
+     * @return bool true if the value should be kept, false otherwise
+     */
+    public function accept()
+    {
+        return $this->getInnerIterator()->getDepth() >= $this->minDepth;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php
@@ -0,0 +1,86 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Iterator;
+
+/**
+ * ExcludeDirectoryFilterIterator filters out directories.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ExcludeDirectoryFilterIterator extends FilterIterator implements \RecursiveIterator
+{
+    private $iterator;
+    private $isRecursive;
+    private $excludedDirs = array();
+    private $excludedPattern;
+
+    /**
+     * Constructor.
+     *
+     * @param \Iterator $iterator    The Iterator to filter
+     * @param array     $directories An array of directories to exclude
+     */
+    public function __construct(\Iterator $iterator, array $directories)
+    {
+        $this->iterator = $iterator;
+        $this->isRecursive = $iterator instanceof \RecursiveIterator;
+        $patterns = array();
+        foreach ($directories as $directory) {
+            $directory = rtrim($directory, '/');
+            if (!$this->isRecursive || false !== strpos($directory, '/')) {
+                $patterns[] = preg_quote($directory, '#');
+            } else {
+                $this->excludedDirs[$directory] = true;
+            }
+        }
+        if ($patterns) {
+            $this->excludedPattern = '#(?:^|/)(?:'.implode('|', $patterns).')(?:/|$)#';
+        }
+
+        parent::__construct($iterator);
+    }
+
+    /**
+     * Filters the iterator values.
+     *
+     * @return bool True if the value should be kept, false otherwise
+     */
+    public function accept()
+    {
+        if ($this->isRecursive && isset($this->excludedDirs[$this->getFilename()]) && $this->isDir()) {
+            return false;
+        }
+
+        if ($this->excludedPattern) {
+            $path = $this->isDir() ? $this->current()->getRelativePathname() : $this->current()->getRelativePath();
+            $path = str_replace('\\', '/', $path);
+
+            return !preg_match($this->excludedPattern, $path);
+        }
+
+        return true;
+    }
+
+    public function hasChildren()
+    {
+        return $this->isRecursive && $this->iterator->hasChildren();
+    }
+
+    public function getChildren()
+    {
+        $children = new self($this->iterator->getChildren(), array());
+        $children->excludedDirs = $this->excludedDirs;
+        $children->excludedPattern = $this->excludedPattern;
+
+        return $children;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Iterator/FilePathsIterator.php
@@ -0,0 +1,135 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Iterator;
+
+@trigger_error('The '.__NAMESPACE__.'\FilePathsIterator class is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+use Symfony\Component\Finder\SplFileInfo;
+
+/**
+ * Iterate over shell command result.
+ *
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ *
+ * @deprecated since 2.8, to be removed in 3.0.
+ */
+class FilePathsIterator extends \ArrayIterator
+{
+    /**
+     * @var string
+     */
+    private $baseDir;
+
+    /**
+     * @var int
+     */
+    private $baseDirLength;
+
+    /**
+     * @var string
+     */
+    private $subPath;
+
+    /**
+     * @var string
+     */
+    private $subPathname;
+
+    /**
+     * @var SplFileInfo
+     */
+    private $current;
+
+    /**
+     * @param array  $paths   List of paths returned by shell command
+     * @param string $baseDir Base dir for relative path building
+     */
+    public function __construct(array $paths, $baseDir)
+    {
+        $this->baseDir = $baseDir;
+        $this->baseDirLength = strlen($baseDir);
+
+        parent::__construct($paths);
+    }
+
+    /**
+     * @param string $name
+     * @param array  $arguments
+     *
+     * @return mixed
+     */
+    public function __call($name, array $arguments)
+    {
+        return call_user_func_array(array($this->current(), $name), $arguments);
+    }
+
+    /**
+     * Return an instance of SplFileInfo with support for relative paths.
+     *
+     * @return SplFileInfo File information
+     */
+    public function current()
+    {
+        return $this->current;
+    }
+
+    /**
+     * @return string
+     */
+    public function key()
+    {
+        return $this->current->getPathname();
+    }
+
+    public function next()
+    {
+        parent::next();
+        $this->buildProperties();
+    }
+
+    public function rewind()
+    {
+        parent::rewind();
+        $this->buildProperties();
+    }
+
+    /**
+     * @return string
+     */
+    public function getSubPath()
+    {
+        return $this->subPath;
+    }
+
+    /**
+     * @return string
+     */
+    public function getSubPathname()
+    {
+        return $this->subPathname;
+    }
+
+    private function buildProperties()
+    {
+        $absolutePath = parent::current();
+
+        if ($this->baseDir === substr($absolutePath, 0, $this->baseDirLength)) {
+            $this->subPathname = ltrim(substr($absolutePath, $this->baseDirLength), '/\\');
+            $dir = dirname($this->subPathname);
+            $this->subPath = '.' === $dir ? '' : $dir;
+        } else {
+            $this->subPath = $this->subPathname = '';
+        }
+
+        $this->current = new SplFileInfo(parent::current(), $this->subPath, $this->subPathname);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Iterator;
+
+/**
+ * FileTypeFilterIterator only keeps files, directories, or both.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class FileTypeFilterIterator extends FilterIterator
+{
+    const ONLY_FILES = 1;
+    const ONLY_DIRECTORIES = 2;
+
+    private $mode;
+
+    /**
+     * Constructor.
+     *
+     * @param \Iterator $iterator The Iterator to filter
+     * @param int       $mode     The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES)
+     */
+    public function __construct(\Iterator $iterator, $mode)
+    {
+        $this->mode = $mode;
+
+        parent::__construct($iterator);
+    }
+
+    /**
+     * Filters the iterator values.
+     *
+     * @return bool true if the value should be kept, false otherwise
+     */
+    public function accept()
+    {
+        $fileinfo = $this->current();
+        if (self::ONLY_DIRECTORIES === (self::ONLY_DIRECTORIES & $this->mode) && $fileinfo->isFile()) {
+            return false;
+        } elseif (self::ONLY_FILES === (self::ONLY_FILES & $this->mode) && $fileinfo->isDir()) {
+            return false;
+        }
+
+        return true;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Iterator;
+
+/**
+ * FilecontentFilterIterator filters files by their contents using patterns (regexps or strings).
+ *
+ * @author Fabien Potencier  <fabien@symfony.com>
+ * @author Włodzimierz Gajda <gajdaw@gajdaw.pl>
+ */
+class FilecontentFilterIterator extends MultiplePcreFilterIterator
+{
+    /**
+     * Filters the iterator values.
+     *
+     * @return bool true if the value should be kept, false otherwise
+     */
+    public function accept()
+    {
+        if (!$this->matchRegexps && !$this->noMatchRegexps) {
+            return true;
+        }
+
+        $fileinfo = $this->current();
+
+        if ($fileinfo->isDir() || !$fileinfo->isReadable()) {
+            return false;
+        }
+
+        $content = $fileinfo->getContents();
+        if (!$content) {
+            return false;
+        }
+
+        return $this->isAccepted($content);
+    }
+
+    /**
+     * Converts string to regexp if necessary.
+     *
+     * @param string $str Pattern: string or regexp
+     *
+     * @return string regexp corresponding to a given string or regexp
+     */
+    protected function toRegex($str)
+    {
+        return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Iterator/FilenameFilterIterator.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Iterator;
+
+use Symfony\Component\Finder\Glob;
+
+/**
+ * FilenameFilterIterator filters files by patterns (a regexp, a glob, or a string).
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class FilenameFilterIterator extends MultiplePcreFilterIterator
+{
+    /**
+     * Filters the iterator values.
+     *
+     * @return bool true if the value should be kept, false otherwise
+     */
+    public function accept()
+    {
+        return $this->isAccepted($this->current()->getFilename());
+    }
+
+    /**
+     * Converts glob to regexp.
+     *
+     * PCRE patterns are left unchanged.
+     * Glob strings are transformed with Glob::toRegex().
+     *
+     * @param string $str Pattern: glob or regexp
+     *
+     * @return string regexp corresponding to a given glob or regexp
+     */
+    protected function toRegex($str)
+    {
+        return $this->isRegex($str) ? $str : Glob::toRegex($str);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Iterator/FilterIterator.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Iterator;
+
+/**
+ * This iterator just overrides the rewind method in order to correct a PHP bug,
+ * which existed before version 5.5.23/5.6.7.
+ *
+ * @see https://bugs.php.net/68557
+ *
+ * @author Alex Bogomazov
+ */
+abstract class FilterIterator extends \FilterIterator
+{
+    /**
+     * This is a workaround for the problem with \FilterIterator leaving inner \FilesystemIterator in wrong state after
+     * rewind in some cases.
+     *
+     * @see FilterIterator::rewind()
+     */
+    public function rewind()
+    {
+        if (PHP_VERSION_ID > 50607 || (PHP_VERSION_ID > 50523 && PHP_VERSION_ID < 50600)) {
+            parent::rewind();
+
+            return;
+        }
+
+        $iterator = $this;
+        while ($iterator instanceof \OuterIterator) {
+            $innerIterator = $iterator->getInnerIterator();
+
+            if ($innerIterator instanceof RecursiveDirectoryIterator) {
+                // this condition is necessary for iterators to work properly with non-local filesystems like ftp
+                if ($innerIterator->isRewindable()) {
+                    $innerIterator->next();
+                    $innerIterator->rewind();
+                }
+            } elseif ($innerIterator instanceof \FilesystemIterator) {
+                $innerIterator->next();
+                $innerIterator->rewind();
+            }
+
+            $iterator = $innerIterator;
+        }
+
+        parent::rewind();
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php
@@ -0,0 +1,114 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Iterator;
+
+/**
+ * MultiplePcreFilterIterator filters files using patterns (regexps, globs or strings).
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class MultiplePcreFilterIterator extends FilterIterator
+{
+    protected $matchRegexps = array();
+    protected $noMatchRegexps = array();
+
+    /**
+     * Constructor.
+     *
+     * @param \Iterator $iterator        The Iterator to filter
+     * @param array     $matchPatterns   An array of patterns that need to match
+     * @param array     $noMatchPatterns An array of patterns that need to not match
+     */
+    public function __construct(\Iterator $iterator, array $matchPatterns, array $noMatchPatterns)
+    {
+        foreach ($matchPatterns as $pattern) {
+            $this->matchRegexps[] = $this->toRegex($pattern);
+        }
+
+        foreach ($noMatchPatterns as $pattern) {
+            $this->noMatchRegexps[] = $this->toRegex($pattern);
+        }
+
+        parent::__construct($iterator);
+    }
+
+    /**
+     * Checks whether the string is accepted by the regex filters.
+     *
+     * If there is no regexps defined in the class, this method will accept the string.
+     * Such case can be handled by child classes before calling the method if they want to
+     * apply a different behavior.
+     *
+     * @param string $string The string to be matched against filters
+     *
+     * @return bool
+     */
+    protected function isAccepted($string)
+    {
+        // should at least not match one rule to exclude
+        foreach ($this->noMatchRegexps as $regex) {
+            if (preg_match($regex, $string)) {
+                return false;
+            }
+        }
+
+        // should at least match one rule
+        if ($this->matchRegexps) {
+            foreach ($this->matchRegexps as $regex) {
+                if (preg_match($regex, $string)) {
+                    return true;
+                }
+            }
+
+            return false;
+        }
+
+        // If there is no match rules, the file is accepted
+        return true;
+    }
+
+    /**
+     * Checks whether the string is a regex.
+     *
+     * @param string $str
+     *
+     * @return bool Whether the given string is a regex
+     */
+    protected function isRegex($str)
+    {
+        if (preg_match('/^(.{3,}?)[imsxuADU]*$/', $str, $m)) {
+            $start = substr($m[1], 0, 1);
+            $end = substr($m[1], -1);
+
+            if ($start === $end) {
+                return !preg_match('/[*?[:alnum:] \\\\]/', $start);
+            }
+
+            foreach (array(array('{', '}'), array('(', ')'), array('[', ']'), array('<', '>')) as $delimiters) {
+                if ($start === $delimiters[0] && $end === $delimiters[1]) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Converts string into regexp.
+     *
+     * @param string $str Pattern
+     *
+     * @return string regexp corresponding to a given string
+     */
+    abstract protected function toRegex($str);
+}
--- /dev/null
+++ b/vendor/symfony/finder/Iterator/PathFilterIterator.php
@@ -0,0 +1,56 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Iterator;
+
+/**
+ * PathFilterIterator filters files by path patterns (e.g. some/special/dir).
+ *
+ * @author Fabien Potencier  <fabien@symfony.com>
+ * @author Włodzimierz Gajda <gajdaw@gajdaw.pl>
+ */
+class PathFilterIterator extends MultiplePcreFilterIterator
+{
+    /**
+     * Filters the iterator values.
+     *
+     * @return bool true if the value should be kept, false otherwise
+     */
+    public function accept()
+    {
+        $filename = $this->current()->getRelativePathname();
+
+        if ('\\' === DIRECTORY_SEPARATOR) {
+            $filename = str_replace('\\', '/', $filename);
+        }
+
+        return $this->isAccepted($filename);
+    }
+
+    /**
+     * Converts strings to regexp.
+     *
+     * PCRE patterns are left unchanged.
+     *
+     * Default conversion:
+     *     'lorem/ipsum/dolor' ==>  'lorem\/ipsum\/dolor/'
+     *
+     * Use only / as directory separator (on Windows also).
+     *
+     * @param string $str Pattern: regexp or dirname
+     *
+     * @return string regexp corresponding to a given string or regexp
+     */
+    protected function toRegex($str)
+    {
+        return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php
@@ -0,0 +1,156 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Iterator;
+
+use Symfony\Component\Finder\Exception\AccessDeniedException;
+use Symfony\Component\Finder\SplFileInfo;
+
+/**
+ * Extends the \RecursiveDirectoryIterator to support relative paths.
+ *
+ * @author Victor Berchet <victor@suumit.com>
+ */
+class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
+{
+    /**
+     * @var bool
+     */
+    private $ignoreUnreadableDirs;
+
+    /**
+     * @var bool
+     */
+    private $rewindable;
+
+    // these 3 properties take part of the performance optimization to avoid redoing the same work in all iterations
+    private $rootPath;
+    private $subPath;
+    private $directorySeparator = '/';
+
+    /**
+     * Constructor.
+     *
+     * @param string $path
+     * @param int    $flags
+     * @param bool   $ignoreUnreadableDirs
+     *
+     * @throws \RuntimeException
+     */
+    public function __construct($path, $flags, $ignoreUnreadableDirs = false)
+    {
+        if ($flags & (self::CURRENT_AS_PATHNAME | self::CURRENT_AS_SELF)) {
+            throw new \RuntimeException('This iterator only support returning current as fileinfo.');
+        }
+
+        parent::__construct($path, $flags);
+        $this->ignoreUnreadableDirs = $ignoreUnreadableDirs;
+        $this->rootPath = (string) $path;
+        if ('/' !== DIRECTORY_SEPARATOR && !($flags & self::UNIX_PATHS)) {
+            $this->directorySeparator = DIRECTORY_SEPARATOR;
+        }
+    }
+
+    /**
+     * Return an instance of SplFileInfo with support for relative paths.
+     *
+     * @return SplFileInfo File information
+     */
+    public function current()
+    {
+        // the logic here avoids redoing the same work in all iterations
+
+        if (null === $subPathname = $this->subPath) {
+            $subPathname = $this->subPath = (string) $this->getSubPath();
+        }
+        if ('' !== $subPathname) {
+            $subPathname .= $this->directorySeparator;
+        }
+        $subPathname .= $this->getFilename();
+
+        return new SplFileInfo($this->rootPath.$this->directorySeparator.$subPathname, $this->subPath, $subPathname);
+    }
+
+    /**
+     * @return \RecursiveIterator
+     *
+     * @throws AccessDeniedException
+     */
+    public function getChildren()
+    {
+        try {
+            $children = parent::getChildren();
+
+            if ($children instanceof self) {
+                // parent method will call the constructor with default arguments, so unreadable dirs won't be ignored anymore
+                $children->ignoreUnreadableDirs = $this->ignoreUnreadableDirs;
+
+                // performance optimization to avoid redoing the same work in all children
+                $children->rewindable = &$this->rewindable;
+                $children->rootPath = $this->rootPath;
+            }
+
+            return $children;
+        } catch (\UnexpectedValueException $e) {
+            if ($this->ignoreUnreadableDirs) {
+                // If directory is unreadable and finder is set to ignore it, a fake empty content is returned.
+                return new \RecursiveArrayIterator(array());
+            } else {
+                throw new AccessDeniedException($e->getMessage(), $e->getCode(), $e);
+            }
+        }
+    }
+
+    /**
+     * Do nothing for non rewindable stream.
+     */
+    public function rewind()
+    {
+        if (false === $this->isRewindable()) {
+            return;
+        }
+
+        // @see https://bugs.php.net/68557
+        if (PHP_VERSION_ID < 50523 || PHP_VERSION_ID >= 50600 && PHP_VERSION_ID < 50607) {
+            parent::next();
+        }
+
+        parent::rewind();
+    }
+
+    /**
+     * Checks if the stream is rewindable.
+     *
+     * @return bool true when the stream is rewindable, false otherwise
+     */
+    public function isRewindable()
+    {
+        if (null !== $this->rewindable) {
+            return $this->rewindable;
+        }
+
+        // workaround for an HHVM bug, should be removed when https://github.com/facebook/hhvm/issues/7281 is fixed
+        if ('' === $this->getPath()) {
+            return $this->rewindable = false;
+        }
+
+        if (false !== $stream = @opendir($this->getPath())) {
+            $infos = stream_get_meta_data($stream);
+            closedir($stream);
+
+            if ($infos['seekable']) {
+                return $this->rewindable = true;
+            }
+        }
+
+        return $this->rewindable = false;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Iterator;
+
+use Symfony\Component\Finder\Comparator\NumberComparator;
+
+/**
+ * SizeRangeFilterIterator filters out files that are not in the given size range.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class SizeRangeFilterIterator extends FilterIterator
+{
+    private $comparators = array();
+
+    /**
+     * Constructor.
+     *
+     * @param \Iterator          $iterator    The Iterator to filter
+     * @param NumberComparator[] $comparators An array of NumberComparator instances
+     */
+    public function __construct(\Iterator $iterator, array $comparators)
+    {
+        $this->comparators = $comparators;
+
+        parent::__construct($iterator);
+    }
+
+    /**
+     * Filters the iterator values.
+     *
+     * @return bool true if the value should be kept, false otherwise
+     */
+    public function accept()
+    {
+        $fileinfo = $this->current();
+        if (!$fileinfo->isFile()) {
+            return true;
+        }
+
+        $filesize = $fileinfo->getSize();
+        foreach ($this->comparators as $compare) {
+            if (!$compare->test($filesize)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Iterator/SortableIterator.php
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Iterator;
+
+/**
+ * SortableIterator applies a sort on a given Iterator.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class SortableIterator implements \IteratorAggregate
+{
+    const SORT_BY_NAME = 1;
+    const SORT_BY_TYPE = 2;
+    const SORT_BY_ACCESSED_TIME = 3;
+    const SORT_BY_CHANGED_TIME = 4;
+    const SORT_BY_MODIFIED_TIME = 5;
+
+    private $iterator;
+    private $sort;
+
+    /**
+     * Constructor.
+     *
+     * @param \Traversable $iterator The Iterator to filter
+     * @param int|callable $sort     The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback)
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function __construct(\Traversable $iterator, $sort)
+    {
+        $this->iterator = $iterator;
+
+        if (self::SORT_BY_NAME === $sort) {
+            $this->sort = function ($a, $b) {
+                return strcmp($a->getRealpath() ?: $a->getPathname(), $b->getRealpath() ?: $b->getPathname());
+            };
+        } elseif (self::SORT_BY_TYPE === $sort) {
+            $this->sort = function ($a, $b) {
+                if ($a->isDir() && $b->isFile()) {
+                    return -1;
+                } elseif ($a->isFile() && $b->isDir()) {
+                    return 1;
+                }
+
+                return strcmp($a->getRealpath() ?: $a->getPathname(), $b->getRealpath() ?: $b->getPathname());
+            };
+        } elseif (self::SORT_BY_ACCESSED_TIME === $sort) {
+            $this->sort = function ($a, $b) {
+                return $a->getATime() - $b->getATime();
+            };
+        } elseif (self::SORT_BY_CHANGED_TIME === $sort) {
+            $this->sort = function ($a, $b) {
+                return $a->getCTime() - $b->getCTime();
+            };
+        } elseif (self::SORT_BY_MODIFIED_TIME === $sort) {
+            $this->sort = function ($a, $b) {
+                return $a->getMTime() - $b->getMTime();
+            };
+        } elseif (is_callable($sort)) {
+            $this->sort = $sort;
+        } else {
+            throw new \InvalidArgumentException('The SortableIterator takes a PHP callable or a valid built-in sort algorithm as an argument.');
+        }
+    }
+
+    public function getIterator()
+    {
+        $array = iterator_to_array($this->iterator, true);
+        uasort($array, $this->sort);
+
+        return new \ArrayIterator($array);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2016 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/symfony/finder/Shell/Command.php
@@ -0,0 +1,298 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Shell;
+
+@trigger_error('The '.__NAMESPACE__.'\Command class is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+/**
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ *
+ * @deprecated since 2.8, to be removed in 3.0.
+ */
+class Command
+{
+    /**
+     * @var Command|null
+     */
+    private $parent;
+
+    /**
+     * @var array
+     */
+    private $bits = array();
+
+    /**
+     * @var array
+     */
+    private $labels = array();
+
+    /**
+     * @var \Closure|null
+     */
+    private $errorHandler;
+
+    /**
+     * Constructor.
+     *
+     * @param Command|null $parent Parent command
+     */
+    public function __construct(Command $parent = null)
+    {
+        $this->parent = $parent;
+    }
+
+    /**
+     * Returns command as string.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->join();
+    }
+
+    /**
+     * Creates a new Command instance.
+     *
+     * @param Command|null $parent Parent command
+     *
+     * @return Command New Command instance
+     */
+    public static function create(Command $parent = null)
+    {
+        return new self($parent);
+    }
+
+    /**
+     * Escapes special chars from input.
+     *
+     * @param string $input A string to escape
+     *
+     * @return string The escaped string
+     */
+    public static function escape($input)
+    {
+        return escapeshellcmd($input);
+    }
+
+    /**
+     * Quotes input.
+     *
+     * @param string $input An argument string
+     *
+     * @return string The quoted string
+     */
+    public static function quote($input)
+    {
+        return escapeshellarg($input);
+    }
+
+    /**
+     * Appends a string or a Command instance.
+     *
+     * @param string|Command $bit
+     *
+     * @return Command The current Command instance
+     */
+    public function add($bit)
+    {
+        $this->bits[] = $bit;
+
+        return $this;
+    }
+
+    /**
+     * Prepends a string or a command instance.
+     *
+     * @param string|Command $bit
+     *
+     * @return Command The current Command instance
+     */
+    public function top($bit)
+    {
+        array_unshift($this->bits, $bit);
+
+        foreach ($this->labels as $label => $index) {
+            $this->labels[$label] += 1;
+        }
+
+        return $this;
+    }
+
+    /**
+     * Appends an argument, will be quoted.
+     *
+     * @param string $arg
+     *
+     * @return Command The current Command instance
+     */
+    public function arg($arg)
+    {
+        $this->bits[] = self::quote($arg);
+
+        return $this;
+    }
+
+    /**
+     * Appends escaped special command chars.
+     *
+     * @param string $esc
+     *
+     * @return Command The current Command instance
+     */
+    public function cmd($esc)
+    {
+        $this->bits[] = self::escape($esc);
+
+        return $this;
+    }
+
+    /**
+     * Inserts a labeled command to feed later.
+     *
+     * @param string $label The unique label
+     *
+     * @return Command The current Command instance
+     *
+     * @throws \RuntimeException If label already exists
+     */
+    public function ins($label)
+    {
+        if (isset($this->labels[$label])) {
+            throw new \RuntimeException(sprintf('Label "%s" already exists.', $label));
+        }
+
+        $this->bits[] = self::create($this);
+        $this->labels[$label] = count($this->bits) - 1;
+
+        return $this->bits[$this->labels[$label]];
+    }
+
+    /**
+     * Retrieves a previously labeled command.
+     *
+     * @param string $label
+     *
+     * @return Command The labeled command
+     *
+     * @throws \RuntimeException
+     */
+    public function get($label)
+    {
+        if (!isset($this->labels[$label])) {
+            throw new \RuntimeException(sprintf('Label "%s" does not exist.', $label));
+        }
+
+        return $this->bits[$this->labels[$label]];
+    }
+
+    /**
+     * Returns parent command (if any).
+     *
+     * @return Command Parent command
+     *
+     * @throws \RuntimeException If command has no parent
+     */
+    public function end()
+    {
+        if (null === $this->parent) {
+            throw new \RuntimeException('Calling end on root command doesn\'t make sense.');
+        }
+
+        return $this->parent;
+    }
+
+    /**
+     * Counts bits stored in command.
+     *
+     * @return int The bits count
+     */
+    public function length()
+    {
+        return count($this->bits);
+    }
+
+    /**
+     * @param \Closure $errorHandler
+     *
+     * @return Command
+     */
+    public function setErrorHandler(\Closure $errorHandler)
+    {
+        $this->errorHandler = $errorHandler;
+
+        return $this;
+    }
+
+    /**
+     * @return \Closure|null
+     */
+    public function getErrorHandler()
+    {
+        return $this->errorHandler;
+    }
+
+    /**
+     * Executes current command.
+     *
+     * @return array The command result
+     *
+     * @throws \RuntimeException
+     */
+    public function execute()
+    {
+        if (null === $errorHandler = $this->errorHandler) {
+            exec($this->join(), $output);
+        } else {
+            $process = proc_open($this->join(), array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w')), $pipes);
+            $output = preg_split('~(\r\n|\r|\n)~', stream_get_contents($pipes[1]), -1, PREG_SPLIT_NO_EMPTY);
+
+            if ($error = stream_get_contents($pipes[2])) {
+                $errorHandler($error);
+            }
+
+            proc_close($process);
+        }
+
+        return $output ?: array();
+    }
+
+    /**
+     * Joins bits.
+     *
+     * @return string
+     */
+    public function join()
+    {
+        return implode(' ', array_filter(
+            array_map(function ($bit) {
+                return $bit instanceof Command ? $bit->join() : ($bit ?: null);
+            }, $this->bits),
+            function ($bit) { return null !== $bit; }
+        ));
+    }
+
+    /**
+     * Insert a string or a Command instance before the bit at given position $index (index starts from 0).
+     *
+     * @param string|Command $bit
+     * @param int            $index
+     *
+     * @return Command The current Command instance
+     */
+    public function addAtIndex($bit, $index)
+    {
+        array_splice($this->bits, $index, 0, $bit instanceof self ? array($bit) : $bit);
+
+        return $this;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/Shell/Shell.php
@@ -0,0 +1,101 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder\Shell;
+
+@trigger_error('The '.__NAMESPACE__.'\Shell class is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+/**
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ *
+ * @deprecated since 2.8, to be removed in 3.0.
+ */
+class Shell
+{
+    const TYPE_UNIX = 1;
+    const TYPE_DARWIN = 2;
+    const TYPE_CYGWIN = 3;
+    const TYPE_WINDOWS = 4;
+    const TYPE_BSD = 5;
+
+    /**
+     * @var string|null
+     */
+    private $type;
+
+    /**
+     * Returns guessed OS type.
+     *
+     * @return int
+     */
+    public function getType()
+    {
+        if (null === $this->type) {
+            $this->type = $this->guessType();
+        }
+
+        return $this->type;
+    }
+
+    /**
+     * Tests if a command is available.
+     *
+     * @param string $command
+     *
+     * @return bool
+     */
+    public function testCommand($command)
+    {
+        if (!function_exists('exec')) {
+            return false;
+        }
+
+        // todo: find a better way (command could not be available)
+        $testCommand = 'which ';
+        if (self::TYPE_WINDOWS === $this->type) {
+            $testCommand = 'where ';
+        }
+
+        $command = escapeshellcmd($command);
+
+        exec($testCommand.$command, $output, $code);
+
+        return 0 === $code && count($output) > 0;
+    }
+
+    /**
+     * Guesses OS type.
+     *
+     * @return int
+     */
+    private function guessType()
+    {
+        $os = strtolower(PHP_OS);
+
+        if (false !== strpos($os, 'cygwin')) {
+            return self::TYPE_CYGWIN;
+        }
+
+        if (false !== strpos($os, 'darwin')) {
+            return self::TYPE_DARWIN;
+        }
+
+        if (false !== strpos($os, 'bsd')) {
+            return self::TYPE_BSD;
+        }
+
+        if (0 === strpos($os, 'win')) {
+            return self::TYPE_WINDOWS;
+        }
+
+        return self::TYPE_UNIX;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/SplFileInfo.php
@@ -0,0 +1,81 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Finder;
+
+/**
+ * Extends \SplFileInfo to support relative paths.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class SplFileInfo extends \SplFileInfo
+{
+    private $relativePath;
+    private $relativePathname;
+
+    /**
+     * Constructor.
+     *
+     * @param string $file             The file name
+     * @param string $relativePath     The relative path
+     * @param string $relativePathname The relative path name
+     */
+    public function __construct($file, $relativePath, $relativePathname)
+    {
+        parent::__construct($file);
+        $this->relativePath = $relativePath;
+        $this->relativePathname = $relativePathname;
+    }
+
+    /**
+     * Returns the relative path.
+     *
+     * This path does not contain the file name.
+     *
+     * @return string the relative path
+     */
+    public function getRelativePath()
+    {
+        return $this->relativePath;
+    }
+
+    /**
+     * Returns the relative path name.
+     *
+     * This path contains the file name.
+     *
+     * @return string the relative path name
+     */
+    public function getRelativePathname()
+    {
+        return $this->relativePathname;
+    }
+
+    /**
+     * Returns the contents of the file.
+     *
+     * @return string the contents of the file
+     *
+     * @throws \RuntimeException
+     */
+    public function getContents()
+    {
+        $level = error_reporting(0);
+        $content = file_get_contents($this->getPathname());
+        error_reporting($level);
+        if (false === $content) {
+            $error = error_get_last();
+            throw new \RuntimeException($error['message']);
+        }
+
+        return $content;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/finder/composer.json
@@ -0,0 +1,33 @@
+{
+    "name": "symfony/finder",
+    "type": "library",
+    "description": "Symfony Finder Component",
+    "keywords": [],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.9"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Component\\Finder\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.8-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/AcceptHeader.php
@@ -0,0 +1,172 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+/**
+ * Represents an Accept-* header.
+ *
+ * An accept header is compound with a list of items,
+ * sorted by descending quality.
+ *
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ */
+class AcceptHeader
+{
+    /**
+     * @var AcceptHeaderItem[]
+     */
+    private $items = array();
+
+    /**
+     * @var bool
+     */
+    private $sorted = true;
+
+    /**
+     * Constructor.
+     *
+     * @param AcceptHeaderItem[] $items
+     */
+    public function __construct(array $items)
+    {
+        foreach ($items as $item) {
+            $this->add($item);
+        }
+    }
+
+    /**
+     * Builds an AcceptHeader instance from a string.
+     *
+     * @param string $headerValue
+     *
+     * @return AcceptHeader
+     */
+    public static function fromString($headerValue)
+    {
+        $index = 0;
+
+        return new self(array_map(function ($itemValue) use (&$index) {
+            $item = AcceptHeaderItem::fromString($itemValue);
+            $item->setIndex($index++);
+
+            return $item;
+        }, preg_split('/\s*(?:,*("[^"]+"),*|,*(\'[^\']+\'),*|,+)\s*/', $headerValue, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)));
+    }
+
+    /**
+     * Returns header value's string representation.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return implode(',', $this->items);
+    }
+
+    /**
+     * Tests if header has given value.
+     *
+     * @param string $value
+     *
+     * @return bool
+     */
+    public function has($value)
+    {
+        return isset($this->items[$value]);
+    }
+
+    /**
+     * Returns given value's item, if exists.
+     *
+     * @param string $value
+     *
+     * @return AcceptHeaderItem|null
+     */
+    public function get($value)
+    {
+        return isset($this->items[$value]) ? $this->items[$value] : null;
+    }
+
+    /**
+     * Adds an item.
+     *
+     * @param AcceptHeaderItem $item
+     *
+     * @return AcceptHeader
+     */
+    public function add(AcceptHeaderItem $item)
+    {
+        $this->items[$item->getValue()] = $item;
+        $this->sorted = false;
+
+        return $this;
+    }
+
+    /**
+     * Returns all items.
+     *
+     * @return AcceptHeaderItem[]
+     */
+    public function all()
+    {
+        $this->sort();
+
+        return $this->items;
+    }
+
+    /**
+     * Filters items on their value using given regex.
+     *
+     * @param string $pattern
+     *
+     * @return AcceptHeader
+     */
+    public function filter($pattern)
+    {
+        return new self(array_filter($this->items, function (AcceptHeaderItem $item) use ($pattern) {
+            return preg_match($pattern, $item->getValue());
+        }));
+    }
+
+    /**
+     * Returns first item.
+     *
+     * @return AcceptHeaderItem|null
+     */
+    public function first()
+    {
+        $this->sort();
+
+        return !empty($this->items) ? reset($this->items) : null;
+    }
+
+    /**
+     * Sorts items by descending quality.
+     */
+    private function sort()
+    {
+        if (!$this->sorted) {
+            uasort($this->items, function ($a, $b) {
+                $qA = $a->getQuality();
+                $qB = $b->getQuality();
+
+                if ($qA === $qB) {
+                    return $a->getIndex() > $b->getIndex() ? 1 : -1;
+                }
+
+                return $qA > $qB ? -1 : 1;
+            });
+
+            $this->sorted = true;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/AcceptHeaderItem.php
@@ -0,0 +1,226 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+/**
+ * Represents an Accept-* header item.
+ *
+ * @author Jean-François Simon <contact@jfsimon.fr>
+ */
+class AcceptHeaderItem
+{
+    /**
+     * @var string
+     */
+    private $value;
+
+    /**
+     * @var float
+     */
+    private $quality = 1.0;
+
+    /**
+     * @var int
+     */
+    private $index = 0;
+
+    /**
+     * @var array
+     */
+    private $attributes = array();
+
+    /**
+     * Constructor.
+     *
+     * @param string $value
+     * @param array  $attributes
+     */
+    public function __construct($value, array $attributes = array())
+    {
+        $this->value = $value;
+        foreach ($attributes as $name => $value) {
+            $this->setAttribute($name, $value);
+        }
+    }
+
+    /**
+     * Builds an AcceptHeaderInstance instance from a string.
+     *
+     * @param string $itemValue
+     *
+     * @return AcceptHeaderItem
+     */
+    public static function fromString($itemValue)
+    {
+        $bits = preg_split('/\s*(?:;*("[^"]+");*|;*(\'[^\']+\');*|;+)\s*/', $itemValue, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
+        $value = array_shift($bits);
+        $attributes = array();
+
+        $lastNullAttribute = null;
+        foreach ($bits as $bit) {
+            if (($start = substr($bit, 0, 1)) === ($end = substr($bit, -1)) && ($start === '"' || $start === '\'')) {
+                $attributes[$lastNullAttribute] = substr($bit, 1, -1);
+            } elseif ('=' === $end) {
+                $lastNullAttribute = $bit = substr($bit, 0, -1);
+                $attributes[$bit] = null;
+            } else {
+                $parts = explode('=', $bit);
+                $attributes[$parts[0]] = isset($parts[1]) && strlen($parts[1]) > 0 ? $parts[1] : '';
+            }
+        }
+
+        return new self(($start = substr($value, 0, 1)) === ($end = substr($value, -1)) && ($start === '"' || $start === '\'') ? substr($value, 1, -1) : $value, $attributes);
+    }
+
+    /**
+     * Returns header  value's string representation.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        $string = $this->value.($this->quality < 1 ? ';q='.$this->quality : '');
+        if (count($this->attributes) > 0) {
+            $string .= ';'.implode(';', array_map(function ($name, $value) {
+                return sprintf(preg_match('/[,;=]/', $value) ? '%s="%s"' : '%s=%s', $name, $value);
+            }, array_keys($this->attributes), $this->attributes));
+        }
+
+        return $string;
+    }
+
+    /**
+     * Set the item value.
+     *
+     * @param string $value
+     *
+     * @return AcceptHeaderItem
+     */
+    public function setValue($value)
+    {
+        $this->value = $value;
+
+        return $this;
+    }
+
+    /**
+     * Returns the item value.
+     *
+     * @return string
+     */
+    public function getValue()
+    {
+        return $this->value;
+    }
+
+    /**
+     * Set the item quality.
+     *
+     * @param float $quality
+     *
+     * @return AcceptHeaderItem
+     */
+    public function setQuality($quality)
+    {
+        $this->quality = $quality;
+
+        return $this;
+    }
+
+    /**
+     * Returns the item quality.
+     *
+     * @return float
+     */
+    public function getQuality()
+    {
+        return $this->quality;
+    }
+
+    /**
+     * Set the item index.
+     *
+     * @param int $index
+     *
+     * @return AcceptHeaderItem
+     */
+    public function setIndex($index)
+    {
+        $this->index = $index;
+
+        return $this;
+    }
+
+    /**
+     * Returns the item index.
+     *
+     * @return int
+     */
+    public function getIndex()
+    {
+        return $this->index;
+    }
+
+    /**
+     * Tests if an attribute exists.
+     *
+     * @param string $name
+     *
+     * @return bool
+     */
+    public function hasAttribute($name)
+    {
+        return isset($this->attributes[$name]);
+    }
+
+    /**
+     * Returns an attribute by its name.
+     *
+     * @param string $name
+     * @param mixed  $default
+     *
+     * @return mixed
+     */
+    public function getAttribute($name, $default = null)
+    {
+        return isset($this->attributes[$name]) ? $this->attributes[$name] : $default;
+    }
+
+    /**
+     * Returns all attributes.
+     *
+     * @return array
+     */
+    public function getAttributes()
+    {
+        return $this->attributes;
+    }
+
+    /**
+     * Set an attribute.
+     *
+     * @param string $name
+     * @param string $value
+     *
+     * @return AcceptHeaderItem
+     */
+    public function setAttribute($name, $value)
+    {
+        if ('q' === $name) {
+            $this->quality = (float) $value;
+        } else {
+            $this->attributes[$name] = (string) $value;
+        }
+
+        return $this;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/ApacheRequest.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+/**
+ * Request represents an HTTP request from an Apache server.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ApacheRequest extends Request
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function prepareRequestUri()
+    {
+        return $this->server->get('REQUEST_URI');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function prepareBaseUrl()
+    {
+        $baseUrl = $this->server->get('SCRIPT_NAME');
+
+        if (false === strpos($this->server->get('REQUEST_URI'), $baseUrl)) {
+            // assume mod_rewrite
+            return rtrim(dirname($baseUrl), '/\\');
+        }
+
+        return $baseUrl;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/BinaryFileResponse.php
@@ -0,0 +1,359 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+use Symfony\Component\HttpFoundation\File\File;
+use Symfony\Component\HttpFoundation\File\Exception\FileException;
+
+/**
+ * BinaryFileResponse represents an HTTP response delivering a file.
+ *
+ * @author Niklas Fiekas <niklas.fiekas@tu-clausthal.de>
+ * @author stealth35 <stealth35-php@live.fr>
+ * @author Igor Wiedler <igor@wiedler.ch>
+ * @author Jordan Alliot <jordan.alliot@gmail.com>
+ * @author Sergey Linnik <linniksa@gmail.com>
+ */
+class BinaryFileResponse extends Response
+{
+    protected static $trustXSendfileTypeHeader = false;
+
+    /**
+     * @var File
+     */
+    protected $file;
+    protected $offset;
+    protected $maxlen;
+    protected $deleteFileAfterSend = false;
+
+    /**
+     * Constructor.
+     *
+     * @param \SplFileInfo|string $file               The file to stream
+     * @param int                 $status             The response status code
+     * @param array               $headers            An array of response headers
+     * @param bool                $public             Files are public by default
+     * @param null|string         $contentDisposition The type of Content-Disposition to set automatically with the filename
+     * @param bool                $autoEtag           Whether the ETag header should be automatically set
+     * @param bool                $autoLastModified   Whether the Last-Modified header should be automatically set
+     */
+    public function __construct($file, $status = 200, $headers = array(), $public = true, $contentDisposition = null, $autoEtag = false, $autoLastModified = true)
+    {
+        parent::__construct(null, $status, $headers);
+
+        $this->setFile($file, $contentDisposition, $autoEtag, $autoLastModified);
+
+        if ($public) {
+            $this->setPublic();
+        }
+    }
+
+    /**
+     * @param \SplFileInfo|string $file               The file to stream
+     * @param int                 $status             The response status code
+     * @param array               $headers            An array of response headers
+     * @param bool                $public             Files are public by default
+     * @param null|string         $contentDisposition The type of Content-Disposition to set automatically with the filename
+     * @param bool                $autoEtag           Whether the ETag header should be automatically set
+     * @param bool                $autoLastModified   Whether the Last-Modified header should be automatically set
+     *
+     * @return BinaryFileResponse The created response
+     */
+    public static function create($file = null, $status = 200, $headers = array(), $public = true, $contentDisposition = null, $autoEtag = false, $autoLastModified = true)
+    {
+        return new static($file, $status, $headers, $public, $contentDisposition, $autoEtag, $autoLastModified);
+    }
+
+    /**
+     * Sets the file to stream.
+     *
+     * @param \SplFileInfo|string $file               The file to stream
+     * @param string              $contentDisposition
+     * @param bool                $autoEtag
+     * @param bool                $autoLastModified
+     *
+     * @return BinaryFileResponse
+     *
+     * @throws FileException
+     */
+    public function setFile($file, $contentDisposition = null, $autoEtag = false, $autoLastModified = true)
+    {
+        if (!$file instanceof File) {
+            if ($file instanceof \SplFileInfo) {
+                $file = new File($file->getPathname());
+            } else {
+                $file = new File((string) $file);
+            }
+        }
+
+        if (!$file->isReadable()) {
+            throw new FileException('File must be readable.');
+        }
+
+        $this->file = $file;
+
+        if ($autoEtag) {
+            $this->setAutoEtag();
+        }
+
+        if ($autoLastModified) {
+            $this->setAutoLastModified();
+        }
+
+        if ($contentDisposition) {
+            $this->setContentDisposition($contentDisposition);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Gets the file.
+     *
+     * @return File The file to stream
+     */
+    public function getFile()
+    {
+        return $this->file;
+    }
+
+    /**
+     * Automatically sets the Last-Modified header according the file modification date.
+     */
+    public function setAutoLastModified()
+    {
+        $this->setLastModified(\DateTime::createFromFormat('U', $this->file->getMTime()));
+
+        return $this;
+    }
+
+    /**
+     * Automatically sets the ETag header according to the checksum of the file.
+     */
+    public function setAutoEtag()
+    {
+        $this->setEtag(sha1_file($this->file->getPathname()));
+
+        return $this;
+    }
+
+    /**
+     * Sets the Content-Disposition header with the given filename.
+     *
+     * @param string $disposition      ResponseHeaderBag::DISPOSITION_INLINE or ResponseHeaderBag::DISPOSITION_ATTACHMENT
+     * @param string $filename         Optionally use this filename instead of the real name of the file
+     * @param string $filenameFallback A fallback filename, containing only ASCII characters. Defaults to an automatically encoded filename
+     *
+     * @return BinaryFileResponse
+     */
+    public function setContentDisposition($disposition, $filename = '', $filenameFallback = '')
+    {
+        if ($filename === '') {
+            $filename = $this->file->getFilename();
+        }
+
+        if ('' === $filenameFallback && (!preg_match('/^[\x20-\x7e]*$/', $filename) || false !== strpos($filename, '%'))) {
+            $encoding = mb_detect_encoding($filename, null, true);
+
+            for ($i = 0; $i < mb_strlen($filename, $encoding); ++$i) {
+                $char = mb_substr($filename, $i, 1, $encoding);
+
+                if ('%' === $char || ord($char) < 32 || ord($char) > 126) {
+                    $filenameFallback .= '_';
+                } else {
+                    $filenameFallback .= $char;
+                }
+            }
+        }
+
+        $dispositionHeader = $this->headers->makeDisposition($disposition, $filename, $filenameFallback);
+        $this->headers->set('Content-Disposition', $dispositionHeader);
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prepare(Request $request)
+    {
+        $this->headers->set('Content-Length', $this->file->getSize());
+
+        if (!$this->headers->has('Accept-Ranges')) {
+            // Only accept ranges on safe HTTP methods
+            $this->headers->set('Accept-Ranges', $request->isMethodSafe() ? 'bytes' : 'none');
+        }
+
+        if (!$this->headers->has('Content-Type')) {
+            $this->headers->set('Content-Type', $this->file->getMimeType() ?: 'application/octet-stream');
+        }
+
+        if ('HTTP/1.0' !== $request->server->get('SERVER_PROTOCOL')) {
+            $this->setProtocolVersion('1.1');
+        }
+
+        $this->ensureIEOverSSLCompatibility($request);
+
+        $this->offset = 0;
+        $this->maxlen = -1;
+
+        if (self::$trustXSendfileTypeHeader && $request->headers->has('X-Sendfile-Type')) {
+            // Use X-Sendfile, do not send any content.
+            $type = $request->headers->get('X-Sendfile-Type');
+            $path = $this->file->getRealPath();
+            // Fall back to scheme://path for stream wrapped locations.
+            if (false === $path) {
+                $path = $this->file->getPathname();
+            }
+            if (strtolower($type) === 'x-accel-redirect') {
+                // Do X-Accel-Mapping substitutions.
+                // @link http://wiki.nginx.org/X-accel#X-Accel-Redirect
+                foreach (explode(',', $request->headers->get('X-Accel-Mapping', '')) as $mapping) {
+                    $mapping = explode('=', $mapping, 2);
+
+                    if (2 === count($mapping)) {
+                        $pathPrefix = trim($mapping[0]);
+                        $location = trim($mapping[1]);
+
+                        if (substr($path, 0, strlen($pathPrefix)) === $pathPrefix) {
+                            $path = $location.substr($path, strlen($pathPrefix));
+                            break;
+                        }
+                    }
+                }
+            }
+            $this->headers->set($type, $path);
+            $this->maxlen = 0;
+        } elseif ($request->headers->has('Range')) {
+            // Process the range headers.
+            if (!$request->headers->has('If-Range') || $this->hasValidIfRangeHeader($request->headers->get('If-Range'))) {
+                $range = $request->headers->get('Range');
+                $fileSize = $this->file->getSize();
+
+                list($start, $end) = explode('-', substr($range, 6), 2) + array(0);
+
+                $end = ('' === $end) ? $fileSize - 1 : (int) $end;
+
+                if ('' === $start) {
+                    $start = $fileSize - $end;
+                    $end = $fileSize - 1;
+                } else {
+                    $start = (int) $start;
+                }
+
+                if ($start <= $end) {
+                    if ($start < 0 || $end > $fileSize - 1) {
+                        $this->setStatusCode(416);
+                        $this->headers->set('Content-Range', sprintf('bytes */%s', $fileSize));
+                    } elseif ($start !== 0 || $end !== $fileSize - 1) {
+                        $this->maxlen = $end < $fileSize ? $end - $start + 1 : -1;
+                        $this->offset = $start;
+
+                        $this->setStatusCode(206);
+                        $this->headers->set('Content-Range', sprintf('bytes %s-%s/%s', $start, $end, $fileSize));
+                        $this->headers->set('Content-Length', $end - $start + 1);
+                    }
+                }
+            }
+        }
+
+        return $this;
+    }
+
+    private function hasValidIfRangeHeader($header)
+    {
+        if ($this->getEtag() === $header) {
+            return true;
+        }
+
+        if (null === $lastModified = $this->getLastModified()) {
+            return false;
+        }
+
+        return $lastModified->format('D, d M Y H:i:s').' GMT' === $header;
+    }
+
+    /**
+     * Sends the file.
+     *
+     * {@inheritdoc}
+     */
+    public function sendContent()
+    {
+        if (!$this->isSuccessful()) {
+            return parent::sendContent();
+        }
+
+        if (0 === $this->maxlen) {
+            return $this;
+        }
+
+        $out = fopen('php://output', 'wb');
+        $file = fopen($this->file->getPathname(), 'rb');
+
+        stream_copy_to_stream($file, $out, $this->maxlen, $this->offset);
+
+        fclose($out);
+        fclose($file);
+
+        if ($this->deleteFileAfterSend) {
+            unlink($this->file->getPathname());
+        }
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @throws \LogicException when the content is not null
+     */
+    public function setContent($content)
+    {
+        if (null !== $content) {
+            throw new \LogicException('The content cannot be set on a BinaryFileResponse instance.');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return false
+     */
+    public function getContent()
+    {
+        return false;
+    }
+
+    /**
+     * Trust X-Sendfile-Type header.
+     */
+    public static function trustXSendfileTypeHeader()
+    {
+        self::$trustXSendfileTypeHeader = true;
+    }
+
+    /**
+     * If this is set to true, the file will be unlinked after the request is send
+     * Note: If the X-Sendfile header is used, the deleteFileAfterSend setting will not be used.
+     *
+     * @param bool $shouldDelete
+     *
+     * @return BinaryFileResponse
+     */
+    public function deleteFileAfterSend($shouldDelete)
+    {
+        $this->deleteFileAfterSend = $shouldDelete;
+
+        return $this;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Cookie.php
@@ -0,0 +1,190 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+/**
+ * Represents a cookie.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class Cookie
+{
+    protected $name;
+    protected $value;
+    protected $domain;
+    protected $expire;
+    protected $path;
+    protected $secure;
+    protected $httpOnly;
+
+    /**
+     * Constructor.
+     *
+     * @param string                                  $name     The name of the cookie
+     * @param string                                  $value    The value of the cookie
+     * @param int|string|\DateTime|\DateTimeInterface $expire   The time the cookie expires
+     * @param string                                  $path     The path on the server in which the cookie will be available on
+     * @param string                                  $domain   The domain that the cookie is available to
+     * @param bool                                    $secure   Whether the cookie should only be transmitted over a secure HTTPS connection from the client
+     * @param bool                                    $httpOnly Whether the cookie will be made accessible only through the HTTP protocol
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function __construct($name, $value = null, $expire = 0, $path = '/', $domain = null, $secure = false, $httpOnly = true)
+    {
+        // from PHP source code
+        if (preg_match("/[=,; \t\r\n\013\014]/", $name)) {
+            throw new \InvalidArgumentException(sprintf('The cookie name "%s" contains invalid characters.', $name));
+        }
+
+        if (empty($name)) {
+            throw new \InvalidArgumentException('The cookie name cannot be empty.');
+        }
+
+        // convert expiration time to a Unix timestamp
+        if ($expire instanceof \DateTime || $expire instanceof \DateTimeInterface) {
+            $expire = $expire->format('U');
+        } elseif (!is_numeric($expire)) {
+            $expire = strtotime($expire);
+
+            if (false === $expire || -1 === $expire) {
+                throw new \InvalidArgumentException('The cookie expiration time is not valid.');
+            }
+        }
+
+        $this->name = $name;
+        $this->value = $value;
+        $this->domain = $domain;
+        $this->expire = $expire;
+        $this->path = empty($path) ? '/' : $path;
+        $this->secure = (bool) $secure;
+        $this->httpOnly = (bool) $httpOnly;
+    }
+
+    /**
+     * Returns the cookie as a string.
+     *
+     * @return string The cookie
+     */
+    public function __toString()
+    {
+        $str = urlencode($this->getName()).'=';
+
+        if ('' === (string) $this->getValue()) {
+            $str .= 'deleted; expires='.gmdate('D, d-M-Y H:i:s T', time() - 31536001);
+        } else {
+            $str .= urlencode($this->getValue());
+
+            if ($this->getExpiresTime() !== 0) {
+                $str .= '; expires='.gmdate('D, d-M-Y H:i:s T', $this->getExpiresTime());
+            }
+        }
+
+        if ($this->path) {
+            $str .= '; path='.$this->path;
+        }
+
+        if ($this->getDomain()) {
+            $str .= '; domain='.$this->getDomain();
+        }
+
+        if (true === $this->isSecure()) {
+            $str .= '; secure';
+        }
+
+        if (true === $this->isHttpOnly()) {
+            $str .= '; httponly';
+        }
+
+        return $str;
+    }
+
+    /**
+     * Gets the name of the cookie.
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Gets the value of the cookie.
+     *
+     * @return string
+     */
+    public function getValue()
+    {
+        return $this->value;
+    }
+
+    /**
+     * Gets the domain that the cookie is available to.
+     *
+     * @return string
+     */
+    public function getDomain()
+    {
+        return $this->domain;
+    }
+
+    /**
+     * Gets the time the cookie expires.
+     *
+     * @return int
+     */
+    public function getExpiresTime()
+    {
+        return $this->expire;
+    }
+
+    /**
+     * Gets the path on the server in which the cookie will be available on.
+     *
+     * @return string
+     */
+    public function getPath()
+    {
+        return $this->path;
+    }
+
+    /**
+     * Checks whether the cookie should only be transmitted over a secure HTTPS connection from the client.
+     *
+     * @return bool
+     */
+    public function isSecure()
+    {
+        return $this->secure;
+    }
+
+    /**
+     * Checks whether the cookie will be made accessible only through the HTTP protocol.
+     *
+     * @return bool
+     */
+    public function isHttpOnly()
+    {
+        return $this->httpOnly;
+    }
+
+    /**
+     * Whether this cookie is about to be cleared.
+     *
+     * @return bool
+     */
+    public function isCleared()
+    {
+        return $this->expire < time();
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Exception/ConflictingHeadersException.php
@@ -0,0 +1,23 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Exception;
+
+/**
+ * The HTTP request contains headers with conflicting information.
+ *
+ * This exception should trigger an HTTP 400 response in your application code.
+ *
+ * @author Magnus Nordlander <magnus@fervo.se>
+ */
+class ConflictingHeadersException extends \RuntimeException
+{
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/ExpressionRequestMatcher.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
+
+/**
+ * ExpressionRequestMatcher uses an expression to match a Request.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ExpressionRequestMatcher extends RequestMatcher
+{
+    private $language;
+    private $expression;
+
+    public function setExpression(ExpressionLanguage $language, $expression)
+    {
+        $this->language = $language;
+        $this->expression = $expression;
+    }
+
+    public function matches(Request $request)
+    {
+        if (!$this->language) {
+            throw new \LogicException('Unable to match the request as the expression language is not available.');
+        }
+
+        return $this->language->evaluate($this->expression, array(
+            'request' => $request,
+            'method' => $request->getMethod(),
+            'path' => rawurldecode($request->getPathInfo()),
+            'host' => $request->getHost(),
+            'ip' => $request->getClientIp(),
+            'attributes' => $request->attributes->all(),
+        )) && parent::matches($request);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\File\Exception;
+
+/**
+ * Thrown when the access on a file was denied.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class AccessDeniedException extends FileException
+{
+    /**
+     * Constructor.
+     *
+     * @param string $path The path to the accessed file
+     */
+    public function __construct($path)
+    {
+        parent::__construct(sprintf('The file %s could not be accessed', $path));
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/File/Exception/FileException.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\File\Exception;
+
+/**
+ * Thrown when an error occurred in the component File.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class FileException extends \RuntimeException
+{
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\File\Exception;
+
+/**
+ * Thrown when a file was not found.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class FileNotFoundException extends FileException
+{
+    /**
+     * Constructor.
+     *
+     * @param string $path The path to the file that was not found
+     */
+    public function __construct($path)
+    {
+        parent::__construct(sprintf('The file "%s" does not exist', $path));
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\File\Exception;
+
+class UnexpectedTypeException extends FileException
+{
+    public function __construct($value, $expectedType)
+    {
+        parent::__construct(sprintf('Expected argument of type %s, %s given', $expectedType, is_object($value) ? get_class($value) : gettype($value)));
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/File/Exception/UploadException.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\File\Exception;
+
+/**
+ * Thrown when an error occurred during file upload.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class UploadException extends FileException
+{
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/File/File.php
@@ -0,0 +1,136 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\File;
+
+use Symfony\Component\HttpFoundation\File\Exception\FileException;
+use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
+use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser;
+use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;
+
+/**
+ * A file in the file system.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class File extends \SplFileInfo
+{
+    /**
+     * Constructs a new file from the given path.
+     *
+     * @param string $path      The path to the file
+     * @param bool   $checkPath Whether to check the path or not
+     *
+     * @throws FileNotFoundException If the given path is not a file
+     */
+    public function __construct($path, $checkPath = true)
+    {
+        if ($checkPath && !is_file($path)) {
+            throw new FileNotFoundException($path);
+        }
+
+        parent::__construct($path);
+    }
+
+    /**
+     * Returns the extension based on the mime type.
+     *
+     * If the mime type is unknown, returns null.
+     *
+     * This method uses the mime type as guessed by getMimeType()
+     * to guess the file extension.
+     *
+     * @return string|null The guessed extension or null if it cannot be guessed
+     *
+     * @see ExtensionGuesser
+     * @see getMimeType()
+     */
+    public function guessExtension()
+    {
+        $type = $this->getMimeType();
+        $guesser = ExtensionGuesser::getInstance();
+
+        return $guesser->guess($type);
+    }
+
+    /**
+     * Returns the mime type of the file.
+     *
+     * The mime type is guessed using a MimeTypeGuesser instance, which uses finfo(),
+     * mime_content_type() and the system binary "file" (in this order), depending on
+     * which of those are available.
+     *
+     * @return string|null The guessed mime type (e.g. "application/pdf")
+     *
+     * @see MimeTypeGuesser
+     */
+    public function getMimeType()
+    {
+        $guesser = MimeTypeGuesser::getInstance();
+
+        return $guesser->guess($this->getPathname());
+    }
+
+    /**
+     * Moves the file to a new location.
+     *
+     * @param string $directory The destination folder
+     * @param string $name      The new file name
+     *
+     * @return File A File object representing the new file
+     *
+     * @throws FileException if the target file could not be created
+     */
+    public function move($directory, $name = null)
+    {
+        $target = $this->getTargetFile($directory, $name);
+
+        if (!@rename($this->getPathname(), $target)) {
+            $error = error_get_last();
+            throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $target, strip_tags($error['message'])));
+        }
+
+        @chmod($target, 0666 & ~umask());
+
+        return $target;
+    }
+
+    protected function getTargetFile($directory, $name = null)
+    {
+        if (!is_dir($directory)) {
+            if (false === @mkdir($directory, 0777, true) && !is_dir($directory)) {
+                throw new FileException(sprintf('Unable to create the "%s" directory', $directory));
+            }
+        } elseif (!is_writable($directory)) {
+            throw new FileException(sprintf('Unable to write in the "%s" directory', $directory));
+        }
+
+        $target = rtrim($directory, '/\\').DIRECTORY_SEPARATOR.(null === $name ? $this->getBasename() : $this->getName($name));
+
+        return new self($target, false);
+    }
+
+    /**
+     * Returns locale independent base name of the given path.
+     *
+     * @param string $name The new file name
+     *
+     * @return string containing
+     */
+    protected function getName($name)
+    {
+        $originalName = str_replace('\\', '/', $name);
+        $pos = strrpos($originalName, '/');
+        $originalName = false === $pos ? $originalName : substr($originalName, $pos + 1);
+
+        return $originalName;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesser.php
@@ -0,0 +1,96 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\File\MimeType;
+
+/**
+ * A singleton mime type to file extension guesser.
+ *
+ * A default guesser is provided.
+ * You can register custom guessers by calling the register()
+ * method on the singleton instance:
+ *
+ *     $guesser = ExtensionGuesser::getInstance();
+ *     $guesser->register(new MyCustomExtensionGuesser());
+ *
+ * The last registered guesser is preferred over previously registered ones.
+ */
+class ExtensionGuesser implements ExtensionGuesserInterface
+{
+    /**
+     * The singleton instance.
+     *
+     * @var ExtensionGuesser
+     */
+    private static $instance = null;
+
+    /**
+     * All registered ExtensionGuesserInterface instances.
+     *
+     * @var array
+     */
+    protected $guessers = array();
+
+    /**
+     * Returns the singleton instance.
+     *
+     * @return ExtensionGuesser
+     */
+    public static function getInstance()
+    {
+        if (null === self::$instance) {
+            self::$instance = new self();
+        }
+
+        return self::$instance;
+    }
+
+    /**
+     * Registers all natively provided extension guessers.
+     */
+    private function __construct()
+    {
+        $this->register(new MimeTypeExtensionGuesser());
+    }
+
+    /**
+     * Registers a new extension guesser.
+     *
+     * When guessing, this guesser is preferred over previously registered ones.
+     *
+     * @param ExtensionGuesserInterface $guesser
+     */
+    public function register(ExtensionGuesserInterface $guesser)
+    {
+        array_unshift($this->guessers, $guesser);
+    }
+
+    /**
+     * Tries to guess the extension.
+     *
+     * The mime type is passed to each registered mime type guesser in reverse order
+     * of their registration (last registered is queried first). Once a guesser
+     * returns a value that is not NULL, this method terminates and returns the
+     * value.
+     *
+     * @param string $mimeType The mime type
+     *
+     * @return string The guessed extension or NULL, if none could be guessed
+     */
+    public function guess($mimeType)
+    {
+        foreach ($this->guessers as $guesser) {
+            if (null !== $extension = $guesser->guess($mimeType)) {
+                return $extension;
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesserInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\File\MimeType;
+
+/**
+ * Guesses the file extension corresponding to a given mime type.
+ */
+interface ExtensionGuesserInterface
+{
+    /**
+     * Makes a best guess for a file extension, given a mime type.
+     *
+     * @param string $mimeType The mime type
+     *
+     * @return string The guessed extension or NULL, if none could be guessed
+     */
+    public function guess($mimeType);
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/File/MimeType/FileBinaryMimeTypeGuesser.php
@@ -0,0 +1,87 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\File\MimeType;
+
+use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
+use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
+
+/**
+ * Guesses the mime type with the binary "file" (only available on *nix).
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface
+{
+    private $cmd;
+
+    /**
+     * Constructor.
+     *
+     * The $cmd pattern must contain a "%s" string that will be replaced
+     * with the file name to guess.
+     *
+     * The command output must start with the mime type of the file.
+     *
+     * @param string $cmd The command to run to get the mime type of a file
+     */
+    public function __construct($cmd = 'file -b --mime %s 2>/dev/null')
+    {
+        $this->cmd = $cmd;
+    }
+
+    /**
+     * Returns whether this guesser is supported on the current OS.
+     *
+     * @return bool
+     */
+    public static function isSupported()
+    {
+        return '\\' !== DIRECTORY_SEPARATOR && function_exists('passthru') && function_exists('escapeshellarg');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function guess($path)
+    {
+        if (!is_file($path)) {
+            throw new FileNotFoundException($path);
+        }
+
+        if (!is_readable($path)) {
+            throw new AccessDeniedException($path);
+        }
+
+        if (!self::isSupported()) {
+            return;
+        }
+
+        ob_start();
+
+        // need to use --mime instead of -i. see #6641
+        passthru(sprintf($this->cmd, escapeshellarg($path)), $return);
+        if ($return > 0) {
+            ob_end_clean();
+
+            return;
+        }
+
+        $type = trim(ob_get_clean());
+
+        if (!preg_match('#^([a-z0-9\-]+/[a-z0-9\-\.]+)#i', $type, $match)) {
+            // it's not a type, but an error message
+            return;
+        }
+
+        return $match[1];
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/File/MimeType/FileinfoMimeTypeGuesser.php
@@ -0,0 +1,71 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\File\MimeType;
+
+use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
+use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
+
+/**
+ * Guesses the mime type using the PECL extension FileInfo.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class FileinfoMimeTypeGuesser implements MimeTypeGuesserInterface
+{
+    private $magicFile;
+
+    /**
+     * Constructor.
+     *
+     * @param string $magicFile A magic file to use with the finfo instance
+     *
+     * @see http://www.php.net/manual/en/function.finfo-open.php
+     */
+    public function __construct($magicFile = null)
+    {
+        $this->magicFile = $magicFile;
+    }
+
+    /**
+     * Returns whether this guesser is supported on the current OS/PHP setup.
+     *
+     * @return bool
+     */
+    public static function isSupported()
+    {
+        return function_exists('finfo_open');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function guess($path)
+    {
+        if (!is_file($path)) {
+            throw new FileNotFoundException($path);
+        }
+
+        if (!is_readable($path)) {
+            throw new AccessDeniedException($path);
+        }
+
+        if (!self::isSupported()) {
+            return;
+        }
+
+        if (!$finfo = new \finfo(FILEINFO_MIME_TYPE, $this->magicFile)) {
+            return;
+        }
+
+        return $finfo->file($path);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/File/MimeType/MimeTypeExtensionGuesser.php
@@ -0,0 +1,808 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\File\MimeType;
+
+/**
+ * Provides a best-guess mapping of mime type to file extension.
+ */
+class MimeTypeExtensionGuesser implements ExtensionGuesserInterface
+{
+    /**
+     * A map of mime types and their default extensions.
+     *
+     * This list has been placed under the public domain by the Apache HTTPD project.
+     * This list has been updated from upstream on 2013-04-23.
+     *
+     * @see http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
+     *
+     * @var array
+     */
+    protected $defaultExtensions = array(
+        'application/andrew-inset' => 'ez',
+        'application/applixware' => 'aw',
+        'application/atom+xml' => 'atom',
+        'application/atomcat+xml' => 'atomcat',
+        'application/atomsvc+xml' => 'atomsvc',
+        'application/ccxml+xml' => 'ccxml',
+        'application/cdmi-capability' => 'cdmia',
+        'application/cdmi-container' => 'cdmic',
+        'application/cdmi-domain' => 'cdmid',
+        'application/cdmi-object' => 'cdmio',
+        'application/cdmi-queue' => 'cdmiq',
+        'application/cu-seeme' => 'cu',
+        'application/davmount+xml' => 'davmount',
+        'application/docbook+xml' => 'dbk',
+        'application/dssc+der' => 'dssc',
+        'application/dssc+xml' => 'xdssc',
+        'application/ecmascript' => 'ecma',
+        'application/emma+xml' => 'emma',
+        'application/epub+zip' => 'epub',
+        'application/exi' => 'exi',
+        'application/font-tdpfr' => 'pfr',
+        'application/gml+xml' => 'gml',
+        'application/gpx+xml' => 'gpx',
+        'application/gxf' => 'gxf',
+        'application/hyperstudio' => 'stk',
+        'application/inkml+xml' => 'ink',
+        'application/ipfix' => 'ipfix',
+        'application/java-archive' => 'jar',
+        'application/java-serialized-object' => 'ser',
+        'application/java-vm' => 'class',
+        'application/javascript' => 'js',
+        'application/json' => 'json',
+        'application/jsonml+json' => 'jsonml',
+        'application/lost+xml' => 'lostxml',
+        'application/mac-binhex40' => 'hqx',
+        'application/mac-compactpro' => 'cpt',
+        'application/mads+xml' => 'mads',
+        'application/marc' => 'mrc',
+        'application/marcxml+xml' => 'mrcx',
+        'application/mathematica' => 'ma',
+        'application/mathml+xml' => 'mathml',
+        'application/mbox' => 'mbox',
+        'application/mediaservercontrol+xml' => 'mscml',
+        'application/metalink+xml' => 'metalink',
+        'application/metalink4+xml' => 'meta4',
+        'application/mets+xml' => 'mets',
+        'application/mods+xml' => 'mods',
+        'application/mp21' => 'm21',
+        'application/mp4' => 'mp4s',
+        'application/msword' => 'doc',
+        'application/mxf' => 'mxf',
+        'application/octet-stream' => 'bin',
+        'application/oda' => 'oda',
+        'application/oebps-package+xml' => 'opf',
+        'application/ogg' => 'ogx',
+        'application/omdoc+xml' => 'omdoc',
+        'application/onenote' => 'onetoc',
+        'application/oxps' => 'oxps',
+        'application/patch-ops-error+xml' => 'xer',
+        'application/pdf' => 'pdf',
+        'application/pgp-encrypted' => 'pgp',
+        'application/pgp-signature' => 'asc',
+        'application/pics-rules' => 'prf',
+        'application/pkcs10' => 'p10',
+        'application/pkcs7-mime' => 'p7m',
+        'application/pkcs7-signature' => 'p7s',
+        'application/pkcs8' => 'p8',
+        'application/pkix-attr-cert' => 'ac',
+        'application/pkix-cert' => 'cer',
+        'application/pkix-crl' => 'crl',
+        'application/pkix-pkipath' => 'pkipath',
+        'application/pkixcmp' => 'pki',
+        'application/pls+xml' => 'pls',
+        'application/postscript' => 'ai',
+        'application/prs.cww' => 'cww',
+        'application/pskc+xml' => 'pskcxml',
+        'application/rdf+xml' => 'rdf',
+        'application/reginfo+xml' => 'rif',
+        'application/relax-ng-compact-syntax' => 'rnc',
+        'application/resource-lists+xml' => 'rl',
+        'application/resource-lists-diff+xml' => 'rld',
+        'application/rls-services+xml' => 'rs',
+        'application/rpki-ghostbusters' => 'gbr',
+        'application/rpki-manifest' => 'mft',
+        'application/rpki-roa' => 'roa',
+        'application/rsd+xml' => 'rsd',
+        'application/rss+xml' => 'rss',
+        'application/rtf' => 'rtf',
+        'application/sbml+xml' => 'sbml',
+        'application/scvp-cv-request' => 'scq',
+        'application/scvp-cv-response' => 'scs',
+        'application/scvp-vp-request' => 'spq',
+        'application/scvp-vp-response' => 'spp',
+        'application/sdp' => 'sdp',
+        'application/set-payment-initiation' => 'setpay',
+        'application/set-registration-initiation' => 'setreg',
+        'application/shf+xml' => 'shf',
+        'application/smil+xml' => 'smi',
+        'application/sparql-query' => 'rq',
+        'application/sparql-results+xml' => 'srx',
+        'application/srgs' => 'gram',
+        'application/srgs+xml' => 'grxml',
+        'application/sru+xml' => 'sru',
+        'application/ssdl+xml' => 'ssdl',
+        'application/ssml+xml' => 'ssml',
+        'application/tei+xml' => 'tei',
+        'application/thraud+xml' => 'tfi',
+        'application/timestamped-data' => 'tsd',
+        'application/vnd.3gpp.pic-bw-large' => 'plb',
+        'application/vnd.3gpp.pic-bw-small' => 'psb',
+        'application/vnd.3gpp.pic-bw-var' => 'pvb',
+        'application/vnd.3gpp2.tcap' => 'tcap',
+        'application/vnd.3m.post-it-notes' => 'pwn',
+        'application/vnd.accpac.simply.aso' => 'aso',
+        'application/vnd.accpac.simply.imp' => 'imp',
+        'application/vnd.acucobol' => 'acu',
+        'application/vnd.acucorp' => 'atc',
+        'application/vnd.adobe.air-application-installer-package+zip' => 'air',
+        'application/vnd.adobe.formscentral.fcdt' => 'fcdt',
+        'application/vnd.adobe.fxp' => 'fxp',
+        'application/vnd.adobe.xdp+xml' => 'xdp',
+        'application/vnd.adobe.xfdf' => 'xfdf',
+        'application/vnd.ahead.space' => 'ahead',
+        'application/vnd.airzip.filesecure.azf' => 'azf',
+        'application/vnd.airzip.filesecure.azs' => 'azs',
+        'application/vnd.amazon.ebook' => 'azw',
+        'application/vnd.americandynamics.acc' => 'acc',
+        'application/vnd.amiga.ami' => 'ami',
+        'application/vnd.android.package-archive' => 'apk',
+        'application/vnd.anser-web-certificate-issue-initiation' => 'cii',
+        'application/vnd.anser-web-funds-transfer-initiation' => 'fti',
+        'application/vnd.antix.game-component' => 'atx',
+        'application/vnd.apple.installer+xml' => 'mpkg',
+        'application/vnd.apple.mpegurl' => 'm3u8',
+        'application/vnd.aristanetworks.swi' => 'swi',
+        'application/vnd.astraea-software.iota' => 'iota',
+        'application/vnd.audiograph' => 'aep',
+        'application/vnd.blueice.multipass' => 'mpm',
+        'application/vnd.bmi' => 'bmi',
+        'application/vnd.businessobjects' => 'rep',
+        'application/vnd.chemdraw+xml' => 'cdxml',
+        'application/vnd.chipnuts.karaoke-mmd' => 'mmd',
+        'application/vnd.cinderella' => 'cdy',
+        'application/vnd.claymore' => 'cla',
+        'application/vnd.cloanto.rp9' => 'rp9',
+        'application/vnd.clonk.c4group' => 'c4g',
+        'application/vnd.cluetrust.cartomobile-config' => 'c11amc',
+        'application/vnd.cluetrust.cartomobile-config-pkg' => 'c11amz',
+        'application/vnd.commonspace' => 'csp',
+        'application/vnd.contact.cmsg' => 'cdbcmsg',
+        'application/vnd.cosmocaller' => 'cmc',
+        'application/vnd.crick.clicker' => 'clkx',
+        'application/vnd.crick.clicker.keyboard' => 'clkk',
+        'application/vnd.crick.clicker.palette' => 'clkp',
+        'application/vnd.crick.clicker.template' => 'clkt',
+        'application/vnd.crick.clicker.wordbank' => 'clkw',
+        'application/vnd.criticaltools.wbs+xml' => 'wbs',
+        'application/vnd.ctc-posml' => 'pml',
+        'application/vnd.cups-ppd' => 'ppd',
+        'application/vnd.curl.car' => 'car',
+        'application/vnd.curl.pcurl' => 'pcurl',
+        'application/vnd.dart' => 'dart',
+        'application/vnd.data-vision.rdz' => 'rdz',
+        'application/vnd.dece.data' => 'uvf',
+        'application/vnd.dece.ttml+xml' => 'uvt',
+        'application/vnd.dece.unspecified' => 'uvx',
+        'application/vnd.dece.zip' => 'uvz',
+        'application/vnd.denovo.fcselayout-link' => 'fe_launch',
+        'application/vnd.dna' => 'dna',
+        'application/vnd.dolby.mlp' => 'mlp',
+        'application/vnd.dpgraph' => 'dpg',
+        'application/vnd.dreamfactory' => 'dfac',
+        'application/vnd.ds-keypoint' => 'kpxx',
+        'application/vnd.dvb.ait' => 'ait',
+        'application/vnd.dvb.service' => 'svc',
+        'application/vnd.dynageo' => 'geo',
+        'application/vnd.ecowin.chart' => 'mag',
+        'application/vnd.enliven' => 'nml',
+        'application/vnd.epson.esf' => 'esf',
+        'application/vnd.epson.msf' => 'msf',
+        'application/vnd.epson.quickanime' => 'qam',
+        'application/vnd.epson.salt' => 'slt',
+        'application/vnd.epson.ssf' => 'ssf',
+        'application/vnd.eszigno3+xml' => 'es3',
+        'application/vnd.ezpix-album' => 'ez2',
+        'application/vnd.ezpix-package' => 'ez3',
+        'application/vnd.fdf' => 'fdf',
+        'application/vnd.fdsn.mseed' => 'mseed',
+        'application/vnd.fdsn.seed' => 'seed',
+        'application/vnd.flographit' => 'gph',
+        'application/vnd.fluxtime.clip' => 'ftc',
+        'application/vnd.framemaker' => 'fm',
+        'application/vnd.frogans.fnc' => 'fnc',
+        'application/vnd.frogans.ltf' => 'ltf',
+        'application/vnd.fsc.weblaunch' => 'fsc',
+        'application/vnd.fujitsu.oasys' => 'oas',
+        'application/vnd.fujitsu.oasys2' => 'oa2',
+        'application/vnd.fujitsu.oasys3' => 'oa3',
+        'application/vnd.fujitsu.oasysgp' => 'fg5',
+        'application/vnd.fujitsu.oasysprs' => 'bh2',
+        'application/vnd.fujixerox.ddd' => 'ddd',
+        'application/vnd.fujixerox.docuworks' => 'xdw',
+        'application/vnd.fujixerox.docuworks.binder' => 'xbd',
+        'application/vnd.fuzzysheet' => 'fzs',
+        'application/vnd.genomatix.tuxedo' => 'txd',
+        'application/vnd.geogebra.file' => 'ggb',
+        'application/vnd.geogebra.tool' => 'ggt',
+        'application/vnd.geometry-explorer' => 'gex',
+        'application/vnd.geonext' => 'gxt',
+        'application/vnd.geoplan' => 'g2w',
+        'application/vnd.geospace' => 'g3w',
+        'application/vnd.gmx' => 'gmx',
+        'application/vnd.google-earth.kml+xml' => 'kml',
+        'application/vnd.google-earth.kmz' => 'kmz',
+        'application/vnd.grafeq' => 'gqf',
+        'application/vnd.groove-account' => 'gac',
+        'application/vnd.groove-help' => 'ghf',
+        'application/vnd.groove-identity-message' => 'gim',
+        'application/vnd.groove-injector' => 'grv',
+        'application/vnd.groove-tool-message' => 'gtm',
+        'application/vnd.groove-tool-template' => 'tpl',
+        'application/vnd.groove-vcard' => 'vcg',
+        'application/vnd.hal+xml' => 'hal',
+        'application/vnd.handheld-entertainment+xml' => 'zmm',
+        'application/vnd.hbci' => 'hbci',
+        'application/vnd.hhe.lesson-player' => 'les',
+        'application/vnd.hp-hpgl' => 'hpgl',
+        'application/vnd.hp-hpid' => 'hpid',
+        'application/vnd.hp-hps' => 'hps',
+        'application/vnd.hp-jlyt' => 'jlt',
+        'application/vnd.hp-pcl' => 'pcl',
+        'application/vnd.hp-pclxl' => 'pclxl',
+        'application/vnd.hydrostatix.sof-data' => 'sfd-hdstx',
+        'application/vnd.ibm.minipay' => 'mpy',
+        'application/vnd.ibm.modcap' => 'afp',
+        'application/vnd.ibm.rights-management' => 'irm',
+        'application/vnd.ibm.secure-container' => 'sc',
+        'application/vnd.iccprofile' => 'icc',
+        'application/vnd.igloader' => 'igl',
+        'application/vnd.immervision-ivp' => 'ivp',
+        'application/vnd.immervision-ivu' => 'ivu',
+        'application/vnd.insors.igm' => 'igm',
+        'application/vnd.intercon.formnet' => 'xpw',
+        'application/vnd.intergeo' => 'i2g',
+        'application/vnd.intu.qbo' => 'qbo',
+        'application/vnd.intu.qfx' => 'qfx',
+        'application/vnd.ipunplugged.rcprofile' => 'rcprofile',
+        'application/vnd.irepository.package+xml' => 'irp',
+        'application/vnd.is-xpr' => 'xpr',
+        'application/vnd.isac.fcs' => 'fcs',
+        'application/vnd.jam' => 'jam',
+        'application/vnd.jcp.javame.midlet-rms' => 'rms',
+        'application/vnd.jisp' => 'jisp',
+        'application/vnd.joost.joda-archive' => 'joda',
+        'application/vnd.kahootz' => 'ktz',
+        'application/vnd.kde.karbon' => 'karbon',
+        'application/vnd.kde.kchart' => 'chrt',
+        'application/vnd.kde.kformula' => 'kfo',
+        'application/vnd.kde.kivio' => 'flw',
+        'application/vnd.kde.kontour' => 'kon',
+        'application/vnd.kde.kpresenter' => 'kpr',
+        'application/vnd.kde.kspread' => 'ksp',
+        'application/vnd.kde.kword' => 'kwd',
+        'application/vnd.kenameaapp' => 'htke',
+        'application/vnd.kidspiration' => 'kia',
+        'application/vnd.kinar' => 'kne',
+        'application/vnd.koan' => 'skp',
+        'application/vnd.kodak-descriptor' => 'sse',
+        'application/vnd.las.las+xml' => 'lasxml',
+        'application/vnd.llamagraphics.life-balance.desktop' => 'lbd',
+        'application/vnd.llamagraphics.life-balance.exchange+xml' => 'lbe',
+        'application/vnd.lotus-1-2-3' => '123',
+        'application/vnd.lotus-approach' => 'apr',
+        'application/vnd.lotus-freelance' => 'pre',
+        'application/vnd.lotus-notes' => 'nsf',
+        'application/vnd.lotus-organizer' => 'org',
+        'application/vnd.lotus-screencam' => 'scm',
+        'application/vnd.lotus-wordpro' => 'lwp',
+        'application/vnd.macports.portpkg' => 'portpkg',
+        'application/vnd.mcd' => 'mcd',
+        'application/vnd.medcalcdata' => 'mc1',
+        'application/vnd.mediastation.cdkey' => 'cdkey',
+        'application/vnd.mfer' => 'mwf',
+        'application/vnd.mfmp' => 'mfm',
+        'application/vnd.micrografx.flo' => 'flo',
+        'application/vnd.micrografx.igx' => 'igx',
+        'application/vnd.mif' => 'mif',
+        'application/vnd.mobius.daf' => 'daf',
+        'application/vnd.mobius.dis' => 'dis',
+        'application/vnd.mobius.mbk' => 'mbk',
+        'application/vnd.mobius.mqy' => 'mqy',
+        'application/vnd.mobius.msl' => 'msl',
+        'application/vnd.mobius.plc' => 'plc',
+        'application/vnd.mobius.txf' => 'txf',
+        'application/vnd.mophun.application' => 'mpn',
+        'application/vnd.mophun.certificate' => 'mpc',
+        'application/vnd.mozilla.xul+xml' => 'xul',
+        'application/vnd.ms-artgalry' => 'cil',
+        'application/vnd.ms-cab-compressed' => 'cab',
+        'application/vnd.ms-excel' => 'xls',
+        'application/vnd.ms-excel.addin.macroenabled.12' => 'xlam',
+        'application/vnd.ms-excel.sheet.binary.macroenabled.12' => 'xlsb',
+        'application/vnd.ms-excel.sheet.macroenabled.12' => 'xlsm',
+        'application/vnd.ms-excel.template.macroenabled.12' => 'xltm',
+        'application/vnd.ms-fontobject' => 'eot',
+        'application/vnd.ms-htmlhelp' => 'chm',
+        'application/vnd.ms-ims' => 'ims',
+        'application/vnd.ms-lrm' => 'lrm',
+        'application/vnd.ms-officetheme' => 'thmx',
+        'application/vnd.ms-pki.seccat' => 'cat',
+        'application/vnd.ms-pki.stl' => 'stl',
+        'application/vnd.ms-powerpoint' => 'ppt',
+        'application/vnd.ms-powerpoint.addin.macroenabled.12' => 'ppam',
+        'application/vnd.ms-powerpoint.presentation.macroenabled.12' => 'pptm',
+        'application/vnd.ms-powerpoint.slide.macroenabled.12' => 'sldm',
+        'application/vnd.ms-powerpoint.slideshow.macroenabled.12' => 'ppsm',
+        'application/vnd.ms-powerpoint.template.macroenabled.12' => 'potm',
+        'application/vnd.ms-project' => 'mpp',
+        'application/vnd.ms-word.document.macroenabled.12' => 'docm',
+        'application/vnd.ms-word.template.macroenabled.12' => 'dotm',
+        'application/vnd.ms-works' => 'wps',
+        'application/vnd.ms-wpl' => 'wpl',
+        'application/vnd.ms-xpsdocument' => 'xps',
+        'application/vnd.mseq' => 'mseq',
+        'application/vnd.musician' => 'mus',
+        'application/vnd.muvee.style' => 'msty',
+        'application/vnd.mynfc' => 'taglet',
+        'application/vnd.neurolanguage.nlu' => 'nlu',
+        'application/vnd.nitf' => 'ntf',
+        'application/vnd.noblenet-directory' => 'nnd',
+        'application/vnd.noblenet-sealer' => 'nns',
+        'application/vnd.noblenet-web' => 'nnw',
+        'application/vnd.nokia.n-gage.data' => 'ngdat',
+        'application/vnd.nokia.n-gage.symbian.install' => 'n-gage',
+        'application/vnd.nokia.radio-preset' => 'rpst',
+        'application/vnd.nokia.radio-presets' => 'rpss',
+        'application/vnd.novadigm.edm' => 'edm',
+        'application/vnd.novadigm.edx' => 'edx',
+        'application/vnd.novadigm.ext' => 'ext',
+        'application/vnd.oasis.opendocument.chart' => 'odc',
+        'application/vnd.oasis.opendocument.chart-template' => 'otc',
+        'application/vnd.oasis.opendocument.database' => 'odb',
+        'application/vnd.oasis.opendocument.formula' => 'odf',
+        'application/vnd.oasis.opendocument.formula-template' => 'odft',
+        'application/vnd.oasis.opendocument.graphics' => 'odg',
+        'application/vnd.oasis.opendocument.graphics-template' => 'otg',
+        'application/vnd.oasis.opendocument.image' => 'odi',
+        'application/vnd.oasis.opendocument.image-template' => 'oti',
+        'application/vnd.oasis.opendocument.presentation' => 'odp',
+        'application/vnd.oasis.opendocument.presentation-template' => 'otp',
+        'application/vnd.oasis.opendocument.spreadsheet' => 'ods',
+        'application/vnd.oasis.opendocument.spreadsheet-template' => 'ots',
+        'application/vnd.oasis.opendocument.text' => 'odt',
+        'application/vnd.oasis.opendocument.text-master' => 'odm',
+        'application/vnd.oasis.opendocument.text-template' => 'ott',
+        'application/vnd.oasis.opendocument.text-web' => 'oth',
+        'application/vnd.olpc-sugar' => 'xo',
+        'application/vnd.oma.dd2+xml' => 'dd2',
+        'application/vnd.openofficeorg.extension' => 'oxt',
+        'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'pptx',
+        'application/vnd.openxmlformats-officedocument.presentationml.slide' => 'sldx',
+        'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => 'ppsx',
+        'application/vnd.openxmlformats-officedocument.presentationml.template' => 'potx',
+        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'xlsx',
+        'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => 'xltx',
+        'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'docx',
+        'application/vnd.openxmlformats-officedocument.wordprocessingml.template' => 'dotx',
+        'application/vnd.osgeo.mapguide.package' => 'mgp',
+        'application/vnd.osgi.dp' => 'dp',
+        'application/vnd.osgi.subsystem' => 'esa',
+        'application/vnd.palm' => 'pdb',
+        'application/vnd.pawaafile' => 'paw',
+        'application/vnd.pg.format' => 'str',
+        'application/vnd.pg.osasli' => 'ei6',
+        'application/vnd.picsel' => 'efif',
+        'application/vnd.pmi.widget' => 'wg',
+        'application/vnd.pocketlearn' => 'plf',
+        'application/vnd.powerbuilder6' => 'pbd',
+        'application/vnd.previewsystems.box' => 'box',
+        'application/vnd.proteus.magazine' => 'mgz',
+        'application/vnd.publishare-delta-tree' => 'qps',
+        'application/vnd.pvi.ptid1' => 'ptid',
+        'application/vnd.quark.quarkxpress' => 'qxd',
+        'application/vnd.realvnc.bed' => 'bed',
+        'application/vnd.recordare.musicxml' => 'mxl',
+        'application/vnd.recordare.musicxml+xml' => 'musicxml',
+        'application/vnd.rig.cryptonote' => 'cryptonote',
+        'application/vnd.rim.cod' => 'cod',
+        'application/vnd.rn-realmedia' => 'rm',
+        'application/vnd.rn-realmedia-vbr' => 'rmvb',
+        'application/vnd.route66.link66+xml' => 'link66',
+        'application/vnd.sailingtracker.track' => 'st',
+        'application/vnd.seemail' => 'see',
+        'application/vnd.sema' => 'sema',
+        'application/vnd.semd' => 'semd',
+        'application/vnd.semf' => 'semf',
+        'application/vnd.shana.informed.formdata' => 'ifm',
+        'application/vnd.shana.informed.formtemplate' => 'itp',
+        'application/vnd.shana.informed.interchange' => 'iif',
+        'application/vnd.shana.informed.package' => 'ipk',
+        'application/vnd.simtech-mindmapper' => 'twd',
+        'application/vnd.smaf' => 'mmf',
+        'application/vnd.smart.teacher' => 'teacher',
+        'application/vnd.solent.sdkm+xml' => 'sdkm',
+        'application/vnd.spotfire.dxp' => 'dxp',
+        'application/vnd.spotfire.sfs' => 'sfs',
+        'application/vnd.stardivision.calc' => 'sdc',
+        'application/vnd.stardivision.draw' => 'sda',
+        'application/vnd.stardivision.impress' => 'sdd',
+        'application/vnd.stardivision.math' => 'smf',
+        'application/vnd.stardivision.writer' => 'sdw',
+        'application/vnd.stardivision.writer-global' => 'sgl',
+        'application/vnd.stepmania.package' => 'smzip',
+        'application/vnd.stepmania.stepchart' => 'sm',
+        'application/vnd.sun.xml.calc' => 'sxc',
+        'application/vnd.sun.xml.calc.template' => 'stc',
+        'application/vnd.sun.xml.draw' => 'sxd',
+        'application/vnd.sun.xml.draw.template' => 'std',
+        'application/vnd.sun.xml.impress' => 'sxi',
+        'application/vnd.sun.xml.impress.template' => 'sti',
+        'application/vnd.sun.xml.math' => 'sxm',
+        'application/vnd.sun.xml.writer' => 'sxw',
+        'application/vnd.sun.xml.writer.global' => 'sxg',
+        'application/vnd.sun.xml.writer.template' => 'stw',
+        'application/vnd.sus-calendar' => 'sus',
+        'application/vnd.svd' => 'svd',
+        'application/vnd.symbian.install' => 'sis',
+        'application/vnd.syncml+xml' => 'xsm',
+        'application/vnd.syncml.dm+wbxml' => 'bdm',
+        'application/vnd.syncml.dm+xml' => 'xdm',
+        'application/vnd.tao.intent-module-archive' => 'tao',
+        'application/vnd.tcpdump.pcap' => 'pcap',
+        'application/vnd.tmobile-livetv' => 'tmo',
+        'application/vnd.trid.tpt' => 'tpt',
+        'application/vnd.triscape.mxs' => 'mxs',
+        'application/vnd.trueapp' => 'tra',
+        'application/vnd.ufdl' => 'ufd',
+        'application/vnd.uiq.theme' => 'utz',
+        'application/vnd.umajin' => 'umj',
+        'application/vnd.unity' => 'unityweb',
+        'application/vnd.uoml+xml' => 'uoml',
+        'application/vnd.vcx' => 'vcx',
+        'application/vnd.visio' => 'vsd',
+        'application/vnd.visionary' => 'vis',
+        'application/vnd.vsf' => 'vsf',
+        'application/vnd.wap.wbxml' => 'wbxml',
+        'application/vnd.wap.wmlc' => 'wmlc',
+        'application/vnd.wap.wmlscriptc' => 'wmlsc',
+        'application/vnd.webturbo' => 'wtb',
+        'application/vnd.wolfram.player' => 'nbp',
+        'application/vnd.wordperfect' => 'wpd',
+        'application/vnd.wqd' => 'wqd',
+        'application/vnd.wt.stf' => 'stf',
+        'application/vnd.xara' => 'xar',
+        'application/vnd.xfdl' => 'xfdl',
+        'application/vnd.yamaha.hv-dic' => 'hvd',
+        'application/vnd.yamaha.hv-script' => 'hvs',
+        'application/vnd.yamaha.hv-voice' => 'hvp',
+        'application/vnd.yamaha.openscoreformat' => 'osf',
+        'application/vnd.yamaha.openscoreformat.osfpvg+xml' => 'osfpvg',
+        'application/vnd.yamaha.smaf-audio' => 'saf',
+        'application/vnd.yamaha.smaf-phrase' => 'spf',
+        'application/vnd.yellowriver-custom-menu' => 'cmp',
+        'application/vnd.zul' => 'zir',
+        'application/vnd.zzazz.deck+xml' => 'zaz',
+        'application/voicexml+xml' => 'vxml',
+        'application/widget' => 'wgt',
+        'application/winhlp' => 'hlp',
+        'application/wsdl+xml' => 'wsdl',
+        'application/wspolicy+xml' => 'wspolicy',
+        'application/x-7z-compressed' => '7z',
+        'application/x-abiword' => 'abw',
+        'application/x-ace-compressed' => 'ace',
+        'application/x-apple-diskimage' => 'dmg',
+        'application/x-authorware-bin' => 'aab',
+        'application/x-authorware-map' => 'aam',
+        'application/x-authorware-seg' => 'aas',
+        'application/x-bcpio' => 'bcpio',
+        'application/x-bittorrent' => 'torrent',
+        'application/x-blorb' => 'blb',
+        'application/x-bzip' => 'bz',
+        'application/x-bzip2' => 'bz2',
+        'application/x-cbr' => 'cbr',
+        'application/x-cdlink' => 'vcd',
+        'application/x-cfs-compressed' => 'cfs',
+        'application/x-chat' => 'chat',
+        'application/x-chess-pgn' => 'pgn',
+        'application/x-conference' => 'nsc',
+        'application/x-cpio' => 'cpio',
+        'application/x-csh' => 'csh',
+        'application/x-debian-package' => 'deb',
+        'application/x-dgc-compressed' => 'dgc',
+        'application/x-director' => 'dir',
+        'application/x-doom' => 'wad',
+        'application/x-dtbncx+xml' => 'ncx',
+        'application/x-dtbook+xml' => 'dtb',
+        'application/x-dtbresource+xml' => 'res',
+        'application/x-dvi' => 'dvi',
+        'application/x-envoy' => 'evy',
+        'application/x-eva' => 'eva',
+        'application/x-font-bdf' => 'bdf',
+        'application/x-font-ghostscript' => 'gsf',
+        'application/x-font-linux-psf' => 'psf',
+        'application/x-font-otf' => 'otf',
+        'application/x-font-pcf' => 'pcf',
+        'application/x-font-snf' => 'snf',
+        'application/x-font-ttf' => 'ttf',
+        'application/x-font-type1' => 'pfa',
+        'application/x-font-woff' => 'woff',
+        'application/x-freearc' => 'arc',
+        'application/x-futuresplash' => 'spl',
+        'application/x-gca-compressed' => 'gca',
+        'application/x-glulx' => 'ulx',
+        'application/x-gnumeric' => 'gnumeric',
+        'application/x-gramps-xml' => 'gramps',
+        'application/x-gtar' => 'gtar',
+        'application/x-hdf' => 'hdf',
+        'application/x-install-instructions' => 'install',
+        'application/x-iso9660-image' => 'iso',
+        'application/x-java-jnlp-file' => 'jnlp',
+        'application/x-latex' => 'latex',
+        'application/x-lzh-compressed' => 'lzh',
+        'application/x-mie' => 'mie',
+        'application/x-mobipocket-ebook' => 'prc',
+        'application/x-ms-application' => 'application',
+        'application/x-ms-shortcut' => 'lnk',
+        'application/x-ms-wmd' => 'wmd',
+        'application/x-ms-wmz' => 'wmz',
+        'application/x-ms-xbap' => 'xbap',
+        'application/x-msaccess' => 'mdb',
+        'application/x-msbinder' => 'obd',
+        'application/x-mscardfile' => 'crd',
+        'application/x-msclip' => 'clp',
+        'application/x-msdownload' => 'exe',
+        'application/x-msmediaview' => 'mvb',
+        'application/x-msmetafile' => 'wmf',
+        'application/x-msmoney' => 'mny',
+        'application/x-mspublisher' => 'pub',
+        'application/x-msschedule' => 'scd',
+        'application/x-msterminal' => 'trm',
+        'application/x-mswrite' => 'wri',
+        'application/x-netcdf' => 'nc',
+        'application/x-nzb' => 'nzb',
+        'application/x-pkcs12' => 'p12',
+        'application/x-pkcs7-certificates' => 'p7b',
+        'application/x-pkcs7-certreqresp' => 'p7r',
+        'application/x-rar-compressed' => 'rar',
+        'application/x-rar' => 'rar',
+        'application/x-research-info-systems' => 'ris',
+        'application/x-sh' => 'sh',
+        'application/x-shar' => 'shar',
+        'application/x-shockwave-flash' => 'swf',
+        'application/x-silverlight-app' => 'xap',
+        'application/x-sql' => 'sql',
+        'application/x-stuffit' => 'sit',
+        'application/x-stuffitx' => 'sitx',
+        'application/x-subrip' => 'srt',
+        'application/x-sv4cpio' => 'sv4cpio',
+        'application/x-sv4crc' => 'sv4crc',
+        'application/x-t3vm-image' => 't3',
+        'application/x-tads' => 'gam',
+        'application/x-tar' => 'tar',
+        'application/x-tcl' => 'tcl',
+        'application/x-tex' => 'tex',
+        'application/x-tex-tfm' => 'tfm',
+        'application/x-texinfo' => 'texinfo',
+        'application/x-tgif' => 'obj',
+        'application/x-ustar' => 'ustar',
+        'application/x-wais-source' => 'src',
+        'application/x-x509-ca-cert' => 'der',
+        'application/x-xfig' => 'fig',
+        'application/x-xliff+xml' => 'xlf',
+        'application/x-xpinstall' => 'xpi',
+        'application/x-xz' => 'xz',
+        'application/x-zmachine' => 'z1',
+        'application/xaml+xml' => 'xaml',
+        'application/xcap-diff+xml' => 'xdf',
+        'application/xenc+xml' => 'xenc',
+        'application/xhtml+xml' => 'xhtml',
+        'application/xml' => 'xml',
+        'application/xml-dtd' => 'dtd',
+        'application/xop+xml' => 'xop',
+        'application/xproc+xml' => 'xpl',
+        'application/xslt+xml' => 'xslt',
+        'application/xspf+xml' => 'xspf',
+        'application/xv+xml' => 'mxml',
+        'application/yang' => 'yang',
+        'application/yin+xml' => 'yin',
+        'application/zip' => 'zip',
+        'audio/adpcm' => 'adp',
+        'audio/basic' => 'au',
+        'audio/midi' => 'mid',
+        'audio/mp4' => 'mp4a',
+        'audio/mpeg' => 'mpga',
+        'audio/ogg' => 'oga',
+        'audio/s3m' => 's3m',
+        'audio/silk' => 'sil',
+        'audio/vnd.dece.audio' => 'uva',
+        'audio/vnd.digital-winds' => 'eol',
+        'audio/vnd.dra' => 'dra',
+        'audio/vnd.dts' => 'dts',
+        'audio/vnd.dts.hd' => 'dtshd',
+        'audio/vnd.lucent.voice' => 'lvp',
+        'audio/vnd.ms-playready.media.pya' => 'pya',
+        'audio/vnd.nuera.ecelp4800' => 'ecelp4800',
+        'audio/vnd.nuera.ecelp7470' => 'ecelp7470',
+        'audio/vnd.nuera.ecelp9600' => 'ecelp9600',
+        'audio/vnd.rip' => 'rip',
+        'audio/webm' => 'weba',
+        'audio/x-aac' => 'aac',
+        'audio/x-aiff' => 'aif',
+        'audio/x-caf' => 'caf',
+        'audio/x-flac' => 'flac',
+        'audio/x-matroska' => 'mka',
+        'audio/x-mpegurl' => 'm3u',
+        'audio/x-ms-wax' => 'wax',
+        'audio/x-ms-wma' => 'wma',
+        'audio/x-pn-realaudio' => 'ram',
+        'audio/x-pn-realaudio-plugin' => 'rmp',
+        'audio/x-wav' => 'wav',
+        'audio/xm' => 'xm',
+        'chemical/x-cdx' => 'cdx',
+        'chemical/x-cif' => 'cif',
+        'chemical/x-cmdf' => 'cmdf',
+        'chemical/x-cml' => 'cml',
+        'chemical/x-csml' => 'csml',
+        'chemical/x-xyz' => 'xyz',
+        'image/bmp' => 'bmp',
+        'image/x-ms-bmp' => 'bmp',
+        'image/cgm' => 'cgm',
+        'image/g3fax' => 'g3',
+        'image/gif' => 'gif',
+        'image/ief' => 'ief',
+        'image/jpeg' => 'jpeg',
+        'image/pjpeg' => 'jpeg',
+        'image/ktx' => 'ktx',
+        'image/png' => 'png',
+        'image/prs.btif' => 'btif',
+        'image/sgi' => 'sgi',
+        'image/svg+xml' => 'svg',
+        'image/tiff' => 'tiff',
+        'image/vnd.adobe.photoshop' => 'psd',
+        'image/vnd.dece.graphic' => 'uvi',
+        'image/vnd.dvb.subtitle' => 'sub',
+        'image/vnd.djvu' => 'djvu',
+        'image/vnd.dwg' => 'dwg',
+        'image/vnd.dxf' => 'dxf',
+        'image/vnd.fastbidsheet' => 'fbs',
+        'image/vnd.fpx' => 'fpx',
+        'image/vnd.fst' => 'fst',
+        'image/vnd.fujixerox.edmics-mmr' => 'mmr',
+        'image/vnd.fujixerox.edmics-rlc' => 'rlc',
+        'image/vnd.ms-modi' => 'mdi',
+        'image/vnd.ms-photo' => 'wdp',
+        'image/vnd.net-fpx' => 'npx',
+        'image/vnd.wap.wbmp' => 'wbmp',
+        'image/vnd.xiff' => 'xif',
+        'image/webp' => 'webp',
+        'image/x-3ds' => '3ds',
+        'image/x-cmu-raster' => 'ras',
+        'image/x-cmx' => 'cmx',
+        'image/x-freehand' => 'fh',
+        'image/x-icon' => 'ico',
+        'image/x-mrsid-image' => 'sid',
+        'image/x-pcx' => 'pcx',
+        'image/x-pict' => 'pic',
+        'image/x-portable-anymap' => 'pnm',
+        'image/x-portable-bitmap' => 'pbm',
+        'image/x-portable-graymap' => 'pgm',
+        'image/x-portable-pixmap' => 'ppm',
+        'image/x-rgb' => 'rgb',
+        'image/x-tga' => 'tga',
+        'image/x-xbitmap' => 'xbm',
+        'image/x-xpixmap' => 'xpm',
+        'image/x-xwindowdump' => 'xwd',
+        'message/rfc822' => 'eml',
+        'model/iges' => 'igs',
+        'model/mesh' => 'msh',
+        'model/vnd.collada+xml' => 'dae',
+        'model/vnd.dwf' => 'dwf',
+        'model/vnd.gdl' => 'gdl',
+        'model/vnd.gtw' => 'gtw',
+        'model/vnd.mts' => 'mts',
+        'model/vnd.vtu' => 'vtu',
+        'model/vrml' => 'wrl',
+        'model/x3d+binary' => 'x3db',
+        'model/x3d+vrml' => 'x3dv',
+        'model/x3d+xml' => 'x3d',
+        'text/cache-manifest' => 'appcache',
+        'text/calendar' => 'ics',
+        'text/css' => 'css',
+        'text/csv' => 'csv',
+        'text/html' => 'html',
+        'text/n3' => 'n3',
+        'text/plain' => 'txt',
+        'text/prs.lines.tag' => 'dsc',
+        'text/richtext' => 'rtx',
+        'text/rtf' => 'rtf',
+        'text/sgml' => 'sgml',
+        'text/tab-separated-values' => 'tsv',
+        'text/troff' => 't',
+        'text/turtle' => 'ttl',
+        'text/uri-list' => 'uri',
+        'text/vcard' => 'vcard',
+        'text/vnd.curl' => 'curl',
+        'text/vnd.curl.dcurl' => 'dcurl',
+        'text/vnd.curl.scurl' => 'scurl',
+        'text/vnd.curl.mcurl' => 'mcurl',
+        'text/vnd.dvb.subtitle' => 'sub',
+        'text/vnd.fly' => 'fly',
+        'text/vnd.fmi.flexstor' => 'flx',
+        'text/vnd.graphviz' => 'gv',
+        'text/vnd.in3d.3dml' => '3dml',
+        'text/vnd.in3d.spot' => 'spot',
+        'text/vnd.sun.j2me.app-descriptor' => 'jad',
+        'text/vnd.wap.wml' => 'wml',
+        'text/vnd.wap.wmlscript' => 'wmls',
+        'text/x-asm' => 's',
+        'text/x-c' => 'c',
+        'text/x-fortran' => 'f',
+        'text/x-pascal' => 'p',
+        'text/x-java-source' => 'java',
+        'text/x-opml' => 'opml',
+        'text/x-nfo' => 'nfo',
+        'text/x-setext' => 'etx',
+        'text/x-sfv' => 'sfv',
+        'text/x-uuencode' => 'uu',
+        'text/x-vcalendar' => 'vcs',
+        'text/x-vcard' => 'vcf',
+        'video/3gpp' => '3gp',
+        'video/3gpp2' => '3g2',
+        'video/h261' => 'h261',
+        'video/h263' => 'h263',
+        'video/h264' => 'h264',
+        'video/jpeg' => 'jpgv',
+        'video/jpm' => 'jpm',
+        'video/mj2' => 'mj2',
+        'video/mp4' => 'mp4',
+        'video/mpeg' => 'mpeg',
+        'video/ogg' => 'ogv',
+        'video/quicktime' => 'qt',
+        'video/vnd.dece.hd' => 'uvh',
+        'video/vnd.dece.mobile' => 'uvm',
+        'video/vnd.dece.pd' => 'uvp',
+        'video/vnd.dece.sd' => 'uvs',
+        'video/vnd.dece.video' => 'uvv',
+        'video/vnd.dvb.file' => 'dvb',
+        'video/vnd.fvt' => 'fvt',
+        'video/vnd.mpegurl' => 'mxu',
+        'video/vnd.ms-playready.media.pyv' => 'pyv',
+        'video/vnd.uvvu.mp4' => 'uvu',
+        'video/vnd.vivo' => 'viv',
+        'video/webm' => 'webm',
+        'video/x-f4v' => 'f4v',
+        'video/x-fli' => 'fli',
+        'video/x-flv' => 'flv',
+        'video/x-m4v' => 'm4v',
+        'video/x-matroska' => 'mkv',
+        'video/x-mng' => 'mng',
+        'video/x-ms-asf' => 'asf',
+        'video/x-ms-vob' => 'vob',
+        'video/x-ms-wm' => 'wm',
+        'video/x-ms-wmv' => 'wmv',
+        'video/x-ms-wmx' => 'wmx',
+        'video/x-ms-wvx' => 'wvx',
+        'video/x-msvideo' => 'avi',
+        'video/x-sgi-movie' => 'movie',
+        'video/x-smv' => 'smv',
+        'x-conference/x-cooltalk' => 'ice',
+    );
+
+    /**
+     * {@inheritdoc}
+     */
+    public function guess($mimeType)
+    {
+        return isset($this->defaultExtensions[$mimeType]) ? $this->defaultExtensions[$mimeType] : null;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesser.php
@@ -0,0 +1,144 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\File\MimeType;
+
+use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
+use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
+
+/**
+ * A singleton mime type guesser.
+ *
+ * By default, all mime type guessers provided by the framework are installed
+ * (if available on the current OS/PHP setup).
+ *
+ * You can register custom guessers by calling the register() method on the
+ * singleton instance. Custom guessers are always called before any default ones.
+ *
+ *     $guesser = MimeTypeGuesser::getInstance();
+ *     $guesser->register(new MyCustomMimeTypeGuesser());
+ *
+ * If you want to change the order of the default guessers, just re-register your
+ * preferred one as a custom one. The last registered guesser is preferred over
+ * previously registered ones.
+ *
+ * Re-registering a built-in guesser also allows you to configure it:
+ *
+ *     $guesser = MimeTypeGuesser::getInstance();
+ *     $guesser->register(new FileinfoMimeTypeGuesser('/path/to/magic/file'));
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class MimeTypeGuesser implements MimeTypeGuesserInterface
+{
+    /**
+     * The singleton instance.
+     *
+     * @var MimeTypeGuesser
+     */
+    private static $instance = null;
+
+    /**
+     * All registered MimeTypeGuesserInterface instances.
+     *
+     * @var array
+     */
+    protected $guessers = array();
+
+    /**
+     * Returns the singleton instance.
+     *
+     * @return MimeTypeGuesser
+     */
+    public static function getInstance()
+    {
+        if (null === self::$instance) {
+            self::$instance = new self();
+        }
+
+        return self::$instance;
+    }
+
+    /**
+     * Resets the singleton instance.
+     */
+    public static function reset()
+    {
+        self::$instance = null;
+    }
+
+    /**
+     * Registers all natively provided mime type guessers.
+     */
+    private function __construct()
+    {
+        if (FileBinaryMimeTypeGuesser::isSupported()) {
+            $this->register(new FileBinaryMimeTypeGuesser());
+        }
+
+        if (FileinfoMimeTypeGuesser::isSupported()) {
+            $this->register(new FileinfoMimeTypeGuesser());
+        }
+    }
+
+    /**
+     * Registers a new mime type guesser.
+     *
+     * When guessing, this guesser is preferred over previously registered ones.
+     *
+     * @param MimeTypeGuesserInterface $guesser
+     */
+    public function register(MimeTypeGuesserInterface $guesser)
+    {
+        array_unshift($this->guessers, $guesser);
+    }
+
+    /**
+     * Tries to guess the mime type of the given file.
+     *
+     * The file is passed to each registered mime type guesser in reverse order
+     * of their registration (last registered is queried first). Once a guesser
+     * returns a value that is not NULL, this method terminates and returns the
+     * value.
+     *
+     * @param string $path The path to the file
+     *
+     * @return string The mime type or NULL, if none could be guessed
+     *
+     * @throws \LogicException
+     * @throws FileNotFoundException
+     * @throws AccessDeniedException
+     */
+    public function guess($path)
+    {
+        if (!is_file($path)) {
+            throw new FileNotFoundException($path);
+        }
+
+        if (!is_readable($path)) {
+            throw new AccessDeniedException($path);
+        }
+
+        if (!$this->guessers) {
+            $msg = 'Unable to guess the mime type as no guessers are available';
+            if (!FileinfoMimeTypeGuesser::isSupported()) {
+                $msg .= ' (Did you enable the php_fileinfo extension?)';
+            }
+            throw new \LogicException($msg);
+        }
+
+        foreach ($this->guessers as $guesser) {
+            if (null !== $mimeType = $guesser->guess($path)) {
+                return $mimeType;
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesserInterface.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\File\MimeType;
+
+use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
+use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
+
+/**
+ * Guesses the mime type of a file.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+interface MimeTypeGuesserInterface
+{
+    /**
+     * Guesses the mime type of the file with the given path.
+     *
+     * @param string $path The path to the file
+     *
+     * @return string The mime type or NULL, if none could be guessed
+     *
+     * @throws FileNotFoundException If the file does not exist
+     * @throws AccessDeniedException If the file could not be read
+     */
+    public function guess($path);
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/File/UploadedFile.php
@@ -0,0 +1,293 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\File;
+
+use Symfony\Component\HttpFoundation\File\Exception\FileException;
+use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
+use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;
+
+/**
+ * A file uploaded through a form.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ * @author Florian Eckerstorfer <florian@eckerstorfer.org>
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class UploadedFile extends File
+{
+    /**
+     * Whether the test mode is activated.
+     *
+     * Local files are used in test mode hence the code should not enforce HTTP uploads.
+     *
+     * @var bool
+     */
+    private $test = false;
+
+    /**
+     * The original name of the uploaded file.
+     *
+     * @var string
+     */
+    private $originalName;
+
+    /**
+     * The mime type provided by the uploader.
+     *
+     * @var string
+     */
+    private $mimeType;
+
+    /**
+     * The file size provided by the uploader.
+     *
+     * @var int|null
+     */
+    private $size;
+
+    /**
+     * The UPLOAD_ERR_XXX constant provided by the uploader.
+     *
+     * @var int
+     */
+    private $error;
+
+    /**
+     * Accepts the information of the uploaded file as provided by the PHP global $_FILES.
+     *
+     * The file object is only created when the uploaded file is valid (i.e. when the
+     * isValid() method returns true). Otherwise the only methods that could be called
+     * on an UploadedFile instance are:
+     *
+     *   * getClientOriginalName,
+     *   * getClientMimeType,
+     *   * isValid,
+     *   * getError.
+     *
+     * Calling any other method on an non-valid instance will cause an unpredictable result.
+     *
+     * @param string      $path         The full temporary path to the file
+     * @param string      $originalName The original file name
+     * @param string|null $mimeType     The type of the file as provided by PHP; null defaults to application/octet-stream
+     * @param int|null    $size         The file size
+     * @param int|null    $error        The error constant of the upload (one of PHP's UPLOAD_ERR_XXX constants); null defaults to UPLOAD_ERR_OK
+     * @param bool        $test         Whether the test mode is active
+     *
+     * @throws FileException         If file_uploads is disabled
+     * @throws FileNotFoundException If the file does not exist
+     */
+    public function __construct($path, $originalName, $mimeType = null, $size = null, $error = null, $test = false)
+    {
+        $this->originalName = $this->getName($originalName);
+        $this->mimeType = $mimeType ?: 'application/octet-stream';
+        $this->size = $size;
+        $this->error = $error ?: UPLOAD_ERR_OK;
+        $this->test = (bool) $test;
+
+        parent::__construct($path, UPLOAD_ERR_OK === $this->error);
+    }
+
+    /**
+     * Returns the original file name.
+     *
+     * It is extracted from the request from which the file has been uploaded.
+     * Then it should not be considered as a safe value.
+     *
+     * @return string|null The original name
+     */
+    public function getClientOriginalName()
+    {
+        return $this->originalName;
+    }
+
+    /**
+     * Returns the original file extension.
+     *
+     * It is extracted from the original file name that was uploaded.
+     * Then it should not be considered as a safe value.
+     *
+     * @return string The extension
+     */
+    public function getClientOriginalExtension()
+    {
+        return pathinfo($this->originalName, PATHINFO_EXTENSION);
+    }
+
+    /**
+     * Returns the file mime type.
+     *
+     * The client mime type is extracted from the request from which the file
+     * was uploaded, so it should not be considered as a safe value.
+     *
+     * For a trusted mime type, use getMimeType() instead (which guesses the mime
+     * type based on the file content).
+     *
+     * @return string|null The mime type
+     *
+     * @see getMimeType()
+     */
+    public function getClientMimeType()
+    {
+        return $this->mimeType;
+    }
+
+    /**
+     * Returns the extension based on the client mime type.
+     *
+     * If the mime type is unknown, returns null.
+     *
+     * This method uses the mime type as guessed by getClientMimeType()
+     * to guess the file extension. As such, the extension returned
+     * by this method cannot be trusted.
+     *
+     * For a trusted extension, use guessExtension() instead (which guesses
+     * the extension based on the guessed mime type for the file).
+     *
+     * @return string|null The guessed extension or null if it cannot be guessed
+     *
+     * @see guessExtension()
+     * @see getClientMimeType()
+     */
+    public function guessClientExtension()
+    {
+        $type = $this->getClientMimeType();
+        $guesser = ExtensionGuesser::getInstance();
+
+        return $guesser->guess($type);
+    }
+
+    /**
+     * Returns the file size.
+     *
+     * It is extracted from the request from which the file has been uploaded.
+     * Then it should not be considered as a safe value.
+     *
+     * @return int|null The file size
+     */
+    public function getClientSize()
+    {
+        return $this->size;
+    }
+
+    /**
+     * Returns the upload error.
+     *
+     * If the upload was successful, the constant UPLOAD_ERR_OK is returned.
+     * Otherwise one of the other UPLOAD_ERR_XXX constants is returned.
+     *
+     * @return int The upload error
+     */
+    public function getError()
+    {
+        return $this->error;
+    }
+
+    /**
+     * Returns whether the file was uploaded successfully.
+     *
+     * @return bool True if the file has been uploaded with HTTP and no error occurred
+     */
+    public function isValid()
+    {
+        $isOk = $this->error === UPLOAD_ERR_OK;
+
+        return $this->test ? $isOk : $isOk && is_uploaded_file($this->getPathname());
+    }
+
+    /**
+     * Moves the file to a new location.
+     *
+     * @param string $directory The destination folder
+     * @param string $name      The new file name
+     *
+     * @return File A File object representing the new file
+     *
+     * @throws FileException if, for any reason, the file could not have been moved
+     */
+    public function move($directory, $name = null)
+    {
+        if ($this->isValid()) {
+            if ($this->test) {
+                return parent::move($directory, $name);
+            }
+
+            $target = $this->getTargetFile($directory, $name);
+
+            if (!@move_uploaded_file($this->getPathname(), $target)) {
+                $error = error_get_last();
+                throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $target, strip_tags($error['message'])));
+            }
+
+            @chmod($target, 0666 & ~umask());
+
+            return $target;
+        }
+
+        throw new FileException($this->getErrorMessage());
+    }
+
+    /**
+     * Returns the maximum size of an uploaded file as configured in php.ini.
+     *
+     * @return int The maximum size of an uploaded file in bytes
+     */
+    public static function getMaxFilesize()
+    {
+        $iniMax = strtolower(ini_get('upload_max_filesize'));
+
+        if ('' === $iniMax) {
+            return PHP_INT_MAX;
+        }
+
+        $max = ltrim($iniMax, '+');
+        if (0 === strpos($max, '0x')) {
+            $max = intval($max, 16);
+        } elseif (0 === strpos($max, '0')) {
+            $max = intval($max, 8);
+        } else {
+            $max = (int) $max;
+        }
+
+        switch (substr($iniMax, -1)) {
+            case 't': $max *= 1024;
+            case 'g': $max *= 1024;
+            case 'm': $max *= 1024;
+            case 'k': $max *= 1024;
+        }
+
+        return $max;
+    }
+
+    /**
+     * Returns an informative upload error message.
+     *
+     * @return string The error message regarding the specified error code
+     */
+    public function getErrorMessage()
+    {
+        static $errors = array(
+            UPLOAD_ERR_INI_SIZE => 'The file "%s" exceeds your upload_max_filesize ini directive (limit is %d KiB).',
+            UPLOAD_ERR_FORM_SIZE => 'The file "%s" exceeds the upload limit defined in your form.',
+            UPLOAD_ERR_PARTIAL => 'The file "%s" was only partially uploaded.',
+            UPLOAD_ERR_NO_FILE => 'No file was uploaded.',
+            UPLOAD_ERR_CANT_WRITE => 'The file "%s" could not be written on disk.',
+            UPLOAD_ERR_NO_TMP_DIR => 'File could not be uploaded: missing temporary directory.',
+            UPLOAD_ERR_EXTENSION => 'File upload was stopped by a PHP extension.',
+        );
+
+        $errorCode = $this->error;
+        $maxFilesize = $errorCode === UPLOAD_ERR_INI_SIZE ? self::getMaxFilesize() / 1024 : 0;
+        $message = isset($errors[$errorCode]) ? $errors[$errorCode] : 'The file "%s" was not uploaded due to an unknown error.';
+
+        return sprintf($message, $this->getClientOriginalName(), $maxFilesize);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/FileBag.php
@@ -0,0 +1,145 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+use Symfony\Component\HttpFoundation\File\UploadedFile;
+
+/**
+ * FileBag is a container for uploaded files.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
+ */
+class FileBag extends ParameterBag
+{
+    private static $fileKeys = array('error', 'name', 'size', 'tmp_name', 'type');
+
+    /**
+     * Constructor.
+     *
+     * @param array $parameters An array of HTTP files
+     */
+    public function __construct(array $parameters = array())
+    {
+        $this->replace($parameters);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function replace(array $files = array())
+    {
+        $this->parameters = array();
+        $this->add($files);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($key, $value)
+    {
+        if (!is_array($value) && !$value instanceof UploadedFile) {
+            throw new \InvalidArgumentException('An uploaded file must be an array or an instance of UploadedFile.');
+        }
+
+        parent::set($key, $this->convertFileInformation($value));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function add(array $files = array())
+    {
+        foreach ($files as $key => $file) {
+            $this->set($key, $file);
+        }
+    }
+
+    /**
+     * Converts uploaded files to UploadedFile instances.
+     *
+     * @param array|UploadedFile $file A (multi-dimensional) array of uploaded file information
+     *
+     * @return array A (multi-dimensional) array of UploadedFile instances
+     */
+    protected function convertFileInformation($file)
+    {
+        if ($file instanceof UploadedFile) {
+            return $file;
+        }
+
+        $file = $this->fixPhpFilesArray($file);
+        if (is_array($file)) {
+            $keys = array_keys($file);
+            sort($keys);
+
+            if ($keys == self::$fileKeys) {
+                if (UPLOAD_ERR_NO_FILE == $file['error']) {
+                    $file = null;
+                } else {
+                    $file = new UploadedFile($file['tmp_name'], $file['name'], $file['type'], $file['size'], $file['error']);
+                }
+            } else {
+                $file = array_map(array($this, 'convertFileInformation'), $file);
+            }
+        }
+
+        return $file;
+    }
+
+    /**
+     * Fixes a malformed PHP $_FILES array.
+     *
+     * PHP has a bug that the format of the $_FILES array differs, depending on
+     * whether the uploaded file fields had normal field names or array-like
+     * field names ("normal" vs. "parent[child]").
+     *
+     * This method fixes the array to look like the "normal" $_FILES array.
+     *
+     * It's safe to pass an already converted array, in which case this method
+     * just returns the original array unmodified.
+     *
+     * @param array $data
+     *
+     * @return array
+     */
+    protected function fixPhpFilesArray($data)
+    {
+        if (!is_array($data)) {
+            return $data;
+        }
+
+        $keys = array_keys($data);
+        sort($keys);
+
+        if (self::$fileKeys != $keys || !isset($data['name']) || !is_array($data['name'])) {
+            return $data;
+        }
+
+        $files = $data;
+        foreach (self::$fileKeys as $k) {
+            unset($files[$k]);
+        }
+
+        foreach ($data['name'] as $key => $name) {
+            $files[$key] = $this->fixPhpFilesArray(array(
+                'error' => $data['error'][$key],
+                'name' => $name,
+                'type' => $data['type'][$key],
+                'tmp_name' => $data['tmp_name'][$key],
+                'size' => $data['size'][$key],
+            ));
+        }
+
+        return $files;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/HeaderBag.php
@@ -0,0 +1,324 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+/**
+ * HeaderBag is a container for HTTP headers.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class HeaderBag implements \IteratorAggregate, \Countable
+{
+    protected $headers = array();
+    protected $cacheControl = array();
+
+    /**
+     * Constructor.
+     *
+     * @param array $headers An array of HTTP headers
+     */
+    public function __construct(array $headers = array())
+    {
+        foreach ($headers as $key => $values) {
+            $this->set($key, $values);
+        }
+    }
+
+    /**
+     * Returns the headers as a string.
+     *
+     * @return string The headers
+     */
+    public function __toString()
+    {
+        if (!$this->headers) {
+            return '';
+        }
+
+        $max = max(array_map('strlen', array_keys($this->headers))) + 1;
+        $content = '';
+        ksort($this->headers);
+        foreach ($this->headers as $name => $values) {
+            $name = implode('-', array_map('ucfirst', explode('-', $name)));
+            foreach ($values as $value) {
+                $content .= sprintf("%-{$max}s %s\r\n", $name.':', $value);
+            }
+        }
+
+        return $content;
+    }
+
+    /**
+     * Returns the headers.
+     *
+     * @return array An array of headers
+     */
+    public function all()
+    {
+        return $this->headers;
+    }
+
+    /**
+     * Returns the parameter keys.
+     *
+     * @return array An array of parameter keys
+     */
+    public function keys()
+    {
+        return array_keys($this->headers);
+    }
+
+    /**
+     * Replaces the current HTTP headers by a new set.
+     *
+     * @param array $headers An array of HTTP headers
+     */
+    public function replace(array $headers = array())
+    {
+        $this->headers = array();
+        $this->add($headers);
+    }
+
+    /**
+     * Adds new headers the current HTTP headers set.
+     *
+     * @param array $headers An array of HTTP headers
+     */
+    public function add(array $headers)
+    {
+        foreach ($headers as $key => $values) {
+            $this->set($key, $values);
+        }
+    }
+
+    /**
+     * Returns a header value by name.
+     *
+     * @param string $key     The header name
+     * @param mixed  $default The default value
+     * @param bool   $first   Whether to return the first value or all header values
+     *
+     * @return string|array The first header value if $first is true, an array of values otherwise
+     */
+    public function get($key, $default = null, $first = true)
+    {
+        $key = str_replace('_', '-', strtolower($key));
+
+        if (!array_key_exists($key, $this->headers)) {
+            if (null === $default) {
+                return $first ? null : array();
+            }
+
+            return $first ? $default : array($default);
+        }
+
+        if ($first) {
+            return count($this->headers[$key]) ? $this->headers[$key][0] : $default;
+        }
+
+        return $this->headers[$key];
+    }
+
+    /**
+     * Sets a header by name.
+     *
+     * @param string       $key     The key
+     * @param string|array $values  The value or an array of values
+     * @param bool         $replace Whether to replace the actual value or not (true by default)
+     */
+    public function set($key, $values, $replace = true)
+    {
+        $key = str_replace('_', '-', strtolower($key));
+
+        $values = array_values((array) $values);
+
+        if (true === $replace || !isset($this->headers[$key])) {
+            $this->headers[$key] = $values;
+        } else {
+            $this->headers[$key] = array_merge($this->headers[$key], $values);
+        }
+
+        if ('cache-control' === $key) {
+            $this->cacheControl = $this->parseCacheControl($values[0]);
+        }
+    }
+
+    /**
+     * Returns true if the HTTP header is defined.
+     *
+     * @param string $key The HTTP header
+     *
+     * @return bool true if the parameter exists, false otherwise
+     */
+    public function has($key)
+    {
+        return array_key_exists(str_replace('_', '-', strtolower($key)), $this->headers);
+    }
+
+    /**
+     * Returns true if the given HTTP header contains the given value.
+     *
+     * @param string $key   The HTTP header name
+     * @param string $value The HTTP value
+     *
+     * @return bool true if the value is contained in the header, false otherwise
+     */
+    public function contains($key, $value)
+    {
+        return in_array($value, $this->get($key, null, false));
+    }
+
+    /**
+     * Removes a header.
+     *
+     * @param string $key The HTTP header name
+     */
+    public function remove($key)
+    {
+        $key = str_replace('_', '-', strtolower($key));
+
+        unset($this->headers[$key]);
+
+        if ('cache-control' === $key) {
+            $this->cacheControl = array();
+        }
+    }
+
+    /**
+     * Returns the HTTP header value converted to a date.
+     *
+     * @param string    $key     The parameter key
+     * @param \DateTime $default The default value
+     *
+     * @return null|\DateTime The parsed DateTime or the default value if the header does not exist
+     *
+     * @throws \RuntimeException When the HTTP header is not parseable
+     */
+    public function getDate($key, \DateTime $default = null)
+    {
+        if (null === $value = $this->get($key)) {
+            return $default;
+        }
+
+        if (false === $date = \DateTime::createFromFormat(DATE_RFC2822, $value)) {
+            throw new \RuntimeException(sprintf('The %s HTTP header is not parseable (%s).', $key, $value));
+        }
+
+        return $date;
+    }
+
+    /**
+     * Adds a custom Cache-Control directive.
+     *
+     * @param string $key   The Cache-Control directive name
+     * @param mixed  $value The Cache-Control directive value
+     */
+    public function addCacheControlDirective($key, $value = true)
+    {
+        $this->cacheControl[$key] = $value;
+
+        $this->set('Cache-Control', $this->getCacheControlHeader());
+    }
+
+    /**
+     * Returns true if the Cache-Control directive is defined.
+     *
+     * @param string $key The Cache-Control directive
+     *
+     * @return bool true if the directive exists, false otherwise
+     */
+    public function hasCacheControlDirective($key)
+    {
+        return array_key_exists($key, $this->cacheControl);
+    }
+
+    /**
+     * Returns a Cache-Control directive value by name.
+     *
+     * @param string $key The directive name
+     *
+     * @return mixed|null The directive value if defined, null otherwise
+     */
+    public function getCacheControlDirective($key)
+    {
+        return array_key_exists($key, $this->cacheControl) ? $this->cacheControl[$key] : null;
+    }
+
+    /**
+     * Removes a Cache-Control directive.
+     *
+     * @param string $key The Cache-Control directive
+     */
+    public function removeCacheControlDirective($key)
+    {
+        unset($this->cacheControl[$key]);
+
+        $this->set('Cache-Control', $this->getCacheControlHeader());
+    }
+
+    /**
+     * Returns an iterator for headers.
+     *
+     * @return \ArrayIterator An \ArrayIterator instance
+     */
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->headers);
+    }
+
+    /**
+     * Returns the number of headers.
+     *
+     * @return int The number of headers
+     */
+    public function count()
+    {
+        return count($this->headers);
+    }
+
+    protected function getCacheControlHeader()
+    {
+        $parts = array();
+        ksort($this->cacheControl);
+        foreach ($this->cacheControl as $key => $value) {
+            if (true === $value) {
+                $parts[] = $key;
+            } else {
+                if (preg_match('#[^a-zA-Z0-9._-]#', $value)) {
+                    $value = '"'.$value.'"';
+                }
+
+                $parts[] = "$key=$value";
+            }
+        }
+
+        return implode(', ', $parts);
+    }
+
+    /**
+     * Parses a Cache-Control HTTP header.
+     *
+     * @param string $header The value of the Cache-Control HTTP header
+     *
+     * @return array An array representing the attribute values
+     */
+    protected function parseCacheControl($header)
+    {
+        $cacheControl = array();
+        preg_match_all('#([a-zA-Z][a-zA-Z_-]*)\s*(?:=(?:"([^"]*)"|([^ \t",;]*)))?#', $header, $matches, PREG_SET_ORDER);
+        foreach ($matches as $match) {
+            $cacheControl[strtolower($match[1])] = isset($match[3]) ? $match[3] : (isset($match[2]) ? $match[2] : true);
+        }
+
+        return $cacheControl;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/IpUtils.php
@@ -0,0 +1,136 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+/**
+ * Http utility functions.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class IpUtils
+{
+    /**
+     * This class should not be instantiated.
+     */
+    private function __construct()
+    {
+    }
+
+    /**
+     * Checks if an IPv4 or IPv6 address is contained in the list of given IPs or subnets.
+     *
+     * @param string       $requestIp IP to check
+     * @param string|array $ips       List of IPs or subnets (can be a string if only a single one)
+     *
+     * @return bool Whether the IP is valid
+     */
+    public static function checkIp($requestIp, $ips)
+    {
+        if (!is_array($ips)) {
+            $ips = array($ips);
+        }
+
+        $method = substr_count($requestIp, ':') > 1 ? 'checkIp6' : 'checkIp4';
+
+        foreach ($ips as $ip) {
+            if (self::$method($requestIp, $ip)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Compares two IPv4 addresses.
+     * In case a subnet is given, it checks if it contains the request IP.
+     *
+     * @param string $requestIp IPv4 address to check
+     * @param string $ip        IPv4 address or subnet in CIDR notation
+     *
+     * @return bool Whether the request IP matches the IP, or whether the request IP is within the CIDR subnet
+     */
+    public static function checkIp4($requestIp, $ip)
+    {
+        if (!filter_var($requestIp, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
+            return false;
+        }
+
+        if (false !== strpos($ip, '/')) {
+            list($address, $netmask) = explode('/', $ip, 2);
+
+            if ($netmask === '0') {
+                return filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
+            }
+
+            if ($netmask < 0 || $netmask > 32) {
+                return false;
+            }
+        } else {
+            $address = $ip;
+            $netmask = 32;
+        }
+
+        return 0 === substr_compare(sprintf('%032b', ip2long($requestIp)), sprintf('%032b', ip2long($address)), 0, $netmask);
+    }
+
+    /**
+     * Compares two IPv6 addresses.
+     * In case a subnet is given, it checks if it contains the request IP.
+     *
+     * @author David Soria Parra <dsp at php dot net>
+     *
+     * @see https://github.com/dsp/v6tools
+     *
+     * @param string $requestIp IPv6 address to check
+     * @param string $ip        IPv6 address or subnet in CIDR notation
+     *
+     * @return bool Whether the IP is valid
+     *
+     * @throws \RuntimeException When IPV6 support is not enabled
+     */
+    public static function checkIp6($requestIp, $ip)
+    {
+        if (!((extension_loaded('sockets') && defined('AF_INET6')) || @inet_pton('::1'))) {
+            throw new \RuntimeException('Unable to check Ipv6. Check that PHP was not compiled with option "disable-ipv6".');
+        }
+
+        if (false !== strpos($ip, '/')) {
+            list($address, $netmask) = explode('/', $ip, 2);
+
+            if ($netmask < 1 || $netmask > 128) {
+                return false;
+            }
+        } else {
+            $address = $ip;
+            $netmask = 128;
+        }
+
+        $bytesAddr = unpack('n*', @inet_pton($address));
+        $bytesTest = unpack('n*', @inet_pton($requestIp));
+
+        if (!$bytesAddr || !$bytesTest) {
+            return false;
+        }
+
+        for ($i = 1, $ceil = ceil($netmask / 16); $i <= $ceil; ++$i) {
+            $left = $netmask - 16 * ($i - 1);
+            $left = ($left <= 16) ? $left : 16;
+            $mask = ~(0xffff >> $left) & 0xffff;
+            if (($bytesAddr[$i] & $mask) != ($bytesTest[$i] & $mask)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/JsonResponse.php
@@ -0,0 +1,218 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+/**
+ * Response represents an HTTP response in JSON format.
+ *
+ * Note that this class does not force the returned JSON content to be an
+ * object. It is however recommended that you do return an object as it
+ * protects yourself against XSSI and JSON-JavaScript Hijacking.
+ *
+ * @see https://www.owasp.org/index.php/OWASP_AJAX_Security_Guidelines#Always_return_JSON_with_an_Object_on_the_outside
+ *
+ * @author Igor Wiedler <igor@wiedler.ch>
+ */
+class JsonResponse extends Response
+{
+    protected $data;
+    protected $callback;
+
+    // Encode <, >, ', &, and " characters in the JSON, making it also safe to be embedded into HTML.
+    // 15 === JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT
+    protected $encodingOptions = 15;
+
+    /**
+     * Constructor.
+     *
+     * @param mixed $data    The response data
+     * @param int   $status  The response status code
+     * @param array $headers An array of response headers
+     */
+    public function __construct($data = null, $status = 200, $headers = array())
+    {
+        parent::__construct('', $status, $headers);
+
+        if (null === $data) {
+            $data = new \ArrayObject();
+        }
+
+        $this->setData($data);
+    }
+
+    /**
+     * Factory method for chainability.
+     *
+     * Example:
+     *
+     *     return JsonResponse::create($data, 200)
+     *         ->setSharedMaxAge(300);
+     *
+     * @param mixed $data    The json response data
+     * @param int   $status  The response status code
+     * @param array $headers An array of response headers
+     *
+     * @return JsonResponse
+     */
+    public static function create($data = null, $status = 200, $headers = array())
+    {
+        return new static($data, $status, $headers);
+    }
+
+    /**
+     * Sets the JSONP callback.
+     *
+     * @param string|null $callback The JSONP callback or null to use none
+     *
+     * @return JsonResponse
+     *
+     * @throws \InvalidArgumentException When the callback name is not valid
+     */
+    public function setCallback($callback = null)
+    {
+        if (null !== $callback) {
+            // partially token from http://www.geekality.net/2011/08/03/valid-javascript-identifier/
+            // partially token from https://github.com/willdurand/JsonpCallbackValidator
+            //      JsonpCallbackValidator is released under the MIT License. See https://github.com/willdurand/JsonpCallbackValidator/blob/v1.1.0/LICENSE for details.
+            //      (c) William Durand <william.durand1@gmail.com>
+            $pattern = '/^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{200C}\x{200D}]*(?:\[(?:"(?:\\\.|[^"\\\])*"|\'(?:\\\.|[^\'\\\])*\'|\d+)\])*?$/u';
+            $reserved = array(
+                'break', 'do', 'instanceof', 'typeof', 'case', 'else', 'new', 'var', 'catch', 'finally', 'return', 'void', 'continue', 'for', 'switch', 'while',
+                'debugger', 'function', 'this', 'with', 'default', 'if', 'throw', 'delete', 'in', 'try', 'class', 'enum', 'extends', 'super',  'const', 'export',
+                'import', 'implements', 'let', 'private', 'public', 'yield', 'interface', 'package', 'protected', 'static', 'null', 'true', 'false',
+            );
+            $parts = explode('.', $callback);
+            foreach ($parts as $part) {
+                if (!preg_match($pattern, $part) || in_array($part, $reserved, true)) {
+                    throw new \InvalidArgumentException('The callback name is not valid.');
+                }
+            }
+        }
+
+        $this->callback = $callback;
+
+        return $this->update();
+    }
+
+    /**
+     * Sets the data to be sent as JSON.
+     *
+     * @param mixed $data
+     *
+     * @return JsonResponse
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function setData($data = array())
+    {
+        if (defined('HHVM_VERSION')) {
+            // HHVM does not trigger any warnings and let exceptions
+            // thrown from a JsonSerializable object pass through.
+            // If only PHP did the same...
+            $data = json_encode($data, $this->encodingOptions);
+        } else {
+            try {
+                if (PHP_VERSION_ID < 50400) {
+                    // PHP 5.3 triggers annoying warnings for some
+                    // types that can't be serialized as JSON (INF, resources, etc.)
+                    // but doesn't provide the JsonSerializable interface.
+                    set_error_handler(function () { return false; });
+                    $data = @json_encode($data, $this->encodingOptions);
+                } else {
+                    // PHP 5.4 and up wrap exceptions thrown by JsonSerializable
+                    // objects in a new exception that needs to be removed.
+                    // Fortunately, PHP 5.5 and up do not trigger any warning anymore.
+                    if (PHP_VERSION_ID < 50500) {
+                        // Clear json_last_error()
+                        json_encode(null);
+                        $errorHandler = set_error_handler('var_dump');
+                        restore_error_handler();
+                        set_error_handler(function () use ($errorHandler) {
+                            if (JSON_ERROR_NONE === json_last_error()) {
+                                return $errorHandler && false !== call_user_func_array($errorHandler, func_get_args());
+                            }
+                        });
+                    }
+
+                    $data = json_encode($data, $this->encodingOptions);
+                }
+
+                if (PHP_VERSION_ID < 50500) {
+                    restore_error_handler();
+                }
+            } catch (\Exception $e) {
+                if (PHP_VERSION_ID < 50500) {
+                    restore_error_handler();
+                }
+                if (PHP_VERSION_ID >= 50400 && 'Exception' === get_class($e) && 0 === strpos($e->getMessage(), 'Failed calling ')) {
+                    throw $e->getPrevious() ?: $e;
+                }
+                throw $e;
+            }
+        }
+
+        if (JSON_ERROR_NONE !== json_last_error()) {
+            throw new \InvalidArgumentException(json_last_error_msg());
+        }
+
+        $this->data = $data;
+
+        return $this->update();
+    }
+
+    /**
+     * Returns options used while encoding data to JSON.
+     *
+     * @return int
+     */
+    public function getEncodingOptions()
+    {
+        return $this->encodingOptions;
+    }
+
+    /**
+     * Sets options used while encoding data to JSON.
+     *
+     * @param int $encodingOptions
+     *
+     * @return JsonResponse
+     */
+    public function setEncodingOptions($encodingOptions)
+    {
+        $this->encodingOptions = (int) $encodingOptions;
+
+        return $this->setData(json_decode($this->data));
+    }
+
+    /**
+     * Updates the content and headers according to the JSON data and callback.
+     *
+     * @return JsonResponse
+     */
+    protected function update()
+    {
+        if (null !== $this->callback) {
+            // Not using application/javascript for compatibility reasons with older browsers.
+            $this->headers->set('Content-Type', 'text/javascript');
+
+            return $this->setContent(sprintf('/**/%s(%s);', $this->callback, $this->data));
+        }
+
+        // Only set the header when there is none or when it equals 'text/javascript' (from a previous update with callback)
+        // in order to not overwrite a custom definition.
+        if (!$this->headers->has('Content-Type') || 'text/javascript' === $this->headers->get('Content-Type')) {
+            $this->headers->set('Content-Type', 'application/json');
+        }
+
+        return $this->setContent($this->data);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2016 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/symfony/http-foundation/ParameterBag.php
@@ -0,0 +1,312 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+/**
+ * ParameterBag is a container for key/value pairs.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ParameterBag implements \IteratorAggregate, \Countable
+{
+    /**
+     * Parameter storage.
+     *
+     * @var array
+     */
+    protected $parameters;
+
+    /**
+     * Constructor.
+     *
+     * @param array $parameters An array of parameters
+     */
+    public function __construct(array $parameters = array())
+    {
+        $this->parameters = $parameters;
+    }
+
+    /**
+     * Returns the parameters.
+     *
+     * @return array An array of parameters
+     */
+    public function all()
+    {
+        return $this->parameters;
+    }
+
+    /**
+     * Returns the parameter keys.
+     *
+     * @return array An array of parameter keys
+     */
+    public function keys()
+    {
+        return array_keys($this->parameters);
+    }
+
+    /**
+     * Replaces the current parameters by a new set.
+     *
+     * @param array $parameters An array of parameters
+     */
+    public function replace(array $parameters = array())
+    {
+        $this->parameters = $parameters;
+    }
+
+    /**
+     * Adds parameters.
+     *
+     * @param array $parameters An array of parameters
+     */
+    public function add(array $parameters = array())
+    {
+        $this->parameters = array_replace($this->parameters, $parameters);
+    }
+
+    /**
+     * Returns a parameter by name.
+     *
+     * Note: Finding deep items is deprecated since version 2.8, to be removed in 3.0.
+     *
+     * @param string $key     The key
+     * @param mixed  $default The default value if the parameter key does not exist
+     * @param bool   $deep    If true, a path like foo[bar] will find deeper items
+     *
+     * @return mixed
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function get($key, $default = null, $deep = false)
+    {
+        if ($deep) {
+            @trigger_error('Using paths to find deeper items in '.__METHOD__.' is deprecated since version 2.8 and will be removed in 3.0. Filter the returned value in your own code instead.', E_USER_DEPRECATED);
+        }
+
+        if (!$deep || false === $pos = strpos($key, '[')) {
+            return array_key_exists($key, $this->parameters) ? $this->parameters[$key] : $default;
+        }
+
+        $root = substr($key, 0, $pos);
+        if (!array_key_exists($root, $this->parameters)) {
+            return $default;
+        }
+
+        $value = $this->parameters[$root];
+        $currentKey = null;
+        for ($i = $pos, $c = strlen($key); $i < $c; ++$i) {
+            $char = $key[$i];
+
+            if ('[' === $char) {
+                if (null !== $currentKey) {
+                    throw new \InvalidArgumentException(sprintf('Malformed path. Unexpected "[" at position %d.', $i));
+                }
+
+                $currentKey = '';
+            } elseif (']' === $char) {
+                if (null === $currentKey) {
+                    throw new \InvalidArgumentException(sprintf('Malformed path. Unexpected "]" at position %d.', $i));
+                }
+
+                if (!is_array($value) || !array_key_exists($currentKey, $value)) {
+                    return $default;
+                }
+
+                $value = $value[$currentKey];
+                $currentKey = null;
+            } else {
+                if (null === $currentKey) {
+                    throw new \InvalidArgumentException(sprintf('Malformed path. Unexpected "%s" at position %d.', $char, $i));
+                }
+
+                $currentKey .= $char;
+            }
+        }
+
+        if (null !== $currentKey) {
+            throw new \InvalidArgumentException(sprintf('Malformed path. Path must end with "]".'));
+        }
+
+        return $value;
+    }
+
+    /**
+     * Sets a parameter by name.
+     *
+     * @param string $key   The key
+     * @param mixed  $value The value
+     */
+    public function set($key, $value)
+    {
+        $this->parameters[$key] = $value;
+    }
+
+    /**
+     * Returns true if the parameter is defined.
+     *
+     * @param string $key The key
+     *
+     * @return bool true if the parameter exists, false otherwise
+     */
+    public function has($key)
+    {
+        return array_key_exists($key, $this->parameters);
+    }
+
+    /**
+     * Removes a parameter.
+     *
+     * @param string $key The key
+     */
+    public function remove($key)
+    {
+        unset($this->parameters[$key]);
+    }
+
+    /**
+     * Returns the alphabetic characters of the parameter value.
+     *
+     * @param string $key     The parameter key
+     * @param string $default The default value if the parameter key does not exist
+     * @param bool   $deep    If true, a path like foo[bar] will find deeper items
+     *
+     * @return string The filtered value
+     */
+    public function getAlpha($key, $default = '', $deep = false)
+    {
+        return preg_replace('/[^[:alpha:]]/', '', $this->get($key, $default, $deep));
+    }
+
+    /**
+     * Returns the alphabetic characters and digits of the parameter value.
+     *
+     * @param string $key     The parameter key
+     * @param string $default The default value if the parameter key does not exist
+     * @param bool   $deep    If true, a path like foo[bar] will find deeper items
+     *
+     * @return string The filtered value
+     */
+    public function getAlnum($key, $default = '', $deep = false)
+    {
+        return preg_replace('/[^[:alnum:]]/', '', $this->get($key, $default, $deep));
+    }
+
+    /**
+     * Returns the digits of the parameter value.
+     *
+     * @param string $key     The parameter key
+     * @param string $default The default value if the parameter key does not exist
+     * @param bool   $deep    If true, a path like foo[bar] will find deeper items
+     *
+     * @return string The filtered value
+     */
+    public function getDigits($key, $default = '', $deep = false)
+    {
+        // we need to remove - and + because they're allowed in the filter
+        return str_replace(array('-', '+'), '', $this->filter($key, $default, FILTER_SANITIZE_NUMBER_INT, array(), $deep));
+    }
+
+    /**
+     * Returns the parameter value converted to integer.
+     *
+     * @param string $key     The parameter key
+     * @param int    $default The default value if the parameter key does not exist
+     * @param bool   $deep    If true, a path like foo[bar] will find deeper items
+     *
+     * @return int The filtered value
+     */
+    public function getInt($key, $default = 0, $deep = false)
+    {
+        return (int) $this->get($key, $default, $deep);
+    }
+
+    /**
+     * Returns the parameter value converted to boolean.
+     *
+     * @param string $key     The parameter key
+     * @param mixed  $default The default value if the parameter key does not exist
+     * @param bool   $deep    If true, a path like foo[bar] will find deeper items
+     *
+     * @return bool The filtered value
+     */
+    public function getBoolean($key, $default = false, $deep = false)
+    {
+        return $this->filter($key, $default, FILTER_VALIDATE_BOOLEAN, array(), $deep);
+    }
+
+    /**
+     * Filter key.
+     *
+     * @param string $key     Key
+     * @param mixed  $default Default = null
+     * @param int    $filter  FILTER_* constant
+     * @param mixed  $options Filter options
+     * @param bool   $deep    Default = false
+     *
+     * @see http://php.net/manual/en/function.filter-var.php
+     *
+     * @return mixed
+     */
+    public function filter($key, $default = null, $filter = FILTER_DEFAULT, $options = array(), $deep = false)
+    {
+        static $filters = null;
+
+        if (null === $filters) {
+            foreach (filter_list() as $tmp) {
+                $filters[filter_id($tmp)] = 1;
+            }
+        }
+        if (is_bool($filter) || !isset($filters[$filter]) || is_array($deep)) {
+            @trigger_error('Passing the $deep boolean as 3rd argument to the '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Remove it altogether as the $deep argument will be removed in 3.0.', E_USER_DEPRECATED);
+            $tmp = $deep;
+            $deep = $filter;
+            $filter = $options;
+            $options = $tmp;
+        }
+
+        $value = $this->get($key, $default, $deep);
+
+        // Always turn $options into an array - this allows filter_var option shortcuts.
+        if (!is_array($options) && $options) {
+            $options = array('flags' => $options);
+        }
+
+        // Add a convenience check for arrays.
+        if (is_array($value) && !isset($options['flags'])) {
+            $options['flags'] = FILTER_REQUIRE_ARRAY;
+        }
+
+        return filter_var($value, $filter, $options);
+    }
+
+    /**
+     * Returns an iterator for parameters.
+     *
+     * @return \ArrayIterator An \ArrayIterator instance
+     */
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->parameters);
+    }
+
+    /**
+     * Returns the number of parameters.
+     *
+     * @return int The number of parameters
+     */
+    public function count()
+    {
+        return count($this->parameters);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/RedirectResponse.php
@@ -0,0 +1,99 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+/**
+ * RedirectResponse represents an HTTP response doing a redirect.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class RedirectResponse extends Response
+{
+    protected $targetUrl;
+
+    /**
+     * Creates a redirect response so that it conforms to the rules defined for a redirect status code.
+     *
+     * @param string $url     The URL to redirect to. The URL should be a full URL, with schema etc.,
+     *                        but practically every browser redirects on paths only as well
+     * @param int    $status  The status code (302 by default)
+     * @param array  $headers The headers (Location is always set to the given URL)
+     *
+     * @throws \InvalidArgumentException
+     *
+     * @see http://tools.ietf.org/html/rfc2616#section-10.3
+     */
+    public function __construct($url, $status = 302, $headers = array())
+    {
+        parent::__construct('', $status, $headers);
+
+        $this->setTargetUrl($url);
+
+        if (!$this->isRedirect()) {
+            throw new \InvalidArgumentException(sprintf('The HTTP status code is not a redirect ("%s" given).', $status));
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public static function create($url = '', $status = 302, $headers = array())
+    {
+        return new static($url, $status, $headers);
+    }
+
+    /**
+     * Returns the target URL.
+     *
+     * @return string target URL
+     */
+    public function getTargetUrl()
+    {
+        return $this->targetUrl;
+    }
+
+    /**
+     * Sets the redirect target of this response.
+     *
+     * @param string $url The URL to redirect to
+     *
+     * @return RedirectResponse The current response
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function setTargetUrl($url)
+    {
+        if (empty($url)) {
+            throw new \InvalidArgumentException('Cannot redirect to an empty URL.');
+        }
+
+        $this->targetUrl = $url;
+
+        $this->setContent(
+            sprintf('<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="UTF-8" />
+        <meta http-equiv="refresh" content="1;url=%1$s" />
+
+        <title>Redirecting to %1$s</title>
+    </head>
+    <body>
+        Redirecting to <a href="%1$s">%1$s</a>.
+    </body>
+</html>', htmlspecialchars($url, ENT_QUOTES, 'UTF-8')));
+
+        $this->headers->set('Location', $url);
+
+        return $this;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Request.php
@@ -0,0 +1,1974 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+use Symfony\Component\HttpFoundation\Exception\ConflictingHeadersException;
+use Symfony\Component\HttpFoundation\Session\SessionInterface;
+
+/**
+ * Request represents an HTTP request.
+ *
+ * The methods dealing with URL accept / return a raw path (% encoded):
+ *   * getBasePath
+ *   * getBaseUrl
+ *   * getPathInfo
+ *   * getRequestUri
+ *   * getUri
+ *   * getUriForPath
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Request
+{
+    const HEADER_FORWARDED = 'forwarded';
+    const HEADER_CLIENT_IP = 'client_ip';
+    const HEADER_CLIENT_HOST = 'client_host';
+    const HEADER_CLIENT_PROTO = 'client_proto';
+    const HEADER_CLIENT_PORT = 'client_port';
+
+    const METHOD_HEAD = 'HEAD';
+    const METHOD_GET = 'GET';
+    const METHOD_POST = 'POST';
+    const METHOD_PUT = 'PUT';
+    const METHOD_PATCH = 'PATCH';
+    const METHOD_DELETE = 'DELETE';
+    const METHOD_PURGE = 'PURGE';
+    const METHOD_OPTIONS = 'OPTIONS';
+    const METHOD_TRACE = 'TRACE';
+    const METHOD_CONNECT = 'CONNECT';
+
+    /**
+     * @var string[]
+     */
+    protected static $trustedProxies = array();
+
+    /**
+     * @var string[]
+     */
+    protected static $trustedHostPatterns = array();
+
+    /**
+     * @var string[]
+     */
+    protected static $trustedHosts = array();
+
+    /**
+     * Names for headers that can be trusted when
+     * using trusted proxies.
+     *
+     * The FORWARDED header is the standard as of rfc7239.
+     *
+     * The other headers are non-standard, but widely used
+     * by popular reverse proxies (like Apache mod_proxy or Amazon EC2).
+     */
+    protected static $trustedHeaders = array(
+        self::HEADER_FORWARDED => 'FORWARDED',
+        self::HEADER_CLIENT_IP => 'X_FORWARDED_FOR',
+        self::HEADER_CLIENT_HOST => 'X_FORWARDED_HOST',
+        self::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
+        self::HEADER_CLIENT_PORT => 'X_FORWARDED_PORT',
+    );
+
+    protected static $httpMethodParameterOverride = false;
+
+    /**
+     * Custom parameters.
+     *
+     * @var \Symfony\Component\HttpFoundation\ParameterBag
+     */
+    public $attributes;
+
+    /**
+     * Request body parameters ($_POST).
+     *
+     * @var \Symfony\Component\HttpFoundation\ParameterBag
+     */
+    public $request;
+
+    /**
+     * Query string parameters ($_GET).
+     *
+     * @var \Symfony\Component\HttpFoundation\ParameterBag
+     */
+    public $query;
+
+    /**
+     * Server and execution environment parameters ($_SERVER).
+     *
+     * @var \Symfony\Component\HttpFoundation\ServerBag
+     */
+    public $server;
+
+    /**
+     * Uploaded files ($_FILES).
+     *
+     * @var \Symfony\Component\HttpFoundation\FileBag
+     */
+    public $files;
+
+    /**
+     * Cookies ($_COOKIE).
+     *
+     * @var \Symfony\Component\HttpFoundation\ParameterBag
+     */
+    public $cookies;
+
+    /**
+     * Headers (taken from the $_SERVER).
+     *
+     * @var \Symfony\Component\HttpFoundation\HeaderBag
+     */
+    public $headers;
+
+    /**
+     * @var string
+     */
+    protected $content;
+
+    /**
+     * @var array
+     */
+    protected $languages;
+
+    /**
+     * @var array
+     */
+    protected $charsets;
+
+    /**
+     * @var array
+     */
+    protected $encodings;
+
+    /**
+     * @var array
+     */
+    protected $acceptableContentTypes;
+
+    /**
+     * @var string
+     */
+    protected $pathInfo;
+
+    /**
+     * @var string
+     */
+    protected $requestUri;
+
+    /**
+     * @var string
+     */
+    protected $baseUrl;
+
+    /**
+     * @var string
+     */
+    protected $basePath;
+
+    /**
+     * @var string
+     */
+    protected $method;
+
+    /**
+     * @var string
+     */
+    protected $format;
+
+    /**
+     * @var \Symfony\Component\HttpFoundation\Session\SessionInterface
+     */
+    protected $session;
+
+    /**
+     * @var string
+     */
+    protected $locale;
+
+    /**
+     * @var string
+     */
+    protected $defaultLocale = 'en';
+
+    /**
+     * @var array
+     */
+    protected static $formats;
+
+    protected static $requestFactory;
+
+    /**
+     * Constructor.
+     *
+     * @param array           $query      The GET parameters
+     * @param array           $request    The POST parameters
+     * @param array           $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
+     * @param array           $cookies    The COOKIE parameters
+     * @param array           $files      The FILES parameters
+     * @param array           $server     The SERVER parameters
+     * @param string|resource $content    The raw body data
+     */
+    public function __construct(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
+    {
+        $this->initialize($query, $request, $attributes, $cookies, $files, $server, $content);
+    }
+
+    /**
+     * Sets the parameters for this request.
+     *
+     * This method also re-initializes all properties.
+     *
+     * @param array           $query      The GET parameters
+     * @param array           $request    The POST parameters
+     * @param array           $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
+     * @param array           $cookies    The COOKIE parameters
+     * @param array           $files      The FILES parameters
+     * @param array           $server     The SERVER parameters
+     * @param string|resource $content    The raw body data
+     */
+    public function initialize(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
+    {
+        $this->request = new ParameterBag($request);
+        $this->query = new ParameterBag($query);
+        $this->attributes = new ParameterBag($attributes);
+        $this->cookies = new ParameterBag($cookies);
+        $this->files = new FileBag($files);
+        $this->server = new ServerBag($server);
+        $this->headers = new HeaderBag($this->server->getHeaders());
+
+        $this->content = $content;
+        $this->languages = null;
+        $this->charsets = null;
+        $this->encodings = null;
+        $this->acceptableContentTypes = null;
+        $this->pathInfo = null;
+        $this->requestUri = null;
+        $this->baseUrl = null;
+        $this->basePath = null;
+        $this->method = null;
+        $this->format = null;
+    }
+
+    /**
+     * Creates a new request with values from PHP's super globals.
+     *
+     * @return Request A new request
+     */
+    public static function createFromGlobals()
+    {
+        // With the php's bug #66606, the php's built-in web server
+        // stores the Content-Type and Content-Length header values in
+        // HTTP_CONTENT_TYPE and HTTP_CONTENT_LENGTH fields.
+        $server = $_SERVER;
+        if ('cli-server' === PHP_SAPI) {
+            if (array_key_exists('HTTP_CONTENT_LENGTH', $_SERVER)) {
+                $server['CONTENT_LENGTH'] = $_SERVER['HTTP_CONTENT_LENGTH'];
+            }
+            if (array_key_exists('HTTP_CONTENT_TYPE', $_SERVER)) {
+                $server['CONTENT_TYPE'] = $_SERVER['HTTP_CONTENT_TYPE'];
+            }
+        }
+
+        $request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $server);
+
+        if (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
+            && in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH'))
+        ) {
+            parse_str($request->getContent(), $data);
+            $request->request = new ParameterBag($data);
+        }
+
+        return $request;
+    }
+
+    /**
+     * Creates a Request based on a given URI and configuration.
+     *
+     * The information contained in the URI always take precedence
+     * over the other information (server and parameters).
+     *
+     * @param string $uri        The URI
+     * @param string $method     The HTTP method
+     * @param array  $parameters The query (GET) or request (POST) parameters
+     * @param array  $cookies    The request cookies ($_COOKIE)
+     * @param array  $files      The request files ($_FILES)
+     * @param array  $server     The server parameters ($_SERVER)
+     * @param string $content    The raw body data
+     *
+     * @return Request A Request instance
+     */
+    public static function create($uri, $method = 'GET', $parameters = array(), $cookies = array(), $files = array(), $server = array(), $content = null)
+    {
+        $server = array_replace(array(
+            'SERVER_NAME' => 'localhost',
+            'SERVER_PORT' => 80,
+            'HTTP_HOST' => 'localhost',
+            'HTTP_USER_AGENT' => 'Symfony/2.X',
+            'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
+            'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5',
+            'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
+            'REMOTE_ADDR' => '127.0.0.1',
+            'SCRIPT_NAME' => '',
+            'SCRIPT_FILENAME' => '',
+            'SERVER_PROTOCOL' => 'HTTP/1.1',
+            'REQUEST_TIME' => time(),
+        ), $server);
+
+        $server['PATH_INFO'] = '';
+        $server['REQUEST_METHOD'] = strtoupper($method);
+
+        $components = parse_url($uri);
+        if (isset($components['host'])) {
+            $server['SERVER_NAME'] = $components['host'];
+            $server['HTTP_HOST'] = $components['host'];
+        }
+
+        if (isset($components['scheme'])) {
+            if ('https' === $components['scheme']) {
+                $server['HTTPS'] = 'on';
+                $server['SERVER_PORT'] = 443;
+            } else {
+                unset($server['HTTPS']);
+                $server['SERVER_PORT'] = 80;
+            }
+        }
+
+        if (isset($components['port'])) {
+            $server['SERVER_PORT'] = $components['port'];
+            $server['HTTP_HOST'] = $server['HTTP_HOST'].':'.$components['port'];
+        }
+
+        if (isset($components['user'])) {
+            $server['PHP_AUTH_USER'] = $components['user'];
+        }
+
+        if (isset($components['pass'])) {
+            $server['PHP_AUTH_PW'] = $components['pass'];
+        }
+
+        if (!isset($components['path'])) {
+            $components['path'] = '/';
+        }
+
+        switch (strtoupper($method)) {
+            case 'POST':
+            case 'PUT':
+            case 'DELETE':
+                if (!isset($server['CONTENT_TYPE'])) {
+                    $server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded';
+                }
+                // no break
+            case 'PATCH':
+                $request = $parameters;
+                $query = array();
+                break;
+            default:
+                $request = array();
+                $query = $parameters;
+                break;
+        }
+
+        $queryString = '';
+        if (isset($components['query'])) {
+            parse_str(html_entity_decode($components['query']), $qs);
+
+            if ($query) {
+                $query = array_replace($qs, $query);
+                $queryString = http_build_query($query, '', '&');
+            } else {
+                $query = $qs;
+                $queryString = $components['query'];
+            }
+        } elseif ($query) {
+            $queryString = http_build_query($query, '', '&');
+        }
+
+        $server['REQUEST_URI'] = $components['path'].('' !== $queryString ? '?'.$queryString : '');
+        $server['QUERY_STRING'] = $queryString;
+
+        return self::createRequestFromFactory($query, $request, array(), $cookies, $files, $server, $content);
+    }
+
+    /**
+     * Sets a callable able to create a Request instance.
+     *
+     * This is mainly useful when you need to override the Request class
+     * to keep BC with an existing system. It should not be used for any
+     * other purpose.
+     *
+     * @param callable|null $callable A PHP callable
+     */
+    public static function setFactory($callable)
+    {
+        self::$requestFactory = $callable;
+    }
+
+    /**
+     * Clones a request and overrides some of its parameters.
+     *
+     * @param array $query      The GET parameters
+     * @param array $request    The POST parameters
+     * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
+     * @param array $cookies    The COOKIE parameters
+     * @param array $files      The FILES parameters
+     * @param array $server     The SERVER parameters
+     *
+     * @return Request The duplicated request
+     */
+    public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null)
+    {
+        $dup = clone $this;
+        if ($query !== null) {
+            $dup->query = new ParameterBag($query);
+        }
+        if ($request !== null) {
+            $dup->request = new ParameterBag($request);
+        }
+        if ($attributes !== null) {
+            $dup->attributes = new ParameterBag($attributes);
+        }
+        if ($cookies !== null) {
+            $dup->cookies = new ParameterBag($cookies);
+        }
+        if ($files !== null) {
+            $dup->files = new FileBag($files);
+        }
+        if ($server !== null) {
+            $dup->server = new ServerBag($server);
+            $dup->headers = new HeaderBag($dup->server->getHeaders());
+        }
+        $dup->languages = null;
+        $dup->charsets = null;
+        $dup->encodings = null;
+        $dup->acceptableContentTypes = null;
+        $dup->pathInfo = null;
+        $dup->requestUri = null;
+        $dup->baseUrl = null;
+        $dup->basePath = null;
+        $dup->method = null;
+        $dup->format = null;
+
+        if (!$dup->get('_format') && $this->get('_format')) {
+            $dup->attributes->set('_format', $this->get('_format'));
+        }
+
+        if (!$dup->getRequestFormat(null)) {
+            $dup->setRequestFormat($this->getRequestFormat(null));
+        }
+
+        return $dup;
+    }
+
+    /**
+     * Clones the current request.
+     *
+     * Note that the session is not cloned as duplicated requests
+     * are most of the time sub-requests of the main one.
+     */
+    public function __clone()
+    {
+        $this->query = clone $this->query;
+        $this->request = clone $this->request;
+        $this->attributes = clone $this->attributes;
+        $this->cookies = clone $this->cookies;
+        $this->files = clone $this->files;
+        $this->server = clone $this->server;
+        $this->headers = clone $this->headers;
+    }
+
+    /**
+     * Returns the request as a string.
+     *
+     * @return string The request
+     */
+    public function __toString()
+    {
+        try {
+            $content = $this->getContent();
+        } catch (\LogicException $e) {
+            return trigger_error($e, E_USER_ERROR);
+        }
+
+        return
+            sprintf('%s %s %s', $this->getMethod(), $this->getRequestUri(), $this->server->get('SERVER_PROTOCOL'))."\r\n".
+            $this->headers."\r\n".
+            $content;
+    }
+
+    /**
+     * Overrides the PHP global variables according to this request instance.
+     *
+     * It overrides $_GET, $_POST, $_REQUEST, $_SERVER, $_COOKIE.
+     * $_FILES is never overridden, see rfc1867
+     */
+    public function overrideGlobals()
+    {
+        $this->server->set('QUERY_STRING', static::normalizeQueryString(http_build_query($this->query->all(), null, '&')));
+
+        $_GET = $this->query->all();
+        $_POST = $this->request->all();
+        $_SERVER = $this->server->all();
+        $_COOKIE = $this->cookies->all();
+
+        foreach ($this->headers->all() as $key => $value) {
+            $key = strtoupper(str_replace('-', '_', $key));
+            if (in_array($key, array('CONTENT_TYPE', 'CONTENT_LENGTH'))) {
+                $_SERVER[$key] = implode(', ', $value);
+            } else {
+                $_SERVER['HTTP_'.$key] = implode(', ', $value);
+            }
+        }
+
+        $request = array('g' => $_GET, 'p' => $_POST, 'c' => $_COOKIE);
+
+        $requestOrder = ini_get('request_order') ?: ini_get('variables_order');
+        $requestOrder = preg_replace('#[^cgp]#', '', strtolower($requestOrder)) ?: 'gp';
+
+        $_REQUEST = array();
+        foreach (str_split($requestOrder) as $order) {
+            $_REQUEST = array_merge($_REQUEST, $request[$order]);
+        }
+    }
+
+    /**
+     * Sets a list of trusted proxies.
+     *
+     * You should only list the reverse proxies that you manage directly.
+     *
+     * @param array $proxies A list of trusted proxies
+     */
+    public static function setTrustedProxies(array $proxies)
+    {
+        self::$trustedProxies = $proxies;
+    }
+
+    /**
+     * Gets the list of trusted proxies.
+     *
+     * @return array An array of trusted proxies
+     */
+    public static function getTrustedProxies()
+    {
+        return self::$trustedProxies;
+    }
+
+    /**
+     * Sets a list of trusted host patterns.
+     *
+     * You should only list the hosts you manage using regexs.
+     *
+     * @param array $hostPatterns A list of trusted host patterns
+     */
+    public static function setTrustedHosts(array $hostPatterns)
+    {
+        self::$trustedHostPatterns = array_map(function ($hostPattern) {
+            return sprintf('#%s#i', $hostPattern);
+        }, $hostPatterns);
+        // we need to reset trusted hosts on trusted host patterns change
+        self::$trustedHosts = array();
+    }
+
+    /**
+     * Gets the list of trusted host patterns.
+     *
+     * @return array An array of trusted host patterns
+     */
+    public static function getTrustedHosts()
+    {
+        return self::$trustedHostPatterns;
+    }
+
+    /**
+     * Sets the name for trusted headers.
+     *
+     * The following header keys are supported:
+     *
+     *  * Request::HEADER_CLIENT_IP:    defaults to X-Forwarded-For   (see getClientIp())
+     *  * Request::HEADER_CLIENT_HOST:  defaults to X-Forwarded-Host  (see getHost())
+     *  * Request::HEADER_CLIENT_PORT:  defaults to X-Forwarded-Port  (see getPort())
+     *  * Request::HEADER_CLIENT_PROTO: defaults to X-Forwarded-Proto (see getScheme() and isSecure())
+     *
+     * Setting an empty value allows to disable the trusted header for the given key.
+     *
+     * @param string $key   The header key
+     * @param string $value The header name
+     *
+     * @throws \InvalidArgumentException
+     */
+    public static function setTrustedHeaderName($key, $value)
+    {
+        if (!array_key_exists($key, self::$trustedHeaders)) {
+            throw new \InvalidArgumentException(sprintf('Unable to set the trusted header name for key "%s".', $key));
+        }
+
+        self::$trustedHeaders[$key] = $value;
+    }
+
+    /**
+     * Gets the trusted proxy header name.
+     *
+     * @param string $key The header key
+     *
+     * @return string The header name
+     *
+     * @throws \InvalidArgumentException
+     */
+    public static function getTrustedHeaderName($key)
+    {
+        if (!array_key_exists($key, self::$trustedHeaders)) {
+            throw new \InvalidArgumentException(sprintf('Unable to get the trusted header name for key "%s".', $key));
+        }
+
+        return self::$trustedHeaders[$key];
+    }
+
+    /**
+     * Normalizes a query string.
+     *
+     * It builds a normalized query string, where keys/value pairs are alphabetized,
+     * have consistent escaping and unneeded delimiters are removed.
+     *
+     * @param string $qs Query string
+     *
+     * @return string A normalized query string for the Request
+     */
+    public static function normalizeQueryString($qs)
+    {
+        if ('' == $qs) {
+            return '';
+        }
+
+        $parts = array();
+        $order = array();
+
+        foreach (explode('&', $qs) as $param) {
+            if ('' === $param || '=' === $param[0]) {
+                // Ignore useless delimiters, e.g. "x=y&".
+                // Also ignore pairs with empty key, even if there was a value, e.g. "=value", as such nameless values cannot be retrieved anyway.
+                // PHP also does not include them when building _GET.
+                continue;
+            }
+
+            $keyValuePair = explode('=', $param, 2);
+
+            // GET parameters, that are submitted from a HTML form, encode spaces as "+" by default (as defined in enctype application/x-www-form-urlencoded).
+            // PHP also converts "+" to spaces when filling the global _GET or when using the function parse_str. This is why we use urldecode and then normalize to
+            // RFC 3986 with rawurlencode.
+            $parts[] = isset($keyValuePair[1]) ?
+                rawurlencode(urldecode($keyValuePair[0])).'='.rawurlencode(urldecode($keyValuePair[1])) :
+                rawurlencode(urldecode($keyValuePair[0]));
+            $order[] = urldecode($keyValuePair[0]);
+        }
+
+        array_multisort($order, SORT_ASC, $parts);
+
+        return implode('&', $parts);
+    }
+
+    /**
+     * Enables support for the _method request parameter to determine the intended HTTP method.
+     *
+     * Be warned that enabling this feature might lead to CSRF issues in your code.
+     * Check that you are using CSRF tokens when required.
+     * If the HTTP method parameter override is enabled, an html-form with method "POST" can be altered
+     * and used to send a "PUT" or "DELETE" request via the _method request parameter.
+     * If these methods are not protected against CSRF, this presents a possible vulnerability.
+     *
+     * The HTTP method can only be overridden when the real HTTP method is POST.
+     */
+    public static function enableHttpMethodParameterOverride()
+    {
+        self::$httpMethodParameterOverride = true;
+    }
+
+    /**
+     * Checks whether support for the _method request parameter is enabled.
+     *
+     * @return bool True when the _method request parameter is enabled, false otherwise
+     */
+    public static function getHttpMethodParameterOverride()
+    {
+        return self::$httpMethodParameterOverride;
+    }
+
+    /**
+     * Gets a "parameter" value.
+     *
+     * This method is mainly useful for libraries that want to provide some flexibility.
+     *
+     * Order of precedence: GET, PATH, POST
+     *
+     * Avoid using this method in controllers:
+     *
+     *  * slow
+     *  * prefer to get from a "named" source
+     *
+     * It is better to explicitly get request parameters from the appropriate
+     * public property instead (query, attributes, request).
+     *
+     * Note: Finding deep items is deprecated since version 2.8, to be removed in 3.0.
+     *
+     * @param string $key     the key
+     * @param mixed  $default the default value if the parameter key does not exist
+     * @param bool   $deep    is parameter deep in multidimensional array
+     *
+     * @return mixed
+     */
+    public function get($key, $default = null, $deep = false)
+    {
+        if ($deep) {
+            @trigger_error('Using paths to find deeper items in '.__METHOD__.' is deprecated since version 2.8 and will be removed in 3.0. Filter the returned value in your own code instead.', E_USER_DEPRECATED);
+        }
+
+        if ($this !== $result = $this->query->get($key, $this, $deep)) {
+            return $result;
+        }
+
+        if ($this !== $result = $this->attributes->get($key, $this, $deep)) {
+            return $result;
+        }
+
+        if ($this !== $result = $this->request->get($key, $this, $deep)) {
+            return $result;
+        }
+
+        return $default;
+    }
+
+    /**
+     * Gets the Session.
+     *
+     * @return SessionInterface|null The session
+     */
+    public function getSession()
+    {
+        return $this->session;
+    }
+
+    /**
+     * Whether the request contains a Session which was started in one of the
+     * previous requests.
+     *
+     * @return bool
+     */
+    public function hasPreviousSession()
+    {
+        // the check for $this->session avoids malicious users trying to fake a session cookie with proper name
+        return $this->hasSession() && $this->cookies->has($this->session->getName());
+    }
+
+    /**
+     * Whether the request contains a Session object.
+     *
+     * This method does not give any information about the state of the session object,
+     * like whether the session is started or not. It is just a way to check if this Request
+     * is associated with a Session instance.
+     *
+     * @return bool true when the Request contains a Session object, false otherwise
+     */
+    public function hasSession()
+    {
+        return null !== $this->session;
+    }
+
+    /**
+     * Sets the Session.
+     *
+     * @param SessionInterface $session The Session
+     */
+    public function setSession(SessionInterface $session)
+    {
+        $this->session = $session;
+    }
+
+    /**
+     * Returns the client IP addresses.
+     *
+     * In the returned array the most trusted IP address is first, and the
+     * least trusted one last. The "real" client IP address is the last one,
+     * but this is also the least trusted one. Trusted proxies are stripped.
+     *
+     * Use this method carefully; you should use getClientIp() instead.
+     *
+     * @return array The client IP addresses
+     *
+     * @see getClientIp()
+     */
+    public function getClientIps()
+    {
+        $clientIps = array();
+        $ip = $this->server->get('REMOTE_ADDR');
+
+        if (!$this->isFromTrustedProxy()) {
+            return array($ip);
+        }
+
+        $hasTrustedForwardedHeader = self::$trustedHeaders[self::HEADER_FORWARDED] && $this->headers->has(self::$trustedHeaders[self::HEADER_FORWARDED]);
+        $hasTrustedClientIpHeader = self::$trustedHeaders[self::HEADER_CLIENT_IP] && $this->headers->has(self::$trustedHeaders[self::HEADER_CLIENT_IP]);
+
+        if ($hasTrustedForwardedHeader) {
+            $forwardedHeader = $this->headers->get(self::$trustedHeaders[self::HEADER_FORWARDED]);
+            preg_match_all('{(for)=("?\[?)([a-z0-9\.:_\-/]*)}', $forwardedHeader, $matches);
+            $forwardedClientIps = $matches[3];
+
+            $forwardedClientIps = $this->normalizeAndFilterClientIps($forwardedClientIps, $ip);
+            $clientIps = $forwardedClientIps;
+        }
+
+        if ($hasTrustedClientIpHeader) {
+            $xForwardedForClientIps = array_map('trim', explode(',', $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_IP])));
+
+            $xForwardedForClientIps = $this->normalizeAndFilterClientIps($xForwardedForClientIps, $ip);
+            $clientIps = $xForwardedForClientIps;
+        }
+
+        if ($hasTrustedForwardedHeader && $hasTrustedClientIpHeader && $forwardedClientIps !== $xForwardedForClientIps) {
+            throw new ConflictingHeadersException('The request has both a trusted Forwarded header and a trusted Client IP header, conflicting with each other with regards to the originating IP addresses of the request. This is the result of a misconfiguration. You should either configure your proxy only to send one of these headers, or configure Symfony to distrust one of them.');
+        }
+
+        if (!$hasTrustedForwardedHeader && !$hasTrustedClientIpHeader) {
+            return $this->normalizeAndFilterClientIps(array(), $ip);
+        }
+
+        return $clientIps;
+    }
+
+    /**
+     * Returns the client IP address.
+     *
+     * This method can read the client IP address from the "X-Forwarded-For" header
+     * when trusted proxies were set via "setTrustedProxies()". The "X-Forwarded-For"
+     * header value is a comma+space separated list of IP addresses, the left-most
+     * being the original client, and each successive proxy that passed the request
+     * adding the IP address where it received the request from.
+     *
+     * If your reverse proxy uses a different header name than "X-Forwarded-For",
+     * ("Client-Ip" for instance), configure it via "setTrustedHeaderName()" with
+     * the "client-ip" key.
+     *
+     * @return string The client IP address
+     *
+     * @see getClientIps()
+     * @see http://en.wikipedia.org/wiki/X-Forwarded-For
+     */
+    public function getClientIp()
+    {
+        $ipAddresses = $this->getClientIps();
+
+        return $ipAddresses[0];
+    }
+
+    /**
+     * Returns current script name.
+     *
+     * @return string
+     */
+    public function getScriptName()
+    {
+        return $this->server->get('SCRIPT_NAME', $this->server->get('ORIG_SCRIPT_NAME', ''));
+    }
+
+    /**
+     * Returns the path being requested relative to the executed script.
+     *
+     * The path info always starts with a /.
+     *
+     * Suppose this request is instantiated from /mysite on localhost:
+     *
+     *  * http://localhost/mysite              returns an empty string
+     *  * http://localhost/mysite/about        returns '/about'
+     *  * http://localhost/mysite/enco%20ded   returns '/enco%20ded'
+     *  * http://localhost/mysite/about?var=1  returns '/about'
+     *
+     * @return string The raw path (i.e. not urldecoded)
+     */
+    public function getPathInfo()
+    {
+        if (null === $this->pathInfo) {
+            $this->pathInfo = $this->preparePathInfo();
+        }
+
+        return $this->pathInfo;
+    }
+
+    /**
+     * Returns the root path from which this request is executed.
+     *
+     * Suppose that an index.php file instantiates this request object:
+     *
+     *  * http://localhost/index.php         returns an empty string
+     *  * http://localhost/index.php/page    returns an empty string
+     *  * http://localhost/web/index.php     returns '/web'
+     *  * http://localhost/we%20b/index.php  returns '/we%20b'
+     *
+     * @return string The raw path (i.e. not urldecoded)
+     */
+    public function getBasePath()
+    {
+        if (null === $this->basePath) {
+            $this->basePath = $this->prepareBasePath();
+        }
+
+        return $this->basePath;
+    }
+
+    /**
+     * Returns the root URL from which this request is executed.
+     *
+     * The base URL never ends with a /.
+     *
+     * This is similar to getBasePath(), except that it also includes the
+     * script filename (e.g. index.php) if one exists.
+     *
+     * @return string The raw URL (i.e. not urldecoded)
+     */
+    public function getBaseUrl()
+    {
+        if (null === $this->baseUrl) {
+            $this->baseUrl = $this->prepareBaseUrl();
+        }
+
+        return $this->baseUrl;
+    }
+
+    /**
+     * Gets the request's scheme.
+     *
+     * @return string
+     */
+    public function getScheme()
+    {
+        return $this->isSecure() ? 'https' : 'http';
+    }
+
+    /**
+     * Returns the port on which the request is made.
+     *
+     * This method can read the client port from the "X-Forwarded-Port" header
+     * when trusted proxies were set via "setTrustedProxies()".
+     *
+     * The "X-Forwarded-Port" header must contain the client port.
+     *
+     * If your reverse proxy uses a different header name than "X-Forwarded-Port",
+     * configure it via "setTrustedHeaderName()" with the "client-port" key.
+     *
+     * @return string
+     */
+    public function getPort()
+    {
+        if ($this->isFromTrustedProxy()) {
+            if (self::$trustedHeaders[self::HEADER_CLIENT_PORT] && $port = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PORT])) {
+                return $port;
+            }
+
+            if (self::$trustedHeaders[self::HEADER_CLIENT_PROTO] && 'https' === $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PROTO], 'http')) {
+                return 443;
+            }
+        }
+
+        if ($host = $this->headers->get('HOST')) {
+            if ($host[0] === '[') {
+                $pos = strpos($host, ':', strrpos($host, ']'));
+            } else {
+                $pos = strrpos($host, ':');
+            }
+
+            if (false !== $pos) {
+                return (int) substr($host, $pos + 1);
+            }
+
+            return 'https' === $this->getScheme() ? 443 : 80;
+        }
+
+        return $this->server->get('SERVER_PORT');
+    }
+
+    /**
+     * Returns the user.
+     *
+     * @return string|null
+     */
+    public function getUser()
+    {
+        return $this->headers->get('PHP_AUTH_USER');
+    }
+
+    /**
+     * Returns the password.
+     *
+     * @return string|null
+     */
+    public function getPassword()
+    {
+        return $this->headers->get('PHP_AUTH_PW');
+    }
+
+    /**
+     * Gets the user info.
+     *
+     * @return string A user name and, optionally, scheme-specific information about how to gain authorization to access the server
+     */
+    public function getUserInfo()
+    {
+        $userinfo = $this->getUser();
+
+        $pass = $this->getPassword();
+        if ('' != $pass) {
+            $userinfo .= ":$pass";
+        }
+
+        return $userinfo;
+    }
+
+    /**
+     * Returns the HTTP host being requested.
+     *
+     * The port name will be appended to the host if it's non-standard.
+     *
+     * @return string
+     */
+    public function getHttpHost()
+    {
+        $scheme = $this->getScheme();
+        $port = $this->getPort();
+
+        if (('http' == $scheme && $port == 80) || ('https' == $scheme && $port == 443)) {
+            return $this->getHost();
+        }
+
+        return $this->getHost().':'.$port;
+    }
+
+    /**
+     * Returns the requested URI (path and query string).
+     *
+     * @return string The raw URI (i.e. not URI decoded)
+     */
+    public function getRequestUri()
+    {
+        if (null === $this->requestUri) {
+            $this->requestUri = $this->prepareRequestUri();
+        }
+
+        return $this->requestUri;
+    }
+
+    /**
+     * Gets the scheme and HTTP host.
+     *
+     * If the URL was called with basic authentication, the user
+     * and the password are not added to the generated string.
+     *
+     * @return string The scheme and HTTP host
+     */
+    public function getSchemeAndHttpHost()
+    {
+        return $this->getScheme().'://'.$this->getHttpHost();
+    }
+
+    /**
+     * Generates a normalized URI (URL) for the Request.
+     *
+     * @return string A normalized URI (URL) for the Request
+     *
+     * @see getQueryString()
+     */
+    public function getUri()
+    {
+        if (null !== $qs = $this->getQueryString()) {
+            $qs = '?'.$qs;
+        }
+
+        return $this->getSchemeAndHttpHost().$this->getBaseUrl().$this->getPathInfo().$qs;
+    }
+
+    /**
+     * Generates a normalized URI for the given path.
+     *
+     * @param string $path A path to use instead of the current one
+     *
+     * @return string The normalized URI for the path
+     */
+    public function getUriForPath($path)
+    {
+        return $this->getSchemeAndHttpHost().$this->getBaseUrl().$path;
+    }
+
+    /**
+     * Returns the path as relative reference from the current Request path.
+     *
+     * Only the URIs path component (no schema, host etc.) is relevant and must be given.
+     * Both paths must be absolute and not contain relative parts.
+     * Relative URLs from one resource to another are useful when generating self-contained downloadable document archives.
+     * Furthermore, they can be used to reduce the link size in documents.
+     *
+     * Example target paths, given a base path of "/a/b/c/d":
+     * - "/a/b/c/d"     -> ""
+     * - "/a/b/c/"      -> "./"
+     * - "/a/b/"        -> "../"
+     * - "/a/b/c/other" -> "other"
+     * - "/a/x/y"       -> "../../x/y"
+     *
+     * @param string $path The target path
+     *
+     * @return string The relative target path
+     */
+    public function getRelativeUriForPath($path)
+    {
+        // be sure that we are dealing with an absolute path
+        if (!isset($path[0]) || '/' !== $path[0]) {
+            return $path;
+        }
+
+        if ($path === $basePath = $this->getPathInfo()) {
+            return '';
+        }
+
+        $sourceDirs = explode('/', isset($basePath[0]) && '/' === $basePath[0] ? substr($basePath, 1) : $basePath);
+        $targetDirs = explode('/', isset($path[0]) && '/' === $path[0] ? substr($path, 1) : $path);
+        array_pop($sourceDirs);
+        $targetFile = array_pop($targetDirs);
+
+        foreach ($sourceDirs as $i => $dir) {
+            if (isset($targetDirs[$i]) && $dir === $targetDirs[$i]) {
+                unset($sourceDirs[$i], $targetDirs[$i]);
+            } else {
+                break;
+            }
+        }
+
+        $targetDirs[] = $targetFile;
+        $path = str_repeat('../', count($sourceDirs)).implode('/', $targetDirs);
+
+        // A reference to the same base directory or an empty subdirectory must be prefixed with "./".
+        // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used
+        // as the first segment of a relative-path reference, as it would be mistaken for a scheme name
+        // (see http://tools.ietf.org/html/rfc3986#section-4.2).
+        return !isset($path[0]) || '/' === $path[0]
+            || false !== ($colonPos = strpos($path, ':')) && ($colonPos < ($slashPos = strpos($path, '/')) || false === $slashPos)
+            ? "./$path" : $path;
+    }
+
+    /**
+     * Generates the normalized query string for the Request.
+     *
+     * It builds a normalized query string, where keys/value pairs are alphabetized
+     * and have consistent escaping.
+     *
+     * @return string|null A normalized query string for the Request
+     */
+    public function getQueryString()
+    {
+        $qs = static::normalizeQueryString($this->server->get('QUERY_STRING'));
+
+        return '' === $qs ? null : $qs;
+    }
+
+    /**
+     * Checks whether the request is secure or not.
+     *
+     * This method can read the client protocol from the "X-Forwarded-Proto" header
+     * when trusted proxies were set via "setTrustedProxies()".
+     *
+     * The "X-Forwarded-Proto" header must contain the protocol: "https" or "http".
+     *
+     * If your reverse proxy uses a different header name than "X-Forwarded-Proto"
+     * ("SSL_HTTPS" for instance), configure it via "setTrustedHeaderName()" with
+     * the "client-proto" key.
+     *
+     * @return bool
+     */
+    public function isSecure()
+    {
+        if ($this->isFromTrustedProxy() && self::$trustedHeaders[self::HEADER_CLIENT_PROTO] && $proto = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PROTO])) {
+            return in_array(strtolower(current(explode(',', $proto))), array('https', 'on', 'ssl', '1'));
+        }
+
+        $https = $this->server->get('HTTPS');
+
+        return !empty($https) && 'off' !== strtolower($https);
+    }
+
+    /**
+     * Returns the host name.
+     *
+     * This method can read the client host name from the "X-Forwarded-Host" header
+     * when trusted proxies were set via "setTrustedProxies()".
+     *
+     * The "X-Forwarded-Host" header must contain the client host name.
+     *
+     * If your reverse proxy uses a different header name than "X-Forwarded-Host",
+     * configure it via "setTrustedHeaderName()" with the "client-host" key.
+     *
+     * @return string
+     *
+     * @throws \UnexpectedValueException when the host name is invalid
+     */
+    public function getHost()
+    {
+        if ($this->isFromTrustedProxy() && self::$trustedHeaders[self::HEADER_CLIENT_HOST] && $host = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_HOST])) {
+            $elements = explode(',', $host);
+
+            $host = $elements[count($elements) - 1];
+        } elseif (!$host = $this->headers->get('HOST')) {
+            if (!$host = $this->server->get('SERVER_NAME')) {
+                $host = $this->server->get('SERVER_ADDR', '');
+            }
+        }
+
+        // trim and remove port number from host
+        // host is lowercase as per RFC 952/2181
+        $host = strtolower(preg_replace('/:\d+$/', '', trim($host)));
+
+        // as the host can come from the user (HTTP_HOST and depending on the configuration, SERVER_NAME too can come from the user)
+        // check that it does not contain forbidden characters (see RFC 952 and RFC 2181)
+        // use preg_replace() instead of preg_match() to prevent DoS attacks with long host names
+        if ($host && '' !== preg_replace('/(?:^\[)?[a-zA-Z0-9-:\]_]+\.?/', '', $host)) {
+            throw new \UnexpectedValueException(sprintf('Invalid Host "%s"', $host));
+        }
+
+        if (count(self::$trustedHostPatterns) > 0) {
+            // to avoid host header injection attacks, you should provide a list of trusted host patterns
+
+            if (in_array($host, self::$trustedHosts)) {
+                return $host;
+            }
+
+            foreach (self::$trustedHostPatterns as $pattern) {
+                if (preg_match($pattern, $host)) {
+                    self::$trustedHosts[] = $host;
+
+                    return $host;
+                }
+            }
+
+            throw new \UnexpectedValueException(sprintf('Untrusted Host "%s"', $host));
+        }
+
+        return $host;
+    }
+
+    /**
+     * Sets the request method.
+     *
+     * @param string $method
+     */
+    public function setMethod($method)
+    {
+        $this->method = null;
+        $this->server->set('REQUEST_METHOD', $method);
+    }
+
+    /**
+     * Gets the request "intended" method.
+     *
+     * If the X-HTTP-Method-Override header is set, and if the method is a POST,
+     * then it is used to determine the "real" intended HTTP method.
+     *
+     * The _method request parameter can also be used to determine the HTTP method,
+     * but only if enableHttpMethodParameterOverride() has been called.
+     *
+     * The method is always an uppercased string.
+     *
+     * @return string The request method
+     *
+     * @see getRealMethod()
+     */
+    public function getMethod()
+    {
+        if (null === $this->method) {
+            $this->method = strtoupper($this->server->get('REQUEST_METHOD', 'GET'));
+
+            if ('POST' === $this->method) {
+                if ($method = $this->headers->get('X-HTTP-METHOD-OVERRIDE')) {
+                    $this->method = strtoupper($method);
+                } elseif (self::$httpMethodParameterOverride) {
+                    $this->method = strtoupper($this->request->get('_method', $this->query->get('_method', 'POST')));
+                }
+            }
+        }
+
+        return $this->method;
+    }
+
+    /**
+     * Gets the "real" request method.
+     *
+     * @return string The request method
+     *
+     * @see getMethod()
+     */
+    public function getRealMethod()
+    {
+        return strtoupper($this->server->get('REQUEST_METHOD', 'GET'));
+    }
+
+    /**
+     * Gets the mime type associated with the format.
+     *
+     * @param string $format The format
+     *
+     * @return string The associated mime type (null if not found)
+     */
+    public function getMimeType($format)
+    {
+        if (null === static::$formats) {
+            static::initializeFormats();
+        }
+
+        return isset(static::$formats[$format]) ? static::$formats[$format][0] : null;
+    }
+
+    /**
+     * Gets the format associated with the mime type.
+     *
+     * @param string $mimeType The associated mime type
+     *
+     * @return string|null The format (null if not found)
+     */
+    public function getFormat($mimeType)
+    {
+        $canonicalMimeType = null;
+        if (false !== $pos = strpos($mimeType, ';')) {
+            $canonicalMimeType = substr($mimeType, 0, $pos);
+        }
+
+        if (null === static::$formats) {
+            static::initializeFormats();
+        }
+
+        foreach (static::$formats as $format => $mimeTypes) {
+            if (in_array($mimeType, (array) $mimeTypes)) {
+                return $format;
+            }
+            if (null !== $canonicalMimeType && in_array($canonicalMimeType, (array) $mimeTypes)) {
+                return $format;
+            }
+        }
+    }
+
+    /**
+     * Associates a format with mime types.
+     *
+     * @param string       $format    The format
+     * @param string|array $mimeTypes The associated mime types (the preferred one must be the first as it will be used as the content type)
+     */
+    public function setFormat($format, $mimeTypes)
+    {
+        if (null === static::$formats) {
+            static::initializeFormats();
+        }
+
+        static::$formats[$format] = is_array($mimeTypes) ? $mimeTypes : array($mimeTypes);
+    }
+
+    /**
+     * Gets the request format.
+     *
+     * Here is the process to determine the format:
+     *
+     *  * format defined by the user (with setRequestFormat())
+     *  * _format request parameter
+     *  * $default
+     *
+     * @param string $default The default format
+     *
+     * @return string The request format
+     */
+    public function getRequestFormat($default = 'html')
+    {
+        if (null === $this->format) {
+            $this->format = $this->get('_format', $default);
+        }
+
+        return $this->format;
+    }
+
+    /**
+     * Sets the request format.
+     *
+     * @param string $format The request format
+     */
+    public function setRequestFormat($format)
+    {
+        $this->format = $format;
+    }
+
+    /**
+     * Gets the format associated with the request.
+     *
+     * @return string|null The format (null if no content type is present)
+     */
+    public function getContentType()
+    {
+        return $this->getFormat($this->headers->get('CONTENT_TYPE'));
+    }
+
+    /**
+     * Sets the default locale.
+     *
+     * @param string $locale
+     */
+    public function setDefaultLocale($locale)
+    {
+        $this->defaultLocale = $locale;
+
+        if (null === $this->locale) {
+            $this->setPhpDefaultLocale($locale);
+        }
+    }
+
+    /**
+     * Get the default locale.
+     *
+     * @return string
+     */
+    public function getDefaultLocale()
+    {
+        return $this->defaultLocale;
+    }
+
+    /**
+     * Sets the locale.
+     *
+     * @param string $locale
+     */
+    public function setLocale($locale)
+    {
+        $this->setPhpDefaultLocale($this->locale = $locale);
+    }
+
+    /**
+     * Get the locale.
+     *
+     * @return string
+     */
+    public function getLocale()
+    {
+        return null === $this->locale ? $this->defaultLocale : $this->locale;
+    }
+
+    /**
+     * Checks if the request method is of specified type.
+     *
+     * @param string $method Uppercase request method (GET, POST etc)
+     *
+     * @return bool
+     */
+    public function isMethod($method)
+    {
+        return $this->getMethod() === strtoupper($method);
+    }
+
+    /**
+     * Checks whether the method is safe or not.
+     *
+     * @return bool
+     */
+    public function isMethodSafe()
+    {
+        return in_array($this->getMethod(), array('GET', 'HEAD', 'OPTIONS', 'TRACE'));
+    }
+
+    /**
+     * Checks whether the method is cacheable or not.
+     *
+     * @return bool
+     */
+    public function isMethodCacheable()
+    {
+        return in_array($this->getMethod(), array('GET', 'HEAD'));
+    }
+
+    /**
+     * Returns the request body content.
+     *
+     * @param bool $asResource If true, a resource will be returned
+     *
+     * @return string|resource The request body content or a resource to read the body stream
+     *
+     * @throws \LogicException
+     */
+    public function getContent($asResource = false)
+    {
+        $currentContentIsResource = is_resource($this->content);
+        if (PHP_VERSION_ID < 50600 && false === $this->content) {
+            throw new \LogicException('getContent() can only be called once when using the resource return type and PHP below 5.6.');
+        }
+
+        if (true === $asResource) {
+            if ($currentContentIsResource) {
+                rewind($this->content);
+
+                return $this->content;
+            }
+
+            // Content passed in parameter (test)
+            if (is_string($this->content)) {
+                $resource = fopen('php://temp', 'r+');
+                fwrite($resource, $this->content);
+                rewind($resource);
+
+                return $resource;
+            }
+
+            $this->content = false;
+
+            return fopen('php://input', 'rb');
+        }
+
+        if ($currentContentIsResource) {
+            rewind($this->content);
+
+            return stream_get_contents($this->content);
+        }
+
+        if (null === $this->content || false === $this->content) {
+            $this->content = file_get_contents('php://input');
+        }
+
+        return $this->content;
+    }
+
+    /**
+     * Gets the Etags.
+     *
+     * @return array The entity tags
+     */
+    public function getETags()
+    {
+        return preg_split('/\s*,\s*/', $this->headers->get('if_none_match'), null, PREG_SPLIT_NO_EMPTY);
+    }
+
+    /**
+     * @return bool
+     */
+    public function isNoCache()
+    {
+        return $this->headers->hasCacheControlDirective('no-cache') || 'no-cache' == $this->headers->get('Pragma');
+    }
+
+    /**
+     * Returns the preferred language.
+     *
+     * @param array $locales An array of ordered available locales
+     *
+     * @return string|null The preferred locale
+     */
+    public function getPreferredLanguage(array $locales = null)
+    {
+        $preferredLanguages = $this->getLanguages();
+
+        if (empty($locales)) {
+            return isset($preferredLanguages[0]) ? $preferredLanguages[0] : null;
+        }
+
+        if (!$preferredLanguages) {
+            return $locales[0];
+        }
+
+        $extendedPreferredLanguages = array();
+        foreach ($preferredLanguages as $language) {
+            $extendedPreferredLanguages[] = $language;
+            if (false !== $position = strpos($language, '_')) {
+                $superLanguage = substr($language, 0, $position);
+                if (!in_array($superLanguage, $preferredLanguages)) {
+                    $extendedPreferredLanguages[] = $superLanguage;
+                }
+            }
+        }
+
+        $preferredLanguages = array_values(array_intersect($extendedPreferredLanguages, $locales));
+
+        return isset($preferredLanguages[0]) ? $preferredLanguages[0] : $locales[0];
+    }
+
+    /**
+     * Gets a list of languages acceptable by the client browser.
+     *
+     * @return array Languages ordered in the user browser preferences
+     */
+    public function getLanguages()
+    {
+        if (null !== $this->languages) {
+            return $this->languages;
+        }
+
+        $languages = AcceptHeader::fromString($this->headers->get('Accept-Language'))->all();
+        $this->languages = array();
+        foreach ($languages as $lang => $acceptHeaderItem) {
+            if (false !== strpos($lang, '-')) {
+                $codes = explode('-', $lang);
+                if ('i' === $codes[0]) {
+                    // Language not listed in ISO 639 that are not variants
+                    // of any listed language, which can be registered with the
+                    // i-prefix, such as i-cherokee
+                    if (count($codes) > 1) {
+                        $lang = $codes[1];
+                    }
+                } else {
+                    for ($i = 0, $max = count($codes); $i < $max; ++$i) {
+                        if ($i === 0) {
+                            $lang = strtolower($codes[0]);
+                        } else {
+                            $lang .= '_'.strtoupper($codes[$i]);
+                        }
+                    }
+                }
+            }
+
+            $this->languages[] = $lang;
+        }
+
+        return $this->languages;
+    }
+
+    /**
+     * Gets a list of charsets acceptable by the client browser.
+     *
+     * @return array List of charsets in preferable order
+     */
+    public function getCharsets()
+    {
+        if (null !== $this->charsets) {
+            return $this->charsets;
+        }
+
+        return $this->charsets = array_keys(AcceptHeader::fromString($this->headers->get('Accept-Charset'))->all());
+    }
+
+    /**
+     * Gets a list of encodings acceptable by the client browser.
+     *
+     * @return array List of encodings in preferable order
+     */
+    public function getEncodings()
+    {
+        if (null !== $this->encodings) {
+            return $this->encodings;
+        }
+
+        return $this->encodings = array_keys(AcceptHeader::fromString($this->headers->get('Accept-Encoding'))->all());
+    }
+
+    /**
+     * Gets a list of content types acceptable by the client browser.
+     *
+     * @return array List of content types in preferable order
+     */
+    public function getAcceptableContentTypes()
+    {
+        if (null !== $this->acceptableContentTypes) {
+            return $this->acceptableContentTypes;
+        }
+
+        return $this->acceptableContentTypes = array_keys(AcceptHeader::fromString($this->headers->get('Accept'))->all());
+    }
+
+    /**
+     * Returns true if the request is a XMLHttpRequest.
+     *
+     * It works if your JavaScript library sets an X-Requested-With HTTP header.
+     * It is known to work with common JavaScript frameworks:
+     *
+     * @see http://en.wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript
+     *
+     * @return bool true if the request is an XMLHttpRequest, false otherwise
+     */
+    public function isXmlHttpRequest()
+    {
+        return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');
+    }
+
+    /*
+     * The following methods are derived from code of the Zend Framework (1.10dev - 2010-01-24)
+     *
+     * Code subject to the new BSD license (http://framework.zend.com/license/new-bsd).
+     *
+     * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+     */
+
+    protected function prepareRequestUri()
+    {
+        $requestUri = '';
+
+        if ($this->headers->has('X_ORIGINAL_URL')) {
+            // IIS with Microsoft Rewrite Module
+            $requestUri = $this->headers->get('X_ORIGINAL_URL');
+            $this->headers->remove('X_ORIGINAL_URL');
+            $this->server->remove('HTTP_X_ORIGINAL_URL');
+            $this->server->remove('UNENCODED_URL');
+            $this->server->remove('IIS_WasUrlRewritten');
+        } elseif ($this->headers->has('X_REWRITE_URL')) {
+            // IIS with ISAPI_Rewrite
+            $requestUri = $this->headers->get('X_REWRITE_URL');
+            $this->headers->remove('X_REWRITE_URL');
+        } elseif ($this->server->get('IIS_WasUrlRewritten') == '1' && $this->server->get('UNENCODED_URL') != '') {
+            // IIS7 with URL Rewrite: make sure we get the unencoded URL (double slash problem)
+            $requestUri = $this->server->get('UNENCODED_URL');
+            $this->server->remove('UNENCODED_URL');
+            $this->server->remove('IIS_WasUrlRewritten');
+        } elseif ($this->server->has('REQUEST_URI')) {
+            $requestUri = $this->server->get('REQUEST_URI');
+            // HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path, only use URL path
+            $schemeAndHttpHost = $this->getSchemeAndHttpHost();
+            if (strpos($requestUri, $schemeAndHttpHost) === 0) {
+                $requestUri = substr($requestUri, strlen($schemeAndHttpHost));
+            }
+        } elseif ($this->server->has('ORIG_PATH_INFO')) {
+            // IIS 5.0, PHP as CGI
+            $requestUri = $this->server->get('ORIG_PATH_INFO');
+            if ('' != $this->server->get('QUERY_STRING')) {
+                $requestUri .= '?'.$this->server->get('QUERY_STRING');
+            }
+            $this->server->remove('ORIG_PATH_INFO');
+        }
+
+        // normalize the request URI to ease creating sub-requests from this request
+        $this->server->set('REQUEST_URI', $requestUri);
+
+        return $requestUri;
+    }
+
+    /**
+     * Prepares the base URL.
+     *
+     * @return string
+     */
+    protected function prepareBaseUrl()
+    {
+        $filename = basename($this->server->get('SCRIPT_FILENAME'));
+
+        if (basename($this->server->get('SCRIPT_NAME')) === $filename) {
+            $baseUrl = $this->server->get('SCRIPT_NAME');
+        } elseif (basename($this->server->get('PHP_SELF')) === $filename) {
+            $baseUrl = $this->server->get('PHP_SELF');
+        } elseif (basename($this->server->get('ORIG_SCRIPT_NAME')) === $filename) {
+            $baseUrl = $this->server->get('ORIG_SCRIPT_NAME'); // 1and1 shared hosting compatibility
+        } else {
+            // Backtrack up the script_filename to find the portion matching
+            // php_self
+            $path = $this->server->get('PHP_SELF', '');
+            $file = $this->server->get('SCRIPT_FILENAME', '');
+            $segs = explode('/', trim($file, '/'));
+            $segs = array_reverse($segs);
+            $index = 0;
+            $last = count($segs);
+            $baseUrl = '';
+            do {
+                $seg = $segs[$index];
+                $baseUrl = '/'.$seg.$baseUrl;
+                ++$index;
+            } while ($last > $index && (false !== $pos = strpos($path, $baseUrl)) && 0 != $pos);
+        }
+
+        // Does the baseUrl have anything in common with the request_uri?
+        $requestUri = $this->getRequestUri();
+
+        if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, $baseUrl)) {
+            // full $baseUrl matches
+            return $prefix;
+        }
+
+        if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, rtrim(dirname($baseUrl), '/'.DIRECTORY_SEPARATOR).'/')) {
+            // directory portion of $baseUrl matches
+            return rtrim($prefix, '/'.DIRECTORY_SEPARATOR);
+        }
+
+        $truncatedRequestUri = $requestUri;
+        if (false !== $pos = strpos($requestUri, '?')) {
+            $truncatedRequestUri = substr($requestUri, 0, $pos);
+        }
+
+        $basename = basename($baseUrl);
+        if (empty($basename) || !strpos(rawurldecode($truncatedRequestUri), $basename)) {
+            // no match whatsoever; set it blank
+            return '';
+        }
+
+        // If using mod_rewrite or ISAPI_Rewrite strip the script filename
+        // out of baseUrl. $pos !== 0 makes sure it is not matching a value
+        // from PATH_INFO or QUERY_STRING
+        if (strlen($requestUri) >= strlen($baseUrl) && (false !== $pos = strpos($requestUri, $baseUrl)) && $pos !== 0) {
+            $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl));
+        }
+
+        return rtrim($baseUrl, '/'.DIRECTORY_SEPARATOR);
+    }
+
+    /**
+     * Prepares the base path.
+     *
+     * @return string base path
+     */
+    protected function prepareBasePath()
+    {
+        $filename = basename($this->server->get('SCRIPT_FILENAME'));
+        $baseUrl = $this->getBaseUrl();
+        if (empty($baseUrl)) {
+            return '';
+        }
+
+        if (basename($baseUrl) === $filename) {
+            $basePath = dirname($baseUrl);
+        } else {
+            $basePath = $baseUrl;
+        }
+
+        if ('\\' === DIRECTORY_SEPARATOR) {
+            $basePath = str_replace('\\', '/', $basePath);
+        }
+
+        return rtrim($basePath, '/');
+    }
+
+    /**
+     * Prepares the path info.
+     *
+     * @return string path info
+     */
+    protected function preparePathInfo()
+    {
+        $baseUrl = $this->getBaseUrl();
+
+        if (null === ($requestUri = $this->getRequestUri())) {
+            return '/';
+        }
+
+        // Remove the query string from REQUEST_URI
+        if ($pos = strpos($requestUri, '?')) {
+            $requestUri = substr($requestUri, 0, $pos);
+        }
+
+        $pathInfo = substr($requestUri, strlen($baseUrl));
+        if (null !== $baseUrl && (false === $pathInfo || '' === $pathInfo)) {
+            // If substr() returns false then PATH_INFO is set to an empty string
+            return '/';
+        } elseif (null === $baseUrl) {
+            return $requestUri;
+        }
+
+        return (string) $pathInfo;
+    }
+
+    /**
+     * Initializes HTTP request formats.
+     */
+    protected static function initializeFormats()
+    {
+        static::$formats = array(
+            'html' => array('text/html', 'application/xhtml+xml'),
+            'txt' => array('text/plain'),
+            'js' => array('application/javascript', 'application/x-javascript', 'text/javascript'),
+            'css' => array('text/css'),
+            'json' => array('application/json', 'application/x-json'),
+            'xml' => array('text/xml', 'application/xml', 'application/x-xml'),
+            'rdf' => array('application/rdf+xml'),
+            'atom' => array('application/atom+xml'),
+            'rss' => array('application/rss+xml'),
+            'form' => array('application/x-www-form-urlencoded'),
+        );
+    }
+
+    /**
+     * Sets the default PHP locale.
+     *
+     * @param string $locale
+     */
+    private function setPhpDefaultLocale($locale)
+    {
+        // if either the class Locale doesn't exist, or an exception is thrown when
+        // setting the default locale, the intl module is not installed, and
+        // the call can be ignored:
+        try {
+            if (class_exists('Locale', false)) {
+                \Locale::setDefault($locale);
+            }
+        } catch (\Exception $e) {
+        }
+    }
+
+    /*
+     * Returns the prefix as encoded in the string when the string starts with
+     * the given prefix, false otherwise.
+     *
+     * @param string $string The urlencoded string
+     * @param string $prefix The prefix not encoded
+     *
+     * @return string|false The prefix as it is encoded in $string, or false
+     */
+    private function getUrlencodedPrefix($string, $prefix)
+    {
+        if (0 !== strpos(rawurldecode($string), $prefix)) {
+            return false;
+        }
+
+        $len = strlen($prefix);
+
+        if (preg_match(sprintf('#^(%%[[:xdigit:]]{2}|.){%d}#', $len), $string, $match)) {
+            return $match[0];
+        }
+
+        return false;
+    }
+
+    private static function createRequestFromFactory(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
+    {
+        if (self::$requestFactory) {
+            $request = call_user_func(self::$requestFactory, $query, $request, $attributes, $cookies, $files, $server, $content);
+
+            if (!$request instanceof self) {
+                throw new \LogicException('The Request factory must return an instance of Symfony\Component\HttpFoundation\Request.');
+            }
+
+            return $request;
+        }
+
+        return new static($query, $request, $attributes, $cookies, $files, $server, $content);
+    }
+
+    private function isFromTrustedProxy()
+    {
+        return self::$trustedProxies && IpUtils::checkIp($this->server->get('REMOTE_ADDR'), self::$trustedProxies);
+    }
+
+    private function normalizeAndFilterClientIps(array $clientIps, $ip)
+    {
+        $clientIps[] = $ip; // Complete the IP chain with the IP the request actually came from
+        $firstTrustedIp = null;
+
+        foreach ($clientIps as $key => $clientIp) {
+            // Remove port (unfortunately, it does happen)
+            if (preg_match('{((?:\d+\.){3}\d+)\:\d+}', $clientIp, $match)) {
+                $clientIps[$key] = $clientIp = $match[1];
+            }
+
+            if (!filter_var($clientIp, FILTER_VALIDATE_IP)) {
+                unset($clientIps[$key]);
+
+                continue;
+            }
+
+            if (IpUtils::checkIp($clientIp, self::$trustedProxies)) {
+                unset($clientIps[$key]);
+
+                // Fallback to this when the client IP falls into the range of trusted proxies
+                if (null === $firstTrustedIp) {
+                    $firstTrustedIp = $clientIp;
+                }
+            }
+        }
+
+        // Now the IP chain contains only untrusted proxies and the client IP
+        return $clientIps ? array_reverse($clientIps) : array($firstTrustedIp);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/RequestMatcher.php
@@ -0,0 +1,178 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+/**
+ * RequestMatcher compares a pre-defined set of checks against a Request instance.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class RequestMatcher implements RequestMatcherInterface
+{
+    /**
+     * @var string|null
+     */
+    private $path;
+
+    /**
+     * @var string|null
+     */
+    private $host;
+
+    /**
+     * @var string[]
+     */
+    private $methods = array();
+
+    /**
+     * @var string[]
+     */
+    private $ips = array();
+
+    /**
+     * @var array
+     */
+    private $attributes = array();
+
+    /**
+     * @var string[]
+     */
+    private $schemes = array();
+
+    /**
+     * @param string|null          $path
+     * @param string|null          $host
+     * @param string|string[]|null $methods
+     * @param string|string[]|null $ips
+     * @param array                $attributes
+     * @param string|string[]|null $schemes
+     */
+    public function __construct($path = null, $host = null, $methods = null, $ips = null, array $attributes = array(), $schemes = null)
+    {
+        $this->matchPath($path);
+        $this->matchHost($host);
+        $this->matchMethod($methods);
+        $this->matchIps($ips);
+        $this->matchScheme($schemes);
+
+        foreach ($attributes as $k => $v) {
+            $this->matchAttribute($k, $v);
+        }
+    }
+
+    /**
+     * Adds a check for the HTTP scheme.
+     *
+     * @param string|string[]|null $scheme An HTTP scheme or an array of HTTP schemes
+     */
+    public function matchScheme($scheme)
+    {
+        $this->schemes = null !== $scheme ? array_map('strtolower', (array) $scheme) : array();
+    }
+
+    /**
+     * Adds a check for the URL host name.
+     *
+     * @param string|null $regexp A Regexp
+     */
+    public function matchHost($regexp)
+    {
+        $this->host = $regexp;
+    }
+
+    /**
+     * Adds a check for the URL path info.
+     *
+     * @param string|null $regexp A Regexp
+     */
+    public function matchPath($regexp)
+    {
+        $this->path = $regexp;
+    }
+
+    /**
+     * Adds a check for the client IP.
+     *
+     * @param string $ip A specific IP address or a range specified using IP/netmask like 192.168.1.0/24
+     */
+    public function matchIp($ip)
+    {
+        $this->matchIps($ip);
+    }
+
+    /**
+     * Adds a check for the client IP.
+     *
+     * @param string|string[]|null $ips A specific IP address or a range specified using IP/netmask like 192.168.1.0/24
+     */
+    public function matchIps($ips)
+    {
+        $this->ips = null !== $ips ? (array) $ips : array();
+    }
+
+    /**
+     * Adds a check for the HTTP method.
+     *
+     * @param string|string[]|null $method An HTTP method or an array of HTTP methods
+     */
+    public function matchMethod($method)
+    {
+        $this->methods = null !== $method ? array_map('strtoupper', (array) $method) : array();
+    }
+
+    /**
+     * Adds a check for request attribute.
+     *
+     * @param string $key    The request attribute name
+     * @param string $regexp A Regexp
+     */
+    public function matchAttribute($key, $regexp)
+    {
+        $this->attributes[$key] = $regexp;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function matches(Request $request)
+    {
+        if ($this->schemes && !in_array($request->getScheme(), $this->schemes, true)) {
+            return false;
+        }
+
+        if ($this->methods && !in_array($request->getMethod(), $this->methods, true)) {
+            return false;
+        }
+
+        foreach ($this->attributes as $key => $pattern) {
+            if (!preg_match('{'.$pattern.'}', $request->attributes->get($key))) {
+                return false;
+            }
+        }
+
+        if (null !== $this->path && !preg_match('{'.$this->path.'}', rawurldecode($request->getPathInfo()))) {
+            return false;
+        }
+
+        if (null !== $this->host && !preg_match('{'.$this->host.'}i', $request->getHost())) {
+            return false;
+        }
+
+        if (IpUtils::checkIp($request->getClientIp(), $this->ips)) {
+            return true;
+        }
+
+        // Note to future implementors: add additional checks above the
+        // foreach above or else your check might not be run!
+        return count($this->ips) === 0;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/RequestMatcherInterface.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+/**
+ * RequestMatcherInterface is an interface for strategies to match a Request.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface RequestMatcherInterface
+{
+    /**
+     * Decides whether the rule(s) implemented by the strategy matches the supplied request.
+     *
+     * @param Request $request The request to check for a match
+     *
+     * @return bool true if the request matches, false otherwise
+     */
+    public function matches(Request $request);
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/RequestStack.php
@@ -0,0 +1,103 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+/**
+ * Request stack that controls the lifecycle of requests.
+ *
+ * @author Benjamin Eberlei <kontakt@beberlei.de>
+ */
+class RequestStack
+{
+    /**
+     * @var Request[]
+     */
+    private $requests = array();
+
+    /**
+     * Pushes a Request on the stack.
+     *
+     * This method should generally not be called directly as the stack
+     * management should be taken care of by the application itself.
+     */
+    public function push(Request $request)
+    {
+        $this->requests[] = $request;
+    }
+
+    /**
+     * Pops the current request from the stack.
+     *
+     * This operation lets the current request go out of scope.
+     *
+     * This method should generally not be called directly as the stack
+     * management should be taken care of by the application itself.
+     *
+     * @return Request|null
+     */
+    public function pop()
+    {
+        if (!$this->requests) {
+            return;
+        }
+
+        return array_pop($this->requests);
+    }
+
+    /**
+     * @return Request|null
+     */
+    public function getCurrentRequest()
+    {
+        return end($this->requests) ?: null;
+    }
+
+    /**
+     * Gets the master Request.
+     *
+     * Be warned that making your code aware of the master request
+     * might make it un-compatible with other features of your framework
+     * like ESI support.
+     *
+     * @return Request|null
+     */
+    public function getMasterRequest()
+    {
+        if (!$this->requests) {
+            return;
+        }
+
+        return $this->requests[0];
+    }
+
+    /**
+     * Returns the parent request of the current.
+     *
+     * Be warned that making your code aware of the parent request
+     * might make it un-compatible with other features of your framework
+     * like ESI support.
+     *
+     * If current Request is the master request, it returns null.
+     *
+     * @return Request|null
+     */
+    public function getParentRequest()
+    {
+        $pos = count($this->requests) - 2;
+
+        if (!isset($this->requests[$pos])) {
+            return;
+        }
+
+        return $this->requests[$pos];
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Response.php
@@ -0,0 +1,1180 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+/**
+ * Response represents an HTTP response.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Response
+{
+    const HTTP_CONTINUE = 100;
+    const HTTP_SWITCHING_PROTOCOLS = 101;
+    const HTTP_PROCESSING = 102;            // RFC2518
+    const HTTP_OK = 200;
+    const HTTP_CREATED = 201;
+    const HTTP_ACCEPTED = 202;
+    const HTTP_NON_AUTHORITATIVE_INFORMATION = 203;
+    const HTTP_NO_CONTENT = 204;
+    const HTTP_RESET_CONTENT = 205;
+    const HTTP_PARTIAL_CONTENT = 206;
+    const HTTP_MULTI_STATUS = 207;          // RFC4918
+    const HTTP_ALREADY_REPORTED = 208;      // RFC5842
+    const HTTP_IM_USED = 226;               // RFC3229
+    const HTTP_MULTIPLE_CHOICES = 300;
+    const HTTP_MOVED_PERMANENTLY = 301;
+    const HTTP_FOUND = 302;
+    const HTTP_SEE_OTHER = 303;
+    const HTTP_NOT_MODIFIED = 304;
+    const HTTP_USE_PROXY = 305;
+    const HTTP_RESERVED = 306;
+    const HTTP_TEMPORARY_REDIRECT = 307;
+    const HTTP_PERMANENTLY_REDIRECT = 308;  // RFC7238
+    const HTTP_BAD_REQUEST = 400;
+    const HTTP_UNAUTHORIZED = 401;
+    const HTTP_PAYMENT_REQUIRED = 402;
+    const HTTP_FORBIDDEN = 403;
+    const HTTP_NOT_FOUND = 404;
+    const HTTP_METHOD_NOT_ALLOWED = 405;
+    const HTTP_NOT_ACCEPTABLE = 406;
+    const HTTP_PROXY_AUTHENTICATION_REQUIRED = 407;
+    const HTTP_REQUEST_TIMEOUT = 408;
+    const HTTP_CONFLICT = 409;
+    const HTTP_GONE = 410;
+    const HTTP_LENGTH_REQUIRED = 411;
+    const HTTP_PRECONDITION_FAILED = 412;
+    const HTTP_REQUEST_ENTITY_TOO_LARGE = 413;
+    const HTTP_REQUEST_URI_TOO_LONG = 414;
+    const HTTP_UNSUPPORTED_MEDIA_TYPE = 415;
+    const HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
+    const HTTP_EXPECTATION_FAILED = 417;
+    const HTTP_I_AM_A_TEAPOT = 418;                                               // RFC2324
+    const HTTP_MISDIRECTED_REQUEST = 421;                                         // RFC7540
+    const HTTP_UNPROCESSABLE_ENTITY = 422;                                        // RFC4918
+    const HTTP_LOCKED = 423;                                                      // RFC4918
+    const HTTP_FAILED_DEPENDENCY = 424;                                           // RFC4918
+    const HTTP_RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL = 425;   // RFC2817
+    const HTTP_UPGRADE_REQUIRED = 426;                                            // RFC2817
+    const HTTP_PRECONDITION_REQUIRED = 428;                                       // RFC6585
+    const HTTP_TOO_MANY_REQUESTS = 429;                                           // RFC6585
+    const HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431;                             // RFC6585
+    const HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = 451;
+    const HTTP_INTERNAL_SERVER_ERROR = 500;
+    const HTTP_NOT_IMPLEMENTED = 501;
+    const HTTP_BAD_GATEWAY = 502;
+    const HTTP_SERVICE_UNAVAILABLE = 503;
+    const HTTP_GATEWAY_TIMEOUT = 504;
+    const HTTP_VERSION_NOT_SUPPORTED = 505;
+    const HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL = 506;                        // RFC2295
+    const HTTP_INSUFFICIENT_STORAGE = 507;                                        // RFC4918
+    const HTTP_LOOP_DETECTED = 508;                                               // RFC5842
+    const HTTP_NOT_EXTENDED = 510;                                                // RFC2774
+    const HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511;                             // RFC6585
+
+    /**
+     * @var \Symfony\Component\HttpFoundation\ResponseHeaderBag
+     */
+    public $headers;
+
+    /**
+     * @var string
+     */
+    protected $content;
+
+    /**
+     * @var string
+     */
+    protected $version;
+
+    /**
+     * @var int
+     */
+    protected $statusCode;
+
+    /**
+     * @var string
+     */
+    protected $statusText;
+
+    /**
+     * @var string
+     */
+    protected $charset;
+
+    /**
+     * Status codes translation table.
+     *
+     * The list of codes is complete according to the
+     * {@link http://www.iana.org/assignments/http-status-codes/ Hypertext Transfer Protocol (HTTP) Status Code Registry}
+     * (last updated 2016-03-01).
+     *
+     * Unless otherwise noted, the status code is defined in RFC2616.
+     *
+     * @var array
+     */
+    public static $statusTexts = array(
+        100 => 'Continue',
+        101 => 'Switching Protocols',
+        102 => 'Processing',            // RFC2518
+        200 => 'OK',
+        201 => 'Created',
+        202 => 'Accepted',
+        203 => 'Non-Authoritative Information',
+        204 => 'No Content',
+        205 => 'Reset Content',
+        206 => 'Partial Content',
+        207 => 'Multi-Status',          // RFC4918
+        208 => 'Already Reported',      // RFC5842
+        226 => 'IM Used',               // RFC3229
+        300 => 'Multiple Choices',
+        301 => 'Moved Permanently',
+        302 => 'Found',
+        303 => 'See Other',
+        304 => 'Not Modified',
+        305 => 'Use Proxy',
+        307 => 'Temporary Redirect',
+        308 => 'Permanent Redirect',    // RFC7238
+        400 => 'Bad Request',
+        401 => 'Unauthorized',
+        402 => 'Payment Required',
+        403 => 'Forbidden',
+        404 => 'Not Found',
+        405 => 'Method Not Allowed',
+        406 => 'Not Acceptable',
+        407 => 'Proxy Authentication Required',
+        408 => 'Request Timeout',
+        409 => 'Conflict',
+        410 => 'Gone',
+        411 => 'Length Required',
+        412 => 'Precondition Failed',
+        413 => 'Payload Too Large',
+        414 => 'URI Too Long',
+        415 => 'Unsupported Media Type',
+        416 => 'Range Not Satisfiable',
+        417 => 'Expectation Failed',
+        418 => 'I\'m a teapot',                                               // RFC2324
+        421 => 'Misdirected Request',                                         // RFC7540
+        422 => 'Unprocessable Entity',                                        // RFC4918
+        423 => 'Locked',                                                      // RFC4918
+        424 => 'Failed Dependency',                                           // RFC4918
+        425 => 'Reserved for WebDAV advanced collections expired proposal',   // RFC2817
+        426 => 'Upgrade Required',                                            // RFC2817
+        428 => 'Precondition Required',                                       // RFC6585
+        429 => 'Too Many Requests',                                           // RFC6585
+        431 => 'Request Header Fields Too Large',                             // RFC6585
+        451 => 'Unavailable For Legal Reasons',                               // RFC7725
+        500 => 'Internal Server Error',
+        501 => 'Not Implemented',
+        502 => 'Bad Gateway',
+        503 => 'Service Unavailable',
+        504 => 'Gateway Timeout',
+        505 => 'HTTP Version Not Supported',
+        506 => 'Variant Also Negotiates (Experimental)',                      // RFC2295
+        507 => 'Insufficient Storage',                                        // RFC4918
+        508 => 'Loop Detected',                                               // RFC5842
+        510 => 'Not Extended',                                                // RFC2774
+        511 => 'Network Authentication Required',                             // RFC6585
+    );
+
+    /**
+     * Constructor.
+     *
+     * @param mixed $content The response content, see setContent()
+     * @param int   $status  The response status code
+     * @param array $headers An array of response headers
+     *
+     * @throws \InvalidArgumentException When the HTTP status code is not valid
+     */
+    public function __construct($content = '', $status = 200, $headers = array())
+    {
+        $this->headers = new ResponseHeaderBag($headers);
+        $this->setContent($content);
+        $this->setStatusCode($status);
+        $this->setProtocolVersion('1.0');
+    }
+
+    /**
+     * Factory method for chainability.
+     *
+     * Example:
+     *
+     *     return Response::create($body, 200)
+     *         ->setSharedMaxAge(300);
+     *
+     * @param mixed $content The response content, see setContent()
+     * @param int   $status  The response status code
+     * @param array $headers An array of response headers
+     *
+     * @return Response
+     */
+    public static function create($content = '', $status = 200, $headers = array())
+    {
+        return new static($content, $status, $headers);
+    }
+
+    /**
+     * Returns the Response as an HTTP string.
+     *
+     * The string representation of the Response is the same as the
+     * one that will be sent to the client only if the prepare() method
+     * has been called before.
+     *
+     * @return string The Response as an HTTP string
+     *
+     * @see prepare()
+     */
+    public function __toString()
+    {
+        return
+            sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText)."\r\n".
+            $this->headers."\r\n".
+            $this->getContent();
+    }
+
+    /**
+     * Clones the current Response instance.
+     */
+    public function __clone()
+    {
+        $this->headers = clone $this->headers;
+    }
+
+    /**
+     * Prepares the Response before it is sent to the client.
+     *
+     * This method tweaks the Response to ensure that it is
+     * compliant with RFC 2616. Most of the changes are based on
+     * the Request that is "associated" with this Response.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return Response The current response
+     */
+    public function prepare(Request $request)
+    {
+        $headers = $this->headers;
+
+        if ($this->isInformational() || $this->isEmpty()) {
+            $this->setContent(null);
+            $headers->remove('Content-Type');
+            $headers->remove('Content-Length');
+        } else {
+            // Content-type based on the Request
+            if (!$headers->has('Content-Type')) {
+                $format = $request->getRequestFormat();
+                if (null !== $format && $mimeType = $request->getMimeType($format)) {
+                    $headers->set('Content-Type', $mimeType);
+                }
+            }
+
+            // Fix Content-Type
+            $charset = $this->charset ?: 'UTF-8';
+            if (!$headers->has('Content-Type')) {
+                $headers->set('Content-Type', 'text/html; charset='.$charset);
+            } elseif (0 === stripos($headers->get('Content-Type'), 'text/') && false === stripos($headers->get('Content-Type'), 'charset')) {
+                // add the charset
+                $headers->set('Content-Type', $headers->get('Content-Type').'; charset='.$charset);
+            }
+
+            // Fix Content-Length
+            if ($headers->has('Transfer-Encoding')) {
+                $headers->remove('Content-Length');
+            }
+
+            if ($request->isMethod('HEAD')) {
+                // cf. RFC2616 14.13
+                $length = $headers->get('Content-Length');
+                $this->setContent(null);
+                if ($length) {
+                    $headers->set('Content-Length', $length);
+                }
+            }
+        }
+
+        // Fix protocol
+        if ('HTTP/1.0' != $request->server->get('SERVER_PROTOCOL')) {
+            $this->setProtocolVersion('1.1');
+        }
+
+        // Check if we need to send extra expire info headers
+        if ('1.0' == $this->getProtocolVersion() && 'no-cache' == $this->headers->get('Cache-Control')) {
+            $this->headers->set('pragma', 'no-cache');
+            $this->headers->set('expires', -1);
+        }
+
+        $this->ensureIEOverSSLCompatibility($request);
+
+        return $this;
+    }
+
+    /**
+     * Sends HTTP headers.
+     *
+     * @return Response
+     */
+    public function sendHeaders()
+    {
+        // headers have already been sent by the developer
+        if (headers_sent()) {
+            return $this;
+        }
+
+        if (!$this->headers->has('Date')) {
+            $this->setDate(\DateTime::createFromFormat('U', time()));
+        }
+
+        // headers
+        foreach ($this->headers->allPreserveCase() as $name => $values) {
+            foreach ($values as $value) {
+                header($name.': '.$value, false, $this->statusCode);
+            }
+        }
+
+        // status
+        header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText), true, $this->statusCode);
+
+        // cookies
+        foreach ($this->headers->getCookies() as $cookie) {
+            setcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
+        }
+
+        return $this;
+    }
+
+    /**
+     * Sends content for the current web response.
+     *
+     * @return Response
+     */
+    public function sendContent()
+    {
+        echo $this->content;
+
+        return $this;
+    }
+
+    /**
+     * Sends HTTP headers and content.
+     *
+     * @return Response
+     */
+    public function send()
+    {
+        $this->sendHeaders();
+        $this->sendContent();
+
+        if (function_exists('fastcgi_finish_request')) {
+            fastcgi_finish_request();
+        } elseif ('cli' !== PHP_SAPI) {
+            static::closeOutputBuffers(0, true);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Sets the response content.
+     *
+     * Valid types are strings, numbers, null, and objects that implement a __toString() method.
+     *
+     * @param mixed $content Content that can be cast to string
+     *
+     * @return Response
+     *
+     * @throws \UnexpectedValueException
+     */
+    public function setContent($content)
+    {
+        if (null !== $content && !is_string($content) && !is_numeric($content) && !is_callable(array($content, '__toString'))) {
+            throw new \UnexpectedValueException(sprintf('The Response content must be a string or object implementing __toString(), "%s" given.', gettype($content)));
+        }
+
+        $this->content = (string) $content;
+
+        return $this;
+    }
+
+    /**
+     * Gets the current response content.
+     *
+     * @return string Content
+     */
+    public function getContent()
+    {
+        return $this->content;
+    }
+
+    /**
+     * Sets the HTTP protocol version (1.0 or 1.1).
+     *
+     * @param string $version The HTTP protocol version
+     *
+     * @return Response
+     */
+    public function setProtocolVersion($version)
+    {
+        $this->version = $version;
+
+        return $this;
+    }
+
+    /**
+     * Gets the HTTP protocol version.
+     *
+     * @return string The HTTP protocol version
+     */
+    public function getProtocolVersion()
+    {
+        return $this->version;
+    }
+
+    /**
+     * Sets the response status code.
+     *
+     * @param int   $code HTTP status code
+     * @param mixed $text HTTP status text
+     *
+     * If the status text is null it will be automatically populated for the known
+     * status codes and left empty otherwise.
+     *
+     * @return Response
+     *
+     * @throws \InvalidArgumentException When the HTTP status code is not valid
+     */
+    public function setStatusCode($code, $text = null)
+    {
+        $this->statusCode = $code = (int) $code;
+        if ($this->isInvalid()) {
+            throw new \InvalidArgumentException(sprintf('The HTTP status code "%s" is not valid.', $code));
+        }
+
+        if (null === $text) {
+            $this->statusText = isset(self::$statusTexts[$code]) ? self::$statusTexts[$code] : 'unknown status';
+
+            return $this;
+        }
+
+        if (false === $text) {
+            $this->statusText = '';
+
+            return $this;
+        }
+
+        $this->statusText = $text;
+
+        return $this;
+    }
+
+    /**
+     * Retrieves the status code for the current web response.
+     *
+     * @return int Status code
+     */
+    public function getStatusCode()
+    {
+        return $this->statusCode;
+    }
+
+    /**
+     * Sets the response charset.
+     *
+     * @param string $charset Character set
+     *
+     * @return Response
+     */
+    public function setCharset($charset)
+    {
+        $this->charset = $charset;
+
+        return $this;
+    }
+
+    /**
+     * Retrieves the response charset.
+     *
+     * @return string Character set
+     */
+    public function getCharset()
+    {
+        return $this->charset;
+    }
+
+    /**
+     * Returns true if the response is worth caching under any circumstance.
+     *
+     * Responses marked "private" with an explicit Cache-Control directive are
+     * considered uncacheable.
+     *
+     * Responses with neither a freshness lifetime (Expires, max-age) nor cache
+     * validator (Last-Modified, ETag) are considered uncacheable.
+     *
+     * @return bool true if the response is worth caching, false otherwise
+     */
+    public function isCacheable()
+    {
+        if (!in_array($this->statusCode, array(200, 203, 300, 301, 302, 404, 410))) {
+            return false;
+        }
+
+        if ($this->headers->hasCacheControlDirective('no-store') || $this->headers->getCacheControlDirective('private')) {
+            return false;
+        }
+
+        return $this->isValidateable() || $this->isFresh();
+    }
+
+    /**
+     * Returns true if the response is "fresh".
+     *
+     * Fresh responses may be served from cache without any interaction with the
+     * origin. A response is considered fresh when it includes a Cache-Control/max-age
+     * indicator or Expires header and the calculated age is less than the freshness lifetime.
+     *
+     * @return bool true if the response is fresh, false otherwise
+     */
+    public function isFresh()
+    {
+        return $this->getTtl() > 0;
+    }
+
+    /**
+     * Returns true if the response includes headers that can be used to validate
+     * the response with the origin server using a conditional GET request.
+     *
+     * @return bool true if the response is validateable, false otherwise
+     */
+    public function isValidateable()
+    {
+        return $this->headers->has('Last-Modified') || $this->headers->has('ETag');
+    }
+
+    /**
+     * Marks the response as "private".
+     *
+     * It makes the response ineligible for serving other clients.
+     *
+     * @return Response
+     */
+    public function setPrivate()
+    {
+        $this->headers->removeCacheControlDirective('public');
+        $this->headers->addCacheControlDirective('private');
+
+        return $this;
+    }
+
+    /**
+     * Marks the response as "public".
+     *
+     * It makes the response eligible for serving other clients.
+     *
+     * @return Response
+     */
+    public function setPublic()
+    {
+        $this->headers->addCacheControlDirective('public');
+        $this->headers->removeCacheControlDirective('private');
+
+        return $this;
+    }
+
+    /**
+     * Returns true if the response must be revalidated by caches.
+     *
+     * This method indicates that the response must not be served stale by a
+     * cache in any circumstance without first revalidating with the origin.
+     * When present, the TTL of the response should not be overridden to be
+     * greater than the value provided by the origin.
+     *
+     * @return bool true if the response must be revalidated by a cache, false otherwise
+     */
+    public function mustRevalidate()
+    {
+        return $this->headers->hasCacheControlDirective('must-revalidate') || $this->headers->hasCacheControlDirective('proxy-revalidate');
+    }
+
+    /**
+     * Returns the Date header as a DateTime instance.
+     *
+     * @return \DateTime A \DateTime instance
+     *
+     * @throws \RuntimeException When the header is not parseable
+     */
+    public function getDate()
+    {
+        if (!$this->headers->has('Date')) {
+            $this->setDate(\DateTime::createFromFormat('U', time()));
+        }
+
+        return $this->headers->getDate('Date');
+    }
+
+    /**
+     * Sets the Date header.
+     *
+     * @param \DateTime $date A \DateTime instance
+     *
+     * @return Response
+     */
+    public function setDate(\DateTime $date)
+    {
+        $date->setTimezone(new \DateTimeZone('UTC'));
+        $this->headers->set('Date', $date->format('D, d M Y H:i:s').' GMT');
+
+        return $this;
+    }
+
+    /**
+     * Returns the age of the response.
+     *
+     * @return int The age of the response in seconds
+     */
+    public function getAge()
+    {
+        if (null !== $age = $this->headers->get('Age')) {
+            return (int) $age;
+        }
+
+        return max(time() - $this->getDate()->format('U'), 0);
+    }
+
+    /**
+     * Marks the response stale by setting the Age header to be equal to the maximum age of the response.
+     *
+     * @return Response
+     */
+    public function expire()
+    {
+        if ($this->isFresh()) {
+            $this->headers->set('Age', $this->getMaxAge());
+        }
+
+        return $this;
+    }
+
+    /**
+     * Returns the value of the Expires header as a DateTime instance.
+     *
+     * @return \DateTime|null A DateTime instance or null if the header does not exist
+     */
+    public function getExpires()
+    {
+        try {
+            return $this->headers->getDate('Expires');
+        } catch (\RuntimeException $e) {
+            // according to RFC 2616 invalid date formats (e.g. "0" and "-1") must be treated as in the past
+            return \DateTime::createFromFormat(DATE_RFC2822, 'Sat, 01 Jan 00 00:00:00 +0000');
+        }
+    }
+
+    /**
+     * Sets the Expires HTTP header with a DateTime instance.
+     *
+     * Passing null as value will remove the header.
+     *
+     * @param \DateTime|null $date A \DateTime instance or null to remove the header
+     *
+     * @return Response
+     */
+    public function setExpires(\DateTime $date = null)
+    {
+        if (null === $date) {
+            $this->headers->remove('Expires');
+        } else {
+            $date = clone $date;
+            $date->setTimezone(new \DateTimeZone('UTC'));
+            $this->headers->set('Expires', $date->format('D, d M Y H:i:s').' GMT');
+        }
+
+        return $this;
+    }
+
+    /**
+     * Returns the number of seconds after the time specified in the response's Date
+     * header when the response should no longer be considered fresh.
+     *
+     * First, it checks for a s-maxage directive, then a max-age directive, and then it falls
+     * back on an expires header. It returns null when no maximum age can be established.
+     *
+     * @return int|null Number of seconds
+     */
+    public function getMaxAge()
+    {
+        if ($this->headers->hasCacheControlDirective('s-maxage')) {
+            return (int) $this->headers->getCacheControlDirective('s-maxage');
+        }
+
+        if ($this->headers->hasCacheControlDirective('max-age')) {
+            return (int) $this->headers->getCacheControlDirective('max-age');
+        }
+
+        if (null !== $this->getExpires()) {
+            return $this->getExpires()->format('U') - $this->getDate()->format('U');
+        }
+    }
+
+    /**
+     * Sets the number of seconds after which the response should no longer be considered fresh.
+     *
+     * This methods sets the Cache-Control max-age directive.
+     *
+     * @param int $value Number of seconds
+     *
+     * @return Response
+     */
+    public function setMaxAge($value)
+    {
+        $this->headers->addCacheControlDirective('max-age', $value);
+
+        return $this;
+    }
+
+    /**
+     * Sets the number of seconds after which the response should no longer be considered fresh by shared caches.
+     *
+     * This methods sets the Cache-Control s-maxage directive.
+     *
+     * @param int $value Number of seconds
+     *
+     * @return Response
+     */
+    public function setSharedMaxAge($value)
+    {
+        $this->setPublic();
+        $this->headers->addCacheControlDirective('s-maxage', $value);
+
+        return $this;
+    }
+
+    /**
+     * Returns the response's time-to-live in seconds.
+     *
+     * It returns null when no freshness information is present in the response.
+     *
+     * When the responses TTL is <= 0, the response may not be served from cache without first
+     * revalidating with the origin.
+     *
+     * @return int|null The TTL in seconds
+     */
+    public function getTtl()
+    {
+        if (null !== $maxAge = $this->getMaxAge()) {
+            return $maxAge - $this->getAge();
+        }
+    }
+
+    /**
+     * Sets the response's time-to-live for shared caches.
+     *
+     * This method adjusts the Cache-Control/s-maxage directive.
+     *
+     * @param int $seconds Number of seconds
+     *
+     * @return Response
+     */
+    public function setTtl($seconds)
+    {
+        $this->setSharedMaxAge($this->getAge() + $seconds);
+
+        return $this;
+    }
+
+    /**
+     * Sets the response's time-to-live for private/client caches.
+     *
+     * This method adjusts the Cache-Control/max-age directive.
+     *
+     * @param int $seconds Number of seconds
+     *
+     * @return Response
+     */
+    public function setClientTtl($seconds)
+    {
+        $this->setMaxAge($this->getAge() + $seconds);
+
+        return $this;
+    }
+
+    /**
+     * Returns the Last-Modified HTTP header as a DateTime instance.
+     *
+     * @return \DateTime|null A DateTime instance or null if the header does not exist
+     *
+     * @throws \RuntimeException When the HTTP header is not parseable
+     */
+    public function getLastModified()
+    {
+        return $this->headers->getDate('Last-Modified');
+    }
+
+    /**
+     * Sets the Last-Modified HTTP header with a DateTime instance.
+     *
+     * Passing null as value will remove the header.
+     *
+     * @param \DateTime|null $date A \DateTime instance or null to remove the header
+     *
+     * @return Response
+     */
+    public function setLastModified(\DateTime $date = null)
+    {
+        if (null === $date) {
+            $this->headers->remove('Last-Modified');
+        } else {
+            $date = clone $date;
+            $date->setTimezone(new \DateTimeZone('UTC'));
+            $this->headers->set('Last-Modified', $date->format('D, d M Y H:i:s').' GMT');
+        }
+
+        return $this;
+    }
+
+    /**
+     * Returns the literal value of the ETag HTTP header.
+     *
+     * @return string|null The ETag HTTP header or null if it does not exist
+     */
+    public function getEtag()
+    {
+        return $this->headers->get('ETag');
+    }
+
+    /**
+     * Sets the ETag value.
+     *
+     * @param string|null $etag The ETag unique identifier or null to remove the header
+     * @param bool        $weak Whether you want a weak ETag or not
+     *
+     * @return Response
+     */
+    public function setEtag($etag = null, $weak = false)
+    {
+        if (null === $etag) {
+            $this->headers->remove('Etag');
+        } else {
+            if (0 !== strpos($etag, '"')) {
+                $etag = '"'.$etag.'"';
+            }
+
+            $this->headers->set('ETag', (true === $weak ? 'W/' : '').$etag);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Sets the response's cache headers (validation and/or expiration).
+     *
+     * Available options are: etag, last_modified, max_age, s_maxage, private, and public.
+     *
+     * @param array $options An array of cache options
+     *
+     * @return Response
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function setCache(array $options)
+    {
+        if ($diff = array_diff(array_keys($options), array('etag', 'last_modified', 'max_age', 's_maxage', 'private', 'public'))) {
+            throw new \InvalidArgumentException(sprintf('Response does not support the following options: "%s".', implode('", "', array_values($diff))));
+        }
+
+        if (isset($options['etag'])) {
+            $this->setEtag($options['etag']);
+        }
+
+        if (isset($options['last_modified'])) {
+            $this->setLastModified($options['last_modified']);
+        }
+
+        if (isset($options['max_age'])) {
+            $this->setMaxAge($options['max_age']);
+        }
+
+        if (isset($options['s_maxage'])) {
+            $this->setSharedMaxAge($options['s_maxage']);
+        }
+
+        if (isset($options['public'])) {
+            if ($options['public']) {
+                $this->setPublic();
+            } else {
+                $this->setPrivate();
+            }
+        }
+
+        if (isset($options['private'])) {
+            if ($options['private']) {
+                $this->setPrivate();
+            } else {
+                $this->setPublic();
+            }
+        }
+
+        return $this;
+    }
+
+    /**
+     * Modifies the response so that it conforms to the rules defined for a 304 status code.
+     *
+     * This sets the status, removes the body, and discards any headers
+     * that MUST NOT be included in 304 responses.
+     *
+     * @return Response
+     *
+     * @see http://tools.ietf.org/html/rfc2616#section-10.3.5
+     */
+    public function setNotModified()
+    {
+        $this->setStatusCode(304);
+        $this->setContent(null);
+
+        // remove headers that MUST NOT be included with 304 Not Modified responses
+        foreach (array('Allow', 'Content-Encoding', 'Content-Language', 'Content-Length', 'Content-MD5', 'Content-Type', 'Last-Modified') as $header) {
+            $this->headers->remove($header);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Returns true if the response includes a Vary header.
+     *
+     * @return bool true if the response includes a Vary header, false otherwise
+     */
+    public function hasVary()
+    {
+        return null !== $this->headers->get('Vary');
+    }
+
+    /**
+     * Returns an array of header names given in the Vary header.
+     *
+     * @return array An array of Vary names
+     */
+    public function getVary()
+    {
+        if (!$vary = $this->headers->get('Vary', null, false)) {
+            return array();
+        }
+
+        $ret = array();
+        foreach ($vary as $item) {
+            $ret = array_merge($ret, preg_split('/[\s,]+/', $item));
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Sets the Vary header.
+     *
+     * @param string|array $headers
+     * @param bool         $replace Whether to replace the actual value or not (true by default)
+     *
+     * @return Response
+     */
+    public function setVary($headers, $replace = true)
+    {
+        $this->headers->set('Vary', $headers, $replace);
+
+        return $this;
+    }
+
+    /**
+     * Determines if the Response validators (ETag, Last-Modified) match
+     * a conditional value specified in the Request.
+     *
+     * If the Response is not modified, it sets the status code to 304 and
+     * removes the actual content by calling the setNotModified() method.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return bool true if the Response validators match the Request, false otherwise
+     */
+    public function isNotModified(Request $request)
+    {
+        if (!$request->isMethodCacheable()) {
+            return false;
+        }
+
+        $notModified = false;
+        $lastModified = $this->headers->get('Last-Modified');
+        $modifiedSince = $request->headers->get('If-Modified-Since');
+
+        if ($etags = $request->getETags()) {
+            $notModified = in_array($this->getEtag(), $etags) || in_array('*', $etags);
+        }
+
+        if ($modifiedSince && $lastModified) {
+            $notModified = strtotime($modifiedSince) >= strtotime($lastModified) && (!$etags || $notModified);
+        }
+
+        if ($notModified) {
+            $this->setNotModified();
+        }
+
+        return $notModified;
+    }
+
+    /**
+     * Is response invalid?
+     *
+     * @return bool
+     *
+     * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
+     */
+    public function isInvalid()
+    {
+        return $this->statusCode < 100 || $this->statusCode >= 600;
+    }
+
+    /**
+     * Is response informative?
+     *
+     * @return bool
+     */
+    public function isInformational()
+    {
+        return $this->statusCode >= 100 && $this->statusCode < 200;
+    }
+
+    /**
+     * Is response successful?
+     *
+     * @return bool
+     */
+    public function isSuccessful()
+    {
+        return $this->statusCode >= 200 && $this->statusCode < 300;
+    }
+
+    /**
+     * Is the response a redirect?
+     *
+     * @return bool
+     */
+    public function isRedirection()
+    {
+        return $this->statusCode >= 300 && $this->statusCode < 400;
+    }
+
+    /**
+     * Is there a client error?
+     *
+     * @return bool
+     */
+    public function isClientError()
+    {
+        return $this->statusCode >= 400 && $this->statusCode < 500;
+    }
+
+    /**
+     * Was there a server side error?
+     *
+     * @return bool
+     */
+    public function isServerError()
+    {
+        return $this->statusCode >= 500 && $this->statusCode < 600;
+    }
+
+    /**
+     * Is the response OK?
+     *
+     * @return bool
+     */
+    public function isOk()
+    {
+        return 200 === $this->statusCode;
+    }
+
+    /**
+     * Is the response forbidden?
+     *
+     * @return bool
+     */
+    public function isForbidden()
+    {
+        return 403 === $this->statusCode;
+    }
+
+    /**
+     * Is the response a not found error?
+     *
+     * @return bool
+     */
+    public function isNotFound()
+    {
+        return 404 === $this->statusCode;
+    }
+
+    /**
+     * Is the response a redirect of some form?
+     *
+     * @param string $location
+     *
+     * @return bool
+     */
+    public function isRedirect($location = null)
+    {
+        return in_array($this->statusCode, array(201, 301, 302, 303, 307, 308)) && (null === $location ?: $location == $this->headers->get('Location'));
+    }
+
+    /**
+     * Is the response empty?
+     *
+     * @return bool
+     */
+    public function isEmpty()
+    {
+        return in_array($this->statusCode, array(204, 304));
+    }
+
+    /**
+     * Cleans or flushes output buffers up to target level.
+     *
+     * Resulting level can be greater than target level if a non-removable buffer has been encountered.
+     *
+     * @param int  $targetLevel The target output buffering level
+     * @param bool $flush       Whether to flush or clean the buffers
+     */
+    public static function closeOutputBuffers($targetLevel, $flush)
+    {
+        $status = ob_get_status(true);
+        $level = count($status);
+        $flags = defined('PHP_OUTPUT_HANDLER_REMOVABLE') ? PHP_OUTPUT_HANDLER_REMOVABLE | ($flush ? PHP_OUTPUT_HANDLER_FLUSHABLE : PHP_OUTPUT_HANDLER_CLEANABLE) : -1;
+
+        while ($level-- > $targetLevel && ($s = $status[$level]) && (!isset($s['del']) ? !isset($s['flags']) || $flags === ($s['flags'] & $flags) : $s['del'])) {
+            if ($flush) {
+                ob_end_flush();
+            } else {
+                ob_end_clean();
+            }
+        }
+    }
+
+    /**
+     * Checks if we need to remove Cache-Control for SSL encrypted downloads when using IE < 9.
+     *
+     * @see http://support.microsoft.com/kb/323308
+     */
+    protected function ensureIEOverSSLCompatibility(Request $request)
+    {
+        if (false !== stripos($this->headers->get('Content-Disposition'), 'attachment') && preg_match('/MSIE (.*?);/i', $request->server->get('HTTP_USER_AGENT'), $match) == 1 && true === $request->isSecure()) {
+            if ((int) preg_replace('/(MSIE )(.*?);/', '$2', $match[0]) < 9) {
+                $this->headers->remove('Cache-Control');
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/ResponseHeaderBag.php
@@ -0,0 +1,304 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+/**
+ * ResponseHeaderBag is a container for Response HTTP headers.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ResponseHeaderBag extends HeaderBag
+{
+    const COOKIES_FLAT = 'flat';
+    const COOKIES_ARRAY = 'array';
+
+    const DISPOSITION_ATTACHMENT = 'attachment';
+    const DISPOSITION_INLINE = 'inline';
+
+    /**
+     * @var array
+     */
+    protected $computedCacheControl = array();
+
+    /**
+     * @var array
+     */
+    protected $cookies = array();
+
+    /**
+     * @var array
+     */
+    protected $headerNames = array();
+
+    /**
+     * Constructor.
+     *
+     * @param array $headers An array of HTTP headers
+     */
+    public function __construct(array $headers = array())
+    {
+        parent::__construct($headers);
+
+        if (!isset($this->headers['cache-control'])) {
+            $this->set('Cache-Control', '');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __toString()
+    {
+        $cookies = '';
+        foreach ($this->getCookies() as $cookie) {
+            $cookies .= 'Set-Cookie: '.$cookie."\r\n";
+        }
+
+        ksort($this->headerNames);
+
+        return parent::__toString().$cookies;
+    }
+
+    /**
+     * Returns the headers, with original capitalizations.
+     *
+     * @return array An array of headers
+     */
+    public function allPreserveCase()
+    {
+        return array_combine($this->headerNames, $this->headers);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function replace(array $headers = array())
+    {
+        $this->headerNames = array();
+
+        parent::replace($headers);
+
+        if (!isset($this->headers['cache-control'])) {
+            $this->set('Cache-Control', '');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($key, $values, $replace = true)
+    {
+        parent::set($key, $values, $replace);
+
+        $uniqueKey = str_replace('_', '-', strtolower($key));
+        $this->headerNames[$uniqueKey] = $key;
+
+        // ensure the cache-control header has sensible defaults
+        if (in_array($uniqueKey, array('cache-control', 'etag', 'last-modified', 'expires'))) {
+            $computed = $this->computeCacheControlValue();
+            $this->headers['cache-control'] = array($computed);
+            $this->headerNames['cache-control'] = 'Cache-Control';
+            $this->computedCacheControl = $this->parseCacheControl($computed);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function remove($key)
+    {
+        parent::remove($key);
+
+        $uniqueKey = str_replace('_', '-', strtolower($key));
+        unset($this->headerNames[$uniqueKey]);
+
+        if ('cache-control' === $uniqueKey) {
+            $this->computedCacheControl = array();
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasCacheControlDirective($key)
+    {
+        return array_key_exists($key, $this->computedCacheControl);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getCacheControlDirective($key)
+    {
+        return array_key_exists($key, $this->computedCacheControl) ? $this->computedCacheControl[$key] : null;
+    }
+
+    /**
+     * Sets a cookie.
+     *
+     * @param Cookie $cookie
+     */
+    public function setCookie(Cookie $cookie)
+    {
+        $this->cookies[$cookie->getDomain()][$cookie->getPath()][$cookie->getName()] = $cookie;
+    }
+
+    /**
+     * Removes a cookie from the array, but does not unset it in the browser.
+     *
+     * @param string $name
+     * @param string $path
+     * @param string $domain
+     */
+    public function removeCookie($name, $path = '/', $domain = null)
+    {
+        if (null === $path) {
+            $path = '/';
+        }
+
+        unset($this->cookies[$domain][$path][$name]);
+
+        if (empty($this->cookies[$domain][$path])) {
+            unset($this->cookies[$domain][$path]);
+
+            if (empty($this->cookies[$domain])) {
+                unset($this->cookies[$domain]);
+            }
+        }
+    }
+
+    /**
+     * Returns an array with all cookies.
+     *
+     * @param string $format
+     *
+     * @return array
+     *
+     * @throws \InvalidArgumentException When the $format is invalid
+     */
+    public function getCookies($format = self::COOKIES_FLAT)
+    {
+        if (!in_array($format, array(self::COOKIES_FLAT, self::COOKIES_ARRAY))) {
+            throw new \InvalidArgumentException(sprintf('Format "%s" invalid (%s).', $format, implode(', ', array(self::COOKIES_FLAT, self::COOKIES_ARRAY))));
+        }
+
+        if (self::COOKIES_ARRAY === $format) {
+            return $this->cookies;
+        }
+
+        $flattenedCookies = array();
+        foreach ($this->cookies as $path) {
+            foreach ($path as $cookies) {
+                foreach ($cookies as $cookie) {
+                    $flattenedCookies[] = $cookie;
+                }
+            }
+        }
+
+        return $flattenedCookies;
+    }
+
+    /**
+     * Clears a cookie in the browser.
+     *
+     * @param string $name
+     * @param string $path
+     * @param string $domain
+     * @param bool   $secure
+     * @param bool   $httpOnly
+     */
+    public function clearCookie($name, $path = '/', $domain = null, $secure = false, $httpOnly = true)
+    {
+        $this->setCookie(new Cookie($name, null, 1, $path, $domain, $secure, $httpOnly));
+    }
+
+    /**
+     * Generates a HTTP Content-Disposition field-value.
+     *
+     * @param string $disposition      One of "inline" or "attachment"
+     * @param string $filename         A unicode string
+     * @param string $filenameFallback A string containing only ASCII characters that
+     *                                 is semantically equivalent to $filename. If the filename is already ASCII,
+     *                                 it can be omitted, or just copied from $filename
+     *
+     * @return string A string suitable for use as a Content-Disposition field-value
+     *
+     * @throws \InvalidArgumentException
+     *
+     * @see RFC 6266
+     */
+    public function makeDisposition($disposition, $filename, $filenameFallback = '')
+    {
+        if (!in_array($disposition, array(self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE))) {
+            throw new \InvalidArgumentException(sprintf('The disposition must be either "%s" or "%s".', self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE));
+        }
+
+        if ('' == $filenameFallback) {
+            $filenameFallback = $filename;
+        }
+
+        // filenameFallback is not ASCII.
+        if (!preg_match('/^[\x20-\x7e]*$/', $filenameFallback)) {
+            throw new \InvalidArgumentException('The filename fallback must only contain ASCII characters.');
+        }
+
+        // percent characters aren't safe in fallback.
+        if (false !== strpos($filenameFallback, '%')) {
+            throw new \InvalidArgumentException('The filename fallback cannot contain the "%" character.');
+        }
+
+        // path separators aren't allowed in either.
+        if (false !== strpos($filename, '/') || false !== strpos($filename, '\\') || false !== strpos($filenameFallback, '/') || false !== strpos($filenameFallback, '\\')) {
+            throw new \InvalidArgumentException('The filename and the fallback cannot contain the "/" and "\\" characters.');
+        }
+
+        $output = sprintf('%s; filename="%s"', $disposition, str_replace('"', '\\"', $filenameFallback));
+
+        if ($filename !== $filenameFallback) {
+            $output .= sprintf("; filename*=utf-8''%s", rawurlencode($filename));
+        }
+
+        return $output;
+    }
+
+    /**
+     * Returns the calculated value of the cache-control header.
+     *
+     * This considers several other headers and calculates or modifies the
+     * cache-control header to a sensible, conservative value.
+     *
+     * @return string
+     */
+    protected function computeCacheControlValue()
+    {
+        if (!$this->cacheControl && !$this->has('ETag') && !$this->has('Last-Modified') && !$this->has('Expires')) {
+            return 'no-cache';
+        }
+
+        if (!$this->cacheControl) {
+            // conservative by default
+            return 'private, must-revalidate';
+        }
+
+        $header = $this->getCacheControlHeader();
+        if (isset($this->cacheControl['public']) || isset($this->cacheControl['private'])) {
+            return $header;
+        }
+
+        // public if s-maxage is defined, private otherwise
+        if (!isset($this->cacheControl['s-maxage'])) {
+            return $header.', private';
+        }
+
+        return $header;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/ServerBag.php
@@ -0,0 +1,102 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+/**
+ * ServerBag is a container for HTTP headers from the $_SERVER variable.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
+ * @author Robert Kiss <kepten@gmail.com>
+ */
+class ServerBag extends ParameterBag
+{
+    /**
+     * Gets the HTTP headers.
+     *
+     * @return array
+     */
+    public function getHeaders()
+    {
+        $headers = array();
+        $contentHeaders = array('CONTENT_LENGTH' => true, 'CONTENT_MD5' => true, 'CONTENT_TYPE' => true);
+        foreach ($this->parameters as $key => $value) {
+            if (0 === strpos($key, 'HTTP_')) {
+                $headers[substr($key, 5)] = $value;
+            }
+            // CONTENT_* are not prefixed with HTTP_
+            elseif (isset($contentHeaders[$key])) {
+                $headers[$key] = $value;
+            }
+        }
+
+        if (isset($this->parameters['PHP_AUTH_USER'])) {
+            $headers['PHP_AUTH_USER'] = $this->parameters['PHP_AUTH_USER'];
+            $headers['PHP_AUTH_PW'] = isset($this->parameters['PHP_AUTH_PW']) ? $this->parameters['PHP_AUTH_PW'] : '';
+        } else {
+            /*
+             * php-cgi under Apache does not pass HTTP Basic user/pass to PHP by default
+             * For this workaround to work, add these lines to your .htaccess file:
+             * RewriteCond %{HTTP:Authorization} ^(.+)$
+             * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+             *
+             * A sample .htaccess file:
+             * RewriteEngine On
+             * RewriteCond %{HTTP:Authorization} ^(.+)$
+             * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+             * RewriteCond %{REQUEST_FILENAME} !-f
+             * RewriteRule ^(.*)$ app.php [QSA,L]
+             */
+
+            $authorizationHeader = null;
+            if (isset($this->parameters['HTTP_AUTHORIZATION'])) {
+                $authorizationHeader = $this->parameters['HTTP_AUTHORIZATION'];
+            } elseif (isset($this->parameters['REDIRECT_HTTP_AUTHORIZATION'])) {
+                $authorizationHeader = $this->parameters['REDIRECT_HTTP_AUTHORIZATION'];
+            }
+
+            if (null !== $authorizationHeader) {
+                if (0 === stripos($authorizationHeader, 'basic ')) {
+                    // Decode AUTHORIZATION header into PHP_AUTH_USER and PHP_AUTH_PW when authorization header is basic
+                    $exploded = explode(':', base64_decode(substr($authorizationHeader, 6)), 2);
+                    if (count($exploded) == 2) {
+                        list($headers['PHP_AUTH_USER'], $headers['PHP_AUTH_PW']) = $exploded;
+                    }
+                } elseif (empty($this->parameters['PHP_AUTH_DIGEST']) && (0 === stripos($authorizationHeader, 'digest '))) {
+                    // In some circumstances PHP_AUTH_DIGEST needs to be set
+                    $headers['PHP_AUTH_DIGEST'] = $authorizationHeader;
+                    $this->parameters['PHP_AUTH_DIGEST'] = $authorizationHeader;
+                } elseif (0 === stripos($authorizationHeader, 'bearer ')) {
+                    /*
+                     * XXX: Since there is no PHP_AUTH_BEARER in PHP predefined variables,
+                     *      I'll just set $headers['AUTHORIZATION'] here.
+                     *      http://php.net/manual/en/reserved.variables.server.php
+                     */
+                    $headers['AUTHORIZATION'] = $authorizationHeader;
+                }
+            }
+        }
+
+        if (isset($headers['AUTHORIZATION'])) {
+            return $headers;
+        }
+
+        // PHP_AUTH_USER/PHP_AUTH_PW
+        if (isset($headers['PHP_AUTH_USER'])) {
+            $headers['AUTHORIZATION'] = 'Basic '.base64_encode($headers['PHP_AUTH_USER'].':'.$headers['PHP_AUTH_PW']);
+        } elseif (isset($headers['PHP_AUTH_DIGEST'])) {
+            $headers['AUTHORIZATION'] = $headers['PHP_AUTH_DIGEST'];
+        }
+
+        return $headers;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php
@@ -0,0 +1,157 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Attribute;
+
+/**
+ * This class relates to session attribute storage.
+ */
+class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Countable
+{
+    private $name = 'attributes';
+
+    /**
+     * @var string
+     */
+    private $storageKey;
+
+    /**
+     * @var array
+     */
+    protected $attributes = array();
+
+    /**
+     * Constructor.
+     *
+     * @param string $storageKey The key used to store attributes in the session
+     */
+    public function __construct($storageKey = '_sf2_attributes')
+    {
+        $this->storageKey = $storageKey;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function initialize(array &$attributes)
+    {
+        $this->attributes = &$attributes;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getStorageKey()
+    {
+        return $this->storageKey;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function has($name)
+    {
+        return array_key_exists($name, $this->attributes);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($name, $default = null)
+    {
+        return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($name, $value)
+    {
+        $this->attributes[$name] = $value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function all()
+    {
+        return $this->attributes;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function replace(array $attributes)
+    {
+        $this->attributes = array();
+        foreach ($attributes as $key => $value) {
+            $this->set($key, $value);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function remove($name)
+    {
+        $retval = null;
+        if (array_key_exists($name, $this->attributes)) {
+            $retval = $this->attributes[$name];
+            unset($this->attributes[$name]);
+        }
+
+        return $retval;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        $return = $this->attributes;
+        $this->attributes = array();
+
+        return $return;
+    }
+
+    /**
+     * Returns an iterator for attributes.
+     *
+     * @return \ArrayIterator An \ArrayIterator instance
+     */
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->attributes);
+    }
+
+    /**
+     * Returns the number of attributes.
+     *
+     * @return int The number of attributes
+     */
+    public function count()
+    {
+        return count($this->attributes);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Attribute;
+
+use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
+
+/**
+ * Attributes store.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+interface AttributeBagInterface extends SessionBagInterface
+{
+    /**
+     * Checks if an attribute is defined.
+     *
+     * @param string $name The attribute name
+     *
+     * @return bool true if the attribute is defined, false otherwise
+     */
+    public function has($name);
+
+    /**
+     * Returns an attribute.
+     *
+     * @param string $name    The attribute name
+     * @param mixed  $default The default value if not found
+     *
+     * @return mixed
+     */
+    public function get($name, $default = null);
+
+    /**
+     * Sets an attribute.
+     *
+     * @param string $name
+     * @param mixed  $value
+     */
+    public function set($name, $value);
+
+    /**
+     * Returns attributes.
+     *
+     * @return array Attributes
+     */
+    public function all();
+
+    /**
+     * Sets attributes.
+     *
+     * @param array $attributes Attributes
+     */
+    public function replace(array $attributes);
+
+    /**
+     * Removes an attribute.
+     *
+     * @param string $name
+     *
+     * @return mixed The removed value or null when it does not exist
+     */
+    public function remove($name);
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php
@@ -0,0 +1,160 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Attribute;
+
+/**
+ * This class provides structured storage of session attributes using
+ * a name spacing character in the key.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+class NamespacedAttributeBag extends AttributeBag
+{
+    /**
+     * Namespace character.
+     *
+     * @var string
+     */
+    private $namespaceCharacter;
+
+    /**
+     * Constructor.
+     *
+     * @param string $storageKey         Session storage key
+     * @param string $namespaceCharacter Namespace character to use in keys
+     */
+    public function __construct($storageKey = '_sf2_attributes', $namespaceCharacter = '/')
+    {
+        $this->namespaceCharacter = $namespaceCharacter;
+        parent::__construct($storageKey);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function has($name)
+    {
+        // reference mismatch: if fixed, re-introduced in array_key_exists; keep as it is
+        $attributes = $this->resolveAttributePath($name);
+        $name = $this->resolveKey($name);
+
+        if (null === $attributes) {
+            return false;
+        }
+
+        return array_key_exists($name, $attributes);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($name, $default = null)
+    {
+        // reference mismatch: if fixed, re-introduced in array_key_exists; keep as it is
+        $attributes = $this->resolveAttributePath($name);
+        $name = $this->resolveKey($name);
+
+        if (null === $attributes) {
+            return $default;
+        }
+
+        return array_key_exists($name, $attributes) ? $attributes[$name] : $default;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($name, $value)
+    {
+        $attributes = &$this->resolveAttributePath($name, true);
+        $name = $this->resolveKey($name);
+        $attributes[$name] = $value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function remove($name)
+    {
+        $retval = null;
+        $attributes = &$this->resolveAttributePath($name);
+        $name = $this->resolveKey($name);
+        if (null !== $attributes && array_key_exists($name, $attributes)) {
+            $retval = $attributes[$name];
+            unset($attributes[$name]);
+        }
+
+        return $retval;
+    }
+
+    /**
+     * Resolves a path in attributes property and returns it as a reference.
+     *
+     * This method allows structured namespacing of session attributes.
+     *
+     * @param string $name         Key name
+     * @param bool   $writeContext Write context, default false
+     *
+     * @return array
+     */
+    protected function &resolveAttributePath($name, $writeContext = false)
+    {
+        $array = &$this->attributes;
+        $name = (strpos($name, $this->namespaceCharacter) === 0) ? substr($name, 1) : $name;
+
+        // Check if there is anything to do, else return
+        if (!$name) {
+            return $array;
+        }
+
+        $parts = explode($this->namespaceCharacter, $name);
+        if (count($parts) < 2) {
+            if (!$writeContext) {
+                return $array;
+            }
+
+            $array[$parts[0]] = array();
+
+            return $array;
+        }
+
+        unset($parts[count($parts) - 1]);
+
+        foreach ($parts as $part) {
+            if (null !== $array && !array_key_exists($part, $array)) {
+                $array[$part] = $writeContext ? array() : null;
+            }
+
+            $array = &$array[$part];
+        }
+
+        return $array;
+    }
+
+    /**
+     * Resolves the key from the name.
+     *
+     * This is the last part in a dot separated string.
+     *
+     * @param string $name
+     *
+     * @return string
+     */
+    protected function resolveKey($name)
+    {
+        if (false !== $pos = strrpos($name, $this->namespaceCharacter)) {
+            $name = substr($name, $pos + 1);
+        }
+
+        return $name;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php
@@ -0,0 +1,175 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Flash;
+
+/**
+ * AutoExpireFlashBag flash message container.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+class AutoExpireFlashBag implements FlashBagInterface
+{
+    private $name = 'flashes';
+
+    /**
+     * Flash messages.
+     *
+     * @var array
+     */
+    private $flashes = array('display' => array(), 'new' => array());
+
+    /**
+     * The storage key for flashes in the session.
+     *
+     * @var string
+     */
+    private $storageKey;
+
+    /**
+     * Constructor.
+     *
+     * @param string $storageKey The key used to store flashes in the session
+     */
+    public function __construct($storageKey = '_sf2_flashes')
+    {
+        $this->storageKey = $storageKey;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function initialize(array &$flashes)
+    {
+        $this->flashes = &$flashes;
+
+        // The logic: messages from the last request will be stored in new, so we move them to previous
+        // This request we will show what is in 'display'.  What is placed into 'new' this time round will
+        // be moved to display next time round.
+        $this->flashes['display'] = array_key_exists('new', $this->flashes) ? $this->flashes['new'] : array();
+        $this->flashes['new'] = array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function add($type, $message)
+    {
+        $this->flashes['new'][$type][] = $message;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function peek($type, array $default = array())
+    {
+        return $this->has($type) ? $this->flashes['display'][$type] : $default;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function peekAll()
+    {
+        return array_key_exists('display', $this->flashes) ? (array) $this->flashes['display'] : array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($type, array $default = array())
+    {
+        $return = $default;
+
+        if (!$this->has($type)) {
+            return $return;
+        }
+
+        if (isset($this->flashes['display'][$type])) {
+            $return = $this->flashes['display'][$type];
+            unset($this->flashes['display'][$type]);
+        }
+
+        return $return;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function all()
+    {
+        $return = $this->flashes['display'];
+        $this->flashes = array('new' => array(), 'display' => array());
+
+        return $return;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setAll(array $messages)
+    {
+        $this->flashes['new'] = $messages;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($type, $messages)
+    {
+        $this->flashes['new'][$type] = (array) $messages;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function has($type)
+    {
+        return array_key_exists($type, $this->flashes['display']) && $this->flashes['display'][$type];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function keys()
+    {
+        return array_keys($this->flashes['display']);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getStorageKey()
+    {
+        return $this->storageKey;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        return $this->all();
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Flash/FlashBag.php
@@ -0,0 +1,182 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Flash;
+
+/**
+ * FlashBag flash message container.
+ *
+ * \IteratorAggregate implementation is deprecated and will be removed in 3.0.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+class FlashBag implements FlashBagInterface, \IteratorAggregate
+{
+    private $name = 'flashes';
+
+    /**
+     * Flash messages.
+     *
+     * @var array
+     */
+    private $flashes = array();
+
+    /**
+     * The storage key for flashes in the session.
+     *
+     * @var string
+     */
+    private $storageKey;
+
+    /**
+     * Constructor.
+     *
+     * @param string $storageKey The key used to store flashes in the session
+     */
+    public function __construct($storageKey = '_sf2_flashes')
+    {
+        $this->storageKey = $storageKey;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function initialize(array &$flashes)
+    {
+        $this->flashes = &$flashes;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function add($type, $message)
+    {
+        $this->flashes[$type][] = $message;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function peek($type, array $default = array())
+    {
+        return $this->has($type) ? $this->flashes[$type] : $default;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function peekAll()
+    {
+        return $this->flashes;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($type, array $default = array())
+    {
+        if (!$this->has($type)) {
+            return $default;
+        }
+
+        $return = $this->flashes[$type];
+
+        unset($this->flashes[$type]);
+
+        return $return;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function all()
+    {
+        $return = $this->peekAll();
+        $this->flashes = array();
+
+        return $return;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($type, $messages)
+    {
+        $this->flashes[$type] = (array) $messages;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setAll(array $messages)
+    {
+        $this->flashes = $messages;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function has($type)
+    {
+        return array_key_exists($type, $this->flashes) && $this->flashes[$type];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function keys()
+    {
+        return array_keys($this->flashes);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getStorageKey()
+    {
+        return $this->storageKey;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        return $this->all();
+    }
+
+    /**
+     * Returns an iterator for flashes.
+     *
+     * @deprecated since version 2.4, to be removed in 3.0.
+     *
+     * @return \ArrayIterator An \ArrayIterator instance
+     */
+    public function getIterator()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.4 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        return new \ArrayIterator($this->all());
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Flash;
+
+use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
+
+/**
+ * FlashBagInterface.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+interface FlashBagInterface extends SessionBagInterface
+{
+    /**
+     * Adds a flash message for type.
+     *
+     * @param string $type
+     * @param string $message
+     */
+    public function add($type, $message);
+
+    /**
+     * Registers a message for a given type.
+     *
+     * @param string       $type
+     * @param string|array $message
+     */
+    public function set($type, $message);
+
+    /**
+     * Gets flash messages for a given type.
+     *
+     * @param string $type    Message category type
+     * @param array  $default Default value if $type does not exist
+     *
+     * @return array
+     */
+    public function peek($type, array $default = array());
+
+    /**
+     * Gets all flash messages.
+     *
+     * @return array
+     */
+    public function peekAll();
+
+    /**
+     * Gets and clears flash from the stack.
+     *
+     * @param string $type
+     * @param array  $default Default value if $type does not exist
+     *
+     * @return array
+     */
+    public function get($type, array $default = array());
+
+    /**
+     * Gets and clears flashes from the stack.
+     *
+     * @return array
+     */
+    public function all();
+
+    /**
+     * Sets all flash messages.
+     *
+     * @param array $messages
+     */
+    public function setAll(array $messages);
+
+    /**
+     * Has flash messages for a given type?
+     *
+     * @param string $type
+     *
+     * @return bool
+     */
+    public function has($type);
+
+    /**
+     * Returns a list of all defined types.
+     *
+     * @return array
+     */
+    public function keys();
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Session.php
@@ -0,0 +1,249 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session;
+
+use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface;
+use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
+use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface;
+use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
+use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
+use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
+
+/**
+ * Session.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Drak <drak@zikula.org>
+ */
+class Session implements SessionInterface, \IteratorAggregate, \Countable
+{
+    /**
+     * Storage driver.
+     *
+     * @var SessionStorageInterface
+     */
+    protected $storage;
+
+    /**
+     * @var string
+     */
+    private $flashName;
+
+    /**
+     * @var string
+     */
+    private $attributeName;
+
+    /**
+     * Constructor.
+     *
+     * @param SessionStorageInterface $storage    A SessionStorageInterface instance
+     * @param AttributeBagInterface   $attributes An AttributeBagInterface instance, (defaults null for default AttributeBag)
+     * @param FlashBagInterface       $flashes    A FlashBagInterface instance (defaults null for default FlashBag)
+     */
+    public function __construct(SessionStorageInterface $storage = null, AttributeBagInterface $attributes = null, FlashBagInterface $flashes = null)
+    {
+        $this->storage = $storage ?: new NativeSessionStorage();
+
+        $attributes = $attributes ?: new AttributeBag();
+        $this->attributeName = $attributes->getName();
+        $this->registerBag($attributes);
+
+        $flashes = $flashes ?: new FlashBag();
+        $this->flashName = $flashes->getName();
+        $this->registerBag($flashes);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function start()
+    {
+        return $this->storage->start();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function has($name)
+    {
+        return $this->storage->getBag($this->attributeName)->has($name);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($name, $default = null)
+    {
+        return $this->storage->getBag($this->attributeName)->get($name, $default);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($name, $value)
+    {
+        $this->storage->getBag($this->attributeName)->set($name, $value);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function all()
+    {
+        return $this->storage->getBag($this->attributeName)->all();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function replace(array $attributes)
+    {
+        $this->storage->getBag($this->attributeName)->replace($attributes);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function remove($name)
+    {
+        return $this->storage->getBag($this->attributeName)->remove($name);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        $this->storage->getBag($this->attributeName)->clear();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isStarted()
+    {
+        return $this->storage->isStarted();
+    }
+
+    /**
+     * Returns an iterator for attributes.
+     *
+     * @return \ArrayIterator An \ArrayIterator instance
+     */
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->storage->getBag($this->attributeName)->all());
+    }
+
+    /**
+     * Returns the number of attributes.
+     *
+     * @return int The number of attributes
+     */
+    public function count()
+    {
+        return count($this->storage->getBag($this->attributeName)->all());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function invalidate($lifetime = null)
+    {
+        $this->storage->clear();
+
+        return $this->migrate(true, $lifetime);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function migrate($destroy = false, $lifetime = null)
+    {
+        return $this->storage->regenerate($destroy, $lifetime);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save()
+    {
+        $this->storage->save();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getId()
+    {
+        return $this->storage->getId();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setId($id)
+    {
+        $this->storage->setId($id);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->storage->getName();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setName($name)
+    {
+        $this->storage->setName($name);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMetadataBag()
+    {
+        return $this->storage->getMetadataBag();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function registerBag(SessionBagInterface $bag)
+    {
+        $this->storage->registerBag($bag);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBag($name)
+    {
+        return $this->storage->getBag($name);
+    }
+
+    /**
+     * Gets the flashbag interface.
+     *
+     * @return FlashBagInterface
+     */
+    public function getFlashBag()
+    {
+        return $this->getBag($this->flashName);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/SessionBagInterface.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session;
+
+/**
+ * Session Bag store.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+interface SessionBagInterface
+{
+    /**
+     * Gets this bag's name.
+     *
+     * @return string
+     */
+    public function getName();
+
+    /**
+     * Initializes the Bag.
+     *
+     * @param array $array
+     */
+    public function initialize(array &$array);
+
+    /**
+     * Gets the storage key for this bag.
+     *
+     * @return string
+     */
+    public function getStorageKey();
+
+    /**
+     * Clears out data from bag.
+     *
+     * @return mixed Whatever data was contained
+     */
+    public function clear();
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/SessionInterface.php
@@ -0,0 +1,182 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session;
+
+use Symfony\Component\HttpFoundation\Session\Storage\MetadataBag;
+
+/**
+ * Interface for the session.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+interface SessionInterface
+{
+    /**
+     * Starts the session storage.
+     *
+     * @return bool True if session started
+     *
+     * @throws \RuntimeException If session fails to start.
+     */
+    public function start();
+
+    /**
+     * Returns the session ID.
+     *
+     * @return string The session ID
+     */
+    public function getId();
+
+    /**
+     * Sets the session ID.
+     *
+     * @param string $id
+     */
+    public function setId($id);
+
+    /**
+     * Returns the session name.
+     *
+     * @return mixed The session name
+     */
+    public function getName();
+
+    /**
+     * Sets the session name.
+     *
+     * @param string $name
+     */
+    public function setName($name);
+
+    /**
+     * Invalidates the current session.
+     *
+     * Clears all session attributes and flashes and regenerates the
+     * session and deletes the old session from persistence.
+     *
+     * @param int $lifetime Sets the cookie lifetime for the session cookie. A null value
+     *                      will leave the system settings unchanged, 0 sets the cookie
+     *                      to expire with browser session. Time is in seconds, and is
+     *                      not a Unix timestamp.
+     *
+     * @return bool True if session invalidated, false if error
+     */
+    public function invalidate($lifetime = null);
+
+    /**
+     * Migrates the current session to a new session id while maintaining all
+     * session attributes.
+     *
+     * @param bool $destroy  Whether to delete the old session or leave it to garbage collection
+     * @param int  $lifetime Sets the cookie lifetime for the session cookie. A null value
+     *                       will leave the system settings unchanged, 0 sets the cookie
+     *                       to expire with browser session. Time is in seconds, and is
+     *                       not a Unix timestamp.
+     *
+     * @return bool True if session migrated, false if error
+     */
+    public function migrate($destroy = false, $lifetime = null);
+
+    /**
+     * Force the session to be saved and closed.
+     *
+     * This method is generally not required for real sessions as
+     * the session will be automatically saved at the end of
+     * code execution.
+     */
+    public function save();
+
+    /**
+     * Checks if an attribute is defined.
+     *
+     * @param string $name The attribute name
+     *
+     * @return bool true if the attribute is defined, false otherwise
+     */
+    public function has($name);
+
+    /**
+     * Returns an attribute.
+     *
+     * @param string $name    The attribute name
+     * @param mixed  $default The default value if not found
+     *
+     * @return mixed
+     */
+    public function get($name, $default = null);
+
+    /**
+     * Sets an attribute.
+     *
+     * @param string $name
+     * @param mixed  $value
+     */
+    public function set($name, $value);
+
+    /**
+     * Returns attributes.
+     *
+     * @return array Attributes
+     */
+    public function all();
+
+    /**
+     * Sets attributes.
+     *
+     * @param array $attributes Attributes
+     */
+    public function replace(array $attributes);
+
+    /**
+     * Removes an attribute.
+     *
+     * @param string $name
+     *
+     * @return mixed The removed value or null when it does not exist
+     */
+    public function remove($name);
+
+    /**
+     * Clears all attributes.
+     */
+    public function clear();
+
+    /**
+     * Checks if the session was started.
+     *
+     * @return bool
+     */
+    public function isStarted();
+
+    /**
+     * Registers a SessionBagInterface with the session.
+     *
+     * @param SessionBagInterface $bag
+     */
+    public function registerBag(SessionBagInterface $bag);
+
+    /**
+     * Gets a bag instance by name.
+     *
+     * @param string $name
+     *
+     * @return SessionBagInterface
+     */
+    public function getBag($name);
+
+    /**
+     * Gets session meta.
+     *
+     * @return MetadataBag
+     */
+    public function getMetadataBag();
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/LegacyPdoSessionHandler.php
@@ -0,0 +1,271 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
+
+@trigger_error('The '.__NAMESPACE__.'\LegacyPdoSessionHandler class is deprecated since version 2.6 and will be removed in 3.0. Use the Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler class instead.', E_USER_DEPRECATED);
+
+/**
+ * Session handler using a PDO connection to read and write data.
+ *
+ * Session data is a binary string that can contain non-printable characters like the null byte.
+ * For this reason this handler base64 encodes the data to be able to save it in a character column.
+ *
+ * This version of the PdoSessionHandler does NOT implement locking. So concurrent requests to the
+ * same session can result in data loss due to race conditions.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Michael Williams <michael.williams@funsational.com>
+ * @author Tobias Schultze <http://tobion.de>
+ *
+ * @deprecated since version 2.6, to be removed in 3.0. Use
+ *             {@link PdoSessionHandler} instead.
+ */
+class LegacyPdoSessionHandler implements \SessionHandlerInterface
+{
+    /**
+     * @var \PDO PDO instance
+     */
+    private $pdo;
+
+    /**
+     * @var string Table name
+     */
+    private $table;
+
+    /**
+     * @var string Column for session id
+     */
+    private $idCol;
+
+    /**
+     * @var string Column for session data
+     */
+    private $dataCol;
+
+    /**
+     * @var string Column for timestamp
+     */
+    private $timeCol;
+
+    /**
+     * Constructor.
+     *
+     * List of available options:
+     *  * db_table: The name of the table [required]
+     *  * db_id_col: The column where to store the session id [default: sess_id]
+     *  * db_data_col: The column where to store the session data [default: sess_data]
+     *  * db_time_col: The column where to store the timestamp [default: sess_time]
+     *
+     * @param \PDO  $pdo       A \PDO instance
+     * @param array $dbOptions An associative array of DB options
+     *
+     * @throws \InvalidArgumentException When "db_table" option is not provided
+     */
+    public function __construct(\PDO $pdo, array $dbOptions = array())
+    {
+        if (!array_key_exists('db_table', $dbOptions)) {
+            throw new \InvalidArgumentException('You must provide the "db_table" option for a PdoSessionStorage.');
+        }
+        if (\PDO::ERRMODE_EXCEPTION !== $pdo->getAttribute(\PDO::ATTR_ERRMODE)) {
+            throw new \InvalidArgumentException(sprintf('"%s" requires PDO error mode attribute be set to throw Exceptions (i.e. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION))', __CLASS__));
+        }
+
+        $this->pdo = $pdo;
+        $dbOptions = array_merge(array(
+            'db_id_col' => 'sess_id',
+            'db_data_col' => 'sess_data',
+            'db_time_col' => 'sess_time',
+        ), $dbOptions);
+
+        $this->table = $dbOptions['db_table'];
+        $this->idCol = $dbOptions['db_id_col'];
+        $this->dataCol = $dbOptions['db_data_col'];
+        $this->timeCol = $dbOptions['db_time_col'];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function open($savePath, $sessionName)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function destroy($sessionId)
+    {
+        // delete the record associated with this id
+        $sql = "DELETE FROM $this->table WHERE $this->idCol = :id";
+
+        try {
+            $stmt = $this->pdo->prepare($sql);
+            $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
+            $stmt->execute();
+        } catch (\PDOException $e) {
+            throw new \RuntimeException(sprintf('PDOException was thrown when trying to delete a session: %s', $e->getMessage()), 0, $e);
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function gc($maxlifetime)
+    {
+        // delete the session records that have expired
+        $sql = "DELETE FROM $this->table WHERE $this->timeCol < :time";
+
+        try {
+            $stmt = $this->pdo->prepare($sql);
+            $stmt->bindValue(':time', time() - $maxlifetime, \PDO::PARAM_INT);
+            $stmt->execute();
+        } catch (\PDOException $e) {
+            throw new \RuntimeException(sprintf('PDOException was thrown when trying to delete expired sessions: %s', $e->getMessage()), 0, $e);
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($sessionId)
+    {
+        $sql = "SELECT $this->dataCol FROM $this->table WHERE $this->idCol = :id";
+
+        try {
+            $stmt = $this->pdo->prepare($sql);
+            $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
+            $stmt->execute();
+
+            // We use fetchAll instead of fetchColumn to make sure the DB cursor gets closed
+            $sessionRows = $stmt->fetchAll(\PDO::FETCH_NUM);
+
+            if ($sessionRows) {
+                return base64_decode($sessionRows[0][0]);
+            }
+
+            return '';
+        } catch (\PDOException $e) {
+            throw new \RuntimeException(sprintf('PDOException was thrown when trying to read the session data: %s', $e->getMessage()), 0, $e);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write($sessionId, $data)
+    {
+        $encoded = base64_encode($data);
+
+        try {
+            // We use a single MERGE SQL query when supported by the database.
+            $mergeSql = $this->getMergeSql();
+
+            if (null !== $mergeSql) {
+                $mergeStmt = $this->pdo->prepare($mergeSql);
+                $mergeStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
+                $mergeStmt->bindParam(':data', $encoded, \PDO::PARAM_STR);
+                $mergeStmt->bindValue(':time', time(), \PDO::PARAM_INT);
+                $mergeStmt->execute();
+
+                return true;
+            }
+
+            $updateStmt = $this->pdo->prepare(
+                "UPDATE $this->table SET $this->dataCol = :data, $this->timeCol = :time WHERE $this->idCol = :id"
+            );
+            $updateStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
+            $updateStmt->bindParam(':data', $encoded, \PDO::PARAM_STR);
+            $updateStmt->bindValue(':time', time(), \PDO::PARAM_INT);
+            $updateStmt->execute();
+
+            // When MERGE is not supported, like in Postgres, we have to use this approach that can result in
+            // duplicate key errors when the same session is written simultaneously. We can just catch such an
+            // error and re-execute the update. This is similar to a serializable transaction with retry logic
+            // on serialization failures but without the overhead and without possible false positives due to
+            // longer gap locking.
+            if (!$updateStmt->rowCount()) {
+                try {
+                    $insertStmt = $this->pdo->prepare(
+                        "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->timeCol) VALUES (:id, :data, :time)"
+                    );
+                    $insertStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
+                    $insertStmt->bindParam(':data', $encoded, \PDO::PARAM_STR);
+                    $insertStmt->bindValue(':time', time(), \PDO::PARAM_INT);
+                    $insertStmt->execute();
+                } catch (\PDOException $e) {
+                    // Handle integrity violation SQLSTATE 23000 (or a subclass like 23505 in Postgres) for duplicate keys
+                    if (0 === strpos($e->getCode(), '23')) {
+                        $updateStmt->execute();
+                    } else {
+                        throw $e;
+                    }
+                }
+            }
+        } catch (\PDOException $e) {
+            throw new \RuntimeException(sprintf('PDOException was thrown when trying to write the session data: %s', $e->getMessage()), 0, $e);
+        }
+
+        return true;
+    }
+
+    /**
+     * Returns a merge/upsert (i.e. insert or update) SQL query when supported by the database.
+     *
+     * @return string|null The SQL string or null when not supported
+     */
+    private function getMergeSql()
+    {
+        $driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME);
+
+        switch ($driver) {
+            case 'mysql':
+                return "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->timeCol) VALUES (:id, :data, :time) ".
+                "ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->timeCol = VALUES($this->timeCol)";
+            case 'oci':
+                // DUAL is Oracle specific dummy table
+                return "MERGE INTO $this->table USING DUAL ON ($this->idCol = :id) ".
+                "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->timeCol) VALUES (:id, :data, :time) ".
+                "WHEN MATCHED THEN UPDATE SET $this->dataCol = :data, $this->timeCol = :time";
+            case 'sqlsrv' === $driver && version_compare($this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION), '10', '>='):
+                // MERGE is only available since SQL Server 2008 and must be terminated by semicolon
+                // It also requires HOLDLOCK according to http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx
+                return "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = :id) ".
+                "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->timeCol) VALUES (:id, :data, :time) ".
+                "WHEN MATCHED THEN UPDATE SET $this->dataCol = :data, $this->timeCol = :time;";
+            case 'sqlite':
+                return "INSERT OR REPLACE INTO $this->table ($this->idCol, $this->dataCol, $this->timeCol) VALUES (:id, :data, :time)";
+        }
+    }
+
+    /**
+     * Return a PDO instance.
+     *
+     * @return \PDO
+     */
+    protected function getConnection()
+    {
+        return $this->pdo;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/MemcacheSessionHandler.php
@@ -0,0 +1,119 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
+
+/**
+ * MemcacheSessionHandler.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+class MemcacheSessionHandler implements \SessionHandlerInterface
+{
+    /**
+     * @var \Memcache Memcache driver
+     */
+    private $memcache;
+
+    /**
+     * @var int Time to live in seconds
+     */
+    private $ttl;
+
+    /**
+     * @var string Key prefix for shared environments
+     */
+    private $prefix;
+
+    /**
+     * Constructor.
+     *
+     * List of available options:
+     *  * prefix: The prefix to use for the memcache keys in order to avoid collision
+     *  * expiretime: The time to live in seconds
+     *
+     * @param \Memcache $memcache A \Memcache instance
+     * @param array     $options  An associative array of Memcache options
+     *
+     * @throws \InvalidArgumentException When unsupported options are passed
+     */
+    public function __construct(\Memcache $memcache, array $options = array())
+    {
+        if ($diff = array_diff(array_keys($options), array('prefix', 'expiretime'))) {
+            throw new \InvalidArgumentException(sprintf(
+                'The following options are not supported "%s"', implode(', ', $diff)
+            ));
+        }
+
+        $this->memcache = $memcache;
+        $this->ttl = isset($options['expiretime']) ? (int) $options['expiretime'] : 86400;
+        $this->prefix = isset($options['prefix']) ? $options['prefix'] : 'sf2s';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function open($savePath, $sessionName)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($sessionId)
+    {
+        return $this->memcache->get($this->prefix.$sessionId) ?: '';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write($sessionId, $data)
+    {
+        return $this->memcache->set($this->prefix.$sessionId, $data, 0, time() + $this->ttl);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function destroy($sessionId)
+    {
+        return $this->memcache->delete($this->prefix.$sessionId);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function gc($maxlifetime)
+    {
+        // not required here because memcache will auto expire the records anyhow.
+        return true;
+    }
+
+    /**
+     * Return a Memcache instance.
+     *
+     * @return \Memcache
+     */
+    protected function getMemcache()
+    {
+        return $this->memcache;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php
@@ -0,0 +1,125 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
+
+/**
+ * MemcachedSessionHandler.
+ *
+ * Memcached based session storage handler based on the Memcached class
+ * provided by the PHP memcached extension.
+ *
+ * @see http://php.net/memcached
+ *
+ * @author Drak <drak@zikula.org>
+ */
+class MemcachedSessionHandler implements \SessionHandlerInterface
+{
+    /**
+     * @var \Memcached Memcached driver
+     */
+    private $memcached;
+
+    /**
+     * @var int Time to live in seconds
+     */
+    private $ttl;
+
+    /**
+     * @var string Key prefix for shared environments
+     */
+    private $prefix;
+
+    /**
+     * Constructor.
+     *
+     * List of available options:
+     *  * prefix: The prefix to use for the memcached keys in order to avoid collision
+     *  * expiretime: The time to live in seconds
+     *
+     * @param \Memcached $memcached A \Memcached instance
+     * @param array      $options   An associative array of Memcached options
+     *
+     * @throws \InvalidArgumentException When unsupported options are passed
+     */
+    public function __construct(\Memcached $memcached, array $options = array())
+    {
+        $this->memcached = $memcached;
+
+        if ($diff = array_diff(array_keys($options), array('prefix', 'expiretime'))) {
+            throw new \InvalidArgumentException(sprintf(
+                'The following options are not supported "%s"', implode(', ', $diff)
+            ));
+        }
+
+        $this->ttl = isset($options['expiretime']) ? (int) $options['expiretime'] : 86400;
+        $this->prefix = isset($options['prefix']) ? $options['prefix'] : 'sf2s';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function open($savePath, $sessionName)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($sessionId)
+    {
+        return $this->memcached->get($this->prefix.$sessionId) ?: '';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write($sessionId, $data)
+    {
+        return $this->memcached->set($this->prefix.$sessionId, $data, time() + $this->ttl);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function destroy($sessionId)
+    {
+        return $this->memcached->delete($this->prefix.$sessionId);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function gc($maxlifetime)
+    {
+        // not required here because memcached will auto expire the records anyhow.
+        return true;
+    }
+
+    /**
+     * Return a Memcached instance.
+     *
+     * @return \Memcached
+     */
+    protected function getMemcached()
+    {
+        return $this->memcached;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php
@@ -0,0 +1,232 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
+
+/**
+ * MongoDB session handler.
+ *
+ * @author Markus Bachmann <markus.bachmann@bachi.biz>
+ */
+class MongoDbSessionHandler implements \SessionHandlerInterface
+{
+    /**
+     * @var \Mongo|\MongoClient|\MongoDB\Client
+     */
+    private $mongo;
+
+    /**
+     * @var \MongoCollection
+     */
+    private $collection;
+
+    /**
+     * @var array
+     */
+    private $options;
+
+    /**
+     * Constructor.
+     *
+     * List of available options:
+     *  * database: The name of the database [required]
+     *  * collection: The name of the collection [required]
+     *  * id_field: The field name for storing the session id [default: _id]
+     *  * data_field: The field name for storing the session data [default: data]
+     *  * time_field: The field name for storing the timestamp [default: time]
+     *  * expiry_field: The field name for storing the expiry-timestamp [default: expires_at]
+     *
+     * It is strongly recommended to put an index on the `expiry_field` for
+     * garbage-collection. Alternatively it's possible to automatically expire
+     * the sessions in the database as described below:
+     *
+     * A TTL collections can be used on MongoDB 2.2+ to cleanup expired sessions
+     * automatically. Such an index can for example look like this:
+     *
+     *     db.<session-collection>.ensureIndex(
+     *         { "<expiry-field>": 1 },
+     *         { "expireAfterSeconds": 0 }
+     *     )
+     *
+     * More details on: http://docs.mongodb.org/manual/tutorial/expire-data/
+     *
+     * If you use such an index, you can drop `gc_probability` to 0 since
+     * no garbage-collection is required.
+     *
+     * @param \Mongo|\MongoClient|\MongoDB\Client $mongo   A MongoDB\Client, MongoClient or Mongo instance
+     * @param array                               $options An associative array of field options
+     *
+     * @throws \InvalidArgumentException When MongoClient or Mongo instance not provided
+     * @throws \InvalidArgumentException When "database" or "collection" not provided
+     */
+    public function __construct($mongo, array $options)
+    {
+        if (!($mongo instanceof \MongoDB\Client || $mongo instanceof \MongoClient || $mongo instanceof \Mongo)) {
+            throw new \InvalidArgumentException('MongoClient or Mongo instance required');
+        }
+
+        if (!isset($options['database']) || !isset($options['collection'])) {
+            throw new \InvalidArgumentException('You must provide the "database" and "collection" option for MongoDBSessionHandler');
+        }
+
+        $this->mongo = $mongo;
+
+        $this->options = array_merge(array(
+            'id_field' => '_id',
+            'data_field' => 'data',
+            'time_field' => 'time',
+            'expiry_field' => 'expires_at',
+        ), $options);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function open($savePath, $sessionName)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function destroy($sessionId)
+    {
+        $methodName = $this->mongo instanceof \MongoDB\Client ? 'deleteOne' : 'remove';
+
+        $this->getCollection()->$methodName(array(
+            $this->options['id_field'] => $sessionId,
+        ));
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function gc($maxlifetime)
+    {
+        $methodName = $this->mongo instanceof \MongoDB\Client ? 'deleteOne' : 'remove';
+
+        $this->getCollection()->$methodName(array(
+            $this->options['expiry_field'] => array('$lt' => $this->createDateTime()),
+        ));
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write($sessionId, $data)
+    {
+        $expiry = $this->createDateTime(time() + (int) ini_get('session.gc_maxlifetime'));
+
+        $fields = array(
+            $this->options['time_field'] => $this->createDateTime(),
+            $this->options['expiry_field'] => $expiry,
+        );
+
+        $options = array('upsert' => true);
+
+        if ($this->mongo instanceof \MongoDB\Client) {
+            $fields[$this->options['data_field']] = new \MongoDB\BSON\Binary($data, \MongoDB\BSON\Binary::TYPE_OLD_BINARY);
+        } else {
+            $fields[$this->options['data_field']] = new \MongoBinData($data, \MongoBinData::BYTE_ARRAY);
+            $options['multiple'] = false;
+        }
+
+        $methodName = $this->mongo instanceof \MongoDB\Client ? 'updateOne' : 'update';
+
+        $this->getCollection()->$methodName(
+            array($this->options['id_field'] => $sessionId),
+            array('$set' => $fields),
+            $options
+        );
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($sessionId)
+    {
+        $dbData = $this->getCollection()->findOne(array(
+            $this->options['id_field'] => $sessionId,
+            $this->options['expiry_field'] => array('$gte' => $this->createDateTime()),
+        ));
+
+        if (null === $dbData) {
+            return '';
+        }
+
+        if ($dbData[$this->options['data_field']] instanceof \MongoDB\BSON\Binary) {
+            return $dbData[$this->options['data_field']]->getData();
+        }
+
+        return $dbData[$this->options['data_field']]->bin;
+    }
+
+    /**
+     * Return a "MongoCollection" instance.
+     *
+     * @return \MongoCollection
+     */
+    private function getCollection()
+    {
+        if (null === $this->collection) {
+            $this->collection = $this->mongo->selectCollection($this->options['database'], $this->options['collection']);
+        }
+
+        return $this->collection;
+    }
+
+    /**
+     * Return a Mongo instance.
+     *
+     * @return \Mongo|\MongoClient|\MongoDB\Client
+     */
+    protected function getMongo()
+    {
+        return $this->mongo;
+    }
+
+    /**
+     * Create a date object using the class appropriate for the current mongo connection.
+     *
+     * Return an instance of a MongoDate or \MongoDB\BSON\UTCDateTime
+     *
+     * @param int $seconds An integer representing UTC seconds since Jan 1 1970.  Defaults to now.
+     *
+     * @return \MongoDate|\MongoDB\BSON\UTCDateTime
+     */
+    private function createDateTime($seconds = null)
+    {
+        if (null === $seconds) {
+            $seconds = time();
+        }
+
+        if ($this->mongo instanceof \MongoDB\Client) {
+            return new \MongoDB\BSON\UTCDateTime($seconds * 1000);
+        }
+
+        return new \MongoDate($seconds);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
+
+/**
+ * NativeFileSessionHandler.
+ *
+ * Native session handler using PHP's built in file storage.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+class NativeFileSessionHandler extends NativeSessionHandler
+{
+    /**
+     * Constructor.
+     *
+     * @param string $savePath Path of directory to save session files
+     *                         Default null will leave setting as defined by PHP.
+     *                         '/path', 'N;/path', or 'N;octal-mode;/path
+     *
+     * @see http://php.net/session.configuration.php#ini.session.save-path for further details.
+     *
+     * @throws \InvalidArgumentException On invalid $savePath
+     */
+    public function __construct($savePath = null)
+    {
+        if (null === $savePath) {
+            $savePath = ini_get('session.save_path');
+        }
+
+        $baseDir = $savePath;
+
+        if ($count = substr_count($savePath, ';')) {
+            if ($count > 2) {
+                throw new \InvalidArgumentException(sprintf('Invalid argument $savePath \'%s\'', $savePath));
+            }
+
+            // characters after last ';' are the path
+            $baseDir = ltrim(strrchr($savePath, ';'), ';');
+        }
+
+        if ($baseDir && !is_dir($baseDir) && !@mkdir($baseDir, 0777, true) && !is_dir($baseDir)) {
+            throw new \RuntimeException(sprintf('Session Storage was not able to create directory "%s"', $baseDir));
+        }
+
+        ini_set('session.save_path', $savePath);
+        ini_set('session.save_handler', 'files');
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/NativeSessionHandler.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
+
+// Adds SessionHandler functionality if available.
+// @see http://php.net/sessionhandler
+if (PHP_VERSION_ID >= 50400) {
+    class NativeSessionHandler extends \SessionHandler
+    {
+    }
+} else {
+    class NativeSessionHandler
+    {
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php
@@ -0,0 +1,70 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
+
+/**
+ * NullSessionHandler.
+ *
+ * Can be used in unit testing or in a situations where persisted sessions are not desired.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+class NullSessionHandler implements \SessionHandlerInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function open($savePath, $sessionName)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($sessionId)
+    {
+        return '';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write($sessionId, $data)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function destroy($sessionId)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function gc($maxlifetime)
+    {
+        return true;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php
@@ -0,0 +1,721 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
+
+/**
+ * Session handler using a PDO connection to read and write data.
+ *
+ * It works with MySQL, PostgreSQL, Oracle, SQL Server and SQLite and implements
+ * different locking strategies to handle concurrent access to the same session.
+ * Locking is necessary to prevent loss of data due to race conditions and to keep
+ * the session data consistent between read() and write(). With locking, requests
+ * for the same session will wait until the other one finished writing. For this
+ * reason it's best practice to close a session as early as possible to improve
+ * concurrency. PHPs internal files session handler also implements locking.
+ *
+ * Attention: Since SQLite does not support row level locks but locks the whole database,
+ * it means only one session can be accessed at a time. Even different sessions would wait
+ * for another to finish. So saving session in SQLite should only be considered for
+ * development or prototypes.
+ *
+ * Session data is a binary string that can contain non-printable characters like the null byte.
+ * For this reason it must be saved in a binary column in the database like BLOB in MySQL.
+ * Saving it in a character column could corrupt the data. You can use createTable()
+ * to initialize a correctly defined table.
+ *
+ * @see http://php.net/sessionhandlerinterface
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Michael Williams <michael.williams@funsational.com>
+ * @author Tobias Schultze <http://tobion.de>
+ */
+class PdoSessionHandler implements \SessionHandlerInterface
+{
+    /**
+     * No locking is done. This means sessions are prone to loss of data due to
+     * race conditions of concurrent requests to the same session. The last session
+     * write will win in this case. It might be useful when you implement your own
+     * logic to deal with this like an optimistic approach.
+     */
+    const LOCK_NONE = 0;
+
+    /**
+     * Creates an application-level lock on a session. The disadvantage is that the
+     * lock is not enforced by the database and thus other, unaware parts of the
+     * application could still concurrently modify the session. The advantage is it
+     * does not require a transaction.
+     * This mode is not available for SQLite and not yet implemented for oci and sqlsrv.
+     */
+    const LOCK_ADVISORY = 1;
+
+    /**
+     * Issues a real row lock. Since it uses a transaction between opening and
+     * closing a session, you have to be careful when you use same database connection
+     * that you also use for your application logic. This mode is the default because
+     * it's the only reliable solution across DBMSs.
+     */
+    const LOCK_TRANSACTIONAL = 2;
+
+    /**
+     * @var \PDO|null PDO instance or null when not connected yet
+     */
+    private $pdo;
+
+    /**
+     * @var string|null|false DSN string or null for session.save_path or false when lazy connection disabled
+     */
+    private $dsn = false;
+
+    /**
+     * @var string Database driver
+     */
+    private $driver;
+
+    /**
+     * @var string Table name
+     */
+    private $table = 'sessions';
+
+    /**
+     * @var string Column for session id
+     */
+    private $idCol = 'sess_id';
+
+    /**
+     * @var string Column for session data
+     */
+    private $dataCol = 'sess_data';
+
+    /**
+     * @var string Column for lifetime
+     */
+    private $lifetimeCol = 'sess_lifetime';
+
+    /**
+     * @var string Column for timestamp
+     */
+    private $timeCol = 'sess_time';
+
+    /**
+     * @var string Username when lazy-connect
+     */
+    private $username = '';
+
+    /**
+     * @var string Password when lazy-connect
+     */
+    private $password = '';
+
+    /**
+     * @var array Connection options when lazy-connect
+     */
+    private $connectionOptions = array();
+
+    /**
+     * @var int The strategy for locking, see constants
+     */
+    private $lockMode = self::LOCK_TRANSACTIONAL;
+
+    /**
+     * It's an array to support multiple reads before closing which is manual, non-standard usage.
+     *
+     * @var \PDOStatement[] An array of statements to release advisory locks
+     */
+    private $unlockStatements = array();
+
+    /**
+     * @var bool True when the current session exists but expired according to session.gc_maxlifetime
+     */
+    private $sessionExpired = false;
+
+    /**
+     * @var bool Whether a transaction is active
+     */
+    private $inTransaction = false;
+
+    /**
+     * @var bool Whether gc() has been called
+     */
+    private $gcCalled = false;
+
+    /**
+     * Constructor.
+     *
+     * You can either pass an existing database connection as PDO instance or
+     * pass a DSN string that will be used to lazy-connect to the database
+     * when the session is actually used. Furthermore it's possible to pass null
+     * which will then use the session.save_path ini setting as PDO DSN parameter.
+     *
+     * List of available options:
+     *  * db_table: The name of the table [default: sessions]
+     *  * db_id_col: The column where to store the session id [default: sess_id]
+     *  * db_data_col: The column where to store the session data [default: sess_data]
+     *  * db_lifetime_col: The column where to store the lifetime [default: sess_lifetime]
+     *  * db_time_col: The column where to store the timestamp [default: sess_time]
+     *  * db_username: The username when lazy-connect [default: '']
+     *  * db_password: The password when lazy-connect [default: '']
+     *  * db_connection_options: An array of driver-specific connection options [default: array()]
+     *  * lock_mode: The strategy for locking, see constants [default: LOCK_TRANSACTIONAL]
+     *
+     * @param \PDO|string|null $pdoOrDsn A \PDO instance or DSN string or null
+     * @param array            $options  An associative array of options
+     *
+     * @throws \InvalidArgumentException When PDO error mode is not PDO::ERRMODE_EXCEPTION
+     */
+    public function __construct($pdoOrDsn = null, array $options = array())
+    {
+        if ($pdoOrDsn instanceof \PDO) {
+            if (\PDO::ERRMODE_EXCEPTION !== $pdoOrDsn->getAttribute(\PDO::ATTR_ERRMODE)) {
+                throw new \InvalidArgumentException(sprintf('"%s" requires PDO error mode attribute be set to throw Exceptions (i.e. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION))', __CLASS__));
+            }
+
+            $this->pdo = $pdoOrDsn;
+            $this->driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME);
+        } else {
+            $this->dsn = $pdoOrDsn;
+        }
+
+        $this->table = isset($options['db_table']) ? $options['db_table'] : $this->table;
+        $this->idCol = isset($options['db_id_col']) ? $options['db_id_col'] : $this->idCol;
+        $this->dataCol = isset($options['db_data_col']) ? $options['db_data_col'] : $this->dataCol;
+        $this->lifetimeCol = isset($options['db_lifetime_col']) ? $options['db_lifetime_col'] : $this->lifetimeCol;
+        $this->timeCol = isset($options['db_time_col']) ? $options['db_time_col'] : $this->timeCol;
+        $this->username = isset($options['db_username']) ? $options['db_username'] : $this->username;
+        $this->password = isset($options['db_password']) ? $options['db_password'] : $this->password;
+        $this->connectionOptions = isset($options['db_connection_options']) ? $options['db_connection_options'] : $this->connectionOptions;
+        $this->lockMode = isset($options['lock_mode']) ? $options['lock_mode'] : $this->lockMode;
+    }
+
+    /**
+     * Creates the table to store sessions which can be called once for setup.
+     *
+     * Session ID is saved in a column of maximum length 128 because that is enough even
+     * for a 512 bit configured session.hash_function like Whirlpool. Session data is
+     * saved in a BLOB. One could also use a shorter inlined varbinary column
+     * if one was sure the data fits into it.
+     *
+     * @throws \PDOException    When the table already exists
+     * @throws \DomainException When an unsupported PDO driver is used
+     */
+    public function createTable()
+    {
+        // connect if we are not yet
+        $this->getConnection();
+
+        switch ($this->driver) {
+            case 'mysql':
+                // We use varbinary for the ID column because it prevents unwanted conversions:
+                // - character set conversions between server and client
+                // - trailing space removal
+                // - case-insensitivity
+                // - language processing like é == e
+                $sql = "CREATE TABLE $this->table ($this->idCol VARBINARY(128) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol MEDIUMINT NOT NULL, $this->timeCol INTEGER UNSIGNED NOT NULL) COLLATE utf8_bin, ENGINE = InnoDB";
+                break;
+            case 'sqlite':
+                $sql = "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)";
+                break;
+            case 'pgsql':
+                $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR(128) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)";
+                break;
+            case 'oci':
+                $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR2(128) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)";
+                break;
+            case 'sqlsrv':
+                $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR(128) NOT NULL PRIMARY KEY, $this->dataCol VARBINARY(MAX) NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)";
+                break;
+            default:
+                throw new \DomainException(sprintf('Creating the session table is currently not implemented for PDO driver "%s".', $this->driver));
+        }
+
+        try {
+            $this->pdo->exec($sql);
+        } catch (\PDOException $e) {
+            $this->rollback();
+
+            throw $e;
+        }
+    }
+
+    /**
+     * Returns true when the current session exists but expired according to session.gc_maxlifetime.
+     *
+     * Can be used to distinguish between a new session and one that expired due to inactivity.
+     *
+     * @return bool Whether current session expired
+     */
+    public function isSessionExpired()
+    {
+        return $this->sessionExpired;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function open($savePath, $sessionName)
+    {
+        if (null === $this->pdo) {
+            $this->connect($this->dsn ?: $savePath);
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($sessionId)
+    {
+        try {
+            return $this->doRead($sessionId);
+        } catch (\PDOException $e) {
+            $this->rollback();
+
+            throw $e;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function gc($maxlifetime)
+    {
+        // We delay gc() to close() so that it is executed outside the transactional and blocking read-write process.
+        // This way, pruning expired sessions does not block them from being started while the current session is used.
+        $this->gcCalled = true;
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function destroy($sessionId)
+    {
+        // delete the record associated with this id
+        $sql = "DELETE FROM $this->table WHERE $this->idCol = :id";
+
+        try {
+            $stmt = $this->pdo->prepare($sql);
+            $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
+            $stmt->execute();
+        } catch (\PDOException $e) {
+            $this->rollback();
+
+            throw $e;
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write($sessionId, $data)
+    {
+        $maxlifetime = (int) ini_get('session.gc_maxlifetime');
+
+        try {
+            // We use a single MERGE SQL query when supported by the database.
+            $mergeStmt = $this->getMergeStatement($sessionId, $data, $maxlifetime);
+            if (null !== $mergeStmt) {
+                $mergeStmt->execute();
+
+                return true;
+            }
+
+            $updateStmt = $this->pdo->prepare(
+                "UPDATE $this->table SET $this->dataCol = :data, $this->lifetimeCol = :lifetime, $this->timeCol = :time WHERE $this->idCol = :id"
+            );
+            $updateStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
+            $updateStmt->bindParam(':data', $data, \PDO::PARAM_LOB);
+            $updateStmt->bindParam(':lifetime', $maxlifetime, \PDO::PARAM_INT);
+            $updateStmt->bindValue(':time', time(), \PDO::PARAM_INT);
+            $updateStmt->execute();
+
+            // When MERGE is not supported, like in Postgres < 9.5, we have to use this approach that can result in
+            // duplicate key errors when the same session is written simultaneously (given the LOCK_NONE behavior).
+            // We can just catch such an error and re-execute the update. This is similar to a serializable
+            // transaction with retry logic on serialization failures but without the overhead and without possible
+            // false positives due to longer gap locking.
+            if (!$updateStmt->rowCount()) {
+                try {
+                    $insertStmt = $this->pdo->prepare(
+                        "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time)"
+                    );
+                    $insertStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
+                    $insertStmt->bindParam(':data', $data, \PDO::PARAM_LOB);
+                    $insertStmt->bindParam(':lifetime', $maxlifetime, \PDO::PARAM_INT);
+                    $insertStmt->bindValue(':time', time(), \PDO::PARAM_INT);
+                    $insertStmt->execute();
+                } catch (\PDOException $e) {
+                    // Handle integrity violation SQLSTATE 23000 (or a subclass like 23505 in Postgres) for duplicate keys
+                    if (0 === strpos($e->getCode(), '23')) {
+                        $updateStmt->execute();
+                    } else {
+                        throw $e;
+                    }
+                }
+            }
+        } catch (\PDOException $e) {
+            $this->rollback();
+
+            throw $e;
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        $this->commit();
+
+        while ($unlockStmt = array_shift($this->unlockStatements)) {
+            $unlockStmt->execute();
+        }
+
+        if ($this->gcCalled) {
+            $this->gcCalled = false;
+
+            // delete the session records that have expired
+            $sql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol < :time";
+
+            $stmt = $this->pdo->prepare($sql);
+            $stmt->bindValue(':time', time(), \PDO::PARAM_INT);
+            $stmt->execute();
+        }
+
+        if (false !== $this->dsn) {
+            $this->pdo = null; // only close lazy-connection
+        }
+
+        return true;
+    }
+
+    /**
+     * Lazy-connects to the database.
+     *
+     * @param string $dsn DSN string
+     */
+    private function connect($dsn)
+    {
+        $this->pdo = new \PDO($dsn, $this->username, $this->password, $this->connectionOptions);
+        $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+        $this->driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME);
+    }
+
+    /**
+     * Helper method to begin a transaction.
+     *
+     * Since SQLite does not support row level locks, we have to acquire a reserved lock
+     * on the database immediately. Because of https://bugs.php.net/42766 we have to create
+     * such a transaction manually which also means we cannot use PDO::commit or
+     * PDO::rollback or PDO::inTransaction for SQLite.
+     *
+     * Also MySQLs default isolation, REPEATABLE READ, causes deadlock for different sessions
+     * due to http://www.mysqlperformanceblog.com/2013/12/12/one-more-innodb-gap-lock-to-avoid/ .
+     * So we change it to READ COMMITTED.
+     */
+    private function beginTransaction()
+    {
+        if (!$this->inTransaction) {
+            if ('sqlite' === $this->driver) {
+                $this->pdo->exec('BEGIN IMMEDIATE TRANSACTION');
+            } else {
+                if ('mysql' === $this->driver) {
+                    $this->pdo->exec('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');
+                }
+                $this->pdo->beginTransaction();
+            }
+            $this->inTransaction = true;
+        }
+    }
+
+    /**
+     * Helper method to commit a transaction.
+     */
+    private function commit()
+    {
+        if ($this->inTransaction) {
+            try {
+                // commit read-write transaction which also releases the lock
+                if ('sqlite' === $this->driver) {
+                    $this->pdo->exec('COMMIT');
+                } else {
+                    $this->pdo->commit();
+                }
+                $this->inTransaction = false;
+            } catch (\PDOException $e) {
+                $this->rollback();
+
+                throw $e;
+            }
+        }
+    }
+
+    /**
+     * Helper method to rollback a transaction.
+     */
+    private function rollback()
+    {
+        // We only need to rollback if we are in a transaction. Otherwise the resulting
+        // error would hide the real problem why rollback was called. We might not be
+        // in a transaction when not using the transactional locking behavior or when
+        // two callbacks (e.g. destroy and write) are invoked that both fail.
+        if ($this->inTransaction) {
+            if ('sqlite' === $this->driver) {
+                $this->pdo->exec('ROLLBACK');
+            } else {
+                $this->pdo->rollBack();
+            }
+            $this->inTransaction = false;
+        }
+    }
+
+    /**
+     * Reads the session data in respect to the different locking strategies.
+     *
+     * We need to make sure we do not return session data that is already considered garbage according
+     * to the session.gc_maxlifetime setting because gc() is called after read() and only sometimes.
+     *
+     * @param string $sessionId Session ID
+     *
+     * @return string The session data
+     */
+    private function doRead($sessionId)
+    {
+        $this->sessionExpired = false;
+
+        if (self::LOCK_ADVISORY === $this->lockMode) {
+            $this->unlockStatements[] = $this->doAdvisoryLock($sessionId);
+        }
+
+        $selectSql = $this->getSelectSql();
+        $selectStmt = $this->pdo->prepare($selectSql);
+        $selectStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
+
+        do {
+            $selectStmt->execute();
+            $sessionRows = $selectStmt->fetchAll(\PDO::FETCH_NUM);
+
+            if ($sessionRows) {
+                if ($sessionRows[0][1] + $sessionRows[0][2] < time()) {
+                    $this->sessionExpired = true;
+
+                    return '';
+                }
+
+                return is_resource($sessionRows[0][0]) ? stream_get_contents($sessionRows[0][0]) : $sessionRows[0][0];
+            }
+
+            if (self::LOCK_TRANSACTIONAL === $this->lockMode && 'sqlite' !== $this->driver) {
+                // Exclusive-reading of non-existent rows does not block, so we need to do an insert to block
+                // until other connections to the session are committed.
+                try {
+                    $insertStmt = $this->pdo->prepare(
+                        "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time)"
+                    );
+                    $insertStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
+                    $insertStmt->bindValue(':data', '', \PDO::PARAM_LOB);
+                    $insertStmt->bindValue(':lifetime', 0, \PDO::PARAM_INT);
+                    $insertStmt->bindValue(':time', time(), \PDO::PARAM_INT);
+                    $insertStmt->execute();
+                } catch (\PDOException $e) {
+                    // Catch duplicate key error because other connection created the session already.
+                    // It would only not be the case when the other connection destroyed the session.
+                    if (0 === strpos($e->getCode(), '23')) {
+                        // Retrieve finished session data written by concurrent connection by restarting the loop.
+                        // We have to start a new transaction as a failed query will mark the current transaction as
+                        // aborted in PostgreSQL and disallow further queries within it.
+                        $this->rollback();
+                        $this->beginTransaction();
+                        continue;
+                    }
+
+                    throw $e;
+                }
+            }
+
+            return '';
+        } while (true);
+    }
+
+    /**
+     * Executes an application-level lock on the database.
+     *
+     * @param string $sessionId Session ID
+     *
+     * @return \PDOStatement The statement that needs to be executed later to release the lock
+     *
+     * @throws \DomainException When an unsupported PDO driver is used
+     *
+     * @todo implement missing advisory locks
+     *       - for oci using DBMS_LOCK.REQUEST
+     *       - for sqlsrv using sp_getapplock with LockOwner = Session
+     */
+    private function doAdvisoryLock($sessionId)
+    {
+        switch ($this->driver) {
+            case 'mysql':
+                // should we handle the return value? 0 on timeout, null on error
+                // we use a timeout of 50 seconds which is also the default for innodb_lock_wait_timeout
+                $stmt = $this->pdo->prepare('SELECT GET_LOCK(:key, 50)');
+                $stmt->bindValue(':key', $sessionId, \PDO::PARAM_STR);
+                $stmt->execute();
+
+                $releaseStmt = $this->pdo->prepare('DO RELEASE_LOCK(:key)');
+                $releaseStmt->bindValue(':key', $sessionId, \PDO::PARAM_STR);
+
+                return $releaseStmt;
+            case 'pgsql':
+                // Obtaining an exclusive session level advisory lock requires an integer key.
+                // So we convert the HEX representation of the session id to an integer.
+                // Since integers are signed, we have to skip one hex char to fit in the range.
+                if (4 === PHP_INT_SIZE) {
+                    $sessionInt1 = hexdec(substr($sessionId, 0, 7));
+                    $sessionInt2 = hexdec(substr($sessionId, 7, 7));
+
+                    $stmt = $this->pdo->prepare('SELECT pg_advisory_lock(:key1, :key2)');
+                    $stmt->bindValue(':key1', $sessionInt1, \PDO::PARAM_INT);
+                    $stmt->bindValue(':key2', $sessionInt2, \PDO::PARAM_INT);
+                    $stmt->execute();
+
+                    $releaseStmt = $this->pdo->prepare('SELECT pg_advisory_unlock(:key1, :key2)');
+                    $releaseStmt->bindValue(':key1', $sessionInt1, \PDO::PARAM_INT);
+                    $releaseStmt->bindValue(':key2', $sessionInt2, \PDO::PARAM_INT);
+                } else {
+                    $sessionBigInt = hexdec(substr($sessionId, 0, 15));
+
+                    $stmt = $this->pdo->prepare('SELECT pg_advisory_lock(:key)');
+                    $stmt->bindValue(':key', $sessionBigInt, \PDO::PARAM_INT);
+                    $stmt->execute();
+
+                    $releaseStmt = $this->pdo->prepare('SELECT pg_advisory_unlock(:key)');
+                    $releaseStmt->bindValue(':key', $sessionBigInt, \PDO::PARAM_INT);
+                }
+
+                return $releaseStmt;
+            case 'sqlite':
+                throw new \DomainException('SQLite does not support advisory locks.');
+            default:
+                throw new \DomainException(sprintf('Advisory locks are currently not implemented for PDO driver "%s".', $this->driver));
+        }
+    }
+
+    /**
+     * Return a locking or nonlocking SQL query to read session information.
+     *
+     * @return string The SQL string
+     *
+     * @throws \DomainException When an unsupported PDO driver is used
+     */
+    private function getSelectSql()
+    {
+        if (self::LOCK_TRANSACTIONAL === $this->lockMode) {
+            $this->beginTransaction();
+
+            switch ($this->driver) {
+                case 'mysql':
+                case 'oci':
+                case 'pgsql':
+                    return "SELECT $this->dataCol, $this->lifetimeCol, $this->timeCol FROM $this->table WHERE $this->idCol = :id FOR UPDATE";
+                case 'sqlsrv':
+                    return "SELECT $this->dataCol, $this->lifetimeCol, $this->timeCol FROM $this->table WITH (UPDLOCK, ROWLOCK) WHERE $this->idCol = :id";
+                case 'sqlite':
+                    // we already locked when starting transaction
+                    break;
+                default:
+                    throw new \DomainException(sprintf('Transactional locks are currently not implemented for PDO driver "%s".', $this->driver));
+            }
+        }
+
+        return "SELECT $this->dataCol, $this->lifetimeCol, $this->timeCol FROM $this->table WHERE $this->idCol = :id";
+    }
+
+    /**
+     * Returns a merge/upsert (i.e. insert or update) statement when supported by the database for writing session data.
+     *
+     * @param string $sessionId   Session ID
+     * @param string $data        Encoded session data
+     * @param int    $maxlifetime session.gc_maxlifetime
+     *
+     * @return \PDOStatement|null The merge statement or null when not supported
+     */
+    private function getMergeStatement($sessionId, $data, $maxlifetime)
+    {
+        $mergeSql = null;
+        switch (true) {
+            case 'mysql' === $this->driver:
+                $mergeSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time) ".
+                    "ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)";
+                break;
+            case 'oci' === $this->driver:
+                // DUAL is Oracle specific dummy table
+                $mergeSql = "MERGE INTO $this->table USING DUAL ON ($this->idCol = ?) ".
+                    "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
+                    "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?";
+                break;
+            case 'sqlsrv' === $this->driver && version_compare($this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION), '10', '>='):
+                // MERGE is only available since SQL Server 2008 and must be terminated by semicolon
+                // It also requires HOLDLOCK according to http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx
+                $mergeSql = "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) ".
+                    "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
+                    "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;";
+                break;
+            case 'sqlite' === $this->driver:
+                $mergeSql = "INSERT OR REPLACE INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time)";
+                break;
+            case 'pgsql' === $this->driver && version_compare($this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION), '9.5', '>='):
+                $mergeSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time) ".
+                    "ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)";
+                break;
+        }
+
+        if (null !== $mergeSql) {
+            $mergeStmt = $this->pdo->prepare($mergeSql);
+
+            if ('sqlsrv' === $this->driver || 'oci' === $this->driver) {
+                $mergeStmt->bindParam(1, $sessionId, \PDO::PARAM_STR);
+                $mergeStmt->bindParam(2, $sessionId, \PDO::PARAM_STR);
+                $mergeStmt->bindParam(3, $data, \PDO::PARAM_LOB);
+                $mergeStmt->bindParam(4, $maxlifetime, \PDO::PARAM_INT);
+                $mergeStmt->bindValue(5, time(), \PDO::PARAM_INT);
+                $mergeStmt->bindParam(6, $data, \PDO::PARAM_LOB);
+                $mergeStmt->bindParam(7, $maxlifetime, \PDO::PARAM_INT);
+                $mergeStmt->bindValue(8, time(), \PDO::PARAM_INT);
+            } else {
+                $mergeStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
+                $mergeStmt->bindParam(':data', $data, \PDO::PARAM_LOB);
+                $mergeStmt->bindParam(':lifetime', $maxlifetime, \PDO::PARAM_INT);
+                $mergeStmt->bindValue(':time', time(), \PDO::PARAM_INT);
+            }
+
+            return $mergeStmt;
+        }
+    }
+
+    /**
+     * Return a PDO instance.
+     *
+     * @return \PDO
+     */
+    protected function getConnection()
+    {
+        if (null === $this->pdo) {
+            $this->connect($this->dsn ?: ini_get('session.save_path'));
+        }
+
+        return $this->pdo;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/WriteCheckSessionHandler.php
@@ -0,0 +1,91 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
+
+/**
+ * Wraps another SessionHandlerInterface to only write the session when it has been modified.
+ *
+ * @author Adrien Brault <adrien.brault@gmail.com>
+ */
+class WriteCheckSessionHandler implements \SessionHandlerInterface
+{
+    /**
+     * @var \SessionHandlerInterface
+     */
+    private $wrappedSessionHandler;
+
+    /**
+     * @var array sessionId => session
+     */
+    private $readSessions;
+
+    public function __construct(\SessionHandlerInterface $wrappedSessionHandler)
+    {
+        $this->wrappedSessionHandler = $wrappedSessionHandler;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        return $this->wrappedSessionHandler->close();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function destroy($sessionId)
+    {
+        return $this->wrappedSessionHandler->destroy($sessionId);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function gc($maxlifetime)
+    {
+        return $this->wrappedSessionHandler->gc($maxlifetime);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function open($savePath, $sessionName)
+    {
+        return $this->wrappedSessionHandler->open($savePath, $sessionName);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($sessionId)
+    {
+        $session = $this->wrappedSessionHandler->read($sessionId);
+
+        $this->readSessions[$sessionId] = $session;
+
+        return $session;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write($sessionId, $data)
+    {
+        if (isset($this->readSessions[$sessionId]) && $data === $this->readSessions[$sessionId]) {
+            return true;
+        }
+
+        return $this->wrappedSessionHandler->write($sessionId, $data);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php
@@ -0,0 +1,170 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage;
+
+use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
+
+/**
+ * Metadata container.
+ *
+ * Adds metadata to the session.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+class MetadataBag implements SessionBagInterface
+{
+    const CREATED = 'c';
+    const UPDATED = 'u';
+    const LIFETIME = 'l';
+
+    /**
+     * @var string
+     */
+    private $name = '__metadata';
+
+    /**
+     * @var string
+     */
+    private $storageKey;
+
+    /**
+     * @var array
+     */
+    protected $meta = array(self::CREATED => 0, self::UPDATED => 0, self::LIFETIME => 0);
+
+    /**
+     * Unix timestamp.
+     *
+     * @var int
+     */
+    private $lastUsed;
+
+    /**
+     * @var int
+     */
+    private $updateThreshold;
+
+    /**
+     * Constructor.
+     *
+     * @param string $storageKey      The key used to store bag in the session
+     * @param int    $updateThreshold The time to wait between two UPDATED updates
+     */
+    public function __construct($storageKey = '_sf2_meta', $updateThreshold = 0)
+    {
+        $this->storageKey = $storageKey;
+        $this->updateThreshold = $updateThreshold;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function initialize(array &$array)
+    {
+        $this->meta = &$array;
+
+        if (isset($array[self::CREATED])) {
+            $this->lastUsed = $this->meta[self::UPDATED];
+
+            $timeStamp = time();
+            if ($timeStamp - $array[self::UPDATED] >= $this->updateThreshold) {
+                $this->meta[self::UPDATED] = $timeStamp;
+            }
+        } else {
+            $this->stampCreated();
+        }
+    }
+
+    /**
+     * Gets the lifetime that the session cookie was set with.
+     *
+     * @return int
+     */
+    public function getLifetime()
+    {
+        return $this->meta[self::LIFETIME];
+    }
+
+    /**
+     * Stamps a new session's metadata.
+     *
+     * @param int $lifetime Sets the cookie lifetime for the session cookie. A null value
+     *                      will leave the system settings unchanged, 0 sets the cookie
+     *                      to expire with browser session. Time is in seconds, and is
+     *                      not a Unix timestamp.
+     */
+    public function stampNew($lifetime = null)
+    {
+        $this->stampCreated($lifetime);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getStorageKey()
+    {
+        return $this->storageKey;
+    }
+
+    /**
+     * Gets the created timestamp metadata.
+     *
+     * @return int Unix timestamp
+     */
+    public function getCreated()
+    {
+        return $this->meta[self::CREATED];
+    }
+
+    /**
+     * Gets the last used metadata.
+     *
+     * @return int Unix timestamp
+     */
+    public function getLastUsed()
+    {
+        return $this->lastUsed;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        // nothing to do
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Sets name.
+     *
+     * @param string $name
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    private function stampCreated($lifetime = null)
+    {
+        $timeStamp = time();
+        $this->meta[self::CREATED] = $this->meta[self::UPDATED] = $this->lastUsed = $timeStamp;
+        $this->meta[self::LIFETIME] = (null === $lifetime) ? ini_get('session.cookie_lifetime') : $lifetime;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php
@@ -0,0 +1,268 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage;
+
+use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
+
+/**
+ * MockArraySessionStorage mocks the session for unit tests.
+ *
+ * No PHP session is actually started since a session can be initialized
+ * and shutdown only once per PHP execution cycle.
+ *
+ * When doing functional testing, you should use MockFileSessionStorage instead.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
+ * @author Drak <drak@zikula.org>
+ */
+class MockArraySessionStorage implements SessionStorageInterface
+{
+    /**
+     * @var string
+     */
+    protected $id = '';
+
+    /**
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * @var bool
+     */
+    protected $started = false;
+
+    /**
+     * @var bool
+     */
+    protected $closed = false;
+
+    /**
+     * @var array
+     */
+    protected $data = array();
+
+    /**
+     * @var MetadataBag
+     */
+    protected $metadataBag;
+
+    /**
+     * @var array
+     */
+    protected $bags;
+
+    /**
+     * Constructor.
+     *
+     * @param string      $name    Session name
+     * @param MetadataBag $metaBag MetadataBag instance
+     */
+    public function __construct($name = 'MOCKSESSID', MetadataBag $metaBag = null)
+    {
+        $this->name = $name;
+        $this->setMetadataBag($metaBag);
+    }
+
+    /**
+     * Sets the session data.
+     *
+     * @param array $array
+     */
+    public function setSessionData(array $array)
+    {
+        $this->data = $array;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function start()
+    {
+        if ($this->started) {
+            return true;
+        }
+
+        if (empty($this->id)) {
+            $this->id = $this->generateId();
+        }
+
+        $this->loadSession();
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function regenerate($destroy = false, $lifetime = null)
+    {
+        if (!$this->started) {
+            $this->start();
+        }
+
+        $this->metadataBag->stampNew($lifetime);
+        $this->id = $this->generateId();
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setId($id)
+    {
+        if ($this->started) {
+            throw new \LogicException('Cannot set session ID after the session has started.');
+        }
+
+        $this->id = $id;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save()
+    {
+        if (!$this->started || $this->closed) {
+            throw new \RuntimeException('Trying to save a session that was not started yet or was already closed');
+        }
+        // nothing to do since we don't persist the session data
+        $this->closed = false;
+        $this->started = false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        // clear out the bags
+        foreach ($this->bags as $bag) {
+            $bag->clear();
+        }
+
+        // clear out the session
+        $this->data = array();
+
+        // reconnect the bags to the session
+        $this->loadSession();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function registerBag(SessionBagInterface $bag)
+    {
+        $this->bags[$bag->getName()] = $bag;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBag($name)
+    {
+        if (!isset($this->bags[$name])) {
+            throw new \InvalidArgumentException(sprintf('The SessionBagInterface %s is not registered.', $name));
+        }
+
+        if (!$this->started) {
+            $this->start();
+        }
+
+        return $this->bags[$name];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isStarted()
+    {
+        return $this->started;
+    }
+
+    /**
+     * Sets the MetadataBag.
+     *
+     * @param MetadataBag $bag
+     */
+    public function setMetadataBag(MetadataBag $bag = null)
+    {
+        if (null === $bag) {
+            $bag = new MetadataBag();
+        }
+
+        $this->metadataBag = $bag;
+    }
+
+    /**
+     * Gets the MetadataBag.
+     *
+     * @return MetadataBag
+     */
+    public function getMetadataBag()
+    {
+        return $this->metadataBag;
+    }
+
+    /**
+     * Generates a session ID.
+     *
+     * This doesn't need to be particularly cryptographically secure since this is just
+     * a mock.
+     *
+     * @return string
+     */
+    protected function generateId()
+    {
+        return hash('sha256', uniqid('ss_mock_', true));
+    }
+
+    protected function loadSession()
+    {
+        $bags = array_merge($this->bags, array($this->metadataBag));
+
+        foreach ($bags as $bag) {
+            $key = $bag->getStorageKey();
+            $this->data[$key] = isset($this->data[$key]) ? $this->data[$key] : array();
+            $bag->initialize($this->data[$key]);
+        }
+
+        $this->started = true;
+        $this->closed = false;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php
@@ -0,0 +1,138 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage;
+
+/**
+ * MockFileSessionStorage is used to mock sessions for
+ * functional testing when done in a single PHP process.
+ *
+ * No PHP session is actually started since a session can be initialized
+ * and shutdown only once per PHP execution cycle and this class does
+ * not pollute any session related globals, including session_*() functions
+ * or session.* PHP ini directives.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+class MockFileSessionStorage extends MockArraySessionStorage
+{
+    /**
+     * @var string
+     */
+    private $savePath;
+
+    /**
+     * Constructor.
+     *
+     * @param string      $savePath Path of directory to save session files
+     * @param string      $name     Session name
+     * @param MetadataBag $metaBag  MetadataBag instance
+     */
+    public function __construct($savePath = null, $name = 'MOCKSESSID', MetadataBag $metaBag = null)
+    {
+        if (null === $savePath) {
+            $savePath = sys_get_temp_dir();
+        }
+
+        if (!is_dir($savePath) && !@mkdir($savePath, 0777, true) && !is_dir($savePath)) {
+            throw new \RuntimeException(sprintf('Session Storage was not able to create directory "%s"', $savePath));
+        }
+
+        $this->savePath = $savePath;
+
+        parent::__construct($name, $metaBag);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function start()
+    {
+        if ($this->started) {
+            return true;
+        }
+
+        if (!$this->id) {
+            $this->id = $this->generateId();
+        }
+
+        $this->read();
+
+        $this->started = true;
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function regenerate($destroy = false, $lifetime = null)
+    {
+        if (!$this->started) {
+            $this->start();
+        }
+
+        if ($destroy) {
+            $this->destroy();
+        }
+
+        return parent::regenerate($destroy, $lifetime);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save()
+    {
+        if (!$this->started) {
+            throw new \RuntimeException('Trying to save a session that was not started yet or was already closed');
+        }
+
+        file_put_contents($this->getFilePath(), serialize($this->data));
+
+        // this is needed for Silex, where the session object is re-used across requests
+        // in functional tests. In Symfony, the container is rebooted, so we don't have
+        // this issue
+        $this->started = false;
+    }
+
+    /**
+     * Deletes a session from persistent storage.
+     * Deliberately leaves session data in memory intact.
+     */
+    private function destroy()
+    {
+        if (is_file($this->getFilePath())) {
+            unlink($this->getFilePath());
+        }
+    }
+
+    /**
+     * Calculate path to file.
+     *
+     * @return string File path
+     */
+    private function getFilePath()
+    {
+        return $this->savePath.'/'.$this->id.'.mocksess';
+    }
+
+    /**
+     * Reads session from storage and loads session.
+     */
+    private function read()
+    {
+        $filePath = $this->getFilePath();
+        $this->data = is_readable($filePath) && is_file($filePath) ? unserialize(file_get_contents($filePath)) : array();
+
+        $this->loadSession();
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php
@@ -0,0 +1,430 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage;
+
+use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
+use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler;
+use Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy;
+use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy;
+use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy;
+
+/**
+ * This provides a base class for session attribute storage.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+class NativeSessionStorage implements SessionStorageInterface
+{
+    /**
+     * Array of SessionBagInterface.
+     *
+     * @var SessionBagInterface[]
+     */
+    protected $bags;
+
+    /**
+     * @var bool
+     */
+    protected $started = false;
+
+    /**
+     * @var bool
+     */
+    protected $closed = false;
+
+    /**
+     * @var AbstractProxy
+     */
+    protected $saveHandler;
+
+    /**
+     * @var MetadataBag
+     */
+    protected $metadataBag;
+
+    /**
+     * Constructor.
+     *
+     * Depending on how you want the storage driver to behave you probably
+     * want to override this constructor entirely.
+     *
+     * List of options for $options array with their defaults.
+     *
+     * @see http://php.net/session.configuration for options
+     * but we omit 'session.' from the beginning of the keys for convenience.
+     *
+     * ("auto_start", is not supported as it tells PHP to start a session before
+     * PHP starts to execute user-land code. Setting during runtime has no effect).
+     *
+     * cache_limiter, "" (use "0" to prevent headers from being sent entirely).
+     * cookie_domain, ""
+     * cookie_httponly, ""
+     * cookie_lifetime, "0"
+     * cookie_path, "/"
+     * cookie_secure, ""
+     * entropy_file, ""
+     * entropy_length, "0"
+     * gc_divisor, "100"
+     * gc_maxlifetime, "1440"
+     * gc_probability, "1"
+     * hash_bits_per_character, "4"
+     * hash_function, "0"
+     * name, "PHPSESSID"
+     * referer_check, ""
+     * serialize_handler, "php"
+     * use_cookies, "1"
+     * use_only_cookies, "1"
+     * use_trans_sid, "0"
+     * upload_progress.enabled, "1"
+     * upload_progress.cleanup, "1"
+     * upload_progress.prefix, "upload_progress_"
+     * upload_progress.name, "PHP_SESSION_UPLOAD_PROGRESS"
+     * upload_progress.freq, "1%"
+     * upload_progress.min-freq, "1"
+     * url_rewriter.tags, "a=href,area=href,frame=src,form=,fieldset="
+     *
+     * @param array                                                            $options Session configuration options
+     * @param AbstractProxy|NativeSessionHandler|\SessionHandlerInterface|null $handler
+     * @param MetadataBag                                                      $metaBag MetadataBag
+     */
+    public function __construct(array $options = array(), $handler = null, MetadataBag $metaBag = null)
+    {
+        session_cache_limiter(''); // disable by default because it's managed by HeaderBag (if used)
+        ini_set('session.use_cookies', 1);
+
+        session_register_shutdown();
+
+        $this->setMetadataBag($metaBag);
+        $this->setOptions($options);
+        $this->setSaveHandler($handler);
+    }
+
+    /**
+     * Gets the save handler instance.
+     *
+     * @return AbstractProxy
+     */
+    public function getSaveHandler()
+    {
+        return $this->saveHandler;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function start()
+    {
+        if ($this->started) {
+            return true;
+        }
+
+        if (PHP_VERSION_ID >= 50400 && \PHP_SESSION_ACTIVE === session_status()) {
+            throw new \RuntimeException('Failed to start the session: already started by PHP.');
+        }
+
+        if (PHP_VERSION_ID < 50400 && !$this->closed && isset($_SESSION) && session_id()) {
+            // not 100% fool-proof, but is the most reliable way to determine if a session is active in PHP 5.3
+            throw new \RuntimeException('Failed to start the session: already started by PHP ($_SESSION is set).');
+        }
+
+        if (ini_get('session.use_cookies') && headers_sent($file, $line)) {
+            throw new \RuntimeException(sprintf('Failed to start the session because headers have already been sent by "%s" at line %d.', $file, $line));
+        }
+
+        // ok to try and start the session
+        if (!session_start()) {
+            throw new \RuntimeException('Failed to start the session');
+        }
+
+        $this->loadSession();
+        if (!$this->saveHandler->isWrapper() && !$this->saveHandler->isSessionHandlerInterface()) {
+            // This condition matches only PHP 5.3 with internal save handlers
+            $this->saveHandler->setActive(true);
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getId()
+    {
+        return $this->saveHandler->getId();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setId($id)
+    {
+        $this->saveHandler->setId($id);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->saveHandler->getName();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setName($name)
+    {
+        $this->saveHandler->setName($name);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function regenerate($destroy = false, $lifetime = null)
+    {
+        // Cannot regenerate the session ID for non-active sessions.
+        if (PHP_VERSION_ID >= 50400 && \PHP_SESSION_ACTIVE !== session_status()) {
+            return false;
+        }
+
+        // Check if session ID exists in PHP 5.3
+        if (PHP_VERSION_ID < 50400 && '' === session_id()) {
+            return false;
+        }
+
+        if (null !== $lifetime) {
+            ini_set('session.cookie_lifetime', $lifetime);
+        }
+
+        if ($destroy) {
+            $this->metadataBag->stampNew();
+        }
+
+        $isRegenerated = session_regenerate_id($destroy);
+
+        // The reference to $_SESSION in session bags is lost in PHP7 and we need to re-create it.
+        // @see https://bugs.php.net/bug.php?id=70013
+        $this->loadSession();
+
+        return $isRegenerated;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save()
+    {
+        session_write_close();
+
+        if (!$this->saveHandler->isWrapper() && !$this->saveHandler->isSessionHandlerInterface()) {
+            // This condition matches only PHP 5.3 with internal save handlers
+            $this->saveHandler->setActive(false);
+        }
+
+        $this->closed = true;
+        $this->started = false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        // clear out the bags
+        foreach ($this->bags as $bag) {
+            $bag->clear();
+        }
+
+        // clear out the session
+        $_SESSION = array();
+
+        // reconnect the bags to the session
+        $this->loadSession();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function registerBag(SessionBagInterface $bag)
+    {
+        if ($this->started) {
+            throw new \LogicException('Cannot register a bag when the session is already started.');
+        }
+
+        $this->bags[$bag->getName()] = $bag;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBag($name)
+    {
+        if (!isset($this->bags[$name])) {
+            throw new \InvalidArgumentException(sprintf('The SessionBagInterface %s is not registered.', $name));
+        }
+
+        if ($this->saveHandler->isActive() && !$this->started) {
+            $this->loadSession();
+        } elseif (!$this->started) {
+            $this->start();
+        }
+
+        return $this->bags[$name];
+    }
+
+    /**
+     * Sets the MetadataBag.
+     *
+     * @param MetadataBag $metaBag
+     */
+    public function setMetadataBag(MetadataBag $metaBag = null)
+    {
+        if (null === $metaBag) {
+            $metaBag = new MetadataBag();
+        }
+
+        $this->metadataBag = $metaBag;
+    }
+
+    /**
+     * Gets the MetadataBag.
+     *
+     * @return MetadataBag
+     */
+    public function getMetadataBag()
+    {
+        return $this->metadataBag;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isStarted()
+    {
+        return $this->started;
+    }
+
+    /**
+     * Sets session.* ini variables.
+     *
+     * For convenience we omit 'session.' from the beginning of the keys.
+     * Explicitly ignores other ini keys.
+     *
+     * @param array $options Session ini directives array(key => value)
+     *
+     * @see http://php.net/session.configuration
+     */
+    public function setOptions(array $options)
+    {
+        $validOptions = array_flip(array(
+            'cache_limiter', 'cookie_domain', 'cookie_httponly',
+            'cookie_lifetime', 'cookie_path', 'cookie_secure',
+            'entropy_file', 'entropy_length', 'gc_divisor',
+            'gc_maxlifetime', 'gc_probability', 'hash_bits_per_character',
+            'hash_function', 'name', 'referer_check',
+            'serialize_handler', 'use_cookies',
+            'use_only_cookies', 'use_trans_sid', 'upload_progress.enabled',
+            'upload_progress.cleanup', 'upload_progress.prefix', 'upload_progress.name',
+            'upload_progress.freq', 'upload_progress.min-freq', 'url_rewriter.tags',
+        ));
+
+        foreach ($options as $key => $value) {
+            if (isset($validOptions[$key])) {
+                ini_set('session.'.$key, $value);
+            }
+        }
+    }
+
+    /**
+     * Registers session save handler as a PHP session handler.
+     *
+     * To use internal PHP session save handlers, override this method using ini_set with
+     * session.save_handler and session.save_path e.g.
+     *
+     *     ini_set('session.save_handler', 'files');
+     *     ini_set('session.save_path', '/tmp');
+     *
+     * or pass in a NativeSessionHandler instance which configures session.save_handler in the
+     * constructor, for a template see NativeFileSessionHandler or use handlers in
+     * composer package drak/native-session
+     *
+     * @see http://php.net/session-set-save-handler
+     * @see http://php.net/sessionhandlerinterface
+     * @see http://php.net/sessionhandler
+     * @see http://github.com/drak/NativeSession
+     *
+     * @param AbstractProxy|NativeSessionHandler|\SessionHandlerInterface|null $saveHandler
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function setSaveHandler($saveHandler = null)
+    {
+        if (!$saveHandler instanceof AbstractProxy &&
+            !$saveHandler instanceof NativeSessionHandler &&
+            !$saveHandler instanceof \SessionHandlerInterface &&
+            null !== $saveHandler) {
+            throw new \InvalidArgumentException('Must be instance of AbstractProxy or NativeSessionHandler; implement \SessionHandlerInterface; or be null.');
+        }
+
+        // Wrap $saveHandler in proxy and prevent double wrapping of proxy
+        if (!$saveHandler instanceof AbstractProxy && $saveHandler instanceof \SessionHandlerInterface) {
+            $saveHandler = new SessionHandlerProxy($saveHandler);
+        } elseif (!$saveHandler instanceof AbstractProxy) {
+            $saveHandler = PHP_VERSION_ID >= 50400 ?
+                new SessionHandlerProxy(new \SessionHandler()) : new NativeProxy();
+        }
+        $this->saveHandler = $saveHandler;
+
+        if ($this->saveHandler instanceof \SessionHandlerInterface) {
+            if (PHP_VERSION_ID >= 50400) {
+                session_set_save_handler($this->saveHandler, false);
+            } else {
+                session_set_save_handler(
+                    array($this->saveHandler, 'open'),
+                    array($this->saveHandler, 'close'),
+                    array($this->saveHandler, 'read'),
+                    array($this->saveHandler, 'write'),
+                    array($this->saveHandler, 'destroy'),
+                    array($this->saveHandler, 'gc')
+                );
+            }
+        }
+    }
+
+    /**
+     * Load the session with attributes.
+     *
+     * After starting the session, PHP retrieves the session from whatever handlers
+     * are set to (either PHP's internal, or a custom save handler set with session_set_save_handler()).
+     * PHP takes the return value from the read() handler, unserializes it
+     * and populates $_SESSION with the result automatically.
+     *
+     * @param array|null $session
+     */
+    protected function loadSession(array &$session = null)
+    {
+        if (null === $session) {
+            $session = &$_SESSION;
+        }
+
+        $bags = array_merge($this->bags, array($this->metadataBag));
+
+        foreach ($bags as $bag) {
+            $key = $bag->getStorageKey();
+            $session[$key] = isset($session[$key]) ? $session[$key] : array();
+            $bag->initialize($session[$key]);
+        }
+
+        $this->started = true;
+        $this->closed = false;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php
@@ -0,0 +1,68 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage;
+
+use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy;
+use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler;
+
+/**
+ * Allows session to be started by PHP and managed by Symfony.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+class PhpBridgeSessionStorage extends NativeSessionStorage
+{
+    /**
+     * Constructor.
+     *
+     * @param AbstractProxy|NativeSessionHandler|\SessionHandlerInterface|null $handler
+     * @param MetadataBag                                                      $metaBag MetadataBag
+     */
+    public function __construct($handler = null, MetadataBag $metaBag = null)
+    {
+        $this->setMetadataBag($metaBag);
+        $this->setSaveHandler($handler);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function start()
+    {
+        if ($this->started) {
+            return true;
+        }
+
+        $this->loadSession();
+        if (!$this->saveHandler->isWrapper() && !$this->saveHandler->isSessionHandlerInterface()) {
+            // This condition matches only PHP 5.3 + internal save handlers
+            $this->saveHandler->setActive(true);
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        // clear out the bags and nothing else that may be set
+        // since the purpose of this driver is to share a handler
+        foreach ($this->bags as $bag) {
+            $bag->clear();
+        }
+
+        // reconnect the bags to the session
+        $this->loadSession();
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php
@@ -0,0 +1,154 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy;
+
+/**
+ * AbstractProxy.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+abstract class AbstractProxy
+{
+    /**
+     * Flag if handler wraps an internal PHP session handler (using \SessionHandler).
+     *
+     * @var bool
+     */
+    protected $wrapper = false;
+
+    /**
+     * @var bool
+     */
+    protected $active = false;
+
+    /**
+     * @var string
+     */
+    protected $saveHandlerName;
+
+    /**
+     * Gets the session.save_handler name.
+     *
+     * @return string
+     */
+    public function getSaveHandlerName()
+    {
+        return $this->saveHandlerName;
+    }
+
+    /**
+     * Is this proxy handler and instance of \SessionHandlerInterface.
+     *
+     * @return bool
+     */
+    public function isSessionHandlerInterface()
+    {
+        return $this instanceof \SessionHandlerInterface;
+    }
+
+    /**
+     * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler.
+     *
+     * @return bool
+     */
+    public function isWrapper()
+    {
+        return $this->wrapper;
+    }
+
+    /**
+     * Has a session started?
+     *
+     * @return bool
+     */
+    public function isActive()
+    {
+        if (PHP_VERSION_ID >= 50400) {
+            return $this->active = \PHP_SESSION_ACTIVE === session_status();
+        }
+
+        return $this->active;
+    }
+
+    /**
+     * Sets the active flag.
+     *
+     * Has no effect under PHP 5.4+ as status is detected
+     * automatically in isActive()
+     *
+     * @internal
+     *
+     * @param bool $flag
+     *
+     * @throws \LogicException
+     */
+    public function setActive($flag)
+    {
+        if (PHP_VERSION_ID >= 50400) {
+            throw new \LogicException('This method is disabled in PHP 5.4.0+');
+        }
+
+        $this->active = (bool) $flag;
+    }
+
+    /**
+     * Gets the session ID.
+     *
+     * @return string
+     */
+    public function getId()
+    {
+        return session_id();
+    }
+
+    /**
+     * Sets the session ID.
+     *
+     * @param string $id
+     *
+     * @throws \LogicException
+     */
+    public function setId($id)
+    {
+        if ($this->isActive()) {
+            throw new \LogicException('Cannot change the ID of an active session');
+        }
+
+        session_id($id);
+    }
+
+    /**
+     * Gets the session name.
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return session_name();
+    }
+
+    /**
+     * Sets the session name.
+     *
+     * @param string $name
+     *
+     * @throws \LogicException
+     */
+    public function setName($name)
+    {
+        if ($this->isActive()) {
+            throw new \LogicException('Cannot change the name of an active session');
+        }
+
+        session_name($name);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/Proxy/NativeProxy.php
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy;
+
+/**
+ * NativeProxy.
+ *
+ * This proxy is built-in session handlers in PHP 5.3.x
+ *
+ * @author Drak <drak@zikula.org>
+ */
+class NativeProxy extends AbstractProxy
+{
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        // this makes an educated guess as to what the handler is since it should already be set.
+        $this->saveHandlerName = ini_get('session.save_handler');
+    }
+
+    /**
+     * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler.
+     *
+     * @return bool False
+     */
+    public function isWrapper()
+    {
+        return false;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy;
+
+/**
+ * SessionHandler proxy.
+ *
+ * @author Drak <drak@zikula.org>
+ */
+class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterface
+{
+    /**
+     * @var \SessionHandlerInterface
+     */
+    protected $handler;
+
+    /**
+     * Constructor.
+     *
+     * @param \SessionHandlerInterface $handler
+     */
+    public function __construct(\SessionHandlerInterface $handler)
+    {
+        $this->handler = $handler;
+        $this->wrapper = ($handler instanceof \SessionHandler);
+        $this->saveHandlerName = $this->wrapper ? ini_get('session.save_handler') : 'user';
+    }
+
+    // \SessionHandlerInterface
+
+    /**
+     * {@inheritdoc}
+     */
+    public function open($savePath, $sessionName)
+    {
+        $return = (bool) $this->handler->open($savePath, $sessionName);
+
+        if (true === $return) {
+            $this->active = true;
+        }
+
+        return $return;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        $this->active = false;
+
+        return (bool) $this->handler->close();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($sessionId)
+    {
+        return (string) $this->handler->read($sessionId);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write($sessionId, $data)
+    {
+        return (bool) $this->handler->write($sessionId, $data);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function destroy($sessionId)
+    {
+        return (bool) $this->handler->destroy($sessionId);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function gc($maxlifetime)
+    {
+        return (bool) $this->handler->gc($maxlifetime);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php
@@ -0,0 +1,139 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage;
+
+use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
+
+/**
+ * StorageInterface.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Drak <drak@zikula.org>
+ */
+interface SessionStorageInterface
+{
+    /**
+     * Starts the session.
+     *
+     * @return bool True if started
+     *
+     * @throws \RuntimeException If something goes wrong starting the session.
+     */
+    public function start();
+
+    /**
+     * Checks if the session is started.
+     *
+     * @return bool True if started, false otherwise
+     */
+    public function isStarted();
+
+    /**
+     * Returns the session ID.
+     *
+     * @return string The session ID or empty
+     */
+    public function getId();
+
+    /**
+     * Sets the session ID.
+     *
+     * @param string $id
+     */
+    public function setId($id);
+
+    /**
+     * Returns the session name.
+     *
+     * @return mixed The session name
+     */
+    public function getName();
+
+    /**
+     * Sets the session name.
+     *
+     * @param string $name
+     */
+    public function setName($name);
+
+    /**
+     * Regenerates id that represents this storage.
+     *
+     * This method must invoke session_regenerate_id($destroy) unless
+     * this interface is used for a storage object designed for unit
+     * or functional testing where a real PHP session would interfere
+     * with testing.
+     *
+     * Note regenerate+destroy should not clear the session data in memory
+     * only delete the session data from persistent storage.
+     *
+     * Care: When regenerating the session ID no locking is involved in PHP's
+     * session design. See https://bugs.php.net/bug.php?id=61470 for a discussion.
+     * So you must make sure the regenerated session is saved BEFORE sending the
+     * headers with the new ID. Symfony's HttpKernel offers a listener for this.
+     * See Symfony\Component\HttpKernel\EventListener\SaveSessionListener.
+     * Otherwise session data could get lost again for concurrent requests with the
+     * new ID. One result could be that you get logged out after just logging in.
+     *
+     * @param bool $destroy  Destroy session when regenerating?
+     * @param int  $lifetime Sets the cookie lifetime for the session cookie. A null value
+     *                       will leave the system settings unchanged, 0 sets the cookie
+     *                       to expire with browser session. Time is in seconds, and is
+     *                       not a Unix timestamp.
+     *
+     * @return bool True if session regenerated, false if error
+     *
+     * @throws \RuntimeException If an error occurs while regenerating this storage
+     */
+    public function regenerate($destroy = false, $lifetime = null);
+
+    /**
+     * Force the session to be saved and closed.
+     *
+     * This method must invoke session_write_close() unless this interface is
+     * used for a storage object design for unit or functional testing where
+     * a real PHP session would interfere with testing, in which case
+     * it should actually persist the session data if required.
+     *
+     * @throws \RuntimeException If the session is saved without being started, or if the session
+     *                           is already closed.
+     */
+    public function save();
+
+    /**
+     * Clear all session data in memory.
+     */
+    public function clear();
+
+    /**
+     * Gets a SessionBagInterface by name.
+     *
+     * @param string $name
+     *
+     * @return SessionBagInterface
+     *
+     * @throws \InvalidArgumentException If the bag does not exist
+     */
+    public function getBag($name);
+
+    /**
+     * Registers a SessionBagInterface for use.
+     *
+     * @param SessionBagInterface $bag
+     */
+    public function registerBag(SessionBagInterface $bag);
+
+    /**
+     * @return MetadataBag
+     */
+    public function getMetadataBag();
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/StreamedResponse.php
@@ -0,0 +1,137 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation;
+
+/**
+ * StreamedResponse represents a streamed HTTP response.
+ *
+ * A StreamedResponse uses a callback for its content.
+ *
+ * The callback should use the standard PHP functions like echo
+ * to stream the response back to the client. The flush() method
+ * can also be used if needed.
+ *
+ * @see flush()
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class StreamedResponse extends Response
+{
+    protected $callback;
+    protected $streamed;
+    private $headersSent;
+
+    /**
+     * Constructor.
+     *
+     * @param callable|null $callback A valid PHP callback or null to set it later
+     * @param int           $status   The response status code
+     * @param array         $headers  An array of response headers
+     */
+    public function __construct($callback = null, $status = 200, $headers = array())
+    {
+        parent::__construct(null, $status, $headers);
+
+        if (null !== $callback) {
+            $this->setCallback($callback);
+        }
+        $this->streamed = false;
+        $this->headersSent = false;
+    }
+
+    /**
+     * Factory method for chainability.
+     *
+     * @param callable|null $callback A valid PHP callback or null to set it later
+     * @param int           $status   The response status code
+     * @param array         $headers  An array of response headers
+     *
+     * @return StreamedResponse
+     */
+    public static function create($callback = null, $status = 200, $headers = array())
+    {
+        return new static($callback, $status, $headers);
+    }
+
+    /**
+     * Sets the PHP callback associated with this Response.
+     *
+     * @param callable $callback A valid PHP callback
+     *
+     * @throws \LogicException
+     */
+    public function setCallback($callback)
+    {
+        if (!is_callable($callback)) {
+            throw new \LogicException('The Response callback must be a valid PHP callable.');
+        }
+        $this->callback = $callback;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * This method only sends the headers once.
+     */
+    public function sendHeaders()
+    {
+        if ($this->headersSent) {
+            return;
+        }
+
+        $this->headersSent = true;
+
+        parent::sendHeaders();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * This method only sends the content once.
+     */
+    public function sendContent()
+    {
+        if ($this->streamed) {
+            return;
+        }
+
+        $this->streamed = true;
+
+        if (null === $this->callback) {
+            throw new \LogicException('The Response callback must not be null.');
+        }
+
+        call_user_func($this->callback);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @throws \LogicException when the content is not null
+     */
+    public function setContent($content)
+    {
+        if (null !== $content) {
+            throw new \LogicException('The content cannot be set on a StreamedResponse instance.');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return false
+     */
+    public function getContent()
+    {
+        return false;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-foundation/composer.json
@@ -0,0 +1,39 @@
+{
+    "name": "symfony/http-foundation",
+    "type": "library",
+    "description": "Symfony HttpFoundation Component",
+    "keywords": [],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.9",
+        "symfony/polyfill-php54": "~1.0",
+        "symfony/polyfill-php55": "~1.0",
+        "symfony/polyfill-mbstring": "~1.1"
+    },
+    "require-dev": {
+        "symfony/expression-language": "~2.4|~3.0.0"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Component\\HttpFoundation\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.8-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Bundle/Bundle.php
@@ -0,0 +1,233 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Bundle;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Container;
+use Symfony\Component\Console\Application;
+use Symfony\Component\Finder\Finder;
+use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
+
+/**
+ * An implementation of BundleInterface that adds a few conventions
+ * for DependencyInjection extensions and Console commands.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class Bundle implements BundleInterface
+{
+    /**
+     * @var ContainerInterface
+     */
+    protected $container;
+    protected $name;
+    protected $extension;
+    protected $path;
+
+    /**
+     * Boots the Bundle.
+     */
+    public function boot()
+    {
+    }
+
+    /**
+     * Shutdowns the Bundle.
+     */
+    public function shutdown()
+    {
+    }
+
+    /**
+     * Builds the bundle.
+     *
+     * It is only ever called once when the cache is empty.
+     *
+     * This method can be overridden to register compilation passes,
+     * other extensions, ...
+     *
+     * @param ContainerBuilder $container A ContainerBuilder instance
+     */
+    public function build(ContainerBuilder $container)
+    {
+    }
+
+    /**
+     * Sets the container.
+     *
+     * @param ContainerInterface|null $container A ContainerInterface instance or null
+     */
+    public function setContainer(ContainerInterface $container = null)
+    {
+        $this->container = $container;
+    }
+
+    /**
+     * Returns the bundle's container extension.
+     *
+     * @return ExtensionInterface|null The container extension
+     *
+     * @throws \LogicException
+     */
+    public function getContainerExtension()
+    {
+        if (null === $this->extension) {
+            $extension = $this->createContainerExtension();
+
+            if (null !== $extension) {
+                if (!$extension instanceof ExtensionInterface) {
+                    throw new \LogicException(sprintf('Extension %s must implement Symfony\Component\DependencyInjection\Extension\ExtensionInterface.', get_class($extension)));
+                }
+
+                // check naming convention
+                $basename = preg_replace('/Bundle$/', '', $this->getName());
+                $expectedAlias = Container::underscore($basename);
+
+                if ($expectedAlias != $extension->getAlias()) {
+                    throw new \LogicException(sprintf(
+                        'Users will expect the alias of the default extension of a bundle to be the underscored version of the bundle name ("%s"). You can override "Bundle::getContainerExtension()" if you want to use "%s" or another alias.',
+                        $expectedAlias, $extension->getAlias()
+                    ));
+                }
+
+                $this->extension = $extension;
+            } else {
+                $this->extension = false;
+            }
+        }
+
+        if ($this->extension) {
+            return $this->extension;
+        }
+    }
+
+    /**
+     * Gets the Bundle namespace.
+     *
+     * @return string The Bundle namespace
+     */
+    public function getNamespace()
+    {
+        $class = get_class($this);
+
+        return substr($class, 0, strrpos($class, '\\'));
+    }
+
+    /**
+     * Gets the Bundle directory path.
+     *
+     * @return string The Bundle absolute path
+     */
+    public function getPath()
+    {
+        if (null === $this->path) {
+            $reflected = new \ReflectionObject($this);
+            $this->path = dirname($reflected->getFileName());
+        }
+
+        return $this->path;
+    }
+
+    /**
+     * Returns the bundle parent name.
+     *
+     * @return string The Bundle parent name it overrides or null if no parent
+     */
+    public function getParent()
+    {
+    }
+
+    /**
+     * Returns the bundle name (the class short name).
+     *
+     * @return string The Bundle name
+     */
+    final public function getName()
+    {
+        if (null !== $this->name) {
+            return $this->name;
+        }
+
+        $name = get_class($this);
+        $pos = strrpos($name, '\\');
+
+        return $this->name = false === $pos ? $name : substr($name, $pos + 1);
+    }
+
+    /**
+     * Finds and registers Commands.
+     *
+     * Override this method if your bundle commands do not follow the conventions:
+     *
+     * * Commands are in the 'Command' sub-directory
+     * * Commands extend Symfony\Component\Console\Command\Command
+     *
+     * @param Application $application An Application instance
+     */
+    public function registerCommands(Application $application)
+    {
+        if (!is_dir($dir = $this->getPath().'/Command')) {
+            return;
+        }
+
+        if (!class_exists('Symfony\Component\Finder\Finder')) {
+            throw new \RuntimeException('You need the symfony/finder component to register bundle commands.');
+        }
+
+        $finder = new Finder();
+        $finder->files()->name('*Command.php')->in($dir);
+
+        $prefix = $this->getNamespace().'\\Command';
+        foreach ($finder as $file) {
+            $ns = $prefix;
+            if ($relativePath = $file->getRelativePath()) {
+                $ns .= '\\'.str_replace('/', '\\', $relativePath);
+            }
+            $class = $ns.'\\'.$file->getBasename('.php');
+            if ($this->container) {
+                $alias = 'console.command.'.strtolower(str_replace('\\', '_', $class));
+                if ($this->container->has($alias)) {
+                    continue;
+                }
+            }
+            $r = new \ReflectionClass($class);
+            if ($r->isSubclassOf('Symfony\\Component\\Console\\Command\\Command') && !$r->isAbstract() && !$r->getConstructor()->getNumberOfRequiredParameters()) {
+                $application->add($r->newInstance());
+            }
+        }
+    }
+
+    /**
+     * Returns the bundle's container extension class.
+     *
+     * @return string
+     */
+    protected function getContainerExtensionClass()
+    {
+        $basename = preg_replace('/Bundle$/', '', $this->getName());
+
+        return $this->getNamespace().'\\DependencyInjection\\'.$basename.'Extension';
+    }
+
+    /**
+     * Creates the bundle's container extension.
+     *
+     * @return ExtensionInterface|null
+     */
+    protected function createContainerExtension()
+    {
+        if (class_exists($class = $this->getContainerExtensionClass())) {
+            return new $class();
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Bundle/BundleInterface.php
@@ -0,0 +1,84 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Bundle;
+
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
+
+/**
+ * BundleInterface.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface BundleInterface extends ContainerAwareInterface
+{
+    /**
+     * Boots the Bundle.
+     */
+    public function boot();
+
+    /**
+     * Shutdowns the Bundle.
+     */
+    public function shutdown();
+
+    /**
+     * Builds the bundle.
+     *
+     * It is only ever called once when the cache is empty.
+     *
+     * @param ContainerBuilder $container A ContainerBuilder instance
+     */
+    public function build(ContainerBuilder $container);
+
+    /**
+     * Returns the container extension that should be implicitly loaded.
+     *
+     * @return ExtensionInterface|null The default extension or null if there is none
+     */
+    public function getContainerExtension();
+
+    /**
+     * Returns the bundle name that this bundle overrides.
+     *
+     * Despite its name, this method does not imply any parent/child relationship
+     * between the bundles, just a way to extend and override an existing
+     * bundle.
+     *
+     * @return string The Bundle name it overrides or null if no parent
+     */
+    public function getParent();
+
+    /**
+     * Returns the bundle name (the class short name).
+     *
+     * @return string The Bundle name
+     */
+    public function getName();
+
+    /**
+     * Gets the Bundle namespace.
+     *
+     * @return string The Bundle namespace
+     */
+    public function getNamespace();
+
+    /**
+     * Gets the Bundle directory path.
+     *
+     * The path should always be returned as a Unix path (with /).
+     *
+     * @return string The Bundle absolute path
+     */
+    public function getPath();
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/CacheClearer/CacheClearerInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\CacheClearer;
+
+/**
+ * CacheClearerInterface.
+ *
+ * @author Dustin Dobervich <ddobervich@gmail.com>
+ */
+interface CacheClearerInterface
+{
+    /**
+     * Clears any caches necessary.
+     *
+     * @param string $cacheDir The cache directory
+     */
+    public function clear($cacheDir);
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/CacheClearer/ChainCacheClearer.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\CacheClearer;
+
+/**
+ * ChainCacheClearer.
+ *
+ * @author Dustin Dobervich <ddobervich@gmail.com>
+ */
+class ChainCacheClearer implements CacheClearerInterface
+{
+    /**
+     * @var array
+     */
+    protected $clearers;
+
+    /**
+     * Constructs a new instance of ChainCacheClearer.
+     *
+     * @param array $clearers The initial clearers
+     */
+    public function __construct(array $clearers = array())
+    {
+        $this->clearers = $clearers;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear($cacheDir)
+    {
+        foreach ($this->clearers as $clearer) {
+            $clearer->clear($cacheDir);
+        }
+    }
+
+    /**
+     * Adds a cache clearer to the aggregate.
+     *
+     * @param CacheClearerInterface $clearer
+     */
+    public function add(CacheClearerInterface $clearer)
+    {
+        $this->clearers[] = $clearer;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/CacheWarmer/CacheWarmer.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\CacheWarmer;
+
+/**
+ * Abstract cache warmer that knows how to write a file to the cache.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class CacheWarmer implements CacheWarmerInterface
+{
+    protected function writeCacheFile($file, $content)
+    {
+        $tmpFile = @tempnam(dirname($file), basename($file));
+        if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $file)) {
+            @chmod($file, 0666 & ~umask());
+
+            return;
+        }
+
+        throw new \RuntimeException(sprintf('Failed to write cache file "%s".', $file));
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php
@@ -0,0 +1,74 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\CacheWarmer;
+
+/**
+ * Aggregates several cache warmers into a single one.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class CacheWarmerAggregate implements CacheWarmerInterface
+{
+    protected $warmers = array();
+    protected $optionalsEnabled = false;
+
+    public function __construct(array $warmers = array())
+    {
+        foreach ($warmers as $warmer) {
+            $this->add($warmer);
+        }
+    }
+
+    public function enableOptionalWarmers()
+    {
+        $this->optionalsEnabled = true;
+    }
+
+    /**
+     * Warms up the cache.
+     *
+     * @param string $cacheDir The cache directory
+     */
+    public function warmUp($cacheDir)
+    {
+        foreach ($this->warmers as $warmer) {
+            if (!$this->optionalsEnabled && $warmer->isOptional()) {
+                continue;
+            }
+
+            $warmer->warmUp($cacheDir);
+        }
+    }
+
+    /**
+     * Checks whether this warmer is optional or not.
+     *
+     * @return bool always false
+     */
+    public function isOptional()
+    {
+        return false;
+    }
+
+    public function setWarmers(array $warmers)
+    {
+        $this->warmers = array();
+        foreach ($warmers as $warmer) {
+            $this->add($warmer);
+        }
+    }
+
+    public function add(CacheWarmerInterface $warmer)
+    {
+        $this->warmers[] = $warmer;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\CacheWarmer;
+
+/**
+ * Interface for classes able to warm up the cache.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface CacheWarmerInterface extends WarmableInterface
+{
+    /**
+     * Checks whether this warmer is optional or not.
+     *
+     * Optional warmers can be ignored on certain conditions.
+     *
+     * A warmer should return true if the cache can be
+     * generated incrementally and on-demand.
+     *
+     * @return bool true if the warmer is optional, false otherwise
+     */
+    public function isOptional();
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/CacheWarmer/WarmableInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\CacheWarmer;
+
+/**
+ * Interface for classes that support warming their cache.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface WarmableInterface
+{
+    /**
+     * Warms up the cache.
+     *
+     * @param string $cacheDir The cache directory
+     */
+    public function warmUp($cacheDir);
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Client.php
@@ -0,0 +1,226 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel;
+
+use Symfony\Component\BrowserKit\Client as BaseClient;
+use Symfony\Component\BrowserKit\Request as DomRequest;
+use Symfony\Component\BrowserKit\Response as DomResponse;
+use Symfony\Component\BrowserKit\Cookie as DomCookie;
+use Symfony\Component\BrowserKit\History;
+use Symfony\Component\BrowserKit\CookieJar;
+use Symfony\Component\HttpFoundation\File\UploadedFile;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * Client simulates a browser and makes requests to a Kernel object.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Client extends BaseClient
+{
+    protected $kernel;
+
+    /**
+     * Constructor.
+     *
+     * @param HttpKernelInterface $kernel    An HttpKernel instance
+     * @param array               $server    The server parameters (equivalent of $_SERVER)
+     * @param History             $history   A History instance to store the browser history
+     * @param CookieJar           $cookieJar A CookieJar instance to store the cookies
+     */
+    public function __construct(HttpKernelInterface $kernel, array $server = array(), History $history = null, CookieJar $cookieJar = null)
+    {
+        // These class properties must be set before calling the parent constructor, as it may depend on it.
+        $this->kernel = $kernel;
+        $this->followRedirects = false;
+
+        parent::__construct($server, $history, $cookieJar);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return Request|null A Request instance
+     */
+    public function getRequest()
+    {
+        return parent::getRequest();
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return Response|null A Response instance
+     */
+    public function getResponse()
+    {
+        return parent::getResponse();
+    }
+
+    /**
+     * Makes a request.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return Response A Response instance
+     */
+    protected function doRequest($request)
+    {
+        $response = $this->kernel->handle($request);
+
+        if ($this->kernel instanceof TerminableInterface) {
+            $this->kernel->terminate($request, $response);
+        }
+
+        return $response;
+    }
+
+    /**
+     * Returns the script to execute when the request must be insulated.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return string
+     */
+    protected function getScript($request)
+    {
+        $kernel = str_replace("'", "\\'", serialize($this->kernel));
+        $request = str_replace("'", "\\'", serialize($request));
+
+        $r = new \ReflectionClass('\\Symfony\\Component\\ClassLoader\\ClassLoader');
+        $requirePath = str_replace("'", "\\'", $r->getFileName());
+        $symfonyPath = str_replace("'", "\\'", dirname(dirname(dirname(__DIR__))));
+        $errorReporting = error_reporting();
+
+        $code = <<<EOF
+<?php
+
+error_reporting($errorReporting);
+
+require_once '$requirePath';
+
+\$loader = new Symfony\Component\ClassLoader\ClassLoader();
+\$loader->addPrefix('Symfony', '$symfonyPath');
+\$loader->register();
+
+\$kernel = unserialize('$kernel');
+\$request = unserialize('$request');
+EOF;
+
+        return $code.$this->getHandleScript();
+    }
+
+    protected function getHandleScript()
+    {
+        return <<<'EOF'
+$response = $kernel->handle($request);
+
+if ($kernel instanceof Symfony\Component\HttpKernel\TerminableInterface) {
+    $kernel->terminate($request, $response);
+}
+
+echo serialize($response);
+EOF;
+    }
+
+    /**
+     * Converts the BrowserKit request to a HttpKernel request.
+     *
+     * @param DomRequest $request A DomRequest instance
+     *
+     * @return Request A Request instance
+     */
+    protected function filterRequest(DomRequest $request)
+    {
+        $httpRequest = Request::create($request->getUri(), $request->getMethod(), $request->getParameters(), $request->getCookies(), $request->getFiles(), $request->getServer(), $request->getContent());
+
+        foreach ($this->filterFiles($httpRequest->files->all()) as $key => $value) {
+            $httpRequest->files->set($key, $value);
+        }
+
+        return $httpRequest;
+    }
+
+    /**
+     * Filters an array of files.
+     *
+     * This method created test instances of UploadedFile so that the move()
+     * method can be called on those instances.
+     *
+     * If the size of a file is greater than the allowed size (from php.ini) then
+     * an invalid UploadedFile is returned with an error set to UPLOAD_ERR_INI_SIZE.
+     *
+     * @see UploadedFile
+     *
+     * @param array $files An array of files
+     *
+     * @return array An array with all uploaded files marked as already moved
+     */
+    protected function filterFiles(array $files)
+    {
+        $filtered = array();
+        foreach ($files as $key => $value) {
+            if (is_array($value)) {
+                $filtered[$key] = $this->filterFiles($value);
+            } elseif ($value instanceof UploadedFile) {
+                if ($value->isValid() && $value->getSize() > UploadedFile::getMaxFilesize()) {
+                    $filtered[$key] = new UploadedFile(
+                        '',
+                        $value->getClientOriginalName(),
+                        $value->getClientMimeType(),
+                        0,
+                        UPLOAD_ERR_INI_SIZE,
+                        true
+                    );
+                } else {
+                    $filtered[$key] = new UploadedFile(
+                        $value->getPathname(),
+                        $value->getClientOriginalName(),
+                        $value->getClientMimeType(),
+                        $value->getClientSize(),
+                        $value->getError(),
+                        true
+                    );
+                }
+            }
+        }
+
+        return $filtered;
+    }
+
+    /**
+     * Converts the HttpKernel response to a BrowserKit response.
+     *
+     * @param Response $response A Response instance
+     *
+     * @return DomResponse A DomResponse instance
+     */
+    protected function filterResponse($response)
+    {
+        $headers = $response->headers->all();
+        if ($response->headers->getCookies()) {
+            $cookies = array();
+            foreach ($response->headers->getCookies() as $cookie) {
+                $cookies[] = new DomCookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
+            }
+            $headers['Set-Cookie'] = $cookies;
+        }
+
+        // this is needed to support StreamedResponse
+        ob_start();
+        $response->sendContent();
+        $content = ob_get_clean();
+
+        return new DomResponse($content, $response->getStatusCode(), $headers);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Config/EnvParametersResource.php
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Config;
+
+use Symfony\Component\Config\Resource\SelfCheckingResourceInterface;
+
+/**
+ * EnvParametersResource represents resources stored in prefixed environment variables.
+ *
+ * @author Chris Wilkinson <chriswilkinson84@gmail.com>
+ */
+class EnvParametersResource implements SelfCheckingResourceInterface, \Serializable
+{
+    /**
+     * @var string
+     */
+    private $prefix;
+
+    /**
+     * @var string
+     */
+    private $variables;
+
+    /**
+     * Constructor.
+     *
+     * @param string $prefix
+     */
+    public function __construct($prefix)
+    {
+        $this->prefix = $prefix;
+        $this->variables = $this->findVariables();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __toString()
+    {
+        return serialize($this->getResource());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getResource()
+    {
+        return array('prefix' => $this->prefix, 'variables' => $this->variables);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isFresh($timestamp)
+    {
+        return $this->findVariables() === $this->variables;
+    }
+
+    public function serialize()
+    {
+        return serialize(array('prefix' => $this->prefix, 'variables' => $this->variables));
+    }
+
+    public function unserialize($serialized)
+    {
+        $unserialized = unserialize($serialized);
+
+        $this->prefix = $unserialized['prefix'];
+        $this->variables = $unserialized['variables'];
+    }
+
+    private function findVariables()
+    {
+        $variables = array();
+
+        foreach ($_SERVER as $key => $value) {
+            if (0 === strpos($key, $this->prefix)) {
+                $variables[$key] = $value;
+            }
+        }
+
+        ksort($variables);
+
+        return $variables;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Config/FileLocator.php
@@ -0,0 +1,56 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Config;
+
+use Symfony\Component\Config\FileLocator as BaseFileLocator;
+use Symfony\Component\HttpKernel\KernelInterface;
+
+/**
+ * FileLocator uses the KernelInterface to locate resources in bundles.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class FileLocator extends BaseFileLocator
+{
+    private $kernel;
+    private $path;
+
+    /**
+     * Constructor.
+     *
+     * @param KernelInterface $kernel A KernelInterface instance
+     * @param null|string     $path   The path the global resource directory
+     * @param array           $paths  An array of paths where to look for resources
+     */
+    public function __construct(KernelInterface $kernel, $path = null, array $paths = array())
+    {
+        $this->kernel = $kernel;
+        if (null !== $path) {
+            $this->path = $path;
+            $paths[] = $path;
+        }
+
+        parent::__construct($paths);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function locate($file, $currentPath = null, $first = true)
+    {
+        if (isset($file[0]) && '@' === $file[0]) {
+            return $this->kernel->locateResource($file, $this->path, $first);
+        }
+
+        return parent::locate($file, $currentPath, $first);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Controller/ControllerReference.php
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Controller;
+
+use Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface;
+
+/**
+ * Acts as a marker and a data holder for a Controller.
+ *
+ * Some methods in Symfony accept both a URI (as a string) or a controller as
+ * an argument. In the latter case, instead of passing an array representing
+ * the controller, you can use an instance of this class.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @see FragmentRendererInterface
+ */
+class ControllerReference
+{
+    public $controller;
+    public $attributes = array();
+    public $query = array();
+
+    /**
+     * Constructor.
+     *
+     * @param string $controller The controller name
+     * @param array  $attributes An array of parameters to add to the Request attributes
+     * @param array  $query      An array of parameters to add to the Request query string
+     */
+    public function __construct($controller, array $attributes = array(), array $query = array())
+    {
+        $this->controller = $controller;
+        $this->attributes = $attributes;
+        $this->query = $query;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Controller/ControllerResolver.php
@@ -0,0 +1,188 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Controller;
+
+use Psr\Log\LoggerInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * ControllerResolver.
+ *
+ * This implementation uses the '_controller' request attribute to determine
+ * the controller to execute and uses the request attributes to determine
+ * the controller method arguments.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ControllerResolver implements ControllerResolverInterface
+{
+    private $logger;
+
+    /**
+     * If the ...$arg functionality is available.
+     *
+     * Requires at least PHP 5.6.0 or HHVM 3.9.1
+     *
+     * @var bool
+     */
+    private $supportsVariadic;
+
+    /**
+     * Constructor.
+     *
+     * @param LoggerInterface $logger A LoggerInterface instance
+     */
+    public function __construct(LoggerInterface $logger = null)
+    {
+        $this->logger = $logger;
+
+        $this->supportsVariadic = method_exists('ReflectionParameter', 'isVariadic');
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * This method looks for a '_controller' request attribute that represents
+     * the controller name (a string like ClassName::MethodName).
+     */
+    public function getController(Request $request)
+    {
+        if (!$controller = $request->attributes->get('_controller')) {
+            if (null !== $this->logger) {
+                $this->logger->warning('Unable to look for the controller as the "_controller" parameter is missing.');
+            }
+
+            return false;
+        }
+
+        if (is_array($controller)) {
+            return $controller;
+        }
+
+        if (is_object($controller)) {
+            if (method_exists($controller, '__invoke')) {
+                return $controller;
+            }
+
+            throw new \InvalidArgumentException(sprintf('Controller "%s" for URI "%s" is not callable.', get_class($controller), $request->getPathInfo()));
+        }
+
+        if (false === strpos($controller, ':')) {
+            if (method_exists($controller, '__invoke')) {
+                return $this->instantiateController($controller);
+            } elseif (function_exists($controller)) {
+                return $controller;
+            }
+        }
+
+        $callable = $this->createController($controller);
+
+        if (!is_callable($callable)) {
+            throw new \InvalidArgumentException(sprintf('Controller "%s" for URI "%s" is not callable.', $controller, $request->getPathInfo()));
+        }
+
+        return $callable;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getArguments(Request $request, $controller)
+    {
+        if (is_array($controller)) {
+            $r = new \ReflectionMethod($controller[0], $controller[1]);
+        } elseif (is_object($controller) && !$controller instanceof \Closure) {
+            $r = new \ReflectionObject($controller);
+            $r = $r->getMethod('__invoke');
+        } else {
+            $r = new \ReflectionFunction($controller);
+        }
+
+        return $this->doGetArguments($request, $controller, $r->getParameters());
+    }
+
+    /**
+     * @param Request                $request
+     * @param callable               $controller
+     * @param \ReflectionParameter[] $parameters
+     *
+     * @return array The arguments to use when calling the action
+     */
+    protected function doGetArguments(Request $request, $controller, array $parameters)
+    {
+        $attributes = $request->attributes->all();
+        $arguments = array();
+        foreach ($parameters as $param) {
+            if (array_key_exists($param->name, $attributes)) {
+                if ($this->supportsVariadic && $param->isVariadic() && is_array($attributes[$param->name])) {
+                    $arguments = array_merge($arguments, array_values($attributes[$param->name]));
+                } else {
+                    $arguments[] = $attributes[$param->name];
+                }
+            } elseif ($param->getClass() && $param->getClass()->isInstance($request)) {
+                $arguments[] = $request;
+            } elseif ($param->isDefaultValueAvailable()) {
+                $arguments[] = $param->getDefaultValue();
+            } elseif ($param->allowsNull()) {
+                $arguments[] = null;
+            } else {
+                if (is_array($controller)) {
+                    $repr = sprintf('%s::%s()', get_class($controller[0]), $controller[1]);
+                } elseif (is_object($controller)) {
+                    $repr = get_class($controller);
+                } else {
+                    $repr = $controller;
+                }
+
+                throw new \RuntimeException(sprintf('Controller "%s" requires that you provide a value for the "$%s" argument (because there is no default value or because there is a non optional argument after this one).', $repr, $param->name));
+            }
+        }
+
+        return $arguments;
+    }
+
+    /**
+     * Returns a callable for the given controller.
+     *
+     * @param string $controller A Controller string
+     *
+     * @return callable A PHP callable
+     *
+     * @throws \InvalidArgumentException
+     */
+    protected function createController($controller)
+    {
+        if (false === strpos($controller, '::')) {
+            throw new \InvalidArgumentException(sprintf('Unable to find controller "%s".', $controller));
+        }
+
+        list($class, $method) = explode('::', $controller, 2);
+
+        if (!class_exists($class)) {
+            throw new \InvalidArgumentException(sprintf('Class "%s" does not exist.', $class));
+        }
+
+        return array($this->instantiateController($class), $method);
+    }
+
+    /**
+     * Returns an instantiated controller.
+     *
+     * @param string $class A class name
+     *
+     * @return object
+     */
+    protected function instantiateController($class)
+    {
+        return new $class();
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Controller/ControllerResolverInterface.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Controller;
+
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * A ControllerResolverInterface implementation knows how to determine the
+ * controller to execute based on a Request object.
+ *
+ * It can also determine the arguments to pass to the Controller.
+ *
+ * A Controller can be any valid PHP callable.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface ControllerResolverInterface
+{
+    /**
+     * Returns the Controller instance associated with a Request.
+     *
+     * As several resolvers can exist for a single application, a resolver must
+     * return false when it is not able to determine the controller.
+     *
+     * The resolver must only throw an exception when it should be able to load
+     * controller but cannot because of some errors made by the developer.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return callable|false A PHP callable representing the Controller,
+     *                        or false if this resolver is not able to determine the controller
+     *
+     * @throws \LogicException If the controller can't be found
+     */
+    public function getController(Request $request);
+
+    /**
+     * Returns the arguments to pass to the controller.
+     *
+     * @param Request  $request    A Request instance
+     * @param callable $controller A PHP callable
+     *
+     * @return array An array of arguments to pass to the controller
+     *
+     * @throws \RuntimeException When value for argument given is not provided
+     */
+    public function getArguments(Request $request, $controller);
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Controller/TraceableControllerResolver.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Controller;
+
+use Symfony\Component\Stopwatch\Stopwatch;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * TraceableControllerResolver.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TraceableControllerResolver implements ControllerResolverInterface
+{
+    private $resolver;
+    private $stopwatch;
+
+    /**
+     * Constructor.
+     *
+     * @param ControllerResolverInterface $resolver  A ControllerResolverInterface instance
+     * @param Stopwatch                   $stopwatch A Stopwatch instance
+     */
+    public function __construct(ControllerResolverInterface $resolver, Stopwatch $stopwatch)
+    {
+        $this->resolver = $resolver;
+        $this->stopwatch = $stopwatch;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getController(Request $request)
+    {
+        $e = $this->stopwatch->start('controller.get_callable');
+
+        $ret = $this->resolver->getController($request);
+
+        $e->stop();
+
+        return $ret;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getArguments(Request $request, $controller)
+    {
+        $e = $this->stopwatch->start('controller.get_arguments');
+
+        $ret = $this->resolver->getArguments($request, $controller);
+
+        $e->stop();
+
+        return $ret;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DataCollector/AjaxDataCollector.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DataCollector;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * AjaxDataCollector.
+ *
+ * @author Bart van den Burg <bart@burgov.nl>
+ */
+class AjaxDataCollector extends DataCollector
+{
+    public function collect(Request $request, Response $response, \Exception $exception = null)
+    {
+        // all collecting is done client side
+    }
+
+    public function getName()
+    {
+        return 'ajax';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DataCollector/ConfigDataCollector.php
@@ -0,0 +1,291 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DataCollector;
+
+use Symfony\Component\HttpKernel\KernelInterface;
+use Symfony\Component\HttpKernel\Kernel;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * ConfigDataCollector.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ConfigDataCollector extends DataCollector
+{
+    /**
+     * @var KernelInterface
+     */
+    private $kernel;
+    private $name;
+    private $version;
+    private $cacheVersionInfo = true;
+
+    /**
+     * Constructor.
+     *
+     * @param string $name    The name of the application using the web profiler
+     * @param string $version The version of the application using the web profiler
+     */
+    public function __construct($name = null, $version = null)
+    {
+        $this->name = $name;
+        $this->version = $version;
+    }
+
+    /**
+     * Sets the Kernel associated with this Request.
+     *
+     * @param KernelInterface $kernel A KernelInterface instance
+     */
+    public function setKernel(KernelInterface $kernel = null)
+    {
+        $this->kernel = $kernel;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function collect(Request $request, Response $response, \Exception $exception = null)
+    {
+        $this->data = array(
+            'app_name' => $this->name,
+            'app_version' => $this->version,
+            'token' => $response->headers->get('X-Debug-Token'),
+            'symfony_version' => Kernel::VERSION,
+            'symfony_state' => 'unknown',
+            'name' => isset($this->kernel) ? $this->kernel->getName() : 'n/a',
+            'env' => isset($this->kernel) ? $this->kernel->getEnvironment() : 'n/a',
+            'debug' => isset($this->kernel) ? $this->kernel->isDebug() : 'n/a',
+            'php_version' => PHP_VERSION,
+            'xdebug_enabled' => extension_loaded('xdebug'),
+            'eaccel_enabled' => extension_loaded('eaccelerator') && ini_get('eaccelerator.enable'),
+            'apc_enabled' => extension_loaded('apc') && ini_get('apc.enabled'),
+            'xcache_enabled' => extension_loaded('xcache') && ini_get('xcache.cacher'),
+            'wincache_enabled' => extension_loaded('wincache') && ini_get('wincache.ocenabled'),
+            'zend_opcache_enabled' => extension_loaded('Zend OPcache') && ini_get('opcache.enable'),
+            'bundles' => array(),
+            'sapi_name' => PHP_SAPI,
+        );
+
+        if (isset($this->kernel)) {
+            foreach ($this->kernel->getBundles() as $name => $bundle) {
+                $this->data['bundles'][$name] = $bundle->getPath();
+            }
+
+            $this->data['symfony_state'] = $this->determineSymfonyState();
+        }
+    }
+
+    public function getApplicationName()
+    {
+        return $this->data['app_name'];
+    }
+
+    public function getApplicationVersion()
+    {
+        return $this->data['app_version'];
+    }
+
+    /**
+     * Gets the token.
+     *
+     * @return string The token
+     */
+    public function getToken()
+    {
+        return $this->data['token'];
+    }
+
+    /**
+     * Gets the Symfony version.
+     *
+     * @return string The Symfony version
+     */
+    public function getSymfonyVersion()
+    {
+        return $this->data['symfony_version'];
+    }
+
+    /**
+     * Returns the state of the current Symfony release.
+     *
+     * @return string One of: unknown, dev, stable, eom, eol
+     */
+    public function getSymfonyState()
+    {
+        return $this->data['symfony_state'];
+    }
+
+    public function setCacheVersionInfo($cacheVersionInfo)
+    {
+        $this->cacheVersionInfo = $cacheVersionInfo;
+    }
+
+    /**
+     * Gets the PHP version.
+     *
+     * @return string The PHP version
+     */
+    public function getPhpVersion()
+    {
+        return $this->data['php_version'];
+    }
+
+    /**
+     * Gets the application name.
+     *
+     * @return string The application name
+     */
+    public function getAppName()
+    {
+        return $this->data['name'];
+    }
+
+    /**
+     * Gets the environment.
+     *
+     * @return string The environment
+     */
+    public function getEnv()
+    {
+        return $this->data['env'];
+    }
+
+    /**
+     * Returns true if the debug is enabled.
+     *
+     * @return bool true if debug is enabled, false otherwise
+     */
+    public function isDebug()
+    {
+        return $this->data['debug'];
+    }
+
+    /**
+     * Returns true if the XDebug is enabled.
+     *
+     * @return bool true if XDebug is enabled, false otherwise
+     */
+    public function hasXDebug()
+    {
+        return $this->data['xdebug_enabled'];
+    }
+
+    /**
+     * Returns true if EAccelerator is enabled.
+     *
+     * @return bool true if EAccelerator is enabled, false otherwise
+     */
+    public function hasEAccelerator()
+    {
+        return $this->data['eaccel_enabled'];
+    }
+
+    /**
+     * Returns true if APC is enabled.
+     *
+     * @return bool true if APC is enabled, false otherwise
+     */
+    public function hasApc()
+    {
+        return $this->data['apc_enabled'];
+    }
+
+    /**
+     * Returns true if Zend OPcache is enabled.
+     *
+     * @return bool true if Zend OPcache is enabled, false otherwise
+     */
+    public function hasZendOpcache()
+    {
+        return $this->data['zend_opcache_enabled'];
+    }
+
+    /**
+     * Returns true if XCache is enabled.
+     *
+     * @return bool true if XCache is enabled, false otherwise
+     */
+    public function hasXCache()
+    {
+        return $this->data['xcache_enabled'];
+    }
+
+    /**
+     * Returns true if WinCache is enabled.
+     *
+     * @return bool true if WinCache is enabled, false otherwise
+     */
+    public function hasWinCache()
+    {
+        return $this->data['wincache_enabled'];
+    }
+
+    /**
+     * Returns true if any accelerator is enabled.
+     *
+     * @return bool true if any accelerator is enabled, false otherwise
+     */
+    public function hasAccelerator()
+    {
+        return $this->hasApc() || $this->hasZendOpcache() || $this->hasEAccelerator() || $this->hasXCache() || $this->hasWinCache();
+    }
+
+    public function getBundles()
+    {
+        return $this->data['bundles'];
+    }
+
+    /**
+     * Gets the PHP SAPI name.
+     *
+     * @return string The environment
+     */
+    public function getSapiName()
+    {
+        return $this->data['sapi_name'];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'config';
+    }
+
+    /**
+     * Tries to retrieve information about the current Symfony version.
+     *
+     * @return string One of: dev, stable, eom, eol
+     */
+    private function determineSymfonyState()
+    {
+        $now = new \DateTime();
+        $eom = \DateTime::createFromFormat('m/Y', Kernel::END_OF_MAINTENANCE)->modify('last day of this month');
+        $eol = \DateTime::createFromFormat('m/Y', Kernel::END_OF_LIFE)->modify('last day of this month');
+
+        if ($now > $eol) {
+            $versionState = 'eol';
+        } elseif ($now > $eom) {
+            $versionState = 'eom';
+        } elseif ('' !== Kernel::EXTRA_VERSION) {
+            $versionState = 'dev';
+        } else {
+            $versionState = 'stable';
+        }
+
+        return $versionState;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DataCollector/DataCollector.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DataCollector;
+
+use Symfony\Component\HttpKernel\DataCollector\Util\ValueExporter;
+
+/**
+ * DataCollector.
+ *
+ * Children of this class must store the collected data in the data property.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Bernhard Schussek <bschussek@symfony.com>
+ */
+abstract class DataCollector implements DataCollectorInterface, \Serializable
+{
+    protected $data = array();
+
+    /**
+     * @var ValueExporter
+     */
+    private $valueExporter;
+
+    public function serialize()
+    {
+        return serialize($this->data);
+    }
+
+    public function unserialize($data)
+    {
+        $this->data = unserialize($data);
+    }
+
+    /**
+     * Converts a PHP variable to a string.
+     *
+     * @param mixed $var A PHP variable
+     *
+     * @return string The string representation of the variable
+     */
+    protected function varToString($var)
+    {
+        if (null === $this->valueExporter) {
+            $this->valueExporter = new ValueExporter();
+        }
+
+        return $this->valueExporter->exportValue($var);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DataCollector/DataCollectorInterface.php
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DataCollector;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * DataCollectorInterface.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface DataCollectorInterface
+{
+    /**
+     * Collects data for the given Request and Response.
+     *
+     * @param Request    $request   A Request instance
+     * @param Response   $response  A Response instance
+     * @param \Exception $exception An Exception instance
+     */
+    public function collect(Request $request, Response $response, \Exception $exception = null);
+
+    /**
+     * Returns the name of the collector.
+     *
+     * @return string The collector name
+     */
+    public function getName();
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DataCollector/DumpDataCollector.php
@@ -0,0 +1,310 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DataCollector;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Stopwatch\Stopwatch;
+use Symfony\Component\VarDumper\Cloner\Data;
+use Symfony\Component\VarDumper\Cloner\VarCloner;
+use Symfony\Component\VarDumper\Dumper\CliDumper;
+use Symfony\Component\VarDumper\Dumper\HtmlDumper;
+use Symfony\Component\VarDumper\Dumper\DataDumperInterface;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class DumpDataCollector extends DataCollector implements DataDumperInterface
+{
+    private $stopwatch;
+    private $fileLinkFormat;
+    private $dataCount = 0;
+    private $isCollected = true;
+    private $clonesCount = 0;
+    private $clonesIndex = 0;
+    private $rootRefs;
+    private $charset;
+    private $requestStack;
+    private $dumper;
+    private $dumperIsInjected;
+
+    public function __construct(Stopwatch $stopwatch = null, $fileLinkFormat = null, $charset = null, RequestStack $requestStack = null, DataDumperInterface $dumper = null)
+    {
+        $this->stopwatch = $stopwatch;
+        $this->fileLinkFormat = $fileLinkFormat ?: ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format');
+        $this->charset = $charset ?: ini_get('php.output_encoding') ?: ini_get('default_charset') ?: 'UTF-8';
+        $this->requestStack = $requestStack;
+        $this->dumper = $dumper;
+        $this->dumperIsInjected = null !== $dumper;
+
+        // All clones share these properties by reference:
+        $this->rootRefs = array(
+            &$this->data,
+            &$this->dataCount,
+            &$this->isCollected,
+            &$this->clonesCount,
+        );
+    }
+
+    public function __clone()
+    {
+        $this->clonesIndex = ++$this->clonesCount;
+    }
+
+    public function dump(Data $data)
+    {
+        if ($this->stopwatch) {
+            $this->stopwatch->start('dump');
+        }
+        if ($this->isCollected) {
+            $this->isCollected = false;
+        }
+
+        $trace = DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS;
+        if (PHP_VERSION_ID >= 50400) {
+            $trace = debug_backtrace($trace, 7);
+        } else {
+            $trace = debug_backtrace($trace);
+        }
+
+        $file = $trace[0]['file'];
+        $line = $trace[0]['line'];
+        $name = false;
+        $fileExcerpt = false;
+
+        for ($i = 1; $i < 7; ++$i) {
+            if (isset($trace[$i]['class'], $trace[$i]['function'])
+                && 'dump' === $trace[$i]['function']
+                && 'Symfony\Component\VarDumper\VarDumper' === $trace[$i]['class']
+            ) {
+                $file = $trace[$i]['file'];
+                $line = $trace[$i]['line'];
+
+                while (++$i < 7) {
+                    if (isset($trace[$i]['function'], $trace[$i]['file']) && empty($trace[$i]['class']) && 0 !== strpos($trace[$i]['function'], 'call_user_func')) {
+                        $file = $trace[$i]['file'];
+                        $line = $trace[$i]['line'];
+
+                        break;
+                    } elseif (isset($trace[$i]['object']) && $trace[$i]['object'] instanceof \Twig_Template) {
+                        $template = $trace[$i]['object'];
+                        $name = $template->getTemplateName();
+                        $src = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getCode() : (method_exists($template, 'getSource') ? $template->getSource() : false);
+                        $info = $template->getDebugInfo();
+                        if (isset($info[$trace[$i - 1]['line']])) {
+                            $line = $info[$trace[$i - 1]['line']];
+                            $file = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getPath() : null;
+
+                            if ($src) {
+                                $src = explode("\n", $src);
+                                $fileExcerpt = array();
+
+                                for ($i = max($line - 3, 1), $max = min($line + 3, count($src)); $i <= $max; ++$i) {
+                                    $fileExcerpt[] = '<li'.($i === $line ? ' class="selected"' : '').'><code>'.$this->htmlEncode($src[$i - 1]).'</code></li>';
+                                }
+
+                                $fileExcerpt = '<ol start="'.max($line - 3, 1).'">'.implode("\n", $fileExcerpt).'</ol>';
+                            }
+                        }
+                        break;
+                    }
+                }
+                break;
+            }
+        }
+
+        if (false === $name) {
+            $name = str_replace('\\', '/', $file);
+            $name = substr($name, strrpos($name, '/') + 1);
+        }
+
+        if ($this->dumper) {
+            $this->doDump($data, $name, $file, $line);
+        }
+
+        $this->data[] = compact('data', 'name', 'file', 'line', 'fileExcerpt');
+        ++$this->dataCount;
+
+        if ($this->stopwatch) {
+            $this->stopwatch->stop('dump');
+        }
+    }
+
+    public function collect(Request $request, Response $response, \Exception $exception = null)
+    {
+        // Sub-requests and programmatic calls stay in the collected profile.
+        if ($this->dumper || ($this->requestStack && $this->requestStack->getMasterRequest() !== $request) || $request->isXmlHttpRequest() || $request->headers->has('Origin')) {
+            return;
+        }
+
+        // In all other conditions that remove the web debug toolbar, dumps are written on the output.
+        if (!$this->requestStack
+            || !$response->headers->has('X-Debug-Token')
+            || $response->isRedirection()
+            || ($response->headers->has('Content-Type') && false === strpos($response->headers->get('Content-Type'), 'html'))
+            || 'html' !== $request->getRequestFormat()
+            || false === strripos($response->getContent(), '</body>')
+        ) {
+            if ($response->headers->has('Content-Type') && false !== strpos($response->headers->get('Content-Type'), 'html')) {
+                $this->dumper = new HtmlDumper('php://output', $this->charset);
+            } else {
+                $this->dumper = new CliDumper('php://output', $this->charset);
+            }
+
+            foreach ($this->data as $dump) {
+                $this->doDump($dump['data'], $dump['name'], $dump['file'], $dump['line']);
+            }
+        }
+    }
+
+    public function serialize()
+    {
+        if ($this->clonesCount !== $this->clonesIndex) {
+            return 'a:0:{}';
+        }
+
+        $this->data[] = $this->fileLinkFormat;
+        $this->data[] = $this->charset;
+        $ser = serialize($this->data);
+        $this->data = array();
+        $this->dataCount = 0;
+        $this->isCollected = true;
+        if (!$this->dumperIsInjected) {
+            $this->dumper = null;
+        }
+
+        return $ser;
+    }
+
+    public function unserialize($data)
+    {
+        parent::unserialize($data);
+        $charset = array_pop($this->data);
+        $fileLinkFormat = array_pop($this->data);
+        $this->dataCount = count($this->data);
+        self::__construct($this->stopwatch, $fileLinkFormat, $charset);
+    }
+
+    public function getDumpsCount()
+    {
+        return $this->dataCount;
+    }
+
+    public function getDumps($format, $maxDepthLimit = -1, $maxItemsPerDepth = -1)
+    {
+        $data = fopen('php://memory', 'r+b');
+
+        if ('html' === $format) {
+            $dumper = new HtmlDumper($data, $this->charset);
+        } else {
+            throw new \InvalidArgumentException(sprintf('Invalid dump format: %s', $format));
+        }
+        $dumps = array();
+
+        foreach ($this->data as $dump) {
+            if (method_exists($dump['data'], 'withMaxDepth')) {
+                $dumper->dump($dump['data']->withMaxDepth($maxDepthLimit)->withMaxItemsPerDepth($maxItemsPerDepth));
+            } else {
+                // getLimitedClone is @deprecated, to be removed in 3.0
+                $dumper->dump($dump['data']->getLimitedClone($maxDepthLimit, $maxItemsPerDepth));
+            }
+            $dump['data'] = stream_get_contents($data, -1, 0);
+            ftruncate($data, 0);
+            rewind($data);
+            $dumps[] = $dump;
+        }
+
+        return $dumps;
+    }
+
+    public function getName()
+    {
+        return 'dump';
+    }
+
+    public function __destruct()
+    {
+        if (0 === $this->clonesCount-- && !$this->isCollected && $this->data) {
+            $this->clonesCount = 0;
+            $this->isCollected = true;
+
+            $h = headers_list();
+            $i = count($h);
+            array_unshift($h, 'Content-Type: '.ini_get('default_mimetype'));
+            while (0 !== stripos($h[$i], 'Content-Type:')) {
+                --$i;
+            }
+
+            if ('cli' !== PHP_SAPI && stripos($h[$i], 'html')) {
+                $this->dumper = new HtmlDumper('php://output', $this->charset);
+            } else {
+                $this->dumper = new CliDumper('php://output', $this->charset);
+            }
+
+            foreach ($this->data as $i => $dump) {
+                $this->data[$i] = null;
+                $this->doDump($dump['data'], $dump['name'], $dump['file'], $dump['line']);
+            }
+
+            $this->data = array();
+            $this->dataCount = 0;
+        }
+    }
+
+    private function doDump($data, $name, $file, $line)
+    {
+        if (PHP_VERSION_ID >= 50400 && $this->dumper instanceof CliDumper) {
+            $contextDumper = function ($name, $file, $line, $fileLinkFormat) {
+                if ($this instanceof HtmlDumper) {
+                    if ($file) {
+                        $s = $this->style('meta', '%s');
+                        $name = strip_tags($this->style('', $name));
+                        $file = strip_tags($this->style('', $file));
+                        if ($fileLinkFormat) {
+                            $link = strtr(strip_tags($this->style('', $fileLinkFormat)), array('%f' => $file, '%l' => (int) $line));
+                            $name = sprintf('<a href="%s" title="%s">'.$s.'</a>', $link, $file, $name);
+                        } else {
+                            $name = sprintf('<abbr title="%s">'.$s.'</abbr>', $file, $name);
+                        }
+                    } else {
+                        $name = $this->style('meta', $name);
+                    }
+                    $this->line = $name.' on line '.$this->style('meta', $line).':';
+                } else {
+                    $this->line = $this->style('meta', $name).' on line '.$this->style('meta', $line).':';
+                }
+                $this->dumpLine(0);
+            };
+            $contextDumper = $contextDumper->bindTo($this->dumper, $this->dumper);
+            $contextDumper($name, $file, $line, $this->fileLinkFormat);
+        } else {
+            $cloner = new VarCloner();
+            $this->dumper->dump($cloner->cloneVar($name.' on line '.$line.':'));
+        }
+        $this->dumper->dump($data);
+    }
+
+    private function htmlEncode($s)
+    {
+        $html = '';
+
+        $dumper = new HtmlDumper(function ($line) use (&$html) {$html .= $line;}, $this->charset);
+        $dumper->setDumpHeader('');
+        $dumper->setDumpBoundaries('', '');
+
+        $cloner = new VarCloner();
+        $dumper->dump($cloner->cloneVar($s));
+
+        return substr(strip_tags($html), 1, -1);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DataCollector/EventDataCollector.php
@@ -0,0 +1,107 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DataCollector;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcherInterface;
+
+/**
+ * EventDataCollector.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class EventDataCollector extends DataCollector implements LateDataCollectorInterface
+{
+    protected $dispatcher;
+
+    public function __construct(EventDispatcherInterface $dispatcher = null)
+    {
+        $this->dispatcher = $dispatcher;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function collect(Request $request, Response $response, \Exception $exception = null)
+    {
+        $this->data = array(
+            'called_listeners' => array(),
+            'not_called_listeners' => array(),
+        );
+    }
+
+    public function lateCollect()
+    {
+        if ($this->dispatcher instanceof TraceableEventDispatcherInterface) {
+            $this->setCalledListeners($this->dispatcher->getCalledListeners());
+            $this->setNotCalledListeners($this->dispatcher->getNotCalledListeners());
+        }
+    }
+
+    /**
+     * Sets the called listeners.
+     *
+     * @param array $listeners An array of called listeners
+     *
+     * @see TraceableEventDispatcherInterface
+     */
+    public function setCalledListeners(array $listeners)
+    {
+        $this->data['called_listeners'] = $listeners;
+    }
+
+    /**
+     * Gets the called listeners.
+     *
+     * @return array An array of called listeners
+     *
+     * @see TraceableEventDispatcherInterface
+     */
+    public function getCalledListeners()
+    {
+        return $this->data['called_listeners'];
+    }
+
+    /**
+     * Sets the not called listeners.
+     *
+     * @param array $listeners An array of not called listeners
+     *
+     * @see TraceableEventDispatcherInterface
+     */
+    public function setNotCalledListeners(array $listeners)
+    {
+        $this->data['not_called_listeners'] = $listeners;
+    }
+
+    /**
+     * Gets the not called listeners.
+     *
+     * @return array An array of not called listeners
+     *
+     * @see TraceableEventDispatcherInterface
+     */
+    public function getNotCalledListeners()
+    {
+        return $this->data['not_called_listeners'];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'events';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DataCollector/ExceptionDataCollector.php
@@ -0,0 +1,104 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DataCollector;
+
+use Symfony\Component\Debug\Exception\FlattenException;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * ExceptionDataCollector.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ExceptionDataCollector extends DataCollector
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function collect(Request $request, Response $response, \Exception $exception = null)
+    {
+        if (null !== $exception) {
+            $this->data = array(
+                'exception' => FlattenException::create($exception),
+            );
+        }
+    }
+
+    /**
+     * Checks if the exception is not null.
+     *
+     * @return bool true if the exception is not null, false otherwise
+     */
+    public function hasException()
+    {
+        return isset($this->data['exception']);
+    }
+
+    /**
+     * Gets the exception.
+     *
+     * @return \Exception The exception
+     */
+    public function getException()
+    {
+        return $this->data['exception'];
+    }
+
+    /**
+     * Gets the exception message.
+     *
+     * @return string The exception message
+     */
+    public function getMessage()
+    {
+        return $this->data['exception']->getMessage();
+    }
+
+    /**
+     * Gets the exception code.
+     *
+     * @return int The exception code
+     */
+    public function getCode()
+    {
+        return $this->data['exception']->getCode();
+    }
+
+    /**
+     * Gets the status code.
+     *
+     * @return int The status code
+     */
+    public function getStatusCode()
+    {
+        return $this->data['exception']->getStatusCode();
+    }
+
+    /**
+     * Gets the exception trace.
+     *
+     * @return array The exception trace
+     */
+    public function getTrace()
+    {
+        return $this->data['exception']->getTrace();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'exception';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DataCollector/LateDataCollectorInterface.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DataCollector;
+
+/**
+ * LateDataCollectorInterface.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface LateDataCollectorInterface
+{
+    /**
+     * Collects data as late as possible.
+     */
+    public function lateCollect();
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php
@@ -0,0 +1,213 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DataCollector;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
+
+/**
+ * LogDataCollector.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class LoggerDataCollector extends DataCollector implements LateDataCollectorInterface
+{
+    private $errorNames = array(
+        E_DEPRECATED => 'E_DEPRECATED',
+        E_USER_DEPRECATED => 'E_USER_DEPRECATED',
+        E_NOTICE => 'E_NOTICE',
+        E_USER_NOTICE => 'E_USER_NOTICE',
+        E_STRICT => 'E_STRICT',
+        E_WARNING => 'E_WARNING',
+        E_USER_WARNING => 'E_USER_WARNING',
+        E_COMPILE_WARNING => 'E_COMPILE_WARNING',
+        E_CORE_WARNING => 'E_CORE_WARNING',
+        E_USER_ERROR => 'E_USER_ERROR',
+        E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
+        E_COMPILE_ERROR => 'E_COMPILE_ERROR',
+        E_PARSE => 'E_PARSE',
+        E_ERROR => 'E_ERROR',
+        E_CORE_ERROR => 'E_CORE_ERROR',
+    );
+
+    private $logger;
+
+    public function __construct($logger = null)
+    {
+        if (null !== $logger && $logger instanceof DebugLoggerInterface) {
+            $this->logger = $logger;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function collect(Request $request, Response $response, \Exception $exception = null)
+    {
+        // everything is done as late as possible
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function lateCollect()
+    {
+        if (null !== $this->logger) {
+            $this->data = $this->computeErrorsCount();
+            $this->data['logs'] = $this->sanitizeLogs($this->logger->getLogs());
+        }
+    }
+
+    /**
+     * Gets the logs.
+     *
+     * @return array An array of logs
+     */
+    public function getLogs()
+    {
+        return isset($this->data['logs']) ? $this->data['logs'] : array();
+    }
+
+    public function getPriorities()
+    {
+        return isset($this->data['priorities']) ? $this->data['priorities'] : array();
+    }
+
+    public function countErrors()
+    {
+        return isset($this->data['error_count']) ? $this->data['error_count'] : 0;
+    }
+
+    public function countDeprecations()
+    {
+        return isset($this->data['deprecation_count']) ? $this->data['deprecation_count'] : 0;
+    }
+
+    public function countScreams()
+    {
+        return isset($this->data['scream_count']) ? $this->data['scream_count'] : 0;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'logger';
+    }
+
+    private function sanitizeLogs($logs)
+    {
+        $errorContextById = array();
+        $sanitizedLogs = array();
+
+        foreach ($logs as $log) {
+            $context = $this->sanitizeContext($log['context']);
+
+            if (isset($context['type'], $context['file'], $context['line'], $context['level'])) {
+                $errorId = md5("{$context['type']}/{$context['line']}/{$context['file']}\x00{$log['message']}", true);
+                $silenced = !($context['type'] & $context['level']);
+                if (isset($this->errorNames[$context['type']])) {
+                    $context = array_merge(array('name' => $this->errorNames[$context['type']]), $context);
+                }
+
+                if (isset($errorContextById[$errorId])) {
+                    if (isset($errorContextById[$errorId]['errorCount'])) {
+                        ++$errorContextById[$errorId]['errorCount'];
+                    } else {
+                        $errorContextById[$errorId]['errorCount'] = 2;
+                    }
+
+                    if (!$silenced && isset($errorContextById[$errorId]['scream'])) {
+                        unset($errorContextById[$errorId]['scream']);
+                        $errorContextById[$errorId]['level'] = $context['level'];
+                    }
+
+                    continue;
+                }
+
+                $errorContextById[$errorId] = &$context;
+                if ($silenced) {
+                    $context['scream'] = true;
+                }
+
+                $log['context'] = &$context;
+                unset($context);
+            } else {
+                $log['context'] = $context;
+            }
+
+            $sanitizedLogs[] = $log;
+        }
+
+        return $sanitizedLogs;
+    }
+
+    private function sanitizeContext($context)
+    {
+        if (is_array($context)) {
+            foreach ($context as $key => $value) {
+                $context[$key] = $this->sanitizeContext($value);
+            }
+
+            return $context;
+        }
+
+        if (is_resource($context)) {
+            return sprintf('Resource(%s)', get_resource_type($context));
+        }
+
+        if (is_object($context)) {
+            if ($context instanceof \Exception) {
+                return sprintf('Exception(%s): %s', get_class($context), $context->getMessage());
+            }
+
+            return sprintf('Object(%s)', get_class($context));
+        }
+
+        return $context;
+    }
+
+    private function computeErrorsCount()
+    {
+        $count = array(
+            'error_count' => $this->logger->countErrors(),
+            'deprecation_count' => 0,
+            'scream_count' => 0,
+            'priorities' => array(),
+        );
+
+        foreach ($this->logger->getLogs() as $log) {
+            if (isset($count['priorities'][$log['priority']])) {
+                ++$count['priorities'][$log['priority']]['count'];
+            } else {
+                $count['priorities'][$log['priority']] = array(
+                    'count' => 1,
+                    'name' => $log['priorityName'],
+                );
+            }
+
+            if (isset($log['context']['type'], $log['context']['level'])) {
+                if (E_DEPRECATED === $log['context']['type'] || E_USER_DEPRECATED === $log['context']['type']) {
+                    ++$count['deprecation_count'];
+                } elseif (!($log['context']['type'] & $log['context']['level'])) {
+                    ++$count['scream_count'];
+                }
+            }
+        }
+
+        ksort($count['priorities']);
+
+        return $count;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DataCollector/MemoryDataCollector.php
@@ -0,0 +1,109 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DataCollector;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * MemoryDataCollector.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class MemoryDataCollector extends DataCollector implements LateDataCollectorInterface
+{
+    public function __construct()
+    {
+        $this->data = array(
+            'memory' => 0,
+            'memory_limit' => $this->convertToBytes(ini_get('memory_limit')),
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function collect(Request $request, Response $response, \Exception $exception = null)
+    {
+        $this->updateMemoryUsage();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function lateCollect()
+    {
+        $this->updateMemoryUsage();
+    }
+
+    /**
+     * Gets the memory.
+     *
+     * @return int The memory
+     */
+    public function getMemory()
+    {
+        return $this->data['memory'];
+    }
+
+    /**
+     * Gets the PHP memory limit.
+     *
+     * @return int The memory limit
+     */
+    public function getMemoryLimit()
+    {
+        return $this->data['memory_limit'];
+    }
+
+    /**
+     * Updates the memory usage data.
+     */
+    public function updateMemoryUsage()
+    {
+        $this->data['memory'] = memory_get_peak_usage(true);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'memory';
+    }
+
+    private function convertToBytes($memoryLimit)
+    {
+        if ('-1' === $memoryLimit) {
+            return -1;
+        }
+
+        $memoryLimit = strtolower($memoryLimit);
+        $max = strtolower(ltrim($memoryLimit, '+'));
+        if (0 === strpos($max, '0x')) {
+            $max = intval($max, 16);
+        } elseif (0 === strpos($max, '0')) {
+            $max = intval($max, 8);
+        } else {
+            $max = (int) $max;
+        }
+
+        switch (substr($memoryLimit, -1)) {
+            case 't': $max *= 1024;
+            case 'g': $max *= 1024;
+            case 'm': $max *= 1024;
+            case 'k': $max *= 1024;
+        }
+
+        return $max;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DataCollector/RequestDataCollector.php
@@ -0,0 +1,342 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DataCollector;
+
+use Symfony\Component\HttpFoundation\ParameterBag;
+use Symfony\Component\HttpFoundation\HeaderBag;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\ResponseHeaderBag;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * RequestDataCollector.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class RequestDataCollector extends DataCollector implements EventSubscriberInterface
+{
+    protected $controllers;
+
+    public function __construct()
+    {
+        $this->controllers = new \SplObjectStorage();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function collect(Request $request, Response $response, \Exception $exception = null)
+    {
+        $responseHeaders = $response->headers->all();
+        $cookies = array();
+        foreach ($response->headers->getCookies() as $cookie) {
+            $cookies[] = $this->getCookieHeader($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
+        }
+        if (count($cookies) > 0) {
+            $responseHeaders['Set-Cookie'] = $cookies;
+        }
+
+        // attributes are serialized and as they can be anything, they need to be converted to strings.
+        $attributes = array();
+        foreach ($request->attributes->all() as $key => $value) {
+            if ('_route' === $key && is_object($value)) {
+                $attributes[$key] = $this->varToString($value->getPath());
+            } elseif ('_route_params' === $key) {
+                // we need to keep route params as an array (see getRouteParams())
+                foreach ($value as $k => $v) {
+                    $value[$k] = $this->varToString($v);
+                }
+                $attributes[$key] = $value;
+            } else {
+                $attributes[$key] = $this->varToString($value);
+            }
+        }
+
+        $content = null;
+        try {
+            $content = $request->getContent();
+        } catch (\LogicException $e) {
+            // the user already got the request content as a resource
+            $content = false;
+        }
+
+        $sessionMetadata = array();
+        $sessionAttributes = array();
+        $flashes = array();
+        if ($request->hasSession()) {
+            $session = $request->getSession();
+            if ($session->isStarted()) {
+                $sessionMetadata['Created'] = date(DATE_RFC822, $session->getMetadataBag()->getCreated());
+                $sessionMetadata['Last used'] = date(DATE_RFC822, $session->getMetadataBag()->getLastUsed());
+                $sessionMetadata['Lifetime'] = $session->getMetadataBag()->getLifetime();
+                $sessionAttributes = $session->all();
+                $flashes = $session->getFlashBag()->peekAll();
+            }
+        }
+
+        $statusCode = $response->getStatusCode();
+
+        $this->data = array(
+            'format' => $request->getRequestFormat(),
+            'content' => $content,
+            'content_type' => $response->headers->get('Content-Type', 'text/html'),
+            'status_text' => isset(Response::$statusTexts[$statusCode]) ? Response::$statusTexts[$statusCode] : '',
+            'status_code' => $statusCode,
+            'request_query' => $request->query->all(),
+            'request_request' => $request->request->all(),
+            'request_headers' => $request->headers->all(),
+            'request_server' => $request->server->all(),
+            'request_cookies' => $request->cookies->all(),
+            'request_attributes' => $attributes,
+            'response_headers' => $responseHeaders,
+            'session_metadata' => $sessionMetadata,
+            'session_attributes' => $sessionAttributes,
+            'flashes' => $flashes,
+            'path_info' => $request->getPathInfo(),
+            'controller' => 'n/a',
+            'locale' => $request->getLocale(),
+        );
+
+        if (isset($this->data['request_headers']['php-auth-pw'])) {
+            $this->data['request_headers']['php-auth-pw'] = '******';
+        }
+
+        if (isset($this->data['request_server']['PHP_AUTH_PW'])) {
+            $this->data['request_server']['PHP_AUTH_PW'] = '******';
+        }
+
+        if (isset($this->data['request_request']['_password'])) {
+            $this->data['request_request']['_password'] = '******';
+        }
+
+        if (isset($this->controllers[$request])) {
+            $controller = $this->controllers[$request];
+            if (is_array($controller)) {
+                try {
+                    $r = new \ReflectionMethod($controller[0], $controller[1]);
+                    $this->data['controller'] = array(
+                        'class' => is_object($controller[0]) ? get_class($controller[0]) : $controller[0],
+                        'method' => $controller[1],
+                        'file' => $r->getFileName(),
+                        'line' => $r->getStartLine(),
+                    );
+                } catch (\ReflectionException $e) {
+                    if (is_callable($controller)) {
+                        // using __call or  __callStatic
+                        $this->data['controller'] = array(
+                            'class' => is_object($controller[0]) ? get_class($controller[0]) : $controller[0],
+                            'method' => $controller[1],
+                            'file' => 'n/a',
+                            'line' => 'n/a',
+                        );
+                    }
+                }
+            } elseif ($controller instanceof \Closure) {
+                $r = new \ReflectionFunction($controller);
+                $this->data['controller'] = array(
+                    'class' => $r->getName(),
+                    'method' => null,
+                    'file' => $r->getFileName(),
+                    'line' => $r->getStartLine(),
+                );
+            } elseif (is_object($controller)) {
+                $r = new \ReflectionClass($controller);
+                $this->data['controller'] = array(
+                    'class' => $r->getName(),
+                    'method' => null,
+                    'file' => $r->getFileName(),
+                    'line' => $r->getStartLine(),
+                );
+            } else {
+                $this->data['controller'] = (string) $controller ?: 'n/a';
+            }
+            unset($this->controllers[$request]);
+        }
+    }
+
+    public function getPathInfo()
+    {
+        return $this->data['path_info'];
+    }
+
+    public function getRequestRequest()
+    {
+        return new ParameterBag($this->data['request_request']);
+    }
+
+    public function getRequestQuery()
+    {
+        return new ParameterBag($this->data['request_query']);
+    }
+
+    public function getRequestHeaders()
+    {
+        return new HeaderBag($this->data['request_headers']);
+    }
+
+    public function getRequestServer()
+    {
+        return new ParameterBag($this->data['request_server']);
+    }
+
+    public function getRequestCookies()
+    {
+        return new ParameterBag($this->data['request_cookies']);
+    }
+
+    public function getRequestAttributes()
+    {
+        return new ParameterBag($this->data['request_attributes']);
+    }
+
+    public function getResponseHeaders()
+    {
+        return new ResponseHeaderBag($this->data['response_headers']);
+    }
+
+    public function getSessionMetadata()
+    {
+        return $this->data['session_metadata'];
+    }
+
+    public function getSessionAttributes()
+    {
+        return $this->data['session_attributes'];
+    }
+
+    public function getFlashes()
+    {
+        return $this->data['flashes'];
+    }
+
+    public function getContent()
+    {
+        return $this->data['content'];
+    }
+
+    public function getContentType()
+    {
+        return $this->data['content_type'];
+    }
+
+    public function getStatusText()
+    {
+        return $this->data['status_text'];
+    }
+
+    public function getStatusCode()
+    {
+        return $this->data['status_code'];
+    }
+
+    public function getFormat()
+    {
+        return $this->data['format'];
+    }
+
+    public function getLocale()
+    {
+        return $this->data['locale'];
+    }
+
+    /**
+     * Gets the route name.
+     *
+     * The _route request attributes is automatically set by the Router Matcher.
+     *
+     * @return string The route
+     */
+    public function getRoute()
+    {
+        return isset($this->data['request_attributes']['_route']) ? $this->data['request_attributes']['_route'] : '';
+    }
+
+    /**
+     * Gets the route parameters.
+     *
+     * The _route_params request attributes is automatically set by the RouterListener.
+     *
+     * @return array The parameters
+     */
+    public function getRouteParams()
+    {
+        return isset($this->data['request_attributes']['_route_params']) ? $this->data['request_attributes']['_route_params'] : array();
+    }
+
+    /**
+     * Gets the controller.
+     *
+     * @return string The controller as a string
+     */
+    public function getController()
+    {
+        return $this->data['controller'];
+    }
+
+    public function onKernelController(FilterControllerEvent $event)
+    {
+        $this->controllers[$event->getRequest()] = $event->getController();
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return array(KernelEvents::CONTROLLER => 'onKernelController');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'request';
+    }
+
+    private function getCookieHeader($name, $value, $expires, $path, $domain, $secure, $httponly)
+    {
+        $cookie = sprintf('%s=%s', $name, urlencode($value));
+
+        if (0 !== $expires) {
+            if (is_numeric($expires)) {
+                $expires = (int) $expires;
+            } elseif ($expires instanceof \DateTime) {
+                $expires = $expires->getTimestamp();
+            } else {
+                $tmp = strtotime($expires);
+                if (false === $tmp || -1 == $tmp) {
+                    throw new \InvalidArgumentException(sprintf('The "expires" cookie parameter is not valid (%s).', $expires));
+                }
+                $expires = $tmp;
+            }
+
+            $cookie .= '; expires='.str_replace('+0000', '', \DateTime::createFromFormat('U', $expires, new \DateTimeZone('GMT'))->format('D, d-M-Y H:i:s T'));
+        }
+
+        if ($domain) {
+            $cookie .= '; domain='.$domain;
+        }
+
+        $cookie .= '; path='.$path;
+
+        if ($secure) {
+            $cookie .= '; secure';
+        }
+
+        if ($httponly) {
+            $cookie .= '; httponly';
+        }
+
+        return $cookie;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DataCollector/RouterDataCollector.php
@@ -0,0 +1,102 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DataCollector;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
+
+/**
+ * RouterDataCollector.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class RouterDataCollector extends DataCollector
+{
+    protected $controllers;
+
+    public function __construct()
+    {
+        $this->controllers = new \SplObjectStorage();
+
+        $this->data = array(
+            'redirect' => false,
+            'url' => null,
+            'route' => null,
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function collect(Request $request, Response $response, \Exception $exception = null)
+    {
+        if ($response instanceof RedirectResponse) {
+            $this->data['redirect'] = true;
+            $this->data['url'] = $response->getTargetUrl();
+
+            if ($this->controllers->contains($request)) {
+                $this->data['route'] = $this->guessRoute($request, $this->controllers[$request]);
+            }
+        }
+
+        unset($this->controllers[$request]);
+    }
+
+    protected function guessRoute(Request $request, $controller)
+    {
+        return 'n/a';
+    }
+
+    /**
+     * Remembers the controller associated to each request.
+     *
+     * @param FilterControllerEvent $event The filter controller event
+     */
+    public function onKernelController(FilterControllerEvent $event)
+    {
+        $this->controllers[$event->getRequest()] = $event->getController();
+    }
+
+    /**
+     * @return bool Whether this request will result in a redirect
+     */
+    public function getRedirect()
+    {
+        return $this->data['redirect'];
+    }
+
+    /**
+     * @return string|null The target URL
+     */
+    public function getTargetUrl()
+    {
+        return $this->data['url'];
+    }
+
+    /**
+     * @return string|null The target route
+     */
+    public function getTargetRoute()
+    {
+        return $this->data['route'];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'router';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DataCollector/TimeDataCollector.php
@@ -0,0 +1,136 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DataCollector;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\KernelInterface;
+
+/**
+ * TimeDataCollector.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TimeDataCollector extends DataCollector implements LateDataCollectorInterface
+{
+    protected $kernel;
+    protected $stopwatch;
+
+    public function __construct(KernelInterface $kernel = null, $stopwatch = null)
+    {
+        $this->kernel = $kernel;
+        $this->stopwatch = $stopwatch;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function collect(Request $request, Response $response, \Exception $exception = null)
+    {
+        if (null !== $this->kernel) {
+            $startTime = $this->kernel->getStartTime();
+        } else {
+            $startTime = $request->server->get('REQUEST_TIME_FLOAT', $request->server->get('REQUEST_TIME'));
+        }
+
+        $this->data = array(
+            'token' => $response->headers->get('X-Debug-Token'),
+            'start_time' => $startTime * 1000,
+            'events' => array(),
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function lateCollect()
+    {
+        if (null !== $this->stopwatch && isset($this->data['token'])) {
+            $this->setEvents($this->stopwatch->getSectionEvents($this->data['token']));
+        }
+        unset($this->data['token']);
+    }
+
+    /**
+     * Sets the request events.
+     *
+     * @param array $events The request events
+     */
+    public function setEvents(array $events)
+    {
+        foreach ($events as $event) {
+            $event->ensureStopped();
+        }
+
+        $this->data['events'] = $events;
+    }
+
+    /**
+     * Gets the request events.
+     *
+     * @return array The request events
+     */
+    public function getEvents()
+    {
+        return $this->data['events'];
+    }
+
+    /**
+     * Gets the request elapsed time.
+     *
+     * @return float The elapsed time
+     */
+    public function getDuration()
+    {
+        if (!isset($this->data['events']['__section__'])) {
+            return 0;
+        }
+
+        $lastEvent = $this->data['events']['__section__'];
+
+        return $lastEvent->getOrigin() + $lastEvent->getDuration() - $this->getStartTime();
+    }
+
+    /**
+     * Gets the initialization time.
+     *
+     * This is the time spent until the beginning of the request handling.
+     *
+     * @return float The elapsed time
+     */
+    public function getInitTime()
+    {
+        if (!isset($this->data['events']['__section__'])) {
+            return 0;
+        }
+
+        return $this->data['events']['__section__']->getOrigin() - $this->getStartTime();
+    }
+
+    /**
+     * Gets the request time.
+     *
+     * @return int The time
+     */
+    public function getStartTime()
+    {
+        return $this->data['start_time'];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'time';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DataCollector/Util/ValueExporter.php
@@ -0,0 +1,89 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DataCollector\Util;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class ValueExporter
+{
+    /**
+     * Converts a PHP value to a string.
+     *
+     * @param mixed $value The PHP value
+     * @param int   $depth only for internal usage
+     * @param bool  $deep  only for internal usage
+     *
+     * @return string The string representation of the given value
+     */
+    public function exportValue($value, $depth = 1, $deep = false)
+    {
+        if ($value instanceof \__PHP_Incomplete_Class) {
+            return sprintf('__PHP_Incomplete_Class(%s)', $this->getClassNameFromIncomplete($value));
+        }
+
+        if (is_object($value)) {
+            if ($value instanceof \DateTime || $value instanceof \DateTimeInterface) {
+                return sprintf('Object(%s) - %s', get_class($value), $value->format(\DateTime::ISO8601));
+            }
+
+            return sprintf('Object(%s)', get_class($value));
+        }
+
+        if (is_array($value)) {
+            if (empty($value)) {
+                return '[]';
+            }
+
+            $indent = str_repeat('  ', $depth);
+
+            $a = array();
+            foreach ($value as $k => $v) {
+                if (is_array($v)) {
+                    $deep = true;
+                }
+                $a[] = sprintf('%s => %s', $k, $this->exportValue($v, $depth + 1, $deep));
+            }
+
+            if ($deep) {
+                return sprintf("[\n%s%s\n%s]", $indent, implode(sprintf(", \n%s", $indent), $a), str_repeat('  ', $depth - 1));
+            }
+
+            return sprintf('[%s]', implode(', ', $a));
+        }
+
+        if (is_resource($value)) {
+            return sprintf('Resource(%s#%d)', get_resource_type($value), $value);
+        }
+
+        if (null === $value) {
+            return 'null';
+        }
+
+        if (false === $value) {
+            return 'false';
+        }
+
+        if (true === $value) {
+            return 'true';
+        }
+
+        return (string) $value;
+    }
+
+    private function getClassNameFromIncomplete(\__PHP_Incomplete_Class $value)
+    {
+        $array = new \ArrayObject($value);
+
+        return $array['__PHP_Incomplete_Class_Name'];
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Debug/ErrorHandler.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Debug;
+
+@trigger_error('The '.__NAMESPACE__.'\ErrorHandler class is deprecated since version 2.3 and will be removed in 3.0. Use the Symfony\Component\Debug\ErrorHandler class instead.', E_USER_DEPRECATED);
+
+use Symfony\Component\Debug\ErrorHandler as DebugErrorHandler;
+
+/**
+ * ErrorHandler.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
+ */
+class ErrorHandler extends DebugErrorHandler
+{
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Debug/ExceptionHandler.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Debug;
+
+@trigger_error('The '.__NAMESPACE__.'\ExceptionHandler class is deprecated since version 2.3 and will be removed in 3.0. Use the Symfony\Component\Debug\ExceptionHandler class instead.', E_USER_DEPRECATED);
+
+use Symfony\Component\Debug\ExceptionHandler as DebugExceptionHandler;
+
+/**
+ * ExceptionHandler converts an exception to a Response object.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
+ */
+class ExceptionHandler extends DebugExceptionHandler
+{
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Debug/TraceableEventDispatcher.php
@@ -0,0 +1,99 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Debug;
+
+use Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher as BaseTraceableEventDispatcher;
+use Symfony\Component\HttpKernel\Profiler\Profiler;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Collects some data about event listeners.
+ *
+ * This event dispatcher delegates the dispatching to another one.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TraceableEventDispatcher extends BaseTraceableEventDispatcher
+{
+    /**
+     * Sets the profiler.
+     *
+     * The traceable event dispatcher does not use the profiler anymore.
+     * The job is now done directly by the Profiler listener and the
+     * data collectors themselves.
+     *
+     * @param Profiler|null $profiler A Profiler instance
+     *
+     * @deprecated since version 2.4, to be removed in 3.0.
+     */
+    public function setProfiler(Profiler $profiler = null)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.4 and will be removed in 3.0.', E_USER_DEPRECATED);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function preDispatch($eventName, Event $event)
+    {
+        switch ($eventName) {
+            case KernelEvents::REQUEST:
+                $this->stopwatch->openSection();
+                break;
+            case KernelEvents::VIEW:
+            case KernelEvents::RESPONSE:
+                // stop only if a controller has been executed
+                if ($this->stopwatch->isStarted('controller')) {
+                    $this->stopwatch->stop('controller');
+                }
+                break;
+            case KernelEvents::TERMINATE:
+                $token = $event->getResponse()->headers->get('X-Debug-Token');
+                // There is a very special case when using built-in AppCache class as kernel wrapper, in the case
+                // of an ESI request leading to a `stale` response [B]  inside a `fresh` cached response [A].
+                // In this case, `$token` contains the [B] debug token, but the  open `stopwatch` section ID
+                // is equal to the [A] debug token. Trying to reopen section with the [B] token throws an exception
+                // which must be caught.
+                try {
+                    $this->stopwatch->openSection($token);
+                } catch (\LogicException $e) {
+                }
+                break;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function postDispatch($eventName, Event $event)
+    {
+        switch ($eventName) {
+            case KernelEvents::CONTROLLER:
+                $this->stopwatch->start('controller', 'section');
+                break;
+            case KernelEvents::RESPONSE:
+                $token = $event->getResponse()->headers->get('X-Debug-Token');
+                $this->stopwatch->stopSection($token);
+                break;
+            case KernelEvents::TERMINATE:
+                // In the special case described in the `preDispatch` method above, the `$token` section
+                // does not exist, then closing it throws an exception which must be caught.
+                $token = $event->getResponse()->headers->get('X-Debug-Token');
+                try {
+                    $this->stopwatch->stopSection($token);
+                } catch (\LogicException $e) {
+                }
+                break;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DependencyInjection/AddClassesToCachePass.php
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\HttpKernel\Kernel;
+
+/**
+ * Sets the classes to compile in the cache for the container.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class AddClassesToCachePass implements CompilerPassInterface
+{
+    private $kernel;
+
+    public function __construct(Kernel $kernel)
+    {
+        $this->kernel = $kernel;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function process(ContainerBuilder $container)
+    {
+        $classes = array();
+        foreach ($container->getExtensions() as $extension) {
+            if ($extension instanceof Extension) {
+                $classes = array_merge($classes, $extension->getClassesToCompile());
+            }
+        }
+
+        $this->kernel->setClassCache(array_unique($container->getParameterBag()->resolveValue($classes)));
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DependencyInjection/ConfigurableExtension.php
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * This extension sub-class provides first-class integration with the
+ * Config/Definition Component.
+ *
+ * You can use this as base class if
+ *
+ *    a) you use the Config/Definition component for configuration,
+ *    b) your configuration class is named "Configuration", and
+ *    c) the configuration class resides in the DependencyInjection sub-folder.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+abstract class ConfigurableExtension extends Extension
+{
+    /**
+     * {@inheritdoc}
+     */
+    final public function load(array $configs, ContainerBuilder $container)
+    {
+        $this->loadInternal($this->processConfiguration($this->getConfiguration($configs, $container), $configs), $container);
+    }
+
+    /**
+     * Configures the passed container according to the merged configuration.
+     *
+     * @param array            $mergedConfig
+     * @param ContainerBuilder $container
+     */
+    abstract protected function loadInternal(array $mergedConfig, ContainerBuilder $container);
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DependencyInjection/ContainerAwareHttpKernel.php
@@ -0,0 +1,87 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DependencyInjection;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\HttpKernel;
+use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Scope;
+
+/**
+ * Adds a managed request scope.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ *
+ * @deprecated since version 2.7, to be removed in 3.0.
+ */
+class ContainerAwareHttpKernel extends HttpKernel
+{
+    protected $container;
+
+    /**
+     * Constructor.
+     *
+     * @param EventDispatcherInterface    $dispatcher         An EventDispatcherInterface instance
+     * @param ContainerInterface          $container          A ContainerInterface instance
+     * @param ControllerResolverInterface $controllerResolver A ControllerResolverInterface instance
+     * @param RequestStack                $requestStack       A stack for master/sub requests
+     * @param bool                        $triggerDeprecation Whether or not to trigger the deprecation warning for the ContainerAwareHttpKernel
+     */
+    public function __construct(EventDispatcherInterface $dispatcher, ContainerInterface $container, ControllerResolverInterface $controllerResolver, RequestStack $requestStack = null, $triggerDeprecation = true)
+    {
+        parent::__construct($dispatcher, $controllerResolver, $requestStack);
+
+        if ($triggerDeprecation) {
+            @trigger_error('The '.__CLASS__.' class is deprecated since version 2.7 and will be removed in 3.0. Use the Symfony\Component\HttpKernel\HttpKernel class instead.', E_USER_DEPRECATED);
+        }
+
+        $this->container = $container;
+
+        // the request scope might have been created before (see FrameworkBundle)
+        if (!$container->hasScope('request')) {
+            $container->addScope(new Scope('request'));
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
+    {
+        $this->container->enterScope('request');
+        $this->container->set('request', $request, 'request');
+
+        try {
+            $response = parent::handle($request, $type, $catch);
+        } catch (\Exception $e) {
+            $this->container->set('request', null, 'request');
+            $this->container->leaveScope('request');
+
+            throw $e;
+        } catch (\Throwable $e) {
+            $this->container->set('request', null, 'request');
+            $this->container->leaveScope('request');
+
+            throw $e;
+        }
+
+        $this->container->set('request', null, 'request');
+        $this->container->leaveScope('request');
+
+        return $response;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DependencyInjection/Extension.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\Extension\Extension as BaseExtension;
+
+/**
+ * Allow adding classes to the class cache.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class Extension extends BaseExtension
+{
+    private $classes = array();
+
+    /**
+     * Gets the classes to cache.
+     *
+     * @return array An array of classes
+     */
+    public function getClassesToCompile()
+    {
+        return $this->classes;
+    }
+
+    /**
+     * Adds classes to the class cache.
+     *
+     * @param array $classes An array of classes
+     */
+    public function addClassesToCompile(array $classes)
+    {
+        $this->classes = array_merge($this->classes, $classes);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php
@@ -0,0 +1,78 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+
+/**
+ * Adds services tagged kernel.fragment_renderer as HTTP content rendering strategies.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class FragmentRendererPass implements CompilerPassInterface
+{
+    private $handlerService;
+    private $rendererTag;
+
+    /**
+     * @param string $handlerService Service name of the fragment handler in the container
+     * @param string $rendererTag    Tag name used for fragments
+     */
+    public function __construct($handlerService = 'fragment.handler', $rendererTag = 'kernel.fragment_renderer')
+    {
+        $this->handlerService = $handlerService;
+        $this->rendererTag = $rendererTag;
+    }
+
+    public function process(ContainerBuilder $container)
+    {
+        if (!$container->hasDefinition($this->handlerService)) {
+            return;
+        }
+
+        $definition = $container->getDefinition($this->handlerService);
+        foreach ($container->findTaggedServiceIds($this->rendererTag) as $id => $tags) {
+            $def = $container->getDefinition($id);
+            if (!$def->isPublic()) {
+                throw new \InvalidArgumentException(sprintf('The service "%s" must be public as fragment renderer are lazy-loaded.', $id));
+            }
+
+            if ($def->isAbstract()) {
+                throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as fragment renderer are lazy-loaded.', $id));
+            }
+
+            $class = $container->getParameterBag()->resolveValue($def->getClass());
+            $interface = 'Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface';
+
+            if (!is_subclass_of($class, $interface)) {
+                if (!class_exists($class, false)) {
+                    throw new \InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
+                }
+
+                throw new \InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, $interface));
+            }
+
+            foreach ($tags as $tag) {
+                if (!isset($tag['alias'])) {
+                    @trigger_error(sprintf('Service "%s" will have to define the "alias" attribute on the "%s" tag as of Symfony 3.0.', $id, $this->rendererTag), E_USER_DEPRECATED);
+
+                    // register the handler as a non-lazy-loaded one
+                    $definition->addMethodCall('addRenderer', array(new Reference($id)));
+                } else {
+                    $definition->addMethodCall('addRendererService', array($tag['alias'], $id));
+                }
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php
@@ -0,0 +1,78 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpKernel\Fragment\FragmentHandler;
+
+/**
+ * Lazily loads fragment renderers from the dependency injection container.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class LazyLoadingFragmentHandler extends FragmentHandler
+{
+    private $container;
+    private $rendererIds = array();
+
+    /**
+     * Constructor.
+     *
+     * RequestStack will become required in 3.0.
+     *
+     * @param ContainerInterface $container    A container
+     * @param RequestStack       $requestStack The Request stack that controls the lifecycle of requests
+     * @param bool               $debug        Whether the debug mode is enabled or not
+     */
+    public function __construct(ContainerInterface $container, $requestStack = null, $debug = false)
+    {
+        $this->container = $container;
+
+        if ((null !== $requestStack && !$requestStack instanceof RequestStack) || $debug instanceof RequestStack) {
+            $tmp = $debug;
+            $debug = $requestStack;
+            $requestStack = func_num_args() < 3 ? null : $tmp;
+
+            @trigger_error('The '.__METHOD__.' method now requires a RequestStack to be given as second argument as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+        } elseif (!$requestStack instanceof RequestStack) {
+            @trigger_error('The '.__METHOD__.' method now requires a RequestStack instance as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+        }
+
+        parent::__construct($requestStack, array(), $debug);
+    }
+
+    /**
+     * Adds a service as a fragment renderer.
+     *
+     * @param string $name     The service name
+     * @param string $renderer The render service id
+     */
+    public function addRendererService($name, $renderer)
+    {
+        $this->rendererIds[$name] = $renderer;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function render($uri, $renderer = 'inline', array $options = array())
+    {
+        if (isset($this->rendererIds[$renderer])) {
+            $this->addRenderer($this->container->get($this->rendererIds[$renderer]));
+
+            unset($this->rendererIds[$renderer]);
+        }
+
+        return parent::render($uri, $renderer, $options);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\Compiler\MergeExtensionConfigurationPass as BaseMergeExtensionConfigurationPass;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Ensures certain extensions are always loaded.
+ *
+ * @author Kris Wallsmith <kris@symfony.com>
+ */
+class MergeExtensionConfigurationPass extends BaseMergeExtensionConfigurationPass
+{
+    private $extensions;
+
+    public function __construct(array $extensions)
+    {
+        $this->extensions = $extensions;
+    }
+
+    public function process(ContainerBuilder $container)
+    {
+        foreach ($this->extensions as $extension) {
+            if (!count($container->getExtensionConfig($extension))) {
+                $container->loadFromExtension($extension, array());
+            }
+        }
+
+        parent::process($container);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/DependencyInjection/RegisterListenersPass.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DependencyInjection;
+
+@trigger_error('The '.__NAMESPACE__.'\RegisterListenersPass is deprecated since version 2.5 and will be removed in 3.0. Use the Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass class instead.', E_USER_DEPRECATED);
+
+use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass as BaseRegisterListenersPass;
+
+/**
+ * Compiler pass to register tagged services for an event dispatcher.
+ *
+ * @deprecated since version 2.5, to be removed in 3.0. Use the Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass class instead.
+ */
+class RegisterListenersPass extends BaseRegisterListenersPass
+{
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Event/FilterControllerEvent.php
@@ -0,0 +1,102 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Event;
+
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Allows filtering of a controller callable.
+ *
+ * You can call getController() to retrieve the current controller. With
+ * setController() you can set a new controller that is used in the processing
+ * of the request.
+ *
+ * Controllers should be callables.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class FilterControllerEvent extends KernelEvent
+{
+    /**
+     * The current controller.
+     */
+    private $controller;
+
+    public function __construct(HttpKernelInterface $kernel, $controller, Request $request, $requestType)
+    {
+        parent::__construct($kernel, $request, $requestType);
+
+        $this->setController($controller);
+    }
+
+    /**
+     * Returns the current controller.
+     *
+     * @return callable
+     */
+    public function getController()
+    {
+        return $this->controller;
+    }
+
+    /**
+     * Sets a new controller.
+     *
+     * @param callable $controller
+     *
+     * @throws \LogicException
+     */
+    public function setController($controller)
+    {
+        // controller must be a callable
+        if (!is_callable($controller)) {
+            throw new \LogicException(sprintf('The controller must be a callable (%s given).', $this->varToString($controller)));
+        }
+
+        $this->controller = $controller;
+    }
+
+    private function varToString($var)
+    {
+        if (is_object($var)) {
+            return sprintf('Object(%s)', get_class($var));
+        }
+
+        if (is_array($var)) {
+            $a = array();
+            foreach ($var as $k => $v) {
+                $a[] = sprintf('%s => %s', $k, $this->varToString($v));
+            }
+
+            return sprintf('Array(%s)', implode(', ', $a));
+        }
+
+        if (is_resource($var)) {
+            return sprintf('Resource(%s)', get_resource_type($var));
+        }
+
+        if (null === $var) {
+            return 'null';
+        }
+
+        if (false === $var) {
+            return 'false';
+        }
+
+        if (true === $var) {
+            return 'true';
+        }
+
+        return (string) $var;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Event/FilterResponseEvent.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Event;
+
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * Allows to filter a Response object.
+ *
+ * You can call getResponse() to retrieve the current response. With
+ * setResponse() you can set a new response that will be returned to the
+ * browser.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class FilterResponseEvent extends KernelEvent
+{
+    /**
+     * The current response object.
+     *
+     * @var Response
+     */
+    private $response;
+
+    public function __construct(HttpKernelInterface $kernel, Request $request, $requestType, Response $response)
+    {
+        parent::__construct($kernel, $request, $requestType);
+
+        $this->setResponse($response);
+    }
+
+    /**
+     * Returns the current response object.
+     *
+     * @return Response
+     */
+    public function getResponse()
+    {
+        return $this->response;
+    }
+
+    /**
+     * Sets a new response object.
+     *
+     * @param Response $response
+     */
+    public function setResponse(Response $response)
+    {
+        $this->response = $response;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Event/FinishRequestEvent.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Event;
+
+/**
+ * Triggered whenever a request is fully processed.
+ *
+ * @author Benjamin Eberlei <kontakt@beberlei.de>
+ */
+class FinishRequestEvent extends KernelEvent
+{
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Event/GetResponseEvent.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Event;
+
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * Allows to create a response for a request.
+ *
+ * Call setResponse() to set the response that will be returned for the
+ * current request. The propagation of this event is stopped as soon as a
+ * response is set.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class GetResponseEvent extends KernelEvent
+{
+    /**
+     * The response object.
+     *
+     * @var Response
+     */
+    private $response;
+
+    /**
+     * Returns the response object.
+     *
+     * @return Response
+     */
+    public function getResponse()
+    {
+        return $this->response;
+    }
+
+    /**
+     * Sets a response and stops event propagation.
+     *
+     * @param Response $response
+     */
+    public function setResponse(Response $response)
+    {
+        $this->response = $response;
+
+        $this->stopPropagation();
+    }
+
+    /**
+     * Returns whether a response was set.
+     *
+     * @return bool Whether a response was set
+     */
+    public function hasResponse()
+    {
+        return null !== $this->response;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Event/GetResponseForControllerResultEvent.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Event;
+
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Allows to create a response for the return value of a controller.
+ *
+ * Call setResponse() to set the response that will be returned for the
+ * current request. The propagation of this event is stopped as soon as a
+ * response is set.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class GetResponseForControllerResultEvent extends GetResponseEvent
+{
+    /**
+     * The return value of the controller.
+     *
+     * @var mixed
+     */
+    private $controllerResult;
+
+    public function __construct(HttpKernelInterface $kernel, Request $request, $requestType, $controllerResult)
+    {
+        parent::__construct($kernel, $request, $requestType);
+
+        $this->controllerResult = $controllerResult;
+    }
+
+    /**
+     * Returns the return value of the controller.
+     *
+     * @return mixed The controller return value
+     */
+    public function getControllerResult()
+    {
+        return $this->controllerResult;
+    }
+
+    /**
+     * Assigns the return value of the controller.
+     *
+     * @param mixed $controllerResult The controller return value
+     */
+    public function setControllerResult($controllerResult)
+    {
+        $this->controllerResult = $controllerResult;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Event/GetResponseForExceptionEvent.php
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Event;
+
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Allows to create a response for a thrown exception.
+ *
+ * Call setResponse() to set the response that will be returned for the
+ * current request. The propagation of this event is stopped as soon as a
+ * response is set.
+ *
+ * You can also call setException() to replace the thrown exception. This
+ * exception will be thrown if no response is set during processing of this
+ * event.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class GetResponseForExceptionEvent extends GetResponseEvent
+{
+    /**
+     * The exception object.
+     *
+     * @var \Exception
+     */
+    private $exception;
+
+    public function __construct(HttpKernelInterface $kernel, Request $request, $requestType, \Exception $e)
+    {
+        parent::__construct($kernel, $request, $requestType);
+
+        $this->setException($e);
+    }
+
+    /**
+     * Returns the thrown exception.
+     *
+     * @return \Exception The thrown exception
+     */
+    public function getException()
+    {
+        return $this->exception;
+    }
+
+    /**
+     * Replaces the thrown exception.
+     *
+     * This exception will be thrown if no response is set in the event.
+     *
+     * @param \Exception $exception The thrown exception
+     */
+    public function setException(\Exception $exception)
+    {
+        $this->exception = $exception;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Event/KernelEvent.php
@@ -0,0 +1,94 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Event;
+
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Base class for events thrown in the HttpKernel component.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class KernelEvent extends Event
+{
+    /**
+     * The kernel in which this event was thrown.
+     *
+     * @var HttpKernelInterface
+     */
+    private $kernel;
+
+    /**
+     * The request the kernel is currently processing.
+     *
+     * @var Request
+     */
+    private $request;
+
+    /**
+     * The request type the kernel is currently processing.  One of
+     * HttpKernelInterface::MASTER_REQUEST and HttpKernelInterface::SUB_REQUEST.
+     *
+     * @var int
+     */
+    private $requestType;
+
+    public function __construct(HttpKernelInterface $kernel, Request $request, $requestType)
+    {
+        $this->kernel = $kernel;
+        $this->request = $request;
+        $this->requestType = $requestType;
+    }
+
+    /**
+     * Returns the kernel in which this event was thrown.
+     *
+     * @return HttpKernelInterface
+     */
+    public function getKernel()
+    {
+        return $this->kernel;
+    }
+
+    /**
+     * Returns the request the kernel is currently processing.
+     *
+     * @return Request
+     */
+    public function getRequest()
+    {
+        return $this->request;
+    }
+
+    /**
+     * Returns the request type the kernel is currently processing.
+     *
+     * @return int One of HttpKernelInterface::MASTER_REQUEST and
+     *             HttpKernelInterface::SUB_REQUEST
+     */
+    public function getRequestType()
+    {
+        return $this->requestType;
+    }
+
+    /**
+     * Checks if this is a master request.
+     *
+     * @return bool True if the request is a master request
+     */
+    public function isMasterRequest()
+    {
+        return HttpKernelInterface::MASTER_REQUEST === $this->requestType;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Event/PostResponseEvent.php
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Event;
+
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * Allows to execute logic after a response was sent.
+ *
+ * Since it's only triggered on master requests, the `getRequestType()` method
+ * will always return the value of `HttpKernelInterface::MASTER_REQUEST`.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class PostResponseEvent extends KernelEvent
+{
+    private $response;
+
+    public function __construct(HttpKernelInterface $kernel, Request $request, Response $response)
+    {
+        parent::__construct($kernel, $request, HttpKernelInterface::MASTER_REQUEST);
+
+        $this->response = $response;
+    }
+
+    /**
+     * Returns the response for which this event was thrown.
+     *
+     * @return Response
+     */
+    public function getResponse()
+    {
+        return $this->response;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/AddRequestFormatsListener.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+
+/**
+ * Adds configured formats to each request.
+ *
+ * @author Gildas Quemener <gildas.quemener@gmail.com>
+ */
+class AddRequestFormatsListener implements EventSubscriberInterface
+{
+    /**
+     * @var array
+     */
+    protected $formats;
+
+    /**
+     * @param array $formats
+     */
+    public function __construct(array $formats)
+    {
+        $this->formats = $formats;
+    }
+
+    /**
+     * Adds request formats.
+     *
+     * @param GetResponseEvent $event
+     */
+    public function onKernelRequest(GetResponseEvent $event)
+    {
+        foreach ($this->formats as $format => $mimeTypes) {
+            $event->getRequest()->setFormat($format, $mimeTypes);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public static function getSubscribedEvents()
+    {
+        return array(KernelEvents::REQUEST => 'onKernelRequest');
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/DebugHandlersListener.php
@@ -0,0 +1,138 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Debug\ErrorHandler;
+use Symfony\Component\Debug\ExceptionHandler;
+use Symfony\Component\EventDispatcher\Event;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\Event\KernelEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\Console\ConsoleEvents;
+use Symfony\Component\Console\Event\ConsoleEvent;
+use Symfony\Component\Console\Output\ConsoleOutputInterface;
+
+/**
+ * Configures errors and exceptions handlers.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class DebugHandlersListener implements EventSubscriberInterface
+{
+    private $exceptionHandler;
+    private $logger;
+    private $levels;
+    private $throwAt;
+    private $scream;
+    private $fileLinkFormat;
+    private $firstCall = true;
+
+    /**
+     * @param callable|null        $exceptionHandler A handler that will be called on Exception
+     * @param LoggerInterface|null $logger           A PSR-3 logger
+     * @param array|int            $levels           An array map of E_* to LogLevel::* or an integer bit field of E_* constants
+     * @param int|null             $throwAt          Thrown errors in a bit field of E_* constants, or null to keep the current value
+     * @param bool                 $scream           Enables/disables screaming mode, where even silenced errors are logged
+     * @param string               $fileLinkFormat   The format for links to source files
+     */
+    public function __construct($exceptionHandler, LoggerInterface $logger = null, $levels = null, $throwAt = -1, $scream = true, $fileLinkFormat = null)
+    {
+        $this->exceptionHandler = $exceptionHandler;
+        $this->logger = $logger;
+        $this->levels = $levels;
+        $this->throwAt = is_numeric($throwAt) ? (int) $throwAt : (null === $throwAt ? null : ($throwAt ? -1 : null));
+        $this->scream = (bool) $scream;
+        $this->fileLinkFormat = $fileLinkFormat ?: ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format');
+    }
+
+    /**
+     * Configures the error handler.
+     *
+     * @param Event|null $event The triggering event
+     */
+    public function configure(Event $event = null)
+    {
+        if (!$this->firstCall) {
+            return;
+        }
+        $this->firstCall = false;
+        if ($this->logger || null !== $this->throwAt) {
+            $handler = set_error_handler('var_dump');
+            $handler = is_array($handler) ? $handler[0] : null;
+            restore_error_handler();
+            if ($handler instanceof ErrorHandler) {
+                if ($this->logger) {
+                    $handler->setDefaultLogger($this->logger, $this->levels);
+                    if (is_array($this->levels)) {
+                        $scream = 0;
+                        foreach ($this->levels as $type => $log) {
+                            $scream |= $type;
+                        }
+                    } else {
+                        $scream = null === $this->levels ? E_ALL | E_STRICT : $this->levels;
+                    }
+                    if ($this->scream) {
+                        $handler->screamAt($scream);
+                    }
+                    $this->logger = $this->levels = null;
+                }
+                if (null !== $this->throwAt) {
+                    $handler->throwAt($this->throwAt, true);
+                }
+            }
+        }
+        if (!$this->exceptionHandler) {
+            if ($event instanceof KernelEvent) {
+                if (method_exists($event->getKernel(), 'terminateWithException')) {
+                    $this->exceptionHandler = array($event->getKernel(), 'terminateWithException');
+                }
+            } elseif ($event instanceof ConsoleEvent && $app = $event->getCommand()->getApplication()) {
+                $output = $event->getOutput();
+                if ($output instanceof ConsoleOutputInterface) {
+                    $output = $output->getErrorOutput();
+                }
+                $this->exceptionHandler = function ($e) use ($app, $output) {
+                    $app->renderException($e, $output);
+                };
+            }
+        }
+        if ($this->exceptionHandler) {
+            $handler = set_exception_handler('var_dump');
+            $handler = is_array($handler) ? $handler[0] : null;
+            restore_exception_handler();
+            if ($handler instanceof ErrorHandler) {
+                $h = $handler->setExceptionHandler('var_dump') ?: $this->exceptionHandler;
+                $handler->setExceptionHandler($h);
+                $handler = is_array($h) ? $h[0] : null;
+            }
+            if ($handler instanceof ExceptionHandler) {
+                $handler->setHandler($this->exceptionHandler);
+                if (null !== $this->fileLinkFormat) {
+                    $handler->setFileLinkFormat($this->fileLinkFormat);
+                }
+            }
+            $this->exceptionHandler = null;
+        }
+    }
+
+    public static function getSubscribedEvents()
+    {
+        $events = array(KernelEvents::REQUEST => array('configure', 2048));
+
+        if (defined('Symfony\Component\Console\ConsoleEvents::COMMAND')) {
+            $events[ConsoleEvents::COMMAND] = array('configure', 2048);
+        }
+
+        return $events;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/DumpListener.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+use Symfony\Component\Console\ConsoleEvents;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\VarDumper\Cloner\ClonerInterface;
+use Symfony\Component\VarDumper\Dumper\DataDumperInterface;
+use Symfony\Component\VarDumper\VarDumper;
+
+/**
+ * Configures dump() handler.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class DumpListener implements EventSubscriberInterface
+{
+    private $cloner;
+    private $dumper;
+
+    /**
+     * @param ClonerInterface     $cloner Cloner service
+     * @param DataDumperInterface $dumper Dumper service
+     */
+    public function __construct(ClonerInterface $cloner, DataDumperInterface $dumper)
+    {
+        $this->cloner = $cloner;
+        $this->dumper = $dumper;
+    }
+
+    public function configure()
+    {
+        $cloner = $this->cloner;
+        $dumper = $this->dumper;
+
+        VarDumper::setHandler(function ($var) use ($cloner, $dumper) {
+            $dumper->dump($cloner->cloneVar($var));
+        });
+    }
+
+    public static function getSubscribedEvents()
+    {
+        // Register early to have a working dump() as early as possible
+        return array(ConsoleEvents::COMMAND => array('configure', 1024));
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/ErrorsLoggerListener.php
@@ -0,0 +1,52 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+@trigger_error('The '.__NAMESPACE__.'\ErrorsLoggerListener class is deprecated since version 2.6 and will be removed in 3.0. Use the Symfony\Component\HttpKernel\EventListener\DebugHandlersListener class instead.', E_USER_DEPRECATED);
+
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Debug\ErrorHandler;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\KernelEvents;
+
+/**
+ * Injects the logger into the ErrorHandler, so that it can log various errors.
+ *
+ * @author Colin Frei <colin@colinfrei.com>
+ * @author Konstantin Myakshin <koc-dp@yandex.ru>
+ *
+ * @deprecated since version 2.6, to be removed in 3.0. Use the DebugHandlersListener class instead.
+ */
+class ErrorsLoggerListener implements EventSubscriberInterface
+{
+    private $channel;
+    private $logger;
+
+    public function __construct($channel, LoggerInterface $logger = null)
+    {
+        $this->channel = $channel;
+        $this->logger = $logger;
+    }
+
+    public function injectLogger()
+    {
+        if (null !== $this->logger) {
+            ErrorHandler::setLogger($this->logger, $this->channel);
+            $this->logger = null;
+        }
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return array(KernelEvents::REQUEST => array('injectLogger', 2048));
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/EsiListener.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+@trigger_error('The '.__NAMESPACE__.'\EsiListener class is deprecated since version 2.6 and will be removed in 3.0. Use the Symfony\Component\HttpKernel\EventListener\SurrogateListener class instead.', E_USER_DEPRECATED);
+
+/**
+ * EsiListener adds a Surrogate-Control HTTP header when the Response needs to be parsed for ESI.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 2.6, to be removed in 3.0. Use SurrogateListener instead
+ */
+class EsiListener extends SurrogateListener
+{
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/ExceptionListener.php
@@ -0,0 +1,120 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Debug\Exception\FlattenException;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
+use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * ExceptionListener.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ExceptionListener implements EventSubscriberInterface
+{
+    protected $controller;
+    protected $logger;
+
+    public function __construct($controller, LoggerInterface $logger = null)
+    {
+        $this->controller = $controller;
+        $this->logger = $logger;
+    }
+
+    public function onKernelException(GetResponseForExceptionEvent $event)
+    {
+        $exception = $event->getException();
+        $request = $event->getRequest();
+
+        $this->logException($exception, sprintf('Uncaught PHP Exception %s: "%s" at %s line %s', get_class($exception), $exception->getMessage(), $exception->getFile(), $exception->getLine()));
+
+        $request = $this->duplicateRequest($exception, $request);
+
+        try {
+            $response = $event->getKernel()->handle($request, HttpKernelInterface::SUB_REQUEST, false);
+        } catch (\Exception $e) {
+            $this->logException($e, sprintf('Exception thrown when handling an exception (%s: %s at %s line %s)', get_class($e), $e->getMessage(), $e->getFile(), $e->getLine()));
+
+            $wrapper = $e;
+
+            while ($prev = $wrapper->getPrevious()) {
+                if ($exception === $wrapper = $prev) {
+                    throw $e;
+                }
+            }
+
+            $prev = new \ReflectionProperty('Exception', 'previous');
+            $prev->setAccessible(true);
+            $prev->setValue($wrapper, $exception);
+
+            throw $e;
+        }
+
+        $event->setResponse($response);
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return array(
+            KernelEvents::EXCEPTION => array('onKernelException', -128),
+        );
+    }
+
+    /**
+     * Logs an exception.
+     *
+     * @param \Exception $exception The \Exception instance
+     * @param string     $message   The error message to log
+     */
+    protected function logException(\Exception $exception, $message)
+    {
+        if (null !== $this->logger) {
+            if (!$exception instanceof HttpExceptionInterface || $exception->getStatusCode() >= 500) {
+                $this->logger->critical($message, array('exception' => $exception));
+            } else {
+                $this->logger->error($message, array('exception' => $exception));
+            }
+        }
+    }
+
+    /**
+     * Clones the request for the exception.
+     *
+     * @param \Exception $exception The thrown exception
+     * @param Request    $request   The original request
+     *
+     * @return Request $request The cloned request
+     */
+    protected function duplicateRequest(\Exception $exception, Request $request)
+    {
+        $attributes = array(
+            '_controller' => $this->controller,
+            'exception' => FlattenException::create($exception),
+            'logger' => $this->logger instanceof DebugLoggerInterface ? $this->logger : null,
+            // keep for BC -- as $format can be an argument of the controller callable
+            // see src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php
+            // @deprecated since version 2.4, to be removed in 3.0
+            'format' => $request->getRequestFormat(),
+        );
+        $request = $request->duplicate(null, null, $attributes);
+        $request->setMethod('GET');
+
+        return $request;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/FragmentListener.php
@@ -0,0 +1,115 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
+use Symfony\Component\HttpKernel\UriSigner;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Handles content fragments represented by special URIs.
+ *
+ * All URL paths starting with /_fragment are handled as
+ * content fragments by this listener.
+ *
+ * If throws an AccessDeniedHttpException exception if the request
+ * is not signed or if it is not an internal sub-request.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class FragmentListener implements EventSubscriberInterface
+{
+    private $signer;
+    private $fragmentPath;
+
+    /**
+     * Constructor.
+     *
+     * @param UriSigner $signer       A UriSigner instance
+     * @param string    $fragmentPath The path that triggers this listener
+     */
+    public function __construct(UriSigner $signer, $fragmentPath = '/_fragment')
+    {
+        $this->signer = $signer;
+        $this->fragmentPath = $fragmentPath;
+    }
+
+    /**
+     * Fixes request attributes when the path is '/_fragment'.
+     *
+     * @param GetResponseEvent $event A GetResponseEvent instance
+     *
+     * @throws AccessDeniedHttpException if the request does not come from a trusted IP.
+     */
+    public function onKernelRequest(GetResponseEvent $event)
+    {
+        $request = $event->getRequest();
+
+        if ($this->fragmentPath !== rawurldecode($request->getPathInfo())) {
+            return;
+        }
+
+        if ($request->attributes->has('_controller')) {
+            // Is a sub-request: no need to parse _path but it should still be removed from query parameters as below.
+            $request->query->remove('_path');
+
+            return;
+        }
+
+        if ($event->isMasterRequest()) {
+            $this->validateRequest($request);
+        }
+
+        parse_str($request->query->get('_path', ''), $attributes);
+        $request->attributes->add($attributes);
+        $request->attributes->set('_route_params', array_replace($request->attributes->get('_route_params', array()), $attributes));
+        $request->query->remove('_path');
+    }
+
+    protected function validateRequest(Request $request)
+    {
+        // is the Request safe?
+        if (!$request->isMethodSafe()) {
+            throw new AccessDeniedHttpException();
+        }
+
+        // is the Request signed?
+        // we cannot use $request->getUri() here as we want to work with the original URI (no query string reordering)
+        if ($this->signer->check($request->getSchemeAndHttpHost().$request->getBaseUrl().$request->getPathInfo().(null !== ($qs = $request->server->get('QUERY_STRING')) ? '?'.$qs : ''))) {
+            return;
+        }
+
+        throw new AccessDeniedHttpException();
+    }
+
+    /**
+     * @deprecated since version 2.3.19, to be removed in 3.0.
+     *
+     * @return string[]
+     */
+    protected function getLocalIpAddresses()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.3.19 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        return array('127.0.0.1', 'fe80::1', '::1');
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return array(
+            KernelEvents::REQUEST => array(array('onKernelRequest', 48)),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/LocaleListener.php
@@ -0,0 +1,139 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\RequestContextAwareInterface;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Initializes the locale based on the current request.
+ *
+ * This listener works in 2 modes:
+ *
+ *  * 2.3 compatibility mode where you must call setRequest whenever the Request changes.
+ *  * 2.4+ mode where you must pass a RequestStack instance in the constructor.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class LocaleListener implements EventSubscriberInterface
+{
+    private $router;
+    private $defaultLocale;
+    private $requestStack;
+
+    /**
+     * Constructor.
+     *
+     * RequestStack will become required in 3.0.
+     *
+     * @param RequestStack                      $requestStack  A RequestStack instance
+     * @param string                            $defaultLocale The default locale
+     * @param RequestContextAwareInterface|null $router        The router
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function __construct($requestStack = null, $defaultLocale = 'en', $router = null)
+    {
+        if ((null !== $requestStack && !$requestStack instanceof RequestStack) || $defaultLocale instanceof RequestContextAwareInterface || $router instanceof RequestStack) {
+            $tmp = $router;
+            $router = func_num_args() < 2 ? null : $defaultLocale;
+            $defaultLocale = $requestStack;
+            $requestStack = func_num_args() < 3 ? null : $tmp;
+
+            @trigger_error('The '.__METHOD__.' method now requires a RequestStack to be given as first argument as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+        } elseif (!$requestStack instanceof RequestStack) {
+            @trigger_error('The '.__METHOD__.' method now requires a RequestStack instance as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+        }
+
+        if (null !== $requestStack && !$requestStack instanceof RequestStack) {
+            throw new \InvalidArgumentException('RequestStack instance expected.');
+        }
+        if (null !== $router && !$router instanceof RequestContextAwareInterface) {
+            throw new \InvalidArgumentException('Router must implement RequestContextAwareInterface.');
+        }
+
+        $this->defaultLocale = $defaultLocale;
+        $this->requestStack = $requestStack;
+        $this->router = $router;
+    }
+
+    /**
+     * Sets the current Request.
+     *
+     * This method was used to synchronize the Request, but as the HttpKernel
+     * is doing that automatically now, you should never call it directly.
+     * It is kept public for BC with the 2.3 version.
+     *
+     * @param Request|null $request A Request instance
+     *
+     * @deprecated since version 2.4, to be removed in 3.0.
+     */
+    public function setRequest(Request $request = null)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.4 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        if (null === $request) {
+            return;
+        }
+
+        $this->setLocale($request);
+        $this->setRouterContext($request);
+    }
+
+    public function onKernelRequest(GetResponseEvent $event)
+    {
+        $request = $event->getRequest();
+        $request->setDefaultLocale($this->defaultLocale);
+
+        $this->setLocale($request);
+        $this->setRouterContext($request);
+    }
+
+    public function onKernelFinishRequest(FinishRequestEvent $event)
+    {
+        if (null === $this->requestStack) {
+            return; // removed when requestStack is required
+        }
+
+        if (null !== $parentRequest = $this->requestStack->getParentRequest()) {
+            $this->setRouterContext($parentRequest);
+        }
+    }
+
+    private function setLocale(Request $request)
+    {
+        if ($locale = $request->attributes->get('_locale')) {
+            $request->setLocale($locale);
+        }
+    }
+
+    private function setRouterContext(Request $request)
+    {
+        if (null !== $this->router) {
+            $this->router->getContext()->setParameter('_locale', $request->getLocale());
+        }
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return array(
+            // must be registered after the Router to have access to the _locale
+            KernelEvents::REQUEST => array(array('onKernelRequest', 16)),
+            KernelEvents::FINISH_REQUEST => array(array('onKernelFinishRequest', 0)),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/ProfilerListener.php
@@ -0,0 +1,177 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpKernel\Event\PostResponseEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpKernel\Profiler\Profiler;
+use Symfony\Component\HttpFoundation\RequestMatcherInterface;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * ProfilerListener collects data for the current request by listening to the kernel events.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ProfilerListener implements EventSubscriberInterface
+{
+    protected $profiler;
+    protected $matcher;
+    protected $onlyException;
+    protected $onlyMasterRequests;
+    protected $exception;
+    protected $requests = array();
+    protected $profiles;
+    protected $requestStack;
+    protected $parents;
+
+    /**
+     * Constructor.
+     *
+     * @param Profiler                     $profiler           A Profiler instance
+     * @param RequestStack                 $requestStack       A RequestStack instance
+     * @param RequestMatcherInterface|null $matcher            A RequestMatcher instance
+     * @param bool                         $onlyException      true if the profiler only collects data when an exception occurs, false otherwise
+     * @param bool                         $onlyMasterRequests true if the profiler only collects data when the request is a master request, false otherwise
+     */
+    public function __construct(Profiler $profiler, $requestStack = null, $matcher = null, $onlyException = false, $onlyMasterRequests = false)
+    {
+        if ($requestStack instanceof RequestMatcherInterface || (null !== $matcher && !$matcher instanceof RequestMatcherInterface) || $onlyMasterRequests instanceof RequestStack) {
+            $tmp = $onlyMasterRequests;
+            $onlyMasterRequests = $onlyException;
+            $onlyException = $matcher;
+            $matcher = $requestStack;
+            $requestStack = func_num_args() < 5 ? null : $tmp;
+
+            @trigger_error('The '.__METHOD__.' method now requires a RequestStack to be given as second argument as '.__CLASS__.'::onKernelRequest method will be removed in 3.0.', E_USER_DEPRECATED);
+        } elseif (!$requestStack instanceof RequestStack) {
+            @trigger_error('The '.__METHOD__.' method now requires a RequestStack instance as '.__CLASS__.'::onKernelRequest method will be removed in 3.0.', E_USER_DEPRECATED);
+        }
+
+        if (null !== $requestStack && !$requestStack instanceof RequestStack) {
+            throw new \InvalidArgumentException('RequestStack instance expected.');
+        }
+        if (null !== $matcher && !$matcher instanceof RequestMatcherInterface) {
+            throw new \InvalidArgumentException('Matcher must implement RequestMatcherInterface.');
+        }
+
+        $this->profiler = $profiler;
+        $this->matcher = $matcher;
+        $this->onlyException = (bool) $onlyException;
+        $this->onlyMasterRequests = (bool) $onlyMasterRequests;
+        $this->profiles = new \SplObjectStorage();
+        $this->parents = new \SplObjectStorage();
+        $this->requestStack = $requestStack;
+    }
+
+    /**
+     * Handles the onKernelException event.
+     *
+     * @param GetResponseForExceptionEvent $event A GetResponseForExceptionEvent instance
+     */
+    public function onKernelException(GetResponseForExceptionEvent $event)
+    {
+        if ($this->onlyMasterRequests && !$event->isMasterRequest()) {
+            return;
+        }
+
+        $this->exception = $event->getException();
+    }
+
+    /**
+     * @deprecated since version 2.4, to be removed in 3.0.
+     */
+    public function onKernelRequest(GetResponseEvent $event)
+    {
+        if (null === $this->requestStack) {
+            $this->requests[] = $event->getRequest();
+        }
+    }
+
+    /**
+     * Handles the onKernelResponse event.
+     *
+     * @param FilterResponseEvent $event A FilterResponseEvent instance
+     */
+    public function onKernelResponse(FilterResponseEvent $event)
+    {
+        $master = $event->isMasterRequest();
+        if ($this->onlyMasterRequests && !$master) {
+            return;
+        }
+
+        if ($this->onlyException && null === $this->exception) {
+            return;
+        }
+
+        $request = $event->getRequest();
+        $exception = $this->exception;
+        $this->exception = null;
+
+        if (null !== $this->matcher && !$this->matcher->matches($request)) {
+            return;
+        }
+
+        if (!$profile = $this->profiler->collect($request, $event->getResponse(), $exception)) {
+            return;
+        }
+
+        $this->profiles[$request] = $profile;
+
+        if (null !== $this->requestStack) {
+            $this->parents[$request] = $this->requestStack->getParentRequest();
+        } elseif (!$master) {
+            // to be removed when requestStack is required
+            array_pop($this->requests);
+
+            $this->parents[$request] = end($this->requests);
+        }
+    }
+
+    public function onKernelTerminate(PostResponseEvent $event)
+    {
+        // attach children to parents
+        foreach ($this->profiles as $request) {
+            // isset call should be removed when requestStack is required
+            if (isset($this->parents[$request]) && null !== $parentRequest = $this->parents[$request]) {
+                if (isset($this->profiles[$parentRequest])) {
+                    $this->profiles[$parentRequest]->addChild($this->profiles[$request]);
+                }
+            }
+        }
+
+        // save profiles
+        foreach ($this->profiles as $request) {
+            $this->profiler->saveProfile($this->profiles[$request]);
+        }
+
+        $this->profiles = new \SplObjectStorage();
+        $this->parents = new \SplObjectStorage();
+        $this->requests = array();
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return array(
+            // kernel.request must be registered as early as possible to not break
+            // when an exception is thrown in any other kernel.request listener
+            KernelEvents::REQUEST => array('onKernelRequest', 1024),
+            KernelEvents::RESPONSE => array('onKernelResponse', -100),
+            KernelEvents::EXCEPTION => 'onKernelException',
+            KernelEvents::TERMINATE => array('onKernelTerminate', -1024),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/ResponseListener.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * ResponseListener fixes the Response headers based on the Request.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ResponseListener implements EventSubscriberInterface
+{
+    private $charset;
+
+    public function __construct($charset)
+    {
+        $this->charset = $charset;
+    }
+
+    /**
+     * Filters the Response.
+     *
+     * @param FilterResponseEvent $event A FilterResponseEvent instance
+     */
+    public function onKernelResponse(FilterResponseEvent $event)
+    {
+        if (!$event->isMasterRequest()) {
+            return;
+        }
+
+        $response = $event->getResponse();
+
+        if (null === $response->getCharset()) {
+            $response->setCharset($this->charset);
+        }
+
+        $response->prepare($event->getRequest());
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return array(
+            KernelEvents::RESPONSE => 'onKernelResponse',
+        );
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/RouterListener.php
@@ -0,0 +1,191 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+use Psr\Log\LoggerInterface;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\Routing\Exception\MethodNotAllowedException;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
+use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
+use Symfony\Component\Routing\RequestContext;
+use Symfony\Component\Routing\RequestContextAwareInterface;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Initializes the context from the request and sets request attributes based on a matching route.
+ *
+ * This listener works in 2 modes:
+ *
+ *  * 2.3 compatibility mode where you must call setRequest whenever the Request changes.
+ *  * 2.4+ mode where you must pass a RequestStack instance in the constructor.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class RouterListener implements EventSubscriberInterface
+{
+    private $matcher;
+    private $context;
+    private $logger;
+    private $request;
+    private $requestStack;
+
+    /**
+     * Constructor.
+     *
+     * RequestStack will become required in 3.0.
+     *
+     * @param UrlMatcherInterface|RequestMatcherInterface $matcher      The Url or Request matcher
+     * @param RequestStack                                $requestStack A RequestStack instance
+     * @param RequestContext|null                         $context      The RequestContext (can be null when $matcher implements RequestContextAwareInterface)
+     * @param LoggerInterface|null                        $logger       The logger
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function __construct($matcher, $requestStack = null, $context = null, $logger = null)
+    {
+        if ($requestStack instanceof RequestContext || $context instanceof LoggerInterface || $logger instanceof RequestStack) {
+            $tmp = $requestStack;
+            $requestStack = $logger;
+            $logger = $context;
+            $context = $tmp;
+
+            @trigger_error('The '.__METHOD__.' method now requires a RequestStack to be given as second argument as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+        } elseif (!$requestStack instanceof RequestStack) {
+            @trigger_error('The '.__METHOD__.' method now requires a RequestStack instance as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+        }
+
+        if (null !== $requestStack && !$requestStack instanceof RequestStack) {
+            throw new \InvalidArgumentException('RequestStack instance expected.');
+        }
+        if (null !== $context && !$context instanceof RequestContext) {
+            throw new \InvalidArgumentException('RequestContext instance expected.');
+        }
+        if (null !== $logger && !$logger instanceof LoggerInterface) {
+            throw new \InvalidArgumentException('Logger must implement LoggerInterface.');
+        }
+
+        if (!$matcher instanceof UrlMatcherInterface && !$matcher instanceof RequestMatcherInterface) {
+            throw new \InvalidArgumentException('Matcher must either implement UrlMatcherInterface or RequestMatcherInterface.');
+        }
+
+        if (null === $context && !$matcher instanceof RequestContextAwareInterface) {
+            throw new \InvalidArgumentException('You must either pass a RequestContext or the matcher must implement RequestContextAwareInterface.');
+        }
+
+        $this->matcher = $matcher;
+        $this->context = $context ?: $matcher->getContext();
+        $this->requestStack = $requestStack;
+        $this->logger = $logger;
+    }
+
+    /**
+     * Sets the current Request.
+     *
+     * This method was used to synchronize the Request, but as the HttpKernel
+     * is doing that automatically now, you should never call it directly.
+     * It is kept public for BC with the 2.3 version.
+     *
+     * @param Request|null $request A Request instance
+     *
+     * @deprecated since version 2.4, to be removed in 3.0.
+     */
+    public function setRequest(Request $request = null)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.4 and will be made private in 3.0.', E_USER_DEPRECATED);
+
+        $this->setCurrentRequest($request);
+    }
+
+    private function setCurrentRequest(Request $request = null)
+    {
+        if (null !== $request && $this->request !== $request) {
+            $this->context->fromRequest($request);
+        }
+
+        $this->request = $request;
+    }
+
+    public function onKernelFinishRequest(FinishRequestEvent $event)
+    {
+        if (null === $this->requestStack) {
+            return; // removed when requestStack is required
+        }
+
+        $this->setCurrentRequest($this->requestStack->getParentRequest());
+    }
+
+    public function onKernelRequest(GetResponseEvent $event)
+    {
+        $request = $event->getRequest();
+
+        // initialize the context that is also used by the generator (assuming matcher and generator share the same context instance)
+        // we call setCurrentRequest even if most of the time, it has already been done to keep compatibility
+        // with frameworks which do not use the Symfony service container
+        // when we have a RequestStack, no need to do it
+        if (null !== $this->requestStack) {
+            $this->setCurrentRequest($request);
+        }
+
+        if ($request->attributes->has('_controller')) {
+            // routing is already done
+            return;
+        }
+
+        // add attributes based on the request (routing)
+        try {
+            // matching a request is more powerful than matching a URL path + context, so try that first
+            if ($this->matcher instanceof RequestMatcherInterface) {
+                $parameters = $this->matcher->matchRequest($request);
+            } else {
+                $parameters = $this->matcher->match($request->getPathInfo());
+            }
+
+            if (null !== $this->logger) {
+                $this->logger->info(sprintf('Matched route "%s".', isset($parameters['_route']) ? $parameters['_route'] : 'n/a'), array(
+                    'route_parameters' => $parameters,
+                    'request_uri' => $request->getUri(),
+                ));
+            }
+
+            $request->attributes->add($parameters);
+            unset($parameters['_route'], $parameters['_controller']);
+            $request->attributes->set('_route_params', $parameters);
+        } catch (ResourceNotFoundException $e) {
+            $message = sprintf('No route found for "%s %s"', $request->getMethod(), $request->getPathInfo());
+
+            if ($referer = $request->headers->get('referer')) {
+                $message .= sprintf(' (from "%s")', $referer);
+            }
+
+            throw new NotFoundHttpException($message, $e);
+        } catch (MethodNotAllowedException $e) {
+            $message = sprintf('No route found for "%s %s": Method Not Allowed (Allow: %s)', $request->getMethod(), $request->getPathInfo(), implode(', ', $e->getAllowedMethods()));
+
+            throw new MethodNotAllowedHttpException($e->getAllowedMethods(), $message, $e);
+        }
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return array(
+            KernelEvents::REQUEST => array(array('onKernelRequest', 32)),
+            KernelEvents::FINISH_REQUEST => array(array('onKernelFinishRequest', 0)),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/SaveSessionListener.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+
+/**
+ * Saves the session, in case it is still open, before sending the response/headers.
+ *
+ * This ensures several things in case the developer did not save the session explicitly:
+ *
+ *  * If a session save handler without locking is used, it ensures the data is available
+ *    on the next request, e.g. after a redirect. PHPs auto-save at script end via
+ *    session_register_shutdown is executed after fastcgi_finish_request. So in this case
+ *    the data could be missing the next request because it might not be saved the moment
+ *    the new request is processed.
+ *  * A locking save handler (e.g. the native 'files') circumvents concurrency problems like
+ *    the one above. But by saving the session before long-running things in the terminate event,
+ *    we ensure the session is not blocked longer than needed.
+ *  * When regenerating the session ID no locking is involved in PHPs session design. See
+ *    https://bugs.php.net/bug.php?id=61470 for a discussion. So in this case, the session must
+ *    be saved anyway before sending the headers with the new session ID. Otherwise session
+ *    data could get lost again for concurrent requests with the new ID. One result could be
+ *    that you get logged out after just logging in.
+ *
+ * This listener should be executed as one of the last listeners, so that previous listeners
+ * can still operate on the open session. This prevents the overhead of restarting it.
+ * Listeners after closing the session can still work with the session as usual because
+ * Symfonys session implementation starts the session on demand. So writing to it after
+ * it is saved will just restart it.
+ *
+ * @author Tobias Schultze <http://tobion.de>
+ */
+class SaveSessionListener implements EventSubscriberInterface
+{
+    public function onKernelResponse(FilterResponseEvent $event)
+    {
+        if (!$event->isMasterRequest()) {
+            return;
+        }
+
+        $session = $event->getRequest()->getSession();
+        if ($session && $session->isStarted()) {
+            $session->save();
+        }
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return array(
+            // low priority but higher than StreamedResponseListener
+            KernelEvents::RESPONSE => array(array('onKernelResponse', -1000)),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/SessionListener.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Sets the session in the request.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+abstract class SessionListener implements EventSubscriberInterface
+{
+    public function onKernelRequest(GetResponseEvent $event)
+    {
+        if (!$event->isMasterRequest()) {
+            return;
+        }
+
+        $request = $event->getRequest();
+        $session = $this->getSession();
+        if (null === $session || $request->hasSession()) {
+            return;
+        }
+
+        $request->setSession($session);
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return array(
+            KernelEvents::REQUEST => array('onKernelRequest', 128),
+        );
+    }
+
+    /**
+     * Gets the session object.
+     *
+     * @return SessionInterface|null A SessionInterface instance or null if no session is available
+     */
+    abstract protected function getSession();
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/StreamedResponseListener.php
@@ -0,0 +1,51 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+use Symfony\Component\HttpFoundation\StreamedResponse;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * StreamedResponseListener is responsible for sending the Response
+ * to the client.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class StreamedResponseListener implements EventSubscriberInterface
+{
+    /**
+     * Filters the Response.
+     *
+     * @param FilterResponseEvent $event A FilterResponseEvent instance
+     */
+    public function onKernelResponse(FilterResponseEvent $event)
+    {
+        if (!$event->isMasterRequest()) {
+            return;
+        }
+
+        $response = $event->getResponse();
+
+        if ($response instanceof StreamedResponse) {
+            $response->send();
+        }
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return array(
+            KernelEvents::RESPONSE => array('onKernelResponse', -1024),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/SurrogateListener.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpKernel\HttpCache\SurrogateInterface;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * SurrogateListener adds a Surrogate-Control HTTP header when the Response needs to be parsed for Surrogates.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class SurrogateListener implements EventSubscriberInterface
+{
+    private $surrogate;
+
+    /**
+     * Constructor.
+     *
+     * @param SurrogateInterface $surrogate An SurrogateInterface instance
+     */
+    public function __construct(SurrogateInterface $surrogate = null)
+    {
+        $this->surrogate = $surrogate;
+    }
+
+    /**
+     * Filters the Response.
+     *
+     * @param FilterResponseEvent $event A FilterResponseEvent instance
+     */
+    public function onKernelResponse(FilterResponseEvent $event)
+    {
+        if (!$event->isMasterRequest() || null === $this->surrogate) {
+            return;
+        }
+
+        $this->surrogate->addSurrogateControl($event->getResponse());
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return array(
+            KernelEvents::RESPONSE => 'onKernelResponse',
+        );
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/TestSessionListener.php
@@ -0,0 +1,83 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+use Symfony\Component\HttpFoundation\Cookie;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * TestSessionListener.
+ *
+ * Saves session in test environment.
+ *
+ * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class TestSessionListener implements EventSubscriberInterface
+{
+    public function onKernelRequest(GetResponseEvent $event)
+    {
+        if (!$event->isMasterRequest()) {
+            return;
+        }
+
+        // bootstrap the session
+        $session = $this->getSession();
+        if (!$session) {
+            return;
+        }
+
+        $cookies = $event->getRequest()->cookies;
+
+        if ($cookies->has($session->getName())) {
+            $session->setId($cookies->get($session->getName()));
+        }
+    }
+
+    /**
+     * Checks if session was initialized and saves if current request is master
+     * Runs on 'kernel.response' in test environment.
+     *
+     * @param FilterResponseEvent $event
+     */
+    public function onKernelResponse(FilterResponseEvent $event)
+    {
+        if (!$event->isMasterRequest()) {
+            return;
+        }
+
+        $session = $event->getRequest()->getSession();
+        if ($session && $session->isStarted()) {
+            $session->save();
+            $params = session_get_cookie_params();
+            $event->getResponse()->headers->setCookie(new Cookie($session->getName(), $session->getId(), 0 === $params['lifetime'] ? 0 : time() + $params['lifetime'], $params['path'], $params['domain'], $params['secure'], $params['httponly']));
+        }
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return array(
+            KernelEvents::REQUEST => array('onKernelRequest', 192),
+            KernelEvents::RESPONSE => array('onKernelResponse', -128),
+        );
+    }
+
+    /**
+     * Gets the session object.
+     *
+     * @return SessionInterface|null A SessionInterface instance or null if no session is available
+     */
+    abstract protected function getSession();
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/TranslatorListener.php
@@ -0,0 +1,69 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\Translation\TranslatorInterface;
+
+/**
+ * Synchronizes the locale between the request and the translator.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TranslatorListener implements EventSubscriberInterface
+{
+    private $translator;
+    private $requestStack;
+
+    public function __construct(TranslatorInterface $translator, RequestStack $requestStack)
+    {
+        $this->translator = $translator;
+        $this->requestStack = $requestStack;
+    }
+
+    public function onKernelRequest(GetResponseEvent $event)
+    {
+        $this->setLocale($event->getRequest());
+    }
+
+    public function onKernelFinishRequest(FinishRequestEvent $event)
+    {
+        if (null === $parentRequest = $this->requestStack->getParentRequest()) {
+            return;
+        }
+
+        $this->setLocale($parentRequest);
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return array(
+            // must be registered after the Locale listener
+            KernelEvents::REQUEST => array(array('onKernelRequest', 10)),
+            KernelEvents::FINISH_REQUEST => array(array('onKernelFinishRequest', 0)),
+        );
+    }
+
+    private function setLocale(Request $request)
+    {
+        try {
+            $this->translator->setLocale($request->getLocale());
+        } catch (\InvalidArgumentException $e) {
+            $this->translator->setLocale($request->getDefaultLocale());
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/EventListener/ValidateRequestListener.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\EventListener;
+
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+
+/**
+ * Validates that the headers and other information indicating the
+ * client IP address of a request are consistent.
+ *
+ * @author Magnus Nordlander <magnus@fervo.se>
+ */
+class ValidateRequestListener implements EventSubscriberInterface
+{
+    /**
+     * Performs the validation.
+     *
+     * @param GetResponseEvent $event
+     */
+    public function onKernelRequest(GetResponseEvent $event)
+    {
+        if (!$event->isMasterRequest()) {
+            return;
+        }
+        $request = $event->getRequest();
+
+        if ($request::getTrustedProxies()) {
+            // This will throw an exception if the headers are inconsistent.
+            $request->getClientIps();
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public static function getSubscribedEvents()
+    {
+        return array(
+            KernelEvents::REQUEST => array(
+                array('onKernelRequest', 256),
+            ),
+        );
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/AccessDeniedHttpException.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * AccessDeniedHttpException.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Christophe Coevoet <stof@notk.org>
+ */
+class AccessDeniedHttpException extends HttpException
+{
+    /**
+     * Constructor.
+     *
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
+     */
+    public function __construct($message = null, \Exception $previous = null, $code = 0)
+    {
+        parent::__construct(403, $message, $previous, array(), $code);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/BadRequestHttpException.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * BadRequestHttpException.
+ *
+ * @author Ben Ramsey <ben@benramsey.com>
+ */
+class BadRequestHttpException extends HttpException
+{
+    /**
+     * Constructor.
+     *
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
+     */
+    public function __construct($message = null, \Exception $previous = null, $code = 0)
+    {
+        parent::__construct(400, $message, $previous, array(), $code);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/ConflictHttpException.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * ConflictHttpException.
+ *
+ * @author Ben Ramsey <ben@benramsey.com>
+ */
+class ConflictHttpException extends HttpException
+{
+    /**
+     * Constructor.
+     *
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
+     */
+    public function __construct($message = null, \Exception $previous = null, $code = 0)
+    {
+        parent::__construct(409, $message, $previous, array(), $code);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/FatalErrorException.php
@@ -0,0 +1,23 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+@trigger_error('The '.__NAMESPACE__.'\FatalErrorException class is deprecated since version 2.3 and will be removed in 3.0. Use the Symfony\Component\Debug\Exception\FatalErrorException class instead.', E_USER_DEPRECATED);
+
+/*
+ * Fatal Error Exception.
+ *
+ * @author Konstanton Myakshin <koc-dp@yandex.ru>
+ *
+ * @deprecated since version 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
+ */
+class_exists('Symfony\Component\Debug\Exception\FatalErrorException');
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/FlattenException.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+@trigger_error('The '.__NAMESPACE__.'\FlattenException class is deprecated since version 2.3 and will be removed in 3.0. Use the Symfony\Component\Debug\Exception\FlattenException class instead.', E_USER_DEPRECATED);
+
+/*
+ * FlattenException wraps a PHP Exception to be able to serialize it.
+ *
+ * Basically, this class removes all objects from the trace.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
+ */
+class_exists('Symfony\Component\Debug\Exception\FlattenException');
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/GoneHttpException.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * GoneHttpException.
+ *
+ * @author Ben Ramsey <ben@benramsey.com>
+ */
+class GoneHttpException extends HttpException
+{
+    /**
+     * Constructor.
+     *
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
+     */
+    public function __construct($message = null, \Exception $previous = null, $code = 0)
+    {
+        parent::__construct(410, $message, $previous, array(), $code);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/HttpException.php
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * HttpException.
+ *
+ * @author Kris Wallsmith <kris@symfony.com>
+ */
+class HttpException extends \RuntimeException implements HttpExceptionInterface
+{
+    private $statusCode;
+    private $headers;
+
+    public function __construct($statusCode, $message = null, \Exception $previous = null, array $headers = array(), $code = 0)
+    {
+        $this->statusCode = $statusCode;
+        $this->headers = $headers;
+
+        parent::__construct($message, $code, $previous);
+    }
+
+    public function getStatusCode()
+    {
+        return $this->statusCode;
+    }
+
+    public function getHeaders()
+    {
+        return $this->headers;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/HttpExceptionInterface.php
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * Interface for HTTP error exceptions.
+ *
+ * @author Kris Wallsmith <kris@symfony.com>
+ */
+interface HttpExceptionInterface
+{
+    /**
+     * Returns the status code.
+     *
+     * @return int An HTTP response status code
+     */
+    public function getStatusCode();
+
+    /**
+     * Returns response headers.
+     *
+     * @return array Response headers
+     */
+    public function getHeaders();
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/LengthRequiredHttpException.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * LengthRequiredHttpException.
+ *
+ * @author Ben Ramsey <ben@benramsey.com>
+ */
+class LengthRequiredHttpException extends HttpException
+{
+    /**
+     * Constructor.
+     *
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
+     */
+    public function __construct($message = null, \Exception $previous = null, $code = 0)
+    {
+        parent::__construct(411, $message, $previous, array(), $code);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/MethodNotAllowedHttpException.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * MethodNotAllowedHttpException.
+ *
+ * @author Kris Wallsmith <kris@symfony.com>
+ */
+class MethodNotAllowedHttpException extends HttpException
+{
+    /**
+     * Constructor.
+     *
+     * @param array      $allow    An array of allowed methods
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
+     */
+    public function __construct(array $allow, $message = null, \Exception $previous = null, $code = 0)
+    {
+        $headers = array('Allow' => strtoupper(implode(', ', $allow)));
+
+        parent::__construct(405, $message, $previous, $headers, $code);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/NotAcceptableHttpException.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * NotAcceptableHttpException.
+ *
+ * @author Ben Ramsey <ben@benramsey.com>
+ */
+class NotAcceptableHttpException extends HttpException
+{
+    /**
+     * Constructor.
+     *
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
+     */
+    public function __construct($message = null, \Exception $previous = null, $code = 0)
+    {
+        parent::__construct(406, $message, $previous, array(), $code);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/NotFoundHttpException.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * NotFoundHttpException.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class NotFoundHttpException extends HttpException
+{
+    /**
+     * Constructor.
+     *
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
+     */
+    public function __construct($message = null, \Exception $previous = null, $code = 0)
+    {
+        parent::__construct(404, $message, $previous, array(), $code);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/PreconditionFailedHttpException.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * PreconditionFailedHttpException.
+ *
+ * @author Ben Ramsey <ben@benramsey.com>
+ */
+class PreconditionFailedHttpException extends HttpException
+{
+    /**
+     * Constructor.
+     *
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
+     */
+    public function __construct($message = null, \Exception $previous = null, $code = 0)
+    {
+        parent::__construct(412, $message, $previous, array(), $code);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/PreconditionRequiredHttpException.php
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * PreconditionRequiredHttpException.
+ *
+ * @author Ben Ramsey <ben@benramsey.com>
+ *
+ * @see http://tools.ietf.org/html/rfc6585
+ */
+class PreconditionRequiredHttpException extends HttpException
+{
+    /**
+     * Constructor.
+     *
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
+     */
+    public function __construct($message = null, \Exception $previous = null, $code = 0)
+    {
+        parent::__construct(428, $message, $previous, array(), $code);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/ServiceUnavailableHttpException.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * ServiceUnavailableHttpException.
+ *
+ * @author Ben Ramsey <ben@benramsey.com>
+ */
+class ServiceUnavailableHttpException extends HttpException
+{
+    /**
+     * Constructor.
+     *
+     * @param int|string $retryAfter The number of seconds or HTTP-date after which the request may be retried
+     * @param string     $message    The internal exception message
+     * @param \Exception $previous   The previous exception
+     * @param int        $code       The internal exception code
+     */
+    public function __construct($retryAfter = null, $message = null, \Exception $previous = null, $code = 0)
+    {
+        $headers = array();
+        if ($retryAfter) {
+            $headers = array('Retry-After' => $retryAfter);
+        }
+
+        parent::__construct(503, $message, $previous, $headers, $code);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/TooManyRequestsHttpException.php
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * TooManyRequestsHttpException.
+ *
+ * @author Ben Ramsey <ben@benramsey.com>
+ *
+ * @see http://tools.ietf.org/html/rfc6585
+ */
+class TooManyRequestsHttpException extends HttpException
+{
+    /**
+     * Constructor.
+     *
+     * @param int|string $retryAfter The number of seconds or HTTP-date after which the request may be retried
+     * @param string     $message    The internal exception message
+     * @param \Exception $previous   The previous exception
+     * @param int        $code       The internal exception code
+     */
+    public function __construct($retryAfter = null, $message = null, \Exception $previous = null, $code = 0)
+    {
+        $headers = array();
+        if ($retryAfter) {
+            $headers = array('Retry-After' => $retryAfter);
+        }
+
+        parent::__construct(429, $message, $previous, $headers, $code);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/UnauthorizedHttpException.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * UnauthorizedHttpException.
+ *
+ * @author Ben Ramsey <ben@benramsey.com>
+ */
+class UnauthorizedHttpException extends HttpException
+{
+    /**
+     * Constructor.
+     *
+     * @param string     $challenge WWW-Authenticate challenge string
+     * @param string     $message   The internal exception message
+     * @param \Exception $previous  The previous exception
+     * @param int        $code      The internal exception code
+     */
+    public function __construct($challenge, $message = null, \Exception $previous = null, $code = 0)
+    {
+        $headers = array('WWW-Authenticate' => $challenge);
+
+        parent::__construct(401, $message, $previous, $headers, $code);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/UnprocessableEntityHttpException.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * UnprocessableEntityHttpException.
+ *
+ * @author Steve Hutchins <hutchinsteve@gmail.com>
+ */
+class UnprocessableEntityHttpException extends HttpException
+{
+    /**
+     * Constructor.
+     *
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
+     */
+    public function __construct($message = null, \Exception $previous = null, $code = 0)
+    {
+        parent::__construct(422, $message, $previous, array(), $code);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Exception;
+
+/**
+ * UnsupportedMediaTypeHttpException.
+ *
+ * @author Ben Ramsey <ben@benramsey.com>
+ */
+class UnsupportedMediaTypeHttpException extends HttpException
+{
+    /**
+     * Constructor.
+     *
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
+     */
+    public function __construct($message = null, \Exception $previous = null, $code = 0)
+    {
+        parent::__construct(415, $message, $previous, array(), $code);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.php
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Fragment;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Controller\ControllerReference;
+use Symfony\Component\HttpKernel\HttpCache\SurrogateInterface;
+use Symfony\Component\HttpKernel\UriSigner;
+
+/**
+ * Implements Surrogate rendering strategy.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class AbstractSurrogateFragmentRenderer extends RoutableFragmentRenderer
+{
+    private $surrogate;
+    private $inlineStrategy;
+    private $signer;
+
+    /**
+     * Constructor.
+     *
+     * The "fallback" strategy when surrogate is not available should always be an
+     * instance of InlineFragmentRenderer.
+     *
+     * @param SurrogateInterface        $surrogate      An Surrogate instance
+     * @param FragmentRendererInterface $inlineStrategy The inline strategy to use when the surrogate is not supported
+     * @param UriSigner                 $signer
+     */
+    public function __construct(SurrogateInterface $surrogate = null, FragmentRendererInterface $inlineStrategy, UriSigner $signer = null)
+    {
+        $this->surrogate = $surrogate;
+        $this->inlineStrategy = $inlineStrategy;
+        $this->signer = $signer;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * Note that if the current Request has no surrogate capability, this method
+     * falls back to use the inline rendering strategy.
+     *
+     * Additional available options:
+     *
+     *  * alt: an alternative URI to render in case of an error
+     *  * comment: a comment to add when returning the surrogate tag
+     *
+     * Note, that not all surrogate strategies support all options. For now
+     * 'alt' and 'comment' are only supported by ESI.
+     *
+     * @see Symfony\Component\HttpKernel\HttpCache\SurrogateInterface
+     */
+    public function render($uri, Request $request, array $options = array())
+    {
+        if (!$this->surrogate || !$this->surrogate->hasSurrogateCapability($request)) {
+            return $this->inlineStrategy->render($uri, $request, $options);
+        }
+
+        if ($uri instanceof ControllerReference) {
+            $uri = $this->generateSignedFragmentUri($uri, $request);
+        }
+
+        $alt = isset($options['alt']) ? $options['alt'] : null;
+        if ($alt instanceof ControllerReference) {
+            $alt = $this->generateSignedFragmentUri($alt, $request);
+        }
+
+        $tag = $this->surrogate->renderIncludeTag($uri, $alt, isset($options['ignore_errors']) ? $options['ignore_errors'] : false, isset($options['comment']) ? $options['comment'] : '');
+
+        return new Response($tag);
+    }
+
+    private function generateSignedFragmentUri($uri, Request $request)
+    {
+        if (null === $this->signer) {
+            throw new \LogicException('You must use a URI when using the ESI rendering strategy or set a URL signer.');
+        }
+
+        // we need to sign the absolute URI, but want to return the path only.
+        $fragmentUri = $this->signer->sign($this->generateFragmentUri($uri, $request, true));
+
+        return substr($fragmentUri, strlen($request->getSchemeAndHttpHost()));
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Fragment/EsiFragmentRenderer.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Fragment;
+
+/**
+ * Implements the ESI rendering strategy.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class EsiFragmentRenderer extends AbstractSurrogateFragmentRenderer
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'esi';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Fragment/FragmentHandler.php
@@ -0,0 +1,168 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Fragment;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\StreamedResponse;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpKernel\Controller\ControllerReference;
+
+/**
+ * Renders a URI that represents a resource fragment.
+ *
+ * This class handles the rendering of resource fragments that are included into
+ * a main resource. The handling of the rendering is managed by specialized renderers.
+ *
+ * This listener works in 2 modes:
+ *
+ *  * 2.3 compatibility mode where you must call setRequest whenever the Request changes.
+ *  * 2.4+ mode where you must pass a RequestStack instance in the constructor.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @see FragmentRendererInterface
+ */
+class FragmentHandler
+{
+    private $debug;
+    private $renderers = array();
+    private $request;
+    private $requestStack;
+
+    /**
+     * Constructor.
+     *
+     * RequestStack will become required in 3.0.
+     *
+     * @param RequestStack                $requestStack The Request stack that controls the lifecycle of requests
+     * @param FragmentRendererInterface[] $renderers    An array of FragmentRendererInterface instances
+     * @param bool                        $debug        Whether the debug mode is enabled or not
+     */
+    public function __construct($requestStack = null, $renderers = array(), $debug = false)
+    {
+        if (is_array($requestStack)) {
+            $tmp = $debug;
+            $debug = func_num_args() < 2 ? false : $renderers;
+            $renderers = $requestStack;
+            $requestStack = func_num_args() < 3 ? null : $tmp;
+
+            @trigger_error('The '.__METHOD__.' method now requires a RequestStack to be given as first argument as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+        } elseif (!$requestStack instanceof RequestStack) {
+            @trigger_error('The '.__METHOD__.' method now requires a RequestStack instance as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+        }
+
+        if (null !== $requestStack && !$requestStack instanceof RequestStack) {
+            throw new \InvalidArgumentException('RequestStack instance expected.');
+        }
+        if (!is_array($renderers)) {
+            throw new \InvalidArgumentException('Renderers must be an array.');
+        }
+
+        $this->requestStack = $requestStack;
+        foreach ($renderers as $renderer) {
+            $this->addRenderer($renderer);
+        }
+        $this->debug = $debug;
+    }
+
+    /**
+     * Adds a renderer.
+     *
+     * @param FragmentRendererInterface $renderer A FragmentRendererInterface instance
+     */
+    public function addRenderer(FragmentRendererInterface $renderer)
+    {
+        $this->renderers[$renderer->getName()] = $renderer;
+    }
+
+    /**
+     * Sets the current Request.
+     *
+     * This method was used to synchronize the Request, but as the HttpKernel
+     * is doing that automatically now, you should never call it directly.
+     * It is kept public for BC with the 2.3 version.
+     *
+     * @param Request|null $request A Request instance
+     *
+     * @deprecated since version 2.4, to be removed in 3.0.
+     */
+    public function setRequest(Request $request = null)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.4 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        $this->request = $request;
+    }
+
+    /**
+     * Renders a URI and returns the Response content.
+     *
+     * Available options:
+     *
+     *  * ignore_errors: true to return an empty string in case of an error
+     *
+     * @param string|ControllerReference $uri      A URI as a string or a ControllerReference instance
+     * @param string                     $renderer The renderer name
+     * @param array                      $options  An array of options
+     *
+     * @return string|null The Response content or null when the Response is streamed
+     *
+     * @throws \InvalidArgumentException when the renderer does not exist
+     * @throws \LogicException           when no master request is being handled
+     */
+    public function render($uri, $renderer = 'inline', array $options = array())
+    {
+        if (!isset($options['ignore_errors'])) {
+            $options['ignore_errors'] = !$this->debug;
+        }
+
+        if (!isset($this->renderers[$renderer])) {
+            throw new \InvalidArgumentException(sprintf('The "%s" renderer does not exist.', $renderer));
+        }
+
+        if (!$request = $this->getRequest()) {
+            throw new \LogicException('Rendering a fragment can only be done when handling a Request.');
+        }
+
+        return $this->deliver($this->renderers[$renderer]->render($uri, $request, $options));
+    }
+
+    /**
+     * Delivers the Response as a string.
+     *
+     * When the Response is a StreamedResponse, the content is streamed immediately
+     * instead of being returned.
+     *
+     * @param Response $response A Response instance
+     *
+     * @return string|null The Response content or null when the Response is streamed
+     *
+     * @throws \RuntimeException when the Response is not successful
+     */
+    protected function deliver(Response $response)
+    {
+        if (!$response->isSuccessful()) {
+            throw new \RuntimeException(sprintf('Error when rendering "%s" (Status code is %s).', $this->getRequest()->getUri(), $response->getStatusCode()));
+        }
+
+        if (!$response instanceof StreamedResponse) {
+            return $response->getContent();
+        }
+
+        $response->sendContent();
+    }
+
+    private function getRequest()
+    {
+        return $this->requestStack ? $this->requestStack->getCurrentRequest() : $this->request;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Fragment/FragmentRendererInterface.php
@@ -0,0 +1,42 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Fragment;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Controller\ControllerReference;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * Interface implemented by all rendering strategies.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface FragmentRendererInterface
+{
+    /**
+     * Renders a URI and returns the Response content.
+     *
+     * @param string|ControllerReference $uri     A URI as a string or a ControllerReference instance
+     * @param Request                    $request A Request instance
+     * @param array                      $options An array of options
+     *
+     * @return Response A Response instance
+     */
+    public function render($uri, Request $request, array $options = array());
+
+    /**
+     * Gets the name of the strategy.
+     *
+     * @return string The strategy name
+     */
+    public function getName();
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php
@@ -0,0 +1,168 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Fragment;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Templating\EngineInterface;
+use Symfony\Component\HttpKernel\Controller\ControllerReference;
+use Symfony\Component\HttpKernel\UriSigner;
+
+/**
+ * Implements the Hinclude rendering strategy.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class HIncludeFragmentRenderer extends RoutableFragmentRenderer
+{
+    private $globalDefaultTemplate;
+    private $signer;
+    private $templating;
+    private $charset;
+
+    /**
+     * Constructor.
+     *
+     * @param EngineInterface|\Twig_Environment $templating            An EngineInterface or a \Twig_Environment instance
+     * @param UriSigner                         $signer                A UriSigner instance
+     * @param string                            $globalDefaultTemplate The global default content (it can be a template name or the content)
+     * @param string                            $charset
+     */
+    public function __construct($templating = null, UriSigner $signer = null, $globalDefaultTemplate = null, $charset = 'utf-8')
+    {
+        $this->setTemplating($templating);
+        $this->globalDefaultTemplate = $globalDefaultTemplate;
+        $this->signer = $signer;
+        $this->charset = $charset;
+    }
+
+    /**
+     * Sets the templating engine to use to render the default content.
+     *
+     * @param EngineInterface|\Twig_Environment|null $templating An EngineInterface or a \Twig_Environment instance
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function setTemplating($templating)
+    {
+        if (null !== $templating && !$templating instanceof EngineInterface && !$templating instanceof \Twig_Environment) {
+            throw new \InvalidArgumentException('The hinclude rendering strategy needs an instance of \Twig_Environment or Symfony\Component\Templating\EngineInterface');
+        }
+
+        $this->templating = $templating;
+    }
+
+    /**
+     * Checks if a templating engine has been set.
+     *
+     * @return bool true if the templating engine has been set, false otherwise
+     */
+    public function hasTemplating()
+    {
+        return null !== $this->templating;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * Additional available options:
+     *
+     *  * default:    The default content (it can be a template name or the content)
+     *  * id:         An optional hx:include tag id attribute
+     *  * attributes: An optional array of hx:include tag attributes
+     */
+    public function render($uri, Request $request, array $options = array())
+    {
+        if ($uri instanceof ControllerReference) {
+            if (null === $this->signer) {
+                throw new \LogicException('You must use a proper URI when using the Hinclude rendering strategy or set a URL signer.');
+            }
+
+            // we need to sign the absolute URI, but want to return the path only.
+            $uri = substr($this->signer->sign($this->generateFragmentUri($uri, $request, true)), strlen($request->getSchemeAndHttpHost()));
+        }
+
+        // We need to replace ampersands in the URI with the encoded form in order to return valid html/xml content.
+        $uri = str_replace('&', '&amp;', $uri);
+
+        $template = isset($options['default']) ? $options['default'] : $this->globalDefaultTemplate;
+        if (null !== $this->templating && $template && $this->templateExists($template)) {
+            $content = $this->templating->render($template);
+        } else {
+            $content = $template;
+        }
+
+        $attributes = isset($options['attributes']) && is_array($options['attributes']) ? $options['attributes'] : array();
+        if (isset($options['id']) && $options['id']) {
+            $attributes['id'] = $options['id'];
+        }
+        $renderedAttributes = '';
+        if (count($attributes) > 0) {
+            if (PHP_VERSION_ID >= 50400) {
+                $flags = ENT_QUOTES | ENT_SUBSTITUTE;
+            } else {
+                $flags = ENT_QUOTES;
+            }
+            foreach ($attributes as $attribute => $value) {
+                $renderedAttributes .= sprintf(
+                    ' %s="%s"',
+                    htmlspecialchars($attribute, $flags, $this->charset, false),
+                    htmlspecialchars($value, $flags, $this->charset, false)
+                );
+            }
+        }
+
+        return new Response(sprintf('<hx:include src="%s"%s>%s</hx:include>', $uri, $renderedAttributes, $content));
+    }
+
+    /**
+     * @param string $template
+     *
+     * @return bool
+     */
+    private function templateExists($template)
+    {
+        if ($this->templating instanceof EngineInterface) {
+            try {
+                return $this->templating->exists($template);
+            } catch (\InvalidArgumentException $e) {
+                return false;
+            }
+        }
+
+        $loader = $this->templating->getLoader();
+        if ($loader instanceof \Twig_ExistsLoaderInterface || method_exists($loader, 'exists')) {
+            return $loader->exists($template);
+        }
+
+        try {
+            if (method_exists($loader, 'getSourceContext')) {
+                $loader->getSourceContext($template);
+            } else {
+                $loader->getSource($template);
+            }
+
+            return true;
+        } catch (\Twig_Error_Loader $e) {
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'hinclude';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Fragment/InlineFragmentRenderer.php
@@ -0,0 +1,154 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Fragment;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\Controller\ControllerReference;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+
+/**
+ * Implements the inline rendering strategy where the Request is rendered by the current HTTP kernel.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class InlineFragmentRenderer extends RoutableFragmentRenderer
+{
+    private $kernel;
+    private $dispatcher;
+
+    /**
+     * Constructor.
+     *
+     * @param HttpKernelInterface      $kernel     A HttpKernelInterface instance
+     * @param EventDispatcherInterface $dispatcher A EventDispatcherInterface instance
+     */
+    public function __construct(HttpKernelInterface $kernel, EventDispatcherInterface $dispatcher = null)
+    {
+        $this->kernel = $kernel;
+        $this->dispatcher = $dispatcher;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * Additional available options:
+     *
+     *  * alt: an alternative URI to render in case of an error
+     */
+    public function render($uri, Request $request, array $options = array())
+    {
+        $reference = null;
+        if ($uri instanceof ControllerReference) {
+            $reference = $uri;
+
+            // Remove attributes from the generated URI because if not, the Symfony
+            // routing system will use them to populate the Request attributes. We don't
+            // want that as we want to preserve objects (so we manually set Request attributes
+            // below instead)
+            $attributes = $reference->attributes;
+            $reference->attributes = array();
+
+            // The request format and locale might have been overridden by the user
+            foreach (array('_format', '_locale') as $key) {
+                if (isset($attributes[$key])) {
+                    $reference->attributes[$key] = $attributes[$key];
+                }
+            }
+
+            $uri = $this->generateFragmentUri($uri, $request, false, false);
+
+            $reference->attributes = array_merge($attributes, $reference->attributes);
+        }
+
+        $subRequest = $this->createSubRequest($uri, $request);
+
+        // override Request attributes as they can be objects (which are not supported by the generated URI)
+        if (null !== $reference) {
+            $subRequest->attributes->add($reference->attributes);
+        }
+
+        $level = ob_get_level();
+        try {
+            return $this->kernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST, false);
+        } catch (\Exception $e) {
+            // we dispatch the exception event to trigger the logging
+            // the response that comes back is simply ignored
+            if (isset($options['ignore_errors']) && $options['ignore_errors'] && $this->dispatcher) {
+                $event = new GetResponseForExceptionEvent($this->kernel, $request, HttpKernelInterface::SUB_REQUEST, $e);
+
+                $this->dispatcher->dispatch(KernelEvents::EXCEPTION, $event);
+            }
+
+            // let's clean up the output buffers that were created by the sub-request
+            Response::closeOutputBuffers($level, false);
+
+            if (isset($options['alt'])) {
+                $alt = $options['alt'];
+                unset($options['alt']);
+
+                return $this->render($alt, $request, $options);
+            }
+
+            if (!isset($options['ignore_errors']) || !$options['ignore_errors']) {
+                throw $e;
+            }
+
+            return new Response();
+        }
+    }
+
+    protected function createSubRequest($uri, Request $request)
+    {
+        $cookies = $request->cookies->all();
+        $server = $request->server->all();
+
+        // Override the arguments to emulate a sub-request.
+        // Sub-request object will point to localhost as client ip and real client ip
+        // will be included into trusted header for client ip
+        try {
+            if ($trustedHeaderName = Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP)) {
+                $currentXForwardedFor = $request->headers->get($trustedHeaderName, '');
+
+                $server['HTTP_'.$trustedHeaderName] = ($currentXForwardedFor ? $currentXForwardedFor.', ' : '').$request->getClientIp();
+            }
+        } catch (\InvalidArgumentException $e) {
+            // Do nothing
+        }
+
+        $server['REMOTE_ADDR'] = '127.0.0.1';
+        unset($server['HTTP_IF_MODIFIED_SINCE']);
+        unset($server['HTTP_IF_NONE_MATCH']);
+
+        $subRequest = Request::create($uri, 'get', array(), $cookies, array(), $server);
+        if ($request->headers->has('Surrogate-Capability')) {
+            $subRequest->headers->set('Surrogate-Capability', $request->headers->get('Surrogate-Capability'));
+        }
+
+        if ($session = $request->getSession()) {
+            $subRequest->setSession($session);
+        }
+
+        return $subRequest;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'inline';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php
@@ -0,0 +1,90 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Fragment;
+
+use Symfony\Component\HttpKernel\Controller\ControllerReference;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\EventListener\FragmentListener;
+
+/**
+ * Adds the possibility to generate a fragment URI for a given Controller.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class RoutableFragmentRenderer implements FragmentRendererInterface
+{
+    private $fragmentPath = '/_fragment';
+
+    /**
+     * Sets the fragment path that triggers the fragment listener.
+     *
+     * @param string $path The path
+     *
+     * @see FragmentListener
+     */
+    public function setFragmentPath($path)
+    {
+        $this->fragmentPath = $path;
+    }
+
+    /**
+     * Generates a fragment URI for a given controller.
+     *
+     * @param ControllerReference $reference A ControllerReference instance
+     * @param Request             $request   A Request instance
+     * @param bool                $absolute  Whether to generate an absolute URL or not
+     * @param bool                $strict    Whether to allow non-scalar attributes or not
+     *
+     * @return string A fragment URI
+     */
+    protected function generateFragmentUri(ControllerReference $reference, Request $request, $absolute = false, $strict = true)
+    {
+        if ($strict) {
+            $this->checkNonScalar($reference->attributes);
+        }
+
+        // We need to forward the current _format and _locale values as we don't have
+        // a proper routing pattern to do the job for us.
+        // This makes things inconsistent if you switch from rendering a controller
+        // to rendering a route if the route pattern does not contain the special
+        // _format and _locale placeholders.
+        if (!isset($reference->attributes['_format'])) {
+            $reference->attributes['_format'] = $request->getRequestFormat();
+        }
+        if (!isset($reference->attributes['_locale'])) {
+            $reference->attributes['_locale'] = $request->getLocale();
+        }
+
+        $reference->attributes['_controller'] = $reference->controller;
+
+        $reference->query['_path'] = http_build_query($reference->attributes, '', '&');
+
+        $path = $this->fragmentPath.'?'.http_build_query($reference->query, '', '&');
+
+        if ($absolute) {
+            return $request->getUriForPath($path);
+        }
+
+        return $request->getBaseUrl().$path;
+    }
+
+    private function checkNonScalar($values)
+    {
+        foreach ($values as $key => $value) {
+            if (is_array($value)) {
+                $this->checkNonScalar($value);
+            } elseif (!is_scalar($value) && null !== $value) {
+                throw new \LogicException(sprintf('Controller attributes cannot contain non-scalar/non-null values (value for key "%s" is not a scalar or null).', $key));
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Fragment/SsiFragmentRenderer.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Fragment;
+
+/**
+ * Implements the SSI rendering strategy.
+ *
+ * @author Sebastian Krebs <krebs.seb@gmail.com>
+ */
+class SsiFragmentRenderer extends AbstractSurrogateFragmentRenderer
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'ssi';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/HttpCache/Esi.php
@@ -0,0 +1,295 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\HttpCache;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+
+/**
+ * Esi implements the ESI capabilities to Request and Response instances.
+ *
+ * For more information, read the following W3C notes:
+ *
+ *  * ESI Language Specification 1.0 (http://www.w3.org/TR/esi-lang)
+ *
+ *  * Edge Architecture Specification (http://www.w3.org/TR/edge-arch)
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Esi implements SurrogateInterface
+{
+    private $contentTypes;
+    private $phpEscapeMap = array(
+        array('<?', '<%', '<s', '<S'),
+        array('<?php echo "<?"; ?>', '<?php echo "<%"; ?>', '<?php echo "<s"; ?>', '<?php echo "<S"; ?>'),
+    );
+
+    /**
+     * Constructor.
+     *
+     * @param array $contentTypes An array of content-type that should be parsed for ESI information
+     *                            (default: text/html, text/xml, application/xhtml+xml, and application/xml)
+     */
+    public function __construct(array $contentTypes = array('text/html', 'text/xml', 'application/xhtml+xml', 'application/xml'))
+    {
+        $this->contentTypes = $contentTypes;
+    }
+
+    public function getName()
+    {
+        return 'esi';
+    }
+
+    /**
+     * Returns a new cache strategy instance.
+     *
+     * @return ResponseCacheStrategyInterface A ResponseCacheStrategyInterface instance
+     */
+    public function createCacheStrategy()
+    {
+        return new ResponseCacheStrategy();
+    }
+
+    /**
+     * Checks that at least one surrogate has ESI/1.0 capability.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return bool true if one surrogate has ESI/1.0 capability, false otherwise
+     */
+    public function hasSurrogateCapability(Request $request)
+    {
+        if (null === $value = $request->headers->get('Surrogate-Capability')) {
+            return false;
+        }
+
+        return false !== strpos($value, 'ESI/1.0');
+    }
+
+    /**
+     * Checks that at least one surrogate has ESI/1.0 capability.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return bool true if one surrogate has ESI/1.0 capability, false otherwise
+     *
+     * @deprecated since version 2.6, to be removed in 3.0. Use hasSurrogateCapability() instead
+     */
+    public function hasSurrogateEsiCapability(Request $request)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the hasSurrogateCapability() method instead.', E_USER_DEPRECATED);
+
+        return $this->hasSurrogateCapability($request);
+    }
+
+    /**
+     * Adds ESI/1.0 capability to the given Request.
+     *
+     * @param Request $request A Request instance
+     */
+    public function addSurrogateCapability(Request $request)
+    {
+        $current = $request->headers->get('Surrogate-Capability');
+        $new = 'symfony2="ESI/1.0"';
+
+        $request->headers->set('Surrogate-Capability', $current ? $current.', '.$new : $new);
+    }
+
+    /**
+     * Adds ESI/1.0 capability to the given Request.
+     *
+     * @param Request $request A Request instance
+     *
+     * @deprecated since version 2.6, to be removed in 3.0. Use addSurrogateCapability() instead
+     */
+    public function addSurrogateEsiCapability(Request $request)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the addSurrogateCapability() method instead.', E_USER_DEPRECATED);
+
+        $this->addSurrogateCapability($request);
+    }
+
+    /**
+     * Adds HTTP headers to specify that the Response needs to be parsed for ESI.
+     *
+     * This method only adds an ESI HTTP header if the Response has some ESI tags.
+     *
+     * @param Response $response A Response instance
+     */
+    public function addSurrogateControl(Response $response)
+    {
+        if (false !== strpos($response->getContent(), '<esi:include')) {
+            $response->headers->set('Surrogate-Control', 'content="ESI/1.0"');
+        }
+    }
+
+    /**
+     * Checks that the Response needs to be parsed for ESI tags.
+     *
+     * @param Response $response A Response instance
+     *
+     * @return bool true if the Response needs to be parsed, false otherwise
+     */
+    public function needsParsing(Response $response)
+    {
+        if (!$control = $response->headers->get('Surrogate-Control')) {
+            return false;
+        }
+
+        return (bool) preg_match('#content="[^"]*ESI/1.0[^"]*"#', $control);
+    }
+
+    /**
+     * Checks that the Response needs to be parsed for ESI tags.
+     *
+     * @param Response $response A Response instance
+     *
+     * @return bool true if the Response needs to be parsed, false otherwise
+     *
+     * @deprecated since version 2.6, to be removed in 3.0. Use needsParsing() instead
+     */
+    public function needsEsiParsing(Response $response)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the needsParsing() method instead.', E_USER_DEPRECATED);
+
+        return $this->needsParsing($response);
+    }
+
+    /**
+     * Renders an ESI tag.
+     *
+     * @param string $uri          A URI
+     * @param string $alt          An alternate URI
+     * @param bool   $ignoreErrors Whether to ignore errors or not
+     * @param string $comment      A comment to add as an esi:include tag
+     *
+     * @return string
+     */
+    public function renderIncludeTag($uri, $alt = null, $ignoreErrors = true, $comment = '')
+    {
+        $html = sprintf('<esi:include src="%s"%s%s />',
+            $uri,
+            $ignoreErrors ? ' onerror="continue"' : '',
+            $alt ? sprintf(' alt="%s"', $alt) : ''
+        );
+
+        if (!empty($comment)) {
+            return sprintf("<esi:comment text=\"%s\" />\n%s", $comment, $html);
+        }
+
+        return $html;
+    }
+
+    /**
+     * Replaces a Response ESI tags with the included resource content.
+     *
+     * @param Request  $request  A Request instance
+     * @param Response $response A Response instance
+     *
+     * @return Response
+     */
+    public function process(Request $request, Response $response)
+    {
+        $type = $response->headers->get('Content-Type');
+        if (empty($type)) {
+            $type = 'text/html';
+        }
+
+        $parts = explode(';', $type);
+        if (!in_array($parts[0], $this->contentTypes)) {
+            return $response;
+        }
+
+        // we don't use a proper XML parser here as we can have ESI tags in a plain text response
+        $content = $response->getContent();
+        $content = preg_replace('#<esi\:remove>.*?</esi\:remove>#s', '', $content);
+        $content = preg_replace('#<esi\:comment[^>]+>#s', '', $content);
+
+        $chunks = preg_split('#<esi\:include\s+(.*?)\s*(?:/|</esi\:include)>#', $content, -1, PREG_SPLIT_DELIM_CAPTURE);
+        $chunks[0] = str_replace($this->phpEscapeMap[0], $this->phpEscapeMap[1], $chunks[0]);
+
+        $i = 1;
+        while (isset($chunks[$i])) {
+            $options = array();
+            preg_match_all('/(src|onerror|alt)="([^"]*?)"/', $chunks[$i], $matches, PREG_SET_ORDER);
+            foreach ($matches as $set) {
+                $options[$set[1]] = $set[2];
+            }
+
+            if (!isset($options['src'])) {
+                throw new \RuntimeException('Unable to process an ESI tag without a "src" attribute.');
+            }
+
+            $chunks[$i] = sprintf('<?php echo $this->surrogate->handle($this, %s, %s, %s) ?>'."\n",
+                var_export($options['src'], true),
+                var_export(isset($options['alt']) ? $options['alt'] : '', true),
+                isset($options['onerror']) && 'continue' === $options['onerror'] ? 'true' : 'false'
+            );
+            ++$i;
+            $chunks[$i] = str_replace($this->phpEscapeMap[0], $this->phpEscapeMap[1], $chunks[$i]);
+            ++$i;
+        }
+        $content = implode('', $chunks);
+
+        $response->setContent($content);
+        $response->headers->set('X-Body-Eval', 'ESI');
+
+        // remove ESI/1.0 from the Surrogate-Control header
+        if ($response->headers->has('Surrogate-Control')) {
+            $value = $response->headers->get('Surrogate-Control');
+            if ('content="ESI/1.0"' == $value) {
+                $response->headers->remove('Surrogate-Control');
+            } elseif (preg_match('#,\s*content="ESI/1.0"#', $value)) {
+                $response->headers->set('Surrogate-Control', preg_replace('#,\s*content="ESI/1.0"#', '', $value));
+            } elseif (preg_match('#content="ESI/1.0",\s*#', $value)) {
+                $response->headers->set('Surrogate-Control', preg_replace('#content="ESI/1.0",\s*#', '', $value));
+            }
+        }
+    }
+
+    /**
+     * Handles an ESI from the cache.
+     *
+     * @param HttpCache $cache        An HttpCache instance
+     * @param string    $uri          The main URI
+     * @param string    $alt          An alternative URI
+     * @param bool      $ignoreErrors Whether to ignore errors or not
+     *
+     * @return string
+     *
+     * @throws \RuntimeException
+     * @throws \Exception
+     */
+    public function handle(HttpCache $cache, $uri, $alt, $ignoreErrors)
+    {
+        $subRequest = Request::create($uri, 'get', array(), $cache->getRequest()->cookies->all(), array(), $cache->getRequest()->server->all());
+
+        try {
+            $response = $cache->handle($subRequest, HttpKernelInterface::SUB_REQUEST, true);
+
+            if (!$response->isSuccessful()) {
+                throw new \RuntimeException(sprintf('Error when rendering "%s" (Status code is %s).', $subRequest->getUri(), $response->getStatusCode()));
+            }
+
+            return $response->getContent();
+        } catch (\Exception $e) {
+            if ($alt) {
+                return $this->handle($cache, $alt, '', $ignoreErrors);
+            }
+
+            if (!$ignoreErrors) {
+                throw $e;
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/HttpCache/EsiResponseCacheStrategy.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * This code is partially based on the Rack-Cache library by Ryan Tomayko,
+ * which is released under the MIT license.
+ * (based on commit 02d2b48d75bcb63cf1c0c7149c077ad256542801)
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\HttpCache;
+
+@trigger_error('The '.__NAMESPACE__.'\EsiResponseCacheStrategy class is deprecated since version 2.6 and will be removed in 3.0. Use the Symfony\Component\HttpKernel\HttpCache\ResponseCacheStrategy class instead.', E_USER_DEPRECATED);
+
+/**
+ * EsiResponseCacheStrategy knows how to compute the Response cache HTTP header
+ * based on the different ESI response cache headers.
+ *
+ * This implementation changes the master response TTL to the smallest TTL received
+ * or force validation if one of the ESI has validation cache strategy.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 2.6, to be removed in 3.0. Use ResponseCacheStrategy instead
+ */
+class EsiResponseCacheStrategy extends ResponseCacheStrategy implements EsiResponseCacheStrategyInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/HttpCache/EsiResponseCacheStrategyInterface.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * This code is partially based on the Rack-Cache library by Ryan Tomayko,
+ * which is released under the MIT license.
+ * (based on commit 02d2b48d75bcb63cf1c0c7149c077ad256542801)
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\HttpCache;
+
+/**
+ * ResponseCacheStrategyInterface implementations know how to compute the
+ * Response cache HTTP header based on the different response cache headers.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 2.6, to be removed in 3.0. Use ResponseCacheStrategyInterface instead.
+ */
+interface EsiResponseCacheStrategyInterface extends ResponseCacheStrategyInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/HttpCache/HttpCache.php
@@ -0,0 +1,713 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * This code is partially based on the Rack-Cache library by Ryan Tomayko,
+ * which is released under the MIT license.
+ * (based on commit 02d2b48d75bcb63cf1c0c7149c077ad256542801)
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\HttpCache;
+
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\TerminableInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * Cache provides HTTP caching.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class HttpCache implements HttpKernelInterface, TerminableInterface
+{
+    private $kernel;
+    private $store;
+    private $request;
+    private $surrogate;
+    private $surrogateCacheStrategy;
+    private $options = array();
+    private $traces = array();
+
+    /**
+     * Constructor.
+     *
+     * The available options are:
+     *
+     *   * debug:                 If true, the traces are added as a HTTP header to ease debugging
+     *
+     *   * default_ttl            The number of seconds that a cache entry should be considered
+     *                            fresh when no explicit freshness information is provided in
+     *                            a response. Explicit Cache-Control or Expires headers
+     *                            override this value. (default: 0)
+     *
+     *   * private_headers        Set of request headers that trigger "private" cache-control behavior
+     *                            on responses that don't explicitly state whether the response is
+     *                            public or private via a Cache-Control directive. (default: Authorization and Cookie)
+     *
+     *   * allow_reload           Specifies whether the client can force a cache reload by including a
+     *                            Cache-Control "no-cache" directive in the request. Set it to ``true``
+     *                            for compliance with RFC 2616. (default: false)
+     *
+     *   * allow_revalidate       Specifies whether the client can force a cache revalidate by including
+     *                            a Cache-Control "max-age=0" directive in the request. Set it to ``true``
+     *                            for compliance with RFC 2616. (default: false)
+     *
+     *   * stale_while_revalidate Specifies the default number of seconds (the granularity is the second as the
+     *                            Response TTL precision is a second) during which the cache can immediately return
+     *                            a stale response while it revalidates it in the background (default: 2).
+     *                            This setting is overridden by the stale-while-revalidate HTTP Cache-Control
+     *                            extension (see RFC 5861).
+     *
+     *   * stale_if_error         Specifies the default number of seconds (the granularity is the second) during which
+     *                            the cache can serve a stale response when an error is encountered (default: 60).
+     *                            This setting is overridden by the stale-if-error HTTP Cache-Control extension
+     *                            (see RFC 5861).
+     *
+     * @param HttpKernelInterface $kernel    An HttpKernelInterface instance
+     * @param StoreInterface      $store     A Store instance
+     * @param SurrogateInterface  $surrogate A SurrogateInterface instance
+     * @param array               $options   An array of options
+     */
+    public function __construct(HttpKernelInterface $kernel, StoreInterface $store, SurrogateInterface $surrogate = null, array $options = array())
+    {
+        $this->store = $store;
+        $this->kernel = $kernel;
+        $this->surrogate = $surrogate;
+
+        // needed in case there is a fatal error because the backend is too slow to respond
+        register_shutdown_function(array($this->store, 'cleanup'));
+
+        $this->options = array_merge(array(
+            'debug' => false,
+            'default_ttl' => 0,
+            'private_headers' => array('Authorization', 'Cookie'),
+            'allow_reload' => false,
+            'allow_revalidate' => false,
+            'stale_while_revalidate' => 2,
+            'stale_if_error' => 60,
+        ), $options);
+    }
+
+    /**
+     * Gets the current store.
+     *
+     * @return StoreInterface $store A StoreInterface instance
+     */
+    public function getStore()
+    {
+        return $this->store;
+    }
+
+    /**
+     * Returns an array of events that took place during processing of the last request.
+     *
+     * @return array An array of events
+     */
+    public function getTraces()
+    {
+        return $this->traces;
+    }
+
+    /**
+     * Returns a log message for the events of the last request processing.
+     *
+     * @return string A log message
+     */
+    public function getLog()
+    {
+        $log = array();
+        foreach ($this->traces as $request => $traces) {
+            $log[] = sprintf('%s: %s', $request, implode(', ', $traces));
+        }
+
+        return implode('; ', $log);
+    }
+
+    /**
+     * Gets the Request instance associated with the master request.
+     *
+     * @return Request A Request instance
+     */
+    public function getRequest()
+    {
+        return $this->request;
+    }
+
+    /**
+     * Gets the Kernel instance.
+     *
+     * @return HttpKernelInterface An HttpKernelInterface instance
+     */
+    public function getKernel()
+    {
+        return $this->kernel;
+    }
+
+    /**
+     * Gets the Surrogate instance.
+     *
+     * @return SurrogateInterface A Surrogate instance
+     *
+     * @throws \LogicException
+     */
+    public function getSurrogate()
+    {
+        if (!$this->surrogate instanceof Esi) {
+            throw new \LogicException('This instance of HttpCache was not set up to use ESI as surrogate handler. You must overwrite and use createSurrogate');
+        }
+
+        return $this->surrogate;
+    }
+
+    /**
+     * Gets the Esi instance.
+     *
+     * @return Esi An Esi instance
+     *
+     * @throws \LogicException
+     *
+     * @deprecated since version 2.6, to be removed in 3.0. Use getSurrogate() instead
+     */
+    public function getEsi()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the getSurrogate() method instead.', E_USER_DEPRECATED);
+
+        return $this->getSurrogate();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
+    {
+        // FIXME: catch exceptions and implement a 500 error page here? -> in Varnish, there is a built-in error page mechanism
+        if (HttpKernelInterface::MASTER_REQUEST === $type) {
+            $this->traces = array();
+            $this->request = $request;
+            if (null !== $this->surrogate) {
+                $this->surrogateCacheStrategy = $this->surrogate->createCacheStrategy();
+            }
+        }
+
+        $path = $request->getPathInfo();
+        if ($qs = $request->getQueryString()) {
+            $path .= '?'.$qs;
+        }
+        $this->traces[$request->getMethod().' '.$path] = array();
+
+        if (!$request->isMethodSafe()) {
+            $response = $this->invalidate($request, $catch);
+        } elseif ($request->headers->has('expect') || !$request->isMethodCacheable()) {
+            $response = $this->pass($request, $catch);
+        } else {
+            $response = $this->lookup($request, $catch);
+        }
+
+        $this->restoreResponseBody($request, $response);
+
+        $response->setDate(\DateTime::createFromFormat('U', time(), new \DateTimeZone('UTC')));
+
+        if (HttpKernelInterface::MASTER_REQUEST === $type && $this->options['debug']) {
+            $response->headers->set('X-Symfony-Cache', $this->getLog());
+        }
+
+        if (null !== $this->surrogate) {
+            if (HttpKernelInterface::MASTER_REQUEST === $type) {
+                $this->surrogateCacheStrategy->update($response);
+            } else {
+                $this->surrogateCacheStrategy->add($response);
+            }
+        }
+
+        $response->prepare($request);
+
+        $response->isNotModified($request);
+
+        return $response;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function terminate(Request $request, Response $response)
+    {
+        if ($this->getKernel() instanceof TerminableInterface) {
+            $this->getKernel()->terminate($request, $response);
+        }
+    }
+
+    /**
+     * Forwards the Request to the backend without storing the Response in the cache.
+     *
+     * @param Request $request A Request instance
+     * @param bool    $catch   Whether to process exceptions
+     *
+     * @return Response A Response instance
+     */
+    protected function pass(Request $request, $catch = false)
+    {
+        $this->record($request, 'pass');
+
+        return $this->forward($request, $catch);
+    }
+
+    /**
+     * Invalidates non-safe methods (like POST, PUT, and DELETE).
+     *
+     * @param Request $request A Request instance
+     * @param bool    $catch   Whether to process exceptions
+     *
+     * @return Response A Response instance
+     *
+     * @throws \Exception
+     *
+     * @see RFC2616 13.10
+     */
+    protected function invalidate(Request $request, $catch = false)
+    {
+        $response = $this->pass($request, $catch);
+
+        // invalidate only when the response is successful
+        if ($response->isSuccessful() || $response->isRedirect()) {
+            try {
+                $this->store->invalidate($request);
+
+                // As per the RFC, invalidate Location and Content-Location URLs if present
+                foreach (array('Location', 'Content-Location') as $header) {
+                    if ($uri = $response->headers->get($header)) {
+                        $subRequest = Request::create($uri, 'get', array(), array(), array(), $request->server->all());
+
+                        $this->store->invalidate($subRequest);
+                    }
+                }
+
+                $this->record($request, 'invalidate');
+            } catch (\Exception $e) {
+                $this->record($request, 'invalidate-failed');
+
+                if ($this->options['debug']) {
+                    throw $e;
+                }
+            }
+        }
+
+        return $response;
+    }
+
+    /**
+     * Lookups a Response from the cache for the given Request.
+     *
+     * When a matching cache entry is found and is fresh, it uses it as the
+     * response without forwarding any request to the backend. When a matching
+     * cache entry is found but is stale, it attempts to "validate" the entry with
+     * the backend using conditional GET. When no matching cache entry is found,
+     * it triggers "miss" processing.
+     *
+     * @param Request $request A Request instance
+     * @param bool    $catch   whether to process exceptions
+     *
+     * @return Response A Response instance
+     *
+     * @throws \Exception
+     */
+    protected function lookup(Request $request, $catch = false)
+    {
+        // if allow_reload and no-cache Cache-Control, allow a cache reload
+        if ($this->options['allow_reload'] && $request->isNoCache()) {
+            $this->record($request, 'reload');
+
+            return $this->fetch($request, $catch);
+        }
+
+        try {
+            $entry = $this->store->lookup($request);
+        } catch (\Exception $e) {
+            $this->record($request, 'lookup-failed');
+
+            if ($this->options['debug']) {
+                throw $e;
+            }
+
+            return $this->pass($request, $catch);
+        }
+
+        if (null === $entry) {
+            $this->record($request, 'miss');
+
+            return $this->fetch($request, $catch);
+        }
+
+        if (!$this->isFreshEnough($request, $entry)) {
+            $this->record($request, 'stale');
+
+            return $this->validate($request, $entry, $catch);
+        }
+
+        $this->record($request, 'fresh');
+
+        $entry->headers->set('Age', $entry->getAge());
+
+        return $entry;
+    }
+
+    /**
+     * Validates that a cache entry is fresh.
+     *
+     * The original request is used as a template for a conditional
+     * GET request with the backend.
+     *
+     * @param Request  $request A Request instance
+     * @param Response $entry   A Response instance to validate
+     * @param bool     $catch   Whether to process exceptions
+     *
+     * @return Response A Response instance
+     */
+    protected function validate(Request $request, Response $entry, $catch = false)
+    {
+        $subRequest = clone $request;
+
+        // send no head requests because we want content
+        if ('HEAD' === $request->getMethod()) {
+            $subRequest->setMethod('GET');
+        }
+
+        // add our cached last-modified validator
+        $subRequest->headers->set('if_modified_since', $entry->headers->get('Last-Modified'));
+
+        // Add our cached etag validator to the environment.
+        // We keep the etags from the client to handle the case when the client
+        // has a different private valid entry which is not cached here.
+        $cachedEtags = $entry->getEtag() ? array($entry->getEtag()) : array();
+        $requestEtags = $request->getETags();
+        if ($etags = array_unique(array_merge($cachedEtags, $requestEtags))) {
+            $subRequest->headers->set('if_none_match', implode(', ', $etags));
+        }
+
+        $response = $this->forward($subRequest, $catch, $entry);
+
+        if (304 == $response->getStatusCode()) {
+            $this->record($request, 'valid');
+
+            // return the response and not the cache entry if the response is valid but not cached
+            $etag = $response->getEtag();
+            if ($etag && in_array($etag, $requestEtags) && !in_array($etag, $cachedEtags)) {
+                return $response;
+            }
+
+            $entry = clone $entry;
+            $entry->headers->remove('Date');
+
+            foreach (array('Date', 'Expires', 'Cache-Control', 'ETag', 'Last-Modified') as $name) {
+                if ($response->headers->has($name)) {
+                    $entry->headers->set($name, $response->headers->get($name));
+                }
+            }
+
+            $response = $entry;
+        } else {
+            $this->record($request, 'invalid');
+        }
+
+        if ($response->isCacheable()) {
+            $this->store($request, $response);
+        }
+
+        return $response;
+    }
+
+    /**
+     * Forwards the Request to the backend and determines whether the response should be stored.
+     *
+     * This methods is triggered when the cache missed or a reload is required.
+     *
+     * @param Request $request A Request instance
+     * @param bool    $catch   whether to process exceptions
+     *
+     * @return Response A Response instance
+     */
+    protected function fetch(Request $request, $catch = false)
+    {
+        $subRequest = clone $request;
+
+        // send no head requests because we want content
+        if ('HEAD' === $request->getMethod()) {
+            $subRequest->setMethod('GET');
+        }
+
+        // avoid that the backend sends no content
+        $subRequest->headers->remove('if_modified_since');
+        $subRequest->headers->remove('if_none_match');
+
+        $response = $this->forward($subRequest, $catch);
+
+        if ($response->isCacheable()) {
+            $this->store($request, $response);
+        }
+
+        return $response;
+    }
+
+    /**
+     * Forwards the Request to the backend and returns the Response.
+     *
+     * @param Request  $request A Request instance
+     * @param bool     $catch   Whether to catch exceptions or not
+     * @param Response $entry   A Response instance (the stale entry if present, null otherwise)
+     *
+     * @return Response A Response instance
+     */
+    protected function forward(Request $request, $catch = false, Response $entry = null)
+    {
+        if ($this->surrogate) {
+            $this->surrogate->addSurrogateCapability($request);
+        }
+
+        // modify the X-Forwarded-For header if needed
+        $forwardedFor = $request->headers->get('X-Forwarded-For');
+        if ($forwardedFor) {
+            $request->headers->set('X-Forwarded-For', $forwardedFor.', '.$request->server->get('REMOTE_ADDR'));
+        } else {
+            $request->headers->set('X-Forwarded-For', $request->server->get('REMOTE_ADDR'));
+        }
+
+        // fix the client IP address by setting it to 127.0.0.1 as HttpCache
+        // is always called from the same process as the backend.
+        $request->server->set('REMOTE_ADDR', '127.0.0.1');
+
+        // make sure HttpCache is a trusted proxy
+        if (!in_array('127.0.0.1', $trustedProxies = Request::getTrustedProxies())) {
+            $trustedProxies[] = '127.0.0.1';
+            Request::setTrustedProxies($trustedProxies);
+        }
+
+        // always a "master" request (as the real master request can be in cache)
+        $response = $this->kernel->handle($request, HttpKernelInterface::MASTER_REQUEST, $catch);
+        // FIXME: we probably need to also catch exceptions if raw === true
+
+        // we don't implement the stale-if-error on Requests, which is nonetheless part of the RFC
+        if (null !== $entry && in_array($response->getStatusCode(), array(500, 502, 503, 504))) {
+            if (null === $age = $entry->headers->getCacheControlDirective('stale-if-error')) {
+                $age = $this->options['stale_if_error'];
+            }
+
+            if (abs($entry->getTtl()) < $age) {
+                $this->record($request, 'stale-if-error');
+
+                return $entry;
+            }
+        }
+
+        $this->processResponseBody($request, $response);
+
+        if ($this->isPrivateRequest($request) && !$response->headers->hasCacheControlDirective('public')) {
+            $response->setPrivate();
+        } elseif ($this->options['default_ttl'] > 0 && null === $response->getTtl() && !$response->headers->getCacheControlDirective('must-revalidate')) {
+            $response->setTtl($this->options['default_ttl']);
+        }
+
+        return $response;
+    }
+
+    /**
+     * Checks whether the cache entry is "fresh enough" to satisfy the Request.
+     *
+     * @param Request  $request A Request instance
+     * @param Response $entry   A Response instance
+     *
+     * @return bool true if the cache entry if fresh enough, false otherwise
+     */
+    protected function isFreshEnough(Request $request, Response $entry)
+    {
+        if (!$entry->isFresh()) {
+            return $this->lock($request, $entry);
+        }
+
+        if ($this->options['allow_revalidate'] && null !== $maxAge = $request->headers->getCacheControlDirective('max-age')) {
+            return $maxAge > 0 && $maxAge >= $entry->getAge();
+        }
+
+        return true;
+    }
+
+    /**
+     * Locks a Request during the call to the backend.
+     *
+     * @param Request  $request A Request instance
+     * @param Response $entry   A Response instance
+     *
+     * @return bool true if the cache entry can be returned even if it is staled, false otherwise
+     */
+    protected function lock(Request $request, Response $entry)
+    {
+        // try to acquire a lock to call the backend
+        $lock = $this->store->lock($request);
+
+        // there is already another process calling the backend
+        if (true !== $lock) {
+            // check if we can serve the stale entry
+            if (null === $age = $entry->headers->getCacheControlDirective('stale-while-revalidate')) {
+                $age = $this->options['stale_while_revalidate'];
+            }
+
+            if (abs($entry->getTtl()) < $age) {
+                $this->record($request, 'stale-while-revalidate');
+
+                // server the stale response while there is a revalidation
+                return true;
+            }
+
+            // wait for the lock to be released
+            $wait = 0;
+            while ($this->store->isLocked($request) && $wait < 5000000) {
+                usleep(50000);
+                $wait += 50000;
+            }
+
+            if ($wait < 5000000) {
+                // replace the current entry with the fresh one
+                $new = $this->lookup($request);
+                $entry->headers = $new->headers;
+                $entry->setContent($new->getContent());
+                $entry->setStatusCode($new->getStatusCode());
+                $entry->setProtocolVersion($new->getProtocolVersion());
+                foreach ($new->headers->getCookies() as $cookie) {
+                    $entry->headers->setCookie($cookie);
+                }
+            } else {
+                // backend is slow as hell, send a 503 response (to avoid the dog pile effect)
+                $entry->setStatusCode(503);
+                $entry->setContent('503 Service Unavailable');
+                $entry->headers->set('Retry-After', 10);
+            }
+
+            return true;
+        }
+
+        // we have the lock, call the backend
+        return false;
+    }
+
+    /**
+     * Writes the Response to the cache.
+     *
+     * @param Request  $request  A Request instance
+     * @param Response $response A Response instance
+     *
+     * @throws \Exception
+     */
+    protected function store(Request $request, Response $response)
+    {
+        if (!$response->headers->has('Date')) {
+            $response->setDate(\DateTime::createFromFormat('U', time()));
+        }
+        try {
+            $this->store->write($request, $response);
+
+            $this->record($request, 'store');
+
+            $response->headers->set('Age', $response->getAge());
+        } catch (\Exception $e) {
+            $this->record($request, 'store-failed');
+
+            if ($this->options['debug']) {
+                throw $e;
+            }
+        }
+
+        // now that the response is cached, release the lock
+        $this->store->unlock($request);
+    }
+
+    /**
+     * Restores the Response body.
+     *
+     * @param Request  $request  A Request instance
+     * @param Response $response A Response instance
+     */
+    private function restoreResponseBody(Request $request, Response $response)
+    {
+        if ($request->isMethod('HEAD') || 304 === $response->getStatusCode()) {
+            $response->setContent(null);
+            $response->headers->remove('X-Body-Eval');
+            $response->headers->remove('X-Body-File');
+
+            return;
+        }
+
+        if ($response->headers->has('X-Body-Eval')) {
+            ob_start();
+
+            if ($response->headers->has('X-Body-File')) {
+                include $response->headers->get('X-Body-File');
+            } else {
+                eval('; ?>'.$response->getContent().'<?php ;');
+            }
+
+            $response->setContent(ob_get_clean());
+            $response->headers->remove('X-Body-Eval');
+            if (!$response->headers->has('Transfer-Encoding')) {
+                $response->headers->set('Content-Length', strlen($response->getContent()));
+            }
+        } elseif ($response->headers->has('X-Body-File')) {
+            $response->setContent(file_get_contents($response->headers->get('X-Body-File')));
+        } else {
+            return;
+        }
+
+        $response->headers->remove('X-Body-File');
+    }
+
+    protected function processResponseBody(Request $request, Response $response)
+    {
+        if (null !== $this->surrogate && $this->surrogate->needsParsing($response)) {
+            $this->surrogate->process($request, $response);
+        }
+    }
+
+    /**
+     * Checks if the Request includes authorization or other sensitive information
+     * that should cause the Response to be considered private by default.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return bool true if the Request is private, false otherwise
+     */
+    private function isPrivateRequest(Request $request)
+    {
+        foreach ($this->options['private_headers'] as $key) {
+            $key = strtolower(str_replace('HTTP_', '', $key));
+
+            if ('cookie' === $key) {
+                if (count($request->cookies->all())) {
+                    return true;
+                }
+            } elseif ($request->headers->has($key)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Records that an event took place.
+     *
+     * @param Request $request A Request instance
+     * @param string  $event   The event name
+     */
+    private function record(Request $request, $event)
+    {
+        $path = $request->getPathInfo();
+        if ($qs = $request->getQueryString()) {
+            $path .= '?'.$qs;
+        }
+        $this->traces[$request->getMethod().' '.$path][] = $event;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/HttpCache/ResponseCacheStrategy.php
@@ -0,0 +1,93 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * This code is partially based on the Rack-Cache library by Ryan Tomayko,
+ * which is released under the MIT license.
+ * (based on commit 02d2b48d75bcb63cf1c0c7149c077ad256542801)
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\HttpCache;
+
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * ResponseCacheStrategy knows how to compute the Response cache HTTP header
+ * based on the different response cache headers.
+ *
+ * This implementation changes the master response TTL to the smallest TTL received
+ * or force validation if one of the surrogates has validation cache strategy.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ResponseCacheStrategy implements ResponseCacheStrategyInterface
+{
+    private $cacheable = true;
+    private $embeddedResponses = 0;
+    private $ttls = array();
+    private $maxAges = array();
+    private $isNotCacheableResponseEmbedded = false;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function add(Response $response)
+    {
+        if ($response->isValidateable()) {
+            $this->cacheable = false;
+        } else {
+            $maxAge = $response->getMaxAge();
+            $this->ttls[] = $response->getTtl();
+            $this->maxAges[] = $maxAge;
+
+            if (null === $maxAge) {
+                $this->isNotCacheableResponseEmbedded = true;
+            }
+        }
+
+        ++$this->embeddedResponses;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function update(Response $response)
+    {
+        // if we have no embedded Response, do nothing
+        if (0 === $this->embeddedResponses) {
+            return;
+        }
+
+        // Remove validation related headers in order to avoid browsers using
+        // their own cache, because some of the response content comes from
+        // at least one embedded response (which likely has a different caching strategy).
+        if ($response->isValidateable()) {
+            $response->setEtag(null);
+            $response->setLastModified(null);
+            $this->cacheable = false;
+        }
+
+        if (!$this->cacheable) {
+            $response->headers->set('Cache-Control', 'no-cache, must-revalidate');
+
+            return;
+        }
+
+        $this->ttls[] = $response->getTtl();
+        $this->maxAges[] = $response->getMaxAge();
+
+        if ($this->isNotCacheableResponseEmbedded) {
+            $response->headers->removeCacheControlDirective('s-maxage');
+        } elseif (null !== $maxAge = min($this->maxAges)) {
+            $response->setSharedMaxAge($maxAge);
+            $response->headers->set('Age', $maxAge - min($this->ttls));
+        }
+        $response->setMaxAge(0);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/HttpCache/ResponseCacheStrategyInterface.php
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * This code is partially based on the Rack-Cache library by Ryan Tomayko,
+ * which is released under the MIT license.
+ * (based on commit 02d2b48d75bcb63cf1c0c7149c077ad256542801)
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\HttpCache;
+
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * ResponseCacheStrategyInterface implementations know how to compute the
+ * Response cache HTTP header based on the different response cache headers.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface ResponseCacheStrategyInterface
+{
+    /**
+     * Adds a Response.
+     *
+     * @param Response $response
+     */
+    public function add(Response $response);
+
+    /**
+     * Updates the Response HTTP headers based on the embedded Responses.
+     *
+     * @param Response $response
+     */
+    public function update(Response $response);
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/HttpCache/Ssi.php
@@ -0,0 +1,194 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\HttpCache;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+
+/**
+ * Ssi implements the SSI capabilities to Request and Response instances.
+ *
+ * @author Sebastian Krebs <krebs.seb@gmail.com>
+ */
+class Ssi implements SurrogateInterface
+{
+    private $contentTypes;
+    private $phpEscapeMap = array(
+        array('<?', '<%', '<s', '<S'),
+        array('<?php echo "<?"; ?>', '<?php echo "<%"; ?>', '<?php echo "<s"; ?>', '<?php echo "<S"; ?>'),
+    );
+
+    /**
+     * Constructor.
+     *
+     * @param array $contentTypes An array of content-type that should be parsed for SSI information
+     *                            (default: text/html, text/xml, application/xhtml+xml, and application/xml)
+     */
+    public function __construct(array $contentTypes = array('text/html', 'text/xml', 'application/xhtml+xml', 'application/xml'))
+    {
+        $this->contentTypes = $contentTypes;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'ssi';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function createCacheStrategy()
+    {
+        return new ResponseCacheStrategy();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasSurrogateCapability(Request $request)
+    {
+        if (null === $value = $request->headers->get('Surrogate-Capability')) {
+            return false;
+        }
+
+        return false !== strpos($value, 'SSI/1.0');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addSurrogateCapability(Request $request)
+    {
+        $current = $request->headers->get('Surrogate-Capability');
+        $new = 'symfony2="SSI/1.0"';
+
+        $request->headers->set('Surrogate-Capability', $current ? $current.', '.$new : $new);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addSurrogateControl(Response $response)
+    {
+        if (false !== strpos($response->getContent(), '<!--#include')) {
+            $response->headers->set('Surrogate-Control', 'content="SSI/1.0"');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function needsParsing(Response $response)
+    {
+        if (!$control = $response->headers->get('Surrogate-Control')) {
+            return false;
+        }
+
+        return (bool) preg_match('#content="[^"]*SSI/1.0[^"]*"#', $control);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function renderIncludeTag($uri, $alt = null, $ignoreErrors = true, $comment = '')
+    {
+        return sprintf('<!--#include virtual="%s" -->', $uri);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function process(Request $request, Response $response)
+    {
+        $type = $response->headers->get('Content-Type');
+        if (empty($type)) {
+            $type = 'text/html';
+        }
+
+        $parts = explode(';', $type);
+        if (!in_array($parts[0], $this->contentTypes)) {
+            return $response;
+        }
+
+        // we don't use a proper XML parser here as we can have SSI tags in a plain text response
+        $content = $response->getContent();
+
+        $chunks = preg_split('#<!--\#include\s+(.*?)\s*-->#', $content, -1, PREG_SPLIT_DELIM_CAPTURE);
+        $chunks[0] = str_replace($this->phpEscapeMap[0], $this->phpEscapeMap[1], $chunks[0]);
+
+        $i = 1;
+        while (isset($chunks[$i])) {
+            $options = array();
+            preg_match_all('/(virtual)="([^"]*?)"/', $chunks[$i], $matches, PREG_SET_ORDER);
+            foreach ($matches as $set) {
+                $options[$set[1]] = $set[2];
+            }
+
+            if (!isset($options['virtual'])) {
+                throw new \RuntimeException('Unable to process an SSI tag without a "virtual" attribute.');
+            }
+
+            $chunks[$i] = sprintf('<?php echo $this->surrogate->handle($this, %s, \'\', false) ?>'."\n",
+                var_export($options['virtual'], true)
+            );
+            ++$i;
+            $chunks[$i] = str_replace($this->phpEscapeMap[0], $this->phpEscapeMap[1], $chunks[$i]);
+            ++$i;
+        }
+        $content = implode('', $chunks);
+
+        $response->setContent($content);
+        $response->headers->set('X-Body-Eval', 'SSI');
+
+        // remove SSI/1.0 from the Surrogate-Control header
+        if ($response->headers->has('Surrogate-Control')) {
+            $value = $response->headers->get('Surrogate-Control');
+            if ('content="SSI/1.0"' == $value) {
+                $response->headers->remove('Surrogate-Control');
+            } elseif (preg_match('#,\s*content="SSI/1.0"#', $value)) {
+                $response->headers->set('Surrogate-Control', preg_replace('#,\s*content="SSI/1.0"#', '', $value));
+            } elseif (preg_match('#content="SSI/1.0",\s*#', $value)) {
+                $response->headers->set('Surrogate-Control', preg_replace('#content="SSI/1.0",\s*#', '', $value));
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function handle(HttpCache $cache, $uri, $alt, $ignoreErrors)
+    {
+        $subRequest = Request::create($uri, 'get', array(), $cache->getRequest()->cookies->all(), array(), $cache->getRequest()->server->all());
+
+        try {
+            $response = $cache->handle($subRequest, HttpKernelInterface::SUB_REQUEST, true);
+
+            if (!$response->isSuccessful()) {
+                throw new \RuntimeException(sprintf('Error when rendering "%s" (Status code is %s).', $subRequest->getUri(), $response->getStatusCode()));
+            }
+
+            return $response->getContent();
+        } catch (\Exception $e) {
+            if ($alt) {
+                return $this->handle($cache, $alt, '', $ignoreErrors);
+            }
+
+            if (!$ignoreErrors) {
+                throw $e;
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/HttpCache/Store.php
@@ -0,0 +1,489 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * This code is partially based on the Rack-Cache library by Ryan Tomayko,
+ * which is released under the MIT license.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\HttpCache;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * Store implements all the logic for storing cache metadata (Request and Response headers).
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Store implements StoreInterface
+{
+    protected $root;
+    private $keyCache;
+    private $locks;
+
+    /**
+     * Constructor.
+     *
+     * @param string $root The path to the cache directory
+     *
+     * @throws \RuntimeException
+     */
+    public function __construct($root)
+    {
+        $this->root = $root;
+        if (!file_exists($this->root) && !@mkdir($this->root, 0777, true) && !is_dir($this->root)) {
+            throw new \RuntimeException(sprintf('Unable to create the store directory (%s).', $this->root));
+        }
+        $this->keyCache = new \SplObjectStorage();
+        $this->locks = array();
+    }
+
+    /**
+     * Cleanups storage.
+     */
+    public function cleanup()
+    {
+        // unlock everything
+        foreach ($this->locks as $lock) {
+            flock($lock, LOCK_UN);
+            fclose($lock);
+        }
+
+        $this->locks = array();
+    }
+
+    /**
+     * Tries to lock the cache for a given Request, without blocking.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return bool|string true if the lock is acquired, the path to the current lock otherwise
+     */
+    public function lock(Request $request)
+    {
+        $key = $this->getCacheKey($request);
+
+        if (!isset($this->locks[$key])) {
+            $path = $this->getPath($key);
+            if (!file_exists(dirname($path)) && false === @mkdir(dirname($path), 0777, true) && !is_dir(dirname($path))) {
+                return $path;
+            }
+            $h = fopen($path, 'cb');
+            if (!flock($h, LOCK_EX | LOCK_NB)) {
+                fclose($h);
+
+                return $path;
+            }
+
+            $this->locks[$key] = $h;
+        }
+
+        return true;
+    }
+
+    /**
+     * Releases the lock for the given Request.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return bool False if the lock file does not exist or cannot be unlocked, true otherwise
+     */
+    public function unlock(Request $request)
+    {
+        $key = $this->getCacheKey($request);
+
+        if (isset($this->locks[$key])) {
+            flock($this->locks[$key], LOCK_UN);
+            fclose($this->locks[$key]);
+            unset($this->locks[$key]);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    public function isLocked(Request $request)
+    {
+        $key = $this->getCacheKey($request);
+
+        if (isset($this->locks[$key])) {
+            return true; // shortcut if lock held by this process
+        }
+
+        if (!file_exists($path = $this->getPath($key))) {
+            return false;
+        }
+
+        $h = fopen($path, 'rb');
+        flock($h, LOCK_EX | LOCK_NB, $wouldBlock);
+        flock($h, LOCK_UN); // release the lock we just acquired
+        fclose($h);
+
+        return (bool) $wouldBlock;
+    }
+
+    /**
+     * Locates a cached Response for the Request provided.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return Response|null A Response instance, or null if no cache entry was found
+     */
+    public function lookup(Request $request)
+    {
+        $key = $this->getCacheKey($request);
+
+        if (!$entries = $this->getMetadata($key)) {
+            return;
+        }
+
+        // find a cached entry that matches the request.
+        $match = null;
+        foreach ($entries as $entry) {
+            if ($this->requestsMatch(isset($entry[1]['vary'][0]) ? implode(', ', $entry[1]['vary']) : '', $request->headers->all(), $entry[0])) {
+                $match = $entry;
+
+                break;
+            }
+        }
+
+        if (null === $match) {
+            return;
+        }
+
+        list($req, $headers) = $match;
+        if (file_exists($body = $this->getPath($headers['x-content-digest'][0]))) {
+            return $this->restoreResponse($headers, $body);
+        }
+
+        // TODO the metaStore referenced an entity that doesn't exist in
+        // the entityStore. We definitely want to return nil but we should
+        // also purge the entry from the meta-store when this is detected.
+    }
+
+    /**
+     * Writes a cache entry to the store for the given Request and Response.
+     *
+     * Existing entries are read and any that match the response are removed. This
+     * method calls write with the new list of cache entries.
+     *
+     * @param Request  $request  A Request instance
+     * @param Response $response A Response instance
+     *
+     * @return string The key under which the response is stored
+     *
+     * @throws \RuntimeException
+     */
+    public function write(Request $request, Response $response)
+    {
+        $key = $this->getCacheKey($request);
+        $storedEnv = $this->persistRequest($request);
+
+        // write the response body to the entity store if this is the original response
+        if (!$response->headers->has('X-Content-Digest')) {
+            $digest = $this->generateContentDigest($response);
+
+            if (false === $this->save($digest, $response->getContent())) {
+                throw new \RuntimeException('Unable to store the entity.');
+            }
+
+            $response->headers->set('X-Content-Digest', $digest);
+
+            if (!$response->headers->has('Transfer-Encoding')) {
+                $response->headers->set('Content-Length', strlen($response->getContent()));
+            }
+        }
+
+        // read existing cache entries, remove non-varying, and add this one to the list
+        $entries = array();
+        $vary = $response->headers->get('vary');
+        foreach ($this->getMetadata($key) as $entry) {
+            if (!isset($entry[1]['vary'][0])) {
+                $entry[1]['vary'] = array('');
+            }
+
+            if ($vary != $entry[1]['vary'][0] || !$this->requestsMatch($vary, $entry[0], $storedEnv)) {
+                $entries[] = $entry;
+            }
+        }
+
+        $headers = $this->persistResponse($response);
+        unset($headers['age']);
+
+        array_unshift($entries, array($storedEnv, $headers));
+
+        if (false === $this->save($key, serialize($entries))) {
+            throw new \RuntimeException('Unable to store the metadata.');
+        }
+
+        return $key;
+    }
+
+    /**
+     * Returns content digest for $response.
+     *
+     * @param Response $response
+     *
+     * @return string
+     */
+    protected function generateContentDigest(Response $response)
+    {
+        return 'en'.hash('sha256', $response->getContent());
+    }
+
+    /**
+     * Invalidates all cache entries that match the request.
+     *
+     * @param Request $request A Request instance
+     *
+     * @throws \RuntimeException
+     */
+    public function invalidate(Request $request)
+    {
+        $modified = false;
+        $key = $this->getCacheKey($request);
+
+        $entries = array();
+        foreach ($this->getMetadata($key) as $entry) {
+            $response = $this->restoreResponse($entry[1]);
+            if ($response->isFresh()) {
+                $response->expire();
+                $modified = true;
+                $entries[] = array($entry[0], $this->persistResponse($response));
+            } else {
+                $entries[] = $entry;
+            }
+        }
+
+        if ($modified && false === $this->save($key, serialize($entries))) {
+            throw new \RuntimeException('Unable to store the metadata.');
+        }
+    }
+
+    /**
+     * Determines whether two Request HTTP header sets are non-varying based on
+     * the vary response header value provided.
+     *
+     * @param string $vary A Response vary header
+     * @param array  $env1 A Request HTTP header array
+     * @param array  $env2 A Request HTTP header array
+     *
+     * @return bool true if the two environments match, false otherwise
+     */
+    private function requestsMatch($vary, $env1, $env2)
+    {
+        if (empty($vary)) {
+            return true;
+        }
+
+        foreach (preg_split('/[\s,]+/', $vary) as $header) {
+            $key = str_replace('_', '-', strtolower($header));
+            $v1 = isset($env1[$key]) ? $env1[$key] : null;
+            $v2 = isset($env2[$key]) ? $env2[$key] : null;
+            if ($v1 !== $v2) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Gets all data associated with the given key.
+     *
+     * Use this method only if you know what you are doing.
+     *
+     * @param string $key The store key
+     *
+     * @return array An array of data associated with the key
+     */
+    private function getMetadata($key)
+    {
+        if (!$entries = $this->load($key)) {
+            return array();
+        }
+
+        return unserialize($entries);
+    }
+
+    /**
+     * Purges data for the given URL.
+     *
+     * @param string $url A URL
+     *
+     * @return bool true if the URL exists and has been purged, false otherwise
+     */
+    public function purge($url)
+    {
+        $key = $this->getCacheKey(Request::create($url));
+
+        if (isset($this->locks[$key])) {
+            flock($this->locks[$key], LOCK_UN);
+            fclose($this->locks[$key]);
+            unset($this->locks[$key]);
+        }
+
+        if (file_exists($path = $this->getPath($key))) {
+            unlink($path);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Loads data for the given key.
+     *
+     * @param string $key The store key
+     *
+     * @return string The data associated with the key
+     */
+    private function load($key)
+    {
+        $path = $this->getPath($key);
+
+        return file_exists($path) ? file_get_contents($path) : false;
+    }
+
+    /**
+     * Save data for the given key.
+     *
+     * @param string $key  The store key
+     * @param string $data The data to store
+     *
+     * @return bool
+     */
+    private function save($key, $data)
+    {
+        $path = $this->getPath($key);
+
+        if (isset($this->locks[$key])) {
+            $fp = $this->locks[$key];
+            @ftruncate($fp, 0);
+            @fseek($fp, 0);
+            $len = @fwrite($fp, $data);
+            if (strlen($data) !== $len) {
+                @ftruncate($fp, 0);
+
+                return false;
+            }
+        } else {
+            if (!file_exists(dirname($path)) && false === @mkdir(dirname($path), 0777, true) && !is_dir(dirname($path))) {
+                return false;
+            }
+
+            $tmpFile = tempnam(dirname($path), basename($path));
+            if (false === $fp = @fopen($tmpFile, 'wb')) {
+                return false;
+            }
+            @fwrite($fp, $data);
+            @fclose($fp);
+
+            if ($data != file_get_contents($tmpFile)) {
+                return false;
+            }
+
+            if (false === @rename($tmpFile, $path)) {
+                return false;
+            }
+        }
+
+        @chmod($path, 0666 & ~umask());
+    }
+
+    public function getPath($key)
+    {
+        return $this->root.DIRECTORY_SEPARATOR.substr($key, 0, 2).DIRECTORY_SEPARATOR.substr($key, 2, 2).DIRECTORY_SEPARATOR.substr($key, 4, 2).DIRECTORY_SEPARATOR.substr($key, 6);
+    }
+
+    /**
+     * Generates a cache key for the given Request.
+     *
+     * This method should return a key that must only depend on a
+     * normalized version of the request URI.
+     *
+     * If the same URI can have more than one representation, based on some
+     * headers, use a Vary header to indicate them, and each representation will
+     * be stored independently under the same cache key.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return string A key for the given Request
+     */
+    protected function generateCacheKey(Request $request)
+    {
+        return 'md'.hash('sha256', $request->getUri());
+    }
+
+    /**
+     * Returns a cache key for the given Request.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return string A key for the given Request
+     */
+    private function getCacheKey(Request $request)
+    {
+        if (isset($this->keyCache[$request])) {
+            return $this->keyCache[$request];
+        }
+
+        return $this->keyCache[$request] = $this->generateCacheKey($request);
+    }
+
+    /**
+     * Persists the Request HTTP headers.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return array An array of HTTP headers
+     */
+    private function persistRequest(Request $request)
+    {
+        return $request->headers->all();
+    }
+
+    /**
+     * Persists the Response HTTP headers.
+     *
+     * @param Response $response A Response instance
+     *
+     * @return array An array of HTTP headers
+     */
+    private function persistResponse(Response $response)
+    {
+        $headers = $response->headers->all();
+        $headers['X-Status'] = array($response->getStatusCode());
+
+        return $headers;
+    }
+
+    /**
+     * Restores a Response from the HTTP headers and body.
+     *
+     * @param array  $headers An array of HTTP headers for the Response
+     * @param string $body    The Response body
+     *
+     * @return Response
+     */
+    private function restoreResponse($headers, $body = null)
+    {
+        $status = $headers['X-Status'][0];
+        unset($headers['X-Status']);
+
+        if (null !== $body) {
+            $headers['X-Body-File'] = array($body);
+        }
+
+        return new Response($body, $status, $headers);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/HttpCache/StoreInterface.php
@@ -0,0 +1,96 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * This code is partially based on the Rack-Cache library by Ryan Tomayko,
+ * which is released under the MIT license.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\HttpCache;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * Interface implemented by HTTP cache stores.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface StoreInterface
+{
+    /**
+     * Locates a cached Response for the Request provided.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return Response|null A Response instance, or null if no cache entry was found
+     */
+    public function lookup(Request $request);
+
+    /**
+     * Writes a cache entry to the store for the given Request and Response.
+     *
+     * Existing entries are read and any that match the response are removed. This
+     * method calls write with the new list of cache entries.
+     *
+     * @param Request  $request  A Request instance
+     * @param Response $response A Response instance
+     *
+     * @return string The key under which the response is stored
+     */
+    public function write(Request $request, Response $response);
+
+    /**
+     * Invalidates all cache entries that match the request.
+     *
+     * @param Request $request A Request instance
+     */
+    public function invalidate(Request $request);
+
+    /**
+     * Locks the cache for a given Request.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return bool|string true if the lock is acquired, the path to the current lock otherwise
+     */
+    public function lock(Request $request);
+
+    /**
+     * Releases the lock for the given Request.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return bool False if the lock file does not exist or cannot be unlocked, true otherwise
+     */
+    public function unlock(Request $request);
+
+    /**
+     * Returns whether or not a lock exists.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return bool true if lock exists, false otherwise
+     */
+    public function isLocked(Request $request);
+
+    /**
+     * Purges data for the given URL.
+     *
+     * @param string $url A URL
+     *
+     * @return bool true if the URL exists and has been purged, false otherwise
+     */
+    public function purge($url);
+
+    /**
+     * Cleanups storage.
+     */
+    public function cleanup();
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/HttpCache/SurrogateInterface.php
@@ -0,0 +1,103 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\HttpCache;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+interface SurrogateInterface
+{
+    /**
+     * Returns surrogate name.
+     *
+     * @return string
+     */
+    public function getName();
+
+    /**
+     * Returns a new cache strategy instance.
+     *
+     * @return ResponseCacheStrategyInterface A ResponseCacheStrategyInterface instance
+     */
+    public function createCacheStrategy();
+
+    /**
+     * Checks that at least one surrogate has Surrogate capability.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return bool true if one surrogate has Surrogate capability, false otherwise
+     */
+    public function hasSurrogateCapability(Request $request);
+
+    /**
+     * Adds Surrogate-capability to the given Request.
+     *
+     * @param Request $request A Request instance
+     */
+    public function addSurrogateCapability(Request $request);
+
+    /**
+     * Adds HTTP headers to specify that the Response needs to be parsed for Surrogate.
+     *
+     * This method only adds an Surrogate HTTP header if the Response has some Surrogate tags.
+     *
+     * @param Response $response A Response instance
+     */
+    public function addSurrogateControl(Response $response);
+
+    /**
+     * Checks that the Response needs to be parsed for Surrogate tags.
+     *
+     * @param Response $response A Response instance
+     *
+     * @return bool true if the Response needs to be parsed, false otherwise
+     */
+    public function needsParsing(Response $response);
+
+    /**
+     * Renders a Surrogate tag.
+     *
+     * @param string $uri          A URI
+     * @param string $alt          An alternate URI
+     * @param bool   $ignoreErrors Whether to ignore errors or not
+     * @param string $comment      A comment to add as an esi:include tag
+     *
+     * @return string
+     */
+    public function renderIncludeTag($uri, $alt = null, $ignoreErrors = true, $comment = '');
+
+    /**
+     * Replaces a Response Surrogate tags with the included resource content.
+     *
+     * @param Request  $request  A Request instance
+     * @param Response $response A Response instance
+     *
+     * @return Response
+     */
+    public function process(Request $request, Response $response);
+
+    /**
+     * Handles a Surrogate from the cache.
+     *
+     * @param HttpCache $cache        An HttpCache instance
+     * @param string    $uri          The main URI
+     * @param string    $alt          An alternative URI
+     * @param bool      $ignoreErrors Whether to ignore errors or not
+     *
+     * @return string
+     *
+     * @throws \RuntimeException
+     * @throws \Exception
+     */
+    public function handle(HttpCache $cache, $uri, $alt, $ignoreErrors);
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/HttpKernel.php
@@ -0,0 +1,290 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel;
+
+use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
+use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
+use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
+use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
+use Symfony\Component\HttpKernel\Event\PostResponseEvent;
+use Symfony\Component\HttpFoundation\Exception\ConflictingHeadersException;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+
+/**
+ * HttpKernel notifies events to convert a Request object to a Response one.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class HttpKernel implements HttpKernelInterface, TerminableInterface
+{
+    protected $dispatcher;
+    protected $resolver;
+    protected $requestStack;
+
+    /**
+     * Constructor.
+     *
+     * @param EventDispatcherInterface    $dispatcher   An EventDispatcherInterface instance
+     * @param ControllerResolverInterface $resolver     A ControllerResolverInterface instance
+     * @param RequestStack                $requestStack A stack for master/sub requests
+     */
+    public function __construct(EventDispatcherInterface $dispatcher, ControllerResolverInterface $resolver, RequestStack $requestStack = null)
+    {
+        $this->dispatcher = $dispatcher;
+        $this->resolver = $resolver;
+        $this->requestStack = $requestStack ?: new RequestStack();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
+    {
+        $request->headers->set('X-Php-Ob-Level', ob_get_level());
+
+        try {
+            return $this->handleRaw($request, $type);
+        } catch (\Exception $e) {
+            if ($e instanceof ConflictingHeadersException) {
+                $e = new BadRequestHttpException('The request headers contain conflicting information regarding the origin of this request.', $e);
+            }
+            if (false === $catch) {
+                $this->finishRequest($request, $type);
+
+                throw $e;
+            }
+
+            return $this->handleException($e, $request, $type);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function terminate(Request $request, Response $response)
+    {
+        $this->dispatcher->dispatch(KernelEvents::TERMINATE, new PostResponseEvent($this, $request, $response));
+    }
+
+    /**
+     * @throws \LogicException If the request stack is empty
+     *
+     * @internal
+     */
+    public function terminateWithException(\Exception $exception)
+    {
+        if (!$request = $this->requestStack->getMasterRequest()) {
+            throw new \LogicException('Request stack is empty', 0, $exception);
+        }
+
+        $response = $this->handleException($exception, $request, self::MASTER_REQUEST);
+
+        $response->sendHeaders();
+        $response->sendContent();
+
+        $this->terminate($request, $response);
+    }
+
+    /**
+     * Handles a request to convert it to a response.
+     *
+     * Exceptions are not caught.
+     *
+     * @param Request $request A Request instance
+     * @param int     $type    The type of the request (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST)
+     *
+     * @return Response A Response instance
+     *
+     * @throws \LogicException       If one of the listener does not behave as expected
+     * @throws NotFoundHttpException When controller cannot be found
+     */
+    private function handleRaw(Request $request, $type = self::MASTER_REQUEST)
+    {
+        $this->requestStack->push($request);
+
+        // request
+        $event = new GetResponseEvent($this, $request, $type);
+        $this->dispatcher->dispatch(KernelEvents::REQUEST, $event);
+
+        if ($event->hasResponse()) {
+            return $this->filterResponse($event->getResponse(), $request, $type);
+        }
+
+        // load controller
+        if (false === $controller = $this->resolver->getController($request)) {
+            throw new NotFoundHttpException(sprintf('Unable to find the controller for path "%s". The route is wrongly configured.', $request->getPathInfo()));
+        }
+
+        $event = new FilterControllerEvent($this, $controller, $request, $type);
+        $this->dispatcher->dispatch(KernelEvents::CONTROLLER, $event);
+        $controller = $event->getController();
+
+        // controller arguments
+        $arguments = $this->resolver->getArguments($request, $controller);
+
+        // call controller
+        $response = call_user_func_array($controller, $arguments);
+
+        // view
+        if (!$response instanceof Response) {
+            $event = new GetResponseForControllerResultEvent($this, $request, $type, $response);
+            $this->dispatcher->dispatch(KernelEvents::VIEW, $event);
+
+            if ($event->hasResponse()) {
+                $response = $event->getResponse();
+            }
+
+            if (!$response instanceof Response) {
+                $msg = sprintf('The controller must return a response (%s given).', $this->varToString($response));
+
+                // the user may have forgotten to return something
+                if (null === $response) {
+                    $msg .= ' Did you forget to add a return statement somewhere in your controller?';
+                }
+                throw new \LogicException($msg);
+            }
+        }
+
+        return $this->filterResponse($response, $request, $type);
+    }
+
+    /**
+     * Filters a response object.
+     *
+     * @param Response $response A Response instance
+     * @param Request  $request  An error message in case the response is not a Response object
+     * @param int      $type     The type of the request (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST)
+     *
+     * @return Response The filtered Response instance
+     *
+     * @throws \RuntimeException if the passed object is not a Response instance
+     */
+    private function filterResponse(Response $response, Request $request, $type)
+    {
+        $event = new FilterResponseEvent($this, $request, $type, $response);
+
+        $this->dispatcher->dispatch(KernelEvents::RESPONSE, $event);
+
+        $this->finishRequest($request, $type);
+
+        return $event->getResponse();
+    }
+
+    /**
+     * Publishes the finish request event, then pop the request from the stack.
+     *
+     * Note that the order of the operations is important here, otherwise
+     * operations such as {@link RequestStack::getParentRequest()} can lead to
+     * weird results.
+     *
+     * @param Request $request
+     * @param int     $type
+     */
+    private function finishRequest(Request $request, $type)
+    {
+        $this->dispatcher->dispatch(KernelEvents::FINISH_REQUEST, new FinishRequestEvent($this, $request, $type));
+        $this->requestStack->pop();
+    }
+
+    /**
+     * Handles an exception by trying to convert it to a Response.
+     *
+     * @param \Exception $e       An \Exception instance
+     * @param Request    $request A Request instance
+     * @param int        $type    The type of the request
+     *
+     * @return Response A Response instance
+     *
+     * @throws \Exception
+     */
+    private function handleException(\Exception $e, $request, $type)
+    {
+        $event = new GetResponseForExceptionEvent($this, $request, $type, $e);
+        $this->dispatcher->dispatch(KernelEvents::EXCEPTION, $event);
+
+        // a listener might have replaced the exception
+        $e = $event->getException();
+
+        if (!$event->hasResponse()) {
+            $this->finishRequest($request, $type);
+
+            throw $e;
+        }
+
+        $response = $event->getResponse();
+
+        // the developer asked for a specific status code
+        if ($response->headers->has('X-Status-Code')) {
+            $response->setStatusCode($response->headers->get('X-Status-Code'));
+
+            $response->headers->remove('X-Status-Code');
+        } elseif (!$response->isClientError() && !$response->isServerError() && !$response->isRedirect()) {
+            // ensure that we actually have an error response
+            if ($e instanceof HttpExceptionInterface) {
+                // keep the HTTP status code and headers
+                $response->setStatusCode($e->getStatusCode());
+                $response->headers->add($e->getHeaders());
+            } else {
+                $response->setStatusCode(500);
+            }
+        }
+
+        try {
+            return $this->filterResponse($response, $request, $type);
+        } catch (\Exception $e) {
+            return $response;
+        }
+    }
+
+    private function varToString($var)
+    {
+        if (is_object($var)) {
+            return sprintf('Object(%s)', get_class($var));
+        }
+
+        if (is_array($var)) {
+            $a = array();
+            foreach ($var as $k => $v) {
+                $a[] = sprintf('%s => %s', $k, $this->varToString($v));
+            }
+
+            return sprintf('Array(%s)', implode(', ', $a));
+        }
+
+        if (is_resource($var)) {
+            return sprintf('Resource(%s)', get_resource_type($var));
+        }
+
+        if (null === $var) {
+            return 'null';
+        }
+
+        if (false === $var) {
+            return 'false';
+        }
+
+        if (true === $var) {
+            return 'true';
+        }
+
+        return (string) $var;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/HttpKernelInterface.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * HttpKernelInterface handles a Request to convert it to a Response.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface HttpKernelInterface
+{
+    const MASTER_REQUEST = 1;
+    const SUB_REQUEST = 2;
+
+    /**
+     * Handles a Request to convert it to a Response.
+     *
+     * When $catch is true, the implementation must catch all exceptions
+     * and do its best to convert them to a Response instance.
+     *
+     * @param Request $request A Request instance
+     * @param int     $type    The type of the request
+     *                         (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST)
+     * @param bool    $catch   Whether to catch exceptions or not
+     *
+     * @return Response A Response instance
+     *
+     * @throws \Exception When an Exception occurs during processing
+     */
+    public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true);
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Kernel.php
@@ -0,0 +1,767 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel;
+
+use Symfony\Bridge\ProxyManager\LazyProxy\Instantiator\RuntimeInstantiator;
+use Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper\ProxyDumper;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
+use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
+use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
+use Symfony\Component\DependencyInjection\Loader\IniFileLoader;
+use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
+use Symfony\Component\DependencyInjection\Loader\DirectoryLoader;
+use Symfony\Component\DependencyInjection\Loader\ClosureLoader;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Bundle\BundleInterface;
+use Symfony\Component\HttpKernel\Config\EnvParametersResource;
+use Symfony\Component\HttpKernel\Config\FileLocator;
+use Symfony\Component\HttpKernel\DependencyInjection\MergeExtensionConfigurationPass;
+use Symfony\Component\HttpKernel\DependencyInjection\AddClassesToCachePass;
+use Symfony\Component\Config\Loader\LoaderResolver;
+use Symfony\Component\Config\Loader\DelegatingLoader;
+use Symfony\Component\Config\ConfigCache;
+use Symfony\Component\ClassLoader\ClassCollectionLoader;
+
+/**
+ * The Kernel is the heart of the Symfony system.
+ *
+ * It manages an environment made of bundles.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class Kernel implements KernelInterface, TerminableInterface
+{
+    /**
+     * @var BundleInterface[]
+     */
+    protected $bundles = array();
+
+    protected $bundleMap;
+    protected $container;
+    protected $rootDir;
+    protected $environment;
+    protected $debug;
+    protected $booted = false;
+    protected $name;
+    protected $startTime;
+    protected $loadClassCache;
+
+    const VERSION = '2.8.14';
+    const VERSION_ID = 20814;
+    const MAJOR_VERSION = 2;
+    const MINOR_VERSION = 8;
+    const RELEASE_VERSION = 14;
+    const EXTRA_VERSION = '';
+
+    const END_OF_MAINTENANCE = '11/2018';
+    const END_OF_LIFE = '11/2019';
+
+    /**
+     * Constructor.
+     *
+     * @param string $environment The environment
+     * @param bool   $debug       Whether to enable debugging or not
+     */
+    public function __construct($environment, $debug)
+    {
+        $this->environment = $environment;
+        $this->debug = (bool) $debug;
+        $this->rootDir = $this->getRootDir();
+        $this->name = $this->getName();
+
+        if ($this->debug) {
+            $this->startTime = microtime(true);
+        }
+
+        $defClass = new \ReflectionMethod($this, 'init');
+        $defClass = $defClass->getDeclaringClass()->name;
+
+        if (__CLASS__ !== $defClass) {
+            @trigger_error(sprintf('Calling the %s::init() method is deprecated since version 2.3 and will be removed in 3.0. Move your logic to the constructor method instead.', $defClass), E_USER_DEPRECATED);
+            $this->init();
+        }
+    }
+
+    /**
+     * @deprecated since version 2.3, to be removed in 3.0. Move your logic in the constructor instead.
+     */
+    public function init()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.3 and will be removed in 3.0. Move your logic to the constructor method instead.', E_USER_DEPRECATED);
+    }
+
+    public function __clone()
+    {
+        if ($this->debug) {
+            $this->startTime = microtime(true);
+        }
+
+        $this->booted = false;
+        $this->container = null;
+    }
+
+    /**
+     * Boots the current kernel.
+     */
+    public function boot()
+    {
+        if (true === $this->booted) {
+            return;
+        }
+
+        if ($this->loadClassCache) {
+            $this->doLoadClassCache($this->loadClassCache[0], $this->loadClassCache[1]);
+        }
+
+        // init bundles
+        $this->initializeBundles();
+
+        // init container
+        $this->initializeContainer();
+
+        foreach ($this->getBundles() as $bundle) {
+            $bundle->setContainer($this->container);
+            $bundle->boot();
+        }
+
+        $this->booted = true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function terminate(Request $request, Response $response)
+    {
+        if (false === $this->booted) {
+            return;
+        }
+
+        if ($this->getHttpKernel() instanceof TerminableInterface) {
+            $this->getHttpKernel()->terminate($request, $response);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function shutdown()
+    {
+        if (false === $this->booted) {
+            return;
+        }
+
+        $this->booted = false;
+
+        foreach ($this->getBundles() as $bundle) {
+            $bundle->shutdown();
+            $bundle->setContainer(null);
+        }
+
+        $this->container = null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
+    {
+        if (false === $this->booted) {
+            $this->boot();
+        }
+
+        return $this->getHttpKernel()->handle($request, $type, $catch);
+    }
+
+    /**
+     * Gets a HTTP kernel from the container.
+     *
+     * @return HttpKernel
+     */
+    protected function getHttpKernel()
+    {
+        return $this->container->get('http_kernel');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBundles()
+    {
+        return $this->bundles;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @deprecated since version 2.6, to be removed in 3.0.
+     */
+    public function isClassInActiveBundle($class)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in version 3.0.', E_USER_DEPRECATED);
+
+        foreach ($this->getBundles() as $bundle) {
+            if (0 === strpos($class, $bundle->getNamespace())) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBundle($name, $first = true)
+    {
+        if (!isset($this->bundleMap[$name])) {
+            throw new \InvalidArgumentException(sprintf('Bundle "%s" does not exist or it is not enabled. Maybe you forgot to add it in the registerBundles() method of your %s.php file?', $name, get_class($this)));
+        }
+
+        if (true === $first) {
+            return $this->bundleMap[$name][0];
+        }
+
+        return $this->bundleMap[$name];
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @throws \RuntimeException if a custom resource is hidden by a resource in a derived bundle
+     */
+    public function locateResource($name, $dir = null, $first = true)
+    {
+        if ('@' !== $name[0]) {
+            throw new \InvalidArgumentException(sprintf('A resource name must start with @ ("%s" given).', $name));
+        }
+
+        if (false !== strpos($name, '..')) {
+            throw new \RuntimeException(sprintf('File name "%s" contains invalid characters (..).', $name));
+        }
+
+        $bundleName = substr($name, 1);
+        $path = '';
+        if (false !== strpos($bundleName, '/')) {
+            list($bundleName, $path) = explode('/', $bundleName, 2);
+        }
+
+        $isResource = 0 === strpos($path, 'Resources') && null !== $dir;
+        $overridePath = substr($path, 9);
+        $resourceBundle = null;
+        $bundles = $this->getBundle($bundleName, false);
+        $files = array();
+
+        foreach ($bundles as $bundle) {
+            if ($isResource && file_exists($file = $dir.'/'.$bundle->getName().$overridePath)) {
+                if (null !== $resourceBundle) {
+                    throw new \RuntimeException(sprintf('"%s" resource is hidden by a resource from the "%s" derived bundle. Create a "%s" file to override the bundle resource.',
+                        $file,
+                        $resourceBundle,
+                        $dir.'/'.$bundles[0]->getName().$overridePath
+                    ));
+                }
+
+                if ($first) {
+                    return $file;
+                }
+                $files[] = $file;
+            }
+
+            if (file_exists($file = $bundle->getPath().'/'.$path)) {
+                if ($first && !$isResource) {
+                    return $file;
+                }
+                $files[] = $file;
+                $resourceBundle = $bundle->getName();
+            }
+        }
+
+        if (count($files) > 0) {
+            return $first && $isResource ? $files[0] : $files;
+        }
+
+        throw new \InvalidArgumentException(sprintf('Unable to find file "%s".', $name));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        if (null === $this->name) {
+            $this->name = preg_replace('/[^a-zA-Z0-9_]+/', '', basename($this->rootDir));
+        }
+
+        return $this->name;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getEnvironment()
+    {
+        return $this->environment;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isDebug()
+    {
+        return $this->debug;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getRootDir()
+    {
+        if (null === $this->rootDir) {
+            $r = new \ReflectionObject($this);
+            $this->rootDir = dirname($r->getFileName());
+        }
+
+        return $this->rootDir;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getContainer()
+    {
+        return $this->container;
+    }
+
+    /**
+     * Loads the PHP class cache.
+     *
+     * This methods only registers the fact that you want to load the cache classes.
+     * The cache will actually only be loaded when the Kernel is booted.
+     *
+     * That optimization is mainly useful when using the HttpCache class in which
+     * case the class cache is not loaded if the Response is in the cache.
+     *
+     * @param string $name      The cache name prefix
+     * @param string $extension File extension of the resulting file
+     */
+    public function loadClassCache($name = 'classes', $extension = '.php')
+    {
+        $this->loadClassCache = array($name, $extension);
+    }
+
+    /**
+     * Used internally.
+     */
+    public function setClassCache(array $classes)
+    {
+        file_put_contents($this->getCacheDir().'/classes.map', sprintf('<?php return %s;', var_export($classes, true)));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getStartTime()
+    {
+        return $this->debug ? $this->startTime : -INF;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getCacheDir()
+    {
+        return $this->rootDir.'/cache/'.$this->environment;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getLogDir()
+    {
+        return $this->rootDir.'/logs';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getCharset()
+    {
+        return 'UTF-8';
+    }
+
+    protected function doLoadClassCache($name, $extension)
+    {
+        if (!$this->booted && is_file($this->getCacheDir().'/classes.map')) {
+            ClassCollectionLoader::load(include($this->getCacheDir().'/classes.map'), $this->getCacheDir(), $name, $this->debug, false, $extension);
+        }
+    }
+
+    /**
+     * Initializes the data structures related to the bundle management.
+     *
+     *  - the bundles property maps a bundle name to the bundle instance,
+     *  - the bundleMap property maps a bundle name to the bundle inheritance hierarchy (most derived bundle first).
+     *
+     * @throws \LogicException if two bundles share a common name
+     * @throws \LogicException if a bundle tries to extend a non-registered bundle
+     * @throws \LogicException if a bundle tries to extend itself
+     * @throws \LogicException if two bundles extend the same ancestor
+     */
+    protected function initializeBundles()
+    {
+        // init bundles
+        $this->bundles = array();
+        $topMostBundles = array();
+        $directChildren = array();
+
+        foreach ($this->registerBundles() as $bundle) {
+            $name = $bundle->getName();
+            if (isset($this->bundles[$name])) {
+                throw new \LogicException(sprintf('Trying to register two bundles with the same name "%s"', $name));
+            }
+            $this->bundles[$name] = $bundle;
+
+            if ($parentName = $bundle->getParent()) {
+                if (isset($directChildren[$parentName])) {
+                    throw new \LogicException(sprintf('Bundle "%s" is directly extended by two bundles "%s" and "%s".', $parentName, $name, $directChildren[$parentName]));
+                }
+                if ($parentName == $name) {
+                    throw new \LogicException(sprintf('Bundle "%s" can not extend itself.', $name));
+                }
+                $directChildren[$parentName] = $name;
+            } else {
+                $topMostBundles[$name] = $bundle;
+            }
+        }
+
+        // look for orphans
+        if (!empty($directChildren) && count($diff = array_diff_key($directChildren, $this->bundles))) {
+            $diff = array_keys($diff);
+
+            throw new \LogicException(sprintf('Bundle "%s" extends bundle "%s", which is not registered.', $directChildren[$diff[0]], $diff[0]));
+        }
+
+        // inheritance
+        $this->bundleMap = array();
+        foreach ($topMostBundles as $name => $bundle) {
+            $bundleMap = array($bundle);
+            $hierarchy = array($name);
+
+            while (isset($directChildren[$name])) {
+                $name = $directChildren[$name];
+                array_unshift($bundleMap, $this->bundles[$name]);
+                $hierarchy[] = $name;
+            }
+
+            foreach ($hierarchy as $hierarchyBundle) {
+                $this->bundleMap[$hierarchyBundle] = $bundleMap;
+                array_pop($bundleMap);
+            }
+        }
+    }
+
+    /**
+     * Gets the container class.
+     *
+     * @return string The container class
+     */
+    protected function getContainerClass()
+    {
+        return $this->name.ucfirst($this->environment).($this->debug ? 'Debug' : '').'ProjectContainer';
+    }
+
+    /**
+     * Gets the container's base class.
+     *
+     * All names except Container must be fully qualified.
+     *
+     * @return string
+     */
+    protected function getContainerBaseClass()
+    {
+        return 'Container';
+    }
+
+    /**
+     * Initializes the service container.
+     *
+     * The cached version of the service container is used when fresh, otherwise the
+     * container is built.
+     */
+    protected function initializeContainer()
+    {
+        $class = $this->getContainerClass();
+        $cache = new ConfigCache($this->getCacheDir().'/'.$class.'.php', $this->debug);
+        $fresh = true;
+        if (!$cache->isFresh()) {
+            $container = $this->buildContainer();
+            $container->compile();
+            $this->dumpContainer($cache, $container, $class, $this->getContainerBaseClass());
+
+            $fresh = false;
+        }
+
+        require_once $cache->getPath();
+
+        $this->container = new $class();
+        $this->container->set('kernel', $this);
+
+        if (!$fresh && $this->container->has('cache_warmer')) {
+            $this->container->get('cache_warmer')->warmUp($this->container->getParameter('kernel.cache_dir'));
+        }
+    }
+
+    /**
+     * Returns the kernel parameters.
+     *
+     * @return array An array of kernel parameters
+     */
+    protected function getKernelParameters()
+    {
+        $bundles = array();
+        foreach ($this->bundles as $name => $bundle) {
+            $bundles[$name] = get_class($bundle);
+        }
+
+        return array_merge(
+            array(
+                'kernel.root_dir' => realpath($this->rootDir) ?: $this->rootDir,
+                'kernel.environment' => $this->environment,
+                'kernel.debug' => $this->debug,
+                'kernel.name' => $this->name,
+                'kernel.cache_dir' => realpath($this->getCacheDir()) ?: $this->getCacheDir(),
+                'kernel.logs_dir' => realpath($this->getLogDir()) ?: $this->getLogDir(),
+                'kernel.bundles' => $bundles,
+                'kernel.charset' => $this->getCharset(),
+                'kernel.container_class' => $this->getContainerClass(),
+            ),
+            $this->getEnvParameters()
+        );
+    }
+
+    /**
+     * Gets the environment parameters.
+     *
+     * Only the parameters starting with "SYMFONY__" are considered.
+     *
+     * @return array An array of parameters
+     */
+    protected function getEnvParameters()
+    {
+        $parameters = array();
+        foreach ($_SERVER as $key => $value) {
+            if (0 === strpos($key, 'SYMFONY__')) {
+                $parameters[strtolower(str_replace('__', '.', substr($key, 9)))] = $value;
+            }
+        }
+
+        return $parameters;
+    }
+
+    /**
+     * Builds the service container.
+     *
+     * @return ContainerBuilder The compiled service container
+     *
+     * @throws \RuntimeException
+     */
+    protected function buildContainer()
+    {
+        foreach (array('cache' => $this->getCacheDir(), 'logs' => $this->getLogDir()) as $name => $dir) {
+            if (!is_dir($dir)) {
+                if (false === @mkdir($dir, 0777, true) && !is_dir($dir)) {
+                    throw new \RuntimeException(sprintf("Unable to create the %s directory (%s)\n", $name, $dir));
+                }
+            } elseif (!is_writable($dir)) {
+                throw new \RuntimeException(sprintf("Unable to write in the %s directory (%s)\n", $name, $dir));
+            }
+        }
+
+        $container = $this->getContainerBuilder();
+        $container->addObjectResource($this);
+        $this->prepareContainer($container);
+
+        if (null !== $cont = $this->registerContainerConfiguration($this->getContainerLoader($container))) {
+            $container->merge($cont);
+        }
+
+        $container->addCompilerPass(new AddClassesToCachePass($this));
+        $container->addResource(new EnvParametersResource('SYMFONY__'));
+
+        return $container;
+    }
+
+    /**
+     * Prepares the ContainerBuilder before it is compiled.
+     *
+     * @param ContainerBuilder $container A ContainerBuilder instance
+     */
+    protected function prepareContainer(ContainerBuilder $container)
+    {
+        $extensions = array();
+        foreach ($this->bundles as $bundle) {
+            if ($extension = $bundle->getContainerExtension()) {
+                $container->registerExtension($extension);
+                $extensions[] = $extension->getAlias();
+            }
+
+            if ($this->debug) {
+                $container->addObjectResource($bundle);
+            }
+        }
+        foreach ($this->bundles as $bundle) {
+            $bundle->build($container);
+        }
+
+        // ensure these extensions are implicitly loaded
+        $container->getCompilerPassConfig()->setMergePass(new MergeExtensionConfigurationPass($extensions));
+    }
+
+    /**
+     * Gets a new ContainerBuilder instance used to build the service container.
+     *
+     * @return ContainerBuilder
+     */
+    protected function getContainerBuilder()
+    {
+        $container = new ContainerBuilder(new ParameterBag($this->getKernelParameters()));
+
+        if (class_exists('ProxyManager\Configuration') && class_exists('Symfony\Bridge\ProxyManager\LazyProxy\Instantiator\RuntimeInstantiator')) {
+            $container->setProxyInstantiator(new RuntimeInstantiator());
+        }
+
+        return $container;
+    }
+
+    /**
+     * Dumps the service container to PHP code in the cache.
+     *
+     * @param ConfigCache      $cache     The config cache
+     * @param ContainerBuilder $container The service container
+     * @param string           $class     The name of the class to generate
+     * @param string           $baseClass The name of the container's base class
+     */
+    protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container, $class, $baseClass)
+    {
+        // cache the container
+        $dumper = new PhpDumper($container);
+
+        if (class_exists('ProxyManager\Configuration') && class_exists('Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper\ProxyDumper')) {
+            $dumper->setProxyDumper(new ProxyDumper(md5($cache->getPath())));
+        }
+
+        $content = $dumper->dump(array('class' => $class, 'base_class' => $baseClass, 'file' => $cache->getPath(), 'debug' => $this->debug));
+
+        $cache->write($content, $container->getResources());
+    }
+
+    /**
+     * Returns a loader for the container.
+     *
+     * @param ContainerInterface $container The service container
+     *
+     * @return DelegatingLoader The loader
+     */
+    protected function getContainerLoader(ContainerInterface $container)
+    {
+        $locator = new FileLocator($this);
+        $resolver = new LoaderResolver(array(
+            new XmlFileLoader($container, $locator),
+            new YamlFileLoader($container, $locator),
+            new IniFileLoader($container, $locator),
+            new PhpFileLoader($container, $locator),
+            new DirectoryLoader($container, $locator),
+            new ClosureLoader($container),
+        ));
+
+        return new DelegatingLoader($resolver);
+    }
+
+    /**
+     * Removes comments from a PHP source string.
+     *
+     * We don't use the PHP php_strip_whitespace() function
+     * as we want the content to be readable and well-formatted.
+     *
+     * @param string $source A PHP string
+     *
+     * @return string The PHP string with the comments removed
+     */
+    public static function stripComments($source)
+    {
+        if (!function_exists('token_get_all')) {
+            return $source;
+        }
+
+        $rawChunk = '';
+        $output = '';
+        $tokens = token_get_all($source);
+        $ignoreSpace = false;
+        for ($i = 0; isset($tokens[$i]); ++$i) {
+            $token = $tokens[$i];
+            if (!isset($token[1]) || 'b"' === $token) {
+                $rawChunk .= $token;
+            } elseif (T_START_HEREDOC === $token[0]) {
+                $output .= $rawChunk.$token[1];
+                do {
+                    $token = $tokens[++$i];
+                    $output .= isset($token[1]) && 'b"' !== $token ? $token[1] : $token;
+                } while ($token[0] !== T_END_HEREDOC);
+                $rawChunk = '';
+            } elseif (T_WHITESPACE === $token[0]) {
+                if ($ignoreSpace) {
+                    $ignoreSpace = false;
+
+                    continue;
+                }
+
+                // replace multiple new lines with a single newline
+                $rawChunk .= preg_replace(array('/\n{2,}/S'), "\n", $token[1]);
+            } elseif (in_array($token[0], array(T_COMMENT, T_DOC_COMMENT))) {
+                $ignoreSpace = true;
+            } else {
+                $rawChunk .= $token[1];
+
+                // The PHP-open tag already has a new-line
+                if (T_OPEN_TAG === $token[0]) {
+                    $ignoreSpace = true;
+                }
+            }
+        }
+
+        $output .= $rawChunk;
+
+        if (PHP_VERSION_ID >= 70000) {
+            // PHP 7 memory manager will not release after token_get_all(), see https://bugs.php.net/70098
+            unset($tokens, $rawChunk);
+            gc_mem_caches();
+        }
+
+        return $output;
+    }
+
+    public function serialize()
+    {
+        return serialize(array($this->environment, $this->debug));
+    }
+
+    public function unserialize($data)
+    {
+        list($environment, $debug) = unserialize($data);
+
+        $this->__construct($environment, $debug);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/KernelEvents.php
@@ -0,0 +1,119 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel;
+
+/**
+ * Contains all events thrown in the HttpKernel component.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+final class KernelEvents
+{
+    /**
+     * The REQUEST event occurs at the very beginning of request
+     * dispatching.
+     *
+     * This event allows you to create a response for a request before any
+     * other code in the framework is executed. The event listener method
+     * receives a Symfony\Component\HttpKernel\Event\GetResponseEvent
+     * instance.
+     *
+     * @Event
+     *
+     * @var string
+     */
+    const REQUEST = 'kernel.request';
+
+    /**
+     * The EXCEPTION event occurs when an uncaught exception appears.
+     *
+     * This event allows you to create a response for a thrown exception or
+     * to modify the thrown exception. The event listener method receives
+     * a Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent
+     * instance.
+     *
+     * @Event
+     *
+     * @var string
+     */
+    const EXCEPTION = 'kernel.exception';
+
+    /**
+     * The VIEW event occurs when the return value of a controller
+     * is not a Response instance.
+     *
+     * This event allows you to create a response for the return value of the
+     * controller. The event listener method receives a
+     * Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent
+     * instance.
+     *
+     * @Event
+     *
+     * @var string
+     */
+    const VIEW = 'kernel.view';
+
+    /**
+     * The CONTROLLER event occurs once a controller was found for
+     * handling a request.
+     *
+     * This event allows you to change the controller that will handle the
+     * request. The event listener method receives a
+     * Symfony\Component\HttpKernel\Event\FilterControllerEvent instance.
+     *
+     * @Event
+     *
+     * @var string
+     */
+    const CONTROLLER = 'kernel.controller';
+
+    /**
+     * The RESPONSE event occurs once a response was created for
+     * replying to a request.
+     *
+     * This event allows you to modify or replace the response that will be
+     * replied. The event listener method receives a
+     * Symfony\Component\HttpKernel\Event\FilterResponseEvent instance.
+     *
+     * @Event
+     *
+     * @var string
+     */
+    const RESPONSE = 'kernel.response';
+
+    /**
+     * The TERMINATE event occurs once a response was sent.
+     *
+     * This event allows you to run expensive post-response jobs.
+     * The event listener method receives a
+     * Symfony\Component\HttpKernel\Event\PostResponseEvent instance.
+     *
+     * @Event
+     *
+     * @var string
+     */
+    const TERMINATE = 'kernel.terminate';
+
+    /**
+     * The FINISH_REQUEST event occurs when a response was generated for a request.
+     *
+     * This event allows you to reset the global and environmental state of
+     * the application, when it was changed during the request.
+     * The event listener method receives a
+     * Symfony\Component\HttpKernel\Event\FinishRequestEvent instance.
+     *
+     * @Event
+     *
+     * @var string
+     */
+    const FINISH_REQUEST = 'kernel.finish_request';
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/KernelInterface.php
@@ -0,0 +1,175 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpKernel\Bundle\BundleInterface;
+use Symfony\Component\Config\Loader\LoaderInterface;
+
+/**
+ * The Kernel is the heart of the Symfony system.
+ *
+ * It manages an environment made of bundles.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface KernelInterface extends HttpKernelInterface, \Serializable
+{
+    /**
+     * Returns an array of bundles to register.
+     *
+     * @return BundleInterface[] An array of bundle instances
+     */
+    public function registerBundles();
+
+    /**
+     * Loads the container configuration.
+     *
+     * @param LoaderInterface $loader A LoaderInterface instance
+     */
+    public function registerContainerConfiguration(LoaderInterface $loader);
+
+    /**
+     * Boots the current kernel.
+     */
+    public function boot();
+
+    /**
+     * Shutdowns the kernel.
+     *
+     * This method is mainly useful when doing functional testing.
+     */
+    public function shutdown();
+
+    /**
+     * Gets the registered bundle instances.
+     *
+     * @return BundleInterface[] An array of registered bundle instances
+     */
+    public function getBundles();
+
+    /**
+     * Checks if a given class name belongs to an active bundle.
+     *
+     * @param string $class A class name
+     *
+     * @return bool true if the class belongs to an active bundle, false otherwise
+     *
+     * @deprecated since version 2.6, to be removed in 3.0.
+     */
+    public function isClassInActiveBundle($class);
+
+    /**
+     * Returns a bundle and optionally its descendants by its name.
+     *
+     * @param string $name  Bundle name
+     * @param bool   $first Whether to return the first bundle only or together with its descendants
+     *
+     * @return BundleInterface|BundleInterface[] A BundleInterface instance or an array of BundleInterface instances if $first is false
+     *
+     * @throws \InvalidArgumentException when the bundle is not enabled
+     */
+    public function getBundle($name, $first = true);
+
+    /**
+     * Returns the file path for a given resource.
+     *
+     * A Resource can be a file or a directory.
+     *
+     * The resource name must follow the following pattern:
+     *
+     *     "@BundleName/path/to/a/file.something"
+     *
+     * where BundleName is the name of the bundle
+     * and the remaining part is the relative path in the bundle.
+     *
+     * If $dir is passed, and the first segment of the path is "Resources",
+     * this method will look for a file named:
+     *
+     *     $dir/<BundleName>/path/without/Resources
+     *
+     * before looking in the bundle resource folder.
+     *
+     * @param string $name  A resource name to locate
+     * @param string $dir   A directory where to look for the resource first
+     * @param bool   $first Whether to return the first path or paths for all matching bundles
+     *
+     * @return string|array The absolute path of the resource or an array if $first is false
+     *
+     * @throws \InvalidArgumentException if the file cannot be found or the name is not valid
+     * @throws \RuntimeException         if the name contains invalid/unsafe characters
+     */
+    public function locateResource($name, $dir = null, $first = true);
+
+    /**
+     * Gets the name of the kernel.
+     *
+     * @return string The kernel name
+     */
+    public function getName();
+
+    /**
+     * Gets the environment.
+     *
+     * @return string The current environment
+     */
+    public function getEnvironment();
+
+    /**
+     * Checks if debug mode is enabled.
+     *
+     * @return bool true if debug mode is enabled, false otherwise
+     */
+    public function isDebug();
+
+    /**
+     * Gets the application root dir.
+     *
+     * @return string The application root dir
+     */
+    public function getRootDir();
+
+    /**
+     * Gets the current container.
+     *
+     * @return ContainerInterface A ContainerInterface instance
+     */
+    public function getContainer();
+
+    /**
+     * Gets the request start time (not available if debug is disabled).
+     *
+     * @return int The request start timestamp
+     */
+    public function getStartTime();
+
+    /**
+     * Gets the cache directory.
+     *
+     * @return string The cache directory
+     */
+    public function getCacheDir();
+
+    /**
+     * Gets the log directory.
+     *
+     * @return string The log directory
+     */
+    public function getLogDir();
+
+    /**
+     * Gets the charset of the application.
+     *
+     * @return string The charset
+     */
+    public function getCharset();
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2016 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/symfony/http-kernel/Log/DebugLoggerInterface.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Log;
+
+/**
+ * DebugLoggerInterface.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface DebugLoggerInterface
+{
+    /**
+     * Returns an array of logs.
+     *
+     * A log is an array with the following mandatory keys:
+     * timestamp, message, priority, and priorityName.
+     * It can also have an optional context key containing an array.
+     *
+     * @return array An array of logs
+     */
+    public function getLogs();
+
+    /**
+     * Returns the number of errors.
+     *
+     * @return int The number of errors
+     */
+    public function countErrors();
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Log/LoggerInterface.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Log;
+
+use Psr\Log\LoggerInterface as PsrLogger;
+
+/**
+ * LoggerInterface.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated since version 2.2, to be removed in 3.0. Type-hint \Psr\Log\LoggerInterface instead.
+ */
+interface LoggerInterface extends PsrLogger
+{
+    /**
+     * @deprecated since version 2.2, to be removed in 3.0. Use emergency() which is PSR-3 compatible.
+     */
+    public function emerg($message, array $context = array());
+
+    /**
+     * @deprecated since version 2.2, to be removed in 3.0. Use critical() which is PSR-3 compatible.
+     */
+    public function crit($message, array $context = array());
+
+    /**
+     * @deprecated since version 2.2, to be removed in 3.0. Use error() which is PSR-3 compatible.
+     */
+    public function err($message, array $context = array());
+
+    /**
+     * @deprecated since version 2.2, to be removed in 3.0. Use warning() which is PSR-3 compatible.
+     */
+    public function warn($message, array $context = array());
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Log/NullLogger.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Log;
+
+@trigger_error('The '.__NAMESPACE__.'\NullLogger class is deprecated since version 2.2 and will be removed in 3.0. Use the Psr\Log\NullLogger class instead from the psr/log Composer package.', E_USER_DEPRECATED);
+
+use Psr\Log\NullLogger as PsrNullLogger;
+
+/**
+ * NullLogger.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class NullLogger extends PsrNullLogger implements LoggerInterface
+{
+    public function emerg($message, array $context = array())
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.2 and will be removed in 3.0. You should use the new emergency() method instead, which is PSR-3 compatible.', E_USER_DEPRECATED);
+    }
+
+    public function crit($message, array $context = array())
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.2 and will be removed in 3.0. You should use the new critical() method instead, which is PSR-3 compatible.', E_USER_DEPRECATED);
+    }
+
+    public function err($message, array $context = array())
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.2 and will be removed in 3.0. You should use the new error() method instead, which is PSR-3 compatible.', E_USER_DEPRECATED);
+    }
+
+    public function warn($message, array $context = array())
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.2 and will be removed in 3.0. You should use the new warning() method instead, which is PSR-3 compatible.', E_USER_DEPRECATED);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Profiler/BaseMemcacheProfilerStorage.php
@@ -0,0 +1,315 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Profiler;
+
+@trigger_error('The '.__NAMESPACE__.'\BaseMemcacheProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
+
+/**
+ * Base Memcache storage for profiling information in a Memcache.
+ *
+ * @author Andrej Hudec <pulzarraider@gmail.com>
+ *
+ * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
+ *             Use {@link FileProfilerStorage} instead.
+ */
+abstract class BaseMemcacheProfilerStorage implements ProfilerStorageInterface
+{
+    const TOKEN_PREFIX = 'sf_profiler_';
+
+    protected $dsn;
+    protected $lifetime;
+
+    /**
+     * Constructor.
+     *
+     * @param string $dsn      A data source name
+     * @param string $username
+     * @param string $password
+     * @param int    $lifetime The lifetime to use for the purge
+     */
+    public function __construct($dsn, $username = '', $password = '', $lifetime = 86400)
+    {
+        $this->dsn = $dsn;
+        $this->lifetime = (int) $lifetime;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function find($ip, $url, $limit, $method, $start = null, $end = null)
+    {
+        $indexName = $this->getIndexName();
+
+        $indexContent = $this->getValue($indexName);
+        if (!$indexContent) {
+            return array();
+        }
+
+        $profileList = explode("\n", $indexContent);
+        $result = array();
+
+        foreach ($profileList as $item) {
+            if ($limit === 0) {
+                break;
+            }
+
+            if ($item == '') {
+                continue;
+            }
+
+            $values = explode("\t", $item, 7);
+            list($itemToken, $itemIp, $itemMethod, $itemUrl, $itemTime, $itemParent) = $values;
+            $statusCode = isset($values[6]) ? $values[6] : null;
+
+            $itemTime = (int) $itemTime;
+
+            if ($ip && false === strpos($itemIp, $ip) || $url && false === strpos($itemUrl, $url) || $method && false === strpos($itemMethod, $method)) {
+                continue;
+            }
+
+            if (!empty($start) && $itemTime < $start) {
+                continue;
+            }
+
+            if (!empty($end) && $itemTime > $end) {
+                continue;
+            }
+
+            $result[$itemToken] = array(
+                'token' => $itemToken,
+                'ip' => $itemIp,
+                'method' => $itemMethod,
+                'url' => $itemUrl,
+                'time' => $itemTime,
+                'parent' => $itemParent,
+                'status_code' => $statusCode,
+            );
+            --$limit;
+        }
+
+        usort($result, function ($a, $b) {
+            if ($a['time'] === $b['time']) {
+                return 0;
+            }
+
+            return $a['time'] > $b['time'] ? -1 : 1;
+        });
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function purge()
+    {
+        // delete only items from index
+        $indexName = $this->getIndexName();
+
+        $indexContent = $this->getValue($indexName);
+
+        if (!$indexContent) {
+            return false;
+        }
+
+        $profileList = explode("\n", $indexContent);
+
+        foreach ($profileList as $item) {
+            if ($item == '') {
+                continue;
+            }
+
+            if (false !== $pos = strpos($item, "\t")) {
+                $this->delete($this->getItemName(substr($item, 0, $pos)));
+            }
+        }
+
+        return $this->delete($indexName);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($token)
+    {
+        if (empty($token)) {
+            return false;
+        }
+
+        $profile = $this->getValue($this->getItemName($token));
+
+        if (false !== $profile) {
+            $profile = $this->createProfileFromData($token, $profile);
+        }
+
+        return $profile;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write(Profile $profile)
+    {
+        $data = array(
+            'token' => $profile->getToken(),
+            'parent' => $profile->getParentToken(),
+            'children' => array_map(function ($p) { return $p->getToken(); }, $profile->getChildren()),
+            'data' => $profile->getCollectors(),
+            'ip' => $profile->getIp(),
+            'method' => $profile->getMethod(),
+            'url' => $profile->getUrl(),
+            'time' => $profile->getTime(),
+        );
+
+        $profileIndexed = false !== $this->getValue($this->getItemName($profile->getToken()));
+
+        if ($this->setValue($this->getItemName($profile->getToken()), $data, $this->lifetime)) {
+            if (!$profileIndexed) {
+                // Add to index
+                $indexName = $this->getIndexName();
+
+                $indexRow = implode("\t", array(
+                    $profile->getToken(),
+                    $profile->getIp(),
+                    $profile->getMethod(),
+                    $profile->getUrl(),
+                    $profile->getTime(),
+                    $profile->getParentToken(),
+                    $profile->getStatusCode(),
+                ))."\n";
+
+                return $this->appendValue($indexName, $indexRow, $this->lifetime);
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Retrieve item from the memcache server.
+     *
+     * @param string $key
+     *
+     * @return mixed
+     */
+    abstract protected function getValue($key);
+
+    /**
+     * Store an item on the memcache server under the specified key.
+     *
+     * @param string $key
+     * @param mixed  $value
+     * @param int    $expiration
+     *
+     * @return bool
+     */
+    abstract protected function setValue($key, $value, $expiration = 0);
+
+    /**
+     * Delete item from the memcache server.
+     *
+     * @param string $key
+     *
+     * @return bool
+     */
+    abstract protected function delete($key);
+
+    /**
+     * Append data to an existing item on the memcache server.
+     *
+     * @param string $key
+     * @param string $value
+     * @param int    $expiration
+     *
+     * @return bool
+     */
+    abstract protected function appendValue($key, $value, $expiration = 0);
+
+    private function createProfileFromData($token, $data, $parent = null)
+    {
+        $profile = new Profile($token);
+        $profile->setIp($data['ip']);
+        $profile->setMethod($data['method']);
+        $profile->setUrl($data['url']);
+        $profile->setTime($data['time']);
+        $profile->setCollectors($data['data']);
+
+        if (!$parent && $data['parent']) {
+            $parent = $this->read($data['parent']);
+        }
+
+        if ($parent) {
+            $profile->setParent($parent);
+        }
+
+        foreach ($data['children'] as $token) {
+            if (!$token) {
+                continue;
+            }
+
+            if (!$childProfileData = $this->getValue($this->getItemName($token))) {
+                continue;
+            }
+
+            $profile->addChild($this->createProfileFromData($token, $childProfileData, $profile));
+        }
+
+        return $profile;
+    }
+
+    /**
+     * Get item name.
+     *
+     * @param string $token
+     *
+     * @return string
+     */
+    private function getItemName($token)
+    {
+        $name = self::TOKEN_PREFIX.$token;
+
+        if ($this->isItemNameValid($name)) {
+            return $name;
+        }
+
+        return false;
+    }
+
+    /**
+     * Get name of index.
+     *
+     * @return string
+     */
+    private function getIndexName()
+    {
+        $name = self::TOKEN_PREFIX.'index';
+
+        if ($this->isItemNameValid($name)) {
+            return $name;
+        }
+
+        return false;
+    }
+
+    private function isItemNameValid($name)
+    {
+        $length = strlen($name);
+
+        if ($length > 250) {
+            throw new \RuntimeException(sprintf('The memcache item key "%s" is too long (%s bytes). Allowed maximum size is 250 bytes.', $name, $length));
+        }
+
+        return true;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php
@@ -0,0 +1,284 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Profiler;
+
+/**
+ * Storage for profiler using files.
+ *
+ * @author Alexandre Salomé <alexandre.salome@gmail.com>
+ */
+class FileProfilerStorage implements ProfilerStorageInterface
+{
+    /**
+     * Folder where profiler data are stored.
+     *
+     * @var string
+     */
+    private $folder;
+
+    /**
+     * Constructs the file storage using a "dsn-like" path.
+     *
+     * Example : "file:/path/to/the/storage/folder"
+     *
+     * @param string $dsn The DSN
+     *
+     * @throws \RuntimeException
+     */
+    public function __construct($dsn)
+    {
+        if (0 !== strpos($dsn, 'file:')) {
+            throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use FileStorage with an invalid dsn "%s". The expected format is "file:/path/to/the/storage/folder".', $dsn));
+        }
+        $this->folder = substr($dsn, 5);
+
+        if (!is_dir($this->folder) && false === @mkdir($this->folder, 0777, true) && !is_dir($this->folder)) {
+            throw new \RuntimeException(sprintf('Unable to create the storage directory (%s).', $this->folder));
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function find($ip, $url, $limit, $method, $start = null, $end = null)
+    {
+        $file = $this->getIndexFilename();
+
+        if (!file_exists($file)) {
+            return array();
+        }
+
+        $file = fopen($file, 'r');
+        fseek($file, 0, SEEK_END);
+
+        $result = array();
+        while (count($result) < $limit && $line = $this->readLineFromFile($file)) {
+            $values = str_getcsv($line);
+            list($csvToken, $csvIp, $csvMethod, $csvUrl, $csvTime, $csvParent) = $values;
+            $csvStatusCode = isset($values[6]) ? $values[6] : null;
+
+            $csvTime = (int) $csvTime;
+
+            if ($ip && false === strpos($csvIp, $ip) || $url && false === strpos($csvUrl, $url) || $method && false === strpos($csvMethod, $method)) {
+                continue;
+            }
+
+            if (!empty($start) && $csvTime < $start) {
+                continue;
+            }
+
+            if (!empty($end) && $csvTime > $end) {
+                continue;
+            }
+
+            $result[$csvToken] = array(
+                'token' => $csvToken,
+                'ip' => $csvIp,
+                'method' => $csvMethod,
+                'url' => $csvUrl,
+                'time' => $csvTime,
+                'parent' => $csvParent,
+                'status_code' => $csvStatusCode,
+            );
+        }
+
+        fclose($file);
+
+        return array_values($result);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function purge()
+    {
+        $flags = \FilesystemIterator::SKIP_DOTS;
+        $iterator = new \RecursiveDirectoryIterator($this->folder, $flags);
+        $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::CHILD_FIRST);
+
+        foreach ($iterator as $file) {
+            if (is_file($file)) {
+                unlink($file);
+            } else {
+                rmdir($file);
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($token)
+    {
+        if (!$token || !file_exists($file = $this->getFilename($token))) {
+            return;
+        }
+
+        return $this->createProfileFromData($token, unserialize(file_get_contents($file)));
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @throws \RuntimeException
+     */
+    public function write(Profile $profile)
+    {
+        $file = $this->getFilename($profile->getToken());
+
+        $profileIndexed = is_file($file);
+        if (!$profileIndexed) {
+            // Create directory
+            $dir = dirname($file);
+            if (!is_dir($dir) && false === @mkdir($dir, 0777, true) && !is_dir($dir)) {
+                throw new \RuntimeException(sprintf('Unable to create the storage directory (%s).', $dir));
+            }
+        }
+
+        // Store profile
+        $data = array(
+            'token' => $profile->getToken(),
+            'parent' => $profile->getParentToken(),
+            'children' => array_map(function ($p) { return $p->getToken(); }, $profile->getChildren()),
+            'data' => $profile->getCollectors(),
+            'ip' => $profile->getIp(),
+            'method' => $profile->getMethod(),
+            'url' => $profile->getUrl(),
+            'time' => $profile->getTime(),
+        );
+
+        if (false === file_put_contents($file, serialize($data))) {
+            return false;
+        }
+
+        if (!$profileIndexed) {
+            // Add to index
+            if (false === $file = fopen($this->getIndexFilename(), 'a')) {
+                return false;
+            }
+
+            fputcsv($file, array(
+                $profile->getToken(),
+                $profile->getIp(),
+                $profile->getMethod(),
+                $profile->getUrl(),
+                $profile->getTime(),
+                $profile->getParentToken(),
+                $profile->getStatusCode(),
+            ));
+            fclose($file);
+        }
+
+        return true;
+    }
+
+    /**
+     * Gets filename to store data, associated to the token.
+     *
+     * @param string $token
+     *
+     * @return string The profile filename
+     */
+    protected function getFilename($token)
+    {
+        // Uses 4 last characters, because first are mostly the same.
+        $folderA = substr($token, -2, 2);
+        $folderB = substr($token, -4, 2);
+
+        return $this->folder.'/'.$folderA.'/'.$folderB.'/'.$token;
+    }
+
+    /**
+     * Gets the index filename.
+     *
+     * @return string The index filename
+     */
+    protected function getIndexFilename()
+    {
+        return $this->folder.'/index.csv';
+    }
+
+    /**
+     * Reads a line in the file, backward.
+     *
+     * This function automatically skips the empty lines and do not include the line return in result value.
+     *
+     * @param resource $file The file resource, with the pointer placed at the end of the line to read
+     *
+     * @return mixed A string representing the line or null if beginning of file is reached
+     */
+    protected function readLineFromFile($file)
+    {
+        $line = '';
+        $position = ftell($file);
+
+        if (0 === $position) {
+            return;
+        }
+
+        while (true) {
+            $chunkSize = min($position, 1024);
+            $position -= $chunkSize;
+            fseek($file, $position);
+
+            if (0 === $chunkSize) {
+                // bof reached
+                break;
+            }
+
+            $buffer = fread($file, $chunkSize);
+
+            if (false === ($upTo = strrpos($buffer, "\n"))) {
+                $line = $buffer.$line;
+                continue;
+            }
+
+            $position += $upTo;
+            $line = substr($buffer, $upTo + 1).$line;
+            fseek($file, max(0, $position), SEEK_SET);
+
+            if ('' !== $line) {
+                break;
+            }
+        }
+
+        return '' === $line ? null : $line;
+    }
+
+    protected function createProfileFromData($token, $data, $parent = null)
+    {
+        $profile = new Profile($token);
+        $profile->setIp($data['ip']);
+        $profile->setMethod($data['method']);
+        $profile->setUrl($data['url']);
+        $profile->setTime($data['time']);
+        $profile->setCollectors($data['data']);
+
+        if (!$parent && $data['parent']) {
+            $parent = $this->read($data['parent']);
+        }
+
+        if ($parent) {
+            $profile->setParent($parent);
+        }
+
+        foreach ($data['children'] as $token) {
+            if (!$token || !file_exists($file = $this->getFilename($token))) {
+                continue;
+            }
+
+            $profile->addChild($this->createProfileFromData($token, unserialize(file_get_contents($file)), $profile));
+        }
+
+        return $profile;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Profiler/MemcacheProfilerStorage.php
@@ -0,0 +1,112 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Profiler;
+
+@trigger_error('The '.__NAMESPACE__.'\MemcacheProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
+
+/**
+ * Memcache Profiler Storage.
+ *
+ * @author Andrej Hudec <pulzarraider@gmail.com>
+ *
+ * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
+ *             Use {@link FileProfilerStorage} instead.
+ */
+class MemcacheProfilerStorage extends BaseMemcacheProfilerStorage
+{
+    /**
+     * @var \Memcache
+     */
+    private $memcache;
+
+    /**
+     * Internal convenience method that returns the instance of the Memcache.
+     *
+     * @return \Memcache
+     *
+     * @throws \RuntimeException
+     */
+    protected function getMemcache()
+    {
+        if (null === $this->memcache) {
+            if (!preg_match('#^memcache://(?(?=\[.*\])\[(.*)\]|(.*)):(.*)$#', $this->dsn, $matches)) {
+                throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use Memcache with an invalid dsn "%s". The expected format is "memcache://[host]:port".', $this->dsn));
+            }
+
+            $host = $matches[1] ?: $matches[2];
+            $port = $matches[3];
+
+            $memcache = new \Memcache();
+            $memcache->addserver($host, $port);
+
+            $this->memcache = $memcache;
+        }
+
+        return $this->memcache;
+    }
+
+    /**
+     * Set instance of the Memcache.
+     *
+     * @param \Memcache $memcache
+     */
+    public function setMemcache($memcache)
+    {
+        $this->memcache = $memcache;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getValue($key)
+    {
+        return $this->getMemcache()->get($key);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function setValue($key, $value, $expiration = 0)
+    {
+        return $this->getMemcache()->set($key, $value, false, time() + $expiration);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function delete($key)
+    {
+        return $this->getMemcache()->delete($key);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function appendValue($key, $value, $expiration = 0)
+    {
+        $memcache = $this->getMemcache();
+
+        if (method_exists($memcache, 'append')) {
+            // Memcache v3.0
+            if (!$result = $memcache->append($key, $value, false, $expiration)) {
+                return $memcache->set($key, $value, false, $expiration);
+            }
+
+            return $result;
+        }
+
+        // simulate append in Memcache <3.0
+        $content = $memcache->get($key);
+
+        return $memcache->set($key, $content.$value, false, $expiration);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Profiler/MemcachedProfilerStorage.php
@@ -0,0 +1,108 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Profiler;
+
+@trigger_error('The '.__NAMESPACE__.'\MemcachedProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
+
+/**
+ * Memcached Profiler Storage.
+ *
+ * @author Andrej Hudec <pulzarraider@gmail.com>
+ *
+ * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
+ *             Use {@link FileProfilerStorage} instead.
+ */
+class MemcachedProfilerStorage extends BaseMemcacheProfilerStorage
+{
+    /**
+     * @var \Memcached
+     */
+    private $memcached;
+
+    /**
+     * Internal convenience method that returns the instance of the Memcached.
+     *
+     * @return \Memcached
+     *
+     * @throws \RuntimeException
+     */
+    protected function getMemcached()
+    {
+        if (null === $this->memcached) {
+            if (!preg_match('#^memcached://(?(?=\[.*\])\[(.*)\]|(.*)):(.*)$#', $this->dsn, $matches)) {
+                throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use Memcached with an invalid dsn "%s". The expected format is "memcached://[host]:port".', $this->dsn));
+            }
+
+            $host = $matches[1] ?: $matches[2];
+            $port = $matches[3];
+
+            $memcached = new \Memcached();
+
+            // disable compression to allow appending
+            $memcached->setOption(\Memcached::OPT_COMPRESSION, false);
+
+            $memcached->addServer($host, $port);
+
+            $this->memcached = $memcached;
+        }
+
+        return $this->memcached;
+    }
+
+    /**
+     * Set instance of the Memcached.
+     *
+     * @param \Memcached $memcached
+     */
+    public function setMemcached($memcached)
+    {
+        $this->memcached = $memcached;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getValue($key)
+    {
+        return $this->getMemcached()->get($key);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function setValue($key, $value, $expiration = 0)
+    {
+        return $this->getMemcached()->set($key, $value, time() + $expiration);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function delete($key)
+    {
+        return $this->getMemcached()->delete($key);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function appendValue($key, $value, $expiration = 0)
+    {
+        $memcached = $this->getMemcached();
+
+        if (!$result = $memcached->append($key, $value)) {
+            return $memcached->set($key, $value, $expiration);
+        }
+
+        return $result;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Profiler/MongoDbProfilerStorage.php
@@ -0,0 +1,265 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Profiler;
+
+@trigger_error('The '.__NAMESPACE__.'\MongoDbProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
+
+/**
+ * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
+ *             Use {@link FileProfilerStorage} instead.
+ */
+class MongoDbProfilerStorage implements ProfilerStorageInterface
+{
+    protected $dsn;
+    protected $lifetime;
+    private $mongo;
+
+    /**
+     * Constructor.
+     *
+     * @param string $dsn      A data source name
+     * @param string $username Not used
+     * @param string $password Not used
+     * @param int    $lifetime The lifetime to use for the purge
+     */
+    public function __construct($dsn, $username = '', $password = '', $lifetime = 86400)
+    {
+        $this->dsn = $dsn;
+        $this->lifetime = (int) $lifetime;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function find($ip, $url, $limit, $method, $start = null, $end = null)
+    {
+        $cursor = $this->getMongo()->find($this->buildQuery($ip, $url, $method, $start, $end), array('_id', 'parent', 'ip', 'method', 'url', 'time', 'status_code'))->sort(array('time' => -1))->limit($limit);
+
+        $tokens = array();
+        foreach ($cursor as $profile) {
+            $tokens[] = $this->getData($profile);
+        }
+
+        return $tokens;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function purge()
+    {
+        $this->getMongo()->remove(array());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($token)
+    {
+        $profile = $this->getMongo()->findOne(array('_id' => $token, 'data' => array('$exists' => true)));
+
+        if (null !== $profile) {
+            $profile = $this->createProfileFromData($this->getData($profile));
+        }
+
+        return $profile;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write(Profile $profile)
+    {
+        $this->cleanup();
+
+        $record = array(
+            '_id' => $profile->getToken(),
+            'parent' => $profile->getParentToken(),
+            'data' => base64_encode(serialize($profile->getCollectors())),
+            'ip' => $profile->getIp(),
+            'method' => $profile->getMethod(),
+            'url' => $profile->getUrl(),
+            'time' => $profile->getTime(),
+            'status_code' => $profile->getStatusCode(),
+        );
+
+        $result = $this->getMongo()->update(array('_id' => $profile->getToken()), array_filter($record, function ($v) { return !empty($v); }), array('upsert' => true));
+
+        return (bool) (isset($result['ok']) ? $result['ok'] : $result);
+    }
+
+    /**
+     * Internal convenience method that returns the instance of the MongoDB Collection.
+     *
+     * @return \MongoCollection
+     *
+     * @throws \RuntimeException
+     */
+    protected function getMongo()
+    {
+        if (null !== $this->mongo) {
+            return $this->mongo;
+        }
+
+        if (!$parsedDsn = $this->parseDsn($this->dsn)) {
+            throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use MongoDB with an invalid dsn "%s". The expected format is "mongodb://[user:pass@]host/database/collection"', $this->dsn));
+        }
+
+        list($server, $database, $collection) = $parsedDsn;
+        $mongoClass = version_compare(phpversion('mongo'), '1.3.0', '<') ? '\Mongo' : '\MongoClient';
+        $mongo = new $mongoClass($server);
+
+        return $this->mongo = $mongo->selectCollection($database, $collection);
+    }
+
+    /**
+     * @param array $data
+     *
+     * @return Profile
+     */
+    protected function createProfileFromData(array $data)
+    {
+        $profile = $this->getProfile($data);
+
+        if ($data['parent']) {
+            $parent = $this->getMongo()->findOne(array('_id' => $data['parent'], 'data' => array('$exists' => true)));
+            if ($parent) {
+                $profile->setParent($this->getProfile($this->getData($parent)));
+            }
+        }
+
+        $profile->setChildren($this->readChildren($data['token']));
+
+        return $profile;
+    }
+
+    /**
+     * @param string $token
+     *
+     * @return Profile[] An array of Profile instances
+     */
+    protected function readChildren($token)
+    {
+        $profiles = array();
+
+        $cursor = $this->getMongo()->find(array('parent' => $token, 'data' => array('$exists' => true)));
+        foreach ($cursor as $d) {
+            $profiles[] = $this->getProfile($this->getData($d));
+        }
+
+        return $profiles;
+    }
+
+    protected function cleanup()
+    {
+        $this->getMongo()->remove(array('time' => array('$lt' => time() - $this->lifetime)));
+    }
+
+    /**
+     * @param string $ip
+     * @param string $url
+     * @param string $method
+     * @param int    $start
+     * @param int    $end
+     *
+     * @return array
+     */
+    private function buildQuery($ip, $url, $method, $start, $end)
+    {
+        $query = array();
+
+        if (!empty($ip)) {
+            $query['ip'] = $ip;
+        }
+
+        if (!empty($url)) {
+            $query['url'] = $url;
+        }
+
+        if (!empty($method)) {
+            $query['method'] = $method;
+        }
+
+        if (!empty($start) || !empty($end)) {
+            $query['time'] = array();
+        }
+
+        if (!empty($start)) {
+            $query['time']['$gte'] = $start;
+        }
+
+        if (!empty($end)) {
+            $query['time']['$lte'] = $end;
+        }
+
+        return $query;
+    }
+
+    /**
+     * @param array $data
+     *
+     * @return array
+     */
+    private function getData(array $data)
+    {
+        return array(
+            'token' => $data['_id'],
+            'parent' => isset($data['parent']) ? $data['parent'] : null,
+            'ip' => isset($data['ip']) ? $data['ip'] : null,
+            'method' => isset($data['method']) ? $data['method'] : null,
+            'url' => isset($data['url']) ? $data['url'] : null,
+            'time' => isset($data['time']) ? $data['time'] : null,
+            'data' => isset($data['data']) ? $data['data'] : null,
+            'status_code' => isset($data['status_code']) ? $data['status_code'] : null,
+        );
+    }
+
+    /**
+     * @param array $data
+     *
+     * @return Profile
+     */
+    private function getProfile(array $data)
+    {
+        $profile = new Profile($data['token']);
+        $profile->setIp($data['ip']);
+        $profile->setMethod($data['method']);
+        $profile->setUrl($data['url']);
+        $profile->setTime($data['time']);
+        $profile->setCollectors(unserialize(base64_decode($data['data'])));
+
+        return $profile;
+    }
+
+    /**
+     * @param string $dsn
+     *
+     * @return null|array Array($server, $database, $collection)
+     */
+    private function parseDsn($dsn)
+    {
+        if (!preg_match('#^(mongodb://.*)/(.*)/(.*)$#', $dsn, $matches)) {
+            return;
+        }
+
+        $server = $matches[1];
+        $database = $matches[2];
+        $collection = $matches[3];
+        preg_match('#^mongodb://(([^:]+):?(.*)(?=@))?@?([^/]*)(.*)$#', $server, $matchesServer);
+
+        if ('' == $matchesServer[5] && '' != $matches[2]) {
+            $server .= '/'.$matches[2];
+        }
+
+        return array($server, $database, $collection);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Profiler/MysqlProfilerStorage.php
@@ -0,0 +1,84 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Profiler;
+
+@trigger_error('The '.__NAMESPACE__.'\MysqlProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
+
+/**
+ * A ProfilerStorage for Mysql.
+ *
+ * @author Jan Schumann <js@schumann-it.com>
+ *
+ * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
+ *             Use {@link FileProfilerStorage} instead.
+ */
+class MysqlProfilerStorage extends PdoProfilerStorage
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function initDb()
+    {
+        if (null === $this->db) {
+            if (0 !== strpos($this->dsn, 'mysql')) {
+                throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use Mysql with an invalid dsn "%s". The expected format is "mysql:dbname=database_name;host=host_name".', $this->dsn));
+            }
+
+            if (!class_exists('PDO') || !in_array('mysql', \PDO::getAvailableDrivers(), true)) {
+                throw new \RuntimeException('You need to enable PDO_Mysql extension for the profiler to run properly.');
+            }
+
+            $db = new \PDO($this->dsn, $this->username, $this->password);
+            $db->exec('CREATE TABLE IF NOT EXISTS sf_profiler_data (token VARCHAR(255) PRIMARY KEY, data LONGTEXT, ip VARCHAR(64), method VARCHAR(6), url VARCHAR(255), time INTEGER UNSIGNED, parent VARCHAR(255), created_at INTEGER UNSIGNED, status_code SMALLINT UNSIGNED, KEY (created_at), KEY (ip), KEY (method), KEY (url), KEY (parent))');
+
+            $this->db = $db;
+        }
+
+        return $this->db;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function buildCriteria($ip, $url, $start, $end, $limit, $method)
+    {
+        $criteria = array();
+        $args = array();
+
+        if ($ip = preg_replace('/[^\d\.]/', '', $ip)) {
+            $criteria[] = 'ip LIKE :ip';
+            $args[':ip'] = '%'.$ip.'%';
+        }
+
+        if ($url) {
+            $criteria[] = 'url LIKE :url';
+            $args[':url'] = '%'.addcslashes($url, '%_\\').'%';
+        }
+
+        if ($method) {
+            $criteria[] = 'method = :method';
+            $args[':method'] = $method;
+        }
+
+        if (!empty($start)) {
+            $criteria[] = 'time >= :start';
+            $args[':start'] = $start;
+        }
+
+        if (!empty($end)) {
+            $criteria[] = 'time <= :end';
+            $args[':end'] = $end;
+        }
+
+        return array($criteria, $args);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Profiler/PdoProfilerStorage.php
@@ -0,0 +1,267 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Profiler;
+
+@trigger_error('The '.__NAMESPACE__.'\PdoProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
+
+/**
+ * Base PDO storage for profiling information in a PDO database.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jan Schumann <js@schumann-it.com>
+ *
+ * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
+ *             Use {@link FileProfilerStorage} instead.
+ */
+abstract class PdoProfilerStorage implements ProfilerStorageInterface
+{
+    protected $dsn;
+    protected $username;
+    protected $password;
+    protected $lifetime;
+    protected $db;
+
+    /**
+     * Constructor.
+     *
+     * @param string $dsn      A data source name
+     * @param string $username The username for the database
+     * @param string $password The password for the database
+     * @param int    $lifetime The lifetime to use for the purge
+     */
+    public function __construct($dsn, $username = '', $password = '', $lifetime = 86400)
+    {
+        $this->dsn = $dsn;
+        $this->username = $username;
+        $this->password = $password;
+        $this->lifetime = (int) $lifetime;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function find($ip, $url, $limit, $method, $start = null, $end = null)
+    {
+        if (null === $start) {
+            $start = 0;
+        }
+
+        if (null === $end) {
+            $end = time();
+        }
+
+        list($criteria, $args) = $this->buildCriteria($ip, $url, $start, $end, $limit, $method);
+
+        $criteria = $criteria ? 'WHERE '.implode(' AND ', $criteria) : '';
+
+        $db = $this->initDb();
+        $tokens = $this->fetch($db, 'SELECT token, ip, method, url, time, parent, status_code FROM sf_profiler_data '.$criteria.' ORDER BY time DESC LIMIT '.((int) $limit), $args);
+        $this->close($db);
+
+        return $tokens;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($token)
+    {
+        $db = $this->initDb();
+        $args = array(':token' => $token);
+        $data = $this->fetch($db, 'SELECT data, parent, ip, method, url, time FROM sf_profiler_data WHERE token = :token LIMIT 1', $args);
+        $this->close($db);
+        if (isset($data[0]['data'])) {
+            return $this->createProfileFromData($token, $data[0]);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write(Profile $profile)
+    {
+        $db = $this->initDb();
+        $args = array(
+            ':token' => $profile->getToken(),
+            ':parent' => $profile->getParentToken(),
+            ':data' => base64_encode(serialize($profile->getCollectors())),
+            ':ip' => $profile->getIp(),
+            ':method' => $profile->getMethod(),
+            ':url' => $profile->getUrl(),
+            ':time' => $profile->getTime(),
+            ':created_at' => time(),
+            ':status_code' => $profile->getStatusCode(),
+        );
+
+        try {
+            if ($this->has($profile->getToken())) {
+                $this->exec($db, 'UPDATE sf_profiler_data SET parent = :parent, data = :data, ip = :ip, method = :method, url = :url, time = :time, created_at = :created_at, status_code = :status_code WHERE token = :token', $args);
+            } else {
+                $this->exec($db, 'INSERT INTO sf_profiler_data (token, parent, data, ip, method, url, time, created_at, status_code) VALUES (:token, :parent, :data, :ip, :method, :url, :time, :created_at, :status_code)', $args);
+            }
+            $this->cleanup();
+            $status = true;
+        } catch (\Exception $e) {
+            $status = false;
+        }
+
+        $this->close($db);
+
+        return $status;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function purge()
+    {
+        $db = $this->initDb();
+        $this->exec($db, 'DELETE FROM sf_profiler_data');
+        $this->close($db);
+    }
+
+    /**
+     * Build SQL criteria to fetch records by ip and url.
+     *
+     * @param string $ip     The IP
+     * @param string $url    The URL
+     * @param string $start  The start period to search from
+     * @param string $end    The end period to search to
+     * @param string $limit  The maximum number of tokens to return
+     * @param string $method The request method
+     *
+     * @return array An array with (criteria, args)
+     */
+    abstract protected function buildCriteria($ip, $url, $start, $end, $limit, $method);
+
+    /**
+     * Initializes the database.
+     *
+     * @throws \RuntimeException When the requested database driver is not installed
+     */
+    abstract protected function initDb();
+
+    protected function cleanup()
+    {
+        $db = $this->initDb();
+        $this->exec($db, 'DELETE FROM sf_profiler_data WHERE created_at < :time', array(':time' => time() - $this->lifetime));
+        $this->close($db);
+    }
+
+    protected function exec($db, $query, array $args = array())
+    {
+        $stmt = $this->prepareStatement($db, $query);
+
+        foreach ($args as $arg => $val) {
+            $stmt->bindValue($arg, $val, is_int($val) ? \PDO::PARAM_INT : \PDO::PARAM_STR);
+        }
+        $success = $stmt->execute();
+        if (!$success) {
+            throw new \RuntimeException(sprintf('Error executing query "%s"', $query));
+        }
+    }
+
+    protected function prepareStatement($db, $query)
+    {
+        try {
+            $stmt = $db->prepare($query);
+        } catch (\Exception $e) {
+            $stmt = false;
+        }
+
+        if (false === $stmt) {
+            throw new \RuntimeException('The database cannot successfully prepare the statement');
+        }
+
+        return $stmt;
+    }
+
+    protected function fetch($db, $query, array $args = array())
+    {
+        $stmt = $this->prepareStatement($db, $query);
+
+        foreach ($args as $arg => $val) {
+            $stmt->bindValue($arg, $val, is_int($val) ? \PDO::PARAM_INT : \PDO::PARAM_STR);
+        }
+        $stmt->execute();
+
+        return $stmt->fetchAll(\PDO::FETCH_ASSOC);
+    }
+
+    protected function close($db)
+    {
+    }
+
+    protected function createProfileFromData($token, $data, $parent = null)
+    {
+        $profile = new Profile($token);
+        $profile->setIp($data['ip']);
+        $profile->setMethod($data['method']);
+        $profile->setUrl($data['url']);
+        $profile->setTime($data['time']);
+        $profile->setCollectors(unserialize(base64_decode($data['data'])));
+
+        if (!$parent && !empty($data['parent'])) {
+            $parent = $this->read($data['parent']);
+        }
+
+        if ($parent) {
+            $profile->setParent($parent);
+        }
+
+        $profile->setChildren($this->readChildren($token, $profile));
+
+        return $profile;
+    }
+
+    /**
+     * Reads the child profiles for the given token.
+     *
+     * @param string $token  The parent token
+     * @param string $parent The parent instance
+     *
+     * @return Profile[] An array of Profile instance
+     */
+    protected function readChildren($token, $parent)
+    {
+        $db = $this->initDb();
+        $data = $this->fetch($db, 'SELECT token, data, ip, method, url, time FROM sf_profiler_data WHERE parent = :token', array(':token' => $token));
+        $this->close($db);
+
+        if (!$data) {
+            return array();
+        }
+
+        $profiles = array();
+        foreach ($data as $d) {
+            $profiles[] = $this->createProfileFromData($d['token'], $d, $parent);
+        }
+
+        return $profiles;
+    }
+
+    /**
+     * Returns whether data for the given token already exists in storage.
+     *
+     * @param string $token The profile token
+     *
+     * @return string
+     */
+    protected function has($token)
+    {
+        $db = $this->initDb();
+        $tokenExists = $this->fetch($db, 'SELECT 1 FROM sf_profiler_data WHERE token = :token LIMIT 1', array(':token' => $token));
+        $this->close($db);
+
+        return !empty($tokenExists);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Profiler/Profile.php
@@ -0,0 +1,292 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Profiler;
+
+use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface;
+
+/**
+ * Profile.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Profile
+{
+    private $token;
+
+    /**
+     * @var DataCollectorInterface[]
+     */
+    private $collectors = array();
+
+    private $ip;
+    private $method;
+    private $url;
+    private $time;
+    private $statusCode;
+
+    /**
+     * @var Profile
+     */
+    private $parent;
+
+    /**
+     * @var Profile[]
+     */
+    private $children = array();
+
+    /**
+     * Constructor.
+     *
+     * @param string $token The token
+     */
+    public function __construct($token)
+    {
+        $this->token = $token;
+    }
+
+    /**
+     * Sets the token.
+     *
+     * @param string $token The token
+     */
+    public function setToken($token)
+    {
+        $this->token = $token;
+    }
+
+    /**
+     * Gets the token.
+     *
+     * @return string The token
+     */
+    public function getToken()
+    {
+        return $this->token;
+    }
+
+    /**
+     * Sets the parent token.
+     *
+     * @param Profile $parent The parent Profile
+     */
+    public function setParent(Profile $parent)
+    {
+        $this->parent = $parent;
+    }
+
+    /**
+     * Returns the parent profile.
+     *
+     * @return Profile The parent profile
+     */
+    public function getParent()
+    {
+        return $this->parent;
+    }
+
+    /**
+     * Returns the parent token.
+     *
+     * @return null|string The parent token
+     */
+    public function getParentToken()
+    {
+        return $this->parent ? $this->parent->getToken() : null;
+    }
+
+    /**
+     * Returns the IP.
+     *
+     * @return string The IP
+     */
+    public function getIp()
+    {
+        return $this->ip;
+    }
+
+    /**
+     * Sets the IP.
+     *
+     * @param string $ip
+     */
+    public function setIp($ip)
+    {
+        $this->ip = $ip;
+    }
+
+    /**
+     * Returns the request method.
+     *
+     * @return string The request method
+     */
+    public function getMethod()
+    {
+        return $this->method;
+    }
+
+    public function setMethod($method)
+    {
+        $this->method = $method;
+    }
+
+    /**
+     * Returns the URL.
+     *
+     * @return string The URL
+     */
+    public function getUrl()
+    {
+        return $this->url;
+    }
+
+    public function setUrl($url)
+    {
+        $this->url = $url;
+    }
+
+    /**
+     * Returns the time.
+     *
+     * @return string The time
+     */
+    public function getTime()
+    {
+        if (null === $this->time) {
+            return 0;
+        }
+
+        return $this->time;
+    }
+
+    public function setTime($time)
+    {
+        $this->time = $time;
+    }
+
+    /**
+     * @param int $statusCode
+     */
+    public function setStatusCode($statusCode)
+    {
+        $this->statusCode = $statusCode;
+    }
+
+    /**
+     * @return int
+     */
+    public function getStatusCode()
+    {
+        return $this->statusCode;
+    }
+
+    /**
+     * Finds children profilers.
+     *
+     * @return Profile[] An array of Profile
+     */
+    public function getChildren()
+    {
+        return $this->children;
+    }
+
+    /**
+     * Sets children profiler.
+     *
+     * @param Profile[] $children An array of Profile
+     */
+    public function setChildren(array $children)
+    {
+        $this->children = array();
+        foreach ($children as $child) {
+            $this->addChild($child);
+        }
+    }
+
+    /**
+     * Adds the child token.
+     *
+     * @param Profile $child The child Profile
+     */
+    public function addChild(Profile $child)
+    {
+        $this->children[] = $child;
+        $child->setParent($this);
+    }
+
+    /**
+     * Gets a Collector by name.
+     *
+     * @param string $name A collector name
+     *
+     * @return DataCollectorInterface A DataCollectorInterface instance
+     *
+     * @throws \InvalidArgumentException if the collector does not exist
+     */
+    public function getCollector($name)
+    {
+        if (!isset($this->collectors[$name])) {
+            throw new \InvalidArgumentException(sprintf('Collector "%s" does not exist.', $name));
+        }
+
+        return $this->collectors[$name];
+    }
+
+    /**
+     * Gets the Collectors associated with this profile.
+     *
+     * @return DataCollectorInterface[]
+     */
+    public function getCollectors()
+    {
+        return $this->collectors;
+    }
+
+    /**
+     * Sets the Collectors associated with this profile.
+     *
+     * @param DataCollectorInterface[] $collectors
+     */
+    public function setCollectors(array $collectors)
+    {
+        $this->collectors = array();
+        foreach ($collectors as $collector) {
+            $this->addCollector($collector);
+        }
+    }
+
+    /**
+     * Adds a Collector.
+     *
+     * @param DataCollectorInterface $collector A DataCollectorInterface instance
+     */
+    public function addCollector(DataCollectorInterface $collector)
+    {
+        $this->collectors[$collector->getName()] = $collector;
+    }
+
+    /**
+     * Returns true if a Collector for the given name exists.
+     *
+     * @param string $name A collector name
+     *
+     * @return bool
+     */
+    public function hasCollector($name)
+    {
+        return isset($this->collectors[$name]);
+    }
+
+    public function __sleep()
+    {
+        return array('token', 'parent', 'children', 'collectors', 'ip', 'method', 'url', 'time');
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Profiler/Profiler.php
@@ -0,0 +1,309 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Profiler;
+
+use Symfony\Component\HttpFoundation\Exception\ConflictingHeadersException;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface;
+use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
+use Psr\Log\LoggerInterface;
+
+/**
+ * Profiler.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Profiler
+{
+    /**
+     * @var ProfilerStorageInterface
+     */
+    private $storage;
+
+    /**
+     * @var DataCollectorInterface[]
+     */
+    private $collectors = array();
+
+    /**
+     * @var LoggerInterface
+     */
+    private $logger;
+
+    /**
+     * @var bool
+     */
+    private $enabled = true;
+
+    /**
+     * Constructor.
+     *
+     * @param ProfilerStorageInterface $storage A ProfilerStorageInterface instance
+     * @param LoggerInterface          $logger  A LoggerInterface instance
+     */
+    public function __construct(ProfilerStorageInterface $storage, LoggerInterface $logger = null)
+    {
+        $this->storage = $storage;
+        $this->logger = $logger;
+    }
+
+    /**
+     * Disables the profiler.
+     */
+    public function disable()
+    {
+        $this->enabled = false;
+    }
+
+    /**
+     * Enables the profiler.
+     */
+    public function enable()
+    {
+        $this->enabled = true;
+    }
+
+    /**
+     * Loads the Profile for the given Response.
+     *
+     * @param Response $response A Response instance
+     *
+     * @return Profile|false A Profile instance
+     */
+    public function loadProfileFromResponse(Response $response)
+    {
+        if (!$token = $response->headers->get('X-Debug-Token')) {
+            return false;
+        }
+
+        return $this->loadProfile($token);
+    }
+
+    /**
+     * Loads the Profile for the given token.
+     *
+     * @param string $token A token
+     *
+     * @return Profile A Profile instance
+     */
+    public function loadProfile($token)
+    {
+        return $this->storage->read($token);
+    }
+
+    /**
+     * Saves a Profile.
+     *
+     * @param Profile $profile A Profile instance
+     *
+     * @return bool
+     */
+    public function saveProfile(Profile $profile)
+    {
+        // late collect
+        foreach ($profile->getCollectors() as $collector) {
+            if ($collector instanceof LateDataCollectorInterface) {
+                $collector->lateCollect();
+            }
+        }
+
+        if (!($ret = $this->storage->write($profile)) && null !== $this->logger) {
+            $this->logger->warning('Unable to store the profiler information.', array('configured_storage' => get_class($this->storage)));
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Purges all data from the storage.
+     */
+    public function purge()
+    {
+        $this->storage->purge();
+    }
+
+    /**
+     * Exports the current profiler data.
+     *
+     * @param Profile $profile A Profile instance
+     *
+     * @return string The exported data
+     *
+     * @deprecated since Symfony 2.8, to be removed in 3.0.
+     */
+    public function export(Profile $profile)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        return base64_encode(serialize($profile));
+    }
+
+    /**
+     * Imports data into the profiler storage.
+     *
+     * @param string $data A data string as exported by the export() method
+     *
+     * @return Profile|false A Profile instance
+     *
+     * @deprecated since Symfony 2.8, to be removed in 3.0.
+     */
+    public function import($data)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        $profile = unserialize(base64_decode($data));
+
+        if ($this->storage->read($profile->getToken())) {
+            return false;
+        }
+
+        $this->saveProfile($profile);
+
+        return $profile;
+    }
+
+    /**
+     * Finds profiler tokens for the given criteria.
+     *
+     * @param string $ip     The IP
+     * @param string $url    The URL
+     * @param string $limit  The maximum number of tokens to return
+     * @param string $method The request method
+     * @param string $start  The start date to search from
+     * @param string $end    The end date to search to
+     *
+     * @return array An array of tokens
+     *
+     * @see http://php.net/manual/en/datetime.formats.php for the supported date/time formats
+     */
+    public function find($ip, $url, $limit, $method, $start, $end)
+    {
+        return $this->storage->find($ip, $url, $limit, $method, $this->getTimestamp($start), $this->getTimestamp($end));
+    }
+
+    /**
+     * Collects data for the given Response.
+     *
+     * @param Request    $request   A Request instance
+     * @param Response   $response  A Response instance
+     * @param \Exception $exception An exception instance if the request threw one
+     *
+     * @return Profile|null A Profile instance or null if the profiler is disabled
+     */
+    public function collect(Request $request, Response $response, \Exception $exception = null)
+    {
+        if (false === $this->enabled) {
+            return;
+        }
+
+        $profile = new Profile(substr(hash('sha256', uniqid(mt_rand(), true)), 0, 6));
+        $profile->setTime(time());
+        $profile->setUrl($request->getUri());
+        $profile->setMethod($request->getMethod());
+        $profile->setStatusCode($response->getStatusCode());
+        try {
+            $profile->setIp($request->getClientIp());
+        } catch (ConflictingHeadersException $e) {
+            $profile->setIp('Unknown');
+        }
+
+        $response->headers->set('X-Debug-Token', $profile->getToken());
+
+        foreach ($this->collectors as $collector) {
+            $collector->collect($request, $response, $exception);
+
+            // we need to clone for sub-requests
+            $profile->addCollector(clone $collector);
+        }
+
+        return $profile;
+    }
+
+    /**
+     * Gets the Collectors associated with this profiler.
+     *
+     * @return array An array of collectors
+     */
+    public function all()
+    {
+        return $this->collectors;
+    }
+
+    /**
+     * Sets the Collectors associated with this profiler.
+     *
+     * @param DataCollectorInterface[] $collectors An array of collectors
+     */
+    public function set(array $collectors = array())
+    {
+        $this->collectors = array();
+        foreach ($collectors as $collector) {
+            $this->add($collector);
+        }
+    }
+
+    /**
+     * Adds a Collector.
+     *
+     * @param DataCollectorInterface $collector A DataCollectorInterface instance
+     */
+    public function add(DataCollectorInterface $collector)
+    {
+        $this->collectors[$collector->getName()] = $collector;
+    }
+
+    /**
+     * Returns true if a Collector for the given name exists.
+     *
+     * @param string $name A collector name
+     *
+     * @return bool
+     */
+    public function has($name)
+    {
+        return isset($this->collectors[$name]);
+    }
+
+    /**
+     * Gets a Collector by name.
+     *
+     * @param string $name A collector name
+     *
+     * @return DataCollectorInterface A DataCollectorInterface instance
+     *
+     * @throws \InvalidArgumentException if the collector does not exist
+     */
+    public function get($name)
+    {
+        if (!isset($this->collectors[$name])) {
+            throw new \InvalidArgumentException(sprintf('Collector "%s" does not exist.', $name));
+        }
+
+        return $this->collectors[$name];
+    }
+
+    private function getTimestamp($value)
+    {
+        if (null === $value || '' == $value) {
+            return;
+        }
+
+        try {
+            $value = new \DateTime(is_numeric($value) ? '@'.$value : $value);
+        } catch (\Exception $e) {
+            return;
+        }
+
+        return $value->getTimestamp();
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Profiler/ProfilerStorageInterface.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Profiler;
+
+/**
+ * ProfilerStorageInterface.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface ProfilerStorageInterface
+{
+    /**
+     * Finds profiler tokens for the given criteria.
+     *
+     * @param string   $ip     The IP
+     * @param string   $url    The URL
+     * @param string   $limit  The maximum number of tokens to return
+     * @param string   $method The request method
+     * @param int|null $start  The start date to search from
+     * @param int|null $end    The end date to search to
+     *
+     * @return array An array of tokens
+     */
+    public function find($ip, $url, $limit, $method, $start = null, $end = null);
+
+    /**
+     * Reads data associated with the given token.
+     *
+     * The method returns false if the token does not exist in the storage.
+     *
+     * @param string $token A token
+     *
+     * @return Profile The profile associated with token
+     */
+    public function read($token);
+
+    /**
+     * Saves a Profile.
+     *
+     * @param Profile $profile A Profile instance
+     *
+     * @return bool Write operation successful
+     */
+    public function write(Profile $profile);
+
+    /**
+     * Purges all data from the database.
+     */
+    public function purge();
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Profiler/RedisProfilerStorage.php
@@ -0,0 +1,399 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Profiler;
+
+@trigger_error('The '.__NAMESPACE__.'\RedisProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
+
+/**
+ * RedisProfilerStorage stores profiling information in Redis.
+ *
+ * @author Andrej Hudec <pulzarraider@gmail.com>
+ * @author Stephane PY <py.stephane1@gmail.com>
+ *
+ * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
+ *             Use {@link FileProfilerStorage} instead.
+ */
+class RedisProfilerStorage implements ProfilerStorageInterface
+{
+    const TOKEN_PREFIX = 'sf_profiler_';
+
+    const REDIS_OPT_SERIALIZER = 1;
+    const REDIS_OPT_PREFIX = 2;
+    const REDIS_SERIALIZER_NONE = 0;
+    const REDIS_SERIALIZER_PHP = 1;
+
+    protected $dsn;
+    protected $lifetime;
+
+    /**
+     * @var \Redis
+     */
+    private $redis;
+
+    /**
+     * Constructor.
+     *
+     * @param string $dsn      A data source name
+     * @param string $username Not used
+     * @param string $password Not used
+     * @param int    $lifetime The lifetime to use for the purge
+     */
+    public function __construct($dsn, $username = '', $password = '', $lifetime = 86400)
+    {
+        $this->dsn = $dsn;
+        $this->lifetime = (int) $lifetime;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function find($ip, $url, $limit, $method, $start = null, $end = null)
+    {
+        $indexName = $this->getIndexName();
+
+        if (!$indexContent = $this->getValue($indexName, self::REDIS_SERIALIZER_NONE)) {
+            return array();
+        }
+
+        $profileList = array_reverse(explode("\n", $indexContent));
+        $result = array();
+
+        foreach ($profileList as $item) {
+            if ($limit === 0) {
+                break;
+            }
+
+            if ($item == '') {
+                continue;
+            }
+
+            $values = explode("\t", $item, 7);
+            list($itemToken, $itemIp, $itemMethod, $itemUrl, $itemTime, $itemParent) = $values;
+            $statusCode = isset($values[6]) ? $values[6] : null;
+
+            $itemTime = (int) $itemTime;
+
+            if ($ip && false === strpos($itemIp, $ip) || $url && false === strpos($itemUrl, $url) || $method && false === strpos($itemMethod, $method)) {
+                continue;
+            }
+
+            if (!empty($start) && $itemTime < $start) {
+                continue;
+            }
+
+            if (!empty($end) && $itemTime > $end) {
+                continue;
+            }
+
+            $result[] = array(
+                'token' => $itemToken,
+                'ip' => $itemIp,
+                'method' => $itemMethod,
+                'url' => $itemUrl,
+                'time' => $itemTime,
+                'parent' => $itemParent,
+                'status_code' => $statusCode,
+            );
+            --$limit;
+        }
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function purge()
+    {
+        // delete only items from index
+        $indexName = $this->getIndexName();
+
+        $indexContent = $this->getValue($indexName, self::REDIS_SERIALIZER_NONE);
+
+        if (!$indexContent) {
+            return false;
+        }
+
+        $profileList = explode("\n", $indexContent);
+
+        $result = array();
+
+        foreach ($profileList as $item) {
+            if ($item == '') {
+                continue;
+            }
+
+            if (false !== $pos = strpos($item, "\t")) {
+                $result[] = $this->getItemName(substr($item, 0, $pos));
+            }
+        }
+
+        $result[] = $indexName;
+
+        return $this->delete($result);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($token)
+    {
+        if (empty($token)) {
+            return false;
+        }
+
+        $profile = $this->getValue($this->getItemName($token), self::REDIS_SERIALIZER_PHP);
+
+        if (false !== $profile) {
+            $profile = $this->createProfileFromData($token, $profile);
+        }
+
+        return $profile;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write(Profile $profile)
+    {
+        $data = array(
+            'token' => $profile->getToken(),
+            'parent' => $profile->getParentToken(),
+            'children' => array_map(function ($p) { return $p->getToken(); }, $profile->getChildren()),
+            'data' => $profile->getCollectors(),
+            'ip' => $profile->getIp(),
+            'method' => $profile->getMethod(),
+            'url' => $profile->getUrl(),
+            'time' => $profile->getTime(),
+        );
+
+        $profileIndexed = false !== $this->getValue($this->getItemName($profile->getToken()));
+
+        if ($this->setValue($this->getItemName($profile->getToken()), $data, $this->lifetime, self::REDIS_SERIALIZER_PHP)) {
+            if (!$profileIndexed) {
+                // Add to index
+                $indexName = $this->getIndexName();
+
+                $indexRow = implode("\t", array(
+                    $profile->getToken(),
+                    $profile->getIp(),
+                    $profile->getMethod(),
+                    $profile->getUrl(),
+                    $profile->getTime(),
+                    $profile->getParentToken(),
+                    $profile->getStatusCode(),
+                ))."\n";
+
+                return $this->appendValue($indexName, $indexRow, $this->lifetime);
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Internal convenience method that returns the instance of Redis.
+     *
+     * @return \Redis
+     *
+     * @throws \RuntimeException
+     */
+    protected function getRedis()
+    {
+        if (null === $this->redis) {
+            $data = parse_url($this->dsn);
+
+            if (false === $data || !isset($data['scheme']) || $data['scheme'] !== 'redis' || !isset($data['host']) || !isset($data['port'])) {
+                throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use Redis with an invalid dsn "%s". The minimal expected format is "redis://[host]:port".', $this->dsn));
+            }
+
+            if (!extension_loaded('redis')) {
+                throw new \RuntimeException('RedisProfilerStorage requires that the redis extension is loaded.');
+            }
+
+            $redis = new \Redis();
+            $redis->connect($data['host'], $data['port']);
+
+            if (isset($data['path'])) {
+                $redis->select(substr($data['path'], 1));
+            }
+
+            if (isset($data['pass'])) {
+                $redis->auth($data['pass']);
+            }
+
+            $redis->setOption(self::REDIS_OPT_PREFIX, self::TOKEN_PREFIX);
+
+            $this->redis = $redis;
+        }
+
+        return $this->redis;
+    }
+
+    /**
+     * Set instance of the Redis.
+     *
+     * @param \Redis $redis
+     */
+    public function setRedis($redis)
+    {
+        $this->redis = $redis;
+    }
+
+    private function createProfileFromData($token, $data, $parent = null)
+    {
+        $profile = new Profile($token);
+        $profile->setIp($data['ip']);
+        $profile->setMethod($data['method']);
+        $profile->setUrl($data['url']);
+        $profile->setTime($data['time']);
+        $profile->setCollectors($data['data']);
+
+        if (!$parent && $data['parent']) {
+            $parent = $this->read($data['parent']);
+        }
+
+        if ($parent) {
+            $profile->setParent($parent);
+        }
+
+        foreach ($data['children'] as $token) {
+            if (!$token) {
+                continue;
+            }
+
+            if (!$childProfileData = $this->getValue($this->getItemName($token), self::REDIS_SERIALIZER_PHP)) {
+                continue;
+            }
+
+            $profile->addChild($this->createProfileFromData($token, $childProfileData, $profile));
+        }
+
+        return $profile;
+    }
+
+    /**
+     * Gets the item name.
+     *
+     * @param string $token
+     *
+     * @return string
+     */
+    private function getItemName($token)
+    {
+        $name = $token;
+
+        if ($this->isItemNameValid($name)) {
+            return $name;
+        }
+
+        return false;
+    }
+
+    /**
+     * Gets the name of the index.
+     *
+     * @return string
+     */
+    private function getIndexName()
+    {
+        $name = 'index';
+
+        if ($this->isItemNameValid($name)) {
+            return $name;
+        }
+
+        return false;
+    }
+
+    private function isItemNameValid($name)
+    {
+        $length = strlen($name);
+
+        if ($length > 2147483648) {
+            throw new \RuntimeException(sprintf('The Redis item key "%s" is too long (%s bytes). Allowed maximum size is 2^31 bytes.', $name, $length));
+        }
+
+        return true;
+    }
+
+    /**
+     * Retrieves an item from the Redis server.
+     *
+     * @param string $key
+     * @param int    $serializer
+     *
+     * @return mixed
+     */
+    private function getValue($key, $serializer = self::REDIS_SERIALIZER_NONE)
+    {
+        $redis = $this->getRedis();
+        $redis->setOption(self::REDIS_OPT_SERIALIZER, $serializer);
+
+        return $redis->get($key);
+    }
+
+    /**
+     * Stores an item on the Redis server under the specified key.
+     *
+     * @param string $key
+     * @param mixed  $value
+     * @param int    $expiration
+     * @param int    $serializer
+     *
+     * @return bool
+     */
+    private function setValue($key, $value, $expiration = 0, $serializer = self::REDIS_SERIALIZER_NONE)
+    {
+        $redis = $this->getRedis();
+        $redis->setOption(self::REDIS_OPT_SERIALIZER, $serializer);
+
+        return $redis->setex($key, $expiration, $value);
+    }
+
+    /**
+     * Appends data to an existing item on the Redis server.
+     *
+     * @param string $key
+     * @param string $value
+     * @param int    $expiration
+     *
+     * @return bool
+     */
+    private function appendValue($key, $value, $expiration = 0)
+    {
+        $redis = $this->getRedis();
+        $redis->setOption(self::REDIS_OPT_SERIALIZER, self::REDIS_SERIALIZER_NONE);
+
+        if ($redis->exists($key)) {
+            $redis->append($key, $value);
+
+            return $redis->setTimeout($key, $expiration);
+        }
+
+        return $redis->setex($key, $expiration, $value);
+    }
+
+    /**
+     * Removes the specified keys.
+     *
+     * @param array $keys
+     *
+     * @return bool
+     */
+    private function delete(array $keys)
+    {
+        return (bool) $this->getRedis()->delete($keys);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/Profiler/SqliteProfilerStorage.php
@@ -0,0 +1,144 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Profiler;
+
+@trigger_error('The '.__NAMESPACE__.'\SqliteProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
+
+/**
+ * SqliteProfilerStorage stores profiling information in a SQLite database.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
+ *             Use {@link FileProfilerStorage} instead.
+ */
+class SqliteProfilerStorage extends PdoProfilerStorage
+{
+    /**
+     * @throws \RuntimeException When neither of SQLite3 or PDO_SQLite extension is enabled
+     */
+    protected function initDb()
+    {
+        if (null === $this->db || $this->db instanceof \SQLite3) {
+            if (0 !== strpos($this->dsn, 'sqlite')) {
+                throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use Sqlite with an invalid dsn "%s". The expected format is "sqlite:/path/to/the/db/file".', $this->dsn));
+            }
+            if (class_exists('SQLite3')) {
+                $db = new \SQLite3(substr($this->dsn, 7, strlen($this->dsn)), \SQLITE3_OPEN_READWRITE | \SQLITE3_OPEN_CREATE);
+                if (method_exists($db, 'busyTimeout')) {
+                    // busyTimeout only exists for PHP >= 5.3.3
+                    $db->busyTimeout(1000);
+                }
+            } elseif (class_exists('PDO') && in_array('sqlite', \PDO::getAvailableDrivers(), true)) {
+                $db = new \PDO($this->dsn);
+            } else {
+                throw new \RuntimeException('You need to enable either the SQLite3 or PDO_SQLite extension for the profiler to run properly.');
+            }
+
+            $db->exec('PRAGMA temp_store=MEMORY; PRAGMA journal_mode=MEMORY;');
+            $db->exec('CREATE TABLE IF NOT EXISTS sf_profiler_data (token STRING, data STRING, ip STRING, method STRING, url STRING, time INTEGER, parent STRING, created_at INTEGER, status_code INTEGER)');
+            $db->exec('CREATE INDEX IF NOT EXISTS data_created_at ON sf_profiler_data (created_at)');
+            $db->exec('CREATE INDEX IF NOT EXISTS data_ip ON sf_profiler_data (ip)');
+            $db->exec('CREATE INDEX IF NOT EXISTS data_method ON sf_profiler_data (method)');
+            $db->exec('CREATE INDEX IF NOT EXISTS data_url ON sf_profiler_data (url)');
+            $db->exec('CREATE INDEX IF NOT EXISTS data_parent ON sf_profiler_data (parent)');
+            $db->exec('CREATE UNIQUE INDEX IF NOT EXISTS data_token ON sf_profiler_data (token)');
+
+            $this->db = $db;
+        }
+
+        return $this->db;
+    }
+
+    protected function exec($db, $query, array $args = array())
+    {
+        if ($db instanceof \SQLite3) {
+            $stmt = $this->prepareStatement($db, $query);
+            foreach ($args as $arg => $val) {
+                $stmt->bindValue($arg, $val, is_int($val) ? \SQLITE3_INTEGER : \SQLITE3_TEXT);
+            }
+
+            $res = $stmt->execute();
+            if (false === $res) {
+                throw new \RuntimeException(sprintf('Error executing SQLite query "%s"', $query));
+            }
+            $res->finalize();
+        } else {
+            parent::exec($db, $query, $args);
+        }
+    }
+
+    protected function fetch($db, $query, array $args = array())
+    {
+        $return = array();
+
+        if ($db instanceof \SQLite3) {
+            $stmt = $this->prepareStatement($db, $query);
+            foreach ($args as $arg => $val) {
+                $stmt->bindValue($arg, $val, is_int($val) ? \SQLITE3_INTEGER : \SQLITE3_TEXT);
+            }
+            $res = $stmt->execute();
+            while ($row = $res->fetchArray(\SQLITE3_ASSOC)) {
+                $return[] = $row;
+            }
+            $res->finalize();
+            $stmt->close();
+        } else {
+            $return = parent::fetch($db, $query, $args);
+        }
+
+        return $return;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function buildCriteria($ip, $url, $start, $end, $limit, $method)
+    {
+        $criteria = array();
+        $args = array();
+
+        if ($ip = preg_replace('/[^\d\.]/', '', $ip)) {
+            $criteria[] = 'ip LIKE :ip';
+            $args[':ip'] = '%'.$ip.'%';
+        }
+
+        if ($url) {
+            $criteria[] = 'url LIKE :url ESCAPE "\"';
+            $args[':url'] = '%'.addcslashes($url, '%_\\').'%';
+        }
+
+        if ($method) {
+            $criteria[] = 'method = :method';
+            $args[':method'] = $method;
+        }
+
+        if (!empty($start)) {
+            $criteria[] = 'time >= :start';
+            $args[':start'] = $start;
+        }
+
+        if (!empty($end)) {
+            $criteria[] = 'time <= :end';
+            $args[':end'] = $end;
+        }
+
+        return array($criteria, $args);
+    }
+
+    protected function close($db)
+    {
+        if ($db instanceof \SQLite3) {
+            $db->close();
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/TerminableInterface.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * Terminable extends the Kernel request/response cycle with dispatching a post
+ * response event after sending the response and before shutting down the kernel.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Pierre Minnieur <pierre.minnieur@sensiolabs.de>
+ */
+interface TerminableInterface
+{
+    /**
+     * Terminates a request/response cycle.
+     *
+     * Should be called after sending the response and before shutting down the kernel.
+     *
+     * @param Request  $request  A Request instance
+     * @param Response $response A Response instance
+     */
+    public function terminate(Request $request, Response $response);
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/UriSigner.php
@@ -0,0 +1,109 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel;
+
+/**
+ * Signs URIs.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class UriSigner
+{
+    private $secret;
+
+    /**
+     * Constructor.
+     *
+     * @param string $secret A secret
+     */
+    public function __construct($secret)
+    {
+        $this->secret = $secret;
+    }
+
+    /**
+     * Signs a URI.
+     *
+     * The given URI is signed by adding a _hash query string parameter
+     * which value depends on the URI and the secret.
+     *
+     * @param string $uri A URI to sign
+     *
+     * @return string The signed URI
+     */
+    public function sign($uri)
+    {
+        $url = parse_url($uri);
+        if (isset($url['query'])) {
+            parse_str($url['query'], $params);
+        } else {
+            $params = array();
+        }
+
+        $uri = $this->buildUrl($url, $params);
+
+        return $uri.(false === strpos($uri, '?') ? '?' : '&').'_hash='.$this->computeHash($uri);
+    }
+
+    /**
+     * Checks that a URI contains the correct hash.
+     *
+     * The _hash query string parameter must be the last one
+     * (as it is generated that way by the sign() method, it should
+     * never be a problem).
+     *
+     * @param string $uri A signed URI
+     *
+     * @return bool True if the URI is signed correctly, false otherwise
+     */
+    public function check($uri)
+    {
+        $url = parse_url($uri);
+        if (isset($url['query'])) {
+            parse_str($url['query'], $params);
+        } else {
+            $params = array();
+        }
+
+        if (empty($params['_hash'])) {
+            return false;
+        }
+
+        $hash = urlencode($params['_hash']);
+        unset($params['_hash']);
+
+        return $this->computeHash($this->buildUrl($url, $params)) === $hash;
+    }
+
+    private function computeHash($uri)
+    {
+        return urlencode(base64_encode(hash_hmac('sha256', $uri, $this->secret, true)));
+    }
+
+    private function buildUrl(array $url, array $params = array())
+    {
+        ksort($params, SORT_STRING);
+        $url['query'] = http_build_query($params, '', '&');
+
+        $scheme = isset($url['scheme']) ? $url['scheme'].'://' : '';
+        $host = isset($url['host']) ? $url['host'] : '';
+        $port = isset($url['port']) ? ':'.$url['port'] : '';
+        $user = isset($url['user']) ? $url['user'] : '';
+        $pass = isset($url['pass']) ? ':'.$url['pass'] : '';
+        $pass = ($user || $pass) ? "$pass@" : '';
+        $path = isset($url['path']) ? $url['path'] : '';
+        $query = isset($url['query']) && $url['query'] ? '?'.$url['query'] : '';
+        $fragment = isset($url['fragment']) ? '#'.$url['fragment'] : '';
+
+        return $scheme.$user.$pass.$host.$port.$path.$query.$fragment;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/http-kernel/composer.json
@@ -0,0 +1,66 @@
+{
+    "name": "symfony/http-kernel",
+    "type": "library",
+    "description": "Symfony HttpKernel Component",
+    "keywords": [],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.9",
+        "symfony/event-dispatcher": "~2.6,>=2.6.7|~3.0.0",
+        "symfony/http-foundation": "~2.7.20|~2.8.13|~3.1.6",
+        "symfony/debug": "~2.6,>=2.6.2",
+        "psr/log": "~1.0"
+    },
+    "require-dev": {
+        "symfony/browser-kit": "~2.3|~3.0.0",
+        "symfony/class-loader": "~2.1|~3.0.0",
+        "symfony/config": "~2.8",
+        "symfony/console": "~2.3|~3.0.0",
+        "symfony/css-selector": "~2.0,>=2.0.5|~3.0.0",
+        "symfony/dependency-injection": "~2.8|~3.0.0",
+        "symfony/dom-crawler": "~2.0,>=2.0.5|~3.0.0",
+        "symfony/expression-language": "~2.4|~3.0.0",
+        "symfony/finder": "~2.0,>=2.0.5|~3.0.0",
+        "symfony/process": "~2.0,>=2.0.5|~3.0.0",
+        "symfony/routing": "~2.8|~3.0.0",
+        "symfony/stopwatch": "~2.3|~3.0.0",
+        "symfony/templating": "~2.2|~3.0.0",
+        "symfony/translation": "~2.0,>=2.0.5|~3.0.0",
+        "symfony/var-dumper": "~2.6|~3.0.0"
+    },
+    "conflict": {
+        "symfony/config": "<2.7"
+    },
+    "suggest": {
+        "symfony/browser-kit": "",
+        "symfony/class-loader": "",
+        "symfony/config": "",
+        "symfony/console": "",
+        "symfony/dependency-injection": "",
+        "symfony/finder": "",
+        "symfony/var-dumper": ""
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Component\\HttpKernel\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.8-dev"
+        }
+    }
+}
--- a/vendor/symfony/polyfill-mbstring/Mbstring.php
+++ b/vendor/symfony/polyfill-mbstring/Mbstring.php
@@ -15,6 +15,7 @@ namespace Symfony\Polyfill\Mbstring;
  * Partial mbstring implementation in PHP, iconv based, UTF-8 centric.
  *
  * Implemented:
+ * - mb_chr                  - Returns a specific character from its Unicode code point
  * - mb_convert_encoding     - Convert character encoding
  * - mb_convert_variables    - Convert character code in variable(s)
  * - mb_decode_mimeheader    - Decode string in MIME header field
@@ -25,7 +26,9 @@ namespace Symfony\Polyfill\Mbstring;
  * - mb_http_output          - Set/Get HTTP output character encoding
  * - mb_internal_encoding    - Set/Get internal character encoding
  * - mb_list_encodings       - Returns an array of all supported encodings
+ * - mb_ord                  - Returns the Unicode code point of a character
  * - mb_output_handler       - Callback function converts character encoding in output buffer
+ * - mb_scrub                - Replaces ill-formed byte sequences with substitute characters
  * - mb_strlen               - Get string length
  * - mb_strpos               - Find position of first occurrence of string in a string
  * - mb_strrpos              - Find position of last occurrence of a string in a string
@@ -96,7 +99,7 @@ final class Mbstring
                 $fromEncoding = 'Windows-1252';
             }
             if ('UTF-8' !== $fromEncoding) {
-                $s = iconv($fromEncoding, 'UTF-8', $s);
+                $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s);
             }
 
             return preg_replace_callback('/[\x80-\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s);
@@ -107,7 +110,7 @@ final class Mbstring
             $fromEncoding = 'UTF-8';
         }
 
-        return iconv($fromEncoding, $toEncoding, $s);
+        return iconv($fromEncoding, $toEncoding.'//IGNORE', $s);
     }
 
     public static function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null)
@@ -145,7 +148,7 @@ final class Mbstring
         if ('UTF-8' === $encoding) {
             $encoding = null;
         } else {
-            $s = iconv($encoding, 'UTF-8', $s);
+            $s = iconv($encoding, 'UTF-8//IGNORE', $s);
         }
 
         if (MB_CASE_TITLE == $mode) {
@@ -202,7 +205,7 @@ final class Mbstring
             return $s;
         }
 
-        return iconv('UTF-8', $encoding, $s);
+        return iconv('UTF-8', $encoding.'//IGNORE', $s);
     }
 
     public static function mb_internal_encoding($encoding = null)
@@ -333,9 +336,13 @@ final class Mbstring
 
     public static function mb_strlen($s, $encoding = null)
     {
-        $encoding = self::getEncoding($encoding);
+        switch ($encoding = self::getEncoding($encoding)) {
+            case 'ASCII':
+            case 'CP850':
+                return strlen($s);
+        }
 
-        return iconv_strlen($s, $encoding);
+        return @iconv_strlen($s, $encoding);
     }
 
     public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
@@ -510,7 +517,7 @@ final class Mbstring
         $encoding = self::getEncoding($encoding);
 
         if ('UTF-8' !== $encoding) {
-            $s = iconv($encoding, 'UTF-8', $s);
+            $s = iconv($encoding, 'UTF-8//IGNORE', $s);
         }
 
         $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide);
@@ -528,6 +535,45 @@ final class Mbstring
         return $contents;
     }
 
+    public static function mb_chr($code, $encoding = null)
+    {
+        if (0x80 > $code %= 0x200000) {
+            $s = chr($code);
+        } elseif (0x800 > $code) {
+            $s = chr(0xC0 | $code >> 6).chr(0x80 | $code & 0x3F);
+        } elseif (0x10000 > $code) {
+            $s = chr(0xE0 | $code >> 12).chr(0x80 | $code >> 6 & 0x3F).chr(0x80 | $code & 0x3F);
+        } else {
+            $s = chr(0xF0 | $code >> 18).chr(0x80 | $code >> 12 & 0x3F).chr(0x80 | $code >> 6 & 0x3F).chr(0x80 | $code & 0x3F);
+        }
+
+        if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
+            $s = mb_convert_encoding($s, $encoding, 'UTF-8');
+        }
+
+        return $s;
+    }
+
+    public static function mb_ord($s, $encoding = null)
+    {
+        if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
+            $s = mb_convert_encoding($s, 'UTF-8', $encoding);
+        }
+
+        $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;
+        if (0xF0 <= $code) {
+            return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;
+        }
+        if (0xE0 <= $code) {
+            return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80;
+        }
+        if (0xC0 <= $code) {
+            return (($code - 0xC0) << 6) + $s[2] - 0x80;
+        }
+
+        return $code;
+    }
+
     private static function getSubpart($pos, $part, $haystack, $encoding)
     {
         if (false === $pos) {
--- a/vendor/symfony/polyfill-mbstring/bootstrap.php
+++ b/vendor/symfony/polyfill-mbstring/bootstrap.php
@@ -47,5 +47,10 @@ if (!function_exists('mb_strlen')) {
     function mb_substr_count($haystack, $needle, $enc = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $enc); }
     function mb_output_handler($contents, $status) { return p\Mbstring::mb_output_handler($contents, $status); }
     function mb_http_input($type = '') { return p\Mbstring::mb_http_input($type); }
-    function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) { return p\Mbstring::mb_convert_variables($toEncoding, $fromEncoding, $v0, $a, $b, $c, $d, $e, $f); }
+    function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) { return p\Mbstring::mb_convert_variables($toEncoding, $fromEncoding, $a, $b, $c, $d, $e, $f); }
+}
+if (!function_exists('mb_chr')) {
+    function mb_ord($s, $enc = null) { return p\Mbstring::mb_ord($s, $enc); }
+    function mb_chr($code, $enc = null) { return p\Mbstring::mb_chr($code, $enc); }
+    function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); }
 }
--- a/vendor/symfony/polyfill-mbstring/composer.json
+++ b/vendor/symfony/polyfill-mbstring/composer.json
@@ -28,7 +28,7 @@
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-master": "1.2-dev"
+            "dev-master": "1.3-dev"
         }
     }
 }
--- /dev/null
+++ b/vendor/symfony/polyfill-php54/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2014-2016 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/symfony/polyfill-php54/Php54.php
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Php54;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+final class Php54
+{
+    public static function hex2bin($data)
+    {
+        $len = strlen($data);
+
+        if (null === $len) {
+            return;
+        }
+        if ($len % 2) {
+            trigger_error('hex2bin(): Hexadecimal input string must have an even length', E_USER_WARNING);
+
+            return false;
+        }
+
+        return pack('H*', $data);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/polyfill-php54/README.md
@@ -0,0 +1,17 @@
+Symfony Polyfill / Php54
+========================
+
+This component provides functions unavailable in releases prior to PHP 5.4:
+
+- [`trait_exists`](http://php.net/trait_exists)
+- [`class_uses`](http://php.net/class_uses)
+- [`hex2bin`](http://php.net/hex2bin)
+- [`session_register_shutdown`](http://php.net/session_register_shutdown)
+
+More information can be found in the
+[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
+
+License
+=======
+
+This library is released under the [MIT license](LICENSE).
--- /dev/null
+++ b/vendor/symfony/polyfill-php54/Resources/stubs/CallbackFilterIterator.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+class CallbackFilterIterator extends FilterIterator
+{
+    private $iterator;
+    private $callback;
+
+    public function __construct(Iterator $iterator, $callback)
+    {
+        $this->iterator = $iterator;
+        $this->callback = $callback;
+        parent::__construct($iterator);
+    }
+
+    public function accept()
+    {
+        return call_user_func($this->callback, $this->current(), $this->key(), $this->iterator);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/polyfill-php54/Resources/stubs/RecursiveCallbackFilterIterator.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+class RecursiveCallbackFilterIterator extends CallbackFilterIterator implements RecursiveIterator
+{
+    private $iterator;
+    private $callback;
+
+    public function __construct(RecursiveIterator $iterator, $callback)
+    {
+        $this->iterator = $iterator;
+        $this->callback = $callback;
+        parent::__construct($iterator, $callback);
+    }
+
+    public function hasChildren()
+    {
+        return $this->iterator->hasChildren();
+    }
+
+    public function getChildren()
+    {
+        return new static($this->iterator->getChildren(), $this->callback);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/polyfill-php54/Resources/stubs/SessionHandlerInterface.php
@@ -0,0 +1,102 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * SessionHandlerInterface for PHP < 5.4.
+ *
+ * The order in which these methods are invoked by PHP are:
+ * 1. open [session_start]
+ * 2. read
+ * 3. gc [optional depending on probability settings: gc_probability / gc_divisor]
+ * 4. destroy [optional when session_regenerate_id(true) is used]
+ * 5. write [session_write_close] or destroy [session_destroy]
+ * 6. close
+ *
+ * Extensive documentation can be found at php.net, see links:
+ *
+ * @see http://php.net/sessionhandlerinterface
+ * @see http://php.net/session.customhandler
+ * @see http://php.net/session-set-save-handler
+ *
+ * @author Drak <drak@zikula.org>
+ * @author Tobias Schultze <http://tobion.de>
+ */
+interface SessionHandlerInterface
+{
+    /**
+     * Re-initializes existing session, or creates a new one.
+     *
+     * @see http://php.net/sessionhandlerinterface.open
+     *
+     * @param string $savePath    Save path
+     * @param string $sessionName Session name, see http://php.net/function.session-name.php
+     *
+     * @return bool true on success, false on failure
+     */
+    public function open($savePath, $sessionName);
+
+    /**
+     * Closes the current session.
+     *
+     * @see http://php.net/sessionhandlerinterface.close
+     *
+     * @return bool true on success, false on failure
+     */
+    public function close();
+
+    /**
+     * Reads the session data.
+     *
+     * @see http://php.net/sessionhandlerinterface.read
+     *
+     * @param string $sessionId Session ID, see http://php.net/function.session-id
+     *
+     * @return string Same session data as passed in write() or empty string when non-existent or on failure
+     */
+    public function read($sessionId);
+
+    /**
+     * Writes the session data to the storage.
+     *
+     * Care, the session ID passed to write() can be different from the one previously
+     * received in read() when the session ID changed due to session_regenerate_id().
+     *
+     * @see http://php.net/sessionhandlerinterface.write
+     *
+     * @param string $sessionId Session ID , see http://php.net/function.session-id
+     * @param string $data      Serialized session data to save
+     *
+     * @return bool true on success, false on failure
+     */
+    public function write($sessionId, $data);
+
+    /**
+     * Destroys a session.
+     *
+     * @see http://php.net/sessionhandlerinterface.destroy
+     *
+     * @param string $sessionId Session ID, see http://php.net/function.session-id
+     *
+     * @return bool true on success, false on failure
+     */
+    public function destroy($sessionId);
+
+    /**
+     * Cleans up expired sessions (garbage collection).
+     *
+     * @see http://php.net/sessionhandlerinterface.gc
+     *
+     * @param string|int $maxlifetime Sessions that have not updated for the last maxlifetime seconds will be removed
+     *
+     * @return bool true on success, false on failure
+     */
+    public function gc($maxlifetime);
+}
--- /dev/null
+++ b/vendor/symfony/polyfill-php54/bootstrap.php
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Symfony\Polyfill\Php54 as p;
+
+if (PHP_VERSION_ID < 50400) {
+    if (!function_exists('trait_exists')) {
+        function trait_exists($class, $autoload = true) { return $autoload && class_exists($class, $autoload) && false; }
+    }
+    if (!function_exists('class_uses')) {
+        function class_uses($class, $autoload = true)
+        {
+            if (is_object($class) || class_exists($class, $autoload) || interface_exists($class, false)) {
+                return array();
+            }
+
+            return false;
+        }
+    }
+    if (!function_exists('hex2bin')) {
+        function hex2bin($data) { return p\Php54::hex2bin($data); }
+    }
+    if (!function_exists('session_register_shutdown')) {
+        function session_register_shutdown() { register_shutdown_function('session_write_close'); }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/polyfill-php54/composer.json
@@ -0,0 +1,32 @@
+{
+    "name": "symfony/polyfill-php54",
+    "type": "library",
+    "description": "Symfony polyfill backporting some PHP 5.4+ features to lower PHP versions",
+    "keywords": ["polyfill", "shim", "compatibility", "portable"],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Nicolas Grekas",
+            "email": "p@tchwork.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.3"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Polyfill\\Php54\\": "" },
+        "files": [ "bootstrap.php" ],
+        "classmap": [ "Resources/stubs" ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.3-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/polyfill-php55/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2014-2016 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/symfony/polyfill-php55/Php55.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Php55;
+
+/**
+ * @internal
+ */
+final class Php55
+{
+    public static function boolval($val)
+    {
+        return (bool) $val;
+    }
+
+    public static function json_last_error_msg()
+    {
+        switch (json_last_error()) {
+            case JSON_ERROR_NONE: return 'No error';
+            case JSON_ERROR_DEPTH: return 'Maximum stack depth exceeded';
+            case JSON_ERROR_STATE_MISMATCH: return 'State mismatch (invalid or malformed JSON)';
+            case JSON_ERROR_CTRL_CHAR: return 'Control character error, possibly incorrectly encoded';
+            case JSON_ERROR_SYNTAX: return 'Syntax error';
+            case JSON_ERROR_UTF8: return 'Malformed UTF-8 characters, possibly incorrectly encoded';
+            default: return 'Unknown error';
+        }
+    }
+
+    /**
+     * @author Sebastiaan Stok <s.stok@rollerscapes.net>
+     */
+    public static function hash_pbkdf2($algorithm, $password, $salt, $iterations, $length = 0, $rawOutput = false)
+    {
+        // Number of blocks needed to create the derived key
+        $blocks = ceil($length / strlen(hash($algorithm, null, true)));
+        $digest = '';
+
+        for ($i = 1; $i <= $blocks; ++$i) {
+            $ib = $block = hash_hmac($algorithm, $salt.pack('N', $i), $password, true);
+
+            // Iterations
+            for ($j = 1; $j < $iterations; ++$j) {
+                $ib ^= ($block = hash_hmac($algorithm, $block, $password, true));
+            }
+
+            $digest .= $ib;
+        }
+
+        if (!$rawOutput) {
+            $digest = bin2hex($digest);
+        }
+
+        return substr($digest, 0, $length);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/polyfill-php55/Php55ArrayColumn.php
@@ -0,0 +1,64 @@
+<?php
+
+/*
+ *   Copyright (c) 2013 Ben Ramsey <http://benramsey.com>
+ *
+ *   Permission is hereby granted, free of charge, to any person obtaining a
+ *   copy of this software and associated documentation files (the "Software"),
+ *   to deal in the Software without restriction, including without limitation
+ *   the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *   and/or sell copies of the Software, and to permit persons to whom the
+ *   Software is furnished to do so, subject to the following conditions:
+ *
+ *   The above copyright notice and this permission notice shall be included in
+ *   all copies or substantial portions of the Software.
+ *
+ *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *   DEALINGS IN THE SOFTWARE.
+ */
+
+namespace Symfony\Polyfill\Php55;
+
+/**
+ * @internal
+ */
+final class Php55ArrayColumn
+{
+    public static function array_column(array $input, $columnKey, $indexKey = null)
+    {
+        $output = array();
+
+        foreach ($input as $row) {
+            $key = $value = null;
+            $keySet = $valueSet = false;
+
+            if ($indexKey !== null && array_key_exists($indexKey, $row)) {
+                $keySet = true;
+                $key = (string) $row[$indexKey];
+            }
+
+            if ($columnKey === null) {
+                $valueSet = true;
+                $value = $row;
+            } elseif (is_array($row) && array_key_exists($columnKey, $row)) {
+                $valueSet = true;
+                $value = $row[$columnKey];
+            }
+
+            if ($valueSet) {
+                if ($keySet) {
+                    $output[$key] = $value;
+                } else {
+                    $output[] = $value;
+                }
+            }
+        }
+
+        return $output;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/polyfill-php55/README.md
@@ -0,0 +1,18 @@
+Symfony Polyfill / Php55
+========================
+
+This component provides functions unavailable in releases prior to PHP 5.5:
+
+- [`boolval`](http://php.net/boolval)
+- [`json_last_error_msg`](http://php.net/json_last_error_msg)
+- [`array_column`](http://php.net/array_column)
+- [`hash_pbkdf2`](http://php.net/hash_pbkdf2)
+- `password_*` functions (from [ircmaxell/password_compat](https://github.com/ircmaxell/password_compat))
+
+More information can be found in the
+[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
+
+License
+=======
+
+This library is released under the [MIT license](LICENSE).
--- /dev/null
+++ b/vendor/symfony/polyfill-php55/bootstrap.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Symfony\Polyfill\Php55 as p;
+
+if (PHP_VERSION_ID < 50500) {
+    if (!function_exists('boolval')) {
+        function boolval($val) { return p\Php55::boolval($val); }
+    }
+    if (!function_exists('json_last_error_msg')) {
+        function json_last_error_msg() { return p\Php55::json_last_error_msg(); }
+    }
+    if (!function_exists('array_column')) {
+        function array_column($array, $columnKey, $indexKey = null) { return p\Php55ArrayColumn::array_column($array, $columnKey, $indexKey); }
+    }
+    if (!function_exists('hash_pbkdf2')) {
+        function hash_pbkdf2($algorithm, $password, $salt, $iterations, $length = 0, $rawOutput = false) { return p\Php55::hash_pbkdf2($algorithm, $password, $salt, $iterations, $length, $rawOutput); }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/polyfill-php55/composer.json
@@ -0,0 +1,32 @@
+{
+    "name": "symfony/polyfill-php55",
+    "type": "library",
+    "description": "Symfony polyfill backporting some PHP 5.5+ features to lower PHP versions",
+    "keywords": ["polyfill", "shim", "compatibility", "portable"],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Nicolas Grekas",
+            "email": "p@tchwork.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.3",
+        "ircmaxell/password-compat": "~1.0"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Polyfill\\Php55\\": "" },
+        "files": [ "bootstrap.php" ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.3-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/proxy-manager-bridge/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2016 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/symfony/proxy-manager-bridge/LazyProxy/Instantiator/RuntimeInstantiator.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\ProxyManager\LazyProxy\Instantiator;
+
+use ProxyManager\Configuration;
+use ProxyManager\Factory\LazyLoadingValueHolderFactory;
+use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
+use ProxyManager\Proxy\LazyLoadingInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\InstantiatorInterface;
+
+/**
+ * Runtime lazy loading proxy generator.
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ */
+class RuntimeInstantiator implements InstantiatorInterface
+{
+    /**
+     * @var LazyLoadingValueHolderFactory
+     */
+    private $factory;
+
+    public function __construct()
+    {
+        $config = new Configuration();
+        $config->setGeneratorStrategy(new EvaluatingGeneratorStrategy());
+
+        $this->factory = new LazyLoadingValueHolderFactory($config);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function instantiateProxy(ContainerInterface $container, Definition $definition, $id, $realInstantiator)
+    {
+        return $this->factory->createProxy(
+            $definition->getClass(),
+            function (&$wrappedInstance, LazyLoadingInterface $proxy) use ($realInstantiator) {
+                $wrappedInstance = call_user_func($realInstantiator);
+
+                $proxy->setProxyInitializer(null);
+
+                return true;
+            }
+        );
+    }
+}
--- /dev/null
+++ b/vendor/symfony/proxy-manager-bridge/LazyProxy/PhpDumper/ProxyDumper.php
@@ -0,0 +1,140 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper;
+
+use ProxyManager\Generator\ClassGenerator;
+use ProxyManager\GeneratorStrategy\BaseGeneratorStrategy;
+use ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator;
+use Symfony\Component\DependencyInjection\Container;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\DumperInterface;
+
+/**
+ * Generates dumped PHP code of proxies via reflection.
+ *
+ * @author Marco Pivetta <ocramius@gmail.com>
+ */
+class ProxyDumper implements DumperInterface
+{
+    /**
+     * @var string
+     */
+    private $salt;
+
+    /**
+     * @var LazyLoadingValueHolderGenerator
+     */
+    private $proxyGenerator;
+
+    /**
+     * @var BaseGeneratorStrategy
+     */
+    private $classGenerator;
+
+    /**
+     * Constructor.
+     *
+     * @param string $salt
+     */
+    public function __construct($salt = '')
+    {
+        $this->salt = $salt;
+        $this->proxyGenerator = new LazyLoadingValueHolderGenerator();
+        $this->classGenerator = new BaseGeneratorStrategy();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isProxyCandidate(Definition $definition)
+    {
+        return $definition->isLazy() && ($class = $definition->getClass()) && class_exists($class);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getProxyFactoryCode(Definition $definition, $id)
+    {
+        $instantiation = 'return';
+
+        if ($definition->isShared()) {
+            $instantiation .= " \$this->services['$id'] =";
+
+            if (defined('Symfony\Component\DependencyInjection\ContainerInterface::SCOPE_CONTAINER') && ContainerInterface::SCOPE_CONTAINER !== $scope = $definition->getScope(false)) {
+                $instantiation .= " \$this->scopedServices['$scope']['$id'] =";
+            }
+        }
+
+        $methodName = 'get'.Container::camelize($id).'Service';
+        $proxyClass = $this->getProxyClassName($definition);
+
+        $generatedClass = $this->generateProxyClass($definition);
+
+        $constructorCall = $generatedClass->hasMethod('staticProxyConstructor')
+            ? $proxyClass.'::staticProxyConstructor'
+            : 'new '.$proxyClass;
+
+        return <<<EOF
+        if (\$lazyLoad) {
+            \$container = \$this;
+
+            $instantiation $constructorCall(
+                function (&\$wrappedInstance, \ProxyManager\Proxy\LazyLoadingInterface \$proxy) use (\$container) {
+                    \$wrappedInstance = \$container->$methodName(false);
+
+                    \$proxy->setProxyInitializer(null);
+
+                    return true;
+                }
+            );
+        }
+
+
+EOF;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getProxyCode(Definition $definition)
+    {
+        return $this->classGenerator->generate($this->generateProxyClass($definition));
+    }
+
+    /**
+     * Produces the proxy class name for the given definition.
+     *
+     * @param Definition $definition
+     *
+     * @return string
+     */
+    private function getProxyClassName(Definition $definition)
+    {
+        return str_replace('\\', '', $definition->getClass()).'_'.spl_object_hash($definition).$this->salt;
+    }
+
+    /**
+     * @param Definition $definition
+     *
+     * @return ClassGenerator
+     */
+    private function generateProxyClass(Definition $definition)
+    {
+        $generatedClass = new ClassGenerator($this->getProxyClassName($definition));
+
+        $this->proxyGenerator->generate(new \ReflectionClass($definition->getClass()), $generatedClass);
+
+        return $generatedClass;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/proxy-manager-bridge/composer.json
@@ -0,0 +1,38 @@
+{
+    "name": "symfony/proxy-manager-bridge",
+    "type": "symfony-bridge",
+    "description": "Symfony ProxyManager Bridge",
+    "keywords": [],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.9",
+        "symfony/dependency-injection": "~2.8|~3.0.0",
+        "ocramius/proxy-manager": "~0.4|~1.0|~2.0"
+    },
+    "require-dev": {
+        "symfony/config": "~2.3|~3.0.0"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Bridge\\ProxyManager\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.8-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Annotation/Route.php
@@ -0,0 +1,182 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Annotation;
+
+/**
+ * Annotation class for @Route().
+ *
+ * @Annotation
+ * @Target({"CLASS", "METHOD"})
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Route
+{
+    private $path;
+    private $name;
+    private $requirements = array();
+    private $options = array();
+    private $defaults = array();
+    private $host;
+    private $methods = array();
+    private $schemes = array();
+    private $condition;
+
+    /**
+     * Constructor.
+     *
+     * @param array $data An array of key/value parameters
+     *
+     * @throws \BadMethodCallException
+     */
+    public function __construct(array $data)
+    {
+        if (isset($data['value'])) {
+            $data['path'] = $data['value'];
+            unset($data['value']);
+        }
+
+        foreach ($data as $key => $value) {
+            $method = 'set'.str_replace('_', '', $key);
+            if (!method_exists($this, $method)) {
+                throw new \BadMethodCallException(sprintf('Unknown property "%s" on annotation "%s".', $key, get_class($this)));
+            }
+            $this->$method($value);
+        }
+    }
+
+    /**
+     * @deprecated since version 2.2, to be removed in 3.0. Use setPath instead.
+     */
+    public function setPattern($pattern)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.2 and will be removed in 3.0. Use the setPath() method instead and use the "path" option instead of the "pattern" option in the route definition.', E_USER_DEPRECATED);
+
+        $this->path = $pattern;
+    }
+
+    /**
+     * @deprecated since version 2.2, to be removed in 3.0. Use getPath instead.
+     */
+    public function getPattern()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.2 and will be removed in 3.0. Use the getPath() method instead and use the "path" option instead of the "pattern" option in the route definition.', E_USER_DEPRECATED);
+
+        return $this->path;
+    }
+
+    public function setPath($path)
+    {
+        $this->path = $path;
+    }
+
+    public function getPath()
+    {
+        return $this->path;
+    }
+
+    public function setHost($pattern)
+    {
+        $this->host = $pattern;
+    }
+
+    public function getHost()
+    {
+        return $this->host;
+    }
+
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    public function setRequirements($requirements)
+    {
+        if (isset($requirements['_method'])) {
+            if (0 === count($this->methods)) {
+                $this->methods = explode('|', $requirements['_method']);
+            }
+
+            @trigger_error('The "_method" requirement is deprecated since version 2.2 and will be removed in 3.0. Use the "methods" option instead.', E_USER_DEPRECATED);
+        }
+
+        if (isset($requirements['_scheme'])) {
+            if (0 === count($this->schemes)) {
+                $this->schemes = explode('|', $requirements['_scheme']);
+            }
+
+            @trigger_error('The "_scheme" requirement is deprecated since version 2.2 and will be removed in 3.0. Use the "schemes" option instead.', E_USER_DEPRECATED);
+        }
+
+        $this->requirements = $requirements;
+    }
+
+    public function getRequirements()
+    {
+        return $this->requirements;
+    }
+
+    public function setOptions($options)
+    {
+        $this->options = $options;
+    }
+
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    public function setDefaults($defaults)
+    {
+        $this->defaults = $defaults;
+    }
+
+    public function getDefaults()
+    {
+        return $this->defaults;
+    }
+
+    public function setSchemes($schemes)
+    {
+        $this->schemes = is_array($schemes) ? $schemes : array($schemes);
+    }
+
+    public function getSchemes()
+    {
+        return $this->schemes;
+    }
+
+    public function setMethods($methods)
+    {
+        $this->methods = is_array($methods) ? $methods : array($methods);
+    }
+
+    public function getMethods()
+    {
+        return $this->methods;
+    }
+
+    public function setCondition($condition)
+    {
+        $this->condition = $condition;
+    }
+
+    public function getCondition()
+    {
+        return $this->condition;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/CompiledRoute.php
@@ -0,0 +1,166 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing;
+
+/**
+ * CompiledRoutes are returned by the RouteCompiler class.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class CompiledRoute implements \Serializable
+{
+    private $variables;
+    private $tokens;
+    private $staticPrefix;
+    private $regex;
+    private $pathVariables;
+    private $hostVariables;
+    private $hostRegex;
+    private $hostTokens;
+
+    /**
+     * Constructor.
+     *
+     * @param string      $staticPrefix  The static prefix of the compiled route
+     * @param string      $regex         The regular expression to use to match this route
+     * @param array       $tokens        An array of tokens to use to generate URL for this route
+     * @param array       $pathVariables An array of path variables
+     * @param string|null $hostRegex     Host regex
+     * @param array       $hostTokens    Host tokens
+     * @param array       $hostVariables An array of host variables
+     * @param array       $variables     An array of variables (variables defined in the path and in the host patterns)
+     */
+    public function __construct($staticPrefix, $regex, array $tokens, array $pathVariables, $hostRegex = null, array $hostTokens = array(), array $hostVariables = array(), array $variables = array())
+    {
+        $this->staticPrefix = (string) $staticPrefix;
+        $this->regex = $regex;
+        $this->tokens = $tokens;
+        $this->pathVariables = $pathVariables;
+        $this->hostRegex = $hostRegex;
+        $this->hostTokens = $hostTokens;
+        $this->hostVariables = $hostVariables;
+        $this->variables = $variables;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function serialize()
+    {
+        return serialize(array(
+            'vars' => $this->variables,
+            'path_prefix' => $this->staticPrefix,
+            'path_regex' => $this->regex,
+            'path_tokens' => $this->tokens,
+            'path_vars' => $this->pathVariables,
+            'host_regex' => $this->hostRegex,
+            'host_tokens' => $this->hostTokens,
+            'host_vars' => $this->hostVariables,
+        ));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function unserialize($serialized)
+    {
+        $data = unserialize($serialized);
+        $this->variables = $data['vars'];
+        $this->staticPrefix = $data['path_prefix'];
+        $this->regex = $data['path_regex'];
+        $this->tokens = $data['path_tokens'];
+        $this->pathVariables = $data['path_vars'];
+        $this->hostRegex = $data['host_regex'];
+        $this->hostTokens = $data['host_tokens'];
+        $this->hostVariables = $data['host_vars'];
+    }
+
+    /**
+     * Returns the static prefix.
+     *
+     * @return string The static prefix
+     */
+    public function getStaticPrefix()
+    {
+        return $this->staticPrefix;
+    }
+
+    /**
+     * Returns the regex.
+     *
+     * @return string The regex
+     */
+    public function getRegex()
+    {
+        return $this->regex;
+    }
+
+    /**
+     * Returns the host regex.
+     *
+     * @return string|null The host regex or null
+     */
+    public function getHostRegex()
+    {
+        return $this->hostRegex;
+    }
+
+    /**
+     * Returns the tokens.
+     *
+     * @return array The tokens
+     */
+    public function getTokens()
+    {
+        return $this->tokens;
+    }
+
+    /**
+     * Returns the host tokens.
+     *
+     * @return array The tokens
+     */
+    public function getHostTokens()
+    {
+        return $this->hostTokens;
+    }
+
+    /**
+     * Returns the variables.
+     *
+     * @return array The variables
+     */
+    public function getVariables()
+    {
+        return $this->variables;
+    }
+
+    /**
+     * Returns the path variables.
+     *
+     * @return array The variables
+     */
+    public function getPathVariables()
+    {
+        return $this->pathVariables;
+    }
+
+    /**
+     * Returns the host variables.
+     *
+     * @return array The variables
+     */
+    public function getHostVariables()
+    {
+        return $this->hostVariables;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Exception/ExceptionInterface.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Exception;
+
+/**
+ * ExceptionInterface.
+ *
+ * @author Alexandre Salomé <alexandre.salome@gmail.com>
+ */
+interface ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/routing/Exception/InvalidParameterException.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Exception;
+
+/**
+ * Exception thrown when a parameter is not valid.
+ *
+ * @author Alexandre Salomé <alexandre.salome@gmail.com>
+ */
+class InvalidParameterException extends \InvalidArgumentException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/routing/Exception/MethodNotAllowedException.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Exception;
+
+/**
+ * The resource was found but the request method is not allowed.
+ *
+ * This exception should trigger an HTTP 405 response in your application code.
+ *
+ * @author Kris Wallsmith <kris@symfony.com>
+ */
+class MethodNotAllowedException extends \RuntimeException implements ExceptionInterface
+{
+    /**
+     * @var array
+     */
+    protected $allowedMethods = array();
+
+    public function __construct(array $allowedMethods, $message = null, $code = 0, \Exception $previous = null)
+    {
+        $this->allowedMethods = array_map('strtoupper', $allowedMethods);
+
+        parent::__construct($message, $code, $previous);
+    }
+
+    /**
+     * Gets the allowed HTTP methods.
+     *
+     * @return array
+     */
+    public function getAllowedMethods()
+    {
+        return $this->allowedMethods;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Exception/MissingMandatoryParametersException.php
@@ -0,0 +1,22 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Exception;
+
+/**
+ * Exception thrown when a route cannot be generated because of missing
+ * mandatory parameters.
+ *
+ * @author Alexandre Salomé <alexandre.salome@gmail.com>
+ */
+class MissingMandatoryParametersException extends \InvalidArgumentException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/routing/Exception/ResourceNotFoundException.php
@@ -0,0 +1,23 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Exception;
+
+/**
+ * The resource was not found.
+ *
+ * This exception should trigger an HTTP 404 response in your application code.
+ *
+ * @author Kris Wallsmith <kris@symfony.com>
+ */
+class ResourceNotFoundException extends \RuntimeException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/routing/Exception/RouteNotFoundException.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Exception;
+
+/**
+ * Exception thrown when a route does not exist.
+ *
+ * @author Alexandre Salomé <alexandre.salome@gmail.com>
+ */
+class RouteNotFoundException extends \InvalidArgumentException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/routing/Generator/ConfigurableRequirementsInterface.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Generator;
+
+/**
+ * ConfigurableRequirementsInterface must be implemented by URL generators that
+ * can be configured whether an exception should be generated when the parameters
+ * do not match the requirements. It is also possible to disable the requirements
+ * check for URL generation completely.
+ *
+ * The possible configurations and use-cases:
+ * - setStrictRequirements(true): Throw an exception for mismatching requirements. This
+ *   is mostly useful in development environment.
+ * - setStrictRequirements(false): Don't throw an exception but return null as URL for
+ *   mismatching requirements and log the problem. Useful when you cannot control all
+ *   params because they come from third party libs but don't want to have a 404 in
+ *   production environment. It should log the mismatch so one can review it.
+ * - setStrictRequirements(null): Return the URL with the given parameters without
+ *   checking the requirements at all. When generating a URL you should either trust
+ *   your params or you validated them beforehand because otherwise it would break your
+ *   link anyway. So in production environment you should know that params always pass
+ *   the requirements. Thus this option allows to disable the check on URL generation for
+ *   performance reasons (saving a preg_match for each requirement every time a URL is
+ *   generated).
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Tobias Schultze <http://tobion.de>
+ */
+interface ConfigurableRequirementsInterface
+{
+    /**
+     * Enables or disables the exception on incorrect parameters.
+     * Passing null will deactivate the requirements check completely.
+     *
+     * @param bool|null $enabled
+     */
+    public function setStrictRequirements($enabled);
+
+    /**
+     * Returns whether to throw an exception on incorrect parameters.
+     * Null means the requirements check is deactivated completely.
+     *
+     * @return bool|null
+     */
+    public function isStrictRequirements();
+}
--- /dev/null
+++ b/vendor/symfony/routing/Generator/Dumper/GeneratorDumper.php
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Generator\Dumper;
+
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * GeneratorDumper is the base class for all built-in generator dumpers.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class GeneratorDumper implements GeneratorDumperInterface
+{
+    /**
+     * @var RouteCollection
+     */
+    private $routes;
+
+    /**
+     * Constructor.
+     *
+     * @param RouteCollection $routes The RouteCollection to dump
+     */
+    public function __construct(RouteCollection $routes)
+    {
+        $this->routes = $routes;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getRoutes()
+    {
+        return $this->routes;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Generator/Dumper/GeneratorDumperInterface.php
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Generator\Dumper;
+
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * GeneratorDumperInterface is the interface that all generator dumper classes must implement.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface GeneratorDumperInterface
+{
+    /**
+     * Dumps a set of routes to a string representation of executable code
+     * that can then be used to generate a URL of such a route.
+     *
+     * @param array $options An array of options
+     *
+     * @return string Executable code
+     */
+    public function dump(array $options = array());
+
+    /**
+     * Gets the routes to dump.
+     *
+     * @return RouteCollection A RouteCollection instance
+     */
+    public function getRoutes();
+}
--- /dev/null
+++ b/vendor/symfony/routing/Generator/Dumper/PhpGeneratorDumper.php
@@ -0,0 +1,123 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Generator\Dumper;
+
+/**
+ * PhpGeneratorDumper creates a PHP class able to generate URLs for a given set of routes.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Tobias Schultze <http://tobion.de>
+ */
+class PhpGeneratorDumper extends GeneratorDumper
+{
+    /**
+     * Dumps a set of routes to a PHP class.
+     *
+     * Available options:
+     *
+     *  * class:      The class name
+     *  * base_class: The base class name
+     *
+     * @param array $options An array of options
+     *
+     * @return string A PHP class representing the generator class
+     */
+    public function dump(array $options = array())
+    {
+        $options = array_merge(array(
+            'class' => 'ProjectUrlGenerator',
+            'base_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
+        ), $options);
+
+        return <<<EOF
+<?php
+
+use Symfony\Component\Routing\RequestContext;
+use Symfony\Component\Routing\Exception\RouteNotFoundException;
+use Psr\Log\LoggerInterface;
+
+/**
+ * {$options['class']}
+ *
+ * This class has been auto-generated
+ * by the Symfony Routing Component.
+ */
+class {$options['class']} extends {$options['base_class']}
+{
+    private static \$declaredRoutes;
+
+    /**
+     * Constructor.
+     */
+    public function __construct(RequestContext \$context, LoggerInterface \$logger = null)
+    {
+        \$this->context = \$context;
+        \$this->logger = \$logger;
+        if (null === self::\$declaredRoutes) {
+            self::\$declaredRoutes = {$this->generateDeclaredRoutes()};
+        }
+    }
+
+{$this->generateGenerateMethod()}
+}
+
+EOF;
+    }
+
+    /**
+     * Generates PHP code representing an array of defined routes
+     * together with the routes properties (e.g. requirements).
+     *
+     * @return string PHP code
+     */
+    private function generateDeclaredRoutes()
+    {
+        $routes = "array(\n";
+        foreach ($this->getRoutes()->all() as $name => $route) {
+            $compiledRoute = $route->compile();
+
+            $properties = array();
+            $properties[] = $compiledRoute->getVariables();
+            $properties[] = $route->getDefaults();
+            $properties[] = $route->getRequirements();
+            $properties[] = $compiledRoute->getTokens();
+            $properties[] = $compiledRoute->getHostTokens();
+            $properties[] = $route->getSchemes();
+
+            $routes .= sprintf("        '%s' => %s,\n", $name, str_replace("\n", '', var_export($properties, true)));
+        }
+        $routes .= '    )';
+
+        return $routes;
+    }
+
+    /**
+     * Generates PHP code representing the `generate` method that implements the UrlGeneratorInterface.
+     *
+     * @return string PHP code
+     */
+    private function generateGenerateMethod()
+    {
+        return <<<'EOF'
+    public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH)
+    {
+        if (!isset(self::$declaredRoutes[$name])) {
+            throw new RouteNotFoundException(sprintf('Unable to generate a URL for the named route "%s" as such route does not exist.', $name));
+        }
+
+        list($variables, $defaults, $requirements, $tokens, $hostTokens, $requiredSchemes) = self::$declaredRoutes[$name];
+
+        return $this->doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, $requiredSchemes);
+    }
+EOF;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Generator/UrlGenerator.php
@@ -0,0 +1,344 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Generator;
+
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\RequestContext;
+use Symfony\Component\Routing\Exception\InvalidParameterException;
+use Symfony\Component\Routing\Exception\RouteNotFoundException;
+use Symfony\Component\Routing\Exception\MissingMandatoryParametersException;
+use Psr\Log\LoggerInterface;
+
+/**
+ * UrlGenerator can generate a URL or a path for any route in the RouteCollection
+ * based on the passed parameters.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Tobias Schultze <http://tobion.de>
+ */
+class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInterface
+{
+    /**
+     * @var RouteCollection
+     */
+    protected $routes;
+
+    /**
+     * @var RequestContext
+     */
+    protected $context;
+
+    /**
+     * @var bool|null
+     */
+    protected $strictRequirements = true;
+
+    /**
+     * @var LoggerInterface|null
+     */
+    protected $logger;
+
+    /**
+     * This array defines the characters (besides alphanumeric ones) that will not be percent-encoded in the path segment of the generated URL.
+     *
+     * PHP's rawurlencode() encodes all chars except "a-zA-Z0-9-._~" according to RFC 3986. But we want to allow some chars
+     * to be used in their literal form (reasons below). Other chars inside the path must of course be encoded, e.g.
+     * "?" and "#" (would be interpreted wrongly as query and fragment identifier),
+     * "'" and """ (are used as delimiters in HTML).
+     */
+    protected $decodedChars = array(
+        // the slash can be used to designate a hierarchical structure and we want allow using it with this meaning
+        // some webservers don't allow the slash in encoded form in the path for security reasons anyway
+        // see http://stackoverflow.com/questions/4069002/http-400-if-2f-part-of-get-url-in-jboss
+        '%2F' => '/',
+        // the following chars are general delimiters in the URI specification but have only special meaning in the authority component
+        // so they can safely be used in the path in unencoded form
+        '%40' => '@',
+        '%3A' => ':',
+        // these chars are only sub-delimiters that have no predefined meaning and can therefore be used literally
+        // so URI producing applications can use these chars to delimit subcomponents in a path segment without being encoded for better readability
+        '%3B' => ';',
+        '%2C' => ',',
+        '%3D' => '=',
+        '%2B' => '+',
+        '%21' => '!',
+        '%2A' => '*',
+        '%7C' => '|',
+    );
+
+    /**
+     * Constructor.
+     *
+     * @param RouteCollection      $routes  A RouteCollection instance
+     * @param RequestContext       $context The context
+     * @param LoggerInterface|null $logger  A logger instance
+     */
+    public function __construct(RouteCollection $routes, RequestContext $context, LoggerInterface $logger = null)
+    {
+        $this->routes = $routes;
+        $this->context = $context;
+        $this->logger = $logger;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setContext(RequestContext $context)
+    {
+        $this->context = $context;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getContext()
+    {
+        return $this->context;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setStrictRequirements($enabled)
+    {
+        $this->strictRequirements = null === $enabled ? null : (bool) $enabled;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isStrictRequirements()
+    {
+        return $this->strictRequirements;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH)
+    {
+        if (null === $route = $this->routes->get($name)) {
+            throw new RouteNotFoundException(sprintf('Unable to generate a URL for the named route "%s" as such route does not exist.', $name));
+        }
+
+        // the Route has a cache of its own and is not recompiled as long as it does not get modified
+        $compiledRoute = $route->compile();
+
+        return $this->doGenerate($compiledRoute->getVariables(), $route->getDefaults(), $route->getRequirements(), $compiledRoute->getTokens(), $parameters, $name, $referenceType, $compiledRoute->getHostTokens(), $route->getSchemes());
+    }
+
+    /**
+     * @throws MissingMandatoryParametersException When some parameters are missing that are mandatory for the route
+     * @throws InvalidParameterException           When a parameter value for a placeholder is not correct because
+     *                                             it does not match the requirement
+     */
+    protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, array $requiredSchemes = array())
+    {
+        if (is_bool($referenceType) || is_string($referenceType)) {
+            @trigger_error('The hardcoded value you are using for the $referenceType argument of the '.__CLASS__.'::generate method is deprecated since version 2.8 and will not be supported anymore in 3.0. Use the constants defined in the UrlGeneratorInterface instead.', E_USER_DEPRECATED);
+
+            if (true === $referenceType) {
+                $referenceType = self::ABSOLUTE_URL;
+            } elseif (false === $referenceType) {
+                $referenceType = self::ABSOLUTE_PATH;
+            } elseif ('relative' === $referenceType) {
+                $referenceType = self::RELATIVE_PATH;
+            } elseif ('network' === $referenceType) {
+                $referenceType = self::NETWORK_PATH;
+            }
+        }
+
+        $variables = array_flip($variables);
+        $mergedParams = array_replace($defaults, $this->context->getParameters(), $parameters);
+
+        // all params must be given
+        if ($diff = array_diff_key($variables, $mergedParams)) {
+            throw new MissingMandatoryParametersException(sprintf('Some mandatory parameters are missing ("%s") to generate a URL for route "%s".', implode('", "', array_keys($diff)), $name));
+        }
+
+        $url = '';
+        $optional = true;
+        foreach ($tokens as $token) {
+            if ('variable' === $token[0]) {
+                if (!$optional || !array_key_exists($token[3], $defaults) || null !== $mergedParams[$token[3]] && (string) $mergedParams[$token[3]] !== (string) $defaults[$token[3]]) {
+                    // check requirement
+                    if (null !== $this->strictRequirements && !preg_match('#^'.$token[2].'$#', $mergedParams[$token[3]])) {
+                        $message = sprintf('Parameter "%s" for route "%s" must match "%s" ("%s" given) to generate a corresponding URL.', $token[3], $name, $token[2], $mergedParams[$token[3]]);
+                        if ($this->strictRequirements) {
+                            throw new InvalidParameterException($message);
+                        }
+
+                        if ($this->logger) {
+                            $this->logger->error($message);
+                        }
+
+                        return;
+                    }
+
+                    $url = $token[1].$mergedParams[$token[3]].$url;
+                    $optional = false;
+                }
+            } else {
+                // static text
+                $url = $token[1].$url;
+                $optional = false;
+            }
+        }
+
+        if ('' === $url) {
+            $url = '/';
+        }
+
+        // the contexts base URL is already encoded (see Symfony\Component\HttpFoundation\Request)
+        $url = strtr(rawurlencode($url), $this->decodedChars);
+
+        // the path segments "." and ".." are interpreted as relative reference when resolving a URI; see http://tools.ietf.org/html/rfc3986#section-3.3
+        // so we need to encode them as they are not used for this purpose here
+        // otherwise we would generate a URI that, when followed by a user agent (e.g. browser), does not match this route
+        $url = strtr($url, array('/../' => '/%2E%2E/', '/./' => '/%2E/'));
+        if ('/..' === substr($url, -3)) {
+            $url = substr($url, 0, -2).'%2E%2E';
+        } elseif ('/.' === substr($url, -2)) {
+            $url = substr($url, 0, -1).'%2E';
+        }
+
+        $schemeAuthority = '';
+        if ($host = $this->context->getHost()) {
+            $scheme = $this->context->getScheme();
+
+            if ($requiredSchemes) {
+                if (!in_array($scheme, $requiredSchemes, true)) {
+                    $referenceType = self::ABSOLUTE_URL;
+                    $scheme = current($requiredSchemes);
+                }
+            } elseif (isset($requirements['_scheme']) && ($req = strtolower($requirements['_scheme'])) && $scheme !== $req) {
+                // We do this for BC; to be removed if _scheme is not supported anymore
+                $referenceType = self::ABSOLUTE_URL;
+                $scheme = $req;
+            }
+
+            if ($hostTokens) {
+                $routeHost = '';
+                foreach ($hostTokens as $token) {
+                    if ('variable' === $token[0]) {
+                        if (null !== $this->strictRequirements && !preg_match('#^'.$token[2].'$#i', $mergedParams[$token[3]])) {
+                            $message = sprintf('Parameter "%s" for route "%s" must match "%s" ("%s" given) to generate a corresponding URL.', $token[3], $name, $token[2], $mergedParams[$token[3]]);
+
+                            if ($this->strictRequirements) {
+                                throw new InvalidParameterException($message);
+                            }
+
+                            if ($this->logger) {
+                                $this->logger->error($message);
+                            }
+
+                            return;
+                        }
+
+                        $routeHost = $token[1].$mergedParams[$token[3]].$routeHost;
+                    } else {
+                        $routeHost = $token[1].$routeHost;
+                    }
+                }
+
+                if ($routeHost !== $host) {
+                    $host = $routeHost;
+                    if (self::ABSOLUTE_URL !== $referenceType) {
+                        $referenceType = self::NETWORK_PATH;
+                    }
+                }
+            }
+
+            if (self::ABSOLUTE_URL === $referenceType || self::NETWORK_PATH === $referenceType) {
+                $port = '';
+                if ('http' === $scheme && 80 != $this->context->getHttpPort()) {
+                    $port = ':'.$this->context->getHttpPort();
+                } elseif ('https' === $scheme && 443 != $this->context->getHttpsPort()) {
+                    $port = ':'.$this->context->getHttpsPort();
+                }
+
+                $schemeAuthority = self::NETWORK_PATH === $referenceType ? '//' : "$scheme://";
+                $schemeAuthority .= $host.$port;
+            }
+        }
+
+        if (self::RELATIVE_PATH === $referenceType) {
+            $url = self::getRelativePath($this->context->getPathInfo(), $url);
+        } else {
+            $url = $schemeAuthority.$this->context->getBaseUrl().$url;
+        }
+
+        // add a query string if needed
+        $extra = array_udiff_assoc(array_diff_key($parameters, $variables), $defaults, function ($a, $b) {
+            return $a == $b ? 0 : 1;
+        });
+
+        if ($extra && $query = http_build_query($extra, '', '&')) {
+            // "/" and "?" can be left decoded for better user experience, see
+            // http://tools.ietf.org/html/rfc3986#section-3.4
+            $url .= '?'.strtr($query, array('%2F' => '/'));
+        }
+
+        return $url;
+    }
+
+    /**
+     * Returns the target path as relative reference from the base path.
+     *
+     * Only the URIs path component (no schema, host etc.) is relevant and must be given, starting with a slash.
+     * Both paths must be absolute and not contain relative parts.
+     * Relative URLs from one resource to another are useful when generating self-contained downloadable document archives.
+     * Furthermore, they can be used to reduce the link size in documents.
+     *
+     * Example target paths, given a base path of "/a/b/c/d":
+     * - "/a/b/c/d"     -> ""
+     * - "/a/b/c/"      -> "./"
+     * - "/a/b/"        -> "../"
+     * - "/a/b/c/other" -> "other"
+     * - "/a/x/y"       -> "../../x/y"
+     *
+     * @param string $basePath   The base path
+     * @param string $targetPath The target path
+     *
+     * @return string The relative target path
+     */
+    public static function getRelativePath($basePath, $targetPath)
+    {
+        if ($basePath === $targetPath) {
+            return '';
+        }
+
+        $sourceDirs = explode('/', isset($basePath[0]) && '/' === $basePath[0] ? substr($basePath, 1) : $basePath);
+        $targetDirs = explode('/', isset($targetPath[0]) && '/' === $targetPath[0] ? substr($targetPath, 1) : $targetPath);
+        array_pop($sourceDirs);
+        $targetFile = array_pop($targetDirs);
+
+        foreach ($sourceDirs as $i => $dir) {
+            if (isset($targetDirs[$i]) && $dir === $targetDirs[$i]) {
+                unset($sourceDirs[$i], $targetDirs[$i]);
+            } else {
+                break;
+            }
+        }
+
+        $targetDirs[] = $targetFile;
+        $path = str_repeat('../', count($sourceDirs)).implode('/', $targetDirs);
+
+        // A reference to the same base directory or an empty subdirectory must be prefixed with "./".
+        // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used
+        // as the first segment of a relative-path reference, as it would be mistaken for a scheme name
+        // (see http://tools.ietf.org/html/rfc3986#section-4.2).
+        return '' === $path || '/' === $path[0]
+            || false !== ($colonPos = strpos($path, ':')) && ($colonPos < ($slashPos = strpos($path, '/')) || false === $slashPos)
+            ? "./$path" : $path;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Generator/UrlGeneratorInterface.php
@@ -0,0 +1,84 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Generator;
+
+use Symfony\Component\Routing\Exception\InvalidParameterException;
+use Symfony\Component\Routing\Exception\MissingMandatoryParametersException;
+use Symfony\Component\Routing\Exception\RouteNotFoundException;
+use Symfony\Component\Routing\RequestContextAwareInterface;
+
+/**
+ * UrlGeneratorInterface is the interface that all URL generator classes must implement.
+ *
+ * The constants in this interface define the different types of resource references that
+ * are declared in RFC 3986: http://tools.ietf.org/html/rfc3986
+ * We are using the term "URL" instead of "URI" as this is more common in web applications
+ * and we do not need to distinguish them as the difference is mostly semantical and
+ * less technical. Generating URIs, i.e. representation-independent resource identifiers,
+ * is also possible.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Tobias Schultze <http://tobion.de>
+ */
+interface UrlGeneratorInterface extends RequestContextAwareInterface
+{
+    /**
+     * Generates an absolute URL, e.g. "http://example.com/dir/file".
+     */
+    const ABSOLUTE_URL = 0;
+
+    /**
+     * Generates an absolute path, e.g. "/dir/file".
+     */
+    const ABSOLUTE_PATH = 1;
+
+    /**
+     * Generates a relative path based on the current request path, e.g. "../parent-file".
+     *
+     * @see UrlGenerator::getRelativePath()
+     */
+    const RELATIVE_PATH = 2;
+
+    /**
+     * Generates a network path, e.g. "//example.com/dir/file".
+     * Such reference reuses the current scheme but specifies the host.
+     */
+    const NETWORK_PATH = 3;
+
+    /**
+     * Generates a URL or path for a specific route based on the given parameters.
+     *
+     * Parameters that reference placeholders in the route pattern will substitute them in the
+     * path or host. Extra params are added as query string to the URL.
+     *
+     * When the passed reference type cannot be generated for the route because it requires a different
+     * host or scheme than the current one, the method will return a more comprehensive reference
+     * that includes the required params. For example, when you call this method with $referenceType = ABSOLUTE_PATH
+     * but the route requires the https scheme whereas the current scheme is http, it will instead return an
+     * ABSOLUTE_URL with the https scheme and the current host. This makes sure the generated URL matches
+     * the route in any case.
+     *
+     * If there is no route with the given name, the generator must throw the RouteNotFoundException.
+     *
+     * @param string $name          The name of the route
+     * @param mixed  $parameters    An array of parameters
+     * @param int    $referenceType The type of reference to be generated (one of the constants)
+     *
+     * @return string The generated URL
+     *
+     * @throws RouteNotFoundException              If the named route doesn't exist
+     * @throws MissingMandatoryParametersException When some parameters are missing that are mandatory for the route
+     * @throws InvalidParameterException           When a parameter value for a placeholder is not correct because
+     *                                             it does not match the requirement
+     */
+    public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH);
+}
--- /dev/null
+++ b/vendor/symfony/routing/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2016 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/symfony/routing/Loader/AnnotationClassLoader.php
@@ -0,0 +1,268 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Loader;
+
+use Doctrine\Common\Annotations\Reader;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Config\Loader\LoaderInterface;
+use Symfony\Component\Config\Loader\LoaderResolverInterface;
+
+/**
+ * AnnotationClassLoader loads routing information from a PHP class and its methods.
+ *
+ * You need to define an implementation for the getRouteDefaults() method. Most of the
+ * time, this method should define some PHP callable to be called for the route
+ * (a controller in MVC speak).
+ *
+ * The @Route annotation can be set on the class (for global parameters),
+ * and on each method.
+ *
+ * The @Route annotation main value is the route path. The annotation also
+ * recognizes several parameters: requirements, options, defaults, schemes,
+ * methods, host, and name. The name parameter is mandatory.
+ * Here is an example of how you should be able to use it:
+ *
+ *     /**
+ *      * @Route("/Blog")
+ *      * /
+ *     class Blog
+ *     {
+ *         /**
+ *          * @Route("/", name="blog_index")
+ *          * /
+ *         public function index()
+ *         {
+ *         }
+ *
+ *         /**
+ *          * @Route("/{id}", name="blog_post", requirements = {"id" = "\d+"})
+ *          * /
+ *         public function show()
+ *         {
+ *         }
+ *     }
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class AnnotationClassLoader implements LoaderInterface
+{
+    /**
+     * @var Reader
+     */
+    protected $reader;
+
+    /**
+     * @var string
+     */
+    protected $routeAnnotationClass = 'Symfony\\Component\\Routing\\Annotation\\Route';
+
+    /**
+     * @var int
+     */
+    protected $defaultRouteIndex = 0;
+
+    /**
+     * Constructor.
+     *
+     * @param Reader $reader
+     */
+    public function __construct(Reader $reader)
+    {
+        $this->reader = $reader;
+    }
+
+    /**
+     * Sets the annotation class to read route properties from.
+     *
+     * @param string $class A fully-qualified class name
+     */
+    public function setRouteAnnotationClass($class)
+    {
+        $this->routeAnnotationClass = $class;
+    }
+
+    /**
+     * Loads from annotations from a class.
+     *
+     * @param string      $class A class name
+     * @param string|null $type  The resource type
+     *
+     * @return RouteCollection A RouteCollection instance
+     *
+     * @throws \InvalidArgumentException When route can't be parsed
+     */
+    public function load($class, $type = null)
+    {
+        if (!class_exists($class)) {
+            throw new \InvalidArgumentException(sprintf('Class "%s" does not exist.', $class));
+        }
+
+        $class = new \ReflectionClass($class);
+        if ($class->isAbstract()) {
+            throw new \InvalidArgumentException(sprintf('Annotations from class "%s" cannot be read as it is abstract.', $class->getName()));
+        }
+
+        $globals = $this->getGlobals($class);
+
+        $collection = new RouteCollection();
+        $collection->addResource(new FileResource($class->getFileName()));
+
+        foreach ($class->getMethods() as $method) {
+            $this->defaultRouteIndex = 0;
+            foreach ($this->reader->getMethodAnnotations($method) as $annot) {
+                if ($annot instanceof $this->routeAnnotationClass) {
+                    $this->addRoute($collection, $annot, $globals, $class, $method);
+                }
+            }
+        }
+
+        return $collection;
+    }
+
+    protected function addRoute(RouteCollection $collection, $annot, $globals, \ReflectionClass $class, \ReflectionMethod $method)
+    {
+        $name = $annot->getName();
+        if (null === $name) {
+            $name = $this->getDefaultRouteName($class, $method);
+        }
+
+        $defaults = array_replace($globals['defaults'], $annot->getDefaults());
+        foreach ($method->getParameters() as $param) {
+            if (!isset($defaults[$param->getName()]) && $param->isDefaultValueAvailable()) {
+                $defaults[$param->getName()] = $param->getDefaultValue();
+            }
+        }
+        $requirements = array_replace($globals['requirements'], $annot->getRequirements());
+        $options = array_replace($globals['options'], $annot->getOptions());
+        $schemes = array_merge($globals['schemes'], $annot->getSchemes());
+        $methods = array_merge($globals['methods'], $annot->getMethods());
+
+        $host = $annot->getHost();
+        if (null === $host) {
+            $host = $globals['host'];
+        }
+
+        $condition = $annot->getCondition();
+        if (null === $condition) {
+            $condition = $globals['condition'];
+        }
+
+        $route = $this->createRoute($globals['path'].$annot->getPath(), $defaults, $requirements, $options, $host, $schemes, $methods, $condition);
+
+        $this->configureRoute($route, $class, $method, $annot);
+
+        $collection->add($name, $route);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($resource, $type = null)
+    {
+        return is_string($resource) && preg_match('/^(?:\\\\?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)+$/', $resource) && (!$type || 'annotation' === $type);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setResolver(LoaderResolverInterface $resolver)
+    {
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getResolver()
+    {
+    }
+
+    /**
+     * Gets the default route name for a class method.
+     *
+     * @param \ReflectionClass  $class
+     * @param \ReflectionMethod $method
+     *
+     * @return string
+     */
+    protected function getDefaultRouteName(\ReflectionClass $class, \ReflectionMethod $method)
+    {
+        $name = strtolower(str_replace('\\', '_', $class->name).'_'.$method->name);
+        if ($this->defaultRouteIndex > 0) {
+            $name .= '_'.$this->defaultRouteIndex;
+        }
+        ++$this->defaultRouteIndex;
+
+        return $name;
+    }
+
+    protected function getGlobals(\ReflectionClass $class)
+    {
+        $globals = array(
+            'path' => '',
+            'requirements' => array(),
+            'options' => array(),
+            'defaults' => array(),
+            'schemes' => array(),
+            'methods' => array(),
+            'host' => '',
+            'condition' => '',
+        );
+
+        if ($annot = $this->reader->getClassAnnotation($class, $this->routeAnnotationClass)) {
+            // for BC reasons
+            if (null !== $annot->getPath()) {
+                $globals['path'] = $annot->getPath();
+            } elseif (null !== $annot->getPattern()) {
+                $globals['path'] = $annot->getPattern();
+            }
+
+            if (null !== $annot->getRequirements()) {
+                $globals['requirements'] = $annot->getRequirements();
+            }
+
+            if (null !== $annot->getOptions()) {
+                $globals['options'] = $annot->getOptions();
+            }
+
+            if (null !== $annot->getDefaults()) {
+                $globals['defaults'] = $annot->getDefaults();
+            }
+
+            if (null !== $annot->getSchemes()) {
+                $globals['schemes'] = $annot->getSchemes();
+            }
+
+            if (null !== $annot->getMethods()) {
+                $globals['methods'] = $annot->getMethods();
+            }
+
+            if (null !== $annot->getHost()) {
+                $globals['host'] = $annot->getHost();
+            }
+
+            if (null !== $annot->getCondition()) {
+                $globals['condition'] = $annot->getCondition();
+            }
+        }
+
+        return $globals;
+    }
+
+    protected function createRoute($path, $defaults, $requirements, $options, $host, $schemes, $methods, $condition)
+    {
+        return new Route($path, $defaults, $requirements, $options, $host, $schemes, $methods, $condition);
+    }
+
+    abstract protected function configureRoute(Route $route, \ReflectionClass $class, \ReflectionMethod $method, $annot);
+}
--- /dev/null
+++ b/vendor/symfony/routing/Loader/AnnotationDirectoryLoader.php
@@ -0,0 +1,81 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Loader;
+
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Config\Resource\DirectoryResource;
+
+/**
+ * AnnotationDirectoryLoader loads routing information from annotations set
+ * on PHP classes and methods.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class AnnotationDirectoryLoader extends AnnotationFileLoader
+{
+    /**
+     * Loads from annotations from a directory.
+     *
+     * @param string      $path A directory path
+     * @param string|null $type The resource type
+     *
+     * @return RouteCollection A RouteCollection instance
+     *
+     * @throws \InvalidArgumentException When the directory does not exist or its routes cannot be parsed
+     */
+    public function load($path, $type = null)
+    {
+        $dir = $this->locator->locate($path);
+
+        $collection = new RouteCollection();
+        $collection->addResource(new DirectoryResource($dir, '/\.php$/'));
+        $files = iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir), \RecursiveIteratorIterator::LEAVES_ONLY));
+        usort($files, function (\SplFileInfo $a, \SplFileInfo $b) {
+            return (string) $a > (string) $b ? 1 : -1;
+        });
+
+        foreach ($files as $file) {
+            if (!$file->isFile() || '.php' !== substr($file->getFilename(), -4)) {
+                continue;
+            }
+
+            if ($class = $this->findClass($file)) {
+                $refl = new \ReflectionClass($class);
+                if ($refl->isAbstract()) {
+                    continue;
+                }
+
+                $collection->addCollection($this->loader->load($class, $type));
+            }
+        }
+
+        return $collection;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($resource, $type = null)
+    {
+        if (!is_string($resource)) {
+            return false;
+        }
+
+        try {
+            $path = $this->locator->locate($resource);
+        } catch (\Exception $e) {
+            return false;
+        }
+
+        return is_dir($path) && (!$type || 'annotation' === $type);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Loader/AnnotationFileLoader.php
@@ -0,0 +1,142 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Loader;
+
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Config\Loader\FileLoader;
+use Symfony\Component\Config\FileLocatorInterface;
+
+/**
+ * AnnotationFileLoader loads routing information from annotations set
+ * on a PHP class and its methods.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class AnnotationFileLoader extends FileLoader
+{
+    protected $loader;
+
+    /**
+     * Constructor.
+     *
+     * @param FileLocatorInterface  $locator A FileLocator instance
+     * @param AnnotationClassLoader $loader  An AnnotationClassLoader instance
+     *
+     * @throws \RuntimeException
+     */
+    public function __construct(FileLocatorInterface $locator, AnnotationClassLoader $loader)
+    {
+        if (!function_exists('token_get_all')) {
+            throw new \RuntimeException('The Tokenizer extension is required for the routing annotation loaders.');
+        }
+
+        parent::__construct($locator);
+
+        $this->loader = $loader;
+    }
+
+    /**
+     * Loads from annotations from a file.
+     *
+     * @param string      $file A PHP file path
+     * @param string|null $type The resource type
+     *
+     * @return RouteCollection A RouteCollection instance
+     *
+     * @throws \InvalidArgumentException When the file does not exist or its routes cannot be parsed
+     */
+    public function load($file, $type = null)
+    {
+        $path = $this->locator->locate($file);
+
+        $collection = new RouteCollection();
+        if ($class = $this->findClass($path)) {
+            $collection->addResource(new FileResource($path));
+            $collection->addCollection($this->loader->load($class, $type));
+        }
+        if (PHP_VERSION_ID >= 70000) {
+            // PHP 7 memory manager will not release after token_get_all(), see https://bugs.php.net/70098
+            gc_mem_caches();
+        }
+
+        return $collection;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($resource, $type = null)
+    {
+        return is_string($resource) && 'php' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'annotation' === $type);
+    }
+
+    /**
+     * Returns the full class name for the first class in the file.
+     *
+     * @param string $file A PHP file path
+     *
+     * @return string|false Full class name if found, false otherwise
+     */
+    protected function findClass($file)
+    {
+        $class = false;
+        $namespace = false;
+        $tokens = token_get_all(file_get_contents($file));
+        for ($i = 0; isset($tokens[$i]); ++$i) {
+            $token = $tokens[$i];
+
+            if (!isset($token[1])) {
+                continue;
+            }
+
+            if (true === $class && T_STRING === $token[0]) {
+                return $namespace.'\\'.$token[1];
+            }
+
+            if (true === $namespace && T_STRING === $token[0]) {
+                $namespace = $token[1];
+                while (isset($tokens[++$i][1]) && in_array($tokens[$i][0], array(T_NS_SEPARATOR, T_STRING))) {
+                    $namespace .= $tokens[$i][1];
+                }
+                $token = $tokens[$i];
+            }
+
+            if (T_CLASS === $token[0]) {
+                // Skip usage of ::class constant
+                $isClassConstant = false;
+                for ($j = $i - 1; $j > 0; --$j) {
+                    if (!isset($tokens[$j][1])) {
+                        break;
+                    }
+
+                    if (T_DOUBLE_COLON === $tokens[$j][0]) {
+                        $isClassConstant = true;
+                        break;
+                    } elseif (!in_array($tokens[$j][0], array(T_WHITESPACE, T_DOC_COMMENT, T_COMMENT))) {
+                        break;
+                    }
+                }
+
+                if (!$isClassConstant) {
+                    $class = true;
+                }
+            }
+
+            if (T_NAMESPACE === $token[0]) {
+                $namespace = true;
+            }
+        }
+
+        return false;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Loader/ClosureLoader.php
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Loader;
+
+use Symfony\Component\Config\Loader\Loader;
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * ClosureLoader loads routes from a PHP closure.
+ *
+ * The Closure must return a RouteCollection instance.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ClosureLoader extends Loader
+{
+    /**
+     * Loads a Closure.
+     *
+     * @param \Closure    $closure A Closure
+     * @param string|null $type    The resource type
+     *
+     * @return RouteCollection A RouteCollection instance
+     */
+    public function load($closure, $type = null)
+    {
+        return $closure();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($resource, $type = null)
+    {
+        return $resource instanceof \Closure && (!$type || 'closure' === $type);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Loader/DependencyInjection/ServiceRouterLoader.php
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Loader\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\Routing\Loader\ObjectRouteLoader;
+
+/**
+ * A route loader that executes a service to load the routes.
+ *
+ * This depends on the DependencyInjection component.
+ *
+ * @author Ryan Weaver <ryan@knpuniversity.com>
+ */
+class ServiceRouterLoader extends ObjectRouteLoader
+{
+    /**
+     * @var ContainerInterface
+     */
+    private $container;
+
+    public function __construct(ContainerInterface $container)
+    {
+        $this->container = $container;
+    }
+
+    protected function getServiceObject($id)
+    {
+        return $this->container->get($id);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Loader/DirectoryLoader.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Loader;
+
+use Symfony\Component\Config\Loader\FileLoader;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Config\Resource\DirectoryResource;
+
+class DirectoryLoader extends FileLoader
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function load($file, $type = null)
+    {
+        $path = $this->locator->locate($file);
+
+        $collection = new RouteCollection();
+        $collection->addResource(new DirectoryResource($path));
+
+        foreach (scandir($path) as $dir) {
+            if ('.' !== $dir[0]) {
+                $this->setCurrentDir($path);
+                $subPath = $path.'/'.$dir;
+                $subType = null;
+
+                if (is_dir($subPath)) {
+                    $subPath .= '/';
+                    $subType = 'directory';
+                }
+
+                $subCollection = $this->import($subPath, $subType, false, $path);
+                $collection->addCollection($subCollection);
+            }
+        }
+
+        return $collection;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($resource, $type = null)
+    {
+        // only when type is forced to directory, not to conflict with AnnotationLoader
+
+        return 'directory' === $type;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Loader/ObjectRouteLoader.php
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Loader;
+
+use Symfony\Component\Config\Loader\Loader;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * A route loader that calls a method on an object to load the routes.
+ *
+ * @author Ryan Weaver <ryan@knpuniversity.com>
+ */
+abstract class ObjectRouteLoader extends Loader
+{
+    /**
+     * Returns the object that the method will be called on to load routes.
+     *
+     * For example, if your application uses a service container,
+     * the $id may be a service id.
+     *
+     * @param string $id
+     *
+     * @return object
+     */
+    abstract protected function getServiceObject($id);
+
+    /**
+     * Calls the service that will load the routes.
+     *
+     * @param mixed       $resource Some value that will resolve to a callable
+     * @param string|null $type     The resource type
+     *
+     * @return RouteCollection
+     */
+    public function load($resource, $type = null)
+    {
+        $parts = explode(':', $resource);
+        if (count($parts) != 2) {
+            throw new \InvalidArgumentException(sprintf('Invalid resource "%s" passed to the "service" route loader: use the format "service_name:methodName"', $resource));
+        }
+
+        $serviceString = $parts[0];
+        $method = $parts[1];
+
+        $loaderObject = $this->getServiceObject($serviceString);
+
+        if (!is_object($loaderObject)) {
+            throw new \LogicException(sprintf('%s:getServiceObject() must return an object: %s returned', get_class($this), gettype($loaderObject)));
+        }
+
+        if (!method_exists($loaderObject, $method)) {
+            throw new \BadMethodCallException(sprintf('Method "%s" not found on "%s" when importing routing resource "%s"', $method, get_class($loaderObject), $resource));
+        }
+
+        $routeCollection = call_user_func(array($loaderObject, $method), $this);
+
+        if (!$routeCollection instanceof RouteCollection) {
+            $type = is_object($routeCollection) ? get_class($routeCollection) : gettype($routeCollection);
+
+            throw new \LogicException(sprintf('The %s::%s method must return a RouteCollection: %s returned', get_class($loaderObject), $method, $type));
+        }
+
+        // make the service file tracked so that if it changes, the cache rebuilds
+        $this->addClassResource(new \ReflectionClass($loaderObject), $routeCollection);
+
+        return $routeCollection;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($resource, $type = null)
+    {
+        return 'service' === $type;
+    }
+
+    private function addClassResource(\ReflectionClass $class, RouteCollection $collection)
+    {
+        do {
+            if (is_file($class->getFileName())) {
+                $collection->addResource(new FileResource($class->getFileName()));
+            }
+        } while ($class = $class->getParentClass());
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Loader/PhpFileLoader.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Loader;
+
+use Symfony\Component\Config\Loader\FileLoader;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * PhpFileLoader loads routes from a PHP file.
+ *
+ * The file must return a RouteCollection instance.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class PhpFileLoader extends FileLoader
+{
+    /**
+     * Loads a PHP file.
+     *
+     * @param string      $file A PHP file path
+     * @param string|null $type The resource type
+     *
+     * @return RouteCollection A RouteCollection instance
+     */
+    public function load($file, $type = null)
+    {
+        $path = $this->locator->locate($file);
+        $this->setCurrentDir(dirname($path));
+
+        $collection = self::includeFile($path, $this);
+        $collection->addResource(new FileResource($path));
+
+        return $collection;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($resource, $type = null)
+    {
+        return is_string($resource) && 'php' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'php' === $type);
+    }
+
+    /**
+     * Safe include. Used for scope isolation.
+     *
+     * @param string        $file   File to include
+     * @param PhpFileLoader $loader the loader variable is exposed to the included file below
+     *
+     * @return RouteCollection
+     */
+    private static function includeFile($file, PhpFileLoader $loader)
+    {
+        return include $file;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Loader/XmlFileLoader.php
@@ -0,0 +1,270 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Loader;
+
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Config\Loader\FileLoader;
+use Symfony\Component\Config\Util\XmlUtils;
+
+/**
+ * XmlFileLoader loads XML routing files.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Tobias Schultze <http://tobion.de>
+ */
+class XmlFileLoader extends FileLoader
+{
+    const NAMESPACE_URI = 'http://symfony.com/schema/routing';
+    const SCHEME_PATH = '/schema/routing/routing-1.0.xsd';
+
+    /**
+     * Loads an XML file.
+     *
+     * @param string      $file An XML file path
+     * @param string|null $type The resource type
+     *
+     * @return RouteCollection A RouteCollection instance
+     *
+     * @throws \InvalidArgumentException When the file cannot be loaded or when the XML cannot be
+     *                                   parsed because it does not validate against the scheme.
+     */
+    public function load($file, $type = null)
+    {
+        $path = $this->locator->locate($file);
+
+        $xml = $this->loadFile($path);
+
+        $collection = new RouteCollection();
+        $collection->addResource(new FileResource($path));
+
+        // process routes and imports
+        foreach ($xml->documentElement->childNodes as $node) {
+            if (!$node instanceof \DOMElement) {
+                continue;
+            }
+
+            $this->parseNode($collection, $node, $path, $file);
+        }
+
+        return $collection;
+    }
+
+    /**
+     * Parses a node from a loaded XML file.
+     *
+     * @param RouteCollection $collection Collection to associate with the node
+     * @param \DOMElement     $node       Element to parse
+     * @param string          $path       Full path of the XML file being processed
+     * @param string          $file       Loaded file name
+     *
+     * @throws \InvalidArgumentException When the XML is invalid
+     */
+    protected function parseNode(RouteCollection $collection, \DOMElement $node, $path, $file)
+    {
+        if (self::NAMESPACE_URI !== $node->namespaceURI) {
+            return;
+        }
+
+        switch ($node->localName) {
+            case 'route':
+                $this->parseRoute($collection, $node, $path);
+                break;
+            case 'import':
+                $this->parseImport($collection, $node, $path, $file);
+                break;
+            default:
+                throw new \InvalidArgumentException(sprintf('Unknown tag "%s" used in file "%s". Expected "route" or "import".', $node->localName, $path));
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($resource, $type = null)
+    {
+        return is_string($resource) && 'xml' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'xml' === $type);
+    }
+
+    /**
+     * Parses a route and adds it to the RouteCollection.
+     *
+     * @param RouteCollection $collection RouteCollection instance
+     * @param \DOMElement     $node       Element to parse that represents a Route
+     * @param string          $path       Full path of the XML file being processed
+     *
+     * @throws \InvalidArgumentException When the XML is invalid
+     */
+    protected function parseRoute(RouteCollection $collection, \DOMElement $node, $path)
+    {
+        if ('' === ($id = $node->getAttribute('id')) || (!$node->hasAttribute('pattern') && !$node->hasAttribute('path'))) {
+            throw new \InvalidArgumentException(sprintf('The <route> element in file "%s" must have an "id" and a "path" attribute.', $path));
+        }
+
+        if ($node->hasAttribute('pattern')) {
+            if ($node->hasAttribute('path')) {
+                throw new \InvalidArgumentException(sprintf('The <route> element in file "%s" cannot define both a "path" and a "pattern" attribute. Use only "path".', $path));
+            }
+
+            @trigger_error(sprintf('The "pattern" option in file "%s" is deprecated since version 2.2 and will be removed in 3.0. Use the "path" option in the route definition instead.', $path), E_USER_DEPRECATED);
+
+            $node->setAttribute('path', $node->getAttribute('pattern'));
+            $node->removeAttribute('pattern');
+        }
+
+        $schemes = preg_split('/[\s,\|]++/', $node->getAttribute('schemes'), -1, PREG_SPLIT_NO_EMPTY);
+        $methods = preg_split('/[\s,\|]++/', $node->getAttribute('methods'), -1, PREG_SPLIT_NO_EMPTY);
+
+        list($defaults, $requirements, $options, $condition) = $this->parseConfigs($node, $path);
+
+        if (isset($requirements['_method'])) {
+            if (0 === count($methods)) {
+                $methods = explode('|', $requirements['_method']);
+            }
+
+            unset($requirements['_method']);
+            @trigger_error(sprintf('The "_method" requirement of route "%s" in file "%s" is deprecated since version 2.2 and will be removed in 3.0. Use the "methods" attribute instead.', $id, $path), E_USER_DEPRECATED);
+        }
+
+        if (isset($requirements['_scheme'])) {
+            if (0 === count($schemes)) {
+                $schemes = explode('|', $requirements['_scheme']);
+            }
+
+            unset($requirements['_scheme']);
+            @trigger_error(sprintf('The "_scheme" requirement of route "%s" in file "%s" is deprecated since version 2.2 and will be removed in 3.0. Use the "schemes" attribute instead.', $id, $path), E_USER_DEPRECATED);
+        }
+
+        $route = new Route($node->getAttribute('path'), $defaults, $requirements, $options, $node->getAttribute('host'), $schemes, $methods, $condition);
+        $collection->add($id, $route);
+    }
+
+    /**
+     * Parses an import and adds the routes in the resource to the RouteCollection.
+     *
+     * @param RouteCollection $collection RouteCollection instance
+     * @param \DOMElement     $node       Element to parse that represents a Route
+     * @param string          $path       Full path of the XML file being processed
+     * @param string          $file       Loaded file name
+     *
+     * @throws \InvalidArgumentException When the XML is invalid
+     */
+    protected function parseImport(RouteCollection $collection, \DOMElement $node, $path, $file)
+    {
+        if ('' === $resource = $node->getAttribute('resource')) {
+            throw new \InvalidArgumentException(sprintf('The <import> element in file "%s" must have a "resource" attribute.', $path));
+        }
+
+        $type = $node->getAttribute('type');
+        $prefix = $node->getAttribute('prefix');
+        $host = $node->hasAttribute('host') ? $node->getAttribute('host') : null;
+        $schemes = $node->hasAttribute('schemes') ? preg_split('/[\s,\|]++/', $node->getAttribute('schemes'), -1, PREG_SPLIT_NO_EMPTY) : null;
+        $methods = $node->hasAttribute('methods') ? preg_split('/[\s,\|]++/', $node->getAttribute('methods'), -1, PREG_SPLIT_NO_EMPTY) : null;
+
+        list($defaults, $requirements, $options, $condition) = $this->parseConfigs($node, $path);
+
+        $this->setCurrentDir(dirname($path));
+
+        $subCollection = $this->import($resource, ('' !== $type ? $type : null), false, $file);
+        /* @var $subCollection RouteCollection */
+        $subCollection->addPrefix($prefix);
+        if (null !== $host) {
+            $subCollection->setHost($host);
+        }
+        if (null !== $condition) {
+            $subCollection->setCondition($condition);
+        }
+        if (null !== $schemes) {
+            $subCollection->setSchemes($schemes);
+        }
+        if (null !== $methods) {
+            $subCollection->setMethods($methods);
+        }
+        $subCollection->addDefaults($defaults);
+        $subCollection->addRequirements($requirements);
+        $subCollection->addOptions($options);
+
+        $collection->addCollection($subCollection);
+    }
+
+    /**
+     * Loads an XML file.
+     *
+     * @param string $file An XML file path
+     *
+     * @return \DOMDocument
+     *
+     * @throws \InvalidArgumentException When loading of XML file fails because of syntax errors
+     *                                   or when the XML structure is not as expected by the scheme -
+     *                                   see validate()
+     */
+    protected function loadFile($file)
+    {
+        return XmlUtils::loadFile($file, __DIR__.static::SCHEME_PATH);
+    }
+
+    /**
+     * Parses the config elements (default, requirement, option).
+     *
+     * @param \DOMElement $node Element to parse that contains the configs
+     * @param string      $path Full path of the XML file being processed
+     *
+     * @return array An array with the defaults as first item, requirements as second and options as third
+     *
+     * @throws \InvalidArgumentException When the XML is invalid
+     */
+    private function parseConfigs(\DOMElement $node, $path)
+    {
+        $defaults = array();
+        $requirements = array();
+        $options = array();
+        $condition = null;
+
+        foreach ($node->getElementsByTagNameNS(self::NAMESPACE_URI, '*') as $n) {
+            switch ($n->localName) {
+                case 'default':
+                    if ($this->isElementValueNull($n)) {
+                        $defaults[$n->getAttribute('key')] = null;
+                    } else {
+                        $defaults[$n->getAttribute('key')] = trim($n->textContent);
+                    }
+
+                    break;
+                case 'requirement':
+                    $requirements[$n->getAttribute('key')] = trim($n->textContent);
+                    break;
+                case 'option':
+                    $options[$n->getAttribute('key')] = trim($n->textContent);
+                    break;
+                case 'condition':
+                    $condition = trim($n->textContent);
+                    break;
+                default:
+                    throw new \InvalidArgumentException(sprintf('Unknown tag "%s" used in file "%s". Expected "default", "requirement" or "option".', $n->localName, $path));
+            }
+        }
+
+        return array($defaults, $requirements, $options, $condition);
+    }
+
+    private function isElementValueNull(\DOMElement $element)
+    {
+        $namespaceUri = 'http://www.w3.org/2001/XMLSchema-instance';
+
+        if (!$element->hasAttributeNS($namespaceUri, 'nil')) {
+            return false;
+        }
+
+        return 'true' === $element->getAttributeNS($namespaceUri, 'nil') || '1' === $element->getAttributeNS($namespaceUri, 'nil');
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Loader/YamlFileLoader.php
@@ -0,0 +1,236 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Loader;
+
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Yaml\Exception\ParseException;
+use Symfony\Component\Yaml\Parser as YamlParser;
+use Symfony\Component\Config\Loader\FileLoader;
+
+/**
+ * YamlFileLoader loads Yaml routing files.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Tobias Schultze <http://tobion.de>
+ */
+class YamlFileLoader extends FileLoader
+{
+    private static $availableKeys = array(
+        'resource', 'type', 'prefix', 'pattern', 'path', 'host', 'schemes', 'methods', 'defaults', 'requirements', 'options', 'condition',
+    );
+    private $yamlParser;
+
+    /**
+     * Loads a Yaml file.
+     *
+     * @param string      $file A Yaml file path
+     * @param string|null $type The resource type
+     *
+     * @return RouteCollection A RouteCollection instance
+     *
+     * @throws \InvalidArgumentException When a route can't be parsed because YAML is invalid
+     */
+    public function load($file, $type = null)
+    {
+        $path = $this->locator->locate($file);
+
+        if (!stream_is_local($path)) {
+            throw new \InvalidArgumentException(sprintf('This is not a local file "%s".', $path));
+        }
+
+        if (!file_exists($path)) {
+            throw new \InvalidArgumentException(sprintf('File "%s" not found.', $path));
+        }
+
+        if (null === $this->yamlParser) {
+            $this->yamlParser = new YamlParser();
+        }
+
+        try {
+            $parsedConfig = $this->yamlParser->parse(file_get_contents($path));
+        } catch (ParseException $e) {
+            throw new \InvalidArgumentException(sprintf('The file "%s" does not contain valid YAML.', $path), 0, $e);
+        }
+
+        $collection = new RouteCollection();
+        $collection->addResource(new FileResource($path));
+
+        // empty file
+        if (null === $parsedConfig) {
+            return $collection;
+        }
+
+        // not an array
+        if (!is_array($parsedConfig)) {
+            throw new \InvalidArgumentException(sprintf('The file "%s" must contain a YAML array.', $path));
+        }
+
+        foreach ($parsedConfig as $name => $config) {
+            if (isset($config['pattern'])) {
+                if (isset($config['path'])) {
+                    throw new \InvalidArgumentException(sprintf('The file "%s" cannot define both a "path" and a "pattern" attribute. Use only "path".', $path));
+                }
+
+                @trigger_error(sprintf('The "pattern" option in file "%s" is deprecated since version 2.2 and will be removed in 3.0. Use the "path" option in the route definition instead.', $path), E_USER_DEPRECATED);
+
+                $config['path'] = $config['pattern'];
+                unset($config['pattern']);
+            }
+
+            $this->validate($config, $name, $path);
+
+            if (isset($config['resource'])) {
+                $this->parseImport($collection, $config, $path, $file);
+            } else {
+                $this->parseRoute($collection, $name, $config, $path);
+            }
+        }
+
+        return $collection;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($resource, $type = null)
+    {
+        return is_string($resource) && in_array(pathinfo($resource, PATHINFO_EXTENSION), array('yml', 'yaml'), true) && (!$type || 'yaml' === $type);
+    }
+
+    /**
+     * Parses a route and adds it to the RouteCollection.
+     *
+     * @param RouteCollection $collection A RouteCollection instance
+     * @param string          $name       Route name
+     * @param array           $config     Route definition
+     * @param string          $path       Full path of the YAML file being processed
+     */
+    protected function parseRoute(RouteCollection $collection, $name, array $config, $path)
+    {
+        $defaults = isset($config['defaults']) ? $config['defaults'] : array();
+        $requirements = isset($config['requirements']) ? $config['requirements'] : array();
+        $options = isset($config['options']) ? $config['options'] : array();
+        $host = isset($config['host']) ? $config['host'] : '';
+        $schemes = isset($config['schemes']) ? $config['schemes'] : array();
+        $methods = isset($config['methods']) ? $config['methods'] : array();
+        $condition = isset($config['condition']) ? $config['condition'] : null;
+
+        if (isset($requirements['_method'])) {
+            if (0 === count($methods)) {
+                $methods = explode('|', $requirements['_method']);
+            }
+
+            unset($requirements['_method']);
+            @trigger_error(sprintf('The "_method" requirement of route "%s" in file "%s" is deprecated since version 2.2 and will be removed in 3.0. Use the "methods" option instead.', $name, $path), E_USER_DEPRECATED);
+        }
+
+        if (isset($requirements['_scheme'])) {
+            if (0 === count($schemes)) {
+                $schemes = explode('|', $requirements['_scheme']);
+            }
+
+            unset($requirements['_scheme']);
+            @trigger_error(sprintf('The "_scheme" requirement of route "%s" in file "%s" is deprecated since version 2.2 and will be removed in 3.0. Use the "schemes" option instead.', $name, $path), E_USER_DEPRECATED);
+        }
+
+        $route = new Route($config['path'], $defaults, $requirements, $options, $host, $schemes, $methods, $condition);
+
+        $collection->add($name, $route);
+    }
+
+    /**
+     * Parses an import and adds the routes in the resource to the RouteCollection.
+     *
+     * @param RouteCollection $collection A RouteCollection instance
+     * @param array           $config     Route definition
+     * @param string          $path       Full path of the YAML file being processed
+     * @param string          $file       Loaded file name
+     */
+    protected function parseImport(RouteCollection $collection, array $config, $path, $file)
+    {
+        $type = isset($config['type']) ? $config['type'] : null;
+        $prefix = isset($config['prefix']) ? $config['prefix'] : '';
+        $defaults = isset($config['defaults']) ? $config['defaults'] : array();
+        $requirements = isset($config['requirements']) ? $config['requirements'] : array();
+        $options = isset($config['options']) ? $config['options'] : array();
+        $host = isset($config['host']) ? $config['host'] : null;
+        $condition = isset($config['condition']) ? $config['condition'] : null;
+        $schemes = isset($config['schemes']) ? $config['schemes'] : null;
+        $methods = isset($config['methods']) ? $config['methods'] : null;
+
+        $this->setCurrentDir(dirname($path));
+
+        $subCollection = $this->import($config['resource'], $type, false, $file);
+        /* @var $subCollection RouteCollection */
+        $subCollection->addPrefix($prefix);
+        if (null !== $host) {
+            $subCollection->setHost($host);
+        }
+        if (null !== $condition) {
+            $subCollection->setCondition($condition);
+        }
+        if (null !== $schemes) {
+            $subCollection->setSchemes($schemes);
+        }
+        if (null !== $methods) {
+            $subCollection->setMethods($methods);
+        }
+        $subCollection->addDefaults($defaults);
+        $subCollection->addRequirements($requirements);
+        $subCollection->addOptions($options);
+
+        $collection->addCollection($subCollection);
+    }
+
+    /**
+     * Validates the route configuration.
+     *
+     * @param array  $config A resource config
+     * @param string $name   The config key
+     * @param string $path   The loaded file path
+     *
+     * @throws \InvalidArgumentException If one of the provided config keys is not supported,
+     *                                   something is missing or the combination is nonsense
+     */
+    protected function validate($config, $name, $path)
+    {
+        if (!is_array($config)) {
+            throw new \InvalidArgumentException(sprintf('The definition of "%s" in "%s" must be a YAML array.', $name, $path));
+        }
+        if ($extraKeys = array_diff(array_keys($config), self::$availableKeys)) {
+            throw new \InvalidArgumentException(sprintf(
+                'The routing file "%s" contains unsupported keys for "%s": "%s". Expected one of: "%s".',
+                $path, $name, implode('", "', $extraKeys), implode('", "', self::$availableKeys)
+            ));
+        }
+        if (isset($config['resource']) && isset($config['path'])) {
+            throw new \InvalidArgumentException(sprintf(
+                'The routing file "%s" must not specify both the "resource" key and the "path" key for "%s". Choose between an import and a route definition.',
+                $path, $name
+            ));
+        }
+        if (!isset($config['resource']) && isset($config['type'])) {
+            throw new \InvalidArgumentException(sprintf(
+                'The "type" key for the route definition "%s" in "%s" is unsupported. It is only available for imports in combination with the "resource" key.',
+                $name, $path
+            ));
+        }
+        if (!isset($config['resource']) && !isset($config['path'])) {
+            throw new \InvalidArgumentException(sprintf(
+                'You must define a "path" for the route "%s" in file "%s".',
+                $name, $path
+            ));
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Loader/schema/routing/routing-1.0.xsd
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<xsd:schema xmlns="http://symfony.com/schema/routing"
+    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+    targetNamespace="http://symfony.com/schema/routing"
+    elementFormDefault="qualified">
+
+  <xsd:annotation>
+    <xsd:documentation><![CDATA[
+      Symfony XML Routing Schema, version 1.0
+      Authors: Fabien Potencier, Tobias Schultze
+
+      This scheme defines the elements and attributes that can be used to define
+      routes. A route maps an HTTP request to a set of configuration variables.
+    ]]></xsd:documentation>
+  </xsd:annotation>
+
+  <xsd:element name="routes" type="routes" />
+
+  <xsd:complexType name="routes">
+    <xsd:choice minOccurs="0" maxOccurs="unbounded">
+      <xsd:element name="import" type="import" />
+      <xsd:element name="route" type="route" />
+    </xsd:choice>
+  </xsd:complexType>
+
+  <xsd:group name="configs">
+    <xsd:choice>
+      <xsd:element name="default" nillable="true" type="element" />
+      <xsd:element name="requirement" type="element" />
+      <xsd:element name="option" type="element" />
+      <xsd:element name="condition" type="xsd:string" />
+    </xsd:choice>
+  </xsd:group>
+
+  <xsd:complexType name="route">
+    <xsd:group ref="configs" minOccurs="0" maxOccurs="unbounded" />
+
+    <xsd:attribute name="id" type="xsd:string" use="required" />
+    <xsd:attribute name="path" type="xsd:string" />
+    <xsd:attribute name="pattern" type="xsd:string" />
+    <xsd:attribute name="host" type="xsd:string" />
+    <xsd:attribute name="schemes" type="xsd:string" />
+    <xsd:attribute name="methods" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="import">
+    <xsd:group ref="configs" minOccurs="0" maxOccurs="unbounded" />
+
+    <xsd:attribute name="resource" type="xsd:string" use="required" />
+    <xsd:attribute name="type" type="xsd:string" />
+    <xsd:attribute name="prefix" type="xsd:string" />
+    <xsd:attribute name="host" type="xsd:string" />
+    <xsd:attribute name="schemes" type="xsd:string" />
+    <xsd:attribute name="methods" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="element">
+    <xsd:simpleContent>
+      <xsd:extension base="xsd:string">
+        <xsd:attribute name="key" type="xsd:string" use="required" />
+      </xsd:extension>
+    </xsd:simpleContent>
+  </xsd:complexType>
+</xsd:schema>
--- /dev/null
+++ b/vendor/symfony/routing/Matcher/ApacheUrlMatcher.php
@@ -0,0 +1,124 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Matcher;
+
+@trigger_error('The '.__NAMESPACE__.'\ApacheUrlMatcher class is deprecated since version 2.5 and will be removed in 3.0. It\'s hard to replicate the behaviour of the PHP implementation and the performance gains are minimal.', E_USER_DEPRECATED);
+
+use Symfony\Component\Routing\Exception\MethodNotAllowedException;
+
+/**
+ * ApacheUrlMatcher matches URL based on Apache mod_rewrite matching (see ApacheMatcherDumper).
+ *
+ * @deprecated since version 2.5, to be removed in 3.0.
+ *             The performance gains are minimal and it's very hard to replicate
+ *             the behavior of PHP implementation.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Arnaud Le Blanc <arnaud.lb@gmail.com>
+ */
+class ApacheUrlMatcher extends UrlMatcher
+{
+    /**
+     * Tries to match a URL based on Apache mod_rewrite matching.
+     *
+     * Returns false if no route matches the URL.
+     *
+     * @param string $pathinfo The pathinfo to be parsed
+     *
+     * @return array An array of parameters
+     *
+     * @throws MethodNotAllowedException If the current method is not allowed
+     */
+    public function match($pathinfo)
+    {
+        $parameters = array();
+        $defaults = array();
+        $allow = array();
+        $route = null;
+
+        foreach ($this->denormalizeValues($_SERVER) as $key => $value) {
+            $name = $key;
+
+            // skip non-routing variables
+            // this improves performance when $_SERVER contains many usual
+            // variables like HTTP_*, DOCUMENT_ROOT, REQUEST_URI, ...
+            if (false === strpos($name, '_ROUTING_')) {
+                continue;
+            }
+
+            while (0 === strpos($name, 'REDIRECT_')) {
+                $name = substr($name, 9);
+            }
+
+            // expect _ROUTING_<type>_<name>
+            // or _ROUTING_<type>
+
+            if (0 !== strpos($name, '_ROUTING_')) {
+                continue;
+            }
+            if (false !== $pos = strpos($name, '_', 9)) {
+                $type = substr($name, 9, $pos - 9);
+                $name = substr($name, $pos + 1);
+            } else {
+                $type = substr($name, 9);
+            }
+
+            if ('param' === $type) {
+                if ('' !== $value) {
+                    $parameters[$name] = $value;
+                }
+            } elseif ('default' === $type) {
+                $defaults[$name] = $value;
+            } elseif ('route' === $type) {
+                $route = $value;
+            } elseif ('allow' === $type) {
+                $allow[] = $name;
+            }
+
+            unset($_SERVER[$key]);
+        }
+
+        if (null !== $route) {
+            $parameters['_route'] = $route;
+
+            return $this->mergeDefaults($parameters, $defaults);
+        } elseif (0 < count($allow)) {
+            throw new MethodNotAllowedException($allow);
+        } else {
+            return parent::match($pathinfo);
+        }
+    }
+
+    /**
+     * Denormalizes an array of values.
+     *
+     * @param string[] $values
+     *
+     * @return array
+     */
+    private function denormalizeValues(array $values)
+    {
+        $normalizedValues = array();
+        foreach ($values as $key => $value) {
+            if (preg_match('~^(.*)\[(\d+)\]$~', $key, $matches)) {
+                if (!isset($normalizedValues[$matches[1]])) {
+                    $normalizedValues[$matches[1]] = array();
+                }
+                $normalizedValues[$matches[1]][(int) $matches[2]] = $value;
+            } else {
+                $normalizedValues[$key] = $value;
+            }
+        }
+
+        return $normalizedValues;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Matcher/Dumper/ApacheMatcherDumper.php
@@ -0,0 +1,278 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Matcher\Dumper;
+
+@trigger_error('The '.__NAMESPACE__.'\ApacheMatcherDumper class is deprecated since version 2.5 and will be removed in 3.0. It\'s hard to replicate the behaviour of the PHP implementation and the performance gains are minimal.', E_USER_DEPRECATED);
+
+use Symfony\Component\Routing\Route;
+
+/**
+ * Dumps a set of Apache mod_rewrite rules.
+ *
+ * @deprecated since version 2.5, to be removed in 3.0.
+ *             The performance gains are minimal and it's very hard to replicate
+ *             the behavior of PHP implementation.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Kris Wallsmith <kris@symfony.com>
+ */
+class ApacheMatcherDumper extends MatcherDumper
+{
+    /**
+     * Dumps a set of Apache mod_rewrite rules.
+     *
+     * Available options:
+     *
+     *  * script_name: The script name (app.php by default)
+     *  * base_uri:    The base URI ("" by default)
+     *
+     * @param array $options An array of options
+     *
+     * @return string A string to be used as Apache rewrite rules
+     *
+     * @throws \LogicException When the route regex is invalid
+     */
+    public function dump(array $options = array())
+    {
+        $options = array_merge(array(
+            'script_name' => 'app.php',
+            'base_uri' => '',
+        ), $options);
+
+        $options['script_name'] = self::escape($options['script_name'], ' ', '\\');
+
+        $rules = array("# skip \"real\" requests\nRewriteCond %{REQUEST_FILENAME} -f\nRewriteRule .* - [QSA,L]");
+        $methodVars = array();
+        $hostRegexUnique = 0;
+        $prevHostRegex = '';
+
+        foreach ($this->getRoutes()->all() as $name => $route) {
+            if ($route->getCondition()) {
+                throw new \LogicException(sprintf('Unable to dump the routes for Apache as route "%s" has a condition.', $name));
+            }
+
+            $compiledRoute = $route->compile();
+            $hostRegex = $compiledRoute->getHostRegex();
+
+            if (null !== $hostRegex && $prevHostRegex !== $hostRegex) {
+                $prevHostRegex = $hostRegex;
+                ++$hostRegexUnique;
+
+                $rule = array();
+
+                $regex = $this->regexToApacheRegex($hostRegex);
+                $regex = self::escape($regex, ' ', '\\');
+
+                $rule[] = sprintf('RewriteCond %%{HTTP:Host} %s', $regex);
+
+                $variables = array();
+                $variables[] = sprintf('E=__ROUTING_host_%s:1', $hostRegexUnique);
+
+                foreach ($compiledRoute->getHostVariables() as $i => $variable) {
+                    $variables[] = sprintf('E=__ROUTING_host_%s_%s:%%%d', $hostRegexUnique, $variable, $i + 1);
+                }
+
+                $variables = implode(',', $variables);
+
+                $rule[] = sprintf('RewriteRule .? - [%s]', $variables);
+
+                $rules[] = implode("\n", $rule);
+            }
+
+            $rules[] = $this->dumpRoute($name, $route, $options, $hostRegexUnique);
+
+            $methodVars = array_merge($methodVars, $route->getMethods());
+        }
+        if (0 < count($methodVars)) {
+            $rule = array('# 405 Method Not Allowed');
+            $methodVars = array_values(array_unique($methodVars));
+            if (in_array('GET', $methodVars) && !in_array('HEAD', $methodVars)) {
+                $methodVars[] = 'HEAD';
+            }
+            foreach ($methodVars as $i => $methodVar) {
+                $rule[] = sprintf('RewriteCond %%{ENV:_ROUTING__allow_%s} =1%s', $methodVar, isset($methodVars[$i + 1]) ? ' [OR]' : '');
+            }
+            $rule[] = sprintf('RewriteRule .* %s [QSA,L]', $options['script_name']);
+
+            $rules[] = implode("\n", $rule);
+        }
+
+        return implode("\n\n", $rules)."\n";
+    }
+
+    /**
+     * Dumps a single route.
+     *
+     * @param string $name            Route name
+     * @param Route  $route           The route
+     * @param array  $options         Options
+     * @param bool   $hostRegexUnique Unique identifier for the host regex
+     *
+     * @return string The compiled route
+     */
+    private function dumpRoute($name, $route, array $options, $hostRegexUnique)
+    {
+        $compiledRoute = $route->compile();
+
+        // prepare the apache regex
+        $regex = $this->regexToApacheRegex($compiledRoute->getRegex());
+        $regex = '^'.self::escape(preg_quote($options['base_uri']).substr($regex, 1), ' ', '\\');
+
+        $methods = $this->getRouteMethods($route);
+
+        $hasTrailingSlash = (!$methods || in_array('HEAD', $methods)) && '/$' === substr($regex, -2) && '^/$' !== $regex;
+
+        $variables = array('E=_ROUTING_route:'.$name);
+        foreach ($compiledRoute->getHostVariables() as $variable) {
+            $variables[] = sprintf('E=_ROUTING_param_%s:%%{ENV:__ROUTING_host_%s_%s}', $variable, $hostRegexUnique, $variable);
+        }
+        foreach ($compiledRoute->getPathVariables() as $i => $variable) {
+            $variables[] = 'E=_ROUTING_param_'.$variable.':%'.($i + 1);
+        }
+        foreach ($this->normalizeValues($route->getDefaults()) as $key => $value) {
+            $variables[] = 'E=_ROUTING_default_'.$key.':'.strtr($value, array(
+                ':' => '\\:',
+                '=' => '\\=',
+                '\\' => '\\\\',
+                ' ' => '\\ ',
+            ));
+        }
+        $variables = implode(',', $variables);
+
+        $rule = array("# $name");
+
+        // method mismatch
+        if (0 < count($methods)) {
+            $allow = array();
+            foreach ($methods as $method) {
+                $allow[] = 'E=_ROUTING_allow_'.$method.':1';
+            }
+
+            if ($compiledRoute->getHostRegex()) {
+                $rule[] = sprintf('RewriteCond %%{ENV:__ROUTING_host_%s} =1', $hostRegexUnique);
+            }
+
+            $rule[] = "RewriteCond %{REQUEST_URI} $regex";
+            $rule[] = sprintf('RewriteCond %%{REQUEST_METHOD} !^(%s)$ [NC]', implode('|', $methods));
+            $rule[] = sprintf('RewriteRule .* - [S=%d,%s]', $hasTrailingSlash ? 2 : 1, implode(',', $allow));
+        }
+
+        // redirect with trailing slash appended
+        if ($hasTrailingSlash) {
+            if ($compiledRoute->getHostRegex()) {
+                $rule[] = sprintf('RewriteCond %%{ENV:__ROUTING_host_%s} =1', $hostRegexUnique);
+            }
+
+            $rule[] = 'RewriteCond %{REQUEST_URI} '.substr($regex, 0, -2).'$';
+            $rule[] = 'RewriteRule .* $0/ [QSA,L,R=301]';
+        }
+
+        // the main rule
+
+        if ($compiledRoute->getHostRegex()) {
+            $rule[] = sprintf('RewriteCond %%{ENV:__ROUTING_host_%s} =1', $hostRegexUnique);
+        }
+
+        $rule[] = "RewriteCond %{REQUEST_URI} $regex";
+        $rule[] = "RewriteRule .* {$options['script_name']} [QSA,L,$variables]";
+
+        return implode("\n", $rule);
+    }
+
+    /**
+     * Returns methods allowed for a route.
+     *
+     * @param Route $route The route
+     *
+     * @return array The methods
+     */
+    private function getRouteMethods(Route $route)
+    {
+        $methods = $route->getMethods();
+
+        // GET and HEAD are equivalent
+        if (in_array('GET', $methods) && !in_array('HEAD', $methods)) {
+            $methods[] = 'HEAD';
+        }
+
+        return $methods;
+    }
+
+    /**
+     * Converts a regex to make it suitable for mod_rewrite.
+     *
+     * @param string $regex The regex
+     *
+     * @return string The converted regex
+     */
+    private function regexToApacheRegex($regex)
+    {
+        $regexPatternEnd = strrpos($regex, $regex[0]);
+
+        return preg_replace('/\?P<.+?>/', '', substr($regex, 1, $regexPatternEnd - 1));
+    }
+
+    /**
+     * Escapes a string.
+     *
+     * @param string $string The string to be escaped
+     * @param string $char   The character to be escaped
+     * @param string $with   The character to be used for escaping
+     *
+     * @return string The escaped string
+     */
+    private static function escape($string, $char, $with)
+    {
+        $escaped = false;
+        $output = '';
+        foreach (str_split($string) as $symbol) {
+            if ($escaped) {
+                $output .= $symbol;
+                $escaped = false;
+                continue;
+            }
+            if ($symbol === $char) {
+                $output .= $with.$char;
+                continue;
+            }
+            if ($symbol === $with) {
+                $escaped = true;
+            }
+            $output .= $symbol;
+        }
+
+        return $output;
+    }
+
+    /**
+     * Normalizes an array of values.
+     *
+     * @param array $values
+     *
+     * @return string[]
+     */
+    private function normalizeValues(array $values)
+    {
+        $normalizedValues = array();
+        foreach ($values as $key => $value) {
+            if (is_array($value)) {
+                foreach ($value as $index => $bit) {
+                    $normalizedValues[sprintf('%s[%s]', $key, $index)] = $bit;
+                }
+            } else {
+                $normalizedValues[$key] = (string) $value;
+            }
+        }
+
+        return $normalizedValues;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Matcher/Dumper/DumperCollection.php
@@ -0,0 +1,161 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Matcher\Dumper;
+
+/**
+ * Collection of routes.
+ *
+ * @author Arnaud Le Blanc <arnaud.lb@gmail.com>
+ *
+ * @internal
+ */
+class DumperCollection implements \IteratorAggregate
+{
+    /**
+     * @var DumperCollection|null
+     */
+    private $parent;
+
+    /**
+     * @var DumperCollection[]|DumperRoute[]
+     */
+    private $children = array();
+
+    /**
+     * @var array
+     */
+    private $attributes = array();
+
+    /**
+     * Returns the children routes and collections.
+     *
+     * @return DumperCollection[]|DumperRoute[] Array of DumperCollection|DumperRoute
+     */
+    public function all()
+    {
+        return $this->children;
+    }
+
+    /**
+     * Adds a route or collection.
+     *
+     * @param DumperRoute|DumperCollection The route or collection
+     */
+    public function add($child)
+    {
+        if ($child instanceof self) {
+            $child->setParent($this);
+        }
+        $this->children[] = $child;
+    }
+
+    /**
+     * Sets children.
+     *
+     * @param array $children The children
+     */
+    public function setAll(array $children)
+    {
+        foreach ($children as $child) {
+            if ($child instanceof self) {
+                $child->setParent($this);
+            }
+        }
+        $this->children = $children;
+    }
+
+    /**
+     * Returns an iterator over the children.
+     *
+     * @return \Iterator|DumperCollection[]|DumperRoute[] The iterator
+     */
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->children);
+    }
+
+    /**
+     * Returns the root of the collection.
+     *
+     * @return DumperCollection The root collection
+     */
+    public function getRoot()
+    {
+        return (null !== $this->parent) ? $this->parent->getRoot() : $this;
+    }
+
+    /**
+     * Returns the parent collection.
+     *
+     * @return DumperCollection|null The parent collection or null if the collection has no parent
+     */
+    protected function getParent()
+    {
+        return $this->parent;
+    }
+
+    /**
+     * Sets the parent collection.
+     *
+     * @param DumperCollection $parent The parent collection
+     */
+    protected function setParent(DumperCollection $parent)
+    {
+        $this->parent = $parent;
+    }
+
+    /**
+     * Returns true if the attribute is defined.
+     *
+     * @param string $name The attribute name
+     *
+     * @return bool true if the attribute is defined, false otherwise
+     */
+    public function hasAttribute($name)
+    {
+        return array_key_exists($name, $this->attributes);
+    }
+
+    /**
+     * Returns an attribute by name.
+     *
+     * @param string $name    The attribute name
+     * @param mixed  $default Default value is the attribute doesn't exist
+     *
+     * @return mixed The attribute value
+     */
+    public function getAttribute($name, $default = null)
+    {
+        return $this->hasAttribute($name) ? $this->attributes[$name] : $default;
+    }
+
+    /**
+     * Sets an attribute by name.
+     *
+     * @param string $name  The attribute name
+     * @param mixed  $value The attribute value
+     */
+    public function setAttribute($name, $value)
+    {
+        $this->attributes[$name] = $value;
+    }
+
+    /**
+     * Sets multiple attributes.
+     *
+     * @param array $attributes The attributes
+     */
+    public function setAttributes($attributes)
+    {
+        $this->attributes = $attributes;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Matcher/Dumper/DumperPrefixCollection.php
@@ -0,0 +1,107 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Matcher\Dumper;
+
+/**
+ * Prefix tree of routes preserving routes order.
+ *
+ * @author Arnaud Le Blanc <arnaud.lb@gmail.com>
+ *
+ * @internal
+ */
+class DumperPrefixCollection extends DumperCollection
+{
+    /**
+     * @var string
+     */
+    private $prefix = '';
+
+    /**
+     * Returns the prefix.
+     *
+     * @return string The prefix
+     */
+    public function getPrefix()
+    {
+        return $this->prefix;
+    }
+
+    /**
+     * Sets the prefix.
+     *
+     * @param string $prefix The prefix
+     */
+    public function setPrefix($prefix)
+    {
+        $this->prefix = $prefix;
+    }
+
+    /**
+     * Adds a route in the tree.
+     *
+     * @param DumperRoute $route The route
+     *
+     * @return DumperPrefixCollection The node the route was added to
+     *
+     * @throws \LogicException
+     */
+    public function addPrefixRoute(DumperRoute $route)
+    {
+        $prefix = $route->getRoute()->compile()->getStaticPrefix();
+
+        for ($collection = $this; null !== $collection; $collection = $collection->getParent()) {
+            // Same prefix, add to current leave
+            if ($collection->prefix === $prefix) {
+                $collection->add($route);
+
+                return $collection;
+            }
+
+            // Prefix starts with route's prefix
+            if ('' === $collection->prefix || 0 === strpos($prefix, $collection->prefix)) {
+                $child = new self();
+                $child->setPrefix(substr($prefix, 0, strlen($collection->prefix) + 1));
+                $collection->add($child);
+
+                return $child->addPrefixRoute($route);
+            }
+        }
+
+        // Reached only if the root has a non empty prefix
+        throw new \LogicException('The collection root must not have a prefix');
+    }
+
+    /**
+     * Merges nodes whose prefix ends with a slash.
+     *
+     * Children of a node whose prefix ends with a slash are moved to the parent node
+     */
+    public function mergeSlashNodes()
+    {
+        $children = array();
+
+        foreach ($this as $child) {
+            if ($child instanceof self) {
+                $child->mergeSlashNodes();
+                if ('/' === substr($child->prefix, -1)) {
+                    $children = array_merge($children, $child->all());
+                } else {
+                    $children[] = $child;
+                }
+            } else {
+                $children[] = $child;
+            }
+        }
+
+        $this->setAll($children);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Matcher/Dumper/DumperRoute.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Matcher\Dumper;
+
+use Symfony\Component\Routing\Route;
+
+/**
+ * Container for a Route.
+ *
+ * @author Arnaud Le Blanc <arnaud.lb@gmail.com>
+ *
+ * @internal
+ */
+class DumperRoute
+{
+    /**
+     * @var string
+     */
+    private $name;
+
+    /**
+     * @var Route
+     */
+    private $route;
+
+    /**
+     * Constructor.
+     *
+     * @param string $name  The route name
+     * @param Route  $route The route
+     */
+    public function __construct($name, Route $route)
+    {
+        $this->name = $name;
+        $this->route = $route;
+    }
+
+    /**
+     * Returns the route name.
+     *
+     * @return string The route name
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Returns the route.
+     *
+     * @return Route The route
+     */
+    public function getRoute()
+    {
+        return $this->route;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Matcher/Dumper/MatcherDumper.php
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Matcher\Dumper;
+
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * MatcherDumper is the abstract class for all built-in matcher dumpers.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class MatcherDumper implements MatcherDumperInterface
+{
+    /**
+     * @var RouteCollection
+     */
+    private $routes;
+
+    /**
+     * Constructor.
+     *
+     * @param RouteCollection $routes The RouteCollection to dump
+     */
+    public function __construct(RouteCollection $routes)
+    {
+        $this->routes = $routes;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getRoutes()
+    {
+        return $this->routes;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Matcher/Dumper/MatcherDumperInterface.php
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Matcher\Dumper;
+
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * MatcherDumperInterface is the interface that all matcher dumper classes must implement.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface MatcherDumperInterface
+{
+    /**
+     * Dumps a set of routes to a string representation of executable code
+     * that can then be used to match a request against these routes.
+     *
+     * @param array $options An array of options
+     *
+     * @return string Executable code
+     */
+    public function dump(array $options = array());
+
+    /**
+     * Gets the routes to dump.
+     *
+     * @return RouteCollection A RouteCollection instance
+     */
+    public function getRoutes();
+}
--- /dev/null
+++ b/vendor/symfony/routing/Matcher/Dumper/PhpMatcherDumper.php
@@ -0,0 +1,409 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Matcher\Dumper;
+
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
+use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
+
+/**
+ * PhpMatcherDumper creates a PHP class able to match URLs for a given set of routes.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Tobias Schultze <http://tobion.de>
+ * @author Arnaud Le Blanc <arnaud.lb@gmail.com>
+ */
+class PhpMatcherDumper extends MatcherDumper
+{
+    private $expressionLanguage;
+
+    /**
+     * @var ExpressionFunctionProviderInterface[]
+     */
+    private $expressionLanguageProviders = array();
+
+    /**
+     * Dumps a set of routes to a PHP class.
+     *
+     * Available options:
+     *
+     *  * class:      The class name
+     *  * base_class: The base class name
+     *
+     * @param array $options An array of options
+     *
+     * @return string A PHP class representing the matcher class
+     */
+    public function dump(array $options = array())
+    {
+        $options = array_replace(array(
+            'class' => 'ProjectUrlMatcher',
+            'base_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
+        ), $options);
+
+        // trailing slash support is only enabled if we know how to redirect the user
+        $interfaces = class_implements($options['base_class']);
+        $supportsRedirections = isset($interfaces['Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcherInterface']);
+
+        return <<<EOF
+<?php
+
+use Symfony\Component\Routing\Exception\MethodNotAllowedException;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use Symfony\Component\Routing\RequestContext;
+
+/**
+ * {$options['class']}.
+ *
+ * This class has been auto-generated
+ * by the Symfony Routing Component.
+ */
+class {$options['class']} extends {$options['base_class']}
+{
+    /**
+     * Constructor.
+     */
+    public function __construct(RequestContext \$context)
+    {
+        \$this->context = \$context;
+    }
+
+{$this->generateMatchMethod($supportsRedirections)}
+}
+
+EOF;
+    }
+
+    public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider)
+    {
+        $this->expressionLanguageProviders[] = $provider;
+    }
+
+    /**
+     * Generates the code for the match method implementing UrlMatcherInterface.
+     *
+     * @param bool $supportsRedirections Whether redirections are supported by the base class
+     *
+     * @return string Match method as PHP code
+     */
+    private function generateMatchMethod($supportsRedirections)
+    {
+        $code = rtrim($this->compileRoutes($this->getRoutes(), $supportsRedirections), "\n");
+
+        return <<<EOF
+    public function match(\$pathinfo)
+    {
+        \$allow = array();
+        \$pathinfo = rawurldecode(\$pathinfo);
+        \$context = \$this->context;
+        \$request = \$this->request;
+
+$code
+
+        throw 0 < count(\$allow) ? new MethodNotAllowedException(array_unique(\$allow)) : new ResourceNotFoundException();
+    }
+EOF;
+    }
+
+    /**
+     * Generates PHP code to match a RouteCollection with all its routes.
+     *
+     * @param RouteCollection $routes               A RouteCollection instance
+     * @param bool            $supportsRedirections Whether redirections are supported by the base class
+     *
+     * @return string PHP code
+     */
+    private function compileRoutes(RouteCollection $routes, $supportsRedirections)
+    {
+        $fetchedHost = false;
+
+        $groups = $this->groupRoutesByHostRegex($routes);
+        $code = '';
+
+        foreach ($groups as $collection) {
+            if (null !== $regex = $collection->getAttribute('host_regex')) {
+                if (!$fetchedHost) {
+                    $code .= "        \$host = \$this->context->getHost();\n\n";
+                    $fetchedHost = true;
+                }
+
+                $code .= sprintf("        if (preg_match(%s, \$host, \$hostMatches)) {\n", var_export($regex, true));
+            }
+
+            $tree = $this->buildPrefixTree($collection);
+            $groupCode = $this->compilePrefixRoutes($tree, $supportsRedirections);
+
+            if (null !== $regex) {
+                // apply extra indention at each line (except empty ones)
+                $groupCode = preg_replace('/^.{2,}$/m', '    $0', $groupCode);
+                $code .= $groupCode;
+                $code .= "        }\n\n";
+            } else {
+                $code .= $groupCode;
+            }
+        }
+
+        return $code;
+    }
+
+    /**
+     * Generates PHP code recursively to match a tree of routes.
+     *
+     * @param DumperPrefixCollection $collection           A DumperPrefixCollection instance
+     * @param bool                   $supportsRedirections Whether redirections are supported by the base class
+     * @param string                 $parentPrefix         Prefix of the parent collection
+     *
+     * @return string PHP code
+     */
+    private function compilePrefixRoutes(DumperPrefixCollection $collection, $supportsRedirections, $parentPrefix = '')
+    {
+        $code = '';
+        $prefix = $collection->getPrefix();
+        $optimizable = 1 < strlen($prefix) && 1 < count($collection->all());
+        $optimizedPrefix = $parentPrefix;
+
+        if ($optimizable) {
+            $optimizedPrefix = $prefix;
+
+            $code .= sprintf("    if (0 === strpos(\$pathinfo, %s)) {\n", var_export($prefix, true));
+        }
+
+        foreach ($collection as $route) {
+            if ($route instanceof DumperCollection) {
+                $code .= $this->compilePrefixRoutes($route, $supportsRedirections, $optimizedPrefix);
+            } else {
+                $code .= $this->compileRoute($route->getRoute(), $route->getName(), $supportsRedirections, $optimizedPrefix)."\n";
+            }
+        }
+
+        if ($optimizable) {
+            $code .= "    }\n\n";
+            // apply extra indention at each line (except empty ones)
+            $code = preg_replace('/^.{2,}$/m', '    $0', $code);
+        }
+
+        return $code;
+    }
+
+    /**
+     * Compiles a single Route to PHP code used to match it against the path info.
+     *
+     * @param Route       $route                A Route instance
+     * @param string      $name                 The name of the Route
+     * @param bool        $supportsRedirections Whether redirections are supported by the base class
+     * @param string|null $parentPrefix         The prefix of the parent collection used to optimize the code
+     *
+     * @return string PHP code
+     *
+     * @throws \LogicException
+     */
+    private function compileRoute(Route $route, $name, $supportsRedirections, $parentPrefix = null)
+    {
+        $code = '';
+        $compiledRoute = $route->compile();
+        $conditions = array();
+        $hasTrailingSlash = false;
+        $matches = false;
+        $hostMatches = false;
+        $methods = $route->getMethods();
+
+        // GET and HEAD are equivalent
+        if (in_array('GET', $methods) && !in_array('HEAD', $methods)) {
+            $methods[] = 'HEAD';
+        }
+
+        $supportsTrailingSlash = $supportsRedirections && (!$methods || in_array('HEAD', $methods));
+
+        if (!count($compiledRoute->getPathVariables()) && false !== preg_match('#^(.)\^(?P<url>.*?)\$\1#', $compiledRoute->getRegex(), $m)) {
+            if ($supportsTrailingSlash && substr($m['url'], -1) === '/') {
+                $conditions[] = sprintf("rtrim(\$pathinfo, '/') === %s", var_export(rtrim(str_replace('\\', '', $m['url']), '/'), true));
+                $hasTrailingSlash = true;
+            } else {
+                $conditions[] = sprintf('$pathinfo === %s', var_export(str_replace('\\', '', $m['url']), true));
+            }
+        } else {
+            if ($compiledRoute->getStaticPrefix() && $compiledRoute->getStaticPrefix() !== $parentPrefix) {
+                $conditions[] = sprintf('0 === strpos($pathinfo, %s)', var_export($compiledRoute->getStaticPrefix(), true));
+            }
+
+            $regex = $compiledRoute->getRegex();
+            if ($supportsTrailingSlash && $pos = strpos($regex, '/$')) {
+                $regex = substr($regex, 0, $pos).'/?$'.substr($regex, $pos + 2);
+                $hasTrailingSlash = true;
+            }
+            $conditions[] = sprintf('preg_match(%s, $pathinfo, $matches)', var_export($regex, true));
+
+            $matches = true;
+        }
+
+        if ($compiledRoute->getHostVariables()) {
+            $hostMatches = true;
+        }
+
+        if ($route->getCondition()) {
+            $conditions[] = $this->getExpressionLanguage()->compile($route->getCondition(), array('context', 'request'));
+        }
+
+        $conditions = implode(' && ', $conditions);
+
+        $code .= <<<EOF
+        // $name
+        if ($conditions) {
+
+EOF;
+
+        $gotoname = 'not_'.preg_replace('/[^A-Za-z0-9_]/', '', $name);
+        if ($methods) {
+            if (1 === count($methods)) {
+                $code .= <<<EOF
+            if (\$this->context->getMethod() != '$methods[0]') {
+                \$allow[] = '$methods[0]';
+                goto $gotoname;
+            }
+
+
+EOF;
+            } else {
+                $methods = implode("', '", $methods);
+                $code .= <<<EOF
+            if (!in_array(\$this->context->getMethod(), array('$methods'))) {
+                \$allow = array_merge(\$allow, array('$methods'));
+                goto $gotoname;
+            }
+
+
+EOF;
+            }
+        }
+
+        if ($hasTrailingSlash) {
+            $code .= <<<EOF
+            if (substr(\$pathinfo, -1) !== '/') {
+                return \$this->redirect(\$pathinfo.'/', '$name');
+            }
+
+
+EOF;
+        }
+
+        if ($schemes = $route->getSchemes()) {
+            if (!$supportsRedirections) {
+                throw new \LogicException('The "schemes" requirement is only supported for URL matchers that implement RedirectableUrlMatcherInterface.');
+            }
+            $schemes = str_replace("\n", '', var_export(array_flip($schemes), true));
+            $code .= <<<EOF
+            \$requiredSchemes = $schemes;
+            if (!isset(\$requiredSchemes[\$this->context->getScheme()])) {
+                return \$this->redirect(\$pathinfo, '$name', key(\$requiredSchemes));
+            }
+
+
+EOF;
+        }
+
+        // optimize parameters array
+        if ($matches || $hostMatches) {
+            $vars = array();
+            if ($hostMatches) {
+                $vars[] = '$hostMatches';
+            }
+            if ($matches) {
+                $vars[] = '$matches';
+            }
+            $vars[] = "array('_route' => '$name')";
+
+            $code .= sprintf(
+                "            return \$this->mergeDefaults(array_replace(%s), %s);\n",
+                implode(', ', $vars),
+                str_replace("\n", '', var_export($route->getDefaults(), true))
+            );
+        } elseif ($route->getDefaults()) {
+            $code .= sprintf("            return %s;\n", str_replace("\n", '', var_export(array_replace($route->getDefaults(), array('_route' => $name)), true)));
+        } else {
+            $code .= sprintf("            return array('_route' => '%s');\n", $name);
+        }
+        $code .= "        }\n";
+
+        if ($methods) {
+            $code .= "        $gotoname:\n";
+        }
+
+        return $code;
+    }
+
+    /**
+     * Groups consecutive routes having the same host regex.
+     *
+     * The result is a collection of collections of routes having the same host regex.
+     *
+     * @param RouteCollection $routes A flat RouteCollection
+     *
+     * @return DumperCollection A collection with routes grouped by host regex in sub-collections
+     */
+    private function groupRoutesByHostRegex(RouteCollection $routes)
+    {
+        $groups = new DumperCollection();
+
+        $currentGroup = new DumperCollection();
+        $currentGroup->setAttribute('host_regex', null);
+        $groups->add($currentGroup);
+
+        foreach ($routes as $name => $route) {
+            $hostRegex = $route->compile()->getHostRegex();
+            if ($currentGroup->getAttribute('host_regex') !== $hostRegex) {
+                $currentGroup = new DumperCollection();
+                $currentGroup->setAttribute('host_regex', $hostRegex);
+                $groups->add($currentGroup);
+            }
+            $currentGroup->add(new DumperRoute($name, $route));
+        }
+
+        return $groups;
+    }
+
+    /**
+     * Organizes the routes into a prefix tree.
+     *
+     * Routes order is preserved such that traversing the tree will traverse the
+     * routes in the origin order.
+     *
+     * @param DumperCollection $collection A collection of routes
+     *
+     * @return DumperPrefixCollection
+     */
+    private function buildPrefixTree(DumperCollection $collection)
+    {
+        $tree = new DumperPrefixCollection();
+        $current = $tree;
+
+        foreach ($collection as $route) {
+            $current = $current->addPrefixRoute($route);
+        }
+
+        $tree->mergeSlashNodes();
+
+        return $tree;
+    }
+
+    private function getExpressionLanguage()
+    {
+        if (null === $this->expressionLanguage) {
+            if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) {
+                throw new \RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.');
+            }
+            $this->expressionLanguage = new ExpressionLanguage(null, $this->expressionLanguageProviders);
+        }
+
+        return $this->expressionLanguage;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Matcher/RedirectableUrlMatcher.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Matcher;
+
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use Symfony\Component\Routing\Route;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class RedirectableUrlMatcher extends UrlMatcher implements RedirectableUrlMatcherInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function match($pathinfo)
+    {
+        try {
+            $parameters = parent::match($pathinfo);
+        } catch (ResourceNotFoundException $e) {
+            if ('/' === substr($pathinfo, -1) || !in_array($this->context->getMethod(), array('HEAD', 'GET'))) {
+                throw $e;
+            }
+
+            try {
+                parent::match($pathinfo.'/');
+
+                return $this->redirect($pathinfo.'/', null);
+            } catch (ResourceNotFoundException $e2) {
+                throw $e;
+            }
+        }
+
+        return $parameters;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function handleRouteRequirements($pathinfo, $name, Route $route)
+    {
+        // expression condition
+        if ($route->getCondition() && !$this->getExpressionLanguage()->evaluate($route->getCondition(), array('context' => $this->context, 'request' => $this->request))) {
+            return array(self::REQUIREMENT_MISMATCH, null);
+        }
+
+        // check HTTP scheme requirement
+        $scheme = $this->context->getScheme();
+        $schemes = $route->getSchemes();
+        if ($schemes && !$route->hasScheme($scheme)) {
+            return array(self::ROUTE_MATCH, $this->redirect($pathinfo, $name, current($schemes)));
+        }
+
+        return array(self::REQUIREMENT_MATCH, null);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Matcher/RedirectableUrlMatcherInterface.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Matcher;
+
+/**
+ * RedirectableUrlMatcherInterface knows how to redirect the user.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface RedirectableUrlMatcherInterface
+{
+    /**
+     * Redirects the user to another URL.
+     *
+     * @param string      $path   The path info to redirect to
+     * @param string      $route  The route name that matched
+     * @param string|null $scheme The URL scheme (null to keep the current one)
+     *
+     * @return array An array of parameters
+     */
+    public function redirect($path, $route, $scheme = null);
+}
--- /dev/null
+++ b/vendor/symfony/routing/Matcher/RequestMatcherInterface.php
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Matcher;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use Symfony\Component\Routing\Exception\MethodNotAllowedException;
+
+/**
+ * RequestMatcherInterface is the interface that all request matcher classes must implement.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface RequestMatcherInterface
+{
+    /**
+     * Tries to match a request with a set of routes.
+     *
+     * If the matcher can not find information, it must throw one of the exceptions documented
+     * below.
+     *
+     * @param Request $request The request to match
+     *
+     * @return array An array of parameters
+     *
+     * @throws ResourceNotFoundException If no matching resource could be found
+     * @throws MethodNotAllowedException If a matching resource was found but the request method is not allowed
+     */
+    public function matchRequest(Request $request);
+}
--- /dev/null
+++ b/vendor/symfony/routing/Matcher/TraceableUrlMatcher.php
@@ -0,0 +1,141 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Matcher;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Exception\ExceptionInterface;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * TraceableUrlMatcher helps debug path info matching by tracing the match.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TraceableUrlMatcher extends UrlMatcher
+{
+    const ROUTE_DOES_NOT_MATCH = 0;
+    const ROUTE_ALMOST_MATCHES = 1;
+    const ROUTE_MATCHES = 2;
+
+    protected $traces;
+
+    public function getTraces($pathinfo)
+    {
+        $this->traces = array();
+
+        try {
+            $this->match($pathinfo);
+        } catch (ExceptionInterface $e) {
+        }
+
+        return $this->traces;
+    }
+
+    public function getTracesForRequest(Request $request)
+    {
+        $this->request = $request;
+        $traces = $this->getTraces($request->getPathInfo());
+        $this->request = null;
+
+        return $traces;
+    }
+
+    protected function matchCollection($pathinfo, RouteCollection $routes)
+    {
+        foreach ($routes as $name => $route) {
+            $compiledRoute = $route->compile();
+
+            if (!preg_match($compiledRoute->getRegex(), $pathinfo, $matches)) {
+                // does it match without any requirements?
+                $r = new Route($route->getPath(), $route->getDefaults(), array(), $route->getOptions());
+                $cr = $r->compile();
+                if (!preg_match($cr->getRegex(), $pathinfo)) {
+                    $this->addTrace(sprintf('Path "%s" does not match', $route->getPath()), self::ROUTE_DOES_NOT_MATCH, $name, $route);
+
+                    continue;
+                }
+
+                foreach ($route->getRequirements() as $n => $regex) {
+                    $r = new Route($route->getPath(), $route->getDefaults(), array($n => $regex), $route->getOptions());
+                    $cr = $r->compile();
+
+                    if (in_array($n, $cr->getVariables()) && !preg_match($cr->getRegex(), $pathinfo)) {
+                        $this->addTrace(sprintf('Requirement for "%s" does not match (%s)', $n, $regex), self::ROUTE_ALMOST_MATCHES, $name, $route);
+
+                        continue 2;
+                    }
+                }
+
+                continue;
+            }
+
+            // check host requirement
+            $hostMatches = array();
+            if ($compiledRoute->getHostRegex() && !preg_match($compiledRoute->getHostRegex(), $this->context->getHost(), $hostMatches)) {
+                $this->addTrace(sprintf('Host "%s" does not match the requirement ("%s")', $this->context->getHost(), $route->getHost()), self::ROUTE_ALMOST_MATCHES, $name, $route);
+
+                continue;
+            }
+
+            // check HTTP method requirement
+            if ($requiredMethods = $route->getMethods()) {
+                // HEAD and GET are equivalent as per RFC
+                if ('HEAD' === $method = $this->context->getMethod()) {
+                    $method = 'GET';
+                }
+
+                if (!in_array($method, $requiredMethods)) {
+                    $this->allow = array_merge($this->allow, $requiredMethods);
+
+                    $this->addTrace(sprintf('Method "%s" does not match any of the required methods (%s)', $this->context->getMethod(), implode(', ', $requiredMethods)), self::ROUTE_ALMOST_MATCHES, $name, $route);
+
+                    continue;
+                }
+            }
+
+            // check condition
+            if ($condition = $route->getCondition()) {
+                if (!$this->getExpressionLanguage()->evaluate($condition, array('context' => $this->context, 'request' => $this->request))) {
+                    $this->addTrace(sprintf('Condition "%s" does not evaluate to "true"', $condition), self::ROUTE_ALMOST_MATCHES, $name, $route);
+
+                    continue;
+                }
+            }
+
+            // check HTTP scheme requirement
+            if ($requiredSchemes = $route->getSchemes()) {
+                $scheme = $this->context->getScheme();
+
+                if (!$route->hasScheme($scheme)) {
+                    $this->addTrace(sprintf('Scheme "%s" does not match any of the required schemes (%s); the user will be redirected to first required scheme', $scheme, implode(', ', $requiredSchemes)), self::ROUTE_ALMOST_MATCHES, $name, $route);
+
+                    return true;
+                }
+            }
+
+            $this->addTrace('Route matches!', self::ROUTE_MATCHES, $name, $route);
+
+            return true;
+        }
+    }
+
+    private function addTrace($log, $level = self::ROUTE_DOES_NOT_MATCH, $name = null, $route = null)
+    {
+        $this->traces[] = array(
+            'log' => $log,
+            'name' => $name,
+            'level' => $level,
+            'path' => null !== $route ? $route->getPath() : null,
+        );
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Matcher/UrlMatcher.php
@@ -0,0 +1,251 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Matcher;
+
+use Symfony\Component\Routing\Exception\MethodNotAllowedException;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\RequestContext;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
+use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
+
+/**
+ * UrlMatcher matches URL based on a set of routes.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface
+{
+    const REQUIREMENT_MATCH = 0;
+    const REQUIREMENT_MISMATCH = 1;
+    const ROUTE_MATCH = 2;
+
+    /**
+     * @var RequestContext
+     */
+    protected $context;
+
+    /**
+     * @var array
+     */
+    protected $allow = array();
+
+    /**
+     * @var RouteCollection
+     */
+    protected $routes;
+
+    protected $request;
+    protected $expressionLanguage;
+
+    /**
+     * @var ExpressionFunctionProviderInterface[]
+     */
+    protected $expressionLanguageProviders = array();
+
+    /**
+     * Constructor.
+     *
+     * @param RouteCollection $routes  A RouteCollection instance
+     * @param RequestContext  $context The context
+     */
+    public function __construct(RouteCollection $routes, RequestContext $context)
+    {
+        $this->routes = $routes;
+        $this->context = $context;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setContext(RequestContext $context)
+    {
+        $this->context = $context;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getContext()
+    {
+        return $this->context;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function match($pathinfo)
+    {
+        $this->allow = array();
+
+        if ($ret = $this->matchCollection(rawurldecode($pathinfo), $this->routes)) {
+            return $ret;
+        }
+
+        throw 0 < count($this->allow)
+            ? new MethodNotAllowedException(array_unique($this->allow))
+            : new ResourceNotFoundException(sprintf('No routes found for "%s".', $pathinfo));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function matchRequest(Request $request)
+    {
+        $this->request = $request;
+
+        $ret = $this->match($request->getPathInfo());
+
+        $this->request = null;
+
+        return $ret;
+    }
+
+    public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider)
+    {
+        $this->expressionLanguageProviders[] = $provider;
+    }
+
+    /**
+     * Tries to match a URL with a set of routes.
+     *
+     * @param string          $pathinfo The path info to be parsed
+     * @param RouteCollection $routes   The set of routes
+     *
+     * @return array An array of parameters
+     *
+     * @throws ResourceNotFoundException If the resource could not be found
+     * @throws MethodNotAllowedException If the resource was found but the request method is not allowed
+     */
+    protected function matchCollection($pathinfo, RouteCollection $routes)
+    {
+        foreach ($routes as $name => $route) {
+            $compiledRoute = $route->compile();
+
+            // check the static prefix of the URL first. Only use the more expensive preg_match when it matches
+            if ('' !== $compiledRoute->getStaticPrefix() && 0 !== strpos($pathinfo, $compiledRoute->getStaticPrefix())) {
+                continue;
+            }
+
+            if (!preg_match($compiledRoute->getRegex(), $pathinfo, $matches)) {
+                continue;
+            }
+
+            $hostMatches = array();
+            if ($compiledRoute->getHostRegex() && !preg_match($compiledRoute->getHostRegex(), $this->context->getHost(), $hostMatches)) {
+                continue;
+            }
+
+            // check HTTP method requirement
+            if ($requiredMethods = $route->getMethods()) {
+                // HEAD and GET are equivalent as per RFC
+                if ('HEAD' === $method = $this->context->getMethod()) {
+                    $method = 'GET';
+                }
+
+                if (!in_array($method, $requiredMethods)) {
+                    $this->allow = array_merge($this->allow, $requiredMethods);
+
+                    continue;
+                }
+            }
+
+            $status = $this->handleRouteRequirements($pathinfo, $name, $route);
+
+            if (self::ROUTE_MATCH === $status[0]) {
+                return $status[1];
+            }
+
+            if (self::REQUIREMENT_MISMATCH === $status[0]) {
+                continue;
+            }
+
+            return $this->getAttributes($route, $name, array_replace($matches, $hostMatches));
+        }
+    }
+
+    /**
+     * Returns an array of values to use as request attributes.
+     *
+     * As this method requires the Route object, it is not available
+     * in matchers that do not have access to the matched Route instance
+     * (like the PHP and Apache matcher dumpers).
+     *
+     * @param Route  $route      The route we are matching against
+     * @param string $name       The name of the route
+     * @param array  $attributes An array of attributes from the matcher
+     *
+     * @return array An array of parameters
+     */
+    protected function getAttributes(Route $route, $name, array $attributes)
+    {
+        $attributes['_route'] = $name;
+
+        return $this->mergeDefaults($attributes, $route->getDefaults());
+    }
+
+    /**
+     * Handles specific route requirements.
+     *
+     * @param string $pathinfo The path
+     * @param string $name     The route name
+     * @param Route  $route    The route
+     *
+     * @return array The first element represents the status, the second contains additional information
+     */
+    protected function handleRouteRequirements($pathinfo, $name, Route $route)
+    {
+        // expression condition
+        if ($route->getCondition() && !$this->getExpressionLanguage()->evaluate($route->getCondition(), array('context' => $this->context, 'request' => $this->request))) {
+            return array(self::REQUIREMENT_MISMATCH, null);
+        }
+
+        // check HTTP scheme requirement
+        $scheme = $this->context->getScheme();
+        $status = $route->getSchemes() && !$route->hasScheme($scheme) ? self::REQUIREMENT_MISMATCH : self::REQUIREMENT_MATCH;
+
+        return array($status, null);
+    }
+
+    /**
+     * Get merged default parameters.
+     *
+     * @param array $params   The parameters
+     * @param array $defaults The defaults
+     *
+     * @return array Merged default parameters
+     */
+    protected function mergeDefaults($params, $defaults)
+    {
+        foreach ($params as $key => $value) {
+            if (!is_int($key)) {
+                $defaults[$key] = $value;
+            }
+        }
+
+        return $defaults;
+    }
+
+    protected function getExpressionLanguage()
+    {
+        if (null === $this->expressionLanguage) {
+            if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) {
+                throw new \RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.');
+            }
+            $this->expressionLanguage = new ExpressionLanguage(null, $this->expressionLanguageProviders);
+        }
+
+        return $this->expressionLanguage;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/Matcher/UrlMatcherInterface.php
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Matcher;
+
+use Symfony\Component\Routing\RequestContextAwareInterface;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use Symfony\Component\Routing\Exception\MethodNotAllowedException;
+
+/**
+ * UrlMatcherInterface is the interface that all URL matcher classes must implement.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface UrlMatcherInterface extends RequestContextAwareInterface
+{
+    /**
+     * Tries to match a URL path with a set of routes.
+     *
+     * If the matcher can not find information, it must throw one of the exceptions documented
+     * below.
+     *
+     * @param string $pathinfo The path info to be parsed (raw format, i.e. not urldecoded)
+     *
+     * @return array An array of parameters
+     *
+     * @throws ResourceNotFoundException If the resource could not be found
+     * @throws MethodNotAllowedException If the resource was found but the request method is not allowed
+     */
+    public function match($pathinfo);
+}
--- /dev/null
+++ b/vendor/symfony/routing/RequestContext.php
@@ -0,0 +1,344 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing;
+
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Holds information about the current request.
+ *
+ * This class implements a fluent interface.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Tobias Schultze <http://tobion.de>
+ */
+class RequestContext
+{
+    private $baseUrl;
+    private $pathInfo;
+    private $method;
+    private $host;
+    private $scheme;
+    private $httpPort;
+    private $httpsPort;
+    private $queryString;
+
+    /**
+     * @var array
+     */
+    private $parameters = array();
+
+    /**
+     * Constructor.
+     *
+     * @param string $baseUrl     The base URL
+     * @param string $method      The HTTP method
+     * @param string $host        The HTTP host name
+     * @param string $scheme      The HTTP scheme
+     * @param int    $httpPort    The HTTP port
+     * @param int    $httpsPort   The HTTPS port
+     * @param string $path        The path
+     * @param string $queryString The query string
+     */
+    public function __construct($baseUrl = '', $method = 'GET', $host = 'localhost', $scheme = 'http', $httpPort = 80, $httpsPort = 443, $path = '/', $queryString = '')
+    {
+        $this->setBaseUrl($baseUrl);
+        $this->setMethod($method);
+        $this->setHost($host);
+        $this->setScheme($scheme);
+        $this->setHttpPort($httpPort);
+        $this->setHttpsPort($httpsPort);
+        $this->setPathInfo($path);
+        $this->setQueryString($queryString);
+    }
+
+    /**
+     * Updates the RequestContext information based on a HttpFoundation Request.
+     *
+     * @param Request $request A Request instance
+     *
+     * @return RequestContext The current instance, implementing a fluent interface
+     */
+    public function fromRequest(Request $request)
+    {
+        $this->setBaseUrl($request->getBaseUrl());
+        $this->setPathInfo($request->getPathInfo());
+        $this->setMethod($request->getMethod());
+        $this->setHost($request->getHost());
+        $this->setScheme($request->getScheme());
+        $this->setHttpPort($request->isSecure() ? $this->httpPort : $request->getPort());
+        $this->setHttpsPort($request->isSecure() ? $request->getPort() : $this->httpsPort);
+        $this->setQueryString($request->server->get('QUERY_STRING', ''));
+
+        return $this;
+    }
+
+    /**
+     * Gets the base URL.
+     *
+     * @return string The base URL
+     */
+    public function getBaseUrl()
+    {
+        return $this->baseUrl;
+    }
+
+    /**
+     * Sets the base URL.
+     *
+     * @param string $baseUrl The base URL
+     *
+     * @return RequestContext The current instance, implementing a fluent interface
+     */
+    public function setBaseUrl($baseUrl)
+    {
+        $this->baseUrl = $baseUrl;
+
+        return $this;
+    }
+
+    /**
+     * Gets the path info.
+     *
+     * @return string The path info
+     */
+    public function getPathInfo()
+    {
+        return $this->pathInfo;
+    }
+
+    /**
+     * Sets the path info.
+     *
+     * @param string $pathInfo The path info
+     *
+     * @return RequestContext The current instance, implementing a fluent interface
+     */
+    public function setPathInfo($pathInfo)
+    {
+        $this->pathInfo = $pathInfo;
+
+        return $this;
+    }
+
+    /**
+     * Gets the HTTP method.
+     *
+     * The method is always an uppercased string.
+     *
+     * @return string The HTTP method
+     */
+    public function getMethod()
+    {
+        return $this->method;
+    }
+
+    /**
+     * Sets the HTTP method.
+     *
+     * @param string $method The HTTP method
+     *
+     * @return RequestContext The current instance, implementing a fluent interface
+     */
+    public function setMethod($method)
+    {
+        $this->method = strtoupper($method);
+
+        return $this;
+    }
+
+    /**
+     * Gets the HTTP host.
+     *
+     * The host is always lowercased because it must be treated case-insensitive.
+     *
+     * @return string The HTTP host
+     */
+    public function getHost()
+    {
+        return $this->host;
+    }
+
+    /**
+     * Sets the HTTP host.
+     *
+     * @param string $host The HTTP host
+     *
+     * @return RequestContext The current instance, implementing a fluent interface
+     */
+    public function setHost($host)
+    {
+        $this->host = strtolower($host);
+
+        return $this;
+    }
+
+    /**
+     * Gets the HTTP scheme.
+     *
+     * @return string The HTTP scheme
+     */
+    public function getScheme()
+    {
+        return $this->scheme;
+    }
+
+    /**
+     * Sets the HTTP scheme.
+     *
+     * @param string $scheme The HTTP scheme
+     *
+     * @return RequestContext The current instance, implementing a fluent interface
+     */
+    public function setScheme($scheme)
+    {
+        $this->scheme = strtolower($scheme);
+
+        return $this;
+    }
+
+    /**
+     * Gets the HTTP port.
+     *
+     * @return int The HTTP port
+     */
+    public function getHttpPort()
+    {
+        return $this->httpPort;
+    }
+
+    /**
+     * Sets the HTTP port.
+     *
+     * @param int $httpPort The HTTP port
+     *
+     * @return RequestContext The current instance, implementing a fluent interface
+     */
+    public function setHttpPort($httpPort)
+    {
+        $this->httpPort = (int) $httpPort;
+
+        return $this;
+    }
+
+    /**
+     * Gets the HTTPS port.
+     *
+     * @return int The HTTPS port
+     */
+    public function getHttpsPort()
+    {
+        return $this->httpsPort;
+    }
+
+    /**
+     * Sets the HTTPS port.
+     *
+     * @param int $httpsPort The HTTPS port
+     *
+     * @return RequestContext The current instance, implementing a fluent interface
+     */
+    public function setHttpsPort($httpsPort)
+    {
+        $this->httpsPort = (int) $httpsPort;
+
+        return $this;
+    }
+
+    /**
+     * Gets the query string.
+     *
+     * @return string The query string without the "?"
+     */
+    public function getQueryString()
+    {
+        return $this->queryString;
+    }
+
+    /**
+     * Sets the query string.
+     *
+     * @param string $queryString The query string (after "?")
+     *
+     * @return RequestContext The current instance, implementing a fluent interface
+     */
+    public function setQueryString($queryString)
+    {
+        // string cast to be fault-tolerant, accepting null
+        $this->queryString = (string) $queryString;
+
+        return $this;
+    }
+
+    /**
+     * Returns the parameters.
+     *
+     * @return array The parameters
+     */
+    public function getParameters()
+    {
+        return $this->parameters;
+    }
+
+    /**
+     * Sets the parameters.
+     *
+     * @param array $parameters The parameters
+     *
+     * @return RequestContext The current instance, implementing a fluent interface
+     */
+    public function setParameters(array $parameters)
+    {
+        $this->parameters = $parameters;
+
+        return $this;
+    }
+
+    /**
+     * Gets a parameter value.
+     *
+     * @param string $name A parameter name
+     *
+     * @return mixed The parameter value or null if nonexistent
+     */
+    public function getParameter($name)
+    {
+        return isset($this->parameters[$name]) ? $this->parameters[$name] : null;
+    }
+
+    /**
+     * Checks if a parameter value is set for the given parameter.
+     *
+     * @param string $name A parameter name
+     *
+     * @return bool True if the parameter value is set, false otherwise
+     */
+    public function hasParameter($name)
+    {
+        return array_key_exists($name, $this->parameters);
+    }
+
+    /**
+     * Sets a parameter value.
+     *
+     * @param string $name      A parameter name
+     * @param mixed  $parameter The parameter value
+     *
+     * @return RequestContext The current instance, implementing a fluent interface
+     */
+    public function setParameter($name, $parameter)
+    {
+        $this->parameters[$name] = $parameter;
+
+        return $this;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/RequestContextAwareInterface.php
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing;
+
+interface RequestContextAwareInterface
+{
+    /**
+     * Sets the request context.
+     *
+     * @param RequestContext $context The context
+     */
+    public function setContext(RequestContext $context);
+
+    /**
+     * Gets the request context.
+     *
+     * @return RequestContext The context
+     */
+    public function getContext();
+}
--- /dev/null
+++ b/vendor/symfony/routing/Route.php
@@ -0,0 +1,659 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing;
+
+/**
+ * A Route describes a route and its parameters.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Tobias Schultze <http://tobion.de>
+ */
+class Route implements \Serializable
+{
+    /**
+     * @var string
+     */
+    private $path = '/';
+
+    /**
+     * @var string
+     */
+    private $host = '';
+
+    /**
+     * @var array
+     */
+    private $schemes = array();
+
+    /**
+     * @var array
+     */
+    private $methods = array();
+
+    /**
+     * @var array
+     */
+    private $defaults = array();
+
+    /**
+     * @var array
+     */
+    private $requirements = array();
+
+    /**
+     * @var array
+     */
+    private $options = array();
+
+    /**
+     * @var null|CompiledRoute
+     */
+    private $compiled;
+
+    /**
+     * @var string
+     */
+    private $condition = '';
+
+    /**
+     * Constructor.
+     *
+     * Available options:
+     *
+     *  * compiler_class: A class name able to compile this route instance (RouteCompiler by default)
+     *
+     * @param string       $path         The path pattern to match
+     * @param array        $defaults     An array of default parameter values
+     * @param array        $requirements An array of requirements for parameters (regexes)
+     * @param array        $options      An array of options
+     * @param string       $host         The host pattern to match
+     * @param string|array $schemes      A required URI scheme or an array of restricted schemes
+     * @param string|array $methods      A required HTTP method or an array of restricted methods
+     * @param string       $condition    A condition that should evaluate to true for the route to match
+     */
+    public function __construct($path, array $defaults = array(), array $requirements = array(), array $options = array(), $host = '', $schemes = array(), $methods = array(), $condition = '')
+    {
+        $this->setPath($path);
+        $this->setDefaults($defaults);
+        $this->setRequirements($requirements);
+        $this->setOptions($options);
+        $this->setHost($host);
+        // The conditions make sure that an initial empty $schemes/$methods does not override the corresponding requirement.
+        // They can be removed when the BC layer is removed.
+        if ($schemes) {
+            $this->setSchemes($schemes);
+        }
+        if ($methods) {
+            $this->setMethods($methods);
+        }
+        $this->setCondition($condition);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function serialize()
+    {
+        return serialize(array(
+            'path' => $this->path,
+            'host' => $this->host,
+            'defaults' => $this->defaults,
+            'requirements' => $this->requirements,
+            'options' => $this->options,
+            'schemes' => $this->schemes,
+            'methods' => $this->methods,
+            'condition' => $this->condition,
+            'compiled' => $this->compiled,
+        ));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function unserialize($serialized)
+    {
+        $data = unserialize($serialized);
+        $this->path = $data['path'];
+        $this->host = $data['host'];
+        $this->defaults = $data['defaults'];
+        $this->requirements = $data['requirements'];
+        $this->options = $data['options'];
+        $this->schemes = $data['schemes'];
+        $this->methods = $data['methods'];
+
+        if (isset($data['condition'])) {
+            $this->condition = $data['condition'];
+        }
+        if (isset($data['compiled'])) {
+            $this->compiled = $data['compiled'];
+        }
+    }
+
+    /**
+     * Returns the pattern for the path.
+     *
+     * @return string The pattern
+     *
+     * @deprecated since version 2.2, to be removed in 3.0. Use getPath instead.
+     */
+    public function getPattern()
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.2 and will be removed in 3.0. Use the getPath() method instead.', E_USER_DEPRECATED);
+
+        return $this->path;
+    }
+
+    /**
+     * Sets the pattern for the path.
+     *
+     * This method implements a fluent interface.
+     *
+     * @param string $pattern The path pattern
+     *
+     * @return Route The current Route instance
+     *
+     * @deprecated since version 2.2, to be removed in 3.0. Use setPath instead.
+     */
+    public function setPattern($pattern)
+    {
+        @trigger_error('The '.__METHOD__.' method is deprecated since version 2.2 and will be removed in 3.0. Use the setPath() method instead.', E_USER_DEPRECATED);
+
+        return $this->setPath($pattern);
+    }
+
+    /**
+     * Returns the pattern for the path.
+     *
+     * @return string The path pattern
+     */
+    public function getPath()
+    {
+        return $this->path;
+    }
+
+    /**
+     * Sets the pattern for the path.
+     *
+     * This method implements a fluent interface.
+     *
+     * @param string $pattern The path pattern
+     *
+     * @return Route The current Route instance
+     */
+    public function setPath($pattern)
+    {
+        // A pattern must start with a slash and must not have multiple slashes at the beginning because the
+        // generated path for this route would be confused with a network path, e.g. '//domain.com/path'.
+        $this->path = '/'.ltrim(trim($pattern), '/');
+        $this->compiled = null;
+
+        return $this;
+    }
+
+    /**
+     * Returns the pattern for the host.
+     *
+     * @return string The host pattern
+     */
+    public function getHost()
+    {
+        return $this->host;
+    }
+
+    /**
+     * Sets the pattern for the host.
+     *
+     * This method implements a fluent interface.
+     *
+     * @param string $pattern The host pattern
+     *
+     * @return Route The current Route instance
+     */
+    public function setHost($pattern)
+    {
+        $this->host = (string) $pattern;
+        $this->compiled = null;
+
+        return $this;
+    }
+
+    /**
+     * Returns the lowercased schemes this route is restricted to.
+     * So an empty array means that any scheme is allowed.
+     *
+     * @return array The schemes
+     */
+    public function getSchemes()
+    {
+        return $this->schemes;
+    }
+
+    /**
+     * Sets the schemes (e.g. 'https') this route is restricted to.
+     * So an empty array means that any scheme is allowed.
+     *
+     * This method implements a fluent interface.
+     *
+     * @param string|array $schemes The scheme or an array of schemes
+     *
+     * @return Route The current Route instance
+     */
+    public function setSchemes($schemes)
+    {
+        $this->schemes = array_map('strtolower', (array) $schemes);
+
+        // this is to keep BC and will be removed in a future version
+        if ($this->schemes) {
+            $this->requirements['_scheme'] = implode('|', $this->schemes);
+        } else {
+            unset($this->requirements['_scheme']);
+        }
+
+        $this->compiled = null;
+
+        return $this;
+    }
+
+    /**
+     * Checks if a scheme requirement has been set.
+     *
+     * @param string $scheme
+     *
+     * @return bool true if the scheme requirement exists, otherwise false
+     */
+    public function hasScheme($scheme)
+    {
+        return in_array(strtolower($scheme), $this->schemes, true);
+    }
+
+    /**
+     * Returns the uppercased HTTP methods this route is restricted to.
+     * So an empty array means that any method is allowed.
+     *
+     * @return array The methods
+     */
+    public function getMethods()
+    {
+        return $this->methods;
+    }
+
+    /**
+     * Sets the HTTP methods (e.g. 'POST') this route is restricted to.
+     * So an empty array means that any method is allowed.
+     *
+     * This method implements a fluent interface.
+     *
+     * @param string|array $methods The method or an array of methods
+     *
+     * @return Route The current Route instance
+     */
+    public function setMethods($methods)
+    {
+        $this->methods = array_map('strtoupper', (array) $methods);
+
+        // this is to keep BC and will be removed in a future version
+        if ($this->methods) {
+            $this->requirements['_method'] = implode('|', $this->methods);
+        } else {
+            unset($this->requirements['_method']);
+        }
+
+        $this->compiled = null;
+
+        return $this;
+    }
+
+    /**
+     * Returns the options.
+     *
+     * @return array The options
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * Sets the options.
+     *
+     * This method implements a fluent interface.
+     *
+     * @param array $options The options
+     *
+     * @return Route The current Route instance
+     */
+    public function setOptions(array $options)
+    {
+        $this->options = array(
+            'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler',
+        );
+
+        return $this->addOptions($options);
+    }
+
+    /**
+     * Adds options.
+     *
+     * This method implements a fluent interface.
+     *
+     * @param array $options The options
+     *
+     * @return Route The current Route instance
+     */
+    public function addOptions(array $options)
+    {
+        foreach ($options as $name => $option) {
+            $this->options[$name] = $option;
+        }
+        $this->compiled = null;
+
+        return $this;
+    }
+
+    /**
+     * Sets an option value.
+     *
+     * This method implements a fluent interface.
+     *
+     * @param string $name  An option name
+     * @param mixed  $value The option value
+     *
+     * @return Route The current Route instance
+     */
+    public function setOption($name, $value)
+    {
+        $this->options[$name] = $value;
+        $this->compiled = null;
+
+        return $this;
+    }
+
+    /**
+     * Get an option value.
+     *
+     * @param string $name An option name
+     *
+     * @return mixed The option value or null when not given
+     */
+    public function getOption($name)
+    {
+        return isset($this->options[$name]) ? $this->options[$name] : null;
+    }
+
+    /**
+     * Checks if an option has been set.
+     *
+     * @param string $name An option name
+     *
+     * @return bool true if the option is set, false otherwise
+     */
+    public function hasOption($name)
+    {
+        return array_key_exists($name, $this->options);
+    }
+
+    /**
+     * Returns the defaults.
+     *
+     * @return array The defaults
+     */
+    public function getDefaults()
+    {
+        return $this->defaults;
+    }
+
+    /**
+     * Sets the defaults.
+     *
+     * This method implements a fluent interface.
+     *
+     * @param array $defaults The defaults
+     *
+     * @return Route The current Route instance
+     */
+    public function setDefaults(array $defaults)
+    {
+        $this->defaults = array();
+
+        return $this->addDefaults($defaults);
+    }
+
+    /**
+     * Adds defaults.
+     *
+     * This method implements a fluent interface.
+     *
+     * @param array $defaults The defaults
+     *
+     * @return Route The current Route instance
+     */
+    public function addDefaults(array $defaults)
+    {
+        foreach ($defaults as $name => $default) {
+            $this->defaults[$name] = $default;
+        }
+        $this->compiled = null;
+
+        return $this;
+    }
+
+    /**
+     * Gets a default value.
+     *
+     * @param string $name A variable name
+     *
+     * @return mixed The default value or null when not given
+     */
+    public function getDefault($name)
+    {
+        return isset($this->defaults[$name]) ? $this->defaults[$name] : null;
+    }
+
+    /**
+     * Checks if a default value is set for the given variable.
+     *
+     * @param string $name A variable name
+     *
+     * @return bool true if the default value is set, false otherwise
+     */
+    public function hasDefault($name)
+    {
+        return array_key_exists($name, $this->defaults);
+    }
+
+    /**
+     * Sets a default value.
+     *
+     * @param string $name    A variable name
+     * @param mixed  $default The default value
+     *
+     * @return Route The current Route instance
+     */
+    public function setDefault($name, $default)
+    {
+        $this->defaults[$name] = $default;
+        $this->compiled = null;
+
+        return $this;
+    }
+
+    /**
+     * Returns the requirements.
+     *
+     * @return array The requirements
+     */
+    public function getRequirements()
+    {
+        return $this->requirements;
+    }
+
+    /**
+     * Sets the requirements.
+     *
+     * This method implements a fluent interface.
+     *
+     * @param array $requirements The requirements
+     *
+     * @return Route The current Route instance
+     */
+    public function setRequirements(array $requirements)
+    {
+        $this->requirements = array();
+
+        return $this->addRequirements($requirements);
+    }
+
+    /**
+     * Adds requirements.
+     *
+     * This method implements a fluent interface.
+     *
+     * @param array $requirements The requirements
+     *
+     * @return Route The current Route instance
+     */
+    public function addRequirements(array $requirements)
+    {
+        foreach ($requirements as $key => $regex) {
+            $this->requirements[$key] = $this->sanitizeRequirement($key, $regex);
+        }
+        $this->compiled = null;
+
+        return $this;
+    }
+
+    /**
+     * Returns the requirement for the given key.
+     *
+     * @param string $key The key
+     *
+     * @return string|null The regex or null when not given
+     */
+    public function getRequirement($key)
+    {
+        if ('_scheme' === $key) {
+            @trigger_error('The "_scheme" requirement is deprecated since version 2.2 and will be removed in 3.0. Use getSchemes() instead.', E_USER_DEPRECATED);
+        } elseif ('_method' === $key) {
+            @trigger_error('The "_method" requirement is deprecated since version 2.2 and will be removed in 3.0. Use getMethods() instead.', E_USER_DEPRECATED);
+        }
+
+        return isset($this->requirements[$key]) ? $this->requirements[$key] : null;
+    }
+
+    /**
+     * Checks if a requirement is set for the given key.
+     *
+     * @param string $key A variable name
+     *
+     * @return bool true if a requirement is specified, false otherwise
+     */
+    public function hasRequirement($key)
+    {
+        return array_key_exists($key, $this->requirements);
+    }
+
+    /**
+     * Sets a requirement for the given key.
+     *
+     * @param string $key   The key
+     * @param string $regex The regex
+     *
+     * @return Route The current Route instance
+     */
+    public function setRequirement($key, $regex)
+    {
+        $this->requirements[$key] = $this->sanitizeRequirement($key, $regex);
+        $this->compiled = null;
+
+        return $this;
+    }
+
+    /**
+     * Returns the condition.
+     *
+     * @return string The condition
+     */
+    public function getCondition()
+    {
+        return $this->condition;
+    }
+
+    /**
+     * Sets the condition.
+     *
+     * This method implements a fluent interface.
+     *
+     * @param string $condition The condition
+     *
+     * @return Route The current Route instance
+     */
+    public function setCondition($condition)
+    {
+        $this->condition = (string) $condition;
+        $this->compiled = null;
+
+        return $this;
+    }
+
+    /**
+     * Compiles the route.
+     *
+     * @return CompiledRoute A CompiledRoute instance
+     *
+     * @throws \LogicException If the Route cannot be compiled because the
+     *                         path or host pattern is invalid
+     *
+     * @see RouteCompiler which is responsible for the compilation process
+     */
+    public function compile()
+    {
+        if (null !== $this->compiled) {
+            return $this->compiled;
+        }
+
+        $class = $this->getOption('compiler_class');
+
+        return $this->compiled = $class::compile($this);
+    }
+
+    private function sanitizeRequirement($key, $regex)
+    {
+        if (!is_string($regex)) {
+            throw new \InvalidArgumentException(sprintf('Routing requirement for "%s" must be a string.', $key));
+        }
+
+        if ('' !== $regex && '^' === $regex[0]) {
+            $regex = (string) substr($regex, 1); // returns false for a single character
+        }
+
+        if ('$' === substr($regex, -1)) {
+            $regex = substr($regex, 0, -1);
+        }
+
+        if ('' === $regex) {
+            throw new \InvalidArgumentException(sprintf('Routing requirement for "%s" cannot be empty.', $key));
+        }
+
+        // this is to keep BC and will be removed in a future version
+        if ('_scheme' === $key) {
+            @trigger_error('The "_scheme" requirement is deprecated since version 2.2 and will be removed in 3.0. Use the setSchemes() method instead.', E_USER_DEPRECATED);
+
+            $this->setSchemes(explode('|', $regex));
+        } elseif ('_method' === $key) {
+            @trigger_error('The "_method" requirement is deprecated since version 2.2 and will be removed in 3.0. Use the setMethods() method instead.', E_USER_DEPRECATED);
+
+            $this->setMethods(explode('|', $regex));
+        }
+
+        return $regex;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/RouteCollection.php
@@ -0,0 +1,277 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing;
+
+use Symfony\Component\Config\Resource\ResourceInterface;
+
+/**
+ * A RouteCollection represents a set of Route instances.
+ *
+ * When adding a route at the end of the collection, an existing route
+ * with the same name is removed first. So there can only be one route
+ * with a given name.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Tobias Schultze <http://tobion.de>
+ */
+class RouteCollection implements \IteratorAggregate, \Countable
+{
+    /**
+     * @var Route[]
+     */
+    private $routes = array();
+
+    /**
+     * @var array
+     */
+    private $resources = array();
+
+    public function __clone()
+    {
+        foreach ($this->routes as $name => $route) {
+            $this->routes[$name] = clone $route;
+        }
+    }
+
+    /**
+     * Gets the current RouteCollection as an Iterator that includes all routes.
+     *
+     * It implements \IteratorAggregate.
+     *
+     * @see all()
+     *
+     * @return \ArrayIterator|Route[] An \ArrayIterator object for iterating over routes
+     */
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->routes);
+    }
+
+    /**
+     * Gets the number of Routes in this collection.
+     *
+     * @return int The number of routes
+     */
+    public function count()
+    {
+        return count($this->routes);
+    }
+
+    /**
+     * Adds a route.
+     *
+     * @param string $name  The route name
+     * @param Route  $route A Route instance
+     */
+    public function add($name, Route $route)
+    {
+        unset($this->routes[$name]);
+
+        $this->routes[$name] = $route;
+    }
+
+    /**
+     * Returns all routes in this collection.
+     *
+     * @return Route[] An array of routes
+     */
+    public function all()
+    {
+        return $this->routes;
+    }
+
+    /**
+     * Gets a route by name.
+     *
+     * @param string $name The route name
+     *
+     * @return Route|null A Route instance or null when not found
+     */
+    public function get($name)
+    {
+        return isset($this->routes[$name]) ? $this->routes[$name] : null;
+    }
+
+    /**
+     * Removes a route or an array of routes by name from the collection.
+     *
+     * @param string|array $name The route name or an array of route names
+     */
+    public function remove($name)
+    {
+        foreach ((array) $name as $n) {
+            unset($this->routes[$n]);
+        }
+    }
+
+    /**
+     * Adds a route collection at the end of the current set by appending all
+     * routes of the added collection.
+     *
+     * @param RouteCollection $collection A RouteCollection instance
+     */
+    public function addCollection(RouteCollection $collection)
+    {
+        // we need to remove all routes with the same names first because just replacing them
+        // would not place the new route at the end of the merged array
+        foreach ($collection->all() as $name => $route) {
+            unset($this->routes[$name]);
+            $this->routes[$name] = $route;
+        }
+
+        $this->resources = array_merge($this->resources, $collection->getResources());
+    }
+
+    /**
+     * Adds a prefix to the path of all child routes.
+     *
+     * @param string $prefix       An optional prefix to add before each pattern of the route collection
+     * @param array  $defaults     An array of default values
+     * @param array  $requirements An array of requirements
+     */
+    public function addPrefix($prefix, array $defaults = array(), array $requirements = array())
+    {
+        $prefix = trim(trim($prefix), '/');
+
+        if ('' === $prefix) {
+            return;
+        }
+
+        foreach ($this->routes as $route) {
+            $route->setPath('/'.$prefix.$route->getPath());
+            $route->addDefaults($defaults);
+            $route->addRequirements($requirements);
+        }
+    }
+
+    /**
+     * Sets the host pattern on all routes.
+     *
+     * @param string $pattern      The pattern
+     * @param array  $defaults     An array of default values
+     * @param array  $requirements An array of requirements
+     */
+    public function setHost($pattern, array $defaults = array(), array $requirements = array())
+    {
+        foreach ($this->routes as $route) {
+            $route->setHost($pattern);
+            $route->addDefaults($defaults);
+            $route->addRequirements($requirements);
+        }
+    }
+
+    /**
+     * Sets a condition on all routes.
+     *
+     * Existing conditions will be overridden.
+     *
+     * @param string $condition The condition
+     */
+    public function setCondition($condition)
+    {
+        foreach ($this->routes as $route) {
+            $route->setCondition($condition);
+        }
+    }
+
+    /**
+     * Adds defaults to all routes.
+     *
+     * An existing default value under the same name in a route will be overridden.
+     *
+     * @param array $defaults An array of default values
+     */
+    public function addDefaults(array $defaults)
+    {
+        if ($defaults) {
+            foreach ($this->routes as $route) {
+                $route->addDefaults($defaults);
+            }
+        }
+    }
+
+    /**
+     * Adds requirements to all routes.
+     *
+     * An existing requirement under the same name in a route will be overridden.
+     *
+     * @param array $requirements An array of requirements
+     */
+    public function addRequirements(array $requirements)
+    {
+        if ($requirements) {
+            foreach ($this->routes as $route) {
+                $route->addRequirements($requirements);
+            }
+        }
+    }
+
+    /**
+     * Adds options to all routes.
+     *
+     * An existing option value under the same name in a route will be overridden.
+     *
+     * @param array $options An array of options
+     */
+    public function addOptions(array $options)
+    {
+        if ($options) {
+            foreach ($this->routes as $route) {
+                $route->addOptions($options);
+            }
+        }
+    }
+
+    /**
+     * Sets the schemes (e.g. 'https') all child routes are restricted to.
+     *
+     * @param string|array $schemes The scheme or an array of schemes
+     */
+    public function setSchemes($schemes)
+    {
+        foreach ($this->routes as $route) {
+            $route->setSchemes($schemes);
+        }
+    }
+
+    /**
+     * Sets the HTTP methods (e.g. 'POST') all child routes are restricted to.
+     *
+     * @param string|array $methods The method or an array of methods
+     */
+    public function setMethods($methods)
+    {
+        foreach ($this->routes as $route) {
+            $route->setMethods($methods);
+        }
+    }
+
+    /**
+     * Returns an array of resources loaded to build this collection.
+     *
+     * @return ResourceInterface[] An array of resources
+     */
+    public function getResources()
+    {
+        return array_unique($this->resources);
+    }
+
+    /**
+     * Adds a resource for this collection.
+     *
+     * @param ResourceInterface $resource A resource instance
+     */
+    public function addResource(ResourceInterface $resource)
+    {
+        $this->resources[] = $resource;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/RouteCollectionBuilder.php
@@ -0,0 +1,373 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing;
+
+use Symfony\Component\Config\Exception\FileLoaderLoadException;
+use Symfony\Component\Config\Loader\LoaderInterface;
+use Symfony\Component\Config\Resource\ResourceInterface;
+
+/**
+ * Helps add and import routes into a RouteCollection.
+ *
+ * @author Ryan Weaver <ryan@knpuniversity.com>
+ */
+class RouteCollectionBuilder
+{
+    /**
+     * @var Route[]|RouteCollectionBuilder[]
+     */
+    private $routes = array();
+
+    private $loader;
+    private $defaults = array();
+    private $prefix;
+    private $host;
+    private $condition;
+    private $requirements = array();
+    private $options = array();
+    private $schemes;
+    private $methods;
+    private $resources = array();
+
+    /**
+     * @param LoaderInterface $loader
+     */
+    public function __construct(LoaderInterface $loader = null)
+    {
+        $this->loader = $loader;
+    }
+
+    /**
+     * Import an external routing resource and returns the RouteCollectionBuilder.
+     *
+     *  $routes->import('blog.yml', '/blog');
+     *
+     * @param mixed       $resource
+     * @param string|null $prefix
+     * @param string      $type
+     *
+     * @return RouteCollectionBuilder
+     *
+     * @throws FileLoaderLoadException
+     */
+    public function import($resource, $prefix = '/', $type = null)
+    {
+        /** @var RouteCollection $collection */
+        $collection = $this->load($resource, $type);
+
+        // create a builder from the RouteCollection
+        $builder = $this->createBuilder();
+        foreach ($collection->all() as $name => $route) {
+            $builder->addRoute($route, $name);
+        }
+
+        foreach ($collection->getResources() as $resource) {
+            $builder->addResource($resource);
+        }
+
+        // mount into this builder
+        $this->mount($prefix, $builder);
+
+        return $builder;
+    }
+
+    /**
+     * Adds a route and returns it for future modification.
+     *
+     * @param string      $path       The route path
+     * @param string      $controller The route's controller
+     * @param string|null $name       The name to give this route
+     *
+     * @return Route
+     */
+    public function add($path, $controller, $name = null)
+    {
+        $route = new Route($path);
+        $route->setDefault('_controller', $controller);
+        $this->addRoute($route, $name);
+
+        return $route;
+    }
+
+    /**
+     * Returns a RouteCollectionBuilder that can be configured and then added with mount().
+     *
+     * @return RouteCollectionBuilder
+     */
+    public function createBuilder()
+    {
+        return new self($this->loader);
+    }
+
+    /**
+     * Add a RouteCollectionBuilder.
+     *
+     * @param string                 $prefix
+     * @param RouteCollectionBuilder $builder
+     */
+    public function mount($prefix, RouteCollectionBuilder $builder)
+    {
+        $builder->prefix = trim(trim($prefix), '/');
+        $this->routes[] = $builder;
+    }
+
+    /**
+     * Adds a Route object to the builder.
+     *
+     * @param Route       $route
+     * @param string|null $name
+     *
+     * @return $this
+     */
+    public function addRoute(Route $route, $name = null)
+    {
+        if (null === $name) {
+            // used as a flag to know which routes will need a name later
+            $name = '_unnamed_route_'.spl_object_hash($route);
+        }
+
+        $this->routes[$name] = $route;
+
+        return $this;
+    }
+
+    /**
+     * Sets the host on all embedded routes (unless already set).
+     *
+     * @param string $pattern
+     *
+     * @return $this
+     */
+    public function setHost($pattern)
+    {
+        $this->host = $pattern;
+
+        return $this;
+    }
+
+    /**
+     * Sets a condition on all embedded routes (unless already set).
+     *
+     * @param string $condition
+     *
+     * @return $this
+     */
+    public function setCondition($condition)
+    {
+        $this->condition = $condition;
+
+        return $this;
+    }
+
+    /**
+     * Sets a default value that will be added to all embedded routes (unless that
+     * default value is already set).
+     *
+     * @param string $key
+     * @param mixed  $value
+     *
+     * @return $this
+     */
+    public function setDefault($key, $value)
+    {
+        $this->defaults[$key] = $value;
+
+        return $this;
+    }
+
+    /**
+     * Sets a requirement that will be added to all embedded routes (unless that
+     * requirement is already set).
+     *
+     * @param string $key
+     * @param mixed  $regex
+     *
+     * @return $this
+     */
+    public function setRequirement($key, $regex)
+    {
+        $this->requirements[$key] = $regex;
+
+        return $this;
+    }
+
+    /**
+     * Sets an opiton that will be added to all embedded routes (unless that
+     * option is already set).
+     *
+     * @param string $key
+     * @param mixed  $value
+     *
+     * @return $this
+     */
+    public function setOption($key, $value)
+    {
+        $this->options[$key] = $value;
+
+        return $this;
+    }
+
+    /**
+     * Sets the schemes on all embedded routes (unless already set).
+     *
+     * @param array|string $schemes
+     *
+     * @return $this
+     */
+    public function setSchemes($schemes)
+    {
+        $this->schemes = $schemes;
+
+        return $this;
+    }
+
+    /**
+     * Sets the methods on all embedded routes (unless already set).
+     *
+     * @param array|string $methods
+     *
+     * @return $this
+     */
+    public function setMethods($methods)
+    {
+        $this->methods = $methods;
+
+        return $this;
+    }
+
+    /**
+     * Adds a resource for this collection.
+     *
+     * @param ResourceInterface $resource
+     *
+     * @return $this
+     */
+    private function addResource(ResourceInterface $resource)
+    {
+        $this->resources[] = $resource;
+
+        return $this;
+    }
+
+    /**
+     * Creates the final RouteCollection and returns it.
+     *
+     * @return RouteCollection
+     */
+    public function build()
+    {
+        $routeCollection = new RouteCollection();
+
+        foreach ($this->routes as $name => $route) {
+            if ($route instanceof Route) {
+                $route->setDefaults(array_merge($this->defaults, $route->getDefaults()));
+                $route->setOptions(array_merge($this->options, $route->getOptions()));
+
+                // we're extra careful here to avoid re-setting deprecated _method and _scheme
+                foreach ($this->requirements as $key => $val) {
+                    if (!$route->hasRequirement($key)) {
+                        $route->setRequirement($key, $val);
+                    }
+                }
+
+                if (null !== $this->prefix) {
+                    $route->setPath('/'.$this->prefix.$route->getPath());
+                }
+
+                if (!$route->getHost()) {
+                    $route->setHost($this->host);
+                }
+
+                if (!$route->getCondition()) {
+                    $route->setCondition($this->condition);
+                }
+
+                if (!$route->getSchemes()) {
+                    $route->setSchemes($this->schemes);
+                }
+
+                if (!$route->getMethods()) {
+                    $route->setMethods($this->methods);
+                }
+
+                // auto-generate the route name if it's been marked
+                if ('_unnamed_route_' === substr($name, 0, 15)) {
+                    $name = $this->generateRouteName($route);
+                }
+
+                $routeCollection->add($name, $route);
+            } else {
+                /* @var self $route */
+                $subCollection = $route->build();
+                $subCollection->addPrefix($this->prefix);
+
+                $routeCollection->addCollection($subCollection);
+            }
+
+            foreach ($this->resources as $resource) {
+                $routeCollection->addResource($resource);
+            }
+        }
+
+        return $routeCollection;
+    }
+
+    /**
+     * Generates a route name based on details of this route.
+     *
+     * @return string
+     */
+    private function generateRouteName(Route $route)
+    {
+        $methods = implode('_', $route->getMethods()).'_';
+
+        $routeName = $methods.$route->getPath();
+        $routeName = str_replace(array('/', ':', '|', '-'), '_', $routeName);
+        $routeName = preg_replace('/[^a-z0-9A-Z_.]+/', '', $routeName);
+
+        // Collapse consecutive underscores down into a single underscore.
+        $routeName = preg_replace('/_+/', '_', $routeName);
+
+        return $routeName;
+    }
+
+    /**
+     * Finds a loader able to load an imported resource and loads it.
+     *
+     * @param mixed       $resource A resource
+     * @param string|null $type     The resource type or null if unknown
+     *
+     * @return RouteCollection
+     *
+     * @throws FileLoaderLoadException If no loader is found
+     */
+    private function load($resource, $type = null)
+    {
+        if (null === $this->loader) {
+            throw new \BadMethodCallException('Cannot import other routing resources: you must pass a LoaderInterface when constructing RouteCollectionBuilder.');
+        }
+
+        if ($this->loader->supports($resource, $type)) {
+            return $this->loader->load($resource, $type);
+        }
+
+        if (null === $resolver = $this->loader->getResolver()) {
+            throw new FileLoaderLoadException($resource);
+        }
+
+        if (false === $loader = $resolver->resolve($resource, $type)) {
+            throw new FileLoaderLoadException($resource);
+        }
+
+        return $loader->load($resource, $type);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/RouteCompiler.php
@@ -0,0 +1,229 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing;
+
+/**
+ * RouteCompiler compiles Route instances to CompiledRoute instances.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Tobias Schultze <http://tobion.de>
+ */
+class RouteCompiler implements RouteCompilerInterface
+{
+    const REGEX_DELIMITER = '#';
+
+    /**
+     * This string defines the characters that are automatically considered separators in front of
+     * optional placeholders (with default and no static text following). Such a single separator
+     * can be left out together with the optional placeholder from matching and generating URLs.
+     */
+    const SEPARATORS = '/,;.:-_~+*=@|';
+
+    /**
+     * {@inheritdoc}
+     *
+     * @throws \LogicException  If a variable is referenced more than once
+     * @throws \DomainException If a variable name is numeric because PHP raises an error for such
+     *                          subpatterns in PCRE and thus would break matching, e.g. "(?P<123>.+)".
+     */
+    public static function compile(Route $route)
+    {
+        $hostVariables = array();
+        $variables = array();
+        $hostRegex = null;
+        $hostTokens = array();
+
+        if ('' !== $host = $route->getHost()) {
+            $result = self::compilePattern($route, $host, true);
+
+            $hostVariables = $result['variables'];
+            $variables = $hostVariables;
+
+            $hostTokens = $result['tokens'];
+            $hostRegex = $result['regex'];
+        }
+
+        $path = $route->getPath();
+
+        $result = self::compilePattern($route, $path, false);
+
+        $staticPrefix = $result['staticPrefix'];
+
+        $pathVariables = $result['variables'];
+        $variables = array_merge($variables, $pathVariables);
+
+        $tokens = $result['tokens'];
+        $regex = $result['regex'];
+
+        return new CompiledRoute(
+            $staticPrefix,
+            $regex,
+            $tokens,
+            $pathVariables,
+            $hostRegex,
+            $hostTokens,
+            $hostVariables,
+            array_unique($variables)
+        );
+    }
+
+    private static function compilePattern(Route $route, $pattern, $isHost)
+    {
+        $tokens = array();
+        $variables = array();
+        $matches = array();
+        $pos = 0;
+        $defaultSeparator = $isHost ? '.' : '/';
+
+        // Match all variables enclosed in "{}" and iterate over them. But we only want to match the innermost variable
+        // in case of nested "{}", e.g. {foo{bar}}. This in ensured because \w does not match "{" or "}" itself.
+        preg_match_all('#\{\w+\}#', $pattern, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
+        foreach ($matches as $match) {
+            $varName = substr($match[0][0], 1, -1);
+            // get all static text preceding the current variable
+            $precedingText = substr($pattern, $pos, $match[0][1] - $pos);
+            $pos = $match[0][1] + strlen($match[0][0]);
+            $precedingChar = strlen($precedingText) > 0 ? substr($precedingText, -1) : '';
+            $isSeparator = '' !== $precedingChar && false !== strpos(static::SEPARATORS, $precedingChar);
+
+            if (is_numeric($varName)) {
+                throw new \DomainException(sprintf('Variable name "%s" cannot be numeric in route pattern "%s". Please use a different name.', $varName, $pattern));
+            }
+            if (in_array($varName, $variables)) {
+                throw new \LogicException(sprintf('Route pattern "%s" cannot reference variable name "%s" more than once.', $pattern, $varName));
+            }
+
+            if ($isSeparator && strlen($precedingText) > 1) {
+                $tokens[] = array('text', substr($precedingText, 0, -1));
+            } elseif (!$isSeparator && strlen($precedingText) > 0) {
+                $tokens[] = array('text', $precedingText);
+            }
+
+            $regexp = $route->getRequirement($varName);
+            if (null === $regexp) {
+                $followingPattern = (string) substr($pattern, $pos);
+                // Find the next static character after the variable that functions as a separator. By default, this separator and '/'
+                // are disallowed for the variable. This default requirement makes sure that optional variables can be matched at all
+                // and that the generating-matching-combination of URLs unambiguous, i.e. the params used for generating the URL are
+                // the same that will be matched. Example: new Route('/{page}.{_format}', array('_format' => 'html'))
+                // If {page} would also match the separating dot, {_format} would never match as {page} will eagerly consume everything.
+                // Also even if {_format} was not optional the requirement prevents that {page} matches something that was originally
+                // part of {_format} when generating the URL, e.g. _format = 'mobile.html'.
+                $nextSeparator = self::findNextSeparator($followingPattern);
+                $regexp = sprintf(
+                    '[^%s%s]+',
+                    preg_quote($defaultSeparator, self::REGEX_DELIMITER),
+                    $defaultSeparator !== $nextSeparator && '' !== $nextSeparator ? preg_quote($nextSeparator, self::REGEX_DELIMITER) : ''
+                );
+                if (('' !== $nextSeparator && !preg_match('#^\{\w+\}#', $followingPattern)) || '' === $followingPattern) {
+                    // When we have a separator, which is disallowed for the variable, we can optimize the regex with a possessive
+                    // quantifier. This prevents useless backtracking of PCRE and improves performance by 20% for matching those patterns.
+                    // Given the above example, there is no point in backtracking into {page} (that forbids the dot) when a dot must follow
+                    // after it. This optimization cannot be applied when the next char is no real separator or when the next variable is
+                    // directly adjacent, e.g. '/{x}{y}'.
+                    $regexp .= '+';
+                }
+            }
+
+            $tokens[] = array('variable', $isSeparator ? $precedingChar : '', $regexp, $varName);
+            $variables[] = $varName;
+        }
+
+        if ($pos < strlen($pattern)) {
+            $tokens[] = array('text', substr($pattern, $pos));
+        }
+
+        // find the first optional token
+        $firstOptional = PHP_INT_MAX;
+        if (!$isHost) {
+            for ($i = count($tokens) - 1; $i >= 0; --$i) {
+                $token = $tokens[$i];
+                if ('variable' === $token[0] && $route->hasDefault($token[3])) {
+                    $firstOptional = $i;
+                } else {
+                    break;
+                }
+            }
+        }
+
+        // compute the matching regexp
+        $regexp = '';
+        for ($i = 0, $nbToken = count($tokens); $i < $nbToken; ++$i) {
+            $regexp .= self::computeRegexp($tokens, $i, $firstOptional);
+        }
+
+        return array(
+            'staticPrefix' => 'text' === $tokens[0][0] ? $tokens[0][1] : '',
+            'regex' => self::REGEX_DELIMITER.'^'.$regexp.'$'.self::REGEX_DELIMITER.'s'.($isHost ? 'i' : ''),
+            'tokens' => array_reverse($tokens),
+            'variables' => $variables,
+        );
+    }
+
+    /**
+     * Returns the next static character in the Route pattern that will serve as a separator.
+     *
+     * @param string $pattern The route pattern
+     *
+     * @return string The next static character that functions as separator (or empty string when none available)
+     */
+    private static function findNextSeparator($pattern)
+    {
+        if ('' == $pattern) {
+            // return empty string if pattern is empty or false (false which can be returned by substr)
+            return '';
+        }
+        // first remove all placeholders from the pattern so we can find the next real static character
+        $pattern = preg_replace('#\{\w+\}#', '', $pattern);
+
+        return isset($pattern[0]) && false !== strpos(static::SEPARATORS, $pattern[0]) ? $pattern[0] : '';
+    }
+
+    /**
+     * Computes the regexp used to match a specific token. It can be static text or a subpattern.
+     *
+     * @param array $tokens        The route tokens
+     * @param int   $index         The index of the current token
+     * @param int   $firstOptional The index of the first optional token
+     *
+     * @return string The regexp pattern for a single token
+     */
+    private static function computeRegexp(array $tokens, $index, $firstOptional)
+    {
+        $token = $tokens[$index];
+        if ('text' === $token[0]) {
+            // Text tokens
+            return preg_quote($token[1], self::REGEX_DELIMITER);
+        } else {
+            // Variable tokens
+            if (0 === $index && 0 === $firstOptional) {
+                // When the only token is an optional variable token, the separator is required
+                return sprintf('%s(?P<%s>%s)?', preg_quote($token[1], self::REGEX_DELIMITER), $token[3], $token[2]);
+            } else {
+                $regexp = sprintf('%s(?P<%s>%s)', preg_quote($token[1], self::REGEX_DELIMITER), $token[3], $token[2]);
+                if ($index >= $firstOptional) {
+                    // Enclose each optional token in a subpattern to make it optional.
+                    // "?:" means it is non-capturing, i.e. the portion of the subject string that
+                    // matched the optional subpattern is not passed back.
+                    $regexp = "(?:$regexp";
+                    $nbTokens = count($tokens);
+                    if ($nbTokens - 1 == $index) {
+                        // Close the optional subpatterns
+                        $regexp .= str_repeat(')?', $nbTokens - $firstOptional - (0 === $firstOptional ? 1 : 0));
+                    }
+                }
+
+                return $regexp;
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/RouteCompilerInterface.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing;
+
+/**
+ * RouteCompilerInterface is the interface that all RouteCompiler classes must implement.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface RouteCompilerInterface
+{
+    /**
+     * Compiles the current route instance.
+     *
+     * @param Route $route A Route instance
+     *
+     * @return CompiledRoute A CompiledRoute instance
+     *
+     * @throws \LogicException If the Route cannot be compiled because the
+     *                         path or host pattern is invalid
+     */
+    public static function compile(Route $route);
+}
--- /dev/null
+++ b/vendor/symfony/routing/Router.php
@@ -0,0 +1,404 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing;
+
+use Symfony\Component\Config\Loader\LoaderInterface;
+use Symfony\Component\Config\ConfigCacheInterface;
+use Symfony\Component\Config\ConfigCacheFactoryInterface;
+use Symfony\Component\Config\ConfigCacheFactory;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Routing\Generator\ConfigurableRequirementsInterface;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Routing\Generator\Dumper\GeneratorDumperInterface;
+use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
+use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
+use Symfony\Component\Routing\Matcher\Dumper\MatcherDumperInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
+
+/**
+ * The Router class is an example of the integration of all pieces of the
+ * routing system for easier use.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Router implements RouterInterface, RequestMatcherInterface
+{
+    /**
+     * @var UrlMatcherInterface|null
+     */
+    protected $matcher;
+
+    /**
+     * @var UrlGeneratorInterface|null
+     */
+    protected $generator;
+
+    /**
+     * @var RequestContext
+     */
+    protected $context;
+
+    /**
+     * @var LoaderInterface
+     */
+    protected $loader;
+
+    /**
+     * @var RouteCollection|null
+     */
+    protected $collection;
+
+    /**
+     * @var mixed
+     */
+    protected $resource;
+
+    /**
+     * @var array
+     */
+    protected $options = array();
+
+    /**
+     * @var LoggerInterface|null
+     */
+    protected $logger;
+
+    /**
+     * @var ConfigCacheFactoryInterface|null
+     */
+    private $configCacheFactory;
+
+    /**
+     * @var ExpressionFunctionProviderInterface[]
+     */
+    private $expressionLanguageProviders = array();
+
+    /**
+     * Constructor.
+     *
+     * @param LoaderInterface $loader   A LoaderInterface instance
+     * @param mixed           $resource The main resource to load
+     * @param array           $options  An array of options
+     * @param RequestContext  $context  The context
+     * @param LoggerInterface $logger   A logger instance
+     */
+    public function __construct(LoaderInterface $loader, $resource, array $options = array(), RequestContext $context = null, LoggerInterface $logger = null)
+    {
+        $this->loader = $loader;
+        $this->resource = $resource;
+        $this->logger = $logger;
+        $this->context = $context ?: new RequestContext();
+        $this->setOptions($options);
+    }
+
+    /**
+     * Sets options.
+     *
+     * Available options:
+     *
+     *   * cache_dir:              The cache directory (or null to disable caching)
+     *   * debug:                  Whether to enable debugging or not (false by default)
+     *   * generator_class:        The name of a UrlGeneratorInterface implementation
+     *   * generator_base_class:   The base class for the dumped generator class
+     *   * generator_cache_class:  The class name for the dumped generator class
+     *   * generator_dumper_class: The name of a GeneratorDumperInterface implementation
+     *   * matcher_class:          The name of a UrlMatcherInterface implementation
+     *   * matcher_base_class:     The base class for the dumped matcher class
+     *   * matcher_dumper_class:   The class name for the dumped matcher class
+     *   * matcher_cache_class:    The name of a MatcherDumperInterface implementation
+     *   * resource_type:          Type hint for the main resource (optional)
+     *   * strict_requirements:    Configure strict requirement checking for generators
+     *                             implementing ConfigurableRequirementsInterface (default is true)
+     *
+     * @param array $options An array of options
+     *
+     * @throws \InvalidArgumentException When unsupported option is provided
+     */
+    public function setOptions(array $options)
+    {
+        $this->options = array(
+            'cache_dir' => null,
+            'debug' => false,
+            'generator_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
+            'generator_base_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
+            'generator_dumper_class' => 'Symfony\\Component\\Routing\\Generator\\Dumper\\PhpGeneratorDumper',
+            'generator_cache_class' => 'ProjectUrlGenerator',
+            'matcher_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
+            'matcher_base_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
+            'matcher_dumper_class' => 'Symfony\\Component\\Routing\\Matcher\\Dumper\\PhpMatcherDumper',
+            'matcher_cache_class' => 'ProjectUrlMatcher',
+            'resource_type' => null,
+            'strict_requirements' => true,
+        );
+
+        // check option names and live merge, if errors are encountered Exception will be thrown
+        $invalid = array();
+        foreach ($options as $key => $value) {
+            if (array_key_exists($key, $this->options)) {
+                $this->options[$key] = $value;
+            } else {
+                $invalid[] = $key;
+            }
+        }
+
+        if ($invalid) {
+            throw new \InvalidArgumentException(sprintf('The Router does not support the following options: "%s".', implode('", "', $invalid)));
+        }
+    }
+
+    /**
+     * Sets an option.
+     *
+     * @param string $key   The key
+     * @param mixed  $value The value
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function setOption($key, $value)
+    {
+        if (!array_key_exists($key, $this->options)) {
+            throw new \InvalidArgumentException(sprintf('The Router does not support the "%s" option.', $key));
+        }
+
+        $this->options[$key] = $value;
+    }
+
+    /**
+     * Gets an option value.
+     *
+     * @param string $key The key
+     *
+     * @return mixed The value
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function getOption($key)
+    {
+        if (!array_key_exists($key, $this->options)) {
+            throw new \InvalidArgumentException(sprintf('The Router does not support the "%s" option.', $key));
+        }
+
+        return $this->options[$key];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getRouteCollection()
+    {
+        if (null === $this->collection) {
+            $this->collection = $this->loader->load($this->resource, $this->options['resource_type']);
+        }
+
+        return $this->collection;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setContext(RequestContext $context)
+    {
+        $this->context = $context;
+
+        if (null !== $this->matcher) {
+            $this->getMatcher()->setContext($context);
+        }
+        if (null !== $this->generator) {
+            $this->getGenerator()->setContext($context);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getContext()
+    {
+        return $this->context;
+    }
+
+    /**
+     * Sets the ConfigCache factory to use.
+     *
+     * @param ConfigCacheFactoryInterface $configCacheFactory The factory to use
+     */
+    public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory)
+    {
+        $this->configCacheFactory = $configCacheFactory;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH)
+    {
+        return $this->getGenerator()->generate($name, $parameters, $referenceType);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function match($pathinfo)
+    {
+        return $this->getMatcher()->match($pathinfo);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function matchRequest(Request $request)
+    {
+        $matcher = $this->getMatcher();
+        if (!$matcher instanceof RequestMatcherInterface) {
+            // fallback to the default UrlMatcherInterface
+            return $matcher->match($request->getPathInfo());
+        }
+
+        return $matcher->matchRequest($request);
+    }
+
+    /**
+     * Gets the UrlMatcher instance associated with this Router.
+     *
+     * @return UrlMatcherInterface A UrlMatcherInterface instance
+     */
+    public function getMatcher()
+    {
+        if (null !== $this->matcher) {
+            return $this->matcher;
+        }
+
+        if (null === $this->options['cache_dir'] || null === $this->options['matcher_cache_class']) {
+            $this->matcher = new $this->options['matcher_class']($this->getRouteCollection(), $this->context);
+            if (method_exists($this->matcher, 'addExpressionLanguageProvider')) {
+                foreach ($this->expressionLanguageProviders as $provider) {
+                    $this->matcher->addExpressionLanguageProvider($provider);
+                }
+            }
+
+            return $this->matcher;
+        }
+
+        $class = $this->options['matcher_cache_class'];
+        $baseClass = $this->options['matcher_base_class'];
+        $expressionLanguageProviders = $this->expressionLanguageProviders;
+        $that = $this; // required for PHP 5.3 where "$this" cannot be use()d in anonymous functions. Change in Symfony 3.0.
+
+        $cache = $this->getConfigCacheFactory()->cache($this->options['cache_dir'].'/'.$class.'.php',
+            function (ConfigCacheInterface $cache) use ($that, $class, $baseClass, $expressionLanguageProviders) {
+                $dumper = $that->getMatcherDumperInstance();
+                if (method_exists($dumper, 'addExpressionLanguageProvider')) {
+                    foreach ($expressionLanguageProviders as $provider) {
+                        $dumper->addExpressionLanguageProvider($provider);
+                    }
+                }
+
+                $options = array(
+                    'class' => $class,
+                    'base_class' => $baseClass,
+                );
+
+                $cache->write($dumper->dump($options), $that->getRouteCollection()->getResources());
+            }
+        );
+
+        require_once $cache->getPath();
+
+        return $this->matcher = new $class($this->context);
+    }
+
+    /**
+     * Gets the UrlGenerator instance associated with this Router.
+     *
+     * @return UrlGeneratorInterface A UrlGeneratorInterface instance
+     */
+    public function getGenerator()
+    {
+        if (null !== $this->generator) {
+            return $this->generator;
+        }
+
+        if (null === $this->options['cache_dir'] || null === $this->options['generator_cache_class']) {
+            $this->generator = new $this->options['generator_class']($this->getRouteCollection(), $this->context, $this->logger);
+        } else {
+            $class = $this->options['generator_cache_class'];
+            $baseClass = $this->options['generator_base_class'];
+            $that = $this; // required for PHP 5.3 where "$this" cannot be use()d in anonymous functions. Change in Symfony 3.0.
+            $cache = $this->getConfigCacheFactory()->cache($this->options['cache_dir'].'/'.$class.'.php',
+                function (ConfigCacheInterface $cache) use ($that, $class, $baseClass) {
+                    $dumper = $that->getGeneratorDumperInstance();
+
+                    $options = array(
+                        'class' => $class,
+                        'base_class' => $baseClass,
+                    );
+
+                    $cache->write($dumper->dump($options), $that->getRouteCollection()->getResources());
+                }
+            );
+
+            require_once $cache->getPath();
+
+            $this->generator = new $class($this->context, $this->logger);
+        }
+
+        if ($this->generator instanceof ConfigurableRequirementsInterface) {
+            $this->generator->setStrictRequirements($this->options['strict_requirements']);
+        }
+
+        return $this->generator;
+    }
+
+    public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider)
+    {
+        $this->expressionLanguageProviders[] = $provider;
+    }
+
+    /**
+     * This method is public because it needs to be callable from a closure in PHP 5.3. It should be converted back to protected in 3.0.
+     *
+     * @internal
+     *
+     * @return GeneratorDumperInterface
+     */
+    public function getGeneratorDumperInstance()
+    {
+        return new $this->options['generator_dumper_class']($this->getRouteCollection());
+    }
+
+    /**
+     * This method is public because it needs to be callable from a closure in PHP 5.3. It should be converted back to protected in 3.0.
+     *
+     * @internal
+     *
+     * @return MatcherDumperInterface
+     */
+    public function getMatcherDumperInstance()
+    {
+        return new $this->options['matcher_dumper_class']($this->getRouteCollection());
+    }
+
+    /**
+     * Provides the ConfigCache factory implementation, falling back to a
+     * default implementation if necessary.
+     *
+     * @return ConfigCacheFactoryInterface $configCacheFactory
+     */
+    private function getConfigCacheFactory()
+    {
+        if (null === $this->configCacheFactory) {
+            $this->configCacheFactory = new ConfigCacheFactory($this->options['debug']);
+        }
+
+        return $this->configCacheFactory;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/routing/RouterInterface.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing;
+
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
+
+/**
+ * RouterInterface is the interface that all Router classes must implement.
+ *
+ * This interface is the concatenation of UrlMatcherInterface and UrlGeneratorInterface.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface RouterInterface extends UrlMatcherInterface, UrlGeneratorInterface
+{
+    /**
+     * Gets the RouteCollection instance associated with this Router.
+     *
+     * @return RouteCollection A RouteCollection instance
+     */
+    public function getRouteCollection();
+}
--- /dev/null
+++ b/vendor/symfony/routing/composer.json
@@ -0,0 +1,53 @@
+{
+    "name": "symfony/routing",
+    "type": "library",
+    "description": "Symfony Routing Component",
+    "keywords": ["routing", "router", "URL", "URI"],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.9"
+    },
+    "require-dev": {
+        "symfony/config": "~2.7|~3.0.0",
+        "symfony/http-foundation": "~2.3|~3.0.0",
+        "symfony/yaml": "~2.0,>=2.0.5|~3.0.0",
+        "symfony/expression-language": "~2.4|~3.0.0",
+        "doctrine/annotations": "~1.0",
+        "doctrine/common": "~2.2",
+        "psr/log": "~1.0"
+    },
+    "conflict": {
+        "symfony/config": "<2.7"
+    },
+    "suggest": {
+        "symfony/http-foundation": "For using a Symfony Request object",
+        "symfony/config": "For using the all-in-one router or any loader",
+        "symfony/yaml": "For using the YAML loader",
+        "symfony/expression-language": "For using expression matching",
+        "doctrine/annotations": "For using the annotation loader",
+        "symfony/dependency-injection": "For loading routes from a service"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Component\\Routing\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.8-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/AppVariable.php
@@ -0,0 +1,172 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpFoundation\Session\Session;
+use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
+use Symfony\Component\Security\Core\SecurityContext;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Exposes some Symfony parameters and services as an "app" global variable.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class AppVariable
+{
+    private $container;
+    private $tokenStorage;
+    private $requestStack;
+    private $environment;
+    private $debug;
+
+    /**
+     * @deprecated since version 2.7, to be removed in 3.0.
+     */
+    public function setContainer(ContainerInterface $container)
+    {
+        $this->container = $container;
+    }
+
+    public function setTokenStorage(TokenStorageInterface $tokenStorage)
+    {
+        $this->tokenStorage = $tokenStorage;
+    }
+
+    public function setRequestStack(RequestStack $requestStack)
+    {
+        $this->requestStack = $requestStack;
+    }
+
+    public function setEnvironment($environment)
+    {
+        $this->environment = $environment;
+    }
+
+    public function setDebug($debug)
+    {
+        $this->debug = (bool) $debug;
+    }
+
+    /**
+     * Returns the security context service.
+     *
+     * @deprecated since version 2.6, to be removed in 3.0.
+     *
+     * @return SecurityContext|null The security context
+     */
+    public function getSecurity()
+    {
+        @trigger_error('The "app.security" variable is deprecated since version 2.6 and will be removed in 3.0.', E_USER_DEPRECATED);
+
+        if (null === $this->container) {
+            throw new \RuntimeException('The "app.security" variable is not available.');
+        }
+
+        if ($this->container->has('security.context')) {
+            return $this->container->get('security.context');
+        }
+    }
+
+    /**
+     * Returns the current user.
+     *
+     * @return mixed
+     *
+     * @see TokenInterface::getUser()
+     */
+    public function getUser()
+    {
+        if (null === $this->tokenStorage) {
+            if (null === $this->container) {
+                throw new \RuntimeException('The "app.user" variable is not available.');
+            } elseif (!$this->container->has('security.context')) {
+                return;
+            }
+
+            $this->tokenStorage = $this->container->get('security.context');
+        }
+
+        if (!$token = $this->tokenStorage->getToken()) {
+            return;
+        }
+
+        $user = $token->getUser();
+        if (is_object($user)) {
+            return $user;
+        }
+    }
+
+    /**
+     * Returns the current request.
+     *
+     * @return Request|null The HTTP request object
+     */
+    public function getRequest()
+    {
+        if (null === $this->requestStack) {
+            if (null === $this->container) {
+                throw new \RuntimeException('The "app.request" variable is not available.');
+            }
+
+            $this->requestStack = $this->container->get('request_stack');
+        }
+
+        return $this->requestStack->getCurrentRequest();
+    }
+
+    /**
+     * Returns the current session.
+     *
+     * @return Session|null The session
+     */
+    public function getSession()
+    {
+        if (null === $this->requestStack && null === $this->container) {
+            throw new \RuntimeException('The "app.session" variable is not available.');
+        }
+
+        if ($request = $this->getRequest()) {
+            return $request->getSession();
+        }
+    }
+
+    /**
+     * Returns the current app environment.
+     *
+     * @return string The current environment string (e.g 'dev')
+     */
+    public function getEnvironment()
+    {
+        if (null === $this->environment) {
+            throw new \RuntimeException('The "app.environment" variable is not available.');
+        }
+
+        return $this->environment;
+    }
+
+    /**
+     * Returns the current app debug mode.
+     *
+     * @return bool The current debug mode
+     */
+    public function getDebug()
+    {
+        if (null === $this->debug) {
+            throw new \RuntimeException('The "app.debug" variable is not available.');
+        }
+
+        return $this->debug;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Command/DebugCommand.php
@@ -0,0 +1,219 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+
+/**
+ * Lists twig functions, filters, globals and tests present in the current project.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class DebugCommand extends Command
+{
+    private $twig;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct($name = 'debug:twig')
+    {
+        parent::__construct($name);
+    }
+
+    /**
+     * Sets the twig environment.
+     *
+     * @param \Twig_Environment $twig
+     */
+    public function setTwigEnvironment(\Twig_Environment $twig)
+    {
+        $this->twig = $twig;
+    }
+
+    /**
+     * @return \Twig_Environment $twig
+     */
+    protected function getTwigEnvironment()
+    {
+        return $this->twig;
+    }
+
+    protected function configure()
+    {
+        $this
+            ->setDefinition(array(
+                new InputArgument('filter', InputArgument::OPTIONAL, 'Show details for all entries matching this filter'),
+                new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (text or json)', 'text'),
+            ))
+            ->setDescription('Shows a list of twig functions, filters, globals and tests')
+            ->setHelp(<<<EOF
+The <info>%command.name%</info> command outputs a list of twig functions,
+filters, globals and tests. Output can be filtered with an optional argument.
+
+  <info>php %command.full_name%</info>
+
+The command lists all functions, filters, etc.
+
+  <info>php %command.full_name% date</info>
+
+The command lists everything that contains the word date.
+
+  <info>php %command.full_name% --format=json</info>
+
+The command lists everything in a machine readable json format.
+EOF
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $io = new SymfonyStyle($input, $output);
+        $twig = $this->getTwigEnvironment();
+
+        if (null === $twig) {
+            $io->error('The Twig environment needs to be set.');
+
+            return 1;
+        }
+
+        $types = array('functions', 'filters', 'tests', 'globals');
+
+        if ($input->getOption('format') === 'json') {
+            $data = array();
+            foreach ($types as $type) {
+                foreach ($twig->{'get'.ucfirst($type)}() as $name => $entity) {
+                    $data[$type][$name] = $this->getMetadata($type, $entity);
+                }
+            }
+            $data['tests'] = array_keys($data['tests']);
+            $io->writeln(json_encode($data));
+
+            return 0;
+        }
+
+        $filter = $input->getArgument('filter');
+
+        foreach ($types as $index => $type) {
+            $items = array();
+            foreach ($twig->{'get'.ucfirst($type)}() as $name => $entity) {
+                if (!$filter || false !== strpos($name, $filter)) {
+                    $items[$name] = $name.$this->getPrettyMetadata($type, $entity);
+                }
+            }
+
+            if (!$items) {
+                continue;
+            }
+
+            $io->section(ucfirst($type));
+
+            ksort($items);
+            $io->listing($items);
+        }
+
+        return 0;
+    }
+
+    private function getMetadata($type, $entity)
+    {
+        if ($type === 'globals') {
+            return $entity;
+        }
+        if ($type === 'tests') {
+            return;
+        }
+        if ($type === 'functions' || $type === 'filters') {
+            $cb = $entity->getCallable();
+            if (is_null($cb)) {
+                return;
+            }
+            if (is_array($cb)) {
+                if (!method_exists($cb[0], $cb[1])) {
+                    return;
+                }
+                $refl = new \ReflectionMethod($cb[0], $cb[1]);
+            } elseif (is_object($cb) && method_exists($cb, '__invoke')) {
+                $refl = new \ReflectionMethod($cb, '__invoke');
+            } elseif (function_exists($cb)) {
+                $refl = new \ReflectionFunction($cb);
+            } elseif (is_string($cb) && preg_match('{^(.+)::(.+)$}', $cb, $m) && method_exists($m[1], $m[2])) {
+                $refl = new \ReflectionMethod($m[1], $m[2]);
+            } else {
+                throw new \UnexpectedValueException('Unsupported callback type');
+            }
+
+            // filter out context/environment args
+            $args = array_filter($refl->getParameters(), function ($param) use ($entity) {
+                if ($entity->needsContext() && $param->getName() === 'context') {
+                    return false;
+                }
+
+                return !$param->getClass() || $param->getClass()->getName() !== 'Twig_Environment';
+            });
+
+            // format args
+            $args = array_map(function ($param) {
+                if ($param->isDefaultValueAvailable()) {
+                    return $param->getName().' = '.json_encode($param->getDefaultValue());
+                }
+
+                return $param->getName();
+            }, $args);
+
+            if ($type === 'filters') {
+                // remove the value the filter is applied on
+                array_shift($args);
+            }
+
+            return $args;
+        }
+    }
+
+    private function getPrettyMetadata($type, $entity)
+    {
+        if ($type === 'tests') {
+            return '';
+        }
+
+        try {
+            $meta = $this->getMetadata($type, $entity);
+            if ($meta === null) {
+                return '(unknown?)';
+            }
+        } catch (\UnexpectedValueException $e) {
+            return ' <error>'.$e->getMessage().'</error>';
+        }
+
+        if ($type === 'globals') {
+            if (is_object($meta)) {
+                return ' = object('.get_class($meta).')';
+            }
+
+            return ' = '.substr(@json_encode($meta), 0, 50);
+        }
+
+        if ($type === 'functions') {
+            return '('.implode(', ', $meta).')';
+        }
+
+        if ($type === 'filters') {
+            return $meta ? '('.implode(', ', $meta).')' : '';
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Command/LintCommand.php
@@ -0,0 +1,253 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\Finder\Finder;
+
+/**
+ * Command that will validate your template syntax and output encountered errors.
+ *
+ * @author Marc Weistroff <marc.weistroff@sensiolabs.com>
+ * @author Jérôme Tamarelle <jerome@tamarelle.net>
+ */
+class LintCommand extends Command
+{
+    private $twig;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct($name = 'lint:twig')
+    {
+        parent::__construct($name);
+    }
+
+    /**
+     * Sets the twig environment.
+     *
+     * @param \Twig_Environment $twig
+     */
+    public function setTwigEnvironment(\Twig_Environment $twig)
+    {
+        $this->twig = $twig;
+    }
+
+    /**
+     * @return \Twig_Environment $twig
+     */
+    protected function getTwigEnvironment()
+    {
+        return $this->twig;
+    }
+
+    protected function configure()
+    {
+        $this
+            ->setAliases(array('twig:lint'))
+            ->setDescription('Lints a template and outputs encountered errors')
+            ->addOption('format', null, InputOption::VALUE_REQUIRED, 'The output format', 'txt')
+            ->addArgument('filename', InputArgument::IS_ARRAY)
+            ->setHelp(<<<EOF
+The <info>%command.name%</info> command lints a template and outputs to STDOUT
+the first encountered syntax error.
+
+You can validate the syntax of contents passed from STDIN:
+
+  <info>cat filename | php %command.full_name%</info>
+
+Or the syntax of a file:
+
+  <info>php %command.full_name% filename</info>
+
+Or of a whole directory:
+
+  <info>php %command.full_name% dirname</info>
+  <info>php %command.full_name% dirname --format=json</info>
+
+EOF
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $io = new SymfonyStyle($input, $output);
+
+        if (false !== strpos($input->getFirstArgument(), ':l')) {
+            $io->caution('The use of "twig:lint" command is deprecated since version 2.7 and will be removed in 3.0. Use the "lint:twig" instead.');
+        }
+
+        if (null === $twig = $this->getTwigEnvironment()) {
+            $io->error('The Twig environment needs to be set.');
+
+            return 1;
+        }
+
+        $filenames = $input->getArgument('filename');
+
+        if (0 === count($filenames)) {
+            if (0 !== ftell(STDIN)) {
+                throw new \RuntimeException('Please provide a filename or pipe template content to STDIN.');
+            }
+
+            $template = '';
+            while (!feof(STDIN)) {
+                $template .= fread(STDIN, 1024);
+            }
+
+            return $this->display($input, $output, $io, array($this->validate($twig, $template, uniqid('sf_'))));
+        }
+
+        $filesInfo = $this->getFilesInfo($twig, $filenames);
+
+        return $this->display($input, $output, $io, $filesInfo);
+    }
+
+    private function getFilesInfo(\Twig_Environment $twig, array $filenames)
+    {
+        $filesInfo = array();
+        foreach ($filenames as $filename) {
+            foreach ($this->findFiles($filename) as $file) {
+                $filesInfo[] = $this->validate($twig, file_get_contents($file), $file);
+            }
+        }
+
+        return $filesInfo;
+    }
+
+    protected function findFiles($filename)
+    {
+        if (is_file($filename)) {
+            return array($filename);
+        } elseif (is_dir($filename)) {
+            return Finder::create()->files()->in($filename)->name('*.twig');
+        }
+
+        throw new \RuntimeException(sprintf('File or directory "%s" is not readable', $filename));
+    }
+
+    private function validate(\Twig_Environment $twig, $template, $file)
+    {
+        $realLoader = $twig->getLoader();
+        try {
+            $temporaryLoader = new \Twig_Loader_Array(array((string) $file => $template));
+            $twig->setLoader($temporaryLoader);
+            $nodeTree = $twig->parse($twig->tokenize($template, (string) $file));
+            $twig->compile($nodeTree);
+            $twig->setLoader($realLoader);
+        } catch (\Twig_Error $e) {
+            $twig->setLoader($realLoader);
+
+            return array('template' => $template, 'file' => $file, 'valid' => false, 'exception' => $e);
+        }
+
+        return array('template' => $template, 'file' => $file, 'valid' => true);
+    }
+
+    private function display(InputInterface $input, OutputInterface $output, SymfonyStyle $io, $files)
+    {
+        switch ($input->getOption('format')) {
+            case 'txt':
+                return $this->displayTxt($output, $io, $files);
+            case 'json':
+                return $this->displayJson($output, $files);
+            default:
+                throw new \InvalidArgumentException(sprintf('The format "%s" is not supported.', $input->getOption('format')));
+        }
+    }
+
+    private function displayTxt(OutputInterface $output, SymfonyStyle $io, $filesInfo)
+    {
+        $errors = 0;
+
+        foreach ($filesInfo as $info) {
+            if ($info['valid'] && $output->isVerbose()) {
+                $io->comment('<info>OK</info>'.($info['file'] ? sprintf(' in %s', $info['file']) : ''));
+            } elseif (!$info['valid']) {
+                ++$errors;
+                $this->renderException($io, $info['template'], $info['exception'], $info['file']);
+            }
+        }
+
+        if ($errors === 0) {
+            $io->success(sprintf('All %d Twig files contain valid syntax.', count($filesInfo)));
+        } else {
+            $io->warning(sprintf('%d Twig files have valid syntax and %d contain errors.', count($filesInfo) - $errors, $errors));
+        }
+
+        return min($errors, 1);
+    }
+
+    private function displayJson(OutputInterface $output, $filesInfo)
+    {
+        $errors = 0;
+
+        array_walk($filesInfo, function (&$v) use (&$errors) {
+            $v['file'] = (string) $v['file'];
+            unset($v['template']);
+            if (!$v['valid']) {
+                $v['message'] = $v['exception']->getMessage();
+                unset($v['exception']);
+                ++$errors;
+            }
+        });
+
+        $output->writeln(json_encode($filesInfo, defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0));
+
+        return min($errors, 1);
+    }
+
+    private function renderException(OutputInterface $output, $template, \Twig_Error $exception, $file = null)
+    {
+        $line = $exception->getTemplateLine();
+
+        if ($file) {
+            $output->text(sprintf('<error> ERROR </error> in %s (line %s)', $file, $line));
+        } else {
+            $output->text(sprintf('<error> ERROR </error> (line %s)', $line));
+        }
+
+        foreach ($this->getContext($template, $line) as $lineNumber => $code) {
+            $output->text(sprintf(
+                '%s %-6s %s',
+                $lineNumber === $line ? '<error> >> </error>' : '    ',
+                $lineNumber,
+                $code
+            ));
+            if ($lineNumber === $line) {
+                $output->text(sprintf('<error> >> %s</error> ', $exception->getRawMessage()));
+            }
+        }
+    }
+
+    private function getContext($template, $line, $context = 3)
+    {
+        $lines = explode("\n", $template);
+
+        $position = max(0, $line - $context);
+        $max = min(count($lines), $line - 1 + $context);
+
+        $result = array();
+        while ($position < $max) {
+            $result[$position + 1] = $lines[$position];
+            ++$position;
+        }
+
+        return $result;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/DataCollector/TwigDataCollector.php
@@ -0,0 +1,155 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\DataCollector;
+
+use Symfony\Component\HttpKernel\DataCollector\DataCollector;
+use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * TwigDataCollector.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TwigDataCollector extends DataCollector implements LateDataCollectorInterface
+{
+    private $profile;
+    private $computed;
+
+    public function __construct(\Twig_Profiler_Profile $profile)
+    {
+        $this->profile = $profile;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function collect(Request $request, Response $response, \Exception $exception = null)
+    {
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function lateCollect()
+    {
+        $this->data['profile'] = serialize($this->profile);
+    }
+
+    public function getTime()
+    {
+        return $this->getProfile()->getDuration() * 1000;
+    }
+
+    public function getTemplateCount()
+    {
+        return $this->getComputedData('template_count');
+    }
+
+    public function getTemplates()
+    {
+        return $this->getComputedData('templates');
+    }
+
+    public function getBlockCount()
+    {
+        return $this->getComputedData('block_count');
+    }
+
+    public function getMacroCount()
+    {
+        return $this->getComputedData('macro_count');
+    }
+
+    public function getHtmlCallGraph()
+    {
+        $dumper = new \Twig_Profiler_Dumper_Html();
+        $dump = $dumper->dump($this->getProfile());
+
+        // needed to remove the hardcoded CSS styles
+        $dump = str_replace(array(
+            '<span style="background-color: #ffd">',
+            '<span style="color: #d44">',
+            '<span style="background-color: #dfd">',
+        ), array(
+            '<span class="status-warning">',
+            '<span class="status-error">',
+            '<span class="status-success">',
+        ), $dump);
+
+        return new \Twig_Markup($dump, 'UTF-8');
+    }
+
+    public function getProfile()
+    {
+        if (null === $this->profile) {
+            $this->profile = unserialize($this->data['profile']);
+        }
+
+        return $this->profile;
+    }
+
+    private function getComputedData($index)
+    {
+        if (null === $this->computed) {
+            $this->computed = $this->computeData($this->getProfile());
+        }
+
+        return $this->computed[$index];
+    }
+
+    private function computeData(\Twig_Profiler_Profile $profile)
+    {
+        $data = array(
+            'template_count' => 0,
+            'block_count' => 0,
+            'macro_count' => 0,
+        );
+
+        $templates = array();
+        foreach ($profile as $p) {
+            $d = $this->computeData($p);
+
+            $data['template_count'] += ($p->isTemplate() ? 1 : 0) + $d['template_count'];
+            $data['block_count'] += ($p->isBlock() ? 1 : 0) + $d['block_count'];
+            $data['macro_count'] += ($p->isMacro() ? 1 : 0) + $d['macro_count'];
+
+            if ($p->isTemplate()) {
+                if (!isset($templates[$p->getTemplate()])) {
+                    $templates[$p->getTemplate()] = 1;
+                } else {
+                    ++$templates[$p->getTemplate()];
+                }
+            }
+
+            foreach ($d['templates'] as $template => $count) {
+                if (!isset($templates[$template])) {
+                    $templates[$template] = $count;
+                } else {
+                    $templates[$template] += $count;
+                }
+            }
+        }
+        $data['templates'] = $templates;
+
+        return $data;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'twig';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Extension/AssetExtension.php
@@ -0,0 +1,149 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Extension;
+
+use Symfony\Component\Asset\Packages;
+use Symfony\Component\Asset\VersionStrategy\StaticVersionStrategy;
+
+/**
+ * Twig extension for the Symfony Asset component.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class AssetExtension extends \Twig_Extension
+{
+    private $packages;
+    private $foundationExtension;
+
+    /**
+     * Passing an HttpFoundationExtension instance as a second argument must not be relied on
+     * as it's only there to maintain BC with older Symfony version. It will be removed in 3.0.
+     */
+    public function __construct(Packages $packages, HttpFoundationExtension $foundationExtension = null)
+    {
+        $this->packages = $packages;
+        $this->foundationExtension = $foundationExtension;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFunctions()
+    {
+        return array(
+            new \Twig_SimpleFunction('asset', array($this, 'getAssetUrl')),
+            new \Twig_SimpleFunction('asset_version', array($this, 'getAssetVersion')),
+            new \Twig_SimpleFunction('assets_version', array($this, 'getAssetsVersion'), array('deprecated' => true, 'alternative' => 'asset_version')),
+        );
+    }
+
+    /**
+     * Returns the public url/path of an asset.
+     *
+     * If the package used to generate the path is an instance of
+     * UrlPackage, you will always get a URL and not a path.
+     *
+     * @param string $path        A public path
+     * @param string $packageName The name of the asset package to use
+     *
+     * @return string The public path of the asset
+     */
+    public function getAssetUrl($path, $packageName = null, $absolute = false, $version = null)
+    {
+        // BC layer to be removed in 3.0
+        if (2 < $count = func_num_args()) {
+            @trigger_error('Generating absolute URLs with the Twig asset() function was deprecated in 2.7 and will be removed in 3.0. Please use absolute_url() instead.', E_USER_DEPRECATED);
+            if (4 === $count) {
+                @trigger_error('Forcing a version with the Twig asset() function was deprecated in 2.7 and will be removed in 3.0.', E_USER_DEPRECATED);
+            }
+
+            $args = func_get_args();
+
+            return $this->getLegacyAssetUrl($path, $packageName, $args[2], isset($args[3]) ? $args[3] : null);
+        }
+
+        return $this->packages->getUrl($path, $packageName);
+    }
+
+    /**
+     * Returns the version of an asset.
+     *
+     * @param string $path        A public path
+     * @param string $packageName The name of the asset package to use
+     *
+     * @return string The asset version
+     */
+    public function getAssetVersion($path, $packageName = null)
+    {
+        return $this->packages->getVersion($path, $packageName);
+    }
+
+    public function getAssetsVersion($packageName = null)
+    {
+        @trigger_error('The Twig assets_version() function was deprecated in 2.7 and will be removed in 3.0. Please use asset_version() instead.', E_USER_DEPRECATED);
+
+        return $this->packages->getVersion('/', $packageName);
+    }
+
+    private function getLegacyAssetUrl($path, $packageName = null, $absolute = false, $version = null)
+    {
+        if ($version) {
+            $package = $this->packages->getPackage($packageName);
+
+            $v = new \ReflectionProperty('Symfony\Component\Asset\Package', 'versionStrategy');
+            $v->setAccessible(true);
+
+            $currentVersionStrategy = $v->getValue($package);
+
+            if (property_exists($currentVersionStrategy, 'format')) {
+                $f = new \ReflectionProperty($currentVersionStrategy, 'format');
+                $f->setAccessible(true);
+
+                $format = $f->getValue($currentVersionStrategy);
+
+                $v->setValue($package, new StaticVersionStrategy($version, $format));
+            } else {
+                $v->setValue($package, new StaticVersionStrategy($version));
+            }
+        }
+
+        try {
+            $url = $this->packages->getUrl($path, $packageName);
+        } catch (\Exception $e) {
+            if ($version) {
+                $v->setValue($package, $currentVersionStrategy);
+            }
+
+            throw $e;
+        }
+
+        if ($version) {
+            $v->setValue($package, $currentVersionStrategy);
+        }
+
+        if ($absolute) {
+            return $this->foundationExtension->generateAbsoluteUrl($url);
+        }
+
+        return $url;
+    }
+
+    /**
+     * Returns the name of the extension.
+     *
+     * @return string The extension name
+     */
+    public function getName()
+    {
+        return 'asset';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Extension/CodeExtension.php
@@ -0,0 +1,241 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Extension;
+
+/**
+ * Twig extension relate to PHP code and used by the profiler and the default exception templates.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class CodeExtension extends \Twig_Extension
+{
+    private $fileLinkFormat;
+    private $rootDir;
+    private $charset;
+
+    /**
+     * Constructor.
+     *
+     * @param string $fileLinkFormat The format for links to source files
+     * @param string $rootDir        The project root directory
+     * @param string $charset        The charset
+     */
+    public function __construct($fileLinkFormat, $rootDir, $charset)
+    {
+        $this->fileLinkFormat = $fileLinkFormat ?: ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format');
+        $this->rootDir = str_replace('/', DIRECTORY_SEPARATOR, dirname($rootDir)).DIRECTORY_SEPARATOR;
+        $this->charset = $charset;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFilters()
+    {
+        return array(
+            new \Twig_SimpleFilter('abbr_class', array($this, 'abbrClass'), array('is_safe' => array('html'))),
+            new \Twig_SimpleFilter('abbr_method', array($this, 'abbrMethod'), array('is_safe' => array('html'))),
+            new \Twig_SimpleFilter('format_args', array($this, 'formatArgs'), array('is_safe' => array('html'))),
+            new \Twig_SimpleFilter('format_args_as_text', array($this, 'formatArgsAsText')),
+            new \Twig_SimpleFilter('file_excerpt', array($this, 'fileExcerpt'), array('is_safe' => array('html'))),
+            new \Twig_SimpleFilter('format_file', array($this, 'formatFile'), array('is_safe' => array('html'))),
+            new \Twig_SimpleFilter('format_file_from_text', array($this, 'formatFileFromText'), array('is_safe' => array('html'))),
+            new \Twig_SimpleFilter('file_link', array($this, 'getFileLink')),
+        );
+    }
+
+    public function abbrClass($class)
+    {
+        $parts = explode('\\', $class);
+        $short = array_pop($parts);
+
+        return sprintf('<abbr title="%s">%s</abbr>', $class, $short);
+    }
+
+    public function abbrMethod($method)
+    {
+        if (false !== strpos($method, '::')) {
+            list($class, $method) = explode('::', $method, 2);
+            $result = sprintf('%s::%s()', $this->abbrClass($class), $method);
+        } elseif ('Closure' === $method) {
+            $result = sprintf('<abbr title="%s">%s</abbr>', $method, $method);
+        } else {
+            $result = sprintf('<abbr title="%s">%s</abbr>()', $method, $method);
+        }
+
+        return $result;
+    }
+
+    /**
+     * Formats an array as a string.
+     *
+     * @param array $args The argument array
+     *
+     * @return string
+     */
+    public function formatArgs($args)
+    {
+        $result = array();
+        foreach ($args as $key => $item) {
+            if ('object' === $item[0]) {
+                $parts = explode('\\', $item[1]);
+                $short = array_pop($parts);
+                $formattedValue = sprintf('<em>object</em>(<abbr title="%s">%s</abbr>)', $item[1], $short);
+            } elseif ('array' === $item[0]) {
+                $formattedValue = sprintf('<em>array</em>(%s)', is_array($item[1]) ? $this->formatArgs($item[1]) : $item[1]);
+            } elseif ('string' === $item[0]) {
+                $formattedValue = sprintf("'%s'", htmlspecialchars($item[1], ENT_QUOTES, $this->charset));
+            } elseif ('null' === $item[0]) {
+                $formattedValue = '<em>null</em>';
+            } elseif ('boolean' === $item[0]) {
+                $formattedValue = '<em>'.strtolower(var_export($item[1], true)).'</em>';
+            } elseif ('resource' === $item[0]) {
+                $formattedValue = '<em>resource</em>';
+            } else {
+                $formattedValue = str_replace("\n", '', var_export(htmlspecialchars((string) $item[1], ENT_QUOTES, $this->charset), true));
+            }
+
+            $result[] = is_int($key) ? $formattedValue : sprintf("'%s' => %s", $key, $formattedValue);
+        }
+
+        return implode(', ', $result);
+    }
+
+    /**
+     * Formats an array as a string.
+     *
+     * @param array $args The argument array
+     *
+     * @return string
+     */
+    public function formatArgsAsText($args)
+    {
+        return strip_tags($this->formatArgs($args));
+    }
+
+    /**
+     * Returns an excerpt of a code file around the given line number.
+     *
+     * @param string $file A file path
+     * @param int    $line The selected line number
+     *
+     * @return string An HTML string
+     */
+    public function fileExcerpt($file, $line)
+    {
+        if (is_readable($file)) {
+            // highlight_file could throw warnings
+            // see https://bugs.php.net/bug.php?id=25725
+            $code = @highlight_file($file, true);
+            // remove main code/span tags
+            $code = preg_replace('#^<code.*?>\s*<span.*?>(.*)</span>\s*</code>#s', '\\1', $code);
+            $content = preg_split('#<br />#', $code);
+
+            $lines = array();
+            for ($i = max($line - 3, 1), $max = min($line + 3, count($content)); $i <= $max; ++$i) {
+                $lines[] = '<li'.($i == $line ? ' class="selected"' : '').'><code>'.self::fixCodeMarkup($content[$i - 1]).'</code></li>';
+            }
+
+            return '<ol start="'.max($line - 3, 1).'">'.implode("\n", $lines).'</ol>';
+        }
+    }
+
+    /**
+     * Formats a file path.
+     *
+     * @param string $file An absolute file path
+     * @param int    $line The line number
+     * @param string $text Use this text for the link rather than the file path
+     *
+     * @return string
+     */
+    public function formatFile($file, $line, $text = null)
+    {
+        $file = trim($file);
+
+        if (null === $text) {
+            $text = str_replace('/', DIRECTORY_SEPARATOR, $file);
+            if (0 === strpos($text, $this->rootDir)) {
+                $text = substr($text, strlen($this->rootDir));
+                $text = explode(DIRECTORY_SEPARATOR, $text, 2);
+                $text = sprintf('<abbr title="%s%2$s">%s</abbr>%s', $this->rootDir, $text[0], isset($text[1]) ? DIRECTORY_SEPARATOR.$text[1] : '');
+            }
+        }
+
+        $text = "$text at line $line";
+
+        if (false !== $link = $this->getFileLink($file, $line)) {
+            if (PHP_VERSION_ID >= 50400) {
+                $flags = ENT_QUOTES | ENT_SUBSTITUTE;
+            } else {
+                $flags = ENT_QUOTES;
+            }
+
+            return sprintf('<a href="%s" title="Click to open this file" class="file_link">%s</a>', htmlspecialchars($link, $flags, $this->charset), $text);
+        }
+
+        return $text;
+    }
+
+    /**
+     * Returns the link for a given file/line pair.
+     *
+     * @param string $file An absolute file path
+     * @param int    $line The line number
+     *
+     * @return string A link of false
+     */
+    public function getFileLink($file, $line)
+    {
+        if ($this->fileLinkFormat && is_file($file)) {
+            return strtr($this->fileLinkFormat, array('%f' => $file, '%l' => $line));
+        }
+
+        return false;
+    }
+
+    public function formatFileFromText($text)
+    {
+        $that = $this;
+
+        return preg_replace_callback('/in ("|&quot;)?(.+?)\1(?: +(?:on|at))? +line (\d+)/s', function ($match) use ($that) {
+            return 'in '.$that->formatFile($match[2], $match[3]);
+        }, $text);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'code';
+    }
+
+    protected static function fixCodeMarkup($line)
+    {
+        // </span> ending tag from previous line
+        $opening = strpos($line, '<span');
+        $closing = strpos($line, '</span>');
+        if (false !== $closing && (false === $opening || $closing < $opening)) {
+            $line = substr_replace($line, '', $closing, 7);
+        }
+
+        // missing </span> tag at the end of line
+        $opening = strpos($line, '<span');
+        $closing = strpos($line, '</span>');
+        if (false !== $opening && (false === $closing || $closing > $opening)) {
+            $line .= '</span>';
+        }
+
+        return $line;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Extension/DumpExtension.php
@@ -0,0 +1,79 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Extension;
+
+use Symfony\Bridge\Twig\TokenParser\DumpTokenParser;
+use Symfony\Component\VarDumper\Cloner\ClonerInterface;
+use Symfony\Component\VarDumper\Dumper\HtmlDumper;
+
+/**
+ * Provides integration of the dump() function with Twig.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class DumpExtension extends \Twig_Extension
+{
+    private $cloner;
+
+    public function __construct(ClonerInterface $cloner)
+    {
+        $this->cloner = $cloner;
+    }
+
+    public function getFunctions()
+    {
+        return array(
+            new \Twig_SimpleFunction('dump', array($this, 'dump'), array('is_safe' => array('html'), 'needs_context' => true, 'needs_environment' => true)),
+        );
+    }
+
+    public function getTokenParsers()
+    {
+        return array(new DumpTokenParser());
+    }
+
+    public function getName()
+    {
+        return 'dump';
+    }
+
+    public function dump(\Twig_Environment $env, $context)
+    {
+        if (!$env->isDebug()) {
+            return;
+        }
+
+        if (2 === func_num_args()) {
+            $vars = array();
+            foreach ($context as $key => $value) {
+                if (!$value instanceof \Twig_Template) {
+                    $vars[$key] = $value;
+                }
+            }
+
+            $vars = array($vars);
+        } else {
+            $vars = func_get_args();
+            unset($vars[0], $vars[1]);
+        }
+
+        $dump = fopen('php://memory', 'r+b');
+        $dumper = new HtmlDumper($dump, $env->getCharset());
+
+        foreach ($vars as $value) {
+            $dumper->dump($this->cloner->cloneVar($value));
+        }
+        rewind($dump);
+
+        return stream_get_contents($dump);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Extension/ExpressionExtension.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Extension;
+
+use Symfony\Component\ExpressionLanguage\Expression;
+
+/**
+ * ExpressionExtension gives a way to create Expressions from a template.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ExpressionExtension extends \Twig_Extension
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getFunctions()
+    {
+        return array(
+            new \Twig_SimpleFunction('expression', array($this, 'createExpression')),
+        );
+    }
+
+    public function createExpression($expression)
+    {
+        return new Expression($expression);
+    }
+
+    /**
+     * Returns the name of the extension.
+     *
+     * @return string The extension name
+     */
+    public function getName()
+    {
+        return 'expression';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Extension/FormExtension.php
@@ -0,0 +1,160 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Extension;
+
+use Symfony\Bridge\Twig\TokenParser\FormThemeTokenParser;
+use Symfony\Bridge\Twig\Form\TwigRendererInterface;
+use Symfony\Component\Form\Extension\Core\View\ChoiceView;
+
+/**
+ * FormExtension extends Twig with form capabilities.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class FormExtension extends \Twig_Extension implements \Twig_Extension_InitRuntimeInterface
+{
+    /**
+     * This property is public so that it can be accessed directly from compiled
+     * templates without having to call a getter, which slightly decreases performance.
+     *
+     * @var TwigRendererInterface
+     */
+    public $renderer;
+
+    public function __construct(TwigRendererInterface $renderer)
+    {
+        $this->renderer = $renderer;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function initRuntime(\Twig_Environment $environment)
+    {
+        $this->renderer->setEnvironment($environment);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTokenParsers()
+    {
+        return array(
+            // {% form_theme form "SomeBundle::widgets.twig" %}
+            new FormThemeTokenParser(),
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFunctions()
+    {
+        return array(
+            new \Twig_SimpleFunction('form_enctype', null, array('node_class' => 'Symfony\Bridge\Twig\Node\FormEnctypeNode', 'is_safe' => array('html'), 'deprecated' => true, 'alternative' => 'form_start')),
+            new \Twig_SimpleFunction('form_widget', null, array('node_class' => 'Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode', 'is_safe' => array('html'))),
+            new \Twig_SimpleFunction('form_errors', null, array('node_class' => 'Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode', 'is_safe' => array('html'))),
+            new \Twig_SimpleFunction('form_label', null, array('node_class' => 'Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode', 'is_safe' => array('html'))),
+            new \Twig_SimpleFunction('form_row', null, array('node_class' => 'Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode', 'is_safe' => array('html'))),
+            new \Twig_SimpleFunction('form_rest', null, array('node_class' => 'Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode', 'is_safe' => array('html'))),
+            new \Twig_SimpleFunction('form', null, array('node_class' => 'Symfony\Bridge\Twig\Node\RenderBlockNode', 'is_safe' => array('html'))),
+            new \Twig_SimpleFunction('form_start', null, array('node_class' => 'Symfony\Bridge\Twig\Node\RenderBlockNode', 'is_safe' => array('html'))),
+            new \Twig_SimpleFunction('form_end', null, array('node_class' => 'Symfony\Bridge\Twig\Node\RenderBlockNode', 'is_safe' => array('html'))),
+            new \Twig_SimpleFunction('csrf_token', array($this, 'renderCsrfToken')),
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFilters()
+    {
+        return array(
+            new \Twig_SimpleFilter('humanize', array($this, 'humanize')),
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTests()
+    {
+        return array(
+            new \Twig_SimpleTest('selectedchoice', array($this, 'isSelectedChoice')),
+        );
+    }
+
+    /**
+     * Renders a CSRF token.
+     *
+     * @param string $intention The intention of the protected action
+     *
+     * @return string A CSRF token
+     */
+    public function renderCsrfToken($intention)
+    {
+        return $this->renderer->renderCsrfToken($intention);
+    }
+
+    /**
+     * Makes a technical name human readable.
+     *
+     * @param string $text The text to humanize
+     *
+     * @return string The humanized text
+     */
+    public function humanize($text)
+    {
+        return $this->renderer->humanize($text);
+    }
+
+    /**
+     * Returns whether a choice is selected for a given form value.
+     *
+     * Unfortunately Twig does not support an efficient way to execute the
+     * "is_selected" closure passed to the template by ChoiceType. It is faster
+     * to implement the logic here (around 65ms for a specific form).
+     *
+     * Directly implementing the logic here is also faster than doing so in
+     * ChoiceView (around 30ms).
+     *
+     * The worst option tested so far is to implement the logic in ChoiceView
+     * and access the ChoiceView method directly in the template. Doing so is
+     * around 220ms slower than doing the method call here in the filter. Twig
+     * seems to be much more efficient at executing filters than at executing
+     * methods of an object.
+     *
+     * @param ChoiceView   $choice        The choice to check
+     * @param string|array $selectedValue The selected value to compare
+     *
+     * @return bool Whether the choice is selected
+     *
+     * @see ChoiceView::isSelected()
+     */
+    public function isSelectedChoice(ChoiceView $choice, $selectedValue)
+    {
+        if (is_array($selectedValue)) {
+            return in_array($choice->value, $selectedValue, true);
+        }
+
+        return $choice->value === $selectedValue;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'form';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Extension/HttpFoundationExtension.php
@@ -0,0 +1,129 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Extension;
+
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\RequestContext;
+
+/**
+ * Twig extension for the Symfony HttpFoundation component.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class HttpFoundationExtension extends \Twig_Extension
+{
+    private $requestStack;
+    private $requestContext;
+
+    public function __construct(RequestStack $requestStack, RequestContext $requestContext = null)
+    {
+        $this->requestStack = $requestStack;
+        $this->requestContext = $requestContext;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFunctions()
+    {
+        return array(
+            new \Twig_SimpleFunction('absolute_url', array($this, 'generateAbsoluteUrl')),
+            new \Twig_SimpleFunction('relative_path', array($this, 'generateRelativePath')),
+        );
+    }
+
+    /**
+     * Returns the absolute URL for the given absolute or relative path.
+     *
+     * This method returns the path unchanged if no request is available.
+     *
+     * @param string $path The path
+     *
+     * @return string The absolute URL
+     *
+     * @see Request::getUriForPath()
+     */
+    public function generateAbsoluteUrl($path)
+    {
+        if (false !== strpos($path, '://') || '//' === substr($path, 0, 2)) {
+            return $path;
+        }
+
+        if (!$request = $this->requestStack->getMasterRequest()) {
+            if (null !== $this->requestContext && '' !== $host = $this->requestContext->getHost()) {
+                $scheme = $this->requestContext->getScheme();
+                $port = '';
+
+                if ('http' === $scheme && 80 != $this->requestContext->getHttpPort()) {
+                    $port = ':'.$this->requestContext->getHttpPort();
+                } elseif ('https' === $scheme && 443 != $this->requestContext->getHttpsPort()) {
+                    $port = ':'.$this->requestContext->getHttpsPort();
+                }
+
+                if ('/' !== $path[0]) {
+                    $path = rtrim($this->requestContext->getBaseUrl(), '/').'/'.$path;
+                }
+
+                return $scheme.'://'.$host.$port.$path;
+            }
+
+            return $path;
+        }
+
+        if (!$path || '/' !== $path[0]) {
+            $prefix = $request->getPathInfo();
+            $last = strlen($prefix) - 1;
+            if ($last !== $pos = strrpos($prefix, '/')) {
+                $prefix = substr($prefix, 0, $pos).'/';
+            }
+
+            return $request->getUriForPath($prefix.$path);
+        }
+
+        return $request->getSchemeAndHttpHost().$path;
+    }
+
+    /**
+     * Returns a relative path based on the current Request.
+     *
+     * This method returns the path unchanged if no request is available.
+     *
+     * @param string $path The path
+     *
+     * @return string The relative path
+     *
+     * @see Request::getRelativeUriForPath()
+     */
+    public function generateRelativePath($path)
+    {
+        if (false !== strpos($path, '://') || '//' === substr($path, 0, 2)) {
+            return $path;
+        }
+
+        if (!$request = $this->requestStack->getMasterRequest()) {
+            return $path;
+        }
+
+        return $request->getRelativeUriForPath($path);
+    }
+
+    /**
+     * Returns the name of the extension.
+     *
+     * @return string The extension name
+     */
+    public function getName()
+    {
+        return 'request';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Extension/HttpKernelExtension.php
@@ -0,0 +1,91 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Extension;
+
+use Symfony\Component\HttpKernel\Fragment\FragmentHandler;
+use Symfony\Component\HttpKernel\Controller\ControllerReference;
+
+/**
+ * Provides integration with the HttpKernel component.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class HttpKernelExtension extends \Twig_Extension
+{
+    private $handler;
+
+    /**
+     * Constructor.
+     *
+     * @param FragmentHandler $handler A FragmentHandler instance
+     */
+    public function __construct(FragmentHandler $handler)
+    {
+        $this->handler = $handler;
+    }
+
+    public function getFunctions()
+    {
+        return array(
+            new \Twig_SimpleFunction('render', array($this, 'renderFragment'), array('is_safe' => array('html'))),
+            new \Twig_SimpleFunction('render_*', array($this, 'renderFragmentStrategy'), array('is_safe' => array('html'))),
+            new \Twig_SimpleFunction('controller', array($this, 'controller')),
+        );
+    }
+
+    /**
+     * Renders a fragment.
+     *
+     * @param string|ControllerReference $uri     A URI as a string or a ControllerReference instance
+     * @param array                      $options An array of options
+     *
+     * @return string The fragment content
+     *
+     * @see FragmentHandler::render()
+     */
+    public function renderFragment($uri, $options = array())
+    {
+        $strategy = isset($options['strategy']) ? $options['strategy'] : 'inline';
+        unset($options['strategy']);
+
+        return $this->handler->render($uri, $strategy, $options);
+    }
+
+    /**
+     * Renders a fragment.
+     *
+     * @param string                     $strategy A strategy name
+     * @param string|ControllerReference $uri      A URI as a string or a ControllerReference instance
+     * @param array                      $options  An array of options
+     *
+     * @return string The fragment content
+     *
+     * @see FragmentHandler::render()
+     */
+    public function renderFragmentStrategy($strategy, $uri, $options = array())
+    {
+        return $this->handler->render($uri, $strategy, $options);
+    }
+
+    public function controller($controller, $attributes = array(), $query = array())
+    {
+        return new ControllerReference($controller, $attributes, $query);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'http_kernel';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Extension/LogoutUrlExtension.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Extension;
+
+use Symfony\Component\Security\Http\Logout\LogoutUrlGenerator;
+
+/**
+ * LogoutUrlHelper provides generator functions for the logout URL to Twig.
+ *
+ * @author Jeremy Mikola <jmikola@gmail.com>
+ */
+class LogoutUrlExtension extends \Twig_Extension
+{
+    private $generator;
+
+    public function __construct(LogoutUrlGenerator $generator)
+    {
+        $this->generator = $generator;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFunctions()
+    {
+        return array(
+            new \Twig_SimpleFunction('logout_url', array($this, 'getLogoutUrl')),
+            new \Twig_SimpleFunction('logout_path', array($this, 'getLogoutPath')),
+        );
+    }
+
+    /**
+     * Generates the relative logout URL for the firewall.
+     *
+     * @param string|null $key The firewall key or null to use the current firewall key
+     *
+     * @return string The relative logout URL
+     */
+    public function getLogoutPath($key = null)
+    {
+        return $this->generator->getLogoutPath($key);
+    }
+
+    /**
+     * Generates the absolute logout URL for the firewall.
+     *
+     * @param string|null $key The firewall key or null to use the current firewall key
+     *
+     * @return string The absolute logout URL
+     */
+    public function getLogoutUrl($key = null)
+    {
+        return $this->generator->getLogoutUrl($key);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'logout_url';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Extension/ProfilerExtension.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Extension;
+
+use Symfony\Component\Stopwatch\Stopwatch;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ProfilerExtension extends \Twig_Extension_Profiler
+{
+    private $stopwatch;
+    private $events;
+
+    public function __construct(\Twig_Profiler_Profile $profile, Stopwatch $stopwatch = null)
+    {
+        parent::__construct($profile);
+
+        $this->stopwatch = $stopwatch;
+        $this->events = new \SplObjectStorage();
+    }
+
+    public function enter(\Twig_Profiler_Profile $profile)
+    {
+        if ($this->stopwatch && $profile->isTemplate()) {
+            $this->events[$profile] = $this->stopwatch->start($profile->getName(), 'template');
+        }
+
+        parent::enter($profile);
+    }
+
+    public function leave(\Twig_Profiler_Profile $profile)
+    {
+        parent::leave($profile);
+
+        if ($this->stopwatch && $profile->isTemplate()) {
+            $this->events[$profile]->stop();
+            unset($this->events[$profile]);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'native_profiler';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Extension/RoutingExtension.php
@@ -0,0 +1,98 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Extension;
+
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+
+/**
+ * Provides integration of the Routing component with Twig.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class RoutingExtension extends \Twig_Extension
+{
+    private $generator;
+
+    public function __construct(UrlGeneratorInterface $generator)
+    {
+        $this->generator = $generator;
+    }
+
+    /**
+     * Returns a list of functions to add to the existing list.
+     *
+     * @return array An array of functions
+     */
+    public function getFunctions()
+    {
+        return array(
+            new \Twig_SimpleFunction('url', array($this, 'getUrl'), array('is_safe_callback' => array($this, 'isUrlGenerationSafe'))),
+            new \Twig_SimpleFunction('path', array($this, 'getPath'), array('is_safe_callback' => array($this, 'isUrlGenerationSafe'))),
+        );
+    }
+
+    public function getPath($name, $parameters = array(), $relative = false)
+    {
+        return $this->generator->generate($name, $parameters, $relative ? UrlGeneratorInterface::RELATIVE_PATH : UrlGeneratorInterface::ABSOLUTE_PATH);
+    }
+
+    public function getUrl($name, $parameters = array(), $schemeRelative = false)
+    {
+        return $this->generator->generate($name, $parameters, $schemeRelative ? UrlGeneratorInterface::NETWORK_PATH : UrlGeneratorInterface::ABSOLUTE_URL);
+    }
+
+    /**
+     * Determines at compile time whether the generated URL will be safe and thus
+     * saving the unneeded automatic escaping for performance reasons.
+     *
+     * The URL generation process percent encodes non-alphanumeric characters. So there is no risk
+     * that malicious/invalid characters are part of the URL. The only character within an URL that
+     * must be escaped in html is the ampersand ("&") which separates query params. So we cannot mark
+     * the URL generation as always safe, but only when we are sure there won't be multiple query
+     * params. This is the case when there are none or only one constant parameter given.
+     * E.g. we know beforehand this will be safe:
+     * - path('route')
+     * - path('route', {'param': 'value'})
+     * But the following may not:
+     * - path('route', var)
+     * - path('route', {'param': ['val1', 'val2'] }) // a sub-array
+     * - path('route', {'param1': 'value1', 'param2': 'value2'})
+     * If param1 and param2 reference placeholder in the route, it would still be safe. But we don't know.
+     *
+     * @param \Twig_Node $argsNode The arguments of the path/url function
+     *
+     * @return array An array with the contexts the URL is safe
+     */
+    public function isUrlGenerationSafe(\Twig_Node $argsNode)
+    {
+        // support named arguments
+        $paramsNode = $argsNode->hasNode('parameters') ? $argsNode->getNode('parameters') : (
+            $argsNode->hasNode(1) ? $argsNode->getNode(1) : null
+        );
+
+        if (null === $paramsNode || $paramsNode instanceof \Twig_Node_Expression_Array && count($paramsNode) <= 2 &&
+            (!$paramsNode->hasNode(1) || $paramsNode->getNode(1) instanceof \Twig_Node_Expression_Constant)
+        ) {
+            return array('html');
+        }
+
+        return array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'routing';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Extension/SecurityExtension.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Extension;
+
+use Symfony\Component\Security\Acl\Voter\FieldVote;
+use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
+use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
+
+/**
+ * SecurityExtension exposes security context features.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class SecurityExtension extends \Twig_Extension
+{
+    private $securityChecker;
+
+    public function __construct(AuthorizationCheckerInterface $securityChecker = null)
+    {
+        $this->securityChecker = $securityChecker;
+    }
+
+    public function isGranted($role, $object = null, $field = null)
+    {
+        if (null === $this->securityChecker) {
+            return false;
+        }
+
+        if (null !== $field) {
+            $object = new FieldVote($object, $field);
+        }
+
+        try {
+            return $this->securityChecker->isGranted($role, $object);
+        } catch (AuthenticationCredentialsNotFoundException $e) {
+            return false;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFunctions()
+    {
+        return array(
+            new \Twig_SimpleFunction('is_granted', array($this, 'isGranted')),
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'security';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Extension/StopwatchExtension.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Extension;
+
+use Symfony\Component\Stopwatch\Stopwatch;
+use Symfony\Bridge\Twig\TokenParser\StopwatchTokenParser;
+
+/**
+ * Twig extension for the stopwatch helper.
+ *
+ * @author Wouter J <wouter@wouterj.nl>
+ */
+class StopwatchExtension extends \Twig_Extension
+{
+    private $stopwatch;
+
+    /**
+     * @var bool
+     */
+    private $enabled;
+
+    public function __construct(Stopwatch $stopwatch = null, $enabled = true)
+    {
+        $this->stopwatch = $stopwatch;
+        $this->enabled = $enabled;
+    }
+
+    public function getStopwatch()
+    {
+        return $this->stopwatch;
+    }
+
+    public function getTokenParsers()
+    {
+        return array(
+            /*
+             * {% stopwatch foo %}
+             * Some stuff which will be recorded on the timeline
+             * {% endstopwatch %}
+             */
+            new StopwatchTokenParser($this->stopwatch !== null && $this->enabled),
+        );
+    }
+
+    public function getName()
+    {
+        return 'stopwatch';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Extension/TranslationExtension.php
@@ -0,0 +1,108 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Extension;
+
+use Symfony\Bridge\Twig\TokenParser\TransTokenParser;
+use Symfony\Bridge\Twig\TokenParser\TransChoiceTokenParser;
+use Symfony\Bridge\Twig\TokenParser\TransDefaultDomainTokenParser;
+use Symfony\Component\Translation\TranslatorInterface;
+use Symfony\Bridge\Twig\NodeVisitor\TranslationNodeVisitor;
+use Symfony\Bridge\Twig\NodeVisitor\TranslationDefaultDomainNodeVisitor;
+
+/**
+ * Provides integration of the Translation component with Twig.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TranslationExtension extends \Twig_Extension
+{
+    private $translator;
+    private $translationNodeVisitor;
+
+    public function __construct(TranslatorInterface $translator, \Twig_NodeVisitorInterface $translationNodeVisitor = null)
+    {
+        if (!$translationNodeVisitor) {
+            $translationNodeVisitor = new TranslationNodeVisitor();
+        }
+
+        $this->translator = $translator;
+        $this->translationNodeVisitor = $translationNodeVisitor;
+    }
+
+    public function getTranslator()
+    {
+        return $this->translator;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFilters()
+    {
+        return array(
+            new \Twig_SimpleFilter('trans', array($this, 'trans')),
+            new \Twig_SimpleFilter('transchoice', array($this, 'transchoice')),
+        );
+    }
+
+    /**
+     * Returns the token parser instance to add to the existing list.
+     *
+     * @return array An array of Twig_TokenParser instances
+     */
+    public function getTokenParsers()
+    {
+        return array(
+            // {% trans %}Symfony is great!{% endtrans %}
+            new TransTokenParser(),
+
+            // {% transchoice count %}
+            //     {0} There is no apples|{1} There is one apple|]1,Inf] There is {{ count }} apples
+            // {% endtranschoice %}
+            new TransChoiceTokenParser(),
+
+            // {% trans_default_domain "foobar" %}
+            new TransDefaultDomainTokenParser(),
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getNodeVisitors()
+    {
+        return array($this->translationNodeVisitor, new TranslationDefaultDomainNodeVisitor());
+    }
+
+    public function getTranslationNodeVisitor()
+    {
+        return $this->translationNodeVisitor;
+    }
+
+    public function trans($message, array $arguments = array(), $domain = null, $locale = null)
+    {
+        return $this->translator->trans($message, $arguments, $domain, $locale);
+    }
+
+    public function transchoice($message, $count, array $arguments = array(), $domain = null, $locale = null)
+    {
+        return $this->translator->transChoice($message, $count, array_merge(array('%count%' => $count), $arguments), $domain, $locale);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'translator';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Extension/YamlExtension.php
@@ -0,0 +1,70 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Extension;
+
+use Symfony\Component\Yaml\Dumper as YamlDumper;
+use Symfony\Component\Yaml\Yaml;
+
+/**
+ * Provides integration of the Yaml component with Twig.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class YamlExtension extends \Twig_Extension
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getFilters()
+    {
+        return array(
+            new \Twig_SimpleFilter('yaml_encode', array($this, 'encode')),
+            new \Twig_SimpleFilter('yaml_dump', array($this, 'dump')),
+        );
+    }
+
+    public function encode($input, $inline = 0, $dumpObjects = false)
+    {
+        static $dumper;
+
+        if (null === $dumper) {
+            $dumper = new YamlDumper();
+        }
+
+        if (defined('Symfony\Component\Yaml\Yaml::DUMP_OBJECT')) {
+            return $dumper->dump($input, $inline, 0, is_bool($dumpObjects) ? Yaml::DUMP_OBJECT : 0);
+        }
+
+        return $dumper->dump($input, $inline, 0, false, $dumpObjects);
+    }
+
+    public function dump($value, $inline = 0, $dumpObjects = false)
+    {
+        if (is_resource($value)) {
+            return '%Resource%';
+        }
+
+        if (is_array($value) || is_object($value)) {
+            return '%'.gettype($value).'% '.$this->encode($value, $inline, $dumpObjects);
+        }
+
+        return $this->encode($value, $inline, $dumpObjects);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'yaml';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Form/TwigRenderer.php
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Form;
+
+use Symfony\Component\Form\FormRenderer;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class TwigRenderer extends FormRenderer implements TwigRendererInterface
+{
+    /**
+     * @var TwigRendererEngineInterface
+     */
+    private $engine;
+
+    public function __construct(TwigRendererEngineInterface $engine, $csrfTokenManager = null)
+    {
+        parent::__construct($engine, $csrfTokenManager);
+
+        $this->engine = $engine;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setEnvironment(\Twig_Environment $environment)
+    {
+        $this->engine->setEnvironment($environment);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Form/TwigRendererEngine.php
@@ -0,0 +1,185 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Form;
+
+use Symfony\Component\Form\AbstractRendererEngine;
+use Symfony\Component\Form\FormView;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class TwigRendererEngine extends AbstractRendererEngine implements TwigRendererEngineInterface
+{
+    /**
+     * @var \Twig_Environment
+     */
+    private $environment;
+
+    /**
+     * @var \Twig_Template
+     */
+    private $template;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setEnvironment(\Twig_Environment $environment)
+    {
+        $this->environment = $environment;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function renderBlock(FormView $view, $resource, $blockName, array $variables = array())
+    {
+        $cacheKey = $view->vars[self::CACHE_KEY_VAR];
+
+        $context = $this->environment->mergeGlobals($variables);
+
+        ob_start();
+
+        // By contract,This method can only be called after getting the resource
+        // (which is passed to the method). Getting a resource for the first time
+        // (with an empty cache) is guaranteed to invoke loadResourcesFromTheme(),
+        // where the property $template is initialized.
+
+        // We do not call renderBlock here to avoid too many nested level calls
+        // (XDebug limits the level to 100 by default)
+        $this->template->displayBlock($blockName, $context, $this->resources[$cacheKey]);
+
+        return ob_get_clean();
+    }
+
+    /**
+     * Loads the cache with the resource for a given block name.
+     *
+     * This implementation eagerly loads all blocks of the themes assigned to the given view
+     * and all of its ancestors views. This is necessary, because Twig receives the
+     * list of blocks later. At that point, all blocks must already be loaded, for the
+     * case that the function "block()" is used in the Twig template.
+     *
+     * @see getResourceForBlock()
+     *
+     * @param string   $cacheKey  The cache key of the form view
+     * @param FormView $view      The form view for finding the applying themes
+     * @param string   $blockName The name of the block to load
+     *
+     * @return bool True if the resource could be loaded, false otherwise
+     */
+    protected function loadResourceForBlockName($cacheKey, FormView $view, $blockName)
+    {
+        // The caller guarantees that $this->resources[$cacheKey][$block] is
+        // not set, but it doesn't have to check whether $this->resources[$cacheKey]
+        // is set. If $this->resources[$cacheKey] is set, all themes for this
+        // $cacheKey are already loaded (due to the eager population, see doc comment).
+        if (isset($this->resources[$cacheKey])) {
+            // As said in the previous, the caller guarantees that
+            // $this->resources[$cacheKey][$block] is not set. Since the themes are
+            // already loaded, it can only be a non-existing block.
+            $this->resources[$cacheKey][$blockName] = false;
+
+            return false;
+        }
+
+        // Recursively try to find the block in the themes assigned to $view,
+        // then of its parent view, then of the parent view of the parent and so on.
+        // When the root view is reached in this recursion, also the default
+        // themes are taken into account.
+
+        // Check each theme whether it contains the searched block
+        if (isset($this->themes[$cacheKey])) {
+            for ($i = count($this->themes[$cacheKey]) - 1; $i >= 0; --$i) {
+                $this->loadResourcesFromTheme($cacheKey, $this->themes[$cacheKey][$i]);
+                // CONTINUE LOADING (see doc comment)
+            }
+        }
+
+        // Check the default themes once we reach the root view without success
+        if (!$view->parent) {
+            for ($i = count($this->defaultThemes) - 1; $i >= 0; --$i) {
+                $this->loadResourcesFromTheme($cacheKey, $this->defaultThemes[$i]);
+                // CONTINUE LOADING (see doc comment)
+            }
+        }
+
+        // Proceed with the themes of the parent view
+        if ($view->parent) {
+            $parentCacheKey = $view->parent->vars[self::CACHE_KEY_VAR];
+
+            if (!isset($this->resources[$parentCacheKey])) {
+                $this->loadResourceForBlockName($parentCacheKey, $view->parent, $blockName);
+            }
+
+            // EAGER CACHE POPULATION (see doc comment)
+            foreach ($this->resources[$parentCacheKey] as $nestedBlockName => $resource) {
+                if (!isset($this->resources[$cacheKey][$nestedBlockName])) {
+                    $this->resources[$cacheKey][$nestedBlockName] = $resource;
+                }
+            }
+        }
+
+        // Even though we loaded the themes, it can happen that none of them
+        // contains the searched block
+        if (!isset($this->resources[$cacheKey][$blockName])) {
+            // Cache that we didn't find anything to speed up further accesses
+            $this->resources[$cacheKey][$blockName] = false;
+        }
+
+        return false !== $this->resources[$cacheKey][$blockName];
+    }
+
+    /**
+     * Loads the resources for all blocks in a theme.
+     *
+     * @param string $cacheKey The cache key for storing the resource
+     * @param mixed  $theme    The theme to load the block from. This parameter
+     *                         is passed by reference, because it might be necessary
+     *                         to initialize the theme first. Any changes made to
+     *                         this variable will be kept and be available upon
+     *                         further calls to this method using the same theme.
+     */
+    protected function loadResourcesFromTheme($cacheKey, &$theme)
+    {
+        if (!$theme instanceof \Twig_Template) {
+            /* @var \Twig_Template $theme */
+            $theme = $this->environment->loadTemplate($theme);
+        }
+
+        if (null === $this->template) {
+            // Store the first \Twig_Template instance that we find so that
+            // we can call displayBlock() later on. It doesn't matter *which*
+            // template we use for that, since we pass the used blocks manually
+            // anyway.
+            $this->template = $theme;
+        }
+
+        // Use a separate variable for the inheritance traversal, because
+        // theme is a reference and we don't want to change it.
+        $currentTheme = $theme;
+
+        $context = $this->environment->mergeGlobals(array());
+
+        // The do loop takes care of template inheritance.
+        // Add blocks from all templates in the inheritance tree, but avoid
+        // overriding blocks already set.
+        do {
+            foreach ($currentTheme->getBlocks() as $block => $blockData) {
+                if (!isset($this->resources[$cacheKey][$block])) {
+                    // The resource given back is the key to the bucket that
+                    // contains this block.
+                    $this->resources[$cacheKey][$block] = $blockData;
+                }
+            }
+        } while (false !== $currentTheme = $currentTheme->getParent($context));
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Form/TwigRendererEngineInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Form;
+
+use Symfony\Component\Form\FormRendererEngineInterface;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+interface TwigRendererEngineInterface extends FormRendererEngineInterface
+{
+    /**
+     * Sets Twig's environment.
+     *
+     * @param \Twig_Environment $environment
+     */
+    public function setEnvironment(\Twig_Environment $environment);
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Form/TwigRendererInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Form;
+
+use Symfony\Component\Form\FormRendererInterface;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+interface TwigRendererInterface extends FormRendererInterface
+{
+    /**
+     * Sets Twig's environment.
+     *
+     * @param \Twig_Environment $environment
+     */
+    public function setEnvironment(\Twig_Environment $environment);
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2016 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Node/DumpNode.php
@@ -0,0 +1,84 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Node;
+
+/**
+ * @author Julien Galenski <julien.galenski@gmail.com>
+ */
+class DumpNode extends \Twig_Node
+{
+    private $varPrefix;
+
+    public function __construct($varPrefix, \Twig_Node $values = null, $lineno, $tag = null)
+    {
+        parent::__construct(array('values' => $values), array(), $lineno, $tag);
+        $this->varPrefix = $varPrefix;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function compile(\Twig_Compiler $compiler)
+    {
+        $compiler
+            ->write("if (\$this->env->isDebug()) {\n")
+            ->indent();
+
+        $values = $this->getNode('values');
+
+        if (null === $values) {
+            // remove embedded templates (macros) from the context
+            $compiler
+                ->write(sprintf('$%svars = array();'."\n", $this->varPrefix))
+                ->write(sprintf('foreach ($context as $%1$skey => $%1$sval) {'."\n", $this->varPrefix))
+                ->indent()
+                ->write(sprintf('if (!$%sval instanceof \Twig_Template) {'."\n", $this->varPrefix))
+                ->indent()
+                ->write(sprintf('$%1$svars[$%1$skey] = $%1$sval;'."\n", $this->varPrefix))
+                ->outdent()
+                ->write("}\n")
+                ->outdent()
+                ->write("}\n")
+                ->addDebugInfo($this)
+                ->write(sprintf('\Symfony\Component\VarDumper\VarDumper::dump($%svars);'."\n", $this->varPrefix));
+        } elseif (1 === $values->count()) {
+            $compiler
+                ->addDebugInfo($this)
+                ->write('\Symfony\Component\VarDumper\VarDumper::dump(')
+                ->subcompile($values->getNode(0))
+                ->raw(");\n");
+        } else {
+            $compiler
+                ->addDebugInfo($this)
+                ->write('\Symfony\Component\VarDumper\VarDumper::dump(array('."\n")
+                ->indent();
+            foreach ($values as $node) {
+                $compiler->addIndentation();
+                if ($node->hasAttribute('name')) {
+                    $compiler
+                        ->string($node->getAttribute('name'))
+                        ->raw(' => ');
+                }
+                $compiler
+                    ->subcompile($node)
+                    ->raw(",\n");
+            }
+            $compiler
+                ->outdent()
+                ->write("));\n");
+        }
+
+        $compiler
+            ->outdent()
+            ->write("}\n");
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Node/FormEnctypeNode.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Node;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @deprecated since version 2.3, to be removed in 3.0. Use the helper "form_start()" instead.
+ */
+class FormEnctypeNode extends SearchAndRenderBlockNode
+{
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Node/FormThemeNode.php
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Node;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class FormThemeNode extends \Twig_Node
+{
+    public function __construct(\Twig_Node $form, \Twig_Node $resources, $lineno, $tag = null)
+    {
+        parent::__construct(array('form' => $form, 'resources' => $resources), array(), $lineno, $tag);
+    }
+
+    /**
+     * Compiles the node to PHP.
+     *
+     * @param \Twig_Compiler $compiler A Twig_Compiler instance
+     */
+    public function compile(\Twig_Compiler $compiler)
+    {
+        $compiler
+            ->addDebugInfo($this)
+            ->write('$this->env->getExtension(\'form\')->renderer->setTheme(')
+            ->subcompile($this->getNode('form'))
+            ->raw(', ')
+            ->subcompile($this->getNode('resources'))
+            ->raw(");\n");
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Node/RenderBlockNode.php
@@ -0,0 +1,42 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Node;
+
+/**
+ * Compiles a call to {@link \Symfony\Component\Form\FormRendererInterface::renderBlock()}.
+ *
+ * The function name is used as block name. For example, if the function name
+ * is "foo", the block "foo" will be rendered.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class RenderBlockNode extends \Twig_Node_Expression_Function
+{
+    public function compile(\Twig_Compiler $compiler)
+    {
+        $compiler->addDebugInfo($this);
+        $arguments = iterator_to_array($this->getNode('arguments'));
+        $compiler->write('$this->env->getExtension(\'form\')->renderer->renderBlock(');
+
+        if (isset($arguments[0])) {
+            $compiler->subcompile($arguments[0]);
+            $compiler->raw(', \''.$this->getAttribute('name').'\'');
+
+            if (isset($arguments[1])) {
+                $compiler->raw(', ');
+                $compiler->subcompile($arguments[1]);
+            }
+        }
+
+        $compiler->raw(')');
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Node/SearchAndRenderBlockNode.php
@@ -0,0 +1,106 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Node;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class SearchAndRenderBlockNode extends \Twig_Node_Expression_Function
+{
+    public function compile(\Twig_Compiler $compiler)
+    {
+        $compiler->addDebugInfo($this);
+        $compiler->raw('$this->env->getExtension(\'form\')->renderer->searchAndRenderBlock(');
+
+        preg_match('/_([^_]+)$/', $this->getAttribute('name'), $matches);
+
+        $label = null;
+        $arguments = iterator_to_array($this->getNode('arguments'));
+        $blockNameSuffix = $matches[1];
+
+        if (isset($arguments[0])) {
+            $compiler->subcompile($arguments[0]);
+            $compiler->raw(', \''.$blockNameSuffix.'\'');
+
+            if (isset($arguments[1])) {
+                if ('label' === $blockNameSuffix) {
+                    // The "label" function expects the label in the second and
+                    // the variables in the third argument
+                    $label = $arguments[1];
+                    $variables = isset($arguments[2]) ? $arguments[2] : null;
+                    $lineno = $label->getLine();
+
+                    if ($label instanceof \Twig_Node_Expression_Constant) {
+                        // If the label argument is given as a constant, we can either
+                        // strip it away if it is empty, or integrate it into the array
+                        // of variables at compile time.
+                        $labelIsExpression = false;
+
+                        // Only insert the label into the array if it is not empty
+                        if (!twig_test_empty($label->getAttribute('value'))) {
+                            $originalVariables = $variables;
+                            $variables = new \Twig_Node_Expression_Array(array(), $lineno);
+                            $labelKey = new \Twig_Node_Expression_Constant('label', $lineno);
+
+                            if (null !== $originalVariables) {
+                                foreach ($originalVariables->getKeyValuePairs() as $pair) {
+                                    // Don't copy the original label attribute over if it exists
+                                    if ((string) $labelKey !== (string) $pair['key']) {
+                                        $variables->addElement($pair['value'], $pair['key']);
+                                    }
+                                }
+                            }
+
+                            // Insert the label argument into the array
+                            $variables->addElement($label, $labelKey);
+                        }
+                    } else {
+                        // The label argument is not a constant, but some kind of
+                        // expression. This expression needs to be evaluated at runtime.
+                        // Depending on the result (whether it is null or not), the
+                        // label in the arguments should take precedence over the label
+                        // in the attributes or not.
+                        $labelIsExpression = true;
+                    }
+                } else {
+                    // All other functions than "label" expect the variables
+                    // in the second argument
+                    $label = null;
+                    $variables = $arguments[1];
+                    $labelIsExpression = false;
+                }
+
+                if (null !== $variables || $labelIsExpression) {
+                    $compiler->raw(', ');
+
+                    if (null !== $variables) {
+                        $compiler->subcompile($variables);
+                    }
+
+                    if ($labelIsExpression) {
+                        if (null !== $variables) {
+                            $compiler->raw(' + ');
+                        }
+
+                        // Check at runtime whether the label is empty.
+                        // If not, add it to the array at runtime.
+                        $compiler->raw('(twig_test_empty($_label_ = ');
+                        $compiler->subcompile($label);
+                        $compiler->raw(') ? array() : array("label" => $_label_))');
+                    }
+                }
+            }
+        }
+
+        $compiler->raw(')');
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Node/StopwatchNode.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Node;
+
+/**
+ * Represents a stopwatch node.
+ *
+ * @author Wouter J <wouter@wouterj.nl>
+ */
+class StopwatchNode extends \Twig_Node
+{
+    public function __construct(\Twig_Node $name, $body, \Twig_Node_Expression_AssignName $var, $lineno = 0, $tag = null)
+    {
+        parent::__construct(array('body' => $body, 'name' => $name, 'var' => $var), array(), $lineno, $tag);
+    }
+
+    public function compile(\Twig_Compiler $compiler)
+    {
+        $compiler
+            ->addDebugInfo($this)
+            ->write('')
+            ->subcompile($this->getNode('var'))
+            ->raw(' = ')
+            ->subcompile($this->getNode('name'))
+            ->write(";\n")
+            ->write("\$this->env->getExtension('stopwatch')->getStopwatch()->start(")
+            ->subcompile($this->getNode('var'))
+            ->raw(", 'template');\n")
+            ->subcompile($this->getNode('body'))
+            ->write("\$this->env->getExtension('stopwatch')->getStopwatch()->stop(")
+            ->subcompile($this->getNode('var'))
+            ->raw(");\n")
+        ;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Node/TransDefaultDomainNode.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Node;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TransDefaultDomainNode extends \Twig_Node
+{
+    public function __construct(\Twig_Node_Expression $expr, $lineno = 0, $tag = null)
+    {
+        parent::__construct(array('expr' => $expr), array(), $lineno, $tag);
+    }
+
+    /**
+     * Compiles the node to PHP.
+     *
+     * @param \Twig_Compiler $compiler A Twig_Compiler instance
+     */
+    public function compile(\Twig_Compiler $compiler)
+    {
+        // noop as this node is just a marker for TranslationDefaultDomainNodeVisitor
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Node/TransNode.php
@@ -0,0 +1,113 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Node;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TransNode extends \Twig_Node
+{
+    public function __construct(\Twig_Node $body, \Twig_Node $domain = null, \Twig_Node_Expression $count = null, \Twig_Node_Expression $vars = null, \Twig_Node_Expression $locale = null, $lineno = 0, $tag = null)
+    {
+        parent::__construct(array('count' => $count, 'body' => $body, 'domain' => $domain, 'vars' => $vars, 'locale' => $locale), array(), $lineno, $tag);
+    }
+
+    /**
+     * Compiles the node to PHP.
+     *
+     * @param \Twig_Compiler $compiler A Twig_Compiler instance
+     */
+    public function compile(\Twig_Compiler $compiler)
+    {
+        $compiler->addDebugInfo($this);
+
+        $vars = $this->getNode('vars');
+        $defaults = new \Twig_Node_Expression_Array(array(), -1);
+        if ($vars instanceof \Twig_Node_Expression_Array) {
+            $defaults = $this->getNode('vars');
+            $vars = null;
+        }
+        list($msg, $defaults) = $this->compileString($this->getNode('body'), $defaults, (bool) $vars);
+
+        $method = null === $this->getNode('count') ? 'trans' : 'transChoice';
+
+        $compiler
+            ->write('echo $this->env->getExtension(\'translator\')->getTranslator()->'.$method.'(')
+            ->subcompile($msg)
+        ;
+
+        $compiler->raw(', ');
+
+        if (null !== $this->getNode('count')) {
+            $compiler
+                ->subcompile($this->getNode('count'))
+                ->raw(', ')
+            ;
+        }
+
+        if (null !== $vars) {
+            $compiler
+                ->raw('array_merge(')
+                ->subcompile($defaults)
+                ->raw(', ')
+                ->subcompile($this->getNode('vars'))
+                ->raw(')')
+            ;
+        } else {
+            $compiler->subcompile($defaults);
+        }
+
+        $compiler->raw(', ');
+
+        if (null === $this->getNode('domain')) {
+            $compiler->repr('messages');
+        } else {
+            $compiler->subcompile($this->getNode('domain'));
+        }
+
+        if (null !== $this->getNode('locale')) {
+            $compiler
+                ->raw(', ')
+                ->subcompile($this->getNode('locale'))
+            ;
+        }
+        $compiler->raw(");\n");
+    }
+
+    protected function compileString(\Twig_Node $body, \Twig_Node_Expression_Array $vars, $ignoreStrictCheck = false)
+    {
+        if ($body instanceof \Twig_Node_Expression_Constant) {
+            $msg = $body->getAttribute('value');
+        } elseif ($body instanceof \Twig_Node_Text) {
+            $msg = $body->getAttribute('data');
+        } else {
+            return array($body, $vars);
+        }
+
+        preg_match_all('/(?<!%)%([^%]+)%/', $msg, $matches);
+
+        foreach ($matches[1] as $var) {
+            $key = new \Twig_Node_Expression_Constant('%'.$var.'%', $body->getLine());
+            if (!$vars->hasElement($key)) {
+                if ('count' === $var && null !== $this->getNode('count')) {
+                    $vars->addElement($this->getNode('count'), $key);
+                } else {
+                    $varExpr = new \Twig_Node_Expression_Name($var, $body->getLine());
+                    $varExpr->setAttribute('ignore_strict_check', $ignoreStrictCheck);
+                    $vars->addElement($varExpr, $key);
+                }
+            }
+        }
+
+        return array(new \Twig_Node_Expression_Constant(str_replace('%%', '%', trim($msg)), $body->getLine()), $vars);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/NodeVisitor/Scope.php
@@ -0,0 +1,125 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\NodeVisitor;
+
+/**
+ * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ */
+class Scope
+{
+    /**
+     * @var Scope|null
+     */
+    private $parent;
+
+    /**
+     * @var array
+     */
+    private $data = array();
+
+    /**
+     * @var bool
+     */
+    private $left = false;
+
+    /**
+     * @param Scope $parent
+     */
+    public function __construct(Scope $parent = null)
+    {
+        $this->parent = $parent;
+    }
+
+    /**
+     * Opens a new child scope.
+     *
+     * @return Scope
+     */
+    public function enter()
+    {
+        return new self($this);
+    }
+
+    /**
+     * Closes current scope and returns parent one.
+     *
+     * @return Scope|null
+     */
+    public function leave()
+    {
+        $this->left = true;
+
+        return $this->parent;
+    }
+
+    /**
+     * Stores data into current scope.
+     *
+     * @param string $key
+     * @param mixed  $value
+     *
+     * @return Scope Current scope
+     *
+     * @throws \LogicException
+     */
+    public function set($key, $value)
+    {
+        if ($this->left) {
+            throw new \LogicException('Left scope is not mutable.');
+        }
+
+        $this->data[$key] = $value;
+
+        return $this;
+    }
+
+    /**
+     * Tests if a data is visible from current scope.
+     *
+     * @param string $key
+     *
+     * @return bool
+     */
+    public function has($key)
+    {
+        if (array_key_exists($key, $this->data)) {
+            return true;
+        }
+
+        if (null === $this->parent) {
+            return false;
+        }
+
+        return $this->parent->has($key);
+    }
+
+    /**
+     * Returns data visible from current scope.
+     *
+     * @param string $key
+     * @param mixed  $default
+     *
+     * @return mixed
+     */
+    public function get($key, $default = null)
+    {
+        if (array_key_exists($key, $this->data)) {
+            return $this->data[$key];
+        }
+
+        if (null === $this->parent) {
+            return $default;
+        }
+
+        return $this->parent->get($key, $default);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/NodeVisitor/TranslationDefaultDomainNodeVisitor.php
@@ -0,0 +1,126 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\NodeVisitor;
+
+use Symfony\Bridge\Twig\Node\TransNode;
+use Symfony\Bridge\Twig\Node\TransDefaultDomainNode;
+
+/**
+ * TranslationDefaultDomainNodeVisitor.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TranslationDefaultDomainNodeVisitor extends \Twig_BaseNodeVisitor
+{
+    /**
+     * @var Scope
+     */
+    private $scope;
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        $this->scope = new Scope();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doEnterNode(\Twig_Node $node, \Twig_Environment $env)
+    {
+        if ($node instanceof \Twig_Node_Block || $node instanceof \Twig_Node_Module) {
+            $this->scope = $this->scope->enter();
+        }
+
+        if ($node instanceof TransDefaultDomainNode) {
+            if ($node->getNode('expr') instanceof \Twig_Node_Expression_Constant) {
+                $this->scope->set('domain', $node->getNode('expr'));
+
+                return $node;
+            } else {
+                $var = $env->getParser()->getVarName();
+                $name = new \Twig_Node_Expression_AssignName($var, $node->getLine());
+                $this->scope->set('domain', new \Twig_Node_Expression_Name($var, $node->getLine()));
+
+                return new \Twig_Node_Set(false, new \Twig_Node(array($name)), new \Twig_Node(array($node->getNode('expr'))), $node->getLine());
+            }
+        }
+
+        if (!$this->scope->has('domain')) {
+            return $node;
+        }
+
+        if ($node instanceof \Twig_Node_Expression_Filter && in_array($node->getNode('filter')->getAttribute('value'), array('trans', 'transchoice'))) {
+            $arguments = $node->getNode('arguments');
+            $ind = 'trans' === $node->getNode('filter')->getAttribute('value') ? 1 : 2;
+            if ($this->isNamedArguments($arguments)) {
+                if (!$arguments->hasNode('domain') && !$arguments->hasNode($ind)) {
+                    $arguments->setNode('domain', $this->scope->get('domain'));
+                }
+            } else {
+                if (!$arguments->hasNode($ind)) {
+                    if (!$arguments->hasNode($ind - 1)) {
+                        $arguments->setNode($ind - 1, new \Twig_Node_Expression_Array(array(), $node->getLine()));
+                    }
+
+                    $arguments->setNode($ind, $this->scope->get('domain'));
+                }
+            }
+        } elseif ($node instanceof TransNode) {
+            if (null === $node->getNode('domain')) {
+                $node->setNode('domain', $this->scope->get('domain'));
+            }
+        }
+
+        return $node;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doLeaveNode(\Twig_Node $node, \Twig_Environment $env)
+    {
+        if ($node instanceof TransDefaultDomainNode) {
+            return false;
+        }
+
+        if ($node instanceof \Twig_Node_Block || $node instanceof \Twig_Node_Module) {
+            $this->scope = $this->scope->leave();
+        }
+
+        return $node;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getPriority()
+    {
+        return -10;
+    }
+
+    /**
+     * @return bool
+     */
+    private function isNamedArguments($arguments)
+    {
+        foreach ($arguments as $name => $node) {
+            if (!is_int($name)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/NodeVisitor/TranslationNodeVisitor.php
@@ -0,0 +1,137 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\NodeVisitor;
+
+use Symfony\Bridge\Twig\Node\TransNode;
+
+/**
+ * TranslationNodeVisitor extracts translation messages.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TranslationNodeVisitor extends \Twig_BaseNodeVisitor
+{
+    const UNDEFINED_DOMAIN = '_undefined';
+
+    private $enabled = false;
+    private $messages = array();
+
+    public function enable()
+    {
+        $this->enabled = true;
+        $this->messages = array();
+    }
+
+    public function disable()
+    {
+        $this->enabled = false;
+        $this->messages = array();
+    }
+
+    public function getMessages()
+    {
+        return $this->messages;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doEnterNode(\Twig_Node $node, \Twig_Environment $env)
+    {
+        if (!$this->enabled) {
+            return $node;
+        }
+
+        if (
+            $node instanceof \Twig_Node_Expression_Filter &&
+            'trans' === $node->getNode('filter')->getAttribute('value') &&
+            $node->getNode('node') instanceof \Twig_Node_Expression_Constant
+        ) {
+            // extract constant nodes with a trans filter
+            $this->messages[] = array(
+                $node->getNode('node')->getAttribute('value'),
+                $this->getReadDomainFromArguments($node->getNode('arguments'), 1),
+            );
+        } elseif (
+            $node instanceof \Twig_Node_Expression_Filter &&
+            'transchoice' === $node->getNode('filter')->getAttribute('value') &&
+            $node->getNode('node') instanceof \Twig_Node_Expression_Constant
+        ) {
+            // extract constant nodes with a trans filter
+            $this->messages[] = array(
+                $node->getNode('node')->getAttribute('value'),
+                $this->getReadDomainFromArguments($node->getNode('arguments'), 2),
+            );
+        } elseif ($node instanceof TransNode) {
+            // extract trans nodes
+            $this->messages[] = array(
+                $node->getNode('body')->getAttribute('data'),
+                $this->getReadDomainFromNode($node->getNode('domain')),
+            );
+        }
+
+        return $node;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doLeaveNode(\Twig_Node $node, \Twig_Environment $env)
+    {
+        return $node;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getPriority()
+    {
+        return 0;
+    }
+
+    /**
+     * @param \Twig_Node $arguments
+     * @param int        $index
+     *
+     * @return string|null
+     */
+    private function getReadDomainFromArguments(\Twig_Node $arguments, $index)
+    {
+        if ($arguments->hasNode('domain')) {
+            $argument = $arguments->getNode('domain');
+        } elseif ($arguments->hasNode($index)) {
+            $argument = $arguments->getNode($index);
+        } else {
+            return;
+        }
+
+        return $this->getReadDomainFromNode($argument);
+    }
+
+    /**
+     * @param \Twig_Node $node
+     *
+     * @return string|null
+     */
+    private function getReadDomainFromNode(\Twig_Node $node = null)
+    {
+        if (null === $node) {
+            return;
+        }
+
+        if ($node instanceof \Twig_Node_Expression_Constant) {
+            return $node->getAttribute('value');
+        }
+
+        return self::UNDEFINED_DOMAIN;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Resources/views/Form/bootstrap_3_horizontal_layout.html.twig
@@ -0,0 +1,81 @@
+{% use "bootstrap_3_layout.html.twig" %}
+
+{% block form_start -%}
+    {% set attr = attr|merge({class: (attr.class|default('') ~ ' form-horizontal')|trim}) %}
+    {{- parent() -}}
+{%- endblock form_start %}
+
+{# Labels #}
+
+{% block form_label -%}
+{% spaceless %}
+    {% if label is same as(false) %}
+        <div class="{{ block('form_label_class') }}"></div>
+    {% else %}
+        {% set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' ' ~ block('form_label_class'))|trim}) %}
+        {{- parent() -}}
+    {% endif %}
+{% endspaceless %}
+{%- endblock form_label %}
+
+{% block form_label_class -%}
+col-sm-2
+{%- endblock form_label_class %}
+
+{# Rows #}
+
+{% block form_row -%}
+    <div class="form-group{% if (not compound or force_error|default(false)) and not valid %} has-error{% endif %}">
+        {{- form_label(form) -}}
+        <div class="{{ block('form_group_class') }}">
+            {{- form_widget(form) -}}
+            {{- form_errors(form) -}}
+        </div>
+{##}</div>
+{%- endblock form_row %}
+
+{% block checkbox_row -%}
+    {{- block('checkbox_radio_row') -}}
+{%- endblock checkbox_row %}
+
+{% block radio_row -%}
+    {{- block('checkbox_radio_row') -}}
+{%- endblock radio_row %}
+
+{% block checkbox_radio_row -%}
+{% spaceless %}
+    <div class="form-group{% if not valid %} has-error{% endif %}">
+        <div class="{{ block('form_label_class') }}"></div>
+        <div class="{{ block('form_group_class') }}">
+            {{ form_widget(form) }}
+            {{ form_errors(form) }}
+        </div>
+    </div>
+{% endspaceless %}
+{%- endblock checkbox_radio_row %}
+
+{% block submit_row -%}
+{% spaceless %}
+    <div class="form-group">
+        <div class="{{ block('form_label_class') }}"></div>
+        <div class="{{ block('form_group_class') }}">
+            {{ form_widget(form) }}
+        </div>
+    </div>
+{% endspaceless %}
+{% endblock submit_row %}
+
+{% block reset_row -%}
+{% spaceless %}
+    <div class="form-group">
+        <div class="{{ block('form_label_class') }}"></div>
+        <div class="{{ block('form_group_class') }}">
+            {{ form_widget(form) }}
+        </div>
+    </div>
+{% endspaceless %}
+{% endblock reset_row %}
+
+{% block form_group_class -%}
+col-sm-10
+{%- endblock form_group_class %}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Resources/views/Form/bootstrap_3_layout.html.twig
@@ -0,0 +1,245 @@
+{% use "form_div_layout.html.twig" %}
+
+{# Widgets #}
+
+{% block form_widget_simple -%}
+    {% if type is not defined or type not in ['file', 'hidden'] %}
+        {%- set attr = attr|merge({class: (attr.class|default('') ~ ' form-control')|trim}) -%}
+    {% endif %}
+    {{- parent() -}}
+{%- endblock form_widget_simple %}
+
+{% block textarea_widget -%}
+    {% set attr = attr|merge({class: (attr.class|default('') ~ ' form-control')|trim}) %}
+    {{- parent() -}}
+{%- endblock textarea_widget %}
+
+{% block button_widget -%}
+    {% set attr = attr|merge({class: (attr.class|default('btn-default') ~ ' btn')|trim}) %}
+    {{- parent() -}}
+{%- endblock %}
+
+{% block money_widget -%}
+    <div class="input-group">
+        {% set append = money_pattern starts with '{{' %}
+        {% if not append %}
+            <span class="input-group-addon">{{ money_pattern|replace({ '{{ widget }}':''}) }}</span>
+        {% endif %}
+        {{- block('form_widget_simple') -}}
+        {% if append %}
+            <span class="input-group-addon">{{ money_pattern|replace({ '{{ widget }}':''}) }}</span>
+        {% endif %}
+    </div>
+{%- endblock money_widget %}
+
+{% block percent_widget -%}
+    <div class="input-group">
+        {{- block('form_widget_simple') -}}
+        <span class="input-group-addon">%</span>
+    </div>
+{%- endblock percent_widget %}
+
+{% block datetime_widget -%}
+    {% if widget == 'single_text' %}
+        {{- block('form_widget_simple') -}}
+    {% else -%}
+        {% set attr = attr|merge({class: (attr.class|default('') ~ ' form-inline')|trim}) -%}
+        <div {{ block('widget_container_attributes') }}>
+            {{- form_errors(form.date) -}}
+            {{- form_errors(form.time) -}}
+            {{- form_widget(form.date, { datetime: true } ) -}}
+            {{- form_widget(form.time, { datetime: true } ) -}}
+        </div>
+    {%- endif %}
+{%- endblock datetime_widget %}
+
+{% block date_widget -%}
+    {% if widget == 'single_text' %}
+        {{- block('form_widget_simple') -}}
+    {% else -%}
+        {% set attr = attr|merge({class: (attr.class|default('') ~ ' form-inline')|trim}) -%}
+        {% if datetime is not defined or not datetime -%}
+            <div {{ block('widget_container_attributes') -}}>
+        {%- endif %}
+            {{- date_pattern|replace({
+                '{{ year }}': form_widget(form.year),
+                '{{ month }}': form_widget(form.month),
+                '{{ day }}': form_widget(form.day),
+            })|raw -}}
+        {% if datetime is not defined or not datetime -%}
+            </div>
+        {%- endif -%}
+    {% endif %}
+{%- endblock date_widget %}
+
+{% block time_widget -%}
+    {% if widget == 'single_text' %}
+        {{- block('form_widget_simple') -}}
+    {% else -%}
+        {% set attr = attr|merge({class: (attr.class|default('') ~ ' form-inline')|trim}) -%}
+        {% if datetime is not defined or false == datetime -%}
+            <div {{ block('widget_container_attributes') -}}>
+        {%- endif -%}
+        {{- form_widget(form.hour) }}{% if with_minutes %}:{{ form_widget(form.minute) }}{% endif %}{% if with_seconds %}:{{ form_widget(form.second) }}{% endif %}
+        {% if datetime is not defined or false == datetime -%}
+            </div>
+        {%- endif -%}
+    {% endif %}
+{%- endblock time_widget %}
+
+{% block choice_widget_collapsed -%}
+    {% set attr = attr|merge({class: (attr.class|default('') ~ ' form-control')|trim}) %}
+    {{- parent() -}}
+{%- endblock %}
+
+{% block choice_widget_expanded -%}
+    {% if '-inline' in label_attr.class|default('') -%}
+        {%- for child in form %}
+            {{- form_widget(child, {
+                parent_label_class: label_attr.class|default(''),
+                translation_domain: choice_translation_domain,
+            }) -}}
+        {% endfor -%}
+    {%- else -%}
+        <div {{ block('widget_container_attributes') }}>
+            {%- for child in form %}
+                {{- form_widget(child, {
+                    parent_label_class: label_attr.class|default(''),
+                    translation_domain: choice_translation_domain,
+                }) -}}
+            {% endfor -%}
+        </div>
+    {%- endif %}
+{%- endblock choice_widget_expanded %}
+
+{% block checkbox_widget -%}
+    {%- set parent_label_class = parent_label_class|default(label_attr.class|default('')) -%}
+    {% if 'checkbox-inline' in parent_label_class %}
+        {{- form_label(form, null, { widget: parent() }) -}}
+    {% else -%}
+        <div class="checkbox">
+            {{- form_label(form, null, { widget: parent() }) -}}
+        </div>
+    {%- endif %}
+{%- endblock checkbox_widget %}
+
+{% block radio_widget -%}
+    {%- set parent_label_class = parent_label_class|default(label_attr.class|default('')) -%}
+    {% if 'radio-inline' in parent_label_class %}
+        {{- form_label(form, null, { widget: parent() }) -}}
+    {% else -%}
+        <div class="radio">
+            {{- form_label(form, null, { widget: parent() }) -}}
+        </div>
+    {%- endif %}
+{%- endblock radio_widget %}
+
+{# Labels #}
+
+{% block form_label -%}
+    {%- set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' control-label')|trim}) -%}
+    {{- parent() -}}
+{%- endblock form_label %}
+
+{% block choice_label -%}
+    {# remove the checkbox-inline and radio-inline class, it's only useful for embed labels #}
+    {%- set label_attr = label_attr|merge({class: label_attr.class|default('')|replace({'checkbox-inline': '', 'radio-inline': ''})|trim}) -%}
+    {{- block('form_label') -}}
+{% endblock %}
+
+{% block checkbox_label -%}
+    {{- block('checkbox_radio_label') -}}
+{%- endblock checkbox_label %}
+
+{% block radio_label -%}
+    {{- block('checkbox_radio_label') -}}
+{%- endblock radio_label %}
+
+{% block checkbox_radio_label %}
+    {# Do not display the label if widget is not defined in order to prevent double label rendering #}
+    {% if widget is defined %}
+        {% if required %}
+            {% set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' required')|trim}) %}
+        {% endif %}
+        {% if parent_label_class is defined %}
+            {% set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' ' ~ parent_label_class)|trim}) %}
+        {% endif %}
+        {% if label is not same as(false) and label is empty %}
+            {%- if label_format is not empty -%}
+                {% set label = label_format|replace({
+                    '%name%': name,
+                    '%id%': id,
+                }) %}
+            {%- else -%}
+                {% set label = name|humanize %}
+            {%- endif -%}
+        {% endif %}
+        <label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>
+            {{- widget|raw }} {{ label is not same as(false) ? (translation_domain is same as(false) ? label : label|trans({}, translation_domain)) -}}
+        </label>
+    {% endif %}
+{% endblock checkbox_radio_label %}
+
+{# Rows #}
+
+{% block form_row -%}
+    <div class="form-group{% if (not compound or force_error|default(false)) and not valid %} has-error{% endif %}">
+        {{- form_label(form) -}}
+        {{- form_widget(form) -}}
+        {{- form_errors(form) -}}
+    </div>
+{%- endblock form_row %}
+
+{% block button_row -%}
+    <div class="form-group">
+        {{- form_widget(form) -}}
+    </div>
+{%- endblock button_row %}
+
+{% block choice_row -%}
+    {% set force_error = true %}
+    {{- block('form_row') }}
+{%- endblock choice_row %}
+
+{% block date_row -%}
+    {% set force_error = true %}
+    {{- block('form_row') }}
+{%- endblock date_row %}
+
+{% block time_row -%}
+    {% set force_error = true %}
+    {{- block('form_row') }}
+{%- endblock time_row %}
+
+{% block datetime_row -%}
+    {% set force_error = true %}
+    {{- block('form_row') }}
+{%- endblock datetime_row %}
+
+{% block checkbox_row -%}
+    <div class="form-group{% if not valid %} has-error{% endif %}">
+        {{- form_widget(form) -}}
+        {{- form_errors(form) -}}
+    </div>
+{%- endblock checkbox_row %}
+
+{% block radio_row -%}
+    <div class="form-group{% if not valid %} has-error{% endif %}">
+        {{- form_widget(form) -}}
+        {{- form_errors(form) -}}
+    </div>
+{%- endblock radio_row %}
+
+{# Errors #}
+
+{% block form_errors -%}
+    {% if errors|length > 0 -%}
+    {% if form.parent %}<span class="help-block">{% else %}<div class="alert alert-danger">{% endif %}
+    <ul class="list-unstyled">
+        {%- for error in errors -%}
+            <li><span class="glyphicon glyphicon-exclamation-sign"></span> {{ error.message }}</li>
+        {%- endfor -%}
+    </ul>
+    {% if form.parent %}</span>{% else %}</div>{% endif %}
+    {%- endif %}
+{%- endblock form_errors %}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Resources/views/Form/form_div_layout.html.twig
@@ -0,0 +1,375 @@
+{# Widgets #}
+
+{%- block form_widget -%}
+    {% if compound %}
+        {{- block('form_widget_compound') -}}
+    {% else %}
+        {{- block('form_widget_simple') -}}
+    {% endif %}
+{%- endblock form_widget -%}
+
+{%- block form_widget_simple -%}
+    {%- set type = type|default('text') -%}
+    <input type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %}/>
+{%- endblock form_widget_simple -%}
+
+{%- block form_widget_compound -%}
+    <div {{ block('widget_container_attributes') }}>
+        {%- if form.parent is empty -%}
+            {{ form_errors(form) }}
+        {%- endif -%}
+        {{- block('form_rows') -}}
+        {{- form_rest(form) -}}
+    </div>
+{%- endblock form_widget_compound -%}
+
+{%- block collection_widget -%}
+    {% if prototype is defined %}
+        {%- set attr = attr|merge({'data-prototype': form_row(prototype) }) -%}
+    {% endif %}
+    {{- block('form_widget') -}}
+{%- endblock collection_widget -%}
+
+{%- block textarea_widget -%}
+    <textarea {{ block('widget_attributes') }}>{{ value }}</textarea>
+{%- endblock textarea_widget -%}
+
+{%- block choice_widget -%}
+    {% if expanded %}
+        {{- block('choice_widget_expanded') -}}
+    {% else %}
+        {{- block('choice_widget_collapsed') -}}
+    {% endif %}
+{%- endblock choice_widget -%}
+
+{%- block choice_widget_expanded -%}
+    <div {{ block('widget_container_attributes') }}>
+    {%- for child in form %}
+        {{- form_widget(child) -}}
+        {{- form_label(child, null, {translation_domain: choice_translation_domain}) -}}
+    {% endfor -%}
+    </div>
+{%- endblock choice_widget_expanded -%}
+
+{%- block choice_widget_collapsed -%}
+    {%- if required and placeholder is none and not placeholder_in_choices and not multiple and (attr.size is not defined or attr.size <= 1) -%}
+        {% set required = false %}
+    {%- endif -%}
+    <select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
+        {%- if placeholder is not none -%}
+            <option value=""{% if required and value is empty %} selected="selected"{% endif %}>{{ placeholder != '' ? (translation_domain is same as(false) ? placeholder : placeholder|trans({}, translation_domain)) }}</option>
+        {%- endif -%}
+        {%- if preferred_choices|length > 0 -%}
+            {% set options = preferred_choices %}
+            {{- block('choice_widget_options') -}}
+            {%- if choices|length > 0 and separator is not none -%}
+                <option disabled="disabled">{{ separator }}</option>
+            {%- endif -%}
+        {%- endif -%}
+        {%- set options = choices -%}
+        {{- block('choice_widget_options') -}}
+    </select>
+{%- endblock choice_widget_collapsed -%}
+
+{%- block choice_widget_options -%}
+    {% for group_label, choice in options %}
+        {%- if choice is iterable -%}
+            <optgroup label="{{ choice_translation_domain is same as(false) ? group_label : group_label|trans({}, choice_translation_domain) }}">
+                {% set options = choice %}
+                {{- block('choice_widget_options') -}}
+            </optgroup>
+        {%- else -%}
+            <option value="{{ choice.value }}"{% if choice.attr %} {% set attr = choice.attr %}{{ block('attributes') }}{% endif %}{% if choice is selectedchoice(value) %} selected="selected"{% endif %}>{{ choice_translation_domain is same as(false) ? choice.label : choice.label|trans({}, choice_translation_domain) }}</option>
+        {%- endif -%}
+    {% endfor %}
+{%- endblock choice_widget_options -%}
+
+{%- block checkbox_widget -%}
+    <input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />
+{%- endblock checkbox_widget -%}
+
+{%- block radio_widget -%}
+    <input type="radio" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />
+{%- endblock radio_widget -%}
+
+{%- block datetime_widget -%}
+    {% if widget == 'single_text' %}
+        {{- block('form_widget_simple') -}}
+    {%- else -%}
+        <div {{ block('widget_container_attributes') }}>
+            {{- form_errors(form.date) -}}
+            {{- form_errors(form.time) -}}
+            {{- form_widget(form.date) -}}
+            {{- form_widget(form.time) -}}
+        </div>
+    {%- endif -%}
+{%- endblock datetime_widget -%}
+
+{%- block date_widget -%}
+    {%- if widget == 'single_text' -%}
+        {{ block('form_widget_simple') }}
+    {%- else -%}
+        <div {{ block('widget_container_attributes') }}>
+            {{- date_pattern|replace({
+                '{{ year }}':  form_widget(form.year),
+                '{{ month }}': form_widget(form.month),
+                '{{ day }}':   form_widget(form.day),
+            })|raw -}}
+        </div>
+    {%- endif -%}
+{%- endblock date_widget -%}
+
+{%- block time_widget -%}
+    {%- if widget == 'single_text' -%}
+        {{ block('form_widget_simple') }}
+    {%- else -%}
+        {%- set vars = widget == 'text' ? { 'attr': { 'size': 1 }} : {} -%}
+        <div {{ block('widget_container_attributes') }}>
+            {{ form_widget(form.hour, vars) }}{% if with_minutes %}:{{ form_widget(form.minute, vars) }}{% endif %}{% if with_seconds %}:{{ form_widget(form.second, vars) }}{% endif %}
+        </div>
+    {%- endif -%}
+{%- endblock time_widget -%}
+
+{%- block number_widget -%}
+    {# type="number" doesn't work with floats #}
+    {%- set type = type|default('text') -%}
+    {{ block('form_widget_simple') }}
+{%- endblock number_widget -%}
+
+{%- block integer_widget -%}
+    {%- set type = type|default('number') -%}
+    {{ block('form_widget_simple') }}
+{%- endblock integer_widget -%}
+
+{%- block money_widget -%}
+    {{ money_pattern|replace({ '{{ widget }}': block('form_widget_simple') })|raw }}
+{%- endblock money_widget -%}
+
+{%- block url_widget -%}
+    {%- set type = type|default('url') -%}
+    {{ block('form_widget_simple') }}
+{%- endblock url_widget -%}
+
+{%- block search_widget -%}
+    {%- set type = type|default('search') -%}
+    {{ block('form_widget_simple') }}
+{%- endblock search_widget -%}
+
+{%- block percent_widget -%}
+    {%- set type = type|default('text') -%}
+    {{ block('form_widget_simple') }} %
+{%- endblock percent_widget -%}
+
+{%- block password_widget -%}
+    {%- set type = type|default('password') -%}
+    {{ block('form_widget_simple') }}
+{%- endblock password_widget -%}
+
+{%- block hidden_widget -%}
+    {%- set type = type|default('hidden') -%}
+    {{ block('form_widget_simple') }}
+{%- endblock hidden_widget -%}
+
+{%- block email_widget -%}
+    {%- set type = type|default('email') -%}
+    {{ block('form_widget_simple') }}
+{%- endblock email_widget -%}
+
+{%- block range_widget -%}
+    {% set type = type|default('range') %}
+    {{- block('form_widget_simple') -}}
+{%- endblock range_widget %}
+
+{%- block button_widget -%}
+    {%- if label is empty -%}
+        {%- if label_format is not empty -%}
+            {% set label = label_format|replace({
+                '%name%': name,
+                '%id%': id,
+            }) %}
+        {%- else -%}
+            {% set label = name|humanize %}
+        {%- endif -%}
+    {%- endif -%}
+    <button type="{{ type|default('button') }}" {{ block('button_attributes') }}>{{ translation_domain is same as(false) ? label : label|trans({}, translation_domain) }}</button>
+{%- endblock button_widget -%}
+
+{%- block submit_widget -%}
+    {%- set type = type|default('submit') -%}
+    {{ block('button_widget') }}
+{%- endblock submit_widget -%}
+
+{%- block reset_widget -%}
+    {%- set type = type|default('reset') -%}
+    {{ block('button_widget') }}
+{%- endblock reset_widget -%}
+
+{# Labels #}
+
+{%- block form_label -%}
+    {% if label is not same as(false) -%}
+        {% if not compound -%}
+            {% set label_attr = label_attr|merge({'for': id}) %}
+        {%- endif -%}
+        {% if required -%}
+            {% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' required')|trim}) %}
+        {%- endif -%}
+        {% if label is empty -%}
+            {%- if label_format is not empty -%}
+                {% set label = label_format|replace({
+                    '%name%': name,
+                    '%id%': id,
+                }) %}
+            {%- else -%}
+                {% set label = name|humanize %}
+            {%- endif -%}
+        {%- endif -%}
+        <label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>{{ translation_domain is same as(false) ? label : label|trans({}, translation_domain) }}</label>
+    {%- endif -%}
+{%- endblock form_label -%}
+
+{%- block button_label -%}{%- endblock -%}
+
+{# Rows #}
+
+{%- block repeated_row -%}
+    {#
+    No need to render the errors here, as all errors are mapped
+    to the first child (see RepeatedTypeValidatorExtension).
+    #}
+    {{- block('form_rows') -}}
+{%- endblock repeated_row -%}
+
+{%- block form_row -%}
+    <div>
+        {{- form_label(form) -}}
+        {{- form_errors(form) -}}
+        {{- form_widget(form) -}}
+    </div>
+{%- endblock form_row -%}
+
+{%- block button_row -%}
+    <div>
+        {{- form_widget(form) -}}
+    </div>
+{%- endblock button_row -%}
+
+{%- block hidden_row -%}
+    {{ form_widget(form) }}
+{%- endblock hidden_row -%}
+
+{# Misc #}
+
+{%- block form -%}
+    {{ form_start(form) }}
+        {{- form_widget(form) -}}
+    {{ form_end(form) }}
+{%- endblock form -%}
+
+{%- block form_start -%}
+    {% set method = method|upper %}
+    {%- if method in ["GET", "POST"] -%}
+        {% set form_method = method %}
+    {%- else -%}
+        {% set form_method = "POST" %}
+    {%- endif -%}
+    <form name="{{ name }}" method="{{ form_method|lower }}"{% if action != '' %} action="{{ action }}"{% endif %}{% for attrname, attrvalue in attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}{% if multipart %} enctype="multipart/form-data"{% endif %}>
+    {%- if form_method != method -%}
+        <input type="hidden" name="_method" value="{{ method }}" />
+    {%- endif -%}
+{%- endblock form_start -%}
+
+{%- block form_end -%}
+    {%- if not render_rest is defined or render_rest -%}
+        {{ form_rest(form) }}
+    {%- endif -%}
+    </form>
+{%- endblock form_end -%}
+
+{%- block form_enctype -%}
+    {% if multipart %}enctype="multipart/form-data"{% endif %}
+{%- endblock form_enctype -%}
+
+{%- block form_errors -%}
+    {%- if errors|length > 0 -%}
+    <ul>
+        {%- for error in errors -%}
+            <li>{{ error.message }}</li>
+        {%- endfor -%}
+    </ul>
+    {%- endif -%}
+{%- endblock form_errors -%}
+
+{%- block form_rest -%}
+    {% for child in form -%}
+        {% if not child.rendered %}
+            {{- form_row(child) -}}
+        {% endif %}
+    {%- endfor %}
+{% endblock form_rest %}
+
+{# Support #}
+
+{%- block form_rows -%}
+    {% for child in form %}
+        {{- form_row(child) -}}
+    {% endfor %}
+{%- endblock form_rows -%}
+
+{%- block widget_attributes -%}
+    id="{{ id }}" name="{{ full_name }}"
+    {%- if read_only %} readonly="readonly"{% endif -%}
+    {%- if disabled %} disabled="disabled"{% endif -%}
+    {%- if required %} required="required"{% endif -%}
+    {%- for attrname, attrvalue in attr if 'readonly' != attrname or not read_only -%}
+        {{- " " -}}
+        {%- if attrname in ['placeholder', 'title'] -%}
+            {{- attrname }}="{{ translation_domain is same as(false) ? attrvalue : attrvalue|trans({}, translation_domain) }}"
+        {%- elseif attrvalue is same as(true) -%}
+            {{- attrname }}="{{ attrname }}"
+        {%- elseif attrvalue is not same as(false) -%}
+            {{- attrname }}="{{ attrvalue }}"
+        {%- endif -%}
+    {%- endfor -%}
+{%- endblock widget_attributes -%}
+
+{%- block widget_container_attributes -%}
+    {%- if id is not empty %}id="{{ id }}"{% endif -%}
+    {%- for attrname, attrvalue in attr -%}
+        {{- " " -}}
+        {%- if attrname in ['placeholder', 'title'] -%}
+            {{- attrname }}="{{ translation_domain is same as(false) ? attrvalue : attrvalue|trans({}, translation_domain) }}"
+        {%- elseif attrvalue is same as(true) -%}
+            {{- attrname }}="{{ attrname }}"
+        {%- elseif attrvalue is not same as(false) -%}
+            {{- attrname }}="{{ attrvalue }}"
+        {%- endif -%}
+    {%- endfor -%}
+{%- endblock widget_container_attributes -%}
+
+{%- block button_attributes -%}
+    id="{{ id }}" name="{{ full_name }}"{% if disabled %} disabled="disabled"{% endif -%}
+    {%- for attrname, attrvalue in attr -%}
+        {{- " " -}}
+        {%- if attrname in ['placeholder', 'title'] -%}
+            {{- attrname }}="{{ translation_domain is same as(false) ? attrvalue : attrvalue|trans({}, translation_domain) }}"
+        {%- elseif attrvalue is same as(true) -%}
+            {{- attrname }}="{{ attrname }}"
+        {%- elseif attrvalue is not same as(false) -%}
+            {{- attrname }}="{{ attrvalue }}"
+        {%- endif -%}
+    {%- endfor -%}
+{%- endblock button_attributes -%}
+
+{% block attributes -%}
+    {%- for attrname, attrvalue in attr -%}
+        {{- " " -}}
+        {%- if attrname in ['placeholder', 'title'] -%}
+            {{- attrname }}="{{ translation_domain is same as(false) ? attrvalue : attrvalue|trans({}, translation_domain) }}"
+        {%- elseif attrvalue is same as(true) -%}
+            {{- attrname }}="{{ attrname }}"
+        {%- elseif attrvalue is not same as(false) -%}
+            {{- attrname }}="{{ attrvalue }}"
+        {%- endif -%}
+    {%- endfor -%}
+{%- endblock attributes -%}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Resources/views/Form/form_table_layout.html.twig
@@ -0,0 +1,44 @@
+{% use "form_div_layout.html.twig" %}
+
+{%- block form_row -%}
+    <tr>
+        <td>
+            {{- form_label(form) -}}
+        </td>
+        <td>
+            {{- form_errors(form) -}}
+            {{- form_widget(form) -}}
+        </td>
+    </tr>
+{%- endblock form_row -%}
+
+{%- block button_row -%}
+    <tr>
+        <td></td>
+        <td>
+            {{- form_widget(form) -}}
+        </td>
+    </tr>
+{%- endblock button_row -%}
+
+{%- block hidden_row -%}
+    <tr style="display: none">
+        <td colspan="2">
+            {{- form_widget(form) -}}
+        </td>
+    </tr>
+{%- endblock hidden_row -%}
+
+{%- block form_widget_compound -%}
+    <table {{ block('widget_container_attributes') }}>
+        {%- if form.parent is empty and errors|length > 0 -%}
+        <tr>
+            <td colspan="2">
+                {{- form_errors(form) -}}
+            </td>
+        </tr>
+        {%- endif -%}
+        {{- block('form_rows') -}}
+        {{- form_rest(form) -}}
+    </table>
+{%- endblock form_widget_compound -%}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Resources/views/Form/foundation_5_layout.html.twig
@@ -0,0 +1,328 @@
+{% extends "form_div_layout.html.twig" %}
+
+{# Based on Foundation 5 Doc #}
+{# Widgets #}
+
+{% block form_widget_simple -%}
+    {% if errors|length > 0 -%}
+        {% set attr = attr|merge({class: (attr.class|default('') ~ ' error')|trim}) %}
+    {% endif %}
+    {{- parent() -}}
+{%- endblock form_widget_simple %}
+
+{% block textarea_widget -%}
+    {% if errors|length > 0 -%}
+        {% set attr = attr|merge({class: (attr.class|default('') ~ ' error')|trim}) %}
+    {% endif %}
+    {{- parent() -}}
+{%- endblock textarea_widget %}
+
+{% block button_widget -%}
+    {% set attr = attr|merge({class: (attr.class|default('') ~ ' button')|trim}) %}
+    {{- parent() -}}
+{%- endblock %}
+
+{% block money_widget -%}
+    <div class="row collapse">
+        {% set prepend = '{{' == money_pattern[0:2] %}
+        {% if not prepend %}
+            <div class="small-3 large-2 columns">
+                <span class="prefix">{{ money_pattern|replace({ '{{ widget }}':''}) }}</span>
+            </div>
+        {% endif %}
+        <div class="small-9 large-10 columns">
+            {{- block('form_widget_simple') -}}
+        </div>
+        {% if prepend %}
+            <div class="small-3 large-2 columns">
+                <span class="postfix">{{ money_pattern|replace({ '{{ widget }}':''}) }}</span>
+            </div>
+        {% endif %}
+    </div>
+{%- endblock money_widget %}
+
+{% block percent_widget -%}
+    <div class="row collapse">
+        <div class="small-9 large-10 columns">
+            {{- block('form_widget_simple') -}}
+        </div>
+        <div class="small-3 large-2 columns">
+            <span class="postfix">%</span>
+        </div>
+    </div>
+{%- endblock percent_widget %}
+
+{% block datetime_widget -%}
+    {% if widget == 'single_text' %}
+        {{- block('form_widget_simple') -}}
+    {% else %}
+        {% set attr = attr|merge({class: (attr.class|default('') ~ ' row')|trim}) %}
+        <div class="row">
+            <div class="large-7 columns">{{ form_errors(form.date) }}</div>
+            <div class="large-5 columns">{{ form_errors(form.time) }}</div>
+        </div>
+        <div {{ block('widget_container_attributes') }}>
+            <div class="large-7 columns">{{ form_widget(form.date, { datetime: true } ) }}</div>
+            <div class="large-5 columns">{{ form_widget(form.time, { datetime: true } ) }}</div>
+        </div>
+    {% endif %}
+{%- endblock datetime_widget %}
+
+{% block date_widget -%}
+    {% if widget == 'single_text' %}
+        {{- block('form_widget_simple') -}}
+    {% else %}
+        {% set attr = attr|merge({class: (attr.class|default('') ~ ' row')|trim}) %}
+        {% if datetime is not defined or not datetime %}
+            <div {{ block('widget_container_attributes') }}>
+        {% endif %}
+        {{- date_pattern|replace({
+            '{{ year }}': '<div class="large-4 columns">' ~ form_widget(form.year) ~ '</div>',
+            '{{ month }}': '<div class="large-4 columns">' ~ form_widget(form.month) ~ '</div>',
+            '{{ day }}': '<div class="large-4 columns">' ~ form_widget(form.day) ~ '</div>',
+        })|raw -}}
+        {% if datetime is not defined or not datetime %}
+            </div>
+        {% endif %}
+    {% endif %}
+{%- endblock date_widget %}
+
+{% block time_widget -%}
+    {% if widget == 'single_text' %}
+        {{- block('form_widget_simple') -}}
+    {% else %}
+        {% set attr = attr|merge({class: (attr.class|default('') ~ ' row')|trim}) %}
+        {% if datetime is not defined or false == datetime %}
+            <div {{ block('widget_container_attributes') -}}>
+        {% endif %}
+        {% if with_seconds %}
+            <div class="large-4 columns">{{ form_widget(form.hour) }}</div>
+            <div class="large-4 columns">
+                <div class="row collapse">
+                    <div class="small-3 large-2 columns">
+                        <span class="prefix">:</span>
+                    </div>
+                    <div class="small-9 large-10 columns">
+                        {{ form_widget(form.minute) }}
+                    </div>
+                </div>
+            </div>
+            <div class="large-4 columns">
+                <div class="row collapse">
+                    <div class="small-3 large-2 columns">
+                        <span class="prefix">:</span>
+                    </div>
+                    <div class="small-9 large-10 columns">
+                        {{ form_widget(form.second) }}
+                    </div>
+                </div>
+            </div>
+        {% else %}
+            <div class="large-6 columns">{{ form_widget(form.hour) }}</div>
+            <div class="large-6 columns">
+                <div class="row collapse">
+                    <div class="small-3 large-2 columns">
+                        <span class="prefix">:</span>
+                    </div>
+                    <div class="small-9 large-10 columns">
+                        {{ form_widget(form.minute) }}
+                    </div>
+                </div>
+            </div>
+        {% endif %}
+        {% if datetime is not defined or false == datetime %}
+            </div>
+        {% endif %}
+    {% endif %}
+{%- endblock time_widget %}
+
+{% block choice_widget_collapsed -%}
+    {% if errors|length > 0 -%}
+        {% set attr = attr|merge({class: (attr.class|default('') ~ ' error')|trim}) %}
+    {% endif %}
+
+    {% if multiple -%}
+        {% set attr = attr|merge({style: (attr.style|default('') ~ ' height: auto; background-image: none;')|trim}) %}
+    {% endif %}
+
+    {% if required and placeholder is none and not placeholder_in_choices and not multiple -%}
+        {% set required = false %}
+    {%- endif -%}
+    <select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple" data-customforms="disabled"{% endif %}>
+        {% if placeholder is not none -%}
+            <option value=""{% if required and value is empty %} selected="selected"{% endif %}>{{ translation_domain is same as(false) ? placeholder : placeholder|trans({}, translation_domain) }}</option>
+        {%- endif %}
+        {%- if preferred_choices|length > 0 -%}
+            {% set options = preferred_choices %}
+            {{- block('choice_widget_options') -}}
+            {% if choices|length > 0 and separator is not none -%}
+                <option disabled="disabled">{{ separator }}</option>
+            {%- endif %}
+        {%- endif -%}
+        {% set options = choices -%}
+        {{- block('choice_widget_options') -}}
+    </select>
+{%- endblock choice_widget_collapsed %}
+
+{% block choice_widget_expanded -%}
+    {% if '-inline' in label_attr.class|default('') %}
+        <ul class="inline-list">
+            {% for child in form %}
+                <li>{{ form_widget(child, {
+                        parent_label_class: label_attr.class|default(''),
+                    }) }}</li>
+            {% endfor %}
+        </ul>
+    {% else %}
+        <div {{ block('widget_container_attributes') }}>
+            {% for child in form %}
+                {{ form_widget(child, {
+                    parent_label_class: label_attr.class|default(''),
+                }) }}
+            {% endfor %}
+        </div>
+    {% endif %}
+{%- endblock choice_widget_expanded %}
+
+{% block checkbox_widget -%}
+    {% set parent_label_class = parent_label_class|default('') %}
+    {% if errors|length > 0 -%}
+        {% set attr = attr|merge({class: (attr.class|default('') ~ ' error')|trim}) %}
+    {% endif %}
+    {% if 'checkbox-inline' in parent_label_class %}
+        {{ form_label(form, null, { widget: parent() }) }}
+    {% else %}
+        <div class="checkbox">
+            {{ form_label(form, null, { widget: parent() }) }}
+        </div>
+    {% endif %}
+{%- endblock checkbox_widget %}
+
+{% block radio_widget -%}
+    {% set parent_label_class = parent_label_class|default('') %}
+    {% if 'radio-inline' in parent_label_class %}
+        {{ form_label(form, null, { widget: parent() }) }}
+    {% else %}
+        {% if errors|length > 0 -%}
+            {% set attr = attr|merge({class: (attr.class|default('') ~ ' error')|trim}) %}
+        {% endif %}
+        <div class="radio">
+            {{ form_label(form, null, { widget: parent() }) }}
+        </div>
+    {% endif %}
+{%- endblock radio_widget %}
+
+{# Labels #}
+
+{% block form_label -%}
+    {% if errors|length > 0 -%}
+        {% set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' error')|trim}) %}
+    {% endif %}
+    {{- parent() -}}
+{%- endblock form_label %}
+
+{% block choice_label -%}
+    {% if errors|length > 0 -%}
+        {% set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' error')|trim}) %}
+    {% endif %}
+    {# remove the checkbox-inline and radio-inline class, it's only useful for embed labels #}
+    {% set label_attr = label_attr|merge({class: label_attr.class|default('')|replace({'checkbox-inline': '', 'radio-inline': ''})|trim}) %}
+    {{- block('form_label') -}}
+{%- endblock %}
+
+{% block checkbox_label -%}
+    {{- block('checkbox_radio_label') -}}
+{%- endblock checkbox_label %}
+
+{% block radio_label -%}
+    {{- block('checkbox_radio_label') -}}
+{%- endblock radio_label %}
+
+{% block checkbox_radio_label -%}
+    {% if required %}
+        {% set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' required')|trim}) %}
+    {% endif %}
+    {% if errors|length > 0 -%}
+        {% set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' error')|trim}) %}
+    {% endif %}
+    {% if parent_label_class is defined %}
+        {% set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ parent_label_class)|trim}) %}
+    {% endif %}
+    {% if label is empty %}
+        {%- if label_format is not empty -%}
+            {% set label = label_format|replace({
+                '%name%': name,
+                '%id%': id,
+            }) %}
+        {%- else -%}
+            {% set label = name|humanize %}
+        {%- endif -%}
+    {% endif %}
+    <label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>
+        {{ widget|raw }}
+        {{ translation_domain is same as(false) ? label : label|trans({}, translation_domain) }}
+    </label>
+{%- endblock checkbox_radio_label %}
+
+{# Rows #}
+
+{% block form_row -%}
+    <div class="row">
+        <div class="large-12 columns{% if (not compound or force_error|default(false)) and not valid %} error{% endif %}">
+            {{ form_label(form) }}
+            {{ form_widget(form) }}
+            {{ form_errors(form) }}
+        </div>
+    </div>
+{%- endblock form_row %}
+
+{% block choice_row -%}
+    {% set force_error = true %}
+    {{ block('form_row') }}
+{%- endblock choice_row %}
+
+{% block date_row -%}
+    {% set force_error = true %}
+    {{ block('form_row') }}
+{%- endblock date_row %}
+
+{% block time_row -%}
+    {% set force_error = true %}
+    {{ block('form_row') }}
+{%- endblock time_row %}
+
+{% block datetime_row -%}
+    {% set force_error = true %}
+    {{ block('form_row') }}
+{%- endblock datetime_row %}
+
+{% block checkbox_row -%}
+    <div class="row">
+        <div class="large-12 columns{% if not valid %} error{% endif %}">
+            {{ form_widget(form) }}
+            {{ form_errors(form) }}
+        </div>
+    </div>
+{%- endblock checkbox_row %}
+
+{% block radio_row -%}
+    <div class="row">
+        <div class="large-12 columns{% if not valid %} error{% endif %}">
+            {{ form_widget(form) }}
+            {{ form_errors(form) }}
+        </div>
+    </div>
+{%- endblock radio_row %}
+
+{# Errors #}
+
+{% block form_errors -%}
+    {% if errors|length > 0 -%}
+        {% if form.parent %}<small class="error">{% else %}<div data-alert class="alert-box alert">{% endif %}
+        {%- for error in errors -%}
+            {{ error.message }}
+            {% if not loop.last %}, {% endif %}
+        {%- endfor -%}
+        {% if form.parent %}</small>{% else %}</div>{% endif %}
+    {%- endif %}
+{%- endblock form_errors %}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/TokenParser/DumpTokenParser.php
@@ -0,0 +1,51 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\TokenParser;
+
+use Symfony\Bridge\Twig\Node\DumpNode;
+
+/**
+ * Token Parser for the 'dump' tag.
+ *
+ * Dump variables with:
+ * <pre>
+ *  {% dump %}
+ *  {% dump foo %}
+ *  {% dump foo, bar %}
+ * </pre>
+ *
+ * @author Julien Galenski <julien.galenski@gmail.com>
+ */
+class DumpTokenParser extends \Twig_TokenParser
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function parse(\Twig_Token $token)
+    {
+        $values = null;
+        if (!$this->parser->getStream()->test(\Twig_Token::BLOCK_END_TYPE)) {
+            $values = $this->parser->getExpressionParser()->parseMultitargetExpression();
+        }
+        $this->parser->getStream()->expect(\Twig_Token::BLOCK_END_TYPE);
+
+        return new DumpNode($this->parser->getVarName(), $values, $token->getLine(), $this->getTag());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTag()
+    {
+        return 'dump';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/TokenParser/FormThemeTokenParser.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\TokenParser;
+
+use Symfony\Bridge\Twig\Node\FormThemeNode;
+
+/**
+ * Token Parser for the 'form_theme' tag.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class FormThemeTokenParser extends \Twig_TokenParser
+{
+    /**
+     * Parses a token and returns a node.
+     *
+     * @param \Twig_Token $token A Twig_Token instance
+     *
+     * @return \Twig_Node A Twig_Node instance
+     */
+    public function parse(\Twig_Token $token)
+    {
+        $lineno = $token->getLine();
+        $stream = $this->parser->getStream();
+
+        $form = $this->parser->getExpressionParser()->parseExpression();
+
+        if ($this->parser->getStream()->test(\Twig_Token::NAME_TYPE, 'with')) {
+            $this->parser->getStream()->next();
+            $resources = $this->parser->getExpressionParser()->parseExpression();
+        } else {
+            $resources = new \Twig_Node_Expression_Array(array(), $stream->getCurrent()->getLine());
+            do {
+                $resources->addElement($this->parser->getExpressionParser()->parseExpression());
+            } while (!$stream->test(\Twig_Token::BLOCK_END_TYPE));
+        }
+
+        $stream->expect(\Twig_Token::BLOCK_END_TYPE);
+
+        return new FormThemeNode($form, $resources, $lineno, $this->getTag());
+    }
+
+    /**
+     * Gets the tag name associated with this token parser.
+     *
+     * @return string The tag name
+     */
+    public function getTag()
+    {
+        return 'form_theme';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/TokenParser/StopwatchTokenParser.php
@@ -0,0 +1,60 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\TokenParser;
+
+use Symfony\Bridge\Twig\Node\StopwatchNode;
+
+/**
+ * Token Parser for the stopwatch tag.
+ *
+ * @author Wouter J <wouter@wouterj.nl>
+ */
+class StopwatchTokenParser extends \Twig_TokenParser
+{
+    protected $stopwatchIsAvailable;
+
+    public function __construct($stopwatchIsAvailable)
+    {
+        $this->stopwatchIsAvailable = $stopwatchIsAvailable;
+    }
+
+    public function parse(\Twig_Token $token)
+    {
+        $lineno = $token->getLine();
+        $stream = $this->parser->getStream();
+
+        // {% stopwatch 'bar' %}
+        $name = $this->parser->getExpressionParser()->parseExpression();
+
+        $stream->expect(\Twig_Token::BLOCK_END_TYPE);
+
+        // {% endstopwatch %}
+        $body = $this->parser->subparse(array($this, 'decideStopwatchEnd'), true);
+        $stream->expect(\Twig_Token::BLOCK_END_TYPE);
+
+        if ($this->stopwatchIsAvailable) {
+            return new StopwatchNode($name, $body, new \Twig_Node_Expression_AssignName($this->parser->getVarName(), $token->getLine()), $lineno, $this->getTag());
+        }
+
+        return $body;
+    }
+
+    public function decideStopwatchEnd(\Twig_Token $token)
+    {
+        return $token->test('endstopwatch');
+    }
+
+    public function getTag()
+    {
+        return 'stopwatch';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/TokenParser/TransChoiceTokenParser.php
@@ -0,0 +1,89 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\TokenParser;
+
+use Symfony\Bridge\Twig\Node\TransNode;
+
+/**
+ * Token Parser for the 'transchoice' tag.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TransChoiceTokenParser extends TransTokenParser
+{
+    /**
+     * Parses a token and returns a node.
+     *
+     * @param \Twig_Token $token A Twig_Token instance
+     *
+     * @return \Twig_Node A Twig_Node instance
+     *
+     * @throws \Twig_Error_Syntax
+     */
+    public function parse(\Twig_Token $token)
+    {
+        $lineno = $token->getLine();
+        $stream = $this->parser->getStream();
+
+        $vars = new \Twig_Node_Expression_Array(array(), $lineno);
+
+        $count = $this->parser->getExpressionParser()->parseExpression();
+
+        $domain = null;
+        $locale = null;
+
+        if ($stream->test('with')) {
+            // {% transchoice count with vars %}
+            $stream->next();
+            $vars = $this->parser->getExpressionParser()->parseExpression();
+        }
+
+        if ($stream->test('from')) {
+            // {% transchoice count from "messages" %}
+            $stream->next();
+            $domain = $this->parser->getExpressionParser()->parseExpression();
+        }
+
+        if ($stream->test('into')) {
+            // {% transchoice count into "fr" %}
+            $stream->next();
+            $locale = $this->parser->getExpressionParser()->parseExpression();
+        }
+
+        $stream->expect(\Twig_Token::BLOCK_END_TYPE);
+
+        $body = $this->parser->subparse(array($this, 'decideTransChoiceFork'), true);
+
+        if (!$body instanceof \Twig_Node_Text && !$body instanceof \Twig_Node_Expression) {
+            throw new \Twig_Error_Syntax('A message inside a transchoice tag must be a simple text.', $body->getLine(), $stream->getFilename());
+        }
+
+        $stream->expect(\Twig_Token::BLOCK_END_TYPE);
+
+        return new TransNode($body, $domain, $count, $vars, $locale, $lineno, $this->getTag());
+    }
+
+    public function decideTransChoiceFork($token)
+    {
+        return $token->test(array('endtranschoice'));
+    }
+
+    /**
+     * Gets the tag name associated with this token parser.
+     *
+     * @return string The tag name
+     */
+    public function getTag()
+    {
+        return 'transchoice';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/TokenParser/TransDefaultDomainTokenParser.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\TokenParser;
+
+use Symfony\Bridge\Twig\Node\TransDefaultDomainNode;
+
+/**
+ * Token Parser for the 'trans_default_domain' tag.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TransDefaultDomainTokenParser extends \Twig_TokenParser
+{
+    /**
+     * Parses a token and returns a node.
+     *
+     * @param \Twig_Token $token A Twig_Token instance
+     *
+     * @return \Twig_Node A Twig_Node instance
+     */
+    public function parse(\Twig_Token $token)
+    {
+        $expr = $this->parser->getExpressionParser()->parseExpression();
+
+        $this->parser->getStream()->expect(\Twig_Token::BLOCK_END_TYPE);
+
+        return new TransDefaultDomainNode($expr, $token->getLine(), $this->getTag());
+    }
+
+    /**
+     * Gets the tag name associated with this token parser.
+     *
+     * @return string The tag name
+     */
+    public function getTag()
+    {
+        return 'trans_default_domain';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/TokenParser/TransTokenParser.php
@@ -0,0 +1,89 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\TokenParser;
+
+use Symfony\Bridge\Twig\Node\TransNode;
+
+/**
+ * Token Parser for the 'trans' tag.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TransTokenParser extends \Twig_TokenParser
+{
+    /**
+     * Parses a token and returns a node.
+     *
+     * @param \Twig_Token $token A Twig_Token instance
+     *
+     * @return \Twig_Node A Twig_Node instance
+     *
+     * @throws \Twig_Error_Syntax
+     */
+    public function parse(\Twig_Token $token)
+    {
+        $lineno = $token->getLine();
+        $stream = $this->parser->getStream();
+
+        $vars = new \Twig_Node_Expression_Array(array(), $lineno);
+        $domain = null;
+        $locale = null;
+        if (!$stream->test(\Twig_Token::BLOCK_END_TYPE)) {
+            if ($stream->test('with')) {
+                // {% trans with vars %}
+                $stream->next();
+                $vars = $this->parser->getExpressionParser()->parseExpression();
+            }
+
+            if ($stream->test('from')) {
+                // {% trans from "messages" %}
+                $stream->next();
+                $domain = $this->parser->getExpressionParser()->parseExpression();
+            }
+
+            if ($stream->test('into')) {
+                // {% trans into "fr" %}
+                $stream->next();
+                $locale = $this->parser->getExpressionParser()->parseExpression();
+            } elseif (!$stream->test(\Twig_Token::BLOCK_END_TYPE)) {
+                throw new \Twig_Error_Syntax('Unexpected token. Twig was looking for the "with", "from", or "into" keyword.', $stream->getCurrent()->getLine(), $stream->getFilename());
+            }
+        }
+
+        // {% trans %}message{% endtrans %}
+        $stream->expect(\Twig_Token::BLOCK_END_TYPE);
+        $body = $this->parser->subparse(array($this, 'decideTransFork'), true);
+
+        if (!$body instanceof \Twig_Node_Text && !$body instanceof \Twig_Node_Expression) {
+            throw new \Twig_Error_Syntax('A message inside a trans tag must be a simple text.', $body->getLine(), $stream->getFilename());
+        }
+
+        $stream->expect(\Twig_Token::BLOCK_END_TYPE);
+
+        return new TransNode($body, $domain, null, $vars, $locale, $lineno, $this->getTag());
+    }
+
+    public function decideTransFork($token)
+    {
+        return $token->test(array('endtrans'));
+    }
+
+    /**
+     * Gets the tag name associated with this token parser.
+     *
+     * @return string The tag name
+     */
+    public function getTag()
+    {
+        return 'trans';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/Translation/TwigExtractor.php
@@ -0,0 +1,118 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Translation;
+
+use Symfony\Component\Finder\Finder;
+use Symfony\Component\Finder\SplFileInfo;
+use Symfony\Component\Translation\Extractor\AbstractFileExtractor;
+use Symfony\Component\Translation\Extractor\ExtractorInterface;
+use Symfony\Component\Translation\MessageCatalogue;
+
+/**
+ * TwigExtractor extracts translation messages from a twig template.
+ *
+ * @author Michel Salib <michelsalib@hotmail.com>
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TwigExtractor extends AbstractFileExtractor implements ExtractorInterface
+{
+    /**
+     * Default domain for found messages.
+     *
+     * @var string
+     */
+    private $defaultDomain = 'messages';
+
+    /**
+     * Prefix for found message.
+     *
+     * @var string
+     */
+    private $prefix = '';
+
+    /**
+     * The twig environment.
+     *
+     * @var \Twig_Environment
+     */
+    private $twig;
+
+    public function __construct(\Twig_Environment $twig)
+    {
+        $this->twig = $twig;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function extract($resource, MessageCatalogue $catalogue)
+    {
+        $files = $this->extractFiles($resource);
+        foreach ($files as $file) {
+            try {
+                $this->extractTemplate(file_get_contents($file->getPathname()), $catalogue);
+            } catch (\Twig_Error $e) {
+                if ($file instanceof SplFileInfo) {
+                    $e->setTemplateFile($file->getRelativePathname());
+                } elseif ($file instanceof \SplFileInfo) {
+                    $e->setTemplateFile($file->getRealPath());
+                }
+
+                throw $e;
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setPrefix($prefix)
+    {
+        $this->prefix = $prefix;
+    }
+
+    protected function extractTemplate($template, MessageCatalogue $catalogue)
+    {
+        $visitor = $this->twig->getExtension('translator')->getTranslationNodeVisitor();
+        $visitor->enable();
+
+        $this->twig->parse($this->twig->tokenize($template));
+
+        foreach ($visitor->getMessages() as $message) {
+            $catalogue->set(trim($message[0]), $this->prefix.trim($message[0]), $message[1] ?: $this->defaultDomain);
+        }
+
+        $visitor->disable();
+    }
+
+    /**
+     * @param string $file
+     *
+     * @return bool
+     */
+    protected function canBeExtracted($file)
+    {
+        return $this->isFile($file) && 'twig' === pathinfo($file, PATHINFO_EXTENSION);
+    }
+
+    /**
+     * @param string|array $directory
+     *
+     * @return array
+     */
+    protected function extractFromDirectory($directory)
+    {
+        $finder = new Finder();
+
+        return $finder->files()->name('*.twig')->in($directory);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/TwigEngine.php
@@ -0,0 +1,131 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig;
+
+use Symfony\Component\Templating\EngineInterface;
+use Symfony\Component\Templating\StreamingEngineInterface;
+use Symfony\Component\Templating\TemplateNameParserInterface;
+use Symfony\Component\Templating\TemplateReferenceInterface;
+
+/**
+ * This engine knows how to render Twig templates.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TwigEngine implements EngineInterface, StreamingEngineInterface
+{
+    protected $environment;
+    protected $parser;
+
+    /**
+     * Constructor.
+     *
+     * @param \Twig_Environment           $environment A \Twig_Environment instance
+     * @param TemplateNameParserInterface $parser      A TemplateNameParserInterface instance
+     */
+    public function __construct(\Twig_Environment $environment, TemplateNameParserInterface $parser)
+    {
+        $this->environment = $environment;
+        $this->parser = $parser;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * It also supports \Twig_Template as name parameter.
+     *
+     * @throws \Twig_Error if something went wrong like a thrown exception while rendering the template
+     */
+    public function render($name, array $parameters = array())
+    {
+        return $this->load($name)->render($parameters);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * It also supports \Twig_Template as name parameter.
+     *
+     * @throws \Twig_Error if something went wrong like a thrown exception while rendering the template
+     */
+    public function stream($name, array $parameters = array())
+    {
+        $this->load($name)->display($parameters);
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * It also supports \Twig_Template as name parameter.
+     */
+    public function exists($name)
+    {
+        if ($name instanceof \Twig_Template) {
+            return true;
+        }
+
+        $loader = $this->environment->getLoader();
+
+        if ($loader instanceof \Twig_ExistsLoaderInterface) {
+            return $loader->exists((string) $name);
+        }
+
+        try {
+            // cast possible TemplateReferenceInterface to string because the
+            // EngineInterface supports them but Twig_LoaderInterface does not
+            $loader->getSource((string) $name);
+        } catch (\Twig_Error_Loader $e) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * It also supports \Twig_Template as name parameter.
+     */
+    public function supports($name)
+    {
+        if ($name instanceof \Twig_Template) {
+            return true;
+        }
+
+        $template = $this->parser->parse($name);
+
+        return 'twig' === $template->get('engine');
+    }
+
+    /**
+     * Loads the given template.
+     *
+     * @param string|TemplateReferenceInterface|\Twig_Template $name A template name or an instance of
+     *                                                               TemplateReferenceInterface or \Twig_Template
+     *
+     * @return \Twig_TemplateInterface A \Twig_TemplateInterface instance
+     *
+     * @throws \InvalidArgumentException if the template does not exist
+     */
+    protected function load($name)
+    {
+        if ($name instanceof \Twig_Template) {
+            return $name;
+        }
+
+        try {
+            return $this->environment->loadTemplate((string) $name);
+        } catch (\Twig_Error_Loader $e) {
+            throw new \InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/twig-bridge/composer.json
@@ -0,0 +1,65 @@
+{
+    "name": "symfony/twig-bridge",
+    "type": "symfony-bridge",
+    "description": "Symfony Twig Bridge",
+    "keywords": [],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.9",
+        "twig/twig": "~1.23|~2.0"
+    },
+    "require-dev": {
+        "symfony/asset": "~2.7|~3.0.0",
+        "symfony/finder": "~2.3|~3.0.0",
+        "symfony/form": "~2.8.4",
+        "symfony/http-kernel": "~2.8|~3.0.0",
+        "symfony/polyfill-intl-icu": "~1.0",
+        "symfony/routing": "~2.2|~3.0.0",
+        "symfony/templating": "~2.1|~3.0.0",
+        "symfony/translation": "~2.7|~3.0.0",
+        "symfony/yaml": "~2.0,>=2.0.5|~3.0.0",
+        "symfony/security": "~2.6|~3.0.0",
+        "symfony/security-acl": "~2.6|~3.0.0",
+        "symfony/stopwatch": "~2.2|~3.0.0",
+        "symfony/console": "~2.8|~3.0.0",
+        "symfony/var-dumper": "~2.7.16|~2.8.9|~3.0.9",
+        "symfony/expression-language": "~2.4|~3.0.0"
+    },
+    "suggest": {
+        "symfony/finder": "",
+        "symfony/asset": "For using the AssetExtension",
+        "symfony/form": "For using the FormExtension",
+        "symfony/http-kernel": "For using the HttpKernelExtension",
+        "symfony/routing": "For using the RoutingExtension",
+        "symfony/templating": "For using the TwigEngine",
+        "symfony/translation": "For using the TranslationExtension",
+        "symfony/yaml": "For using the YamlExtension",
+        "symfony/security": "For using the SecurityExtension",
+        "symfony/stopwatch": "For using the StopwatchExtension",
+        "symfony/var-dumper": "For using the DumpExtension",
+        "symfony/expression-language": "For using the ExpressionExtension"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Bridge\\Twig\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.8-dev"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/yaml/Dumper.php
@@ -0,0 +1,77 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml;
+
+/**
+ * Dumper dumps PHP variables to YAML strings.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Dumper
+{
+    /**
+     * The amount of spaces to use for indentation of nested nodes.
+     *
+     * @var int
+     */
+    protected $indentation = 4;
+
+    /**
+     * Sets the indentation.
+     *
+     * @param int $num The amount of spaces to use for indentation of nested nodes
+     */
+    public function setIndentation($num)
+    {
+        if ($num < 1) {
+            throw new \InvalidArgumentException('The indentation must be greater than zero.');
+        }
+
+        $this->indentation = (int) $num;
+    }
+
+    /**
+     * Dumps a PHP value to YAML.
+     *
+     * @param mixed $input                  The PHP value
+     * @param int   $inline                 The level where you switch to inline YAML
+     * @param int   $indent                 The level of indentation (used internally)
+     * @param bool  $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
+     * @param bool  $objectSupport          true if object support is enabled, false otherwise
+     *
+     * @return string The YAML representation of the PHP value
+     */
+    public function dump($input, $inline = 0, $indent = 0, $exceptionOnInvalidType = false, $objectSupport = false)
+    {
+        $output = '';
+        $prefix = $indent ? str_repeat(' ', $indent) : '';
+
+        if ($inline <= 0 || !is_array($input) || empty($input)) {
+            $output .= $prefix.Inline::dump($input, $exceptionOnInvalidType, $objectSupport);
+        } else {
+            $isAHash = Inline::isHash($input);
+
+            foreach ($input as $key => $value) {
+                $willBeInlined = $inline - 1 <= 0 || !is_array($value) || empty($value);
+
+                $output .= sprintf('%s%s%s%s',
+                    $prefix,
+                    $isAHash ? Inline::dump($key, $exceptionOnInvalidType, $objectSupport).':' : '-',
+                    $willBeInlined ? ' ' : "\n",
+                    $this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + $this->indentation, $exceptionOnInvalidType, $objectSupport)
+                ).($willBeInlined ? "\n" : '');
+            }
+        }
+
+        return $output;
+    }
+}
--- /dev/null
+++ b/vendor/symfony/yaml/Escaper.php
@@ -0,0 +1,99 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml;
+
+/**
+ * Escaper encapsulates escaping rules for single and double-quoted
+ * YAML strings.
+ *
+ * @author Matthew Lewinski <matthew@lewinski.org>
+ *
+ * @internal
+ */
+class Escaper
+{
+    // Characters that would cause a dumped string to require double quoting.
+    const REGEX_CHARACTER_TO_ESCAPE = "[\\x00-\\x1f]|\xc2\x85|\xc2\xa0|\xe2\x80\xa8|\xe2\x80\xa9";
+
+    // Mapping arrays for escaping a double quoted string. The backslash is
+    // first to ensure proper escaping because str_replace operates iteratively
+    // on the input arrays. This ordering of the characters avoids the use of strtr,
+    // which performs more slowly.
+    private static $escapees = array('\\', '\\\\', '\\"', '"',
+                                     "\x00",  "\x01",  "\x02",  "\x03",  "\x04",  "\x05",  "\x06",  "\x07",
+                                     "\x08",  "\x09",  "\x0a",  "\x0b",  "\x0c",  "\x0d",  "\x0e",  "\x0f",
+                                     "\x10",  "\x11",  "\x12",  "\x13",  "\x14",  "\x15",  "\x16",  "\x17",
+                                     "\x18",  "\x19",  "\x1a",  "\x1b",  "\x1c",  "\x1d",  "\x1e",  "\x1f",
+                                     "\xc2\x85", "\xc2\xa0", "\xe2\x80\xa8", "\xe2\x80\xa9");
+    private static $escaped = array('\\\\', '\\"', '\\\\', '\\"',
+                                     '\\0',   '\\x01', '\\x02', '\\x03', '\\x04', '\\x05', '\\x06', '\\a',
+                                     '\\b',   '\\t',   '\\n',   '\\v',   '\\f',   '\\r',   '\\x0e', '\\x0f',
+                                     '\\x10', '\\x11', '\\x12', '\\x13', '\\x14', '\\x15', '\\x16', '\\x17',
+                                     '\\x18', '\\x19', '\\x1a', '\\e',   '\\x1c', '\\x1d', '\\x1e', '\\x1f',
+                                     '\\N', '\\_', '\\L', '\\P');
+
+    /**
+     * Determines if a PHP value would require double quoting in YAML.
+     *
+     * @param string $value A PHP value
+     *
+     * @return bool True if the value would require double quotes
+     */
+    public static function requiresDoubleQuoting($value)
+    {
+        return preg_match('/'.self::REGEX_CHARACTER_TO_ESCAPE.'/u', $value);
+    }
+
+    /**
+     * Escapes and surrounds a PHP value with double quotes.
+     *
+     * @param string $value A PHP value
+     *
+     * @return string The quoted, escaped string
+     */
+    public static function escapeWithDoubleQuotes($value)
+    {
+        return sprintf('"%s"', str_replace(self::$escapees, self::$escaped, $value));
+    }
+
+    /**
+     * Determines if a PHP value would require single quoting in YAML.
+     *
+     * @param string $value A PHP value
+     *
+     * @return bool True if the value would require single quotes
+     */
+    public static function requiresSingleQuoting($value)
+    {
+        // Determines if a PHP value is entirely composed of a value that would
+        // require single quoting in YAML.
+        if (in_array(strtolower($value), array('null', '~', 'true', 'false', 'y', 'n', 'yes', 'no', 'on', 'off'))) {
+            return true;
+        }
+
+        // Determines if the PHP value contains any single characters that would
+        // cause it to require single quoting in YAML.
+        return preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` ]/x', $value);
+    }
+
+    /**
+     * Escapes and surrounds a PHP value with single quotes.
+     *
+     * @param string $value A PHP value
+     *
+     * @return string The quoted, escaped string
+     */
+    public static function escapeWithSingleQuotes($value)
+    {
+        return sprintf("'%s'", str_replace('\'', '\'\'', $value));
+    }
+}
--- /dev/null
+++ b/vendor/symfony/yaml/Exception/DumpException.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml\Exception;
+
+/**
+ * Exception class thrown when an error occurs during dumping.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class DumpException extends RuntimeException
+{
+}
--- /dev/null
+++ b/vendor/symfony/yaml/Exception/ExceptionInterface.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml\Exception;
+
+/**
+ * Exception interface for all exceptions thrown by the component.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/yaml/Exception/ParseException.php
@@ -0,0 +1,146 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml\Exception;
+
+/**
+ * Exception class thrown when an error occurs during parsing.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ParseException extends RuntimeException
+{
+    private $parsedFile;
+    private $parsedLine;
+    private $snippet;
+    private $rawMessage;
+
+    /**
+     * Constructor.
+     *
+     * @param string     $message    The error message
+     * @param int        $parsedLine The line where the error occurred
+     * @param int        $snippet    The snippet of code near the problem
+     * @param string     $parsedFile The file name where the error occurred
+     * @param \Exception $previous   The previous exception
+     */
+    public function __construct($message, $parsedLine = -1, $snippet = null, $parsedFile = null, \Exception $previous = null)
+    {
+        $this->parsedFile = $parsedFile;
+        $this->parsedLine = $parsedLine;
+        $this->snippet = $snippet;
+        $this->rawMessage = $message;
+
+        $this->updateRepr();
+
+        parent::__construct($this->message, 0, $previous);
+    }
+
+    /**
+     * Gets the snippet of code near the error.
+     *
+     * @return string The snippet of code
+     */
+    public function getSnippet()
+    {
+        return $this->snippet;
+    }
+
+    /**
+     * Sets the snippet of code near the error.
+     *
+     * @param string $snippet The code snippet
+     */
+    public function setSnippet($snippet)
+    {
+        $this->snippet = $snippet;
+
+        $this->updateRepr();
+    }
+
+    /**
+     * Gets the filename where the error occurred.
+     *
+     * This method returns null if a string is parsed.
+     *
+     * @return string The filename
+     */
+    public function getParsedFile()
+    {
+        return $this->parsedFile;
+    }
+
+    /**
+     * Sets the filename where the error occurred.
+     *
+     * @param string $parsedFile The filename
+     */
+    public function setParsedFile($parsedFile)
+    {
+        $this->parsedFile = $parsedFile;
+
+        $this->updateRepr();
+    }
+
+    /**
+     * Gets the line where the error occurred.
+     *
+     * @return int The file line
+     */
+    public function getParsedLine()
+    {
+        return $this->parsedLine;
+    }
+
+    /**
+     * Sets the line where the error occurred.
+     *
+     * @param int $parsedLine The file line
+     */
+    public function setParsedLine($parsedLine)
+    {
+        $this->parsedLine = $parsedLine;
+
+        $this->updateRepr();
+    }
+
+    private function updateRepr()
+    {
+        $this->message = $this->rawMessage;
+
+        $dot = false;
+        if ('.' === substr($this->message, -1)) {
+            $this->message = substr($this->message, 0, -1);
+            $dot = true;
+        }
+
+        if (null !== $this->parsedFile) {
+            if (PHP_VERSION_ID >= 50400) {
+                $jsonOptions = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
+            } else {
+                $jsonOptions = 0;
+            }
+            $this->message .= sprintf(' in %s', json_encode($this->parsedFile, $jsonOptions));
+        }
+
+        if ($this->parsedLine >= 0) {
+            $this->message .= sprintf(' at line %d', $this->parsedLine);
+        }
+
+        if ($this->snippet) {
+            $this->message .= sprintf(' (near "%s")', $this->snippet);
+        }
+
+        if ($dot) {
+            $this->message .= '.';
+        }
+    }
+}
--- /dev/null
+++ b/vendor/symfony/yaml/Exception/RuntimeException.php
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml\Exception;
+
+/**
+ * Exception class thrown when an error occurs during parsing.
+ *
+ * @author Romain Neutron <imprec@gmail.com>
+ */
+class RuntimeException extends \RuntimeException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/symfony/yaml/Inline.php
@@ -0,0 +1,589 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml;
+
+use Symfony\Component\Yaml\Exception\ParseException;
+use Symfony\Component\Yaml\Exception\DumpException;
+
+/**
+ * Inline implements a YAML parser/dumper for the YAML inline syntax.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Inline
+{
+    const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\']*(?:\'\'[^\']*)*)\')';
+
+    private static $exceptionOnInvalidType = false;
+    private static $objectSupport = false;
+    private static $objectForMap = false;
+
+    /**
+     * Converts a YAML string to a PHP value.
+     *
+     * @param string $value                  A YAML string
+     * @param bool   $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
+     * @param bool   $objectSupport          true if object support is enabled, false otherwise
+     * @param bool   $objectForMap           true if maps should return a stdClass instead of array()
+     * @param array  $references             Mapping of variable names to values
+     *
+     * @return mixed A PHP value
+     *
+     * @throws ParseException
+     */
+    public static function parse($value, $exceptionOnInvalidType = false, $objectSupport = false, $objectForMap = false, $references = array())
+    {
+        self::$exceptionOnInvalidType = $exceptionOnInvalidType;
+        self::$objectSupport = $objectSupport;
+        self::$objectForMap = $objectForMap;
+
+        $value = trim($value);
+
+        if ('' === $value) {
+            return '';
+        }
+
+        if (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) {
+            $mbEncoding = mb_internal_encoding();
+            mb_internal_encoding('ASCII');
+        }
+
+        $i = 0;
+        switch ($value[0]) {
+            case '[':
+                $result = self::parseSequence($value, $i, $references);
+                ++$i;
+                break;
+            case '{':
+                $result = self::parseMapping($value, $i, $references);
+                ++$i;
+                break;
+            default:
+                $result = self::parseScalar($value, null, array('"', "'"), $i, true, $references);
+        }
+
+        // some comments are allowed at the end
+        if (preg_replace('/\s+#.*$/A', '', substr($value, $i))) {
+            throw new ParseException(sprintf('Unexpected characters near "%s".', substr($value, $i)));
+        }
+
+        if (isset($mbEncoding)) {
+            mb_internal_encoding($mbEncoding);
+        }
+
+        return $result;
+    }
+
+    /**
+     * Dumps a given PHP variable to a YAML string.
+     *
+     * @param mixed $value                  The PHP variable to convert
+     * @param bool  $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
+     * @param bool  $objectSupport          true if object support is enabled, false otherwise
+     *
+     * @return string The YAML string representing the PHP value
+     *
+     * @throws DumpException When trying to dump PHP resource
+     */
+    public static function dump($value, $exceptionOnInvalidType = false, $objectSupport = false)
+    {
+        switch (true) {
+            case is_resource($value):
+                if ($exceptionOnInvalidType) {
+                    throw new DumpException(sprintf('Unable to dump PHP resources in a YAML file ("%s").', get_resource_type($value)));
+                }
+
+                return 'null';
+            case is_object($value):
+                if ($objectSupport) {
+                    return '!php/object:'.serialize($value);
+                }
+
+                if ($exceptionOnInvalidType) {
+                    throw new DumpException('Object support when dumping a YAML file has been disabled.');
+                }
+
+                return 'null';
+            case is_array($value):
+                return self::dumpArray($value, $exceptionOnInvalidType, $objectSupport);
+            case null === $value:
+                return 'null';
+            case true === $value:
+                return 'true';
+            case false === $value:
+                return 'false';
+            case ctype_digit($value):
+                return is_string($value) ? "'$value'" : (int) $value;
+            case is_numeric($value):
+                $locale = setlocale(LC_NUMERIC, 0);
+                if (false !== $locale) {
+                    setlocale(LC_NUMERIC, 'C');
+                }
+                if (is_float($value)) {
+                    $repr = (string) $value;
+                    if (is_infinite($value)) {
+                        $repr = str_ireplace('INF', '.Inf', $repr);
+                    } elseif (floor($value) == $value && $repr == $value) {
+                        // Preserve float data type since storing a whole number will result in integer value.
+                        $repr = '!!float '.$repr;
+                    }
+                } else {
+                    $repr = is_string($value) ? "'$value'" : (string) $value;
+                }
+                if (false !== $locale) {
+                    setlocale(LC_NUMERIC, $locale);
+                }
+
+                return $repr;
+            case '' == $value:
+                return "''";
+            case Escaper::requiresDoubleQuoting($value):
+                return Escaper::escapeWithDoubleQuotes($value);
+            case Escaper::requiresSingleQuoting($value):
+            case preg_match(self::getHexRegex(), $value):
+            case preg_match(self::getTimestampRegex(), $value):
+                return Escaper::escapeWithSingleQuotes($value);
+            default:
+                return $value;
+        }
+    }
+
+    /**
+     * Check if given array is hash or just normal indexed array.
+     *
+     * @internal
+     *
+     * @param array $value The PHP array to check
+     *
+     * @return bool true if value is hash array, false otherwise
+     */
+    public static function isHash(array $value)
+    {
+        $expectedKey = 0;
+
+        foreach ($value as $key => $val) {
+            if ($key !== $expectedKey++) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Dumps a PHP array to a YAML string.
+     *
+     * @param array $value                  The PHP array to dump
+     * @param bool  $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
+     * @param bool  $objectSupport          true if object support is enabled, false otherwise
+     *
+     * @return string The YAML string representing the PHP array
+     */
+    private static function dumpArray($value, $exceptionOnInvalidType, $objectSupport)
+    {
+        // array
+        if ($value && !self::isHash($value)) {
+            $output = array();
+            foreach ($value as $val) {
+                $output[] = self::dump($val, $exceptionOnInvalidType, $objectSupport);
+            }
+
+            return sprintf('[%s]', implode(', ', $output));
+        }
+
+        // hash
+        $output = array();
+        foreach ($value as $key => $val) {
+            $output[] = sprintf('%s: %s', self::dump($key, $exceptionOnInvalidType, $objectSupport), self::dump($val, $exceptionOnInvalidType, $objectSupport));
+        }
+
+        return sprintf('{ %s }', implode(', ', $output));
+    }
+
+    /**
+     * Parses a YAML scalar.
+     *
+     * @param string $scalar
+     * @param string $delimiters
+     * @param array  $stringDelimiters
+     * @param int    &$i
+     * @param bool   $evaluate
+     * @param array  $references
+     *
+     * @return string
+     *
+     * @throws ParseException When malformed inline YAML string is parsed
+     *
+     * @internal
+     */
+    public static function parseScalar($scalar, $delimiters = null, $stringDelimiters = array('"', "'"), &$i = 0, $evaluate = true, $references = array())
+    {
+        if (in_array($scalar[$i], $stringDelimiters)) {
+            // quoted scalar
+            $output = self::parseQuotedScalar($scalar, $i);
+
+            if (null !== $delimiters) {
+                $tmp = ltrim(substr($scalar, $i), ' ');
+                if (!in_array($tmp[0], $delimiters)) {
+                    throw new ParseException(sprintf('Unexpected characters (%s).', substr($scalar, $i)));
+                }
+            }
+        } else {
+            // "normal" string
+            if (!$delimiters) {
+                $output = substr($scalar, $i);
+                $i += strlen($output);
+
+                // remove comments
+                if (preg_match('/[ \t]+#/', $output, $match, PREG_OFFSET_CAPTURE)) {
+                    $output = substr($output, 0, $match[0][1]);
+                }
+            } elseif (preg_match('/^(.+?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) {
+                $output = $match[1];
+                $i += strlen($output);
+            } else {
+                throw new ParseException(sprintf('Malformed inline YAML string: %s.', $scalar));
+            }
+
+            // a non-quoted string cannot start with @ or ` (reserved) nor with a scalar indicator (| or >)
+            if ($output && ('@' === $output[0] || '`' === $output[0] || '|' === $output[0] || '>' === $output[0])) {
+                @trigger_error(sprintf('Not quoting the scalar "%s" starting with "%s" is deprecated since Symfony 2.8 and will throw a ParseException in 3.0.', $output, $output[0]), E_USER_DEPRECATED);
+
+                // to be thrown in 3.0
+                // throw new ParseException(sprintf('The reserved indicator "%s" cannot start a plain scalar; you need to quote the scalar.', $output[0]));
+            }
+
+            if ($evaluate) {
+                $output = self::evaluateScalar($output, $references);
+            }
+        }
+
+        return $output;
+    }
+
+    /**
+     * Parses a YAML quoted scalar.
+     *
+     * @param string $scalar
+     * @param int    &$i
+     *
+     * @return string
+     *
+     * @throws ParseException When malformed inline YAML string is parsed
+     */
+    private static function parseQuotedScalar($scalar, &$i)
+    {
+        if (!preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) {
+            throw new ParseException(sprintf('Malformed inline YAML string: %s.', substr($scalar, $i)));
+        }
+
+        $output = substr($match[0], 1, strlen($match[0]) - 2);
+
+        $unescaper = new Unescaper();
+        if ('"' == $scalar[$i]) {
+            $output = $unescaper->unescapeDoubleQuotedString($output);
+        } else {
+            $output = $unescaper->unescapeSingleQuotedString($output);
+        }
+
+        $i += strlen($match[0]);
+
+        return $output;
+    }
+
+    /**
+     * Parses a YAML sequence.
+     *
+     * @param string $sequence
+     * @param int    &$i
+     * @param array  $references
+     *
+     * @return array
+     *
+     * @throws ParseException When malformed inline YAML string is parsed
+     */
+    private static function parseSequence($sequence, &$i = 0, $references = array())
+    {
+        $output = array();
+        $len = strlen($sequence);
+        ++$i;
+
+        // [foo, bar, ...]
+        while ($i < $len) {
+            switch ($sequence[$i]) {
+                case '[':
+                    // nested sequence
+                    $output[] = self::parseSequence($sequence, $i, $references);
+                    break;
+                case '{':
+                    // nested mapping
+                    $output[] = self::parseMapping($sequence, $i, $references);
+                    break;
+                case ']':
+                    return $output;
+                case ',':
+                case ' ':
+                    break;
+                default:
+                    $isQuoted = in_array($sequence[$i], array('"', "'"));
+                    $value = self::parseScalar($sequence, array(',', ']'), array('"', "'"), $i, true, $references);
+
+                    // the value can be an array if a reference has been resolved to an array var
+                    if (!is_array($value) && !$isQuoted && false !== strpos($value, ': ')) {
+                        // embedded mapping?
+                        try {
+                            $pos = 0;
+                            $value = self::parseMapping('{'.$value.'}', $pos, $references);
+                        } catch (\InvalidArgumentException $e) {
+                            // no, it's not
+                        }
+                    }
+
+                    $output[] = $value;
+
+                    --$i;
+            }
+
+            ++$i;
+        }
+
+        throw new ParseException(sprintf('Malformed inline YAML string: %s.', $sequence));
+    }
+
+    /**
+     * Parses a YAML mapping.
+     *
+     * @param string $mapping
+     * @param int    &$i
+     * @param array  $references
+     *
+     * @return array|\stdClass
+     *
+     * @throws ParseException When malformed inline YAML string is parsed
+     */
+    private static function parseMapping($mapping, &$i = 0, $references = array())
+    {
+        $output = array();
+        $len = strlen($mapping);
+        ++$i;
+
+        // {foo: bar, bar:foo, ...}
+        while ($i < $len) {
+            switch ($mapping[$i]) {
+                case ' ':
+                case ',':
+                    ++$i;
+                    continue 2;
+                case '}':
+                    if (self::$objectForMap) {
+                        return (object) $output;
+                    }
+
+                    return $output;
+            }
+
+            // key
+            $key = self::parseScalar($mapping, array(':', ' '), array('"', "'"), $i, false);
+
+            // value
+            $done = false;
+
+            while ($i < $len) {
+                switch ($mapping[$i]) {
+                    case '[':
+                        // nested sequence
+                        $value = self::parseSequence($mapping, $i, $references);
+                        // Spec: Keys MUST be unique; first one wins.
+                        // Parser cannot abort this mapping earlier, since lines
+                        // are processed sequentially.
+                        if (!isset($output[$key])) {
+                            $output[$key] = $value;
+                        }
+                        $done = true;
+                        break;
+                    case '{':
+                        // nested mapping
+                        $value = self::parseMapping($mapping, $i, $references);
+                        // Spec: Keys MUST be unique; first one wins.
+                        // Parser cannot abort this mapping earlier, since lines
+                        // are processed sequentially.
+                        if (!isset($output[$key])) {
+                            $output[$key] = $value;
+                        }
+                        $done = true;
+                        break;
+                    case ':':
+                    case ' ':
+                        break;
+                    default:
+                        $value = self::parseScalar($mapping, array(',', '}'), array('"', "'"), $i, true, $references);
+                        // Spec: Keys MUST be unique; first one wins.
+                        // Parser cannot abort this mapping earlier, since lines
+                        // are processed sequentially.
+                        if (!isset($output[$key])) {
+                            $output[$key] = $value;
+                        }
+                        $done = true;
+                        --$i;
+                }
+
+                ++$i;
+
+                if ($done) {
+                    continue 2;
+                }
+            }
+        }
+
+        throw new ParseException(sprintf('Malformed inline YAML string: %s.', $mapping));
+    }
+
+    /**
+     * Evaluates scalars and replaces magic values.
+     *
+     * @param string $scalar
+     * @param array  $references
+     *
+     * @return string A YAML string
+     *
+     * @throws ParseException when object parsing support was disabled and the parser detected a PHP object or when a reference could not be resolved
+     */
+    private static function evaluateScalar($scalar, $references = array())
+    {
+        $scalar = trim($scalar);
+        $scalarLower = strtolower($scalar);
+
+        if (0 === strpos($scalar, '*')) {
+            if (false !== $pos = strpos($scalar, '#')) {
+                $value = substr($scalar, 1, $pos - 2);
+            } else {
+                $value = substr($scalar, 1);
+            }
+
+            // an unquoted *
+            if (false === $value || '' === $value) {
+                throw new ParseException('A reference must contain at least one character.');
+            }
+
+            if (!array_key_exists($value, $references)) {
+                throw new ParseException(sprintf('Reference "%s" does not exist.', $value));
+            }
+
+            return $references[$value];
+        }
+
+        switch (true) {
+            case 'null' === $scalarLower:
+            case '' === $scalar:
+            case '~' === $scalar:
+                return;
+            case 'true' === $scalarLower:
+                return true;
+            case 'false' === $scalarLower:
+                return false;
+            // Optimise for returning strings.
+            case $scalar[0] === '+' || $scalar[0] === '-' || $scalar[0] === '.' || $scalar[0] === '!' || is_numeric($scalar[0]):
+                switch (true) {
+                    case 0 === strpos($scalar, '!str'):
+                        return (string) substr($scalar, 5);
+                    case 0 === strpos($scalar, '! '):
+                        return (int) self::parseScalar(substr($scalar, 2));
+                    case 0 === strpos($scalar, '!php/object:'):
+                        if (self::$objectSupport) {
+                            return unserialize(substr($scalar, 12));
+                        }
+
+                        if (self::$exceptionOnInvalidType) {
+                            throw new ParseException('Object support when parsing a YAML file has been disabled.');
+                        }
+
+                        return;
+                    case 0 === strpos($scalar, '!!php/object:'):
+                        if (self::$objectSupport) {
+                            return unserialize(substr($scalar, 13));
+                        }
+
+                        if (self::$exceptionOnInvalidType) {
+                            throw new ParseException('Object support when parsing a YAML file has been disabled.');
+                        }
+
+                        return;
+                    case 0 === strpos($scalar, '!!float '):
+                        return (float) substr($scalar, 8);
+                    case ctype_digit($scalar):
+                        $raw = $scalar;
+                        $cast = (int) $scalar;
+
+                        return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw);
+                    case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)):
+                        $raw = $scalar;
+                        $cast = (int) $scalar;
+
+                        return '0' == $scalar[1] ? octdec($scalar) : (((string) $raw === (string) $cast) ? $cast : $raw);
+                    case is_numeric($scalar):
+                    case preg_match(self::getHexRegex(), $scalar):
+                        return '0x' === $scalar[0].$scalar[1] ? hexdec($scalar) : (float) $scalar;
+                    case '.inf' === $scalarLower:
+                    case '.nan' === $scalarLower:
+                        return -log(0);
+                    case '-.inf' === $scalarLower:
+                        return log(0);
+                    case preg_match('/^(-|\+)?[0-9,]+(\.[0-9]+)?$/', $scalar):
+                        return (float) str_replace(',', '', $scalar);
+                    case preg_match(self::getTimestampRegex(), $scalar):
+                        $timeZone = date_default_timezone_get();
+                        date_default_timezone_set('UTC');
+                        $time = strtotime($scalar);
+                        date_default_timezone_set($timeZone);
+
+                        return $time;
+                }
+            default:
+                return (string) $scalar;
+        }
+    }
+
+    /**
+     * Gets a regex that matches a YAML date.
+     *
+     * @return string The regular expression
+     *
+     * @see http://www.yaml.org/spec/1.2/spec.html#id2761573
+     */
+    private static function getTimestampRegex()
+    {
+        return <<<EOF
+        ~^
+        (?P<year>[0-9][0-9][0-9][0-9])
+        -(?P<month>[0-9][0-9]?)
+        -(?P<day>[0-9][0-9]?)
+        (?:(?:[Tt]|[ \t]+)
+        (?P<hour>[0-9][0-9]?)
+        :(?P<minute>[0-9][0-9])
+        :(?P<second>[0-9][0-9])
+        (?:\.(?P<fraction>[0-9]*))?
+        (?:[ \t]*(?P<tz>Z|(?P<tz_sign>[-+])(?P<tz_hour>[0-9][0-9]?)
+        (?::(?P<tz_minute>[0-9][0-9]))?))?)?
+        $~x
+EOF;
+    }
+
+    /**
+     * Gets a regex that matches a YAML number in hexadecimal notation.
+     *
+     * @return string
+     */
+    private static function getHexRegex()
+    {
+        return '~^0x[0-9a-f]++$~i';
+    }
+}
--- /dev/null
+++ b/vendor/symfony/yaml/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2016 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+++ b/vendor/symfony/yaml/Parser.php
@@ -0,0 +1,821 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml;
+
+use Symfony\Component\Yaml\Exception\ParseException;
+
+/**
+ * Parser parses YAML strings to convert them to PHP arrays.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Parser
+{
+    const BLOCK_SCALAR_HEADER_PATTERN = '(?P<separator>\||>)(?P<modifiers>\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P<comments> +#.*)?';
+    // BC - wrongly named
+    const FOLDED_SCALAR_PATTERN = self::BLOCK_SCALAR_HEADER_PATTERN;
+
+    private $offset = 0;
+    private $totalNumberOfLines;
+    private $lines = array();
+    private $currentLineNb = -1;
+    private $currentLine = '';
+    private $refs = array();
+    private $skippedLineNumbers = array();
+    private $locallySkippedLineNumbers = array();
+
+    /**
+     * Constructor.
+     *
+     * @param int      $offset             The offset of YAML document (used for line numbers in error messages)
+     * @param int|null $totalNumberOfLines The overall number of lines being parsed
+     * @param int[]    $skippedLineNumbers Number of comment lines that have been skipped by the parser
+     */
+    public function __construct($offset = 0, $totalNumberOfLines = null, array $skippedLineNumbers = array())
+    {
+        $this->offset = $offset;
+        $this->totalNumberOfLines = $totalNumberOfLines;
+        $this->skippedLineNumbers = $skippedLineNumbers;
+    }
+
+    /**
+     * Parses a YAML string to a PHP value.
+     *
+     * @param string $value                  A YAML string
+     * @param bool   $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
+     * @param bool   $objectSupport          true if object support is enabled, false otherwise
+     * @param bool   $objectForMap           true if maps should return a stdClass instead of array()
+     *
+     * @return mixed A PHP value
+     *
+     * @throws ParseException If the YAML is not valid
+     */
+    public function parse($value, $exceptionOnInvalidType = false, $objectSupport = false, $objectForMap = false)
+    {
+        if (!preg_match('//u', $value)) {
+            throw new ParseException('The YAML value does not appear to be valid UTF-8.');
+        }
+        $this->currentLineNb = -1;
+        $this->currentLine = '';
+        $value = $this->cleanup($value);
+        $this->lines = explode("\n", $value);
+
+        if (null === $this->totalNumberOfLines) {
+            $this->totalNumberOfLines = count($this->lines);
+        }
+
+        if (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) {
+            $mbEncoding = mb_internal_encoding();
+            mb_internal_encoding('UTF-8');
+        }
+
+        $data = array();
+        $context = null;
+        $allowOverwrite = false;
+        while ($this->moveToNextLine()) {
+            if ($this->isCurrentLineEmpty()) {
+                continue;
+            }
+
+            // tab?
+            if ("\t" === $this->currentLine[0]) {
+                throw new ParseException('A YAML file cannot contain tabs as indentation.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
+            }
+
+            $isRef = $mergeNode = false;
+            if (preg_match('#^\-((?P<leadspaces>\s+)(?P<value>.+?))?\s*$#u', $this->currentLine, $values)) {
+                if ($context && 'mapping' == $context) {
+                    throw new ParseException('You cannot define a sequence item when in a mapping', $this->getRealCurrentLineNb() + 1, $this->currentLine);
+                }
+                $context = 'sequence';
+
+                if (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#u', $values['value'], $matches)) {
+                    $isRef = $matches['ref'];
+                    $values['value'] = $matches['value'];
+                }
+
+                // array
+                if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) {
+                    $data[] = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true), $exceptionOnInvalidType, $objectSupport, $objectForMap);
+                } else {
+                    if (isset($values['leadspaces'])
+                        && preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\{\[].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $values['value'], $matches)
+                    ) {
+                        // this is a compact notation element, add to next block and parse
+                        $block = $values['value'];
+                        if ($this->isNextLineIndented()) {
+                            $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + strlen($values['leadspaces']) + 1);
+                        }
+
+                        $data[] = $this->parseBlock($this->getRealCurrentLineNb(), $block, $exceptionOnInvalidType, $objectSupport, $objectForMap);
+                    } else {
+                        $data[] = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport, $objectForMap, $context);
+                    }
+                }
+                if ($isRef) {
+                    $this->refs[$isRef] = end($data);
+                }
+            } elseif (preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\[\{].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $this->currentLine, $values) && (false === strpos($values['key'], ' #') || in_array($values['key'][0], array('"', "'")))) {
+                if ($context && 'sequence' == $context) {
+                    throw new ParseException('You cannot define a mapping item when in a sequence', $this->currentLineNb + 1, $this->currentLine);
+                }
+                $context = 'mapping';
+
+                // force correct settings
+                Inline::parse(null, $exceptionOnInvalidType, $objectSupport, $objectForMap, $this->refs);
+                try {
+                    $key = Inline::parseScalar($values['key']);
+                } catch (ParseException $e) {
+                    $e->setParsedLine($this->getRealCurrentLineNb() + 1);
+                    $e->setSnippet($this->currentLine);
+
+                    throw $e;
+                }
+
+                // Convert float keys to strings, to avoid being converted to integers by PHP
+                if (is_float($key)) {
+                    $key = (string) $key;
+                }
+
+                if ('<<' === $key) {
+                    $mergeNode = true;
+                    $allowOverwrite = true;
+                    if (isset($values['value']) && 0 === strpos($values['value'], '*')) {
+                        $refName = substr($values['value'], 1);
+                        if (!array_key_exists($refName, $this->refs)) {
+                            throw new ParseException(sprintf('Reference "%s" does not exist.', $refName), $this->getRealCurrentLineNb() + 1, $this->currentLine);
+                        }
+
+                        $refValue = $this->refs[$refName];
+
+                        if (!is_array($refValue)) {
+                            throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
+                        }
+
+                        foreach ($refValue as $key => $value) {
+                            if (!isset($data[$key])) {
+                                $data[$key] = $value;
+                            }
+                        }
+                    } else {
+                        if (isset($values['value']) && $values['value'] !== '') {
+                            $value = $values['value'];
+                        } else {
+                            $value = $this->getNextEmbedBlock();
+                        }
+                        $parsed = $this->parseBlock($this->getRealCurrentLineNb() + 1, $value, $exceptionOnInvalidType, $objectSupport, $objectForMap);
+
+                        if (!is_array($parsed)) {
+                            throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
+                        }
+
+                        if (isset($parsed[0])) {
+                            // If the value associated with the merge key is a sequence, then this sequence is expected to contain mapping nodes
+                            // and each of these nodes is merged in turn according to its order in the sequence. Keys in mapping nodes earlier
+                            // in the sequence override keys specified in later mapping nodes.
+                            foreach ($parsed as $parsedItem) {
+                                if (!is_array($parsedItem)) {
+                                    throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem);
+                                }
+
+                                foreach ($parsedItem as $key => $value) {
+                                    if (!isset($data[$key])) {
+                                        $data[$key] = $value;
+                                    }
+                                }
+                            }
+                        } else {
+                            // If the value associated with the key is a single mapping node, each of its key/value pairs is inserted into the
+                            // current mapping, unless the key already exists in it.
+                            foreach ($parsed as $key => $value) {
+                                if (!isset($data[$key])) {
+                                    $data[$key] = $value;
+                                }
+                            }
+                        }
+                    }
+                } elseif (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#u', $values['value'], $matches)) {
+                    $isRef = $matches['ref'];
+                    $values['value'] = $matches['value'];
+                }
+
+                if ($mergeNode) {
+                    // Merge keys
+                } elseif (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) {
+                    // hash
+                    // if next line is less indented or equal, then it means that the current value is null
+                    if (!$this->isNextLineIndented() && !$this->isNextLineUnIndentedCollection()) {
+                        // Spec: Keys MUST be unique; first one wins.
+                        // But overwriting is allowed when a merge node is used in current block.
+                        if ($allowOverwrite || !isset($data[$key])) {
+                            $data[$key] = null;
+                        }
+                    } else {
+                        $value = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(), $exceptionOnInvalidType, $objectSupport, $objectForMap);
+                        // Spec: Keys MUST be unique; first one wins.
+                        // But overwriting is allowed when a merge node is used in current block.
+                        if ($allowOverwrite || !isset($data[$key])) {
+                            $data[$key] = $value;
+                        }
+                    }
+                } else {
+                    $value = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport, $objectForMap, $context);
+                    // Spec: Keys MUST be unique; first one wins.
+                    // But overwriting is allowed when a merge node is used in current block.
+                    if ($allowOverwrite || !isset($data[$key])) {
+                        $data[$key] = $value;
+                    }
+                }
+                if ($isRef) {
+                    $this->refs[$isRef] = $data[$key];
+                }
+            } else {
+                // multiple documents are not supported
+                if ('---' === $this->currentLine) {
+                    throw new ParseException('Multiple documents are not supported.', $this->currentLineNb + 1, $this->currentLine);
+                }
+
+                // 1-liner optionally followed by newline(s)
+                if (is_string($value) && $this->lines[0] === trim($value)) {
+                    try {
+                        $value = Inline::parse($this->lines[0], $exceptionOnInvalidType, $objectSupport, $objectForMap, $this->refs);
+                    } catch (ParseException $e) {
+                        $e->setParsedLine($this->getRealCurrentLineNb() + 1);
+                        $e->setSnippet($this->currentLine);
+
+                        throw $e;
+                    }
+
+                    if (isset($mbEncoding)) {
+                        mb_internal_encoding($mbEncoding);
+                    }
+
+                    return $value;
+                }
+
+                switch (preg_last_error()) {
+                    case PREG_INTERNAL_ERROR:
+                        $error = 'Internal PCRE error.';
+                        break;
+                    case PREG_BACKTRACK_LIMIT_ERROR:
+                        $error = 'pcre.backtrack_limit reached.';
+                        break;
+                    case PREG_RECURSION_LIMIT_ERROR:
+                        $error = 'pcre.recursion_limit reached.';
+                        break;
+                    case PREG_BAD_UTF8_ERROR:
+                        $error = 'Malformed UTF-8 data.';
+                        break;
+                    case PREG_BAD_UTF8_OFFSET_ERROR:
+                        $error = 'Offset doesn\'t correspond to the begin of a valid UTF-8 code point.';
+                        break;
+                    default:
+                        $error = 'Unable to parse.';
+                }
+
+                throw new ParseException($error, $this->getRealCurrentLineNb() + 1, $this->currentLine);
+            }
+        }
+
+        if (isset($mbEncoding)) {
+            mb_internal_encoding($mbEncoding);
+        }
+
+        if ($objectForMap && !is_object($data) && 'mapping' === $context) {
+            $object = new \stdClass();
+
+            foreach ($data as $key => $value) {
+                $object->$key = $value;
+            }
+
+            $data = $object;
+        }
+
+        return empty($data) ? null : $data;
+    }
+
+    private function parseBlock($offset, $yaml, $exceptionOnInvalidType, $objectSupport, $objectForMap)
+    {
+        $skippedLineNumbers = $this->skippedLineNumbers;
+
+        foreach ($this->locallySkippedLineNumbers as $lineNumber) {
+            if ($lineNumber < $offset) {
+                continue;
+            }
+
+            $skippedLineNumbers[] = $lineNumber;
+        }
+
+        $parser = new self($offset, $this->totalNumberOfLines, $skippedLineNumbers);
+        $parser->refs = &$this->refs;
+
+        return $parser->parse($yaml, $exceptionOnInvalidType, $objectSupport, $objectForMap);
+    }
+
+    /**
+     * Returns the current line number (takes the offset into account).
+     *
+     * @return int The current line number
+     */
+    private function getRealCurrentLineNb()
+    {
+        $realCurrentLineNumber = $this->currentLineNb + $this->offset;
+
+        foreach ($this->skippedLineNumbers as $skippedLineNumber) {
+            if ($skippedLineNumber > $realCurrentLineNumber) {
+                break;
+            }
+
+            ++$realCurrentLineNumber;
+        }
+
+        return $realCurrentLineNumber;
+    }
+
+    /**
+     * Returns the current line indentation.
+     *
+     * @return int The current line indentation
+     */
+    private function getCurrentLineIndentation()
+    {
+        return strlen($this->currentLine) - strlen(ltrim($this->currentLine, ' '));
+    }
+
+    /**
+     * Returns the next embed block of YAML.
+     *
+     * @param int  $indentation The indent level at which the block is to be read, or null for default
+     * @param bool $inSequence  True if the enclosing data structure is a sequence
+     *
+     * @return string A YAML string
+     *
+     * @throws ParseException When indentation problem are detected
+     */
+    private function getNextEmbedBlock($indentation = null, $inSequence = false)
+    {
+        $oldLineIndentation = $this->getCurrentLineIndentation();
+        $blockScalarIndentations = array();
+
+        if ($this->isBlockScalarHeader()) {
+            $blockScalarIndentations[] = $this->getCurrentLineIndentation();
+        }
+
+        if (!$this->moveToNextLine()) {
+            return;
+        }
+
+        if (null === $indentation) {
+            $newIndent = $this->getCurrentLineIndentation();
+
+            $unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem();
+
+            if (!$this->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) {
+                throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
+            }
+        } else {
+            $newIndent = $indentation;
+        }
+
+        $data = array();
+        if ($this->getCurrentLineIndentation() >= $newIndent) {
+            $data[] = substr($this->currentLine, $newIndent);
+        } else {
+            $this->moveToPreviousLine();
+
+            return;
+        }
+
+        if ($inSequence && $oldLineIndentation === $newIndent && isset($data[0][0]) && '-' === $data[0][0]) {
+            // the previous line contained a dash but no item content, this line is a sequence item with the same indentation
+            // and therefore no nested list or mapping
+            $this->moveToPreviousLine();
+
+            return;
+        }
+
+        $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem();
+
+        if (empty($blockScalarIndentations) && $this->isBlockScalarHeader()) {
+            $blockScalarIndentations[] = $this->getCurrentLineIndentation();
+        }
+
+        $previousLineIndentation = $this->getCurrentLineIndentation();
+
+        while ($this->moveToNextLine()) {
+            $indent = $this->getCurrentLineIndentation();
+
+            // terminate all block scalars that are more indented than the current line
+            if (!empty($blockScalarIndentations) && $indent < $previousLineIndentation && trim($this->currentLine) !== '') {
+                foreach ($blockScalarIndentations as $key => $blockScalarIndentation) {
+                    if ($blockScalarIndentation >= $this->getCurrentLineIndentation()) {
+                        unset($blockScalarIndentations[$key]);
+                    }
+                }
+            }
+
+            if (empty($blockScalarIndentations) && !$this->isCurrentLineComment() && $this->isBlockScalarHeader()) {
+                $blockScalarIndentations[] = $this->getCurrentLineIndentation();
+            }
+
+            $previousLineIndentation = $indent;
+
+            if ($isItUnindentedCollection && !$this->isStringUnIndentedCollectionItem() && $newIndent === $indent) {
+                $this->moveToPreviousLine();
+                break;
+            }
+
+            if ($this->isCurrentLineBlank()) {
+                $data[] = substr($this->currentLine, $newIndent);
+                continue;
+            }
+
+            // we ignore "comment" lines only when we are not inside a scalar block
+            if (empty($blockScalarIndentations) && $this->isCurrentLineComment()) {
+                // remember ignored comment lines (they are used later in nested
+                // parser calls to determine real line numbers)
+                //
+                // CAUTION: beware to not populate the global property here as it
+                // will otherwise influence the getRealCurrentLineNb() call here
+                // for consecutive comment lines and subsequent embedded blocks
+                $this->locallySkippedLineNumbers[] = $this->getRealCurrentLineNb();
+
+                continue;
+            }
+
+            if ($indent >= $newIndent) {
+                $data[] = substr($this->currentLine, $newIndent);
+            } elseif (0 == $indent) {
+                $this->moveToPreviousLine();
+
+                break;
+            } else {
+                throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
+            }
+        }
+
+        return implode("\n", $data);
+    }
+
+    /**
+     * Moves the parser to the next line.
+     *
+     * @return bool
+     */
+    private function moveToNextLine()
+    {
+        if ($this->currentLineNb >= count($this->lines) - 1) {
+            return false;
+        }
+
+        $this->currentLine = $this->lines[++$this->currentLineNb];
+
+        return true;
+    }
+
+    /**
+     * Moves the parser to the previous line.
+     *
+     * @return bool
+     */
+    private function moveToPreviousLine()
+    {
+        if ($this->currentLineNb < 1) {
+            return false;
+        }
+
+        $this->currentLine = $this->lines[--$this->currentLineNb];
+
+        return true;
+    }
+
+    /**
+     * Parses a YAML value.
+     *
+     * @param string $value                  A YAML value
+     * @param bool   $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise
+     * @param bool   $objectSupport          True if object support is enabled, false otherwise
+     * @param bool   $objectForMap           true if maps should return a stdClass instead of array()
+     * @param string $context                The parser context (either sequence or mapping)
+     *
+     * @return mixed A PHP value
+     *
+     * @throws ParseException When reference does not exist
+     */
+    private function parseValue($value, $exceptionOnInvalidType, $objectSupport, $objectForMap, $context)
+    {
+        if (0 === strpos($value, '*')) {
+            if (false !== $pos = strpos($value, '#')) {
+                $value = substr($value, 1, $pos - 2);
+            } else {
+                $value = substr($value, 1);
+            }
+
+            if (!array_key_exists($value, $this->refs)) {
+                throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLineNb + 1, $this->currentLine);
+            }
+
+            return $this->refs[$value];
+        }
+
+        if (preg_match('/^'.self::BLOCK_SCALAR_HEADER_PATTERN.'$/', $value, $matches)) {
+            $modifiers = isset($matches['modifiers']) ? $matches['modifiers'] : '';
+
+            return $this->parseBlockScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), (int) abs($modifiers));
+        }
+
+        try {
+            $parsedValue = Inline::parse($value, $exceptionOnInvalidType, $objectSupport, $objectForMap, $this->refs);
+
+            if ('mapping' === $context && '"' !== $value[0] && "'" !== $value[0] && '[' !== $value[0] && '{' !== $value[0] && '!' !== $value[0] && false !== strpos($parsedValue, ': ')) {
+                @trigger_error(sprintf('Using a colon in the unquoted mapping value "%s" in line %d is deprecated since Symfony 2.8 and will throw a ParseException in 3.0.', $value, $this->getRealCurrentLineNb() + 1), E_USER_DEPRECATED);
+
+                // to be thrown in 3.0
+                // throw new ParseException('A colon cannot be used in an unquoted mapping value.');
+            }
+
+            return $parsedValue;
+        } catch (ParseException $e) {
+            $e->setParsedLine($this->getRealCurrentLineNb() + 1);
+            $e->setSnippet($this->currentLine);
+
+            throw $e;
+        }
+    }
+
+    /**
+     * Parses a block scalar.
+     *
+     * @param string $style       The style indicator that was used to begin this block scalar (| or >)
+     * @param string $chomping    The chomping indicator that was used to begin this block scalar (+ or -)
+     * @param int    $indentation The indentation indicator that was used to begin this block scalar
+     *
+     * @return string The text value
+     */
+    private function parseBlockScalar($style, $chomping = '', $indentation = 0)
+    {
+        $notEOF = $this->moveToNextLine();
+        if (!$notEOF) {
+            return '';
+        }
+
+        $isCurrentLineBlank = $this->isCurrentLineBlank();
+        $blockLines = array();
+
+        // leading blank lines are consumed before determining indentation
+        while ($notEOF && $isCurrentLineBlank) {
+            // newline only if not EOF
+            if ($notEOF = $this->moveToNextLine()) {
+                $blockLines[] = '';
+                $isCurrentLineBlank = $this->isCurrentLineBlank();
+            }
+        }
+
+        // determine indentation if not specified
+        if (0 === $indentation) {
+            if (preg_match('/^ +/', $this->currentLine, $matches)) {
+                $indentation = strlen($matches[0]);
+            }
+        }
+
+        if ($indentation > 0) {
+            $pattern = sprintf('/^ {%d}(.*)$/', $indentation);
+
+            while (
+                $notEOF && (
+                    $isCurrentLineBlank ||
+                    preg_match($pattern, $this->currentLine, $matches)
+                )
+            ) {
+                if ($isCurrentLineBlank && strlen($this->currentLine) > $indentation) {
+                    $blockLines[] = substr($this->currentLine, $indentation);
+                } elseif ($isCurrentLineBlank) {
+                    $blockLines[] = '';
+                } else {
+                    $blockLines[] = $matches[1];
+                }
+
+                // newline only if not EOF
+                if ($notEOF = $this->moveToNextLine()) {
+                    $isCurrentLineBlank = $this->isCurrentLineBlank();
+                }
+            }
+        } elseif ($notEOF) {
+            $blockLines[] = '';
+        }
+
+        if ($notEOF) {
+            $blockLines[] = '';
+            $this->moveToPreviousLine();
+        } elseif (!$notEOF && !$this->isCurrentLineLastLineInDocument()) {
+            $blockLines[] = '';
+        }
+
+        // folded style
+        if ('>' === $style) {
+            $text = '';
+            $previousLineIndented = false;
+            $previousLineBlank = false;
+
+            for ($i = 0; $i < count($blockLines); ++$i) {
+                if ('' === $blockLines[$i]) {
+                    $text .= "\n";
+                    $previousLineIndented = false;
+                    $previousLineBlank = true;
+                } elseif (' ' === $blockLines[$i][0]) {
+                    $text .= "\n".$blockLines[$i];
+                    $previousLineIndented = true;
+                    $previousLineBlank = false;
+                } elseif ($previousLineIndented) {
+                    $text .= "\n".$blockLines[$i];
+                    $previousLineIndented = false;
+                    $previousLineBlank = false;
+                } elseif ($previousLineBlank || 0 === $i) {
+                    $text .= $blockLines[$i];
+                    $previousLineIndented = false;
+                    $previousLineBlank = false;
+                } else {
+                    $text .= ' '.$blockLines[$i];
+                    $previousLineIndented = false;
+                    $previousLineBlank = false;
+                }
+            }
+        } else {
+            $text = implode("\n", $blockLines);
+        }
+
+        // deal with trailing newlines
+        if ('' === $chomping) {
+            $text = preg_replace('/\n+$/', "\n", $text);
+        } elseif ('-' === $chomping) {
+            $text = preg_replace('/\n+$/', '', $text);
+        }
+
+        return $text;
+    }
+
+    /**
+     * Returns true if the next line is indented.
+     *
+     * @return bool Returns true if the next line is indented, false otherwise
+     */
+    private function isNextLineIndented()
+    {
+        $currentIndentation = $this->getCurrentLineIndentation();
+        $EOF = !$this->moveToNextLine();
+
+        while (!$EOF && $this->isCurrentLineEmpty()) {
+            $EOF = !$this->moveToNextLine();
+        }
+
+        if ($EOF) {
+            return false;
+        }
+
+        $ret = false;
+        if ($this->getCurrentLineIndentation() > $currentIndentation) {
+            $ret = true;
+        }
+
+        $this->moveToPreviousLine();
+
+        return $ret;
+    }
+
+    /**
+     * Returns true if the current line is blank or if it is a comment line.
+     *
+     * @return bool Returns true if the current line is empty or if it is a comment line, false otherwise
+     */
+    private function isCurrentLineEmpty()
+    {
+        return $this->isCurrentLineBlank() || $this->isCurrentLineComment();
+    }
+
+    /**
+     * Returns true if the current line is blank.
+     *
+     * @return bool Returns true if the current line is blank, false otherwise
+     */
+    private function isCurrentLineBlank()
+    {
+        return '' == trim($this->currentLine, ' ');
+    }
+
+    /**
+     * Returns true if the current line is a comment line.
+     *
+     * @return bool Returns true if the current line is a comment line, false otherwise
+     */
+    private function isCurrentLineComment()
+    {
+        //checking explicitly the first char of the trim is faster than loops or strpos
+        $ltrimmedLine = ltrim($this->currentLine, ' ');
+
+        return '' !== $ltrimmedLine && $ltrimmedLine[0] === '#';
+    }
+
+    private function isCurrentLineLastLineInDocument()
+    {
+        return ($this->offset + $this->currentLineNb) >= ($this->totalNumberOfLines - 1);
+    }
+
+    /**
+     * Cleanups a YAML string to be parsed.
+     *
+     * @param string $value The input YAML string
+     *
+     * @return string A cleaned up YAML string
+     */
+    private function cleanup($value)
+    {
+        $value = str_replace(array("\r\n", "\r"), "\n", $value);
+
+        // strip YAML header
+        $count = 0;
+        $value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#u', '', $value, -1, $count);
+        $this->offset += $count;
+
+        // remove leading comments
+        $trimmedValue = preg_replace('#^(\#.*?\n)+#s', '', $value, -1, $count);
+        if ($count == 1) {
+            // items have been removed, update the offset
+            $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
+            $value = $trimmedValue;
+        }
+
+        // remove start of the document marker (---)
+        $trimmedValue = preg_replace('#^\-\-\-.*?\n#s', '', $value, -1, $count);
+        if ($count == 1) {
+            // items have been removed, update the offset
+            $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
+            $value = $trimmedValue;
+
+            // remove end of the document marker (...)
+            $value = preg_replace('#\.\.\.\s*$#', '', $value);
+        }
+
+        return $value;
+    }
+
+    /**
+     * Returns true if the next line starts unindented collection.
+     *
+     * @return bool Returns true if the next line starts unindented collection, false otherwise
+     */
+    private function isNextLineUnIndentedCollection()
+    {
+        $currentIndentation = $this->getCurrentLineIndentation();
+        $notEOF = $this->moveToNextLine();
+
+        while ($notEOF && $this->isCurrentLineEmpty()) {
+            $notEOF = $this->moveToNextLine();
+        }
+
+        if (false === $notEOF) {
+            return false;
+        }
+
+        $ret = false;
+        if (
+            $this->getCurrentLineIndentation() == $currentIndentation
+            &&
+            $this->isStringUnIndentedCollectionItem()
+        ) {
+            $ret = true;
+        }
+
+        $this->moveToPreviousLine();
+
+        return $ret;
+    }
+
+    /**
+     * Returns true if the string is un-indented collection item.
+     *
+     * @return bool Returns true if the string is un-indented collection item, false otherwise
+     */
+    private function isStringUnIndentedCollectionItem()
+    {
+        return '-' === rtrim($this->currentLine) || 0 === strpos($this->currentLine, '- ');
+    }
+
+    /**
+     * Tests whether or not the current line is the header of a block scalar.
+     *
+     * @return bool
+     */
+    private function isBlockScalarHeader()
+    {
+        return (bool) preg_match('~'.self::BLOCK_SCALAR_HEADER_PATTERN.'$~', $this->currentLine);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/yaml/Unescaper.php
@@ -0,0 +1,156 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml;
+
+/**
+ * Unescaper encapsulates unescaping rules for single and double-quoted
+ * YAML strings.
+ *
+ * @author Matthew Lewinski <matthew@lewinski.org>
+ *
+ * @internal
+ */
+class Unescaper
+{
+    /**
+     * Parser and Inline assume UTF-8 encoding, so escaped Unicode characters
+     * must be converted to that encoding.
+     *
+     * @deprecated since version 2.5, to be removed in 3.0
+     *
+     * @internal
+     */
+    const ENCODING = 'UTF-8';
+
+    /**
+     * Regex fragment that matches an escaped character in a double quoted string.
+     */
+    const REGEX_ESCAPED_CHARACTER = '\\\\(x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|.)';
+
+    /**
+     * Unescapes a single quoted string.
+     *
+     * @param string $value A single quoted string
+     *
+     * @return string The unescaped string
+     */
+    public function unescapeSingleQuotedString($value)
+    {
+        return str_replace('\'\'', '\'', $value);
+    }
+
+    /**
+     * Unescapes a double quoted string.
+     *
+     * @param string $value A double quoted string
+     *
+     * @return string The unescaped string
+     */
+    public function unescapeDoubleQuotedString($value)
+    {
+        $self = $this;
+        $callback = function ($match) use ($self) {
+            return $self->unescapeCharacter($match[0]);
+        };
+
+        // evaluate the string
+        return preg_replace_callback('/'.self::REGEX_ESCAPED_CHARACTER.'/u', $callback, $value);
+    }
+
+    /**
+     * Unescapes a character that was found in a double-quoted string.
+     *
+     * @param string $value An escaped character
+     *
+     * @return string The unescaped character
+     *
+     * @internal This method is public to be usable as callback. It should not
+     *           be used in user code. Should be changed in 3.0.
+     */
+    public function unescapeCharacter($value)
+    {
+        switch ($value[1]) {
+            case '0':
+                return "\x0";
+            case 'a':
+                return "\x7";
+            case 'b':
+                return "\x8";
+            case 't':
+                return "\t";
+            case "\t":
+                return "\t";
+            case 'n':
+                return "\n";
+            case 'v':
+                return "\xB";
+            case 'f':
+                return "\xC";
+            case 'r':
+                return "\r";
+            case 'e':
+                return "\x1B";
+            case ' ':
+                return ' ';
+            case '"':
+                return '"';
+            case '/':
+                return '/';
+            case '\\':
+                return '\\';
+            case 'N':
+                // U+0085 NEXT LINE
+                return "\xC2\x85";
+            case '_':
+                // U+00A0 NO-BREAK SPACE
+                return "\xC2\xA0";
+            case 'L':
+                // U+2028 LINE SEPARATOR
+                return "\xE2\x80\xA8";
+            case 'P':
+                // U+2029 PARAGRAPH SEPARATOR
+                return "\xE2\x80\xA9";
+            case 'x':
+                return self::utf8chr(hexdec(substr($value, 2, 2)));
+            case 'u':
+                return self::utf8chr(hexdec(substr($value, 2, 4)));
+            case 'U':
+                return self::utf8chr(hexdec(substr($value, 2, 8)));
+            default:
+                @trigger_error('Not escaping a backslash in a double-quoted string is deprecated since Symfony 2.8 and will throw a ParseException in 3.0.', E_USER_DEPRECATED);
+
+                return $value;
+        }
+    }
+
+    /**
+     * Get the UTF-8 character for the given code point.
+     *
+     * @param int $c The unicode code point
+     *
+     * @return string The corresponding UTF-8 character
+     */
+    private static function utf8chr($c)
+    {
+        if (0x80 > $c %= 0x200000) {
+            return chr($c);
+        }
+        if (0x800 > $c) {
+            return chr(0xC0 | $c >> 6).chr(0x80 | $c & 0x3F);
+        }
+        if (0x10000 > $c) {
+            return chr(0xE0 | $c >> 12).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F);
+        }
+
+        return chr(0xF0 | $c >> 18).chr(0x80 | $c >> 12 & 0x3F).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/yaml/Yaml.php
@@ -0,0 +1,100 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Yaml;
+
+use Symfony\Component\Yaml\Exception\ParseException;
+
+/**
+ * Yaml offers convenience methods to load and dump YAML.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Yaml
+{
+    /**
+     * Parses YAML into a PHP value.
+     *
+     *  Usage:
+     *  <code>
+     *   $array = Yaml::parse(file_get_contents('config.yml'));
+     *   print_r($array);
+     *  </code>
+     *
+     * As this method accepts both plain strings and file names as an input,
+     * you must validate the input before calling this method. Passing a file
+     * as an input is a deprecated feature and will be removed in 3.0.
+     *
+     * Note: the ability to pass file names to the Yaml::parse method is deprecated since version 2.2 and will be removed in 3.0. Pass the YAML contents of the file instead.
+     *
+     * @param string $input                  Path to a YAML file or a string containing YAML
+     * @param bool   $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise
+     * @param bool   $objectSupport          True if object support is enabled, false otherwise
+     * @param bool   $objectForMap           True if maps should return a stdClass instead of array()
+     *
+     * @return mixed The YAML converted to a PHP value
+     *
+     * @throws ParseException If the YAML is not valid
+     */
+    public static function parse($input, $exceptionOnInvalidType = false, $objectSupport = false, $objectForMap = false)
+    {
+        // if input is a file, process it
+        $file = '';
+        if (strpos($input, "\n") === false && is_file($input)) {
+            @trigger_error('The ability to pass file names to the '.__METHOD__.' method is deprecated since version 2.2 and will be removed in 3.0. Pass the YAML contents of the file instead.', E_USER_DEPRECATED);
+
+            if (false === is_readable($input)) {
+                throw new ParseException(sprintf('Unable to parse "%s" as the file is not readable.', $input));
+            }
+
+            $file = $input;
+            $input = file_get_contents($file);
+        }
+
+        $yaml = new Parser();
+
+        try {
+            return $yaml->parse($input, $exceptionOnInvalidType, $objectSupport, $objectForMap);
+        } catch (ParseException $e) {
+            if ($file) {
+                $e->setParsedFile($file);
+            }
+
+            throw $e;
+        }
+    }
+
+    /**
+     * Dumps a PHP value to a YAML string.
+     *
+     * The dump method, when supplied with an array, will do its best
+     * to convert the array into friendly YAML.
+     *
+     * @param mixed $input                  The PHP value
+     * @param int   $inline                 The level where you switch to inline YAML
+     * @param int   $indent                 The amount of spaces to use for indentation of nested nodes
+     * @param bool  $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
+     * @param bool  $objectSupport          true if object support is enabled, false otherwise
+     *
+     * @return string A YAML string representing the original PHP value
+     */
+    public static function dump($input, $inline = 2, $indent = 4, $exceptionOnInvalidType = false, $objectSupport = false)
+    {
+        if ($indent < 1) {
+            throw new \InvalidArgumentException('The indentation must be greater than zero.');
+        }
+
+        $yaml = new Dumper();
+        $yaml->setIndentation($indent);
+
+        return $yaml->dump($input, $inline, 0, $exceptionOnInvalidType, $objectSupport);
+    }
+}
--- /dev/null
+++ b/vendor/symfony/yaml/composer.json
@@ -0,0 +1,33 @@
+{
+    "name": "symfony/yaml",
+    "type": "library",
+    "description": "Symfony Yaml Component",
+    "keywords": [],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.9"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Component\\Yaml\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.8-dev"
+        }
+    }
+}
--- a/vendor/twig/twig/lib/Twig/Cache/Filesystem.php
+++ b/vendor/twig/twig/lib/Twig/Cache/Filesystem.php
@@ -46,7 +46,9 @@ class Twig_Cache_Filesystem implements Twig_CacheInterface
      */
     public function load($key)
     {
-        @include_once $key;
+        if (file_exists($key)) {
+            @include_once $key;
+        }
     }
 
     /**
--- a/vendor/twig/twig/lib/Twig/Environment.php
+++ b/vendor/twig/twig/lib/Twig/Environment.php
@@ -16,7 +16,7 @@
  */
 class Twig_Environment
 {
-    const VERSION = '1.24.1';
+    const VERSION = '1.24.2';
 
     protected $charset;
     protected $loader;
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php
@@ -12,9 +12,9 @@ class Twig_Node_Expression_Binary_FloorDiv extends Twig_Node_Expression_Binary
 {
     public function compile(Twig_Compiler $compiler)
     {
-        $compiler->raw('intval(floor(');
+        $compiler->raw('(int) floor(');
         parent::compile($compiler);
-        $compiler->raw('))');
+        $compiler->raw(')');
     }
 
     public function operator(Twig_Compiler $compiler)
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Call.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Call.php
@@ -240,7 +240,7 @@ abstract class Twig_Node_Expression_Call extends Twig_Node_Expression
                 array_pop($parameters);
             } else {
                 $callableName = $r->name;
-                if ($r->getDeclaringClass()) {
+                if ($r instanceof ReflectionMethod) {
                     $callableName = $r->getDeclaringClass()->name.'::'.$callableName;
                 }
 
--- a/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php
+++ b/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php
@@ -38,6 +38,7 @@ class Twig_NodeVisitor_Escaper extends Twig_BaseNodeVisitor
                 $this->defaultStrategy = $defaultStrategy;
             }
             $this->safeVars = array();
+            $this->blocks = array();
         } elseif ($node instanceof Twig_Node_AutoEscape) {
             $this->statusStack[] = $node->getAttribute('value');
         } elseif ($node instanceof Twig_Node_Block) {
@@ -57,6 +58,7 @@ class Twig_NodeVisitor_Escaper extends Twig_BaseNodeVisitor
         if ($node instanceof Twig_Node_Module) {
             $this->defaultStrategy = false;
             $this->safeVars = array();
+            $this->blocks = array();
         } elseif ($node instanceof Twig_Node_Expression_Filter) {
             return $this->preEscapeFilterNode($node, $env);
         } elseif ($node instanceof Twig_Node_Print) {
--- /dev/null
+++ b/vendor/zendframework/zend-code/LICENSE.md
@@ -0,0 +1,28 @@
+Copyright (c) 2005-2015, Zend Technologies USA, Inc.
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+- Redistributions of source code must retain the above copyright notice,
+  this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+- Neither the name of Zend Technologies USA, Inc. nor the names of its
+  contributors may be used to endorse or promote products derived from this
+  software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- /dev/null
+++ b/vendor/zendframework/zend-code/composer.json
@@ -0,0 +1,43 @@
+{
+    "name": "zendframework/zend-code",
+    "description": "provides facilities to generate arbitrary code using an object oriented interface",
+    "license": "BSD-3-Clause",
+    "keywords": [
+        "zf2",
+        "code"
+    ],
+    "homepage": "https://github.com/zendframework/zend-code",
+    "autoload": {
+        "psr-4": {
+            "Zend\\Code\\": "src/"
+        }
+    },
+    "require": {
+        "php": ">=5.3.23",
+        "zendframework/zend-eventmanager": "~2.5"
+    },
+    "require-dev": {
+        "doctrine/common": ">=2.1",
+        "zendframework/zend-stdlib": "~2.5",
+        "zendframework/zend-version": "~2.5",
+        "fabpot/php-cs-fixer": "1.7.*",
+        "phpunit/PHPUnit": "~4.0"
+    },
+    "suggest": {
+        "doctrine/common": "Doctrine\\Common >=2.1 for annotation features",
+        "zendframework/zend-stdlib": "Zend\\Stdlib component"
+    },
+    "minimum-stability": "dev",
+    "prefer-stable": true,
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.5-dev",
+            "dev-develop": "2.6-dev"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "ZendTest\\Code\\": "test/"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Annotation/AnnotationCollection.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Annotation;
+
+use ArrayObject;
+
+class AnnotationCollection extends ArrayObject
+{
+    /**
+     * Checks if the collection has annotations for a class
+     *
+     * @param  string $class
+     * @return bool
+     */
+    public function hasAnnotation($class)
+    {
+        foreach ($this as $annotation) {
+            if (get_class($annotation) == $class) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Annotation/AnnotationInterface.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Annotation;
+
+interface AnnotationInterface
+{
+    /**
+     * Initialize
+     *
+     * @param  string $content
+     * @return void
+     */
+    public function initialize($content);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Annotation/AnnotationManager.php
@@ -0,0 +1,109 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Annotation;
+
+use Zend\Code\Annotation\Parser\ParserInterface;
+use Zend\EventManager\Event;
+use Zend\EventManager\EventManager;
+use Zend\EventManager\EventManagerAwareInterface;
+use Zend\EventManager\EventManagerInterface;
+
+/**
+ * Pluggable annotation manager
+ *
+ * Simply composes an EventManager. When createAnnotation() is called, it fires
+ * off an event of the same name, passing it the resolved annotation class, the
+ * annotation content, and the raw annotation string; the first listener to
+ * return an object will halt execution of the event, and that object will be
+ * returned as the annotation.
+ */
+class AnnotationManager implements EventManagerAwareInterface
+{
+    const EVENT_CREATE_ANNOTATION = 'createAnnotation';
+
+    /**
+     * @var EventManagerInterface
+     */
+    protected $events;
+
+    /**
+     * Set the event manager instance
+     *
+     * @param  EventManagerInterface $events
+     * @return AnnotationManager
+     */
+    public function setEventManager(EventManagerInterface $events)
+    {
+        $events->setIdentifiers(array(
+            __CLASS__,
+            get_class($this),
+        ));
+        $this->events = $events;
+
+        return $this;
+    }
+
+    /**
+     * Retrieve event manager
+     *
+     * Lazy loads an instance if none registered.
+     *
+     * @return EventManagerInterface
+     */
+    public function getEventManager()
+    {
+        if (null === $this->events) {
+            $this->setEventManager(new EventManager());
+        }
+
+        return $this->events;
+    }
+
+    /**
+     * Attach a parser to listen to the createAnnotation event
+     *
+     * @param  ParserInterface $parser
+     * @return AnnotationManager
+     */
+    public function attach(ParserInterface $parser)
+    {
+        $this->getEventManager()
+             ->attach(self::EVENT_CREATE_ANNOTATION, array($parser, 'onCreateAnnotation'));
+
+        return $this;
+    }
+
+    /**
+     * Create Annotation
+     *
+     * @param  string[] $annotationData
+     * @return false|\stdClass
+     */
+    public function createAnnotation(array $annotationData)
+    {
+        $event = new Event();
+        $event->setName(self::EVENT_CREATE_ANNOTATION);
+        $event->setTarget($this);
+        $event->setParams(array(
+            'class'   => $annotationData[0],
+            'content' => $annotationData[1],
+            'raw'     => $annotationData[2],
+        ));
+
+        $eventManager = $this->getEventManager();
+        $results = $eventManager->trigger($event, function ($r) {
+            return (is_object($r));
+        });
+
+        $annotation = $results->last();
+
+        return (is_object($annotation) ? $annotation : false);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Annotation/Parser/DoctrineAnnotationParser.php
@@ -0,0 +1,153 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Annotation\Parser;
+
+use Doctrine\Common\Annotations\AnnotationRegistry;
+use Doctrine\Common\Annotations\DocParser;
+use Traversable;
+use Zend\Code\Exception;
+use Zend\EventManager\EventInterface;
+
+/**
+ * A parser for docblock annotations that utilizes the annotation parser from
+ * Doctrine\Common.
+ *
+ * Consumes Doctrine\Common\Annotations\DocParser, and responds to events from
+ * AnnotationManager. If the annotation examined is in the list of classes we
+ * are interested in, the raw annotation is passed to the DocParser in order to
+ * retrieve the annotation object instance. Otherwise, it is skipped.
+ */
+class DoctrineAnnotationParser implements ParserInterface
+{
+    /**
+     * @var array Annotation classes we support on this iteration
+     */
+    protected $allowedAnnotations = array();
+
+    /**
+     * @var DocParser
+     */
+    protected $docParser;
+
+    public function __construct()
+    {
+        // Hack to ensure an attempt to autoload an annotation class is made
+        AnnotationRegistry::registerLoader(function ($class) {
+            return (bool) class_exists($class);
+        });
+    }
+
+    /**
+     * Set the DocParser instance
+     *
+     * @param  DocParser $docParser
+     * @return DoctrineAnnotationParser
+     */
+    public function setDocParser(DocParser $docParser)
+    {
+        $this->docParser = $docParser;
+        return $this;
+    }
+
+    /**
+     * Retrieve the DocParser instance
+     *
+     * If none is registered, lazy-loads a new instance.
+     *
+     * @return DocParser
+     */
+    public function getDocParser()
+    {
+        if (!$this->docParser instanceof DocParser) {
+            $this->setDocParser(new DocParser());
+        }
+
+        return $this->docParser;
+    }
+
+    /**
+     * Handle annotation creation
+     *
+     * @param  EventInterface $e
+     * @return false|\stdClass
+     */
+    public function onCreateAnnotation(EventInterface $e)
+    {
+        $annotationClass = $e->getParam('class', false);
+        if (!$annotationClass) {
+            return false;
+        }
+
+        if (!isset($this->allowedAnnotations[$annotationClass])) {
+            return false;
+        }
+
+        $annotationString = $e->getParam('raw', false);
+        if (!$annotationString) {
+            return false;
+        }
+
+        // Annotation classes provided by the AnnotationScanner are already
+        // resolved to fully-qualified class names. Adding the global namespace
+        // prefix allows the Doctrine annotation parser to locate the annotation
+        // class correctly.
+        $annotationString = preg_replace('/^(@)/', '$1\\', $annotationString);
+
+        $parser      = $this->getDocParser();
+        $annotations = $parser->parse($annotationString);
+        if (empty($annotations)) {
+            return false;
+        }
+
+        $annotation = array_shift($annotations);
+        if (!is_object($annotation)) {
+            return false;
+        }
+
+        return $annotation;
+    }
+
+    /**
+     * Specify an allowed annotation class
+     *
+     * @param  string $annotation
+     * @return DoctrineAnnotationParser
+     */
+    public function registerAnnotation($annotation)
+    {
+        $this->allowedAnnotations[$annotation] = true;
+        return $this;
+    }
+
+    /**
+     * Set many allowed annotations at once
+     *
+     * @param  array|Traversable $annotations Array or traversable object of
+     *         annotation class names
+     * @throws Exception\InvalidArgumentException
+     * @return DoctrineAnnotationParser
+     */
+    public function registerAnnotations($annotations)
+    {
+        if (!is_array($annotations) && !$annotations instanceof Traversable) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s: expects an array or Traversable; received "%s"',
+                __METHOD__,
+                (is_object($annotations) ? get_class($annotations) : gettype($annotations))
+            ));
+        }
+
+        foreach ($annotations as $annotation) {
+            $this->allowedAnnotations[$annotation] = true;
+        }
+
+        return $this;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Annotation/Parser/GenericAnnotationParser.php
@@ -0,0 +1,224 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Annotation\Parser;
+
+use Traversable;
+use Zend\Code\Annotation\AnnotationInterface;
+use Zend\Code\Exception;
+use Zend\EventManager\EventInterface;
+
+/**
+ * Generic annotation parser
+ *
+ * Expects registration of AnnotationInterface instances. Such instances
+ * will be passed annotation content to their initialize() method, which
+ * they are then responsible for parsing.
+ */
+class GenericAnnotationParser implements ParserInterface
+{
+    /**
+     * @var array
+     */
+    protected $aliases = array();
+
+    /**
+     * @var array
+     */
+    protected $annotationNames = array();
+
+    /**
+     * @var AnnotationInterface[]
+     */
+    protected $annotations = array();
+
+    /**
+     * Listen to onCreateAnnotation, and attempt to return an annotation object
+     * instance.
+     *
+     * If the annotation class or alias is not registered, immediately returns
+     * false. Otherwise, resolves the class, clones it, and, if any content is
+     * present, calls {@link AnnotationInterface::initialize()} with the
+     * content.
+     *
+     * @param  EventInterface $e
+     * @return false|AnnotationInterface
+     */
+    public function onCreateAnnotation(EventInterface $e)
+    {
+        $class = $e->getParam('class', false);
+        if (!$class || !$this->hasAnnotation($class)) {
+            return false;
+        }
+
+        $content = $e->getParam('content', '');
+        $content = trim($content, '()');
+
+        if ($this->hasAlias($class)) {
+            $class = $this->resolveAlias($class);
+        }
+
+        $index      = array_search($class, $this->annotationNames);
+        $annotation = $this->annotations[$index];
+
+        $newAnnotation = clone $annotation;
+        if ($content) {
+            $newAnnotation->initialize($content);
+        }
+
+        return $newAnnotation;
+    }
+
+    /**
+     * Register annotations
+     *
+     * @param  string|AnnotationInterface $annotation String class name of an
+     *         AnnotationInterface implementation, or actual instance
+     * @return GenericAnnotationParser
+     * @throws Exception\InvalidArgumentException
+     */
+    public function registerAnnotation($annotation)
+    {
+        $class = false;
+        if (is_string($annotation) && class_exists($annotation)) {
+            $class      = $annotation;
+            $annotation = new $annotation();
+        }
+
+        if (!$annotation instanceof AnnotationInterface) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s: expects an instance of %s\AnnotationInterface; received "%s"',
+                __METHOD__,
+                __NAMESPACE__,
+                (is_object($annotation) ? get_class($annotation) : gettype($annotation))
+            ));
+        }
+
+        $class = $class ?: get_class($annotation);
+
+        if (in_array($class, $this->annotationNames)) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                'An annotation for this class %s already exists',
+                $class
+            ));
+        }
+
+        $this->annotations[]     = $annotation;
+        $this->annotationNames[] = $class;
+    }
+
+    /**
+     * Register many annotations at once
+     *
+     * @param  array|Traversable $annotations
+     * @throws Exception\InvalidArgumentException
+     * @return GenericAnnotationParser
+     */
+    public function registerAnnotations($annotations)
+    {
+        if (!is_array($annotations) && !$annotations instanceof Traversable) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s: expects an array or Traversable; received "%s"',
+                __METHOD__,
+                (is_object($annotations) ? get_class($annotations) : gettype($annotations))
+            ));
+        }
+
+        foreach ($annotations as $annotation) {
+            $this->registerAnnotation($annotation);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Checks if the manager has annotations for a class
+     *
+     * @param  string $class
+     * @return bool
+     */
+    public function hasAnnotation($class)
+    {
+        if (in_array($class, $this->annotationNames)) {
+            return true;
+        }
+
+        if ($this->hasAlias($class)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Alias an annotation name
+     *
+     * @param  string $alias
+     * @param  string $class May be either a registered annotation name or another alias
+     * @throws Exception\InvalidArgumentException
+     * @return GenericAnnotationParser
+     */
+    public function setAlias($alias, $class)
+    {
+        if (!in_array($class, $this->annotationNames) && !$this->hasAlias($class)) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s: Cannot alias "%s" to "%s", as class "%s" is not currently a registered annotation or alias',
+                __METHOD__,
+                $alias,
+                $class,
+                $class
+            ));
+        }
+
+        $alias = $this->normalizeAlias($alias);
+        $this->aliases[$alias] = $class;
+
+        return $this;
+    }
+
+    /**
+     * Normalize an alias name
+     *
+     * @param  string $alias
+     * @return string
+     */
+    protected function normalizeAlias($alias)
+    {
+        return strtolower(str_replace(array('-', '_', ' ', '\\', '/'), '', $alias));
+    }
+
+    /**
+     * Do we have an alias by the provided name?
+     *
+     * @param  string $alias
+     * @return bool
+     */
+    protected function hasAlias($alias)
+    {
+        $alias = $this->normalizeAlias($alias);
+
+        return (isset($this->aliases[$alias]));
+    }
+
+    /**
+     * Resolve an alias to a class name
+     *
+     * @param  string $alias
+     * @return string
+     */
+    protected function resolveAlias($alias)
+    {
+        do {
+            $normalized = $this->normalizeAlias($alias);
+            $class      = $this->aliases[$normalized];
+        } while ($this->hasAlias($class));
+
+        return $class;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Annotation/Parser/ParserInterface.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Annotation\Parser;
+
+use Zend\EventManager\EventInterface;
+
+interface ParserInterface
+{
+    /**
+     * Respond to the "createAnnotation" event
+     *
+     * @param  EventInterface  $e
+     * @return false|\stdClass
+     */
+    public function onCreateAnnotation(EventInterface $e);
+
+    /**
+     * Register an annotation this parser will accept
+     *
+     * @param  mixed $annotation
+     * @return void
+     */
+    public function registerAnnotation($annotation);
+
+    /**
+     * Register multiple annotations this parser will accept
+     *
+     * @param  array|\Traversable $annotations
+     * @return void
+     */
+    public function registerAnnotations($annotations);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Exception/BadMethodCallException.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Exception;
+
+class BadMethodCallException extends \BadMethodCallException implements
+    ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Exception/ExceptionInterface.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Exception;
+
+interface ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Exception/InvalidArgumentException.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Exception;
+
+class InvalidArgumentException extends \InvalidArgumentException implements
+    ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Exception/RuntimeException.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Exception;
+
+class RuntimeException extends \RuntimeException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/AbstractGenerator.php
@@ -0,0 +1,124 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator;
+
+use Traversable;
+
+abstract class AbstractGenerator implements GeneratorInterface
+{
+    /**
+     * Line feed to use in place of EOL
+     */
+    const LINE_FEED = "\n";
+
+    /**
+     * @var bool
+     */
+    protected $isSourceDirty = true;
+
+    /**
+     * @var int|string 4 spaces by default
+     */
+    protected $indentation = '    ';
+
+    /**
+     * @var string
+     */
+    protected $sourceContent = null;
+
+    /**
+     * @param  array $options
+     */
+    public function __construct($options = array())
+    {
+        if ($options) {
+            $this->setOptions($options);
+        }
+    }
+
+    /**
+     * @param  bool $isSourceDirty
+     * @return AbstractGenerator
+     */
+    public function setSourceDirty($isSourceDirty = true)
+    {
+        $this->isSourceDirty = (bool) $isSourceDirty;
+        return $this;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isSourceDirty()
+    {
+        return $this->isSourceDirty;
+    }
+
+    /**
+     * @param  string $indentation
+     * @return AbstractGenerator
+     */
+    public function setIndentation($indentation)
+    {
+        $this->indentation = (string) $indentation;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getIndentation()
+    {
+        return $this->indentation;
+    }
+
+    /**
+     * @param  string $sourceContent
+     * @return AbstractGenerator
+     */
+    public function setSourceContent($sourceContent)
+    {
+        $this->sourceContent = (string) $sourceContent;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getSourceContent()
+    {
+        return $this->sourceContent;
+    }
+
+    /**
+     * @param  array|Traversable $options
+     * @throws Exception\InvalidArgumentException
+     * @return AbstractGenerator
+     */
+    public function setOptions($options)
+    {
+        if (!is_array($options) && !$options instanceof Traversable) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s expects an array or Traversable object; received "%s"',
+                __METHOD__,
+                (is_object($options) ? get_class($options) : gettype($options))
+            ));
+        }
+
+        foreach ($options as $optionName => $optionValue) {
+            $methodName = 'set' . $optionName;
+            if (method_exists($this, $methodName)) {
+                $this->{$methodName}($optionValue);
+            }
+        }
+
+        return $this;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/AbstractMemberGenerator.php
@@ -0,0 +1,224 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator;
+
+abstract class AbstractMemberGenerator extends AbstractGenerator
+{
+    /**#@+
+     * @const int Flags for construction usage
+     */
+    const FLAG_ABSTRACT  = 0x01;
+    const FLAG_FINAL     = 0x02;
+    const FLAG_STATIC    = 0x04;
+    const FLAG_PUBLIC    = 0x10;
+    const FLAG_PROTECTED = 0x20;
+    const FLAG_PRIVATE   = 0x40;
+    /**#@-*/
+
+    /**#@+
+     * @param const string
+     */
+    const VISIBILITY_PUBLIC    = 'public';
+    const VISIBILITY_PROTECTED = 'protected';
+    const VISIBILITY_PRIVATE   = 'private';
+    /**#@-*/
+
+    /**
+     * @var DocBlockGenerator
+     */
+    protected $docBlock = null;
+
+    /**
+     * @var string
+     */
+    protected $name = null;
+
+    /**
+     * @var int
+     */
+    protected $flags = self::FLAG_PUBLIC;
+
+    /**
+     * @param  int|array $flags
+     * @return AbstractMemberGenerator
+     */
+    public function setFlags($flags)
+    {
+        if (is_array($flags)) {
+            $flagsArray = $flags;
+            $flags      = 0x00;
+            foreach ($flagsArray as $flag) {
+                $flags |= $flag;
+            }
+        }
+        // check that visibility is one of three
+        $this->flags = $flags;
+
+        return $this;
+    }
+
+    /**
+     * @param  int $flag
+     * @return AbstractMemberGenerator
+     */
+    public function addFlag($flag)
+    {
+        $this->setFlags($this->flags | $flag);
+        return $this;
+    }
+
+    /**
+     * @param  int $flag
+     * @return AbstractMemberGenerator
+     */
+    public function removeFlag($flag)
+    {
+        $this->setFlags($this->flags & ~$flag);
+        return $this;
+    }
+
+    /**
+     * @param  bool $isAbstract
+     * @return AbstractMemberGenerator
+     */
+    public function setAbstract($isAbstract)
+    {
+        return (($isAbstract) ? $this->addFlag(self::FLAG_ABSTRACT) : $this->removeFlag(self::FLAG_ABSTRACT));
+    }
+
+    /**
+     * @return bool
+     */
+    public function isAbstract()
+    {
+        return (bool) ($this->flags & self::FLAG_ABSTRACT);
+    }
+
+    /**
+     * @param  bool $isFinal
+     * @return AbstractMemberGenerator
+     */
+    public function setFinal($isFinal)
+    {
+        return (($isFinal) ? $this->addFlag(self::FLAG_FINAL) : $this->removeFlag(self::FLAG_FINAL));
+    }
+
+    /**
+     * @return bool
+     */
+    public function isFinal()
+    {
+        return (bool) ($this->flags & self::FLAG_FINAL);
+    }
+
+    /**
+     * @param  bool $isStatic
+     * @return AbstractMemberGenerator
+     */
+    public function setStatic($isStatic)
+    {
+        return (($isStatic) ? $this->addFlag(self::FLAG_STATIC) : $this->removeFlag(self::FLAG_STATIC));
+    }
+
+    /**
+     * @return bool
+     */
+    public function isStatic()
+    {
+        return (bool) ($this->flags & self::FLAG_STATIC); // is FLAG_STATIC in flags
+    }
+
+    /**
+     * @param  string $visibility
+     * @return AbstractMemberGenerator
+     */
+    public function setVisibility($visibility)
+    {
+        switch ($visibility) {
+            case self::VISIBILITY_PUBLIC:
+                $this->removeFlag(self::FLAG_PRIVATE | self::FLAG_PROTECTED); // remove both
+                $this->addFlag(self::FLAG_PUBLIC);
+                break;
+            case self::VISIBILITY_PROTECTED:
+                $this->removeFlag(self::FLAG_PUBLIC | self::FLAG_PRIVATE); // remove both
+                $this->addFlag(self::FLAG_PROTECTED);
+                break;
+            case self::VISIBILITY_PRIVATE:
+                $this->removeFlag(self::FLAG_PUBLIC | self::FLAG_PROTECTED); // remove both
+                $this->addFlag(self::FLAG_PRIVATE);
+                break;
+        }
+
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getVisibility()
+    {
+        switch (true) {
+            case ($this->flags & self::FLAG_PROTECTED):
+                return self::VISIBILITY_PROTECTED;
+            case ($this->flags & self::FLAG_PRIVATE):
+                return self::VISIBILITY_PRIVATE;
+            default:
+                return self::VISIBILITY_PUBLIC;
+        }
+    }
+
+    /**
+     * @param  string $name
+     * @return AbstractMemberGenerator
+     */
+    public function setName($name)
+    {
+        $this->name = (string) $name;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * @param  DocBlockGenerator|string $docBlock
+     * @throws Exception\InvalidArgumentException
+     * @return AbstractMemberGenerator
+     */
+    public function setDocBlock($docBlock)
+    {
+        if (is_string($docBlock)) {
+            $docBlock = new DocBlockGenerator($docBlock);
+        } elseif (!$docBlock instanceof DocBlockGenerator) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s is expecting either a string, array or an instance of %s\DocBlockGenerator',
+                __METHOD__,
+                __NAMESPACE__
+            ));
+        }
+
+        $this->docBlock = $docBlock;
+
+        return $this;
+    }
+
+    /**
+     * @return DocBlockGenerator
+     */
+    public function getDocBlock()
+    {
+        return $this->docBlock;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/BodyGenerator.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator;
+
+class BodyGenerator extends AbstractGenerator
+{
+    /**
+     * @var string
+     */
+    protected $content = null;
+
+    /**
+     * @param  string $content
+     * @return BodyGenerator
+     */
+    public function setContent($content)
+    {
+        $this->content = (string) $content;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getContent()
+    {
+        return $this->content;
+    }
+
+    /**
+     * @return string
+     */
+    public function generate()
+    {
+        return $this->getContent();
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/ClassGenerator.php
@@ -0,0 +1,987 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator;
+
+use Zend\Code\Reflection\ClassReflection;
+
+class ClassGenerator extends AbstractGenerator
+{
+    const OBJECT_TYPE = "class";
+
+    const FLAG_ABSTRACT = 0x01;
+    const FLAG_FINAL    = 0x02;
+
+    /**
+     * @var FileGenerator
+     */
+    protected $containingFileGenerator = null;
+
+    /**
+     * @var string
+     */
+    protected $namespaceName = null;
+
+    /**
+     * @var DocBlockGenerator
+     */
+    protected $docBlock = null;
+
+    /**
+     * @var string
+     */
+    protected $name = null;
+
+    /**
+     * @var bool
+     */
+    protected $flags = 0x00;
+
+    /**
+     * @var string
+     */
+    protected $extendedClass = null;
+
+    /**
+     * @var array Array of string names
+     */
+    protected $implementedInterfaces = array();
+
+    /**
+     * @var PropertyGenerator[] Array of properties
+     */
+    protected $properties = array();
+
+    /**
+     * @var PropertyGenerator[] Array of constants
+     */
+    protected $constants = array();
+
+    /**
+     * @var MethodGenerator[] Array of methods
+     */
+    protected $methods = array();
+
+    /**
+     * @var TraitUsageGenerator Object to encapsulate trait usage logic
+     */
+    protected $traitUsageGenerator;
+
+    /**
+     * Build a Code Generation Php Object from a Class Reflection
+     *
+     * @param  ClassReflection $classReflection
+     * @return ClassGenerator
+     */
+    public static function fromReflection(ClassReflection $classReflection)
+    {
+        $cg = new static($classReflection->getName());
+
+        $cg->setSourceContent($cg->getSourceContent());
+        $cg->setSourceDirty(false);
+
+        if ($classReflection->getDocComment() != '') {
+            $cg->setDocBlock(DocBlockGenerator::fromReflection($classReflection->getDocBlock()));
+        }
+
+        $cg->setAbstract($classReflection->isAbstract());
+
+        // set the namespace
+        if ($classReflection->inNamespace()) {
+            $cg->setNamespaceName($classReflection->getNamespaceName());
+        }
+
+        /* @var \Zend\Code\Reflection\ClassReflection $parentClass */
+        $parentClass = $classReflection->getParentClass();
+        $interfaces  = $classReflection->getInterfaces();
+
+        if ($parentClass) {
+            $cg->setExtendedClass($parentClass->getName());
+
+            $interfaces = array_diff($interfaces, $parentClass->getInterfaces());
+        }
+
+        $interfaceNames = array();
+        foreach ($interfaces as $interface) {
+            /* @var \Zend\Code\Reflection\ClassReflection $interface */
+            $interfaceNames[] = $interface->getName();
+        }
+
+        $cg->setImplementedInterfaces($interfaceNames);
+
+        $properties = array();
+
+        foreach ($classReflection->getProperties() as $reflectionProperty) {
+            if ($reflectionProperty->getDeclaringClass()->getName() == $classReflection->getName()) {
+                $properties[] = PropertyGenerator::fromReflection($reflectionProperty);
+            }
+        }
+
+        $cg->addProperties($properties);
+
+        $constants = array();
+
+        foreach ($classReflection->getConstants() as $name => $value) {
+            $constants[] = array(
+                'name' => $name,
+                'value' => $value
+            );
+        }
+
+        $cg->addConstants($constants);
+
+        $methods = array();
+
+        foreach ($classReflection->getMethods() as $reflectionMethod) {
+            $className = ($cg->getNamespaceName()) ? $cg->getNamespaceName() . "\\" . $cg->getName() : $cg->getName();
+
+            if ($reflectionMethod->getDeclaringClass()->getName() == $className) {
+                $methods[] = MethodGenerator::fromReflection($reflectionMethod);
+            }
+        }
+
+        $cg->addMethods($methods);
+
+        return $cg;
+    }
+
+    /**
+     * Generate from array
+     *
+     * @configkey name           string        [required] Class Name
+     * @configkey filegenerator  FileGenerator File generator that holds this class
+     * @configkey namespacename  string        The namespace for this class
+     * @configkey docblock       string        The docblock information
+     * @configkey flags          int           Flags, one of ClassGenerator::FLAG_ABSTRACT ClassGenerator::FLAG_FINAL
+     * @configkey extendedclass  string        Class which this class is extending
+     * @configkey implementedinterfaces
+     * @configkey properties
+     * @configkey methods
+     *
+     * @throws Exception\InvalidArgumentException
+     * @param  array $array
+     * @return ClassGenerator
+     */
+    public static function fromArray(array $array)
+    {
+        if (!isset($array['name'])) {
+            throw new Exception\InvalidArgumentException(
+                'Class generator requires that a name is provided for this object'
+            );
+        }
+
+        $cg = new static($array['name']);
+        foreach ($array as $name => $value) {
+            // normalize key
+            switch (strtolower(str_replace(array('.', '-', '_'), '', $name))) {
+                case 'containingfile':
+                    $cg->setContainingFileGenerator($value);
+                    break;
+                case 'namespacename':
+                    $cg->setNamespaceName($value);
+                    break;
+                case 'docblock':
+                    $docBlock = ($value instanceof DocBlockGenerator) ? $value : DocBlockGenerator::fromArray($value);
+                    $cg->setDocBlock($docBlock);
+                    break;
+                case 'flags':
+                    $cg->setFlags($value);
+                    break;
+                case 'extendedclass':
+                    $cg->setExtendedClass($value);
+                    break;
+                case 'implementedinterfaces':
+                    $cg->setImplementedInterfaces($value);
+                    break;
+                case 'properties':
+                    $cg->addProperties($value);
+                    break;
+                case 'methods':
+                    $cg->addMethods($value);
+                    break;
+            }
+        }
+
+        return $cg;
+    }
+
+    /**
+     * @param  string $name
+     * @param  string $namespaceName
+     * @param  array|string $flags
+     * @param  string $extends
+     * @param  array $interfaces
+     * @param  array $properties
+     * @param  array $methods
+     * @param  DocBlockGenerator $docBlock
+     */
+    public function __construct(
+        $name = null,
+        $namespaceName = null,
+        $flags = null,
+        $extends = null,
+        $interfaces = array(),
+        $properties = array(),
+        $methods = array(),
+        $docBlock = null
+    ) {
+        $this->traitUsageGenerator = new TraitUsageGenerator($this);
+
+        if ($name !== null) {
+            $this->setName($name);
+        }
+        if ($namespaceName !== null) {
+            $this->setNamespaceName($namespaceName);
+        }
+        if ($flags !== null) {
+            $this->setFlags($flags);
+        }
+        if ($properties !== array()) {
+            $this->addProperties($properties);
+        }
+        if ($extends !== null) {
+            $this->setExtendedClass($extends);
+        }
+        if (is_array($interfaces)) {
+            $this->setImplementedInterfaces($interfaces);
+        }
+        if ($methods !== array()) {
+            $this->addMethods($methods);
+        }
+        if ($docBlock !== null) {
+            $this->setDocBlock($docBlock);
+        }
+    }
+
+    /**
+     * @param  string $name
+     * @return ClassGenerator
+     */
+    public function setName($name)
+    {
+        if (strstr($name, '\\')) {
+            $namespace = substr($name, 0, strrpos($name, '\\'));
+            $name      = substr($name, strrpos($name, '\\') + 1);
+            $this->setNamespaceName($namespace);
+        }
+
+        $this->name = $name;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * @param  string $namespaceName
+     * @return ClassGenerator
+     */
+    public function setNamespaceName($namespaceName)
+    {
+        $this->namespaceName = $namespaceName;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getNamespaceName()
+    {
+        return $this->namespaceName;
+    }
+
+    /**
+     * @param  FileGenerator $fileGenerator
+     * @return ClassGenerator
+     */
+    public function setContainingFileGenerator(FileGenerator $fileGenerator)
+    {
+        $this->containingFileGenerator = $fileGenerator;
+        return $this;
+    }
+
+    /**
+     * @return FileGenerator
+     */
+    public function getContainingFileGenerator()
+    {
+        return $this->containingFileGenerator;
+    }
+
+    /**
+     * @param  DocBlockGenerator $docBlock
+     * @return ClassGenerator
+     */
+    public function setDocBlock(DocBlockGenerator $docBlock)
+    {
+        $this->docBlock = $docBlock;
+        return $this;
+    }
+
+    /**
+     * @return DocBlockGenerator
+     */
+    public function getDocBlock()
+    {
+        return $this->docBlock;
+    }
+
+    /**
+     * @param  array|string $flags
+     * @return ClassGenerator
+     */
+    public function setFlags($flags)
+    {
+        if (is_array($flags)) {
+            $flagsArray = $flags;
+            $flags      = 0x00;
+            foreach ($flagsArray as $flag) {
+                $flags |= $flag;
+            }
+        }
+        // check that visibility is one of three
+        $this->flags = $flags;
+
+        return $this;
+    }
+
+    /**
+     * @param  string $flag
+     * @return ClassGenerator
+     */
+    public function addFlag($flag)
+    {
+        $this->setFlags($this->flags | $flag);
+        return $this;
+    }
+
+    /**
+     * @param  string $flag
+     * @return ClassGenerator
+     */
+    public function removeFlag($flag)
+    {
+        $this->setFlags($this->flags & ~$flag);
+        return $this;
+    }
+
+    /**
+     * @param  bool $isAbstract
+     * @return ClassGenerator
+     */
+    public function setAbstract($isAbstract)
+    {
+        return (($isAbstract) ? $this->addFlag(self::FLAG_ABSTRACT) : $this->removeFlag(self::FLAG_ABSTRACT));
+    }
+
+    /**
+     * @return bool
+     */
+    public function isAbstract()
+    {
+        return (bool) ($this->flags & self::FLAG_ABSTRACT);
+    }
+
+    /**
+     * @param  bool $isFinal
+     * @return ClassGenerator
+     */
+    public function setFinal($isFinal)
+    {
+        return (($isFinal) ? $this->addFlag(self::FLAG_FINAL) : $this->removeFlag(self::FLAG_FINAL));
+    }
+
+    /**
+     * @return bool
+     */
+    public function isFinal()
+    {
+        return ($this->flags & self::FLAG_FINAL);
+    }
+
+    /**
+     * @param  string $extendedClass
+     * @return ClassGenerator
+     */
+    public function setExtendedClass($extendedClass)
+    {
+        $this->extendedClass = $extendedClass;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getExtendedClass()
+    {
+        return $this->extendedClass;
+    }
+
+    /**
+     * @param  array $implementedInterfaces
+     * @return ClassGenerator
+     */
+    public function setImplementedInterfaces(array $implementedInterfaces)
+    {
+        $this->implementedInterfaces = $implementedInterfaces;
+        return $this;
+    }
+
+    /**
+     * @return array
+     */
+    public function getImplementedInterfaces()
+    {
+        return $this->implementedInterfaces;
+    }
+
+    /**
+     * @param  string $constantName
+     *
+     * @return PropertyGenerator|false
+     */
+    public function getConstant($constantName)
+    {
+        if (isset($this->constants[$constantName])) {
+            return $this->constants[$constantName];
+        }
+
+        return false;
+    }
+
+    /**
+     * @return PropertyGenerator[] indexed by constant name
+     */
+    public function getConstants()
+    {
+        return $this->constants;
+    }
+
+    /**
+     * @param  string $constantName
+     * @return bool
+     */
+    public function hasConstant($constantName)
+    {
+        return isset($this->constants[$constantName]);
+    }
+
+    /**
+     * Add constant from PropertyGenerator
+     *
+     * @param  PropertyGenerator           $constant
+     * @throws Exception\InvalidArgumentException
+     * @return ClassGenerator
+     */
+    public function addConstantFromGenerator(PropertyGenerator $constant)
+    {
+        $constantName = $constant->getName();
+
+        if (isset($this->constants[$constantName])) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                'A constant by name %s already exists in this class.',
+                $constantName
+            ));
+        }
+
+        if (! $constant->isConst()) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                'The value %s is not defined as a constant.',
+                $constantName
+            ));
+        }
+
+        $this->constants[$constantName] = $constant;
+
+        return $this;
+    }
+
+    /**
+     * Add Constant
+     *
+     * @param  string $name
+     * @param  string $value
+     * @throws Exception\InvalidArgumentException
+     * @return ClassGenerator
+     */
+    public function addConstant($name, $value)
+    {
+        if (!is_string($name)) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s expects string for name',
+                __METHOD__
+            ));
+        }
+
+        if (empty($value) || !is_string($value)) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s expects value for constant, value must be a string',
+                __METHOD__
+            ));
+        }
+
+        return $this->addConstantFromGenerator(new PropertyGenerator($name, $value, PropertyGenerator::FLAG_CONSTANT));
+    }
+
+    /**
+     * @param  PropertyGenerator[]|array[] $constants
+     *
+     * @return ClassGenerator
+     */
+    public function addConstants(array $constants)
+    {
+        foreach ($constants as $constant) {
+            if ($constant instanceof PropertyGenerator) {
+                $this->addPropertyFromGenerator($constant);
+            } else {
+                if (is_array($constant)) {
+                    call_user_func_array(array($this, 'addConstant'), $constant);
+                }
+            }
+        }
+
+        return $this;
+    }
+
+    /**
+     * @param  array $properties
+     * @return ClassGenerator
+     */
+    public function addProperties(array $properties)
+    {
+        foreach ($properties as $property) {
+            if ($property instanceof PropertyGenerator) {
+                $this->addPropertyFromGenerator($property);
+            } else {
+                if (is_string($property)) {
+                    $this->addProperty($property);
+                } elseif (is_array($property)) {
+                    call_user_func_array(array($this, 'addProperty'), $property);
+                }
+            }
+        }
+
+        return $this;
+    }
+
+    /**
+     * Add Property from scalars
+     *
+     * @param  string $name
+     * @param  string|array $defaultValue
+     * @param  int $flags
+     * @throws Exception\InvalidArgumentException
+     * @return ClassGenerator
+     */
+    public function addProperty($name, $defaultValue = null, $flags = PropertyGenerator::FLAG_PUBLIC)
+    {
+        if (!is_string($name)) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s::%s expects string for name',
+                get_class($this),
+                __FUNCTION__
+            ));
+        }
+
+        // backwards compatibility
+        // @todo remove this on next major version
+        if ($flags === PropertyGenerator::FLAG_CONSTANT) {
+            return $this->addConstant($name, $defaultValue);
+        }
+
+        return $this->addPropertyFromGenerator(new PropertyGenerator($name, $defaultValue, $flags));
+    }
+
+    /**
+     * Add property from PropertyGenerator
+     *
+     * @param  PropertyGenerator           $property
+     * @throws Exception\InvalidArgumentException
+     * @return ClassGenerator
+     */
+    public function addPropertyFromGenerator(PropertyGenerator $property)
+    {
+        $propertyName = $property->getName();
+
+        if (isset($this->properties[$propertyName])) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                'A property by name %s already exists in this class.',
+                $propertyName
+            ));
+        }
+
+        // backwards compatibility
+        // @todo remove this on next major version
+        if ($property->isConst()) {
+            return $this->addConstantFromGenerator($property);
+        }
+
+        $this->properties[$propertyName] = $property;
+        return $this;
+    }
+
+    /**
+     * @return PropertyGenerator[]
+     */
+    public function getProperties()
+    {
+        return $this->properties;
+    }
+
+    /**
+     * @param  string $propertyName
+     * @return PropertyGenerator|false
+     */
+    public function getProperty($propertyName)
+    {
+        foreach ($this->getProperties() as $property) {
+            if ($property->getName() == $propertyName) {
+                return $property;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Add a class to "use" classes
+     *
+     * @param  string $use
+     * @param  string|null $useAlias
+     * @return ClassGenerator
+     */
+    public function addUse($use, $useAlias = null)
+    {
+        $this->traitUsageGenerator->addUse($use, $useAlias);
+        return $this;
+    }
+
+    /**
+     * Returns the "use" classes
+     *
+     * @return array
+     */
+    public function getUses()
+    {
+        return $this->traitUsageGenerator->getUses();
+    }
+
+    /**
+     * @param  string $propertyName
+     * @return bool
+     */
+    public function hasProperty($propertyName)
+    {
+        return isset($this->properties[$propertyName]);
+    }
+
+    /**
+     * @param  array $methods
+     * @return ClassGenerator
+     */
+    public function addMethods(array $methods)
+    {
+        foreach ($methods as $method) {
+            if ($method instanceof MethodGenerator) {
+                $this->addMethodFromGenerator($method);
+            } else {
+                if (is_string($method)) {
+                    $this->addMethod($method);
+                } elseif (is_array($method)) {
+                    call_user_func_array(array($this, 'addMethod'), $method);
+                }
+            }
+        }
+
+        return $this;
+    }
+
+    /**
+     * Add Method from scalars
+     *
+     * @param  string $name
+     * @param  array $parameters
+     * @param  int $flags
+     * @param  string $body
+     * @param  string $docBlock
+     * @throws Exception\InvalidArgumentException
+     * @return ClassGenerator
+     */
+    public function addMethod(
+        $name = null,
+        array $parameters = array(),
+        $flags = MethodGenerator::FLAG_PUBLIC,
+        $body = null,
+        $docBlock = null
+    ) {
+        if (!is_string($name)) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s::%s expects string for name',
+                get_class($this),
+                __FUNCTION__
+            ));
+        }
+
+        return $this->addMethodFromGenerator(new MethodGenerator($name, $parameters, $flags, $body, $docBlock));
+    }
+
+    /**
+     * Add Method from MethodGenerator
+     *
+     * @param  MethodGenerator                    $method
+     * @throws Exception\InvalidArgumentException
+     * @return ClassGenerator
+     */
+    public function addMethodFromGenerator(MethodGenerator $method)
+    {
+        $methodName = $method->getName();
+
+        if ($this->hasMethod($methodName)) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                'A method by name %s already exists in this class.',
+                $methodName
+            ));
+        }
+
+        $this->methods[strtolower($methodName)] = $method;
+        return $this;
+    }
+
+    /**
+     * @return MethodGenerator[]
+     */
+    public function getMethods()
+    {
+        return $this->methods;
+    }
+
+    /**
+     * @param  string $methodName
+     * @return MethodGenerator|false
+     */
+    public function getMethod($methodName)
+    {
+        return $this->hasMethod($methodName) ? $this->methods[strtolower($methodName)] : false;
+    }
+
+    /**
+     * @param  string $methodName
+     * @return ClassGenerator
+     */
+    public function removeMethod($methodName)
+    {
+        if ($this->hasMethod($methodName)) {
+            unset($this->methods[strtolower($methodName)]);
+        }
+
+        return $this;
+    }
+
+    /**
+     * @param  string $methodName
+     * @return bool
+     */
+    public function hasMethod($methodName)
+    {
+        return isset($this->methods[strtolower($methodName)]);
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function addTrait($trait)
+    {
+        $this->traitUsageGenerator->addTrait($trait);
+        return $this;
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function addTraits(array $traits)
+    {
+        $this->traitUsageGenerator->addTraits($traits);
+        return $this;
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function hasTrait($traitName)
+    {
+        return $this->traitUsageGenerator->hasTrait($traitName);
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function getTraits()
+    {
+        return $this->traitUsageGenerator->getTraits();
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function removeTrait($traitName)
+    {
+        return $this->traitUsageGenerator->removeTrait($traitName);
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function addTraitAlias($method, $alias, $visibility = null)
+    {
+        $this->traitUsageGenerator->addTraitAlias($method, $alias, $visibility);
+        return $this;
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function getTraitAliases()
+    {
+        return $this->traitUsageGenerator->getTraitAliases();
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function addTraitOverride($method, $traitsToReplace)
+    {
+        $this->traitUsageGenerator->addTraitOverride($method, $traitsToReplace);
+        return $this;
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function removeTraitOverride($method, $overridesToRemove = null)
+    {
+        $this->traitUsageGenerator->removeTraitOverride($method, $overridesToRemove);
+
+        return $this;
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function getTraitOverrides()
+    {
+        return $this->traitUsageGenerator->getTraitOverrides();
+    }
+
+    /**
+     * @return bool
+     */
+    public function isSourceDirty()
+    {
+        if (($docBlock = $this->getDocBlock()) && $docBlock->isSourceDirty()) {
+            return true;
+        }
+
+        foreach ($this->getProperties() as $property) {
+            if ($property->isSourceDirty()) {
+                return true;
+            }
+        }
+
+        foreach ($this->getMethods() as $method) {
+            if ($method->isSourceDirty()) {
+                return true;
+            }
+        }
+
+        return parent::isSourceDirty();
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\GeneratorInterface
+     */
+    public function generate()
+    {
+        if (!$this->isSourceDirty()) {
+            $output = $this->getSourceContent();
+            if (!empty($output)) {
+                return $output;
+            }
+        }
+
+        $indent = $this->getIndentation();
+        $output = '';
+
+        if (null !== ($namespace = $this->getNamespaceName())) {
+            $output .= 'namespace ' . $namespace . ';' . self::LINE_FEED . self::LINE_FEED;
+        }
+
+        $uses = $this->getUses();
+
+        if (!empty($uses)) {
+            foreach ($uses as $use) {
+                $output .= 'use ' . $use . ';' . self::LINE_FEED;
+            }
+
+            $output .= self::LINE_FEED;
+        }
+
+        if (null !== ($docBlock = $this->getDocBlock())) {
+            $docBlock->setIndentation('');
+            $output .= $docBlock->generate();
+        }
+
+        if ($this->isAbstract()) {
+            $output .= 'abstract ';
+        } elseif ($this->isFinal()) {
+            $output .= 'final ';
+        }
+
+        $output .= static::OBJECT_TYPE . ' ' . $this->getName();
+
+        if (!empty($this->extendedClass)) {
+            $output .= ' extends ' . $this->extendedClass;
+        }
+
+        $implemented = $this->getImplementedInterfaces();
+
+        if (!empty($implemented)) {
+            $output .= ' implements ' . implode(', ', $implemented);
+        }
+
+        $output .= self::LINE_FEED . '{' . self::LINE_FEED . self::LINE_FEED;
+        $output .= $this->traitUsageGenerator->generate();
+
+        $constants = $this->getConstants();
+
+        foreach ($constants as $constant) {
+            $output .= $constant->generate() . self::LINE_FEED . self::LINE_FEED;
+        }
+
+        $properties = $this->getProperties();
+
+        foreach ($properties as $property) {
+            $output .= $property->generate() . self::LINE_FEED . self::LINE_FEED;
+        }
+
+        $methods = $this->getMethods();
+
+        foreach ($methods as $method) {
+            $output .= $method->generate() . self::LINE_FEED;
+        }
+
+        $output .= self::LINE_FEED . '}' . self::LINE_FEED;
+
+        return $output;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/DocBlock/Tag.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator\DocBlock;
+
+use Zend\Code\Generator\DocBlock\Tag\GenericTag;
+use Zend\Code\Reflection\DocBlock\Tag\TagInterface as ReflectionTagInterface;
+
+/**
+ * @deprecated Deprecated in 2.3. Use GenericTag instead
+ */
+class Tag extends GenericTag
+{
+    /**
+     * @param  ReflectionTagInterface $reflectionTag
+     * @return Tag
+     * @deprecated Deprecated in 2.3. Use TagManager::createTagFromReflection() instead
+     */
+    public static function fromReflection(ReflectionTagInterface $reflectionTag)
+    {
+        $tagManager = new TagManager();
+        $tagManager->initializeDefaultTags();
+        return $tagManager->createTagFromReflection($reflectionTag);
+    }
+
+    /**
+     * @param  string $description
+     * @return Tag
+     * @deprecated Deprecated in 2.3. Use GenericTag::setContent() instead
+     */
+    public function setDescription($description)
+    {
+        return $this->setContent($description);
+    }
+
+    /**
+     * @return string
+     * @deprecated Deprecated in 2.3. Use GenericTag::getContent() instead
+     */
+    public function getDescription()
+    {
+        return $this->getContent();
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/DocBlock/Tag/AbstractTypeableTag.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator\DocBlock\Tag;
+
+use Zend\Code\Generator\AbstractGenerator;
+
+/**
+ * This abstract class can be used as parent for all tags
+ * that use a type part in their content.
+ * @see http://www.phpdoc.org/docs/latest/for-users/phpdoc/types.html
+ */
+abstract class AbstractTypeableTag extends AbstractGenerator
+{
+    /**
+     * @var string
+     */
+    protected $description = null;
+
+    /**
+     * @var array
+     */
+    protected $types = array();
+
+    /**
+     * @param array $types
+     * @param string $description
+     */
+    public function __construct($types = array(), $description = null)
+    {
+        if (!empty($types)) {
+            $this->setTypes($types);
+        }
+
+        if (!empty($description)) {
+            $this->setDescription($description);
+        }
+    }
+
+    /**
+     * @param string $description
+     * @return ReturnTag
+     */
+    public function setDescription($description)
+    {
+        $this->description = $description;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+
+    /**
+     * Array of types or string with types delimited by pipe (|)
+     * e.g. array('int', 'null') or "int|null"
+     *
+     * @param array|string $types
+     * @return ReturnTag
+     */
+    public function setTypes($types)
+    {
+        if (is_string($types)) {
+            $types = explode('|', $types);
+        }
+        $this->types = $types;
+        return $this;
+    }
+
+    /**
+     * @return array
+     */
+    public function getTypes()
+    {
+        return $this->types;
+    }
+
+    /**
+     * @param string $delimiter
+     * @return string
+     */
+    public function getTypesAsString($delimiter = '|')
+    {
+        return implode($delimiter, $this->types);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/DocBlock/Tag/AuthorTag.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator\DocBlock\Tag;
+
+use Zend\Code\Generator\AbstractGenerator;
+use Zend\Code\Generator\DocBlock\TagManager;
+use Zend\Code\Reflection\DocBlock\Tag\TagInterface as ReflectionTagInterface;
+
+class AuthorTag extends AbstractGenerator implements TagInterface
+{
+    /**
+     * @var string
+     */
+    protected $authorName = null;
+
+    /**
+     * @var string
+     */
+    protected $authorEmail = null;
+
+    /**
+     * @param string $authorName
+     * @param string $authorEmail
+     */
+    public function __construct($authorName = null, $authorEmail = null)
+    {
+        if (!empty($authorName)) {
+            $this->setAuthorName($authorName);
+        }
+
+        if (!empty($authorEmail)) {
+            $this->setAuthorEmail($authorEmail);
+        }
+    }
+
+    /**
+     * @param ReflectionTagInterface $reflectionTag
+     * @return ReturnTag
+     * @deprecated Deprecated in 2.3. Use TagManager::createTagFromReflection() instead
+     */
+    public static function fromReflection(ReflectionTagInterface $reflectionTag)
+    {
+        $tagManager = new TagManager();
+        $tagManager->initializeDefaultTags();
+        return $tagManager->createTagFromReflection($reflectionTag);
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return 'author';
+    }
+
+    /**
+     * @param string $authorEmail
+     * @return AuthorTag
+     */
+    public function setAuthorEmail($authorEmail)
+    {
+        $this->authorEmail = $authorEmail;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getAuthorEmail()
+    {
+        return $this->authorEmail;
+    }
+
+    /**
+     * @param string $authorName
+     * @return AuthorTag
+     */
+    public function setAuthorName($authorName)
+    {
+        $this->authorName = $authorName;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getAuthorName()
+    {
+        return $this->authorName;
+    }
+
+    /**
+     * @return string
+     */
+    public function generate()
+    {
+        $output = '@author'
+            . ((!empty($this->authorName)) ? ' ' . $this->authorName : '')
+            . ((!empty($this->authorEmail)) ? ' <' . $this->authorEmail . '>' : '');
+
+        return $output;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/DocBlock/Tag/GenericTag.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator\DocBlock\Tag;
+
+use Zend\Code\Generator\AbstractGenerator;
+use Zend\Code\Generic\Prototype\PrototypeGenericInterface;
+
+class GenericTag extends AbstractGenerator implements TagInterface, PrototypeGenericInterface
+{
+    /**
+     * @var string
+     */
+    protected $name = null;
+
+    /**
+     * @var string
+     */
+    protected $content = null;
+
+    /**
+     * @param string $name
+     * @param string $content
+     */
+    public function __construct($name = null, $content = null)
+    {
+        if (!empty($name)) {
+            $this->setName($name);
+        }
+
+        if (!empty($content)) {
+            $this->setContent($content);
+        }
+    }
+
+    /**
+     * @param  string $name
+     * @return GenericTag
+     */
+    public function setName($name)
+    {
+        $this->name = ltrim($name, '@');
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * @param string $content
+     * @return GenericTag
+     */
+    public function setContent($content)
+    {
+        $this->content = $content;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getContent()
+    {
+        return $this->content;
+    }
+
+    /**
+     * @return string
+     */
+    public function generate()
+    {
+        $output = '@' . $this->name
+            . ((!empty($this->content)) ? ' ' . $this->content : '');
+
+        return $output;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/DocBlock/Tag/LicenseTag.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator\DocBlock\Tag;
+
+use Zend\Code\Generator\AbstractGenerator;
+use Zend\Code\Generator\DocBlock\TagManager;
+use Zend\Code\Reflection\DocBlock\Tag\TagInterface as ReflectionTagInterface;
+
+class LicenseTag extends AbstractGenerator implements TagInterface
+{
+    /**
+     * @var string
+     */
+    protected $url = null;
+
+    /**
+     * @var string
+     */
+    protected $licenseName = null;
+
+    /**
+     * @param string $url
+     * @param string $licenseName
+     */
+    public function __construct($url = null, $licenseName = null)
+    {
+        if (!empty($url)) {
+            $this->setUrl($url);
+        }
+
+        if (!empty($licenseName)) {
+            $this->setLicenseName($licenseName);
+        }
+    }
+
+    /**
+     * @param ReflectionTagInterface $reflectionTag
+     * @return ReturnTag
+     * @deprecated Deprecated in 2.3. Use TagManager::createTagFromReflection() instead
+     */
+    public static function fromReflection(ReflectionTagInterface $reflectionTag)
+    {
+        $tagManager = new TagManager();
+        $tagManager->initializeDefaultTags();
+        return $tagManager->createTagFromReflection($reflectionTag);
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return 'license';
+    }
+
+    /**
+     * @param string $url
+     * @return LicenseTag
+     */
+    public function setUrl($url)
+    {
+        $this->url = $url;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getUrl()
+    {
+        return $this->url;
+    }
+
+    /**
+     * @param  string $name
+     * @return LicenseTag
+     */
+    public function setLicenseName($name)
+    {
+        $this->licenseName = $name;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getLicenseName()
+    {
+        return $this->licenseName;
+    }
+
+    /**
+     * @return string
+     */
+    public function generate()
+    {
+        $output = '@license'
+            . ((!empty($this->url)) ? ' ' . $this->url : '')
+            . ((!empty($this->licenseName)) ? ' ' . $this->licenseName : '');
+
+        return $output;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/DocBlock/Tag/MethodTag.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator\DocBlock\Tag;
+
+class MethodTag extends AbstractTypeableTag implements TagInterface
+{
+    /**
+     * @var string
+     */
+    protected $methodName = null;
+
+    /**
+     * @var bool
+     */
+    protected $isStatic = false;
+
+    /**
+     * @param string $methodName
+     * @param array $types
+     * @param string $description
+     * @param bool $isStatic
+     */
+    public function __construct($methodName = null, $types = array(), $description = null, $isStatic = false)
+    {
+        if (!empty($methodName)) {
+            $this->setMethodName($methodName);
+        }
+
+        $this->setIsStatic((bool) $isStatic);
+
+        parent::__construct($types, $description);
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return 'method';
+    }
+
+    /**
+     * @param boolean $isStatic
+     * @return MethodTag
+     */
+    public function setIsStatic($isStatic)
+    {
+        $this->isStatic = $isStatic;
+        return $this;
+    }
+
+    /**
+     * @return boolean
+     */
+    public function isStatic()
+    {
+        return $this->isStatic;
+    }
+
+    /**
+     * @param string $methodName
+     * @return MethodTag
+     */
+    public function setMethodName($methodName)
+    {
+        $this->methodName = rtrim($methodName, ')(');
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getMethodName()
+    {
+        return $this->methodName;
+    }
+
+    /**
+     * @return string
+     */
+    public function generate()
+    {
+        $output = '@method'
+            . (($this->isStatic) ? ' static' : '')
+            . ((!empty($this->types)) ? ' ' . $this->getTypesAsString() : '')
+            . ((!empty($this->methodName)) ? ' ' . $this->methodName . '()' : '')
+            . ((!empty($this->description)) ? ' ' . $this->description : '');
+
+        return $output;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/DocBlock/Tag/ParamTag.php
@@ -0,0 +1,124 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator\DocBlock\Tag;
+
+use Zend\Code\Generator\DocBlock\TagManager;
+use Zend\Code\Reflection\DocBlock\Tag\TagInterface as ReflectionTagInterface;
+
+class ParamTag extends AbstractTypeableTag implements TagInterface
+{
+    /**
+     * @var string
+     */
+    protected $variableName = null;
+
+    /**
+     * @param string $variableName
+     * @param array $types
+     * @param string $description
+     */
+    public function __construct($variableName = null, $types = array(), $description = null)
+    {
+        if (!empty($variableName)) {
+            $this->setVariableName($variableName);
+        }
+
+        parent::__construct($types, $description);
+    }
+
+    /**
+     * @param ReflectionTagInterface $reflectionTag
+     * @return ReturnTag
+     * @deprecated Deprecated in 2.3. Use TagManager::createTagFromReflection() instead
+     */
+    public static function fromReflection(ReflectionTagInterface $reflectionTag)
+    {
+        $tagManager = new TagManager();
+        $tagManager->initializeDefaultTags();
+        return $tagManager->createTagFromReflection($reflectionTag);
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return 'param';
+    }
+
+    /**
+     * @param string $variableName
+     * @return ParamTag
+     */
+    public function setVariableName($variableName)
+    {
+        $this->variableName = ltrim($variableName, '$');
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getVariableName()
+    {
+        return $this->variableName;
+    }
+
+    /**
+     * @param string $datatype
+     * @return ReturnTag
+     * @deprecated Deprecated in 2.3. Use setTypes() instead
+     */
+    public function setDatatype($datatype)
+    {
+        return $this->setTypes($datatype);
+    }
+
+    /**
+     * @return string
+     * @deprecated Deprecated in 2.3. Use getTypes() or getTypesAsString() instead
+     */
+    public function getDatatype()
+    {
+        return $this->getTypesAsString();
+    }
+
+    /**
+     * @param  string $paramName
+     * @return ParamTag
+     * @deprecated Deprecated in 2.3. Use setVariableName() instead
+     */
+    public function setParamName($paramName)
+    {
+        return $this->setVariableName($paramName);
+    }
+
+    /**
+     * @return string
+     * @deprecated Deprecated in 2.3. Use getVariableName() instead
+     */
+    public function getParamName()
+    {
+        return $this->getVariableName();
+    }
+
+    /**
+     * @return string
+     */
+    public function generate()
+    {
+        $output = '@param'
+            . ((!empty($this->types)) ? ' ' . $this->getTypesAsString() : '')
+            . ((!empty($this->variableName)) ? ' $' . $this->variableName : '')
+            . ((!empty($this->description)) ? ' ' . $this->description : '');
+
+        return $output;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/DocBlock/Tag/PropertyTag.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator\DocBlock\Tag;
+
+class PropertyTag extends AbstractTypeableTag implements TagInterface
+{
+    /**
+     * @var string
+     */
+    protected $propertyName = null;
+
+    /**
+     * @param string $propertyName
+     * @param array $types
+     * @param string $description
+     */
+    public function __construct($propertyName = null, $types = array(), $description = null)
+    {
+        if (!empty($propertyName)) {
+            $this->setPropertyName($propertyName);
+        }
+
+        parent::__construct($types, $description);
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return 'property';
+    }
+
+    /**
+     * @param string $propertyName
+     * @return self
+     */
+    public function setPropertyName($propertyName)
+    {
+        $this->propertyName = ltrim($propertyName, '$');
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getPropertyName()
+    {
+        return $this->propertyName;
+    }
+
+    /**
+     * @return string
+     */
+    public function generate()
+    {
+        $output = '@property'
+            . ((!empty($this->types)) ? ' ' . $this->getTypesAsString() : '')
+            . ((!empty($this->propertyName)) ? ' $' . $this->propertyName : '')
+            . ((!empty($this->description)) ? ' ' . $this->description : '');
+
+        return $output;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/DocBlock/Tag/ReturnTag.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator\DocBlock\Tag;
+
+use Zend\Code\Generator\DocBlock\TagManager;
+use Zend\Code\Reflection\DocBlock\Tag\TagInterface as ReflectionTagInterface;
+
+class ReturnTag extends AbstractTypeableTag implements TagInterface
+{
+    /**
+     * @param ReflectionTagInterface $reflectionTag
+     * @return ReturnTag
+     * @deprecated Deprecated in 2.3. Use TagManager::createTagFromReflection() instead
+     */
+    public static function fromReflection(ReflectionTagInterface $reflectionTag)
+    {
+        $tagManager = new TagManager();
+        $tagManager->initializeDefaultTags();
+        return $tagManager->createTagFromReflection($reflectionTag);
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return 'return';
+    }
+
+    /**
+     * @param string $datatype
+     * @return ReturnTag
+     * @deprecated Deprecated in 2.3. Use setTypes() instead
+     */
+    public function setDatatype($datatype)
+    {
+        return $this->setTypes($datatype);
+    }
+
+    /**
+     * @return string
+     * @deprecated Deprecated in 2.3. Use getTypes() or getTypesAsString() instead
+     */
+    public function getDatatype()
+    {
+        return $this->getTypesAsString();
+    }
+
+    /**
+     * @return string
+     */
+    public function generate()
+    {
+        $output = '@return '
+        . $this->getTypesAsString()
+        . ((!empty($this->description)) ? ' ' . $this->description : '');
+
+        return $output;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/DocBlock/Tag/TagInterface.php
@@ -0,0 +1,16 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator\DocBlock\Tag;
+
+use Zend\Code\Generic\Prototype\PrototypeInterface;
+
+interface TagInterface extends PrototypeInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/DocBlock/Tag/ThrowsTag.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator\DocBlock\Tag;
+
+class ThrowsTag extends AbstractTypeableTag implements TagInterface
+{
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return 'throws';
+    }
+
+    /**
+     * @return string
+     */
+    public function generate()
+    {
+        $output = '@throws'
+        . ((!empty($this->types)) ? ' ' . $this->getTypesAsString() : '')
+        . ((!empty($this->description)) ? ' ' . $this->description : '');
+
+        return $output;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/DocBlock/TagManager.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator\DocBlock;
+
+use Zend\Code\Generator\DocBlock\Tag\TagInterface;
+use Zend\Code\Generic\Prototype\PrototypeClassFactory;
+use Zend\Code\Reflection\DocBlock\Tag\TagInterface as ReflectionTagInterface;
+
+/**
+ * This class is used in DocBlockGenerator and creates the needed
+ * Tag classes depending on the tag. So for example an @author tag
+ * will trigger the creation of an AuthorTag class.
+ *
+ * If none of the classes is applicable, the GenericTag class will be
+ * created
+ */
+class TagManager extends PrototypeClassFactory
+{
+    /**
+     * @return void
+     */
+    public function initializeDefaultTags()
+    {
+        $this->addPrototype(new Tag\ParamTag());
+        $this->addPrototype(new Tag\ReturnTag());
+        $this->addPrototype(new Tag\MethodTag());
+        $this->addPrototype(new Tag\PropertyTag());
+        $this->addPrototype(new Tag\AuthorTag());
+        $this->addPrototype(new Tag\LicenseTag());
+        $this->addPrototype(new Tag\ThrowsTag());
+        $this->setGenericPrototype(new Tag\GenericTag());
+    }
+
+    /**
+     * @param ReflectionTagInterface $reflectionTag
+     * @return TagInterface
+     */
+    public function createTagFromReflection(ReflectionTagInterface $reflectionTag)
+    {
+        $tagName = $reflectionTag->getName();
+
+        /* @var TagInterface $newTag */
+        $newTag = $this->getClonedPrototype($tagName);
+
+        // transport any properties via accessors and mutators from reflection to codegen object
+        $reflectionClass = new \ReflectionClass($reflectionTag);
+        foreach ($reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
+            if (substr($method->getName(), 0, 3) == 'get') {
+                $propertyName = substr($method->getName(), 3);
+                if (method_exists($newTag, 'set' . $propertyName)) {
+                    $newTag->{'set' . $propertyName}($reflectionTag->{'get' . $propertyName}());
+                }
+            } elseif (substr($method->getName(), 0, 2) == 'is') {
+                $propertyName = ucfirst($method->getName());
+                if (method_exists($newTag, 'set' . $propertyName)) {
+                    $newTag->{'set' . $propertyName}($reflectionTag->{$method->getName()}());
+                }
+            }
+        }
+        return $newTag;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/DocBlockGenerator.php
@@ -0,0 +1,274 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator;
+
+use Zend\Code\Generator\DocBlock\Tag;
+use Zend\Code\Generator\DocBlock\Tag\TagInterface;
+use Zend\Code\Generator\DocBlock\TagManager;
+use Zend\Code\Reflection\DocBlockReflection;
+
+class DocBlockGenerator extends AbstractGenerator
+{
+    /**
+     * @var string
+     */
+    protected $shortDescription = null;
+
+    /**
+     * @var string
+     */
+    protected $longDescription = null;
+
+    /**
+     * @var array
+     */
+    protected $tags = array();
+
+    /**
+     * @var string
+     */
+    protected $indentation = '';
+
+    /**
+     * @var bool
+     */
+    protected $wordwrap = true;
+
+    protected static $tagManager;
+
+    /**
+     * Build a DocBlock generator object from a reflection object
+     *
+     * @param  DocBlockReflection $reflectionDocBlock
+     * @return DocBlockGenerator
+     */
+    public static function fromReflection(DocBlockReflection $reflectionDocBlock)
+    {
+        $docBlock = new static();
+
+        $docBlock->setSourceContent($reflectionDocBlock->getContents());
+        $docBlock->setSourceDirty(false);
+
+        $docBlock->setShortDescription($reflectionDocBlock->getShortDescription());
+        $docBlock->setLongDescription($reflectionDocBlock->getLongDescription());
+
+        foreach ($reflectionDocBlock->getTags() as $tag) {
+            $docBlock->setTag(self::getTagManager()->createTagFromReflection($tag));
+        }
+
+        return $docBlock;
+    }
+
+    /**
+     * Generate from array
+     *
+     * @configkey shortdescription string The short description for this doc block
+     * @configkey longdescription  string The long description for this doc block
+     * @configkey tags             array
+     *
+     * @throws Exception\InvalidArgumentException
+     * @param  array $array
+     * @return DocBlockGenerator
+     */
+    public static function fromArray(array $array)
+    {
+        $docBlock = new static();
+
+        foreach ($array as $name => $value) {
+            // normalize key
+            switch (strtolower(str_replace(array('.', '-', '_'), '', $name))) {
+                case 'shortdescription':
+                    $docBlock->setShortDescription($value);
+                    break;
+                case 'longdescription':
+                    $docBlock->setLongDescription($value);
+                    break;
+                case 'tags':
+                    $docBlock->setTags($value);
+                    break;
+            }
+        }
+
+        return $docBlock;
+    }
+
+    protected static function getTagManager()
+    {
+        if (!isset(static::$tagManager)) {
+            static::$tagManager = new TagManager();
+            static::$tagManager->initializeDefaultTags();
+        }
+        return static::$tagManager;
+    }
+
+    /**
+     * @param  string $shortDescription
+     * @param  string $longDescription
+     * @param  array $tags
+     */
+    public function __construct($shortDescription = null, $longDescription = null, array $tags = array())
+    {
+        if ($shortDescription) {
+            $this->setShortDescription($shortDescription);
+        }
+        if ($longDescription) {
+            $this->setLongDescription($longDescription);
+        }
+        if (is_array($tags) && $tags) {
+            $this->setTags($tags);
+        }
+    }
+
+    /**
+     * @param  string $shortDescription
+     * @return DocBlockGenerator
+     */
+    public function setShortDescription($shortDescription)
+    {
+        $this->shortDescription = $shortDescription;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getShortDescription()
+    {
+        return $this->shortDescription;
+    }
+
+    /**
+     * @param  string $longDescription
+     * @return DocBlockGenerator
+     */
+    public function setLongDescription($longDescription)
+    {
+        $this->longDescription = $longDescription;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getLongDescription()
+    {
+        return $this->longDescription;
+    }
+
+    /**
+     * @param  array $tags
+     * @return DocBlockGenerator
+     */
+    public function setTags(array $tags)
+    {
+        foreach ($tags as $tag) {
+            $this->setTag($tag);
+        }
+
+        return $this;
+    }
+
+    /**
+     * @param array|TagInterface $tag
+     * @throws Exception\InvalidArgumentException
+     * @return DocBlockGenerator
+     */
+    public function setTag($tag)
+    {
+        if (is_array($tag)) {
+            // use deprecated Tag class for backward compatiblity to old array-keys
+            $genericTag = new Tag();
+            $genericTag->setOptions($tag);
+            $tag = $genericTag;
+        } elseif (!$tag instanceof TagInterface) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s expects either an array of method options or an instance of %s\DocBlock\Tag\TagInterface',
+                __METHOD__,
+                __NAMESPACE__
+            ));
+        }
+
+        $this->tags[] = $tag;
+        return $this;
+    }
+
+    /**
+     * @return TagInterface[]
+     */
+    public function getTags()
+    {
+        return $this->tags;
+    }
+
+    /**
+     * @param bool $value
+     * @return DocBlockGenerator
+     */
+    public function setWordWrap($value)
+    {
+        $this->wordwrap = (bool) $value;
+        return $this;
+    }
+
+    /**
+     * @return bool
+     */
+    public function getWordWrap()
+    {
+        return $this->wordwrap;
+    }
+
+    /**
+     * @return string
+     */
+    public function generate()
+    {
+        if (!$this->isSourceDirty()) {
+            return $this->docCommentize(trim($this->getSourceContent()));
+        }
+
+        $output = '';
+        if (null !== ($sd = $this->getShortDescription())) {
+            $output .= $sd . self::LINE_FEED . self::LINE_FEED;
+        }
+        if (null !== ($ld = $this->getLongDescription())) {
+            $output .= $ld . self::LINE_FEED . self::LINE_FEED;
+        }
+
+        /* @var $tag GeneratorInterface */
+        foreach ($this->getTags() as $tag) {
+            $output .= $tag->generate() . self::LINE_FEED;
+        }
+
+        return $this->docCommentize(trim($output));
+    }
+
+    /**
+     * @param  string $content
+     * @return string
+     */
+    protected function docCommentize($content)
+    {
+        $indent  = $this->getIndentation();
+        $output  = $indent . '/**' . self::LINE_FEED;
+        $content = $this->getWordWrap() == true ? wordwrap($content, 80, self::LINE_FEED) : $content;
+        $lines   = explode(self::LINE_FEED, $content);
+        foreach ($lines as $line) {
+            $output .= $indent . ' *';
+            if ($line) {
+                $output .= " $line";
+            }
+            $output .= self::LINE_FEED;
+        }
+        $output .= $indent . ' */' . self::LINE_FEED;
+
+        return $output;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/Exception/ExceptionInterface.php
@@ -0,0 +1,16 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator\Exception;
+
+use Zend\Code\Exception\ExceptionInterface as Exception;
+
+interface ExceptionInterface extends Exception
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/Exception/InvalidArgumentException.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator\Exception;
+
+use Zend\Code\Exception;
+
+class InvalidArgumentException extends Exception\InvalidArgumentException implements
+    ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/Exception/RuntimeException.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator\Exception;
+
+use Zend\Code\Exception;
+
+class RuntimeException extends Exception\RuntimeException implements
+    ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/FileGenerator.php
@@ -0,0 +1,561 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator;
+
+use Zend\Code\Reflection\Exception as ReflectionException;
+use Zend\Code\Reflection\FileReflection;
+
+class FileGenerator extends AbstractGenerator
+{
+    /**
+     * @var string
+     */
+    protected $filename = null;
+
+    /**
+     * @var DocBlockGenerator
+     */
+    protected $docBlock = null;
+
+    /**
+     * @var array
+     */
+    protected $requiredFiles = array();
+
+    /**
+     * @var string
+     */
+    protected $namespace = null;
+
+    /**
+     * @var array
+     */
+    protected $uses = array();
+
+    /**
+     * @var array
+     */
+    protected $classes = array();
+
+    /**
+     * @var string
+     */
+    protected $body = null;
+
+    /**
+     * Passes $options to {@link setOptions()}.
+     *
+     * @param  array|\Traversable $options
+     */
+    public function __construct($options = null)
+    {
+        if (null !== $options) {
+            $this->setOptions($options);
+        }
+    }
+
+    /**
+     * Use this if you intend on generating code generation objects based on the same file.
+     * This will keep previous changes to the file in tact during the same PHP process
+     *
+     * @param  string $filePath
+     * @param  bool $includeIfNotAlreadyIncluded
+     * @throws ReflectionException\InvalidArgumentException If file does not exists
+     * @throws ReflectionException\RuntimeException If file exists but is not included or required
+     * @return FileGenerator
+     */
+    public static function fromReflectedFileName($filePath, $includeIfNotAlreadyIncluded = true)
+    {
+        $fileReflector = new FileReflection($filePath, $includeIfNotAlreadyIncluded);
+        $codeGenerator = static::fromReflection($fileReflector);
+
+        return $codeGenerator;
+    }
+
+    /**
+     * @param  FileReflection $fileReflection
+     * @return FileGenerator
+     */
+    public static function fromReflection(FileReflection $fileReflection)
+    {
+        $file = new static();
+
+        $file->setSourceContent($fileReflection->getContents());
+        $file->setSourceDirty(false);
+
+        $uses = $fileReflection->getUses();
+
+        foreach ($fileReflection->getClasses() as $class) {
+            $phpClass = ClassGenerator::fromReflection($class);
+            $phpClass->setContainingFileGenerator($file);
+
+            foreach ($uses as $fileUse) {
+                $phpClass->addUse($fileUse['use'], $fileUse['as']);
+            }
+
+            $file->setClass($phpClass);
+        }
+
+        $namespace = $fileReflection->getNamespace();
+
+        if ($namespace != '') {
+            $file->setNamespace($namespace);
+        }
+
+        if ($uses) {
+            $file->setUses($uses);
+        }
+
+        if (($fileReflection->getDocComment() != '')) {
+            $docBlock = $fileReflection->getDocBlock();
+            $file->setDocBlock(DocBlockGenerator::fromReflection($docBlock));
+        }
+
+        return $file;
+    }
+
+    /**
+     * @param  array $values
+     * @return FileGenerator
+     */
+    public static function fromArray(array $values)
+    {
+        $fileGenerator = new static;
+        foreach ($values as $name => $value) {
+            switch (strtolower(str_replace(array('.', '-', '_'), '', $name))) {
+                case 'filename':
+                    $fileGenerator->setFilename($value);
+                    continue;
+                case 'class':
+                    $fileGenerator->setClass(($value instanceof ClassGenerator) ? $value : ClassGenerator::fromArray($value));
+                    continue;
+                case 'requiredfiles':
+                    $fileGenerator->setRequiredFiles($value);
+                    continue;
+                default:
+                    if (property_exists($fileGenerator, $name)) {
+                        $fileGenerator->{$name} = $value;
+                    } elseif (method_exists($fileGenerator, 'set' . $name)) {
+                        $fileGenerator->{'set' . $name}($value);
+                    }
+            }
+        }
+
+        return $fileGenerator;
+    }
+
+    /**
+     * @param  DocBlockGenerator|array|string $docBlock
+     * @throws Exception\InvalidArgumentException
+     * @return FileGenerator
+     */
+    public function setDocBlock($docBlock)
+    {
+        if (is_string($docBlock)) {
+            $docBlock = array('shortDescription' => $docBlock);
+        }
+
+        if (is_array($docBlock)) {
+            $docBlock = new DocBlockGenerator($docBlock);
+        } elseif (!$docBlock instanceof DocBlockGenerator) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s is expecting either a string, array or an instance of %s\DocBlockGenerator',
+                __METHOD__,
+                __NAMESPACE__
+            ));
+        }
+
+        $this->docBlock = $docBlock;
+        return $this;
+    }
+
+    /**
+     * @return DocBlockGenerator
+     */
+    public function getDocBlock()
+    {
+        return $this->docBlock;
+    }
+
+    /**
+     * @param  array $requiredFiles
+     * @return FileGenerator
+     */
+    public function setRequiredFiles(array $requiredFiles)
+    {
+        $this->requiredFiles = $requiredFiles;
+        return $this;
+    }
+
+    /**
+     * @return array
+     */
+    public function getRequiredFiles()
+    {
+        return $this->requiredFiles;
+    }
+
+    /**
+     * @return string
+     */
+    public function getNamespace()
+    {
+        return $this->namespace;
+    }
+
+    /**
+     * @param  string $namespace
+     * @return FileGenerator
+     */
+    public function setNamespace($namespace)
+    {
+        $this->namespace = (string) $namespace;
+        return $this;
+    }
+
+    /**
+     * Returns an array with the first element the use statement, second is the as part.
+     * If $withResolvedAs is set to true, there will be a third element that is the
+     * "resolved" as statement, as the second part is not required in use statements
+     *
+     * @param  bool $withResolvedAs
+     * @return array
+     */
+    public function getUses($withResolvedAs = false)
+    {
+        $uses = $this->uses;
+        if ($withResolvedAs) {
+            for ($useIndex = 0, $count = count($uses); $useIndex < $count; $useIndex++) {
+                if ($uses[$useIndex][1] == '') {
+                    if (($lastSeparator = strrpos($uses[$useIndex][0], '\\')) !== false) {
+                        $uses[$useIndex][2] = substr($uses[$useIndex][0], $lastSeparator + 1);
+                    } else {
+                        $uses[$useIndex][2] = $uses[$useIndex][0];
+                    }
+                } else {
+                    $uses[$useIndex][2] = $uses[$useIndex][1];
+                }
+            }
+        }
+
+        return $uses;
+    }
+
+    /**
+     * @param  array $uses
+     * @return FileGenerator
+     */
+    public function setUses(array $uses)
+    {
+        foreach ($uses as $use) {
+            $use = (array) $use;
+            if (array_key_exists('use', $use) && array_key_exists('as', $use)) {
+                $import = $use['use'];
+                $alias  = $use['as'];
+            } elseif (count($use) == 2) {
+                list($import, $alias) = $use;
+            } else {
+                $import = current($use);
+                $alias  = null;
+            }
+            $this->setUse($import, $alias);
+        }
+        return $this;
+    }
+
+    /**
+     * @param  string $use
+     * @param  null|string $as
+     * @return FileGenerator
+     */
+    public function setUse($use, $as = null)
+    {
+        if (!in_array(array($use, $as), $this->uses)) {
+            $this->uses[] = array($use, $as);
+        }
+        return $this;
+    }
+
+    /**
+     * @param  array $classes
+     * @return FileGenerator
+     */
+    public function setClasses(array $classes)
+    {
+        foreach ($classes as $class) {
+            $this->setClass($class);
+        }
+
+        return $this;
+    }
+
+    /**
+     * @param  string $name
+     * @return ClassGenerator
+     */
+    public function getClass($name = null)
+    {
+        if ($name === null) {
+            reset($this->classes);
+
+            return current($this->classes);
+        }
+
+        return $this->classes[(string) $name];
+    }
+
+    /**
+     * @param  array|string|ClassGenerator $class
+     * @throws Exception\InvalidArgumentException
+     * @return FileGenerator
+     */
+    public function setClass($class)
+    {
+        if (is_array($class)) {
+            $class = ClassGenerator::fromArray($class);
+        } elseif (is_string($class)) {
+            $class = new ClassGenerator($class);
+        } elseif (!$class instanceof ClassGenerator) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s is expecting either a string, array or an instance of %s\ClassGenerator',
+                __METHOD__,
+                __NAMESPACE__
+            ));
+        }
+
+        // @todo check for dup here
+        $className                 = $class->getName();
+        $this->classes[$className] = $class;
+
+        return $this;
+    }
+
+    /**
+     * @param  string $filename
+     * @return FileGenerator
+     */
+    public function setFilename($filename)
+    {
+        $this->filename = (string) $filename;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getFilename()
+    {
+        return $this->filename;
+    }
+
+    /**
+     * @return ClassGenerator[]
+     */
+    public function getClasses()
+    {
+        return $this->classes;
+    }
+
+    /**
+     * @param  string $body
+     * @return FileGenerator
+     */
+    public function setBody($body)
+    {
+        $this->body = (string) $body;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getBody()
+    {
+        return $this->body;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isSourceDirty()
+    {
+        $docBlock = $this->getDocBlock();
+        if ($docBlock && $docBlock->isSourceDirty()) {
+            return true;
+        }
+
+        foreach ($this->classes as $class) {
+            if ($class->isSourceDirty()) {
+                return true;
+            }
+        }
+
+        return parent::isSourceDirty();
+    }
+
+    /**
+     * @return string
+     */
+    public function generate()
+    {
+        if ($this->isSourceDirty() === false) {
+            return $this->sourceContent;
+        }
+
+        $output = '';
+
+        // @note body gets populated when FileGenerator created
+        // from a file.  @see fromReflection and may also be set
+        // via FileGenerator::setBody
+        $body = $this->getBody();
+
+        // start with the body (if there), or open tag
+        if (preg_match('#(?:\s*)<\?php#', $body) == false) {
+            $output = '<?php' . self::LINE_FEED;
+        }
+
+        // if there are markers, put the body into the output
+        if (preg_match('#/\* Zend_Code_Generator_Php_File-(.*?)Marker:#m', $body)) {
+            $tokens = token_get_all($body);
+            foreach ($tokens as $token) {
+                if (is_array($token) && in_array($token[0], array(T_OPEN_TAG, T_COMMENT, T_DOC_COMMENT, T_WHITESPACE))
+                ) {
+                    $output .= $token[1];
+                }
+            }
+            $body = '';
+        }
+
+        // Add file DocBlock, if any
+        if (null !== ($docBlock = $this->getDocBlock())) {
+            $docBlock->setIndentation('');
+
+            if (preg_match('#/\* Zend_Code_Generator_FileGenerator-DocBlockMarker \*/#m', $output)) {
+                $output = preg_replace('#/\* Zend_Code_Generator_FileGenerator-DocBlockMarker \*/#m', $docBlock->generate(), $output, 1);
+            } else {
+                $output .= $docBlock->generate() . self::LINE_FEED;
+            }
+        }
+
+        // newline
+        $output .= self::LINE_FEED;
+
+        // namespace, if any
+        $namespace = $this->getNamespace();
+        if ($namespace) {
+            $namespace = sprintf('namespace %s;%s', $namespace, str_repeat(self::LINE_FEED, 2));
+            if (preg_match('#/\* Zend_Code_Generator_FileGenerator-NamespaceMarker \*/#m', $output)) {
+                $output = preg_replace(
+                    '#/\* Zend_Code_Generator_FileGenerator-NamespaceMarker \*/#m',
+                    $namespace,
+                    $output,
+                    1
+                );
+            } else {
+                $output .= $namespace;
+            }
+        }
+
+        // process required files
+        // @todo marker replacement for required files
+        $requiredFiles = $this->getRequiredFiles();
+        if (!empty($requiredFiles)) {
+            foreach ($requiredFiles as $requiredFile) {
+                $output .= 'require_once \'' . $requiredFile . '\';' . self::LINE_FEED;
+            }
+
+            $output .= self::LINE_FEED;
+        }
+
+        $classes = $this->getClasses();
+        $classUses = array();
+        //build uses array
+        foreach ($classes as $class) {
+            //check for duplicate use statements
+            $uses = $class->getUses();
+            if (!empty($uses) && is_array($uses)) {
+                $classUses = array_merge($classUses, $uses);
+            }
+        }
+
+        // process import statements
+        $uses = $this->getUses();
+        if (!empty($uses)) {
+            $useOutput = '';
+
+            foreach ($uses as $use) {
+                list($import, $alias) = $use;
+                if (null === $alias) {
+                    $tempOutput = sprintf('%s', $import);
+                } else {
+                    $tempOutput = sprintf('%s as %s', $import, $alias);
+                }
+
+                //don't duplicate use statements
+                if (!in_array($tempOutput, $classUses)) {
+                    $useOutput .= "use ". $tempOutput .";";
+                    $useOutput .= self::LINE_FEED;
+                }
+            }
+            $useOutput .= self::LINE_FEED;
+
+            if (preg_match('#/\* Zend_Code_Generator_FileGenerator-UseMarker \*/#m', $output)) {
+                $output = preg_replace(
+                    '#/\* Zend_Code_Generator_FileGenerator-UseMarker \*/#m',
+                    $useOutput,
+                    $output,
+                    1
+                );
+            } else {
+                $output .= $useOutput;
+            }
+        }
+
+        // process classes
+        if (!empty($classes)) {
+            foreach ($classes as $class) {
+                $regex = str_replace('&', $class->getName(), '/\* Zend_Code_Generator_Php_File-ClassMarker: \{[A-Za-z0-9\\\]+?&\} \*/');
+                if (preg_match('#' . $regex . '#m', $output)) {
+                    $output = preg_replace('#' . $regex . '#', $class->generate(), $output, 1);
+                } else {
+                    if ($namespace) {
+                        $class->setNamespaceName(null);
+                    }
+                    $output .= $class->generate() . self::LINE_FEED;
+                }
+            }
+        }
+
+        if (!empty($body)) {
+            // add an extra space between classes and
+            if (!empty($classes)) {
+                $output .= self::LINE_FEED;
+            }
+
+            $output .= $body;
+        }
+
+        return $output;
+    }
+
+    /**
+     * @return FileGenerator
+     * @throws Exception\RuntimeException
+     */
+    public function write()
+    {
+        if ($this->filename == '' || !is_writable(dirname($this->filename))) {
+            throw new Exception\RuntimeException('This code generator object is not writable.');
+        }
+        file_put_contents($this->filename, $this->generate());
+
+        return $this;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/FileGeneratorRegistry.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator;
+
+use Zend\Code\Generator\Exception\RuntimeException;
+
+class FileGeneratorRegistry
+{
+    /**
+     * @var array $fileCodeGenerators
+     */
+    private static $fileCodeGenerators = array();
+
+    /**
+     * Registry for the Zend\Code package.
+     *
+     * @param  FileGenerator $fileCodeGenerator
+     * @param  string $fileName
+     * @throws RuntimeException
+     */
+    public static function registerFileCodeGenerator(FileGenerator $fileCodeGenerator, $fileName = null)
+    {
+        if ($fileName === null) {
+            $fileName = $fileCodeGenerator->getFilename();
+        }
+
+        if ($fileName == '') {
+            throw new RuntimeException('FileName does not exist.');
+        }
+
+        // cannot use realpath since the file might not exist, but we do need to have the index
+        // in the same DIRECTORY_SEPARATOR that realpath would use:
+        $fileName = str_replace(array('\\', '/'), DIRECTORY_SEPARATOR, $fileName);
+
+        static::$fileCodeGenerators[$fileName] = $fileCodeGenerator;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/GeneratorInterface.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator;
+
+interface GeneratorInterface
+{
+    public function generate();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/MethodGenerator.php
@@ -0,0 +1,313 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator;
+
+use Zend\Code\Reflection\MethodReflection;
+
+class MethodGenerator extends AbstractMemberGenerator
+{
+    /**
+     * @var DocBlockGenerator
+     */
+    protected $docBlock = null;
+
+    /**
+     * @var ParameterGenerator[]
+     */
+    protected $parameters = array();
+
+    /**
+     * @var string
+     */
+    protected $body = null;
+
+    /**
+     * @param  MethodReflection $reflectionMethod
+     * @return MethodGenerator
+     */
+    public static function fromReflection(MethodReflection $reflectionMethod)
+    {
+        $method = new static();
+
+        $method->setSourceContent($reflectionMethod->getContents(false));
+        $method->setSourceDirty(false);
+
+        if ($reflectionMethod->getDocComment() != '') {
+            $method->setDocBlock(DocBlockGenerator::fromReflection($reflectionMethod->getDocBlock()));
+        }
+
+        $method->setFinal($reflectionMethod->isFinal());
+
+        if ($reflectionMethod->isPrivate()) {
+            $method->setVisibility(self::VISIBILITY_PRIVATE);
+        } elseif ($reflectionMethod->isProtected()) {
+            $method->setVisibility(self::VISIBILITY_PROTECTED);
+        } else {
+            $method->setVisibility(self::VISIBILITY_PUBLIC);
+        }
+
+        $method->setStatic($reflectionMethod->isStatic());
+
+        $method->setName($reflectionMethod->getName());
+
+        foreach ($reflectionMethod->getParameters() as $reflectionParameter) {
+            $method->setParameter(ParameterGenerator::fromReflection($reflectionParameter));
+        }
+
+        $method->setBody(static::clearBodyIndention($reflectionMethod->getBody()));
+
+        return $method;
+    }
+
+    /**
+     * Identify the space indention from the first line and remove this indention
+     * from all lines
+     *
+     * @param string $body
+     *
+     * @return string
+     */
+    protected static function clearBodyIndention($body)
+    {
+        if (empty($body)) {
+            return $body;
+        }
+
+        $lines = explode(PHP_EOL, $body);
+
+        $indention = str_replace(trim($lines[1]), '', $lines[1]);
+
+        foreach ($lines as $key => $line) {
+            if (substr($line, 0, strlen($indention)) == $indention) {
+                $lines[$key] = substr($line, strlen($indention));
+            }
+        }
+
+        $body = implode(PHP_EOL, $lines);
+
+        return $body;
+    }
+
+    /**
+     * Generate from array
+     *
+     * @configkey name           string        [required] Class Name
+     * @configkey docblock       string        The docblock information
+     * @configkey flags          int           Flags, one of MethodGenerator::FLAG_ABSTRACT MethodGenerator::FLAG_FINAL
+     * @configkey parameters     string        Class which this class is extending
+     * @configkey body           string
+     * @configkey abstract       bool
+     * @configkey final          bool
+     * @configkey static         bool
+     * @configkey visibility     string
+     *
+     * @throws Exception\InvalidArgumentException
+     * @param  array $array
+     * @return MethodGenerator
+     */
+    public static function fromArray(array $array)
+    {
+        if (!isset($array['name'])) {
+            throw new Exception\InvalidArgumentException(
+                'Method generator requires that a name is provided for this object'
+            );
+        }
+
+        $method = new static($array['name']);
+        foreach ($array as $name => $value) {
+            // normalize key
+            switch (strtolower(str_replace(array('.', '-', '_'), '', $name))) {
+                case 'docblock':
+                    $docBlock = ($value instanceof DocBlockGenerator) ? $value : DocBlockGenerator::fromArray($value);
+                    $method->setDocBlock($docBlock);
+                    break;
+                case 'flags':
+                    $method->setFlags($value);
+                    break;
+                case 'parameters':
+                    $method->setParameters($value);
+                    break;
+                case 'body':
+                    $method->setBody($value);
+                    break;
+                case 'abstract':
+                    $method->setAbstract($value);
+                    break;
+                case 'final':
+                    $method->setFinal($value);
+                    break;
+                case 'static':
+                    $method->setStatic($value);
+                    break;
+                case 'visibility':
+                    $method->setVisibility($value);
+                    break;
+            }
+        }
+
+        return $method;
+    }
+
+    /**
+     * @param  string $name
+     * @param  array $parameters
+     * @param  int $flags
+     * @param  string $body
+     * @param  DocBlockGenerator|string $docBlock
+     */
+    public function __construct(
+        $name = null,
+        array $parameters = array(),
+        $flags = self::FLAG_PUBLIC,
+        $body = null,
+        $docBlock = null
+    ) {
+        if ($name) {
+            $this->setName($name);
+        }
+        if ($parameters) {
+            $this->setParameters($parameters);
+        }
+        if ($flags !== self::FLAG_PUBLIC) {
+            $this->setFlags($flags);
+        }
+        if ($body) {
+            $this->setBody($body);
+        }
+        if ($docBlock) {
+            $this->setDocBlock($docBlock);
+        }
+    }
+
+    /**
+     * @param  array $parameters
+     * @return MethodGenerator
+     */
+    public function setParameters(array $parameters)
+    {
+        foreach ($parameters as $parameter) {
+            $this->setParameter($parameter);
+        }
+
+        return $this;
+    }
+
+    /**
+     * @param  ParameterGenerator|array|string $parameter
+     * @throws Exception\InvalidArgumentException
+     * @return MethodGenerator
+     */
+    public function setParameter($parameter)
+    {
+        if (is_string($parameter)) {
+            $parameter = new ParameterGenerator($parameter);
+        }
+
+        if (is_array($parameter)) {
+            $parameter = ParameterGenerator::fromArray($parameter);
+        }
+
+        if (!$parameter instanceof ParameterGenerator) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s is expecting either a string, array or an instance of %s\ParameterGenerator',
+                __METHOD__,
+                __NAMESPACE__
+            ));
+        }
+
+        $this->parameters[$parameter->getName()] = $parameter;
+
+        return $this;
+    }
+
+    /**
+     * @return ParameterGenerator[]
+     */
+    public function getParameters()
+    {
+        return $this->parameters;
+    }
+
+    /**
+     * @param  string $body
+     * @return MethodGenerator
+     */
+    public function setBody($body)
+    {
+        $this->body = $body;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getBody()
+    {
+        return $this->body;
+    }
+
+    /**
+     * @return string
+     */
+    public function generate()
+    {
+        $output = '';
+
+        $indent = $this->getIndentation();
+
+        if (($docBlock = $this->getDocBlock()) !== null) {
+            $docBlock->setIndentation($indent);
+            $output .= $docBlock->generate();
+        }
+
+        $output .= $indent;
+
+        if ($this->isAbstract()) {
+            $output .= 'abstract ';
+        } else {
+            $output .= (($this->isFinal()) ? 'final ' : '');
+        }
+
+        $output .= $this->getVisibility()
+            . (($this->isStatic()) ? ' static' : '')
+            . ' function ' . $this->getName() . '(';
+
+        $parameters = $this->getParameters();
+        if (!empty($parameters)) {
+            foreach ($parameters as $parameter) {
+                $parameterOutput[] = $parameter->generate();
+            }
+
+            $output .= implode(', ', $parameterOutput);
+        }
+
+        $output .= ')';
+
+        if ($this->isAbstract()) {
+            return $output . ';';
+        }
+
+        $output .= self::LINE_FEED . $indent . '{' . self::LINE_FEED;
+
+        if ($this->body) {
+            $output .= preg_replace('#^((?![a-zA-Z0-9_-]+;).+?)$#m', $indent . $indent . '$1', trim($this->body))
+                . self::LINE_FEED;
+        }
+
+        $output .= $indent . '}' . self::LINE_FEED;
+
+        return $output;
+    }
+
+    public function __toString()
+    {
+        return $this->generate();
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/ParameterGenerator.php
@@ -0,0 +1,300 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator;
+
+use Zend\Code\Reflection\ParameterReflection;
+
+class ParameterGenerator extends AbstractGenerator
+{
+    /**
+     * @var string
+     */
+    protected $name = null;
+
+    /**
+     * @var string
+     */
+    protected $type = null;
+
+    /**
+     * @var string|ValueGenerator
+     */
+    protected $defaultValue = null;
+
+    /**
+     * @var int
+     */
+    protected $position = null;
+
+    /**
+     * @var bool
+     */
+    protected $passedByReference = false;
+
+    /**
+     * @var array
+     */
+    protected static $simple = array('int', 'bool', 'string', 'float', 'resource', 'mixed', 'object');
+
+    /**
+     * @param  ParameterReflection $reflectionParameter
+     * @return ParameterGenerator
+     */
+    public static function fromReflection(ParameterReflection $reflectionParameter)
+    {
+        $param = new ParameterGenerator();
+        $param->setName($reflectionParameter->getName());
+
+        if ($reflectionParameter->isArray()) {
+            $param->setType('array');
+        } elseif (method_exists($reflectionParameter, 'isCallable') && $reflectionParameter->isCallable()) {
+            $param->setType('callable');
+        } else {
+            $typeClass = $reflectionParameter->getClass();
+            if ($typeClass) {
+                $parameterType = $typeClass->getName();
+                $currentNamespace = $reflectionParameter->getDeclaringClass()->getNamespaceName();
+
+                if (!empty($currentNamespace) && substr($parameterType, 0, strlen($currentNamespace)) == $currentNamespace) {
+                    $parameterType = substr($parameterType, strlen($currentNamespace) + 1);
+                } else {
+                    $parameterType = '\\' . trim($parameterType, '\\');
+                }
+
+                $param->setType($parameterType);
+            }
+        }
+
+        $param->setPosition($reflectionParameter->getPosition());
+
+        if ($reflectionParameter->isOptional()) {
+            $param->setDefaultValue($reflectionParameter->getDefaultValue());
+        }
+        $param->setPassedByReference($reflectionParameter->isPassedByReference());
+
+        return $param;
+    }
+
+    /**
+     * Generate from array
+     *
+     * @configkey name              string                                          [required] Class Name
+     * @configkey type              string
+     * @configkey defaultvalue      null|bool|string|int|float|array|ValueGenerator
+     * @configkey passedbyreference bool
+     * @configkey position          int
+     * @configkey sourcedirty       bool
+     * @configkey indentation       string
+     * @configkey sourcecontent     string
+     *
+     * @throws Exception\InvalidArgumentException
+     * @param  array $array
+     * @return ParameterGenerator
+     */
+    public static function fromArray(array $array)
+    {
+        if (!isset($array['name'])) {
+            throw new Exception\InvalidArgumentException(
+                'Paramerer generator requires that a name is provided for this object'
+            );
+        }
+
+        $param = new static($array['name']);
+        foreach ($array as $name => $value) {
+            // normalize key
+            switch (strtolower(str_replace(array('.', '-', '_'), '', $name))) {
+                case 'type':
+                    $param->setType($value);
+                    break;
+                case 'defaultvalue':
+                    $param->setDefaultValue($value);
+                    break;
+                case 'passedbyreference':
+                    $param->setPassedByReference($value);
+                    break;
+                case 'position':
+                    $param->setPosition($value);
+                    break;
+                case 'sourcedirty':
+                    $param->setSourceDirty($value);
+                    break;
+                case 'indentation':
+                    $param->setIndentation($value);
+                    break;
+                case 'sourcecontent':
+                    $param->setSourceContent($value);
+                    break;
+            }
+        }
+
+        return $param;
+    }
+
+    /**
+     * @param  string $name
+     * @param  string $type
+     * @param  mixed $defaultValue
+     * @param  int $position
+     * @param  bool $passByReference
+     */
+    public function __construct(
+        $name = null,
+        $type = null,
+        $defaultValue = null,
+        $position = null,
+        $passByReference = false
+    ) {
+        if (null !== $name) {
+            $this->setName($name);
+        }
+        if (null !== $type) {
+            $this->setType($type);
+        }
+        if (null !== $defaultValue) {
+            $this->setDefaultValue($defaultValue);
+        }
+        if (null !== $position) {
+            $this->setPosition($position);
+        }
+        if (false !== $passByReference) {
+            $this->setPassedByReference(true);
+        }
+    }
+
+    /**
+     * @param  string $type
+     * @return ParameterGenerator
+     */
+    public function setType($type)
+    {
+        $this->type = (string) $type;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getType()
+    {
+        return $this->type;
+    }
+
+    /**
+     * @param  string $name
+     * @return ParameterGenerator
+     */
+    public function setName($name)
+    {
+        $this->name = (string) $name;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Set the default value of the parameter.
+     *
+     * Certain variables are difficult to express
+     *
+     * @param  null|bool|string|int|float|array|ValueGenerator $defaultValue
+     * @return ParameterGenerator
+     */
+    public function setDefaultValue($defaultValue)
+    {
+        if (!($defaultValue instanceof ValueGenerator)) {
+            $defaultValue = new ValueGenerator($defaultValue);
+        }
+        $this->defaultValue = $defaultValue;
+
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDefaultValue()
+    {
+        return $this->defaultValue;
+    }
+
+    /**
+     * @param  int $position
+     * @return ParameterGenerator
+     */
+    public function setPosition($position)
+    {
+        $this->position = (int) $position;
+        return $this;
+    }
+
+    /**
+     * @return int
+     */
+    public function getPosition()
+    {
+        return $this->position;
+    }
+
+    /**
+     * @return bool
+     */
+    public function getPassedByReference()
+    {
+        return $this->passedByReference;
+    }
+
+    /**
+     * @param  bool $passedByReference
+     * @return ParameterGenerator
+     */
+    public function setPassedByReference($passedByReference)
+    {
+        $this->passedByReference = (bool) $passedByReference;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function generate()
+    {
+        $output = '';
+
+        if ($this->type && !in_array($this->type, static::$simple)) {
+            $output .= $this->type . ' ';
+        }
+
+        if (true === $this->passedByReference) {
+            $output .= '&';
+        }
+
+        $output .= '$' . $this->name;
+
+        if ($this->defaultValue !== null) {
+            $output .= ' = ';
+            if (is_string($this->defaultValue)) {
+                $output .= ValueGenerator::escape($this->defaultValue);
+            } elseif ($this->defaultValue instanceof ValueGenerator) {
+                $this->defaultValue->setOutputMode(ValueGenerator::OUTPUT_SINGLE_LINE);
+                $output .= $this->defaultValue;
+            } else {
+                $output .= $this->defaultValue;
+            }
+        }
+
+        return $output;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/PropertyGenerator.php
@@ -0,0 +1,226 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator;
+
+use Zend\Code\Reflection\PropertyReflection;
+
+class PropertyGenerator extends AbstractMemberGenerator
+{
+    const FLAG_CONSTANT = 0x08;
+
+    /**
+     * @var bool
+     */
+    protected $isConst = null;
+
+    /**
+     * @var PropertyValueGenerator
+     */
+    protected $defaultValue = null;
+
+    /**
+     * @param  PropertyReflection $reflectionProperty
+     * @return PropertyGenerator
+     */
+    public static function fromReflection(PropertyReflection $reflectionProperty)
+    {
+        $property = new static();
+
+        $property->setName($reflectionProperty->getName());
+
+        $allDefaultProperties = $reflectionProperty->getDeclaringClass()->getDefaultProperties();
+
+        $property->setDefaultValue($allDefaultProperties[$reflectionProperty->getName()]);
+
+        if ($reflectionProperty->getDocComment() != '') {
+            $property->setDocBlock(DocBlockGenerator::fromReflection($reflectionProperty->getDocBlock()));
+        }
+
+        if ($reflectionProperty->isStatic()) {
+            $property->setStatic(true);
+        }
+
+        if ($reflectionProperty->isPrivate()) {
+            $property->setVisibility(self::VISIBILITY_PRIVATE);
+        } elseif ($reflectionProperty->isProtected()) {
+            $property->setVisibility(self::VISIBILITY_PROTECTED);
+        } else {
+            $property->setVisibility(self::VISIBILITY_PUBLIC);
+        }
+
+        $property->setSourceDirty(false);
+
+        return $property;
+    }
+
+    /**
+     * Generate from array
+     *
+     * @configkey name         string                                          [required] Class Name
+     * @configkey const        bool
+     * @configkey defaultvalue null|bool|string|int|float|array|ValueGenerator
+     * @configkey flags        int
+     * @configkey abstract     bool
+     * @configkey final        bool
+     * @configkey static       bool
+     * @configkey visibility   string
+     *
+     * @throws Exception\InvalidArgumentException
+     * @param  array $array
+     * @return PropertyGenerator
+     */
+    public static function fromArray(array $array)
+    {
+        if (!isset($array['name'])) {
+            throw new Exception\InvalidArgumentException(
+                'Property generator requires that a name is provided for this object'
+            );
+        }
+
+        $property = new static($array['name']);
+        foreach ($array as $name => $value) {
+            // normalize key
+            switch (strtolower(str_replace(array('.', '-', '_'), '', $name))) {
+                case 'const':
+                    $property->setConst($value);
+                    break;
+                case 'defaultvalue':
+                    $property->setDefaultValue($value);
+                    break;
+                case 'docblock':
+                    $docBlock = ($value instanceof DocBlockGenerator) ? $value : DocBlockGenerator::fromArray($value);
+                    $property->setDocBlock($docBlock);
+                    break;
+                case 'flags':
+                    $property->setFlags($value);
+                    break;
+                case 'abstract':
+                    $property->setAbstract($value);
+                    break;
+                case 'final':
+                    $property->setFinal($value);
+                    break;
+                case 'static':
+                    $property->setStatic($value);
+                    break;
+                case 'visibility':
+                    $property->setVisibility($value);
+                    break;
+            }
+        }
+
+        return $property;
+    }
+
+    /**
+     * @param string $name
+     * @param PropertyValueGenerator|string|array $defaultValue
+     * @param int $flags
+     */
+    public function __construct($name = null, $defaultValue = null, $flags = self::FLAG_PUBLIC)
+    {
+        if (null !== $name) {
+            $this->setName($name);
+        }
+        if (null !== $defaultValue) {
+            $this->setDefaultValue($defaultValue);
+        }
+        if ($flags !== self::FLAG_PUBLIC) {
+            $this->setFlags($flags);
+        }
+    }
+
+    /**
+     * @param  bool $const
+     * @return PropertyGenerator
+     */
+    public function setConst($const)
+    {
+        if ($const) {
+            $this->removeFlag(self::FLAG_PUBLIC | self::FLAG_PRIVATE | self::FLAG_PROTECTED);
+            $this->setFlags(self::FLAG_CONSTANT);
+        } else {
+            $this->removeFlag(self::FLAG_CONSTANT);
+        }
+
+        return $this;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isConst()
+    {
+        return (bool) ($this->flags & self::FLAG_CONSTANT);
+    }
+
+    /**
+     * @param PropertyValueGenerator|mixed $defaultValue
+     * @param string                       $defaultValueType
+     * @param string                       $defaultValueOutputMode
+     *
+     * @return PropertyGenerator
+     */
+    public function setDefaultValue($defaultValue, $defaultValueType = PropertyValueGenerator::TYPE_AUTO, $defaultValueOutputMode = PropertyValueGenerator::OUTPUT_MULTIPLE_LINE)
+    {
+        if (!($defaultValue instanceof PropertyValueGenerator)) {
+            $defaultValue = new PropertyValueGenerator($defaultValue, $defaultValueType, $defaultValueOutputMode);
+        }
+
+        $this->defaultValue = $defaultValue;
+
+        return $this;
+    }
+
+    /**
+     * @return PropertyValueGenerator
+     */
+    public function getDefaultValue()
+    {
+        return $this->defaultValue;
+    }
+
+    /**
+     * @throws Exception\RuntimeException
+     * @return string
+     */
+    public function generate()
+    {
+        $name         = $this->getName();
+        $defaultValue = $this->getDefaultValue();
+
+        $output = '';
+
+        if (($docBlock = $this->getDocBlock()) !== null) {
+            $docBlock->setIndentation('    ');
+            $output .= $docBlock->generate();
+        }
+
+        if ($this->isConst()) {
+            if ($defaultValue !== null && !$defaultValue->isValidConstantType()) {
+                throw new Exception\RuntimeException(sprintf(
+                    'The property %s is said to be '
+                    . 'constant but does not have a valid constant value.',
+                    $this->name
+                ));
+            }
+            $output .= $this->indentation . 'const ' . $name . ' = '
+                . (($defaultValue !== null) ? $defaultValue->generate() : 'null;');
+        } else {
+            $output .= $this->indentation
+                . $this->getVisibility()
+                . (($this->isStatic()) ? ' static' : '')
+                . ' $' . $name . ' = '
+                . (($defaultValue !== null) ? $defaultValue->generate() : 'null;');
+        }
+
+        return $output;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/PropertyValueGenerator.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator;
+
+class PropertyValueGenerator extends ValueGenerator
+{
+    protected $arrayDepth = 1;
+
+    /**
+     * @return string
+     */
+    public function generate()
+    {
+        return parent::generate() . ';';
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/TraitGenerator.php
@@ -0,0 +1,173 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator;
+
+use Zend\Code\Reflection\ClassReflection;
+
+class TraitGenerator extends ClassGenerator
+{
+    const OBJECT_TYPE = 'trait';
+
+    /**
+     * Build a Code Generation Php Object from a Class Reflection
+     *
+     * @param  ClassReflection $classReflection
+     * @return TraitGenerator
+     */
+    public static function fromReflection(ClassReflection $classReflection)
+    {
+        // class generator
+        $cg = new static($classReflection->getName());
+
+        $cg->setSourceContent($cg->getSourceContent());
+        $cg->setSourceDirty(false);
+
+        if ($classReflection->getDocComment() != '') {
+            $cg->setDocBlock(DocBlockGenerator::fromReflection($classReflection->getDocBlock()));
+        }
+
+        // set the namespace
+        if ($classReflection->inNamespace()) {
+            $cg->setNamespaceName($classReflection->getNamespaceName());
+        }
+
+        $properties = array();
+        foreach ($classReflection->getProperties() as $reflectionProperty) {
+            if ($reflectionProperty->getDeclaringClass()->getName() == $classReflection->getName()) {
+                $properties[] = PropertyGenerator::fromReflection($reflectionProperty);
+            }
+        }
+        $cg->addProperties($properties);
+
+        $methods = array();
+        foreach ($classReflection->getMethods() as $reflectionMethod) {
+            $className = ($cg->getNamespaceName())
+                ? $cg->getNamespaceName() . '\\' . $cg->getName()
+                : $cg->getName();
+            if ($reflectionMethod->getDeclaringClass()->getName() == $className) {
+                $methods[] = MethodGenerator::fromReflection($reflectionMethod);
+            }
+        }
+        $cg->addMethods($methods);
+
+        return $cg;
+    }
+
+    /**
+     * Generate from array
+     *
+     * @configkey name           string        [required] Class Name
+     * @configkey filegenerator  FileGenerator File generator that holds this class
+     * @configkey namespacename  string        The namespace for this class
+     * @configkey docblock       string        The docblock information
+     * @configkey properties
+     * @configkey methods
+     *
+     * @throws Exception\InvalidArgumentException
+     * @param  array $array
+     * @return TraitGenerator
+     */
+    public static function fromArray(array $array)
+    {
+        if (! isset($array['name'])) {
+            throw new Exception\InvalidArgumentException(
+                'Class generator requires that a name is provided for this object'
+            );
+        }
+
+        $cg = new static($array['name']);
+        foreach ($array as $name => $value) {
+            // normalize key
+            switch (strtolower(str_replace(array('.', '-', '_'), '', $name))) {
+                case 'containingfile':
+                    $cg->setContainingFileGenerator($value);
+                    break;
+                case 'namespacename':
+                    $cg->setNamespaceName($value);
+                    break;
+                case 'docblock':
+                    $docBlock = ($value instanceof DocBlockGenerator) ? $value : DocBlockGenerator::fromArray($value);
+                    $cg->setDocBlock($docBlock);
+                    break;
+                case 'properties':
+                    $cg->addProperties($value);
+                    break;
+                case 'methods':
+                    $cg->addMethods($value);
+                    break;
+            }
+        }
+
+        return $cg;
+    }
+
+    /**
+     * @param  array|string $flags
+     * @return self
+     */
+    public function setFlags($flags)
+    {
+        return $this;
+    }
+
+    /**
+     * @param  string $flag
+     * @return self
+     */
+    public function addFlag($flag)
+    {
+        return $this;
+    }
+
+    /**
+     * @param  string $flag
+     * @return self
+     */
+    public function removeFlag($flag)
+    {
+        return $this;
+    }
+
+    /**
+     * @param  bool $isFinal
+     * @return self
+     */
+    public function setFinal($isFinal)
+    {
+        return $this;
+    }
+
+    /**
+     * @param  string $extendedClass
+     * @return self
+     */
+    public function setExtendedClass($extendedClass)
+    {
+        return $this;
+    }
+
+    /**
+     * @param  array $implementedInterfaces
+     * @return self
+     */
+    public function setImplementedInterfaces(array $implementedInterfaces)
+    {
+        return $this;
+    }
+
+    /**
+     * @param  bool $isAbstract
+     * @return self
+     */
+    public function setAbstract($isAbstract)
+    {
+        return $this;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/TraitUsageGenerator.php
@@ -0,0 +1,353 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+namespace Zend\Code\Generator;
+
+use Reflection;
+use ReflectionMethod;
+
+class TraitUsageGenerator extends AbstractGenerator
+{
+    /**
+     * @var ClassGenerator
+     */
+    protected $classGenerator;
+
+    /**
+     * @var array Array of trait names
+     */
+    protected $traits = array();
+
+    /**
+     * @var array Array of trait aliases
+     */
+    protected $traitAliases = array();
+
+    /**
+     * @var array Array of trait overrides
+     */
+    protected $traitOverrides = array();
+
+    /**
+     * @var array Array of string names
+     */
+    protected $uses = array();
+
+    public function __construct(ClassGenerator $classGenerator)
+    {
+        $this->classGenerator = $classGenerator;
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function addUse($use, $useAlias = null)
+    {
+        if (! empty($useAlias)) {
+            $use .= ' as ' . $useAlias;
+        }
+
+        $this->uses[$use] = $use;
+        return $this;
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function getUses()
+    {
+        return array_values($this->uses);
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function addTrait($trait)
+    {
+        $traitName = $trait;
+        if (is_array($trait)) {
+            if (! array_key_exists('traitName', $trait)) {
+                throw new Exception\InvalidArgumentException('Missing required value for traitName');
+            }
+            $traitName = $trait['traitName'];
+
+            if (array_key_exists('aliases', $trait)) {
+                foreach ($trait['aliases'] as $alias) {
+                    $this->addAlias($alias);
+                }
+            }
+
+            if (array_key_exists('insteadof', $trait)) {
+                foreach ($trait['insteadof'] as $insteadof) {
+                    $this->addTraitOverride($insteadof);
+                }
+            }
+        }
+
+        if (! $this->hasTrait($traitName)) {
+            $this->traits[] = $traitName;
+        }
+
+        return $this;
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function addTraits(array $traits)
+    {
+        foreach ($traits as $trait) {
+            $this->addTrait($trait);
+        }
+
+        return $this;
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function hasTrait($traitName)
+    {
+        return in_array($traitName, $this->traits);
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function getTraits()
+    {
+        return $this->traits;
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function removeTrait($traitName)
+    {
+        $key = array_search($traitName, $this->traits);
+        if (false !== $key) {
+            unset($this->traits[$key]);
+        }
+
+        return $this;
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function addTraitAlias($method, $alias, $visibility = null)
+    {
+        $traitAndMethod = $method;
+        if (is_array($method)) {
+            if (! array_key_exists('traitName', $method)) {
+                throw new Exception\InvalidArgumentException('Missing required argument "traitName" for $method');
+            }
+
+            if (! array_key_exists('method', $method)) {
+                throw new Exception\InvalidArgumentException('Missing required argument "method" for $method');
+            }
+
+            $traitAndMethod = $method['traitName'] . '::' . $method['method'];
+        }
+
+        // Validations
+        if (false === strpos($traitAndMethod, "::")) {
+            throw new Exception\InvalidArgumentException(
+                'Invalid Format: $method must be in the format of trait::method'
+            );
+        }
+        if (! is_string($alias)) {
+            throw new Exception\InvalidArgumentException('Invalid Alias: $alias must be a string or array.');
+        }
+        if ($this->classGenerator->hasMethod($alias)) {
+            throw new Exception\InvalidArgumentException('Invalid Alias: Method name already exists on this class.');
+        }
+        if (null !== $visibility
+            && $visibility !== ReflectionMethod::IS_PUBLIC
+            && $visibility !== ReflectionMethod::IS_PRIVATE
+            && $visibility !== ReflectionMethod::IS_PROTECTED
+        ) {
+            throw new Exception\InvalidArgumentException(
+                'Invalid Type: $visibility must of ReflectionMethod::IS_PUBLIC,'
+                . ' ReflectionMethod::IS_PRIVATE or ReflectionMethod::IS_PROTECTED'
+            );
+        }
+
+        list($trait, $method) = explode('::', $traitAndMethod);
+        if (! $this->hasTrait($trait)) {
+            throw new Exception\InvalidArgumentException('Invalid trait: Trait does not exists on this class');
+        }
+
+        $this->traitAliases[$traitAndMethod] = array(
+            'alias'      => $alias,
+            'visibility' => $visibility
+        );
+
+        return $this;
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function getTraitAliases()
+    {
+        return $this->traitAliases;
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function addTraitOverride($method, $traitsToReplace)
+    {
+        if (false === is_array($traitsToReplace)) {
+            $traitsToReplace = array($traitsToReplace);
+        }
+
+        $traitAndMethod = $method;
+        if (is_array($method)) {
+            if (! array_key_exists('traitName', $method)) {
+                throw new Exception\InvalidArgumentException('Missing required argument "traitName" for $method');
+            }
+
+            if (! array_key_exists('method', $method)) {
+                throw new Exception\InvalidArgumentException('Missing required argument "method" for $method');
+            }
+
+            $traitAndMethod = (string) $method['traitName'] . '::' . (string) $method['method'];
+        }
+
+        // Validations
+        if (false === strpos($traitAndMethod, "::")) {
+            throw new Exception\InvalidArgumentException(
+                'Invalid Format: $method must be in the format of trait::method'
+            );
+        }
+
+        list($trait, $method) = explode("::", $traitAndMethod);
+        if (! $this->hasTrait($trait)) {
+            throw new Exception\InvalidArgumentException('Invalid trait: Trait does not exists on this class');
+        }
+
+        if (! array_key_exists($traitAndMethod, $this->traitOverrides)) {
+            $this->traitOverrides[$traitAndMethod] = array();
+        }
+
+        foreach ($traitsToReplace as $traitToReplace) {
+            if (! is_string($traitToReplace)) {
+                throw new Exception\InvalidArgumentException(
+                    'Invalid Argument: $traitToReplace must be a string or array of strings'
+                );
+            }
+
+            if (! in_array($traitToReplace, $this->traitOverrides[$traitAndMethod])) {
+                $this->traitOverrides[$traitAndMethod][] = $traitToReplace;
+            }
+        }
+
+        return $this;
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function removeTraitOverride($method, $overridesToRemove = null)
+    {
+        if (! array_key_exists($method, $this->traitOverrides)) {
+            return $this;
+        }
+
+        if (null === $overridesToRemove) {
+            unset($this->traitOverrides[$method]);
+            return $this;
+        }
+
+        $overridesToRemove = (! is_array($overridesToRemove))
+            ? array($overridesToRemove)
+            : $overridesToRemove;
+        foreach ($overridesToRemove as $traitToRemove) {
+            $key = array_search($traitToRemove, $this->traitOverrides[$method]);
+            if (false !== $key) {
+                unset($this->traitOverrides[$method][$key]);
+            }
+        }
+        return $this;
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\TraitUsageInterface
+     */
+    public function getTraitOverrides()
+    {
+        return $this->traitOverrides;
+    }
+
+    /**
+     * @inherit Zend\Code\Generator\GeneratorInterface
+     */
+    public function generate()
+    {
+        $output = '';
+        $indent = $this->getIndentation();
+        $traits = $this->getTraits();
+
+        if (empty($traits)) {
+            return $output;
+        }
+
+        $output .= $indent . 'use ' . implode(', ', $traits);
+
+        $aliases   = $this->getTraitAliases();
+        $overrides = $this->getTraitOverrides();
+        if (empty($aliases) && empty($overrides)) {
+            $output .= ";" . self::LINE_FEED . self::LINE_FEED;
+            return $output;
+        }
+
+        $output .= ' {' . self::LINE_FEED;
+        foreach ($aliases as $method => $alias) {
+            $visibility = (null !== $alias['visibility'])
+                ? current(Reflection::getModifierNames($alias['visibility'])) . ' '
+                : '';
+
+            // validation check
+            if ($this->classGenerator->hasMethod($alias['alias'])) {
+                throw new Exception\RuntimeException(sprintf(
+                    'Generation Error: Aliased method %s already exists on this class',
+                    $alias['alias']
+                ));
+            }
+
+            $output .=
+                $indent
+                . $indent
+                . $method
+                . ' as '
+                . $visibility
+                . $alias['alias']
+                . ';'
+                . self::LINE_FEED;
+        }
+
+        foreach ($overrides as $method => $insteadofTraits) {
+            foreach ($insteadofTraits as $insteadofTrait) {
+                $output .=
+                    $indent
+                    . $indent
+                    . $method
+                    . ' insteadof '
+                    . $insteadofTrait
+                    . ';'
+                    . self::LINE_FEED;
+            }
+        }
+
+        $output .= self::LINE_FEED . $indent . '}' . self::LINE_FEED . self::LINE_FEED;
+
+        return $output;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/TraitUsageInterface.php
@@ -0,0 +1,159 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+namespace Zend\Code\Generator;
+
+interface TraitUsageInterface
+{
+    /**
+     * Add a class to "use" classes
+     *
+     * @param  string $use
+     * @param  string|null $useAlias
+     * @return self
+     */
+    public function addUse($use, $useAlias = null);
+
+    /**
+     * Returns the "use" classes
+     *
+     * @return array
+     */
+    public function getUses();
+
+    /**
+     * Add trait takes an array of trait options or string as arguments.
+     *
+     * Array Format:
+     * key: traitName value: String
+     *
+     * key: aliases value: array of arrays
+     *      key: method value: @see addTraitAlias
+     *      key: alias value: @see addTraitAlias
+     *      key: visibility value: @see addTraitAlias
+     *
+     * key: insteadof value: array of arrays
+     *      key: method value: @see self::addTraitOverride
+     *      key: traitToReplace value: @see self::addTraitOverride
+     *
+     * @param mixed $trait String | Array
+     * @return self
+     */
+    public function addTrait($trait);
+
+    /**
+     * Add multiple traits.  Trait can be an array of trait names or array of trait
+     * configurations
+     *
+     * @param array $traitName Array of string names or configurations (@see addTrait)
+     * @return self
+     */
+    public function addTraits(array $traits);
+
+    /**
+     * Check to see if the class has a trait defined
+     *
+     * @param strint $traitName
+     * @return bool
+     */
+    public function hasTrait($traitName);
+
+    /**
+     * Get a list of trait names
+     *
+     * @return array
+     */
+    public function getTraits();
+
+    /**
+     * Remove a trait by its name
+     *
+     * @param $traitName
+     */
+    public function removeTrait($traitName);
+
+    /**
+     * Add a trait alias.  This will be used to generate the AS portion of the use statement.
+     *
+     * $method:
+     * This method provides 2 ways for defining the trait method.
+     * Option 1: String
+     * Option 2: Array
+     * key: traitName value: name of trait
+     * key: method value: trait method
+     *
+     * $alias:
+     * Alias is a string representing the new method name.
+     *
+     * $visibilty:
+     * ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PRIVATE| ReflectionMethod::IS_PROTECTED
+     *
+     * @param mixed $method String or Array
+     * @param string $alias
+     * @param int $visiblity
+     */
+    public function addTraitAlias($method, $alias, $visibility = null);
+
+    /**
+     * @return array
+     */
+    public function getTraitAliases();
+
+    /**
+     * Add a trait method override.  This will be used to generate the INSTEADOF portion of the use
+     * statement.
+     *
+     * $method:
+     * This method provides 2 ways for defining the trait method.
+     * Option 1: String Format: <trait name>::<method name>
+     * Option 2: Array
+     * key: traitName value: trait name
+     * key: method value: method name
+     *
+     * $traitToReplace:
+     * The name of the trait that you wish to supersede.
+     *
+     * This method provides 2 ways for defining the trait method.
+     * Option 1: String of trait to replace
+     * Option 2: Array of strings of traits to replace
+
+     * @param mixed $method
+     * @param mixed $traitToReplace
+     */
+    public function addTraitOverride($method, $traitsToReplace);
+
+    /**
+     * Remove an override for a given trait::method
+     *
+     * $method:
+     * This method provides 2 ways for defining the trait method.
+     * Option 1: String Format: <trait name>::<method name>
+     * Option 2: Array
+     * key: traitName value: trait name
+     * key: method value: method name
+     *
+     * $overridesToRemove:
+     * The name of the trait that you wish to remove.
+     *
+     * This method provides 2 ways for defining the trait method.
+     * Option 1: String of trait to replace
+     * Option 2: Array of strings of traits to replace
+     *
+     * @param $traitAndMethod
+     * @param null $overridesToRemove
+     * @return $this
+     */
+    public function removeTraitOverride($method, $overridesToRemove = null);
+
+    /**
+     * Return trait overrides
+     *
+     * @return array
+     */
+    public function getTraitOverrides();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generator/ValueGenerator.php
@@ -0,0 +1,435 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generator;
+
+use Zend\Stdlib\ArrayObject;
+
+class ValueGenerator extends AbstractGenerator
+{
+    /**#@+
+     * Constant values
+     */
+    const TYPE_AUTO     = 'auto';
+    const TYPE_BOOLEAN  = 'boolean';
+    const TYPE_BOOL     = 'bool';
+    const TYPE_NUMBER   = 'number';
+    const TYPE_INTEGER  = 'integer';
+    const TYPE_INT      = 'int';
+    const TYPE_FLOAT    = 'float';
+    const TYPE_DOUBLE   = 'double';
+    const TYPE_STRING   = 'string';
+    const TYPE_ARRAY    = 'array';
+    const TYPE_CONSTANT = 'constant';
+    const TYPE_NULL     = 'null';
+    const TYPE_OBJECT   = 'object';
+    const TYPE_OTHER    = 'other';
+    /**#@-*/
+
+    const OUTPUT_MULTIPLE_LINE = 'multipleLine';
+    const OUTPUT_SINGLE_LINE   = 'singleLine';
+
+    /**
+     * @var mixed
+     */
+    protected $value = null;
+
+    /**
+     * @var string
+     */
+    protected $type = self::TYPE_AUTO;
+
+    /**
+     * @var int
+     */
+    protected $arrayDepth = 0;
+
+    /**
+     * @var string
+     */
+    protected $outputMode = self::OUTPUT_MULTIPLE_LINE;
+
+    /**
+     * @var array
+     */
+    protected $allowedTypes = null;
+    /**
+     * Autodetectable constants
+     * @var ArrayObject
+     */
+    protected $constants = null;
+
+    /**
+     * @param mixed       $value
+     * @param string      $type
+     * @param string      $outputMode
+     * @param ArrayObject $constants
+     */
+    public function __construct($value = null, $type = self::TYPE_AUTO, $outputMode = self::OUTPUT_MULTIPLE_LINE, ArrayObject $constants = null)
+    {
+        // strict check is important here if $type = AUTO
+        if ($value !== null) {
+            $this->setValue($value);
+        }
+        if ($type !== self::TYPE_AUTO) {
+            $this->setType($type);
+        }
+        if ($outputMode !== self::OUTPUT_MULTIPLE_LINE) {
+            $this->setOutputMode($outputMode);
+        }
+        if ($constants !== null) {
+            $this->constants = $constants;
+        } else {
+            $this->constants = new ArrayObject();
+        }
+    }
+
+    /**
+     * Init constant list by defined and magic constants
+     */
+    public function initEnvironmentConstants()
+    {
+        $constants   = array(
+            '__DIR__',
+            '__FILE__',
+            '__LINE__',
+            '__CLASS__',
+            '__TRAIT__',
+            '__METHOD__',
+            '__FUNCTION__',
+            '__NAMESPACE__',
+            '::'
+        );
+        $constants = array_merge($constants, array_keys(get_defined_constants()), $this->constants->getArrayCopy());
+        $this->constants->exchangeArray($constants);
+    }
+
+    /**
+     * Add constant to list
+     *
+     * @param string $constant
+     *
+     * @return $this
+     */
+    public function addConstant($constant)
+    {
+        $this->constants->append($constant);
+
+        return $this;
+    }
+
+    /**
+     * Delete constant from constant list
+     *
+     * @param string $constant
+     *
+     * @return bool
+     */
+    public function deleteConstant($constant)
+    {
+        if (($index = array_search($constant, $this->constants->getArrayCopy())) !== false) {
+            $this->constants->offsetUnset($index);
+        }
+
+        return $index !== false;
+    }
+
+    /**
+     * Return constant list
+     *
+     * @return ArrayObject
+     */
+    public function getConstants()
+    {
+        return $this->constants;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isValidConstantType()
+    {
+        if ($this->type == self::TYPE_AUTO) {
+            $type = $this->getAutoDeterminedType($this->value);
+        } else {
+            $type = $this->type;
+        }
+
+        // valid types for constants
+        $scalarTypes = array(
+            self::TYPE_BOOLEAN,
+            self::TYPE_BOOL,
+            self::TYPE_NUMBER,
+            self::TYPE_INTEGER,
+            self::TYPE_INT,
+            self::TYPE_FLOAT,
+            self::TYPE_DOUBLE,
+            self::TYPE_STRING,
+            self::TYPE_CONSTANT,
+            self::TYPE_NULL
+        );
+
+        return in_array($type, $scalarTypes);
+    }
+
+    /**
+     * @param  mixed $value
+     * @return ValueGenerator
+     */
+    public function setValue($value)
+    {
+        $this->value = $value;
+        return $this;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getValue()
+    {
+        return $this->value;
+    }
+
+    /**
+     * @param  string $type
+     * @return ValueGenerator
+     */
+    public function setType($type)
+    {
+        $this->type = (string) $type;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getType()
+    {
+        return $this->type;
+    }
+
+    /**
+     * @param  int $arrayDepth
+     * @return ValueGenerator
+     */
+    public function setArrayDepth($arrayDepth)
+    {
+        $this->arrayDepth = (int) $arrayDepth;
+        return $this;
+    }
+
+    /**
+     * @return int
+     */
+    public function getArrayDepth()
+    {
+        return $this->arrayDepth;
+    }
+
+    /**
+     * @param  string $type
+     * @return string
+     */
+    protected function getValidatedType($type)
+    {
+        $types = array(
+            self::TYPE_AUTO,
+            self::TYPE_BOOLEAN,
+            self::TYPE_BOOL,
+            self::TYPE_NUMBER,
+            self::TYPE_INTEGER,
+            self::TYPE_INT,
+            self::TYPE_FLOAT,
+            self::TYPE_DOUBLE,
+            self::TYPE_STRING,
+            self::TYPE_ARRAY,
+            self::TYPE_CONSTANT,
+            self::TYPE_NULL,
+            self::TYPE_OBJECT,
+            self::TYPE_OTHER
+        );
+
+        if (in_array($type, $types)) {
+            return $type;
+        }
+
+        return self::TYPE_AUTO;
+    }
+
+    /**
+     * @param  mixed $value
+     * @return string
+     */
+    public function getAutoDeterminedType($value)
+    {
+        switch (gettype($value)) {
+            case 'boolean':
+                return self::TYPE_BOOLEAN;
+            case 'string':
+                foreach ($this->constants as $constant) {
+                    if (strpos($value, $constant) !== false) {
+                        return self::TYPE_CONSTANT;
+                    }
+                }
+                return self::TYPE_STRING;
+            case 'double':
+            case 'float':
+            case 'integer':
+                return self::TYPE_NUMBER;
+            case 'array':
+                return self::TYPE_ARRAY;
+            case 'NULL':
+                return self::TYPE_NULL;
+            case 'object':
+            case 'resource':
+            case 'unknown type':
+            default:
+                return self::TYPE_OTHER;
+        }
+    }
+
+    /**
+     * @throws Exception\RuntimeException
+     * @return string
+     */
+    public function generate()
+    {
+        $type = $this->type;
+
+        if ($type != self::TYPE_AUTO) {
+            $type = $this->getValidatedType($type);
+        }
+
+        $value = $this->value;
+
+        if ($type == self::TYPE_AUTO) {
+            $type = $this->getAutoDeterminedType($value);
+        }
+
+        if ($type == self::TYPE_ARRAY) {
+            foreach ($value as &$curValue) {
+                if ($curValue instanceof self) {
+                    continue;
+                }
+                $curValue = new self($curValue, self::TYPE_AUTO, self::OUTPUT_MULTIPLE_LINE, $this->getConstants());
+            }
+        }
+
+        $output = '';
+
+        switch ($type) {
+            case self::TYPE_BOOLEAN:
+            case self::TYPE_BOOL:
+                $output .= ($value ? 'true' : 'false');
+                break;
+            case self::TYPE_STRING:
+                $output .= self::escape($value);
+                break;
+            case self::TYPE_NULL:
+                $output .= 'null';
+                break;
+            case self::TYPE_NUMBER:
+            case self::TYPE_INTEGER:
+            case self::TYPE_INT:
+            case self::TYPE_FLOAT:
+            case self::TYPE_DOUBLE:
+            case self::TYPE_CONSTANT:
+                $output .= $value;
+                break;
+            case self::TYPE_ARRAY:
+                $output .= 'array(';
+                if ($this->outputMode == self::OUTPUT_MULTIPLE_LINE) {
+                    $output .= self::LINE_FEED . str_repeat($this->indentation, $this->arrayDepth + 1);
+                }
+                $outputParts = array();
+                $noKeyIndex  = 0;
+                foreach ($value as $n => $v) {
+                    /* @var $v ValueGenerator */
+                    $v->setArrayDepth($this->arrayDepth + 1);
+                    $partV = $v->generate();
+                    $short = false;
+                    if (is_int($n)) {
+                        if ($n === $noKeyIndex) {
+                            $short = true;
+                            $noKeyIndex++;
+                        } else {
+                            $noKeyIndex = max($n + 1, $noKeyIndex);
+                        }
+                    }
+
+                    if ($short) {
+                        $outputParts[] = $partV;
+                    } else {
+                        $outputParts[] = (is_int($n) ? $n : self::escape($n)) . ' => ' . $partV;
+                    }
+                }
+                $padding = ($this->outputMode == self::OUTPUT_MULTIPLE_LINE)
+                    ? self::LINE_FEED . str_repeat($this->indentation, $this->arrayDepth + 1)
+                    : ' ';
+                $output .= implode(',' . $padding, $outputParts);
+                if ($this->outputMode == self::OUTPUT_MULTIPLE_LINE) {
+                    if (count($outputParts) > 0) {
+                        $output .= ',';
+                    }
+                    $output .= self::LINE_FEED . str_repeat($this->indentation, $this->arrayDepth);
+                }
+                $output .= ')';
+                break;
+            case self::TYPE_OTHER:
+            default:
+                throw new Exception\RuntimeException(
+                    sprintf('Type "%s" is unknown or cannot be used as property default value.', get_class($value))
+                );
+        }
+
+        return $output;
+    }
+
+    /**
+     * Quotes value for PHP code.
+     *
+     * @param  string $input Raw string.
+     * @param  bool $quote Whether add surrounding quotes or not.
+     * @return string PHP-ready code.
+     */
+    public static function escape($input, $quote = true)
+    {
+        $output = addcslashes($input, "\\'");
+
+        // adds quoting strings
+        if ($quote) {
+            $output = "'" . $output . "'";
+        }
+
+        return $output;
+    }
+
+    /**
+     * @param  string $outputMode
+     * @return ValueGenerator
+     */
+    public function setOutputMode($outputMode)
+    {
+        $this->outputMode = (string) $outputMode;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getOutputMode()
+    {
+        return $this->outputMode;
+    }
+
+    public function __toString()
+    {
+        return $this->generate();
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generic/Prototype/PrototypeClassFactory.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generic\Prototype;
+
+use Zend\Code\Reflection\Exception;
+
+/**
+ * This is a factory for classes which are identified by name.
+ *
+ * All classes that this factory can supply need to
+ * be registered before (prototypes). This prototypes need to implement
+ * an interface which ensures every prototype has a name.
+ *
+ * If the factory can not supply the class someone is asking for
+ * it tries to fallback on a generic default prototype, which would
+ * have need to be set before.
+ */
+class PrototypeClassFactory
+{
+    /**
+     * @var array
+     */
+    protected $prototypes = array();
+
+    /**
+     * @var PrototypeGenericInterface
+     */
+    protected $genericPrototype = null;
+
+    /**
+     * @param PrototypeInterface[] $prototypes
+     * @param PrototypeGenericInterface $genericPrototype
+     */
+    public function __construct($prototypes = array(), PrototypeGenericInterface $genericPrototype = null)
+    {
+        foreach ((array)$prototypes as $prototype) {
+            $this->addPrototype($prototype);
+        }
+
+        if ($genericPrototype) {
+            $this->setGenericPrototype($genericPrototype);
+        }
+    }
+
+    /**
+     * @param PrototypeInterface $prototype
+     * @throws Exception\InvalidArgumentException
+     */
+    public function addPrototype(PrototypeInterface $prototype)
+    {
+        $prototypeName = $this->normalizeName($prototype->getName());
+
+        if (isset($this->prototypes[$prototypeName])) {
+            throw new Exception\InvalidArgumentException('A prototype with this name already exists in this manager');
+        }
+
+        $this->prototypes[$prototypeName] = $prototype;
+    }
+
+    /**
+     * @param PrototypeGenericInterface $prototype
+     * @throws Exception\InvalidArgumentException
+     */
+    public function setGenericPrototype(PrototypeGenericInterface $prototype)
+    {
+        if (isset($this->genericPrototype)) {
+            throw new Exception\InvalidArgumentException('A default prototype is already set');
+        }
+
+        $this->genericPrototype = $prototype;
+    }
+
+    /**
+     * @param string $name
+     * @return string
+     */
+    protected function normalizeName($name)
+    {
+        return str_replace(array('-', '_'), '', $name);
+    }
+
+    /**
+     * @param string $name
+     * @return bool
+     */
+    public function hasPrototype($name)
+    {
+        $name = $this->normalizeName($name);
+        return isset($this->prototypes[$name]);
+    }
+
+    /**
+     * @param  string $prototypeName
+     * @return PrototypeInterface
+     * @throws Exception\RuntimeException
+     */
+    public function getClonedPrototype($prototypeName)
+    {
+        $prototypeName = $this->normalizeName($prototypeName);
+
+        if (!$this->hasPrototype($prototypeName) && !isset($this->genericPrototype)) {
+            throw new Exception\RuntimeException('This tag name is not supported by this tag manager');
+        }
+
+        if (!$this->hasPrototype($prototypeName)) {
+            $newPrototype = clone $this->genericPrototype;
+            $newPrototype->setName($prototypeName);
+        } else {
+            $newPrototype = clone $this->prototypes[$prototypeName];
+        }
+
+        return $newPrototype;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generic/Prototype/PrototypeGenericInterface.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generic\Prototype;
+
+interface PrototypeGenericInterface extends PrototypeInterface
+{
+    /**
+     * @param string $name
+     */
+    public function setName($name);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Generic/Prototype/PrototypeInterface.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Generic\Prototype;
+
+interface PrototypeInterface
+{
+    /**
+     * @return string
+     */
+    public function getName();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/NameInformation.php
@@ -0,0 +1,156 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code;
+
+class NameInformation
+{
+    /**
+     * @var string
+     */
+    protected $namespace = null;
+
+    /**
+     * @var array
+     */
+    protected $uses = array();
+
+    /**
+     * @param  string $namespace
+     * @param  array $uses
+     */
+    public function __construct($namespace = null, array $uses = array())
+    {
+        if ($namespace) {
+            $this->setNamespace($namespace);
+        }
+        if ($uses) {
+            $this->setUses($uses);
+        }
+    }
+
+    /**
+     * @param  string $namespace
+     * @return NameInformation
+     */
+    public function setNamespace($namespace)
+    {
+        $this->namespace = (string) $namespace;
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getNamespace()
+    {
+        return $this->namespace;
+    }
+
+    /**
+     * @return bool
+     */
+    public function hasNamespace()
+    {
+        return ($this->namespace !== null);
+    }
+
+    /**
+     * @param  array $uses
+     * @return NameInformation
+     */
+    public function setUses(array $uses)
+    {
+        $this->uses = array();
+        $this->addUses($uses);
+
+        return $this;
+    }
+
+    /**
+     * @param  array $uses
+     * @return NameInformation
+     */
+    public function addUses(array $uses)
+    {
+        foreach ($uses as $use => $as) {
+            if (is_int($use)) {
+                $this->addUse($as);
+            } elseif (is_string($use)) {
+                $this->addUse($use, $as);
+            }
+        }
+
+        return $this;
+    }
+
+    /**
+     * @param  array|string $use
+     * @param  string $as
+     */
+    public function addUse($use, $as = null)
+    {
+        if (is_array($use) && array_key_exists('use', $use) && array_key_exists('as', $use)) {
+            $uses = $use;
+            $use  = $uses['use'];
+            $as   = $uses['as'];
+        }
+
+        $use = trim($use, '\\');
+        if ($as === null) {
+            $as                  = trim($use, '\\');
+            $nsSeparatorPosition = strrpos($as, '\\');
+            if ($nsSeparatorPosition !== false && $nsSeparatorPosition !== 0 && $nsSeparatorPosition != strlen($as)) {
+                $as = substr($as, $nsSeparatorPosition + 1);
+            }
+        }
+
+        $this->uses[$use] = $as;
+    }
+
+    /**
+     * @return array
+     */
+    public function getUses()
+    {
+        return $this->uses;
+    }
+
+    /**
+     * @param  string $name
+     * @return string
+     */
+    public function resolveName($name)
+    {
+        if ($this->namespace && !$this->uses && strlen($name) > 0 && $name{0} != '\\') {
+            return $this->namespace . '\\' . $name;
+        }
+
+        if (!$this->uses || strlen($name) <= 0 || $name{0} == '\\') {
+            return ltrim($name, '\\');
+        }
+
+        if ($this->namespace || $this->uses) {
+            $firstPart = $name;
+            if (($firstPartEnd = strpos($firstPart, '\\')) !== false) {
+                $firstPart = substr($firstPart, 0, $firstPartEnd);
+            } else {
+                $firstPartEnd = strlen($firstPart);
+            }
+            if (($fqns = array_search($firstPart, $this->uses)) !== false) {
+                return substr_replace($name, $fqns, 0, $firstPartEnd);
+            }
+            if ($this->namespace) {
+                return $this->namespace . '\\' . $name;
+            }
+        }
+
+        return $name;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/ClassReflection.php
@@ -0,0 +1,283 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection;
+
+use ReflectionClass;
+use Zend\Code\Annotation\AnnotationCollection;
+use Zend\Code\Annotation\AnnotationManager;
+use Zend\Code\Scanner\AnnotationScanner;
+use Zend\Code\Scanner\FileScanner;
+
+class ClassReflection extends ReflectionClass implements ReflectionInterface
+{
+    /**
+     * @var AnnotationScanner
+     */
+    protected $annotations = null;
+
+    /**
+     * @var DocBlockReflection
+     */
+    protected $docBlock = null;
+
+    /**
+     * Return the reflection file of the declaring file.
+     *
+     * @return FileReflection
+     */
+    public function getDeclaringFile()
+    {
+        $instance = new FileReflection($this->getFileName());
+
+        return $instance;
+    }
+
+    /**
+     * Return the classes DocBlock reflection object
+     *
+     * @return DocBlockReflection
+     * @throws Exception\ExceptionInterface for missing DocBock or invalid reflection class
+     */
+    public function getDocBlock()
+    {
+        if (isset($this->docBlock)) {
+            return $this->docBlock;
+        }
+
+        if ('' == $this->getDocComment()) {
+            return false;
+        }
+
+        $this->docBlock = new DocBlockReflection($this);
+
+        return $this->docBlock;
+    }
+
+    /**
+     * @param  AnnotationManager $annotationManager
+     * @return AnnotationCollection
+     */
+    public function getAnnotations(AnnotationManager $annotationManager)
+    {
+        $docComment = $this->getDocComment();
+
+        if ($docComment == '') {
+            return false;
+        }
+
+        if ($this->annotations) {
+            return $this->annotations;
+        }
+
+        $fileScanner       = $this->createFileScanner($this->getFileName());
+        $nameInformation   = $fileScanner->getClassNameInformation($this->getName());
+
+        if (!$nameInformation) {
+            return false;
+        }
+
+        $this->annotations = new AnnotationScanner($annotationManager, $docComment, $nameInformation);
+
+        return $this->annotations;
+    }
+
+    /**
+     * Return the start line of the class
+     *
+     * @param  bool $includeDocComment
+     * @return int
+     */
+    public function getStartLine($includeDocComment = false)
+    {
+        if ($includeDocComment && $this->getDocComment() != '') {
+            return $this->getDocBlock()->getStartLine();
+        }
+
+        return parent::getStartLine();
+    }
+
+    /**
+     * Return the contents of the class
+     *
+     * @param  bool $includeDocBlock
+     * @return string
+     */
+    public function getContents($includeDocBlock = true)
+    {
+        $fileName = $this->getFileName();
+
+        if (false === $fileName || ! file_exists($fileName)) {
+            return '';
+        }
+
+        $filelines = file($fileName);
+        $startnum  = $this->getStartLine($includeDocBlock);
+        $endnum    = $this->getEndLine() - $this->getStartLine();
+
+        // Ensure we get between the open and close braces
+        $lines = array_slice($filelines, $startnum, $endnum);
+        array_unshift($lines, $filelines[$startnum-1]);
+
+        return strstr(implode('', $lines), '{');
+    }
+
+    /**
+     * Get all reflection objects of implemented interfaces
+     *
+     * @return ClassReflection[]
+     */
+    public function getInterfaces()
+    {
+        $phpReflections  = parent::getInterfaces();
+        $zendReflections = array();
+        while ($phpReflections && ($phpReflection = array_shift($phpReflections))) {
+            $instance          = new ClassReflection($phpReflection->getName());
+            $zendReflections[] = $instance;
+            unset($phpReflection);
+        }
+        unset($phpReflections);
+
+        return $zendReflections;
+    }
+
+    /**
+     * Return method reflection by name
+     *
+     * @param  string $name
+     * @return MethodReflection
+     */
+    public function getMethod($name)
+    {
+        $method = new MethodReflection($this->getName(), parent::getMethod($name)->getName());
+
+        return $method;
+    }
+
+    /**
+     * Get reflection objects of all methods
+     *
+     * @param  int $filter
+     * @return MethodReflection[]
+     */
+    public function getMethods($filter = -1)
+    {
+        $methods = array();
+        foreach (parent::getMethods($filter) as $method) {
+            $instance  = new MethodReflection($this->getName(), $method->getName());
+            $methods[] = $instance;
+        }
+
+        return $methods;
+    }
+
+    /**
+     * Returns an array of reflection classes of traits used by this class.
+     *
+     * @return array|null
+     */
+    public function getTraits()
+    {
+        $vals = array();
+        $traits = parent::getTraits();
+        if ($traits === null) {
+            return;
+        }
+
+        foreach ($traits as $trait) {
+            $vals[] = new ClassReflection($trait->getName());
+        }
+
+        return $vals;
+    }
+
+    /**
+     * Get parent reflection class of reflected class
+     *
+     * @return ClassReflection|bool
+     */
+    public function getParentClass()
+    {
+        $phpReflection = parent::getParentClass();
+        if ($phpReflection) {
+            $zendReflection = new ClassReflection($phpReflection->getName());
+            unset($phpReflection);
+
+            return $zendReflection;
+        }
+
+        return false;
+    }
+
+    /**
+     * Return reflection property of this class by name
+     *
+     * @param  string $name
+     * @return PropertyReflection
+     */
+    public function getProperty($name)
+    {
+        $phpReflection  = parent::getProperty($name);
+        $zendReflection = new PropertyReflection($this->getName(), $phpReflection->getName());
+        unset($phpReflection);
+
+        return $zendReflection;
+    }
+
+    /**
+     * Return reflection properties of this class
+     *
+     * @param  int $filter
+     * @return PropertyReflection[]
+     */
+    public function getProperties($filter = -1)
+    {
+        $phpReflections  = parent::getProperties($filter);
+        $zendReflections = array();
+        while ($phpReflections && ($phpReflection = array_shift($phpReflections))) {
+            $instance          = new PropertyReflection($this->getName(), $phpReflection->getName());
+            $zendReflections[] = $instance;
+            unset($phpReflection);
+        }
+        unset($phpReflections);
+
+        return $zendReflections;
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return parent::__toString();
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return parent::__toString();
+    }
+
+    /**
+     * Creates a new FileScanner instance.
+     *
+     * By having this as a seperate method it allows the method to be overridden
+     * if a different FileScanner is needed.
+     *
+     * @param  string $filename
+     *
+     * @return FileScanner
+     */
+    protected function createFileScanner($filename)
+    {
+        return new FileScanner($filename);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/DocBlock/Tag/AuthorTag.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection\DocBlock\Tag;
+
+class AuthorTag implements TagInterface
+{
+    /**
+     * @var string
+     */
+    protected $authorName = null;
+
+    /**
+     * @var string
+     */
+    protected $authorEmail = null;
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return 'author';
+    }
+
+    /**
+     * Initializer
+     *
+     * @param  string $tagDocblockLine
+     */
+    public function initialize($tagDocblockLine)
+    {
+        $match = array();
+
+        if (!preg_match('/^([^\<]*)(\<([^\>]*)\>)?(.*)$/u', $tagDocblockLine, $match)) {
+            return;
+        }
+
+        if ($match[1] !== '') {
+            $this->authorName = rtrim($match[1]);
+        }
+
+        if (isset($match[3]) && $match[3] !== '') {
+            $this->authorEmail = $match[3];
+        }
+    }
+
+    /**
+     * @return null|string
+     */
+    public function getAuthorName()
+    {
+        return $this->authorName;
+    }
+
+    /**
+     * @return null|string
+     */
+    public function getAuthorEmail()
+    {
+        return $this->authorEmail;
+    }
+
+    public function __toString()
+    {
+        return 'DocBlock Tag [ * @' . $this->getName() . ' ]' . PHP_EOL;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/DocBlock/Tag/GenericTag.php
@@ -0,0 +1,109 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection\DocBlock\Tag;
+
+use Zend\Code\Generic\Prototype\PrototypeGenericInterface;
+
+class GenericTag implements TagInterface, PrototypeGenericInterface
+{
+    /**
+     * @var string
+     */
+    protected $name = null;
+
+    /**
+     * @var string
+     */
+    protected $content = null;
+
+    /**
+     * @var null|string
+     */
+    protected $contentSplitCharacter = null;
+
+    /**
+     * @var array
+     */
+    protected $values = array();
+
+    /**
+     * @param  string $contentSplitCharacter
+     */
+    public function __construct($contentSplitCharacter = ' ')
+    {
+        $this->contentSplitCharacter = $contentSplitCharacter;
+    }
+
+    /**
+     * @param  string $tagDocBlockLine
+     * @return void
+     */
+    public function initialize($tagDocBlockLine)
+    {
+        $this->parse($tagDocBlockLine);
+    }
+
+    /**
+     * Get annotation tag name
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * @param  string $name
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * @return string
+     */
+    public function getContent()
+    {
+        return $this->content;
+    }
+
+    /**
+     * @param  int $position
+     * @return string
+     */
+    public function returnValue($position)
+    {
+        return $this->values[$position];
+    }
+
+    /**
+     * Serialize to string
+     *
+     * Required by Reflector
+     *
+     * @todo   What should this do?
+     * @return string
+     */
+    public function __toString()
+    {
+        return 'DocBlock Tag [ * @' . $this->name . ' ]' . PHP_EOL;
+    }
+
+    /**
+     * @param  string $docBlockLine
+     */
+    protected function parse($docBlockLine)
+    {
+        $this->content = trim($docBlockLine);
+        $this->values = explode($this->contentSplitCharacter, $docBlockLine);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/DocBlock/Tag/LicenseTag.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection\DocBlock\Tag;
+
+class LicenseTag implements TagInterface
+{
+    /**
+     * @var string
+     */
+    protected $url = null;
+
+    /**
+     * @var string
+     */
+    protected $licenseName = null;
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return 'license';
+    }
+
+    /**
+     * Initializer
+     *
+     * @param  string $tagDocblockLine
+     */
+    public function initialize($tagDocblockLine)
+    {
+        $match = array();
+
+        if (!preg_match('#^([\S]*)(?:\s+(.*))?$#m', $tagDocblockLine, $match)) {
+            return;
+        }
+
+        if ($match[1] !== '') {
+            $this->url = trim($match[1]);
+        }
+
+        if (isset($match[2]) && $match[2] !== '') {
+            $this->licenseName = $match[2];
+        }
+    }
+
+    /**
+     * @return null|string
+     */
+    public function getUrl()
+    {
+        return $this->url;
+    }
+
+    /**
+     * @return null|string
+     */
+    public function getLicenseName()
+    {
+        return $this->licenseName;
+    }
+
+    public function __toString()
+    {
+        return 'DocBlock Tag [ * @' . $this->getName() . ' ]' . PHP_EOL;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/DocBlock/Tag/MethodTag.php
@@ -0,0 +1,122 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection\DocBlock\Tag;
+
+class MethodTag implements TagInterface, PhpDocTypedTagInterface
+{
+    /**
+     * Return value type
+     *
+     * @var array
+     */
+    protected $types = array();
+
+    /**
+     * @var string
+     */
+    protected $methodName = null;
+
+    /**
+     * @var string
+     */
+    protected $description = null;
+
+    /**
+     * Is static method
+     *
+     * @var bool
+     */
+    protected $isStatic = false;
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return 'method';
+    }
+
+    /**
+     * Initializer
+     *
+     * @param  string $tagDocblockLine
+     */
+    public function initialize($tagDocblockLine)
+    {
+        $match = array();
+
+        if (!preg_match('#^(static[\s]+)?(.+[\s]+)?(.+\(\))[\s]*(.*)$#m', $tagDocblockLine, $match)) {
+            return;
+        }
+
+        if ($match[1] !== '') {
+            $this->isStatic = true;
+        }
+
+        if ($match[2] !== '') {
+            $this->types = explode('|', rtrim($match[2]));
+        }
+
+        $this->methodName = $match[3];
+
+        if ($match[4] !== '') {
+            $this->description = $match[4];
+        }
+    }
+
+    /**
+     * Get return value type
+     *
+     * @return null|string
+     * @deprecated 2.0.4 use getTypes instead
+     */
+    public function getReturnType()
+    {
+        if (empty($this->types)) {
+            return;
+        }
+
+        return $this->types[0];
+    }
+
+    public function getTypes()
+    {
+        return $this->types;
+    }
+
+    /**
+     * @return string
+     */
+    public function getMethodName()
+    {
+        return $this->methodName;
+    }
+
+    /**
+     * @return null|string
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isStatic()
+    {
+        return $this->isStatic;
+    }
+
+    public function __toString()
+    {
+        return 'DocBlock Tag [ * @' . $this->getName() . ' ]' . PHP_EOL;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/DocBlock/Tag/ParamTag.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection\DocBlock\Tag;
+
+class ParamTag implements TagInterface, PhpDocTypedTagInterface
+{
+    /**
+     * @var array
+     */
+    protected $types = array();
+
+    /**
+     * @var string
+     */
+    protected $variableName = null;
+
+    /**
+     * @var string
+     */
+    protected $description = null;
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return 'param';
+    }
+
+    /**
+     * Initializer
+     *
+     * @param  string $tagDocBlockLine
+     */
+    public function initialize($tagDocBlockLine)
+    {
+        $matches = array();
+
+        if (!preg_match('#((?:[\w|\\\]+(?:\[\])*\|?)+)(?:\s+(\$\S+))?(?:\s+(.*))?#s', $tagDocBlockLine, $matches)) {
+            return;
+        }
+
+        $this->types = explode('|', $matches[1]);
+
+        if (isset($matches[2])) {
+            $this->variableName = $matches[2];
+        }
+
+        if (isset($matches[3])) {
+            $this->description = trim(preg_replace('#\s+#', ' ', $matches[3]));
+        }
+    }
+
+    /**
+     * Get parameter variable type
+     *
+     * @return string
+     * @deprecated 2.0.4 use getTypes instead
+     */
+    public function getType()
+    {
+        if (empty($this->types)) {
+            return '';
+        }
+
+        return $this->types[0];
+    }
+
+    public function getTypes()
+    {
+        return $this->types;
+    }
+
+    /**
+     * Get parameter name
+     *
+     * @return string
+     */
+    public function getVariableName()
+    {
+        return $this->variableName;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/DocBlock/Tag/PhpDocTypedTagInterface.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection\DocBlock\Tag;
+
+interface PhpDocTypedTagInterface
+{
+    /**
+     * Return all types supported by the tag definition
+     *
+     * @return string[]
+     */
+    public function getTypes();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/DocBlock/Tag/PropertyTag.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection\DocBlock\Tag;
+
+class PropertyTag implements TagInterface, PhpDocTypedTagInterface
+{
+    /**
+     * @var array
+     */
+    protected $types = array();
+
+    /**
+     * @var string
+     */
+    protected $propertyName = null;
+
+    /**
+     * @var string
+     */
+    protected $description = null;
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return 'property';
+    }
+
+    /**
+     * Initializer
+     *
+     * @param  string $tagDocblockLine
+     */
+    public function initialize($tagDocblockLine)
+    {
+        $match = array();
+        if (!preg_match('#^(.+)?(\$[\S]+)[\s]*(.*)$#m', $tagDocblockLine, $match)) {
+            return;
+        }
+
+        if ($match[1] !== '') {
+            $this->types = explode('|', rtrim($match[1]));
+        }
+
+        if ($match[2] !== '') {
+            $this->propertyName = $match[2];
+        }
+
+        if ($match[3] !== '') {
+            $this->description = $match[3];
+        }
+    }
+
+    /**
+     * @return null|string
+     * @deprecated 2.0.4 use getTypes instead
+     */
+    public function getType()
+    {
+        if (empty($this->types)) {
+            return;
+        }
+
+        return $this->types[0];
+    }
+
+    public function getTypes()
+    {
+        return $this->types;
+    }
+
+    /**
+     * @return null|string
+     */
+    public function getPropertyName()
+    {
+        return $this->propertyName;
+    }
+
+    /**
+     * @return null|string
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+
+    public function __toString()
+    {
+        return 'DocBlock Tag [ * @' . $this->getName() . ' ]' . PHP_EOL;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/DocBlock/Tag/ReturnTag.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection\DocBlock\Tag;
+
+class ReturnTag implements TagInterface, PhpDocTypedTagInterface
+{
+    /**
+     * @var array
+     */
+    protected $types = array();
+
+    /**
+     * @var string
+     */
+    protected $description = null;
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return 'return';
+    }
+
+    /**
+     * @param  string $tagDocBlockLine
+     * @return void
+     */
+    public function initialize($tagDocBlockLine)
+    {
+        $matches = array();
+        if (!preg_match('#((?:[\w|\\\]+(?:\[\])*\|?)+)(?:\s+(.*))?#s', $tagDocBlockLine, $matches)) {
+            return;
+        }
+
+        $this->types = explode('|', $matches[1]);
+
+        if (isset($matches[2])) {
+            $this->description = trim(preg_replace('#\s+#', ' ', $matches[2]));
+        }
+    }
+
+    /**
+     * @return string
+     * @deprecated 2.0.4 use getTypes instead
+     */
+    public function getType()
+    {
+        if (empty($this->types)) {
+            return '';
+        }
+
+        return $this->types[0];
+    }
+
+    public function getTypes()
+    {
+        return $this->types;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/DocBlock/Tag/TagInterface.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection\DocBlock\Tag;
+
+use Zend\Code\Generic\Prototype\PrototypeInterface;
+
+interface TagInterface extends PrototypeInterface
+{
+    /**
+     * @param  string $content
+     * @return void
+     */
+    public function initialize($content);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/DocBlock/Tag/ThrowsTag.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection\DocBlock\Tag;
+
+class ThrowsTag implements TagInterface, PhpDocTypedTagInterface
+{
+    /**
+     * @var array
+     */
+    protected $types = array();
+
+    /**
+     * @var string
+     */
+    protected $description = null;
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return 'throws';
+    }
+
+    /**
+     * @param  string $tagDocBlockLine
+     * @return void
+     */
+    public function initialize($tagDocBlockLine)
+    {
+        $matches = array();
+        preg_match('#([\w|\\\]+)(?:\s+(.*))?#', $tagDocBlockLine, $matches);
+
+        $this->types = explode('|', $matches[1]);
+
+        if (isset($matches[2])) {
+            $this->description = $matches[2];
+        }
+    }
+
+    /**
+     * Get return variable type
+     *
+     * @return string
+     * @deprecated 2.0.4 use getTypes instead
+     */
+    public function getType()
+    {
+        return implode('|', $this->getTypes());
+    }
+
+    /**
+     * @return array
+     */
+    public function getTypes()
+    {
+        return $this->types;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/DocBlock/TagManager.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection\DocBlock;
+
+use Zend\Code\Generic\Prototype\PrototypeClassFactory;
+use Zend\Code\Reflection\DocBlock\Tag\TagInterface;
+
+class TagManager extends PrototypeClassFactory
+{
+    /**
+     * @return void
+     */
+    public function initializeDefaultTags()
+    {
+        $this->addPrototype(new Tag\ParamTag());
+        $this->addPrototype(new Tag\ReturnTag());
+        $this->addPrototype(new Tag\MethodTag());
+        $this->addPrototype(new Tag\PropertyTag());
+        $this->addPrototype(new Tag\AuthorTag());
+        $this->addPrototype(new Tag\LicenseTag());
+        $this->addPrototype(new Tag\ThrowsTag());
+        $this->setGenericPrototype(new Tag\GenericTag());
+    }
+
+    /**
+     * @param string $tagName
+     * @param string $content
+     * @return TagInterface
+     */
+    public function createTag($tagName, $content = null)
+    {
+        /* @var TagInterface $newTag */
+        $newTag = $this->getClonedPrototype($tagName);
+
+        if ($content) {
+            $newTag->initialize($content);
+        }
+
+        return $newTag;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/DocBlockReflection.php
@@ -0,0 +1,296 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection;
+
+use Reflector;
+use Zend\Code\Reflection\DocBlock\Tag\TagInterface as DocBlockTagInterface;
+use Zend\Code\Reflection\DocBlock\TagManager as DocBlockTagManager;
+use Zend\Code\Scanner\DocBlockScanner;
+
+class DocBlockReflection implements ReflectionInterface
+{
+    /**
+     * @var Reflector
+     */
+    protected $reflector = null;
+
+    /**
+     * @var string
+     */
+    protected $docComment = null;
+
+    /**
+     * @var DocBlockTagManager
+     */
+    protected $tagManager = null;
+
+    /**#@+
+     * @var int
+     */
+    protected $startLine = null;
+    protected $endLine = null;
+    /**#@-*/
+
+    /**
+     * @var string
+     */
+    protected $cleanDocComment = null;
+
+    /**
+     * @var string
+     */
+    protected $longDescription = null;
+
+    /**
+     * @var string
+     */
+    protected $shortDescription = null;
+
+    /**
+     * @var array
+     */
+    protected $tags = array();
+
+    /**
+     * @var bool
+     */
+    protected $isReflected = false;
+
+    /**
+     * Export reflection
+     *
+     * Required by the Reflector interface.
+     *
+     * @todo   What should this do?
+     * @return void
+     */
+    public static function export()
+    {
+    }
+
+    /**
+     * @param  Reflector|string $commentOrReflector
+     * @param  null|DocBlockTagManager $tagManager
+     * @throws Exception\InvalidArgumentException
+     * @return DocBlockReflection
+     */
+    public function __construct($commentOrReflector, DocBlockTagManager $tagManager = null)
+    {
+        if (!$tagManager) {
+            $tagManager = new DocBlockTagManager();
+            $tagManager->initializeDefaultTags();
+        }
+        $this->tagManager = $tagManager;
+
+        if ($commentOrReflector instanceof Reflector) {
+            $this->reflector = $commentOrReflector;
+            if (!method_exists($commentOrReflector, 'getDocComment')) {
+                throw new Exception\InvalidArgumentException('Reflector must contain method "getDocComment"');
+            }
+            /* @var MethodReflection $commentOrReflector */
+            $this->docComment = $commentOrReflector->getDocComment();
+
+            // determine line numbers
+            $lineCount       = substr_count($this->docComment, "\n");
+            $this->startLine = $this->reflector->getStartLine() - $lineCount - 1;
+            $this->endLine   = $this->reflector->getStartLine() - 1;
+        } elseif (is_string($commentOrReflector)) {
+            $this->docComment = $commentOrReflector;
+        } else {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s must have a (string) DocComment or a Reflector in the constructor',
+                get_class($this)
+            ));
+        }
+
+        if ($this->docComment == '') {
+            throw new Exception\InvalidArgumentException('DocComment cannot be empty');
+        }
+
+        $this->reflect();
+    }
+
+    /**
+     * Retrieve contents of DocBlock
+     *
+     * @return string
+     */
+    public function getContents()
+    {
+        $this->reflect();
+
+        return $this->cleanDocComment;
+    }
+
+    /**
+     * Get start line (position) of DocBlock
+     *
+     * @return int
+     */
+    public function getStartLine()
+    {
+        $this->reflect();
+
+        return $this->startLine;
+    }
+
+    /**
+     * Get last line (position) of DocBlock
+     *
+     * @return int
+     */
+    public function getEndLine()
+    {
+        $this->reflect();
+
+        return $this->endLine;
+    }
+
+    /**
+     * Get DocBlock short description
+     *
+     * @return string
+     */
+    public function getShortDescription()
+    {
+        $this->reflect();
+
+        return $this->shortDescription;
+    }
+
+    /**
+     * Get DocBlock long description
+     *
+     * @return string
+     */
+    public function getLongDescription()
+    {
+        $this->reflect();
+
+        return $this->longDescription;
+    }
+
+    /**
+     * Does the DocBlock contain the given annotation tag?
+     *
+     * @param  string $name
+     * @return bool
+     */
+    public function hasTag($name)
+    {
+        $this->reflect();
+        foreach ($this->tags as $tag) {
+            if ($tag->getName() == $name) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Retrieve the given DocBlock tag
+     *
+     * @param  string $name
+     * @return DocBlockTagInterface|false
+     */
+    public function getTag($name)
+    {
+        $this->reflect();
+        foreach ($this->tags as $tag) {
+            if ($tag->getName() == $name) {
+                return $tag;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Get all DocBlock annotation tags
+     *
+     * @param  string $filter
+     * @return DocBlockTagInterface[]
+     */
+    public function getTags($filter = null)
+    {
+        $this->reflect();
+        if ($filter === null || !is_string($filter)) {
+            return $this->tags;
+        }
+
+        $returnTags = array();
+        foreach ($this->tags as $tag) {
+            if ($tag->getName() == $filter) {
+                $returnTags[] = $tag;
+            }
+        }
+
+        return $returnTags;
+    }
+
+    /**
+     * Parse the DocBlock
+     *
+     * @return void
+     */
+    protected function reflect()
+    {
+        if ($this->isReflected) {
+            return;
+        }
+
+        $docComment = preg_replace('#[ ]{0,1}\*/$#', '', $this->docComment);
+
+        // create a clean docComment
+        $this->cleanDocComment = preg_replace("#[ \t]*(?:/\*\*|\*/|\*)[ ]{0,1}(.*)?#", '$1', $docComment);
+        $this->cleanDocComment = ltrim($this->cleanDocComment, "\r\n"); // @todo should be changed to remove first and last empty line
+
+        $scanner                = new DocBlockScanner($docComment);
+        $this->shortDescription = ltrim($scanner->getShortDescription());
+        $this->longDescription  = ltrim($scanner->getLongDescription());
+
+        foreach ($scanner->getTags() as $tag) {
+            $this->tags[] = $this->tagManager->createTag(ltrim($tag['name'], '@'), ltrim($tag['value']));
+        }
+
+        $this->isReflected = true;
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        $str = "DocBlock [ /* DocBlock */ ] {" . PHP_EOL . PHP_EOL;
+        $str .= "  - Tags [" . count($this->tags) . "] {" . PHP_EOL;
+
+        foreach ($this->tags as $tag) {
+            $str .= "    " . $tag;
+        }
+
+        $str .= "  }" . PHP_EOL;
+        $str .= "}" . PHP_EOL;
+
+        return $str;
+    }
+
+    /**
+     * Serialize to string
+     *
+     * Required by the Reflector interface
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->toString();
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/Exception/BadMethodCallException.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection\Exception;
+
+use Zend\Code\Exception;
+
+class BadMethodCallException extends Exception\BadMethodCallException implements
+    ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/Exception/ExceptionInterface.php
@@ -0,0 +1,16 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection\Exception;
+
+use Zend\Code\Exception\ExceptionInterface as Exception;
+
+interface ExceptionInterface extends Exception
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/Exception/InvalidArgumentException.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection\Exception;
+
+use Zend\Code\Exception;
+
+class InvalidArgumentException extends Exception\InvalidArgumentException implements
+    ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/Exception/RuntimeException.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection\Exception;
+
+use Zend\Code\Exception;
+
+class RuntimeException extends Exception\RuntimeException implements
+    ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/FileReflection.php
@@ -0,0 +1,317 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection;
+
+use Zend\Code\Scanner\CachingFileScanner;
+
+class FileReflection implements ReflectionInterface
+{
+    /**
+     * @var string
+     */
+    protected $filePath = null;
+
+    /**
+     * @var string
+     */
+    protected $docComment = null;
+
+    /**
+     * @var int
+     */
+    protected $startLine = 1;
+
+    /**
+     * @var int
+     */
+    protected $endLine = null;
+
+    /**
+     * @var string[]
+     */
+    protected $namespaces = array();
+
+    /**
+     * @var string[]
+     */
+    protected $uses = array();
+
+    /**
+     * @var string[]
+     */
+    protected $requiredFiles = array();
+
+    /**
+     * @var ClassReflection[]
+     */
+    protected $classes = array();
+
+    /**
+     * @var FunctionReflection[]
+     */
+    protected $functions = array();
+
+    /**
+     * @var string
+     */
+    protected $contents = null;
+
+    /**
+     * @param  string $filename
+     * @param  bool $includeIfNotAlreadyIncluded
+     * @throws Exception\InvalidArgumentException If file does not exists
+     * @throws Exception\RuntimeException If file exists but is not included or required
+     */
+    public function __construct($filename, $includeIfNotAlreadyIncluded = false)
+    {
+        if (($fileRealPath = realpath($filename)) === false) {
+            $fileRealPath = stream_resolve_include_path($filename);
+        }
+
+        if (!$fileRealPath) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                'No file for %s was found.',
+                $filename
+            ));
+        }
+
+        if (!in_array($fileRealPath, get_included_files())) {
+            if (!$includeIfNotAlreadyIncluded) {
+                throw new Exception\RuntimeException(sprintf(
+                    'File %s must be required before it can be reflected',
+                    $filename
+                ));
+            }
+
+            include $fileRealPath;
+        }
+
+        $this->filePath = $fileRealPath;
+        $this->reflect();
+    }
+
+    /**
+     * Required by the Reflector interface.
+     *
+     * @todo   What should this do?
+     * @return null
+     */
+    public static function export()
+    {
+        return;
+    }
+
+    /**
+     * Return the file name of the reflected file
+     *
+     * @return string
+     */
+    public function getFileName()
+    {
+        return basename($this->filePath);
+    }
+
+    /**
+     * Get the start line - Always 1, staying consistent with the Reflection API
+     *
+     * @return int
+     */
+    public function getStartLine()
+    {
+        return $this->startLine;
+    }
+
+    /**
+     * Get the end line / number of lines
+     *
+     * @return int
+     */
+    public function getEndLine()
+    {
+        return $this->endLine;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDocComment()
+    {
+        return $this->docComment;
+    }
+
+    /**
+     * @return DocBlockReflection
+     */
+    public function getDocBlock()
+    {
+        if (!($docComment = $this->getDocComment())) {
+            return false;
+        }
+
+        $instance = new DocBlockReflection($docComment);
+
+        return $instance;
+    }
+
+    /**
+     * @return string[]
+     */
+    public function getNamespaces()
+    {
+        return $this->namespaces;
+    }
+
+    /**
+     * @return string
+     */
+    public function getNamespace()
+    {
+        if (count($this->namespaces) == 0) {
+            return;
+        }
+
+        return $this->namespaces[0];
+    }
+
+    /**
+     * @return array
+     */
+    public function getUses()
+    {
+        return $this->uses;
+    }
+
+    /**
+     * Return the reflection classes of the classes found inside this file
+     *
+     * @return ClassReflection[]
+     */
+    public function getClasses()
+    {
+        $classes = array();
+        foreach ($this->classes as $class) {
+            $classes[] = new ClassReflection($class);
+        }
+
+        return $classes;
+    }
+
+    /**
+     * Return the reflection functions of the functions found inside this file
+     *
+     * @return FunctionReflection[]
+     */
+    public function getFunctions()
+    {
+        $functions = array();
+        foreach ($this->functions as $function) {
+            $functions[] = new FunctionReflection($function);
+        }
+
+        return $functions;
+    }
+
+    /**
+     * Retrieve the reflection class of a given class found in this file
+     *
+     * @param  null|string $name
+     * @return ClassReflection
+     * @throws Exception\InvalidArgumentException for invalid class name or invalid reflection class
+     */
+    public function getClass($name = null)
+    {
+        if (null === $name) {
+            reset($this->classes);
+            $selected = current($this->classes);
+
+            return new ClassReflection($selected);
+        }
+
+        if (in_array($name, $this->classes)) {
+            return new ClassReflection($name);
+        }
+
+        throw new Exception\InvalidArgumentException(sprintf(
+            'Class by name %s not found.',
+            $name
+        ));
+    }
+
+    /**
+     * Return the full contents of file
+     *
+     * @return string
+     */
+    public function getContents()
+    {
+        return file_get_contents($this->filePath);
+    }
+
+    public function toString()
+    {
+        return ''; // @todo
+    }
+
+    /**
+     * Serialize to string
+     *
+     * Required by the Reflector interface
+     *
+     * @todo   What should this serialization look like?
+     * @return string
+     */
+    public function __toString()
+    {
+        return '';
+    }
+
+    /**
+     * This method does the work of "reflecting" the file
+     *
+     * Uses Zend\Code\Scanner\FileScanner to gather file information
+     *
+     * @return void
+     */
+    protected function reflect()
+    {
+        $scanner             = new CachingFileScanner($this->filePath);
+        $this->docComment    = $scanner->getDocComment();
+        $this->requiredFiles = $scanner->getIncludes();
+        $this->classes       = $scanner->getClassNames();
+        $this->namespaces    = $scanner->getNamespaces();
+        $this->uses          = $scanner->getUses();
+    }
+
+    /**
+     * Validate / check a file level DocBlock
+     *
+     * @param  array $tokens Array of tokenizer tokens
+     * @return void
+     */
+    protected function checkFileDocBlock($tokens)
+    {
+        foreach ($tokens as $token) {
+            $type    = $token[0];
+            $value   = $token[1];
+            $lineNum = $token[2];
+            if (($type == T_OPEN_TAG) || ($type == T_WHITESPACE)) {
+                continue;
+            } elseif ($type == T_DOC_COMMENT) {
+                $this->docComment = $value;
+                $this->startLine  = $lineNum + substr_count($value, "\n") + 1;
+
+                return;
+            } else {
+                // Only whitespace is allowed before file DocBlocks
+                return;
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/FunctionReflection.php
@@ -0,0 +1,269 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection;
+
+use ReflectionFunction;
+
+class FunctionReflection extends ReflectionFunction implements ReflectionInterface
+{
+    /**
+     * Constant use in @MethodReflection to display prototype as an array
+     */
+    const PROTOTYPE_AS_ARRAY = 'prototype_as_array';
+
+    /**
+     * Constant use in @MethodReflection to display prototype as a string
+     */
+    const PROTOTYPE_AS_STRING = 'prototype_as_string';
+
+    /**
+     * Get function DocBlock
+     *
+     * @throws Exception\InvalidArgumentException
+     * @return DocBlockReflection
+     */
+    public function getDocBlock()
+    {
+        if ('' == ($comment = $this->getDocComment())) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s does not have a DocBlock',
+                $this->getName()
+            ));
+        }
+
+        $instance = new DocBlockReflection($comment);
+
+        return $instance;
+    }
+
+    /**
+     * Get start line (position) of function
+     *
+     * @param  bool $includeDocComment
+     * @return int
+     */
+    public function getStartLine($includeDocComment = false)
+    {
+        if ($includeDocComment) {
+            if ($this->getDocComment() != '') {
+                return $this->getDocBlock()->getStartLine();
+            }
+        }
+
+        return parent::getStartLine();
+    }
+
+    /**
+     * Get contents of function
+     *
+     * @param  bool   $includeDocBlock
+     * @return string
+     */
+    public function getContents($includeDocBlock = true)
+    {
+        $fileName = $this->getFileName();
+        if (false === $fileName) {
+            return '';
+        }
+
+        $startLine = $this->getStartLine();
+        $endLine = $this->getEndLine();
+
+        // eval'd protect
+        if (preg_match('#\((\d+)\) : eval\(\)\'d code$#', $fileName, $matches)) {
+            $fileName = preg_replace('#\(\d+\) : eval\(\)\'d code$#', '', $fileName);
+            $startLine = $endLine = $matches[1];
+        }
+
+        $lines = array_slice(
+            file($fileName, FILE_IGNORE_NEW_LINES),
+            $startLine - 1,
+            ($endLine - ($startLine - 1)),
+            true
+        );
+
+        $functionLine = implode("\n", $lines);
+
+        $content = '';
+        if ($this->isClosure()) {
+            preg_match('#function\s*\([^\)]*\)\s*(use\s*\([^\)]+\))?\s*\{(.*\;)?\s*\}#s', $functionLine, $matches);
+            if (isset($matches[0])) {
+                $content = $matches[0];
+            }
+        } else {
+            $name = substr($this->getName(), strrpos($this->getName(), '\\')+1);
+            preg_match('#function\s+' . preg_quote($name) . '\s*\([^\)]*\)\s*{([^{}]+({[^}]+})*[^}]+)?}#', $functionLine, $matches);
+            if (isset($matches[0])) {
+                $content = $matches[0];
+            }
+        }
+
+        $docComment = $this->getDocComment();
+
+        return $includeDocBlock && $docComment ? $docComment . "\n" . $content : $content;
+    }
+
+    /**
+     * Get method prototype
+     *
+     * @return array
+     */
+    public function getPrototype($format = FunctionReflection::PROTOTYPE_AS_ARRAY)
+    {
+        $returnType = 'mixed';
+        $docBlock = $this->getDocBlock();
+        if ($docBlock) {
+            $return = $docBlock->getTag('return');
+            $returnTypes = $return->getTypes();
+            $returnType = count($returnTypes) > 1 ? implode('|', $returnTypes) : $returnTypes[0];
+        }
+
+        $prototype = array(
+            'namespace' => $this->getNamespaceName(),
+            'name'      => substr($this->getName(), strlen($this->getNamespaceName()) + 1),
+            'return'    => $returnType,
+            'arguments' => array(),
+        );
+
+        $parameters = $this->getParameters();
+        foreach ($parameters as $parameter) {
+            $prototype['arguments'][$parameter->getName()] = array(
+                'type'     => $parameter->getType(),
+                'required' => !$parameter->isOptional(),
+                'by_ref'   => $parameter->isPassedByReference(),
+                'default'  => $parameter->isDefaultValueAvailable() ? $parameter->getDefaultValue() : null,
+            );
+        }
+
+        if ($format == FunctionReflection::PROTOTYPE_AS_STRING) {
+            $line = $prototype['return'] . ' ' . $prototype['name'] . '(';
+            $args = array();
+            foreach ($prototype['arguments'] as $name => $argument) {
+                $argsLine = ($argument['type'] ? $argument['type'] . ' ' : '') . ($argument['by_ref'] ? '&' : '') . '$' . $name;
+                if (!$argument['required']) {
+                    $argsLine .= ' = ' . var_export($argument['default'], true);
+                }
+                $args[] = $argsLine;
+            }
+            $line .= implode(', ', $args);
+            $line .= ')';
+
+            return $line;
+        }
+
+        return $prototype;
+    }
+
+    /**
+     * Get function parameters
+     *
+     * @return ParameterReflection[]
+     */
+    public function getParameters()
+    {
+        $phpReflections  = parent::getParameters();
+        $zendReflections = array();
+        while ($phpReflections && ($phpReflection = array_shift($phpReflections))) {
+            $instance          = new ParameterReflection($this->getName(), $phpReflection->getName());
+            $zendReflections[] = $instance;
+            unset($phpReflection);
+        }
+        unset($phpReflections);
+
+        return $zendReflections;
+    }
+
+    /**
+     * Get return type tag
+     *
+     * @throws Exception\InvalidArgumentException
+     * @return DocBlockReflection
+     */
+    public function getReturn()
+    {
+        $docBlock = $this->getDocBlock();
+        if (!$docBlock->hasTag('return')) {
+            throw new Exception\InvalidArgumentException(
+                'Function does not specify an @return annotation tag; cannot determine return type'
+            );
+        }
+
+        $tag    = $docBlock->getTag('return');
+
+        return new DocBlockReflection('@return ' . $tag->getDescription());
+    }
+
+    /**
+     * Get method body
+     *
+     * @return string|false
+     */
+    public function getBody()
+    {
+        $fileName = $this->getFileName();
+        if (false === $fileName) {
+            throw new Exception\InvalidArgumentException(
+                'Cannot determine internals functions body'
+            );
+        }
+
+        $startLine = $this->getStartLine();
+        $endLine = $this->getEndLine();
+
+        // eval'd protect
+        if (preg_match('#\((\d+)\) : eval\(\)\'d code$#', $fileName, $matches)) {
+            $fileName = preg_replace('#\(\d+\) : eval\(\)\'d code$#', '', $fileName);
+            $startLine = $endLine = $matches[1];
+        }
+
+        $lines = array_slice(
+            file($fileName, FILE_IGNORE_NEW_LINES),
+            $startLine - 1,
+            ($endLine - ($startLine - 1)),
+            true
+        );
+
+        $functionLine = implode("\n", $lines);
+
+        $body = false;
+        if ($this->isClosure()) {
+            preg_match('#function\s*\([^\)]*\)\s*(use\s*\([^\)]+\))?\s*\{(.*\;)\s*\}#s', $functionLine, $matches);
+            if (isset($matches[2])) {
+                $body = $matches[2];
+            }
+        } else {
+            $name = substr($this->getName(), strrpos($this->getName(), '\\')+1);
+            preg_match('#function\s+' . $name . '\s*\([^\)]*\)\s*{([^{}]+({[^}]+})*[^}]+)}#', $functionLine, $matches);
+            if (isset($matches[1])) {
+                $body = $matches[1];
+            }
+        }
+
+        return $body;
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return $this->__toString();
+    }
+
+    /**
+     * Required due to bug in php
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return parent::__toString();
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/MethodReflection.php
@@ -0,0 +1,494 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection;
+
+use ReflectionMethod as PhpReflectionMethod;
+use Zend\Code\Annotation\AnnotationManager;
+use Zend\Code\Scanner\AnnotationScanner;
+use Zend\Code\Scanner\CachingFileScanner;
+
+class MethodReflection extends PhpReflectionMethod implements ReflectionInterface
+{
+    /**
+     * Constant use in @MethodReflection to display prototype as an array
+     */
+    const PROTOTYPE_AS_ARRAY = 'prototype_as_array';
+
+    /**
+     * Constant use in @MethodReflection to display prototype as a string
+     */
+    const PROTOTYPE_AS_STRING = 'prototype_as_string';
+
+    /**
+     * @var AnnotationScanner
+     */
+    protected $annotations = null;
+
+    /**
+     * Retrieve method DocBlock reflection
+     *
+     * @return DocBlockReflection|false
+     */
+    public function getDocBlock()
+    {
+        if ('' == $this->getDocComment()) {
+            return false;
+        }
+
+        $instance = new DocBlockReflection($this);
+
+        return $instance;
+    }
+
+    /**
+     * @param  AnnotationManager $annotationManager
+     * @return AnnotationScanner
+     */
+    public function getAnnotations(AnnotationManager $annotationManager)
+    {
+        if (($docComment = $this->getDocComment()) == '') {
+            return false;
+        }
+
+        if ($this->annotations) {
+            return $this->annotations;
+        }
+
+        $cachingFileScanner = $this->createFileScanner($this->getFileName());
+        $nameInformation    = $cachingFileScanner->getClassNameInformation($this->getDeclaringClass()->getName());
+
+        if (!$nameInformation) {
+            return false;
+        }
+
+        $this->annotations = new AnnotationScanner($annotationManager, $docComment, $nameInformation);
+
+        return $this->annotations;
+    }
+
+    /**
+     * Get start line (position) of method
+     *
+     * @param  bool $includeDocComment
+     * @return int
+     */
+    public function getStartLine($includeDocComment = false)
+    {
+        if ($includeDocComment) {
+            if ($this->getDocComment() != '') {
+                return $this->getDocBlock()->getStartLine();
+            }
+        }
+
+        return parent::getStartLine();
+    }
+
+    /**
+     * Get reflection of declaring class
+     *
+     * @return ClassReflection
+     */
+    public function getDeclaringClass()
+    {
+        $phpReflection  = parent::getDeclaringClass();
+        $zendReflection = new ClassReflection($phpReflection->getName());
+        unset($phpReflection);
+
+        return $zendReflection;
+    }
+
+    /**
+     * Get method prototype
+     *
+     * @return array
+     */
+    public function getPrototype($format = MethodReflection::PROTOTYPE_AS_ARRAY)
+    {
+        $returnType = 'mixed';
+        $docBlock = $this->getDocBlock();
+        if ($docBlock) {
+            $return = $docBlock->getTag('return');
+            $returnTypes = $return->getTypes();
+            $returnType = count($returnTypes) > 1 ? implode('|', $returnTypes) : $returnTypes[0];
+        }
+
+        $declaringClass = $this->getDeclaringClass();
+        $prototype = array(
+            'namespace'  => $declaringClass->getNamespaceName(),
+            'class'      => substr($declaringClass->getName(), strlen($declaringClass->getNamespaceName()) + 1),
+            'name'       => $this->getName(),
+            'visibility' => ($this->isPublic() ? 'public' : ($this->isPrivate() ? 'private' : 'protected')),
+            'return'     => $returnType,
+            'arguments'  => array(),
+        );
+
+        $parameters = $this->getParameters();
+        foreach ($parameters as $parameter) {
+            $prototype['arguments'][$parameter->getName()] = array(
+                'type'     => $parameter->getType(),
+                'required' => !$parameter->isOptional(),
+                'by_ref'   => $parameter->isPassedByReference(),
+                'default'  => $parameter->isDefaultValueAvailable() ? $parameter->getDefaultValue() : null,
+            );
+        }
+
+        if ($format == MethodReflection::PROTOTYPE_AS_STRING) {
+            $line = $prototype['visibility'] . ' ' . $prototype['return'] . ' ' . $prototype['name'] . '(';
+            $args = array();
+            foreach ($prototype['arguments'] as $name => $argument) {
+                $argsLine = ($argument['type'] ? $argument['type'] . ' ' : '') . ($argument['by_ref'] ? '&' : '') . '$' . $name;
+                if (!$argument['required']) {
+                    $argsLine .= ' = ' . var_export($argument['default'], true);
+                }
+                $args[] = $argsLine;
+            }
+            $line .= implode(', ', $args);
+            $line .= ')';
+
+            return $line;
+        }
+
+        return $prototype;
+    }
+
+    /**
+     * Get all method parameter reflection objects
+     *
+     * @return ParameterReflection[]
+     */
+    public function getParameters()
+    {
+        $phpReflections  = parent::getParameters();
+        $zendReflections = array();
+        while ($phpReflections && ($phpReflection = array_shift($phpReflections))) {
+            $instance = new ParameterReflection(
+                array($this->getDeclaringClass()->getName(), $this->getName()),
+                $phpReflection->getName()
+            );
+            $zendReflections[] = $instance;
+            unset($phpReflection);
+        }
+        unset($phpReflections);
+
+        return $zendReflections;
+    }
+
+    /**
+     * Get method contents
+     *
+     * @param  bool $includeDocBlock
+     * @return string
+     */
+    public function getContents($includeDocBlock = true)
+    {
+        $docComment = $this->getDocComment();
+        $content  = ($includeDocBlock && !empty($docComment)) ? $docComment . "\n" : '';
+        $content .= $this->extractMethodContents();
+
+        return $content;
+    }
+
+    /**
+     * Get method body
+     *
+     * @return string
+     */
+    public function getBody()
+    {
+        return $this->extractMethodContents(true);
+    }
+
+    /**
+     * Tokenize method string and return concatenated body
+     *
+     * @param bool $bodyOnly
+     * @return string
+     */
+    protected function extractMethodContents($bodyOnly = false)
+    {
+        $fileName = $this->getFileName();
+
+        if ((class_exists($this->class) && false === $fileName) || ! file_exists($fileName)) {
+            return '';
+        }
+
+        $lines = array_slice(
+            file($fileName, FILE_IGNORE_NEW_LINES),
+            $this->getStartLine() - 1,
+            ($this->getEndLine() - ($this->getStartLine() - 1)),
+            true
+        );
+
+        $functionLine = implode("\n", $lines);
+        $tokens = token_get_all("<?php ". $functionLine);
+
+        //remove first entry which is php open tag
+        array_shift($tokens);
+
+        if (!count($tokens)) {
+            return '';
+        }
+
+        $capture = false;
+        $firstBrace = false;
+        $body = '';
+
+        foreach ($tokens as $key => $token) {
+            $tokenType  = (is_array($token)) ? token_name($token[0]) : $token;
+            $tokenValue = (is_array($token)) ? $token[1] : $token;
+
+            switch ($tokenType) {
+                case "T_FINAL":
+                case "T_ABSTRACT":
+                case "T_PUBLIC":
+                case "T_PROTECTED":
+                case "T_PRIVATE":
+                case "T_STATIC":
+                case "T_FUNCTION":
+                    // check to see if we have a valid function
+                    // then check if we are inside function and have a closure
+                    if ($this->isValidFunction($tokens, $key, $this->getName())) {
+                        if ($bodyOnly === false) {
+                            //if first instance of tokenType grab prefixed whitespace
+                            //and append to body
+                            if ($capture === false) {
+                                $body .= $this->extractPrefixedWhitespace($tokens, $key);
+                            }
+                            $body .= $tokenValue;
+                        }
+
+                        $capture = true;
+                    } else {
+                        //closure test
+                        if ($firstBrace && $tokenType == "T_FUNCTION") {
+                            $body .= $tokenValue;
+                            continue;
+                        }
+                        $capture = false;
+                        continue;
+                    }
+                    break;
+
+                case "{":
+                    if ($capture === false) {
+                        continue;
+                    }
+
+                    if ($firstBrace === false) {
+                        $firstBrace = true;
+                        if ($bodyOnly === true) {
+                            continue;
+                        }
+                    }
+
+                    $body .= $tokenValue;
+                    break;
+
+                case "}":
+                    if ($capture === false) {
+                        continue;
+                    }
+
+                    //check to see if this is the last brace
+                    if ($this->isEndingBrace($tokens, $key)) {
+                        //capture the end brace if not bodyOnly
+                        if ($bodyOnly === false) {
+                            $body .= $tokenValue;
+                        }
+
+                        break 2;
+                    }
+
+                    $body .= $tokenValue;
+                    break;
+
+                default:
+                    if ($capture === false) {
+                        continue;
+                    }
+
+                    // if returning body only wait for first brace before capturing
+                    if ($bodyOnly === true && $firstBrace !== true) {
+                        continue;
+                    }
+
+                    $body .= $tokenValue;
+                    break;
+            }
+        }
+
+        //remove ending whitespace and return
+        return rtrim($body);
+    }
+
+    /**
+     * Take current position and find any whitespace
+     *
+     * @param array $haystack
+     * @param int $position
+     * @return string
+     */
+    protected function extractPrefixedWhitespace($haystack, $position)
+    {
+        $content = '';
+        $count = count($haystack);
+        if ($position+1 == $count) {
+            return $content;
+        }
+
+        for ($i = $position-1;$i >= 0;$i--) {
+            $tokenType = (is_array($haystack[$i])) ? token_name($haystack[$i][0]) : $haystack[$i];
+            $tokenValue = (is_array($haystack[$i])) ? $haystack[$i][1] : $haystack[$i];
+
+            //search only for whitespace
+            if ($tokenType == "T_WHITESPACE") {
+                $content .= $tokenValue;
+            } else {
+                break;
+            }
+        }
+
+        return $content;
+    }
+
+    /**
+     * Test for ending brace
+     *
+     * @param array $haystack
+     * @param int $position
+     * @return bool
+     */
+    protected function isEndingBrace($haystack, $position)
+    {
+        $count = count($haystack);
+
+        //advance one position
+        $position = $position+1;
+
+        if ($position == $count) {
+            return true;
+        }
+
+        for ($i = $position;$i < $count; $i++) {
+            $tokenType = (is_array($haystack[$i])) ? token_name($haystack[$i][0]) : $haystack[$i];
+            switch ($tokenType) {
+                case "T_FINAL":
+                case "T_ABSTRACT":
+                case "T_PUBLIC":
+                case "T_PROTECTED":
+                case "T_PRIVATE":
+                case "T_STATIC":
+                    return true;
+
+                case "T_FUNCTION":
+                    // If a function is encountered and that function is not a closure
+                    // then return true.  otherwise the function is a closure, return false
+                    if ($this->isValidFunction($haystack, $i)) {
+                        return true;
+                    }
+                    return false;
+
+                case "}":
+                case ";";
+                case "T_BREAK":
+                case "T_CATCH":
+                case "T_DO":
+                case "T_ECHO":
+                case "T_ELSE":
+                case "T_ELSEIF":
+                case "T_EVAL":
+                case "T_EXIT":
+                case "T_FINALLY":
+                case "T_FOR":
+                case "T_FOREACH":
+                case "T_GOTO":
+                case "T_IF":
+                case "T_INCLUDE":
+                case "T_INCLUDE_ONCE":
+                case "T_PRINT":
+                case "T_STRING":
+                case "T_STRING_VARNAME":
+                case "T_THROW":
+                case "T_USE":
+                case "T_VARIABLE":
+                case "T_WHILE":
+                case "T_YIELD":
+
+                    return false;
+            }
+        }
+    }
+
+    /**
+     * Test to see if current position is valid function or
+     * closure.  Returns true if it's a function and NOT a closure
+     *
+     * @param array $haystack
+     * @param int $position
+     * @param string $functionName
+     * @return bool
+     */
+    protected function isValidFunction($haystack, $position, $functionName = null)
+    {
+        $isValid = false;
+        $count = count($haystack);
+        for ($i = $position+1; $i < $count; $i++) {
+            $tokenType = (is_array($haystack[$i])) ? token_name($haystack[$i][0]) : $haystack[$i];
+            $tokenValue = (is_array($haystack[$i])) ? $haystack[$i][1] : $haystack[$i];
+
+            //check for occurance of ( or
+            if ($tokenType == "T_STRING") {
+                //check to see if function name is passed, if so validate against that
+                if ($functionName !== null && $tokenValue != $functionName) {
+                    $isValid = false;
+                    break;
+                }
+
+                $isValid = true;
+                break;
+            } elseif ($tokenValue == "(") {
+                break;
+            }
+        }
+
+        return $isValid;
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return parent::__toString();
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return parent::__toString();
+    }
+
+    /**
+     * Creates a new FileScanner instance.
+     *
+     * By having this as a seperate method it allows the method to be overridden
+     * if a different FileScanner is needed.
+     *
+     * @param  string $filename
+     *
+     * @return CachingFileScanner
+     */
+    protected function createFileScanner($filename)
+    {
+        return new CachingFileScanner($filename);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/ParameterReflection.php
@@ -0,0 +1,116 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection;
+
+use ReflectionParameter;
+
+class ParameterReflection extends ReflectionParameter implements ReflectionInterface
+{
+    /**
+     * @var bool
+     */
+    protected $isFromMethod = false;
+
+    /**
+     * Get declaring class reflection object
+     *
+     * @return ClassReflection
+     */
+    public function getDeclaringClass()
+    {
+        $phpReflection  = parent::getDeclaringClass();
+        $zendReflection = new ClassReflection($phpReflection->getName());
+        unset($phpReflection);
+
+        return $zendReflection;
+    }
+
+    /**
+     * Get class reflection object
+     *
+     * @return ClassReflection
+     */
+    public function getClass()
+    {
+        $phpReflection = parent::getClass();
+        if ($phpReflection === null) {
+            return;
+        }
+
+        $zendReflection = new ClassReflection($phpReflection->getName());
+        unset($phpReflection);
+
+        return $zendReflection;
+    }
+
+    /**
+     * Get declaring function reflection object
+     *
+     * @return FunctionReflection|MethodReflection
+     */
+    public function getDeclaringFunction()
+    {
+        $phpReflection = parent::getDeclaringFunction();
+        if ($phpReflection instanceof \ReflectionMethod) {
+            $zendReflection = new MethodReflection($this->getDeclaringClass()->getName(), $phpReflection->getName());
+        } else {
+            $zendReflection = new FunctionReflection($phpReflection->getName());
+        }
+        unset($phpReflection);
+
+        return $zendReflection;
+    }
+
+    /**
+     * Get parameter type
+     *
+     * @return string
+     */
+    public function getType()
+    {
+        if ($this->isArray()) {
+            return 'array';
+        } elseif (method_exists($this, 'isCallable') && $this->isCallable()) {
+            return 'callable';
+        }
+
+        if (($class = $this->getClass()) instanceof \ReflectionClass) {
+            return $class->getName();
+        }
+
+        $docBlock = $this->getDeclaringFunction()->getDocBlock();
+        if (!$docBlock instanceof DocBlockReflection) {
+            return;
+        }
+
+        $params = $docBlock->getTags('param');
+        if (isset($params[$this->getPosition()])) {
+            return $params[$this->getPosition()]->getType();
+        }
+
+        return;
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return parent::__toString();
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return parent::__toString();
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/PropertyReflection.php
@@ -0,0 +1,114 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection;
+
+use ReflectionProperty as PhpReflectionProperty;
+use Zend\Code\Annotation\AnnotationManager;
+use Zend\Code\Scanner\AnnotationScanner;
+use Zend\Code\Scanner\CachingFileScanner;
+
+/**
+ * @todo       implement line numbers
+ */
+class PropertyReflection extends PhpReflectionProperty implements ReflectionInterface
+{
+    /**
+     * @var AnnotationScanner
+     */
+    protected $annotations;
+
+    /**
+     * Get declaring class reflection object
+     *
+     * @return ClassReflection
+     */
+    public function getDeclaringClass()
+    {
+        $phpReflection  = parent::getDeclaringClass();
+        $zendReflection = new ClassReflection($phpReflection->getName());
+        unset($phpReflection);
+
+        return $zendReflection;
+    }
+
+    /**
+     * Get DocBlock comment
+     *
+     * @return string|false False if no DocBlock defined
+     */
+    public function getDocComment()
+    {
+        return parent::getDocComment();
+    }
+
+    /**
+     * @return false|DocBlockReflection
+     */
+    public function getDocBlock()
+    {
+        if (!($docComment = $this->getDocComment())) {
+            return false;
+        }
+
+        $docBlockReflection = new DocBlockReflection($docComment);
+
+        return $docBlockReflection;
+    }
+
+    /**
+     * @param  AnnotationManager $annotationManager
+     * @return AnnotationScanner
+     */
+    public function getAnnotations(AnnotationManager $annotationManager)
+    {
+        if (null !== $this->annotations) {
+            return $this->annotations;
+        }
+
+        if (($docComment = $this->getDocComment()) == '') {
+            return false;
+        }
+
+        $class              = $this->getDeclaringClass();
+        $cachingFileScanner = $this->createFileScanner($class->getFileName());
+        $nameInformation    = $cachingFileScanner->getClassNameInformation($class->getName());
+
+        if (!$nameInformation) {
+            return false;
+        }
+
+        $this->annotations  = new AnnotationScanner($annotationManager, $docComment, $nameInformation);
+
+        return $this->annotations;
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return $this->__toString();
+    }
+
+    /**
+     * Creates a new FileScanner instance.
+     *
+     * By having this as a seperate method it allows the method to be overridden
+     * if a different FileScanner is needed.
+     *
+     * @param  string $filename
+     *
+     * @return CachingFileScanner
+     */
+    protected function createFileScanner($filename)
+    {
+        return new CachingFileScanner($filename);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Reflection/ReflectionInterface.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Reflection;
+
+use Reflector;
+
+interface ReflectionInterface extends Reflector
+{
+    /**
+     * @return string
+     */
+    public function toString();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/AggregateDirectoryScanner.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+use Zend\Code\Exception;
+
+class AggregateDirectoryScanner extends DirectoryScanner
+{
+    /**
+     * @var bool
+     */
+    protected $isScanned = false;
+
+    /**
+     * @param  bool $returnScannerClass
+     * @todo not implemented
+     */
+    public function getNamespaces($returnScannerClass = false)
+    {
+        // @todo
+    }
+
+    /*
+    public function getUses($returnScannerClass = false)
+    {}
+    */
+
+    public function getIncludes($returnScannerClass = false)
+    {
+    }
+
+    public function getClasses($returnScannerClass = false, $returnDerivedScannerClass = false)
+    {
+        $classes = array();
+        foreach ($this->directories as $scanner) {
+            $classes += $scanner->getClasses();
+        }
+        if ($returnScannerClass) {
+            foreach ($classes as $index => $class) {
+                $classes[$index] = $this->getClass($class, $returnScannerClass, $returnDerivedScannerClass);
+            }
+        }
+
+        return $classes;
+    }
+
+    /**
+     * @param  string $class
+     * @return bool
+     */
+    public function hasClass($class)
+    {
+        foreach ($this->directories as $scanner) {
+            if ($scanner->hasClass($class)) {
+                break;
+            } else {
+                unset($scanner);
+            }
+        }
+
+        return (isset($scanner));
+    }
+
+    /**
+     * @param  string $class
+     * @param  bool $returnScannerClass
+     * @param  bool $returnDerivedScannerClass
+     * @return ClassScanner|DerivedClassScanner
+     * @throws Exception\RuntimeException
+     */
+    public function getClass($class, $returnScannerClass = true, $returnDerivedScannerClass = false)
+    {
+        foreach ($this->directories as $scanner) {
+            if ($scanner->hasClass($class)) {
+                break;
+            } else {
+                unset($scanner);
+            }
+        }
+
+        if (!isset($scanner)) {
+            throw new Exception\RuntimeException('Class by that name was not found.');
+        }
+
+        $classScanner = $scanner->getClass($class);
+
+        return new DerivedClassScanner($classScanner, $this);
+    }
+
+    /**
+     * @param bool $returnScannerClass
+     */
+    public function getFunctions($returnScannerClass = false)
+    {
+        $this->scan();
+
+        if (!$returnScannerClass) {
+            $functions = array();
+            foreach ($this->infos as $info) {
+                if ($info['type'] == 'function') {
+                    $functions[] = $info['name'];
+                }
+            }
+
+            return $functions;
+        }
+        $scannerClass = new FunctionScanner();
+        // @todo
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/AnnotationScanner.php
@@ -0,0 +1,353 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+use Zend\Code\Annotation\AnnotationCollection;
+use Zend\Code\Annotation\AnnotationManager;
+use Zend\Code\NameInformation;
+
+class AnnotationScanner extends AnnotationCollection implements ScannerInterface
+{
+    /**
+     * @var bool
+     */
+    protected $isScanned = false;
+
+    /**
+     * @var string
+     */
+    protected $docComment = null;
+
+    /**
+     * @var NameInformation
+     */
+    protected $nameInformation = null;
+
+    /**
+     * @var AnnotationManager
+     */
+    protected $annotationManager = null;
+
+    /**
+     * @var array
+     */
+    protected $annotations = array();
+
+    /**
+     * @param  AnnotationManager $annotationManager
+     * @param  string $docComment
+     * @param  NameInformation $nameInformation
+     * @return AnnotationScanner
+     */
+    public function __construct(
+        AnnotationManager $annotationManager,
+        $docComment,
+        NameInformation $nameInformation = null
+    ) {
+        $this->annotationManager = $annotationManager;
+        $this->docComment        = $docComment;
+        $this->nameInformation   = $nameInformation;
+        $this->scan($this->tokenize());
+    }
+
+    /**
+     * @param NameInformation $nameInformation
+     */
+    public function setNameInformation(NameInformation $nameInformation)
+    {
+        $this->nameInformation = $nameInformation;
+    }
+
+    /**
+     * @param  array $tokens
+     */
+    protected function scan(array $tokens)
+    {
+        $annotations     = array();
+        $annotationIndex = -1;
+        $contentEnd      = false;
+
+        reset($tokens);
+
+        SCANNER_TOP:
+        $token = current($tokens);
+
+        switch ($token[0]) {
+
+            case 'ANNOTATION_CLASS':
+
+                $contentEnd = false;
+                $annotationIndex++;
+                $class                         = substr($token[1], 1);
+                $class                         = $this->nameInformation->resolveName($class);
+                $annotations[$annotationIndex] = array($class, null);
+                goto SCANNER_CONTINUE;
+                // goto no break needed
+
+            case 'ANNOTATION_CONTENT_START':
+
+                $annotations[$annotationIndex][1] = '';
+                //fall-through
+
+            case 'ANNOTATION_CONTENT_END':
+            case 'ANNOTATION_CONTENT':
+            case 'ANNOTATION_WHITESPACE':
+            case 'ANNOTATION_NEWLINE':
+
+                if (!$contentEnd && isset($annotations[$annotationIndex]) && is_string($annotations[$annotationIndex][1])) {
+                    $annotations[$annotationIndex][1] .= $token[1];
+                }
+
+                if ($token[0] === 'ANNOTATION_CONTENT_END') {
+                    $contentEnd = true;
+                }
+
+                goto SCANNER_CONTINUE;
+        }
+
+        SCANNER_CONTINUE:
+        if (next($tokens) === false) {
+            goto SCANNER_END;
+        }
+        goto SCANNER_TOP;
+
+        SCANNER_END:
+
+        foreach ($annotations as $annotation) {
+            $annotation[]     = '@' . $annotation[0] . $annotation[1];
+            $annotationObject = $this->annotationManager->createAnnotation($annotation);
+            if ($annotationObject) {
+                $this->append($annotationObject);
+            }
+        }
+    }
+
+    /**
+     * @return array
+     */
+    protected function tokenize()
+    {
+        static $CONTEXT_DOCBLOCK = 0x01;
+        static $CONTEXT_ASTERISK = 0x02;
+        static $CONTEXT_CLASS = 0x04;
+        static $CONTEXT_CONTENT = 0x08;
+
+        $context     = 0x00;
+        $stream      = $this->docComment;
+        $streamIndex = null;
+        $tokens      = array();
+        $tokenIndex  = null;
+        $currentChar = null;
+        $currentWord = null;
+        $currentLine = null;
+
+        $annotationParentCount = 0;
+
+        $MACRO_STREAM_ADVANCE_CHAR = function ($positionsForward = 1) use (&$stream, &$streamIndex, &$currentChar, &$currentWord, &$currentLine) {
+            $positionsForward = ($positionsForward > 0) ? $positionsForward : 1;
+            $streamIndex      = ($streamIndex === null) ? 0 : $streamIndex + $positionsForward;
+            if (!isset($stream[$streamIndex])) {
+                $currentChar = false;
+
+                return false;
+            }
+            $currentChar = $stream[$streamIndex];
+            $matches     = array();
+            $currentLine = (preg_match('#(.*?)(?:\n|\r\n?)#', $stream, $matches, null, $streamIndex) === 1) ? $matches[1] : substr($stream, $streamIndex);
+            if ($currentChar === ' ') {
+                $currentWord = (preg_match('#( +)#', $currentLine, $matches) === 1) ? $matches[1] : $currentLine;
+            } else {
+                $currentWord = (($matches = strpos($currentLine, ' ')) !== false) ? substr($currentLine, 0, $matches) : $currentLine;
+            }
+
+            return $currentChar;
+        };
+        $MACRO_STREAM_ADVANCE_WORD = function () use (&$currentWord, &$MACRO_STREAM_ADVANCE_CHAR) {
+            return $MACRO_STREAM_ADVANCE_CHAR(strlen($currentWord));
+        };
+        $MACRO_STREAM_ADVANCE_LINE = function () use (&$currentLine, &$MACRO_STREAM_ADVANCE_CHAR) {
+            return $MACRO_STREAM_ADVANCE_CHAR(strlen($currentLine));
+        };
+        $MACRO_TOKEN_ADVANCE       = function () use (&$tokenIndex, &$tokens) {
+            $tokenIndex          = ($tokenIndex === null) ? 0 : $tokenIndex + 1;
+            $tokens[$tokenIndex] = array('ANNOTATION_UNKNOWN', '');
+        };
+        $MACRO_TOKEN_SET_TYPE      = function ($type) use (&$tokenIndex, &$tokens) {
+            $tokens[$tokenIndex][0] = $type;
+        };
+        $MACRO_TOKEN_APPEND_CHAR   = function () use (&$currentChar, &$tokens, &$tokenIndex) {
+            $tokens[$tokenIndex][1] .= $currentChar;
+        };
+        $MACRO_TOKEN_APPEND_WORD   = function () use (&$currentWord, &$tokens, &$tokenIndex) {
+            $tokens[$tokenIndex][1] .= $currentWord;
+        };
+        $MACRO_TOKEN_APPEND_LINE   = function () use (&$currentLine, &$tokens, &$tokenIndex) {
+            $tokens[$tokenIndex][1] .= $currentLine;
+        };
+        $MACRO_HAS_CONTEXT         = function ($which) use (&$context) {
+            return (($context & $which) === $which);
+        };
+
+        $MACRO_STREAM_ADVANCE_CHAR();
+        $MACRO_TOKEN_ADVANCE();
+
+        TOKENIZER_TOP:
+
+        if ($context === 0x00 && $currentChar === '/' && $currentWord === '/**') {
+            $MACRO_TOKEN_SET_TYPE('ANNOTATION_COMMENTSTART');
+            $MACRO_TOKEN_APPEND_WORD();
+            $MACRO_TOKEN_ADVANCE();
+            $context |= $CONTEXT_DOCBLOCK;
+            $context |= $CONTEXT_ASTERISK;
+            if ($MACRO_STREAM_ADVANCE_WORD() === false) {
+                goto TOKENIZER_END;
+            }
+            goto TOKENIZER_TOP;
+        }
+
+        if ($MACRO_HAS_CONTEXT($CONTEXT_CLASS)) {
+            if (in_array($currentChar, array(' ', '(', "\n", "\r"))) {
+                $context &= ~$CONTEXT_CLASS;
+                $MACRO_TOKEN_ADVANCE();
+            } else {
+                $MACRO_TOKEN_APPEND_CHAR();
+                if ($MACRO_STREAM_ADVANCE_CHAR() === false) {
+                    goto TOKENIZER_END;
+                }
+                goto TOKENIZER_TOP;
+            }
+        }
+
+        // Since we don't know what line endings are used in the file, we check for all scenarios. If we find a
+        // cariage return (\r), we check the next character for a line feed (\n). If so we consume it and act as
+        // if the cariage return was a line feed.
+        $lineEnded = $currentChar === "\n";
+        if ($currentChar === "\r") {
+            $lineEnded = true;
+
+            $nextChar = $MACRO_STREAM_ADVANCE_CHAR();
+            if ($nextChar !== "\n") {
+                $streamIndex--;
+            }
+
+            $currentChar = "\n";
+        }
+
+        if ($lineEnded) {
+            $MACRO_TOKEN_SET_TYPE('ANNOTATION_NEWLINE');
+            $MACRO_TOKEN_APPEND_CHAR();
+            $MACRO_TOKEN_ADVANCE();
+            $context &= ~$CONTEXT_ASTERISK;
+            $context &= ~$CONTEXT_CLASS;
+            if ($MACRO_STREAM_ADVANCE_CHAR() === false) {
+                goto TOKENIZER_END;
+            }
+            goto TOKENIZER_TOP;
+        }
+
+        if ($currentChar === ' ') {
+            $MACRO_TOKEN_SET_TYPE(($MACRO_HAS_CONTEXT($CONTEXT_ASTERISK)) ? 'ANNOTATION_WHITESPACE' : 'ANNOTATION_WHITESPACE_INDENT');
+            $MACRO_TOKEN_APPEND_WORD();
+            $MACRO_TOKEN_ADVANCE();
+            if ($MACRO_STREAM_ADVANCE_WORD() === false) {
+                goto TOKENIZER_END;
+            }
+            goto TOKENIZER_TOP;
+        }
+
+        if ($MACRO_HAS_CONTEXT($CONTEXT_CONTENT) && $MACRO_HAS_CONTEXT($CONTEXT_ASTERISK)) {
+            $MACRO_TOKEN_SET_TYPE('ANNOTATION_CONTENT');
+            $annotationParentCount += substr_count($currentWord, '(');
+            $annotationParentCount -= substr_count($currentWord, ')');
+
+            if ($annotationParentCount === 0) {
+                $context &= ~$CONTEXT_CONTENT;
+                $MACRO_TOKEN_SET_TYPE('ANNOTATION_CONTENT_END');
+            }
+            $MACRO_TOKEN_APPEND_WORD();
+            $MACRO_TOKEN_ADVANCE();
+            if ($MACRO_STREAM_ADVANCE_WORD() === false) {
+                goto TOKENIZER_END;
+            }
+            goto TOKENIZER_TOP;
+        }
+
+        if ($currentChar === '(' && $tokens[$tokenIndex - 1][0] === 'ANNOTATION_CLASS') {
+            $context |= $CONTEXT_CONTENT;
+            $annotationParentCount = 1;
+            $MACRO_TOKEN_SET_TYPE('ANNOTATION_CONTENT_START');
+            $MACRO_TOKEN_APPEND_CHAR();
+            $MACRO_TOKEN_ADVANCE();
+            if ($MACRO_STREAM_ADVANCE_CHAR() === false) {
+                goto TOKENIZER_END;
+            }
+            goto TOKENIZER_TOP;
+        }
+
+        if ($MACRO_HAS_CONTEXT($CONTEXT_DOCBLOCK) && $currentWord === '*/') {
+            $MACRO_TOKEN_SET_TYPE('ANNOTATION_COMMENTEND');
+            $MACRO_TOKEN_APPEND_WORD();
+            $MACRO_TOKEN_ADVANCE();
+            $context &= ~$CONTEXT_DOCBLOCK;
+            if ($MACRO_STREAM_ADVANCE_WORD() === false) {
+                goto TOKENIZER_END;
+            }
+            goto TOKENIZER_TOP;
+        }
+
+        if ($currentChar === '*') {
+            if ($MACRO_HAS_CONTEXT($CONTEXT_DOCBLOCK) && ($MACRO_HAS_CONTEXT($CONTEXT_ASTERISK))) {
+                $MACRO_TOKEN_SET_TYPE('ANNOTATION_IGNORE');
+            } else {
+                $MACRO_TOKEN_SET_TYPE('ANNOTATION_ASTERISK');
+                $context |= $CONTEXT_ASTERISK;
+            }
+            $MACRO_TOKEN_APPEND_CHAR();
+            $MACRO_TOKEN_ADVANCE();
+            if ($MACRO_STREAM_ADVANCE_CHAR() === false) {
+                goto TOKENIZER_END;
+            }
+            goto TOKENIZER_TOP;
+        }
+
+        if ($currentChar === '@') {
+            $MACRO_TOKEN_SET_TYPE('ANNOTATION_CLASS');
+            $context |= $CONTEXT_CLASS;
+            $MACRO_TOKEN_APPEND_CHAR();
+            if ($MACRO_STREAM_ADVANCE_CHAR() === false) {
+                goto TOKENIZER_END;
+            }
+            goto TOKENIZER_TOP;
+        }
+
+        TOKENIZER_CONTINUE:
+
+        if ($context && $CONTEXT_CONTENT) {
+            $MACRO_TOKEN_APPEND_CHAR();
+            if ($MACRO_STREAM_ADVANCE_CHAR() === false) {
+                goto TOKENIZER_END;
+            }
+        } else {
+            $MACRO_TOKEN_SET_TYPE('ANNOTATION_IGNORE');
+            $MACRO_TOKEN_APPEND_LINE();
+            $MACRO_TOKEN_ADVANCE();
+            if ($MACRO_STREAM_ADVANCE_LINE() === false) {
+                goto TOKENIZER_END;
+            }
+        }
+        goto TOKENIZER_TOP;
+
+        TOKENIZER_END:
+
+        array_pop($tokens);
+
+        return $tokens;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/CachingFileScanner.php
@@ -0,0 +1,160 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+use Zend\Code\Annotation\AnnotationManager;
+use Zend\Code\Exception;
+use Zend\Code\NameInformation;
+
+class CachingFileScanner extends FileScanner
+{
+    /**
+     * @var array
+     */
+    protected static $cache = array();
+
+    /**
+     * @var null|FileScanner
+     */
+    protected $fileScanner = null;
+
+    /**
+     * @param  string $file
+     * @param  AnnotationManager $annotationManager
+     * @throws Exception\InvalidArgumentException
+     */
+    public function __construct($file, AnnotationManager $annotationManager = null)
+    {
+        if (!file_exists($file)) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                'File "%s" not found',
+                $file
+            ));
+        }
+
+        $file = realpath($file);
+
+        $cacheId = md5($file) . '/' . ((isset($annotationManager) ? spl_object_hash($annotationManager) : 'no-annotation'));
+
+        if (isset(static::$cache[$cacheId])) {
+            $this->fileScanner = static::$cache[$cacheId];
+        } else {
+            $this->fileScanner       = new FileScanner($file, $annotationManager);
+            static::$cache[$cacheId] = $this->fileScanner;
+        }
+    }
+
+    /**
+     * @return void
+     */
+    public static function clearCache()
+    {
+        static::$cache = array();
+    }
+
+    /**
+     * @return AnnotationManager
+     */
+    public function getAnnotationManager()
+    {
+        return $this->fileScanner->getAnnotationManager();
+    }
+
+    /**
+     * @return array|null|string
+     */
+    public function getFile()
+    {
+        return $this->fileScanner->getFile();
+    }
+
+    /**
+     * @return null|string
+     */
+    public function getDocComment()
+    {
+        return $this->fileScanner->getDocComment();
+    }
+
+    /**
+     * @return array
+     */
+    public function getNamespaces()
+    {
+        return $this->fileScanner->getNamespaces();
+    }
+
+    /**
+     * @param  null|string $namespace
+     * @return array|null
+     */
+    public function getUses($namespace = null)
+    {
+        return $this->fileScanner->getUses($namespace);
+    }
+
+    /**
+     * @return array
+     */
+    public function getIncludes()
+    {
+        return $this->fileScanner->getIncludes();
+    }
+
+    /**
+     * @return array
+     */
+    public function getClassNames()
+    {
+        return $this->fileScanner->getClassNames();
+    }
+
+    /**
+     * @return array
+     */
+    public function getClasses()
+    {
+        return $this->fileScanner->getClasses();
+    }
+
+    /**
+     * @param  int|string $className
+     * @return ClassScanner
+     */
+    public function getClass($className)
+    {
+        return $this->fileScanner->getClass($className);
+    }
+
+    /**
+     * @param  string $className
+     * @return bool|null|NameInformation
+     */
+    public function getClassNameInformation($className)
+    {
+        return $this->fileScanner->getClassNameInformation($className);
+    }
+
+    /**
+     * @return array
+     */
+    public function getFunctionNames()
+    {
+        return $this->fileScanner->getFunctionNames();
+    }
+
+    /**
+     * @return array
+     */
+    public function getFunctions()
+    {
+        return $this->fileScanner->getFunctions();
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/ClassScanner.php
@@ -0,0 +1,1344 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+use ReflectionClass;
+use Zend\Code\Annotation;
+use Zend\Code\Exception;
+use Zend\Code\NameInformation;
+
+class ClassScanner implements ScannerInterface
+{
+    /**
+     * @var bool
+     */
+    protected $isScanned = false;
+
+    /**
+     * @var string
+     */
+    protected $docComment = null;
+
+    /**
+     * @var string
+     */
+    protected $name = null;
+
+    /**
+     * @var string
+     */
+    protected $shortName = null;
+
+    /**
+     * @var int
+     */
+    protected $lineStart = null;
+
+    /**
+     * @var int
+     */
+    protected $lineEnd = null;
+
+    /**
+     * @var bool
+     */
+    protected $isTrait = false;
+
+    /**
+     * @var bool
+     */
+    protected $isFinal = false;
+
+    /**
+     * @var bool
+     */
+    protected $isAbstract = false;
+
+    /**
+     * @var bool
+     */
+    protected $isInterface = false;
+
+    /**
+     * @var string
+     */
+    protected $parentClass = null;
+
+    /**
+     * @var string
+     */
+    protected $shortParentClass = null;
+
+    /**
+     * @var array
+     */
+    protected $interfaces = array();
+
+    /**
+     * @var array
+     */
+    protected $shortInterfaces = array();
+
+    /**
+     * @var array
+     */
+    protected $tokens = array();
+
+    /**
+     * @var NameInformation
+     */
+    protected $nameInformation = null;
+
+    /**
+     * @var array
+     */
+    protected $infos = array();
+
+    /**
+     * @var array
+     */
+    protected $traits = array();
+
+    /**
+     * @var array
+     */
+    protected $methods = array();
+
+    /**
+     * @param  array $classTokens
+     * @param  NameInformation|null $nameInformation
+     * @return ClassScanner
+     */
+    public function __construct(array $classTokens, NameInformation $nameInformation = null)
+    {
+        $this->tokens          = $classTokens;
+        $this->nameInformation = $nameInformation;
+    }
+
+    /**
+     * Get annotations
+     *
+     * @param  Annotation\AnnotationManager $annotationManager
+     * @return Annotation\AnnotationCollection
+     */
+    public function getAnnotations(Annotation\AnnotationManager $annotationManager)
+    {
+        if (($docComment = $this->getDocComment()) == '') {
+            return false;
+        }
+
+        return new AnnotationScanner($annotationManager, $docComment, $this->nameInformation);
+    }
+
+    /**
+     * Return documentation comment
+     *
+     * @return null|string
+     */
+    public function getDocComment()
+    {
+        $this->scan();
+
+        return $this->docComment;
+    }
+
+    /**
+     * Return documentation block
+     *
+     * @return false|DocBlockScanner
+     */
+    public function getDocBlock()
+    {
+        if (!$docComment = $this->getDocComment()) {
+            return false;
+        }
+
+        return new DocBlockScanner($docComment);
+    }
+
+    /**
+     * Return a name of class
+     *
+     * @return null|string
+     */
+    public function getName()
+    {
+        $this->scan();
+        return $this->name;
+    }
+
+    /**
+     * Return short name of class
+     *
+     * @return null|string
+     */
+    public function getShortName()
+    {
+        $this->scan();
+        return $this->shortName;
+    }
+
+    /**
+     * Return number of first line
+     *
+     * @return int|null
+     */
+    public function getLineStart()
+    {
+        $this->scan();
+        return $this->lineStart;
+    }
+
+    /**
+     * Return number of last line
+     *
+     * @return int|null
+     */
+    public function getLineEnd()
+    {
+        $this->scan();
+        return $this->lineEnd;
+    }
+
+    /**
+     * Verify if class is final
+     *
+     * @return bool
+     */
+    public function isFinal()
+    {
+        $this->scan();
+        return $this->isFinal;
+    }
+
+    /**
+     * Verify if class is a trait
+     * @return bool
+     */
+    public function isTrait()
+    {
+        $this->scan();
+        return $this->isTrait;
+    }
+
+    /**
+     * Verify if class is instantiable
+     *
+     * @return bool
+     */
+    public function isInstantiable()
+    {
+        $this->scan();
+        return (!$this->isAbstract && !$this->isInterface);
+    }
+
+    /**
+     * Verify if class is an abstract class
+     *
+     * @return bool
+     */
+    public function isAbstract()
+    {
+        $this->scan();
+        return $this->isAbstract;
+    }
+
+    /**
+     * Verify if class is an interface
+     *
+     * @return bool
+     */
+    public function isInterface()
+    {
+        $this->scan();
+        return $this->isInterface;
+    }
+
+    /**
+     * Verify if class has parent
+     *
+     * @return bool
+     */
+    public function hasParentClass()
+    {
+        $this->scan();
+        return ($this->parentClass !== null);
+    }
+
+    /**
+     * Return a name of parent class
+     *
+     * @return null|string
+     */
+    public function getParentClass()
+    {
+        $this->scan();
+        return $this->parentClass;
+    }
+
+    /**
+     * Return a list of interface names
+     *
+     * @return array
+     */
+    public function getInterfaces()
+    {
+        $this->scan();
+        return $this->interfaces;
+    }
+
+    /**
+     * Return a list of constant names
+     *
+     * @return array
+     */
+    public function getConstantNames()
+    {
+        $this->scan();
+
+        $return = array();
+        foreach ($this->infos as $info) {
+            if ($info['type'] != 'constant') {
+                continue;
+            }
+
+            $return[] = $info['name'];
+        }
+
+        return $return;
+    }
+
+    /**
+     * Return a list of constants
+     *
+     * @param  bool $namesOnly Set false to return instances of ConstantScanner
+     * @return array|ConstantScanner[]
+     */
+    public function getConstants($namesOnly = true)
+    {
+        if (true === $namesOnly) {
+            trigger_error('Use method getConstantNames() instead', E_USER_DEPRECATED);
+            return $this->getConstantNames();
+        }
+
+        $this->scan();
+
+        $return = array();
+        foreach ($this->infos as $info) {
+            if ($info['type'] != 'constant') {
+                continue;
+            }
+
+            $return[] = $this->getConstant($info['name']);
+        }
+
+        return $return;
+    }
+
+    /**
+     * Return a single constant by given name or index of info
+     *
+     * @param  string|int $constantNameOrInfoIndex
+     * @throws Exception\InvalidArgumentException
+     * @return bool|ConstantScanner
+     */
+    public function getConstant($constantNameOrInfoIndex)
+    {
+        $this->scan();
+
+        if (is_int($constantNameOrInfoIndex)) {
+            $info = $this->infos[$constantNameOrInfoIndex];
+            if ($info['type'] != 'constant') {
+                throw new Exception\InvalidArgumentException('Index of info offset is not about a constant');
+            }
+        } elseif (is_string($constantNameOrInfoIndex)) {
+            $constantFound = false;
+            foreach ($this->infos as $info) {
+                if ($info['type'] === 'constant' && $info['name'] === $constantNameOrInfoIndex) {
+                    $constantFound = true;
+                    break;
+                }
+            }
+            if (!$constantFound) {
+                return false;
+            }
+        } else {
+            throw new Exception\InvalidArgumentException(
+                'Invalid constant name of info index type.  Must be of type int or string'
+            );
+        }
+        if (!isset($info)) {
+            return false;
+        }
+        $p = new ConstantScanner(
+            array_slice($this->tokens, $info['tokenStart'], $info['tokenEnd'] - $info['tokenStart'] + 1),
+            $this->nameInformation
+        );
+        $p->setClass($this->name);
+        $p->setScannerClass($this);
+        return $p;
+    }
+
+    /**
+     * Verify if class has constant
+     *
+     * @param  string $name
+     * @return bool
+     */
+    public function hasConstant($name)
+    {
+        $this->scan();
+
+        foreach ($this->infos as $info) {
+            if ($info['type'] === 'constant' && $info['name'] === $name) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Return a list of property names
+     *
+     * @return array
+     */
+    public function getPropertyNames()
+    {
+        $this->scan();
+
+        $return = array();
+        foreach ($this->infos as $info) {
+            if ($info['type'] != 'property') {
+                continue;
+            }
+
+            $return[] = $info['name'];
+        }
+
+        return $return;
+    }
+
+    /**
+     * Return a list of properties
+     *
+     * @return PropertyScanner[]
+     */
+    public function getProperties()
+    {
+        $this->scan();
+
+        $return = array();
+        foreach ($this->infos as $info) {
+            if ($info['type'] != 'property') {
+                continue;
+            }
+
+            $return[] = $this->getProperty($info['name']);
+        }
+
+        return $return;
+    }
+
+    /**
+     * Return a single property by given name or index of info
+     *
+     * @param  string|int $propertyNameOrInfoIndex
+     * @throws Exception\InvalidArgumentException
+     * @return bool|PropertyScanner
+     */
+    public function getProperty($propertyNameOrInfoIndex)
+    {
+        $this->scan();
+
+        if (is_int($propertyNameOrInfoIndex)) {
+            $info = $this->infos[$propertyNameOrInfoIndex];
+            if ($info['type'] != 'property') {
+                throw new Exception\InvalidArgumentException('Index of info offset is not about a property');
+            }
+        } elseif (is_string($propertyNameOrInfoIndex)) {
+            $propertyFound = false;
+            foreach ($this->infos as $info) {
+                if ($info['type'] === 'property' && $info['name'] === $propertyNameOrInfoIndex) {
+                    $propertyFound = true;
+                    break;
+                }
+            }
+            if (!$propertyFound) {
+                return false;
+            }
+        } else {
+            throw new Exception\InvalidArgumentException(
+                'Invalid property name of info index type.  Must be of type int or string'
+            );
+        }
+        if (!isset($info)) {
+            return false;
+        }
+        $p = new PropertyScanner(
+            array_slice($this->tokens, $info['tokenStart'], $info['tokenEnd'] - $info['tokenStart'] + 1),
+            $this->nameInformation
+        );
+        $p->setClass($this->name);
+        $p->setScannerClass($this);
+        return $p;
+    }
+
+    /**
+     * Verify if class has property
+     *
+     * @param  string $name
+     * @return bool
+     */
+    public function hasProperty($name)
+    {
+        $this->scan();
+
+        foreach ($this->infos as $info) {
+            if ($info['type'] === 'property' && $info['name'] === $name) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Retrieve any traits used by the class.
+     *
+     * @return ClassScanner[]
+     */
+    public function getTraits()
+    {
+        if (! empty($this->traits)) {
+            return $this->traits;
+        }
+
+        // get list of trait names
+        $traitNames = $this->getTraitNames();
+        foreach ($traitNames as $traitName) {
+            $r = new ReflectionClass($traitName);
+            if (! $r->isTrait()) {
+                throw new Exception\RuntimeException(sprintf(
+                    'Non-trait class detected as a trait: %s',
+                    $traitName
+                ));
+            }
+            $fileName = $r->getFileName();
+
+            $file = new FileScanner($fileName);
+            $this->traits[] = $file->getClass($traitName);
+        }
+
+        return $this->traits;
+    }
+
+    /**
+     * Retrieve a list of trait names used by this class.
+     *
+     * @return array
+     */
+    public function getTraitNames()
+    {
+        $return = array();
+        foreach ($this->infos as $info) {
+            if ($info['type'] !== 'use') {
+                continue;
+            }
+
+            if (is_array($info['use_statements'])) {
+                foreach ($info['use_statements'] as $trait) {
+                    $traitName = $trait;
+                    if ($this->nameInformation instanceof NameInformation) {
+                        $traitName = $this->nameInformation->resolveName($traitName);
+                    }
+                    $return[] = $traitName;
+                }
+            }
+            break;
+        }
+
+        return $return;
+    }
+
+    /**
+     * Retrieve a list of aliased traits used by the class.
+     *
+     * @return array
+     */
+    public function getTraitAliases()
+    {
+        $return = array();
+        foreach ($this->infos as $info) {
+            if ($info['type'] !== 'use') {
+                continue;
+            }
+
+            if (is_array($info['aliases'])) {
+                foreach ($info['aliases'] as $alias) {
+                    if (null === $alias
+                        || (! empty($alias['type']) && $alias['type'] !== 'as')
+                    ) {
+                        continue;
+                    }
+
+                    // attempt to get fqcn
+                    list($trait, $method) = explode('::', $alias['original']);
+                    if ($this->nameInformation instanceof NameInformation) {
+                        $trait = $this->nameInformation->resolveName($trait);
+                    }
+
+                    $return[$alias['alias']] = $trait . '::' . $method;
+                }
+            }
+            break;
+        }
+
+        return $return;
+    }
+
+    /**
+     * Retrieve visibility for a given alias.
+     *
+     * @param mixed $aliasName
+     * @return string
+     */
+    protected function getVisibilityForAlias($aliasName)
+    {
+        $return = null;
+        foreach ($this->infos as $info) {
+            if ($info['type'] !== 'use') {
+                continue;
+            }
+
+            if (is_array($info['aliases'])) {
+                foreach ($info['aliases'] as $alias) {
+                    if (null === $alias
+                        && (! empty($alias['type']) && $alias['type'] !== 'as')
+                    ) {
+                        continue;
+                    }
+
+                    if ($alias['alias'] === $aliasName) {
+                        $return = $alias['visibility'];
+                        break 2;
+                    }
+                }
+            }
+            break;
+        }
+
+        return $return;
+    }
+
+    /**
+     * Return an array of key = trait to keep, value = trait::method to ignore
+     *
+     * @return array
+     */
+    protected function getBlockedTraitMethods()
+    {
+        $return = array();
+        foreach ($this->infos as $info) {
+            if ($info['type'] !== 'use') {
+                continue;
+            }
+
+            if (is_array($info['aliases'])) {
+                foreach ($info['aliases'] as $alias) {
+                    if (null === $alias
+                        || (! empty($alias['type']) && $alias['type'] !== 'insteadof')
+                    ) {
+                        continue;
+                    }
+
+                    // attempt to get fqcn
+                    list($trait, $method) = explode('::', $alias['original']);
+                    if ($this->nameInformation instanceof NameInformation) {
+                        $trait = $this->nameInformation->resolveName($alias['alias']);
+                    }
+
+                    $return[] = $trait . '::' . $method;
+                }
+            }
+            break;
+        }
+
+        return $return;
+    }
+
+    /**
+     * Return a list of method names
+     *
+     * @return array
+     */
+    public function getMethodNames()
+    {
+        $this->scan();
+
+        $methods = $this->getMethods();
+        $return = array();
+        foreach ($methods as $method) {
+            $return[] = $method->getName();
+        }
+
+        return $return;
+    }
+
+    /**
+     * Return a list of methods
+     *
+     * @return MethodScanner[]
+     */
+    public function getMethods()
+    {
+        $this->scan();
+
+        if (! empty($this->methods)) {
+            return $this->methods;
+        }
+
+        foreach ($this->infos as $info) {
+            if ($info['type'] !== 'method' && $info['type'] !== 'use') {
+                continue;
+            }
+
+            // Merge in trait methods
+            if ($info['type'] === "use") {
+                $traitMethods = array();
+                $traits       = $this->getTraits();
+                $insteadof    = $this->getBlockedTraitMethods();
+                $aliases      = $this->getTraitAliases();
+
+                foreach ($traits as $trait) {
+                    $tempMethods = $trait->getMethods();
+                    foreach ($tempMethods as $tempMethod) {
+                        $methodFullName = $trait->getName() . '::' . $tempMethod->getName();
+                        $methodAlias = array_search($methodFullName, $aliases);
+
+                        if (false !== $methodAlias) {
+                            // trait::method is aliased
+                            // clone the tempMethod as we need to change
+                            // the name and possibly the visibility of the
+                            // scanned method.
+                            //
+                            // @todo setName and setVisibility were added to
+                            // MethodScanner to accomplish this, may not be the
+                            // best option, could use ReflectionClass instead?
+                            $newMethod = clone $tempMethod;
+                            $newMethod->setName($methodAlias);
+
+                            // if visibility exists, change it on the MethodScanner
+                            $visibility = $this->getVisibilityForAlias($methodAlias);
+                            if (null !== $visibility) {
+                                $newMethod->setVisibility($visibility);
+                            }
+                            $traitMethods[$methodAlias] = $newMethod;
+                        } elseif (in_array($methodFullName, $insteadof)) {
+                            // ignore overridden methods
+                            continue;
+                        } else {
+                            if (array_key_exists($tempMethod->getName(), $traitMethods)) {
+                                throw new Exception\RuntimeException(sprintf(
+                                    'Trait method %s has not been applied because there are'
+                                    . ' collisions with other trait methods see: (insteadof OR as)',
+                                    $tempMethod->getName()
+                                ));
+                            }
+
+                            $traitMethods[$tempMethod->getName()] = $tempMethod;
+                        }
+                    }
+                }
+
+                $this->methods = array_merge($this->methods, array_values($traitMethods));
+                continue;
+            }
+
+            $m = new MethodScanner(
+                array_slice(
+                    $this->tokens,
+                    $info['tokenStart'],
+                    $info['tokenEnd'] - $info['tokenStart'] + 1
+                ),
+                $this->nameInformation
+            );
+            $m->setClass($this->name);
+            $m->setScannerClass($this);
+
+            $this->methods[] = $m;
+        }
+
+        return $this->methods;
+    }
+
+    /**
+     * Return a single method by given name or index of info
+     *
+     * @param  string|int $methodNameOrInfoIndex
+     * @throws Exception\InvalidArgumentException
+     * @return MethodScanner
+     */
+    public function getMethod($methodNameOrInfoIndex)
+    {
+        $this->scan();
+
+        if (is_int($methodNameOrInfoIndex)) {
+            $info = $this->infos[$methodNameOrInfoIndex];
+            if ($info['type'] != 'method') {
+                throw new Exception\InvalidArgumentException('Index of info offset is not about a method');
+            }
+            $methodNameOrInfoIndex = $info['name'];
+        }
+
+        $returnMethod = false;
+        $methods = $this->getMethods();
+        foreach ($methods as $method) {
+            if ($method->getName() === $methodNameOrInfoIndex) {
+                $returnMethod = $method;
+                break;
+            }
+        }
+
+        return $returnMethod;
+    }
+
+    /**
+     * Verify if class has method by given name
+     *
+     * @param  string $name
+     * @return bool
+     */
+    public function hasMethod($name)
+    {
+        $this->scan();
+
+        return is_object($this->getMethod($name));
+    }
+
+    public static function export()
+    {
+        // @todo
+    }
+
+    public function __toString()
+    {
+        // @todo
+    }
+
+    /**
+     * Scan tokens
+     *
+     * @return void
+     * @throws Exception\RuntimeException
+     */
+    protected function scan()
+    {
+        if ($this->isScanned) {
+            return;
+        }
+
+        if (!$this->tokens) {
+            throw new Exception\RuntimeException('No tokens were provided');
+        }
+
+        /**
+         * Variables & Setup
+         */
+
+        $tokens       = &$this->tokens; // localize
+        $infos        = &$this->infos; // localize
+        $tokenIndex   = null;
+        $token        = null;
+        $tokenType    = null;
+        $tokenContent = null;
+        $tokenLine    = null;
+        $namespace    = null;
+        $infoIndex    = 0;
+        $braceCount   = 0;
+
+        /*
+         * MACRO creation
+         */
+        $MACRO_TOKEN_ADVANCE = function () use (
+            &$tokens,
+            &$tokenIndex,
+            &$token,
+            &$tokenType,
+            &$tokenContent,
+            &$tokenLine
+        ) {
+            static $lastTokenArray = null;
+            $tokenIndex = ($tokenIndex === null) ? 0 : $tokenIndex + 1;
+            if (!isset($tokens[$tokenIndex])) {
+                $token        = false;
+                $tokenContent = false;
+                $tokenType    = false;
+                $tokenLine    = false;
+
+                return false;
+            }
+            $token = $tokens[$tokenIndex];
+
+            if (is_string($token)) {
+                $tokenType    = null;
+                $tokenContent = $token;
+                $tokenLine    = $tokenLine + substr_count(
+                    $lastTokenArray[1],
+                    "\n"
+                ); // adjust token line by last known newline count
+            } else {
+                $lastTokenArray = $token;
+                list($tokenType, $tokenContent, $tokenLine) = $token;
+            }
+
+            return $tokenIndex;
+        };
+        $MACRO_INFO_ADVANCE  = function () use (&$infoIndex, &$infos, &$tokenIndex, &$tokenLine) {
+            $infos[$infoIndex]['tokenEnd'] = $tokenIndex;
+            $infos[$infoIndex]['lineEnd']  = $tokenLine;
+            $infoIndex++;
+
+            return $infoIndex;
+        };
+
+        /**
+         * START FINITE STATE MACHINE FOR SCANNING TOKENS
+         */
+
+        // Initialize token
+        $MACRO_TOKEN_ADVANCE();
+
+        SCANNER_TOP:
+
+        switch ($tokenType) {
+
+            case T_DOC_COMMENT:
+
+                $this->docComment = $tokenContent;
+                goto SCANNER_CONTINUE;
+                //goto no break needed
+
+            case T_FINAL:
+            case T_ABSTRACT:
+            case T_CLASS:
+            case T_INTERFACE:
+            case T_TRAIT:
+
+                // CLASS INFORMATION
+
+                $classContext        = null;
+                $classInterfaceIndex = 0;
+
+                SCANNER_CLASS_INFO_TOP:
+
+                if (is_string($tokens[$tokenIndex + 1]) && $tokens[$tokenIndex + 1] === '{') {
+                    goto SCANNER_CLASS_INFO_END;
+                }
+
+                $this->lineStart = $tokenLine;
+
+                switch ($tokenType) {
+
+                    case T_FINAL:
+                        $this->isFinal = true;
+                        goto SCANNER_CLASS_INFO_CONTINUE;
+                        // goto no break needed
+
+                    case T_ABSTRACT:
+                        $this->isAbstract = true;
+                        goto SCANNER_CLASS_INFO_CONTINUE;
+                        // goto no break needed
+
+                    case T_TRAIT:
+                        $this->isTrait = true;
+                        $this->shortName = $tokens[$tokenIndex + 2][1];
+                        if ($this->nameInformation && $this->nameInformation->hasNamespace()) {
+                            $this->name = $this->nameInformation->getNamespace() . '\\' . $this->shortName;
+                        } else {
+                            $this->name = $this->shortName;
+                        }
+                        goto SCANNER_CLASS_INFO_CONTINUE;
+
+                    case T_INTERFACE:
+                        $this->isInterface = true;
+                        //fall-through
+                    case T_CLASS:
+                        $this->shortName = $tokens[$tokenIndex + 2][1];
+                        if ($this->nameInformation && $this->nameInformation->hasNamespace()) {
+                            $this->name = $this->nameInformation->getNamespace() . '\\' . $this->shortName;
+                        } else {
+                            $this->name = $this->shortName;
+                        }
+                        goto SCANNER_CLASS_INFO_CONTINUE;
+                        //goto no break needed
+
+                    case T_NS_SEPARATOR:
+                    case T_STRING:
+                        switch ($classContext) {
+                            case T_EXTENDS:
+                                $this->shortParentClass .= $tokenContent;
+                                break;
+                            case T_IMPLEMENTS:
+                                $this->shortInterfaces[$classInterfaceIndex] .= $tokenContent;
+                                break;
+                        }
+                        goto SCANNER_CLASS_INFO_CONTINUE;
+                        //goto no break needed
+
+                    case T_EXTENDS:
+                    case T_IMPLEMENTS:
+                        $classContext = $tokenType;
+                        if (($this->isInterface && $classContext === T_EXTENDS) || $classContext === T_IMPLEMENTS) {
+                            $this->shortInterfaces[$classInterfaceIndex] = '';
+                        } elseif (!$this->isInterface && $classContext === T_EXTENDS) {
+                            $this->shortParentClass = '';
+                        }
+                        goto SCANNER_CLASS_INFO_CONTINUE;
+                        //goto no break needed
+
+                    case null:
+                        if ($classContext == T_IMPLEMENTS && $tokenContent == ',') {
+                            $classInterfaceIndex++;
+                            $this->shortInterfaces[$classInterfaceIndex] = '';
+                        }
+
+                }
+
+                SCANNER_CLASS_INFO_CONTINUE:
+
+                if ($MACRO_TOKEN_ADVANCE() === false) {
+                    goto SCANNER_END;
+                }
+                goto SCANNER_CLASS_INFO_TOP;
+
+                SCANNER_CLASS_INFO_END:
+
+                goto SCANNER_CONTINUE;
+
+        }
+
+        if ($tokenType === null && $tokenContent === '{' && $braceCount === 0) {
+            $braceCount++;
+            if ($MACRO_TOKEN_ADVANCE() === false) {
+                goto SCANNER_END;
+            }
+
+            SCANNER_CLASS_BODY_TOP:
+
+            if ($braceCount === 0) {
+                goto SCANNER_CLASS_BODY_END;
+            }
+
+            switch ($tokenType) {
+
+                case T_CONST:
+
+                    $infos[$infoIndex] = array(
+                        'type'          => 'constant',
+                        'tokenStart'    => $tokenIndex,
+                        'tokenEnd'      => null,
+                        'lineStart'     => $tokenLine,
+                        'lineEnd'       => null,
+                        'name'          => null,
+                        'value'         => null,
+                    );
+
+                    SCANNER_CLASS_BODY_CONST_TOP:
+
+                    if ($tokenContent === ';') {
+                        goto SCANNER_CLASS_BODY_CONST_END;
+                    }
+
+                    if ($tokenType === T_STRING && null === $infos[$infoIndex]['name']) {
+                        $infos[$infoIndex]['name'] = $tokenContent;
+                    }
+
+                    SCANNER_CLASS_BODY_CONST_CONTINUE:
+
+                    if ($MACRO_TOKEN_ADVANCE() === false) {
+                        goto SCANNER_END;
+                    }
+                    goto SCANNER_CLASS_BODY_CONST_TOP;
+
+                    SCANNER_CLASS_BODY_CONST_END:
+
+                    $MACRO_INFO_ADVANCE();
+                    goto SCANNER_CLASS_BODY_CONTINUE;
+                    // goto no break needed
+
+                case T_USE:
+                    // ensure php backwards compatibility
+                    if (! defined('T_INSTEADOF')) {
+                        define('T_INSTEADOF', 24000);
+                    }
+
+                    $infos[$infoIndex] = array(
+                        'type'           => 'use',
+                        'tokenStart'     => $tokenIndex,
+                        'tokenEnd'       => null,
+                        'lineStart'      => $tokens[$tokenIndex][2],
+                        'lineEnd'        => null,
+                        'name'           => $namespace,
+                        'use_statements' => array(0 => null),
+                        'aliases'        => array(0 => null),
+                    );
+
+                    $isOriginalName = array(T_STRING, T_DOUBLE_COLON);
+                    $isAlias        = array(T_STRING);
+                    $isVisibility   = array(T_PRIVATE, T_PROTECTED, T_PUBLIC, T_STATIC);
+                    $isAliasType    = array(T_AS, T_INSTEADOF);
+                    $isValidAlias   = array_merge($isOriginalName, $isAlias, $isVisibility, $isAliasType);
+
+                    $useStatementIndex   = 0;
+                    $aliasStatementIndex = 0;
+                    $useAliasContext     = false;
+                    $useAsContext        = false;
+
+                    // start processing with next token
+                    if ($MACRO_TOKEN_ADVANCE() === false) {
+                        goto SCANNER_END;
+                    }
+
+                    SCANNER_USE_TOP:
+
+                    if ($tokenType === null) {
+                        if ($tokenContent === "{") {
+                            $useStatementIndex = 0;
+                            $useAliasContext   = true;
+                            $infos[$infoIndex]['aliases'][$useStatementIndex] = array(
+                                'original'   => null,
+                                'alias'      => null,
+                                'visibility' => null,
+                                'type'       => 'as'
+                            );
+                        } elseif ($tokenContent === "}") {
+                            $useAliasContext = false;
+                            goto SCANNER_USE_END;
+                        } elseif ($tokenContent === ';') {
+                            if ($useAliasContext === true) {
+                                $useStatementIndex++;
+                                $useAsContext = false;
+                            }
+                            // only end if we aren't inside braces
+                            if (false === $useAliasContext) {
+                                goto SCANNER_USE_END;
+                            }
+                        } elseif ($tokenContent === ',') {
+                            $useStatementIndex++;
+                            $infos[$infoIndex]['use_statements'][$useStatementIndex] = '';
+                        }
+                    }
+
+                    // ANALYZE
+                    if ($tokenType !== null) {
+                        // use context
+                        if (false === $useAliasContext) {
+                            if ($tokenType == T_NS_SEPARATOR || $tokenType == T_STRING) {
+                                $infos[$infoIndex]['use_statements'][$useStatementIndex] .= $tokenContent;
+                            }
+                        } else {
+                            if (in_array($tokenType, $isValidAlias)
+                                && empty($infos[$infoIndex]['aliases'][$useStatementIndex])
+                            ) {
+                                $infos[$infoIndex]['aliases'][$useStatementIndex] = array(
+                                    'original'   => null,
+                                    'visibility' => null,
+                                    'alias'      => null,
+                                    'type'       => null
+                                );
+                            }
+
+                            if ($tokenType == T_AS || $tokenType == T_INSTEADOF) {
+                                $useAsContext = true;
+                                $infos[$infoIndex]['aliases'][$useStatementIndex]['type'] = ($tokenType == T_INSTEADOF)
+                                    ? 'insteadof'
+                                    : 'as';
+                                goto SCANNER_USE_CONTINUE;
+                            }
+
+                            // in alias context
+                            if ($useAsContext === true && in_array($tokenType, $isAlias)) {
+                                $infos[$infoIndex]['aliases'][$useStatementIndex]['alias'] = $tokenContent;
+                            } elseif (in_array($tokenType, $isOriginalName)) {
+                                $infos[$infoIndex]['aliases'][$useStatementIndex]['original'] .= $tokenContent;
+                            } elseif (in_array($tokenType, $isVisibility)) {
+                                //add whitespace (will trim later)
+                                $infos[$infoIndex]['aliases'][$useStatementIndex]['visibility'] = $tokenType;
+                            }
+                        }
+                    }
+
+                    SCANNER_USE_CONTINUE:
+
+                    if ($MACRO_TOKEN_ADVANCE() === false) {
+                        goto SCANNER_END;
+                    }
+                    goto SCANNER_USE_TOP;
+
+                    SCANNER_USE_END:
+
+                    $MACRO_INFO_ADVANCE();
+                    goto SCANNER_CLASS_BODY_CONTINUE;
+
+                case T_DOC_COMMENT:
+                case T_PUBLIC:
+                case T_PROTECTED:
+                case T_PRIVATE:
+                case T_ABSTRACT:
+                case T_FINAL:
+                case T_VAR:
+                case T_FUNCTION:
+
+                    $infos[$infoIndex] = array(
+                        'type'        => null,
+                        'tokenStart'  => $tokenIndex,
+                        'tokenEnd'    => null,
+                        'lineStart'   => $tokenLine,
+                        'lineEnd'     => null,
+                        'name'        => null,
+                    );
+
+                    $memberContext     = null;
+                    $methodBodyStarted = false;
+
+                    SCANNER_CLASS_BODY_MEMBER_TOP:
+
+                    if ($memberContext === 'method') {
+                        switch ($tokenContent) {
+                            case '{':
+                                $methodBodyStarted = true;
+                                $braceCount++;
+                                goto SCANNER_CLASS_BODY_MEMBER_CONTINUE;
+                                // goto no break needed
+                            case '}':
+                                $braceCount--;
+                                goto SCANNER_CLASS_BODY_MEMBER_CONTINUE;
+
+                            case ';':
+                                $infos[$infoIndex]['tokenEnd'] = $tokenIndex;
+                                goto SCANNER_CLASS_BODY_MEMBER_CONTINUE;
+                        }
+                    }
+
+                    if ($memberContext !== null) {
+                        if (
+                            ($memberContext === 'property' && $tokenContent === ';')
+                            || ($memberContext === 'method' && $methodBodyStarted && $braceCount === 1)
+                            || ($memberContext === 'method' && $this->isInterface && $tokenContent === ';')
+                        ) {
+                            goto SCANNER_CLASS_BODY_MEMBER_END;
+                        }
+                    }
+
+                    switch ($tokenType) {
+
+                        case T_CONST:
+                            $memberContext             = 'constant';
+                            $infos[$infoIndex]['type'] = 'constant';
+                            goto SCANNER_CLASS_BODY_CONST_CONTINUE;
+                            //goto no break needed
+
+                        case T_VARIABLE:
+                            if ($memberContext === null) {
+                                $memberContext             = 'property';
+                                $infos[$infoIndex]['type'] = 'property';
+                                $infos[$infoIndex]['name'] = ltrim($tokenContent, '$');
+                            }
+                            goto SCANNER_CLASS_BODY_MEMBER_CONTINUE;
+                            // goto no break needed
+
+                        case T_FUNCTION:
+                            $memberContext             = 'method';
+                            $infos[$infoIndex]['type'] = 'method';
+                            goto SCANNER_CLASS_BODY_MEMBER_CONTINUE;
+                            // goto no break needed
+
+                        case T_STRING:
+                            if ($memberContext === 'method' && null === $infos[$infoIndex]['name']) {
+                                $infos[$infoIndex]['name'] = $tokenContent;
+                            }
+                            goto SCANNER_CLASS_BODY_MEMBER_CONTINUE;
+                            // goto no break needed
+                    }
+
+                    SCANNER_CLASS_BODY_MEMBER_CONTINUE:
+
+                    if ($MACRO_TOKEN_ADVANCE() === false) {
+                        goto SCANNER_END;
+                    }
+                    goto SCANNER_CLASS_BODY_MEMBER_TOP;
+
+                    SCANNER_CLASS_BODY_MEMBER_END:
+
+                    $memberContext = null;
+                    $MACRO_INFO_ADVANCE();
+                    goto SCANNER_CLASS_BODY_CONTINUE;
+                    // goto no break needed
+
+                case null: // no type, is a string
+
+                    switch ($tokenContent) {
+                        case '{':
+                            $braceCount++;
+                            goto SCANNER_CLASS_BODY_CONTINUE;
+                            // goto no break needed
+
+                        case '}':
+                            $braceCount--;
+                            goto SCANNER_CLASS_BODY_CONTINUE;
+                    }
+            }
+
+            SCANNER_CLASS_BODY_CONTINUE:
+
+            if ($braceCount === 0 || $MACRO_TOKEN_ADVANCE() === false) {
+                goto SCANNER_CONTINUE;
+            }
+            goto SCANNER_CLASS_BODY_TOP;
+
+            SCANNER_CLASS_BODY_END:
+
+            goto SCANNER_CONTINUE;
+        }
+
+        SCANNER_CONTINUE:
+
+        if ($tokenContent === '}') {
+            $this->lineEnd = $tokenLine;
+        }
+
+        if ($MACRO_TOKEN_ADVANCE() === false) {
+            goto SCANNER_END;
+        }
+        goto SCANNER_TOP;
+
+        SCANNER_END:
+
+        // process short names
+        if ($this->nameInformation) {
+            if ($this->shortParentClass) {
+                $this->parentClass = $this->nameInformation->resolveName($this->shortParentClass);
+            }
+            if ($this->shortInterfaces) {
+                foreach ($this->shortInterfaces as $siIndex => $si) {
+                    $this->interfaces[$siIndex] = $this->nameInformation->resolveName($si);
+                }
+            }
+        } else {
+            $this->parentClass = $this->shortParentClass;
+            $this->interfaces  = $this->shortInterfaces;
+        }
+
+        $this->isScanned = true;
+
+        return;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/ConstantScanner.php
@@ -0,0 +1,236 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+use Zend\Code\Annotation;
+use Zend\Code\Exception;
+use Zend\Code\NameInformation;
+
+class ConstantScanner implements ScannerInterface
+{
+    /**
+     * @var bool
+     */
+    protected $isScanned = false;
+
+    /**
+     * @var array
+     */
+    protected $tokens;
+
+    /**
+     * @var NameInformation
+     */
+    protected $nameInformation;
+
+    /**
+     * @var string
+     */
+    protected $class;
+
+    /**
+     * @var ClassScanner
+     */
+    protected $scannerClass;
+
+    /**
+     * @var int
+     */
+    protected $lineStart;
+
+    /**
+     * @var string
+     */
+    protected $docComment;
+
+    /**
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * @var string
+     */
+    protected $value;
+
+    /**
+     * Constructor
+     *
+     * @param array $constantTokens
+     * @param NameInformation $nameInformation
+     */
+    public function __construct(array $constantTokens, NameInformation $nameInformation = null)
+    {
+        $this->tokens = $constantTokens;
+        $this->nameInformation = $nameInformation;
+    }
+
+    /**
+     * @param string $class
+     */
+    public function setClass($class)
+    {
+        $this->class = $class;
+    }
+
+    /**
+     * @param ClassScanner $scannerClass
+     */
+    public function setScannerClass(ClassScanner $scannerClass)
+    {
+        $this->scannerClass = $scannerClass;
+    }
+
+    /**
+     * @return ClassScanner
+     */
+    public function getClassScanner()
+    {
+        return $this->scannerClass;
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        $this->scan();
+        return $this->name;
+    }
+
+    /**
+     * @return string
+     */
+    public function getValue()
+    {
+        $this->scan();
+        return $this->value;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDocComment()
+    {
+        $this->scan();
+        return $this->docComment;
+    }
+
+    /**
+     * @param Annotation\AnnotationManager $annotationManager
+     * @return AnnotationScanner
+     */
+    public function getAnnotations(Annotation\AnnotationManager $annotationManager)
+    {
+        if (($docComment = $this->getDocComment()) == '') {
+            return false;
+        }
+
+        return new AnnotationScanner($annotationManager, $docComment, $this->nameInformation);
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        $this->scan();
+        return var_export($this, true);
+    }
+
+    /**
+     * Scan tokens
+     *
+     * @throws Exception\RuntimeException
+     */
+    protected function scan()
+    {
+        if ($this->isScanned) {
+            return;
+        }
+
+        if (!$this->tokens) {
+            throw new Exception\RuntimeException('No tokens were provided');
+        }
+
+        /**
+         * Variables & Setup
+         */
+        $tokens = &$this->tokens;
+
+        reset($tokens);
+
+        SCANNER_TOP:
+
+        $token = current($tokens);
+
+        if (!is_string($token)) {
+            list($tokenType, $tokenContent, $tokenLine) = $token;
+
+            switch ($tokenType) {
+                case T_DOC_COMMENT:
+                    if ($this->docComment === null && $this->name === null) {
+                        $this->docComment = $tokenContent;
+                    }
+                    goto SCANNER_CONTINUE;
+                    // fall-through
+
+                case T_STRING:
+                    $string = (is_string($token)) ? $token : $tokenContent;
+
+                    if (null === $this->name) {
+                        $this->name = $string;
+                    } else {
+                        if ('self' == strtolower($string)) {
+                            list($tokenNextType, $tokenNextContent, $tokenNextLine) = next($tokens);
+
+                            if ('::' == $tokenNextContent) {
+                                list($tokenNextType, $tokenNextContent, $tokenNextLine) = next($tokens);
+
+                                if ($this->getClassScanner()->getConstant($tokenNextContent)) {
+                                    $this->value = $this->getClassScanner()->getConstant($tokenNextContent)->getValue();
+                                }
+                            }
+                        }
+                    }
+
+                    goto SCANNER_CONTINUE;
+                    // fall-through
+
+                case T_CONSTANT_ENCAPSED_STRING:
+                case T_DNUMBER:
+                case T_LNUMBER:
+                    $string = (is_string($token)) ? $token : $tokenContent;
+
+                    if (substr($string, 0, 1) === '"' || substr($string, 0, 1) === "'") {
+                        $this->value = substr($string, 1, -1); // Remove quotes
+                    } else {
+                        $this->value = $string;
+                    }
+                    goto SCANNER_CONTINUE;
+                    // fall-trough
+
+                default:
+                    goto SCANNER_CONTINUE;
+            }
+        }
+
+        SCANNER_CONTINUE:
+
+        if (next($this->tokens) === false) {
+            goto SCANNER_END;
+        }
+        goto SCANNER_TOP;
+
+        SCANNER_END:
+
+        $this->isScanned = true;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/DerivedClassScanner.php
@@ -0,0 +1,381 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+use Zend\Code\Exception;
+
+class DerivedClassScanner extends ClassScanner
+{
+    /**
+     * @var DirectoryScanner
+     */
+    protected $directoryScanner = null;
+
+    /**
+     * @var ClassScanner
+     */
+    protected $classScanner = null;
+
+    /**
+     * @var array
+     */
+    protected $parentClassScanners = array();
+
+    /**
+     * @var array
+     */
+    protected $interfaceClassScanners = array();
+
+    /**
+     * @param ClassScanner $classScanner
+     * @param DirectoryScanner $directoryScanner
+     */
+    public function __construct(ClassScanner $classScanner, DirectoryScanner $directoryScanner)
+    {
+        $this->classScanner     = $classScanner;
+        $this->directoryScanner = $directoryScanner;
+
+        $currentScannerClass = $classScanner;
+
+        while ($currentScannerClass && $currentScannerClass->hasParentClass()) {
+            $currentParentClassName = $currentScannerClass->getParentClass();
+            if ($directoryScanner->hasClass($currentParentClassName)) {
+                $currentParentClass                                 = $directoryScanner->getClass($currentParentClassName);
+                $this->parentClassScanners[$currentParentClassName] = $currentParentClass;
+                $currentScannerClass                                = $currentParentClass;
+            } else {
+                $currentScannerClass = false;
+            }
+        }
+
+        foreach ($interfaces = $this->classScanner->getInterfaces() as $iName) {
+            if ($directoryScanner->hasClass($iName)) {
+                $this->interfaceClassScanners[$iName] = $directoryScanner->getClass($iName);
+            }
+        }
+    }
+
+    /**
+     * @return null|string
+     */
+    public function getName()
+    {
+        return $this->classScanner->getName();
+    }
+
+    /**
+     * @return null|string
+     */
+    public function getShortName()
+    {
+        return $this->classScanner->getShortName();
+    }
+
+    /**
+     * @return bool
+     */
+    public function isInstantiable()
+    {
+        return $this->classScanner->isInstantiable();
+    }
+
+    /**
+     * @return bool
+     */
+    public function isFinal()
+    {
+        return $this->classScanner->isFinal();
+    }
+
+    /**
+     * @return bool
+     */
+    public function isAbstract()
+    {
+        return $this->classScanner->isAbstract();
+    }
+
+    /**
+     * @return bool
+     */
+    public function isInterface()
+    {
+        return $this->classScanner->isInterface();
+    }
+
+    /**
+     * @return array
+     */
+    public function getParentClasses()
+    {
+        return array_keys($this->parentClassScanners);
+    }
+
+    /**
+     * @return bool
+     */
+    public function hasParentClass()
+    {
+        return ($this->classScanner->getParentClass() !== null);
+    }
+
+    /**
+     * @return null|string
+     */
+    public function getParentClass()
+    {
+        return $this->classScanner->getParentClass();
+    }
+
+    /**
+     * @param  bool $returnClassScanners
+     * @return array
+     */
+    public function getInterfaces($returnClassScanners = false)
+    {
+        if ($returnClassScanners) {
+            return $this->interfaceClassScanners;
+        }
+
+        $interfaces = $this->classScanner->getInterfaces();
+        foreach ($this->parentClassScanners as $pClassScanner) {
+            $interfaces = array_merge($interfaces, $pClassScanner->getInterfaces());
+        }
+
+        return $interfaces;
+    }
+
+    /**
+     * Return a list of constant names
+     *
+     * @return array
+     */
+    public function getConstantNames()
+    {
+        $constants = $this->classScanner->getConstantNames();
+        foreach ($this->parentClassScanners as $pClassScanner) {
+            $constants = array_merge($constants, $pClassScanner->getConstantNames());
+        }
+
+        return $constants;
+    }
+
+    /**
+     * Return a list of constants
+     *
+     * @param  bool $namesOnly Set false to return instances of ConstantScanner
+     * @return array|ConstantScanner[]
+     */
+    public function getConstants($namesOnly = true)
+    {
+        if (true === $namesOnly) {
+            trigger_error('Use method getConstantNames() instead', E_USER_DEPRECATED);
+            return $this->getConstantNames();
+        }
+
+        $constants = $this->classScanner->getConstants();
+        foreach ($this->parentClassScanners as $pClassScanner) {
+            $constants = array_merge($constants, $pClassScanner->getConstants($namesOnly));
+        }
+
+        return $constants;
+    }
+
+    /**
+     * Return a single constant by given name or index of info
+     *
+     * @param  string|int $constantNameOrInfoIndex
+     * @throws Exception\InvalidArgumentException
+     * @return bool|ConstantScanner
+     */
+    public function getConstant($constantNameOrInfoIndex)
+    {
+        if ($this->classScanner->hasConstant($constantNameOrInfoIndex)) {
+            return $this->classScanner->getConstant($constantNameOrInfoIndex);
+        }
+
+        foreach ($this->parentClassScanners as $pClassScanner) {
+            if ($pClassScanner->hasConstant($constantNameOrInfoIndex)) {
+                return $pClassScanner->getConstant($constantNameOrInfoIndex);
+            }
+        }
+
+        throw new Exception\InvalidArgumentException(sprintf(
+            'Constant %s not found in %s',
+            $constantNameOrInfoIndex,
+            $this->classScanner->getName()
+        ));
+    }
+
+    /**
+     * Verify if class or parent class has constant
+     *
+     * @param  string $name
+     * @return bool
+     */
+    public function hasConstant($name)
+    {
+        if ($this->classScanner->hasConstant($name)) {
+            return true;
+        }
+        foreach ($this->parentClassScanners as $pClassScanner) {
+            if ($pClassScanner->hasConstant($name)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Return a list of property names
+     *
+     * @return array
+     */
+    public function getPropertyNames()
+    {
+        $properties = $this->classScanner->getPropertyNames();
+        foreach ($this->parentClassScanners as $pClassScanner) {
+            $properties = array_merge($properties, $pClassScanner->getPropertyNames());
+        }
+
+        return $properties;
+    }
+
+    /**
+     * @param  bool $returnScannerProperty
+     * @return array
+     */
+    public function getProperties($returnScannerProperty = false)
+    {
+        $properties = $this->classScanner->getProperties($returnScannerProperty);
+        foreach ($this->parentClassScanners as $pClassScanner) {
+            $properties = array_merge($properties, $pClassScanner->getProperties($returnScannerProperty));
+        }
+
+        return $properties;
+    }
+
+    /**
+     * Return a single property by given name or index of info
+     *
+     * @param  string|int $propertyNameOrInfoIndex
+     * @throws Exception\InvalidArgumentException
+     * @return bool|PropertyScanner
+     */
+    public function getProperty($propertyNameOrInfoIndex)
+    {
+        if ($this->classScanner->hasProperty($propertyNameOrInfoIndex)) {
+            return $this->classScanner->getProperty($propertyNameOrInfoIndex);
+        }
+
+        foreach ($this->parentClassScanners as $pClassScanner) {
+            if ($pClassScanner->hasProperty($propertyNameOrInfoIndex)) {
+                return $pClassScanner->getProperty($propertyNameOrInfoIndex);
+            }
+        }
+
+        throw new Exception\InvalidArgumentException(sprintf(
+            'Property %s not found in %s',
+            $propertyNameOrInfoIndex,
+            $this->classScanner->getName()
+        ));
+    }
+
+    /**
+     * Verify if class or parent class has property
+     *
+     * @param  string $name
+     * @return bool
+     */
+    public function hasProperty($name)
+    {
+        if ($this->classScanner->hasProperty($name)) {
+            return true;
+        }
+        foreach ($this->parentClassScanners as $pClassScanner) {
+            if ($pClassScanner->hasProperty($name)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * @return array
+     */
+    public function getMethodNames()
+    {
+        $methods = $this->classScanner->getMethodNames();
+        foreach ($this->parentClassScanners as $pClassScanner) {
+            $methods = array_merge($methods, $pClassScanner->getMethodNames());
+        }
+
+        return $methods;
+    }
+
+    /**
+     * @return MethodScanner[]
+     */
+    public function getMethods()
+    {
+        $methods = $this->classScanner->getMethods();
+        foreach ($this->parentClassScanners as $pClassScanner) {
+            $methods = array_merge($methods, $pClassScanner->getMethods());
+        }
+
+        return $methods;
+    }
+
+    /**
+     * @param  int|string $methodNameOrInfoIndex
+     * @return MethodScanner
+     * @throws Exception\InvalidArgumentException
+     */
+    public function getMethod($methodNameOrInfoIndex)
+    {
+        if ($this->classScanner->hasMethod($methodNameOrInfoIndex)) {
+            return $this->classScanner->getMethod($methodNameOrInfoIndex);
+        }
+
+        foreach ($this->parentClassScanners as $pClassScanner) {
+            if ($pClassScanner->hasMethod($methodNameOrInfoIndex)) {
+                return $pClassScanner->getMethod($methodNameOrInfoIndex);
+            }
+        }
+
+        throw new Exception\InvalidArgumentException(sprintf(
+            'Method %s not found in %s',
+            $methodNameOrInfoIndex,
+            $this->classScanner->getName()
+        ));
+    }
+
+    /**
+     * Verify if class or parent class has method by given name
+     *
+     * @param  string $name
+     * @return bool
+     */
+    public function hasMethod($name)
+    {
+        if ($this->classScanner->hasMethod($name)) {
+            return true;
+        }
+        foreach ($this->parentClassScanners as $pClassScanner) {
+            if ($pClassScanner->hasMethod($name)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/DirectoryScanner.php
@@ -0,0 +1,272 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+use RecursiveDirectoryIterator;
+use RecursiveIteratorIterator;
+use Zend\Code\Exception;
+
+class DirectoryScanner implements ScannerInterface
+{
+    /**
+     * @var bool
+     */
+    protected $isScanned = false;
+
+    /**
+     * @var string[]|DirectoryScanner[]
+     */
+    protected $directories = array();
+
+    /**
+     * @var FileScanner[]
+     */
+    protected $fileScanners = array();
+
+    /**
+     * @var array
+     */
+    protected $classToFileScanner = null;
+
+    /**
+     * @param null|string|array $directory
+     */
+    public function __construct($directory = null)
+    {
+        if ($directory) {
+            if (is_string($directory)) {
+                $this->addDirectory($directory);
+            } elseif (is_array($directory)) {
+                foreach ($directory as $d) {
+                    $this->addDirectory($d);
+                }
+            }
+        }
+    }
+
+    /**
+     * @param  DirectoryScanner|string $directory
+     * @return void
+     * @throws Exception\InvalidArgumentException
+     */
+    public function addDirectory($directory)
+    {
+        if ($directory instanceof DirectoryScanner) {
+            $this->directories[] = $directory;
+        } elseif (is_string($directory)) {
+            $realDir = realpath($directory);
+            if (!$realDir || !is_dir($realDir)) {
+                throw new Exception\InvalidArgumentException(sprintf(
+                    'Directory "%s" does not exist',
+                    $realDir
+                ));
+            }
+            $this->directories[] = $realDir;
+        } else {
+            throw new Exception\InvalidArgumentException(
+                'The argument provided was neither a DirectoryScanner or directory path'
+            );
+        }
+    }
+
+    /**
+     * @param  DirectoryScanner $directoryScanner
+     * @return void
+     */
+    public function addDirectoryScanner(DirectoryScanner $directoryScanner)
+    {
+        $this->addDirectory($directoryScanner);
+    }
+
+    /**
+     * @param  FileScanner $fileScanner
+     * @return void
+     */
+    public function addFileScanner(FileScanner $fileScanner)
+    {
+        $this->fileScanners[] = $fileScanner;
+    }
+
+    /**
+     * @return void
+     */
+    protected function scan()
+    {
+        if ($this->isScanned) {
+            return;
+        }
+
+        // iterate directories creating file scanners
+        foreach ($this->directories as $directory) {
+            if ($directory instanceof DirectoryScanner) {
+                $directory->scan();
+                if ($directory->fileScanners) {
+                    $this->fileScanners = array_merge($this->fileScanners, $directory->fileScanners);
+                }
+            } else {
+                $rdi = new RecursiveDirectoryIterator($directory);
+                foreach (new RecursiveIteratorIterator($rdi) as $item) {
+                    if ($item->isFile() && pathinfo($item->getRealPath(), PATHINFO_EXTENSION) == 'php') {
+                        $this->fileScanners[] = new FileScanner($item->getRealPath());
+                    }
+                }
+            }
+        }
+
+        $this->isScanned = true;
+    }
+
+    /**
+     * @todo implement method
+     */
+    public function getNamespaces()
+    {
+        // @todo
+    }
+
+    /**
+     * @param  bool $returnFileScanners
+     * @return array
+     */
+    public function getFiles($returnFileScanners = false)
+    {
+        $this->scan();
+
+        $return = array();
+        foreach ($this->fileScanners as $fileScanner) {
+            $return[] = ($returnFileScanners) ? $fileScanner : $fileScanner->getFile();
+        }
+
+        return $return;
+    }
+
+    /**
+     * @return array
+     */
+    public function getClassNames()
+    {
+        $this->scan();
+
+        if ($this->classToFileScanner === null) {
+            $this->createClassToFileScannerCache();
+        }
+
+        return array_keys($this->classToFileScanner);
+    }
+
+    /**
+     * @param  bool  $returnDerivedScannerClass
+     * @return array
+     */
+    public function getClasses($returnDerivedScannerClass = false)
+    {
+        $this->scan();
+
+        if ($this->classToFileScanner === null) {
+            $this->createClassToFileScannerCache();
+        }
+
+        $returnClasses = array();
+        foreach ($this->classToFileScanner as $className => $fsIndex) {
+            $classScanner = $this->fileScanners[$fsIndex]->getClass($className);
+            if ($returnDerivedScannerClass) {
+                $classScanner = new DerivedClassScanner($classScanner, $this);
+            }
+            $returnClasses[] = $classScanner;
+        }
+
+        return $returnClasses;
+    }
+
+    /**
+     * @param  string $class
+     * @return bool
+     */
+    public function hasClass($class)
+    {
+        $this->scan();
+
+        if ($this->classToFileScanner === null) {
+            $this->createClassToFileScannerCache();
+        }
+
+        return (isset($this->classToFileScanner[$class]));
+    }
+
+    /**
+     * @param  string $class
+     * @param  bool $returnDerivedScannerClass
+     * @return ClassScanner|DerivedClassScanner
+     * @throws Exception\InvalidArgumentException
+     */
+    public function getClass($class, $returnDerivedScannerClass = false)
+    {
+        $this->scan();
+
+        if ($this->classToFileScanner === null) {
+            $this->createClassToFileScannerCache();
+        }
+
+        if (!isset($this->classToFileScanner[$class])) {
+            throw new Exception\InvalidArgumentException('Class not found.');
+        }
+
+        /** @var FileScanner $fs */
+        $fs          = $this->fileScanners[$this->classToFileScanner[$class]];
+        $returnClass = $fs->getClass($class);
+
+        if (($returnClass instanceof ClassScanner) && $returnDerivedScannerClass) {
+            return new DerivedClassScanner($returnClass, $this);
+        }
+
+        return $returnClass;
+    }
+
+    /**
+     * Create class to file scanner cache
+     *
+     * @return void
+     */
+    protected function createClassToFileScannerCache()
+    {
+        if ($this->classToFileScanner !== null) {
+            return;
+        }
+
+        $this->classToFileScanner = array();
+        /** @var FileScanner $fileScanner */
+        foreach ($this->fileScanners as $fsIndex => $fileScanner) {
+            $fsClasses = $fileScanner->getClassNames();
+            foreach ($fsClasses as $fsClassName) {
+                $this->classToFileScanner[$fsClassName] = $fsIndex;
+            }
+        }
+    }
+
+    /**
+     * Export
+     *
+     * @todo implement method
+     */
+    public static function export()
+    {
+        // @todo
+    }
+
+    /**
+     * __ToString
+     *
+     * @todo implement method
+     */
+    public function __toString()
+    {
+        // @todo
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/DocBlockScanner.php
@@ -0,0 +1,326 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+use Zend\Code\Annotation\AnnotationManager;
+use Zend\Code\NameInformation;
+
+class DocBlockScanner implements ScannerInterface
+{
+    /**
+     * @var bool
+     */
+    protected $isScanned = false;
+
+    /**
+     * @var string
+     */
+    protected $docComment = null;
+
+    /**
+     * @var NameInformation
+     */
+    protected $nameInformation = null;
+
+    /**
+     * @var AnnotationManager
+     */
+    protected $annotationManager = null;
+
+    /**
+     * @var string
+     */
+    protected $shortDescription = null;
+
+    /**
+     * @var string
+     */
+    protected $longDescription = '';
+
+    /**
+     * @var array
+     */
+    protected $tags = array();
+
+    /**
+     * @var array
+     */
+    protected $annotations = array();
+
+    /**
+     * @param  string $docComment
+     * @param null|NameInformation $nameInformation
+     */
+    public function __construct($docComment, NameInformation $nameInformation = null)
+    {
+        $this->docComment      = $docComment;
+        $this->nameInformation = $nameInformation;
+    }
+
+    /**
+     * @return string
+     */
+    public function getShortDescription()
+    {
+        $this->scan();
+
+        return $this->shortDescription;
+    }
+
+    /**
+     * @return string
+     */
+    public function getLongDescription()
+    {
+        $this->scan();
+
+        return $this->longDescription;
+    }
+
+    /**
+     * @return array
+     */
+    public function getTags()
+    {
+        $this->scan();
+
+        return $this->tags;
+    }
+
+    /**
+     * @return array
+     */
+    public function getAnnotations()
+    {
+        $this->scan();
+
+        return $this->annotations;
+    }
+
+    /**
+     * @return void
+     */
+    protected function scan()
+    {
+        if ($this->isScanned) {
+            return;
+        }
+
+        $mode = 1;
+
+        $tokens   = $this->tokenize();
+        $tagIndex = null;
+        reset($tokens);
+
+        SCANNER_TOP:
+        $token = current($tokens);
+
+        switch ($token[0]) {
+            case 'DOCBLOCK_NEWLINE':
+                if ($this->shortDescription != '' && $tagIndex === null) {
+                    $mode = 2;
+                } else {
+                    $this->longDescription .= $token[1];
+                }
+                goto SCANNER_CONTINUE;
+                //goto no break needed
+
+            case 'DOCBLOCK_WHITESPACE':
+            case 'DOCBLOCK_TEXT':
+                if ($tagIndex !== null) {
+                    $this->tags[$tagIndex]['value'] .= ($this->tags[$tagIndex]['value'] == '') ? $token[1] : ' ' . $token[1];
+                    goto SCANNER_CONTINUE;
+                } elseif ($mode <= 2) {
+                    if ($mode == 1) {
+                        $this->shortDescription .= $token[1];
+                    } else {
+                        $this->longDescription .= $token[1];
+                    }
+                    goto SCANNER_CONTINUE;
+                }
+                //gotos no break needed
+            case 'DOCBLOCK_TAG':
+                array_push($this->tags, array('name'  => $token[1],
+                                              'value' => ''));
+                end($this->tags);
+                $tagIndex = key($this->tags);
+                $mode     = 3;
+                goto SCANNER_CONTINUE;
+                //goto no break needed
+
+            case 'DOCBLOCK_COMMENTEND':
+                goto SCANNER_END;
+
+        }
+
+        SCANNER_CONTINUE:
+        if (next($tokens) === false) {
+            goto SCANNER_END;
+        }
+        goto SCANNER_TOP;
+
+        SCANNER_END:
+
+        $this->shortDescription = trim($this->shortDescription);
+        $this->longDescription  = trim($this->longDescription);
+        $this->isScanned        = true;
+    }
+
+    /**
+     * @return array
+     */
+    protected function tokenize()
+    {
+        static $CONTEXT_INSIDE_DOCBLOCK = 0x01;
+        static $CONTEXT_INSIDE_ASTERISK = 0x02;
+
+        $context     = 0x00;
+        $stream      = $this->docComment;
+        $streamIndex = null;
+        $tokens      = array();
+        $tokenIndex  = null;
+        $currentChar = null;
+        $currentWord = null;
+        $currentLine = null;
+
+        $MACRO_STREAM_ADVANCE_CHAR       = function ($positionsForward = 1) use (&$stream, &$streamIndex, &$currentChar, &$currentWord, &$currentLine) {
+            $positionsForward = ($positionsForward > 0) ? $positionsForward : 1;
+            $streamIndex      = ($streamIndex === null) ? 0 : $streamIndex + $positionsForward;
+            if (!isset($stream[$streamIndex])) {
+                $currentChar = false;
+
+                return false;
+            }
+            $currentChar = $stream[$streamIndex];
+            $matches     = array();
+            $currentLine = (preg_match('#(.*?)\r?\n#', $stream, $matches, null, $streamIndex) === 1) ? $matches[1] : substr($stream, $streamIndex);
+            if ($currentChar === ' ') {
+                $currentWord = (preg_match('#( +)#', $currentLine, $matches) === 1) ? $matches[1] : $currentLine;
+            } else {
+                $currentWord = (($matches = strpos($currentLine, ' ')) !== false) ? substr($currentLine, 0, $matches) : $currentLine;
+            }
+
+            return $currentChar;
+        };
+        $MACRO_STREAM_ADVANCE_WORD       = function () use (&$currentWord, &$MACRO_STREAM_ADVANCE_CHAR) {
+            return $MACRO_STREAM_ADVANCE_CHAR(strlen($currentWord));
+        };
+        $MACRO_STREAM_ADVANCE_LINE       = function () use (&$currentLine, &$MACRO_STREAM_ADVANCE_CHAR) {
+            return $MACRO_STREAM_ADVANCE_CHAR(strlen($currentLine));
+        };
+        $MACRO_TOKEN_ADVANCE             = function () use (&$tokenIndex, &$tokens) {
+            $tokenIndex          = ($tokenIndex === null) ? 0 : $tokenIndex + 1;
+            $tokens[$tokenIndex] = array('DOCBLOCK_UNKNOWN', '');
+        };
+        $MACRO_TOKEN_SET_TYPE            = function ($type) use (&$tokenIndex, &$tokens) {
+            $tokens[$tokenIndex][0] = $type;
+        };
+        $MACRO_TOKEN_APPEND_CHAR         = function () use (&$currentChar, &$tokens, &$tokenIndex) {
+            $tokens[$tokenIndex][1] .= $currentChar;
+        };
+        $MACRO_TOKEN_APPEND_WORD         = function () use (&$currentWord, &$tokens, &$tokenIndex) {
+            $tokens[$tokenIndex][1] .= $currentWord;
+        };
+        $MACRO_TOKEN_APPEND_WORD_PARTIAL = function ($length) use (&$currentWord, &$tokens, &$tokenIndex) {
+            $tokens[$tokenIndex][1] .= substr($currentWord, 0, $length);
+        };
+        $MACRO_TOKEN_APPEND_LINE         = function () use (&$currentLine, &$tokens, &$tokenIndex) {
+            $tokens[$tokenIndex][1] .= $currentLine;
+        };
+
+        $MACRO_STREAM_ADVANCE_CHAR();
+        $MACRO_TOKEN_ADVANCE();
+
+        TOKENIZER_TOP:
+
+        if ($context === 0x00 && $currentChar === '/' && $currentWord === '/**') {
+            $MACRO_TOKEN_SET_TYPE('DOCBLOCK_COMMENTSTART');
+            $MACRO_TOKEN_APPEND_WORD();
+            $MACRO_TOKEN_ADVANCE();
+            $context |= $CONTEXT_INSIDE_DOCBLOCK;
+            $context |= $CONTEXT_INSIDE_ASTERISK;
+            if ($MACRO_STREAM_ADVANCE_WORD() === false) {
+                goto TOKENIZER_END;
+            }
+            goto TOKENIZER_TOP;
+        }
+
+        if ($context & $CONTEXT_INSIDE_DOCBLOCK && $currentWord === '*/') {
+            $MACRO_TOKEN_SET_TYPE('DOCBLOCK_COMMENTEND');
+            $MACRO_TOKEN_APPEND_WORD();
+            $MACRO_TOKEN_ADVANCE();
+            $context &= ~$CONTEXT_INSIDE_DOCBLOCK;
+            if ($MACRO_STREAM_ADVANCE_WORD() === false) {
+                goto TOKENIZER_END;
+            }
+            goto TOKENIZER_TOP;
+        }
+
+        if ($currentChar === ' ' || $currentChar === "\t") {
+            $MACRO_TOKEN_SET_TYPE(($context & $CONTEXT_INSIDE_ASTERISK) ? 'DOCBLOCK_WHITESPACE' : 'DOCBLOCK_WHITESPACE_INDENT');
+            $MACRO_TOKEN_APPEND_WORD();
+            $MACRO_TOKEN_ADVANCE();
+            if ($MACRO_STREAM_ADVANCE_WORD() === false) {
+                goto TOKENIZER_END;
+            }
+            goto TOKENIZER_TOP;
+        }
+
+        if ($currentChar === '*') {
+            if (($context & $CONTEXT_INSIDE_DOCBLOCK) && ($context & $CONTEXT_INSIDE_ASTERISK)) {
+                $MACRO_TOKEN_SET_TYPE('DOCBLOCK_TEXT');
+            } else {
+                $MACRO_TOKEN_SET_TYPE('DOCBLOCK_ASTERISK');
+                $context |= $CONTEXT_INSIDE_ASTERISK;
+            }
+            $MACRO_TOKEN_APPEND_CHAR();
+            $MACRO_TOKEN_ADVANCE();
+            if ($MACRO_STREAM_ADVANCE_CHAR() === false) {
+                goto TOKENIZER_END;
+            }
+            goto TOKENIZER_TOP;
+        }
+
+        if ($currentChar === '@') {
+            $MACRO_TOKEN_SET_TYPE('DOCBLOCK_TAG');
+            $MACRO_TOKEN_APPEND_WORD();
+            $MACRO_TOKEN_ADVANCE();
+            if ($MACRO_STREAM_ADVANCE_WORD() === false) {
+                goto TOKENIZER_END;
+            }
+            goto TOKENIZER_TOP;
+        }
+
+        if ($currentChar === "\n") {
+            $MACRO_TOKEN_SET_TYPE('DOCBLOCK_NEWLINE');
+            $MACRO_TOKEN_APPEND_CHAR();
+            $MACRO_TOKEN_ADVANCE();
+            $context &= ~$CONTEXT_INSIDE_ASTERISK;
+            if ($MACRO_STREAM_ADVANCE_CHAR() === false) {
+                goto TOKENIZER_END;
+            }
+            goto TOKENIZER_TOP;
+        }
+
+        $MACRO_TOKEN_SET_TYPE('DOCBLOCK_TEXT');
+        $MACRO_TOKEN_APPEND_LINE();
+        $MACRO_TOKEN_ADVANCE();
+        if ($MACRO_STREAM_ADVANCE_LINE() === false) {
+            goto TOKENIZER_END;
+        }
+        goto TOKENIZER_TOP;
+
+        TOKENIZER_END:
+
+        array_pop($tokens);
+
+        return $tokens;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/FileScanner.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+use Zend\Code\Annotation\AnnotationManager;
+use Zend\Code\Exception;
+
+class FileScanner extends TokenArrayScanner implements ScannerInterface
+{
+    /**
+     * @var string
+     */
+    protected $file = null;
+
+    /**
+     * @param  string $file
+     * @param  null|AnnotationManager $annotationManager
+     * @throws Exception\InvalidArgumentException
+     */
+    public function __construct($file, AnnotationManager $annotationManager = null)
+    {
+        $this->file = $file;
+        if (!file_exists($file)) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                'File "%s" not found',
+                $file
+            ));
+        }
+        parent::__construct(token_get_all(file_get_contents($file)), $annotationManager);
+    }
+
+    /**
+     * @return string
+     */
+    public function getFile()
+    {
+        return $this->file;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/FunctionScanner.php
@@ -0,0 +1,16 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+class FunctionScanner
+{
+    // @todo
+    // Should this extend something similar to MethodScanner? Similar to ReflectionFunctionAbstract
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/MethodScanner.php
@@ -0,0 +1,607 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+use Zend\Code\Annotation\AnnotationManager;
+use Zend\Code\Exception;
+use Zend\Code\NameInformation;
+
+class MethodScanner implements ScannerInterface
+{
+    /**
+     * @var bool
+     */
+    protected $isScanned    = false;
+
+    /**
+     * @var string
+     */
+    protected $docComment   = null;
+
+    /**
+     * @var ClassScanner
+     */
+    protected $scannerClass = null;
+
+    /**
+     * @var string
+     */
+    protected $class        = null;
+
+    /**
+     * @var string
+     */
+    protected $name         = null;
+
+    /**
+     * @var int
+     */
+    protected $lineStart    = null;
+
+    /**
+     * @var int
+     */
+    protected $lineEnd      = null;
+
+    /**
+     * @var bool
+     */
+    protected $isFinal = false;
+
+    /**
+     * @var bool
+     */
+    protected $isAbstract = false;
+
+    /**
+     * @var bool
+     */
+    protected $isPublic = true;
+
+    /**
+     * @var bool
+     */
+    protected $isProtected = false;
+
+    /**
+     * @var bool
+     */
+    protected $isPrivate = false;
+
+    /**
+     * @var bool
+     */
+    protected $isStatic = false;
+
+    /**
+     * @var string
+     */
+    protected $body = '';
+
+    /**
+     * @var array
+     */
+    protected $tokens = array();
+
+    /**
+     * @var NameInformation
+     */
+    protected $nameInformation = null;
+
+    /**
+     * @var array
+     */
+    protected $infos = array();
+
+    /**
+     * @param  array $methodTokens
+     * @param NameInformation $nameInformation
+     */
+    public function __construct(array $methodTokens, NameInformation $nameInformation = null)
+    {
+        $this->tokens          = $methodTokens;
+        $this->nameInformation = $nameInformation;
+    }
+
+    /**
+     * @param  string $class
+     * @return MethodScanner
+     */
+    public function setClass($class)
+    {
+        $this->class = (string) $class;
+        return $this;
+    }
+
+    /**
+     * @param  ClassScanner  $scannerClass
+     * @return MethodScanner
+     */
+    public function setScannerClass(ClassScanner $scannerClass)
+    {
+        $this->scannerClass = $scannerClass;
+        return $this;
+    }
+
+    /**
+     * @return MethodScanner
+     */
+    public function getClassScanner()
+    {
+        return $this->scannerClass;
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        $this->scan();
+
+        return $this->name;
+    }
+
+    /**
+     * @return int
+     */
+    public function getLineStart()
+    {
+        $this->scan();
+
+        return $this->lineStart;
+    }
+
+    /**
+     * @return int
+     */
+    public function getLineEnd()
+    {
+        $this->scan();
+
+        return $this->lineEnd;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDocComment()
+    {
+        $this->scan();
+
+        return $this->docComment;
+    }
+
+    /**
+     * @param  AnnotationManager $annotationManager
+     * @return AnnotationScanner
+     */
+    public function getAnnotations(AnnotationManager $annotationManager)
+    {
+        if (($docComment = $this->getDocComment()) == '') {
+            return false;
+        }
+
+        return new AnnotationScanner($annotationManager, $docComment, $this->nameInformation);
+    }
+
+    /**
+     * @return bool
+     */
+    public function isFinal()
+    {
+        $this->scan();
+
+        return $this->isFinal;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isAbstract()
+    {
+        $this->scan();
+
+        return $this->isAbstract;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isPublic()
+    {
+        $this->scan();
+
+        return $this->isPublic;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isProtected()
+    {
+        $this->scan();
+
+        return $this->isProtected;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isPrivate()
+    {
+        $this->scan();
+
+        return $this->isPrivate;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isStatic()
+    {
+        $this->scan();
+
+        return $this->isStatic;
+    }
+
+    /**
+     * Override the given name for a method, this is necessary to
+     * support traits.
+     *
+     * @param $name
+     * @return self
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+        return $this;
+    }
+
+    /**
+     * Visibility must be of T_PUBLIC, T_PRIVATE or T_PROTECTED
+     * Needed to support traits
+     *
+     * @param $visibility   T_PUBLIC | T_PRIVATE | T_PROTECTED
+     * @return self
+     * @throws \Zend\Code\Exception
+     */
+    public function setVisibility($visibility)
+    {
+        switch (strtolower($visibility)) {
+            case T_PUBLIC:
+                $this->isPublic = true;
+                $this->isPrivate = false;
+                $this->isProtected = false;
+                break;
+
+            case T_PRIVATE:
+                $this->isPublic = false;
+                $this->isPrivate = true;
+                $this->isProtected = false;
+                break;
+
+            case T_PROTECTED:
+                $this->isPublic = false;
+                $this->isPrivate = false;
+                $this->isProtected = true;
+                break;
+
+            default:
+                throw new Exception("Invalid visibility argument passed to setVisibility.");
+        }
+
+        return $this;
+    }
+
+    /**
+     * @return int
+     */
+    public function getNumberOfParameters()
+    {
+        return count($this->getParameters());
+    }
+
+    /**
+     * @param  bool $returnScanner
+     * @return array
+     */
+    public function getParameters($returnScanner = false)
+    {
+        $this->scan();
+
+        $return = array();
+
+        foreach ($this->infos as $info) {
+            if ($info['type'] != 'parameter') {
+                continue;
+            }
+
+            if (!$returnScanner) {
+                $return[] = $info['name'];
+            } else {
+                $return[] = $this->getParameter($info['name']);
+            }
+        }
+
+        return $return;
+    }
+
+    /**
+     * @param  int|string $parameterNameOrInfoIndex
+     * @return ParameterScanner
+     * @throws Exception\InvalidArgumentException
+     */
+    public function getParameter($parameterNameOrInfoIndex)
+    {
+        $this->scan();
+
+        if (is_int($parameterNameOrInfoIndex)) {
+            $info = $this->infos[$parameterNameOrInfoIndex];
+            if ($info['type'] != 'parameter') {
+                throw new Exception\InvalidArgumentException('Index of info offset is not about a parameter');
+            }
+        } elseif (is_string($parameterNameOrInfoIndex)) {
+            foreach ($this->infos as $info) {
+                if ($info['type'] === 'parameter' && $info['name'] === $parameterNameOrInfoIndex) {
+                    break;
+                }
+                unset($info);
+            }
+            if (!isset($info)) {
+                throw new Exception\InvalidArgumentException('Index of info offset is not about a parameter');
+            }
+        }
+
+        $p = new ParameterScanner(
+            array_slice($this->tokens, $info['tokenStart'], $info['tokenEnd'] - $info['tokenStart']),
+            $this->nameInformation
+        );
+        $p->setDeclaringFunction($this->name);
+        $p->setDeclaringScannerFunction($this);
+        $p->setDeclaringClass($this->class);
+        $p->setDeclaringScannerClass($this->scannerClass);
+        $p->setPosition($info['position']);
+
+        return $p;
+    }
+
+    /**
+     * @return string
+     */
+    public function getBody()
+    {
+        $this->scan();
+
+        return $this->body;
+    }
+
+    public static function export()
+    {
+        // @todo
+    }
+
+    public function __toString()
+    {
+        $this->scan();
+
+        return var_export($this, true);
+    }
+
+    protected function scan()
+    {
+        if ($this->isScanned) {
+            return;
+        }
+
+        if (!$this->tokens) {
+            throw new Exception\RuntimeException('No tokens were provided');
+        }
+
+        /**
+         * Variables & Setup
+         */
+
+        $tokens       = &$this->tokens; // localize
+        $infos        = &$this->infos; // localize
+        $tokenIndex   = null;
+        $token        = null;
+        $tokenType    = null;
+        $tokenContent = null;
+        $tokenLine    = null;
+        $infoIndex    = 0;
+        $parentCount  = 0;
+
+        /*
+         * MACRO creation
+         */
+        $MACRO_TOKEN_ADVANCE = function () use (
+            &$tokens,
+            &$tokenIndex,
+            &$token,
+            &$tokenType,
+            &$tokenContent,
+            &$tokenLine
+        ) {
+            static $lastTokenArray = null;
+            $tokenIndex = ($tokenIndex === null) ? 0 : $tokenIndex + 1;
+            if (!isset($tokens[$tokenIndex])) {
+                $token        = false;
+                $tokenContent = false;
+                $tokenType    = false;
+                $tokenLine    = false;
+
+                return false;
+            }
+            $token = $tokens[$tokenIndex];
+            if (is_string($token)) {
+                $tokenType    = null;
+                $tokenContent = $token;
+                $tokenLine    = $tokenLine + substr_count(
+                    $lastTokenArray[1],
+                    "\n"
+                ); // adjust token line by last known newline count
+            } else {
+                list($tokenType, $tokenContent, $tokenLine) = $token;
+            }
+
+            return $tokenIndex;
+        };
+        $MACRO_INFO_START    = function () use (&$infoIndex, &$infos, &$tokenIndex, &$tokenLine) {
+            $infos[$infoIndex] = array(
+                'type'        => 'parameter',
+                'tokenStart'  => $tokenIndex,
+                'tokenEnd'    => null,
+                'lineStart'   => $tokenLine,
+                'lineEnd'     => $tokenLine,
+                'name'        => null,
+                'position'    => $infoIndex + 1, // position is +1 of infoIndex
+            );
+        };
+        $MACRO_INFO_ADVANCE  = function () use (&$infoIndex, &$infos, &$tokenIndex, &$tokenLine) {
+            $infos[$infoIndex]['tokenEnd'] = $tokenIndex;
+            $infos[$infoIndex]['lineEnd']  = $tokenLine;
+            $infoIndex++;
+
+            return $infoIndex;
+        };
+
+        /**
+         * START FINITE STATE MACHINE FOR SCANNING TOKENS
+         */
+
+        // Initialize token
+        $MACRO_TOKEN_ADVANCE();
+
+        SCANNER_TOP:
+
+        $this->lineStart = ($this->lineStart) ? : $tokenLine;
+
+        switch ($tokenType) {
+            case T_DOC_COMMENT:
+                $this->lineStart = null;
+                if ($this->docComment === null && $this->name === null) {
+                    $this->docComment = $tokenContent;
+                }
+                goto SCANNER_CONTINUE_SIGNATURE;
+                //goto (no break needed);
+
+            case T_FINAL:
+                $this->isFinal = true;
+                goto SCANNER_CONTINUE_SIGNATURE;
+                //goto (no break needed);
+
+            case T_ABSTRACT:
+                $this->isAbstract = true;
+                goto SCANNER_CONTINUE_SIGNATURE;
+                //goto (no break needed);
+
+            case T_PUBLIC:
+                // use defaults
+                goto SCANNER_CONTINUE_SIGNATURE;
+                //goto (no break needed);
+
+            case T_PROTECTED:
+                $this->setVisibility(T_PROTECTED);
+                goto SCANNER_CONTINUE_SIGNATURE;
+                //goto (no break needed);
+
+            case T_PRIVATE:
+                $this->setVisibility(T_PRIVATE);
+                goto SCANNER_CONTINUE_SIGNATURE;
+                //goto (no break needed);
+
+            case T_STATIC:
+                $this->isStatic = true;
+                goto SCANNER_CONTINUE_SIGNATURE;
+                //goto (no break needed);
+
+            case T_VARIABLE:
+            case T_STRING:
+
+                if ($tokenType === T_STRING && $parentCount === 0) {
+                    $this->name = $tokenContent;
+                }
+
+                if ($parentCount === 1) {
+                    if (!isset($infos[$infoIndex])) {
+                        $MACRO_INFO_START();
+                    }
+                    if ($tokenType === T_VARIABLE) {
+                        $infos[$infoIndex]['name'] = ltrim($tokenContent, '$');
+                    }
+                }
+
+                goto SCANNER_CONTINUE_SIGNATURE;
+                //goto (no break needed);
+
+            case null:
+
+                switch ($tokenContent) {
+                    case '&':
+                        if (!isset($infos[$infoIndex])) {
+                            $MACRO_INFO_START();
+                        }
+                        goto SCANNER_CONTINUE_SIGNATURE;
+                        //goto (no break needed);
+                    case '(':
+                        $parentCount++;
+                        goto SCANNER_CONTINUE_SIGNATURE;
+                        //goto (no break needed);
+                    case ')':
+                        $parentCount--;
+                        if ($parentCount > 0) {
+                            goto SCANNER_CONTINUE_SIGNATURE;
+                        }
+                        if ($parentCount === 0) {
+                            if ($infos) {
+                                $MACRO_INFO_ADVANCE();
+                            }
+                            $context = 'body';
+                        }
+                        goto SCANNER_CONTINUE_BODY;
+                        //goto (no break needed);
+                    case ',':
+                        if ($parentCount === 1) {
+                            $MACRO_INFO_ADVANCE();
+                        }
+                        goto SCANNER_CONTINUE_SIGNATURE;
+                }
+        }
+
+        SCANNER_CONTINUE_SIGNATURE:
+
+        if ($MACRO_TOKEN_ADVANCE() === false) {
+            goto SCANNER_END;
+        }
+        goto SCANNER_TOP;
+
+        SCANNER_CONTINUE_BODY:
+
+        $braceCount = 0;
+        while ($MACRO_TOKEN_ADVANCE() !== false) {
+            if ($tokenContent == '}') {
+                $braceCount--;
+            }
+            if ($braceCount > 0) {
+                $this->body .= $tokenContent;
+            }
+            if ($tokenContent == '{') {
+                $braceCount++;
+            }
+            $this->lineEnd = $tokenLine;
+        }
+
+        SCANNER_END:
+
+        $this->isScanned = true;
+
+        return;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/ParameterScanner.php
@@ -0,0 +1,352 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+use Zend\Code\NameInformation;
+
+class ParameterScanner
+{
+    /**
+     * @var bool
+     */
+    protected $isScanned = false;
+
+    /**
+     * @var null|ClassScanner
+     */
+    protected $declaringScannerClass = null;
+
+    /**
+     * @var null|string
+     */
+    protected $declaringClass = null;
+
+    /**
+     * @var null|MethodScanner
+     */
+    protected $declaringScannerFunction = null;
+
+    /**
+     * @var null|string
+     */
+    protected $declaringFunction = null;
+
+    /**
+     * @var null|string
+     */
+    protected $defaultValue = null;
+
+    /**
+     * @var null|string
+     */
+    protected $class = null;
+
+    /**
+     * @var null|string
+     */
+    protected $name = null;
+
+    /**
+     * @var null|int
+     */
+    protected $position = null;
+
+    /**
+     * @var bool
+     */
+    protected $isArray = false;
+
+    /**
+     * @var bool
+     */
+    protected $isDefaultValueAvailable = false;
+
+    /**
+     * @var bool
+     */
+    protected $isOptional = false;
+
+    /**
+     * @var bool
+     */
+    protected $isPassedByReference = false;
+
+    /**
+     * @var array|null
+     */
+    protected $tokens = null;
+
+    /**
+     * @var null|NameInformation
+     */
+    protected $nameInformation = null;
+
+    /**
+     * @param  array $parameterTokens
+     * @param  NameInformation $nameInformation
+     */
+    public function __construct(array $parameterTokens, NameInformation $nameInformation = null)
+    {
+        $this->tokens          = $parameterTokens;
+        $this->nameInformation = $nameInformation;
+    }
+
+    /**
+     * Set declaring class
+     *
+     * @param  string $class
+     * @return void
+     */
+    public function setDeclaringClass($class)
+    {
+        $this->declaringClass = (string) $class;
+    }
+
+    /**
+     * Set declaring scanner class
+     *
+     * @param  ClassScanner $scannerClass
+     * @return void
+     */
+    public function setDeclaringScannerClass(ClassScanner $scannerClass)
+    {
+        $this->declaringScannerClass = $scannerClass;
+    }
+
+    /**
+     * Set declaring function
+     *
+     * @param  string $function
+     * @return void
+     */
+    public function setDeclaringFunction($function)
+    {
+        $this->declaringFunction = $function;
+    }
+
+    /**
+     * Set declaring scanner function
+     *
+     * @param  MethodScanner $scannerFunction
+     * @return void
+     */
+    public function setDeclaringScannerFunction(MethodScanner $scannerFunction)
+    {
+        $this->declaringScannerFunction = $scannerFunction;
+    }
+
+    /**
+     * Set position
+     *
+     * @param  int $position
+     * @return void
+     */
+    public function setPosition($position)
+    {
+        $this->position = $position;
+    }
+
+    /**
+     * Scan
+     *
+     * @return void
+     */
+    protected function scan()
+    {
+        if ($this->isScanned) {
+            return;
+        }
+
+        $tokens = &$this->tokens;
+
+        reset($tokens);
+
+        SCANNER_TOP:
+
+        $token = current($tokens);
+
+        if (is_string($token)) {
+            // check pass by ref
+            if ($token === '&') {
+                $this->isPassedByReference = true;
+                goto SCANNER_CONTINUE;
+            }
+            if ($token === '=') {
+                $this->isOptional              = true;
+                $this->isDefaultValueAvailable = true;
+                goto SCANNER_CONTINUE;
+            }
+        } else {
+            if ($this->name === null && ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR)) {
+                $this->class .= $token[1];
+                goto SCANNER_CONTINUE;
+            }
+            if ($token[0] === T_VARIABLE) {
+                $this->name = ltrim($token[1], '$');
+                goto SCANNER_CONTINUE;
+            }
+        }
+
+        if ($this->name !== null) {
+            $this->defaultValue .= trim((is_string($token)) ? $token : $token[1]);
+        }
+
+        SCANNER_CONTINUE:
+
+        if (next($this->tokens) === false) {
+            goto SCANNER_END;
+        }
+        goto SCANNER_TOP;
+
+        SCANNER_END:
+
+        if ($this->class && $this->nameInformation) {
+            $this->class = $this->nameInformation->resolveName($this->class);
+        }
+
+        $this->isScanned = true;
+    }
+
+    /**
+     * Get declaring scanner class
+     *
+     * @return ClassScanner
+     */
+    public function getDeclaringScannerClass()
+    {
+        return $this->declaringScannerClass;
+    }
+
+    /**
+     * Get declaring class
+     *
+     * @return string
+     */
+    public function getDeclaringClass()
+    {
+        return $this->declaringClass;
+    }
+
+    /**
+     * Get declaring scanner function
+     *
+     * @return MethodScanner
+     */
+    public function getDeclaringScannerFunction()
+    {
+        return $this->declaringScannerFunction;
+    }
+
+    /**
+     * Get declaring function
+     *
+     * @return string
+     */
+    public function getDeclaringFunction()
+    {
+        return $this->declaringFunction;
+    }
+
+    /**
+     * Get default value
+     *
+     * @return string
+     */
+    public function getDefaultValue()
+    {
+        $this->scan();
+
+        return $this->defaultValue;
+    }
+
+    /**
+     * Get class
+     *
+     * @return string
+     */
+    public function getClass()
+    {
+        $this->scan();
+
+        return $this->class;
+    }
+
+    /**
+     * Get name
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        $this->scan();
+
+        return $this->name;
+    }
+
+    /**
+     * Get position
+     *
+     * @return int
+     */
+    public function getPosition()
+    {
+        $this->scan();
+
+        return $this->position;
+    }
+
+    /**
+     * Check if is array
+     *
+     * @return bool
+     */
+    public function isArray()
+    {
+        $this->scan();
+
+        return $this->isArray;
+    }
+
+    /**
+     * Check if default value is available
+     *
+     * @return bool
+     */
+    public function isDefaultValueAvailable()
+    {
+        $this->scan();
+
+        return $this->isDefaultValueAvailable;
+    }
+
+    /**
+     * Check if is optional
+     *
+     * @return bool
+     */
+    public function isOptional()
+    {
+        $this->scan();
+
+        return $this->isOptional;
+    }
+
+    /**
+     * Check if is passed by reference
+     *
+     * @return bool
+     */
+    public function isPassedByReference()
+    {
+        $this->scan();
+
+        return $this->isPassedByReference;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/PropertyScanner.php
@@ -0,0 +1,316 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+use Zend\Code\Annotation;
+use Zend\Code\Exception;
+use Zend\Code\NameInformation;
+
+class PropertyScanner implements ScannerInterface
+{
+    const T_BOOLEAN = "boolean";
+    const T_INTEGER = "int";
+    const T_STRING  = "string";
+    const T_ARRAY   = "array";
+    const T_UNKNOWN = "unknown";
+
+    /**
+     * @var bool
+     */
+    protected $isScanned = false;
+
+    /**
+     * @var array
+     */
+    protected $tokens;
+
+    /**
+     * @var NameInformation
+     */
+    protected $nameInformation;
+
+    /**
+     * @var string
+     */
+    protected $class;
+
+    /**
+     * @var ClassScanner
+     */
+    protected $scannerClass;
+
+    /**
+     * @var int
+     */
+    protected $lineStart;
+
+    /**
+     * @var bool
+     */
+    protected $isProtected = false;
+
+    /**
+     * @var bool
+     */
+    protected $isPublic = true;
+
+    /**
+     * @var bool
+     */
+    protected $isPrivate = false;
+
+    /**
+     * @var bool
+     */
+    protected $isStatic = false;
+
+    /**
+     * @var string
+     */
+    protected $docComment;
+
+    /**
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * @var string
+     */
+    protected $value;
+
+    /**
+     * @var string
+     */
+    protected $valueType;
+
+    /**
+     * Constructor
+     *
+     * @param array $propertyTokens
+     * @param NameInformation $nameInformation
+     */
+    public function __construct(array $propertyTokens, NameInformation $nameInformation = null)
+    {
+        $this->tokens = $propertyTokens;
+        $this->nameInformation = $nameInformation;
+    }
+
+    /**
+     * @param string $class
+     */
+    public function setClass($class)
+    {
+        $this->class = $class;
+    }
+
+    /**
+     * @param ClassScanner $scannerClass
+     */
+    public function setScannerClass(ClassScanner $scannerClass)
+    {
+        $this->scannerClass = $scannerClass;
+    }
+
+    /**
+     * @return ClassScanner
+     */
+    public function getClassScanner()
+    {
+        return $this->scannerClass;
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        $this->scan();
+        return $this->name;
+    }
+
+    /**
+     * @return string
+     */
+    public function getValueType()
+    {
+        return $this->valueType;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isPublic()
+    {
+        $this->scan();
+        return $this->isPublic;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isPrivate()
+    {
+        $this->scan();
+        return $this->isPrivate;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isProtected()
+    {
+        $this->scan();
+        return $this->isProtected;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isStatic()
+    {
+        $this->scan();
+        return $this->isStatic;
+    }
+
+    /**
+     * @return string
+     */
+    public function getValue()
+    {
+        $this->scan();
+        return $this->value;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDocComment()
+    {
+        $this->scan();
+        return $this->docComment;
+    }
+
+    /**
+     * @param Annotation\AnnotationManager $annotationManager
+     * @return AnnotationScanner
+     */
+    public function getAnnotations(Annotation\AnnotationManager $annotationManager)
+    {
+        if (($docComment = $this->getDocComment()) == '') {
+            return false;
+        }
+
+        return new AnnotationScanner($annotationManager, $docComment, $this->nameInformation);
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        $this->scan();
+        return var_export($this, true);
+    }
+
+    /**
+     * Scan tokens
+     *
+     * @throws \Zend\Code\Exception\RuntimeException
+     */
+    protected function scan()
+    {
+        if ($this->isScanned) {
+            return;
+        }
+
+        if (!$this->tokens) {
+            throw new Exception\RuntimeException('No tokens were provided');
+        }
+
+        /**
+         * Variables & Setup
+         */
+        $value            = '';
+        $concatenateValue = false;
+
+        $tokens = &$this->tokens;
+        reset($tokens);
+
+        foreach ($tokens as $token) {
+            $tempValue = $token;
+            if (!is_string($token)) {
+                list($tokenType, $tokenContent, $tokenLine) = $token;
+
+                switch ($tokenType) {
+                    case T_DOC_COMMENT:
+                        if ($this->docComment === null && $this->name === null) {
+                            $this->docComment = $tokenContent;
+                        }
+                        break;
+
+                    case T_VARIABLE:
+                        $this->name = ltrim($tokenContent, '$');
+                        break;
+
+                    case T_PUBLIC:
+                        // use defaults
+                        break;
+
+                    case T_PROTECTED:
+                        $this->isProtected = true;
+                        $this->isPublic = false;
+                        break;
+
+                    case T_PRIVATE:
+                        $this->isPrivate = true;
+                        $this->isPublic = false;
+                        break;
+
+                    case T_STATIC:
+                        $this->isStatic = true;
+                        break;
+                    default:
+                        $tempValue = trim($tokenContent);
+                        break;
+                }
+            }
+
+            //end value concatenation
+            if (!is_array($token) && trim($token) == ";") {
+                $concatenateValue = false;
+            }
+
+            if (true === $concatenateValue) {
+                $value .= $tempValue;
+            }
+
+            //start value concatenation
+            if (!is_array($token) && trim($token) == "=") {
+                $concatenateValue = true;
+            }
+        }
+
+        $this->valueType = self::T_UNKNOWN;
+        if ($value == "false" || $value == "true") {
+            $this->valueType = self::T_BOOLEAN;
+        } elseif (is_numeric($value)) {
+            $this->valueType = self::T_INTEGER;
+        } elseif (0 === strpos($value, 'array') || 0 === strpos($value, "[")) {
+            $this->valueType = self::T_ARRAY;
+        } elseif (substr($value, 0, 1) === '"' || substr($value, 0, 1) === "'") {
+            $value = substr($value, 1, -1); // Remove quotes
+            $this->valueType = self::T_STRING;
+        }
+
+        $this->value = empty($value) ? null : $value;
+        $this->isScanned = true;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/ScannerInterface.php
@@ -0,0 +1,16 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+interface ScannerInterface
+{
+    /* public static function export($tokens); */
+    /* public function toString(); */
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/TokenArrayScanner.php
@@ -0,0 +1,689 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+use Zend\Code\Annotation\AnnotationManager;
+use Zend\Code\Exception;
+use Zend\Code\NameInformation;
+
+class TokenArrayScanner implements ScannerInterface
+{
+    /**
+     * @var bool
+     */
+    protected $isScanned = false;
+
+    /**
+     * @var array
+     */
+    protected $tokens = array();
+
+    /**
+     * @var null
+     */
+    protected $docComment = null;
+
+    /**
+     * @var NameInformation
+     */
+    protected $nameInformation = null;
+
+    /**
+     * @var array
+     */
+    protected $infos = array();
+
+    /**
+     * @var AnnotationManager
+     */
+    protected $annotationManager = null;
+
+    /**
+     * @param null|array $tokens
+     * @param null|AnnotationManager $annotationManager
+     */
+    public function __construct($tokens, AnnotationManager $annotationManager = null)
+    {
+        $this->tokens            = $tokens;
+        $this->annotationManager = $annotationManager;
+    }
+
+    /**
+     * @return AnnotationManager
+     */
+    public function getAnnotationManager()
+    {
+        return $this->annotationManager;
+    }
+
+    /**
+     * Get doc comment
+     *
+     * @todo Assignment of $this->docComment should probably be done in scan()
+     *       and then $this->getDocComment() just retrieves it.
+     *
+     * @return string
+     */
+    public function getDocComment()
+    {
+        foreach ($this->tokens as $token) {
+            $type    = $token[0];
+            $value   = $token[1];
+            if (($type == T_OPEN_TAG) || ($type == T_WHITESPACE)) {
+                continue;
+            } elseif ($type == T_DOC_COMMENT) {
+                $this->docComment = $value;
+
+                return $this->docComment;
+            } else {
+                // Only whitespace is allowed before file docblocks
+                return;
+            }
+        }
+    }
+
+    /**
+     * @return array
+     */
+    public function getNamespaces()
+    {
+        $this->scan();
+
+        $namespaces = array();
+        foreach ($this->infos as $info) {
+            if ($info['type'] == 'namespace') {
+                $namespaces[] = $info['namespace'];
+            }
+        }
+
+        return $namespaces;
+    }
+
+    /**
+     * @param  null|string $namespace
+     * @return array|null
+     */
+    public function getUses($namespace = null)
+    {
+        $this->scan();
+
+        return $this->getUsesNoScan($namespace);
+    }
+
+    /**
+     * @return array
+     */
+    public function getIncludes()
+    {
+        $this->scan();
+        // @todo Implement getIncludes() in TokenArrayScanner
+    }
+
+    /**
+     * @return array
+     */
+    public function getClassNames()
+    {
+        $this->scan();
+
+        $return = array();
+        foreach ($this->infos as $info) {
+            if ($info['type'] != 'class') {
+                continue;
+            }
+
+            $return[] = $info['name'];
+        }
+
+        return $return;
+    }
+
+    /**
+     * @return ClassScanner[]
+     */
+    public function getClasses()
+    {
+        $this->scan();
+
+        $return = array();
+        foreach ($this->infos as $info) {
+            if ($info['type'] != 'class') {
+                continue;
+            }
+
+            $return[] = $this->getClass($info['name']);
+        }
+
+        return $return;
+    }
+
+    /**
+     * Return the class object from this scanner
+     *
+     * @param  string|int $name
+     * @throws Exception\InvalidArgumentException
+     * @return ClassScanner
+     */
+    public function getClass($name)
+    {
+        $this->scan();
+
+        if (is_int($name)) {
+            $info = $this->infos[$name];
+            if ($info['type'] != 'class') {
+                throw new Exception\InvalidArgumentException('Index of info offset is not about a class');
+            }
+        } elseif (is_string($name)) {
+            $classFound = false;
+            foreach ($this->infos as $info) {
+                if ($info['type'] === 'class' && $info['name'] === $name) {
+                    $classFound = true;
+                    break;
+                }
+            }
+
+            if (!$classFound) {
+                return false;
+            }
+        }
+
+        return new ClassScanner(
+            array_slice(
+                $this->tokens,
+                $info['tokenStart'],
+                ($info['tokenEnd'] - $info['tokenStart'] + 1)
+            ), // zero indexed array
+            new NameInformation($info['namespace'], $info['uses'])
+        );
+    }
+
+    /**
+     * @param  string $className
+     * @return bool|null|NameInformation
+     */
+    public function getClassNameInformation($className)
+    {
+        $this->scan();
+
+        $classFound = false;
+        foreach ($this->infos as $info) {
+            if ($info['type'] === 'class' && $info['name'] === $className) {
+                $classFound = true;
+                break;
+            }
+        }
+
+        if (!$classFound) {
+            return false;
+        }
+
+        if (!isset($info)) {
+            return;
+        }
+
+        return new NameInformation($info['namespace'], $info['uses']);
+    }
+
+    /**
+     * @return array
+     */
+    public function getFunctionNames()
+    {
+        $this->scan();
+        $functionNames = array();
+        foreach ($this->infos as $info) {
+            if ($info['type'] == 'function') {
+                $functionNames[] = $info['name'];
+            }
+        }
+
+        return $functionNames;
+    }
+
+    /**
+     * @return array
+     */
+    public function getFunctions()
+    {
+        $this->scan();
+
+        $functions = array();
+        foreach ($this->infos as $info) {
+            if ($info['type'] == 'function') {
+                // @todo $functions[] = new FunctionScanner($info['name']);
+            }
+        }
+
+        return $functions;
+    }
+
+    /**
+     * Export
+     *
+     * @param $tokens
+     */
+    public static function export($tokens)
+    {
+        // @todo
+    }
+
+    public function __toString()
+    {
+        // @todo
+    }
+
+    /**
+     * Scan
+     *
+     * @todo: $this->docComment should be assigned for valid docblock during
+     *        the scan instead of $this->getDocComment() (starting with
+     *        T_DOC_COMMENT case)
+     *
+     * @throws Exception\RuntimeException
+     */
+    protected function scan()
+    {
+        if ($this->isScanned) {
+            return;
+        }
+
+        if (!$this->tokens) {
+            throw new Exception\RuntimeException('No tokens were provided');
+        }
+
+        /**
+         * Define PHP 5.4 'trait' token constant.
+         */
+        if (!defined('T_TRAIT')) {
+            define('T_TRAIT', 42001);
+        }
+
+        /**
+         * Variables & Setup
+         */
+
+        $tokens          = &$this->tokens; // localize
+        $infos           = &$this->infos; // localize
+        $tokenIndex      = null;
+        $token           = null;
+        $tokenType       = null;
+        $tokenContent    = null;
+        $tokenLine       = null;
+        $namespace       = null;
+        $docCommentIndex = false;
+        $infoIndex       = 0;
+
+        /*
+         * MACRO creation
+         */
+        $MACRO_TOKEN_ADVANCE             = function () use (&$tokens, &$tokenIndex, &$token, &$tokenType, &$tokenContent, &$tokenLine) {
+            $tokenIndex = ($tokenIndex === null) ? 0 : $tokenIndex + 1;
+            if (!isset($tokens[$tokenIndex])) {
+                $token        = false;
+                $tokenContent = false;
+                $tokenType    = false;
+                $tokenLine    = false;
+
+                return false;
+            }
+            if (is_string($tokens[$tokenIndex]) && $tokens[$tokenIndex] === '"') {
+                do {
+                    $tokenIndex++;
+                } while (!(is_string($tokens[$tokenIndex]) && $tokens[$tokenIndex] === '"'));
+            }
+            $token = $tokens[$tokenIndex];
+            if (is_array($token)) {
+                list($tokenType, $tokenContent, $tokenLine) = $token;
+            } else {
+                $tokenType    = null;
+                $tokenContent = $token;
+            }
+
+            return $tokenIndex;
+        };
+        $MACRO_TOKEN_LOGICAL_START_INDEX = function () use (&$tokenIndex, &$docCommentIndex) {
+            return ($docCommentIndex === false) ? $tokenIndex : $docCommentIndex;
+        };
+        $MACRO_DOC_COMMENT_START = function () use (&$tokenIndex, &$docCommentIndex) {
+            $docCommentIndex = $tokenIndex;
+
+            return $docCommentIndex;
+        };
+        $MACRO_DOC_COMMENT_VALIDATE = function () use (&$tokenType, &$docCommentIndex) {
+            static $validTrailingTokens = null;
+            if ($validTrailingTokens === null) {
+                $validTrailingTokens = array(T_WHITESPACE, T_FINAL, T_ABSTRACT, T_INTERFACE, T_CLASS, T_FUNCTION);
+            }
+            if ($docCommentIndex !== false && !in_array($tokenType, $validTrailingTokens)) {
+                $docCommentIndex = false;
+            }
+
+            return $docCommentIndex;
+        };
+        $MACRO_INFO_ADVANCE = function () use (&$infoIndex, &$infos, &$tokenIndex, &$tokenLine) {
+            $infos[$infoIndex]['tokenEnd'] = $tokenIndex;
+            $infos[$infoIndex]['lineEnd']  = $tokenLine;
+            $infoIndex++;
+
+            return $infoIndex;
+        };
+
+        /**
+         * START FINITE STATE MACHINE FOR SCANNING TOKENS
+         */
+
+        // Initialize token
+        $MACRO_TOKEN_ADVANCE();
+
+        SCANNER_TOP:
+
+        if ($token === false) {
+            goto SCANNER_END;
+        }
+
+        // Validate current doc comment index
+        $MACRO_DOC_COMMENT_VALIDATE();
+
+        switch ($tokenType) {
+
+            case T_DOC_COMMENT:
+
+                $MACRO_DOC_COMMENT_START();
+                goto SCANNER_CONTINUE;
+                //goto no break needed
+
+            case T_NAMESPACE:
+
+                $infos[$infoIndex] = array(
+                    'type'       => 'namespace',
+                    'tokenStart' => $MACRO_TOKEN_LOGICAL_START_INDEX(),
+                    'tokenEnd'   => null,
+                    'lineStart'  => $token[2],
+                    'lineEnd'    => null,
+                    'namespace'  => null,
+                );
+
+                // start processing with next token
+                if ($MACRO_TOKEN_ADVANCE() === false) {
+                    goto SCANNER_END;
+                }
+
+                SCANNER_NAMESPACE_TOP:
+
+                if ($tokenType === null && $tokenContent === ';' || $tokenContent === '{') {
+                    goto SCANNER_NAMESPACE_END;
+                }
+
+                if ($tokenType === T_WHITESPACE) {
+                    goto SCANNER_NAMESPACE_CONTINUE;
+                }
+
+                if ($tokenType === T_NS_SEPARATOR || $tokenType === T_STRING) {
+                    $infos[$infoIndex]['namespace'] .= $tokenContent;
+                }
+
+                SCANNER_NAMESPACE_CONTINUE:
+
+                if ($MACRO_TOKEN_ADVANCE() === false) {
+                    goto SCANNER_END;
+                }
+                goto SCANNER_NAMESPACE_TOP;
+
+                SCANNER_NAMESPACE_END:
+
+                $namespace = $infos[$infoIndex]['namespace'];
+
+                $MACRO_INFO_ADVANCE();
+                goto SCANNER_CONTINUE;
+                //goto no break needed
+
+            case T_USE:
+
+                $infos[$infoIndex] = array(
+                    'type'       => 'use',
+                    'tokenStart' => $MACRO_TOKEN_LOGICAL_START_INDEX(),
+                    'tokenEnd'   => null,
+                    'lineStart'  => $tokens[$tokenIndex][2],
+                    'lineEnd'    => null,
+                    'namespace'  => $namespace,
+                    'statements' => array(0 => array('use' => null,
+                                                     'as'  => null)),
+                );
+
+                $useStatementIndex = 0;
+                $useAsContext      = false;
+
+                // start processing with next token
+                if ($MACRO_TOKEN_ADVANCE() === false) {
+                    goto SCANNER_END;
+                }
+
+                SCANNER_USE_TOP:
+
+                if ($tokenType === null) {
+                    if ($tokenContent === ';') {
+                        goto SCANNER_USE_END;
+                    } elseif ($tokenContent === ',') {
+                        $useAsContext = false;
+                        $useStatementIndex++;
+                        $infos[$infoIndex]['statements'][$useStatementIndex] = array('use' => null,
+                                                                                     'as'  => null);
+                    }
+                }
+
+                // ANALYZE
+                if ($tokenType !== null) {
+                    if ($tokenType == T_AS) {
+                        $useAsContext = true;
+                        goto SCANNER_USE_CONTINUE;
+                    }
+
+                    if ($tokenType == T_NS_SEPARATOR || $tokenType == T_STRING) {
+                        if ($useAsContext == false) {
+                            $infos[$infoIndex]['statements'][$useStatementIndex]['use'] .= $tokenContent;
+                        } else {
+                            $infos[$infoIndex]['statements'][$useStatementIndex]['as'] = $tokenContent;
+                        }
+                    }
+                }
+
+                SCANNER_USE_CONTINUE:
+
+                if ($MACRO_TOKEN_ADVANCE() === false) {
+                    goto SCANNER_END;
+                }
+                goto SCANNER_USE_TOP;
+
+                SCANNER_USE_END:
+
+                $MACRO_INFO_ADVANCE();
+                goto SCANNER_CONTINUE;
+                //goto no break needed
+
+            case T_INCLUDE:
+            case T_INCLUDE_ONCE:
+            case T_REQUIRE:
+            case T_REQUIRE_ONCE:
+
+                // Static for performance
+                static $includeTypes = array(
+                    T_INCLUDE      => 'include',
+                    T_INCLUDE_ONCE => 'include_once',
+                    T_REQUIRE      => 'require',
+                    T_REQUIRE_ONCE => 'require_once'
+                );
+
+                $infos[$infoIndex] = array(
+                    'type'        => 'include',
+                    'tokenStart'  => $MACRO_TOKEN_LOGICAL_START_INDEX(),
+                    'tokenEnd'    => null,
+                    'lineStart'   => $tokens[$tokenIndex][2],
+                    'lineEnd'     => null,
+                    'includeType' => $includeTypes[$tokens[$tokenIndex][0]],
+                    'path'        => '',
+                );
+
+                // start processing with next token
+                if ($MACRO_TOKEN_ADVANCE() === false) {
+                    goto SCANNER_END;
+                }
+
+                SCANNER_INCLUDE_TOP:
+
+                if ($tokenType === null && $tokenContent === ';') {
+                    goto SCANNER_INCLUDE_END;
+                }
+
+                $infos[$infoIndex]['path'] .= $tokenContent;
+
+                SCANNER_INCLUDE_CONTINUE:
+
+                if ($MACRO_TOKEN_ADVANCE() === false) {
+                    goto SCANNER_END;
+                }
+                goto SCANNER_INCLUDE_TOP;
+
+                SCANNER_INCLUDE_END:
+
+                $MACRO_INFO_ADVANCE();
+                goto SCANNER_CONTINUE;
+                //goto no break needed
+
+            case T_FUNCTION:
+            case T_FINAL:
+            case T_ABSTRACT:
+            case T_CLASS:
+            case T_INTERFACE:
+            case T_TRAIT:
+
+                $infos[$infoIndex] = array(
+                    'type'        => ($tokenType === T_FUNCTION) ? 'function' : 'class',
+                    'tokenStart'  => $MACRO_TOKEN_LOGICAL_START_INDEX(),
+                    'tokenEnd'    => null,
+                    'lineStart'   => $tokens[$tokenIndex][2],
+                    'lineEnd'     => null,
+                    'namespace'   => $namespace,
+                    'uses'        => $this->getUsesNoScan($namespace),
+                    'name'        => null,
+                    'shortName'   => null,
+                );
+
+                $classBraceCount = 0;
+
+                // start processing with current token
+
+                SCANNER_CLASS_TOP:
+
+                // process the name
+                if ($infos[$infoIndex]['shortName'] == ''
+                    && (($tokenType === T_CLASS || $tokenType === T_INTERFACE || $tokenType === T_TRAIT) && $infos[$infoIndex]['type'] === 'class'
+                        || ($tokenType === T_FUNCTION && $infos[$infoIndex]['type'] === 'function'))
+                ) {
+                    $infos[$infoIndex]['shortName'] = $tokens[$tokenIndex + 2][1];
+                    $infos[$infoIndex]['name']      = (($namespace !== null) ? $namespace . '\\' : '') . $infos[$infoIndex]['shortName'];
+                }
+
+                if ($tokenType === null) {
+                    if ($tokenContent == '{') {
+                        $classBraceCount++;
+                    }
+                    if ($tokenContent == '}') {
+                        $classBraceCount--;
+                        if ($classBraceCount === 0) {
+                            goto SCANNER_CLASS_END;
+                        }
+                    }
+                }
+
+                SCANNER_CLASS_CONTINUE:
+
+                if ($MACRO_TOKEN_ADVANCE() === false) {
+                    goto SCANNER_END;
+                }
+                goto SCANNER_CLASS_TOP;
+
+                SCANNER_CLASS_END:
+
+                $MACRO_INFO_ADVANCE();
+                goto SCANNER_CONTINUE;
+
+        }
+
+        SCANNER_CONTINUE:
+
+        if ($MACRO_TOKEN_ADVANCE() === false) {
+            goto SCANNER_END;
+        }
+        goto SCANNER_TOP;
+
+        SCANNER_END:
+
+        /**
+         * END FINITE STATE MACHINE FOR SCANNING TOKENS
+         */
+
+        $this->isScanned = true;
+    }
+
+    /**
+     * Check for namespace
+     *
+     * @param string $namespace
+     * @return bool
+     */
+    public function hasNamespace($namespace)
+    {
+        $this->scan();
+
+        foreach ($this->infos as $info) {
+            if ($info['type'] == 'namespace' && $info['namespace'] == $namespace) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * @param  string $namespace
+     * @return null|array
+     * @throws Exception\InvalidArgumentException
+     */
+    protected function getUsesNoScan($namespace)
+    {
+        $namespaces = array();
+        foreach ($this->infos as $info) {
+            if ($info['type'] == 'namespace') {
+                $namespaces[] = $info['namespace'];
+            }
+        }
+
+        if ($namespace === null) {
+            $namespace = array_shift($namespaces);
+        } elseif (!is_string($namespace)) {
+            throw new Exception\InvalidArgumentException('Invalid namespace provided');
+        } elseif (!in_array($namespace, $namespaces)) {
+            return;
+        }
+
+        $uses = array();
+        foreach ($this->infos as $info) {
+            if ($info['type'] !== 'use') {
+                continue;
+            }
+            foreach ($info['statements'] as $statement) {
+                if ($info['namespace'] == $namespace) {
+                    $uses[] = $statement;
+                }
+            }
+        }
+
+        return $uses;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/Util.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+use stdClass;
+use Zend\Code\Exception;
+
+/**
+ * Shared utility methods used by scanners
+ */
+class Util
+{
+    /**
+     * Resolve imports
+     *
+     * @param  string $value
+     * @param  null|string $key
+     * @param  \stdClass $data
+     * @return void
+     * @throws Exception\InvalidArgumentException
+     */
+    public static function resolveImports(&$value, $key = null, stdClass $data = null)
+    {
+        if (!is_object($data)
+            || !property_exists($data, 'uses')
+            || !property_exists($data, 'namespace')
+        ) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s expects a data object containing "uses" and "namespace" properties; on or both missing',
+                __METHOD__
+            ));
+        }
+
+        if ($data->namespace && !$data->uses && strlen($value) > 0 && $value{0} != '\\') {
+            $value = $data->namespace . '\\' . $value;
+
+            return;
+        }
+
+        if (!$data->uses || strlen($value) <= 0 || $value{0} == '\\') {
+            $value = ltrim($value, '\\');
+
+            return;
+        }
+
+        if ($data->namespace || $data->uses) {
+            $firstPart = $value;
+            if (($firstPartEnd = strpos($firstPart, '\\')) !== false) {
+                $firstPart = substr($firstPart, 0, $firstPartEnd);
+            } else {
+                $firstPartEnd = strlen($firstPart);
+            }
+
+            if (array_key_exists($firstPart, $data->uses)) {
+                $value = substr_replace($value, $data->uses[$firstPart], 0, $firstPartEnd);
+
+                return;
+            }
+
+            if ($data->namespace) {
+                $value = $data->namespace . '\\' . $value;
+
+                return;
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-code/src/Scanner/ValueScanner.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Code\Scanner;
+
+class ValueScanner
+{
+    // @todo
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/LICENSE.md
@@ -0,0 +1,28 @@
+Copyright (c) 2005-2015, Zend Technologies USA, Inc.
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+- Redistributions of source code must retain the above copyright notice,
+  this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+- Neither the name of Zend Technologies USA, Inc. nor the names of its
+  contributors may be used to endorse or promote products derived from this
+  software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/composer.json
@@ -0,0 +1,36 @@
+{
+    "name": "zendframework/zend-eventmanager",
+    "description": " ",
+    "license": "BSD-3-Clause",
+    "keywords": [
+        "zf2",
+        "eventmanager"
+    ],
+    "homepage": "https://github.com/zendframework/zend-eventmanager",
+    "autoload": {
+        "psr-4": {
+            "Zend\\EventManager\\": "src/"
+        }
+    },
+    "require": {
+        "php": ">=5.3.23",
+        "zendframework/zend-stdlib": "~2.5"
+    },
+    "minimum-stability": "dev",
+    "prefer-stable": true,
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.5-dev",
+            "dev-develop": "2.6-dev"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "ZendTest\\EventManager\\": "test/"
+        }
+    },
+    "require-dev": {
+        "fabpot/php-cs-fixer": "1.7.*",
+        "phpunit/PHPUnit": "~4.0"
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/AbstractListenerAggregate.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+/**
+ * Abstract aggregate listener
+ */
+abstract class AbstractListenerAggregate implements ListenerAggregateInterface
+{
+    /**
+     * @var \Zend\Stdlib\CallbackHandler[]
+     */
+    protected $listeners = array();
+
+    /**
+     * {@inheritDoc}
+     */
+    public function detach(EventManagerInterface $events)
+    {
+        foreach ($this->listeners as $index => $callback) {
+            if ($events->detach($callback)) {
+                unset($this->listeners[$index]);
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/Event.php
@@ -0,0 +1,209 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+use ArrayAccess;
+
+/**
+ * Representation of an event
+ *
+ * Encapsulates the target context and parameters passed, and provides some
+ * behavior for interacting with the event manager.
+ */
+class Event implements EventInterface
+{
+    /**
+     * @var string Event name
+     */
+    protected $name;
+
+    /**
+     * @var string|object The event target
+     */
+    protected $target;
+
+    /**
+     * @var array|ArrayAccess|object The event parameters
+     */
+    protected $params = array();
+
+    /**
+     * @var bool Whether or not to stop propagation
+     */
+    protected $stopPropagation = false;
+
+    /**
+     * Constructor
+     *
+     * Accept a target and its parameters.
+     *
+     * @param  string $name Event name
+     * @param  string|object $target
+     * @param  array|ArrayAccess $params
+     */
+    public function __construct($name = null, $target = null, $params = null)
+    {
+        if (null !== $name) {
+            $this->setName($name);
+        }
+
+        if (null !== $target) {
+            $this->setTarget($target);
+        }
+
+        if (null !== $params) {
+            $this->setParams($params);
+        }
+    }
+
+    /**
+     * Get event name
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Get the event target
+     *
+     * This may be either an object, or the name of a static method.
+     *
+     * @return string|object
+     */
+    public function getTarget()
+    {
+        return $this->target;
+    }
+
+    /**
+     * Set parameters
+     *
+     * Overwrites parameters
+     *
+     * @param  array|ArrayAccess|object $params
+     * @return Event
+     * @throws Exception\InvalidArgumentException
+     */
+    public function setParams($params)
+    {
+        if (!is_array($params) && !is_object($params)) {
+            throw new Exception\InvalidArgumentException(
+                sprintf('Event parameters must be an array or object; received "%s"', gettype($params))
+            );
+        }
+
+        $this->params = $params;
+        return $this;
+    }
+
+    /**
+     * Get all parameters
+     *
+     * @return array|object|ArrayAccess
+     */
+    public function getParams()
+    {
+        return $this->params;
+    }
+
+    /**
+     * Get an individual parameter
+     *
+     * If the parameter does not exist, the $default value will be returned.
+     *
+     * @param  string|int $name
+     * @param  mixed $default
+     * @return mixed
+     */
+    public function getParam($name, $default = null)
+    {
+        // Check in params that are arrays or implement array access
+        if (is_array($this->params) || $this->params instanceof ArrayAccess) {
+            if (!isset($this->params[$name])) {
+                return $default;
+            }
+
+            return $this->params[$name];
+        }
+
+        // Check in normal objects
+        if (!isset($this->params->{$name})) {
+            return $default;
+        }
+        return $this->params->{$name};
+    }
+
+    /**
+     * Set the event name
+     *
+     * @param  string $name
+     * @return Event
+     */
+    public function setName($name)
+    {
+        $this->name = (string) $name;
+        return $this;
+    }
+
+    /**
+     * Set the event target/context
+     *
+     * @param  null|string|object $target
+     * @return Event
+     */
+    public function setTarget($target)
+    {
+        $this->target = $target;
+        return $this;
+    }
+
+    /**
+     * Set an individual parameter to a value
+     *
+     * @param  string|int $name
+     * @param  mixed $value
+     * @return Event
+     */
+    public function setParam($name, $value)
+    {
+        if (is_array($this->params) || $this->params instanceof ArrayAccess) {
+            // Arrays or objects implementing array access
+            $this->params[$name] = $value;
+        } else {
+            // Objects
+            $this->params->{$name} = $value;
+        }
+        return $this;
+    }
+
+    /**
+     * Stop further event propagation
+     *
+     * @param  bool $flag
+     * @return void
+     */
+    public function stopPropagation($flag = true)
+    {
+        $this->stopPropagation = (bool) $flag;
+    }
+
+    /**
+     * Is propagation stopped?
+     *
+     * @return bool
+     */
+    public function propagationIsStopped()
+    {
+        return $this->stopPropagation;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/EventInterface.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+use ArrayAccess;
+
+/**
+ * Representation of an event
+ */
+interface EventInterface
+{
+    /**
+     * Get event name
+     *
+     * @return string
+     */
+    public function getName();
+
+    /**
+     * Get target/context from which event was triggered
+     *
+     * @return null|string|object
+     */
+    public function getTarget();
+
+    /**
+     * Get parameters passed to the event
+     *
+     * @return array|ArrayAccess
+     */
+    public function getParams();
+
+    /**
+     * Get a single parameter by name
+     *
+     * @param  string $name
+     * @param  mixed $default Default value to return if parameter does not exist
+     * @return mixed
+     */
+    public function getParam($name, $default = null);
+
+    /**
+     * Set the event name
+     *
+     * @param  string $name
+     * @return void
+     */
+    public function setName($name);
+
+    /**
+     * Set the event target/context
+     *
+     * @param  null|string|object $target
+     * @return void
+     */
+    public function setTarget($target);
+
+    /**
+     * Set event parameters
+     *
+     * @param  string $params
+     * @return void
+     */
+    public function setParams($params);
+
+    /**
+     * Set a single parameter by key
+     *
+     * @param  string $name
+     * @param  mixed $value
+     * @return void
+     */
+    public function setParam($name, $value);
+
+    /**
+     * Indicate whether or not the parent EventManagerInterface should stop propagating events
+     *
+     * @param  bool $flag
+     * @return void
+     */
+    public function stopPropagation($flag = true);
+
+    /**
+     * Has this event indicated event propagation should stop?
+     *
+     * @return bool
+     */
+    public function propagationIsStopped();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/EventManager.php
@@ -0,0 +1,526 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+use ArrayAccess;
+use ArrayObject;
+use Traversable;
+use Zend\Stdlib\CallbackHandler;
+use Zend\Stdlib\PriorityQueue;
+
+/**
+ * Event manager: notification system
+ *
+ * Use the EventManager when you want to create a per-instance notification
+ * system for your objects.
+ */
+class EventManager implements EventManagerInterface
+{
+    /**
+     * Subscribed events and their listeners
+     * @var array Array of PriorityQueue objects
+     */
+    protected $events = array();
+
+    /**
+     * @var string Class representing the event being emitted
+     */
+    protected $eventClass = 'Zend\EventManager\Event';
+
+    /**
+     * Identifiers, used to pull shared signals from SharedEventManagerInterface instance
+     * @var array
+     */
+    protected $identifiers = array();
+
+    /**
+     * Shared event manager
+     * @var false|null|SharedEventManagerInterface
+     */
+    protected $sharedManager = null;
+
+    /**
+     * Constructor
+     *
+     * Allows optionally specifying identifier(s) to use to pull signals from a
+     * SharedEventManagerInterface.
+     *
+     * @param  null|string|int|array|Traversable $identifiers
+     */
+    public function __construct($identifiers = null)
+    {
+        $this->setIdentifiers($identifiers);
+    }
+
+    /**
+     * Set the event class to utilize
+     *
+     * @param  string $class
+     * @return EventManager
+     */
+    public function setEventClass($class)
+    {
+        $this->eventClass = $class;
+        return $this;
+    }
+
+    /**
+     * Set shared event manager
+     *
+     * @param SharedEventManagerInterface $sharedEventManager
+     * @return EventManager
+     */
+    public function setSharedManager(SharedEventManagerInterface $sharedEventManager)
+    {
+        $this->sharedManager = $sharedEventManager;
+        StaticEventManager::setInstance($sharedEventManager);
+        return $this;
+    }
+
+    /**
+     * Remove any shared event manager currently attached
+     *
+     * @return void
+     */
+    public function unsetSharedManager()
+    {
+        $this->sharedManager = false;
+    }
+
+    /**
+     * Get shared event manager
+     *
+     * If one is not defined, but we have a static instance in
+     * StaticEventManager, that one will be used and set in this instance.
+     *
+     * If none is available in the StaticEventManager, a boolean false is
+     * returned.
+     *
+     * @return false|SharedEventManagerInterface
+     */
+    public function getSharedManager()
+    {
+        // "false" means "I do not want a shared manager; don't try and fetch one"
+        if (false === $this->sharedManager
+            || $this->sharedManager instanceof SharedEventManagerInterface
+        ) {
+            return $this->sharedManager;
+        }
+
+        if (!StaticEventManager::hasInstance()) {
+            return false;
+        }
+
+        $this->sharedManager = StaticEventManager::getInstance();
+        return $this->sharedManager;
+    }
+
+    /**
+     * Get the identifier(s) for this EventManager
+     *
+     * @return array
+     */
+    public function getIdentifiers()
+    {
+        return $this->identifiers;
+    }
+
+    /**
+     * Set the identifiers (overrides any currently set identifiers)
+     *
+     * @param string|int|array|Traversable $identifiers
+     * @return EventManager Provides a fluent interface
+     */
+    public function setIdentifiers($identifiers)
+    {
+        if (is_array($identifiers) || $identifiers instanceof Traversable) {
+            $this->identifiers = array_unique((array) $identifiers);
+        } elseif ($identifiers !== null) {
+            $this->identifiers = array($identifiers);
+        }
+        return $this;
+    }
+
+    /**
+     * Add some identifier(s) (appends to any currently set identifiers)
+     *
+     * @param string|int|array|Traversable $identifiers
+     * @return EventManager Provides a fluent interface
+     */
+    public function addIdentifiers($identifiers)
+    {
+        if (is_array($identifiers) || $identifiers instanceof Traversable) {
+            $this->identifiers = array_unique(array_merge($this->identifiers, (array) $identifiers));
+        } elseif ($identifiers !== null) {
+            $this->identifiers = array_unique(array_merge($this->identifiers, array($identifiers)));
+        }
+        return $this;
+    }
+
+    /**
+     * Trigger all listeners for a given event
+     *
+     * @param  string|EventInterface $event
+     * @param  string|object     $target   Object calling emit, or symbol describing target (such as static method name)
+     * @param  array|ArrayAccess $argv     Array of arguments; typically, should be associative
+     * @param  null|callable     $callback Trigger listeners until return value of this callback evaluate to true
+     * @return ResponseCollection All listener return values
+     * @throws Exception\InvalidCallbackException
+     */
+    public function trigger($event, $target = null, $argv = array(), $callback = null)
+    {
+        if ($event instanceof EventInterface) {
+            $e        = $event;
+            $event    = $e->getName();
+            $callback = $target;
+        } elseif ($target instanceof EventInterface) {
+            $e = $target;
+            $e->setName($event);
+            $callback = $argv;
+        } elseif ($argv instanceof EventInterface) {
+            $e = $argv;
+            $e->setName($event);
+            $e->setTarget($target);
+        } else {
+            $e = new $this->eventClass();
+            $e->setName($event);
+            $e->setTarget($target);
+            $e->setParams($argv);
+        }
+
+        if ($callback && !is_callable($callback)) {
+            throw new Exception\InvalidCallbackException('Invalid callback provided');
+        }
+
+        // Initial value of stop propagation flag should be false
+        $e->stopPropagation(false);
+
+        return $this->triggerListeners($event, $e, $callback);
+    }
+
+    /**
+     * Trigger listeners until return value of one causes a callback to
+     * evaluate to true
+     *
+     * Triggers listeners until the provided callback evaluates the return
+     * value of one as true, or until all listeners have been executed.
+     *
+     * @param  string|EventInterface $event
+     * @param  string|object $target Object calling emit, or symbol describing target (such as static method name)
+     * @param  array|ArrayAccess $argv Array of arguments; typically, should be associative
+     * @param  callable $callback
+     * @return ResponseCollection
+     * @deprecated Please use trigger()
+     * @throws Exception\InvalidCallbackException if invalid callable provided
+     */
+    public function triggerUntil($event, $target, $argv = null, $callback = null)
+    {
+        trigger_error(
+            'This method is deprecated and will be removed in the future. Please use trigger() instead.',
+            E_USER_DEPRECATED
+        );
+        return $this->trigger($event, $target, $argv, $callback);
+    }
+
+    /**
+     * Attach a listener to an event
+     *
+     * The first argument is the event, and the next argument describes a
+     * callback that will respond to that event. A CallbackHandler instance
+     * describing the event listener combination will be returned.
+     *
+     * The last argument indicates a priority at which the event should be
+     * executed. By default, this value is 1; however, you may set it for any
+     * integer value. Higher values have higher priority (i.e., execute first).
+     *
+     * You can specify "*" for the event name. In such cases, the listener will
+     * be triggered for every event.
+     *
+     * @param  string|array|ListenerAggregateInterface $event An event or array of event names. If a ListenerAggregateInterface, proxies to {@link attachAggregate()}.
+     * @param  callable|int $callback If string $event provided, expects PHP callback; for a ListenerAggregateInterface $event, this will be the priority
+     * @param  int $priority If provided, the priority at which to register the callable
+     * @return CallbackHandler|mixed CallbackHandler if attaching callable (to allow later unsubscribe); mixed if attaching aggregate
+     * @throws Exception\InvalidArgumentException
+     */
+    public function attach($event, $callback = null, $priority = 1)
+    {
+        // Proxy ListenerAggregateInterface arguments to attachAggregate()
+        if ($event instanceof ListenerAggregateInterface) {
+            return $this->attachAggregate($event, $callback);
+        }
+
+        // Null callback is invalid
+        if (null === $callback) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s: expects a callback; none provided',
+                __METHOD__
+            ));
+        }
+
+        // Array of events should be registered individually, and return an array of all listeners
+        if (is_array($event)) {
+            $listeners = array();
+            foreach ($event as $name) {
+                $listeners[] = $this->attach($name, $callback, $priority);
+            }
+            return $listeners;
+        }
+
+        // If we don't have a priority queue for the event yet, create one
+        if (empty($this->events[$event])) {
+            $this->events[$event] = new PriorityQueue();
+        }
+
+        // Create a callback handler, setting the event and priority in its metadata
+        $listener = new CallbackHandler($callback, array('event' => $event, 'priority' => $priority));
+
+        // Inject the callback handler into the queue
+        $this->events[$event]->insert($listener, $priority);
+        return $listener;
+    }
+
+    /**
+     * Attach a listener aggregate
+     *
+     * Listener aggregates accept an EventManagerInterface instance, and call attach()
+     * one or more times, typically to attach to multiple events using local
+     * methods.
+     *
+     * @param  ListenerAggregateInterface $aggregate
+     * @param  int $priority If provided, a suggested priority for the aggregate to use
+     * @return mixed return value of {@link ListenerAggregateInterface::attach()}
+     */
+    public function attachAggregate(ListenerAggregateInterface $aggregate, $priority = 1)
+    {
+        return $aggregate->attach($this, $priority);
+    }
+
+    /**
+     * Unsubscribe a listener from an event
+     *
+     * @param  CallbackHandler|ListenerAggregateInterface $listener
+     * @return bool Returns true if event and listener found, and unsubscribed; returns false if either event or listener not found
+     * @throws Exception\InvalidArgumentException if invalid listener provided
+     */
+    public function detach($listener)
+    {
+        if ($listener instanceof ListenerAggregateInterface) {
+            return $this->detachAggregate($listener);
+        }
+
+        if (!$listener instanceof CallbackHandler) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s: expected a ListenerAggregateInterface or CallbackHandler; received "%s"',
+                __METHOD__,
+                (is_object($listener) ? get_class($listener) : gettype($listener))
+            ));
+        }
+
+        $event = $listener->getMetadatum('event');
+        if (!$event || empty($this->events[$event])) {
+            return false;
+        }
+        $return = $this->events[$event]->remove($listener);
+        if (!$return) {
+            return false;
+        }
+        if (!count($this->events[$event])) {
+            unset($this->events[$event]);
+        }
+        return true;
+    }
+
+    /**
+     * Detach a listener aggregate
+     *
+     * Listener aggregates accept an EventManagerInterface instance, and call detach()
+     * of all previously attached listeners.
+     *
+     * @param  ListenerAggregateInterface $aggregate
+     * @return mixed return value of {@link ListenerAggregateInterface::detach()}
+     */
+    public function detachAggregate(ListenerAggregateInterface $aggregate)
+    {
+        return $aggregate->detach($this);
+    }
+
+    /**
+     * Retrieve all registered events
+     *
+     * @return array
+     */
+    public function getEvents()
+    {
+        return array_keys($this->events);
+    }
+
+    /**
+     * Retrieve all listeners for a given event
+     *
+     * @param  string $event
+     * @return PriorityQueue
+     */
+    public function getListeners($event)
+    {
+        if (!array_key_exists($event, $this->events)) {
+            return new PriorityQueue();
+        }
+        return $this->events[$event];
+    }
+
+    /**
+     * Clear all listeners for a given event
+     *
+     * @param  string $event
+     * @return void
+     */
+    public function clearListeners($event)
+    {
+        if (!empty($this->events[$event])) {
+            unset($this->events[$event]);
+        }
+    }
+
+    /**
+     * Prepare arguments
+     *
+     * Use this method if you want to be able to modify arguments from within a
+     * listener. It returns an ArrayObject of the arguments, which may then be
+     * passed to trigger().
+     *
+     * @param  array $args
+     * @return ArrayObject
+     */
+    public function prepareArgs(array $args)
+    {
+        return new ArrayObject($args);
+    }
+
+    /**
+     * Trigger listeners
+     *
+     * Actual functionality for triggering listeners, to which trigger() delegate.
+     *
+     * @param  string           $event Event name
+     * @param  EventInterface $e
+     * @param  null|callable    $callback
+     * @return ResponseCollection
+     */
+    protected function triggerListeners($event, EventInterface $e, $callback = null)
+    {
+        $responses = new ResponseCollection;
+        $listeners = $this->getListeners($event);
+
+        // Add shared/wildcard listeners to the list of listeners,
+        // but don't modify the listeners object
+        $sharedListeners         = $this->getSharedListeners($event);
+        $sharedWildcardListeners = $this->getSharedListeners('*');
+        $wildcardListeners       = $this->getListeners('*');
+        if (count($sharedListeners) || count($sharedWildcardListeners) || count($wildcardListeners)) {
+            $listeners = clone $listeners;
+
+            // Shared listeners on this specific event
+            $this->insertListeners($listeners, $sharedListeners);
+
+            // Shared wildcard listeners
+            $this->insertListeners($listeners, $sharedWildcardListeners);
+
+            // Add wildcard listeners
+            $this->insertListeners($listeners, $wildcardListeners);
+        }
+
+        foreach ($listeners as $listener) {
+            $listenerCallback = $listener->getCallback();
+
+            // Trigger the listener's callback, and push its result onto the
+            // response collection
+            $responses->push(call_user_func($listenerCallback, $e));
+
+            // If the event was asked to stop propagating, do so
+            if ($e->propagationIsStopped()) {
+                $responses->setStopped(true);
+                break;
+            }
+
+            // If the result causes our validation callback to return true,
+            // stop propagation
+            if ($callback && call_user_func($callback, $responses->last())) {
+                $responses->setStopped(true);
+                break;
+            }
+        }
+
+        return $responses;
+    }
+
+    /**
+     * Get list of all listeners attached to the shared event manager for
+     * identifiers registered by this instance
+     *
+     * @param  string $event
+     * @return array
+     */
+    protected function getSharedListeners($event)
+    {
+        if (!$sharedManager = $this->getSharedManager()) {
+            return array();
+        }
+
+        $identifiers     = $this->getIdentifiers();
+        //Add wildcard id to the search, if not already added
+        if (!in_array('*', $identifiers)) {
+            $identifiers[] = '*';
+        }
+        $sharedListeners = array();
+
+        foreach ($identifiers as $id) {
+            if (!$listeners = $sharedManager->getListeners($id, $event)) {
+                continue;
+            }
+
+            if (!is_array($listeners) && !($listeners instanceof Traversable)) {
+                continue;
+            }
+
+            foreach ($listeners as $listener) {
+                if (!$listener instanceof CallbackHandler) {
+                    continue;
+                }
+                $sharedListeners[] = $listener;
+            }
+        }
+
+        return $sharedListeners;
+    }
+
+    /**
+     * Add listeners to the master queue of listeners
+     *
+     * Used to inject shared listeners and wildcard listeners.
+     *
+     * @param  PriorityQueue $masterListeners
+     * @param  array|Traversable $listeners
+     * @return void
+     */
+    protected function insertListeners($masterListeners, $listeners)
+    {
+        foreach ($listeners as $listener) {
+            $priority = $listener->getMetadatum('priority');
+            if (null === $priority) {
+                $priority = 1;
+            } elseif (is_array($priority)) {
+                // If we have an array, likely using PriorityQueue. Grab first
+                // element of the array, as that's the actual priority.
+                $priority = array_shift($priority);
+            }
+            $masterListeners->insert($listener, $priority);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/EventManagerAwareInterface.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+/**
+ * Interface to automate setter injection for an EventManager instance
+ */
+interface EventManagerAwareInterface extends EventsCapableInterface
+{
+    /**
+     * Inject an EventManager instance
+     *
+     * @param  EventManagerInterface $eventManager
+     * @return void
+     */
+    public function setEventManager(EventManagerInterface $eventManager);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/EventManagerAwareTrait.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+use Traversable;
+
+/**
+ * A trait for objects that provide events.
+ *
+ * If you use this trait in an object, you will probably want to also implement
+ * EventManagerAwareInterface, which will make it so the default initializer in
+ * a ZF2 MVC application will automatically inject an instance of the
+ * EventManager into your object when it is pulled from the ServiceManager.
+ *
+ * @see Zend\Mvc\Service\ServiceManagerConfig
+ */
+trait EventManagerAwareTrait
+{
+    /**
+     * @var EventManagerInterface
+     */
+    protected $events;
+
+    /**
+     * Set the event manager instance used by this context.
+     *
+     * For convenience, this method will also set the class name / LSB name as
+     * identifiers, in addition to any string or array of strings set to the
+     * $this->eventIdentifier property.
+     *
+     * @param  EventManagerInterface $events
+     * @return mixed
+     */
+    public function setEventManager(EventManagerInterface $events)
+    {
+        $identifiers = array(__CLASS__, get_class($this));
+        if (isset($this->eventIdentifier)) {
+            if ((is_string($this->eventIdentifier))
+                || (is_array($this->eventIdentifier))
+                || ($this->eventIdentifier instanceof Traversable)
+            ) {
+                $identifiers = array_unique(array_merge($identifiers, (array) $this->eventIdentifier));
+            } elseif (is_object($this->eventIdentifier)) {
+                $identifiers[] = $this->eventIdentifier;
+            }
+            // silently ignore invalid eventIdentifier types
+        }
+        $events->setIdentifiers($identifiers);
+        $this->events = $events;
+        if (method_exists($this, 'attachDefaultListeners')) {
+            $this->attachDefaultListeners();
+        }
+        return $this;
+    }
+
+    /**
+     * Retrieve the event manager
+     *
+     * Lazy-loads an EventManager instance if none registered.
+     *
+     * @return EventManagerInterface
+     */
+    public function getEventManager()
+    {
+        if (!$this->events instanceof EventManagerInterface) {
+            $this->setEventManager(new EventManager());
+        }
+        return $this->events;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/EventManagerInterface.php
@@ -0,0 +1,144 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+use Traversable;
+use Zend\Stdlib\CallbackHandler;
+
+/**
+ * Interface for messengers
+ */
+interface EventManagerInterface extends SharedEventManagerAwareInterface
+{
+    /**
+     * Trigger an event
+     *
+     * Should allow handling the following scenarios:
+     * - Passing Event object only
+     * - Passing event name and Event object only
+     * - Passing event name, target, and Event object
+     * - Passing event name, target, and array|ArrayAccess of arguments
+     * - Passing event name, target, array|ArrayAccess of arguments, and callback
+     *
+     * @param  string|EventInterface $event
+     * @param  object|string $target
+     * @param  array|object $argv
+     * @param  null|callable $callback
+     * @return ResponseCollection
+     */
+    public function trigger($event, $target = null, $argv = array(), $callback = null);
+
+    /**
+     * Trigger an event until the given callback returns a boolean true
+     *
+     * Should allow handling the following scenarios:
+     * - Passing Event object and callback only
+     * - Passing event name, Event object, and callback only
+     * - Passing event name, target, Event object, and callback
+     * - Passing event name, target, array|ArrayAccess of arguments, and callback
+     *
+     * @param  string|EventInterface $event
+     * @param  object|string $target
+     * @param  array|object $argv
+     * @param  callable $callback
+     * @return ResponseCollection
+     * @deprecated Please use trigger()
+     */
+    public function triggerUntil($event, $target, $argv = null, $callback = null);
+
+    /**
+     * Attach a listener to an event
+     *
+     * @param  string $event
+     * @param  callable $callback
+     * @param  int $priority Priority at which to register listener
+     * @return CallbackHandler
+     */
+    public function attach($event, $callback = null, $priority = 1);
+
+    /**
+     * Detach an event listener
+     *
+     * @param  CallbackHandler|ListenerAggregateInterface $listener
+     * @return bool
+     */
+    public function detach($listener);
+
+    /**
+     * Get a list of events for which this collection has listeners
+     *
+     * @return array
+     */
+    public function getEvents();
+
+    /**
+     * Retrieve a list of listeners registered to a given event
+     *
+     * @param  string $event
+     * @return array|object
+     */
+    public function getListeners($event);
+
+    /**
+     * Clear all listeners for a given event
+     *
+     * @param  string $event
+     * @return void
+     */
+    public function clearListeners($event);
+
+    /**
+     * Set the event class to utilize
+     *
+     * @param  string $class
+     * @return EventManagerInterface
+     */
+    public function setEventClass($class);
+
+    /**
+     * Get the identifier(s) for this EventManager
+     *
+     * @return array
+     */
+    public function getIdentifiers();
+
+    /**
+     * Set the identifiers (overrides any currently set identifiers)
+     *
+     * @param string|int|array|Traversable $identifiers
+     * @return EventManagerInterface
+     */
+    public function setIdentifiers($identifiers);
+
+    /**
+     * Add some identifier(s) (appends to any currently set identifiers)
+     *
+     * @param string|int|array|Traversable $identifiers
+     * @return EventManagerInterface
+     */
+    public function addIdentifiers($identifiers);
+
+    /**
+     * Attach a listener aggregate
+     *
+     * @param  ListenerAggregateInterface $aggregate
+     * @param  int $priority If provided, a suggested priority for the aggregate to use
+     * @return mixed return value of {@link ListenerAggregateInterface::attach()}
+     */
+    public function attachAggregate(ListenerAggregateInterface $aggregate, $priority = 1);
+
+    /**
+     * Detach a listener aggregate
+     *
+     * @param  ListenerAggregateInterface $aggregate
+     * @return mixed return value of {@link ListenerAggregateInterface::detach()}
+     */
+    public function detachAggregate(ListenerAggregateInterface $aggregate);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/EventsCapableInterface.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+/**
+ * Interface providing events that can be attached, detached and triggered.
+ */
+interface EventsCapableInterface
+{
+    /**
+     * Retrieve the event manager
+     *
+     * Lazy-loads an EventManager instance if none registered.
+     *
+     * @return EventManagerInterface
+     */
+    public function getEventManager();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/Exception/DomainException.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager\Exception;
+
+class DomainException extends \DomainException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/Exception/ExceptionInterface.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager\Exception;
+
+/**
+ * Base exception interface
+ */
+interface ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/Exception/InvalidArgumentException.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager\Exception;
+
+/**
+ * Invalid argument exception
+ */
+class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/Exception/InvalidCallbackException.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager\Exception;
+
+/**
+ * Invalid callback exception
+ */
+class InvalidCallbackException extends DomainException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/Filter/FilterInterface.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager\Filter;
+
+use Zend\EventManager\ResponseCollection;
+use Zend\Stdlib\CallbackHandler;
+
+/**
+ * Interface for intercepting filter chains
+ */
+interface FilterInterface
+{
+    /**
+     * Execute the filter chain
+     *
+     * @param  string|object $context
+     * @param  array $params
+     * @return mixed
+     */
+    public function run($context, array $params = array());
+
+    /**
+     * Attach an intercepting filter
+     *
+     * @param  callable $callback
+     * @return CallbackHandler
+     */
+    public function attach($callback);
+
+    /**
+     * Detach an intercepting filter
+     *
+     * @param  CallbackHandler $filter
+     * @return bool
+     */
+    public function detach(CallbackHandler $filter);
+
+    /**
+     * Get all intercepting filters
+     *
+     * @return array
+     */
+    public function getFilters();
+
+    /**
+     * Clear all filters
+     *
+     * @return void
+     */
+    public function clearFilters();
+
+    /**
+     * Get all filter responses
+     *
+     * @return ResponseCollection
+     */
+    public function getResponses();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/Filter/FilterIterator.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager\Filter;
+
+use Zend\Stdlib\CallbackHandler;
+use Zend\Stdlib\SplPriorityQueue;
+
+/**
+ * Specialized priority queue implementation for use with an intercepting
+ * filter chain.
+ *
+ * Allows removal
+ */
+class FilterIterator extends SplPriorityQueue
+{
+    /**
+     * Does the queue contain a given value?
+     *
+     * @param  mixed $datum
+     * @return bool
+     */
+    public function contains($datum)
+    {
+        $chain = clone $this;
+        foreach ($chain as $item) {
+            if ($item === $datum) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Remove a value from the queue
+     *
+     * This is an expensive operation. It must first iterate through all values,
+     * and then re-populate itself. Use only if absolutely necessary.
+     *
+     * @param  mixed $datum
+     * @return bool
+     */
+    public function remove($datum)
+    {
+        $this->setExtractFlags(self::EXTR_BOTH);
+
+        // Iterate and remove any matches
+        $removed = false;
+        $items   = array();
+        $this->rewind();
+        while (!$this->isEmpty()) {
+            $item = $this->extract();
+            if ($item['data'] === $datum) {
+                $removed = true;
+                continue;
+            }
+            $items[] = $item;
+        }
+
+        // Repopulate
+        foreach ($items as $item) {
+            $this->insert($item['data'], $item['priority']);
+        }
+
+        $this->setExtractFlags(self::EXTR_DATA);
+        return $removed;
+    }
+
+    /**
+     * Iterate the next filter in the chain
+     *
+     * Iterates and calls the next filter in the chain.
+     *
+     * @param  mixed $context
+     * @param  array $params
+     * @param  FilterIterator $chain
+     * @return mixed
+     */
+    public function next($context = null, array $params = array(), $chain = null)
+    {
+        if (empty($context) || $chain->isEmpty()) {
+            return;
+        }
+
+        $next = $this->extract();
+        if (!$next instanceof CallbackHandler) {
+            return;
+        }
+
+        $return = call_user_func($next->getCallback(), $context, $params, $chain);
+        return $return;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/FilterChain.php
@@ -0,0 +1,120 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+use Zend\Stdlib\CallbackHandler;
+
+/**
+ * FilterChain: intercepting filter manager
+ */
+class FilterChain implements Filter\FilterInterface
+{
+    /**
+     * @var Filter\FilterIterator All filters
+     */
+    protected $filters;
+
+    /**
+     * Constructor
+     *
+     * Initializes Filter\FilterIterator in which filters will be aggregated
+     */
+    public function __construct()
+    {
+        $this->filters = new Filter\FilterIterator();
+    }
+
+    /**
+     * Apply the filters
+     *
+     * Begins iteration of the filters.
+     *
+     * @param  mixed $context Object under observation
+     * @param  mixed $argv Associative array of arguments
+     * @return mixed
+     */
+    public function run($context, array $argv = array())
+    {
+        $chain = clone $this->getFilters();
+
+        if ($chain->isEmpty()) {
+            return;
+        }
+
+        $next = $chain->extract();
+        if (!$next instanceof CallbackHandler) {
+            return;
+        }
+
+        return call_user_func($next->getCallback(), $context, $argv, $chain);
+    }
+
+    /**
+     * Connect a filter to the chain
+     *
+     * @param  callable $callback PHP Callback
+     * @param  int $priority Priority in the queue at which to execute; defaults to 1 (higher numbers == higher priority)
+     * @return CallbackHandler (to allow later unsubscribe)
+     * @throws Exception\InvalidCallbackException
+     */
+    public function attach($callback, $priority = 1)
+    {
+        if (empty($callback)) {
+            throw new Exception\InvalidCallbackException('No callback provided');
+        }
+        $filter = new CallbackHandler($callback, array('priority' => $priority));
+        $this->filters->insert($filter, $priority);
+        return $filter;
+    }
+
+    /**
+     * Detach a filter from the chain
+     *
+     * @param  CallbackHandler $filter
+     * @return bool Returns true if filter found and unsubscribed; returns false otherwise
+     */
+    public function detach(CallbackHandler $filter)
+    {
+        return $this->filters->remove($filter);
+    }
+
+    /**
+     * Retrieve all filters
+     *
+     * @return Filter\FilterIterator
+     */
+    public function getFilters()
+    {
+        return $this->filters;
+    }
+
+    /**
+     * Clear all filters
+     *
+     * @return void
+     */
+    public function clearFilters()
+    {
+        $this->filters = new Filter\FilterIterator();
+    }
+
+    /**
+     * Return current responses
+     *
+     * Only available while the chain is still being iterated. Returns the
+     * current ResponseCollection.
+     *
+     * @return null|ResponseCollection
+     */
+    public function getResponses()
+    {
+        return;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/GlobalEventManager.php
@@ -0,0 +1,141 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+use Zend\Stdlib\CallbackHandler;
+use Zend\Stdlib\PriorityQueue;
+
+/**
+ * Event manager: notification system
+ *
+ * Use the EventManager when you want to create a per-instance notification
+ * system for your objects.
+ */
+class GlobalEventManager
+{
+    /**
+     * @var EventManagerInterface
+     */
+    protected static $events;
+
+    /**
+     * Set the event collection on which this will operate
+     *
+     * @param  null|EventManagerInterface $events
+     * @return void
+     */
+    public static function setEventCollection(EventManagerInterface $events = null)
+    {
+        static::$events = $events;
+    }
+
+    /**
+     * Get event collection on which this operates
+     *
+     * @return EventManagerInterface
+     */
+    public static function getEventCollection()
+    {
+        if (null === static::$events) {
+            static::setEventCollection(new EventManager());
+        }
+        return static::$events;
+    }
+
+    /**
+     * Trigger an event
+     *
+     * @param  string        $event
+     * @param  object|string $context
+     * @param  array|object  $argv
+     * @param  null|callable $callback
+     * @return ResponseCollection
+     */
+    public static function trigger($event, $context, $argv = array(), $callback = null)
+    {
+        return static::getEventCollection()->trigger($event, $context, $argv, $callback);
+    }
+
+    /**
+     * Trigger listeners until return value of one causes a callback to evaluate
+     * to true.
+     *
+     * @param  string $event
+     * @param  string|object $context
+     * @param  array|object $argv
+     * @param  callable $callback
+     * @return ResponseCollection
+     * @deprecated Please use trigger()
+     */
+    public static function triggerUntil($event, $context, $argv, $callback)
+    {
+        trigger_error(
+            'This method is deprecated and will be removed in the future. Please use trigger() instead.',
+            E_USER_DEPRECATED
+        );
+        return static::trigger($event, $context, $argv, $callback);
+    }
+
+    /**
+     * Attach a listener to an event
+     *
+     * @param  string $event
+     * @param  callable $callback
+     * @param  int $priority
+     * @return CallbackHandler
+     */
+    public static function attach($event, $callback, $priority = 1)
+    {
+        return static::getEventCollection()->attach($event, $callback, $priority);
+    }
+
+    /**
+     * Detach a callback from a listener
+     *
+     * @param  CallbackHandler $listener
+     * @return bool
+     */
+    public static function detach(CallbackHandler $listener)
+    {
+        return static::getEventCollection()->detach($listener);
+    }
+
+    /**
+     * Retrieve list of events this object manages
+     *
+     * @return array
+     */
+    public static function getEvents()
+    {
+        return static::getEventCollection()->getEvents();
+    }
+
+    /**
+     * Retrieve all listeners for a given event
+     *
+     * @param  string $event
+     * @return PriorityQueue|array
+     */
+    public static function getListeners($event)
+    {
+        return static::getEventCollection()->getListeners($event);
+    }
+
+    /**
+     * Clear all listeners for a given event
+     *
+     * @param  string $event
+     * @return void
+     */
+    public static function clearListeners($event)
+    {
+        static::getEventCollection()->clearListeners($event);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/ListenerAggregateInterface.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+/**
+ * Interface for self-registering event listeners.
+ *
+ * Classes implementing this interface may be registered by name or instance
+ * with an EventManager, without an event name. The {@link attach()} method will
+ * then be called with the current EventManager instance, allowing the class to
+ * wire up one or more listeners.
+ */
+interface ListenerAggregateInterface
+{
+    /**
+     * Attach one or more listeners
+     *
+     * Implementors may add an optional $priority argument; the EventManager
+     * implementation will pass this to the aggregate.
+     *
+     * @param EventManagerInterface $events
+     *
+     * @return void
+     */
+    public function attach(EventManagerInterface $events);
+
+    /**
+     * Detach all previously attached listeners
+     *
+     * @param EventManagerInterface $events
+     *
+     * @return void
+     */
+    public function detach(EventManagerInterface $events);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/ListenerAggregateTrait.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+/**
+ * Provides logic to easily create aggregate listeners, without worrying about
+ * manually detaching events
+ */
+trait ListenerAggregateTrait
+{
+    /**
+     * @var \Zend\Stdlib\CallbackHandler[]
+     */
+    protected $listeners = array();
+
+    /**
+     * {@inheritDoc}
+     */
+    public function detach(EventManagerInterface $events)
+    {
+        foreach ($this->listeners as $index => $callback) {
+            if ($events->detach($callback)) {
+                unset($this->listeners[$index]);
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/ProvidesEvents.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+trigger_error('Zend\EventManager\ProvidesEvents has been deprecated in favor of Zend\EventManager\EventManagerAwareTrait; please update your code', E_USER_DEPRECATED);
+
+/**
+ * @deprecated Please use EventManagerAwareTrait instead.
+ *
+ * This trait exists solely for backwards compatibility in the 2.x branch and
+ * will likely be removed in 3.x.
+ */
+trait ProvidesEvents
+{
+    use EventManagerAwareTrait;
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/ResponseCollection.php
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+use SplStack;
+
+/**
+ * Collection of signal handler return values
+ */
+class ResponseCollection extends SplStack
+{
+    protected $stopped = false;
+
+    /**
+     * Did the last response provided trigger a short circuit of the stack?
+     *
+     * @return bool
+     */
+    public function stopped()
+    {
+        return $this->stopped;
+    }
+
+    /**
+     * Mark the collection as stopped (or its opposite)
+     *
+     * @param  bool $flag
+     * @return ResponseCollection
+     */
+    public function setStopped($flag)
+    {
+        $this->stopped = (bool) $flag;
+        return $this;
+    }
+
+    /**
+     * Convenient access to the first handler return value.
+     *
+     * @return mixed The first handler return value
+     */
+    public function first()
+    {
+        return parent::bottom();
+    }
+
+    /**
+     * Convenient access to the last handler return value.
+     *
+     * If the collection is empty, returns null. Otherwise, returns value
+     * returned by last handler.
+     *
+     * @return mixed The last handler return value
+     */
+    public function last()
+    {
+        if (count($this) === 0) {
+            return;
+        }
+        return parent::top();
+    }
+
+    /**
+     * Check if any of the responses match the given value.
+     *
+     * @param  mixed $value The value to look for among responses
+     * @return bool
+     */
+    public function contains($value)
+    {
+        foreach ($this as $response) {
+            if ($response === $value) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/SharedEventAggregateAwareInterface.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+/**
+ * Interface for allowing attachment of shared aggregate listeners.
+ */
+interface SharedEventAggregateAwareInterface
+{
+    /**
+     * Attach a listener aggregate
+     *
+     * @param  SharedListenerAggregateInterface $aggregate
+     * @param  int $priority If provided, a suggested priority for the aggregate to use
+     * @return mixed return value of {@link SharedListenerAggregateInterface::attachShared()}
+     */
+    public function attachAggregate(SharedListenerAggregateInterface $aggregate, $priority = 1);
+
+    /**
+     * Detach a listener aggregate
+     *
+     * @param  SharedListenerAggregateInterface $aggregate
+     * @return mixed return value of {@link SharedListenerAggregateInterface::detachShared()}
+    */
+    public function detachAggregate(SharedListenerAggregateInterface $aggregate);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/SharedEventManager.php
@@ -0,0 +1,176 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+use Zend\Stdlib\CallbackHandler;
+use Zend\Stdlib\PriorityQueue;
+
+/**
+ * Shared/contextual EventManager
+ *
+ * Allows attaching to EMs composed by other classes without having an instance first.
+ * The assumption is that the SharedEventManager will be injected into EventManager
+ * instances, and then queried for additional listeners when triggering an event.
+ */
+class SharedEventManager implements
+    SharedEventAggregateAwareInterface,
+    SharedEventManagerInterface
+{
+    /**
+     * Identifiers with event connections
+     * @var array
+     */
+    protected $identifiers = array();
+
+    /**
+     * Attach a listener to an event
+     *
+     * Allows attaching a callback to an event offered by one or more
+     * identifying components. As an example, the following connects to the
+     * "getAll" event of both an AbstractResource and EntityResource:
+     *
+     * <code>
+     * $sharedEventManager = new SharedEventManager();
+     * $sharedEventManager->attach(
+     *     array('My\Resource\AbstractResource', 'My\Resource\EntityResource'),
+     *     'getAll',
+     *     function ($e) use ($cache) {
+     *         if (!$id = $e->getParam('id', false)) {
+     *             return;
+     *         }
+     *         if (!$data = $cache->load(get_class($resource) . '::getOne::' . $id )) {
+     *             return;
+     *         }
+     *         return $data;
+     *     }
+     * );
+     * </code>
+     *
+     * @param  string|array $id Identifier(s) for event emitting component(s)
+     * @param  string $event
+     * @param  callable $callback PHP Callback
+     * @param  int $priority Priority at which listener should execute
+     * @return CallbackHandler|array Either CallbackHandler or array of CallbackHandlers
+     */
+    public function attach($id, $event, $callback, $priority = 1)
+    {
+        $ids = (array) $id;
+        $listeners = array();
+        foreach ($ids as $id) {
+            if (!array_key_exists($id, $this->identifiers)) {
+                $this->identifiers[$id] = new EventManager($id);
+            }
+            $listeners[] = $this->identifiers[$id]->attach($event, $callback, $priority);
+        }
+        if (count($listeners) > 1) {
+            return $listeners;
+        }
+        return $listeners[0];
+    }
+
+    /**
+     * Attach a listener aggregate
+     *
+     * Listener aggregates accept an EventManagerInterface instance, and call attachShared()
+     * one or more times, typically to attach to multiple events using local
+     * methods.
+     *
+     * @param  SharedListenerAggregateInterface $aggregate
+     * @param  int $priority If provided, a suggested priority for the aggregate to use
+     * @return mixed return value of {@link ListenerAggregateInterface::attachShared()}
+     */
+    public function attachAggregate(SharedListenerAggregateInterface $aggregate, $priority = 1)
+    {
+        return $aggregate->attachShared($this, $priority);
+    }
+
+    /**
+     * Detach a listener from an event offered by a given resource
+     *
+     * @param  string|int $id
+     * @param  CallbackHandler $listener
+     * @return bool Returns true if event and listener found, and unsubscribed; returns false if either event or listener not found
+     */
+    public function detach($id, CallbackHandler $listener)
+    {
+        if (!array_key_exists($id, $this->identifiers)) {
+            return false;
+        }
+        return $this->identifiers[$id]->detach($listener);
+    }
+
+    /**
+     * Detach a listener aggregate
+     *
+     * Listener aggregates accept a SharedEventManagerInterface instance, and call detachShared()
+     * of all previously attached listeners.
+     *
+     * @param  SharedListenerAggregateInterface $aggregate
+     * @return mixed return value of {@link SharedListenerAggregateInterface::detachShared()}
+     */
+    public function detachAggregate(SharedListenerAggregateInterface $aggregate)
+    {
+        return $aggregate->detachShared($this);
+    }
+
+    /**
+     * Retrieve all registered events for a given resource
+     *
+     * @param  string|int $id
+     * @return array
+     */
+    public function getEvents($id)
+    {
+        if (!array_key_exists($id, $this->identifiers)) {
+            //Check if there are any id wildcards listeners
+            if ('*' != $id && array_key_exists('*', $this->identifiers)) {
+                return $this->identifiers['*']->getEvents();
+            }
+            return false;
+        }
+        return $this->identifiers[$id]->getEvents();
+    }
+
+    /**
+     * Retrieve all listeners for a given identifier and event
+     *
+     * @param  string|int $id
+     * @param  string|int $event
+     * @return false|PriorityQueue
+     */
+    public function getListeners($id, $event)
+    {
+        if (!array_key_exists($id, $this->identifiers)) {
+            return false;
+        }
+        return $this->identifiers[$id]->getListeners($event);
+    }
+
+    /**
+     * Clear all listeners for a given identifier, optionally for a specific event
+     *
+     * @param  string|int $id
+     * @param  null|string $event
+     * @return bool
+     */
+    public function clearListeners($id, $event = null)
+    {
+        if (!array_key_exists($id, $this->identifiers)) {
+            return false;
+        }
+
+        if (null === $event) {
+            unset($this->identifiers[$id]);
+            return true;
+        }
+
+        return $this->identifiers[$id]->clearListeners($event);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/SharedEventManagerAwareInterface.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+/**
+ * Interface to automate setter injection for a SharedEventManagerInterface instance
+ */
+interface SharedEventManagerAwareInterface
+{
+    /**
+     * Inject a SharedEventManager instance
+     *
+     * @param  SharedEventManagerInterface $sharedEventManager
+     * @return SharedEventManagerAwareInterface
+     */
+    public function setSharedManager(SharedEventManagerInterface $sharedEventManager);
+
+    /**
+     * Get shared collections container
+     *
+     * @return SharedEventManagerInterface
+     */
+    public function getSharedManager();
+
+    /**
+     * Remove any shared collections
+     *
+     * @return void
+     */
+    public function unsetSharedManager();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/SharedEventManagerInterface.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+use Zend\Stdlib\CallbackHandler;
+use Zend\Stdlib\PriorityQueue;
+
+/**
+ * Interface for shared event listener collections
+ */
+interface SharedEventManagerInterface
+{
+    /**
+     * Retrieve all listeners for a given identifier and event
+     *
+     * @param  string|int $id
+     * @param  string|int $event
+     * @return false|PriorityQueue
+     */
+    public function getListeners($id, $event);
+
+    /**
+     * Attach a listener to an event
+     *
+     * @param  string|array $id Identifier(s) for event emitting component(s)
+     * @param  string $event
+     * @param  callable $callback PHP Callback
+     * @param  int $priority Priority at which listener should execute
+     * @return CallbackHandler|array Either CallbackHandler or array of CallbackHandlers
+     */
+    public function attach($id, $event, $callback, $priority = 1);
+
+    /**
+     * Detach a listener from an event offered by a given resource
+     *
+     * @param  string|int $id
+     * @param  CallbackHandler $listener
+     * @return bool Returns true if event and listener found, and unsubscribed; returns false if either event or listener not found
+     */
+    public function detach($id, CallbackHandler $listener);
+
+    /**
+     * Retrieve all registered events for a given resource
+     *
+     * @param  string|int $id
+     * @return array
+     */
+    public function getEvents($id);
+
+    /**
+     * Clear all listeners for a given identifier, optionally for a specific event
+     *
+     * @param  string|int $id
+     * @param  null|string $event
+     * @return bool
+     */
+    public function clearListeners($id, $event = null);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/SharedListenerAggregateInterface.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+/**
+ * Interface for self-registering event listeners.
+ *
+ * Classes implementing this interface may be registered by name or instance
+ * with a SharedEventManager, without an event name. The {@link attach()} method will
+ * then be called with the current SharedEventManager instance, allowing the class to
+ * wire up one or more listeners.
+ */
+interface SharedListenerAggregateInterface
+{
+    /**
+     * Attach one or more listeners
+     *
+     * Implementors may add an optional $priority argument; the SharedEventManager
+     * implementation will pass this to the aggregate.
+     *
+     * @param SharedEventManagerInterface $events
+     */
+    public function attachShared(SharedEventManagerInterface $events);
+
+    /**
+     * Detach all previously attached listeners
+     *
+     * @param SharedEventManagerInterface $events
+     */
+    public function detachShared(SharedEventManagerInterface $events);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-eventmanager/src/StaticEventManager.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\EventManager;
+
+/**
+ * Static version of EventManager
+ */
+class StaticEventManager extends SharedEventManager
+{
+    /**
+     * @var SharedEventManagerInterface
+     */
+    protected static $instance;
+
+    /**
+     * Singleton
+     */
+    protected function __construct()
+    {
+    }
+
+    /**
+     * Singleton
+     *
+     * @return void
+     */
+    private function __clone()
+    {
+    }
+
+    /**
+     * Retrieve instance
+     *
+     * @return StaticEventManager
+     */
+    public static function getInstance()
+    {
+        if (null === static::$instance) {
+            static::setInstance(new static());
+        }
+        return static::$instance;
+    }
+
+    /**
+     * Set the singleton to a specific SharedEventManagerInterface instance
+     *
+     * @param SharedEventManagerInterface $instance
+     * @return void
+     */
+    public static function setInstance(SharedEventManagerInterface $instance)
+    {
+        static::$instance = $instance;
+    }
+
+    /**
+     * Is a singleton instance defined?
+     *
+     * @return bool
+     */
+    public static function hasInstance()
+    {
+        return (static::$instance instanceof SharedEventManagerInterface);
+    }
+
+    /**
+     * Reset the singleton instance
+     *
+     * @return void
+     */
+    public static function resetInstance()
+    {
+        static::$instance = null;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/LICENSE.md
@@ -0,0 +1,28 @@
+Copyright (c) 2005-2015, Zend Technologies USA, Inc.
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+- Redistributions of source code must retain the above copyright notice,
+  this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+- Neither the name of Zend Technologies USA, Inc. nor the names of its
+  contributors may be used to endorse or promote products derived from this
+  software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/composer.json
@@ -0,0 +1,47 @@
+{
+    "name": "zendframework/zend-stdlib",
+    "description": " ",
+    "license": "BSD-3-Clause",
+    "keywords": [
+        "zf2",
+        "stdlib"
+    ],
+    "homepage": "https://github.com/zendframework/zend-stdlib",
+    "autoload": {
+        "psr-4": {
+            "Zend\\Stdlib\\": "src/"
+        }
+    },
+    "require": {
+        "php": ">=5.3.23"
+    },
+    "require-dev": {
+        "zendframework/zend-config": "~2.5",
+        "zendframework/zend-eventmanager": "~2.5",
+        "zendframework/zend-inputfilter": "~2.5",
+        "zendframework/zend-serializer": "~2.5",
+        "zendframework/zend-servicemanager": "~2.5",
+        "zendframework/zend-filter": "~2.5",
+        "fabpot/php-cs-fixer": "1.7.*",
+        "phpunit/PHPUnit": "~4.0"
+    },
+    "suggest": {
+        "zendframework/zend-eventmanager": "To support aggregate hydrator usage",
+        "zendframework/zend-serializer": "Zend\\Serializer component",
+        "zendframework/zend-servicemanager": "To support hydrator plugin manager usage",
+        "zendframework/zend-filter": "To support naming strategy hydrator usage"
+    },
+    "minimum-stability": "dev",
+    "prefer-stable": true,
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.5-dev",
+            "dev-develop": "2.6-dev"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "ZendTest\\Stdlib\\": "test/"
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/AbstractOptions.php
@@ -0,0 +1,176 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use Traversable;
+
+abstract class AbstractOptions implements ParameterObjectInterface
+{
+    /**
+     * We use the __ prefix to avoid collisions with properties in
+     * user-implementations.
+     *
+     * @var bool
+     */
+    protected $__strictMode__ = true;
+
+    /**
+     * Constructor
+     *
+     * @param  array|Traversable|null $options
+     */
+    public function __construct($options = null)
+    {
+        if (null !== $options) {
+            $this->setFromArray($options);
+        }
+    }
+
+    /**
+     * Set one or more configuration properties
+     *
+     * @param  array|Traversable|AbstractOptions $options
+     * @throws Exception\InvalidArgumentException
+     * @return AbstractOptions Provides fluent interface
+     */
+    public function setFromArray($options)
+    {
+        if ($options instanceof self) {
+            $options = $options->toArray();
+        }
+
+        if (!is_array($options) && !$options instanceof Traversable) {
+            throw new Exception\InvalidArgumentException(
+                sprintf(
+                    'Parameter provided to %s must be an %s, %s or %s',
+                    __METHOD__,
+                    'array',
+                    'Traversable',
+                    'Zend\Stdlib\AbstractOptions'
+                )
+            );
+        }
+
+        foreach ($options as $key => $value) {
+            $this->__set($key, $value);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Cast to array
+     *
+     * @return array
+     */
+    public function toArray()
+    {
+        $array = array();
+        $transform = function ($letters) {
+            $letter = array_shift($letters);
+            return '_' . strtolower($letter);
+        };
+        foreach ($this as $key => $value) {
+            if ($key === '__strictMode__') {
+                continue;
+            }
+            $normalizedKey = preg_replace_callback('/([A-Z])/', $transform, $key);
+            $array[$normalizedKey] = $value;
+        }
+        return $array;
+    }
+
+    /**
+     * Set a configuration property
+     *
+     * @see ParameterObject::__set()
+     * @param string $key
+     * @param mixed $value
+     * @throws Exception\BadMethodCallException
+     * @return void
+     */
+    public function __set($key, $value)
+    {
+        $setter = 'set' . str_replace('_', '', $key);
+
+        if (is_callable(array($this, $setter))) {
+            $this->{$setter}($value);
+
+            return;
+        }
+
+        if ($this->__strictMode__) {
+            throw new Exception\BadMethodCallException(sprintf(
+                'The option "%s" does not have a callable "%s" ("%s") setter method which must be defined',
+                $key,
+                'set' . str_replace(' ', '', ucwords(str_replace('_', ' ', $key))),
+                $setter
+            ));
+        }
+    }
+
+    /**
+     * Get a configuration property
+     *
+     * @see ParameterObject::__get()
+     * @param string $key
+     * @throws Exception\BadMethodCallException
+     * @return mixed
+     */
+    public function __get($key)
+    {
+        $getter = 'get' . str_replace('_', '', $key);
+
+        if (is_callable(array($this, $getter))) {
+            return $this->{$getter}();
+        }
+
+        throw new Exception\BadMethodCallException(sprintf(
+            'The option "%s" does not have a callable "%s" getter method which must be defined',
+            $key,
+            'get' . str_replace(' ', '', ucwords(str_replace('_', ' ', $key)))
+        ));
+    }
+
+    /**
+     * Test if a configuration property is null
+     * @see ParameterObject::__isset()
+     * @param string $key
+     * @return bool
+     */
+    public function __isset($key)
+    {
+        $getter = 'get' . str_replace('_', '', $key);
+
+        return method_exists($this, $getter) && null !== $this->__get($key);
+    }
+
+    /**
+     * Set a configuration property to NULL
+     *
+     * @see ParameterObject::__unset()
+     * @param string $key
+     * @throws Exception\InvalidArgumentException
+     * @return void
+     */
+    public function __unset($key)
+    {
+        try {
+            $this->__set($key, null);
+        } catch (Exception\BadMethodCallException $e) {
+            throw new Exception\InvalidArgumentException(
+                'The class property $' . $key . ' cannot be unset as'
+                . ' NULL is an invalid value for it',
+                0,
+                $e
+            );
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/ArrayObject.php
@@ -0,0 +1,432 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use ArrayAccess;
+use Countable;
+use IteratorAggregate;
+use Serializable;
+
+/**
+ * Custom framework ArrayObject implementation
+ *
+ * Extends version-specific "abstract" implementation.
+ */
+class ArrayObject implements IteratorAggregate, ArrayAccess, Serializable, Countable
+{
+    /**
+     * Properties of the object have their normal functionality
+     * when accessed as list (var_dump, foreach, etc.).
+     */
+    const STD_PROP_LIST = 1;
+
+    /**
+     * Entries can be accessed as properties (read and write).
+     */
+    const ARRAY_AS_PROPS = 2;
+
+    /**
+     * @var array
+     */
+    protected $storage;
+
+    /**
+     * @var int
+     */
+    protected $flag;
+
+    /**
+     * @var string
+     */
+    protected $iteratorClass;
+
+    /**
+     * @var array
+     */
+    protected $protectedProperties;
+
+    /**
+     * Constructor
+     *
+     * @param array  $input
+     * @param int    $flags
+     * @param string $iteratorClass
+     */
+    public function __construct($input = array(), $flags = self::STD_PROP_LIST, $iteratorClass = 'ArrayIterator')
+    {
+        $this->setFlags($flags);
+        $this->storage = $input;
+        $this->setIteratorClass($iteratorClass);
+        $this->protectedProperties = array_keys(get_object_vars($this));
+    }
+
+    /**
+     * Returns whether the requested key exists
+     *
+     * @param  mixed $key
+     * @return bool
+     */
+    public function __isset($key)
+    {
+        if ($this->flag == self::ARRAY_AS_PROPS) {
+            return $this->offsetExists($key);
+        }
+        if (in_array($key, $this->protectedProperties)) {
+            throw new Exception\InvalidArgumentException('$key is a protected property, use a different key');
+        }
+
+        return isset($this->$key);
+    }
+
+    /**
+     * Sets the value at the specified key to value
+     *
+     * @param  mixed $key
+     * @param  mixed $value
+     * @return void
+     */
+    public function __set($key, $value)
+    {
+        if ($this->flag == self::ARRAY_AS_PROPS) {
+            return $this->offsetSet($key, $value);
+        }
+        if (in_array($key, $this->protectedProperties)) {
+            throw new Exception\InvalidArgumentException('$key is a protected property, use a different key');
+        }
+        $this->$key = $value;
+    }
+
+    /**
+     * Unsets the value at the specified key
+     *
+     * @param  mixed $key
+     * @return void
+     */
+    public function __unset($key)
+    {
+        if ($this->flag == self::ARRAY_AS_PROPS) {
+            return $this->offsetUnset($key);
+        }
+        if (in_array($key, $this->protectedProperties)) {
+            throw new Exception\InvalidArgumentException('$key is a protected property, use a different key');
+        }
+        unset($this->$key);
+    }
+
+    /**
+     * Returns the value at the specified key by reference
+     *
+     * @param  mixed $key
+     * @return mixed
+     */
+    public function &__get($key)
+    {
+        $ret = null;
+        if ($this->flag == self::ARRAY_AS_PROPS) {
+            $ret =& $this->offsetGet($key);
+
+            return $ret;
+        }
+        if (in_array($key, $this->protectedProperties)) {
+            throw new Exception\InvalidArgumentException('$key is a protected property, use a different key');
+        }
+
+        return $this->$key;
+    }
+
+    /**
+     * Appends the value
+     *
+     * @param  mixed $value
+     * @return void
+     */
+    public function append($value)
+    {
+        $this->storage[] = $value;
+    }
+
+    /**
+     * Sort the entries by value
+     *
+     * @return void
+     */
+    public function asort()
+    {
+        asort($this->storage);
+    }
+
+    /**
+     * Get the number of public properties in the ArrayObject
+     *
+     * @return int
+     */
+    public function count()
+    {
+        return count($this->storage);
+    }
+
+    /**
+     * Exchange the array for another one.
+     *
+     * @param  array|ArrayObject $data
+     * @return array
+     */
+    public function exchangeArray($data)
+    {
+        if (!is_array($data) && !is_object($data)) {
+            throw new Exception\InvalidArgumentException('Passed variable is not an array or object, using empty array instead');
+        }
+
+        if (is_object($data) && ($data instanceof self || $data instanceof \ArrayObject)) {
+            $data = $data->getArrayCopy();
+        }
+        if (!is_array($data)) {
+            $data = (array) $data;
+        }
+
+        $storage = $this->storage;
+
+        $this->storage = $data;
+
+        return $storage;
+    }
+
+    /**
+     * Creates a copy of the ArrayObject.
+     *
+     * @return array
+     */
+    public function getArrayCopy()
+    {
+        return $this->storage;
+    }
+
+    /**
+     * Gets the behavior flags.
+     *
+     * @return int
+     */
+    public function getFlags()
+    {
+        return $this->flag;
+    }
+
+    /**
+     * Create a new iterator from an ArrayObject instance
+     *
+     * @return \Iterator
+     */
+    public function getIterator()
+    {
+        $class = $this->iteratorClass;
+
+        return new $class($this->storage);
+    }
+
+    /**
+     * Gets the iterator classname for the ArrayObject.
+     *
+     * @return string
+     */
+    public function getIteratorClass()
+    {
+        return $this->iteratorClass;
+    }
+
+    /**
+     * Sort the entries by key
+     *
+     * @return void
+     */
+    public function ksort()
+    {
+        ksort($this->storage);
+    }
+
+    /**
+     * Sort an array using a case insensitive "natural order" algorithm
+     *
+     * @return void
+     */
+    public function natcasesort()
+    {
+        natcasesort($this->storage);
+    }
+
+    /**
+     * Sort entries using a "natural order" algorithm
+     *
+     * @return void
+     */
+    public function natsort()
+    {
+        natsort($this->storage);
+    }
+
+    /**
+     * Returns whether the requested key exists
+     *
+     * @param  mixed $key
+     * @return bool
+     */
+    public function offsetExists($key)
+    {
+        return isset($this->storage[$key]);
+    }
+
+    /**
+     * Returns the value at the specified key
+     *
+     * @param  mixed $key
+     * @return mixed
+     */
+    public function &offsetGet($key)
+    {
+        $ret = null;
+        if (!$this->offsetExists($key)) {
+            return $ret;
+        }
+        $ret =& $this->storage[$key];
+
+        return $ret;
+    }
+
+    /**
+     * Sets the value at the specified key to value
+     *
+     * @param  mixed $key
+     * @param  mixed $value
+     * @return void
+     */
+    public function offsetSet($key, $value)
+    {
+        $this->storage[$key] = $value;
+    }
+
+    /**
+     * Unsets the value at the specified key
+     *
+     * @param  mixed $key
+     * @return void
+     */
+    public function offsetUnset($key)
+    {
+        if ($this->offsetExists($key)) {
+            unset($this->storage[$key]);
+        }
+    }
+
+    /**
+     * Serialize an ArrayObject
+     *
+     * @return string
+     */
+    public function serialize()
+    {
+        return serialize(get_object_vars($this));
+    }
+
+    /**
+     * Sets the behavior flags
+     *
+     * @param  int  $flags
+     * @return void
+     */
+    public function setFlags($flags)
+    {
+        $this->flag = $flags;
+    }
+
+    /**
+     * Sets the iterator classname for the ArrayObject
+     *
+     * @param  string $class
+     * @return void
+     */
+    public function setIteratorClass($class)
+    {
+        if (class_exists($class)) {
+            $this->iteratorClass = $class;
+
+            return ;
+        }
+
+        if (strpos($class, '\\') === 0) {
+            $class = '\\' . $class;
+            if (class_exists($class)) {
+                $this->iteratorClass = $class;
+
+                return ;
+            }
+        }
+
+        throw new Exception\InvalidArgumentException('The iterator class does not exist');
+    }
+
+    /**
+     * Sort the entries with a user-defined comparison function and maintain key association
+     *
+     * @param  callable $function
+     * @return void
+     */
+    public function uasort($function)
+    {
+        if (is_callable($function)) {
+            uasort($this->storage, $function);
+        }
+    }
+
+    /**
+     * Sort the entries by keys using a user-defined comparison function
+     *
+     * @param  callable $function
+     * @return void
+     */
+    public function uksort($function)
+    {
+        if (is_callable($function)) {
+            uksort($this->storage, $function);
+        }
+    }
+
+    /**
+     * Unserialize an ArrayObject
+     *
+     * @param  string $data
+     * @return void
+     */
+    public function unserialize($data)
+    {
+        $ar                        = unserialize($data);
+        $this->protectedProperties = array_keys(get_object_vars($this));
+
+        $this->setFlags($ar['flag']);
+        $this->exchangeArray($ar['storage']);
+        $this->setIteratorClass($ar['iteratorClass']);
+
+        foreach ($ar as $k => $v) {
+            switch ($k) {
+                case 'flag':
+                    $this->setFlags($v);
+                    break;
+                case 'storage':
+                    $this->exchangeArray($v);
+                    break;
+                case 'iteratorClass':
+                    $this->setIteratorClass($v);
+                    break;
+                case 'protectedProperties':
+                    continue;
+                default:
+                    $this->__set($k, $v);
+            }
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/ArraySerializableInterface.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+interface ArraySerializableInterface
+{
+    /**
+     * Exchange internal values from provided array
+     *
+     * @param  array $array
+     * @return void
+     */
+    public function exchangeArray(array $array);
+
+    /**
+     * Return an array representation of the object
+     *
+     * @return array
+     */
+    public function getArrayCopy();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/ArrayStack.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use ArrayIterator;
+use ArrayObject as PhpArrayObject;
+
+/**
+ * ArrayObject that acts as a stack with regards to iteration
+ */
+class ArrayStack extends PhpArrayObject
+{
+    /**
+     * Retrieve iterator
+     *
+     * Retrieve an array copy of the object, reverse its order, and return an
+     * ArrayIterator with that reversed array.
+     *
+     * @return ArrayIterator
+     */
+    public function getIterator()
+    {
+        $array = $this->getArrayCopy();
+        return new ArrayIterator(array_reverse($array));
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/ArrayUtils.php
@@ -0,0 +1,335 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use Traversable;
+use Zend\Stdlib\ArrayUtils\MergeRemoveKey;
+use Zend\Stdlib\ArrayUtils\MergeReplaceKeyInterface;
+
+/**
+ * Utility class for testing and manipulation of PHP arrays.
+ *
+ * Declared abstract, as we have no need for instantiation.
+ */
+abstract class ArrayUtils
+{
+    /**
+     * Compatibility Flag for ArrayUtils::filter
+     */
+    const ARRAY_FILTER_USE_BOTH = 1;
+
+    /**
+     * Compatibility Flag for ArrayUtils::filter
+     */
+    const ARRAY_FILTER_USE_KEY  = 2;
+
+    /**
+     * Test whether an array contains one or more string keys
+     *
+     * @param  mixed $value
+     * @param  bool  $allowEmpty    Should an empty array() return true
+     * @return bool
+     */
+    public static function hasStringKeys($value, $allowEmpty = false)
+    {
+        if (!is_array($value)) {
+            return false;
+        }
+
+        if (!$value) {
+            return $allowEmpty;
+        }
+
+        return count(array_filter(array_keys($value), 'is_string')) > 0;
+    }
+
+    /**
+     * Test whether an array contains one or more integer keys
+     *
+     * @param  mixed $value
+     * @param  bool  $allowEmpty    Should an empty array() return true
+     * @return bool
+     */
+    public static function hasIntegerKeys($value, $allowEmpty = false)
+    {
+        if (!is_array($value)) {
+            return false;
+        }
+
+        if (!$value) {
+            return $allowEmpty;
+        }
+
+        return count(array_filter(array_keys($value), 'is_int')) > 0;
+    }
+
+    /**
+     * Test whether an array contains one or more numeric keys.
+     *
+     * A numeric key can be one of the following:
+     * - an integer 1,
+     * - a string with a number '20'
+     * - a string with negative number: '-1000'
+     * - a float: 2.2120, -78.150999
+     * - a string with float:  '4000.99999', '-10.10'
+     *
+     * @param  mixed $value
+     * @param  bool  $allowEmpty    Should an empty array() return true
+     * @return bool
+     */
+    public static function hasNumericKeys($value, $allowEmpty = false)
+    {
+        if (!is_array($value)) {
+            return false;
+        }
+
+        if (!$value) {
+            return $allowEmpty;
+        }
+
+        return count(array_filter(array_keys($value), 'is_numeric')) > 0;
+    }
+
+    /**
+     * Test whether an array is a list
+     *
+     * A list is a collection of values assigned to continuous integer keys
+     * starting at 0 and ending at count() - 1.
+     *
+     * For example:
+     * <code>
+     * $list = array('a', 'b', 'c', 'd');
+     * $list = array(
+     *     0 => 'foo',
+     *     1 => 'bar',
+     *     2 => array('foo' => 'baz'),
+     * );
+     * </code>
+     *
+     * @param  mixed $value
+     * @param  bool  $allowEmpty    Is an empty list a valid list?
+     * @return bool
+     */
+    public static function isList($value, $allowEmpty = false)
+    {
+        if (!is_array($value)) {
+            return false;
+        }
+
+        if (!$value) {
+            return $allowEmpty;
+        }
+
+        return (array_values($value) === $value);
+    }
+
+    /**
+     * Test whether an array is a hash table.
+     *
+     * An array is a hash table if:
+     *
+     * 1. Contains one or more non-integer keys, or
+     * 2. Integer keys are non-continuous or misaligned (not starting with 0)
+     *
+     * For example:
+     * <code>
+     * $hash = array(
+     *     'foo' => 15,
+     *     'bar' => false,
+     * );
+     * $hash = array(
+     *     1995  => 'Birth of PHP',
+     *     2009  => 'PHP 5.3.0',
+     *     2012  => 'PHP 5.4.0',
+     * );
+     * $hash = array(
+     *     'formElement,
+     *     'options' => array( 'debug' => true ),
+     * );
+     * </code>
+     *
+     * @param  mixed $value
+     * @param  bool  $allowEmpty    Is an empty array() a valid hash table?
+     * @return bool
+     */
+    public static function isHashTable($value, $allowEmpty = false)
+    {
+        if (!is_array($value)) {
+            return false;
+        }
+
+        if (!$value) {
+            return $allowEmpty;
+        }
+
+        return (array_values($value) !== $value);
+    }
+
+    /**
+     * Checks if a value exists in an array.
+     *
+     * Due to "foo" == 0 === TRUE with in_array when strict = false, an option
+     * has been added to prevent this. When $strict = 0/false, the most secure
+     * non-strict check is implemented. if $strict = -1, the default in_array
+     * non-strict behaviour is used.
+     *
+     * @param mixed $needle
+     * @param array $haystack
+     * @param int|bool $strict
+     * @return bool
+     */
+    public static function inArray($needle, array $haystack, $strict = false)
+    {
+        if (!$strict) {
+            if (is_int($needle) || is_float($needle)) {
+                $needle = (string) $needle;
+            }
+            if (is_string($needle)) {
+                foreach ($haystack as &$h) {
+                    if (is_int($h) || is_float($h)) {
+                        $h = (string) $h;
+                    }
+                }
+            }
+        }
+        return in_array($needle, $haystack, $strict);
+    }
+
+    /**
+     * Convert an iterator to an array.
+     *
+     * Converts an iterator to an array. The $recursive flag, on by default,
+     * hints whether or not you want to do so recursively.
+     *
+     * @param  array|Traversable  $iterator     The array or Traversable object to convert
+     * @param  bool               $recursive    Recursively check all nested structures
+     * @throws Exception\InvalidArgumentException if $iterator is not an array or a Traversable object
+     * @return array
+     */
+    public static function iteratorToArray($iterator, $recursive = true)
+    {
+        if (!is_array($iterator) && !$iterator instanceof Traversable) {
+            throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable object');
+        }
+
+        if (!$recursive) {
+            if (is_array($iterator)) {
+                return $iterator;
+            }
+
+            return iterator_to_array($iterator);
+        }
+
+        if (method_exists($iterator, 'toArray')) {
+            return $iterator->toArray();
+        }
+
+        $array = array();
+        foreach ($iterator as $key => $value) {
+            if (is_scalar($value)) {
+                $array[$key] = $value;
+                continue;
+            }
+
+            if ($value instanceof Traversable) {
+                $array[$key] = static::iteratorToArray($value, $recursive);
+                continue;
+            }
+
+            if (is_array($value)) {
+                $array[$key] = static::iteratorToArray($value, $recursive);
+                continue;
+            }
+
+            $array[$key] = $value;
+        }
+
+        return $array;
+    }
+
+    /**
+     * Merge two arrays together.
+     *
+     * If an integer key exists in both arrays and preserveNumericKeys is false, the value
+     * from the second array will be appended to the first array. If both values are arrays, they
+     * are merged together, else the value of the second array overwrites the one of the first array.
+     *
+     * @param  array $a
+     * @param  array $b
+     * @param  bool  $preserveNumericKeys
+     * @return array
+     */
+    public static function merge(array $a, array $b, $preserveNumericKeys = false)
+    {
+        foreach ($b as $key => $value) {
+            if ($value instanceof MergeReplaceKeyInterface) {
+                $a[$key] = $value->getData();
+            } elseif (isset($a[$key]) || array_key_exists($key, $a)) {
+                if ($value instanceof MergeRemoveKey) {
+                    unset($a[$key]);
+                } elseif (!$preserveNumericKeys && is_int($key)) {
+                    $a[] = $value;
+                } elseif (is_array($value) && is_array($a[$key])) {
+                    $a[$key] = static::merge($a[$key], $value, $preserveNumericKeys);
+                } else {
+                    $a[$key] = $value;
+                }
+            } else {
+                if (!$value instanceof MergeRemoveKey) {
+                    $a[$key] = $value;
+                }
+            }
+        }
+
+        return $a;
+    }
+
+    /**
+     * Compatibility Method for array_filter on <5.6 systems
+     *
+     * @param array $data
+     * @param callable $callback
+     * @param null|int $flag
+     * @return array
+     */
+    public static function filter(array $data, $callback, $flag = null)
+    {
+        if (! is_callable($callback)) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                'Second parameter of %s must be callable',
+                __METHOD__
+            ));
+        }
+
+        if (version_compare(PHP_VERSION, '5.6.0') >= 0) {
+            return array_filter($data, $callback, $flag);
+        }
+
+        $output = array();
+        foreach ($data as $key => $value) {
+            $params = array($value);
+
+            if ($flag === static::ARRAY_FILTER_USE_BOTH) {
+                $params[] = $key;
+            }
+
+            if ($flag === static::ARRAY_FILTER_USE_KEY) {
+                $params = array($key);
+            }
+
+            $response = call_user_func_array($callback, $params);
+            if ($response) {
+                $output[$key] = $value;
+            }
+        }
+
+        return $output;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/ArrayUtils/MergeRemoveKey.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\ArrayUtils;
+
+final class MergeRemoveKey
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/ArrayUtils/MergeReplaceKey.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\ArrayUtils;
+
+final class MergeReplaceKey implements MergeReplaceKeyInterface
+{
+    /**
+     * @var mixed
+     */
+    protected $data;
+
+    /**
+     * @param mixed $data
+     */
+    public function __construct($data)
+    {
+        $this->data = $data;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getData()
+    {
+        return $this->data;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/ArrayUtils/MergeReplaceKeyInterface.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\ArrayUtils;
+
+/**
+ * Marker interface: can be used to replace keys completely in {@see ArrayUtils::merge()} operations
+ */
+interface MergeReplaceKeyInterface
+{
+    /**
+     * @return mixed
+     */
+    public function getData();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/CallbackHandler.php
@@ -0,0 +1,217 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use ReflectionClass;
+
+/**
+ * CallbackHandler
+ *
+ * A handler for an event, event, filterchain, etc. Abstracts PHP callbacks,
+ * primarily to allow for lazy-loading and ensuring availability of default
+ * arguments (currying).
+ */
+class CallbackHandler
+{
+    /**
+     * @var string|array|callable PHP callback to invoke
+     */
+    protected $callback;
+
+    /**
+     * Callback metadata, if any
+     * @var array
+     */
+    protected $metadata;
+
+    /**
+     * PHP version is greater as 5.4rc1?
+     * @var bool
+     */
+    protected static $isPhp54;
+
+    /**
+     * Constructor
+     *
+     * @param  string|array|object|callable $callback PHP callback
+     * @param  array                        $metadata  Callback metadata
+     */
+    public function __construct($callback, array $metadata = array())
+    {
+        $this->metadata  = $metadata;
+        $this->registerCallback($callback);
+    }
+
+    /**
+     * Registers the callback provided in the constructor
+     *
+     * @param  callable $callback
+     * @throws Exception\InvalidCallbackException
+     * @return void
+     */
+    protected function registerCallback($callback)
+    {
+        if (!is_callable($callback)) {
+            throw new Exception\InvalidCallbackException('Invalid callback provided; not callable');
+        }
+
+        $this->callback = $callback;
+    }
+
+    /**
+     * Retrieve registered callback
+     *
+     * @return callable
+     */
+    public function getCallback()
+    {
+        return $this->callback;
+    }
+
+    /**
+     * Invoke handler
+     *
+     * @param  array $args Arguments to pass to callback
+     * @return mixed
+     */
+    public function call(array $args = array())
+    {
+        $callback = $this->getCallback();
+
+        // Minor performance tweak, if the callback gets called more than once
+        if (!isset(static::$isPhp54)) {
+            static::$isPhp54 = version_compare(PHP_VERSION, '5.4.0rc1', '>=');
+        }
+
+        $argCount = count($args);
+
+        if (static::$isPhp54 && is_string($callback)) {
+            $result = $this->validateStringCallbackFor54($callback);
+
+            if ($result !== true && $argCount <= 3) {
+                $callback       = $result;
+                // Minor performance tweak, if the callback gets called more
+                // than once
+                $this->callback = $result;
+            }
+        }
+
+        // Minor performance tweak; use call_user_func() until > 3 arguments
+        // reached
+        switch ($argCount) {
+            case 0:
+                if (static::$isPhp54) {
+                    return $callback();
+                }
+                return call_user_func($callback);
+            case 1:
+                if (static::$isPhp54) {
+                    return $callback(array_shift($args));
+                }
+                return call_user_func($callback, array_shift($args));
+            case 2:
+                $arg1 = array_shift($args);
+                $arg2 = array_shift($args);
+                if (static::$isPhp54) {
+                    return $callback($arg1, $arg2);
+                }
+                return call_user_func($callback, $arg1, $arg2);
+            case 3:
+                $arg1 = array_shift($args);
+                $arg2 = array_shift($args);
+                $arg3 = array_shift($args);
+                if (static::$isPhp54) {
+                    return $callback($arg1, $arg2, $arg3);
+                }
+                return call_user_func($callback, $arg1, $arg2, $arg3);
+            default:
+                return call_user_func_array($callback, $args);
+        }
+    }
+
+    /**
+     * Invoke as functor
+     *
+     * @return mixed
+     */
+    public function __invoke()
+    {
+        return $this->call(func_get_args());
+    }
+
+    /**
+     * Get all callback metadata
+     *
+     * @return array
+     */
+    public function getMetadata()
+    {
+        return $this->metadata;
+    }
+
+    /**
+     * Retrieve a single metadatum
+     *
+     * @param  string $name
+     * @return mixed
+     */
+    public function getMetadatum($name)
+    {
+        if (array_key_exists($name, $this->metadata)) {
+            return $this->metadata[$name];
+        }
+        return;
+    }
+
+    /**
+     * Validate a static method call
+     *
+     * Validates that a static method call in PHP 5.4 will actually work
+     *
+     * @param  string $callback
+     * @return true|array
+     * @throws Exception\InvalidCallbackException if invalid
+     */
+    protected function validateStringCallbackFor54($callback)
+    {
+        if (!strstr($callback, '::')) {
+            return true;
+        }
+
+        list($class, $method) = explode('::', $callback, 2);
+
+        if (!class_exists($class)) {
+            throw new Exception\InvalidCallbackException(sprintf(
+                'Static method call "%s" refers to a class that does not exist',
+                $callback
+            ));
+        }
+
+        $r = new ReflectionClass($class);
+        if (!$r->hasMethod($method)) {
+            throw new Exception\InvalidCallbackException(sprintf(
+                'Static method call "%s" refers to a method that does not exist',
+                $callback
+            ));
+        }
+        $m = $r->getMethod($method);
+        if (!$m->isStatic()) {
+            throw new Exception\InvalidCallbackException(sprintf(
+                'Static method call "%s" refers to a method that is not static',
+                $callback
+            ));
+        }
+
+        // returning a non boolean value may not be nice for a validate method,
+        // but that allows the usage of a static string callback without using
+        // the call_user_func function.
+        return array($class, $method);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/DateTime.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use DateTimeZone;
+
+trigger_error('DateTime extension deprecated as of ZF 2.1.4; use the \DateTime constructor to parse extended ISO8601 dates instead', E_USER_DEPRECATED);
+
+/**
+ * DateTime
+ *
+ * An extension of the \DateTime object.
+ *
+ * @deprecated
+ */
+class DateTime extends \DateTime
+{
+    /**
+     * The DateTime::ISO8601 constant used by php's native DateTime object does
+     * not allow for fractions of a second. This function better handles ISO8601
+     * formatted date strings.
+     *
+     * @param  string       $time
+     * @param  DateTimeZone $timezone
+     * @return mixed
+     */
+    public static function createFromISO8601($time, DateTimeZone $timezone = null)
+    {
+        $format = self::ISO8601;
+        if (isset($time[19]) && $time[19] === '.') {
+            $format = 'Y-m-d\TH:i:s.uO';
+        }
+
+        if ($timezone !== null) {
+            return self::createFromFormat($format, $time, $timezone);
+        }
+
+        return self::createFromFormat($format, $time);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/DispatchableInterface.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+interface DispatchableInterface
+{
+    /**
+     * Dispatch a request
+     *
+     * @param RequestInterface $request
+     * @param null|ResponseInterface $response
+     * @return Response|mixed
+     */
+    public function dispatch(RequestInterface $request, ResponseInterface $response = null);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/ErrorHandler.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use ErrorException;
+
+/**
+ * ErrorHandler that can be used to catch internal PHP errors
+ * and convert to an ErrorException instance.
+ */
+abstract class ErrorHandler
+{
+    /**
+     * Active stack
+     *
+     * @var array
+     */
+    protected static $stack = array();
+
+    /**
+     * Check if this error handler is active
+     *
+     * @return bool
+     */
+    public static function started()
+    {
+        return (bool) static::getNestedLevel();
+    }
+
+    /**
+     * Get the current nested level
+     *
+     * @return int
+     */
+    public static function getNestedLevel()
+    {
+        return count(static::$stack);
+    }
+
+    /**
+     * Starting the error handler
+     *
+     * @param int $errorLevel
+     */
+    public static function start($errorLevel = \E_WARNING)
+    {
+        if (!static::$stack) {
+            set_error_handler(array(get_called_class(), 'addError'), $errorLevel);
+        }
+
+        static::$stack[] = null;
+    }
+
+    /**
+     * Stopping the error handler
+     *
+     * @param  bool $throw Throw the ErrorException if any
+     * @return null|ErrorException
+     * @throws ErrorException If an error has been catched and $throw is true
+     */
+    public static function stop($throw = false)
+    {
+        $errorException = null;
+
+        if (static::$stack) {
+            $errorException = array_pop(static::$stack);
+
+            if (!static::$stack) {
+                restore_error_handler();
+            }
+
+            if ($errorException && $throw) {
+                throw $errorException;
+            }
+        }
+
+        return $errorException;
+    }
+
+    /**
+     * Stop all active handler
+     *
+     * @return void
+     */
+    public static function clean()
+    {
+        if (static::$stack) {
+            restore_error_handler();
+        }
+
+        static::$stack = array();
+    }
+
+    /**
+     * Add an error to the stack
+     *
+     * @param int    $errno
+     * @param string $errstr
+     * @param string $errfile
+     * @param int    $errline
+     * @return void
+     */
+    public static function addError($errno, $errstr = '', $errfile = '', $errline = 0)
+    {
+        $stack = & static::$stack[count(static::$stack) - 1];
+        $stack = new ErrorException($errstr, 0, $errno, $errfile, $errline, $stack);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Exception/BadMethodCallException.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Exception;
+
+/**
+ * Bad method call exception
+ */
+class BadMethodCallException extends \BadMethodCallException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Exception/DomainException.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Exception;
+
+/**
+ * Domain exception
+ */
+class DomainException extends \DomainException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Exception/ExceptionInterface.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Exception;
+
+/**
+ * Exception marker interface
+ */
+interface ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Exception/ExtensionNotLoadedException.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Exception;
+
+/**
+ * Extension not loaded exception
+ */
+class ExtensionNotLoadedException extends RuntimeException
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Exception/InvalidArgumentException.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Exception;
+
+/**
+ * Invalid Argument Exception
+ */
+class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Exception/InvalidCallbackException.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Exception;
+
+/**
+ * Invalid callback exception
+ */
+class InvalidCallbackException extends DomainException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Exception/LogicException.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Exception;
+
+/**
+ * Logic exception
+ */
+class LogicException extends \LogicException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Exception/RuntimeException.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Exception;
+
+/**
+ * Runtime exception
+ */
+class RuntimeException extends \RuntimeException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Extractor/ExtractionInterface.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Extractor;
+
+interface ExtractionInterface
+{
+    /**
+     * Extract values from an object
+     *
+     * @param  object $object
+     * @return array
+     */
+    public function extract($object);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Glob.php
@@ -0,0 +1,202 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+/**
+ * Wrapper for glob with fallback if GLOB_BRACE is not available.
+ */
+abstract class Glob
+{
+    /**#@+
+     * Glob constants.
+     */
+    const GLOB_MARK     = 0x01;
+    const GLOB_NOSORT   = 0x02;
+    const GLOB_NOCHECK  = 0x04;
+    const GLOB_NOESCAPE = 0x08;
+    const GLOB_BRACE    = 0x10;
+    const GLOB_ONLYDIR  = 0x20;
+    const GLOB_ERR      = 0x40;
+    /**#@-*/
+
+    /**
+     * Find pathnames matching a pattern.
+     *
+     * @see    http://docs.php.net/glob
+     * @param  string  $pattern
+     * @param  int $flags
+     * @param  bool $forceFallback
+     * @return array
+     * @throws Exception\RuntimeException
+     */
+    public static function glob($pattern, $flags = 0, $forceFallback = false)
+    {
+        if (!defined('GLOB_BRACE') || $forceFallback) {
+            return static::fallbackGlob($pattern, $flags);
+        }
+
+        return static::systemGlob($pattern, $flags);
+    }
+
+    /**
+     * Use the glob function provided by the system.
+     *
+     * @param  string  $pattern
+     * @param  int     $flags
+     * @return array
+     * @throws Exception\RuntimeException
+     */
+    protected static function systemGlob($pattern, $flags)
+    {
+        if ($flags) {
+            $flagMap = array(
+                self::GLOB_MARK     => GLOB_MARK,
+                self::GLOB_NOSORT   => GLOB_NOSORT,
+                self::GLOB_NOCHECK  => GLOB_NOCHECK,
+                self::GLOB_NOESCAPE => GLOB_NOESCAPE,
+                self::GLOB_BRACE    => GLOB_BRACE,
+                self::GLOB_ONLYDIR  => GLOB_ONLYDIR,
+                self::GLOB_ERR      => GLOB_ERR,
+            );
+
+            $globFlags = 0;
+
+            foreach ($flagMap as $internalFlag => $globFlag) {
+                if ($flags & $internalFlag) {
+                    $globFlags |= $globFlag;
+                }
+            }
+        } else {
+            $globFlags = 0;
+        }
+
+        ErrorHandler::start();
+        $res = glob($pattern, $globFlags);
+        $err = ErrorHandler::stop();
+        if ($res === false) {
+            throw new Exception\RuntimeException("glob('{$pattern}', {$globFlags}) failed", 0, $err);
+        }
+        return $res;
+    }
+
+    /**
+     * Expand braces manually, then use the system glob.
+     *
+     * @param  string  $pattern
+     * @param  int     $flags
+     * @return array
+     * @throws Exception\RuntimeException
+     */
+    protected static function fallbackGlob($pattern, $flags)
+    {
+        if (!$flags & self::GLOB_BRACE) {
+            return static::systemGlob($pattern, $flags);
+        }
+
+        $flags &= ~self::GLOB_BRACE;
+        $length = strlen($pattern);
+        $paths  = array();
+
+        if ($flags & self::GLOB_NOESCAPE) {
+            $begin = strpos($pattern, '{');
+        } else {
+            $begin = 0;
+
+            while (true) {
+                if ($begin === $length) {
+                    $begin = false;
+                    break;
+                } elseif ($pattern[$begin] === '\\' && ($begin + 1) < $length) {
+                    $begin++;
+                } elseif ($pattern[$begin] === '{') {
+                    break;
+                }
+
+                $begin++;
+            }
+        }
+
+        if ($begin === false) {
+            return static::systemGlob($pattern, $flags);
+        }
+
+        $next = static::nextBraceSub($pattern, $begin + 1, $flags);
+
+        if ($next === null) {
+            return static::systemGlob($pattern, $flags);
+        }
+
+        $rest = $next;
+
+        while ($pattern[$rest] !== '}') {
+            $rest = static::nextBraceSub($pattern, $rest + 1, $flags);
+
+            if ($rest === null) {
+                return static::systemGlob($pattern, $flags);
+            }
+        }
+
+        $p = $begin + 1;
+
+        while (true) {
+            $subPattern = substr($pattern, 0, $begin)
+                        . substr($pattern, $p, $next - $p)
+                        . substr($pattern, $rest + 1);
+
+            $result = static::fallbackGlob($subPattern, $flags | self::GLOB_BRACE);
+
+            if ($result) {
+                $paths = array_merge($paths, $result);
+            }
+
+            if ($pattern[$next] === '}') {
+                break;
+            }
+
+            $p    = $next + 1;
+            $next = static::nextBraceSub($pattern, $p, $flags);
+        }
+
+        return array_unique($paths);
+    }
+
+    /**
+     * Find the end of the sub-pattern in a brace expression.
+     *
+     * @param  string  $pattern
+     * @param  int $begin
+     * @param  int $flags
+     * @return int|null
+     */
+    protected static function nextBraceSub($pattern, $begin, $flags)
+    {
+        $length  = strlen($pattern);
+        $depth   = 0;
+        $current = $begin;
+
+        while ($current < $length) {
+            if (!$flags & self::GLOB_NOESCAPE && $pattern[$current] === '\\') {
+                if (++$current === $length) {
+                    break;
+                }
+
+                $current++;
+            } else {
+                if (($pattern[$current] === '}' && $depth-- === 0) || ($pattern[$current] === ',' && $depth === 0)) {
+                    break;
+                } elseif ($pattern[$current++] === '{') {
+                    $depth++;
+                }
+            }
+        }
+
+        return ($current < $length ? $current : null);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Guard/AllGuardsTrait.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Guard;
+
+/**
+ * An aggregate for all guard traits
+ */
+trait AllGuardsTrait
+{
+    use ArrayOrTraversableGuardTrait;
+    use EmptyGuardTrait;
+    use NullGuardTrait;
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Guard/ArrayOrTraversableGuardTrait.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Guard;
+
+use Traversable;
+
+/**
+ * Provide a guard method for array or Traversable data
+ */
+trait ArrayOrTraversableGuardTrait
+{
+    /**
+     * Verifies that the data is an array or Traversable
+     *
+     * @param  mixed  $data           the data to verify
+     * @param  string $dataName       the data name
+     * @param  string $exceptionClass FQCN for the exception
+     * @throws \Exception
+     */
+    protected function guardForArrayOrTraversable(
+        $data,
+        $dataName = 'Argument',
+        $exceptionClass = 'Zend\Stdlib\Exception\InvalidArgumentException'
+    ) {
+        if (!is_array($data) && !($data instanceof Traversable)) {
+            $message = sprintf(
+                "%s must be an array or Traversable, [%s] given",
+                $dataName,
+                is_object($data) ? get_class($data) : gettype($data)
+            );
+            throw new $exceptionClass($message);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Guard/EmptyGuardTrait.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Guard;
+
+/**
+ * Provide a guard method against empty data
+ */
+trait EmptyGuardTrait
+{
+    /**
+     * Verify that the data is not empty
+     *
+     * @param  mixed  $data           the data to verify
+     * @param  string $dataName       the data name
+     * @param  string $exceptionClass FQCN for the exception
+     * @throws \Exception
+     */
+    protected function guardAgainstEmpty(
+        $data,
+        $dataName = 'Argument',
+        $exceptionClass = 'Zend\Stdlib\Exception\InvalidArgumentException'
+    ) {
+        if (empty($data)) {
+            $message = sprintf('%s cannot be empty', $dataName);
+            throw new $exceptionClass($message);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Guard/GuardUtils.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Guard;
+
+use Traversable;
+
+/**
+ * Static guard helper class
+ *
+ * Bridges the gap for allowing refactoring until traits can be used by default.
+ *
+ * @deprecated
+ */
+abstract class GuardUtils
+{
+    const DEFAULT_EXCEPTION_CLASS = 'Zend\Stdlib\Exception\InvalidArgumentException';
+
+    /**
+     * Verifies that the data is an array or Traversable
+     *
+     * @param  mixed  $data           the data to verify
+     * @param  string $dataName       the data name
+     * @param  string $exceptionClass FQCN for the exception
+     * @throws \Exception
+     */
+    public static function guardForArrayOrTraversable(
+        $data,
+        $dataName = 'Argument',
+        $exceptionClass = self::DEFAULT_EXCEPTION_CLASS
+    ) {
+        if (!is_array($data) && !($data instanceof Traversable)) {
+            $message = sprintf(
+                '%s must be an array or Traversable, [%s] given',
+                $dataName,
+                is_object($data) ? get_class($data) : gettype($data)
+            );
+            throw new $exceptionClass($message);
+        }
+    }
+
+    /**
+     * Verify that the data is not empty
+     *
+     * @param  mixed  $data           the data to verify
+     * @param  string $dataName       the data name
+     * @param  string $exceptionClass FQCN for the exception
+     * @throws \Exception
+     */
+    public static function guardAgainstEmpty(
+        $data,
+        $dataName = 'Argument',
+        $exceptionClass = self::DEFAULT_EXCEPTION_CLASS
+    ) {
+        if (empty($data)) {
+            $message = sprintf('%s cannot be empty', $dataName);
+            throw new $exceptionClass($message);
+        }
+    }
+
+    /**
+     * Verify that the data is not null
+     *
+     * @param  mixed  $data           the data to verify
+     * @param  string $dataName       the data name
+     * @param  string $exceptionClass FQCN for the exception
+     * @throws \Exception
+     */
+    public static function guardAgainstNull(
+        $data,
+        $dataName = 'Argument',
+        $exceptionClass = self::DEFAULT_EXCEPTION_CLASS
+    ) {
+        if (null === $data) {
+            $message = sprintf('%s cannot be null', $dataName);
+            throw new $exceptionClass($message);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Guard/NullGuardTrait.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Guard;
+
+/**
+ * Provide a guard method against null data
+ */
+trait NullGuardTrait
+{
+    /**
+     * Verify that the data is not null
+     *
+     * @param  mixed  $data           the data to verify
+     * @param  string $dataName       the data name
+     * @param  string $exceptionClass FQCN for the exception
+     * @throws \Exception
+     */
+    protected function guardAgainstNull(
+        $data,
+        $dataName = 'Argument',
+        $exceptionClass = 'Zend\Stdlib\Exception\InvalidArgumentException'
+    ) {
+        if (null === $data) {
+            $message = sprintf('%s cannot be null', $dataName);
+            throw new $exceptionClass($message);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/AbstractHydrator.php
@@ -0,0 +1,287 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator;
+
+use ArrayObject;
+use Zend\Stdlib\Exception;
+use Zend\Stdlib\Hydrator\Filter\FilterComposite;
+use Zend\Stdlib\Hydrator\NamingStrategy\NamingStrategyInterface;
+use Zend\Stdlib\Hydrator\Strategy\StrategyInterface;
+
+abstract class AbstractHydrator implements
+    HydratorInterface,
+    StrategyEnabledInterface,
+    FilterEnabledInterface,
+    NamingStrategyEnabledInterface
+{
+    /**
+     * The list with strategies that this hydrator has.
+     *
+     * @var ArrayObject
+     */
+    protected $strategies;
+
+    /**
+     * An instance of NamingStrategyInterface
+     *
+     * @var NamingStrategyInterface
+     */
+    protected $namingStrategy;
+
+    /**
+     * Composite to filter the methods, that need to be hydrated
+     *
+     * @var Filter\FilterComposite
+     */
+    protected $filterComposite;
+
+    /**
+     * Initializes a new instance of this class.
+     */
+    public function __construct()
+    {
+        $this->strategies = new ArrayObject();
+        $this->filterComposite = new FilterComposite();
+    }
+
+    /**
+     * Gets the strategy with the given name.
+     *
+     * @param string $name The name of the strategy to get.
+     *
+     * @throws \Zend\Stdlib\Exception\InvalidArgumentException
+     * @return StrategyInterface
+     */
+    public function getStrategy($name)
+    {
+        if (isset($this->strategies[$name])) {
+            return $this->strategies[$name];
+        }
+
+        if (!isset($this->strategies['*'])) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s: no strategy by name of "%s", and no wildcard strategy present',
+                __METHOD__,
+                $name
+            ));
+        }
+
+        return $this->strategies['*'];
+    }
+
+    /**
+     * Checks if the strategy with the given name exists.
+     *
+     * @param string $name The name of the strategy to check for.
+     * @return bool
+     */
+    public function hasStrategy($name)
+    {
+        return array_key_exists($name, $this->strategies)
+               || array_key_exists('*', $this->strategies);
+    }
+
+    /**
+     * Adds the given strategy under the given name.
+     *
+     * @param string $name The name of the strategy to register.
+     * @param StrategyInterface $strategy The strategy to register.
+     * @return HydratorInterface
+     */
+    public function addStrategy($name, StrategyInterface $strategy)
+    {
+        $this->strategies[$name] = $strategy;
+        return $this;
+    }
+
+    /**
+     * Removes the strategy with the given name.
+     *
+     * @param string $name The name of the strategy to remove.
+     * @return HydratorInterface
+     */
+    public function removeStrategy($name)
+    {
+        unset($this->strategies[$name]);
+        return $this;
+    }
+
+    /**
+     * Converts a value for extraction. If no strategy exists the plain value is returned.
+     *
+     * @param  string $name  The name of the strategy to use.
+     * @param  mixed  $value  The value that should be converted.
+     * @param  mixed  $object The object is optionally provided as context.
+     * @return mixed
+     */
+    public function extractValue($name, $value, $object = null)
+    {
+        if ($this->hasStrategy($name)) {
+            $strategy = $this->getStrategy($name);
+            $value = $strategy->extract($value, $object);
+        }
+        return $value;
+    }
+
+    /**
+     * Converts a value for hydration. If no strategy exists the plain value is returned.
+     *
+     * @param string $name The name of the strategy to use.
+     * @param mixed $value The value that should be converted.
+     * @param array $data The whole data is optionally provided as context.
+     * @return mixed
+     */
+    public function hydrateValue($name, $value, $data = null)
+    {
+        if ($this->hasStrategy($name)) {
+            $strategy = $this->getStrategy($name);
+            $value = $strategy->hydrate($value, $data);
+        }
+        return $value;
+    }
+
+    /**
+     * Convert a name for extraction. If no naming strategy exists, the plain value is returned.
+     *
+     * @param string $name    The name to convert.
+     * @param null   $object  The object is optionally provided as context.
+     * @return mixed
+     */
+    public function extractName($name, $object = null)
+    {
+        if ($this->hasNamingStrategy()) {
+            $name = $this->getNamingStrategy()->extract($name, $object);
+        }
+        return $name;
+    }
+
+    /**
+     * Converts a value for hydration. If no naming strategy exists, the plain value is returned.
+     *
+     * @param string $name  The name to convert.
+     * @param array  $data  The whole data is optionally provided as context.
+     * @return mixed
+     */
+    public function hydrateName($name, $data = null)
+    {
+        if ($this->hasNamingStrategy()) {
+            $name = $this->getNamingStrategy()->hydrate($name, $data);
+        }
+        return $name;
+    }
+
+    /**
+     * Get the filter instance
+     *
+     * @return Filter\FilterComposite
+     */
+    public function getFilter()
+    {
+        return $this->filterComposite;
+    }
+
+    /**
+     * Add a new filter to take care of what needs to be hydrated.
+     * To exclude e.g. the method getServiceLocator:
+     *
+     * <code>
+     * $composite->addFilter("servicelocator",
+     *     function ($property) {
+     *         list($class, $method) = explode('::', $property);
+     *         if ($method === 'getServiceLocator') {
+     *             return false;
+     *         }
+     *         return true;
+     *     }, FilterComposite::CONDITION_AND
+     * );
+     * </code>
+     *
+     * @param string $name Index in the composite
+     * @param callable|Filter\FilterInterface $filter
+     * @param int $condition
+     * @return Filter\FilterComposite
+     */
+    public function addFilter($name, $filter, $condition = FilterComposite::CONDITION_OR)
+    {
+        return $this->filterComposite->addFilter($name, $filter, $condition);
+    }
+
+    /**
+     * Check whether a specific filter exists at key $name or not
+     *
+     * @param string $name Index in the composite
+     * @return bool
+     */
+    public function hasFilter($name)
+    {
+        return $this->filterComposite->hasFilter($name);
+    }
+
+    /**
+     * Remove a filter from the composition.
+     * To not extract "has" methods, you simply need to unregister it
+     *
+     * <code>
+     * $filterComposite->removeFilter('has');
+     * </code>
+     *
+     * @param $name
+     * @return Filter\FilterComposite
+     */
+    public function removeFilter($name)
+    {
+        return $this->filterComposite->removeFilter($name);
+    }
+
+    /**
+     * Adds the given naming strategy
+     *
+     * @param NamingStrategyInterface $strategy The naming to register.
+     * @return self
+     */
+    public function setNamingStrategy(NamingStrategyInterface $strategy)
+    {
+        $this->namingStrategy = $strategy;
+
+        return $this;
+    }
+
+    /**
+     * Gets the naming strategy.
+     *
+     * @return NamingStrategyInterface
+     */
+    public function getNamingStrategy()
+    {
+        return $this->namingStrategy;
+    }
+
+    /**
+     * Checks if a naming strategy exists.
+     *
+     * @return bool
+     */
+    public function hasNamingStrategy()
+    {
+        return isset($this->namingStrategy);
+    }
+
+    /**
+     * Removes the naming strategy
+     *
+     * @return self
+     */
+    public function removeNamingStrategy()
+    {
+        $this->namingStrategy = null;
+
+        return $this;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Aggregate/AggregateHydrator.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\Aggregate;
+
+use Zend\EventManager\EventManager;
+use Zend\EventManager\EventManagerAwareInterface;
+use Zend\EventManager\EventManagerInterface;
+use Zend\Stdlib\Hydrator\HydratorInterface;
+
+/**
+ * Aggregate hydrator that composes multiple hydrators via events
+ */
+class AggregateHydrator implements HydratorInterface, EventManagerAwareInterface
+{
+    const DEFAULT_PRIORITY = 1;
+
+    /**
+     * @var \Zend\EventManager\EventManagerInterface|null
+     */
+    protected $eventManager;
+
+    /**
+     * Attaches the provided hydrator to the list of hydrators to be used while hydrating/extracting data
+     *
+     * @param \Zend\Stdlib\Hydrator\HydratorInterface $hydrator
+     * @param int                                     $priority
+     */
+    public function add(HydratorInterface $hydrator, $priority = self::DEFAULT_PRIORITY)
+    {
+        $this->getEventManager()->attachAggregate(new HydratorListener($hydrator), $priority);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function extract($object)
+    {
+        $event = new ExtractEvent($this, $object);
+
+        $this->getEventManager()->trigger($event);
+
+        return $event->getExtractedData();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function hydrate(array $data, $object)
+    {
+        $event = new HydrateEvent($this, $object, $data);
+
+        $this->getEventManager()->trigger($event);
+
+        return $event->getHydratedObject();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setEventManager(EventManagerInterface $eventManager)
+    {
+        $eventManager->setIdentifiers(array(__CLASS__, get_class($this)));
+
+        $this->eventManager = $eventManager;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getEventManager()
+    {
+        if (null === $this->eventManager) {
+            $this->setEventManager(new EventManager());
+        }
+
+        return $this->eventManager;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Aggregate/ExtractEvent.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\Aggregate;
+
+use Zend\EventManager\Event;
+
+/**
+ * Event triggered when the {@see \Zend\Stdlib\Hydrator\Aggregate\AggregateHydrator} extracts
+ * data from an object
+ */
+class ExtractEvent extends Event
+{
+    const EVENT_EXTRACT = 'extract';
+
+    /**
+     * {@inheritDoc}
+     */
+    protected $name = self::EVENT_EXTRACT;
+
+    /**
+     * @var object
+     */
+    protected $extractionObject;
+
+    /**
+     * @var array
+     */
+    protected $extractedData = array();
+
+    /**
+     * @param object $target
+     * @param object $extractionObject
+     */
+    public function __construct($target, $extractionObject)
+    {
+        $this->target           = $target;
+        $this->extractionObject = $extractionObject;
+    }
+
+    /**
+     * Retrieves the object from which data is extracted
+     *
+     * @return object
+     */
+    public function getExtractionObject()
+    {
+        return $this->extractionObject;
+    }
+
+    /**
+     * @param object $extractionObject
+     *
+     * @return void
+     */
+    public function setExtractionObject($extractionObject)
+    {
+        $this->extractionObject = $extractionObject;
+    }
+
+    /**
+     * Retrieves the data that has been extracted
+     *
+     * @return array
+     */
+    public function getExtractedData()
+    {
+        return $this->extractedData;
+    }
+
+    /**
+     * @param array $extractedData
+     *
+     * @return void
+     */
+    public function setExtractedData(array $extractedData)
+    {
+        $this->extractedData = $extractedData;
+    }
+
+    /**
+     * Merge provided data with the extracted data
+     *
+     * @param array $additionalData
+     *
+     * @return void
+     */
+    public function mergeExtractedData(array $additionalData)
+    {
+        $this->extractedData = array_merge($this->extractedData, $additionalData);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Aggregate/HydrateEvent.php
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\Aggregate;
+
+use Zend\EventManager\Event;
+
+/**
+ * Event triggered when the {@see \Zend\Stdlib\Hydrator\Aggregate\AggregateHydrator} hydrates
+ * data into an object
+ */
+class HydrateEvent extends Event
+{
+    const EVENT_HYDRATE = 'hydrate';
+
+    /**
+     * {@inheritDoc}
+     */
+    protected $name = self::EVENT_HYDRATE;
+
+    /**
+     * @var object
+     */
+    protected $hydratedObject;
+
+    /**
+     * @var array
+     */
+    protected $hydrationData;
+
+    /**
+     * @param object $target
+     * @param object $hydratedObject
+     * @param array  $hydrationData
+     */
+    public function __construct($target, $hydratedObject, array $hydrationData)
+    {
+        $this->target         = $target;
+        $this->hydratedObject = $hydratedObject;
+        $this->hydrationData  = $hydrationData;
+    }
+
+    /**
+     * Retrieves the object that is being hydrated
+     *
+     * @return object
+     */
+    public function getHydratedObject()
+    {
+        return $this->hydratedObject;
+    }
+
+    /**
+     * @param object $hydratedObject
+     */
+    public function setHydratedObject($hydratedObject)
+    {
+        $this->hydratedObject = $hydratedObject;
+    }
+
+    /**
+     * Retrieves the data that is being used for hydration
+     *
+     * @return array
+     */
+    public function getHydrationData()
+    {
+        return $this->hydrationData;
+    }
+
+    /**
+     * @param array $hydrationData
+     */
+    public function setHydrationData(array $hydrationData)
+    {
+        $this->hydrationData = $hydrationData;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Aggregate/HydratorListener.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\Aggregate;
+
+use Zend\EventManager\AbstractListenerAggregate;
+use Zend\EventManager\EventManagerInterface;
+use Zend\Stdlib\Hydrator\HydratorInterface;
+
+/**
+ * Aggregate listener wrapping around a hydrator. Listens
+ * to {@see \Zend\Stdlib\Hydrator\Aggregate::EVENT_HYDRATE} and
+ * {@see \Zend\Stdlib\Hydrator\Aggregate::EVENT_EXTRACT}
+ */
+class HydratorListener extends AbstractListenerAggregate
+{
+    /**
+     * @var \Zend\Stdlib\Hydrator\HydratorInterface
+     */
+    protected $hydrator;
+
+    /**
+     * @param \Zend\Stdlib\Hydrator\HydratorInterface $hydrator
+     */
+    public function __construct(HydratorInterface $hydrator)
+    {
+        $this->hydrator = $hydrator;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function attach(EventManagerInterface $events, $priority = 1)
+    {
+        $this->listeners[] = $events->attach(HydrateEvent::EVENT_HYDRATE, array($this, 'onHydrate'), $priority);
+        $this->listeners[] = $events->attach(ExtractEvent::EVENT_EXTRACT, array($this, 'onExtract'), $priority);
+    }
+
+    /**
+     * Callback to be used when {@see \Zend\Stdlib\Hydrator\Aggregate\HydrateEvent::EVENT_HYDRATE} is triggered
+     *
+     * @param \Zend\Stdlib\Hydrator\Aggregate\HydrateEvent $event
+     *
+     * @return object
+     *
+     * @internal
+     */
+    public function onHydrate(HydrateEvent $event)
+    {
+        $object = $this->hydrator->hydrate($event->getHydrationData(), $event->getHydratedObject());
+
+        $event->setHydratedObject($object);
+
+        return $object;
+    }
+
+    /**
+     * Callback to be used when {@see \Zend\Stdlib\Hydrator\Aggregate\ExtractEvent::EVENT_EXTRACT} is triggered
+     *
+     * @param \Zend\Stdlib\Hydrator\Aggregate\ExtractEvent $event
+     *
+     * @return array
+     *
+     * @internal
+     */
+    public function onExtract(ExtractEvent $event)
+    {
+        $data = $this->hydrator->extract($event->getExtractionObject());
+
+        $event->mergeExtractedData($data);
+
+        return $data;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/ArraySerializable.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator;
+
+use Zend\Stdlib\Exception;
+
+class ArraySerializable extends AbstractHydrator
+{
+    /**
+     * Extract values from the provided object
+     *
+     * Extracts values via the object's getArrayCopy() method.
+     *
+     * @param  object $object
+     * @return array
+     * @throws Exception\BadMethodCallException for an $object not implementing getArrayCopy()
+     */
+    public function extract($object)
+    {
+        if (!is_callable(array($object, 'getArrayCopy'))) {
+            throw new Exception\BadMethodCallException(
+                sprintf('%s expects the provided object to implement getArrayCopy()', __METHOD__)
+            );
+        }
+
+        $data = $object->getArrayCopy();
+        $filter = $this->getFilter();
+
+        foreach ($data as $name => $value) {
+            if (!$filter->filter($name)) {
+                unset($data[$name]);
+                continue;
+            }
+            $extractedName = $this->extractName($name, $object);
+            // replace the original key with extracted, if differ
+            if ($extractedName !== $name) {
+                unset($data[$name]);
+                $name = $extractedName;
+            }
+            $data[$name] = $this->extractValue($name, $value, $object);
+        }
+
+        return $data;
+    }
+
+    /**
+     * Hydrate an object
+     *
+     * Hydrates an object by passing $data to either its exchangeArray() or
+     * populate() method.
+     *
+     * @param  array $data
+     * @param  object $object
+     * @return object
+     * @throws Exception\BadMethodCallException for an $object not implementing exchangeArray() or populate()
+     */
+    public function hydrate(array $data, $object)
+    {
+        $replacement = array();
+        foreach ($data as $key => $value) {
+            $name = $this->hydrateName($key, $data);
+            $replacement[$name] = $this->hydrateValue($name, $value, $data);
+        }
+
+        if (is_callable(array($object, 'exchangeArray'))) {
+            $object->exchangeArray($replacement);
+        } elseif (is_callable(array($object, 'populate'))) {
+            $object->populate($replacement);
+        } else {
+            throw new Exception\BadMethodCallException(
+                sprintf('%s expects the provided object to implement exchangeArray() or populate()', __METHOD__)
+            );
+        }
+        return $object;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/ClassMethods.php
@@ -0,0 +1,274 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator;
+
+use Traversable;
+use Zend\Stdlib\Exception;
+use Zend\Stdlib\ArrayUtils;
+use Zend\Stdlib\Hydrator\Filter\FilterComposite;
+use Zend\Stdlib\Hydrator\Filter\FilterProviderInterface;
+use Zend\Stdlib\Hydrator\Filter\GetFilter;
+use Zend\Stdlib\Hydrator\Filter\HasFilter;
+use Zend\Stdlib\Hydrator\Filter\IsFilter;
+use Zend\Stdlib\Hydrator\Filter\MethodMatchFilter;
+use Zend\Stdlib\Hydrator\Filter\OptionalParametersFilter;
+use Zend\Stdlib\Hydrator\NamingStrategy\NamingStrategyInterface;
+use Zend\Stdlib\Hydrator\NamingStrategy\UnderscoreNamingStrategy;
+
+class ClassMethods extends AbstractHydrator implements HydratorOptionsInterface
+{
+    /**
+     * Holds the names of the methods used for hydration, indexed by class::property name,
+     * false if the hydration method is not callable/usable for hydration purposes
+     *
+     * @var string[]|bool[]
+     */
+    private $hydrationMethodsCache = array();
+
+    /**
+     * A map of extraction methods to property name to be used during extraction, indexed
+     * by class name and method name
+     *
+     * @var string[][]
+     */
+    private $extractionMethodsCache = array();
+
+    /**
+     * Flag defining whether array keys are underscore-separated (true) or camel case (false)
+     *
+     * @var bool
+     */
+    protected $underscoreSeparatedKeys = true;
+
+    /**
+     * @var \Zend\Stdlib\Hydrator\Filter\FilterInterface
+     */
+    private $callableMethodFilter;
+
+    /**
+     * Define if extract values will use camel case or name with underscore
+     * @param bool|array $underscoreSeparatedKeys
+     */
+    public function __construct($underscoreSeparatedKeys = true)
+    {
+        parent::__construct();
+        $this->setUnderscoreSeparatedKeys($underscoreSeparatedKeys);
+
+        $this->callableMethodFilter = new OptionalParametersFilter();
+
+        $this->filterComposite->addFilter('is', new IsFilter());
+        $this->filterComposite->addFilter('has', new HasFilter());
+        $this->filterComposite->addFilter('get', new GetFilter());
+        $this->filterComposite->addFilter('parameter', new OptionalParametersFilter(), FilterComposite::CONDITION_AND);
+    }
+
+    /**
+     * @param  array|Traversable                 $options
+     * @return ClassMethods
+     * @throws Exception\InvalidArgumentException
+     */
+    public function setOptions($options)
+    {
+        if ($options instanceof Traversable) {
+            $options = ArrayUtils::iteratorToArray($options);
+        } elseif (!is_array($options)) {
+            throw new Exception\InvalidArgumentException(
+                'The options parameter must be an array or a Traversable'
+            );
+        }
+        if (isset($options['underscoreSeparatedKeys'])) {
+            $this->setUnderscoreSeparatedKeys($options['underscoreSeparatedKeys']);
+        }
+
+        return $this;
+    }
+
+    /**
+     * @param  bool      $underscoreSeparatedKeys
+     * @return ClassMethods
+     */
+    public function setUnderscoreSeparatedKeys($underscoreSeparatedKeys)
+    {
+        $this->underscoreSeparatedKeys = (bool) $underscoreSeparatedKeys;
+
+        if ($this->underscoreSeparatedKeys) {
+            $this->setNamingStrategy(new UnderscoreNamingStrategy);
+        } elseif ($this->getNamingStrategy() instanceof UnderscoreNamingStrategy) {
+            $this->removeNamingStrategy();
+        }
+
+        return $this;
+    }
+
+    /**
+     * @return bool
+     */
+    public function getUnderscoreSeparatedKeys()
+    {
+        return $this->underscoreSeparatedKeys;
+    }
+
+    /**
+     * Extract values from an object with class methods
+     *
+     * Extracts the getter/setter of the given $object.
+     *
+     * @param  object                           $object
+     * @return array
+     * @throws Exception\BadMethodCallException for a non-object $object
+     */
+    public function extract($object)
+    {
+        if (!is_object($object)) {
+            throw new Exception\BadMethodCallException(sprintf(
+                '%s expects the provided $object to be a PHP object)',
+                __METHOD__
+            ));
+        }
+
+        $objectClass = get_class($object);
+
+        // reset the hydrator's hydrator's cache for this object, as the filter may be per-instance
+        if ($object instanceof FilterProviderInterface) {
+            $this->extractionMethodsCache[$objectClass] = null;
+        }
+
+        // pass 1 - finding out which properties can be extracted, with which methods (populate hydration cache)
+        if (! isset($this->extractionMethodsCache[$objectClass])) {
+            $this->extractionMethodsCache[$objectClass] = array();
+            $filter                                     = $this->filterComposite;
+            $methods                                    = get_class_methods($object);
+
+            if ($object instanceof FilterProviderInterface) {
+                $filter = new FilterComposite(
+                    array($object->getFilter()),
+                    array(new MethodMatchFilter('getFilter'))
+                );
+            }
+
+            foreach ($methods as $method) {
+                $methodFqn = $objectClass . '::' . $method;
+
+                if (! ($filter->filter($methodFqn) && $this->callableMethodFilter->filter($methodFqn))) {
+                    continue;
+                }
+
+                $attribute = $method;
+
+                if (strpos($method, 'get') === 0) {
+                    $attribute = substr($method, 3);
+                    if (!property_exists($object, $attribute)) {
+                        $attribute = lcfirst($attribute);
+                    }
+                }
+
+                $this->extractionMethodsCache[$objectClass][$method] = $attribute;
+            }
+        }
+
+        $values = array();
+
+        // pass 2 - actually extract data
+        foreach ($this->extractionMethodsCache[$objectClass] as $methodName => $attributeName) {
+            $realAttributeName          = $this->extractName($attributeName, $object);
+            $values[$realAttributeName] = $this->extractValue($realAttributeName, $object->$methodName(), $object);
+        }
+
+        return $values;
+    }
+
+    /**
+     * Hydrate an object by populating getter/setter methods
+     *
+     * Hydrates an object by getter/setter methods of the object.
+     *
+     * @param  array                            $data
+     * @param  object                           $object
+     * @return object
+     * @throws Exception\BadMethodCallException for a non-object $object
+     */
+    public function hydrate(array $data, $object)
+    {
+        if (!is_object($object)) {
+            throw new Exception\BadMethodCallException(sprintf(
+                '%s expects the provided $object to be a PHP object)',
+                __METHOD__
+            ));
+        }
+
+        $objectClass = get_class($object);
+
+        foreach ($data as $property => $value) {
+            $propertyFqn = $objectClass . '::$' . $property;
+
+            if (! isset($this->hydrationMethodsCache[$propertyFqn])) {
+                $setterName = 'set' . ucfirst($this->hydrateName($property, $data));
+
+                $this->hydrationMethodsCache[$propertyFqn] = is_callable(array($object, $setterName))
+                    ? $setterName
+                    : false;
+            }
+
+            if ($this->hydrationMethodsCache[$propertyFqn]) {
+                $object->{$this->hydrationMethodsCache[$propertyFqn]}($this->hydrateValue($property, $value, $data));
+            }
+        }
+
+        return $object;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function addFilter($name, $filter, $condition = FilterComposite::CONDITION_OR)
+    {
+        $this->resetCaches();
+
+        return parent::addFilter($name, $filter, $condition);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function removeFilter($name)
+    {
+        $this->resetCaches();
+
+        return parent::removeFilter($name);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setNamingStrategy(NamingStrategyInterface $strategy)
+    {
+        $this->resetCaches();
+
+        return parent::setNamingStrategy($strategy);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function removeNamingStrategy()
+    {
+        $this->resetCaches();
+
+        return parent::removeNamingStrategy();
+    }
+
+    /**
+     * Reset all local hydration/extraction caches
+     */
+    private function resetCaches()
+    {
+        $this->hydrationMethodsCache = $this->extractionMethodsCache = array();
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/DelegatingHydrator.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator;
+
+use Zend\ServiceManager\ServiceLocatorInterface;
+
+class DelegatingHydrator implements HydratorInterface
+{
+    /**
+     * @var ServiceLocatorInterface
+     */
+    protected $hydrators;
+
+    /**
+     * Constructor
+     *
+     * @param ServiceLocatorInterface $hydrators
+     */
+    public function __construct(ServiceLocatorInterface $hydrators)
+    {
+        $this->hydrators = $hydrators;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hydrate(array $data, $object)
+    {
+        return $this->getHydrator($object)->hydrate($data, $object);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function extract($object)
+    {
+        return $this->getHydrator($object)->extract($object);
+    }
+
+    /**
+     * Gets hydrator of an object
+     *
+     * @param  object $object
+     * @return HydratorInterface
+     */
+    protected function getHydrator($object)
+    {
+        return $this->hydrators->get(get_class($object));
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/DelegatingHydratorFactory.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator;
+
+use Zend\ServiceManager\FactoryInterface;
+use Zend\ServiceManager\ServiceLocatorInterface;
+
+class DelegatingHydratorFactory implements FactoryInterface
+{
+    /**
+     * Creates DelegatingHydrator
+     *
+     * @param  ServiceLocatorInterface $serviceLocator
+     * @return DelegatingHydrator
+     */
+    public function createService(ServiceLocatorInterface $serviceLocator)
+    {
+        // Assume that this factory is registered with the HydratorManager,
+        // and just pass it directly on.
+        return new DelegatingHydrator($serviceLocator);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Filter/FilterComposite.php
@@ -0,0 +1,196 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link           http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright      Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license        http://framework.zend.com/license/new-bsd New BSD License
+ */
+namespace Zend\Stdlib\Hydrator\Filter;
+
+use ArrayObject;
+use Zend\Stdlib\Exception\InvalidArgumentException;
+
+class FilterComposite implements FilterInterface
+{
+    /**
+     * @var ArrayObject
+     */
+    protected $orFilter;
+
+    /**
+     * @var ArrayObject
+     */
+    protected $andFilter;
+
+    /**
+     * Constant to add with "or" conditition
+     */
+    const CONDITION_OR = 1;
+
+    /**
+     * Constant to add with "and" conditition
+     */
+    const CONDITION_AND = 2;
+
+    /**
+     * Define default Filter
+     *
+     * @param  array $orFilter
+     * @param  array $andFilter
+     * @throws InvalidArgumentException
+     */
+    public function __construct($orFilter = array(), $andFilter = array())
+    {
+        array_walk(
+            $orFilter,
+            function ($value, $key) {
+                if (!is_callable($value) && !$value instanceof FilterInterface) {
+                    throw new InvalidArgumentException(
+                        'The value of ' . $key . ' should be either a callable or ' .
+                        'an instance of Zend\Stdlib\Hydrator\Filter\FilterInterface'
+                    );
+                }
+            }
+        );
+
+        array_walk(
+            $andFilter,
+            function ($value, $key) {
+                if (!is_callable($value) && !$value instanceof FilterInterface) {
+                    throw new InvalidArgumentException(
+                        'The value of ' . $key . '  should be either a callable or ' .
+                        'an instance of Zend\Stdlib\Hydrator\Filter\FilterInterface'
+                    );
+                }
+            }
+        );
+
+        $this->orFilter = new ArrayObject($orFilter);
+        $this->andFilter = new ArrayObject($andFilter);
+    }
+
+    /**
+     * Add a filter to the composite. Has to be indexed with $name in
+     * order to identify a specific filter.
+     *
+     * This example will exclude all methods from the hydration, that starts with 'getService'
+     * <code>
+     * $composite->addFilter('exclude',
+     *     function ($method) {
+     *         if (preg_match('/^getService/', $method) {
+     *             return false;
+     *         }
+     *         return true;
+     *     }, FilterComposite::CONDITION_AND
+     * );
+     * </code>
+     *
+     * @param  string                   $name
+     * @param  callable|FilterInterface $filter
+     * @param  int                      $condition Can be either FilterComposite::CONDITION_OR or FilterComposite::CONDITION_AND
+     * @throws InvalidArgumentException
+     * @return FilterComposite
+     */
+    public function addFilter($name, $filter, $condition = self::CONDITION_OR)
+    {
+        if (!is_callable($filter) && !($filter instanceof FilterInterface)) {
+            throw new InvalidArgumentException(
+                'The value of ' . $name . ' should be either a callable or ' .
+                'an instance of Zend\Stdlib\Hydrator\Filter\FilterInterface'
+            );
+        }
+
+        if ($condition === self::CONDITION_OR) {
+            $this->orFilter[$name] = $filter;
+        } elseif ($condition === self::CONDITION_AND) {
+            $this->andFilter[$name] = $filter;
+        }
+
+        return $this;
+    }
+
+    /**
+     * Remove a filter from the composition
+     *
+     * @param $name string Identifier for the filter
+     * @return FilterComposite
+     */
+    public function removeFilter($name)
+    {
+        if (isset($this->orFilter[$name])) {
+            unset($this->orFilter[$name]);
+        }
+
+        if (isset($this->andFilter[$name])) {
+            unset($this->andFilter[$name]);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Check if $name has a filter registered
+     *
+     * @param $name string Identifier for the filter
+     * @return bool
+     */
+    public function hasFilter($name)
+    {
+        return isset($this->orFilter[$name]) || isset($this->andFilter[$name]);
+    }
+
+    /**
+     * Filter the composite based on the AND and OR condition
+     * Will return true if one from the "or conditions" and all from
+     * the "and condition" returns true. Otherwise false
+     *
+     * @param $property string Parameter will be e.g. Parent\Namespace\Class::method
+     * @return bool
+     */
+    public function filter($property)
+    {
+        $andCount = count($this->andFilter);
+        $orCount = count($this->orFilter);
+        // return true if no filters are registered
+        if ($orCount === 0 && $andCount === 0) {
+            return true;
+        } elseif ($orCount === 0 && $andCount !== 0) {
+            $returnValue = true;
+        } else {
+            $returnValue = false;
+        }
+
+        // Check if 1 from the or filters return true
+        foreach ($this->orFilter as $filter) {
+            if (is_callable($filter)) {
+                if ($filter($property) === true) {
+                    $returnValue = true;
+                    break;
+                }
+                continue;
+            } else {
+                if ($filter->filter($property) === true) {
+                    $returnValue = true;
+                    break;
+                }
+            }
+        }
+
+        // Check if all of the and condition return true
+        foreach ($this->andFilter as $filter) {
+            if (is_callable($filter)) {
+                if ($filter($property) === false) {
+                    return false;
+                }
+                continue;
+            } else {
+                if ($filter->filter($property) === false) {
+                    return false;
+                }
+            }
+        }
+
+        return $returnValue;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Filter/FilterInterface.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link           http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright      Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license        http://framework.zend.com/license/new-bsd New BSD License
+ */
+namespace Zend\Stdlib\Hydrator\Filter;
+
+interface FilterInterface
+{
+    /**
+     * Should return true, if the given filter
+     * does not match
+     *
+     * @param string $property The name of the property
+     * @return bool
+     */
+    public function filter($property);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Filter/FilterProviderInterface.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link           http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright      Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license        http://framework.zend.com/license/new-bsd New BSD License
+ */
+namespace Zend\Stdlib\Hydrator\Filter;
+
+interface FilterProviderInterface
+{
+    /**
+     * Provides a filter for hydration
+     *
+     * @return FilterInterface
+     */
+    public function getFilter();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Filter/GetFilter.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link           http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright      Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license        http://framework.zend.com/license/new-bsd New BSD License
+ */
+namespace Zend\Stdlib\Hydrator\Filter;
+
+class GetFilter implements FilterInterface
+{
+    public function filter($property)
+    {
+        $pos = strpos($property, '::');
+        if ($pos !== false) {
+            $pos += 2;
+        } else {
+            $pos = 0;
+        }
+
+        if (substr($property, $pos, 3) === 'get') {
+            return true;
+        }
+        return false;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Filter/HasFilter.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link           http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright      Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license        http://framework.zend.com/license/new-bsd New BSD License
+ */
+namespace Zend\Stdlib\Hydrator\Filter;
+
+class HasFilter implements FilterInterface
+{
+    public function filter($property)
+    {
+        $pos = strpos($property, '::');
+        if ($pos !== false) {
+            $pos += 2;
+        } else {
+            $pos = 0;
+        }
+
+        if (substr($property, $pos, 3) === 'has') {
+            return true;
+        }
+        return false;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Filter/IsFilter.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link           http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright      Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license        http://framework.zend.com/license/new-bsd New BSD License
+ */
+namespace Zend\Stdlib\Hydrator\Filter;
+
+class IsFilter implements FilterInterface
+{
+    public function filter($property)
+    {
+        $pos = strpos($property, '::');
+        if ($pos !== false) {
+            $pos += 2;
+        } else {
+            $pos = 0;
+        }
+
+        if (substr($property, $pos, 2) === 'is') {
+            return true;
+        }
+        return false;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Filter/MethodMatchFilter.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link           http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright      Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license        http://framework.zend.com/license/new-bsd New BSD License
+ */
+namespace Zend\Stdlib\Hydrator\Filter;
+
+class MethodMatchFilter implements FilterInterface
+{
+    /**
+     * The method to exclude
+     * @var string
+     */
+    protected $method = null;
+
+    /**
+     * Either an exclude or an include
+     * @var bool
+     */
+    protected $exclude = null;
+
+    /**
+     * @param string $method The method to exclude or include
+     * @param bool $exclude If the method should be excluded
+     */
+    public function __construct($method, $exclude = true)
+    {
+        $this->method = $method;
+        $this->exclude = $exclude;
+    }
+
+    public function filter($property)
+    {
+        $pos = strpos($property, '::');
+        if ($pos !== false) {
+            $pos += 2;
+        } else {
+            $pos = 0;
+        }
+        if (substr($property, $pos) === $this->method) {
+            return !$this->exclude;
+        }
+        return $this->exclude;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Filter/NumberOfParameterFilter.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link           http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright      Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license        http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\Filter;
+
+use ReflectionException;
+use ReflectionMethod;
+use Zend\Stdlib\Exception\InvalidArgumentException;
+
+class NumberOfParameterFilter implements FilterInterface
+{
+    /**
+     * The number of parameters beeing accepted
+     * @var int
+     */
+    protected $numberOfParameters = null;
+
+    /**
+     * @param int $numberOfParameters Number of accepted parameters
+     */
+    public function __construct($numberOfParameters = 0)
+    {
+        $this->numberOfParameters = (int) $numberOfParameters;
+    }
+
+    /**
+     * @param string $property the name of the property
+     * @return bool
+     * @throws InvalidArgumentException
+     */
+    public function filter($property)
+    {
+        try {
+            $reflectionMethod = new ReflectionMethod($property);
+        } catch (ReflectionException $exception) {
+            throw new InvalidArgumentException(
+                "Method $property doesn't exist"
+            );
+        }
+
+        return $reflectionMethod->getNumberOfParameters() === $this->numberOfParameters;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Filter/OptionalParametersFilter.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link           http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright      Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license        http://framework.zend.com/license/new-bsd New BSD License
+ */
+namespace Zend\Stdlib\Hydrator\Filter;
+
+use InvalidArgumentException;
+use ReflectionException;
+use ReflectionMethod;
+use ReflectionParameter;
+
+/**
+ * Filter that includes methods which have no parameters or only optional parameters
+ */
+class OptionalParametersFilter implements FilterInterface
+{
+    /**
+     * Map of methods already analyzed
+     * by {@see \Zend\Stdlib\Hydrator\Filter\OptionalParametersFilter::filter()},
+     * cached for performance reasons
+     *
+     * @var bool[]
+     */
+    protected static $propertiesCache = array();
+
+    /**
+     * {@inheritDoc}
+     */
+    public function filter($property)
+    {
+        if (isset(static::$propertiesCache[$property])) {
+            return static::$propertiesCache[$property];
+        }
+
+        try {
+            $reflectionMethod = new ReflectionMethod($property);
+        } catch (ReflectionException $exception) {
+            throw new InvalidArgumentException(sprintf('Method %s doesn\'t exist', $property));
+        }
+
+        $mandatoryParameters = array_filter(
+            $reflectionMethod->getParameters(),
+            function (ReflectionParameter $parameter) {
+                return ! $parameter->isOptional();
+            }
+        );
+
+        return static::$propertiesCache[$property] = empty($mandatoryParameters);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/FilterEnabledInterface.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator;
+
+use Zend\Stdlib\Hydrator\Filter\FilterInterface;
+use Zend\Stdlib\Hydrator\Filter\FilterComposite;
+use Zend\Stdlib\Hydrator\Filter\FilterProviderInterface;
+
+interface FilterEnabledInterface extends FilterProviderInterface
+{
+    /**
+     * Add a new filter to take care of what needs to be hydrated.
+     * To exclude e.g. the method getServiceLocator:
+     *
+     * <code>
+     * $composite->addFilter(
+     *     "servicelocator",
+     *     function ($property) {
+     *         list($class, $method) = explode('::', $property);
+     *         if ($method === 'getServiceLocator') {
+     *             return false;
+     *         }
+     *         return true;
+     *     },
+     *     FilterComposite::CONDITION_AND
+     * );
+     * </code>
+     *
+     * @param string $name Index in the composite
+     * @param callable|FilterInterface $filter
+     * @param int $condition
+     * @return FilterComposite
+     */
+    public function addFilter($name, $filter, $condition = FilterComposite::CONDITION_OR);
+
+    /**
+     * Check whether a specific filter exists at key $name or not
+     *
+     * @param string $name Index in the composite
+     * @return bool
+     */
+    public function hasFilter($name);
+
+    /**
+     * Remove a filter from the composition.
+     * To not extract "has" methods, you simply need to unregister it
+     *
+     * <code>
+     * $filterComposite->removeFilter('has');
+     * </code>
+     *
+     * @param $name
+     * @return FilterComposite
+     */
+    public function removeFilter($name);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/HydrationInterface.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator;
+
+interface HydrationInterface
+{
+    /**
+     * Hydrate $object with the provided $data.
+     *
+     * @param  array $data
+     * @param  object $object
+     * @return object
+     */
+    public function hydrate(array $data, $object);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/HydratorAwareInterface.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator;
+
+interface HydratorAwareInterface
+{
+    /**
+     * Set hydrator
+     *
+     * @param  HydratorInterface $hydrator
+     * @return HydratorAwareInterface
+     */
+    public function setHydrator(HydratorInterface $hydrator);
+
+    /**
+     * Retrieve hydrator
+     *
+     * @return HydratorInterface
+     */
+    public function getHydrator();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/HydratorAwareTrait.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator;
+
+trait HydratorAwareTrait
+{
+    /**
+     * Hydrator instance
+     *
+     * @var HydratorInterface
+     * @access protected
+     */
+    protected $hydrator = null;
+
+    /**
+     * Set hydrator
+     *
+     * @param  HydratorInterface $hydrator
+     * @return self
+     * @access public
+     */
+    public function setHydrator(HydratorInterface $hydrator)
+    {
+        $this->hydrator = $hydrator;
+
+        return $this;
+    }
+
+    /**
+     * Retrieve hydrator
+     *
+     * @param void
+     * @return null|HydratorInterface
+     * @access public
+     */
+    public function getHydrator()
+    {
+        return $this->hydrator;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/HydratorInterface.php
@@ -0,0 +1,16 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator;
+
+use Zend\Stdlib\Extractor\ExtractionInterface;
+
+interface HydratorInterface extends HydrationInterface, ExtractionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/HydratorOptionsInterface.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator;
+
+interface HydratorOptionsInterface
+{
+    /**
+     * @param  array|\Traversable $options
+     * @return HydratorOptionsInterface
+     */
+    public function setOptions($options);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/HydratorPluginManager.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator;
+
+use Zend\ServiceManager\AbstractPluginManager;
+use Zend\Stdlib\Exception;
+
+/**
+ * Plugin manager implementation for hydrators.
+ *
+ * Enforces that adapters retrieved are instances of HydratorInterface
+ */
+class HydratorPluginManager extends AbstractPluginManager
+{
+    /**
+     * Whether or not to share by default
+     *
+     * @var bool
+     */
+    protected $shareByDefault = false;
+
+    /**
+     * Default aliases
+     *
+     * @var array
+     */
+    protected $aliases = array(
+        'delegatinghydrator' => 'Zend\Stdlib\Hydrator\DelegatingHydrator',
+    );
+
+    /**
+     * Default set of adapters
+     *
+     * @var array
+     */
+    protected $invokableClasses = array(
+        'arrayserializable' => 'Zend\Stdlib\Hydrator\ArraySerializable',
+        'classmethods'      => 'Zend\Stdlib\Hydrator\ClassMethods',
+        'objectproperty'    => 'Zend\Stdlib\Hydrator\ObjectProperty',
+        'reflection'        => 'Zend\Stdlib\Hydrator\Reflection'
+    );
+
+    /**
+     * Default factory-based adapters
+     *
+     * @var array
+     */
+    protected $factories = array(
+        'Zend\Stdlib\Hydrator\DelegatingHydrator' => 'Zend\Stdlib\Hydrator\DelegatingHydratorFactory',
+    );
+
+    /**
+     * {@inheritDoc}
+     */
+    public function validatePlugin($plugin)
+    {
+        if ($plugin instanceof HydratorInterface) {
+            // we're okay
+            return;
+        }
+
+        throw new Exception\RuntimeException(sprintf(
+            'Plugin of type %s is invalid; must implement Zend\Stdlib\Hydrator\HydratorInterface',
+            (is_object($plugin) ? get_class($plugin) : gettype($plugin))
+        ));
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/ArrayMapNamingStrategy.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\NamingStrategy;
+
+final class ArrayMapNamingStrategy implements NamingStrategyInterface
+{
+    /**
+     * @var string[]
+     */
+    private $extractionMap = array();
+
+    /**
+     * @var string[]
+     */
+    private $hydrationMap = array();
+
+    /**
+     * Constructor
+     *
+     * @param array $extractionMap A map of string keys and values for symmetric translation of hydrated
+     *                             and extracted field names
+     */
+    public function __construct(array $extractionMap)
+    {
+        $this->extractionMap = $extractionMap;
+        $this->hydrationMap  = array_flip($extractionMap);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function hydrate($name)
+    {
+        return isset($this->hydrationMap[$name]) ? $this->hydrationMap[$name] : $name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function extract($name)
+    {
+        return isset($this->extractionMap[$name]) ? $this->extractionMap[$name] : $name;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/CompositeNamingStrategy.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\NamingStrategy;
+
+final class CompositeNamingStrategy implements NamingStrategyInterface
+{
+    /**
+     * @var array
+     */
+    private $namingStrategies = array();
+
+    /**
+     * @var NamingStrategyInterface
+     */
+    private $defaultNamingStrategy;
+
+    /**
+     * @param NamingStrategyInterface[]    $strategies            indexed by the name they translate
+     * @param NamingStrategyInterface|null $defaultNamingStrategy
+     */
+    public function __construct(array $strategies, NamingStrategyInterface $defaultNamingStrategy = null)
+    {
+        $this->namingStrategies = array_map(
+            function (NamingStrategyInterface $strategy) {
+                // this callback is here only to ensure type-safety
+                return $strategy;
+            },
+            $strategies
+        );
+
+        $this->defaultNamingStrategy = $defaultNamingStrategy ?: new IdentityNamingStrategy();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function extract($name)
+    {
+        $strategy = isset($this->namingStrategies[$name])
+            ? $this->namingStrategies[$name]
+            : $this->defaultNamingStrategy;
+
+        return $strategy->extract($name);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function hydrate($name)
+    {
+        $strategy = isset($this->namingStrategies[$name])
+            ? $this->namingStrategies[$name]
+            : $this->defaultNamingStrategy;
+
+        return $strategy->hydrate($name);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/IdentityNamingStrategy.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\NamingStrategy;
+
+final class IdentityNamingStrategy implements NamingStrategyInterface
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function hydrate($name)
+    {
+        return $name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function extract($name)
+    {
+        return $name;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/MapNamingStrategy.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\NamingStrategy;
+
+use Zend\Stdlib\Exception\InvalidArgumentException;
+
+class MapNamingStrategy implements NamingStrategyInterface
+{
+    /**
+     * Map for hydrate name conversion.
+     *
+     * @var array
+     */
+    protected $mapping = array();
+
+    /**
+     * Reversed map for extract name conversion.
+     *
+     * @var array
+     */
+    protected $reverse = array();
+
+    /**
+     * Initialize.
+     *
+     * @param array $mapping Map for name conversion on hydration
+     * @param array $reverse Reverse map for name conversion on extraction
+     */
+    public function __construct(array $mapping, array $reverse = null)
+    {
+        $this->mapping = $mapping;
+        $this->reverse = $reverse ?: $this->flipMapping($mapping);
+    }
+
+    /**
+     * Safelly flip mapping array.
+     *
+     * @param  array                    $array Array to flip
+     * @return array                    Flipped array
+     * @throws InvalidArgumentException
+     */
+    protected function flipMapping(array $array)
+    {
+        array_walk($array, function ($value) {
+            if (!is_string($value) && !is_int($value)) {
+                throw new InvalidArgumentException('Mapping array can\'t be flipped because of invalid value');
+            }
+        });
+
+        return array_flip($array);
+    }
+
+    /**
+     * Converts the given name so that it can be extracted by the hydrator.
+     *
+     * @param  string $name The original name
+     * @return mixed  The hydrated name
+     */
+    public function hydrate($name)
+    {
+        if (array_key_exists($name, $this->mapping)) {
+            return $this->mapping[$name];
+        }
+
+        return $name;
+    }
+
+    /**
+     * Converts the given name so that it can be hydrated by the hydrator.
+     *
+     * @param  string $name The original name
+     * @return mixed  The extracted name
+     */
+    public function extract($name)
+    {
+        if (array_key_exists($name, $this->reverse)) {
+            return $this->reverse[$name];
+        }
+
+        return $name;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/NamingStrategyInterface.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\NamingStrategy;
+
+/**
+ * Allow property extraction / hydration for hydrator
+ *
+ * Interface PropertyStrategyInterface
+ * @package Zend\Stdlib\Hydrator\NamingStrategy
+ */
+interface NamingStrategyInterface
+{
+    /**
+     * Converts the given name so that it can be extracted by the hydrator.
+     *
+     * @param string $name   The original name
+     * @param object $object (optional) The original object for context.
+     * @return mixed         The hydrated name
+     */
+    public function hydrate($name);
+
+    /**
+     * Converts the given name so that it can be hydrated by the hydrator.
+     *
+     * @param string $name The original name
+     * @param array  $data (optional) The original data for context.
+     * @return mixed The extracted name
+     */
+    public function extract($name);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/UnderscoreNamingStrategy.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\NamingStrategy;
+
+use Zend\Filter\FilterChain;
+
+class UnderscoreNamingStrategy implements NamingStrategyInterface
+{
+    /**
+     * @var FilterChain|null
+     */
+    protected static $camelCaseToUnderscoreFilter;
+
+    /**
+     * @var FilterChain|null
+     */
+    protected static $underscoreToStudlyCaseFilter;
+
+    /**
+     * Remove underscores and capitalize letters
+     *
+     * @param  string $name
+     * @return string
+     */
+    public function hydrate($name)
+    {
+        return $this->getUnderscoreToStudlyCaseFilter()->filter($name);
+    }
+
+    /**
+     * Remove capitalized letters and prepend underscores.
+     *
+     * @param  string $name
+     * @return string
+     */
+    public function extract($name)
+    {
+        return $this->getCamelCaseToUnderscoreFilter()->filter($name);
+    }
+
+    /**
+     * @return FilterChain
+     */
+    protected function getUnderscoreToStudlyCaseFilter()
+    {
+        if (static::$underscoreToStudlyCaseFilter instanceof FilterChain) {
+            return static::$underscoreToStudlyCaseFilter;
+        }
+
+        $filter = new FilterChain();
+
+        $filter->attachByName('WordUnderscoreToStudlyCase');
+
+        return static::$underscoreToStudlyCaseFilter = $filter;
+    }
+
+    /**
+     * @return FilterChain
+     */
+    protected function getCamelCaseToUnderscoreFilter()
+    {
+        if (static::$camelCaseToUnderscoreFilter instanceof FilterChain) {
+            return static::$camelCaseToUnderscoreFilter;
+        }
+
+        $filter = new FilterChain();
+
+        $filter->attachByName('WordCamelCaseToUnderscore');
+        $filter->attachByName('StringToLower');
+
+        return static::$camelCaseToUnderscoreFilter = $filter;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/NamingStrategyEnabledInterface.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator;
+
+use Zend\Stdlib\Hydrator\NamingStrategy\NamingStrategyInterface;
+
+interface NamingStrategyEnabledInterface
+{
+    /**
+     * Adds the given naming strategy
+     *
+     * @param NamingStrategyInterface $strategy The naming to register.
+     * @return NamingStrategyEnabledInterface
+     */
+    public function setNamingStrategy(NamingStrategyInterface $strategy);
+
+    /**
+     * Gets the naming strategy.
+     *
+     * @return NamingStrategyInterface
+     */
+    public function getNamingStrategy();
+
+    /**
+     * Checks if a naming strategy exists.
+     *
+     * @return bool
+     */
+    public function hasNamingStrategy();
+
+    /**
+     * Removes the naming with the given name.
+     *
+     * @return NamingStrategyEnabledInterface
+     */
+    public function removeNamingStrategy();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/ObjectProperty.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator;
+
+use Zend\Stdlib\Exception;
+use ReflectionClass;
+use ReflectionProperty;
+
+class ObjectProperty extends AbstractHydrator
+{
+    /**
+     * @var array[] indexed by class name and then property name
+     */
+    private static $skippedPropertiesCache = array();
+
+    /**
+     * {@inheritDoc}
+     *
+     * Extracts the accessible non-static properties of the given $object.
+     *
+     * @throws Exception\BadMethodCallException for a non-object $object
+     */
+    public function extract($object)
+    {
+        if (!is_object($object)) {
+            throw new Exception\BadMethodCallException(
+                sprintf('%s expects the provided $object to be a PHP object)', __METHOD__)
+            );
+        }
+
+        $data   = get_object_vars($object);
+        $filter = $this->getFilter();
+
+        foreach ($data as $name => $value) {
+            // Filter keys, removing any we don't want
+            if (! $filter->filter($name)) {
+                unset($data[$name]);
+                continue;
+            }
+
+            // Replace name if extracted differ
+            $extracted = $this->extractName($name, $object);
+
+            if ($extracted !== $name) {
+                unset($data[$name]);
+                $name = $extracted;
+            }
+
+            $data[$name] = $this->extractValue($name, $value, $object);
+        }
+
+        return $data;
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * Hydrate an object by populating public properties
+     *
+     * Hydrates an object by setting public properties of the object.
+     *
+     * @throws Exception\BadMethodCallException for a non-object $object
+     */
+    public function hydrate(array $data, $object)
+    {
+        if (!is_object($object)) {
+            throw new Exception\BadMethodCallException(
+                sprintf('%s expects the provided $object to be a PHP object)', __METHOD__)
+            );
+        }
+
+        $properties = & self::$skippedPropertiesCache[get_class($object)];
+
+        if (! isset($properties)) {
+            $reflection = new ReflectionClass($object);
+            $properties = array_fill_keys(
+                array_map(
+                    function (ReflectionProperty $property) {
+                        return $property->getName();
+                    },
+                    $reflection->getProperties(
+                        ReflectionProperty::IS_PRIVATE
+                        + ReflectionProperty::IS_PROTECTED
+                        + ReflectionProperty::IS_STATIC
+                    )
+                ),
+                true
+            );
+        }
+
+        foreach ($data as $name => $value) {
+            $property = $this->hydrateName($name, $data);
+
+            if (isset($properties[$property])) {
+                continue;
+            }
+
+            $object->$property = $this->hydrateValue($property, $value, $data);
+        }
+
+        return $object;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Reflection.php
@@ -0,0 +1,95 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator;
+
+use ReflectionClass;
+use Zend\Stdlib\Exception;
+
+class Reflection extends AbstractHydrator
+{
+    /**
+     * Simple in-memory array cache of ReflectionProperties used.
+     * @var \ReflectionProperty[]
+     */
+    protected static $reflProperties = array();
+
+    /**
+     * Extract values from an object
+     *
+     * @param  object $object
+     * @return array
+     */
+    public function extract($object)
+    {
+        $result = array();
+        foreach (self::getReflProperties($object) as $property) {
+            $propertyName = $this->extractName($property->getName(), $object);
+            if (!$this->filterComposite->filter($propertyName)) {
+                continue;
+            }
+
+            $value = $property->getValue($object);
+            $result[$propertyName] = $this->extractValue($propertyName, $value, $object);
+        }
+
+        return $result;
+    }
+
+    /**
+     * Hydrate $object with the provided $data.
+     *
+     * @param  array $data
+     * @param  object $object
+     * @return object
+     */
+    public function hydrate(array $data, $object)
+    {
+        $reflProperties = self::getReflProperties($object);
+        foreach ($data as $key => $value) {
+            $name = $this->hydrateName($key, $data);
+            if (isset($reflProperties[$name])) {
+                $reflProperties[$name]->setValue($object, $this->hydrateValue($name, $value, $data));
+            }
+        }
+        return $object;
+    }
+
+    /**
+     * Get a reflection properties from in-memory cache and lazy-load if
+     * class has not been loaded.
+     *
+     * @param  string|object $input
+     * @throws Exception\InvalidArgumentException
+     * @return \ReflectionProperty[]
+     */
+    protected static function getReflProperties($input)
+    {
+        if (is_object($input)) {
+            $input = get_class($input);
+        } elseif (!is_string($input)) {
+            throw new Exception\InvalidArgumentException('Input must be a string or an object.');
+        }
+
+        if (isset(static::$reflProperties[$input])) {
+            return static::$reflProperties[$input];
+        }
+
+        static::$reflProperties[$input] = array();
+        $reflClass                      = new ReflectionClass($input);
+        $reflProperties                 = $reflClass->getProperties();
+
+        foreach ($reflProperties as $property) {
+            $property->setAccessible(true);
+            static::$reflProperties[$input][$property->getName()] = $property;
+        }
+
+        return static::$reflProperties[$input];
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Strategy/BooleanStrategy.php
@@ -0,0 +1,106 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\Strategy;
+
+use Zend\Stdlib\Exception\InvalidArgumentException;
+
+/**
+ * This Strategy extracts and hydrates int and string values to Boolean values
+ *
+ * @package Zend\Stdlib\Hydrator\Strategy
+ */
+final class BooleanStrategy implements StrategyInterface
+{
+    /**
+     * @var int|string
+     */
+    private $trueValue;
+
+    /**
+     * @var int|string
+     */
+    private $falseValue;
+
+    /**
+     * @param int|string $trueValue
+     * @param int|string $falseValue
+     * @throws InvalidArgumentException
+     */
+    public function __construct($trueValue, $falseValue)
+    {
+        if (!is_int($trueValue) && !is_string($trueValue)) {
+            throw new InvalidArgumentException(sprintf(
+                'Unable to instantiate BooleanStrategy. Expected int or string as $trueValue. %s was given',
+                is_object($trueValue) ? get_class($trueValue) : gettype($trueValue)
+            ));
+        }
+
+        if (!is_int($falseValue) && !is_string($falseValue)) {
+            throw new InvalidArgumentException(sprintf(
+                'Unable to instantiate BooleanStrategy. Expected int or string as $falseValue. %s was given',
+                is_object($falseValue) ? get_class($falseValue) : gettype($falseValue)
+            ));
+        }
+
+        $this->trueValue  = $trueValue;
+        $this->falseValue = $falseValue;
+    }
+
+    /**
+     * Converts the given value so that it can be extracted by the hydrator.
+     *
+     * @param  bool $value The original value.
+     * @throws InvalidArgumentException
+     * @return int|string Returns the value that should be extracted.
+     */
+    public function extract($value)
+    {
+        if (!is_bool($value)) {
+            throw new InvalidArgumentException(sprintf(
+                'Unable to extract. Expected bool. %s was given.',
+                is_object($value) ? get_class($value) : gettype($value)
+            ));
+        }
+
+        return $value === true ? $this->trueValue : $this->falseValue;
+    }
+
+    /**
+     * Converts the given value so that it can be hydrated by the hydrator.
+     *
+     * @param  int|string $value The original value.
+     * @throws InvalidArgumentException
+     * @return bool Returns the value that should be hydrated.
+     */
+    public function hydrate($value)
+    {
+        if (!is_string($value) && !is_int($value)) {
+            throw new InvalidArgumentException(sprintf(
+                'Unable to hydrate. Expected string or int. %s was given.',
+                is_object($value) ? get_class($value) : gettype($value)
+            ));
+        }
+
+        if ($value === $this->trueValue) {
+            return true;
+        }
+
+        if ($value === $this->falseValue) {
+            return false;
+        }
+
+        throw new InvalidArgumentException(sprintf(
+            'Unexpected value %s can\'t be hydrated. Expect %s or %s as Value.',
+            $value,
+            $this->trueValue,
+            $this->falseValue
+        ));
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Strategy/ClosureStrategy.php
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\Strategy;
+
+class ClosureStrategy implements StrategyInterface
+{
+    /**
+     * Function, used in extract method, default:
+     * function ($value) {
+     *     return $value;
+     * };
+     * @var callable
+     */
+    protected $extractFunc = null;
+
+    /**
+     * Function, used in hydrate method, default:
+     * function ($value) {
+     *     return $value;
+     * };
+     * @var callable
+     */
+    protected $hydrateFunc = null;
+
+    /**
+     * You can describe how your values will extract and hydrate, like this:
+     * $hydrator->addStrategy('category', new ClosureStrategy(
+     *     function (Category $value) {
+     *         return (int) $value->id;
+     *     },
+     *     function ($value) {
+     *         return new Category((int) $value);
+     *     }
+     * ));
+     *
+     * @param callable $extractFunc - anonymous function, that extract values
+     * from object
+     * @param callable $hydrateFunc - anonymous function, that hydrate values
+     * into object
+     */
+    public function __construct($extractFunc = null, $hydrateFunc = null)
+    {
+        if (isset($extractFunc)) {
+            if (!is_callable($extractFunc)) {
+                throw new \Exception('$extractFunc must be callable');
+            }
+
+            $this->extractFunc = $extractFunc;
+        } else {
+            $this->extractFunc = function ($value) {
+                return $value;
+            };
+        }
+
+        if (isset($hydrateFunc)) {
+            if (!is_callable($hydrateFunc)) {
+                throw new \Exception('$hydrateFunc must be callable');
+            }
+
+            $this->hydrateFunc = $hydrateFunc;
+        } else {
+            $this->hydrateFunc = function ($value) {
+                return $value;
+            };
+        }
+    }
+
+    /**
+     * Converts the given value so that it can be extracted by the hydrator.
+     *
+     * @param  mixed $value  The original value.
+     * @param  array $object The object is optionally provided as context.
+     * @return mixed Returns the value that should be extracted.
+     */
+    public function extract($value, $object = null)
+    {
+        $func = $this->extractFunc;
+
+        return $func($value, $object);
+    }
+
+    /**
+     * Converts the given value so that it can be hydrated by the hydrator.
+     *
+     * @param  mixed $value The original value.
+     * @param  array $data  The whole data is optionally provided as context.
+     * @return mixed Returns the value that should be hydrated.
+     */
+    public function hydrate($value, $data = null)
+    {
+        $func = $this->hydrateFunc;
+
+        return $func($value, $data);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Strategy/DateTimeFormatterStrategy.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\Strategy;
+
+use DateTime;
+use DateTimeZone;
+
+final class DateTimeFormatterStrategy implements StrategyInterface
+{
+    /**
+     * @var string
+     */
+    private $format;
+
+    /**
+     * @var DateTimeZone|null
+     */
+    private $timezone;
+
+    /**
+     * Constructor
+     *
+     * @param string            $format
+     * @param DateTimeZone|null $timezone
+     */
+    public function __construct($format = DateTime::RFC3339, DateTimeZone $timezone = null)
+    {
+        $this->format   = (string) $format;
+        $this->timezone = $timezone;
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * Converts to date time string
+     *
+     * @param mixed|DateTime $value
+     *
+     * @return mixed|string
+     */
+    public function extract($value)
+    {
+        if ($value instanceof DateTime) {
+            return $value->format($this->format);
+        }
+
+        return $value;
+    }
+
+    /**
+     * Converts date time string to DateTime instance for injecting to object
+     *
+     * {@inheritDoc}
+     *
+     * @param mixed|string $value
+     *
+     * @return mixed|DateTime
+     */
+    public function hydrate($value)
+    {
+        if ($value === '' || $value === null) {
+            return;
+        }
+
+        if ($this->timezone) {
+            $hydrated = DateTime::createFromFormat($this->format, $value, $this->timezone);
+        } else {
+            $hydrated = DateTime::createFromFormat($this->format, $value);
+        }
+
+        return $hydrated ?: $value;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Strategy/DefaultStrategy.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\Strategy;
+
+class DefaultStrategy implements StrategyInterface
+{
+    /**
+     * Converts the given value so that it can be extracted by the hydrator.
+     *
+     * @param mixed $value The original value.
+     * @return mixed Returns the value that should be extracted.
+     */
+    public function extract($value)
+    {
+        return $value;
+    }
+
+    /**
+     * Converts the given value so that it can be hydrated by the hydrator.
+     *
+     * @param mixed $value The original value.
+     * @return mixed Returns the value that should be hydrated.
+     */
+    public function hydrate($value)
+    {
+        return $value;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Strategy/Exception/ExceptionInterface.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\Strategy\Exception;
+
+interface ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Strategy/Exception/InvalidArgumentException.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\Strategy\Exception;
+
+class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Strategy/ExplodeStrategy.php
@@ -0,0 +1,113 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\Strategy;
+
+final class ExplodeStrategy implements StrategyInterface
+{
+    /**
+     * @var string
+     */
+    private $valueDelimiter;
+
+    /**
+     * @var int|null
+     */
+    private $explodeLimit;
+
+    /**
+     * Constructor
+     *
+     * @param string   $delimiter    String that the values will be split upon
+     * @param int|null $explodeLimit Explode limit
+     */
+    public function __construct($delimiter = ',', $explodeLimit = null)
+    {
+        $this->setValueDelimiter($delimiter);
+
+        $this->explodeLimit = ($explodeLimit === null) ? null : (int) $explodeLimit;
+    }
+
+    /**
+     * Sets the delimiter string that the values will be split upon
+     *
+     * @param  string $delimiter
+     * @return self
+     */
+    private function setValueDelimiter($delimiter)
+    {
+        if (!is_string($delimiter)) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s expects Delimiter to be string, %s provided instead',
+                __METHOD__,
+                is_object($delimiter) ? get_class($delimiter) : gettype($delimiter)
+            ));
+        }
+
+        if (empty($delimiter)) {
+            throw new Exception\InvalidArgumentException('Delimiter cannot be empty.');
+        }
+
+        $this->valueDelimiter = $delimiter;
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * Split a string by delimiter
+     *
+     * @param string|null $value
+     *
+     * @return string[]
+     *
+     * @throws Exception\InvalidArgumentException
+     */
+    public function hydrate($value)
+    {
+        if (null === $value) {
+            return array();
+        }
+
+        if (!(is_string($value) || is_numeric($value))) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s expects argument 1 to be string, %s provided instead',
+                __METHOD__,
+                is_object($value) ? get_class($value) : gettype($value)
+            ));
+        }
+
+        if ($this->explodeLimit !== null) {
+            return explode($this->valueDelimiter, $value, $this->explodeLimit);
+        }
+
+        return explode($this->valueDelimiter, $value);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * Join array elements with delimiter
+     *
+     * @param string[] $value The original value.
+     *
+     * @return string|null
+     */
+    public function extract($value)
+    {
+        if (!is_array($value)) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                '%s expects argument 1 to be array, %s provided instead',
+                __METHOD__,
+                is_object($value) ? get_class($value) : gettype($value)
+            ));
+        }
+
+        return empty($value) ? null : implode($this->valueDelimiter, $value);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Strategy/SerializableStrategy.php
@@ -0,0 +1,123 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\Strategy;
+
+use Zend\Stdlib\Exception\InvalidArgumentException;
+use Zend\Serializer\Adapter\AdapterInterface as SerializerAdapter;
+use Zend\Serializer\Serializer as SerializerFactory;
+
+class SerializableStrategy implements StrategyInterface
+{
+    /**
+     * @var string|SerializerAdapter
+     */
+    protected $serializer;
+
+    /**
+     * @var array
+     */
+    protected $serializerOptions = array();
+
+    /**
+     *
+     * @param mixed $serializer string or SerializerAdapter
+     * @param mixed $serializerOptions
+     */
+    public function __construct($serializer, $serializerOptions = null)
+    {
+        $this->setSerializer($serializer);
+        if ($serializerOptions) {
+            $this->setSerializerOptions($serializerOptions);
+        }
+    }
+
+    /**
+     * Serialize the given value so that it can be extracted by the hydrator.
+     *
+     * @param mixed $value The original value.
+     * @return mixed Returns the value that should be extracted.
+     */
+    public function extract($value)
+    {
+        $serializer = $this->getSerializer();
+        return $serializer->serialize($value);
+    }
+
+    /**
+     * Unserialize the given value so that it can be hydrated by the hydrator.
+     *
+     * @param mixed $value The original value.
+     * @return mixed Returns the value that should be hydrated.
+     */
+    public function hydrate($value)
+    {
+        $serializer = $this->getSerializer();
+        return $serializer->unserialize($value);
+    }
+
+    /**
+     * Set serializer
+     *
+     * @param  string|SerializerAdapter $serializer
+     * @return SerializableStrategy
+     */
+    public function setSerializer($serializer)
+    {
+        if (!is_string($serializer) && !$serializer instanceof SerializerAdapter) {
+            throw new InvalidArgumentException(sprintf(
+                '%s expects either a string serializer name or Zend\Serializer\Adapter\AdapterInterface instance; '
+                . 'received "%s"',
+                __METHOD__,
+                (is_object($serializer) ? get_class($serializer) : gettype($serializer))
+            ));
+        }
+        $this->serializer = $serializer;
+        return $this;
+    }
+
+    /**
+     * Get serializer
+     *
+     * @return SerializerAdapter
+     */
+    public function getSerializer()
+    {
+        if (is_string($this->serializer)) {
+            $options = $this->getSerializerOptions();
+            $this->setSerializer(SerializerFactory::factory($this->serializer, $options));
+        } elseif (null === $this->serializer) {
+            $this->setSerializer(SerializerFactory::getDefaultAdapter());
+        }
+
+        return $this->serializer;
+    }
+
+    /**
+     * Set configuration options for instantiating a serializer adapter
+     *
+     * @param  mixed $serializerOptions
+     * @return SerializableStrategy
+     */
+    public function setSerializerOptions($serializerOptions)
+    {
+        $this->serializerOptions = $serializerOptions;
+        return $this;
+    }
+
+    /**
+     * Get configuration options for instantiating a serializer adapter
+     *
+     * @return mixed
+     */
+    public function getSerializerOptions()
+    {
+        return $this->serializerOptions;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Strategy/StrategyChain.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\Strategy;
+
+use Traversable;
+use Zend\Stdlib\ArrayUtils;
+
+final class StrategyChain implements StrategyInterface
+{
+    /**
+     * Strategy chain for extraction
+     *
+     * @var StrategyInterface[]
+     */
+    private $extractionStrategies;
+
+    /**
+     * Strategy chain for hydration
+     *
+     * @var StrategyInterface[]
+     */
+    private $hydrationStrategies;
+
+    /**
+     * Constructor
+     *
+     * @param array|Traversable $extractionStrategies
+     */
+    public function __construct($extractionStrategies)
+    {
+        $extractionStrategies = ArrayUtils::iteratorToArray($extractionStrategies);
+        $this->extractionStrategies = array_map(
+            function (StrategyInterface $strategy) {
+                // this callback is here only to ensure type-safety
+                return $strategy;
+            },
+            $extractionStrategies
+        );
+
+        $this->hydrationStrategies = array_reverse($extractionStrategies);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function extract($value)
+    {
+        foreach ($this->extractionStrategies as $strategy) {
+            $value = $strategy->extract($value);
+        }
+
+        return $value;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function hydrate($value)
+    {
+        foreach ($this->hydrationStrategies as $strategy) {
+            $value = $strategy->hydrate($value);
+        }
+
+        return $value;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/Strategy/StrategyInterface.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator\Strategy;
+
+/**
+ * @todo v3.0, add optional object/data to extract/hydrate.
+ */
+interface StrategyInterface
+{
+    /**
+     * Converts the given value so that it can be extracted by the hydrator.
+     *
+     * @param mixed   $value The original value.
+     * @param object $object (optional) The original object for context.
+     * @return mixed Returns the value that should be extracted.
+     */
+    public function extract($value);
+
+    /**
+     * Converts the given value so that it can be hydrated by the hydrator.
+     *
+     * @param mixed $value The original value.
+     * @param array  $data (optional) The original data for context.
+     * @return mixed Returns the value that should be hydrated.
+     */
+    public function hydrate($value);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Hydrator/StrategyEnabledInterface.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\Hydrator;
+
+use Zend\Stdlib\Hydrator\Strategy\StrategyInterface;
+
+interface StrategyEnabledInterface
+{
+    /**
+     * Adds the given strategy under the given name.
+     *
+     * @param string $name The name of the strategy to register.
+     * @param StrategyInterface $strategy The strategy to register.
+     * @return StrategyEnabledInterface
+     */
+    public function addStrategy($name, StrategyInterface $strategy);
+
+    /**
+     * Gets the strategy with the given name.
+     *
+     * @param string $name The name of the strategy to get.
+     * @return StrategyInterface
+     */
+    public function getStrategy($name);
+
+    /**
+     * Checks if the strategy with the given name exists.
+     *
+     * @param string $name The name of the strategy to check for.
+     * @return bool
+     */
+    public function hasStrategy($name);
+
+    /**
+     * Removes the strategy with the given name.
+     *
+     * @param string $name The name of the strategy to remove.
+     * @return StrategyEnabledInterface
+     */
+    public function removeStrategy($name);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/InitializableInterface.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+/**
+ * Interface to allow objects to have initialization logic
+ */
+interface InitializableInterface
+{
+    /**
+     * Init an object
+     *
+     * @return void
+     */
+    public function init();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/JsonSerializable.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+if (PHP_VERSION_ID < 50400) {
+    class_alias(
+        'Zend\Stdlib\JsonSerializable\PhpLegacyCompatibility',
+        'JsonSerializable'
+    );
+}
+
+/**
+ * Polyfill for JsonSerializable
+ *
+ * JsonSerializable was introduced in PHP 5.4.0.
+ *
+ * @see http://php.net/manual/class.jsonserializable.php
+ */
+interface JsonSerializable extends \JsonSerializable
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/JsonSerializable/PhpLegacyCompatibility.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\JsonSerializable;
+
+/**
+ * Interface compatible with the built-in JsonSerializable interface
+ *
+ * JsonSerializable was introduced in PHP 5.4.0.
+ *
+ * @see http://php.net/manual/class.jsonserializable.php
+ */
+interface PhpLegacyCompatibility
+{
+    /**
+     * Returns data which can be serialized by json_encode().
+     *
+     * @return mixed
+     * @see    http://php.net/manual/jsonserializable.jsonserialize.php
+     */
+    public function jsonSerialize();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Message.php
@@ -0,0 +1,118 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use Traversable;
+
+class Message implements MessageInterface
+{
+    /**
+     * @var array
+     */
+    protected $metadata = array();
+
+    /**
+     * @var string
+     */
+    protected $content = '';
+
+    /**
+     * Set message metadata
+     *
+     * Non-destructive setting of message metadata; always adds to the metadata, never overwrites
+     * the entire metadata container.
+     *
+     * @param  string|int|array|Traversable $spec
+     * @param  mixed $value
+     * @throws Exception\InvalidArgumentException
+     * @return Message
+     */
+    public function setMetadata($spec, $value = null)
+    {
+        if (is_scalar($spec)) {
+            $this->metadata[$spec] = $value;
+            return $this;
+        }
+        if (!is_array($spec) && !$spec instanceof Traversable) {
+            throw new Exception\InvalidArgumentException(sprintf(
+                'Expected a string, array, or Traversable argument in first position; received "%s"',
+                (is_object($spec) ? get_class($spec) : gettype($spec))
+            ));
+        }
+        foreach ($spec as $key => $value) {
+            $this->metadata[$key] = $value;
+        }
+        return $this;
+    }
+
+    /**
+     * Retrieve all metadata or a single metadatum as specified by key
+     *
+     * @param  null|string|int $key
+     * @param  null|mixed $default
+     * @throws Exception\InvalidArgumentException
+     * @return mixed
+     */
+    public function getMetadata($key = null, $default = null)
+    {
+        if (null === $key) {
+            return $this->metadata;
+        }
+
+        if (!is_scalar($key)) {
+            throw new Exception\InvalidArgumentException('Non-scalar argument provided for key');
+        }
+
+        if (array_key_exists($key, $this->metadata)) {
+            return $this->metadata[$key];
+        }
+
+        return $default;
+    }
+
+    /**
+     * Set message content
+     *
+     * @param  mixed $value
+     * @return Message
+     */
+    public function setContent($value)
+    {
+        $this->content = $value;
+        return $this;
+    }
+
+    /**
+     * Get message content
+     *
+     * @return mixed
+     */
+    public function getContent()
+    {
+        return $this->content;
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        $request = '';
+        foreach ($this->getMetadata() as $key => $value) {
+            $request .= sprintf(
+                "%s: %s\r\n",
+                (string) $key,
+                (string) $value
+            );
+        }
+        $request .= "\r\n" . $this->getContent();
+        return $request;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/MessageInterface.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+interface MessageInterface
+{
+    /**
+     * Set metadata
+     *
+     * @param  string|int|array|\Traversable $spec
+     * @param  mixed $value
+     */
+    public function setMetadata($spec, $value = null);
+
+    /**
+     * Get metadata
+     *
+     * @param  null|string|int $key
+     * @return mixed
+     */
+    public function getMetadata($key = null);
+
+    /**
+     * Set content
+     *
+     * @param  mixed $content
+     * @return mixed
+     */
+    public function setContent($content);
+
+    /**
+     * Get content
+     *
+     * @return mixed
+     */
+    public function getContent();
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/ParameterObjectInterface.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+interface ParameterObjectInterface
+{
+    /**
+     * @param string $key
+     * @param mixed $value
+     * @return void
+     */
+    public function __set($key, $value);
+
+    /**
+     * @param string $key
+     * @return mixed
+     */
+    public function __get($key);
+
+    /**
+     * @param string $key
+     * @return bool
+     */
+    public function __isset($key);
+
+    /**
+     * @param string $key
+     * @return void
+     */
+    public function __unset($key);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Parameters.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use ArrayObject as PhpArrayObject;
+
+class Parameters extends PhpArrayObject implements ParametersInterface
+{
+    /**
+     * Constructor
+     *
+     * Enforces that we have an array, and enforces parameter access to array
+     * elements.
+     *
+     * @param  array $values
+     */
+    public function __construct(array $values = null)
+    {
+        if (null === $values) {
+            $values = array();
+        }
+        parent::__construct($values, ArrayObject::ARRAY_AS_PROPS);
+    }
+
+    /**
+     * Populate from native PHP array
+     *
+     * @param  array $values
+     * @return void
+     */
+    public function fromArray(array $values)
+    {
+        $this->exchangeArray($values);
+    }
+
+    /**
+     * Populate from query string
+     *
+     * @param  string $string
+     * @return void
+     */
+    public function fromString($string)
+    {
+        $array = array();
+        parse_str($string, $array);
+        $this->fromArray($array);
+    }
+
+    /**
+     * Serialize to native PHP array
+     *
+     * @return array
+     */
+    public function toArray()
+    {
+        return $this->getArrayCopy();
+    }
+
+    /**
+     * Serialize to query string
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return http_build_query($this);
+    }
+
+    /**
+     * Retrieve by key
+     *
+     * Returns null if the key does not exist.
+     *
+     * @param  string $name
+     * @return mixed
+     */
+    public function offsetGet($name)
+    {
+        if ($this->offsetExists($name)) {
+            return parent::offsetGet($name);
+        }
+        return;
+    }
+
+    /**
+     * @param string $name
+     * @param mixed $default optional default value
+     * @return mixed
+     */
+    public function get($name, $default = null)
+    {
+        if ($this->offsetExists($name)) {
+            return parent::offsetGet($name);
+        }
+        return $default;
+    }
+
+    /**
+     * @param string $name
+     * @param mixed $value
+     * @return Parameters
+     */
+    public function set($name, $value)
+    {
+        $this[$name] = $value;
+        return $this;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/ParametersInterface.php
@@ -0,0 +1,86 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use ArrayAccess;
+use Countable;
+use Serializable;
+use Traversable;
+
+/*
+ * Basically, an ArrayObject. You could simply define something like:
+ *     class QueryParams extends ArrayObject implements Parameters {}
+ * and have 90% of the functionality
+ */
+interface ParametersInterface extends ArrayAccess, Countable, Serializable, Traversable
+{
+    /**
+     * Constructor
+     *
+     * @param array $values
+     */
+    public function __construct(array $values = null);
+
+    /**
+     * From array
+     *
+     * Allow deserialization from standard array
+     *
+     * @param array $values
+     * @return mixed
+     */
+    public function fromArray(array $values);
+
+    /**
+     * From string
+     *
+     * Allow deserialization from raw body; e.g., for PUT requests
+     *
+     * @param $string
+     * @return mixed
+     */
+    public function fromString($string);
+
+    /**
+     * To array
+     *
+     * Allow serialization back to standard array
+     *
+     * @return mixed
+     */
+    public function toArray();
+
+    /**
+     * To string
+     *
+     * Allow serialization to query format; e.g., for PUT or POST requests
+     *
+     * @return mixed
+     */
+    public function toString();
+
+    /**
+     * Get
+     *
+     * @param string $name
+     * @param mixed|null $default
+     * @return mixed
+     */
+    public function get($name, $default = null);
+
+    /**
+     * Set
+     *
+     * @param string $name
+     * @param mixed $value
+     * @return ParametersInterface
+     */
+    public function set($name, $value);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/PriorityList.php
@@ -0,0 +1,271 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use Countable;
+use Iterator;
+
+class PriorityList implements Iterator, Countable
+{
+    const EXTR_DATA     = 0x00000001;
+    const EXTR_PRIORITY = 0x00000002;
+    const EXTR_BOTH     = 0x00000003;
+    /**
+     * Internal list of all items.
+     *
+     * @var array[]
+     */
+    protected $items = array();
+
+    /**
+     * Serial assigned to items to preserve LIFO.
+     *
+     * @var int
+     */
+    protected $serial = 0;
+
+    /**
+     * Serial order mode
+     * @var integer
+     */
+    protected $isLIFO = 1;
+
+    /**
+     * Internal counter to avoid usage of count().
+     *
+     * @var int
+     */
+    protected $count = 0;
+
+    /**
+     * Whether the list was already sorted.
+     *
+     * @var bool
+     */
+    protected $sorted = false;
+
+    /**
+     * Insert a new item.
+     *
+     * @param  string  $name
+     * @param  mixed   $value
+     * @param  int     $priority
+     *
+     * @return void
+     */
+    public function insert($name, $value, $priority = 0)
+    {
+        $this->sorted = false;
+        $this->count++;
+
+        $this->items[$name] = array(
+            'data'     => $value,
+            'priority' => (int) $priority,
+            'serial'   => $this->serial++,
+        );
+    }
+
+    /**
+     * @param string $name
+     * @param int    $priority
+     *
+     * @return $this
+     *
+     * @throws \Exception
+     */
+    public function setPriority($name, $priority)
+    {
+        if (!isset($this->items[$name])) {
+            throw new \Exception("item $name not found");
+        }
+
+        $this->items[$name]['priority'] = (int) $priority;
+        $this->sorted                   = false;
+
+        return $this;
+    }
+
+    /**
+     * Remove a item.
+     *
+     * @param  string $name
+     * @return void
+     */
+    public function remove($name)
+    {
+        if (isset($this->items[$name])) {
+            $this->count--;
+        }
+
+        unset($this->items[$name]);
+    }
+
+    /**
+     * Remove all items.
+     *
+     * @return void
+     */
+    public function clear()
+    {
+        $this->items  = array();
+        $this->serial = 0;
+        $this->count  = 0;
+        $this->sorted = false;
+    }
+
+    /**
+     * Get a item.
+     *
+     * @param  string $name
+     * @return mixed
+     */
+    public function get($name)
+    {
+        if (!isset($this->items[$name])) {
+            return;
+        }
+
+        return $this->items[$name]['data'];
+    }
+
+    /**
+     * Sort all items.
+     *
+     * @return void
+     */
+    protected function sort()
+    {
+        if (!$this->sorted) {
+            uasort($this->items, array($this, 'compare'));
+            $this->sorted = true;
+        }
+    }
+
+    /**
+     * Compare the priority of two items.
+     *
+     * @param  array $item1,
+     * @param  array $item2
+     * @return int
+     */
+    protected function compare(array $item1, array $item2)
+    {
+        return ($item1['priority'] === $item2['priority'])
+            ? ($item1['serial']   > $item2['serial']   ? -1 : 1) * $this->isLIFO
+            : ($item1['priority'] > $item2['priority'] ? -1 : 1);
+    }
+
+    /**
+     * Get/Set serial order mode
+     *
+     * @param bool|null $flag
+     *
+     * @return bool
+     */
+    public function isLIFO($flag = null)
+    {
+        if ($flag !== null) {
+            $isLifo = $flag === true ? 1 : -1;
+
+            if ($isLifo !== $this->isLIFO) {
+                $this->isLIFO = $isLifo;
+                $this->sorted = false;
+            }
+        }
+
+        return 1 === $this->isLIFO;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function rewind()
+    {
+        $this->sort();
+        reset($this->items);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function current()
+    {
+        $this->sorted || $this->sort();
+        $node = current($this->items);
+
+        return $node ? $node['data'] : false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function key()
+    {
+        $this->sorted || $this->sort();
+        return key($this->items);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function next()
+    {
+        $node = next($this->items);
+
+        return $node ? $node['data'] : false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function valid()
+    {
+        return current($this->items) !== false;
+    }
+
+    /**
+     * @return self
+     */
+    public function getIterator()
+    {
+        return clone $this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function count()
+    {
+        return $this->count;
+    }
+
+    /**
+     * Return list as array
+     *
+     * @param int $flag
+     *
+     * @return array
+     */
+    public function toArray($flag = self::EXTR_DATA)
+    {
+        $this->sort();
+
+        if ($flag == self::EXTR_BOTH) {
+            return $this->items;
+        }
+
+        return array_map(
+            function ($item) use ($flag) {
+                return ($flag == PriorityList::EXTR_PRIORITY) ? $item['priority'] : $item['data'];
+            },
+            $this->items
+        );
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/PriorityQueue.php
@@ -0,0 +1,301 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use Countable;
+use IteratorAggregate;
+use Serializable;
+
+/**
+ * Re-usable, serializable priority queue implementation
+ *
+ * SplPriorityQueue acts as a heap; on iteration, each item is removed from the
+ * queue. If you wish to re-use such a queue, you need to clone it first. This
+ * makes for some interesting issues if you wish to delete items from the queue,
+ * or, as already stated, iterate over it multiple times.
+ *
+ * This class aggregates items for the queue itself, but also composes an
+ * "inner" iterator in the form of an SplPriorityQueue object for performing
+ * the actual iteration.
+ */
+class PriorityQueue implements Countable, IteratorAggregate, Serializable
+{
+    const EXTR_DATA     = 0x00000001;
+    const EXTR_PRIORITY = 0x00000002;
+    const EXTR_BOTH     = 0x00000003;
+
+    /**
+     * Inner queue class to use for iteration
+     * @var string
+     */
+    protected $queueClass = 'Zend\Stdlib\SplPriorityQueue';
+
+    /**
+     * Actual items aggregated in the priority queue. Each item is an array
+     * with keys "data" and "priority".
+     * @var array
+     */
+    protected $items      = array();
+
+    /**
+     * Inner queue object
+     * @var SplPriorityQueue
+     */
+    protected $queue;
+
+    /**
+     * Insert an item into the queue
+     *
+     * Priority defaults to 1 (low priority) if none provided.
+     *
+     * @param  mixed $data
+     * @param  int $priority
+     * @return PriorityQueue
+     */
+    public function insert($data, $priority = 1)
+    {
+        $priority = (int) $priority;
+        $this->items[] = array(
+            'data'     => $data,
+            'priority' => $priority,
+        );
+        $this->getQueue()->insert($data, $priority);
+        return $this;
+    }
+
+    /**
+     * Remove an item from the queue
+     *
+     * This is different than {@link extract()}; its purpose is to dequeue an
+     * item.
+     *
+     * This operation is potentially expensive, as it requires
+     * re-initialization and re-population of the inner queue.
+     *
+     * Note: this removes the first item matching the provided item found. If
+     * the same item has been added multiple times, it will not remove other
+     * instances.
+     *
+     * @param  mixed $datum
+     * @return bool False if the item was not found, true otherwise.
+     */
+    public function remove($datum)
+    {
+        $found = false;
+        foreach ($this->items as $key => $item) {
+            if ($item['data'] === $datum) {
+                $found = true;
+                break;
+            }
+        }
+        if ($found) {
+            unset($this->items[$key]);
+            $this->queue = null;
+
+            if (!$this->isEmpty()) {
+                $queue = $this->getQueue();
+                foreach ($this->items as $item) {
+                    $queue->insert($item['data'], $item['priority']);
+                }
+            }
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Is the queue empty?
+     *
+     * @return bool
+     */
+    public function isEmpty()
+    {
+        return (0 === $this->count());
+    }
+
+    /**
+     * How many items are in the queue?
+     *
+     * @return int
+     */
+    public function count()
+    {
+        return count($this->items);
+    }
+
+    /**
+     * Peek at the top node in the queue, based on priority.
+     *
+     * @return mixed
+     */
+    public function top()
+    {
+        return $this->getIterator()->top();
+    }
+
+    /**
+     * Extract a node from the inner queue and sift up
+     *
+     * @return mixed
+     */
+    public function extract()
+    {
+        return $this->getQueue()->extract();
+    }
+
+    /**
+     * Retrieve the inner iterator
+     *
+     * SplPriorityQueue acts as a heap, which typically implies that as items
+     * are iterated, they are also removed. This does not work for situations
+     * where the queue may be iterated multiple times. As such, this class
+     * aggregates the values, and also injects an SplPriorityQueue. This method
+     * retrieves the inner queue object, and clones it for purposes of
+     * iteration.
+     *
+     * @return SplPriorityQueue
+     */
+    public function getIterator()
+    {
+        $queue = $this->getQueue();
+        return clone $queue;
+    }
+
+    /**
+     * Serialize the data structure
+     *
+     * @return string
+     */
+    public function serialize()
+    {
+        return serialize($this->items);
+    }
+
+    /**
+     * Unserialize a string into a PriorityQueue object
+     *
+     * Serialization format is compatible with {@link Zend\Stdlib\SplPriorityQueue}
+     *
+     * @param  string $data
+     * @return void
+     */
+    public function unserialize($data)
+    {
+        foreach (unserialize($data) as $item) {
+            $this->insert($item['data'], $item['priority']);
+        }
+    }
+
+    /**
+     * Serialize to an array
+     *
+     * By default, returns only the item data, and in the order registered (not
+     * sorted). You may provide one of the EXTR_* flags as an argument, allowing
+     * the ability to return priorities or both data and priority.
+     *
+     * @param  int $flag
+     * @return array
+     */
+    public function toArray($flag = self::EXTR_DATA)
+    {
+        switch ($flag) {
+            case self::EXTR_BOTH:
+                return $this->items;
+            case self::EXTR_PRIORITY:
+                return array_map(function ($item) {
+                    return $item['priority'];
+                }, $this->items);
+            case self::EXTR_DATA:
+            default:
+                return array_map(function ($item) {
+                    return $item['data'];
+                }, $this->items);
+        }
+    }
+
+    /**
+     * Specify the internal queue class
+     *
+     * Please see {@link getIterator()} for details on the necessity of an
+     * internal queue class. The class provided should extend SplPriorityQueue.
+     *
+     * @param  string $class
+     * @return PriorityQueue
+     */
+    public function setInternalQueueClass($class)
+    {
+        $this->queueClass = (string) $class;
+        return $this;
+    }
+
+    /**
+     * Does the queue contain the given datum?
+     *
+     * @param  mixed $datum
+     * @return bool
+     */
+    public function contains($datum)
+    {
+        foreach ($this->items as $item) {
+            if ($item['data'] === $datum) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Does the queue have an item with the given priority?
+     *
+     * @param  int $priority
+     * @return bool
+     */
+    public function hasPriority($priority)
+    {
+        foreach ($this->items as $item) {
+            if ($item['priority'] === $priority) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Get the inner priority queue instance
+     *
+     * @throws Exception\DomainException
+     * @return SplPriorityQueue
+     */
+    protected function getQueue()
+    {
+        if (null === $this->queue) {
+            $this->queue = new $this->queueClass();
+            if (!$this->queue instanceof \SplPriorityQueue) {
+                throw new Exception\DomainException(sprintf(
+                    'PriorityQueue expects an internal queue of type SplPriorityQueue; received "%s"',
+                    get_class($this->queue)
+                ));
+            }
+        }
+        return $this->queue;
+    }
+
+    /**
+     * Add support for deep cloning
+     *
+     * @return void
+     */
+    public function __clone()
+    {
+        if (null !== $this->queue) {
+            $this->queue = clone $this->queue;
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Request.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+class Request extends Message implements RequestInterface
+{
+    // generic request implementation
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/RequestInterface.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+interface RequestInterface extends MessageInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/Response.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+class Response extends Message implements ResponseInterface
+{
+    // generic response implementation
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/ResponseInterface.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+interface ResponseInterface extends MessageInterface
+{
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/SplPriorityQueue.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use Serializable;
+
+/**
+ * Serializable version of SplPriorityQueue
+ *
+ * Also, provides predictable heap order for datums added with the same priority
+ * (i.e., they will be emitted in the same order they are enqueued).
+ */
+class SplPriorityQueue extends \SplPriorityQueue implements Serializable
+{
+    /**
+     * @var int Seed used to ensure queue order for items of the same priority
+     */
+    protected $serial = PHP_INT_MAX;
+
+    /**
+     * Insert a value with a given priority
+     *
+     * Utilizes {@var $serial} to ensure that values of equal priority are
+     * emitted in the same order in which they are inserted.
+     *
+     * @param  mixed $datum
+     * @param  mixed $priority
+     * @return void
+     */
+    public function insert($datum, $priority)
+    {
+        if (!is_array($priority)) {
+            $priority = array($priority, $this->serial--);
+        }
+        parent::insert($datum, $priority);
+    }
+
+    /**
+     * Serialize to an array
+     *
+     * Array will be priority => data pairs
+     *
+     * @return array
+     */
+    public function toArray()
+    {
+        $array = array();
+        foreach (clone $this as $item) {
+            $array[] = $item;
+        }
+        return $array;
+    }
+
+    /**
+     * Serialize
+     *
+     * @return string
+     */
+    public function serialize()
+    {
+        $clone = clone $this;
+        $clone->setExtractFlags(self::EXTR_BOTH);
+
+        $data = array();
+        foreach ($clone as $item) {
+            $data[] = $item;
+        }
+
+        return serialize($data);
+    }
+
+    /**
+     * Deserialize
+     *
+     * @param  string $data
+     * @return void
+     */
+    public function unserialize($data)
+    {
+        foreach (unserialize($data) as $item) {
+            $this->insert($item['data'], $item['priority']);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/SplQueue.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use Serializable;
+
+/**
+ * Serializable version of SplQueue
+ */
+class SplQueue extends \SplQueue implements Serializable
+{
+    /**
+     * Return an array representing the queue
+     *
+     * @return array
+     */
+    public function toArray()
+    {
+        $array = array();
+        foreach ($this as $item) {
+            $array[] = $item;
+        }
+        return $array;
+    }
+
+    /**
+     * Serialize
+     *
+     * @return string
+     */
+    public function serialize()
+    {
+        return serialize($this->toArray());
+    }
+
+    /**
+     * Unserialize
+     *
+     * @param  string $data
+     * @return void
+     */
+    public function unserialize($data)
+    {
+        foreach (unserialize($data) as $item) {
+            $this->push($item);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/SplStack.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use Serializable;
+
+/**
+ * Serializable version of SplStack
+ */
+class SplStack extends \SplStack implements Serializable
+{
+    /**
+     * Serialize to an array representing the stack
+     *
+     * @return array
+     */
+    public function toArray()
+    {
+        $array = array();
+        foreach ($this as $item) {
+            $array[] = $item;
+        }
+        return $array;
+    }
+
+    /**
+     * Serialize
+     *
+     * @return string
+     */
+    public function serialize()
+    {
+        return serialize($this->toArray());
+    }
+
+    /**
+     * Unserialize
+     *
+     * @param  string $data
+     * @return void
+     */
+    public function unserialize($data)
+    {
+        foreach (unserialize($data) as $item) {
+            $this->unshift($item);
+        }
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/StringUtils.php
@@ -0,0 +1,187 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib;
+
+use Zend\Stdlib\StringWrapper\StringWrapperInterface;
+
+/**
+ * Utility class for handling strings of different character encodings
+ * using available PHP extensions.
+ *
+ * Declared abstract, as we have no need for instantiation.
+ */
+abstract class StringUtils
+{
+    /**
+     * Ordered list of registered string wrapper instances
+     *
+     * @var StringWrapperInterface[]
+     */
+    protected static $wrapperRegistry = null;
+
+    /**
+     * A list of known single-byte character encodings (upper-case)
+     *
+     * @var string[]
+     */
+    protected static $singleByteEncodings = array(
+        'ASCII', '7BIT', '8BIT',
+        'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', 'ISO-8859-5',
+        'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9', 'ISO-8859-10',
+        'ISO-8859-11', 'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'ISO-8859-16',
+        'CP-1251', 'CP-1252',
+        // TODO
+    );
+
+    /**
+     * Is PCRE compiled with Unicode support?
+     *
+     * @var bool
+     **/
+    protected static $hasPcreUnicodeSupport = null;
+
+    /**
+     * Get registered wrapper classes
+     *
+     * @return string[]
+     */
+    public static function getRegisteredWrappers()
+    {
+        if (static::$wrapperRegistry === null) {
+            static::$wrapperRegistry = array();
+
+            if (extension_loaded('intl')) {
+                static::$wrapperRegistry[] = 'Zend\Stdlib\StringWrapper\Intl';
+            }
+
+            if (extension_loaded('mbstring')) {
+                static::$wrapperRegistry[] = 'Zend\Stdlib\StringWrapper\MbString';
+            }
+
+            if (extension_loaded('iconv')) {
+                static::$wrapperRegistry[] = 'Zend\Stdlib\StringWrapper\Iconv';
+            }
+
+            static::$wrapperRegistry[] = 'Zend\Stdlib\StringWrapper\Native';
+        }
+
+        return static::$wrapperRegistry;
+    }
+
+    /**
+     * Register a string wrapper class
+     *
+     * @param string $wrapper
+     * @return void
+     */
+    public static function registerWrapper($wrapper)
+    {
+        $wrapper = (string) $wrapper;
+        if (!in_array($wrapper, static::$wrapperRegistry, true)) {
+            static::$wrapperRegistry[] = $wrapper;
+        }
+    }
+
+    /**
+     * Unregister a string wrapper class
+     *
+     * @param string $wrapper
+     * @return void
+     */
+    public static function unregisterWrapper($wrapper)
+    {
+        $index = array_search((string) $wrapper, static::$wrapperRegistry, true);
+        if ($index !== false) {
+            unset(static::$wrapperRegistry[$index]);
+        }
+    }
+
+    /**
+     * Reset all registered wrappers so the default wrappers will be used
+     *
+     * @return void
+     */
+    public static function resetRegisteredWrappers()
+    {
+        static::$wrapperRegistry = null;
+    }
+
+    /**
+     * Get the first string wrapper supporting the given character encoding
+     * and supports to convert into the given convert encoding.
+     *
+     * @param string      $encoding        Character encoding to support
+     * @param string|null $convertEncoding OPTIONAL character encoding to convert in
+     * @return StringWrapperInterface
+     * @throws Exception\RuntimeException If no wrapper supports given character encodings
+     */
+    public static function getWrapper($encoding = 'UTF-8', $convertEncoding = null)
+    {
+        foreach (static::getRegisteredWrappers() as $wrapperClass) {
+            if ($wrapperClass::isSupported($encoding, $convertEncoding)) {
+                $wrapper = new $wrapperClass($encoding, $convertEncoding);
+                $wrapper->setEncoding($encoding, $convertEncoding);
+                return $wrapper;
+            }
+        }
+
+        throw new Exception\RuntimeException(
+            'No wrapper found supporting "' . $encoding . '"'
+            . (($convertEncoding !== null) ? ' and "' . $convertEncoding . '"' : '')
+        );
+    }
+
+    /**
+     * Get a list of all known single-byte character encodings
+     *
+     * @return string[]
+     */
+    public static function getSingleByteEncodings()
+    {
+        return static::$singleByteEncodings;
+    }
+
+    /**
+     * Check if a given encoding is a known single-byte character encoding
+     *
+     * @param string $encoding
+     * @return bool
+     */
+    public static function isSingleByteEncoding($encoding)
+    {
+        return in_array(strtoupper($encoding), static::$singleByteEncodings);
+    }
+
+    /**
+     * Check if a given string is valid UTF-8 encoded
+     *
+     * @param string $str
+     * @return bool
+     */
+    public static function isValidUtf8($str)
+    {
+        return is_string($str) && ($str === '' || preg_match('/^./su', $str) == 1);
+    }
+
+    /**
+     * Is PCRE compiled with Unicode support?
+     *
+     * @return bool
+     */
+    public static function hasPcreUnicodeSupport()
+    {
+        if (static::$hasPcreUnicodeSupport === null) {
+            ErrorHandler::start();
+            static::$hasPcreUnicodeSupport = defined('PREG_BAD_UTF8_OFFSET_ERROR') && preg_match('/\pL/u', 'a') == 1;
+            ErrorHandler::stop();
+        }
+        return static::$hasPcreUnicodeSupport;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/StringWrapper/AbstractStringWrapper.php
@@ -0,0 +1,269 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\StringWrapper;
+
+use Zend\Stdlib\Exception;
+use Zend\Stdlib\StringUtils;
+
+abstract class AbstractStringWrapper implements StringWrapperInterface
+{
+    /**
+     * The character encoding working on
+     * @var string|null
+     */
+    protected $encoding = 'UTF-8';
+
+    /**
+     * An optionally character encoding to convert to
+     * @var string|null
+     */
+    protected $convertEncoding;
+
+    /**
+     * Check if the given character encoding is supported by this wrapper
+     * and the character encoding to convert to is also supported.
+     *
+     * @param  string      $encoding
+     * @param  string|null $convertEncoding
+     * @return bool
+     */
+    public static function isSupported($encoding, $convertEncoding = null)
+    {
+        $supportedEncodings = static::getSupportedEncodings();
+
+        if (!in_array(strtoupper($encoding), $supportedEncodings)) {
+            return false;
+        }
+
+        if ($convertEncoding !== null && !in_array(strtoupper($convertEncoding), $supportedEncodings)) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Set character encoding working with and convert to
+     *
+     * @param string      $encoding         The character encoding to work with
+     * @param string|null $convertEncoding  The character encoding to convert to
+     * @return StringWrapperInterface
+     */
+    public function setEncoding($encoding, $convertEncoding = null)
+    {
+        $supportedEncodings = static::getSupportedEncodings();
+
+        $encodingUpper = strtoupper($encoding);
+        if (!in_array($encodingUpper, $supportedEncodings)) {
+            throw new Exception\InvalidArgumentException(
+                'Wrapper doesn\'t support character encoding "' . $encoding . '"'
+            );
+        }
+
+        if ($convertEncoding !== null) {
+            $convertEncodingUpper = strtoupper($convertEncoding);
+            if (!in_array($convertEncodingUpper, $supportedEncodings)) {
+                throw new Exception\InvalidArgumentException(
+                    'Wrapper doesn\'t support character encoding "' . $convertEncoding . '"'
+                );
+            }
+
+            $this->convertEncoding = $convertEncodingUpper;
+        } else {
+            $this->convertEncoding = null;
+        }
+        $this->encoding = $encodingUpper;
+
+        return $this;
+    }
+
+    /**
+     * Get the defined character encoding to work with
+     *
+     * @return string
+     * @throws Exception\LogicException If no encoding was defined
+     */
+    public function getEncoding()
+    {
+        return $this->encoding;
+    }
+
+    /**
+     * Get the defined character encoding to convert to
+     *
+     * @return string|null
+    */
+    public function getConvertEncoding()
+    {
+        return $this->convertEncoding;
+    }
+
+    /**
+     * Convert a string from defined character encoding to the defined convert encoding
+     *
+     * @param string  $str
+     * @param bool $reverse
+     * @return string|false
+     */
+    public function convert($str, $reverse = false)
+    {
+        $encoding        = $this->getEncoding();
+        $convertEncoding = $this->getConvertEncoding();
+        if ($convertEncoding === null) {
+            throw new Exception\LogicException(
+                'No convert encoding defined'
+            );
+        }
+
+        if ($encoding === $convertEncoding) {
+            return $str;
+        }
+
+        $from = $reverse ? $convertEncoding : $encoding;
+        $to   = $reverse ? $encoding : $convertEncoding;
+        throw new Exception\RuntimeException(sprintf(
+            'Converting from "%s" to "%s" isn\'t supported by this string wrapper',
+            $from,
+            $to
+        ));
+    }
+
+    /**
+     * Wraps a string to a given number of characters
+     *
+     * @param  string  $string
+     * @param  int $width
+     * @param  string  $break
+     * @param  bool $cut
+     * @return string|false
+     */
+    public function wordWrap($string, $width = 75, $break = "\n", $cut = false)
+    {
+        $string = (string) $string;
+        if ($string === '') {
+            return '';
+        }
+
+        $break = (string) $break;
+        if ($break === '') {
+            throw new Exception\InvalidArgumentException('Break string cannot be empty');
+        }
+
+        $width = (int) $width;
+        if ($width === 0 && $cut) {
+            throw new Exception\InvalidArgumentException('Cannot force cut when width is zero');
+        }
+
+        if (StringUtils::isSingleByteEncoding($this->getEncoding())) {
+            return wordwrap($string, $width, $break, $cut);
+        }
+
+        $stringWidth = $this->strlen($string);
+        $breakWidth  = $this->strlen($break);
+
+        $result    = '';
+        $lastStart = $lastSpace = 0;
+
+        for ($current = 0; $current < $stringWidth; $current++) {
+            $char = $this->substr($string, $current, 1);
+
+            $possibleBreak = $char;
+            if ($breakWidth !== 1) {
+                $possibleBreak = $this->substr($string, $current, $breakWidth);
+            }
+
+            if ($possibleBreak === $break) {
+                $result    .= $this->substr($string, $lastStart, $current - $lastStart + $breakWidth);
+                $current   += $breakWidth - 1;
+                $lastStart  = $lastSpace = $current + 1;
+                continue;
+            }
+
+            if ($char === ' ') {
+                if ($current - $lastStart >= $width) {
+                    $result    .= $this->substr($string, $lastStart, $current - $lastStart) . $break;
+                    $lastStart  = $current + 1;
+                }
+
+                $lastSpace = $current;
+                continue;
+            }
+
+            if ($current - $lastStart >= $width && $cut && $lastStart >= $lastSpace) {
+                $result    .= $this->substr($string, $lastStart, $current - $lastStart) . $break;
+                $lastStart  = $lastSpace = $current;
+                continue;
+            }
+
+            if ($current - $lastStart >= $width && $lastStart < $lastSpace) {
+                $result    .= $this->substr($string, $lastStart, $lastSpace - $lastStart) . $break;
+                $lastStart  = $lastSpace = $lastSpace + 1;
+                continue;
+            }
+        }
+
+        if ($lastStart !== $current) {
+            $result .= $this->substr($string, $lastStart, $current - $lastStart);
+        }
+
+        return $result;
+    }
+
+    /**
+     * Pad a string to a certain length with another string
+     *
+     * @param  string  $input
+     * @param  int $padLength
+     * @param  string  $padString
+     * @param  int $padType
+     * @return string
+     */
+    public function strPad($input, $padLength, $padString = ' ', $padType = STR_PAD_RIGHT)
+    {
+        if (StringUtils::isSingleByteEncoding($this->getEncoding())) {
+            return str_pad($input, $padLength, $padString, $padType);
+        }
+
+        $lengthOfPadding = $padLength - $this->strlen($input);
+        if ($lengthOfPadding <= 0) {
+            return $input;
+        }
+
+        $padStringLength = $this->strlen($padString);
+        if ($padStringLength === 0) {
+            return $input;
+        }
+
+        $repeatCount = floor($lengthOfPadding / $padStringLength);
+
+        if ($padType === STR_PAD_BOTH) {
+            $repeatCountLeft = $repeatCountRight = ($repeatCount - $repeatCount % 2) / 2;
+
+            $lastStringLength       = $lengthOfPadding - 2 * $repeatCountLeft * $padStringLength;
+            $lastStringLeftLength   = $lastStringRightLength = floor($lastStringLength / 2);
+            $lastStringRightLength += $lastStringLength % 2;
+
+            $lastStringLeft  = $this->substr($padString, 0, $lastStringLeftLength);
+            $lastStringRight = $this->substr($padString, 0, $lastStringRightLength);
+
+            return str_repeat($padString, $repeatCountLeft) . $lastStringLeft
+                . $input
+                . str_repeat($padString, $repeatCountRight) . $lastStringRight;
+        }
+
+        $lastString = $this->substr($padString, 0, $lengthOfPadding % $padStringLength);
+
+        if ($padType === STR_PAD_LEFT) {
+            return str_repeat($padString, $repeatCount) . $lastString . $input;
+        }
+
+        return $input . str_repeat($padString, $repeatCount) . $lastString;
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/StringWrapper/Iconv.php
@@ -0,0 +1,289 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\StringWrapper;
+
+use Zend\Stdlib\Exception;
+
+class Iconv extends AbstractStringWrapper
+{
+    /**
+     * List of supported character sets (upper case)
+     *
+     * @var string[]
+     * @link http://www.gnu.org/software/libiconv/
+     */
+    protected static $encodings = array(
+        // European languages
+        'ASCII',
+        'ISO-8859-1',
+        'ISO-8859-2',
+        'ISO-8859-3',
+        'ISO-8859-4',
+        'ISO-8859-5',
+        'ISO-8859-7',
+        'ISO-8859-9',
+        'ISO-8859-10',
+        'ISO-8859-13',
+        'ISO-8859-14',
+        'ISO-8859-15',
+        'ISO-8859-16',
+        'KOI8-R',
+        'KOI8-U',
+        'KOI8-RU',
+        'CP1250',
+        'CP1251',
+        'CP1252',
+        'CP1253',
+        'CP1254',
+        'CP1257',
+        'CP850',
+        'CP866',
+        'CP1131',
+        'MACROMAN',
+        'MACCENTRALEUROPE',
+        'MACICELAND',
+        'MACCROATIAN',
+        'MACROMANIA',
+        'MACCYRILLIC',
+        'MACUKRAINE',
+        'MACGREEK',
+        'MACTURKISH',
+        'MACINTOSH',
+
+        // Semitic languages
+        'ISO-8859-6',
+        'ISO-8859-8',
+        'CP1255',
+        'CP1256',
+        'CP862',
+        'MACHEBREW',
+        'MACARABIC',
+
+        // Japanese
+        'EUC-JP',
+        'SHIFT_JIS',
+        'CP932',
+        'ISO-2022-JP',
+        'ISO-2022-JP-2',
+        'ISO-2022-JP-1',
+
+        // Chinese
+        'EUC-CN',
+        'HZ',
+        'GBK',
+        'CP936',
+        'GB18030',
+        'EUC-TW',
+        'BIG5',
+        'CP950',
+        'BIG5-HKSCS',
+        'BIG5-HKSCS:2004',
+        'BIG5-HKSCS:2001',
+        'BIG5-HKSCS:1999',
+        'ISO-2022-CN',
+        'ISO-2022-CN-EXT',
+
+        // Korean
+        'EUC-KR',
+        'CP949',
+        'ISO-2022-KR',
+        'JOHAB',
+
+        // Armenian
+        'ARMSCII-8',
+
+        // Georgian
+        'GEORGIAN-ACADEMY',
+        'GEORGIAN-PS',
+
+        // Tajik
+        'KOI8-T',
+
+        // Kazakh
+        'PT154',
+        'RK1048',
+
+        // Thai
+        'ISO-8859-11',
+        'TIS-620',
+        'CP874',
+        'MACTHAI',
+
+        // Laotian
+        'MULELAO-1',
+        'CP1133',
+
+        // Vietnamese
+        'VISCII',
+        'TCVN',
+        'CP1258',
+
+        // Platform specifics
+        'HP-ROMAN8',
+        'NEXTSTEP',
+
+        // Full Unicode
+        'UTF-8',
+        'UCS-2',
+        'UCS-2BE',
+        'UCS-2LE',
+        'UCS-4',
+        'UCS-4BE',
+        'UCS-4LE',
+        'UTF-16',
+        'UTF-16BE',
+        'UTF-16LE',
+        'UTF-32',
+        'UTF-32BE',
+        'UTF-32LE',
+        'UTF-7',
+        'C99',
+        'JAVA',
+
+        /* Commented out because that's internal encodings not existing in real world
+        // Full Unicode, in terms of uint16_t or uint32_t (with machine dependent endianness and alignment)
+        'UCS-2-INTERNAL',
+        'UCS-4-INTERNAL',
+
+        // Locale dependent, in terms of `char' or `wchar_t' (with machine dependent endianness and alignment,
+        // and with OS and locale dependent semantics)
+        'char',
+        'wchar_t',
+        '', // The empty encoding name is equivalent to "char": it denotes the locale dependent character encoding.
+        */
+
+        // When configured with the option --enable-extra-encodings,
+        // it also provides support for a few extra encodings:
+
+        // European languages
+        'CP437',
+        'CP737',
+        'CP775',
+        'CP852',
+        'CP853',
+        'CP855',
+        'CP857',
+        'CP858',
+        'CP860',
+        'CP861',
+        'CP863',
+        'CP865',
+        'CP869',
+        'CP1125',
+
+        // Semitic languages
+        'CP864',
+
+        // Japanese
+        'EUC-JISX0213',
+        'Shift_JISX0213',
+        'ISO-2022-JP-3',
+
+        // Chinese
+        'BIG5-2003', // (experimental)
+
+        // Turkmen
+        'TDS565',
+
+        // Platform specifics
+        'ATARIST',
+        'RISCOS-LATIN1',
+    );
+
+    /**
+     * Get a list of supported character encodings
+     *
+     * @return string[]
+     */
+    public static function getSupportedEncodings()
+    {
+        return static::$encodings;
+    }
+
+    /**
+     * Constructor
+     *
+     * @throws Exception\ExtensionNotLoadedException
+     */
+    public function __construct()
+    {
+        if (!extension_loaded('iconv')) {
+            throw new Exception\ExtensionNotLoadedException(
+                'PHP extension "iconv" is required for this wrapper'
+            );
+        }
+    }
+
+    /**
+     * Returns the length of the given string
+     *
+     * @param string $str
+     * @return int|false
+     */
+    public function strlen($str)
+    {
+        return iconv_strlen($str, $this->getEncoding());
+    }
+
+    /**
+     * Returns the portion of string specified by the start and length parameters
+     *
+     * @param string   $str
+     * @param int      $offset
+     * @param int|null $length
+     * @return string|false
+     */
+    public function substr($str, $offset = 0, $length = null)
+    {
+        return iconv_substr($str, $offset, $length, $this->getEncoding());
+    }
+
+    /**
+     * Find the position of the first occurrence of a substring in a string
+     *
+     * @param string $haystack
+     * @param string $needle
+     * @param int    $offset
+     * @return int|false
+     */
+    public function strpos($haystack, $needle, $offset = 0)
+    {
+        return iconv_strpos($haystack, $needle, $offset, $this->getEncoding());
+    }
+
+    /**
+     * Convert a string from defined encoding to the defined convert encoding
+     *
+     * @param string  $str
+     * @param bool $reverse
+     * @return string|false
+     */
+    public function convert($str, $reverse = false)
+    {
+        $encoding        = $this->getEncoding();
+        $convertEncoding = $this->getConvertEncoding();
+        if ($convertEncoding === null) {
+            throw new Exception\LogicException(
+                'No convert encoding defined'
+            );
+        }
+
+        if ($encoding === $convertEncoding) {
+            return $str;
+        }
+
+        $fromEncoding = $reverse ? $convertEncoding : $encoding;
+        $toEncoding   = $reverse ? $encoding : $convertEncoding;
+
+        // automatically add "//IGNORE" to not stop converting on invalid characters
+        // invalid characters triggers a notice anyway
+        return iconv($fromEncoding, $toEncoding . '//IGNORE', $str);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/StringWrapper/Intl.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\StringWrapper;
+
+use Zend\Stdlib\Exception;
+
+class Intl extends AbstractStringWrapper
+{
+    /**
+     * List of supported character sets (upper case)
+     *
+     * @var string[]
+     */
+    protected static $encodings = array('UTF-8');
+
+    /**
+     * Get a list of supported character encodings
+     *
+     * @return string[]
+     */
+    public static function getSupportedEncodings()
+    {
+        return static::$encodings;
+    }
+
+    /**
+     * Constructor
+     *
+     * @throws Exception\ExtensionNotLoadedException
+     */
+    public function __construct()
+    {
+        if (!extension_loaded('intl')) {
+            throw new Exception\ExtensionNotLoadedException(
+                'PHP extension "intl" is required for this wrapper'
+            );
+        }
+    }
+
+    /**
+     * Returns the length of the given string
+     *
+     * @param string $str
+     * @return int|false
+     */
+    public function strlen($str)
+    {
+        return grapheme_strlen($str);
+    }
+
+    /**
+     * Returns the portion of string specified by the start and length parameters
+     *
+     * @param string   $str
+     * @param int      $offset
+     * @param int|null $length
+     * @return string|false
+     */
+    public function substr($str, $offset = 0, $length = null)
+    {
+        // Due fix of PHP #62759 The third argument returns an empty string if is 0 or null.
+        if ($length !== null) {
+            return grapheme_substr($str, $offset, $length);
+        }
+
+        return grapheme_substr($str, $offset);
+    }
+
+    /**
+     * Find the position of the first occurrence of a substring in a string
+     *
+     * @param string $haystack
+     * @param string $needle
+     * @param int    $offset
+     * @return int|false
+     */
+    public function strpos($haystack, $needle, $offset = 0)
+    {
+        return grapheme_strpos($haystack, $needle, $offset);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/StringWrapper/MbString.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\StringWrapper;
+
+use Zend\Stdlib\Exception;
+
+class MbString extends AbstractStringWrapper
+{
+    /**
+     * List of supported character sets (upper case)
+     *
+     * @var null|string[]
+     * @link http://php.net/manual/mbstring.supported-encodings.php
+     */
+    protected static $encodings = null;
+
+    /**
+     * Get a list of supported character encodings
+     *
+     * @return string[]
+     */
+    public static function getSupportedEncodings()
+    {
+        if (static::$encodings === null) {
+            static::$encodings = array_map('strtoupper', mb_list_encodings());
+
+            // FIXME: Converting € (UTF-8) to ISO-8859-16 gives a wrong result
+            $indexIso885916 = array_search('ISO-8859-16', static::$encodings, true);
+            if ($indexIso885916 !== false) {
+                unset(static::$encodings[$indexIso885916]);
+            }
+        }
+
+        return static::$encodings;
+    }
+
+    /**
+     * Constructor
+     *
+     * @throws Exception\ExtensionNotLoadedException
+     */
+    public function __construct()
+    {
+        if (!extension_loaded('mbstring')) {
+            throw new Exception\ExtensionNotLoadedException(
+                'PHP extension "mbstring" is required for this wrapper'
+            );
+        }
+    }
+
+    /**
+     * Returns the length of the given string
+     *
+     * @param string $str
+     * @return int|false
+     */
+    public function strlen($str)
+    {
+        return mb_strlen($str, $this->getEncoding());
+    }
+
+    /**
+     * Returns the portion of string specified by the start and length parameters
+     *
+     * @param string   $str
+     * @param int      $offset
+     * @param int|null $length
+     * @return string|false
+     */
+    public function substr($str, $offset = 0, $length = null)
+    {
+        return mb_substr($str, $offset, $length, $this->getEncoding());
+    }
+
+    /**
+     * Find the position of the first occurrence of a substring in a string
+     *
+     * @param string $haystack
+     * @param string $needle
+     * @param int    $offset
+     * @return int|false
+     */
+    public function strpos($haystack, $needle, $offset = 0)
+    {
+        return mb_strpos($haystack, $needle, $offset, $this->getEncoding());
+    }
+
+    /**
+     * Convert a string from defined encoding to the defined convert encoding
+     *
+     * @param string  $str
+     * @param bool $reverse
+     * @return string|false
+     */
+    public function convert($str, $reverse = false)
+    {
+        $encoding        = $this->getEncoding();
+        $convertEncoding = $this->getConvertEncoding();
+
+        if ($convertEncoding === null) {
+            throw new Exception\LogicException(
+                'No convert encoding defined'
+            );
+        }
+
+        if ($encoding === $convertEncoding) {
+            return $str;
+        }
+
+        $fromEncoding = $reverse ? $convertEncoding : $encoding;
+        $toEncoding   = $reverse ? $encoding : $convertEncoding;
+        return mb_convert_encoding($str, $toEncoding, $fromEncoding);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/StringWrapper/Native.php
@@ -0,0 +1,134 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\StringWrapper;
+
+use Zend\Stdlib\Exception;
+use Zend\Stdlib\StringUtils;
+
+class Native extends AbstractStringWrapper
+{
+    /**
+     * The character encoding working on
+     * (overwritten to change defaut encoding)
+     *
+     * @var string
+     */
+    protected $encoding = 'ASCII';
+
+    /**
+     * Check if the given character encoding is supported by this wrapper
+     * and the character encoding to convert to is also supported.
+     *
+     * @param  string      $encoding
+     * @param  string|null $convertEncoding
+     * @return bool
+     */
+    public static function isSupported($encoding, $convertEncoding = null)
+    {
+        $encodingUpper      = strtoupper($encoding);
+        $supportedEncodings = static::getSupportedEncodings();
+
+        if (!in_array($encodingUpper, $supportedEncodings)) {
+            return false;
+        }
+
+        // This adapter doesn't support to convert between encodings
+        if ($convertEncoding !== null && $encodingUpper !== strtoupper($convertEncoding)) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Get a list of supported character encodings
+     *
+     * @return string[]
+     */
+    public static function getSupportedEncodings()
+    {
+        return StringUtils::getSingleByteEncodings();
+    }
+
+    /**
+     * Set character encoding working with and convert to
+     *
+     * @param string      $encoding         The character encoding to work with
+     * @param string|null $convertEncoding  The character encoding to convert to
+     * @return StringWrapperInterface
+     */
+    public function setEncoding($encoding, $convertEncoding = null)
+    {
+        $supportedEncodings = static::getSupportedEncodings();
+
+        $encodingUpper = strtoupper($encoding);
+        if (!in_array($encodingUpper, $supportedEncodings)) {
+            throw new Exception\InvalidArgumentException(
+                'Wrapper doesn\'t support character encoding "' . $encoding . '"'
+            );
+        }
+
+        if ($encodingUpper !== strtoupper($convertEncoding)) {
+            $this->convertEncoding = $encodingUpper;
+        }
+
+        if ($convertEncoding !== null) {
+            if ($encodingUpper !== strtoupper($convertEncoding)) {
+                throw new Exception\InvalidArgumentException(
+                    'Wrapper doesn\'t support to convert between character encodings'
+                );
+            }
+
+            $this->convertEncoding = $encodingUpper;
+        } else {
+            $this->convertEncoding = null;
+        }
+        $this->encoding = $encodingUpper;
+
+        return $this;
+    }
+
+    /**
+     * Returns the length of the given string
+     *
+     * @param string $str
+     * @return int|false
+     */
+    public function strlen($str)
+    {
+        return strlen($str);
+    }
+
+    /**
+     * Returns the portion of string specified by the start and length parameters
+     *
+     * @param string   $str
+     * @param int      $offset
+     * @param int|null $length
+     * @return string|false
+     */
+    public function substr($str, $offset = 0, $length = null)
+    {
+        return substr($str, $offset, $length);
+    }
+
+    /**
+     * Find the position of the first occurrence of a substring in a string
+     *
+     * @param string $haystack
+     * @param string $needle
+     * @param int    $offset
+     * @return int|false
+     */
+    public function strpos($haystack, $needle, $offset = 0)
+    {
+        return strpos($haystack, $needle, $offset);
+    }
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/StringWrapper/StringWrapperInterface.php
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Stdlib\StringWrapper;
+
+interface StringWrapperInterface
+{
+    /**
+     * Check if the given character encoding is supported by this wrapper
+     * and the character encoding to convert to is also supported.
+     *
+     * @param string      $encoding
+     * @param string|null $convertEncoding
+     */
+    public static function isSupported($encoding, $convertEncoding = null);
+
+    /**
+     * Get a list of supported character encodings
+     *
+     * @return string[]
+     */
+    public static function getSupportedEncodings();
+
+    /**
+     * Set character encoding working with and convert to
+     *
+     * @param string      $encoding         The character encoding to work with
+     * @param string|null $convertEncoding  The character encoding to convert to
+     * @return StringWrapperInterface
+     */
+    public function setEncoding($encoding, $convertEncoding = null);
+
+    /**
+     * Get the defined character encoding to work with (upper case)
+     *
+     * @return string
+     */
+    public function getEncoding();
+
+    /**
+     * Get the defined character encoding to convert to (upper case)
+     *
+     * @return string|null
+     */
+    public function getConvertEncoding();
+
+    /**
+     * Returns the length of the given string
+     *
+     * @param string $str
+     * @return int|false
+     */
+    public function strlen($str);
+
+    /**
+     * Returns the portion of string specified by the start and length parameters
+     *
+     * @param string   $str
+     * @param int      $offset
+     * @param int|null $length
+     * @return string|false
+     */
+    public function substr($str, $offset = 0, $length = null);
+
+    /**
+     * Find the position of the first occurrence of a substring in a string
+     *
+     * @param string $haystack
+     * @param string $needle
+     * @param int    $offset
+     * @return int|false
+     */
+    public function strpos($haystack, $needle, $offset = 0);
+
+    /**
+     * Convert a string from defined encoding to the defined convert encoding
+     *
+     * @param string  $str
+     * @param bool $reverse
+     * @return string|false
+     */
+    public function convert($str, $reverse = false);
+
+    /**
+     * Wraps a string to a given number of characters
+     *
+     * @param  string  $str
+     * @param  int $width
+     * @param  string  $break
+     * @param  bool $cut
+     * @return string
+     */
+    public function wordWrap($str, $width = 75, $break = "\n", $cut = false);
+
+    /**
+     * Pad a string to a certain length with another string
+     *
+     * @param  string  $input
+     * @param  int $padLength
+     * @param  string  $padString
+     * @param  int $padType
+     * @return string
+     */
+    public function strPad($input, $padLength, $padString = ' ', $padType = STR_PAD_RIGHT);
+}
--- /dev/null
+++ b/vendor/zendframework/zend-stdlib/src/compatibility/autoload.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @deprecated
+ */
+
+/**
+ * Legacy purposes only, to prevent code that references it from breaking.
+ */
+trigger_error('Polyfill autoload support (file library/Zend/Stdlib/compatibility/autoload.php) is no longer necessary; please remove your require statement referencing this file', E_USER_DEPRECATED);
--- a/viewforum.php
+++ b/viewforum.php
@@ -25,18 +25,19 @@ $user->session_begin();
 $auth->acl($user->data);
 
 // Start initial var setup
-$forum_id	= request_var('f', 0);
-$mark_read	= request_var('mark', '');
-$start		= request_var('start', 0);
+$forum_id	= $request->variable('f', 0);
+$mark_read	= $request->variable('mark', '');
+$start		= $request->variable('start', 0);
 
 $default_sort_days	= (!empty($user->data['user_topic_show_days'])) ? $user->data['user_topic_show_days'] : 0;
 $default_sort_key	= (!empty($user->data['user_topic_sortby_type'])) ? $user->data['user_topic_sortby_type'] : 't';
 $default_sort_dir	= (!empty($user->data['user_topic_sortby_dir'])) ? $user->data['user_topic_sortby_dir'] : 'd';
 
-$sort_days	= request_var('st', $default_sort_days);
-$sort_key	= request_var('sk', $default_sort_key);
-$sort_dir	= request_var('sd', $default_sort_dir);
+$sort_days	= $request->variable('st', $default_sort_days);
+$sort_key	= $request->variable('sk', $default_sort_key);
+$sort_dir	= $request->variable('sd', $default_sort_dir);
 
+/* @var $pagination \phpbb\pagination */
 $pagination = $phpbb_container->get('pagination');
 
 // Check if the user has actually sent a forum ID with his/her request
@@ -90,6 +91,7 @@ if (!$auth->acl_gets('f_list', 'f_read', $forum_id) || ($forum_data['forum_type'
 {
 	if ($user->data['user_id'] != ANONYMOUS)
 	{
+		send_status_line(403, 'Forbidden');
 		trigger_error('SORRY_AUTH_READ');
 	}
 
@@ -146,6 +148,7 @@ else
 	}
 }
 
+/* @var $phpbb_content_visibility \phpbb\content_visibility */
 $phpbb_content_visibility = $phpbb_container->get('content.visibility');
 
 // Dump out the page header and load viewforum template
@@ -184,10 +187,10 @@ if (!$auth->acl_get('f_read', $forum_id))
 // Handle marking posts
 if ($mark_read == 'topics')
 {
-	$token = request_var('hash', '');
+	$token = $request->variable('hash', '');
 	if (check_link_hash($token, 'global'))
 	{
-		markread('topics', array($forum_id), false, request_var('mark_time', 0));
+		markread('topics', array($forum_id), false, $request->variable('mark_time', 0));
 	}
 	$redirect_url = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id);
 	meta_refresh(3, $redirect_url);
@@ -218,6 +221,7 @@ if ($forum_data['forum_topics_per_page'])
 // Do the forum Prune thang - cron type job ...
 if (!$config['use_system_cron'])
 {
+	/* @var $cron \phpbb\cron\manager */
 	$cron = $phpbb_container->get('cron.manager');
 
 	$task = $cron->find_task('cron.task.core.prune_forum');
@@ -782,9 +786,11 @@ $topic_tracking_info = $tracking_topics = array();
 * @var	array	topic_list			Array with current viewforum page topic ids
 * @var	array	rowset				Array with topics data (in topic_id => topic_data format)
 * @var	int		total_topic_count	Forum's total topic count
+* @var	int		forum_id			Forum identifier
 * @since 3.1.0-b3
+* @changed 3.1.11-RC1 Added forum_id
 */
-$vars = array('topic_list', 'rowset', 'total_topic_count');
+$vars = array('topic_list', 'rowset', 'total_topic_count', 'forum_id');
 extract($phpbb_dispatcher->trigger_event('core.viewforum_modify_topics_data', compact($vars)));
 
 // Okay, lets dump out the page ...
--- a/viewonline.php
+++ b/viewonline.php
@@ -25,25 +25,29 @@ $auth->acl($user->data);
 $user->setup('memberlist');
 
 // Get and set some variables
-$mode		= request_var('mode', '');
-$session_id	= request_var('s', '');
-$start		= request_var('start', 0);
-$sort_key	= request_var('sk', 'b');
-$sort_dir	= request_var('sd', 'd');
-$show_guests	= ($config['load_online_guests']) ? request_var('sg', 0) : 0;
+$mode		= $request->variable('mode', '');
+$session_id	= $request->variable('s', '');
+$start		= $request->variable('start', 0);
+$sort_key	= $request->variable('sk', 'b');
+$sort_dir	= $request->variable('sd', 'd');
+$show_guests	= ($config['load_online_guests']) ? $request->variable('sg', 0) : 0;
 
 // Can this user view profiles/memberlist?
 if (!$auth->acl_gets('u_viewprofile', 'a_user', 'a_useradd', 'a_userdel'))
 {
 	if ($user->data['user_id'] != ANONYMOUS)
 	{
+		send_status_line(403, 'Forbidden');
 		trigger_error('NO_VIEW_USERS');
 	}
 
 	login_box('', $user->lang['LOGIN_EXPLAIN_VIEWONLINE']);
 }
 
+/* @var $pagination \phpbb\pagination */
 $pagination = $phpbb_container->get('pagination');
+
+/* @var $viewonline_helper \phpbb\viewonline_helper */
 $viewonline_helper = $phpbb_container->get('viewonline_helper');
 
 $sort_key_text = array('a' => $user->lang['SORT_USERNAME'], 'b' => $user->lang['SORT_JOINED'], 'c' => $user->lang['SORT_LOCATION']);
@@ -123,7 +127,6 @@ if (!$show_guests)
 {
 	switch ($db->get_sql_layer())
 	{
-		case 'sqlite':
 		case 'sqlite3':
 			$sql = 'SELECT COUNT(session_ip) as num_guests
 				FROM (
@@ -178,6 +181,12 @@ $result = $db->sql_query($db->sql_build_query('SELECT', $sql_ary));
 $prev_id = $prev_ip = $user_list = array();
 $logged_visible_online = $logged_hidden_online = $counter = 0;
 
+/** @var \phpbb\controller\helper $controller_helper */
+$controller_helper = $phpbb_container->get('controller.helper');
+
+/** @var \phpbb\group\helper $group_helper */
+$group_helper = $phpbb_container->get('group_helper');
+
 while ($row = $db->sql_fetchrow($result))
 {
 	if ($row['user_id'] != ANONYMOUS && !isset($prev_id[$row['user_id']]))
@@ -302,11 +311,6 @@ while ($row = $db->sql_fetchrow($result))
 			$location_url = append_sid("{$phpbb_root_path}search.$phpEx");
 		break;
 
-		case 'faq':
-			$location = $user->lang['VIEWING_FAQ'];
-			$location_url = append_sid("{$phpbb_root_path}faq.$phpEx");
-		break;
-
 		case 'viewonline':
 			$location = $user->lang['VIEWING_ONLINE'];
 			$location_url = append_sid("{$phpbb_root_path}viewonline.$phpEx");
@@ -372,6 +376,13 @@ while ($row = $db->sql_fetchrow($result))
 		default:
 			$location = $user->lang['INDEX'];
 			$location_url = append_sid("{$phpbb_root_path}index.$phpEx");
+
+			if ($row['session_page'] === 'app.' . $phpEx . '/help/faq' ||
+				$row['session_page'] === 'app.' . $phpEx . '/help/bbcode')
+			{
+				$location = $user->lang['VIEWING_FAQ'];
+				$location_url = $controller_helper->route('phpbb_help_faq_controller');
+			}
 		break;
 	}
 
@@ -461,7 +472,7 @@ while ($row = $db->sql_fetchrow($result))
 	}
 	else
 	{
-		$legend .= (($legend != '') ? ', ' : '') . '<a style="color:#' . $row['group_colour'] . '" href="' . append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&amp;g=' . $row['group_id']) . '">' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</a>';
+		$legend .= (($legend != '') ? ', ' : '') . '<a style="color:#' . $row['group_colour'] . '" href="' . append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&amp;g=' . $row['group_id']) . '">' . $group_helper->get_name($row['group_name']) . '</a>';
 	}
 }
 $db->sql_freeresult($result);
--- a/viewtopic.php
+++ b/viewtopic.php
@@ -27,34 +27,35 @@ $user->session_begin();
 $auth->acl($user->data);
 
 // Initial var setup
-$forum_id	= request_var('f', 0);
-$topic_id	= request_var('t', 0);
-$post_id	= request_var('p', 0);
-$voted_id	= request_var('vote_id', array('' => 0));
+$forum_id	= $request->variable('f', 0);
+$topic_id	= $request->variable('t', 0);
+$post_id	= $request->variable('p', 0);
+$voted_id	= $request->variable('vote_id', array('' => 0));
 
 $voted_id = (sizeof($voted_id) > 1) ? array_unique($voted_id) : $voted_id;
 
 
-$start		= request_var('start', 0);
-$view		= request_var('view', '');
+$start		= $request->variable('start', 0);
+$view		= $request->variable('view', '');
 
 $default_sort_days	= (!empty($user->data['user_post_show_days'])) ? $user->data['user_post_show_days'] : 0;
 $default_sort_key	= (!empty($user->data['user_post_sortby_type'])) ? $user->data['user_post_sortby_type'] : 't';
 $default_sort_dir	= (!empty($user->data['user_post_sortby_dir'])) ? $user->data['user_post_sortby_dir'] : 'a';
 
-$sort_days	= request_var('st', $default_sort_days);
-$sort_key	= request_var('sk', $default_sort_key);
-$sort_dir	= request_var('sd', $default_sort_dir);
+$sort_days	= $request->variable('st', $default_sort_days);
+$sort_key	= $request->variable('sk', $default_sort_key);
+$sort_dir	= $request->variable('sd', $default_sort_dir);
 
-$update		= request_var('update', false);
+$update		= $request->variable('update', false);
 
+/* @var $pagination \phpbb\pagination */
 $pagination = $phpbb_container->get('pagination');
 
 $s_can_vote = false;
 /**
 * @todo normalize?
 */
-$hilit_words	= request_var('hilit', '', true);
+$hilit_words	= $request->variable('hilit', '', true);
 
 // Do we have a topic or post id?
 if (!$topic_id && !$post_id)
@@ -62,6 +63,7 @@ if (!$topic_id && !$post_id)
 	trigger_error('NO_TOPIC');
 }
 
+/* @var $phpbb_content_visibility \phpbb\content_visibility */
 $phpbb_content_visibility = $phpbb_container->get('content.visibility');
 
 // Find topic id if user requested a newer or older topic
@@ -374,6 +376,7 @@ if (!$overrides_f_read_check && !$auth->acl_get('f_read', $forum_id))
 {
 	if ($user->data['user_id'] != ANONYMOUS)
 	{
+		send_status_line(403, 'Forbidden');
 		trigger_error('SORRY_AUTH_READ');
 	}
 
@@ -495,10 +498,32 @@ if ($config['allow_topic_notify'])
 	}
 }
 
+/**
+* Event to modify highlight.
+*
+* @event core.viewtopic_highlight_modify
+* @var	string	highlight			String to be highlighted
+* @var	string	highlight_match		Highlight string to be used in preg_replace
+* @var	array	topic_data			Topic data
+* @var	int		start				Pagination start
+* @var	int		total_posts			Number of posts
+* @var	string	viewtopic_url		Current viewtopic URL
+* @since 3.1.11-RC1
+*/
+$vars = array(
+	'highlight',
+	'highlight_match',
+	'topic_data',
+	'start',
+	'total_posts',
+	'viewtopic_url',
+);
+extract($phpbb_dispatcher->trigger_event('core.viewtopic_highlight_modify', compact($vars)));
+
 // Bookmarks
-if ($config['allow_bookmarks'] && $user->data['is_registered'] && request_var('bookmark', 0))
+if ($config['allow_bookmarks'] && $user->data['is_registered'] && $request->variable('bookmark', 0))
 {
-	if (check_link_hash(request_var('hash', ''), "topic_$topic_id"))
+	if (check_link_hash($request->variable('hash', ''), "topic_$topic_id"))
 	{
 		if (!$topic_data['bookmarked'])
 		{
@@ -581,10 +606,10 @@ $quickmod_array = array(
 	'merge'					=> array('MERGE_POSTS', $auth->acl_get('m_merge', $forum_id)),
 	'merge_topic'		=> array('MERGE_TOPIC', $auth->acl_get('m_merge', $forum_id)),
 	'fork'					=> array('FORK_TOPIC', $auth->acl_get('m_move', $forum_id)),
-	'make_normal'		=> array('MAKE_NORMAL', ($allow_change_type && $auth->acl_gets('f_sticky', 'f_announce', $forum_id) && $topic_data['topic_type'] != POST_NORMAL)),
+	'make_normal'		=> array('MAKE_NORMAL', ($allow_change_type && $auth->acl_gets('f_sticky', 'f_announce', 'f_announce_global', $forum_id) && $topic_data['topic_type'] != POST_NORMAL)),
 	'make_sticky'		=> array('MAKE_STICKY', ($allow_change_type && $auth->acl_get('f_sticky', $forum_id) && $topic_data['topic_type'] != POST_STICKY)),
 	'make_announce'	=> array('MAKE_ANNOUNCE', ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_ANNOUNCE)),
-	'make_global'		=> array('MAKE_GLOBAL', ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_GLOBAL)),
+	'make_global'		=> array('MAKE_GLOBAL', ($allow_change_type && $auth->acl_get('f_announce_global', $forum_id) && $topic_data['topic_type'] != POST_GLOBAL)),
 	'topic_logs'			=> array('VIEW_TOPIC_LOGS', $auth->acl_get('m_', $forum_id)),
 );
 
@@ -1294,7 +1319,6 @@ while ($row = $db->sql_fetchrow($result))
 				'rank_title'		=> '',
 				'rank_image'		=> '',
 				'rank_image_src'	=> '',
-				'sig'				=> '',
 				'pm'				=> '',
 				'email'				=> '',
 				'jabber'			=> '',
@@ -1431,6 +1455,7 @@ $db->sql_freeresult($result);
 // Load custom profile fields
 if ($config['load_cpf_viewtopic'])
 {
+	/* @var $cp \phpbb\profilefields\manager */
 	$cp = $phpbb_container->get('profilefields.manager');
 
 	// Grab all profile fields from users in id cache for later use - similar to the poster cache
@@ -1621,6 +1646,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
 	{
 		$parse_flags = ($user_cache[$poster_id]['sig_bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES;
 		$user_cache[$poster_id]['sig'] = generate_text_for_display($user_cache[$poster_id]['sig'], $user_cache[$poster_id]['sig_bbcode_uid'], $user_cache[$poster_id]['sig_bbcode_bitfield'],  $parse_flags, true);
+		$user_cache[$poster_id]['sig_parsed'] = true;
 	}
 
 	// Parse the message and subject
@@ -1918,6 +1944,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
 		'POST_ICON_IMG'			=> ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['img'] : '',
 		'POST_ICON_IMG_WIDTH'	=> ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['width'] : '',
 		'POST_ICON_IMG_HEIGHT'	=> ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['height'] : '',
+		'POST_ICON_IMG_ALT' 	=> ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['alt'] : '',
 		'ONLINE_IMG'			=> ($poster_id == ANONYMOUS || !$config['load_onlinetrack']) ? '' : (($user_cache[$poster_id]['online']) ? $user->img('icon_user_online', 'ONLINE') : $user->img('icon_user_offline', 'OFFLINE')),
 		'S_ONLINE'				=> ($poster_id == ANONYMOUS || !$config['load_onlinetrack']) ? false : (($user_cache[$poster_id]['online']) ? true : false),
 
@@ -1932,7 +1959,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
 		'U_JABBER'		=> $user_cache[$poster_id]['jabber'],
 
 		'U_APPROVE_ACTION'		=> append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&amp;p={$row['post_id']}&amp;f=$forum_id&amp;redirect=" . urlencode(str_replace('&amp;', '&', $viewtopic_url . '&amp;p=' . $row['post_id'] . '#p' . $row['post_id']))),
-		'U_REPORT'			=> ($auth->acl_get('f_report', $forum_id)) ? append_sid("{$phpbb_root_path}report.$phpEx", 'f=' . $forum_id . '&amp;p=' . $row['post_id']) : '',
+		'U_REPORT'			=> ($auth->acl_get('f_report', $forum_id)) ? $phpbb_container->get('controller.helper')->route('phpbb_report_post_controller', array('id' => $row['post_id'])) : '',
 		'U_MCP_REPORT'		=> ($auth->acl_get('m_report', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=report_details&amp;f=' . $forum_id . '&amp;p=' . $row['post_id'], true, $user->session_id) : '',
 		'U_MCP_APPROVE'		=> ($auth->acl_get('m_approve', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=approve_details&amp;f=' . $forum_id . '&amp;p=' . $row['post_id'], true, $user->session_id) : '',
 		'U_MCP_RESTORE'		=> ($auth->acl_get('m_approve', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=' . (($topic_data['topic_visibility'] != ITEM_DELETED) ? 'deleted_posts' : 'deleted_topics') . '&amp;f=' . $forum_id . '&amp;p=' . $row['post_id'], true, $user->session_id) : '',
@@ -1945,6 +1972,8 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
 		'POST_ID'			=> $row['post_id'],
 		'POST_NUMBER'		=> $i + $start + 1,
 		'POSTER_ID'			=> $poster_id,
+		'MINI_POST'			=> ($post_unread) ? $user->lang['UNREAD_POST'] : $user->lang['POST'],
+
 
 		'S_HAS_ATTACHMENTS'	=> (!empty($attachments[$row['post_id']])) ? true : false,
 		'S_MULTIPLE_ATTACHMENTS'	=> !empty($attachments[$row['post_id']]) && sizeof($attachments[$row['post_id']]) > 1,
@@ -2226,13 +2255,13 @@ if ($s_can_vote || $s_quick_reply)
 // We overwrite $_REQUEST['f'] if there is no forum specified
 // to be able to display the correct online list.
 // One downside is that the user currently viewing this topic/post is not taken into account.
-if (!request_var('f', 0))
+if (!$request->variable('f', 0))
 {
 	$request->overwrite('f', $forum_id);
 }
 
 // We need to do the same with the topic_id. See #53025.
-if (!request_var('t', 0) && !empty($topic_id))
+if (!$request->variable('t', 0) && !empty($topic_id))
 {
 	$request->overwrite('t', $topic_id);
 }
